@workflow/core 5.0.0-beta.4 → 5.0.0-beta.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/attribute-changes.d.ts +7 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +33 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +71 -4
- package/dist/capture-stack.d.ts +16 -0
- package/dist/capture-stack.d.ts.map +1 -0
- package/dist/capture-stack.js +21 -0
- 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 +26 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +109 -6
- package/dist/context-errors.d.ts +27 -0
- package/dist/context-errors.d.ts.map +1 -0
- package/dist/context-errors.js +101 -0
- package/dist/context-violation-error.d.ts +97 -0
- package/dist/context-violation-error.d.ts.map +1 -0
- package/dist/context-violation-error.js +149 -0
- package/dist/create-hook.d.ts +62 -4
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +4 -3
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +20 -5
- package/dist/describe-error.d.ts +70 -0
- package/dist/describe-error.d.ts.map +1 -0
- package/dist/describe-error.js +189 -0
- package/dist/encryption.d.ts +37 -3
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +97 -31
- package/dist/events-consumer.d.ts +147 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +444 -43
- package/dist/flushable-stream.d.ts +65 -10
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +131 -18
- package/dist/global.d.ts +37 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/log-format.d.ts +25 -0
- package/dist/log-format.d.ts.map +1 -0
- package/dist/log-format.js +250 -0
- package/dist/logger.d.ts +29 -30
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +82 -32
- package/dist/private.d.ts +246 -8
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +345 -9
- package/dist/replay-payload-cache.d.ts +68 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +160 -0
- package/dist/runtime/compute-instance.d.ts +12 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +13 -0
- package/dist/runtime/constants.d.ts +251 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +425 -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 +25 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +92 -0
- package/dist/runtime/get-world-lazy.d.ts +23 -0
- package/dist/runtime/get-world-lazy.d.ts.map +1 -0
- package/dist/runtime/get-world-lazy.js +46 -0
- package/dist/runtime/helpers.d.ts +327 -10
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +586 -40
- 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 +124 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1437 -0
- package/dist/runtime/quickjs-runtime.d.ts +228 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2372 -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 +2098 -0
- package/dist/runtime/replay-budget.d.ts +89 -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 +27 -4
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +452 -76
- 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 +8 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +62 -15
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +119 -13
- package/dist/runtime/start.d.ts +70 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +313 -60
- package/dist/runtime/step-executor.d.ts +177 -0
- package/dist/runtime/step-executor.d.ts.map +1 -0
- package/dist/runtime/step-executor.js +946 -0
- package/dist/runtime/step-latency.d.ts +197 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +207 -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 +69 -0
- package/dist/runtime/suspension-handler.d.ts +109 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +486 -140
- 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 +84 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +105 -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 +20 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +32 -0
- package/dist/runtime/world-init.d.ts +50 -0
- package/dist/runtime/world-init.d.ts.map +1 -0
- package/dist/runtime/world-init.js +50 -0
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +101 -26
- package/dist/runtime.d.ts +17 -12
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3135 -328
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- 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 +17 -0
- package/dist/serialization/client.d.ts.map +1 -0
- package/dist/serialization/client.js +48 -0
- 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 +14 -0
- package/dist/serialization/codec-devalue.d.ts.map +1 -0
- package/dist/serialization/codec-devalue.js +105 -0
- package/dist/serialization/codec.d.ts +125 -0
- package/dist/serialization/codec.d.ts.map +1 -0
- package/dist/serialization/codec.js +17 -0
- package/dist/serialization/compression.d.ts +104 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +260 -0
- package/dist/serialization/encryption.d.ts +134 -0
- package/dist/serialization/encryption.d.ts.map +1 -0
- package/dist/serialization/encryption.js +186 -0
- package/dist/serialization/errors.d.ts +34 -0
- package/dist/serialization/errors.d.ts.map +1 -0
- package/dist/serialization/errors.js +59 -0
- package/dist/serialization/format.d.ts +60 -0
- package/dist/serialization/format.d.ts.map +1 -0
- package/dist/serialization/format.js +97 -0
- package/dist/serialization/hardened.d.ts +155 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +523 -0
- package/dist/serialization/index.d.ts +20 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +22 -0
- 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 +11 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -0
- package/dist/serialization/reducers/class.js +73 -0
- 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 +579 -0
- package/dist/serialization/reducers/common.d.ts +16 -0
- package/dist/serialization/reducers/common.d.ts.map +1 -0
- package/dist/serialization/reducers/common.js +478 -0
- 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 +35 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function.js +104 -0
- package/dist/serialization/step.d.ts +17 -0
- package/dist/serialization/step.d.ts.map +1 -0
- package/dist/serialization/step.js +48 -0
- package/dist/serialization/types.d.ts +273 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +35 -0
- 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 +71 -0
- package/dist/serialization/workflow.d.ts +29 -0
- package/dist/serialization/workflow.d.ts.map +1 -0
- package/dist/serialization/workflow.js +54 -0
- package/dist/serialization-format.d.ts +60 -4
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +276 -56
- package/dist/serialization.d.ts +374 -221
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +2300 -783
- 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/sleep.d.ts.map +1 -1
- package/dist/sleep.js +3 -2
- package/dist/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +148 -10
- package/dist/step/context-storage.d.ts +61 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/get-closure-vars.d.ts.map +1 -1
- package/dist/step/get-closure-vars.js +3 -2
- package/dist/step/get-step-metadata.d.ts.map +1 -1
- package/dist/step/get-step-metadata.js +3 -2
- package/dist/step/get-workflow-metadata.d.ts.map +1 -1
- package/dist/step/get-workflow-metadata.js +3 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +71 -7
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +225 -29
- package/dist/symbols.d.ts +54 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +55 -1
- package/dist/telemetry/semantic-conventions.d.ts +265 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +190 -1
- package/dist/telemetry.d.ts +73 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +153 -16
- 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 +16 -6
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +25 -16
- 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 +85 -14
- package/dist/vm/script-cache.d.ts +28 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +140 -0
- package/dist/workflow/abort-controller.d.ts +65 -0
- package/dist/workflow/abort-controller.d.ts.map +1 -0
- package/dist/workflow/abort-controller.js +312 -0
- 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 +48 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +25 -3
- package/dist/workflow/define-hook.d.ts +1 -1
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +8 -4
- package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
- package/dist/workflow/get-workflow-metadata.js +14 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +302 -36
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +5 -3
- 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 +57 -8
- package/dist/workflow/world-init-stub.d.ts +15 -0
- package/dist/workflow/world-init-stub.d.ts.map +1 -0
- package/dist/workflow/world-init-stub.js +15 -0
- package/dist/workflow.d.ts +79 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +831 -553
- package/docs/api-reference/create-hook.mdx +79 -0
- package/docs/api-reference/create-webhook.mdx +1 -0
- package/docs/api-reference/define-hook.mdx +26 -24
- package/docs/api-reference/fatal-error.mdx +29 -7
- package/docs/api-reference/fetch.mdx +8 -4
- package/docs/api-reference/index.mdx +3 -0
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +1 -1
- package/docs/foundations/cancellation.mdx +459 -0
- package/docs/foundations/errors-and-retries.mdx +7 -3
- package/docs/foundations/hooks.mdx +29 -0
- package/docs/foundations/idempotency.mdx +243 -11
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +3 -1
- package/docs/foundations/serialization.mdx +77 -41
- package/docs/foundations/starting-workflows.mdx +79 -2
- package/docs/foundations/streaming.mdx +14 -23
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/how-it-works/cancellation.mdx +287 -0
- package/docs/how-it-works/code-transform.mdx +21 -17
- package/docs/how-it-works/encryption.mdx +5 -5
- package/docs/how-it-works/event-sourcing.mdx +17 -9
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/meta.json +2 -1
- package/package.json +31 -13
- 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 -678
|
@@ -5,8 +5,22 @@
|
|
|
5
5
|
* dispatch, and shared types/classes used by all environments (runtime, web
|
|
6
6
|
* o11y, CLI o11y). It has NO Node.js dependencies.
|
|
7
7
|
*/
|
|
8
|
+
import { getEventDataRefFields } from '@workflow/world';
|
|
8
9
|
import { parse, unflatten } from 'devalue';
|
|
9
10
|
// ---------------------------------------------------------------------------
|
|
11
|
+
// Key material (browser-safe re-exports)
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
/**
|
|
14
|
+
* Re-exported from the envelope layer so browser consumers (web dashboard,
|
|
15
|
+
* web-shared) can resolve key material without importing
|
|
16
|
+
* `@workflow/core/serialization`, whose module graph reaches Node built-ins
|
|
17
|
+
* (`node:util`, `node:async_hooks`) and cannot be bundled for the browser.
|
|
18
|
+
*
|
|
19
|
+
* Everything below is Web Crypto only: `serialization/encryption.ts`,
|
|
20
|
+
* `encryption.ts` and `sealed-box.ts` are all free of Node dependencies.
|
|
21
|
+
*/
|
|
22
|
+
export { decrypt as decryptEnvelope, deriveRunPayloadKeys, encrypt as encryptEnvelope, isRunPayloadKeys, isSealTarget, runPayloadKeys, sealTo, } from './serialization/encryption.js';
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
10
24
|
// Format prefix constants and encoding/decoding
|
|
11
25
|
// ---------------------------------------------------------------------------
|
|
12
26
|
export const SerializationFormat = {
|
|
@@ -14,6 +28,21 @@ export const SerializationFormat = {
|
|
|
14
28
|
DEVALUE_V1: 'devl',
|
|
15
29
|
/** Encrypted payload (inner payload has its own format prefix after decryption) */
|
|
16
30
|
ENCRYPTED: 'encr',
|
|
31
|
+
/**
|
|
32
|
+
* Sealed payload — asymmetrically encrypted to a run's X25519 public key
|
|
33
|
+
* (inner payload has its own format prefix after opening).
|
|
34
|
+
*
|
|
35
|
+
* Written by cross-run writers that hold only the recipient run's public
|
|
36
|
+
* key. Opening it requires the run's private scalar rather than the
|
|
37
|
+
* symmetric per-run key, so o11y display treats it as ciphertext via
|
|
38
|
+
* {@link isEncryptedData} but {@link hydrateDataWithKey} does not attempt
|
|
39
|
+
* an AES-GCM decrypt on it.
|
|
40
|
+
*/
|
|
41
|
+
SEALED: 'encp',
|
|
42
|
+
/** Gzip-compressed payload (inner payload has its own format prefix after decompression) */
|
|
43
|
+
GZIP: 'gzip',
|
|
44
|
+
/** Zstandard-compressed payload (inner payload has its own format prefix after decompression) */
|
|
45
|
+
ZSTD: 'zstd',
|
|
17
46
|
};
|
|
18
47
|
/** Length of the format prefix in bytes */
|
|
19
48
|
const FORMAT_PREFIX_LENGTH = 4;
|
|
@@ -100,7 +129,15 @@ export function isExpiredStub(data) {
|
|
|
100
129
|
return false;
|
|
101
130
|
}
|
|
102
131
|
/**
|
|
103
|
-
* Check if a binary value
|
|
132
|
+
* Check if a binary value is ciphertext — either a symmetrically encrypted
|
|
133
|
+
* payload ('encr') or a sealed cross-run payload ('encp').
|
|
134
|
+
*
|
|
135
|
+
* This is the predicate display layers want: both schemes are opaque bytes
|
|
136
|
+
* that must not be fed to the devalue parser, and both render as the same
|
|
137
|
+
* "Encrypted" affordance in the CLI and web UI. Use {@link isSealedData} when
|
|
138
|
+
* the *scheme* matters — notably when choosing a decryption path, since a
|
|
139
|
+
* sealed payload needs the run's private scalar rather than its symmetric key.
|
|
140
|
+
*
|
|
104
141
|
* Browser-safe — does not depend on the full serialization module.
|
|
105
142
|
*/
|
|
106
143
|
export function isEncryptedData(data) {
|
|
@@ -108,7 +145,120 @@ export function isEncryptedData(data) {
|
|
|
108
145
|
return false;
|
|
109
146
|
}
|
|
110
147
|
const prefix = formatDecoder.decode(data.subarray(0, FORMAT_PREFIX_LENGTH));
|
|
111
|
-
return prefix === SerializationFormat.ENCRYPTED
|
|
148
|
+
return (prefix === SerializationFormat.ENCRYPTED ||
|
|
149
|
+
prefix === SerializationFormat.SEALED);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check if a binary value has the 'encp' format prefix, indicating a sealed
|
|
153
|
+
* (asymmetrically encrypted) cross-run payload.
|
|
154
|
+
*
|
|
155
|
+
* Browser-safe — does not depend on the full serialization module.
|
|
156
|
+
*/
|
|
157
|
+
export function isSealedData(data) {
|
|
158
|
+
if (!(data instanceof Uint8Array) || data.length < FORMAT_PREFIX_LENGTH) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
const prefix = formatDecoder.decode(data.subarray(0, FORMAT_PREFIX_LENGTH));
|
|
162
|
+
return prefix === SerializationFormat.SEALED;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Check if a binary value has a compression format prefix ('gzip' or 'zstd').
|
|
166
|
+
* Browser-safe — does not depend on the full serialization module.
|
|
167
|
+
*/
|
|
168
|
+
export function isCompressedData(data) {
|
|
169
|
+
if (!(data instanceof Uint8Array) || data.length < FORMAT_PREFIX_LENGTH) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
const prefix = formatDecoder.decode(data.subarray(0, FORMAT_PREFIX_LENGTH));
|
|
173
|
+
return (prefix === SerializationFormat.GZIP || prefix === SerializationFormat.ZSTD);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Resolve `node:zlib` via `process.getBuiltinModule` — no static Node
|
|
177
|
+
* dependency, invisible to browser bundlers. Returns undefined off Node.
|
|
178
|
+
*/
|
|
179
|
+
function getNodeZlib() {
|
|
180
|
+
try {
|
|
181
|
+
return globalThis.process?.getBuiltinModule?.('node:zlib');
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Synchronously decompress a `gzip`/`zstd` payload when running on Node.js.
|
|
189
|
+
*
|
|
190
|
+
* Returns `undefined` when sync decompression isn't available (e.g. in the
|
|
191
|
+
* browser, or zstd on Node < 22.15) — callers fall back to leaving the data
|
|
192
|
+
* un-hydrated (the async `hydrateDataWithKey` path handles decompression in
|
|
193
|
+
* browsers via `DecompressionStream` / a registered zstd decoder).
|
|
194
|
+
*/
|
|
195
|
+
function decompressSyncIfAvailable(format, payload) {
|
|
196
|
+
try {
|
|
197
|
+
const zlib = getNodeZlib();
|
|
198
|
+
if (format === SerializationFormat.GZIP && zlib?.gunzipSync) {
|
|
199
|
+
return new Uint8Array(zlib.gunzipSync(payload));
|
|
200
|
+
}
|
|
201
|
+
if (format === SerializationFormat.ZSTD && zlib?.zstdDecompressSync) {
|
|
202
|
+
return new Uint8Array(zlib.zstdDecompressSync(payload));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// Fall through — treat as unavailable
|
|
207
|
+
}
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Browser zstd decoder, registered by the o11y host (web-shared) since the
|
|
212
|
+
* Web `DecompressionStream` has no zstd support. Node decodes via `node:zlib`
|
|
213
|
+
* and never needs this. See `registerZstdDecoder`.
|
|
214
|
+
*/
|
|
215
|
+
let zstdBrowserDecoder;
|
|
216
|
+
/**
|
|
217
|
+
* Register a browser zstd decoder (e.g. a WASM-backed one). The web o11y UI
|
|
218
|
+
* calls this at init so `hydrateDataWithKey` can inflate zstd payloads after
|
|
219
|
+
* client-side decryption. Node readers use `node:zlib` and ignore this.
|
|
220
|
+
*/
|
|
221
|
+
export function registerZstdDecoder(decoder) {
|
|
222
|
+
zstdBrowserDecoder = decoder;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Asynchronously decompress a `gzip`/`zstd` payload.
|
|
226
|
+
* - gzip: web-standard `DecompressionStream` (Node 18+, browsers, edge).
|
|
227
|
+
* - zstd: `node:zlib` when on Node, else the registered browser decoder.
|
|
228
|
+
*/
|
|
229
|
+
async function decompressAsync(format, payload) {
|
|
230
|
+
if (format === SerializationFormat.ZSTD) {
|
|
231
|
+
const sync = decompressSyncIfAvailable(format, payload);
|
|
232
|
+
if (sync)
|
|
233
|
+
return sync;
|
|
234
|
+
if (zstdBrowserDecoder)
|
|
235
|
+
return zstdBrowserDecoder(payload);
|
|
236
|
+
throw new Error('zstd-compressed workflow data encountered but no zstd decoder is ' +
|
|
237
|
+
'available. Node.js 22.15+ decodes natively; in the browser register ' +
|
|
238
|
+
'one via registerZstdDecoder (the web o11y package does this).');
|
|
239
|
+
}
|
|
240
|
+
const transform = new DecompressionStream('gzip');
|
|
241
|
+
const writer = transform.writable.getWriter();
|
|
242
|
+
const writePromise = writer.write(payload).then(() => writer.close());
|
|
243
|
+
writePromise.catch(() => { });
|
|
244
|
+
const chunks = [];
|
|
245
|
+
let total = 0;
|
|
246
|
+
const reader = transform.readable.getReader();
|
|
247
|
+
for (;;) {
|
|
248
|
+
const { done, value } = await reader.read();
|
|
249
|
+
if (done)
|
|
250
|
+
break;
|
|
251
|
+
chunks.push(value);
|
|
252
|
+
total += value.length;
|
|
253
|
+
}
|
|
254
|
+
await writePromise;
|
|
255
|
+
const out = new Uint8Array(total);
|
|
256
|
+
let offset = 0;
|
|
257
|
+
for (const chunk of chunks) {
|
|
258
|
+
out.set(chunk, offset);
|
|
259
|
+
offset += chunk.length;
|
|
260
|
+
}
|
|
261
|
+
return out;
|
|
112
262
|
}
|
|
113
263
|
// ---------------------------------------------------------------------------
|
|
114
264
|
// Generic hydrate/dehydrate dispatch
|
|
@@ -141,6 +291,20 @@ export function hydrateData(value, revivers) {
|
|
|
141
291
|
const str = new TextDecoder().decode(payload);
|
|
142
292
|
return parse(str, revivers);
|
|
143
293
|
}
|
|
294
|
+
if (format === SerializationFormat.GZIP ||
|
|
295
|
+
format === SerializationFormat.ZSTD) {
|
|
296
|
+
// Compressed payload — decompress synchronously when running on
|
|
297
|
+
// Node.js (CLI, server o11y). In browsers there is no sync codec;
|
|
298
|
+
// pass the data through untouched (like encrypted data) so async
|
|
299
|
+
// consumers can route it through `hydrateDataWithKey`, which
|
|
300
|
+
// decompresses via DecompressionStream / a registered zstd decoder.
|
|
301
|
+
const inflated = decompressSyncIfAvailable(format, payload);
|
|
302
|
+
if (inflated === undefined) {
|
|
303
|
+
return value;
|
|
304
|
+
}
|
|
305
|
+
// The inflated bytes carry their own format prefix (e.g. 'devl')
|
|
306
|
+
return hydrateData(inflated, revivers);
|
|
307
|
+
}
|
|
144
308
|
throw new Error(`Unsupported serialization format: ${format}`);
|
|
145
309
|
}
|
|
146
310
|
if (Array.isArray(value)) {
|
|
@@ -156,21 +320,39 @@ export function hydrateData(value, revivers) {
|
|
|
156
320
|
* decryption. Used by o11y tooling (web UI, CLI) when the user requests
|
|
157
321
|
* decryption.
|
|
158
322
|
*
|
|
159
|
-
* @param value - The value to hydrate (may be encrypted)
|
|
323
|
+
* @param value - The value to hydrate (may be encrypted or sealed)
|
|
160
324
|
* @param revivers - Devalue revivers for deserialization
|
|
161
|
-
* @param key -
|
|
325
|
+
* @param key - The run's key material. Pass `RunPayloadKeys` (from
|
|
326
|
+
* `deriveRunPayloadKeys`) to open both symmetric (`encr`) and sealed
|
|
327
|
+
* (`encp`) payloads; a bare `CryptoKey` opens only the symmetric ones.
|
|
328
|
+
* Typed as a read capability so a write-only seal target — which could open
|
|
329
|
+
* neither scheme — is rejected at compile time rather than failing here.
|
|
162
330
|
*/
|
|
163
331
|
export async function hydrateDataWithKey(value, revivers, key) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
332
|
+
let data = value;
|
|
333
|
+
if (data instanceof Uint8Array && isEncryptedData(data) && key) {
|
|
334
|
+
// Envelope-aware decrypt: handles both `encr` (AES-GCM under the run's
|
|
335
|
+
// symmetric key) and `encp` (sealed to the run's X25519 public key by
|
|
336
|
+
// some other run), dispatching on the format prefix.
|
|
337
|
+
const { decrypt, isRunPayloadKeys } = await import('./serialization/encryption.js');
|
|
338
|
+
// Opening a sealed payload needs the run's private scalar. If the caller
|
|
339
|
+
// supplied only a symmetric key, leave the bytes as ciphertext so the UI
|
|
340
|
+
// keeps showing its "Encrypted" affordance, rather than surfacing a
|
|
341
|
+
// decryption error for something that was never openable with this key.
|
|
342
|
+
if (!isSealedData(data) || isRunPayloadKeys(key)) {
|
|
343
|
+
data = await decrypt(data, key);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
if (data instanceof Uint8Array && isCompressedData(data)) {
|
|
347
|
+
// Decompress: strip the codec prefix and inflate. gzip uses the
|
|
348
|
+
// web-standard DecompressionStream (works in browsers); zstd uses
|
|
349
|
+
// node:zlib on Node or the registered WASM decoder in the browser.
|
|
350
|
+
// The inflated bytes carry their own format prefix (e.g. 'devl').
|
|
351
|
+
const { format, payload } = decodeFormatPrefix(data);
|
|
352
|
+
data = await decompressAsync(format, payload);
|
|
353
|
+
}
|
|
354
|
+
// Delegate the (decrypted/decompressed) result to sync hydrateData
|
|
355
|
+
return hydrateData(data, revivers);
|
|
174
356
|
}
|
|
175
357
|
// ---------------------------------------------------------------------------
|
|
176
358
|
// Shared marker types for o11y display
|
|
@@ -308,6 +490,34 @@ export const observabilityRevivers = {
|
|
|
308
490
|
ReadableStream: streamToStreamRef,
|
|
309
491
|
WritableStream: streamToStreamRef,
|
|
310
492
|
TransformStream: streamToStreamRef,
|
|
493
|
+
AbortController: (value) => `<AbortController(aborted: ${value.aborted})>`,
|
|
494
|
+
AbortSignal: (value) => `<AbortSignal(aborted: ${value.aborted})>`,
|
|
495
|
+
// DOMException needs an explicit reviver: without one, devalue.parse
|
|
496
|
+
// throws on the `["DOMException", ...]` tag and `hydrateStepIO`'s
|
|
497
|
+
// try/catch leaves the raw flat-encoded string in the UI. AbortController
|
|
498
|
+
// synthesizes a DOMException as the default `signal.reason` when abort()
|
|
499
|
+
// is called with no arg — so any abort that round-trips through a step
|
|
500
|
+
// boundary surfaces here. Reconstruct as a real DOMException when the
|
|
501
|
+
// global is available (modern browsers + Node 18+), else fall back to
|
|
502
|
+
// an Error preserving name/message/stack/cause for display.
|
|
503
|
+
DOMException: (value) => {
|
|
504
|
+
const G = globalThis;
|
|
505
|
+
if (typeof G.DOMException === 'function') {
|
|
506
|
+
const e = new G.DOMException(value.message, value.name);
|
|
507
|
+
if (value.stack !== undefined)
|
|
508
|
+
e.stack = value.stack;
|
|
509
|
+
if ('cause' in value)
|
|
510
|
+
e.cause = value.cause;
|
|
511
|
+
return e;
|
|
512
|
+
}
|
|
513
|
+
const e = new Error(value.message);
|
|
514
|
+
e.name = value.name;
|
|
515
|
+
if (value.stack !== undefined)
|
|
516
|
+
e.stack = value.stack;
|
|
517
|
+
if ('cause' in value)
|
|
518
|
+
e.cause = value.cause;
|
|
519
|
+
return e;
|
|
520
|
+
},
|
|
311
521
|
StepFunction: serializedStepFunctionToString,
|
|
312
522
|
WorkflowFunction: (value) => `<workflow:${value.workflowId}>`,
|
|
313
523
|
Instance: serializedInstanceToRef,
|
|
@@ -322,6 +532,7 @@ export const observabilityRevivers = {
|
|
|
322
532
|
function hydrateStepIO(resource, revivers) {
|
|
323
533
|
let hydratedInput = resource.input;
|
|
324
534
|
let hydratedOutput = resource.output;
|
|
535
|
+
let hydratedError = resource.error;
|
|
325
536
|
if (resource.input != null) {
|
|
326
537
|
try {
|
|
327
538
|
hydratedInput = hydrateData(resource.input, revivers);
|
|
@@ -338,7 +549,23 @@ function hydrateStepIO(resource, revivers) {
|
|
|
338
549
|
// Leave un-hydrated
|
|
339
550
|
}
|
|
340
551
|
}
|
|
341
|
-
|
|
552
|
+
// The `error` field is `SerializedData` (Uint8Array) produced by
|
|
553
|
+
// `dehydrateStepError`. Hydrate it so observability tools (CLI, web UI)
|
|
554
|
+
// can read `step.error.message`, `step.error.stack`, etc.
|
|
555
|
+
if (resource.error != null) {
|
|
556
|
+
try {
|
|
557
|
+
hydratedError = hydrateData(resource.error, revivers);
|
|
558
|
+
}
|
|
559
|
+
catch {
|
|
560
|
+
// Leave un-hydrated
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
return {
|
|
564
|
+
...resource,
|
|
565
|
+
input: hydratedInput,
|
|
566
|
+
output: hydratedOutput,
|
|
567
|
+
error: hydratedError,
|
|
568
|
+
};
|
|
342
569
|
}
|
|
343
570
|
/**
|
|
344
571
|
* Hydrate the data fields of a workflow run resource.
|
|
@@ -346,6 +573,7 @@ function hydrateStepIO(resource, revivers) {
|
|
|
346
573
|
function hydrateWorkflowIO(resource, revivers) {
|
|
347
574
|
let hydratedInput = resource.input;
|
|
348
575
|
let hydratedOutput = resource.output;
|
|
576
|
+
let hydratedError = resource.error;
|
|
349
577
|
if (resource.input != null) {
|
|
350
578
|
try {
|
|
351
579
|
hydratedInput = hydrateData(resource.input, revivers);
|
|
@@ -362,7 +590,23 @@ function hydrateWorkflowIO(resource, revivers) {
|
|
|
362
590
|
// Leave un-hydrated
|
|
363
591
|
}
|
|
364
592
|
}
|
|
365
|
-
|
|
593
|
+
// The `error` field is `SerializedData` (Uint8Array) produced by
|
|
594
|
+
// `dehydrateRunError`. Hydrate it so observability tools (CLI, web UI)
|
|
595
|
+
// can read `run.error.message`, `run.error.stack`, etc.
|
|
596
|
+
if (resource.error != null) {
|
|
597
|
+
try {
|
|
598
|
+
hydratedError = hydrateData(resource.error, revivers);
|
|
599
|
+
}
|
|
600
|
+
catch {
|
|
601
|
+
// Leave un-hydrated
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
return {
|
|
605
|
+
...resource,
|
|
606
|
+
input: hydratedInput,
|
|
607
|
+
output: hydratedOutput,
|
|
608
|
+
error: hydratedError,
|
|
609
|
+
};
|
|
366
610
|
}
|
|
367
611
|
/**
|
|
368
612
|
* Hydrate the eventData fields of an event resource.
|
|
@@ -371,46 +615,11 @@ function hydrateEventData(resource, revivers) {
|
|
|
371
615
|
if (!resource.eventData)
|
|
372
616
|
return resource;
|
|
373
617
|
const eventData = { ...resource.eventData };
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
eventData.result = hydrateData(eventData.result, revivers);
|
|
378
|
-
}
|
|
379
|
-
catch {
|
|
380
|
-
// Leave un-hydrated
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
// step_created events have eventData.input (serialized step arguments)
|
|
384
|
-
if ('input' in eventData && eventData.input != null) {
|
|
385
|
-
try {
|
|
386
|
-
eventData.input = hydrateData(eventData.input, revivers);
|
|
387
|
-
}
|
|
388
|
-
catch {
|
|
389
|
-
// Leave un-hydrated
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
// run_completed events have eventData.output (serialized return value)
|
|
393
|
-
if ('output' in eventData && eventData.output != null) {
|
|
394
|
-
try {
|
|
395
|
-
eventData.output = hydrateData(eventData.output, revivers);
|
|
396
|
-
}
|
|
397
|
-
catch {
|
|
398
|
-
// Leave un-hydrated
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
// hook_created events may have serialized metadata
|
|
402
|
-
if ('metadata' in eventData && eventData.metadata != null) {
|
|
403
|
-
try {
|
|
404
|
-
eventData.metadata = hydrateData(eventData.metadata, revivers);
|
|
405
|
-
}
|
|
406
|
-
catch {
|
|
407
|
-
// Leave un-hydrated
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
// hook_received events have eventData.payload (serialized hook payload)
|
|
411
|
-
if ('payload' in eventData && eventData.payload != null) {
|
|
618
|
+
for (const field of getEventDataRefFields(resource.eventType ?? '')) {
|
|
619
|
+
if (eventData[field] == null)
|
|
620
|
+
continue;
|
|
412
621
|
try {
|
|
413
|
-
eventData
|
|
622
|
+
eventData[field] = hydrateData(eventData[field], revivers);
|
|
414
623
|
}
|
|
415
624
|
catch {
|
|
416
625
|
// Leave un-hydrated
|
|
@@ -479,16 +688,27 @@ export function hydrateResourceIO(resource, revivers) {
|
|
|
479
688
|
/** Extract all stream IDs from a value (recursively traverses objects/arrays) */
|
|
480
689
|
export function extractStreamIds(obj) {
|
|
481
690
|
const streamIds = [];
|
|
691
|
+
// The hydrated o11y data this walks comes from devalue, which supports
|
|
692
|
+
// circular and repeated references. Track visited containers so a cycle
|
|
693
|
+
// (e.g. a step result whose object refers back to itself) doesn't recurse
|
|
694
|
+
// forever and overflow the stack.
|
|
695
|
+
const seen = new WeakSet();
|
|
482
696
|
function traverse(value) {
|
|
483
697
|
if (isStreamId(value)) {
|
|
484
698
|
streamIds.push(value);
|
|
485
699
|
}
|
|
486
700
|
else if (Array.isArray(value)) {
|
|
701
|
+
if (seen.has(value))
|
|
702
|
+
return;
|
|
703
|
+
seen.add(value);
|
|
487
704
|
for (const item of value) {
|
|
488
705
|
traverse(item);
|
|
489
706
|
}
|
|
490
707
|
}
|
|
491
708
|
else if (value && typeof value === 'object') {
|
|
709
|
+
if (seen.has(value))
|
|
710
|
+
return;
|
|
711
|
+
seen.add(value);
|
|
492
712
|
for (const val of Object.values(value)) {
|
|
493
713
|
traverse(val);
|
|
494
714
|
}
|
|
@@ -503,4 +723,4 @@ export function truncateId(id, maxLength = 12) {
|
|
|
503
723
|
return id;
|
|
504
724
|
return `${id.slice(0, maxLength)}...`;
|
|
505
725
|
}
|
|
506
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2VyaWFsaXphdGlvbi1mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFM0MsOEVBQThFO0FBQzlFLGdEQUFnRDtBQUNoRCw4RUFBOEU7QUFFOUUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsMkRBQTJEO0lBQzNELFVBQVUsRUFBRSxNQUFNO0lBQ2xCLG1GQUFtRjtJQUNuRixTQUFTLEVBQUUsTUFBTTtDQUNULENBQUM7QUFLWCwyQ0FBMkM7QUFDM0MsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBRXhDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxNQUErQixFQUMvQixPQUE2QjtJQUU3QixJQUFJLENBQUMsQ0FBQyxPQUFPLFlBQVksVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUNiLHFDQUFxQyxvQkFBb0IsMkJBQTJCLE1BQU0sTUFBTSxXQUFXLENBQUMsTUFBTSxTQUFTLENBQzVILENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sQ0FB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QUMsRUFBRSxDQUFDO1lBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBZSxDQUFDLENBQUM7UUFDbEMsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUsVUFBVSxDQUFDLEVBQVUsRUFBRSxTQUFTLEdBQUcsRUFBRTtJQUNuRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLElBQUksU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3RDLE9BQU8sR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBzZXJpYWxpemF0aW9uIGZvcm1hdCB1dGlsaXRpZXMuXG4gKlxuICogVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGZvcm1hdCBwcmVmaXggaGFuZGxpbmcsIGdlbmVyaWMgaHlkcmF0ZS9kZWh5ZHJhdGVcbiAqIGRpc3BhdGNoLCBhbmQgc2hhcmVkIHR5cGVzL2NsYXNzZXMgdXNlZCBieSBhbGwgZW52aXJvbm1lbnRzIChydW50aW1lLCB3ZWJcbiAqIG8xMXksIENMSSBvMTF5KS4gSXQgaGFzIE5PIE5vZGUuanMgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IHBhcnNlLCB1bmZsYXR0ZW4gfSBmcm9tICdkZXZhbHVlJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGb3JtYXQgcHJlZml4IGNvbnN0YW50cyBhbmQgZW5jb2RpbmcvZGVjb2Rpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgU2VyaWFsaXphdGlvbkZvcm1hdCA9IHtcbiAgLyoqIGRldmFsdWUgc3RyaW5naWZ5L3BhcnNlIHdpdGggVGV4dEVuY29kZXIvVGV4dERlY29kZXIgKi9cbiAgREVWQUxVRV9WMTogJ2RldmwnLFxuICAvKiogRW5jcnlwdGVkIHBheWxvYWQgKGlubmVyIHBheWxvYWQgaGFzIGl0cyBvd24gZm9ybWF0IHByZWZpeCBhZnRlciBkZWNyeXB0aW9uKSAqL1xuICBFTkNSWVBURUQ6ICdlbmNyJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlID1cbiAgKHR5cGVvZiBTZXJpYWxpemF0aW9uRm9ybWF0KVtrZXlvZiB0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdF07XG5cbi8qKiBMZW5ndGggb2YgdGhlIGZvcm1hdCBwcmVmaXggaW4gYnl0ZXMgKi9cbmNvbnN0IEZPUk1BVF9QUkVGSVhfTEVOR1RIID0gNDtcblxuY29uc3QgZm9ybWF0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuY29uc3QgZm9ybWF0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKipcbiAqIEVuY29kZSBhIHBheWxvYWQgd2l0aCBhIGZvcm1hdCBwcmVmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlLFxuICBwYXlsb2FkOiBVaW50OEFycmF5IHwgdW5rbm93blxuKTogVWludDhBcnJheSB8IHVua25vd24ge1xuICBpZiAoIShwYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeEJ5dGVzID0gZm9ybWF0RW5jb2Rlci5lbmNvZGUoZm9ybWF0KTtcbiAgaWYgKHByZWZpeEJ5dGVzLmxlbmd0aCAhPT0gRk9STUFUX1BSRUZJWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRm9ybWF0IGlkZW50aWZpZXIgbXVzdCBiZSBleGFjdGx5ICR7Rk9STUFUX1BSRUZJWF9MRU5HVEh9IEFTQ0lJIGNoYXJhY3RlcnMsIGdvdCBcIiR7Zm9ybWF0fVwiICgke3ByZWZpeEJ5dGVzLmxlbmd0aH0gYnl0ZXMpYFxuICAgICk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShGT1JNQVRfUFJFRklYX0xFTkdUSCArIHBheWxvYWQubGVuZ3RoKTtcbiAgcmVzdWx0LnNldChwcmVmaXhCeXRlcywgMCk7XG4gIHJlc3VsdC5zZXQocGF5bG9hZCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlY29kZSBhIGZvcm1hdC1wcmVmaXhlZCBwYXlsb2FkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRm9ybWF0UHJlZml4KGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duKToge1xuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlO1xuICBwYXlsb2FkOiBVaW50OEFycmF5O1xufSB7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWQ6IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShkYXRhKSksXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmxlbmd0aCA8IEZPUk1BVF9QUkVGSVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZm9ybWF0IHByZWZpeDogZXhwZWN0ZWQgYXQgbGVhc3QgJHtGT1JNQVRfUFJFRklYX0xFTkdUSH0gYnl0ZXMsIGdvdCAke2RhdGEubGVuZ3RofWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcHJlZml4Qnl0ZXMgPSBkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKTtcbiAgY29uc3QgZm9ybWF0ID0gZm9ybWF0RGVjb2Rlci5kZWNvZGUocHJlZml4Qnl0ZXMpO1xuXG4gIGNvbnN0IGtub3duRm9ybWF0cyA9IE9iamVjdC52YWx1ZXMoU2VyaWFsaXphdGlvbkZvcm1hdCkgYXMgc3RyaW5nW107XG4gIGlmICgha25vd25Gb3JtYXRzLmluY2x1ZGVzKGZvcm1hdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5rbm93biBzZXJpYWxpemF0aW9uIGZvcm1hdDogXCIke2Zvcm1hdH1cIi4gS25vd24gZm9ybWF0czogJHtrbm93bkZvcm1hdHMuam9pbignLCAnKX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQgPSBkYXRhLnN1YmFycmF5KEZPUk1BVF9QUkVGSVhfTEVOR1RIKTtcbiAgcmV0dXJuIHsgZm9ybWF0OiBmb3JtYXQgYXMgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUsIHBheWxvYWQgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNyeXB0ZWQgZGF0YSBkZXRlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFBsYWNlaG9sZGVyIHN0cmluZyBkaXNwbGF5ZWQgd2hlbiBkYXRhIGlzIGVuY3J5cHRlZCBhbmQgZGVjcnlwdGlvblxuICogaGFzIG5vdCBiZWVuIHJlcXVlc3RlZC4gVXNlZCBieSBib3RoIENMSSBhbmQgd2ViIG8xMXkuXG4gKi9cbmV4cG9ydCBjb25zdCBFTkNSWVBURURfUExBQ0VIT0xERVIgPSAnXFx1ezFGNTEyfSBFbmNyeXB0ZWQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cGlyZWQgZGF0YSBkZXRlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGxhaW4gb2JqZWN0IGlzIGB7IGV4cGlyZWRBdDogXCI8SVNPIGRhdGU+XCIgfWAg4oCUIGEgc2luZ2xlLWtleVxuICogb2JqZWN0IHdpdGggYSBzdHJpbmcgYGV4cGlyZWRBdGAgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGlzRXhwaXJlZE9iamVjdChkYXRhOiB1bmtub3duKTogZGF0YSBpcyB7IGV4cGlyZWRBdDogc3RyaW5nIH0ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gIHJldHVybiAoXG4gICAga2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICBrZXlzWzBdID09PSAnZXhwaXJlZEF0JyAmJlxuICAgIHR5cGVvZiAoZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZXhwaXJlZEF0ID09PSAnc3RyaW5nJ1xuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgaHlkcmF0ZWQgdmFsdWUgaXMgYW4gZXhwaXJlZCBkYXRhIHN0dWIgZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIFRoZSBzZXJ2ZXIgcmVwbGFjZXMgZXhwaXJlZCByZWYgZmllbGRzIHdpdGggYSBkZXZhbHVlLWVuY29kZWQgc3R1YlxuICogKGBtYWtlRXhwaXJlZFN0dWJgKSB0aGF0IGRlc2VyaWFsaXplcyB0byBgW3sgZXhwaXJlZEF0OiBcIjxJU08gZGF0ZT5cIiB9XWBcbiAqIGFmdGVyIGB1bmZsYXR0ZW5gIChhcnJheS13cmFwcGVkIGR1ZSB0byBiYWNrd2FyZHMtY29tcGF0aWJsZSBlbmNvZGluZykuXG4gKiBBbHNvIG1hdGNoZXMgdGhlIHVud3JhcHBlZCBgeyBleHBpcmVkQXQ6IFwiLi4uXCIgfWAgZm9ybSBmb3Igcm9idXN0bmVzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwaXJlZFN0dWIoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBEaXJlY3Qgb2JqZWN0IGZvcm06IHsgZXhwaXJlZEF0OiBcIi4uLlwiIH1cbiAgaWYgKGlzRXhwaXJlZE9iamVjdChkYXRhKSkgcmV0dXJuIHRydWU7XG4gIC8vIEFycmF5LXdyYXBwZWQgZm9ybSBmcm9tIGRldmFsdWUgdW5mbGF0dGVuOiBbeyBleHBpcmVkQXQ6IFwiLi4uXCIgfV1cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YS5sZW5ndGggPT09IDEgJiYgaXNFeHBpcmVkT2JqZWN0KGRhdGFbMF0pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgYmluYXJ5IHZhbHVlIGhhcyB0aGUgJ2VuY3InIGZvcm1hdCBwcmVmaXggaW5kaWNhdGluZyBlbmNyeXB0aW9uLlxuICogQnJvd3Nlci1zYWZlIOKAlCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGZ1bGwgc2VyaWFsaXphdGlvbiBtb2R1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VuY3J5cHRlZERhdGEoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgfHwgZGF0YS5sZW5ndGggPCBGT1JNQVRfUFJFRklYX0xFTkdUSCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBmb3JtYXREZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKSk7XG4gIHJldHVybiBwcmVmaXggPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJldml2ZXJzIHR5cGUgKHNoYXJlZCBhY3Jvc3MgYWxsIGVudmlyb25tZW50cylcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEEgbWFwIG9mIHR5cGUgbmFtZSDihpIgcmV2aXZlciBmdW5jdGlvbiwgdXNlZCBieSBkZXZhbHVlJ3MgYHBhcnNlYC9gdW5mbGF0dGVuYC5cbiAqIEVhY2ggZW52aXJvbm1lbnQgKHJ1bnRpbWUsIHdlYiwgQ0xJKSBwcm92aWRlcyBpdHMgb3duIHNldC5cbiAqL1xuZXhwb3J0IHR5cGUgUmV2aXZlcnMgPSBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PjtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBHZW5lcmljIGh5ZHJhdGUvZGVoeWRyYXRlIGRpc3BhdGNoXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIChkZXNlcmlhbGl6ZSkgYSB2YWx1ZSB0aGF0IHdhcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEhhbmRsZXMgZm91ciBkYXRhIHNoYXBlczpcbiAqIDEuIGBVaW50OEFycmF5YCB3aXRoICdlbmNyJyBwcmVmaXgg4oaSIHJldHVybmVkIGFzLWlzIChlbmNyeXB0ZWQsIG5vdCB5ZXQgZGVjcnlwdGVkKVxuICogMi4gYFVpbnQ4QXJyYXlgIHdpdGggYSBmb3JtYXQgcHJlZml4IChzcGVjVmVyc2lvbiAyKykg4oaSIGRlY29kZSBwcmVmaXgsIHBhcnNlXG4gKiAzLiBgQXJyYXlgIChsZWdhY3kgc3BlY1ZlcnNpb24gMSwgXCJyZXZpdmVkIGRldmFsdWVcIikg4oaSIHVuZmxhdHRlblxuICogNC4gT3RoZXIgKGFscmVhZHkgYSBwbGFpbiBKUyB2YWx1ZSkg4oaSIHJldHVybiBhcy1pc1xuICpcbiAqIEVuY3J5cHRlZCBkYXRhIGlzIGludGVudGlvbmFsbHkgbGVmdCBhcyBhIGBVaW50OEFycmF5YCBzbyB0aGF0IGNvbnN1bWVyc1xuICogKENMSSwgd2ViIFVJKSBjYW4gZGV0ZWN0IGl0IHdpdGggYGlzRW5jcnlwdGVkRGF0YSgpYCBhbmQgZGVjaWRlIGhvdyB0b1xuICogaGFuZGxlIGl0IOKAlCB0aGUgQ0xJIHJlcGxhY2VzIGl0IHdpdGggYSBzdHlsZWQgcGxhY2Vob2xkZXIsIHRoZSB3ZWIgVUlcbiAqIHJlbmRlcnMgYW4gXCJFbmNyeXB0ZWRcIiBjYXJkIHdpdGggYSBEZWNyeXB0IGJ1dHRvbiB0aGF0IHRyaWdnZXJzXG4gKiBjbGllbnQtc2lkZSBkZWNyeXB0aW9uIG9uIGRlbWFuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVEYXRhKHZhbHVlOiB1bmtub3duLCByZXZpdmVyczogUmV2aXZlcnMpOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIC8vIEVuY3J5cHRlZCBkYXRhIHBhc3NlcyB0aHJvdWdoIHVudG91Y2hlZCDigJQgbzExeSBsYXllcnMgZGV0ZWN0IGl0IHdpdGhcbiAgICAvLyBpc0VuY3J5cHRlZERhdGEoKSBhbmQgaGFuZGxlIGRpc3BsYXkgKHdlYjogbmFtZWQgY29uc3RydWN0b3Igb2JqZWN0LFxuICAgIC8vIENMSTogRW5jcnlwdGVkRGF0YVJlZiB3aXRoIHV0aWwuaW5zcGVjdC5jdXN0b20pLlxuICAgIGlmIChpc0VuY3J5cHRlZERhdGEodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeCh2YWx1ZSk7XG4gICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgICBjb25zdCBzdHIgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZCk7XG4gICAgICByZXR1cm4gcGFyc2Uoc3RyLCByZXZpdmVycyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2VyaWFsaXphdGlvbiBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHVuZmxhdHRlbih2YWx1ZSwgcmV2aXZlcnMpO1xuICB9XG5cbiAgLy8gQWxyZWFkeSBhIHBsYWluIEpTIHZhbHVlIChlLmcuLCBudW1iZXIsIHN0cmluZywgbnVsbClcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgYSB2YWx1ZSwgZGVjcnlwdGluZyBpdCBmaXJzdCBpZiBhbiBlbmNyeXB0aW9uIGtleSBpcyBwcm92aWRlZC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBhc3luYyB2ZXJzaW9uIG9mIGBoeWRyYXRlRGF0YWAgdGhhdCBzdXBwb3J0cyB0cmFuc3BhcmVudFxuICogZGVjcnlwdGlvbi4gVXNlZCBieSBvMTF5IHRvb2xpbmcgKHdlYiBVSSwgQ0xJKSB3aGVuIHRoZSB1c2VyIHJlcXVlc3RzXG4gKiBkZWNyeXB0aW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBoeWRyYXRlIChtYXkgYmUgZW5jcnlwdGVkKVxuICogQHBhcmFtIHJldml2ZXJzIC0gRGV2YWx1ZSByZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uXG4gKiBAcGFyYW0ga2V5IC0gQUVTLTI1NiBlbmNyeXB0aW9uIGtleSAoaWYgcHJvdmlkZWQsIGVuY3J5cHRlZCBkYXRhIHdpbGwgYmUgZGVjcnlwdGVkKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZURhdGFXaXRoS2V5KFxuICB2YWx1ZTogdW5rbm93bixcbiAgcmV2aXZlcnM6IFJldml2ZXJzLFxuICBrZXk6IGltcG9ydCgnLi9lbmNyeXB0aW9uLmpzJykuQ3J5cHRvS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBpc0VuY3J5cHRlZERhdGEodmFsdWUpICYmIGtleSkge1xuICAgIC8vIERlY3J5cHQ6IHN0cmlwICdlbmNyJyBwcmVmaXgsIEFFUy1HQ00gZGVjcnlwdCwgdGhlbiBoeWRyYXRlIHRoZSByZXN1bHRcbiAgICBjb25zdCB7IGRlY3J5cHQgfSA9IGF3YWl0IGltcG9ydCgnLi9lbmNyeXB0aW9uLmpzJyk7XG4gICAgY29uc3QgeyBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgodmFsdWUpO1xuICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY3J5cHQoa2V5LCBwYXlsb2FkKTtcbiAgICAvLyBUaGUgZGVjcnlwdGVkIGJ5dGVzIGhhdmUgdGhlaXIgb3duIGZvcm1hdCBwcmVmaXggKGUuZy4sICdkZXZsJylcbiAgICByZXR1cm4gaHlkcmF0ZURhdGEoZGVjcnlwdGVkLCByZXZpdmVycyk7XG4gIH1cbiAgLy8gTm8ga2V5IG9yIG5vdCBlbmNyeXB0ZWQg4oCUIGRlbGVnYXRlIHRvIHN5bmMgaHlkcmF0ZURhdGFcbiAgcmV0dXJuIGh5ZHJhdGVEYXRhKHZhbHVlLCByZXZpdmVycyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2hhcmVkIG1hcmtlciB0eXBlcyBmb3IgbzExeSBkaXNwbGF5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgU1RSRUFNX0lEX1BSRUZJWCA9ICdzdHJtXyc7XG5cbi8qKiBNYXJrZXIgZm9yIHN0cmVhbSByZWZlcmVuY2Ugb2JqZWN0cyByZW5kZXJlZCBhcyBsaW5rcyBpbiB0aGUgVUkgKi9cbmV4cG9ydCBjb25zdCBTVFJFQU1fUkVGX1RZUEUgPSAnX193b3JrZmxvd19zdHJlYW1fcmVmX18nO1xuXG4vKiogQSBzdHJlYW0gcmVmZXJlbmNlIGZvciBVSSBkaXNwbGF5ICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbVJlZiB7XG4gIF9fdHlwZTogdHlwZW9mIFNUUkVBTV9SRUZfVFlQRTtcbiAgc3RyZWFtSWQ6IHN0cmluZztcbn1cblxuLyoqIE1hcmtlciBmb3IgUnVuIHJlZmVyZW5jZSBvYmplY3RzIHJlbmRlcmVkIGFzIGxpbmtzIGluIHRoZSBVSSAqL1xuZXhwb3J0IGNvbnN0IFJVTl9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3J1bl9yZWZfXyc7XG5cbi8qKiBBIFJ1biByZWZlcmVuY2UgZm9yIFVJIGRpc3BsYXkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgUlVOX1JFRl9UWVBFO1xuICBydW5JZDogc3RyaW5nO1xufVxuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIFJ1blJlZiBvYmplY3QgKi9cbmV4cG9ydCBjb25zdCBpc1J1blJlZiA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJ1blJlZiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ19fdHlwZScgaW4gdmFsdWUgJiZcbiAgICB2YWx1ZS5fX3R5cGUgPT09IFJVTl9SRUZfVFlQRSAmJlxuICAgICdydW5JZCcgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnXG4gICk7XG59O1xuXG4vKiogQ29udmVydCBhIHNlcmlhbGl6ZWQgUnVuIHZhbHVlIHRvIGEgUnVuUmVmIGZvciBkaXNwbGF5ICovXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplZFJ1blRvUnVuUmVmID0gKHZhbHVlOiB7IHJ1bklkOiBzdHJpbmcgfSk6IFJ1blJlZiA9PiB7XG4gIHJldHVybiB7IF9fdHlwZTogUlVOX1JFRl9UWVBFLCBydW5JZDogdmFsdWUucnVuSWQgfTtcbn07XG5cbi8qKiBNYXJrZXIgZm9yIGN1c3RvbSBjbGFzcyBpbnN0YW5jZSByZWZlcmVuY2VzICovXG5leHBvcnQgY29uc3QgQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEUgPSAnX193b3JrZmxvd19jbGFzc19pbnN0YW5jZV9yZWZfXyc7XG5cbi8qKlxuICogQSBjbGFzcyBpbnN0YW5jZSByZWZlcmVuY2UgZm9yIG8xMXkgZGlzcGxheS5cbiAqXG4gKiBCcm93c2VyLXNhZmUgYmFzZSBjbGFzcyDigJQgbm8gYHV0aWwuaW5zcGVjdC5jdXN0b21gLiBFbnZpcm9ubWVudC1zcGVjaWZpY1xuICogcmVuZGVyaW5nIChDTEkgaW5zcGVjdCwgd2ViIGNvbXBvbmVudCkgaXMgaGFuZGxlZCBieSBlYWNoIGNvbnN1bWVyLlxuICovXG5leHBvcnQgY2xhc3MgQ2xhc3NJbnN0YW5jZVJlZiB7XG4gIHJlYWRvbmx5IF9fdHlwZSA9IENMQVNTX0lOU1RBTkNFX1JFRl9UWVBFO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2xhc3NJZDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBkYXRhOiB1bmtub3duXG4gICkge31cblxuICB0b0pTT04oKToge1xuICAgIF9fdHlwZTogc3RyaW5nO1xuICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgIGNsYXNzSWQ6IHN0cmluZztcbiAgICBkYXRhOiB1bmtub3duO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiB0aGlzLl9fdHlwZSxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICBjbGFzc0lkOiB0aGlzLmNsYXNzSWQsXG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgfTtcbiAgfVxufVxuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIENsYXNzSW5zdGFuY2VSZWYgb2JqZWN0ICovXG5leHBvcnQgY29uc3QgaXNDbGFzc0luc3RhbmNlUmVmID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgQ2xhc3NJbnN0YW5jZVJlZiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgaW5zdGFuY2VvZiBDbGFzc0luc3RhbmNlUmVmIHx8XG4gICAgKHZhbHVlICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAnX190eXBlJyBpbiB2YWx1ZSAmJlxuICAgICAgdmFsdWUuX190eXBlID09PSBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSAmJlxuICAgICAgJ2NsYXNzTmFtZScgaW4gdmFsdWUgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZS5jbGFzc05hbWUgPT09ICdzdHJpbmcnKVxuICApO1xufTtcblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJlYW0gSUQgc3RyaW5nICovXG5leHBvcnQgY29uc3QgaXNTdHJlYW1JZCA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKFNUUkVBTV9JRF9QUkVGSVgpO1xufTtcblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1SZWYgb2JqZWN0ICovXG5leHBvcnQgY29uc3QgaXNTdHJlYW1SZWYgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTdHJlYW1SZWYgPT4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICdfX3R5cGUnIGluIHZhbHVlICYmXG4gICAgdmFsdWUuX190eXBlID09PSBTVFJFQU1fUkVGX1RZUEUgJiZcbiAgICAnc3RyZWFtSWQnIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnN0cmVhbUlkID09PSAnc3RyaW5nJ1xuICApO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgbzExeSByZXZpdmVyIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENvbnZlcnQgYSBzZXJpYWxpemVkIHN0cmVhbSB2YWx1ZSB0byBhIFN0cmVhbVJlZiBmb3IgZGlzcGxheS5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmVhbVRvU3RyZWFtUmVmID0gKHZhbHVlOiBhbnkpOiBTdHJlYW1SZWYgPT4ge1xuICBsZXQgc3RyZWFtSWQ6IHN0cmluZztcbiAgaWYgKCduYW1lJyBpbiB2YWx1ZSkge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcodmFsdWUubmFtZSk7XG4gICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoU1RSRUFNX0lEX1BSRUZJWCkpIHtcbiAgICAgIHN0cmVhbUlkID0gYCR7U1RSRUFNX0lEX1BSRUZJWH0ke25hbWV9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtSWQgPSBuYW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdHJlYW1JZCA9IGAke1NUUkVBTV9JRF9QUkVGSVh9bnVsbGA7XG4gIH1cbiAgcmV0dXJuIHsgX190eXBlOiBTVFJFQU1fUkVGX1RZUEUsIHN0cmVhbUlkIH07XG59O1xuXG4vKiogQ29udmVydCBhIHNlcmlhbGl6ZWQgc3RlcCBmdW5jdGlvbiB0byBhIGRpc3BsYXkgc3RyaW5nICovXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplZFN0ZXBGdW5jdGlvblRvU3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuICdudWxsJztcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiAnbnVsbCc7XG4gIGlmICgnc3RlcElkJyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiBgPHN0ZXA6JHsodmFsdWUgYXMgeyBzdGVwSWQ6IHN0cmluZyB9KS5zdGVwSWR9PmA7XG4gIH1cbiAgcmV0dXJuICc8ZnVuY3Rpb24+Jztcbn07XG5cbi8qKiBFeHRyYWN0IHRoZSBjbGFzcyBuYW1lIGZyb20gYSBjbGFzc0lkICovXG5leHBvcnQgY29uc3QgZXh0cmFjdENsYXNzTmFtZSA9IChjbGFzc0lkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWNsYXNzSWQpIHJldHVybiAnVW5rbm93bic7XG4gIGNvbnN0IHBhcnRzID0gY2xhc3NJZC5zcGxpdCgnLycpO1xuICByZXR1cm4gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gfHwgY2xhc3NJZDtcbn07XG5cbi8qKiBDb252ZXJ0IGEgc2VyaWFsaXplZCBjbGFzcyBpbnN0YW5jZSB0byBhIENsYXNzSW5zdGFuY2VSZWYgZm9yIGRpc3BsYXkuXG4gKiAgUnVuIGluc3RhbmNlcyBhcmUgc3BlY2lhbC1jYXNlZCB0byBhIFJ1blJlZiBmb3IgY2xpY2thYmxlIHJlbmRlcmluZy4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZiA9ICh2YWx1ZToge1xuICBjbGFzc0lkOiBzdHJpbmc7XG4gIGRhdGE6IHVua25vd247XG59KTogQ2xhc3NJbnN0YW5jZVJlZiB8IFJ1blJlZiA9PiB7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IGV4dHJhY3RDbGFzc05hbWUodmFsdWUuY2xhc3NJZCk7XG4gIGlmIChcbiAgICBjbGFzc05hbWUgPT09ICdSdW4nICYmXG4gICAgdmFsdWUuZGF0YSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZS5kYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICdydW5JZCcgaW4gdmFsdWUuZGF0YSAmJlxuICAgIHR5cGVvZiAodmFsdWUuZGF0YSBhcyB7IHJ1bklkOiB1bmtub3duIH0pLnJ1bklkID09PSAnc3RyaW5nJ1xuICApIHtcbiAgICByZXR1cm4gc2VyaWFsaXplZFJ1blRvUnVuUmVmKHZhbHVlLmRhdGEgYXMgeyBydW5JZDogc3RyaW5nIH0pO1xuICB9XG4gIHJldHVybiBuZXcgQ2xhc3NJbnN0YW5jZVJlZihjbGFzc05hbWUsIHZhbHVlLmNsYXNzSWQsIHZhbHVlLmRhdGEpO1xufTtcblxuLyoqIENvbnZlcnQgYSBzZXJpYWxpemVkIGNsYXNzIHJlZmVyZW5jZSB0byBhIGRpc3BsYXkgc3RyaW5nICovXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplZENsYXNzVG9TdHJpbmcgPSAodmFsdWU6IHsgY2xhc3NJZDogc3RyaW5nIH0pOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYDxjbGFzczoke2V4dHJhY3RDbGFzc05hbWUodmFsdWUuY2xhc3NJZCl9PmA7XG59O1xuXG4vKipcbiAqIFN0YW5kYXJkIG8xMXkgcmV2aXZlcnMgdGhhdCBvdmVycmlkZSBydW50aW1lLXNwZWNpZmljIHR5cGVzIHdpdGhcbiAqIGRpc3BsYXktZnJpZW5kbHkgdmFsdWVzLiBVc2VkIGJ5IGJvdGggd2ViIGFuZCBDTEkgaHlkcmF0aW9uLlxuICovXG5leHBvcnQgY29uc3Qgb2JzZXJ2YWJpbGl0eVJldml2ZXJzOiBSZXZpdmVycyA9IHtcbiAgUmVhZGFibGVTdHJlYW06IHN0cmVhbVRvU3RyZWFtUmVmLFxuICBXcml0YWJsZVN0cmVhbTogc3RyZWFtVG9TdHJlYW1SZWYsXG4gIFRyYW5zZm9ybVN0cmVhbTogc3RyZWFtVG9TdHJlYW1SZWYsXG4gIFN0ZXBGdW5jdGlvbjogc2VyaWFsaXplZFN0ZXBGdW5jdGlvblRvU3RyaW5nLFxuICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWU6IHsgd29ya2Zsb3dJZDogc3RyaW5nIH0pID0+XG4gICAgYDx3b3JrZmxvdzoke3ZhbHVlLndvcmtmbG93SWR9PmAsXG4gIEluc3RhbmNlOiBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZixcbiAgQ2xhc3M6IHNlcmlhbGl6ZWRDbGFzc1RvU3RyaW5nLFxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXNvdXJjZS1sZXZlbCBoeWRyYXRpb24gZGlzcGF0Y2ggKGZvciBvMTF5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogSHlkcmF0ZSB0aGUgZGF0YSBmaWVsZHMgb2YgYSBzdGVwIHJlc291cmNlLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlU3RlcElPPFxuICBUIGV4dGVuZHMgeyBzdGVwSWQ/OiBzdHJpbmc7IGlucHV0PzogYW55OyBvdXRwdXQ/OiBhbnkgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBsZXQgaHlkcmF0ZWRJbnB1dCA9IHJlc291cmNlLmlucHV0O1xuICBsZXQgaHlkcmF0ZWRPdXRwdXQgPSByZXNvdXJjZS5vdXRwdXQ7XG5cbiAgaWYgKHJlc291cmNlLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRJbnB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvdXJjZS5vdXRwdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZE91dHB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLm91dHB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyAuLi5yZXNvdXJjZSwgaW5wdXQ6IGh5ZHJhdGVkSW5wdXQsIG91dHB1dDogaHlkcmF0ZWRPdXRwdXQgfTtcbn1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBkYXRhIGZpZWxkcyBvZiBhIHdvcmtmbG93IHJ1biByZXNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93SU88VCBleHRlbmRzIHsgaW5wdXQ/OiBhbnk7IG91dHB1dD86IGFueSB9PihcbiAgcmVzb3VyY2U6IFQsXG4gIHJldml2ZXJzOiBSZXZpdmVyc1xuKTogVCB7XG4gIGxldCBoeWRyYXRlZElucHV0ID0gcmVzb3VyY2UuaW5wdXQ7XG4gIGxldCBoeWRyYXRlZE91dHB1dCA9IHJlc291cmNlLm91dHB1dDtcblxuICBpZiAocmVzb3VyY2UuaW5wdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZElucHV0ID0gaHlkcmF0ZURhdGEocmVzb3VyY2UuaW5wdXQsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgaWYgKHJlc291cmNlLm91dHB1dCAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGh5ZHJhdGVkT3V0cHV0ID0gaHlkcmF0ZURhdGEocmVzb3VyY2Uub3V0cHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IC4uLnJlc291cmNlLCBpbnB1dDogaHlkcmF0ZWRJbnB1dCwgb3V0cHV0OiBoeWRyYXRlZE91dHB1dCB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIGV2ZW50RGF0YSBmaWVsZHMgb2YgYW4gZXZlbnQgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVFdmVudERhdGE8VCBleHRlbmRzIHsgZXZlbnRJZD86IHN0cmluZzsgZXZlbnREYXRhPzogYW55IH0+KFxuICByZXNvdXJjZTogVCxcbiAgcmV2aXZlcnM6IFJldml2ZXJzXG4pOiBUIHtcbiAgaWYgKCFyZXNvdXJjZS5ldmVudERhdGEpIHJldHVybiByZXNvdXJjZTtcblxuICBjb25zdCBldmVudERhdGEgPSB7IC4uLnJlc291cmNlLmV2ZW50RGF0YSB9O1xuXG4gIC8vIHN0ZXBfY29tcGxldGVkIGV2ZW50cyBoYXZlIGV2ZW50RGF0YS5yZXN1bHQgKHNlcmlhbGl6ZWQgcmV0dXJuIHZhbHVlKVxuICBpZiAoJ3Jlc3VsdCcgaW4gZXZlbnREYXRhICYmIGV2ZW50RGF0YS5yZXN1bHQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBldmVudERhdGEucmVzdWx0ID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLnJlc3VsdCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBzdGVwX2NyZWF0ZWQgZXZlbnRzIGhhdmUgZXZlbnREYXRhLmlucHV0IChzZXJpYWxpemVkIHN0ZXAgYXJndW1lbnRzKVxuICBpZiAoJ2lucHV0JyBpbiBldmVudERhdGEgJiYgZXZlbnREYXRhLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgZXZlbnREYXRhLmlucHV0ID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIC8vIHJ1bl9jb21wbGV0ZWQgZXZlbnRzIGhhdmUgZXZlbnREYXRhLm91dHB1dCAoc2VyaWFsaXplZCByZXR1cm4gdmFsdWUpXG4gIGlmICgnb3V0cHV0JyBpbiBldmVudERhdGEgJiYgZXZlbnREYXRhLm91dHB1dCAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV2ZW50RGF0YS5vdXRwdXQgPSBoeWRyYXRlRGF0YShldmVudERhdGEub3V0cHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIC8vIGhvb2tfY3JlYXRlZCBldmVudHMgbWF5IGhhdmUgc2VyaWFsaXplZCBtZXRhZGF0YVxuICBpZiAoJ21ldGFkYXRhJyBpbiBldmVudERhdGEgJiYgZXZlbnREYXRhLm1ldGFkYXRhICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgZXZlbnREYXRhLm1ldGFkYXRhID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLm1ldGFkYXRhLCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIC8vIGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGhhdmUgZXZlbnREYXRhLnBheWxvYWQgKHNlcmlhbGl6ZWQgaG9vayBwYXlsb2FkKVxuICBpZiAoJ3BheWxvYWQnIGluIGV2ZW50RGF0YSAmJiBldmVudERhdGEucGF5bG9hZCAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV2ZW50RGF0YS5wYXlsb2FkID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLnBheWxvYWQsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIGV2ZW50RGF0YSB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIG1ldGFkYXRhIGZpZWxkIG9mIGEgaG9vayByZXNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gaHlkcmF0ZUhvb2tNZXRhZGF0YTxUIGV4dGVuZHMgeyBob29rSWQ/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55IH0+KFxuICByZXNvdXJjZTogVCxcbiAgcmV2aXZlcnM6IFJldml2ZXJzXG4pOiBUIHtcbiAgaWYgKHJlc291cmNlLm1ldGFkYXRhID09IG51bGwpIHJldHVybiByZXNvdXJjZTtcblxuICBsZXQgaHlkcmF0ZWRNZXRhZGF0YSA9IHJlc291cmNlLm1ldGFkYXRhO1xuICB0cnkge1xuICAgIGh5ZHJhdGVkTWV0YWRhdGEgPSBoeWRyYXRlRGF0YShyZXNvdXJjZS5tZXRhZGF0YSwgcmV2aXZlcnMpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIG1ldGFkYXRhOiBoeWRyYXRlZE1ldGFkYXRhIH07XG59XG5cbi8qKlxuICogSHlkcmF0ZSB0aGUgc2VyaWFsaXplZCBkYXRhIGZpZWxkcyBvZiBhbnkgcmVzb3VyY2UgZm9yIG8xMXkgZGlzcGxheS5cbiAqXG4gKiBEaXNwYXRjaGVzIGJ5IHJlc291cmNlIHR5cGUgKHN0ZXAsIGhvb2ssIGV2ZW50LCB3b3JrZmxvdykgYW5kIGNhbGxzXG4gKiBgaHlkcmF0ZURhdGFgIHdpdGggdGhlIHByb3ZpZGVkIHJldml2ZXJzIGZvciBlYWNoIGRhdGEgZmllbGQuXG4gKlxuICogRWFjaCBlbnZpcm9ubWVudCAod2ViLCBDTEkpIHByb3ZpZGVzIGl0cyBvd24gcmV2aXZlcnMg4oCUIHRoaXMgZnVuY3Rpb25cbiAqIG9ubHkgaGFuZGxlcyB0aGUgZGlzcGF0Y2ggbG9naWMgYW5kIGZpZWxkIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJTzxcbiAgVCBleHRlbmRzIHtcbiAgICBzdGVwSWQ/OiBzdHJpbmc7XG4gICAgaG9va0lkPzogc3RyaW5nO1xuICAgIGV2ZW50SWQ/OiBzdHJpbmc7XG4gICAgaW5wdXQ/OiBhbnk7XG4gICAgb3V0cHV0PzogYW55O1xuICAgIG1ldGFkYXRhPzogYW55O1xuICAgIGV2ZW50RGF0YT86IGFueTtcbiAgICBleGVjdXRpb25Db250ZXh0PzogYW55O1xuICB9LFxuPihyZXNvdXJjZTogVCwgcmV2aXZlcnM6IFJldml2ZXJzKTogVCB7XG4gIGlmICghcmVzb3VyY2UpIHJldHVybiByZXNvdXJjZTtcblxuICBsZXQgaHlkcmF0ZWQ6IFQ7XG4gIGlmICgnc3RlcElkJyBpbiByZXNvdXJjZSkge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZVN0ZXBJTyhyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9IGVsc2UgaWYgKCdob29rSWQnIGluIHJlc291cmNlKSB7XG4gICAgaHlkcmF0ZWQgPSBoeWRyYXRlSG9va01ldGFkYXRhKHJlc291cmNlLCByZXZpdmVycyk7XG4gIH0gZWxzZSBpZiAoJ2V2ZW50SWQnIGluIHJlc291cmNlKSB7XG4gICAgaHlkcmF0ZWQgPSBoeWRyYXRlRXZlbnREYXRhKHJlc291cmNlLCByZXZpdmVycyk7XG4gIH0gZWxzZSB7XG4gICAgaHlkcmF0ZWQgPSBoeWRyYXRlV29ya2Zsb3dJTyhyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9XG5cbiAgLy8gU3RyaXAgZXhlY3V0aW9uQ29udGV4dCwgcHJlc2VydmluZyBvbmx5IHdvcmtmbG93Q29yZVZlcnNpb24gZm9yIGRpc3BsYXlcbiAgaWYgKCdleGVjdXRpb25Db250ZXh0JyBpbiBoeWRyYXRlZCkge1xuICAgIGNvbnN0IHsgZXhlY3V0aW9uQ29udGV4dCwgLi4ucmVzdCB9ID0gaHlkcmF0ZWQ7XG4gICAgY29uc3Qgd29ya2Zsb3dDb3JlVmVyc2lvbiA9XG4gICAgICBleGVjdXRpb25Db250ZXh0ICYmXG4gICAgICB0eXBlb2YgZXhlY3V0aW9uQ29udGV4dCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICd3b3JrZmxvd0NvcmVWZXJzaW9uJyBpbiBleGVjdXRpb25Db250ZXh0XG4gICAgICAgID8gZXhlY3V0aW9uQ29udGV4dC53b3JrZmxvd0NvcmVWZXJzaW9uXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICh3b3JrZmxvd0NvcmVWZXJzaW9uKSB7XG4gICAgICByZXR1cm4geyAuLi5yZXN0LCB3b3JrZmxvd0NvcmVWZXJzaW9uIH0gYXMgdW5rbm93biBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdCBhcyBUO1xuICB9XG5cbiAgcmV0dXJuIGh5ZHJhdGVkO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFV0aWxpdHkgZnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEV4dHJhY3QgYWxsIHN0cmVhbSBJRHMgZnJvbSBhIHZhbHVlIChyZWN1cnNpdmVseSB0cmF2ZXJzZXMgb2JqZWN0cy9hcnJheXMpICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFN0cmVhbUlkcyhvYmo6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHN0cmVhbUlkczogc3RyaW5nW10gPSBbXTtcblxuICBmdW5jdGlvbiB0cmF2ZXJzZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmIChpc1N0cmVhbUlkKHZhbHVlKSkge1xuICAgICAgc3RyZWFtSWRzLnB1c2godmFsdWUgYXMgc3RyaW5nKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgdHJhdmVyc2UoaXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgICAgICB0cmF2ZXJzZSh2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRyYXZlcnNlKG9iaik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoc3RyZWFtSWRzKSk7XG59XG5cbi8qKiBUcnVuY2F0ZSBhIHN0cmluZyB0byBhIG1heGltdW0gbGVuZ3RoLCBhZGRpbmcgZWxsaXBzaXMgaWYgbmVlZGVkICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVJZChpZDogc3RyaW5nLCBtYXhMZW5ndGggPSAxMik6IHN0cmluZyB7XG4gIGlmIChpZC5sZW5ndGggPD0gbWF4TGVuZ3RoKSByZXR1cm4gaWQ7XG4gIHJldHVybiBgJHtpZC5zbGljZSgwLCBtYXhMZW5ndGgpfS4uLmA7XG59XG4iXX0=
|
|
726
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2VyaWFsaXphdGlvbi1mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFM0MsOEVBQThFO0FBQzlFLHlDQUF5QztBQUN6Qyw4RUFBOEU7QUFFOUU7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEVBRUwsT0FBTyxJQUFJLGVBQWUsRUFDMUIsb0JBQW9CLEVBQ3BCLE9BQU8sSUFBSSxlQUFlLEVBQzFCLGdCQUFnQixFQUNoQixZQUFZLEVBR1osY0FBYyxFQUVkLE1BQU0sR0FDUCxNQUFNLCtCQUErQixDQUFDO0FBRXZDLDhFQUE4RTtBQUM5RSxnREFBZ0Q7QUFDaEQsOEVBQThFO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLDJEQUEyRDtJQUMzRCxVQUFVLEVBQUUsTUFBTTtJQUNsQixtRkFBbUY7SUFDbkYsU0FBUyxFQUFFLE1BQU07SUFDakI7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxFQUFFLE1BQU07SUFDZCw0RkFBNEY7SUFDNUYsSUFBSSxFQUFFLE1BQU07SUFDWixpR0FBaUc7SUFDakcsSUFBSSxFQUFFLE1BQU07Q0FDSixDQUFDO0FBS1gsMkNBQTJDO0FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBRS9CLE1BQU0sYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDeEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUV4Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsTUFBK0IsRUFDL0IsT0FBNkI7SUFFN0IsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLFVB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QUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNkLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLFVBQVUsQ0FBQyxFQUFVLEVBQUUsU0FBUyxHQUFHLEVBQUU7SUFDbkQsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN0QyxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLXNhZmUgc2VyaWFsaXphdGlvbiBmb3JtYXQgdXRpbGl0aWVzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBmb3JtYXQgcHJlZml4IGhhbmRsaW5nLCBnZW5lcmljIGh5ZHJhdGUvZGVoeWRyYXRlXG4gKiBkaXNwYXRjaCwgYW5kIHNoYXJlZCB0eXBlcy9jbGFzc2VzIHVzZWQgYnkgYWxsIGVudmlyb25tZW50cyAocnVudGltZSwgd2ViXG4gKiBvMTF5LCBDTEkgbzExeSkuIEl0IGhhcyBOTyBOb2RlLmpzIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBnZXRFdmVudERhdGFSZWZGaWVsZHMgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcGFyc2UsIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEtleSBtYXRlcmlhbCAoYnJvd3Nlci1zYWZlIHJlLWV4cG9ydHMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZS1leHBvcnRlZCBmcm9tIHRoZSBlbnZlbG9wZSBsYXllciBzbyBicm93c2VyIGNvbnN1bWVycyAod2ViIGRhc2hib2FyZCxcbiAqIHdlYi1zaGFyZWQpIGNhbiByZXNvbHZlIGtleSBtYXRlcmlhbCB3aXRob3V0IGltcG9ydGluZ1xuICogYEB3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb25gLCB3aG9zZSBtb2R1bGUgZ3JhcGggcmVhY2hlcyBOb2RlIGJ1aWx0LWluc1xuICogKGBub2RlOnV0aWxgLCBgbm9kZTphc3luY19ob29rc2ApIGFuZCBjYW5ub3QgYmUgYnVuZGxlZCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogRXZlcnl0aGluZyBiZWxvdyBpcyBXZWIgQ3J5cHRvIG9ubHk6IGBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHNgLFxuICogYGVuY3J5cHRpb24udHNgIGFuZCBgc2VhbGVkLWJveC50c2AgYXJlIGFsbCBmcmVlIG9mIE5vZGUgZGVwZW5kZW5jaWVzLlxuICovXG5leHBvcnQge1xuICB0eXBlIERlY3J5cHRpb25LZXksXG4gIGRlY3J5cHQgYXMgZGVjcnlwdEVudmVsb3BlLFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgZW5jcnlwdCBhcyBlbmNyeXB0RW52ZWxvcGUsXG4gIGlzUnVuUGF5bG9hZEtleXMsXG4gIGlzU2VhbFRhcmdldCxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxuICBydW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBTZWFsVGFyZ2V0LFxuICBzZWFsVG8sXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGb3JtYXQgcHJlZml4IGNvbnN0YW50cyBhbmQgZW5jb2RpbmcvZGVjb2Rpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgU2VyaWFsaXphdGlvbkZvcm1hdCA9IHtcbiAgLyoqIGRldmFsdWUgc3RyaW5naWZ5L3BhcnNlIHdpdGggVGV4dEVuY29kZXIvVGV4dERlY29kZXIgKi9cbiAgREVWQUxVRV9WMTogJ2RldmwnLFxuICAvKiogRW5jcnlwdGVkIHBheWxvYWQgKGlubmVyIHBheWxvYWQgaGFzIGl0cyBvd24gZm9ybWF0IHByZWZpeCBhZnRlciBkZWNyeXB0aW9uKSAqL1xuICBFTkNSWVBURUQ6ICdlbmNyJyxcbiAgLyoqXG4gICAqIFNlYWxlZCBwYXlsb2FkIOKAlCBhc3ltbWV0cmljYWxseSBlbmNyeXB0ZWQgdG8gYSBydW4ncyBYMjU1MTkgcHVibGljIGtleVxuICAgKiAoaW5uZXIgcGF5bG9hZCBoYXMgaXRzIG93biBmb3JtYXQgcHJlZml4IGFmdGVyIG9wZW5pbmcpLlxuICAgKlxuICAgKiBXcml0dGVuIGJ5IGNyb3NzLXJ1biB3cml0ZXJzIHRoYXQgaG9sZCBvbmx5IHRoZSByZWNpcGllbnQgcnVuJ3MgcHVibGljXG4gICAqIGtleS4gT3BlbmluZyBpdCByZXF1aXJlcyB0aGUgcnVuJ3MgcHJpdmF0ZSBzY2FsYXIgcmF0aGVyIHRoYW4gdGhlXG4gICAqIHN5bW1ldHJpYyBwZXItcnVuIGtleSwgc28gbzExeSBkaXNwbGF5IHRyZWF0cyBpdCBhcyBjaXBoZXJ0ZXh0IHZpYVxuICAgKiB7QGxpbmsgaXNFbmNyeXB0ZWREYXRhfSBidXQge0BsaW5rIGh5ZHJhdGVEYXRhV2l0aEtleX0gZG9lcyBub3QgYXR0ZW1wdFxuICAgKiBhbiBBRVMtR0NNIGRlY3J5cHQgb24gaXQuXG4gICAqL1xuICBTRUFMRUQ6ICdlbmNwJyxcbiAgLyoqIEd6aXAtY29tcHJlc3NlZCBwYXlsb2FkIChpbm5lciBwYXlsb2FkIGhhcyBpdHMgb3duIGZvcm1hdCBwcmVmaXggYWZ0ZXIgZGVjb21wcmVzc2lvbikgKi9cbiAgR1pJUDogJ2d6aXAnLFxuICAvKiogWnN0YW5kYXJkLWNvbXByZXNzZWQgcGF5bG9hZCAoaW5uZXIgcGF5bG9hZCBoYXMgaXRzIG93biBmb3JtYXQgcHJlZml4IGFmdGVyIGRlY29tcHJlc3Npb24pICovXG4gIFpTVEQ6ICd6c3RkJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlID1cbiAgKHR5cGVvZiBTZXJpYWxpemF0aW9uRm9ybWF0KVtrZXlvZiB0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdF07XG5cbi8qKiBMZW5ndGggb2YgdGhlIGZvcm1hdCBwcmVmaXggaW4gYnl0ZXMgKi9cbmNvbnN0IEZPUk1BVF9QUkVGSVhfTEVOR1RIID0gNDtcblxuY29uc3QgZm9ybWF0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuY29uc3QgZm9ybWF0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKipcbiAqIEVuY29kZSBhIHBheWxvYWQgd2l0aCBhIGZvcm1hdCBwcmVmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlLFxuICBwYXlsb2FkOiBVaW50OEFycmF5IHwgdW5rbm93blxuKTogVWludDhBcnJheSB8IHVua25vd24ge1xuICBpZiAoIShwYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeEJ5dGVzID0gZm9ybWF0RW5jb2Rlci5lbmNvZGUoZm9ybWF0KTtcbiAgaWYgKHByZWZpeEJ5dGVzLmxlbmd0aCAhPT0gRk9STUFUX1BSRUZJWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRm9ybWF0IGlkZW50aWZpZXIgbXVzdCBiZSBleGFjdGx5ICR7Rk9STUFUX1BSRUZJWF9MRU5HVEh9IEFTQ0lJIGNoYXJhY3RlcnMsIGdvdCBcIiR7Zm9ybWF0fVwiICgke3ByZWZpeEJ5dGVzLmxlbmd0aH0gYnl0ZXMpYFxuICAgICk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShGT1JNQVRfUFJFRklYX0xFTkdUSCArIHBheWxvYWQubGVuZ3RoKTtcbiAgcmVzdWx0LnNldChwcmVmaXhCeXRlcywgMCk7XG4gIHJlc3VsdC5zZXQocGF5bG9hZCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlY29kZSBhIGZvcm1hdC1wcmVmaXhlZCBwYXlsb2FkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRm9ybWF0UHJlZml4KGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duKToge1xuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlO1xuICBwYXlsb2FkOiBVaW50OEFycmF5O1xufSB7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWQ6IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShkYXRhKSksXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmxlbmd0aCA8IEZPUk1BVF9QUkVGSVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZm9ybWF0IHByZWZpeDogZXhwZWN0ZWQgYXQgbGVhc3QgJHtGT1JNQVRfUFJFRklYX0xFTkdUSH0gYnl0ZXMsIGdvdCAke2RhdGEubGVuZ3RofWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcHJlZml4Qnl0ZXMgPSBkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKTtcbiAgY29uc3QgZm9ybWF0ID0gZm9ybWF0RGVjb2Rlci5kZWNvZGUocHJlZml4Qnl0ZXMpO1xuXG4gIGNvbnN0IGtub3duRm9ybWF0cyA9IE9iamVjdC52YWx1ZXMoU2VyaWFsaXphdGlvbkZvcm1hdCkgYXMgc3RyaW5nW107XG4gIGlmICgha25vd25Gb3JtYXRzLmluY2x1ZGVzKGZvcm1hdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5rbm93biBzZXJpYWxpemF0aW9uIGZvcm1hdDogXCIke2Zvcm1hdH1cIi4gS25vd24gZm9ybWF0czogJHtrbm93bkZvcm1hdHMuam9pbignLCAnKX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQgPSBkYXRhLnN1YmFycmF5KEZPUk1BVF9QUkVGSVhfTEVOR1RIKTtcbiAgcmV0dXJuIHsgZm9ybWF0OiBmb3JtYXQgYXMgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUsIHBheWxvYWQgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNyeXB0ZWQgZGF0YSBkZXRlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFBsYWNlaG9sZGVyIHN0cmluZyBkaXNwbGF5ZWQgd2hlbiBkYXRhIGlzIGVuY3J5cHRlZCBhbmQgZGVjcnlwdGlvblxuICogaGFzIG5vdCBiZWVuIHJlcXVlc3RlZC4gVXNlZCBieSBib3RoIENMSSBhbmQgd2ViIG8xMXkuXG4gKi9cbmV4cG9ydCBjb25zdCBFTkNSWVBURURfUExBQ0VIT0xERVIgPSAnXFx1ezFGNTEyfSBFbmNyeXB0ZWQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cGlyZWQgZGF0YSBkZXRlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGxhaW4gb2JqZWN0IGlzIGB7IGV4cGlyZWRBdDogXCI8SVNPIGRhdGU+XCIgfWAg4oCUIGEgc2luZ2xlLWtleVxuICogb2JqZWN0IHdpdGggYSBzdHJpbmcgYGV4cGlyZWRBdGAgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGlzRXhwaXJlZE9iamVjdChkYXRhOiB1bmtub3duKTogZGF0YSBpcyB7IGV4cGlyZWRBdDogc3RyaW5nIH0ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gIHJldHVybiAoXG4gICAga2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICBrZXlzWzBdID09PSAnZXhwaXJlZEF0JyAmJlxuICAgIHR5cGVvZiAoZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZXhwaXJlZEF0ID09PSAnc3RyaW5nJ1xuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgaHlkcmF0ZWQgdmFsdWUgaXMgYW4gZXhwaXJlZCBkYXRhIHN0dWIgZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIFRoZSBzZXJ2ZXIgcmVwbGFjZXMgZXhwaXJlZCByZWYgZmllbGRzIHdpdGggYSBkZXZhbHVlLWVuY29kZWQgc3R1YlxuICogKGBtYWtlRXhwaXJlZFN0dWJgKSB0aGF0IGRlc2VyaWFsaXplcyB0byBgW3sgZXhwaXJlZEF0OiBcIjxJU08gZGF0ZT5cIiB9XWBcbiAqIGFmdGVyIGB1bmZsYXR0ZW5gIChhcnJheS13cmFwcGVkIGR1ZSB0byBiYWNrd2FyZHMtY29tcGF0aWJsZSBlbmNvZGluZykuXG4gKiBBbHNvIG1hdGNoZXMgdGhlIHVud3JhcHBlZCBgeyBleHBpcmVkQXQ6IFwiLi4uXCIgfWAgZm9ybSBmb3Igcm9idXN0bmVzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwaXJlZFN0dWIoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBEaXJlY3Qgb2JqZWN0IGZvcm06IHsgZXhwaXJlZEF0OiBcIi4uLlwiIH1cbiAgaWYgKGlzRXhwaXJlZE9iamVjdChkYXRhKSkgcmV0dXJuIHRydWU7XG4gIC8vIEFycmF5LXdyYXBwZWQgZm9ybSBmcm9tIGRldmFsdWUgdW5mbGF0dGVuOiBbeyBleHBpcmVkQXQ6IFwiLi4uXCIgfV1cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YS5sZW5ndGggPT09IDEgJiYgaXNFeHBpcmVkT2JqZWN0KGRhdGFbMF0pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgYmluYXJ5IHZhbHVlIGlzIGNpcGhlcnRleHQg4oCUIGVpdGhlciBhIHN5bW1ldHJpY2FsbHkgZW5jcnlwdGVkXG4gKiBwYXlsb2FkICgnZW5jcicpIG9yIGEgc2VhbGVkIGNyb3NzLXJ1biBwYXlsb2FkICgnZW5jcCcpLlxuICpcbiAqIFRoaXMgaXMgdGhlIHByZWRpY2F0ZSBkaXNwbGF5IGxheWVycyB3YW50OiBib3RoIHNjaGVtZXMgYXJlIG9wYXF1ZSBieXRlc1xuICogdGhhdCBtdXN0IG5vdCBiZSBmZWQgdG8gdGhlIGRldmFsdWUgcGFyc2VyLCBhbmQgYm90aCByZW5kZXIgYXMgdGhlIHNhbWVcbiAqIFwiRW5jcnlwdGVkXCIgYWZmb3JkYW5jZSBpbiB0aGUgQ0xJIGFuZCB3ZWIgVUkuIFVzZSB7QGxpbmsgaXNTZWFsZWREYXRhfSB3aGVuXG4gKiB0aGUgKnNjaGVtZSogbWF0dGVycyDigJQgbm90YWJseSB3aGVuIGNob29zaW5nIGEgZGVjcnlwdGlvbiBwYXRoLCBzaW5jZSBhXG4gKiBzZWFsZWQgcGF5bG9hZCBuZWVkcyB0aGUgcnVuJ3MgcHJpdmF0ZSBzY2FsYXIgcmF0aGVyIHRoYW4gaXRzIHN5bW1ldHJpYyBrZXkuXG4gKlxuICogQnJvd3Nlci1zYWZlIOKAlCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGZ1bGwgc2VyaWFsaXphdGlvbiBtb2R1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VuY3J5cHRlZERhdGEoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgfHwgZGF0YS5sZW5ndGggPCBGT1JNQVRfUFJFRklYX0xFTkdUSCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBmb3JtYXREZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKSk7XG4gIHJldHVybiAoXG4gICAgcHJlZml4ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRCB8fFxuICAgIHByZWZpeCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRURcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGJpbmFyeSB2YWx1ZSBoYXMgdGhlICdlbmNwJyBmb3JtYXQgcHJlZml4LCBpbmRpY2F0aW5nIGEgc2VhbGVkXG4gKiAoYXN5bW1ldHJpY2FsbHkgZW5jcnlwdGVkKSBjcm9zcy1ydW4gcGF5bG9hZC5cbiAqXG4gKiBCcm93c2VyLXNhZmUg4oCUIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgZnVsbCBzZXJpYWxpemF0aW9uIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VhbGVkRGF0YShkYXRhOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBkYXRhLmxlbmd0aCA8IEZPUk1BVF9QUkVGSVhfTEVOR1RIKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHByZWZpeCA9IGZvcm1hdERlY29kZXIuZGVjb2RlKGRhdGEuc3ViYXJyYXkoMCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpKTtcbiAgcmV0dXJuIHByZWZpeCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRUQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBiaW5hcnkgdmFsdWUgaGFzIGEgY29tcHJlc3Npb24gZm9ybWF0IHByZWZpeCAoJ2d6aXAnIG9yICd6c3RkJykuXG4gKiBCcm93c2VyLXNhZmUg4oCUIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgZnVsbCBzZXJpYWxpemF0aW9uIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcHJlc3NlZERhdGEoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgfHwgZGF0YS5sZW5ndGggPCBGT1JNQVRfUFJFRklYX0xFTkdUSCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBmb3JtYXREZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKSk7XG4gIHJldHVybiAoXG4gICAgcHJlZml4ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkdaSVAgfHwgcHJlZml4ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVERcbiAgKTtcbn1cblxuaW50ZXJmYWNlIE5vZGVabGliRGVjb2RlIHtcbiAgZ3VuemlwU3luYz86IChkYXRhOiBVaW50OEFycmF5KSA9PiBVaW50OEFycmF5O1xuICB6c3RkRGVjb21wcmVzc1N5bmM/OiAoZGF0YTogVWludDhBcnJheSkgPT4gVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGBub2RlOnpsaWJgIHZpYSBgcHJvY2Vzcy5nZXRCdWlsdGluTW9kdWxlYCDigJQgbm8gc3RhdGljIE5vZGVcbiAqIGRlcGVuZGVuY3ksIGludmlzaWJsZSB0byBicm93c2VyIGJ1bmRsZXJzLiBSZXR1cm5zIHVuZGVmaW5lZCBvZmYgTm9kZS5cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZVpsaWIoKTogTm9kZVpsaWJEZWNvZGUgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBnbG9iYWxUaGlzIGFzIHtcbiAgICAgICAgcHJvY2Vzcz86IHsgZ2V0QnVpbHRpbk1vZHVsZT86IChpZDogc3RyaW5nKSA9PiBOb2RlWmxpYkRlY29kZSB9O1xuICAgICAgfVxuICAgICkucHJvY2Vzcz8uZ2V0QnVpbHRpbk1vZHVsZT8uKCdub2RlOnpsaWInKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgZGVjb21wcmVzcyBhIGBnemlwYC9genN0ZGAgcGF5bG9hZCB3aGVuIHJ1bm5pbmcgb24gTm9kZS5qcy5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gc3luYyBkZWNvbXByZXNzaW9uIGlzbid0IGF2YWlsYWJsZSAoZS5nLiBpbiB0aGVcbiAqIGJyb3dzZXIsIG9yIHpzdGQgb24gTm9kZSA8IDIyLjE1KSDigJQgY2FsbGVycyBmYWxsIGJhY2sgdG8gbGVhdmluZyB0aGUgZGF0YVxuICogdW4taHlkcmF0ZWQgKHRoZSBhc3luYyBgaHlkcmF0ZURhdGFXaXRoS2V5YCBwYXRoIGhhbmRsZXMgZGVjb21wcmVzc2lvbiBpblxuICogYnJvd3NlcnMgdmlhIGBEZWNvbXByZXNzaW9uU3RyZWFtYCAvIGEgcmVnaXN0ZXJlZCB6c3RkIGRlY29kZXIpLlxuICovXG5mdW5jdGlvbiBkZWNvbXByZXNzU3luY0lmQXZhaWxhYmxlKFxuICBmb3JtYXQ6IHN0cmluZyxcbiAgcGF5bG9hZDogVWludDhBcnJheVxuKTogVWludDhBcnJheSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgemxpYiA9IGdldE5vZGVabGliKCk7XG4gICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQICYmIHpsaWI/Lmd1bnppcFN5bmMpIHtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh6bGliLmd1bnppcFN5bmMocGF5bG9hZCkpO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVEQgJiYgemxpYj8uenN0ZERlY29tcHJlc3NTeW5jKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoemxpYi56c3RkRGVjb21wcmVzc1N5bmMocGF5bG9hZCkpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbCB0aHJvdWdoIOKAlCB0cmVhdCBhcyB1bmF2YWlsYWJsZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQnJvd3NlciB6c3RkIGRlY29kZXIsIHJlZ2lzdGVyZWQgYnkgdGhlIG8xMXkgaG9zdCAod2ViLXNoYXJlZCkgc2luY2UgdGhlXG4gKiBXZWIgYERlY29tcHJlc3Npb25TdHJlYW1gIGhhcyBubyB6c3RkIHN1cHBvcnQuIE5vZGUgZGVjb2RlcyB2aWEgYG5vZGU6emxpYmBcbiAqIGFuZCBuZXZlciBuZWVkcyB0aGlzLiBTZWUgYHJlZ2lzdGVyWnN0ZERlY29kZXJgLlxuICovXG5sZXQgenN0ZEJyb3dzZXJEZWNvZGVyOlxuICB8ICgocGF5bG9hZDogVWludDhBcnJheSkgPT4gUHJvbWlzZTxVaW50OEFycmF5PilcbiAgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBicm93c2VyIHpzdGQgZGVjb2RlciAoZS5nLiBhIFdBU00tYmFja2VkIG9uZSkuIFRoZSB3ZWIgbzExeSBVSVxuICogY2FsbHMgdGhpcyBhdCBpbml0IHNvIGBoeWRyYXRlRGF0YVdpdGhLZXlgIGNhbiBpbmZsYXRlIHpzdGQgcGF5bG9hZHMgYWZ0ZXJcbiAqIGNsaWVudC1zaWRlIGRlY3J5cHRpb24uIE5vZGUgcmVhZGVycyB1c2UgYG5vZGU6emxpYmAgYW5kIGlnbm9yZSB0aGlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJac3RkRGVjb2RlcihcbiAgZGVjb2RlcjogKHBheWxvYWQ6IFVpbnQ4QXJyYXkpID0+IFByb21pc2U8VWludDhBcnJheT5cbik6IHZvaWQge1xuICB6c3RkQnJvd3NlckRlY29kZXIgPSBkZWNvZGVyO1xufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IGRlY29tcHJlc3MgYSBgZ3ppcGAvYHpzdGRgIHBheWxvYWQuXG4gKiAtIGd6aXA6IHdlYi1zdGFuZGFyZCBgRGVjb21wcmVzc2lvblN0cmVhbWAgKE5vZGUgMTgrLCBicm93c2VycywgZWRnZSkuXG4gKiAtIHpzdGQ6IGBub2RlOnpsaWJgIHdoZW4gb24gTm9kZSwgZWxzZSB0aGUgcmVnaXN0ZXJlZCBicm93c2VyIGRlY29kZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlY29tcHJlc3NBc3luYyhcbiAgZm9ybWF0OiBzdHJpbmcsXG4gIHBheWxvYWQ6IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVEQpIHtcbiAgICBjb25zdCBzeW5jID0gZGVjb21wcmVzc1N5bmNJZkF2YWlsYWJsZShmb3JtYXQsIHBheWxvYWQpO1xuICAgIGlmIChzeW5jKSByZXR1cm4gc3luYztcbiAgICBpZiAoenN0ZEJyb3dzZXJEZWNvZGVyKSByZXR1cm4genN0ZEJyb3dzZXJEZWNvZGVyKHBheWxvYWQpO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICd6c3RkLWNvbXByZXNzZWQgd29ya2Zsb3cgZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8genN0ZCBkZWNvZGVyIGlzICcgK1xuICAgICAgICAnYXZhaWxhYmxlLiBOb2RlLmpzIDIyLjE1KyBkZWNvZGVzIG5hdGl2ZWx5OyBpbiB0aGUgYnJvd3NlciByZWdpc3RlciAnICtcbiAgICAgICAgJ29uZSB2aWEgcmVnaXN0ZXJac3RkRGVjb2RlciAodGhlIHdlYiBvMTF5IHBhY2thZ2UgZG9lcyB0aGlzKS4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCdnemlwJyk7XG4gIGNvbnN0IHdyaXRlciA9IHRyYW5zZm9ybS53cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgY29uc3Qgd3JpdGVQcm9taXNlID0gd3JpdGVyLndyaXRlKHBheWxvYWQpLnRoZW4oKCkgPT4gd3JpdGVyLmNsb3NlKCkpO1xuICB3cml0ZVByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgdG90YWwgPSAwO1xuICBjb25zdCByZWFkZXIgPSB0cmFuc2Zvcm0ucmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSBicmVhaztcbiAgICBjaHVua3MucHVzaCh2YWx1ZSk7XG4gICAgdG90YWwgKz0gdmFsdWUubGVuZ3RoO1xuICB9XG4gIGF3YWl0IHdyaXRlUHJvbWlzZTtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkodG90YWwpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICBvdXQuc2V0KGNodW5rLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSBjaHVuay5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXZpdmVycyB0eXBlIChzaGFyZWQgYWNyb3NzIGFsbCBlbnZpcm9ubWVudHMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBBIG1hcCBvZiB0eXBlIG5hbWUg4oaSIHJldml2ZXIgZnVuY3Rpb24sIHVzZWQgYnkgZGV2YWx1ZSdzIGBwYXJzZWAvYHVuZmxhdHRlbmAuXG4gKiBFYWNoIGVudmlyb25tZW50IChydW50aW1lLCB3ZWIsIENMSSkgcHJvdmlkZXMgaXRzIG93biBzZXQuXG4gKi9cbmV4cG9ydCB0eXBlIFJldml2ZXJzID0gUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT47XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gR2VuZXJpYyBoeWRyYXRlL2RlaHlkcmF0ZSBkaXNwYXRjaFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogSHlkcmF0ZSAoZGVzZXJpYWxpemUpIGEgdmFsdWUgdGhhdCB3YXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZS5cbiAqXG4gKiBIYW5kbGVzIGZvdXIgZGF0YSBzaGFwZXM6XG4gKiAxLiBgVWludDhBcnJheWAgd2l0aCAnZW5jcicgcHJlZml4IOKGkiByZXR1cm5lZCBhcy1pcyAoZW5jcnlwdGVkLCBub3QgeWV0IGRlY3J5cHRlZClcbiAqIDIuIGBVaW50OEFycmF5YCB3aXRoIGEgZm9ybWF0IHByZWZpeCAoc3BlY1ZlcnNpb24gMispIOKGkiBkZWNvZGUgcHJlZml4LCBwYXJzZVxuICogMy4gYEFycmF5YCAobGVnYWN5IHNwZWNWZXJzaW9uIDEsIFwicmV2aXZlZCBkZXZhbHVlXCIpIOKGkiB1bmZsYXR0ZW5cbiAqIDQuIE90aGVyIChhbHJlYWR5IGEgcGxhaW4gSlMgdmFsdWUpIOKGkiByZXR1cm4gYXMtaXNcbiAqXG4gKiBFbmNyeXB0ZWQgZGF0YSBpcyBpbnRlbnRpb25hbGx5IGxlZnQgYXMgYSBgVWludDhBcnJheWAgc28gdGhhdCBjb25zdW1lcnNcbiAqIChDTEksIHdlYiBVSSkgY2FuIGRldGVjdCBpdCB3aXRoIGBpc0VuY3J5cHRlZERhdGEoKWAgYW5kIGRlY2lkZSBob3cgdG9cbiAqIGhhbmRsZSBpdCDigJQgdGhlIENMSSByZXBsYWNlcyBpdCB3aXRoIGEgc3R5bGVkIHBsYWNlaG9sZGVyLCB0aGUgd2ViIFVJXG4gKiByZW5kZXJzIGFuIFwiRW5jcnlwdGVkXCIgY2FyZCB3aXRoIGEgRGVjcnlwdCBidXR0b24gdGhhdCB0cmlnZ2Vyc1xuICogY2xpZW50LXNpZGUgZGVjcnlwdGlvbiBvbiBkZW1hbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlRGF0YSh2YWx1ZTogdW5rbm93biwgcmV2aXZlcnM6IFJldml2ZXJzKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAvLyBFbmNyeXB0ZWQgZGF0YSBwYXNzZXMgdGhyb3VnaCB1bnRvdWNoZWQg4oCUIG8xMXkgbGF5ZXJzIGRldGVjdCBpdCB3aXRoXG4gICAgLy8gaXNFbmNyeXB0ZWREYXRhKCkgYW5kIGhhbmRsZSBkaXNwbGF5ICh3ZWI6IG5hbWVkIGNvbnN0cnVjdG9yIG9iamVjdCxcbiAgICAvLyBDTEk6IEVuY3J5cHRlZERhdGFSZWYgd2l0aCB1dGlsLmluc3BlY3QuY3VzdG9tKS5cbiAgICBpZiAoaXNFbmNyeXB0ZWREYXRhKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgodmFsdWUpO1xuICAgIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgICAgY29uc3Qgc3RyID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBheWxvYWQpO1xuICAgICAgcmV0dXJuIHBhcnNlKHN0ciwgcmV2aXZlcnMpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuR1pJUCB8fFxuICAgICAgZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVERcbiAgICApIHtcbiAgICAgIC8vIENvbXByZXNzZWQgcGF5bG9hZCDigJQgZGVjb21wcmVzcyBzeW5jaHJvbm91c2x5IHdoZW4gcnVubmluZyBvblxuICAgICAgLy8gTm9kZS5qcyAoQ0xJLCBzZXJ2ZXIgbzExeSkuIEluIGJyb3dzZXJzIHRoZXJlIGlzIG5vIHN5bmMgY29kZWM7XG4gICAgICAvLyBwYXNzIHRoZSBkYXRhIHRocm91Z2ggdW50b3VjaGVkIChsaWtlIGVuY3J5cHRlZCBkYXRhKSBzbyBhc3luY1xuICAgICAgLy8gY29uc3VtZXJzIGNhbiByb3V0ZSBpdCB0aHJvdWdoIGBoeWRyYXRlRGF0YVdpdGhLZXlgLCB3aGljaFxuICAgICAgLy8gZGVjb21wcmVzc2VzIHZpYSBEZWNvbXByZXNzaW9uU3RyZWFtIC8gYSByZWdpc3RlcmVkIHpzdGQgZGVjb2Rlci5cbiAgICAgIGNvbnN0IGluZmxhdGVkID0gZGVjb21wcmVzc1N5bmNJZkF2YWlsYWJsZShmb3JtYXQsIHBheWxvYWQpO1xuICAgICAgaWYgKGluZmxhdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGluZmxhdGVkIGJ5dGVzIGNhcnJ5IHRoZWlyIG93biBmb3JtYXQgcHJlZml4IChlLmcuICdkZXZsJylcbiAgICAgIHJldHVybiBoeWRyYXRlRGF0YShpbmZsYXRlZCwgcmV2aXZlcnMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB1bmZsYXR0ZW4odmFsdWUsIHJldml2ZXJzKTtcbiAgfVxuXG4gIC8vIEFscmVhZHkgYSBwbGFpbiBKUyB2YWx1ZSAoZS5nLiwgbnVtYmVyLCBzdHJpbmcsIG51bGwpXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBIeWRyYXRlIGEgdmFsdWUsIGRlY3J5cHRpbmcgaXQgZmlyc3QgaWYgYW4gZW5jcnlwdGlvbiBrZXkgaXMgcHJvdmlkZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgYXN5bmMgdmVyc2lvbiBvZiBgaHlkcmF0ZURhdGFgIHRoYXQgc3VwcG9ydHMgdHJhbnNwYXJlbnRcbiAqIGRlY3J5cHRpb24uIFVzZWQgYnkgbzExeSB0b29saW5nICh3ZWIgVUksIENMSSkgd2hlbiB0aGUgdXNlciByZXF1ZXN0c1xuICogZGVjcnlwdGlvbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gaHlkcmF0ZSAobWF5IGJlIGVuY3J5cHRlZCBvciBzZWFsZWQpXG4gKiBAcGFyYW0gcmV2aXZlcnMgLSBEZXZhbHVlIHJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb25cbiAqIEBwYXJhbSBrZXkgLSBUaGUgcnVuJ3Mga2V5IG1hdGVyaWFsLiBQYXNzIGBSdW5QYXlsb2FkS2V5c2AgKGZyb21cbiAqICAgYGRlcml2ZVJ1blBheWxvYWRLZXlzYCkgdG8gb3BlbiBib3RoIHN5bW1ldHJpYyAoYGVuY3JgKSBhbmQgc2VhbGVkXG4gKiAgIChgZW5jcGApIHBheWxvYWRzOyBhIGJhcmUgYENyeXB0b0tleWAgb3BlbnMgb25seSB0aGUgc3ltbWV0cmljIG9uZXMuXG4gKiAgIFR5cGVkIGFzIGEgcmVhZCBjYXBhYmlsaXR5IHNvIGEgd3JpdGUtb25seSBzZWFsIHRhcmdldCDigJQgd2hpY2ggY291bGQgb3BlblxuICogICBuZWl0aGVyIHNjaGVtZSDigJQgaXMgcmVqZWN0ZWQgYXQgY29tcGlsZSB0aW1lIHJhdGhlciB0aGFuIGZhaWxpbmcgaGVyZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVEYXRhV2l0aEtleShcbiAgdmFsdWU6IHVua25vd24sXG4gIHJldml2ZXJzOiBSZXZpdmVycyxcbiAga2V5OiBpbXBvcnQoJy4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJykuRGVjcnlwdGlvbktleSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGxldCBkYXRhID0gdmFsdWU7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBpc0VuY3J5cHRlZERhdGEoZGF0YSkgJiYga2V5KSB7XG4gICAgLy8gRW52ZWxvcGUtYXdhcmUgZGVjcnlwdDogaGFuZGxlcyBib3RoIGBlbmNyYCAoQUVTLUdDTSB1bmRlciB0aGUgcnVuJ3NcbiAgICAvLyBzeW1tZXRyaWMga2V5KSBhbmQgYGVuY3BgIChzZWFsZWQgdG8gdGhlIHJ1bidzIFgyNTUxOSBwdWJsaWMga2V5IGJ5XG4gICAgLy8gc29tZSBvdGhlciBydW4pLCBkaXNwYXRjaGluZyBvbiB0aGUgZm9ybWF0IHByZWZpeC5cbiAgICBjb25zdCB7IGRlY3J5cHQsIGlzUnVuUGF5bG9hZEtleXMgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcydcbiAgICApO1xuICAgIC8vIE9wZW5pbmcgYSBzZWFsZWQgcGF5bG9hZCBuZWVkcyB0aGUgcnVuJ3MgcHJpdmF0ZSBzY2FsYXIuIElmIHRoZSBjYWxsZXJcbiAgICAvLyBzdXBwbGllZCBvbmx5IGEgc3ltbWV0cmljIGtleSwgbGVhdmUgdGhlIGJ5dGVzIGFzIGNpcGhlcnRleHQgc28gdGhlIFVJXG4gICAgLy8ga2VlcHMgc2hvd2luZyBpdHMgXCJFbmNyeXB0ZWRcIiBhZmZvcmRhbmNlLCByYXRoZXIgdGhhbiBzdXJmYWNpbmcgYVxuICAgIC8vIGRlY3J5cHRpb24gZXJyb3IgZm9yIHNvbWV0aGluZyB0aGF0IHdhcyBuZXZlciBvcGVuYWJsZSB3aXRoIHRoaXMga2V5LlxuICAgIGlmICghaXNTZWFsZWREYXRhKGRhdGEpIHx8IGlzUnVuUGF5bG9hZEtleXMoa2V5KSkge1xuICAgICAgZGF0YSA9IGF3YWl0IGRlY3J5cHQoZGF0YSwga2V5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGlzQ29tcHJlc3NlZERhdGEoZGF0YSkpIHtcbiAgICAvLyBEZWNvbXByZXNzOiBzdHJpcCB0aGUgY29kZWMgcHJlZml4IGFuZCBpbmZsYXRlLiBnemlwIHVzZXMgdGhlXG4gICAgLy8gd2ViLXN0YW5kYXJkIERlY29tcHJlc3Npb25TdHJlYW0gKHdvcmtzIGluIGJyb3dzZXJzKTsgenN0ZCB1c2VzXG4gICAgLy8gbm9kZTp6bGliIG9uIE5vZGUgb3IgdGhlIHJlZ2lzdGVyZWQgV0FTTSBkZWNvZGVyIGluIHRoZSBicm93c2VyLlxuICAgIC8vIFRoZSBpbmZsYXRlZCBieXRlcyBjYXJyeSB0aGVpciBvd24gZm9ybWF0IHByZWZpeCAoZS5nLiAnZGV2bCcpLlxuICAgIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGF0YSk7XG4gICAgZGF0YSA9IGF3YWl0IGRlY29tcHJlc3NBc3luYyhmb3JtYXQsIHBheWxvYWQpO1xuICB9XG4gIC8vIERlbGVnYXRlIHRoZSAoZGVjcnlwdGVkL2RlY29tcHJlc3NlZCkgcmVzdWx0IHRvIHN5bmMgaHlkcmF0ZURhdGFcbiAgcmV0dXJuIGh5ZHJhdGVEYXRhKGRhdGEsIHJldml2ZXJzKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgbWFya2VyIHR5cGVzIGZvciBvMTF5IGRpc3BsYXlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBTVFJFQU1fSURfUFJFRklYID0gJ3N0cm1fJztcblxuLyoqIE1hcmtlciBmb3Igc3RyZWFtIHJlZmVyZW5jZSBvYmplY3RzIHJlbmRlcmVkIGFzIGxpbmtzIGluIHRoZSBVSSAqL1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3N0cmVhbV9yZWZfXyc7XG5cbi8qKiBBIHN0cmVhbSByZWZlcmVuY2UgZm9yIFVJIGRpc3BsYXkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgU1RSRUFNX1JFRl9UWVBFO1xuICBzdHJlYW1JZDogc3RyaW5nO1xufVxuXG4vKiogTWFya2VyIGZvciBSdW4gcmVmZXJlbmNlIG9iamVjdHMgcmVuZGVyZWQgYXMgbGlua3MgaW4gdGhlIFVJICovXG5leHBvcnQgY29uc3QgUlVOX1JFRl9UWVBFID0gJ19fd29ya2Zsb3dfcnVuX3JlZl9fJztcblxuLyoqIEEgUnVuIHJlZmVyZW5jZSBmb3IgVUkgZGlzcGxheSAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5SZWYge1xuICBfX3R5cGU6IHR5cGVvZiBSVU5fUkVGX1RZUEU7XG4gIHJ1bklkOiBzdHJpbmc7XG59XG5cbi8qKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgUnVuUmVmIG9iamVjdCAqL1xuZXhwb3J0IGNvbnN0IGlzUnVuUmVmID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVuUmVmID0+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAnX190eXBlJyBpbiB2YWx1ZSAmJlxuICAgIHZhbHVlLl9fdHlwZSA9PT0gUlVOX1JFRl9UWVBFICYmXG4gICAgJ3J1bklkJyBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZS5ydW5JZCA9PT0gJ3N0cmluZydcbiAgKTtcbn07XG5cbi8qKiBDb252ZXJ0IGEgc2VyaWFsaXplZCBSdW4gdmFsdWUgdG8gYSBSdW5SZWYgZm9yIGRpc3BsYXkgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkUnVuVG9SdW5SZWYgPSAodmFsdWU6IHsgcnVuSWQ6IHN0cmluZyB9KTogUnVuUmVmID0+IHtcbiAgcmV0dXJuIHsgX190eXBlOiBSVU5fUkVGX1RZUEUsIHJ1bklkOiB2YWx1ZS5ydW5JZCB9O1xufTtcblxuLyoqIE1hcmtlciBmb3IgY3VzdG9tIGNsYXNzIGluc3RhbmNlIHJlZmVyZW5jZXMgKi9cbmV4cG9ydCBjb25zdCBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X2NsYXNzX2luc3RhbmNlX3JlZl9fJztcblxuLyoqXG4gKiBBIGNsYXNzIGluc3RhbmNlIHJlZmVyZW5jZSBmb3IgbzExeSBkaXNwbGF5LlxuICpcbiAqIEJyb3dzZXItc2FmZSBiYXNlIGNsYXNzIOKAlCBubyBgdXRpbC5pbnNwZWN0LmN1c3RvbWAuIEVudmlyb25tZW50LXNwZWNpZmljXG4gKiByZW5kZXJpbmcgKENMSSBpbnNwZWN0LCB3ZWIgY29tcG9uZW50KSBpcyBoYW5kbGVkIGJ5IGVhY2ggY29uc3VtZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGFzc0luc3RhbmNlUmVmIHtcbiAgcmVhZG9ubHkgX190eXBlID0gQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBjbGFzc0lkOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGE6IHVua25vd25cbiAgKSB7fVxuXG4gIHRvSlNPTigpOiB7XG4gICAgX190eXBlOiBzdHJpbmc7XG4gICAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgY2xhc3NJZDogc3RyaW5nO1xuICAgIGRhdGE6IHVua25vd247XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6IHRoaXMuX190eXBlLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIGNsYXNzSWQ6IHRoaXMuY2xhc3NJZCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgQ2xhc3NJbnN0YW5jZVJlZiBvYmplY3QgKi9cbmV4cG9ydCBjb25zdCBpc0NsYXNzSW5zdGFuY2VSZWYgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBDbGFzc0luc3RhbmNlUmVmID0+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIENsYXNzSW5zdGFuY2VSZWYgfHxcbiAgICAodmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICdfX3R5cGUnIGluIHZhbHVlICYmXG4gICAgICB2YWx1ZS5fX3R5cGUgPT09IENMQVNTX0lOU1RBTkNFX1JFRl9UWVBFICYmXG4gICAgICAnY2xhc3NOYW1lJyBpbiB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycpXG4gICk7XG59O1xuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmVhbSBJRCBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBpc1N0cmVhbUlkID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoU1RSRUFNX0lEX1BSRUZJWCk7XG59O1xuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVJlZiBvYmplY3QgKi9cbmV4cG9ydCBjb25zdCBpc1N0cmVhbVJlZiA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFN0cmVhbVJlZiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ19fdHlwZScgaW4gdmFsdWUgJiZcbiAgICB2YWx1ZS5fX3R5cGUgPT09IFNUUkVBTV9SRUZfVFlQRSAmJlxuICAgICdzdHJlYW1JZCcgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUuc3RyZWFtSWQgPT09ICdzdHJpbmcnXG4gICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNoYXJlZCBvMTF5IHJldml2ZXIgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29udmVydCBhIHNlcmlhbGl6ZWQgc3RyZWFtIHZhbHVlIHRvIGEgU3RyZWFtUmVmIGZvciBkaXNwbGF5LlxuICovXG5leHBvcnQgY29uc3Qgc3RyZWFtVG9TdHJlYW1SZWYgPSAodmFsdWU6IGFueSk6IFN0cmVhbVJlZiA9PiB7XG4gIGxldCBzdHJlYW1JZDogc3RyaW5nO1xuICBpZiAoJ25hbWUnIGluIHZhbHVlKSB7XG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyh2YWx1ZS5uYW1lKTtcbiAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aChTVFJFQU1fSURfUFJFRklYKSkge1xuICAgICAgc3RyZWFtSWQgPSBgJHtTVFJFQU1fSURfUFJFRklYfSR7bmFtZX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW1JZCA9IG5hbWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0cmVhbUlkID0gYCR7U1RSRUFNX0lEX1BSRUZJWH1udWxsYDtcbiAgfVxuICByZXR1cm4geyBfX3R5cGU6IFNUUkVBTV9SRUZfVFlQRSwgc3RyZWFtSWQgfTtcbn07XG5cbi8qKiBDb252ZXJ0IGEgc2VyaWFsaXplZCBzdGVwIGZ1bmN0aW9uIHRvIGEgZGlzcGxheSBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkU3RlcEZ1bmN0aW9uVG9TdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gJ251bGwnO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuICdudWxsJztcbiAgaWYgKCdzdGVwSWQnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIGA8c3RlcDokeyh2YWx1ZSBhcyB7IHN0ZXBJZDogc3RyaW5nIH0pLnN0ZXBJZH0+YDtcbiAgfVxuICByZXR1cm4gJzxmdW5jdGlvbj4nO1xufTtcblxuLyoqIEV4dHJhY3QgdGhlIGNsYXNzIG5hbWUgZnJvbSBhIGNsYXNzSWQgKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0Q2xhc3NOYW1lID0gKGNsYXNzSWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghY2xhc3NJZCkgcmV0dXJuICdVbmtub3duJztcbiAgY29uc3QgcGFydHMgPSBjbGFzc0lkLnNwbGl0KCcvJyk7XG4gIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSB8fCBjbGFzc0lkO1xufTtcblxuLyoqIENvbnZlcnQgYSBzZXJpYWxpemVkIGNsYXNzIGluc3RhbmNlIHRvIGEgQ2xhc3NJbnN0YW5jZVJlZiBmb3IgZGlzcGxheS5cbiAqICBSdW4gaW5zdGFuY2VzIGFyZSBzcGVjaWFsLWNhc2VkIHRvIGEgUnVuUmVmIGZvciBjbGlja2FibGUgcmVuZGVyaW5nLiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmID0gKHZhbHVlOiB7XG4gIGNsYXNzSWQ6IHN0cmluZztcbiAgZGF0YTogdW5rbm93bjtcbn0pOiBDbGFzc0luc3RhbmNlUmVmIHwgUnVuUmVmID0+IHtcbiAgY29uc3QgY2xhc3NOYW1lID0gZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKTtcbiAgaWYgKFxuICAgIGNsYXNzTmFtZSA9PT0gJ1J1bicgJiZcbiAgICB2YWx1ZS5kYXRhICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlLmRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgJ3J1bklkJyBpbiB2YWx1ZS5kYXRhICYmXG4gICAgdHlwZW9mICh2YWx1ZS5kYXRhIGFzIHsgcnVuSWQ6IHVua25vd24gfSkucnVuSWQgPT09ICdzdHJpbmcnXG4gICkge1xuICAgIHJldHVybiBzZXJpYWxpemVkUnVuVG9SdW5SZWYodmFsdWUuZGF0YSBhcyB7IHJ1bklkOiBzdHJpbmcgfSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBDbGFzc0luc3RhbmNlUmVmKGNsYXNzTmFtZSwgdmFsdWUuY2xhc3NJZCwgdmFsdWUuZGF0YSk7XG59O1xuXG4vKiogQ29udmVydCBhIHNlcmlhbGl6ZWQgY2xhc3MgcmVmZXJlbmNlIHRvIGEgZGlzcGxheSBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkQ2xhc3NUb1N0cmluZyA9ICh2YWx1ZTogeyBjbGFzc0lkOiBzdHJpbmcgfSk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBgPGNsYXNzOiR7ZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKX0+YDtcbn07XG5cbi8qKlxuICogU3RhbmRhcmQgbzExeSByZXZpdmVycyB0aGF0IG92ZXJyaWRlIHJ1bnRpbWUtc3BlY2lmaWMgdHlwZXMgd2l0aFxuICogZGlzcGxheS1mcmllbmRseSB2YWx1ZXMuIFVzZWQgYnkgYm90aCB3ZWIgYW5kIENMSSBoeWRyYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBvYnNlcnZhYmlsaXR5UmV2aXZlcnM6IFJldml2ZXJzID0ge1xuICBSZWFkYWJsZVN0cmVhbTogc3RyZWFtVG9TdHJlYW1SZWYsXG4gIFdyaXRhYmxlU3RyZWFtOiBzdHJlYW1Ub1N0cmVhbVJlZixcbiAgVHJhbnNmb3JtU3RyZWFtOiBzdHJlYW1Ub1N0cmVhbVJlZixcbiAgQWJvcnRDb250cm9sbGVyOiAodmFsdWU6IGFueSkgPT5cbiAgICBgPEFib3J0Q29udHJvbGxlcihhYm9ydGVkOiAke3ZhbHVlLmFib3J0ZWR9KT5gLFxuICBBYm9ydFNpZ25hbDogKHZhbHVlOiBhbnkpID0+IGA8QWJvcnRTaWduYWwoYWJvcnRlZDogJHt2YWx1ZS5hYm9ydGVkfSk+YCxcbiAgLy8gRE9NRXhjZXB0aW9uIG5lZWRzIGFuIGV4cGxpY2l0IHJldml2ZXI6IHdpdGhvdXQgb25lLCBkZXZhbHVlLnBhcnNlXG4gIC8vIHRocm93cyBvbiB0aGUgYFtcIkRPTUV4Y2VwdGlvblwiLCAuLi5dYCB0YWcgYW5kIGBoeWRyYXRlU3RlcElPYCdzXG4gIC8vIHRyeS9jYXRjaCBsZWF2ZXMgdGhlIHJhdyBmbGF0LWVuY29kZWQgc3RyaW5nIGluIHRoZSBVSS4gQWJvcnRDb250cm9sbGVyXG4gIC8vIHN5bnRoZXNpemVzIGEgRE9NRXhjZXB0aW9uIGFzIHRoZSBkZWZhdWx0IGBzaWduYWwucmVhc29uYCB3aGVuIGFib3J0KClcbiAgLy8gaXMgY2FsbGVkIHdpdGggbm8gYXJnIOKAlCBzbyBhbnkgYWJvcnQgdGhhdCByb3VuZC10cmlwcyB0aHJvdWdoIGEgc3RlcFxuICAvLyBib3VuZGFyeSBzdXJmYWNlcyBoZXJlLiBSZWNvbnN0cnVjdCBhcyBhIHJlYWwgRE9NRXhjZXB0aW9uIHdoZW4gdGhlXG4gIC8vIGdsb2JhbCBpcyBhdmFpbGFibGUgKG1vZGVybiBicm93c2VycyArIE5vZGUgMTgrKSwgZWxzZSBmYWxsIGJhY2sgdG9cbiAgLy8gYW4gRXJyb3IgcHJlc2VydmluZyBuYW1lL21lc3NhZ2Uvc3RhY2svY2F1c2UgZm9yIGRpc3BsYXkuXG4gIERPTUV4Y2VwdGlvbjogKHZhbHVlOiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzdGFjaz86IHN0cmluZztcbiAgICBjYXVzZT86IHVua25vd247XG4gIH0pID0+IHtcbiAgICBjb25zdCBHID0gZ2xvYmFsVGhpcyBhcyB7IERPTUV4Y2VwdGlvbj86IHR5cGVvZiBET01FeGNlcHRpb24gfTtcbiAgICBpZiAodHlwZW9mIEcuRE9NRXhjZXB0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBlID0gbmV3IEcuRE9NRXhjZXB0aW9uKHZhbHVlLm1lc3NhZ2UsIHZhbHVlLm5hbWUpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGUuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZSBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIGNvbnN0IGU6IEVycm9yICYgeyBjYXVzZT86IHVua25vd24gfSA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICBlLm5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGUuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICByZXR1cm4gZTtcbiAgfSxcbiAgU3RlcEZ1bmN0aW9uOiBzZXJpYWxpemVkU3RlcEZ1bmN0aW9uVG9TdHJpbmcsXG4gIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZTogeyB3b3JrZmxvd0lkOiBzdHJpbmcgfSkgPT5cbiAgICBgPHdvcmtmbG93OiR7dmFsdWUud29ya2Zsb3dJZH0+YCxcbiAgSW5zdGFuY2U6IHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmLFxuICBDbGFzczogc2VyaWFsaXplZENsYXNzVG9TdHJpbmcsXG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlc291cmNlLWxldmVsIGh5ZHJhdGlvbiBkaXNwYXRjaCAoZm9yIG8xMXkpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBkYXRhIGZpZWxkcyBvZiBhIHN0ZXAgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVTdGVwSU88XG4gIFQgZXh0ZW5kcyB7IHN0ZXBJZD86IHN0cmluZzsgaW5wdXQ/OiBhbnk7IG91dHB1dD86IGFueTsgZXJyb3I/OiBhbnkgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBsZXQgaHlkcmF0ZWRJbnB1dCA9IHJlc291cmNlLmlucHV0O1xuICBsZXQgaHlkcmF0ZWRPdXRwdXQgPSByZXNvdXJjZS5vdXRwdXQ7XG4gIGxldCBoeWRyYXRlZEVycm9yID0gcmVzb3VyY2UuZXJyb3I7XG5cbiAgaWYgKHJlc291cmNlLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRJbnB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvdXJjZS5vdXRwdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZE91dHB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLm91dHB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYGVycm9yYCBmaWVsZCBpcyBgU2VyaWFsaXplZERhdGFgIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAvLyBgZGVoeWRyYXRlU3RlcEVycm9yYC4gSHlkcmF0ZSBpdCBzbyBvYnNlcnZhYmlsaXR5IHRvb2xzIChDTEksIHdlYiBVSSlcbiAgLy8gY2FuIHJlYWQgYHN0ZXAuZXJyb3IubWVzc2FnZWAsIGBzdGVwLmVycm9yLnN0YWNrYCwgZXRjLlxuICBpZiAocmVzb3VyY2UuZXJyb3IgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZEVycm9yID0gaHlkcmF0ZURhdGEocmVzb3VyY2UuZXJyb3IsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNvdXJjZSxcbiAgICBpbnB1dDogaHlkcmF0ZWRJbnB1dCxcbiAgICBvdXRwdXQ6IGh5ZHJhdGVkT3V0cHV0LFxuICAgIGVycm9yOiBoeWRyYXRlZEVycm9yLFxuICB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIGRhdGEgZmllbGRzIG9mIGEgd29ya2Zsb3cgcnVuIHJlc291cmNlLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlV29ya2Zsb3dJTzxcbiAgVCBleHRlbmRzIHsgaW5wdXQ/OiBhbnk7IG91dHB1dD86IGFueTsgZXJyb3I/OiBhbnkgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBsZXQgaHlkcmF0ZWRJbnB1dCA9IHJlc291cmNlLmlucHV0O1xuICBsZXQgaHlkcmF0ZWRPdXRwdXQgPSByZXNvdXJjZS5vdXRwdXQ7XG4gIGxldCBoeWRyYXRlZEVycm9yID0gcmVzb3VyY2UuZXJyb3I7XG5cbiAgaWYgKHJlc291cmNlLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRJbnB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvdXJjZS5vdXRwdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZE91dHB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLm91dHB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYGVycm9yYCBmaWVsZCBpcyBgU2VyaWFsaXplZERhdGFgIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAvLyBgZGVoeWRyYXRlUnVuRXJyb3JgLiBIeWRyYXRlIGl0IHNvIG9ic2VydmFiaWxpdHkgdG9vbHMgKENMSSwgd2ViIFVJKVxuICAvLyBjYW4gcmVhZCBgcnVuLmVycm9yLm1lc3NhZ2VgLCBgcnVuLmVycm9yLnN0YWNrYCwgZXRjLlxuICBpZiAocmVzb3VyY2UuZXJyb3IgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZEVycm9yID0gaHlkcmF0ZURhdGEocmVzb3VyY2UuZXJyb3IsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNvdXJjZSxcbiAgICBpbnB1dDogaHlkcmF0ZWRJbnB1dCxcbiAgICBvdXRwdXQ6IGh5ZHJhdGVkT3V0cHV0LFxuICAgIGVycm9yOiBoeWRyYXRlZEVycm9yLFxuICB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIGV2ZW50RGF0YSBmaWVsZHMgb2YgYW4gZXZlbnQgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVFdmVudERhdGE8XG4gIFQgZXh0ZW5kcyB7IGV2ZW50SWQ/OiBzdHJpbmc7IGV2ZW50VHlwZT86IHN0cmluZzsgZXZlbnREYXRhPzogYW55IH0sXG4+KHJlc291cmNlOiBULCByZXZpdmVyczogUmV2aXZlcnMpOiBUIHtcbiAgaWYgKCFyZXNvdXJjZS5ldmVudERhdGEpIHJldHVybiByZXNvdXJjZTtcblxuICBjb25zdCBldmVudERhdGEgPSB7IC4uLnJlc291cmNlLmV2ZW50RGF0YSB9O1xuXG4gIGZvciAoY29uc3QgZmllbGQgb2YgZ2V0RXZlbnREYXRhUmVmRmllbGRzKHJlc291cmNlLmV2ZW50VHlwZSA/PyAnJykpIHtcbiAgICBpZiAoZXZlbnREYXRhW2ZpZWxkXSA9PSBudWxsKSBjb250aW51ZTtcbiAgICB0cnkge1xuICAgICAgZXZlbnREYXRhW2ZpZWxkXSA9IGh5ZHJhdGVEYXRhKGV2ZW50RGF0YVtmaWVsZF0sIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIGV2ZW50RGF0YSB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIG1ldGFkYXRhIGZpZWxkIG9mIGEgaG9vayByZXNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gaHlkcmF0ZUhvb2tNZXRhZGF0YTxUIGV4dGVuZHMgeyBob29rSWQ/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55IH0+KFxuICByZXNvdXJjZTogVCxcbiAgcmV2aXZlcnM6IFJldml2ZXJzXG4pOiBUIHtcbiAgaWYgKHJlc291cmNlLm1ldGFkYXRhID09IG51bGwpIHJldHVybiByZXNvdXJjZTtcblxuICBsZXQgaHlkcmF0ZWRNZXRhZGF0YSA9IHJlc291cmNlLm1ldGFkYXRhO1xuICB0cnkge1xuICAgIGh5ZHJhdGVkTWV0YWRhdGEgPSBoeWRyYXRlRGF0YShyZXNvdXJjZS5tZXRhZGF0YSwgcmV2aXZlcnMpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIG1ldGFkYXRhOiBoeWRyYXRlZE1ldGFkYXRhIH07XG59XG5cbi8qKlxuICogSHlkcmF0ZSB0aGUgc2VyaWFsaXplZCBkYXRhIGZpZWxkcyBvZiBhbnkgcmVzb3VyY2UgZm9yIG8xMXkgZGlzcGxheS5cbiAqXG4gKiBEaXNwYXRjaGVzIGJ5IHJlc291cmNlIHR5cGUgKHN0ZXAsIGhvb2ssIGV2ZW50LCB3b3JrZmxvdykgYW5kIGNhbGxzXG4gKiBgaHlkcmF0ZURhdGFgIHdpdGggdGhlIHByb3ZpZGVkIHJldml2ZXJzIGZvciBlYWNoIGRhdGEgZmllbGQuXG4gKlxuICogRWFjaCBlbnZpcm9ubWVudCAod2ViLCBDTEkpIHByb3ZpZGVzIGl0cyBvd24gcmV2aXZlcnMg4oCUIHRoaXMgZnVuY3Rpb25cbiAqIG9ubHkgaGFuZGxlcyB0aGUgZGlzcGF0Y2ggbG9naWMgYW5kIGZpZWxkIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJTzxcbiAgVCBleHRlbmRzIHtcbiAgICBzdGVwSWQ/OiBzdHJpbmc7XG4gICAgaG9va0lkPzogc3RyaW5nO1xuICAgIGV2ZW50SWQ/OiBzdHJpbmc7XG4gICAgZXZlbnRUeXBlPzogc3RyaW5nO1xuICAgIGlucHV0PzogYW55O1xuICAgIG91dHB1dD86IGFueTtcbiAgICBtZXRhZGF0YT86IGFueTtcbiAgICBldmVudERhdGE/OiBhbnk7XG4gICAgZXhlY3V0aW9uQ29udGV4dD86IGFueTtcbiAgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBpZiAoIXJlc291cmNlKSByZXR1cm4gcmVzb3VyY2U7XG5cbiAgbGV0IGh5ZHJhdGVkOiBUO1xuICBpZiAoJ3N0ZXBJZCcgaW4gcmVzb3VyY2UpIHtcbiAgICBoeWRyYXRlZCA9IGh5ZHJhdGVTdGVwSU8ocmVzb3VyY2UsIHJldml2ZXJzKTtcbiAgfSBlbHNlIGlmICgnaG9va0lkJyBpbiByZXNvdXJjZSkge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZUhvb2tNZXRhZGF0YShyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9IGVsc2UgaWYgKCdldmVudElkJyBpbiByZXNvdXJjZSkge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZUV2ZW50RGF0YShyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9IGVsc2Uge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZVdvcmtmbG93SU8ocmVzb3VyY2UsIHJldml2ZXJzKTtcbiAgfVxuXG4gIC8vIFN0cmlwIGV4ZWN1dGlvbkNvbnRleHQsIHByZXNlcnZpbmcgb25seSB3b3JrZmxvd0NvcmVWZXJzaW9uIGZvciBkaXNwbGF5XG4gIGlmICgnZXhlY3V0aW9uQ29udGV4dCcgaW4gaHlkcmF0ZWQpIHtcbiAgICBjb25zdCB7IGV4ZWN1dGlvbkNvbnRleHQsIC4uLnJlc3QgfSA9IGh5ZHJhdGVkO1xuICAgIGNvbnN0IHdvcmtmbG93Q29yZVZlcnNpb24gPVxuICAgICAgZXhlY3V0aW9uQ29udGV4dCAmJlxuICAgICAgdHlwZW9mIGV4ZWN1dGlvbkNvbnRleHQgPT09ICdvYmplY3QnICYmXG4gICAgICAnd29ya2Zsb3dDb3JlVmVyc2lvbicgaW4gZXhlY3V0aW9uQ29udGV4dFxuICAgICAgICA/IGV4ZWN1dGlvbkNvbnRleHQud29ya2Zsb3dDb3JlVmVyc2lvblxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAod29ya2Zsb3dDb3JlVmVyc2lvbikge1xuICAgICAgcmV0dXJuIHsgLi4ucmVzdCwgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3QgYXMgVDtcbiAgfVxuXG4gIHJldHVybiBoeWRyYXRlZDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVdGlsaXR5IGZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBFeHRyYWN0IGFsbCBzdHJlYW0gSURzIGZyb20gYSB2YWx1ZSAocmVjdXJzaXZlbHkgdHJhdmVyc2VzIG9iamVjdHMvYXJyYXlzKSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTdHJlYW1JZHMob2JqOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBzdHJlYW1JZHM6IHN0cmluZ1tdID0gW107XG4gIC8vIFRoZSBoeWRyYXRlZCBvMTF5IGRhdGEgdGhpcyB3YWxrcyBjb21lcyBmcm9tIGRldmFsdWUsIHdoaWNoIHN1cHBvcnRzXG4gIC8vIGNpcmN1bGFyIGFuZCByZXBlYXRlZCByZWZlcmVuY2VzLiBUcmFjayB2aXNpdGVkIGNvbnRhaW5lcnMgc28gYSBjeWNsZVxuICAvLyAoZS5nLiBhIHN0ZXAgcmVzdWx0IHdob3NlIG9iamVjdCByZWZlcnMgYmFjayB0byBpdHNlbGYpIGRvZXNuJ3QgcmVjdXJzZVxuICAvLyBmb3JldmVyIGFuZCBvdmVyZmxvdyB0aGUgc3RhY2suXG4gIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgZnVuY3Rpb24gdHJhdmVyc2UodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoaXNTdHJlYW1JZCh2YWx1ZSkpIHtcbiAgICAgIHN0cmVhbUlkcy5wdXNoKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIHRyYXZlcnNlKGl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgZm9yIChjb25zdCB2YWwgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICAgICAgdHJhdmVyc2UodmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmF2ZXJzZShvYmopO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHN0cmVhbUlkcykpO1xufVxuXG4vKiogVHJ1bmNhdGUgYSBzdHJpbmcgdG8gYSBtYXhpbXVtIGxlbmd0aCwgYWRkaW5nIGVsbGlwc2lzIGlmIG5lZWRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlSWQoaWQ6IHN0cmluZywgbWF4TGVuZ3RoID0gMTIpOiBzdHJpbmcge1xuICBpZiAoaWQubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIGlkO1xuICByZXR1cm4gYCR7aWQuc2xpY2UoMCwgbWF4TGVuZ3RoKX0uLi5gO1xufVxuIl19
|