@workflow/core 5.0.0-beta.50 → 5.0.0-beta.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +5 -0
  2. package/dist/events-consumer.d.ts +26 -0
  3. package/dist/events-consumer.d.ts.map +1 -1
  4. package/dist/events-consumer.js +28 -1
  5. package/dist/flushable-stream.d.ts +41 -0
  6. package/dist/flushable-stream.d.ts.map +1 -1
  7. package/dist/flushable-stream.js +169 -1
  8. package/dist/log-format.js +13 -6
  9. package/dist/replay-divergence.d.ts +25 -0
  10. package/dist/replay-divergence.d.ts.map +1 -0
  11. package/dist/replay-divergence.js +61 -0
  12. package/dist/runtime/helpers.d.ts +75 -1
  13. package/dist/runtime/helpers.d.ts.map +1 -1
  14. package/dist/runtime/helpers.js +129 -2
  15. package/dist/runtime/quickjs-entrypoint.d.ts +30 -8
  16. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  17. package/dist/runtime/quickjs-entrypoint.js +209 -32
  18. package/dist/runtime/quickjs-log-view.d.ts +129 -0
  19. package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
  20. package/dist/runtime/quickjs-log-view.js +229 -0
  21. package/dist/runtime/step-executor.d.ts +2 -21
  22. package/dist/runtime/step-executor.d.ts.map +1 -1
  23. package/dist/runtime/step-executor.js +85 -80
  24. package/dist/runtime/suspension-handler.d.ts +0 -22
  25. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  26. package/dist/runtime/suspension-handler.js +126 -75
  27. package/dist/runtime.d.ts.map +1 -1
  28. package/dist/runtime.js +262 -91
  29. package/dist/serialization.d.ts +2 -2
  30. package/dist/serialization.d.ts.map +1 -1
  31. package/dist/serialization.js +16 -13
  32. package/dist/step/context-storage.d.ts +2 -0
  33. package/dist/step/context-storage.d.ts.map +1 -1
  34. package/dist/step/context-storage.js +1 -1
  35. package/dist/step/writable-stream.d.ts.map +1 -1
  36. package/dist/step/writable-stream.js +14 -10
  37. package/dist/telemetry/semantic-conventions.d.ts +36 -0
  38. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  39. package/dist/telemetry/semantic-conventions.js +23 -1
  40. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  41. package/dist/test-support/orchestrator-context.js +8 -2
  42. package/dist/version.d.ts +1 -1
  43. package/dist/version.js +2 -2
  44. package/dist/workflow.d.ts.map +1 -1
  45. package/dist/workflow.js +8 -3
  46. package/docs/foundations/streaming.mdx +1 -1
  47. package/docs/how-it-works/event-sourcing.mdx +27 -0
  48. package/package.json +6 -6
@@ -2,7 +2,8 @@ import assert from 'node:assert/strict';
2
2
  import { types } from 'node:util';
3
3
  import { EntityConflictError, FatalError, RetryableError, RunExpiredError, SerializationError, ThrottleError, TooEarlyError, WorkflowRuntimeError, } from '@workflow/errors';
4
4
  import { createWorkflowBaseUrl, pluralize, stepDisplayName, } from '@workflow/utils';
5
- import { requireEventSlot, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_COMPRESSION, } from '@workflow/world';
5
+ import { SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_COMPRESSION, } from '@workflow/world';
6
+ import { envNumber } from '@workflow/world/env-config';
6
7
  import { runtimeLogger, stepLogger } from '../logger.js';
7
8
  import { getStepFunction } from '../private.js';
8
9
  import { formatSerializationError } from '../serialization/errors.js';
@@ -14,13 +15,50 @@ import { getErrorName, getErrorStack, normalizeUnknownError, promoteAbortErrorTo
14
15
  import { COMPUTE_INSTANCE_ID } from './compute-instance.js';
15
16
  import { isOptimisticInlineStartEnabled, isOptimisticInlineStartExplicitlyDisabled, } from './constants.js';
16
17
  import { getPortLazy } from './get-port-lazy.js';
17
- import { maxEventSlot, memoizeEncryptionKey, } from './helpers.js';
18
+ import { memoizeEncryptionKey } from './helpers.js';
18
19
  import { ReplayRecoveryReporter } from './replay-recovery-reporter.js';
19
20
  import { computeResumeTtrAttributes, } from './resume-latency.js';
20
21
  import { computeStepLatencyEventData, } from './step-latency.js';
21
22
  import { isUnserializableStepInputPlaceholder } from './unserializable-step.js';
22
23
  import { safeWaitUntil } from './wait-until.js';
23
24
  export const DEFAULT_STEP_MAX_RETRIES = 3;
25
+ export const STEP_STREAM_DRAIN_TIMEOUT_MS = 30_000;
26
+ export function getStepStreamDrainTimeoutMs() {
27
+ return envNumber('WORKFLOW_STEP_STREAM_DRAIN_TIMEOUT_MS', STEP_STREAM_DRAIN_TIMEOUT_MS, { integer: true, min: 1 });
28
+ }
29
+ function isClientDisconnectError(error) {
30
+ const name = error?.name;
31
+ return name === 'AbortError' || name === 'ResponseAborted';
32
+ }
33
+ async function settleReleasedStepStreams(states) {
34
+ if (states.length === 0)
35
+ return;
36
+ const timeoutMs = getStepStreamDrainTimeoutMs();
37
+ let timeout;
38
+ try {
39
+ await Promise.race([
40
+ Promise.all(states.map((state) => (state.settleReleasedWrites?.() ?? Promise.resolve(false)).catch((error) => {
41
+ // A disconnected client may abandon one response stream, but it
42
+ // must not let that rejection bypass durability waits for other
43
+ // streams written by the same step.
44
+ if (!isClientDisconnectError(error))
45
+ throw error;
46
+ return false;
47
+ }))),
48
+ new Promise((_, reject) => {
49
+ timeout = setTimeout(() => reject(new WorkflowRuntimeError(`Timed out draining step stream writes after ${timeoutMs}ms`)), timeoutMs);
50
+ }),
51
+ ]);
52
+ }
53
+ catch (error) {
54
+ if (!isClientDisconnectError(error))
55
+ throw error;
56
+ }
57
+ finally {
58
+ if (timeout !== undefined)
59
+ clearTimeout(timeout);
60
+ }
61
+ }
24
62
  /**
25
63
  * Extract the inline delta from a step-terminal `events.create` result,
26
64
  * if the World populated one. A delta is only meaningful when the caller
@@ -57,53 +95,16 @@ export async function executeStep(params) {
57
95
  // Gate payload compression on the run's specVersion.
58
96
  const compression = (params.runSpecVersion ?? 0) >= SPEC_VERSION_SUPPORTS_COMPRESSION;
59
97
  const replayRecoveryReporter = params.replayRecoveryReporter ?? ReplayRecoveryReporter.inert();
60
- /**
61
- * The highest log slot this executor knows about, seeded from the view its
62
- * caller scheduled the step against and advanced by every event it commits.
63
- *
64
- * Advancing is what keeps the snapshot honest across a step's own writes. A
65
- * step commits `step_started` and then `step_completed`; if the second still
66
- * named the caller's original position, the World would report the first one
67
- * back as an event this writer had not seen, on every step, forever.
68
- *
69
- * This reads a report for its highest position and then discards it, where
70
- * the replay loop and the suspension handler merge theirs with
71
- * `absorbSkippedSlotReport`. That is the difference between the callers, not
72
- * an oversight: an executor holds no loaded log to merge into. It runs from a
73
- * queued delivery whose only view of the log is the integer its caller passed
74
- * in, so the position is the entire value the report has to it. Whoever
75
- * replays next loads the log and gets the events themselves.
76
- */
77
- let knownSlot = params.slotSnapshot?.eventCount;
78
- const observeSlot = (result) => {
79
- if (knownSlot === undefined) {
80
- // The caller scheduled this step without naming a position, so there is
81
- // no snapshot to advance and the writes below send none. Not the same as
82
- // a run without positions: every run has them, this executor was not
83
- // told which one it started from.
84
- return;
85
- }
86
- const observed = [];
87
- if (result.event) {
88
- observed.push(requireEventSlot(result.event.eventId));
89
- }
90
- const reported = maxEventSlot(result.events ?? []);
91
- if (reported !== undefined) {
92
- observed.push(reported);
93
- }
94
- for (const slot of observed) {
95
- if (slot > knownSlot) {
96
- knownSlot = slot;
97
- }
98
- }
99
- };
100
- const createEvent = async (data, eventParams) => {
101
- const result = await replayRecoveryReporter.withEventCreate(knownSlot === undefined
102
- ? eventParams
103
- : { eventCount: knownSlot, ...eventParams }, (p) => world.events.create(workflowRunId, data, p));
104
- observeSlot(result);
105
- return result;
106
- };
98
+ // Executor writes carry no slot snapshot (`CreateEventParams.eventCount`).
99
+ // The only thing a World does with one is bump-and-report: when the write
100
+ // lands above the position named, it reads the events in between and hands
101
+ // them back. The replay loop and the suspension handler merge that page into
102
+ // their loaded log; this executor has no log to merge into, so the page was
103
+ // read only to be discarded, and in production that read fell on a third of
104
+ // all `step_started` writes. Omitting the count is the documented shape for
105
+ // a caller with no loaded log to be stale against, and the conditional
106
+ // write on (runId, correlationId) remains the ownership fence.
107
+ const createEvent = async (data, eventParams) => replayRecoveryReporter.withEventCreate(eventParams, (p) => world.events.create(workflowRunId, data, p));
107
108
  // `step_started` identifies the invocation that performed this attempt.
108
109
  // Keep request and compute provenance independent: world-vercel serializes
109
110
  // requestId as analytics `vercelId`, while computeInstanceId identifies the
@@ -359,10 +360,17 @@ export async function executeStep(params) {
359
360
  (isOptimisticInlineStartEnabled() ||
360
361
  (params.forceOptimisticStart === true &&
361
362
  !isOptimisticInlineStartExplicitlyDisabled()));
363
+ // Keep this on the enclosing step span from the beginning so a losing
364
+ // claim retains the strategy after the 409 is reconciled as `skipped`.
365
+ // Bare background starts and owned recovery deliberately have no value.
366
+ if (params.preclaimedStart) {
367
+ span?.setAttributes(Attribute.StepStartStrategy('batch_preclaimed'));
368
+ }
369
+ else if (params.lazyStepInput !== undefined) {
370
+ span?.setAttributes(Attribute.StepStartStrategy(optimisticStart ? 'optimistic' : 'awaited'));
371
+ }
362
372
  let step;
363
- // Params for the `step_started` create on either path below. The slot
364
- // snapshot is not spread here: `createEvent` attaches it to every write,
365
- // this one included.
373
+ // Params for the `step_started` create on either path below.
366
374
  const startEventParams = stepStartedEventParams;
367
375
  // `Date.now()` taken immediately before the `step_started` create is
368
376
  // issued (either path below); anchors RSFS's end point. See
@@ -433,10 +441,9 @@ export async function executeStep(params) {
433
441
  : {}),
434
442
  },
435
443
  },
436
- // Guard the claim; see StepExecutorParams.slotSnapshot. A
437
- // stale (412) rejection surfaces via reconcileOptimisticStart as a
438
- // non-translatable error: the body result is discarded and the
439
- // rejection propagates to the caller.
444
+ // A 412 rejection from a fencing World surfaces via
445
+ // reconcileOptimisticStart as a non-translatable error: the body
446
+ // result is discarded and the rejection propagates to the caller.
440
447
  startEventParams);
441
448
  });
442
449
  optimisticStartSettled = startedPromise.then(() => ({ ok: true }), (err) => ({ ok: false, err }));
@@ -486,10 +493,9 @@ export async function executeStep(params) {
486
493
  }
487
494
  : { stepName, ...ownershipStamp },
488
495
  },
489
- // Guard the claim; see StepExecutorParams.slotSnapshot. A
490
- // stale (412) rejection is intentionally NOT translated by
491
- // startErrorToResult below, so it propagates to the caller for a
492
- // fresh replay.
496
+ // A 412 rejection from a fencing World is intentionally NOT
497
+ // translated by startErrorToResult below, so it propagates to the
498
+ // caller for a fresh replay.
493
499
  startEventParams);
494
500
  stepClaimCompletedAtMs = Date.now();
495
501
  step = startResult.step;
@@ -572,6 +578,7 @@ export async function executeStep(params) {
572
578
  // outside the try so the failure path below can also drain them.
573
579
  const preCompletionOps = [];
574
580
  const ops = [];
581
+ const streamStates = [];
575
582
  let opsSettled = true;
576
583
  // Latency telemetry to attach to this step's terminal event. Computed
577
584
  // right before user code runs; declared here so the failure path (the
@@ -613,7 +620,7 @@ export async function executeStep(params) {
613
620
  const encryptionKey = params.encryptionKey ?? (await getEncryptionKey());
614
621
  const hydratedInput = await trace('step.hydrate', {}, async (hydrateSpan) => {
615
622
  const startTime = Date.now();
616
- const hydrated = await hydrateStepArguments(step.input, workflowRunId, encryptionKey, ops, globalThis, {}, params.workflowDeploymentId);
623
+ const hydrated = await hydrateStepArguments(step.input, workflowRunId, encryptionKey, ops, globalThis, {}, params.workflowDeploymentId, streamStates);
617
624
  const durationMs = Date.now() - startTime;
618
625
  hydrateSpan?.setAttributes({
619
626
  ...Attribute.StepArgumentsCount(hydrated.args.length),
@@ -735,6 +742,7 @@ export async function executeStep(params) {
735
742
  rootRunId: params.rootRunId,
736
743
  ops,
737
744
  preCompletionOps,
745
+ streamStates,
738
746
  closureVars: hydratedInput.closureVars,
739
747
  encryptionKey,
740
748
  // Turbo optimistic start runs this body before `run_started` is
@@ -791,21 +799,12 @@ export async function executeStep(params) {
791
799
  });
792
800
  return dehydrated;
793
801
  });
794
- // Flush pending ops (stream writes, etc.) with a short inline wait.
795
- // WorkflowServerWritableStream acks writes on buffer entry
796
- // (group-commit batching); durability is enforced by its drain
797
- // barrier, which the flushable state's completion awaits after
798
- // lock release. Most ops settle within ~200ms (lock-release
799
- // polling + one batched HTTP flush).
800
- // If ops don't settle in 500ms (e.g., WritableStream kept open
801
- // across steps), waitUntil handles the rest.
802
+ // Arm the background flush before the durability wait so lock-held
803
+ // streams and late close/writes keep their existing lifecycle even if a
804
+ // drain fails. The drain snapshots only frames produced by this step and
805
+ // does not depend on writer-lock release.
802
806
  if (ops.length > 0) {
803
807
  const opsPromise = Promise.all(ops);
804
- // The race below surfaces failures inline when ops settle quickly;
805
- // if the 500ms timeout wins, the failure is only observed here. The
806
- // promise handed to waitUntil must never reject (an unconsumed
807
- // waitUntil rejection crashes the process as unhandledRejection),
808
- // so unexpected failures are logged instead.
809
808
  safeWaitUntil(opsPromise, (err) => {
810
809
  runtimeLogger.warn('Background flush of step stream ops failed', {
811
810
  workflowRunId,
@@ -813,17 +812,23 @@ export async function executeStep(params) {
813
812
  error: err instanceof Error ? err.message : String(err),
814
813
  });
815
814
  });
816
- opsSettled = await Promise.race([
815
+ // Start the V2 inline-loop heuristic concurrently with durability so
816
+ // a held lock costs max(500ms, PUT RTT), not 500ms plus the PUT RTT.
817
+ const opsSettledPromise = Promise.race([
817
818
  opsPromise.then(() => true, (err) => {
818
- // Ignore expected client disconnect errors (e.g., browser
819
- // refresh during streaming)
820
- const isAbortError = err?.name === 'AbortError' || err?.name === 'ResponseAborted';
821
- if (isAbortError)
819
+ if (isClientDisconnectError(err))
822
820
  return true;
823
821
  throw err;
824
822
  }),
825
823
  new Promise((r) => setTimeout(() => r(false), 500)),
826
824
  ]);
825
+ // The durability wait can outlive an immediate op rejection. Observe
826
+ // this branch now; the awaited copy below still surfaces the error.
827
+ opsSettledPromise.catch(() => { });
828
+ await settleReleasedStepStreams(streamStates);
829
+ // This outcome is only the inline-loop heuristic. Durability was
830
+ // established independently above.
831
+ opsSettled = await opsSettledPromise;
827
832
  }
828
833
  // Optimistic start: the body ran before `step_started` was confirmed.
829
834
  // Reconcile it now: if we lost the create-claim (or the run is
@@ -1110,4 +1115,4 @@ export async function executeStep(params) {
1110
1115
  return { type: 'completed', hasPendingOps: !opsSettled, inlineDelta };
1111
1116
  });
1112
1117
  }
1113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3N0ZXAtZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sb0JBQW9CLENBQUM7QUFDeEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixhQUFhLEVBQ2IsYUFBYSxFQUNiLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsU0FBUyxFQUNULGVBQWUsR0FDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQVV6QixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixpQ0FBaUMsR0FDbEMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixvQkFBb0IsRUFDcEIsZ0JBQWdCLEdBQ2pCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JFLE9BQU8sRUFDTCxZQUFZLEVBQ1osYUFBYSxFQUNiLHFCQUFxQixFQUNyQix3QkFBd0IsR0FDekIsTUFBTSxh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QUM7UUFDRCwrREFBK0Q7UUFDL0Qsd0RBQXdEO1FBQ3hELE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUN4RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0L3N0cmljdCc7XG5pbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBSZXRyeWFibGVFcnJvcixcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIFRocm90dGxlRXJyb3IsXG4gIFRvb0Vhcmx5RXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVdvcmtmbG93QmFzZVVybCxcbiAgcGx1cmFsaXplLFxuICBzdGVwRGlzcGxheU5hbWUsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7XG4gIENyZWF0ZUV2ZW50UGFyYW1zLFxuICBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIEV2ZW50LFxuICBFdmVudFJlc3VsdCxcbiAgU2VyaWFsaXplZERhdGEsXG4gIFN0YXJ0ZWRTdGVwLFxuICBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIHJlcXVpcmVFdmVudFNsb3QsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyLCBzdGVwTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGdldFN0ZXBGdW5jdGlvbiB9IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkS2V5IH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZXJyb3JzLmpzJztcbmltcG9ydCB7XG4gIGNhbmNlbEFib3J0UmVhZGVycyxcbiAgZGVoeWRyYXRlU3RlcEVycm9yLFxuICBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUsXG4gIGh5ZHJhdGVTdGVwQXJndW1lbnRzLFxuICBoeWRyYXRlU3RlcEVycm9yLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGNvbnRleHRTdG9yYWdlIH0gZnJvbSAnLi4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyByZWNvcmRTdGVwRXhlY3V0aW9uRHVyYXRpb24sIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7XG4gIGdldEVycm9yTmFtZSxcbiAgZ2V0RXJyb3JTdGFjayxcbiAgbm9ybWFsaXplVW5rbm93bkVycm9yLFxuICBwcm9tb3RlQWJvcnRFcnJvclRvRmF0YWwsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IENPTVBVVEVfSU5TVEFOQ0VfSUQgfSBmcm9tICcuL2NvbXB1dGUtaW5zdGFuY2UuanMnO1xuaW1wb3J0IHtcbiAgaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFbmFibGVkLFxuICBpc09wdGltaXN0aWNJbmxpbmVTdGFydEV4cGxpY2l0bHlEaXNhYmxlZCxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgZ2V0UG9ydExhenkgfSBmcm9tICcuL2dldC1wb3J0LWxhenkuanMnO1xuaW1wb3J0IHtcbiAgbWF4RXZlbnRTbG90LFxuICBtZW1vaXplRW5jcnlwdGlvbktleSxcbiAgdHlwZSBTbG90U25hcHNob3RQYXJhbXMsXG59IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyIH0gZnJvbSAnLi9yZXBsYXktcmVjb3ZlcnktcmVwb3J0ZXIuanMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZVJlc3VtZVR0ckF0dHJpYnV0ZXMsXG4gIHR5cGUgUmVzdW1lVHRyVHJhY2tpbmcsXG59IGZyb20gJy4vcmVzdW1lLWxhdGVuY3kuanMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhLFxuICB0eXBlIFN0ZXBMYXRlbmN5RXZlbnREYXRhLFxuICB0eXBlIFN0ZXBMYXRlbmN5VHJhY2tpbmcsXG59IGZyb20gJy4vc3RlcC1sYXRlbmN5LmpzJztcbmltcG9ydCB7IGlzVW5zZXJpYWxpemFibGVTdGVwSW5wdXRQbGFjZWhvbGRlciB9IGZyb20gJy4vdW5zZXJpYWxpemFibGUtc3RlcC5qcyc7XG5pbXBvcnQgeyBzYWZlV2FpdFVudGlsIH0gZnJvbSAnLi93YWl0LXVudGlsLmpzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUyA9IDM7XG5cbi8qKlxuICogRXh0cmFjdCB0aGUgaW5saW5lIGRlbHRhIGZyb20gYSBzdGVwLXRlcm1pbmFsIGBldmVudHMuY3JlYXRlYCByZXN1bHQsXG4gKiBpZiB0aGUgV29ybGQgcG9wdWxhdGVkIG9uZS4gQSBkZWx0YSBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgY2FsbGVyXG4gKiByZXF1ZXN0ZWQgaXQgKGBzaW5jZUN1cnNvcmAgd2FzIHBhc3NlZCkgYW5kIHRoZSBXb3JsZCByZXR1cm5lZCBib3RoXG4gKiBgZXZlbnRzYCBhbmQgYSBgY3Vyc29yYDsgb3RoZXJ3aXNlIHdlIHJldHVybiB1bmRlZmluZWQgYW5kIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBpbmNyZW1lbnRhbCBgZXZlbnRzLmxpc3RgLiBgaGFzTW9yZWAgZGVmYXVsdHNcbiAqIHRvIGZhbHNlIChzaW5nbGUgcGFnZSkgd2hlbiB0aGUgV29ybGQgb21pdHMgaXQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RJbmxpbmVEZWx0YShcbiAgcmVzdWx0OiB7IGV2ZW50cz86IEV2ZW50W107IGN1cnNvcj86IHN0cmluZyB8IG51bGw7IGhhc01vcmU/OiBib29sZWFuIH0sXG4gIHJlcXVlc3RlZDogYm9vbGVhblxuKTogSW5saW5lRXZlbnREZWx0YSB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmVxdWVzdGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoIXJlc3VsdC5ldmVudHMgfHwgcmVzdWx0LmN1cnNvciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGV2ZW50czogcmVzdWx0LmV2ZW50cyxcbiAgICBjdXJzb3I6IHJlc3VsdC5jdXJzb3IsXG4gICAgaGFzTW9yZTogcmVzdWx0Lmhhc01vcmUgPz8gZmFsc2UsXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcEV4ZWN1dG9yUGFyYW1zIHtcbiAgd29ybGQ6IFdvcmxkO1xuICB3b3JrZmxvd1J1bklkOiBzdHJpbmc7XG4gIC8qKiBEZXBsb3ltZW50IHRoYXQgb3ducyB0aGUgd29ya2Zsb3cgcnVuLCBmb3IgZm9yd2FyZGVkIHdyaXRhYmxlIHN0cmVhbXMuICovXG4gIHdvcmtmbG93RGVwbG95bWVudElkPzogc3RyaW5nO1xuICB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgd29ya2Zsb3dTdGFydGVkQXQ6IG51bWJlcjtcbiAgLyoqIFJlcXVlc3QgSUQgb2YgdGhlIGludm9jYXRpb24gZXhlY3V0aW5nIHRoaXMgc3RlcCwgd2hlbiBwcm92aWRlZCBieSBpdHMgcXVldWUuICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqIFJvb3QgcnVuIGlkIG9mIHRoaXMgcnVuJ3MgbGluZWFnZSwgY2FycmllZCBpbnRvIHRoZSBzdGVwIGNvbnRleHQuICovXG4gIHJvb3RSdW5JZD86IHN0cmluZztcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIGVuY3J5cHRpb25LZXk/OiBQYXlsb2FkS2V5O1xuICAvKipcbiAgICogVGhlIHdvcmtmbG93IHJ1bidzIHNwZWNWZXJzaW9uLCB1c2VkIHRvIGdhdGUgcGF5bG9hZCBjb21wcmVzc2lvbi5cbiAgICogU3RlcCBvdXRwdXRzL2Vycm9ycyBhcmUgb25seSBjb21wcmVzc2VkIHdoZW4gdGhlIHJ1biBpcyBtYXJrZWQgYXNcbiAgICogY29tcHJlc3Npb24tY2FwYWJsZSAoc3BlY1ZlcnNpb24gPj0gNSkuXG4gICAqL1xuICBydW5TcGVjVmVyc2lvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIExhenkgc3RlcCBzdGFydDogdGhlIGFscmVhZHktZGVoeWRyYXRlZCBzdGVwIGlucHV0LiBXaGVuIHByb3ZpZGVkLCB0aGVcbiAgICogYHN0ZXBfc3RhcnRlZGAgZXZlbnQgY2FycmllcyB0aGlzIGlucHV0IHNvIHRoZSB3b3JsZCBjcmVhdGVzIHRoZSBzdGVwIG9uXG4gICAqIHRoZSBmbHkgKG5vIHNlcGFyYXRlIGBzdGVwX2NyZWF0ZWRgIHJvdW5kLXRyaXApLiBTZXQgYnkgdGhlIG93bmVkLWlubGluZVxuICAgKiBwYXRoIGZvciB0aGUgc3RlcCB3aG9zZSBgc3RlcF9jcmVhdGVkYCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkLlxuICAgKiBUaGUgd29ybGQncyBhdG9taWMgY3JlYXRlLWNsYWltIGlzIHRoZSBleGFjdGx5LW9uZS1vd25lciBnYXRlOiBsb3NpbmcgaXRcbiAgICogc3VyZmFjZXMgYXMgYEVudGl0eUNvbmZsaWN0RXJyb3JgIOKGkiBgeyB0eXBlOiAnc2tpcHBlZCcgfWAsIHNvIGEgaGFuZGxlclxuICAgKiB0aGF0IGRpZCBub3Qgd2luIHRoZSBjcmVhdGUgbmV2ZXIgcnVucyB0aGUgYm9keS4gT21pdHRlZCBvbiBldmVyeSBvdGhlclxuICAgKiBwYXRoLCB3aGVyZSB0aGUgc3RlcCBhbHJlYWR5IGhhcyBhIGBzdGVwX2NyZWF0ZWRgIGFuZCBgc3RlcF9zdGFydGVkYFxuICAgKiBjYXJyaWVzIG5vIHBheWxvYWQgKHRoZSBsZWdhY3kgY29udHJhY3QpLlxuICAgKi9cbiAgbGF6eVN0ZXBJbnB1dD86IFNlcmlhbGl6ZWREYXRhO1xuICAvKipcbiAgICogUHJlLWNsYWltZWQgaW5saW5lIHN0YXJ0OiB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyIGNvbW1pdHRlZCAob3IgbG9zdCkgdGhpc1xuICAgKiBzdGVwJ3MgYHN0ZXBfY3JlYXRlZGAgKyBgc3RlcF9zdGFydGVkYCBwYWlyIGluc2lkZSBpdHMgYmF0Y2hlZCBmYW4tb3V0XG4gICAqIHdyaXRlLCBzbyB0aGUgc3RhcnQgdGhpcyBleGVjdXRvciB3b3VsZCBvdGhlcndpc2Ugc2VuZCBoYXMgYWxyZWFkeSBiZWVuXG4gICAqIGRlY2lkZWQuIGBvd25lZDogZmFsc2VgIHJldHVybnMgYHsgdHlwZTogJ3NraXBwZWQnIH1gIGJlZm9yZSBhbnkgd3JpdGUsXG4gICAqIHRoZSBzYW1lIG91dGNvbWUgYXMgbG9zaW5nIHRoZSBsYXp5IGNsYWltJ3MgYXRvbWljIGNyZWF0ZS4gYG93bmVkOiB0cnVlYFxuICAgKiBza2lwcyBib3RoIHN0YXJ0IHBhdGhzIChubyBzdGFydCB3cml0ZSBhdCBhbGwpIGFuZCBydW5zIHRoZSBib2R5IGFnYWluc3RcbiAgICogdGhlIGNsYWltZWQgc3RlcC4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGxhenlTdGVwSW5wdXRgOiB0aGUgaW5wdXRcbiAgICogYWxyZWFkeSByb2RlIHRoZSBwYWlyJ3MgYHN0ZXBfY3JlYXRlZGAsIGFuZCB0aGUgY2xhaW1lZCBzdGVwIGNhcnJpZXMgaXQuXG4gICAqL1xuICBwcmVjbGFpbWVkU3RhcnQ/OiBQcmVjbGFpbWVkSW5saW5lU3RhcnQ7XG4gIC8qKlxuICAgKiBJbmxpbmUgc3RlcCBvd25lcnNoaXA6IHRoZSBxdWV1ZSBtZXNzYWdlIElEIG9mIHRoZSBpbnZvY2F0aW9uIHRoaXNcbiAgICogZXhlY3V0ZVN0ZXAgY2FsbCBydW5zIGluIChmcm9tIHRoZSBxdWV1ZSBoYW5kbGVyJ3MgbWV0YSkuIFdoZW4gc2V0LCB0aGVcbiAgICogYHN0ZXBfc3RhcnRlZGAgdGhpcyBjYWxsIHNlbmRzIGlzIHN0YW1wZWQgd2l0aCBpdDogb24gdGhlIGxhenkgcGF0aHNcbiAgICogKHdoZXJlIGBsYXp5U3RlcElucHV0YCBpcyBwcmVzZW50KSBhbmQgb24gdGhlIG93bmVkLXJlY292ZXJ5XG4gICAqIHBheWxvYWQtbGVzcyBzdGFydCAod2hlcmUgaXQgaXMgbm90OyB0aGUgcmUtc3RhbXAga2VlcHMgYSByZWNvdmVyZWRcbiAgICogc3RlcCByZWFkYWJsZSBhcyBvd25lZCBieSB0aGlzIG1lc3NhZ2UsIHNpbmNlIG93bmVyc2hpcCBkZXJpdmVzIGZyb21cbiAgICogdGhlIExBVEVTVCBzdGFydCwgc28gYSByZWNvdmVyeSBzdGFydCBpcyBuZXZlciBiYXJlKS4gV2FrZVxuICAgKiByZXBsYXlzIHRoYXQgb2JzZXJ2ZSBhbiBhY3RpdmVseS1vd25lZCBzdGVwIHN1cHByZXNzIHRoZSBpbW1lZGlhdGVcbiAgICogcmVxdWV1ZSBhbmQgZW5xdWV1ZSBhIGRlbGF5ZWQgYmFja3N0b3AgaW5zdGVhZC4gT21pdHRlZCBvbiB0aGVcbiAgICogYmFja2dyb3VuZC1zdGVwIHBhdGgsIHdob3NlIGJhcmUgc3RhcnQgaW50ZW50aW9uYWxseSBjbGVhcnMgb3duZXJzaGlwXG4gICAqICh0aGUgc3RlcCBpcyBxdWV1ZS1vd25lZCBmcm9tIHRoYXQgcG9pbnQpLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJbmxpbmUtZGVsdGEgb3B0aW1pemF0aW9uIChvcHQtaW4pLiBXaGVuIHByb3ZpZGVkLCB0aGUgY3Vyc29yIG9mIHRoZVxuICAgKiBldmVudCBsb2cgYXMgb2JzZXJ2ZWQgYnkgdGhlIGNhbGxlciAqYmVmb3JlKiB0aGlzIHN0ZXAncyBldmVudHMgd2VyZVxuICAgKiB3cml0dGVuLiBJdCBpcyB0aHJlYWRlZCBpbnRvIHRoZSBzdGVwLXRlcm1pbmFsIGBldmVudHMuY3JlYXRlYCBzbyBhXG4gICAqIHN1cHBvcnRpbmcgV29ybGQgY2FuIHJldHVybiB0aGUgZGVsdGEgb2YgZXZlbnRzIHdyaXR0ZW4gc2luY2UgKHNlZVxuICAgKiB7QGxpbmsgaW1wb3J0KCdAd29ya2Zsb3cvd29ybGQnKS5DcmVhdGVFdmVudFBhcmFtcy5zaW5jZUN1cnNvcn0pLlxuICAgKiBPbmx5IHNldCB0aGlzIHdoZW4gYGNvcnJlbGF0aW9uSWRgLWJhc2VkIG93bmVyc2hpcCBndWFyYW50ZWVzIHRoaXNcbiAgICogaGFuZGxlciBpcyB0aGUgc29sZSBpbmxpbmUgd3JpdGVyIGZvciB0aGUgcnVuIG9uIHRoaXMgaXRlcmF0aW9uLlxuICAgKi9cbiAgaW5saW5lRGVsdGFTaW5jZUN1cnNvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEhvdyBtdWNoIG9mIHRoZSBydW4ncyBsb2cgdGhlIGNhbGxlcidzIHJlcGxheSBoYWQgbG9hZGVkIHdoZW4gaXQgc2NoZWR1bGVkXG4gICAqIHRoaXMgc3RlcCwgYXMgdGhlIGhpZ2hlc3Qgc2xvdCB0aGF0IGxvZyBvY2N1cGllcy4gU2VlZHMgdGhlIHNuYXBzaG90IGV2ZXJ5XG4gICAqIHdyaXRlIHRoaXMgZXhlY3V0b3IgbWFrZXMgY2FycmllczsgZWFjaCBjb21taXR0ZWQgZXZlbnQgYWR2YW5jZXMgaXQgdG8gaXRzXG4gICAqIG93biBzbG90LCBzbyBhIGxhdGVyIHdyaXRlIG5ldmVyIG5hbWVzIGEgcG9zaXRpb24gdGhhdCBwcmVkYXRlcyBhbiBlYXJsaWVyXG4gICAqIG9uZSBmcm9tIHRoZSBzYW1lIHN0ZXAuXG4gICAqXG4gICAqIEl0IG1hdHRlcnMgbW9zdCBvbiB0aGUgbGF6eSBpbmxpbmUgcGF0aCwgd2hlcmUgdGhlIGBzdGVwX3N0YXJ0ZWRgIGNsYWltIGlzXG4gICAqIHRoZSBzdGVwJ3MgRklSU1QgZHVyYWJsZSB3cml0ZSAoaXRzIGBzdGVwX2NyZWF0ZWRgIGlzIGRlZmVycmVkKTogd2l0aG91dCBhXG4gICAqIHNlZWQgdGhlIGNsYWltIHdvdWxkIG5hbWUgbm8gcG9zaXRpb24gYXQgYWxsLCBhbmQgYSByZXBsYXkgd29ya2luZyBmcm9tIGFcbiAgICogc3RhbGUgdmlldyBjb3VsZCBjbGFpbSAoYW5kIHRoZW4gY29tbWl0KSBhIHN0ZXAgc2NoZWR1bGVkIHdpdGhvdXRcbiAgICogb2JzZXJ2aW5nIGFuIGV2ZW50IGl0IG5ldmVyIGxvYWRlZC5cbiAgICpcbiAgICogQSBXb3JsZCB0aGF0IGZlbmNlcyByZWplY3RzIGEgc3RhbGUgY2xhaW0gd2l0aCBgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3JgXG4gICAqICg0MTIpOyBleGVjdXRlU3RlcCBkb2VzIE5PVCB0cmFuc2xhdGUgdGhhdCByZWplY3Rpb24gKHJlLWNsYWltaW5nIGluIHBsYWNlXG4gICAqIHdvdWxkIHN0aWxsIGNvbW1pdCB0aGUgc3RhbGUgc2NoZWR1bGUpLCBzbyBpdCBwcm9wYWdhdGVzIGZvciB0aGUgY2FsbGVyIHRvXG4gICAqIGFiYW5kb24gdGhlIGJhdGNoIGFuZCByZXN0YXJ0IGl0cyByZXBsYXkuIFVuZGVmaW5lZCBmb3IgYSBjYWxsZXIgd2l0aFxuICAgKiBub3RoaW5nIGxvYWRlZC5cbiAgICovXG4gIHNsb3RTbmFwc2hvdD86IFNsb3RTbmFwc2hvdFBhcmFtcztcbiAgLyoqXG4gICAqIFN1cHByZXNzIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IGZvciB0aGlzIHN0ZXAgcmVnYXJkbGVzcyBvZlxuICAgKiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlRgIC8gYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YDogdGFrZSB0aGVcbiAgICogYXdhaXQtdGhlbi1ydW4gcGF0aCBzbyB0aGUgYm9keSBvbmx5IHJ1bnMgYWZ0ZXIgdGhlIGBzdGVwX3N0YXJ0ZWRgIGNsYWltXG4gICAqIHN1Y2NlZWRzLiBTZXQgYnkgdGhlIHJ1bnRpbWUgZm9yIGd1YXJkLWVuZm9yY2VkIGJhdGNoZXMgdGhhdCBhcmVcbiAgICogc3RhbGUtc2Vuc2l0aXZlIChhbiBvcGVuIGhvb2sgbWVhbnMgYW4gb3V0LW9mLWJhbmQgZXZlbnQgY2FuIG1ha2UgdGhlXG4gICAqIHNjaGVkdWxpbmcgdmlldyBzdGFsZSk6IHRoZSBndWFyZCdzIDQxMiBmZW5jZSBjYW4gcmVqZWN0IGEgc3RhbGUgY2xhaW0nc1xuICAgKiBkdXJhYmxlIHdyaXRlcywgYnV0IGl0IGNhbm5vdCB1bi1ydW4gYSBib2R5IHRoYXQgb3B0aW1pc3RpYyBzdGFydCBiZWdhblxuICAgKiBiZWZvcmUgdGhlIGNsYWltIHNldHRsZWQ7IGF3YWl0aW5nIHRoZSBjbGFpbSBleHRlbmRzIHRoZSBmZW5jZSB0byB1c2VyXG4gICAqIGNvZGUuIFdpbnMgb3ZlciBgZm9yY2VPcHRpbWlzdGljU3RhcnRgIGFuZCB0aGUgZW52IGZsYWcuXG4gICAqL1xuICBzdXBwcmVzc09wdGltaXN0aWNTdGFydD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGb3JjZSBvcHRpbWlzdGljIGlubGluZSBzdGFydCByZWdhcmRsZXNzIG9mXG4gICAqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVGAuIFNldCBieSB0dXJibyBtb2RlIG9uIHRoZSBmaXJzdCBkZWxpdmVyeVxuICAgKiBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbiwgd2hlcmUgZm9yY2luZyBpdCBpcyBzYWZlOiB0aGVyZSBpcyBubyBjb25jdXJyZW50XG4gICAqIHBlZXIgaGFuZGxlciB0byByYWNlIHRoZSBjcmVhdGUtY2xhaW0sIHNvIHRoZSBib2R5IHJ1bnMgZXhhY3RseSBvbmNlLiBPbmx5XG4gICAqIG1lYW5pbmdmdWwgdG9nZXRoZXIgd2l0aCBgbGF6eVN0ZXBJbnB1dGAgKGEgYnJhbmQtbmV3IGxhenkgc3RlcCkuXG4gICAqL1xuICBmb3JjZU9wdGltaXN0aWNTdGFydD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUdXJibyBtb2RlIG9ubHk6IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgKiBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuIFdoZW4gc2V0LCB0aGUgbGF6eS9vcHRpbWlzdGljIGBzdGVwX3N0YXJ0ZWRgIGlzXG4gICAqIGNoYWluZWQgb24gaXQgc28gdGhlIHN0ZXAgaXMgbmV2ZXIgY3JlYXRlZCBiZWZvcmUgaXRzIHJ1biBleGlzdHMuIFRoZSBib2R5XG4gICAqIHN0aWxsIHJ1bnMgaW1tZWRpYXRlbHkgYWdhaW5zdCBsb2NhbGx5LXN5bnRoZXNpemVkIHN0YXRlIChvbmx5IHRoZSBuZXR3b3JrXG4gICAqIHdyaXRlIHdhaXRzKSwgc28gdGhlIGBydW5fc3RhcnRlZGAgcm91bmQtdHJpcCBvdmVybGFwcyB0aGUgYm9keS4gYHVuZGVmaW5lZGBcbiAgICogb3V0c2lkZSB0dXJibywgd2hlcmUgYHJ1bl9zdGFydGVkYCB3YXMgYWxyZWFkeSBhd2FpdGVkIHVwIGZyb250LlxuICAgKi9cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPjtcbiAgLyoqXG4gICAqIExhdGVuY3kgdGVsZW1ldHJ5IChUVEZTIC8gU1RTTyk6IGVsaWdpYmlsaXR5IGFuZCBhbmNob3IgdGltZXN0YW1wcyBkZWNpZGVkXG4gICAqIGJ5IHRoZSBvcmNoZXN0cmF0b3IuIFdoZW4gc2V0LCB0aGlzIGV4ZWN1dG9yIGNvbXB1dGVzIHRoZSBmaW5hbCB2YWx1ZXNcbiAgICogYWdhaW5zdCB0aGUgd2FsbCBjbG9jayB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdXNlciBjb2RlIHJ1bnMgYW5kXG4gICAqIGF0dGFjaGVzIHRoZW0gdG8gdGhlIHN0ZXAncyB0ZXJtaW5hbCBldmVudC4gU2V0IG9ubHkgZm9yIHRoZSBmaXJzdCBzdGVwIG9mXG4gICAqIGFuIGlubGluZSBiYXRjaCwgYW5kIG9ubHkgb24gZmlyc3QtYXR0ZW1wdCBleGVjdXRpb25zIHRoYXQgcXVhbGlmeTsgc2VlXG4gICAqIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzLlxuICAgKi9cbiAgbGF0ZW5jeVRyYWNraW5nPzogU3RlcExhdGVuY3lUcmFja2luZztcbiAgLyoqXG4gICAqIEhvb2stcmVzdW1lIFRUUiB0ZWxlbWV0cnk6IHRoZSBib3VuZGFyaWVzIG9mIGEgaG9vayByZXN1bXB0aW9uIHdob3NlIG5leHRcbiAgICogZHVyYWJsZSBzdGVwIGlzIHRoZSBvbmUgdGhpcyBjYWxsIGlzIGFib3V0IHRvIGV4ZWN1dGUuIFdoZW4gc2V0LCB0aGVcbiAgICogZXhlY3V0b3IgY2xvc2VzIHRoZSBtZWFzdXJlbWVudCBhZ2FpbnN0IHRoZSBgc3RlcF9zdGFydGVkYCBjbGFpbSBhbmQgdGhlXG4gICAqIHdhbGwgY2xvY2sgdGFrZW4gaW1tZWRpYXRlbHkgYmVmb3JlIHVzZXIgY29kZSwgYW5kIGF0dGFjaGVzIHRoZSB0b3RhbCBwbHVzXG4gICAqIGl0cyBwaGFzZSBicmVha2Rvd24gdG8gdGhpcyBzdGVwJ3MgYHN0ZXAuZXhlY3V0ZWAgc3Bhbi4gU2V0IGJ5IHRoZSBydW50aW1lXG4gICAqIGZvciBleGFjdGx5IG9uZSBzdGVwIHBlciByZXN1bXB0aW9uOyBzZWUgcnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cy5cbiAgICovXG4gIHJlc3VtZVRyYWNraW5nPzogUmVzdW1lVHRyVHJhY2tpbmc7XG4gIC8qKlxuICAgKiBBdXRob3JpdGF0aXZlIGF0dGVtcHQgbnVtYmVyIGZvciB0aGlzIGV4ZWN1dGlvbiwgdXNlZCB0byBib3VuZCByZXRyaWVzXG4gICAqIGFnYWluc3QgYG1heFJldHJpZXNgIEJFRk9SRSB0aGUgYm9keSBydW5zLiBUbyBhbHNvIGNhdGNoXG4gICAqIHN0ZXAgdGltZW91dHMgKHdoaWNoIHdlIGNhbid0IGhhdmUgY2F0Y2ggaGFuZGxlcnMgZm9yKSwgd2UgZGV0ZXJtaW5lXG4gICAqIHRoZSBhdHRlbXB0IGNvdW50IGJhc2VkIGFzIGZvbGxvd3M6XG4gICAqIC0gSW5saW5lIChjb21iaW5lZCBoYW5kbGVyKTogdGhlIG51bWJlciBvZiBgc3RlcF9zdGFydGVkYCBldmVudHMgYWxyZWFkeVxuICAgKiAgIGluIHRoZSBldmVudCBsb2cgZm9yIHRoaXMgc3RlcCwgcGx1cyBvbmUgZm9yIHRoZSBhdHRlbXB0IGFib3V0IHRvIHJ1bi5cbiAgICogLSBCYWNrZ3JvdW5kIChxdWV1ZS1kaXNwYXRjaGVkKTogdGhlIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50XG4gICAqICAgKGBtZXRhZGF0YS5hdHRlbXB0YCksIHdoaWNoIGluY3JlbWVudHMgb24gZXZlcnkgcmVkZWxpdmVyeS5cbiAgICovXG4gIGF1dGhvcml0YXRpdmVBdHRlbXB0PzogbnVtYmVyO1xuICAvKiogT25lLXNob3QgcmVjb3ZlcnkgdGVsZW1ldHJ5IGFjdGl2YXRlZCBieSB0aGUgb3JjaGVzdHJhdG9yIHJlcGxheS4gKi9cbiAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcj86IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXI7XG59XG5cbi8qKlxuICogVGhlIHNldHRsZWQgb3V0Y29tZSBvZiBhIGBzdGVwX2NyZWF0ZWRgICsgYHN0ZXBfc3RhcnRlZGAgcGFpciB0aGVcbiAqIHN1c3BlbnNpb24gaGFuZGxlciBmb2xkZWQgaW50byBpdHMgYmF0Y2hlZCBmYW4tb3V0IHdyaXRlIChzZWVcbiAqIGBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdC5pbmxpbmVDbGFpbXNgKS4gSGFuZGVkIHRvIGV4ZWN1dGVTdGVwIGFzXG4gKiB7QGxpbmsgU3RlcEV4ZWN1dG9yUGFyYW1zLnByZWNsYWltZWRTdGFydH0gc28gdGhlIGV4ZWN1dG9yIHJ1bnMgKG9yIHNraXBzKVxuICogdGhlIGJvZHkgb2ZmIHRoZSBiYXRjaCdzIHZlcmRpY3QgaW5zdGVhZCBvZiBzZW5kaW5nIGEgc3RhcnQgb2YgaXRzIG93bi5cbiAqL1xuZXhwb3J0IHR5cGUgUHJlY2xhaW1lZElubGluZVN0YXJ0ID1cbiAgfCB7XG4gICAgICAvKiogVGhlIHBhaXIgY29tbWl0dGVkOiB0aGlzIGV4ZWN1dGlvbiBvd25zIHRoZSBzdGVwIGFuZCBydW5zIHRoZSBib2R5LiAqL1xuICAgICAgb3duZWQ6IHRydWU7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBzdGFydGVkIHN0ZXAgZW50aXR5IGZyb20gdGhlIGJhdGNoIHJlc3VsdCwgd2l0aCB0aGUgbG9jYWxseVxuICAgICAgICogZGVoeWRyYXRlZCBpbnB1dCBhdHRhY2hlZCBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyIChiYXRjaCByZXNwb25zZXNcbiAgICAgICAqIHJldHVybiByZWZzIGxhemlseTsgdGhlIGJvZHkncyBoeWRyYXRpb24gd2FudHMgdGhlIHNhbWUgYnl0ZXMgdGhlXG4gICAgICAgKiBwYWlyJ3MgYHN0ZXBfY3JlYXRlZGAgY2FycmllZCkuXG4gICAgICAgKi9cbiAgICAgIHN0ZXA6IFN0YXJ0ZWRTdGVwO1xuICAgICAgLyoqXG4gICAgICAgKiBgRGF0ZS5ub3coKWAgdGFrZW4gcmlnaHQgYmVmb3JlIHRoZSBiYXRjaCBQT1NUIHRoYXQgY2FycmllZCB0aGUgcGFpcjpcbiAgICAgICAqIHRoZSBjbGFpbSdzIFwic3RhcnQgUE9TVCBzZW50XCIgaW5zdGFudCwgYW5jaG9yaW5nIFJTRlMgZXhhY3RseSBsaWtlXG4gICAgICAgKiB0aGUgbGF6eSBjbGFpbSdzIG93biBQT1NUIHdvdWxkLlxuICAgICAgICovXG4gICAgICBiYXRjaFBvc3RTZW50QXRNcz86IG51bWJlcjtcbiAgICAgIC8qKlxuICAgICAgICogYERhdGUubm93KClgIHRha2VuIHJpZ2h0IGFmdGVyIHRoYXQgYmF0Y2ggUE9TVCByZXR1cm5lZDogdGhlXG4gICAgICAgKiBjbGFpbSdzIGNvbXBsZXRpb24gaW5zdGFudCAoVDYgb2YgdGhlIGhvb2stcmVzdW1lIFRUUiB3aW5kb3cpLlxuICAgICAgICovXG4gICAgICBjbGFpbUNvbXBsZXRlZEF0TXM/OiBudW1iZXI7XG4gICAgfVxuICB8IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHBhaXIgbG9zdCBpdHMgYXRvbWljIGNyZWF0ZS1jbGFpbSAocGVyLWV2ZW50IDQwOSk6IGEgY29uY3VycmVudFxuICAgICAgICogd3JpdGVyIG93bnMgdGhlIHN0ZXAsIHNvIHRoZSBib2R5IG11c3Qgbm90IHJ1biBoZXJlLlxuICAgICAgICovXG4gICAgICBvd25lZDogZmFsc2U7XG4gICAgfTtcblxuLyoqXG4gKiBJbmxpbmUtZGVsdGEgcmV0dXJuZWQgYnkgYSBzdGVwLXRlcm1pbmFsIHdyaXRlIHdoZW4gdGhlIGNhbGxlciBwYXNzZWRcbiAqIHtAbGluayBTdGVwRXhlY3V0b3JQYXJhbXMuaW5saW5lRGVsdGFTaW5jZUN1cnNvcn0gYW5kIHRoZSBXb3JsZCBzdXBwb3J0c1xuICogdGhlIG9wdGltaXphdGlvbi4gYGV2ZW50c2AgYXJlIHRoZSBldmVudHMgd3JpdHRlbiBzdHJpY3RseSBhZnRlciB0aGF0XG4gKiBjdXJzb3IgKHRoaXMgc3RlcCdzIGV2ZW50cyBwbHVzIGFueXRoaW5nIGludGVybGVhdmVkIGluLWJhbmQpLCBgY3Vyc29yYFxuICogaXMgdGhlIHBvc2l0aW9uIHBhc3QgdGhlIGxhc3Qgb25lLCBhbmQgYGhhc01vcmVgIHNpZ25hbHMgYSBmdXJ0aGVyIHBhZ2VcbiAqICh0aGUgY2FsbGVyIHRoZW4gZmFsbHMgYmFjayB0byBhIGZ1bGwgaW5jcmVtZW50YWwgZmV0Y2gpLiBBYnNlbnQgd2hlblxuICogdGhlIFdvcmxkIGRpZCBub3QgcmV0dXJuIGEgZGVsdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5saW5lRXZlbnREZWx0YSB7XG4gIGV2ZW50czogRXZlbnRbXTtcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICBoYXNNb3JlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIHN0ZXAgZXhlY3V0aW9uIGF0dGVtcHQuIFRoZSBjYWxsZXIgZGVjaWRlcyB3aGF0IHRvIGRvXG4gKiBiYXNlZCBvbiB0aGUgcmVzdWx0IHR5cGUgKGUuZy4sIHF1ZXVlIHdvcmtmbG93IGNvbnRpbnVhdGlvbiwgcmVwbGF5IGlubGluZSwgZXRjLikuXG4gKlxuICogYGlubGluZURlbHRhYCBpcyBhdHRhY2hlZCB0byBhIGBjb21wbGV0ZWRgIHJlc3VsdCB3aGVuIHRoZSBjYWxsZXJcbiAqIHJlcXVlc3RlZCBpdCB2aWEge0BsaW5rIFN0ZXBFeGVjdXRvclBhcmFtcy5pbmxpbmVEZWx0YVNpbmNlQ3Vyc29yfSBhbmRcbiAqIHRoZSBXb3JsZCByZXR1cm5lZCBvbmUuIFN0ZXAgZmFpbHVyZXMgYXJlIHJhcmUgYW5kIG5vdCB0aGUgaW5saW5lXG4gKiBvcHRpbWl6YXRpb24ncyB0YXJnZXQsIHNvIHRoZSBgZmFpbGVkYCBwYXRoIGxlYXZlcyBpdCB0byB0aGUgbm9ybWFsXG4gKiBpbmNyZW1lbnRhbCBmZXRjaC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RlcEV4ZWN1dGlvblJlc3VsdCA9XG4gIHwge1xuICAgICAgdHlwZTogJ2NvbXBsZXRlZCc7XG4gICAgICBoYXNQZW5kaW5nT3BzPzogYm9vbGVhbjtcbiAgICAgIGlubGluZURlbHRhPzogSW5saW5lRXZlbnREZWx0YTtcbiAgICB9XG4gIHwgeyB0eXBlOiAnZmFpbGVkJyB9XG4gIHwgeyB0eXBlOiAncmV0cnknOyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH1cbiAgfCB7IHR5cGU6ICdza2lwcGVkJyB9XG4gIHwgeyB0eXBlOiAnZ29uZScgfVxuICB8IHsgdHlwZTogJ3Rocm90dGxlZCc7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfTtcblxuLyoqXG4gKiBFeGVjdXRlcyBhIHNpbmdsZSBzdGVwOiBjcmVhdGVzIHN0ZXBfc3RhcnRlZCBldmVudCwgaHlkcmF0ZXMgaW5wdXQsXG4gKiBydW5zIHRoZSBzdGVwIGZ1bmN0aW9uLCBjcmVhdGVzIHN0ZXBfY29tcGxldGVkL3N0ZXBfZmFpbGVkL3N0ZXBfcmV0cnlpbmcgZXZlbnRzLlxuICpcbiAqIERvZXMgTk9UIHF1ZXVlIHdvcmtmbG93IGNvbnRpbnVhdGlvbiBtZXNzYWdlczsgdGhlIGNhbGxlciBkZWNpZGVzIHdoYXQgdG8gZG8gbmV4dC5cbiAqIFVzZWQgYnkgdGhlIGNvbWJpbmVkIHdvcmtmbG93IGhhbmRsZXIgZm9yIHN0ZXAgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVN0ZXAoXG4gIHBhcmFtczogU3RlcEV4ZWN1dG9yUGFyYW1zXG4pOiBQcm9taXNlPFN0ZXBFeGVjdXRpb25SZXN1bHQ+IHtcbiAgY29uc3Qge1xuICAgIHdvcmxkLFxuICAgIHdvcmtmbG93UnVuSWQsXG4gICAgd29ya2Zsb3dOYW1lLFxuICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgIHN0ZXBJZCxcbiAgICBzdGVwTmFtZSxcbiAgfSA9IHBhcmFtcztcbiAgLy8gVHJ1dGhpbmVzcywgbm90IHByZXNlbmNlOiBgdmVyY2VsIGVudiBwdWxsYCB3cml0ZXMgYFZFUkNFTF9VUkw9XCJcImAgaW50b1xuICAvLyBgLmVudi5sb2NhbGAsIGFuZCBhIGZyYW1ld29yayB0aGF0IGxvYWRzIHRoYXQgZmlsZSBsb2NhbGx5IHdvdWxkIG90aGVyd2lzZVxuICAvLyBwdXQgdXMgb24gdGhlIFZlcmNlbCBicmFuY2ggd2l0aCBub3RoaW5nIHRvIGJ1aWxkIGEgaG9zdCBmcm9tLCBtYWtpbmdcbiAgLy8gYGh0dHBzOi8vYCB0aGUgYmFzZSBVUkwgb2YgZXZlcnkgc3RlcC5cbiAgY29uc3QgaXNWZXJjZWwgPSBCb29sZWFuKHByb2Nlc3MuZW52LlZFUkNFTF9VUkwpO1xuICAvLyBHYXRlIHBheWxvYWQgY29tcHJlc3Npb24gb24gdGhlIHJ1bidzIHNwZWNWZXJzaW9uLlxuICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgKHBhcmFtcy5ydW5TcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT047XG4gIGNvbnN0IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgPVxuICAgIHBhcmFtcy5yZXBsYXlSZWNvdmVyeVJlcG9ydGVyID8/IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgLyoqXG4gICAqIFRoZSBoaWdoZXN0IGxvZyBzbG90IHRoaXMgZXhlY3V0b3Iga25vd3MgYWJvdXQsIHNlZWRlZCBmcm9tIHRoZSB2aWV3IGl0c1xuICAgKiBjYWxsZXIgc2NoZWR1bGVkIHRoZSBzdGVwIGFnYWluc3QgYW5kIGFkdmFuY2VkIGJ5IGV2ZXJ5IGV2ZW50IGl0IGNvbW1pdHMuXG4gICAqXG4gICAqIEFkdmFuY2luZyBpcyB3aGF0IGtlZXBzIHRoZSBzbmFwc2hvdCBob25lc3QgYWNyb3NzIGEgc3RlcCdzIG93biB3cml0ZXMuIEFcbiAgICogc3RlcCBjb21taXRzIGBzdGVwX3N0YXJ0ZWRgIGFuZCB0aGVuIGBzdGVwX2NvbXBsZXRlZGA7IGlmIHRoZSBzZWNvbmQgc3RpbGxcbiAgICogbmFtZWQgdGhlIGNhbGxlcidzIG9yaWdpbmFsIHBvc2l0aW9uLCB0aGUgV29ybGQgd291bGQgcmVwb3J0IHRoZSBmaXJzdCBvbmVcbiAgICogYmFjayBhcyBhbiBldmVudCB0aGlzIHdyaXRlciBoYWQgbm90IHNlZW4sIG9uIGV2ZXJ5IHN0ZXAsIGZvcmV2ZXIuXG4gICAqXG4gICAqIFRoaXMgcmVhZHMgYSByZXBvcnQgZm9yIGl0cyBoaWdoZXN0IHBvc2l0aW9uIGFuZCB0aGVuIGRpc2NhcmRzIGl0LCB3aGVyZVxuICAgKiB0aGUgcmVwbGF5IGxvb3AgYW5kIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgbWVyZ2UgdGhlaXJzIHdpdGhcbiAgICogYGFic29yYlNraXBwZWRTbG90UmVwb3J0YC4gVGhhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjYWxsZXJzLCBub3RcbiAgICogYW4gb3ZlcnNpZ2h0OiBhbiBleGVjdXRvciBob2xkcyBubyBsb2FkZWQgbG9nIHRvIG1lcmdlIGludG8uIEl0IHJ1bnMgZnJvbSBhXG4gICAqIHF1ZXVlZCBkZWxpdmVyeSB3aG9zZSBvbmx5IHZpZXcgb2YgdGhlIGxvZyBpcyB0aGUgaW50ZWdlciBpdHMgY2FsbGVyIHBhc3NlZFxuICAgKiBpbiwgc28gdGhlIHBvc2l0aW9uIGlzIHRoZSBlbnRpcmUgdmFsdWUgdGhlIHJlcG9ydCBoYXMgdG8gaXQuIFdob2V2ZXJcbiAgICogcmVwbGF5cyBuZXh0IGxvYWRzIHRoZSBsb2cgYW5kIGdldHMgdGhlIGV2ZW50cyB0aGVtc2VsdmVzLlxuICAgKi9cbiAgbGV0IGtub3duU2xvdCA9IHBhcmFtcy5zbG90U25hcHNob3Q/LmV2ZW50Q291bnQ7XG4gIGNvbnN0IG9ic2VydmVTbG90ID0gKHJlc3VsdDogeyBldmVudD86IEV2ZW50OyBldmVudHM/OiBFdmVudFtdIH0pOiB2b2lkID0+IHtcbiAgICBpZiAoa25vd25TbG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoZSBjYWxsZXIgc2NoZWR1bGVkIHRoaXMgc3RlcCB3aXRob3V0IG5hbWluZyBhIHBvc2l0aW9uLCBzbyB0aGVyZSBpc1xuICAgICAgLy8gbm8gc25hcHNob3QgdG8gYWR2YW5jZSBhbmQgdGhlIHdyaXRlcyBiZWxvdyBzZW5kIG5vbmUuIE5vdCB0aGUgc2FtZSBhc1xuICAgICAgLy8gYSBydW4gd2l0aG91dCBwb3NpdGlvbnM6IGV2ZXJ5IHJ1biBoYXMgdGhlbSwgdGhpcyBleGVjdXRvciB3YXMgbm90XG4gICAgICAvLyB0b2xkIHdoaWNoIG9uZSBpdCBzdGFydGVkIGZyb20uXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9ic2VydmVkOiBudW1iZXJbXSA9IFtdO1xuICAgIGlmIChyZXN1bHQuZXZlbnQpIHtcbiAgICAgIG9ic2VydmVkLnB1c2gocmVxdWlyZUV2ZW50U2xvdChyZXN1bHQuZXZlbnQuZXZlbnRJZCkpO1xuICAgIH1cbiAgICBjb25zdCByZXBvcnRlZCA9IG1heEV2ZW50U2xvdChyZXN1bHQuZXZlbnRzID8/IFtdKTtcbiAgICBpZiAocmVwb3J0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JzZXJ2ZWQucHVzaChyZXBvcnRlZCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2xvdCBvZiBvYnNlcnZlZCkge1xuICAgICAgaWYgKHNsb3QgPiBrbm93blNsb3QpIHtcbiAgICAgICAga25vd25TbG90ID0gc2xvdDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGNyZWF0ZUV2ZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBDcmVhdGVFdmVudFJlcXVlc3Q+KFxuICAgIGRhdGE6IFQsXG4gICAgZXZlbnRQYXJhbXM/OiBDcmVhdGVFdmVudFBhcmFtc1xuICApID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLndpdGhFdmVudENyZWF0ZShcbiAgICAgIGtub3duU2xvdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gZXZlbnRQYXJhbXNcbiAgICAgICAgOiB7IGV2ZW50Q291bnQ6IGtub3duU2xvdCwgLi4uZXZlbnRQYXJhbXMgfSxcbiAgICAgIChwKSA9PiB3b3JsZC5ldmVudHMuY3JlYXRlKHdvcmtmbG93UnVuSWQsIGRhdGEsIHApXG4gICAgKTtcbiAgICBvYnNlcnZlU2xvdChyZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gYHN0ZXBfc3RhcnRlZGAgaWRlbnRpZmllcyB0aGUgaW52b2NhdGlvbiB0aGF0IHBlcmZvcm1lZCB0aGlzIGF0dGVtcHQuXG4gIC8vIEtlZXAgcmVxdWVzdCBhbmQgY29tcHV0ZSBwcm92ZW5hbmNlIGluZGVwZW5kZW50OiB3b3JsZC12ZXJjZWwgc2VyaWFsaXplc1xuICAvLyByZXF1ZXN0SWQgYXMgYW5hbHl0aWNzIGB2ZXJjZWxJZGAsIHdoaWxlIGNvbXB1dGVJbnN0YW5jZUlkIGlkZW50aWZpZXMgdGhlXG4gIC8vIHdvcmtlciB0aGF0IGV4ZWN1dGVkIHRoZSBzdGVwLlxuICBjb25zdCBzdGVwU3RhcnRlZEV2ZW50UGFyYW1zOiBDcmVhdGVFdmVudFBhcmFtcyA9IHtcbiAgICBjb21wdXRlSW5zdGFuY2VJZDogQ09NUFVURV9JTlNUQU5DRV9JRCxcbiAgICAuLi4ocGFyYW1zLnJlcXVlc3RJZCA/IHsgcmVxdWVzdElkOiBwYXJhbXMucmVxdWVzdElkIH0gOiB7fSksXG4gIH07XG5cbiAgY29uc3Qgc3Bhbk5hbWUgPSBgc3RlcC5leGVjdXRlICR7c3RlcERpc3BsYXlOYW1lKHN0ZXBOYW1lKX1gO1xuICByZXR1cm4gdHJhY2Uoc3Bhbk5hbWUsIHt9LCBhc3luYyAoc3BhbikgPT4ge1xuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlN0ZXBOYW1lKHN0ZXBOYW1lKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHdvcmtmbG93UnVuSWQpLFxuICAgICAgLi4uQXR0cmlidXRlLlN0ZXBJZChzdGVwSWQpLFxuICAgIH0pO1xuXG4gICAgLy8gVGhlIHR3byBsYXp5IHN0YXJ0IG1vZGVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYnkgY29uc3RydWN0aW9uICh0aGVcbiAgICAvLyBjYWxsZXIgc2V0cyBvbmUgb3IgdGhlIG90aGVyKSwgYW5kIHNldmVyYWwgYnJhbmNoZXMgYmVsb3cgcmVhZCBvbmx5IG9uZVxuICAgIC8vIG9mIHRoZW0gdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHN0ZXAgaXMgYnJhbmQtbmV3LiBFbmZvcmNlZCByYXRoZXIgdGhhblxuICAgIC8vIGRvY3VtZW50ZWQgc28gYSBjYWxsZXIgdGhhdCBldmVyIHNldHMgYm90aCBmYWlscyBoZXJlIGluc3RlYWQgb2ZcbiAgICAvLyBzaWxlbnRseSB0YWtpbmcgdGhlIHByZS1jbGFpbWVkIHBhdGggd2l0aCBhbiB1bnNlbnQgaW5wdXQuXG4gICAgYXNzZXJ0KFxuICAgICAgIShwYXJhbXMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkICYmIHBhcmFtcy5wcmVjbGFpbWVkU3RhcnQpLFxuICAgICAgJ2V4ZWN1dGVTdGVwOiBsYXp5U3RlcElucHV0IGFuZCBwcmVjbGFpbWVkU3RhcnQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSdcbiAgICApO1xuXG4gICAgLy8gQSBwcmUtY2xhaW1lZCBzdGFydCB0aGF0IExPU1QgdGhlIGJhdGNoZWQgcGFpcidzIGF0b21pYyBjcmVhdGUtY2xhaW06IGFcbiAgICAvLyBjb25jdXJyZW50IHdyaXRlciBvd25zIHRoaXMgc3RlcC4gU2FtZSBvdXRjb21lIGFzIGxvc2luZyB0aGUgbGF6eVxuICAgIC8vIGNsYWltIChFbnRpdHlDb25mbGljdEVycm9yIOKGkiBza2lwcGVkKSwgZGVjaWRlZCBiZWZvcmUgQU5ZIHdyaXRlLCB0aGVcbiAgICAvLyB1bnJlZ2lzdGVyZWQtc3RlcCBmYWxsYmFjayBiZWxvdyBpbmNsdWRlZCwgc2luY2UgYSBzdGVwIHRoaXMgaGFuZGxlclxuICAgIC8vIGRvZXMgbm90IG93biBpcyBub3QgaXRzIHRvIGZhaWwuXG4gICAgaWYgKHBhcmFtcy5wcmVjbGFpbWVkU3RhcnQgJiYgcGFyYW1zLnByZWNsYWltZWRTdGFydC5vd25lZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1ByZS1jbGFpbWVkIHN0ZXAgc3RhcnQgbG9zdCwgc2tpcHBpbmcnLCB7XG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICBzdGVwSWQsXG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICB9KTtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFNraXBwZWQodHJ1ZSksXG4gICAgICAgIC8vIGBydW5uaW5nYCwgbm90IGBjb21wbGV0ZWRgOiB0aGUgcGFpcidzIDQwOSBzYXlzIHRoZSBzdGVwIGFscmVhZHlcbiAgICAgICAgLy8gRVhJU1RTLCBhbmQgdGhlIHdyaXRlciB0aGF0IHdvbiB0aGUgY3JlYXRlLWNsYWltIGlzIGV4ZWN1dGluZyBpdC5cbiAgICAgICAgLy8gVGhlIG90aGVyIHNraXAgc2l0ZSBiZWxvdyBpcyBhIGdlbnVpbmUgdGVybWluYWwtc3RhdGUgY29uZmxpY3Q7XG4gICAgICAgIC8vIHRhZ2dpbmcgYm90aCBgY29tcGxldGVkYCB3b3VsZCBtYWtlIHRoZSBhdHRyaWJ1dGUgcmVhZCAxMDAlXG4gICAgICAgIC8vIGBjb21wbGV0ZWRgIGFuZCBsb3NlIHRoZSBvbmx5IGRpc3RpbmN0aW9uIHdvcnRoIHF1ZXJ5aW5nIGl0IGZvci5cbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwUmVhc29uKCdydW5uaW5nJyksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgIH1cblxuICAgIC8vIE1lbW9pemVkIGFjY2Vzc29yIGZvciB0aGUgcGVyLXJ1biBlbmNyeXB0aW9uIGtleS4gVGhlIGZpcnN0IGNhbGxlclxuICAgIC8vIChpbnB1dCBoeWRyYXRpb24gb24gdGhlIHN1Y2Nlc3MgcGF0aCwgb3Igb25lIG9mIHRoZSBlYXJseS1yZXR1cm5cbiAgICAvLyBkZWh5ZHJhdGVTdGVwRXJyb3IgcGF0aHMgaWYgc3RlcF9zdGFydGVkIGZhaWxzKSB0cmlnZ2VycyB0aGUgYWN0dWFsXG4gICAgLy8gZmV0Y2ggLyBIS0RGIGRlcml2YXRpb247IHN1YnNlcXVlbnQgY2FsbGVycyBhd2FpdCB0aGUgY2FjaGVkIHByb21pc2UuXG4gICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1bklkKTtcblxuICAgIGNvbnN0IHN0ZXBGbiA9IGdldFN0ZXBGdW5jdGlvbihzdGVwTmFtZSk7XG4gICAgaWYgKCFzdGVwRm4gfHwgdHlwZW9mIHN0ZXBGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gU3RlcCBmdW5jdGlvbiBub3QgcmVnaXN0ZXJlZDogZmFpbCB0aGUgc3RlcCBpbW1lZGlhdGVseSAobm90IHRoZSBydW4pLlxuICAgICAgLy8gQ3JlYXRlIGEgc3RlcF9mYWlsZWQgZXZlbnQgc29cbiAgICAgIC8vIHRoZSB3b3JrZmxvdyBjYW4gaGFuZGxlIGl0IGdyYWNlZnVsbHkgdmlhIHRyeS9jYXRjaCBpbiB1c2VyIGNvZGUuXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGN1cnJlbnQgZGVwbG95bWVudC4gVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIGJ1aWxkIG9yIGJ1bmRsaW5nIGlzc3VlIHRoYXQgY2F1c2VkIHRoZSBzdGVwIHRvIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgZGVwbG95bWVudC5gO1xuICAgICAgcnVudGltZUxvZ2dlci5lcnJvcignU3RlcCBmdW5jdGlvbiBub3QgcmVnaXN0ZXJlZCwgZmFpbGluZyBzdGVwJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgc3RlcElkLFxuICAgICAgfSk7XG4gICAgICAvLyBPbiB0aGUgbGF6eSBpbmxpbmUgcGF0aCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkIHRoaXMgc3RlcCdzXG4gICAgICAvLyBgc3RlcF9jcmVhdGVkYCwgZXhwZWN0aW5nIGV4ZWN1dGVTdGVwIHRvIG1hdGVyaWFsaXplIHRoZSBzdGVwIHZpYSBhXG4gICAgICAvLyBsYXp5IGBzdGVwX3N0YXJ0ZWRgIGNhcnJ5aW5nIGl0cyBpbnB1dC4gV2UgbmV2ZXIgZ2V0IHRoYXQgZmFyIGZvciBhblxuICAgICAgLy8gdW5yZWdpc3RlcmVkIHN0ZXAsIHNvIHRoZSBzdGVwIGVudGl0eSBkb2VzIG5vdCBleGlzdCB5ZXQsIGFuZCB3cml0aW5nXG4gICAgICAvLyBgc3RlcF9mYWlsZWRgIHN0cmFpZ2h0IGF3YXkgd291bGQgaGl0IHRoZSB3b3JsZCdzIFwic3RlcCBtdXN0IGV4aXN0XCJcbiAgICAgIC8vIG9yZGVyaW5nIGd1YXJkIGFuZCB3ZWRnZSB0aGUgcnVuLiBTZW5kIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIGZpcnN0XG4gICAgICAvLyAoaXQgY3JlYXRlcyB0aGUgc3RlcCArIHN5bnRoZXRpYyBgc3RlcF9jcmVhdGVkYCBhdG9taWNhbGx5IGFuZCBrZWVwc1xuICAgICAgLy8gcmVwbGF5IGNvcnJlY3QpLCB0aGVuIGZhaWwgaXQgYmVsb3cuIFRoaXMgYWxzbyBwcmVzZXJ2ZXMgdGhlXG4gICAgICAvLyBleGFjdGx5LW9uZS1vd25lciBndWFyYW50ZWU6IGEgY29uY3VycmVudCBoYW5kbGVyIHRoYXQgd29uIHRoZSBjcmVhdGVcbiAgICAgIC8vIG1ha2VzIG91ciBsYXp5IGBzdGVwX3N0YXJ0ZWRgIHJlamVjdCB3aXRoIEVudGl0eUNvbmZsaWN0RXJyb3Ig4oaSIHdlXG4gICAgICAvLyByZXR1cm4gYHNraXBwZWRgIGFuZCBuZXZlciB3cml0ZSB0aGUgZmFpbHVyZSB0d2ljZS5cbiAgICAgIGlmIChwYXJhbXMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVHVyYm86IHRoaXMgbGF6eSBgc3RlcF9zdGFydGVkYCBtdXN0IG5vdCBwcmVjZWRlIHRoZSBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgLiBPcmRlciBpdCBhZnRlciB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgKGJlc3QtZWZmb3J0OlxuICAgICAgICAgIC8vIGEgYmFycmllciByZWplY3Rpb24gbWVhbnMgdGhlIHJ1biBkb2Vzbid0IGV4aXN0LCBhbmQgdGhlIGNyZWF0ZVxuICAgICAgICAgIC8vIGJlbG93IHN1cmZhY2VzIHRoZSByZWFsIGVycm9yKS4gTm8tb3Agb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICBpZiAocGFyYW1zLnJ1blJlYWR5QmFycmllcikge1xuICAgICAgICAgICAgYXdhaXQgcGFyYW1zLnJ1blJlYWR5QmFycmllci5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgICAgICAgICAvLyBTdGFtcGVkIGZvciBjb25zaXN0ZW5jeSBldmVuIHRob3VnaCB0aGlzIHN0ZXAgdGVybWluYWwtZmFpbHNcbiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBiZWxvdzsgdGhlIGxvZyBzaG91bGQgbmV2ZXIgc2hvdyBhbiB1bm93bmVkXG4gICAgICAgICAgICAgICAgLy8gbGF6eSBzdGFydC5cbiAgICAgICAgICAgICAgICAuLi4ocGFyYW1zLm93bmVyTWVzc2FnZUlkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgID8geyBvd25lck1lc3NhZ2VJZDogcGFyYW1zLm93bmVyTWVzc2FnZUlkIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0ZXBTdGFydGVkRXZlbnRQYXJhbXNcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChzdGFydEVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0YXJ0RXJyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoc3RhcnRFcnIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgc3RhcnRFcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgbmV3IEZhdGFsRXJyb3IoZXJyb3JNZXNzYWdlKSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpLFxuICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChzdGVwRmFpbEVycikge1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgIH1cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRmF0YWxFcnJvcih0cnVlKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2ZhaWxlZCcgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhSZXRyaWVzID0gc3RlcEZuLm1heFJldHJpZXMgPz8gREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTO1xuXG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcE1heFJldHJpZXMobWF4UmV0cmllcyksXG4gICAgfSk7XG5cbiAgICAvLyBtYXhSZXRyaWVzIGVuZm9yY2VkIGJlZm9yZSBzdGFydGluZyBhbm90aGVyIGF0dGVtcHQuIFRpbWVvdXRzIGNhbiBraWxsXG4gICAgLy8gYSBzdGVwIGV4ZWN1dGlvbiB3aXRob3V0IGFueSB3YXkgdG8gY2F0Y2ggdGhlIGVycm9yLCBzbyB0aGUgcG9zdC1ib2R5L2Vycm9yXG4gICAgLy8gZ3VhcmRzIGJlbG93IG1pZ2h0IG1pc3MgaXQuIEhlbmNlLCB3ZSB1c2UgYGF1dGhvcml0YXRpdmVBdHRlbXB0YCBjb3VudFxuICAgIC8vIGFzIGFuIGFkZGl0aW9uYWwgZ3VhcmQgYmFzZWQgb24gc3RlcF9zdGFydGVkIGNvdW50IG9yIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50XG4gICAgLy8gb24gYmFja2dyb3VuZGVkIHN0ZXBzLlxuICAgIC8vIFRocm93bi1lcnJvciBleGhhdXN0aW9uIHN0aWxsIHRlcm1pbmF0ZXMgb25lIGF0dGVtcHQgZWFybGllciB2aWEgdGhlIHBvc3QtYm9keVxuICAgIC8vIGd1YXJkICh3aXRoIHRoZSB0aHJvd24gZXJyb3IgYXMgY2F1c2UpLCBhbmQgdGhpcyBjaGVjayBkb2VzIG5vdCBhZmZlY3QgdGhhdC5cbiAgICBpZiAoXG4gICAgICBwYXJhbXMuYXV0aG9yaXRhdGl2ZUF0dGVtcHQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmF1dGhvcml0YXRpdmVBdHRlbXB0ID4gbWF4UmV0cmllcyArIDFcbiAgICApIHtcbiAgICAgIGNvbnN0IHJldHJ5Q291bnQgPSBtYXhSZXRyaWVzO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFN0ZXAgXCIke3N0ZXBOYW1lfVwiIGV4Y2VlZGVkIG1heCByZXRyaWVzICgke3JldHJ5Q291bnR9ICR7cGx1cmFsaXplKCdyZXRyeScsICdyZXRyaWVzJywgcmV0cnlDb3VudCl9KWA7XG4gICAgICBzdGVwTG9nZ2VyLmVycm9yKCdTdGVwIGV4Y2VlZGVkIG1heCByZXRyaWVzJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgc3RlcElkLFxuICAgICAgICBhdHRlbXB0OiBwYXJhbXMuYXV0aG9yaXRhdGl2ZUF0dGVtcHQsXG4gICAgICAgIG1heFJldHJpZXMsXG4gICAgICB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgbmV3IEZhdGFsRXJyb3IoZXJyb3JNZXNzYWdlKSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpLFxuICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUgKGEgY29uY3VycmVudCBoYW5kbGVyIG9yIGFuXG4gICAgICAgICAgLy8gZWFybGllciBkZWxpdmVyeSBmYWlsZWQvY29tcGxldGVkIGl0KSwgc28gbm90aGluZyB0byBkby5cbiAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwIGZvciBleGNlZWRlZCByZXRyaWVzLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5RXhoYXVzdGVkKHRydWUpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgIH1cblxuICAgIC8vIE1hcHMgYSBgc3RlcF9zdGFydGVkYCByZWplY3Rpb24gdG8gYSB0ZXJtaW5hbCBTdGVwRXhlY3V0aW9uUmVzdWx0LFxuICAgIC8vIHNoYXJlZCBieSB0aGUgYXdhaXQgcGF0aCAoYmVsb3cpIGFuZCB0aGUgb3B0aW1pc3RpYy1zdGFydCByZWNvbmNpbGlhdGlvbi5cbiAgICAvLyBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBlcnJvciBpcyBub3Qgb25lIHdlIHRyYW5zbGF0ZSAoY2FsbGVyIHJldGhyb3dzKS5cbiAgICBjb25zdCBzdGFydEVycm9yVG9SZXN1bHQgPSAoXG4gICAgICBlcnI6IHVua25vd25cbiAgICApOiBTdGVwRXhlY3V0aW9uUmVzdWx0IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGlmIChUaHJvdHRsZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlciA9IE1hdGgubWF4KFxuICAgICAgICAgIDEsXG4gICAgICAgICAgdHlwZW9mIGVyci5yZXRyeUFmdGVyID09PSAnbnVtYmVyJyA/IGVyci5yZXRyeUFmdGVyIDogMVxuICAgICAgICApO1xuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1Rocm90dGxlZCBvbiBzdGVwX3N0YXJ0ZWQsIGRlZmVycmluZycsIHtcbiAgICAgICAgICByZXRyeUFmdGVyU2Vjb25kczogcmV0cnlBZnRlcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICd0aHJvdHRsZWQnLCB0aW1lb3V0U2Vjb25kczogcmV0cnlBZnRlciB9O1xuICAgICAgfVxuICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHt3b3JrZmxvd1J1bklkfVwiIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgc3RlcCBcIiR7c3RlcElkfVwiOiAke2Vyci5tZXNzYWdlfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2dvbmUnIH07XG4gICAgICB9XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0ZXAgaW4gdGVybWluYWwgc3RhdGUsIHNraXBwaW5nJywge1xuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFNraXBwZWQodHJ1ZSksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwUmVhc29uKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgfVxuICAgICAgaWYgKFRvb0Vhcmx5RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWF4KDEsIGVyci5yZXRyeUFmdGVyID8/IDEpO1xuICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdGVwIHJldHJ5QWZ0ZXIgdGltZXN0YW1wIG5vdCB5ZXQgcmVhY2hlZCcsIHtcbiAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgdGltZW91dFNlY29uZHMsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAncmV0cnknLCB0aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuXG4gICAgLy8gT3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQ6IHdoZW4gd2UgaG9sZCB0aGUgc3RlcCBpbnB1dCBsb2NhbGx5IChsYXp5IGlubGluZVxuICAgIC8vIHBhdGgpIGFuZCB0aGUgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQsIGZpcmUgYHN0ZXBfc3RhcnRlZGAgV0lUSE9VVFxuICAgIC8vIGF3YWl0aW5nIGFuZCBydW4gdGhlIGJvZHkgYWdhaW5zdCBsb2NhbGx5LXN5bnRoZXNpemVkIHN0YXRlLiBBIGxhenkgc3RlcFxuICAgIC8vIGlzIGFsd2F5cyBicmFuZC1uZXcg4oeSIGF0dGVtcHQgMSwgbm8gcHJpb3IgZXJyb3IsIHN0YXJ0ZWQgbm93LCBzbyB3ZVxuICAgIC8vIGRvbid0IG5lZWQgdGhlIHNlcnZlciByb3VuZC10cmlwIHRvIGJlZ2luLiBXZSByZWNvbmNpbGUgdGhlIGluLWZsaWdodFxuICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIGJlZm9yZSBhbnkgdGVybWluYWwgd3JpdGUgKGByZWNvbmNpbGVPcHRpbWlzdGljU3RhcnRgKTogaWZcbiAgICAvLyBpdCBsb3N0IHRoZSBhdG9taWMgY3JlYXRlLWNsYWltICg0MDkpIG9yIHRoZSBydW4gaXMgZ29uZS90aHJvdHRsZWQsIHdlXG4gICAgLy8gZGlzY2FyZCB0aGUgYm9keSByZXN1bHQuIFJ1bm5pbmcgdGhlIGJvZHkgYmVmb3JlIGNvbmZpcm1pbmcgb3duZXJzaGlwIGNhblxuICAgIC8vIGV4ZWN1dGUgYSBzdGVwIG1vcmUgdGhhbiBvbmNlIHdoZW4gaGFuZGxlcnMgcmFjZSwgc28gaW5saW5lIHN0ZXAgYm9kaWVzXG4gICAgLy8gbXVzdCBiZSBpZGVtcG90ZW50OyBkaXNhYmxlIHZpYSBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVD0wLlxuICAgIC8vXG4gICAgLy8gVHVyYm8gbW9kZSBwYXNzZXMgYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YCB0byBlbmFibGUgdGhpcyByZWdhcmRsZXNzIG9mIHRoZVxuICAgIC8vIGVudiBmbGFnIChpdHMgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHJlbW92ZXMgdGhlIHJhY2UpLiBCdXQgaXQgc3RpbGxcbiAgICAvLyBkZWZlcnMgdG8gYW4gKmV4cGxpY2l0KiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlQ9MGA6IGZvcmNlZFxuICAgIC8vIG9wdGltaXN0aWMgc3RhcnQgcnVucyB0aGUgYm9keSBiZWZvcmUgYHN0ZXBfc3RhcnRlZGAvYHJ1bl9zdGFydGVkYCBpc1xuICAgIC8vIGNvbmZpcm1lZCwgd2hpY2ggaXMgZXhhY3RseSB0aGUgcHJvcGVydHkgYW4gb3BlcmF0b3Igb3B0cyBvdXQgb2Ygd2l0aCB0aGF0XG4gICAgLy8gZmxhZywgc28gYW4gZXhwbGljaXQgb3B0LW91dCB3aW5zIG92ZXIgdHVyYm8ncyBmb3JjZS5cbiAgICBjb25zdCBvcHRpbWlzdGljU3RhcnQgPVxuICAgICAgLy8gQSBwcmUtY2xhaW1lZCBzdGFydCBhbHJlYWR5IHNldHRsZWQgaXRzIGNsYWltIGluIHRoZSBzdXNwZW5zaW9uXG4gICAgICAvLyBiYXRjaDsgdGhlcmUgaXMgbm90aGluZyB0byBmaXJlIG9wdGltaXN0aWNhbGx5IChsYXp5U3RlcElucHV0IGlzXG4gICAgICAvLyBhbHNvIGFic2VudCBvbiB0aGF0IHBhdGg7IHRoaXMgdGVybSBpcyBkb2N1bWVudGF0aW9uKS5cbiAgICAgIHBhcmFtcy5wcmVjbGFpbWVkU3RhcnQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgLy8gU3RhbGUtc2Vuc2l0aXZlIGd1YXJkZWQgYmF0Y2hlcyBhd2FpdCB0aGUgY2xhaW0gc28gdGhlIDQxMiBmZW5jZVxuICAgICAgLy8gY292ZXJzIHRoZSBib2R5LCBub3QganVzdCBkdXJhYmxlIHdyaXRlczsgc2VlXG4gICAgICAvLyBTdGVwRXhlY3V0b3JQYXJhbXMuc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQuXG4gICAgICBwYXJhbXMuc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQgIT09IHRydWUgJiZcbiAgICAgIChpc09wdGltaXN0aWNJbmxpbmVTdGFydEVuYWJsZWQoKSB8fFxuICAgICAgICAocGFyYW1zLmZvcmNlT3B0aW1pc3RpY1N0YXJ0ID09PSB0cnVlICYmXG4gICAgICAgICAgIWlzT3B0aW1pc3RpY0lubGluZVN0YXJ0RXhwbGljaXRseURpc2FibGVkKCkpKTtcblxuICAgIGxldCBzdGVwOiBTdGFydGVkU3RlcDtcbiAgICAvLyBQYXJhbXMgZm9yIHRoZSBgc3RlcF9zdGFydGVkYCBjcmVhdGUgb24gZWl0aGVyIHBhdGggYmVsb3cuIFRoZSBzbG90XG4gICAgLy8gc25hcHNob3QgaXMgbm90IHNwcmVhZCBoZXJlOiBgY3JlYXRlRXZlbnRgIGF0dGFjaGVzIGl0IHRvIGV2ZXJ5IHdyaXRlLFxuICAgIC8vIHRoaXMgb25lIGluY2x1ZGVkLlxuICAgIGNvbnN0IHN0YXJ0RXZlbnRQYXJhbXMgPSBzdGVwU3RhcnRlZEV2ZW50UGFyYW1zO1xuICAgIC8vIGBEYXRlLm5vdygpYCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGBzdGVwX3N0YXJ0ZWRgIGNyZWF0ZSBpc1xuICAgIC8vIGlzc3VlZCAoZWl0aGVyIHBhdGggYmVsb3cpOyBhbmNob3JzIFJTRlMncyBlbmQgcG9pbnQuIFNlZVxuICAgIC8vIFN0ZXBMYXRlbmN5RXZlbnREYXRhLnJzZnMgYW5kIHRoZSBjYWxsIHNpdGVzIGJlbG93LlxuICAgIGxldCBzdGVwU3RhcnRQb3N0U2VudEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBgRGF0ZS5ub3coKWAgdGFrZW4gb25jZSB0aGUgYHN0ZXBfc3RhcnRlZGAgcmVzcG9uc2UgaGFzIHJldHVybmVkIGFuZCB0aGVcbiAgICAvLyBjbGFpbSBzdWNjZWVkZWQ6IFQ2IG9mIHRoZSBob29rLXJlc3VtZSBUVFIgd2luZG93LiBPbmx5IHRoZSBhd2FpdCBwYXRoXG4gICAgLy8gY2FuIHNldCBpdDogb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgZGVsaWJlcmF0ZWx5IGRvZXMgbm90IHdhaXQgZm9yIHRoZVxuICAgIC8vIGNsYWltIGJlZm9yZSBydW5uaW5nIHRoZSBib2R5LCBzbyBhdCBUNyBpdCBoYXMgbm8gY29tcGxldGlvbiBpbnN0YW50IGFuZFxuICAgIC8vIHRoZSBUVFIgYnJlYWtkb3duIHJlcG9ydHMgbm8gYHN0ZXBfY2xhaW1fbXNgIChzZWVcbiAgICAvLyBydW50aW1lL3Jlc3VtZS1sYXRlbmN5LnRzKS5cbiAgICBsZXQgc3RlcENsYWltQ29tcGxldGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIC8vIFNldHRsZWQgb3V0Y29tZSBvZiB0aGUgaW4tZmxpZ2h0IG9wdGltaXN0aWMgYHN0ZXBfc3RhcnRlZGAuIEhhbmRsZXJzIGFyZVxuICAgIC8vIGF0dGFjaGVkIHN5bmNocm9ub3VzbHkgKGAudGhlbihvaywgZXJyKWApIHNvIGEgZmFzdCByZWplY3Rpb24gbmV2ZXJcbiAgICAvLyBzdXJmYWNlcyBhcyBhbiB1bmhhbmRsZWRSZWplY3Rpb24gd2hpbGUgdGhlIGJvZHkgcnVucy5cbiAgICBsZXQgb3B0aW1pc3RpY1N0YXJ0U2V0dGxlZDpcbiAgICAgIHwgUHJvbWlzZTx7IG9rOiB0cnVlIH0gfCB7IG9rOiBmYWxzZTsgZXJyOiB1bmtub3duIH0+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICAvLyBBd2FpdCB0aGUgb3B0aW1pc3RpYyBgc3RlcF9zdGFydGVkYCBvdXRjb21lIGFuZCB0cmFuc2xhdGUgYSBsb3N0IHJhY2UgL1xuICAgIC8vIHRlcm1pbmFsIHJ1biAvIHRocm90dGxlIGludG8gYSByZXN1bHQgdGhhdCBzaG9ydC1jaXJjdWl0cyB0aGUgYm9keVxuICAgIC8vIG91dHB1dC4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB3ZSBvd24gdGhlIHN0ZXAgYW5kIG1heSB3cml0ZSBpdHMgdGVybWluYWxcbiAgICAvLyBldmVudC4gQSBub24tdHJhbnNsYXRhYmxlIHJlamVjdGlvbiBpcyByZXRocm93biAoc28gYSB0cmFuc2llbnRcbiAgICAvLyBzdGVwX3N0YXJ0ZWQgZmFpbHVyZSBwcm9wYWdhdGVzIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZWRlbGl2ZXJ5LFxuICAgIC8vIGV4YWN0bHkgYXMgb24gdGhlIGF3YWl0IHBhdGgpLiBJZGVtcG90ZW50OiBzYWZlIHRvIGNhbGwgbW9yZSB0aGFuIG9uY2UuXG4gICAgY29uc3QgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0ID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgICBTdGVwRXhlY3V0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4gICAgPiA9PiB7XG4gICAgICBpZiAoIW9wdGltaXN0aWNTdGFydFNldHRsZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgb3B0aW1pc3RpY1N0YXJ0U2V0dGxlZDtcbiAgICAgIGlmIChzZXR0bGVkLm9rKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgbWFwcGVkID0gc3RhcnRFcnJvclRvUmVzdWx0KHNldHRsZWQuZXJyKTtcbiAgICAgIGlmICghbWFwcGVkKSB0aHJvdyBzZXR0bGVkLmVycjtcbiAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfTtcblxuICAgIGlmIChwYXJhbXMucHJlY2xhaW1lZFN0YXJ0Py5vd25lZCkge1xuICAgICAgLy8gUHJlLWNsYWltZWQgaW5saW5lIHN0YXJ0OiB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyJ3MgYmF0Y2hlZCBmYW4tb3V0XG4gICAgICAvLyBhbHJlYWR5IGNvbW1pdHRlZCB0aGlzIHN0ZXAncyBgc3RlcF9jcmVhdGVkYCArIGBzdGVwX3N0YXJ0ZWRgIHBhaXIsXG4gICAgICAvLyBzbyB0aGlzIGV4ZWN1dGlvbiBvd25zIGEgc3RhcnRlZCBhdHRlbXB0LTEgc3RlcCB3aXRob3V0IHNlbmRpbmcgYVxuICAgICAgLy8gc3RhcnQgb2YgaXRzIG93bjogdGhlIGJvZHkgYmVnaW5zIHN0cmFpZ2h0IG9mZiB0aGUgYmF0Y2ggY29tbWl0IGFuZFxuICAgICAgLy8gdGhlIHRlcm1pbmFsIHdyaXRlIGJlbG93IGhhcyBubyBpbi1mbGlnaHQgY2xhaW0gdG8gcmVjb25jaWxlLiBUaGVcbiAgICAgIC8vIGJhdGNoIHRpbWVzdGFtcHMgc3RhbmQgaW4gZm9yIHRoZSBjbGFpbSdzOiB0aGUgUE9TVCBpbnN0YW50IGFuY2hvcnNcbiAgICAgIC8vIFJTRlMsIHRoZSByZXNwb25zZSBpbnN0YW50IGlzIFRUUidzIGNsYWltIGNvbXBsZXRpb24gKFQ2KS5cbiAgICAgIHN0ZXAgPSBwYXJhbXMucHJlY2xhaW1lZFN0YXJ0LnN0ZXA7XG4gICAgICBzdGVwU3RhcnRQb3N0U2VudEF0TXMgPSBwYXJhbXMucHJlY2xhaW1lZFN0YXJ0LmJhdGNoUG9zdFNlbnRBdE1zO1xuICAgICAgc3RlcENsYWltQ29tcGxldGVkQXRNcyA9IHBhcmFtcy5wcmVjbGFpbWVkU3RhcnQuY2xhaW1Db21wbGV0ZWRBdE1zO1xuICAgIH0gZWxzZSBpZiAob3B0aW1pc3RpY1N0YXJ0KSB7XG4gICAgICAvLyBDaGFpbiB0aGUgbGF6eSBgc3RlcF9zdGFydGVkYCBvbiB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgKHR1cmJvIG1vZGUpOlxuICAgICAgLy8gdGhlIHN0ZXAgY2FuJ3QgYmUgY3JlYXRlZCBiZWZvcmUgaXRzIHJ1biBleGlzdHMsIGJ1dCB0aGUgYm9keSBiZWxvd1xuICAgICAgLy8gcnVucyBpbW1lZGlhdGVseSBhZ2FpbnN0IHN5bnRoZXNpemVkIHN0YXRlLCBzbyB0aGUgYHJ1bl9zdGFydGVkYFxuICAgICAgLy8gcm91bmQtdHJpcCBvdmVybGFwcyB0aGUgYm9keSByYXRoZXIgdGhhbiBibG9ja2luZyBpdC4gT3V0c2lkZSB0dXJibyB0aGVcbiAgICAgIC8vIGJhcnJpZXIgaXMgdW5kZWZpbmVkIGFuZCB0aGlzIGlzIGEgcGxhaW4gY3JlYXRlLlxuICAgICAgY29uc3Qgc3RhcnRlZFByb21pc2UgPSAocGFyYW1zLnJ1blJlYWR5QmFycmllciA/PyBQcm9taXNlLnJlc29sdmUoKSkudGhlbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIFRha2VuIHJpZ2h0IGJlZm9yZSB0aGUgY3JlYXRlIGZpcmVzLCBub3QgYmVmb3JlIHRoZSBiYXJyaWVyOlxuICAgICAgICAgIC8vIFJTRlMgbWVhc3VyZXMgdGhlIHJ1bl9zdGFydGVkLXRvLVBPU1Qgc3RyZXRjaCwgYW5kIHRoZSBiYXJyaWVyXG4gICAgICAgICAgLy8gd2FpdCBJUyBwYXJ0IG9mIHRoYXQgc3RyZXRjaCB1bmRlciB0dXJiby5cbiAgICAgICAgICBzdGVwU3RhcnRQb3N0U2VudEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVFdmVudChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9zdGFydGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBpbnB1dDogcGFyYW1zLmxhenlTdGVwSW5wdXQsXG4gICAgICAgICAgICAgICAgLy8gSW5saW5lLW93bmVyc2hpcCBzdGFtcDsgc2VlIFN0ZXBFeGVjdXRvclBhcmFtcy5vd25lck1lc3NhZ2VJZC5cbiAgICAgICAgICAgICAgICAuLi4ocGFyYW1zLm93bmVyTWVzc2FnZUlkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgID8geyBvd25lck1lc3NhZ2VJZDogcGFyYW1zLm93bmVyTWVzc2FnZUlkIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIEd1YXJkIHRoZSBjbGFpbTsgc2VlIFN0ZXBFeGVjdXRvclBhcmFtcy5zbG90U25hcHNob3QuIEFcbiAgICAgICAgICAgIC8vIHN0YWxlICg0MTIpIHJlamVjdGlvbiBzdXJmYWNlcyB2aWEgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0IGFzIGFcbiAgICAgICAgICAgIC8vIG5vbi10cmFuc2xhdGFibGUgZXJyb3I6IHRoZSBib2R5IHJlc3VsdCBpcyBkaXNjYXJkZWQgYW5kIHRoZVxuICAgICAgICAgICAgLy8gcmVqZWN0aW9uIHByb3BhZ2F0ZXMgdG8gdGhlIGNhbGxlci5cbiAgICAgICAgICAgIHN0YXJ0RXZlbnRQYXJhbXNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgb3B0aW1pc3RpY1N0YXJ0U2V0dGxlZCA9IHN0YXJ0ZWRQcm9taXNlLnRoZW4oXG4gICAgICAgICgpID0+ICh7IG9rOiB0cnVlIGFzIGNvbnN0IH0pLFxuICAgICAgICAoZXJyKSA9PiAoeyBvazogZmFsc2UgYXMgY29uc3QsIGVyciB9KVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICBzdGVwID0ge1xuICAgICAgICBydW5JZDogd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgc3RlcElkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgIGlucHV0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgYXR0ZW1wdDogMSxcbiAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHN0ZXBfc3RhcnRlZCB2YWxpZGF0ZXMgc3RhdGUgYW5kIHJldHVybnMgdGhlIHN0ZXAgZW50aXR5LiBPbiB0aGUgbGF6eVxuICAgICAgLy8gaW5saW5lIHBhdGggd2UgYWxzbyBjYXJyeSB0aGUgc3RlcCBgaW5wdXRgIHNvIHRoZSB3b3JsZCBjcmVhdGVzIHRoZVxuICAgICAgLy8gc3RlcCBvbiB0aGUgZmx5IChubyBzZXBhcmF0ZSBzdGVwX2NyZWF0ZWQgcm91bmQtdHJpcCkuIFRoZSB3b3JsZCdzXG4gICAgICAvLyBhdG9taWMgY3JlYXRlLWNsYWltIG1ha2VzIHRoaXMgZXhhY3RseS1vbmUtb3duZXI6IGEgY29uY3VycmVudCBsb3NlclxuICAgICAgLy8gZ2V0cyBFbnRpdHlDb25mbGljdEVycm9yLCBtYXBwZWQgdG8gYHsgdHlwZTogJ3NraXBwZWQnIH1gLCBzbyBpdCBuZXZlclxuICAgICAgLy8gcnVucyB0aGUgYm9keS4gV2hlbiBgbGF6eVN0ZXBJbnB1dGAgaXMgYWJzZW50IHRoaXMgaXMgdGhlIGxlZ2FjeVxuICAgICAgLy8gc3RlcF9zdGFydGVkIChzdGVwIGFscmVhZHkgY3JlYXRlZCwgbm8gcGF5bG9hZCkuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBJbmxpbmUtb3duZXJzaGlwIHN0YW1wOiBwcmVzZW50IG9uIHRoZSBsYXp5IHBhdGhzIEFORCBvbiB0aGVcbiAgICAgICAgLy8gb3duZWQtcmVjb3ZlcnkgcGF5bG9hZC1sZXNzIHN0YXJ0IChhIHJlZGVsaXZlcnkgb2YgdGhlIG93bmluZ1xuICAgICAgICAvLyBtZXNzYWdlIHJlLWV4ZWN1dGluZyBpdHMgc3RlcCBtdXN0IHJlLXN0YW1wLCBzaW5jZSBvd25lcnNoaXAgZGVyaXZlc1xuICAgICAgICAvLyBmcm9tIHRoZSBsYXRlc3Qgc3RhcnQsIHNvIGFuIHVuc3RhbXBlZCByZWNvdmVyeSBzdGFydCB3b3VsZCByZWFkXG4gICAgICAgIC8vIGFzIFwidW5vd25lZFwiIHRvIGEgbGF0ZXIgd2FrZSkuIE9ubHkgdGhlIGJhY2tncm91bmQtc3RlcCBwYXRoXG4gICAgICAgIC8vIHBhc3NlcyBubyBvd25lck1lc3NhZ2VJZDogaXRzIHN0YXJ0IGlzIHRoZSBiYXJlIG9uZSwgY2xlYXJpbmdcbiAgICAgICAgLy8gb3duZXJzaGlwIGFzIGludGVuZGVkLlxuICAgICAgICBjb25zdCBvd25lcnNoaXBTdGFtcCA9XG4gICAgICAgICAgcGFyYW1zLm93bmVyTWVzc2FnZUlkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBvd25lck1lc3NhZ2VJZDogcGFyYW1zLm93bmVyTWVzc2FnZUlkIH1cbiAgICAgICAgICAgIDoge307XG4gICAgICAgIHN0ZXBTdGFydFBvc3RTZW50QXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0UmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9zdGFydGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgIGV2ZW50RGF0YTpcbiAgICAgICAgICAgICAgcGFyYW1zLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGFyYW1zLmxhenlTdGVwSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIC4uLm93bmVyc2hpcFN0YW1wLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogeyBzdGVwTmFtZSwgLi4ub3duZXJzaGlwU3RhbXAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIEd1YXJkIHRoZSBjbGFpbTsgc2VlIFN0ZXBFeGVjdXRvclBhcmFtcy5zbG90U25hcHNob3QuIEFcbiAgICAgICAgICAvLyBzdGFsZSAoNDEyKSByZWplY3Rpb24gaXMgaW50ZW50aW9uYWxseSBOT1QgdHJhbnNsYXRlZCBieVxuICAgICAgICAgIC8vIHN0YXJ0RXJyb3JUb1Jlc3VsdCBiZWxvdywgc28gaXQgcHJvcGFnYXRlcyB0byB0aGUgY2FsbGVyIGZvciBhXG4gICAgICAgICAgLy8gZnJlc2ggcmVwbGF5LlxuICAgICAgICAgIHN0YXJ0RXZlbnRQYXJhbXNcbiAgICAgICAgKTtcbiAgICAgICAgc3RlcENsYWltQ29tcGxldGVkQXRNcyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgc3RlcCA9IHN0YXJ0UmVzdWx0LnN0ZXA7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gc3RhcnRFcnJvclRvUmVzdWx0KGVycik7XG4gICAgICAgIGlmIChtYXBwZWQpIHJldHVybiBtYXBwZWQ7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdGVwIGV4ZWN1dGlvbiBkZXRhaWxzJywge1xuICAgICAgc3RlcE5hbWUsXG4gICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgc3RhdHVzOiBzdGVwLnN0YXR1cyxcbiAgICAgIGF0dGVtcHQ6IHN0ZXAuYXR0ZW1wdCxcbiAgICB9KTtcblxuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoc3RlcC5zdGF0dXMpLFxuICAgIH0pO1xuXG4gICAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICAgIC8vIENoZWNrIG1heCByZXRyaWVzIEFGVEVSIHN0ZXBfc3RhcnRlZCAoYXR0ZW1wdCB3YXMganVzdCBpbmNyZW1lbnRlZCkuXG4gICAgLy8gT25seSBlbmZvcmNlIHdoZW4gdGhlIHN0ZXAgaGFzIGEgcHJldmlvdXMgZXJyb3I7IHRoaXMgZGlzdGluZ3Vpc2hlc1xuICAgIC8vIGFjdHVhbCByZXRyaWVzIChmYWlsZWQg4oaSIHJldHJ5KSBmcm9tIGNvbmN1cnJlbnQgaW5saW5lIHN0YXJ0c1xuICAgIC8vIGV4ZWN1dGlvbiBsb29wIGNhbiBjYXVzZSBtdWx0aXBsZSBoYW5kbGVycyB0byBzdGVwX3N0YXJ0ZWQgdGhlIHNhbWVcbiAgICAvLyBzdGVwIHNpbXVsdGFuZW91c2x5LCBpbmZsYXRpbmcgdGhlIGF0dGVtcHQgY291bnRlciB3aXRob3V0IGFueSBmYWlsdXJlKS5cbiAgICBpZiAoc3RlcC5hdHRlbXB0ID4gbWF4UmV0cmllcyArIDEgJiYgc3RlcC5lcnJvcikge1xuICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgZXhjZWVkZWQgbWF4IHJldHJpZXMgKCR7cmV0cnlDb3VudH0gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCByZXRyeUNvdW50KX0pYDtcbiAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoJ1N0ZXAgZXhjZWVkZWQgbWF4IHJldHJpZXMnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICByZXRyeUNvdW50LFxuICAgICAgfSk7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgcHJpb3IgYXR0ZW1wdCdzIHNlcmlhbGl6ZWQgZXJyb3IgYXMgdGhlIGNhdXNlIHNvIHRoZVxuICAgICAgLy8gdW5kZXJseWluZyBmYWlsdXJlIGlzIHJlY292ZXJhYmxlIGZyb20gYHN0ZXAuZXJyb3IuY2F1c2VgIGFmdGVyXG4gICAgICAvLyBoeWRyYXRpb24sIHdpdGhvdXQgZm9yY2luZyBjb25zdW1lcnMgdG8gd2FsayB0aGUgc3RlcF9yZXRyeWluZ1xuICAgICAgLy8gZXZlbnQgaGlzdG9yeS4gQmVzdC1lZmZvcnQ6IGlmIGh5ZHJhdGlvbiBvZiB0aGUgcHJpb3IgYHN0ZXAuZXJyb3JgXG4gICAgICAvLyB0aHJvd3MsIGZhbGwgYmFjayB0byBhIEZhdGFsRXJyb3Igd2l0aG91dCBjYXVzZS5cbiAgICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICBpZiAoc3RlcC5lcnJvciAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgKHdyYXBwZWRFcnJvciBhcyBFcnJvcikuY2F1c2UgPSBhd2FpdCBoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgc3RlcC5lcnJvcixcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmU6IGJlc3QtZWZmb3J0IGNhdXNlIGF0dGFjaG1lbnQuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgd3JhcHBlZEVycm9yLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5RXhoYXVzdGVkKHRydWUpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgIH1cblxuICAgIC8vIE9wcyB0aGF0IG11c3QgYmUgZHVyYWJseSBjb21taXR0ZWQgYmVmb3JlIHN0ZXAgY29tcGxldGlvbiAoZS5nLiBhXG4gICAgLy8gc3RlcC1pbml0aWF0ZWQgYWJvcnQncyBob29rX3JlY2VpdmVkIGV2ZW50KS4gU2VlIFN0ZXBDb250ZXh0LiBEZWNsYXJlZFxuICAgIC8vIG91dHNpZGUgdGhlIHRyeSBzbyB0aGUgZmFpbHVyZSBwYXRoIGJlbG93IGNhbiBhbHNvIGRyYWluIHRoZW0uXG4gICAgY29uc3QgcHJlQ29tcGxldGlvbk9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgY29uc3Qgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBsZXQgb3BzU2V0dGxlZCA9IHRydWU7XG5cbiAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeSB0byBhdHRhY2ggdG8gdGhpcyBzdGVwJ3MgdGVybWluYWwgZXZlbnQuIENvbXB1dGVkXG4gICAgLy8gcmlnaHQgYmVmb3JlIHVzZXIgY29kZSBydW5zOyBkZWNsYXJlZCBoZXJlIHNvIHRoZSBmYWlsdXJlIHBhdGggKHRoZVxuICAgIC8vIGNhdGNoIGJlbG93KSBjYW4gYXR0YWNoIGl0IHRvIHN0ZXBfZmFpbGVkIHRvby5cbiAgICBsZXQgbGF0ZW5jeUV2ZW50RGF0YTogU3RlcExhdGVuY3lFdmVudERhdGEgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBCYWNrZmlsbCBSU0ZTIG9udG8gdGhlIGFscmVhZHktY29tcHV0ZWQgdGVsZW1ldHJ5IG9uY2UgdGhlIG9wdGltaXN0aWNcbiAgICAvLyB0dXJibyBzdGFydCBoYXMgc2V0dGxlZC4gT24gdGhhdCBwYXRoIHRoZSBzdGVwLXN0YXJ0IFBPU1QgZmlyZXMgaW5zaWRlXG4gICAgLy8gdGhlIHJ1bi1yZWFkeSBiYXJyaWVyJ3MgYC50aGVuYCwgc28gYHN0ZXBTdGFydFBvc3RTZW50QXRNc2AgKGFuZFxuICAgIC8vIHRoZXJlZm9yZSBSU0ZTKSBpcyB1c3VhbGx5IHN0aWxsIHVuc2V0IHdoZW4gYGxhdGVuY3lFdmVudERhdGFgIGlzXG4gICAgLy8gZmlyc3QgY29tcHV0ZWQganVzdCBiZWZvcmUgdXNlciBjb2RlICh0aGUgYmFycmllciBpcyBzdGlsbCBpbiBmbGlnaHRcbiAgICAvLyBmb3IgYW55IG5vbi10cml2aWFsIGBydW5fc3RhcnRlZGAgcm91bmQtdHJpcCwgd2hpY2ggaXMgZXhhY3RseSB0aGVcbiAgICAvLyBzbG93LXJ1bl9zdGFydGVkIGNhc2UgUlNGUyBleGlzdHMgdG8gbWVhc3VyZSkuIEJ5IHRoZSB0aW1lXG4gICAgLy8gYHJlY29uY2lsZU9wdGltaXN0aWNTdGFydCgpYCBoYXMgYXdhaXRlZCB0aGUgYmFycmllciB0aGUgUE9TVCB0aW1lc3RhbXBcbiAgICAvLyBpcyBrbm93biwgc28gd2UgcGF0Y2ggUlNGUyBpbiBiZWZvcmUgdGhlIHRlcm1pbmFsIGV2ZW50IGlzIHdyaXR0ZW4uXG4gICAgLy8gV2l0aG91dCB0aGlzLCBzbG93LXJ1bl9zdGFydGVkIHNhbXBsZXMgYXJlIGRyb3BwZWQsIGJpYXNpbmcgUlNGU1xuICAgIC8vIHBlcmNlbnRpbGVzIGxvdyAobWlzc2luZy1ub3QtYXQtcmFuZG9tKS4gUmVjb21wdXRlcyBvbmx5IFJTRlM7XG4gICAgLy8gVFRGUy9TVFNPIHN0YXkgYW5jaG9yZWQgdG8gYGV4ZWN1dGlvblN0YXJ0VGltZWAgYXMgY29tcHV0ZWQgYWJvdmUuXG4gICAgY29uc3QgYmFja2ZpbGxPcHRpbWlzdGljUnNmcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghbGF0ZW5jeUV2ZW50RGF0YSB8fCBsYXRlbmN5RXZlbnREYXRhLnJzZnMgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgY29uc3QgYW5jaG9yTXMgPSBwYXJhbXMubGF0ZW5jeVRyYWNraW5nPy5yc2ZzQW5jaG9yTXM7XG4gICAgICBpZiAoYW5jaG9yTXMgPT09IHVuZGVmaW5lZCB8fCBzdGVwU3RhcnRQb3N0U2VudEF0TXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgbGF0ZW5jeUV2ZW50RGF0YS5yc2ZzID0gTWF0aC5tYXgoMCwgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zIC0gYW5jaG9yTXMpO1xuICAgICAgaWYgKHNwYW4pIHtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJzZnNNcyhsYXRlbmN5RXZlbnREYXRhLnJzZnMpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF0dGVtcHQgPSBzdGVwLmF0dGVtcHQ7XG5cbiAgICAgIGlmICghc3RlcC5zdGFydGVkQXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgIGBTdGVwIFwiJHtzdGVwSWR9XCIgaGFzIG5vIFwic3RhcnRlZEF0XCIgdGltZXN0YW1wYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RlcFN0YXJ0ZWRBdCA9IHN0ZXAuc3RhcnRlZEF0O1xuICAgICAgLy8gVXNlIHRoZSBwcm92aWRlZCBlbmNyeXB0aW9uIGtleSB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHJlc29sdmVcbiAgICAgIC8vIHRocm91Z2ggdGhlIG1lbW9pemVkIGFjY2Vzc29yIGRlY2xhcmVkIGF0IHRoZSB0b3Agb2YgdGhpcyB0cmFjZS5cbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBwYXJhbXMuZW5jcnlwdGlvbktleSA/PyAoYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpKTtcbiAgICAgIGNvbnN0IGh5ZHJhdGVkSW5wdXQgPSBhd2FpdCB0cmFjZShcbiAgICAgICAgJ3N0ZXAuaHlkcmF0ZScsXG4gICAgICAgIHt9LFxuICAgICAgICBhc3luYyAoaHlkcmF0ZVNwYW4pID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gYXdhaXQgaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICBzdGVwLmlucHV0LFxuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBwYXJhbXMud29ya2Zsb3dEZXBsb3ltZW50SWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgIGh5ZHJhdGVTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXJndW1lbnRzQ291bnQoaHlkcmF0ZWQuYXJncy5sZW5ndGgpLFxuICAgICAgICAgICAgLi4uQXR0cmlidXRlLlF1ZXVlRGVzZXJpYWxpemVUaW1lTXMoZHVyYXRpb25NcyksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGh5ZHJhdGVkO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBGaW5hbGl6YXRpb24gb2YgYW4gdW5zZXJpYWxpemFibGUtYXJndW1lbnQgc3RlcCB3cml0ZXMgc3RlcF9jcmVhdGVkXG4gICAgICAvLyAocGxhY2Vob2xkZXIgaW5wdXQpIGFuZCBzdGVwX2ZhaWxlZCBhcyB0d28gc2VwYXJhdGUgZHVyYWJsZSB3cml0ZXMuXG4gICAgICAvLyBBIGNyYXNoIG9yIHRyYW5zaWVudCBmYWlsdXJlIGJldHdlZW4gdGhlbSBsZWF2ZXMgdGhpcyBzdGVwIHBlbmRpbmdcbiAgICAgIC8vIHdpdGggdGhlIHBsYWNlaG9sZGVyIHN0b3JlZCBhcyBpdHMgaW5wdXQsIGFuZCBub3JtYWwgY3Jhc2ggcmVjb3ZlcnlcbiAgICAgIC8vIHRoZW4gZGlzcGF0Y2hlcyBpdCBoZXJlLiBORVZFUiBydW4gdXNlciBjb2RlIHdpdGggcGxhY2Vob2xkZXJcbiAgICAgIC8vIGFyZ3VtZW50czsgY29tcGxldGUgdGhlIGludGVuZGVkIGZhaWx1cmUgaW5zdGVhZC4gVGhlXG4gICAgICAvLyBTZXJpYWxpemF0aW9uRXJyb3IgaXMgZmF0YWwgKGBmYXRhbDogdHJ1ZWApLCBzbyB0aGUgY2F0Y2ggYmVsb3dcbiAgICAgIC8vIHdyaXRlcyBzdGVwX2ZhaWxlZCB3aXRob3V0IHJldHJpZXMsIGV4YWN0bHkgd2hhdCB0aGUgaW50ZXJydXB0ZWRcbiAgICAgIC8vIGZpbmFsaXphdGlvbiB3YXMgYWJvdXQgdG8gZG8uXG4gICAgICBpZiAoaXNVbnNlcmlhbGl6YWJsZVN0ZXBJbnB1dFBsYWNlaG9sZGVyKGh5ZHJhdGVkSW5wdXQpKSB7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICdzdGVwIGFyZ3VtZW50cycsXG4gICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50IH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhcmdzID0gaHlkcmF0ZWRJbnB1dC5hcmdzO1xuICAgICAgY29uc3QgdGhpc1ZhbCA9IGh5ZHJhdGVkSW5wdXQudGhpc1ZhbCA/PyBudWxsO1xuICAgICAgY29uc3Qgd29ya2Zsb3dCYXNlVXJsID0gY3JlYXRlV29ya2Zsb3dCYXNlVXJsKFxuICAgICAgICBpc1ZlcmNlbFxuICAgICAgICAgID8gYGh0dHBzOi8vJHtwcm9jZXNzLmVudi5WRVJDRUxfVVJMfWBcbiAgICAgICAgICA6IGBodHRwOi8vbG9jYWxob3N0OiR7KGF3YWl0IGdldFBvcnRMYXp5KCkpID8/IDMwMDB9YFxuICAgICAgKTtcblxuICAgICAgLy8gLS0tIFVzZXIgY29kZSBleGVjdXRpb24gLS0tXG4gICAgICAvLyBXcmFwIG9ubHkgc3RlcEZuLmFwcGx5KCkgKHVzZXIgc3RlcCBjb2RlKSBzbyBjbGVhbnVwIGJlbG93IHJ1bnMgb25cbiAgICAgIC8vIEJPVEggc3VjY2VzcyBhbmQgZmFpbHVyZS4gQSB1c2VyLWNvZGUgdGhyb3cgaXMgY2FwdHVyZWQgaGVyZSBhbmRcbiAgICAgIC8vIHJlLXJhaXNlZCBhZnRlciBjYW5jZWxBYm9ydFJlYWRlcnMsIHNvIGl0IHN0aWxsIGZsb3dzIHRvIHRoZSBvdXRlclxuICAgICAgLy8gY2F0Y2ggKHN0ZXBfZmFpbGVkL3N0ZXBfcmV0cnlpbmcpLCBidXQgdGhlIGFib3J0LXN0cmVhbSByZWFkZXIgaXNcbiAgICAgIC8vIHRvcm4gZG93biBmaXJzdC4gV2l0aG91dCB0aGlzLCBhIHRocm93aW5nL3JldHJ5aW5nIHNpZ25hbC1iZWFyaW5nXG4gICAgICAvLyBzdGVwIHdvdWxkIGxlYWsgYSByZWFsLXRpbWUgYWJvcnQgcmVhZGVyIHBlciBhdHRlbXB0LlxuICAgICAgbGV0IHVzZXJDb2RlRXJyb3I6IHVua25vd247XG4gICAgICBsZXQgdXNlckNvZGVGYWlsZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgZXhlY3V0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGxhdGVuY3lFdmVudERhdGEgPSBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGEoe1xuICAgICAgICB0cmFja2luZzogcGFyYW1zLmxhdGVuY3lUcmFja2luZyxcbiAgICAgICAgc3RlcENvZGVTdGFydGVkQXRNczogZXhlY3V0aW9uU3RhcnRUaW1lLFxuICAgICAgICBhdHRlbXB0LFxuICAgICAgICBsYXp5U3RlcFN0YXJ0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICBvcHRpbWlzdGljU3RhcnQsXG4gICAgICAgIHByZWNsYWltZWRTdGFydDogcGFyYW1zLnByZWNsYWltZWRTdGFydCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICBzdGVwU3RhcnRQb3N0U2VudEF0TXMsXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXRlbmN5RXZlbnREYXRhKSB7XG4gICAgICAgIC8vIE1pcnJvciB0aGUgbGF0ZW5jeSB0ZWxlbWV0cnkgb250byB0aGUgc3RlcCBzcGFuIHNvIHRyYWNlcyBzaG93XG4gICAgICAgIC8vIFRURlMvU1RTTy9SU0ZTIGFsb25nc2lkZSB0aGUgZmxhbWUgZ3JhcGgsIG5vdCBqdXN0IERhdGFkb2cgbWV0cmljcy5cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uKGxhdGVuY3lFdmVudERhdGEudHRmcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IEF0dHJpYnV0ZS5TdGVwVHRmc01zKGxhdGVuY3lFdmVudERhdGEudHRmcylcbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLihsYXRlbmN5RXZlbnREYXRhLnN0c28gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBBdHRyaWJ1dGUuU3RlcFN0c29NcyhsYXRlbmN5RXZlbnREYXRhLnN0c28pXG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAuLi4obGF0ZW5jeUV2ZW50RGF0YS5yc2ZzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gQXR0cmlidXRlLlN0ZXBSc2ZzTXMobGF0ZW5jeUV2ZW50RGF0YS5yc2ZzKVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uKGxhdGVuY3lFdmVudERhdGEuZmluYWxTY2hlZHVsaW5nUmVwbGF5ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gQXR0cmlidXRlLlN0ZXBGaW5hbFNjaGVkdWxpbmdSZXBsYXlNcyhcbiAgICAgICAgICAgICAgICBsYXRlbmN5RXZlbnREYXRhLmZpbmFsU2NoZWR1bGluZ1JlcGxheVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcExhdGVuY3lPcHRpbWl6YXRpb25zKFxuICAgICAgICAgICAgbGF0ZW5jeUV2ZW50RGF0YS5vcHRpbWl6YXRpb25zID8/IFtdXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIENsb3NlIHRoZSBob29rLXJlc3VtZSBUVFIgbWVhc3VyZW1lbnQgKHNlZSBydW50aW1lL3Jlc3VtZS1sYXRlbmN5LnRzKS5cbiAgICAgICAqXG4gICAgICAgKiBDYWxsZWQgZnJvbSBJTlNJREUgYGNvbnRleHRTdG9yYWdlLnJ1bmAsIGltbWVkaWF0ZWx5IGJlZm9yZVxuICAgICAgICogYHN0ZXBGbi5hcHBseSgpYCwgZGVsaWJlcmF0ZWx5IG5vdCBhbG9uZ3NpZGUgdGhlIHN0ZXAtbGF0ZW5jeVxuICAgICAgICogdGVsZW1ldHJ5IGFib3ZlLiBgZXhlY3V0aW9uU3RhcnRUaW1lYCBpcyB0YWtlbiBiZWZvcmUgdGhlIGlubmVyXG4gICAgICAgKiBgc3RlcC5leGVjdXRlYCBzcGFuIGFuZCB0aGUgc3RlcCBjb250ZXh0IGFyZSBlc3RhYmxpc2hlZCwgYW5kXG4gICAgICAgKiBgc3RlcF9wcmVwYXJlX21zYCBpcyBkb2N1bWVudGVkIHRvIGluY2x1ZGUgZXhhY3RseSB0aGF0IHNldHVwLCBzb1xuICAgICAgICogYW5jaG9yaW5nIFQ3IHRoZXJlIHdvdWxkIHVuZGVyLXJlcG9ydCBib3RoIHRoZSBwaGFzZSBhbmQgdGhlIHRvdGFsLlxuICAgICAgICogVFRGUy9TVFNPIGtlZXAgdGhlaXIgb3duIGFuY2hvciBzbyB0aGlzIGNoYW5nZXMgbm90aGluZyBhYm91dCB0aGVtLlxuICAgICAgICpcbiAgICAgICAqIFRoZSBgcmVwb3J0ZWRgIGxhdGNoIG1ha2VzIG9uZSByZXN1bXB0aW9uIHlpZWxkIG9uZSBzYW1wbGUgZXZlblxuICAgICAgICogdGhvdWdoIGV2ZXJ5IHN0ZXAgb2YgYW4gaW5saW5lIGJhdGNoIGlzIGhhbmRlZCB0aGUgc2FtZSB0cmFja2luZ1xuICAgICAgICogb2JqZWN0OiB3aGljaGV2ZXIgc3RlcCBmaXJzdCByZWFjaGVzIHVzZXIgY29kZSB0YWtlcyB0aGVcbiAgICAgICAqIG1lYXN1cmVtZW50LiBTaGFyaW5nIGl0IChyYXRoZXIgdGhhbiBwaW5uaW5nIHRoZSBiYXRjaCdzIGZpcnN0IHN0ZXApXG4gICAgICAgKiBpcyB3aGF0IGtlZXBzIHRoZSBzYW1wbGUgYWxpdmUgd2hlbiB0aGF0IGZpcnN0IHN0ZXAgbG9zZXMgaXRzIGF0b21pY1xuICAgICAgICogY3JlYXRlLWNsYWltIHRvIGEgY29uY3VycmVudCBpbnZvY2F0aW9uIHdoaWxlIGEgc2libGluZyBwcm9jZWVkcy5cbiAgICAgICAqIFRoZSBjaGVjay1hbmQtc2V0IGlzIHN5bmNocm9ub3VzLCBzbyBjb25jdXJyZW50IHNpYmxpbmdzIGNhbm5vdCBib3RoXG4gICAgICAgKiBwYXNzIGl0LlxuICAgICAgICovXG4gICAgICBjb25zdCByZXBvcnRSZXN1bWVUdHIgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHRyYWNraW5nID0gcGFyYW1zLnJlc3VtZVRyYWNraW5nO1xuICAgICAgICBpZiAoIXRyYWNraW5nIHx8IHRyYWNraW5nLnJlcG9ydGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjb21wdXRlUmVzdW1lVHRyQXR0cmlidXRlcyh7XG4gICAgICAgICAgdHJhY2tpbmcsXG4gICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICBzdGVwQ2xhaW1TdGFydGVkQXRNczogc3RlcFN0YXJ0UG9zdFNlbnRBdE1zLFxuICAgICAgICAgIHN0ZXBDbGFpbUNvbXBsZXRlZEF0TXMsXG4gICAgICAgICAgc3RlcENvZGVTdGFydGVkQXRNczogRGF0ZS5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYXR0cmlidXRlcykgcmV0dXJuO1xuICAgICAgICB0cmFja2luZy5yZXBvcnRlZCA9IHRydWU7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7XG4gICAgICB9O1xuXG4gICAgICBsZXQgc3RlcEV4ZWN1dGlvblN0YXR1czogJ29rJyB8ICdlcnJvcicgPSAnb2snO1xuICAgICAgY29uc3Qgc3RlcEV4ZWN1dGlvblN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhY2UoJ3N0ZXAuZXhlY3V0ZScsIHt9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRleHRTdG9yYWdlLnJ1bihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RlcE1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgIHN0ZXBTdGFydGVkQXQ6IG5ldyBEYXRlKCtzdGVwU3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3b3JrZmxvd01ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IG5ldyBEYXRlKCt3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgdXJsOiB3b3JrZmxvd0Jhc2VVcmwsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiBwYXJhbXMud29ya2Zsb3dEZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHJvb3RSdW5JZDogcGFyYW1zLnJvb3RSdW5JZCxcbiAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICBwcmVDb21wbGV0aW9uT3BzLFxuICAgICAgICAgICAgICBjbG9zdXJlVmFyczogaHlkcmF0ZWRJbnB1dC5jbG9zdXJlVmFycyxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydCBydW5zIHRoaXMgYm9keSBiZWZvcmUgYHJ1bl9zdGFydGVkYCBpc1xuICAgICAgICAgICAgICAvLyBkdXJhYmxlLiBFeHBvc2UgdGhlIGJhcnJpZXIgc28gYSBkaXJlY3Qgc3RlcC1ib2R5IHdvcmxkIHdyaXRlXG4gICAgICAgICAgICAgIC8vIChlLmcuIGBzZXRBdHRyaWJ1dGVzYCkgY2FuIG9yZGVyIGl0c2VsZiBhZnRlciB0aGVcbiAgICAgICAgICAgICAgLy8gcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG9uIHRoZSBhd2FpdCBwYXRoIChydW4gYWxyZWFkeSBkdXJhYmxlKS5cbiAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyOiBvcHRpbWlzdGljU3RhcnRcbiAgICAgICAgICAgICAgICA/IHBhcmFtcy5ydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFRoZSBsYXN0IGluc3RhbnQgYmVmb3JlIHVzZXIgY29kZTogVDcgb2YgdGhlIHJlc3VtZSB3aW5kb3cuXG4gICAgICAgICAgICAgIHJlcG9ydFJlc3VtZVR0cigpO1xuICAgICAgICAgICAgICByZXR1cm4gc3RlcEZuLmFwcGx5KHRoaXNWYWwsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHN0ZXBFeGVjdXRpb25TdGF0dXMgPSAnZXJyb3InO1xuICAgICAgICB1c2VyQ29kZUVycm9yID0gZXJyO1xuICAgICAgICB1c2VyQ29kZUZhaWxlZCA9IHRydWU7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB2b2lkIHJlY29yZFN0ZXBFeGVjdXRpb25EdXJhdGlvbihcbiAgICAgICAgICBwZXJmb3JtYW5jZS5ub3coKSAtIHN0ZXBFeGVjdXRpb25TdGFydFRpbWUsXG4gICAgICAgICAgc3RlcEV4ZWN1dGlvblN0YXR1c1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhlY3V0aW9uVGltZU1zID0gRGF0ZS5ub3coKSAtIGV4ZWN1dGlvblN0YXJ0VGltZTtcblxuICAgICAgLy8gVGVhciBkb3duIGFueSBhYm9ydC1zdHJlYW0gcmVhZGVycyBvcGVuZWQgd2hpbGUgaHlkcmF0aW5nIHRoZSBzdGVwJ3NcbiAgICAgIC8vIGFyZ3VtZW50cyAoYSBzZXJpYWxpemVkIEFib3J0U2lnbmFsIG9wZW5zIGEgcmVhbC10aW1lIGFib3J0IHJlYWRlciBmb3JcbiAgICAgIC8vIHRoZSBzdGVwJ3MgZHVyYXRpb24pLiBXaXRob3V0IHRoaXMgdGhlIHJlYWRlcidzIGByZWFkKClgIHByb21pc2UgbmV2ZXJcbiAgICAgIC8vIHNldHRsZXMsIHNvIHRoZSBgb3BzYCBmbHVzaCBiZWxvdyBhbHdheXMgbG9zZXMgdGhlIDUwMG1zIHJhY2UgYW5kIHRoZVxuICAgICAgLy8gc3RlcCByZXBvcnRzIGBoYXNQZW5kaW5nT3BzYCwgZm9yY2luZyB0aGUgaW5saW5lIGxvb3AgdG8gcXVldWUgYVxuICAgICAgLy8gY29udGludWF0aW9uIGFuZCBwYXlpbmcgYSBmdWxsIHJvdW5kLXRyaXAgcGVyIHNpZ25hbC1iZWFyaW5nIHN0ZXAuXG4gICAgICAvLyBSdW5zIHVuY29uZGl0aW9uYWxseSAoc3VjY2VzcyBvciBmYWlsdXJlKSBzbyBhIHRocm93aW5nIHN0ZXAgZG9lc24ndFxuICAgICAgLy8gbGVhayB0aGUgcmVhZGVyLlxuICAgICAgY2FuY2VsQWJvcnRSZWFkZXJzKC4uLmFyZ3MsIHRoaXNWYWwsIGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMpO1xuXG4gICAgICAvLyBSZS1yYWlzZSBhIHVzZXItY29kZSBmYWlsdXJlIG5vdyB0aGF0IGNsZWFudXAgaGFzIHJ1bjsgdGhlIG91dGVyXG4gICAgICAvLyBjYXRjaCBtYXBzIGl0IHRvIHN0ZXBfZmFpbGVkL3N0ZXBfcmV0cnlpbmcuXG4gICAgICBpZiAodXNlckNvZGVGYWlsZWQpIHtcbiAgICAgICAgdGhyb3cgdXNlckNvZGVFcnJvcjtcbiAgICAgIH1cblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5RdWV1ZUV4ZWN1dGlvblRpbWVNcyhleGVjdXRpb25UaW1lTXMpLFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYWNlKCdzdGVwLmRlaHlkcmF0ZScsIHt9LCBhc3luYyAoZGVoeWRyYXRlU3BhbikgPT4ge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBkZWh5ZHJhdGVkID0gYXdhaXQgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgb3BzLFxuICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgY29tcHJlc3Npb24sXG4gICAgICAgICAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSByZXR1cm5lZCBzdHJlYW0gaXMgcGlwZWQgdG8gdGhlIHNlcnZlclxuICAgICAgICAgIC8vIGFmdGVyIHRoZSBib2R5IGJ1dCB3aXRoaW4gdGhpcyBzYW1lIG9wIGZsdXNoLCBzbyBnYXRlIGl0cyBmaXJzdFxuICAgICAgICAgIC8vIHdyaXRlIG9uIHRoZSBydW4tcmVhZHkgYmFycmllci4gVW5kZWZpbmVkIG9uIHRoZSBhd2FpdCBwYXRoLlxuICAgICAgICAgIG9wdGltaXN0aWNTdGFydCA/IHBhcmFtcy5ydW5SZWFkeUJhcnJpZXIgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgIGRlaHlkcmF0ZVNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5RdWV1ZVNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJlc3VsdFR5cGUodHlwZW9mIGRlaHlkcmF0ZWQpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlaHlkcmF0ZWQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gRmx1c2ggcGVuZGluZyBvcHMgKHN0cmVhbSB3cml0ZXMsIGV0Yy4pIHdpdGggYSBzaG9ydCBpbmxpbmUgd2FpdC5cbiAgICAgIC8vIFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0gYWNrcyB3cml0ZXMgb24gYnVmZmVyIGVudHJ5XG4gICAgICAvLyAoZ3JvdXAtY29tbWl0IGJhdGNoaW5nKTsgZHVyYWJpbGl0eSBpcyBlbmZvcmNlZCBieSBpdHMgZHJhaW5cbiAgICAgIC8vIGJhcnJpZXIsIHdoaWNoIHRoZSBmbHVzaGFibGUgc3RhdGUncyBjb21wbGV0aW9uIGF3YWl0cyBhZnRlclxuICAgICAgLy8gbG9jayByZWxlYXNlLiBNb3N0IG9wcyBzZXR0bGUgd2l0aGluIH4yMDBtcyAobG9jay1yZWxlYXNlXG4gICAgICAvLyBwb2xsaW5nICsgb25lIGJhdGNoZWQgSFRUUCBmbHVzaCkuXG4gICAgICAvLyBJZiBvcHMgZG9uJ3Qgc2V0dGxlIGluIDUwMG1zIChlLmcuLCBXcml0YWJsZVN0cmVhbSBrZXB0IG9wZW5cbiAgICAgIC8vIGFjcm9zcyBzdGVwcyksIHdhaXRVbnRpbCBoYW5kbGVzIHRoZSByZXN0LlxuICAgICAgaWYgKG9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG9wc1Byb21pc2UgPSBQcm9taXNlLmFsbChvcHMpO1xuICAgICAgICAvLyBUaGUgcmFjZSBiZWxvdyBzdXJmYWNlcyBmYWlsdXJlcyBpbmxpbmUgd2hlbiBvcHMgc2V0dGxlIHF1aWNrbHk7XG4gICAgICAgIC8vIGlmIHRoZSA1MDBtcyB0aW1lb3V0IHdpbnMsIHRoZSBmYWlsdXJlIGlzIG9ubHkgb2JzZXJ2ZWQgaGVyZS4gVGhlXG4gICAgICAgIC8vIHByb21pc2UgaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZFxuICAgICAgICAvLyB3YWl0VW50aWwgcmVqZWN0aW9uIGNyYXNoZXMgdGhlIHByb2Nlc3MgYXMgdW5oYW5kbGVkUmVqZWN0aW9uKSxcbiAgICAgICAgLy8gc28gdW5leHBlY3RlZCBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICAgIHNhZmVXYWl0VW50aWwob3BzUHJvbWlzZSwgKGVycikgPT4ge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignQmFja2dyb3VuZCBmbHVzaCBvZiBzdGVwIHN0cmVhbSBvcHMgZmFpbGVkJywge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcHNTZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICBvcHNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAvLyBJZ25vcmUgZXhwZWN0ZWQgY2xpZW50IGRpc2Nvbm5lY3QgZXJyb3JzIChlLmcuLCBicm93c2VyXG4gICAgICAgICAgICAgIC8vIHJlZnJlc2ggZHVyaW5nIHN0cmVhbWluZylcbiAgICAgICAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICAgICAgICBlcnI/Lm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCBlcnI/Lm5hbWUgPT09ICdSZXNwb25zZUFib3J0ZWQnO1xuICAgICAgICAgICAgICBpZiAoaXNBYm9ydEVycm9yKSByZXR1cm4gdHJ1ZSBhcyBjb25zdDtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IFByb21pc2U8ZmFsc2U+KChyKSA9PiBzZXRUaW1lb3V0KCgpID0+IHIoZmFsc2UpLCA1MDApKSxcbiAgICAgICAgXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9wdGltaXN0aWMgc3RhcnQ6IHRoZSBib2R5IHJhbiBiZWZvcmUgYHN0ZXBfc3RhcnRlZGAgd2FzIGNvbmZpcm1lZC5cbiAgICAgIC8vIFJlY29uY2lsZSBpdCBub3c6IGlmIHdlIGxvc3QgdGhlIGNyZWF0ZS1jbGFpbSAob3IgdGhlIHJ1biBpc1xuICAgICAgLy8gZ29uZS90aHJvdHRsZWQpIGRpc2NhcmQgdGhpcyByZXN1bHQgYW5kIGRvbid0IHdyaXRlIHN0ZXBfY29tcGxldGVkLlxuICAgICAgLy8gUmVjb25jaWxlIGJlZm9yZSBkcmFpbmluZyBwcmVDb21wbGV0aW9uT3BzOiBhIGRpc2NhcmRlZCByZXN1bHQgbWVhbnNcbiAgICAgIC8vIHRoZSB3aW5uaW5nIGhhbmRsZXIgb3ducyB0aGUgb3V0Y29tZSAoYW5kIHJlLWZpcmVzIGFueSBhYm9ydFxuICAgICAgLy8gaWRlbXBvdGVudGx5KSwgc28gdGhlcmUncyBubyBwb2ludCBwYXlpbmcgdGhlIGFib3J0LWNvbW1pdCBsYXRlbmN5LlxuICAgICAgaWYgKG9wdGltaXN0aWNTdGFydCkge1xuICAgICAgICBjb25zdCByZWNvbmNpbGUgPSBhd2FpdCByZWNvbmNpbGVPcHRpbWlzdGljU3RhcnQoKTtcbiAgICAgICAgaWYgKHJlY29uY2lsZSkgcmV0dXJuIHJlY29uY2lsZTtcbiAgICAgICAgLy8gQmFycmllciByZXNvbHZlZDogdGhlIHN0ZXAtc3RhcnQgUE9TVCB0aW1lc3RhbXAgaXMgbm93IGtub3duLCBzb1xuICAgICAgICAvLyBSU0ZTIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgc3RlcF9jb21wbGV0ZWQgZXZlbnQgYmVsb3cuXG4gICAgICAgIGJhY2tmaWxsT3B0aW1pc3RpY1JzZnMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tbWl0IG11c3QtYmUtZHVyYWJsZSBvcHMgKGUuZy4gYSBzdGVwLWluaXRpYXRlZCBhYm9ydCdzXG4gICAgICAvLyBob29rX3JlY2VpdmVkIGV2ZW50KSBiZWZvcmUgd3JpdGluZyBzdGVwX2NvbXBsZXRlZCwgc28gYW55IHdvcmtmbG93XG4gICAgICAvLyBjb250aW51YXRpb24gdHJpZ2dlcmVkIGJ5IHRoYXQgZXZlbnQgb2JzZXJ2ZXMgdGhlIGFib3J0IHJhdGhlciB0aGFuXG4gICAgICAvLyByYWNpbmcgaXQuIFRoZXNlIG9wcyBzd2FsbG93IHRoZWlyIG93biBlcnJvcnMsIHNvIGF3YWl0aW5nIG9ubHlcbiAgICAgIC8vIGVuZm9yY2VzIG9yZGVyaW5nICh0aGUgYC5jYXRjaCgpYCBkZWZlbmRzIHRoZSBuby1yZWplY3QgY29udHJhY3Qgb25cbiAgICAgIC8vIFN0ZXBDb250ZXh0LnByZUNvbXBsZXRpb25PcHMpLlxuICAgICAgLy9cbiAgICAgIC8vIFRyYWRlb2ZmOiBjb3JyZWN0bmVzcyByZXF1aXJlcyB0aGUgaG9vayBiZSBkdXJhYmxlIGJlZm9yZSBjb21wbGV0aW9uLFxuICAgICAgLy8gc28sIHVubGlrZSB0aGUgYmFja2dyb3VuZCBgb3BzYCBmbHVzaCBhYm92ZSwgdGhpcyBjYW5ub3QgYmUgY2FwcGVkXG4gICAgICAvLyB3aXRoIGEgcmVzb2x2ZS1vbi10aW1lb3V0IHJhY2UuIEEgc2xvdyByZXN1bWUgdGhlcmVmb3JlIGFkZHMgaXRzXG4gICAgICAvLyBsYXRlbmN5IHRvIGEgc3RlcCB0aGF0IGFib3J0cyBhIGNvbnRyb2xsZXIsIGFuZCBhIHRydWUgaGFuZyBob2xkc1xuICAgICAgLy8gY29tcGxldGlvbiB1bnRpbCB0aGUgcGxhdGZvcm0vcXVldWUgZXhlY3V0aW9uIHRpbWVvdXQgZmlyZXM7IHRoZSBxdWV1ZVxuICAgICAgLy8gdGhlbiByZWRlbGl2ZXJzIGFuZCB0aGUgc3RlcCByZXRyaWVzLCByZS1maXJpbmcgdGhlIGFib3J0IGlkZW1wb3RlbnRseS5cbiAgICAgIGlmIChwcmVDb21wbGV0aW9uT3BzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJlQ29tcGxldGlvbk9wcykuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgLy8gT3B0aW1pc3RpYyBzdGFydDogdGhlIGJvZHkgdGhyZXcgYmVmb3JlIGBzdGVwX3N0YXJ0ZWRgIHdhcyBjb25maXJtZWQuXG4gICAgICAvLyBSZWNvbmNpbGUgZmlyc3Q6IGlmIHdlIGxvc3QgdGhlIGNyZWF0ZS1jbGFpbSAob3IgdGhlIHJ1biBpc1xuICAgICAgLy8gZ29uZS90aHJvdHRsZWQpIHRoZSBib2R5IGVycm9yIGlzIG1vb3Q7IGRpc2NhcmQgaXQgYW5kIGRvbid0IHdyaXRlIGFcbiAgICAgIC8vIHRlcm1pbmFsIGV2ZW50ICh0aGUgd2lubmluZyBoYW5kbGVyIG93bnMgdGhlIG91dGNvbWUpLiBSZWNvbmNpbGVcbiAgICAgIC8vIGJlZm9yZSBkcmFpbmluZyBwcmVDb21wbGV0aW9uT3BzIGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIHN1Y2Nlc3NcbiAgICAgIC8vIHBhdGg6IGEgZGlzY2FyZGVkIG91dGNvbWUgZG9lc24ndCBuZWVkIHRoZSBhYm9ydCBjb21taXR0ZWQgaGVyZS5cbiAgICAgIGlmIChvcHRpbWlzdGljU3RhcnQpIHtcbiAgICAgICAgY29uc3QgcmVjb25jaWxlID0gYXdhaXQgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0KCk7XG4gICAgICAgIGlmIChyZWNvbmNpbGUpIHJldHVybiByZWNvbmNpbGU7XG4gICAgICAgIC8vIEJhcnJpZXIgcmVzb2x2ZWQ6IGF0dGFjaCBSU0ZTIHRvIHRoZSBzdGVwX2ZhaWxlZCBldmVudChzKSBiZWxvdy5cbiAgICAgICAgYmFja2ZpbGxPcHRpbWlzdGljUnNmcygpO1xuICAgICAgfVxuXG4gICAgICAvLyBPcmRlciBhbnkgbXVzdC1iZS1kdXJhYmxlIG9wcyAoZS5nLiBhIHN0ZXAtaW5pdGlhdGVkIGFib3J0J3NcbiAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgZXZlbnQpIGFoZWFkIG9mIHN0ZXBfZmFpbGVkIHRvbzogYSBzdGVwIHRoYXQgYWJvcnRzIGFuZFxuICAgICAgLy8gdGhlbiB0aHJvd3MgbXVzdCBzdGlsbCBoYXZlIHRoZSBhYm9ydCByZWNvcmRlZCBiZWZvcmUgdGhlIGZhaWx1cmVcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBvYnNlcnZlcyBpdC4gU2FtZSBsYXRlbmN5IHRyYWRlb2ZmIGFuZCBuby1yZWplY3QgY29udHJhY3RcbiAgICAgIC8vIGFzIHRoZSBzdWNjZXNzIHBhdGggYWJvdmUuIFNlZSBTdGVwQ29udGV4dC5wcmVDb21wbGV0aW9uT3BzLlxuICAgICAgaWYgKHByZUNvbXBsZXRpb25PcHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcmVDb21wbGV0aW9uT3BzKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUVyciA9IHByb21vdGVBYm9ydEVycm9yVG9GYXRhbChlcnIpO1xuXG4gICAgICBjb25zdCBub3JtYWxpemVkRXJyb3IgPSBhd2FpdCBub3JtYWxpemVVbmtub3duRXJyb3IoZWZmZWN0aXZlRXJyKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdGFjayA9XG4gICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKGVmZmVjdGl2ZUVycikgfHwgJyc7XG5cbiAgICAgIGlmIChlZmZlY3RpdmVFcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/LihlZmZlY3RpdmVFcnIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0ZhdGFsID0gRmF0YWxFcnJvci5pcyhlZmZlY3RpdmVFcnIpO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBFcnJvck5hbWUoZ2V0RXJyb3JOYW1lKGVmZmVjdGl2ZUVycikpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEVycm9yTWVzc2FnZShub3JtYWxpemVkRXJyb3IubWVzc2FnZSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZ2V0RXJyb3JOYW1lKGVmZmVjdGl2ZUVycikpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JDYXRlZ29yeShcbiAgICAgICAgICBpc0ZhdGFsXG4gICAgICAgICAgICA/ICdmYXRhbCdcbiAgICAgICAgICAgIDogUmV0cnlhYmxlRXJyb3IuaXMoZWZmZWN0aXZlRXJyKVxuICAgICAgICAgICAgICA/ICdyZXRyeWFibGUnXG4gICAgICAgICAgICAgIDogJ3RyYW5zaWVudCdcbiAgICAgICAgKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yUmV0cnlhYmxlKCFpc0ZhdGFsKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRmF0YWwpIHtcbiAgICAgICAgc3RlcExvZ2dlci5lcnJvcihcbiAgICAgICAgICAnRW5jb3VudGVyZWQgRmF0YWxFcnJvciB3aGlsZSBleGVjdXRpbmcgc3RlcCwgYnViYmxpbmcgdXAgdG8gcGFyZW50IHdvcmtmbG93JyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQsIHN0ZXBOYW1lLCBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2sgfVxuICAgICAgICApO1xuICAgICAgICAvLyBBcHBseSB0aGUgbm9ybWFsaXplZCBzdGFjayB0byB0aGUgdGhyb3duIHZhbHVlIHNvIHRoZSBzZXJpYWxpemVkXG4gICAgICAgIC8vIGVycm9yIHByZXNlcnZlcyBpdCBmb3IgY29uc3VtZXJzLiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCB3b3Jrc1xuICAgICAgICAvLyBhY3Jvc3MgVk0gcmVhbG1zIChhIHdvcmtmbG93LXRocm93biBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiB0aGVcbiAgICAgICAgLy8gVk0ncyBFcnJvciBjbGFzcywgbm90IHRoZSBob3N0J3MpLlxuICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcihlZmZlY3RpdmVFcnIpICYmIG5vcm1hbGl6ZWRTdGFjaykge1xuICAgICAgICAgIChlZmZlY3RpdmVFcnIgYXMgRXJyb3IpLnN0YWNrID0gbm9ybWFsaXplZFN0YWNrO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUVycixcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIC4uLmxhdGVuY3lFdmVudERhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChzdGVwRmFpbEVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogc3RlcEZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgICAgfVxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBGYXRhbEVycm9yKHRydWUpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2ZhaWxlZCcgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9uLWZhdGFsIGVycm9yOiBjaGVjayBpZiByZXRyaWVzIHJlbWFpbmluZ1xuICAgICAgY29uc3QgY3VycmVudEF0dGVtcHQgPSBzdGVwLmF0dGVtcHQ7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEF0dGVtcHQoY3VycmVudEF0dGVtcHQpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcE1heFJldHJpZXMobWF4UmV0cmllcyksXG4gICAgICB9KTtcblxuICAgICAgaWYgKGN1cnJlbnRBdHRlbXB0ID49IG1heFJldHJpZXMgKyAxKSB7XG4gICAgICAgIC8vIE1heCByZXRyaWVzIHJlYWNoZWRcbiAgICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgJ01heCByZXRyaWVzIHJlYWNoZWQsIGJ1YmJsaW5nIGVycm9yIHRvIHBhcmVudCB3b3JrZmxvdycsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIFwiJHtzdGVwTmFtZX1cIiBmYWlsZWQgYWZ0ZXIgJHttYXhSZXRyaWVzfSAke3BsdXJhbGl6ZSgncmV0cnknLCAncmV0cmllcycsIG1heFJldHJpZXMpfTogJHtub3JtYWxpemVkRXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAvLyBXcmFwIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgYXMgYGNhdXNlYCBvbiBhIGZyZXNoIEZhdGFsRXJyb3JcbiAgICAgICAgLy8gc28gdGhlIHdyYXBwaW5nIG1lc3NhZ2UgKyByZXRyeS1jb3VudCBmcmFtaW5nIGlzIHRoZSB1c2VyLWZhY2luZ1xuICAgICAgICAvLyBlcnJvciB3aGlsZSB0aGUgb3JpZ2luYWwgZmFpbHVyZSByZW1haW5zIHJlY292ZXJhYmxlIGZyb21cbiAgICAgICAgLy8gYGVyci5jYXVzZWAgYWZ0ZXIgaHlkcmF0aW9uLlxuICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAod3JhcHBlZEVycm9yIGFzIEVycm9yKS5jYXVzZSA9IGVycjtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRTdGFjaykgd3JhcHBlZEVycm9yLnN0YWNrID0gbm9ybWFsaXplZFN0YWNrO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICB3cmFwcGVkRXJyb3IsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5sYXRlbmN5RXZlbnREYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgIH1cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHJlbWFpbmluZ1xuICAgICAgaWYgKFJldHJ5YWJsZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdFbmNvdW50ZXJlZCBSZXRyeWFibGVFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICBhdHRlbXB0OiBjdXJyZW50QXR0ZW1wdCxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGVwTG9nZ2VyLmluZm8oJ0VuY291bnRlcmVkIEVycm9yLCBzdGVwIHdpbGwgYmUgcmV0cmllZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIGF0dGVtcHQ6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHRoZSBub3JtYWxpemVkIHN0YWNrIHRvIHRoZSB0aHJvd24gdmFsdWUgc28gaXQgc3Vydml2ZXNcbiAgICAgIC8vIHNlcmlhbGl6YXRpb24uIFNlZSB0aGUgRmF0YWxFcnJvciBzaXRlIGFib3ZlIGZvciB3aHkgd2UgdXNlXG4gICAgICAvLyBgdHlwZXMuaXNOYXRpdmVFcnJvcmAgaW5zdGVhZCBvZiBgZXJyIGluc3RhbmNlb2YgRXJyb3JgLlxuICAgICAgaWYgKHR5cGVzLmlzTmF0aXZlRXJyb3IoZXJyKSAmJiBub3JtYWxpemVkU3RhY2spIHtcbiAgICAgICAgKGVyciBhcyBFcnJvcikuc3RhY2sgPSBub3JtYWxpemVkU3RhY2s7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIC4uLihSZXRyeWFibGVFcnJvci5pcyhlcnIpICYmIHsgcmV0cnlBZnRlcjogZXJyLnJldHJ5QWZ0ZXIgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChzdGVwUmV0cnlFcnIpIHtcbiAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcFJldHJ5RXJyKSkge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICdUcmllZCByZXRyeWluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBzdGVwUmV0cnlFcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHN0ZXBSZXRyeUVycjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBNYXRoLm1heChcbiAgICAgICAgMSxcbiAgICAgICAgUmV0cnlhYmxlRXJyb3IuaXMoZXJyKVxuICAgICAgICAgID8gTWF0aC5jZWlsKCgrZXJyLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwKVxuICAgICAgICAgIDogMVxuICAgICAgKTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlUaW1lb3V0U2Vjb25kcyh0aW1lb3V0U2Vjb25kcyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlXaWxsUmV0cnkodHJ1ZSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3JldHJ5JywgdGltZW91dFNlY29uZHMgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RlcF9jb21wbGV0ZWQgZXZlbnQgb3V0c2lkZSB0aGUgc3RlcCBleGVjdXRpb24gZmFpbHVyZSBwYXRoOlxuICAgIC8vIHBlcnNpc3RlbmNlIGZhaWx1cmVzIGFyZSBpbmZyYXN0cnVjdHVyZSBlcnJvcnMgYW5kIHNob3VsZCByZWRlbGl2ZXIgdGhlXG4gICAgLy8gcXVldWUgbWVzc2FnZSwgbm90IGJlY29tZSB1c2VyIHN0ZXBfcmV0cnlpbmcvc3RlcF9mYWlsZWQgZXZlbnRzLlxuICAgIGxldCBjb21wbGV0ZWRSZXN1bHQ6IEV2ZW50UmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBjb21wbGV0ZWRSZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICByZXN1bHQ6IHJlc3VsdCBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgLi4ubGF0ZW5jeUV2ZW50RGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBwYXJhbXMuaW5saW5lRGVsdGFTaW5jZUN1cnNvciAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IHNpbmNlQ3Vyc29yOiBwYXJhbXMuaW5saW5lRGVsdGFTaW5jZUN1cnNvciB9XG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAnVHJpZWQgY29tcGxldGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICB9XG4gICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBjb25zdCBpbmxpbmVEZWx0YSA9IGV4dHJhY3RJbmxpbmVEZWx0YShcbiAgICAgIGNvbXBsZXRlZFJlc3VsdCxcbiAgICAgIHBhcmFtcy5pbmxpbmVEZWx0YVNpbmNlQ3Vyc29yICE9PSB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnY29tcGxldGVkJyksXG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJlc3VsdFR5cGUodHlwZW9mIHJlc3VsdCksXG4gICAgfSk7XG5cbiAgICBpZiAob3BzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0ZXBMb2dnZXIuZGVidWcoJ1N0ZXAgaGFzIHBlbmRpbmcgb3BzJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgb3BzQ291bnQ6IG9wcy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gaGFzUGVuZGluZ09wcyBzaWduYWxzIHRoZSBjb21iaW5lZCBoYW5kbGVyIHRvIGJyZWFrIHRoZSBsb29wXG4gICAgLy8gYW5kIHF1ZXVlIGEgY29udGludWF0aW9uIHNvIHdhaXRVbnRpbCBjYW4gZmx1c2ggdGhlbS5cbiAgICByZXR1cm4geyB0eXBlOiAnY29tcGxldGVkJywgaGFzUGVuZGluZ09wczogIW9wc1NldHRsZWQsIGlubGluZURlbHRhIH07XG4gIH0pO1xufVxuIl19
1118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3N0ZXAtZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sb0JBQW9CLENBQUM7QUFDeEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixhQUFhLEVBQ2IsYUFBYSxFQUNiLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsU0FBUyxFQUNULGVBQWUsR0FDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQVV6QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGlDQUFpQyxHQUNsQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixvQkFBb0IsRUFDcEIsZ0JBQWdCLEdBQ2pCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JFLE9BQU8sRUFDTCxZQUFZLEVBQ1osYUFBYSxFQUNiLHFC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QUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDeEUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydC9zdHJpY3QnO1xuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRmF0YWxFcnJvcixcbiAgUmV0cnlhYmxlRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBUaHJvdHRsZUVycm9yLFxuICBUb29FYXJseUVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwsXG4gIHBsdXJhbGl6ZSxcbiAgc3RlcERpc3BsYXlOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUge1xuICBDcmVhdGVFdmVudFBhcmFtcyxcbiAgQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICBFdmVudCxcbiAgRXZlbnRSZXN1bHQsXG4gIFNlcmlhbGl6ZWREYXRhLFxuICBTdGFydGVkU3RlcCxcbiAgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkL2Vudi1jb25maWcnO1xuaW1wb3J0IHR5cGUgeyBGbHVzaGFibGVTdHJlYW1TdGF0ZSB9IGZyb20gJy4uL2ZsdXNoYWJsZS1zdHJlYW0uanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciwgc3RlcExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZXRTdGVwRnVuY3Rpb24gfSBmcm9tICcuLi9wcml2YXRlLmpzJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZEtleSB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2Vycm9ycy5qcyc7XG5pbXBvcnQge1xuICBjYW5jZWxBYm9ydFJlYWRlcnMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbiAgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlLFxuICBoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgaHlkcmF0ZVN0ZXBFcnJvcixcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4uL3N0ZXAvY29udGV4dC1zdG9yYWdlLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgcmVjb3JkU3RlcEV4ZWN1dGlvbkR1cmF0aW9uLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQge1xuICBnZXRFcnJvck5hbWUsXG4gIGdldEVycm9yU3RhY2ssXG4gIG5vcm1hbGl6ZVVua25vd25FcnJvcixcbiAgcHJvbW90ZUFib3J0RXJyb3JUb0ZhdGFsLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBDT01QVVRFX0lOU1RBTkNFX0lEIH0gZnJvbSAnLi9jb21wdXRlLWluc3RhbmNlLmpzJztcbmltcG9ydCB7XG4gIGlzT3B0aW1pc3RpY0lubGluZVN0YXJ0RW5hYmxlZCxcbiAgaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFeHBsaWNpdGx5RGlzYWJsZWQsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9nZXQtcG9ydC1sYXp5LmpzJztcbmltcG9ydCB7IG1lbW9pemVFbmNyeXB0aW9uS2V5IH0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgfSBmcm9tICcuL3JlcGxheS1yZWNvdmVyeS1yZXBvcnRlci5qcyc7XG5pbXBvcnQge1xuICBjb21wdXRlUmVzdW1lVHRyQXR0cmlidXRlcyxcbiAgdHlwZSBSZXN1bWVUdHJUcmFja2luZyxcbn0gZnJvbSAnLi9yZXN1bWUtbGF0ZW5jeS5qcyc7XG5pbXBvcnQge1xuICBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGEsXG4gIHR5cGUgU3RlcExhdGVuY3lFdmVudERhdGEsXG4gIHR5cGUgU3RlcExhdGVuY3lUcmFja2luZyxcbn0gZnJvbSAnLi9zdGVwLWxhdGVuY3kuanMnO1xuaW1wb3J0IHsgaXNVbnNlcmlhbGl6YWJsZVN0ZXBJbnB1dFBsYWNlaG9sZGVyIH0gZnJvbSAnLi91bnNlcmlhbGl6YWJsZS1zdGVwLmpzJztcbmltcG9ydCB7IHNhZmVXYWl0VW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTID0gMztcbmV4cG9ydCBjb25zdCBTVEVQX1NUUkVBTV9EUkFJTl9USU1FT1VUX01TID0gMzBfMDAwO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcFN0cmVhbURyYWluVGltZW91dE1zKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX1NURVBfU1RSRUFNX0RSQUlOX1RJTUVPVVRfTVMnLFxuICAgIFNURVBfU1RSRUFNX0RSQUlOX1RJTUVPVVRfTVMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlLCBtaW46IDEgfVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0NsaWVudERpc2Nvbm5lY3RFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCBuYW1lID0gKGVycm9yIGFzIHsgbmFtZT86IHVua25vd24gfSk/Lm5hbWU7XG4gIHJldHVybiBuYW1lID09PSAnQWJvcnRFcnJvcicgfHwgbmFtZSA9PT0gJ1Jlc3BvbnNlQWJvcnRlZCc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHRsZVJlbGVhc2VkU3RlcFN0cmVhbXMoXG4gIHN0YXRlczogRmx1c2hhYmxlU3RyZWFtU3RhdGVbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChzdGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgdGltZW91dE1zID0gZ2V0U3RlcFN0cmVhbURyYWluVGltZW91dE1zKCk7XG4gIGxldCB0aW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgIHN0YXRlcy5tYXAoKHN0YXRlKSA9PlxuICAgICAgICAgIChzdGF0ZS5zZXR0bGVSZWxlYXNlZFdyaXRlcz8uKCkgPz8gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKSkuY2F0Y2goXG4gICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgLy8gQSBkaXNjb25uZWN0ZWQgY2xpZW50IG1heSBhYmFuZG9uIG9uZSByZXNwb25zZSBzdHJlYW0sIGJ1dCBpdFxuICAgICAgICAgICAgICAvLyBtdXN0IG5vdCBsZXQgdGhhdCByZWplY3Rpb24gYnlwYXNzIGR1cmFiaWxpdHkgd2FpdHMgZm9yIG90aGVyXG4gICAgICAgICAgICAgIC8vIHN0cmVhbXMgd3JpdHRlbiBieSB0aGUgc2FtZSBzdGVwLlxuICAgICAgICAgICAgICBpZiAoIWlzQ2xpZW50RGlzY29ubmVjdEVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRpbWVkIG91dCBkcmFpbmluZyBzdGVwIHN0cmVhbSB3cml0ZXMgYWZ0ZXIgJHt0aW1lb3V0TXN9bXNgXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgdGltZW91dE1zXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICBdKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWlzQ2xpZW50RGlzY29ubmVjdEVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHRpbWVvdXQgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aGUgaW5saW5lIGRlbHRhIGZyb20gYSBzdGVwLXRlcm1pbmFsIGBldmVudHMuY3JlYXRlYCByZXN1bHQsXG4gKiBpZiB0aGUgV29ybGQgcG9wdWxhdGVkIG9uZS4gQSBkZWx0YSBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgY2FsbGVyXG4gKiByZXF1ZXN0ZWQgaXQgKGBzaW5jZUN1cnNvcmAgd2FzIHBhc3NlZCkgYW5kIHRoZSBXb3JsZCByZXR1cm5lZCBib3RoXG4gKiBgZXZlbnRzYCBhbmQgYSBgY3Vyc29yYDsgb3RoZXJ3aXNlIHdlIHJldHVybiB1bmRlZmluZWQgYW5kIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBpbmNyZW1lbnRhbCBgZXZlbnRzLmxpc3RgLiBgaGFzTW9yZWAgZGVmYXVsdHNcbiAqIHRvIGZhbHNlIChzaW5nbGUgcGFnZSkgd2hlbiB0aGUgV29ybGQgb21pdHMgaXQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RJbmxpbmVEZWx0YShcbiAgcmVzdWx0OiB7IGV2ZW50cz86IEV2ZW50W107IGN1cnNvcj86IHN0cmluZyB8IG51bGw7IGhhc01vcmU/OiBib29sZWFuIH0sXG4gIHJlcXVlc3RlZDogYm9vbGVhblxuKTogSW5saW5lRXZlbnREZWx0YSB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmVxdWVzdGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoIXJlc3VsdC5ldmVudHMgfHwgcmVzdWx0LmN1cnNvciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGV2ZW50czogcmVzdWx0LmV2ZW50cyxcbiAgICBjdXJzb3I6IHJlc3VsdC5jdXJzb3IsXG4gICAgaGFzTW9yZTogcmVzdWx0Lmhhc01vcmUgPz8gZmFsc2UsXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcEV4ZWN1dG9yUGFyYW1zIHtcbiAgd29ybGQ6IFdvcmxkO1xuICB3b3JrZmxvd1J1bklkOiBzdHJpbmc7XG4gIC8qKiBEZXBsb3ltZW50IHRoYXQgb3ducyB0aGUgd29ya2Zsb3cgcnVuLCBmb3IgZm9yd2FyZGVkIHdyaXRhYmxlIHN0cmVhbXMuICovXG4gIHdvcmtmbG93RGVwbG95bWVudElkPzogc3RyaW5nO1xuICB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgd29ya2Zsb3dTdGFydGVkQXQ6IG51bWJlcjtcbiAgLyoqIFJlcXVlc3QgSUQgb2YgdGhlIGludm9jYXRpb24gZXhlY3V0aW5nIHRoaXMgc3RlcCwgd2hlbiBwcm92aWRlZCBieSBpdHMgcXVldWUuICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqIFJvb3QgcnVuIGlkIG9mIHRoaXMgcnVuJ3MgbGluZWFnZSwgY2FycmllZCBpbnRvIHRoZSBzdGVwIGNvbnRleHQuICovXG4gIHJvb3RSdW5JZD86IHN0cmluZztcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIGVuY3J5cHRpb25LZXk/OiBQYXlsb2FkS2V5O1xuICAvKipcbiAgICogVGhlIHdvcmtmbG93IHJ1bidzIHNwZWNWZXJzaW9uLCB1c2VkIHRvIGdhdGUgcGF5bG9hZCBjb21wcmVzc2lvbi5cbiAgICogU3RlcCBvdXRwdXRzL2Vycm9ycyBhcmUgb25seSBjb21wcmVzc2VkIHdoZW4gdGhlIHJ1biBpcyBtYXJrZWQgYXNcbiAgICogY29tcHJlc3Npb24tY2FwYWJsZSAoc3BlY1ZlcnNpb24gPj0gNSkuXG4gICAqL1xuICBydW5TcGVjVmVyc2lvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIExhenkgc3RlcCBzdGFydDogdGhlIGFscmVhZHktZGVoeWRyYXRlZCBzdGVwIGlucHV0LiBXaGVuIHByb3ZpZGVkLCB0aGVcbiAgICogYHN0ZXBfc3RhcnRlZGAgZXZlbnQgY2FycmllcyB0aGlzIGlucHV0IHNvIHRoZSB3b3JsZCBjcmVhdGVzIHRoZSBzdGVwIG9uXG4gICAqIHRoZSBmbHkgKG5vIHNlcGFyYXRlIGBzdGVwX2NyZWF0ZWRgIHJvdW5kLXRyaXApLiBTZXQgYnkgdGhlIG93bmVkLWlubGluZVxuICAgKiBwYXRoIGZvciB0aGUgc3RlcCB3aG9zZSBgc3RlcF9jcmVhdGVkYCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkLlxuICAgKiBUaGUgd29ybGQncyBhdG9taWMgY3JlYXRlLWNsYWltIGlzIHRoZSBleGFjdGx5LW9uZS1vd25lciBnYXRlOiBsb3NpbmcgaXRcbiAgICogc3VyZmFjZXMgYXMgYEVudGl0eUNvbmZsaWN0RXJyb3JgIOKGkiBgeyB0eXBlOiAnc2tpcHBlZCcgfWAsIHNvIGEgaGFuZGxlclxuICAgKiB0aGF0IGRpZCBub3Qgd2luIHRoZSBjcmVhdGUgbmV2ZXIgcnVucyB0aGUgYm9keS4gT21pdHRlZCBvbiBldmVyeSBvdGhlclxuICAgKiBwYXRoLCB3aGVyZSB0aGUgc3RlcCBhbHJlYWR5IGhhcyBhIGBzdGVwX2NyZWF0ZWRgIGFuZCBgc3RlcF9zdGFydGVkYFxuICAgKiBjYXJyaWVzIG5vIHBheWxvYWQgKHRoZSBsZWdhY3kgY29udHJhY3QpLlxuICAgKi9cbiAgbGF6eVN0ZXBJbnB1dD86IFNlcmlhbGl6ZWREYXRhO1xuICAvKipcbiAgICogUHJlLWNsYWltZWQgaW5saW5lIHN0YXJ0OiB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyIGNvbW1pdHRlZCAob3IgbG9zdCkgdGhpc1xuICAgKiBzdGVwJ3MgYHN0ZXBfY3JlYXRlZGAgKyBgc3RlcF9zdGFydGVkYCBwYWlyIGluc2lkZSBpdHMgYmF0Y2hlZCBmYW4tb3V0XG4gICAqIHdyaXRlLCBzbyB0aGUgc3RhcnQgdGhpcyBleGVjdXRvciB3b3VsZCBvdGhlcndpc2Ugc2VuZCBoYXMgYWxyZWFkeSBiZWVuXG4gICAqIGRlY2lkZWQuIGBvd25lZDogZmFsc2VgIHJldHVybnMgYHsgdHlwZTogJ3NraXBwZWQnIH1gIGJlZm9yZSBhbnkgd3JpdGUsXG4gICAqIHRoZSBzYW1lIG91dGNvbWUgYXMgbG9zaW5nIHRoZSBsYXp5IGNsYWltJ3MgYXRvbWljIGNyZWF0ZS4gYG93bmVkOiB0cnVlYFxuICAgKiBza2lwcyBib3RoIHN0YXJ0IHBhdGhzIChubyBzdGFydCB3cml0ZSBhdCBhbGwpIGFuZCBydW5zIHRoZSBib2R5IGFnYWluc3RcbiAgICogdGhlIGNsYWltZWQgc3RlcC4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGxhenlTdGVwSW5wdXRgOiB0aGUgaW5wdXRcbiAgICogYWxyZWFkeSByb2RlIHRoZSBwYWlyJ3MgYHN0ZXBfY3JlYXRlZGAsIGFuZCB0aGUgY2xhaW1lZCBzdGVwIGNhcnJpZXMgaXQuXG4gICAqL1xuICBwcmVjbGFpbWVkU3RhcnQ/OiBQcmVjbGFpbWVkSW5saW5lU3RhcnQ7XG4gIC8qKlxuICAgKiBJbmxpbmUgc3RlcCBvd25lcnNoaXA6IHRoZSBxdWV1ZSBtZXNzYWdlIElEIG9mIHRoZSBpbnZvY2F0aW9uIHRoaXNcbiAgICogZXhlY3V0ZVN0ZXAgY2FsbCBydW5zIGluIChmcm9tIHRoZSBxdWV1ZSBoYW5kbGVyJ3MgbWV0YSkuIFdoZW4gc2V0LCB0aGVcbiAgICogYHN0ZXBfc3RhcnRlZGAgdGhpcyBjYWxsIHNlbmRzIGlzIHN0YW1wZWQgd2l0aCBpdDogb24gdGhlIGxhenkgcGF0aHNcbiAgICogKHdoZXJlIGBsYXp5U3RlcElucHV0YCBpcyBwcmVzZW50KSBhbmQgb24gdGhlIG93bmVkLXJlY292ZXJ5XG4gICAqIHBheWxvYWQtbGVzcyBzdGFydCAod2hlcmUgaXQgaXMgbm90OyB0aGUgcmUtc3RhbXAga2VlcHMgYSByZWNvdmVyZWRcbiAgICogc3RlcCByZWFkYWJsZSBhcyBvd25lZCBieSB0aGlzIG1lc3NhZ2UsIHNpbmNlIG93bmVyc2hpcCBkZXJpdmVzIGZyb21cbiAgICogdGhlIExBVEVTVCBzdGFydCwgc28gYSByZWNvdmVyeSBzdGFydCBpcyBuZXZlciBiYXJlKS4gV2FrZVxuICAgKiByZXBsYXlzIHRoYXQgb2JzZXJ2ZSBhbiBhY3RpdmVseS1vd25lZCBzdGVwIHN1cHByZXNzIHRoZSBpbW1lZGlhdGVcbiAgICogcmVxdWV1ZSBhbmQgZW5xdWV1ZSBhIGRlbGF5ZWQgYmFja3N0b3AgaW5zdGVhZC4gT21pdHRlZCBvbiB0aGVcbiAgICogYmFja2dyb3VuZC1zdGVwIHBhdGgsIHdob3NlIGJhcmUgc3RhcnQgaW50ZW50aW9uYWxseSBjbGVhcnMgb3duZXJzaGlwXG4gICAqICh0aGUgc3RlcCBpcyBxdWV1ZS1vd25lZCBmcm9tIHRoYXQgcG9pbnQpLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJbmxpbmUtZGVsdGEgb3B0aW1pemF0aW9uIChvcHQtaW4pLiBXaGVuIHByb3ZpZGVkLCB0aGUgY3Vyc29yIG9mIHRoZVxuICAgKiBldmVudCBsb2cgYXMgb2JzZXJ2ZWQgYnkgdGhlIGNhbGxlciAqYmVmb3JlKiB0aGlzIHN0ZXAncyBldmVudHMgd2VyZVxuICAgKiB3cml0dGVuLiBJdCBpcyB0aHJlYWRlZCBpbnRvIHRoZSBzdGVwLXRlcm1pbmFsIGBldmVudHMuY3JlYXRlYCBzbyBhXG4gICAqIHN1cHBvcnRpbmcgV29ybGQgY2FuIHJldHVybiB0aGUgZGVsdGEgb2YgZXZlbnRzIHdyaXR0ZW4gc2luY2UgKHNlZVxuICAgKiB7QGxpbmsgaW1wb3J0KCdAd29ya2Zsb3cvd29ybGQnKS5DcmVhdGVFdmVudFBhcmFtcy5zaW5jZUN1cnNvcn0pLlxuICAgKiBPbmx5IHNldCB0aGlzIHdoZW4gYGNvcnJlbGF0aW9uSWRgLWJhc2VkIG93bmVyc2hpcCBndWFyYW50ZWVzIHRoaXNcbiAgICogaGFuZGxlciBpcyB0aGUgc29sZSBpbmxpbmUgd3JpdGVyIGZvciB0aGUgcnVuIG9uIHRoaXMgaXRlcmF0aW9uLlxuICAgKi9cbiAgaW5saW5lRGVsdGFTaW5jZUN1cnNvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFN1cHByZXNzIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IGZvciB0aGlzIHN0ZXAgcmVnYXJkbGVzcyBvZlxuICAgKiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlRgIC8gYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YDogdGFrZSB0aGVcbiAgICogYXdhaXQtdGhlbi1ydW4gcGF0aCBzbyB0aGUgYm9keSBvbmx5IHJ1bnMgYWZ0ZXIgdGhlIGBzdGVwX3N0YXJ0ZWRgIGNsYWltXG4gICAqIHN1Y2NlZWRzLiBTZXQgYnkgdGhlIHJ1bnRpbWUgZm9yIGd1YXJkLWVuZm9yY2VkIGJhdGNoZXMgdGhhdCBhcmVcbiAgICogc3RhbGUtc2Vuc2l0aXZlIChhbiBvcGVuIGhvb2sgbWVhbnMgYW4gb3V0LW9mLWJhbmQgZXZlbnQgY2FuIG1ha2UgdGhlXG4gICAqIHNjaGVkdWxpbmcgdmlldyBzdGFsZSk6IHRoZSBndWFyZCdzIDQxMiBmZW5jZSBjYW4gcmVqZWN0IGEgc3RhbGUgY2xhaW0nc1xuICAgKiBkdXJhYmxlIHdyaXRlcywgYnV0IGl0IGNhbm5vdCB1bi1ydW4gYSBib2R5IHRoYXQgb3B0aW1pc3RpYyBzdGFydCBiZWdhblxuICAgKiBiZWZvcmUgdGhlIGNsYWltIHNldHRsZWQ7IGF3YWl0aW5nIHRoZSBjbGFpbSBleHRlbmRzIHRoZSBmZW5jZSB0byB1c2VyXG4gICAqIGNvZGUuIFdpbnMgb3ZlciBgZm9yY2VPcHRpbWlzdGljU3RhcnRgIGFuZCB0aGUgZW52IGZsYWcuXG4gICAqL1xuICBzdXBwcmVzc09wdGltaXN0aWNTdGFydD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGb3JjZSBvcHRpbWlzdGljIGlubGluZSBzdGFydCByZWdhcmRsZXNzIG9mXG4gICAqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVGAuIFNldCBieSB0dXJibyBtb2RlIG9uIHRoZSBmaXJzdCBkZWxpdmVyeVxuICAgKiBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbiwgd2hlcmUgZm9yY2luZyBpdCBpcyBzYWZlOiB0aGVyZSBpcyBubyBjb25jdXJyZW50XG4gICAqIHBlZXIgaGFuZGxlciB0byByYWNlIHRoZSBjcmVhdGUtY2xhaW0sIHNvIHRoZSBib2R5IHJ1bnMgZXhhY3RseSBvbmNlLiBPbmx5XG4gICAqIG1lYW5pbmdmdWwgdG9nZXRoZXIgd2l0aCBgbGF6eVN0ZXBJbnB1dGAgKGEgYnJhbmQtbmV3IGxhenkgc3RlcCkuXG4gICAqL1xuICBmb3JjZU9wdGltaXN0aWNTdGFydD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUdXJibyBtb2RlIG9ubHk6IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgKiBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuIFdoZW4gc2V0LCB0aGUgbGF6eS9vcHRpbWlzdGljIGBzdGVwX3N0YXJ0ZWRgIGlzXG4gICAqIGNoYWluZWQgb24gaXQgc28gdGhlIHN0ZXAgaXMgbmV2ZXIgY3JlYXRlZCBiZWZvcmUgaXRzIHJ1biBleGlzdHMuIFRoZSBib2R5XG4gICAqIHN0aWxsIHJ1bnMgaW1tZWRpYXRlbHkgYWdhaW5zdCBsb2NhbGx5LXN5bnRoZXNpemVkIHN0YXRlIChvbmx5IHRoZSBuZXR3b3JrXG4gICAqIHdyaXRlIHdhaXRzKSwgc28gdGhlIGBydW5fc3RhcnRlZGAgcm91bmQtdHJpcCBvdmVybGFwcyB0aGUgYm9keS4gYHVuZGVmaW5lZGBcbiAgICogb3V0c2lkZSB0dXJibywgd2hlcmUgYHJ1bl9zdGFydGVkYCB3YXMgYWxyZWFkeSBhd2FpdGVkIHVwIGZyb250LlxuICAgKi9cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPjtcbiAgLyoqXG4gICAqIExhdGVuY3kgdGVsZW1ldHJ5IChUVEZTIC8gU1RTTyk6IGVsaWdpYmlsaXR5IGFuZCBhbmNob3IgdGltZXN0YW1wcyBkZWNpZGVkXG4gICAqIGJ5IHRoZSBvcmNoZXN0cmF0b3IuIFdoZW4gc2V0LCB0aGlzIGV4ZWN1dG9yIGNvbXB1dGVzIHRoZSBmaW5hbCB2YWx1ZXNcbiAgICogYWdhaW5zdCB0aGUgd2FsbCBjbG9jayB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdXNlciBjb2RlIHJ1bnMgYW5kXG4gICAqIGF0dGFjaGVzIHRoZW0gdG8gdGhlIHN0ZXAncyB0ZXJtaW5hbCBldmVudC4gU2V0IG9ubHkgZm9yIHRoZSBmaXJzdCBzdGVwIG9mXG4gICAqIGFuIGlubGluZSBiYXRjaCwgYW5kIG9ubHkgb24gZmlyc3QtYXR0ZW1wdCBleGVjdXRpb25zIHRoYXQgcXVhbGlmeTsgc2VlXG4gICAqIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzLlxuICAgKi9cbiAgbGF0ZW5jeVRyYWNraW5nPzogU3RlcExhdGVuY3lUcmFja2luZztcbiAgLyoqXG4gICAqIEhvb2stcmVzdW1lIFRUUiB0ZWxlbWV0cnk6IHRoZSBib3VuZGFyaWVzIG9mIGEgaG9vayByZXN1bXB0aW9uIHdob3NlIG5leHRcbiAgICogZHVyYWJsZSBzdGVwIGlzIHRoZSBvbmUgdGhpcyBjYWxsIGlzIGFib3V0IHRvIGV4ZWN1dGUuIFdoZW4gc2V0LCB0aGVcbiAgICogZXhlY3V0b3IgY2xvc2VzIHRoZSBtZWFzdXJlbWVudCBhZ2FpbnN0IHRoZSBgc3RlcF9zdGFydGVkYCBjbGFpbSBhbmQgdGhlXG4gICAqIHdhbGwgY2xvY2sgdGFrZW4gaW1tZWRpYXRlbHkgYmVmb3JlIHVzZXIgY29kZSwgYW5kIGF0dGFjaGVzIHRoZSB0b3RhbCBwbHVzXG4gICAqIGl0cyBwaGFzZSBicmVha2Rvd24gdG8gdGhpcyBzdGVwJ3MgYHN0ZXAuZXhlY3V0ZWAgc3Bhbi4gU2V0IGJ5IHRoZSBydW50aW1lXG4gICAqIGZvciBleGFjdGx5IG9uZSBzdGVwIHBlciByZXN1bXB0aW9uOyBzZWUgcnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cy5cbiAgICovXG4gIHJlc3VtZVRyYWNraW5nPzogUmVzdW1lVHRyVHJhY2tpbmc7XG4gIC8qKlxuICAgKiBBdXRob3JpdGF0aXZlIGF0dGVtcHQgbnVtYmVyIGZvciB0aGlzIGV4ZWN1dGlvbiwgdXNlZCB0byBib3VuZCByZXRyaWVzXG4gICAqIGFnYWluc3QgYG1heFJldHJpZXNgIEJFRk9SRSB0aGUgYm9keSBydW5zLiBUbyBhbHNvIGNhdGNoXG4gICAqIHN0ZXAgdGltZW91dHMgKHdoaWNoIHdlIGNhbid0IGhhdmUgY2F0Y2ggaGFuZGxlcnMgZm9yKSwgd2UgZGV0ZXJtaW5lXG4gICAqIHRoZSBhdHRlbXB0IGNvdW50IGJhc2VkIGFzIGZvbGxvd3M6XG4gICAqIC0gSW5saW5lIChjb21iaW5lZCBoYW5kbGVyKTogdGhlIG51bWJlciBvZiBgc3RlcF9zdGFydGVkYCBldmVudHMgYWxyZWFkeVxuICAgKiAgIGluIHRoZSBldmVudCBsb2cgZm9yIHRoaXMgc3RlcCwgcGx1cyBvbmUgZm9yIHRoZSBhdHRlbXB0IGFib3V0IHRvIHJ1bi5cbiAgICogLSBCYWNrZ3JvdW5kIChxdWV1ZS1kaXNwYXRjaGVkKTogdGhlIHF1ZXVlIGRlbGl2ZXJ5IGNvdW50XG4gICAqICAgKGBtZXRhZGF0YS5hdHRlbXB0YCksIHdoaWNoIGluY3JlbWVudHMgb24gZXZlcnkgcmVkZWxpdmVyeS5cbiAgICovXG4gIGF1dGhvcml0YXRpdmVBdHRlbXB0PzogbnVtYmVyO1xuICAvKiogT25lLXNob3QgcmVjb3ZlcnkgdGVsZW1ldHJ5IGFjdGl2YXRlZCBieSB0aGUgb3JjaGVzdHJhdG9yIHJlcGxheS4gKi9cbiAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcj86IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXI7XG59XG5cbi8qKlxuICogVGhlIHNldHRsZWQgb3V0Y29tZSBvZiBhIGBzdGVwX2NyZWF0ZWRgICsgYHN0ZXBfc3RhcnRlZGAgcGFpciB0aGVcbiAqIHN1c3BlbnNpb24gaGFuZGxlciBmb2xkZWQgaW50byBpdHMgYmF0Y2hlZCBmYW4tb3V0IHdyaXRlIChzZWVcbiAqIGBTdXNwZW5zaW9uSGFuZGxlclJlc3VsdC5pbmxpbmVDbGFpbXNgKS4gSGFuZGVkIHRvIGV4ZWN1dGVTdGVwIGFzXG4gKiB7QGxpbmsgU3RlcEV4ZWN1dG9yUGFyYW1zLnByZWNsYWltZWRTdGFydH0gc28gdGhlIGV4ZWN1dG9yIHJ1bnMgKG9yIHNraXBzKVxuICogdGhlIGJvZHkgb2ZmIHRoZSBiYXRjaCdzIHZlcmRpY3QgaW5zdGVhZCBvZiBzZW5kaW5nIGEgc3RhcnQgb2YgaXRzIG93bi5cbiAqL1xuZXhwb3J0IHR5cGUgUHJlY2xhaW1lZElubGluZVN0YXJ0ID1cbiAgfCB7XG4gICAgICAvKiogVGhlIHBhaXIgY29tbWl0dGVkOiB0aGlzIGV4ZWN1dGlvbiBvd25zIHRoZSBzdGVwIGFuZCBydW5zIHRoZSBib2R5LiAqL1xuICAgICAgb3duZWQ6IHRydWU7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBzdGFydGVkIHN0ZXAgZW50aXR5IGZyb20gdGhlIGJhdGNoIHJlc3VsdCwgd2l0aCB0aGUgbG9jYWxseVxuICAgICAgICogZGVoeWRyYXRlZCBpbnB1dCBhdHRhY2hlZCBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyIChiYXRjaCByZXNwb25zZXNcbiAgICAgICAqIHJldHVybiByZWZzIGxhemlseTsgdGhlIGJvZHkncyBoeWRyYXRpb24gd2FudHMgdGhlIHNhbWUgYnl0ZXMgdGhlXG4gICAgICAgKiBwYWlyJ3MgYHN0ZXBfY3JlYXRlZGAgY2FycmllZCkuXG4gICAgICAgKi9cbiAgICAgIHN0ZXA6IFN0YXJ0ZWRTdGVwO1xuICAgICAgLyoqXG4gICAgICAgKiBgRGF0ZS5ub3coKWAgdGFrZW4gcmlnaHQgYmVmb3JlIHRoZSBiYXRjaCBQT1NUIHRoYXQgY2FycmllZCB0aGUgcGFpcjpcbiAgICAgICAqIHRoZSBjbGFpbSdzIFwic3RhcnQgUE9TVCBzZW50XCIgaW5zdGFudCwgYW5jaG9yaW5nIFJTRlMgZXhhY3RseSBsaWtlXG4gICAgICAgKiB0aGUgbGF6eSBjbGFpbSdzIG93biBQT1NUIHdvdWxkLlxuICAgICAgICovXG4gICAgICBiYXRjaFBvc3RTZW50QXRNcz86IG51bWJlcjtcbiAgICAgIC8qKlxuICAgICAgICogYERhdGUubm93KClgIHRha2VuIHJpZ2h0IGFmdGVyIHRoYXQgYmF0Y2ggUE9TVCByZXR1cm5lZDogdGhlXG4gICAgICAgKiBjbGFpbSdzIGNvbXBsZXRpb24gaW5zdGFudCAoVDYgb2YgdGhlIGhvb2stcmVzdW1lIFRUUiB3aW5kb3cpLlxuICAgICAgICovXG4gICAgICBjbGFpbUNvbXBsZXRlZEF0TXM/OiBudW1iZXI7XG4gICAgfVxuICB8IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHBhaXIgbG9zdCBpdHMgYXRvbWljIGNyZWF0ZS1jbGFpbSAocGVyLWV2ZW50IDQwOSk6IGEgY29uY3VycmVudFxuICAgICAgICogd3JpdGVyIG93bnMgdGhlIHN0ZXAsIHNvIHRoZSBib2R5IG11c3Qgbm90IHJ1biBoZXJlLlxuICAgICAgICovXG4gICAgICBvd25lZDogZmFsc2U7XG4gICAgfTtcblxuLyoqXG4gKiBJbmxpbmUtZGVsdGEgcmV0dXJuZWQgYnkgYSBzdGVwLXRlcm1pbmFsIHdyaXRlIHdoZW4gdGhlIGNhbGxlciBwYXNzZWRcbiAqIHtAbGluayBTdGVwRXhlY3V0b3JQYXJhbXMuaW5saW5lRGVsdGFTaW5jZUN1cnNvcn0gYW5kIHRoZSBXb3JsZCBzdXBwb3J0c1xuICogdGhlIG9wdGltaXphdGlvbi4gYGV2ZW50c2AgYXJlIHRoZSBldmVudHMgd3JpdHRlbiBzdHJpY3RseSBhZnRlciB0aGF0XG4gKiBjdXJzb3IgKHRoaXMgc3RlcCdzIGV2ZW50cyBwbHVzIGFueXRoaW5nIGludGVybGVhdmVkIGluLWJhbmQpLCBgY3Vyc29yYFxuICogaXMgdGhlIHBvc2l0aW9uIHBhc3QgdGhlIGxhc3Qgb25lLCBhbmQgYGhhc01vcmVgIHNpZ25hbHMgYSBmdXJ0aGVyIHBhZ2VcbiAqICh0aGUgY2FsbGVyIHRoZW4gZmFsbHMgYmFjayB0byBhIGZ1bGwgaW5jcmVtZW50YWwgZmV0Y2gpLiBBYnNlbnQgd2hlblxuICogdGhlIFdvcmxkIGRpZCBub3QgcmV0dXJuIGEgZGVsdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5saW5lRXZlbnREZWx0YSB7XG4gIGV2ZW50czogRXZlbnRbXTtcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICBoYXNNb3JlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIHN0ZXAgZXhlY3V0aW9uIGF0dGVtcHQuIFRoZSBjYWxsZXIgZGVjaWRlcyB3aGF0IHRvIGRvXG4gKiBiYXNlZCBvbiB0aGUgcmVzdWx0IHR5cGUgKGUuZy4sIHF1ZXVlIHdvcmtmbG93IGNvbnRpbnVhdGlvbiwgcmVwbGF5IGlubGluZSwgZXRjLikuXG4gKlxuICogYGlubGluZURlbHRhYCBpcyBhdHRhY2hlZCB0byBhIGBjb21wbGV0ZWRgIHJlc3VsdCB3aGVuIHRoZSBjYWxsZXJcbiAqIHJlcXVlc3RlZCBpdCB2aWEge0BsaW5rIFN0ZXBFeGVjdXRvclBhcmFtcy5pbmxpbmVEZWx0YVNpbmNlQ3Vyc29yfSBhbmRcbiAqIHRoZSBXb3JsZCByZXR1cm5lZCBvbmUuIFN0ZXAgZmFpbHVyZXMgYXJlIHJhcmUgYW5kIG5vdCB0aGUgaW5saW5lXG4gKiBvcHRpbWl6YXRpb24ncyB0YXJnZXQsIHNvIHRoZSBgZmFpbGVkYCBwYXRoIGxlYXZlcyBpdCB0byB0aGUgbm9ybWFsXG4gKiBpbmNyZW1lbnRhbCBmZXRjaC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RlcEV4ZWN1dGlvblJlc3VsdCA9XG4gIHwge1xuICAgICAgdHlwZTogJ2NvbXBsZXRlZCc7XG4gICAgICBoYXNQZW5kaW5nT3BzPzogYm9vbGVhbjtcbiAgICAgIGlubGluZURlbHRhPzogSW5saW5lRXZlbnREZWx0YTtcbiAgICB9XG4gIHwgeyB0eXBlOiAnZmFpbGVkJyB9XG4gIHwgeyB0eXBlOiAncmV0cnknOyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH1cbiAgfCB7IHR5cGU6ICdza2lwcGVkJyB9XG4gIHwgeyB0eXBlOiAnZ29uZScgfVxuICB8IHsgdHlwZTogJ3Rocm90dGxlZCc7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfTtcblxuLyoqXG4gKiBFeGVjdXRlcyBhIHNpbmdsZSBzdGVwOiBjcmVhdGVzIHN0ZXBfc3RhcnRlZCBldmVudCwgaHlkcmF0ZXMgaW5wdXQsXG4gKiBydW5zIHRoZSBzdGVwIGZ1bmN0aW9uLCBjcmVhdGVzIHN0ZXBfY29tcGxldGVkL3N0ZXBfZmFpbGVkL3N0ZXBfcmV0cnlpbmcgZXZlbnRzLlxuICpcbiAqIERvZXMgTk9UIHF1ZXVlIHdvcmtmbG93IGNvbnRpbnVhdGlvbiBtZXNzYWdlczsgdGhlIGNhbGxlciBkZWNpZGVzIHdoYXQgdG8gZG8gbmV4dC5cbiAqIFVzZWQgYnkgdGhlIGNvbWJpbmVkIHdvcmtmbG93IGhhbmRsZXIgZm9yIHN0ZXAgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVN0ZXAoXG4gIHBhcmFtczogU3RlcEV4ZWN1dG9yUGFyYW1zXG4pOiBQcm9taXNlPFN0ZXBFeGVjdXRpb25SZXN1bHQ+IHtcbiAgY29uc3Qge1xuICAgIHdvcmxkLFxuICAgIHdvcmtmbG93UnVuSWQsXG4gICAgd29ya2Zsb3dOYW1lLFxuICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgIHN0ZXBJZCxcbiAgICBzdGVwTmFtZSxcbiAgfSA9IHBhcmFtcztcbiAgLy8gVHJ1dGhpbmVzcywgbm90IHByZXNlbmNlOiBgdmVyY2VsIGVudiBwdWxsYCB3cml0ZXMgYFZFUkNFTF9VUkw9XCJcImAgaW50b1xuICAvLyBgLmVudi5sb2NhbGAsIGFuZCBhIGZyYW1ld29yayB0aGF0IGxvYWRzIHRoYXQgZmlsZSBsb2NhbGx5IHdvdWxkIG90aGVyd2lzZVxuICAvLyBwdXQgdXMgb24gdGhlIFZlcmNlbCBicmFuY2ggd2l0aCBub3RoaW5nIHRvIGJ1aWxkIGEgaG9zdCBmcm9tLCBtYWtpbmdcbiAgLy8gYGh0dHBzOi8vYCB0aGUgYmFzZSBVUkwgb2YgZXZlcnkgc3RlcC5cbiAgY29uc3QgaXNWZXJjZWwgPSBCb29sZWFuKHByb2Nlc3MuZW52LlZFUkNFTF9VUkwpO1xuICAvLyBHYXRlIHBheWxvYWQgY29tcHJlc3Npb24gb24gdGhlIHJ1bidzIHNwZWNWZXJzaW9uLlxuICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgKHBhcmFtcy5ydW5TcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT047XG4gIGNvbnN0IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgPVxuICAgIHBhcmFtcy5yZXBsYXlSZWNvdmVyeVJlcG9ydGVyID8/IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgLy8gRXhlY3V0b3Igd3JpdGVzIGNhcnJ5IG5vIHNsb3Qgc25hcHNob3QgKGBDcmVhdGVFdmVudFBhcmFtcy5ldmVudENvdW50YCkuXG4gIC8vIFRoZSBvbmx5IHRoaW5nIGEgV29ybGQgZG9lcyB3aXRoIG9uZSBpcyBidW1wLWFuZC1yZXBvcnQ6IHdoZW4gdGhlIHdyaXRlXG4gIC8vIGxhbmRzIGFib3ZlIHRoZSBwb3NpdGlvbiBuYW1lZCwgaXQgcmVhZHMgdGhlIGV2ZW50cyBpbiBiZXR3ZWVuIGFuZCBoYW5kc1xuICAvLyB0aGVtIGJhY2suIFRoZSByZXBsYXkgbG9vcCBhbmQgdGhlIHN1c3BlbnNpb24gaGFuZGxlciBtZXJnZSB0aGF0IHBhZ2UgaW50b1xuICAvLyB0aGVpciBsb2FkZWQgbG9nOyB0aGlzIGV4ZWN1dG9yIGhhcyBubyBsb2cgdG8gbWVyZ2UgaW50bywgc28gdGhlIHBhZ2Ugd2FzXG4gIC8vIHJlYWQgb25seSB0byBiZSBkaXNjYXJkZWQsIGFuZCBpbiBwcm9kdWN0aW9uIHRoYXQgcmVhZCBmZWxsIG9uIGEgdGhpcmQgb2ZcbiAgLy8gYWxsIGBzdGVwX3N0YXJ0ZWRgIHdyaXRlcy4gT21pdHRpbmcgdGhlIGNvdW50IGlzIHRoZSBkb2N1bWVudGVkIHNoYXBlIGZvclxuICAvLyBhIGNhbGxlciB3aXRoIG5vIGxvYWRlZCBsb2cgdG8gYmUgc3RhbGUgYWdhaW5zdCwgYW5kIHRoZSBjb25kaXRpb25hbFxuICAvLyB3cml0ZSBvbiAocnVuSWQsIGNvcnJlbGF0aW9uSWQpIHJlbWFpbnMgdGhlIG93bmVyc2hpcCBmZW5jZS5cbiAgY29uc3QgY3JlYXRlRXZlbnQgPSBhc3luYyA8VCBleHRlbmRzIENyZWF0ZUV2ZW50UmVxdWVzdD4oXG4gICAgZGF0YTogVCxcbiAgICBldmVudFBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4gICkgPT5cbiAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLndpdGhFdmVudENyZWF0ZShldmVudFBhcmFtcywgKHApID0+XG4gICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKHdvcmtmbG93UnVuSWQsIGRhdGEsIHApXG4gICAgKTtcblxuICAvLyBgc3RlcF9zdGFydGVkYCBpZGVudGlmaWVzIHRoZSBpbnZvY2F0aW9uIHRoYXQgcGVyZm9ybWVkIHRoaXMgYXR0ZW1wdC5cbiAgLy8gS2VlcCByZXF1ZXN0IGFuZCBjb21wdXRlIHByb3ZlbmFuY2UgaW5kZXBlbmRlbnQ6IHdvcmxkLXZlcmNlbCBzZXJpYWxpemVzXG4gIC8vIHJlcXVlc3RJZCBhcyBhbmFseXRpY3MgYHZlcmNlbElkYCwgd2hpbGUgY29tcHV0ZUluc3RhbmNlSWQgaWRlbnRpZmllcyB0aGVcbiAgLy8gd29ya2VyIHRoYXQgZXhlY3V0ZWQgdGhlIHN0ZXAuXG4gIGNvbnN0IHN0ZXBTdGFydGVkRXZlbnRQYXJhbXM6IENyZWF0ZUV2ZW50UGFyYW1zID0ge1xuICAgIGNvbXB1dGVJbnN0YW5jZUlkOiBDT01QVVRFX0lOU1RBTkNFX0lELFxuICAgIC4uLihwYXJhbXMucmVxdWVzdElkID8geyByZXF1ZXN0SWQ6IHBhcmFtcy5yZXF1ZXN0SWQgfSA6IHt9KSxcbiAgfTtcblxuICBjb25zdCBzcGFuTmFtZSA9IGBzdGVwLmV4ZWN1dGUgJHtzdGVwRGlzcGxheU5hbWUoc3RlcE5hbWUpfWA7XG4gIHJldHVybiB0cmFjZShzcGFuTmFtZSwge30sIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcE5hbWUoc3RlcE5hbWUpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQod29ya2Zsb3dSdW5JZCksXG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcElkKHN0ZXBJZCksXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgdHdvIGxhenkgc3RhcnQgbW9kZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSBieSBjb25zdHJ1Y3Rpb24gKHRoZVxuICAgIC8vIGNhbGxlciBzZXRzIG9uZSBvciB0aGUgb3RoZXIpLCBhbmQgc2V2ZXJhbCBicmFuY2hlcyBiZWxvdyByZWFkIG9ubHkgb25lXG4gICAgLy8gb2YgdGhlbSB0byBkZWNpZGUgd2hldGhlciB0aGUgc3RlcCBpcyBicmFuZC1uZXcuIEVuZm9yY2VkIHJhdGhlciB0aGFuXG4gICAgLy8gZG9jdW1lbnRlZCBzbyBhIGNhbGxlciB0aGF0IGV2ZXIgc2V0cyBib3RoIGZhaWxzIGhlcmUgaW5zdGVhZCBvZlxuICAgIC8vIHNpbGVudGx5IHRha2luZyB0aGUgcHJlLWNsYWltZWQgcGF0aCB3aXRoIGFuIHVuc2VudCBpbnB1dC5cbiAgICBhc3NlcnQoXG4gICAgICAhKHBhcmFtcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLnByZWNsYWltZWRTdGFydCksXG4gICAgICAnZXhlY3V0ZVN0ZXA6IGxhenlTdGVwSW5wdXQgYW5kIHByZWNsYWltZWRTdGFydCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlJ1xuICAgICk7XG5cbiAgICAvLyBBIHByZS1jbGFpbWVkIHN0YXJ0IHRoYXQgTE9TVCB0aGUgYmF0Y2hlZCBwYWlyJ3MgYXRvbWljIGNyZWF0ZS1jbGFpbTogYVxuICAgIC8vIGNvbmN1cnJlbnQgd3JpdGVyIG93bnMgdGhpcyBzdGVwLiBTYW1lIG91dGNvbWUgYXMgbG9zaW5nIHRoZSBsYXp5XG4gICAgLy8gY2xhaW0gKEVudGl0eUNvbmZsaWN0RXJyb3Ig4oaSIHNraXBwZWQpLCBkZWNpZGVkIGJlZm9yZSBBTlkgd3JpdGUsIHRoZVxuICAgIC8vIHVucmVnaXN0ZXJlZC1zdGVwIGZhbGxiYWNrIGJlbG93IGluY2x1ZGVkLCBzaW5jZSBhIHN0ZXAgdGhpcyBoYW5kbGVyXG4gICAgLy8gZG9lcyBub3Qgb3duIGlzIG5vdCBpdHMgdG8gZmFpbC5cbiAgICBpZiAocGFyYW1zLnByZWNsYWltZWRTdGFydCAmJiBwYXJhbXMucHJlY2xhaW1lZFN0YXJ0Lm93bmVkID09PSBmYWxzZSkge1xuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUHJlLWNsYWltZWQgc3RlcCBzdGFydCBsb3N0LCBza2lwcGluZycsIHtcbiAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgIHN0ZXBJZCxcbiAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgIH0pO1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU2tpcHBlZCh0cnVlKSxcbiAgICAgICAgLy8gYHJ1bm5pbmdgLCBub3QgYGNvbXBsZXRlZGA6IHRoZSBwYWlyJ3MgNDA5IHNheXMgdGhlIHN0ZXAgYWxyZWFkeVxuICAgICAgICAvLyBFWElTVFMsIGFuZCB0aGUgd3JpdGVyIHRoYXQgd29uIHRoZSBjcmVhdGUtY2xhaW0gaXMgZXhlY3V0aW5nIGl0LlxuICAgICAgICAvLyBUaGUgb3RoZXIgc2tpcCBzaXRlIGJlbG93IGlzIGEgZ2VudWluZSB0ZXJtaW5hbC1zdGF0ZSBjb25mbGljdDtcbiAgICAgICAgLy8gdGFnZ2luZyBib3RoIGBjb21wbGV0ZWRgIHdvdWxkIG1ha2UgdGhlIGF0dHJpYnV0ZSByZWFkIDEwMCVcbiAgICAgICAgLy8gYGNvbXBsZXRlZGAgYW5kIGxvc2UgdGhlIG9ubHkgZGlzdGluY3Rpb24gd29ydGggcXVlcnlpbmcgaXQgZm9yLlxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFNraXBSZWFzb24oJ3J1bm5pbmcnKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgfVxuXG4gICAgLy8gTWVtb2l6ZWQgYWNjZXNzb3IgZm9yIHRoZSBwZXItcnVuIGVuY3J5cHRpb24ga2V5LiBUaGUgZmlyc3QgY2FsbGVyXG4gICAgLy8gKGlucHV0IGh5ZHJhdGlvbiBvbiB0aGUgc3VjY2VzcyBwYXRoLCBvciBvbmUgb2YgdGhlIGVhcmx5LXJldHVyblxuICAgIC8vIGRlaHlkcmF0ZVN0ZXBFcnJvciBwYXRocyBpZiBzdGVwX3N0YXJ0ZWQgZmFpbHMpIHRyaWdnZXJzIHRoZSBhY3R1YWxcbiAgICAvLyBmZXRjaCAvIEhLREYgZGVyaXZhdGlvbjsgc3Vic2VxdWVudCBjYWxsZXJzIGF3YWl0IHRoZSBjYWNoZWQgcHJvbWlzZS5cbiAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHdvcmtmbG93UnVuSWQpO1xuXG4gICAgY29uc3Qgc3RlcEZuID0gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBOYW1lKTtcbiAgICBpZiAoIXN0ZXBGbiB8fCB0eXBlb2Ygc3RlcEZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBTdGVwIGZ1bmN0aW9uIG5vdCByZWdpc3RlcmVkOiBmYWlsIHRoZSBzdGVwIGltbWVkaWF0ZWx5IChub3QgdGhlIHJ1bikuXG4gICAgICAvLyBDcmVhdGUgYSBzdGVwX2ZhaWxlZCBldmVudCBzb1xuICAgICAgLy8gdGhlIHdvcmtmbG93IGNhbiBoYW5kbGUgaXQgZ3JhY2VmdWxseSB2aWEgdHJ5L2NhdGNoIGluIHVzZXIgY29kZS5cbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIFwiJHtzdGVwTmFtZX1cIiBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgY3VycmVudCBkZXBsb3ltZW50LiBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgYnVpbGQgb3IgYnVuZGxpbmcgaXNzdWUgdGhhdCBjYXVzZWQgdGhlIHN0ZXAgdG8gbm90IGJlIGluY2x1ZGVkIGluIHRoZSBkZXBsb3ltZW50LmA7XG4gICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdTdGVwIGZ1bmN0aW9uIG5vdCByZWdpc3RlcmVkLCBmYWlsaW5nIHN0ZXAnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICBzdGVwSWQsXG4gICAgICB9KTtcbiAgICAgIC8vIE9uIHRoZSBsYXp5IGlubGluZSBwYXRoIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgZGVmZXJyZWQgdGhpcyBzdGVwJ3NcbiAgICAgIC8vIGBzdGVwX2NyZWF0ZWRgLCBleHBlY3RpbmcgZXhlY3V0ZVN0ZXAgdG8gbWF0ZXJpYWxpemUgdGhlIHN0ZXAgdmlhIGFcbiAgICAgIC8vIGxhenkgYHN0ZXBfc3RhcnRlZGAgY2FycnlpbmcgaXRzIGlucHV0LiBXZSBuZXZlciBnZXQgdGhhdCBmYXIgZm9yIGFuXG4gICAgICAvLyB1bnJlZ2lzdGVyZWQgc3RlcCwgc28gdGhlIHN0ZXAgZW50aXR5IGRvZXMgbm90IGV4aXN0IHlldCwgYW5kIHdyaXRpbmdcbiAgICAgIC8vIGBzdGVwX2ZhaWxlZGAgc3RyYWlnaHQgYXdheSB3b3VsZCBoaXQgdGhlIHdvcmxkJ3MgXCJzdGVwIG11c3QgZXhpc3RcIlxuICAgICAgLy8gb3JkZXJpbmcgZ3VhcmQgYW5kIHdlZGdlIHRoZSBydW4uIFNlbmQgdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgZmlyc3RcbiAgICAgIC8vIChpdCBjcmVhdGVzIHRoZSBzdGVwICsgc3ludGhldGljIGBzdGVwX2NyZWF0ZWRgIGF0b21pY2FsbHkgYW5kIGtlZXBzXG4gICAgICAvLyByZXBsYXkgY29ycmVjdCksIHRoZW4gZmFpbCBpdCBiZWxvdy4gVGhpcyBhbHNvIHByZXNlcnZlcyB0aGVcbiAgICAgIC8vIGV4YWN0bHktb25lLW93bmVyIGd1YXJhbnRlZTogYSBjb25jdXJyZW50IGhhbmRsZXIgdGhhdCB3b24gdGhlIGNyZWF0ZVxuICAgICAgLy8gbWFrZXMgb3VyIGxhenkgYHN0ZXBfc3RhcnRlZGAgcmVqZWN0IHdpdGggRW50aXR5Q29uZmxpY3RFcnJvciDihpIgd2VcbiAgICAgIC8vIHJldHVybiBgc2tpcHBlZGAgYW5kIG5ldmVyIHdyaXRlIHRoZSBmYWlsdXJlIHR3aWNlLlxuICAgICAgaWYgKHBhcmFtcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUdXJibzogdGhpcyBsYXp5IGBzdGVwX3N0YXJ0ZWRgIG11c3Qgbm90IHByZWNlZGUgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAuIE9yZGVyIGl0IGFmdGVyIHRoZSBydW4tcmVhZHkgYmFycmllciAoYmVzdC1lZmZvcnQ6XG4gICAgICAgICAgLy8gYSBiYXJyaWVyIHJlamVjdGlvbiBtZWFucyB0aGUgcnVuIGRvZXNuJ3QgZXhpc3QsIGFuZCB0aGUgY3JlYXRlXG4gICAgICAgICAgLy8gYmVsb3cgc3VyZmFjZXMgdGhlIHJlYWwgZXJyb3IpLiBOby1vcCBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgIGlmIChwYXJhbXMucnVuUmVhZHlCYXJyaWVyKSB7XG4gICAgICAgICAgICBhd2FpdCBwYXJhbXMucnVuUmVhZHlCYXJyaWVyLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBhcmFtcy5sYXp5U3RlcElucHV0LFxuICAgICAgICAgICAgICAgIC8vIFN0YW1wZWQgZm9yIGNvbnNpc3RlbmN5IGV2ZW4gdGhvdWdoIHRoaXMgc3RlcCB0ZXJtaW5hbC1mYWlsc1xuICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJlbG93OyB0aGUgbG9nIHNob3VsZCBuZXZlciBzaG93IGFuIHVub3duZWRcbiAgICAgICAgICAgICAgICAvLyBsYXp5IHN0YXJ0LlxuICAgICAgICAgICAgICAgIC4uLihwYXJhbXMub3duZXJNZXNzYWdlSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyB7IG93bmVyTWVzc2FnZUlkOiBwYXJhbXMub3duZXJNZXNzYWdlSWQgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RlcFN0YXJ0ZWRFdmVudFBhcmFtc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKHN0YXJ0RXJyKSB7XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RhcnRFcnIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhzdGFydEVycikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdnb25lJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBzdGFydEVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoe1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHN0ZXBGYWlsRXJyO1xuICAgICAgfVxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBGYXRhbEVycm9yKHRydWUpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1heFJldHJpZXMgPSBzdGVwRm4ubWF4UmV0cmllcyA/PyBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVM7XG5cbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTWF4UmV0cmllcyhtYXhSZXRyaWVzKSxcbiAgICB9KTtcblxuICAgIC8vIG1heFJldHJpZXMgZW5mb3JjZWQgYmVmb3JlIHN0YXJ0aW5nIGFub3RoZXIgYXR0ZW1wdC4gVGltZW91dHMgY2FuIGtpbGxcbiAgICAvLyBhIHN0ZXAgZXhlY3V0aW9uIHdpdGhvdXQgYW55IHdheSB0byBjYXRjaCB0aGUgZXJyb3IsIHNvIHRoZSBwb3N0LWJvZHkvZXJyb3JcbiAgICAvLyBndWFyZHMgYmVsb3cgbWlnaHQgbWlzcyBpdC4gSGVuY2UsIHdlIHVzZSBgYXV0aG9yaXRhdGl2ZUF0dGVtcHRgIGNvdW50XG4gICAgLy8gYXMgYW4gYWRkaXRpb25hbCBndWFyZCBiYXNlZCBvbiBzdGVwX3N0YXJ0ZWQgY291bnQgb3IgcXVldWUgZGVsaXZlcnkgY291bnRcbiAgICAvLyBvbiBiYWNrZ3JvdW5kZWQgc3RlcHMuXG4gICAgLy8gVGhyb3duLWVycm9yIGV4aGF1c3Rpb24gc3RpbGwgdGVybWluYXRlcyBvbmUgYXR0ZW1wdCBlYXJsaWVyIHZpYSB0aGUgcG9zdC1ib2R5XG4gICAgLy8gZ3VhcmQgKHdpdGggdGhlIHRocm93biBlcnJvciBhcyBjYXVzZSksIGFuZCB0aGlzIGNoZWNrIGRvZXMgbm90IGFmZmVjdCB0aGF0LlxuICAgIGlmIChcbiAgICAgIHBhcmFtcy5hdXRob3JpdGF0aXZlQXR0ZW1wdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMuYXV0aG9yaXRhdGl2ZUF0dGVtcHQgPiBtYXhSZXRyaWVzICsgMVxuICAgICkge1xuICAgICAgY29uc3QgcmV0cnlDb3VudCA9IG1heFJldHJpZXM7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgZXhjZWVkZWQgbWF4IHJldHJpZXMgKCR7cmV0cnlDb3VudH0gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCByZXRyeUNvdW50KX0pYDtcbiAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoJ1N0ZXAgZXhjZWVkZWQgbWF4IHJldHJpZXMnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICBzdGVwSWQsXG4gICAgICAgIGF0dGVtcHQ6IHBhcmFtcy5hdXRob3JpdGF0aXZlQXR0ZW1wdCxcbiAgICAgICAgbWF4UmV0cmllcyxcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoe1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSAoYSBjb25jdXJyZW50IGhhbmRsZXIgb3IgYW5cbiAgICAgICAgICAvLyBlYXJsaWVyIGRlbGl2ZXJ5IGZhaWxlZC9jb21wbGV0ZWQgaXQpLCBzbyBub3RoaW5nIHRvIGRvLlxuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAgZm9yIGV4Y2VlZGVkIHJldHJpZXMsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdnb25lJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmYWlsZWQnIH07XG4gICAgfVxuXG4gICAgLy8gTWFwcyBhIGBzdGVwX3N0YXJ0ZWRgIHJlamVjdGlvbiB0byBhIHRlcm1pbmFsIFN0ZXBFeGVjdXRpb25SZXN1bHQsXG4gICAgLy8gc2hhcmVkIGJ5IHRoZSBhd2FpdCBwYXRoIChiZWxvdykgYW5kIHRoZSBvcHRpbWlzdGljLXN0YXJ0IHJlY29uY2lsaWF0aW9uLlxuICAgIC8vIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIGVycm9yIGlzIG5vdCBvbmUgd2UgdHJhbnNsYXRlIChjYWxsZXIgcmV0aHJvd3MpLlxuICAgIGNvbnN0IHN0YXJ0RXJyb3JUb1Jlc3VsdCA9IChcbiAgICAgIGVycjogdW5rbm93blxuICAgICk6IFN0ZXBFeGVjdXRpb25SZXN1bHQgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgaWYgKFRocm90dGxlRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gTWF0aC5tYXgoXG4gICAgICAgICAgMSxcbiAgICAgICAgICB0eXBlb2YgZXJyLnJldHJ5QWZ0ZXIgPT09ICdudW1iZXInID8gZXJyLnJldHJ5QWZ0ZXIgOiAxXG4gICAgICAgICk7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnVGhyb3R0bGVkIG9uIHN0ZXBfc3RhcnRlZCwgZGVmZXJyaW5nJywge1xuICAgICAgICAgIHJldHJ5QWZ0ZXJTZWNvbmRzOiByZXRyeUFmdGVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3Rocm90dGxlZCcsIHRpbWVvdXRTZWNvbmRzOiByZXRyeUFmdGVyIH07XG4gICAgICB9XG4gICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke3dvcmtmbG93UnVuSWR9XCIgaGFzIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBzdGVwIFwiJHtzdGVwSWR9XCI6ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgIH1cbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSwgc2tpcHBpbmcnLCB7XG4gICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgc3RlcElkLFxuICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU2tpcHBlZCh0cnVlKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFNraXBSZWFzb24oJ2NvbXBsZXRlZCcpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICB9XG4gICAgICBpZiAoVG9vRWFybHlFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoMSwgZXJyLnJldHJ5QWZ0ZXIgPz8gMSk7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0ZXAgcmV0cnlBZnRlciB0aW1lc3RhbXAgbm90IHlldCByZWFjaGVkJywge1xuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdyZXRyeScsIHRpbWVvdXRTZWNvbmRzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvLyBPcHRpbWlzdGljIGlubGluZSBzdGFydDogd2hlbiB3ZSBob2xkIHRoZSBzdGVwIGlucHV0IGxvY2FsbHkgKGxhenkgaW5saW5lXG4gICAgLy8gcGF0aCkgYW5kIHRoZSBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZCwgZmlyZSBgc3RlcF9zdGFydGVkYCBXSVRIT1VUXG4gICAgLy8gYXdhaXRpbmcgYW5kIHJ1biB0aGUgYm9keSBhZ2FpbnN0IGxvY2FsbHktc3ludGhlc2l6ZWQgc3RhdGUuIEEgbGF6eSBzdGVwXG4gICAgLy8gaXMgYWx3YXlzIGJyYW5kLW5ldyDih5IgYXR0ZW1wdCAxLCBubyBwcmlvciBlcnJvciwgc3RhcnRlZCBub3csIHNvIHdlXG4gICAgLy8gZG9uJ3QgbmVlZCB0aGUgc2VydmVyIHJvdW5kLXRyaXAgdG8gYmVnaW4uIFdlIHJlY29uY2lsZSB0aGUgaW4tZmxpZ2h0XG4gICAgLy8gYHN0ZXBfc3RhcnRlZGAgYmVmb3JlIGFueSB0ZXJtaW5hbCB3cml0ZSAoYHJlY29uY2lsZU9wdGltaXN0aWNTdGFydGApOiBpZlxuICAgIC8vIGl0IGxvc3QgdGhlIGF0b21pYyBjcmVhdGUtY2xhaW0gKDQwOSkgb3IgdGhlIHJ1biBpcyBnb25lL3Rocm90dGxlZCwgd2VcbiAgICAvLyBkaXNjYXJkIHRoZSBib2R5IHJlc3VsdC4gUnVubmluZyB0aGUgYm9keSBiZWZvcmUgY29uZmlybWluZyBvd25lcnNoaXAgY2FuXG4gICAgLy8gZXhlY3V0ZSBhIHN0ZXAgbW9yZSB0aGFuIG9uY2Ugd2hlbiBoYW5kbGVycyByYWNlLCBzbyBpbmxpbmUgc3RlcCBib2RpZXNcbiAgICAvLyBtdXN0IGJlIGlkZW1wb3RlbnQ7IGRpc2FibGUgdmlhIFdPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUPTAuXG4gICAgLy9cbiAgICAvLyBUdXJibyBtb2RlIHBhc3NlcyBgZm9yY2VPcHRpbWlzdGljU3RhcnRgIHRvIGVuYWJsZSB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlXG4gICAgLy8gZW52IGZsYWcgKGl0cyBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgcmVtb3ZlcyB0aGUgcmFjZSkuIEJ1dCBpdCBzdGlsbFxuICAgIC8vIGRlZmVycyB0byBhbiAqZXhwbGljaXQqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVD0wYDogZm9yY2VkXG4gICAgLy8gb3B0aW1pc3RpYyBzdGFydCBydW5zIHRoZSBib2R5IGJlZm9yZSBgc3RlcF9zdGFydGVkYC9gcnVuX3N0YXJ0ZWRgIGlzXG4gICAgLy8gY29uZmlybWVkLCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9wZXJ0eSBhbiBvcGVyYXRvciBvcHRzIG91dCBvZiB3aXRoIHRoYXRcbiAgICAvLyBmbGFnLCBzbyBhbiBleHBsaWNpdCBvcHQtb3V0IHdpbnMgb3ZlciB0dXJibydzIGZvcmNlLlxuICAgIGNvbnN0IG9wdGltaXN0aWNTdGFydCA9XG4gICAgICAvLyBBIHByZS1jbGFpbWVkIHN0YXJ0IGFscmVhZHkgc2V0dGxlZCBpdHMgY2xhaW0gaW4gdGhlIHN1c3BlbnNpb25cbiAgICAgIC8vIGJhdGNoOyB0aGVyZSBpcyBub3RoaW5nIHRvIGZpcmUgb3B0aW1pc3RpY2FsbHkgKGxhenlTdGVwSW5wdXQgaXNcbiAgICAgIC8vIGFsc28gYWJzZW50IG9uIHRoYXQgcGF0aDsgdGhpcyB0ZXJtIGlzIGRvY3VtZW50YXRpb24pLlxuICAgICAgcGFyYW1zLnByZWNsYWltZWRTdGFydCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAvLyBTdGFsZS1zZW5zaXRpdmUgZ3VhcmRlZCBiYXRjaGVzIGF3YWl0IHRoZSBjbGFpbSBzbyB0aGUgNDEyIGZlbmNlXG4gICAgICAvLyBjb3ZlcnMgdGhlIGJvZHksIG5vdCBqdXN0IGR1cmFibGUgd3JpdGVzOyBzZWVcbiAgICAgIC8vIFN0ZXBFeGVjdXRvclBhcmFtcy5zdXBwcmVzc09wdGltaXN0aWNTdGFydC5cbiAgICAgIHBhcmFtcy5zdXBwcmVzc09wdGltaXN0aWNTdGFydCAhPT0gdHJ1ZSAmJlxuICAgICAgKGlzT3B0aW1pc3RpY0lubGluZVN0YXJ0RW5hYmxlZCgpIHx8XG4gICAgICAgIChwYXJhbXMuZm9yY2VPcHRpbWlzdGljU3RhcnQgPT09IHRydWUgJiZcbiAgICAgICAgICAhaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFeHBsaWNpdGx5RGlzYWJsZWQoKSkpO1xuXG4gICAgLy8gS2VlcCB0aGlzIG9uIHRoZSBlbmNsb3Npbmcgc3RlcCBzcGFuIGZyb20gdGhlIGJlZ2lubmluZyBzbyBhIGxvc2luZ1xuICAgIC8vIGNsYWltIHJldGFpbnMgdGhlIHN0cmF0ZWd5IGFmdGVyIHRoZSA0MDkgaXMgcmVjb25jaWxlZCBhcyBgc2tpcHBlZGAuXG4gICAgLy8gQmFyZSBiYWNrZ3JvdW5kIHN0YXJ0cyBhbmQgb3duZWQgcmVjb3ZlcnkgZGVsaWJlcmF0ZWx5IGhhdmUgbm8gdmFsdWUuXG4gICAgaWYgKHBhcmFtcy5wcmVjbGFpbWVkU3RhcnQpIHtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoQXR0cmlidXRlLlN0ZXBTdGFydFN0cmF0ZWd5KCdiYXRjaF9wcmVjbGFpbWVkJykpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgQXR0cmlidXRlLlN0ZXBTdGFydFN0cmF0ZWd5KG9wdGltaXN0aWNTdGFydCA/ICdvcHRpbWlzdGljJyA6ICdhd2FpdGVkJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHN0ZXA6IFN0YXJ0ZWRTdGVwO1xuICAgIC8vIFBhcmFtcyBmb3IgdGhlIGBzdGVwX3N0YXJ0ZWRgIGNyZWF0ZSBvbiBlaXRoZXIgcGF0aCBiZWxvdy5cbiAgICBjb25zdCBzdGFydEV2ZW50UGFyYW1zID0gc3RlcFN0YXJ0ZWRFdmVudFBhcmFtcztcbiAgICAvLyBgRGF0ZS5ub3coKWAgdGFrZW4gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBgc3RlcF9zdGFydGVkYCBjcmVhdGUgaXNcbiAgICAvLyBpc3N1ZWQgKGVpdGhlciBwYXRoIGJlbG93KTsgYW5jaG9ycyBSU0ZTJ3MgZW5kIHBvaW50LiBTZWVcbiAgICAvLyBTdGVwTGF0ZW5jeUV2ZW50RGF0YS5yc2ZzIGFuZCB0aGUgY2FsbCBzaXRlcyBiZWxvdy5cbiAgICBsZXQgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgLy8gYERhdGUubm93KClgIHRha2VuIG9uY2UgdGhlIGBzdGVwX3N0YXJ0ZWRgIHJlc3BvbnNlIGhhcyByZXR1cm5lZCBhbmQgdGhlXG4gICAgLy8gY2xhaW0gc3VjY2VlZGVkOiBUNiBvZiB0aGUgaG9vay1yZXN1bWUgVFRSIHdpbmRvdy4gT25seSB0aGUgYXdhaXQgcGF0aFxuICAgIC8vIGNhbiBzZXQgaXQ6IG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IGRlbGliZXJhdGVseSBkb2VzIG5vdCB3YWl0IGZvciB0aGVcbiAgICAvLyBjbGFpbSBiZWZvcmUgcnVubmluZyB0aGUgYm9keSwgc28gYXQgVDcgaXQgaGFzIG5vIGNvbXBsZXRpb24gaW5zdGFudCBhbmRcbiAgICAvLyB0aGUgVFRSIGJyZWFrZG93biByZXBvcnRzIG5vIGBzdGVwX2NsYWltX21zYCAoc2VlXG4gICAgLy8gcnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cykuXG4gICAgbGV0IHN0ZXBDbGFpbUNvbXBsZXRlZEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBTZXR0bGVkIG91dGNvbWUgb2YgdGhlIGluLWZsaWdodCBvcHRpbWlzdGljIGBzdGVwX3N0YXJ0ZWRgLiBIYW5kbGVycyBhcmVcbiAgICAvLyBhdHRhY2hlZCBzeW5jaHJvbm91c2x5IChgLnRoZW4ob2ssIGVycilgKSBzbyBhIGZhc3QgcmVqZWN0aW9uIG5ldmVyXG4gICAgLy8gc3VyZmFjZXMgYXMgYW4gdW5oYW5kbGVkUmVqZWN0aW9uIHdoaWxlIHRoZSBib2R5IHJ1bnMuXG4gICAgbGV0IG9wdGltaXN0aWNTdGFydFNldHRsZWQ6XG4gICAgICB8IFByb21pc2U8eyBvazogdHJ1ZSB9IHwgeyBvazogZmFsc2U7IGVycjogdW5rbm93biB9PlxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgLy8gQXdhaXQgdGhlIG9wdGltaXN0aWMgYHN0ZXBfc3RhcnRlZGAgb3V0Y29tZSBhbmQgdHJhbnNsYXRlIGEgbG9zdCByYWNlIC9cbiAgICAvLyB0ZXJtaW5hbCBydW4gLyB0aHJvdHRsZSBpbnRvIGEgcmVzdWx0IHRoYXQgc2hvcnQtY2lyY3VpdHMgdGhlIGJvZHlcbiAgICAvLyBvdXRwdXQuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gd2Ugb3duIHRoZSBzdGVwIGFuZCBtYXkgd3JpdGUgaXRzIHRlcm1pbmFsXG4gICAgLy8gZXZlbnQuIEEgbm9uLXRyYW5zbGF0YWJsZSByZWplY3Rpb24gaXMgcmV0aHJvd24gKHNvIGEgdHJhbnNpZW50XG4gICAgLy8gc3RlcF9zdGFydGVkIGZhaWx1cmUgcHJvcGFnYXRlcyB0byB0aGUgcXVldWUgaGFuZGxlciBmb3IgcmVkZWxpdmVyeSxcbiAgICAvLyBleGFjdGx5IGFzIG9uIHRoZSBhd2FpdCBwYXRoKS4gSWRlbXBvdGVudDogc2FmZSB0byBjYWxsIG1vcmUgdGhhbiBvbmNlLlxuICAgIGNvbnN0IHJlY29uY2lsZU9wdGltaXN0aWNTdGFydCA9IGFzeW5jICgpOiBQcm9taXNlPFxuICAgICAgU3RlcEV4ZWN1dGlvblJlc3VsdCB8IHVuZGVmaW5lZFxuICAgID4gPT4ge1xuICAgICAgaWYgKCFvcHRpbWlzdGljU3RhcnRTZXR0bGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IG9wdGltaXN0aWNTdGFydFNldHRsZWQ7XG4gICAgICBpZiAoc2V0dGxlZC5vaykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IG1hcHBlZCA9IHN0YXJ0RXJyb3JUb1Jlc3VsdChzZXR0bGVkLmVycik7XG4gICAgICBpZiAoIW1hcHBlZCkgdGhyb3cgc2V0dGxlZC5lcnI7XG4gICAgICByZXR1cm4gbWFwcGVkO1xuICAgIH07XG5cbiAgICBpZiAocGFyYW1zLnByZWNsYWltZWRTdGFydD8ub3duZWQpIHtcbiAgICAgIC8vIFByZS1jbGFpbWVkIGlubGluZSBzdGFydDogdGhlIHN1c3BlbnNpb24gaGFuZGxlcidzIGJhdGNoZWQgZmFuLW91dFxuICAgICAgLy8gYWxyZWFkeSBjb21taXR0ZWQgdGhpcyBzdGVwJ3MgYHN0ZXBfY3JlYXRlZGAgKyBgc3RlcF9zdGFydGVkYCBwYWlyLFxuICAgICAgLy8gc28gdGhpcyBleGVjdXRpb24gb3ducyBhIHN0YXJ0ZWQgYXR0ZW1wdC0xIHN0ZXAgd2l0aG91dCBzZW5kaW5nIGFcbiAgICAgIC8vIHN0YXJ0IG9mIGl0cyBvd246IHRoZSBib2R5IGJlZ2lucyBzdHJhaWdodCBvZmYgdGhlIGJhdGNoIGNvbW1pdCBhbmRcbiAgICAgIC8vIHRoZSB0ZXJtaW5hbCB3cml0ZSBiZWxvdyBoYXMgbm8gaW4tZmxpZ2h0IGNsYWltIHRvIHJlY29uY2lsZS4gVGhlXG4gICAgICAvLyBiYXRjaCB0aW1lc3RhbXBzIHN0YW5kIGluIGZvciB0aGUgY2xhaW0nczogdGhlIFBPU1QgaW5zdGFudCBhbmNob3JzXG4gICAgICAvLyBSU0ZTLCB0aGUgcmVzcG9uc2UgaW5zdGFudCBpcyBUVFIncyBjbGFpbSBjb21wbGV0aW9uIChUNikuXG4gICAgICBzdGVwID0gcGFyYW1zLnByZWNsYWltZWRTdGFydC5zdGVwO1xuICAgICAgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zID0gcGFyYW1zLnByZWNsYWltZWRTdGFydC5iYXRjaFBvc3RTZW50QXRNcztcbiAgICAgIHN0ZXBDbGFpbUNvbXBsZXRlZEF0TXMgPSBwYXJhbXMucHJlY2xhaW1lZFN0YXJ0LmNsYWltQ29tcGxldGVkQXRNcztcbiAgICB9IGVsc2UgaWYgKG9wdGltaXN0aWNTdGFydCkge1xuICAgICAgLy8gQ2hhaW4gdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgb24gdGhlIHJ1bi1yZWFkeSBiYXJyaWVyICh0dXJibyBtb2RlKTpcbiAgICAgIC8vIHRoZSBzdGVwIGNhbid0IGJlIGNyZWF0ZWQgYmVmb3JlIGl0cyBydW4gZXhpc3RzLCBidXQgdGhlIGJvZHkgYmVsb3dcbiAgICAgIC8vIHJ1bnMgaW1tZWRpYXRlbHkgYWdhaW5zdCBzeW50aGVzaXplZCBzdGF0ZSwgc28gdGhlIGBydW5fc3RhcnRlZGBcbiAgICAgIC8vIHJvdW5kLXRyaXAgb3ZlcmxhcHMgdGhlIGJvZHkgcmF0aGVyIHRoYW4gYmxvY2tpbmcgaXQuIE91dHNpZGUgdHVyYm8gdGhlXG4gICAgICAvLyBiYXJyaWVyIGlzIHVuZGVmaW5lZCBhbmQgdGhpcyBpcyBhIHBsYWluIGNyZWF0ZS5cbiAgICAgIGNvbnN0IHN0YXJ0ZWRQcm9taXNlID0gKHBhcmFtcy5ydW5SZWFkeUJhcnJpZXIgPz8gUHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICAvLyBUYWtlbiByaWdodCBiZWZvcmUgdGhlIGNyZWF0ZSBmaXJlcywgbm90IGJlZm9yZSB0aGUgYmFycmllcjpcbiAgICAgICAgICAvLyBSU0ZTIG1lYXN1cmVzIHRoZSBydW5fc3RhcnRlZC10by1QT1NUIHN0cmV0Y2gsIGFuZCB0aGUgYmFycmllclxuICAgICAgICAgIC8vIHdhaXQgSVMgcGFydCBvZiB0aGF0IHN0cmV0Y2ggdW5kZXIgdHVyYm8uXG4gICAgICAgICAgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBhcmFtcy5sYXp5U3RlcElucHV0LFxuICAgICAgICAgICAgICAgIC8vIElubGluZS1vd25lcnNoaXAgc3RhbXA7IHNlZSBTdGVwRXhlY3V0b3JQYXJhbXMub3duZXJNZXNzYWdlSWQuXG4gICAgICAgICAgICAgICAgLi4uKHBhcmFtcy5vd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICA/IHsgb3duZXJNZXNzYWdlSWQ6IHBhcmFtcy5vd25lck1lc3NhZ2VJZCB9XG4gICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBBIDQxMiByZWplY3Rpb24gZnJvbSBhIGZlbmNpbmcgV29ybGQgc3VyZmFjZXMgdmlhXG4gICAgICAgICAgICAvLyByZWNvbmNpbGVPcHRpbWlzdGljU3RhcnQgYXMgYSBub24tdHJhbnNsYXRhYmxlIGVycm9yOiB0aGUgYm9keVxuICAgICAgICAgICAgLy8gcmVzdWx0IGlzIGRpc2NhcmRlZCBhbmQgdGhlIHJlamVjdGlvbiBwcm9wYWdhdGVzIHRvIHRoZSBjYWxsZXIuXG4gICAgICAgICAgICBzdGFydEV2ZW50UGFyYW1zXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIG9wdGltaXN0aWNTdGFydFNldHRsZWQgPSBzdGFydGVkUHJvbWlzZS50aGVuKFxuICAgICAgICAoKSA9PiAoeyBvazogdHJ1ZSBhcyBjb25zdCB9KSxcbiAgICAgICAgKGVycikgPT4gKHsgb2s6IGZhbHNlIGFzIGNvbnN0LCBlcnIgfSlcbiAgICAgICk7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgc3RlcCA9IHtcbiAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBJZCxcbiAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICBpbnB1dDogcGFyYW1zLmxhenlTdGVwSW5wdXQsXG4gICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzdGVwX3N0YXJ0ZWQgdmFsaWRhdGVzIHN0YXRlIGFuZCByZXR1cm5zIHRoZSBzdGVwIGVudGl0eS4gT24gdGhlIGxhenlcbiAgICAgIC8vIGlubGluZSBwYXRoIHdlIGFsc28gY2FycnkgdGhlIHN0ZXAgYGlucHV0YCBzbyB0aGUgd29ybGQgY3JlYXRlcyB0aGVcbiAgICAgIC8vIHN0ZXAgb24gdGhlIGZseSAobm8gc2VwYXJhdGUgc3RlcF9jcmVhdGVkIHJvdW5kLXRyaXApLiBUaGUgd29ybGQnc1xuICAgICAgLy8gYXRvbWljIGNyZWF0ZS1jbGFpbSBtYWtlcyB0aGlzIGV4YWN0bHktb25lLW93bmVyOiBhIGNvbmN1cnJlbnQgbG9zZXJcbiAgICAgIC8vIGdldHMgRW50aXR5Q29uZmxpY3RFcnJvciwgbWFwcGVkIHRvIGB7IHR5cGU6ICdza2lwcGVkJyB9YCwgc28gaXQgbmV2ZXJcbiAgICAgIC8vIHJ1bnMgdGhlIGJvZHkuIFdoZW4gYGxhenlTdGVwSW5wdXRgIGlzIGFic2VudCB0aGlzIGlzIHRoZSBsZWdhY3lcbiAgICAgIC8vIHN0ZXBfc3RhcnRlZCAoc3RlcCBhbHJlYWR5IGNyZWF0ZWQsIG5vIHBheWxvYWQpLlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gSW5saW5lLW93bmVyc2hpcCBzdGFtcDogcHJlc2VudCBvbiB0aGUgbGF6eSBwYXRocyBBTkQgb24gdGhlXG4gICAgICAgIC8vIG93bmVkLXJlY292ZXJ5IHBheWxvYWQtbGVzcyBzdGFydCAoYSByZWRlbGl2ZXJ5IG9mIHRoZSBvd25pbmdcbiAgICAgICAgLy8gbWVzc2FnZSByZS1leGVjdXRpbmcgaXRzIHN0ZXAgbXVzdCByZS1zdGFtcCwgc2luY2Ugb3duZXJzaGlwIGRlcml2ZXNcbiAgICAgICAgLy8gZnJvbSB0aGUgbGF0ZXN0IHN0YXJ0LCBzbyBhbiB1bnN0YW1wZWQgcmVjb3Zlcnkgc3RhcnQgd291bGQgcmVhZFxuICAgICAgICAvLyBhcyBcInVub3duZWRcIiB0byBhIGxhdGVyIHdha2UpLiBPbmx5IHRoZSBiYWNrZ3JvdW5kLXN0ZXAgcGF0aFxuICAgICAgICAvLyBwYXNzZXMgbm8gb3duZXJNZXNzYWdlSWQ6IGl0cyBzdGFydCBpcyB0aGUgYmFyZSBvbmUsIGNsZWFyaW5nXG4gICAgICAgIC8vIG93bmVyc2hpcCBhcyBpbnRlbmRlZC5cbiAgICAgICAgY29uc3Qgb3duZXJzaGlwU3RhbXAgPVxuICAgICAgICAgIHBhcmFtcy5vd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgb3duZXJNZXNzYWdlSWQ6IHBhcmFtcy5vd25lck1lc3NhZ2VJZCB9XG4gICAgICAgICAgICA6IHt9O1xuICAgICAgICBzdGVwU3RhcnRQb3N0U2VudEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBzdGFydFJlc3VsdCA9IGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICBldmVudERhdGE6XG4gICAgICAgICAgICAgIHBhcmFtcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBhcmFtcy5sYXp5U3RlcElucHV0LFxuICAgICAgICAgICAgICAgICAgICAuLi5vd25lcnNoaXBTdGFtcCxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHsgc3RlcE5hbWUsIC4uLm93bmVyc2hpcFN0YW1wIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBBIDQxMiByZWplY3Rpb24gZnJvbSBhIGZlbmNpbmcgV29ybGQgaXMgaW50ZW50aW9uYWxseSBOT1RcbiAgICAgICAgICAvLyB0cmFuc2xhdGVkIGJ5IHN0YXJ0RXJyb3JUb1Jlc3VsdCBiZWxvdywgc28gaXQgcHJvcGFnYXRlcyB0byB0aGVcbiAgICAgICAgICAvLyBjYWxsZXIgZm9yIGEgZnJlc2ggcmVwbGF5LlxuICAgICAgICAgIHN0YXJ0RXZlbnRQYXJhbXNcbiAgICAgICAgKTtcbiAgICAgICAgc3RlcENsYWltQ29tcGxldGVkQXRNcyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgc3RlcCA9IHN0YXJ0UmVzdWx0LnN0ZXA7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gc3RhcnRFcnJvclRvUmVzdWx0KGVycik7XG4gICAgICAgIGlmIChtYXBwZWQpIHJldHVybiBtYXBwZWQ7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdGVwIGV4ZWN1dGlvbiBkZXRhaWxzJywge1xuICAgICAgc3RlcE5hbWUsXG4gICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgc3RhdHVzOiBzdGVwLnN0YXR1cyxcbiAgICAgIGF0dGVtcHQ6IHN0ZXAuYXR0ZW1wdCxcbiAgICB9KTtcblxuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoc3RlcC5zdGF0dXMpLFxuICAgIH0pO1xuXG4gICAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICAgIC8vIENoZWNrIG1heCByZXRyaWVzIEFGVEVSIHN0ZXBfc3RhcnRlZCAoYXR0ZW1wdCB3YXMganVzdCBpbmNyZW1lbnRlZCkuXG4gICAgLy8gT25seSBlbmZvcmNlIHdoZW4gdGhlIHN0ZXAgaGFzIGEgcHJldmlvdXMgZXJyb3I7IHRoaXMgZGlzdGluZ3Vpc2hlc1xuICAgIC8vIGFjdHVhbCByZXRyaWVzIChmYWlsZWQg4oaSIHJldHJ5KSBmcm9tIGNvbmN1cnJlbnQgaW5saW5lIHN0YXJ0c1xuICAgIC8vIGV4ZWN1dGlvbiBsb29wIGNhbiBjYXVzZSBtdWx0aXBsZSBoYW5kbGVycyB0byBzdGVwX3N0YXJ0ZWQgdGhlIHNhbWVcbiAgICAvLyBzdGVwIHNpbXVsdGFuZW91c2x5LCBpbmZsYXRpbmcgdGhlIGF0dGVtcHQgY291bnRlciB3aXRob3V0IGFueSBmYWlsdXJlKS5cbiAgICBpZiAoc3RlcC5hdHRlbXB0ID4gbWF4UmV0cmllcyArIDEgJiYgc3RlcC5lcnJvcikge1xuICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgZXhjZWVkZWQgbWF4IHJldHJpZXMgKCR7cmV0cnlDb3VudH0gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCByZXRyeUNvdW50KX0pYDtcbiAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoJ1N0ZXAgZXhjZWVkZWQgbWF4IHJldHJpZXMnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICByZXRyeUNvdW50LFxuICAgICAgfSk7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgcHJpb3IgYXR0ZW1wdCdzIHNlcmlhbGl6ZWQgZXJyb3IgYXMgdGhlIGNhdXNlIHNvIHRoZVxuICAgICAgLy8gdW5kZXJseWluZyBmYWlsdXJlIGlzIHJlY292ZXJhYmxlIGZyb20gYHN0ZXAuZXJyb3IuY2F1c2VgIGFmdGVyXG4gICAgICAvLyBoeWRyYXRpb24sIHdpdGhvdXQgZm9yY2luZyBjb25zdW1lcnMgdG8gd2FsayB0aGUgc3RlcF9yZXRyeWluZ1xuICAgICAgLy8gZXZlbnQgaGlzdG9yeS4gQmVzdC1lZmZvcnQ6IGlmIGh5ZHJhdGlvbiBvZiB0aGUgcHJpb3IgYHN0ZXAuZXJyb3JgXG4gICAgICAvLyB0aHJvd3MsIGZhbGwgYmFjayB0byBhIEZhdGFsRXJyb3Igd2l0aG91dCBjYXVzZS5cbiAgICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICBpZiAoc3RlcC5lcnJvciAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgKHdyYXBwZWRFcnJvciBhcyBFcnJvcikuY2F1c2UgPSBhd2FpdCBoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgc3RlcC5lcnJvcixcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmU6IGJlc3QtZWZmb3J0IGNhdXNlIGF0dGFjaG1lbnQuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgd3JhcHBlZEVycm9yLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5RXhoYXVzdGVkKHRydWUpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgIH1cblxuICAgIC8vIE9wcyB0aGF0IG11c3QgYmUgZHVyYWJseSBjb21taXR0ZWQgYmVmb3JlIHN0ZXAgY29tcGxldGlvbiAoZS5nLiBhXG4gICAgLy8gc3RlcC1pbml0aWF0ZWQgYWJvcnQncyBob29rX3JlY2VpdmVkIGV2ZW50KS4gU2VlIFN0ZXBDb250ZXh0LiBEZWNsYXJlZFxuICAgIC8vIG91dHNpZGUgdGhlIHRyeSBzbyB0aGUgZmFpbHVyZSBwYXRoIGJlbG93IGNhbiBhbHNvIGRyYWluIHRoZW0uXG4gICAgY29uc3QgcHJlQ29tcGxldGlvbk9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgY29uc3Qgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBjb25zdCBzdHJlYW1TdGF0ZXM6IEZsdXNoYWJsZVN0cmVhbVN0YXRlW10gPSBbXTtcbiAgICBsZXQgb3BzU2V0dGxlZCA9IHRydWU7XG5cbiAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeSB0byBhdHRhY2ggdG8gdGhpcyBzdGVwJ3MgdGVybWluYWwgZXZlbnQuIENvbXB1dGVkXG4gICAgLy8gcmlnaHQgYmVmb3JlIHVzZXIgY29kZSBydW5zOyBkZWNsYXJlZCBoZXJlIHNvIHRoZSBmYWlsdXJlIHBhdGggKHRoZVxuICAgIC8vIGNhdGNoIGJlbG93KSBjYW4gYXR0YWNoIGl0IHRvIHN0ZXBfZmFpbGVkIHRvby5cbiAgICBsZXQgbGF0ZW5jeUV2ZW50RGF0YTogU3RlcExhdGVuY3lFdmVudERhdGEgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBCYWNrZmlsbCBSU0ZTIG9udG8gdGhlIGFscmVhZHktY29tcHV0ZWQgdGVsZW1ldHJ5IG9uY2UgdGhlIG9wdGltaXN0aWNcbiAgICAvLyB0dXJibyBzdGFydCBoYXMgc2V0dGxlZC4gT24gdGhhdCBwYXRoIHRoZSBzdGVwLXN0YXJ0IFBPU1QgZmlyZXMgaW5zaWRlXG4gICAgLy8gdGhlIHJ1bi1yZWFkeSBiYXJyaWVyJ3MgYC50aGVuYCwgc28gYHN0ZXBTdGFydFBvc3RTZW50QXRNc2AgKGFuZFxuICAgIC8vIHRoZXJlZm9yZSBSU0ZTKSBpcyB1c3VhbGx5IHN0aWxsIHVuc2V0IHdoZW4gYGxhdGVuY3lFdmVudERhdGFgIGlzXG4gICAgLy8gZmlyc3QgY29tcHV0ZWQganVzdCBiZWZvcmUgdXNlciBjb2RlICh0aGUgYmFycmllciBpcyBzdGlsbCBpbiBmbGlnaHRcbiAgICAvLyBmb3IgYW55IG5vbi10cml2aWFsIGBydW5fc3RhcnRlZGAgcm91bmQtdHJpcCwgd2hpY2ggaXMgZXhhY3RseSB0aGVcbiAgICAvLyBzbG93LXJ1bl9zdGFydGVkIGNhc2UgUlNGUyBleGlzdHMgdG8gbWVhc3VyZSkuIEJ5IHRoZSB0aW1lXG4gICAgLy8gYHJlY29uY2lsZU9wdGltaXN0aWNTdGFydCgpYCBoYXMgYXdhaXRlZCB0aGUgYmFycmllciB0aGUgUE9TVCB0aW1lc3RhbXBcbiAgICAvLyBpcyBrbm93biwgc28gd2UgcGF0Y2ggUlNGUyBpbiBiZWZvcmUgdGhlIHRlcm1pbmFsIGV2ZW50IGlzIHdyaXR0ZW4uXG4gICAgLy8gV2l0aG91dCB0aGlzLCBzbG93LXJ1bl9zdGFydGVkIHNhbXBsZXMgYXJlIGRyb3BwZWQsIGJpYXNpbmcgUlNGU1xuICAgIC8vIHBlcmNlbnRpbGVzIGxvdyAobWlzc2luZy1ub3QtYXQtcmFuZG9tKS4gUmVjb21wdXRlcyBvbmx5IFJTRlM7XG4gICAgLy8gVFRGUy9TVFNPIHN0YXkgYW5jaG9yZWQgdG8gYGV4ZWN1dGlvblN0YXJ0VGltZWAgYXMgY29tcHV0ZWQgYWJvdmUuXG4gICAgY29uc3QgYmFja2ZpbGxPcHRpbWlzdGljUnNmcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghbGF0ZW5jeUV2ZW50RGF0YSB8fCBsYXRlbmN5RXZlbnREYXRhLnJzZnMgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgY29uc3QgYW5jaG9yTXMgPSBwYXJhbXMubGF0ZW5jeVRyYWNraW5nPy5yc2ZzQW5jaG9yTXM7XG4gICAgICBpZiAoYW5jaG9yTXMgPT09IHVuZGVmaW5lZCB8fCBzdGVwU3RhcnRQb3N0U2VudEF0TXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgbGF0ZW5jeUV2ZW50RGF0YS5yc2ZzID0gTWF0aC5tYXgoMCwgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zIC0gYW5jaG9yTXMpO1xuICAgICAgaWYgKHNwYW4pIHtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJzZnNNcyhsYXRlbmN5RXZlbnREYXRhLnJzZnMpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF0dGVtcHQgPSBzdGVwLmF0dGVtcHQ7XG5cbiAgICAgIGlmICghc3RlcC5zdGFydGVkQXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgIGBTdGVwIFwiJHtzdGVwSWR9XCIgaGFzIG5vIFwic3RhcnRlZEF0XCIgdGltZXN0YW1wYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RlcFN0YXJ0ZWRBdCA9IHN0ZXAuc3RhcnRlZEF0O1xuICAgICAgLy8gVXNlIHRoZSBwcm92aWRlZCBlbmNyeXB0aW9uIGtleSB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHJlc29sdmVcbiAgICAgIC8vIHRocm91Z2ggdGhlIG1lbW9pemVkIGFjY2Vzc29yIGRlY2xhcmVkIGF0IHRoZSB0b3Agb2YgdGhpcyB0cmFjZS5cbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBwYXJhbXMuZW5jcnlwdGlvbktleSA/PyAoYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpKTtcbiAgICAgIGNvbnN0IGh5ZHJhdGVkSW5wdXQgPSBhd2FpdCB0cmFjZShcbiAgICAgICAgJ3N0ZXAuaHlkcmF0ZScsXG4gICAgICAgIHt9LFxuICAgICAgICBhc3luYyAoaHlkcmF0ZVNwYW4pID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gYXdhaXQgaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICBzdGVwLmlucHV0LFxuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBwYXJhbXMud29ya2Zsb3dEZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBzdHJlYW1TdGF0ZXNcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgIGh5ZHJhdGVTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXJndW1lbnRzQ291bnQoaHlkcmF0ZWQuYXJncy5sZW5ndGgpLFxuICAgICAgICAgICAgLi4uQXR0cmlidXRlLlF1ZXVlRGVzZXJpYWxpemVUaW1lTXMoZHVyYXRpb25NcyksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGh5ZHJhdGVkO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBGaW5hbGl6YXRpb24gb2YgYW4gdW5zZXJpYWxpemFibGUtYXJndW1lbnQgc3RlcCB3cml0ZXMgc3RlcF9jcmVhdGVkXG4gICAgICAvLyAocGxhY2Vob2xkZXIgaW5wdXQpIGFuZCBzdGVwX2ZhaWxlZCBhcyB0d28gc2VwYXJhdGUgZHVyYWJsZSB3cml0ZXMuXG4gICAgICAvLyBBIGNyYXNoIG9yIHRyYW5zaWVudCBmYWlsdXJlIGJldHdlZW4gdGhlbSBsZWF2ZXMgdGhpcyBzdGVwIHBlbmRpbmdcbiAgICAgIC8vIHdpdGggdGhlIHBsYWNlaG9sZGVyIHN0b3JlZCBhcyBpdHMgaW5wdXQsIGFuZCBub3JtYWwgY3Jhc2ggcmVjb3ZlcnlcbiAgICAgIC8vIHRoZW4gZGlzcGF0Y2hlcyBpdCBoZXJlLiBORVZFUiBydW4gdXNlciBjb2RlIHdpdGggcGxhY2Vob2xkZXJcbiAgICAgIC8vIGFyZ3VtZW50czsgY29tcGxldGUgdGhlIGludGVuZGVkIGZhaWx1cmUgaW5zdGVhZC4gVGhlXG4gICAgICAvLyBTZXJpYWxpemF0aW9uRXJyb3IgaXMgZmF0YWwgKGBmYXRhbDogdHJ1ZWApLCBzbyB0aGUgY2F0Y2ggYmVsb3dcbiAgICAgIC8vIHdyaXRlcyBzdGVwX2ZhaWxlZCB3aXRob3V0IHJldHJpZXMsIGV4YWN0bHkgd2hhdCB0aGUgaW50ZXJydXB0ZWRcbiAgICAgIC8vIGZpbmFsaXphdGlvbiB3YXMgYWJvdXQgdG8gZG8uXG4gICAgICBpZiAoaXNVbnNlcmlhbGl6YWJsZVN0ZXBJbnB1dFBsYWNlaG9sZGVyKGh5ZHJhdGVkSW5wdXQpKSB7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICdzdGVwIGFyZ3VtZW50cycsXG4gICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50IH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhcmdzID0gaHlkcmF0ZWRJbnB1dC5hcmdzO1xuICAgICAgY29uc3QgdGhpc1ZhbCA9IGh5ZHJhdGVkSW5wdXQudGhpc1ZhbCA/PyBudWxsO1xuICAgICAgY29uc3Qgd29ya2Zsb3dCYXNlVXJsID0gY3JlYXRlV29ya2Zsb3dCYXNlVXJsKFxuICAgICAgICBpc1ZlcmNlbFxuICAgICAgICAgID8gYGh0dHBzOi8vJHtwcm9jZXNzLmVudi5WRVJDRUxfVVJMfWBcbiAgICAgICAgICA6IGBodHRwOi8vbG9jYWxob3N0OiR7KGF3YWl0IGdldFBvcnRMYXp5KCkpID8/IDMwMDB9YFxuICAgICAgKTtcblxuICAgICAgLy8gLS0tIFVzZXIgY29kZSBleGVjdXRpb24gLS0tXG4gICAgICAvLyBXcmFwIG9ubHkgc3RlcEZuLmFwcGx5KCkgKHVzZXIgc3RlcCBjb2RlKSBzbyBjbGVhbnVwIGJlbG93IHJ1bnMgb25cbiAgICAgIC8vIEJPVEggc3VjY2VzcyBhbmQgZmFpbHVyZS4gQSB1c2VyLWNvZGUgdGhyb3cgaXMgY2FwdHVyZWQgaGVyZSBhbmRcbiAgICAgIC8vIHJlLXJhaXNlZCBhZnRlciBjYW5jZWxBYm9ydFJlYWRlcnMsIHNvIGl0IHN0aWxsIGZsb3dzIHRvIHRoZSBvdXRlclxuICAgICAgLy8gY2F0Y2ggKHN0ZXBfZmFpbGVkL3N0ZXBfcmV0cnlpbmcpLCBidXQgdGhlIGFib3J0LXN0cmVhbSByZWFkZXIgaXNcbiAgICAgIC8vIHRvcm4gZG93biBmaXJzdC4gV2l0aG91dCB0aGlzLCBhIHRocm93aW5nL3JldHJ5aW5nIHNpZ25hbC1iZWFyaW5nXG4gICAgICAvLyBzdGVwIHdvdWxkIGxlYWsgYSByZWFsLXRpbWUgYWJvcnQgcmVhZGVyIHBlciBhdHRlbXB0LlxuICAgICAgbGV0IHVzZXJDb2RlRXJyb3I6IHVua25vd247XG4gICAgICBsZXQgdXNlckNvZGVGYWlsZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgZXhlY3V0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGxhdGVuY3lFdmVudERhdGEgPSBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGEoe1xuICAgICAgICB0cmFja2luZzogcGFyYW1zLmxhdGVuY3lUcmFja2luZyxcbiAgICAgICAgc3RlcENvZGVTdGFydGVkQXRNczogZXhlY3V0aW9uU3RhcnRUaW1lLFxuICAgICAgICBhdHRlbXB0LFxuICAgICAgICBsYXp5U3RlcFN0YXJ0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICBvcHRpbWlzdGljU3RhcnQsXG4gICAgICAgIHByZWNsYWltZWRTdGFydDogcGFyYW1zLnByZWNsYWltZWRTdGFydCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICBzdGVwU3RhcnRQb3N0U2VudEF0TXMsXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXRlbmN5RXZlbnREYXRhKSB7XG4gICAgICAgIC8vIE1pcnJvciB0aGUgbGF0ZW5jeSB0ZWxlbWV0cnkgb250byB0aGUgc3RlcCBzcGFuIHNvIHRyYWNlcyBzaG93XG4gICAgICAgIC8vIFRURlMvU1RTTy9SU0ZTIGFsb25nc2lkZSB0aGUgZmxhbWUgZ3JhcGgsIG5vdCBqdXN0IERhdGFkb2cgbWV0cmljcy5cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uKGxhdGVuY3lFdmVudERhdGEudHRmcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IEF0dHJpYnV0ZS5TdGVwVHRmc01zKGxhdGVuY3lFdmVudERhdGEudHRmcylcbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLihsYXRlbmN5RXZlbnREYXRhLnN0c28gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBBdHRyaWJ1dGUuU3RlcFN0c29NcyhsYXRlbmN5RXZlbnREYXRhLnN0c28pXG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAuLi4obGF0ZW5jeUV2ZW50RGF0YS5yc2ZzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gQXR0cmlidXRlLlN0ZXBSc2ZzTXMobGF0ZW5jeUV2ZW50RGF0YS5yc2ZzKVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uKGxhdGVuY3lFdmVudERhdGEuZmluYWxTY2hlZHVsaW5nUmVwbGF5ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gQXR0cmlidXRlLlN0ZXBGaW5hbFNjaGVkdWxpbmdSZXBsYXlNcyhcbiAgICAgICAgICAgICAgICBsYXRlbmN5RXZlbnREYXRhLmZpbmFsU2NoZWR1bGluZ1JlcGxheVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcExhdGVuY3lPcHRpbWl6YXRpb25zKFxuICAgICAgICAgICAgbGF0ZW5jeUV2ZW50RGF0YS5vcHRpbWl6YXRpb25zID8/IFtdXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIENsb3NlIHRoZSBob29rLXJlc3VtZSBUVFIgbWVhc3VyZW1lbnQgKHNlZSBydW50aW1lL3Jlc3VtZS1sYXRlbmN5LnRzKS5cbiAgICAgICAqXG4gICAgICAgKiBDYWxsZWQgZnJvbSBJTlNJREUgYGNvbnRleHRTdG9yYWdlLnJ1bmAsIGltbWVkaWF0ZWx5IGJlZm9yZVxuICAgICAgICogYHN0ZXBGbi5hcHBseSgpYCwgZGVsaWJlcmF0ZWx5IG5vdCBhbG9uZ3NpZGUgdGhlIHN0ZXAtbGF0ZW5jeVxuICAgICAgICogdGVsZW1ldHJ5IGFib3ZlLiBgZXhlY3V0aW9uU3RhcnRUaW1lYCBpcyB0YWtlbiBiZWZvcmUgdGhlIGlubmVyXG4gICAgICAgKiBgc3RlcC5leGVjdXRlYCBzcGFuIGFuZCB0aGUgc3RlcCBjb250ZXh0IGFyZSBlc3RhYmxpc2hlZCwgYW5kXG4gICAgICAgKiBgc3RlcF9wcmVwYXJlX21zYCBpcyBkb2N1bWVudGVkIHRvIGluY2x1ZGUgZXhhY3RseSB0aGF0IHNldHVwLCBzb1xuICAgICAgICogYW5jaG9yaW5nIFQ3IHRoZXJlIHdvdWxkIHVuZGVyLXJlcG9ydCBib3RoIHRoZSBwaGFzZSBhbmQgdGhlIHRvdGFsLlxuICAgICAgICogVFRGUy9TVFNPIGtlZXAgdGhlaXIgb3duIGFuY2hvciBzbyB0aGlzIGNoYW5nZXMgbm90aGluZyBhYm91dCB0aGVtLlxuICAgICAgICpcbiAgICAgICAqIFRoZSBgcmVwb3J0ZWRgIGxhdGNoIG1ha2VzIG9uZSByZXN1bXB0aW9uIHlpZWxkIG9uZSBzYW1wbGUgZXZlblxuICAgICAgICogdGhvdWdoIGV2ZXJ5IHN0ZXAgb2YgYW4gaW5saW5lIGJhdGNoIGlzIGhhbmRlZCB0aGUgc2FtZSB0cmFja2luZ1xuICAgICAgICogb2JqZWN0OiB3aGljaGV2ZXIgc3RlcCBmaXJzdCByZWFjaGVzIHVzZXIgY29kZSB0YWtlcyB0aGVcbiAgICAgICAqIG1lYXN1cmVtZW50LiBTaGFyaW5nIGl0IChyYXRoZXIgdGhhbiBwaW5uaW5nIHRoZSBiYXRjaCdzIGZpcnN0IHN0ZXApXG4gICAgICAgKiBpcyB3aGF0IGtlZXBzIHRoZSBzYW1wbGUgYWxpdmUgd2hlbiB0aGF0IGZpcnN0IHN0ZXAgbG9zZXMgaXRzIGF0b21pY1xuICAgICAgICogY3JlYXRlLWNsYWltIHRvIGEgY29uY3VycmVudCBpbnZvY2F0aW9uIHdoaWxlIGEgc2libGluZyBwcm9jZWVkcy5cbiAgICAgICAqIFRoZSBjaGVjay1hbmQtc2V0IGlzIHN5bmNocm9ub3VzLCBzbyBjb25jdXJyZW50IHNpYmxpbmdzIGNhbm5vdCBib3RoXG4gICAgICAgKiBwYXNzIGl0LlxuICAgICAgICovXG4gICAgICBjb25zdCByZXBvcnRSZXN1bWVUdHIgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHRyYWNraW5nID0gcGFyYW1zLnJlc3VtZVRyYWNraW5nO1xuICAgICAgICBpZiAoIXRyYWNraW5nIHx8IHRyYWNraW5nLnJlcG9ydGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjb21wdXRlUmVzdW1lVHRyQXR0cmlidXRlcyh7XG4gICAgICAgICAgdHJhY2tpbmcsXG4gICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICBzdGVwQ2xhaW1TdGFydGVkQXRNczogc3RlcFN0YXJ0UG9zdFNlbnRBdE1zLFxuICAgICAgICAgIHN0ZXBDbGFpbUNvbXBsZXRlZEF0TXMsXG4gICAgICAgICAgc3RlcENvZGVTdGFydGVkQXRNczogRGF0ZS5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYXR0cmlidXRlcykgcmV0dXJuO1xuICAgICAgICB0cmFja2luZy5yZXBvcnRlZCA9IHRydWU7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7XG4gICAgICB9O1xuXG4gICAgICBsZXQgc3RlcEV4ZWN1dGlvblN0YXR1czogJ29rJyB8ICdlcnJvcicgPSAnb2snO1xuICAgICAgY29uc3Qgc3RlcEV4ZWN1dGlvblN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhY2UoJ3N0ZXAuZXhlY3V0ZScsIHt9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRleHRTdG9yYWdlLnJ1bihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RlcE1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgIHN0ZXBTdGFydGVkQXQ6IG5ldyBEYXRlKCtzdGVwU3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3b3JrZmxvd01ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IG5ldyBEYXRlKCt3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgdXJsOiB3b3JrZmxvd0Jhc2VVcmwsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiBwYXJhbXMud29ya2Zsb3dEZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHJvb3RSdW5JZDogcGFyYW1zLnJvb3RSdW5JZCxcbiAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICBwcmVDb21wbGV0aW9uT3BzLFxuICAgICAgICAgICAgICBzdHJlYW1TdGF0ZXMsXG4gICAgICAgICAgICAgIGNsb3N1cmVWYXJzOiBoeWRyYXRlZElucHV0LmNsb3N1cmVWYXJzLFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0IHJ1bnMgdGhpcyBib2R5IGJlZm9yZSBgcnVuX3N0YXJ0ZWRgIGlzXG4gICAgICAgICAgICAgIC8vIGR1cmFibGUuIEV4cG9zZSB0aGUgYmFycmllciBzbyBhIGRpcmVjdCBzdGVwLWJvZHkgd29ybGQgd3JpdGVcbiAgICAgICAgICAgICAgLy8gKGUuZy4gYHNldEF0dHJpYnV0ZXNgKSBjYW4gb3JkZXIgaXRzZWxmIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAvLyBydW4gZXhpc3RzLiBVbmRlZmluZWQgb24gdGhlIGF3YWl0IHBhdGggKHJ1biBhbHJlYWR5IGR1cmFibGUpLlxuICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXI6IG9wdGltaXN0aWNTdGFydFxuICAgICAgICAgICAgICAgID8gcGFyYW1zLnJ1blJlYWR5QmFycmllclxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gVGhlIGxhc3QgaW5zdGFudCBiZWZvcmUgdXNlciBjb2RlOiBUNyBvZiB0aGUgcmVzdW1lIHdpbmRvdy5cbiAgICAgICAgICAgICAgcmVwb3J0UmVzdW1lVHRyKCk7XG4gICAgICAgICAgICAgIHJldHVybiBzdGVwRm4uYXBwbHkodGhpc1ZhbCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc3RlcEV4ZWN1dGlvblN0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgIHVzZXJDb2RlRXJyb3IgPSBlcnI7XG4gICAgICAgIHVzZXJDb2RlRmFpbGVkID0gdHJ1ZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHZvaWQgcmVjb3JkU3RlcEV4ZWN1dGlvbkR1cmF0aW9uKFxuICAgICAgICAgIHBlcmZvcm1hbmNlLm5vdygpIC0gc3RlcEV4ZWN1dGlvblN0YXJ0VGltZSxcbiAgICAgICAgICBzdGVwRXhlY3V0aW9uU3RhdHVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBleGVjdXRpb25UaW1lTXMgPSBEYXRlLm5vdygpIC0gZXhlY3V0aW9uU3RhcnRUaW1lO1xuXG4gICAgICAvLyBUZWFyIGRvd24gYW55IGFib3J0LXN0cmVhbSByZWFkZXJzIG9wZW5lZCB3aGlsZSBoeWRyYXRpbmcgdGhlIHN0ZXAnc1xuICAgICAgLy8gYXJndW1lbnRzIChhIHNlcmlhbGl6ZWQgQWJvcnRTaWduYWwgb3BlbnMgYSByZWFsLXRpbWUgYWJvcnQgcmVhZGVyIGZvclxuICAgICAgLy8gdGhlIHN0ZXAncyBkdXJhdGlvbikuIFdpdGhvdXQgdGhpcyB0aGUgcmVhZGVyJ3MgYHJlYWQoKWAgcHJvbWlzZSBuZXZlclxuICAgICAgLy8gc2V0dGxlcywgc28gdGhlIGBvcHNgIGZsdXNoIGJlbG93IGFsd2F5cyBsb3NlcyB0aGUgNTAwbXMgcmFjZSBhbmQgdGhlXG4gICAgICAvLyBzdGVwIHJlcG9ydHMgYGhhc1BlbmRpbmdPcHNgLCBmb3JjaW5nIHRoZSBpbmxpbmUgbG9vcCB0byBxdWV1ZSBhXG4gICAgICAvLyBjb250aW51YXRpb24gYW5kIHBheWluZyBhIGZ1bGwgcm91bmQtdHJpcCBwZXIgc2lnbmFsLWJlYXJpbmcgc3RlcC5cbiAgICAgIC8vIFJ1bnMgdW5jb25kaXRpb25hbGx5IChzdWNjZXNzIG9yIGZhaWx1cmUpIHNvIGEgdGhyb3dpbmcgc3RlcCBkb2Vzbid0XG4gICAgICAvLyBsZWFrIHRoZSByZWFkZXIuXG4gICAgICBjYW5jZWxBYm9ydFJlYWRlcnMoLi4uYXJncywgdGhpc1ZhbCwgaHlkcmF0ZWRJbnB1dC5jbG9zdXJlVmFycyk7XG5cbiAgICAgIC8vIFJlLXJhaXNlIGEgdXNlci1jb2RlIGZhaWx1cmUgbm93IHRoYXQgY2xlYW51cCBoYXMgcnVuOyB0aGUgb3V0ZXJcbiAgICAgIC8vIGNhdGNoIG1hcHMgaXQgdG8gc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZy5cbiAgICAgIGlmICh1c2VyQ29kZUZhaWxlZCkge1xuICAgICAgICB0aHJvdyB1c2VyQ29kZUVycm9yO1xuICAgICAgfVxuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlF1ZXVlRXhlY3V0aW9uVGltZU1zKGV4ZWN1dGlvblRpbWVNcyksXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhY2UoJ3N0ZXAuZGVoeWRyYXRlJywge30sIGFzeW5jIChkZWh5ZHJhdGVTcGFuKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IGRlaHlkcmF0ZWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICBvcHMsXG4gICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBjb21wcmVzc2lvbixcbiAgICAgICAgICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBhIHJldHVybmVkIHN0cmVhbSBpcyBwaXBlZCB0byB0aGUgc2VydmVyXG4gICAgICAgICAgLy8gYWZ0ZXIgdGhlIGJvZHkgYnV0IHdpdGhpbiB0aGlzIHNhbWUgb3AgZmx1c2gsIHNvIGdhdGUgaXRzIGZpcnN0XG4gICAgICAgICAgLy8gd3JpdGUgb24gdGhlIHJ1bi1yZWFkeSBiYXJyaWVyLiBVbmRlZmluZWQgb24gdGhlIGF3YWl0IHBhdGguXG4gICAgICAgICAgb3B0aW1pc3RpY1N0YXJ0ID8gcGFyYW1zLnJ1blJlYWR5QmFycmllciA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgICAgZGVoeWRyYXRlU3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLlF1ZXVlU2VyaWFsaXplVGltZU1zKGR1cmF0aW9uTXMpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmVzdWx0VHlwZSh0eXBlb2YgZGVoeWRyYXRlZCksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZGVoeWRyYXRlZDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBcm0gdGhlIGJhY2tncm91bmQgZmx1c2ggYmVmb3JlIHRoZSBkdXJhYmlsaXR5IHdhaXQgc28gbG9jay1oZWxkXG4gICAgICAvLyBzdHJlYW1zIGFuZCBsYXRlIGNsb3NlL3dyaXRlcyBrZWVwIHRoZWlyIGV4aXN0aW5nIGxpZmVjeWNsZSBldmVuIGlmIGFcbiAgICAgIC8vIGRyYWluIGZhaWxzLiBUaGUgZHJhaW4gc25hcHNob3RzIG9ubHkgZnJhbWVzIHByb2R1Y2VkIGJ5IHRoaXMgc3RlcCBhbmRcbiAgICAgIC8vIGRvZXMgbm90IGRlcGVuZCBvbiB3cml0ZXItbG9jayByZWxlYXNlLlxuICAgICAgaWYgKG9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG9wc1Byb21pc2UgPSBQcm9taXNlLmFsbChvcHMpO1xuICAgICAgICBzYWZlV2FpdFVudGlsKG9wc1Byb21pc2UsIChlcnIpID0+IHtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ0JhY2tncm91bmQgZmx1c2ggb2Ygc3RlcCBzdHJlYW0gb3BzIGZhaWxlZCcsIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgVjIgaW5saW5lLWxvb3AgaGV1cmlzdGljIGNvbmN1cnJlbnRseSB3aXRoIGR1cmFiaWxpdHkgc29cbiAgICAgICAgLy8gYSBoZWxkIGxvY2sgY29zdHMgbWF4KDUwMG1zLCBQVVQgUlRUKSwgbm90IDUwMG1zIHBsdXMgdGhlIFBVVCBSVFQuXG4gICAgICAgIGNvbnN0IG9wc1NldHRsZWRQcm9taXNlID0gUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICBvcHNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXNDbGllbnREaXNjb25uZWN0RXJyb3IoZXJyKSkgcmV0dXJuIHRydWUgYXMgY29uc3Q7XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBQcm9taXNlPGZhbHNlPigocikgPT4gc2V0VGltZW91dCgoKSA9PiByKGZhbHNlKSwgNTAwKSksXG4gICAgICAgIF0pO1xuICAgICAgICAvLyBUaGUgZHVyYWJpbGl0eSB3YWl0IGNhbiBvdXRsaXZlIGFuIGltbWVkaWF0ZSBvcCByZWplY3Rpb24uIE9ic2VydmVcbiAgICAgICAgLy8gdGhpcyBicmFuY2ggbm93OyB0aGUgYXdhaXRlZCBjb3B5IGJlbG93IHN0aWxsIHN1cmZhY2VzIHRoZSBlcnJvci5cbiAgICAgICAgb3BzU2V0dGxlZFByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgICAgIGF3YWl0IHNldHRsZVJlbGVhc2VkU3RlcFN0cmVhbXMoc3RyZWFtU3RhdGVzKTtcblxuICAgICAgICAvLyBUaGlzIG91dGNvbWUgaXMgb25seSB0aGUgaW5saW5lLWxvb3AgaGV1cmlzdGljLiBEdXJhYmlsaXR5IHdhc1xuICAgICAgICAvLyBlc3RhYmxpc2hlZCBpbmRlcGVuZGVudGx5IGFib3ZlLlxuICAgICAgICBvcHNTZXR0bGVkID0gYXdhaXQgb3BzU2V0dGxlZFByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIE9wdGltaXN0aWMgc3RhcnQ6IHRoZSBib2R5IHJhbiBiZWZvcmUgYHN0ZXBfc3RhcnRlZGAgd2FzIGNvbmZpcm1lZC5cbiAgICAgIC8vIFJlY29uY2lsZSBpdCBub3c6IGlmIHdlIGxvc3QgdGhlIGNyZWF0ZS1jbGFpbSAob3IgdGhlIHJ1biBpc1xuICAgICAgLy8gZ29uZS90aHJvdHRsZWQpIGRpc2NhcmQgdGhpcyByZXN1bHQgYW5kIGRvbid0IHdyaXRlIHN0ZXBfY29tcGxldGVkLlxuICAgICAgLy8gUmVjb25jaWxlIGJlZm9yZSBkcmFpbmluZyBwcmVDb21wbGV0aW9uT3BzOiBhIGRpc2NhcmRlZCByZXN1bHQgbWVhbnNcbiAgICAgIC8vIHRoZSB3aW5uaW5nIGhhbmRsZXIgb3ducyB0aGUgb3V0Y29tZSAoYW5kIHJlLWZpcmVzIGFueSBhYm9ydFxuICAgICAgLy8gaWRlbXBvdGVudGx5KSwgc28gdGhlcmUncyBubyBwb2ludCBwYXlpbmcgdGhlIGFib3J0LWNvbW1pdCBsYXRlbmN5LlxuICAgICAgaWYgKG9wdGltaXN0aWNTdGFydCkge1xuICAgICAgICBjb25zdCByZWNvbmNpbGUgPSBhd2FpdCByZWNvbmNpbGVPcHRpbWlzdGljU3RhcnQoKTtcbiAgICAgICAgaWYgKHJlY29uY2lsZSkgcmV0dXJuIHJlY29uY2lsZTtcbiAgICAgICAgLy8gQmFycmllciByZXNvbHZlZDogdGhlIHN0ZXAtc3RhcnQgUE9TVCB0aW1lc3RhbXAgaXMgbm93IGtub3duLCBzb1xuICAgICAgICAvLyBSU0ZTIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgc3RlcF9jb21wbGV0ZWQgZXZlbnQgYmVsb3cuXG4gICAgICAgIGJhY2tmaWxsT3B0aW1pc3RpY1JzZnMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tbWl0IG11c3QtYmUtZHVyYWJsZSBvcHMgKGUuZy4gYSBzdGVwLWluaXRpYXRlZCBhYm9ydCdzXG4gICAgICAvLyBob29rX3JlY2VpdmVkIGV2ZW50KSBiZWZvcmUgd3JpdGluZyBzdGVwX2NvbXBsZXRlZCwgc28gYW55IHdvcmtmbG93XG4gICAgICAvLyBjb250aW51YXRpb24gdHJpZ2dlcmVkIGJ5IHRoYXQgZXZlbnQgb2JzZXJ2ZXMgdGhlIGFib3J0IHJhdGhlciB0aGFuXG4gICAgICAvLyByYWNpbmcgaXQuIFRoZXNlIG9wcyBzd2FsbG93IHRoZWlyIG93biBlcnJvcnMsIHNvIGF3YWl0aW5nIG9ubHlcbiAgICAgIC8vIGVuZm9yY2VzIG9yZGVyaW5nICh0aGUgYC5jYXRjaCgpYCBkZWZlbmRzIHRoZSBuby1yZWplY3QgY29udHJhY3Qgb25cbiAgICAgIC8vIFN0ZXBDb250ZXh0LnByZUNvbXBsZXRpb25PcHMpLlxuICAgICAgLy9cbiAgICAgIC8vIFRyYWRlb2ZmOiBjb3JyZWN0bmVzcyByZXF1aXJlcyB0aGUgaG9vayBiZSBkdXJhYmxlIGJlZm9yZSBjb21wbGV0aW9uLFxuICAgICAgLy8gc28sIHVubGlrZSB0aGUgYmFja2dyb3VuZCBgb3BzYCBmbHVzaCBhYm92ZSwgdGhpcyBjYW5ub3QgYmUgY2FwcGVkXG4gICAgICAvLyB3aXRoIGEgcmVzb2x2ZS1vbi10aW1lb3V0IHJhY2UuIEEgc2xvdyByZXN1bWUgdGhlcmVmb3JlIGFkZHMgaXRzXG4gICAgICAvLyBsYXRlbmN5IHRvIGEgc3RlcCB0aGF0IGFib3J0cyBhIGNvbnRyb2xsZXIsIGFuZCBhIHRydWUgaGFuZyBob2xkc1xuICAgICAgLy8gY29tcGxldGlvbiB1bnRpbCB0aGUgcGxhdGZvcm0vcXVldWUgZXhlY3V0aW9uIHRpbWVvdXQgZmlyZXM7IHRoZSBxdWV1ZVxuICAgICAgLy8gdGhlbiByZWRlbGl2ZXJzIGFuZCB0aGUgc3RlcCByZXRyaWVzLCByZS1maXJpbmcgdGhlIGFib3J0IGlkZW1wb3RlbnRseS5cbiAgICAgIGlmIChwcmVDb21wbGV0aW9uT3BzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJlQ29tcGxldGlvbk9wcykuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgLy8gT3B0aW1pc3RpYyBzdGFydDogdGhlIGJvZHkgdGhyZXcgYmVmb3JlIGBzdGVwX3N0YXJ0ZWRgIHdhcyBjb25maXJtZWQuXG4gICAgICAvLyBSZWNvbmNpbGUgZmlyc3Q6IGlmIHdlIGxvc3QgdGhlIGNyZWF0ZS1jbGFpbSAob3IgdGhlIHJ1biBpc1xuICAgICAgLy8gZ29uZS90aHJvdHRsZWQpIHRoZSBib2R5IGVycm9yIGlzIG1vb3Q7IGRpc2NhcmQgaXQgYW5kIGRvbid0IHdyaXRlIGFcbiAgICAgIC8vIHRlcm1pbmFsIGV2ZW50ICh0aGUgd2lubmluZyBoYW5kbGVyIG93bnMgdGhlIG91dGNvbWUpLiBSZWNvbmNpbGVcbiAgICAgIC8vIGJlZm9yZSBkcmFpbmluZyBwcmVDb21wbGV0aW9uT3BzIGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIHN1Y2Nlc3NcbiAgICAgIC8vIHBhdGg6IGEgZGlzY2FyZGVkIG91dGNvbWUgZG9lc24ndCBuZWVkIHRoZSBhYm9ydCBjb21taXR0ZWQgaGVyZS5cbiAgICAgIGlmIChvcHRpbWlzdGljU3RhcnQpIHtcbiAgICAgICAgY29uc3QgcmVjb25jaWxlID0gYXdhaXQgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0KCk7XG4gICAgICAgIGlmIChyZWNvbmNpbGUpIHJldHVybiByZWNvbmNpbGU7XG4gICAgICAgIC8vIEJhcnJpZXIgcmVzb2x2ZWQ6IGF0dGFjaCBSU0ZTIHRvIHRoZSBzdGVwX2ZhaWxlZCBldmVudChzKSBiZWxvdy5cbiAgICAgICAgYmFja2ZpbGxPcHRpbWlzdGljUnNmcygpO1xuICAgICAgfVxuXG4gICAgICAvLyBPcmRlciBhbnkgbXVzdC1iZS1kdXJhYmxlIG9wcyAoZS5nLiBhIHN0ZXAtaW5pdGlhdGVkIGFib3J0J3NcbiAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgZXZlbnQpIGFoZWFkIG9mIHN0ZXBfZmFpbGVkIHRvbzogYSBzdGVwIHRoYXQgYWJvcnRzIGFuZFxuICAgICAgLy8gdGhlbiB0aHJvd3MgbXVzdCBzdGlsbCBoYXZlIHRoZSBhYm9ydCByZWNvcmRlZCBiZWZvcmUgdGhlIGZhaWx1cmVcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBvYnNlcnZlcyBpdC4gU2FtZSBsYXRlbmN5IHRyYWRlb2ZmIGFuZCBuby1yZWplY3QgY29udHJhY3RcbiAgICAgIC8vIGFzIHRoZSBzdWNjZXNzIHBhdGggYWJvdmUuIFNlZSBTdGVwQ29udGV4dC5wcmVDb21wbGV0aW9uT3BzLlxuICAgICAgaWYgKHByZUNvbXBsZXRpb25PcHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcmVDb21wbGV0aW9uT3BzKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUVyciA9IHByb21vdGVBYm9ydEVycm9yVG9GYXRhbChlcnIpO1xuXG4gICAgICBjb25zdCBub3JtYWxpemVkRXJyb3IgPSBhd2FpdCBub3JtYWxpemVVbmtub3duRXJyb3IoZWZmZWN0aXZlRXJyKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdGFjayA9XG4gICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKGVmZmVjdGl2ZUVycikgfHwgJyc7XG5cbiAgICAgIGlmIChlZmZlY3RpdmVFcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/LihlZmZlY3RpdmVFcnIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0ZhdGFsID0gRmF0YWxFcnJvci5pcyhlZmZlY3RpdmVFcnIpO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBFcnJvck5hbWUoZ2V0RXJyb3JOYW1lKGVmZmVjdGl2ZUVycikpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEVycm9yTWVzc2FnZShub3JtYWxpemVkRXJyb3IubWVzc2FnZSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZ2V0RXJyb3JOYW1lKGVmZmVjdGl2ZUVycikpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JDYXRlZ29yeShcbiAgICAgICAgICBpc0ZhdGFsXG4gICAgICAgICAgICA/ICdmYXRhbCdcbiAgICAgICAgICAgIDogUmV0cnlhYmxlRXJyb3IuaXMoZWZmZWN0aXZlRXJyKVxuICAgICAgICAgICAgICA/ICdyZXRyeWFibGUnXG4gICAgICAgICAgICAgIDogJ3RyYW5zaWVudCdcbiAgICAgICAgKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yUmV0cnlhYmxlKCFpc0ZhdGFsKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRmF0YWwpIHtcbiAgICAgICAgc3RlcExvZ2dlci5lcnJvcihcbiAgICAgICAgICAnRW5jb3VudGVyZWQgRmF0YWxFcnJvciB3aGlsZSBleGVjdXRpbmcgc3RlcCwgYnViYmxpbmcgdXAgdG8gcGFyZW50IHdvcmtmbG93JyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQsIHN0ZXBOYW1lLCBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2sgfVxuICAgICAgICApO1xuICAgICAgICAvLyBBcHBseSB0aGUgbm9ybWFsaXplZCBzdGFjayB0byB0aGUgdGhyb3duIHZhbHVlIHNvIHRoZSBzZXJpYWxpemVkXG4gICAgICAgIC8vIGVycm9yIHByZXNlcnZlcyBpdCBmb3IgY29uc3VtZXJzLiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCB3b3Jrc1xuICAgICAgICAvLyBhY3Jvc3MgVk0gcmVhbG1zIChhIHdvcmtmbG93LXRocm93biBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiB0aGVcbiAgICAgICAgLy8gVk0ncyBFcnJvciBjbGFzcywgbm90IHRoZSBob3N0J3MpLlxuICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcihlZmZlY3RpdmVFcnIpICYmIG5vcm1hbGl6ZWRTdGFjaykge1xuICAgICAgICAgIChlZmZlY3RpdmVFcnIgYXMgRXJyb3IpLnN0YWNrID0gbm9ybWFsaXplZFN0YWNrO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUVycixcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIC4uLmxhdGVuY3lFdmVudERhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChzdGVwRmFpbEVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogc3RlcEZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgICAgfVxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBGYXRhbEVycm9yKHRydWUpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2ZhaWxlZCcgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9uLWZhdGFsIGVycm9yOiBjaGVjayBpZiByZXRyaWVzIHJlbWFpbmluZ1xuICAgICAgY29uc3QgY3VycmVudEF0dGVtcHQgPSBzdGVwLmF0dGVtcHQ7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEF0dGVtcHQoY3VycmVudEF0dGVtcHQpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcE1heFJldHJpZXMobWF4UmV0cmllcyksXG4gICAgICB9KTtcblxuICAgICAgaWYgKGN1cnJlbnRBdHRlbXB0ID49IG1heFJldHJpZXMgKyAxKSB7XG4gICAgICAgIC8vIE1heCByZXRyaWVzIHJlYWNoZWRcbiAgICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgJ01heCByZXRyaWVzIHJlYWNoZWQsIGJ1YmJsaW5nIGVycm9yIHRvIHBhcmVudCB3b3JrZmxvdycsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIFwiJHtzdGVwTmFtZX1cIiBmYWlsZWQgYWZ0ZXIgJHttYXhSZXRyaWVzfSAke3BsdXJhbGl6ZSgncmV0cnknLCAncmV0cmllcycsIG1heFJldHJpZXMpfTogJHtub3JtYWxpemVkRXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAvLyBXcmFwIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgYXMgYGNhdXNlYCBvbiBhIGZyZXNoIEZhdGFsRXJyb3JcbiAgICAgICAgLy8gc28gdGhlIHdyYXBwaW5nIG1lc3NhZ2UgKyByZXRyeS1jb3VudCBmcmFtaW5nIGlzIHRoZSB1c2VyLWZhY2luZ1xuICAgICAgICAvLyBlcnJvciB3aGlsZSB0aGUgb3JpZ2luYWwgZmFpbHVyZSByZW1haW5zIHJlY292ZXJhYmxlIGZyb21cbiAgICAgICAgLy8gYGVyci5jYXVzZWAgYWZ0ZXIgaHlkcmF0aW9uLlxuICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAod3JhcHBlZEVycm9yIGFzIEVycm9yKS5jYXVzZSA9IGVycjtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRTdGFjaykgd3JhcHBlZEVycm9yLnN0YWNrID0gbm9ybWFsaXplZFN0YWNrO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICB3cmFwcGVkRXJyb3IsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5sYXRlbmN5RXZlbnREYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgIH1cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHJlbWFpbmluZ1xuICAgICAgaWYgKFJldHJ5YWJsZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdFbmNvdW50ZXJlZCBSZXRyeWFibGVFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICBhdHRlbXB0OiBjdXJyZW50QXR0ZW1wdCxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGVwTG9nZ2VyLmluZm8oJ0VuY291bnRlcmVkIEVycm9yLCBzdGVwIHdpbGwgYmUgcmV0cmllZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIGF0dGVtcHQ6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHRoZSBub3JtYWxpemVkIHN0YWNrIHRvIHRoZSB0aHJvd24gdmFsdWUgc28gaXQgc3Vydml2ZXNcbiAgICAgIC8vIHNlcmlhbGl6YXRpb24uIFNlZSB0aGUgRmF0YWxFcnJvciBzaXRlIGFib3ZlIGZvciB3aHkgd2UgdXNlXG4gICAgICAvLyBgdHlwZXMuaXNOYXRpdmVFcnJvcmAgaW5zdGVhZCBvZiBgZXJyIGluc3RhbmNlb2YgRXJyb3JgLlxuICAgICAgaWYgKHR5cGVzLmlzTmF0aXZlRXJyb3IoZXJyKSAmJiBub3JtYWxpemVkU3RhY2spIHtcbiAgICAgICAgKGVyciBhcyBFcnJvcikuc3RhY2sgPSBub3JtYWxpemVkU3RhY2s7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIC4uLihSZXRyeWFibGVFcnJvci5pcyhlcnIpICYmIHsgcmV0cnlBZnRlcjogZXJyLnJldHJ5QWZ0ZXIgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChzdGVwUmV0cnlFcnIpIHtcbiAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcFJldHJ5RXJyKSkge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICdUcmllZCByZXRyeWluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBzdGVwUmV0cnlFcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHN0ZXBSZXRyeUVycjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBNYXRoLm1heChcbiAgICAgICAgMSxcbiAgICAgICAgUmV0cnlhYmxlRXJyb3IuaXMoZXJyKVxuICAgICAgICAgID8gTWF0aC5jZWlsKCgrZXJyLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwKVxuICAgICAgICAgIDogMVxuICAgICAgKTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlUaW1lb3V0U2Vjb25kcyh0aW1lb3V0U2Vjb25kcyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlXaWxsUmV0cnkodHJ1ZSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3JldHJ5JywgdGltZW91dFNlY29uZHMgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RlcF9jb21wbGV0ZWQgZXZlbnQgb3V0c2lkZSB0aGUgc3RlcCBleGVjdXRpb24gZmFpbHVyZSBwYXRoOlxuICAgIC8vIHBlcnNpc3RlbmNlIGZhaWx1cmVzIGFyZSBpbmZyYXN0cnVjdHVyZSBlcnJvcnMgYW5kIHNob3VsZCByZWRlbGl2ZXIgdGhlXG4gICAgLy8gcXVldWUgbWVzc2FnZSwgbm90IGJlY29tZSB1c2VyIHN0ZXBfcmV0cnlpbmcvc3RlcF9mYWlsZWQgZXZlbnRzLlxuICAgIGxldCBjb21wbGV0ZWRSZXN1bHQ6IEV2ZW50UmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBjb21wbGV0ZWRSZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICByZXN1bHQ6IHJlc3VsdCBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgLi4ubGF0ZW5jeUV2ZW50RGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBwYXJhbXMuaW5saW5lRGVsdGFTaW5jZUN1cnNvciAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IHNpbmNlQ3Vyc29yOiBwYXJhbXMuaW5saW5lRGVsdGFTaW5jZUN1cnNvciB9XG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAnVHJpZWQgY29tcGxldGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICB9XG4gICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBjb25zdCBpbmxpbmVEZWx0YSA9IGV4dHJhY3RJbmxpbmVEZWx0YShcbiAgICAgIGNvbXBsZXRlZFJlc3VsdCxcbiAgICAgIHBhcmFtcy5pbmxpbmVEZWx0YVNpbmNlQ3Vyc29yICE9PSB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnY29tcGxldGVkJyksXG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJlc3VsdFR5cGUodHlwZW9mIHJlc3VsdCksXG4gICAgfSk7XG5cbiAgICBpZiAob3BzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0ZXBMb2dnZXIuZGVidWcoJ1N0ZXAgaGFzIHBlbmRpbmcgb3BzJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgb3BzQ291bnQ6IG9wcy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gaGFzUGVuZGluZ09wcyBzaWduYWxzIHRoZSBjb21iaW5lZCBoYW5kbGVyIHRvIGJyZWFrIHRoZSBsb29wXG4gICAgLy8gYW5kIHF1ZXVlIGEgY29udGludWF0aW9uIHNvIHdhaXRVbnRpbCBjYW4gZmx1c2ggdGhlbS5cbiAgICByZXR1cm4geyB0eXBlOiAnY29tcGxldGVkJywgaGFzUGVuZGluZ09wczogIW9wc1NldHRsZWQsIGlubGluZURlbHRhIH07XG4gIH0pO1xufVxuIl19