@workflow/core 5.0.0-beta.5 → 5.0.0-beta.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/attribute-changes.d.ts +5 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +35 -2
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +74 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +32 -0
- package/dist/class-serialization.d.ts.map +1 -1
- package/dist/class-serialization.js +37 -1
- package/dist/classify-error.d.ts +19 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +98 -6
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +8 -6
- package/dist/create-hook.d.ts +72 -7
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +97 -12
- package/dist/encryption.d.ts +38 -4
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +96 -14
- package/dist/events-consumer.d.ts +297 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +673 -42
- package/dist/flushable-stream.d.ts +97 -1
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +291 -11
- package/dist/global.d.ts +36 -2
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -6
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +19 -12
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +10 -6
- package/dist/private.d.ts +226 -9
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +626 -7
- package/dist/replay-divergence.d.ts +25 -0
- package/dist/replay-divergence.d.ts.map +1 -0
- package/dist/replay-divergence.js +61 -0
- package/dist/replay-payload-cache.d.ts +64 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +158 -0
- package/dist/runtime/compute-instance.d.ts +13 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +14 -0
- package/dist/runtime/constants.d.ts +315 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +502 -16
- package/dist/runtime/count-step-started-events.d.ts +52 -0
- package/dist/runtime/count-step-started-events.d.ts.map +1 -0
- package/dist/runtime/count-step-started-events.js +72 -0
- package/dist/runtime/deployment-guard.d.ts +99 -0
- package/dist/runtime/deployment-guard.d.ts.map +1 -0
- package/dist/runtime/deployment-guard.js +154 -0
- package/dist/runtime/get-port-lazy.d.ts +15 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +75 -6
- package/dist/runtime/get-world-lazy.d.ts +5 -14
- package/dist/runtime/get-world-lazy.d.ts.map +1 -1
- package/dist/runtime/get-world-lazy.js +19 -29
- package/dist/runtime/helpers.d.ts +415 -29
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +686 -57
- package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
- package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
- package/dist/runtime/quickjs-assets.generated.js +30 -0
- package/dist/runtime/quickjs-entrypoint.d.ts +158 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1863 -0
- package/dist/runtime/quickjs-log-view.d.ts +129 -0
- package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
- package/dist/runtime/quickjs-log-view.js +229 -0
- package/dist/runtime/quickjs-runtime.d.ts +244 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2427 -0
- package/dist/runtime/quickjs-serde.d.ts +107 -0
- package/dist/runtime/quickjs-serde.d.ts.map +1 -0
- package/dist/runtime/quickjs-serde.js +2159 -0
- package/dist/runtime/replay-budget.d.ts +97 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +139 -0
- package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
- package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
- package/dist/runtime/replay-recovery-reporter.js +64 -0
- package/dist/runtime/resume-hook.d.ts +91 -8
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +512 -89
- package/dist/runtime/resume-latency.d.ts +150 -0
- package/dist/runtime/resume-latency.d.ts.map +1 -0
- package/dist/runtime/resume-latency.js +155 -0
- package/dist/runtime/run-id-time.d.ts +19 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -0
- package/dist/runtime/run-id-time.js +42 -0
- package/dist/runtime/run.d.ts +72 -7
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +280 -53
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +126 -16
- package/dist/runtime/start.d.ts +101 -2
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +352 -61
- package/dist/runtime/step-executor.d.ts +186 -5
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +768 -130
- package/dist/runtime/step-latency.d.ts +220 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +215 -0
- package/dist/runtime/step-ownership.d.ts +72 -0
- package/dist/runtime/step-ownership.d.ts.map +1 -0
- package/dist/runtime/step-ownership.js +114 -0
- package/dist/runtime/step-single-flight.d.ts +12 -0
- package/dist/runtime/step-single-flight.d.ts.map +1 -0
- package/dist/runtime/step-single-flight.js +75 -0
- package/dist/runtime/suspension-handler.d.ts +247 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +1304 -125
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +44 -0
- package/dist/runtime/vm-mode.d.ts.map +1 -0
- package/dist/runtime/vm-mode.js +62 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
- package/dist/runtime/vm-serde-bundle.generated.js +16 -0
- package/dist/runtime/wait-continuation.d.ts +106 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +136 -0
- package/dist/runtime/wait-until.d.ts +18 -0
- package/dist/runtime/wait-until.d.ts.map +1 -0
- package/dist/runtime/wait-until.js +42 -0
- package/dist/runtime/world-compatibility.d.ts +32 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +44 -0
- package/dist/runtime/world-init.d.ts +17 -42
- package/dist/runtime/world-init.d.ts.map +1 -1
- package/dist/runtime/world-init.js +18 -43
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +75 -19
- package/dist/runtime.d.ts +10 -6
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3911 -489
- package/dist/sealed-box.d.ts +167 -0
- package/dist/sealed-box.d.ts.map +1 -0
- package/dist/sealed-box.js +571 -0
- package/dist/serialization/client.d.ts +3 -3
- package/dist/serialization/client.d.ts.map +1 -1
- package/dist/serialization/client.js +8 -4
- package/dist/serialization/codec-devalue-vm.d.ts +16 -0
- package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
- package/dist/serialization/codec-devalue-vm.js +148 -0
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.d.ts.map +1 -1
- package/dist/serialization/codec-devalue.js +24 -6
- package/dist/serialization/codec.d.ts +37 -2
- package/dist/serialization/codec.d.ts.map +1 -1
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +105 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +261 -0
- package/dist/serialization/encryption.d.ts +119 -17
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +152 -17
- package/dist/serialization/errors.d.ts +13 -0
- package/dist/serialization/errors.d.ts.map +1 -1
- package/dist/serialization/errors.js +20 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +156 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +538 -0
- package/dist/serialization/index.d.ts +10 -8
- package/dist/serialization/index.d.ts.map +1 -1
- package/dist/serialization/index.js +10 -8
- package/dist/serialization/reducers/class-vm.d.ts +20 -0
- package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/class-vm.js +77 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -1
- package/dist/serialization/reducers/class.js +11 -6
- package/dist/serialization/reducers/common-vm.d.ts +15 -0
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/common-vm.js +616 -0
- package/dist/serialization/reducers/common.d.ts +1 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +202 -62
- package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
- package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function-vm.js +97 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -1
- package/dist/serialization/reducers/step-function.js +25 -9
- package/dist/serialization/step.d.ts +4 -4
- package/dist/serialization/step.d.ts.map +1 -1
- package/dist/serialization/step.js +9 -5
- package/dist/serialization/types.d.ts +80 -1
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +15 -1
- package/dist/serialization/workflow-vm.d.ts +29 -0
- package/dist/serialization/workflow-vm.d.ts.map +1 -0
- package/dist/serialization/workflow-vm.js +74 -0
- package/dist/serialization-format.d.ts +64 -8
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +225 -73
- package/dist/serialization.d.ts +262 -34
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +1885 -277
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +60 -0
- package/dist/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +154 -10
- package/dist/step/context-storage.d.ts +63 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +80 -13
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +148 -27
- package/dist/symbols.d.ts +50 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +51 -1
- package/dist/telemetry/semantic-conventions.d.ts +433 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +319 -3
- package/dist/telemetry.d.ts +91 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +244 -17
- package/dist/test-support/orchestrator-context.d.ts +25 -0
- package/dist/test-support/orchestrator-context.d.ts.map +1 -0
- package/dist/test-support/orchestrator-context.js +107 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +0 -5
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +1 -15
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +84 -14
- package/dist/vm/script-cache.d.ts +26 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +131 -0
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +2 -2
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +88 -21
- package/dist/workflow/attribute-dispatcher.d.ts +6 -0
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
- package/dist/workflow/attribute-dispatcher.js +45 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +24 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +304 -47
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -1
- package/dist/workflow/set-attributes.d.ts +68 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +60 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +58 -12
- package/dist/workflow/world-init-stub.d.ts +3 -3
- package/dist/workflow/world-init-stub.js +4 -4
- package/dist/workflow.d.ts +95 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +900 -561
- package/docs/api-reference/create-hook.mdx +89 -10
- package/docs/api-reference/create-webhook.mdx +16 -15
- package/docs/api-reference/define-hook.mdx +35 -33
- package/docs/api-reference/fatal-error.mdx +30 -8
- package/docs/api-reference/fetch.mdx +14 -10
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +4 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +4 -4
- package/docs/foundations/cancellation.mdx +31 -32
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +64 -35
- package/docs/foundations/idempotency.mdx +244 -12
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +2 -1
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +106 -30
- package/docs/foundations/streaming.mdx +108 -60
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +63 -63
- package/docs/how-it-works/code-transform.mdx +83 -67
- package/docs/how-it-works/encryption.mdx +30 -26
- package/docs/how-it-works/event-sourcing.mdx +125 -34
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/understanding-directives.mdx +22 -22
- package/package.json +24 -15
- package/dist/runtime/step-handler.d.ts +0 -2
- package/dist/runtime/step-handler.d.ts.map +0 -1
- package/dist/runtime/step-handler.js +0 -776
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
* implementation will be needed.
|
|
10
10
|
*/
|
|
11
11
|
import { types } from 'node:util';
|
|
12
|
-
import { FatalError, RetryableError } from '@workflow/errors';
|
|
12
|
+
import { FatalError, HookConflictError, RetryableError, RuntimeDecryptionError, StreamError, } from '@workflow/errors';
|
|
13
|
+
import { arrayBufferByteLength, dateGetDate, dateGetTime, dateToISOString, hasProperty, headersToEntries, isInstanceOfPrototype, mapToEntries, readProperty, recordGuestCode, regExpFlags, regExpSource, setToValues, urlHref, urlSearchParamsToString, viewInfo, } from '../hardened.js';
|
|
13
14
|
// ---- Base64 helpers ----
|
|
14
15
|
function arrayBufferToBase64(value, offset, length) {
|
|
15
16
|
// Avoid returning falsy value for zero-length buffers
|
|
@@ -20,7 +21,12 @@ function arrayBufferToBase64(value, offset, length) {
|
|
|
20
21
|
return Buffer.from(uint8).toString('base64');
|
|
21
22
|
}
|
|
22
23
|
function viewToBase64(value) {
|
|
23
|
-
|
|
24
|
+
// Read the view's range through internal-slot getters (see hardened.ts):
|
|
25
|
+
// own properties shadowing `buffer`/`byteOffset`/`byteLength` (or patched
|
|
26
|
+
// prototype getters in the sandbox realm) cannot change which bytes are
|
|
27
|
+
// serialized.
|
|
28
|
+
const info = viewInfo(value);
|
|
29
|
+
return arrayBufferToBase64(info.buffer, info.byteOffset, info.byteLength);
|
|
24
30
|
}
|
|
25
31
|
function reviveArrayBuffer(value, global) {
|
|
26
32
|
const base64 = value === '.' ? '' : value;
|
|
@@ -37,6 +43,28 @@ function revive(str) {
|
|
|
37
43
|
// with JSON.parse yields the flattened form that unflatten() expects.
|
|
38
44
|
return JSON.parse(str);
|
|
39
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Reads `error.stack` for serialization. A natural V8 error carries `stack`
|
|
48
|
+
* as an own *accessor* whose first invocation formats and caches the trace.
|
|
49
|
+
* That read is not passive: it executes `Error.prepareStackTrace` when the
|
|
50
|
+
* realm has one installed, and the format-and-cache itself is
|
|
51
|
+
* workflow-visible (a formatter installed later never runs for an
|
|
52
|
+
* already-materialized error). A cold replay repeats neither (it skips
|
|
53
|
+
* dehydration entirely), so the read is recorded as guest code. A
|
|
54
|
+
* data-property `stack` (rehydrated errors, workflow-assigned strings)
|
|
55
|
+
* reads passively.
|
|
56
|
+
*/
|
|
57
|
+
function readErrorStack(value) {
|
|
58
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, 'stack');
|
|
59
|
+
if (descriptor && 'value' in descriptor) {
|
|
60
|
+
return descriptor.value;
|
|
61
|
+
}
|
|
62
|
+
recordGuestCode('getter', 'stack');
|
|
63
|
+
if (descriptor?.get) {
|
|
64
|
+
return descriptor.get.call(value);
|
|
65
|
+
}
|
|
66
|
+
return readProperty(value, 'stack');
|
|
67
|
+
}
|
|
40
68
|
/**
|
|
41
69
|
* Reduces any native Error instance to the shared `BaseErrorPayload` shape,
|
|
42
70
|
* preserving `cause` only when present (to distinguish "no cause" from
|
|
@@ -50,12 +78,15 @@ function revive(str) {
|
|
|
50
78
|
function reduceErrorBase(value) {
|
|
51
79
|
if (!types.isNativeError(value))
|
|
52
80
|
return false;
|
|
81
|
+
// `message`/`cause` are own data properties on natural errors, so the
|
|
82
|
+
// descriptor-based reads cost nothing; a sandbox-defined accessor
|
|
83
|
+
// (e.g. a getter on an Error subclass) is still invoked but recorded.
|
|
53
84
|
const reduced = {
|
|
54
|
-
message: value
|
|
55
|
-
stack: value
|
|
85
|
+
message: readProperty(value, 'message'),
|
|
86
|
+
stack: readErrorStack(value),
|
|
56
87
|
};
|
|
57
|
-
if ('cause'
|
|
58
|
-
reduced.cause = value
|
|
88
|
+
if (hasProperty(value, 'cause'))
|
|
89
|
+
reduced.cause = readProperty(value, 'cause');
|
|
59
90
|
return reduced;
|
|
60
91
|
}
|
|
61
92
|
/**
|
|
@@ -66,8 +97,8 @@ function reduceErrorBase(value) {
|
|
|
66
97
|
* - Inline reducers for subclasses that extend the shape with additional
|
|
67
98
|
* fields (e.g. `AggregateError.errors`, `RetryableError.retryAfter`).
|
|
68
99
|
*
|
|
69
|
-
* Matching by `value.name` (instead of `value.constructor?.name`)
|
|
70
|
-
*
|
|
100
|
+
* Matching by `value.name` (instead of `value.constructor?.name`) works with
|
|
101
|
+
* bundlers that emit the class as an anonymous expression. E.g. Turbopack
|
|
71
102
|
* compiles `export class FatalError extends Error {…}` to a registration call
|
|
72
103
|
* like `e.s(["FatalError", 0, class extends Error {…}])`, and the resulting
|
|
73
104
|
* constructor has `name === ''`. Since every Error subclass we care about
|
|
@@ -79,7 +110,7 @@ function reduceErrorBase(value) {
|
|
|
79
110
|
function reduceNamedErrorSubclassBase(subclassName, value) {
|
|
80
111
|
if (!types.isNativeError(value))
|
|
81
112
|
return false;
|
|
82
|
-
if (value
|
|
113
|
+
if (readProperty(value, 'name') !== subclassName)
|
|
83
114
|
return false;
|
|
84
115
|
return reduceErrorBase(value);
|
|
85
116
|
}
|
|
@@ -115,18 +146,30 @@ function makeErrorSubclassReviver(global, ctorName) {
|
|
|
115
146
|
};
|
|
116
147
|
}
|
|
117
148
|
// ---- Reducers ----
|
|
118
|
-
export function getCommonReducers(
|
|
149
|
+
export function getCommonReducers(
|
|
150
|
+
// The `global` parameter is retained for API compatibility, but the
|
|
151
|
+
// reducers no longer perform `instanceof global.X` checks: classification
|
|
152
|
+
// is done with engine-level brand checks (realm-agnostic, immune to
|
|
153
|
+
// reassigned sandbox globals and `Symbol.hasInstance`), and extraction
|
|
154
|
+
// goes through intrinsics captured at host boot. See ../hardened.ts.
|
|
155
|
+
_global = globalThis) {
|
|
119
156
|
return {
|
|
120
|
-
ArrayBuffer: (value) => value
|
|
121
|
-
arrayBufferToBase64(value, 0, value
|
|
122
|
-
BigInt: (value) =>
|
|
123
|
-
|
|
124
|
-
|
|
157
|
+
ArrayBuffer: (value) => types.isArrayBuffer(value) &&
|
|
158
|
+
arrayBufferToBase64(value, 0, arrayBufferByteLength(value)),
|
|
159
|
+
BigInt: (value) =>
|
|
160
|
+
// String(bigint) is a spec-internal numeric conversion: unlike
|
|
161
|
+
// `value.toString()`, it never consults BigInt.prototype.
|
|
162
|
+
typeof value === 'bigint' && String(value),
|
|
163
|
+
BigInt64Array: (value) => types.isBigInt64Array(value) && viewToBase64(value),
|
|
164
|
+
BigUint64Array: (value) => types.isBigUint64Array(value) && viewToBase64(value),
|
|
125
165
|
Date: (value) => {
|
|
126
|
-
|
|
166
|
+
// Brand check + captured intrinsics: a sandbox-side patch of
|
|
167
|
+
// `Date.prototype.toISOString` (e.g. a Temporal polyfill wrapping it)
|
|
168
|
+
// is never executed, and cannot perturb VM state during serialization.
|
|
169
|
+
if (!types.isDate(value))
|
|
127
170
|
return false;
|
|
128
|
-
const valid = !Number.isNaN(value
|
|
129
|
-
return valid ? value
|
|
171
|
+
const valid = !Number.isNaN(dateGetDate(value));
|
|
172
|
+
return valid ? dateToISOString(value) : '.';
|
|
130
173
|
},
|
|
131
174
|
// DOMException is a special case: it `instanceof Error` is true in Node,
|
|
132
175
|
// but `types.isNativeError()` returns FALSE for it, so the generic Error
|
|
@@ -137,17 +180,17 @@ export function getCommonReducers(global = globalThis) {
|
|
|
137
180
|
DOMException: (value) => {
|
|
138
181
|
if (value === null || typeof value !== 'object')
|
|
139
182
|
return false;
|
|
140
|
-
|
|
141
|
-
|
|
183
|
+
const ctor = readProperty(value, 'constructor');
|
|
184
|
+
if (!ctor || readProperty(ctor, 'name') !== 'DOMException')
|
|
142
185
|
return false;
|
|
143
|
-
const e = value;
|
|
144
186
|
const reduced = {
|
|
145
|
-
message:
|
|
146
|
-
name:
|
|
147
|
-
stack:
|
|
187
|
+
message: readProperty(value, 'message'),
|
|
188
|
+
name: readProperty(value, 'name'),
|
|
189
|
+
stack: readErrorStack(value),
|
|
148
190
|
};
|
|
149
|
-
if ('cause'
|
|
150
|
-
reduced.cause =
|
|
191
|
+
if (hasProperty(value, 'cause')) {
|
|
192
|
+
reduced.cause = readProperty(value, 'cause');
|
|
193
|
+
}
|
|
151
194
|
return reduced;
|
|
152
195
|
},
|
|
153
196
|
// Error subclass reducers are intentionally placed before the base Error
|
|
@@ -157,6 +200,20 @@ export function getCommonReducers(global = globalThis) {
|
|
|
157
200
|
// See `makeErrorSubclassReducer` for implementation details.
|
|
158
201
|
EvalError: makeErrorSubclassReducer('EvalError'),
|
|
159
202
|
FatalError: makeErrorSubclassReducer('FatalError'),
|
|
203
|
+
HookConflictError: (value) => {
|
|
204
|
+
const base = reduceNamedErrorSubclassBase('HookConflictError', value);
|
|
205
|
+
if (!base)
|
|
206
|
+
return false;
|
|
207
|
+
const reduced = {
|
|
208
|
+
...base,
|
|
209
|
+
token: readProperty(value, 'token'),
|
|
210
|
+
};
|
|
211
|
+
const conflictingRunId = readProperty(value, 'conflictingRunId');
|
|
212
|
+
if (conflictingRunId !== undefined) {
|
|
213
|
+
reduced.conflictingRunId = conflictingRunId;
|
|
214
|
+
}
|
|
215
|
+
return reduced;
|
|
216
|
+
},
|
|
160
217
|
RangeError: makeErrorSubclassReducer('RangeError'),
|
|
161
218
|
ReferenceError: makeErrorSubclassReducer('ReferenceError'),
|
|
162
219
|
// RetryableError carries an extra `retryAfter` Date that we serialize as
|
|
@@ -167,14 +224,25 @@ export function getCommonReducers(global = globalThis) {
|
|
|
167
224
|
const base = reduceNamedErrorSubclassBase('RetryableError', value);
|
|
168
225
|
if (!base)
|
|
169
226
|
return false;
|
|
170
|
-
const retryAfterRaw = value
|
|
227
|
+
const retryAfterRaw = readProperty(value, 'retryAfter');
|
|
171
228
|
let retryAfter;
|
|
172
|
-
if (retryAfterRaw
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const t = retryAfterRaw.getTime();
|
|
229
|
+
if (types.isDate(retryAfterRaw)) {
|
|
230
|
+
// Genuine Date (any realm): read the epoch through the intrinsic.
|
|
231
|
+
const t = dateGetTime(retryAfterRaw);
|
|
176
232
|
retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
|
|
177
233
|
}
|
|
234
|
+
else if (retryAfterRaw && typeof retryAfterRaw === 'object') {
|
|
235
|
+
// Duck-typed date-like: invoking its getTime() runs workflow code.
|
|
236
|
+
const getTime = readProperty(retryAfterRaw, 'getTime');
|
|
237
|
+
if (typeof getTime === 'function') {
|
|
238
|
+
recordGuestCode('method', 'getTime');
|
|
239
|
+
const t = getTime.call(retryAfterRaw);
|
|
240
|
+
retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
retryAfter = Date.now() + 1000;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
178
246
|
else if (typeof retryAfterRaw === 'string' ||
|
|
179
247
|
typeof retryAfterRaw === 'number') {
|
|
180
248
|
const t = new Date(retryAfterRaw).getTime();
|
|
@@ -188,6 +256,35 @@ export function getCommonReducers(global = globalThis) {
|
|
|
188
256
|
retryAfter,
|
|
189
257
|
};
|
|
190
258
|
},
|
|
259
|
+
// RuntimeDecryptionError carries an extra `context` object (operation,
|
|
260
|
+
// byteLength, formatPrefix) that the generic Error reducer would drop.
|
|
261
|
+
// Preserve it so the diagnostic data survives the run-error round trip.
|
|
262
|
+
RuntimeDecryptionError: (value) => {
|
|
263
|
+
const base = reduceNamedErrorSubclassBase('RuntimeDecryptionError', value);
|
|
264
|
+
if (!base)
|
|
265
|
+
return false;
|
|
266
|
+
const reduced = {
|
|
267
|
+
...base,
|
|
268
|
+
};
|
|
269
|
+
const context = readProperty(value, 'context');
|
|
270
|
+
if (context !== undefined) {
|
|
271
|
+
reduced.context = context;
|
|
272
|
+
}
|
|
273
|
+
return reduced;
|
|
274
|
+
},
|
|
275
|
+
StreamError: (value) => {
|
|
276
|
+
const base = reduceNamedErrorSubclassBase('StreamError', value);
|
|
277
|
+
if (!base)
|
|
278
|
+
return false;
|
|
279
|
+
const reduced = { ...base };
|
|
280
|
+
const status = readProperty(value, 'status');
|
|
281
|
+
const url = readProperty(value, 'url');
|
|
282
|
+
if (typeof status === 'number')
|
|
283
|
+
reduced.status = status;
|
|
284
|
+
if (typeof url === 'string')
|
|
285
|
+
reduced.url = url;
|
|
286
|
+
return reduced;
|
|
287
|
+
},
|
|
191
288
|
SyntaxError: makeErrorSubclassReducer('SyntaxError'),
|
|
192
289
|
TypeError: makeErrorSubclassReducer('TypeError'),
|
|
193
290
|
URIError: makeErrorSubclassReducer('URIError'),
|
|
@@ -199,10 +296,10 @@ export function getCommonReducers(global = globalThis) {
|
|
|
199
296
|
return false;
|
|
200
297
|
return {
|
|
201
298
|
...base,
|
|
202
|
-
errors: value
|
|
299
|
+
errors: readProperty(value, 'errors'),
|
|
203
300
|
};
|
|
204
301
|
},
|
|
205
|
-
// Base Error reducer
|
|
302
|
+
// Base Error reducer: catch-all for any Error instance not matched by a
|
|
206
303
|
// specific subclass reducer above (including user Error subclasses without
|
|
207
304
|
// WORKFLOW_SERIALIZE). Preserves `name` so the error's identity is retained
|
|
208
305
|
// even though the exact class cannot be reconstructed.
|
|
@@ -210,54 +307,61 @@ export function getCommonReducers(global = globalThis) {
|
|
|
210
307
|
if (!types.isNativeError(value))
|
|
211
308
|
return false;
|
|
212
309
|
const reduced = {
|
|
213
|
-
name: value
|
|
214
|
-
message: value
|
|
215
|
-
stack: value
|
|
310
|
+
name: readProperty(value, 'name'),
|
|
311
|
+
message: readProperty(value, 'message'),
|
|
312
|
+
stack: readErrorStack(value),
|
|
216
313
|
};
|
|
217
|
-
if ('cause'
|
|
218
|
-
reduced.cause = value
|
|
314
|
+
if (hasProperty(value, 'cause')) {
|
|
315
|
+
reduced.cause = readProperty(value, 'cause');
|
|
316
|
+
}
|
|
219
317
|
return reduced;
|
|
220
318
|
},
|
|
221
|
-
Float32Array: (value) => value
|
|
222
|
-
Float64Array: (value) => value
|
|
223
|
-
Headers
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
319
|
+
Float32Array: (value) => types.isFloat32Array(value) && viewToBase64(value),
|
|
320
|
+
Float64Array: (value) => types.isFloat64Array(value) && viewToBase64(value),
|
|
321
|
+
// Headers is a host class injected into the sandbox, so its (shared)
|
|
322
|
+
// prototype is reachable from workflow code; iterate through the
|
|
323
|
+
// boot-captured iterator instead of a live Symbol.iterator lookup.
|
|
324
|
+
Headers: (value) => isInstanceOfPrototype(value, Headers.prototype) &&
|
|
325
|
+
headersToEntries(value),
|
|
326
|
+
Int8Array: (value) => types.isInt8Array(value) && viewToBase64(value),
|
|
327
|
+
Int16Array: (value) => types.isInt16Array(value) && viewToBase64(value),
|
|
328
|
+
Int32Array: (value) => types.isInt32Array(value) && viewToBase64(value),
|
|
329
|
+
// Engine brand check + host-realm iteration: a patched
|
|
330
|
+
// `Map.prototype[Symbol.iterator]` in the sandbox is never consulted.
|
|
331
|
+
Map: (value) => types.isMap(value) && mapToEntries(value),
|
|
332
|
+
RegExp: (value) => types.isRegExp(value) && {
|
|
333
|
+
source: regExpSource(value),
|
|
334
|
+
flags: regExpFlags(value),
|
|
231
335
|
},
|
|
232
336
|
// Request and Response are intentionally NOT in common reducers.
|
|
233
337
|
// They require mode-specific revivers (stream handling, etc.) and
|
|
234
338
|
// including them here without matching revivers would cause them
|
|
235
339
|
// to deserialize as plain objects.
|
|
236
|
-
Set: (value) => value
|
|
237
|
-
URL: (value) => value
|
|
340
|
+
Set: (value) => types.isSet(value) && setToValues(value),
|
|
341
|
+
URL: (value) => isInstanceOfPrototype(value, URL.prototype) && urlHref(value),
|
|
238
342
|
WorkflowFunction: (value) => {
|
|
239
343
|
// Only match function references with a workflowId property (set by
|
|
240
344
|
// the SWC compiler on workflow functions). Plain { workflowId } objects
|
|
241
|
-
// are NOT matched
|
|
345
|
+
// are NOT matched; this prevents infinite recursion since the reduced
|
|
242
346
|
// form { workflowId } is a plain object, not a function.
|
|
243
347
|
if (typeof value !== 'function')
|
|
244
348
|
return false;
|
|
245
|
-
const workflowId = value
|
|
349
|
+
const workflowId = readProperty(value, 'workflowId');
|
|
246
350
|
if (typeof workflowId !== 'string')
|
|
247
351
|
return false;
|
|
248
352
|
return { workflowId };
|
|
249
353
|
},
|
|
250
354
|
URLSearchParams: (value) => {
|
|
251
|
-
if (!(value
|
|
355
|
+
if (!isInstanceOfPrototype(value, URLSearchParams.prototype)) {
|
|
252
356
|
return false;
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
return
|
|
357
|
+
}
|
|
358
|
+
const text = urlSearchParamsToString(value);
|
|
359
|
+
return text === '' ? '.' : text;
|
|
256
360
|
},
|
|
257
|
-
Uint8Array: (value) => value
|
|
258
|
-
Uint8ClampedArray: (value) => value
|
|
259
|
-
Uint16Array: (value) => value
|
|
260
|
-
Uint32Array: (value) => value
|
|
361
|
+
Uint8Array: (value) => types.isUint8Array(value) && viewToBase64(value),
|
|
362
|
+
Uint8ClampedArray: (value) => types.isUint8ClampedArray(value) && viewToBase64(value),
|
|
363
|
+
Uint16Array: (value) => types.isUint16Array(value) && viewToBase64(value),
|
|
364
|
+
Uint32Array: (value) => types.isUint32Array(value) && viewToBase64(value),
|
|
261
365
|
};
|
|
262
366
|
}
|
|
263
367
|
// ---- Revivers ----
|
|
@@ -299,6 +403,16 @@ export function getCommonRevivers(global = globalThis) {
|
|
|
299
403
|
error.cause = value.cause;
|
|
300
404
|
return error;
|
|
301
405
|
},
|
|
406
|
+
HookConflictError: (value) => {
|
|
407
|
+
const Ctor = global[Symbol.for('@workflow/errors//HookConflictError')] ?? HookConflictError;
|
|
408
|
+
const error = new Ctor(value.token, value.conflictingRunId);
|
|
409
|
+
if (value.stack !== undefined)
|
|
410
|
+
error.stack = value.stack;
|
|
411
|
+
if ('cause' in value) {
|
|
412
|
+
error.cause = value.cause;
|
|
413
|
+
}
|
|
414
|
+
return error;
|
|
415
|
+
},
|
|
302
416
|
RangeError: makeErrorSubclassReviver(global, 'RangeError'),
|
|
303
417
|
ReferenceError: makeErrorSubclassReviver(global, 'ReferenceError'),
|
|
304
418
|
RetryableError: (value) => {
|
|
@@ -317,6 +431,32 @@ export function getCommonRevivers(global = globalThis) {
|
|
|
317
431
|
error.cause = value.cause;
|
|
318
432
|
return error;
|
|
319
433
|
},
|
|
434
|
+
RuntimeDecryptionError: (value) => {
|
|
435
|
+
// Resolve from the consumer's globalThis (see the FatalError reviver
|
|
436
|
+
// above) so `instanceof RuntimeDecryptionError` holds across realms.
|
|
437
|
+
const Ctor = global[Symbol.for('@workflow/errors//RuntimeDecryptionError')] ??
|
|
438
|
+
RuntimeDecryptionError;
|
|
439
|
+
const opts = {};
|
|
440
|
+
if ('cause' in value)
|
|
441
|
+
opts.cause = value.cause;
|
|
442
|
+
if (value.context !== undefined)
|
|
443
|
+
opts.context = value.context;
|
|
444
|
+
const error = new Ctor(value.message, opts);
|
|
445
|
+
if (value.stack !== undefined)
|
|
446
|
+
error.stack = value.stack;
|
|
447
|
+
return error;
|
|
448
|
+
},
|
|
449
|
+
StreamError: (value) => {
|
|
450
|
+
const Ctor = global[Symbol.for('@workflow/errors//StreamError')] ?? StreamError;
|
|
451
|
+
const error = new Ctor(value.message, {
|
|
452
|
+
...('cause' in value ? { cause: value.cause } : {}),
|
|
453
|
+
status: value.status,
|
|
454
|
+
url: value.url,
|
|
455
|
+
});
|
|
456
|
+
if (value.stack !== undefined)
|
|
457
|
+
error.stack = value.stack;
|
|
458
|
+
return error;
|
|
459
|
+
},
|
|
320
460
|
SyntaxError: makeErrorSubclassReviver(global, 'SyntaxError'),
|
|
321
461
|
TypeError: makeErrorSubclassReviver(global, 'TypeError'),
|
|
322
462
|
URIError: makeErrorSubclassReviver(global, 'URIError'),
|
|
@@ -327,7 +467,7 @@ export function getCommonRevivers(global = globalThis) {
|
|
|
327
467
|
error.stack = value.stack;
|
|
328
468
|
return error;
|
|
329
469
|
},
|
|
330
|
-
// Base Error reviver
|
|
470
|
+
// Base Error reviver: used for plain Error instances and unrecognized
|
|
331
471
|
// Error subclasses. Preserves `name` so the error's identity is retained.
|
|
332
472
|
Error: (value) => {
|
|
333
473
|
const opts = 'cause' in value ? { cause: value.cause } : undefined;
|
|
@@ -359,4 +499,4 @@ export function getCommonRevivers(global = globalThis) {
|
|
|
359
499
|
}
|
|
360
500
|
// Re-export for use in legacy compat
|
|
361
501
|
export { revive };
|
|
362
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc5RCwyQkFBMkI7QUFFM0IsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBc0IsRUFDdEIsTUFBYyxFQUNkLE1BQWM7SUFFZCxzREFBc0Q7SUFDdEQsSUFBSSxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzdCLDhEQUE4RDtJQUM5RCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQXNCO0lBQzFDLE9BQU8sbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FDeEIsS0FBYSxFQUNiLE1BQTJCO0lBRTNCLE1BQU0sTUFBTSxHQUFHLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sV0FBVyxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFB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LEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUNuQyxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEUsV0FBVyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDN0IsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRCxXQUFXLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUM3QixJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQzNELENBQUM7QUFDSixDQUFDO0FBRUQscUNBQXFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tbW9uIHJlZHVjZXJzIGFuZCByZXZpdmVycyBmb3IgdHlwZXMgc2hhcmVkIGFjcm9zcyBhbGwgc2VyaWFsaXphdGlvbiBtb2Rlcy5cbiAqXG4gKiBIYW5kbGVzOiBBcnJheUJ1ZmZlciwgQmlnSW50LCB0eXBlZCBhcnJheXMsIERhdGUsIEVycm9yLCBIZWFkZXJzLCBNYXAsIFNldCxcbiAqIFJlZ0V4cCwgUmVxdWVzdCwgUmVzcG9uc2UsIFVSTCwgVVJMU2VhcmNoUGFyYW1zLlxuICpcbiAqIE5vdGU6IFVzZXMgTm9kZS5qcyBCdWZmZXIgZm9yIGJhc2U2NCBlbmNvZGluZy9kZWNvZGluZy4gRm9yIGVudmlyb25tZW50c1xuICogd2l0aG91dCBCdWZmZXIgKGUuZy4gUXVpY2tKUyBWTSksIGEgcG9seWZpbGwgb3IgYWx0ZXJuYXRpdmUgYmFzZTY0XG4gKiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgeyBGYXRhbEVycm9yLCBSZXRyeWFibGVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBSZWR1Y2VycywgUmV2aXZlcnMsIFNlcmlhbGl6YWJsZVNwZWNpYWwgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQmFzZTY0IGhlbHBlcnMgLS0tLVxuXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KFxuICB2YWx1ZTogQXJyYXlCdWZmZXJMaWtlLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgbGVuZ3RoOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIC8vIEF2b2lkIHJldHVybmluZyBmYWxzeSB2YWx1ZSBmb3IgemVyby1sZW5ndGggYnVmZmVyc1xuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJy4nO1xuICAvLyBDcmVhdGUgYSBwcm9wZXIgY29weSB0byBhdm9pZCBBcnJheUJ1ZmZlciBkZXRhY2htZW50IGlzc3Vlc1xuICBjb25zdCB1aW50OCA9IG5ldyBVaW50OEFycmF5KHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbSh1aW50OCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5mdW5jdGlvbiB2aWV3VG9CYXNlNjQodmFsdWU6IEFycmF5QnVmZmVyVmlldyk6IHN0cmluZyB7XG4gIHJldHVybiBhcnJheUJ1ZmZlclRvQmFzZTY0KHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIHJldml2ZUFycmF5QnVmZmVyKFxuICB2YWx1ZTogc3RyaW5nLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IEFycmF5QnVmZmVyIHtcbiAgY29uc3QgYmFzZTY0ID0gdmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWU7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBnbG9iYWwuQXJyYXlCdWZmZXIoYnVmZmVyLmxlbmd0aCk7XG4gIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgZ2xvYmFsLlVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICB1aW50OEFycmF5LnNldChidWZmZXIpO1xuICByZXR1cm4gYXJyYXlCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIHJldml2ZShzdHI6IHN0cmluZykge1xuICAvLyBkZXZhbHVlLnN0cmluZ2lmeSgpIGFsd2F5cyBwcm9kdWNlcyB2YWxpZCBKU09OOiBzcGVjaWFsIHZhbHVlc1xuICAvLyAodW5kZWZpbmVkLCBOYU4sIEluZmluaXR5LCAtMCkgYXJlIGVuY29kZWQgYXMgbmVnYXRpdmUgaW50ZWdlclxuICAvLyBzZW50aW5lbHMgYW5kIHRoZSByZW1haW5pbmcgc3RydWN0dXJlIGlzIG9yZGluYXJ5IEpTT04uIFBhcnNpbmdcbiAgLy8gd2l0aCBKU09OLnBhcnNlIHlpZWxkcyB0aGUgZmxhdHRlbmVkIGZvcm0gdGhhdCB1bmZsYXR0ZW4oKSBleHBlY3RzLlxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG4vLyAtLS0tIEVycm9yIHN1YmNsYXNzIGhlbHBlcnMgLS0tLVxuXG4vKipcbiAqIFRoZSBzaGFyZWQgc2hhcGUgdGhhdCBldmVyeSBFcnJvci1zdWJjbGFzcyByZWR1Y2VyIGluIHRoaXMgbW9kdWxlXG4gKiBwcm9kdWNlcy4gU29tZSBzdWJjbGFzc2VzIChlLmcuIGBBZ2dyZWdhdGVFcnJvcmAsIGBSZXRyeWFibGVFcnJvcmApIGV4dGVuZFxuICogdGhpcyB3aXRoIGFkZGl0aW9uYWwgZmllbGRzIGJ5IHNwcmVhZGluZyB0aGUgYmFzZSBwYXlsb2FkLlxuICovXG50eXBlIEJhc2VFcnJvclBheWxvYWQgPSB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhY2s/OiBzdHJpbmc7XG4gIGNhdXNlPzogdW5rbm93bjtcbn07XG5cbi8qKlxuICogU3Vic2V0IG9mIGBTZXJpYWxpemFibGVTcGVjaWFsYCBrZXlzIHdob3NlIHBheWxvYWQgc2hhcGUgaXMgZXhhY3RseSB0aGVcbiAqIGBCYXNlRXJyb3JQYXlsb2FkYC4gYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAgaXMgY29uc3RyYWluZWQgdG8gb25seVxuICogdGhlc2Uga2V5cyBzbyBpdHMgcmV0dXJuIHR5cGUgaXMgc291bmQg4oCUIHN1YmNsYXNzZXMgdGhhdCBuZWVkIGV4dHJhXG4gKiBmaWVsZHMgKGxpa2UgYEFnZ3JlZ2F0ZUVycm9yLmVycm9yc2Agb3IgYFJldHJ5YWJsZUVycm9yLnJldHJ5QWZ0ZXJgKSB1c2VcbiAqIGByZWR1Y2VFcnJvckJhc2VgIGRpcmVjdGx5IGFuZCBleHRlbmQgdGhlIHJlc3VsdC5cbiAqL1xudHlwZSBTaW1wbGVFcnJvclN1YmNsYXNzS2V5ID0ge1xuICBbSyBpbiBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSBleHRlbmRzIEJhc2VFcnJvclBheWxvYWRcbiAgICA/IEJhc2VFcnJvclBheWxvYWQgZXh0ZW5kcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdXG4gICAgICA/IEtcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTtcblxuLyoqXG4gKiBSZWR1Y2VzIGFueSBuYXRpdmUgRXJyb3IgaW5zdGFuY2UgdG8gdGhlIHNoYXJlZCBgQmFzZUVycm9yUGF5bG9hZGAgc2hhcGUsXG4gKiBwcmVzZXJ2aW5nIGBjYXVzZWAgb25seSB3aGVuIHByZXNlbnQgKHRvIGRpc3Rpbmd1aXNoIFwibm8gY2F1c2VcIiBmcm9tXG4gKiBcImNhdXNlIGlzIHVuZGVmaW5lZFwiKS4gVXNlZCBkaXJlY3RseSBieSByZWR1Y2VycyBmb3Igc3ViY2xhc3NlcyB0aGF0IG5lZWRcbiAqIHRvIGV4dGVuZCB0aGUgc2hhcGUgd2l0aCBhZGRpdGlvbmFsIGZpZWxkcy5cbiAqXG4gKiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCBpcyB1c2VkIGluc3RlYWQgb2YgYGluc3RhbmNlb2ZgIGZvciBjcm9zcy1WTSBzYWZldHk6XG4gKiBlcnJvcnMgbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IFZNIGNvbnRleHQsIGFuZCBgaW5zdGFuY2VvZmAgZmFpbHNcbiAqIGFjcm9zcyBWTSBib3VuZGFyaWVzIHNpbmNlIGVhY2ggY29udGV4dCBoYXMgaXRzIG93biBFcnJvciBjb25zdHJ1Y3Rvci5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlRXJyb3JCYXNlKHZhbHVlOiB1bmtub3duKTogQmFzZUVycm9yUGF5bG9hZCB8IGZhbHNlIHtcbiAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWR1Y2VkOiBCYXNlRXJyb3JQYXlsb2FkID0ge1xuICAgIG1lc3NhZ2U6IHZhbHVlLm1lc3NhZ2UsXG4gICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICB9O1xuICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgcmVkdWNlZC5jYXVzZSA9ICh2YWx1ZSBhcyB7IGNhdXNlOiB1bmtub3duIH0pLmNhdXNlO1xuICByZXR1cm4gcmVkdWNlZDtcbn1cblxuLyoqXG4gKiBSZWR1Y2VzIGEgbmF0aXZlIGVycm9yIHRvIHRoZSBzaGFyZWQgYEJhc2VFcnJvclBheWxvYWRgLCBidXQgb25seSB3aGVuIGl0c1xuICogYG5hbWVgIGluc3RhbmNlIHByb3BlcnR5IG1hdGNoZXMgYHN1YmNsYXNzTmFtZWAuIFVzZWQgYnk6XG4gKiAgIC0gYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAsIGZvciBzdWJjbGFzc2VzIHdob3NlIHNlcmlhbGl6ZWQgc2hhcGUgaXNcbiAqICAgICBleGFjdGx5IGBCYXNlRXJyb3JQYXlsb2FkYC5cbiAqICAgLSBJbmxpbmUgcmVkdWNlcnMgZm9yIHN1YmNsYXNzZXMgdGhhdCBleHRlbmQgdGhlIHNoYXBlIHdpdGggYWRkaXRpb25hbFxuICogICAgIGZpZWxkcyAoZS5nLiBgQWdncmVnYXRlRXJyb3IuZXJyb3JzYCwgYFJldHJ5YWJsZUVycm9yLnJldHJ5QWZ0ZXJgKS5cbiAqXG4gKiBNYXRjaGluZyBieSBgdmFsdWUubmFtZWAgKGluc3RlYWQgb2YgYHZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lYCkgaXMgcm9idXN0XG4gKiB0byBidW5kbGVycyB0aGF0IGVtaXQgdGhlIGNsYXNzIGFzIGFuIGFub255bW91cyBleHByZXNzaW9uIOKAlCBlLmcuIFR1cmJvcGFja1xuICogY29tcGlsZXMgYGV4cG9ydCBjbGFzcyBGYXRhbEVycm9yIGV4dGVuZHMgRXJyb3Ige+KApn1gIHRvIGEgcmVnaXN0cmF0aW9uIGNhbGxcbiAqIGxpa2UgYGUucyhbXCJGYXRhbEVycm9yXCIsIDAsIGNsYXNzIGV4dGVuZHMgRXJyb3Ige+KApn1dKWAsIGFuZCB0aGUgcmVzdWx0aW5nXG4gKiBjb25zdHJ1Y3RvciBoYXMgYG5hbWUgPT09ICcnYC4gU2luY2UgZXZlcnkgRXJyb3Igc3ViY2xhc3Mgd2UgY2FyZSBhYm91dFxuICogc2V0cyBgdGhpcy5uYW1lYCBleHBsaWNpdGx5IGluIGl0cyBjb25zdHJ1Y3RvciAoYnVpbHQtaW4gc3ViY2xhc3NlcyBkbyB0aGlzXG4gKiBhdXRvbWF0aWNhbGx5OyBgRmF0YWxFcnJvcmAvYFJldHJ5YWJsZUVycm9yYCBkbyBpdCBpbiB1c2VyIGNvZGUpLCB0aGVcbiAqIGluc3RhbmNlIHByb3BlcnR5IGlzIHRoZSByZWxpYWJsZSBpZGVudGl0eSBtYXJrZXIgYWNyb3NzIHJlYWxtcyBhbmRcbiAqIGJ1bmRsZXJzLlxuICovXG5mdW5jdGlvbiByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKFxuICBzdWJjbGFzc05hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd25cbik6IEJhc2VFcnJvclBheWxvYWQgfCBmYWxzZSB7XG4gIGlmICghdHlwZXMuaXNOYXRpdmVFcnJvcih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZhbHVlLm5hbWUgIT09IHN1YmNsYXNzTmFtZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmVkdWNlRXJyb3JCYXNlKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVkdWNlciBmb3IgYSBidWlsdC1pbiBFcnJvciBzdWJjbGFzcyB3aG9zZSBzZXJpYWxpemVkIHNoYXBlIGlzXG4gKiBleGFjdGx5IGBCYXNlRXJyb3JQYXlsb2FkYCAobm8gZXh0cmEgZmllbGRzKS4gVGhlIHJlZHVjZXIgbWF0Y2hlcyBieVxuICogY29uc3RydWN0b3IgbmFtZSAoYWZ0ZXIgdGhlIGlzTmF0aXZlRXJyb3IgZ2F0ZSksIHNpbmNlIGBpbnN0YW5jZW9mYCBtYXlcbiAqIGZhaWwgYWNyb3NzIFZNIGJvdW5kYXJpZXMuXG4gKi9cbmZ1bmN0aW9uIG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcjxLIGV4dGVuZHMgU2ltcGxlRXJyb3JTdWJjbGFzc0tleT4oXG4gIHN1YmNsYXNzTmFtZTogS1xuKSB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pOiBTZXJpYWxpemFibGVTcGVjaWFsW0tdIHwgZmFsc2UgPT4ge1xuICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKHN1YmNsYXNzTmFtZSwgdmFsdWUpO1xuICAgIGlmICghYmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBiYXNlIGFzIFNlcmlhbGl6YWJsZVNwZWNpYWxbS107XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJldml2ZXIgZm9yIGEgYnVpbHQtaW4gRXJyb3Igc3ViY2xhc3MuIFJlY29uc3RydWN0cyB0aGUgY29ycmVjdFxuICogYnVpbHQtaW4gRXJyb3IgdHlwZSB1c2luZyB0aGUgY29udGV4dCdzIGNvbnN0cnVjdG9yLiBUaGUgYGNhdXNlYCBvcHRpb24gaXNcbiAqIG9ubHkgcGFzc2VkIHdoZW4gdGhlIHNlcmlhbGl6ZWQgZGF0YSBpbmNsdWRlcyBpdCwgcHJlc2VydmluZyB0aGUgZGlzdGluY3Rpb25cbiAqIGJldHdlZW4gXCJubyBjYXVzZVwiIGFuZCBcImNhdXNlIGlzIHVuZGVmaW5lZFwiLlxuICovXG5mdW5jdGlvbiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXI8SyBleHRlbmRzIGtleW9mIFNlcmlhbGl6YWJsZVNwZWNpYWw+KFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN0b3JOYW1lOiBzdHJpbmdcbikge1xuICByZXR1cm4gKHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsW0tdKSA9PiB7XG4gICAgY29uc3QgdiA9IHZhbHVlIGFzIEJhc2VFcnJvclBheWxvYWQ7XG4gICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdiA/IHsgY2F1c2U6IHYuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBDdG9yID0gZ2xvYmFsW2N0b3JOYW1lXTtcbiAgICBjb25zdCBlcnJvcjogRXJyb3IgPSBuZXcgQ3Rvcih2Lm1lc3NhZ2UsIG9wdHMpO1xuICAgIGlmICh2LnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdi5zdGFjaztcbiAgICByZXR1cm4gZXJyb3I7XG4gIH07XG59XG5cbi8vIC0tLS0gUmVkdWNlcnMgLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICBBcnJheUJ1ZmZlcjogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQXJyYXlCdWZmZXIgJiZcbiAgICAgIGFycmF5QnVmZmVyVG9CYXNlNjQodmFsdWUsIDAsIHZhbHVlLmJ5dGVMZW5ndGgpLFxuICAgIEJpZ0ludDogKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnICYmIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQmlnSW50NjRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5CaWdVaW50NjRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuRGF0ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHZhbGlkID0gIU51bWJlci5pc05hTih2YWx1ZS5nZXREYXRlKCkpO1xuICAgICAgcmV0dXJuIHZhbGlkID8gdmFsdWUudG9JU09TdHJpbmcoKSA6ICcuJztcbiAgICB9LFxuICAgIC8vIERPTUV4Y2VwdGlvbiBpcyBhIHNwZWNpYWwgY2FzZTogaXQgYGluc3RhbmNlb2YgRXJyb3JgIGlzIHRydWUgaW4gTm9kZSxcbiAgICAvLyBidXQgYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAgcmV0dXJucyBGQUxTRSBmb3IgaXQsIHNvIHRoZSBnZW5lcmljIEVycm9yXG4gICAgLy8gcmVkdWNlciAod2hpY2ggZ2F0ZXMgb24gaXNOYXRpdmVFcnJvcikgd29uJ3QgbWF0Y2guIENoZWNrIGl0IGV4cGxpY2l0bHlcbiAgICAvLyBieSBjb25zdHJ1Y3RvciBuYW1lICsgRXJyb3IgaW5oZXJpdGFuY2Ugc28gd2UgY2F0Y2ggRE9NRXhjZXB0aW9ucyBmcm9tXG4gICAgLy8gYW55IHJlYWxtIChjcm9zcy1WTSBzYWZldHk6IGluc3RhbmNlb2YgZ2xvYmFsLkRPTUV4Y2VwdGlvbiB3b3VsZCBmYWlsXG4gICAgLy8gZm9yIGluc3RhbmNlcyBtaW50ZWQgaW4gYW5vdGhlciBjb250ZXh0KS5cbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChcbiAgICAgICAgKHZhbHVlIGFzIHsgY29uc3RydWN0b3I/OiB7IG5hbWU/OiBzdHJpbmcgfSB9KS5jb25zdHJ1Y3Rvcj8ubmFtZSAhPT1cbiAgICAgICAgJ0RPTUV4Y2VwdGlvbidcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZSA9IHZhbHVlIGFzIEVycm9yICYgeyBjYXVzZT86IHVua25vd24gfTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0RPTUV4Y2VwdGlvbiddID0ge1xuICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgIG5hbWU6IGUubmFtZSxcbiAgICAgICAgc3RhY2s6IGUuc3RhY2ssXG4gICAgICB9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gZSkgcmVkdWNlZC5jYXVzZSA9IGUuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIC8vIEVycm9yIHN1YmNsYXNzIHJlZHVjZXJzIGFyZSBpbnRlbnRpb25hbGx5IHBsYWNlZCBiZWZvcmUgdGhlIGJhc2UgRXJyb3JcbiAgICAvLyByZWR1Y2VyIGJlY2F1c2UgZGV2YWx1ZSB1c2VzIGZpcnN0LW1hdGNoLXdpbnMuIFN1YmNsYXNzLXNwZWNpZmljIHJlZHVjZXJzXG4gICAgLy8gbXVzdCBiZSBjaGVja2VkIGZpcnN0IHNvIHRoYXQgZS5nLiBhIFR5cGVFcnJvciBpcyBzZXJpYWxpemVkIGFzIFwiVHlwZUVycm9yXCJcbiAgICAvLyByYXRoZXIgdGhhbiBmYWxsaW5nIHRocm91Z2ggdG8gdGhlIGdlbmVyaWMgXCJFcnJvclwiIHJlZHVjZXIuXG4gICAgLy8gU2VlIGBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXJgIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgIEV2YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdFdmFsRXJyb3InKSxcbiAgICBGYXRhbEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ0ZhdGFsRXJyb3InKSxcbiAgICBSYW5nZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdSZWZlcmVuY2VFcnJvcicpLFxuICAgIC8vIFJldHJ5YWJsZUVycm9yIGNhcnJpZXMgYW4gZXh0cmEgYHJldHJ5QWZ0ZXJgIERhdGUgdGhhdCB3ZSBzZXJpYWxpemUgYXNcbiAgICAvLyBhIG51bWVyaWMgZXBvY2ggdGltZXN0YW1wLiBUaGUgRGF0ZSByZWR1Y2VyIHVzZXMgYGluc3RhbmNlb2YgZ2xvYmFsLkRhdGVgLFxuICAgIC8vIHdoaWNoIGZhaWxzIGZvciBEYXRlcyBmcm9tIGEgZGlmZmVyZW50IFZNIHJlYWxtOyBzZXJpYWxpemluZyBhcyBhXG4gICAgLy8gbnVtYmVyIHNpZGVzdGVwcyB0aGF0IGlzc3VlLlxuICAgIFJldHJ5YWJsZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKCdSZXRyeWFibGVFcnJvcicsIHZhbHVlKTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmV0cnlBZnRlclJhdyA9ICh2YWx1ZSBhcyBSZXRyeWFibGVFcnJvcikucmV0cnlBZnRlciBhcyB1bmtub3duO1xuICAgICAgbGV0IHJldHJ5QWZ0ZXI6IG51bWJlcjtcbiAgICAgIGlmIChcbiAgICAgICAgcmV0cnlBZnRlclJhdyAmJlxuICAgICAgICB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIChyZXRyeUFmdGVyUmF3IGFzIHsgZ2V0VGltZT86IHVua25vd24gfSkuZ2V0VGltZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHQgPSAocmV0cnlBZnRlclJhdyBhcyBEYXRlKS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdudW1iZXInXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXJSYXcpLmdldFRpbWUoKTtcbiAgICAgICAgcmV0cnlBZnRlciA9IE51bWJlci5pc05hTih0KSA/IERhdGUubm93KCkgKyAxMDAwIDogdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBEYXRlLm5vdygpICsgMTAwMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIHJldHJ5QWZ0ZXIsXG4gICAgICB9IHNhdGlzZmllcyBTZXJpYWxpemFibGVTcGVjaWFsWydSZXRyeWFibGVFcnJvciddO1xuICAgIH0sXG4gICAgU3ludGF4RXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVVJJRXJyb3InKSxcbiAgICAvLyBBZ2dyZWdhdGVFcnJvciBpcyBzaW1pbGFyIHRvIG90aGVyIHN1YmNsYXNzZXMgYnV0IGFsc28gcHJlc2VydmVzIHRoZVxuICAgIC8vIGBlcnJvcnNgIGFycmF5LiBXZSBleHRlbmQgdGhlIGJhc2UgaGVscGVyJ3Mgb3V0cHV0IGhlcmUuXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoJ0FnZ3JlZ2F0ZUVycm9yJywgdmFsdWUpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBlcnJvcnM6ICh2YWx1ZSBhcyBBZ2dyZWdhdGVFcnJvcikuZXJyb3JzLFxuICAgICAgfSBzYXRpc2ZpZXMgU2VyaWFsaXphYmxlU3BlY2lhbFsnQWdncmVnYXRlRXJyb3InXTtcbiAgICB9LFxuICAgIC8vIEJhc2UgRXJyb3IgcmVkdWNlciDigJQgY2F0Y2gtYWxsIGZvciBhbnkgRXJyb3IgaW5zdGFuY2Ugbm90IG1hdGNoZWQgYnkgYVxuICAgIC8vIHNwZWNpZmljIHN1YmNsYXNzIHJlZHVjZXIgYWJvdmUgKGluY2x1ZGluZyB1c2VyIEVycm9yIHN1YmNsYXNzZXMgd2l0aG91dFxuICAgIC8vIFdPUktGTE9XX1NFUklBTElaRSkuIFByZXNlcnZlcyBgbmFtZWAgc28gdGhlIGVycm9yJ3MgaWRlbnRpdHkgaXMgcmV0YWluZWRcbiAgICAvLyBldmVuIHRob3VnaCB0aGUgZXhhY3QgY2xhc3MgY2Fubm90IGJlIHJlY29uc3RydWN0ZWQuXG4gICAgRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnRXJyb3InXSA9IHtcbiAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgfTtcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIEZsb2F0MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuRmxvYXQzMkFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgRmxvYXQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5GbG9hdDY0QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBIZWFkZXJzOiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkhlYWRlcnMgJiYgQXJyYXkuZnJvbSh2YWx1ZSksXG4gICAgSW50OEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5JbnQ4QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBJbnQxNkFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5JbnQxNkFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuSW50MzJBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIE1hcDogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5NYXAgJiYgQXJyYXkuZnJvbSh2YWx1ZSksXG4gICAgUmVnRXhwOiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5SZWdFeHAgJiYge1xuICAgICAgICBzb3VyY2U6IHZhbHVlLnNvdXJjZSxcbiAgICAgICAgZmxhZ3M6IHZhbHVlLmZsYWdzLFxuICAgICAgfSxcbiAgICAvLyBSZXF1ZXN0IGFuZCBSZXNwb25zZSBhcmUgaW50ZW50aW9uYWxseSBOT1QgaW4gY29tbW9uIHJlZHVjZXJzLlxuICAgIC8vIFRoZXkgcmVxdWlyZSBtb2RlLXNwZWNpZmljIHJldml2ZXJzIChzdHJlYW0gaGFuZGxpbmcsIGV0Yy4pIGFuZFxuICAgIC8vIGluY2x1ZGluZyB0aGVtIGhlcmUgd2l0aG91dCBtYXRjaGluZyByZXZpdmVycyB3b3VsZCBjYXVzZSB0aGVtXG4gICAgLy8gdG8gZGVzZXJpYWxpemUgYXMgcGxhaW4gb2JqZWN0cy5cbiAgICBTZXQ6ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuU2V0ICYmIEFycmF5LmZyb20odmFsdWUpLFxuICAgIFVSTDogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5VUkwgJiYgdmFsdWUuaHJlZixcbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIE9ubHkgbWF0Y2ggZnVuY3Rpb24gcmVmZXJlbmNlcyB3aXRoIGEgd29ya2Zsb3dJZCBwcm9wZXJ0eSAoc2V0IGJ5XG4gICAgICAvLyB0aGUgU1dDIGNvbXBpbGVyIG9uIHdvcmtmbG93IGZ1bmN0aW9ucykuIFBsYWluIHsgd29ya2Zsb3dJZCB9IG9iamVjdHNcbiAgICAgIC8vIGFyZSBOT1QgbWF0Y2hlZCDigJQgdGhpcyBwcmV2ZW50cyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2UgdGhlIHJlZHVjZWRcbiAgICAgIC8vIGZvcm0geyB3b3JrZmxvd0lkIH0gaXMgYSBwbGFpbiBvYmplY3QsIG5vdCBhIGZ1bmN0aW9uLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgd29ya2Zsb3dJZCA9ICh2YWx1ZSBhcyBhbnkpLndvcmtmbG93SWQ7XG4gICAgICBpZiAodHlwZW9mIHdvcmtmbG93SWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4geyB3b3JrZmxvd0lkIH07XG4gICAgfSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVVJMU2VhcmNoUGFyYW1zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHZhbHVlLnNpemUgPT09IDApIHJldHVybiAnLic7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9LFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlVpbnQ4QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVWludDhDbGFtcGVkQXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50MTZBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVWludDE2QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVWludDMyQXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgfTtcbn1cblxuLy8gLS0tLSBSZXZpdmVycyAtLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIEFycmF5QnVmZmVyOiAodmFsdWU6IHN0cmluZykgPT4gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCksXG4gICAgQmlnSW50OiAodmFsdWU6IHN0cmluZykgPT4gZ2xvYmFsLkJpZ0ludCh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5EYXRlKHZhbHVlKSxcbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgZ2xvYmFsLkRPTUV4Y2VwdGlvbih2YWx1ZS5tZXNzYWdlLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gRE9NRXhjZXB0aW9uJ3MgY29uc3RydWN0b3IgZG9lc24ndCBhY2NlcHQgYSBjYXVzZSBvcHRpb24sIHNvXG4gICAgICAvLyB3ZSBzZXQgaXQgbWFudWFsbHkgd2hlbiBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGRhdGEuXG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgZXJyb3IuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIEVycm9yIHN1YmNsYXNzIHJldml2ZXJzIHJlY29uc3RydWN0IHRoZSBjb3JyZWN0IGJ1aWx0LWluIEVycm9yIHR5cGUuXG4gICAgLy8gU2VlIGBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXJgIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgIEV2YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ0V2YWxFcnJvcicpLFxuICAgIC8vIGBGYXRhbEVycm9yYCBhbmQgYFJldHJ5YWJsZUVycm9yYCBhcmUgbm90IGJ1aWx0LWlucywgc28gd2UgcmVzb2x2ZSB0aGVtXG4gICAgLy8gZnJvbSB0aGUgY29uc3VtZXIncyBgZ2xvYmFsVGhpc2AgdmlhIGEgYFN5bWJvbC5mb3IoLi4uKWAga2V5IHJlZ2lzdGVyZWRcbiAgICAvLyBieSBgQHdvcmtmbG93L2Vycm9yc2Agb24gbG9hZC4gVGhpcyBtYWtlcyBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB3b3JrXG4gICAgLy8gaW4gdXNlciBjb2RlIHRoYXQgbGl2ZXMgaW4gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGlzIHJlZHVjZXIgbW9kdWxlXG4gICAgLy8gKGUuZy4gd2hlbiB0aGUgaG9zdCBoeWRyYXRlcyBhIHZhbHVlIGRlc3RpbmVkIGZvciBhIHdvcmtmbG93IFZNXG4gICAgLy8gY29udGV4dCkuIFNlZSB0aGUgcmVnaXN0cmF0aW9uIGJsb2NrIGF0IHRoZSBib3R0b20gb2ZcbiAgICAvLyBgcGFja2FnZXMvZXJyb3JzL3NyYy9pbmRleC50c2AgZm9yIGRldGFpbHMuIEZhbGxzIGJhY2sgdG8gdGhlIGltcG9ydGVkXG4gICAgLy8gY2xhc3MgZm9yIGVudmlyb25tZW50cyB3aGVyZSBubyBidW5kbGVkIGBAd29ya2Zsb3cvZXJyb3JzYCBoYXMgbG9hZGVkXG4gICAgLy8gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLlxuICAgIEZhdGFsRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9GYXRhbEVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgRmF0YWxFcnJvciB8IHVuZGVmaW5lZCkgPz8gRmF0YWxFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSBlcnJvci5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gVXNlIHRoZSBjb250ZXh0J3MgYERhdGVgIGNvbnN0cnVjdG9yIChtYXRjaGluZyB0aGUgcmVzdCBvZiB0aGlzXG4gICAgICAvLyBtb2R1bGUpIHNvIHRoZSByZXN1bHRpbmcgYHJldHJ5QWZ0ZXJgIERhdGUgcGFzc2VzIGBpbnN0YW5jZW9mXG4gICAgICAvLyBnbG9iYWwuRGF0ZWAgY2hlY2tzIGluIHRoZSB0YXJnZXQgcmVhbG0uIFNlZSB0aGUgRmF0YWxFcnJvciByZXZpdmVyXG4gICAgICAvLyBhYm92ZSBmb3Igd2h5IHdlIHJlc29sdmUgYFJldHJ5YWJsZUVycm9yYCBmcm9tIHRoZSBjb25zdW1lcidzXG4gICAgICAvLyBnbG9iYWxUaGlzIGluc3RlYWQgb2YgdGhlIGltcG9ydGVkIGNsYXNzLlxuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIFJldHJ5YWJsZUVycm9yIHwgdW5kZWZpbmVkKSA/PyBSZXRyeWFibGVFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSwge1xuICAgICAgICByZXRyeUFmdGVyOiBuZXcgZ2xvYmFsLkRhdGUodmFsdWUucmV0cnlBZnRlciksXG4gICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGVycm9yLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTeW50YXhFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcihnbG9iYWwsICdVUklFcnJvcicpLFxuICAgIEFnZ3JlZ2F0ZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IGdsb2JhbC5BZ2dyZWdhdGVFcnJvcihcbiAgICAgICAgdmFsdWUuZXJyb3JzLFxuICAgICAgICB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBvcHRzXG4gICAgICApO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICAvLyBCYXNlIEVycm9yIHJldml2ZXIg4oCUIHVzZWQgZm9yIHBsYWluIEVycm9yIGluc3RhbmNlcyBhbmQgdW5yZWNvZ25pemVkXG4gICAgLy8gRXJyb3Igc3ViY2xhc3Nlcy4gUHJlc2VydmVzIGBuYW1lYCBzbyB0aGUgZXJyb3IncyBpZGVudGl0eSBpcyByZXRhaW5lZC5cbiAgICBFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBnbG9iYWwuRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyk7XG4gICAgICBlcnJvci5uYW1lID0gdmFsdWUubmFtZTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuRmxvYXQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5GbG9hdDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuSW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgTWFwOiAodmFsdWUpID0+IG5ldyBnbG9iYWwuTWFwKHZhbHVlKSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5SZWdFeHAodmFsdWUuc291cmNlLCB2YWx1ZS5mbGFncyksXG4gICAgU2V0OiAodmFsdWUpID0+IG5ldyBnbG9iYWwuU2V0KHZhbHVlKSxcbiAgICBVUkw6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5VUkwodmFsdWUpLFxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLidcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT5cbiAgICAgIG5ldyBnbG9iYWwuVVJMU2VhcmNoUGFyYW1zKHZhbHVlID09PSAnLicgPyAnJyA6IHZhbHVlKSxcbiAgICBVaW50OEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuVWludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDhDbGFtcGVkQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50OENsYW1wZWRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50MTZBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gIH07XG59XG5cbi8vIFJlLWV4cG9ydCBmb3IgdXNlIGluIGxlZ2FjeSBjb21wYXRcbmV4cG9ydCB7IHJldml2ZSB9O1xuIl19
|
|
502
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixXQUFXLEdBQ1osTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsZUFBZSxFQUNmLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFlBQVksRUFDWixZQUFZLEVBQ1osZUFBZSxFQUNmLFdBQVcsRUFDWCxZQUFZLEVBQ1osV0FBVyxFQUNYLE9BQU8sRUFDUCx1QkFBdUIsRUFDdkIsUUFBUSxHQUNULE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsMkJBQTJCO0FBRTNCLFNBQVMsbUJBQW1CLENBQzFCLEtBQXNCLEVBQ3RCLE1BQWMsRUFDZCxNQUFjO0lBRWQsc0RBQXNEO0lBQ3RELElBQUksTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUM3Qiw4REFBOEQ7SUFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFzQjtJQUMxQyx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLHdFQUF3RTtJQUN4RSxjQUFjO0lBQ2QsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLE9B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QUUsQ0FDNUIsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RCxpQkFBaUIsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQ25DLElBQUksTUFBTSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRSxXQUFXLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUM3QixJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFELFdBQVcsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQzdCLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDM0QsQ0FBQztBQUNKLENBQUM7QUFFRCxxQ0FBcUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21tb24gcmVkdWNlcnMgYW5kIHJldml2ZXJzIGZvciB0eXBlcyBzaGFyZWQgYWNyb3NzIGFsbCBzZXJpYWxpemF0aW9uIG1vZGVzLlxuICpcbiAqIEhhbmRsZXM6IEFycmF5QnVmZmVyLCBCaWdJbnQsIHR5cGVkIGFycmF5cywgRGF0ZSwgRXJyb3IsIEhlYWRlcnMsIE1hcCwgU2V0LFxuICogUmVnRXhwLCBSZXF1ZXN0LCBSZXNwb25zZSwgVVJMLCBVUkxTZWFyY2hQYXJhbXMuXG4gKlxuICogTm90ZTogVXNlcyBOb2RlLmpzIEJ1ZmZlciBmb3IgYmFzZTY0IGVuY29kaW5nL2RlY29kaW5nLiBGb3IgZW52aXJvbm1lbnRzXG4gKiB3aXRob3V0IEJ1ZmZlciAoZS5nLiBRdWlja0pTIFZNKSwgYSBwb2x5ZmlsbCBvciBhbHRlcm5hdGl2ZSBiYXNlNjRcbiAqIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgbmVlZGVkLlxuICovXG5cbmltcG9ydCB7IHR5cGVzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIEZhdGFsRXJyb3IsXG4gIEhvb2tDb25mbGljdEVycm9yLFxuICBSZXRyeWFibGVFcnJvcixcbiAgUnVudGltZURlY3J5cHRpb25FcnJvcixcbiAgU3RyZWFtRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgYXJyYXlCdWZmZXJCeXRlTGVuZ3RoLFxuICBkYXRlR2V0RGF0ZSxcbiAgZGF0ZUdldFRpbWUsXG4gIGRhdGVUb0lTT1N0cmluZyxcbiAgaGFzUHJvcGVydHksXG4gIGhlYWRlcnNUb0VudHJpZXMsXG4gIGlzSW5zdGFuY2VPZlByb3RvdHlwZSxcbiAgbWFwVG9FbnRyaWVzLFxuICByZWFkUHJvcGVydHksXG4gIHJlY29yZEd1ZXN0Q29kZSxcbiAgcmVnRXhwRmxhZ3MsXG4gIHJlZ0V4cFNvdXJjZSxcbiAgc2V0VG9WYWx1ZXMsXG4gIHVybEhyZWYsXG4gIHVybFNlYXJjaFBhcmFtc1RvU3RyaW5nLFxuICB2aWV3SW5mbyxcbn0gZnJvbSAnLi4vaGFyZGVuZWQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWR1Y2VycywgUmV2aXZlcnMsIFNlcmlhbGl6YWJsZVNwZWNpYWwgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQmFzZTY0IGhlbHBlcnMgLS0tLVxuXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KFxuICB2YWx1ZTogQXJyYXlCdWZmZXJMaWtlLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgbGVuZ3RoOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIC8vIEF2b2lkIHJldHVybmluZyBmYWxzeSB2YWx1ZSBmb3IgemVyby1sZW5ndGggYnVmZmVyc1xuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJy4nO1xuICAvLyBDcmVhdGUgYSBwcm9wZXIgY29weSB0byBhdm9pZCBBcnJheUJ1ZmZlciBkZXRhY2htZW50IGlzc3Vlc1xuICBjb25zdCB1aW50OCA9IG5ldyBVaW50OEFycmF5KHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbSh1aW50OCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5mdW5jdGlvbiB2aWV3VG9CYXNlNjQodmFsdWU6IEFycmF5QnVmZmVyVmlldyk6IHN0cmluZyB7XG4gIC8vIFJlYWQgdGhlIHZpZXcncyByYW5nZSB0aHJvdWdoIGludGVybmFsLXNsb3QgZ2V0dGVycyAoc2VlIGhhcmRlbmVkLnRzKTpcbiAgLy8gb3duIHByb3BlcnRpZXMgc2hhZG93aW5nIGBidWZmZXJgL2BieXRlT2Zmc2V0YC9gYnl0ZUxlbmd0aGAgKG9yIHBhdGNoZWRcbiAgLy8gcHJvdG90eXBlIGdldHRlcnMgaW4gdGhlIHNhbmRib3ggcmVhbG0pIGNhbm5vdCBjaGFuZ2Ugd2hpY2ggYnl0ZXMgYXJlXG4gIC8vIHNlcmlhbGl6ZWQuXG4gIGNvbnN0IGluZm8gPSB2aWV3SW5mbyh2YWx1ZSk7XG4gIHJldHVybiBhcnJheUJ1ZmZlclRvQmFzZTY0KGluZm8uYnVmZmVyLCBpbmZvLmJ5dGVPZmZzZXQsIGluZm8uYnl0ZUxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIHJldml2ZUFycmF5QnVmZmVyKFxuICB2YWx1ZTogc3RyaW5nLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IEFycmF5QnVmZmVyIHtcbiAgY29uc3QgYmFzZTY0ID0gdmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWU7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBnbG9iYWwuQXJyYXlCdWZmZXIoYnVmZmVyLmxlbmd0aCk7XG4gIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgZ2xvYmFsLlVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICB1aW50OEFycmF5LnNldChidWZmZXIpO1xuICByZXR1cm4gYXJyYXlCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIHJldml2ZShzdHI6IHN0cmluZykge1xuICAvLyBkZXZhbHVlLnN0cmluZ2lmeSgpIGFsd2F5cyBwcm9kdWNlcyB2YWxpZCBKU09OOiBzcGVjaWFsIHZhbHVlc1xuICAvLyAodW5kZWZpbmVkLCBOYU4sIEluZmluaXR5LCAtMCkgYXJlIGVuY29kZWQgYXMgbmVnYXRpdmUgaW50ZWdlclxuICAvLyBzZW50aW5lbHMgYW5kIHRoZSByZW1haW5pbmcgc3RydWN0dXJlIGlzIG9yZGluYXJ5IEpTT04uIFBhcnNpbmdcbiAgLy8gd2l0aCBKU09OLnBhcnNlIHlpZWxkcyB0aGUgZmxhdHRlbmVkIGZvcm0gdGhhdCB1bmZsYXR0ZW4oKSBleHBlY3RzLlxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG4vLyAtLS0tIEVycm9yIHN1YmNsYXNzIGhlbHBlcnMgLS0tLVxuXG4vKipcbiAqIFRoZSBzaGFyZWQgc2hhcGUgdGhhdCBldmVyeSBFcnJvci1zdWJjbGFzcyByZWR1Y2VyIGluIHRoaXMgbW9kdWxlXG4gKiBwcm9kdWNlcy4gU29tZSBzdWJjbGFzc2VzIChlLmcuIGBBZ2dyZWdhdGVFcnJvcmAsIGBSZXRyeWFibGVFcnJvcmApIGV4dGVuZFxuICogdGhpcyB3aXRoIGFkZGl0aW9uYWwgZmllbGRzIGJ5IHNwcmVhZGluZyB0aGUgYmFzZSBwYXlsb2FkLlxuICovXG50eXBlIEJhc2VFcnJvclBheWxvYWQgPSB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhY2s/OiBzdHJpbmc7XG4gIGNhdXNlPzogdW5rbm93bjtcbn07XG5cbi8qKlxuICogU3Vic2V0IG9mIGBTZXJpYWxpemFibGVTcGVjaWFsYCBrZXlzIHdob3NlIHBheWxvYWQgc2hhcGUgaXMgZXhhY3RseSB0aGVcbiAqIGBCYXNlRXJyb3JQYXlsb2FkYC4gYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAgaXMgY29uc3RyYWluZWQgdG8gb25seVxuICogdGhlc2Uga2V5cyBzbyBpdHMgcmV0dXJuIHR5cGUgaXMgc291bmQ7IHN1YmNsYXNzZXMgdGhhdCBuZWVkIGV4dHJhXG4gKiBmaWVsZHMgKGxpa2UgYEFnZ3JlZ2F0ZUVycm9yLmVycm9yc2Agb3IgYFJldHJ5YWJsZUVycm9yLnJldHJ5QWZ0ZXJgKSB1c2VcbiAqIGByZWR1Y2VFcnJvckJhc2VgIGRpcmVjdGx5IGFuZCBleHRlbmQgdGhlIHJlc3VsdC5cbiAqL1xudHlwZSBTaW1wbGVFcnJvclN1YmNsYXNzS2V5ID0ge1xuICBbSyBpbiBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSBleHRlbmRzIEJhc2VFcnJvclBheWxvYWRcbiAgICA/IEJhc2VFcnJvclBheWxvYWQgZXh0ZW5kcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdXG4gICAgICA/IEtcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTtcblxuLyoqXG4gKiBSZWFkcyBgZXJyb3Iuc3RhY2tgIGZvciBzZXJpYWxpemF0aW9uLiBBIG5hdHVyYWwgVjggZXJyb3IgY2FycmllcyBgc3RhY2tgXG4gKiBhcyBhbiBvd24gKmFjY2Vzc29yKiB3aG9zZSBmaXJzdCBpbnZvY2F0aW9uIGZvcm1hdHMgYW5kIGNhY2hlcyB0aGUgdHJhY2UuXG4gKiBUaGF0IHJlYWQgaXMgbm90IHBhc3NpdmU6IGl0IGV4ZWN1dGVzIGBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZWAgd2hlbiB0aGVcbiAqIHJlYWxtIGhhcyBvbmUgaW5zdGFsbGVkLCBhbmQgdGhlIGZvcm1hdC1hbmQtY2FjaGUgaXRzZWxmIGlzXG4gKiB3b3JrZmxvdy12aXNpYmxlIChhIGZvcm1hdHRlciBpbnN0YWxsZWQgbGF0ZXIgbmV2ZXIgcnVucyBmb3IgYW5cbiAqIGFscmVhZHktbWF0ZXJpYWxpemVkIGVycm9yKS4gQSBjb2xkIHJlcGxheSByZXBlYXRzIG5laXRoZXIgKGl0IHNraXBzXG4gKiBkZWh5ZHJhdGlvbiBlbnRpcmVseSksIHNvIHRoZSByZWFkIGlzIHJlY29yZGVkIGFzIGd1ZXN0IGNvZGUuIEFcbiAqIGRhdGEtcHJvcGVydHkgYHN0YWNrYCAocmVoeWRyYXRlZCBlcnJvcnMsIHdvcmtmbG93LWFzc2lnbmVkIHN0cmluZ3MpXG4gKiByZWFkcyBwYXNzaXZlbHkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRFcnJvclN0YWNrKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUgYXMgb2JqZWN0LCAnc3RhY2snKTtcbiAgaWYgKGRlc2NyaXB0b3IgJiYgJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IudmFsdWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9XG4gIHJlY29yZEd1ZXN0Q29kZSgnZ2V0dGVyJywgJ3N0YWNrJyk7XG4gIGlmIChkZXNjcmlwdG9yPy5nZXQpIHtcbiAgICByZXR1cm4gZGVzY3JpcHRvci5nZXQuY2FsbCh2YWx1ZSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiByZWFkUHJvcGVydHkodmFsdWUsICdzdGFjaycpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWR1Y2VzIGFueSBuYXRpdmUgRXJyb3IgaW5zdGFuY2UgdG8gdGhlIHNoYXJlZCBgQmFzZUVycm9yUGF5bG9hZGAgc2hhcGUsXG4gKiBwcmVzZXJ2aW5nIGBjYXVzZWAgb25seSB3aGVuIHByZXNlbnQgKHRvIGRpc3Rpbmd1aXNoIFwibm8gY2F1c2VcIiBmcm9tXG4gKiBcImNhdXNlIGlzIHVuZGVmaW5lZFwiKS4gVXNlZCBkaXJlY3RseSBieSByZWR1Y2VycyBmb3Igc3ViY2xhc3NlcyB0aGF0IG5lZWRcbiAqIHRvIGV4dGVuZCB0aGUgc2hhcGUgd2l0aCBhZGRpdGlvbmFsIGZpZWxkcy5cbiAqXG4gKiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCBpcyB1c2VkIGluc3RlYWQgb2YgYGluc3RhbmNlb2ZgIGZvciBjcm9zcy1WTSBzYWZldHk6XG4gKiBlcnJvcnMgbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IFZNIGNvbnRleHQsIGFuZCBgaW5zdGFuY2VvZmAgZmFpbHNcbiAqIGFjcm9zcyBWTSBib3VuZGFyaWVzIHNpbmNlIGVhY2ggY29udGV4dCBoYXMgaXRzIG93biBFcnJvciBjb25zdHJ1Y3Rvci5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlRXJyb3JCYXNlKHZhbHVlOiB1bmtub3duKTogQmFzZUVycm9yUGF5bG9hZCB8IGZhbHNlIHtcbiAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBgbWVzc2FnZWAvYGNhdXNlYCBhcmUgb3duIGRhdGEgcHJvcGVydGllcyBvbiBuYXR1cmFsIGVycm9ycywgc28gdGhlXG4gIC8vIGRlc2NyaXB0b3ItYmFzZWQgcmVhZHMgY29zdCBub3RoaW5nOyBhIHNhbmRib3gtZGVmaW5lZCBhY2Nlc3NvclxuICAvLyAoZS5nLiBhIGdldHRlciBvbiBhbiBFcnJvciBzdWJjbGFzcykgaXMgc3RpbGwgaW52b2tlZCBidXQgcmVjb3JkZWQuXG4gIGNvbnN0IHJlZHVjZWQ6IEJhc2VFcnJvclBheWxvYWQgPSB7XG4gICAgbWVzc2FnZTogcmVhZFByb3BlcnR5KHZhbHVlLCAnbWVzc2FnZScpIGFzIHN0cmluZyxcbiAgICBzdGFjazogcmVhZEVycm9yU3RhY2sodmFsdWUpLFxuICB9O1xuICBpZiAoaGFzUHJvcGVydHkodmFsdWUsICdjYXVzZScpKSByZWR1Y2VkLmNhdXNlID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnY2F1c2UnKTtcbiAgcmV0dXJuIHJlZHVjZWQ7XG59XG5cbi8qKlxuICogUmVkdWNlcyBhIG5hdGl2ZSBlcnJvciB0byB0aGUgc2hhcmVkIGBCYXNlRXJyb3JQYXlsb2FkYCwgYnV0IG9ubHkgd2hlbiBpdHNcbiAqIGBuYW1lYCBpbnN0YW5jZSBwcm9wZXJ0eSBtYXRjaGVzIGBzdWJjbGFzc05hbWVgLiBVc2VkIGJ5OlxuICogICAtIGBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXJgLCBmb3Igc3ViY2xhc3NlcyB3aG9zZSBzZXJpYWxpemVkIHNoYXBlIGlzXG4gKiAgICAgZXhhY3RseSBgQmFzZUVycm9yUGF5bG9hZGAuXG4gKiAgIC0gSW5saW5lIHJlZHVjZXJzIGZvciBzdWJjbGFzc2VzIHRoYXQgZXh0ZW5kIHRoZSBzaGFwZSB3aXRoIGFkZGl0aW9uYWxcbiAqICAgICBmaWVsZHMgKGUuZy4gYEFnZ3JlZ2F0ZUVycm9yLmVycm9yc2AsIGBSZXRyeWFibGVFcnJvci5yZXRyeUFmdGVyYCkuXG4gKlxuICogTWF0Y2hpbmcgYnkgYHZhbHVlLm5hbWVgIChpbnN0ZWFkIG9mIGB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZWApIHdvcmtzIHdpdGhcbiAqIGJ1bmRsZXJzIHRoYXQgZW1pdCB0aGUgY2xhc3MgYXMgYW4gYW5vbnltb3VzIGV4cHJlc3Npb24uIEUuZy4gVHVyYm9wYWNrXG4gKiBjb21waWxlcyBgZXhwb3J0IGNsYXNzIEZhdGFsRXJyb3IgZXh0ZW5kcyBFcnJvciB74oCmfWAgdG8gYSByZWdpc3RyYXRpb24gY2FsbFxuICogbGlrZSBgZS5zKFtcIkZhdGFsRXJyb3JcIiwgMCwgY2xhc3MgZXh0ZW5kcyBFcnJvciB74oCmfV0pYCwgYW5kIHRoZSByZXN1bHRpbmdcbiAqIGNvbnN0cnVjdG9yIGhhcyBgbmFtZSA9PT0gJydgLiBTaW5jZSBldmVyeSBFcnJvciBzdWJjbGFzcyB3ZSBjYXJlIGFib3V0XG4gKiBzZXRzIGB0aGlzLm5hbWVgIGV4cGxpY2l0bHkgaW4gaXRzIGNvbnN0cnVjdG9yIChidWlsdC1pbiBzdWJjbGFzc2VzIGRvIHRoaXNcbiAqIGF1dG9tYXRpY2FsbHk7IGBGYXRhbEVycm9yYC9gUmV0cnlhYmxlRXJyb3JgIGRvIGl0IGluIHVzZXIgY29kZSksIHRoZVxuICogaW5zdGFuY2UgcHJvcGVydHkgaXMgdGhlIHJlbGlhYmxlIGlkZW50aXR5IG1hcmtlciBhY3Jvc3MgcmVhbG1zIGFuZFxuICogYnVuZGxlcnMuXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoXG4gIHN1YmNsYXNzTmFtZTogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93blxuKTogQmFzZUVycm9yUGF5bG9hZCB8IGZhbHNlIHtcbiAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAocmVhZFByb3BlcnR5KHZhbHVlLCAnbmFtZScpICE9PSBzdWJjbGFzc05hbWUpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHJlZHVjZUVycm9yQmFzZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlZHVjZXIgZm9yIGEgYnVpbHQtaW4gRXJyb3Igc3ViY2xhc3Mgd2hvc2Ugc2VyaWFsaXplZCBzaGFwZSBpc1xuICogZXhhY3RseSBgQmFzZUVycm9yUGF5bG9hZGAgKG5vIGV4dHJhIGZpZWxkcykuIFRoZSByZWR1Y2VyIG1hdGNoZXMgYnlcbiAqIGNvbnN0cnVjdG9yIG5hbWUgKGFmdGVyIHRoZSBpc05hdGl2ZUVycm9yIGdhdGUpLCBzaW5jZSBgaW5zdGFuY2VvZmAgbWF5XG4gKiBmYWlsIGFjcm9zcyBWTSBib3VuZGFyaWVzLlxuICovXG5mdW5jdGlvbiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXI8SyBleHRlbmRzIFNpbXBsZUVycm9yU3ViY2xhc3NLZXk+KFxuICBzdWJjbGFzc05hbWU6IEtcbikge1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSB8IGZhbHNlID0+IHtcbiAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZShzdWJjbGFzc05hbWUsIHZhbHVlKTtcbiAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYmFzZSBhcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZXZpdmVyIGZvciBhIGJ1aWx0LWluIEVycm9yIHN1YmNsYXNzLiBSZWNvbnN0cnVjdHMgdGhlIGNvcnJlY3RcbiAqIGJ1aWx0LWluIEVycm9yIHR5cGUgdXNpbmcgdGhlIGNvbnRleHQncyBjb25zdHJ1Y3Rvci4gVGhlIGBjYXVzZWAgb3B0aW9uIGlzXG4gKiBvbmx5IHBhc3NlZCB3aGVuIHRoZSBzZXJpYWxpemVkIGRhdGEgaW5jbHVkZXMgaXQsIHByZXNlcnZpbmcgdGhlIGRpc3RpbmN0aW9uXG4gKiBiZXR3ZWVuIFwibm8gY2F1c2VcIiBhbmQgXCJjYXVzZSBpcyB1bmRlZmluZWRcIi5cbiAqL1xuZnVuY3Rpb24gbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyPEsgZXh0ZW5kcyBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsPihcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBjdG9yTmFtZTogc3RyaW5nXG4pIHtcbiAgcmV0dXJuICh2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSkgPT4ge1xuICAgIGNvbnN0IHYgPSB2YWx1ZSBhcyBCYXNlRXJyb3JQYXlsb2FkO1xuICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHYgPyB7IGNhdXNlOiB2LmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgQ3RvciA9IGdsb2JhbFtjdG9yTmFtZV07XG4gICAgY29uc3QgZXJyb3I6IEVycm9yID0gbmV3IEN0b3Iodi5tZXNzYWdlLCBvcHRzKTtcbiAgICBpZiAodi5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHYuc3RhY2s7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vLyAtLS0tIFJlZHVjZXJzIC0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJlZHVjZXJzKFxuICAvLyBUaGUgYGdsb2JhbGAgcGFyYW1ldGVyIGlzIHJldGFpbmVkIGZvciBBUEkgY29tcGF0aWJpbGl0eSwgYnV0IHRoZVxuICAvLyByZWR1Y2VycyBubyBsb25nZXIgcGVyZm9ybSBgaW5zdGFuY2VvZiBnbG9iYWwuWGAgY2hlY2tzOiBjbGFzc2lmaWNhdGlvblxuICAvLyBpcyBkb25lIHdpdGggZW5naW5lLWxldmVsIGJyYW5kIGNoZWNrcyAocmVhbG0tYWdub3N0aWMsIGltbXVuZSB0b1xuICAvLyByZWFzc2lnbmVkIHNhbmRib3ggZ2xvYmFscyBhbmQgYFN5bWJvbC5oYXNJbnN0YW5jZWApLCBhbmQgZXh0cmFjdGlvblxuICAvLyBnb2VzIHRocm91Z2ggaW50cmluc2ljcyBjYXB0dXJlZCBhdCBob3N0IGJvb3QuIFNlZSAuLi9oYXJkZW5lZC50cy5cbiAgX2dsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICBBcnJheUJ1ZmZlcjogKHZhbHVlKSA9PlxuICAgICAgdHlwZXMuaXNBcnJheUJ1ZmZlcih2YWx1ZSkgJiZcbiAgICAgIGFycmF5QnVmZmVyVG9CYXNlNjQodmFsdWUsIDAsIGFycmF5QnVmZmVyQnl0ZUxlbmd0aCh2YWx1ZSkpLFxuICAgIEJpZ0ludDogKHZhbHVlKSA9PlxuICAgICAgLy8gU3RyaW5nKGJpZ2ludCkgaXMgYSBzcGVjLWludGVybmFsIG51bWVyaWMgY29udmVyc2lvbjogdW5saWtlXG4gICAgICAvLyBgdmFsdWUudG9TdHJpbmcoKWAsIGl0IG5ldmVyIGNvbnN1bHRzIEJpZ0ludC5wcm90b3R5cGUuXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnICYmIFN0cmluZyh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdHlwZXMuaXNCaWdJbnQ2NEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB0eXBlcy5pc0JpZ1VpbnQ2NEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gQnJhbmQgY2hlY2sgKyBjYXB0dXJlZCBpbnRyaW5zaWNzOiBhIHNhbmRib3gtc2lkZSBwYXRjaCBvZlxuICAgICAgLy8gYERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nYCAoZS5nLiBhIFRlbXBvcmFsIHBvbHlmaWxsIHdyYXBwaW5nIGl0KVxuICAgICAgLy8gaXMgbmV2ZXIgZXhlY3V0ZWQsIGFuZCBjYW5ub3QgcGVydHVyYiBWTSBzdGF0ZSBkdXJpbmcgc2VyaWFsaXphdGlvbi5cbiAgICAgIGlmICghdHlwZXMuaXNEYXRlKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgdmFsaWQgPSAhTnVtYmVyLmlzTmFOKGRhdGVHZXREYXRlKHZhbHVlKSk7XG4gICAgICByZXR1cm4gdmFsaWQgPyBkYXRlVG9JU09TdHJpbmcodmFsdWUpIDogJy4nO1xuICAgIH0sXG4gICAgLy8gRE9NRXhjZXB0aW9uIGlzIGEgc3BlY2lhbCBjYXNlOiBpdCBgaW5zdGFuY2VvZiBFcnJvcmAgaXMgdHJ1ZSBpbiBOb2RlLFxuICAgIC8vIGJ1dCBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCByZXR1cm5zIEZBTFNFIGZvciBpdCwgc28gdGhlIGdlbmVyaWMgRXJyb3JcbiAgICAvLyByZWR1Y2VyICh3aGljaCBnYXRlcyBvbiBpc05hdGl2ZUVycm9yKSB3b24ndCBtYXRjaC4gQ2hlY2sgaXQgZXhwbGljaXRseVxuICAgIC8vIGJ5IGNvbnN0cnVjdG9yIG5hbWUgKyBFcnJvciBpbmhlcml0YW5jZSBzbyB3ZSBjYXRjaCBET01FeGNlcHRpb25zIGZyb21cbiAgICAvLyBhbnkgcmVhbG0gKGNyb3NzLVZNIHNhZmV0eTogaW5zdGFuY2VvZiBnbG9iYWwuRE9NRXhjZXB0aW9uIHdvdWxkIGZhaWxcbiAgICAvLyBmb3IgaW5zdGFuY2VzIG1pbnRlZCBpbiBhbm90aGVyIGNvbnRleHQpLlxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgY3RvciA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2NvbnN0cnVjdG9yJyk7XG4gICAgICBpZiAoIWN0b3IgfHwgcmVhZFByb3BlcnR5KGN0b3IsICduYW1lJykgIT09ICdET01FeGNlcHRpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydET01FeGNlcHRpb24nXSA9IHtcbiAgICAgICAgbWVzc2FnZTogcmVhZFByb3BlcnR5KHZhbHVlLCAnbWVzc2FnZScpIGFzIHN0cmluZyxcbiAgICAgICAgbmFtZTogcmVhZFByb3BlcnR5KHZhbHVlLCAnbmFtZScpIGFzIHN0cmluZyxcbiAgICAgICAgc3RhY2s6IHJlYWRFcnJvclN0YWNrKHZhbHVlKSxcbiAgICAgIH07XG4gICAgICBpZiAoaGFzUHJvcGVydHkodmFsdWUsICdjYXVzZScpKSB7XG4gICAgICAgIHJlZHVjZWQuY2F1c2UgPSByZWFkUHJvcGVydHkodmFsdWUsICdjYXVzZScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICAvLyBFcnJvciBzdWJjbGFzcyByZWR1Y2VycyBhcmUgaW50ZW50aW9uYWxseSBwbGFjZWQgYmVmb3JlIHRoZSBiYXNlIEVycm9yXG4gICAgLy8gcmVkdWNlciBiZWNhdXNlIGRldmFsdWUgdXNlcyBmaXJzdC1tYXRjaC13aW5zLiBTdWJjbGFzcy1zcGVjaWZpYyByZWR1Y2Vyc1xuICAgIC8vIG11c3QgYmUgY2hlY2tlZCBmaXJzdCBzbyB0aGF0IGUuZy4gYSBUeXBlRXJyb3IgaXMgc2VyaWFsaXplZCBhcyBcIlR5cGVFcnJvclwiXG4gICAgLy8gcmF0aGVyIHRoYW4gZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIFwiRXJyb3JcIiByZWR1Y2VyLlxuICAgIC8vIFNlZSBgbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyYCBmb3IgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cbiAgICBFdmFsRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignRXZhbEVycm9yJyksXG4gICAgRmF0YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdGYXRhbEVycm9yJyksXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoJ0hvb2tDb25mbGljdEVycm9yJywgdmFsdWUpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydIb29rQ29uZmxpY3RFcnJvciddID0ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICB0b2tlbjogcmVhZFByb3BlcnR5KHZhbHVlLCAndG9rZW4nKSBhcyBIb29rQ29uZmxpY3RFcnJvclsndG9rZW4nXSxcbiAgICAgIH07XG4gICAgICBjb25zdCBjb25mbGljdGluZ1J1bklkID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnY29uZmxpY3RpbmdSdW5JZCcpIGFzXG4gICAgICAgIHwgSG9va0NvbmZsaWN0RXJyb3JbJ2NvbmZsaWN0aW5nUnVuSWQnXVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjb25mbGljdGluZ1J1bklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVkdWNlZC5jb25mbGljdGluZ1J1bklkID0gY29uZmxpY3RpbmdSdW5JZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdSYW5nZUVycm9yJyksXG4gICAgUmVmZXJlbmNlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignUmVmZXJlbmNlRXJyb3InKSxcbiAgICAvLyBSZXRyeWFibGVFcnJvciBjYXJyaWVzIGFuIGV4dHJhIGByZXRyeUFmdGVyYCBEYXRlIHRoYXQgd2Ugc2VyaWFsaXplIGFzXG4gICAgLy8gYSBudW1lcmljIGVwb2NoIHRpbWVzdGFtcC4gVGhlIERhdGUgcmVkdWNlciB1c2VzIGBpbnN0YW5jZW9mIGdsb2JhbC5EYXRlYCxcbiAgICAvLyB3aGljaCBmYWlscyBmb3IgRGF0ZXMgZnJvbSBhIGRpZmZlcmVudCBWTSByZWFsbTsgc2VyaWFsaXppbmcgYXMgYVxuICAgIC8vIG51bWJlciBzaWRlc3RlcHMgdGhhdCBpc3N1ZS5cbiAgICBSZXRyeWFibGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZSgnUmV0cnlhYmxlRXJyb3InLCB2YWx1ZSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJldHJ5QWZ0ZXJSYXcgPSByZWFkUHJvcGVydHkodmFsdWUsICdyZXRyeUFmdGVyJyk7XG4gICAgICBsZXQgcmV0cnlBZnRlcjogbnVtYmVyO1xuICAgICAgaWYgKHR5cGVzLmlzRGF0ZShyZXRyeUFmdGVyUmF3KSkge1xuICAgICAgICAvLyBHZW51aW5lIERhdGUgKGFueSByZWFsbSk6IHJlYWQgdGhlIGVwb2NoIHRocm91Z2ggdGhlIGludHJpbnNpYy5cbiAgICAgICAgY29uc3QgdCA9IGRhdGVHZXRUaW1lKHJldHJ5QWZ0ZXJSYXcpO1xuICAgICAgICByZXRyeUFmdGVyID0gTnVtYmVyLmlzTmFOKHQpID8gRGF0ZS5ub3coKSArIDEwMDAgOiB0O1xuICAgICAgfSBlbHNlIGlmIChyZXRyeUFmdGVyUmF3ICYmIHR5cGVvZiByZXRyeUFmdGVyUmF3ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBEdWNrLXR5cGVkIGRhdGUtbGlrZTogaW52b2tpbmcgaXRzIGdldFRpbWUoKSBydW5zIHdvcmtmbG93IGNvZGUuXG4gICAgICAgIGNvbnN0IGdldFRpbWUgPSByZWFkUHJvcGVydHkocmV0cnlBZnRlclJhdywgJ2dldFRpbWUnKTtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRUaW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmVjb3JkR3Vlc3RDb2RlKCdtZXRob2QnLCAnZ2V0VGltZScpO1xuICAgICAgICAgIGNvbnN0IHQgPSAoZ2V0VGltZSBhcyAodGhpczogdW5rbm93bikgPT4gbnVtYmVyKS5jYWxsKHJldHJ5QWZ0ZXJSYXcpO1xuICAgICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0cnlBZnRlciA9IERhdGUubm93KCkgKyAxMDAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdudW1iZXInXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXJSYXcpLmdldFRpbWUoKTtcbiAgICAgICAgcmV0cnlBZnRlciA9IE51bWJlci5pc05hTih0KSA/IERhdGUubm93KCkgKyAxMDAwIDogdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBEYXRlLm5vdygpICsgMTAwMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIHJldHJ5QWZ0ZXIsXG4gICAgICB9IHNhdGlzZmllcyBTZXJpYWxpemFibGVTcGVjaWFsWydSZXRyeWFibGVFcnJvciddO1xuICAgIH0sXG4gICAgLy8gUnVudGltZURlY3J5cHRpb25FcnJvciBjYXJyaWVzIGFuIGV4dHJhIGBjb250ZXh0YCBvYmplY3QgKG9wZXJhdGlvbixcbiAgICAvLyBieXRlTGVuZ3RoLCBmb3JtYXRQcmVmaXgpIHRoYXQgdGhlIGdlbmVyaWMgRXJyb3IgcmVkdWNlciB3b3VsZCBkcm9wLlxuICAgIC8vIFByZXNlcnZlIGl0IHNvIHRoZSBkaWFnbm9zdGljIGRhdGEgc3Vydml2ZXMgdGhlIHJ1bi1lcnJvciByb3VuZCB0cmlwLlxuICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoXG4gICAgICAgICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJyxcbiAgICAgICAgdmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InXSA9IHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgIH07XG4gICAgICBjb25zdCBjb250ZXh0ID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnY29udGV4dCcpIGFzXG4gICAgICAgIHwgUnVudGltZURlY3J5cHRpb25FcnJvclsnY29udGV4dCddXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWR1Y2VkLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICBTdHJlYW1FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZSgnU3RyZWFtRXJyb3InLCB2YWx1ZSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1N0cmVhbUVycm9yJ10gPSB7IC4uLmJhc2UgfTtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3N0YXR1cycpO1xuICAgICAgY29uc3QgdXJsID0gcmVhZFByb3BlcnR5KHZhbHVlLCAndXJsJyk7XG4gICAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHJlZHVjZWQuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSByZWR1Y2VkLnVybCA9IHVybDtcbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgU3ludGF4RXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVVJJRXJyb3InKSxcbiAgICAvLyBBZ2dyZWdhdGVFcnJvciBpcyBzaW1pbGFyIHRvIG90aGVyIHN1YmNsYXNzZXMgYnV0IGFsc28gcHJlc2VydmVzIHRoZVxuICAgIC8vIGBlcnJvcnNgIGFycmF5LiBXZSBleHRlbmQgdGhlIGJhc2UgaGVscGVyJ3Mgb3V0cHV0IGhlcmUuXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoJ0FnZ3JlZ2F0ZUVycm9yJywgdmFsdWUpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBlcnJvcnM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2Vycm9ycycpIGFzIEFnZ3JlZ2F0ZUVycm9yWydlcnJvcnMnXSxcbiAgICAgIH0gc2F0aXNmaWVzIFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0FnZ3JlZ2F0ZUVycm9yJ107XG4gICAgfSxcbiAgICAvLyBCYXNlIEVycm9yIHJlZHVjZXI6IGNhdGNoLWFsbCBmb3IgYW55IEVycm9yIGluc3RhbmNlIG5vdCBtYXRjaGVkIGJ5IGFcbiAgICAvLyBzcGVjaWZpYyBzdWJjbGFzcyByZWR1Y2VyIGFib3ZlIChpbmNsdWRpbmcgdXNlciBFcnJvciBzdWJjbGFzc2VzIHdpdGhvdXRcbiAgICAvLyBXT1JLRkxPV19TRVJJQUxJWkUpLiBQcmVzZXJ2ZXMgYG5hbWVgIHNvIHRoZSBlcnJvcidzIGlkZW50aXR5IGlzIHJldGFpbmVkXG4gICAgLy8gZXZlbiB0aG91Z2ggdGhlIGV4YWN0IGNsYXNzIGNhbm5vdCBiZSByZWNvbnN0cnVjdGVkLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghdHlwZXMuaXNOYXRpdmVFcnJvcih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0Vycm9yJ10gPSB7XG4gICAgICAgIG5hbWU6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnKSBhcyBzdHJpbmcsXG4gICAgICAgIG1lc3NhZ2U6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ21lc3NhZ2UnKSBhcyBzdHJpbmcsXG4gICAgICAgIHN0YWNrOiByZWFkRXJyb3JTdGFjayh2YWx1ZSksXG4gICAgICB9O1xuICAgICAgaWYgKGhhc1Byb3BlcnR5KHZhbHVlLCAnY2F1c2UnKSkge1xuICAgICAgICByZWR1Y2VkLmNhdXNlID0gcmVhZFByb3BlcnR5KHZhbHVlLCAnY2F1c2UnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWUpID0+IHR5cGVzLmlzRmxvYXQzMkFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0Zsb2F0NjRBcnJheSh2YWx1ZSkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICAvLyBIZWFkZXJzIGlzIGEgaG9zdCBjbGFzcyBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LCBzbyBpdHMgKHNoYXJlZClcbiAgICAvLyBwcm90b3R5cGUgaXMgcmVhY2hhYmxlIGZyb20gd29ya2Zsb3cgY29kZTsgaXRlcmF0ZSB0aHJvdWdoIHRoZVxuICAgIC8vIGJvb3QtY2FwdHVyZWQgaXRlcmF0b3IgaW5zdGVhZCBvZiBhIGxpdmUgU3ltYm9sLml0ZXJhdG9yIGxvb2t1cC5cbiAgICBIZWFkZXJzOiAodmFsdWUpID0+XG4gICAgICBpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIEhlYWRlcnMucHJvdG90eXBlKSAmJlxuICAgICAgaGVhZGVyc1RvRW50cmllcyh2YWx1ZSBhcyBIZWFkZXJzKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNJbnQ4QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0ludDE2QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MzJBcnJheTogKHZhbHVlKSA9PiB0eXBlcy5pc0ludDMyQXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgLy8gRW5naW5lIGJyYW5kIGNoZWNrICsgaG9zdC1yZWFsbSBpdGVyYXRpb246IGEgcGF0Y2hlZFxuICAgIC8vIGBNYXAucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl1gIGluIHRoZSBzYW5kYm94IGlzIG5ldmVyIGNvbnN1bHRlZC5cbiAgICBNYXA6ICh2YWx1ZSkgPT5cbiAgICAgIHR5cGVzLmlzTWFwKHZhbHVlKSAmJiBtYXBUb0VudHJpZXModmFsdWUgYXMgTWFwPHVua25vd24sIHVua25vd24+KSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT5cbiAgICAgIHR5cGVzLmlzUmVnRXhwKHZhbHVlKSAmJiB7XG4gICAgICAgIHNvdXJjZTogcmVnRXhwU291cmNlKHZhbHVlKSxcbiAgICAgICAgZmxhZ3M6IHJlZ0V4cEZsYWdzKHZhbHVlKSxcbiAgICAgIH0sXG4gICAgLy8gUmVxdWVzdCBhbmQgUmVzcG9uc2UgYXJlIGludGVudGlvbmFsbHkgTk9UIGluIGNvbW1vbiByZWR1Y2Vycy5cbiAgICAvLyBUaGV5IHJlcXVpcmUgbW9kZS1zcGVjaWZpYyByZXZpdmVycyAoc3RyZWFtIGhhbmRsaW5nLCBldGMuKSBhbmRcbiAgICAvLyBpbmNsdWRpbmcgdGhlbSBoZXJlIHdpdGhvdXQgbWF0Y2hpbmcgcmV2aXZlcnMgd291bGQgY2F1c2UgdGhlbVxuICAgIC8vIHRvIGRlc2VyaWFsaXplIGFzIHBsYWluIG9iamVjdHMuXG4gICAgU2V0OiAodmFsdWUpID0+IHR5cGVzLmlzU2V0KHZhbHVlKSAmJiBzZXRUb1ZhbHVlcyh2YWx1ZSBhcyBTZXQ8dW5rbm93bj4pLFxuICAgIFVSTDogKHZhbHVlKSA9PlxuICAgICAgaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCBVUkwucHJvdG90eXBlKSAmJiB1cmxIcmVmKHZhbHVlIGFzIFVSTCksXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBPbmx5IG1hdGNoIGZ1bmN0aW9uIHJlZmVyZW5jZXMgd2l0aCBhIHdvcmtmbG93SWQgcHJvcGVydHkgKHNldCBieVxuICAgICAgLy8gdGhlIFNXQyBjb21waWxlciBvbiB3b3JrZmxvdyBmdW5jdGlvbnMpLiBQbGFpbiB7IHdvcmtmbG93SWQgfSBvYmplY3RzXG4gICAgICAvLyBhcmUgTk9UIG1hdGNoZWQ7IHRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIHNpbmNlIHRoZSByZWR1Y2VkXG4gICAgICAvLyBmb3JtIHsgd29ya2Zsb3dJZCB9IGlzIGEgcGxhaW4gb2JqZWN0LCBub3QgYSBmdW5jdGlvbi5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHdvcmtmbG93SWQgPSByZWFkUHJvcGVydHkodmFsdWUsICd3b3JrZmxvd0lkJyk7XG4gICAgICBpZiAodHlwZW9mIHdvcmtmbG93SWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4geyB3b3JrZmxvd0lkIH07XG4gICAgfSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRleHQgPSB1cmxTZWFyY2hQYXJhbXNUb1N0cmluZyh2YWx1ZSBhcyBVUkxTZWFyY2hQYXJhbXMpO1xuICAgICAgcmV0dXJuIHRleHQgPT09ICcnID8gJy4nIDogdGV4dDtcbiAgICB9LFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNVaW50OEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWUpID0+XG4gICAgICB0eXBlcy5pc1VpbnQ4Q2xhbXBlZEFycmF5KHZhbHVlKSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWUpID0+IHR5cGVzLmlzVWludDE2QXJyYXkodmFsdWUpICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZSkgPT4gdHlwZXMuaXNVaW50MzJBcnJheSh2YWx1ZSkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgfTtcbn1cblxuLy8gLS0tLSBSZXZpdmVycyAtLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIEFycmF5QnVmZmVyOiAodmFsdWU6IHN0cmluZykgPT4gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCksXG4gICAgQmlnSW50OiAodmFsdWU6IHN0cmluZykgPT4gZ2xvYmFsLkJpZ0ludCh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5EYXRlKHZhbHVlKSxcbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgZ2xvYmFsLkRPTUV4Y2VwdGlvbih2YWx1ZS5tZXNzYWdlLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gRE9NRXhjZXB0aW9uJ3MgY29uc3RydWN0b3IgZG9lc24ndCBhY2NlcHQgYSBjYXVzZSBvcHRpb24sIHNvXG4gICAgICAvLyB3ZSBzZXQgaXQgbWFudWFsbHkgd2hlbiBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGRhdGEuXG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgZXJyb3IuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIEVycm9yIHN1YmNsYXNzIHJldml2ZXJzIHJlY29uc3RydWN0IHRoZSBjb3JyZWN0IGJ1aWx0LWluIEVycm9yIHR5cGUuXG4gICAgLy8gU2VlIGBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXJgIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgIEV2YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ0V2YWxFcnJvcicpLFxuICAgIC8vIGBGYXRhbEVycm9yYCBhbmQgYFJldHJ5YWJsZUVycm9yYCBhcmUgbm90IGJ1aWx0LWlucywgc28gd2UgcmVzb2x2ZSB0aGVtXG4gICAgLy8gZnJvbSB0aGUgY29uc3VtZXIncyBgZ2xvYmFsVGhpc2AgdmlhIGEgYFN5bWJvbC5mb3IoLi4uKWAga2V5IHJlZ2lzdGVyZWRcbiAgICAvLyBieSBgQHdvcmtmbG93L2Vycm9yc2Agb24gbG9hZC4gVGhpcyBtYWtlcyBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB3b3JrXG4gICAgLy8gaW4gdXNlciBjb2RlIHRoYXQgbGl2ZXMgaW4gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGlzIHJlZHVjZXIgbW9kdWxlXG4gICAgLy8gKGUuZy4gd2hlbiB0aGUgaG9zdCBoeWRyYXRlcyBhIHZhbHVlIGRlc3RpbmVkIGZvciBhIHdvcmtmbG93IFZNXG4gICAgLy8gY29udGV4dCkuIFNlZSB0aGUgcmVnaXN0cmF0aW9uIGJsb2NrIGF0IHRoZSBib3R0b20gb2ZcbiAgICAvLyBgcGFja2FnZXMvZXJyb3JzL3NyYy9pbmRleC50c2AgZm9yIGRldGFpbHMuIEZhbGxzIGJhY2sgdG8gdGhlIGltcG9ydGVkXG4gICAgLy8gY2xhc3MgZm9yIGVudmlyb25tZW50cyB3aGVyZSBubyBidW5kbGVkIGBAd29ya2Zsb3cvZXJyb3JzYCBoYXMgbG9hZGVkXG4gICAgLy8gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLlxuICAgIEZhdGFsRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9GYXRhbEVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgRmF0YWxFcnJvciB8IHVuZGVmaW5lZCkgPz8gRmF0YWxFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSBlcnJvci5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9Ib29rQ29uZmxpY3RFcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIEhvb2tDb25mbGljdEVycm9yIHwgdW5kZWZpbmVkKSA/PyBIb29rQ29uZmxpY3RFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUudG9rZW4sIHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkge1xuICAgICAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gVXNlIHRoZSBjb250ZXh0J3MgYERhdGVgIGNvbnN0cnVjdG9yIChtYXRjaGluZyB0aGUgcmVzdCBvZiB0aGlzXG4gICAgICAvLyBtb2R1bGUpIHNvIHRoZSByZXN1bHRpbmcgYHJldHJ5QWZ0ZXJgIERhdGUgcGFzc2VzIGBpbnN0YW5jZW9mXG4gICAgICAvLyBnbG9iYWwuRGF0ZWAgY2hlY2tzIGluIHRoZSB0YXJnZXQgcmVhbG0uIFNlZSB0aGUgRmF0YWxFcnJvciByZXZpdmVyXG4gICAgICAvLyBhYm92ZSBmb3Igd2h5IHdlIHJlc29sdmUgYFJldHJ5YWJsZUVycm9yYCBmcm9tIHRoZSBjb25zdW1lcidzXG4gICAgICAvLyBnbG9iYWxUaGlzIGluc3RlYWQgb2YgdGhlIGltcG9ydGVkIGNsYXNzLlxuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIFJldHJ5YWJsZUVycm9yIHwgdW5kZWZpbmVkKSA/PyBSZXRyeWFibGVFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSwge1xuICAgICAgICByZXRyeUFmdGVyOiBuZXcgZ2xvYmFsLkRhdGUodmFsdWUucmV0cnlBZnRlciksXG4gICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGVycm9yLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBSdW50aW1lRGVjcnlwdGlvbkVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFJlc29sdmUgZnJvbSB0aGUgY29uc3VtZXIncyBnbG9iYWxUaGlzIChzZWUgdGhlIEZhdGFsRXJyb3IgcmV2aXZlclxuICAgICAgLy8gYWJvdmUpIHNvIGBpbnN0YW5jZW9mIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JgIGhvbGRzIGFjcm9zcyByZWFsbXMuXG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InKVxuICAgICAgICBdIGFzIHR5cGVvZiBSdW50aW1lRGVjcnlwdGlvbkVycm9yIHwgdW5kZWZpbmVkKSA/P1xuICAgICAgICBSdW50aW1lRGVjcnlwdGlvbkVycm9yO1xuICAgICAgY29uc3Qgb3B0czogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBSdW50aW1lRGVjcnlwdGlvbkVycm9yPlsxXSA9IHt9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIG9wdHMuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIGlmICh2YWx1ZS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIG9wdHMuY29udGV4dCA9IHZhbHVlLmNvbnRleHQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBDdG9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTdHJlYW1FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL1N0cmVhbUVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgU3RyZWFtRXJyb3IgfCB1bmRlZmluZWQpID8/IFN0cmVhbUVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS5tZXNzYWdlLCB7XG4gICAgICAgIC4uLignY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHt9KSxcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgfSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFN5bnRheEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcihnbG9iYWwsICdUeXBlRXJyb3InKSxcbiAgICBVUklFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1VSSUVycm9yJyksXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgZ2xvYmFsLkFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICB2YWx1ZS5lcnJvcnMsXG4gICAgICAgIHZhbHVlLm1lc3NhZ2UsXG4gICAgICAgIG9wdHNcbiAgICAgICk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIEJhc2UgRXJyb3IgcmV2aXZlcjogdXNlZCBmb3IgcGxhaW4gRXJyb3IgaW5zdGFuY2VzIGFuZCB1bnJlY29nbml6ZWRcbiAgICAvLyBFcnJvciBzdWJjbGFzc2VzLiBQcmVzZXJ2ZXMgYG5hbWVgIHNvIHRoZSBlcnJvcidzIGlkZW50aXR5IGlzIHJldGFpbmVkLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IGdsb2JhbC5FcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKTtcbiAgICAgIGVycm9yLm5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBGbG9hdDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5GbG9hdDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkZsb2F0NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgSGVhZGVyczogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUpLFxuICAgIEludDhBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkludDE2QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBNYXA6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5NYXAodmFsdWUpLFxuICAgIFJlZ0V4cDogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLlJlZ0V4cCh2YWx1ZS5zb3VyY2UsIHZhbHVlLmZsYWdzKSxcbiAgICBTZXQ6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5TZXQodmFsdWUpLFxuICAgIFVSTDogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLlVSTCh2YWx1ZSksXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuICAgIFVSTFNlYXJjaFBhcmFtczogKHZhbHVlKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VUkxTZWFyY2hQYXJhbXModmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWUpLFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50OEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50MzJBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgfTtcbn1cblxuLy8gUmUtZXhwb3J0IGZvciB1c2UgaW4gbGVnYWN5IGNvbXBhdFxuZXhwb3J0IHsgcmV2aXZlIH07XG4iXX0=
|