@workflow/core 5.0.0-beta.26 → 5.0.0-beta.28

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 (52) hide show
  1. package/dist/create-hook.d.ts +2 -2
  2. package/dist/create-hook.js +1 -1
  3. package/dist/events-consumer.d.ts +1 -1
  4. package/dist/events-consumer.d.ts.map +1 -1
  5. package/dist/events-consumer.js +18 -2
  6. package/dist/flushable-stream.d.ts.map +1 -1
  7. package/dist/flushable-stream.js +9 -3
  8. package/dist/runtime/constants.d.ts +14 -0
  9. package/dist/runtime/constants.d.ts.map +1 -1
  10. package/dist/runtime/constants.js +31 -1
  11. package/dist/runtime/get-world-lazy.d.ts +3 -12
  12. package/dist/runtime/get-world-lazy.d.ts.map +1 -1
  13. package/dist/runtime/get-world-lazy.js +17 -27
  14. package/dist/runtime/replay-budget.d.ts.map +1 -1
  15. package/dist/runtime/replay-budget.js +6 -5
  16. package/dist/runtime/start.d.ts.map +1 -1
  17. package/dist/runtime/start.js +8 -10
  18. package/dist/runtime/step-executor.d.ts.map +1 -1
  19. package/dist/runtime/step-executor.js +65 -35
  20. package/dist/runtime/step-handler.d.ts.map +1 -1
  21. package/dist/runtime/step-handler.js +13 -11
  22. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  23. package/dist/runtime/suspension-handler.js +94 -72
  24. package/dist/runtime/wait-continuation.d.ts +2 -2
  25. package/dist/runtime/wait-continuation.d.ts.map +1 -1
  26. package/dist/runtime/wait-continuation.js +19 -6
  27. package/dist/runtime/world-compatibility.d.ts +5 -0
  28. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  29. package/dist/runtime/world-compatibility.js +12 -0
  30. package/dist/runtime/world-init.d.ts +16 -41
  31. package/dist/runtime/world-init.d.ts.map +1 -1
  32. package/dist/runtime/world-init.js +17 -42
  33. package/dist/runtime/world-target.d.ts +11 -0
  34. package/dist/runtime/world-target.d.ts.map +1 -0
  35. package/dist/runtime/world-target.js +15 -0
  36. package/dist/runtime/world.d.ts +21 -9
  37. package/dist/runtime/world.d.ts.map +1 -1
  38. package/dist/runtime/world.js +45 -99
  39. package/dist/runtime.d.ts +2 -1
  40. package/dist/runtime.d.ts.map +1 -1
  41. package/dist/runtime.js +13 -9
  42. package/dist/serialization.d.ts.map +1 -1
  43. package/dist/serialization.js +47 -9
  44. package/dist/version.d.ts +1 -1
  45. package/dist/version.js +2 -2
  46. package/dist/workflow/create-hook.d.ts.map +1 -1
  47. package/dist/workflow/create-hook.js +4 -3
  48. package/dist/workflow/world-init-stub.d.ts +2 -2
  49. package/dist/workflow/world-init-stub.js +3 -3
  50. package/dist/workflow.d.ts.map +1 -1
  51. package/dist/workflow.js +6 -9
  52. package/package.json +11 -6
@@ -1,5 +1,5 @@
1
1
  import { EntityConflictError, FatalError, RetryableError, RunExpiredError, StepNotRegisteredError, ThrottleError, TooEarlyError, WorkflowRuntimeError, WorkflowWorldError, } from '@workflow/errors';
2
- import { formatStepName, pluralize, stepDisplayName } from '@workflow/utils';
2
+ import { createWorkflowBaseUrl, formatStepName, pluralize, stepDisplayName, } from '@workflow/utils';
3
3
  import { getPort } from '@workflow/utils/get-port';
4
4
  import { getQueueTopicPrefix, resolveQueueNamespace, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_COMPRESSION, StepInvokePayloadSchema, } from '@workflow/world';
5
5
  import { describeError } from '../describe-error.js';
@@ -10,7 +10,7 @@ import { contextStorage } from '../step/context-storage.js';
10
10
  import * as Attribute from '../telemetry/semantic-conventions.js';
11
11
  import { buildInvocationSpanLinks, getNextTraceCarrier, getSpanKind, getWorkflowTraceMode, isUsableTraceCarrier, trace, withTraceContext, } from '../telemetry.js';
12
12
  import { getErrorName, getErrorStack, normalizeUnknownError, promoteAbortErrorToFatal, } from '../types.js';
13
- import { MAX_QUEUE_DELIVERIES } from './constants.js';
13
+ import { getMaxQueueDeliveries } from './constants.js';
14
14
  import { getQueueOverhead, getWorkflowQueueName, handleHealthCheckMessage, memoizeEncryptionKey, parseHealthCheckPayload, queueMessage, withHealthCheck, } from './helpers.js';
15
15
  import { safeWaitUntil } from './wait-until.js';
16
16
  import { getWorld, getWorldHandlers } from './world.js';
@@ -57,14 +57,15 @@ function createStepHandler(namespace) {
57
57
  // every log line below so callers don't repeat it.
58
58
  const stepNameFromQueue = metadata.queueName.slice(stepPrefix.length);
59
59
  const stepRuntimeLogger = runtimeLogger.forRun(workflowRunId, workflowName, { stepId, stepName: stepNameFromQueue });
60
- if (metadata.attempt > MAX_QUEUE_DELIVERIES) {
61
- stepRuntimeLogger.error(`Step handler exceeded max deliveries (${metadata.attempt}/${MAX_QUEUE_DELIVERIES})`, {
60
+ const maxQueueDeliveries = getMaxQueueDeliveries();
61
+ if (metadata.attempt > maxQueueDeliveries) {
62
+ stepRuntimeLogger.error(`Step handler exceeded max deliveries (${metadata.attempt}/${maxQueueDeliveries})`, {
62
63
  attempt: metadata.attempt,
63
64
  });
64
65
  try {
65
66
  const world = await getWorld();
66
67
  const getEncryptionKey = memoizeEncryptionKey(world, workflowRunId);
67
- const err = new FatalError(`Step exceeded maximum queue deliveries (${metadata.attempt}/${MAX_QUEUE_DELIVERIES})`);
68
+ const err = new FatalError(`Step exceeded maximum queue deliveries (${metadata.attempt}/${maxQueueDeliveries})`);
68
69
  await world.events.create(workflowRunId, {
69
70
  eventType: 'step_failed',
70
71
  specVersion: SPEC_VERSION_CURRENT,
@@ -127,6 +128,11 @@ function createStepHandler(namespace) {
127
128
  isVercel ? undefined : getPort(),
128
129
  getSpanKind('CONSUMER'),
129
130
  ]);
131
+ // TODO: resolve the workflow base URL through the World interface.
132
+ // This fallback cannot see local/Postgres baseUrl overrides or custom-world routing.
133
+ const workflowBaseUrl = createWorkflowBaseUrl(isVercel
134
+ ? `https://${process.env.VERCEL_URL}`
135
+ : `http://localhost:${port ?? 3000}`);
130
136
  return trace(`step.execute ${stepDisplayName(stepName)}`, { kind: spanKind, links: spanLinks }, async (span) => {
131
137
  span?.setAttributes({
132
138
  ...Attribute.StepName(stepName),
@@ -447,11 +453,7 @@ function createStepHandler(namespace) {
447
453
  workflowName,
448
454
  workflowRunId,
449
455
  workflowStartedAt: new Date(+workflowStartedAt),
450
- // TODO: there should be a getUrl method on the world interface itself. This
451
- // solution only works for vercel + local worlds.
452
- url: isVercel
453
- ? `https://${process.env.VERCEL_URL}`
454
- : `http://localhost:${port ?? 3000}`,
456
+ url: workflowBaseUrl,
455
457
  features: { encryption: !!encryptionKey },
456
458
  },
457
459
  workflowDeploymentId: process.env.VERCEL_DEPLOYMENT_ID,
@@ -834,4 +836,4 @@ export const stepEntrypoint =
834
836
  }
835
837
  return cachedStepHandler(req);
836
838
  });
837
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxlQUFlLEVBQ2Ysc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsaUNBQWlDLEVBRWpDLHVCQUF1QixHQUN4QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixvQkFBb0IsRUFDcEIsZ0JBQWdCLEdBQ2pCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLGdCQUFnQixHQUNqQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pC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QUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO0lBQzVDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZCLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxNQUFNLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIFJldHJ5YWJsZUVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFN0ZXBOb3RSZWdpc3RlcmVkRXJyb3IsXG4gIFRocm90dGxlRXJyb3IsXG4gIFRvb0Vhcmx5RXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgZm9ybWF0U3RlcE5hbWUsIHBsdXJhbGl6ZSwgc3RlcERpc3BsYXlOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IGdldFBvcnQgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvZ2V0LXBvcnQnO1xuaW1wb3J0IHtcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB0eXBlIFN0ZXAsXG4gIFN0ZXBJbnZva2VQYXlsb2FkU2NoZW1hLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZGVzY3JpYmVFcnJvciB9IGZyb20gJy4uL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIsIHN0ZXBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQge1xuICBjYW5jZWxBYm9ydFJlYWRlcnMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbiAgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlLFxuICBoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgaHlkcmF0ZVN0ZXBFcnJvcixcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4uL3N0ZXAvY29udGV4dC1zdG9yYWdlLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzLFxuICBnZXROZXh0VHJhY2VDYXJyaWVyLFxuICBnZXRTcGFuS2luZCxcbiAgZ2V0V29ya2Zsb3dUcmFjZU1vZGUsXG4gIGlzVXNhYmxlVHJhY2VDYXJyaWVyLFxuICB0cmFjZSxcbiAgd2l0aFRyYWNlQ29udGV4dCxcbn0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7XG4gIGdldEVycm9yTmFtZSxcbiAgZ2V0RXJyb3JTdGFjayxcbiAgbm9ybWFsaXplVW5rbm93bkVycm9yLFxuICBwcm9tb3RlQWJvcnRFcnJvclRvRmF0YWwsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHsgTUFYX1FVRVVFX0RFTElWRVJJRVMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBnZXRRdWV1ZU92ZXJoZWFkLFxuICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSxcbiAgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlLFxuICBtZW1vaXplRW5jcnlwdGlvbktleSxcbiAgcGFyc2VIZWFsdGhDaGVja1BheWxvYWQsXG4gIHF1ZXVlTWVzc2FnZSxcbiAgd2l0aEhlYWx0aENoZWNrLFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCB9IGZyb20gJy4vd2FpdC11bnRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCwgZ2V0V29ybGRIYW5kbGVycywgdHlwZSBXb3JsZEhhbmRsZXJzIH0gZnJvbSAnLi93b3JsZC5qcyc7XG5cbmNvbnN0IERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUyA9IDM7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0ZXBIYW5kbGVyKG5hbWVzcGFjZT86IHN0cmluZykge1xuICBjb25zdCByZXNvbHZlZE5hbWVzcGFjZSA9IHJlc29sdmVRdWV1ZU5hbWVzcGFjZShuYW1lc3BhY2UpO1xuICBjb25zdCBzdGVwUHJlZml4ID0gZ2V0UXVldWVUb3BpY1ByZWZpeCgnc3RlcCcsIHJlc29sdmVkTmFtZXNwYWNlKTtcblxuICByZXR1cm4gKHdvcmxkSGFuZGxlcnM6IFdvcmxkSGFuZGxlcnMpID0+XG4gICAgd29ybGRIYW5kbGVycy5jcmVhdGVRdWV1ZUhhbmRsZXIoc3RlcFByZWZpeCwgYXN5bmMgKG1lc3NhZ2VfLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlXG4gICAgICAvLyBOT1RFOiBIZWFsdGggY2hlY2sgbWVzc2FnZXMgYXJlIGludGVudGlvbmFsbHkgdW5hdXRoZW50aWNhdGVkIGZvciBtb25pdG9yaW5nIHB1cnBvc2VzLlxuICAgICAgLy8gVGhleSBvbmx5IHdyaXRlIGEgc2ltcGxlIHN0YXR1cyByZXNwb25zZSB0byBhIHN0cmVhbSBhbmQgZG8gbm90IGV4cG9zZSBzZW5zaXRpdmUgZGF0YS5cbiAgICAgIC8vIFRoZSBzdHJlYW0gbmFtZSBpbmNsdWRlcyBhIHVuaXF1ZSBjb3JyZWxhdGlvbklkIHRoYXQgbXVzdCBiZSBrbm93biBieSB0aGUgY2FsbGVyLlxuICAgICAgY29uc3QgaGVhbHRoQ2hlY2sgPSBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZChtZXNzYWdlXyk7XG4gICAgICBpZiAoaGVhbHRoQ2hlY2spIHtcbiAgICAgICAgYXdhaXQgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKFxuICAgICAgICAgIGhlYWx0aENoZWNrLFxuICAgICAgICAgICdzdGVwJyxcbiAgICAgICAgICB3b3JsZEhhbmRsZXJzLnNwZWNWZXJzaW9uXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge1xuICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICBzdGVwSWQsXG4gICAgICAgIHRyYWNlQ2FycmllcjogaW5jb21pbmdUcmFjZUNhcnJpZXIsXG4gICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgfSA9IFN0ZXBJbnZva2VQYXlsb2FkU2NoZW1hLnBhcnNlKG1lc3NhZ2VfKTtcbiAgICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSBtZXRhZGF0YTtcbiAgICAgIC8vIHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpIHJldHVybnMgYHt9YCB3aGVuIG5vIE9URUwgU0RLIGlzIHJlZ2lzdGVyZWRcbiAgICAgIC8vIG9yIG5vIHNwYW4gaXMgYWN0aXZlIOKAlCB0cmVhdCBhbiBlbXB0eSBjYXJyaWVyIHRoZSBzYW1lIGFzIGFuIGFic2VudFxuICAgICAgLy8gb25lIHNvIGxpbmtlZCBtb2RlIGZhbGxzIGJhY2sgdG8gYSBmcmVzaCBvcmlnaW4gaW5zdGVhZCBvZlxuICAgICAgLy8gZm9yd2FyZGluZyBhIHVzZWxlc3MgYHt9YCBmb3JldmVyLlxuICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdUcmFjZUNhcnJpZXIpXG4gICAgICAgID8gaW5jb21pbmdUcmFjZUNhcnJpZXJcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIC0tLSBUcmFjZSBjb3JyZWxhdGlvbiBtb2RlIC0tLVxuICAgICAgLy8gJ2xpbmtlZCcgKGRlZmF1bHQpOiB0aGUgU1RFUCBzcGFuIGJlbG93IHN0YXJ0cyBhIE5FVyByb290IHRyYWNlIHdpdGhcbiAgICAgIC8vIHNwYW4gbGlua3MgdG8gdGhlIGRlbGl2ZXJ5IGNvbnRleHQgYW5kIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgZnJvbVxuICAgICAgLy8gdGhlIG1lc3NhZ2UncyB0cmFjZSBjYXJyaWVyLiAnY29udGludW91cyc6IGxlZ2FjeSBiZWhhdmlvciDigJQgdGhlXG4gICAgICAvLyByZXN0b3JlZCBydW4tb3JpZ2luIGNvbnRleHQgcGFyZW50cyB0aGlzIGludm9jYXRpb24ncyBzcGFucy5cbiAgICAgIGNvbnN0IHRyYWNlTW9kZSA9IGdldFdvcmtmbG93VHJhY2VNb2RlKCk7XG5cbiAgICAgIC8vIFRyYWNlIGNhcnJpZXIgdG8gYXR0YWNoIHRvIG1lc3NhZ2VzIHRoaXMgaW52b2NhdGlvbiBlbnF1ZXVlcyDigJQgc2VlXG4gICAgICAvLyBnZXROZXh0VHJhY2VDYXJyaWVyIGZvciB0aGUgbGlua2VkL2NvbnRpbnVvdXMgc2VtYW50aWNzLlxuICAgICAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9ICgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+XG4gICAgICAgIGdldE5leHRUcmFjZUNhcnJpZXIodHJhY2VNb2RlLCB0cmFjZUNvbnRleHQpO1xuXG4gICAgICAvLyAtLS0gTWF4IGRlbGl2ZXJ5IGNoZWNrIC0tLVxuICAgICAgLy8gRW5mb3JjZSBtYXggZGVsaXZlcnkgbGltaXQgYmVmb3JlIGFueSBpbmZyYXN0cnVjdHVyZSBjYWxscy5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgcnVuYXdheSBzdGVwcyBmcm9tIGNvbnN1bWluZyBpbmZpbml0ZSBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Ugd2FudCB0byBkbyB0aGUgbWluaW1hbCBhbW91bnQgb2Ygd29yayAobm8gZmV0Y2hpbmdcbiAgICAgIC8vIG9mIHRoZSBzdGVwIGRldGFpbHMsIGV0Yy4gV2Ugc2ltcGx5IGF0dGVtcHQgdG8gbWFyayB0aGUgc3RlcCBhcyBmYWlsZWRcbiAgICAgIC8vIGFuZCBlbnF1ZXVlIHRoZSB3b3JrZmxvdyBvbmNlLCBhbmQgaWYgZWl0aGVyIG9mIHRob3NlIGZhaWxzLCB0aGUgbWVzc2FnZVxuICAgICAgLy8gaXMgc3RpbGwgY29uc3VtZWQgYnV0IHdpdGggYWRlcXVhdGUgbG9nZ2luZyB0aGF0IGFuIGVycm9yIG9jY3VycmVkLlxuICAgICAgLy8gU2NvcGVkIGxvZ2dlciBmb3IgdGhpcyBzdGVwIGludm9jYXRpb24g4oCUIGF0dGFjaGVzIHJ1bi9zdGVwIGNvbnRleHQgdG9cbiAgICAgIC8vIGV2ZXJ5IGxvZyBsaW5lIGJlbG93IHNvIGNhbGxlcnMgZG9uJ3QgcmVwZWF0IGl0LlxuICAgICAgY29uc3Qgc3RlcE5hbWVGcm9tUXVldWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2Uoc3RlcFByZWZpeC5sZW5ndGgpO1xuICAgICAgY29uc3Qgc3RlcFJ1bnRpbWVMb2dnZXIgPSBydW50aW1lTG9nZ2VyLmZvclJ1bihcbiAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICB7IHN0ZXBJZCwgc3RlcE5hbWU6IHN0ZXBOYW1lRnJvbVF1ZXVlIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gTUFYX1FVRVVFX0RFTElWRVJJRVMpIHtcbiAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYFN0ZXAgaGFuZGxlciBleGNlZWRlZCBtYXggZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke01BWF9RVUVVRV9ERUxJVkVSSUVTfSlgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHdvcmtmbG93UnVuSWQpO1xuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgYFN0ZXAgZXhjZWVkZWQgbWF4aW11bSBxdWV1ZSBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7TUFYX1FVRVVFX0RFTElWRVJJRVN9KWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcE5hbWVGcm9tUXVldWUsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFJlLXF1ZXVlIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIGZhaWxlZCBzdGVwXG4gICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENhbid0IGV2ZW4gbWFyayB0aGUgc3RlcCBhcyBmYWlsZWQuIENvbnN1bWUgdGhlIG1lc3NhZ2UgdG8gc3RvcFxuICAgICAgICAgIC8vIGZ1cnRoZXIgcmV0cmllcy4gVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZS5cbiAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gbWFyayBzdGVwIGFzIGZhaWxlZCBhZnRlciAke21ldGFkYXRhLmF0dGVtcHR9IGRlbGl2ZXJ5IGF0dGVtcHRzLiBgICtcbiAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBzdGVwIGZyb20gYmVpbmcgdGVybWluYXRlZC4gYCArXG4gICAgICAgICAgICAgIGBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGlsIG1hbnVhbGx5IHJlc29sdmVkLiBgICtcbiAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgIGBvciBhIGJ1ZyBpbiB0aGUgd29ya2Zsb3cgcnVudGltZSBhbmQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBXb3JrZmxvdyB0ZWFtLmAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgIGVycm9yTmFtZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubmFtZSA6ICdVbmtub3duRXJyb3InLFxuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEluIGxpbmtlZCBtb2RlIHRoZSBvbmx5IHNwYW4gbGluayBpcyB0byB0aGUgcnVuLW9yaWdpbiBjb250ZXh0OyB0aGVcbiAgICAgIC8vIHN0ZXAuZXhlY3V0ZSBzcGFuIHN0YXlzIGEgY2hpbGQgb2YgdGhlIGxvY2FsIGRlbGl2ZXJ5IChmbG93LXJvdXRlKVxuICAgICAgLy8gY29udGV4dC4gSW4gY29udGludW91cyBtb2RlIHRoZSBsaW5rIHBvaW50cyBhdCB0aGUgZGVsaXZlcnkgY29udGV4dC5cbiAgICAgIGNvbnN0IHNwYW5MaW5rcyA9IGF3YWl0IGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyh0cmFjZU1vZGUsIHRyYWNlQ29udGV4dCk7XG5cbiAgICAgIC8vIEV4ZWN1dGUgc3RlcCB3aXRoaW4gdGhlIHByb3BhZ2F0ZWQgdHJhY2UgY29udGV4dCAoY29udGludW91cyBtb2RlXG4gICAgICAvLyBvbmx5IOKAlCBpbiBsaW5rZWQgbW9kZSB0aGUgcnVuLW9yaWdpbiBpcyBOT1QgcmVzdG9yZWQgYXMgdGhlIHBhcmVudCxcbiAgICAgIC8vIHNvIHdpdGhUcmFjZUNvbnRleHQgaXMgYSBwYXNzdGhyb3VnaCBhbmQgdGhlIHN0ZXAuZXhlY3V0ZSBzcGFuIHN0YXlzXG4gICAgICAvLyBhIGNoaWxkIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSBjb250ZXh0LCBsaW5rZWQgdG8gdGhlIHJ1biBvcmlnaW4pLlxuICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgdHJhY2VNb2RlID09PSAnY29udGludW91cycgPyB0cmFjZUNvbnRleHQgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYXdhaXQgd2l0aFRyYWNlQ29udGV4dChwYXJlbnRUcmFjZUNhcnJpZXIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgc3RlcCBuYW1lIGZyb20gdGhlIHRvcGljIG5hbWVcbiAgICAgICAgY29uc3Qgc3RlcE5hbWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2Uoc3RlcFByZWZpeC5sZW5ndGgpO1xuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgICAgIGNvbnN0IGlzVmVyY2VsID0gcHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIE1lbW9pemVkIGFjY2Vzc29yIGZvciB0aGUgcGVyLXJ1biBBRVMtMjU2IGVuY3J5cHRpb24ga2V5LiBUaGUgZmlyc3RcbiAgICAgICAgLy8gY2FsbGVyICh0eXBpY2FsbHkgYGh5ZHJhdGVTdGVwQXJndW1lbnRzYCBmb3IgaW5wdXQgZGVzZXJpYWxpemF0aW9uLFxuICAgICAgICAvLyBvciBvbmUgb2YgdGhlIGVhcmx5LXJldHVybiBkZWh5ZHJhdGVTdGVwRXJyb3IgcGF0aHMgaWYgc3RlcF9zdGFydGVkXG4gICAgICAgIC8vIGZhaWxzKSB0cmlnZ2VycyB0aGUgYWN0dWFsIGZldGNoIC8gSEtERiBkZXJpdmF0aW9uOyBzdWJzZXF1ZW50XG4gICAgICAgIC8vIGNhbGxlcnMgYXdhaXQgdGhlIGNhY2hlZCBwcm9taXNlLiBTdGVwcyB0aGF0IGZhaWwgYmVmb3JlIGFueVxuICAgICAgICAvLyBlbmNyeXB0aW9uLWF3YXJlIHdvcmsgaGFwcGVucyAoZS5nLiBhbiBpbW1lZGlhdGUgc3RlcF9zdGFydGVkXG4gICAgICAgIC8vIGNvbmZsaWN0KSBza2lwIHRoZSBmZXRjaCBlbnRpcmVseS5cbiAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1bklkKTtcblxuICAgICAgICAvLyBSZXNvbHZlIGxvY2FsIGFzeW5jIHZhbHVlcyBjb25jdXJyZW50bHkgYmVmb3JlIGVudGVyaW5nIHRoZSB0cmFjZSBzcGFuXG4gICAgICAgIGNvbnN0IFtwb3J0LCBzcGFuS2luZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgaXNWZXJjZWwgPyB1bmRlZmluZWQgOiBnZXRQb3J0KCksXG4gICAgICAgICAgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHJldHVybiB0cmFjZShcbiAgICAgICAgICBgc3RlcC5leGVjdXRlICR7c3RlcERpc3BsYXlOYW1lKHN0ZXBOYW1lKX1gLFxuICAgICAgICAgIHsga2luZDogc3BhbktpbmQsIGxpbmtzOiBzcGFuTGlua3MgfSxcbiAgICAgICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTmFtZShzdGVwTmFtZSksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXR0ZW1wdChtZXRhZGF0YS5hdHRlbXB0KSxcbiAgICAgICAgICAgICAgLy8gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUobWV0YWRhdGEucXVldWVOYW1lKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ01lc3NhZ2VJZChtZXRhZGF0YS5tZXNzYWdlSWQpLFxuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHJvY2VzcycpLFxuICAgICAgICAgICAgICAuLi5nZXRRdWV1ZU92ZXJoZWFkKHsgcmVxdWVzdGVkQXQgfSksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gTm90ZTogU3RlcCBmdW5jdGlvbiB2YWxpZGF0aW9uIGhhcHBlbnMgYWZ0ZXIgc3RlcF9zdGFydGVkIHNvIHdlIGNhblxuICAgICAgICAgICAgLy8gcHJvcGVybHkgZmFpbCB0aGUgc3RlcCAobm90IHRoZSBydW4pIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgcmVnaXN0ZXJlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIHN0ZXAgZmFpbHVyZSBncmFjZWZ1bGx5LlxuICAgICAgICAgICAgY29uc3Qgc3RlcEZuID0gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBOYW1lKTtcblxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQod29ya2Zsb3dSdW5JZCksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwSWQoc3RlcElkKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgdmFsaWRhdGVzIHN0YXRlIGFuZCByZXR1cm5zIHRoZSBzdGVwIGVudGl0eSwgc28gbm8gc2VwYXJhdGVcbiAgICAgICAgICAgIC8vIHdvcmxkLnN0ZXBzLmdldCgpIGNhbGwgaXMgbmVlZGVkLiBUaGUgc2VydmVyIGNoZWNrczpcbiAgICAgICAgICAgIC8vIC0gU3RlcCBub3QgaW4gdGVybWluYWwgc3RhdGUgKHJldHVybnMgNDA5KVxuICAgICAgICAgICAgLy8gLSByZXRyeUFmdGVyIHRpbWVzdGFtcCByZWFjaGVkIChyZXR1cm5zIDQyNSB3aXRoIFJldHJ5LUFmdGVyIGhlYWRlcilcbiAgICAgICAgICAgIC8vIC0gV29ya2Zsb3cgc3RpbGwgYWN0aXZlIChyZXR1cm5zIDQxMCBpZiBjb21wbGV0ZWQpXG4gICAgICAgICAgICBsZXQgc3RlcCE6IFN0ZXA7XG4gICAgICAgICAgICAvLyBHYXRlIHBheWxvYWQgY29tcHJlc3Npb24gb24gdGhlIHN0ZXAgZW50aXR5J3Mgc3BlY1ZlcnNpb25cbiAgICAgICAgICAgIC8vIChzdGFtcGVkIGJ5IHRoZSBzYW1lLWRlcGxveW1lbnQgb3JjaGVzdHJhdG9yIHRoYXQgY3JlYXRlZCB0aGVcbiAgICAgICAgICAgIC8vIHN0ZXAsIHNvIHNwZWMgPj0gNSBpbXBsaWVzIGV2ZXJ5IHJlYWRlciBvZiB0aGlzIHJ1bidzIHBheWxvYWRzXG4gICAgICAgICAgICAvLyB1bmRlcnN0YW5kcyB0aGUgJ2d6aXAnIGZvcm1hdCkuIFJldHVybnMgZmFsc2Ugb24gdGhlIGVhcmx5XG4gICAgICAgICAgICAvLyBmYWlsdXJlIHBhdGhzIHdoZXJlIHN0ZXBfc3RhcnRlZCBkaWRuJ3QgcmV0dXJuIGFuIGVudGl0eS5cbiAgICAgICAgICAgIGNvbnN0IGNvbXByZXNzaW9uRm9yU3RlcCA9ICgpID0+XG4gICAgICAgICAgICAgICgoc3RlcCBhcyBTdGVwIHwgdW5kZWZpbmVkKT8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhcnRSZXN1bHQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9zdGFydGVkJyxcbiAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YTogeyBzdGVwTmFtZSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICghc3RhcnRSZXN1bHQuc3RlcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBzdGVwX3N0YXJ0ZWQgZXZlbnQgZm9yIFwiJHtzdGVwSWR9XCIgZGlkIG5vdCByZXR1cm4gc3RlcCBlbnRpdHlgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdGVwID0gc3RhcnRSZXN1bHQuc3RlcDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBpZiAoVGhyb3R0bGVFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0cnlSZXRyeUFmdGVyID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgdHlwZW9mIGVyci5yZXRyeUFmdGVyID09PSAnbnVtYmVyJyA/IGVyci5yZXRyeUFmdGVyIDogMVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICdUaHJvdHRsZWQgYWdhaW4gb24gcmV0cnksIGRlZmVycmluZyB0byBxdWV1ZScsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXJTZWNvbmRzOiByZXRyeVJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogcmV0cnlSZXRyeUFmdGVyIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgd2hlbiBhIHJ1biBpcyBjYW5jZWxsZWQgd2hpbGUgYSBzdGVwIGlzIGluLWZsaWdodC5cbiAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJ1biBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgeyBlcnJvck5hbWU6IGVyci5uYW1lLCBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIGEgdGVybWluYWwgc3RhdGUg4oCUIGFub3RoZXIgd29ya2VyIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgLy8gaXQgb3IgaXQgd2FzIHJldHJpZWQgdG8gY29tcGxldGlvbi4gUmUtZW5xdWV1ZSB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgc28gaXQgY2FuIG9ic2VydmUgdGhlIG91dGNvbWUuXG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAnU3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSwgcmUtZW5xdWV1aW5nIHdvcmtmbG93JyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwcGVkKHRydWUpLFxuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwUmVhc29uKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudD8uKCdzdGVwLnNraXBwZWQnLCB7XG4gICAgICAgICAgICAgICAgICAnc2tpcC5yZWFzb24nOiAndGVybWluYWxfc3RhdGUnLFxuICAgICAgICAgICAgICAgICAgJ3N0ZXAubmFtZSc6IHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgJ3N0ZXAuaWQnOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFRvbyBlYXJseTogcmV0cnlBZnRlciB0aW1lc3RhbXAgbm90IHJlYWNoZWQgeWV0XG4gICAgICAgICAgICAgIC8vIFJldHVybiB0aW1lb3V0IHRvIHF1ZXVlIHNvIGl0IHJldHJpZXMgbGF0ZXJcbiAgICAgICAgICAgICAgaWYgKFRvb0Vhcmx5RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoMSwgZXJyLnJldHJ5QWZ0ZXIgPz8gMSk7XG4gICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5VGltZW91dFNlY29uZHModGltZW91dFNlY29uZHMpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBzcGFuIGV2ZW50IGZvciBkZWxheWVkIHJldHJ5XG4gICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQ/Lignc3RlcC5kZWxheWVkJywge1xuICAgICAgICAgICAgICAgICAgJ2RlbGF5LnJlYXNvbic6ICdyZXRyeV9hZnRlcl9ub3RfcmVhY2hlZCcsXG4gICAgICAgICAgICAgICAgICAnZGVsYXkudGltZW91dF9zZWNvbmRzJzogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAnU3RlcCByZXRyeUFmdGVyIHRpbWVzdGFtcCBub3QgeWV0IHJlYWNoZWQnLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXRyeUFmdGVyU2Vjb25kczogZXJyLnJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBSZS10aHJvdyBvdGhlciBlcnJvcnNcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5kZWJ1ZygnU3RlcCBleGVjdXRpb24gZGV0YWlscycsIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBzdGVwLnN0YXR1cyxcbiAgICAgICAgICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cyhzdGVwLnN0YXR1cyksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgc3RlcCBmdW5jdGlvbiBleGlzdHMgQUZURVIgc3RlcF9zdGFydGVkIHNvIHdlIGNhblxuICAgICAgICAgICAgLy8gcHJvcGVybHkgZmFpbCB0aGUgc3RlcCAobm90IHRoZSBydW4pIGlmIHRoZSBmdW5jdGlvbiBpcyBtaXNzaW5nLlxuICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgc3RlcCBmYWlsdXJlIGdyYWNlZnVsbHksXG4gICAgICAgICAgICAvLyBzaW1pbGFyIHRvIGhvdyBGYXRhbEVycm9yIGlzIGhhbmRsZWQuXG4gICAgICAgICAgICBpZiAoIXN0ZXBGbiB8fCB0eXBlb2Ygc3RlcEZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBTdGVwTm90UmVnaXN0ZXJlZEVycm9yKHN0ZXBOYW1lKTtcblxuICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAnU3RlcCBmdW5jdGlvbiBub3QgcmVnaXN0ZXJlZCwgZmFpbGluZyBzdGVwIChub3QgcnVuKScsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIuc3RhY2ssXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBGYXRhbEVycm9yIHBhdHRlcm4gLSBmYWlsIHRoZSBzdGVwIGFuZCByZS1xdWV1ZSB3b3JrZmxvd1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSB0cmFuc2l0aW9uZWQgdG8gYSB0ZXJtaW5hbCBzdGF0ZSDigJQgZHVwbGljYXRlXG4gICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvciBjb25jdXJyZW50IGNhbmNlbGxhdGlvbi4gRHJvcCBzaWxlbnRseS5cbiAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAgZm9yIG1pc3NpbmcgZnVuY3Rpb24sIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN0ZXBGYWlsRXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdGVwRmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEZhdGFsRXJyb3IodHJ1ZSksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgd29ya2Zsb3cgdG8gaGFuZGxlIHRoZSBmYWlsZWQgc3RlcFxuICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCByZXNvbHZlZE5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtYXhSZXRyaWVzID0gc3RlcEZuLm1heFJldHJpZXMgPz8gREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTO1xuXG4gICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBNYXhSZXRyaWVzKG1heFJldHJpZXMpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCByZXN1bHQ6IHVua25vd247XG5cbiAgICAgICAgICAgIC8vIENoZWNrIG1heCByZXRyaWVzIEFGVEVSIHN0ZXBfc3RhcnRlZCAoYXR0ZW1wdCB3YXMganVzdCBpbmNyZW1lbnRlZClcbiAgICAgICAgICAgIC8vIHN0ZXAuYXR0ZW1wdCB0cmFja3MgaG93IG1hbnkgdGltZXMgc3RlcF9zdGFydGVkIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIC8vIE5vdGU6IG1heFJldHJpZXMgaXMgdGhlIG51bWJlciBvZiBSRVRSSUVTIGFmdGVyIHRoZSBmaXJzdCBhdHRlbXB0LCBzbyB0b3RhbCBhdHRlbXB0cyA9IG1heFJldHJpZXMgKyAxXG4gICAgICAgICAgICAvLyBVc2UgPiBoZXJlIChub3QgPj0pIGJlY2F1c2UgdGhpcyBndWFyZHMgYWdhaW5zdCByZS1pbnZvY2F0aW9uIEFGVEVSIGFsbCBhdHRlbXB0cyBhcmUgdXNlZC5cbiAgICAgICAgICAgIC8vIFRoZSBwb3N0LWZhaWx1cmUgY2hlY2sgdXNlcyA+PSB0byBkZWNpZGUgd2hldGhlciB0byByZXRyeSBhZnRlciBhIGZhaWx1cmUuXG4gICAgICAgICAgICBpZiAoc3RlcC5hdHRlbXB0ID4gbWF4UmV0cmllcyArIDEpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICAgICAgICAgIC8vIFBlcnNpc3RlZCBtZXNzYWdlIOKAlCBrZXB0IHNob3J0LCBubyBtYWNoaW5lIGBzdGVwTmFtZWAsXG4gICAgICAgICAgICAgIC8vIHNpbmNlIG9ic2VydmFiaWxpdHkgYWxyZWFkeSBhdHRyaWJ1dGVzIHRoZSBldmVudCB0byBhXG4gICAgICAgICAgICAgIC8vIHNwZWNpZmljIHN0ZXAuXG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIGV4Y2VlZGVkIG1heCByZXRyaWVzICgke3JldHJ5Q291bnR9ICR7cGx1cmFsaXplKCdyZXRyeScsICdyZXRyaWVzJywgcmV0cnlDb3VudCl9KWA7XG4gICAgICAgICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgYFN0ZXAgJHtmb3JtYXRTdGVwTmFtZShzdGVwTmFtZSl9IGV4Y2VlZGVkIG1heCByZXRyaWVzICgke3JldHJ5Q291bnR9ICR7cGx1cmFsaXplKCdyZXRyeScsICdyZXRyaWVzJywgcmV0cnlDb3VudCl9KWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSkuXG4gICAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBwcmlvciBhdHRlbXB0J3Mgc2VyaWFsaXplZCBlcnJvciBhcyB0aGUgY2F1c2Ugc29cbiAgICAgICAgICAgICAgLy8gdGhlIHVuZGVybHlpbmcgZmFpbHVyZSBpcyByZWNvdmVyYWJsZSBmcm9tIGBzdGVwLmVycm9yLmNhdXNlYFxuICAgICAgICAgICAgICAvLyBhZnRlciBoeWRyYXRpb24sIHdpdGhvdXQgZm9yY2luZyBjb25zdW1lcnMgdG8gd2FsayB0aGVcbiAgICAgICAgICAgICAgLy8gc3RlcF9yZXRyeWluZyBldmVudCBoaXN0b3J5LiBNaXJyb3JzIHRoZSBwb3N0LWZhaWx1cmUgcGF0aFxuICAgICAgICAgICAgICAvLyBiZWxvdyB0aGF0IHdyYXBzIHRoZSBsaXZlIGBlcnJgIGFzIGNhdXNlLlxuICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICBpZiAoc3RlcC5lcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICh3cmFwcGVkRXJyb3IgYXMgRXJyb3IpLmNhdXNlID0gYXdhaXQgaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5lcnJvcixcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLy8gSWdub3JlOiBiZXN0LWVmZm9ydCBjYXVzZSBhdHRhY2htZW50LCB0aGUgd3JhcHBpbmdcbiAgICAgICAgICAgICAgICAgIC8vIEZhdGFsRXJyb3Igc3RhY2svbWVzc2FnZSBzdGlsbCBzdXJmYWNlIHRoZSBmYWlsdXJlLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHRyYW5zaXRpb25lZCB0byBhIHRlcm1pbmFsIHN0YXRlIOKAlCBkdXBsaWNhdGVcbiAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9yIGNvbmN1cnJlbnQgY29tcGxldGlvbi4gRHJvcCBzaWxlbnRseS5cbiAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5RXhoYXVzdGVkKHRydWUpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgZmFpbGVkIHN0ZXBcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgcmVzb2x2ZWROYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHN0ZXAgaW5wdXQgLS0tXG4gICAgICAgICAgICAvLyBOZXR3b3JrL3NlcnZlciBlcnJvcnMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZXRyeS5cbiAgICAgICAgICAgIC8vIFdvcmtmbG93UnVudGltZUVycm9yIChkYXRhIGludGVncml0eSBpc3N1ZXMpIGFyZSBmYXRhbCDigJQgcmV0cnlpbmdcbiAgICAgICAgICAgIC8vIHdvbid0IGZpeCB0aGVtLCBzbyB3ZSByZS1xdWV1ZSB0aGUgd29ya2Zsb3cgdG8gc3VyZmFjZSB0aGUgZXJyb3IuXG4gICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHN0ZXAgaXMgaW4gdmFsaWQgc3RhdGUgKHBlbmRpbmcvcnVubmluZylcbiAgICAgICAgICAgIC8vIGFuZCByZXR1cm5lZCB0aGUgdXBkYXRlZCBzdGVwIGVudGl0eSB3aXRoIGluY3JlbWVudGVkIGF0dGVtcHRcblxuICAgICAgICAgICAgLy8gc3RlcC5hdHRlbXB0IGlzIG5vdyB0aGUgY3VycmVudCBhdHRlbXB0IG51bWJlciAoYWZ0ZXIgaW5jcmVtZW50KVxuICAgICAgICAgICAgY29uc3QgYXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgICAgICAgaWYgKCFzdGVwLnN0YXJ0ZWRBdCkge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcElkfVwiIGhhcyBubyBcInN0YXJ0ZWRBdFwiIHRpbWVzdGFtcGA7XG4gICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmVycm9yKCdGYXRhbCBydW50aW1lIGVycm9yIGR1cmluZyBzdGVwIHNldHVwJywge1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gUmUtcXVldWUgdGhlIHdvcmtmbG93IHNvIGl0IGNhbiBwcm9jZXNzIHRoZSBzdGVwIGZhaWx1cmVcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgcmVzb2x2ZWROYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENhcHR1cmUgc3RhcnRlZEF0IGZvciB1c2UgaW4gYXN5bmMgY2FsbGJhY2sgKFR5cGVTY3JpcHQgbmFycm93aW5nIGRvZXNuJ3QgcGVyc2lzdClcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBTdGFydGVkQXQgPSBzdGVwLnN0YXJ0ZWRBdDtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgbm93IHRoYXQgd2UncmUgY29tbWl0dGVkIHRvIHJ1bm5pbmdcbiAgICAgICAgICAgIC8vIHVzZXIgY29kZTogaW5wdXQgaHlkcmF0aW9uIG5lZWRzIGl0LCBhbmQgYGNvbnRleHRTdG9yYWdlYCAoYW5kXG4gICAgICAgICAgICAvLyBhbnkgdXNlci1jb2RlIHBhdGhzIHRoYXQgcnVuIGluc2lkZSBpdCkgY2FwdHVyZSB0aGUgcmVzb2x2ZWRcbiAgICAgICAgICAgIC8vIHZhbHVlLiBUcmlnZ2VycyB0aGUgdW5kZXJseWluZyB3b3JsZCAvIEtNUyBmZXRjaCBvbmNlLCB3aXRoXG4gICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGRlaHlkcmF0ZSBwYXRocyByZXVzaW5nIHRoZSBtZW1vaXplZCByZXN1bHQuXG4gICAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gICAgICAgICAgICAvLyBIeWRyYXRlIHRoZSBzdGVwIGlucHV0IGFyZ3VtZW50cywgY2xvc3VyZSB2YXJpYWJsZXMsIGFuZCB0aGlzVmFsXG4gICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGNhcHR1cmVzIG9ubHkgdGhlIHN5bmNocm9ub3VzIHBvcnRpb24gb2YgaHlkcmF0aW9uLiBBbnkgYXN5bmNcbiAgICAgICAgICAgIC8vIG9wZXJhdGlvbnMgKGUuZy4sIHN0cmVhbSBsb2FkaW5nKSBhcmUgYWRkZWQgdG8gYG9wc2AgYW5kIGV4ZWN1dGVkIGxhdGVyXG4gICAgICAgICAgICAvLyB2aWEgUHJvbWlzZS5hbGwob3BzKSAtIHRoZWlyIHRpbWluZyBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBtZWFzdXJlbWVudC5cbiAgICAgICAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICAgICAgICAvLyBPcHMgdGhhdCBtdXN0IGJlIGR1cmFibHkgY29tbWl0dGVkIGJlZm9yZSBzdGVwIGNvbXBsZXRpb24gKGUuZy4gYVxuICAgICAgICAgICAgLy8gc3RlcC1pbml0aWF0ZWQgYWJvcnQncyBob29rX3JlY2VpdmVkIGV2ZW50KS4gU2VlIFN0ZXBDb250ZXh0LlxuICAgICAgICAgICAgY29uc3QgcHJlQ29tcGxldGlvbk9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICAgICAgICBjb25zdCBoeWRyYXRlZElucHV0ID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICdzdGVwLmh5ZHJhdGUnLFxuICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgYXN5bmMgKGh5ZHJhdGVTcGFuKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgICAgIHN0ZXAuaW5wdXQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lEXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICBoeWRyYXRlU3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEFyZ3VtZW50c0NvdW50KHJlc3VsdC5hcmdzLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVEZXNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gaHlkcmF0ZWRJbnB1dC5hcmdzO1xuICAgICAgICAgICAgY29uc3QgdGhpc1ZhbCA9IGh5ZHJhdGVkSW5wdXQudGhpc1ZhbCA/PyBudWxsO1xuXG4gICAgICAgICAgICAvLyAtLS0gVXNlciBjb2RlIGV4ZWN1dGlvbiAtLS1cbiAgICAgICAgICAgIC8vIE9ubHkgZXJyb3JzIGZyb20gc3RlcEZuLmFwcGx5KCkgKHVzZXIgc3RlcCBjb2RlKSBzaG91bGQgcHJvZHVjZVxuICAgICAgICAgICAgLy8gc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZy4gSW5mcmFzdHJ1Y3R1cmUgZXJyb3JzIChuZXR3b3JrLCBzZXJ2ZXIpXG4gICAgICAgICAgICAvLyBtdXN0IHByb3BhZ2F0ZSB0byB0aGUgcXVldWUgaGFuZGxlciBmb3IgYXV0b21hdGljIHJldHJ5LlxuICAgICAgICAgICAgbGV0IHVzZXJDb2RlRXJyb3I6IHVua25vd247XG4gICAgICAgICAgICBsZXQgdXNlckNvZGVGYWlsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYWNlKCdzdGVwLmV4ZWN1dGUnLCB7fSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0U3RvcmFnZS5ydW4oXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwU3RhcnRlZEF0OiBuZXcgRGF0ZSgrc3RlcFN0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiBuZXcgRGF0ZSgrd29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoZXJlIHNob3VsZCBiZSBhIGdldFVybCBtZXRob2Qgb24gdGhlIHdvcmxkIGludGVyZmFjZSBpdHNlbGYuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzb2x1dGlvbiBvbmx5IHdvcmtzIGZvciB2ZXJjZWwgKyBsb2NhbCB3b3JsZHMuXG4gICAgICAgICAgICAgICAgICAgICAgdXJsOiBpc1ZlcmNlbFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgaHR0cHM6Ly8ke3Byb2Nlc3MuZW52LlZFUkNFTF9VUkx9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnQgPz8gMzAwMH1gLFxuICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogcHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQsXG4gICAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgICAgcHJlQ29tcGxldGlvbk9wcyxcbiAgICAgICAgICAgICAgICAgICAgY2xvc3VyZVZhcnM6IGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgKCkgPT4gc3RlcEZuLmFwcGx5KHRoaXNWYWwsIGFyZ3MpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgdXNlckNvZGVFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgdXNlckNvZGVGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uVGltZU1zID0gRGF0ZS5ub3coKSAtIGV4ZWN1dGlvblN0YXJ0VGltZTtcblxuICAgICAgICAgICAgY2FuY2VsQWJvcnRSZWFkZXJzKC4uLmFyZ3MsIHRoaXNWYWwsIGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMpO1xuXG4gICAgICAgICAgICAvLyBDb21taXQgbXVzdC1iZS1kdXJhYmxlIG9wcyAoZS5nLiBhIHN0ZXAtaW5pdGlhdGVkIGFib3J0J3NcbiAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgZXZlbnQpIGJlZm9yZSB3cml0aW5nIHN0ZXBfY29tcGxldGVkL3N0ZXBfZmFpbGVkLFxuICAgICAgICAgICAgLy8gc28gYW55IHdvcmtmbG93IGNvbnRpbnVhdGlvbiB0cmlnZ2VyZWQgYnkgdGhhdCBldmVudCBvYnNlcnZlcyB0aGVcbiAgICAgICAgICAgIC8vIGFib3J0IHJhdGhlciB0aGFuIHJhY2luZyBpdC4gUHJvZHVjZXJzIHN3YWxsb3cgdGhlaXIgb3duIGVycm9yc1xuICAgICAgICAgICAgLy8gcGVyIHRoZSBuby1yZWplY3QgY29udHJhY3Qgb24gU3RlcENvbnRleHQucHJlQ29tcGxldGlvbk9wczsgdGhlXG4gICAgICAgICAgICAvLyBgLmNhdGNoKClgIGRlZmVuZHMgaXQsIHNpbmNlIHRoaXMgYXdhaXQgc2l0cyBvdXRzaWRlIHRoZVxuICAgICAgICAgICAgLy8gdXNlci1jb2RlIHRyeS9jYXRjaCAoYSBzdHJheSByZWplY3Rpb24gaGVyZSB3b3VsZCBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIHN1cmZhY2UgYXMgYW4gaW5mcmEgZXJyb3Ig4oaSIHF1ZXVlIHJlLWRlbGl2ZXJ5LCBub3QgYSBzdGVwXG4gICAgICAgICAgICAvLyBmYWlsdXJlKS4gVGhlIGF3YWl0IG9ubHkgZW5mb3JjZXMgb3JkZXJpbmcuXG4gICAgICAgICAgICBpZiAocHJlQ29tcGxldGlvbk9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByZUNvbXBsZXRpb25PcHMpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5RdWV1ZUV4ZWN1dGlvblRpbWVNcyhleGVjdXRpb25UaW1lTXMpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIC0tLSBEZWh5ZHJhdGUgKHNlcmlhbGl6ZSkgdGhlIHN0ZXAncyByZXR1cm4gdmFsdWUgLS0tXG4gICAgICAgICAgICAvLyBBIG5vbi1zZXJpYWxpemFibGUgcmV0dXJuIHZhbHVlIGlzIGEgdXNlci1jb2RlIGJ1Zywgbm90IGFuXG4gICAgICAgICAgICAvLyBpbmZyYXN0cnVjdHVyZSBmYWlsdXJlLiBSb3V0ZSBpdCB0aHJvdWdoIHRoZSBzYW1lIHN0ZXAtZmFpbHVyZVxuICAgICAgICAgICAgLy8gcGF0aCBhcyBhIHRocm93biBlcnJvciBzbyBTZXJpYWxpemF0aW9uRXJyb3IgKHdoaWNoIGlzIG1hcmtlZFxuICAgICAgICAgICAgLy8gYGZhdGFsOiB0cnVlYCkgc2hvcnQtY2lyY3VpdHMgdGhlIHJldHJ5IGxvb3AgaW5zdGVhZCBvZlxuICAgICAgICAgICAgLy8gYnViYmxpbmcgYXMgYW4gSFRUUCA1MDAgYW5kIGJ1cm5pbmcgdGhyb3VnaCBhbGwgNCBxdWV1ZVxuICAgICAgICAgICAgLy8gZGVsaXZlcmllcyBvbiBhIGd1YXJhbnRlZWQtdG8tZmFpbCBtZXNzYWdlLlxuICAgICAgICAgICAgaWYgKCF1c2VyQ29kZUZhaWxlZCkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYWNlKFxuICAgICAgICAgICAgICAgICAgJ3N0ZXAuZGVoeWRyYXRlJyxcbiAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgYXN5bmMgKGRlaHlkcmF0ZVNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCByZXR1cm4gdmFsdWVzIGFyZSBjb25zdW1lZCBieSB0aGUgd29ya2Zsb3cgVk1cbiAgICAgICAgICAgICAgICAgICAgLy8gcnVubmluZyBvbiB0aGlzIHNhbWUgZGVwbG95bWVudCAodmVyc2lvbiBza2V3XG4gICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3Rpb24gZW5zdXJlcyBpdCkuIEJ5dGUtc3RyZWFtIGZyYW1pbmcgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmVmb3JlIGFsd2F5cyBzYWZlIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlaHlkcmF0ZWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgICAgICAgICBkZWh5ZHJhdGVTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVTZXJpYWxpemVUaW1lTXMoZHVyYXRpb25NcyksXG4gICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXN1bHRUeXBlKHR5cGVvZiBkZWh5ZHJhdGVkKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWh5ZHJhdGVkO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHVzZXJDb2RlRXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgdXNlckNvZGVGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIC0tLSBIYW5kbGUgdXNlciBjb2RlIGVycm9ycyAtLS1cbiAgICAgICAgICAgIGlmICh1c2VyQ29kZUZhaWxlZCkge1xuICAgICAgICAgICAgICBjb25zdCBlcnIgPSB1c2VyQ29kZUVycm9yO1xuXG4gICAgICAgICAgICAgIC8vIEluZnJhc3RydWN0dXJlIGVycm9ycyB0aGF0IHNvbWVob3cgc3VyZmFjZWQgdGhyb3VnaCB1c2VyIGNvZGVcbiAgICAgICAgICAgICAgLy8gc2hvdWxkIHByb3BhZ2F0ZSB0byB0aGUgcXVldWUgaGFuZGxlciBmb3IgcmV0cnksIG5vdCBjb25zdW1lXG4gICAgICAgICAgICAgIC8vIHN0ZXAgYXR0ZW1wdHMuXG4gICAgICAgICAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgc28gbm8tb3BcbiAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcnVuIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBzdGVwJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIGVyci5zdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gQWJvcnQgZmFpbHVyZXMgY2FuIGNyb3NzIFZNL3NlcmlhbGl6YXRpb24gcmVhbG1zLCB3aGVyZVxuICAgICAgICAgICAgICAvLyBgaW5zdGFuY2VvZiBFcnJvcmAgaXMgbm90IHJlbGlhYmxlLlxuICAgICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVFcnIgPSBwcm9tb3RlQWJvcnRFcnJvclRvRmF0YWwoZXJyKTtcbiAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID0gYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKGVmZmVjdGl2ZUVycik7XG4gICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdGFjayA9XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLnN0YWNrIHx8IGdldEVycm9yU3RhY2soZWZmZWN0aXZlRXJyKSB8fCAnJztcblxuICAgICAgICAgICAgICAvLyBSZWNvcmQgZXhjZXB0aW9uIGZvciBPVEVMIGVycm9yIHRyYWNraW5nXG4gICAgICAgICAgICAgIGlmIChlZmZlY3RpdmVFcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHNwYW4/LnJlY29yZEV4Y2VwdGlvbj8uKGVmZmVjdGl2ZUVycik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgZXJyb3IgY2F0ZWdvcnkgYW5kIHJldHJ5YWJpbGl0eVxuICAgICAgICAgICAgICBjb25zdCBpc0ZhdGFsID0gRmF0YWxFcnJvci5pcyhlZmZlY3RpdmVFcnIpO1xuICAgICAgICAgICAgICBjb25zdCBpc1JldHJ5YWJsZSA9IFJldHJ5YWJsZUVycm9yLmlzKGVmZmVjdGl2ZUVycik7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yQ2F0ZWdvcnkgPSBpc0ZhdGFsXG4gICAgICAgICAgICAgICAgPyAnZmF0YWwnXG4gICAgICAgICAgICAgICAgOiBpc1JldHJ5YWJsZVxuICAgICAgICAgICAgICAgICAgPyAncmV0cnlhYmxlJ1xuICAgICAgICAgICAgICAgICAgOiAndHJhbnNpZW50JztcblxuICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEVycm9yTmFtZShnZXRFcnJvck5hbWUoZWZmZWN0aXZlRXJyKSksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBFcnJvck1lc3NhZ2Uobm9ybWFsaXplZEVycm9yLm1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZ2V0RXJyb3JOYW1lKGVmZmVjdGl2ZUVycikpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvckNhdGVnb3J5KGVycm9yQ2F0ZWdvcnkpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclJldHJ5YWJsZSghaXNGYXRhbCksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmIChpc0ZhdGFsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBkZXNjcmliZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJpZW5kbHlTdGVwID0gZm9ybWF0U3RlcE5hbWUoc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1pbmcgPVxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uYXR0cmlidXRpb24gPT09ICdzZGsnXG4gICAgICAgICAgICAgICAgICAgID8gYFN0ZXAgJHtmcmllbmRseVN0ZXB9IGZhaWxlZCB3aXRoIGEgRmF0YWxFcnJvciBmcm9tIHRoZSBTREsgcnVudGltZSDigJQgYnViYmxpbmcgdXAgdG8gcGFyZW50IHdvcmtmbG93YFxuICAgICAgICAgICAgICAgICAgICA6IGBTdGVwICR7ZnJpZW5kbHlTdGVwfSB0aHJldyBhIEZhdGFsRXJyb3Ig4oCUIGJ1YmJsaW5nIHVwIHRvIHBhcmVudCB3b3JrZmxvd2A7XG4gICAgICAgICAgICAgICAgLy8gTWlycm9yIHRoZSB3b3JrZmxvdy1sZXZlbCBsb2cgZm9ybWF0dGluZzogcHV0IHRoZSBmcmFtaW5nICtcbiAgICAgICAgICAgICAgICAvLyBzdGFjayBpbnRvIHRoZSBtZXNzYWdlIHNvIGNvbnNvbGUuZXJyb3IgcmVuZGVycyB0aGUgc3RhY2tcbiAgICAgICAgICAgICAgICAvLyBpbmxpbmUsIGFuZCBrZWVwIHRoZSBtZXRhZGF0YSBvYmplY3Qgc21hbGwgd2l0aCBvbmx5IHRoZVxuICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZWQgZmllbGRzIHRoYXQgbG9nIGRyYWlucyB3YW50IHRvIGluZGV4LlxuICAgICAgICAgICAgICAgIC8vIE5vIGBoaW50YCBmaWVsZCBoZXJlIOKAlCBhY3Rpb25hYmxlIGhpbnQgdGV4dCBsaXZlcyBvbiB0aGVcbiAgICAgICAgICAgICAgICAvLyBlcnJvciBtZXNzYWdlIGl0c2VsZiAoc28gaXQgc3Vydml2ZXMgc2VyaWFsaXphdGlvbiDihpJcbiAgICAgICAgICAgICAgICAvLyBldmVudCBsb2cg4oaSIG9ic2VydmFiaWxpdHkgcmVoeWRyYXRlKSwgYW5kIGFkZGluZyBpdFxuICAgICAgICAgICAgICAgIC8vIGFnYWluIGhlcmUganVzdCBkdXBsaWNhdGVzIGl0IG9uIHN0ZGVyci5cbiAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgYCR7ZnJhbWluZ31cXG4ke25vcm1hbGl6ZWRTdGFjayB8fCBub3JtYWxpemVkRXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICBlcnJvckF0dHJpYnV0aW9uOiBkZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBub3JtYWxpemVkRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBub3JtYWxpemVkRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSkuXG4gICAgICAgICAgICAgICAgLy8gUGVyc2lzdCB0aGUgcHJvbW90ZWQgRmF0YWxFcnJvciBmb3IgYWJvcnRzIHNvIHRoZSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdyBjYW4gZGlzdGluZ3Vpc2ggY2FuY2VsbGF0aW9uIGZyb20gcmV0cnkgZXhoYXVzdGlvbi5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVFcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbkZvclN0ZXAoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIOKAlCBpZGVtcG90ZW50LlxuICAgICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdGVwRmFpbEVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdGVwRmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEZhdGFsRXJyb3IodHJ1ZSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4UmV0cmllcyA9XG4gICAgICAgICAgICAgICAgICBzdGVwRm4ubWF4UmV0cmllcyA/PyBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVM7XG4gICAgICAgICAgICAgICAgLy8gc3RlcC5hdHRlbXB0IHdhcyBpbmNyZW1lbnRlZCBieSBzdGVwX3N0YXJ0ZWQsIHVzZSBpdCBoZXJlXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEF0dGVtcHQgPSBzdGVwLmF0dGVtcHQ7XG5cbiAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXR0ZW1wdChjdXJyZW50QXR0ZW1wdCksXG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcE1heFJldHJpZXMobWF4UmV0cmllcyksXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBtYXhSZXRyaWVzIGlzIHRoZSBudW1iZXIgb2YgUkVUUklFUyBhZnRlciB0aGUgZmlyc3QgYXR0ZW1wdCwgc28gdG90YWwgYXR0ZW1wdHMgPSBtYXhSZXRyaWVzICsgMVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QXR0ZW1wdCA+PSBtYXhSZXRyaWVzICsgMSkge1xuICAgICAgICAgICAgICAgICAgLy8gTWF4IHJldHJpZXMgcmVhY2hlZFxuICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGRlc2NyaWJlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZyaWVuZGx5U3RlcCA9IGZvcm1hdFN0ZXBOYW1lKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1pbmcgPVxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbiA9PT0gJ3NkaydcbiAgICAgICAgICAgICAgICAgICAgICA/IGBTdGVwICR7ZnJpZW5kbHlTdGVwfSBoaXQgbWF4IHJldHJpZXMgb24gYW4gU0RLIHJ1bnRpbWUgZXJyb3Ig4oCUIGJ1YmJsaW5nIHRvIHBhcmVudCB3b3JrZmxvd2BcbiAgICAgICAgICAgICAgICAgICAgICA6IGBTdGVwICR7ZnJpZW5kbHlTdGVwfSBoaXQgbWF4IHJldHJpZXMg4oCUIGJ1YmJsaW5nIGVycm9yIHRocm93biBieSB5b3VyIHN0ZXAgdG8gdGhlIHBhcmVudCB3b3JrZmxvd2A7XG4gICAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgJHtmcmFtaW5nfVxcbiR7bm9ybWFsaXplZFN0YWNrIHx8IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogZGVzY3JpcHRpb24uYXR0cmlidXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBub3JtYWxpemVkRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgbWFjaGluZSBzdGVwIG5hbWUgaW4gdGhlIHBlcnNpc3RlZFxuICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSDigJQgb2JzZXJ2YWJpbGl0eSBhbHJlYWR5IHNob3dzIHdoaWNoIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VkIHRoZSBldmVudCwgYW5kIGBzdGVwTmFtZTogJ3N0ZXAvLy4vLi4uL2ZvbydgXG4gICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgdGl0bGUgaXMganVzdCBub2lzZS4gVGhlIENMSSBsb2dnZXIgcmVuZGVyc1xuICAgICAgICAgICAgICAgICAgLy8gYFN0ZXAgZm9vICguLy4uLikgaGl0IG1heCByZXRyaWVzYCBzZXBhcmF0ZWx5LlxuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFN0ZXAgZmFpbGVkIGFmdGVyICR7bWF4UmV0cmllc30gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCBtYXhSZXRyaWVzKX06ICR7bm9ybWFsaXplZEVycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSkuXG4gICAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBvcmlnaW5hbCBlcnJvciB3aXRoIGEgRmF0YWxFcnJvciB0aGF0IHByZXNlcnZlc1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIHdyYXBwZWQgbWVzc2FnZSBwbHVzIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGBjYXVzZWAgc28gaXQncyByZWNvdmVyYWJsZSBhZnRlciBoeWRyYXRpb24uXG4gICAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgKHdyYXBwZWRFcnJvciBhcyBFcnJvcikuY2F1c2UgPSBlcnI7XG4gICAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFN0YWNrKSB3cmFwcGVkRXJyb3Iuc3RhY2sgPSBub3JtYWxpemVkU3RhY2s7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbkZvclN0ZXAoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSDigJQgaWRlbXBvdGVudC5cbiAgICAgICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdGVwRmFpbEVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gTm90IGF0IG1heCByZXRyaWVzIHlldCAtIGxvZyBhcyBhIHJldHJ5YWJsZSBlcnJvclxuICAgICAgICAgICAgICAgICAgaWYgKFJldHJ5YWJsZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcExvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICdFbmNvdW50ZXJlZCBSZXRyeWFibGVFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdFbmNvdW50ZXJlZCBFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogbm9ybWFsaXplZEVycm9yLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBub3JtYWxpemVkRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gU2V0IHN0ZXAgdG8gcGVuZGluZyBmb3IgcmV0cnkgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfcmV0cnlpbmcgcmVjb3JkcyB0aGUgZXJyb3IgYW5kIHNldHMgc3RhdHVzIHRvIHBlbmRpbmcuXG4gICAgICAgICAgICAgICAgICAvLyBTZXJpYWxpemUgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSBzbyBpdHMgZnVsbCB0eXBlIGlkZW50aXR5XG4gICAgICAgICAgICAgICAgICAvLyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgcm91bmQtdHJpcCB0aHJvdWdoIHRoZSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihSZXRyeWFibGVFcnJvci5pcyhlcnIpICYmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeUFmdGVyOiBlcnIucmV0cnlBZnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcFJldHJ5RXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBSZXRyeUVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUg4oCUIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCByZXRyeWluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN0ZXBSZXRyeUVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHN0ZXBSZXRyeUVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZXBSZXRyeUVycjtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgICAgUmV0cnlhYmxlRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgID8gTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoK2Vyci5yZXRyeUFmdGVyLmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMTAwMFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIDogMVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlUaW1lb3V0U2Vjb25kcyh0aW1lb3V0U2Vjb25kcyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlXaWxsUmV0cnkodHJ1ZSksXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgLy8gQWRkIHNwYW4gZXZlbnQgZm9yIHJldHJ5IHNjaGVkdWxpbmdcbiAgICAgICAgICAgICAgICAgIHNwYW4/LmFkZEV2ZW50Py4oJ3JldHJ5LnNjaGVkdWxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgJ3JldHJ5LnRpbWVvdXRfc2Vjb25kcyc6IHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAncmV0cnkuYXR0ZW1wdCc6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAncmV0cnkubWF4X3JldHJpZXMnOiBtYXhSZXRyaWVzLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEl0J3MgYSByZXRyeWFibGUgZXJyb3IgLSBzbyBoYXZlIHRoZSBxdWV1ZSBrZWVwIHRoZSBtZXNzYWdlIHZpc2libGVcbiAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgaXQgZ2V0cyByZXRyaWVkLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgZmFpbGVkL3JldHJ5aW5nIHN0ZXBcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgcmVzb2x2ZWROYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBjb21wbGV0ZSB0aGUgc3RlcCAtLS1cbiAgICAgICAgICAgIC8vIEVycm9ycyBoZXJlIChuZXR3b3JrIGZhaWx1cmVzLCBzZXJ2ZXIgZXJyb3JzKSBwcm9wYWdhdGUgdG8gdGhlXG4gICAgICAgICAgICAvLyBxdWV1ZSBoYW5kbGVyIGZvciBhdXRvbWF0aWMgcmV0cnkuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gTk9URTogTm9uZSBvZiB0aGUgY29kZSBmcm9tIHRoaXMgcG9pbnQgaXMgZ3VhcmFudGVlZCB0byBydW4uXG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgc3RlcCBtaWdodCBmYWlsIG9yIGNhdXNlIGEgZnVuY3Rpb24gdGltZW91dCBhbmQgdGhlXG4gICAgICAgICAgICAvLyBwcm9jZXNzIG1pZ2h0IGJlIFNJR0tJTEwnZCwgdGhlIHdvcmtmbG93IHJ1bnRpbWUgbXVzdCBiZVxuICAgICAgICAgICAgLy8gcmVzaWxpZW50IHRvIHRoZSBiZWxvdyBjb2RlIG5vdCBleGVjdXRpbmcgb24gYSBmYWlsZWQgc3RlcC5cbiAgICAgICAgICAgIC8vIChEZWh5ZHJhdGlvbiBhbHJlYWR5IGhhcHBlbmVkIGFib3ZlIGFuZCBpcyBhY2NvdW50ZWQgZm9yIGluIHRoZVxuICAgICAgICAgICAgLy8gdXNlckNvZGVGYWlsZWQgcGF0aC4pXG4gICAgICAgICAgICAvLyBUaGVzZSBzdHJlYW0gb3BzIGFyZSBmbHVzaGVkIGluIHRoZSBiYWNrZ3JvdW5kOyB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgLy8gaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZCB3YWl0VW50aWxcbiAgICAgICAgICAgIC8vIHJlamVjdGlvbiBjcmFzaGVzIHRoZSBwcm9jZXNzIGFzIHVuaGFuZGxlZFJlamVjdGlvbiksIHNvXG4gICAgICAgICAgICAvLyB1bmV4cGVjdGVkIGZhaWx1cmVzIGFyZSBsb2dnZWQgaW5zdGVhZC5cbiAgICAgICAgICAgIHNhZmVXYWl0VW50aWwoUHJvbWlzZS5hbGwob3BzKSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICdCYWNrZ3JvdW5kIGZsdXNoIG9mIHN0ZXAgc3RyZWFtIG9wcyBmYWlsZWQnLFxuICAgICAgICAgICAgICAgIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUnVuIHN0ZXBfY29tcGxldGVkIGFuZCB0cmFjZSBzZXJpYWxpemF0aW9uIGNvbmN1cnJlbnRseTtcbiAgICAgICAgICAgIC8vIHRoZSB0cmFjZSBjYXJyaWVyIGlzIHVzZWQgaW4gdGhlIGZpbmFsIHF1ZXVlTWVzc2FnZSBjYWxsIGJlbG93XG4gICAgICAgICAgICBsZXQgc3RlcENvbXBsZXRlZDQwOSA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgWywgdHJhY2VDYXJyaWVyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgd29ybGQuZXZlbnRzXG4gICAgICAgICAgICAgICAgLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0IGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUg4oCUIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGNvbXBsZXRpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBDb21wbGV0ZWQ0MDkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBpZiAoc3RlcENvbXBsZXRlZDQwOSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnY29tcGxldGVkJyksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmVzdWx0VHlwZSh0eXBlb2YgcmVzdWx0KSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBRdWV1ZSB0aGUgd29ya2Zsb3cgY29udGludWF0aW9uIHdpdGggdGhlIGNvbmN1cnJlbnRseS1yZXNvbHZlZCB0cmFjZSBjYXJyaWVyXG4gICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbn1cblxuY29uc3Qgc3RlcEhhbmRsZXIgPSBjcmVhdGVTdGVwSGFuZGxlcigpO1xuXG4vKipcbiAqIEEgc2luZ2xlIHJvdXRlIHRoYXQgaGFuZGxlcyBhbnkgc3RlcCBleGVjdXRpb24gcmVxdWVzdCBhbmQgcm91dGVzIHRvIHRoZVxuICogYXBwcm9wcmlhdGUgc3RlcCBmdW5jdGlvbi4gV2UgbWF5IGV2ZW50dWFsbHkgd2FudCB0byBjcmVhdGUgZGlmZmVyZW50IGJ1bmRsZXNcbiAqIGZvciBlYWNoIHN0ZXAsIHRoaXMgaXMgdGVtcG9yYXJ5LlxuICovXG5sZXQgY2FjaGVkU3RlcEhhbmRsZXI6ICgocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPikgfCB1bmRlZmluZWQ7XG5leHBvcnQgY29uc3Qgc3RlcEVudHJ5cG9pbnQ6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+ID1cbiAgLyogQF9fUFVSRV9fICovIHdpdGhIZWFsdGhDaGVjayhhc3luYyAocmVxKSA9PiB7XG4gICAgaWYgKCFjYWNoZWRTdGVwSGFuZGxlcikge1xuICAgICAgY2FjaGVkU3RlcEhhbmRsZXIgPSBzdGVwSGFuZGxlcihhd2FpdCBnZXRXb3JsZEhhbmRsZXJzKCkpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkU3RlcEhhbmRsZXIocmVxKTtcbiAgfSk7XG4iXX0=
839
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxlQUFlLEVBQ2Ysc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFNBQVMsRUFDVCxlQUFlLEdBQ2hCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixpQ0FBaUMsRUFFakMsdUJBQXVCLEdBQ3hCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixnQkFBZ0IsR0FDakIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsZ0JBQWdCLEdBQ2pCLE1BQU0saUJB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QkFBaUIsRUFBRSxDQUFDO0FBRXhDOzs7O0dBSUc7QUFDSCxJQUFJLGlCQUFvRSxDQUFDO0FBQ3pFLE1BQU0sQ0FBQyxNQUFNLGNBQWM7QUFDekIsZUFBZSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7SUFDNUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdkIsaUJBQWlCLEdBQUcsV0FBVyxDQUFDLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxPQUFPLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRmF0YWxFcnJvcixcbiAgUmV0cnlhYmxlRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgU3RlcE5vdFJlZ2lzdGVyZWRFcnJvcixcbiAgVGhyb3R0bGVFcnJvcixcbiAgVG9vRWFybHlFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwsXG4gIGZvcm1hdFN0ZXBOYW1lLFxuICBwbHVyYWxpemUsXG4gIHN0ZXBEaXNwbGF5TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IGdldFBvcnQgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvZ2V0LXBvcnQnO1xuaW1wb3J0IHtcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB0eXBlIFN0ZXAsXG4gIFN0ZXBJbnZva2VQYXlsb2FkU2NoZW1hLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZGVzY3JpYmVFcnJvciB9IGZyb20gJy4uL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIsIHN0ZXBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQge1xuICBjYW5jZWxBYm9ydFJlYWRlcnMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbiAgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlLFxuICBoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgaHlkcmF0ZVN0ZXBFcnJvcixcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4uL3N0ZXAvY29udGV4dC1zdG9yYWdlLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzLFxuICBnZXROZXh0VHJhY2VDYXJyaWVyLFxuICBnZXRTcGFuS2luZCxcbiAgZ2V0V29ya2Zsb3dUcmFjZU1vZGUsXG4gIGlzVXNhYmxlVHJhY2VDYXJyaWVyLFxuICB0cmFjZSxcbiAgd2l0aFRyYWNlQ29udGV4dCxcbn0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7XG4gIGdldEVycm9yTmFtZSxcbiAgZ2V0RXJyb3JTdGFjayxcbiAgbm9ybWFsaXplVW5rbm93bkVycm9yLFxuICBwcm9tb3RlQWJvcnRFcnJvclRvRmF0YWwsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHsgZ2V0TWF4UXVldWVEZWxpdmVyaWVzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0UXVldWVPdmVyaGVhZCxcbiAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUsXG4gIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZSxcbiAgbWVtb2l6ZUVuY3J5cHRpb25LZXksXG4gIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHdpdGhIZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IHNhZmVXYWl0VW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQsIGdldFdvcmxkSGFuZGxlcnMsIHR5cGUgV29ybGRIYW5kbGVycyB9IGZyb20gJy4vd29ybGQuanMnO1xuXG5jb25zdCBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVMgPSAzO1xuXG5mdW5jdGlvbiBjcmVhdGVTdGVwSGFuZGxlcihuYW1lc3BhY2U/OiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzb2x2ZWROYW1lc3BhY2UgPSByZXNvbHZlUXVldWVOYW1lc3BhY2UobmFtZXNwYWNlKTtcbiAgY29uc3Qgc3RlcFByZWZpeCA9IGdldFF1ZXVlVG9waWNQcmVmaXgoJ3N0ZXAnLCByZXNvbHZlZE5hbWVzcGFjZSk7XG5cbiAgcmV0dXJuICh3b3JsZEhhbmRsZXJzOiBXb3JsZEhhbmRsZXJzKSA9PlxuICAgIHdvcmxkSGFuZGxlcnMuY3JlYXRlUXVldWVIYW5kbGVyKHN0ZXBQcmVmaXgsIGFzeW5jIChtZXNzYWdlXywgbWV0YWRhdGEpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZVxuICAgICAgLy8gTk9URTogSGVhbHRoIGNoZWNrIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IHVuYXV0aGVudGljYXRlZCBmb3IgbW9uaXRvcmluZyBwdXJwb3Nlcy5cbiAgICAgIC8vIFRoZXkgb25seSB3cml0ZSBhIHNpbXBsZSBzdGF0dXMgcmVzcG9uc2UgdG8gYSBzdHJlYW0gYW5kIGRvIG5vdCBleHBvc2Ugc2Vuc2l0aXZlIGRhdGEuXG4gICAgICAvLyBUaGUgc3RyZWFtIG5hbWUgaW5jbHVkZXMgYSB1bmlxdWUgY29ycmVsYXRpb25JZCB0aGF0IG11c3QgYmUga25vd24gYnkgdGhlIGNhbGxlci5cbiAgICAgIGNvbnN0IGhlYWx0aENoZWNrID0gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQobWVzc2FnZV8pO1xuICAgICAgaWYgKGhlYWx0aENoZWNrKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgICAgICAgICBoZWFsdGhDaGVjayxcbiAgICAgICAgICAnc3RlcCcsXG4gICAgICAgICAgd29ybGRIYW5kbGVycy5zcGVjVmVyc2lvblxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgc3RlcElkLFxuICAgICAgICB0cmFjZUNhcnJpZXI6IGluY29taW5nVHJhY2VDYXJyaWVyLFxuICAgICAgICByZXF1ZXN0ZWRBdCxcbiAgICAgIH0gPSBTdGVwSW52b2tlUGF5bG9hZFNjaGVtYS5wYXJzZShtZXNzYWdlXyk7XG4gICAgICBjb25zdCB7IHJlcXVlc3RJZCB9ID0gbWV0YWRhdGE7XG4gICAgICAvLyBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSByZXR1cm5zIGB7fWAgd2hlbiBubyBPVEVMIFNESyBpcyByZWdpc3RlcmVkXG4gICAgICAvLyBvciBubyBzcGFuIGlzIGFjdGl2ZSDigJQgdHJlYXQgYW4gZW1wdHkgY2FycmllciB0aGUgc2FtZSBhcyBhbiBhYnNlbnRcbiAgICAgIC8vIG9uZSBzbyBsaW5rZWQgbW9kZSBmYWxscyBiYWNrIHRvIGEgZnJlc2ggb3JpZ2luIGluc3RlYWQgb2ZcbiAgICAgIC8vIGZvcndhcmRpbmcgYSB1c2VsZXNzIGB7fWAgZm9yZXZlci5cbiAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IGlzVXNhYmxlVHJhY2VDYXJyaWVyKGluY29taW5nVHJhY2VDYXJyaWVyKVxuICAgICAgICA/IGluY29taW5nVHJhY2VDYXJyaWVyXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyAtLS0gVHJhY2UgY29ycmVsYXRpb24gbW9kZSAtLS1cbiAgICAgIC8vICdsaW5rZWQnIChkZWZhdWx0KTogdGhlIFNURVAgc3BhbiBiZWxvdyBzdGFydHMgYSBORVcgcm9vdCB0cmFjZSB3aXRoXG4gICAgICAvLyBzcGFuIGxpbmtzIHRvIHRoZSBkZWxpdmVyeSBjb250ZXh0IGFuZCB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb21cbiAgICAgIC8vIHRoZSBtZXNzYWdlJ3MgdHJhY2UgY2Fycmllci4gJ2NvbnRpbnVvdXMnOiBsZWdhY3kgYmVoYXZpb3Ig4oCUIHRoZVxuICAgICAgLy8gcmVzdG9yZWQgcnVuLW9yaWdpbiBjb250ZXh0IHBhcmVudHMgdGhpcyBpbnZvY2F0aW9uJ3Mgc3BhbnMuXG4gICAgICBjb25zdCB0cmFjZU1vZGUgPSBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpO1xuXG4gICAgICAvLyBUcmFjZSBjYXJyaWVyIHRvIGF0dGFjaCB0byBtZXNzYWdlcyB0aGlzIGludm9jYXRpb24gZW5xdWV1ZXMg4oCUIHNlZVxuICAgICAgLy8gZ2V0TmV4dFRyYWNlQ2FycmllciBmb3IgdGhlIGxpbmtlZC9jb250aW51b3VzIHNlbWFudGljcy5cbiAgICAgIGNvbnN0IG5leHRUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PlxuICAgICAgICBnZXROZXh0VHJhY2VDYXJyaWVyKHRyYWNlTW9kZSwgdHJhY2VDb250ZXh0KTtcblxuICAgICAgLy8gLS0tIE1heCBkZWxpdmVyeSBjaGVjayAtLS1cbiAgICAgIC8vIEVuZm9yY2UgbWF4IGRlbGl2ZXJ5IGxpbWl0IGJlZm9yZSBhbnkgaW5mcmFzdHJ1Y3R1cmUgY2FsbHMuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHJ1bmF3YXkgc3RlcHMgZnJvbSBjb25zdW1pbmcgaW5maW5pdGUgcXVldWUgZGVsaXZlcmllcy5cbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIHdhbnQgdG8gZG8gdGhlIG1pbmltYWwgYW1vdW50IG9mIHdvcmsgKG5vIGZldGNoaW5nXG4gICAgICAvLyBvZiB0aGUgc3RlcCBkZXRhaWxzLCBldGMuIFdlIHNpbXBseSBhdHRlbXB0IHRvIG1hcmsgdGhlIHN0ZXAgYXMgZmFpbGVkXG4gICAgICAvLyBhbmQgZW5xdWV1ZSB0aGUgd29ya2Zsb3cgb25jZSwgYW5kIGlmIGVpdGhlciBvZiB0aG9zZSBmYWlscywgdGhlIG1lc3NhZ2VcbiAgICAgIC8vIGlzIHN0aWxsIGNvbnN1bWVkIGJ1dCB3aXRoIGFkZXF1YXRlIGxvZ2dpbmcgdGhhdCBhbiBlcnJvciBvY2N1cnJlZC5cbiAgICAgIC8vIFNjb3BlZCBsb2dnZXIgZm9yIHRoaXMgc3RlcCBpbnZvY2F0aW9uIOKAlCBhdHRhY2hlcyBydW4vc3RlcCBjb250ZXh0IHRvXG4gICAgICAvLyBldmVyeSBsb2cgbGluZSBiZWxvdyBzbyBjYWxsZXJzIGRvbid0IHJlcGVhdCBpdC5cbiAgICAgIGNvbnN0IHN0ZXBOYW1lRnJvbVF1ZXVlID0gbWV0YWRhdGEucXVldWVOYW1lLnNsaWNlKHN0ZXBQcmVmaXgubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHN0ZXBSdW50aW1lTG9nZ2VyID0gcnVudGltZUxvZ2dlci5mb3JSdW4oXG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgeyBzdGVwSWQsIHN0ZXBOYW1lOiBzdGVwTmFtZUZyb21RdWV1ZSB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBtYXhRdWV1ZURlbGl2ZXJpZXMgPSBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMoKTtcbiAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gbWF4UXVldWVEZWxpdmVyaWVzKSB7XG4gICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBTdGVwIGhhbmRsZXIgZXhjZWVkZWQgbWF4IGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW5JZCk7XG4gICAgICAgICAgY29uc3QgZXJyID0gbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgICBgU3RlcCBleGNlZWRlZCBtYXhpbXVtIHF1ZXVlIGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcE5hbWVGcm9tUXVldWUsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFJlLXF1ZXVlIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIGZhaWxlZCBzdGVwXG4gICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENhbid0IGV2ZW4gbWFyayB0aGUgc3RlcCBhcyBmYWlsZWQuIENvbnN1bWUgdGhlIG1lc3NhZ2UgdG8gc3RvcFxuICAgICAgICAgIC8vIGZ1cnRoZXIgcmV0cmllcy4gVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZS5cbiAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gbWFyayBzdGVwIGFzIGZhaWxlZCBhZnRlciAke21ldGFkYXRhLmF0dGVtcHR9IGRlbGl2ZXJ5IGF0dGVtcHRzLiBgICtcbiAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBzdGVwIGZyb20gYmVpbmcgdGVybWluYXRlZC4gYCArXG4gICAgICAgICAgICAgIGBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGlsIG1hbnVhbGx5IHJlc29sdmVkLiBgICtcbiAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgIGBvciBhIGJ1ZyBpbiB0aGUgd29ya2Zsb3cgcnVudGltZSBhbmQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBXb3JrZmxvdyB0ZWFtLmAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgIGVycm9yTmFtZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubmFtZSA6ICdVbmtub3duRXJyb3InLFxuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEluIGxpbmtlZCBtb2RlIHRoZSBvbmx5IHNwYW4gbGluayBpcyB0byB0aGUgcnVuLW9yaWdpbiBjb250ZXh0OyB0aGVcbiAgICAgIC8vIHN0ZXAuZXhlY3V0ZSBzcGFuIHN0YXlzIGEgY2hpbGQgb2YgdGhlIGxvY2FsIGRlbGl2ZXJ5IChmbG93LXJvdXRlKVxuICAgICAgLy8gY29udGV4dC4gSW4gY29udGludW91cyBtb2RlIHRoZSBsaW5rIHBvaW50cyBhdCB0aGUgZGVsaXZlcnkgY29udGV4dC5cbiAgICAgIGNvbnN0IHNwYW5MaW5rcyA9IGF3YWl0IGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyh0cmFjZU1vZGUsIHRyYWNlQ29udGV4dCk7XG5cbiAgICAgIC8vIEV4ZWN1dGUgc3RlcCB3aXRoaW4gdGhlIHByb3BhZ2F0ZWQgdHJhY2UgY29udGV4dCAoY29udGludW91cyBtb2RlXG4gICAgICAvLyBvbmx5IOKAlCBpbiBsaW5rZWQgbW9kZSB0aGUgcnVuLW9yaWdpbiBpcyBOT1QgcmVzdG9yZWQgYXMgdGhlIHBhcmVudCxcbiAgICAgIC8vIHNvIHdpdGhUcmFjZUNvbnRleHQgaXMgYSBwYXNzdGhyb3VnaCBhbmQgdGhlIHN0ZXAuZXhlY3V0ZSBzcGFuIHN0YXlzXG4gICAgICAvLyBhIGNoaWxkIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSBjb250ZXh0LCBsaW5rZWQgdG8gdGhlIHJ1biBvcmlnaW4pLlxuICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgdHJhY2VNb2RlID09PSAnY29udGludW91cycgPyB0cmFjZUNvbnRleHQgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYXdhaXQgd2l0aFRyYWNlQ29udGV4dChwYXJlbnRUcmFjZUNhcnJpZXIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgc3RlcCBuYW1lIGZyb20gdGhlIHRvcGljIG5hbWVcbiAgICAgICAgY29uc3Qgc3RlcE5hbWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2Uoc3RlcFByZWZpeC5sZW5ndGgpO1xuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgICAgIGNvbnN0IGlzVmVyY2VsID0gcHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIE1lbW9pemVkIGFjY2Vzc29yIGZvciB0aGUgcGVyLXJ1biBBRVMtMjU2IGVuY3J5cHRpb24ga2V5LiBUaGUgZmlyc3RcbiAgICAgICAgLy8gY2FsbGVyICh0eXBpY2FsbHkgYGh5ZHJhdGVTdGVwQXJndW1lbnRzYCBmb3IgaW5wdXQgZGVzZXJpYWxpemF0aW9uLFxuICAgICAgICAvLyBvciBvbmUgb2YgdGhlIGVhcmx5LXJldHVybiBkZWh5ZHJhdGVTdGVwRXJyb3IgcGF0aHMgaWYgc3RlcF9zdGFydGVkXG4gICAgICAgIC8vIGZhaWxzKSB0cmlnZ2VycyB0aGUgYWN0dWFsIGZldGNoIC8gSEtERiBkZXJpdmF0aW9uOyBzdWJzZXF1ZW50XG4gICAgICAgIC8vIGNhbGxlcnMgYXdhaXQgdGhlIGNhY2hlZCBwcm9taXNlLiBTdGVwcyB0aGF0IGZhaWwgYmVmb3JlIGFueVxuICAgICAgICAvLyBlbmNyeXB0aW9uLWF3YXJlIHdvcmsgaGFwcGVucyAoZS5nLiBhbiBpbW1lZGlhdGUgc3RlcF9zdGFydGVkXG4gICAgICAgIC8vIGNvbmZsaWN0KSBza2lwIHRoZSBmZXRjaCBlbnRpcmVseS5cbiAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1bklkKTtcblxuICAgICAgICAvLyBSZXNvbHZlIGxvY2FsIGFzeW5jIHZhbHVlcyBjb25jdXJyZW50bHkgYmVmb3JlIGVudGVyaW5nIHRoZSB0cmFjZSBzcGFuXG4gICAgICAgIGNvbnN0IFtwb3J0LCBzcGFuS2luZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgaXNWZXJjZWwgPyB1bmRlZmluZWQgOiBnZXRQb3J0KCksXG4gICAgICAgICAgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIFRPRE86IHJlc29sdmUgdGhlIHdvcmtmbG93IGJhc2UgVVJMIHRocm91Z2ggdGhlIFdvcmxkIGludGVyZmFjZS5cbiAgICAgICAgLy8gVGhpcyBmYWxsYmFjayBjYW5ub3Qgc2VlIGxvY2FsL1Bvc3RncmVzIGJhc2VVcmwgb3ZlcnJpZGVzIG9yIGN1c3RvbS13b3JsZCByb3V0aW5nLlxuICAgICAgICBjb25zdCB3b3JrZmxvd0Jhc2VVcmwgPSBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwoXG4gICAgICAgICAgaXNWZXJjZWxcbiAgICAgICAgICAgID8gYGh0dHBzOi8vJHtwcm9jZXNzLmVudi5WRVJDRUxfVVJMfWBcbiAgICAgICAgICAgIDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0ID8/IDMwMDB9YFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0cmFjZShcbiAgICAgICAgICBgc3RlcC5leGVjdXRlICR7c3RlcERpc3BsYXlOYW1lKHN0ZXBOYW1lKX1gLFxuICAgICAgICAgIHsga2luZDogc3BhbktpbmQsIGxpbmtzOiBzcGFuTGlua3MgfSxcbiAgICAgICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTmFtZShzdGVwTmFtZSksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXR0ZW1wdChtZXRhZGF0YS5hdHRlbXB0KSxcbiAgICAgICAgICAgICAgLy8gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUobWV0YWRhdGEucXVldWVOYW1lKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ01lc3NhZ2VJZChtZXRhZGF0YS5tZXNzYWdlSWQpLFxuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHJvY2VzcycpLFxuICAgICAgICAgICAgICAuLi5nZXRRdWV1ZU92ZXJoZWFkKHsgcmVxdWVzdGVkQXQgfSksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gTm90ZTogU3RlcCBmdW5jdGlvbiB2YWxpZGF0aW9uIGhhcHBlbnMgYWZ0ZXIgc3RlcF9zdGFydGVkIHNvIHdlIGNhblxuICAgICAgICAgICAgLy8gcHJvcGVybHkgZmFpbCB0aGUgc3RlcCAobm90IHRoZSBydW4pIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgcmVnaXN0ZXJlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIHN0ZXAgZmFpbHVyZSBncmFjZWZ1bGx5LlxuICAgICAgICAgICAgY29uc3Qgc3RlcEZuID0gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBOYW1lKTtcblxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQod29ya2Zsb3dSdW5JZCksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwSWQoc3RlcElkKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgdmFsaWRhdGVzIHN0YXRlIGFuZCByZXR1cm5zIHRoZSBzdGVwIGVudGl0eSwgc28gbm8gc2VwYXJhdGVcbiAgICAgICAgICAgIC8vIHdvcmxkLnN0ZXBzLmdldCgpIGNhbGwgaXMgbmVlZGVkLiBUaGUgc2VydmVyIGNoZWNrczpcbiAgICAgICAgICAgIC8vIC0gU3RlcCBub3QgaW4gdGVybWluYWwgc3RhdGUgKHJldHVybnMgNDA5KVxuICAgICAgICAgICAgLy8gLSByZXRyeUFmdGVyIHRpbWVzdGFtcCByZWFjaGVkIChyZXR1cm5zIDQyNSB3aXRoIFJldHJ5LUFmdGVyIGhlYWRlcilcbiAgICAgICAgICAgIC8vIC0gV29ya2Zsb3cgc3RpbGwgYWN0aXZlIChyZXR1cm5zIDQxMCBpZiBjb21wbGV0ZWQpXG4gICAgICAgICAgICBsZXQgc3RlcCE6IFN0ZXA7XG4gICAgICAgICAgICAvLyBHYXRlIHBheWxvYWQgY29tcHJlc3Npb24gb24gdGhlIHN0ZXAgZW50aXR5J3Mgc3BlY1ZlcnNpb25cbiAgICAgICAgICAgIC8vIChzdGFtcGVkIGJ5IHRoZSBzYW1lLWRlcGxveW1lbnQgb3JjaGVzdHJhdG9yIHRoYXQgY3JlYXRlZCB0aGVcbiAgICAgICAgICAgIC8vIHN0ZXAsIHNvIHNwZWMgPj0gNSBpbXBsaWVzIGV2ZXJ5IHJlYWRlciBvZiB0aGlzIHJ1bidzIHBheWxvYWRzXG4gICAgICAgICAgICAvLyB1bmRlcnN0YW5kcyB0aGUgJ2d6aXAnIGZvcm1hdCkuIFJldHVybnMgZmFsc2Ugb24gdGhlIGVhcmx5XG4gICAgICAgICAgICAvLyBmYWlsdXJlIHBhdGhzIHdoZXJlIHN0ZXBfc3RhcnRlZCBkaWRuJ3QgcmV0dXJuIGFuIGVudGl0eS5cbiAgICAgICAgICAgIGNvbnN0IGNvbXByZXNzaW9uRm9yU3RlcCA9ICgpID0+XG4gICAgICAgICAgICAgICgoc3RlcCBhcyBTdGVwIHwgdW5kZWZpbmVkKT8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhcnRSZXN1bHQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9zdGFydGVkJyxcbiAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YTogeyBzdGVwTmFtZSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICghc3RhcnRSZXN1bHQuc3RlcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBzdGVwX3N0YXJ0ZWQgZXZlbnQgZm9yIFwiJHtzdGVwSWR9XCIgZGlkIG5vdCByZXR1cm4gc3RlcCBlbnRpdHlgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdGVwID0gc3RhcnRSZXN1bHQuc3RlcDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBpZiAoVGhyb3R0bGVFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0cnlSZXRyeUFmdGVyID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgdHlwZW9mIGVyci5yZXRyeUFmdGVyID09PSAnbnVtYmVyJyA/IGVyci5yZXRyeUFmdGVyIDogMVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICdUaHJvdHRsZWQgYWdhaW4gb24gcmV0cnksIGRlZmVycmluZyB0byBxdWV1ZScsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXJTZWNvbmRzOiByZXRyeVJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogcmV0cnlSZXRyeUFmdGVyIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgd2hlbiBhIHJ1biBpcyBjYW5jZWxsZWQgd2hpbGUgYSBzdGVwIGlzIGluLWZsaWdodC5cbiAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJ1biBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgeyBlcnJvck5hbWU6IGVyci5uYW1lLCBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIGEgdGVybWluYWwgc3RhdGUg4oCUIGFub3RoZXIgd29ya2VyIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgLy8gaXQgb3IgaXQgd2FzIHJldHJpZWQgdG8gY29tcGxldGlvbi4gUmUtZW5xdWV1ZSB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgc28gaXQgY2FuIG9ic2VydmUgdGhlIG91dGNvbWUuXG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAnU3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSwgcmUtZW5xdWV1aW5nIHdvcmtmbG93JyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwcGVkKHRydWUpLFxuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwUmVhc29uKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudD8uKCdzdGVwLnNraXBwZWQnLCB7XG4gICAgICAgICAgICAgICAgICAnc2tpcC5yZWFzb24nOiAndGVybWluYWxfc3RhdGUnLFxuICAgICAgICAgICAgICAgICAgJ3N0ZXAubmFtZSc6IHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgJ3N0ZXAuaWQnOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFRvbyBlYXJseTogcmV0cnlBZnRlciB0aW1lc3RhbXAgbm90IHJlYWNoZWQgeWV0XG4gICAgICAgICAgICAgIC8vIFJldHVybiB0aW1lb3V0IHRvIHF1ZXVlIHNvIGl0IHJldHJpZXMgbGF0ZXJcbiAgICAgICAgICAgICAgaWYgKFRvb0Vhcmx5RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoMSwgZXJyLnJldHJ5QWZ0ZXIgPz8gMSk7XG4gICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5VGltZW91dFNlY29uZHModGltZW91dFNlY29uZHMpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBzcGFuIGV2ZW50IGZvciBkZWxheWVkIHJldHJ5XG4gICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQ/Lignc3RlcC5kZWxheWVkJywge1xuICAgICAgICAgICAgICAgICAgJ2RlbGF5LnJlYXNvbic6ICdyZXRyeV9hZnRlcl9ub3RfcmVhY2hlZCcsXG4gICAgICAgICAgICAgICAgICAnZGVsYXkudGltZW91dF9zZWNvbmRzJzogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAnU3RlcCByZXRyeUFmdGVyIHRpbWVzdGFtcCBub3QgeWV0IHJlYWNoZWQnLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXRyeUFmdGVyU2Vjb25kczogZXJyLnJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBSZS10aHJvdyBvdGhlciBlcnJvcnNcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5kZWJ1ZygnU3RlcCBleGVjdXRpb24gZGV0YWlscycsIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBzdGVwLnN0YXR1cyxcbiAgICAgICAgICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cyhzdGVwLnN0YXR1cyksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgc3RlcCBmdW5jdGlvbiBleGlzdHMgQUZURVIgc3RlcF9zdGFydGVkIHNvIHdlIGNhblxuICAgICAgICAgICAgLy8gcHJvcGVybHkgZmFpbCB0aGUgc3RlcCAobm90IHRoZSBydW4pIGlmIHRoZSBmdW5jdGlvbiBpcyBtaXNzaW5nLlxuICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgc3RlcCBmYWlsdXJlIGdyYWNlZnVsbHksXG4gICAgICAgICAgICAvLyBzaW1pbGFyIHRvIGhvdyBGYXRhbEVycm9yIGlzIGhhbmRsZWQuXG4gICAgICAgICAgICBpZiAoIXN0ZXBGbiB8fCB0eXBlb2Ygc3RlcEZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBTdGVwTm90UmVnaXN0ZXJlZEVycm9yKHN0ZXBOYW1lKTtcblxuICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAnU3RlcCBmdW5jdGlvbiBub3QgcmVnaXN0ZXJlZCwgZmFpbGluZyBzdGVwIChub3QgcnVuKScsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIuc3RhY2ssXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBGYXRhbEVycm9yIHBhdHRlcm4gLSBmYWlsIHRoZSBzdGVwIGFuZCByZS1xdWV1ZSB3b3JrZmxvd1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSB0cmFuc2l0aW9uZWQgdG8gYSB0ZXJtaW5hbCBzdGF0ZSDigJQgZHVwbGljYXRlXG4gICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvciBjb25jdXJyZW50IGNhbmNlbGxhdGlvbi4gRHJvcCBzaWxlbnRseS5cbiAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAgZm9yIG1pc3NpbmcgZnVuY3Rpb24sIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN0ZXBGYWlsRXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdGVwRmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEZhdGFsRXJyb3IodHJ1ZSksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgd29ya2Zsb3cgdG8gaGFuZGxlIHRoZSBmYWlsZWQgc3RlcFxuICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCByZXNvbHZlZE5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtYXhSZXRyaWVzID0gc3RlcEZuLm1heFJldHJpZXMgPz8gREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTO1xuXG4gICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBNYXhSZXRyaWVzKG1heFJldHJpZXMpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCByZXN1bHQ6IHVua25vd247XG5cbiAgICAgICAgICAgIC8vIENoZWNrIG1heCByZXRyaWVzIEFGVEVSIHN0ZXBfc3RhcnRlZCAoYXR0ZW1wdCB3YXMganVzdCBpbmNyZW1lbnRlZClcbiAgICAgICAgICAgIC8vIHN0ZXAuYXR0ZW1wdCB0cmFja3MgaG93IG1hbnkgdGltZXMgc3RlcF9zdGFydGVkIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIC8vIE5vdGU6IG1heFJldHJpZXMgaXMgdGhlIG51bWJlciBvZiBSRVRSSUVTIGFmdGVyIHRoZSBmaXJzdCBhdHRlbXB0LCBzbyB0b3RhbCBhdHRlbXB0cyA9IG1heFJldHJpZXMgKyAxXG4gICAgICAgICAgICAvLyBVc2UgPiBoZXJlIChub3QgPj0pIGJlY2F1c2UgdGhpcyBndWFyZHMgYWdhaW5zdCByZS1pbnZvY2F0aW9uIEFGVEVSIGFsbCBhdHRlbXB0cyBhcmUgdXNlZC5cbiAgICAgICAgICAgIC8vIFRoZSBwb3N0LWZhaWx1cmUgY2hlY2sgdXNlcyA+PSB0byBkZWNpZGUgd2hldGhlciB0byByZXRyeSBhZnRlciBhIGZhaWx1cmUuXG4gICAgICAgICAgICBpZiAoc3RlcC5hdHRlbXB0ID4gbWF4UmV0cmllcyArIDEpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICAgICAgICAgIC8vIFBlcnNpc3RlZCBtZXNzYWdlIOKAlCBrZXB0IHNob3J0LCBubyBtYWNoaW5lIGBzdGVwTmFtZWAsXG4gICAgICAgICAgICAgIC8vIHNpbmNlIG9ic2VydmFiaWxpdHkgYWxyZWFkeSBhdHRyaWJ1dGVzIHRoZSBldmVudCB0byBhXG4gICAgICAgICAgICAgIC8vIHNwZWNpZmljIHN0ZXAuXG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIGV4Y2VlZGVkIG1heCByZXRyaWVzICgke3JldHJ5Q291bnR9ICR7cGx1cmFsaXplKCdyZXRyeScsICdyZXRyaWVzJywgcmV0cnlDb3VudCl9KWA7XG4gICAgICAgICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgYFN0ZXAgJHtmb3JtYXRTdGVwTmFtZShzdGVwTmFtZSl9IGV4Y2VlZGVkIG1heCByZXRyaWVzICgke3JldHJ5Q291bnR9ICR7cGx1cmFsaXplKCdyZXRyeScsICdyZXRyaWVzJywgcmV0cnlDb3VudCl9KWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSkuXG4gICAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBwcmlvciBhdHRlbXB0J3Mgc2VyaWFsaXplZCBlcnJvciBhcyB0aGUgY2F1c2Ugc29cbiAgICAgICAgICAgICAgLy8gdGhlIHVuZGVybHlpbmcgZmFpbHVyZSBpcyByZWNvdmVyYWJsZSBmcm9tIGBzdGVwLmVycm9yLmNhdXNlYFxuICAgICAgICAgICAgICAvLyBhZnRlciBoeWRyYXRpb24sIHdpdGhvdXQgZm9yY2luZyBjb25zdW1lcnMgdG8gd2FsayB0aGVcbiAgICAgICAgICAgICAgLy8gc3RlcF9yZXRyeWluZyBldmVudCBoaXN0b3J5LiBNaXJyb3JzIHRoZSBwb3N0LWZhaWx1cmUgcGF0aFxuICAgICAgICAgICAgICAvLyBiZWxvdyB0aGF0IHdyYXBzIHRoZSBsaXZlIGBlcnJgIGFzIGNhdXNlLlxuICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICBpZiAoc3RlcC5lcnJvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICh3cmFwcGVkRXJyb3IgYXMgRXJyb3IpLmNhdXNlID0gYXdhaXQgaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5lcnJvcixcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLy8gSWdub3JlOiBiZXN0LWVmZm9ydCBjYXVzZSBhdHRhY2htZW50LCB0aGUgd3JhcHBpbmdcbiAgICAgICAgICAgICAgICAgIC8vIEZhdGFsRXJyb3Igc3RhY2svbWVzc2FnZSBzdGlsbCBzdXJmYWNlIHRoZSBmYWlsdXJlLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHRyYW5zaXRpb25lZCB0byBhIHRlcm1pbmFsIHN0YXRlIOKAlCBkdXBsaWNhdGVcbiAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9yIGNvbmN1cnJlbnQgY29tcGxldGlvbi4gRHJvcCBzaWxlbnRseS5cbiAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5RXhoYXVzdGVkKHRydWUpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgZmFpbGVkIHN0ZXBcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgcmVzb2x2ZWROYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHN0ZXAgaW5wdXQgLS0tXG4gICAgICAgICAgICAvLyBOZXR3b3JrL3NlcnZlciBlcnJvcnMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZXRyeS5cbiAgICAgICAgICAgIC8vIFdvcmtmbG93UnVudGltZUVycm9yIChkYXRhIGludGVncml0eSBpc3N1ZXMpIGFyZSBmYXRhbCDigJQgcmV0cnlpbmdcbiAgICAgICAgICAgIC8vIHdvbid0IGZpeCB0aGVtLCBzbyB3ZSByZS1xdWV1ZSB0aGUgd29ya2Zsb3cgdG8gc3VyZmFjZSB0aGUgZXJyb3IuXG4gICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHN0ZXAgaXMgaW4gdmFsaWQgc3RhdGUgKHBlbmRpbmcvcnVubmluZylcbiAgICAgICAgICAgIC8vIGFuZCByZXR1cm5lZCB0aGUgdXBkYXRlZCBzdGVwIGVudGl0eSB3aXRoIGluY3JlbWVudGVkIGF0dGVtcHRcblxuICAgICAgICAgICAgLy8gc3RlcC5hdHRlbXB0IGlzIG5vdyB0aGUgY3VycmVudCBhdHRlbXB0IG51bWJlciAoYWZ0ZXIgaW5jcmVtZW50KVxuICAgICAgICAgICAgY29uc3QgYXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgICAgICAgaWYgKCFzdGVwLnN0YXJ0ZWRBdCkge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcElkfVwiIGhhcyBubyBcInN0YXJ0ZWRBdFwiIHRpbWVzdGFtcGA7XG4gICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmVycm9yKCdGYXRhbCBydW50aW1lIGVycm9yIGR1cmluZyBzdGVwIHNldHVwJywge1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gUmUtcXVldWUgdGhlIHdvcmtmbG93IHNvIGl0IGNhbiBwcm9jZXNzIHRoZSBzdGVwIGZhaWx1cmVcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgcmVzb2x2ZWROYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENhcHR1cmUgc3RhcnRlZEF0IGZvciB1c2UgaW4gYXN5bmMgY2FsbGJhY2sgKFR5cGVTY3JpcHQgbmFycm93aW5nIGRvZXNuJ3QgcGVyc2lzdClcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBTdGFydGVkQXQgPSBzdGVwLnN0YXJ0ZWRBdDtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgbm93IHRoYXQgd2UncmUgY29tbWl0dGVkIHRvIHJ1bm5pbmdcbiAgICAgICAgICAgIC8vIHVzZXIgY29kZTogaW5wdXQgaHlkcmF0aW9uIG5lZWRzIGl0LCBhbmQgYGNvbnRleHRTdG9yYWdlYCAoYW5kXG4gICAgICAgICAgICAvLyBhbnkgdXNlci1jb2RlIHBhdGhzIHRoYXQgcnVuIGluc2lkZSBpdCkgY2FwdHVyZSB0aGUgcmVzb2x2ZWRcbiAgICAgICAgICAgIC8vIHZhbHVlLiBUcmlnZ2VycyB0aGUgdW5kZXJseWluZyB3b3JsZCAvIEtNUyBmZXRjaCBvbmNlLCB3aXRoXG4gICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGRlaHlkcmF0ZSBwYXRocyByZXVzaW5nIHRoZSBtZW1vaXplZCByZXN1bHQuXG4gICAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gICAgICAgICAgICAvLyBIeWRyYXRlIHRoZSBzdGVwIGlucHV0IGFyZ3VtZW50cywgY2xvc3VyZSB2YXJpYWJsZXMsIGFuZCB0aGlzVmFsXG4gICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGNhcHR1cmVzIG9ubHkgdGhlIHN5bmNocm9ub3VzIHBvcnRpb24gb2YgaHlkcmF0aW9uLiBBbnkgYXN5bmNcbiAgICAgICAgICAgIC8vIG9wZXJhdGlvbnMgKGUuZy4sIHN0cmVhbSBsb2FkaW5nKSBhcmUgYWRkZWQgdG8gYG9wc2AgYW5kIGV4ZWN1dGVkIGxhdGVyXG4gICAgICAgICAgICAvLyB2aWEgUHJvbWlzZS5hbGwob3BzKSAtIHRoZWlyIHRpbWluZyBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBtZWFzdXJlbWVudC5cbiAgICAgICAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICAgICAgICAvLyBPcHMgdGhhdCBtdXN0IGJlIGR1cmFibHkgY29tbWl0dGVkIGJlZm9yZSBzdGVwIGNvbXBsZXRpb24gKGUuZy4gYVxuICAgICAgICAgICAgLy8gc3RlcC1pbml0aWF0ZWQgYWJvcnQncyBob29rX3JlY2VpdmVkIGV2ZW50KS4gU2VlIFN0ZXBDb250ZXh0LlxuICAgICAgICAgICAgY29uc3QgcHJlQ29tcGxldGlvbk9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICAgICAgICBjb25zdCBoeWRyYXRlZElucHV0ID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICdzdGVwLmh5ZHJhdGUnLFxuICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgYXN5bmMgKGh5ZHJhdGVTcGFuKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgICAgIHN0ZXAuaW5wdXQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lEXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICBoeWRyYXRlU3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEFyZ3VtZW50c0NvdW50KHJlc3VsdC5hcmdzLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVEZXNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gaHlkcmF0ZWRJbnB1dC5hcmdzO1xuICAgICAgICAgICAgY29uc3QgdGhpc1ZhbCA9IGh5ZHJhdGVkSW5wdXQudGhpc1ZhbCA/PyBudWxsO1xuXG4gICAgICAgICAgICAvLyAtLS0gVXNlciBjb2RlIGV4ZWN1dGlvbiAtLS1cbiAgICAgICAgICAgIC8vIE9ubHkgZXJyb3JzIGZyb20gc3RlcEZuLmFwcGx5KCkgKHVzZXIgc3RlcCBjb2RlKSBzaG91bGQgcHJvZHVjZVxuICAgICAgICAgICAgLy8gc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZy4gSW5mcmFzdHJ1Y3R1cmUgZXJyb3JzIChuZXR3b3JrLCBzZXJ2ZXIpXG4gICAgICAgICAgICAvLyBtdXN0IHByb3BhZ2F0ZSB0byB0aGUgcXVldWUgaGFuZGxlciBmb3IgYXV0b21hdGljIHJldHJ5LlxuICAgICAgICAgICAgbGV0IHVzZXJDb2RlRXJyb3I6IHVua25vd247XG4gICAgICAgICAgICBsZXQgdXNlckNvZGVGYWlsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYWNlKCdzdGVwLmV4ZWN1dGUnLCB7fSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0U3RvcmFnZS5ydW4oXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwU3RhcnRlZEF0OiBuZXcgRGF0ZSgrc3RlcFN0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiBuZXcgRGF0ZSgrd29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIHVybDogd29ya2Zsb3dCYXNlVXJsLFxuICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogcHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQsXG4gICAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgICAgcHJlQ29tcGxldGlvbk9wcyxcbiAgICAgICAgICAgICAgICAgICAgY2xvc3VyZVZhcnM6IGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgKCkgPT4gc3RlcEZuLmFwcGx5KHRoaXNWYWwsIGFyZ3MpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgdXNlckNvZGVFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgdXNlckNvZGVGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uVGltZU1zID0gRGF0ZS5ub3coKSAtIGV4ZWN1dGlvblN0YXJ0VGltZTtcblxuICAgICAgICAgICAgY2FuY2VsQWJvcnRSZWFkZXJzKC4uLmFyZ3MsIHRoaXNWYWwsIGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMpO1xuXG4gICAgICAgICAgICAvLyBDb21taXQgbXVzdC1iZS1kdXJhYmxlIG9wcyAoZS5nLiBhIHN0ZXAtaW5pdGlhdGVkIGFib3J0J3NcbiAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgZXZlbnQpIGJlZm9yZSB3cml0aW5nIHN0ZXBfY29tcGxldGVkL3N0ZXBfZmFpbGVkLFxuICAgICAgICAgICAgLy8gc28gYW55IHdvcmtmbG93IGNvbnRpbnVhdGlvbiB0cmlnZ2VyZWQgYnkgdGhhdCBldmVudCBvYnNlcnZlcyB0aGVcbiAgICAgICAgICAgIC8vIGFib3J0IHJhdGhlciB0aGFuIHJhY2luZyBpdC4gUHJvZHVjZXJzIHN3YWxsb3cgdGhlaXIgb3duIGVycm9yc1xuICAgICAgICAgICAgLy8gcGVyIHRoZSBuby1yZWplY3QgY29udHJhY3Qgb24gU3RlcENvbnRleHQucHJlQ29tcGxldGlvbk9wczsgdGhlXG4gICAgICAgICAgICAvLyBgLmNhdGNoKClgIGRlZmVuZHMgaXQsIHNpbmNlIHRoaXMgYXdhaXQgc2l0cyBvdXRzaWRlIHRoZVxuICAgICAgICAgICAgLy8gdXNlci1jb2RlIHRyeS9jYXRjaCAoYSBzdHJheSByZWplY3Rpb24gaGVyZSB3b3VsZCBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIHN1cmZhY2UgYXMgYW4gaW5mcmEgZXJyb3Ig4oaSIHF1ZXVlIHJlLWRlbGl2ZXJ5LCBub3QgYSBzdGVwXG4gICAgICAgICAgICAvLyBmYWlsdXJlKS4gVGhlIGF3YWl0IG9ubHkgZW5mb3JjZXMgb3JkZXJpbmcuXG4gICAgICAgICAgICBpZiAocHJlQ29tcGxldGlvbk9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByZUNvbXBsZXRpb25PcHMpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5RdWV1ZUV4ZWN1dGlvblRpbWVNcyhleGVjdXRpb25UaW1lTXMpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIC0tLSBEZWh5ZHJhdGUgKHNlcmlhbGl6ZSkgdGhlIHN0ZXAncyByZXR1cm4gdmFsdWUgLS0tXG4gICAgICAgICAgICAvLyBBIG5vbi1zZXJpYWxpemFibGUgcmV0dXJuIHZhbHVlIGlzIGEgdXNlci1jb2RlIGJ1Zywgbm90IGFuXG4gICAgICAgICAgICAvLyBpbmZyYXN0cnVjdHVyZSBmYWlsdXJlLiBSb3V0ZSBpdCB0aHJvdWdoIHRoZSBzYW1lIHN0ZXAtZmFpbHVyZVxuICAgICAgICAgICAgLy8gcGF0aCBhcyBhIHRocm93biBlcnJvciBzbyBTZXJpYWxpemF0aW9uRXJyb3IgKHdoaWNoIGlzIG1hcmtlZFxuICAgICAgICAgICAgLy8gYGZhdGFsOiB0cnVlYCkgc2hvcnQtY2lyY3VpdHMgdGhlIHJldHJ5IGxvb3AgaW5zdGVhZCBvZlxuICAgICAgICAgICAgLy8gYnViYmxpbmcgYXMgYW4gSFRUUCA1MDAgYW5kIGJ1cm5pbmcgdGhyb3VnaCBhbGwgNCBxdWV1ZVxuICAgICAgICAgICAgLy8gZGVsaXZlcmllcyBvbiBhIGd1YXJhbnRlZWQtdG8tZmFpbCBtZXNzYWdlLlxuICAgICAgICAgICAgaWYgKCF1c2VyQ29kZUZhaWxlZCkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYWNlKFxuICAgICAgICAgICAgICAgICAgJ3N0ZXAuZGVoeWRyYXRlJyxcbiAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgYXN5bmMgKGRlaHlkcmF0ZVNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCByZXR1cm4gdmFsdWVzIGFyZSBjb25zdW1lZCBieSB0aGUgd29ya2Zsb3cgVk1cbiAgICAgICAgICAgICAgICAgICAgLy8gcnVubmluZyBvbiB0aGlzIHNhbWUgZGVwbG95bWVudCAodmVyc2lvbiBza2V3XG4gICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3Rpb24gZW5zdXJlcyBpdCkuIEJ5dGUtc3RyZWFtIGZyYW1pbmcgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmVmb3JlIGFsd2F5cyBzYWZlIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlaHlkcmF0ZWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgICAgICAgICBkZWh5ZHJhdGVTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVTZXJpYWxpemVUaW1lTXMoZHVyYXRpb25NcyksXG4gICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXN1bHRUeXBlKHR5cGVvZiBkZWh5ZHJhdGVkKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWh5ZHJhdGVkO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHVzZXJDb2RlRXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgdXNlckNvZGVGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIC0tLSBIYW5kbGUgdXNlciBjb2RlIGVycm9ycyAtLS1cbiAgICAgICAgICAgIGlmICh1c2VyQ29kZUZhaWxlZCkge1xuICAgICAgICAgICAgICBjb25zdCBlcnIgPSB1c2VyQ29kZUVycm9yO1xuXG4gICAgICAgICAgICAgIC8vIEluZnJhc3RydWN0dXJlIGVycm9ycyB0aGF0IHNvbWVob3cgc3VyZmFjZWQgdGhyb3VnaCB1c2VyIGNvZGVcbiAgICAgICAgICAgICAgLy8gc2hvdWxkIHByb3BhZ2F0ZSB0byB0aGUgcXVldWUgaGFuZGxlciBmb3IgcmV0cnksIG5vdCBjb25zdW1lXG4gICAgICAgICAgICAgIC8vIHN0ZXAgYXR0ZW1wdHMuXG4gICAgICAgICAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgc28gbm8tb3BcbiAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcnVuIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBzdGVwJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIGVyci5zdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gQWJvcnQgZmFpbHVyZXMgY2FuIGNyb3NzIFZNL3NlcmlhbGl6YXRpb24gcmVhbG1zLCB3aGVyZVxuICAgICAgICAgICAgICAvLyBgaW5zdGFuY2VvZiBFcnJvcmAgaXMgbm90IHJlbGlhYmxlLlxuICAgICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVFcnIgPSBwcm9tb3RlQWJvcnRFcnJvclRvRmF0YWwoZXJyKTtcbiAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID0gYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKGVmZmVjdGl2ZUVycik7XG4gICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdGFjayA9XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLnN0YWNrIHx8IGdldEVycm9yU3RhY2soZWZmZWN0aXZlRXJyKSB8fCAnJztcblxuICAgICAgICAgICAgICAvLyBSZWNvcmQgZXhjZXB0aW9uIGZvciBPVEVMIGVycm9yIHRyYWNraW5nXG4gICAgICAgICAgICAgIGlmIChlZmZlY3RpdmVFcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHNwYW4/LnJlY29yZEV4Y2VwdGlvbj8uKGVmZmVjdGl2ZUVycik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgZXJyb3IgY2F0ZWdvcnkgYW5kIHJldHJ5YWJpbGl0eVxuICAgICAgICAgICAgICBjb25zdCBpc0ZhdGFsID0gRmF0YWxFcnJvci5pcyhlZmZlY3RpdmVFcnIpO1xuICAgICAgICAgICAgICBjb25zdCBpc1JldHJ5YWJsZSA9IFJldHJ5YWJsZUVycm9yLmlzKGVmZmVjdGl2ZUVycik7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yQ2F0ZWdvcnkgPSBpc0ZhdGFsXG4gICAgICAgICAgICAgICAgPyAnZmF0YWwnXG4gICAgICAgICAgICAgICAgOiBpc1JldHJ5YWJsZVxuICAgICAgICAgICAgICAgICAgPyAncmV0cnlhYmxlJ1xuICAgICAgICAgICAgICAgICAgOiAndHJhbnNpZW50JztcblxuICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEVycm9yTmFtZShnZXRFcnJvck5hbWUoZWZmZWN0aXZlRXJyKSksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBFcnJvck1lc3NhZ2Uobm9ybWFsaXplZEVycm9yLm1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZ2V0RXJyb3JOYW1lKGVmZmVjdGl2ZUVycikpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvckNhdGVnb3J5KGVycm9yQ2F0ZWdvcnkpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclJldHJ5YWJsZSghaXNGYXRhbCksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmIChpc0ZhdGFsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBkZXNjcmliZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJpZW5kbHlTdGVwID0gZm9ybWF0U3RlcE5hbWUoc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1pbmcgPVxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uYXR0cmlidXRpb24gPT09ICdzZGsnXG4gICAgICAgICAgICAgICAgICAgID8gYFN0ZXAgJHtmcmllbmRseVN0ZXB9IGZhaWxlZCB3aXRoIGEgRmF0YWxFcnJvciBmcm9tIHRoZSBTREsgcnVudGltZSDigJQgYnViYmxpbmcgdXAgdG8gcGFyZW50IHdvcmtmbG93YFxuICAgICAgICAgICAgICAgICAgICA6IGBTdGVwICR7ZnJpZW5kbHlTdGVwfSB0aHJldyBhIEZhdGFsRXJyb3Ig4oCUIGJ1YmJsaW5nIHVwIHRvIHBhcmVudCB3b3JrZmxvd2A7XG4gICAgICAgICAgICAgICAgLy8gTWlycm9yIHRoZSB3b3JrZmxvdy1sZXZlbCBsb2cgZm9ybWF0dGluZzogcHV0IHRoZSBmcmFtaW5nICtcbiAgICAgICAgICAgICAgICAvLyBzdGFjayBpbnRvIHRoZSBtZXNzYWdlIHNvIGNvbnNvbGUuZXJyb3IgcmVuZGVycyB0aGUgc3RhY2tcbiAgICAgICAgICAgICAgICAvLyBpbmxpbmUsIGFuZCBrZWVwIHRoZSBtZXRhZGF0YSBvYmplY3Qgc21hbGwgd2l0aCBvbmx5IHRoZVxuICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZWQgZmllbGRzIHRoYXQgbG9nIGRyYWlucyB3YW50IHRvIGluZGV4LlxuICAgICAgICAgICAgICAgIC8vIE5vIGBoaW50YCBmaWVsZCBoZXJlIOKAlCBhY3Rpb25hYmxlIGhpbnQgdGV4dCBsaXZlcyBvbiB0aGVcbiAgICAgICAgICAgICAgICAvLyBlcnJvciBtZXNzYWdlIGl0c2VsZiAoc28gaXQgc3Vydml2ZXMgc2VyaWFsaXphdGlvbiDihpJcbiAgICAgICAgICAgICAgICAvLyBldmVudCBsb2cg4oaSIG9ic2VydmFiaWxpdHkgcmVoeWRyYXRlKSwgYW5kIGFkZGluZyBpdFxuICAgICAgICAgICAgICAgIC8vIGFnYWluIGhlcmUganVzdCBkdXBsaWNhdGVzIGl0IG9uIHN0ZGVyci5cbiAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgYCR7ZnJhbWluZ31cXG4ke25vcm1hbGl6ZWRTdGFjayB8fCBub3JtYWxpemVkRXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICBlcnJvckF0dHJpYnV0aW9uOiBkZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBub3JtYWxpemVkRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBub3JtYWxpemVkRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSkuXG4gICAgICAgICAgICAgICAgLy8gUGVyc2lzdCB0aGUgcHJvbW90ZWQgRmF0YWxFcnJvciBmb3IgYWJvcnRzIHNvIHRoZSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdyBjYW4gZGlzdGluZ3Vpc2ggY2FuY2VsbGF0aW9uIGZyb20gcmV0cnkgZXhoYXVzdGlvbi5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVFcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbkZvclN0ZXAoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIOKAlCBpZGVtcG90ZW50LlxuICAgICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdGVwRmFpbEVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdGVwRmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEZhdGFsRXJyb3IodHJ1ZSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4UmV0cmllcyA9XG4gICAgICAgICAgICAgICAgICBzdGVwRm4ubWF4UmV0cmllcyA/PyBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVM7XG4gICAgICAgICAgICAgICAgLy8gc3RlcC5hdHRlbXB0IHdhcyBpbmNyZW1lbnRlZCBieSBzdGVwX3N0YXJ0ZWQsIHVzZSBpdCBoZXJlXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEF0dGVtcHQgPSBzdGVwLmF0dGVtcHQ7XG5cbiAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXR0ZW1wdChjdXJyZW50QXR0ZW1wdCksXG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcE1heFJldHJpZXMobWF4UmV0cmllcyksXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBtYXhSZXRyaWVzIGlzIHRoZSBudW1iZXIgb2YgUkVUUklFUyBhZnRlciB0aGUgZmlyc3QgYXR0ZW1wdCwgc28gdG90YWwgYXR0ZW1wdHMgPSBtYXhSZXRyaWVzICsgMVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QXR0ZW1wdCA+PSBtYXhSZXRyaWVzICsgMSkge1xuICAgICAgICAgICAgICAgICAgLy8gTWF4IHJldHJpZXMgcmVhY2hlZFxuICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGRlc2NyaWJlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZyaWVuZGx5U3RlcCA9IGZvcm1hdFN0ZXBOYW1lKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1pbmcgPVxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbiA9PT0gJ3NkaydcbiAgICAgICAgICAgICAgICAgICAgICA/IGBTdGVwICR7ZnJpZW5kbHlTdGVwfSBoaXQgbWF4IHJldHJpZXMgb24gYW4gU0RLIHJ1bnRpbWUgZXJyb3Ig4oCUIGJ1YmJsaW5nIHRvIHBhcmVudCB3b3JrZmxvd2BcbiAgICAgICAgICAgICAgICAgICAgICA6IGBTdGVwICR7ZnJpZW5kbHlTdGVwfSBoaXQgbWF4IHJldHJpZXMg4oCUIGJ1YmJsaW5nIGVycm9yIHRocm93biBieSB5b3VyIHN0ZXAgdG8gdGhlIHBhcmVudCB3b3JrZmxvd2A7XG4gICAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgJHtmcmFtaW5nfVxcbiR7bm9ybWFsaXplZFN0YWNrIHx8IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogZGVzY3JpcHRpb24uYXR0cmlidXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBub3JtYWxpemVkRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgbWFjaGluZSBzdGVwIG5hbWUgaW4gdGhlIHBlcnNpc3RlZFxuICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSDigJQgb2JzZXJ2YWJpbGl0eSBhbHJlYWR5IHNob3dzIHdoaWNoIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VkIHRoZSBldmVudCwgYW5kIGBzdGVwTmFtZTogJ3N0ZXAvLy4vLi4uL2ZvbydgXG4gICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgdGl0bGUgaXMganVzdCBub2lzZS4gVGhlIENMSSBsb2dnZXIgcmVuZGVyc1xuICAgICAgICAgICAgICAgICAgLy8gYFN0ZXAgZm9vICguLy4uLikgaGl0IG1heCByZXRyaWVzYCBzZXBhcmF0ZWx5LlxuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFN0ZXAgZmFpbGVkIGFmdGVyICR7bWF4UmV0cmllc30gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCBtYXhSZXRyaWVzKX06ICR7bm9ybWFsaXplZEVycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSkuXG4gICAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBvcmlnaW5hbCBlcnJvciB3aXRoIGEgRmF0YWxFcnJvciB0aGF0IHByZXNlcnZlc1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIHdyYXBwZWQgbWVzc2FnZSBwbHVzIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGBjYXVzZWAgc28gaXQncyByZWNvdmVyYWJsZSBhZnRlciBoeWRyYXRpb24uXG4gICAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgKHdyYXBwZWRFcnJvciBhcyBFcnJvcikuY2F1c2UgPSBlcnI7XG4gICAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFN0YWNrKSB3cmFwcGVkRXJyb3Iuc3RhY2sgPSBub3JtYWxpemVkU3RhY2s7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbkZvclN0ZXAoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSDigJQgaWRlbXBvdGVudC5cbiAgICAgICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdGVwRmFpbEVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gTm90IGF0IG1heCByZXRyaWVzIHlldCAtIGxvZyBhcyBhIHJldHJ5YWJsZSBlcnJvclxuICAgICAgICAgICAgICAgICAgaWYgKFJldHJ5YWJsZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcExvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICdFbmNvdW50ZXJlZCBSZXRyeWFibGVFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdFbmNvdW50ZXJlZCBFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogbm9ybWFsaXplZEVycm9yLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBub3JtYWxpemVkRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gU2V0IHN0ZXAgdG8gcGVuZGluZyBmb3IgcmV0cnkgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfcmV0cnlpbmcgcmVjb3JkcyB0aGUgZXJyb3IgYW5kIHNldHMgc3RhdHVzIHRvIHBlbmRpbmcuXG4gICAgICAgICAgICAgICAgICAvLyBTZXJpYWxpemUgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSBzbyBpdHMgZnVsbCB0eXBlIGlkZW50aXR5XG4gICAgICAgICAgICAgICAgICAvLyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgcm91bmQtdHJpcCB0aHJvdWdoIHRoZSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uRm9yU3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihSZXRyeWFibGVFcnJvci5pcyhlcnIpICYmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeUFmdGVyOiBlcnIucmV0cnlBZnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcFJldHJ5RXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBSZXRyeUVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUg4oCUIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCByZXRyeWluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN0ZXBSZXRyeUVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHN0ZXBSZXRyeUVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZXBSZXRyeUVycjtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgICAgUmV0cnlhYmxlRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgID8gTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoK2Vyci5yZXRyeUFmdGVyLmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMTAwMFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIDogMVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlUaW1lb3V0U2Vjb25kcyh0aW1lb3V0U2Vjb25kcyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlXaWxsUmV0cnkodHJ1ZSksXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgLy8gQWRkIHNwYW4gZXZlbnQgZm9yIHJldHJ5IHNjaGVkdWxpbmdcbiAgICAgICAgICAgICAgICAgIHNwYW4/LmFkZEV2ZW50Py4oJ3JldHJ5LnNjaGVkdWxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgJ3JldHJ5LnRpbWVvdXRfc2Vjb25kcyc6IHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAncmV0cnkuYXR0ZW1wdCc6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAncmV0cnkubWF4X3JldHJpZXMnOiBtYXhSZXRyaWVzLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEl0J3MgYSByZXRyeWFibGUgZXJyb3IgLSBzbyBoYXZlIHRoZSBxdWV1ZSBrZWVwIHRoZSBtZXNzYWdlIHZpc2libGVcbiAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgaXQgZ2V0cyByZXRyaWVkLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgZmFpbGVkL3JldHJ5aW5nIHN0ZXBcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgcmVzb2x2ZWROYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBjb21wbGV0ZSB0aGUgc3RlcCAtLS1cbiAgICAgICAgICAgIC8vIEVycm9ycyBoZXJlIChuZXR3b3JrIGZhaWx1cmVzLCBzZXJ2ZXIgZXJyb3JzKSBwcm9wYWdhdGUgdG8gdGhlXG4gICAgICAgICAgICAvLyBxdWV1ZSBoYW5kbGVyIGZvciBhdXRvbWF0aWMgcmV0cnkuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gTk9URTogTm9uZSBvZiB0aGUgY29kZSBmcm9tIHRoaXMgcG9pbnQgaXMgZ3VhcmFudGVlZCB0byBydW4uXG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgc3RlcCBtaWdodCBmYWlsIG9yIGNhdXNlIGEgZnVuY3Rpb24gdGltZW91dCBhbmQgdGhlXG4gICAgICAgICAgICAvLyBwcm9jZXNzIG1pZ2h0IGJlIFNJR0tJTEwnZCwgdGhlIHdvcmtmbG93IHJ1bnRpbWUgbXVzdCBiZVxuICAgICAgICAgICAgLy8gcmVzaWxpZW50IHRvIHRoZSBiZWxvdyBjb2RlIG5vdCBleGVjdXRpbmcgb24gYSBmYWlsZWQgc3RlcC5cbiAgICAgICAgICAgIC8vIChEZWh5ZHJhdGlvbiBhbHJlYWR5IGhhcHBlbmVkIGFib3ZlIGFuZCBpcyBhY2NvdW50ZWQgZm9yIGluIHRoZVxuICAgICAgICAgICAgLy8gdXNlckNvZGVGYWlsZWQgcGF0aC4pXG4gICAgICAgICAgICAvLyBUaGVzZSBzdHJlYW0gb3BzIGFyZSBmbHVzaGVkIGluIHRoZSBiYWNrZ3JvdW5kOyB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgLy8gaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZCB3YWl0VW50aWxcbiAgICAgICAgICAgIC8vIHJlamVjdGlvbiBjcmFzaGVzIHRoZSBwcm9jZXNzIGFzIHVuaGFuZGxlZFJlamVjdGlvbiksIHNvXG4gICAgICAgICAgICAvLyB1bmV4cGVjdGVkIGZhaWx1cmVzIGFyZSBsb2dnZWQgaW5zdGVhZC5cbiAgICAgICAgICAgIHNhZmVXYWl0VW50aWwoUHJvbWlzZS5hbGwob3BzKSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICdCYWNrZ3JvdW5kIGZsdXNoIG9mIHN0ZXAgc3RyZWFtIG9wcyBmYWlsZWQnLFxuICAgICAgICAgICAgICAgIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUnVuIHN0ZXBfY29tcGxldGVkIGFuZCB0cmFjZSBzZXJpYWxpemF0aW9uIGNvbmN1cnJlbnRseTtcbiAgICAgICAgICAgIC8vIHRoZSB0cmFjZSBjYXJyaWVyIGlzIHVzZWQgaW4gdGhlIGZpbmFsIHF1ZXVlTWVzc2FnZSBjYWxsIGJlbG93XG4gICAgICAgICAgICBsZXQgc3RlcENvbXBsZXRlZDQwOSA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgWywgdHJhY2VDYXJyaWVyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgd29ybGQuZXZlbnRzXG4gICAgICAgICAgICAgICAgLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0IGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUg4oCUIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGNvbXBsZXRpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBDb21wbGV0ZWQ0MDkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBpZiAoc3RlcENvbXBsZXRlZDQwOSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnY29tcGxldGVkJyksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmVzdWx0VHlwZSh0eXBlb2YgcmVzdWx0KSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBRdWV1ZSB0aGUgd29ya2Zsb3cgY29udGludWF0aW9uIHdpdGggdGhlIGNvbmN1cnJlbnRseS1yZXNvbHZlZCB0cmFjZSBjYXJyaWVyXG4gICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIHJlc29sdmVkTmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbn1cblxuY29uc3Qgc3RlcEhhbmRsZXIgPSBjcmVhdGVTdGVwSGFuZGxlcigpO1xuXG4vKipcbiAqIEEgc2luZ2xlIHJvdXRlIHRoYXQgaGFuZGxlcyBhbnkgc3RlcCBleGVjdXRpb24gcmVxdWVzdCBhbmQgcm91dGVzIHRvIHRoZVxuICogYXBwcm9wcmlhdGUgc3RlcCBmdW5jdGlvbi4gV2UgbWF5IGV2ZW50dWFsbHkgd2FudCB0byBjcmVhdGUgZGlmZmVyZW50IGJ1bmRsZXNcbiAqIGZvciBlYWNoIHN0ZXAsIHRoaXMgaXMgdGVtcG9yYXJ5LlxuICovXG5sZXQgY2FjaGVkU3RlcEhhbmRsZXI6ICgocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPikgfCB1bmRlZmluZWQ7XG5leHBvcnQgY29uc3Qgc3RlcEVudHJ5cG9pbnQ6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+ID1cbiAgLyogQF9fUFVSRV9fICovIHdpdGhIZWFsdGhDaGVjayhhc3luYyAocmVxKSA9PiB7XG4gICAgaWYgKCFjYWNoZWRTdGVwSGFuZGxlcikge1xuICAgICAgY2FjaGVkU3RlcEhhbmRsZXIgPSBzdGVwSGFuZGxlcihhd2FpdCBnZXRXb3JsZEhhbmRsZXJzKCkpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkU3RlcEhhbmRsZXIocmVxKTtcbiAgfSk7XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,OAAO,EAGL,KAAK,cAAc,EAGnB,KAAK,WAAW,EAChB,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAGV,uBAAuB,EAEvB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAOtB,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,4DAA4D;IAC5D,YAAY,EAAE,uBAAuB,EAAE,CAAC;IACxC;;;;;;;OAOG;IACH,yBAAyB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC;;;;;;;;;;;;OAYG;IACH,eAAe,EAAE,KAAK,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,cAAc,CAAC;KACjC,CAAC,CAAC;IACH;;;;;;OAMG;IACH,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;IACzB,wFAAwF;IACxF,sBAAsB,EAAE,OAAO,CAAC;IAChC,wEAAwE;IACxE,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;;OAMG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB;AAgED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,EACrC,UAAU,EACV,KAAK,EACL,GAAG,EACH,IAAI,EACJ,SAAS,EACT,eAAe,GAChB,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAyd5D"}
1
+ {"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAQ/C,OAAO,EAGL,KAAK,cAAc,EAGnB,KAAK,WAAW,EAChB,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAGV,uBAAuB,EAEvB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAOtB,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,4DAA4D;IAC5D,YAAY,EAAE,uBAAuB,EAAE,CAAC;IACxC;;;;;;;OAOG;IACH,yBAAyB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC;;;;;;;;;;;;OAYG;IACH,eAAe,EAAE,KAAK,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,cAAc,CAAC;KACjC,CAAC,CAAC;IACH;;;;;;OAMG;IACH,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;IACzB,wFAAwF;IACxF,sBAAsB,EAAE,OAAO,CAAC;IAChC,wEAAwE;IACxE,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;;OAMG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB;AAgED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,EACrC,UAAU,EACV,KAAK,EACL,GAAG,EACH,IAAI,EACJ,SAAS,EACT,eAAe,GAChB,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA0e5D"}