@workflow/core 5.0.0-beta.40 → 5.0.0-beta.41

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.
Files changed (70) hide show
  1. package/dist/events-consumer.d.ts +127 -6
  2. package/dist/events-consumer.d.ts.map +1 -1
  3. package/dist/events-consumer.js +364 -50
  4. package/dist/private.d.ts +87 -18
  5. package/dist/private.d.ts.map +1 -1
  6. package/dist/private.js +116 -44
  7. package/dist/runtime/constants.d.ts +15 -1
  8. package/dist/runtime/constants.d.ts.map +1 -1
  9. package/dist/runtime/constants.js +22 -3
  10. package/dist/runtime/helpers.d.ts +116 -8
  11. package/dist/runtime/helpers.d.ts.map +1 -1
  12. package/dist/runtime/helpers.js +174 -2
  13. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -1
  14. package/dist/runtime/quickjs-assets.generated.js +2 -2
  15. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  16. package/dist/runtime/quickjs-entrypoint.js +13 -5
  17. package/dist/runtime/quickjs-runtime.d.ts +36 -1
  18. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  19. package/dist/runtime/quickjs-runtime.js +613 -185
  20. package/dist/runtime/quickjs-serde.d.ts +107 -0
  21. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  22. package/dist/runtime/quickjs-serde.js +2098 -0
  23. package/dist/runtime/replay-budget.d.ts +5 -14
  24. package/dist/runtime/replay-budget.d.ts.map +1 -1
  25. package/dist/runtime/replay-budget.js +19 -72
  26. package/dist/runtime/resume-hook.d.ts.map +1 -1
  27. package/dist/runtime/resume-hook.js +5 -1
  28. package/dist/runtime/runs.d.ts.map +1 -1
  29. package/dist/runtime/runs.js +3 -4
  30. package/dist/runtime/start.js +2 -7
  31. package/dist/runtime/step-executor.d.ts.map +1 -1
  32. package/dist/runtime/step-executor.js +1 -4
  33. package/dist/runtime/suspension-handler.d.ts +7 -0
  34. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  35. package/dist/runtime/suspension-handler.js +58 -11
  36. package/dist/runtime/world-compatibility.d.ts +15 -0
  37. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  38. package/dist/runtime/world-compatibility.js +25 -5
  39. package/dist/runtime.d.ts.map +1 -1
  40. package/dist/runtime.js +474 -418
  41. package/dist/serialization/codec-devalue-vm.d.ts +7 -0
  42. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -1
  43. package/dist/serialization/codec-devalue-vm.js +12 -1
  44. package/dist/serialization/workflow-vm.d.ts +8 -3
  45. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  46. package/dist/serialization/workflow-vm.js +9 -4
  47. package/dist/step.js +2 -2
  48. package/dist/telemetry/semantic-conventions.d.ts +23 -0
  49. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  50. package/dist/telemetry/semantic-conventions.js +18 -1
  51. package/dist/version.d.ts +1 -1
  52. package/dist/version.js +2 -2
  53. package/dist/vm/index.d.ts.map +1 -1
  54. package/dist/vm/index.js +9 -6
  55. package/dist/workflow/abort-controller.d.ts.map +1 -1
  56. package/dist/workflow/abort-controller.js +4 -6
  57. package/dist/workflow/attribute-dispatcher.js +2 -2
  58. package/dist/workflow/hook.js +2 -2
  59. package/dist/workflow/sleep.js +2 -2
  60. package/dist/workflow.d.ts +10 -0
  61. package/dist/workflow.d.ts.map +1 -1
  62. package/dist/workflow.js +60 -19
  63. package/docs/how-it-works/event-sourcing.mdx +11 -3
  64. package/package.json +6 -6
  65. package/dist/correlation-id.d.ts +0 -109
  66. package/dist/correlation-id.d.ts.map +0 -1
  67. package/dist/correlation-id.js +0 -139
  68. package/dist/serialization/vm-bundle-entry.d.ts +0 -12
  69. package/dist/serialization/vm-bundle-entry.d.ts.map +0 -1
  70. package/dist/serialization/vm-bundle-entry.js +0 -58
package/dist/runtime.js CHANGED
@@ -1,8 +1,9 @@
1
+ import assert from 'node:assert/strict';
1
2
  import { types } from 'node:util';
2
3
  import { CorruptedEventLogError, EntityConflictError, FatalError, HookNotFoundError, MaxEventsExceededError, PreconditionFailedError, ReplayDivergenceError, RUN_ERROR_CODES, RunExpiredError, WorkflowRuntimeError, } from '@workflow/errors';
3
4
  import { once, setWorkflowBasePath } from '@workflow/utils';
4
5
  import { parseWorkflowName, workflowDisplayName, } from '@workflow/utils/parse-name';
5
- import { getQueueTopicPrefix, isLegacySpecVersion, ROOT_RUN_ID_ATTRIBUTE, resolveQueueNamespace, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_COMPRESSION, WorkflowInvokePayloadSchema, } from '@workflow/world';
6
+ import { getQueueTopicPrefix, isLegacySpecVersion, isTerminalRunEventType, ROOT_RUN_ID_ATTRIBUTE, resolveQueueNamespace, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_COMPRESSION, WorkflowInvokePayloadSchema, } from '@workflow/world';
6
7
  import ms from 'ms';
7
8
  import { decodeTime } from 'ulid';
8
9
  import { classifyRunError, isRetryableWorldError, isWorldContractError, } from './classify-error.js';
@@ -15,7 +16,7 @@ import { COMPUTE_INSTANCE_ID } from './runtime/compute-instance.js';
15
16
  import { getMaxEventsOverride, getMaxQueueDeliveries, getPreconditionMaxInProcessRestarts, getPreconditionMaxReinvocations, getPreconditionReinvokeDelaySeconds, getReplayDivergenceMaxRetries, isInlineOwnershipEnabled, isTurboEnabled, isVmRetentionEnabled, } from './runtime/constants.js';
16
17
  import { countStepStartedEvents } from './runtime/count-step-started-events.js';
17
18
  import { guardDeploymentAffinity, } from './runtime/deployment-guard.js';
18
- import { appendUniqueEvents, getQueueOverhead, getWorkflowQueueName, handleHealthCheckMessage, insertEventByEventId, isPreconditionGuardEnabled, loadWorkflowRunEvents, memoizeEncryptionKey, parseHealthCheckPayload, preconditionEventDelta, preconditionSnapshotParams, queueMessage, withHealthCheck, } from './runtime/helpers.js';
19
+ import { appendUniqueEvents, getQueueOverhead, getWorkflowQueueName, handleHealthCheckMessage, insertEventByEventId, isPreconditionGuardEnabled, isSlotGapCheckEnabled, loadWorkflowRunEvents, memoizeEncryptionKey, mergeReportedEvents, parseHealthCheckPayload, preconditionEventDelta, preconditionSnapshotParams, queueMessage, settleEventSlotGap, withHealthCheck, } from './runtime/helpers.js';
19
20
  import { handleReplayBudgetExhausted, ReplayBudget, } from './runtime/replay-budget.js';
20
21
  import { ReplayRecoveryReporter } from './runtime/replay-recovery-reporter.js';
21
22
  import { runIdCreatedAt } from './runtime/run-id-time.js';
@@ -254,30 +255,39 @@ function rootRunIdFrom(attributes, runId) {
254
255
  * delta.
255
256
  */
256
257
  function openHookAndWaitState(events) {
257
- const disposedHookIds = new Set();
258
- const completedWaitIds = new Set();
259
- for (const e of events) {
260
- if (e.eventType === 'hook_disposed')
261
- disposedHookIds.add(e.correlationId);
262
- else if (e.eventType === 'wait_completed') {
263
- completedWaitIds.add(e.correlationId);
258
+ const hooks = new Set();
259
+ const waits = new Set();
260
+ for (const event of events) {
261
+ switch (event.eventType) {
262
+ case 'hook_created':
263
+ hooks.add(event.correlationId);
264
+ break;
265
+ case 'hook_disposed':
266
+ hooks.delete(event.correlationId);
267
+ break;
268
+ case 'wait_created':
269
+ waits.add(event.correlationId);
270
+ break;
271
+ case 'wait_completed':
272
+ waits.delete(event.correlationId);
273
+ break;
264
274
  }
265
275
  }
266
- let openHook = false;
267
- let openWait = false;
268
- for (const e of events) {
269
- if (e.eventType === 'hook_created' &&
270
- !disposedHookIds.has(e.correlationId)) {
271
- openHook = true;
272
- }
273
- else if (e.eventType === 'wait_created' &&
274
- !completedWaitIds.has(e.correlationId)) {
275
- openWait = true;
276
- }
277
- if (openHook && openWait)
278
- break;
276
+ return { openHook: hooks.size > 0, openWait: waits.size > 0 };
277
+ }
278
+ function nextEventLogLoad(log) {
279
+ if (log.cursor === null) {
280
+ return { type: 'loadAll' };
279
281
  }
280
- return { openHook, openWait };
282
+ return {
283
+ type: 'loadAfter',
284
+ events: log.events,
285
+ cursor: log.cursor,
286
+ };
287
+ }
288
+ function appendEventLog(log, appended) {
289
+ appendUniqueEvents(log.events, appended.events);
290
+ log.cursor = appended.cursor ?? log.cursor;
281
291
  }
282
292
  /**
283
293
  * The whole retention predicate: keep the session only for a pure step
@@ -503,23 +513,83 @@ export function workflowEntrypoint(workflowCode, options) {
503
513
  const replayRecoveryReporter = replayDivergence
504
514
  ? new ReplayRecoveryReporter(replayDivergence.count)
505
515
  : ReplayRecoveryReporter.inert();
506
- const createEvent = (data, params) => replayRecoveryReporter.withEventCreate(params, (p) => world.events.create(runId, data, p));
507
- // Event cache: keep loaded events in memory across loop iterations.
508
- // On the first iteration we do a full load; on subsequent iterations
509
- // we fetch only events created after the last known cursor.
510
- let cachedEvents = null;
511
- let eventsCursor = null;
512
- // Inline-delta optimization: when an inline step's terminal
513
- // write returns the event-log delta since the pre-write
514
- // cursor (a supporting World only), we stash it here so the
515
- // next loop iteration consumes it in place of the incremental
516
- // events.list round-trip. Each value is consumed exactly once
517
- // and then cleared. Null means "no delta pending — fetch
518
- // normally". See the consume site at the top of the loop and
519
- // the produce sites: after inline executeStep, and in
520
- // restartReplayInProcess when a stale-snapshot rejection
521
- // carried the missing events with it.
522
- let pendingInlineDelta = null;
516
+ // Every write this loop makes carries the cursor of the log
517
+ // it was computed against, and folds a complete returned
518
+ // delta into that log.
519
+ const createEvent = async (data, params) => {
520
+ const sinceCursor = deltaRequestCursor(data, params);
521
+ const result = await replayRecoveryReporter.withEventCreate(sinceCursor === undefined
522
+ ? params
523
+ : { ...params, sinceCursor }, (p) => world.events.create(runId, data, p));
524
+ if (sinceCursor !== undefined) {
525
+ absorbCreateDelta(sinceCursor, result);
526
+ }
527
+ return result;
528
+ };
529
+ /**
530
+ * The cursor to ask for an inline delta against, or
531
+ * undefined to not ask.
532
+ *
533
+ * Turbo is excluded on purpose: it exists to make the first
534
+ * invocation's writes as cheap as possible, and it has no
535
+ * loaded log to extend. Run-terminal writes are excluded
536
+ * because nothing reads the log afterwards, so the delta
537
+ * would be work the World does for no one. A caller that
538
+ * set its own `sinceCursor` (or asked for the `run_started`
539
+ * / `hook_received` preload, which owns the same response
540
+ * fields) keeps what it asked for.
541
+ */
542
+ const deltaRequestCursor = (data, params) => {
543
+ if (turbo ||
544
+ eventLog.type !== 'ready' ||
545
+ params?.sinceCursor !== undefined ||
546
+ params?.preloadEvents === true ||
547
+ isTerminalRunEventType(data.eventType)) {
548
+ return undefined;
549
+ }
550
+ return eventLog.cursor ?? undefined;
551
+ };
552
+ /**
553
+ * Fold an inline delta returned by `events.create` into the
554
+ * in-memory event log.
555
+ *
556
+ * The delta is what `events.list({ cursor: sentCursor })`
557
+ * would have returned right after the write, so it carries
558
+ * back both our own event and anything another writer
559
+ * appended in band. Absorbing it here means the next reader
560
+ * already has the log and the loop's incremental
561
+ * `events.list` finds nothing left to fetch.
562
+ *
563
+ * Declining is always safe — an unabsorbed delta is a delta
564
+ * the next `events.list` returns — so the guards are free to
565
+ * be strict:
566
+ *
567
+ * - `hasMore` means the World truncated the page. Taking it
568
+ * while advancing the cursor to the page end would be
569
+ * fine, but taking it and NOT advancing would duplicate,
570
+ * and the truncated case is rare enough not to special-case.
571
+ * - The cursor must be exactly where it was when the request
572
+ * went out. Concurrent writes each diff against the cursor
573
+ * they saw, and `appendUniqueEvents` deliberately does not
574
+ * re-sort, so absorbing a second delta computed from an
575
+ * older cursor could append events behind ones already
576
+ * taken. First response back wins; the rest are dropped.
577
+ */
578
+ const absorbCreateDelta = (sentCursor, result) => {
579
+ if (eventLog.type !== 'ready' ||
580
+ eventLog.cursor !== sentCursor ||
581
+ result.events === undefined ||
582
+ result.hasMore === true) {
583
+ return;
584
+ }
585
+ appendEventLog(eventLog, {
586
+ events: result.events,
587
+ cursor: result.cursor,
588
+ });
589
+ };
590
+ // `ready` can replay once without a read. The other states
591
+ // describe the next load exactly.
592
+ let eventLog = { type: 'loadAll' };
523
593
  // Shared state: set by either the background step path
524
594
  // or the run_started setup below.
525
595
  let workflowRun;
@@ -527,14 +597,6 @@ export function workflowEntrypoint(workflowCode, options) {
527
597
  // response. Undefined ⇒ no enforcement (older servers, turbo).
528
598
  let maxEventsLimit;
529
599
  let workflowStartedAt = -1;
530
- let preloadedEvents;
531
- let preloadedEventsCursor;
532
- // True only when `preloadedEvents` is known to be the
533
- // COMPLETE event log (the lazy hook fast path's validated
534
- // hasMore-false preload). Lets QuickJS trust it as-is —
535
- // its own heuristic only recognizes first-invocation
536
- // (run_created/run_started-only) preloads.
537
- let preloadedEventsComplete = false;
538
600
  // Latency telemetry (TTFS) state — see runtime/step-latency.ts.
539
601
  // Whether this invocation's FIRST event snapshot contained
540
602
  // nothing beyond run_created/run_started: anything else was
@@ -779,25 +841,23 @@ export function workflowEntrypoint(workflowCode, options) {
779
841
  const delta = allowDelta && preconditionRestarts === 1
780
842
  ? preconditionEventDelta(error, runId)
781
843
  : null;
782
- // A delta is only usable as a delta if there is a cached log
783
- // to merge it into; with no base log the restart has to load
784
- // the whole thing anyway.
785
- const usedDelta = Boolean(delta && cachedEvents);
844
+ // A delta is only usable if there is a loaded log to merge
845
+ // it into; without one the restart must load everything.
846
+ const usedDelta = delta !== null && eventLog.type !== 'loadAll';
786
847
  // Snapshot the set being discarded while it is still in
787
848
  // hand; the comparison happens once the next load resolves.
788
- preconditionRestartBaseline = cachedEvents
789
- ? {
790
- ids: new Set(cachedEvents.map((event) => event.eventId)),
791
- restart: preconditionRestarts,
792
- reason,
793
- source: usedDelta ? 'inline-delta' : 'full-reload',
794
- }
795
- : null;
796
- if (usedDelta) {
797
- // Consumed by the loop's first branch
798
- // (`pendingInlineDelta && cachedEvents`) with no
799
- // events.list round trip at all.
800
- pendingInlineDelta = delta;
849
+ preconditionRestartBaseline =
850
+ eventLog.type !== 'loadAll'
851
+ ? {
852
+ ids: new Set(eventLog.events.map((event) => event.eventId)),
853
+ restart: preconditionRestarts,
854
+ reason,
855
+ source: usedDelta ? 'inline-delta' : 'full-reload',
856
+ }
857
+ : null;
858
+ if (delta && eventLog.type !== 'loadAll') {
859
+ appendEventLog(eventLog, delta);
860
+ eventLog = { ...eventLog, type: 'ready' };
801
861
  }
802
862
  else {
803
863
  // MUST be a full, cursor-less reload. The cursor filters
@@ -808,12 +868,7 @@ export function workflowEntrypoint(workflowCode, options) {
808
868
  // millisecond but committed later always sorts below it.
809
869
  // An incremental load therefore heals the hole only by
810
870
  // luck.
811
- cachedEvents = null;
812
- eventsCursor = null;
813
- preloadedEvents = undefined;
814
- preloadedEventsCursor = undefined;
815
- preloadedEventsComplete = false;
816
- pendingInlineDelta = null;
871
+ eventLog = { type: 'loadAll' };
817
872
  // The corrected log inserts the missing events BELOW the
818
873
  // length already scanned for payload prewarming, shifting
819
874
  // every later position. Only a full rescan sees them.
@@ -950,21 +1005,14 @@ export function workflowEntrypoint(workflowCode, options) {
950
1005
  // owned recovery and then transitions to queued/bare
951
1006
  // retries trips the combined ceiling. This still bounds
952
1007
  // timeouts, which write no error for the post-body guard
953
- // to catch. The load also primes the replay's
954
- // `cachedEvents`/`eventsCursor` (the post-step
955
- // continuation below refreshes them once the step's
956
- // terminal event lands).
1008
+ // to catch.
957
1009
  let bgAuthoritativeAttempt = metadata.attempt;
958
1010
  const bgMaxRetries = getStepFunction(incomingStepName)?.maxRetries ??
959
1011
  DEFAULT_STEP_MAX_RETRIES;
960
1012
  if (metadata.attempt > bgMaxRetries + 1) {
961
1013
  const loaded = await loadWorkflowRunEvents(runId);
962
- cachedEvents = loaded.events;
963
- eventsCursor = loaded.cursor;
964
1014
  bgAuthoritativeAttempt =
965
- countStepStartedEvents(cachedEvents, incomingStepId, {
966
- type: 'totalAttempts',
967
- }) + 1;
1015
+ countStepStartedEvents(loaded.events, incomingStepId, { type: 'totalAttempts' }) + 1;
968
1016
  }
969
1017
  // Pause the replay budget while the step body runs —
970
1018
  // step duration is bounded by the platform's function
@@ -1026,13 +1074,12 @@ export function workflowEntrypoint(workflowCode, options) {
1026
1074
  // Use cursor-based loading so the main loop can continue
1027
1075
  // incrementally from here.
1028
1076
  const loaded = await loadWorkflowRunEvents(runId);
1029
- cachedEvents = loaded.events;
1030
- eventsCursor = loaded.cursor;
1077
+ eventLog = nextEventLogLoad(loaded);
1031
1078
  // Check for pending steps: any step_created without
1032
1079
  // a matching step_completed or step_failed.
1033
1080
  const stepCreatedIds = new Set();
1034
1081
  const stepTerminalIds = new Set();
1035
- for (const e of cachedEvents) {
1082
+ for (const e of loaded.events) {
1036
1083
  if (e.eventType === 'step_created') {
1037
1084
  stepCreatedIds.add(e.correlationId);
1038
1085
  }
@@ -1057,7 +1104,7 @@ export function workflowEntrypoint(workflowCode, options) {
1057
1104
  // backstop. Fall through to the main loop, whose
1058
1105
  // dispatch table routes it to owned recovery.
1059
1106
  if (isInlineOwnershipEnabled() &&
1060
- hasPendingStepOwnedByMessage(cachedEvents, pendingStepIds, metadata.messageId)) {
1107
+ hasPendingStepOwnedByMessage(loaded.events, pendingStepIds, metadata.messageId)) {
1061
1108
  runtimeLogger.debug('Background step done; falling through to recover an inline step owned by this message', { workflowRunId: runId });
1062
1109
  }
1063
1110
  else {
@@ -1071,7 +1118,7 @@ export function workflowEntrypoint(workflowCode, options) {
1071
1118
  // All steps done — fall through to the main replay loop.
1072
1119
  // Set up shared state so the loop can continue.
1073
1120
  runtimeLogger.debug('All parallel steps done, replaying inline after background step', { workflowRunId: runId });
1074
- const runCreatedEvent = cachedEvents.find((event) => event.eventType === 'run_created');
1121
+ const runCreatedEvent = loaded.events.find((event) => event.eventType === 'run_created');
1075
1122
  let replayInput;
1076
1123
  if (runCreatedEvent) {
1077
1124
  replayInput = runCreatedEvent.eventData.input;
@@ -1099,7 +1146,6 @@ export function workflowEntrypoint(workflowCode, options) {
1099
1146
  completedAt: undefined,
1100
1147
  };
1101
1148
  workflowStartedAt = bgStartedAt;
1102
- // cachedEvents and eventsCursor already set from load above
1103
1149
  }
1104
1150
  else {
1105
1151
  return;
@@ -1122,6 +1168,53 @@ export function workflowEntrypoint(workflowCode, options) {
1122
1168
  return;
1123
1169
  }
1124
1170
  }
1171
+ // Deployment-affinity pre-check for the lazy hook fast
1172
+ // path below. New lazy-resume messages carry the run's
1173
+ // pinned deployment (`hookInput.deploymentId`), so a
1174
+ // misrouted delivery is detectable with a cheap ambient
1175
+ // deployment-id comparison BEFORE the fast path's
1176
+ // hook_received write — the correctly-routed common case
1177
+ // pays no run fetch and no latency. Only a detected
1178
+ // mismatch fetches the authoritative run and hands it to
1179
+ // the existing guard (which owns re-route/fail policy);
1180
+ // the re-routed message keeps the complete `hookInput`,
1181
+ // since it may hold the only copy of the resume payload.
1182
+ // When the pinned or ambient id is unavailable (older
1183
+ // producer message, a world without deployment affinity,
1184
+ // or a getDeploymentId failure), behavior is unchanged:
1185
+ // the authoritative guard after run setup — which remains
1186
+ // the protection before replay and step execution — still
1187
+ // covers the delivery; the fast path's write is idempotent
1188
+ // per (runId, resumeId), so a pre-guard write from an
1189
+ // older message stays convergent.
1190
+ if (!workflowRun &&
1191
+ hookInput?.deploymentId !== undefined &&
1192
+ // Same eligibility as guardDeploymentAffinity: without
1193
+ // atomic, immutable deployments the ids legitimately
1194
+ // differ (e.g. dpl_local@<version>) and comparing them
1195
+ // would trigger spurious run fetches.
1196
+ world.capabilities?.deploymentAffinity === true) {
1197
+ const pinnedDeploymentId = hookInput.deploymentId;
1198
+ let currentDeploymentId;
1199
+ try {
1200
+ currentDeploymentId = await world.getDeploymentId();
1201
+ }
1202
+ catch {
1203
+ currentDeploymentId = undefined;
1204
+ }
1205
+ if (currentDeploymentId !== undefined &&
1206
+ currentDeploymentId !== pinnedDeploymentId) {
1207
+ const run = await world.runs.get(runId, {
1208
+ resolveData: 'none',
1209
+ });
1210
+ if ((await guardDeployment(run, async () => ({
1211
+ ...(await replayMessage()),
1212
+ hookInput,
1213
+ }), awaitRunReady)) !== 'continue') {
1214
+ return;
1215
+ }
1216
+ }
1217
+ }
1125
1218
  // --- Lazy hook resume fast path ---
1126
1219
  // A lazy hook delivery (resumeId + digest on the queue
1127
1220
  // message) hoists the consumer's idempotent hook_received
@@ -1245,13 +1338,11 @@ export function workflowEntrypoint(workflowCode, options) {
1245
1338
  // Anchors RSFS — see the declaration above. This
1246
1339
  // response plays run_started's role on this path.
1247
1340
  runStartedReceivedAtMs = Date.now();
1248
- preloadedEvents = result.events;
1249
- preloadedEventsCursor = result.cursor;
1250
- // The validated preload is the COMPLETE log (hasMore
1251
- // false), so QuickJS may trust it as-is instead of
1252
- // refetching — its own first-invocation heuristic
1253
- // only recognizes run_created/run_started preloads.
1254
- preloadedEventsComplete = true;
1341
+ eventLog = {
1342
+ type: 'ready',
1343
+ events: result.events,
1344
+ cursor: result.cursor,
1345
+ };
1255
1346
  workflowStartedAt = +result.run.startedAt;
1256
1347
  span?.setAttributes({
1257
1348
  ...Attribute.WorkflowRunStatus(result.run.status),
@@ -1321,11 +1412,6 @@ export function workflowEntrypoint(workflowCode, options) {
1321
1412
  }
1322
1413
  : {}),
1323
1414
  };
1324
- const recordRunStartedCreateStart = (skipPreload) => {
1325
- span?.addEvent('workflow.run_started.create.start', {
1326
- 'workflow.run_started.skip_preload': skipPreload,
1327
- });
1328
- };
1329
1415
  if (turbo && runInput) {
1330
1416
  // Turbo: background `run_started` and synthesize the run
1331
1417
  // entity locally so replay can begin without waiting for
@@ -1335,11 +1421,12 @@ export function workflowEntrypoint(workflowCode, options) {
1335
1421
  // barrier is consumed by every downstream write (suspension
1336
1422
  // handler, optimistic step_started, terminal run writes) so
1337
1423
  // nothing is written before the run exists.
1338
- recordRunStartedCreateStart(true);
1424
+ span?.addEvent('workflow.run_started.create.start', {
1425
+ 'workflow.run_started.skip_preload': true,
1426
+ });
1339
1427
  const startedPromise = createEvent(runStartedEvent,
1340
1428
  // We background this purely as a write barrier and
1341
- // never read its preloaded events (preloadedEvents is
1342
- // forced to [] below), so tell the World to skip the
1429
+ // never read its preloaded events, so skip the
1343
1430
  // run_started event-log preload. That trims the
1344
1431
  // run_started request the chained first step_started
1345
1432
  // waits on — shortening time-to-second-step — and the
@@ -1352,24 +1439,26 @@ export function workflowEntrypoint(workflowCode, options) {
1352
1439
  // maxEventsLimit every loop iteration, so a value that lands
1353
1440
  // shortly after start still enforces well before a runaway
1354
1441
  // log approaches the ceiling.
1355
- startedPromise.then((r) => {
1356
- const limit = clampMaxEvents(r?.maxEvents);
1442
+ void startedPromise
1443
+ .then((r) => {
1444
+ const limit = clampMaxEvents(r.maxEvents);
1357
1445
  if (limit !== undefined)
1358
1446
  maxEventsLimit = limit;
1359
- }, () => { });
1360
- // Attach a no-op rejection handler so an early failure
1361
- // never surfaces as an unhandledRejection before a consumer
1362
- // (await/then) is attached; consumers still observe it.
1363
- startedPromise.catch(() => { });
1447
+ })
1448
+ // Prevent an early failure from surfacing as an
1449
+ // unhandledRejection; runReadyBarrier still observes it.
1450
+ .catch(() => { });
1364
1451
  // Skip the initial events.list: nothing has been written to
1365
1452
  // the log yet on a first delivery (run_started is still in
1366
- // flight). An empty preloaded set routes iteration 1 through
1453
+ // flight). An empty preload routes iteration 1 through
1367
1454
  // the no-load preloaded branch; iteration 2 then takes the
1368
1455
  // existing post-preloaded full reload to pick up a cursor
1369
- // (no spurious "cursor missing" warning). `[]` is
1370
- // intentionally truthy here — do not change the load
1371
- // branches' `if (preloadedEvents)` checks to test length.
1372
- preloadedEvents = [];
1456
+ // without a spurious "cursor missing" warning.
1457
+ eventLog = {
1458
+ type: 'ready',
1459
+ events: [],
1460
+ cursor: null,
1461
+ };
1373
1462
  const now = new Date();
1374
1463
  workflowRun = {
1375
1464
  runId,
@@ -1409,27 +1498,41 @@ export function workflowEntrypoint(workflowCode, options) {
1409
1498
  }
1410
1499
  else {
1411
1500
  try {
1412
- recordRunStartedCreateStart(false);
1501
+ span?.addEvent('workflow.run_started.create.start', {
1502
+ 'workflow.run_started.skip_preload': false,
1503
+ });
1413
1504
  const result = await createEvent(runStartedEvent, {
1414
1505
  requestId,
1415
1506
  });
1416
- if (!result.run) {
1417
- throw new WorkflowRuntimeError(`Event creation for 'run_started' did not return the run entity for run "${runId}"`);
1418
- }
1419
1507
  workflowRun = result.run;
1420
1508
  maxEventsLimit = clampMaxEvents(result.maxEvents);
1421
1509
  // Anchors RSFS — see the declaration above.
1422
1510
  runStartedReceivedAtMs = Date.now();
1423
- // If the response includes events, use them to skip
1424
- // the initial events.list call and reduce TTFB.
1425
- if (result.events &&
1426
- result.events.length > 0 &&
1427
- result.hasMore !== true) {
1428
- preloadedEvents = result.events;
1429
- preloadedEventsCursor = result.cursor;
1511
+ if (result.events?.length) {
1512
+ const loaded = {
1513
+ events: [...result.events],
1514
+ cursor: result.cursor ?? null,
1515
+ };
1516
+ eventLog = result.hasMore
1517
+ ? nextEventLogLoad(loaded)
1518
+ : { ...loaded, type: 'ready' };
1430
1519
  }
1431
- if (!workflowRun.startedAt) {
1432
- throw new WorkflowRuntimeError(`Workflow run "${runId}" has no "startedAt" timestamp`);
1520
+ workflowStartedAt = +result.run.startedAt;
1521
+ span?.setAttributes({
1522
+ ...Attribute.WorkflowRunStatus(result.run.status),
1523
+ ...Attribute.WorkflowStartedAt(workflowStartedAt),
1524
+ });
1525
+ if (result.run.status !== 'running') {
1526
+ runtimeLogger.info('Workflow already completed or failed, skipping', {
1527
+ workflowRunId: runId,
1528
+ status: result.run.status,
1529
+ });
1530
+ // TODO: for `cancel`, we actually want to propagate a WorkflowCancelled event
1531
+ // inside the workflow context so the user can gracefully exit. this is SIGTERM
1532
+ // TODO: furthermore, there should be a timeout or a way to force cancel SIGKILL
1533
+ // so that we actually exit here without replaying the workflow at all, in the case
1534
+ // the replaying the workflow is itself failing.
1535
+ return;
1433
1536
  }
1434
1537
  }
1435
1538
  catch (err) {
@@ -1460,39 +1563,29 @@ export function workflowEntrypoint(workflowCode, options) {
1460
1563
  return;
1461
1564
  }
1462
1565
  }
1463
- workflowStartedAt = +workflowRun.startedAt;
1464
- span?.setAttributes({
1465
- ...Attribute.WorkflowRunStatus(workflowRun.status),
1466
- ...Attribute.WorkflowStartedAt(workflowStartedAt),
1467
- });
1468
- if (workflowRun.status !== 'running') {
1469
- // Workflow has already completed or failed, so we can skip it
1470
- runtimeLogger.info('Workflow already completed or failed, skipping', {
1471
- workflowRunId: runId,
1472
- status: workflowRun.status,
1473
- });
1474
- // TODO: for `cancel`, we actually want to propagate a WorkflowCancelled event
1475
- // inside the workflow context so the user can gracefully exit. this is SIGTERM
1476
- // TODO: furthermore, there should be a timeout or a way to force cancel SIGKILL
1477
- // so that we actually exit here without replaying the workflow at all, in the case
1478
- // the replaying the workflow is itself failing.
1479
- return;
1480
- }
1481
1566
  } // end else (non-turbo run_started)
1482
1567
  } // end if (!workflowRun)
1568
+ assert(workflowRun, 'Workflow run must be loaded before replay');
1483
1569
  // Covers every flow replay — initial start, step completions,
1484
1570
  // hook resumptions, wait completions — and stops before any
1485
- // workflow code, inline step, or event write happens when the
1486
- // run is not pinned here (see `guardDeploymentAffinity`).
1487
- // `awaitRunReady` orders turbo's `run_started` before either
1488
- // stopping action.
1571
+ // workflow code or inline step executes when the run is not
1572
+ // pinned here (see `guardDeploymentAffinity`). This remains
1573
+ // the AUTHORITATIVE protection before replay and step
1574
+ // execution. `awaitRunReady` orders turbo's `run_started`
1575
+ // before either stopping action.
1489
1576
  //
1490
- // Runs ahead of the lazy-hook re-ensure below, so a misrouted
1491
- // resume writes nothing here which means the re-routed
1492
- // message must carry `hookInput`, or a resume whose producer
1493
- // write had not yet landed would be lost (that re-ensure is
1494
- // idempotent per `resumeId`, so the pinned deployment still
1495
- // converges on one event).
1577
+ // Lazy hook resumes are additionally pre-checked above the
1578
+ // fast path: a new message's `hookInput.deploymentId` is
1579
+ // compared against the ambient deployment id for free, and
1580
+ // only a detected mismatch fetches the authoritative run
1581
+ // so a misrouted modern resume re-routes with zero event
1582
+ // writes. Older messages (no `hookInput.deploymentId`) reach
1583
+ // the fast path's idempotent hook_received write before this
1584
+ // guard; that write converges per (runId, resumeId) on the
1585
+ // pinned deployment, so it is safe, just not free. Either
1586
+ // way the re-routed message must carry `hookInput`, or a
1587
+ // resume whose producer write had not yet landed would be
1588
+ // lost.
1496
1589
  if ((await guardDeployment(workflowRun, async () => ({
1497
1590
  ...(await replayMessage()),
1498
1591
  ...(hookInput ? { hookInput } : {}),
@@ -1530,7 +1623,8 @@ export function workflowEntrypoint(workflowCode, options) {
1530
1623
  // serves hookInput shapes without the full idempotency
1531
1624
  // pair.
1532
1625
  const alreadyPreloaded = hookInput.resumeId !== undefined &&
1533
- preloadedEvents?.some((e) => e.eventType === 'hook_received' &&
1626
+ eventLog.type !== 'loadAll' &&
1627
+ eventLog.events.some((e) => e.eventType === 'hook_received' &&
1534
1628
  e.resumeId === hookInput.resumeId);
1535
1629
  if (alreadyPreloaded) {
1536
1630
  // Event already visible in the preloaded log — nothing to
@@ -1635,18 +1729,14 @@ export function workflowEntrypoint(workflowCode, options) {
1635
1729
  // events.list round trip on the first replay iteration),
1636
1730
  // splice in the canonical event reconstructed above. It
1637
1731
  // carries a stable eventId, so `insertEventByEventId` keeps
1638
- // it in ascending eventId order (preloadedEvents load
1639
- // `sortOrder: 'asc'` and are not re-sorted client-side) and
1640
- // is idempotent even if a later list re-observes it. Only
1641
- // when the World returns no event (older backend) do we fall
1642
- // back to dropping the preload so a fresh list observes it.
1643
- if (preloadedEvents && ensuredEvent) {
1644
- insertEventByEventId(preloadedEvents, ensuredEvent);
1732
+ // it in ascending eventId order and is idempotent if a later
1733
+ // list re-observes it. Only when the World returns no event
1734
+ // do we fall back to reloading the complete log.
1735
+ if (eventLog.type !== 'loadAll' && ensuredEvent) {
1736
+ insertEventByEventId(eventLog.events, ensuredEvent);
1645
1737
  }
1646
1738
  else {
1647
- preloadedEvents = undefined;
1648
- preloadedEventsCursor = undefined;
1649
- preloadedEventsComplete = false;
1739
+ eventLog = { type: 'loadAll' };
1650
1740
  }
1651
1741
  } // end else (re-ensure needed)
1652
1742
  }
@@ -1684,10 +1774,8 @@ export function workflowEntrypoint(workflowCode, options) {
1684
1774
  attempt: metadata.attempt,
1685
1775
  limitMs: replayBudget.configuredLimitMs,
1686
1776
  });
1687
- // On Vercel, handleReplayBudgetExhausted always
1688
- // exits the process. On local dev it returns; we
1689
- // fall through and the request ends normally
1690
- // (run_failed has been written best-effort).
1777
+ // Only the terminal attempt returns, after run_failed is
1778
+ // durable. Earlier attempts reject for queue redelivery.
1691
1779
  return;
1692
1780
  }
1693
1781
  // Check timeout before replay
@@ -1706,11 +1794,6 @@ export function workflowEntrypoint(workflowCode, options) {
1706
1794
  return;
1707
1795
  }
1708
1796
  let replayStart = 0;
1709
- // Cursor of this iteration's event log before any inline
1710
- // writes advance it — declared at try scope so the
1711
- // suspension catch (which runs the inline step) can read it
1712
- // as the `sinceCursor` for the inline-delta optimization.
1713
- let preInlineWriteCursor = null;
1714
1797
  try {
1715
1798
  // --- QuickJS VM engine dispatch ---
1716
1799
  // The QuickJS engine (opt-in via WORKFLOW_VM=quickjs
@@ -1746,6 +1829,10 @@ export function workflowEntrypoint(workflowCode, options) {
1746
1829
  // turbo runReadyBarrier the way handleSuspension
1747
1830
  // does.
1748
1831
  await awaitRunReady();
1832
+ if (eventLog.type === 'loadAfter') {
1833
+ appendEventLog(eventLog, await loadWorkflowRunEvents(runId, eventLog.cursor));
1834
+ eventLog = { ...eventLog, type: 'ready' };
1835
+ }
1749
1836
  // Lazy import: the QuickJS entrypoint's import chain
1750
1837
  // embeds the base64 WASM binary + extensions
1751
1838
  // (~1.3 MB decoded at module scope). Loading it here
@@ -1756,8 +1843,10 @@ export function workflowEntrypoint(workflowCode, options) {
1756
1843
  workflowCode,
1757
1844
  workflowName,
1758
1845
  workflowRun,
1759
- preloadedEvents,
1760
- preloadedEventsComplete,
1846
+ preloadedEvents: eventLog.type === 'ready'
1847
+ ? eventLog.events
1848
+ : undefined,
1849
+ preloadedEventsComplete: eventLog.type === 'ready',
1761
1850
  runInput,
1762
1851
  parentSpan: span,
1763
1852
  maxEventsLimit,
@@ -1787,103 +1876,35 @@ export function workflowEntrypoint(workflowCode, options) {
1787
1876
  }
1788
1877
  return;
1789
1878
  }
1790
- // Load events use cached events with incremental fetch on subsequent iterations.
1791
- // The server always returns a cursor when there are events (even on the
1792
- // final page), so we can reliably use it for incremental loading.
1793
- let events;
1794
- if (pendingInlineDelta && cachedEvents) {
1795
- // Fast path: the previous iteration's inline step
1796
- // terminal write returned the authoritative event-log
1797
- // delta since the pre-write cursor, so we consume it
1798
- // here instead of issuing an incremental events.list.
1799
- // The delta is byte-for-byte what events.list(cursor)
1800
- // would have returned at write time — it includes this
1801
- // handler's own step events, any attr_set the step body
1802
- // wrote, and any in-band events (e.g. hook_received,
1803
- // wait_completed) another writer appended since the
1804
- // cursor — so skipping the fetch cannot drop events or
1805
- // skew the prefix from the server's log.
1806
- const delta = pendingInlineDelta;
1807
- pendingInlineDelta = null;
1808
- appendUniqueEvents(cachedEvents, delta.events);
1809
- eventsCursor = delta.cursor ?? eventsCursor;
1810
- events = cachedEvents;
1811
- }
1812
- else if (cachedEvents === null) {
1813
- // First iteration: use preloaded events if available,
1814
- // otherwise do a full load with cursor.
1815
- if (preloadedEvents) {
1816
- events = preloadedEvents;
1817
- eventsCursor = preloadedEventsCursor ?? null;
1879
+ if (eventLog.type !== 'ready') {
1880
+ const page = await loadWorkflowRunEvents(runId, eventLog.type === 'loadAfter'
1881
+ ? eventLog.cursor
1882
+ : undefined);
1883
+ if (eventLog.type === 'loadAfter') {
1884
+ appendEventLog(eventLog, page);
1885
+ eventLog = { ...eventLog, type: 'ready' };
1818
1886
  }
1819
1887
  else {
1820
- const loaded = await loadWorkflowRunEvents(runId);
1821
- events = loaded.events;
1822
- eventsCursor = loaded.cursor;
1888
+ eventLog = { ...page, type: 'ready' };
1823
1889
  }
1824
1890
  }
1825
- else if (eventsCursor) {
1826
- // Subsequent iteration: fetch only new events since last cursor
1827
- const loaded = await loadWorkflowRunEvents(runId, eventsCursor);
1828
- // Dedupe by eventId: a previous iteration may have
1829
- // appended a refreshed wait-completion delta before
1830
- // the next loop observes the advanced cursor, so an
1831
- // incremental fetch can return events we already have
1832
- // locally.
1833
- appendUniqueEvents(cachedEvents, loaded.events);
1834
- eventsCursor = loaded.cursor ?? eventsCursor;
1835
- events = cachedEvents;
1836
- }
1837
- else if (preloadedEvents) {
1838
- // Iteration 2 after iteration 1 used preloaded events
1839
- // (which don't carry a cursor). Do a full load now to
1840
- // pick up any events written since the preloaded set
1841
- // and obtain a cursor for subsequent incremental
1842
- // loads. This is the expected path, not a bug.
1843
- runtimeLogger.debug('No cursor after preloaded-events first iteration; doing full reload to pick up cursor.', { workflowRunId: runId });
1844
- const loaded = await loadWorkflowRunEvents(runId);
1845
- cachedEvents = loaded.events;
1846
- eventsCursor = loaded.cursor;
1847
- events = cachedEvents;
1848
- }
1849
- else {
1850
- // No cursor available despite having cached events
1851
- // and no preloaded-events explanation. All World
1852
- // implementations are required to return a cursor
1853
- // when there are events, so this signals a bug in
1854
- // the World. Fall back to a full reload to avoid
1855
- // stale data.
1856
- runtimeLogger.warn('Event cursor missing after initial load — falling back to full reload. ' +
1857
- 'This indicates a bug in the World implementation.', { workflowRunId: runId });
1858
- const loaded = await loadWorkflowRunEvents(runId);
1859
- cachedEvents = loaded.events;
1860
- eventsCursor = loaded.cursor;
1861
- events = cachedEvents;
1862
- }
1863
- // Publish the snapshot to the loop-scoped cache as soon
1864
- // as it is loaded, not just at the end of the iteration:
1865
- // a stale-snapshot rejection thrown by the wait-completion
1866
- // writes below restarts the replay, and that restart can
1867
- // only consume a World-attached event delta when there is
1868
- // a cached array to merge it into. Reassigned again after
1869
- // the wait pass, which may swap in a freshly loaded array.
1870
- cachedEvents = events;
1871
- reportPreconditionRestartReload(events);
1891
+ assert(eventLog.type === 'ready');
1892
+ reportPreconditionRestartReload(eventLog.events);
1872
1893
  // Detect concurrent completion via the event log: if
1873
1894
  // any other handler wrote a terminal run event, exit
1874
1895
  // before doing replay work. The run entity's status is
1875
1896
  // derived from these events, so checking the log here
1876
1897
  // gives us the same signal as a runs.get() round-trip
1877
1898
  // without the extra request per loop iteration.
1878
- if (hasRecordedTerminalRunEvent(events, runId)) {
1899
+ if (hasRecordedTerminalRunEvent(eventLog.events, runId)) {
1879
1900
  return;
1880
1901
  }
1881
1902
  // Complete elapsed waits
1882
1903
  const now = Date.now();
1883
- const completedWaitIds = new Set(events
1904
+ const completedWaitIds = new Set(eventLog.events
1884
1905
  .filter((e) => e.eventType === 'wait_completed')
1885
1906
  .map((e) => e.correlationId));
1886
- const waitsToComplete = events
1907
+ const waitsToComplete = eventLog.events
1887
1908
  .filter((e) => e.eventType === 'wait_created' &&
1888
1909
  e.correlationId !== undefined &&
1889
1910
  !completedWaitIds.has(e.correlationId) &&
@@ -1898,10 +1919,26 @@ export function workflowEntrypoint(workflowCode, options) {
1898
1919
  }));
1899
1920
  for (const waitEvent of waitsToComplete) {
1900
1921
  try {
1901
- await createEvent(waitEvent, {
1922
+ const created = await createEvent(waitEvent, {
1902
1923
  requestId,
1903
- ...preconditionSnapshotParams(events, eventsCursor),
1924
+ ...preconditionSnapshotParams(eventLog.events, eventLog.cursor),
1904
1925
  });
1926
+ // Bump-and-report: fold what this write skipped over
1927
+ // into the snapshot the remaining waits are guarded
1928
+ // against, so each asks for a slot above it.
1929
+ //
1930
+ // Only a complete answer. `hasMore` means the World
1931
+ // returned part of what it was asked for, and the
1932
+ // missing-completion check below is what decides
1933
+ // whether this handler still has to fetch. Folding in
1934
+ // a partial page would make the log look like it
1935
+ // holds the completion when the rest of the page is
1936
+ // still unread, so the fetch would be skipped on a
1937
+ // snapshot that is short of the World's.
1938
+ if (created.events?.length &&
1939
+ created.hasMore !== true) {
1940
+ mergeReportedEvents(eventLog.events, created.events);
1941
+ }
1905
1942
  }
1906
1943
  catch (err) {
1907
1944
  if (EntityConflictError.is(err)) {
@@ -1914,35 +1951,72 @@ export function workflowEntrypoint(workflowCode, options) {
1914
1951
  throw err;
1915
1952
  }
1916
1953
  }
1917
- if (waitsToComplete.length > 0) {
1918
- // The event list above may be stale by the time an
1919
- // elapsed wait is committed. Load only events after
1920
- // the original snapshot cursor so concurrent durable
1921
- // events, such as hook_received, keep their ordering
1922
- // relative to wait_completed. Fall back to a full
1923
- // reload for older worlds that cannot give us a stable
1924
- // cursor, or if the cursor delta does not include the
1925
- // wait completion this handler just attempted.
1926
- if (eventsCursor) {
1927
- const loaded = await loadWorkflowRunEvents(runId, eventsCursor);
1928
- const completedWaitIdsAfterCursor = new Set(loaded.events
1954
+ assert(eventLog.type === 'ready');
1955
+ // The event list above may be stale by the time an
1956
+ // elapsed wait is committed, and this replay has to see
1957
+ // its own wait_completed before it can advance past the
1958
+ // sleep. Each write asked the World for the delta since
1959
+ // our cursor and folded it in (see createEvent), so a
1960
+ // supporting World has already handed those events back
1961
+ // and there is nothing left to do. Only fetch for the
1962
+ // completions still missing locally: a World that
1963
+ // ignores `sinceCursor`, a truncated delta, a concurrent
1964
+ // absorb that lost the cursor race, or an
1965
+ // EntityConflictError, whose rejection carries no delta.
1966
+ const completedWaitIdsAfterWrites = new Set(eventLog.events
1967
+ .filter((e) => e.eventType === 'wait_completed')
1968
+ .map((e) => e.correlationId));
1969
+ const missingWaitCompletions = waitsToComplete.filter((waitEvent) => !completedWaitIdsAfterWrites.has(waitEvent.correlationId));
1970
+ if (missingWaitCompletions.length > 0) {
1971
+ // Load only events after the original snapshot cursor
1972
+ // so concurrent durable events, such as hook_received,
1973
+ // keep their ordering relative to wait_completed. Fall
1974
+ // back to a full reload for older worlds that cannot
1975
+ // give us a stable cursor, or if the cursor delta does
1976
+ // not include the wait completion this handler just
1977
+ // attempted.
1978
+ if (eventLog.cursor) {
1979
+ const page = await loadWorkflowRunEvents(runId, eventLog.cursor);
1980
+ const completedWaitIdsAfterCursor = new Set(page.events
1929
1981
  .filter((e) => e.eventType === 'wait_completed')
1930
1982
  .map((e) => e.correlationId));
1931
- const sawAllWaitCompletions = waitsToComplete.every((waitEvent) => completedWaitIdsAfterCursor.has(waitEvent.correlationId));
1983
+ const sawAllWaitCompletions = missingWaitCompletions.every((waitEvent) => completedWaitIdsAfterCursor.has(waitEvent.correlationId));
1932
1984
  if (sawAllWaitCompletions) {
1933
- appendUniqueEvents(events, loaded.events);
1934
- eventsCursor = loaded.cursor ?? eventsCursor;
1985
+ appendEventLog(eventLog, page);
1935
1986
  }
1936
1987
  else {
1937
- const loaded = await loadWorkflowRunEvents(runId);
1938
- events = loaded.events;
1939
- eventsCursor = loaded.cursor;
1988
+ eventLog = {
1989
+ ...(await loadWorkflowRunEvents(runId)),
1990
+ type: 'ready',
1991
+ };
1940
1992
  }
1941
1993
  }
1942
1994
  else {
1943
- const loaded = await loadWorkflowRunEvents(runId);
1944
- events = loaded.events;
1945
- eventsCursor = loaded.cursor;
1995
+ eventLog = {
1996
+ ...(await loadWorkflowRunEvents(runId)),
1997
+ type: 'ready',
1998
+ };
1999
+ }
2000
+ }
2001
+ // A replay reads the log as the complete record of what
2002
+ // has happened, so a position nothing occupies is
2003
+ // indistinguishable from an event that never occurred and
2004
+ // the branch it would have decided gets decided the other
2005
+ // way. Failing here is the difference between a run that
2006
+ // reports its own corruption and one that silently
2007
+ // returns the wrong answer.
2008
+ //
2009
+ // A hole that is merely a write mid-commit fills in on
2010
+ // its own, so settleEventSlotGap re-reads before
2011
+ // concluding, and adopts whichever log it settled on.
2012
+ if (isSlotGapCheckEnabled()) {
2013
+ const settled = await settleEventSlotGap(runId, {
2014
+ events: eventLog.events,
2015
+ cursor: eventLog.cursor,
2016
+ });
2017
+ eventLog = { ...settled.log, type: 'ready' };
2018
+ if (settled.gap !== undefined) {
2019
+ throw new CorruptedEventLogError(`Event log for run ${runId} has a hole at slot ${settled.gap.firstMissingSlot}: ${settled.gap.missingCount} of the ${settled.gap.maxSlot} slots up to the log's maximum hold no event.`);
1946
2020
  }
1947
2021
  }
1948
2022
  // Completing elapsed waits refreshes the event snapshot.
@@ -1950,7 +2024,7 @@ export function workflowEntrypoint(workflowCode, options) {
1950
2024
  // event after the initial snapshot but before this
1951
2025
  // replay. Once the event log records that outcome, this
1952
2026
  // delivery is done.
1953
- if (hasRecordedTerminalRunEvent(events, runId)) {
2027
+ if (hasRecordedTerminalRunEvent(eventLog.events, runId)) {
1954
2028
  return;
1955
2029
  }
1956
2030
  // Event-limit guard: fail a runaway run once its log
@@ -1958,11 +2032,9 @@ export function workflowEntrypoint(workflowCode, options) {
1958
2032
  // enforcement). The throw is caught below and written as
1959
2033
  // run_failed / MAX_EVENTS_EXCEEDED.
1960
2034
  if (maxEventsLimit !== undefined &&
1961
- events.length >= maxEventsLimit) {
1962
- throw new MaxEventsExceededError(events.length, maxEventsLimit);
2035
+ eventLog.events.length >= maxEventsLimit) {
2036
+ throw new MaxEventsExceededError(eventLog.events.length, maxEventsLimit);
1963
2037
  }
1964
- // Update cache reference (may have been set for first time)
1965
- cachedEvents = events;
1966
2038
  // Latency telemetry: judge TTFS eligibility against the
1967
2039
  // invocation's first snapshot. Waits completed above
1968
2040
  // would already disqualify via the event-type check, so
@@ -1971,23 +2043,13 @@ export function workflowEntrypoint(workflowCode, options) {
1971
2043
  // committed pre-step attr_set, and the detour it marks
1972
2044
  // is subtracted via preStepAttrStartMs regardless of
1973
2045
  // which invocation wrote it (see runtime/step-latency.ts).
1974
- invocationStartedClean ??= events.every((e) => e.eventType === 'run_created' ||
2046
+ invocationStartedClean ??= eventLog.events.every((e) => e.eventType === 'run_created' ||
1975
2047
  e.eventType === 'run_started' ||
1976
2048
  e.eventType === 'attr_set');
1977
- // Snapshot the cursor as it stands for this iteration's
1978
- // event log, before any inline writes (step_created via
1979
- // handleSuspension, step_started/step_completed via
1980
- // executeStep) advance it. This is the `sinceCursor`
1981
- // handed to a supporting World on the inline step's
1982
- // terminal write so it can return the event-log delta —
1983
- // letting the next iteration skip the incremental
1984
- // events.list. Captured here because nothing between this
1985
- // point and the inline executeStep mutates eventsCursor.
1986
- preInlineWriteCursor = eventsCursor;
1987
2049
  runtimeLogger.debug('Starting workflow execution', {
1988
2050
  workflowRunId: runId,
1989
2051
  loopIteration,
1990
- eventCount: events.length,
2052
+ eventCount: eventLog.events.length,
1991
2053
  executionMode: retainedSession ? 'retained' : 'replay',
1992
2054
  });
1993
2055
  replayStart = Date.now();
@@ -1996,16 +2058,16 @@ export function workflowEntrypoint(workflowCode, options) {
1996
2058
  // Crypto work overlaps VM setup on the replay path and
1997
2059
  // the appended events' consumption on the resume path;
1998
2060
  // consumers still deserialize and resolve in event order.
1999
- const payloadPrewarm = replayPayloadCache.prewarm(workflowRun, events);
2061
+ const payloadPrewarm = replayPayloadCache.prewarm(workflowRun, eventLog.events);
2000
2062
  let workflowResult = retainedSession
2001
- ? await resumeWorkflow(retainedSession, events)
2063
+ ? await resumeWorkflow(retainedSession, eventLog.events)
2002
2064
  : { type: 'replay' };
2003
2065
  if (workflowResult.type === 'replay') {
2004
2066
  retainedSession = null;
2005
2067
  workflowResult = await replayWorkflow({
2006
2068
  workflowCode,
2007
2069
  workflowRun,
2008
- events,
2070
+ events: eventLog.events,
2009
2071
  encryptionKey,
2010
2072
  replayPayloadCache,
2011
2073
  // Turbo: the end-of-run drain inside workflow
@@ -2048,7 +2110,7 @@ export function workflowEntrypoint(workflowCode, options) {
2048
2110
  eventData: { output: result },
2049
2111
  }, {
2050
2112
  requestId,
2051
- ...preconditionSnapshotParams(events, eventsCursor),
2113
+ ...preconditionSnapshotParams(eventLog.events, eventLog.cursor),
2052
2114
  });
2053
2115
  }
2054
2116
  catch (err) {
@@ -2116,19 +2178,7 @@ export function workflowEntrypoint(workflowCode, options) {
2116
2178
  // The rejection is handled here, by restarting the
2117
2179
  // replay — never by re-posting the same event.
2118
2180
  const suspensionStart = Date.now();
2119
- // The snapshot refresh above always sets cachedEvents
2120
- // before the replay can suspend. Re-narrow it for this
2121
- // catch scope instead of defaulting to an empty array:
2122
- // that fallback would silently disarm the precondition
2123
- // guard (no snapshot sent) and let a mid-suspension
2124
- // reload merge into a throwaway array.
2125
- if (!cachedEvents) {
2126
- throw new Error('Invariant violation: workflow suspended before its event log was loaded');
2127
- }
2128
- const suspensionLog = {
2129
- events: cachedEvents,
2130
- cursor: eventsCursor,
2131
- };
2181
+ assert(eventLog.type === 'ready', 'Workflow suspended before its event log was loaded');
2132
2182
  let suspensionResult;
2133
2183
  try {
2134
2184
  suspensionResult = await handleSuspension({
@@ -2137,7 +2187,7 @@ export function workflowEntrypoint(workflowCode, options) {
2137
2187
  run: workflowRun,
2138
2188
  span,
2139
2189
  requestId,
2140
- eventLog: suspensionLog,
2190
+ eventLog,
2141
2191
  runReadyBarrier,
2142
2192
  replayRecoveryReporter,
2143
2193
  });
@@ -2215,7 +2265,15 @@ export function workflowEntrypoint(workflowCode, options) {
2215
2265
  });
2216
2266
  return;
2217
2267
  }
2218
- eventsCursor = suspensionLog.cursor;
2268
+ if (suspensionResult.reportedEventCount > 0) {
2269
+ // Bump-and-report merged events BELOW the tail and
2270
+ // re-sorted the array to slot order, shifting every
2271
+ // position the prewarm scan had already recorded.
2272
+ // The cursor is deliberately left alone: the report
2273
+ // is a lower bound on what was skipped, so the next
2274
+ // incremental read still has to cover the same range.
2275
+ replayPayloadCache.resetScan();
2276
+ }
2219
2277
  // Open hooks/waits in the log as loaded for this
2220
2278
  // replay. This suspension's own hook/wait writes are
2221
2279
  // NOT in it — they never reach retention anyway,
@@ -2227,11 +2285,10 @@ export function workflowEntrypoint(workflowCode, options) {
2227
2285
  // below — the attr-detour and hook-conflict paths
2228
2286
  // return/continue before the gates and usually
2229
2287
  // short-circuit before ever scanning the log.
2230
- // Narrowed alias: the closure below would otherwise
2231
- // lose `cachedEvents`'s non-null narrowing. Nothing in
2232
- // this catch scope reassigns the array.
2233
- const suspensionEvents = cachedEvents;
2234
- const openHookWait = once(() => openHookAndWaitState(suspensionEvents));
2288
+ const openHookWait = once(() => {
2289
+ assert(eventLog.type === 'ready');
2290
+ return openHookAndWaitState(eventLog.events);
2291
+ });
2235
2292
  // The single retention decision: keep the parked
2236
2293
  // session only across a pure step boundary with no
2237
2294
  // out-of-band continuation source and provably
@@ -2273,6 +2330,7 @@ export function workflowEntrypoint(workflowCode, options) {
2273
2330
  // paying a delivery round-trip here would only add
2274
2331
  // latency before the workflow's next step.
2275
2332
  if (suspensionResult.hasAttributeEvents) {
2333
+ eventLog = nextEventLogLoad(eventLog);
2276
2334
  continue;
2277
2335
  }
2278
2336
  const pendingSteps = suspensionResult.pendingSteps;
@@ -2503,9 +2561,8 @@ export function workflowEntrypoint(workflowCode, options) {
2503
2561
  // and on the next iteration consume it in place of the
2504
2562
  // events.list — only when ALL hold:
2505
2563
  //
2506
- // - We have a real prior cursor to diff against
2507
- // (`preInlineWriteCursor`; a World may return none on
2508
- // the initial load).
2564
+ // - We have a real prior cursor to diff against (a
2565
+ // World may return none on the initial load).
2509
2566
  // - This is the clean single-step sequential case:
2510
2567
  // this suspension produced exactly one step and no
2511
2568
  // waits (`err.{step,wait}Count`), that one step is
@@ -2566,7 +2623,7 @@ export function workflowEntrypoint(workflowCode, options) {
2566
2623
  // which an unsupporting backend ignores (no fence).
2567
2624
  const guardEnforced = isPreconditionGuardEnabled() &&
2568
2625
  world.capabilities?.preconditionGuard === true;
2569
- const requestInlineDelta = typeof preInlineWriteCursor === 'string' &&
2626
+ const requestInlineDelta = typeof eventLog.cursor === 'string' &&
2570
2627
  err.stepCount === 1 &&
2571
2628
  err.waitCount === 0 &&
2572
2629
  pendingSteps.length === 1 &&
@@ -2620,7 +2677,7 @@ export function workflowEntrypoint(workflowCode, options) {
2620
2677
  // cumulative log, resume/parallel invocations are possible
2621
2678
  // for the rest of the run, so turbo must latch off
2622
2679
  // permanently — checked here via `openHookAndWaitState`
2623
- // over the cumulative `cachedEvents`.
2680
+ // over the cumulative event log.
2624
2681
  //
2625
2682
  // NOTE: `WORKFLOW_SEQUENTIAL_REPLAYS=1` (per-run flow
2626
2683
  // topics consumed with `maxConcurrency: 1`) would in
@@ -2656,7 +2713,7 @@ export function workflowEntrypoint(workflowCode, options) {
2656
2713
  // snapshot has a local-clock createdAt, so under
2657
2714
  // turbo only the run-id ULID timestamp is trusted.
2658
2715
  const latencyTracking = computeStepLatencyTracking({
2659
- events: cachedEvents,
2716
+ events: eventLog.events,
2660
2717
  invocationStartedClean: invocationStartedClean === true,
2661
2718
  runCreatedAtMs: runIdCreatedAt(runId) ??
2662
2719
  (turbo ? undefined : +workflowRun.createdAt),
@@ -2665,7 +2722,7 @@ export function workflowEntrypoint(workflowCode, options) {
2665
2722
  preStepBlockingMs,
2666
2723
  preStepBlockingBeforeAttrMs,
2667
2724
  // This suspension's own hook/wait writes are not in
2668
- // cachedEvents yet, so report them explicitly.
2725
+ // the loaded event log yet, so report them explicitly.
2669
2726
  suspensionHasWaits: err.waitCount > 0 ||
2670
2727
  suspensionResult.waitTimeout !== undefined,
2671
2728
  suspensionCreatedHooks: err.hookCount > 0 || suspensionResult.hasHookEvents,
@@ -2682,85 +2739,88 @@ export function workflowEntrypoint(workflowCode, options) {
2682
2739
  // when the guard env flag is off, so this is a no-op
2683
2740
  // outside guarded deployments; Worlds that don't
2684
2741
  // enforce the guard ignore it.
2685
- const inlineClaimSnapshot = preconditionSnapshotParams(cachedEvents, preInlineWriteCursor);
2742
+ const inlineClaimSnapshot = preconditionSnapshotParams(eventLog.events, eventLog.cursor);
2686
2743
  replayBudget.pause();
2687
2744
  let stepResults;
2688
2745
  const stepExecutionPromises = inlineExecutions.map((s, stepIndex) => {
2689
- const run = () => executeStep({
2690
- world,
2691
- workflowRunId: runId,
2692
- workflowDeploymentId: workflowRun.deploymentId,
2693
- workflowName,
2694
- workflowStartedAt,
2695
- rootRunId: rootRunIdFrom(workflowRun.attributes, runId),
2696
- stepId: s.correlationId,
2697
- stepName: s.stepName,
2698
- runSpecVersion: workflowRun.specVersion,
2699
- // Attempt number = prior step_started count + 1
2700
- // (this execution's start), counting only THIS
2701
- // message's own starts: the owned-recovery
2702
- // ceiling bounds how many times this owning
2703
- // message re-runs a step it crashed/timed out
2704
- // on, and each of those (re)starts stamps
2705
- // metadata.messageId. Starts written by racing
2706
- // invocations (stale/wake replays, a step
2707
- // message dispatched off a lost create-claim)
2708
- // carry other IDs or none — and must not
2709
- // count, or the ceiling falsely exhausts a
2710
- // healthy step (see countStepStartedEvents).
2711
- // A lazy step is brand-new by construction (it
2712
- // enters the batch only when it has no
2713
- // step_created yet), so it has zero prior
2714
- // starts and is always attempt 1 skip the
2715
- // log scan entirely. Only an owned-recovery
2716
- // re-run can have prior starts, and that path
2717
- // is uncommon, so reserve the O(n) scan for it
2718
- // rather than walking the growing log for
2719
- // every inline step (which would be O(n²)
2720
- // across a long sequential workflow).
2721
- authoritativeAttempt: s.lazyStepInput !== undefined
2722
- ? 1
2723
- : countStepStartedEvents(cachedEvents, s.correlationId, {
2724
- type: 'ownedBy',
2725
- messageId: metadata.messageId,
2726
- }) + 1,
2727
- // Lazy inline start: send the deferred step's
2728
- // input on step_started so the world creates
2729
- // the step on the fly. Absent for
2730
- // owned-recovery steps, whose input hydrates
2731
- // from the existing step entity.
2732
- lazyStepInput: s.lazyStepInput,
2733
- // Inline ownership: stamp (or re-stamp) this
2734
- // invocation's queue message ID on the
2735
- // step_started, so wake replays see the body
2736
- // as in flight here and suppress the
2737
- // immediate requeue (workflow#2780).
2738
- ownerMessageId: metadata.messageId,
2739
- // Turbo: force optimistic start and hold the
2740
- // lazy step_started until the backgrounded
2741
- // run_started lands (the body still runs
2742
- // immediately). Both are undefined/false
2743
- // outside turbo.
2744
- forceOptimisticStart,
2745
- // Guard-enforced batches with an open hook
2746
- // await the claim before running the body, so
2747
- // a 412-fenced step never executes user code —
2748
- // see suppressOptimisticStart above.
2749
- suppressOptimisticStart,
2750
- runReadyBarrier,
2751
- preconditionSnapshot: inlineClaimSnapshot,
2752
- ...(stepIndex === 0 &&
2753
- s.lazyStepInput !== undefined &&
2754
- latencyTracking
2755
- ? { latencyTracking }
2756
- : {}),
2757
- ...(requestInlineDelta && preInlineWriteCursor
2758
- ? {
2759
- inlineDeltaSinceCursor: preInlineWriteCursor,
2760
- }
2761
- : {}),
2762
- replayRecoveryReporter,
2763
- });
2746
+ const run = () => {
2747
+ assert(eventLog.type === 'ready');
2748
+ return executeStep({
2749
+ world,
2750
+ workflowRunId: runId,
2751
+ workflowDeploymentId: workflowRun.deploymentId,
2752
+ workflowName,
2753
+ workflowStartedAt,
2754
+ rootRunId: rootRunIdFrom(workflowRun.attributes, runId),
2755
+ stepId: s.correlationId,
2756
+ stepName: s.stepName,
2757
+ runSpecVersion: workflowRun.specVersion,
2758
+ // Attempt number = prior step_started count + 1
2759
+ // (this execution's start), counting only THIS
2760
+ // message's own starts: the owned-recovery
2761
+ // ceiling bounds how many times this owning
2762
+ // message re-runs a step it crashed/timed out
2763
+ // on, and each of those (re)starts stamps
2764
+ // metadata.messageId. Starts written by racing
2765
+ // invocations (stale/wake replays, a step
2766
+ // message dispatched off a lost create-claim)
2767
+ // carry other IDs — or none — and must not
2768
+ // count, or the ceiling falsely exhausts a
2769
+ // healthy step (see countStepStartedEvents).
2770
+ // A lazy step is brand-new by construction (it
2771
+ // enters the batch only when it has no
2772
+ // step_created yet), so it has zero prior
2773
+ // starts and is always attempt 1 skip the
2774
+ // log scan entirely. Only an owned-recovery
2775
+ // re-run can have prior starts, and that path
2776
+ // is uncommon, so reserve the O(n) scan for it
2777
+ // rather than walking the growing log for
2778
+ // every inline step (which would be O(n²)
2779
+ // across a long sequential workflow).
2780
+ authoritativeAttempt: s.lazyStepInput !== undefined
2781
+ ? 1
2782
+ : countStepStartedEvents(eventLog.events, s.correlationId, {
2783
+ type: 'ownedBy',
2784
+ messageId: metadata.messageId,
2785
+ }) + 1,
2786
+ // Lazy inline start: send the deferred step's
2787
+ // input on step_started so the world creates
2788
+ // the step on the fly. Absent for
2789
+ // owned-recovery steps, whose input hydrates
2790
+ // from the existing step entity.
2791
+ lazyStepInput: s.lazyStepInput,
2792
+ // Inline ownership: stamp (or re-stamp) this
2793
+ // invocation's queue message ID on the
2794
+ // step_started, so wake replays see the body
2795
+ // as in flight here and suppress the
2796
+ // immediate requeue (workflow#2780).
2797
+ ownerMessageId: metadata.messageId,
2798
+ // Turbo: force optimistic start and hold the
2799
+ // lazy step_started until the backgrounded
2800
+ // run_started lands (the body still runs
2801
+ // immediately). Both are undefined/false
2802
+ // outside turbo.
2803
+ forceOptimisticStart,
2804
+ // Guard-enforced batches with an open hook
2805
+ // await the claim before running the body, so
2806
+ // a 412-fenced step never executes user code —
2807
+ // see suppressOptimisticStart above.
2808
+ suppressOptimisticStart,
2809
+ runReadyBarrier,
2810
+ preconditionSnapshot: inlineClaimSnapshot,
2811
+ ...(stepIndex === 0 &&
2812
+ s.lazyStepInput !== undefined &&
2813
+ latencyTracking
2814
+ ? { latencyTracking }
2815
+ : {}),
2816
+ ...(requestInlineDelta && eventLog.cursor
2817
+ ? {
2818
+ inlineDeltaSinceCursor: eventLog.cursor,
2819
+ }
2820
+ : {}),
2821
+ replayRecoveryReporter,
2822
+ });
2823
+ };
2764
2824
  // Invariant bookkeeping: this invocation owns
2765
2825
  // these bodies until they settle — see
2766
2826
  // assertNoInFlightOwnedSteps.
@@ -2954,23 +3014,19 @@ export function workflowEntrypoint(workflowCode, options) {
2954
3014
  // (completed/failed/skipped/gone) — loop back to replay
2955
3015
  // (the workflow observes the terminal events on replay).
2956
3016
  //
2957
- // If the single inline step's terminal write returned an
2958
- // inline delta (supporting World + the single-step gate
2959
- // above), stash it so the next iteration's load consumes
2960
- // it instead of issuing an incremental events.list. Only
2961
- // the completed path carries a delta; multi-step batches
2962
- // never request one.
3017
+ // Reuse any inline delta. If it is partial, continue
3018
+ // from its cursor instead of reading the page again.
2963
3019
  if (inlineExecutions.length === 1) {
2964
3020
  const only = stepResults[0];
2965
- if (only.type === 'completed' &&
2966
- only.inlineDelta &&
2967
- !only.inlineDelta.hasMore) {
2968
- pendingInlineDelta = {
2969
- events: only.inlineDelta.events,
2970
- cursor: only.inlineDelta.cursor,
2971
- };
3021
+ if (only.type === 'completed' && only.inlineDelta) {
3022
+ appendEventLog(eventLog, only.inlineDelta);
3023
+ eventLog = only.inlineDelta.hasMore
3024
+ ? nextEventLogLoad(eventLog)
3025
+ : { ...eventLog, type: 'ready' };
3026
+ continue;
2972
3027
  }
2973
3028
  }
3029
+ eventLog = nextEventLogLoad(eventLog);
2974
3030
  }
2975
3031
  else {
2976
3032
  // Stale-snapshot rejection of a guarded write made
@@ -3201,4 +3257,4 @@ export function workflowEntrypoint(workflowCode, options) {
3201
3257
  });
3202
3258
  });
3203
3259
  }
3204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG1CQUFtQixHQUNwQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFFTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUVyQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUVqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixvQkFBb0IsR0FDckIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQWUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0Qs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QyxDQUFDO2dCQUNuRSxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUMxQyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsK0JBQStCLENBQUM7YUFDeEQ7U0FDRixFQUNELEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsYUFBYSxHQUFHLE1BQU0sS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFO29CQUM1RCxNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FDL0IsbUNBQW1DLEVBQ25DLEtBQUssSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FDL0IsQ0FBQztvQkFDRixPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUMsSUFBSSxRQUFRLFlBQVksUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksRUFBRSxhQUFhLENBQ2pCLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ2xELENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBDb3JydXB0ZWRFdmVudExvZ0Vycm9yLFxuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcixcbiAgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IsXG4gIFJlcGxheURpdmVyZ2VuY2VFcnJvcixcbiAgUlVOX0VSUk9SX0NPREVTLFxuICB0eXBlIFJ1bkVycm9yQ29kZSxcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBvbmNlLCBzZXRXb3JrZmxvd0Jhc2VQYXRoIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7XG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxuICB3b3JrZmxvd0Rpc3BsYXlOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICB0eXBlIEV2ZW50LFxuICBnZXRRdWV1ZVRvcGljUHJlZml4LFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYSxcbiAgdHlwZSBXb3JrZmxvd1J1bixcbiAgdHlwZSBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBtcyBmcm9tICdtcyc7XG5pbXBvcnQgeyBkZWNvZGVUaW1lIH0gZnJvbSAndWxpZCc7XG5pbXBvcnQge1xuICBjbGFzc2lmeVJ1bkVycm9yLFxuICBpc1JldHJ5YWJsZVdvcmxkRXJyb3IsXG4gIGlzV29ybGRDb250cmFjdEVycm9yLFxufSBmcm9tICcuL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGRlc2NyaWJlRXJyb3IgfSBmcm9tICcuL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IHR5cGUgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0sIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHsgQ09NUFVURV9JTlNUQU5DRV9JRCB9IGZyb20gJy4vcnVudGltZS9jb21wdXRlLWluc3RhbmNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1heEV2ZW50c092ZXJyaWRlLFxuICBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMsXG4gIGdldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzLFxuICBnZXRQcmVjb25kaXRpb25NYXhSZWludm9jYXRpb25zLFxuICBnZXRQcmVjb25kaXRpb25SZWludm9rZURlbGF5U2Vjb25kcyxcbiAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMsXG4gIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCxcbiAgaXNUdXJib0VuYWJsZWQsXG4gIGlzVm1SZXRlbnRpb25FbmFibGVkLFxufSBmcm9tICcuL3J1bnRpbWUvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMgfSBmcm9tICcuL3J1bnRpbWUvY291bnQtc3RlcC1zdGFydGVkLWV2ZW50cy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIERlcGxveW1lbnRBZmZpbml0eU91dGNvbWUsXG4gIGd1YXJkRGVwbG95bWVudEFmZmluaXR5LFxuICB0eXBlIFJlZW5xdWV1ZUFyZ3MsXG59IGZyb20gJy4vcnVudGltZS9kZXBsb3ltZW50LWd1YXJkLmpzJztcbmltcG9ydCB7XG4gIGFwcGVuZFVuaXF1ZUV2ZW50cyxcbiAgdHlwZSBFdmVudENyZWF0b3IsXG4gIGdldFF1ZXVlT3ZlcmhlYWQsXG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UsXG4gIGluc2VydEV2ZW50QnlFdmVudElkLFxuICBpc1ByZWNvbmRpdGlvbkd1YXJkRW5hYmxlZCxcbiAgdHlwZSBMb2FkZWRFdmVudExvZyxcbiAgbG9hZFdvcmtmbG93UnVuRXZlbnRzLFxuICBtZW1vaXplRW5jcnlwdGlvbktleSxcbiAgcGFyc2VIZWFsdGhDaGVja1BheWxvYWQsXG4gIHByZWNvbmRpdGlvbkV2ZW50RGVsdGEsXG4gIHByZWNvbmRpdGlvblNuYXBzaG90UGFyYW1zLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHdpdGhIZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkLFxuICBSZXBsYXlCdWRnZXQsXG59IGZyb20gJy4vcnVudGltZS9yZXBsYXktYnVkZ2V0LmpzJztcbmltcG9ydCB7IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgfSBmcm9tICcuL3J1bnRpbWUvcmVwbGF5LXJlY292ZXJ5LXJlcG9ydGVyLmpzJztcbmltcG9ydCB7IHJ1bklkQ3JlYXRlZEF0IH0gZnJvbSAnLi9ydW50aW1lL3J1bi1pZC10aW1lLmpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUyxcbiAgZXhlY3V0ZVN0ZXAsXG59IGZyb20gJy4vcnVudGltZS9zdGVwLWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nIH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtbGF0ZW5jeS5qcyc7XG5pbXBvcnQge1xuICBiYWNrc3RvcElkZW1wb3RlbmN5S2V5LFxuICBoYXNQZW5kaW5nU3RlcE93bmVkQnlNZXNzYWdlLFxuICBpc1N0ZXBPd25lcnNoaXBBY3RpdmUsXG4gIHN0ZXBMZWFzZVJlbWFpbmluZ1NlY29uZHMsXG59IGZyb20gJy4vcnVudGltZS9zdGVwLW93bmVyc2hpcC5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtc2luZ2xlLWZsaWdodC5qcyc7XG5pbXBvcnQgeyBoYW5kbGVTdXNwZW5zaW9uIH0gZnJvbSAnLi9ydW50aW1lL3N1c3BlbnNpb24taGFuZGxlci5qcyc7XG5pbXBvcnQgeyB1c2VRdWlja0pTVm0gfSBmcm9tICcuL3J1bnRpbWUvdm0tbW9kZS5qcyc7XG5pbXBvcnQgeyBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2ggfSBmcm9tICcuL3J1bnRpbWUvd2FpdC1jb250aW51YXRpb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0V29ybGQsXG4gIGdldFdvcmxkSGFuZGxlcnMsXG4gIHR5cGUgV29ybGRIYW5kbGVycyxcbn0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJztcbmltcG9ydCB7IGRlaHlkcmF0ZVJ1bkVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHJlbWFwRXJyb3JTdGFjayB9IGZyb20gJy4vc291cmNlLW1hcC5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzLFxuICBnZXROZXh0VHJhY2VDYXJyaWVyLFxuICBnZXRTcGFuS2luZCxcbiAgZ2V0V29ya2Zsb3dUcmFjZU1vZGUsXG4gIGlzVXNhYmxlVHJhY2VDYXJyaWVyLFxuICB0cmFjZSxcbiAgd2l0aFRyYWNlQ29udGV4dCxcbiAgd2l0aFdvcmtmbG93QmFnZ2FnZSxcbn0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JOYW1lLCBnZXRFcnJvclN0YWNrLCBub3JtYWxpemVVbmtub3duRXJyb3IgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZSB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQge1xuICByZXBsYXlXb3JrZmxvdyxcbiAgcmVzdW1lV29ya2Zsb3csXG4gIHR5cGUgV29ya2Zsb3dSZXN1bWVSZXN1bHQsXG4gIHR5cGUgV29ya2Zsb3dTZXNzaW9uLFxufSBmcm9tICcuL3dvcmtmbG93LmpzJztcblxuZXhwb3J0IHR5cGUgeyBFdmVudCwgV29ya2Zsb3dSdW4gfTtcbmV4cG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgSGVhbHRoQ2hlY2tPcHRpb25zLFxuICB0eXBlIEhlYWx0aENoZWNrUmVzdWx0LFxuICBoZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuZXhwb3J0IHtcbiAgZ2V0SG9va0J5VG9rZW4sXG4gIHR5cGUgUmVzdW1lZEhvb2ssXG4gIHJlc3VtZUhvb2ssXG4gIHJlc3VtZVdlYmhvb2ssXG59IGZyb20gJy4vcnVudGltZS9yZXN1bWUtaG9vay5qcyc7XG5leHBvcnQge1xuICBnZXRSdW4sXG4gIFJ1bixcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zLFxufSBmcm9tICcuL3J1bnRpbWUvcnVuLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgQ2FuY2VsUnVuT3B0aW9ucyxcbiAgY2FuY2VsUnVuLFxuICBjYW5jZWxSdW5zLFxuICBsaXN0U3RyZWFtcyxcbiAgdHlwZSBSZWFkU3RyZWFtT3B0aW9ucyxcbiAgdHlwZSBSZWNyZWF0ZVJ1bk9wdGlvbnMsXG4gIHR5cGUgUmVlbnF1ZXVlUnVuT3B0aW9ucyxcbiAgcmVhZFN0cmVhbSxcbiAgcmVjcmVhdGVSdW5Gcm9tRXhpc3RpbmcsXG4gIHJlZW5xdWV1ZVJ1bixcbiAgdHlwZSBTdG9wU2xlZXBPcHRpb25zLFxuICB0eXBlIFN0b3BTbGVlcFJlc3VsdCxcbiAgd2FrZVVwUnVuLFxufSBmcm9tICcuL3J1bnRpbWUvcnVucy5qcyc7XG5leHBvcnQge1xuICB0eXBlIFN0YXJ0T3B0aW9ucyxcbiAgdHlwZSBTdGFydE9wdGlvbnNCYXNlLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCxcbiAgc3RhcnQsXG59IGZyb20gJy4vcnVudGltZS9zdGFydC5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVXb3JsZCxcbiAgY3JlYXRlV29ybGRGcm9tTW9kdWxlLFxuICBnZXRXb3JsZCxcbiAgZ2V0V29ybGRIYW5kbGVycyxcbiAgc2V0V29ybGQsXG4gIHR5cGUgV29ybGRGYWN0b3J5TW9kdWxlLFxufSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuXG4vKipcbiAqIEFwcGx5IHRoZSBvcHRpb25hbCBjbGllbnQtc2lkZSBldmVudC1saW1pdCBvdmVycmlkZS5cbiAqIGBXT1JLRkxPV19NQVhfRVZFTlRTX09WRVJSSURFYCwgd2hlbiBzZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyLCBjbGFtcHMgdGhlXG4gKiBzZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIHRvIGEgc21hbGxlciB2YWx1ZSBzbyBlbmZvcmNlbWVudCBjYW5cbiAqIGJlIGV4ZXJjaXNlZCB3aXRob3V0IGEgc2VydmVyLXNpZGUgY2hhbmdlLiBDbGFtcC1kb3duIG9ubHk6IGl0IG5ldmVyIHJhaXNlc1xuICogdGhlIHNlcnZlcidzIGxpbWl0LCBhbmQgaXQgdGFrZXMgZWZmZWN0IGV2ZW4gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgbm9uZS5cbiAqIFVuc2V0IOKHkiBzZXJ2ZXIgdmFsdWUgcGFzc2VzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBjbGFtcE1heEV2ZW50cyhzZXJ2ZXJWYWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBnZXRNYXhFdmVudHNPdmVycmlkZSgpO1xuICBpZiAob3ZlcnJpZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHNlcnZlclZhbHVlO1xuICByZXR1cm4gc2VydmVyVmFsdWUgPT09IHVuZGVmaW5lZCA/IG92ZXJyaWRlIDogTWF0aC5taW4oc2VydmVyVmFsdWUsIG92ZXJyaWRlKTtcbn1cblxuLyoqXG4gKiBSZWZ1c2UgYSBxdWV1ZSBkZWxpdmVyeSB3aG9zZSBydW4gd2FzIGNyZWF0ZWQgaW4gYSBkaWZmZXJlbnQgZW52aXJvbm1lbnQgdGhhblxuICogdGhpcyBkZXBsb3ltZW50IHJ1bnMgaW4uXG4gKlxuICogYHN0YXJ0KClgIHBlcmZvcm1zIHR3byB3cml0ZXMgdGhhdCBtdXN0IGxhbmQgaW4gdGhlIHNhbWUgdGVuYW50OiB0aGVcbiAqIGBydW5fY3JlYXRlZGAgZXZlbnQsIGF0dHJpYnV0ZWQgdG8gd2hhdGV2ZXIgZW52aXJvbm1lbnQgdGhlICpjYWxsZXIqXG4gKiBhdXRoZW50aWNhdGVzIGFzLCBhbmQgdGhlIHF1ZXVlIG1lc3NhZ2UsIHBpbm5lZCB0byBhICpkZXBsb3ltZW50Ki4gQVxuICogbWlzY29uZmlndXJlZCBjYWxsZXIgY2FuIHNwbGl0IHRoZW0g4oCUIHdyaXRpbmcgdGhlIHJ1biB0byBvbmUgZW52aXJvbm1lbnRcbiAqIHdoaWxlIGFkZHJlc3NpbmcgdGhlIG1lc3NhZ2UgdG8gYSBkZXBsb3ltZW50IGluIGFub3RoZXIuIFRoZSBjb25zdW1lciB0aGVuXG4gKiBmaW5kcyBubyBydW4gdW5kZXIgaXRzIG93biB0ZW5hbnQgYW5kIHRoZSBiYWNrZW5kJ3MgcmVzaWxpZW50IHN0YXJ0XG4gKiAoYHJ1bl9zdGFydGVkYCBjcmVhdGVzIHRoZSBydW4gd2hlbiBgcnVuX2NyZWF0ZWRgIHdhcyBuZXZlciBzZWVuKSBtaW50cyBhXG4gKiBTRUNPTkQgY29weSBvZiB0aGUgc2FtZSBydW4gaWQgaW4gdGhpcyBlbnZpcm9ubWVudC4gQm90aCBjb3BpZXMgYXJlIHJlYWw6IHRoZVxuICogY3JlYXRvcidzIHNpdHMgcGVuZGluZyBmb3JldmVyLCB0aGlzIG9uZSBleGVjdXRlcywgYW5kIGV2ZXJ5IHN1YnNlcXVlbnRcbiAqIGNyb3NzLXRlbmFudCBxdWV1ZSBhY2sgZmFpbHMgdG8gZmluZCBpdHMgbWVzc2FnZS5cbiAqXG4gKiBOb3RoaW5nIGV4dGVybmFsIGlzIG5lZWRlZCB0byBjYXRjaCB0aGlzOiB0aGUgY3JlYXRvcidzIGVudmlyb25tZW50IHJpZGVzIHRoZVxuICogbWVzc2FnZSBpbiBgcnVuSW5wdXQuZW52aXJvbm1lbnRgIGFuZCB0aGlzIHByb2Nlc3MgYWxyZWFkeSBrbm93cyBpdHMgb3duLiBTb1xuICogY29tcGFyZSB0aGVtIGFuZCBzdG9wIEJFRk9SRSBgcnVuX3N0YXJ0ZWRgIOKAlCB0aGUgd3JpdGUgdGhhdCB3b3VsZCBjcmVhdGUgdGhlXG4gKiBmb3JrLiBSZWZ1c2luZyBhZnRlciBpdCB3b3VsZCBiZSB0b28gbGF0ZS5cbiAqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBjYWxsZXIgbXVzdCBhYmFuZG9uIHRoZSBkZWxpdmVyeS4gU2tpcHBlZCB3aGVuZXZlclxuICogZWl0aGVyIHNpZGUgaXMgdW5rbm93biwgd2hpY2gga2VlcHMgZXZlcnkgZXhpc3Rpbmcgc2V0dXAgb24gaXRzIGN1cnJlbnRcbiAqIGJlaGF2aW9yOiB3b3JsZHMgd2l0aCBubyBlbnZpcm9ubWVudCBkaW1lbnNpb24gKGB3b3JsZC1sb2NhbGAsXG4gKiBgd29ybGQtcG9zdGdyZXNgKSBkb24ndCBpbXBsZW1lbnQgYGdldEVudmlyb25tZW50YCwgYW5kIHJ1bnMgc3RhcnRlZCBieSBhblxuICogb2xkZXIgU0RLIGNhcnJ5IG5vIGBlbnZpcm9ubWVudGAgZmllbGQuXG4gKi9cbmZ1bmN0aW9uIHJlZnVzZUNyb3NzRW52aXJvbm1lbnREZWxpdmVyeSh7XG4gIHdvcmxkLFxuICBydW5JbnB1dCxcbiAgcnVuSWQsXG4gIHJ1bkxvZ2dlcixcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICBydW5JbnB1dDogUnVuSW5wdXQgfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJ1bkxvZ2dlcjogTG9nZ2VyO1xufSk6IGJvb2xlYW4ge1xuICBjb25zdCBjcmVhdG9yRW52aXJvbm1lbnQgPSBydW5JbnB1dD8uZW52aXJvbm1lbnQ7XG4gIGlmICghY3JlYXRvckVudmlyb25tZW50KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgY3VycmVudEVudmlyb25tZW50ID0gd29ybGQuZ2V0RW52aXJvbm1lbnQ/LigpO1xuICBpZiAoIWN1cnJlbnRFbnZpcm9ubWVudCB8fCBjdXJyZW50RW52aXJvbm1lbnQgPT09IGNyZWF0b3JFbnZpcm9ubWVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJ1bkxvZ2dlci5lcnJvcihcbiAgICBgUmVmdXNpbmcgdG8gcnVuIHRoaXMgd29ya2Zsb3c6IGl0IHdhcyBjcmVhdGVkIGluIHRoZSBcIiR7Y3JlYXRvckVudmlyb25tZW50fVwiIGAgK1xuICAgICAgYGVudmlyb25tZW50IGJ1dCB0aGlzIGRlcGxveW1lbnQgcnVucyBpbiBcIiR7Y3VycmVudEVudmlyb25tZW50fVwiLiBgICtcbiAgICAgICdFeGVjdXRpbmcgaXQgaGVyZSB3b3VsZCBjcmVhdGUgYSBzZWNvbmQgY29weSBvZiB0aGUgc2FtZSBydW4gaWQgaW4gJyArXG4gICAgICAnYm90aCBlbnZpcm9ubWVudHMg4oCUIG9uZSBwZW5kaW5nIGZvcmV2ZXIsIG9uZSBydW5uaW5nIOKAlCBzbyB0aGUgcXVldWUgJyArXG4gICAgICAnbWVzc2FnZSBpcyBiZWluZyBkaXNjYXJkZWQgd2l0aG91dCBleGVjdXRpbmcgYW5kIHdpdGhvdXQgcmV0cnlpbmcuICcgK1xuICAgICAgJ1RoZSBjbGllbnQgdGhhdCBjYWxsZWQgc3RhcnQoKSB3cm90ZSB0aGUgcnVuIHRvIGl0cyBvd24gZW52aXJvbm1lbnQgJyArXG4gICAgICAnYnV0IGFkZHJlc3NlZCB0aGUgcXVldWUgbWVzc2FnZSB0byBhIGRlcGxveW1lbnQgaW4gYW5vdGhlciBvbmUuIENoZWNrICcgK1xuICAgICAgJ3RoYXQgdGhlIGVudmlyb25tZW50IHRoYXQgY2xpZW50IGF1dGhlbnRpY2F0ZXMgYXMgKFdPUktGTE9XX1ZFUkNFTF9FTlYgJyArXG4gICAgICBcImZvciBDTEkgYW5kIENJIGNsaWVudHMsIG9yIHRoZSBPSURDIHRva2VuJ3MgZW52aXJvbm1lbnQgaW5zaWRlIGEgXCIgK1xuICAgICAgJ2RlcGxveW1lbnQpIG1hdGNoZXMgdGhlIGVudmlyb25tZW50IG9mIHRoZSBkZXBsb3ltZW50IGl0IHRhcmdldHMuIFRoZSAnICtcbiAgICAgIGBydW4gaXQgY3JlYXRlZCBpcyBzdGlsbCBwZW5kaW5nIGluIFwiJHtjcmVhdG9yRW52aXJvbm1lbnR9XCIgYW5kIHdpbGwgYCArXG4gICAgICAnbm90IHJ1bi4nLFxuICAgIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgY3JlYXRvckVudmlyb25tZW50LFxuICAgICAgY3VycmVudEVudmlyb25tZW50LFxuICAgICAgcGlubmVkRGVwbG95bWVudElkOiBydW5JbnB1dD8uZGVwbG95bWVudElkLFxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogTG9nIHdoZW4gYSBgc3RhcnQoKWAtZW5xdWV1ZWQgbWVzc2FnZSBwaW5uZWQgdG8gb25lIGRlcGxveW1lbnQgaXMgZGVsaXZlcmVkXG4gKiB0byBhIGRpZmZlcmVudCBvbmUuXG4gKlxuICogQSBmaXJzdC1kZWxpdmVyeSBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0LmRlcGxveW1lbnRJZGAg4oCUIHRoZSBkZXBsb3ltZW50XG4gKiBgc3RhcnQoKWAgYWRkcmVzc2VkIGl0IHRvIOKAlCBzbyBjb21wYXJpbmcgdGhhdCBhZ2FpbnN0IHRoaXMgaGFuZGxlcidzIG93blxuICogZGVwbG95bWVudCBkZXRlY3RzIG1pcy1kZWxpdmVyeSBkaXJlY3RseS4gVGhpcyBpcyBhIERJQUdOT1NUSUMsIG5vdCBhIGdhdGU6XG4gKiBpdCB3YXJucyBhbmQgbGV0cyB0aGUgaW52b2NhdGlvbiBwcm9jZWVkLCBkZWxpYmVyYXRlbHkuXG4gKlxuICogV2h5IHRoaXMgb25lIG9ubHkgd2FybnMgd2hpbGUgaXRzIGVudmlyb25tZW50IHNpYmxpbmcgYWJvdmUgcmVmdXNlczogYVxuICogZGlmZmVyaW5nIGRlcGxveW1lbnQgaWQgaXMgbm90IGJ5IGl0c2VsZiBldmlkZW5jZSBvZiB0aGUgZm9yayB3ZSBjYXJlIGFib3V0LlxuICogVGhlIGVudmlyb25tZW50IHBhaXIgaXMgZXhhY3Qg4oCUIHR3byBuYW1lZCBlbnZpcm9ubWVudHMgdGhhdCBkaXNhZ3JlZSDigJQgYW5kIGl0XG4gKiBpcyB0aGUgZGltZW5zaW9uIHRoZSBydW4ncyB0ZW5hbnQgaXMga2V5ZWQgb24uIERlcGxveW1lbnQgaWRzIGRpc2FncmVlIGZvclxuICogYmVuaWduIHJlYXNvbnMgdG9vOiBgd29ybGQtbG9jYWxgIGRlcml2ZXMgaXRzIGlkIGZyb20gdGhlIGluc3RhbGxlZCBwYWNrYWdlXG4gKiB2ZXJzaW9uIChgZHBsX2xvY2FsQDx2ZXJzaW9uPmApLCBzbyB1cGdyYWRpbmcgdGhlIFNESyBtaWQtcnVuIGNoYW5nZXMgaXQgd2l0aFxuICogbm90aGluZyB3cm9uZy4gUmVmdXNpbmcgb24gdGhhdCBzaWduYWwgd291bGQgc3RyYW5kIGNvcnJlY3QgcnVucywgYW5kXG4gKiByZWZ1c2luZyBiZWZvcmUgYHJ1bl9zdGFydGVkYCBsZWF2ZXMgbm8gc2VydmVyLXNpZGUgcmVjb3JkIHRvIGV4cGxhaW4gd2h5LlxuICogQW55b25lIHRlbXB0ZWQgdG8gcHJvbW90ZSB0aGlzIHRvIGEgaGFyZCBmYWlsdXJlIGhhcyB0byBoYW5kbGUgdGhhdCBmaXJzdC5cbiAqXG4gKiBTa2lwcGVkIHVubGVzcyBCT1RIIGlkcyBhcmUga25vd24g4oCUIGBnZXREZXBsb3ltZW50SWQoKWAgdGhyb3dzIGluIHdvcmxkcyB0aGF0XG4gKiByZXF1aXJlIGEgZGVwbG95bWVudCBhbmQgaGF2ZSBub25lLCBhbmQgYSByZS1lbnF1ZXVlZCBtZXNzYWdlIGNhcnJpZXMgbm9cbiAqIGBydW5JbnB1dGAgYXQgYWxsLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YXJuT25EZXBsb3ltZW50UGlubmluZ01pc21hdGNoKHtcbiAgd29ybGQsXG4gIHJ1bklucHV0LFxuICBydW5JZCxcbiAgcnVuTG9nZ2VyLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bklucHV0OiBSdW5JbnB1dCB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcnVuTG9nZ2VyOiBMb2dnZXI7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBpbm5lZERlcGxveW1lbnRJZCA9IHJ1bklucHV0Py5kZXBsb3ltZW50SWQ7XG4gIGlmICghcGlubmVkRGVwbG95bWVudElkKSByZXR1cm47XG5cbiAgbGV0IGN1cnJlbnREZXBsb3ltZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFdvcmxkcyB0aGF0IHJlcXVpcmUgYSBkZXBsb3ltZW50IGlkIHRocm93IHdoZW4gdGhlcmUgaXNuJ3Qgb25lLiBUaGF0IGlzXG4gICAgLy8gbm90IGEgbWlzbWF0Y2gg4oCUIHRoZXJlIGlzIHNpbXBseSBub3RoaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFjdXJyZW50RGVwbG95bWVudElkIHx8IGN1cnJlbnREZXBsb3ltZW50SWQgPT09IHBpbm5lZERlcGxveW1lbnRJZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAnUXVldWUgbWVzc2FnZSB3YXMgZGVsaXZlcmVkIHRvIGEgZGVwbG95bWVudCBpdCB3YXMgbm90IHBpbm5lZCB0by4gJyArXG4gICAgICAnVGhlIHJ1biB3YXMgY3JlYXRlZCB0YXJnZXRpbmcgYSBkaWZmZXJlbnQgZGVwbG95bWVudCwgc28gdGhpcyAnICtcbiAgICAgICdpbnZvY2F0aW9uIG1heSBiZSByZXBsYXlpbmcgYWdhaW5zdCBjb2RlIHRoZSBydW4gd2FzIG5vdCBzdGFydGVkIG9uLiAnICtcbiAgICAgICdDb250aW51aW5nIOKAlCB0aGlzIGlzIGV4cGVjdGVkIGlmIHRoZSBXb3JrZmxvdyBTREsgdmVyc2lvbiBjaGFuZ2VkICcgK1xuICAgICAgJ21pZC1ydW4gaW4gbG9jYWwgZGV2ZWxvcG1lbnQsIHdoZXJlIHRoZSBkZXBsb3ltZW50IGlkIGlzIGRlcml2ZWQgZnJvbSAnICtcbiAgICAgICd0aGF0IHZlcnNpb24uJyxcbiAgICB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIHBpbm5lZERlcGxveW1lbnRJZCxcbiAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQsXG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycjogdW5rbm93bik6IFJ1bkVycm9yQ29kZSB8IG51bGwge1xuICBpZiAoV29ya2Zsb3dSdW50aW1lRXJyb3IuaXMoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuUlVOVElNRV9FUlJPUjtcbiAgfVxuXG4gIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgd29ybGQsXG4gIHdvcmtmbG93UnVuLFxuICBydW5JZCxcbiAgcmVxdWVzdElkLFxuICBlcnIsXG4gIGVycm9yQ29kZSxcbiAgbG9nTWVzc2FnZSxcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlcnI6IHVua25vd247XG4gIGVycm9yQ29kZTogUnVuRXJyb3JDb2RlO1xuICBsb2dNZXNzYWdlOiBzdHJpbmc7XG59KSB7XG4gIHJ1bnRpbWVMb2dnZXIuZXJyb3IobG9nTWVzc2FnZSwge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGVycm9yQ29kZSxcbiAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW4gPz8gcnVuSWQpO1xuICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICBydW5JZCxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICApLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IHJlcXVlc3RJZCB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICBlcnJvcjogZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yID8gZmFpbEVyci5tZXNzYWdlIDogU3RyaW5nKGZhaWxFcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBmYWlsRXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHM6IEV2ZW50W10sIHJ1bklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gVGVybWluYWwgcnVuIGV2ZW50cyBhcmUgYWx3YXlzIGxhc3QgYnkgY29uc3RydWN0aW9uIChubyBldmVudCBjcmVhdGlvblxuICAvLyBzdWNjZWVkcyBhZ2FpbnN0IGEgdGVybWluYWwgcnVuKSwgYnV0IHNjYW4gdGhlIGZ1bGwgYXJyYXkgZm9yXG4gIC8vIGRlZmVuc2UtaW4tZGVwdGg6IGEgV29ybGQvYmFja2VuZCBvcmRlcmluZyBidWcgc2hvdWxkbid0IG1ha2UgdXMgbWlzcyBhblxuICAvLyBhY3R1YWwgdGVybWluYXRpb24gc2lnbmFsLlxuICBjb25zdCB0ZXJtaW5hbFJ1bkV2ZW50ID0gZXZlbnRzLmZpbmQoXG4gICAgKGUpID0+XG4gICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgKGUuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICApO1xuXG4gIGlmICghdGVybWluYWxSdW5FdmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1J1biByZWFjaGVkIHRlcm1pbmFsIGV2ZW50LCBleGl0aW5nJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGV2ZW50VHlwZTogdGVybWluYWxSdW5FdmVudC5ldmVudFR5cGUsXG4gICAgZXZlbnRJZDogdGVybWluYWxSdW5FdmVudC5ldmVudElkLFxuICB9KTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBIb3cgbWFueSBvZiBgaWRzYCBhcmUgYWJzZW50IGZyb20gYHByZXNlbnRgLiAqL1xuZnVuY3Rpb24gY291bnRNaXNzaW5nSWRzKGlkczogSXRlcmFibGU8c3RyaW5nPiwgcHJlc2VudDogU2V0PHN0cmluZz4pOiBudW1iZXIge1xuICBsZXQgbWlzc2luZyA9IDA7XG4gIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgaWYgKCFwcmVzZW50LmhhcyhpZCkpIG1pc3NpbmcrKztcbiAgfVxuICByZXR1cm4gbWlzc2luZztcbn1cblxuLyoqXG4gKiBUaGUgbGluZWFnZSByb290IG9mIGEgbG9hZGVkIHJ1bjogaXRzIGAkcm9vdFJ1bklkYCBhdHRyaWJ1dGUsIG9yIGl0cyBvd24gaWRcbiAqIHdoZW4gaXQgaXMgaXRzZWxmIGEgcm9vdC5cbiAqL1xuZnVuY3Rpb24gcm9vdFJ1bklkRnJvbShcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGF0dHJpYnV0ZXM/LltST09UX1JVTl9JRF9BVFRSSUJVVEVdID8/IHJ1bklkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJ1biBoYXMgYSBob29rIGFuZC9vciB3YWl0IHRoYXQgYW4gb3V0LW9mLWJhbmQgd3JpdGVyIGNvdWxkXG4gKiBhcHBlbmQgYW4gZXZlbnQgZm9yIGJldHdlZW4gYW4gaW5saW5lIHN0ZXAncyBgc3RlcF9jb21wbGV0ZWRgIHdyaXRlIGFuZFxuICogdGhlIG5leHQgcmVwbGF5IOKAlCBuYW1lbHkgYW4gb3BlbiBob29rIChhIGBob29rX2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGBob29rX2Rpc3Bvc2VkYCwgd2hpY2ggYSB3ZWJob29rIHJlY2VpdmVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGBob29rX3JlY2VpdmVkYCkgb3IgYW4gb3BlbiB3YWl0IChhIGB3YWl0X2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGB3YWl0X2NvbXBsZXRlZGAsIHdoaWNoIHRoZSB3YWl0IHRpbWVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGB3YWl0X2NvbXBsZXRlZGApLlxuICpcbiAqIFRoaXMgZ2F0ZXMgVk0gcmV0ZW50aW9uLCB0aGUgaW5saW5lLWRlbHRhIGZhc3QgcGF0aCwgYW5kIHR1cmJvJ3MgZm9yY2VkXG4gKiBvcHRpbWlzdGljIHN0YXJ0LiBBIHRlcm1pbmFsLXN0ZXAgZGVsdGEgY2FuIG9taXQgYW4gZXZlbnQgYXBwZW5kZWRcbiAqIGNvbmN1cnJlbnRseSBhZnRlciB0aGF0IHdyaXRlLiBXaXRoIG5vIG9wZW4gaG9vayBvciB3YWl0LCBvbmx5IGNhbmNlbGxhdGlvblxuICogY2FuIGRvIHNvLCBhbmQgb2JzZXJ2aW5nIGl0IG9uZSByZXBsYXkgbGF0ZSBpcyBzYWZlIGJlY2F1c2UgdGhlIG5leHQgZW50aXR5XG4gKiB3cml0ZSBpcyByZWplY3RlZC5cbiAqXG4gKiBTdGVwLWJvZHkgYGF0dHJfc2V0YCB3cml0ZXMgYXJlIE5PVCBhIGNvbmNlcm46IHRoZXkgbGFuZCBiZWZvcmUgdGhlXG4gKiBzdGVwJ3MgdGVybWluYWwgd3JpdGUgYW5kIGFyZSB0aGVyZWZvcmUgYWxyZWFkeSBpbnNpZGUgdGhlIHJldHVybmVkXG4gKiBkZWx0YS5cbiAqL1xuZnVuY3Rpb24gb3Blbkhvb2tBbmRXYWl0U3RhdGUoZXZlbnRzOiBFdmVudFtdKToge1xuICBvcGVuSG9vazogYm9vbGVhbjtcbiAgb3BlbldhaXQ6IGJvb2xlYW47XG59IHtcbiAgY29uc3QgZGlzcG9zZWRIb29rSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKSBkaXNwb3NlZEhvb2tJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgZWxzZSBpZiAoZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpIHtcbiAgICAgIGNvbXBsZXRlZFdhaXRJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgfVxuICB9XG4gIGxldCBvcGVuSG9vayA9IGZhbHNlO1xuICBsZXQgb3BlbldhaXQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIGUuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgIWRpc3Bvc2VkSG9va0lkcy5oYXMoZS5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgb3Blbkhvb2sgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhlLmNvcnJlbGF0aW9uSWQpXG4gICAgKSB7XG4gICAgICBvcGVuV2FpdCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChvcGVuSG9vayAmJiBvcGVuV2FpdCkgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHsgb3Blbkhvb2ssIG9wZW5XYWl0IH07XG59XG5cbi8qKlxuICogVGhlIHdob2xlIHJldGVudGlvbiBwcmVkaWNhdGU6IGtlZXAgdGhlIHNlc3Npb24gb25seSBmb3IgYSBwdXJlIHN0ZXBcbiAqIGJvdW5kYXJ5IChldmVyeSBzdXNwZW5zaW9uIGl0ZW0gaXMgYSBzdGVwIOKAlCBhbnkgb3RoZXIgaXRlbSB0eXBlLCBwcmVzZW50XG4gKiBvciBmdXR1cmUsIGlzIHVucmV0YWluYWJsZSBieSBkZWZhdWx0KSB3aG9zZSBuZXcgc3RlcCBpbnB1dHMgc2VyaWFsaXplZFxuICogd2l0aG91dCBleGVjdXRpbmcgd29ya2Zsb3cgY29kZSwgd2l0aCBubyBvdXQtb2YtYmFuZCBjb250aW51YXRpb24gc291cmNlOlxuICogYXR0cmlidXRlcyByZXF1aXJlIHJlcGxheTsgaG9va3MgYW5kIHdhaXRzIGNhbiB3YWtlIGFub3RoZXIgaW52b2NhdGlvbi5cbiAqIGBXT1JLRkxPV19SRVRBSU5FRF9WTT0wYCBkaXNhYmxlcyByZXRlbnRpb24gZW50aXJlbHkuXG4gKlxuICogVGhlIG9wZW4gaG9vay93YWl0IHNjYW4gaXMgTyhldmVudHMpLCBzbyBpdCBpcyB0YWtlbiB0aHJvdWdoIGEgbGF6eSBnZXR0ZXJcbiAqIGFuZCBjb25zdWx0ZWQgbGFzdCwgYWZ0ZXIgZXZlcnkgY2hlYXAgY2hlY2sgaGFzIHBhc3NlZC5cbiAqXG4gKiBJTlZBUklBTlQgdGhpcyBwcmVkaWNhdGUgbGVhbnMgb246IGV2ZXJ5IHN1c3BlbnNpb24gc2lnbmFsZXIgdGhhdCBkb2VzIE5PVFxuICogY2FycnkgdGhlIHN0ZXAtY29uc3VtZXIgZ2VuZXJhdGlvbiBndWFyZCAoc2xlZXAsIGhvb2ssIGF0dHJpYnV0ZSDigJQgc2VlXG4gKiBgc3VzcGVuc2lvbkdlbmVyYXRpb25gIGluIHByaXZhdGUudHMpIG11c3QgYmUgdW5yZXRhaW5hYmxlIGhlcmUsIGVpdGhlciB2aWFcbiAqIGEgbm9uLXN0ZXAgcXVldWUgaXRlbSBvciB0aGUgb3BlbiBob29rL3dhaXQgc2Nhbi4gQSBuZXcgc2lnbmFsZXIgdGhhdFxuICogc2F0aXNmaWVzIG5laXRoZXIgd291bGQgbGV0IGEgc3RhbGUgc2lnbmFsIGJlIGFjY2VwdGVkIGFzIGEgZnJlc2hcbiAqIHN1c3BlbnNpb24gb24gYSByZXN1bWVkIHNlc3Npb24uXG4gKlxuICogUXVpZXNjZW5jZSBhc3N1bWVzIHdvcmtmbG93IGNvZGUgc3RheXMgaW5zaWRlIHRoZSBzYW5kYm94J3MgZGV0ZXJtaW5pc21cbiAqIGNvbnRyYWN0LiBFc2NhcGluZyB0byB0aGUgaG9zdCByZWFsbSAoZS5nLiByZWNvdmVyaW5nIHRoZSBob3N0IGBGdW5jdGlvbmBcbiAqIGNvbnN0cnVjdG9yIGZyb20gYW4gZXhwb3NlZCBob3N0IGNsYXNzIHRvIHNjaGVkdWxlIHJlYWwgdGltZXJzKSBtYWtlcyBhXG4gKiB3b3JrZmxvdyBub25kZXRlcm1pbmlzdGljIHVuZGVyIG9yZGluYXJ5IHJlcGxheSB0b28sIGFuZCBpcyBub3QgZGVmZW5kZWRcbiAqIGhlcmUuXG4gKi9cbmZ1bmN0aW9uIGNhblJldGFpbldvcmtmbG93U2Vzc2lvbihcbiAgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uLFxuICBzdGVwSW5wdXRzU2FmZTogYm9vbGVhbixcbiAgb3Blbkhvb2tXYWl0OiB7IHZhbHVlOiBSZXR1cm5UeXBlPHR5cGVvZiBvcGVuSG9va0FuZFdhaXRTdGF0ZT4gfVxuKTogYm9vbGVhbiB7XG4gIGlmIChcbiAgICAhaXNWbVJldGVudGlvbkVuYWJsZWQoKSB8fFxuICAgICFzdGVwSW5wdXRzU2FmZSB8fFxuICAgIHN1c3BlbnNpb24uc3RlcHMubGVuZ3RoID09PSAwIHx8XG4gICAgIXN1c3BlbnNpb24uc3RlcHMuZXZlcnkoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gJ3N0ZXAnKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgeyBvcGVuSG9vaywgb3BlbldhaXQgfSA9IG9wZW5Ib29rV2FpdC52YWx1ZTtcbiAgcmV0dXJuICFvcGVuSG9vayAmJiAhb3BlbldhaXQ7XG59XG5cbi8qKlxuICogTWF4aW11bSBpbmxpbmUtZXhlY3V0aW9uIGR1cmF0aW9uIGZvciBhIHNpbmdsZSBoYW5kbGVyIGludm9jYXRpb24uXG4gKlxuICogT3JkZXIgb2YgcHJlY2VkZW5jZTpcbiAqIDEuIGBXT1JLRkxPV19WMl9USU1FT1VUX01TYCBlbnYgdmFyXG4gKiAyLiBUaWVyZWQgYnVkZ2V0IGRlcml2ZWQgZnJvbSBgd29ybGQuZ2V0UnVudGltZURlYWRsaW5lKClgXG4gKiAzLiBEZWZhdWx0IG9mIDIgbWludXRlc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhJbmxpbmVEdXJhdGlvbk1zKFxuICB3b3JsZDogV29ybGQsXG4gIGludm9jYXRpb25TdGFydFRpbWU6IG51bWJlclxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcmF3RW52T3ZlcnJpZGUgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19WMl9USU1FT1VUX01TO1xuICBpZiAocmF3RW52T3ZlcnJpZGUgIT09IHVuZGVmaW5lZCAmJiByYXdFbnZPdmVycmlkZSAhPT0gJycpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIocmF3RW52T3ZlcnJpZGUpO1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPiAwKSB7XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJ1bnRpbWVEZWFkbGluZSA9IGF3YWl0IHdvcmxkLmdldFJ1bnRpbWVEZWFkbGluZT8uKCk7XG4gIGlmIChydW50aW1lRGVhZGxpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRlYWRsaW5lTXMgPSBydW50aW1lRGVhZGxpbmUuZ2V0VGltZSgpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKGRlYWRsaW5lTXMpKSB7XG4gICAgICBjb25zdCBtYXhEdXJhdGlvbk1zID0gTWF0aC5mbG9vcihkZWFkbGluZU1zIC0gaW52b2NhdGlvblN0YXJ0VGltZSk7XG4gICAgICBpZiAobWF4RHVyYXRpb25NcyA+PSBtcygnMjVtJykpIHtcbiAgICAgICAgcmV0dXJuIG1zKCcxMG0nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1heER1cmF0aW9uTXMgPj0gbXMoJzEwbScpKSB7XG4gICAgICAgIHJldHVybiBtcygnNW0nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbXMoJzJtJyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpbmdsZSByb3V0ZSB3aGljaCBoYW5kbGVzIHdvcmtmbG93IGV4ZWN1dGlvbiByZXF1ZXN0cyxcbiAqIGV4ZWN1dGluZyBzdGVwcyBpbmxpbmUgd2hlbiBwb3NzaWJsZSB0byByZWR1Y2UgZnVuY3Rpb24gaW52b2NhdGlvbnNcbiAqIGFuZCBxdWV1ZSBvdmVyaGVhZC5cbiAqXG4gKiBUaGUgaGFuZGxlciBsb29wczogcmVwbGF5IHdvcmtmbG93IOKGkiBleGVjdXRlIHN0ZXAgaW5saW5lIOKGkiByZXBsYXkg4oaSIC4uLlxuICogdW50aWwgdGhlIHdvcmtmbG93IGNvbXBsZXRlcywgdGltZXMgb3V0LCBvciBlbmNvdW50ZXJzIG5vbi1zdGVwIHN1c3BlbnNpb25zLlxuICpcbiAqIEBwYXJhbSB3b3JrZmxvd0NvZGUgLSBUaGUgd29ya2Zsb3cgYnVuZGxlIGNvZGUgY29udGFpbmluZyBhbGwgd29ya2Zsb3cgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBWZXJjZWwgQVBJIHJvdXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0VudHJ5cG9pbnQoXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nLFxuICBvcHRpb25zPzoge1xuICAgIG5hbWVzcGFjZT86IHN0cmluZztcbiAgICByb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQ/OiBudW1iZXI7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIH1cbik6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgc2V0V29ya2Zsb3dCYXNlUGF0aChvcHRpb25zPy5iYXNlUGF0aCk7XG5cbiAgY29uc3QgbmFtZXNwYWNlID0gcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlKG9wdGlvbnM/Lm5hbWVzcGFjZSk7XG4gIGNvbnN0IHdvcmtmbG93UHJlZml4ID0gZ2V0UXVldWVUb3BpY1ByZWZpeCgnd29ya2Zsb3cnLCBuYW1lc3BhY2UpO1xuXG4gIGNvbnN0IGhhbmRsZXIgPSAod29ybGRIYW5kbGVyczogV29ybGRIYW5kbGVycykgPT5cbiAgICB3b3JsZEhhbmRsZXJzLmNyZWF0ZVF1ZXVlSGFuZGxlcihcbiAgICAgIHdvcmtmbG93UHJlZml4LFxuICAgICAgYXN5bmMgKG1lc3NhZ2VfLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgaGVhbHRoIGNoZWNrIG1lc3NhZ2VcbiAgICAgICAgLy8gTk9URTogSGVhbHRoIGNoZWNrIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IHVuYXV0aGVudGljYXRlZCBmb3IgbW9uaXRvcmluZyBwdXJwb3Nlcy5cbiAgICAgICAgLy8gVGhleSBvbmx5IHdyaXRlIGEgc2ltcGxlIHN0YXR1cyByZXNwb25zZSB0byBhIHN0cmVhbSBhbmQgZG8gbm90IGV4cG9zZSBzZW5zaXRpdmUgZGF0YS5cbiAgICAgICAgLy8gVGhlIHN0cmVhbSBuYW1lIGluY2x1ZGVzIGEgdW5pcXVlIGNvcnJlbGF0aW9uSWQgdGhhdCBtdXN0IGJlIGtub3duIGJ5IHRoZSBjYWxsZXIuXG4gICAgICAgIGNvbnN0IGhlYWx0aENoZWNrID0gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQobWVzc2FnZV8pO1xuICAgICAgICBpZiAoaGVhbHRoQ2hlY2spIHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UoXG4gICAgICAgICAgICBoZWFsdGhDaGVjayxcbiAgICAgICAgICAgIHdvcmxkSGFuZGxlcnMuc3BlY1ZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGluY29taW5nVHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZSxcbiAgICAgICAgICBwcmVjb25kaXRpb25SZWludm9jYXRpb25zLFxuICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQsXG4gICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgaG9va0lucHV0LFxuICAgICAgICB9ID0gV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLnBhcnNlKG1lc3NhZ2VfKTtcbiAgICAgICAgLy8gYHN0YXJ0KClgIGFsd2F5cyBhdHRhY2hlcyBhIHRyYWNlIGNhcnJpZXIsIGJ1dFxuICAgICAgICAvLyBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSByZXR1cm5zIGB7fWAgd2hlbiBubyBPVEVMIFNESyBpcyByZWdpc3RlcmVkXG4gICAgICAgIC8vIG9yIG5vIHNwYW4gaXMgYWN0aXZlIOKAlCB0cmVhdCBhbiBlbXB0eSBjYXJyaWVyIHRoZSBzYW1lIGFzIGFuXG4gICAgICAgIC8vIGFic2VudCBvbmUgc28gbGlua2VkIG1vZGUgZmFsbHMgYmFjayB0byBhIGZyZXNoIG9yaWdpbiBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIGZvcndhcmRpbmcgYSB1c2VsZXNzIGB7fWAgZm9yZXZlci5cbiAgICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdUcmFjZUNhcnJpZXIpXG4gICAgICAgICAgPyBpbmNvbWluZ1RyYWNlQ2FycmllclxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7IHJlcXVlc3RJZCB9ID0gbWV0YWRhdGE7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IG1ldGFkYXRhLnF1ZXVlTmFtZS5zbGljZSh3b3JrZmxvd1ByZWZpeC5sZW5ndGgpO1xuXG4gICAgICAgIC8vIC0tLSBNYXggZGVsaXZlcnkgY2hlY2sgLS0tXG4gICAgICAgIC8vIEVuZm9yY2UgbWF4IGRlbGl2ZXJ5IGxpbWl0IGJlZm9yZSBhbnkgaW5mcmFzdHJ1Y3R1cmUgY2FsbHMuXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgcnVuYXdheSB3b3JrZmxvd3MgZnJvbSBjb25zdW1pbmcgaW5maW5pdGUgcXVldWUgZGVsaXZlcmllcy5cbiAgICAgICAgLy8gU2NvcGVkIGxvZ2dlciBmb3IgdGhpcyBydW4g4oCUIGF0dGFjaGVzIHJ1bklkL3dvcmtmbG93TmFtZSB0byBldmVyeVxuICAgICAgICAvLyBsb2cgbGluZSBhbmQgY2hpbGQgbG9nZ2VycyBiZWxvdywgc28gY2FsbGVycyBkb24ndCByZXBlYXQgaXQuXG4gICAgICAgIGNvbnN0IHJ1bkxvZ2dlciA9IHJ1bnRpbWVMb2dnZXIuZm9yUnVuKHJ1bklkLCB3b3JrZmxvd05hbWUpO1xuXG4gICAgICAgIGNvbnN0IG1heFF1ZXVlRGVsaXZlcmllcyA9IGdldE1heFF1ZXVlRGVsaXZlcmllcygpO1xuICAgICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IG1heFF1ZXVlRGVsaXZlcmllcykge1xuICAgICAgICAgIGNvbnN0IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbiA9IGRlc2NyaWJlRXJyb3IoXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERURcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBXb3JrZmxvdyBoYW5kbGVyIGV4Y2VlZGVkIG1heCBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7bWF4UXVldWVEZWxpdmVyaWVzfSlgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICBlcnJvckNvZGU6IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5lcnJvckNvZGUsXG4gICAgICAgICAgICAgIGVycm9yQXR0cmlidXRpb246IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHJ1bklkKTtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgZXhjZWVkZWQgbWF4aW11bSBxdWV1ZSBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7bWF4UXVldWVEZWxpdmVyaWVzfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIFJ1biBhbHJlYWR5IGZpbmlzaGVkLCBjb25zdW1lIHRoZSBtZXNzYWdlIHNpbGVudGx5XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBtYXJrIHJ1biBhcyBmYWlsZWQgYWZ0ZXIgJHttZXRhZGF0YS5hdHRlbXB0fSBkZWxpdmVyeSBhdHRlbXB0cy4gYCArXG4gICAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBydW4gZnJvbSBiZWluZyB0ZXJtaW5hdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZSB1bnRpbCBtYW51YWxseSByZXNvbHZlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgICAgYG9yIGEgYnVnIGluIHRoZSB3b3JrZmxvdyBydW50aW1lIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIFdvcmtmbG93IHRlYW0uYCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBUcmFjZSBjb3JyZWxhdGlvbiBtb2RlIC0tLVxuICAgICAgICAvLyAnbGlua2VkJyAoZGVmYXVsdCk6IHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3cgc3RheXMgYSBDSElMRFxuICAgICAgICAvLyBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQsIHNvIG9uZSBpbnZvY2F0aW9uIOKAlFxuICAgICAgICAvLyByb3V0ZSBoYW5kbGVyLCB3b3JrZmxvdyByZXBsYXksIGlubGluZSBzdGVwcywgZXZlbnQgd3JpdGVzIOKAlCBpcyBhXG4gICAgICAgIC8vIHNpbmdsZSBib3VuZGVkIHRyYWNlLiBUaGUgcnVuLW9yaWdpbiBjb250ZXh0IHRyYXZlbHMgYXMgYSBzcGFuXG4gICAgICAgIC8vIExJTksgKG5vdCBhIHBhcmVudCksIGFuZCByZS1lbnF1ZXVlcyBmb3J3YXJkIHRoZSBvcmlnaW5hbCBjYXJyaWVyXG4gICAgICAgIC8vIHVuY2hhbmdlZCwgc28gYSAocG90ZW50aWFsbHkgaG91cnMtbG9uZykgcnVuIGlzIG5ldmVyIHN0aXRjaGVkXG4gICAgICAgIC8vIGludG8gb25lIGdpYW50IHRyYWNlIGFjcm9zcyBpbnZvY2F0aW9ucy5cbiAgICAgICAgLy8gJ2NvbnRpbnVvdXMnOiBsZWdhY3kgYmVoYXZpb3Ig4oCUIHRoZSByZXN0b3JlZCBydW4tb3JpZ2luIGNvbnRleHRcbiAgICAgICAgLy8gYmVjb21lcyB0aGUgcGFyZW50IG9mIHRoaXMgaW52b2NhdGlvbidzIHNwYW5zLlxuICAgICAgICBjb25zdCB0cmFjZU1vZGUgPSBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpO1xuXG4gICAgICAgIC8vIFRyYWNlIGNhcnJpZXIgdG8gYXR0YWNoIHRvIG1lc3NhZ2VzIHRoaXMgaW52b2NhdGlvbiBlbnF1ZXVlcyDigJRcbiAgICAgICAgLy8gc2VlIGdldE5leHRUcmFjZUNhcnJpZXIgZm9yIHRoZSBsaW5rZWQvY29udGludW91cyBzZW1hbnRpY3MuXG4gICAgICAgIGNvbnN0IG5leHRUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PlxuICAgICAgICAgIGdldE5leHRUcmFjZUNhcnJpZXIodHJhY2VNb2RlLCB0cmFjZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNwYW4gbGlua3MgdG8gdGhlIGluY29taW5nIGRlbGl2ZXJ5IGNvbnRleHQgYW5kIChpbiBsaW5rZWQgbW9kZSlcbiAgICAgICAgLy8gdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBmcm9tIHRoZSB0cmFjZSBjYXJyaWVyLlxuICAgICAgICBjb25zdCBzcGFuTGlua3MgPSBhd2FpdCBidWlsZEludm9jYXRpb25TcGFuTGlua3MoXG4gICAgICAgICAgdHJhY2VNb2RlLFxuICAgICAgICAgIHRyYWNlQ29udGV4dFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFRoZSByZXBsYXkgYnVkZ2V0IGNvdmVycyBvcmNoZXN0cmF0aW9uIHdvcmsgYmV0d2VlbiBzdGVwcywgbm90IGlubGluZVxuICAgICAgICAvLyBzdGVwIGJvZGllcy4gSXQgaXMgY2hlY2tlZCBiZXR3ZWVuIGxvb3AgaXRlcmF0aW9uczsgc3RlcCBib2RpZXMgdXNlXG4gICAgICAgIC8vIHRoZSBwbGF0Zm9ybSB0aW1lb3V0IGFuZCBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TIGd1YXJkIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IHJlcGxheUJ1ZGdldCA9IG5ldyBSZXBsYXlCdWRnZXQoKTtcblxuICAgICAgICAvLyBJbiBsaW5rZWQgbW9kZSB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGlzIE5PVCByZXN0b3JlZCBhcyB0aGVcbiAgICAgICAgLy8gYWN0aXZlIChwYXJlbnQpIGNvbnRleHQg4oCUIHBhc3NpbmcgYHVuZGVmaW5lZGAgbWFrZXNcbiAgICAgICAgLy8gd2l0aFRyYWNlQ29udGV4dCBhIHBhc3N0aHJvdWdoLCBzbyB0aGUgd29ya2Zsb3cuZXhlY3V0ZSBzcGFuIGJlbG93XG4gICAgICAgIC8vIHN0YXlzIGEgY2hpbGQgb2YgdGhlIGxvY2FsIGRlbGl2ZXJ5IChmbG93LXJvdXRlKSBjb250ZXh0IGFuZCB0aGVcbiAgICAgICAgLy8gcnVuLW9yaWdpbiB0cmF2ZWxzIGFzIGEgc3BhbiBsaW5rIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IHBhcmVudFRyYWNlQ2FycmllciA9XG4gICAgICAgICAgdHJhY2VNb2RlID09PSAnY29udGludW91cycgPyB0cmFjZUNvbnRleHQgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFF1ZXVlLWRlbGl2ZXJlZCBpbnZvY2F0aW9uOiBDT05TVU1FUiBraW5kLCBtYXRjaGluZyB0aGVcbiAgICAgICAgLy8gcXVldWUtZGVsaXZlcmVkIHN0ZXAuZXhlY3V0ZSBzcGFuLlxuICAgICAgICBjb25zdCBzcGFuS2luZCA9IGF3YWl0IGdldFNwYW5LaW5kKCdDT05TVU1FUicpO1xuICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFRyYWNlQ29udGV4dChwYXJlbnRUcmFjZUNhcnJpZXIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFdvcmtmbG93QmFnZ2FnZShcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIHdvcmtmbG93TmFtZSB9LFxuICAgICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRyYWNlKCd3b3JrZmxvdy5yb3V0ZS5nZXRfd29ybGQnLCBhc3luYyAoKSA9PlxuICAgICAgICAgICAgICAgIGdldFdvcmxkKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gQm90aCBjaGVja3MgYmVsb3cgbG9vayBhdCBgcnVuSW5wdXRgLCBzbyBib3RoIGFyZSBuby1vcHMgb24gYVxuICAgICAgICAgICAgICAvLyByZS1lbnF1ZXVlZCBtZXNzYWdlICh3aGljaCBjYXJyaWVzIG5vbmUpIOKAlCB0aGV5IG9ubHkgZXZlciBydW4gb25cbiAgICAgICAgICAgICAgLy8gYSBmaXJzdCBkZWxpdmVyeSwgdGhlIG9uZSB0aGF0IGNvdWxkIGNyZWF0ZSB0aGUgcnVuLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBSZXR1cm5pbmcgYWNrcyB0aGUgbWVzc2FnZS4gVGhhdCBpcyBkZWxpYmVyYXRlOiB0aGUgbWlzbWF0Y2ggaXNcbiAgICAgICAgICAgICAgLy8gYmFrZWQgaW50byB0aGlzIG1lc3NhZ2UsIHNvIGV2ZXJ5IHJlZGVsaXZlcnkgd291bGQgcmVhY2ggdGhlXG4gICAgICAgICAgICAgIC8vIHNhbWUgdmVyZGljdCwgYW5kIHRocm93aW5nIHdvdWxkIGp1c3QgaG90LWxvb3AgdGhlIGhhbmRsZXIgdW50aWxcbiAgICAgICAgICAgICAgLy8gTUFYX1FVRVVFX0RFTElWRVJJRVMgd2l0aCB0aGUgc2FtZSBlcnJvciBlYWNoIHRpbWUuIEl0IG1hdGNoZXNcbiAgICAgICAgICAgICAgLy8gaG93IHRoZSBydW5fc3RhcnRlZCBwYXRoIGFscmVhZHkgZGlzY2FyZHMgZGVsaXZlcmllcyB3aG9zZVxuICAgICAgICAgICAgICAvLyB2ZXJkaWN0IGNhbm5vdCBjaGFuZ2UgKEVudGl0eUNvbmZsaWN0RXJyb3IsIFJ1bkV4cGlyZWRFcnJvcikuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICByZWZ1c2VDcm9zc0Vudmlyb25tZW50RGVsaXZlcnkoe1xuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljIG9ubHkg4oCUIHNlZSB0aGUgaGVscGVyIGZvciB3aHkgdGhpcyB3YXJucyBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgIC8vIHJlZnVzaW5nIHRoZSBpbnZvY2F0aW9uLlxuICAgICAgICAgICAgICBhd2FpdCB3YXJuT25EZXBsb3ltZW50UGlubmluZ01pc21hdGNoKHtcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBydW5Mb2dnZXIsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgICAgICAgYHdvcmtmbG93LmV4ZWN1dGUgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YCxcbiAgICAgICAgICAgICAgICB7IGtpbmQ6IHNwYW5LaW5kLCBsaW5rczogc3BhbkxpbmtzIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignZXhlY3V0ZV92MicpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShtZXRhZGF0YS5xdWV1ZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1ldGFkYXRhLm1lc3NhZ2VJZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwcm9jZXNzJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLmdldFF1ZXVlT3ZlcmhlYWQoeyByZXF1ZXN0ZWRBdCB9KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnZvY2F0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vSW5saW5lUmVwbGF5QWZ0ZXJNcyA9IGF3YWl0IGdldE1heElubGluZUR1cmF0aW9uTXMoXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgbGV0IGxvb3BJdGVyYXRpb24gPSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlciA9IHJlcGxheURpdmVyZ2VuY2VcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgUmVwbGF5UmVjb3ZlcnlSZXBvcnRlcihyZXBsYXlEaXZlcmdlbmNlLmNvdW50KVxuICAgICAgICAgICAgICAgICAgICA6IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZUV2ZW50OiBFdmVudENyZWF0b3IgPSAoZGF0YSwgcGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLndpdGhFdmVudENyZWF0ZShwYXJhbXMsIChwKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIGRhdGEsIHApXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IGNhY2hlOiBrZWVwIGxvYWRlZCBldmVudHMgaW4gbWVtb3J5IGFjcm9zcyBsb29wIGl0ZXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAvLyBPbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHdlIGRvIGEgZnVsbCBsb2FkOyBvbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC8vIHdlIGZldGNoIG9ubHkgZXZlbnRzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGxhc3Qga25vd24gY3Vyc29yLlxuICAgICAgICAgICAgICAgICAgbGV0IGNhY2hlZEV2ZW50czogRXZlbnRbXSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50c0N1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIElubGluZS1kZWx0YSBvcHRpbWl6YXRpb246IHdoZW4gYW4gaW5saW5lIHN0ZXAncyB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgcmV0dXJucyB0aGUgZXZlbnQtbG9nIGRlbHRhIHNpbmNlIHRoZSBwcmUtd3JpdGVcbiAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciAoYSBzdXBwb3J0aW5nIFdvcmxkIG9ubHkpLCB3ZSBzdGFzaCBpdCBoZXJlIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmV4dCBsb29wIGl0ZXJhdGlvbiBjb25zdW1lcyBpdCBpbiBwbGFjZSBvZiB0aGUgaW5jcmVtZW50YWxcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0IHJvdW5kLXRyaXAuIEVhY2ggdmFsdWUgaXMgY29uc3VtZWQgZXhhY3RseSBvbmNlXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBjbGVhcmVkLiBOdWxsIG1lYW5zIFwibm8gZGVsdGEgcGVuZGluZyDigJQgZmV0Y2hcbiAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5XCIuIFNlZSB0aGUgY29uc3VtZSBzaXRlIGF0IHRoZSB0b3Agb2YgdGhlIGxvb3AgYW5kXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZHVjZSBzaXRlczogYWZ0ZXIgaW5saW5lIGV4ZWN1dGVTdGVwLCBhbmQgaW5cbiAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnRSZXBsYXlJblByb2Nlc3Mgd2hlbiBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvblxuICAgICAgICAgICAgICAgICAgLy8gY2FycmllZCB0aGUgbWlzc2luZyBldmVudHMgd2l0aCBpdC5cbiAgICAgICAgICAgICAgICAgIGxldCBwZW5kaW5nSW5saW5lRGVsdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBFdmVudFtdO1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgICAgICAgICAgICAgICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFNoYXJlZCBzdGF0ZTogc2V0IGJ5IGVpdGhlciB0aGUgYmFja2dyb3VuZCBzdGVwIHBhdGhcbiAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBydW5fc3RhcnRlZCBzZXR1cCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIGZyb20gdGhlIHJ1bl9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAvLyByZXNwb25zZS4gVW5kZWZpbmVkIOKHkiBubyBlbmZvcmNlbWVudCAob2xkZXIgc2VydmVycywgdHVyYm8pLlxuICAgICAgICAgICAgICAgICAgbGV0IG1heEV2ZW50c0xpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dTdGFydGVkQXQgPSAtMTtcbiAgICAgICAgICAgICAgICAgIGxldCBwcmVsb2FkZWRFdmVudHM6IEV2ZW50W10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBsZXQgcHJlbG9hZGVkRXZlbnRzQ3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gVHJ1ZSBvbmx5IHdoZW4gYHByZWxvYWRlZEV2ZW50c2AgaXMga25vd24gdG8gYmUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBDT01QTEVURSBldmVudCBsb2cgKHRoZSBsYXp5IGhvb2sgZmFzdCBwYXRoJ3MgdmFsaWRhdGVkXG4gICAgICAgICAgICAgICAgICAvLyBoYXNNb3JlLWZhbHNlIHByZWxvYWQpLiBMZXRzIFF1aWNrSlMgdHJ1c3QgaXQgYXMtaXMg4oCUXG4gICAgICAgICAgICAgICAgICAvLyBpdHMgb3duIGhldXJpc3RpYyBvbmx5IHJlY29nbml6ZXMgZmlyc3QtaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgLy8gKHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkLW9ubHkpIHByZWxvYWRzLlxuICAgICAgICAgICAgICAgICAgbGV0IHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5IChUVEZTKSBzdGF0ZSDigJQgc2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzLlxuICAgICAgICAgICAgICAgICAgLy8gV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBGSVJTVCBldmVudCBzbmFwc2hvdCBjb250YWluZWRcbiAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgYmV5b25kIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkOiBhbnl0aGluZyBlbHNlIHdhc1xuICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiBieSBhbiBlYXJsaWVyIGludm9jYXRpb24sIHdob3NlIGNvbnRyaWJ1dGlvbiB0b1xuICAgICAgICAgICAgICAgICAgLy8gdGltZS10by1maXJzdC1zdGVwIChpbmNsdWRpbmcgdGhlIHF1ZXVlIGhvcCBiYWNrIGhlcmUpXG4gICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgYmUgbWVhc3VyZWQgd2FsbC1jbG9jaywgc28gVFRGUyBpcyBub3QgcmVwb3J0ZWQuXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgb25jZSwgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbidzIGxvYWRlZCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgIGxldCBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZFxuICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIFNESyDigJQgYW5jaG9ycyBSU0ZTIChydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAvLyBzdGFydCBQT1NUKS4gU2V0IG9uY2UsIGluIHRoZSBydW5fc3RhcnRlZCBzZXR1cCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgIC8vIFVuZGVyIHR1cmJvLCBydW5fc3RhcnRlZCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZWQsIHNvIHRoaXMgaXMgc3RhbXBlZCBhdCB0aGUgcG9pbnQgdGhlIHJ1biBpc1xuICAgICAgICAgICAgICAgICAgLy8gc3ludGhlc2l6ZWQgbG9jYWxseSBpbnN0ZWFkIG9mIHRoZSByZWFsIHJlc3BvbnNlIOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucnNmc0FuY2hvck1zLlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIFdhbGwtY2xvY2sgbXMgc3BlbnQgY29tbWl0dGluZyBob29rX2NyZWF0ZWQgZXZlbnRzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHN0ZXAgcmFuLCBhY2N1bXVsYXRlZCBhY3Jvc3Mgc3VzcGVuc2lvbiBwYXNzZXNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdWJ0cmFjdGVkIGZyb20gVFRGUy4gQWNjdW11bGF0b3JzIGhlcmUgc3Vydml2ZSBhblxuICAgICAgICAgICAgICAgICAgLy8gaW4tcHJvY2VzcyByZXBsYXkgcmVzdGFydCAoYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24sIG9yXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlLWV2ZW50IHJlc3RhcnQgYmVsb3cpLCBzbyBhIHJlc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBvdmVyLWNvdW50cyBieSB0aGUgYWJhbmRvbmVkIHBhc3MncyBob29rIHRpbWUg4oCUXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBzbGlnaHQgb3Zlci1jb3VudCBlaXRoZXIgcmVzdGFydCBoYXMgYWx3YXlzIGhhZC5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdNcyA9IDA7XG4gICAgICAgICAgICAgICAgICAvLyBTbmFwc2hvdCBvZiB0aGUgYWNjdW11bGF0b3IgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd3JvdGUgdGhlIHJ1bidzIGZpcnN0IGF0dHJfc2V0ICh3aG9zZSBob29rIHBoYXNlIHJhblxuICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gYSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAvLyBlbmRzIHRoZSBUVEZTIG1lYXN1cmVtZW50IGF0IHRoZSBhdHRyIHdyaXRlLCBvbmx5IGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIHRpbWUgZnJvbSBCRUZPUkUgdGhhdCBwb2ludCBtYXkgYmUgc3VidHJhY3RlZCDigJQgbGF0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWQgd2luZG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZhc3QtcGF0aHMgdGhlIHZlcnkgZmlyc3QgZGVsaXZlcnkgb2YgdGhlIHZlcnlcbiAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGludm9jYXRpb24sIHdoZXJlIGl0IGlzIHByb3ZhYmx5IHNhZmUgdG86IGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAsIHNraXAgdGhlIGluaXRpYWwgZXZlbnQtbG9nIGxvYWQgKG5vdGhpbmcgaGFzXG4gICAgICAgICAgICAgICAgICAvLyBiZWVuIHdyaXR0ZW4geWV0KSwgYW5kIGZvcmNlIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IChub1xuICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBwZWVyIGhhbmRsZXIgZXhpc3RzIHRvIHJhY2UgdGhlIGNyZWF0ZS1jbGFpbSkuXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuSW5wdXRgIGlzIG9ubHkgcHJlc2VudCBvbiB0aGUgc3RhcnQoKS1lbnF1ZXVlZCBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgLy8gYW5kIGBhdHRlbXB0ID09PSAxYCAoMS1iYXNlZCkgbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5OyBgaW5jb21pbmdTdGVwSWRgIHdvdWxkIG1hcmsgYSBiYWNrZ3JvdW5kLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gYW5kIGByZXBsYXlEaXZlcmdlbmNlYCBhIHJlY292ZXJ5IHJlcGxheSDigJQgYm90aFxuICAgICAgICAgICAgICAgICAgLy8gaW5lbGlnaWJsZS4gVGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzIGZvcmNlZFxuICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYyBzdGFydCBzYWZlIGVuZHMgb25jZSBhIGhvb2sgb3Igd2FpdCBpcyBjcmVhdGVkXG4gICAgICAgICAgICAgICAgICAvLyAodGhleSBpbnRyb2R1Y2UgcmVzdW1lIGludm9jYXRpb25zKSwgc28gdHVyYm8gZXhpdHMgYXQgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgKHNlZSBgZm9yY2VPcHRpbWlzdGljU3RhcnRgKS4gV29ya2Zsb3cgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgaW50cm9kdWNlIG5vIHN1Y2ggaW52b2NhdGlvbiBzb3VyY2Ug4oCUIHRoZXkgcmVzb2x2ZVxuICAgICAgICAgICAgICAgICAgLy8gdmlhIGFuIGluLXByb2Nlc3MgcmVwbGF5IGFuZCBkb24ndCBlbmQgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAvLyBOT1RFOiBgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMWAgaXMgYWxzbyBsb2FkLWJlYXJpbmcgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCBvd25lcnNoaXA6IG93bmVkLXJlY292ZXJ5IHN0ZXBzIChhIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHN0YW1wZWQgYnkgYSBQUkVWSU9VUyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2UpIGNhbiBvbmx5XG4gICAgICAgICAgICAgICAgICAvLyBleGlzdCBvbiBhdHRlbXB0IOKJpSAyLCBzbyB0dXJibyBhbmQgb3duZWQgcmVjb3ZlcnkgYXJlXG4gICAgICAgICAgICAgICAgICAvLyBtdXR1YWxseSBleGNsdXNpdmUuIFRoZSB0dXJibyBgcmVpbnZva2UoKWAgcGF0aHMgKGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0LCB0aHJvdHRsZSBiYWNrb2ZmKSBhY2sgdGhpcyBtZXNzYWdlIGFuZCBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgYSBORVcgbWVzc2FnZSBpZCDigJQgc2FmZSBvbmx5IGJlY2F1c2Ugbm9cbiAgICAgICAgICAgICAgICAgIC8vIG5vbi10ZXJtaW5hbCBzdGVwIGNhbiBiZSBpbmxpbmUtb3duZWQgYnkgdGhlIGFja2VkIGlkXG4gICAgICAgICAgICAgICAgICAvLyB3aGVuIHR1cmJvIGlzIG9uLiBJZiB0dXJibyBldmVyIGVuZ2FnZXMgb24gcmVkZWxpdmVyaWVzLFxuICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgcGF0aHMgbXVzdCBmaXJzdCBjaGVjayBmb3Igb3duZWQgcGVuZGluZyBzdGVwcyBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBgeyB0aW1lb3V0U2Vjb25kcyB9YCByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgY29uc3QgdHVyYm8gPVxuICAgICAgICAgICAgICAgICAgICBpc1R1cmJvRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bklucHV0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICFyZXBsYXlEaXZlcmdlbmNlO1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGUuV29ya2Zsb3dUdXJibyh0dXJibykpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIG9ubHk6IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkIChvciByZWplY3RzIGlmIGl0IGZhaWxlZCkuIFRocmVhZGVkXG4gICAgICAgICAgICAgICAgICAvLyBpbnRvIGhhbmRsZVN1c3BlbnNpb24gYW5kIGV4ZWN1dGVTdGVwIHNvIG5vIHN0ZXAvaG9vay93YWl0XG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZSByYWNlcyBhaGVhZCBvZiB0aGUgcnVuJ3MgY3JlYXRpb24uIFVuZGVmaW5lZCBvdXRzaWRlXG4gICAgICAgICAgICAgICAgICAvLyB0dXJibywgd2hlcmUgYHJ1bl9zdGFydGVkYCBpcyBhd2FpdGVkIHVwIGZyb250LlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blJlYWR5QmFycmllcjogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gT3JkZXIgYSB0ZXJtaW5hbCBydW4gd3JpdGUgKHJ1bl9jb21wbGV0ZWQgLyBydW5fZmFpbGVkKSBhZnRlclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBpbiB0dXJibyBtb2RlIOKAlCBhIG5vLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNhbiBvdGhlcndpc2UgcmVhY2ggcnVuX2NvbXBsZXRlZCBiZWZvcmUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gZXhpc3RzLiBCZXN0LWVmZm9ydDogYSBiYXJyaWVyIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBvcmRlcmluZyBvbmx5OyBpZiBydW5fc3RhcnRlZCB0cnVseSBmYWlsZWQgdGhlIHRlcm1pbmFsIHdyaXRlXG4gICAgICAgICAgICAgICAgICAvLyBzdXJmYWNlcyB0aGUgcmVhbCBlcnJvciAocnVuIG5vdCBmb3VuZCAvIGdvbmUpIGFuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVycy4gTm8tb3Agb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGF3YWl0UnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVuUmVhZHlCYXJyaWVyO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWw6IG9yZGVyaW5nIGJhcnJpZXIgb25seSDigJQgc2VlIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gUmUtaW52b2tlIHRoZSBvcmNoZXN0cmF0b3IuIE91dHNpZGUgdHVyYm8gdGhpcyByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAvLyBgeyB0aW1lb3V0U2Vjb25kcyB9YCwgd2hpY2ggbWFrZXMgdGhlIHF1ZXVlIHJlc2NoZWR1bGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBDVVJSRU5UIGRlbGl2ZXJ5J3MgbWVzc2FnZS4gSW4gdHVyYm8gdGhhdCBpcyBhIHRyYXA6IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0YCwgYW5kIG9uIGFzeW5jIHF1ZXVlc1xuICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gZ3JhcGhpbGUtd29ya2VyKSBhIHJlc2NoZWR1bGUgY29tZXMgYmFjayBhcyBkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCAxIOKAlCBzbyB0dXJibyByZS1lbmdhZ2VzLCBza2lwcyB0aGUgZXZlbnQtbG9nIGxvYWRcbiAgICAgICAgICAgICAgICAgIC8vIGFnYWluLCByZXBsYXlzIGFnYWluc3QgYW4gZW1wdHkgbG9nLCBuZXZlciBvYnNlcnZlcyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgZXZlbnQgdGhpcyBpbnZvY2F0aW9uIGp1c3Qgd3JvdGUsIGFuZCByZS1zdXNwZW5kc1xuICAgICAgICAgICAgICAgICAgLy8gZm9yZXZlciAodGhlIHJ1biB3ZWRnZXMpLiBVbmRlciB0dXJibyB3ZSBpbnN0ZWFkIGVucXVldWUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNvbnRpbnVhdGlvbiB0aGF0IGNhcnJpZXMgTk8gYHJ1bklucHV0YCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGRlbGl2ZXJ5IGlzIGEgbm9ybWFsIChub24tdHVyYm8pIGxvYWQtYW5kLXJlcGxheSB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgY29tbWl0dGVkIGV2ZW50cyBhbmQgbWFrZXMgcHJvZ3Jlc3M7IHdlIHRoZW5cbiAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBgdW5kZWZpbmVkYCBzbyB0aGUgcXVldWUgdHJlYXRzIHRoaXMgZGVsaXZlcnkgYXMgZG9uZVxuICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gYWxzbyByZXNjaGVkdWxpbmcgaXQuXG4gICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtb3duZXJzaGlwIGludmFyaWFudCBndWFyZDogY29ycmVsYXRpb24gSURzIG9mXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwcyB3aG9zZSBib2RpZXMgdGhpcyBpbnZvY2F0aW9uIGlzIGV4ZWN1dGluZyB1bmRlciBhblxuICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIHN0YW1wIChsYXp5IGlubGluZSArIG93bmVkIHJlY292ZXJ5KSwgd2hpbGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBib2R5IGlzIGluIGZsaWdodC4gQ3Jhc2ggcmVjb3ZlcnkgZGVwZW5kcyBvbiB0aGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIE5PVCBiZWluZyBhY2tlZCB3aGlsZSBzdWNoIGEgc3RlcCBpcyBub24tdGVybWluYWxcbiAgICAgICAgICAgICAgICAgIC8vIChhY2sgPSBoYW5kbGVyIHJldHVybiBvciByZWludm9rZSwgd2hpY2ggYWNrcyArIGVucXVldWVzXG4gICAgICAgICAgICAgICAgICAvLyB1bmRlciBhIE5FVyBtZXNzYWdlIGlkIOKAlCB0aGUgcmVkZWxpdmVyeSBvZiB0aGUgb2xkIGlkIGlzXG4gICAgICAgICAgICAgICAgICAvLyB3aGF0IHJlLWV4ZWN1dGVzIGFuIG9ycGhhbmVkIG93bmVkIHN0ZXApLiBBbGwgZXhlY3V0ZVN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIGFyZSBhd2FpdGVkIGJlZm9yZSBhbnkgYWNrIHBhdGggcnVucywgc28gdGhpcyBzZXRcbiAgICAgICAgICAgICAgICAgIC8vIGlzIGVtcHR5IGF0IGV2ZXJ5IGFjayBieSBjb25zdHJ1Y3Rpb247IHRoZSBjaGVjayBleGlzdHNcbiAgICAgICAgICAgICAgICAgIC8vIHRvIGNhdGNoIGZ1dHVyZSByZWZhY3RvcnMgdGhhdCBicmVhayB0aGF0IG9yZGVyaW5nLlxuICAgICAgICAgICAgICAgICAgY29uc3QgaW5GbGlnaHRPd25lZFN0ZXBzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcyA9IChcbiAgICAgICAgICAgICAgICAgICAgYWNrUGF0aDogc3RyaW5nXG4gICAgICAgICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluRmxpZ2h0T3duZWRTdGVwcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnSW52YXJpYW50IHZpb2xhdGlvbjogYWNraW5nIHRoZSB3b3JrZmxvdyBtZXNzYWdlIHdoaWxlIG93bmVkIGlubGluZSBzdGVwcyBhcmUgc3RpbGwgZXhlY3V0aW5nIOKAlCBjcmFzaCByZWNvdmVyeSBmb3IgdGhlc2Ugc3RlcHMgaXMgYnJva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFja1BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZHM6IFsuLi5pbkZsaWdodE93bmVkU3RlcHNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIEEgcGxhaW4gb3JjaGVzdHJhdG9yLXJlcGxheSBtZXNzYWdlLiBPbWl0cyBgcnVuSW5wdXRgIChpdFxuICAgICAgICAgICAgICAgICAgLy8gcmUtZW5nYWdlcyB0dXJibyBvbiB0aGUgbmV4dCBkZWxpdmVyeSBhbmQgd2VkZ2VzIHRoZSBydW4g4oCUXG4gICAgICAgICAgICAgICAgICAvLyBzZWUgYHJlaW52b2tlYCBiZWxvdykgYW5kIGByZXBsYXlEaXZlcmdlbmNlYCAvXG4gICAgICAgICAgICAgICAgICAvLyBgc2VydmVyRXJyb3JSZXRyeUNvdW50YCAodGhpcyBkZWxpdmVyeSBjaGFpbidzIGJ1ZGdldHMpLlxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5TWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jICgpOiBQcm9taXNlPFdvcmtmbG93SW52b2tlUGF5bG9hZD4gPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlaW52b2tlID0gYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIEV4dHJhIGZpZWxkcyB0byBjYXJyeSBvbiB0aGUgbmV3IG1lc3NhZ2UuIE9ubHkgcmVhY2hlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogbmV4dCBpbnZvY2F0aW9uIG9uIHRoZSB0dXJibyBwYXRoOiB3aXRob3V0IHR1cmJvIG5vXG4gICAgICAgICAgICAgICAgICAgICAqIG1lc3NhZ2UgaXMgZW5xdWV1ZWQgYXQgYWxsIOKAlCB0aGUgaGFuZGxlciByZXR1cm5zIGFcbiAgICAgICAgICAgICAgICAgICAgICogdmlzaWJpbGl0eSB0aW1lb3V0IGFuZCB0aGUgcXVldWUgcmVkZWxpdmVycyB0aGUgQ1VSUkVOVFxuICAgICAgICAgICAgICAgICAgICAgKiBtZXNzYWdlLCB3aG9zZSBib2R5IChhbmQgdGhlcmVmb3JlIGFueSBjb3VudGVyIG9uIGl0KVxuICAgICAgICAgICAgICAgICAgICAgKiBjYW5ub3QgYmUgY2hhbmdlZC5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhUGF5bG9hZD86IFBhcnRpYWw8V29ya2Zsb3dJbnZva2VQYXlsb2FkPlxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTx7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcygncmVpbnZva2UnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0dXJibykgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IGRlbGF5U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgIHsgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksIC4uLmV4dHJhUGF5bG9hZCB9LFxuICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBQcmVjb25kaXRpb24gKDQxMikgcmVjb3Zlcnk6IGhvdyBtYW55IHRpbWVzIHRoaXMgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgLy8gaGFzIHRocm93biBhd2F5IGl0cyByZXBsYXkgYW5kIHN0YXJ0ZWQgb3ZlciBpbi1wcm9jZXNzLlxuICAgICAgICAgICAgICAgICAgbGV0IHByZWNvbmRpdGlvblJlc3RhcnRzID0gMDtcbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogRXZlbnQgaWRzIHRoZSBkaXNjYXJkZWQgcmVwbGF5IGhlbGQsIGtlcHQgdW50aWwgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAqIGxvYWQgcmVzb2x2ZXMgc28gYSByZXN0YXJ0IGNhbiByZXBvcnQgd2hhdCBpdHMgcmVsb2FkXG4gICAgICAgICAgICAgICAgICAgKiBhY3R1YWxseSBmb3VuZC4gV2l0aG91dCB0aGlzIGEgNDEyIG9ubHkgZXZlciB0ZWxscyB5b3UgdGhhdFxuICAgICAgICAgICAgICAgICAgICogYSByZXN0YXJ0IGhhcHBlbmVkLCB3aGljaCBjb25mbGF0ZXMgdHdvIHZlcnkgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgICAgKiBzaXR1YXRpb25zOiBhIGxvZyB0aGF0IGdyZXcgKGV4cGVjdGVkIOKAlCB0aGUgZmVuY2UgZGlkIGl0c1xuICAgICAgICAgICAgICAgICAgICogam9iKSBhbmQgYSBsb2cgdGhhdCBjYW1lIGJhY2sgaWRlbnRpY2FsLCB3aGljaCBtZWFucyBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZW5kIGRpc2FncmVlIGFib3V0IHRoZSBjb3VudCBmb3IgdGhlIHNhbWUgc2V0IG9mXG4gICAgICAgICAgICAgICAgICAgKiBldmVudHMgYW5kIHRoZSByZXN0YXJ0IHdpbGwgcmUtZGVyaXZlIHRoZSBzYW1lIHNuYXBzaG90IGFuZFxuICAgICAgICAgICAgICAgICAgICogYmUgcmVqZWN0ZWQgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmU6IHtcbiAgICAgICAgICAgICAgICAgICAgaWRzOiBTZXQ8c3RyaW5nPjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdGFydDogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICByZWFzb246IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaW5saW5lLWRlbHRhJyB8ICdmdWxsLXJlbG9hZCc7XG4gICAgICAgICAgICAgICAgICB9IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFJlcG9ydCB3aGF0IGEgc3RhbGUtc25hcHNob3QgcmVzdGFydCdzIHJlbG9hZCBmb3VuZCwgb25jZVxuICAgICAgICAgICAgICAgICAgICogdGhlIGxvZyB0aGlzIHJlcGxheSB3aWxsIGFjdHVhbGx5IGNvbnN1bWUgaXMgaW4gaGFuZC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBgZ3Jld2AgaXMgdGhlIGV4cGVjdGVkIGNhc2UgYW5kIGdpdmVzIDQxMiB2b2x1bWUgYVxuICAgICAgICAgICAgICAgICAgICogZGVub21pbmF0b3IuIGB1bmNoYW5nZWRgIG1lYW5zIHRoZSByZWxvYWQgZGlzYWdyZWVkIHdpdGhcbiAgICAgICAgICAgICAgICAgICAqIHRoZSByZWplY3Rpb24sIHNvIHRoaXMgcmVwbGF5IHJlLWRlcml2ZXMgdGhlIHNhbWUgc25hcHNob3RcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBpcyByZWplY3RlZCBhZ2FpbiB1bnRpbCB0aGUgYnVkZ2V0IGlzIHNwZW50LiBgc2hyYW5rYFxuICAgICAgICAgICAgICAgICAgICogc2hvdWxkIGJlIGltcG9zc2libGU6IGV2ZXJ5IGxvYWQgcGF0aCBvbmx5IGFkZHMgdG8gYSBydW4nc1xuICAgICAgICAgICAgICAgICAgICogbG9nLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXBvcnRQcmVjb25kaXRpb25SZXN0YXJ0UmVsb2FkID0gKFxuICAgICAgICAgICAgICAgICAgICBldmVudHM6IEV2ZW50W11cbiAgICAgICAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlbGluZSA9IHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlbGluZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmUgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbG9hZGVkSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICBldmVudHMubWFwKChldmVudCkgPT4gZXZlbnQuZXZlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkZWQgPSBjb3VudE1pc3NpbmdJZHMocmVsb2FkZWRJZHMsIGJhc2VsaW5lLmlkcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyb3BwZWQgPSBjb3VudE1pc3NpbmdJZHMoYmFzZWxpbmUuaWRzLCByZWxvYWRlZElkcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dGNvbWUgPVxuICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQgPiAwID8gJ3NocmFuaycgOiBhZGRlZCA+IDAgPyAnZ3JldycgOiAndW5jaGFuZ2VkJztcblxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ1Jlc3RhcnRlZCByZXBsYXkgcmVsb2FkZWQgaXRzIGV2ZW50IGxvZyBhZnRlciBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQmVmb3JlOiBiYXNlbGluZS5pZHMuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0FmdGVyOiByZWxvYWRlZElkcy5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHM6IGJhc2VsaW5lLnJlc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGJhc2VsaW5lLnJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogYmFzZWxpbmUuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBSZWNvdmVyIGZyb20gYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24gYnkgcmVzdGFydGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAqIHJlcGxheSBpbnNpZGUgdGhpcyBpbnZvY2F0aW9uLCByZXR1cm5pbmcgZmFsc2Ugd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAgICAqIHBlci1pbnZvY2F0aW9uIGJ1ZGdldCBpcyBzcGVudCAodGhlIGNhbGxlciB0aGVuIGZhbGxzIGJhY2tcbiAgICAgICAgICAgICAgICAgICAqIHRvIGEgZnJlc2ggaW52b2NhdGlvbikuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogQSA0MTIgbWVhbnMgdGhlIGxvZyB0aGlzIHJlcGxheSBkZXJpdmVkIGl0cyBldmVudHMgZnJvbSB3YXNcbiAgICAgICAgICAgICAgICAgICAqIG1pc3NpbmcgYW4gZXZlbnQgdGhlIGJhY2tlbmQgaGFkIGFscmVhZHkgcmVjb3JkZWQuIFRoZVxuICAgICAgICAgICAgICAgICAgICogcmVqZWN0ZWQgd3JpdGUgY2Fubm90IHNpbXBseSBiZSByZXRyaWVkOiBjb3JyZWxhdGlvbiBpZHNcbiAgICAgICAgICAgICAgICAgICAqIGFyZSBwb3NpdGlvbmFsIG9yZGluYWxzIG9mIG9uZSBzZWVkZWQgc2VxdWVuY2UsIHNvIGEgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgKiBvdmVyIHRoZSBjb3JyZWN0ZWQgbG9nIG1pbnRzIGEgZGlmZmVyZW50IGlkIGZvciB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICogbG9naWNhbCBldmVudCwgYW5kIHJlLXBvc3RpbmcgdGhpcyBvbmUgd291bGQgcGVyc2lzdCBhblxuICAgICAgICAgICAgICAgICAgICogZXZlbnQgbm8gY29ycmVjdCByZXBsYXkgZXZlciBwcm9kdWNlcy4gVGhlIHdob2xlIHJlcGxheSBoYXNcbiAgICAgICAgICAgICAgICAgICAqIHRvIGJlIHJlLWRlcml2ZWQg4oCUIHdoaWNoIHRoZSBsb29wIGRvZXMgYnkgZGlzY2FyZGluZyBpdHNcbiAgICAgICAgICAgICAgICAgICAqIGNhY2hlZCBsb2csIHNpbmNlIGBydW5Xb3JrZmxvd2AgdGhlbiBidWlsZHMgYSBmcmVzaCBWTSxcbiAgICAgICAgICAgICAgICAgICAqIHNlZWQgYW5kIGNvcnJlbGF0aW9uLWlkIHNlcXVlbmNlIGZyb20gdGhlIHJlbG9hZGVkIGV2ZW50cy5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdGFydFJlcGxheUluUHJvY2VzcyA9IChcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yPzogdW5rbm93bixcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIFNldCBmYWxzZSB3aGVuIHdyaXRlcyB0aGlzIGludm9jYXRpb24gbWFkZSBjb25jdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICogd2l0aCB0aGUgcmVqZWN0ZWQgb25lIG1heSBiZSBtaXNzaW5nIGZyb20gdGhlIDQxMidzXG4gICAgICAgICAgICAgICAgICAgICAqIGRlbHRhOiB0aGUgV29ybGQgY29tcHV0ZWQgdGhhdCBkZWx0YSBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgKiByZWplY3RlZCByZXF1ZXN0J3Mgc25hcHNob3QsIHNvIGl0IGNhbm5vdCBjb250YWluIGFuXG4gICAgICAgICAgICAgICAgICAgICAqIGV2ZW50IGEgc2libGluZyBjb21taXR0ZWQgYWZ0ZXJ3YXJkcywgYW5kIG1lcmdpbmcgaXRcbiAgICAgICAgICAgICAgICAgICAgICogd291bGQgcmVzdGFydCB0aGUgcmVwbGF5IG9uIGEgbG9nIHRoYXQgaXMgc3RpbGxcbiAgICAgICAgICAgICAgICAgICAgICogaW5jb21wbGV0ZS4gT25seSBhIGZ1bGwgcmVsb2FkIGlzIGF1dGhvcml0YXRpdmUgdGhlbi5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIHsgYWxsb3dEZWx0YSA9IHRydWUgfTogeyBhbGxvd0RlbHRhPzogYm9vbGVhbiB9ID0ge31cbiAgICAgICAgICAgICAgICAgICk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMgPj1cbiAgICAgICAgICAgICAgICAgICAgICBnZXRQcmVjb25kaXRpb25NYXhJblByb2Nlc3NSZXN0YXJ0cygpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0cysrO1xuICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBzdGFsZS1zbmFwc2hvdCByZXN0YXJ0IGludmFsaWRhdGVzIHRoZSBwYXJrZWQgVk06XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2cgaXQgY29uc3VtZWQgd2FzIG1pc3NpbmcgZXZlbnRzLCBzbyBvbmx5IGEgZnJlc2hcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IG92ZXIgdGhlIGNvcnJlY3RlZCBsb2cgaXMgYXV0aG9yaXRhdGl2ZS4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGNvdmVycyB0aGUgc3VzcGVuc2lvbi1jcmVhdGUgNDEyLCB3aGljaCBmaXJlc1xuICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHJldGVudGlvbiBkZWNpc2lvbiAoa2lsbCBzd2l0Y2ggKyBzdGVwLWlucHV0XG4gICAgICAgICAgICAgICAgICAgIC8vIGdhdGUpIGV2ZXIgcmFuLCBhbmQgdGhlIHJ1bl9jb21wbGV0ZWQgNDEyLCB3aGVyZSBhXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBzZXNzaW9uIG11c3Qgbm90IGJlIHJlc3VtZWQgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgV29ybGQgTUFZIHJldHVybiB0aGUgZXZlbnRzIHdlIHdlcmUgbWlzc2luZyBvbiB0aGUgNDEyLlxuICAgICAgICAgICAgICAgICAgICAvLyBUcnVzdCBpdCBvbmx5IG9uIHRoZSBGSVJTVCByZXN0YXJ0OiBpdHMgY29tcGxldGVuZXNzIHByb29mXG4gICAgICAgICAgICAgICAgICAgIC8vIGxlYW5zIG9uIHRoZSBiYWNrZW5kJ3Mgb3duIGJvb2trZWVwaW5nLCBzbyBpZiB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC8vIHVuZGVyLWNvdW50cywgYSBcImNvbXBsZXRlXCIgZGVsdGEgY2FuIHN0aWxsIGxlYXZlIGEgaG9sZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gQm91bmRpbmcgaXQgdG8gb25lIGF0dGVtcHQgY2FwcyB0aGF0IGF0IGEgc2luZ2xlIHdhc3RlZFxuICAgICAgICAgICAgICAgICAgICAvLyByZXN0YXJ0OyBldmVyeSBsYXRlciByZXN0YXJ0IGRvZXMgdGhlIGF1dGhvcml0YXRpdmUgbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPVxuICAgICAgICAgICAgICAgICAgICAgIGFsbG93RGVsdGEgJiYgcHJlY29uZGl0aW9uUmVzdGFydHMgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcHJlY29uZGl0aW9uRXZlbnREZWx0YShlcnJvciwgcnVuSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgZGVsdGEgaXMgb25seSB1c2FibGUgYXMgYSBkZWx0YSBpZiB0aGVyZSBpcyBhIGNhY2hlZCBsb2dcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gbWVyZ2UgaXQgaW50bzsgd2l0aCBubyBiYXNlIGxvZyB0aGUgcmVzdGFydCBoYXMgdG8gbG9hZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2hvbGUgdGhpbmcgYW55d2F5LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VkRGVsdGEgPSBCb29sZWFuKGRlbHRhICYmIGNhY2hlZEV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBzZXQgYmVpbmcgZGlzY2FyZGVkIHdoaWxlIGl0IGlzIHN0aWxsIGluXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmQ7IHRoZSBjb21wYXJpc29uIGhhcHBlbnMgb25jZSB0aGUgbmV4dCBsb2FkIHJlc29sdmVzLlxuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmUgPSBjYWNoZWRFdmVudHNcbiAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzOiBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5tYXAoKGV2ZW50KSA9PiBldmVudC5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0OiBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHVzZWREZWx0YSA/ICdpbmxpbmUtZGVsdGEnIDogJ2Z1bGwtcmVsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VkRGVsdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lZCBieSB0aGUgbG9vcCdzIGZpcnN0IGJyYW5jaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIChgcGVuZGluZ0lubGluZURlbHRhICYmIGNhY2hlZEV2ZW50c2ApIHdpdGggbm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCByb3VuZCB0cmlwIGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSBkZWx0YTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBNVVNUIGJlIGEgZnVsbCwgY3Vyc29yLWxlc3MgcmVsb2FkLiBUaGUgY3Vyc29yIGZpbHRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBieSBsZXhpY29ncmFwaGljIGV2ZW50IGlkIHdoaWxlIGEgaG9sZSBpcyBkZWZpbmVkIGJ5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVUxJRCAqdGltZSo6IGFuIGV2ZW50IGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kIHNvcnRzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIHNpZGUgb2YgdGhlIGN1cnNvciBkZXBlbmRpbmcgb24gaXRzIHJhbmRvbVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCwgYW5kIGFuIGV2ZW50IG1pbnRlZCBpbiBhbiBlYXJsaWVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWlsbGlzZWNvbmQgYnV0IGNvbW1pdHRlZCBsYXRlciBhbHdheXMgc29ydHMgYmVsb3cgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQW4gaW5jcmVtZW50YWwgbG9hZCB0aGVyZWZvcmUgaGVhbHMgdGhlIGhvbGUgb25seSBieVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGx1Y2suXG4gICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDdXJzb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb3JyZWN0ZWQgbG9nIGluc2VydHMgdGhlIG1pc3NpbmcgZXZlbnRzIEJFTE9XIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBhbHJlYWR5IHNjYW5uZWQgZm9yIHBheWxvYWQgcHJld2FybWluZywgc2hpZnRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBsYXRlciBwb3NpdGlvbi4gT25seSBhIGZ1bGwgcmVzY2FuIHNlZXMgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlQYXlsb2FkQ2FjaGUucmVzZXRTY2FuKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjcmVhdGlvbiByZWplY3RlZCBhcyBzdGFsZTsgcmVzdGFydGluZyByZXBsYXkgaW4tcHJvY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHVzZWREZWx0YSA/ICdpbmxpbmUtZGVsdGEnIDogJ2Z1bGwtcmVsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5wcmVjb25kaXRpb25fcmVzdGFydHMnOiBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBFc2NhbGF0ZSBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiB0aGF0IHN1cnZpdmVkIHRoZVxuICAgICAgICAgICAgICAgICAgICogaW4tcHJvY2VzcyByZXN0YXJ0IGJ1ZGdldCB0byBhIGZyZXNoIGludm9jYXRpb24sIG9yIGdpdmUgdXBcbiAgICAgICAgICAgICAgICAgICAqIG9uIHRoZSBydW4gd2hlbiB0aGUgcGVyLXJ1biBidWRnZXQgaXMgYWxzbyBzcGVudC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgaW4tcHJvY2VzcyBidWRnZXQgaXMgYSBjbG9zdXJlIHZhcmlhYmxlIGFuZCB0aGUgcXVldWUnc1xuICAgICAgICAgICAgICAgICAgICogZGVsaXZlcnkgY291bnQgcmVzdGFydHMgYXQgMSB3aGVuZXZlciBhIG5ldyBtZXNzYWdlIGlzXG4gICAgICAgICAgICAgICAgICAgKiBlbnF1ZXVlZCwgc28gYSBydW4gdGhhdCBpcyBwZXJtYW5lbnRseSB1bmFibGUgdG8gY2F0Y2ggdXBcbiAgICAgICAgICAgICAgICAgICAqIHdpdGggaXRzIG93biBldmVudCBsb2cgd291bGQgb3RoZXJ3aXNlIGN5Y2xlIHJlc3RhcnRzIOKGklxuICAgICAgICAgICAgICAgICAgICogcmUtaW52b2tlIOKGkiByZXN0YXJ0cyB3aXRoIG5vIHJ1bi1sZXZlbCBib3VuZC4gVGhlIGNoYWluIGlzXG4gICAgICAgICAgICAgICAgICAgKiB0aGVyZWZvcmUgY291bnRlZCBvbiB0aGUgbWVzc2FnZSBpdHNlbGYsIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgICAgICAgICAgICogcmVwbGF5IGRpdmVyZ2VuY2VzIGFyZSwgYW5kIGZhaWxzIHRoZSBydW4gb25jZSBleGhhdXN0ZWQuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGNvdW50ZXIgb25seSBhZHZhbmNlcyBvbiBob3BzIHRoYXQgZW5xdWV1ZSBhIG5ldyBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgKiAoc2VlIGByZWludm9rZWApLiBBIHJlZGVsaXZlcnktYmFzZWQgaG9wIGtlZXBzIHRoZSBzYW1lIGJvZHlcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBzbyB0aGUgc2FtZSBjb3VudCwgYnV0IGl0IGFsc28ga2VlcHMgYWR2YW5jaW5nXG4gICAgICAgICAgICAgICAgICAgKiBgbWV0YWRhdGEuYXR0ZW1wdGAsIHdoaWNoIHRoZSBtYXgtZGVsaXZlcnkgY2hlY2sgYXQgdGhlIHRvcFxuICAgICAgICAgICAgICAgICAgICogb2YgdGhlIGhhbmRsZXIgYWxyZWFkeSBib3VuZHMg4oCUIGFuZCB0aGUgZGVsYXkgYmVsb3cgaXMgd2hhdFxuICAgICAgICAgICAgICAgICAgICogbWFrZXMgdGhhdCBidWRnZXQgc3BhbiByZWFsIHRpbWUgcmF0aGVyIHRoYW4gYmVpbmcgYnVybmVkIGluXG4gICAgICAgICAgICAgICAgICAgKiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbiA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiB1bmtub3duXG4gICAgICAgICAgICAgICAgICApOiBQcm9taXNlPFxuICAgICAgICAgICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogeyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB8IHsgcmVpbnZva2VkOiBmYWxzZTsgZXJyb3I6IEVycm9yIH1cbiAgICAgICAgICAgICAgICAgID4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRlbXB0ID0gKHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnMgPz8gMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhSZWludm9jYXRpb25zID0gZ2V0UHJlY29uZGl0aW9uTWF4UmVpbnZvY2F0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA+IG1heFJlaW52b2NhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnZva2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBFdmVudCBjcmVhdGlvbiB3YXMgcmVqZWN0ZWQgYXMgc3RhbGUgYWZ0ZXIgJHttYXhSZWludm9jYXRpb25zfSByZS1pbnZvY2F0aW9ucyBvZiAke2dldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzKCl9IGluLXByb2Nlc3MgcmVwbGF5IHJlc3RhcnRzIGVhY2g6IHRoaXMgcnVuIGNhbm5vdCBvYnNlcnZlIGl0cyBvd24gZXZlbnQgbG9nIGNvbXBsZXRlbHkgZW5vdWdoIHRvIG1ha2UgcHJvZ3Jlc3MuIExhc3QgcmVqZWN0aW9uICgke3JlYXNvbn0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNhdXNlOiBlcnJvciB9XG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjcmVhdGlvbiByZWplY3RlZCBhcyBzdGFsZSBhZnRlciBpbi1wcm9jZXNzIHJlc3RhcnRzOyByZS1pbnZva2luZyBydW4gZm9yIGEgZnJlc2ggcmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZWludm9jYXRpb25zOiBhdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVpbnZvY2F0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5wcmVjb25kaXRpb25fcmVpbnZvY2F0aW9ucyc6IGF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBEZWxheWVkLCB1bmxpa2UgdGhlIG90aGVyIHJlaW52b2tlKCkgY2FsbGVyczogdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGluLXByb2Nlc3MgcmVzdGFydHMgYWxyZWFkeSByZWxvYWRlZCB0aGUgbG9nIHNldmVyYWwgdGltZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBjYXRjaGluZyB1cCwgc28gdGhlIHdyaXRlcnMgdGhpcyByZXBsYXkgaXMgcmFjaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGFyZSBzdGlsbCBhY3RpdmUuIFJldHJ5aW5nIGluc3RhbnRseSBqdXN0IGJ1cm5zIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwZXItcnVuIGJ1ZGdldCBhdCBmdWxsIHNwZWVkLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IHJlaW52b2tlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uUmVpbnZva2VEZWxheVNlY29uZHMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJlY29uZGl0aW9uUmVpbnZvY2F0aW9uczogYXR0ZW1wdCB9XG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIERlcGxveW1lbnQtYWZmaW5pdHkgZ3VhcmQsIHNoYXJlZCBieSB0aGUgdHdvIHBhdGhzIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgYSBydW46IHF1ZXVlZCBzdGVwIGV4ZWN1dGlvbnMgYW5kIGZsb3cgcmVwbGF5cy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGd1YXJkRGVwbG95bWVudCA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgcnVuOiBQaWNrPFxuICAgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICdydW5JZCcgfCAnZGVwbG95bWVudElkJyB8ICdzcGVjVmVyc2lvbidcbiAgICAgICAgICAgICAgICAgICAgPixcbiAgICAgICAgICAgICAgICAgICAgcmVlbnF1ZXVlUGF5bG9hZDogKCkgPT4gUHJvbWlzZTxXb3JrZmxvd0ludm9rZVBheWxvYWQ+LFxuICAgICAgICAgICAgICAgICAgICBiZWZvcmVTdG9wPzogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTxEZXBsb3ltZW50QWZmaW5pdHlPdXRjb21lPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgb3V0Y29tZSwgc3BhbkF0dHJpYnV0ZXMgfSA9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50OiBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlU3RvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWVucXVldWU6IGFzeW5jICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQ6IHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH06IFJlZW5xdWV1ZUFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVlbnF1ZXVlUGF5bG9hZCgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQ6IHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGRlcGxveW1lbnRJZCwgc3BlY1ZlcnNpb24sIGRlbGF5U2Vjb25kcyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkF0dHJpYnV0ZXMpIHNwYW4/LnNldEF0dHJpYnV0ZXMoc3BhbkF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0Y29tZTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIGluY29taW5nIG1lc3NhZ2UgaGFzIGEgc3RlcElkLCB0aGlzIGlzIGEgYmFja2dyb3VuZCBzdGVwXG4gICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24uIEV4ZWN1dGUgdGhlIHN0ZXAsIHRoZW4gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBiYXRjaCBhcmUgZG9uZS4gSWYgc28sIHJlcGxheSBpbmxpbmUgKHNhdmluZyBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXApLiBJZiBub3QsIHJldHVybiDigJQgdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwaWNrIHVwIHRoZSByZXBsYXkuXG4gICAgICAgICAgICAgICAgICBpZiAoaW5jb21pbmdTdGVwSWQgJiYgaW5jb21pbmdTdGVwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnUnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGJnUnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIHN0YXR1czogYmdSdW4uc3RhdHVzIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvdmVycyBldmVyeSBxdWV1ZWQgc3RlcCBleGVjdXRpb24g4oCUIGZpcnN0IGRpc3BhdGNoIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcmllcy9yZXRyaWVzIGFsaWtlLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCBndWFyZERlcGxveW1lbnQoYmdSdW4sIGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCByZXBsYXlNZXNzYWdlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkgIT09ICdjb250aW51ZSdcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdTdGFydGVkQXQgPSBiZ1J1bi5zdGFydGVkQXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gK2JnUnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmV0cnkgY2VpbGluZyBmb3IgYSBiYWNrZ3JvdW5kZWQgc3RlcC4gYG1ldGFkYXRhLmF0dGVtcHRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZSBxdWV1ZSBkZWxpdmVyeSBjb3VudCkgaXMgYSBjaGVhcCB1cHBlciBib3VuZCwgYnV0IGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3Zlci1jb3VudHM6IGEgVGhyb3R0bGVFcnJvciAvIFRvb0Vhcmx5RXJyb3Ig4oCUIG9yIGFueVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnkgdGhhdCBuZXZlciByYW4gdGhlIGJvZHkg4oCUIHN0aWxsIGFkdmFuY2VzIGl0LCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRydXN0aW5nIGl0IGRpcmVjdGx5IGNvdWxkIGZhaWwgYSBzdGVwIGFzIFwiZXhjZWVkZWQgbWF4XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cmllc1wiIGJlZm9yZSB0aGUgYm9keSBldmVyIHJhbiAoYSB1c2VyLXZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWdyZXNzaW9uIHVuZGVyIHRyYW5zaWVudCBiYWNrZW5kIHByZXNzdXJlKS4gVXNlIGl0IG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIGZhc3QgZ2F0ZTogd2hpbGUgaXQgaXMgYXQgb3IgdW5kZXIgdGhlIGNlaWxpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBjYW5ub3QgYmUgZXhoYXVzdGVkLCBzbyBwcm9jZWVkIHdpdGhvdXQgdG91Y2hpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbG9nLiBPbmx5IG9uY2UgaXQgY3Jvc3NlcyB0aGUgY2VpbGluZyBkbyB3ZSBsb2FkIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9nIGFuZCBkZXJpdmUgdGhlIGF1dGhvcml0YXRpdmUgYXR0ZW1wdCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZGVkIGBzdGVwX3N0YXJ0ZWRgIGNvdW50IOKAlCBzY29wZWQgdG8gdGhlIGxpZmVjeWNsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgdG90YWwgKGJhcmUgc3RhcnRzIHBsdXMgdGhlIGxhcmdlc3Qgc2luZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXIncyBzdGFydHMpOiB0aHJvdHRsZS90b28tZWFybHkgcmVkZWxpdmVyaWVzIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RhcnQgYXQgYWxsLCByYWNpbmcgaW52b2NhdGlvbnMnIG9uZS1vZmYgc3RhbXBlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZXMgZG9uJ3QgYWNjdW11bGF0ZSAoY291bnRpbmcgdGhlbSBmYWxzZWx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhoYXVzdGVkIGhlYWx0aHkgc3RlcHMg4oCUIHNlZSBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYXR0ZW1wdHMgYnVybmVkIHVuZGVyIGEgcHJpb3IgaW5saW5lLW93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHBoYXNlIHN0aWxsIGNvdW50LCBzbyBhIHN0ZXAgdGhhdCB0aW1lcyBvdXQgdW5kZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZCByZWNvdmVyeSBhbmQgdGhlbiB0cmFuc2l0aW9ucyB0byBxdWV1ZWQvYmFyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJpZXMgdHJpcHMgdGhlIGNvbWJpbmVkIGNlaWxpbmcuIFRoaXMgc3RpbGwgYm91bmRzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dHMsIHdoaWNoIHdyaXRlIG5vIGVycm9yIGZvciB0aGUgcG9zdC1ib2R5IGd1YXJkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2guIFRoZSBsb2FkIGFsc28gcHJpbWVzIHRoZSByZXBsYXknc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGBjYWNoZWRFdmVudHNgL2BldmVudHNDdXJzb3JgICh0aGUgcG9zdC1zdGVwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uIGJlbG93IHJlZnJlc2hlcyB0aGVtIG9uY2UgdGhlIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGV2ZW50IGxhbmRzKS5cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCA9IG1ldGFkYXRhLmF0dGVtcHQ7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdNYXhSZXRyaWVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0ZXBGdW5jdGlvbihpbmNvbWluZ1N0ZXBOYW1lKT8ubWF4UmV0cmllcyA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gYmdNYXhSZXRyaWVzICsgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMoY2FjaGVkRXZlbnRzLCBpbmNvbWluZ1N0ZXBJZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0b3RhbEF0dGVtcHRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0IHdoaWxlIHRoZSBzdGVwIGJvZHkgcnVucyDigJRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEdXJhdGlvbiwgbm90IGJ5IHRoZSByZXBsYXkgdGltZW91dC4gU2VlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheUJ1ZGdldCBkb2NzIGZvciB0aGUgY29udHJhY3QuXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+PjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlLWZsaWdodDogYSBkZWxheWVkIGJhY2tzdG9wIChvciByZXRyeSkgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGFycml2ZSB3aGlsZSBhbm90aGVyIGV4ZWN1dGlvbiBvZiB0aGlzIHNhbWUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbWlkLWJvZHkgaW4gdGhpcyBwcm9jZXNzIOKAlCBtb3N0IGltcG9ydGFudGx5IG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZHMgd2l0aCBubyBpbnZvY2F0aW9uIGtpbGwgYm91bmQgKHdvcmxkLWxvY2FsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBvd25lcnNoaXAgbGVhc2UgaXMgbm90IGEgZGVhdGggcHJvb2YuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9zZXIgYXdhaXRzIHRoZSB3aW5uZXIncyBzZXR0bGVtZW50LCB0aGVuIGFja3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXhlY3V0aW5nLiBObyBvd25lck1lc3NhZ2VJZCBoZXJlOiB0aGUgYmFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIG9mIGEgcXVldWUtZHJpdmVuIGV4ZWN1dGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWxseSBjbGVhcnMgaW5saW5lIG93bmVyc2hpcCAodGhlIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlLW93bmVkIGZyb20gdGhpcyBwb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0ID0gYXdhaXQgcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogYmdSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IGJnU3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKGJnUnVuLmF0dHJpYnV0ZXMsIHJ1bklkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiBiZ1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IGNlaWxpbmc6IHRoZSBxdWV1ZSBkZWxpdmVyeSBjb3VudCBhcyBhIGZhc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdhdGUsIHZlcmlmaWVkIGFnYWluc3QgdGhlIHJlY29yZGVkIHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bnQgb25jZSBpdCBjcm9zc2VzIHRoZSBjZWlsaW5nIChzZWUgYWJvdmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6IGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHN0ZXBSZXN1bHQudGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc3RlcCBoYWQgcGVuZGluZyBvcHMgKHN0cmVhbSB3cml0ZXMpLCBicmVhayBhbmQgbGV0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdFVudGlsIGZsdXNoIHRoZW0g4oCUIGNhbid0IGNvbnRpbnVlIGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0Lmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2ZhaWxlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3NraXBwZWQnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZW50cyB0byBjaGVjayBpZiBhbGwgcGFyYWxsZWwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY3Vyc29yLWJhc2VkIGxvYWRpbmcgc28gdGhlIG1haW4gbG9vcCBjYW4gY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFsbHkgZnJvbSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcGVuZGluZyBzdGVwczogYW55IHN0ZXBfY3JlYXRlZCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG1hdGNoaW5nIHN0ZXBfY29tcGxldGVkIG9yIHN0ZXBfZmFpbGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBUZXJtaW5hbElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGNhY2hlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcENyZWF0ZWRJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwVGVybWluYWxJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdTdGVwSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHN0ZXBDcmVhdGVkSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcFRlcm1pbmFsSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcElkcy5hZGQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nU3RlcElkcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHBlbmRpbmcgc3RlcCB0aGF0IFRISVMgbWVzc2FnZSBpbmxpbmUtb3ducyAoYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2Ugc3RhbXBlZCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIGFuZCB0aGVuIGNyYXNoZWQgbWlkLWJvZHkpIG11c3QgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmVkIGhlcmU6IG9ubHkgdGhlIG93bmluZyBtZXNzYWdlIG1heVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1leGVjdXRlIGl0IGJlZm9yZSB0aGUgb3duZXJzaGlwIGxlYXNlIGV4cGlyZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3YWtlIHJlcGxheXMgbWVyZWx5IGVuc3VyZSBhIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3N0b3AuIEZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiBsb29wLCB3aG9zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCB0YWJsZSByb3V0ZXMgaXQgdG8gb3duZWQgcmVjb3ZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lubGluZU93bmVyc2hpcEVuYWJsZWQoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BlbmRpbmdTdGVwT3duZWRCeU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcElkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLm1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWNrZ3JvdW5kIHN0ZXAgZG9uZTsgZmFsbGluZyB0aHJvdWdoIHRvIHJlY292ZXIgYW4gaW5saW5lIHN0ZXAgb3duZWQgYnkgdGhpcyBtZXNzYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgc3RlcHMgc3RpbGwgaW4gcHJvZ3Jlc3MuIFJldHVybiB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWluZyDigJQgdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZSB3aWxsIHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBzdGVwcyBkb25lIGFuZCByZXBsYXkgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFja2dyb3VuZCBzdGVwIGRvbmUgYnV0IG90aGVyIHN0ZXBzIHBlbmRpbmcsIHJldHVybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgc3RlcHMgZG9uZSDigJQgZmFsbCB0aHJvdWdoIHRvIHRoZSBtYWluIHJlcGxheSBsb29wLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHVwIHNoYXJlZCBzdGF0ZSBzbyB0aGUgbG9vcCBjYW4gY29udGludWUuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnQWxsIHBhcmFsbGVsIHN0ZXBzIGRvbmUsIHJlcGxheWluZyBpbmxpbmUgYWZ0ZXIgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50ID0gY2FjaGVkRXZlbnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheUlucHV0OiB1bmtub3duO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bkNyZWF0ZWRFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlJbnB1dCA9IHJ1bkNyZWF0ZWRFdmVudC5ldmVudERhdGEuaW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTGVnYWN5U3BlY1ZlcnNpb24oYmdSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgaGFzIG5vIFwicnVuX2NyZWF0ZWRcIiBldmVudGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExlZ2FjeSBydW5zIHByZWRhdGUgdGhlIGV2ZW50LXNvdXJjZWQgcnVuX2NyZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YXJpYW50LCBzbyByZXRhaW4gdGhlIHJlc29sdmVkIEdFVCBvbmx5IGZvciB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWdhY3lSdW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWdhY3lSdW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5SW5wdXQgPSBsZWdhY3lSdW4uaW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYmdSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiByZXBsYXlJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gYmdTdGFydGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZWRFdmVudHMgYW5kIGV2ZW50c0N1cnNvciBhbHJlYWR5IHNldCBmcm9tIGxvYWQgYWJvdmVcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIGVycm9yIHdoaWxlIHByZXBhcmluZyBiYWNrZ3JvdW5kIHdvcmtmbG93IHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyAtLS0gTGF6eSBob29rIHJlc3VtZSBmYXN0IHBhdGggLS0tXG4gICAgICAgICAgICAgICAgICAvLyBBIGxhenkgaG9vayBkZWxpdmVyeSAocmVzdW1lSWQgKyBkaWdlc3Qgb24gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSBob2lzdHMgdGhlIGNvbnN1bWVyJ3MgaWRlbXBvdGVudCBob29rX3JlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAvLyByZS1lbnN1cmUgYWJvdmUgcnVuX3N0YXJ0ZWQgYW5kIGFza3MgdGhlIFdvcmxkIHRvIHJldHVyblxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgcmVwbGF5IGxvZyB3aXRoIHRoZSB3cml0ZSAocHJlbG9hZEV2ZW50cykuIEFcbiAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmcgV29ybGQgYW5zd2VycyB3aXRoIHRoZSByZWNvbnN0cnVjdGVkIHJ1biwgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZSByZXBsYXkgbG9nLCBhbmQgdGhlIHJ1bidzIGV2ZW50IGNlaWxpbmcg4oCUXG4gICAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIHRoZSBnZW5lcmljIHNldHVwIGJlbG93IHdvdWxkIHNwZW5kIGFcbiAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIFBPU1QgYW5kIGFuIGV2ZW50cy5saXN0IG9uLiBBbnkgb3RoZXIgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAvLyAob2xkZXIgc2VydmVyLCBhIFdvcmxkIHRoYXQgaWdub3JlcyB0aGUgcGFyYW0sIG9yIGFcbiAgICAgICAgICAgICAgICAgIC8vIHByZWxvYWQgdGhhdCBmYWlscyB2YWxpZGF0aW9uLCBpbmNsdWRpbmcgYSBib3VuZGVkXG4gICAgICAgICAgICAgICAgICAvLyBoYXNNb3JlIHBhZ2UpIGZhbGxzIGJhY2sgdG8gdGhhdCBnZW5lcmljIHNldHVwOyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgd3JpdGUgaXRzZWxmIGhhcyBzdGlsbCBzdWNjZWVkZWQgZWl0aGVyXG4gICAgICAgICAgICAgICAgICAvLyB3YXksIHNvIHRoZSByZS1lbnN1cmUgYmxvY2sgYmVsb3cgaXMgc2tpcHBlZCB2aWFcbiAgICAgICAgICAgICAgICAgIC8vIGBob29rRW5zdXJlZGAuIE5ldmVyIHRha2VuIG9uIHR1cmJvICh0dXJibyBkZWxpdmVyaWVzXG4gICAgICAgICAgICAgICAgICAvLyBjYXJyeSBydW5JbnB1dCwgbm90IGhvb2tJbnB1dCkgb3IgYWZ0ZXIgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcGF0aCBhbHJlYWR5IGxvYWRlZCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgbGV0IGhvb2tFbnN1cmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICF3b3JrZmxvd1J1biAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnJlc3VtZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnBheWxvYWREaWdlc3QgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvb2tSZXN1bWVJbnB1dCA9IGhvb2tJbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGF0ZSB0aGUgbWF0ZXJpYWxpemVkIGV2ZW50IHRvIHdoZW4gdGhlIHJlc3VtZSBhY3R1YWxseVxuICAgICAgICAgICAgICAgICAgICAvLyBvY2N1cnJlZCDigJQgc2FtZSBkZXJpdmF0aW9uIGFzIHRoZSByZS1lbnN1cmUgYmVsb3cgKHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWVJZCBpcyBhIFVMSUQgbWludGVkIGJ5IHJlc3VtZUhvb2soKSBhdCByZXN1bWVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGltZSkuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvY2N1cnJlZEF0OiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVRpbWUoaG9va1Jlc3VtZUlucHV0LnJlc3VtZUlkKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cuaG9va19yZWNlaXZlZC5jcmVhdGUuc3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cuaG9va19yZWNlaXZlZC5wcmVsb2FkX2V2ZW50cyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2tSZXN1bWVJbnB1dC5ob29rSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rUmVzdW1lSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogaG9va1Jlc3VtZUlucHV0LnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUlkOiBob29rUmVzdW1lSW5wdXQucmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVBheWxvYWREaWdlc3Q6IGhvb2tSZXN1bWVJbnB1dC5wYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRXZlbnRzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgaG9va0Vuc3VyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHVubGlrZSB0aGUgcmUtZW5zdXJlIGJlbG93LCB0aGlzIGhvaXN0ZWQgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIE5PVCBzZXQgSG9va1Jlc2lsaWVudFJlc3VtZU1hdGVyaWFsaXplZCDigJQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5zIG9uIGV2ZXJ5IGZhc3QtcGF0aCByZXN1bWUsIGluY2x1ZGluZyB0aGUgY29tbW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSB3aGVyZSB0aGUgcHJvZHVjZXIncyBkaXJlY3Qgd3JpdGUgYWxyZWFkeSBsYW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBjYWxsIG1lcmVseSBjb252ZXJnZWQgb24gaXQsIHNvIGl0IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZWNvdmVyeSBzaWduYWwuIHdvcmtmbG93LnJlc3VtZV9zZXR1cF9zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoYmVsb3cpIGRlc2NyaWJlcyB0aGlzIHBhdGggaW5zdGVhZC5cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVsb2FkIGlzIHVzYWJsZSBhcyByZXBsYXkgaW5wdXQgb25seSB3aGVuIGl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVtb25zdHJhYmx5IHRoZSBjb21wbGV0ZSBwaWN0dXJlOiBhIHJlY29uc3RydWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gd2l0aCBhIHN0YXJ0IHRpbWUsIGEgbm9uLWVtcHR5IENPTVBMRVRFIGxvZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChoYXNNb3JlIGZhbHNlIOKAlCB0aGlzIHBhdGggaGFzIG5vIGN1cnNvci1jb250aW51YXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYWNoaW5lcnksIHNvIGEgYm91bmRlZCBwYWdlIG11c3Qgbm90IGJlIHRydXN0ZWQpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIncyBldmVudCBjZWlsaW5nICh0aGlzIHJlc3BvbnNlIHBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQncyByb2xlLCBzbyBhIG1pc3NpbmcgY2VpbGluZyB3b3VsZCBsZWF2ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50LWxpbWl0IGVuZm9yY2VtZW50IGRpc2FibGVkIGZvciB0aGUgcnVuKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIHJ1biBsaWZlY3ljbGUgZXZlbnRzLCB0aGUgY2Fub25pY2FsIGV2ZW50IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBjb252ZXJnZWQgb24sIGFuZCB0aGUgaG9va19yZWNlaXZlZCBtYXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFRISVMgcmVzdW1lIChzbyB3ZSBuZXZlciByZXBsYXkgYWdhaW5zdCBhIGxvZyB0aGF0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWlzc2luZyB0aGUgdmVyeSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGRlbGl2ZXJ5KS5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2FibGVSZXBsYXlQcmVsb2FkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ydW4gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJ1bi5zdGFydGVkQXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY3Vyc29yICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3VsdC5tYXhFdmVudHMgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tSZXN1bWVJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzYWJsZVJlcGxheVByZWxvYWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ydW4/LnN0YXJ0ZWRBdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlY29uc3RydWN0ZWQgcnVuIGFsd2F5cyByZWFkcyAncnVubmluZycsIGJ1dCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBldmVudCBjb21taXR0ZWQgY29uY3VycmVudGx5IHJpZGVzIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGl0c2VsZi4gVGhlIG5vZGUgcmVwbGF5IGxvb3Agd291bGQgY2F0Y2ggaXQsIGJ1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUXVpY2tKUyBkaXNwYXRjaGVzIGJlZm9yZSB0aGF0IGNoZWNrIOKAlCBzbyBjb25zdW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVsaXZlcnkgaGVyZSwgYmVmb3JlIGFueSBlbmdpbmUgcnVucy4gU2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0Y29tZSBhcyB0aGUgcnVuX3N0YXJ0ZWQgcGF0aCdzIG5vbi1ydW5uaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgY2hlY2suXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtaW5hbEV2ZW50ID0gcmVzdWx0LmV2ZW50cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVsb2FkIHN0aWxsIGluaXRpYWxpemVkIHRoaXMgZGVsaXZlcnkgKGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGhvdyB0aGUgdGVybWluYWwgc3RhdGUgd2FzIG9ic2VydmVkKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwLXNvdXJjZSBhbmQgdGhlIHJ1bidzIGFjdHVhbCB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgYXJlIHJlY29yZGVkIGJlZm9yZSBjb25zdW1pbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnY29tcGxldGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnY2FuY2VsbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tSZXN1bWVTZXR1cFNvdXJjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCBkdXJpbmcgbGF6eSBob29rIHNldHVwLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXQgPSBjbGFtcE1heEV2ZW50cyhyZXN1bHQubWF4RXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcnMgUlNGUyDigJQgc2VlIHRoZSBkZWNsYXJhdGlvbiBhYm92ZS4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgcGxheXMgcnVuX3N0YXJ0ZWQncyByb2xlIG9uIHRoaXMgcGF0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzID0gcmVzdWx0LmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0N1cnNvciA9IHJlc3VsdC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdmFsaWRhdGVkIHByZWxvYWQgaXMgdGhlIENPTVBMRVRFIGxvZyAoaGFzTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UpLCBzbyBRdWlja0pTIG1heSB0cnVzdCBpdCBhcy1pcyBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZldGNoaW5nIOKAlCBpdHMgb3duIGZpcnN0LWludm9jYXRpb24gaGV1cmlzdGljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHJlY29nbml6ZXMgcnVuX2NyZWF0ZWQvcnVuX3N0YXJ0ZWQgcHJlbG9hZHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICtyZXN1bHQucnVuLnN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocmVzdWx0LnJ1bi5zdGF0dXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzZnVsIHdyaXRlLCBubyB1c2FibGUgcHJlbG9hZCAoQ0JPUiByZXNwb25zZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBhbiBvbGRlciBzZXJ2ZXIsIGEgV29ybGQgdGhhdCBpZ25vcmVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0LWluLCBhIGJvdW5kZWQgaGFzTW9yZSBwYWdlLCBvciBhIHByZWxvYWQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHZhbGlkYXRpb24pOiB0YWtlIHRoZSBnZW5lcmljIHJ1bl9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBiZWxvdy4gSXRzIHByZWxvYWQgaXMgbG9hZGVkIGFmdGVyIHRoaXMgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCwgc28gdGhlIGNhbm9uaWNhbCBob29rX3JlY2VpdmVkIGlzIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHdoYXRldmVyIGxvZyB0aGF0IHNldHVwIHJlYWRzIOKAlCBubyBzcGxpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5Ib29rUmVzdW1lU2V0dXBTb3VyY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvb2tfcmVjZWl2ZWRfZmFsbGJhY2snXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGNsYXNzaWZpY2F0aW9uIGFzIHRoZSByZS1lbnN1cmUgYmVsb3c6XG4gICAgICAgICAgICAgICAgICAgICAgLy8gLSBIb29rTm90Rm91bmQgLyBSdW5FeHBpcmVkOiB0aGUgcnVuIHdlbnQgdGVybWluYWw7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBub3RoaW5nIGxlZnQgdG8gcmVzdW1lLCBjb25zdW1lIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIC0gYW55dGhpbmcgZWxzZSAoRW50aXR5Q29uZmxpY3QsIGEgdHJ1bmNhdGVkIHByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN0cmVhbSwgdHJhbnNwb3J0IGZhaWx1cmVzKTogdHJhbnNpZW50IOKAlCByZXRocm93IHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgcXVldWUgcmVkZWxpdmVycyBhbmQgdGhlIGlkZW1wb3RlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIChydW5JZCwgcmVzdW1lSWQpIGNsYWltIGNvbnZlcmdlcyBvbiByZXRyeS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIGxhenkgaG9vayBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHRoZSBydW4gc3RhdGUgLS0tXG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHdvcmtmbG93UnVuIHdhcyBhbHJlYWR5IHNldCBieSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIChpbmxpbmUgcmVwbGF5IGFmdGVyIGFsbCBwYXJhbGxlbCBzdGVwcyBkb25lKVxuICAgICAgICAgICAgICAgICAgLy8gb3IgYnkgdGhlIGxhenkgaG9vayBmYXN0IHBhdGggYWJvdmUuXG4gICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjYWxsIHJ1bl9zdGFydGVkIGRpcmVjdGx5IOKAlCB0aGlzIGJvdGggdHJhbnNpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB0byAncnVubmluZycgQU5EIHJldHVybnMgdGhlIHJ1biBlbnRpdHksIHNhdmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHNlcGFyYXRlIHJ1bnMuZ2V0IHJvdW5kLXRyaXAuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyYWN0OiBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcpIG11c3QgYmUgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcnVucyBhbHJlYWR5IGluICdydW5uaW5nJyBzdGF0dXMgKHJldHVybiB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXJyb3IpLCBub3QganVzdCBmb3IgcGVuZGluZyDihpIgcnVubmluZyB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9zdGFydGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWMgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCgpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGF2YWlsYWJsZSwgc28gdGhlIHJlc2lsaWVudCBzdGFydCBwYXRoIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbiAobm90IGFsd2F5cyBjdXJyZW50KS5cbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0Py5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHJ1biBpbnB1dCBmcm9tIHF1ZXVlIHNvIHRoZSBzZXJ2ZXIgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBydW4gaWYgcnVuX2NyZWF0ZWQgd2FzIG1pc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVaW50OEFycmF5IHZhbHVlcyBzdXJ2aXZlIHRoZSBxdWV1ZSBuYXRpdmVseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChDQk9SIG9uIHdvcmxkLXZlcmNlbCwgSlNPTiByZXZpdmVyIG9uIHdvcmxkLWxvY2FsKS5cbiAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRSdW5TdGFydGVkQ3JlYXRlU3RhcnQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgc2tpcFByZWxvYWQ6IGJvb2xlYW5cbiAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQoJ3dvcmtmbG93LnJ1bl9zdGFydGVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5ydW5fc3RhcnRlZC5za2lwX3ByZWxvYWQnOiBza2lwUHJlbG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHVyYm8gJiYgcnVuSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYmFja2dyb3VuZCBgcnVuX3N0YXJ0ZWRgIGFuZCBzeW50aGVzaXplIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRpdHkgbG9jYWxseSBzbyByZXBsYXkgY2FuIGJlZ2luIHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcm91bmQtdHJpcC4gU2FmZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbiDigJQgc3RhcnQoKSBjcmVhdGVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBtb21lbnRzIGFnbyBhbmQgbm8gZXZlbnRzIGhhdmUgYmVlbiB3cml0dGVuIHlldC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFycmllciBpcyBjb25zdW1lZCBieSBldmVyeSBkb3duc3RyZWFtIHdyaXRlIChzdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciwgb3B0aW1pc3RpYyBzdGVwX3N0YXJ0ZWQsIHRlcm1pbmFsIHJ1biB3cml0ZXMpIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICByZWNvcmRSdW5TdGFydGVkQ3JlYXRlU3RhcnQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRlZFByb21pc2UgPSBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGJhY2tncm91bmQgdGhpcyBwdXJlbHkgYXMgYSB3cml0ZSBiYXJyaWVyIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgcmVhZCBpdHMgcHJlbG9hZGVkIGV2ZW50cyAocHJlbG9hZGVkRXZlbnRzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgdG8gW10gYmVsb3cpLCBzbyB0ZWxsIHRoZSBXb3JsZCB0byBza2lwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgZXZlbnQtbG9nIHByZWxvYWQuIFRoYXQgdHJpbXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCByZXF1ZXN0IHRoZSBjaGFpbmVkIGZpcnN0IHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdHMgb24g4oCUIHNob3J0ZW5pbmcgdGltZS10by1zZWNvbmQtc3RlcCDigJQgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzdGVkIGxpc3QrcmVzb2x2ZSBpdCB3b3VsZCBvdGhlcndpc2UgY29tcHV0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkLCBza2lwUHJlbG9hZDogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIgPSBzdGFydGVkUHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibyBiYWNrZ3JvdW5kcyBydW5fc3RhcnRlZCwgc28gdGhlIG5vbi10dXJibyBhc3NpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cgbmV2ZXIgcnVucyDigJQgdGhyZWFkIHRoZSBwZXItcnVuIGV2ZW50IGNlaWxpbmcgb2ZmIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCByZXNwb25zZSBoZXJlIGluc3RlYWQuIFRoZSBndWFyZCByZS1jaGVja3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhFdmVudHNMaW1pdCBldmVyeSBsb29wIGl0ZXJhdGlvbiwgc28gYSB2YWx1ZSB0aGF0IGxhbmRzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2hvcnRseSBhZnRlciBzdGFydCBzdGlsbCBlbmZvcmNlcyB3ZWxsIGJlZm9yZSBhIHJ1bmF3YXlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgYXBwcm9hY2hlcyB0aGUgY2VpbGluZy5cbiAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkUHJvbWlzZS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGltaXQgPSBjbGFtcE1heEV2ZW50cyhyPy5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCkgbWF4RXZlbnRzTGltaXQgPSBsaW1pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7fVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIGEgbm8tb3AgcmVqZWN0aW9uIGhhbmRsZXIgc28gYW4gZWFybHkgZmFpbHVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHN1cmZhY2VzIGFzIGFuIHVuaGFuZGxlZFJlamVjdGlvbiBiZWZvcmUgYSBjb25zdW1lclxuICAgICAgICAgICAgICAgICAgICAgIC8vIChhd2FpdC90aGVuKSBpcyBhdHRhY2hlZDsgY29uc3VtZXJzIHN0aWxsIG9ic2VydmUgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZFByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGluaXRpYWwgZXZlbnRzLmxpc3Q6IG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB0b1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2cgeWV0IG9uIGEgZmlyc3QgZGVsaXZlcnkgKHJ1bl9zdGFydGVkIGlzIHN0aWxsIGluXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0KS4gQW4gZW1wdHkgcHJlbG9hZGVkIHNldCByb3V0ZXMgaXRlcmF0aW9uIDEgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuby1sb2FkIHByZWxvYWRlZCBicmFuY2g7IGl0ZXJhdGlvbiAyIHRoZW4gdGFrZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcG9zdC1wcmVsb2FkZWQgZnVsbCByZWxvYWQgdG8gcGljayB1cCBhIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgIC8vIChubyBzcHVyaW91cyBcImN1cnNvciBtaXNzaW5nXCIgd2FybmluZykuIGBbXWAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbnRpb25hbGx5IHRydXRoeSBoZXJlIOKAlCBkbyBub3QgY2hhbmdlIHRoZSBsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYnJhbmNoZXMnIGBpZiAocHJlbG9hZGVkRXZlbnRzKWAgY2hlY2tzIHRvIHRlc3QgbGVuZ3RoLlxuICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBydW5JbnB1dC5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWVkIGF0dHJpYnV0ZXMgZnJvbSBzdGFydCgpIHJpZGUgYWxvbmcgaW4gYHJ1bklucHV0YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZXkgbGl2ZSBpbiBgcnVuX2NyZWF0ZWRgJ3MgZXZlbnREYXRhLCBub3Qgc2VwYXJhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBhdHRyX3NldGAgZXZlbnRzKSwgc28gdGhlIHN5bnRoZXNpemVkIHNuYXBzaG90IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gZXZlbiB0aG91Z2ggd2Ugc2tpcCB0aGUgaW5pdGlhbCBldmVudHMubGlzdC4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgY29ycmVjdCBPTkxZIHdoaWxlIGF0dHJpYnV0ZXMgYXJlIHdyaXRlLW9ubHk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBpbi13b3JrZmxvdyByZWFkIEFQSSB0b2RheSAoc2VlIHdvcmtmbG93LnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBcInN0cnVjdHVyYWwgdW50aWwgYSByZWFkIEFQSSBpcyBpbnRyb2R1Y2VkXCIpLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IHByZWxvYWRlZCBsb2cgY2FuJ3QgZGl2ZXJnZSBvbiBhIHJlYWQuIElmIGEgcmVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVBJIGlzIGV2ZXIgYWRkZWQgaXQgTVVTVCByZWFkIGZyb20gdGhpcyBzbmFwc2hvdCwgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBieSByZXBsYXlpbmcgcnVuX2NyZWF0ZWQvYXR0cl9zZXQgZXZlbnRzIOKAlCBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvJ3MgZW1wdHkgaW5pdGlhbCBsb2cgd291bGQgc3VyZmFjZSBzZWVkIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGB7fWAgb24gdGhlIGZpcnN0IGRlbGl2ZXJ5IG9ubHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArbm93O1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSB0aGUgYHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXNgIGRlY2xhcmF0aW9uIGFib3ZlOlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIHN5bnRoZXNpemVzIHRoZSBydW4gYmVmb3JlIHRoZSByZWFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCByZXNwb25zZSBsYW5kcywgc28gYW5jaG9yIFJTRlMgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGF0IGFuIGFjdHVhbCByZXNwb25zZSBpbnN0YW50LlxuICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSArbm93O1xuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdydW5uaW5nJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRSdW5TdGFydGVkQ3JlYXRlU3RhcnQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQocnVuU3RhcnRlZEV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQucnVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXZlbnQgY3JlYXRpb24gZm9yICdydW5fc3RhcnRlZCcgZGlkIG5vdCByZXR1cm4gdGhlIHJ1biBlbnRpdHkgZm9yIHJ1biBcIiR7cnVuSWR9XCJgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHJlc3VsdC5ydW47XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCA9IGNsYW1wTWF4RXZlbnRzKHJlc3VsdC5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5jaG9ycyBSU0ZTIOKAlCBzZWUgdGhlIGRlY2xhcmF0aW9uIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBpbmNsdWRlcyBldmVudHMsIHVzZSB0aGVtIHRvIHNraXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0IGNhbGwgYW5kIHJlZHVjZSBUVEZCLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzTW9yZSAhPT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cyA9IHJlc3VsdC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0N1cnNvciA9IHJlc3VsdC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd29ya2Zsb3dSdW4uc3RhcnRlZEF0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBoYXMgbm8gXCJzdGFydGVkQXRcIiB0aW1lc3RhbXBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW4gd2FzIGNvbmN1cnJlbnRseSBjb21wbGV0ZWQvZmFpbGVkL2NhbmNlbGxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yOiBydW4gd2FzIGNvbmN1cnJlbnRseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQvZmFpbGVkL2NhbmNlbGxlZCBkdXJpbmcgc2V0dXAuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1bkV4cGlyZWRFcnJvcjogcnVuIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGJvdGggY2FzZXMsIHNraXAgcHJvY2Vzc2luZyB0aGlzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIHNldHVwLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRmF0YWwgcnVudGltZSBlcnJvciBkdXJpbmcgd29ya2Zsb3cgc2V0dXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK3dvcmtmbG93UnVuLnN0YXJ0ZWRBdDtcblxuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHdvcmtmbG93UnVuLnN0YXR1cyksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93UnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JrZmxvdyBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgb3IgZmFpbGVkLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgYWxyZWFkeSBjb21wbGV0ZWQgb3IgZmFpbGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHdvcmtmbG93UnVuLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZm9yIGBjYW5jZWxgLCB3ZSBhY3R1YWxseSB3YW50IHRvIHByb3BhZ2F0ZSBhIFdvcmtmbG93Q2FuY2VsbGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgdGhlIHdvcmtmbG93IGNvbnRleHQgc28gdGhlIHVzZXIgY2FuIGdyYWNlZnVsbHkgZXhpdC4gdGhpcyBpcyBTSUdURVJNXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmdXJ0aGVybW9yZSwgdGhlcmUgc2hvdWxkIGJlIGEgdGltZW91dCBvciBhIHdheSB0byBmb3JjZSBjYW5jZWwgU0lHS0lMTFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBhY3R1YWxseSBleGl0IGhlcmUgd2l0aG91dCByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGF0IGFsbCwgaW4gdGhlIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGlzIGl0c2VsZiBmYWlsaW5nLlxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlIChub24tdHVyYm8gcnVuX3N0YXJ0ZWQpXG4gICAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiAoIXdvcmtmbG93UnVuKVxuXG4gICAgICAgICAgICAgICAgICAvLyBDb3ZlcnMgZXZlcnkgZmxvdyByZXBsYXkg4oCUIGluaXRpYWwgc3RhcnQsIHN0ZXAgY29tcGxldGlvbnMsXG4gICAgICAgICAgICAgICAgICAvLyBob29rIHJlc3VtcHRpb25zLCB3YWl0IGNvbXBsZXRpb25zIOKAlCBhbmQgc3RvcHMgYmVmb3JlIGFueVxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgY29kZSwgaW5saW5lIHN0ZXAsIG9yIGV2ZW50IHdyaXRlIGhhcHBlbnMgd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHJ1biBpcyBub3QgcGlubmVkIGhlcmUgKHNlZSBgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHlgKS5cbiAgICAgICAgICAgICAgICAgIC8vIGBhd2FpdFJ1blJlYWR5YCBvcmRlcnMgdHVyYm8ncyBgcnVuX3N0YXJ0ZWRgIGJlZm9yZSBlaXRoZXJcbiAgICAgICAgICAgICAgICAgIC8vIHN0b3BwaW5nIGFjdGlvbi5cbiAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAvLyBSdW5zIGFoZWFkIG9mIHRoZSBsYXp5LWhvb2sgcmUtZW5zdXJlIGJlbG93LCBzbyBhIG1pc3JvdXRlZFxuICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHdyaXRlcyBub3RoaW5nIGhlcmUg4oCUIHdoaWNoIG1lYW5zIHRoZSByZS1yb3V0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgbXVzdCBjYXJyeSBgaG9va0lucHV0YCwgb3IgYSByZXN1bWUgd2hvc2UgcHJvZHVjZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGhhZCBub3QgeWV0IGxhbmRlZCB3b3VsZCBiZSBsb3N0ICh0aGF0IHJlLWVuc3VyZSBpc1xuICAgICAgICAgICAgICAgICAgLy8gaWRlbXBvdGVudCBwZXIgYHJlc3VtZUlkYCwgc28gdGhlIHBpbm5lZCBkZXBsb3ltZW50IHN0aWxsXG4gICAgICAgICAgICAgICAgICAvLyBjb252ZXJnZXMgb24gb25lIGV2ZW50KS5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGd1YXJkRGVwbG95bWVudChcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oaG9va0lucHV0ID8geyBob29rSW5wdXQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdFJ1blJlYWR5XG4gICAgICAgICAgICAgICAgICAgICkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBMYXp5IGhvb2sgcmVzdW1lOiB0aGUgcHJvZHVjZXIgKHJlc3VtZUhvb2sgZmFzdCBwYXRoKVxuICAgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWxpemVkIHRoZSBgaG9va19yZWNlaXZlZGAgd3JpdGUgd2l0aCB0aGlzIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyBwdWJsaXNoLCBzbyB0aGUgZXZlbnQgbWF5IG5vdCBiZSBwZXJzaXN0ZWQgeWV0LiBJZGVtcG90ZW50bHlcbiAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBpdCBiZWZvcmUgcmVwbGF5IOKAlCBrZXllZCBieSBgcmVzdW1lSWRgIHNvIGFcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgcHJvZHVjZXIgd3JpdGUgY29udmVyZ2VzIG9uIGV4YWN0bHkgb25lIGV2ZW50XG4gICAgICAgICAgICAgICAgICAvLyAodGhlIHNlcnZlciByZXNvbHZlcyBhIG1hdGNoaW5nIGNsYWltIGFzIHN1Y2Nlc3MsIG5vdCBhblxuICAgICAgICAgICAgICAgICAgLy8gZXJyb3IpLiBgaG9va0lucHV0YCBuZXZlciByaWRlcyBhIHR1cmJvIGZpcnN0LWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyAodGhhdCBwYXRoIGNhcnJpZXMgYHJ1bklucHV0YCwgbm90IGBob29rSW5wdXRgKSwgc28gdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gb25seSBydW5zIG9uIHRoZSBub3JtYWwgbG9hZC1hbmQtcmVwbGF5IHBhdGguIFNraXBwZWRcbiAgICAgICAgICAgICAgICAgIC8vIGVudGlyZWx5IHdoZW4gdGhlIGZhc3QgcGF0aCBhYm92ZSBhbHJlYWR5IGVuc3VyZWQgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBldmVudCAoYGhvb2tFbnN1cmVkYCkg4oCUIHN1Y2Nlc3NmdWxseSBvciB2aWEgaXRzIGZhbGxiYWNrLFxuICAgICAgICAgICAgICAgICAgLy8gd2hvc2UgcnVuX3N0YXJ0ZWQgcHJlbG9hZCB3YXMgbG9hZGVkIGFmdGVyIHRoZSB3cml0ZSBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgZXZlbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoaG9va0lucHV0ICYmICFob29rRW5zdXJlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQZXJmIChPcHRpb24gQSk6IGlmIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGFscmVhZHkgbGFuZGVkIGluIHRoZSBydW5fc3RhcnRlZCBwcmVsb2FkLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2Fub25pY2FsIGV2ZW50IGlzIGluIHRoZSBsb2cgYW5kIHRoZSByZS1lbnN1cmUgcm91bmQgdHJpcFxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBwdXJlIG92ZXJoZWFkLiBTa2lwIGl0IHdoZW4gdGhlIHByZWxvYWQgYWxyZWFkeSBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgYGhvb2tfcmVjZWl2ZWRgIHdpdGggdGhpcyByZXN1bWUncyBwZXJzaXN0ZWQgYHJlc3VtZUlkYFxuICAgICAgICAgICAgICAgICAgICAvLyAodW5pcXVlIHBlciByZXN1bWUsIHNvIHdlIG5ldmVyIHNraXAgb24gYW4gdW5yZWxhdGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQpLiBCZXN0LWVmZm9ydDogdGhlIHdpbiBsYW5kcyBvbmx5IHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VyJ3Mgd3JpdGUgYmVhdCB0aGlzIGNvbnN1bWVyJ3MgbG9hZDsgb3RoZXJ3aXNlIHdlXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgaWRlbXBvdGVudCByZS1lbnN1cmUgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgdW5yZWFjaGFibGUgZm9yIGF0b21pYyBsYXp5IHJlc3VtZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gKHJlc3VtZUlkICsgZGlnZXN0KTogdGhvc2Ugc2V0IGBob29rRW5zdXJlZGAgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvaXN0ZWQgZmFzdCBwYXRoIGFib3ZlIOKAlCBvbiBzdWNjZXNzIEFORCBvbiBpdHNcbiAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sg4oCUIHNvIHRoaXMgYmxvY2sgKGFuZCB0aGUgc2tpcCBjaGVjaykgbm93IG9ubHlcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVzIGhvb2tJbnB1dCBzaGFwZXMgd2l0aG91dCB0aGUgZnVsbCBpZGVtcG90ZW5jeVxuICAgICAgICAgICAgICAgICAgICAvLyBwYWlyLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbHJlYWR5UHJlbG9hZGVkID1cbiAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cz8uc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5UHJlbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSBwcmVsb2FkZWQgbG9nIOKAlCBub3RoaW5nIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIG9yIHNwbGljZS5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlIHRoZSBtYXRlcmlhbGl6ZWQgZXZlbnQgdG8gd2hlbiB0aGUgcmVzdW1lIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb2NjdXJyZWQsIG5vdCB3aGVuIHRoaXMgcXVldWUgZGVsaXZlcnkgcmFuLiBgcmVzdW1lSWRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIFVMSUQgbWludGVkIGJ5IGByZXN1bWVIb29rKClgIGF0IHJlc3VtZSB0aW1lLCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBlbWJlZGRlZCB0aW1lc3RhbXAgaXMgdGhlIGhvbmVzdCBgb2NjdXJyZWRBdGAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgbGF0ZW5jeSBhdHRyaWJ1dGlvbiBvZmYgdGhlIHF1ZXVlIHJvdW5kIHRyaXAuIEFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBub24tVUxJRCByZXN1bWVJZCAobGVnYWN5IC8gdGVzdCkgc2ltcGx5IGxlYXZlcyBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZCwgc28gdGhlIFdvcmxkIGZhbGxzIGJhY2sgdG8gYGNyZWF0ZWRBdGAuXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VycmVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoZGVjb2RlVGltZShob29rSW5wdXQucmVzdW1lSWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGVuc3VyZWRFdmVudDogRXZlbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuc3VyZWQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rSW5wdXQuaG9va0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGhvb2tJbnB1dC50b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVJZDogaG9va0lucHV0LnJlc3VtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVBheWxvYWREaWdlc3Q6IGhvb2tJbnB1dC5wYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3VtZXItc2lkZSBjb21wbGV0aW9uIG9mIHRoZSByZWNvdmVyeSBwYXRoOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgbWF0ZXJpYWxpemVkIHRoZSBldmVudCBiZWNhdXNlIHRoZSBwcm9kdWNlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Qgd3JpdGUgaGFkIG5vdCBsYW5kZWQgaW4gdGhlIHByZWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuSG9va1Jlc2lsaWVudFJlc3VtZU1hdGVyaWFsaXplZCh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYW5vbmljYWwgZXZlbnQg4oCUIHdoZXRoZXIgdGhpcyBjYWxsIGNvbW1pdHRlZCBpdCBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVyZ2VkIG9uIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgd3JpdGUg4oCUIHNvIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGludG8gdGhlIHByZWxvYWRlZCBsb2cgaW5zdGVhZCBvZiBkaXNjYXJkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJlbG9hZCAoc2VlIGJlbG93KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvbnN0cnVjdCBgZXZlbnREYXRhYCBmcm9tIGBob29rSW5wdXRgIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVzdGluZyB0aGUgUE9TVCByZXNwb25zZSdzIHBheWxvYWQ6IHdvcmxkLXZlcmNlbCBwb3N0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3aXRoIGByZW1vdGVSZWZCZWhhdmlvcjogJ2xhenknYCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBldmVudCdzIHBheWxvYWQgaXMgYSBSZW1vdGVSZWYgKmRlc2NyaXB0b3IqLCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJpYWxpemVkIGJ5dGVzIHJlcGxheSBuZWVkcy4gYGhvb2tJbnB1dGAgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgdG9rZW4gKyBwYXlsb2FkIGJ5dGVzICh0aGV5IHJvZGUgdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSwgc28gc3BsaWNlIHRob3NlIG9udG8gdGhlIHJldHVybmVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWJsZSBldmVudElkL21ldGFkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlLWVuc3VyZSBhbHdheXMgcmV0dXJucyBhIGBob29rX3JlY2VpdmVkYCBldmVudCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcGxpY2UgaXMgc2FmZS4gVGhlIGNhc3QgaXMgbmVlZGVkIGJlY2F1c2Ugc3ByZWFkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmF3IGBFdmVudGAgdW5pb24gYW5kIG92ZXJyaWRpbmcgYGV2ZW50RGF0YWAgY29sbGFwc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIG5vbi1gaG9va19yZWNlaXZlZGAgbWVtYmVyICh3aG9zZSBgZXZlbnREYXRhYCBpcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgc2hhcGUpOyB0aGUgb2JqZWN0IGlzIGEgZ2VudWluZSBgaG9va19yZWNlaXZlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGJ5IGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBlbnN1cmVkLmV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlZEV2ZW50ID0gYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIEV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbWF0Y2hpbmcgY29uY3VycmVudCBjbGFpbSAoc2FtZSByZXN1bWVJZCArIGRpZ2VzdCkgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIGFzIHN1Y2Nlc3Mgc2VydmVyLXNpZGUgYW5kIG5ldmVyIHRocm93cywgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGNhdWdodCBoZXJlIGlzIGEgZ2VudWluZSB0ZXJtaW5hbCBvciB0cmFuc2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEhvb2tOb3RGb3VuZCAvIFJ1bkV4cGlyZWQ6IHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbHJlYWR5IGVuZGVkIHRoaXMgcmVzdW1lJ3MgZWxpZ2liaWxpdHkgKHRoZSBydW4gd2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0ZXJtaW5hbCkuIFRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZXN1bWUsIHNvIGNvbnN1bWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIG1lc3NhZ2UgYW5kIHN0b3AuIENvbnRpbnVpbmcgdG8gcmVwbGF5IHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdhc3RlZCB3b3JrIOKAlCBhbmQsIHdvcnNlLCB3b3VsZCBhY2sgYSBkZWxpdmVyeSB0aGF0IG1heVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjYXJyeSB0aGUgb25seSBjb3B5IG9mIHRoZSBwYXlsb2FkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBFbnRpdHlDb25mbGljdCAoYW5kIGFueSBvdGhlciB1bmV4cGVjdGVkIGVycm9yKTogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJlc3VtZUlkIGNvbnN0cmFpbnQgZXhpc3RzIGJ1dCB0aGUgbWF0Y2hpbmcgZXZlbnQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgbm90IHlldCBvYnNlcnZhYmxlIOKAlCB0aGUgcHJvZHVjZXIncyBwYXJhbGxlbCB3cml0ZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBzdGlsbCBpbiBmbGlnaHQsIG9yIGEgcmVkcml2ZSByYWNlZCB0aGUgY2xhaW0uIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdHJhbnNpZW50OiByZXRocm93IHNvIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIGFuZCBhIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGF0dGVtcHQgY29udmVyZ2VzIG9uIHRoZSBjb21taXR0ZWQgZXZlbnQgaW5zdGVhZCBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICByZXBsYXlpbmcgKGFuZCBhY2tpbmcpIHdpdGhvdXQgdGhlIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBydW5fc3RhcnRlZCByZXNwb25zZSBwcmVsb2FkZWQgdGhlIGxvZyBCRUZPUkUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSwgc28gaXQgY2Fubm90IGluY2x1ZGUgdGhlIGhvb2tfcmVjZWl2ZWQuIFJhdGhlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gZGlzY2FyZCB0aGUgcHJlbG9hZCAod2hpY2ggd291bGQgY29zdCBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qgcm91bmQgdHJpcCBvbiB0aGUgZmlyc3QgcmVwbGF5IGl0ZXJhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGluIHRoZSBjYW5vbmljYWwgZXZlbnQgcmVjb25zdHJ1Y3RlZCBhYm92ZS4gSXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIGEgc3RhYmxlIGV2ZW50SWQsIHNvIGBpbnNlcnRFdmVudEJ5RXZlbnRJZGAga2VlcHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbiBhc2NlbmRpbmcgZXZlbnRJZCBvcmRlciAocHJlbG9hZGVkRXZlbnRzIGxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgc29ydE9yZGVyOiAnYXNjJ2AgYW5kIGFyZSBub3QgcmUtc29ydGVkIGNsaWVudC1zaWRlKSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBpZGVtcG90ZW50IGV2ZW4gaWYgYSBsYXRlciBsaXN0IHJlLW9ic2VydmVzIGl0LiBPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgV29ybGQgcmV0dXJucyBubyBldmVudCAob2xkZXIgYmFja2VuZCkgZG8gd2UgZmFsbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gZHJvcHBpbmcgdGhlIHByZWxvYWQgc28gYSBmcmVzaCBsaXN0IG9ic2VydmVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVsb2FkZWRFdmVudHMgJiYgZW5zdXJlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRFdmVudEJ5RXZlbnRJZChwcmVsb2FkZWRFdmVudHMsIGVuc3VyZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0N1cnNvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlIChyZS1lbnN1cmUgbmVlZGVkKVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleSBmb3IgdGhpcyBydW4ncyBkZXBsb3ltZW50LlxuICAgICAgICAgICAgICAgICAgLy8gVXNlZCBlYWdlcmx5IGhlcmUgc2luY2UgYm90aCB3b3JrZmxvdyBleGVjdXRpb24gKGlucHV0XG4gICAgICAgICAgICAgICAgICAvLyBoeWRyYXRpb24gLyBob29rIHBheWxvYWQgZGVjcnlwdGlvbikgYW5kIHRoZSBydW5fZmFpbGVkXG4gICAgICAgICAgICAgICAgICAvLyBkZWh5ZHJhdGUgcGF0aCBiZWxvdyBuZWVkIGl0LiBNZW1vaXplZCBhY2Nlc3NvcjogZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdHJpZ2dlcnMgdGhlIGFjdHVhbCBmZXRjaCAvIEhLREYgZGVyaXZhdGlvbixcbiAgICAgICAgICAgICAgICAgIC8vIHN1YnNlcXVlbnQgY2FsbHMgYXdhaXQgdGhlIGNhY2hlZCBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KFxuICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBJbnZvY2F0aW9uLXNjb3BlZCBjYWNoZSBvZiBWTS1pbmRlcGVuZGVudCBwcmVwYXJlZCBwYXlsb2Fkc1xuICAgICAgICAgICAgICAgICAgLy8gYW5kIGltbXV0YWJsZSBmaW5hbCB2YWx1ZXMuIEl0IHN1cnZpdmVzIHRoZSBmcmVzaCB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgLy8gVk0gY3JlYXRlZCBieSBlYWNoIGlubGluZSByZXBsYXksIGJ1dCBuZXZlciBjcm9zc2VzIHJ1bnMgb3JcbiAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIGRlbGl2ZXJpZXMuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlQYXlsb2FkQ2FjaGUgPSBuZXcgUmVwbGF5UGF5bG9hZENhY2hlKFxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUaGUgbGl2ZSBWTSBwYXJrZWQgYXQgdGhlIHByZXZpb3VzIGJvdW5kYXJ5LCB3aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gcmV0ZW50aW9uIGRlY2lzaW9uIGtlcHQgaXQuIG51bGwg4oaSIHRoaXMgaXRlcmF0aW9uIGNvbGQtXG4gICAgICAgICAgICAgICAgICAvLyByZXBsYXlzLiBJbnZvY2F0aW9uLXNjb3BlZDogZGllcyB3aXRoIHRoaXMgZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICBsZXQgcmV0YWluZWRTZXNzaW9uOiBXb3JrZmxvd1Nlc3Npb24gfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgLy8gTWFpbiByZXBsYXkgbG9vcFxuICAgICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3Mvbm9Db25zdGFudENvbmRpdGlvbjogaW50ZW50aW9uYWwgbG9vcFxuICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbisrO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheS1idWRnZXQgY2hlY2s6IGJhaWwgb3V0IChyZXRyeSBvciBmYWlsKSBpZlxuICAgICAgICAgICAgICAgICAgICAvLyBub24tc3RlcCB0aW1lIHdpdGhpbiB0aGlzIGludm9jYXRpb24gaGFzIGV4Y2VlZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb25maWd1cmVkIGJ1ZGdldC4gU3RlcCBib2RpZXMgYXJlIGV4Y2x1ZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVwbGF5QnVkZ2V0LnBhdXNlKCkvcmVzdW1lKCkgYnJhY2tldCBldmVyeVxuICAgICAgICAgICAgICAgICAgICAvLyBgZXhlY3V0ZVN0ZXBgIGNhbGwuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYXlCdWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW1pdE1zOiByZXBsYXlCdWRnZXQuY29uZmlndXJlZExpbWl0TXMsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gT24gVmVyY2VsLCBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQgYWx3YXlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdHMgdGhlIHByb2Nlc3MuIE9uIGxvY2FsIGRldiBpdCByZXR1cm5zOyB3ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCBhbmQgdGhlIHJlcXVlc3QgZW5kcyBub3JtYWxseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChydW5fZmFpbGVkIGhhcyBiZWVuIHdyaXR0ZW4gYmVzdC1lZmZvcnQpLlxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRpbWVvdXQgYmVmb3JlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGludm9jYXRpb25TdGFydFRpbWUgPj1cbiAgICAgICAgICAgICAgICAgICAgICBub0lubGluZVJlcGxheUFmdGVyTXNcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1YyIHRpbWVvdXQgcmVhY2hlZCwgcmUtc2NoZWR1bGluZyB3b3JrZmxvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBpbnZvY2F0aW9uU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5U3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJzb3Igb2YgdGhpcyBpdGVyYXRpb24ncyBldmVudCBsb2cgYmVmb3JlIGFueSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGFkdmFuY2UgaXQg4oCUIGRlY2xhcmVkIGF0IHRyeSBzY29wZSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBjYXRjaCAod2hpY2ggcnVucyB0aGUgaW5saW5lIHN0ZXApIGNhbiByZWFkIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBgc2luY2VDdXJzb3JgIGZvciB0aGUgaW5saW5lLWRlbHRhIG9wdGltaXphdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZUlubGluZVdyaXRlQ3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAtLS0gUXVpY2tKUyBWTSBlbmdpbmUgZGlzcGF0Y2ggLS0tXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFF1aWNrSlMgZW5naW5lIChvcHQtaW4gdmlhIFdPUktGTE9XX1ZNPXF1aWNranNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvciBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Vm0pIGlzIGEgc2VsZi1jb250YWluZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbHRlcm5hdGl2ZSB0byB0aGUgbm9kZTp2bSBpbmxpbmUtcmVwbGF5IGxvZ2ljXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cuIEl0IHBlcmZvcm1zIHRoZSBzYW1lIGZ1bGwgZXZlbnQgcmVwbGF5LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5zIHRoZSB3b3JrZmxvdyBjb2RlIGluIGEgUXVpY2tKUyBXQVNNIFZNLCBxdWV1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwcyB2aWEgdGhlIHNhbWUgY29tYmluZWQgcm91dGUgKHNvIHRoZXkgaGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZVN0ZXAgYmVsb3cgb24gcmUtZW50cnkpLCBhbmQgbWFuYWdlcyBpdHMgb3duXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX2NvbXBsZXRlZCAvIHJ1bl9mYWlsZWQgbGlmZWN5Y2xlIGZvciB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG91dGNvbWVzLiBXaGVuIHRoZSBRdWlja0pTIGVuZ2luZSBpcyBpbiBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGRpc3BhdGNoLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IElOU0lERSB0aGlzIHRyeTogZW5naW5lIGZhaWx1cmVzIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGUgdGhlIGVudHJ5cG9pbnQgKE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IsIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBXQVNNIE9PTSBhdCB0aGUgbWVtb3J5IGNlaWxpbmcsIGEgYnVuZGxlLWV2YWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlKSBtdXN0IHJlYWNoIHRoaXMgbG9vcCdzIGNhdGNoIHNvIHRoZXkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3NpZmllZCBhbmQgcmVjb3JkZWQgYXMgcnVuX2ZhaWxlZCDigJQgb3V0c2lkZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdGhleSB3b3VsZCBuYWNrIHRoZSBtZXNzYWdlIGFuZCBidXJuIGFsbCBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcmllcyBiZWZvcmUgZHlpbmcgYXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBNQVhfREVMSVZFUklFU19FWENFRURFRC4gVHJhbnNpZW50IHdvcmxkIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIHJldGhyb3cgb3V0IG9mIHRoZSBjYXRjaCBmb3IgcmVkZWxpdmVyeSwgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIG5vZGUtZW5naW5lIHJlcGxheSBmYWlsdXJlcy5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlUXVpY2tKU1ZtKHdvcmtmbG93UnVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnVXNpbmcgUXVpY2tKUyBWTSBlbmdpbmUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmRlciB0dXJibywgcnVuX3N0YXJ0ZWQgaXMgYmFja2dyb3VuZGVkLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFF1aWNrSlMgZW50cnlwb2ludCBmZXRjaGVzIHRoZSBldmVudCBsb2cgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgZXZlbnRzIGRpcmVjdGx5LCBzbyB3YWl0IGZvciB0aGUgcnVuIHRvIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmx5IHN0YXJ0ZWQgZmlyc3Qg4oCUIGl0IGRvZXMgbm90IHRocmVhZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIHJ1blJlYWR5QmFycmllciB0aGUgd2F5IGhhbmRsZVN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXp5IGltcG9ydDogdGhlIFF1aWNrSlMgZW50cnlwb2ludCdzIGltcG9ydCBjaGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1iZWRzIHRoZSBiYXNlNjQgV0FTTSBiaW5hcnkgKyBleHRlbnNpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAofjEuMyBNQiBkZWNvZGVkIGF0IG1vZHVsZSBzY29wZSkuIExvYWRpbmcgaXQgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgdGhhdCBvdXQgb2Ygbm9kZS1lbmdpbmUgZGVwbG95bWVudHMgZW50aXJlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOKAlCBvbmx5IHRoZSBvcHQtaW4gcGF0aCBwYXlzLCBvbiBmaXJzdCBkaXNwYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnLi9ydW50aW1lL3F1aWNranMtZW50cnlwb2ludC5qcydcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWlja2pzUmVzdWx0ID0gYXdhaXQgcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFNwYW46IHNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZS1zdGVwIG93bmVyc2hpcCBwbHVtYmluZzogcmVkZWxpdmVyaWVzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVzc2FnZSBkcml2ZSBjcmFzaCByZWNvdmVyeSBmb3Igc3RlcHMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFybGllciBpbnZvY2F0aW9uIGNsYWltZWQgaW5saW5lIChzZWUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wIHBhc3MgaW4gdGhlIGVudHJ5cG9pbnQncyBsb29wKSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIGlkIGlzIHN0YW1wZWQgYXMgYG93bmVyTWVzc2FnZUlkYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbmxpbmUgbGF6eSBzdGVwIGNsYWltcyBzbyB3YWtlIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXIgdG8gdGhlIGluLWZsaWdodCBib2R5IGluc3RlYWQgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVpY2tqc1Jlc3VsdD8udGltZW91dFNlY29uZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYHJlaW52b2tlYCByYXRoZXIgdGhhbiByZXR1cm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHsgdGltZW91dFNlY29uZHMgfWAgZGlyZWN0bHk6IHVuZGVyIHR1cmJvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXRgIGFuZCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2NoZWR1bGUgd291bGQgcmUtZW5nYWdlIHR1cmJvIG9uIHJlZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHJlcGxheWluZyBhZ2FpbnN0IGEgc3RhbGUgcHJlbG9hZGVkIGxvZyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VkZ2luZyB0aGUgcnVuIOKAlCBzZWUgdGhlIHJlaW52b2tlKCkgZG9jc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm92ZSkuIHJlaW52b2tlIGVucXVldWVzIGFuIGV4cGxpY2l0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiB3aXRob3V0IGBydW5JbnB1dGAgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UocXVpY2tqc1Jlc3VsdC50aW1lb3V0U2Vjb25kcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBldmVudHMg4oCUIHVzZSBjYWNoZWQgZXZlbnRzIHdpdGggaW5jcmVtZW50YWwgZmV0Y2ggb24gc3Vic2VxdWVudCBpdGVyYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgYSBjdXJzb3Igd2hlbiB0aGVyZSBhcmUgZXZlbnRzIChldmVuIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsIHBhZ2UpLCBzbyB3ZSBjYW4gcmVsaWFibHkgdXNlIGl0IGZvciBpbmNyZW1lbnRhbCBsb2FkaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIGxldCBldmVudHM6IEV2ZW50W107XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdJbmxpbmVEZWx0YSAmJiBjYWNoZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogdGhlIHByZXZpb3VzIGl0ZXJhdGlvbidzIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSByZXR1cm5lZCB0aGUgYXV0aG9yaXRhdGl2ZSBldmVudC1sb2dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbHRhIHNpbmNlIHRoZSBwcmUtd3JpdGUgY3Vyc29yLCBzbyB3ZSBjb25zdW1lIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIGluc3RlYWQgb2YgaXNzdWluZyBhbiBpbmNyZW1lbnRhbCBldmVudHMubGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWx0YSBpcyBieXRlLWZvci1ieXRlIHdoYXQgZXZlbnRzLmxpc3QoY3Vyc29yKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgaGF2ZSByZXR1cm5lZCBhdCB3cml0ZSB0aW1lIOKAlCBpdCBpbmNsdWRlcyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyJ3Mgb3duIHN0ZXAgZXZlbnRzLCBhbnkgYXR0cl9zZXQgdGhlIHN0ZXAgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvdGUsIGFuZCBhbnkgaW4tYmFuZCBldmVudHMgKGUuZy4gaG9va19yZWNlaXZlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRfY29tcGxldGVkKSBhbm90aGVyIHdyaXRlciBhcHBlbmRlZCBzaW5jZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciDigJQgc28gc2tpcHBpbmcgdGhlIGZldGNoIGNhbm5vdCBkcm9wIGV2ZW50cyBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tldyB0aGUgcHJlZml4IGZyb20gdGhlIHNlcnZlcidzIGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gcGVuZGluZ0lubGluZURlbHRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0lubGluZURlbHRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFVuaXF1ZUV2ZW50cyhjYWNoZWRFdmVudHMsIGRlbHRhLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBkZWx0YS5jdXJzb3IgPz8gZXZlbnRzQ3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FjaGVkRXZlbnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBpdGVyYXRpb246IHVzZSBwcmVsb2FkZWQgZXZlbnRzIGlmIGF2YWlsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBkbyBhIGZ1bGwgbG9hZCB3aXRoIGN1cnNvci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVsb2FkZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gcHJlbG9hZGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBwcmVsb2FkZWRFdmVudHNDdXJzb3IgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudHNDdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YnNlcXVlbnQgaXRlcmF0aW9uOiBmZXRjaCBvbmx5IG5ldyBldmVudHMgc2luY2UgbGFzdCBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZHVwZSBieSBldmVudElkOiBhIHByZXZpb3VzIGl0ZXJhdGlvbiBtYXkgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kZWQgYSByZWZyZXNoZWQgd2FpdC1jb21wbGV0aW9uIGRlbHRhIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgbG9vcCBvYnNlcnZlcyB0aGUgYWR2YW5jZWQgY3Vyc29yLCBzbyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgZmV0Y2ggY2FuIHJldHVybiBldmVudHMgd2UgYWxyZWFkeSBoYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVW5pcXVlRXZlbnRzKGNhY2hlZEV2ZW50cywgbG9hZGVkLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZWxvYWRlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0aW9uIDIgYWZ0ZXIgaXRlcmF0aW9uIDEgdXNlZCBwcmVsb2FkZWQgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAod2hpY2ggZG9uJ3QgY2FycnkgYSBjdXJzb3IpLiBEbyBhIGZ1bGwgbG9hZCBub3cgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgdXAgYW55IGV2ZW50cyB3cml0dGVuIHNpbmNlIHRoZSBwcmVsb2FkZWQgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgb2J0YWluIGEgY3Vyc29yIGZvciBzdWJzZXF1ZW50IGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2Fkcy4gVGhpcyBpcyB0aGUgZXhwZWN0ZWQgcGF0aCwgbm90IGEgYnVnLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGN1cnNvciBhZnRlciBwcmVsb2FkZWQtZXZlbnRzIGZpcnN0IGl0ZXJhdGlvbjsgZG9pbmcgZnVsbCByZWxvYWQgdG8gcGljayB1cCBjdXJzb3IuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBjdXJzb3IgYXZhaWxhYmxlIGRlc3BpdGUgaGF2aW5nIGNhY2hlZCBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBubyBwcmVsb2FkZWQtZXZlbnRzIGV4cGxhbmF0aW9uLiBBbGwgV29ybGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gcmV0dXJuIGEgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSBldmVudHMsIHNvIHRoaXMgc2lnbmFscyBhIGJ1ZyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdvcmxkLiBGYWxsIGJhY2sgdG8gYSBmdWxsIHJlbG9hZCB0byBhdm9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhbGUgZGF0YS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGN1cnNvciBtaXNzaW5nIGFmdGVyIGluaXRpYWwgbG9hZCDigJQgZmFsbGluZyBiYWNrIHRvIGZ1bGwgcmVsb2FkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4gdGhlIFdvcmxkIGltcGxlbWVudGF0aW9uLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBQdWJsaXNoIHRoZSBzbmFwc2hvdCB0byB0aGUgbG9vcC1zY29wZWQgY2FjaGUgYXMgc29vblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGl0IGlzIGxvYWRlZCwgbm90IGp1c3QgYXQgdGhlIGVuZCBvZiB0aGUgaXRlcmF0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIHRocm93biBieSB0aGUgd2FpdC1jb21wbGV0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGJlbG93IHJlc3RhcnRzIHRoZSByZXBsYXksIGFuZCB0aGF0IHJlc3RhcnQgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBjb25zdW1lIGEgV29ybGQtYXR0YWNoZWQgZXZlbnQgZGVsdGEgd2hlbiB0aGVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGEgY2FjaGVkIGFycmF5IHRvIG1lcmdlIGl0IGludG8uIFJlYXNzaWduZWQgYWdhaW4gYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCBwYXNzLCB3aGljaCBtYXkgc3dhcCBpbiBhIGZyZXNobHkgbG9hZGVkIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGV2ZW50cztcblxuICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByZWNvbmRpdGlvblJlc3RhcnRSZWxvYWQoZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBjb25jdXJyZW50IGNvbXBsZXRpb24gdmlhIHRoZSBldmVudCBsb2c6IGlmXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW55IG90aGVyIGhhbmRsZXIgd3JvdGUgYSB0ZXJtaW5hbCBydW4gZXZlbnQsIGV4aXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZG9pbmcgcmVwbGF5IHdvcmsuIFRoZSBydW4gZW50aXR5J3Mgc3RhdHVzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIHRoZXNlIGV2ZW50cywgc28gY2hlY2tpbmcgdGhlIGxvZyBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZXMgdXMgdGhlIHNhbWUgc2lnbmFsIGFzIGEgcnVucy5nZXQoKSByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgZXh0cmEgcmVxdWVzdCBwZXIgbG9vcCBpdGVyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHNcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0c1RvQ29tcGxldGUgPSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk6IGUgaXMgRXh0cmFjdDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGV2ZW50VHlwZTogJ3dhaXRfY3JlYXRlZCcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+ICYgeyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY29ycmVsYXRpb25JZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbXBsZXRlZFdhaXRJZHMuaGFzKGUuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPj0gKGUuZXZlbnREYXRhLnJlc3VtZUF0IGFzIERhdGUpLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGUuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lQXQ6IGUuZXZlbnREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB3YWl0RXZlbnQgb2Ygd2FpdHNUb0NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh3YWl0RXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXMoZXZlbnRzLCBldmVudHNDdXJzb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dhaXQgYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0c1RvQ29tcGxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV2ZW50IGxpc3QgYWJvdmUgbWF5IGJlIHN0YWxlIGJ5IHRoZSB0aW1lIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgaXMgY29tbWl0dGVkLiBMb2FkIG9ubHkgZXZlbnRzIGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgc25hcHNob3QgY3Vyc29yIHNvIGNvbmN1cnJlbnQgZHVyYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLCBzdWNoIGFzIGhvb2tfcmVjZWl2ZWQsIGtlZXAgdGhlaXIgb3JkZXJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aXZlIHRvIHdhaXRfY29tcGxldGVkLiBGYWxsIGJhY2sgdG8gYSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgZm9yIG9sZGVyIHdvcmxkcyB0aGF0IGNhbm5vdCBnaXZlIHVzIGEgc3RhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJzb3IsIG9yIGlmIHRoZSBjdXJzb3IgZGVsdGEgZG9lcyBub3QgaW5jbHVkZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgY29tcGxldGlvbiB0aGlzIGhhbmRsZXIganVzdCBhdHRlbXB0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRzQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkc0FmdGVyQ3Vyc29yID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F3QWxsV2FpdENvbXBsZXRpb25zID0gd2FpdHNUb0NvbXBsZXRlLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RXZlbnQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXdBbGxXYWl0Q29tcGxldGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRVbmlxdWVFdmVudHMoZXZlbnRzLCBsb2FkZWQuZXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wbGV0aW5nIGVsYXBzZWQgd2FpdHMgcmVmcmVzaGVzIHRoZSBldmVudCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbmN1cnJlbnQgaGFuZGxlciBtYXkgaGF2ZSB3cml0dGVuIHRoZSB0ZXJtaW5hbCBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBhZnRlciB0aGUgaW5pdGlhbCBzbmFwc2hvdCBidXQgYmVmb3JlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkuIE9uY2UgdGhlIGV2ZW50IGxvZyByZWNvcmRzIHRoYXQgb3V0Y29tZSwgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IGlzIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50LWxpbWl0IGd1YXJkOiBmYWlsIGEgcnVuYXdheSBydW4gb25jZSBpdHMgbG9nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVhY2hlcyB0aGUgc2VydmVyLXN1cHBsaWVkIGNlaWxpbmcgKHVuZGVmaW5lZCDih5Igbm9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbmZvcmNlbWVudCkuIFRoZSB0aHJvdyBpcyBjYXVnaHQgYmVsb3cgYW5kIHdyaXR0ZW4gYXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fZmFpbGVkIC8gTUFYX0VWRU5UU19FWENFRURFRC5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMubGVuZ3RoID49IG1heEV2ZW50c0xpbWl0XG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHJlZmVyZW5jZSAobWF5IGhhdmUgYmVlbiBzZXQgZm9yIGZpcnN0IHRpbWUpXG4gICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gZXZlbnRzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnk6IGp1ZGdlIFRURlMgZWxpZ2liaWxpdHkgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uJ3MgZmlyc3Qgc25hcHNob3QuIFdhaXRzIGNvbXBsZXRlZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGFscmVhZHkgZGlzcXVhbGlmeSB2aWEgdGhlIGV2ZW50LXR5cGUgY2hlY2ssIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZhbHVhdGluZyBhZnRlciB0aGUgd2FpdCBwYXNzIGlzIGVxdWl2YWxlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXR0cl9zZXQgaXMgcGVybWl0dGVkOiBhIHJlZGVsaXZlcnkgY2FuIGxhbmQgYWZ0ZXIgYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCBwcmUtc3RlcCBhdHRyX3NldCwgYW5kIHRoZSBkZXRvdXIgaXQgbWFya3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdWJ0cmFjdGVkIHZpYSBwcmVTdGVwQXR0clN0YXJ0TXMgcmVnYXJkbGVzcyBvZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQgKHNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cykuXG4gICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiA/Pz0gZXZlbnRzLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnXG4gICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBjdXJzb3IgYXMgaXQgc3RhbmRzIGZvciB0aGlzIGl0ZXJhdGlvbidzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9nLCBiZWZvcmUgYW55IGlubGluZSB3cml0ZXMgKHN0ZXBfY3JlYXRlZCB2aWFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVTdXNwZW5zaW9uLCBzdGVwX3N0YXJ0ZWQvc3RlcF9jb21wbGV0ZWQgdmlhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZVN0ZXApIGFkdmFuY2UgaXQuIFRoaXMgaXMgdGhlIGBzaW5jZUN1cnNvcmBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kZWQgdG8gYSBzdXBwb3J0aW5nIFdvcmxkIG9uIHRoZSBpbmxpbmUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgc28gaXQgY2FuIHJldHVybiB0aGUgZXZlbnQtbG9nIGRlbHRhIOKAlFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxldHRpbmcgdGhlIG5leHQgaXRlcmF0aW9uIHNraXAgdGhlIGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3QuIENhcHR1cmVkIGhlcmUgYmVjYXVzZSBub3RoaW5nIGJldHdlZW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IGFuZCB0aGUgaW5saW5lIGV4ZWN1dGVTdGVwIG11dGF0ZXMgZXZlbnRzQ3Vyc29yLlxuICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yID0gZXZlbnRzQ3Vyc29yO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgd29ya2Zsb3cgZXhlY3V0aW9uJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1vZGU6IHJldGFpbmVkU2Vzc2lvbiA/ICdyZXRhaW5lZCcgOiAncmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgZXZlcnkgbWlzc2luZyBkZWNyeXB0L2RlY29tcHJlc3Mgb3BlcmF0aW9uIHVwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbnQgKGFscmVhZHktcHJlcGFyZWQgcGF5bG9hZHMgYXJlIHNraXBwZWQpLiBXZWJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBDcnlwdG8gd29yayBvdmVybGFwcyBWTSBzZXR1cCBvbiB0aGUgcmVwbGF5IHBhdGggYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFwcGVuZGVkIGV2ZW50cycgY29uc3VtcHRpb24gb24gdGhlIHJlc3VtZSBwYXRoO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWVycyBzdGlsbCBkZXNlcmlhbGl6ZSBhbmQgcmVzb2x2ZSBpbiBldmVudCBvcmRlci5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkUHJld2FybSA9IHJlcGxheVBheWxvYWRDYWNoZS5wcmV3YXJtKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1Jlc3VsdDogV29ya2Zsb3dSZXN1bWVSZXN1bHQgPSByZXRhaW5lZFNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gYXdhaXQgcmVzdW1lV29ya2Zsb3cocmV0YWluZWRTZXNzaW9uLCBldmVudHMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgdHlwZTogJ3JlcGxheScgfTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd1Jlc3VsdC50eXBlID09PSAncmVwbGF5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UmVzdWx0ID0gYXdhaXQgcmVwbGF5V29ya2Zsb3coe1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IHRoZSBlbmQtb2YtcnVuIGRyYWluIGluc2lkZSB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24gY29tbWl0cyBmaXJlLWFuZC1mb3JnZXQgYCpfY3JlYXRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIGJlZm9yZSB0aGUgdGVybWluYWwgYGF3YWl0UnVuUmVhZHkoKWAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDYXBhYmlsaXRpZXM6IHdvcmxkLmNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwYXlsb2FkUHJld2FybTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd1Jlc3VsdC50eXBlID09PSAnc3VzcGVuZGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyayB0aGUgbGl2ZSBzZXNzaW9uOyB0aGUgc3VzcGVuc2lvbiBjYXRjaCBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgdGhlIG9uZSByZXRlbnRpb24gZGVjaXNpb24g4oCUIGtlZXAgaXQgZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpdGVyYXRpb24gb3IgZGlzY2FyZCBpdCBmb3IgYSBmcmVzaCByZXBsYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSB3b3JrZmxvd1Jlc3VsdC5zZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgd29ya2Zsb3dSZXN1bHQuc3VzcGVuc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB3b3JrZmxvd1Jlc3VsdC5vdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnV29ya2Zsb3cgZXhlY3V0aW9uIGNvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiBEYXRlLm5vdygpIC0gcmVwbGF5U3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Nb2RlOiByZXRhaW5lZFNlc3Npb24gPyAncmV0YWluZWQnIDogJ3JlcGxheScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5hY3RpdmF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgY29tcGxldGVkLiBTZW5kIHRoZSBzbmFwc2hvdCBidXQgZG8gTk9UXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkLWFuZC1yZXRyeSB0aGUgY3JlYXRlIGluIHBsYWNlOiBgcmVzdWx0YCB3YXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlZCBieSB0aGlzIHJlcGxheSwgc28gYSBzdGFsZSAoNDEyKSByZWplY3Rpb24gbXVzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIGEgKmZyZXNoIHJlcGxheSogKHdoaWNoIG1heSBvYnNlcnZlIHRoZSBuZXcgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcHJvZHVjZSBhIGRpZmZlcmVudCByZXN1bHQpLCBub3QgcmUtY29tbWl0IHRoZSBzdGFsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdC4gVGhlIGNhdGNoIGJlbG93IHJlc3RhcnRzIHRoZSByZXBsYXkgaW4tcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGEgd29ya2Zsb3cgdGhhdCBmaW5pc2hlcyB3aXRoIG5vIHN0ZXBzIHJlYWNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgYmVmb3JlIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQ7IG9yZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgYWZ0ZXIgaXQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHsgb3V0cHV0OiByZXN1bHQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5wcmVjb25kaXRpb25TbmFwc2hvdFBhcmFtcyhldmVudHMsIGV2ZW50c0N1cnNvciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgY29tcGxldGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnY29tcGxldGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoV29ya2Zsb3dTdXNwZW5zaW9uLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5bmNocm9ub3VzIHdvcmtmbG93LWV4ZWN1dGlvbiBkdXJhdGlvbiBmb3IgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBvbmx5IOKAlCBhbmNob3JzIHRoZSBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsZW1ldHJ5IGZpZWxkIGJlbG93IChzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXMpLiBUaGlzIGlzIHRoZSBGSU5BTFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHBhc3MsIHRoZSBvbmUgdGhhdCByZWFjaGVkIGFuZCBzY2hlZHVsZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBzdGVwOiB2YWxpZCByc2ZzIHBhdGhzIGNhbiByZXBsYXkgbW9yZSB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcCAoZS5nLiBhIHdvcmtmbG93LWJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzZXRBdHRyaWJ1dGVzKClgIGRldG91ciByZXBsYXlzIHR3aWNlKSwgYW5kIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnkgb21pdHMgZWFybGllciBpbnZvY2F0aW9ucycgcmVwbGF5IHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGlyZWx5LiBUaGlzIHZhbHVlIGlzIE5PVCBhY2N1bXVsYXRlZCBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRob3NlIGVhcmxpZXIgcGFzc2VzLCBzbyBpdCBtdXN0IG5vdCBiZSByZWFkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZiByc2ZzXCIg4oCUIHJzZnMgY292ZXJzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hvbGUgcnVuX3N0YXJ0ZWQtdG8tZmlyc3Qtc3RlcCB3aW5kb3c7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbFNjaGVkdWxpbmdSZXBsYXkgY292ZXJzIG9ubHkgdGhpcyBsYXN0IHBhc3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXB0dXJlZCBoZXJlLCBiZWZvcmUgYGhhbmRsZVN1c3BlbnNpb25gJ3MgYXdhaXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSS9PLCBzbyBpdCBleGNsdWRlcyB0aGF0IEkvTy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGR1cGxpY2F0ZXMgd2hhdCBPVEVMIGFscmVhZHkgY2FwdHVyZXMgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4vaW52b2NhdGlvbiBzcGFuLCBidXQgaXMgY29sbGVjdGVkIGFzIGNsaWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsZW1ldHJ5IHNvIHRoZSBzZXJ2ZXIgY2FuIGVtaXQgaXQgYXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVOU0FNUExFRCwgZnVsbC1wb3B1bGF0aW9uIG1ldHJpYzogd29ya2Zsb3ctc2VydmVyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciBzcGFucyBhcmUgaGVhdmlseSBzYW1wbGVkIGluIHByb2R1Y3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh+NyUpLCBhbmQgY2xpZW50IHNwYW5zIGNhbid0IGJlIGZpbHRlcmVkIGJ5IFNES1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbiwgc28gbmVpdGhlciBjYW4gc2VydmUgYXMgdGhlIGRhc2hib2FyZCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFjdCBUVEZTIGRlY29tcG9zaXRpb24uIE9uIGEgcmV0YWluZWQtVk1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSB0aGlzIG1lYXN1cmVzIHRoZSByZXN1bWUgKHR5cGljYWxseSB+MG1zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIHJlcGxheSwgc28gdGhlIGZpZWxkJ3MgZGlzdHJpYnV0aW9uIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiaW1vZGFsIG9uY2UgcmV0ZW50aW9uIGlzIGFjdGl2ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheUR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gcmVwbGF5U3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogcmVwbGF5RHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHM6IGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzOiBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0czogZXJyLndhaXRDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKHN1c3BlbnNpb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVjI6IGhhbmRsZSBzdXNwZW5zaW9uIHdpdGhvdXQgcXVldWluZyBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggZXZlbnQgY3JlYXRpb24gaW5zaWRlIGhhbmRsZVN1c3BlbnNpb24gY2FycmllcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWNvbmRpdGlvbiBzbmFwc2hvdCBvZiB0aGUgbG9hZGVkIGV2ZW50IGxvZywgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCBob2xkaW5nIGFuIGV2ZW50IHRoaXMgcmVwbGF5IG5ldmVyIHNhdyByZWplY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd3JpdGUgKDQxMikgaW5zdGVhZCBvZiBhY2NlcHRpbmcgYSBkaXZlcmdlbnQgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlamVjdGlvbiBpcyBoYW5kbGVkIGhlcmUsIGJ5IHJlc3RhcnRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkg4oCUIG5ldmVyIGJ5IHJlLXBvc3RpbmcgdGhlIHNhbWUgZXZlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNuYXBzaG90IHJlZnJlc2ggYWJvdmUgYWx3YXlzIHNldHMgY2FjaGVkRXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHJlcGxheSBjYW4gc3VzcGVuZC4gUmUtbmFycm93IGl0IGZvciB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXRjaCBzY29wZSBpbnN0ZWFkIG9mIGRlZmF1bHRpbmcgdG8gYW4gZW1wdHkgYXJyYXk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGZhbGxiYWNrIHdvdWxkIHNpbGVudGx5IGRpc2FybSB0aGUgcHJlY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBndWFyZCAobm8gc25hcHNob3Qgc2VudCkgYW5kIGxldCBhIG1pZC1zdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQgbWVyZ2UgaW50byBhIHRocm93YXdheSBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FjaGVkRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YXJpYW50IHZpb2xhdGlvbjogd29ya2Zsb3cgc3VzcGVuZGVkIGJlZm9yZSBpdHMgZXZlbnQgbG9nIHdhcyBsb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uTG9nOiBMb2FkZWRFdmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogZXZlbnRzQ3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXNwZW5zaW9uUmVzdWx0OiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBoYW5kbGVTdXNwZW5zaW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQgPSBhd2FpdCBoYW5kbGVTdXNwZW5zaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuOiB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZzogc3VzcGVuc2lvbkxvZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdXNwZW5zaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdXNwZW5zaW9uIGNyZWF0ZSB3YXMgcmVqZWN0ZWQgYXMgc3RhbGU6IHJlLWRlcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGZyb20gYSBjb3JyZWN0ZWQgbG9nIGluIHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25jZSB0aGUgaW4tcHJvY2VzcyBidWRnZXQgaXMgc3BlbnQsIGZhbGwgYmFjayB0byBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBpbW1lZGlhdGUgcmUtaW52b2NhdGlvbiAoYSByZXRocm93IHJlbGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZWRlbGl2ZXJ5IG9mIGEgbWVzc2FnZSB0aGUgdHVyYm8gcGF0aCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2VkIOKAlCB0aGUgcnVuIHdvdWxkIHN0YWxsIGZvciB0aGUgcXVldWUncyB+MzAwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFJlcGxheUluUHJvY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1c3BlbnNpb24tY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdXNwZW5zaW9uLWNyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXItcnVuIGJ1ZGdldCBzcGVudDogZmFpbCB0aGUgcnVuIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZCBpdCBiYWNrIHRvIHRoZSBxdWV1ZSB0byBzcGluIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGYXRhbEVycm9yLmlzKHN1c3BlbnNpb25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgZmFpbHVyZXMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgc28gdGhlIG1lc3NhZ2UgaXMgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3VzcGVuc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi1yZXRyeWFibGUgZmFpbHVyZSB3aGlsZSBjb21taXR0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uJ3MgZXZlbnRzIOKAlCBlLmcuIGFuIGF0dHJpYnV0ZSB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV29ybGQgcmVqZWN0ZWQgYXMgaW52YWxpZCAodGhlIGN1bXVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBjYXAgY2FuIG9ubHkgYmUgY2hlY2tlZCBXb3JsZC1zaWRlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkZWxpdmVyeSB3b3VsZCByZXBsYXkgdGhlIHdvcmtmbG93IGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgd3JpdGUgYW5kIHRoZSBzYW1lIHJlamVjdGlvbiwgc28gZmFpbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHdpdGggdGhlIGVycm9yIGluc3RlYWQgb2Ygd2VkZ2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBpbiByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHN1c3BlbnNpb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vbi1yZXRyeWFibGUgZXJyb3Igd2hpbGUgY29tbWl0dGluZyB3b3JrZmxvdyBzdXNwZW5zaW9uOyBmYWlsaW5nIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN1c3BlbnNpb25FcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShzdXNwZW5zaW9uRXJyb3IubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBzdXNwZW5zaW9uTG9nLmN1cnNvcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbiBob29rcy93YWl0cyBpbiB0aGUgbG9nIGFzIGxvYWRlZCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBUaGlzIHN1c3BlbnNpb24ncyBvd24gaG9vay93YWl0IHdyaXRlcyBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVCBpbiBpdCDigJQgdGhleSBuZXZlciByZWFjaCByZXRlbnRpb24gYW55d2F5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBhIHN1c3BlbnNpb24gY29udGFpbmluZyBhIG5vbi1zdGVwIGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxzIGNhblJldGFpbldvcmtmbG93U2Vzc2lvbidzIHR5cGUgY2hlY2sgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2NhbiBpcyBjb25zdWx0ZWQuIENvbXB1dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXppbHksIGF0IG1vc3Qgb25jZSwgYW5kIHNoYXJlZCBiZXR3ZWVuIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0ZW50aW9uIGRlY2lzaW9uIGhlcmUgYW5kIHRoZSBkZWx0YS90dXJibyBnYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cg4oCUIHRoZSBhdHRyLWRldG91ciBhbmQgaG9vay1jb25mbGljdCBwYXRoc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuL2NvbnRpbnVlIGJlZm9yZSB0aGUgZ2F0ZXMgYW5kIHVzdWFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3J0LWNpcmN1aXQgYmVmb3JlIGV2ZXIgc2Nhbm5pbmcgdGhlIGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hcnJvd2VkIGFsaWFzOiB0aGUgY2xvc3VyZSBiZWxvdyB3b3VsZCBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvc2UgYGNhY2hlZEV2ZW50c2AncyBub24tbnVsbCBuYXJyb3dpbmcuIE5vdGhpbmcgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F0Y2ggc2NvcGUgcmVhc3NpZ25zIHRoZSBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1c3BlbnNpb25FdmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVuSG9va1dhaXQgPSBvbmNlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5Ib29rQW5kV2FpdFN0YXRlKHN1c3BlbnNpb25FdmVudHMpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2luZ2xlIHJldGVudGlvbiBkZWNpc2lvbjoga2VlcCB0aGUgcGFya2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXNzaW9uIG9ubHkgYWNyb3NzIGEgcHVyZSBzdGVwIGJvdW5kYXJ5IHdpdGggbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dC1vZi1iYW5kIGNvbnRpbnVhdGlvbiBzb3VyY2UgYW5kIHByb3ZhYmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzaXZlIHN0ZXAgaW5wdXRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWNhblJldGFpbldvcmtmbG93U2Vzc2lvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5yZXRhaW5lZFN0ZXBJbnB1dHNTYWZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5Ib29rV2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nTXMgKz0gc3VzcGVuc2lvblJlc3VsdC5ob29rQ3JlYXRpb25NcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPSBwcmVTdGVwQmxvY2tpbmdNcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N1c3BlbnNpb24gaGFuZGxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25NczogRGF0ZS5ub3coKSAtIHN1c3BlbnNpb25TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBzOiBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzOiBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0Py5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNIb29rQ29uZmxpY3Q6IHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXR0cmlidXRlRXZlbnRzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvb2sgY29uZmxpY3Q6IGJyZWFrIGxvb3AsIHJlLWludm9rZSB2aWEgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tDb25mbGljdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSB3b3JrZmxvdyBhdHRyaWJ1dGUgZXZlbnRzIGFyZSByZXNvbHZlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCByZXBsYXk6IHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIHJlbG9hZHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgKG5vdyBob2xkaW5nIHRoZSBqdXN0LWNvbW1pdHRlZCBhdHRyX3NldCkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXlzLCByZXNvbHZpbmcgdGhlIHNldEF0dHJpYnV0ZXMgcHJvbWlzZS4gU2tpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwcm9jZXNzaW5nIGZvciB0aGlzIHBhc3Mgc28gdGhhdCByZXBsYXkgZGVjaWRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFjZXMgZmlyc3Qg4oCUIGluIFByb21pc2UucmFjZShbc2V0QXR0cmlidXRlcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCgpXSksIHRoZSBkdXJhYmxlIGF0dHJpYnV0ZSBldmVudCBtdXN0IGJlIGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHdpbiB3aXRob3V0IGV4ZWN1dGluZyB0aGUgbG9zaW5nIHN0ZXAuIFRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcHBlbnMgaW4tcHJvY2VzcyByYXRoZXIgdGhhbiB2aWEgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtaW52b2NhdGlvbjogdW5saWtlIGhvb2tzIGFuZCB3YWl0cywgYW4gYXR0cl9zZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJvZHVjZXMgbm8gb3V0LW9mLWJhbmQgaW52b2NhdGlvbiBzb3VyY2UgdGhhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgd291bGQgbmVlZCB0byB5aWVsZCB0aGUgbWVzc2FnZSBmb3IsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXlpbmcgYSBkZWxpdmVyeSByb3VuZC10cmlwIGhlcmUgd291bGQgb25seSBhZGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVuY3kgYmVmb3JlIHRoZSB3b3JrZmxvdydzIG5leHQgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ1N0ZXBzID0gc3VzcGVuc2lvblJlc3VsdC5wZW5kaW5nU3RlcHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBleGVjdXRpb24gaXMgZ2F0ZWQgb24gb3duZXJzaGlwLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlciBkZWZlcnJlZCB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAgdG8gYGdldE1heElubGluZVN0ZXBzKClgIHN0ZXBzIChgbGF6eUlubGluZVN0ZXBzYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBydW4gdGhlbSBpbmxpbmUg4oCUIGluIHBhcmFsbGVsIOKAlCB2aWEgbGF6eVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfc3RhcnRlZGAgZXZlbnRzIHRoYXQgY3JlYXRlIGVhY2ggc3RlcCBvbiB0aGUgZmx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2aW5nIG9uZSB3b3JsZCByb3VuZC10cmlwIHBlciBpbmxpbmUgc3RlcC4gT3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdGlsbCBhdG9taWMgYW5kIGV4YWN0bHktb25lIHBlciBzdGVwOiB0aGUgd29ybGQnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlLWNsYWltIGluc2lkZSBlYWNoIHN0ZXBfc3RhcnRlZCByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKOKGkiBleGVjdXRlU3RlcCBgc2tpcHBlZGApIHRvIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBsb3Nlciwgc28gb25seSBvbmUgaGFuZGxlciBldmVyIHJ1bnMgYSBnaXZlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm9keS4gRXZlcnkgb3RoZXIgcGVuZGluZyBzdGVwIGtlZXBzIGl0cyBlYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIChpbiBgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkc2ApIGFuZCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgb25seSBkZXNpZ25hdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgbGF6eUlubGluZVN0ZXBzYCB3aGVuIG5vIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHByZXNlbnQuIFRoYXQgYXdhaXRlciBjYXNlIG11c3QgZXhlY3V0ZSBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmU6IGFuIGlubGluZSBgYXdhaXQgZXhlY3V0ZVN0ZXAoLi4uKWAgYmxvY2tzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sIHNvIHRoZSBhd2FpdGVyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiAod2hpY2ggb25seSBhZHZhbmNlcyBvbiB0aGUgbmV4dCByZXBsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSBzZXJpYWxpemVkIGJlaGluZCB0aGUgc3RlcCDigJQgZGVmZWF0aW5nIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3b3JrZmxvdyBleHByZXNzZWQgYXMgcGFyYWxsZWwgKGUuZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBob29rLmdldENvbmZsaWN0KCkudGhlbigoKSA9PiBzdGVwQigpKWAgcmFjaW5nIGBhd2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcEEoKWApLiBJbiB0aGF0IGNhc2UgYGxhenlJbmxpbmVTdGVwc2AgaXMgZW1wdHkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBzdGVwIGlzIHF1ZXVlZCBmb3IgcmUtaW52b2NhdGlvbiwgd2hpY2ggcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciB0aGUganVzdC1jb21taXR0ZWQgaG9va19jcmVhdGVkIGFuZCByZXNvbHZlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZXIgd2hpbGUgcXVldWVkIHN0ZXBzIHJ1biBpbiBwYXJhbGxlbCBpbnZvY2F0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhenlJbmxpbmVTdGVwcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQubGF6eUlubGluZVN0ZXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiBzLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmlmaWVkIHF1ZXVlIGRpc3BhdGNoIGZvciBldmVyeXRoaW5nIHdlIGFyZSBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZS1leGVjdXRpbmcuIFN0ZXBzIGFyZSBxdWV1ZWQgd2l0aCBzdGVwSWQgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWNlaXZlciBydW5zIHRoZW07IHRoZSB3YWl0IHRpbWVyIGlzIHF1ZXVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYSBnZW5lcmljIGNvbnRpbnVhdGlvbiB0aGF0IGZpcmVzIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBlbGFwc2VzIGFuZCBsZXRzIHRoZSBuZXh0IHJlcGxheSBvYnNlcnZlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IHZpYSB0aGUgXCJjb21wbGV0ZSBlbGFwc2VkIHdhaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBkaXNwYXRjaCBkZWNpc2lvbiB0YWJsZSAocGVyIHBlbmRpbmcgc3RlcCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2lnbmF0ZWQgbGF6eS1pbmxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBJbmxpbmUtb3duZWQsIG93bmVyID09PSB0aGlzIG1lc3NhZ2UgIOKGklxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGV4ZWN1dGUgaW4gVEhJUyBpbnZvY2F0aW9uIChvd25lZCByZWNvdmVyeTogYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJlZGVsaXZlcnkgb2YgdGhlIG93bmluZyBtZXNzYWdlIHJlLWV4ZWN1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhlIHN0ZXAgaXQgY3Jhc2hlZCBvbiwgdmlhIGEgcGF5bG9hZC1sZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcF9zdGFydGVkIHJlLXN0YW1wZWQgd2l0aCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvd25lck1lc3NhZ2VJZCDigJQgbm90IGEgYmFyZSBzdGFydCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gSW5saW5lLW93bmVkLCBvd25lciAhPT0gdGhpcyBtZXNzYWdlICDihpJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBlbnN1cmUgYSBERUxBWUVEIGJhY2tzdG9wIHdha2UgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKGRlbGF5U2Vjb25kcyA9IG93bmVyc2hpcCBsZWFzZSByZW1haW5pbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaW5zdGVhZCBvZiBlbnF1ZXVlaW5nIHRoZSBzdGVwLiBUaGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaW52b2NhdGlvbiBpcyAobGlrZWx5KSBzdGlsbCBydW5uaW5nIHRoZSBib2R5O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFuIGltbWVkaWF0ZSBzdGVwIG1lc3NhZ2Ugd291bGQgYmFyZS1zdGFydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBydW5uaW5nIHN0ZXAgYW5kIGV4ZWN1dGUgaXQgYSBzZWNvbmQgdGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICh3b3JrZmxvdyMyNzgwKS4gVGhlIGJhY2tzdG9wIGlzIGEgcGxhaW4gcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29udGludWF0aW9uLCBOT1QgYSBzdGVwIG1lc3NhZ2U6IHdoZW4gaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBmaXJlcywgdGhpcyBzYW1lIGRlY2lzaW9uIHRhYmxlIGhhbmRsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB3aGF0ZXZlciBzdGF0ZSB0aGUgc3RlcCBpcyBpbiBieSB0aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKHRlcm1pbmFsIOKGkiBub3RoaW5nIHBlbmRpbmc7IHF1ZXVlLW93bmVkIGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcF9yZXRyeWluZyDihpIgbm9ybWFsIGtleWVkIGRpc3BhdGNoOyBvd25lclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRlYWQgd2l0aCBsZWFzZSBleHBpcmVkIOKGkiBpbW1lZGlhdGUgZGlzcGF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcHJlc2VydmluZyBzdGVwLWxldmVsIGZhaWx1cmUgc2VtYW50aWNzIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHBvaXNvbiBzdGVwczsgbGVhc2UgcmVmcmVzaGVkIGJ5IG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVjb3Zlcnkg4oaSIHJlLWFybSkuIFRoZSBiYWNrc3RvcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWRlbXBvdGVuY3lLZXkgaXMgc2NvcGVkIHRvIHRoZSBvd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBFUE9DSCAobGF0ZXN0IHN0ZXBfc3RhcnRlZCB0aW1lc3RhbXApLCBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBqdXN0IHRoZSBjb3JyZWxhdGlvbiBJRCwgYW5kIG11c3QgbmV2ZXIgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgc3RlcCBtZXNzYWdlJ3Mgb3duIGtleSDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmFja3N0b3BJZGVtcG90ZW5jeUtleSBmb3IgYm90aCBpbnZhcmlhbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKGZpeGVkIGtleXMgZWl0aGVyIGFic29yYiB0aGUgcmV0cnkgaGFuZG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9yIGRlZHVwZSB0aGUgcmVmcmVzaGVkLWxlYXNlIHJlLWFybSBhZ2FpbnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhlIGluLWZsaWdodCBiYWNrc3RvcCBpdHNlbGYpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAtIE5vdCBvd25lZCAobmV2ZXIgc3RhbXBlZCAvIGVhZ2VyIC8gb3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGFwc2VkIGF0IHN0ZXBfcmV0cnlpbmcgLyBsZWFzZSBleHBpcmVkIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBraWxsLXN3aXRjaGVkKSDihpIgaW1tZWRpYXRlIGVucXVldWUsIGV4YWN0bHkgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZWZvcmUuIFRoaXMgY292ZXJzIGNyYXNoIHJlY292ZXJ5OiBpZiBhIHByaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlciB3cm90ZSBzdGVwX2NyZWF0ZWQgYnV0IGNyYXNoZWQgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcXVldWVpbmcsIGEgbGF0ZXIgaGFuZGxlciBxdWV1ZXMgaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWRlbXBvdGVuY3lLZXkgb24gY29ycmVsYXRpb25JZCBkZWR1cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVkdW5kYW50IHF1ZXVlcyBhY3Jvc3MgY29uY3VycmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd2FpdCBjb250aW51YXRpb24gaXMgd2hhdCBtYWtlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYFByb21pc2UucmFjZShzdGVwLCBzbGVlcClgIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgZXhlY3V0aW9uOiBldmVuIGlmIHRoZSBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2tzIHRoaXMgaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IHRpbWVyIGZpcmVzIGluIGEgc2VwYXJhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24uIElmIHRoZSBzbGVlcCB3aW5zLCB0aGF0IHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGNvbXBsZXRlcyB0aGUgcnVuOyBpZiB0aGUgc3RlcCB3aW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdhaXQgY29udGludWF0aW9uIGZpcmVzIGxhdGVyIGFuZCBuby1vcHMgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXJtaW5hbCBydW4uXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbnRpbnVhdGlvbidzIGRlbGF5IGlzIGNsYW1wZWQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhpbXVtIHF1ZXVlIGRlbGF5IChsb25nIHdhaXRzIGNoYWluIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgaG9wcykgYW5kIGl0cyBpZGVtcG90ZW5jeSBrZXkgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtb2JzZXJ2YXRpb25zIG9mIHRoZSBzYW1lIHBlbmRpbmcgd2FpdCBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gcGFzc2VzIOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnRpbWUvd2FpdC1jb250aW51YXRpb24udHMgZm9yIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheS9rZXkgc2VsZWN0aW9uIHJhdGlvbmFsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lT3duZXJzaGlwID0gaXNJbmxpbmVPd25lcnNoaXBFbmFibGVkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaE5vd01zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVkUmVjb3ZlcnlTdGVwczogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW1bXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tzdG9wV2FrZXNBcm1lZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgcGVuZGluZ1N0ZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVyc2hpcEFjdGl2ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lT3duZXJzaGlwICYmIGlzU3RlcE93bmVyc2hpcEFjdGl2ZShzdGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcEFjdGl2ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAub3duZXJNZXNzYWdlSWQgPT09IG1ldGFkYXRhLm1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPd25lZCByZWNvdmVyeTogdGhpcyBkZWxpdmVyeSBJUyB0aGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZTsgcmUtZXhlY3V0ZSB0aGUgc3RlcCBpbiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBpbnN0ZWFkIG9mIHF1ZXVlaW5nIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5wdXNoKHN0ZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGF5ZWQgYmFja3N0b3Agd2FrZSB3aGlsZSBhbm90aGVyIGludm9jYXRpb24nc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcnNoaXAgbGVhc2UgaXMgbGl2ZTsgaW1tZWRpYXRlIHN0ZXAgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgKGxlYXNlIGV4cGlyZWQg4oeSIHJlbWFpbmluZyAwIOKHkiBzYW1lIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZGF5LCB3aGljaCBpcyBhbHNvIHRoZSBkZWdyYWRlZCBtb2RlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZHMgd2l0aCB1bnN0YWJsZSBtZXNzYWdlIElEcyDigJQgdGhlIG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGFib3ZlIG5ldmVyIG1hdGNoZXMgdGhlcmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrc3RvcERlbGF5U2Vjb25kcyA9IG93bmVyc2hpcEFjdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3RlcExlYXNlUmVtYWluaW5nU2Vjb25kcyhzdGVwLCBkaXNwYXRjaE5vd01zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tzdG9wRGVsYXlTZWNvbmRzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wV2FrZXNBcm1lZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGVuZGluZyBzdGVwIGlzIGlubGluZS1vd25lZCBieSBhIGxpdmUgaW52b2NhdGlvbjsgZW5zdXJpbmcgZGVsYXllZCBiYWNrc3RvcCB3YWtlIGluc3RlYWQgb2YgaW1tZWRpYXRlIHJlcXVldWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyTWVzc2FnZUlkOiBzdGVwLm93bmVyTWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcERlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogYmFja3N0b3BEZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IGJhY2tzdG9wSWRlbXBvdGVuY3lLZXkoc3RlcCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZGlzcGF0Y2hlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZXQgb2Ygc3RlcHMgVEhJUyBpbnZvY2F0aW9uIGV4ZWN1dGVzOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVycmVkIGxhenktaW5saW5lIGJhdGNoIHBsdXMgYW55IG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwcyAodGhpcyBtZXNzYWdlJ3MgcmVkZWxpdmVyeSByZS1leGVjdXRpbmcgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBpdCBjcmFzaGVkIG9uIOKAlCBubyBsYXp5U3RlcElucHV0OyB0aGUgaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh5ZHJhdGVzIGZyb20gdGhlIHN0ZXAgZW50aXR5IGxpa2UgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGgsIGFuZCB0aGUgcGF5bG9hZC1sZXNzIHN0ZXBfc3RhcnRlZCByZS1zdGFtcHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyc2hpcCDigJQgdW5saWtlIHRoZSBiYWNrZ3JvdW5kIHBhdGgncyBzdGFydCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgTk9UIGJhcmU6IGl0IGNhcnJpZXMgdGhpcyBtZXNzYWdlJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyTWVzc2FnZUlkLCB3aGljaCBpcyBhbHNvIHdoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZC1yZWNvdmVyeSByZXRyeSBjZWlsaW5nIGNvdW50cykuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVFeGVjdXRpb25zOiBBcnJheTx7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dD86ICh0eXBlb2YgbGF6eUlubGluZVN0ZXBzKVtudW1iZXJdWydkZWh5ZHJhdGVkSW5wdXQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0+ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5sYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmRlaHlkcmF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vd25lZFJlY292ZXJ5U3RlcHMubWFwKChzKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE93bmVyc2hpcCB0ZWxlbWV0cnkgKGRlc2lnbiBkb2MgUGhhc2UgNyk6IHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMgc28gcHJvZHVjdGlvbiB0cmFjZXMgc2hvdyB3aGVuIGNyYXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyeSByYW4gb3IgYSB3YWtlIHdhcyBjb252ZXJ0ZWQgaW50byBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrc3RvcCwgYW5kIGEgd2FybiAoYWx3YXlzIHByaW50ZWQsIHVubGlrZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcvaW5mbykgZm9yIG93bmVkIHJlY292ZXJ5IOKAlCBpdCBtZWFucyBhIHByaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2UgZGllZCBtaWQtc3RlcC1ib2R5LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcFdha2VzQXJtZWQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd093bmVkUmVjb3ZlcnlTdGVwcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihiYWNrc3RvcFdha2VzQXJtZWQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd0JhY2tzdG9wV2FrZXNBcm1lZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcFdha2VzQXJtZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmUtZXhlY3V0aW5nIGlubGluZSBzdGVwcyBvd25lZCBieSB0aGlzIHF1ZXVlIG1lc3NhZ2Ug4oCUIGEgcHJldmlvdXMgZGVsaXZlcnkgY3Jhc2hlZCBtaWQtYm9keSBhbmQgdGhpcyByZWRlbGl2ZXJ5IGlzIHJlY292ZXJpbmcgdGhlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWRzOiBvd25lZFJlY292ZXJ5U3RlcHMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocykgPT4gcy5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBleGVjdXRlIGlubGluZSDigJQgZXZlcnl0aGluZyBoYXMgYmVlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIChvciBubyB3b3JrIG5lZWRzIHNjaGVkdWxpbmcpLiBFeGl0IGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBkcml2ZSBzdWJzZXF1ZW50IHJlcGxheXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lRXhlY3V0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIG5lZWRzIGFuIGltbWVkaWF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1pbnZvY2F0aW9uOiB0aGUgcmVwbGF5IGNvbnN1bWVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdGVyLiBXaXRob3V0IGl0IChubyBpbmxpbmUgc3RlcCwgYWxsIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIG9yIG5vbmUgcGVuZGluZykgdGhlIHJ1biB3b3VsZCBzaXQgaWRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnRpbCBzb21lIHVucmVsYXRlZCBtZXNzYWdlIHdva2UgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuIGhvb2tzL3dhaXRzIGFyZSBjb25zdWx0ZWQgYnkgYWxsIHRocmVlIGdhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdzsgcmVzb2x2ZSB0aGUgbWVtb2l6ZWQgc2NhbiBvbmNlIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVuSG9va1dhaXRTdGF0ZSA9IG9wZW5Ib29rV2FpdC52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIGZhc3QgcGF0aCBnYXRlLiBXZSByZXF1ZXN0IHRoZSBkZWx0YSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvbiB0aGUgbmV4dCBpdGVyYXRpb24gY29uc3VtZSBpdCBpbiBwbGFjZSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0IOKAlCBvbmx5IHdoZW4gQUxMIGhvbGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gV2UgaGF2ZSBhIHJlYWwgcHJpb3IgY3Vyc29yIHRvIGRpZmYgYWdhaW5zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBwcmVJbmxpbmVXcml0ZUN1cnNvcmA7IGEgV29ybGQgbWF5IHJldHVybiBub25lIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgaW5pdGlhbCBsb2FkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFRoaXMgaXMgdGhlIGNsZWFuIHNpbmdsZS1zdGVwIHNlcXVlbnRpYWwgY2FzZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoaXMgc3VzcGVuc2lvbiBwcm9kdWNlZCBleGFjdGx5IG9uZSBzdGVwIGFuZCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2FpdHMgKGBlcnIue3N0ZXAsd2FpdH1Db3VudGApLCB0aGF0IG9uZSBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgbG9uZSBwZW5kaW5nIHN0ZXAgKGBwZW5kaW5nU3RlcHMubGVuZ3RoID09PSAxYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFuZCB0aGUgbG9uZSBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxYCDigJQgbm8gcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNpYmxpbmdzIHF1ZXVlZCB0byBiYWNrZ3JvdW5kIGhhbmRsZXJzLCBhbmQgbm8gb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlubGluZSBzdGVwIHdyaXRpbmcgaXRzIG93biBldmVudHMgb3V0IG9mIGJhbmQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gTm8gcGVuZGluZyB3YWl0IHRpbWVyIGZyb20gVEhJUyBzdXNwZW5zaW9uLCBhbmQgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9wZW4gd2FpdCBpbiB0aGUgY3VtdWxhdGl2ZSBsb2c6IGEgY29uY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYHdhaXRfY29tcGxldGVkYCBsYW5kaW5nIGFmdGVyIHRoZSBkZWx0YSBzbmFwc2hvdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZG9lcyBub3QgYnVtcCB0aGUgb3V0c2lkZS1ldmVudCBtYXJrZXIsIHNvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZlbmNlcyBhIHJlcGxheSBmcm9tIHRoZSBzdGFsZSBkZWx0YS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIE5vIG9wZW4gKG9yIHRoaXMtc3VzcGVuc2lvbi1jcmVhdGVkKSBob29rIOKAlCBVTkxFU1NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBwcmVjb25kaXRpb24gZ3VhcmQgaXMgZW5hYmxlZCBBTkQgdGhlIFdvcmxkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkZWNsYXJlcyBpdCBhY3R1YWxseSBlbmZvcmNlcyB0aGUgZ3VhcmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChgY2FwYWJpbGl0aWVzLnByZWNvbmRpdGlvbkd1YXJkYDsgdGhlIGVudiBmbGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhbG9uZSBvbmx5IG1ha2VzIHRoZSBydW50aW1lIFNFTkQgc25hcHNob3RzLCB3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYW4gdW5zdXBwb3J0aW5nIGJhY2tlbmQgaWdub3JlcyDigJQgbm8gZmVuY2UpLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGRlbHRhIHNuYXBzaG90cyB0aGUgbG9nIGF0IHRoZSBzdGVwX2NvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd3JpdGUgYnV0IGlzIGNvbnN1bWVkIG9uIHRoZSBuZXh0IHJlcGxheSwgc28gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG91dC1vZi1iYW5kIGBob29rX3JlY2VpdmVkYCBsYW5kaW5nIGluIHRoYXQgd2luZG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpcyBhYnNlbnQgZnJvbSB0aGUgZGVsdGEgYW5kIG9ic2VydmVkIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXRlcmF0aW9uIGxhdGVyIHRoYW4gYSByZWFsIGZldGNoIHdvdWxkIG9ic2VydmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGl0LiBUaGF0IHN0YWxlbmVzcyBpcyBxdWFsaXRhdGl2ZWx5IHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWFkLXRvLXdyaXRlIHJhY2UgdGhlIGZldGNoIHBhdGggYWxyZWFkeSBoYXMgKGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBldmVudCBjYW4gbGFuZCByaWdodCBhZnRlciBgZXZlbnRzLmxpc3RgIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFuZCBiZWZvcmUgdGhlIHN1c3BlbnNpb24ncyB3cml0ZXMpOyB3aXRoIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBlbmZvcmNlZCBndWFyZCBpdCBpcyBhbHNvIGZlbmNlZDogYGhvb2tfcmVjZWl2ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBidW1wcyB0aGUgcGVyLXJ1biBvdXRzaWRlLWV2ZW50IG1hcmtlciwgc28gZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGR1cmFibGUgd3JpdGUgdGhlIHN0YWxlIHJlcGxheSBhdHRlbXB0cyBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVqZWN0ZWQgd2l0aCA0MTIg4oCUIGl0cyBndWFyZGVkIHN1c3BlbnNpb24gY3JlYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKHJldHJpZWQgb3ZlciB0aGUgcmVsb2FkZWQgbG9nLCBvciBleGhhdXN0ZWQgaW50b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYSBxdWV1ZSByZS1pbnZvY2F0aW9uKSwgQU5EIHRoZSBsYXp5IHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY2xhaW0gb2YgaXRzIG5leHQgaW5saW5lIHN0ZXAsIHdoaWNoIGNhcnJpZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzbmFwc2hvdCB0b28gKHRocmVhZGVkIGJlbG93IHZpYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYHN0YXRlVXBkYXRlZEF0YDsgb24gcmVqZWN0aW9uIHRoZSBiYXRjaCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYWJhbmRvbmVkIGFuZCByZS1pbnZva2VkIGZvciBhIGZyZXNoIHJlcGxheSwgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc3RhbGUgdmlldyBjYW4gbmV2ZXIgY29tbWl0IGEgc3RlcCkuIEhvb2tzIGNyZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGJ5IFRISVMgc3VzcGVuc2lvbiBhcmUgaW5zaWRlIHRoZSBkZWx0YSAodGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGBob29rX2NyZWF0ZWRgIGxhbmRzIGJlZm9yZSB0aGUgc3RlcC10ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd3JpdGUpLCBzbyBvbmx5IHRoZWlyIGBob29rX3JlY2VpdmVkYCByZXNwb25zZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFyZSBzdWJqZWN0IHRvIHRoZSBzYW1lIGZlbmNlZCB3aW5kb3cuIFdpdGhvdXQgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGVuZm9yY2VkIGd1YXJkIHRoZXJlIGlzIG5vIGZlbmNlLCBzbyBrZWVwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29uc2VydmF0aXZlIGdhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBXaXRoIG5vIGhvb2sgb3Igd2FpdCBvcGVuIGF0IGFsbCwgdGhlIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG91dC1vZi1iYW5kIHdyaXRlciBpcyBjYW5jZWxsYXRpb24sIHdoaWNoIGlzIHNhZmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRvIG9ic2VydmUgb25lIGl0ZXJhdGlvbiBsYXRlLiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9wZW5Ib29rQW5kV2FpdFN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbW9yZSB0aGFuIG9uZSBzdGVwIHJ1bnMgaW5saW5lLCBlYWNoIHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93biBldmVudHMgYW5kIHRoZSBwZXItd3JpdGUgZGVsdGEgd291bGQgYmUgcGFydGlhbCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWx0YSBpcyBub3QgcmVxdWVzdGVkICh0aGUgZ2F0ZSBiZWxvdyBpcyBmYWxzZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpLXN0ZXApIGFuZCB0aGUgbmV4dCBpdGVyYXRpb24gZG9lcyBhIG5vcm1hbCBmZXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhlIHByZWNvbmRpdGlvbiBndWFyZCBpcyBhY3R1YWxseSBpbiBmb3JjZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQgYnkgZW52IEFORCBlbmZvcmNlZCBieSB0aGUgV29ybGQuIFRoZSBlbnZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsYWcgYWxvbmUgb25seSBtYWtlcyB0aGUgcnVudGltZSBzZW5kIHNuYXBzaG90cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGFuIHVuc3VwcG9ydGluZyBiYWNrZW5kIGlnbm9yZXMgKG5vIGZlbmNlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1YXJkRW5mb3JjZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZWNvbmRpdGlvbkd1YXJkRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLmNhcGFiaWxpdGllcz8ucHJlY29uZGl0aW9uR3VhcmQgPT09IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJbmxpbmVEZWx0YSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcmVJbmxpbmVXcml0ZUN1cnNvciA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuV2FpdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VhcmRFbmZvcmNlZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnIuaG9va0NvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3Blbkhvb2spKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhbGUtc2Vuc2l0aXZlIGJhdGNoOiBhIGhvb2sgaXMgb3BlbiBpbiB0aGUgcnVuIChvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGNyZWF0ZWQgYnkgdGhpcyBzdXNwZW5zaW9uLCBzbyBpdHMgaG9va19yZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGxhbmQgYW55IG1vbWVudCkg4oCUIGFuIG91dC1vZi1iYW5kIGV2ZW50IGNhbiBtYWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdmlldyB0aGlzIGJhdGNoIHdhcyBzY2hlZHVsZWQgZnJvbSBzdGFsZS4gV2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGd1YXJkIGluIGZvcmNlLCB0aGUgZmVuY2UgcmVqZWN0cyBhIHN0YWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbSdzIGR1cmFibGUgd3JpdGVzIOKAlCBidXQgaXQgY2Fubm90IHVuLXJ1biBhIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJPRFkgdGhhdCBvcHRpbWlzdGljIHN0YXJ0IGJlZ2FuIGJlZm9yZSB0aGUgY2xhaW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHRsZWQuIFN1cHByZXNzIG9wdGltaXN0aWMgc3RhcnQgZm9yIHRoZXNlIGJhdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0YWtlIGF3YWl0LXRoZW4tcnVuKSBzbyBhIDQxMi1mZW5jZWQgc3RlcCBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZXMgdXNlciBjb2RlIGF0IGFsbDogdGhlIGZlbmNlIHRoZW4gY292ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWRlIGVmZmVjdHMsIG5vdCBqdXN0IHRoZSBldmVudCBsb2cuIENvc3RzIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhaW0gcm91bmQtdHJpcCBwZXIgc3RlcCB3aGlsZSBhIGhvb2sgaXMgb3Blbiwgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gZ3VhcmQtZW5mb3JjaW5nIGRlcGxveW1lbnRzLiBXaXRob3V0IHRoZSBndWFyZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyA0MTJzLCBzbyBzdXBwcmVzc2lvbiB3b3VsZCBidXkgbm90aGluZyDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlLXZpZXcgZXhwb3N1cmUgdGhlcmUgaXMgdGhlIHByZS1leGlzdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYy1zdGFydCBjb250cmFjdCAoaWRlbXBvdGVudCBzaWRlIGVmZmVjdHMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyZEVuZm9yY2VkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuSG9va1dhaXRTdGF0ZS5vcGVuSG9vayB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmb3JjZXMgb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgZm9yIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoIOKAlCBidXQgb25seSB3aGlsZSB0aGUgcnVuIGlzIHN0aWxsIFwiY2xlYW5cIiAoYSBwdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHN1c3BlbnNpb24pLiBUaGUgbW9tZW50IGEgaG9vayBvciB3YWl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkLCBsYXRlciByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYmVjb21lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSwgc28gdGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgb3B0aW1pc3RpYyBzdGFydCBzYWZlIG5vIGxvbmdlciBob2xkcyDigJQgdHVyYm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXRzIGFuZCB0aGUgc3RlcHMgdGFrZSB0aGUgbm9ybWFsIChlbnYtZ2F0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdC10aGVuLXJ1biBwYXRoLiBUaGUgaG9vay1jb25mbGljdCBjYXNlIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGVhcmx5IGFib3ZlLCB0aGUgYXR0ciBjYXNlIGNvbnRpbnVlZCBpbnRvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXNoIHJlcGxheSAoc28gYSBiYXRjaC1zY2hlZHVsaW5nIHN1c3BlbnNpb24gbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZXMgYXR0ciBldmVudHMpLCBhbmQgdGhlIGF3YWl0ZWQtaG9vayBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0aWVkIGxhenlJbmxpbmVTdGVwczsgdGhlIGNoZWNrcyBiZWxvdyBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVuc2l2ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYHN1c3BlbnNpb25SZXN1bHQuKmAgZmxhZ3Mgb25seSByZWZsZWN0IHdoYXQgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2ggY3JlYXRlZCwgc28gdGhleSBkbyBub3QgY2F0Y2ggYSBob29rL3dhaXQgb3BlbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBhbiBlYXJsaWVyIGl0ZXJhdGlvbiBvZiB0aGUgc2FtZSBkZWxpdmVyeSAoZS5nLiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJlLWFuZC1mb3JnZXQgYGNyZWF0ZUhvb2soLi4uKWAgdGhhdCBkb2Vzbid0IGJsb2NrIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3csIGxldHRpbmcgdGhlIHJlcGxheSBsb29wIGNvbnRpbnVlIHRvIGxhdGVyIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbnMpLiBPbmNlIGFueSBob29rIG9yIHdhaXQgaXMgb3BlbiBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1bXVsYXRpdmUgbG9nLCByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYXJlIHBvc3NpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biwgc28gdHVyYm8gbXVzdCBsYXRjaCBvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcm1hbmVudGx5IOKAlCBjaGVja2VkIGhlcmUgdmlhIGBvcGVuSG9va0FuZFdhaXRTdGF0ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIGN1bXVsYXRpdmUgYGNhY2hlZEV2ZW50c2AuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogYFdPUktGTE9XX1NFUVVFTlRJQUxfUkVQTEFZUz0xYCAocGVyLXJ1biBmbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b3BpY3MgY29uc3VtZWQgd2l0aCBgbWF4Q29uY3VycmVuY3k6IDFgKSB3b3VsZCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbmNpcGxlIHdhaXZlIHRoaXMgbGF0Y2gg4oCUIHNlcmlhbGl6ZWQgb3JjaGVzdHJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9ucyByZXN0b3JlIHRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2hvbGUgZGVsaXZlcnkuIFRoZSB3YWl2ZXIgaXMgaW50ZW50aW9uYWxseSBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2VuOiB0aGUgZW52IHZhciBpcyBhIHJ1bnRpbWUtcHJvY2VzcyBzZXR0aW5nIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBwcm92ZSB0aGUgQlVJTFQgZmxvdyB0cmlnZ2VyIGFjdHVhbGx5IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBtYXhDb25jdXJyZW5jeTogMWAgKGl0IG11c3QgYmUgc2V0IGF0IGJ1aWxkIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvbywgYW5kIHNvbWUgaW50ZWdyYXRpb25zIHdyaXRlIHRoZWlyIG93biB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWcpLCBhbmQgYGNhcGFiaWxpdGllcy5tYXhDb25jdXJyZW5jeWAgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjbGFyZXMgcXVldWUgc3VwcG9ydCwgbm90IGRlcGxveWVkIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbnRpbCB0aGUgYnVpbGQgZW1pdHMgYSB2ZXJpZmlhYmxlIHNpZ25hbCB0aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwbG95ZWQgdHJpZ2dlciBpcyBzZXJpYWxpemVkLCB0aGUgY29uc2VydmF0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXRjaCBzdGF5cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcmNlT3B0aW1pc3RpY1N0YXJ0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYm8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3Blbkhvb2sgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIW9wZW5Ib29rV2FpdFN0YXRlLm9wZW5XYWl0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBpbmxpbmUgc3RlcHMgaW4gcGFyYWxsZWwuIFRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZGdldCBpcyBwYXVzZWQgZm9yIHRoZSB3aG9sZSBiYXRjaCDigJQgc3RlcCBkdXJhdGlvbiBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvbiBtYXhEdXJhdGlvbiwgbm90IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHRpbWVvdXQg4oCUIHNvIHRoZSBidWRnZXQgY2hlY2sgYXQgdGhlIHRvcCBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgbG9vcCBpdGVyYXRpb24gZG9lc24ndCBjaGFyZ2UgdGhlIHN0ZXAgYm9kaWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnk6IGRlY2lkZSB3aGV0aGVyIHRoaXMgYmF0Y2gncyBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMvU1RTTyBtZWFzdXJlbWVudC4gT25seSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoJ3MgZmlyc3Qgc3RlcCBjYXJyaWVzIHRoZSB0cmFja2luZyBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbGxlbCBiYXRjaCBlbWl0cyBvbmUgc2FtcGxlIHBlciBzY2hlZHVsaW5nIGdhcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBvbmUgcGVyIHNpYmxpbmcuIFR1cmJvJ3Mgc3ludGhlc2l6ZWQgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbmFwc2hvdCBoYXMgYSBsb2NhbC1jbG9jayBjcmVhdGVkQXQsIHNvIHVuZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBvbmx5IHRoZSBydW4taWQgVUxJRCB0aW1lc3RhbXAgaXMgdHJ1c3RlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVuY3lUcmFja2luZyA9IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydGVkQ2xlYW46XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQ3JlYXRlZEF0TXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRDcmVhdGVkQXQocnVuSWQpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1cmJvID8gdW5kZWZpbmVkIDogK3dvcmtmbG93UnVuLmNyZWF0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiByZXBsYXlEdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN1c3BlbnNpb24ncyBvd24gaG9vay93YWl0IHdyaXRlcyBhcmUgbm90IGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZEV2ZW50cyB5ZXQsIHNvIHJlcG9ydCB0aGVtIGV4cGxpY2l0bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25IYXNXYWl0czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkNyZWF0ZWRIb29rczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50ID4gMCB8fCBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJvLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWNvbmRpdGlvbi1ndWFyZCBzbmFwc2hvdCBmb3IgdGhlIGlubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIGNsYWltczogdGhlIGxhenkgY2xhaW0gaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlIHdyaXRlIG9mIGEgaG90LXBhdGggc3RlcCAoaXRzIHN0ZXBfY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgZGVmZXJyZWQpLCBzbyB3aXRob3V0IGEgc25hcHNob3QgaXQgd291bGQgYnlwYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZ3VhcmQgZW50aXJlbHkgYW5kIGEgc3RhbGUgcmVwbGF5IGNvdWxkIGNsYWltIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbW1pdCDigJQgYSBzdGVwIHNjaGVkdWxlZCBvZmYgYSB2aWV3IHRoYXQgbWlzc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBldmVudCBpdCBuZXZlciBsb2FkZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXNgIHJldHVybnMgYW4gZW1wdHkgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBndWFyZCBlbnYgZmxhZyBpcyBvZmYsIHNvIHRoaXMgaXMgYSBuby1vcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0c2lkZSBndWFyZGVkIGRlcGxveW1lbnRzOyBXb3JsZHMgdGhhdCBkb24ndFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5mb3JjZSB0aGUgZ3VhcmQgaWdub3JlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lQ2xhaW1TbmFwc2hvdCA9IHByZWNvbmRpdGlvblNuYXBzaG90UGFyYW1zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwUmVzdWx0czogQXdhaXRlZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA+W107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwRXhlY3V0aW9uUHJvbWlzZXMgPSBpbmxpbmVFeGVjdXRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHMsIHN0ZXBJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1biA9ICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEZXBsb3ltZW50SWQ6IHdvcmtmbG93UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogd29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgbnVtYmVyID0gcHJpb3Igc3RlcF9zdGFydGVkIGNvdW50ICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhpcyBleGVjdXRpb24ncyBzdGFydCksIGNvdW50aW5nIG9ubHkgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duIHN0YXJ0czogdGhlIG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNlaWxpbmcgYm91bmRzIGhvdyBtYW55IHRpbWVzIHRoaXMgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmUtcnVucyBhIHN0ZXAgaXQgY3Jhc2hlZC90aW1lZCBvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24sIGFuZCBlYWNoIG9mIHRob3NlIChyZSlzdGFydHMgc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGFkYXRhLm1lc3NhZ2VJZC4gU3RhcnRzIHdyaXR0ZW4gYnkgcmFjaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb25zIChzdGFsZS93YWtlIHJlcGxheXMsIGEgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGRpc3BhdGNoZWQgb2ZmIGEgbG9zdCBjcmVhdGUtY2xhaW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IG90aGVyIElEcyDigJQgb3Igbm9uZSDigJQgYW5kIG11c3Qgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50LCBvciB0aGUgY2VpbGluZyBmYWxzZWx5IGV4aGF1c3RzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhbHRoeSBzdGVwIChzZWUgY291bnRTdGVwU3RhcnRlZEV2ZW50cykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBzdGVwIGlzIGJyYW5kLW5ldyBieSBjb25zdHJ1Y3Rpb24gKGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGVycyB0aGUgYmF0Y2ggb25seSB3aGVuIGl0IGhhcyBub1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgeWV0KSwgc28gaXQgaGFzIHplcm8gcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGFuZCBpcyBhbHdheXMgYXR0ZW1wdCAxIOKAlCBza2lwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgc2NhbiBlbnRpcmVseS4gT25seSBhbiBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1ydW4gY2FuIGhhdmUgcHJpb3Igc3RhcnRzLCBhbmQgdGhhdCBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVuY29tbW9uLCBzbyByZXNlcnZlIHRoZSBPKG4pIHNjYW4gZm9yIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHdhbGtpbmcgdGhlIGdyb3dpbmcgbG9nIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBpbmxpbmUgc3RlcCAod2hpY2ggd291bGQgYmUgTyhuwrIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjcm9zcyBhIGxvbmcgc2VxdWVudGlhbCB3b3JrZmxvdykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY291bnRTdGVwU3RhcnRlZEV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvd25lZEJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgaW5saW5lIHN0YXJ0OiBzZW5kIHRoZSBkZWZlcnJlZCBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgb24gc3RlcF9zdGFydGVkIHNvIHRoZSB3b3JsZCBjcmVhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIG9uIHRoZSBmbHkuIEFic2VudCBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3Zlcnkgc3RlcHMsIHdob3NlIGlucHV0IGh5ZHJhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGV4aXN0aW5nIHN0ZXAgZW50aXR5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmxhenlTdGVwSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBvd25lcnNoaXA6IHN0YW1wIChvciByZS1zdGFtcCkgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uJ3MgcXVldWUgbWVzc2FnZSBJRCBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkLCBzbyB3YWtlIHJlcGxheXMgc2VlIHRoZSBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGluIGZsaWdodCBoZXJlIGFuZCBzdXBwcmVzcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlIHJlcXVldWUgKHdvcmtmbG93IzI3ODApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogZm9yY2Ugb3B0aW1pc3RpYyBzdGFydCBhbmQgaG9sZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF6eSBzdGVwX3N0YXJ0ZWQgdW50aWwgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBsYW5kcyAodGhlIGJvZHkgc3RpbGwgcnVuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSkuIEJvdGggYXJlIHVuZGVmaW5lZC9mYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU9wdGltaXN0aWNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR3VhcmQtZW5mb3JjZWQgYmF0Y2hlcyB3aXRoIGFuIG9wZW4gaG9va1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdCB0aGUgY2xhaW0gYmVmb3JlIHJ1bm5pbmcgdGhlIGJvZHksIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgNDEyLWZlbmNlZCBzdGVwIG5ldmVyIGV4ZWN1dGVzIHVzZXIgY29kZSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIHN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0IGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc09wdGltaXN0aWNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25TbmFwc2hvdDogaW5saW5lQ2xhaW1TbmFwc2hvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHN0ZXBJbmRleCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5VHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgbGF0ZW5jeVRyYWNraW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcXVlc3RJbmxpbmVEZWx0YSAmJiBwcmVJbmxpbmVXcml0ZUN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVEZWx0YVNpbmNlQ3Vyc29yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YXJpYW50IGJvb2trZWVwaW5nOiB0aGlzIGludm9jYXRpb24gb3duc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGJvZGllcyB1bnRpbCB0aGV5IHNldHRsZSDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0Tm9JbkZsaWdodE93bmVkU3RlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGlnaHRPd25lZFN0ZXBzLmFkZChzLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgc3RlcHMgYXJlIGJyYW5kLW5ldyAodGhlaXIgY3JlYXRlLWNsYWltXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIGV4YWN0bHktb25jZSBnYXRlKSwgYnV0IGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3Zlcnkgc3RlcCBhbHJlYWR5IGV4aXN0cyBhbmQgaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXllZCBiYWNrc3RvcCBtZXNzYWdlIG1heSBmaXJlIG1pZC1ib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBzYW1lIHByb2Nlc3Mg4oCUIHJvdXRlIHRob3NlIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4tcHJvY2VzcyBzaW5nbGUtZmxpZ2h0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlZC5maW5hbGx5KCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsaWdodE93bmVkU3RlcHMuZGVsZXRlKHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRXhlY3V0aW9uUHJvbWlzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFsZSAoNDEyKSByZWplY3Rpb24gb2YgYW4gaW5saW5lIHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbTogdGhlIGxvYWRlZCB2aWV3IHRoaXMgYmF0Y2ggd2FzIHNjaGVkdWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGlzIG1pc3NpbmcgYW4gZXZlbnQgdGhlIGJhY2tlbmQgYWxyZWFkeSBoYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBjbGFpbSB3YXMgZmVuY2VkIGJ5IHRoZSBndWFyZCBhbmQgbm8gc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgd2VyZSB3cml0dGVuLiBBYmFuZG9uIHRoZSBiYXRjaCDigJQgYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXN0aWMgYm9keSByZXN1bHQgaXMgZGlzY2FyZGVkIGJ5IGV4ZWN1dGVTdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb25jaWxpYXRpb24g4oCUIGFuZCByZXN0YXJ0IHRoZSByZXBsYXkgc28gaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZXMgdGhlIG1pc3NpbmcgZXZlbnQuIFdhaXQgZm9yIHRoZSBzaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbnMgdG8gc2V0dGxlIGZpcnN0IHNvIG5vIG93bmVkIGJvZHkgaXMgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0IHdoZW4gdGhlIHJlc3RhcnQgKG9yIHRoZSBhY2sgcGF0aCkgcnVucy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLmlzKHN0ZXBFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFeGVjdXRpb25Qcm9taXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzaWJsaW5nIHdob3NlIGNsYWltIHdhcyBhY2NlcHRlZCB3cm90ZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIG9mIGl0cyBvd24sIHBvc3NpYmx5IGFmdGVyIHRoZSBXb3JsZCBidWlsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgNDEyJ3MgZGVsdGEg4oCUIHNvIHRoYXQgZGVsdGEgY2FuIG5vIGxvbmdlciBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZWQgdG8gY29tcGxldGUgdGhlIGxvZywgYW5kIHRoZSByZXN0YXJ0IGhhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHJlbG9hZCBpdCBpbiBmdWxsLiBgc2tpcHBlZGAgKHRoZSBzdGVwIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGVkKSwgYGdvbmVgIGFuZCBgdGhyb3R0bGVkYCAoY2xhaW0gcmVqZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvdGUgbm90aGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWJsaW5nV3JvdGUgPSBzZXR0bGVkLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Y29tZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRjb21lLnZhbHVlLnR5cGUgPT09ICdjb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS52YWx1ZS50eXBlID09PSAnZmFpbGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUudmFsdWUudHlwZSA9PT0gJ3JldHJ5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRSZXBsYXlJblByb2Nlc3MoJ2lubGluZS1jbGFpbScsIHN0ZXBFcnIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dEZWx0YTogIXNpYmxpbmdXcm90ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmluYWxseSBiZWxvdyByZXN1bWVzIHRoZSByZXBsYXkgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIG5leHQgaXRlcmF0aW9uIHN0YXJ0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmluYWxseSBiZWxvdyByZXN1bWVzIHRoZSByZXBsYXkgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoaXMgcmV0dXJuIChvciB0aHJvdykgY29tcGxldGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FsYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5saW5lLWNsYWltJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEVyclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZXBFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFnZ3JlZ2F0ZSB0aGUgYmF0Y2ggcmVzdWx0cy4gYHJldHJ5YCBzdGVwcyAod2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZXhpc3Qg4oCUIHRoZWlyIGBzdGVwX3N0YXJ0ZWRgIHN1Y2NlZWRlZCkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1xdWV1ZWQgcGVyLXN0ZXAgYXMgYmFja2dyb3VuZCBzdGVwcyB3aXRoIHRoZWlyIG93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXk7IGB0aHJvdHRsZWRgIHN0ZXBzIChyZWplY3RlZCBvbiB0aGUgY3JlYXRlLWNsYWltLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbmV2ZXIgY3JlYXRlZCkgaW5zdGVhZCBkZWZlciByZWRlbGl2ZXJ5IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHNvIHRoZXkgcmUtcnVuIGlubGluZSB3aXRoIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZXBsYXk7IGNvbXBsZXRlZC9mYWlsZWQgc3RlcHMgYWxyZWFkeSB3cm90ZSB0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgZXZlbnRzLiBXZSBvbmx5IGxvb3AgYmFjayB0byByZXBsYXkgd2hlbiBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIOKAlCBvdGhlcndpc2UgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC1wZW5kaW5nIHN0ZXBzIHdpbGwgYmUgcmUtcnVuIGJ5IHRoZWlyIHF1ZXVlZCByZXRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMgYW5kIHRoZSBiYWNrZ3JvdW5kLXN0ZXAgcGF0aCByZXBsYXlzIG9uY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBzdGVwcyBhcmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvUmV0cnk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogKHR5cGVvZiBpbmxpbmVFeGVjdXRpb25zKVtudW1iZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFueVBlbmRpbmdPcHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdGhyb3R0bGVkIGlubGluZSBzdGVwIGRlbGF5cyByZWRlbGl2ZXJ5IG9mIFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHJhdGhlciB0aGFuIGJlaW5nIHJlLXF1ZXVlZCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAuIENydWNpYWxseSwgYSBgdGhyb3R0bGVkYCByZXN1bHQgbWVhbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIHdhcyByZWplY3RlZCBvbiB0aGUgYXRvbWljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0g4oCUIHNvIHRoZSBzdGVwIHdhcyBORVZFUiBjcmVhdGVkIChub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfY3JlYXRlZGAsIG5vIHN0ZXAgZW50aXR5KS4gUmUtcXVldWluZyBpdCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAgd291bGQgc2VuZCBhIGJhcmUgYHN0ZXBfc3RhcnRlZGAgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCksIHdoaWNoIHRoZSB3b3JsZCByZWplY3RzIHdpdGggYFN0ZXAgXCI8aWQ+XCIgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZGAgYmVjYXVzZSBpdCBjYW5ub3QgbGF6aWx5IGNyZWF0ZSB0aGUgc3RlcCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5wdXQ7IHRoYXQgZXJyb3IgaXNuJ3QgdHJhbnNsYXRhYmxlLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmVkZWxpdmVycyB1bnRpbCBNQVhfUVVFVUVfREVMSVZFUklFUyBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIChhbmQgcnVuKSBmYWlsLiBEZWZlcnJpbmcgcmVkZWxpdmVyeSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBpbnN0ZWFkIHJlLWF0dGVtcHRzIHRoZSB0aHJvdHRsZWQgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIFdJVEggaXRzIGlucHV0IG9uIHJlcGxheS4gV2UgdHJhY2sgdGhlIGxvbmdlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tvZmYgc28gYSBiYXRjaCB3aXRoIG11bHRpcGxlIHRocm90dGxlcyB3YWl0cyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heC4gTm90ZTogYHJldHJ5YCByZXN1bHRzIGFyZSBzYWZlIHRvIHJlLXF1ZXVlIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIGJlY2F1c2UgYSByZXRyeSBpbXBsaWVzIGBzdGVwX3N0YXJ0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHN1Y2NlZWRlZCBhbmQgdGhlIHN0ZXAgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRocm90dGxlVGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmxpbmVFeGVjdXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBzdGVwUmVzdWx0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGlubGluZUV4ZWN1dGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogci50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVvdXQgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudGltZW91dFNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55UGVuZGluZ09wcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocm90dGxlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmVyIHJlZGVsaXZlcnkgb2YgdGhlIG9yY2hlc3RyYXRvciBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3R0bGUgYmFja29mZi4gT24gcmVwbGF5IGV2ZXJ5IG5vbi10ZXJtaW5hbCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHJlLWRpc3BhdGNoZWQgYnkgdGhlIHN1c3BlbnNpb24gaGFuZGxlcjogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsLXRocm90dGxlZCBzdGVwcyBydW4gaW5saW5lIGFnYWluIFdJVEggdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgKHRoZWlyIGBzdGVwX2NyZWF0ZWRgIGlzIGRlZmVycmVkIGFuZXcpLCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IGByZXRyeWAgc3RlcHMgaW4gdGhpcyBiYXRjaCBhcmUgcXVldWVkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd24gcmV0cnlBZnRlciBob25vcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hbCBzdGVwcyAoY29tcGxldGVkL2ZhaWxlZC9za2lwcGVkL2dvbmUpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlZCBmcm9tIHRoZWlyIGV2ZW50cyBhbmQgbm90IHJlLXJ1bi4gQmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGRyaXZlcyBhbGwgcmVtYWluaW5nIHdvcmssIHdlIG11c3QgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gcmUtcXVldWUgYHRvUmV0cnlgIGhlcmUg4oCUIHRoYXQgd291bGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlLWRpc3BhdGNoIHRob3NlIHN0ZXBzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHJldHVybnMgQkVGT1JFIHRoZSBgYW55UGVuZGluZ09wc2AgYnJhbmNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93LCBzbyBhIGJhdGNoIHRoYXQgbWl4ZXMgYSB0aHJvdHRsZSB3aXRoIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkIHN0ZXAgdGhhdCBsZWZ0IHVuZmx1c2hlZCBvcHMgZG9lcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgdGhlIGV4cGxpY2l0IGZsdXNoIGNvbnRpbnVhdGlvbi4gVGhhdCBpcyBzYWZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHRocm90dGxlIGJhY2tvZmYgKD49IDFzKSBhbHdheXMgZXhjZWVkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4taW52b2NhdGlvbiBmbHVzaCB3aW5kb3cgKDw9IDUwMG1zICsgd2FpdFVudGlsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gb3BzIHNldHRsZSBiZWZvcmUgdGhlIHBvc3QtYmFja29mZiByZWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheXMgYW5kIHJlYWRzIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSh0aHJvdHRsZVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9SZXRyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldHJ5VHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5Lm1hcCgoeyBzdGVwLCBkZWxheVNlY29uZHMgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogcmV0cnlUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IHRoZSBkZWxheWVkIHJldHJ5IG9uIHRoZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWxhdGlvbklkIHNvIGl0IGRlZHVwZXMgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZXllZCByZS1kaXNwYXRjaCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyZm9ybXMgb24gcmVwbGF5IChpdCBhbHNvIHVzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZGApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCBhIG1peGVkIGJhdGNoIHdoZXJlIG9uZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNvbXBsZXRlZGAgd2l0aCB1bmZsdXNoZWQgYmFja2dyb3VuZCBvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoYGFueVBlbmRpbmdPcHNgKSBhbmQgYW5vdGhlciBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgd291bGQgZG91YmxlLWRpc3BhdGNoIHRoZSByZXRyeTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaCBiZWxvdyBxdWV1ZXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgcGxhaW4gY29udGludWF0aW9uLCB3aG9zZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVzIHRoZSBzdGlsbC1gcmV0cnlpbmdgIHN0ZXAgYXMgcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZS1kaXNwYXRjaGVzIGl0ICppbW1lZGlhdGVseSogYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKndpdGgqIGEga2V5LiBTaW5jZSB0aGlzIGRlbGF5ZWQgcmV0cnkgaGFkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8ga2V5LCB0aGUgdHdvIG1lc3NhZ2VzIHdvdWxkbid0IGRlZHVwZSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCB3b3VsZCBydW4gdHdpY2UsIHRoZSBjb25maWd1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYmFja29mZiB3b3VsZCBiZSBpZ25vcmVkIChwbGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFcnJvcmAgcmV0cmllcyBwZXJzaXN0IG5vIGByZXRyeUFmdGVyYCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd29ybGQgaGFzIG5vIGBUb29FYXJseWAgZ3VhcmQpLCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYm9keSBjb3VsZCBydW4gZWFybHkvY29uY3VycmVudGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYXJpbmcgdGhlIGtleSBsZXRzIHRoZSBlYXJsaWVyIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHdpbiwgaG9ub3JpbmcgdGhlIGJhY2tvZmYuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHBlbmRpbmcgYmFja2dyb3VuZCBvcGVyYXRpb25zIGZsdXNoIGJlZm9yZSB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHJlYWRzIHRoZWlyIHJlc3VsdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW55UGVuZGluZ09wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCcmVha2luZyBsb29wOiBpbmxpbmUgc3RlcCBoYXMgcGVuZGluZyBvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGxvb3BJdGVyYXRpb24gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGlubGluZSBzdGVwcyB3aWxsIGJlIHJlLXJ1biB2aWEgdGhlaXIgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IG1lc3NhZ2VzOyB0aGUgYmFja2dyb3VuZC1zdGVwIHBhdGggcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFsbCBzdGVwcyBhcmUgdGVybWluYWwuIERvbid0IGxvb3AgaGVyZSDigJQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHN0ZXBzIGhhdmUgbm8gdGVybWluYWwgZXZlbnQgdG8gb2JzZXJ2ZSB5ZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIGlubGluZSBzdGVwcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSkg4oCUIGxvb3AgYmFjayB0byByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGUgd29ya2Zsb3cgb2JzZXJ2ZXMgdGhlIHRlcm1pbmFsIGV2ZW50cyBvbiByZXBsYXkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzaW5nbGUgaW5saW5lIHN0ZXAncyB0ZXJtaW5hbCB3cml0ZSByZXR1cm5lZCBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIGRlbHRhIChzdXBwb3J0aW5nIFdvcmxkICsgdGhlIHNpbmdsZS1zdGVwIGdhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3ZlKSwgc3Rhc2ggaXQgc28gdGhlIG5leHQgaXRlcmF0aW9uJ3MgbG9hZCBjb25zdW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgaW5zdGVhZCBvZiBpc3N1aW5nIGFuIGluY3JlbWVudGFsIGV2ZW50cy5saXN0LiBPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29tcGxldGVkIHBhdGggY2FycmllcyBhIGRlbHRhOyBtdWx0aS1zdGVwIGJhdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHJlcXVlc3Qgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ubHkgPSBzdGVwUmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LmlubGluZURlbHRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW9ubHkuaW5saW5lRGVsdGEuaGFzTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IG9ubHkuaW5saW5lRGVsdGEuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBvbmx5LmlubGluZURlbHRhLmN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiBvZiBhIGd1YXJkZWQgd3JpdGUgbWFkZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgYnkgdGhlIHJlcGxheSBsb29wIOKAlCB0aGUgcmVzdWx0LWJlYXJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBydW5fY29tcGxldGVkYCwgb3IgdGhlIGB3YWl0X2NvbXBsZXRlZGAgb2YgdGhlIHdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MuIEJvdGggcmVhY2ggdGhpcyBvbmUgY2F0Y2ggYW5kIHRoZSByZWplY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHNheSB3aGljaCwgaGVuY2UgdGhlIG5ldXRyYWwgbGFiZWwuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWl0aGVyIG1heSBiZSByZS1wb3N0ZWQgaW4gcGxhY2U6IHRoZSBjb3JyZWxhdGlvbiBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIChmb3IgcnVuX2NvbXBsZXRlZCkgdGhlIHJlc3VsdCBpdHNlbGYgY2FtZSBmcm9tXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcGxheSwgYW5kIGEgY29ycmVjdGVkIGxvZyBtYXkgcHJvZHVjZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IG9uZXMuIERvbid0IGZhaWwgdGhlIHJ1biDigJQgcmVzdGFydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBpbiB0aGlzIGludm9jYXRpb24sIGFuZCBvbmx5IG9uY2UgdGhhdCBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHNwZW50IHNjaGVkdWxlIGFuIGV4cGxpY2l0IHJlLWludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRocm93aW5nIGluc3RlYWQgd291bGQgcmVseSBvbiByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1VSUkVOVCBtZXNzYWdlLCB3aGljaCB0aGUgdHVyYm8gcGF0aCBoYXMgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNrZWQg4oCUIGVtcGlyaWNhbGx5IHRoZSBydW4gdGhlbiBzdGFsbHMgZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUncyB+MzAwcyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVybWluYWxFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0YXJ0UmVwbGF5SW5Qcm9jZXNzKCdyZXBsYXktd3JpdGUnLCBlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9IGF3YWl0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwbGF5LXdyaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FsYXRpb24ucmVpbnZva2VkKSByZXR1cm4gZXNjYWxhdGlvbi5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBlci1ydW4gYnVkZ2V0IHNwZW50LiBGYWxsIHRocm91Z2ggdG8gdGhlIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggYmVsb3cgaW5zdGVhZCBvZiByZXRocm93aW5nOiB0aGlzIGNhdGNoIG93bnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGluZyB0aGUgcnVuLCBhbmQgYSByZXRocm93IHdvdWxkIGVzY2FwZSB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgaGFuZGxlciBhbmQgYmUgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IgPSBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZXMgdGFsa2luZyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkICh3b3JrZmxvdy1zZXJ2ZXIpIOKAlCBhbiBleGhhdXN0ZWQgUmV0cnlBZ2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFVORF9FUlJfUkVRX1JFVFJZIGZyb20gYSBzdXN0YWluZWQgNDI5LzUwMyBzdG9ybSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGRyb3BwZWQgc29ja2V0LCBhIGNvbm5lY3QvRE5TIGZhaWx1cmUsIG9yIGEgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0IOKAlCBtdXN0IE5PVCBmYWlsIHRoZSBydW4uIFJldGhyb3cgc28gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJzIGFuZCBhIGZyZXNoIGludm9jYXRpb24gcmV0cmllcyB0aGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIHRoZSBiYWNrZW5kIHJlY292ZXJzLiBUaGUgQHZlcmNlbC9xdWV1ZSBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWVzIGEgZmFzdCAoMXPihpI2MHMpIGJhY2tvZmYgYnkgZGVsaXZlcnkgY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZGluZyB0aGUgfjVtaW4gZGVmYXVsdCB2aXNpYmlsaXR5LXRpbWVvdXQgcmVkcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGFuZCBuZXZlciBraWxsaW5nIHRoZSBwcm9jZXNzIHZpYSBydW5fZmFpbGVkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Mb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJhbnNpZW50IHdvcmxkIGVycm9yIGR1cmluZyByZXBsYXk7IHJlZGVsaXZlcmluZyB2aWEgcXVldWUgaW5zdGVhZCBvZiBmYWlsaW5nIHRoZSBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXBsYXlEaXZlcmdlbmNlRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZlcmdlbmNlQ291bnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBsYXlEaXZlcmdlbmNlPy5jb3VudCA/PyAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFJlY292ZXJ5UmVwbGF5cyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGl2ZXJnZW5jZUNvdW50IDw9IG1heFJlY292ZXJ5UmVwbGF5cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJlcGxheSBkaXZlcmdlZDsgcXVldWVpbmcgYSByZWNvdmVyeSByZXBsYXkgYmVmb3JlIGRlY2xhcmluZyB0aGUgZXZlbnQgbG9nIGNvcnJ1cHRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLlJFUExBWV9ESVZFUkdFTkNFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlRXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yRGl2ZXJnZW5jZUV2ZW50SWQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZT8uZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlY292ZXJ5UmVwbGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IGRpdmVyZ2VuY2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmUgPSBkaXZlcmdlbmNlQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IgPSBuZXcgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkICR7ZGl2ZXJnZW5jZUNvdW50fSB0aW1lcyBhZnRlciAke21heFJlY292ZXJ5UmVwbGF5c30gcmVjb3ZlcnkgcmVwbGF5czsgbGF0ZXN0IGRpdmVyZ2VudCBldmVudCB3YXMgJHtlcnIuZXZlbnRJZH0uIExhc3QgZGl2ZXJnZW5jZTogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcGxheVN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgY29kZSBlcnJvcnMgYW5kIHRlcm1pbmFsIHJ1bnRpbWUgZXJyb3JzIGZhaWwgdGhlIHJ1bi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8ucmVjb3JkRXhjZXB0aW9uPy4odGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFcnJvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5vcm1hbGl6ZVVua25vd25FcnJvcih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5uYW1lIHx8IGdldEVycm9yTmFtZSh0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yU3RhY2sgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkRXJyb3Iuc3RhY2sgfHwgZ2V0RXJyb3JTdGFjayh0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsYXNzaWZ5IHRoZSBlcnJvcjogV29ya2Zsb3dSdW50aW1lRXJyb3IgaW5kaWNhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBTREsvcnVudGltZSBpc3N1ZSwgYW5kIHNlbGVjdGVkIHN1YmNsYXNzZXMgdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHNwZWNpZmljIGNvZGVzIGZvciBiYWNrZW5kIHRyYWNraW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcih0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcignRXJyb3Igd2hpbGUgcnVubmluZyB3b3JrZmxvdycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBzb3VyY2UtbWFwLXJlbWFwcGVkIHN0YWNrIHRvIHRoZSB0aHJvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHNvIHRoYXQgdGhlIHNlcmlhbGl6ZWQgZXJyb3IgcHJlc2VydmVzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY29uc3VtZXJzLiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCBpcyB1c2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGBlcnIgaW5zdGFuY2VvZiBFcnJvcmAgYmVjYXVzZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IHJ1bnMgaW4gYSBzZXBhcmF0ZSBWTSByZWFsbSDigJQgaXRzIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzcyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBob3N0J3MsIHNvIGBpbnN0YW5jZW9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFcnJvcmAgaXMgYGZhbHNlYCBmb3IgVk0tdGhyb3duIGVycm9ycy4gVGhlIFY4XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIHRhZyB3b3JrcyBhY3Jvc3MgcmVhbG1zLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzLmlzTmF0aXZlRXJyb3IodGVybWluYWxFcnJvcikgJiYgZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAodGVybWluYWxFcnJvciBhcyBFcnJvcikuc3RhY2sgPSBlcnJvclN0YWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsIHRoZSB3b3JrZmxvdyBydW4gdmlhIGV2ZW50IChldmVudC1zb3VyY2VkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIHNvIGl0cyBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIGlkZW50aXR5IGFuZCBjdXN0b20gcHJvcGVydGllcyByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlY29uZGl0aW9uLWd1YXJkIGFzeW1tZXRyeTogdW5saWtlIGBydW5fY29tcGxldGVkYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVybWluYWwgYHJ1bl9mYWlsZWRgIHNlbmRzIG5vIGBzdGF0ZVVwZGF0ZWRBdGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90LCBzbyBpdCBpcyBuZXZlciA0MTItcmVqZWN0ZWQgZXZlbiBpZiBhIGhvb2tcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhbmRlZCBtaWQtcmVwbGF5IGFuZCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIHBhdGggdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZXcuIFRoaXMgaXMgaW50ZW50aW9uYWwgYW5kIGZhaWwtb3BlbjogYSBzcHVyaW91c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSBpcyByZWNvdmVyYWJsZSAodGhlIHJ1biBjYW4gYmUgcmUtcnVuIGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXNoYm9hcmQpLCB3aGVyZWFzIGEgc3B1cmlvdXMgKmNvbXBsZXRpb24qIGNvbW1pdHMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvbmcgcmVzdWx0LiBHdWFyZGluZyB0aGlzIHdyaXRlIHN5bW1ldHJpY2FsbHkgd291bGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gbmVlZCB0aGUgbG9hZGVkIGV2ZW50IGxvZywgd2hpY2ggaXMgc2NvcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IGB0cnlgIGFib3ZlIGFuZCBub3QgYXZhaWxhYmxlIGluIHRoaXMgY2F0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogb3JkZXIgdGhlIHRlcm1pbmFsIHdyaXRlIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2VDb3VudDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZhaWxFcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuXG4gIGxldCBjYWNoZWRIYW5kbGVyOiAoKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4pIHwgdW5kZWZpbmVkO1xuICBsZXQgaW52b2NhdGlvbkNvdW50ID0gMDtcbiAgY29uc3QgZW50cnlwb2ludENyZWF0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJvdXRlTW9kdWxlQm9keUluaXRNcyA9XG4gICAgdHlwZW9mIG9wdGlvbnM/LnJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdCA9PT0gJ251bWJlcidcbiAgICAgID8gZW50cnlwb2ludENyZWF0ZWRBdCAtIG9wdGlvbnMucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gd2l0aEhlYWx0aENoZWNrKGFzeW5jIChyZXEpID0+IHtcbiAgICBpbnZvY2F0aW9uQ291bnQgKz0gMTtcbiAgICBjb25zdCBoYW5kbGVyQ2FjaGVkID0gY2FjaGVkSGFuZGxlciAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ1NFUlZFUicpO1xuXG4gICAgcmV0dXJuIHRyYWNlKFxuICAgICAgJ3dvcmtmbG93LnJvdXRlLmZsb3cnLFxuICAgICAge1xuICAgICAgICBraW5kOiBzcGFuS2luZCxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlVHlwZSgnZmxvdycpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5GYWFzSW5zdGFuY2UoQ09NUFVURV9JTlNUQU5DRV9JRCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVIYW5kbGVyQ2FjaGVkKGhhbmRsZXJDYWNoZWQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlSW52b2NhdGlvbkNvdW50KGludm9jYXRpb25Db3VudCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVFbnRyeXBvaW50QWdlTXMoXG4gICAgICAgICAgICBEYXRlLm5vdygpIC0gZW50cnlwb2ludENyZWF0ZWRBdFxuICAgICAgICAgICksXG4gICAgICAgICAgLi4uKHJvdXRlTW9kdWxlQm9keUluaXRNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IEF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlTW9kdWxlQm9keUluaXRNcyhyb3V0ZU1vZHVsZUJvZHlJbml0TXMpKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSHR0cFJlcXVlc3RNZXRob2QocmVxLm1ldGhvZCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkh0dHBSb3V0ZSgnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cnKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICBpZiAoIWNhY2hlZEhhbmRsZXIpIHtcbiAgICAgICAgICBjYWNoZWRIYW5kbGVyID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LnJvdXRlLmluaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3b3JsZEhhbmRsZXJzID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICd3b3JrZmxvdy5yb3V0ZS5nZXRfd29ybGRfaGFuZGxlcnMnLFxuICAgICAgICAgICAgICBhc3luYyAoKSA9PiBnZXRXb3JsZEhhbmRsZXJzKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlcih3b3JsZEhhbmRsZXJzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2FjaGVkSGFuZGxlcihyZXEpO1xuICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICBBdHRyaWJ1dGUuSHR0cFJlc3BvbnNlU3RhdHVzQ29kZShyZXNwb25zZS5zdGF0dXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59XG4iXX0=
3260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG1CQUFtQixHQUNwQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFLTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixxQkFBcUIsRUFFckIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixpQ0FBaUMsRUFFakMsMkJBQTJCLEdBRzVCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsb0JBQW9CLEdBQ3JCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBZ0Msa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0UsT0FBTyxFQUFlLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9D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Q0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQvc3RyaWN0JztcbmltcG9ydCB7IHR5cGVzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IsXG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBNYXhFdmVudHNFeGNlZWRlZEVycm9yLFxuICBQcmVjb25kaXRpb25GYWlsZWRFcnJvcixcbiAgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIHR5cGUgUnVuRXJyb3JDb2RlLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IG9uY2UsIHNldFdvcmtmbG93QmFzZVBhdGggfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VXb3JrZmxvd05hbWUsXG4gIHdvcmtmbG93RGlzcGxheU5hbWUsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB7XG4gIHR5cGUgQ3JlYXRlRXZlbnRQYXJhbXMsXG4gIHR5cGUgQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICB0eXBlIEV2ZW50LFxuICB0eXBlIEV2ZW50UmVzdWx0LFxuICBnZXRRdWV1ZVRvcGljUHJlZml4LFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBpc1Rlcm1pbmFsUnVuRXZlbnRUeXBlLFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYSxcbiAgdHlwZSBXb3JrZmxvd1J1bixcbiAgdHlwZSBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBtcyBmcm9tICdtcyc7XG5pbXBvcnQgeyBkZWNvZGVUaW1lIH0gZnJvbSAndWxpZCc7XG5pbXBvcnQge1xuICBjbGFzc2lmeVJ1bkVycm9yLFxuICBpc1JldHJ5YWJsZVdvcmxkRXJyb3IsXG4gIGlzV29ybGRDb250cmFjdEVycm9yLFxufSBmcm9tICcuL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGRlc2NyaWJlRXJyb3IgfSBmcm9tICcuL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IHR5cGUgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0sIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHsgQ09NUFVURV9JTlNUQU5DRV9JRCB9IGZyb20gJy4vcnVudGltZS9jb21wdXRlLWluc3RhbmNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1heEV2ZW50c092ZXJyaWRlLFxuICBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMsXG4gIGdldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzLFxuICBnZXRQcmVjb25kaXRpb25NYXhSZWludm9jYXRpb25zLFxuICBnZXRQcmVjb25kaXRpb25SZWludm9rZURlbGF5U2Vjb25kcyxcbiAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMsXG4gIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCxcbiAgaXNUdXJib0VuYWJsZWQsXG4gIGlzVm1SZXRlbnRpb25FbmFibGVkLFxufSBmcm9tICcuL3J1bnRpbWUvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMgfSBmcm9tICcuL3J1bnRpbWUvY291bnQtc3RlcC1zdGFydGVkLWV2ZW50cy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIERlcGxveW1lbnRBZmZpbml0eU91dGNvbWUsXG4gIGd1YXJkRGVwbG95bWVudEFmZmluaXR5LFxuICB0eXBlIFJlZW5xdWV1ZUFyZ3MsXG59IGZyb20gJy4vcnVudGltZS9kZXBsb3ltZW50LWd1YXJkLmpzJztcbmltcG9ydCB7XG4gIGFwcGVuZFVuaXF1ZUV2ZW50cyxcbiAgZ2V0UXVldWVPdmVyaGVhZCxcbiAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUsXG4gIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZSxcbiAgaW5zZXJ0RXZlbnRCeUV2ZW50SWQsXG4gIGlzUHJlY29uZGl0aW9uR3VhcmRFbmFibGVkLFxuICBpc1Nsb3RHYXBDaGVja0VuYWJsZWQsXG4gIHR5cGUgTG9hZGVkRXZlbnRMb2csXG4gIGxvYWRXb3JrZmxvd1J1bkV2ZW50cyxcbiAgbWVtb2l6ZUVuY3J5cHRpb25LZXksXG4gIG1lcmdlUmVwb3J0ZWRFdmVudHMsXG4gIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBwcmVjb25kaXRpb25FdmVudERlbHRhLFxuICBwcmVjb25kaXRpb25TbmFwc2hvdFBhcmFtcyxcbiAgcXVldWVNZXNzYWdlLFxuICBzZXR0bGVFdmVudFNsb3RHYXAsXG4gIHdpdGhIZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkLFxuICBSZXBsYXlCdWRnZXQsXG59IGZyb20gJy4vcnVudGltZS9yZXBsYXktYnVkZ2V0LmpzJztcbmltcG9ydCB7IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgfSBmcm9tICcuL3J1bnRpbWUvcmVwbGF5LXJlY292ZXJ5LXJlcG9ydGVyLmpzJztcbmltcG9ydCB7IHJ1bklkQ3JlYXRlZEF0IH0gZnJvbSAnLi9ydW50aW1lL3J1bi1pZC10aW1lLmpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUyxcbiAgZXhlY3V0ZVN0ZXAsXG59IGZyb20gJy4vcnVudGltZS9zdGVwLWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nIH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtbGF0ZW5jeS5qcyc7XG5pbXBvcnQge1xuICBiYWNrc3RvcElkZW1wb3RlbmN5S2V5LFxuICBoYXNQZW5kaW5nU3RlcE93bmVkQnlNZXNzYWdlLFxuICBpc1N0ZXBPd25lcnNoaXBBY3RpdmUsXG4gIHN0ZXBMZWFzZVJlbWFpbmluZ1NlY29uZHMsXG59IGZyb20gJy4vcnVudGltZS9zdGVwLW93bmVyc2hpcC5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtc2luZ2xlLWZsaWdodC5qcyc7XG5pbXBvcnQgeyBoYW5kbGVTdXNwZW5zaW9uIH0gZnJvbSAnLi9ydW50aW1lL3N1c3BlbnNpb24taGFuZGxlci5qcyc7XG5pbXBvcnQgeyB1c2VRdWlja0pTVm0gfSBmcm9tICcuL3J1bnRpbWUvdm0tbW9kZS5qcyc7XG5pbXBvcnQgeyBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2ggfSBmcm9tICcuL3J1bnRpbWUvd2FpdC1jb250aW51YXRpb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0V29ybGQsXG4gIGdldFdvcmxkSGFuZGxlcnMsXG4gIHR5cGUgV29ybGRIYW5kbGVycyxcbn0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJztcbmltcG9ydCB7IGRlaHlkcmF0ZVJ1bkVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHJlbWFwRXJyb3JTdGFjayB9IGZyb20gJy4vc291cmNlLW1hcC5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzLFxuICBnZXROZXh0VHJhY2VDYXJyaWVyLFxuICBnZXRTcGFuS2luZCxcbiAgZ2V0V29ya2Zsb3dUcmFjZU1vZGUsXG4gIGlzVXNhYmxlVHJhY2VDYXJyaWVyLFxuICB0cmFjZSxcbiAgd2l0aFRyYWNlQ29udGV4dCxcbiAgd2l0aFdvcmtmbG93QmFnZ2FnZSxcbn0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JOYW1lLCBnZXRFcnJvclN0YWNrLCBub3JtYWxpemVVbmtub3duRXJyb3IgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZSB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQge1xuICByZXBsYXlXb3JrZmxvdyxcbiAgcmVzdW1lV29ya2Zsb3csXG4gIHR5cGUgV29ya2Zsb3dSZXN1bWVSZXN1bHQsXG4gIHR5cGUgV29ya2Zsb3dTZXNzaW9uLFxufSBmcm9tICcuL3dvcmtmbG93LmpzJztcblxuZXhwb3J0IHR5cGUgeyBFdmVudCwgV29ya2Zsb3dSdW4gfTtcbmV4cG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgSGVhbHRoQ2hlY2tPcHRpb25zLFxuICB0eXBlIEhlYWx0aENoZWNrUmVzdWx0LFxuICBoZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuZXhwb3J0IHtcbiAgZ2V0SG9va0J5VG9rZW4sXG4gIHR5cGUgUmVzdW1lZEhvb2ssXG4gIHJlc3VtZUhvb2ssXG4gIHJlc3VtZVdlYmhvb2ssXG59IGZyb20gJy4vcnVudGltZS9yZXN1bWUtaG9vay5qcyc7XG5leHBvcnQge1xuICBnZXRSdW4sXG4gIFJ1bixcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zLFxufSBmcm9tICcuL3J1bnRpbWUvcnVuLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgQ2FuY2VsUnVuT3B0aW9ucyxcbiAgY2FuY2VsUnVuLFxuICBjYW5jZWxSdW5zLFxuICBsaXN0U3RyZWFtcyxcbiAgdHlwZSBSZWFkU3RyZWFtT3B0aW9ucyxcbiAgdHlwZSBSZWNyZWF0ZVJ1bk9wdGlvbnMsXG4gIHR5cGUgUmVlbnF1ZXVlUnVuT3B0aW9ucyxcbiAgcmVhZFN0cmVhbSxcbiAgcmVjcmVhdGVSdW5Gcm9tRXhpc3RpbmcsXG4gIHJlZW5xdWV1ZVJ1bixcbiAgdHlwZSBTdG9wU2xlZXBPcHRpb25zLFxuICB0eXBlIFN0b3BTbGVlcFJlc3VsdCxcbiAgd2FrZVVwUnVuLFxufSBmcm9tICcuL3J1bnRpbWUvcnVucy5qcyc7XG5leHBvcnQge1xuICB0eXBlIFN0YXJ0T3B0aW9ucyxcbiAgdHlwZSBTdGFydE9wdGlvbnNCYXNlLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCxcbiAgc3RhcnQsXG59IGZyb20gJy4vcnVudGltZS9zdGFydC5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVXb3JsZCxcbiAgY3JlYXRlV29ybGRGcm9tTW9kdWxlLFxuICBnZXRXb3JsZCxcbiAgZ2V0V29ybGRIYW5kbGVycyxcbiAgc2V0V29ybGQsXG4gIHR5cGUgV29ybGRGYWN0b3J5TW9kdWxlLFxufSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuXG4vKipcbiAqIEFwcGx5IHRoZSBvcHRpb25hbCBjbGllbnQtc2lkZSBldmVudC1saW1pdCBvdmVycmlkZS5cbiAqIGBXT1JLRkxPV19NQVhfRVZFTlRTX09WRVJSSURFYCwgd2hlbiBzZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyLCBjbGFtcHMgdGhlXG4gKiBzZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIHRvIGEgc21hbGxlciB2YWx1ZSBzbyBlbmZvcmNlbWVudCBjYW5cbiAqIGJlIGV4ZXJjaXNlZCB3aXRob3V0IGEgc2VydmVyLXNpZGUgY2hhbmdlLiBDbGFtcC1kb3duIG9ubHk6IGl0IG5ldmVyIHJhaXNlc1xuICogdGhlIHNlcnZlcidzIGxpbWl0LCBhbmQgaXQgdGFrZXMgZWZmZWN0IGV2ZW4gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgbm9uZS5cbiAqIFVuc2V0IOKHkiBzZXJ2ZXIgdmFsdWUgcGFzc2VzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBjbGFtcE1heEV2ZW50cyhzZXJ2ZXJWYWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBnZXRNYXhFdmVudHNPdmVycmlkZSgpO1xuICBpZiAob3ZlcnJpZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHNlcnZlclZhbHVlO1xuICByZXR1cm4gc2VydmVyVmFsdWUgPT09IHVuZGVmaW5lZCA/IG92ZXJyaWRlIDogTWF0aC5taW4oc2VydmVyVmFsdWUsIG92ZXJyaWRlKTtcbn1cblxuLyoqXG4gKiBSZWZ1c2UgYSBxdWV1ZSBkZWxpdmVyeSB3aG9zZSBydW4gd2FzIGNyZWF0ZWQgaW4gYSBkaWZmZXJlbnQgZW52aXJvbm1lbnQgdGhhblxuICogdGhpcyBkZXBsb3ltZW50IHJ1bnMgaW4uXG4gKlxuICogYHN0YXJ0KClgIHBlcmZvcm1zIHR3byB3cml0ZXMgdGhhdCBtdXN0IGxhbmQgaW4gdGhlIHNhbWUgdGVuYW50OiB0aGVcbiAqIGBydW5fY3JlYXRlZGAgZXZlbnQsIGF0dHJpYnV0ZWQgdG8gd2hhdGV2ZXIgZW52aXJvbm1lbnQgdGhlICpjYWxsZXIqXG4gKiBhdXRoZW50aWNhdGVzIGFzLCBhbmQgdGhlIHF1ZXVlIG1lc3NhZ2UsIHBpbm5lZCB0byBhICpkZXBsb3ltZW50Ki4gQVxuICogbWlzY29uZmlndXJlZCBjYWxsZXIgY2FuIHNwbGl0IHRoZW0g4oCUIHdyaXRpbmcgdGhlIHJ1biB0byBvbmUgZW52aXJvbm1lbnRcbiAqIHdoaWxlIGFkZHJlc3NpbmcgdGhlIG1lc3NhZ2UgdG8gYSBkZXBsb3ltZW50IGluIGFub3RoZXIuIFRoZSBjb25zdW1lciB0aGVuXG4gKiBmaW5kcyBubyBydW4gdW5kZXIgaXRzIG93biB0ZW5hbnQgYW5kIHRoZSBiYWNrZW5kJ3MgcmVzaWxpZW50IHN0YXJ0XG4gKiAoYHJ1bl9zdGFydGVkYCBjcmVhdGVzIHRoZSBydW4gd2hlbiBgcnVuX2NyZWF0ZWRgIHdhcyBuZXZlciBzZWVuKSBtaW50cyBhXG4gKiBTRUNPTkQgY29weSBvZiB0aGUgc2FtZSBydW4gaWQgaW4gdGhpcyBlbnZpcm9ubWVudC4gQm90aCBjb3BpZXMgYXJlIHJlYWw6IHRoZVxuICogY3JlYXRvcidzIHNpdHMgcGVuZGluZyBmb3JldmVyLCB0aGlzIG9uZSBleGVjdXRlcywgYW5kIGV2ZXJ5IHN1YnNlcXVlbnRcbiAqIGNyb3NzLXRlbmFudCBxdWV1ZSBhY2sgZmFpbHMgdG8gZmluZCBpdHMgbWVzc2FnZS5cbiAqXG4gKiBOb3RoaW5nIGV4dGVybmFsIGlzIG5lZWRlZCB0byBjYXRjaCB0aGlzOiB0aGUgY3JlYXRvcidzIGVudmlyb25tZW50IHJpZGVzIHRoZVxuICogbWVzc2FnZSBpbiBgcnVuSW5wdXQuZW52aXJvbm1lbnRgIGFuZCB0aGlzIHByb2Nlc3MgYWxyZWFkeSBrbm93cyBpdHMgb3duLiBTb1xuICogY29tcGFyZSB0aGVtIGFuZCBzdG9wIEJFRk9SRSBgcnVuX3N0YXJ0ZWRgIOKAlCB0aGUgd3JpdGUgdGhhdCB3b3VsZCBjcmVhdGUgdGhlXG4gKiBmb3JrLiBSZWZ1c2luZyBhZnRlciBpdCB3b3VsZCBiZSB0b28gbGF0ZS5cbiAqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBjYWxsZXIgbXVzdCBhYmFuZG9uIHRoZSBkZWxpdmVyeS4gU2tpcHBlZCB3aGVuZXZlclxuICogZWl0aGVyIHNpZGUgaXMgdW5rbm93biwgd2hpY2gga2VlcHMgZXZlcnkgZXhpc3Rpbmcgc2V0dXAgb24gaXRzIGN1cnJlbnRcbiAqIGJlaGF2aW9yOiB3b3JsZHMgd2l0aCBubyBlbnZpcm9ubWVudCBkaW1lbnNpb24gKGB3b3JsZC1sb2NhbGAsXG4gKiBgd29ybGQtcG9zdGdyZXNgKSBkb24ndCBpbXBsZW1lbnQgYGdldEVudmlyb25tZW50YCwgYW5kIHJ1bnMgc3RhcnRlZCBieSBhblxuICogb2xkZXIgU0RLIGNhcnJ5IG5vIGBlbnZpcm9ubWVudGAgZmllbGQuXG4gKi9cbmZ1bmN0aW9uIHJlZnVzZUNyb3NzRW52aXJvbm1lbnREZWxpdmVyeSh7XG4gIHdvcmxkLFxuICBydW5JbnB1dCxcbiAgcnVuSWQsXG4gIHJ1bkxvZ2dlcixcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICBydW5JbnB1dDogUnVuSW5wdXQgfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJ1bkxvZ2dlcjogTG9nZ2VyO1xufSk6IGJvb2xlYW4ge1xuICBjb25zdCBjcmVhdG9yRW52aXJvbm1lbnQgPSBydW5JbnB1dD8uZW52aXJvbm1lbnQ7XG4gIGlmICghY3JlYXRvckVudmlyb25tZW50KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgY3VycmVudEVudmlyb25tZW50ID0gd29ybGQuZ2V0RW52aXJvbm1lbnQ/LigpO1xuICBpZiAoIWN1cnJlbnRFbnZpcm9ubWVudCB8fCBjdXJyZW50RW52aXJvbm1lbnQgPT09IGNyZWF0b3JFbnZpcm9ubWVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJ1bkxvZ2dlci5lcnJvcihcbiAgICBgUmVmdXNpbmcgdG8gcnVuIHRoaXMgd29ya2Zsb3c6IGl0IHdhcyBjcmVhdGVkIGluIHRoZSBcIiR7Y3JlYXRvckVudmlyb25tZW50fVwiIGAgK1xuICAgICAgYGVudmlyb25tZW50IGJ1dCB0aGlzIGRlcGxveW1lbnQgcnVucyBpbiBcIiR7Y3VycmVudEVudmlyb25tZW50fVwiLiBgICtcbiAgICAgICdFeGVjdXRpbmcgaXQgaGVyZSB3b3VsZCBjcmVhdGUgYSBzZWNvbmQgY29weSBvZiB0aGUgc2FtZSBydW4gaWQgaW4gJyArXG4gICAgICAnYm90aCBlbnZpcm9ubWVudHMg4oCUIG9uZSBwZW5kaW5nIGZvcmV2ZXIsIG9uZSBydW5uaW5nIOKAlCBzbyB0aGUgcXVldWUgJyArXG4gICAgICAnbWVzc2FnZSBpcyBiZWluZyBkaXNjYXJkZWQgd2l0aG91dCBleGVjdXRpbmcgYW5kIHdpdGhvdXQgcmV0cnlpbmcuICcgK1xuICAgICAgJ1RoZSBjbGllbnQgdGhhdCBjYWxsZWQgc3RhcnQoKSB3cm90ZSB0aGUgcnVuIHRvIGl0cyBvd24gZW52aXJvbm1lbnQgJyArXG4gICAgICAnYnV0IGFkZHJlc3NlZCB0aGUgcXVldWUgbWVzc2FnZSB0byBhIGRlcGxveW1lbnQgaW4gYW5vdGhlciBvbmUuIENoZWNrICcgK1xuICAgICAgJ3RoYXQgdGhlIGVudmlyb25tZW50IHRoYXQgY2xpZW50IGF1dGhlbnRpY2F0ZXMgYXMgKFdPUktGTE9XX1ZFUkNFTF9FTlYgJyArXG4gICAgICBcImZvciBDTEkgYW5kIENJIGNsaWVudHMsIG9yIHRoZSBPSURDIHRva2VuJ3MgZW52aXJvbm1lbnQgaW5zaWRlIGEgXCIgK1xuICAgICAgJ2RlcGxveW1lbnQpIG1hdGNoZXMgdGhlIGVudmlyb25tZW50IG9mIHRoZSBkZXBsb3ltZW50IGl0IHRhcmdldHMuIFRoZSAnICtcbiAgICAgIGBydW4gaXQgY3JlYXRlZCBpcyBzdGlsbCBwZW5kaW5nIGluIFwiJHtjcmVhdG9yRW52aXJvbm1lbnR9XCIgYW5kIHdpbGwgYCArXG4gICAgICAnbm90IHJ1bi4nLFxuICAgIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgY3JlYXRvckVudmlyb25tZW50LFxuICAgICAgY3VycmVudEVudmlyb25tZW50LFxuICAgICAgcGlubmVkRGVwbG95bWVudElkOiBydW5JbnB1dD8uZGVwbG95bWVudElkLFxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogTG9nIHdoZW4gYSBgc3RhcnQoKWAtZW5xdWV1ZWQgbWVzc2FnZSBwaW5uZWQgdG8gb25lIGRlcGxveW1lbnQgaXMgZGVsaXZlcmVkXG4gKiB0byBhIGRpZmZlcmVudCBvbmUuXG4gKlxuICogQSBmaXJzdC1kZWxpdmVyeSBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0LmRlcGxveW1lbnRJZGAg4oCUIHRoZSBkZXBsb3ltZW50XG4gKiBgc3RhcnQoKWAgYWRkcmVzc2VkIGl0IHRvIOKAlCBzbyBjb21wYXJpbmcgdGhhdCBhZ2FpbnN0IHRoaXMgaGFuZGxlcidzIG93blxuICogZGVwbG95bWVudCBkZXRlY3RzIG1pcy1kZWxpdmVyeSBkaXJlY3RseS4gVGhpcyBpcyBhIERJQUdOT1NUSUMsIG5vdCBhIGdhdGU6XG4gKiBpdCB3YXJucyBhbmQgbGV0cyB0aGUgaW52b2NhdGlvbiBwcm9jZWVkLCBkZWxpYmVyYXRlbHkuXG4gKlxuICogV2h5IHRoaXMgb25lIG9ubHkgd2FybnMgd2hpbGUgaXRzIGVudmlyb25tZW50IHNpYmxpbmcgYWJvdmUgcmVmdXNlczogYVxuICogZGlmZmVyaW5nIGRlcGxveW1lbnQgaWQgaXMgbm90IGJ5IGl0c2VsZiBldmlkZW5jZSBvZiB0aGUgZm9yayB3ZSBjYXJlIGFib3V0LlxuICogVGhlIGVudmlyb25tZW50IHBhaXIgaXMgZXhhY3Qg4oCUIHR3byBuYW1lZCBlbnZpcm9ubWVudHMgdGhhdCBkaXNhZ3JlZSDigJQgYW5kIGl0XG4gKiBpcyB0aGUgZGltZW5zaW9uIHRoZSBydW4ncyB0ZW5hbnQgaXMga2V5ZWQgb24uIERlcGxveW1lbnQgaWRzIGRpc2FncmVlIGZvclxuICogYmVuaWduIHJlYXNvbnMgdG9vOiBgd29ybGQtbG9jYWxgIGRlcml2ZXMgaXRzIGlkIGZyb20gdGhlIGluc3RhbGxlZCBwYWNrYWdlXG4gKiB2ZXJzaW9uIChgZHBsX2xvY2FsQDx2ZXJzaW9uPmApLCBzbyB1cGdyYWRpbmcgdGhlIFNESyBtaWQtcnVuIGNoYW5nZXMgaXQgd2l0aFxuICogbm90aGluZyB3cm9uZy4gUmVmdXNpbmcgb24gdGhhdCBzaWduYWwgd291bGQgc3RyYW5kIGNvcnJlY3QgcnVucywgYW5kXG4gKiByZWZ1c2luZyBiZWZvcmUgYHJ1bl9zdGFydGVkYCBsZWF2ZXMgbm8gc2VydmVyLXNpZGUgcmVjb3JkIHRvIGV4cGxhaW4gd2h5LlxuICogQW55b25lIHRlbXB0ZWQgdG8gcHJvbW90ZSB0aGlzIHRvIGEgaGFyZCBmYWlsdXJlIGhhcyB0byBoYW5kbGUgdGhhdCBmaXJzdC5cbiAqXG4gKiBTa2lwcGVkIHVubGVzcyBCT1RIIGlkcyBhcmUga25vd24g4oCUIGBnZXREZXBsb3ltZW50SWQoKWAgdGhyb3dzIGluIHdvcmxkcyB0aGF0XG4gKiByZXF1aXJlIGEgZGVwbG95bWVudCBhbmQgaGF2ZSBub25lLCBhbmQgYSByZS1lbnF1ZXVlZCBtZXNzYWdlIGNhcnJpZXMgbm9cbiAqIGBydW5JbnB1dGAgYXQgYWxsLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YXJuT25EZXBsb3ltZW50UGlubmluZ01pc21hdGNoKHtcbiAgd29ybGQsXG4gIHJ1bklucHV0LFxuICBydW5JZCxcbiAgcnVuTG9nZ2VyLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bklucHV0OiBSdW5JbnB1dCB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcnVuTG9nZ2VyOiBMb2dnZXI7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBpbm5lZERlcGxveW1lbnRJZCA9IHJ1bklucHV0Py5kZXBsb3ltZW50SWQ7XG4gIGlmICghcGlubmVkRGVwbG95bWVudElkKSByZXR1cm47XG5cbiAgbGV0IGN1cnJlbnREZXBsb3ltZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFdvcmxkcyB0aGF0IHJlcXVpcmUgYSBkZXBsb3ltZW50IGlkIHRocm93IHdoZW4gdGhlcmUgaXNuJ3Qgb25lLiBUaGF0IGlzXG4gICAgLy8gbm90IGEgbWlzbWF0Y2gg4oCUIHRoZXJlIGlzIHNpbXBseSBub3RoaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFjdXJyZW50RGVwbG95bWVudElkIHx8IGN1cnJlbnREZXBsb3ltZW50SWQgPT09IHBpbm5lZERlcGxveW1lbnRJZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAnUXVldWUgbWVzc2FnZSB3YXMgZGVsaXZlcmVkIHRvIGEgZGVwbG95bWVudCBpdCB3YXMgbm90IHBpbm5lZCB0by4gJyArXG4gICAgICAnVGhlIHJ1biB3YXMgY3JlYXRlZCB0YXJnZXRpbmcgYSBkaWZmZXJlbnQgZGVwbG95bWVudCwgc28gdGhpcyAnICtcbiAgICAgICdpbnZvY2F0aW9uIG1heSBiZSByZXBsYXlpbmcgYWdhaW5zdCBjb2RlIHRoZSBydW4gd2FzIG5vdCBzdGFydGVkIG9uLiAnICtcbiAgICAgICdDb250aW51aW5nIOKAlCB0aGlzIGlzIGV4cGVjdGVkIGlmIHRoZSBXb3JrZmxvdyBTREsgdmVyc2lvbiBjaGFuZ2VkICcgK1xuICAgICAgJ21pZC1ydW4gaW4gbG9jYWwgZGV2ZWxvcG1lbnQsIHdoZXJlIHRoZSBkZXBsb3ltZW50IGlkIGlzIGRlcml2ZWQgZnJvbSAnICtcbiAgICAgICd0aGF0IHZlcnNpb24uJyxcbiAgICB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIHBpbm5lZERlcGxveW1lbnRJZCxcbiAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQsXG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycjogdW5rbm93bik6IFJ1bkVycm9yQ29kZSB8IG51bGwge1xuICBpZiAoV29ya2Zsb3dSdW50aW1lRXJyb3IuaXMoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuUlVOVElNRV9FUlJPUjtcbiAgfVxuXG4gIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgd29ybGQsXG4gIHdvcmtmbG93UnVuLFxuICBydW5JZCxcbiAgcmVxdWVzdElkLFxuICBlcnIsXG4gIGVycm9yQ29kZSxcbiAgbG9nTWVzc2FnZSxcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlcnI6IHVua25vd247XG4gIGVycm9yQ29kZTogUnVuRXJyb3JDb2RlO1xuICBsb2dNZXNzYWdlOiBzdHJpbmc7XG59KSB7XG4gIHJ1bnRpbWVMb2dnZXIuZXJyb3IobG9nTWVzc2FnZSwge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGVycm9yQ29kZSxcbiAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW4gPz8gcnVuSWQpO1xuICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICBydW5JZCxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICApLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IHJlcXVlc3RJZCB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICBlcnJvcjogZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yID8gZmFpbEVyci5tZXNzYWdlIDogU3RyaW5nKGZhaWxFcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBmYWlsRXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHM6IEV2ZW50W10sIHJ1bklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gVGVybWluYWwgcnVuIGV2ZW50cyBhcmUgYWx3YXlzIGxhc3QgYnkgY29uc3RydWN0aW9uIChubyBldmVudCBjcmVhdGlvblxuICAvLyBzdWNjZWVkcyBhZ2FpbnN0IGEgdGVybWluYWwgcnVuKSwgYnV0IHNjYW4gdGhlIGZ1bGwgYXJyYXkgZm9yXG4gIC8vIGRlZmVuc2UtaW4tZGVwdGg6IGEgV29ybGQvYmFja2VuZCBvcmRlcmluZyBidWcgc2hvdWxkbid0IG1ha2UgdXMgbWlzcyBhblxuICAvLyBhY3R1YWwgdGVybWluYXRpb24gc2lnbmFsLlxuICBjb25zdCB0ZXJtaW5hbFJ1bkV2ZW50ID0gZXZlbnRzLmZpbmQoXG4gICAgKGUpID0+XG4gICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgKGUuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICApO1xuXG4gIGlmICghdGVybWluYWxSdW5FdmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1J1biByZWFjaGVkIHRlcm1pbmFsIGV2ZW50LCBleGl0aW5nJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGV2ZW50VHlwZTogdGVybWluYWxSdW5FdmVudC5ldmVudFR5cGUsXG4gICAgZXZlbnRJZDogdGVybWluYWxSdW5FdmVudC5ldmVudElkLFxuICB9KTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBIb3cgbWFueSBvZiBgaWRzYCBhcmUgYWJzZW50IGZyb20gYHByZXNlbnRgLiAqL1xuZnVuY3Rpb24gY291bnRNaXNzaW5nSWRzKGlkczogSXRlcmFibGU8c3RyaW5nPiwgcHJlc2VudDogU2V0PHN0cmluZz4pOiBudW1iZXIge1xuICBsZXQgbWlzc2luZyA9IDA7XG4gIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgaWYgKCFwcmVzZW50LmhhcyhpZCkpIG1pc3NpbmcrKztcbiAgfVxuICByZXR1cm4gbWlzc2luZztcbn1cblxuLyoqXG4gKiBUaGUgbGluZWFnZSByb290IG9mIGEgbG9hZGVkIHJ1bjogaXRzIGAkcm9vdFJ1bklkYCBhdHRyaWJ1dGUsIG9yIGl0cyBvd24gaWRcbiAqIHdoZW4gaXQgaXMgaXRzZWxmIGEgcm9vdC5cbiAqL1xuZnVuY3Rpb24gcm9vdFJ1bklkRnJvbShcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGF0dHJpYnV0ZXM/LltST09UX1JVTl9JRF9BVFRSSUJVVEVdID8/IHJ1bklkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJ1biBoYXMgYSBob29rIGFuZC9vciB3YWl0IHRoYXQgYW4gb3V0LW9mLWJhbmQgd3JpdGVyIGNvdWxkXG4gKiBhcHBlbmQgYW4gZXZlbnQgZm9yIGJldHdlZW4gYW4gaW5saW5lIHN0ZXAncyBgc3RlcF9jb21wbGV0ZWRgIHdyaXRlIGFuZFxuICogdGhlIG5leHQgcmVwbGF5IOKAlCBuYW1lbHkgYW4gb3BlbiBob29rIChhIGBob29rX2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGBob29rX2Rpc3Bvc2VkYCwgd2hpY2ggYSB3ZWJob29rIHJlY2VpdmVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGBob29rX3JlY2VpdmVkYCkgb3IgYW4gb3BlbiB3YWl0IChhIGB3YWl0X2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGB3YWl0X2NvbXBsZXRlZGAsIHdoaWNoIHRoZSB3YWl0IHRpbWVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGB3YWl0X2NvbXBsZXRlZGApLlxuICpcbiAqIFRoaXMgZ2F0ZXMgVk0gcmV0ZW50aW9uLCB0aGUgaW5saW5lLWRlbHRhIGZhc3QgcGF0aCwgYW5kIHR1cmJvJ3MgZm9yY2VkXG4gKiBvcHRpbWlzdGljIHN0YXJ0LiBBIHRlcm1pbmFsLXN0ZXAgZGVsdGEgY2FuIG9taXQgYW4gZXZlbnQgYXBwZW5kZWRcbiAqIGNvbmN1cnJlbnRseSBhZnRlciB0aGF0IHdyaXRlLiBXaXRoIG5vIG9wZW4gaG9vayBvciB3YWl0LCBvbmx5IGNhbmNlbGxhdGlvblxuICogY2FuIGRvIHNvLCBhbmQgb2JzZXJ2aW5nIGl0IG9uZSByZXBsYXkgbGF0ZSBpcyBzYWZlIGJlY2F1c2UgdGhlIG5leHQgZW50aXR5XG4gKiB3cml0ZSBpcyByZWplY3RlZC5cbiAqXG4gKiBTdGVwLWJvZHkgYGF0dHJfc2V0YCB3cml0ZXMgYXJlIE5PVCBhIGNvbmNlcm46IHRoZXkgbGFuZCBiZWZvcmUgdGhlXG4gKiBzdGVwJ3MgdGVybWluYWwgd3JpdGUgYW5kIGFyZSB0aGVyZWZvcmUgYWxyZWFkeSBpbnNpZGUgdGhlIHJldHVybmVkXG4gKiBkZWx0YS5cbiAqL1xuZnVuY3Rpb24gb3Blbkhvb2tBbmRXYWl0U3RhdGUoZXZlbnRzOiBFdmVudFtdKToge1xuICBvcGVuSG9vazogYm9vbGVhbjtcbiAgb3BlbldhaXQ6IGJvb2xlYW47XG59IHtcbiAgY29uc3QgaG9va3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgd2FpdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSAnaG9va19jcmVhdGVkJzpcbiAgICAgICAgaG9va3MuYWRkKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hvb2tfZGlzcG9zZWQnOlxuICAgICAgICBob29rcy5kZWxldGUoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2FpdF9jcmVhdGVkJzpcbiAgICAgICAgd2FpdHMuYWRkKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dhaXRfY29tcGxldGVkJzpcbiAgICAgICAgd2FpdHMuZGVsZXRlKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgb3Blbkhvb2s6IGhvb2tzLnNpemUgPiAwLCBvcGVuV2FpdDogd2FpdHMuc2l6ZSA+IDAgfTtcbn1cblxudHlwZSBSZXBsYXlFdmVudExvZyA9XG4gIHwgeyB0eXBlOiAnbG9hZEFsbCcgfVxuICB8ICh7IHR5cGU6ICdyZWFkeScgfSAmIExvYWRlZEV2ZW50TG9nKVxuICB8ICh7IHR5cGU6ICdsb2FkQWZ0ZXInOyBjdXJzb3I6IHN0cmluZyB9ICYgTG9hZGVkRXZlbnRMb2cpO1xuXG5mdW5jdGlvbiBuZXh0RXZlbnRMb2dMb2FkKGxvZzogTG9hZGVkRXZlbnRMb2cpOiBSZXBsYXlFdmVudExvZyB7XG4gIGlmIChsb2cuY3Vyc29yID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ2xvYWRBbGwnIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnbG9hZEFmdGVyJyxcbiAgICBldmVudHM6IGxvZy5ldmVudHMsXG4gICAgY3Vyc29yOiBsb2cuY3Vyc29yLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhcHBlbmRFdmVudExvZyhsb2c6IExvYWRlZEV2ZW50TG9nLCBhcHBlbmRlZDogTG9hZGVkRXZlbnRMb2cpOiB2b2lkIHtcbiAgYXBwZW5kVW5pcXVlRXZlbnRzKGxvZy5ldmVudHMsIGFwcGVuZGVkLmV2ZW50cyk7XG4gIGxvZy5jdXJzb3IgPSBhcHBlbmRlZC5jdXJzb3IgPz8gbG9nLmN1cnNvcjtcbn1cblxuLyoqXG4gKiBUaGUgd2hvbGUgcmV0ZW50aW9uIHByZWRpY2F0ZToga2VlcCB0aGUgc2Vzc2lvbiBvbmx5IGZvciBhIHB1cmUgc3RlcFxuICogYm91bmRhcnkgKGV2ZXJ5IHN1c3BlbnNpb24gaXRlbSBpcyBhIHN0ZXAg4oCUIGFueSBvdGhlciBpdGVtIHR5cGUsIHByZXNlbnRcbiAqIG9yIGZ1dHVyZSwgaXMgdW5yZXRhaW5hYmxlIGJ5IGRlZmF1bHQpIHdob3NlIG5ldyBzdGVwIGlucHV0cyBzZXJpYWxpemVkXG4gKiB3aXRob3V0IGV4ZWN1dGluZyB3b3JrZmxvdyBjb2RlLCB3aXRoIG5vIG91dC1vZi1iYW5kIGNvbnRpbnVhdGlvbiBzb3VyY2U6XG4gKiBhdHRyaWJ1dGVzIHJlcXVpcmUgcmVwbGF5OyBob29rcyBhbmQgd2FpdHMgY2FuIHdha2UgYW5vdGhlciBpbnZvY2F0aW9uLlxuICogYFdPUktGTE9XX1JFVEFJTkVEX1ZNPTBgIGRpc2FibGVzIHJldGVudGlvbiBlbnRpcmVseS5cbiAqXG4gKiBUaGUgb3BlbiBob29rL3dhaXQgc2NhbiBpcyBPKGV2ZW50cyksIHNvIGl0IGlzIHRha2VuIHRocm91Z2ggYSBsYXp5IGdldHRlclxuICogYW5kIGNvbnN1bHRlZCBsYXN0LCBhZnRlciBldmVyeSBjaGVhcCBjaGVjayBoYXMgcGFzc2VkLlxuICpcbiAqIElOVkFSSUFOVCB0aGlzIHByZWRpY2F0ZSBsZWFucyBvbjogZXZlcnkgc3VzcGVuc2lvbiBzaWduYWxlciB0aGF0IGRvZXMgTk9UXG4gKiBjYXJyeSB0aGUgc3RlcC1jb25zdW1lciBnZW5lcmF0aW9uIGd1YXJkIChzbGVlcCwgaG9vaywgYXR0cmlidXRlIOKAlCBzZWVcbiAqIGBzdXNwZW5zaW9uR2VuZXJhdGlvbmAgaW4gcHJpdmF0ZS50cykgbXVzdCBiZSB1bnJldGFpbmFibGUgaGVyZSwgZWl0aGVyIHZpYVxuICogYSBub24tc3RlcCBxdWV1ZSBpdGVtIG9yIHRoZSBvcGVuIGhvb2svd2FpdCBzY2FuLiBBIG5ldyBzaWduYWxlciB0aGF0XG4gKiBzYXRpc2ZpZXMgbmVpdGhlciB3b3VsZCBsZXQgYSBzdGFsZSBzaWduYWwgYmUgYWNjZXB0ZWQgYXMgYSBmcmVzaFxuICogc3VzcGVuc2lvbiBvbiBhIHJlc3VtZWQgc2Vzc2lvbi5cbiAqXG4gKiBRdWllc2NlbmNlIGFzc3VtZXMgd29ya2Zsb3cgY29kZSBzdGF5cyBpbnNpZGUgdGhlIHNhbmRib3gncyBkZXRlcm1pbmlzbVxuICogY29udHJhY3QuIEVzY2FwaW5nIHRvIHRoZSBob3N0IHJlYWxtIChlLmcuIHJlY292ZXJpbmcgdGhlIGhvc3QgYEZ1bmN0aW9uYFxuICogY29uc3RydWN0b3IgZnJvbSBhbiBleHBvc2VkIGhvc3QgY2xhc3MgdG8gc2NoZWR1bGUgcmVhbCB0aW1lcnMpIG1ha2VzIGFcbiAqIHdvcmtmbG93IG5vbmRldGVybWluaXN0aWMgdW5kZXIgb3JkaW5hcnkgcmVwbGF5IHRvbywgYW5kIGlzIG5vdCBkZWZlbmRlZFxuICogaGVyZS5cbiAqL1xuZnVuY3Rpb24gY2FuUmV0YWluV29ya2Zsb3dTZXNzaW9uKFxuICBzdXNwZW5zaW9uOiBXb3JrZmxvd1N1c3BlbnNpb24sXG4gIHN0ZXBJbnB1dHNTYWZlOiBib29sZWFuLFxuICBvcGVuSG9va1dhaXQ6IHsgdmFsdWU6IFJldHVyblR5cGU8dHlwZW9mIG9wZW5Ib29rQW5kV2FpdFN0YXRlPiB9XG4pOiBib29sZWFuIHtcbiAgaWYgKFxuICAgICFpc1ZtUmV0ZW50aW9uRW5hYmxlZCgpIHx8XG4gICAgIXN0ZXBJbnB1dHNTYWZlIHx8XG4gICAgc3VzcGVuc2lvbi5zdGVwcy5sZW5ndGggPT09IDAgfHxcbiAgICAhc3VzcGVuc2lvbi5zdGVwcy5ldmVyeSgoaXRlbSkgPT4gaXRlbS50eXBlID09PSAnc3RlcCcpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB7IG9wZW5Ib29rLCBvcGVuV2FpdCB9ID0gb3Blbkhvb2tXYWl0LnZhbHVlO1xuICByZXR1cm4gIW9wZW5Ib29rICYmICFvcGVuV2FpdDtcbn1cblxuLyoqXG4gKiBNYXhpbXVtIGlubGluZS1leGVjdXRpb24gZHVyYXRpb24gZm9yIGEgc2luZ2xlIGhhbmRsZXIgaW52b2NhdGlvbi5cbiAqXG4gKiBPcmRlciBvZiBwcmVjZWRlbmNlOlxuICogMS4gYFdPUktGTE9XX1YyX1RJTUVPVVRfTVNgIGVudiB2YXJcbiAqIDIuIFRpZXJlZCBidWRnZXQgZGVyaXZlZCBmcm9tIGB3b3JsZC5nZXRSdW50aW1lRGVhZGxpbmUoKWBcbiAqIDMuIERlZmF1bHQgb2YgMiBtaW51dGVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElubGluZUR1cmF0aW9uTXMoXG4gIHdvcmxkOiBXb3JsZCxcbiAgaW52b2NhdGlvblN0YXJ0VGltZTogbnVtYmVyXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByYXdFbnZPdmVycmlkZSA9IHByb2Nlc3MuZW52LldPUktGTE9XX1YyX1RJTUVPVVRfTVM7XG4gIGlmIChyYXdFbnZPdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmIHJhd0Vudk92ZXJyaWRlICE9PSAnJykge1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihyYXdFbnZPdmVycmlkZSk7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShwYXJzZWQpICYmIHBhcnNlZCA+IDApIHtcbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcnVudGltZURlYWRsaW5lID0gYXdhaXQgd29ybGQuZ2V0UnVudGltZURlYWRsaW5lPy4oKTtcbiAgaWYgKHJ1bnRpbWVEZWFkbGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZGVhZGxpbmVNcyA9IHJ1bnRpbWVEZWFkbGluZS5nZXRUaW1lKCk7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4oZGVhZGxpbmVNcykpIHtcbiAgICAgIGNvbnN0IG1heER1cmF0aW9uTXMgPSBNYXRoLmZsb29yKGRlYWRsaW5lTXMgLSBpbnZvY2F0aW9uU3RhcnRUaW1lKTtcbiAgICAgIGlmIChtYXhEdXJhdGlvbk1zID49IG1zKCcyNW0nKSkge1xuICAgICAgICByZXR1cm4gbXMoJzEwbScpO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4RHVyYXRpb25NcyA+PSBtcygnMTBtJykpIHtcbiAgICAgICAgcmV0dXJuIG1zKCc1bScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtcygnMm0nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIHJvdXRlIHdoaWNoIGhhbmRsZXMgd29ya2Zsb3cgZXhlY3V0aW9uIHJlcXVlc3RzLFxuICogZXhlY3V0aW5nIHN0ZXBzIGlubGluZSB3aGVuIHBvc3NpYmxlIHRvIHJlZHVjZSBmdW5jdGlvbiBpbnZvY2F0aW9uc1xuICogYW5kIHF1ZXVlIG92ZXJoZWFkLlxuICpcbiAqIFRoZSBoYW5kbGVyIGxvb3BzOiByZXBsYXkgd29ya2Zsb3cg4oaSIGV4ZWN1dGUgc3RlcCBpbmxpbmUg4oaSIHJlcGxheSDihpIgLi4uXG4gKiB1bnRpbCB0aGUgd29ya2Zsb3cgY29tcGxldGVzLCB0aW1lcyBvdXQsIG9yIGVuY291bnRlcnMgbm9uLXN0ZXAgc3VzcGVuc2lvbnMuXG4gKlxuICogQHBhcmFtIHdvcmtmbG93Q29kZSAtIFRoZSB3b3JrZmxvdyBidW5kbGUgY29kZSBjb250YWluaW5nIGFsbCB3b3JrZmxvdyBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBhIFZlcmNlbCBBUEkgcm91dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93RW50cnlwb2ludChcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIHJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdD86IG51bWJlcjtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgfVxuKTogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4ge1xuICBzZXRXb3JrZmxvd0Jhc2VQYXRoKG9wdGlvbnM/LmJhc2VQYXRoKTtcblxuICBjb25zdCBuYW1lc3BhY2UgPSByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKTtcbiAgY29uc3Qgd29ya2Zsb3dQcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KCd3b3JrZmxvdycsIG5hbWVzcGFjZSk7XG5cbiAgY29uc3QgaGFuZGxlciA9ICh3b3JsZEhhbmRsZXJzOiBXb3JsZEhhbmRsZXJzKSA9PlxuICAgIHdvcmxkSGFuZGxlcnMuY3JlYXRlUXVldWVIYW5kbGVyKFxuICAgICAgd29ya2Zsb3dQcmVmaXgsXG4gICAgICBhc3luYyAobWVzc2FnZV8sIG1ldGFkYXRhKSA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZVxuICAgICAgICAvLyBOT1RFOiBIZWFsdGggY2hlY2sgbWVzc2FnZXMgYXJlIGludGVudGlvbmFsbHkgdW5hdXRoZW50aWNhdGVkIGZvciBtb25pdG9yaW5nIHB1cnBvc2VzLlxuICAgICAgICAvLyBUaGV5IG9ubHkgd3JpdGUgYSBzaW1wbGUgc3RhdHVzIHJlc3BvbnNlIHRvIGEgc3RyZWFtIGFuZCBkbyBub3QgZXhwb3NlIHNlbnNpdGl2ZSBkYXRhLlxuICAgICAgICAvLyBUaGUgc3RyZWFtIG5hbWUgaW5jbHVkZXMgYSB1bmlxdWUgY29ycmVsYXRpb25JZCB0aGF0IG11c3QgYmUga25vd24gYnkgdGhlIGNhbGxlci5cbiAgICAgICAgY29uc3QgaGVhbHRoQ2hlY2sgPSBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZChtZXNzYWdlXyk7XG4gICAgICAgIGlmIChoZWFsdGhDaGVjaykge1xuICAgICAgICAgIGF3YWl0IGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgICAgICAgICAgIGhlYWx0aENoZWNrLFxuICAgICAgICAgICAgd29ybGRIYW5kbGVycy5zcGVjVmVyc2lvblxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogaW5jb21pbmdUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgcmVxdWVzdGVkQXQsXG4gICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlLFxuICAgICAgICAgIHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnMsXG4gICAgICAgICAgZGVwbG95bWVudE1pc21hdGNoUmV0cnlDb3VudCxcbiAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICBob29rSW5wdXQsXG4gICAgICAgIH0gPSBXb3JrZmxvd0ludm9rZVBheWxvYWRTY2hlbWEucGFyc2UobWVzc2FnZV8pO1xuICAgICAgICAvLyBgc3RhcnQoKWAgYWx3YXlzIGF0dGFjaGVzIGEgdHJhY2UgY2FycmllciwgYnV0XG4gICAgICAgIC8vIHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpIHJldHVybnMgYHt9YCB3aGVuIG5vIE9URUwgU0RLIGlzIHJlZ2lzdGVyZWRcbiAgICAgICAgLy8gb3Igbm8gc3BhbiBpcyBhY3RpdmUg4oCUIHRyZWF0IGFuIGVtcHR5IGNhcnJpZXIgdGhlIHNhbWUgYXMgYW5cbiAgICAgICAgLy8gYWJzZW50IG9uZSBzbyBsaW5rZWQgbW9kZSBmYWxscyBiYWNrIHRvIGEgZnJlc2ggb3JpZ2luIGluc3RlYWQgb2ZcbiAgICAgICAgLy8gZm9yd2FyZGluZyBhIHVzZWxlc3MgYHt9YCBmb3JldmVyLlxuICAgICAgICBjb25zdCB0cmFjZUNvbnRleHQgPSBpc1VzYWJsZVRyYWNlQ2FycmllcihpbmNvbWluZ1RyYWNlQ2FycmllcilcbiAgICAgICAgICA/IGluY29taW5nVHJhY2VDYXJyaWVyXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSBtZXRhZGF0YTtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gbWV0YWRhdGEucXVldWVOYW1lLnNsaWNlKHdvcmtmbG93UHJlZml4Lmxlbmd0aCk7XG5cbiAgICAgICAgLy8gLS0tIE1heCBkZWxpdmVyeSBjaGVjayAtLS1cbiAgICAgICAgLy8gRW5mb3JjZSBtYXggZGVsaXZlcnkgbGltaXQgYmVmb3JlIGFueSBpbmZyYXN0cnVjdHVyZSBjYWxscy5cbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBydW5hd2F5IHdvcmtmbG93cyBmcm9tIGNvbnN1bWluZyBpbmZpbml0ZSBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgICAvLyBTY29wZWQgbG9nZ2VyIGZvciB0aGlzIHJ1biDigJQgYXR0YWNoZXMgcnVuSWQvd29ya2Zsb3dOYW1lIHRvIGV2ZXJ5XG4gICAgICAgIC8vIGxvZyBsaW5lIGFuZCBjaGlsZCBsb2dnZXJzIGJlbG93LCBzbyBjYWxsZXJzIGRvbid0IHJlcGVhdCBpdC5cbiAgICAgICAgY29uc3QgcnVuTG9nZ2VyID0gcnVudGltZUxvZ2dlci5mb3JSdW4ocnVuSWQsIHdvcmtmbG93TmFtZSk7XG5cbiAgICAgICAgY29uc3QgbWF4UXVldWVEZWxpdmVyaWVzID0gZ2V0TWF4UXVldWVEZWxpdmVyaWVzKCk7XG4gICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gbWF4UXVldWVEZWxpdmVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFdvcmtmbG93IGhhbmRsZXIgZXhjZWVkZWQgbWF4IGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgIGVycm9yQ29kZTogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmVycm9yQ29kZSxcbiAgICAgICAgICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmF0dHJpYnV0aW9uLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuSWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBleGNlZWRlZCBtYXhpbXVtIHF1ZXVlIGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERUQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgLy8gUnVuIGFscmVhZHkgZmluaXNoZWQsIGNvbnN1bWUgdGhlIG1lc3NhZ2Ugc2lsZW50bHlcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIG1hcmsgcnVuIGFzIGZhaWxlZCBhZnRlciAke21ldGFkYXRhLmF0dGVtcHR9IGRlbGl2ZXJ5IGF0dGVtcHRzLiBgICtcbiAgICAgICAgICAgICAgICBgQSBwZXJzaXN0ZW50IGVycm9yIGlzIHByZXZlbnRpbmcgdGhlIHJ1biBmcm9tIGJlaW5nIHRlcm1pbmF0ZWQuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGlsIG1hbnVhbGx5IHJlc29sdmVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gYSBwZXJzaXN0ZW50IG91dGFnZSBvZiB0aGUgd29ya2Zsb3cgYmFja2VuZCBgICtcbiAgICAgICAgICAgICAgICBgb3IgYSBidWcgaW4gdGhlIHdvcmtmbG93IHJ1bnRpbWUgYW5kIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgV29ya2Zsb3cgdGVhbS5gLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm5hbWUgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS0tIFRyYWNlIGNvcnJlbGF0aW9uIG1vZGUgLS0tXG4gICAgICAgIC8vICdsaW5rZWQnIChkZWZhdWx0KTogdGhlIHdvcmtmbG93LmV4ZWN1dGUgc3BhbiBiZWxvdyBzdGF5cyBhIENISUxEXG4gICAgICAgIC8vIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSAoZmxvdy1yb3V0ZSkgY29udGV4dCwgc28gb25lIGludm9jYXRpb24g4oCUXG4gICAgICAgIC8vIHJvdXRlIGhhbmRsZXIsIHdvcmtmbG93IHJlcGxheSwgaW5saW5lIHN0ZXBzLCBldmVudCB3cml0ZXMg4oCUIGlzIGFcbiAgICAgICAgLy8gc2luZ2xlIGJvdW5kZWQgdHJhY2UuIFRoZSBydW4tb3JpZ2luIGNvbnRleHQgdHJhdmVscyBhcyBhIHNwYW5cbiAgICAgICAgLy8gTElOSyAobm90IGEgcGFyZW50KSwgYW5kIHJlLWVucXVldWVzIGZvcndhcmQgdGhlIG9yaWdpbmFsIGNhcnJpZXJcbiAgICAgICAgLy8gdW5jaGFuZ2VkLCBzbyBhIChwb3RlbnRpYWxseSBob3Vycy1sb25nKSBydW4gaXMgbmV2ZXIgc3RpdGNoZWRcbiAgICAgICAgLy8gaW50byBvbmUgZ2lhbnQgdHJhY2UgYWNyb3NzIGludm9jYXRpb25zLlxuICAgICAgICAvLyAnY29udGludW91cyc6IGxlZ2FjeSBiZWhhdmlvciDigJQgdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dFxuICAgICAgICAvLyBiZWNvbWVzIHRoZSBwYXJlbnQgb2YgdGhpcyBpbnZvY2F0aW9uJ3Mgc3BhbnMuXG4gICAgICAgIGNvbnN0IHRyYWNlTW9kZSA9IGdldFdvcmtmbG93VHJhY2VNb2RlKCk7XG5cbiAgICAgICAgLy8gVHJhY2UgY2FycmllciB0byBhdHRhY2ggdG8gbWVzc2FnZXMgdGhpcyBpbnZvY2F0aW9uIGVucXVldWVzIOKAlFxuICAgICAgICAvLyBzZWUgZ2V0TmV4dFRyYWNlQ2FycmllciBmb3IgdGhlIGxpbmtlZC9jb250aW51b3VzIHNlbWFudGljcy5cbiAgICAgICAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9ICgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+XG4gICAgICAgICAgZ2V0TmV4dFRyYWNlQ2Fycmllcih0cmFjZU1vZGUsIHRyYWNlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gU3BhbiBsaW5rcyB0byB0aGUgaW5jb21pbmcgZGVsaXZlcnkgY29udGV4dCBhbmQgKGluIGxpbmtlZCBtb2RlKVxuICAgICAgICAvLyB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHRyYWNlIGNhcnJpZXIuXG4gICAgICAgIGNvbnN0IHNwYW5MaW5rcyA9IGF3YWl0IGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyhcbiAgICAgICAgICB0cmFjZU1vZGUsXG4gICAgICAgICAgdHJhY2VDb250ZXh0XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVGhlIHJlcGxheSBidWRnZXQgY292ZXJzIG9yY2hlc3RyYXRpb24gd29yayBiZXR3ZWVuIHN0ZXBzLCBub3QgaW5saW5lXG4gICAgICAgIC8vIHN0ZXAgYm9kaWVzLiBJdCBpcyBjaGVja2VkIGJldHdlZW4gbG9vcCBpdGVyYXRpb25zOyBzdGVwIGJvZGllcyB1c2VcbiAgICAgICAgLy8gdGhlIHBsYXRmb3JtIHRpbWVvdXQgYW5kIE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVMgZ3VhcmQgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcmVwbGF5QnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuXG4gICAgICAgIC8vIEluIGxpbmtlZCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgTk9UIHJlc3RvcmVkIGFzIHRoZVxuICAgICAgICAvLyBhY3RpdmUgKHBhcmVudCkgY29udGV4dCDigJQgcGFzc2luZyBgdW5kZWZpbmVkYCBtYWtlc1xuICAgICAgICAvLyB3aXRoVHJhY2VDb250ZXh0IGEgcGFzc3Rocm91Z2gsIHNvIHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3dcbiAgICAgICAgLy8gc3RheXMgYSBjaGlsZCBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQgYW5kIHRoZVxuICAgICAgICAvLyBydW4tb3JpZ2luIHRyYXZlbHMgYXMgYSBzcGFuIGxpbmsgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgICB0cmFjZU1vZGUgPT09ICdjb250aW51b3VzJyA/IHRyYWNlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUXVldWUtZGVsaXZlcmVkIGludm9jYXRpb246IENPTlNVTUVSIGtpbmQsIG1hdGNoaW5nIHRoZVxuICAgICAgICAvLyBxdWV1ZS1kZWxpdmVyZWQgc3RlcC5leGVjdXRlIHNwYW4uXG4gICAgICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoVHJhY2VDb250ZXh0KHBhcmVudFRyYWNlQ2FycmllciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoV29ya2Zsb3dCYWdnYWdlKFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgd29ya2Zsb3dOYW1lIH0sXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LnJvdXRlLmdldF93b3JsZCcsIGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgZ2V0V29ybGQoKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBCb3RoIGNoZWNrcyBiZWxvdyBsb29rIGF0IGBydW5JbnB1dGAsIHNvIGJvdGggYXJlIG5vLW9wcyBvbiBhXG4gICAgICAgICAgICAgIC8vIHJlLWVucXVldWVkIG1lc3NhZ2UgKHdoaWNoIGNhcnJpZXMgbm9uZSkg4oCUIHRoZXkgb25seSBldmVyIHJ1biBvblxuICAgICAgICAgICAgICAvLyBhIGZpcnN0IGRlbGl2ZXJ5LCB0aGUgb25lIHRoYXQgY291bGQgY3JlYXRlIHRoZSBydW4uXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFJldHVybmluZyBhY2tzIHRoZSBtZXNzYWdlLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBtaXNtYXRjaCBpc1xuICAgICAgICAgICAgICAvLyBiYWtlZCBpbnRvIHRoaXMgbWVzc2FnZSwgc28gZXZlcnkgcmVkZWxpdmVyeSB3b3VsZCByZWFjaCB0aGVcbiAgICAgICAgICAgICAgLy8gc2FtZSB2ZXJkaWN0LCBhbmQgdGhyb3dpbmcgd291bGQganVzdCBob3QtbG9vcCB0aGUgaGFuZGxlciB1bnRpbFxuICAgICAgICAgICAgICAvLyBNQVhfUVVFVUVfREVMSVZFUklFUyB3aXRoIHRoZSBzYW1lIGVycm9yIGVhY2ggdGltZS4gSXQgbWF0Y2hlc1xuICAgICAgICAgICAgICAvLyBob3cgdGhlIHJ1bl9zdGFydGVkIHBhdGggYWxyZWFkeSBkaXNjYXJkcyBkZWxpdmVyaWVzIHdob3NlXG4gICAgICAgICAgICAgIC8vIHZlcmRpY3QgY2Fubm90IGNoYW5nZSAoRW50aXR5Q29uZmxpY3RFcnJvciwgUnVuRXhwaXJlZEVycm9yKS5cbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHJlZnVzZUNyb3NzRW52aXJvbm1lbnREZWxpdmVyeSh7XG4gICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgIHJ1bklucHV0LFxuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBydW5Mb2dnZXIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIERpYWdub3N0aWMgb25seSDigJQgc2VlIHRoZSBoZWxwZXIgZm9yIHdoeSB0aGlzIHdhcm5zIGluc3RlYWQgb2ZcbiAgICAgICAgICAgICAgLy8gcmVmdXNpbmcgdGhlIGludm9jYXRpb24uXG4gICAgICAgICAgICAgIGF3YWl0IHdhcm5PbkRlcGxveW1lbnRQaW5uaW5nTWlzbWF0Y2goe1xuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIHJ1bklucHV0LFxuICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgIHJ1bkxvZ2dlcixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB0cmFjZShcbiAgICAgICAgICAgICAgICBgd29ya2Zsb3cuZXhlY3V0ZSAke3dvcmtmbG93RGlzcGxheU5hbWUod29ya2Zsb3dOYW1lKX1gLFxuICAgICAgICAgICAgICAgIHsga2luZDogc3BhbktpbmQsIGxpbmtzOiBzcGFuTGlua3MgfSxcbiAgICAgICAgICAgICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdleGVjdXRlX3YyJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdTeXN0ZW0oJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nRGVzdGluYXRpb25OYW1lKG1ldGFkYXRhLnF1ZXVlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdNZXNzYWdlSWQobWV0YWRhdGEubWVzc2FnZUlkKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ09wZXJhdGlvblR5cGUoJ3Byb2Nlc3MnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uZ2V0UXVldWVPdmVyaGVhZCh7IHJlcXVlc3RlZEF0IH0pLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1RyYWNlUHJvcGFnYXRlZCghIXRyYWNlQ29udGV4dCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1RyYWNlTW9kZSh0cmFjZU1vZGUpLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGludm9jYXRpb25TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgbm9JbmxpbmVSZXBsYXlBZnRlck1zID0gYXdhaXQgZ2V0TWF4SW5saW5lRHVyYXRpb25NcyhcbiAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBsZXQgbG9vcEl0ZXJhdGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlSZWNvdmVyeVJlcG9ydGVyID0gcmVwbGF5RGl2ZXJnZW5jZVxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyKHJlcGxheURpdmVyZ2VuY2UuY291bnQpXG4gICAgICAgICAgICAgICAgICAgIDogUmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5pbmVydCgpO1xuICAgICAgICAgICAgICAgICAgLy8gRXZlcnkgd3JpdGUgdGhpcyBsb29wIG1ha2VzIGNhcnJpZXMgdGhlIGN1cnNvciBvZiB0aGUgbG9nXG4gICAgICAgICAgICAgICAgICAvLyBpdCB3YXMgY29tcHV0ZWQgYWdhaW5zdCwgYW5kIGZvbGRzIGEgY29tcGxldGUgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgIC8vIGRlbHRhIGludG8gdGhhdCBsb2cuXG4gICAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVFdmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgQ3JlYXRlRXZlbnRSZXF1ZXN0PihcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogVCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zPzogQ3JlYXRlRXZlbnRQYXJhbXNcbiAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaW5jZUN1cnNvciA9IGRlbHRhUmVxdWVzdEN1cnNvcihkYXRhLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLndpdGhFdmVudENyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICBzaW5jZUN1cnNvciA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHBhcmFtc1xuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IC4uLnBhcmFtcywgc2luY2VDdXJzb3IgfSxcbiAgICAgICAgICAgICAgICAgICAgICAocCkgPT4gd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwgZGF0YSwgcClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbmNlQ3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhYnNvcmJDcmVhdGVEZWx0YShzaW5jZUN1cnNvciwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgY3Vyc29yIHRvIGFzayBmb3IgYW4gaW5saW5lIGRlbHRhIGFnYWluc3QsIG9yXG4gICAgICAgICAgICAgICAgICAgKiB1bmRlZmluZWQgdG8gbm90IGFzay5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUdXJibyBpcyBleGNsdWRlZCBvbiBwdXJwb3NlOiBpdCBleGlzdHMgdG8gbWFrZSB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAqIGludm9jYXRpb24ncyB3cml0ZXMgYXMgY2hlYXAgYXMgcG9zc2libGUsIGFuZCBpdCBoYXMgbm9cbiAgICAgICAgICAgICAgICAgICAqIGxvYWRlZCBsb2cgdG8gZXh0ZW5kLiBSdW4tdGVybWluYWwgd3JpdGVzIGFyZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgICAgICogYmVjYXVzZSBub3RoaW5nIHJlYWRzIHRoZSBsb2cgYWZ0ZXJ3YXJkcywgc28gdGhlIGRlbHRhXG4gICAgICAgICAgICAgICAgICAgKiB3b3VsZCBiZSB3b3JrIHRoZSBXb3JsZCBkb2VzIGZvciBubyBvbmUuIEEgY2FsbGVyIHRoYXRcbiAgICAgICAgICAgICAgICAgICAqIHNldCBpdHMgb3duIGBzaW5jZUN1cnNvcmAgKG9yIGFza2VkIGZvciB0aGUgYHJ1bl9zdGFydGVkYFxuICAgICAgICAgICAgICAgICAgICogLyBgaG9va19yZWNlaXZlZGAgcHJlbG9hZCwgd2hpY2ggb3ducyB0aGUgc2FtZSByZXNwb25zZVxuICAgICAgICAgICAgICAgICAgICogZmllbGRzKSBrZWVwcyB3aGF0IGl0IGFza2VkIGZvci5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGFSZXF1ZXN0Q3Vyc29yID0gKFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBDcmVhdGVFdmVudFJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogQ3JlYXRlRXZlbnRQYXJhbXMgfCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICB0dXJibyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgIT09ICdyZWFkeScgfHxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM/LnNpbmNlQ3Vyc29yICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM/LnByZWxvYWRFdmVudHMgPT09IHRydWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBpc1Rlcm1pbmFsUnVuRXZlbnRUeXBlKGRhdGEuZXZlbnRUeXBlKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudExvZy5jdXJzb3IgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBGb2xkIGFuIGlubGluZSBkZWx0YSByZXR1cm5lZCBieSBgZXZlbnRzLmNyZWF0ZWAgaW50byB0aGVcbiAgICAgICAgICAgICAgICAgICAqIGluLW1lbW9yeSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGRlbHRhIGlzIHdoYXQgYGV2ZW50cy5saXN0KHsgY3Vyc29yOiBzZW50Q3Vyc29yIH0pYFxuICAgICAgICAgICAgICAgICAgICogd291bGQgaGF2ZSByZXR1cm5lZCByaWdodCBhZnRlciB0aGUgd3JpdGUsIHNvIGl0IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAqIGJhY2sgYm90aCBvdXIgb3duIGV2ZW50IGFuZCBhbnl0aGluZyBhbm90aGVyIHdyaXRlclxuICAgICAgICAgICAgICAgICAgICogYXBwZW5kZWQgaW4gYmFuZC4gQWJzb3JiaW5nIGl0IGhlcmUgbWVhbnMgdGhlIG5leHQgcmVhZGVyXG4gICAgICAgICAgICAgICAgICAgKiBhbHJlYWR5IGhhcyB0aGUgbG9nIGFuZCB0aGUgbG9vcCdzIGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgKiBgZXZlbnRzLmxpc3RgIGZpbmRzIG5vdGhpbmcgbGVmdCB0byBmZXRjaC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBEZWNsaW5pbmcgaXMgYWx3YXlzIHNhZmUg4oCUIGFuIHVuYWJzb3JiZWQgZGVsdGEgaXMgYSBkZWx0YVxuICAgICAgICAgICAgICAgICAgICogdGhlIG5leHQgYGV2ZW50cy5saXN0YCByZXR1cm5zIOKAlCBzbyB0aGUgZ3VhcmRzIGFyZSBmcmVlIHRvXG4gICAgICAgICAgICAgICAgICAgKiBiZSBzdHJpY3Q6XG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogLSBgaGFzTW9yZWAgbWVhbnMgdGhlIFdvcmxkIHRydW5jYXRlZCB0aGUgcGFnZS4gVGFraW5nIGl0XG4gICAgICAgICAgICAgICAgICAgKiAgIHdoaWxlIGFkdmFuY2luZyB0aGUgY3Vyc29yIHRvIHRoZSBwYWdlIGVuZCB3b3VsZCBiZVxuICAgICAgICAgICAgICAgICAgICogICBmaW5lLCBidXQgdGFraW5nIGl0IGFuZCBOT1QgYWR2YW5jaW5nIHdvdWxkIGR1cGxpY2F0ZSxcbiAgICAgICAgICAgICAgICAgICAqICAgYW5kIHRoZSB0cnVuY2F0ZWQgY2FzZSBpcyByYXJlIGVub3VnaCBub3QgdG8gc3BlY2lhbC1jYXNlLlxuICAgICAgICAgICAgICAgICAgICogLSBUaGUgY3Vyc29yIG11c3QgYmUgZXhhY3RseSB3aGVyZSBpdCB3YXMgd2hlbiB0aGUgcmVxdWVzdFxuICAgICAgICAgICAgICAgICAgICogICB3ZW50IG91dC4gQ29uY3VycmVudCB3cml0ZXMgZWFjaCBkaWZmIGFnYWluc3QgdGhlIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICogICB0aGV5IHNhdywgYW5kIGBhcHBlbmRVbmlxdWVFdmVudHNgIGRlbGliZXJhdGVseSBkb2VzIG5vdFxuICAgICAgICAgICAgICAgICAgICogICByZS1zb3J0LCBzbyBhYnNvcmJpbmcgYSBzZWNvbmQgZGVsdGEgY29tcHV0ZWQgZnJvbSBhblxuICAgICAgICAgICAgICAgICAgICogICBvbGRlciBjdXJzb3IgY291bGQgYXBwZW5kIGV2ZW50cyBiZWhpbmQgb25lcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgKiAgIHRha2VuLiBGaXJzdCByZXNwb25zZSBiYWNrIHdpbnM7IHRoZSByZXN0IGFyZSBkcm9wcGVkLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCBhYnNvcmJDcmVhdGVEZWx0YSA9IChcbiAgICAgICAgICAgICAgICAgICAgc2VudEN1cnNvcjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IEV2ZW50UmVzdWx0XG4gICAgICAgICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgIT09ICdyZWFkeScgfHxcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5jdXJzb3IgIT09IHNlbnRDdXJzb3IgfHxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzTW9yZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coZXZlbnRMb2csIHtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IHJlc3VsdC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiByZXN1bHQuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIGByZWFkeWAgY2FuIHJlcGxheSBvbmNlIHdpdGhvdXQgYSByZWFkLiBUaGUgb3RoZXIgc3RhdGVzXG4gICAgICAgICAgICAgICAgICAvLyBkZXNjcmliZSB0aGUgbmV4dCBsb2FkIGV4YWN0bHkuXG4gICAgICAgICAgICAgICAgICBsZXQgZXZlbnRMb2c6IFJlcGxheUV2ZW50TG9nID0geyB0eXBlOiAnbG9hZEFsbCcgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gU2hhcmVkIHN0YXRlOiBzZXQgYnkgZWl0aGVyIHRoZSBiYWNrZ3JvdW5kIHN0ZXAgcGF0aFxuICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHJ1bl9zdGFydGVkIHNldHVwIGJlbG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIFNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgZnJvbSB0aGUgcnVuX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlLiBVbmRlZmluZWQg4oeSIG5vIGVuZm9yY2VtZW50IChvbGRlciBzZXJ2ZXJzLCB0dXJibykuXG4gICAgICAgICAgICAgICAgICBsZXQgbWF4RXZlbnRzTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1N0YXJ0ZWRBdCA9IC0xO1xuXG4gICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeSAoVFRGUykgc3RhdGUg4oCUIHNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cy5cbiAgICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhpcyBpbnZvY2F0aW9uJ3MgRklSU1QgZXZlbnQgc25hcHNob3QgY29udGFpbmVkXG4gICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGJleW9uZCBydW5fY3JlYXRlZC9ydW5fc3RhcnRlZDogYW55dGhpbmcgZWxzZSB3YXNcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXR0ZW4gYnkgYW4gZWFybGllciBpbnZvY2F0aW9uLCB3aG9zZSBjb250cmlidXRpb24gdG9cbiAgICAgICAgICAgICAgICAgIC8vIHRpbWUtdG8tZmlyc3Qtc3RlcCAoaW5jbHVkaW5nIHRoZSBxdWV1ZSBob3AgYmFjayBoZXJlKVxuICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGJlIG1lYXN1cmVkIHdhbGwtY2xvY2ssIHNvIFRURlMgaXMgbm90IHJlcG9ydGVkLlxuICAgICAgICAgICAgICAgICAgLy8gU2V0IG9uY2UsIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24ncyBsb2FkZWQgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgICBsZXQgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIEVwb2NoIG1zIHRoZSBgcnVuX3N0YXJ0ZWRgIHJlc3BvbnNlIHdhcyByZWNlaXZlZC9wYXJzZWRcbiAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBTREsg4oCUIGFuY2hvcnMgUlNGUyAocnVuX3N0YXJ0ZWQg4oaSIGZpcnN0IHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgUE9TVCkuIFNldCBvbmNlLCBpbiB0aGUgcnVuX3N0YXJ0ZWQgc2V0dXAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAvLyBVbmRlciB0dXJibywgcnVuX3N0YXJ0ZWQgaXMgYmFja2dyb3VuZGVkIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAvLyBhd2FpdGVkLCBzbyB0aGlzIGlzIHN0YW1wZWQgYXQgdGhlIHBvaW50IHRoZSBydW4gaXNcbiAgICAgICAgICAgICAgICAgIC8vIHN5bnRoZXNpemVkIGxvY2FsbHkgaW5zdGVhZCBvZiB0aGUgcmVhbCByZXNwb25zZSDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAvLyBTdGVwTGF0ZW5jeVRyYWNraW5nLnJzZnNBbmNob3JNcy5cbiAgICAgICAgICAgICAgICAgIGxldCBydW5TdGFydGVkUmVjZWl2ZWRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAvLyBXYWxsLWNsb2NrIG1zIHNwZW50IGNvbW1pdHRpbmcgaG9va19jcmVhdGVkIGV2ZW50cyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBzdGVwIHJhbiwgYWNjdW11bGF0ZWQgYWNyb3NzIHN1c3BlbnNpb24gcGFzc2VzXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgc3VidHJhY3RlZCBmcm9tIFRURlMuIEFjY3VtdWxhdG9ycyBoZXJlIHN1cnZpdmUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGluLXByb2Nlc3MgcmVwbGF5IHJlc3RhcnQgKGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uLCBvclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGF0dHJpYnV0ZS1ldmVudCByZXN0YXJ0IGJlbG93KSwgc28gYSByZXN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gb3Zlci1jb3VudHMgYnkgdGhlIGFiYW5kb25lZCBwYXNzJ3MgaG9vayB0aW1lIOKAlFxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgc2xpZ2h0IG92ZXItY291bnQgZWl0aGVyIHJlc3RhcnQgaGFzIGFsd2F5cyBoYWQuXG4gICAgICAgICAgICAgICAgICBsZXQgcHJlU3RlcEJsb2NraW5nTXMgPSAwO1xuICAgICAgICAgICAgICAgICAgLy8gU25hcHNob3Qgb2YgdGhlIGFjY3VtdWxhdG9yIGFzIG9mIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHdyb3RlIHRoZSBydW4ncyBmaXJzdCBhdHRyX3NldCAod2hvc2UgaG9vayBwaGFzZSByYW5cbiAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBpdHMgYXR0ciB3cml0ZXMpLiBXaGVuIGEgcHJlLXN0ZXAgc2V0QXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgLy8gZW5kcyB0aGUgVFRGUyBtZWFzdXJlbWVudCBhdCB0aGUgYXR0ciB3cml0ZSwgb25seSBob29rXG4gICAgICAgICAgICAgICAgICAvLyB0aW1lIGZyb20gQkVGT1JFIHRoYXQgcG9pbnQgbWF5IGJlIHN1YnRyYWN0ZWQg4oCUIGxhdGVyXG4gICAgICAgICAgICAgICAgICAvLyBob29rIHdyaXRlcyBmYWxsIG91dHNpZGUgdGhlIG1lYXN1cmVkIHdpbmRvdy5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmYXN0LXBhdGhzIHRoZSB2ZXJ5IGZpcnN0IGRlbGl2ZXJ5IG9mIHRoZSB2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyBmaXJzdCBpbnZvY2F0aW9uLCB3aGVyZSBpdCBpcyBwcm92YWJseSBzYWZlIHRvOiBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgLCBza2lwIHRoZSBpbml0aWFsIGV2ZW50LWxvZyBsb2FkIChub3RoaW5nIGhhc1xuICAgICAgICAgICAgICAgICAgLy8gYmVlbiB3cml0dGVuIHlldCksIGFuZCBmb3JjZSBvcHRpbWlzdGljIGlubGluZSBzdGFydCAobm9cbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgcGVlciBoYW5kbGVyIGV4aXN0cyB0byByYWNlIHRoZSBjcmVhdGUtY2xhaW0pLlxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bklucHV0YCBpcyBvbmx5IHByZXNlbnQgb24gdGhlIHN0YXJ0KCktZW5xdWV1ZWQgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBgYXR0ZW1wdCA9PT0gMWAgKDEtYmFzZWQpIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeTsgYGluY29taW5nU3RlcElkYCB3b3VsZCBtYXJrIGEgYmFja2dyb3VuZC1zdGVwXG4gICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGFuZCBgcmVwbGF5RGl2ZXJnZW5jZWAgYSByZWNvdmVyeSByZXBsYXkg4oCUIGJvdGhcbiAgICAgICAgICAgICAgICAgIC8vIGluZWxpZ2libGUuIFRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgdGhhdCBtYWtlcyBmb3JjZWRcbiAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXN0aWMgc3RhcnQgc2FmZSBlbmRzIG9uY2UgYSBob29rIG9yIHdhaXQgaXMgY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgLy8gKHRoZXkgaW50cm9kdWNlIHJlc3VtZSBpbnZvY2F0aW9ucyksIHNvIHR1cmJvIGV4aXRzIGF0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHBvaW50IChzZWUgYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YCkuIFdvcmtmbG93IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGludHJvZHVjZSBubyBzdWNoIGludm9jYXRpb24gc291cmNlIOKAlCB0aGV5IHJlc29sdmVcbiAgICAgICAgICAgICAgICAgIC8vIHZpYSBhbiBpbi1wcm9jZXNzIHJlcGxheSBhbmQgZG9uJ3QgZW5kIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgLy8gTk9URTogYG1ldGFkYXRhLmF0dGVtcHQgPT09IDFgIGlzIGFsc28gbG9hZC1iZWFyaW5nIGZvclxuICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgb3duZXJzaGlwOiBvd25lZC1yZWNvdmVyeSBzdGVwcyAoYSBzdGVwXG4gICAgICAgICAgICAgICAgICAvLyBzdGFtcGVkIGJ5IGEgUFJFVklPVVMgZGVsaXZlcnkgb2YgdGhpcyBtZXNzYWdlKSBjYW4gb25seVxuICAgICAgICAgICAgICAgICAgLy8gZXhpc3Qgb24gYXR0ZW1wdCDiiaUgMiwgc28gdHVyYm8gYW5kIG93bmVkIHJlY292ZXJ5IGFyZVxuICAgICAgICAgICAgICAgICAgLy8gbXV0dWFsbHkgZXhjbHVzaXZlLiBUaGUgdHVyYm8gYHJlaW52b2tlKClgIHBhdGhzIChob29rXG4gICAgICAgICAgICAgICAgICAvLyBjb25mbGljdCwgdGhyb3R0bGUgYmFja29mZikgYWNrIHRoaXMgbWVzc2FnZSBhbmQgY29udGludWVcbiAgICAgICAgICAgICAgICAgIC8vIHVuZGVyIGEgTkVXIG1lc3NhZ2UgaWQg4oCUIHNhZmUgb25seSBiZWNhdXNlIG5vXG4gICAgICAgICAgICAgICAgICAvLyBub24tdGVybWluYWwgc3RlcCBjYW4gYmUgaW5saW5lLW93bmVkIGJ5IHRoZSBhY2tlZCBpZFxuICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0dXJibyBpcyBvbi4gSWYgdHVyYm8gZXZlciBlbmdhZ2VzIG9uIHJlZGVsaXZlcmllcyxcbiAgICAgICAgICAgICAgICAgIC8vIHRob3NlIHBhdGhzIG11c3QgZmlyc3QgY2hlY2sgZm9yIG93bmVkIHBlbmRpbmcgc3RlcHMgYW5kXG4gICAgICAgICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gYHsgdGltZW91dFNlY29uZHMgfWAgcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHR1cmJvID1cbiAgICAgICAgICAgICAgICAgICAgaXNUdXJib0VuYWJsZWQoKSAmJlxuICAgICAgICAgICAgICAgICAgICBydW5JbnB1dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmF0dGVtcHQgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmdTdGVwSWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAhcmVwbGF5RGl2ZXJnZW5jZTtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoQXR0cmlidXRlLldvcmtmbG93VHVyYm8odHVyYm8pKTtcblxuICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBvbmx5OiByZXNvbHZlcyBvbmNlIHRoZSBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZCAob3IgcmVqZWN0cyBpZiBpdCBmYWlsZWQpLiBUaHJlYWRlZFxuICAgICAgICAgICAgICAgICAgLy8gaW50byBoYW5kbGVTdXNwZW5zaW9uIGFuZCBleGVjdXRlU3RlcCBzbyBubyBzdGVwL2hvb2svd2FpdFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgcmFjZXMgYWhlYWQgb2YgdGhlIHJ1bidzIGNyZWF0aW9uLiBVbmRlZmluZWQgb3V0c2lkZVxuICAgICAgICAgICAgICAgICAgLy8gdHVyYm8sIHdoZXJlIGBydW5fc3RhcnRlZGAgaXMgYXdhaXRlZCB1cCBmcm9udC5cbiAgICAgICAgICAgICAgICAgIGxldCBydW5SZWFkeUJhcnJpZXI6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgIC8vIE9yZGVyIGEgdGVybWluYWwgcnVuIHdyaXRlIChydW5fY29tcGxldGVkIC8gcnVuX2ZhaWxlZCkgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgaW4gdHVyYm8gbW9kZSDigJQgYSBuby1zdGVwXG4gICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdyBjYW4gb3RoZXJ3aXNlIHJlYWNoIHJ1bl9jb21wbGV0ZWQgYmVmb3JlIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4aXN0cy4gQmVzdC1lZmZvcnQ6IGEgYmFycmllciByZWplY3Rpb24gaXMgc3dhbGxvd2VkIGZvclxuICAgICAgICAgICAgICAgICAgLy8gb3JkZXJpbmcgb25seTsgaWYgcnVuX3N0YXJ0ZWQgdHJ1bHkgZmFpbGVkIHRoZSB0ZXJtaW5hbCB3cml0ZVxuICAgICAgICAgICAgICAgICAgLy8gc3VyZmFjZXMgdGhlIHJlYWwgZXJyb3IgKHJ1biBub3QgZm91bmQgLyBnb25lKSBhbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnMuIE5vLW9wIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICBjb25zdCBhd2FpdFJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnVuUmVhZHlCYXJyaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1blJlYWR5QmFycmllcjtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsOiBvcmRlcmluZyBiYXJyaWVyIG9ubHkg4oCUIHNlZSBhYm92ZS5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgb3JjaGVzdHJhdG9yLiBPdXRzaWRlIHR1cmJvIHRoaXMgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgLy8gYHsgdGltZW91dFNlY29uZHMgfWAsIHdoaWNoIG1ha2VzIHRoZSBxdWV1ZSByZXNjaGVkdWxlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gQ1VSUkVOVCBkZWxpdmVyeSdzIG1lc3NhZ2UuIEluIHR1cmJvIHRoYXQgaXMgYSB0cmFwOiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWVzc2FnZSBjYXJyaWVzIGBydW5JbnB1dGAsIGFuZCBvbiBhc3luYyBxdWV1ZXNcbiAgICAgICAgICAgICAgICAgIC8vIChlLmcuIGdyYXBoaWxlLXdvcmtlcikgYSByZXNjaGVkdWxlIGNvbWVzIGJhY2sgYXMgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgMSDigJQgc28gdHVyYm8gcmUtZW5nYWdlcywgc2tpcHMgdGhlIGV2ZW50LWxvZyBsb2FkXG4gICAgICAgICAgICAgICAgICAvLyBhZ2FpbiwgcmVwbGF5cyBhZ2FpbnN0IGFuIGVtcHR5IGxvZywgbmV2ZXIgb2JzZXJ2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBob29rIGV2ZW50IHRoaXMgaW52b2NhdGlvbiBqdXN0IHdyb3RlLCBhbmQgcmUtc3VzcGVuZHNcbiAgICAgICAgICAgICAgICAgIC8vIGZvcmV2ZXIgKHRoZSBydW4gd2VkZ2VzKS4gVW5kZXIgdHVyYm8gd2UgaW5zdGVhZCBlbnF1ZXVlIGFuXG4gICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBjb250aW51YXRpb24gdGhhdCBjYXJyaWVzIE5PIGBydW5JbnB1dGAsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmV4dCBkZWxpdmVyeSBpcyBhIG5vcm1hbCAobm9uLXR1cmJvKSBsb2FkLWFuZC1yZXBsYXkgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZXMgdGhlIGNvbW1pdHRlZCBldmVudHMgYW5kIG1ha2VzIHByb2dyZXNzOyB3ZSB0aGVuXG4gICAgICAgICAgICAgICAgICAvLyByZXR1cm4gYHVuZGVmaW5lZGAgc28gdGhlIHF1ZXVlIHRyZWF0cyB0aGlzIGRlbGl2ZXJ5IGFzIGRvbmVcbiAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGFsc28gcmVzY2hlZHVsaW5nIGl0LlxuICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLW93bmVyc2hpcCBpbnZhcmlhbnQgZ3VhcmQ6IGNvcnJlbGF0aW9uIElEcyBvZlxuICAgICAgICAgICAgICAgICAgLy8gc3RlcHMgd2hvc2UgYm9kaWVzIHRoaXMgaW52b2NhdGlvbiBpcyBleGVjdXRpbmcgdW5kZXIgYW5cbiAgICAgICAgICAgICAgICAgIC8vIG93bmVyc2hpcCBzdGFtcCAobGF6eSBpbmxpbmUgKyBvd25lZCByZWNvdmVyeSksIHdoaWxlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gYm9keSBpcyBpbiBmbGlnaHQuIENyYXNoIHJlY292ZXJ5IGRlcGVuZHMgb24gdGhlIG93bmluZ1xuICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBOT1QgYmVpbmcgYWNrZWQgd2hpbGUgc3VjaCBhIHN0ZXAgaXMgbm9uLXRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAvLyAoYWNrID0gaGFuZGxlciByZXR1cm4gb3IgcmVpbnZva2UsIHdoaWNoIGFja3MgKyBlbnF1ZXVlc1xuICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgYSBORVcgbWVzc2FnZSBpZCDigJQgdGhlIHJlZGVsaXZlcnkgb2YgdGhlIG9sZCBpZCBpc1xuICAgICAgICAgICAgICAgICAgLy8gd2hhdCByZS1leGVjdXRlcyBhbiBvcnBoYW5lZCBvd25lZCBzdGVwKS4gQWxsIGV4ZWN1dGVTdGVwXG4gICAgICAgICAgICAgICAgICAvLyBjYWxscyBhcmUgYXdhaXRlZCBiZWZvcmUgYW55IGFjayBwYXRoIHJ1bnMsIHNvIHRoaXMgc2V0XG4gICAgICAgICAgICAgICAgICAvLyBpcyBlbXB0eSBhdCBldmVyeSBhY2sgYnkgY29uc3RydWN0aW9uOyB0aGUgY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAvLyB0byBjYXRjaCBmdXR1cmUgcmVmYWN0b3JzIHRoYXQgYnJlYWsgdGhhdCBvcmRlcmluZy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluRmxpZ2h0T3duZWRTdGVwcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgYXNzZXJ0Tm9JbkZsaWdodE93bmVkU3RlcHMgPSAoXG4gICAgICAgICAgICAgICAgICAgIGFja1BhdGg6IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbkZsaWdodE93bmVkU3RlcHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFyaWFudCB2aW9sYXRpb246IGFja2luZyB0aGUgd29ya2Zsb3cgbWVzc2FnZSB3aGlsZSBvd25lZCBpbmxpbmUgc3RlcHMgYXJlIHN0aWxsIGV4ZWN1dGluZyDigJQgY3Jhc2ggcmVjb3ZlcnkgZm9yIHRoZXNlIHN0ZXBzIGlzIGJyb2tlbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY2tQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWRzOiBbLi4uaW5GbGlnaHRPd25lZFN0ZXBzXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBBIHBsYWluIG9yY2hlc3RyYXRvci1yZXBsYXkgbWVzc2FnZS4gT21pdHMgYHJ1bklucHV0YCAoaXRcbiAgICAgICAgICAgICAgICAgIC8vIHJlLWVuZ2FnZXMgdHVyYm8gb24gdGhlIG5leHQgZGVsaXZlcnkgYW5kIHdlZGdlcyB0aGUgcnVuIOKAlFxuICAgICAgICAgICAgICAgICAgLy8gc2VlIGByZWludm9rZWAgYmVsb3cpIGFuZCBgcmVwbGF5RGl2ZXJnZW5jZWAgL1xuICAgICAgICAgICAgICAgICAgLy8gYHNlcnZlckVycm9yUmV0cnlDb3VudGAgKHRoaXMgZGVsaXZlcnkgY2hhaW4ncyBidWRnZXRzKS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheU1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICBhc3luYyAoKTogUHJvbWlzZTxXb3JrZmxvd0ludm9rZVBheWxvYWQ+ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZWludm9rZSA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBFeHRyYSBmaWVsZHMgdG8gY2Fycnkgb24gdGhlIG5ldyBtZXNzYWdlLiBPbmx5IHJlYWNoZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAqIG5leHQgaW52b2NhdGlvbiBvbiB0aGUgdHVyYm8gcGF0aDogd2l0aG91dCB0dXJibyBub1xuICAgICAgICAgICAgICAgICAgICAgKiBtZXNzYWdlIGlzIGVucXVldWVkIGF0IGFsbCDigJQgdGhlIGhhbmRsZXIgcmV0dXJucyBhXG4gICAgICAgICAgICAgICAgICAgICAqIHZpc2liaWxpdHkgdGltZW91dCBhbmQgdGhlIHF1ZXVlIHJlZGVsaXZlcnMgdGhlIENVUlJFTlRcbiAgICAgICAgICAgICAgICAgICAgICogbWVzc2FnZSwgd2hvc2UgYm9keSAoYW5kIHRoZXJlZm9yZSBhbnkgY291bnRlciBvbiBpdClcbiAgICAgICAgICAgICAgICAgICAgICogY2Fubm90IGJlIGNoYW5nZWQuXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBleHRyYVBheWxvYWQ/OiBQYXJ0aWFsPFdvcmtmbG93SW52b2tlUGF5bG9hZD5cbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8eyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH0gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm9JbkZsaWdodE93bmVkU3RlcHMoJ3JlaW52b2tlJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdHVyYm8pIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBkZWxheVNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICB7IC4uLihhd2FpdCByZXBsYXlNZXNzYWdlKCkpLCAuLi5leHRyYVBheWxvYWQgfSxcbiAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMgPiAwID8geyBkZWxheVNlY29uZHMgfSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gUHJlY29uZGl0aW9uICg0MTIpIHJlY292ZXJ5OiBob3cgbWFueSB0aW1lcyB0aGlzIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgIC8vIGhhcyB0aHJvd24gYXdheSBpdHMgcmVwbGF5IGFuZCBzdGFydGVkIG92ZXIgaW4tcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVjb25kaXRpb25SZXN0YXJ0cyA9IDA7XG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIEV2ZW50IGlkcyB0aGUgZGlzY2FyZGVkIHJlcGxheSBoZWxkLCBrZXB0IHVudGlsIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgKiBsb2FkIHJlc29sdmVzIHNvIGEgcmVzdGFydCBjYW4gcmVwb3J0IHdoYXQgaXRzIHJlbG9hZFxuICAgICAgICAgICAgICAgICAgICogYWN0dWFsbHkgZm91bmQuIFdpdGhvdXQgdGhpcyBhIDQxMiBvbmx5IGV2ZXIgdGVsbHMgeW91IHRoYXRcbiAgICAgICAgICAgICAgICAgICAqIGEgcmVzdGFydCBoYXBwZW5lZCwgd2hpY2ggY29uZmxhdGVzIHR3byB2ZXJ5IGRpZmZlcmVudFxuICAgICAgICAgICAgICAgICAgICogc2l0dWF0aW9uczogYSBsb2cgdGhhdCBncmV3IChleHBlY3RlZCDigJQgdGhlIGZlbmNlIGRpZCBpdHNcbiAgICAgICAgICAgICAgICAgICAqIGpvYikgYW5kIGEgbG9nIHRoYXQgY2FtZSBiYWNrIGlkZW50aWNhbCwgd2hpY2ggbWVhbnMgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2VuZCBkaXNhZ3JlZSBhYm91dCB0aGUgY291bnQgZm9yIHRoZSBzYW1lIHNldCBvZlxuICAgICAgICAgICAgICAgICAgICogZXZlbnRzIGFuZCB0aGUgcmVzdGFydCB3aWxsIHJlLWRlcml2ZSB0aGUgc2FtZSBzbmFwc2hvdCBhbmRcbiAgICAgICAgICAgICAgICAgICAqIGJlIHJlamVjdGVkIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBsZXQgcHJlY29uZGl0aW9uUmVzdGFydEJhc2VsaW5lOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkczogU2V0PHN0cmluZz47XG4gICAgICAgICAgICAgICAgICAgIHJlc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2lubGluZS1kZWx0YScgfCAnZnVsbC1yZWxvYWQnO1xuICAgICAgICAgICAgICAgICAgfSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBSZXBvcnQgd2hhdCBhIHN0YWxlLXNuYXBzaG90IHJlc3RhcnQncyByZWxvYWQgZm91bmQsIG9uY2VcbiAgICAgICAgICAgICAgICAgICAqIHRoZSBsb2cgdGhpcyByZXBsYXkgd2lsbCBhY3R1YWxseSBjb25zdW1lIGlzIGluIGhhbmQuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogYGdyZXdgIGlzIHRoZSBleHBlY3RlZCBjYXNlIGFuZCBnaXZlcyA0MTIgdm9sdW1lIGFcbiAgICAgICAgICAgICAgICAgICAqIGRlbm9taW5hdG9yLiBgdW5jaGFuZ2VkYCBtZWFucyB0aGUgcmVsb2FkIGRpc2FncmVlZCB3aXRoXG4gICAgICAgICAgICAgICAgICAgKiB0aGUgcmVqZWN0aW9uLCBzbyB0aGlzIHJlcGxheSByZS1kZXJpdmVzIHRoZSBzYW1lIHNuYXBzaG90XG4gICAgICAgICAgICAgICAgICAgKiBhbmQgaXMgcmVqZWN0ZWQgYWdhaW4gdW50aWwgdGhlIGJ1ZGdldCBpcyBzcGVudC4gYHNocmFua2BcbiAgICAgICAgICAgICAgICAgICAqIHNob3VsZCBiZSBpbXBvc3NpYmxlOiBldmVyeSBsb2FkIHBhdGggb25seSBhZGRzIHRvIGEgcnVuJ3NcbiAgICAgICAgICAgICAgICAgICAqIGxvZy5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwb3J0UHJlY29uZGl0aW9uUmVzdGFydFJlbG9hZCA9IChcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBFdmVudFtdXG4gICAgICAgICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZWxpbmUgPSBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYmFzZWxpbmUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydEJhc2VsaW5lID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxvYWRlZElkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLm1hcCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZGVkID0gY291bnRNaXNzaW5nSWRzKHJlbG9hZGVkSWRzLCBiYXNlbGluZS5pZHMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkcm9wcGVkID0gY291bnRNaXNzaW5nSWRzKGJhc2VsaW5lLmlkcywgcmVsb2FkZWRJZHMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRjb21lID1cbiAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkID4gMCA/ICdzaHJhbmsnIDogYWRkZWQgPiAwID8gJ2dyZXcnIDogJ3VuY2hhbmdlZCc7XG5cbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICdSZXN0YXJ0ZWQgcmVwbGF5IHJlbG9hZGVkIGl0cyBldmVudCBsb2cgYWZ0ZXIgYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0JlZm9yZTogYmFzZWxpbmUuaWRzLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNBZnRlcjogcmVsb2FkZWRJZHMuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzOiBiYXNlbGluZS5yZXN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBiYXNlbGluZS5yZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGJhc2VsaW5lLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogUmVjb3ZlciBmcm9tIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIGJ5IHJlc3RhcnRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgKiByZXBsYXkgaW5zaWRlIHRoaXMgaW52b2NhdGlvbiwgcmV0dXJuaW5nIGZhbHNlIHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgKiBwZXItaW52b2NhdGlvbiBidWRnZXQgaXMgc3BlbnQgKHRoZSBjYWxsZXIgdGhlbiBmYWxscyBiYWNrXG4gICAgICAgICAgICAgICAgICAgKiB0byBhIGZyZXNoIGludm9jYXRpb24pLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIEEgNDEyIG1lYW5zIHRoZSBsb2cgdGhpcyByZXBsYXkgZGVyaXZlZCBpdHMgZXZlbnRzIGZyb20gd2FzXG4gICAgICAgICAgICAgICAgICAgKiBtaXNzaW5nIGFuIGV2ZW50IHRoZSBiYWNrZW5kIGhhZCBhbHJlYWR5IHJlY29yZGVkLiBUaGVcbiAgICAgICAgICAgICAgICAgICAqIHJlamVjdGVkIHdyaXRlIGNhbm5vdCBzaW1wbHkgYmUgcmV0cmllZDogY29ycmVsYXRpb24gaWRzXG4gICAgICAgICAgICAgICAgICAgKiBhcmUgcG9zaXRpb25hbCBvcmRpbmFscyBvZiBvbmUgc2VlZGVkIHNlcXVlbmNlLCBzbyBhIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICogb3ZlciB0aGUgY29ycmVjdGVkIGxvZyBtaW50cyBhIGRpZmZlcmVudCBpZCBmb3IgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAqIGxvZ2ljYWwgZXZlbnQsIGFuZCByZS1wb3N0aW5nIHRoaXMgb25lIHdvdWxkIHBlcnNpc3QgYW5cbiAgICAgICAgICAgICAgICAgICAqIGV2ZW50IG5vIGNvcnJlY3QgcmVwbGF5IGV2ZXIgcHJvZHVjZXMuIFRoZSB3aG9sZSByZXBsYXkgaGFzXG4gICAgICAgICAgICAgICAgICAgKiB0byBiZSByZS1kZXJpdmVkIOKAlCB3aGljaCB0aGUgbG9vcCBkb2VzIGJ5IGRpc2NhcmRpbmcgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBjYWNoZWQgbG9nLCBzaW5jZSBgcnVuV29ya2Zsb3dgIHRoZW4gYnVpbGRzIGEgZnJlc2ggVk0sXG4gICAgICAgICAgICAgICAgICAgKiBzZWVkIGFuZCBjb3JyZWxhdGlvbi1pZCBzZXF1ZW5jZSBmcm9tIHRoZSByZWxvYWRlZCBldmVudHMuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3RhcnRSZXBsYXlJblByb2Nlc3MgPSAoXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcj86IHVua25vd24sXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBTZXQgZmFsc2Ugd2hlbiB3cml0ZXMgdGhpcyBpbnZvY2F0aW9uIG1hZGUgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAqIHdpdGggdGhlIHJlamVjdGVkIG9uZSBtYXkgYmUgbWlzc2luZyBmcm9tIHRoZSA0MTInc1xuICAgICAgICAgICAgICAgICAgICAgKiBkZWx0YTogdGhlIFdvcmxkIGNvbXB1dGVkIHRoYXQgZGVsdGEgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogcmVqZWN0ZWQgcmVxdWVzdCdzIHNuYXBzaG90LCBzbyBpdCBjYW5ub3QgY29udGFpbiBhblxuICAgICAgICAgICAgICAgICAgICAgKiBldmVudCBhIHNpYmxpbmcgY29tbWl0dGVkIGFmdGVyd2FyZHMsIGFuZCBtZXJnaW5nIGl0XG4gICAgICAgICAgICAgICAgICAgICAqIHdvdWxkIHJlc3RhcnQgdGhlIHJlcGxheSBvbiBhIGxvZyB0aGF0IGlzIHN0aWxsXG4gICAgICAgICAgICAgICAgICAgICAqIGluY29tcGxldGUuIE9ubHkgYSBmdWxsIHJlbG9hZCBpcyBhdXRob3JpdGF0aXZlIHRoZW4uXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICB7IGFsbG93RGVsdGEgPSB0cnVlIH06IHsgYWxsb3dEZWx0YT86IGJvb2xlYW4gfSA9IHt9XG4gICAgICAgICAgICAgICAgICApOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzID49XG4gICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMoKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMrKztcbiAgICAgICAgICAgICAgICAgICAgLy8gRXZlcnkgc3RhbGUtc25hcHNob3QgcmVzdGFydCBpbnZhbGlkYXRlcyB0aGUgcGFya2VkIFZNOlxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIGl0IGNvbnN1bWVkIHdhcyBtaXNzaW5nIGV2ZW50cywgc28gb25seSBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBvdmVyIHRoZSBjb3JyZWN0ZWQgbG9nIGlzIGF1dGhvcml0YXRpdmUuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBjb3ZlcnMgdGhlIHN1c3BlbnNpb24tY3JlYXRlIDQxMiwgd2hpY2ggZmlyZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSByZXRlbnRpb24gZGVjaXNpb24gKGtpbGwgc3dpdGNoICsgc3RlcC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAvLyBnYXRlKSBldmVyIHJhbiwgYW5kIHRoZSBydW5fY29tcGxldGVkIDQxMiwgd2hlcmUgYVxuICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgc2Vzc2lvbiBtdXN0IG5vdCBiZSByZXN1bWVkIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBBIFdvcmxkIE1BWSByZXR1cm4gdGhlIGV2ZW50cyB3ZSB3ZXJlIG1pc3Npbmcgb24gdGhlIDQxMi5cbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ1c3QgaXQgb25seSBvbiB0aGUgRklSU1QgcmVzdGFydDogaXRzIGNvbXBsZXRlbmVzcyBwcm9vZlxuICAgICAgICAgICAgICAgICAgICAvLyBsZWFucyBvbiB0aGUgYmFja2VuZCdzIG93biBib29ra2VlcGluZywgc28gaWYgdGhhdFxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlci1jb3VudHMsIGEgXCJjb21wbGV0ZVwiIGRlbHRhIGNhbiBzdGlsbCBsZWF2ZSBhIGhvbGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJvdW5kaW5nIGl0IHRvIG9uZSBhdHRlbXB0IGNhcHMgdGhhdCBhdCBhIHNpbmdsZSB3YXN0ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdGFydDsgZXZlcnkgbGF0ZXIgcmVzdGFydCBkb2VzIHRoZSBhdXRob3JpdGF0aXZlIGxvYWQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICBhbGxvd0RlbHRhICYmIHByZWNvbmRpdGlvblJlc3RhcnRzID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHByZWNvbmRpdGlvbkV2ZW50RGVsdGEoZXJyb3IsIHJ1bklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGRlbHRhIGlzIG9ubHkgdXNhYmxlIGlmIHRoZXJlIGlzIGEgbG9hZGVkIGxvZyB0byBtZXJnZVxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbnRvOyB3aXRob3V0IG9uZSB0aGUgcmVzdGFydCBtdXN0IGxvYWQgZXZlcnl0aGluZy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlZERlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICBkZWx0YSAhPT0gbnVsbCAmJiBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCc7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBzZXQgYmVpbmcgZGlzY2FyZGVkIHdoaWxlIGl0IGlzIHN0aWxsIGluXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmQ7IHRoZSBjb21wYXJpc29uIGhhcHBlbnMgb25jZSB0aGUgbmV4dCBsb2FkIHJlc29sdmVzLlxuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmUgPVxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzOiBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzLm1hcCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0OiBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB1c2VkRGVsdGEgPyAnaW5saW5lLWRlbHRhJyA6ICdmdWxsLXJlbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICYmIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJykge1xuICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBkZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTVVTVCBiZSBhIGZ1bGwsIGN1cnNvci1sZXNzIHJlbG9hZC4gVGhlIGN1cnNvciBmaWx0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYnkgbGV4aWNvZ3JhcGhpYyBldmVudCBpZCB3aGlsZSBhIGhvbGUgaXMgZGVmaW5lZCBieVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFVMSUQgKnRpbWUqOiBhbiBldmVudCBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZCBzb3J0c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVpdGhlciBzaWRlIG9mIHRoZSBjdXJzb3IgZGVwZW5kaW5nIG9uIGl0cyByYW5kb21cbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQsIGFuZCBhbiBldmVudCBtaW50ZWQgaW4gYW4gZWFybGllclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbGxpc2Vjb25kIGJ1dCBjb21taXR0ZWQgbGF0ZXIgYWx3YXlzIHNvcnRzIGJlbG93IGl0LlxuICAgICAgICAgICAgICAgICAgICAgIC8vIEFuIGluY3JlbWVudGFsIGxvYWQgdGhlcmVmb3JlIGhlYWxzIHRoZSBob2xlIG9ubHkgYnlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsdWNrLlxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyB0eXBlOiAnbG9hZEFsbCcgfTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29ycmVjdGVkIGxvZyBpbnNlcnRzIHRoZSBtaXNzaW5nIGV2ZW50cyBCRUxPVyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGggYWxyZWFkeSBzY2FubmVkIGZvciBwYXlsb2FkIHByZXdhcm1pbmcsIHNoaWZ0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgbGF0ZXIgcG9zaXRpb24uIE9ubHkgYSBmdWxsIHJlc2NhbiBzZWVzIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UGF5bG9hZENhY2hlLnJlc2V0U2NhbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAnRXZlbnQgY3JlYXRpb24gcmVqZWN0ZWQgYXMgc3RhbGU7IHJlc3RhcnRpbmcgcmVwbGF5IGluLXByb2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB1c2VkRGVsdGEgPyAnaW5saW5lLWRlbHRhJyA6ICdmdWxsLXJlbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cucHJlY29uZGl0aW9uX3Jlc3RhcnRzJzogcHJlY29uZGl0aW9uUmVzdGFydHMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogRXNjYWxhdGUgYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24gdGhhdCBzdXJ2aXZlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAqIGluLXByb2Nlc3MgcmVzdGFydCBidWRnZXQgdG8gYSBmcmVzaCBpbnZvY2F0aW9uLCBvciBnaXZlIHVwXG4gICAgICAgICAgICAgICAgICAgKiBvbiB0aGUgcnVuIHdoZW4gdGhlIHBlci1ydW4gYnVkZ2V0IGlzIGFsc28gc3BlbnQuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGluLXByb2Nlc3MgYnVkZ2V0IGlzIGEgY2xvc3VyZSB2YXJpYWJsZSBhbmQgdGhlIHF1ZXVlJ3NcbiAgICAgICAgICAgICAgICAgICAqIGRlbGl2ZXJ5IGNvdW50IHJlc3RhcnRzIGF0IDEgd2hlbmV2ZXIgYSBuZXcgbWVzc2FnZSBpc1xuICAgICAgICAgICAgICAgICAgICogZW5xdWV1ZWQsIHNvIGEgcnVuIHRoYXQgaXMgcGVybWFuZW50bHkgdW5hYmxlIHRvIGNhdGNoIHVwXG4gICAgICAgICAgICAgICAgICAgKiB3aXRoIGl0cyBvd24gZXZlbnQgbG9nIHdvdWxkIG90aGVyd2lzZSBjeWNsZSByZXN0YXJ0cyDihpJcbiAgICAgICAgICAgICAgICAgICAqIHJlLWludm9rZSDihpIgcmVzdGFydHMgd2l0aCBubyBydW4tbGV2ZWwgYm91bmQuIFRoZSBjaGFpbiBpc1xuICAgICAgICAgICAgICAgICAgICogdGhlcmVmb3JlIGNvdW50ZWQgb24gdGhlIG1lc3NhZ2UgaXRzZWxmLCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAgICAgICAgICAqIHJlcGxheSBkaXZlcmdlbmNlcyBhcmUsIGFuZCBmYWlscyB0aGUgcnVuIG9uY2UgZXhoYXVzdGVkLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBjb3VudGVyIG9ubHkgYWR2YW5jZXMgb24gaG9wcyB0aGF0IGVucXVldWUgYSBuZXcgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICogKHNlZSBgcmVpbnZva2VgKS4gQSByZWRlbGl2ZXJ5LWJhc2VkIGhvcCBrZWVwcyB0aGUgc2FtZSBib2R5XG4gICAgICAgICAgICAgICAgICAgKiBhbmQgc28gdGhlIHNhbWUgY291bnQsIGJ1dCBpdCBhbHNvIGtlZXBzIGFkdmFuY2luZ1xuICAgICAgICAgICAgICAgICAgICogYG1ldGFkYXRhLmF0dGVtcHRgLCB3aGljaCB0aGUgbWF4LWRlbGl2ZXJ5IGNoZWNrIGF0IHRoZSB0b3BcbiAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBoYW5kbGVyIGFscmVhZHkgYm91bmRzIOKAlCBhbmQgdGhlIGRlbGF5IGJlbG93IGlzIHdoYXRcbiAgICAgICAgICAgICAgICAgICAqIG1ha2VzIHRoYXQgYnVkZ2V0IHNwYW4gcmVhbCB0aW1lIHJhdGhlciB0aGFuIGJlaW5nIGJ1cm5lZCBpblxuICAgICAgICAgICAgICAgICAgICogYSB0aWdodCBsb29wLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24gPSBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogdW5rbm93blxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTxcbiAgICAgICAgICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWludm9rZWQ6IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHsgdGltZW91dFNlY29uZHM6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfCB7IHJlaW52b2tlZDogZmFsc2U7IGVycm9yOiBFcnJvciB9XG4gICAgICAgICAgICAgICAgICA+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0ZW1wdCA9IChwcmVjb25kaXRpb25SZWludm9jYXRpb25zID8/IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UmVpbnZvY2F0aW9ucyA9IGdldFByZWNvbmRpdGlvbk1heFJlaW52b2NhdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPiBtYXhSZWludm9jYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBgRXZlbnQgY3JlYXRpb24gd2FzIHJlamVjdGVkIGFzIHN0YWxlIGFmdGVyICR7bWF4UmVpbnZvY2F0aW9uc30gcmUtaW52b2NhdGlvbnMgb2YgJHtnZXRQcmVjb25kaXRpb25NYXhJblByb2Nlc3NSZXN0YXJ0cygpfSBpbi1wcm9jZXNzIHJlcGxheSByZXN0YXJ0cyBlYWNoOiB0aGlzIHJ1biBjYW5ub3Qgb2JzZXJ2ZSBpdHMgb3duIGV2ZW50IGxvZyBjb21wbGV0ZWx5IGVub3VnaCB0byBtYWtlIHByb2dyZXNzLiBMYXN0IHJlamVjdGlvbiAoJHtyZWFzb259KTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAnRXZlbnQgY3JlYXRpb24gcmVqZWN0ZWQgYXMgc3RhbGUgYWZ0ZXIgaW4tcHJvY2VzcyByZXN0YXJ0czsgcmUtaW52b2tpbmcgcnVuIGZvciBhIGZyZXNoIHJlcGxheScsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVpbnZvY2F0aW9uczogYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlaW52b2NhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cucHJlY29uZGl0aW9uX3JlaW52b2NhdGlvbnMnOiBhdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVsYXllZCwgdW5saWtlIHRoZSBvdGhlciByZWludm9rZSgpIGNhbGxlcnM6IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBpbi1wcm9jZXNzIHJlc3RhcnRzIGFscmVhZHkgcmVsb2FkZWQgdGhlIGxvZyBzZXZlcmFsIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgY2F0Y2hpbmcgdXAsIHNvIHRoZSB3cml0ZXJzIHRoaXMgcmVwbGF5IGlzIHJhY2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhcmUgc3RpbGwgYWN0aXZlLiBSZXRyeWluZyBpbnN0YW50bHkganVzdCBidXJucyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBidWRnZXQgYXQgZnVsbCBzcGVlZC5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICByZWludm9rZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBhd2FpdCByZWludm9rZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFByZWNvbmRpdGlvblJlaW52b2tlRGVsYXlTZWNvbmRzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnM6IGF0dGVtcHQgfVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBEZXBsb3ltZW50LWFmZmluaXR5IGd1YXJkLCBzaGFyZWQgYnkgdGhlIHR3byBwYXRocyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIGEgcnVuOiBxdWV1ZWQgc3RlcCBleGVjdXRpb25zIGFuZCBmbG93IHJlcGxheXMuXG4gICAgICAgICAgICAgICAgICBjb25zdCBndWFyZERlcGxveW1lbnQgPSBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIHJ1bjogUGljazxcbiAgICAgICAgICAgICAgICAgICAgICBXb3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAncnVuSWQnIHwgJ2RlcGxveW1lbnRJZCcgfCAnc3BlY1ZlcnNpb24nXG4gICAgICAgICAgICAgICAgICAgID4sXG4gICAgICAgICAgICAgICAgICAgIHJlZW5xdWV1ZVBheWxvYWQ6ICgpID0+IFByb21pc2U8V29ya2Zsb3dJbnZva2VQYXlsb2FkPixcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlU3RvcD86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8RGVwbG95bWVudEFmZmluaXR5T3V0Y29tZT4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG91dGNvbWUsIHNwYW5BdHRyaWJ1dGVzIH0gPVxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGd1YXJkRGVwbG95bWVudEFmZmluaXR5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudDogZGVwbG95bWVudE1pc21hdGNoUmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZVN0b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0RlcGxveW1lbnRVbmF2YWlsYWJsZUVycm9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZC5pc0RlcGxveW1lbnRVbmF2YWlsYWJsZUVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVlbnF1ZXVlOiBhc3luYyAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50OiByZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9OiBSZWVucXVldWVBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlZW5xdWV1ZVBheWxvYWQoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50OiByZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBkZXBsb3ltZW50SWQsIHNwZWNWZXJzaW9uLCBkZWxheVNlY29uZHMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5BdHRyaWJ1dGVzKSBzcGFuPy5zZXRBdHRyaWJ1dGVzKHNwYW5BdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dGNvbWU7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBJZiBpbmNvbWluZyBtZXNzYWdlIGhhcyBhIHN0ZXBJZCwgdGhpcyBpcyBhIGJhY2tncm91bmQgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uLiBFeGVjdXRlIHRoZSBzdGVwLCB0aGVuIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwc1xuICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgYmF0Y2ggYXJlIGRvbmUuIElmIHNvLCByZXBsYXkgaW5saW5lIChzYXZpbmcgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwKS4gSWYgbm90LCByZXR1cm4g4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGVcbiAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcGljayB1cCB0aGUgcmVwbGF5LlxuICAgICAgICAgICAgICAgICAgaWYgKGluY29taW5nU3RlcElkICYmIGluY29taW5nU3RlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1J1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChiZ1J1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBzdGF0dXM6IGJnUnVuLnN0YXR1cyB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb3ZlcnMgZXZlcnkgcXVldWVkIHN0ZXAgZXhlY3V0aW9uIOKAlCBmaXJzdCBkaXNwYXRjaCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJpZXMvcmV0cmllcyBhbGlrZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgZ3VhcmREZXBsb3ltZW50KGJnUnVuLCBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVwbGF5TWVzc2FnZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnU3RhcnRlZEF0ID0gYmdSdW4uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICAgICAgICA/ICtiZ1J1bi5zdGFydGVkQXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IGNlaWxpbmcgZm9yIGEgYmFja2dyb3VuZGVkIHN0ZXAuIGBtZXRhZGF0YS5hdHRlbXB0YFxuICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGUgcXVldWUgZGVsaXZlcnkgY291bnQpIGlzIGEgY2hlYXAgdXBwZXIgYm91bmQsIGJ1dCBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXItY291bnRzOiBhIFRocm90dGxlRXJyb3IgLyBUb29FYXJseUVycm9yIOKAlCBvciBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJ5IHRoYXQgbmV2ZXIgcmFuIHRoZSBib2R5IOKAlCBzdGlsbCBhZHZhbmNlcyBpdCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVzdGluZyBpdCBkaXJlY3RseSBjb3VsZCBmYWlsIGEgc3RlcCBhcyBcImV4Y2VlZGVkIG1heFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJpZXNcIiBiZWZvcmUgdGhlIGJvZHkgZXZlciByYW4gKGEgdXNlci12aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVncmVzc2lvbiB1bmRlciB0cmFuc2llbnQgYmFja2VuZCBwcmVzc3VyZSkuIFVzZSBpdCBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYSBmYXN0IGdhdGU6IHdoaWxlIGl0IGlzIGF0IG9yIHVuZGVyIHRoZSBjZWlsaW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgY2Fubm90IGJlIGV4aGF1c3RlZCwgc28gcHJvY2VlZCB3aXRob3V0IHRvdWNoaW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZy4gT25seSBvbmNlIGl0IGNyb3NzZXMgdGhlIGNlaWxpbmcgZG8gd2UgbG9hZCB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvZyBhbmQgZGVyaXZlIHRoZSBhdXRob3JpdGF0aXZlIGF0dGVtcHQgZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmRlZCBgc3RlcF9zdGFydGVkYCBjb3VudCDigJQgc2NvcGVkIHRvIHRoZSBsaWZlY3ljbGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IHRvdGFsIChiYXJlIHN0YXJ0cyBwbHVzIHRoZSBsYXJnZXN0IHNpbmdsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyJ3Mgc3RhcnRzKTogdGhyb3R0bGUvdG9vLWVhcmx5IHJlZGVsaXZlcmllcyB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0YXJ0IGF0IGFsbCwgcmFjaW5nIGludm9jYXRpb25zJyBvbmUtb2ZmIHN0YW1wZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGVzIGRvbid0IGFjY3VtdWxhdGUgKGNvdW50aW5nIHRoZW0gZmFsc2VseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aGF1c3RlZCBoZWFsdGh5IHN0ZXBzIOKAlCBzZWUgY291bnRTdGVwU3RhcnRlZEV2ZW50cyksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGF0dGVtcHRzIGJ1cm5lZCB1bmRlciBhIHByaW9yIGlubGluZS1vd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwaGFzZSBzdGlsbCBjb3VudCwgc28gYSBzdGVwIHRoYXQgdGltZXMgb3V0IHVuZGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQgcmVjb3ZlcnkgYW5kIHRoZW4gdHJhbnNpdGlvbnMgdG8gcXVldWVkL2JhcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyaWVzIHRyaXBzIHRoZSBjb21iaW5lZCBjZWlsaW5nLiBUaGlzIHN0aWxsIGJvdW5kc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXRzLCB3aGljaCB3cml0ZSBubyBlcnJvciBmb3IgdGhlIHBvc3QtYm9keSBndWFyZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNhdGNoLlxuICAgICAgICAgICAgICAgICAgICAgIGxldCBiZ0F1dGhvcml0YXRpdmVBdHRlbXB0ID0gbWV0YWRhdGEuYXR0ZW1wdDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ01heFJldHJpZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RlcEZ1bmN0aW9uKGluY29taW5nU3RlcE5hbWUpPy5tYXhSZXRyaWVzID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVM7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmF0dGVtcHQgPiBiZ01heFJldHJpZXMgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICd0b3RhbEF0dGVtcHRzJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0IHdoaWxlIHRoZSBzdGVwIGJvZHkgcnVucyDigJRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEdXJhdGlvbiwgbm90IGJ5IHRoZSByZXBsYXkgdGltZW91dC4gU2VlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheUJ1ZGdldCBkb2NzIGZvciB0aGUgY29udHJhY3QuXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+PjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlLWZsaWdodDogYSBkZWxheWVkIGJhY2tzdG9wIChvciByZXRyeSkgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGFycml2ZSB3aGlsZSBhbm90aGVyIGV4ZWN1dGlvbiBvZiB0aGlzIHNhbWUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbWlkLWJvZHkgaW4gdGhpcyBwcm9jZXNzIOKAlCBtb3N0IGltcG9ydGFudGx5IG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZHMgd2l0aCBubyBpbnZvY2F0aW9uIGtpbGwgYm91bmQgKHdvcmxkLWxvY2FsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSBvd25lcnNoaXAgbGVhc2UgaXMgbm90IGEgZGVhdGggcHJvb2YuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9zZXIgYXdhaXRzIHRoZSB3aW5uZXIncyBzZXR0bGVtZW50LCB0aGVuIGFja3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXhlY3V0aW5nLiBObyBvd25lck1lc3NhZ2VJZCBoZXJlOiB0aGUgYmFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIG9mIGEgcXVldWUtZHJpdmVuIGV4ZWN1dGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWxseSBjbGVhcnMgaW5saW5lIG93bmVyc2hpcCAodGhlIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlLW93bmVkIGZyb20gdGhpcyBwb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0ID0gYXdhaXQgcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogYmdSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IGJnU3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKGJnUnVuLmF0dHJpYnV0ZXMsIHJ1bklkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiBiZ1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IGNlaWxpbmc6IHRoZSBxdWV1ZSBkZWxpdmVyeSBjb3VudCBhcyBhIGZhc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdhdGUsIHZlcmlmaWVkIGFnYWluc3QgdGhlIHJlY29yZGVkIHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bnQgb25jZSBpdCBjcm9zc2VzIHRoZSBjZWlsaW5nIChzZWUgYWJvdmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6IGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHN0ZXBSZXN1bHQudGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc3RlcCBoYWQgcGVuZGluZyBvcHMgKHN0cmVhbSB3cml0ZXMpLCBicmVhayBhbmQgbGV0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdFVudGlsIGZsdXNoIHRoZW0g4oCUIGNhbid0IGNvbnRpbnVlIGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0Lmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2ZhaWxlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3NraXBwZWQnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZW50cyB0byBjaGVjayBpZiBhbGwgcGFyYWxsZWwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY3Vyc29yLWJhc2VkIGxvYWRpbmcgc28gdGhlIG1haW4gbG9vcCBjYW4gY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFsbHkgZnJvbSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChsb2FkZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcGVuZGluZyBzdGVwczogYW55IHN0ZXBfY3JlYXRlZCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG1hdGNoaW5nIHN0ZXBfY29tcGxldGVkIG9yIHN0ZXBfZmFpbGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBUZXJtaW5hbElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGxvYWRlZC5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBDcmVhdGVkSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFRlcm1pbmFsSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nU3RlcElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBzdGVwQ3JlYXRlZElkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBUZXJtaW5hbElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBJZHMuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ1N0ZXBJZHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBwZW5kaW5nIHN0ZXAgdGhhdCBUSElTIG1lc3NhZ2UgaW5saW5lLW93bnMgKGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgZGVsaXZlcnkgb2YgdGhpcyBtZXNzYWdlIHN0YW1wZWQgaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCBhbmQgdGhlbiBjcmFzaGVkIG1pZC1ib2R5KSBtdXN0IGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJlZCBoZXJlOiBvbmx5IHRoZSBvd25pbmcgbWVzc2FnZSBtYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtZXhlY3V0ZSBpdCBiZWZvcmUgdGhlIG93bmVyc2hpcCBsZWFzZSBleHBpcmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2FrZSByZXBsYXlzIG1lcmVseSBlbnN1cmUgYSBkZWxheWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wLiBGYWxsIHRocm91Z2ggdG8gdGhlIG1haW4gbG9vcCwgd2hvc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggdGFibGUgcm91dGVzIGl0IHRvIG93bmVkIHJlY292ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbmxpbmVPd25lcnNoaXBFbmFibGVkKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQZW5kaW5nU3RlcE93bmVkQnlNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwSWRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEubWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhY2tncm91bmQgc3RlcCBkb25lOyBmYWxsaW5nIHRocm91Z2ggdG8gcmVjb3ZlciBhbiBpbmxpbmUgc3RlcCBvd25lZCBieSB0aGlzIG1lc3NhZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBzdGVwcyBzdGlsbCBpbiBwcm9ncmVzcy4gUmV0dXJuIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1aW5nIOKAlCB0aGUgbGFzdCBoYW5kbGVyIHRvIGNvbXBsZXRlIHdpbGwgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHN0ZXBzIGRvbmUgYW5kIHJlcGxheSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWNrZ3JvdW5kIHN0ZXAgZG9uZSBidXQgb3RoZXIgc3RlcHMgcGVuZGluZywgcmV0dXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBzdGVwcyBkb25lIOKAlCBmYWxsIHRocm91Z2ggdG8gdGhlIG1haW4gcmVwbGF5IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgc2hhcmVkIHN0YXRlIHNvIHRoZSBsb29wIGNhbiBjb250aW51ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdBbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSwgcmVwbGF5aW5nIGlubGluZSBhZnRlciBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydW5DcmVhdGVkRXZlbnQgPSBsb2FkZWQuZXZlbnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheUlucHV0OiB1bmtub3duO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bkNyZWF0ZWRFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlJbnB1dCA9IHJ1bkNyZWF0ZWRFdmVudC5ldmVudERhdGEuaW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTGVnYWN5U3BlY1ZlcnNpb24oYmdSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgaGFzIG5vIFwicnVuX2NyZWF0ZWRcIiBldmVudGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExlZ2FjeSBydW5zIHByZWRhdGUgdGhlIGV2ZW50LXNvdXJjZWQgcnVuX2NyZWF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YXJpYW50LCBzbyByZXRhaW4gdGhlIHJlc29sdmVkIEdFVCBvbmx5IGZvciB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWdhY3lSdW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWdhY3lSdW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5SW5wdXQgPSBsZWdhY3lSdW4uaW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYmdSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiByZXBsYXlJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gYmdTdGFydGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCBlcnJvciB3aGlsZSBwcmVwYXJpbmcgYmFja2dyb3VuZCB3b3JrZmxvdyBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gRGVwbG95bWVudC1hZmZpbml0eSBwcmUtY2hlY2sgZm9yIHRoZSBsYXp5IGhvb2sgZmFzdFxuICAgICAgICAgICAgICAgICAgLy8gcGF0aCBiZWxvdy4gTmV3IGxhenktcmVzdW1lIG1lc3NhZ2VzIGNhcnJ5IHRoZSBydW4nc1xuICAgICAgICAgICAgICAgICAgLy8gcGlubmVkIGRlcGxveW1lbnQgKGBob29rSW5wdXQuZGVwbG95bWVudElkYCksIHNvIGFcbiAgICAgICAgICAgICAgICAgIC8vIG1pc3JvdXRlZCBkZWxpdmVyeSBpcyBkZXRlY3RhYmxlIHdpdGggYSBjaGVhcCBhbWJpZW50XG4gICAgICAgICAgICAgICAgICAvLyBkZXBsb3ltZW50LWlkIGNvbXBhcmlzb24gQkVGT1JFIHRoZSBmYXN0IHBhdGgnc1xuICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3cml0ZSDigJQgdGhlIGNvcnJlY3RseS1yb3V0ZWQgY29tbW9uIGNhc2VcbiAgICAgICAgICAgICAgICAgIC8vIHBheXMgbm8gcnVuIGZldGNoIGFuZCBubyBsYXRlbmN5LiBPbmx5IGEgZGV0ZWN0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIG1pc21hdGNoIGZldGNoZXMgdGhlIGF1dGhvcml0YXRpdmUgcnVuIGFuZCBoYW5kcyBpdCB0b1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIGV4aXN0aW5nIGd1YXJkICh3aGljaCBvd25zIHJlLXJvdXRlL2ZhaWwgcG9saWN5KTtcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSByZS1yb3V0ZWQgbWVzc2FnZSBrZWVwcyB0aGUgY29tcGxldGUgYGhvb2tJbnB1dGAsXG4gICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBtYXkgaG9sZCB0aGUgb25seSBjb3B5IG9mIHRoZSByZXN1bWUgcGF5bG9hZC5cbiAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHBpbm5lZCBvciBhbWJpZW50IGlkIGlzIHVuYXZhaWxhYmxlIChvbGRlclxuICAgICAgICAgICAgICAgICAgLy8gcHJvZHVjZXIgbWVzc2FnZSwgYSB3b3JsZCB3aXRob3V0IGRlcGxveW1lbnQgYWZmaW5pdHksXG4gICAgICAgICAgICAgICAgICAvLyBvciBhIGdldERlcGxveW1lbnRJZCBmYWlsdXJlKSwgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkOlxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGF1dGhvcml0YXRpdmUgZ3VhcmQgYWZ0ZXIgcnVuIHNldHVwIOKAlCB3aGljaCByZW1haW5zXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvdGVjdGlvbiBiZWZvcmUgcmVwbGF5IGFuZCBzdGVwIGV4ZWN1dGlvbiDigJQgc3RpbGxcbiAgICAgICAgICAgICAgICAgIC8vIGNvdmVycyB0aGUgZGVsaXZlcnk7IHRoZSBmYXN0IHBhdGgncyB3cml0ZSBpcyBpZGVtcG90ZW50XG4gICAgICAgICAgICAgICAgICAvLyBwZXIgKHJ1bklkLCByZXN1bWVJZCksIHNvIGEgcHJlLWd1YXJkIHdyaXRlIGZyb20gYW5cbiAgICAgICAgICAgICAgICAgIC8vIG9sZGVyIG1lc3NhZ2Ugc3RheXMgY29udmVyZ2VudC5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXdvcmtmbG93UnVuICYmXG4gICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dD8uZGVwbG95bWVudElkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBlbGlnaWJpbGl0eSBhcyBndWFyZERlcGxveW1lbnRBZmZpbml0eTogd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAvLyBhdG9taWMsIGltbXV0YWJsZSBkZXBsb3ltZW50cyB0aGUgaWRzIGxlZ2l0aW1hdGVseVxuICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXIgKGUuZy4gZHBsX2xvY2FsQDx2ZXJzaW9uPikgYW5kIGNvbXBhcmluZyB0aGVtXG4gICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIHRyaWdnZXIgc3B1cmlvdXMgcnVuIGZldGNoZXMuXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLmNhcGFiaWxpdGllcz8uZGVwbG95bWVudEFmZmluaXR5ID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGlubmVkRGVwbG95bWVudElkID0gaG9va0lucHV0LmRlcGxveW1lbnRJZDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnREZXBsb3ltZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQgIT09IHBpbm5lZERlcGxveW1lbnRJZFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgZ3VhcmREZXBsb3ltZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXRSdW5SZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgKSkgIT09ICdjb250aW51ZSdcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gLS0tIExhenkgaG9vayByZXN1bWUgZmFzdCBwYXRoIC0tLVxuICAgICAgICAgICAgICAgICAgLy8gQSBsYXp5IGhvb2sgZGVsaXZlcnkgKHJlc3VtZUlkICsgZGlnZXN0IG9uIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSkgaG9pc3RzIHRoZSBjb25zdW1lcidzIGlkZW1wb3RlbnQgaG9va19yZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgLy8gcmUtZW5zdXJlIGFib3ZlIHJ1bl9zdGFydGVkIGFuZCBhc2tzIHRoZSBXb3JsZCB0byByZXR1cm5cbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHJlcGxheSBsb2cgd2l0aCB0aGUgd3JpdGUgKHByZWxvYWRFdmVudHMpLiBBXG4gICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nIFdvcmxkIGFuc3dlcnMgd2l0aCB0aGUgcmVjb25zdHJ1Y3RlZCBydW4sIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGUgcmVwbGF5IGxvZywgYW5kIHRoZSBydW4ncyBldmVudCBjZWlsaW5nIOKAlFxuICAgICAgICAgICAgICAgICAgLy8gZXZlcnl0aGluZyB0aGUgZ2VuZXJpYyBzZXR1cCBiZWxvdyB3b3VsZCBzcGVuZCBhXG4gICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBQT1NUIGFuZCBhbiBldmVudHMubGlzdCBvbi4gQW55IG90aGVyIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgLy8gKG9sZGVyIHNlcnZlciwgYSBXb3JsZCB0aGF0IGlnbm9yZXMgdGhlIHBhcmFtLCBvciBhXG4gICAgICAgICAgICAgICAgICAvLyBwcmVsb2FkIHRoYXQgZmFpbHMgdmFsaWRhdGlvbiwgaW5jbHVkaW5nIGEgYm91bmRlZFxuICAgICAgICAgICAgICAgICAgLy8gaGFzTW9yZSBwYWdlKSBmYWxscyBiYWNrIHRvIHRoYXQgZ2VuZXJpYyBzZXR1cDsgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBob29rX3JlY2VpdmVkIHdyaXRlIGl0c2VsZiBoYXMgc3RpbGwgc3VjY2VlZGVkIGVpdGhlclxuICAgICAgICAgICAgICAgICAgLy8gd2F5LCBzbyB0aGUgcmUtZW5zdXJlIGJsb2NrIGJlbG93IGlzIHNraXBwZWQgdmlhXG4gICAgICAgICAgICAgICAgICAvLyBgaG9va0Vuc3VyZWRgLiBOZXZlciB0YWtlbiBvbiB0dXJibyAodHVyYm8gZGVsaXZlcmllc1xuICAgICAgICAgICAgICAgICAgLy8gY2FycnkgcnVuSW5wdXQsIG5vdCBob29rSW5wdXQpIG9yIGFmdGVyIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwIHBhdGggYWxyZWFkeSBsb2FkZWQgdGhlIHJ1bi5cbiAgICAgICAgICAgICAgICAgIGxldCBob29rRW5zdXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhd29ya2Zsb3dSdW4gJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0ICYmXG4gICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dC5yZXN1bWVJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dC5wYXlsb2FkRGlnZXN0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBob29rUmVzdW1lSW5wdXQgPSBob29rSW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIERhdGUgdGhlIG1hdGVyaWFsaXplZCBldmVudCB0byB3aGVuIHRoZSByZXN1bWUgYWN0dWFsbHlcbiAgICAgICAgICAgICAgICAgICAgLy8gb2NjdXJyZWQg4oCUIHNhbWUgZGVyaXZhdGlvbiBhcyB0aGUgcmUtZW5zdXJlIGJlbG93ICh0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lSWQgaXMgYSBVTElEIG1pbnRlZCBieSByZXN1bWVIb29rKCkgYXQgcmVzdW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIHRpbWUpLlxuICAgICAgICAgICAgICAgICAgICBsZXQgb2NjdXJyZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0ID0gbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVUaW1lKGhvb2tSZXN1bWVJbnB1dC5yZXN1bWVJZClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQoJ3dvcmtmbG93Lmhvb2tfcmVjZWl2ZWQuY3JlYXRlLnN0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93Lmhvb2tfcmVjZWl2ZWQucHJlbG9hZF9ldmVudHMnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rUmVzdW1lSW5wdXQuaG9va0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogaG9va1Jlc3VtZUlucHV0LnRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tSZXN1bWVJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVJZDogaG9va1Jlc3VtZUlucHV0LnJlc3VtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVQYXlsb2FkRGlnZXN0OiBob29rUmVzdW1lSW5wdXQucGF5bG9hZERpZ2VzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZEV2ZW50czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGhvb2tFbnN1cmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiB1bmxpa2UgdGhlIHJlLWVuc3VyZSBiZWxvdywgdGhpcyBob2lzdGVkIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBOT1Qgc2V0IEhvb2tSZXNpbGllbnRSZXN1bWVNYXRlcmlhbGl6ZWQg4oCUIGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVucyBvbiBldmVyeSBmYXN0LXBhdGggcmVzdW1lLCBpbmNsdWRpbmcgdGhlIGNvbW1vblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2Ugd2hlcmUgdGhlIHByb2R1Y2VyJ3MgZGlyZWN0IHdyaXRlIGFscmVhZHkgbGFuZGVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoaXMgY2FsbCBtZXJlbHkgY29udmVyZ2VkIG9uIGl0LCBzbyBpdCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcmVjb3Zlcnkgc2lnbmFsLiB3b3JrZmxvdy5yZXN1bWVfc2V0dXBfc291cmNlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKGJlbG93KSBkZXNjcmliZXMgdGhpcyBwYXRoIGluc3RlYWQuXG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJlbG9hZCBpcyB1c2FibGUgYXMgcmVwbGF5IGlucHV0IG9ubHkgd2hlbiBpdCBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbW9uc3RyYWJseSB0aGUgY29tcGxldGUgcGljdHVyZTogYSByZWNvbnN0cnVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHdpdGggYSBzdGFydCB0aW1lLCBhIG5vbi1lbXB0eSBDT01QTEVURSBsb2dcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoaGFzTW9yZSBmYWxzZSDigJQgdGhpcyBwYXRoIGhhcyBubyBjdXJzb3ItY29udGludWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWFjaGluZXJ5LCBzbyBhIGJvdW5kZWQgcGFnZSBtdXN0IG5vdCBiZSB0cnVzdGVkKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VydmVyJ3MgZXZlbnQgY2VpbGluZyAodGhpcyByZXNwb25zZSBwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkJ3Mgcm9sZSwgc28gYSBtaXNzaW5nIGNlaWxpbmcgd291bGQgbGVhdmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudC1saW1pdCBlbmZvcmNlbWVudCBkaXNhYmxlZCBmb3IgdGhlIHJ1biksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBydW4gbGlmZWN5Y2xlIGV2ZW50cywgdGhlIGNhbm9uaWNhbCBldmVudCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgY29udmVyZ2VkIG9uLCBhbmQgdGhlIGhvb2tfcmVjZWl2ZWQgbWF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUSElTIHJlc3VtZSAoc28gd2UgbmV2ZXIgcmVwbGF5IGFnYWluc3QgYSBsb2cgdGhhdCBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc3NpbmcgdGhlIHZlcnkgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBkZWxpdmVyeSkuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNhYmxlUmVwbGF5UHJlbG9hZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucnVuICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ydW4uc3RhcnRlZEF0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmN1cnNvciAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzTW9yZSA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXN1bHQubWF4RXZlbnRzID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+IGUuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnaG9va19yZWNlaXZlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlc3VtZUlkID09PSBob29rUmVzdW1lSW5wdXQucmVzdW1lSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2FibGVSZXBsYXlQcmVsb2FkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucnVuPy5zdGFydGVkQXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZWNvbnN0cnVjdGVkIHJ1biBhbHdheXMgcmVhZHMgJ3J1bm5pbmcnLCBidXQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgZXZlbnQgY29tbWl0dGVkIGNvbmN1cnJlbnRseSByaWRlcyBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZyBpdHNlbGYuIFRoZSBub2RlIHJlcGxheSBsb29wIHdvdWxkIGNhdGNoIGl0LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFF1aWNrSlMgZGlzcGF0Y2hlcyBiZWZvcmUgdGhhdCBjaGVjayDigJQgc28gY29uc3VtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlbGl2ZXJ5IGhlcmUsIGJlZm9yZSBhbnkgZW5naW5lIHJ1bnMuIFNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dGNvbWUgYXMgdGhlIHJ1bl9zdGFydGVkIHBhdGgncyBub24tcnVubmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdHVzIGNoZWNrLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVybWluYWxFdmVudCA9IHJlc3VsdC5ldmVudHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ydW5JZCA9PT0gcnVuSWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVybWluYWxFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJlbG9hZCBzdGlsbCBpbml0aWFsaXplZCB0aGlzIGRlbGl2ZXJ5IChpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBob3cgdGhlIHRlcm1pbmFsIHN0YXRlIHdhcyBvYnNlcnZlZCksIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cC1zb3VyY2UgYW5kIHRoZSBydW4ncyBhY3R1YWwgdGVybWluYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdHVzIGFyZSByZWNvcmRlZCBiZWZvcmUgY29uc3VtaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2NvbXBsZXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0ZXJtaW5hbEV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2NhbmNlbGxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rUmVzdW1lU2V0dXBTb3VyY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9va19yZWNlaXZlZF9zdHJlYW0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIGxhenkgaG9vayBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0ZXJtaW5hbEV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0gcmVzdWx0LnJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0ID0gY2xhbXBNYXhFdmVudHMocmVzdWx0Lm1heEV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmNob3JzIFJTRlMg4oCUIHNlZSB0aGUgZGVjbGFyYXRpb24gYWJvdmUuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHBsYXlzIHJ1bl9zdGFydGVkJ3Mgcm9sZSBvbiB0aGlzIHBhdGguXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IHJlc3VsdC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcmVzdWx0LmN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICtyZXN1bHQucnVuLnN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocmVzdWx0LnJ1bi5zdGF0dXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzZnVsIHdyaXRlLCBubyB1c2FibGUgcHJlbG9hZCAoQ0JPUiByZXNwb25zZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBhbiBvbGRlciBzZXJ2ZXIsIGEgV29ybGQgdGhhdCBpZ25vcmVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0LWluLCBhIGJvdW5kZWQgaGFzTW9yZSBwYWdlLCBvciBhIHByZWxvYWQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHZhbGlkYXRpb24pOiB0YWtlIHRoZSBnZW5lcmljIHJ1bl9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBiZWxvdy4gSXRzIHByZWxvYWQgaXMgbG9hZGVkIGFmdGVyIHRoaXMgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZCwgc28gdGhlIGNhbm9uaWNhbCBob29rX3JlY2VpdmVkIGlzIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHdoYXRldmVyIGxvZyB0aGF0IHNldHVwIHJlYWRzIOKAlCBubyBzcGxpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5Ib29rUmVzdW1lU2V0dXBTb3VyY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvb2tfcmVjZWl2ZWRfZmFsbGJhY2snXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGNsYXNzaWZpY2F0aW9uIGFzIHRoZSByZS1lbnN1cmUgYmVsb3c6XG4gICAgICAgICAgICAgICAgICAgICAgLy8gLSBIb29rTm90Rm91bmQgLyBSdW5FeHBpcmVkOiB0aGUgcnVuIHdlbnQgdGVybWluYWw7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBub3RoaW5nIGxlZnQgdG8gcmVzdW1lLCBjb25zdW1lIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIC0gYW55dGhpbmcgZWxzZSAoRW50aXR5Q29uZmxpY3QsIGEgdHJ1bmNhdGVkIHByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN0cmVhbSwgdHJhbnNwb3J0IGZhaWx1cmVzKTogdHJhbnNpZW50IOKAlCByZXRocm93IHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgcXVldWUgcmVkZWxpdmVycyBhbmQgdGhlIGlkZW1wb3RlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIChydW5JZCwgcmVzdW1lSWQpIGNsYWltIGNvbnZlcmdlcyBvbiByZXRyeS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIGxhenkgaG9vayBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHRoZSBydW4gc3RhdGUgLS0tXG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHdvcmtmbG93UnVuIHdhcyBhbHJlYWR5IHNldCBieSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIChpbmxpbmUgcmVwbGF5IGFmdGVyIGFsbCBwYXJhbGxlbCBzdGVwcyBkb25lKVxuICAgICAgICAgICAgICAgICAgLy8gb3IgYnkgdGhlIGxhenkgaG9vayBmYXN0IHBhdGggYWJvdmUuXG4gICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjYWxsIHJ1bl9zdGFydGVkIGRpcmVjdGx5IOKAlCB0aGlzIGJvdGggdHJhbnNpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB0byAncnVubmluZycgQU5EIHJldHVybnMgdGhlIHJ1biBlbnRpdHksIHNhdmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHNlcGFyYXRlIHJ1bnMuZ2V0IHJvdW5kLXRyaXAuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyYWN0OiBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcpIG11c3QgYmUgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcnVucyBhbHJlYWR5IGluICdydW5uaW5nJyBzdGF0dXMgKHJldHVybiB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXJyb3IpLCBub3QganVzdCBmb3IgcGVuZGluZyDihpIgcnVubmluZyB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9zdGFydGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWMgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCgpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGF2YWlsYWJsZSwgc28gdGhlIHJlc2lsaWVudCBzdGFydCBwYXRoIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbiAobm90IGFsd2F5cyBjdXJyZW50KS5cbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0Py5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHJ1biBpbnB1dCBmcm9tIHF1ZXVlIHNvIHRoZSBzZXJ2ZXIgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBydW4gaWYgcnVuX2NyZWF0ZWQgd2FzIG1pc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVaW50OEFycmF5IHZhbHVlcyBzdXJ2aXZlIHRoZSBxdWV1ZSBuYXRpdmVseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChDQk9SIG9uIHdvcmxkLXZlcmNlbCwgSlNPTiByZXZpdmVyIG9uIHdvcmxkLWxvY2FsKS5cbiAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHVyYm8gJiYgcnVuSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYmFja2dyb3VuZCBgcnVuX3N0YXJ0ZWRgIGFuZCBzeW50aGVzaXplIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRpdHkgbG9jYWxseSBzbyByZXBsYXkgY2FuIGJlZ2luIHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcm91bmQtdHJpcC4gU2FmZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbiDigJQgc3RhcnQoKSBjcmVhdGVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBtb21lbnRzIGFnbyBhbmQgbm8gZXZlbnRzIGhhdmUgYmVlbiB3cml0dGVuIHlldC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFycmllciBpcyBjb25zdW1lZCBieSBldmVyeSBkb3duc3RyZWFtIHdyaXRlIChzdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciwgb3B0aW1pc3RpYyBzdGVwX3N0YXJ0ZWQsIHRlcm1pbmFsIHJ1biB3cml0ZXMpIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuY3JlYXRlLnN0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnJ1bl9zdGFydGVkLnNraXBfcHJlbG9hZCc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRlZFByb21pc2UgPSBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGJhY2tncm91bmQgdGhpcyBwdXJlbHkgYXMgYSB3cml0ZSBiYXJyaWVyIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgcmVhZCBpdHMgcHJlbG9hZGVkIGV2ZW50cywgc28gc2tpcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIGV2ZW50LWxvZyBwcmVsb2FkLiBUaGF0IHRyaW1zIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgcmVxdWVzdCB0aGUgY2hhaW5lZCBmaXJzdCBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRzIG9uIOKAlCBzaG9ydGVuaW5nIHRpbWUtdG8tc2Vjb25kLXN0ZXAg4oCUIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhc3RlZCBsaXN0K3Jlc29sdmUgaXQgd291bGQgb3RoZXJ3aXNlIGNvbXB1dGUuXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCwgc2tpcFByZWxvYWQ6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyID0gc3RhcnRlZFByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gYmFja2dyb3VuZHMgcnVuX3N0YXJ0ZWQsIHNvIHRoZSBub24tdHVyYm8gYXNzaWdubWVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93IG5ldmVyIHJ1bnMg4oCUIHRocmVhZCB0aGUgcGVyLXJ1biBldmVudCBjZWlsaW5nIG9mZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcmVzcG9uc2UgaGVyZSBpbnN0ZWFkLiBUaGUgZ3VhcmQgcmUtY2hlY2tzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWF4RXZlbnRzTGltaXQgZXZlcnkgbG9vcCBpdGVyYXRpb24sIHNvIGEgdmFsdWUgdGhhdCBsYW5kc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3J0bHkgYWZ0ZXIgc3RhcnQgc3RpbGwgZW5mb3JjZXMgd2VsbCBiZWZvcmUgYSBydW5hd2F5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGFwcHJvYWNoZXMgdGhlIGNlaWxpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgdm9pZCBzdGFydGVkUHJvbWlzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGltaXQgPSBjbGFtcE1heEV2ZW50cyhyLm1heEV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkKSBtYXhFdmVudHNMaW1pdCA9IGxpbWl0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgYW4gZWFybHkgZmFpbHVyZSBmcm9tIHN1cmZhY2luZyBhcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5oYW5kbGVkUmVqZWN0aW9uOyBydW5SZWFkeUJhcnJpZXIgc3RpbGwgb2JzZXJ2ZXMgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGluaXRpYWwgZXZlbnRzLmxpc3Q6IG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB0b1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2cgeWV0IG9uIGEgZmlyc3QgZGVsaXZlcnkgKHJ1bl9zdGFydGVkIGlzIHN0aWxsIGluXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0KS4gQW4gZW1wdHkgcHJlbG9hZCByb3V0ZXMgaXRlcmF0aW9uIDEgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuby1sb2FkIHByZWxvYWRlZCBicmFuY2g7IGl0ZXJhdGlvbiAyIHRoZW4gdGFrZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcG9zdC1wcmVsb2FkZWQgZnVsbCByZWxvYWQgdG8gcGljayB1cCBhIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgYSBzcHVyaW91cyBcImN1cnNvciBtaXNzaW5nXCIgd2FybmluZy5cbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0LmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXQud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IHJ1bklucHV0LnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXQuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZWQgYXR0cmlidXRlcyBmcm9tIHN0YXJ0KCkgcmlkZSBhbG9uZyBpbiBgcnVuSW5wdXRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhleSBsaXZlIGluIGBydW5fY3JlYXRlZGAncyBldmVudERhdGEsIG5vdCBzZXBhcmF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGF0dHJfc2V0YCBldmVudHMpLCBzbyB0aGUgc3ludGhlc2l6ZWQgc25hcHNob3QgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbSBldmVuIHRob3VnaCB3ZSBza2lwIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0LiBUaGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBjb3JyZWN0IE9OTFkgd2hpbGUgYXR0cmlidXRlcyBhcmUgd3JpdGUtb25seTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIGluLXdvcmtmbG93IHJlYWQgQVBJIHRvZGF5IChzZWUgd29ya2Zsb3cudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwic3RydWN0dXJhbCB1bnRpbCBhIHJlYWQgQVBJIGlzIGludHJvZHVjZWRcIiksIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkgcHJlbG9hZGVkIGxvZyBjYW4ndCBkaXZlcmdlIG9uIGEgcmVhZC4gSWYgYSByZWFkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBUEkgaXMgZXZlciBhZGRlZCBpdCBNVVNUIHJlYWQgZnJvbSB0aGlzIHNuYXBzaG90LCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHJlcGxheWluZyBydW5fY3JlYXRlZC9hdHRyX3NldCBldmVudHMg4oCUIG90aGVyd2lzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVyYm8ncyBlbXB0eSBpbml0aWFsIGxvZyB3b3VsZCBzdXJmYWNlIHNlZWQgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYHt9YCBvbiB0aGUgZmlyc3QgZGVsaXZlcnkgb25seS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bklucHV0LmF0dHJpYnV0ZXMgPz8ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICtub3c7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIHRoZSBgcnVuU3RhcnRlZFJlY2VpdmVkQXRNc2AgZGVjbGFyYXRpb24gYWJvdmU6XG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHVyYm8gc3ludGhlc2l6ZXMgdGhlIHJ1biBiZWZvcmUgdGhlIHJlYWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgIHJlc3BvbnNlIGxhbmRzLCBzbyBhbmNob3IgUlNGUyBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgYW4gYWN0dWFsIHJlc3BvbnNlIGluc3RhbnQuXG4gICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNcyA9ICtub3c7XG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ3J1bm5pbmcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1N0YXJ0ZWRBdCh3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LmFkZEV2ZW50KCd3b3JrZmxvdy5ydW5fc3RhcnRlZC5jcmVhdGUuc3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5ydW5fc3RhcnRlZC5za2lwX3ByZWxvYWQnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQocnVuU3RhcnRlZEV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXQgPSBjbGFtcE1heEV2ZW50cyhyZXN1bHQubWF4RXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcnMgUlNGUyDigJQgc2VlIHRoZSBkZWNsYXJhdGlvbiBhYm92ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmV2ZW50cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFsuLi5yZXN1bHQuZXZlbnRzXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHJlc3VsdC5jdXJzb3IgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSByZXN1bHQuaGFzTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV4dEV2ZW50TG9nTG9hZChsb2FkZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IC4uLmxvYWRlZCwgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArcmVzdWx0LnJ1bi5zdGFydGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJlc3VsdC5ydW4uc3RhdHVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJ1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IGFscmVhZHkgY29tcGxldGVkIG9yIGZhaWxlZCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXN1bHQucnVuLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZm9yIGBjYW5jZWxgLCB3ZSBhY3R1YWxseSB3YW50IHRvIHByb3BhZ2F0ZSBhIFdvcmtmbG93Q2FuY2VsbGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgd29ya2Zsb3cgY29udGV4dCBzbyB0aGUgdXNlciBjYW4gZ3JhY2VmdWxseSBleGl0LiB0aGlzIGlzIFNJR1RFUk1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZnVydGhlcm1vcmUsIHRoZXJlIHNob3VsZCBiZSBhIHRpbWVvdXQgb3IgYSB3YXkgdG8gZm9yY2UgY2FuY2VsIFNJR0tJTExcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBhY3R1YWxseSBleGl0IGhlcmUgd2l0aG91dCByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGF0IGFsbCwgaW4gdGhlIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheWluZyB0aGUgd29ya2Zsb3cgaXMgaXRzZWxmIGZhaWxpbmcuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHdhcyBjb25jdXJyZW50bHkgY29tcGxldGVkL2ZhaWxlZC9jYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvcjogcnVuIHdhcyBjb25jdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkL2ZhaWxlZC9jYW5jZWxsZWQgZHVyaW5nIHNldHVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW5FeHBpcmVkRXJyb3I6IHJ1biBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBib3RoIGNhc2VzLCBza2lwIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHJ1bnRpbWUgZXJyb3IgZHVyaW5nIHdvcmtmbG93IHNldHVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2UgKG5vbi10dXJibyBydW5fc3RhcnRlZClcbiAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmICghd29ya2Zsb3dSdW4pXG4gICAgICAgICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcnVuIG11c3QgYmUgbG9hZGVkIGJlZm9yZSByZXBsYXknXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAvLyBDb3ZlcnMgZXZlcnkgZmxvdyByZXBsYXkg4oCUIGluaXRpYWwgc3RhcnQsIHN0ZXAgY29tcGxldGlvbnMsXG4gICAgICAgICAgICAgICAgICAvLyBob29rIHJlc3VtcHRpb25zLCB3YWl0IGNvbXBsZXRpb25zIOKAlCBhbmQgc3RvcHMgYmVmb3JlIGFueVxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgY29kZSBvciBpbmxpbmUgc3RlcCBleGVjdXRlcyB3aGVuIHRoZSBydW4gaXMgbm90XG4gICAgICAgICAgICAgICAgICAvLyBwaW5uZWQgaGVyZSAoc2VlIGBndWFyZERlcGxveW1lbnRBZmZpbml0eWApLiBUaGlzIHJlbWFpbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBBVVRIT1JJVEFUSVZFIHByb3RlY3Rpb24gYmVmb3JlIHJlcGxheSBhbmQgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uLiBgYXdhaXRSdW5SZWFkeWAgb3JkZXJzIHR1cmJvJ3MgYHJ1bl9zdGFydGVkYFxuICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGVpdGhlciBzdG9wcGluZyBhY3Rpb24uXG4gICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgLy8gTGF6eSBob29rIHJlc3VtZXMgYXJlIGFkZGl0aW9uYWxseSBwcmUtY2hlY2tlZCBhYm92ZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGZhc3QgcGF0aDogYSBuZXcgbWVzc2FnZSdzIGBob29rSW5wdXQuZGVwbG95bWVudElkYCBpc1xuICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZWQgYWdhaW5zdCB0aGUgYW1iaWVudCBkZXBsb3ltZW50IGlkIGZvciBmcmVlLCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYSBkZXRlY3RlZCBtaXNtYXRjaCBmZXRjaGVzIHRoZSBhdXRob3JpdGF0aXZlIHJ1biDigJRcbiAgICAgICAgICAgICAgICAgIC8vIHNvIGEgbWlzcm91dGVkIG1vZGVybiByZXN1bWUgcmUtcm91dGVzIHdpdGggemVybyBldmVudFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzLiBPbGRlciBtZXNzYWdlcyAobm8gYGhvb2tJbnB1dC5kZXBsb3ltZW50SWRgKSByZWFjaFxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGZhc3QgcGF0aCdzIGlkZW1wb3RlbnQgaG9va19yZWNlaXZlZCB3cml0ZSBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gZ3VhcmQ7IHRoYXQgd3JpdGUgY29udmVyZ2VzIHBlciAocnVuSWQsIHJlc3VtZUlkKSBvbiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHBpbm5lZCBkZXBsb3ltZW50LCBzbyBpdCBpcyBzYWZlLCBqdXN0IG5vdCBmcmVlLiBFaXRoZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdheSB0aGUgcmUtcm91dGVkIG1lc3NhZ2UgbXVzdCBjYXJyeSBgaG9va0lucHV0YCwgb3IgYVxuICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHdob3NlIHByb2R1Y2VyIHdyaXRlIGhhZCBub3QgeWV0IGxhbmRlZCB3b3VsZCBiZVxuICAgICAgICAgICAgICAgICAgLy8gbG9zdC5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGd1YXJkRGVwbG95bWVudChcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oaG9va0lucHV0ID8geyBob29rSW5wdXQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdFJ1blJlYWR5XG4gICAgICAgICAgICAgICAgICAgICkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBMYXp5IGhvb2sgcmVzdW1lOiB0aGUgcHJvZHVjZXIgKHJlc3VtZUhvb2sgZmFzdCBwYXRoKVxuICAgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWxpemVkIHRoZSBgaG9va19yZWNlaXZlZGAgd3JpdGUgd2l0aCB0aGlzIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyBwdWJsaXNoLCBzbyB0aGUgZXZlbnQgbWF5IG5vdCBiZSBwZXJzaXN0ZWQgeWV0LiBJZGVtcG90ZW50bHlcbiAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBpdCBiZWZvcmUgcmVwbGF5IOKAlCBrZXllZCBieSBgcmVzdW1lSWRgIHNvIGFcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgcHJvZHVjZXIgd3JpdGUgY29udmVyZ2VzIG9uIGV4YWN0bHkgb25lIGV2ZW50XG4gICAgICAgICAgICAgICAgICAvLyAodGhlIHNlcnZlciByZXNvbHZlcyBhIG1hdGNoaW5nIGNsYWltIGFzIHN1Y2Nlc3MsIG5vdCBhblxuICAgICAgICAgICAgICAgICAgLy8gZXJyb3IpLiBgaG9va0lucHV0YCBuZXZlciByaWRlcyBhIHR1cmJvIGZpcnN0LWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyAodGhhdCBwYXRoIGNhcnJpZXMgYHJ1bklucHV0YCwgbm90IGBob29rSW5wdXRgKSwgc28gdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gb25seSBydW5zIG9uIHRoZSBub3JtYWwgbG9hZC1hbmQtcmVwbGF5IHBhdGguIFNraXBwZWRcbiAgICAgICAgICAgICAgICAgIC8vIGVudGlyZWx5IHdoZW4gdGhlIGZhc3QgcGF0aCBhYm92ZSBhbHJlYWR5IGVuc3VyZWQgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBldmVudCAoYGhvb2tFbnN1cmVkYCkg4oCUIHN1Y2Nlc3NmdWxseSBvciB2aWEgaXRzIGZhbGxiYWNrLFxuICAgICAgICAgICAgICAgICAgLy8gd2hvc2UgcnVuX3N0YXJ0ZWQgcHJlbG9hZCB3YXMgbG9hZGVkIGFmdGVyIHRoZSB3cml0ZSBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgZXZlbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoaG9va0lucHV0ICYmICFob29rRW5zdXJlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQZXJmIChPcHRpb24gQSk6IGlmIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGFscmVhZHkgbGFuZGVkIGluIHRoZSBydW5fc3RhcnRlZCBwcmVsb2FkLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2Fub25pY2FsIGV2ZW50IGlzIGluIHRoZSBsb2cgYW5kIHRoZSByZS1lbnN1cmUgcm91bmQgdHJpcFxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBwdXJlIG92ZXJoZWFkLiBTa2lwIGl0IHdoZW4gdGhlIHByZWxvYWQgYWxyZWFkeSBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgYGhvb2tfcmVjZWl2ZWRgIHdpdGggdGhpcyByZXN1bWUncyBwZXJzaXN0ZWQgYHJlc3VtZUlkYFxuICAgICAgICAgICAgICAgICAgICAvLyAodW5pcXVlIHBlciByZXN1bWUsIHNvIHdlIG5ldmVyIHNraXAgb24gYW4gdW5yZWxhdGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQpLiBCZXN0LWVmZm9ydDogdGhlIHdpbiBsYW5kcyBvbmx5IHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VyJ3Mgd3JpdGUgYmVhdCB0aGlzIGNvbnN1bWVyJ3MgbG9hZDsgb3RoZXJ3aXNlIHdlXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgaWRlbXBvdGVudCByZS1lbnN1cmUgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgdW5yZWFjaGFibGUgZm9yIGF0b21pYyBsYXp5IHJlc3VtZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gKHJlc3VtZUlkICsgZGlnZXN0KTogdGhvc2Ugc2V0IGBob29rRW5zdXJlZGAgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvaXN0ZWQgZmFzdCBwYXRoIGFib3ZlIOKAlCBvbiBzdWNjZXNzIEFORCBvbiBpdHNcbiAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sg4oCUIHNvIHRoaXMgYmxvY2sgKGFuZCB0aGUgc2tpcCBjaGVjaykgbm93IG9ubHlcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVzIGhvb2tJbnB1dCBzaGFwZXMgd2l0aG91dCB0aGUgZnVsbCBpZGVtcG90ZW5jeVxuICAgICAgICAgICAgICAgICAgICAvLyBwYWlyLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbHJlYWR5UHJlbG9hZGVkID1cbiAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJyAmJlxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnaG9va19yZWNlaXZlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZXN1bWVJZCA9PT0gaG9va0lucHV0LnJlc3VtZUlkXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFscmVhZHlQcmVsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVudCBhbHJlYWR5IHZpc2libGUgaW4gdGhlIHByZWxvYWRlZCBsb2cg4oCUIG5vdGhpbmcgdG9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgb3Igc3BsaWNlLlxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGUgdGhlIG1hdGVyaWFsaXplZCBldmVudCB0byB3aGVuIHRoZSByZXN1bWUgYWN0dWFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvY2N1cnJlZCwgbm90IHdoZW4gdGhpcyBxdWV1ZSBkZWxpdmVyeSByYW4uIGByZXN1bWVJZGBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGUgVUxJRCBtaW50ZWQgYnkgYHJlc3VtZUhvb2soKWAgYXQgcmVzdW1lIHRpbWUsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIGVtYmVkZGVkIHRpbWVzdGFtcCBpcyB0aGUgaG9uZXN0IGBvY2N1cnJlZEF0YCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyBsYXRlbmN5IGF0dHJpYnV0aW9uIG9mZiB0aGUgcXVldWUgcm91bmQgdHJpcC4gQVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1VTElEIHJlc3VtZUlkIChsZWdhY3kgLyB0ZXN0KSBzaW1wbHkgbGVhdmVzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkLCBzbyB0aGUgV29ybGQgZmFsbHMgYmFjayB0byBgY3JlYXRlZEF0YC5cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgb2NjdXJyZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tJbnB1dC5yZXN1bWVJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShkZWNvZGVUaW1lKGhvb2tJbnB1dC5yZXN1bWVJZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5zdXJlZEV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5zdXJlZCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2tJbnB1dC5ob29rSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogaG9va0lucHV0LnRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogaG9va0lucHV0LnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUlkOiBob29rSW5wdXQucmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lUGF5bG9hZERpZ2VzdDogaG9va0lucHV0LnBheWxvYWREaWdlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lci1zaWRlIGNvbXBsZXRpb24gb2YgdGhlIHJlY292ZXJ5IHBhdGg6IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBtYXRlcmlhbGl6ZWQgdGhlIGV2ZW50IGJlY2F1c2UgdGhlIHByb2R1Y2VyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdCB3cml0ZSBoYWQgbm90IGxhbmRlZCBpbiB0aGUgcHJlbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5Ib29rUmVzaWxpZW50UmVzdW1lTWF0ZXJpYWxpemVkKHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhbm9uaWNhbCBldmVudCDigJQgd2hldGhlciB0aGlzIGNhbGwgY29tbWl0dGVkIGl0IG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJnZWQgb24gdGhlIHByb2R1Y2VyJ3MgY29uY3VycmVudCB3cml0ZSDigJQgc28gd2UgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW50byB0aGUgcHJlbG9hZGVkIGxvZyBpbnN0ZWFkIG9mIGRpc2NhcmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcmVsb2FkIChzZWUgYmVsb3cpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlY29uc3RydWN0IGBldmVudERhdGFgIGZyb20gYGhvb2tJbnB1dGAgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydXN0aW5nIHRoZSBQT1NUIHJlc3BvbnNlJ3MgcGF5bG9hZDogd29ybGQtdmVyY2VsIHBvc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBob29rX3JlY2VpdmVkIHdpdGggYHJlbW90ZVJlZkJlaGF2aW9yOiAnbGF6eSdgLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGV2ZW50J3MgcGF5bG9hZCBpcyBhIFJlbW90ZVJlZiAqZGVzY3JpcHRvciosIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlcmlhbGl6ZWQgYnl0ZXMgcmVwbGF5IG5lZWRzLiBgaG9va0lucHV0YCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVhbCB0b2tlbiArIHBheWxvYWQgYnl0ZXMgKHRoZXkgcm9kZSB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UpLCBzbyBzcGxpY2UgdGhvc2Ugb250byB0aGUgcmV0dXJuZWQgZXZlbnQnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhYmxlIGV2ZW50SWQvbWV0YWRhdGEuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmUtZW5zdXJlIGFsd2F5cyByZXR1cm5zIGEgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50LCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNwbGljZSBpcyBzYWZlLiBUaGUgY2FzdCBpcyBuZWVkZWQgYmVjYXVzZSBzcHJlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByYXcgYEV2ZW50YCB1bmlvbiBhbmQgb3ZlcnJpZGluZyBgZXZlbnREYXRhYCBjb2xsYXBzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGEgbm9uLWBob29rX3JlY2VpdmVkYCBtZW1iZXIgKHdob3NlIGBldmVudERhdGFgIGlzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBzaGFwZSk7IHRoZSBvYmplY3QgaXMgYSBnZW51aW5lIGBob29rX3JlY2VpdmVkYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgYnkgY29uc3RydWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IGVuc3VyZWQuZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVkRXZlbnQgPSBiYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGhvb2tJbnB1dC50b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogaG9va0lucHV0LnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgRXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBtYXRjaGluZyBjb25jdXJyZW50IGNsYWltIChzYW1lIHJlc3VtZUlkICsgZGlnZXN0KSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x2ZWQgYXMgc3VjY2VzcyBzZXJ2ZXItc2lkZSBhbmQgbmV2ZXIgdGhyb3dzLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55dGhpbmcgY2F1Z2h0IGhlcmUgaXMgYSBnZW51aW5lIHRlcm1pbmFsIG9yIHRyYW5zaWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uZGl0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gSG9va05vdEZvdW5kIC8gUnVuRXhwaXJlZDogdGhlIHByb2R1Y2VyJ3MgZGlyZWN0IHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGFscmVhZHkgZW5kZWQgdGhpcyByZXN1bWUncyBlbGlnaWJpbGl0eSAodGhlIHJ1biB3ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHRlcm1pbmFsKS4gVGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIHJlc3VtZSwgc28gY29uc3VtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgbWVzc2FnZSBhbmQgc3RvcC4gQ29udGludWluZyB0byByZXBsYXkgd291bGQgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgd2FzdGVkIHdvcmsg4oCUIGFuZCwgd29yc2UsIHdvdWxkIGFjayBhIGRlbGl2ZXJ5IHRoYXQgbWF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNhcnJ5IHRoZSBvbmx5IGNvcHkgb2YgdGhlIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEVudGl0eUNvbmZsaWN0IChhbmQgYW55IG90aGVyIHVuZXhwZWN0ZWQgZXJyb3IpOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgcmVzdW1lSWQgY29uc3RyYWludCBleGlzdHMgYnV0IHRoZSBtYXRjaGluZyBldmVudCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBub3QgeWV0IG9ic2VydmFibGUg4oCUIHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsIHdyaXRlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN0aWxsIGluIGZsaWdodCwgb3IgYSByZWRyaXZlIHJhY2VkIHRoZSBjbGFpbS4gVGhpcyBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0cmFuc2llbnQ6IHJldGhyb3cgc28gdGhlIHF1ZXVlIHJlZGVsaXZlcnMgYW5kIGEgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgYXR0ZW1wdCBjb252ZXJnZXMgb24gdGhlIGNvbW1pdHRlZCBldmVudCBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJlcGxheWluZyAoYW5kIGFja2luZykgd2l0aG91dCB0aGUgcGF5bG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJ1bl9zdGFydGVkIHJlc3BvbnNlIHByZWxvYWRlZCB0aGUgbG9nIEJFRk9SRSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlLCBzbyBpdCBjYW5ub3QgaW5jbHVkZSB0aGUgaG9va19yZWNlaXZlZC4gUmF0aGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiBkaXNjYXJkIHRoZSBwcmVsb2FkICh3aGljaCB3b3VsZCBjb3N0IGEgZnJlc2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCByb3VuZCB0cmlwIG9uIHRoZSBmaXJzdCByZXBsYXkgaXRlcmF0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaW4gdGhlIGNhbm9uaWNhbCBldmVudCByZWNvbnN0cnVjdGVkIGFib3ZlLiBJdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZXMgYSBzdGFibGUgZXZlbnRJZCwgc28gYGluc2VydEV2ZW50QnlFdmVudElkYCBrZWVwc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGluIGFzY2VuZGluZyBldmVudElkIG9yZGVyIGFuZCBpcyBpZGVtcG90ZW50IGlmIGEgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IHJlLW9ic2VydmVzIGl0LiBPbmx5IHdoZW4gdGhlIFdvcmxkIHJldHVybnMgbm8gZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkbyB3ZSBmYWxsIGJhY2sgdG8gcmVsb2FkaW5nIHRoZSBjb21wbGV0ZSBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJyAmJiBlbnN1cmVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEV2ZW50QnlFdmVudElkKGV2ZW50TG9nLmV2ZW50cywgZW5zdXJlZEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IHR5cGU6ICdsb2FkQWxsJyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgZWxzZSAocmUtZW5zdXJlIG5lZWRlZClcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgcnVuJ3MgZGVwbG95bWVudC5cbiAgICAgICAgICAgICAgICAgIC8vIFVzZWQgZWFnZXJseSBoZXJlIHNpbmNlIGJvdGggd29ya2Zsb3cgZXhlY3V0aW9uIChpbnB1dFxuICAgICAgICAgICAgICAgICAgLy8gaHlkcmF0aW9uIC8gaG9vayBwYXlsb2FkIGRlY3J5cHRpb24pIGFuZCB0aGUgcnVuX2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgLy8gZGVoeWRyYXRlIHBhdGggYmVsb3cgbmVlZCBpdC4gTWVtb2l6ZWQgYWNjZXNzb3I6IGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBjYWxsIHRyaWdnZXJzIHRoZSBhY3R1YWwgZmV0Y2ggLyBIS0RGIGRlcml2YXRpb24sXG4gICAgICAgICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGNhbGxzIGF3YWl0IHRoZSBjYWNoZWQgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKTtcblxuICAgICAgICAgICAgICAgICAgLy8gSW52b2NhdGlvbi1zY29wZWQgY2FjaGUgb2YgVk0taW5kZXBlbmRlbnQgcHJlcGFyZWQgcGF5bG9hZHNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBpbW11dGFibGUgZmluYWwgdmFsdWVzLiBJdCBzdXJ2aXZlcyB0aGUgZnJlc2ggd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgIC8vIFZNIGNyZWF0ZWQgYnkgZWFjaCBpbmxpbmUgcmVwbGF5LCBidXQgbmV2ZXIgY3Jvc3NlcyBydW5zIG9yXG4gICAgICAgICAgICAgICAgICAvLyBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UGF5bG9hZENhY2hlID0gbmV3IFJlcGxheVBheWxvYWRDYWNoZShcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpdmUgVk0gcGFya2VkIGF0IHRoZSBwcmV2aW91cyBib3VuZGFyeSwgd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHJldGVudGlvbiBkZWNpc2lvbiBrZXB0IGl0LiBudWxsIOKGkiB0aGlzIGl0ZXJhdGlvbiBjb2xkLVxuICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5cy4gSW52b2NhdGlvbi1zY29wZWQ6IGRpZXMgd2l0aCB0aGlzIGRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgbGV0IHJldGFpbmVkU2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIE1haW4gcmVwbGF5IGxvb3BcbiAgICAgICAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL25vQ29uc3RhbnRDb25kaXRpb246IGludGVudGlvbmFsIGxvb3BcbiAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24rKztcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYXktYnVkZ2V0IGNoZWNrOiBiYWlsIG91dCAocmV0cnkgb3IgZmFpbCkgaWZcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN0ZXAgdGltZSB3aXRoaW4gdGhpcyBpbnZvY2F0aW9uIGhhcyBleGNlZWRlZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uZmlndXJlZCBidWRnZXQuIFN0ZXAgYm9kaWVzIGFyZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHJlcGxheUJ1ZGdldC5wYXVzZSgpL3Jlc3VtZSgpIGJyYWNrZXQgZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gYGV4ZWN1dGVTdGVwYCBjYWxsLlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGF5QnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRNczogcmVwbGF5QnVkZ2V0LmNvbmZpZ3VyZWRMaW1pdE1zLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdGhlIHRlcm1pbmFsIGF0dGVtcHQgcmV0dXJucywgYWZ0ZXIgcnVuX2ZhaWxlZCBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmFibGUuIEVhcmxpZXIgYXR0ZW1wdHMgcmVqZWN0IGZvciBxdWV1ZSByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRpbWVvdXQgYmVmb3JlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGludm9jYXRpb25TdGFydFRpbWUgPj1cbiAgICAgICAgICAgICAgICAgICAgICBub0lubGluZVJlcGxheUFmdGVyTXNcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1YyIHRpbWVvdXQgcmVhY2hlZCwgcmUtc2NoZWR1bGluZyB3b3JrZmxvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBpbnZvY2F0aW9uU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5U3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIC0tLSBRdWlja0pTIFZNIGVuZ2luZSBkaXNwYXRjaCAtLS1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgUXVpY2tKUyBlbmdpbmUgKG9wdC1pbiB2aWEgV09SS0ZMT1dfVk09cXVpY2tqc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGV4ZWN1dGlvbkNvbnRleHQud29ya2Zsb3dWbSkgaXMgYSBzZWxmLWNvbnRhaW5lZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFsdGVybmF0aXZlIHRvIHRoZSBub2RlOnZtIGlubGluZS1yZXBsYXkgbG9naWNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdy4gSXQgcGVyZm9ybXMgdGhlIHNhbWUgZnVsbCBldmVudCByZXBsYXksIGJ1dFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgdGhlIHdvcmtmbG93IGNvZGUgaW4gYSBRdWlja0pTIFdBU00gVk0sIHF1ZXVlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzIHZpYSB0aGUgc2FtZSBjb21iaW5lZCByb3V0ZSAoc28gdGhleSBoaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlU3RlcCBiZWxvdyBvbiByZS1lbnRyeSksIGFuZCBtYW5hZ2VzIGl0cyBvd25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fY29tcGxldGVkIC8gcnVuX2ZhaWxlZCBsaWZlY3ljbGUgZm9yIHdvcmtmbG93XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3V0Y29tZXMuIFdoZW4gdGhlIFF1aWNrSlMgZW5naW5lIGlzIGluIGVmZmVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIgZGlzcGF0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgSU5TSURFIHRoaXMgdHJ5OiBlbmdpbmUgZmFpbHVyZXMgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGVzY2FwZSB0aGUgZW50cnlwb2ludCAoTWF4RXZlbnRzRXhjZWVkZWRFcnJvciwgYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFdBU00gT09NIGF0IHRoZSBtZW1vcnkgY2VpbGluZywgYSBidW5kbGUtZXZhbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUpIG11c3QgcmVhY2ggdGhpcyBsb29wJ3MgY2F0Y2ggc28gdGhleSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzc2lmaWVkIGFuZCByZWNvcmRlZCBhcyBydW5fZmFpbGVkIOKAlCBvdXRzaWRlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0aGV5IHdvdWxkIG5hY2sgdGhlIG1lc3NhZ2UgYW5kIGJ1cm4gYWxsIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyaWVzIGJlZm9yZSBkeWluZyBhc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE1BWF9ERUxJVkVSSUVTX0VYQ0VFREVELiBUcmFuc2llbnQgd29ybGQgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgcmV0aHJvdyBvdXQgb2YgdGhlIGNhdGNoIGZvciByZWRlbGl2ZXJ5LCBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXMgbm9kZS1lbmdpbmUgcmVwbGF5IGZhaWx1cmVzLlxuICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VRdWlja0pTVm0od29ya2Zsb3dSdW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdVc2luZyBRdWlja0pTIFZNIGVuZ2luZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuZGVyIHR1cmJvLCBydW5fc3RhcnRlZCBpcyBiYWNrZ3JvdW5kZWQuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUXVpY2tKUyBlbnRyeXBvaW50IGZldGNoZXMgdGhlIGV2ZW50IGxvZyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcyBldmVudHMgZGlyZWN0bHksIHNvIHdhaXQgZm9yIHRoZSBydW4gdG8gYmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmFibHkgc3RhcnRlZCBmaXJzdCDigJQgaXQgZG9lcyBub3QgdGhyZWFkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVyYm8gcnVuUmVhZHlCYXJyaWVyIHRoZSB3YXkgaGFuZGxlU3VzcGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExvZy50eXBlID09PSAnbG9hZEFmdGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQsIGV2ZW50TG9nLmN1cnNvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXp5IGltcG9ydDogdGhlIFF1aWNrSlMgZW50cnlwb2ludCdzIGltcG9ydCBjaGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1iZWRzIHRoZSBiYXNlNjQgV0FTTSBiaW5hcnkgKyBleHRlbnNpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAofjEuMyBNQiBkZWNvZGVkIGF0IG1vZHVsZSBzY29wZSkuIExvYWRpbmcgaXQgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgdGhhdCBvdXQgb2Ygbm9kZS1lbmdpbmUgZGVwbG95bWVudHMgZW50aXJlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOKAlCBvbmx5IHRoZSBvcHQtaW4gcGF0aCBwYXlzLCBvbiBmaXJzdCBkaXNwYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnLi9ydW50aW1lL3F1aWNranMtZW50cnlwb2ludC5qcydcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWlja2pzUmVzdWx0ID0gYXdhaXQgcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGU6IGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRTcGFuOiBzcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtc3RlcCBvd25lcnNoaXAgcGx1bWJpbmc6IHJlZGVsaXZlcmllcyBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1lc3NhZ2UgZHJpdmUgY3Jhc2ggcmVjb3ZlcnkgZm9yIHN0ZXBzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhcmxpZXIgaW52b2NhdGlvbiBjbGFpbWVkIGlubGluZSAoc2VlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrc3RvcCBwYXNzIGluIHRoZSBlbnRyeXBvaW50J3MgbG9vcCksIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWVzc2FnZSBpZCBpcyBzdGFtcGVkIGFzIGBvd25lck1lc3NhZ2VJZGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5saW5lIGxhenkgc3RlcCBjbGFpbXMgc28gd2FrZSByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVyIHRvIHRoZSBpbi1mbGlnaHQgYm9keSBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVldWVpbmcgdGhlIHN0ZXAuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQ6IG1ldGFkYXRhLm1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1aWNranNSZXN1bHQ/LnRpbWVvdXRTZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGByZWludm9rZWAgcmF0aGVyIHRoYW4gcmV0dXJuaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB7IHRpbWVvdXRTZWNvbmRzIH1gIGRpcmVjdGx5OiB1bmRlciB0dXJibyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0YCBhbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNjaGVkdWxlIHdvdWxkIHJlLWVuZ2FnZSB0dXJibyBvbiByZWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChyZXBsYXlpbmcgYWdhaW5zdCBhIHN0YWxlIHByZWxvYWRlZCBsb2cgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlZGdpbmcgdGhlIHJ1biDigJQgc2VlIHRoZSByZWludm9rZSgpIGRvY3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdmUpLiByZWludm9rZSBlbnF1ZXVlcyBhbiBleHBsaWNpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gd2l0aG91dCBgcnVuSW5wdXRgIGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKHF1aWNranNSZXN1bHQudGltZW91dFNlY29uZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExvZy50eXBlICE9PSAncmVhZHknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSA9PT0gJ2xvYWRBZnRlcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGV2ZW50TG9nLmN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgLi4ucGFnZSwgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICByZXBvcnRQcmVjb25kaXRpb25SZXN0YXJ0UmVsb2FkKGV2ZW50TG9nLmV2ZW50cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlY3QgY29uY3VycmVudCBjb21wbGV0aW9uIHZpYSB0aGUgZXZlbnQgbG9nOiBpZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBvdGhlciBoYW5kbGVyIHdyb3RlIGEgdGVybWluYWwgcnVuIGV2ZW50LCBleGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGRvaW5nIHJlcGxheSB3b3JrLiBUaGUgcnVuIGVudGl0eSdzIHN0YXR1cyBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcml2ZWQgZnJvbSB0aGVzZSBldmVudHMsIHNvIGNoZWNraW5nIHRoZSBsb2cgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmVzIHVzIHRoZSBzYW1lIHNpZ25hbCBhcyBhIHJ1bnMuZ2V0KCkgcm91bmQtdHJpcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhlIGV4dHJhIHJlcXVlc3QgcGVyIGxvb3AgaXRlcmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRMb2cuZXZlbnRzLCBydW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wbGV0ZSBlbGFwc2VkIHdhaXRzXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FpdHNUb0NvbXBsZXRlID0gZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApOiBlIGlzIEV4dHJhY3Q8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBldmVudFR5cGU6ICd3YWl0X2NyZWF0ZWQnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPiAmIHsgY29ycmVsYXRpb25JZDogc3RyaW5nIH0gPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNvcnJlbGF0aW9uSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhlLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93ID49IChlLmV2ZW50RGF0YS5yZXN1bWVBdCBhcyBEYXRlKS5nZXRUaW1lKClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY29tcGxldGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBlLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUF0OiBlLmV2ZW50RGF0YS5yZXN1bWVBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgd2FpdEV2ZW50IG9mIHdhaXRzVG9Db21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGNyZWF0ZUV2ZW50KHdhaXRFdmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5wcmVjb25kaXRpb25TbmFwc2hvdFBhcmFtcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdW1wLWFuZC1yZXBvcnQ6IGZvbGQgd2hhdCB0aGlzIHdyaXRlIHNraXBwZWQgb3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIHRoZSBzbmFwc2hvdCB0aGUgcmVtYWluaW5nIHdhaXRzIGFyZSBndWFyZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFnYWluc3QsIHNvIGVhY2ggYXNrcyBmb3IgYSBzbG90IGFib3ZlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGEgY29tcGxldGUgYW5zd2VyLiBgaGFzTW9yZWAgbWVhbnMgdGhlIFdvcmxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIHBhcnQgb2Ygd2hhdCBpdCB3YXMgYXNrZWQgZm9yLCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc3NpbmctY29tcGxldGlvbiBjaGVjayBiZWxvdyBpcyB3aGF0IGRlY2lkZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hldGhlciB0aGlzIGhhbmRsZXIgc3RpbGwgaGFzIHRvIGZldGNoLiBGb2xkaW5nIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcGFydGlhbCBwYWdlIHdvdWxkIG1ha2UgdGhlIGxvZyBsb29rIGxpa2UgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9sZHMgdGhlIGNvbXBsZXRpb24gd2hlbiB0aGUgcmVzdCBvZiB0aGUgcGFnZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCB1bnJlYWQsIHNvIHRoZSBmZXRjaCB3b3VsZCBiZSBza2lwcGVkIG9uIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc25hcHNob3QgdGhhdCBpcyBzaG9ydCBvZiB0aGUgV29ybGQncy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQuZXZlbnRzPy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkLmhhc01vcmUgIT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VSZXBvcnRlZEV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV2FpdCBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCBsaXN0IGFib3ZlIG1heSBiZSBzdGFsZSBieSB0aGUgdGltZSBhblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGVsYXBzZWQgd2FpdCBpcyBjb21taXR0ZWQsIGFuZCB0aGlzIHJlcGxheSBoYXMgdG8gc2VlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIG93biB3YWl0X2NvbXBsZXRlZCBiZWZvcmUgaXQgY2FuIGFkdmFuY2UgcGFzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzbGVlcC4gRWFjaCB3cml0ZSBhc2tlZCB0aGUgV29ybGQgZm9yIHRoZSBkZWx0YSBzaW5jZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG91ciBjdXJzb3IgYW5kIGZvbGRlZCBpdCBpbiAoc2VlIGNyZWF0ZUV2ZW50KSwgc28gYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmcgV29ybGQgaGFzIGFscmVhZHkgaGFuZGVkIHRob3NlIGV2ZW50cyBiYWNrXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBkby4gT25seSBmZXRjaCBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGlvbnMgc3RpbGwgbWlzc2luZyBsb2NhbGx5OiBhIFdvcmxkIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVzIGBzaW5jZUN1cnNvcmAsIGEgdHJ1bmNhdGVkIGRlbHRhLCBhIGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhYnNvcmIgdGhhdCBsb3N0IHRoZSBjdXJzb3IgcmFjZSwgb3IgYW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yLCB3aG9zZSByZWplY3Rpb24gY2FycmllcyBubyBkZWx0YS5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJXcml0ZXMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtaXNzaW5nV2FpdENvbXBsZXRpb25zID0gd2FpdHNUb0NvbXBsZXRlLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICFjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJXcml0ZXMuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRFdmVudC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG1pc3NpbmdXYWl0Q29tcGxldGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBvbmx5IGV2ZW50cyBhZnRlciB0aGUgb3JpZ2luYWwgc25hcHNob3QgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBjb25jdXJyZW50IGR1cmFibGUgZXZlbnRzLCBzdWNoIGFzIGhvb2tfcmVjZWl2ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZWlyIG9yZGVyaW5nIHJlbGF0aXZlIHRvIHdhaXRfY29tcGxldGVkLiBGYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIGEgZnVsbCByZWxvYWQgZm9yIG9sZGVyIHdvcmxkcyB0aGF0IGNhbm5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSB1cyBhIHN0YWJsZSBjdXJzb3IsIG9yIGlmIHRoZSBjdXJzb3IgZGVsdGEgZG9lc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGluY2x1ZGUgdGhlIHdhaXQgY29tcGxldGlvbiB0aGlzIGhhbmRsZXIganVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLmN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F3QWxsV2FpdENvbXBsZXRpb25zID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nV2FpdENvbXBsZXRpb25zLmV2ZXJ5KCh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RXZlbnQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhd0FsbFdhaXRDb21wbGV0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSByZXBsYXkgcmVhZHMgdGhlIGxvZyBhcyB0aGUgY29tcGxldGUgcmVjb3JkIG9mIHdoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYXMgaGFwcGVuZWQsIHNvIGEgcG9zaXRpb24gbm90aGluZyBvY2N1cGllcyBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gZXZlbnQgdGhhdCBuZXZlciBvY2N1cnJlZCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYnJhbmNoIGl0IHdvdWxkIGhhdmUgZGVjaWRlZCBnZXRzIGRlY2lkZWQgdGhlIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2F5LiBGYWlsaW5nIGhlcmUgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHJ1biB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0cyBpdHMgb3duIGNvcnJ1cHRpb24gYW5kIG9uZSB0aGF0IHNpbGVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgd3JvbmcgYW5zd2VyLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSBob2xlIHRoYXQgaXMgbWVyZWx5IGEgd3JpdGUgbWlkLWNvbW1pdCBmaWxscyBpbiBvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBvd24sIHNvIHNldHRsZUV2ZW50U2xvdEdhcCByZS1yZWFkcyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jbHVkaW5nLCBhbmQgYWRvcHRzIHdoaWNoZXZlciBsb2cgaXQgc2V0dGxlZCBvbi5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTbG90R2FwQ2hlY2tFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBzZXR0bGVFdmVudFNsb3RHYXAocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudExvZy5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogZXZlbnRMb2cuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgLi4uc2V0dGxlZC5sb2csIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0bGVkLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRFdmVudExvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFdmVudCBsb2cgZm9yIHJ1biAke3J1bklkfSBoYXMgYSBob2xlIGF0IHNsb3QgJHtzZXR0bGVkLmdhcC5maXJzdE1pc3NpbmdTbG90fTogJHtzZXR0bGVkLmdhcC5taXNzaW5nQ291bnR9IG9mIHRoZSAke3NldHRsZWQuZ2FwLm1heFNsb3R9IHNsb3RzIHVwIHRvIHRoZSBsb2cncyBtYXhpbXVtIGhvbGQgbm8gZXZlbnQuYFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRpbmcgZWxhcHNlZCB3YWl0cyByZWZyZXNoZXMgdGhlIGV2ZW50IHNuYXBzaG90LlxuICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29uY3VycmVudCBoYW5kbGVyIG1heSBoYXZlIHdyaXR0ZW4gdGhlIHRlcm1pbmFsIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGFmdGVyIHRoZSBpbml0aWFsIHNuYXBzaG90IGJ1dCBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheS4gT25jZSB0aGUgZXZlbnQgbG9nIHJlY29yZHMgdGhhdCBvdXRjb21lLCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgaXMgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50TG9nLmV2ZW50cywgcnVuSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQtbGltaXQgZ3VhcmQ6IGZhaWwgYSBydW5hd2F5IHJ1biBvbmNlIGl0cyBsb2dcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWFjaGVzIHRoZSBzZXJ2ZXItc3VwcGxpZWQgY2VpbGluZyAodW5kZWZpbmVkIOKHkiBub1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZm9yY2VtZW50KS4gVGhlIHRocm93IGlzIGNhdWdodCBiZWxvdyBhbmQgd3JpdHRlbiBhc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9mYWlsZWQgLyBNQVhfRVZFTlRTX0VYQ0VFREVELlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50cy5sZW5ndGggPj0gbWF4RXZlbnRzTGltaXRcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXhFdmVudHNFeGNlZWRlZEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeToganVkZ2UgVFRGUyBlbGlnaWJpbGl0eSBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24ncyBmaXJzdCBzbmFwc2hvdC4gV2FpdHMgY29tcGxldGVkIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYWxyZWFkeSBkaXNxdWFsaWZ5IHZpYSB0aGUgZXZlbnQtdHlwZSBjaGVjaywgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmFsdWF0aW5nIGFmdGVyIHRoZSB3YWl0IHBhc3MgaXMgZXF1aXZhbGVudC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyX3NldCBpcyBwZXJtaXR0ZWQ6IGEgcmVkZWxpdmVyeSBjYW4gbGFuZCBhZnRlciBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWl0dGVkIHByZS1zdGVwIGF0dHJfc2V0LCBhbmQgdGhlIGRldG91ciBpdCBtYXJrc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN1YnRyYWN0ZWQgdmlhIHByZVN0ZXBBdHRyU3RhcnRNcyByZWdhcmRsZXNzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaW52b2NhdGlvbiB3cm90ZSBpdCAoc2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzKS5cbiAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuID8/PSBldmVudExvZy5ldmVudHMuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCdcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgd29ya2Zsb3cgZXhlY3V0aW9uJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudDogZXZlbnRMb2cuZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1vZGU6IHJldGFpbmVkU2Vzc2lvbiA/ICdyZXRhaW5lZCcgOiAncmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgZXZlcnkgbWlzc2luZyBkZWNyeXB0L2RlY29tcHJlc3Mgb3BlcmF0aW9uIHVwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbnQgKGFscmVhZHktcHJlcGFyZWQgcGF5bG9hZHMgYXJlIHNraXBwZWQpLiBXZWJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBDcnlwdG8gd29yayBvdmVybGFwcyBWTSBzZXR1cCBvbiB0aGUgcmVwbGF5IHBhdGggYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFwcGVuZGVkIGV2ZW50cycgY29uc3VtcHRpb24gb24gdGhlIHJlc3VtZSBwYXRoO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWVycyBzdGlsbCBkZXNlcmlhbGl6ZSBhbmQgcmVzb2x2ZSBpbiBldmVudCBvcmRlci5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkUHJld2FybSA9IHJlcGxheVBheWxvYWRDYWNoZS5wcmV3YXJtKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1Jlc3VsdDogV29ya2Zsb3dSZXN1bWVSZXN1bHQgPSByZXRhaW5lZFNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gYXdhaXQgcmVzdW1lV29ya2Zsb3cocmV0YWluZWRTZXNzaW9uLCBldmVudExvZy5ldmVudHMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgdHlwZTogJ3JlcGxheScgfTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd1Jlc3VsdC50eXBlID09PSAncmVwbGF5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UmVzdWx0ID0gYXdhaXQgcmVwbGF5V29ya2Zsb3coe1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IGV2ZW50TG9nLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UGF5bG9hZENhY2hlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogdGhlIGVuZC1vZi1ydW4gZHJhaW4gaW5zaWRlIHdvcmtmbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbiBjb21taXRzIGZpcmUtYW5kLWZvcmdldCBgKl9jcmVhdGVkYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgYmVmb3JlIHRoZSB0ZXJtaW5hbCBgYXdhaXRSdW5SZWFkeSgpYCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENhcGFiaWxpdGllczogd29ybGQuY2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHBheWxvYWRQcmV3YXJtO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93UmVzdWx0LnR5cGUgPT09ICdzdXNwZW5kZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJrIHRoZSBsaXZlIHNlc3Npb247IHRoZSBzdXNwZW5zaW9uIGNhdGNoIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlcyB0aGUgb25lIHJldGVudGlvbiBkZWNpc2lvbiDigJQga2VlcCBpdCBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGl0ZXJhdGlvbiBvciBkaXNjYXJkIGl0IGZvciBhIGZyZXNoIHJlcGxheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IHdvcmtmbG93UmVzdWx0LnNlc3Npb247XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB3b3JrZmxvd1Jlc3VsdC5zdXNwZW5zaW9uO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHdvcmtmbG93UmVzdWx0Lm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyBleGVjdXRpb24gY29tcGxldGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IERhdGUubm93KCkgLSByZXBsYXlTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1vZGU6IHJldGFpbmVkU2Vzc2lvbiA/ICdyZXRhaW5lZCcgOiAncmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmFjdGl2YXRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JrZmxvdyBjb21wbGV0ZWQuIFNlbmQgdGhlIHNuYXBzaG90IGJ1dCBkbyBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvYWQtYW5kLXJldHJ5IHRoZSBjcmVhdGUgaW4gcGxhY2U6IGByZXN1bHRgIHdhc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVkIGJ5IHRoaXMgcmVwbGF5LCBzbyBhIHN0YWxlICg0MTIpIHJlamVjdGlvbiBtdXN0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgYSAqZnJlc2ggcmVwbGF5KiAod2hpY2ggbWF5IG9ic2VydmUgdGhlIG5ldyBldmVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcm9kdWNlIGEgZGlmZmVyZW50IHJlc3VsdCksIG5vdCByZS1jb21taXQgdGhlIHN0YWxlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0LiBUaGUgY2F0Y2ggYmVsb3cgcmVzdGFydHMgdGhlIHJlcGxheSBpbi1wcm9jZXNzLlxuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYSB3b3JrZmxvdyB0aGF0IGZpbmlzaGVzIHdpdGggbm8gc3RlcHMgcmVhY2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBiZWZvcmUgdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZDsgb3JkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSBhZnRlciBpdCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YTogeyBvdXRwdXQ6IHJlc3VsdCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnByZWNvbmRpdGlvblNuYXBzaG90UGFyYW1zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBjb21wbGV0aW5nIHdvcmtmbG93IHJ1biwgYnV0IHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3luY2hyb25vdXMgd29ya2Zsb3ctZXhlY3V0aW9uIGR1cmF0aW9uIGZvciBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIG9ubHkg4oCUIGFuY2hvcnMgdGhlIGBmaW5hbFNjaGVkdWxpbmdSZXBsYXlgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgZmllbGQgYmVsb3cgKHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcExhdGVuY3lUcmFja2luZy5yZXBsYXlNcykuIFRoaXMgaXMgdGhlIEZJTkFMXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgcGFzcywgdGhlIG9uZSB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHN0ZXA6IHZhbGlkIHJzZnMgcGF0aHMgY2FuIHJlcGxheSBtb3JlIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHNldEF0dHJpYnV0ZXMoKWAgZGV0b3VyIHJlcGxheXMgdHdpY2UpLCBhbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyeSBvbWl0cyBlYXJsaWVyIGludm9jYXRpb25zJyByZXBsYXkgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50aXJlbHkuIFRoaXMgdmFsdWUgaXMgTk9UIGFjY3VtdWxhdGVkIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgZWFybGllciBwYXNzZXMsIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwidGhlIHJlcGxheSBwb3J0aW9uIG9mIHJzZnNcIiDigJQgcnNmcyBjb3ZlcnMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwIHdpbmRvdztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsU2NoZWR1bGluZ1JlcGxheSBjb3ZlcnMgb25seSB0aGlzIGxhc3QgcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcHR1cmVkIGhlcmUsIGJlZm9yZSBgaGFuZGxlU3VzcGVuc2lvbmAncyBhd2FpdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJL08sIHNvIGl0IGV4Y2x1ZGVzIHRoYXQgSS9PLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZHVwbGljYXRlcyB3aGF0IE9URUwgYWxyZWFkeSBjYXB0dXJlcyBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bi9pbnZvY2F0aW9uIHNwYW4sIGJ1dCBpcyBjb2xsZWN0ZWQgYXMgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgc28gdGhlIHNlcnZlciBjYW4gZW1pdCBpdCBhcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVU5TQU1QTEVELCBmdWxsLXBvcHVsYXRpb24gbWV0cmljOiB3b3JrZmxvdy1zZXJ2ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIHNwYW5zIGFyZSBoZWF2aWx5IHNhbXBsZWQgaW4gcHJvZHVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKH43JSksIGFuZCBjbGllbnQgc3BhbnMgY2FuJ3QgYmUgZmlsdGVyZWQgYnkgU0RLXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uLCBzbyBuZWl0aGVyIGNhbiBzZXJ2ZSBhcyB0aGUgZGFzaGJvYXJkJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YWN0IFRURlMgZGVjb21wb3NpdGlvbi4gT24gYSByZXRhaW5lZC1WTVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHRoaXMgbWVhc3VyZXMgdGhlIHJlc3VtZSAodHlwaWNhbGx5IH4wbXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgcmVwbGF5LCBzbyB0aGUgZmllbGQncyBkaXN0cmlidXRpb24gaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpbW9kYWwgb25jZSByZXRlbnRpb24gaXMgYWN0aXZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5RHVyYXRpb25NcyA9IERhdGUubm93KCkgLSByZXBsYXlTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1dvcmtmbG93IHN1c3BlbmRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiByZXBsYXlEdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va3M6IGVyci5ob29rQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzOiBlcnIud2FpdENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uTWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuc3RlcENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLndhaXRDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25NZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoc3VzcGVuc2lvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBWMjogaGFuZGxlIHN1c3BlbnNpb24gd2l0aG91dCBxdWV1aW5nIHN0ZXBzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWFjaCBldmVudCBjcmVhdGlvbiBpbnNpZGUgaGFuZGxlU3VzcGVuc2lvbiBjYXJyaWVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlY29uZGl0aW9uIHNuYXBzaG90IG9mIHRoZSBsb2FkZWQgZXZlbnQgbG9nLCBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZW5kIGhvbGRpbmcgYW4gZXZlbnQgdGhpcyByZXBsYXkgbmV2ZXIgc2F3IHJlamVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3cml0ZSAoNDEyKSBpbnN0ZWFkIG9mIGFjY2VwdGluZyBhIGRpdmVyZ2VudCBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVqZWN0aW9uIGlzIGhhbmRsZWQgaGVyZSwgYnkgcmVzdGFydGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSDigJQgbmV2ZXIgYnkgcmUtcG9zdGluZyB0aGUgc2FtZSBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1c3BlbnNpb25TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBzdXNwZW5kZWQgYmVmb3JlIGl0cyBldmVudCBsb2cgd2FzIGxvYWRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VzcGVuc2lvblJlc3VsdDogQXdhaXRlZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgaGFuZGxlU3VzcGVuc2lvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgID47XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0ID0gYXdhaXQgaGFuZGxlU3VzcGVuc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbjogZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bjogd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3VzcGVuc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3VzcGVuc2lvbiBjcmVhdGUgd2FzIHJlamVjdGVkIGFzIHN0YWxlOiByZS1kZXJpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheSBmcm9tIGEgY29ycmVjdGVkIGxvZyBpbiB0aGlzIGludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uY2UgdGhlIGluLXByb2Nlc3MgYnVkZ2V0IGlzIHNwZW50LCBmYWxsIGJhY2sgdG8gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgaW1tZWRpYXRlIHJlLWludm9jYXRpb24gKGEgcmV0aHJvdyByZWxpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gcmVkZWxpdmVyeSBvZiBhIG1lc3NhZ2UgdGhlIHR1cmJvIHBhdGggYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2tlZCDigJQgdGhlIHJ1biB3b3VsZCBzdGFsbCBmb3IgdGhlIHF1ZXVlJ3MgfjMwMHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB2aXNpYmlsaXR5IHRpbWVvdXQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMoc3VzcGVuc2lvbkVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRSZXBsYXlJblByb2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdXNwZW5zaW9uLWNyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FsYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VzcGVuc2lvbi1jcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FsYXRpb24ucmVpbnZva2VkKSByZXR1cm4gZXNjYWxhdGlvbi5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVyLXJ1biBidWRnZXQgc3BlbnQ6IGZhaWwgdGhlIHJ1biByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmQgaXQgYmFjayB0byB0aGUgcXVldWUgdG8gc3BpbiBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRmF0YWxFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpZW50IGZhaWx1cmVzIHByb3BhZ2F0ZSB0byB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIHNvIHRoZSBtZXNzYWdlIGlzIHJlZGVsaXZlcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN1c3BlbnNpb25FcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb24tcmV0cnlhYmxlIGZhaWx1cmUgd2hpbGUgY29tbWl0dGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbidzIGV2ZW50cyDigJQgZS5nLiBhbiBhdHRyaWJ1dGUgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdvcmxkIHJlamVjdGVkIGFzIGludmFsaWQgKHRoZSBjdW11bGF0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlci1ydW4gY2FwIGNhbiBvbmx5IGJlIGNoZWNrZWQgV29ybGQtc2lkZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZGVsaXZlcnkgd291bGQgcmVwbGF5IHRoZSB3b3JrZmxvdyBpbnRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIHdyaXRlIGFuZCB0aGUgc2FtZSByZWplY3Rpb24sIHNvIGZhaWwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB3aXRoIHRoZSBlcnJvciBpbnN0ZWFkIG9mIHdlZGdpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgaW4gcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcihzdXNwZW5zaW9uRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOb24tcmV0cnlhYmxlIGVycm9yIHdoaWxlIGNvbW1pdHRpbmcgd29ya2Zsb3cgc3VzcGVuc2lvbjsgZmFpbGluZyBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdXNwZW5zaW9uRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3VzcGVuc2lvbkVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIHNvIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvckNvZGUoZXJyb3JDb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoc3VzcGVuc2lvbkVycm9yLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQucmVwb3J0ZWRFdmVudENvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdW1wLWFuZC1yZXBvcnQgbWVyZ2VkIGV2ZW50cyBCRUxPVyB0aGUgdGFpbCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtc29ydGVkIHRoZSBhcnJheSB0byBzbG90IG9yZGVyLCBzaGlmdGluZyBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiB0aGUgcHJld2FybSBzY2FuIGhhZCBhbHJlYWR5IHJlY29yZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY3Vyc29yIGlzIGRlbGliZXJhdGVseSBsZWZ0IGFsb25lOiB0aGUgcmVwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGEgbG93ZXIgYm91bmQgb24gd2hhdCB3YXMgc2tpcHBlZCwgc28gdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgcmVhZCBzdGlsbCBoYXMgdG8gY292ZXIgdGhlIHNhbWUgcmFuZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZS5yZXNldFNjYW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbiBob29rcy93YWl0cyBpbiB0aGUgbG9nIGFzIGxvYWRlZCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBUaGlzIHN1c3BlbnNpb24ncyBvd24gaG9vay93YWl0IHdyaXRlcyBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVCBpbiBpdCDigJQgdGhleSBuZXZlciByZWFjaCByZXRlbnRpb24gYW55d2F5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBhIHN1c3BlbnNpb24gY29udGFpbmluZyBhIG5vbi1zdGVwIGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxzIGNhblJldGFpbldvcmtmbG93U2Vzc2lvbidzIHR5cGUgY2hlY2sgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2NhbiBpcyBjb25zdWx0ZWQuIENvbXB1dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXppbHksIGF0IG1vc3Qgb25jZSwgYW5kIHNoYXJlZCBiZXR3ZWVuIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0ZW50aW9uIGRlY2lzaW9uIGhlcmUgYW5kIHRoZSBkZWx0YS90dXJibyBnYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cg4oCUIHRoZSBhdHRyLWRldG91ciBhbmQgaG9vay1jb25mbGljdCBwYXRoc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuL2NvbnRpbnVlIGJlZm9yZSB0aGUgZ2F0ZXMgYW5kIHVzdWFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3J0LWNpcmN1aXQgYmVmb3JlIGV2ZXIgc2Nhbm5pbmcgdGhlIGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5Ib29rV2FpdCA9IG9uY2UoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVuSG9va0FuZFdhaXRTdGF0ZShldmVudExvZy5ldmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzaW5nbGUgcmV0ZW50aW9uIGRlY2lzaW9uOiBrZWVwIHRoZSBwYXJrZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlc3Npb24gb25seSBhY3Jvc3MgYSBwdXJlIHN0ZXAgYm91bmRhcnkgd2l0aCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0LW9mLWJhbmQgY29udGludWF0aW9uIHNvdXJjZSBhbmQgcHJvdmFibHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3NpdmUgc3RlcCBpbnB1dHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhY2FuUmV0YWluV29ya2Zsb3dTZXNzaW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LnJldGFpbmVkU3RlcElucHV0c1NhZmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbkhvb2tXYWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nTXMgKz0gc3VzcGVuc2lvblJlc3VsdC5ob29rQ3JlYXRpb25NcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPSBwcmVTdGVwQmxvY2tpbmdNcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N1c3BlbnNpb24gaGFuZGxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25NczogRGF0ZS5ub3coKSAtIHN1c3BlbnNpb25TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBzOiBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzOiBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0Py5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNIb29rQ29uZmxpY3Q6IHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXR0cmlidXRlRXZlbnRzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvb2sgY29uZmxpY3Q6IGJyZWFrIGxvb3AsIHJlLWludm9rZSB2aWEgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tDb25mbGljdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSB3b3JrZmxvdyBhdHRyaWJ1dGUgZXZlbnRzIGFyZSByZXNvbHZlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCByZXBsYXk6IHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIHJlbG9hZHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgKG5vdyBob2xkaW5nIHRoZSBqdXN0LWNvbW1pdHRlZCBhdHRyX3NldCkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXlzLCByZXNvbHZpbmcgdGhlIHNldEF0dHJpYnV0ZXMgcHJvbWlzZS4gU2tpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwcm9jZXNzaW5nIGZvciB0aGlzIHBhc3Mgc28gdGhhdCByZXBsYXkgZGVjaWRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFjZXMgZmlyc3Qg4oCUIGluIFByb21pc2UucmFjZShbc2V0QXR0cmlidXRlcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCgpXSksIHRoZSBkdXJhYmxlIGF0dHJpYnV0ZSBldmVudCBtdXN0IGJlIGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHdpbiB3aXRob3V0IGV4ZWN1dGluZyB0aGUgbG9zaW5nIHN0ZXAuIFRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcHBlbnMgaW4tcHJvY2VzcyByYXRoZXIgdGhhbiB2aWEgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtaW52b2NhdGlvbjogdW5saWtlIGhvb2tzIGFuZCB3YWl0cywgYW4gYXR0cl9zZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJvZHVjZXMgbm8gb3V0LW9mLWJhbmQgaW52b2NhdGlvbiBzb3VyY2UgdGhhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgd291bGQgbmVlZCB0byB5aWVsZCB0aGUgbWVzc2FnZSBmb3IsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXlpbmcgYSBkZWxpdmVyeSByb3VuZC10cmlwIGhlcmUgd291bGQgb25seSBhZGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVuY3kgYmVmb3JlIHRoZSB3b3JrZmxvdydzIG5leHQgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG5leHRFdmVudExvZ0xvYWQoZXZlbnRMb2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ1N0ZXBzID0gc3VzcGVuc2lvblJlc3VsdC5wZW5kaW5nU3RlcHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBleGVjdXRpb24gaXMgZ2F0ZWQgb24gb3duZXJzaGlwLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlciBkZWZlcnJlZCB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAgdG8gYGdldE1heElubGluZVN0ZXBzKClgIHN0ZXBzIChgbGF6eUlubGluZVN0ZXBzYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBydW4gdGhlbSBpbmxpbmUg4oCUIGluIHBhcmFsbGVsIOKAlCB2aWEgbGF6eVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfc3RhcnRlZGAgZXZlbnRzIHRoYXQgY3JlYXRlIGVhY2ggc3RlcCBvbiB0aGUgZmx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2aW5nIG9uZSB3b3JsZCByb3VuZC10cmlwIHBlciBpbmxpbmUgc3RlcC4gT3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdGlsbCBhdG9taWMgYW5kIGV4YWN0bHktb25lIHBlciBzdGVwOiB0aGUgd29ybGQnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlLWNsYWltIGluc2lkZSBlYWNoIHN0ZXBfc3RhcnRlZCByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKOKGkiBleGVjdXRlU3RlcCBgc2tpcHBlZGApIHRvIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBsb3Nlciwgc28gb25seSBvbmUgaGFuZGxlciBldmVyIHJ1bnMgYSBnaXZlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm9keS4gRXZlcnkgb3RoZXIgcGVuZGluZyBzdGVwIGtlZXBzIGl0cyBlYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIChpbiBgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkc2ApIGFuZCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgb25seSBkZXNpZ25hdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgbGF6eUlubGluZVN0ZXBzYCB3aGVuIG5vIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHByZXNlbnQuIFRoYXQgYXdhaXRlciBjYXNlIG11c3QgZXhlY3V0ZSBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmU6IGFuIGlubGluZSBgYXdhaXQgZXhlY3V0ZVN0ZXAoLi4uKWAgYmxvY2tzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sIHNvIHRoZSBhd2FpdGVyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiAod2hpY2ggb25seSBhZHZhbmNlcyBvbiB0aGUgbmV4dCByZXBsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSBzZXJpYWxpemVkIGJlaGluZCB0aGUgc3RlcCDigJQgZGVmZWF0aW5nIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3b3JrZmxvdyBleHByZXNzZWQgYXMgcGFyYWxsZWwgKGUuZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBob29rLmdldENvbmZsaWN0KCkudGhlbigoKSA9PiBzdGVwQigpKWAgcmFjaW5nIGBhd2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcEEoKWApLiBJbiB0aGF0IGNhc2UgYGxhenlJbmxpbmVTdGVwc2AgaXMgZW1wdHkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBzdGVwIGlzIHF1ZXVlZCBmb3IgcmUtaW52b2NhdGlvbiwgd2hpY2ggcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciB0aGUganVzdC1jb21taXR0ZWQgaG9va19jcmVhdGVkIGFuZCByZXNvbHZlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZXIgd2hpbGUgcXVldWVkIHN0ZXBzIHJ1biBpbiBwYXJhbGxlbCBpbnZvY2F0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhenlJbmxpbmVTdGVwcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQubGF6eUlubGluZVN0ZXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiBzLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmlmaWVkIHF1ZXVlIGRpc3BhdGNoIGZvciBldmVyeXRoaW5nIHdlIGFyZSBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZS1leGVjdXRpbmcuIFN0ZXBzIGFyZSBxdWV1ZWQgd2l0aCBzdGVwSWQgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWNlaXZlciBydW5zIHRoZW07IHRoZSB3YWl0IHRpbWVyIGlzIHF1ZXVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYSBnZW5lcmljIGNvbnRpbnVhdGlvbiB0aGF0IGZpcmVzIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBlbGFwc2VzIGFuZCBsZXRzIHRoZSBuZXh0IHJlcGxheSBvYnNlcnZlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IHZpYSB0aGUgXCJjb21wbGV0ZSBlbGFwc2VkIHdhaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBkaXNwYXRjaCBkZWNpc2lvbiB0YWJsZSAocGVyIHBlbmRpbmcgc3RlcCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2lnbmF0ZWQgbGF6eS1pbmxpbmUpOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBJbmxpbmUtb3duZWQsIG93bmVyID09PSB0aGlzIG1lc3NhZ2UgIOKGklxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGV4ZWN1dGUgaW4gVEhJUyBpbnZvY2F0aW9uIChvd25lZCByZWNvdmVyeTogYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJlZGVsaXZlcnkgb2YgdGhlIG93bmluZyBtZXNzYWdlIHJlLWV4ZWN1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhlIHN0ZXAgaXQgY3Jhc2hlZCBvbiwgdmlhIGEgcGF5bG9hZC1sZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcF9zdGFydGVkIHJlLXN0YW1wZWQgd2l0aCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvd25lck1lc3NhZ2VJZCDigJQgbm90IGEgYmFyZSBzdGFydCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gSW5saW5lLW93bmVkLCBvd25lciAhPT0gdGhpcyBtZXNzYWdlICDihpJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBlbnN1cmUgYSBERUxBWUVEIGJhY2tzdG9wIHdha2UgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKGRlbGF5U2Vjb25kcyA9IG93bmVyc2hpcCBsZWFzZSByZW1haW5pbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaW5zdGVhZCBvZiBlbnF1ZXVlaW5nIHRoZSBzdGVwLiBUaGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaW52b2NhdGlvbiBpcyAobGlrZWx5KSBzdGlsbCBydW5uaW5nIHRoZSBib2R5O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFuIGltbWVkaWF0ZSBzdGVwIG1lc3NhZ2Ugd291bGQgYmFyZS1zdGFydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBydW5uaW5nIHN0ZXAgYW5kIGV4ZWN1dGUgaXQgYSBzZWNvbmQgdGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICh3b3JrZmxvdyMyNzgwKS4gVGhlIGJhY2tzdG9wIGlzIGEgcGxhaW4gcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29udGludWF0aW9uLCBOT1QgYSBzdGVwIG1lc3NhZ2U6IHdoZW4gaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBmaXJlcywgdGhpcyBzYW1lIGRlY2lzaW9uIHRhYmxlIGhhbmRsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB3aGF0ZXZlciBzdGF0ZSB0aGUgc3RlcCBpcyBpbiBieSB0aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKHRlcm1pbmFsIOKGkiBub3RoaW5nIHBlbmRpbmc7IHF1ZXVlLW93bmVkIGFmdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcF9yZXRyeWluZyDihpIgbm9ybWFsIGtleWVkIGRpc3BhdGNoOyBvd25lclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRlYWQgd2l0aCBsZWFzZSBleHBpcmVkIOKGkiBpbW1lZGlhdGUgZGlzcGF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcHJlc2VydmluZyBzdGVwLWxldmVsIGZhaWx1cmUgc2VtYW50aWNzIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHBvaXNvbiBzdGVwczsgbGVhc2UgcmVmcmVzaGVkIGJ5IG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVjb3Zlcnkg4oaSIHJlLWFybSkuIFRoZSBiYWNrc3RvcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWRlbXBvdGVuY3lLZXkgaXMgc2NvcGVkIHRvIHRoZSBvd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBFUE9DSCAobGF0ZXN0IHN0ZXBfc3RhcnRlZCB0aW1lc3RhbXApLCBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBqdXN0IHRoZSBjb3JyZWxhdGlvbiBJRCwgYW5kIG11c3QgbmV2ZXIgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgc3RlcCBtZXNzYWdlJ3Mgb3duIGtleSDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmFja3N0b3BJZGVtcG90ZW5jeUtleSBmb3IgYm90aCBpbnZhcmlhbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKGZpeGVkIGtleXMgZWl0aGVyIGFic29yYiB0aGUgcmV0cnkgaGFuZG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG9yIGRlZHVwZSB0aGUgcmVmcmVzaGVkLWxlYXNlIHJlLWFybSBhZ2FpbnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhlIGluLWZsaWdodCBiYWNrc3RvcCBpdHNlbGYpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAtIE5vdCBvd25lZCAobmV2ZXIgc3RhbXBlZCAvIGVhZ2VyIC8gb3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGFwc2VkIGF0IHN0ZXBfcmV0cnlpbmcgLyBsZWFzZSBleHBpcmVkIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBraWxsLXN3aXRjaGVkKSDihpIgaW1tZWRpYXRlIGVucXVldWUsIGV4YWN0bHkgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZWZvcmUuIFRoaXMgY292ZXJzIGNyYXNoIHJlY292ZXJ5OiBpZiBhIHByaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlciB3cm90ZSBzdGVwX2NyZWF0ZWQgYnV0IGNyYXNoZWQgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcXVldWVpbmcsIGEgbGF0ZXIgaGFuZGxlciBxdWV1ZXMgaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWRlbXBvdGVuY3lLZXkgb24gY29ycmVsYXRpb25JZCBkZWR1cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVkdW5kYW50IHF1ZXVlcyBhY3Jvc3MgY29uY3VycmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd2FpdCBjb250aW51YXRpb24gaXMgd2hhdCBtYWtlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYFByb21pc2UucmFjZShzdGVwLCBzbGVlcClgIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgZXhlY3V0aW9uOiBldmVuIGlmIHRoZSBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2tzIHRoaXMgaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IHRpbWVyIGZpcmVzIGluIGEgc2VwYXJhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24uIElmIHRoZSBzbGVlcCB3aW5zLCB0aGF0IHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGNvbXBsZXRlcyB0aGUgcnVuOyBpZiB0aGUgc3RlcCB3aW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdhaXQgY29udGludWF0aW9uIGZpcmVzIGxhdGVyIGFuZCBuby1vcHMgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXJtaW5hbCBydW4uXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbnRpbnVhdGlvbidzIGRlbGF5IGlzIGNsYW1wZWQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhpbXVtIHF1ZXVlIGRlbGF5IChsb25nIHdhaXRzIGNoYWluIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgaG9wcykgYW5kIGl0cyBpZGVtcG90ZW5jeSBrZXkgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtb2JzZXJ2YXRpb25zIG9mIHRoZSBzYW1lIHBlbmRpbmcgd2FpdCBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gcGFzc2VzIOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnRpbWUvd2FpdC1jb250aW51YXRpb24udHMgZm9yIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheS9rZXkgc2VsZWN0aW9uIHJhdGlvbmFsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lT3duZXJzaGlwID0gaXNJbmxpbmVPd25lcnNoaXBFbmFibGVkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaE5vd01zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVkUmVjb3ZlcnlTdGVwczogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW1bXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tzdG9wV2FrZXNBcm1lZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgcGVuZGluZ1N0ZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVyc2hpcEFjdGl2ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lT3duZXJzaGlwICYmIGlzU3RlcE93bmVyc2hpcEFjdGl2ZShzdGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcEFjdGl2ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAub3duZXJNZXNzYWdlSWQgPT09IG1ldGFkYXRhLm1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPd25lZCByZWNvdmVyeTogdGhpcyBkZWxpdmVyeSBJUyB0aGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZTsgcmUtZXhlY3V0ZSB0aGUgc3RlcCBpbiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBpbnN0ZWFkIG9mIHF1ZXVlaW5nIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5wdXNoKHN0ZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGF5ZWQgYmFja3N0b3Agd2FrZSB3aGlsZSBhbm90aGVyIGludm9jYXRpb24nc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lcnNoaXAgbGVhc2UgaXMgbGl2ZTsgaW1tZWRpYXRlIHN0ZXAgZW5xdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgKGxlYXNlIGV4cGlyZWQg4oeSIHJlbWFpbmluZyAwIOKHkiBzYW1lIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZGF5LCB3aGljaCBpcyBhbHNvIHRoZSBkZWdyYWRlZCBtb2RlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZHMgd2l0aCB1bnN0YWJsZSBtZXNzYWdlIElEcyDigJQgdGhlIG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGFib3ZlIG5ldmVyIG1hdGNoZXMgdGhlcmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrc3RvcERlbGF5U2Vjb25kcyA9IG93bmVyc2hpcEFjdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3RlcExlYXNlUmVtYWluaW5nU2Vjb25kcyhzdGVwLCBkaXNwYXRjaE5vd01zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tzdG9wRGVsYXlTZWNvbmRzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wV2FrZXNBcm1lZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGVuZGluZyBzdGVwIGlzIGlubGluZS1vd25lZCBieSBhIGxpdmUgaW52b2NhdGlvbjsgZW5zdXJpbmcgZGVsYXllZCBiYWNrc3RvcCB3YWtlIGluc3RlYWQgb2YgaW1tZWRpYXRlIHJlcXVldWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyTWVzc2FnZUlkOiBzdGVwLm93bmVyTWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcERlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogYmFja3N0b3BEZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IGJhY2tzdG9wSWRlbXBvdGVuY3lLZXkoc3RlcCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZGlzcGF0Y2hlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZXQgb2Ygc3RlcHMgVEhJUyBpbnZvY2F0aW9uIGV4ZWN1dGVzOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVycmVkIGxhenktaW5saW5lIGJhdGNoIHBsdXMgYW55IG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwcyAodGhpcyBtZXNzYWdlJ3MgcmVkZWxpdmVyeSByZS1leGVjdXRpbmcgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBpdCBjcmFzaGVkIG9uIOKAlCBubyBsYXp5U3RlcElucHV0OyB0aGUgaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh5ZHJhdGVzIGZyb20gdGhlIHN0ZXAgZW50aXR5IGxpa2UgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGgsIGFuZCB0aGUgcGF5bG9hZC1sZXNzIHN0ZXBfc3RhcnRlZCByZS1zdGFtcHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyc2hpcCDigJQgdW5saWtlIHRoZSBiYWNrZ3JvdW5kIHBhdGgncyBzdGFydCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgTk9UIGJhcmU6IGl0IGNhcnJpZXMgdGhpcyBtZXNzYWdlJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyTWVzc2FnZUlkLCB3aGljaCBpcyBhbHNvIHdoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZC1yZWNvdmVyeSByZXRyeSBjZWlsaW5nIGNvdW50cykuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVFeGVjdXRpb25zOiBBcnJheTx7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dD86ICh0eXBlb2YgbGF6eUlubGluZVN0ZXBzKVtudW1iZXJdWydkZWh5ZHJhdGVkSW5wdXQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0+ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5sYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmRlaHlkcmF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vd25lZFJlY292ZXJ5U3RlcHMubWFwKChzKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE93bmVyc2hpcCB0ZWxlbWV0cnkgKGRlc2lnbiBkb2MgUGhhc2UgNyk6IHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMgc28gcHJvZHVjdGlvbiB0cmFjZXMgc2hvdyB3aGVuIGNyYXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyeSByYW4gb3IgYSB3YWtlIHdhcyBjb252ZXJ0ZWQgaW50byBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrc3RvcCwgYW5kIGEgd2FybiAoYWx3YXlzIHByaW50ZWQsIHVubGlrZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcvaW5mbykgZm9yIG93bmVkIHJlY292ZXJ5IOKAlCBpdCBtZWFucyBhIHByaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2UgZGllZCBtaWQtc3RlcC1ib2R5LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcFdha2VzQXJtZWQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd093bmVkUmVjb3ZlcnlTdGVwcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihiYWNrc3RvcFdha2VzQXJtZWQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEF0dHJpYnV0ZS5Xb3JrZmxvd0JhY2tzdG9wV2FrZXNBcm1lZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcFdha2VzQXJtZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmUtZXhlY3V0aW5nIGlubGluZSBzdGVwcyBvd25lZCBieSB0aGlzIHF1ZXVlIG1lc3NhZ2Ug4oCUIGEgcHJldmlvdXMgZGVsaXZlcnkgY3Jhc2hlZCBtaWQtYm9keSBhbmQgdGhpcyByZWRlbGl2ZXJ5IGlzIHJlY292ZXJpbmcgdGhlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWRzOiBvd25lZFJlY292ZXJ5U3RlcHMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocykgPT4gcy5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBleGVjdXRlIGlubGluZSDigJQgZXZlcnl0aGluZyBoYXMgYmVlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIChvciBubyB3b3JrIG5lZWRzIHNjaGVkdWxpbmcpLiBFeGl0IGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBkcml2ZSBzdWJzZXF1ZW50IHJlcGxheXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lRXhlY3V0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyIG5lZWRzIGFuIGltbWVkaWF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1pbnZvY2F0aW9uOiB0aGUgcmVwbGF5IGNvbnN1bWVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdGVyLiBXaXRob3V0IGl0IChubyBpbmxpbmUgc3RlcCwgYWxsIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIG9yIG5vbmUgcGVuZGluZykgdGhlIHJ1biB3b3VsZCBzaXQgaWRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnRpbCBzb21lIHVucmVsYXRlZCBtZXNzYWdlIHdva2UgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuIGhvb2tzL3dhaXRzIGFyZSBjb25zdWx0ZWQgYnkgYWxsIHRocmVlIGdhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdzsgcmVzb2x2ZSB0aGUgbWVtb2l6ZWQgc2NhbiBvbmNlIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVuSG9va1dhaXRTdGF0ZSA9IG9wZW5Ib29rV2FpdC52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIGZhc3QgcGF0aCBnYXRlLiBXZSByZXF1ZXN0IHRoZSBkZWx0YSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvbiB0aGUgbmV4dCBpdGVyYXRpb24gY29uc3VtZSBpdCBpbiBwbGFjZSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0IOKAlCBvbmx5IHdoZW4gQUxMIGhvbGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gV2UgaGF2ZSBhIHJlYWwgcHJpb3IgY3Vyc29yIHRvIGRpZmYgYWdhaW5zdCAoYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgV29ybGQgbWF5IHJldHVybiBub25lIG9uIHRoZSBpbml0aWFsIGxvYWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gVGhpcyBpcyB0aGUgY2xlYW4gc2luZ2xlLXN0ZXAgc2VxdWVudGlhbCBjYXNlOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhpcyBzdXNwZW5zaW9uIHByb2R1Y2VkIGV4YWN0bHkgb25lIHN0ZXAgYW5kIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3YWl0cyAoYGVyci57c3RlcCx3YWl0fUNvdW50YCksIHRoYXQgb25lIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBsb25lIHBlbmRpbmcgc3RlcCAoYHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDFgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYW5kIHRoZSBsb25lIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDFgIOKAlCBubyBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc2libGluZ3MgcXVldWVkIHRvIGJhY2tncm91bmQgaGFuZGxlcnMsIGFuZCBubyBvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaW5saW5lIHN0ZXAgd3JpdGluZyBpdHMgb3duIGV2ZW50cyBvdXQgb2YgYmFuZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBObyBwZW5kaW5nIHdhaXQgdGltZXIgZnJvbSBUSElTIHN1c3BlbnNpb24sIGFuZCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3BlbiB3YWl0IGluIHRoZSBjdW11bGF0aXZlIGxvZzogYSBjb25jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBgd2FpdF9jb21wbGV0ZWRgIGxhbmRpbmcgYWZ0ZXIgdGhlIGRlbHRhIHNuYXBzaG90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkb2VzIG5vdCBidW1wIHRoZSBvdXRzaWRlLWV2ZW50IG1hcmtlciwgc28gbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZmVuY2VzIGEgcmVwbGF5IGZyb20gdGhlIHN0YWxlIGRlbHRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gTm8gb3BlbiAob3IgdGhpcy1zdXNwZW5zaW9uLWNyZWF0ZWQpIGhvb2sg4oCUIFVOTEVTU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIHByZWNvbmRpdGlvbiBndWFyZCBpcyBlbmFibGVkIEFORCB0aGUgV29ybGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGRlY2xhcmVzIGl0IGFjdHVhbGx5IGVuZm9yY2VzIHRoZSBndWFyZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBjYXBhYmlsaXRpZXMucHJlY29uZGl0aW9uR3VhcmRgOyB0aGUgZW52IGZsYWdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFsb25lIG9ubHkgbWFrZXMgdGhlIHJ1bnRpbWUgU0VORCBzbmFwc2hvdHMsIHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhbiB1bnN1cHBvcnRpbmcgYmFja2VuZCBpZ25vcmVzIOKAlCBubyBmZW5jZSkuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZGVsdGEgc25hcHNob3RzIHRoZSBsb2cgYXQgdGhlIHN0ZXBfY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3cml0ZSBidXQgaXMgY29uc3VtZWQgb24gdGhlIG5leHQgcmVwbGF5LCBzbyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3V0LW9mLWJhbmQgYGhvb2tfcmVjZWl2ZWRgIGxhbmRpbmcgaW4gdGhhdCB3aW5kb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlzIGFic2VudCBmcm9tIHRoZSBkZWx0YSBhbmQgb2JzZXJ2ZWQgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpdGVyYXRpb24gbGF0ZXIgdGhhbiBhIHJlYWwgZmV0Y2ggd291bGQgb2JzZXJ2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXQuIFRoYXQgc3RhbGVuZXNzIGlzIHF1YWxpdGF0aXZlbHkgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlYWQtdG8td3JpdGUgcmFjZSB0aGUgZmV0Y2ggcGF0aCBhbHJlYWR5IGhhcyAoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGV2ZW50IGNhbiBsYW5kIHJpZ2h0IGFmdGVyIGBldmVudHMubGlzdGAgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYW5kIGJlZm9yZSB0aGUgc3VzcGVuc2lvbidzIHdyaXRlcyk7IHdpdGggYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGVuZm9yY2VkIGd1YXJkIGl0IGlzIGFsc28gZmVuY2VkOiBgaG9va19yZWNlaXZlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGJ1bXBzIHRoZSBwZXItcnVuIG91dHNpZGUtZXZlbnQgbWFya2VyLCBzbyBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZHVyYWJsZSB3cml0ZSB0aGUgc3RhbGUgcmVwbGF5IGF0dGVtcHRzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWplY3RlZCB3aXRoIDQxMiDigJQgaXRzIGd1YXJkZWQgc3VzcGVuc2lvbiBjcmVhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAocmV0cmllZCBvdmVyIHRoZSByZWxvYWRlZCBsb2csIG9yIGV4aGF1c3RlZCBpbnRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhIHF1ZXVlIHJlLWludm9jYXRpb24pLCBBTkQgdGhlIGxhenkgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBjbGFpbSBvZiBpdHMgbmV4dCBpbmxpbmUgc3RlcCwgd2hpY2ggY2FycmllcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNuYXBzaG90IHRvbyAodGhyZWFkZWQgYmVsb3cgdmlhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBgc3RhdGVVcGRhdGVkQXRgOyBvbiByZWplY3Rpb24gdGhlIGJhdGNoIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhYmFuZG9uZWQgYW5kIHJlLWludm9rZWQgZm9yIGEgZnJlc2ggcmVwbGF5LCBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzdGFsZSB2aWV3IGNhbiBuZXZlciBjb21taXQgYSBzdGVwKS4gSG9va3MgY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYnkgVEhJUyBzdXNwZW5zaW9uIGFyZSBpbnNpZGUgdGhlIGRlbHRhICh0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYGhvb2tfY3JlYXRlZGAgbGFuZHMgYmVmb3JlIHRoZSBzdGVwLXRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3cml0ZSksIHNvIG9ubHkgdGhlaXIgYGhvb2tfcmVjZWl2ZWRgIHJlc3BvbnNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYXJlIHN1YmplY3QgdG8gdGhlIHNhbWUgZmVuY2VkIHdpbmRvdy4gV2l0aG91dCBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZW5mb3JjZWQgZ3VhcmQgdGhlcmUgaXMgbm8gZmVuY2UsIHNvIGtlZXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBjb25zZXJ2YXRpdmUgZ2F0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFdpdGggbm8gaG9vayBvciB3YWl0IG9wZW4gYXQgYWxsLCB0aGUgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3V0LW9mLWJhbmQgd3JpdGVyIGlzIGNhbmNlbGxhdGlvbiwgd2hpY2ggaXMgc2FmZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdG8gb2JzZXJ2ZSBvbmUgaXRlcmF0aW9uIGxhdGUuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3Blbkhvb2tBbmRXYWl0U3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBtb3JlIHRoYW4gb25lIHN0ZXAgcnVucyBpbmxpbmUsIGVhY2ggd3JpdGVzIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duIGV2ZW50cyBhbmQgdGhlIHBlci13cml0ZSBkZWx0YSB3b3VsZCBiZSBwYXJ0aWFsLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlbHRhIGlzIG5vdCByZXF1ZXN0ZWQgKHRoZSBnYXRlIGJlbG93IGlzIGZhbHNlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGktc3RlcCkgYW5kIHRoZSBuZXh0IGl0ZXJhdGlvbiBkb2VzIGEgbm9ybWFsIGZldGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hldGhlciB0aGUgcHJlY29uZGl0aW9uIGd1YXJkIGlzIGFjdHVhbGx5IGluIGZvcmNlOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZCBieSBlbnYgQU5EIGVuZm9yY2VkIGJ5IHRoZSBXb3JsZC4gVGhlIGVudlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxhZyBhbG9uZSBvbmx5IG1ha2VzIHRoZSBydW50aW1lIHNlbmQgc25hcHNob3RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggYW4gdW5zdXBwb3J0aW5nIGJhY2tlbmQgaWdub3JlcyAobm8gZmVuY2UpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VhcmRFbmZvcmNlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJlY29uZGl0aW9uR3VhcmRFbmFibGVkKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQuY2FwYWJpbGl0aWVzPy5wcmVjb25kaXRpb25HdWFyZCA9PT0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdElubGluZURlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50TG9nLmN1cnNvciA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuV2FpdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VhcmRFbmZvcmNlZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnIuaG9va0NvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3Blbkhvb2spKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhbGUtc2Vuc2l0aXZlIGJhdGNoOiBhIGhvb2sgaXMgb3BlbiBpbiB0aGUgcnVuIChvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGNyZWF0ZWQgYnkgdGhpcyBzdXNwZW5zaW9uLCBzbyBpdHMgaG9va19yZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGxhbmQgYW55IG1vbWVudCkg4oCUIGFuIG91dC1vZi1iYW5kIGV2ZW50IGNhbiBtYWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdmlldyB0aGlzIGJhdGNoIHdhcyBzY2hlZHVsZWQgZnJvbSBzdGFsZS4gV2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGd1YXJkIGluIGZvcmNlLCB0aGUgZmVuY2UgcmVqZWN0cyBhIHN0YWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbSdzIGR1cmFibGUgd3JpdGVzIOKAlCBidXQgaXQgY2Fubm90IHVuLXJ1biBhIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJPRFkgdGhhdCBvcHRpbWlzdGljIHN0YXJ0IGJlZ2FuIGJlZm9yZSB0aGUgY2xhaW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHRsZWQuIFN1cHByZXNzIG9wdGltaXN0aWMgc3RhcnQgZm9yIHRoZXNlIGJhdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0YWtlIGF3YWl0LXRoZW4tcnVuKSBzbyBhIDQxMi1mZW5jZWQgc3RlcCBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZXMgdXNlciBjb2RlIGF0IGFsbDogdGhlIGZlbmNlIHRoZW4gY292ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWRlIGVmZmVjdHMsIG5vdCBqdXN0IHRoZSBldmVudCBsb2cuIENvc3RzIG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhaW0gcm91bmQtdHJpcCBwZXIgc3RlcCB3aGlsZSBhIGhvb2sgaXMgb3Blbiwgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gZ3VhcmQtZW5mb3JjaW5nIGRlcGxveW1lbnRzLiBXaXRob3V0IHRoZSBndWFyZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyA0MTJzLCBzbyBzdXBwcmVzc2lvbiB3b3VsZCBidXkgbm90aGluZyDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlLXZpZXcgZXhwb3N1cmUgdGhlcmUgaXMgdGhlIHByZS1leGlzdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYy1zdGFydCBjb250cmFjdCAoaWRlbXBvdGVudCBzaWRlIGVmZmVjdHMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyZEVuZm9yY2VkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuSG9va1dhaXRTdGF0ZS5vcGVuSG9vayB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmb3JjZXMgb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgZm9yIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoIOKAlCBidXQgb25seSB3aGlsZSB0aGUgcnVuIGlzIHN0aWxsIFwiY2xlYW5cIiAoYSBwdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHN1c3BlbnNpb24pLiBUaGUgbW9tZW50IGEgaG9vayBvciB3YWl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkLCBsYXRlciByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYmVjb21lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSwgc28gdGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgb3B0aW1pc3RpYyBzdGFydCBzYWZlIG5vIGxvbmdlciBob2xkcyDigJQgdHVyYm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXRzIGFuZCB0aGUgc3RlcHMgdGFrZSB0aGUgbm9ybWFsIChlbnYtZ2F0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdC10aGVuLXJ1biBwYXRoLiBUaGUgaG9vay1jb25mbGljdCBjYXNlIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGVhcmx5IGFib3ZlLCB0aGUgYXR0ciBjYXNlIGNvbnRpbnVlZCBpbnRvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXNoIHJlcGxheSAoc28gYSBiYXRjaC1zY2hlZHVsaW5nIHN1c3BlbnNpb24gbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZXMgYXR0ciBldmVudHMpLCBhbmQgdGhlIGF3YWl0ZWQtaG9vayBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0aWVkIGxhenlJbmxpbmVTdGVwczsgdGhlIGNoZWNrcyBiZWxvdyBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVuc2l2ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYHN1c3BlbnNpb25SZXN1bHQuKmAgZmxhZ3Mgb25seSByZWZsZWN0IHdoYXQgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2ggY3JlYXRlZCwgc28gdGhleSBkbyBub3QgY2F0Y2ggYSBob29rL3dhaXQgb3BlbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBhbiBlYXJsaWVyIGl0ZXJhdGlvbiBvZiB0aGUgc2FtZSBkZWxpdmVyeSAoZS5nLiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJlLWFuZC1mb3JnZXQgYGNyZWF0ZUhvb2soLi4uKWAgdGhhdCBkb2Vzbid0IGJsb2NrIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3csIGxldHRpbmcgdGhlIHJlcGxheSBsb29wIGNvbnRpbnVlIHRvIGxhdGVyIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbnMpLiBPbmNlIGFueSBob29rIG9yIHdhaXQgaXMgb3BlbiBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1bXVsYXRpdmUgbG9nLCByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYXJlIHBvc3NpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biwgc28gdHVyYm8gbXVzdCBsYXRjaCBvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcm1hbmVudGx5IOKAlCBjaGVja2VkIGhlcmUgdmlhIGBvcGVuSG9va0FuZFdhaXRTdGF0ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIGN1bXVsYXRpdmUgZXZlbnQgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGBXT1JLRkxPV19TRVFVRU5USUFMX1JFUExBWVM9MWAgKHBlci1ydW4gZmxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9waWNzIGNvbnN1bWVkIHdpdGggYG1heENvbmN1cnJlbmN5OiAxYCkgd291bGQgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW5jaXBsZSB3YWl2ZSB0aGlzIGxhdGNoIOKAlCBzZXJpYWxpemVkIG9yY2hlc3RyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbnMgcmVzdG9yZSB0aGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdob2xlIGRlbGl2ZXJ5LiBUaGUgd2FpdmVyIGlzIGludGVudGlvbmFsbHkgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlbjogdGhlIGVudiB2YXIgaXMgYSBydW50aW1lLXByb2Nlc3Mgc2V0dGluZyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgcHJvdmUgdGhlIEJVSUxUIGZsb3cgdHJpZ2dlciBhY3R1YWxseSBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgbWF4Q29uY3VycmVuY3k6IDFgIChpdCBtdXN0IGJlIHNldCBhdCBidWlsZCB0aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b28sIGFuZCBzb21lIGludGVncmF0aW9ucyB3cml0ZSB0aGVpciBvd24gdHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlnKSwgYW5kIGBjYXBhYmlsaXRpZXMubWF4Q29uY3VycmVuY3lgIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVzIHF1ZXVlIHN1cHBvcnQsIG5vdCBkZXBsb3llZCBjb25maWd1cmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW50aWwgdGhlIGJ1aWxkIGVtaXRzIGEgdmVyaWZpYWJsZSBzaWduYWwgdGhhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcGxveWVkIHRyaWdnZXIgaXMgc2VyaWFsaXplZCwgdGhlIGNvbnNlcnZhdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF0Y2ggc3RheXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JjZU9wdGltaXN0aWNTdGFydCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJvICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIW9wZW5Ib29rV2FpdFN0YXRlLm9wZW5Ib29rICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuV2FpdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIHN0ZXBzIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBidWRnZXQgaXMgcGF1c2VkIGZvciB0aGUgd2hvbGUgYmF0Y2gg4oCUIHN0ZXAgZHVyYXRpb24gaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb24gbWF4RHVyYXRpb24sIG5vdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSB0aW1lb3V0IOKAlCBzbyB0aGUgYnVkZ2V0IGNoZWNrIGF0IHRoZSB0b3Agb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIGRvZXNuJ3QgY2hhcmdlIHRoZSBzdGVwIGJvZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5OiBkZWNpZGUgd2hldGhlciB0aGlzIGJhdGNoJ3MgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcXVhbGlmaWVzIGZvciBUVEZTL1NUU08gbWVhc3VyZW1lbnQuIE9ubHkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCdzIGZpcnN0IHN0ZXAgY2FycmllcyB0aGUgdHJhY2tpbmcgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWwgYmF0Y2ggZW1pdHMgb25lIHNhbXBsZSBwZXIgc2NoZWR1bGluZyBnYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3Qgb25lIHBlciBzaWJsaW5nLiBUdXJibydzIHN5bnRoZXNpemVkIHJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc25hcHNob3QgaGFzIGEgbG9jYWwtY2xvY2sgY3JlYXRlZEF0LCBzbyB1bmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVyYm8gb25seSB0aGUgcnVuLWlkIFVMSUQgdGltZXN0YW1wIGlzIHRydXN0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXRlbmN5VHJhY2tpbmcgPSBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydGVkQ2xlYW4gPT09IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkNyZWF0ZWRBdE1zOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkQ3JlYXRlZEF0KHJ1bklkKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0dXJibyA/IHVuZGVmaW5lZCA6ICt3b3JrZmxvd1J1bi5jcmVhdGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogcmVwbGF5RHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nTXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdXNwZW5zaW9uJ3Mgb3duIGhvb2svd2FpdCB3cml0ZXMgYXJlIG5vdCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9hZGVkIGV2ZW50IGxvZyB5ZXQsIHNvIHJlcG9ydCB0aGVtIGV4cGxpY2l0bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25IYXNXYWl0czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkNyZWF0ZWRIb29rczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50ID4gMCB8fCBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJvLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWNvbmRpdGlvbi1ndWFyZCBzbmFwc2hvdCBmb3IgdGhlIGlubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIGNsYWltczogdGhlIGxhenkgY2xhaW0gaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhYmxlIHdyaXRlIG9mIGEgaG90LXBhdGggc3RlcCAoaXRzIHN0ZXBfY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgZGVmZXJyZWQpLCBzbyB3aXRob3V0IGEgc25hcHNob3QgaXQgd291bGQgYnlwYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZ3VhcmQgZW50aXJlbHkgYW5kIGEgc3RhbGUgcmVwbGF5IGNvdWxkIGNsYWltIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbW1pdCDigJQgYSBzdGVwIHNjaGVkdWxlZCBvZmYgYSB2aWV3IHRoYXQgbWlzc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBldmVudCBpdCBuZXZlciBsb2FkZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXNgIHJldHVybnMgYW4gZW1wdHkgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBndWFyZCBlbnYgZmxhZyBpcyBvZmYsIHNvIHRoaXMgaXMgYSBuby1vcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0c2lkZSBndWFyZGVkIGRlcGxveW1lbnRzOyBXb3JsZHMgdGhhdCBkb24ndFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5mb3JjZSB0aGUgZ3VhcmQgaWdub3JlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lQ2xhaW1TbmFwc2hvdCA9IHByZWNvbmRpdGlvblNuYXBzaG90UGFyYW1zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RlcFJlc3VsdHM6IEF3YWl0ZWQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGV4ZWN1dGVTdGVwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPltdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcEV4ZWN1dGlvblByb21pc2VzID0gaW5saW5lRXhlY3V0aW9ucy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChzLCBzdGVwSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZDogcm9vdFJ1bklkRnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IG51bWJlciA9IHByaW9yIHN0ZXBfc3RhcnRlZCBjb3VudCArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoaXMgZXhlY3V0aW9uJ3Mgc3RhcnQpLCBjb3VudGluZyBvbmx5IFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSdzIG93biBzdGFydHM6IHRoZSBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjZWlsaW5nIGJvdW5kcyBob3cgbWFueSB0aW1lcyB0aGlzIG93bmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHJlLXJ1bnMgYSBzdGVwIGl0IGNyYXNoZWQvdGltZWQgb3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uLCBhbmQgZWFjaCBvZiB0aG9zZSAocmUpc3RhcnRzIHN0YW1wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRhZGF0YS5tZXNzYWdlSWQuIFN0YXJ0cyB3cml0dGVuIGJ5IHJhY2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9ucyAoc3RhbGUvd2FrZSByZXBsYXlzLCBhIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBkaXNwYXRjaGVkIG9mZiBhIGxvc3QgY3JlYXRlLWNsYWltKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyeSBvdGhlciBJRHMg4oCUIG9yIG5vbmUg4oCUIGFuZCBtdXN0IG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudCwgb3IgdGhlIGNlaWxpbmcgZmFsc2VseSBleGhhdXN0cyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlYWx0aHkgc3RlcCAoc2VlIGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGxhenkgc3RlcCBpcyBicmFuZC1uZXcgYnkgY29uc3RydWN0aW9uIChpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRlcnMgdGhlIGJhdGNoIG9ubHkgd2hlbiBpdCBoYXMgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIHlldCksIHNvIGl0IGhhcyB6ZXJvIHByaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyBhbmQgaXMgYWx3YXlzIGF0dGVtcHQgMSDigJQgc2tpcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIHNjYW4gZW50aXJlbHkuIE9ubHkgYW4gb3duZWQtcmVjb3ZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtcnVuIGNhbiBoYXZlIHByaW9yIHN0YXJ0cywgYW5kIHRoYXQgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1bmNvbW1vbiwgc28gcmVzZXJ2ZSB0aGUgTyhuKSBzY2FuIGZvciBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiB3YWxraW5nIHRoZSBncm93aW5nIGxvZyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgaW5saW5lIHN0ZXAgKHdoaWNoIHdvdWxkIGJlIE8obsKyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Jvc3MgYSBsb25nIHNlcXVlbnRpYWwgd29ya2Zsb3cpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdGF0aXZlQXR0ZW1wdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnb3duZWRCeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IG1ldGFkYXRhLm1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXp5IGlubGluZSBzdGFydDogc2VuZCB0aGUgZGVmZXJyZWQgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IG9uIHN0ZXBfc3RhcnRlZCBzbyB0aGUgd29ybGQgY3JlYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCBvbiB0aGUgZmx5LiBBYnNlbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVkLXJlY292ZXJ5IHN0ZXBzLCB3aG9zZSBpbnB1dCBoeWRyYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBleGlzdGluZyBzdGVwIGVudGl0eS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dDogcy5sYXp5U3RlcElucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgb3duZXJzaGlwOiBzdGFtcCAob3IgcmUtc3RhbXApIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbidzIHF1ZXVlIG1lc3NhZ2UgSUQgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCwgc28gd2FrZSByZXBsYXlzIHNlZSB0aGUgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBpbiBmbGlnaHQgaGVyZSBhbmQgc3VwcHJlc3MgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZSByZXF1ZXVlICh3b3JrZmxvdyMyNzgwKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQ6IG1ldGFkYXRhLm1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGZvcmNlIG9wdGltaXN0aWMgc3RhcnQgYW5kIGhvbGQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhenkgc3RlcF9zdGFydGVkIHVudGlsIHRoZSBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgbGFuZHMgKHRoZSBib2R5IHN0aWxsIHJ1bnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkpLiBCb3RoIGFyZSB1bmRlZmluZWQvZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VPcHRpbWlzdGljU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEd1YXJkLWVuZm9yY2VkIGJhdGNoZXMgd2l0aCBhbiBvcGVuIGhvb2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQgdGhlIGNsYWltIGJlZm9yZSBydW5uaW5nIHRoZSBib2R5LCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIDQxMi1mZW5jZWQgc3RlcCBuZXZlciBleGVjdXRlcyB1c2VyIGNvZGUg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBzdXBwcmVzc09wdGltaXN0aWNTdGFydCBhYm92ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uU25hcHNob3Q6IGlubGluZUNsYWltU25hcHNob3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihzdGVwSW5kZXggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeVRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IGxhdGVuY3lUcmFja2luZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihyZXF1ZXN0SW5saW5lRGVsdGEgJiYgZXZlbnRMb2cuY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZURlbHRhU2luY2VDdXJzb3I6IGV2ZW50TG9nLmN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YXJpYW50IGJvb2trZWVwaW5nOiB0aGlzIGludm9jYXRpb24gb3duc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGJvZGllcyB1bnRpbCB0aGV5IHNldHRsZSDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0Tm9JbkZsaWdodE93bmVkU3RlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGlnaHRPd25lZFN0ZXBzLmFkZChzLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgc3RlcHMgYXJlIGJyYW5kLW5ldyAodGhlaXIgY3JlYXRlLWNsYWltXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIGV4YWN0bHktb25jZSBnYXRlKSwgYnV0IGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3Zlcnkgc3RlcCBhbHJlYWR5IGV4aXN0cyBhbmQgaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXllZCBiYWNrc3RvcCBtZXNzYWdlIG1heSBmaXJlIG1pZC1ib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBzYW1lIHByb2Nlc3Mg4oCUIHJvdXRlIHRob3NlIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4tcHJvY2VzcyBzaW5nbGUtZmxpZ2h0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlZC5maW5hbGx5KCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsaWdodE93bmVkU3RlcHMuZGVsZXRlKHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRXhlY3V0aW9uUHJvbWlzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFsZSAoNDEyKSByZWplY3Rpb24gb2YgYW4gaW5saW5lIHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbTogdGhlIGxvYWRlZCB2aWV3IHRoaXMgYmF0Y2ggd2FzIHNjaGVkdWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGlzIG1pc3NpbmcgYW4gZXZlbnQgdGhlIGJhY2tlbmQgYWxyZWFkeSBoYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBjbGFpbSB3YXMgZmVuY2VkIGJ5IHRoZSBndWFyZCBhbmQgbm8gc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgd2VyZSB3cml0dGVuLiBBYmFuZG9uIHRoZSBiYXRjaCDigJQgYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXN0aWMgYm9keSByZXN1bHQgaXMgZGlzY2FyZGVkIGJ5IGV4ZWN1dGVTdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb25jaWxpYXRpb24g4oCUIGFuZCByZXN0YXJ0IHRoZSByZXBsYXkgc28gaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZXMgdGhlIG1pc3NpbmcgZXZlbnQuIFdhaXQgZm9yIHRoZSBzaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbnMgdG8gc2V0dGxlIGZpcnN0IHNvIG5vIG93bmVkIGJvZHkgaXMgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0IHdoZW4gdGhlIHJlc3RhcnQgKG9yIHRoZSBhY2sgcGF0aCkgcnVucy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLmlzKHN0ZXBFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFeGVjdXRpb25Qcm9taXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzaWJsaW5nIHdob3NlIGNsYWltIHdhcyBhY2NlcHRlZCB3cm90ZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIG9mIGl0cyBvd24sIHBvc3NpYmx5IGFmdGVyIHRoZSBXb3JsZCBidWlsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgNDEyJ3MgZGVsdGEg4oCUIHNvIHRoYXQgZGVsdGEgY2FuIG5vIGxvbmdlciBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZWQgdG8gY29tcGxldGUgdGhlIGxvZywgYW5kIHRoZSByZXN0YXJ0IGhhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHJlbG9hZCBpdCBpbiBmdWxsLiBgc2tpcHBlZGAgKHRoZSBzdGVwIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGVkKSwgYGdvbmVgIGFuZCBgdGhyb3R0bGVkYCAoY2xhaW0gcmVqZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvdGUgbm90aGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWJsaW5nV3JvdGUgPSBzZXR0bGVkLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Y29tZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRjb21lLnZhbHVlLnR5cGUgPT09ICdjb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS52YWx1ZS50eXBlID09PSAnZmFpbGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUudmFsdWUudHlwZSA9PT0gJ3JldHJ5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRSZXBsYXlJblByb2Nlc3MoJ2lubGluZS1jbGFpbScsIHN0ZXBFcnIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dEZWx0YTogIXNpYmxpbmdXcm90ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmluYWxseSBiZWxvdyByZXN1bWVzIHRoZSByZXBsYXkgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIG5leHQgaXRlcmF0aW9uIHN0YXJ0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmluYWxseSBiZWxvdyByZXN1bWVzIHRoZSByZXBsYXkgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoaXMgcmV0dXJuIChvciB0aHJvdykgY29tcGxldGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FsYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5saW5lLWNsYWltJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEVyclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZXBFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFnZ3JlZ2F0ZSB0aGUgYmF0Y2ggcmVzdWx0cy4gYHJldHJ5YCBzdGVwcyAod2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZXhpc3Qg4oCUIHRoZWlyIGBzdGVwX3N0YXJ0ZWRgIHN1Y2NlZWRlZCkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1xdWV1ZWQgcGVyLXN0ZXAgYXMgYmFja2dyb3VuZCBzdGVwcyB3aXRoIHRoZWlyIG93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXk7IGB0aHJvdHRsZWRgIHN0ZXBzIChyZWplY3RlZCBvbiB0aGUgY3JlYXRlLWNsYWltLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbmV2ZXIgY3JlYXRlZCkgaW5zdGVhZCBkZWZlciByZWRlbGl2ZXJ5IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHNvIHRoZXkgcmUtcnVuIGlubGluZSB3aXRoIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZXBsYXk7IGNvbXBsZXRlZC9mYWlsZWQgc3RlcHMgYWxyZWFkeSB3cm90ZSB0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgZXZlbnRzLiBXZSBvbmx5IGxvb3AgYmFjayB0byByZXBsYXkgd2hlbiBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIOKAlCBvdGhlcndpc2UgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC1wZW5kaW5nIHN0ZXBzIHdpbGwgYmUgcmUtcnVuIGJ5IHRoZWlyIHF1ZXVlZCByZXRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMgYW5kIHRoZSBiYWNrZ3JvdW5kLXN0ZXAgcGF0aCByZXBsYXlzIG9uY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBzdGVwcyBhcmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvUmV0cnk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogKHR5cGVvZiBpbmxpbmVFeGVjdXRpb25zKVtudW1iZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFueVBlbmRpbmdPcHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdGhyb3R0bGVkIGlubGluZSBzdGVwIGRlbGF5cyByZWRlbGl2ZXJ5IG9mIFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHJhdGhlciB0aGFuIGJlaW5nIHJlLXF1ZXVlZCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAuIENydWNpYWxseSwgYSBgdGhyb3R0bGVkYCByZXN1bHQgbWVhbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIHdhcyByZWplY3RlZCBvbiB0aGUgYXRvbWljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0g4oCUIHNvIHRoZSBzdGVwIHdhcyBORVZFUiBjcmVhdGVkIChub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfY3JlYXRlZGAsIG5vIHN0ZXAgZW50aXR5KS4gUmUtcXVldWluZyBpdCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAgd291bGQgc2VuZCBhIGJhcmUgYHN0ZXBfc3RhcnRlZGAgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCksIHdoaWNoIHRoZSB3b3JsZCByZWplY3RzIHdpdGggYFN0ZXAgXCI8aWQ+XCIgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZGAgYmVjYXVzZSBpdCBjYW5ub3QgbGF6aWx5IGNyZWF0ZSB0aGUgc3RlcCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5wdXQ7IHRoYXQgZXJyb3IgaXNuJ3QgdHJhbnNsYXRhYmxlLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmVkZWxpdmVycyB1bnRpbCBNQVhfUVVFVUVfREVMSVZFUklFUyBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIChhbmQgcnVuKSBmYWlsLiBEZWZlcnJpbmcgcmVkZWxpdmVyeSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBpbnN0ZWFkIHJlLWF0dGVtcHRzIHRoZSB0aHJvdHRsZWQgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIFdJVEggaXRzIGlucHV0IG9uIHJlcGxheS4gV2UgdHJhY2sgdGhlIGxvbmdlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tvZmYgc28gYSBiYXRjaCB3aXRoIG11bHRpcGxlIHRocm90dGxlcyB3YWl0cyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heC4gTm90ZTogYHJldHJ5YCByZXN1bHRzIGFyZSBzYWZlIHRvIHJlLXF1ZXVlIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIGJlY2F1c2UgYSByZXRyeSBpbXBsaWVzIGBzdGVwX3N0YXJ0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHN1Y2NlZWRlZCBhbmQgdGhlIHN0ZXAgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRocm90dGxlVGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmxpbmVFeGVjdXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBzdGVwUmVzdWx0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGlubGluZUV4ZWN1dGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogci50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVvdXQgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudGltZW91dFNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55UGVuZGluZ09wcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocm90dGxlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmVyIHJlZGVsaXZlcnkgb2YgdGhlIG9yY2hlc3RyYXRvciBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3R0bGUgYmFja29mZi4gT24gcmVwbGF5IGV2ZXJ5IG5vbi10ZXJtaW5hbCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHJlLWRpc3BhdGNoZWQgYnkgdGhlIHN1c3BlbnNpb24gaGFuZGxlcjogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsLXRocm90dGxlZCBzdGVwcyBydW4gaW5saW5lIGFnYWluIFdJVEggdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgKHRoZWlyIGBzdGVwX2NyZWF0ZWRgIGlzIGRlZmVycmVkIGFuZXcpLCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IGByZXRyeWAgc3RlcHMgaW4gdGhpcyBiYXRjaCBhcmUgcXVldWVkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd24gcmV0cnlBZnRlciBob25vcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hbCBzdGVwcyAoY29tcGxldGVkL2ZhaWxlZC9za2lwcGVkL2dvbmUpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlZCBmcm9tIHRoZWlyIGV2ZW50cyBhbmQgbm90IHJlLXJ1bi4gQmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGRyaXZlcyBhbGwgcmVtYWluaW5nIHdvcmssIHdlIG11c3QgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gcmUtcXVldWUgYHRvUmV0cnlgIGhlcmUg4oCUIHRoYXQgd291bGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlLWRpc3BhdGNoIHRob3NlIHN0ZXBzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHJldHVybnMgQkVGT1JFIHRoZSBgYW55UGVuZGluZ09wc2AgYnJhbmNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93LCBzbyBhIGJhdGNoIHRoYXQgbWl4ZXMgYSB0aHJvdHRsZSB3aXRoIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkIHN0ZXAgdGhhdCBsZWZ0IHVuZmx1c2hlZCBvcHMgZG9lcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgdGhlIGV4cGxpY2l0IGZsdXNoIGNvbnRpbnVhdGlvbi4gVGhhdCBpcyBzYWZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHRocm90dGxlIGJhY2tvZmYgKD49IDFzKSBhbHdheXMgZXhjZWVkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4taW52b2NhdGlvbiBmbHVzaCB3aW5kb3cgKDw9IDUwMG1zICsgd2FpdFVudGlsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gb3BzIHNldHRsZSBiZWZvcmUgdGhlIHBvc3QtYmFja29mZiByZWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheXMgYW5kIHJlYWRzIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSh0aHJvdHRsZVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9SZXRyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldHJ5VHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5Lm1hcCgoeyBzdGVwLCBkZWxheVNlY29uZHMgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogcmV0cnlUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IHRoZSBkZWxheWVkIHJldHJ5IG9uIHRoZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWxhdGlvbklkIHNvIGl0IGRlZHVwZXMgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZXllZCByZS1kaXNwYXRjaCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyZm9ybXMgb24gcmVwbGF5IChpdCBhbHNvIHVzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZGApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCBhIG1peGVkIGJhdGNoIHdoZXJlIG9uZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNvbXBsZXRlZGAgd2l0aCB1bmZsdXNoZWQgYmFja2dyb3VuZCBvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoYGFueVBlbmRpbmdPcHNgKSBhbmQgYW5vdGhlciBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgd291bGQgZG91YmxlLWRpc3BhdGNoIHRoZSByZXRyeTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaCBiZWxvdyBxdWV1ZXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgcGxhaW4gY29udGludWF0aW9uLCB3aG9zZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVzIHRoZSBzdGlsbC1gcmV0cnlpbmdgIHN0ZXAgYXMgcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZS1kaXNwYXRjaGVzIGl0ICppbW1lZGlhdGVseSogYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKndpdGgqIGEga2V5LiBTaW5jZSB0aGlzIGRlbGF5ZWQgcmV0cnkgaGFkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8ga2V5LCB0aGUgdHdvIG1lc3NhZ2VzIHdvdWxkbid0IGRlZHVwZSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCB3b3VsZCBydW4gdHdpY2UsIHRoZSBjb25maWd1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYmFja29mZiB3b3VsZCBiZSBpZ25vcmVkIChwbGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFcnJvcmAgcmV0cmllcyBwZXJzaXN0IG5vIGByZXRyeUFmdGVyYCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd29ybGQgaGFzIG5vIGBUb29FYXJseWAgZ3VhcmQpLCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYm9keSBjb3VsZCBydW4gZWFybHkvY29uY3VycmVudGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYXJpbmcgdGhlIGtleSBsZXRzIHRoZSBlYXJsaWVyIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHdpbiwgaG9ub3JpbmcgdGhlIGJhY2tvZmYuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHBlbmRpbmcgYmFja2dyb3VuZCBvcGVyYXRpb25zIGZsdXNoIGJlZm9yZSB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHJlYWRzIHRoZWlyIHJlc3VsdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW55UGVuZGluZ09wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCcmVha2luZyBsb29wOiBpbmxpbmUgc3RlcCBoYXMgcGVuZGluZyBvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGxvb3BJdGVyYXRpb24gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGlubGluZSBzdGVwcyB3aWxsIGJlIHJlLXJ1biB2aWEgdGhlaXIgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IG1lc3NhZ2VzOyB0aGUgYmFja2dyb3VuZC1zdGVwIHBhdGggcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFsbCBzdGVwcyBhcmUgdGVybWluYWwuIERvbid0IGxvb3AgaGVyZSDigJQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHN0ZXBzIGhhdmUgbm8gdGVybWluYWwgZXZlbnQgdG8gb2JzZXJ2ZSB5ZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIGlubGluZSBzdGVwcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSkg4oCUIGxvb3AgYmFjayB0byByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGUgd29ya2Zsb3cgb2JzZXJ2ZXMgdGhlIHRlcm1pbmFsIGV2ZW50cyBvbiByZXBsYXkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIGFueSBpbmxpbmUgZGVsdGEuIElmIGl0IGlzIHBhcnRpYWwsIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGl0cyBjdXJzb3IgaW5zdGVhZCBvZiByZWFkaW5nIHRoZSBwYWdlIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ubHkgPSBzdGVwUmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHkudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiYgb25seS5pbmxpbmVEZWx0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBvbmx5LmlubGluZURlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG9ubHkuaW5saW5lRGVsdGEuaGFzTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXh0RXZlbnRMb2dMb2FkKGV2ZW50TG9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiBvZiBhIGd1YXJkZWQgd3JpdGUgbWFkZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgYnkgdGhlIHJlcGxheSBsb29wIOKAlCB0aGUgcmVzdWx0LWJlYXJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBydW5fY29tcGxldGVkYCwgb3IgdGhlIGB3YWl0X2NvbXBsZXRlZGAgb2YgdGhlIHdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MuIEJvdGggcmVhY2ggdGhpcyBvbmUgY2F0Y2ggYW5kIHRoZSByZWplY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHNheSB3aGljaCwgaGVuY2UgdGhlIG5ldXRyYWwgbGFiZWwuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWl0aGVyIG1heSBiZSByZS1wb3N0ZWQgaW4gcGxhY2U6IHRoZSBjb3JyZWxhdGlvbiBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIChmb3IgcnVuX2NvbXBsZXRlZCkgdGhlIHJlc3VsdCBpdHNlbGYgY2FtZSBmcm9tXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcGxheSwgYW5kIGEgY29ycmVjdGVkIGxvZyBtYXkgcHJvZHVjZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IG9uZXMuIERvbid0IGZhaWwgdGhlIHJ1biDigJQgcmVzdGFydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBpbiB0aGlzIGludm9jYXRpb24sIGFuZCBvbmx5IG9uY2UgdGhhdCBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHNwZW50IHNjaGVkdWxlIGFuIGV4cGxpY2l0IHJlLWludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRocm93aW5nIGluc3RlYWQgd291bGQgcmVseSBvbiByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1VSUkVOVCBtZXNzYWdlLCB3aGljaCB0aGUgdHVyYm8gcGF0aCBoYXMgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNrZWQg4oCUIGVtcGlyaWNhbGx5IHRoZSBydW4gdGhlbiBzdGFsbHMgZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUncyB+MzAwcyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVybWluYWxFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0YXJ0UmVwbGF5SW5Qcm9jZXNzKCdyZXBsYXktd3JpdGUnLCBlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9IGF3YWl0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwbGF5LXdyaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FsYXRpb24ucmVpbnZva2VkKSByZXR1cm4gZXNjYWxhdGlvbi5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBlci1ydW4gYnVkZ2V0IHNwZW50LiBGYWxsIHRocm91Z2ggdG8gdGhlIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggYmVsb3cgaW5zdGVhZCBvZiByZXRocm93aW5nOiB0aGlzIGNhdGNoIG93bnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGluZyB0aGUgcnVuLCBhbmQgYSByZXRocm93IHdvdWxkIGVzY2FwZSB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgaGFuZGxlciBhbmQgYmUgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IgPSBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZXMgdGFsa2luZyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkICh3b3JrZmxvdy1zZXJ2ZXIpIOKAlCBhbiBleGhhdXN0ZWQgUmV0cnlBZ2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFVORF9FUlJfUkVRX1JFVFJZIGZyb20gYSBzdXN0YWluZWQgNDI5LzUwMyBzdG9ybSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGRyb3BwZWQgc29ja2V0LCBhIGNvbm5lY3QvRE5TIGZhaWx1cmUsIG9yIGEgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0IOKAlCBtdXN0IE5PVCBmYWlsIHRoZSBydW4uIFJldGhyb3cgc28gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJzIGFuZCBhIGZyZXNoIGludm9jYXRpb24gcmV0cmllcyB0aGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIHRoZSBiYWNrZW5kIHJlY292ZXJzLiBUaGUgQHZlcmNlbC9xdWV1ZSBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWVzIGEgZmFzdCAoMXPihpI2MHMpIGJhY2tvZmYgYnkgZGVsaXZlcnkgY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZGluZyB0aGUgfjVtaW4gZGVmYXVsdCB2aXNpYmlsaXR5LXRpbWVvdXQgcmVkcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGFuZCBuZXZlciBraWxsaW5nIHRoZSBwcm9jZXNzIHZpYSBydW5fZmFpbGVkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Mb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJhbnNpZW50IHdvcmxkIGVycm9yIGR1cmluZyByZXBsYXk7IHJlZGVsaXZlcmluZyB2aWEgcXVldWUgaW5zdGVhZCBvZiBmYWlsaW5nIHRoZSBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXBsYXlEaXZlcmdlbmNlRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZlcmdlbmNlQ291bnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBsYXlEaXZlcmdlbmNlPy5jb3VudCA/PyAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFJlY292ZXJ5UmVwbGF5cyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGl2ZXJnZW5jZUNvdW50IDw9IG1heFJlY292ZXJ5UmVwbGF5cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJlcGxheSBkaXZlcmdlZDsgcXVldWVpbmcgYSByZWNvdmVyeSByZXBsYXkgYmVmb3JlIGRlY2xhcmluZyB0aGUgZXZlbnQgbG9nIGNvcnJ1cHRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLlJFUExBWV9ESVZFUkdFTkNFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlRXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yRGl2ZXJnZW5jZUV2ZW50SWQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZT8uZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlY292ZXJ5UmVwbGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IGRpdmVyZ2VuY2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmUgPSBkaXZlcmdlbmNlQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IgPSBuZXcgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkICR7ZGl2ZXJnZW5jZUNvdW50fSB0aW1lcyBhZnRlciAke21heFJlY292ZXJ5UmVwbGF5c30gcmVjb3ZlcnkgcmVwbGF5czsgbGF0ZXN0IGRpdmVyZ2VudCBldmVudCB3YXMgJHtlcnIuZXZlbnRJZH0uIExhc3QgZGl2ZXJnZW5jZTogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcGxheVN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgY29kZSBlcnJvcnMgYW5kIHRlcm1pbmFsIHJ1bnRpbWUgZXJyb3JzIGZhaWwgdGhlIHJ1bi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8ucmVjb3JkRXhjZXB0aW9uPy4odGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFcnJvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5vcm1hbGl6ZVVua25vd25FcnJvcih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5uYW1lIHx8IGdldEVycm9yTmFtZSh0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yU3RhY2sgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkRXJyb3Iuc3RhY2sgfHwgZ2V0RXJyb3JTdGFjayh0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsYXNzaWZ5IHRoZSBlcnJvcjogV29ya2Zsb3dSdW50aW1lRXJyb3IgaW5kaWNhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBTREsvcnVudGltZSBpc3N1ZSwgYW5kIHNlbGVjdGVkIHN1YmNsYXNzZXMgdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHNwZWNpZmljIGNvZGVzIGZvciBiYWNrZW5kIHRyYWNraW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcih0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcignRXJyb3Igd2hpbGUgcnVubmluZyB3b3JrZmxvdycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBzb3VyY2UtbWFwLXJlbWFwcGVkIHN0YWNrIHRvIHRoZSB0aHJvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHNvIHRoYXQgdGhlIHNlcmlhbGl6ZWQgZXJyb3IgcHJlc2VydmVzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY29uc3VtZXJzLiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCBpcyB1c2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGBlcnIgaW5zdGFuY2VvZiBFcnJvcmAgYmVjYXVzZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IHJ1bnMgaW4gYSBzZXBhcmF0ZSBWTSByZWFsbSDigJQgaXRzIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzcyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBob3N0J3MsIHNvIGBpbnN0YW5jZW9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFcnJvcmAgaXMgYGZhbHNlYCBmb3IgVk0tdGhyb3duIGVycm9ycy4gVGhlIFY4XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIHRhZyB3b3JrcyBhY3Jvc3MgcmVhbG1zLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzLmlzTmF0aXZlRXJyb3IodGVybWluYWxFcnJvcikgJiYgZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAodGVybWluYWxFcnJvciBhcyBFcnJvcikuc3RhY2sgPSBlcnJvclN0YWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsIHRoZSB3b3JrZmxvdyBydW4gdmlhIGV2ZW50IChldmVudC1zb3VyY2VkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIHNvIGl0cyBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIGlkZW50aXR5IGFuZCBjdXN0b20gcHJvcGVydGllcyByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlY29uZGl0aW9uLWd1YXJkIGFzeW1tZXRyeTogdW5saWtlIGBydW5fY29tcGxldGVkYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGVybWluYWwgYHJ1bl9mYWlsZWRgIHNlbmRzIG5vIGBzdGF0ZVVwZGF0ZWRBdGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90LCBzbyBpdCBpcyBuZXZlciA0MTItcmVqZWN0ZWQgZXZlbiBpZiBhIGhvb2tcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhbmRlZCBtaWQtcmVwbGF5IGFuZCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIHBhdGggdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZXcuIFRoaXMgaXMgaW50ZW50aW9uYWwgYW5kIGZhaWwtb3BlbjogYSBzcHVyaW91c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSBpcyByZWNvdmVyYWJsZSAodGhlIHJ1biBjYW4gYmUgcmUtcnVuIGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXNoYm9hcmQpLCB3aGVyZWFzIGEgc3B1cmlvdXMgKmNvbXBsZXRpb24qIGNvbW1pdHMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvbmcgcmVzdWx0LiBHdWFyZGluZyB0aGlzIHdyaXRlIHN5bW1ldHJpY2FsbHkgd291bGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gbmVlZCB0aGUgbG9hZGVkIGV2ZW50IGxvZywgd2hpY2ggaXMgc2NvcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IGB0cnlgIGFib3ZlIGFuZCBub3QgYXZhaWxhYmxlIGluIHRoaXMgY2F0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogb3JkZXIgdGhlIHRlcm1pbmFsIHdyaXRlIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2VDb3VudDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZhaWxFcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuXG4gIGxldCBjYWNoZWRIYW5kbGVyOiAoKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4pIHwgdW5kZWZpbmVkO1xuICBsZXQgaW52b2NhdGlvbkNvdW50ID0gMDtcbiAgY29uc3QgZW50cnlwb2ludENyZWF0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJvdXRlTW9kdWxlQm9keUluaXRNcyA9XG4gICAgdHlwZW9mIG9wdGlvbnM/LnJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdCA9PT0gJ251bWJlcidcbiAgICAgID8gZW50cnlwb2ludENyZWF0ZWRBdCAtIG9wdGlvbnMucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gd2l0aEhlYWx0aENoZWNrKGFzeW5jIChyZXEpID0+IHtcbiAgICBpbnZvY2F0aW9uQ291bnQgKz0gMTtcbiAgICBjb25zdCBoYW5kbGVyQ2FjaGVkID0gY2FjaGVkSGFuZGxlciAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ1NFUlZFUicpO1xuXG4gICAgcmV0dXJuIHRyYWNlKFxuICAgICAgJ3dvcmtmbG93LnJvdXRlLmZsb3cnLFxuICAgICAge1xuICAgICAgICBraW5kOiBzcGFuS2luZCxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlVHlwZSgnZmxvdycpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5GYWFzSW5zdGFuY2UoQ09NUFVURV9JTlNUQU5DRV9JRCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVIYW5kbGVyQ2FjaGVkKGhhbmRsZXJDYWNoZWQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlSW52b2NhdGlvbkNvdW50KGludm9jYXRpb25Db3VudCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVFbnRyeXBvaW50QWdlTXMoXG4gICAgICAgICAgICBEYXRlLm5vdygpIC0gZW50cnlwb2ludENyZWF0ZWRBdFxuICAgICAgICAgICksXG4gICAgICAgICAgLi4uKHJvdXRlTW9kdWxlQm9keUluaXRNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IEF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlTW9kdWxlQm9keUluaXRNcyhyb3V0ZU1vZHVsZUJvZHlJbml0TXMpKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSHR0cFJlcXVlc3RNZXRob2QocmVxLm1ldGhvZCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkh0dHBSb3V0ZSgnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cnKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICBpZiAoIWNhY2hlZEhhbmRsZXIpIHtcbiAgICAgICAgICBjYWNoZWRIYW5kbGVyID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LnJvdXRlLmluaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3b3JsZEhhbmRsZXJzID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICd3b3JrZmxvdy5yb3V0ZS5nZXRfd29ybGRfaGFuZGxlcnMnLFxuICAgICAgICAgICAgICBhc3luYyAoKSA9PiBnZXRXb3JsZEhhbmRsZXJzKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlcih3b3JsZEhhbmRsZXJzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2FjaGVkSGFuZGxlcihyZXEpO1xuICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICBBdHRyaWJ1dGUuSHR0cFJlc3BvbnNlU3RhdHVzQ29kZShyZXNwb25zZS5zdGF0dXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59XG4iXX0=