@workflow/core 5.0.0-beta.42 → 5.0.0-beta.44
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/capabilities.d.ts +4 -4
- package/dist/capabilities.js +5 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +8 -8
- package/dist/class-serialization.js +9 -9
- package/dist/classify-error.js +5 -5
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +5 -5
- package/dist/create-hook.d.ts +10 -6
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.js +8 -8
- package/dist/encryption.d.ts +5 -5
- package/dist/encryption.js +7 -7
- package/dist/events-consumer.d.ts +19 -7
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +33 -12
- package/dist/flushable-stream.d.ts +4 -4
- package/dist/flushable-stream.js +12 -12
- package/dist/global.d.ts +1 -1
- package/dist/global.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +5 -5
- package/dist/logger.js +4 -4
- package/dist/private.d.ts +39 -64
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +294 -48
- package/dist/replay-payload-cache.d.ts +1 -1
- package/dist/replay-payload-cache.js +4 -4
- package/dist/runtime/compute-instance.d.ts +4 -3
- package/dist/runtime/compute-instance.d.ts.map +1 -1
- package/dist/runtime/compute-instance.js +5 -4
- package/dist/runtime/constants.d.ts +46 -19
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +76 -38
- package/dist/runtime/count-step-started-events.d.ts +7 -7
- package/dist/runtime/count-step-started-events.js +4 -4
- package/dist/runtime/deployment-guard.d.ts +7 -7
- package/dist/runtime/deployment-guard.js +8 -8
- package/dist/runtime/get-port-lazy.d.ts +2 -2
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +37 -30
- package/dist/runtime/get-world-lazy.d.ts +2 -2
- package/dist/runtime/get-world-lazy.js +3 -3
- package/dist/runtime/helpers.d.ts +18 -18
- package/dist/runtime/helpers.js +27 -27
- package/dist/runtime/quickjs-entrypoint.d.ts +23 -10
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +200 -81
- package/dist/runtime/quickjs-runtime.d.ts +31 -15
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +126 -77
- package/dist/runtime/quickjs-serde.d.ts +10 -10
- package/dist/runtime/quickjs-serde.js +20 -20
- package/dist/runtime/replay-budget.d.ts +4 -4
- package/dist/runtime/replay-budget.js +5 -5
- package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
- package/dist/runtime/replay-recovery-reporter.js +2 -2
- package/dist/runtime/resume-hook.d.ts +2 -2
- package/dist/runtime/resume-hook.js +27 -27
- package/dist/runtime/resume-latency.d.ts +25 -25
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +4 -4
- package/dist/runtime/run-id-time.d.ts +2 -2
- package/dist/runtime/run-id-time.js +5 -5
- package/dist/runtime/run.d.ts +21 -4
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +154 -35
- package/dist/runtime/runs.d.ts +4 -4
- package/dist/runtime/runs.js +2 -2
- package/dist/runtime/start.d.ts +3 -3
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +27 -23
- package/dist/runtime/step-executor.d.ts +59 -11
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +116 -42
- package/dist/runtime/step-latency.d.ts +20 -14
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +13 -11
- package/dist/runtime/step-ownership.d.ts +6 -6
- package/dist/runtime/step-ownership.js +8 -8
- package/dist/runtime/step-single-flight.d.ts +1 -1
- package/dist/runtime/step-single-flight.d.ts.map +1 -1
- package/dist/runtime/step-single-flight.js +17 -11
- package/dist/runtime/suspension-handler.d.ts +99 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +678 -57
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +1 -1
- package/dist/runtime/vm-mode.js +2 -2
- package/dist/runtime/wait-continuation.d.ts +31 -9
- package/dist/runtime/wait-continuation.d.ts.map +1 -1
- package/dist/runtime/wait-continuation.js +44 -13
- package/dist/runtime/wait-until.d.ts +1 -1
- package/dist/runtime/wait-until.js +2 -2
- package/dist/runtime/world-compatibility.d.ts +20 -9
- package/dist/runtime/world-compatibility.d.ts.map +1 -1
- package/dist/runtime/world-compatibility.js +24 -13
- package/dist/runtime/world-init.d.ts +5 -5
- package/dist/runtime/world-init.js +6 -6
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +13 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +417 -213
- package/dist/sealed-box.d.ts +7 -7
- package/dist/sealed-box.js +15 -15
- package/dist/serialization/client.js +2 -2
- package/dist/serialization/codec-devalue-vm.d.ts +1 -1
- package/dist/serialization/codec-devalue-vm.js +4 -4
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.js +2 -2
- package/dist/serialization/codec.d.ts +4 -4
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +12 -11
- package/dist/serialization/compression.d.ts.map +1 -1
- package/dist/serialization/compression.js +16 -15
- package/dist/serialization/encryption.d.ts +7 -7
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +8 -8
- package/dist/serialization/errors.js +2 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +18 -18
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +41 -32
- package/dist/serialization/index.d.ts +1 -1
- package/dist/serialization/index.js +2 -2
- package/dist/serialization/reducers/class-vm.d.ts +1 -1
- package/dist/serialization/reducers/class-vm.js +2 -2
- package/dist/serialization/reducers/class.js +2 -2
- package/dist/serialization/reducers/common-vm.js +12 -12
- package/dist/serialization/reducers/common.js +12 -12
- package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
- package/dist/serialization/reducers/step-function-vm.js +2 -2
- package/dist/serialization/reducers/step-function.js +2 -2
- package/dist/serialization/step.js +2 -2
- package/dist/serialization/types.d.ts +5 -5
- package/dist/serialization/types.js +2 -2
- package/dist/serialization/workflow-vm.d.ts +1 -1
- package/dist/serialization/workflow-vm.d.ts.map +1 -1
- package/dist/serialization/workflow-vm.js +13 -10
- package/dist/serialization-format.d.ts +11 -11
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +29 -23
- package/dist/serialization.d.ts +20 -12
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +141 -99
- package/dist/set-attributes.js +2 -2
- package/dist/source-map.d.ts +1 -1
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +18 -12
- package/dist/step/context-storage.d.ts +5 -5
- package/dist/step/context-storage.js +1 -1
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.js +7 -7
- package/dist/step.js +12 -12
- package/dist/symbols.d.ts +2 -2
- package/dist/symbols.js +3 -3
- package/dist/telemetry/semantic-conventions.d.ts +21 -13
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +21 -15
- package/dist/telemetry.d.ts +9 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +40 -10
- package/dist/test-support/orchestrator-context.d.ts.map +1 -1
- package/dist/test-support/orchestrator-context.js +12 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.js +4 -4
- package/dist/vm/script-cache.d.ts.map +1 -1
- package/dist/vm/script-cache.js +23 -17
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +1 -1
- package/dist/workflow/abort-controller.js +12 -12
- package/dist/workflow/create-hook.js +3 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.js +18 -18
- package/dist/workflow/set-attributes.d.ts +1 -1
- package/dist/workflow/set-attributes.js +2 -2
- package/dist/workflow/sleep.js +2 -2
- package/dist/workflow/world-init-stub.d.ts +1 -1
- package/dist/workflow/world-init-stub.js +2 -2
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +36 -14
- package/docs/api-reference/create-hook.mdx +15 -15
- package/docs/api-reference/create-webhook.mdx +15 -15
- package/docs/api-reference/define-hook.mdx +10 -10
- package/docs/api-reference/fatal-error.mdx +2 -2
- package/docs/api-reference/fetch.mdx +7 -7
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +1 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +2 -2
- package/docs/api-reference/sleep.mdx +3 -3
- package/docs/foundations/cancellation.mdx +31 -31
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +37 -37
- package/docs/foundations/idempotency.mdx +9 -9
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +36 -37
- package/docs/foundations/streaming.mdx +68 -39
- package/docs/foundations/versioning.mdx +3 -3
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +62 -62
- package/docs/how-it-works/code-transform.mdx +66 -54
- package/docs/how-it-works/encryption.mdx +25 -21
- package/docs/how-it-works/event-sourcing.mdx +84 -28
- package/docs/how-it-works/framework-integrations.mdx +12 -12
- package/docs/how-it-works/understanding-directives.mdx +21 -21
- package/package.json +7 -7
package/dist/serialization.js
CHANGED
|
@@ -97,13 +97,13 @@ function unwrapSerializationCause(error) {
|
|
|
97
97
|
* The compression layer populates `stats` only when it actually ran (binary
|
|
98
98
|
* data on a spec >= 5 path); legacy / v1Compat paths leave it unrecorded, so
|
|
99
99
|
* this no-ops for them and avoids the `getActiveSpan` lookup. Attributes land
|
|
100
|
-
* on whatever span is active
|
|
100
|
+
* on whatever span is active, typically the dedicated `step.dehydrate` /
|
|
101
101
|
* `step.hydrate` span, otherwise the enclosing run/start span.
|
|
102
102
|
*/
|
|
103
103
|
async function recordCompression(stats, operation) {
|
|
104
104
|
if (!stats.recorded)
|
|
105
105
|
return;
|
|
106
|
-
// Telemetry must never break the serialize/deserialize data path
|
|
106
|
+
// Telemetry must never break the serialize/deserialize data path: a
|
|
107
107
|
// missing/failing tracer is purely an observability loss.
|
|
108
108
|
try {
|
|
109
109
|
const span = await getActiveSpan();
|
|
@@ -129,7 +129,7 @@ async function recordCompression(stats, operation) {
|
|
|
129
129
|
/**
|
|
130
130
|
* Emits OTel span attributes for workflow (guest) code executions that the
|
|
131
131
|
* hardened serializer could not avoid (getters, proxies, custom
|
|
132
|
-
* serializers). No-ops when serialization was fully side-effect free
|
|
132
|
+
* serializers). No-ops when serialization was fully side-effect free,
|
|
133
133
|
* the common case. Same never-break-the-data-path contract as
|
|
134
134
|
* `recordCompression` above.
|
|
135
135
|
*/
|
|
@@ -157,7 +157,7 @@ export function getSerializeStream(reducers, cryptoKey) {
|
|
|
157
157
|
// Resolve the key input once on first use and cache the result.
|
|
158
158
|
// Note: if resolving cryptoKey rejects (e.g., network error fetching
|
|
159
159
|
// the derived key), the rejection won't surface until the first chunk
|
|
160
|
-
// is processed
|
|
160
|
+
// is processed, not at stream construction time.
|
|
161
161
|
const keyState = {
|
|
162
162
|
resolved: false,
|
|
163
163
|
key: undefined,
|
|
@@ -190,7 +190,7 @@ export function getSerializeStream(reducers, cryptoKey) {
|
|
|
190
190
|
// On the sealed path the KEM is amortized across the stream via a
|
|
191
191
|
// session (one ECDH per writer instead of one per frame). That is safe
|
|
192
192
|
// precisely because the nonces stay random, and because the session is
|
|
193
|
-
// scoped to this stream instance
|
|
193
|
+
// scoped to this stream instance: a replayed or reconnected writer
|
|
194
194
|
// builds a new one and never inherits a previous content key.
|
|
195
195
|
if (sealSession) {
|
|
196
196
|
prefixed = encodeWithFormatPrefix(SerializationFormat.SEALED, await sealSession.seal(prefixed));
|
|
@@ -262,8 +262,8 @@ export function getDeserializeStream(revivers, cryptoKey) {
|
|
|
262
262
|
format === SerializationFormat.SEALED) {
|
|
263
263
|
const sealed = format === SerializationFormat.SEALED;
|
|
264
264
|
// A sealed frame needs the run's keypair; a symmetric frame needs an
|
|
265
|
-
// AES key. Report the shortfall precisely
|
|
266
|
-
// wrong kind of key" have
|
|
265
|
+
// AES key. Report the shortfall precisely: "no key at all" and "the
|
|
266
|
+
// wrong kind of key" have distinct causes.
|
|
267
267
|
const usable = sealed
|
|
268
268
|
? isRunPayloadKeys(keyState.key)
|
|
269
269
|
: aesKeyOf(keyState.key) !== undefined;
|
|
@@ -295,7 +295,7 @@ export function getDeserializeStream(revivers, cryptoKey) {
|
|
|
295
295
|
// The low-level crypto layer only sees the stripped payload, so it
|
|
296
296
|
// cannot record the outer envelope prefix. We peeked it here, so
|
|
297
297
|
// enrich the diagnostic context with the real format prefix before
|
|
298
|
-
// propagating
|
|
298
|
+
// propagating, mirroring serialization/encryption.ts.
|
|
299
299
|
if (RuntimeDecryptionError.is(error) && error.context) {
|
|
300
300
|
error.context.formatPrefix = format;
|
|
301
301
|
}
|
|
@@ -355,7 +355,7 @@ export function getDeserializeStream(revivers, cryptoKey) {
|
|
|
355
355
|
// Byte streams (`type: 'bytes'` ReadableStreams passed across boundaries)
|
|
356
356
|
// are written to the underlying world's stream transport one user chunk at
|
|
357
357
|
// a time. Without an in-band envelope, the reader sees a flat stream of
|
|
358
|
-
// bytes
|
|
358
|
+
// bytes: there is no way to tell where one user chunk ends and the next
|
|
359
359
|
// begins, which makes mid-stream reconnect impossible (we don't know how
|
|
360
360
|
// many server-side chunks have been consumed).
|
|
361
361
|
//
|
|
@@ -365,7 +365,7 @@ export function getDeserializeStream(revivers, cryptoKey) {
|
|
|
365
365
|
// [4-byte big-endian length][user payload bytes]
|
|
366
366
|
//
|
|
367
367
|
// The envelope is identical in shape to `getSerializeStream`'s framing,
|
|
368
|
-
// but the payload here is *raw user bytes
|
|
368
|
+
// but the payload here is *raw user bytes*: there is no inner
|
|
369
369
|
// format-prefix, no devalue, no encryption. A framed byte stream stays
|
|
370
370
|
// semantically a byte stream end-to-end; the framing is purely transport.
|
|
371
371
|
//
|
|
@@ -373,7 +373,7 @@ export function getDeserializeStream(revivers, cryptoKey) {
|
|
|
373
373
|
// serialized stream ref (`framing: 'framed-v1'`), so both sides agree on
|
|
374
374
|
// the wire format without runtime negotiation. Producers that target a
|
|
375
375
|
// run whose deployment doesn't support framing (see `getRunCapabilities`
|
|
376
|
-
// in capabilities.ts) emit raw bytes and a ref without the field
|
|
376
|
+
// in capabilities.ts) emit raw bytes and a ref without the field, which
|
|
377
377
|
// the reader treats as legacy raw bytes for backwards compatibility.
|
|
378
378
|
/**
|
|
379
379
|
* Maximum allowed byte-stream frame payload size (100MB). Shared by the
|
|
@@ -388,7 +388,7 @@ const MAX_FRAME_SIZE = 100_000_000;
|
|
|
388
388
|
* Wraps each chunk of a byte stream in a 4-byte big-endian length
|
|
389
389
|
* prefix. Used by the producer side of a framed byte-stream pipe.
|
|
390
390
|
*
|
|
391
|
-
* Empty chunks (length 0) are dropped
|
|
391
|
+
* Empty chunks (length 0) are dropped: the resulting `[0x00 0x00 0x00 0x00]`
|
|
392
392
|
* frame would be ambiguous with the legacy "looks framed" detection in
|
|
393
393
|
* `getDeserializeStream`, and it carries no information.
|
|
394
394
|
*
|
|
@@ -397,7 +397,7 @@ const MAX_FRAME_SIZE = 100_000_000;
|
|
|
397
397
|
* writable performs one wire write per chunk, preserving boundaries). The
|
|
398
398
|
* server therefore stores one frame per chunk index, which is what allows
|
|
399
399
|
* a future reconnecting reader to resume a framed byte stream at
|
|
400
|
-
* `startIndex + consumedFrames
|
|
400
|
+
* `startIndex + consumedFrames`, the same arithmetic
|
|
401
401
|
* `createReconnectingFramedStream` relies on for object streams. Do not
|
|
402
402
|
* coalesce or split frames here without revisiting that resume logic.
|
|
403
403
|
*/
|
|
@@ -423,7 +423,7 @@ export function getByteFramingStream() {
|
|
|
423
423
|
* Unwraps length-prefixed byte-stream frames back into the original user
|
|
424
424
|
* chunks. Used by the consumer side of a framed byte-stream pipe.
|
|
425
425
|
*
|
|
426
|
-
* Buffers across read boundaries
|
|
426
|
+
* Buffers across read boundaries, since the transport may split a single
|
|
427
427
|
* frame across multiple reads (header in one chunk, payload in another)
|
|
428
428
|
* or coalesce multiple frames into a single read. The transform emits
|
|
429
429
|
* whole user chunks regardless of transport chunking.
|
|
@@ -592,7 +592,7 @@ export class WorkflowServerReadableStream extends ReadableStream {
|
|
|
592
592
|
* Maximum consecutive reconnect attempts for a single framed stream session.
|
|
593
593
|
* The counter resets to zero whenever a reconnect makes forward progress (a
|
|
594
594
|
* frame is delivered), so this bounds *consecutive* failures, not the lifetime
|
|
595
|
-
* total
|
|
595
|
+
* total: a long-lived serverless stream may legitimately reconnect far more
|
|
596
596
|
* than this many times as long as each reconnect keeps delivering data. We only
|
|
597
597
|
* give up after this many reconnects in a row produce nothing.
|
|
598
598
|
*/
|
|
@@ -608,7 +608,7 @@ const getFramedStreamMaxReconnects = () => envNumber('WORKFLOW_FRAMED_STREAM_MAX
|
|
|
608
608
|
* correct for a well-behaved backend that honors `startIndex`. But if a World's
|
|
609
609
|
* `streams.get` ever ignored `startIndex` and re-delivered earlier chunks,
|
|
610
610
|
* "progress" would be reported every reconnect and the consecutive cap would
|
|
611
|
-
* never trip
|
|
611
|
+
* never trip, turning a bounded failure into an unbounded reconnect loop. This
|
|
612
612
|
* hard ceiling guarantees the loop always terminates. It is set high enough
|
|
613
613
|
* (hours of streaming at realistic per-session timeouts) to never interfere
|
|
614
614
|
* with legitimate long-lived streams.
|
|
@@ -625,15 +625,23 @@ const getFramedStreamMaxTotalReconnects = () => envNumber('WORKFLOW_FRAMED_STREA
|
|
|
625
625
|
* the writable buffers one frame per chunk when multi-writing). The wrapper
|
|
626
626
|
* counts completed frames and, on upstream error, reopens the connection
|
|
627
627
|
* with `startIndex = resolvedStartIndex + consumedFrames`. Partial-frame
|
|
628
|
-
* bytes buffered before the cut are discarded
|
|
628
|
+
* bytes buffered before the cut are discarded; the server will resend the
|
|
629
629
|
* in-flight chunk in full from the new startIndex.
|
|
630
630
|
*
|
|
631
|
-
* A clean upstream close (EOF with no error)
|
|
632
|
-
*
|
|
631
|
+
* A clean upstream close (EOF with no error) is NOT trusted as completion
|
|
632
|
+
* on its own: some transport paths normalize a mid-stream abort into a
|
|
633
|
+
* graceful end (observed in production on Vercel response streaming, where
|
|
634
|
+
* the server's max-duration abort arrives at the client as a clean EOF).
|
|
635
|
+
* On EOF the wrapper verifies against the stream's authoritative metadata
|
|
636
|
+
* (`streams.getInfo`) that the stream is complete AND that every chunk up to
|
|
637
|
+
* `done` was delivered; otherwise it reconnects from the next chunk exactly
|
|
638
|
+
* like an errored connection. If the metadata read itself fails, the EOF is
|
|
639
|
+
* trusted (legacy behavior) rather than failing a read that may well be
|
|
640
|
+
* complete.
|
|
633
641
|
*
|
|
634
642
|
* Negative `startIndex` values (last-N semantics) skip the reconnect
|
|
635
643
|
* machinery because we cannot compute an absolute resume position without
|
|
636
|
-
* a tail-index lookup
|
|
644
|
+
* a tail-index lookup; the returned stream behaves as a single-shot read.
|
|
637
645
|
*/
|
|
638
646
|
export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
639
647
|
const reconnectSupported = startIndex === undefined || startIndex >= 0;
|
|
@@ -661,20 +669,38 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
661
669
|
connectMs = Date.now() - connectStart;
|
|
662
670
|
reader = stream.getReader();
|
|
663
671
|
}
|
|
672
|
+
/**
|
|
673
|
+
* Whether an upstream EOF represents genuine completion: the stream's
|
|
674
|
+
* authoritative metadata says it is done AND the frames delivered so far
|
|
675
|
+
* cover every chunk up to the tail (one outer frame == one server chunk).
|
|
676
|
+
* A metadata failure trusts the EOF, since turning a healthy completion
|
|
677
|
+
* into an error (or a reconnect loop) on a transient metadata blip would
|
|
678
|
+
* be worse than the legacy behavior this check guards against.
|
|
679
|
+
*/
|
|
680
|
+
async function isVerifiedComplete() {
|
|
681
|
+
try {
|
|
682
|
+
const world = await getWorldLazy();
|
|
683
|
+
const info = await world.streams.getInfo(runId, name);
|
|
684
|
+
return info.done && currentStartIndex + consumedFrames > info.tailIndex;
|
|
685
|
+
}
|
|
686
|
+
catch {
|
|
687
|
+
return true;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
664
690
|
async function reconnect() {
|
|
665
691
|
if (reader) {
|
|
666
692
|
await reader.cancel().catch(() => { });
|
|
667
693
|
reader = undefined;
|
|
668
694
|
}
|
|
669
695
|
// Advance the resume position past the frames already delivered, then
|
|
670
|
-
// drop any partial-frame bytes
|
|
696
|
+
// drop any partial-frame bytes: the reopened connection re-sends from a
|
|
671
697
|
// frame boundary at the new index.
|
|
672
698
|
currentStartIndex += consumedFrames;
|
|
673
699
|
consumedFrames = 0;
|
|
674
700
|
buffer = new Uint8Array(0);
|
|
675
701
|
// Retry the reopen itself against the reconnect budget. A transient
|
|
676
|
-
// failure of connect()
|
|
677
|
-
// reconnect window
|
|
702
|
+
// failure of connect() (the server briefly unavailable during the
|
|
703
|
+
// reconnect window) is the exact blip this wrapper exists to survive, so
|
|
678
704
|
// count it against the budget and try again rather than treating it as
|
|
679
705
|
// fatal. Only budget exhaustion (a server that stays down) terminates the
|
|
680
706
|
// stream.
|
|
@@ -709,7 +735,7 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
709
735
|
if (readStart === undefined)
|
|
710
736
|
readStart = Date.now();
|
|
711
737
|
// Loop until we emit something, hit EOF, or fatally error. Reads that
|
|
712
|
-
// only extend the in-flight-frame buffer don't enqueue anything
|
|
738
|
+
// only extend the in-flight-frame buffer don't enqueue anything; we
|
|
713
739
|
// keep reading rather than returning empty-handed.
|
|
714
740
|
for (;;) {
|
|
715
741
|
if (!reader) {
|
|
@@ -741,10 +767,26 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
741
767
|
continue;
|
|
742
768
|
}
|
|
743
769
|
if (result.done || !result.value) {
|
|
744
|
-
// Clean EOF — stream is truly complete. Drop any partial-frame
|
|
745
|
-
// bytes (there shouldn't be any; a well-formed stream ends on a
|
|
746
|
-
// frame boundary).
|
|
747
770
|
reader = undefined;
|
|
771
|
+
// A clean EOF is only trustworthy if the stream is actually
|
|
772
|
+
// complete and this session delivered every chunk up to `done`.
|
|
773
|
+
// Infrastructure can normalize a mid-stream abort into a graceful
|
|
774
|
+
// end (the server's max-duration cut is designed to arrive as an
|
|
775
|
+
// errored body, but on some paths it reaches the client as a clean
|
|
776
|
+
// EOF), and a completed stream can still be cut mid-body; both
|
|
777
|
+
// would otherwise be silently read as a shorter, complete stream.
|
|
778
|
+
if (reconnectSupported && !(await isVerifiedComplete())) {
|
|
779
|
+
try {
|
|
780
|
+
await reconnect();
|
|
781
|
+
}
|
|
782
|
+
catch (reconnectErr) {
|
|
783
|
+
controller.error(reconnectErr);
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
786
|
+
continue;
|
|
787
|
+
}
|
|
788
|
+
// Genuine end-of-stream. Drop any partial-frame bytes (there
|
|
789
|
+
// shouldn't be any; a well-formed stream ends on a frame boundary).
|
|
748
790
|
if (readStart !== undefined) {
|
|
749
791
|
recordStreamReadComplete(readStart, runId, name, chunksDelivered, bytesDelivered, totalReconnectCount);
|
|
750
792
|
}
|
|
@@ -779,13 +821,13 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
779
821
|
emitted = true;
|
|
780
822
|
}
|
|
781
823
|
if (emitted) {
|
|
782
|
-
// Forward progress on the current connection
|
|
824
|
+
// Forward progress on the current connection: clear the
|
|
783
825
|
// consecutive-failure budget so a long stream that reconnects
|
|
784
826
|
// many times (but keeps delivering) is never falsely capped.
|
|
785
827
|
reconnectCount = 0;
|
|
786
828
|
return;
|
|
787
829
|
}
|
|
788
|
-
// Only partial bytes
|
|
830
|
+
// Only partial bytes: read more.
|
|
789
831
|
}
|
|
790
832
|
},
|
|
791
833
|
cancel: async () => {
|
|
@@ -805,7 +847,7 @@ export function createReconnectingFramedStream(runId, name, startIndex) {
|
|
|
805
847
|
* rates (most agents: ~1.2 chunks per flush, >70% of chunks arriving more
|
|
806
848
|
* than 10ms after the previous request already finished) show a fixed
|
|
807
849
|
* leading-edge window taxes isolated-chunk delivery (~+20% on a ~50ms RTT)
|
|
808
|
-
* while batching almost nothing for slow producers
|
|
850
|
+
* while batching almost nothing for slow producers; fast producers get
|
|
809
851
|
* their batching from in-flight accumulation regardless. Setting a positive
|
|
810
852
|
* interval (env or `world.streamFlushIntervalMs`) opts a deployment into
|
|
811
853
|
* windowed leading-edge batching, trading first-chunk latency for larger
|
|
@@ -830,7 +872,7 @@ const getEnvStreamFlushIntervalMs = () => {
|
|
|
830
872
|
* span's duration is therefore the app-perceived latency of the batch
|
|
831
873
|
* (buffer dwell + backpressure + RPC); `buffer_dwell_ms` isolates the
|
|
832
874
|
* pre-dispatch share so client-side batching cost can be told apart from
|
|
833
|
-
* network/server time. Named `workflow.stream.flush
|
|
875
|
+
* network/server time. Named `workflow.stream.flush`; the per-request RPC
|
|
834
876
|
* beneath it is world-vercel's `workflow.stream.write` span (chunk_rtt), and
|
|
835
877
|
* the two must stay distinguishable. Fire-and-forget; no-op without OTEL.
|
|
836
878
|
*/
|
|
@@ -900,7 +942,7 @@ export class WorkflowServerWritableStream extends WritableStream {
|
|
|
900
942
|
await pendingRunReady;
|
|
901
943
|
}
|
|
902
944
|
catch {
|
|
903
|
-
// intentional: ordering barrier only
|
|
945
|
+
// intentional: ordering barrier only, see above.
|
|
904
946
|
}
|
|
905
947
|
pendingRunReady = undefined;
|
|
906
948
|
}
|
|
@@ -908,7 +950,7 @@ export class WorkflowServerWritableStream extends WritableStream {
|
|
|
908
950
|
// ------------------------------------------------------------------
|
|
909
951
|
// Group-commit buffering.
|
|
910
952
|
//
|
|
911
|
-
// `write()` resolves as soon as the chunk enters this bounded buffer
|
|
953
|
+
// `write()` resolves as soon as the chunk enters this bounded buffer,
|
|
912
954
|
// NOT when it is durable. That is the property that makes batching
|
|
913
955
|
// path-independent: a native `readable.pipeTo(serverWritable)` pulls the
|
|
914
956
|
// next chunk the moment `write()` resolves, so chunks accumulate here
|
|
@@ -922,7 +964,7 @@ export class WorkflowServerWritableStream extends WritableStream {
|
|
|
922
964
|
// {@link STREAM_DRAIN_SYMBOL}) resolves only when the buffer is empty
|
|
923
965
|
// and no request is in flight. `close()` awaits it before closing the
|
|
924
966
|
// server stream, and the flushable-stream lock-release completion
|
|
925
|
-
// awaits it before letting a step finish
|
|
967
|
+
// awaits it before letting a step finish, so "step completed" still
|
|
926
968
|
// implies "stream data durable", exactly as before.
|
|
927
969
|
//
|
|
928
970
|
// Encryption/decryption is handled at the framing level by
|
|
@@ -932,8 +974,8 @@ export class WorkflowServerWritableStream extends WritableStream {
|
|
|
932
974
|
let bufferBytes = 0;
|
|
933
975
|
// The group currently inside a server request. Counted against the
|
|
934
976
|
// buffer bound so `WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS` keeps its
|
|
935
|
-
// documented meaning
|
|
936
|
-
// chunks
|
|
977
|
+
// documented meaning (an upper bound across ALL read-but-not-durable
|
|
978
|
+
// chunks), not just the queued follow-up group.
|
|
937
979
|
let inFlightChunks = 0;
|
|
938
980
|
let inFlightBytes = 0;
|
|
939
981
|
let flushTimer = null;
|
|
@@ -944,13 +986,13 @@ export class WorkflowServerWritableStream extends WritableStream {
|
|
|
944
986
|
* (retained, exactly as the previous implementation retained its buffer)
|
|
945
987
|
* and every subsequent `write()`, `close()` and `drain()` rejects with
|
|
946
988
|
* the original error. Chunks whose `write()` already resolved surface
|
|
947
|
-
* their failure at the durability barrier
|
|
989
|
+
* their failure at the durability barrier: that is the contract of an
|
|
948
990
|
* early-ack sink.
|
|
949
991
|
*/
|
|
950
992
|
let sinkError;
|
|
951
993
|
// Group-commit window. The env var, when set, overrides the World
|
|
952
|
-
// option; otherwise `world.streamFlushIntervalMs` governs (default 0)
|
|
953
|
-
// including the
|
|
994
|
+
// option; otherwise `world.streamFlushIntervalMs` governs (default 0),
|
|
995
|
+
// including the first chunk. When it must come from the world,
|
|
954
996
|
// `scheduleGroupCommit` waits for `worldPromise` before deciding, which
|
|
955
997
|
// costs nothing: no request can leave before `sendGroup`'s own world
|
|
956
998
|
// await either.
|
|
@@ -1003,7 +1045,7 @@ export class WorkflowServerWritableStream extends WritableStream {
|
|
|
1003
1045
|
* Dispatch loop: while chunks are buffered, send them group by group.
|
|
1004
1046
|
* Exactly one loop runs at a time (`inFlight`), so groups reach the
|
|
1005
1047
|
* server in write order. Chunks that arrive while a group's request is
|
|
1006
|
-
* in flight accumulate and form the next group
|
|
1048
|
+
* in flight accumulate and form the next group: the group-commit
|
|
1007
1049
|
* behavior, now independent of how the producer pipes.
|
|
1008
1050
|
*/
|
|
1009
1051
|
/**
|
|
@@ -1100,18 +1142,18 @@ export class WorkflowServerWritableStream extends WritableStream {
|
|
|
1100
1142
|
/**
|
|
1101
1143
|
* Leading-edge dispatch policy for an idle sink:
|
|
1102
1144
|
* - window <= 0 (the default): dispatch the leading chunk immediately.
|
|
1103
|
-
* Fast producers still batch via in-flight accumulation
|
|
1145
|
+
* Fast producers still batch via in-flight accumulation: chunks
|
|
1104
1146
|
* arriving during the request form the next group. The trade for an
|
|
1105
1147
|
* idle burst is one extra request (a 30-chunk burst ships as 1 + 29
|
|
1106
1148
|
* instead of one 30-chunk group under a positive window) in exchange
|
|
1107
|
-
* for zero fixed first-chunk delay
|
|
1149
|
+
* for zero fixed first-chunk delay, which matches measured producer
|
|
1108
1150
|
* behavior, where isolated chunks dominate.
|
|
1109
1151
|
* - window > 0 (explicitly configured): arm the group-commit timer so
|
|
1110
|
-
* the leading chunk waits up to the window collecting a group
|
|
1152
|
+
* the leading chunk waits up to the window collecting a group,
|
|
1111
1153
|
* the opt-in trade for slow-but-steady producers.
|
|
1112
1154
|
* Window resolution: `WORKFLOW_STREAM_FLUSH_INTERVAL_MS`, when set,
|
|
1113
1155
|
* overrides `world.streamFlushIntervalMs`; otherwise the World option
|
|
1114
|
-
* (default 0) governs
|
|
1156
|
+
* (default 0) governs, including the first chunk. Deciding may
|
|
1115
1157
|
* have to wait for the world to resolve; that adds no latency because
|
|
1116
1158
|
* `sendGroup` awaits the same promise before any request leaves.
|
|
1117
1159
|
*/
|
|
@@ -1185,8 +1227,8 @@ export class WorkflowServerWritableStream extends WritableStream {
|
|
|
1185
1227
|
scheduleGroupCommit();
|
|
1186
1228
|
}
|
|
1187
1229
|
// Bounded buffer: accept the chunk (never drop), then block until
|
|
1188
|
-
// the read-but-not-durable population
|
|
1189
|
-
// request
|
|
1230
|
+
// the read-but-not-durable population (buffered AND in the active
|
|
1231
|
+
// request) is back under the bound. Each durably-sent group
|
|
1190
1232
|
// relieves this.
|
|
1191
1233
|
while (sinkError === undefined &&
|
|
1192
1234
|
(buffer.length + inFlightChunks >= maxBufferedChunks ||
|
|
@@ -1201,11 +1243,11 @@ export class WorkflowServerWritableStream extends WritableStream {
|
|
|
1201
1243
|
},
|
|
1202
1244
|
async close() {
|
|
1203
1245
|
// Everything accepted must be durable before the server stream is
|
|
1204
|
-
// closed
|
|
1246
|
+
// closed: the server fences post-close writes.
|
|
1205
1247
|
await drain();
|
|
1206
1248
|
// A close with an empty buffer skips the dispatch path (and its
|
|
1207
1249
|
// barrier), but can itself be the first write to a brand-new
|
|
1208
|
-
// stream
|
|
1250
|
+
// stream, so gate it too.
|
|
1209
1251
|
await ensureRunReady();
|
|
1210
1252
|
const world = await worldPromise;
|
|
1211
1253
|
const closeStart = Date.now();
|
|
@@ -1215,14 +1257,14 @@ export class WorkflowServerWritableStream extends WritableStream {
|
|
|
1215
1257
|
async abort(reason) {
|
|
1216
1258
|
// Buffered chunks were already ACKED to their writers (early-ack
|
|
1217
1259
|
// contract), and native pipeTo aborts this sink whenever its SOURCE
|
|
1218
|
-
// errors
|
|
1260
|
+
// errors, e.g. an AI stream that emits ten deltas and then throws.
|
|
1219
1261
|
// Discarding here would silently lose the accepted tail of the
|
|
1220
1262
|
// prefix, so deliver it first; only the server stream close is
|
|
1221
1263
|
// skipped. A dispatch failure during this drain is already sticky
|
|
1222
1264
|
// and surfaces through the sink's error paths.
|
|
1223
1265
|
//
|
|
1224
1266
|
// Deliberately un-timeboxed (unlike the step-executor's 500ms
|
|
1225
|
-
// inline flush): giving up early would drop acked chunks
|
|
1267
|
+
// inline flush): giving up early would drop acked chunks, the
|
|
1226
1268
|
// exact loss this path exists to prevent. It is still bounded in
|
|
1227
1269
|
// practice by the World transport's own timeout/retry budget: a
|
|
1228
1270
|
// stalled write ends in a terminal rejection after finite retries,
|
|
@@ -1294,9 +1336,9 @@ function getAllBaseReducers(global = globalThis) {
|
|
|
1294
1336
|
data.responseWritable = responseWritable;
|
|
1295
1337
|
}
|
|
1296
1338
|
// Forward the signal in two cases:
|
|
1297
|
-
// 1. Already aborted
|
|
1339
|
+
// 1. Already aborted: preserve aborted=true/reason so the hydrated
|
|
1298
1340
|
// step sees the cancellation that happened before serialize.
|
|
1299
|
-
// 2. Already tagged with workflow infrastructure
|
|
1341
|
+
// 2. Already tagged with workflow infrastructure, i.e. a signal
|
|
1300
1342
|
// from a workflow-managed AbortController, which has stream/hook
|
|
1301
1343
|
// backing for cross-boundary propagation.
|
|
1302
1344
|
// Plain non-aborted native signals are intentionally dropped (would
|
|
@@ -1346,7 +1388,7 @@ function reduceAbortWithListener(signal, holder, global, ops, runId, cryptoKey)
|
|
|
1346
1388
|
holder.signal[ABORT_HOOK_TOKEN] = hookToken;
|
|
1347
1389
|
}
|
|
1348
1390
|
}
|
|
1349
|
-
// Deduped via ABORT_LISTENER_ATTACHED marker
|
|
1391
|
+
// Deduped via ABORT_LISTENER_ATTACHED marker: see attachAbortListenerOnce.
|
|
1350
1392
|
attachAbortListenerOnce(signal, streamName, runId, cryptoKey, ops);
|
|
1351
1393
|
return {
|
|
1352
1394
|
streamName,
|
|
@@ -1376,7 +1418,7 @@ function reduceAbortBySymbol(signal, holder) {
|
|
|
1376
1418
|
* Attach a single abort listener to a signal, deduped across calls.
|
|
1377
1419
|
*
|
|
1378
1420
|
* Each serialization pass goes through the reducer, but a controller passed
|
|
1379
|
-
* to N steps would otherwise accumulate N listeners
|
|
1421
|
+
* to N steps would otherwise accumulate N listeners, each writing the same
|
|
1380
1422
|
* stream packet and double-closing the stream on abort. The marker symbol
|
|
1381
1423
|
* ensures the stream-write side-effect runs at most once per (signal, runId).
|
|
1382
1424
|
*/
|
|
@@ -1418,7 +1460,7 @@ function attachAbortListenerOnce(signal, streamName, runId, cryptoKey, ops) {
|
|
|
1418
1460
|
* @param framedByteStreams - When `true`, byte streams (`type: 'bytes'`)
|
|
1419
1461
|
* are wrapped in length-prefixed frames on the wire so the consumer
|
|
1420
1462
|
* can reconnect on transient errors. Should match the target run's
|
|
1421
|
-
* capability
|
|
1463
|
+
* capability: see `getRunCapabilities` in `capabilities.ts`. Defaults
|
|
1422
1464
|
* to `false` for backwards compatibility with older runs.
|
|
1423
1465
|
* @returns
|
|
1424
1466
|
*/
|
|
@@ -1474,7 +1516,7 @@ runReadyBarrier) {
|
|
|
1474
1516
|
// The receiving run's step-side reviver opens a server writable
|
|
1475
1517
|
// against the original `(runId, name)` and resolves that run's
|
|
1476
1518
|
// encryption key directly, so writes land on the original stream
|
|
1477
|
-
// for the full lifetime of the receiving run
|
|
1519
|
+
// for the full lifetime of the receiving run, with no in-process
|
|
1478
1520
|
// bridge tied to the dehydrating step's lifetime.
|
|
1479
1521
|
const existingName = value[STREAM_NAME_SYMBOL];
|
|
1480
1522
|
const existingRunId = value[STREAM_SERVER_RUN_ID_SYMBOL];
|
|
@@ -1541,9 +1583,9 @@ runReadyBarrier) {
|
|
|
1541
1583
|
function getHostClassPrototype(global, name) {
|
|
1542
1584
|
// Descriptor reads (`readProperty`), not bare gets: an accessor or Proxy
|
|
1543
1585
|
// planted on the sandbox global (or the constructor) must be recorded in
|
|
1544
|
-
// the guest-code sink
|
|
1586
|
+
// the guest-code sink (it gates VM retention), not silently executed.
|
|
1545
1587
|
// Callers wrap this in `once(...)` per reducer set, so the read happens
|
|
1546
|
-
// exactly once per serialize pass, on the first guard invocation
|
|
1588
|
+
// exactly once per serialize pass, on the first guard invocation, inside
|
|
1547
1589
|
// the pass's sink scope, never per value.
|
|
1548
1590
|
const ctor = readProperty(global, name) ?? readProperty(globalThis, name);
|
|
1549
1591
|
if (typeof ctor !== 'function')
|
|
@@ -1558,13 +1600,13 @@ export function getWorkflowReducers(global = globalThis) {
|
|
|
1558
1600
|
return {
|
|
1559
1601
|
...getAllBaseReducers(global),
|
|
1560
1602
|
// Readable/Writable streams from within the workflow execution environment
|
|
1561
|
-
// are
|
|
1603
|
+
// are "handles" that can be passed around to other steps.
|
|
1562
1604
|
ReadableStream: (value) => {
|
|
1563
1605
|
// Walk the prototype chain instead of `instanceof global.ReadableStream`:
|
|
1564
1606
|
// the class is host-provided (injected into the sandbox), so its
|
|
1565
1607
|
// prototype is in the chain of both real streams and the
|
|
1566
1608
|
// `Object.create(ReadableStream.prototype)` handles used for request
|
|
1567
|
-
// bodies
|
|
1609
|
+
// bodies, but a chain walk never consults `Symbol.hasInstance`, which
|
|
1568
1610
|
// the sandbox can define and which ran for every value the earlier
|
|
1569
1611
|
// reducers did not claim. Reads below go through descriptors so a
|
|
1570
1612
|
// getter on a step argument cannot run unreported.
|
|
@@ -1615,7 +1657,7 @@ export function getWorkflowReducers(global = globalThis) {
|
|
|
1615
1657
|
}
|
|
1616
1658
|
return s;
|
|
1617
1659
|
},
|
|
1618
|
-
// AbortController/AbortSignal in workflow context
|
|
1660
|
+
// AbortController/AbortSignal in workflow context: read only symbols (handles).
|
|
1619
1661
|
// In the workflow VM, global.AbortController is a class but global.AbortSignal
|
|
1620
1662
|
// is a plain object (not a class), so instanceof checks won't work for signals.
|
|
1621
1663
|
// Detect instances by the presence of the ABORT_STREAM_NAME symbol instead.
|
|
@@ -1629,7 +1671,7 @@ export function getWorkflowReducers(global = globalThis) {
|
|
|
1629
1671
|
const ownSymbol = readProperty(value, ABORT_STREAM_NAME);
|
|
1630
1672
|
const isNativeAbortController = isInstanceOfPrototype(value, abortControllerPrototype.value);
|
|
1631
1673
|
if (ownSymbol === undefined && !isNativeAbortController) {
|
|
1632
|
-
// Not ours and not a native controller
|
|
1674
|
+
// Not ours and not a native controller, but a foreign controller
|
|
1633
1675
|
// may still carry the symbol on its signal.
|
|
1634
1676
|
const maybeSignal = readProperty(value, 'signal');
|
|
1635
1677
|
if (maybeSignal === null ||
|
|
@@ -1681,7 +1723,7 @@ runReadyBarrier) {
|
|
|
1681
1723
|
});
|
|
1682
1724
|
}
|
|
1683
1725
|
// Check if the stream already has the name symbol set, in which case
|
|
1684
|
-
// it's already being sunk to the server and we can
|
|
1726
|
+
// it's already being sunk to the server and we can return the
|
|
1685
1727
|
// name and type.
|
|
1686
1728
|
let name = value[STREAM_NAME_SYMBOL];
|
|
1687
1729
|
let type = value[STREAM_TYPE_SYMBOL];
|
|
@@ -1689,7 +1731,7 @@ runReadyBarrier) {
|
|
|
1689
1731
|
// handle from a previous step (see `getWorkflowRevivers`). When
|
|
1690
1732
|
// present we must propagate the same framing choice on the way
|
|
1691
1733
|
// back out, since the bytes already on the server's stream are in
|
|
1692
|
-
// that format
|
|
1734
|
+
// that format; switching format mid-stream would corrupt them.
|
|
1693
1735
|
let framing = value[STREAM_FRAMING_SYMBOL];
|
|
1694
1736
|
if (!name) {
|
|
1695
1737
|
const streamId = (global[STABLE_ULID] || defaultUlid)();
|
|
@@ -1838,7 +1880,7 @@ function setupAbortStreamReader(controller, runId, streamName, ops) {
|
|
|
1838
1880
|
]);
|
|
1839
1881
|
if (result.value && !result.done) {
|
|
1840
1882
|
// An abort packet arrived: propagate it as fast as possible. Release
|
|
1841
|
-
// the lock (synchronous) rather than cancelling here
|
|
1883
|
+
// the lock (synchronous) rather than cancelling here: on a
|
|
1842
1884
|
// service-backed World `reader.cancel()` can do a network round-trip,
|
|
1843
1885
|
// and awaiting it before `controller.abort()` would delay (or, if it
|
|
1844
1886
|
// hangs, drop) real-time abort delivery to the in-flight step.
|
|
@@ -1851,7 +1893,7 @@ function setupAbortStreamReader(controller, runId, streamName, ops) {
|
|
|
1851
1893
|
try {
|
|
1852
1894
|
// Hydrate via the same machinery the writer used so the reason
|
|
1853
1895
|
// round-trips with full type fidelity. Encryption key (if any)
|
|
1854
|
-
// comes from the step context
|
|
1896
|
+
// comes from the step context, set up by the step executor before
|
|
1855
1897
|
// this reader runs. Fallback to undefined for external-context
|
|
1856
1898
|
// revives (the hydrate path is encryption-key-tolerant).
|
|
1857
1899
|
const ctxForKey = contextStorage.getStore();
|
|
@@ -1864,7 +1906,7 @@ function setupAbortStreamReader(controller, runId, streamName, ops) {
|
|
|
1864
1906
|
}
|
|
1865
1907
|
else {
|
|
1866
1908
|
// The step finished (or the reader was cancelled) without an abort.
|
|
1867
|
-
// Cancel
|
|
1909
|
+
// Cancel (not just release) so the underlying World stream is torn
|
|
1868
1910
|
// down: a polling World (e.g. world-local) otherwise leaks a tail
|
|
1869
1911
|
// reader (a 100ms filesystem poll plus emitter listeners) per step
|
|
1870
1912
|
// invocation for the life of the process, since a signal-bearing step
|
|
@@ -1875,7 +1917,7 @@ function setupAbortStreamReader(controller, runId, streamName, ops) {
|
|
|
1875
1917
|
}
|
|
1876
1918
|
}
|
|
1877
1919
|
catch {
|
|
1878
|
-
// Stream read failed
|
|
1920
|
+
// Stream read failed: signal won't propagate in real-time,
|
|
1879
1921
|
// but hook-based propagation on next replay provides fallback
|
|
1880
1922
|
}
|
|
1881
1923
|
})());
|
|
@@ -1900,7 +1942,7 @@ function tagAbortPair(controller, value, readerCancel) {
|
|
|
1900
1942
|
/**
|
|
1901
1943
|
* Propagate abort-internal symbols from one signal to another. Used by the
|
|
1902
1944
|
* Request reviver because `new Request(url, { signal })` copies the signal
|
|
1903
|
-
* internally
|
|
1945
|
+
* internally: the constructed `request.signal` is a fresh AbortSignal that
|
|
1904
1946
|
* doesn't carry symbols from the source.
|
|
1905
1947
|
*/
|
|
1906
1948
|
function copyAbortInternals(src, dest) {
|
|
@@ -1951,7 +1993,7 @@ function reviveAbortController(value, ops, runId) {
|
|
|
1951
1993
|
// Dehydrate the abort payload through the same machinery the hook
|
|
1952
1994
|
// event uses so the `reason` round-trips with full type fidelity
|
|
1953
1995
|
// (DOMException, custom errors, etc.) and respects the run's
|
|
1954
|
-
// encryption key
|
|
1996
|
+
// encryption key, symmetric with what the suspension handler
|
|
1955
1997
|
// writes for workflow-initiated aborts.
|
|
1956
1998
|
const payload = await dehydrateStepArguments({ aborted: true, reason }, ctx.workflowMetadata.workflowRunId, ctx.encryptionKey);
|
|
1957
1999
|
const writable = new WorkflowServerWritableStream(ctx.workflowMetadata.workflowRunId, value.streamName);
|
|
@@ -1967,8 +2009,8 @@ function reviveAbortController(value, ops, runId) {
|
|
|
1967
2009
|
// The durable hook resume (which writes the `hook_received` event that
|
|
1968
2010
|
// records this abort in the workflow's event log) must be committed
|
|
1969
2011
|
// before the step completes. Otherwise the workflow continuation
|
|
1970
|
-
// enqueued by `step_completed` can advance past the abort
|
|
1971
|
-
// a later step with a stale, non-aborted `signal`
|
|
2012
|
+
// enqueued by `step_completed` can advance past the abort (dispatching
|
|
2013
|
+
// a later step with a stale, non-aborted `signal`) before the event
|
|
1972
2014
|
// exists. Route it to `preCompletionOps` (awaited inline before
|
|
1973
2015
|
// completion) rather than `ops` (best-effort, background). The stream
|
|
1974
2016
|
// write above stays in `ops`: it must fire ASAP to reach an in-flight
|
|
@@ -1985,7 +2027,7 @@ function reviveAbortController(value, ops, runId) {
|
|
|
1985
2027
|
});
|
|
1986
2028
|
}
|
|
1987
2029
|
catch {
|
|
1988
|
-
// Best-effort hook resume
|
|
2030
|
+
// Best-effort hook resume: retry on next replay
|
|
1989
2031
|
}
|
|
1990
2032
|
})();
|
|
1991
2033
|
ctx.preCompletionOps.push(hookResume);
|
|
@@ -1995,7 +2037,7 @@ function reviveAbortController(value, ops, runId) {
|
|
|
1995
2037
|
return controller;
|
|
1996
2038
|
}
|
|
1997
2039
|
/**
|
|
1998
|
-
* Revives
|
|
2040
|
+
* Revives only an AbortSignal without the patched abort() overhead.
|
|
1999
2041
|
* Used when only a signal (not a controller) was serialized.
|
|
2000
2042
|
*/
|
|
2001
2043
|
function reviveAbortSignal(value, ops, runId) {
|
|
@@ -2031,17 +2073,17 @@ export function getCommonRevivers(global = globalThis) {
|
|
|
2031
2073
|
*
|
|
2032
2074
|
* Three tiers, cheapest first:
|
|
2033
2075
|
*
|
|
2034
|
-
* 1. The descriptor carries the owner's X25519 public key
|
|
2076
|
+
* 1. The descriptor carries the owner's X25519 public key: seal to it with
|
|
2035
2077
|
* no I/O whatsoever. The owner published the key when it created the
|
|
2036
2078
|
* stream, so this is the zero-round-trip path.
|
|
2037
|
-
* 2. The descriptor carries the owner's deployment ID
|
|
2079
|
+
* 2. The descriptor carries the owner's deployment ID: resolve the owner's
|
|
2038
2080
|
* symmetric key, which cross-deployment means a key-API round trip.
|
|
2039
|
-
* 3. Neither (descriptors written by older SDKs)
|
|
2081
|
+
* 3. Neither (descriptors written by older SDKs): load the owning run first,
|
|
2040
2082
|
* then resolve its symmetric key.
|
|
2041
2083
|
*
|
|
2042
2084
|
* Tiers 2 and 3 import the key encrypt-only, which is an honor-system
|
|
2043
2085
|
* restriction: the same bytes could decrypt. Tier 1 makes it a cryptographic
|
|
2044
|
-
* guarantee
|
|
2086
|
+
* guarantee: a public key cannot read anything.
|
|
2045
2087
|
*/
|
|
2046
2088
|
async function getForwardedWritableEncryptionKey(runId, deploymentId, encryptionPublicKey) {
|
|
2047
2089
|
const ownerPublicKey = decodeRunPublicKey(encryptionPublicKey);
|
|
@@ -2116,7 +2158,7 @@ export function getExternalRevivers(global = globalThis, ops, runId, cryptoKey)
|
|
|
2116
2158
|
// For byte streams, use flushable pipe with lock polling.
|
|
2117
2159
|
// If the producer wrote framed bytes (framing === 'framed-v1'),
|
|
2118
2160
|
// unwrap the length-prefix envelope before handing chunks to
|
|
2119
|
-
// the user. Absent / 'raw' framing means legacy raw bytes
|
|
2161
|
+
// the user. Absent / 'raw' framing means legacy raw bytes:
|
|
2120
2162
|
// pipe through unchanged for backwards compatibility.
|
|
2121
2163
|
//
|
|
2122
2164
|
// No auto-reconnect here yet: raw byte streams have no wire
|
|
@@ -2156,7 +2198,7 @@ export function getExternalRevivers(global = globalThis, ops, runId, cryptoKey)
|
|
|
2156
2198
|
}
|
|
2157
2199
|
},
|
|
2158
2200
|
WritableStream: (value) => {
|
|
2159
|
-
// Same handling as `getStepRevivers.WritableStream
|
|
2201
|
+
// Same handling as `getStepRevivers.WritableStream`: see comments
|
|
2160
2202
|
// there for the cross-run case (writable carries `runId` from
|
|
2161
2203
|
// parent → child forwarding via `start()`).
|
|
2162
2204
|
const targetRunId = typeof value.runId === 'string' ? value.runId : runId;
|
|
@@ -2230,7 +2272,7 @@ export function getWorkflowRevivers(global = globalThis) {
|
|
|
2230
2272
|
}
|
|
2231
2273
|
return value;
|
|
2232
2274
|
},
|
|
2233
|
-
// Workflow function reviver for workflow context
|
|
2275
|
+
// Workflow function reviver for workflow context: returns a function-like
|
|
2234
2276
|
// object with .workflowId that mimics what the SWC compiler produces,
|
|
2235
2277
|
WorkflowFunction: (value) => Object.assign(() => {
|
|
2236
2278
|
throw new SerializationError('Workflow functions cannot be called directly. Use start() to invoke them.', {
|
|
@@ -2266,7 +2308,7 @@ export function getWorkflowRevivers(global = globalThis) {
|
|
|
2266
2308
|
// that when the handle is later passed to a step (which reads
|
|
2267
2309
|
// the actual bytes from the server) we know whether to unframe.
|
|
2268
2310
|
// Defaults to undefined for streams whose serialized ref didn't
|
|
2269
|
-
// carry the field
|
|
2311
|
+
// carry the field; those are treated as legacy raw bytes.
|
|
2270
2312
|
[STREAM_FRAMING_SYMBOL]: {
|
|
2271
2313
|
value: value.framing,
|
|
2272
2314
|
writable: false,
|
|
@@ -2298,7 +2340,7 @@ export function getWorkflowRevivers(global = globalThis) {
|
|
|
2298
2340
|
// Preserve the owner's public key for the same reason as the runId
|
|
2299
2341
|
// above. Without it, forwarding a writable through a workflow to a step
|
|
2300
2342
|
// silently drops the key, and the step falls back to fetching the
|
|
2301
|
-
// owner's symmetric key
|
|
2343
|
+
// owner's symmetric key, the round trip sealing exists to remove.
|
|
2302
2344
|
if (typeof value.encryptionPublicKey === 'string') {
|
|
2303
2345
|
descriptor[STREAM_SERVER_PUBLIC_KEY_SYMBOL] = {
|
|
2304
2346
|
value: value.encryptionPublicKey,
|
|
@@ -2310,9 +2352,9 @@ export function getWorkflowRevivers(global = globalThis) {
|
|
|
2310
2352
|
// AbortController/AbortSignal revived inside the workflow VM. Use the
|
|
2311
2353
|
// real WorkflowAbortSignal class so addEventListener('abort', fn) actually
|
|
2312
2354
|
// fires when the signal aborts (the previous no-op stub silently dropped
|
|
2313
|
-
// listener registrations
|
|
2355
|
+
// listener registrations, a silent correctness bug for natural patterns
|
|
2314
2356
|
// like `signal.addEventListener('abort', fn)` after receiving a deserialized
|
|
2315
|
-
// signal). The signal does not own a hook subscription here
|
|
2357
|
+
// signal). The signal does not own a hook subscription here; abort state
|
|
2316
2358
|
// is delivered via the existing replay machinery on the source side.
|
|
2317
2359
|
AbortController: (value) => {
|
|
2318
2360
|
const signal = new WorkflowAbortSignal(value.streamName, value.hookToken);
|
|
@@ -2357,7 +2399,7 @@ function getStepRevivers(global = globalThis, ops, runId, cryptoKey, deploymentI
|
|
|
2357
2399
|
// arrow steps). The wrapper invokes the body via
|
|
2358
2400
|
// `stepFn.apply(boundThis, args)` so the body sees the same
|
|
2359
2401
|
// `this` it would have had in the workflow bundle. Property
|
|
2360
|
-
// presence
|
|
2402
|
+
// presence, not truthiness, is significant because
|
|
2361
2403
|
// `bind(null)` and `bind(undefined)` are both legal and should
|
|
2362
2404
|
// round-trip faithfully.
|
|
2363
2405
|
// - `boundArgs`: prefilled args from
|
|
@@ -2463,7 +2505,7 @@ function getStepRevivers(global = globalThis, ops, runId, cryptoKey, deploymentI
|
|
|
2463
2505
|
// For byte streams, use flushable pipe with lock polling.
|
|
2464
2506
|
// If the producer wrote framed bytes (framing === 'framed-v1'),
|
|
2465
2507
|
// unwrap the length-prefix envelope before handing chunks to
|
|
2466
|
-
// the user step. Absent / 'raw' framing means legacy raw bytes
|
|
2508
|
+
// the user step. Absent / 'raw' framing means legacy raw bytes:
|
|
2467
2509
|
// pipe through unchanged for backwards compatibility.
|
|
2468
2510
|
const state = createFlushableState();
|
|
2469
2511
|
ops.push(state.promise);
|
|
@@ -2500,11 +2542,11 @@ function getStepRevivers(global = globalThis, ops, runId, cryptoKey, deploymentI
|
|
|
2500
2542
|
// carries the original `runId` and `name`. Open a server writable
|
|
2501
2543
|
// against the original `(runId, name)` and resolve THAT run's key
|
|
2502
2544
|
// for encryption. The resolution is async but doesn't need to
|
|
2503
|
-
// block reviver return
|
|
2545
|
+
// block reviver return: `getSerializeStream` accepts the
|
|
2504
2546
|
// `Promise<CryptoKey | undefined>` directly and awaits it lazily
|
|
2505
2547
|
// on the first chunk written. The key is imported encrypt-only
|
|
2506
2548
|
// so the receiving run can never decrypt anything else on the
|
|
2507
|
-
// owning run's stream
|
|
2549
|
+
// owning run's stream; it can only contribute new writes.
|
|
2508
2550
|
const targetRunId = typeof value.runId === 'string' ? value.runId : runId;
|
|
2509
2551
|
const targetDeploymentId = typeof value.deploymentId === 'string'
|
|
2510
2552
|
? value.deploymentId
|
|
@@ -2527,8 +2569,8 @@ function getStepRevivers(global = globalThis, ops, runId, cryptoKey, deploymentI
|
|
|
2527
2569
|
pollWritableLock(serialize.writable, state);
|
|
2528
2570
|
// Record the underlying `(runId, name)` so downstream reducers can
|
|
2529
2571
|
// recognize that this writable is already backed by a workflow
|
|
2530
|
-
// server stream. When forwarded across `start()` again
|
|
2531
|
-
// the child passes this writable on to a grandchild
|
|
2572
|
+
// server stream. When forwarded across `start()` again (e.g.
|
|
2573
|
+
// the child passes this writable on to a grandchild), the
|
|
2532
2574
|
// external reducer needs both to emit the original `runId` in
|
|
2533
2575
|
// the descriptor.
|
|
2534
2576
|
Object.defineProperty(serialize.writable, STREAM_NAME_SYMBOL, {
|
|
@@ -2550,17 +2592,17 @@ function getStepRevivers(global = globalThis, ops, runId, cryptoKey, deploymentI
|
|
|
2550
2592
|
//
|
|
2551
2593
|
// When the descriptor carries no key and the stream belongs to THIS run,
|
|
2552
2594
|
// derive it. A writable taken with `getWritable()` in a workflow body has
|
|
2553
|
-
// only a name on it
|
|
2595
|
+
// only a name on it (the workflow VM holds no key material by design),
|
|
2554
2596
|
// so nothing could publish the key when the handle was created. Reviving
|
|
2555
2597
|
// happens in a step, which does hold this run's key, and any later
|
|
2556
|
-
// forward then
|
|
2598
|
+
// forward then copies the symbol.
|
|
2557
2599
|
//
|
|
2558
2600
|
// It has to happen here rather than at serialization time: `start()`
|
|
2559
2601
|
// dehydrates its arguments with the CHILD's runId and the CHILD's key, so
|
|
2560
2602
|
// the owning run's key is no longer in scope by then.
|
|
2561
2603
|
//
|
|
2562
2604
|
// `targetRunId === runId` is the guard that matters. For a stream another
|
|
2563
|
-
// run owns we must not advertise our key
|
|
2605
|
+
// run owns we must not advertise our key: the receiver would seal to us
|
|
2564
2606
|
// and the real owner could never open what it wrote.
|
|
2565
2607
|
if (typeof value.encryptionPublicKey !== 'string' &&
|
|
2566
2608
|
targetRunId === runId &&
|
|
@@ -2668,7 +2710,7 @@ export function deserializePreparedStepError(prepared, global = globalThis, extr
|
|
|
2668
2710
|
* @param global - Global object for serialization context
|
|
2669
2711
|
* @param v1Compat - Enable legacy v1 compatibility mode
|
|
2670
2712
|
* @param framedByteStreams - Whether the target run can decode wire-framed
|
|
2671
|
-
* byte streams. Should match the target deployment's capability
|
|
2713
|
+
* byte streams. Should match the target deployment's capability: see
|
|
2672
2714
|
* `getRunCapabilities` in `capabilities.ts`. Defaults to `false` for
|
|
2673
2715
|
* backwards compatibility with older runs.
|
|
2674
2716
|
* @returns The dehydrated value as binary data (Uint8Array) with format prefix
|
|
@@ -2821,7 +2863,7 @@ export async function hydrateStepArguments(value, runId, key, ops = [], global =
|
|
|
2821
2863
|
* @param global - Global object for serialization context
|
|
2822
2864
|
* @param v1Compat - Enable legacy v1 compatibility mode
|
|
2823
2865
|
* @param framedByteStreams - Whether the target run can decode wire-framed
|
|
2824
|
-
* byte streams. Should match the target deployment's capability
|
|
2866
|
+
* byte streams. Should match the target deployment's capability: see
|
|
2825
2867
|
* `getRunCapabilities` in `capabilities.ts`. Defaults to `false` for
|
|
2826
2868
|
* backwards compatibility with older runs.
|
|
2827
2869
|
* @returns The dehydrated value as binary data (Uint8Array) with format prefix
|
|
@@ -2873,7 +2915,7 @@ export async function dehydrateStepError(value, runId, key, ops = [], global = g
|
|
|
2873
2915
|
const str = stringify(value, getStepReducers(global, ops, runId, key));
|
|
2874
2916
|
const payload = new TextEncoder().encode(str);
|
|
2875
2917
|
const serialized = encodeWithFormatPrefix(SerializationFormat.DEVALUE_V1, payload);
|
|
2876
|
-
// Compress before encrypting
|
|
2918
|
+
// Compress before encrypting: encrypted bytes don't compress.
|
|
2877
2919
|
const compressionStats = {};
|
|
2878
2920
|
const compressed = await compress(serialized, compression, compressionStats);
|
|
2879
2921
|
const encrypted = (await maybeEncrypt(compressed, key));
|
|
@@ -2918,7 +2960,7 @@ export async function dehydrateRunError(value, _runId, key, global = globalThis,
|
|
|
2918
2960
|
const str = stringify(value, getWorkflowReducers(global));
|
|
2919
2961
|
const payload = new TextEncoder().encode(str);
|
|
2920
2962
|
const serialized = encodeWithFormatPrefix(SerializationFormat.DEVALUE_V1, payload);
|
|
2921
|
-
// Compress before encrypting
|
|
2963
|
+
// Compress before encrypting: encrypted bytes don't compress.
|
|
2922
2964
|
const compressionStats = {};
|
|
2923
2965
|
const compressed = await compress(serialized, compression, compressionStats);
|
|
2924
2966
|
const encrypted = (await maybeEncrypt(compressed, key));
|
|
@@ -3021,4 +3063,4 @@ function getStreamAndRequestRevivers(allRevivers) {
|
|
|
3021
3063
|
}
|
|
3022
3064
|
return extra;
|
|
3023
3065
|
}
|
|
3024
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixvQkFBb0IsR0FDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQywyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw0REFBNEQ7QUFDNUQsc0VBQXNFO0FBQ3RFLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLGtCQUFrQixHQUNuQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxZQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUVMLFFBQVEsRUFDUixVQUFVLEdBQ1gsTUFBTSxnQ0FBZ0MsQ0FB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LENBQUM7WUFDdkIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQ2xDLFdBQWdDO0lBRWhDLE1BQU0sS0FBSyxHQUF3QyxFQUFFLENBQUM7SUFDdEQsS0FBSyxNQUFNLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQzFDLElBQUksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBSdW50aW1lRGVjcnlwdGlvbkVycm9yLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIFN0cmVhbUV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgb25jZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcGFyc2UsIHN0cmluZ2lmeSwgdW5mbGF0dGVuIH0gZnJvbSAnZGV2YWx1ZSc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmx1c2hhYmxlU3RhdGUsXG4gIGZsdXNoYWJsZVBpcGUsXG4gIGdldE1heEJ1ZmZlcmVkQnl0ZXMsXG4gIGdldE1heEJ5dGVzUGVyQmF0Y2gsXG4gIGdldE1heENodW5rc1BlckJhdGNoLFxuICBnZXRNYXhJbmZsaWdodENodW5rcyxcbiAgcG9sbFJlYWRhYmxlTG9jayxcbiAgcG9sbFdyaXRhYmxlTG9jayxcbn0gZnJvbSAnLi9mbHVzaGFibGUtc3RyZWFtLmpzJztcbmltcG9ydCB7IGdldFN0ZXBGdW5jdGlvbiB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG4vLyBWMjogdXNlIGdldFdvcmxkTGF6eSBpbiBzdGVwLXNpZGUgY29kZSBwYXRocyBzbyBUdXJib3BhY2sgY2FuIHN0YXRpY2FsbHlcbi8vIHJlc29sdmUgdGhlIHdvcmxkIGJyaWRnZSBmcm9tIHRoZSBzdGVwIGJ1bmRsZSB3aXRob3V0IGRyYWdnaW5nIHRoZSBmdWxsXG4vLyB3b3JsZC50cyBtb2R1bGUgKGFuZCBpdHMgZHluYW1pYy1pbXBvcnQgYmVoYXZpb3VyKSBpbnRvIHRoZSBmbG93IHJvdXRlLlxuLy8gU2VlIGBwYWNrYWdlcy9jb3JlL3NyYy9ydW50aW1lL2dldC13b3JsZC1sYXp5LnRzYCBhbmQgdGhlXG4vLyBcIlR1cmJvcGFjayBORlQgVHJhY2luZyBFcnJvcnMgaW4gVjIgQ29tYmluZWQgRmxvdyBSb3V0ZVwiIHNlY3Rpb24gb2Zcbi8vIGBkb2NzL2NvbnRlbnQvZG9jcy9jaGFuZ2Vsb2cvZWFnZXItcHJvY2Vzc2luZy5tZHhgLlxuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIGJ5dGVzVG9CYXNlNjQsXG4gIGNyZWF0ZU9wZW5TZXNzaW9uLFxuICBjcmVhdGVTZWFsU2Vzc2lvbixcbiAgZGVjb2RlUnVuUHVibGljS2V5LFxufSBmcm9tICcuL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0ICogYXMgY2xpZW50TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9jbGllbnQuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBDb21wcmVzc2lvblN0YXRzLFxuICBjb21wcmVzcyxcbiAgZGVjb21wcmVzcyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB7XG4gIGFlc0tleU9mLFxuICBkZWNyeXB0LFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGVuY3J5cHQsXG4gIGlzUnVuUGF5bG9hZEtleXMsXG4gIGlzU2VhbFRhcmdldCxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxuICByZXNvbHZlRW5jcnlwdGlvbktleSxcbiAgcnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgU2VhbFRhcmdldCxcbiAgc2VhbFRvLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IsXG4gIHJldGhyb3dJZlJ1bnRpbWVFcnJvcixcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2Vycm9ycy5qcyc7XG5pbXBvcnQge1xuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGlzRW5jcnlwdGVkLFxuICBwZWVrRm9ybWF0UHJlZml4LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZm9ybWF0LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgR3Vlc3RDb2RlU3RhdHMsXG4gIGlzSW5zdGFuY2VPZlByb3RvdHlwZSxcbiAgcmVhZFByb3BlcnR5LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vaGFyZGVuZWQuanMnO1xuaW1wb3J0IHtcbiAgZ2V0Q2xhc3NSZWR1Y2VycyxcbiAgZ2V0Q2xhc3NSZXZpdmVycyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NsYXNzLmpzJztcbmltcG9ydCB7XG4gIGdldENvbW1vblJlZHVjZXJzLFxuICBnZXRDb21tb25SZXZpdmVycyBhcyBnZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUsXG4gIHJldml2ZSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NvbW1vbi5qcyc7XG5pbXBvcnQge1xuICBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyLFxuICBnZXRTdGVwRnVuY3Rpb25SZXZpdmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBzdGVwTW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9zdGVwLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybWF0UHJlZml4LFxuICBpc0Zvcm1hdFByZWZpeCxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcbmltcG9ydCAqIGFzIHdvcmtmbG93TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0IHtcbiAgQUJPUlRfSE9PS19UT0tFTixcbiAgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQsXG4gIEFCT1JUX1JFQURFUl9DQU5DRUwsXG4gIEFCT1JUX1NUUkVBTV9OQU1FLFxuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgU1RSRUFNX0RSQUlOX1NZTUJPTCxcbiAgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MLFxuICBTVFJFQU1fTkFNRV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCxcbiAgU1RSRUFNX1RZUEVfU1lNQk9MLFxuICBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFLFxufSBmcm9tICcuL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0ciBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVTcGFuLCBnZXRTcGFuS2luZCwgcmVjb3JkRWxhcHNlZFNwYW4gfSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRBYm9ydFN0cmVhbUlkIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IFdvcmtmbG93QWJvcnRTaWduYWwgfSBmcm9tICcuL3dvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyBmcm9tIHRoZSBtb2R1bGFyIHNlcmlhbGl6YXRpb24gbW9kdWxlc1xuLy8gc28gZXhpc3RpbmcgY29uc3VtZXJzIG9mIGBAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uYCBrZWVwIHdvcmtpbmcuXG5leHBvcnQge1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICB0eXBlIEZvcm1hdFByZWZpeCxcbiAgaXNGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGRlY29kZUZvcm1hdFByZWZpeCxcbiAgcGVla0Zvcm1hdFByZWZpeCxcbiAgaXNFbmNyeXB0ZWQsXG4gIGVuY3J5cHQsXG4gIGRlY3J5cHQsXG4gIGNvbXByZXNzLFxuICBkZWNvbXByZXNzLFxuICB0eXBlIEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgLy8gU2VhbGVkLWJveCAoJ2VuY3AnKSBrZXkgdmFyaWFudHMg4oCUIHNlZSBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMuXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgdHlwZSBSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBTZWFsVGFyZ2V0LFxuICBzZWFsVG8sXG4gIHJ1blBheWxvYWRLZXlzLFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgaXNTZWFsVGFyZ2V0LFxuICBpc1J1blBheWxvYWRLZXlzLFxuICBhZXNLZXlPZixcbn07XG5cbi8vIFJlLWV4cG9ydCB0aGUgbGVnYWN5IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbi8vIE5ldyBjb2RlIHNob3VsZCB1c2UgRm9ybWF0UHJlZml4IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcycuXG5leHBvcnQgdHlwZSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSA9XG4gICh0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdClba2V5b2YgdHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXRdO1xuXG4vKipcbiAqIERlZmF1bHQgVUxJRCBnZW5lcmF0b3IgZm9yIGNvbnRleHRzIHdoZXJlIFZNJ3Mgc2VlZGVkIGBzdGFibGVVbGlkYCBpc24ndCBhdmFpbGFibGUuXG4gKiBVc2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBzZXJpYWxpemluZyBzdHJlYW1zIG91dHNpZGUgdGhlIHdvcmtmbG93IFZNIGNvbnRleHRcbiAqIChlLmcuLCB3aGVuIHN0YXJ0aW5nIGEgd29ya2Zsb3cgb3IgaGFuZGxpbmcgc3RlcCByZXR1cm4gdmFsdWVzKS5cbiAqL1xuY29uc3QgZGVmYXVsdFVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogRGV0ZWN0IGlmIGEgcmVhZGFibGUgc3RyZWFtIGlzIGEgYnl0ZSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHN0cmVhbVxuICogQHJldHVybnMgYFwiYnl0ZXNcImAgaWYgdGhlIHN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLCBgdW5kZWZpbmVkYCBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmVhbVR5cGUoc3RyZWFtOiBSZWFkYWJsZVN0cmVhbSk6ICdieXRlcycgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoeyBtb2RlOiAnYnlvYicgfSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgcmV0dXJuICdieXRlcyc7XG4gIH0gY2F0Y2gge31cbn1cblxuLyoqXG4gKiBGcmFtZSBmb3JtYXQgZm9yIHN0cmVhbSBjaHVua3M6XG4gKiAgIFs0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhdW2Zvcm1hdC1wcmVmaXhlZCBwYXlsb2FkXVxuICpcbiAqIEVhY2ggY2h1bmsgaXMgaW5kZXBlbmRlbnRseSBmcmFtZWQgc28gdGhlIGRlc2VyaWFsaXplciBjYW4gZmluZFxuICogY2h1bmsgYm91bmRhcmllcyBldmVuIHdoZW4gbXVsdGlwbGUgY2h1bmtzIGFyZSBjb25jYXRlbmF0ZWQgb3JcbiAqIHNwbGl0IGFjcm9zcyB0cmFuc3BvcnQgcmVhZHMuXG4gKi9cbmNvbnN0IEZSQU1FX0hFQURFUl9TSVpFID0gNDtcblxuLyoqXG4gKiBUaGUgbW9kZS1zcGVjaWZpYyBzZXJpYWxpemVycyAoYC4vc2VyaWFsaXphdGlvbi97Y2xpZW50LHN0ZXAsd29ya2Zsb3d9LnRzYClcbiAqIGFscmVhZHkgdGhyb3cgYSBgU2VyaWFsaXphdGlvbkVycm9yYCB3aG9zZSBgLmNhdXNlYCBpcyB0aGUgdW5kZXJseWluZ1xuICogZGV2YWx1ZSAvIHNlcmRlIGZhaWx1cmUuIFRoZSBvdXRlciBkZWh5ZHJhdGUvaHlkcmF0ZSB3cmFwcGVycyB3YW50IHRvXG4gKiByZS1mcmFtZSB0aGF0IGVycm9yIHdpdGggYSBtb3JlIHNwZWNpZmljIGNvbnRleHQgbGFiZWwgKGUuZy4gXCJ3b3JrZmxvd1xuICogYXJndW1lbnRzXCIgaW5zdGVhZCBvZiBnZW5lcmljIFwid29ya2Zsb3cgdmFsdWVcIiksIHNvIHRoZXkgdW53cmFwIHRoZVxuICogaW5uZXIgU2VyaWFsaXphdGlvbkVycm9yIGFuZCByZWZvcm1hdCB3aXRoIHRoZSBvcmlnaW5hbCBjYXVzZS4gRXJyb3JzXG4gKiB0aGF0IGFyZW4ndCBhbHJlYWR5IFNlcmlhbGl6YXRpb25FcnJvciBmbG93IHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBpcyBhbiBleGNlcHRpb246IGl0IG11c3Qga2VlcCBpdHMgaWRlbnRpdHkgKGFuZFxuICogYGNvbnRleHRgKSBzbyB0aGUgcnVuLWZhaWx1cmUgY2xhc3NpZmllciByb3V0ZXMgaXQgdG8gYFJVTlRJTUVfRVJST1JgLFxuICogc28gdGhpcyByZXRocm93cyBpdCB1bmNoYW5nZWQgYmVmb3JlIGFueSB1bndyYXBwaW5nLiBOb3RlIHRoaXMgZ3VhcmRcbiAqIG11c3QgcnVuIGJlZm9yZSB0aGUgZ2VuZXJpYyBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIHVud3JhcCBiZWxvdywgc2luY2VcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBleHRlbmRzIGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgYW5kIGNhcnJpZXMgYVxuICogYGNhdXNlYCAodGhlIHVuZGVybHlpbmcgRE9NRXhjZXB0aW9uKSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSB1bndyYXBwZWRcbiAqIGFuZCByZWZyYW1lZCBhcyBhIGBTZXJpYWxpemF0aW9uRXJyb3JgLlxuICovXG5mdW5jdGlvbiB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3I6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0aHJvd0lmUnVudGltZUVycm9yKGVycm9yKTtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VyaWFsaXphdGlvbkVycm9yICYmIGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2U7XG4gIH1cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya2Zsb3dSdW50aW1lRXJyb3IgJiYgZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbi8qKlxuICogRW1pdCBjb21wcmVzc2lvbiB0ZWxlbWV0cnkgb250byB0aGUgYWN0aXZlIHNwYW4gYWZ0ZXIgYSAoZGUpc2VyaWFsaXplLlxuICpcbiAqIFRoZSBjb21wcmVzc2lvbiBsYXllciBwb3B1bGF0ZXMgYHN0YXRzYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgcmFuIChiaW5hcnlcbiAqIGRhdGEgb24gYSBzcGVjID49IDUgcGF0aCk7IGxlZ2FjeSAvIHYxQ29tcGF0IHBhdGhzIGxlYXZlIGl0IHVucmVjb3JkZWQsIHNvXG4gKiB0aGlzIG5vLW9wcyBmb3IgdGhlbSBhbmQgYXZvaWRzIHRoZSBgZ2V0QWN0aXZlU3BhbmAgbG9va3VwLiBBdHRyaWJ1dGVzIGxhbmRcbiAqIG9uIHdoYXRldmVyIHNwYW4gaXMgYWN0aXZlIOKAlCB0eXBpY2FsbHkgdGhlIGRlZGljYXRlZCBgc3RlcC5kZWh5ZHJhdGVgIC9cbiAqIGBzdGVwLmh5ZHJhdGVgIHNwYW4sIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIHJ1bi9zdGFydCBzcGFuLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWNvcmRDb21wcmVzc2lvbihcbiAgc3RhdHM6IENvbXByZXNzaW9uU3RhdHMsXG4gIG9wZXJhdGlvbjogJ3NlcmlhbGl6ZScgfCAnZGVzZXJpYWxpemUnXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFzdGF0cy5yZWNvcmRlZCkgcmV0dXJuO1xuICAvLyBUZWxlbWV0cnkgbXVzdCBuZXZlciBicmVhayB0aGUgc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgcGF0aCDigJQgYVxuICAvLyBtaXNzaW5nL2ZhaWxpbmcgdHJhY2VyIGlzIHB1cmVseSBhbiBvYnNlcnZhYmlsaXR5IGxvc3MuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCB1bmNvbXByZXNzZWRCeXRlcyA9IHN0YXRzLnVuY29tcHJlc3NlZEJ5dGVzID8/IDA7XG4gICAgY29uc3Qgc3RvcmVkQnl0ZXMgPSBzdGF0cy5zdG9yZWRCeXRlcyA/PyAwO1xuICAgIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25PcGVyYXRpb24ob3BlcmF0aW9uKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkNvbXByZXNzZWQoc3RhdHMuY29tcHJlc3NlZCA/PyBmYWxzZSksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25Db2RlYyhzdGF0cy5jb2RlYyA/PyAnbm9uZScpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uVW5jb21wcmVzc2VkQnl0ZXModW5jb21wcmVzc2VkQnl0ZXMpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uU3RvcmVkQnl0ZXMoc3RvcmVkQnl0ZXMpLFxuICAgICAgLi4uKHN0YXRzLmNvbXByZXNzZWQgJiYgdW5jb21wcmVzc2VkQnl0ZXMgPiAwXG4gICAgICAgID8gQXR0ci5TZXJpYWxpemF0aW9uQ29tcHJlc3Npb25SYXRpbyhcbiAgICAgICAgICAgIDEgLSBzdG9yZWRCeXRlcyAvIHVuY29tcHJlc3NlZEJ5dGVzXG4gICAgICAgICAgKVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIHRlbGVtZXRyeSBmYWlsdXJlc1xuICB9XG59XG5cbi8qKlxuICogRW1pdHMgT1RlbCBzcGFuIGF0dHJpYnV0ZXMgZm9yIHdvcmtmbG93IChndWVzdCkgY29kZSBleGVjdXRpb25zIHRoYXQgdGhlXG4gKiBoYXJkZW5lZCBzZXJpYWxpemVyIGNvdWxkIG5vdCBhdm9pZCAoZ2V0dGVycywgcHJveGllcywgY3VzdG9tXG4gKiBzZXJpYWxpemVycykuIE5vLW9wcyB3aGVuIHNlcmlhbGl6YXRpb24gd2FzIGZ1bGx5IHNpZGUtZWZmZWN0IGZyZWUg4oCUXG4gKiB0aGUgY29tbW9uIGNhc2UuIFNhbWUgbmV2ZXItYnJlYWstdGhlLWRhdGEtcGF0aCBjb250cmFjdCBhc1xuICogYHJlY29yZENvbXByZXNzaW9uYCBhYm92ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkR3Vlc3RDb2RlRXhlY3V0aW9ucyhzdGF0czogR3Vlc3RDb2RlU3RhdHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHN0YXRzLmV4ZWN1dGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgc3RhdHMuZXhlY3V0aW9ucy5tYXAoKGUpID0+XG4gICAgICAgICAgZS5kZXRhaWwgPyBgJHtlLmtpbmR9ICgke2UuZGV0YWlsfSlgIDogZS5raW5kXG4gICAgICAgIClcbiAgICAgICksXG4gICAgXTtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uR3Vlc3RDb2RlRXhlY3V0aW9ucyhzdGF0cy5leGVjdXRpb25zLmxlbmd0aCksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25HdWVzdENvZGVEZXRhaWxzKGRldGFpbHMpLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgdGVsZW1ldHJ5IGZhaWx1cmVzXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgcmVkdWNlcnM6IFBhcnRpYWw8UmVkdWNlcnM+LFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogVHJhbnNmb3JtU3RyZWFtPGFueSwgVWludDhBcnJheT4ge1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIC8vIFJlc29sdmUgdGhlIGtleSBpbnB1dCBvbmNlIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC5cbiAgLy8gTm90ZTogaWYgcmVzb2x2aW5nIGNyeXB0b0tleSByZWplY3RzIChlLmcuLCBuZXR3b3JrIGVycm9yIGZldGNoaW5nXG4gIC8vIHRoZSBkZXJpdmVkIGtleSksIHRoZSByZWplY3Rpb24gd29uJ3Qgc3VyZmFjZSB1bnRpbCB0aGUgZmlyc3QgY2h1bmtcbiAgLy8gaXMgcHJvY2Vzc2VkIOKAlCBub3QgYXQgc3RyZWFtIGNvbnN0cnVjdGlvbiB0aW1lLlxuICBjb25zdCBrZXlTdGF0ZSA9IHtcbiAgICByZXNvbHZlZDogZmFsc2UsXG4gICAga2V5OiB1bmRlZmluZWQgYXMgUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgfTtcbiAgLy8gU2V0IHdoZW4gdGhlIHJlc29sdmVkIGtleSBpcyBhIHNlYWwgdGFyZ2V0OyBhbW9ydGl6ZXMgdGhlIEtFTSBhY3Jvc3MgYWxsXG4gIC8vIGZyYW1lcyB0aGlzIHN0cmVhbSBpbnN0YW5jZSB3cml0ZXMuXG4gIGxldCBzZWFsU2Vzc2lvbjogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlU2VhbFNlc3Npb24+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPGFueSwgVWludDhBcnJheT4oe1xuICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFrZXlTdGF0ZS5yZXNvbHZlZCkge1xuICAgICAgICAgIGtleVN0YXRlLmtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICAgICAga2V5U3RhdGUucmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpc1NlYWxUYXJnZXQoa2V5U3RhdGUua2V5KSkge1xuICAgICAgICAgICAgc2VhbFNlc3Npb24gPSBjcmVhdGVTZWFsU2Vzc2lvbihcbiAgICAgICAgICAgICAga2V5U3RhdGUua2V5LnJlY2lwaWVudFB1YmxpY0tleSxcbiAgICAgICAgICAgICAga2V5U3RhdGUua2V5LmFhZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHN0cmluZ2lmeShjaHVuaywgcmVkdWNlcnMpO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gZW5jb2Rlci5lbmNvZGUoc2VyaWFsaXplZCk7XG4gICAgICAgIGxldCBwcmVmaXhlZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKSBhcyBVaW50OEFycmF5O1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIGZyYW1lIHBheWxvYWQgaWYgYSBrZXkgaXMgcHJvdmlkZWQuXG4gICAgICAgIC8vIFRoZSBsZW5ndGggaGVhZGVyIHJlbWFpbnMgaW4gdGhlIGNsZWFyIHNvIHRoZSBkZXNlcmlhbGl6ZXIgY2FuXG4gICAgICAgIC8vIGZpbmQgZnJhbWUgYm91bmRhcmllcyByZWdhcmRsZXNzIG9mIHRyYW5zcG9ydCBjaHVua2luZy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRXZlcnkgZnJhbWUgZ2V0cyBhIGZyZXNoIHJhbmRvbSBub25jZS4gTmV2ZXIgc3dpdGNoIHRoaXMgdG8gYVxuICAgICAgICAvLyBjb3VudGVyOiBhIHN0cmVhbSByZWNvbm5lY3Qgb3IgYSBkdXJhYmxlIHJlcGxheSByZXN0YXJ0cyB0aGUgd3JpdGVyLFxuICAgICAgICAvLyB3aGljaCB3b3VsZCByZXBlYXQgYChrZXksIG5vbmNlKWAgYW5kIGNhdGFzdHJvcGhpY2FsbHkgYnJlYWtcbiAgICAgICAgLy8gQUVTLUdDTS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gT24gdGhlIHNlYWxlZCBwYXRoIHRoZSBLRU0gaXMgYW1vcnRpemVkIGFjcm9zcyB0aGUgc3RyZWFtIHZpYSBhXG4gICAgICAgIC8vIHNlc3Npb24gKG9uZSBFQ0RIIHBlciB3cml0ZXIgaW5zdGVhZCBvZiBvbmUgcGVyIGZyYW1lKS4gVGhhdCBpcyBzYWZlXG4gICAgICAgIC8vIHByZWNpc2VseSBiZWNhdXNlIHRoZSBub25jZXMgc3RheSByYW5kb20sIGFuZCBiZWNhdXNlIHRoZSBzZXNzaW9uIGlzXG4gICAgICAgIC8vIHNjb3BlZCB0byB0aGlzIHN0cmVhbSBpbnN0YW5jZSDigJQgYSByZXBsYXllZCBvciByZWNvbm5lY3RlZCB3cml0ZXJcbiAgICAgICAgLy8gYnVpbGRzIGEgbmV3IG9uZSBhbmQgbmV2ZXIgaW5oZXJpdHMgYSBwcmV2aW91cyBjb250ZW50IGtleS5cbiAgICAgICAgaWYgKHNlYWxTZXNzaW9uKSB7XG4gICAgICAgICAgcHJlZml4ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRUQsXG4gICAgICAgICAgICBhd2FpdCBzZWFsU2Vzc2lvbi5zZWFsKHByZWZpeGVkKVxuICAgICAgICAgICkgYXMgVWludDhBcnJheTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlTdGF0ZS5rZXkpIHtcbiAgICAgICAgICBwcmVmaXhlZCA9IChhd2FpdCBlbmNyeXB0KHByZWZpeGVkLCBrZXlTdGF0ZS5rZXkpKSBhcyBVaW50OEFycmF5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgbGVuZ3RoLXByZWZpeGVkIGZyYW1lOiBbNC1ieXRlIGxlbmd0aF1bcHJlZml4ZWQgZGF0YV1cbiAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgVWludDhBcnJheShGUkFNRV9IRUFERVJfU0laRSArIHByZWZpeGVkLmxlbmd0aCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhmcmFtZS5idWZmZXIpLnNldFVpbnQzMigwLCBwcmVmaXhlZC5sZW5ndGgsIGZhbHNlKTtcbiAgICAgICAgZnJhbWUuc2V0KHByZWZpeGVkLCBGUkFNRV9IRUFERVJfU0laRSk7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShmcmFtZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFbmNyeXB0aW9uIGZhaWx1cmVzIG11c3Qga2VlcCB0aGVpciBSdW50aW1lRGVjcnlwdGlvbkVycm9yXG4gICAgICAgIC8vIGlkZW50aXR5IChSVU5USU1FX0VSUk9SKSByYXRoZXIgdGhhbiBiZSByZWZyYW1lZCBhcyBhXG4gICAgICAgIC8vIFNlcmlhbGl6YXRpb25FcnJvciAoVVNFUl9FUlJPUikuXG4gICAgICAgIGlmIChSdW50aW1lRGVjcnlwdGlvbkVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnc3RyZWFtIGNodW5rJyxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApO1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZTogZXJyb3IgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICByZXZpdmVyczogUGFydGlhbDxSZXZpdmVycz4sXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgYW55PiB7XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHQuXG4gIGNvbnN0IGtleVN0YXRlID0ge1xuICAgIHJlc29sdmVkOiBmYWxzZSxcbiAgICBrZXk6IHVuZGVmaW5lZCBhcyBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICB9O1xuICAvLyBNaXJyb3Igb2YgdGhlIHdyaXRlcidzIHNlYWwgc2Vzc2lvbjogZXZlcnkgZnJhbWUgZnJvbSBvbmUgd3JpdGVyIGNhcnJpZXNcbiAgLy8gdGhlIHNhbWUgZXBoZW1lcmFsIHB1YmxpYyBrZXksIHNvIHRoaXMgdHVybnMgYW4gRUNESCBwZXIgZnJhbWUgaW50byBhblxuICAvLyBFQ0RIIHBlciB3cml0ZXIuXG4gIGxldCBvcGVuU2Vzc2lvbjogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlT3BlblNlc3Npb24+IHwgdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGFwcGVuZFRvQnVmZmVyKGRhdGE6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBuZXdCdWZmZXIgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgZGF0YS5sZW5ndGgpO1xuICAgIG5ld0J1ZmZlci5zZXQoYnVmZmVyLCAwKTtcbiAgICBuZXdCdWZmZXIuc2V0KGRhdGEsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGcmFtZXMoXG4gICAgY29udHJvbGxlcjogVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI8YW55PlxuICApIHtcbiAgICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHRcbiAgICBpZiAoIWtleVN0YXRlLnJlc29sdmVkKSB7XG4gICAgICBrZXlTdGF0ZS5rZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAga2V5U3RhdGUucmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgaWYgKGlzUnVuUGF5bG9hZEtleXMoa2V5U3RhdGUua2V5KSkge1xuICAgICAgICBvcGVuU2Vzc2lvbiA9IGNyZWF0ZU9wZW5TZXNzaW9uKGtleVN0YXRlLmtleS5rZXlQYWlyLCBrZXlTdGF0ZS5rZXkuYWFkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBjb21wbGV0ZSBsZW5ndGgtcHJlZml4ZWQgZnJhbWVzXG4gICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICBidWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcblxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrOyAvLyBJbmNvbXBsZXRlIGZyYW1lLCB3YWl0IGZvciBtb3JlIGRhdGFcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJhbWVEYXRhID0gYnVmZmVyLnNsaWNlKFxuICAgICAgICBGUkFNRV9IRUFERVJfU0laRSxcbiAgICAgICAgRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aFxuICAgICAgKTtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoKTtcblxuICAgICAgbGV0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZnJhbWVEYXRhKTtcblxuICAgICAgLy8gSWYgdGhlIGZyYW1lIHBheWxvYWQgaXMgZW5jcnlwdGVkIG9yIHNlYWxlZCwgcmVjb3ZlciBpdCBmaXJzdCB0b1xuICAgICAgLy8gcmV2ZWFsIHRoZSBpbm5lciBmb3JtYXQtcHJlZml4ZWQgZGF0YSAoZS5nLiwgJ2RldmwnICsgc2VyaWFsaXplZFxuICAgICAgLy8gdGV4dCksIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHRoZSBub3JtYWwgZGVzZXJpYWxpemF0aW9uIHBhdGguXG4gICAgICBpZiAoXG4gICAgICAgIGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQgfHxcbiAgICAgICAgZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlNFQUxFRFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHNlYWxlZCA9IGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRUQ7XG4gICAgICAgIC8vIEEgc2VhbGVkIGZyYW1lIG5lZWRzIHRoZSBydW4ncyBrZXlwYWlyOyBhIHN5bW1ldHJpYyBmcmFtZSBuZWVkcyBhblxuICAgICAgICAvLyBBRVMga2V5LiBSZXBvcnQgdGhlIHNob3J0ZmFsbCBwcmVjaXNlbHkg4oCUIFwibm8ga2V5IGF0IGFsbFwiIGFuZCBcInRoZVxuICAgICAgICAvLyB3cm9uZyBraW5kIG9mIGtleVwiIGhhdmUgdmVyeSBkaWZmZXJlbnQgY2F1c2VzLlxuICAgICAgICBjb25zdCB1c2FibGUgPSBzZWFsZWRcbiAgICAgICAgICA/IGlzUnVuUGF5bG9hZEtleXMoa2V5U3RhdGUua2V5KVxuICAgICAgICAgIDogYWVzS2V5T2Yoa2V5U3RhdGUua2V5KSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIXVzYWJsZSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgICBuZXcgUnVudGltZURlY3J5cHRpb25FcnJvcihcbiAgICAgICAgICAgICAgc2VhbGVkXG4gICAgICAgICAgICAgICAgPyAnU2VhbGVkIHN0cmVhbSBkYXRhIGVuY291bnRlcmVkIGJ1dCBubyBydW4ga2V5cGFpciBpcyBhdmFpbGFibGUuICcgK1xuICAgICAgICAgICAgICAgICAgICBcIk9wZW5pbmcgYSBzZWFsZWQgZnJhbWUgcmVxdWlyZXMgdGhlIHJ1bidzIG93biBlbmNyeXB0aW9uIGtleSBtYXRlcmlhbC5cIlxuICAgICAgICAgICAgICAgIDogJ0VuY3J5cHRlZCBzdHJlYW0gZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8gZW5jcnlwdGlvbiBrZXkgaXMgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ0VuY3J5cHRpb24gaXMgbm90IGNvbmZpZ3VyZWQgb3Igbm8ga2V5IHdhcyBwcm92aWRlZCBmb3IgdGhpcyBydW4uJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2RlY3J5cHQnLFxuICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogcGF5bG9hZC5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgZm9ybWF0UHJlZml4OiBzZWFsZWQgPyAnZW5jcCcgOiAnZW5jcicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkZWNyeXB0ZWQ6IFVpbnQ4QXJyYXk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gU2VhbGVkIGZyYW1lcyBnbyB0aHJvdWdoIHRoZSBzZXNzaW9uIHNvIHJlcGVhdGVkIGZyYW1lcyBmcm9tIG9uZVxuICAgICAgICAgIC8vIHdyaXRlciByZXVzZSBhIHNpbmdsZSBkZWNhcHN1bGF0aW9uLiBFdmVyeXRoaW5nIGVsc2UgZGVsZWdhdGVzIHRvXG4gICAgICAgICAgLy8gdGhlIHNoYXJlZCBlbnZlbG9wZSBsYXllciwga2VlcGluZyB0aGUgdHdvIHNjaGVtZXMgaW4gbG9ja3N0ZXBcbiAgICAgICAgICAvLyB3aXRoIHRoZSBvbmUtc2hvdCBwYXRoLlxuICAgICAgICAgIGRlY3J5cHRlZCA9IHNlYWxlZFxuICAgICAgICAgICAgPyBhd2FpdCBvcGVuU2Vzc2lvbiEub3BlbihkZWNvZGVGb3JtYXRQcmVmaXgoZnJhbWVEYXRhKS5wYXlsb2FkKVxuICAgICAgICAgICAgOiAoKGF3YWl0IGRlY3J5cHQoZnJhbWVEYXRhLCBrZXlTdGF0ZS5rZXkpKSBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGUgbG93LWxldmVsIGNyeXB0byBsYXllciBvbmx5IHNlZXMgdGhlIHN0cmlwcGVkIHBheWxvYWQsIHNvIGl0XG4gICAgICAgICAgLy8gY2Fubm90IHJlY29yZCB0aGUgb3V0ZXIgZW52ZWxvcGUgcHJlZml4LiBXZSBwZWVrZWQgaXQgaGVyZSwgc29cbiAgICAgICAgICAvLyBlbnJpY2ggdGhlIGRpYWdub3N0aWMgY29udGV4dCB3aXRoIHRoZSByZWFsIGZvcm1hdCBwcmVmaXggYmVmb3JlXG4gICAgICAgICAgLy8gcHJvcGFnYXRpbmcg4oCUIG1pcnJvcmluZyBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMuXG4gICAgICAgICAgaWYgKFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuaXMoZXJyb3IpICYmIGVycm9yLmNvbnRleHQpIHtcbiAgICAgICAgICAgIGVycm9yLmNvbnRleHQuZm9ybWF0UHJlZml4ID0gZm9ybWF0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAoeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZShwYXlsb2FkKTtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHBhcnNlKHRleHQsIHJldml2ZXJzKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RyZWFtID0gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBhbnk+KHtcbiAgICBhc3luYyB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIEZpcnN0LCB0cnkgdG8gZGV0ZWN0IGlmIHRoaXMgaXMgbGVuZ3RoLXByZWZpeGVkIGZyYW1lZCBkYXRhXG4gICAgICAvLyBieSBjaGVja2luZyBpZiB0aGUgZmlyc3QgNCBieXRlcyBmb3JtIGEgcGxhdXNpYmxlIGxlbmd0aC5cbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwICYmIGNodW5rLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICBjb25zdCBwb3NzaWJsZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgICBjaHVuay5idWZmZXIsXG4gICAgICAgICAgY2h1bmsuYnl0ZU9mZnNldCxcbiAgICAgICAgICBjaHVuay5ieXRlTGVuZ3RoXG4gICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBvc3NpYmxlTGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHBvc3NpYmxlTGVuZ3RoIDwgMTAwXzAwMF8wMDAgLy8gc2FuaXR5IGNoZWNrOiA8IDEwME1CXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIExvb2tzIGxpa2UgZnJhbWVkIGRhdGFcbiAgICAgICAgICBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG4gICAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gQWxyZWFkeSBpbiBmcmFtZWQgbW9kZSAoaGF2ZSBidWZmZXJlZCBkYXRhKVxuICAgICAgICBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG4gICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTGVnYWN5IGZvcm1hdDogbmV3bGluZS1kZWxpbWl0ZWQgZGV2YWx1ZSB0ZXh0IChubyBmcmFtaW5nKVxuICAgICAgY29uc3QgdGV4dCA9IGRlY29kZXIuZGVjb2RlKGNodW5rKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShwYXJzZShsaW5lLCByZXZpdmVycykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICAvLyBQcm9jZXNzIGFueSByZW1haW5pbmcgZnJhbWVkIGRhdGFcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCeXRlLXN0cmVhbSB3aXJlIGZyYW1pbmdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vXG4vLyBCeXRlIHN0cmVhbXMgKGB0eXBlOiAnYnl0ZXMnYCBSZWFkYWJsZVN0cmVhbXMgcGFzc2VkIGFjcm9zcyBib3VuZGFyaWVzKVxuLy8gYXJlIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgd29ybGQncyBzdHJlYW0gdHJhbnNwb3J0IG9uZSB1c2VyIGNodW5rIGF0XG4vLyBhIHRpbWUuIFdpdGhvdXQgYW4gaW4tYmFuZCBlbnZlbG9wZSwgdGhlIHJlYWRlciBzZWVzIGEgZmxhdCBzdHJlYW0gb2Zcbi8vIGJ5dGVzIOKAlCB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCB3aGVyZSBvbmUgdXNlciBjaHVuayBlbmRzIGFuZCB0aGUgbmV4dFxuLy8gYmVnaW5zLCB3aGljaCBtYWtlcyBtaWQtc3RyZWFtIHJlY29ubmVjdCBpbXBvc3NpYmxlICh3ZSBkb24ndCBrbm93IGhvd1xuLy8gbWFueSBzZXJ2ZXItc2lkZSBjaHVua3MgaGF2ZSBiZWVuIGNvbnN1bWVkKS5cbi8vXG4vLyBUbyBlbmFibGUgdHJhbnNwYXJlbnQgcmVjb25uZWN0LCB0aGlzIFBSIGludHJvZHVjZXMgYW4gb3B0LWluIHdpcmVcbi8vIGVudmVsb3BlIHRoYXQgd3JhcHMgZWFjaCB1c2VyIGNodW5rIGluIGEgbGVuZ3RoLXByZWZpeDpcbi8vXG4vLyAgIFs0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhdW3VzZXIgcGF5bG9hZCBieXRlc11cbi8vXG4vLyBUaGUgZW52ZWxvcGUgaXMgaWRlbnRpY2FsIGluIHNoYXBlIHRvIGBnZXRTZXJpYWxpemVTdHJlYW1gJ3MgZnJhbWluZyxcbi8vIGJ1dCB0aGUgcGF5bG9hZCBoZXJlIGlzICpyYXcgdXNlciBieXRlcyog4oCUIHRoZXJlIGlzIG5vIGlubmVyXG4vLyBmb3JtYXQtcHJlZml4LCBubyBkZXZhbHVlLCBubyBlbmNyeXB0aW9uLiBBIGZyYW1lZCBieXRlIHN0cmVhbSBzdGF5c1xuLy8gc2VtYW50aWNhbGx5IGEgYnl0ZSBzdHJlYW0gZW5kLXRvLWVuZDsgdGhlIGZyYW1pbmcgaXMgcHVyZWx5IHRyYW5zcG9ydC5cbi8vXG4vLyBUaGUgZGVjaXNpb24gdG8gdXNlIGZyYW1pbmcgZm9yIGEgZ2l2ZW4gc3RyZWFtIGlzIHJlY29yZGVkIGluIHRoZVxuLy8gc2VyaWFsaXplZCBzdHJlYW0gcmVmIChgZnJhbWluZzogJ2ZyYW1lZC12MSdgKSwgc28gYm90aCBzaWRlcyBhZ3JlZSBvblxuLy8gdGhlIHdpcmUgZm9ybWF0IHdpdGhvdXQgcnVudGltZSBuZWdvdGlhdGlvbi4gUHJvZHVjZXJzIHRoYXQgdGFyZ2V0IGFcbi8vIHJ1biB3aG9zZSBkZXBsb3ltZW50IGRvZXNuJ3Qgc3VwcG9ydCBmcmFtaW5nIChzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2Bcbi8vIGluIGNhcGFiaWxpdGllcy50cykgZW1pdCByYXcgYnl0ZXMgYW5kIGEgcmVmIHdpdGhvdXQgdGhlIGZpZWxkIOKAlCB3aGljaFxuLy8gdGhlIHJlYWRlciB0cmVhdHMgYXMgbGVnYWN5IHJhdyBieXRlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5cbi8qKlxuICogTWF4aW11bSBhbGxvd2VkIGJ5dGUtc3RyZWFtIGZyYW1lIHBheWxvYWQgc2l6ZSAoMTAwTUIpLiBTaGFyZWQgYnkgdGhlXG4gKiBmcmFtZXIgKHJlamVjdHMgb3ZlcnNpemVkIHVzZXIgY2h1bmtzIGF0IHdyaXRlIHRpbWUsIHdoZXJlIHRoZSBlcnJvciBpc1xuICogYWN0aW9uYWJsZSkgYW5kIHRoZSB1bmZyYW1lciAocmVqZWN0cyBvdmVyc2l6ZWQgbGVuZ3RoIGhlYWRlcnMgYXQgcmVhZFxuICogdGltZSwgd2hpY2ggdXN1YWxseSBpbmRpY2F0ZSBhIG5vbi1mcmFtZWQgd2lyZSBiZWluZyByZWFkIGFzIGZyYW1lZCkuXG4gKiBLZWVwaW5nIGJvdGggc2lkZXMgb24gb25lIGNvbnN0YW50IGd1YXJhbnRlZXMgYW55IGNodW5rIHRoZSBmcmFtZXJcbiAqIGFjY2VwdHMgY2FuIGFsd2F5cyBiZSBkZWNvZGVkIGJ5IHRoZSB1bmZyYW1lci5cbiAqL1xuY29uc3QgTUFYX0ZSQU1FX1NJWkUgPSAxMDBfMDAwXzAwMDtcblxuLyoqXG4gKiBXcmFwcyBlYWNoIGNodW5rIG9mIGEgYnl0ZSBzdHJlYW0gaW4gYSA0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhcbiAqIHByZWZpeC4gVXNlZCBieSB0aGUgcHJvZHVjZXIgc2lkZSBvZiBhIGZyYW1lZCBieXRlLXN0cmVhbSBwaXBlLlxuICpcbiAqIEVtcHR5IGNodW5rcyAobGVuZ3RoIDApIGFyZSBkcm9wcGVkIOKAlCB0aGUgcmVzdWx0aW5nIGBbMHgwMCAweDAwIDB4MDAgMHgwMF1gXG4gKiBmcmFtZSB3b3VsZCBiZSBhbWJpZ3VvdXMgd2l0aCB0aGUgbGVnYWN5IFwibG9va3MgZnJhbWVkXCIgZGV0ZWN0aW9uIGluXG4gKiBgZ2V0RGVzZXJpYWxpemVTdHJlYW1gLCBhbmQgaXQgY2FycmllcyBubyBpbmZvcm1hdGlvbi5cbiAqXG4gKiBMb2FkLWJlYXJpbmcgaW52YXJpYW50OiBlYWNoIHVzZXIgY2h1bmsgYmVjb21lcyBleGFjdGx5IG9uZSBmcmFtZSwgYW5kXG4gKiBlYWNoIGZyYW1lIGlzIGVucXVldWVkIGFzIGV4YWN0bHkgb25lIHRyYW5zcG9ydCBjaHVuayAodGhlIGRvd25zdHJlYW1cbiAqIHdyaXRhYmxlIHBlcmZvcm1zIG9uZSB3aXJlIHdyaXRlIHBlciBjaHVuaywgcHJlc2VydmluZyBib3VuZGFyaWVzKS4gVGhlXG4gKiBzZXJ2ZXIgdGhlcmVmb3JlIHN0b3JlcyBvbmUgZnJhbWUgcGVyIGNodW5rIGluZGV4LCB3aGljaCBpcyB3aGF0IGFsbG93c1xuICogYSBmdXR1cmUgcmVjb25uZWN0aW5nIHJlYWRlciB0byByZXN1bWUgYSBmcmFtZWQgYnl0ZSBzdHJlYW0gYXRcbiAqIGBzdGFydEluZGV4ICsgY29uc3VtZWRGcmFtZXNgIOKAlCB0aGUgc2FtZSBhcml0aG1ldGljXG4gKiBgY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtYCByZWxpZXMgb24gZm9yIG9iamVjdCBzdHJlYW1zLiBEbyBub3RcbiAqIGNvYWxlc2NlIG9yIHNwbGl0IGZyYW1lcyBoZXJlIHdpdGhvdXQgcmV2aXNpdGluZyB0aGF0IHJlc3VtZSBsb2dpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ5dGVGcmFtaW5nU3RyZWFtKCk6IFRyYW5zZm9ybVN0cmVhbTxcbiAgVWludDhBcnJheSxcbiAgVWludDhBcnJheVxuPiB7XG4gIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+KHtcbiAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiBNQVhfRlJBTUVfU0laRSkge1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBjaHVuayBvZiAke2NodW5rLmxlbmd0aH0gYnl0ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSBgICtcbiAgICAgICAgICAgICAgYGZyYW1lZCBjaHVuayBzaXplICgke01BWF9GUkFNRV9TSVpFfSkuIFNwbGl0IHRoZSBkYXRhIGludG8gYCArXG4gICAgICAgICAgICAgIGBzbWFsbGVyIGNodW5rcyBiZWZvcmUgd3JpdGluZy5gLFxuICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFVpbnQ4QXJyYXkoRlJBTUVfSEVBREVSX1NJWkUgKyBjaHVuay5sZW5ndGgpO1xuICAgICAgbmV3IERhdGFWaWV3KGZyYW1lLmJ1ZmZlcikuc2V0VWludDMyKDAsIGNodW5rLmxlbmd0aCwgZmFsc2UpO1xuICAgICAgZnJhbWUuc2V0KGNodW5rLCBGUkFNRV9IRUFERVJfU0laRSk7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUoZnJhbWUpO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFVud3JhcHMgbGVuZ3RoLXByZWZpeGVkIGJ5dGUtc3RyZWFtIGZyYW1lcyBiYWNrIGludG8gdGhlIG9yaWdpbmFsIHVzZXJcbiAqIGNodW5rcy4gVXNlZCBieSB0aGUgY29uc3VtZXIgc2lkZSBvZiBhIGZyYW1lZCBieXRlLXN0cmVhbSBwaXBlLlxuICpcbiAqIEJ1ZmZlcnMgYWNyb3NzIHJlYWQgYm91bmRhcmllcyDigJQgdGhlIHRyYW5zcG9ydCBtYXkgc3BsaXQgYSBzaW5nbGVcbiAqIGZyYW1lIGFjcm9zcyBtdWx0aXBsZSByZWFkcyAoaGVhZGVyIGluIG9uZSBjaHVuaywgcGF5bG9hZCBpbiBhbm90aGVyKVxuICogb3IgY29hbGVzY2UgbXVsdGlwbGUgZnJhbWVzIGludG8gYSBzaW5nbGUgcmVhZC4gVGhlIHRyYW5zZm9ybSBlbWl0c1xuICogd2hvbGUgdXNlciBjaHVua3MgcmVnYXJkbGVzcyBvZiB0cmFuc3BvcnQgY2h1bmtpbmcuXG4gKlxuICogRXJyb3JzIHRoZSBzdHJlYW0gaWYgdGhlIGxlbmd0aCBoZWFkZXIgYWR2ZXJ0aXNlcyBhIGZyYW1lIGxhcmdlciB0aGFuXG4gKiBgTUFYX0ZSQU1FX1NJWkVgIGJ5dGVzLCBzaW5jZSB0aGF0IGFsbW9zdCBjZXJ0YWlubHkgaW5kaWNhdGVzIGFcbiAqIG1pc2ZyYW1lZCB3aXJlIChlLmcuIGEgcmF3IGJ5dGUgc3RyZWFtIGJlaW5nIGZlZCB0aHJvdWdoIHRoaXMgdHJhbnNmb3JtXG4gKiBieSBtaXN0YWtlKSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBhbiBlbm9ybW91cyBidWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKCk6IFRyYW5zZm9ybVN0cmVhbTxcbiAgVWludDhBcnJheSxcbiAgVWludDhBcnJheVxuPiB7XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcblxuICBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5sZW5ndGggKyBkYXRhLmxlbmd0aCk7XG4gICAgbmV4dC5zZXQoYnVmZmVyLCAwKTtcbiAgICBuZXh0LnNldChkYXRhLCBidWZmZXIubGVuZ3RoKTtcbiAgICBidWZmZXIgPSBuZXh0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgVWludDhBcnJheT4oe1xuICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IDApIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcblxuICAgICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgICBidWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKGZyYW1lTGVuZ3RoID4gTUFYX0ZSQU1FX1NJWkUpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICBgQnl0ZS1zdHJlYW0gZnJhbWUgbGVuZ3RoICR7ZnJhbWVMZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSAoJHtNQVhfRlJBTUVfU0laRX0pLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyB1c3VhbGx5IG1lYW5zIGEgbm9uLWZyYW1lZCBieXRlIHN0cmVhbSBpcyBiZWluZyByZWFkIGFzIGZyYW1lZC5gLFxuICAgICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWwgPSBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoO1xuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IHRvdGFsKSBicmVhaztcblxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYnVmZmVyLnNsaWNlKEZSQU1FX0hFQURFUl9TSVpFLCB0b3RhbCkpO1xuICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UodG90YWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGVuZGVkIHdpdGggJHtidWZmZXIubGVuZ3RofSBieXRlcyBvZiBpbmNvbXBsZXRlIGZyYW1lIGRhdGEuIGAgK1xuICAgICAgICAgICAgICBgVGhlIHN0cmVhbSB3YXMgdHJ1bmNhdGVkIG1pZC1mcmFtZS5gLFxuICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRW1pdCB0aGUgY2xpZW50LW9ic2VydmVkIGVuZC10by1lbmQgdGltZS10by1maXJzdC1jaHVuayBzcGFuIGZvciBhIGxpdmUgcmVhZDpcbiAqIHJlYWQgZGlzcGF0Y2ggKGBzdGFydEVwb2NoTXNgKSDihpIgdGhlIGZpcnN0IG5vbi1lbXB0eSBjaHVuayByZWFjaGluZyB0aGVcbiAqIHJlYWRlciwgaW5jbHVkaW5nIHRoZSBuZXR3b3JrIGhvcC4gRmlyZS1hbmQtZm9yZ2V0OyBuby1vcCB3aXRob3V0IE9URUwuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBzdGFydEluZGV4PzogbnVtYmVyLFxuICBjb25uZWN0TXM/OiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5yZWFkJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAncmVhZCcsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC50dGZjX21zJzogRGF0ZS5ub3coKSAtIHN0YXJ0RXBvY2hNcyxcbiAgICAgICAgLi4uKHR5cGVvZiBjb25uZWN0TXMgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB7ICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb25uZWN0X21zJzogY29ubmVjdE1zIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHR5cGVvZiBzdGFydEluZGV4ID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8geyAnd29ya2Zsb3cuc3RyZWFtLnN0YXJ0X2luZGV4Jzogc3RhcnRJbmRleCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCByZWFkLWNvbXBsZXRpb24gc3BhbiB3aGVuIGEgc3RyZWFtIHJlYWQgZHJhaW5zOlxuICogYmFjay1kYXRlZCB0byB0aGUgcmVhZCBkaXNwYXRjaCwgc28gaXRzIGR1cmF0aW9uIGlzIHRoZSB0b3RhbCByZWFkLCB3aXRoXG4gKiBjaHVuay9ieXRlIGNvdW50cyBmb3IgdGhyb3VnaHB1dC4gQ2FuY2VsbGVkIHJlYWRzIGVtaXQgbm90aGluZy4gRmlyZS1hbmQtXG4gKiBmb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtUmVhZENvbXBsZXRlKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBjaHVua0NvdW50OiBudW1iZXIsXG4gIGJ5dGVDb3VudDogbnVtYmVyLFxuICByZWNvbm5lY3RzPzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb21wbGV0ZScsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ3JlYWRfY29tcGxldGUnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQudG90YWxfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuY2h1bmtzJzogY2h1bmtDb3VudCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmJ5dGVzJzogYnl0ZUNvdW50LFxuICAgICAgICAuLi4odHlwZW9mIHJlY29ubmVjdHMgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB7ICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5yZWNvbm5lY3RzJzogcmVjb25uZWN0cyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbSBleHRlbmRzIFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgI3JlYWRlcj86IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PjtcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0YXJ0SW5kZXg/OiBudW1iZXIpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIHRpbWUtdG8tZmlyc3QtY2h1bmsgc3RhdGUuIGByZWFkU3RhcnRgIGlzIHN0YW1wZWQgd2hlbiB0aGVcbiAgICAvLyByZWFkZXIgc3RhcnRzIGNvbnN1bWluZyAoZmlyc3QgcHVsbCDihpIgdGhlIHJlYWQgZGlzcGF0Y2gpOyB0aGUgc3BhbiBpc1xuICAgIC8vIGVtaXR0ZWQgb25jZSwgd2hlbiB0aGUgZmlyc3Qgbm9uLWVtcHR5IGNodW5rIHJlYWNoZXMgdGhlIHJlYWRlci4gU28gaXRzXG4gICAgLy8gZHVyYXRpb24gaXMgdGhlIGVuZC10by1lbmQgVFRGQyBpbmNsdWRpbmcgdGhlIG5ldHdvcmsgaG9wLiBOby1vcCB3aXRob3V0XG4gICAgLy8gYW4gT3BlblRlbGVtZXRyeSBTREsgcmVnaXN0ZXJlZC5cbiAgICBsZXQgcmVhZFN0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZpcnN0Q2h1bmtSZXBvcnRlZCA9IGZhbHNlO1xuICAgIC8vIENsaWVudC1vYnNlcnZlZCBjb25uZWN0IGR1cmF0aW9uOiB0aGUgd29ybGQuc3RyZWFtcy5nZXQgYXdhaXQgKHJlYWRcbiAgICAvLyBkaXNwYXRjaCAtPiBzdHJlYW0gaGFuZGxlIC8gcmVzcG9uc2UgaGVhZGVycykuIFN0YW1wZWQgb24gdGhlXG4gICAgLy8gd29ya2Zsb3cuc3RyZWFtLnJlYWQgc3BhbiBvbmNlIHRoZSBmaXJzdCBjaHVuayBhcnJpdmVzLlxuICAgIGxldCBjb25uZWN0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBSZWFkLWNvbXBsZXRpb24gY291bnRlcnMgZm9yIHRoZSB3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb21wbGV0ZSBzcGFuXG4gICAgLy8gZW1pdHRlZCB3aGVuIHRoZSBzdHJlYW0gZHJhaW5zLlxuICAgIGxldCBjaHVua3NEZWxpdmVyZWQgPSAwO1xuICAgIGxldCBieXRlc0RlbGl2ZXJlZCA9IDA7XG4gICAgc3VwZXIoe1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb3Qgc3VyZSB3aHkgVHlwZVNjcmlwdCBpcyBjb21wbGFpbmluZyBhYm91dCB0aGlzXG4gICAgICB0eXBlOiAnYnl0ZXMnLFxuXG4gICAgICBwdWxsOiBhc3luYyAoY29udHJvbGxlcikgPT4ge1xuICAgICAgICBsZXQgcmVhZGVyID0gdGhpcy4jcmVhZGVyO1xuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIGlmIChyZWFkU3RhcnQgPT09IHVuZGVmaW5lZCkgcmVhZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgICAgICAgIGNvbnN0IGNvbm5lY3RTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQocnVuSWQsIG5hbWUsIHN0YXJ0SW5kZXgpO1xuICAgICAgICAgIGNvbm5lY3RNcyA9IERhdGUubm93KCkgLSBjb25uZWN0U3RhcnQ7XG4gICAgICAgICAgcmVhZGVyID0gdGhpcy4jcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgcmVhZGVyJykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuI3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAocmVhZFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlY29yZFN0cmVhbVJlYWRDb21wbGV0ZShcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgY2h1bmtzRGVsaXZlcmVkLFxuICAgICAgICAgICAgICBieXRlc0RlbGl2ZXJlZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgZmx1c2hlcyBhIGxlYWRpbmcgemVyby1sZW5ndGggY2h1bmsgKHYzKykgdG8gY29tbWl0XG4gICAgICAgICAgLy8gcmVzcG9uc2UgaGVhZGVycyBiZWZvcmUgYW55IGRhdGE7IHNraXAgZW1wdGllcyBzbyBUVEZDIG1lYXN1cmVzIHRvXG4gICAgICAgICAgLy8gdGhlIGZpcnN0IHJlYWwgY2h1bmsuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWZpcnN0Q2h1bmtSZXBvcnRlZCAmJlxuICAgICAgICAgICAgcmVzdWx0LnZhbHVlLmJ5dGVMZW5ndGggPiAwICYmXG4gICAgICAgICAgICByZWFkU3RhcnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlyc3RDaHVua1JlcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgICAgICBjb25uZWN0TXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCArPSAxO1xuICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkICs9IHJlc3VsdC52YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIC8vIEZvcndhcmQgcmF3IGJ5dGVzOyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gaXMgaGFuZGxlZCBhdCB0aGVcbiAgICAgICAgICAvLyBmcmFtaW5nIGxldmVsIGJ5IGdldFNlcmlhbGl6ZVN0cmVhbS9nZXREZXNlcmlhbGl6ZVN0cmVhbS5cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbmNlbDogYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy4jcmVhZGVyKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy4jcmVhZGVyLmNhbmNlbChyZWFzb24pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICB0aGlzLiNyZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYXhpbXVtIGNvbnNlY3V0aXZlIHJlY29ubmVjdCBhdHRlbXB0cyBmb3IgYSBzaW5nbGUgZnJhbWVkIHN0cmVhbSBzZXNzaW9uLlxuICogVGhlIGNvdW50ZXIgcmVzZXRzIHRvIHplcm8gd2hlbmV2ZXIgYSByZWNvbm5lY3QgbWFrZXMgZm9yd2FyZCBwcm9ncmVzcyAoYVxuICogZnJhbWUgaXMgZGVsaXZlcmVkKSwgc28gdGhpcyBib3VuZHMgKmNvbnNlY3V0aXZlKiBmYWlsdXJlcywgbm90IHRoZSBsaWZldGltZVxuICogdG90YWwg4oCUIGEgbG9uZy1saXZlZCBzZXJ2ZXJsZXNzIHN0cmVhbSBtYXkgbGVnaXRpbWF0ZWx5IHJlY29ubmVjdCBmYXIgbW9yZVxuICogdGhhbiB0aGlzIG1hbnkgdGltZXMgYXMgbG9uZyBhcyBlYWNoIHJlY29ubmVjdCBrZWVwcyBkZWxpdmVyaW5nIGRhdGEuIFdlIG9ubHlcbiAqIGdpdmUgdXAgYWZ0ZXIgdGhpcyBtYW55IHJlY29ubmVjdHMgaW4gYSByb3cgcHJvZHVjZSBub3RoaW5nLlxuICovXG5leHBvcnQgY29uc3QgRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUyA9IDUwO1xuXG4vKiogRWZmZWN0aXZlIGNvbnNlY3V0aXZlLXJlY29ubmVjdCBjYXAuIE92ZXJyaWRlOiBgV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUU2AuICovXG5jb25zdCBnZXRGcmFtZWRTdHJlYW1NYXhSZWNvbm5lY3RzID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMnLFxuICAgIEZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMsXG4gICAge1xuICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgIG1pbjogMSxcbiAgICB9XG4gICk7XG5cbi8qKlxuICogQWJzb2x1dGUgYmFja3N0b3Agb24gdG90YWwgcmVjb25uZWN0cyBmb3IgYSBzaW5nbGUgc2Vzc2lvbiwgaW5kZXBlbmRlbnQgb2ZcbiAqIHByb2dyZXNzLiBUaGUgY29uc2VjdXRpdmUgY2FwIGFib3ZlIHJlc2V0cyBvbiBmb3J3YXJkIHByb2dyZXNzLCB3aGljaCBpc1xuICogY29ycmVjdCBmb3IgYSB3ZWxsLWJlaGF2ZWQgYmFja2VuZCB0aGF0IGhvbm9ycyBgc3RhcnRJbmRleGAuIEJ1dCBpZiBhIFdvcmxkJ3NcbiAqIGBzdHJlYW1zLmdldGAgZXZlciBpZ25vcmVkIGBzdGFydEluZGV4YCBhbmQgcmUtZGVsaXZlcmVkIGVhcmxpZXIgY2h1bmtzLFxuICogXCJwcm9ncmVzc1wiIHdvdWxkIGJlIHJlcG9ydGVkIGV2ZXJ5IHJlY29ubmVjdCBhbmQgdGhlIGNvbnNlY3V0aXZlIGNhcCB3b3VsZFxuICogbmV2ZXIgdHJpcCDigJQgdHVybmluZyBhIGJvdW5kZWQgZmFpbHVyZSBpbnRvIGFuIHVuYm91bmRlZCByZWNvbm5lY3QgbG9vcC4gVGhpc1xuICogaGFyZCBjZWlsaW5nIGd1YXJhbnRlZXMgdGhlIGxvb3AgYWx3YXlzIHRlcm1pbmF0ZXMuIEl0IGlzIHNldCBoaWdoIGVub3VnaFxuICogKGhvdXJzIG9mIHN0cmVhbWluZyBhdCByZWFsaXN0aWMgcGVyLXNlc3Npb24gdGltZW91dHMpIHRvIG5ldmVyIGludGVyZmVyZVxuICogd2l0aCBsZWdpdGltYXRlIGxvbmctbGl2ZWQgc3RyZWFtcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMgPSAxMDAwO1xuXG4vKiogRWZmZWN0aXZlIHRvdGFsLXJlY29ubmVjdCBiYWNrc3RvcC4gT3ZlcnJpZGU6IGBXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTYC4gKi9cbmNvbnN0IGdldEZyYW1lZFN0cmVhbU1heFRvdGFsUmVjb25uZWN0cyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTJyxcbiAgICBGUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcblxuLyoqXG4gKiBXcmFwcyB0aGUgbGVuZ3RoLXByZWZpeC1mcmFtZWQgYnl0ZSBzdHJlYW0gZnJvbSBgd29ybGQuc3RyZWFtcy5nZXRgIHdpdGhcbiAqIHRyYW5zcGFyZW50IGF1dG8tcmVjb25uZWN0LlxuICpcbiAqIEV2ZXJ5IGZ1bGx5LWRlY29kZWQgb3V0ZXIgZnJhbWUgY29ycmVzcG9uZHMgdG8gZXhhY3RseSBvbmUgc2VydmVyLXNpZGVcbiAqIGNodW5rICh0aGUgc2VyaWFsaXplIHRyYW5zZm9ybSBlbnF1ZXVlcyBvbmUgZnJhbWUgcGVyIHdvcmtmbG93IHdyaXRlLCBhbmRcbiAqIHRoZSB3cml0YWJsZSBidWZmZXJzIG9uZSBmcmFtZSBwZXIgY2h1bmsgd2hlbiBtdWx0aS13cml0aW5nKS4gVGhlIHdyYXBwZXJcbiAqIGNvdW50cyBjb21wbGV0ZWQgZnJhbWVzIGFuZCwgb24gdXBzdHJlYW0gZXJyb3IsIHJlb3BlbnMgdGhlIGNvbm5lY3Rpb25cbiAqIHdpdGggYHN0YXJ0SW5kZXggPSByZXNvbHZlZFN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc2AuIFBhcnRpYWwtZnJhbWVcbiAqIGJ5dGVzIGJ1ZmZlcmVkIGJlZm9yZSB0aGUgY3V0IGFyZSBkaXNjYXJkZWQg4oCUIHRoZSBzZXJ2ZXIgd2lsbCByZXNlbmQgdGhlXG4gKiBpbi1mbGlnaHQgY2h1bmsgaW4gZnVsbCBmcm9tIHRoZSBuZXcgc3RhcnRJbmRleC5cbiAqXG4gKiBBIGNsZWFuIHVwc3RyZWFtIGNsb3NlIChFT0Ygd2l0aCBubyBlcnJvcikgc2lnbmFscyB0aGUgc3RyZWFtIGlzIHRydWx5XG4gKiBkb25lOyB3ZSBjbG9zZSB0aGUgd3JhcHBlciBhbmQgZG8gbm90IHJlY29ubmVjdC5cbiAqXG4gKiBOZWdhdGl2ZSBgc3RhcnRJbmRleGAgdmFsdWVzIChsYXN0LU4gc2VtYW50aWNzKSBza2lwIHRoZSByZWNvbm5lY3RcbiAqIG1hY2hpbmVyeSBiZWNhdXNlIHdlIGNhbm5vdCBjb21wdXRlIGFuIGFic29sdXRlIHJlc3VtZSBwb3NpdGlvbiB3aXRob3V0XG4gKiBhIHRhaWwtaW5kZXggbG9va3VwIOKAlCB0aGUgcmV0dXJuZWQgc3RyZWFtIGJlaGF2ZXMgYXMgYSBzaW5nbGUtc2hvdCByZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtKFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHN0YXJ0SW5kZXg/OiBudW1iZXJcbik6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgcmVjb25uZWN0U3VwcG9ydGVkID0gc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0SW5kZXggPj0gMDtcbiAgbGV0IGN1cnJlbnRTdGFydEluZGV4ID0gc3RhcnRJbmRleCA/PyAwO1xuICBsZXQgY29uc3VtZWRGcmFtZXMgPSAwO1xuICBsZXQgcmVjb25uZWN0Q291bnQgPSAwO1xuICBsZXQgdG90YWxSZWNvbm5lY3RDb3VudCA9IDA7XG4gIGxldCByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PiB8IHVuZGVmaW5lZDtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAvLyBSZWFkIHRlbGVtZXRyeSAoc2FtZSBzZW1hbnRpY3MgYXMgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbSk6XG4gIC8vIGRpc3BhdGNoIHRpbWUsIGZpcnN0LWNvbm5lY3QgZHVyYXRpb24sIGZpcnN0LWZyYW1lIGxhdGNoLCBhbmQgdG90YWxzLlxuICBsZXQgcmVhZFN0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBjb25uZWN0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0Q2h1bmtSZXBvcnRlZCA9IGZhbHNlO1xuICBsZXQgY2h1bmtzRGVsaXZlcmVkID0gMDtcbiAgbGV0IGJ5dGVzRGVsaXZlcmVkID0gMDtcblxuICBhc3luYyBmdW5jdGlvbiBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgY29uc3QgZWZmZWN0aXZlU3RhcnRJbmRleCA9IHJlY29ubmVjdFN1cHBvcnRlZFxuICAgICAgPyBjdXJyZW50U3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzXG4gICAgICA6IHN0YXJ0SW5kZXg7XG4gICAgY29uc3QgY29ubmVjdFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChydW5JZCwgbmFtZSwgZWZmZWN0aXZlU3RhcnRJbmRleCk7XG4gICAgaWYgKGNvbm5lY3RNcyA9PT0gdW5kZWZpbmVkKSBjb25uZWN0TXMgPSBEYXRlLm5vdygpIC0gY29ubmVjdFN0YXJ0O1xuICAgIHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVhZGVyKSB7XG4gICAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBBZHZhbmNlIHRoZSByZXN1bWUgcG9zaXRpb24gcGFzdCB0aGUgZnJhbWVzIGFscmVhZHkgZGVsaXZlcmVkLCB0aGVuXG4gICAgLy8gZHJvcCBhbnkgcGFydGlhbC1mcmFtZSBieXRlcyDigJQgdGhlIHJlb3BlbmVkIGNvbm5lY3Rpb24gcmUtc2VuZHMgZnJvbSBhXG4gICAgLy8gZnJhbWUgYm91bmRhcnkgYXQgdGhlIG5ldyBpbmRleC5cbiAgICBjdXJyZW50U3RhcnRJbmRleCArPSBjb25zdW1lZEZyYW1lcztcbiAgICBjb25zdW1lZEZyYW1lcyA9IDA7XG4gICAgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICAvLyBSZXRyeSB0aGUgcmVvcGVuIGl0c2VsZiBhZ2FpbnN0IHRoZSByZWNvbm5lY3QgYnVkZ2V0LiBBIHRyYW5zaWVudFxuICAgIC8vIGZhaWx1cmUgb2YgY29ubmVjdCgpIOKAlCB0aGUgc2VydmVyIGJyaWVmbHkgdW5hdmFpbGFibGUgZHVyaW5nIHRoZVxuICAgIC8vIHJlY29ubmVjdCB3aW5kb3cg4oCUIGlzIHRoZSBleGFjdCBibGlwIHRoaXMgd3JhcHBlciBleGlzdHMgdG8gc3Vydml2ZSwgc29cbiAgICAvLyBjb3VudCBpdCBhZ2FpbnN0IHRoZSBidWRnZXQgYW5kIHRyeSBhZ2FpbiByYXRoZXIgdGhhbiB0cmVhdGluZyBpdCBhc1xuICAgIC8vIGZhdGFsLiBPbmx5IGJ1ZGdldCBleGhhdXN0aW9uIChhIHNlcnZlciB0aGF0IHN0YXlzIGRvd24pIHRlcm1pbmF0ZXMgdGhlXG4gICAgLy8gc3RyZWFtLlxuICAgIGNvbnN0IG1heFJlY29ubmVjdHMgPSBnZXRGcmFtZWRTdHJlYW1NYXhSZWNvbm5lY3RzKCk7XG4gICAgY29uc3QgbWF4VG90YWxSZWNvbm5lY3RzID0gZ2V0RnJhbWVkU3RyZWFtTWF4VG90YWxSZWNvbm5lY3RzKCk7XG4gICAgZm9yICg7Oykge1xuICAgICAgcmVjb25uZWN0Q291bnQrKztcbiAgICAgIHRvdGFsUmVjb25uZWN0Q291bnQrKztcbiAgICAgIGlmIChyZWNvbm5lY3RDb3VudCA+IG1heFJlY29ubmVjdHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTdHJlYW0gXCIke25hbWV9XCIgZXhjZWVkZWQgbWF4aW11bSByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgKCR7bWF4UmVjb25uZWN0c30pYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRvdGFsUmVjb25uZWN0Q291bnQgPiBtYXhUb3RhbFJlY29ubmVjdHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTdHJlYW0gXCIke25hbWV9XCIgZXhjZWVkZWQgbWF4aW11bSB0b3RhbCByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgKCR7bWF4VG90YWxSZWNvbm5lY3RzfSlgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb25uZWN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFJldGVudGlvbiBleHBpcnkgaXMgdGVybWluYWwgYW5kIHJldHJ5aW5nIGNhbm5vdCByZXN0b3JlIHRoZSBzdHJlYW0uXG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSB0eXBlZCBlcnJvciBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHR1cm5pbmcgb25lIDQxMCBpbnRvXG4gICAgICAgIC8vIDUwIHJlY29ubmVjdCBhdHRlbXB0cyBhbmQgYSBnZW5lcmljIGJ1ZGdldC1leGhhdXN0aW9uIGVycm9yLlxuICAgICAgICBpZiAoU3RyZWFtRXhwaXJlZEVycm9yLmlzKGVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICAgIC8vIFJlb3BlbiBmYWlsZWQgdHJhbnNpZW50bHk7IGxvb3AgdG8gcmV0cnksIGNvdW50aW5nIGFnYWluc3QgdGhlXG4gICAgICAgIC8vIGJ1ZGdldCBzbyBhIHNlcnZlciB0aGF0IG5ldmVyIHJlY292ZXJzIHN0aWxsIHRlcm1pbmF0ZXMgdGhlIHN0cmVhbS5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+KHtcbiAgICBwdWxsOiBhc3luYyAoY29udHJvbGxlcikgPT4ge1xuICAgICAgaWYgKHJlYWRTdGFydCA9PT0gdW5kZWZpbmVkKSByZWFkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgLy8gTG9vcCB1bnRpbCB3ZSBlbWl0IHNvbWV0aGluZywgaGl0IEVPRiwgb3IgZmF0YWxseSBlcnJvci4gUmVhZHMgdGhhdFxuICAgICAgLy8gb25seSBleHRlbmQgdGhlIGluLWZsaWdodC1mcmFtZSBidWZmZXIgZG9uJ3QgZW5xdWV1ZSBhbnl0aGluZyDigJQgd2VcbiAgICAgIC8vIGtlZXAgcmVhZGluZyByYXRoZXIgdGhhbiByZXR1cm5pbmcgZW1wdHktaGFuZGVkLlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdDogeyBkb25lOiBib29sZWFuOyB2YWx1ZT86IFVpbnQ4QXJyYXkgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IGNvbm5lY3QoKSBndWFyYW50ZWVzIHJlYWRlclxuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlYWRlciEucmVhZCgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoIXJlY29ubmVjdFN1cHBvcnRlZCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgcmVjb25uZWN0KCk7XG4gICAgICAgICAgfSBjYXRjaCAocmVjb25uZWN0RXJyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKHJlY29ubmVjdEVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5kb25lIHx8ICFyZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAvLyBDbGVhbiBFT0Yg4oCUIHN0cmVhbSBpcyB0cnVseSBjb21wbGV0ZS4gRHJvcCBhbnkgcGFydGlhbC1mcmFtZVxuICAgICAgICAgIC8vIGJ5dGVzICh0aGVyZSBzaG91bGRuJ3QgYmUgYW55OyBhIHdlbGwtZm9ybWVkIHN0cmVhbSBlbmRzIG9uIGFcbiAgICAgICAgICAvLyBmcmFtZSBib3VuZGFyeSkuXG4gICAgICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChyZWFkU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVjb3JkU3RyZWFtUmVhZENvbXBsZXRlKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBjaHVua3NEZWxpdmVyZWQsXG4gICAgICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkLFxuICAgICAgICAgICAgICB0b3RhbFJlY29ubmVjdENvdW50XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwZW5kIHRvIGJ1ZmZlciBhbmQgZW1pdCBhbGwgY29tcGxldGUgZnJhbWVzLlxuICAgICAgICBjb25zdCBpbmNvbWluZyA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKGluY29taW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjb21iaW5lZCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5sZW5ndGggKyBpbmNvbWluZy5sZW5ndGgpO1xuICAgICAgICAgIGNvbWJpbmVkLnNldChidWZmZXIsIDApO1xuICAgICAgICAgIGNvbWJpbmVkLnNldChpbmNvbWluZywgYnVmZmVyLmxlbmd0aCk7XG4gICAgICAgICAgYnVmZmVyID0gY29tYmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW1pdHRlZCA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG4gICAgICAgICAgY29uc3QgdG90YWwgPSBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoO1xuICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgdG90YWwpIGJyZWFrO1xuICAgICAgICAgIC8vIEZvcndhcmQgdGhlIGVudGlyZSBmcmFtZWQgY2h1bmsgKGhlYWRlciArIHBheWxvYWQpIHRvIHRoZVxuICAgICAgICAgIC8vIGRvd25zdHJlYW0gZGVzZXJpYWxpemVyLCB3aGljaCBhbHJlYWR5IGV4cGVjdHMgdGhpcyBsYXlvdXQuXG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ1ZmZlci5zbGljZSgwLCB0b3RhbCkpO1xuICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSh0b3RhbCk7XG4gICAgICAgICAgY29uc3VtZWRGcmFtZXMrKztcbiAgICAgICAgICBjaHVua3NEZWxpdmVyZWQrKztcbiAgICAgICAgICBieXRlc0RlbGl2ZXJlZCArPSB0b3RhbDtcbiAgICAgICAgICBpZiAoIWZpcnN0Q2h1bmtSZXBvcnRlZCAmJiByZWFkU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZmlyc3RDaHVua1JlcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgICAgICBjb25uZWN0TXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVtaXR0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVtaXR0ZWQpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHByb2dyZXNzIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24g4oCUIGNsZWFyIHRoZVxuICAgICAgICAgIC8vIGNvbnNlY3V0aXZlLWZhaWx1cmUgYnVkZ2V0IHNvIGEgbG9uZyBzdHJlYW0gdGhhdCByZWNvbm5lY3RzXG4gICAgICAgICAgLy8gbWFueSB0aW1lcyAoYnV0IGtlZXBzIGRlbGl2ZXJpbmcpIGlzIG5ldmVyIGZhbHNlbHkgY2FwcGVkLlxuICAgICAgICAgIHJlY29ubmVjdENvdW50ID0gMDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBwYXJ0aWFsIGJ5dGVzIOKAlCByZWFkIG1vcmUuXG4gICAgICB9XG4gICAgfSxcbiAgICBjYW5jZWw6IGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChyZWFkZXIpIHtcbiAgICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIGNsb3NpbmcgUmVhZGFibGVTdHJlYW0gcmVhZGVyOicsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBncm91cC1jb21taXQgd2luZG93IGZvciB0aGUgTEVBRElORyBjaHVuayBvZiBhbiBpZGxlIHN0cmVhbS5cbiAqXG4gKiAwID0gZGlzcGF0Y2ggdGhlIGZpcnN0IGNodW5rIGltbWVkaWF0ZWx5LiBNZWFzdXJlZCBwcm9kdWN0aW9uIHByb2R1Y2VyXG4gKiByYXRlcyAobW9zdCBhZ2VudHM6IH4xLjIgY2h1bmtzIHBlciBmbHVzaCwgPjcwJSBvZiBjaHVua3MgYXJyaXZpbmcgbW9yZVxuICogdGhhbiAxMG1zIGFmdGVyIHRoZSBwcmV2aW91cyByZXF1ZXN0IGFscmVhZHkgZmluaXNoZWQpIHNob3cgYSBmaXhlZFxuICogbGVhZGluZy1lZGdlIHdpbmRvdyB0YXhlcyBpc29sYXRlZC1jaHVuayBkZWxpdmVyeSAofisyMCUgb24gYSB+NTBtcyBSVFQpXG4gKiB3aGlsZSBiYXRjaGluZyBhbG1vc3Qgbm90aGluZyBmb3Igc2xvdyBwcm9kdWNlcnMg4oCUIGZhc3QgcHJvZHVjZXJzIGdldFxuICogdGhlaXIgYmF0Y2hpbmcgZnJvbSBpbi1mbGlnaHQgYWNjdW11bGF0aW9uIHJlZ2FyZGxlc3MuIFNldHRpbmcgYSBwb3NpdGl2ZVxuICogaW50ZXJ2YWwgKGVudiBvciBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYCkgb3B0cyBhIGRlcGxveW1lbnQgaW50b1xuICogd2luZG93ZWQgbGVhZGluZy1lZGdlIGJhdGNoaW5nLCB0cmFkaW5nIGZpcnN0LWNodW5rIGxhdGVuY3kgZm9yIGxhcmdlclxuICogZ3JvdXBzLlxuICovXG5jb25zdCBTVFJFQU1fRkxVU0hfSU5URVJWQUxfTVMgPSAwO1xuXG4vKipcbiAqIGBXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVNgLCB3aGVuIHNldCwgb3ZlcnJpZGVzXG4gKiBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYDsgd2hlbiB1bnNldCB0aGUgV29ybGQgb3B0aW9uIChvciB0aGVcbiAqIGRlZmF1bHQpIGdvdmVybnMuIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIHVuc2V0L2ludmFsaWQgdmFsdWVzIHNvIHRoZVxuICogY2FsbGVyIGNhbiBmYWxsIHRocm91Z2ggdG8gdGhlIFdvcmxkIG9wdGlvbi5cbiAqL1xuY29uc3QgZ2V0RW52U3RyZWFtRmx1c2hJbnRlcnZhbE1zID0gKCk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVMnLCBOdW1iZXIuTmFOLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG59O1xuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCBzcGFuIGZvciBvbmUgZmx1c2hlZCBiYXRjaCBvZiBzdHJlYW0gd3JpdGVzOiBmaXJzdFxuICogYHdyaXRlKClgIG9mIHRoZSBiYXRjaCAoYHN0YXJ0RXBvY2hNc2ApIOKGkiB0aGUgc2VydmVyIHdyaXRlIHNldHRsaW5nLiBUaGVcbiAqIHNwYW4ncyBkdXJhdGlvbiBpcyB0aGVyZWZvcmUgdGhlIGFwcC1wZXJjZWl2ZWQgbGF0ZW5jeSBvZiB0aGUgYmF0Y2hcbiAqIChidWZmZXIgZHdlbGwgKyBiYWNrcHJlc3N1cmUgKyBSUEMpOyBgYnVmZmVyX2R3ZWxsX21zYCBpc29sYXRlcyB0aGVcbiAqIHByZS1kaXNwYXRjaCBzaGFyZSBzbyBjbGllbnQtc2lkZSBiYXRjaGluZyBjb3N0IGNhbiBiZSB0b2xkIGFwYXJ0IGZyb21cbiAqIG5ldHdvcmsvc2VydmVyIHRpbWUuIE5hbWVkIGB3b3JrZmxvdy5zdHJlYW0uZmx1c2hgIOKAlCB0aGUgcGVyLXJlcXVlc3QgUlBDXG4gKiBiZW5lYXRoIGl0IGlzIHdvcmxkLXZlcmNlbCdzIGB3b3JrZmxvdy5zdHJlYW0ud3JpdGVgIHNwYW4gKGNodW5rX3J0dCksIGFuZFxuICogdGhlIHR3byBtdXN0IHN0YXkgZGlzdGluZ3Vpc2hhYmxlLiBGaXJlLWFuZC1mb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtV3JpdGVGbHVzaChcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIGRpc3BhdGNoRXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGNodW5rQ291bnQ6IG51bWJlcixcbiAgYnl0ZUNvdW50OiBudW1iZXIsXG4gIHJwY01zOiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5mbHVzaCcsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ2ZsdXNoJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5idWZmZXJfZHdlbGxfbXMnOiBkaXNwYXRjaEVwb2NoTXMgLSBzdGFydEVwb2NoTXMsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0uZmx1c2guY2h1bmtzJzogY2h1bmtDb3VudCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5mbHVzaC5ieXRlcyc6IGJ5dGVDb3VudCxcbiAgICAgICAgLy8gQ2xpZW50LW9ic2VydmVkIFdvcmxkIHdyaXRlIFJQQyBkdXJhdGlvbiAobmV0d29yayBob3AgaW5jbHVkZWQpLlxuICAgICAgICAvLyBTYW1lIGtleSBhcyB3b3JsZC12ZXJjZWwncyBwZXItcmVxdWVzdCBzcGFuIGF0dHJpYnV0ZSBzbyBxdWVyaWVzXG4gICAgICAgIC8vIHdvcmsgcmVnYXJkbGVzcyBvZiB3aGljaCBsYXllciBlbWl0dGVkIGl0LlxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLndyaXRlLmNodW5rX3J0dCc6IHJwY01zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgc3BhbiBmb3IgdGhlIHN0cmVhbS1jbG9zZSBSUEM6IGl0cyBkdXJhdGlvbiBpcyB0aGVcbiAqIGB3b3JsZC5zdHJlYW1zLmNsb3NlYCByb3VuZCB0cmlwIChuZXR3b3JrIGhvcCBpbmNsdWRlZCkuIEZpcmUtYW5kLWZvcmdldDtcbiAqIG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtQ2xvc2UoXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5jbG9zZScsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ2Nsb3NlJyxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5jbG9zZS5ycGNfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSkoKTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0gZXh0ZW5kcyBXcml0YWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcnVuUmVhZHlCYXJyaWVyIFR1cmJvIG1vZGUgb25seTogYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGVcbiAgICogYmFja2dyb3VuZGVkIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZC4gV2hlbiB0aGUgc3RlcCBib2R5IHJ1bnNcbiAgICogb3B0aW1pc3RpY2FsbHkgKGJlZm9yZSBgcnVuX3N0YXJ0ZWRgIGlzIGR1cmFibGUpLCB0aGUgZmlyc3QgY2h1bmsgd3JpdGUgdG9cbiAgICogYSBicmFuZC1uZXcgc3RyZWFtIHdvdWxkIG90aGVyd2lzZSByZWFjaCB0aGUgV29ybGQgYmVmb3JlIHRoZSBydW4gZXhpc3RzXG4gICAqIGFuZCBiZSByZWplY3RlZCBhcyBydW4tbm90LWZvdW5kLiBBd2FpdGluZyB0aGlzIG9uY2UgYmVmb3JlIHRoZSBmaXJzdFxuICAgKiBmbHVzaC9jbG9zZSBvcmRlcnMgdGhlIHdyaXRlIGFmdGVyIHRoZSBydW4ncyBjcmVhdGlvbi4gYHVuZGVmaW5lZGAgb3V0c2lkZVxuICAgKiB0dXJibyBhbmQgb24gdGhlIGF3YWl0IHBhdGgsIHdoZXJlIHRoZSBydW4gd2FzIGFscmVhZHkgZHVyYWJsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPikge1xuICAgIGlmICh0eXBlb2YgcnVuSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGBcInJ1bklkXCIgbXVzdCBiZSBhIHN0cmluZywgZ290IFwiJHt0eXBlb2YgcnVuSWR9XCJgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgY29uc3Qgd29ybGRQcm9taXNlID0gZ2V0V29ybGRMYXp5KCk7XG5cbiAgICAvLyBIb2xkIHRoZSBmaXJzdCBzZXJ2ZXIgd3JpdGUgdW50aWwgdGhlIHJ1biBleGlzdHMgKHR1cmJvIG9wdGltaXN0aWNcbiAgICAvLyBzdGFydCkuIEF3YWl0ZWQgb25jZSwgdGhlbiBjbGVhcmVkIHNvIGxhdGVyIGZsdXNoZXMgcGF5IG5vdGhpbmcuIFRoZVxuICAgIC8vIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yIG9yZGVyaW5nIG9ubHk6IGlmIGBydW5fc3RhcnRlZGAgdHJ1bHkgZmFpbGVkXG4gICAgLy8gdGhlIHJ1biBkb2VzIG5vdCBleGlzdCwgc28gdGhlIHdyaXRlIGJlbG93IHN1cmZhY2VzIHRoZSByZWFsIGVycm9yLlxuICAgIGxldCBwZW5kaW5nUnVuUmVhZHk6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQgPSBydW5SZWFkeUJhcnJpZXI7XG4gICAgY29uc3QgZW5zdXJlUnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAocGVuZGluZ1J1blJlYWR5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcGVuZGluZ1J1blJlYWR5O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5IOKAlCBzZWUgYWJvdmUuXG4gICAgICAgIH1cbiAgICAgICAgcGVuZGluZ1J1blJlYWR5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBHcm91cC1jb21taXQgYnVmZmVyaW5nLlxuICAgIC8vXG4gICAgLy8gYHdyaXRlKClgIHJlc29sdmVzIGFzIHNvb24gYXMgdGhlIGNodW5rIGVudGVycyB0aGlzIGJvdW5kZWQgYnVmZmVyIOKAlFxuICAgIC8vIE5PVCB3aGVuIGl0IGlzIGR1cmFibGUuIFRoYXQgaXMgdGhlIHByb3BlcnR5IHRoYXQgbWFrZXMgYmF0Y2hpbmdcbiAgICAvLyBwYXRoLWluZGVwZW5kZW50OiBhIG5hdGl2ZSBgcmVhZGFibGUucGlwZVRvKHNlcnZlcldyaXRhYmxlKWAgcHVsbHMgdGhlXG4gICAgLy8gbmV4dCBjaHVuayB0aGUgbW9tZW50IGB3cml0ZSgpYCByZXNvbHZlcywgc28gY2h1bmtzIGFjY3VtdWxhdGUgaGVyZVxuICAgIC8vIGR1cmluZyB0aGUgZmx1c2gtdGltZXIgd2luZG93IGFuZCB3aGlsZSBhIHNlcnZlciByZXF1ZXN0IGlzIGluXG4gICAgLy8gZmxpZ2h0LCBhbmQgZWFjaCBhY2N1bXVsYXRlZCBncm91cCBnb2VzIG91dCBhcyBvbmUgYHdyaXRlTXVsdGlgLlxuICAgIC8vIChQcmV2aW91c2x5IGB3cml0ZSgpYCByZXNvbHZlZCBvbmx5IGFmdGVyIHRoZSB0aW1lciBBTkQgdGhlIHNlcnZlclxuICAgIC8vIHJvdW5kIHRyaXAsIHNvIG5hdGl2ZSBwaXBpbmcgc2VyaWFsaXplZCB0byBvbmUgcmVxdWVzdCBwZXIgY2h1bmsgYW5kXG4gICAgLy8gYmF0Y2hpbmcgb25seSB3b3JrZWQgdGhyb3VnaCBgZmx1c2hhYmxlUGlwZWAncyBiZXNwb2tlIGNvYWxlc2NpbmcuKVxuICAgIC8vXG4gICAgLy8gRHVyYWJpbGl0eSBoYXMgYSBkZWRpY2F0ZWQgYmFycmllciBpbnN0ZWFkOiBgZHJhaW4oKWAgKGV4cG9zZWQgdmlhXG4gICAgLy8ge0BsaW5rIFNUUkVBTV9EUkFJTl9TWU1CT0x9KSByZXNvbHZlcyBvbmx5IHdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0eVxuICAgIC8vIGFuZCBubyByZXF1ZXN0IGlzIGluIGZsaWdodC4gYGNsb3NlKClgIGF3YWl0cyBpdCBiZWZvcmUgY2xvc2luZyB0aGVcbiAgICAvLyBzZXJ2ZXIgc3RyZWFtLCBhbmQgdGhlIGZsdXNoYWJsZS1zdHJlYW0gbG9jay1yZWxlYXNlIGNvbXBsZXRpb25cbiAgICAvLyBhd2FpdHMgaXQgYmVmb3JlIGxldHRpbmcgYSBzdGVwIGZpbmlzaCDigJQgc28gXCJzdGVwIGNvbXBsZXRlZFwiIHN0aWxsXG4gICAgLy8gaW1wbGllcyBcInN0cmVhbSBkYXRhIGR1cmFibGVcIiwgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAgLy9cbiAgICAvLyBFbmNyeXB0aW9uL2RlY3J5cHRpb24gaXMgaGFuZGxlZCBhdCB0aGUgZnJhbWluZyBsZXZlbCBieVxuICAgIC8vIGdldFNlcmlhbGl6ZVN0cmVhbS9nZXREZXNlcmlhbGl6ZVN0cmVhbSwgbm90IGhlcmUuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgbGV0IGJ1ZmZlcjogVWludDhBcnJheVtdID0gW107XG4gICAgbGV0IGJ1ZmZlckJ5dGVzID0gMDtcbiAgICAvLyBUaGUgZ3JvdXAgY3VycmVudGx5IGluc2lkZSBhIHNlcnZlciByZXF1ZXN0LiBDb3VudGVkIGFnYWluc3QgdGhlXG4gICAgLy8gYnVmZmVyIGJvdW5kIHNvIGBXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LU2Aga2VlcHMgaXRzXG4gICAgLy8gZG9jdW1lbnRlZCBtZWFuaW5nIOKAlCBhbiB1cHBlciBib3VuZCBhY3Jvc3MgQUxMIHJlYWQtYnV0LW5vdC1kdXJhYmxlXG4gICAgLy8gY2h1bmtzIOKAlCBub3QganVzdCB0aGUgcXVldWVkIGZvbGxvdy11cCBncm91cC5cbiAgICBsZXQgaW5GbGlnaHRDaHVua3MgPSAwO1xuICAgIGxldCBpbkZsaWdodEJ5dGVzID0gMDtcbiAgICBsZXQgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgICAvKiogVGhlIGluLWZsaWdodCBkaXNwYXRjaCBjaGFpbi4gQXQgbW9zdCBvbmUsIHByZXNlcnZpbmcgY2h1bmsgb3JkZXIuICovXG4gICAgbGV0IGluRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RpY2t5IGZhaWx1cmU6IG9uY2UgYSBkaXNwYXRjaCBmYWlscywgdGhlIGZhaWxlZCBncm91cCBpcyByZS1xdWV1ZWRcbiAgICAgKiAocmV0YWluZWQsIGV4YWN0bHkgYXMgdGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIHJldGFpbmVkIGl0cyBidWZmZXIpXG4gICAgICogYW5kIGV2ZXJ5IHN1YnNlcXVlbnQgYHdyaXRlKClgLCBgY2xvc2UoKWAgYW5kIGBkcmFpbigpYCByZWplY3RzIHdpdGhcbiAgICAgKiB0aGUgb3JpZ2luYWwgZXJyb3IuIENodW5rcyB3aG9zZSBgd3JpdGUoKWAgYWxyZWFkeSByZXNvbHZlZCBzdXJmYWNlXG4gICAgICogdGhlaXIgZmFpbHVyZSBhdCB0aGUgZHVyYWJpbGl0eSBiYXJyaWVyIOKAlCB0aGF0IGlzIHRoZSBjb250cmFjdCBvZiBhblxuICAgICAqIGVhcmx5LWFjayBzaW5rLlxuICAgICAqL1xuICAgIGxldCBzaW5rRXJyb3I6IHVua25vd247XG4gICAgLy8gR3JvdXAtY29tbWl0IHdpbmRvdy4gVGhlIGVudiB2YXIsIHdoZW4gc2V0LCBvdmVycmlkZXMgdGhlIFdvcmxkXG4gICAgLy8gb3B0aW9uOyBvdGhlcndpc2UgYHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNc2AgZ292ZXJucyAoZGVmYXVsdCAwKSDigJRcbiAgICAvLyBpbmNsdWRpbmcgdGhlIHZlcnkgZmlyc3QgY2h1bmsuIFdoZW4gaXQgbXVzdCBjb21lIGZyb20gdGhlIHdvcmxkLFxuICAgIC8vIGBzY2hlZHVsZUdyb3VwQ29tbWl0YCB3YWl0cyBmb3IgYHdvcmxkUHJvbWlzZWAgYmVmb3JlIGRlY2lkaW5nLCB3aGljaFxuICAgIC8vIGNvc3RzIG5vdGhpbmc6IG5vIHJlcXVlc3QgY2FuIGxlYXZlIGJlZm9yZSBgc2VuZEdyb3VwYCdzIG93biB3b3JsZFxuICAgIC8vIGF3YWl0IGVpdGhlci5cbiAgICBsZXQgcmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPSBnZXRFbnZTdHJlYW1GbHVzaEludGVydmFsTXMoKTtcbiAgICBsZXQgX2ZsdXNoSW50ZXJ2YWxSZXNvbHV0aW9uOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gICAgLy8gUGVyLXJlcXVlc3Qgd2lyZSBsaW1pdHMgKHNlcnZlciBjYXBzKSBhbmQgdGhlIGJ1ZmZlciBib3VuZC4gVGhlIGJvdW5kXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBrbm9icyB0aGUgY29hbGVzY2luZyBwaXBlIHVzZWQsIHNvIHByb2R1Y2VyIGJhY2twcmVzc3VyZVxuICAgIC8vIGJlaGF2aW9yIGlzIHVuY2hhbmdlZDogb25jZSBhIHJlcXVlc3Qtd29ydGggb2YgY2h1bmtzIChvciB0aGUgYnl0ZVxuICAgIC8vIGJvdW5kKSBpcyBidWZmZXJlZCwgYHdyaXRlKClgIGJsb2NrcyB1bnRpbCBhIGdyb3VwIGxhbmRzIGR1cmFibHkuXG4gICAgY29uc3QgbWF4Q2h1bmtzUGVyUmVxdWVzdCA9IGdldE1heENodW5rc1BlckJhdGNoKCk7XG4gICAgY29uc3QgbWF4Qnl0ZXNQZXJSZXF1ZXN0ID0gZ2V0TWF4Qnl0ZXNQZXJCYXRjaCgpO1xuICAgIGNvbnN0IG1heEJ1ZmZlcmVkQ2h1bmtzID0gZ2V0TWF4SW5mbGlnaHRDaHVua3MoKTtcbiAgICBjb25zdCBtYXhCdWZmZXJlZEJ5dGVzID0gZ2V0TWF4QnVmZmVyZWRCeXRlcygpO1xuICAgIC8vIENsaWVudC1vYnNlcnZlZCB3cml0ZS1iYXRjaCB0aW1pbmc6IHN0YW1wZWQgd2hlbiB0aGUgYnVmZmVyIGdvZXNcbiAgICAvLyBlbXB0eeKGkm5vbi1lbXB0eSwgY29uc3VtZWQgYnkgdGhlIGdyb3VwIHRoYXQgY2FycmllcyB0aGF0IGNodW5rIG91dC5cbiAgICBsZXQgYnVmZmVyVDA6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIHR5cGUgV2FpdGVyID0geyByZXNvbHZlOiAoKSA9PiB2b2lkOyByZWplY3Q6IChlcnI6IHVua25vd24pID0+IHZvaWQgfTtcbiAgICAvKiogd3JpdGUoKSBjYWxscyBibG9ja2VkIG9uIHRoZSBidWZmZXIgYm91bmQuICovXG4gICAgbGV0IGNhcGFjaXR5V2FpdGVyczogV2FpdGVyW10gPSBbXTtcbiAgICAvKiogZHJhaW4oKSBjYWxscyB3YWl0aW5nIGZvciBmdWxsIGR1cmFiaWxpdHkuICovXG4gICAgbGV0IGRyYWluV2FpdGVyczogV2FpdGVyW10gPSBbXTtcblxuICAgIGNvbnN0IHJlamVjdFdhaXRlcnMgPSAoZXJyOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBhbGwgPSBbLi4uY2FwYWNpdHlXYWl0ZXJzLCAuLi5kcmFpbldhaXRlcnNdO1xuICAgICAgY2FwYWNpdHlXYWl0ZXJzID0gW107XG4gICAgICBkcmFpbldhaXRlcnMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdyBvZiBhbGwpIHcucmVqZWN0KGVycik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRha2UgdGhlIGxhcmdlc3QgbGVhZGluZyBncm91cCB0aGF0IGZpdHMgb25lIHJlcXVlc3Q6IGF0IG1vc3RcbiAgICAgKiBgbWF4Q2h1bmtzUGVyUmVxdWVzdGAgY2h1bmtzIGFuZCBgbWF4Qnl0ZXNQZXJSZXF1ZXN0YCBjdW11bGF0aXZlIGJ5dGVzXG4gICAgICogKGEgc2luZ2xlIG92ZXJzaXplZCBjaHVuayBzdGlsbCBnb2VzIG91dCBhbG9uZSkuXG4gICAgICovXG4gICAgY29uc3QgdGFrZUdyb3VwID0gKCk6IHsgZ3JvdXA6IFVpbnQ4QXJyYXlbXTsgYnl0ZXM6IG51bWJlciB9ID0+IHtcbiAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICBsZXQgYnl0ZXMgPSAwO1xuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBidWZmZXIpIHtcbiAgICAgICAgaWYgKGNvdW50ID49IG1heENodW5rc1BlclJlcXVlc3QpIGJyZWFrO1xuICAgICAgICBpZiAoY291bnQgPiAwICYmIGJ5dGVzICsgY2h1bmsuYnl0ZUxlbmd0aCA+IG1heEJ5dGVzUGVyUmVxdWVzdCkgYnJlYWs7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGJ5dGVzICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IGJ1ZmZlci5zbGljZSgwLCBjb3VudCk7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoY291bnQpO1xuICAgICAgYnVmZmVyQnl0ZXMgLT0gYnl0ZXM7XG4gICAgICByZXR1cm4geyBncm91cCwgYnl0ZXMgfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggbG9vcDogd2hpbGUgY2h1bmtzIGFyZSBidWZmZXJlZCwgc2VuZCB0aGVtIGdyb3VwIGJ5IGdyb3VwLlxuICAgICAqIEV4YWN0bHkgb25lIGxvb3AgcnVucyBhdCBhIHRpbWUgKGBpbkZsaWdodGApLCBzbyBncm91cHMgcmVhY2ggdGhlXG4gICAgICogc2VydmVyIGluIHdyaXRlIG9yZGVyLiBDaHVua3MgdGhhdCBhcnJpdmUgd2hpbGUgYSBncm91cCdzIHJlcXVlc3QgaXNcbiAgICAgKiBpbiBmbGlnaHQgYWNjdW11bGF0ZSBhbmQgZm9ybSB0aGUgbmV4dCBncm91cCDigJQgdGhlIGdyb3VwLWNvbW1pdFxuICAgICAqIGJlaGF2aW9yLCBub3cgaW5kZXBlbmRlbnQgb2YgaG93IHRoZSBwcm9kdWNlciBwaXBlcy5cbiAgICAgKi9cbiAgICAvKipcbiAgICAgKiBTZW5kIG9uZSBncm91cCB0byB0aGUgc2VydmVyOiBnYXRlIG9uIHJ1biByZWFkaW5lc3MsIHRoZW4gb25lXG4gICAgICogYHdyaXRlTXVsdGlgIChvciBzZXF1ZW50aWFsIGB3cml0ZWBzIHdoZW4gdGhlIHdvcmxkIGxhY2tzIGl0KS4gRW1pdHNcbiAgICAgKiB0aGUgd3JpdGUtZmx1c2ggc3BhbjsgZHdlbGwgaXMgbWVhc3VyZWQgdXAgdG8ganVzdCBiZWZvcmUgdGhlIFJQQyBzbyBhXG4gICAgICogdHVyYm8gcnVuLXJlYWR5IGJhcnJpZXIgd2FpdCBjb3VudHMgYXMgYnVmZmVyIGR3ZWxsLCBtYXRjaGluZyB0aGVcbiAgICAgKiBwcmUtZ3JvdXAtY29tbWl0IHRlbGVtZXRyeS5cbiAgICAgKi9cbiAgICBjb25zdCBzZW5kR3JvdXAgPSBhc3luYyAoXG4gICAgICBncm91cDogVWludDhBcnJheVtdLFxuICAgICAgYnl0ZXM6IG51bWJlcixcbiAgICAgIGdyb3VwVDA6IG51bWJlciB8IHVuZGVmaW5lZFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgd29ybGRQcm9taXNlO1xuICAgICAgY29uc3QgZGlzcGF0Y2hBdCA9IERhdGUubm93KCk7XG4gICAgICBpZiAodHlwZW9mIHdvcmxkLnN0cmVhbXMud3JpdGVNdWx0aSA9PT0gJ2Z1bmN0aW9uJyAmJiBncm91cC5sZW5ndGggPiAxKSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGVNdWx0aShydW5JZCwgbmFtZSwgZ3JvdXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHNlcXVlbnRpYWwgd3JpdGVzXG4gICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgZ3JvdXApIHtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKHJ1bklkLCBuYW1lLCBjaHVuayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChncm91cFQwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVjb3JkU3RyZWFtV3JpdGVGbHVzaChcbiAgICAgICAgICBncm91cFQwLFxuICAgICAgICAgIGRpc3BhdGNoQXQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBncm91cC5sZW5ndGgsXG4gICAgICAgICAgYnl0ZXMsXG4gICAgICAgICAgRGF0ZS5ub3coKSAtIGRpc3BhdGNoQXRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZGlzcGF0Y2hMb29wID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChmbHVzaFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGZsdXNoVGltZXIpO1xuICAgICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdyb3VwVDAgPSBidWZmZXJUMDtcbiAgICAgICAgY29uc3QgZ3JvdXBUYWtlbkF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgeyBncm91cCwgYnl0ZXMgfSA9IHRha2VHcm91cCgpO1xuICAgICAgICBpbkZsaWdodENodW5rcyA9IGdyb3VwLmxlbmd0aDtcbiAgICAgICAgaW5GbGlnaHRCeXRlcyA9IGJ5dGVzO1xuICAgICAgICBidWZmZXJUMCA9IGJ1ZmZlci5sZW5ndGggPiAwID8gZ3JvdXBUYWtlbkF0IDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2VuZEdyb3VwKGdyb3VwLCBieXRlcywgZ3JvdXBUMCk7XG4gICAgICAgICAgaW5GbGlnaHRDaHVua3MgPSAwO1xuICAgICAgICAgIGluRmxpZ2h0Qnl0ZXMgPSAwO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIFJldGFpbiB0aGUgZmFpbGVkIGdyb3VwIChhbmQgaXRzIG9yaWdpbmFsIHQwKSBhdCB0aGUgZnJvbnQgb2ZcbiAgICAgICAgICAvLyB0aGUgYnVmZmVyLCBwb2lzb24gdGhlIHNpbmssIGFuZCBzdXJmYWNlIHRoZSBmYWlsdXJlIHRvIGV2ZXJ5XG4gICAgICAgICAgLy8gYmxvY2tlZCB3cml0ZXIgYW5kIGRyYWluIHdhaXRlci5cbiAgICAgICAgICBidWZmZXIgPSBncm91cC5jb25jYXQoYnVmZmVyKTtcbiAgICAgICAgICBidWZmZXJCeXRlcyArPSBieXRlcztcbiAgICAgICAgICBpbkZsaWdodENodW5rcyA9IDA7XG4gICAgICAgICAgaW5GbGlnaHRCeXRlcyA9IDA7XG4gICAgICAgICAgYnVmZmVyVDAgPVxuICAgICAgICAgICAgZ3JvdXBUMCAhPT0gdW5kZWZpbmVkICYmIGJ1ZmZlclQwICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBNYXRoLm1pbihncm91cFQwLCBidWZmZXJUMClcbiAgICAgICAgICAgICAgOiAoZ3JvdXBUMCA/PyBidWZmZXJUMCk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIGdyb3VwIGlzIGR1cmFibGU6IHJlbGlldmUgd3JpdGVycyBibG9ja2VkIG9uIHRoZSBib3VuZCAodGhleVxuICAgICAgICAvLyByZS1jaGVjayBpdCBhbmQgbWF5IGJsb2NrIGFnYWluKS5cbiAgICAgICAgY29uc3QgcmVsaWV2ZWQgPSBjYXBhY2l0eVdhaXRlcnM7XG4gICAgICAgIGNhcGFjaXR5V2FpdGVycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHcgb2YgcmVsaWV2ZWQpIHcucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogU3RhcnQgKG9yIGpvaW4pIHRoZSBkaXNwYXRjaCBjaGFpbi4gTmV2ZXIgbGVhdmVzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uICovXG4gICAgY29uc3Qgc3RhcnREaXNwYXRjaCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChpbkZsaWdodCB8fCBzaW5rRXJyb3IgIT09IHVuZGVmaW5lZCB8fCBidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBpbkZsaWdodCA9IGRpc3BhdGNoTG9vcCgpLnRoZW4oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBpbkZsaWdodCA9IG51bGw7XG4gICAgICAgICAgLy8gQSB3cml0ZSBjYW4gbGFuZCBpbiB0aGUgbWljcm90YXNrIGdhcCBiZXR3ZWVuIHRoZSBsb29wJ3NcbiAgICAgICAgICAvLyBlbXB0eS1idWZmZXIgZXhpdCBhbmQgdGhpcyByZWFjdGlvbi4gc2NoZWR1bGVHcm91cENvbW1pdCBzYXdcbiAgICAgICAgICAvLyBpbkZsaWdodCBzdGlsbCBzZXQgYW5kIGFybWVkIG5vIHRpbWVyLCBzbyB3aXRob3V0IHRoaXMgY2hlY2tcbiAgICAgICAgICAvLyB0aGUgY2h1bmsgd291bGQgc2l0IHN0cmFuZGVkIHVudGlsIGEgbGF0ZXIgd3JpdGUvY2xvc2UvZHJhaW4uXG4gICAgICAgICAgLy8gVHJlYXQgaXQgbGlrZSBhbiBpbi1yZXF1ZXN0IGFycml2YWw6IGRpc3BhdGNoIGltbWVkaWF0ZWx5ICh0aGVcbiAgICAgICAgICAvLyBuZXcgY2hhaW4gc2V0dGxlcyB0aGUgZHJhaW4gd2FpdGVycyB3aGVuIGl0IGZpbmlzaGVzKS5cbiAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRnVsbHkgaWRsZSAodGhlIGxvb3Agb25seSBleGl0cyB3aXRoIGFuIGVtcHR5IGJ1ZmZlcik6IHNldHRsZVxuICAgICAgICAgIC8vIHRoZSBkdXJhYmlsaXR5IGJhcnJpZXIuXG4gICAgICAgICAgY29uc3Qgc2V0dGxlZCA9IGRyYWluV2FpdGVycztcbiAgICAgICAgICBkcmFpbldhaXRlcnMgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHcgb2Ygc2V0dGxlZCkgdy5yZXNvbHZlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGluRmxpZ2h0ID0gbnVsbDtcbiAgICAgICAgICBzaW5rRXJyb3IgPz89IGVycm9yO1xuICAgICAgICAgIHJlamVjdFdhaXRlcnMoc2lua0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTGVhZGluZy1lZGdlIGRpc3BhdGNoIHBvbGljeSBmb3IgYW4gaWRsZSBzaW5rOlxuICAgICAqIC0gd2luZG93IDw9IDAgKHRoZSBkZWZhdWx0KTogZGlzcGF0Y2ggdGhlIGxlYWRpbmcgY2h1bmsgaW1tZWRpYXRlbHkuXG4gICAgICogICBGYXN0IHByb2R1Y2VycyBzdGlsbCBiYXRjaCB2aWEgaW4tZmxpZ2h0IGFjY3VtdWxhdGlvbiDigJQgY2h1bmtzXG4gICAgICogICBhcnJpdmluZyBkdXJpbmcgdGhlIHJlcXVlc3QgZm9ybSB0aGUgbmV4dCBncm91cC4gVGhlIHRyYWRlIGZvciBhblxuICAgICAqICAgaWRsZSBidXJzdCBpcyBvbmUgZXh0cmEgcmVxdWVzdCAoYSAzMC1jaHVuayBidXJzdCBzaGlwcyBhcyAxICsgMjlcbiAgICAgKiAgIGluc3RlYWQgb2Ygb25lIDMwLWNodW5rIGdyb3VwIHVuZGVyIGEgcG9zaXRpdmUgd2luZG93KSBpbiBleGNoYW5nZVxuICAgICAqICAgZm9yIHplcm8gZml4ZWQgZmlyc3QtY2h1bmsgZGVsYXkg4oCUIHdoaWNoIG1hdGNoZXMgbWVhc3VyZWQgcHJvZHVjZXJcbiAgICAgKiAgIGJlaGF2aW9yLCB3aGVyZSBpc29sYXRlZCBjaHVua3MgZG9taW5hdGUuXG4gICAgICogLSB3aW5kb3cgPiAwIChleHBsaWNpdGx5IGNvbmZpZ3VyZWQpOiBhcm0gdGhlIGdyb3VwLWNvbW1pdCB0aW1lciBzb1xuICAgICAqICAgdGhlIGxlYWRpbmcgY2h1bmsgd2FpdHMgdXAgdG8gdGhlIHdpbmRvdyBjb2xsZWN0aW5nIGEgZ3JvdXAg4oCUXG4gICAgICogICB0aGUgb3B0LWluIHRyYWRlIGZvciBzbG93LWJ1dC1zdGVhZHkgcHJvZHVjZXJzLlxuICAgICAqIFdpbmRvdyByZXNvbHV0aW9uOiBgV09SS0ZMT1dfU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TYCwgd2hlbiBzZXQsXG4gICAgICogb3ZlcnJpZGVzIGB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXNgOyBvdGhlcndpc2UgdGhlIFdvcmxkIG9wdGlvblxuICAgICAqIChkZWZhdWx0IDApIGdvdmVybnMg4oCUIGluY2x1ZGluZyB0aGUgdmVyeSBmaXJzdCBjaHVuay4gRGVjaWRpbmcgbWF5XG4gICAgICogaGF2ZSB0byB3YWl0IGZvciB0aGUgd29ybGQgdG8gcmVzb2x2ZTsgdGhhdCBhZGRzIG5vIGxhdGVuY3kgYmVjYXVzZVxuICAgICAqIGBzZW5kR3JvdXBgIGF3YWl0cyB0aGUgc2FtZSBwcm9taXNlIGJlZm9yZSBhbnkgcmVxdWVzdCBsZWF2ZXMuXG4gICAgICovXG4gICAgY29uc3Qgc2NoZWR1bGVHcm91cENvbW1pdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChmbHVzaFRpbWVyIHx8IGluRmxpZ2h0KSByZXR1cm47XG4gICAgICBpZiAocmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBQcm9taXNlLnJlc29sdmU6IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgd29ybGQgaXMgb25seSBldmVyIGF3YWl0ZWQsXG4gICAgICAgIC8vIHdoaWNoIHRvbGVyYXRlcyBhIHN5bmNocm9ub3VzIHZhbHVlICh0ZXN0cyBzdHViIGdldFdvcmxkTGF6eSB0aGF0XG4gICAgICAgIC8vIHdheSk7IC50aGVuKCkgbXVzdCBiZSBnaXZlbiBhIHJlYWwgcHJvbWlzZS5cbiAgICAgICAgX2ZsdXNoSW50ZXJ2YWxSZXNvbHV0aW9uID8/PSBQcm9taXNlLnJlc29sdmUod29ybGRQcm9taXNlKVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgKHdvcmxkKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID1cbiAgICAgICAgICAgICAgICB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXMgPz8gU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gV29ybGQgcmVzb2x1dGlvbiBmYWlsdXJlIHN1cmZhY2VzIG9uIGRpc3BhdGNoOyBmYWxsIGJhY2sgdG9cbiAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgc28gYnVmZmVyZWQgY2h1bmtzIHN0aWxsIHJlYWNoIHRoZSBkaXNwYXRjaCBwYXRoXG4gICAgICAgICAgICAgIC8vICh3aGVyZSB0aGUgZXJyb3IgcG9pc29ucyB0aGUgc2luaykuXG4gICAgICAgICAgICAgIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID0gU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBSZS1ldmFsdWF0ZTogdGhlIGJ1ZmZlciBtYXkgaGF2ZSBiZWVuIGRpc3BhdGNoZWQgYnkgZHJhaW4oKVxuICAgICAgICAgICAgLy8gb3IgYSBmdWxsLXJlcXVlc3QgZmFzdCBwYXRoIHdoaWxlIHRoZSB3b3JsZCByZXNvbHZlZC5cbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkgc2NoZWR1bGVHcm91cENvbW1pdCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPD0gMCkge1xuICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgIH0sIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHVyYWJpbGl0eSBiYXJyaWVyOiByZXNvbHZlcyB3aGVuIGV2ZXJ5IGFjY2VwdGVkIGNodW5rIGhhcyByZWFjaGVkIHRoZVxuICAgICAqIHNlcnZlciBhbmQgbm90aGluZyBpcyBidWZmZXJlZCBvciBpbiBmbGlnaHQ7IHJlamVjdHMgd2l0aCB0aGUgc2luaydzXG4gICAgICogc3RpY2t5IGVycm9yIGlmIGFueSBkaXNwYXRjaCBmYWlsZWQuIEZsdXNoZXMgYSBwZW5kaW5nIGdyb3VwLWNvbW1pdFxuICAgICAqIHdpbmRvdyBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nIG91dCB0aGUgdGltZXIuXG4gICAgICovXG4gICAgY29uc3QgZHJhaW4gPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoc2lua0Vycm9yICE9PSB1bmRlZmluZWQpIHRocm93IHNpbmtFcnJvcjtcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDAgJiYgIWluRmxpZ2h0KSByZXR1cm47XG4gICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGRyYWluV2FpdGVycy5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc3VwZXIoe1xuICAgICAgYXN5bmMgd3JpdGUoY2h1bmspIHtcbiAgICAgICAgaWYgKHNpbmtFcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBzaW5rRXJyb3I7XG4gICAgICAgIGlmIChidWZmZXJUMCA9PT0gdW5kZWZpbmVkKSBidWZmZXJUMCA9IERhdGUubm93KCk7XG4gICAgICAgIGJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgICAgYnVmZmVyQnl0ZXMgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYnVmZmVyLmxlbmd0aCA+PSBtYXhDaHVua3NQZXJSZXF1ZXN0IHx8XG4gICAgICAgICAgYnVmZmVyQnl0ZXMgPj0gbWF4Qnl0ZXNQZXJSZXF1ZXN0XG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFRoZSBidWZmZXJlZCBncm91cCBhbHJlYWR5IGZpbGxzIGEgcmVxdWVzdDogbm8gcG9pbnQgZHdlbGxpbmcgaW5cbiAgICAgICAgICAvLyB0aGUgY29tbWl0IHdpbmRvdy5cbiAgICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NoZWR1bGVHcm91cENvbW1pdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm91bmRlZCBidWZmZXI6IGFjY2VwdCB0aGUgY2h1bmsgKG5ldmVyIGRyb3ApLCB0aGVuIGJsb2NrIHVudGlsXG4gICAgICAgIC8vIHRoZSByZWFkLWJ1dC1ub3QtZHVyYWJsZSBwb3B1bGF0aW9uIOKAlCBidWZmZXJlZCBBTkQgaW4gdGhlIGFjdGl2ZVxuICAgICAgICAvLyByZXF1ZXN0IOKAlCBpcyBiYWNrIHVuZGVyIHRoZSBib3VuZC4gRWFjaCBkdXJhYmx5LXNlbnQgZ3JvdXBcbiAgICAgICAgLy8gcmVsaWV2ZXMgdGhpcy5cbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgIHNpbmtFcnJvciA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgKGJ1ZmZlci5sZW5ndGggKyBpbkZsaWdodENodW5rcyA+PSBtYXhCdWZmZXJlZENodW5rcyB8fFxuICAgICAgICAgICAgYnVmZmVyQnl0ZXMgKyBpbkZsaWdodEJ5dGVzID49IG1heEJ1ZmZlcmVkQnl0ZXMpXG4gICAgICAgICkge1xuICAgICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjYXBhY2l0eVdhaXRlcnMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lua0Vycm9yICE9PSB1bmRlZmluZWQpIHRocm93IHNpbmtFcnJvcjtcbiAgICAgIH0sXG4gICAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgLy8gRXZlcnl0aGluZyBhY2NlcHRlZCBtdXN0IGJlIGR1cmFibGUgYmVmb3JlIHRoZSBzZXJ2ZXIgc3RyZWFtIGlzXG4gICAgICAgIC8vIGNsb3NlZCDigJQgdGhlIHNlcnZlciBmZW5jZXMgcG9zdC1jbG9zZSB3cml0ZXMuXG4gICAgICAgIGF3YWl0IGRyYWluKCk7XG5cbiAgICAgICAgLy8gQSBjbG9zZSB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBza2lwcyB0aGUgZGlzcGF0Y2ggcGF0aCAoYW5kIGl0c1xuICAgICAgICAvLyBiYXJyaWVyKSwgYnV0IGNhbiBpdHNlbGYgYmUgdGhlIGZpcnN0IHdyaXRlIHRvIGEgYnJhbmQtbmV3XG4gICAgICAgIC8vIHN0cmVhbSDigJQgZ2F0ZSBpdCB0b28uXG4gICAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG5cbiAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICAgIGNvbnN0IGNsb3NlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKHJ1bklkLCBuYW1lKTtcbiAgICAgICAgcmVjb3JkU3RyZWFtQ2xvc2UoY2xvc2VTdGFydCwgcnVuSWQsIG5hbWUpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGFib3J0KHJlYXNvbikge1xuICAgICAgICAvLyBCdWZmZXJlZCBjaHVua3Mgd2VyZSBhbHJlYWR5IEFDS0VEIHRvIHRoZWlyIHdyaXRlcnMgKGVhcmx5LWFja1xuICAgICAgICAvLyBjb250cmFjdCksIGFuZCBuYXRpdmUgcGlwZVRvIGFib3J0cyB0aGlzIHNpbmsgd2hlbmV2ZXIgaXRzIFNPVVJDRVxuICAgICAgICAvLyBlcnJvcnMg4oCUIGUuZy4gYW4gQUkgc3RyZWFtIHRoYXQgZW1pdHMgdGVuIGRlbHRhcyBhbmQgdGhlbiB0aHJvd3MuXG4gICAgICAgIC8vIERpc2NhcmRpbmcgaGVyZSB3b3VsZCBzaWxlbnRseSBsb3NlIHRoZSBhY2NlcHRlZCB0YWlsIG9mIHRoZVxuICAgICAgICAvLyBwcmVmaXgsIHNvIGRlbGl2ZXIgaXQgZmlyc3Q7IG9ubHkgdGhlIHNlcnZlciBzdHJlYW0gY2xvc2UgaXNcbiAgICAgICAgLy8gc2tpcHBlZC4gQSBkaXNwYXRjaCBmYWlsdXJlIGR1cmluZyB0aGlzIGRyYWluIGlzIGFscmVhZHkgc3RpY2t5XG4gICAgICAgIC8vIGFuZCBzdXJmYWNlcyB0aHJvdWdoIHRoZSBzaW5rJ3MgZXJyb3IgcGF0aHMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERlbGliZXJhdGVseSB1bi10aW1lYm94ZWQgKHVubGlrZSB0aGUgc3RlcC1leGVjdXRvcidzIDUwMG1zXG4gICAgICAgIC8vIGlubGluZSBmbHVzaCk6IGdpdmluZyB1cCBlYXJseSB3b3VsZCBkcm9wIGFja2VkIGNodW5rcyDigJQgdGhlXG4gICAgICAgIC8vIGV4YWN0IGxvc3MgdGhpcyBwYXRoIGV4aXN0cyB0byBwcmV2ZW50LiBJdCBpcyBzdGlsbCBib3VuZGVkIGluXG4gICAgICAgIC8vIHByYWN0aWNlIGJ5IHRoZSBXb3JsZCB0cmFuc3BvcnQncyBvd24gdGltZW91dC9yZXRyeSBidWRnZXQ6IGFcbiAgICAgICAgLy8gc3RhbGxlZCB3cml0ZSBlbmRzIGluIGEgdGVybWluYWwgcmVqZWN0aW9uIGFmdGVyIGZpbml0ZSByZXRyaWVzLFxuICAgICAgICAvLyB3aGljaCByZWplY3RzIHRoZSBkaXNwYXRjaCBhbmQgbGFuZHMgaW4gdGhlIGNhdGNoIGJlbG93LiBUaGVcbiAgICAgICAgLy8gc2FtZSBjYXRjaCBhYnNvcmJzIHRoZSBleHBlY3RlZCBjb25mbGljdCB3aGVuIGEgdGVhcmRvd24tZHJpdmVuXG4gICAgICAgIC8vIGFib3J0IGRyYWlucyBpbnRvIGFuIGFscmVhZHktdGVybWluYWwgcnVuLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGRyYWluKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIHNpbmtFcnJvciBpcyBzZXQ7IGFjY2VwdGVkLWJ1dC11bmRlbGl2ZXJhYmxlIGNodW5rcyBzdXJmYWNlIGl0LlxuICAgICAgICB9XG4gICAgICAgIGlmIChmbHVzaFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGZsdXNoVGltZXIpO1xuICAgICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICBidWZmZXJCeXRlcyA9IDA7XG4gICAgICAgIHNpbmtFcnJvciA/Pz0gcmVhc29uID8/IG5ldyBFcnJvcignU3RyZWFtIGFib3J0ZWQnKTtcbiAgICAgICAgLy8gUmVqZWN0IGJsb2NrZWQgd3JpdGVycyBhbmQgZHJhaW4gd2FpdGVycyBzbyBub3RoaW5nIGxlYWtzIG9yXG4gICAgICAgIC8vIGhhbmdzIG9uIGEgcHJvbWlzZSB3aG9zZSB0aW1lciB3YXMganVzdCBjbGVhcmVkLlxuICAgICAgICByZWplY3RXYWl0ZXJzKHNpbmtFcnJvcik7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gRHVyYWJpbGl0eSBiYXJyaWVyIGZvciBvd25lcnMgdGhhdCBjb21wbGV0ZSB3aXRob3V0IGNsb3NpbmcgdGhlXG4gICAgLy8gc3RyZWFtOiBgZmx1c2hhYmxlUGlwZWAncyBsb2NrLXJlbGVhc2UgY29tcGxldGlvbiBhd2FpdHMgdGhpcyBzbyBhXG4gICAgLy8gc3RlcCBjYW5ub3QgZmluaXNoIChhbmQgdGhlIGZ1bmN0aW9uIHN1c3BlbmQpIHdoaWxlIGFjY2VwdGVkIGNodW5rc1xuICAgIC8vIGFyZSBzdGlsbCBjbGllbnQtYnVmZmVyZWQgb3IgaW4gZmxpZ2h0LlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTVFJFQU1fRFJBSU5fU1lNQk9MLCB7XG4gICAgICB2YWx1ZTogZHJhaW4sXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBSZS1leHBvcnQgdHlwZXMgZnJvbSB0aGUgbW9kdWxhciBzZXJpYWxpemF0aW9uIG1vZHVsZXMuXG5leHBvcnQgdHlwZSB7XG4gIEJ5dGVTdHJlYW1GcmFtaW5nLFxuICBSZWR1Y2VycyxcbiAgUmV2aXZlcnMsXG4gIFNlcmlhbGl6YWJsZVNwZWNpYWwsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcyc7XG5cbi8vIEltcG9ydCB0eXBlcyBsb2NhbGx5IGZvciB1c2Ugd2l0aGluIHRoaXMgZmlsZS5cbmltcG9ydCB0eXBlIHtcbiAgQnl0ZVN0cmVhbUZyYW1pbmcsXG4gIFJlZHVjZXJzLFxuICBSZXZpdmVycyxcbiAgU2VyaWFsaXphYmxlU3BlY2lhbCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcblxuLy8gLS0tLSBDb21wb3NlZCByZWR1Y2VycyAtLS0tXG4vLyBDb21wb3NlcyBtb2R1bGFyIHJlZHVjZXJzIChjb21tb24sIGNsYXNzLCBzdGVwLWZ1bmN0aW9uKSB3aXRoXG4vLyBtb2RlLXNwZWNpZmljIFJlcXVlc3QvUmVzcG9uc2UvU3RyZWFtIHJlZHVjZXJzIGJlbG93LlxuXG4vKipcbiAqIEJhc2UgcmVkdWNlcnMgc2hhcmVkIGFjcm9zcyBhbGwgc2VyaWFsaXphdGlvbiBib3VuZGFyaWVzLlxuICogQ29tcG9zZXM6IGNsYXNzICsgc3RlcC1mdW5jdGlvbiArIGNvbW1vbiByZWR1Y2VycyBmcm9tIHRoZSBtb2R1bGFyIG1vZHVsZXMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEJhc2VSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICBjb25zdCByZXF1ZXN0UHJvdG90eXBlID0gb25jZSgoKSA9PiBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnUmVxdWVzdCcpKTtcbiAgY29uc3QgcmVzcG9uc2VQcm90b3R5cGUgPSBvbmNlKCgpID0+XG4gICAgZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ1Jlc3BvbnNlJylcbiAgKTtcbiAgLy8gQ2xhc3MvSW5zdGFuY2UgTVVTVCBjb21lIGJlZm9yZSBFcnJvciBzbyB0aGF0IGN1c3RvbSBFcnJvciBzdWJjbGFzc2VzXG4gIC8vIHdpdGggV09SS0ZMT1dfU0VSSUFMSVpFIHRha2UgcHJlY2VkZW5jZSAoZGV2YWx1ZSB1c2VzIGZpcnN0LW1hdGNoLXdpbnMpLlxuICByZXR1cm4ge1xuICAgIC4uLmdldENsYXNzUmVkdWNlcnMoKSxcbiAgICAuLi5nZXRTdGVwRnVuY3Rpb25SZWR1Y2VyKCksXG4gICAgLi4uZ2V0Q29tbW9uUmVkdWNlcnMoZ2xvYmFsKSxcbiAgICAvLyBSZXF1ZXN0IGFuZCBSZXNwb25zZSByZWR1Y2VycyBhcmUgbW9kZS1zcGVjaWZpYyBhbmQgYWRkZWQgYnlcbiAgICAvLyBnZXRFeHRlcm5hbFJlZHVjZXJzIC8gZ2V0V29ya2Zsb3dSZWR1Y2VycyAvIGdldFN0ZXBSZWR1Y2VycyBiZWxvdy5cbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIC8vIENoYWluIHdhbGsgcmF0aGVyIHRoYW4gYGluc3RhbmNlb2YgZ2xvYmFsLlJlcXVlc3RgOiBzZWUgdGhlXG4gICAgICAvLyBSZWFkYWJsZVN0cmVhbSByZWR1Y2VyIGluIGdldFdvcmtmbG93UmVkdWNlcnMgZm9yIHdoeS4gUmVhZHMgZ29cbiAgICAgIC8vIHRocm91Z2ggZGVzY3JpcHRvcnMgc28gYSBnZXR0ZXIgY2Fubm90IHJ1biB1bnJlcG9ydGVkLlxuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIHJlcXVlc3RQcm90b3R5cGUudmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBkYXRhOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZXF1ZXN0J10gPSB7XG4gICAgICAgIG1ldGhvZDogcmVhZFByb3BlcnR5KHZhbHVlLCAnbWV0aG9kJykgYXMgc3RyaW5nLFxuICAgICAgICB1cmw6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3VybCcpIGFzIHN0cmluZyxcbiAgICAgICAgaGVhZGVyczogcmVhZFByb3BlcnR5KHZhbHVlLCAnaGVhZGVycycpIGFzIEhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2JvZHknKSBhcyBSZWFkYWJsZVN0cmVhbSB8IG51bGwsXG4gICAgICAgIGR1cGxleDogcmVhZFByb3BlcnR5KHZhbHVlLCAnZHVwbGV4JykgYXMgJ2hhbGYnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSByZWFkUHJvcGVydHkodmFsdWUsIFdFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUpIGFzXG4gICAgICAgIHwgV3JpdGFibGVTdHJlYW08UmVzcG9uc2U+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgZGF0YS5yZXNwb25zZVdyaXRhYmxlID0gcmVzcG9uc2VXcml0YWJsZTtcbiAgICAgIH1cbiAgICAgIC8vIEZvcndhcmQgdGhlIHNpZ25hbCBpbiB0d28gY2FzZXM6XG4gICAgICAvLyAgIDEuIEFscmVhZHkgYWJvcnRlZCDigJQgcHJlc2VydmUgYWJvcnRlZD10cnVlL3JlYXNvbiBzbyB0aGUgaHlkcmF0ZWRcbiAgICAgIC8vICAgICAgc3RlcCBzZWVzIHRoZSBjYW5jZWxsYXRpb24gdGhhdCBoYXBwZW5lZCBiZWZvcmUgc2VyaWFsaXplLlxuICAgICAgLy8gICAyLiBBbHJlYWR5IHRhZ2dlZCB3aXRoIHdvcmtmbG93IGluZnJhc3RydWN0dXJlIOKAlCBpLmUuIGEgc2lnbmFsXG4gICAgICAvLyAgICAgIGZyb20gYSB3b3JrZmxvdy1tYW5hZ2VkIEFib3J0Q29udHJvbGxlciwgd2hpY2ggaGFzIHN0cmVhbS9ob29rXG4gICAgICAvLyAgICAgIGJhY2tpbmcgZm9yIGNyb3NzLWJvdW5kYXJ5IHByb3BhZ2F0aW9uLlxuICAgICAgLy8gUGxhaW4gbm9uLWFib3J0ZWQgbmF0aXZlIHNpZ25hbHMgYXJlIGludGVudGlvbmFsbHkgZHJvcHBlZCAod291bGRcbiAgICAgIC8vIG1pbnQgc3RyZWFtIGluZnJhIGZvciBldmVyeSBSZXF1ZXN0LCBpbmNsdWRpbmcgdGhlIGF1dG8tZ2VuZXJhdGVkXG4gICAgICAvLyBzaWduYWwgb24gYG5ldyBSZXF1ZXN0KHVybClgKS5cbiAgICAgIGNvbnN0IHNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgaWYgKFxuICAgICAgICBzaWduYWwgJiZcbiAgICAgICAgKHJlYWRQcm9wZXJ0eShzaWduYWwsICdhYm9ydGVkJykgfHxcbiAgICAgICAgICByZWFkUHJvcGVydHkoc2lnbmFsLCBBQk9SVF9TVFJFQU1fTkFNRSkpXG4gICAgICApIHtcbiAgICAgICAgZGF0YS5zaWduYWwgPSBzaWduYWwgYXMgQWJvcnRTaWduYWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFNlZSB0aGUgUmVxdWVzdCByZWR1Y2VyIGFib3ZlLlxuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIHJlc3BvbnNlUHJvdG90eXBlLnZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogcmVhZFByb3BlcnR5KHZhbHVlLCAndHlwZScpIGFzIFJlc3BvbnNlWyd0eXBlJ10sXG4gICAgICAgIHVybDogcmVhZFByb3BlcnR5KHZhbHVlLCAndXJsJykgYXMgc3RyaW5nLFxuICAgICAgICBzdGF0dXM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3N0YXR1cycpIGFzIG51bWJlcixcbiAgICAgICAgc3RhdHVzVGV4dDogcmVhZFByb3BlcnR5KHZhbHVlLCAnc3RhdHVzVGV4dCcpIGFzIHN0cmluZyxcbiAgICAgICAgaGVhZGVyczogcmVhZFByb3BlcnR5KHZhbHVlLCAnaGVhZGVycycpIGFzIEhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2JvZHknKSBhcyBSZWFkYWJsZVN0cmVhbSB8IG51bGwsXG4gICAgICAgIHJlZGlyZWN0ZWQ6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3JlZGlyZWN0ZWQnKSBhcyBib29sZWFuLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNoYXJlZCBhYm9ydCByZWR1Y2VyIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIEFib3J0U2VyaWFsaXplZERhdGEgPSB7XG4gIHN0cmVhbU5hbWU6IHN0cmluZztcbiAgaG9va1Rva2VuOiBzdHJpbmc7XG4gIGFib3J0ZWQ6IGJvb2xlYW47XG4gIHJlYXNvbjogdW5rbm93bjtcbn07XG5cbi8qKlxuICogU3ltYm9sLWtleWVkIGludGVybmFsIGZpZWxkcyB0YWdnZWQgb250byBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWxcbiAqIGluc3RhbmNlcyAoYW5kIGBob2xkZXJgcyBpbiByZWR1Y2VyIGhlbHBlcnMpLiBBbGwgb3B0aW9uYWwg4oCUIGEgcGxhaW5cbiAqIG5hdGl2ZSBpbnN0YW5jZSBoYXMgbm9uZSBvZiB0aGVtIHNldC5cbiAqL1xudHlwZSBBYm9ydEludGVybmFscyA9IHtcbiAgW0FCT1JUX1NUUkVBTV9OQU1FXT86IHN0cmluZztcbiAgW0FCT1JUX0hPT0tfVE9LRU5dPzogc3RyaW5nO1xuICBbQUJPUlRfUkVBREVSX0NBTkNFTF0/OiBBYm9ydENvbnRyb2xsZXI7XG59O1xuXG50eXBlIEFib3J0U2lnbmFsTGlrZSA9IEFib3J0SW50ZXJuYWxzICYge1xuICBhYm9ydGVkOiBib29sZWFuO1xuICByZWFzb24/OiB1bmtub3duO1xuICBhZGRFdmVudExpc3RlbmVyPzogRnVuY3Rpb247XG59O1xuXG50eXBlIEFib3J0SG9sZGVyID0gQWJvcnRJbnRlcm5hbHMgJiB7IHNpZ25hbD86IEFib3J0SW50ZXJuYWxzIH07XG5cbi8qKlxuICogU2hhcmVkIGxvZ2ljIGZvciBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgcmVkdWNlcnMgaW4gZXh0ZXJuYWwgYW5kIHN0ZXBcbiAqIGNvbnRleHRzLiBBc3NpZ25zIHN0cmVhbS9ob29rIG5hbWVzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQsIG9wdGlvbmFsbHlcbiAqIGF0dGFjaGVzIGFuIGFib3J0IGxpc3RlbmVyIGZvciByZWFsLXRpbWUgcHJvcGFnYXRpb24sIGFuZCByZXR1cm5zIHRoZVxuICogc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gIHNpZ25hbDogQWJvcnRTaWduYWxMaWtlLFxuICBob2xkZXI6IEFib3J0SG9sZGVyLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogQWJvcnRTZXJpYWxpemVkRGF0YSB7XG4gIGxldCBzdHJlYW1OYW1lID0gaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgbGV0IGhvb2tUb2tlbiA9IGhvbGRlcltBQk9SVF9IT09LX1RPS0VOXTtcbiAgaWYgKCFzdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgaWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICBzdHJlYW1OYW1lID0gZ2V0QWJvcnRTdHJlYW1JZChpZCk7XG4gICAgaG9va1Rva2VuID0gYGFicnRfJHtpZH1gO1xuICAgIGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV0gPSBzdHJlYW1OYW1lO1xuICAgIGhvbGRlcltBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgICBpZiAoaG9sZGVyLnNpZ25hbCkge1xuICAgICAgaG9sZGVyLnNpZ25hbFtBQk9SVF9TVFJFQU1fTkFNRV0gPSBzdHJlYW1OYW1lO1xuICAgICAgaG9sZGVyLnNpZ25hbFtBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgICB9XG4gIH1cblxuICAvLyBEZWR1cGVkIHZpYSBBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRCBtYXJrZXIg4oCUIHNlZSBhdHRhY2hBYm9ydExpc3RlbmVyT25jZS5cbiAgYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UoXG4gICAgc2lnbmFsIGFzIEFib3J0U2lnbmFsLFxuICAgIHN0cmVhbU5hbWUsXG4gICAgcnVuSWQsXG4gICAgY3J5cHRvS2V5LFxuICAgIG9wc1xuICApO1xuXG4gIHJldHVybiB7XG4gICAgc3RyZWFtTmFtZSxcbiAgICBob29rVG9rZW46IGhvb2tUb2tlbiEsXG4gICAgYWJvcnRlZDogc2lnbmFsLmFib3J0ZWQsXG4gICAgcmVhc29uOiBzaWduYWwuYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogU2hhcmVkIGxvZ2ljIGZvciBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgcmVkdWNlcnMgaW4gd29ya2Zsb3cgY29udGV4dC5cbiAqIFJlYWRzIGV4aXN0aW5nIHN0cmVhbS9ob29rIG5hbWVzIGZyb20gc3ltYm9scyAobXVzdCBhbHJlYWR5IGJlIHNldCkuXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUFib3J0QnlTeW1ib2woXG4gIHNpZ25hbDogeyBhYm9ydGVkOiBib29sZWFuOyByZWFzb24/OiB1bmtub3duIH0sXG4gIGhvbGRlcjogQWJvcnRIb2xkZXJcbik6IEFib3J0U2VyaWFsaXplZERhdGEgfCBmYWxzZSB7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPVxuICAgIGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV0gPz8gaG9sZGVyLnNpZ25hbD8uW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgY29uc3QgaG9va1Rva2VuID1cbiAgICBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl0gPz8gaG9sZGVyLnNpZ25hbD8uW0FCT1JUX0hPT0tfVE9LRU5dO1xuICBpZiAoIXN0cmVhbU5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBzdHJlYW0gbmFtZSBpcyBub3Qgc2V0Jyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW1OYW1lLFxuICAgIGhvb2tUb2tlbjogaG9va1Rva2VuISxcbiAgICBhYm9ydGVkOiBzaWduYWwuYWJvcnRlZCxcbiAgICByZWFzb246IHNpZ25hbC5hYm9ydGVkID8gc2lnbmFsLnJlYXNvbiA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYSBzaW5nbGUgYWJvcnQgbGlzdGVuZXIgdG8gYSBzaWduYWwsIGRlZHVwZWQgYWNyb3NzIGNhbGxzLlxuICpcbiAqIEVhY2ggc2VyaWFsaXphdGlvbiBwYXNzIGdvZXMgdGhyb3VnaCB0aGUgcmVkdWNlciwgYnV0IGEgY29udHJvbGxlciBwYXNzZWRcbiAqIHRvIE4gc3RlcHMgd291bGQgb3RoZXJ3aXNlIGFjY3VtdWxhdGUgTiBsaXN0ZW5lcnMg4oCUIGVhY2ggd3JpdGluZyB0aGUgc2FtZVxuICogc3RyZWFtIHBhY2tldCBhbmQgZG91YmxlLWNsb3NpbmcgdGhlIHN0cmVhbSBvbiBhYm9ydC4gVGhlIG1hcmtlciBzeW1ib2xcbiAqIGVuc3VyZXMgdGhlIHN0cmVhbS13cml0ZSBzaWRlLWVmZmVjdCBydW5zIGF0IG1vc3Qgb25jZSBwZXIgKHNpZ25hbCwgcnVuSWQpLlxuICovXG5mdW5jdGlvbiBhdHRhY2hBYm9ydExpc3RlbmVyT25jZShcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgc3RyZWFtTmFtZTogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W11cbik6IHZvaWQge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgaWYgKChzaWduYWwgYXMgYW55KVtBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRF0pIHJldHVybjtcbiAgKHNpZ25hbCBhcyBhbnkpW0FCT1JUX0xJU1RFTkVSX0FUVEFDSEVEXSA9IHRydWU7XG5cbiAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgJ2Fib3J0JyxcbiAgICAoKSA9PiB7XG4gICAgICBvcHMucHVzaChcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRGVoeWRyYXRlIHZpYSB0aGUgc2FtZSBtYWNoaW5lcnkgdGhlIHJlYWRlciB1c2VzIChoeWRyYXRlU3RlcEFyZ3VtZW50cylcbiAgICAgICAgICAgIC8vIHNvIHRoZSByZWFzb24gcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHkgKERPTUV4Y2VwdGlvbixcbiAgICAgICAgICAgIC8vIEVycm9ycywgY3VzdG9tIGNsYXNzZXMsIGV0Yy4pIGFuZCByZXNwZWN0cyB0aGUgcnVuJ3MgZW5jcnlwdGlvbiBrZXkuXG4gICAgICAgICAgICAvLyBBIGJhcmUgSlNPTi5zdHJpbmdpZnkgaGVyZSB3b3VsZCB3cml0ZSBhIHBhY2tldCB0aGUgcmVhZGVyIGNhbid0XG4gICAgICAgICAgICAvLyBkZWNvZGUgYW5kIHRoZSBsaXN0ZW5lci1zaWRlIGFib3J0IHdvdWxkIHByb3BhZ2F0ZSB3aXRoIG5vIHJlYXNvbi5cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgeyBhYm9ydGVkOiB0cnVlLCByZWFzb246IHNpZ25hbC5yZWFzb24gfSxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBzdHJlYW1OYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocGF5bG9hZCBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgc3RyZWFtIHdyaXRlXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0sXG4gICAgeyBvbmNlOiB0cnVlIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBSZWR1Y2VycyBmb3Igc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHRoZSBjbGllbnQgc2lkZSwgcGFzc2luZyBhcmd1bWVudHNcbiAqIHRvIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICogQHBhcmFtIGNyeXB0b0tleVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hlbiBgdHJ1ZWAsIGJ5dGUgc3RyZWFtcyAoYHR5cGU6ICdieXRlcydgKVxuICogICBhcmUgd3JhcHBlZCBpbiBsZW5ndGgtcHJlZml4ZWQgZnJhbWVzIG9uIHRoZSB3aXJlIHNvIHRoZSBjb25zdW1lclxuICogICBjYW4gcmVjb25uZWN0IG9uIHRyYW5zaWVudCBlcnJvcnMuIFNob3VsZCBtYXRjaCB0aGUgdGFyZ2V0IHJ1bidzXG4gKiAgIGNhcGFiaWxpdHkg4oCUIHNlZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHNcbiAqICAgdG8gYGZhbHNlYCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVybmFsUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSBuZXN0ZWQgYFJlYWRhYmxlU3RyZWFtYCBmb3VuZCB3aGlsZSBzZXJpYWxpemluZ1xuICAvLyBpcyBwaXBlZCB0byBpdHMgb3duIHNlcnZlciBzdHJlYW0gaW5kZXBlbmRlbnRseSBvZiB0aGUgb3V0ZXIgc2luaywgc28gaXRzXG4gIC8vIGZpcnN0IGNodW5rIGNhbiByYWNlIGBydW5fc3RhcnRlZGAuIFRocmVhZCB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgaW50byB0aGF0XG4gIC8vIHNpbmsgc28gdGhlIHdyaXRlIG9yZGVycyBhZnRlciB0aGUgcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gL1xuICAvLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuXG4gICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICBydW5JZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICApO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgaWYgKGZyYW1lZEJ5dGVTdHJlYW1zKSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycgJiYgZnJhbWVkQnl0ZVN0cmVhbXMpIHMuZnJhbWluZyA9ICdmcmFtZWQtdjEnO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBGYXN0IHBhdGg6IHdoZW4gdGhlIHdyaXRhYmxlIGlzIGFscmVhZHkgYmFja2VkIGJ5IGEgd29ya2Zsb3dcbiAgICAgIC8vIHNlcnZlciBzdHJlYW0gKGUuZy4gaXQgY2FtZSBmcm9tIGEgc3RlcC1jb250ZXh0IGBnZXRXcml0YWJsZSgpYFxuICAgICAgLy8gb3Igd2FzIGh5ZHJhdGVkIGZyb20gYSB3b3JrZmxvdyBpbnB1dCBieSBgZ2V0U3RlcFJldml2ZXJzYCksXG4gICAgICAvLyBmb3J3YXJkIGl0cyB1bmRlcmx5aW5nIGAocnVuSWQsIG5hbWUpYCB0byB0aGUgcmVjZWl2aW5nIHJ1bi5cbiAgICAgIC8vIFRoZSByZWNlaXZpbmcgcnVuJ3Mgc3RlcC1zaWRlIHJldml2ZXIgb3BlbnMgYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZXMgdGhhdCBydW4nc1xuICAgICAgLy8gZW5jcnlwdGlvbiBrZXkgZGlyZWN0bHksIHNvIHdyaXRlcyBsYW5kIG9uIHRoZSBvcmlnaW5hbCBzdHJlYW1cbiAgICAgIC8vIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgcmVjZWl2aW5nIHJ1biDigJQgbm8gaW4tcHJvY2Vzc1xuICAgICAgLy8gYnJpZGdlIHRpZWQgdG8gdGhlIGRlaHlkcmF0aW5nIHN0ZXAncyBsaWZldGltZS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nTmFtZSA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBjb25zdCBleGlzdGluZ1J1bklkID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV4aXN0aW5nTmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIGV4aXN0aW5nUnVuSWQgPT09ICdzdHJpbmcnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcjogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHtcbiAgICAgICAgICBuYW1lOiBleGlzdGluZ05hbWUsXG4gICAgICAgICAgcnVuSWQ6IGV4aXN0aW5nUnVuSWQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUHVibGljS2V5ID0gKHZhbHVlIGFzIGFueSlbXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTFxuICAgICAgICBdO1xuICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRlc2NyaXB0b3IuZW5jcnlwdGlvblB1YmxpY0tleSA9IGV4aXN0aW5nUHVibGljS2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRGVwbG95bWVudElkID0gKHZhbHVlIGFzIGFueSlbXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTFxuICAgICAgICBdO1xuICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nRGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRlc2NyaXB0b3IuZGVwbG95bWVudElkID0gZXhpc3RpbmdEZXBsb3ltZW50SWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShydW5JZCwgbmFtZSk7XG4gICAgICBvcHMucHVzaChyZWFkYWJsZS5waXBlVG8odmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHsgbmFtZSB9O1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0Q29udHJvbGxlciB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlciAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZS5zaWduYWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0U2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRTaWduYWwgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHBhc3NpbmcgcmV0dXJuIHZhbHVlIHRvIHRoZSBjbGllbnQgc2lkZSBhbmQgaW50byBzdGVwIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcmV0dXJuc1xuICovXG4vKipcbiAqIFByb3RvdHlwZXMgdXNlZCBmb3IgYnJhbmQtc3R5bGUgaWRlbnRpZmljYXRpb24gaW4gdGhlIHJlZHVjZXJzIGJlbG93LlxuICpcbiAqIFRoZSBzdHJlYW0gYW5kIGFib3J0IGNsYXNzZXMgYXJlIGhvc3QgY2xhc3NlcyBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LCBzb1xuICogaW5zdGFuY2VzIGNhcnJ5IHRoZSBob3N0IHByb3RvdHlwZSBpbiB0aGVpciBjaGFpbiBhbmQgYSBjaGFpbiB3YWxrXG4gKiBpZGVudGlmaWVzIHRoZW0gd2l0aG91dCBjb25zdWx0aW5nIGBTeW1ib2wuaGFzSW5zdGFuY2VgIG9uIHRoZSBzYW5kYm94XG4gKiBjbGFzcy4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgcnVudGltZSBsYWNrcyB0aGUgY2xhc3MsIGluIHdoaWNoIGNhc2VcbiAqIGlkZW50aWZpY2F0aW9uIGZhbGxzIGJhY2sgdG8gdGhlIGluZnJhc3RydWN0dXJlIHN5bWJvbHMgYWxvbmUuXG4gKi9cbi8qKlxuICogVGhlIHByb3RvdHlwZSBvZiBhIGhvc3QgY2xhc3MgdGhhdCBtYXkgYWxzbyBiZSBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LlxuICogUHJlZmVycyB0aGUgc2FuZGJveCBiaW5kaW5nICh0aGUgc2FtZSBob3N0IGNsYXNzIG9iamVjdCBpbiBwcmFjdGljZSkgYW5kXG4gKiBmYWxscyBiYWNrIHRvIHRoZSBob3N0J3Mgb3duLCBzbyBhIGNoYWluIHdhbGsgaWRlbnRpZmllcyBpbnN0YW5jZXMgZnJvbVxuICogZWl0aGVyIHJlYWxtIHdpdGhvdXQgY29uc3VsdGluZyBgU3ltYm9sLmhhc0luc3RhbmNlYC5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdENsYXNzUHJvdG90eXBlKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG5hbWU6IHN0cmluZ1xuKTogb2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgLy8gRGVzY3JpcHRvciByZWFkcyAoYHJlYWRQcm9wZXJ0eWApLCBub3QgYmFyZSBnZXRzOiBhbiBhY2Nlc3NvciBvciBQcm94eVxuICAvLyBwbGFudGVkIG9uIHRoZSBzYW5kYm94IGdsb2JhbCAob3IgdGhlIGNvbnN0cnVjdG9yKSBtdXN0IGJlIHJlY29yZGVkIGluXG4gIC8vIHRoZSBndWVzdC1jb2RlIHNpbmsg4oCUIGl0IGdhdGVzIFZNIHJldGVudGlvbiDigJQgbm90IHNpbGVudGx5IGV4ZWN1dGVkLlxuICAvLyBDYWxsZXJzIHdyYXAgdGhpcyBpbiBgb25jZSguLi4pYCBwZXIgcmVkdWNlciBzZXQsIHNvIHRoZSByZWFkIGhhcHBlbnNcbiAgLy8gZXhhY3RseSBvbmNlIHBlciBzZXJpYWxpemUgcGFzcywgb24gdGhlIGZpcnN0IGd1YXJkIGludm9jYXRpb24g4oCUIGluc2lkZVxuICAvLyB0aGUgcGFzcydzIHNpbmsgc2NvcGUsIG5ldmVyIHBlciB2YWx1ZS5cbiAgY29uc3QgY3RvciA9IHJlYWRQcm9wZXJ0eShnbG9iYWwsIG5hbWUpID8/IHJlYWRQcm9wZXJ0eShnbG9iYWxUaGlzLCBuYW1lKTtcbiAgaWYgKHR5cGVvZiBjdG9yICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcmVhZFByb3BlcnR5KGN0b3IsICdwcm90b3R5cGUnKSBhcyBvYmplY3QgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd1JlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIGNvbnN0IHJlYWRhYmxlU3RyZWFtUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdSZWFkYWJsZVN0cmVhbScpXG4gICk7XG4gIGNvbnN0IHdyaXRhYmxlU3RyZWFtUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdXcml0YWJsZVN0cmVhbScpXG4gICk7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlclByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnQWJvcnRDb250cm9sbGVyJylcbiAgKTtcbiAgY29uc3QgYWJvcnRTaWduYWxQcm90b3R5cGUgPSBvbmNlKCgpID0+XG4gICAgZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ0Fib3J0U2lnbmFsJylcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRBbGxCYXNlUmVkdWNlcnMoZ2xvYmFsKSxcblxuICAgIC8vIFJlYWRhYmxlL1dyaXRhYmxlIHN0cmVhbXMgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudFxuICAgIC8vIGFyZSBzaW1wbHkgXCJoYW5kbGVzXCIgdGhhdCBjYW4gYmUgcGFzc2VkIGFyb3VuZCB0byBvdGhlciBzdGVwcy5cbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBXYWxrIHRoZSBwcm90b3R5cGUgY2hhaW4gaW5zdGVhZCBvZiBgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW1gOlxuICAgICAgLy8gdGhlIGNsYXNzIGlzIGhvc3QtcHJvdmlkZWQgKGluamVjdGVkIGludG8gdGhlIHNhbmRib3gpLCBzbyBpdHNcbiAgICAgIC8vIHByb3RvdHlwZSBpcyBpbiB0aGUgY2hhaW4gb2YgYm90aCByZWFsIHN0cmVhbXMgYW5kIHRoZVxuICAgICAgLy8gYE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlKWAgaGFuZGxlcyB1c2VkIGZvciByZXF1ZXN0XG4gICAgICAvLyBib2RpZXMg4oCUIGJ1dCBhIGNoYWluIHdhbGsgbmV2ZXIgY29uc3VsdHMgYFN5bWJvbC5oYXNJbnN0YW5jZWAsIHdoaWNoXG4gICAgICAvLyB0aGUgc2FuZGJveCBjYW4gZGVmaW5lIGFuZCB3aGljaCByYW4gZm9yIGV2ZXJ5IHZhbHVlIHRoZSBlYXJsaWVyXG4gICAgICAvLyByZWR1Y2VycyBkaWQgbm90IGNsYWltLiBSZWFkcyBiZWxvdyBnbyB0aHJvdWdoIGRlc2NyaXB0b3JzIHNvIGFcbiAgICAgIC8vIGdldHRlciBvbiBhIHN0ZXAgYXJndW1lbnQgY2Fubm90IHJ1biB1bnJlcG9ydGVkLlxuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIHJlYWRhYmxlU3RyZWFtUHJvdG90eXBlLnZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZmFrZSBzdHJlYW0gc3RvcmluZyBCb2R5SW5pdCBmcm9tIFJlcXVlc3QvUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IGJvZHlJbml0ID0gcmVhZFByb3BlcnR5KHZhbHVlLCBCT0RZX0lOSVRfU1lNQk9MKTtcbiAgICAgIGlmIChib2R5SW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBmYWtlIHN0cmVhbSAtIHNlcmlhbGl6ZSB0aGUgQm9keUluaXQgZGlyZWN0bHlcbiAgICAgICAgLy8gZGV2YWx1ZSB3aWxsIGhhbmRsZSBzZXJpYWxpemluZyBzdHJpbmdzLCBVaW50OEFycmF5LCBldGMuXG4gICAgICAgIHJldHVybiB7IGJvZHlJbml0IH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9OQU1FX1NZTUJPTCkgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignUmVhZGFibGVTdHJlYW0gYG5hbWVgIGlzIG5vdCBzZXQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHM6IEV4dHJhY3Q8XG4gICAgICAgIFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10sXG4gICAgICAgIHsgbmFtZTogc3RyaW5nIH1cbiAgICAgID4gPSB7IG5hbWUgfTtcbiAgICAgIGNvbnN0IHR5cGUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9UWVBFX1NZTUJPTCkgYXNcbiAgICAgICAgfCAnYnl0ZXMnXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBjb25zdCBmcmFtaW5nID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fRlJBTUlOR19TWU1CT0wpIGFzXG4gICAgICAgIHwgQnl0ZVN0cmVhbUZyYW1pbmdcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2VlIHRoZSBSZWFkYWJsZVN0cmVhbSByZWR1Y2VyIGFib3ZlIGZvciB3aHkgdGhpcyB3YWxrcyB0aGUgY2hhaW4uXG4gICAgICBpZiAoIWlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgd3JpdGFibGVTdHJlYW1Qcm90b3R5cGUudmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBuYW1lID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fTkFNRV9TWU1CT0wpIGFzIHN0cmluZztcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlU3RyZWFtIGBuYW1lYCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICAvLyBXaGVuIHRoZSBoYW5kbGUgd2FzIGZvcndhcmRlZCBmcm9tIGFub3RoZXIgcnVuIChwYXJlbnQg4oaSIGNoaWxkXG4gICAgICAvLyB2aWEgYHN0YXJ0KClgKSwgcHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQgc28gdGhlIHN0ZXAtc2lkZVxuICAgICAgLy8gcmV2aXZlciBvcGVucyB0aGUgd3JpdGFibGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgICAgY29uc3QgZm9yZWlnblJ1bklkID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wpO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUnVuSWQgPT09ICdzdHJpbmcnKSBzLnJ1bklkID0gZm9yZWlnblJ1bklkO1xuICAgICAgY29uc3QgZm9yZWlnbkRlcGxveW1lbnRJZCA9IHJlYWRQcm9wZXJ0eShcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xcbiAgICAgICk7XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcmVpZ25QdWJsaWNLZXkgPSByZWFkUHJvcGVydHkoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXG4gICAgICApO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBmb3JlaWduUHVibGljS2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBpbiB3b3JrZmxvdyBjb250ZXh0IOKAlCBqdXN0IHJlYWQgc3ltYm9scyAoaGFuZGxlcykuXG4gICAgLy8gSW4gdGhlIHdvcmtmbG93IFZNLCBnbG9iYWwuQWJvcnRDb250cm9sbGVyIGlzIGEgY2xhc3MgYnV0IGdsb2JhbC5BYm9ydFNpZ25hbFxuICAgIC8vIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgYSBjbGFzcyksIHNvIGluc3RhbmNlb2YgY2hlY2tzIHdvbid0IHdvcmsgZm9yIHNpZ25hbHMuXG4gICAgLy8gRGV0ZWN0IGluc3RhbmNlcyBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIEFCT1JUX1NUUkVBTV9OQU1FIHN5bWJvbCBpbnN0ZWFkLlxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBgdmFsdWUuc2lnbmFsYCB3YXMgYSBiYXJlIHJlYWQsIHNvIGEgYHNpZ25hbGAgZ2V0dGVyIG9uIGFueSBvYmplY3RcbiAgICAgIC8vIHJlYWNoaW5nIHRoaXMgcmVkdWNlciBleGVjdXRlZCB1bnJlcG9ydGVkLiBSZWFkIHRocm91Z2ggZGVzY3JpcHRvcnNcbiAgICAgIC8vIGFuZCBnYXRlIG9uIHRoZSBpbmZyYXN0cnVjdHVyZSBzeW1ib2wgLyBwcm90b3R5cGUgZmlyc3QuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgaG9sZGVyID0gdmFsdWUgYXMgQWJvcnRDb250cm9sbGVyICYgQWJvcnRIb2xkZXI7XG4gICAgICBjb25zdCBvd25TeW1ib2wgPSByZWFkUHJvcGVydHkodmFsdWUsIEFCT1JUX1NUUkVBTV9OQU1FKTtcbiAgICAgIGNvbnN0IGlzTmF0aXZlQWJvcnRDb250cm9sbGVyID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyUHJvdG90eXBlLnZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKG93blN5bWJvbCA9PT0gdW5kZWZpbmVkICYmICFpc05hdGl2ZUFib3J0Q29udHJvbGxlcikge1xuICAgICAgICAvLyBOb3Qgb3VycyBhbmQgbm90IGEgbmF0aXZlIGNvbnRyb2xsZXIg4oCUIGJ1dCBhIGZvcmVpZ24gY29udHJvbGxlclxuICAgICAgICAvLyBtYXkgc3RpbGwgY2FycnkgdGhlIHN5bWJvbCBvbiBpdHMgc2lnbmFsLlxuICAgICAgICBjb25zdCBtYXliZVNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWF5YmVTaWduYWwgPT09IG51bGwgfHxcbiAgICAgICAgICB0eXBlb2YgbWF5YmVTaWduYWwgIT09ICdvYmplY3QnIHx8XG4gICAgICAgICAgcmVhZFByb3BlcnR5KG1heWJlU2lnbmFsLCBBQk9SVF9TVFJFQU1fTkFNRSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgaWYgKCFzaWduYWwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHNpZ25hbCBhcyBBYm9ydFNpZ25hbCwgaG9sZGVyKTtcbiAgICB9LFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBoYXNBYm9ydFN5bWJvbCA9XG4gICAgICAgIHJlYWRQcm9wZXJ0eSh2YWx1ZSwgQUJPUlRfU1RSRUFNX05BTUUpICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpc05hdGl2ZUFib3J0U2lnbmFsID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRTaWduYWxQcm90b3R5cGUudmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAoIWhhc0Fib3J0U3ltYm9sICYmICFpc05hdGl2ZUFib3J0U2lnbmFsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRCeVN5bWJvbCh2YWx1ZSBhcyBBYm9ydFNpZ25hbCwgdmFsdWUgYXMgQWJvcnRIb2xkZXIpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcGFzc2luZyByZXR1cm4gdmFsdWUgdG8gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBnZXRTdGVwUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSByZXR1cm5lZCBgUmVhZGFibGVTdHJlYW1gIGlzIHBpcGVkIHRvIHRoZSBzZXJ2ZXJcbiAgLy8gYWZ0ZXIgdGhlIGJvZHkgYnV0IHdpdGhpbiB0aGUgc2FtZSBvcCBmbHVzaCwgc28gaXRzIGZpcnN0IGNodW5rIGNhbiByYWNlXG4gIC8vIGBydW5fc3RhcnRlZGAuIFRocmVhZCB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgaW50byB0aGUgc2luayBzbyB0aGF0IHdyaXRlXG4gIC8vIG9yZGVycyBhZnRlciB0aGUgcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdHJlYW0gYWxyZWFkeSBoYXMgdGhlIG5hbWUgc3ltYm9sIHNldCwgaW4gd2hpY2ggY2FzZVxuICAgICAgLy8gaXQncyBhbHJlYWR5IGJlaW5nIHN1bmsgdG8gdGhlIHNlcnZlciBhbmQgd2UgY2FuIGp1c3QgcmV0dXJuIHRoZVxuICAgICAgLy8gbmFtZSBhbmQgdHlwZS5cbiAgICAgIGxldCBuYW1lID0gdmFsdWVbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGxldCB0eXBlID0gdmFsdWVbU1RSRUFNX1RZUEVfU1lNQk9MXTtcbiAgICAgIC8vIFRoZSBmcmFtaW5nIHN5bWJvbCBpcyBzZXQgd2hlbiBhIHdvcmtmbG93IFZNIHJldml2ZXMgYSBzdHJlYW1cbiAgICAgIC8vIGhhbmRsZSBmcm9tIGEgcHJldmlvdXMgc3RlcCAoc2VlIGBnZXRXb3JrZmxvd1Jldml2ZXJzYCkuIFdoZW5cbiAgICAgIC8vIHByZXNlbnQgd2UgbXVzdCBwcm9wYWdhdGUgdGhlIHNhbWUgZnJhbWluZyBjaG9pY2Ugb24gdGhlIHdheVxuICAgICAgLy8gYmFjayBvdXQsIHNpbmNlIHRoZSBieXRlcyBhbHJlYWR5IG9uIHRoZSBzZXJ2ZXIncyBzdHJlYW0gYXJlIGluXG4gICAgICAvLyB0aGF0IGZvcm1hdCDigJQgc3dpdGNoaW5nIGZvcm1hdCBtaWQtc3RyZWFtIHdvdWxkIGNvcnJ1cHQgdGhlbS5cbiAgICAgIGxldCBmcmFtaW5nOiBCeXRlU3RyZWFtRnJhbWluZyB8IHVuZGVmaW5lZCA9IHZhbHVlW1NUUkVBTV9GUkFNSU5HX1NZTUJPTF07XG5cbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICBjb25zdCBzdHJlYW1JZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgICAgICBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgICB0eXBlID0gZ2V0U3RyZWFtVHlwZSh2YWx1ZSk7XG4gICAgICAgIGZyYW1pbmcgPSB0eXBlID09PSAnYnl0ZXMnICYmIGZyYW1lZEJ5dGVTdHJlYW1zID8gJ2ZyYW1lZC12MScgOiBmcmFtaW5nO1xuXG4gICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgICBpZiAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgICAgICB2YWx1ZS5waXBlVGhyb3VnaChnZXRCeXRlRnJhbWluZ1N0cmVhbSgpKS5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHMucHVzaCh2YWx1ZS5waXBlVG8od3JpdGFibGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3BzLnB1c2goXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgICAgZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgICAgICAgICAgZ2V0U3RlcFJlZHVjZXJzKFxuICAgICAgICAgICAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGNyeXB0b0tleSxcbiAgICAgICAgICAgICAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVhZGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG5cbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5Xcml0YWJsZVN0cmVhbSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgbGV0IG5hbWUgPSB2YWx1ZVtTVFJFQU1fTkFNRV9TWU1CT0xdO1xuICAgICAgY29uc3QgZm9yZWlnblJ1bklkID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICBjb25zdCBzdHJlYW1JZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgICAgICBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShydW5JZCwgbmFtZSlcbiAgICAgICAgICAgIC5waXBlVGhyb3VnaChcbiAgICAgICAgICAgICAgZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5KSxcbiAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGVUbyh2YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUnVuSWQgPT09ICdzdHJpbmcnKSBzLnJ1bklkID0gZm9yZWlnblJ1bklkO1xuICAgICAgY29uc3QgZm9yZWlnblB1YmxpY0tleSA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0xdO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBmb3JlaWduUHVibGljS2V5O1xuICAgICAgfVxuICAgICAgY29uc3QgZm9yZWlnbkRlcGxveW1lbnRJZCA9ICh2YWx1ZSBhcyBhbnkpW1xuICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXG4gICAgICBdO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduRGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmRlcGxveW1lbnRJZCA9IGZvcmVpZ25EZXBsb3ltZW50SWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydENvbnRyb2xsZXIgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUuc2lnbmFsLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWdsb2JhbC5BYm9ydFNpZ25hbCB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0U2lnbmFsICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRTaWduYWwpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIENhbmNlbCBkYW5nbGluZyBhYm9ydC1zdHJlYW0gcmVhZGVycyBvbiBhbnkgQWJvcnRDb250cm9sbGVyIGluc3RhbmNlcyBmb3VuZFxuICogaW4gdGhlIGh5ZHJhdGVkIHN0ZXAgYXJndW1lbnRzLiBDYWxsZWQgYWZ0ZXIgdGhlIHN0ZXAgZnVuY3Rpb24gcmV0dXJuc1xuICogKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkgdG8gcHJldmVudCByZWFkZXIgcHJvbWlzZXMgZnJvbSBrZWVwaW5nIHRoZSBzZXJ2ZXJsZXNzXG4gKiBmdW5jdGlvbiBhbGl2ZSBpbmRlZmluaXRlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5jZWxBYm9ydFJlYWRlcnMoLi4udmFsdWVzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBXZWFrU2V0KCk7XG4gIGZ1bmN0aW9uIGNhbmNlbElmUHJlc2VudCh2YWw6IEFib3J0SW50ZXJuYWxzKTogdm9pZCB7XG4gICAgY29uc3QgY2FuY2VsID0gdmFsW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICAgIGlmIChjYW5jZWwgJiYgIWNhbmNlbC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgY2FuY2VsLmFib3J0KCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHdhbGsodmFsOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09ICdvYmplY3QnKSByZXR1cm47XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHZhbCBhcyBvYmplY3QpKSByZXR1cm47XG4gICAgdmlzaXRlZC5hZGQodmFsIGFzIG9iamVjdCk7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFib3J0Q29udHJvbGxlcikge1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbCBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEludGVybmFscyk7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKSB7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsKSB3YWxrKGl0ZW0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsLnZhbHVlcygpKSB3YWxrKHYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsKSB3YWxrKHYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZXF1ZXN0L1Jlc3BvbnNlIGV4cG9zZSBgc2lnbmFsYC9gYm9keWAgYXMgcHJvdG90eXBlIGdldHRlcnMsIHNvXG4gICAgLy8gT2JqZWN0LnZhbHVlcygpIHdvbid0IGZpbmQgdGhlbS4gRGVzY2VuZCBleHBsaWNpdGx5LlxuICAgIGlmICh0eXBlb2YgUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsIGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgd2Fsayh2YWwuc2lnbmFsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2IG9mIE9iamVjdC52YWx1ZXModmFsIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkgd2Fsayh2KTtcbiAgfVxuICBmb3IgKGNvbnN0IHYgb2YgdmFsdWVzKSB3YWxrKHYpO1xufVxuXG4vKipcbiAqIFNldHMgdXAgYSBzdHJlYW0gcmVhZGVyIG9uIHRoZSBjb250cm9sbGVyIHRoYXQgbGlzdGVucyBmb3IgYW4gYWJvcnQgcGFja2V0LlxuICogUmV0dXJucyB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXIgc28gaXQgY2FuIGJlIHN0b3JlZCBvbiBib3RoIHRoZVxuICogY29udHJvbGxlciBhbmQgc2lnbmFsIGZvciBjbGVhbnVwIGJ5IGNhbmNlbEFib3J0UmVhZGVycy5cbiAqL1xuZnVuY3Rpb24gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICBydW5JZDogc3RyaW5nLFxuICBzdHJlYW1OYW1lOiBzdHJpbmcsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBjb25zdCByZWFkZXJDYW5jZWwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgb3BzLnB1c2goXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIHN0cmVhbU5hbWUpO1xuICAgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZS5nZXRSZWFkZXIoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICByZWFkZXIucmVhZCgpLFxuICAgICAgICAgIG5ldyBQcm9taXNlPHsgdmFsdWU6IHVuZGVmaW5lZDsgZG9uZTogdHJ1ZSB9PigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlYWRlckNhbmNlbC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZGVyQ2FuY2VsLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAnYWJvcnQnLFxuICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgeyBvbmNlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlICYmICFyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIC8vIEFuIGFib3J0IHBhY2tldCBhcnJpdmVkOiBwcm9wYWdhdGUgaXQgYXMgZmFzdCBhcyBwb3NzaWJsZS4gUmVsZWFzZVxuICAgICAgICAgIC8vIHRoZSBsb2NrIChzeW5jaHJvbm91cykgcmF0aGVyIHRoYW4gY2FuY2VsbGluZyBoZXJlIOKAlCBvbiBhXG4gICAgICAgICAgLy8gc2VydmljZS1iYWNrZWQgV29ybGQgYHJlYWRlci5jYW5jZWwoKWAgY2FuIGRvIGEgbmV0d29yayByb3VuZC10cmlwLFxuICAgICAgICAgIC8vIGFuZCBhd2FpdGluZyBpdCBiZWZvcmUgYGNvbnRyb2xsZXIuYWJvcnQoKWAgd291bGQgZGVsYXkgKG9yLCBpZiBpdFxuICAgICAgICAgIC8vIGhhbmdzLCBkcm9wKSByZWFsLXRpbWUgYWJvcnQgZGVsaXZlcnkgdG8gdGhlIGluLWZsaWdodCBzdGVwLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFJlYWRlciBtYXkgYWxyZWFkeSBiZSByZWxlYXNlZDsgaWdub3JlLlxuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gSHlkcmF0ZSB2aWEgdGhlIHNhbWUgbWFjaGluZXJ5IHRoZSB3cml0ZXIgdXNlZCBzbyB0aGUgcmVhc29uXG4gICAgICAgICAgICAvLyByb3VuZC10cmlwcyB3aXRoIGZ1bGwgdHlwZSBmaWRlbGl0eS4gRW5jcnlwdGlvbiBrZXkgKGlmIGFueSlcbiAgICAgICAgICAgIC8vIGNvbWVzIGZyb20gdGhlIHN0ZXAgY29udGV4dCDigJQgc2V0IHVwIGJ5IHRoZSBzdGVwIGV4ZWN1dG9yIGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhpcyByZWFkZXIgcnVucy4gRmFsbGJhY2sgdG8gdW5kZWZpbmVkIGZvciBleHRlcm5hbC1jb250ZXh0XG4gICAgICAgICAgICAvLyByZXZpdmVzICh0aGUgaHlkcmF0ZSBwYXRoIGlzIGVuY3J5cHRpb24ta2V5LXRvbGVyYW50KS5cbiAgICAgICAgICAgIGNvbnN0IGN0eEZvcktleSA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBjdHhGb3JLZXk/LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICkpIGFzIHsgcmVhc29uPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydChkYXRhPy5yZWFzb24pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgc3RlcCBmaW5pc2hlZCAob3IgdGhlIHJlYWRlciB3YXMgY2FuY2VsbGVkKSB3aXRob3V0IGFuIGFib3J0LlxuICAgICAgICAgIC8vIENhbmNlbCDigJQgbm90IGp1c3QgcmVsZWFzZSDigJQgc28gdGhlIHVuZGVybHlpbmcgV29ybGQgc3RyZWFtIGlzIHRvcm5cbiAgICAgICAgICAvLyBkb3duOiBhIHBvbGxpbmcgV29ybGQgKGUuZy4gd29ybGQtbG9jYWwpIG90aGVyd2lzZSBsZWFrcyBhIHRhaWxcbiAgICAgICAgICAvLyByZWFkZXIgKGEgMTAwbXMgZmlsZXN5c3RlbSBwb2xsIHBsdXMgZW1pdHRlciBsaXN0ZW5lcnMpIHBlciBzdGVwXG4gICAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGxpZmUgb2YgdGhlIHByb2Nlc3MsIHNpbmNlIGEgc2lnbmFsLWJlYXJpbmcgc3RlcFxuICAgICAgICAgIC8vIG9wZW5zIG9uZSBvZiB0aGVzZSBvbiBldmVyeSByZXZpdmFsIGFuZCB1c3VhbGx5IG5ldmVyIGFib3J0cy4gRmlyZVxuICAgICAgICAgIC8vIGFuZCBmb3JnZXQ6IGEgc2VydmljZS1iYWNrZWQgV29ybGQncyBjYW5jZWwgbWF5IGhpdCB0aGUgbmV0d29yayxcbiAgICAgICAgICAvLyBhbmQgdGhpcyBwYXRoIG11c3Qgbm90IGJsb2NrIHRoZSBzdGVwJ3Mgb3BzLXNldHRsZSB3aW5kb3cuXG4gICAgICAgICAgdm9pZCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3RyZWFtIHJlYWQgZmFpbGVkIOKAlCBzaWduYWwgd29uJ3QgcHJvcGFnYXRlIGluIHJlYWwtdGltZSxcbiAgICAgICAgLy8gYnV0IGhvb2stYmFzZWQgcHJvcGFnYXRpb24gb24gbmV4dCByZXBsYXkgcHJvdmlkZXMgZmFsbGJhY2tcbiAgICAgIH1cbiAgICB9KSgpXG4gICk7XG5cbiAgcmV0dXJuIHJlYWRlckNhbmNlbDtcbn1cblxuLyoqXG4gKiBTdG9yZXMgYWJvcnQgc2VyaWFsaXphdGlvbiBzeW1ib2xzIGFuZCB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXJcbiAqIG9uIGJvdGggdGhlIGNvbnRyb2xsZXIgYW5kIGl0cyBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIHRhZ0Fib3J0UGFpcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICB2YWx1ZTogeyBzdHJlYW1OYW1lOiBzdHJpbmc7IGhvb2tUb2tlbjogc3RyaW5nIH0sXG4gIHJlYWRlckNhbmNlbD86IEFib3J0Q29udHJvbGxlclxuKTogdm9pZCB7XG4gIGNvbnN0IHRhZ2dlZENvbnRyb2xsZXIgPSBjb250cm9sbGVyIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCB0YWdnZWRTaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHZhbHVlLnN0cmVhbU5hbWU7XG4gIHRhZ2dlZENvbnRyb2xsZXJbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIHRhZ2dlZFNpZ25hbFtBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIGlmIChyZWFkZXJDYW5jZWwpIHtcbiAgICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gcmVhZGVyQ2FuY2VsO1xuICAgIHRhZ2dlZFNpZ25hbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BhZ2F0ZSBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIGZyb20gb25lIHNpZ25hbCB0byBhbm90aGVyLiBVc2VkIGJ5IHRoZVxuICogUmVxdWVzdCByZXZpdmVyIGJlY2F1c2UgYG5ldyBSZXF1ZXN0KHVybCwgeyBzaWduYWwgfSlgIGNvcGllcyB0aGUgc2lnbmFsXG4gKiBpbnRlcm5hbGx5IOKAlCB0aGUgY29uc3RydWN0ZWQgYHJlcXVlc3Quc2lnbmFsYCBpcyBhIGZyZXNoIEFib3J0U2lnbmFsIHRoYXRcbiAqIGRvZXNuJ3QgY2Fycnkgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBYm9ydEludGVybmFscyhzcmM6IEFib3J0U2lnbmFsLCBkZXN0OiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBjb25zdCBzID0gc3JjIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGNvbnN0IGQgPSBkZXN0IGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGlmIChzW0FCT1JUX1NUUkVBTV9OQU1FXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9TVFJFQU1fTkFNRV0gPSBzW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgfVxuICBpZiAoc1tBQk9SVF9IT09LX1RPS0VOXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9IT09LX1RPS0VOXSA9IHNbQUJPUlRfSE9PS19UT0tFTl07XG4gIH1cbiAgaWYgKHNbQUJPUlRfUkVBREVSX0NBTkNFTF0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSBzW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBYm9ydENvbnRyb2xsZXIgd2l0aCBzdHJlYW0tYmFja2VkIGFib3J0IHByb3BhZ2F0aW9uLlxuICogVXNlZCBieSBzdGVwIGFuZCBleHRlcm5hbCByZXZpdmVycyB3aGVyZSByZWFsIGFib3J0IHNpZ25hbCBiZWhhdmlvciBpcyBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHNlcmlhbGl6ZWQgYWJvcnQgY29udHJvbGxlci9zaWduYWwgZGF0YVxuICogQHBhcmFtIG9wcyAtIFRoZSBvcHMgYXJyYXkgZm9yIHRyYWNraW5nIGFzeW5jIHdvcmtcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKGZvciBzdHJlYW0gcmVhZHMpXG4gKiBAcmV0dXJucyBBIHJlYWwgQWJvcnRDb250cm9sbGVyIHdpdGggcGF0Y2hlZCBhYm9ydCgpIG1ldGhvZFxuICovXG5mdW5jdGlvbiByZXZpdmVBYm9ydENvbnRyb2xsZXIoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydENvbnRyb2xsZXInXSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmdcbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICAgIGNvbnRyb2xsZXIuYWJvcnQodmFsdWUucmVhc29uKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5zdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgcmVhZGVyQ2FuY2VsID0gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBydW5JZCxcbiAgICAgIHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBvcHNcbiAgICApO1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSwgcmVhZGVyQ2FuY2VsKTtcbiAgfSBlbHNlIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGUgYWJvcnQoKSB0byBhbHNvIHdyaXRlIHN0cmVhbSArIHJlc3VtZSBob29rIChmb3Igc3RlcC1pbml0aWF0ZWQgYWJvcnQpXG4gIGNvbnN0IG9yaWdpbmFsQWJvcnQgPSBjb250cm9sbGVyLmFib3J0LmJpbmQoY29udHJvbGxlcik7XG4gIGNvbnRyb2xsZXIuYWJvcnQgPSAocmVhc29uPzogdW5rbm93bikgPT4ge1xuICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgb3JpZ2luYWxBYm9ydChyZWFzb24pO1xuXG4gICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHgub3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB0aGUgYWJvcnQgcGF5bG9hZCB0aHJvdWdoIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgaG9va1xuICAgICAgICAgICAgLy8gZXZlbnQgdXNlcyBzbyB0aGUgYHJlYXNvbmAgcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHlcbiAgICAgICAgICAgIC8vIChET01FeGNlcHRpb24sIGN1c3RvbSBlcnJvcnMsIGV0Yy4pIGFuZCByZXNwZWN0cyB0aGUgcnVuJ3NcbiAgICAgICAgICAgIC8vIGVuY3J5cHRpb24ga2V5IOKAlCBzeW1tZXRyaWMgd2l0aCB3aGF0IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgIC8vIHdyaXRlcyBmb3Igd29ya2Zsb3ctaW5pdGlhdGVkIGFib3J0cy5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9LFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgICAgIGN0eC53b3JrZmxvd01ldGFkYXRhLndvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHZhbHVlLnN0cmVhbU5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShwYXlsb2FkIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG5cbiAgICAgIGlmICh2YWx1ZS5ob29rVG9rZW4pIHtcbiAgICAgICAgLy8gVGhlIGR1cmFibGUgaG9vayByZXN1bWUgKHdoaWNoIHdyaXRlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IHRoYXRcbiAgICAgICAgLy8gcmVjb3JkcyB0aGlzIGFib3J0IGluIHRoZSB3b3JrZmxvdydzIGV2ZW50IGxvZykgbXVzdCBiZSBjb21taXR0ZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBzdGVwIGNvbXBsZXRlcy4gT3RoZXJ3aXNlIHRoZSB3b3JrZmxvdyBjb250aW51YXRpb25cbiAgICAgICAgLy8gZW5xdWV1ZWQgYnkgYHN0ZXBfY29tcGxldGVkYCBjYW4gYWR2YW5jZSBwYXN0IHRoZSBhYm9ydCDigJQgZGlzcGF0Y2hpbmdcbiAgICAgICAgLy8gYSBsYXRlciBzdGVwIHdpdGggYSBzdGFsZSwgbm9uLWFib3J0ZWQgYHNpZ25hbGAg4oCUIGJlZm9yZSB0aGUgZXZlbnRcbiAgICAgICAgLy8gZXhpc3RzLiBSb3V0ZSBpdCB0byBgcHJlQ29tcGxldGlvbk9wc2AgKGF3YWl0ZWQgaW5saW5lIGJlZm9yZVxuICAgICAgICAvLyBjb21wbGV0aW9uKSByYXRoZXIgdGhhbiBgb3BzYCAoYmVzdC1lZmZvcnQsIGJhY2tncm91bmQpLiBUaGUgc3RyZWFtXG4gICAgICAgIC8vIHdyaXRlIGFib3ZlIHN0YXlzIGluIGBvcHNgOiBpdCBtdXN0IGZpcmUgQVNBUCB0byByZWFjaCBhbiBpbi1mbGlnaHRcbiAgICAgICAgLy8gc2libGluZyBzdGVwIGFuZCBpcyBub3QgdGhlIGR1cmFibGUgcmVjb3JkLlxuICAgICAgICAvLyBTd2FsbG93IGVycm9ycyBoZXJlIHNvIHRoZSBwcm9taXNlIGNhbiBvbmx5IGV2ZXIgZW5mb3JjZSBvcmRlcmluZ1xuICAgICAgICAvLyB3aGVuIGF3YWl0ZWQgKHNlZSB0aGUgbm8tcmVqZWN0IGNvbnRyYWN0IG9uXG4gICAgICAgIC8vIFN0ZXBDb250ZXh0LnByZUNvbXBsZXRpb25PcHMpOyBhIGZhaWxlZCByZXN1bWUgcmV0cmllcyBvbiBuZXh0IHJlcGxheS5cbiAgICAgICAgY29uc3QgaG9va1Jlc3VtZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVzdW1lSG9vazogcmVzdW1lSG9va0ZuIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgICAgICcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgcmVzdW1lSG9va0ZuKHZhbHVlLmhvb2tUb2tlbiwge1xuICAgICAgICAgICAgICBhYm9ydGVkOiB0cnVlLFxuICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGhvb2sgcmVzdW1lIOKAlCByZXRyeSBvbiBuZXh0IHJlcGxheVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgY3R4LnByZUNvbXBsZXRpb25PcHMucHVzaChob29rUmVzdW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogUmV2aXZlcyBqdXN0IGFuIEFib3J0U2lnbmFsIHdpdGhvdXQgdGhlIHBhdGNoZWQgYWJvcnQoKSBvdmVyaGVhZC5cbiAqIFVzZWQgd2hlbiBvbmx5IGEgc2lnbmFsIChub3QgYSBjb250cm9sbGVyKSB3YXMgc2VyaWFsaXplZC5cbiAqL1xuZnVuY3Rpb24gcmV2aXZlQWJvcnRTaWduYWwoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydFNpZ25hbCddLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogQWJvcnRTaWduYWwge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGlmICh2YWx1ZS5hYm9ydGVkKSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgICBjb250cm9sbGVyLmFib3J0KHZhbHVlLnJlYXNvbik7XG4gIH0gZWxzZSBpZiAodmFsdWUuc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IHJlYWRlckNhbmNlbCA9IHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgcnVuSWQsXG4gICAgICB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgb3BzXG4gICAgKTtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUsIHJlYWRlckNhbmNlbCk7XG4gIH0gZWxzZSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbn1cblxuLyoqXG4gKiBCYXNlIHJldml2ZXJzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gYm91bmRhcmllcy5cbiAqIENvbXBvc2VzOiBjbGFzcyArIGNvbW1vbiByZXZpdmVycyBmcm9tIHRoZSBtb2R1bGFyIG1vZHVsZXMuXG4gKlxuICogVGhpcyBpcyBleHBvcnRlZCBiZWNhdXNlIHNlcmlhbGl6YXRpb24tZm9ybWF0LnRzIGFuZCBvdGhlciBmaWxlcyByZWZlcmVuY2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzKSB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q2xhc3NSZXZpdmVycyhnbG9iYWwpLFxuICAgIC4uLmdldENvbW1vblJldml2ZXJzRnJvbU1vZHVsZShnbG9iYWwpLFxuICB9IGFzIGNvbnN0IHNhdGlzZmllcyBQYXJ0aWFsPFJldml2ZXJzPjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSB3cml0ZS1vbmx5IGtleSBhIHJ1biBuZWVkcyB3aGVuIHdyaXRpbmcgaW50byBhbm90aGVyIHJ1bidzXG4gKiBmb3J3YXJkZWQgc3RyZWFtLlxuICpcbiAqIFRocmVlIHRpZXJzLCBjaGVhcGVzdCBmaXJzdDpcbiAqXG4gKiAxLiBUaGUgZGVzY3JpcHRvciBjYXJyaWVzIHRoZSBvd25lcidzIFgyNTUxOSBwdWJsaWMga2V5IOKAlCBzZWFsIHRvIGl0IHdpdGhcbiAqICAgIG5vIEkvTyB3aGF0c29ldmVyLiBUaGUgb3duZXIgcHVibGlzaGVkIHRoZSBrZXkgd2hlbiBpdCBjcmVhdGVkIHRoZVxuICogICAgc3RyZWFtLCBzbyB0aGlzIGlzIHRoZSB6ZXJvLXJvdW5kLXRyaXAgcGF0aC5cbiAqIDIuIFRoZSBkZXNjcmlwdG9yIGNhcnJpZXMgdGhlIG93bmVyJ3MgZGVwbG95bWVudCBJRCDigJQgcmVzb2x2ZSB0aGUgb3duZXInc1xuICogICAgc3ltbWV0cmljIGtleSwgd2hpY2ggY3Jvc3MtZGVwbG95bWVudCBtZWFucyBhIGtleS1BUEkgcm91bmQgdHJpcC5cbiAqIDMuIE5laXRoZXIgKGRlc2NyaXB0b3JzIHdyaXR0ZW4gYnkgb2xkZXIgU0RLcykg4oCUIGxvYWQgdGhlIG93bmluZyBydW4gZmlyc3QsXG4gKiAgICB0aGVuIHJlc29sdmUgaXRzIHN5bW1ldHJpYyBrZXkuXG4gKlxuICogVGllcnMgMiBhbmQgMyBpbXBvcnQgdGhlIGtleSBlbmNyeXB0LW9ubHksIHdoaWNoIGlzIGFuIGhvbm9yLXN5c3RlbVxuICogcmVzdHJpY3Rpb246IHRoZSBzYW1lIGJ5dGVzIGNvdWxkIGRlY3J5cHQuIFRpZXIgMSBtYWtlcyBpdCBhIGNyeXB0b2dyYXBoaWNcbiAqIGd1YXJhbnRlZSDigJQgYSBwdWJsaWMga2V5IGNhbm5vdCByZWFkIGFueXRoaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGb3J3YXJkZWRXcml0YWJsZUVuY3J5cHRpb25LZXkoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGRlcGxveW1lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBlbmNyeXB0aW9uUHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBvd25lclB1YmxpY0tleSA9IGRlY29kZVJ1blB1YmxpY0tleShlbmNyeXB0aW9uUHVibGljS2V5KTtcbiAgaWYgKG93bmVyUHVibGljS2V5KSByZXR1cm4gc2VhbFRvKG93bmVyUHVibGljS2V5KTtcblxuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBpZiAoIXdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4pIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcmF3S2V5ID0gZGVwbG95bWVudElkXG4gICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKHJ1bklkLCB7IGRlcGxveW1lbnRJZCB9KVxuICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bihhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCkpO1xuICByZXR1cm4gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSwgWydlbmNyeXB0J10pIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsXG4gKiByZWNlaXZpbmcgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsKSxcblxuICAgIC8vIFN0ZXBGdW5jdGlvbiBzaG91bGQgbm90IGJlIHJldHVybmVkIGZyb20gd29ya2Zsb3dzIHRvIGNsaWVudHNcbiAgICBTdGVwRnVuY3Rpb246ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICdTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIGluIGNsaWVudCBjb250ZXh0LiBTdGVwIGZ1bmN0aW9ucyBzaG91bGQgbm90IGJlIHJldHVybmVkIGZyb20gd29ya2Zsb3dzLicsXG4gICAgICAgIHtcbiAgICAgICAgICBoaW50OiAnQSBzdGVwIGZ1bmN0aW9uIHJlZmVyZW5jZSByZWFjaGVkIHRoZSBjbGllbnQuIFJldHVybiBhIHNlcmlhbGl6YWJsZSB2YWx1ZSAoZS5nLiB0aGUgc3RlcCByZXN1bHQpIGluc3RlYWQgb2YgdGhlIHN0ZXAgaXRzZWxmLicsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcblxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcblxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgJiB7IGR1cGxleD86IHN0cmluZyB9ID0ge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICBkdXBsZXg6IHZhbHVlLmR1cGxleCxcbiAgICAgIH07XG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBpbml0LnNpZ25hbCA9IHZhbHVlLnNpZ25hbDtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgZ2xvYmFsLlJlcXVlc3QodmFsdWUudXJsLCBpbml0KTtcbiAgICAgIC8vIFRoZSBSZXF1ZXN0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gaW50ZXJuYWwgc2lnbmFsIGNvcHksIHNvIHRoZVxuICAgICAgLy8gYWJvcnQtaW50ZXJuYWwgc3ltYm9scyBzZXQgYnkgcmV2aXZlQWJvcnRTaWduYWwgZG9uJ3QgcHJvcGFnYXRlLlxuICAgICAgLy8gUmUtdGFnIHRoZSByZXF1ZXN0J3Mgb3duIHNpZ25hbCBzbyBjYW5jZWxBYm9ydFJlYWRlcnMgY2FuIGZpbmQgaXQuXG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBjb3B5QWJvcnRJbnRlcm5hbHModmFsdWUuc2lnbmFsLCByZXF1ZXN0LnNpZ25hbCk7XG4gICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9LFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIE5vdGU6IFJlc3BvbnNlIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBzdGF0dXMsIHN0YXR1c1RleHQsIGFuZCBoZWFkZXJzXG4gICAgICAvLyBUaGUgdHlwZSwgdXJsLCBhbmQgcmVkaXJlY3RlZCBwcm9wZXJ0aWVzIGFyZSByZWFkLW9ubHkgYW5kIHNldCBieSB0aGUgY29uc3RydWN0b3JcbiAgICAgIHJldHVybiBuZXcgZ2xvYmFsLlJlc3BvbnNlKHZhbHVlLmJvZHksIHtcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBnbG9iYWwuSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gSWYgdGhpcyBoYXMgYm9keUluaXQsIGl0IGNhbWUgZnJvbSBhIFJlc3BvbnNlIGNvbnN0cnVjdG9yXG4gICAgICAvLyBDb252ZXJ0IGl0IHRvIGEgUkVBTCBzdHJlYW0gbm93IHRoYXQgd2UncmUgb3V0c2lkZSB0aGUgd29ya2Zsb3dcbiAgICAgIGlmICgnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGJvZHlJbml0ID0gdmFsdWUuYm9keUluaXQ7XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIFJlc3BvbnNlIGNvbnN0cnVjdG9yIHRvIHByb3Blcmx5IGNvbnZlcnQgQm9keUluaXQgdG8gUmVhZGFibGVTdHJlYW1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgZ2xvYmFsLlJlc3BvbnNlKGJvZHlJbml0KTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIC8vIEZvciBieXRlIHN0cmVhbXMsIHVzZSBmbHVzaGFibGUgcGlwZSB3aXRoIGxvY2sgcG9sbGluZy5cbiAgICAgICAgLy8gSWYgdGhlIHByb2R1Y2VyIHdyb3RlIGZyYW1lZCBieXRlcyAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpLFxuICAgICAgICAvLyB1bndyYXAgdGhlIGxlbmd0aC1wcmVmaXggZW52ZWxvcGUgYmVmb3JlIGhhbmRpbmcgY2h1bmtzIHRvXG4gICAgICAgIC8vIHRoZSB1c2VyLiBBYnNlbnQgLyAncmF3JyBmcmFtaW5nIG1lYW5zIGxlZ2FjeSByYXcgYnl0ZXMg4oCUXG4gICAgICAgIC8vIHBpcGUgdGhyb3VnaCB1bmNoYW5nZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBObyBhdXRvLXJlY29ubmVjdCBoZXJlIHlldDogcmF3IGJ5dGUgc3RyZWFtcyBoYXZlIG5vIHdpcmVcbiAgICAgICAgLy8gZnJhbWluZyB0byBjb3VudCBjb25zdW1lZCBjaHVua3Mgd2l0aC4gRnJhbWVkLXYxIGJ5dGUgc3RyZWFtc1xuICAgICAgICAvLyBtYWtlIGZyYW1lIGNvdW50aW5nIHBvc3NpYmxlLCBzbyBleHRlbmRpbmcgdGhlIHJlY29ubmVjdGluZ1xuICAgICAgICAvLyByZWFkZXIgdG8gdGhlbSBpcyBhIHNlcGFyYXRlIGZvbGxvdy11cC5cbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHZhbHVlLnN0YXJ0SW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgICAvLyBDcmVhdGUgYW4gaWRlbnRpdHkgKG9yIHVuZnJhbWluZykgdHJhbnNmb3JtIHRvIGdpdmUgdGhlIHVzZXIgYSByZWFkYWJsZVxuICAgICAgICBjb25zdCB7IHJlYWRhYmxlOiB1c2VyUmVhZGFibGUsIHdyaXRhYmxlIH0gPVxuICAgICAgICAgIHZhbHVlLmZyYW1pbmcgPT09ICdmcmFtZWQtdjEnXG4gICAgICAgICAgICA/IGdldEJ5dGVVbmZyYW1pbmdTdHJlYW0oKVxuICAgICAgICAgICAgOiBuZXcgZ2xvYmFsLlRyYW5zZm9ybVN0cmVhbSgpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB3cml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgICBwb2xsUmVhZGFibGVMb2NrKHVzZXJSZWFkYWJsZSwgc3RhdGUpO1xuXG4gICAgICAgIHJldHVybiB1c2VyUmVhZGFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb24tYnl0ZSBzdHJlYW1zIGNhcnJ5IGxlbmd0aC1wcmVmaXhlZCBmcmFtZXMsIHNvIHdlIGNhbiBjb3VudFxuICAgICAgICAvLyBjb21wbGV0ZWQgZnJhbWVzIGFuZCB0cmFuc3BhcmVudGx5IHJlY29ubmVjdCB3aGVuIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3Rpb24gdGltZXMgb3V0IG1pZC1ydW4uXG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHZhbHVlLm5hbWUsXG4gICAgICAgICAgdmFsdWUuc3RhcnRJbmRleFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICBnZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5KSxcbiAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgdHJhbnNmb3JtLndyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICAgIHBvbGxSZWFkYWJsZUxvY2sodHJhbnNmb3JtLnJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5yZWFkYWJsZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFNhbWUgaGFuZGxpbmcgYXMgYGdldFN0ZXBSZXZpdmVycy5Xcml0YWJsZVN0cmVhbWAg4oCUIHNlZSBjb21tZW50c1xuICAgICAgLy8gdGhlcmUgZm9yIHRoZSBjcm9zcy1ydW4gY2FzZSAod3JpdGFibGUgY2FycmllcyBgcnVuSWRgIGZyb21cbiAgICAgIC8vIHBhcmVudCDihpIgY2hpbGQgZm9yd2FyZGluZyB2aWEgYHN0YXJ0KClgKS5cbiAgICAgIGNvbnN0IHRhcmdldFJ1bklkID0gdHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJyA/IHZhbHVlLnJ1bklkIDogcnVuSWQ7XG4gICAgICBjb25zdCB0YXJnZXRLZXk6IEVuY3J5cHRpb25LZXlQYXJhbSA9XG4gICAgICAgIHRhcmdldFJ1bklkID09PSBydW5JZFxuICAgICAgICAgID8gY3J5cHRvS2V5XG4gICAgICAgICAgOiBnZXRGb3J3YXJkZWRXcml0YWJsZUVuY3J5cHRpb25LZXkoXG4gICAgICAgICAgICAgIHRhcmdldFJ1bklkLFxuICAgICAgICAgICAgICB2YWx1ZS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXlcbiAgICAgICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZSA9IGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhnbG9iYWwsIG9wcywgdGFyZ2V0UnVuSWQsIHRhcmdldEtleSksXG4gICAgICAgIHRhcmdldEtleVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlcnZlcldyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgIHRhcmdldFJ1bklkLFxuICAgICAgICB2YWx1ZS5uYW1lXG4gICAgICApO1xuXG4gICAgICAvLyBDcmVhdGUgZmx1c2hhYmxlIHN0YXRlIGZvciB0aGlzIHN0cmVhbVxuICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgZmx1c2hhYmxlUGlwZShzZXJpYWxpemUucmVhZGFibGUsIHNlcnZlcldyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICBwb2xsV3JpdGFibGVMb2NrKHNlcmlhbGl6ZS53cml0YWJsZSwgc3RhdGUpO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fTkFNRV9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MLCB7XG4gICAgICAgIHZhbHVlOiB0YXJnZXRSdW5JZCxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgIHNlcmlhbGl6ZS53cml0YWJsZSxcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gS2VlcCB0aGUgb3duZXIncyBwdWJsaWMga2V5IG9uIHRoZSBoYW5kbGUgc28gYSBmdXJ0aGVyIGZvcndhcmQgc3RheXMgb25cbiAgICAgIC8vIHRoZSB6ZXJvLWxvb2t1cCBzZWFsZWQgcGF0aC5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgIHNlcmlhbGl6ZS53cml0YWJsZSxcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5lbmNyeXB0aW9uUHVibGljS2V5LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZS53cml0YWJsZTtcbiAgICB9LFxuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHJldml2ZUFib3J0Q29udHJvbGxlcih2YWx1ZSwgb3BzLCBydW5JZCksXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4gcmV2aXZlQWJvcnRTaWduYWwodmFsdWUsIG9wcywgcnVuSWQpLFxuICB9O1xufVxuXG4vKipcbiAqIFJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHJlY2VpdmluZyBhcmd1bWVudHMgZnJvbSB0aGUgY2xpZW50IHNpZGUsIGFuZCByZXR1cm4gdmFsdWVzXG4gKiBmcm9tIHRoZSBzdGVwcy5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldENvbW1vblJldml2ZXJzKGdsb2JhbCksXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHJldml2ZXIgZm9yIHdvcmtmbG93IGNvbnRleHQgLSB1c2VzIHRoZSBtb2R1bGFyIHJldml2ZXJcbiAgICAvLyB3aGljaCBjYWxscyBXT1JLRkxPV19VU0VfU1RFUCBmcm9tIGdsb2JhbCB0byByZWNvbnN0cnVjdCBzdGVwIHByb3hpZXNcbiAgICAuLi5nZXRTdGVwRnVuY3Rpb25SZXZpdmVyKGdsb2JhbCksXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodmFsdWUsIGdsb2JhbC5SZXF1ZXN0LnByb3RvdHlwZSk7XG4gICAgICBjb25zdCByZXNwb25zZVdyaXRhYmxlID0gdmFsdWUucmVzcG9uc2VXcml0YWJsZTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgICh2YWx1ZSBhcyBhbnkpW1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEVdID0gcmVzcG9uc2VXcml0YWJsZTtcbiAgICAgICAgZGVsZXRlIHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICAgICh2YWx1ZSBhcyBhbnkpLnJlc3BvbmRXaXRoID0gKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICAnYHJlc3BvbmRXaXRoKClgIG11c3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgc3RlcCBmdW5jdGlvbi4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnTW92ZSB0aGUgYHJlc3BvbmRXaXRoKC4uLilgIGNhbGwgaW5zaWRlIGEgYFwidXNlIHN0ZXBcImAgZnVuY3Rpb24g4oCUIGl0IGNhbm5vdCBiZSBpbnZva2VkIGZyb20gYSB3b3JrZmxvdyBjb250ZXh0LicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIC8vIFdvcmtmbG93IGZ1bmN0aW9uIHJldml2ZXIgZm9yIHdvcmtmbG93IGNvbnRleHQg4oCUIHJldHVybnMgYSBmdW5jdGlvbi1saWtlXG4gICAgLy8gb2JqZWN0IHdpdGggLndvcmtmbG93SWQgdGhhdCBtaW1pY3Mgd2hhdCB0aGUgU1dDIGNvbXBpbGVyIHByb2R1Y2VzLFxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodmFsdWUsIGdsb2JhbC5SZXNwb25zZS5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIEJvZHlJbml0IHRoYXQgc2hvdWxkIGJlIHdyYXBwZWQgaW4gYSBmYWtlIHN0cmVhbVxuICAgICAgaWYgKCdib2R5SW5pdCcgaW4gdmFsdWUpIHtcbiAgICAgICAgLy8gUmVjcmVhdGUgdGhlIGZha2Ugc3RyZWFtIHdpdGggdGhlIEJvZHlJbml0XG4gICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKGdsb2JhbC5SZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICAgICAgICBbQk9EWV9JTklUX1NZTUJPTF06IHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5ib2R5SW5pdCxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVndWxhciBzdHJlYW0gaGFuZGxpbmdcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKGdsb2JhbC5SZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICAgICAgW1NUUkVBTV9OQU1FX1NZTUJPTF06IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUubmFtZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIFtTVFJFQU1fVFlQRV9TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICAvLyBDYXJyeSB0aGUgd2lyZS1mcmFtaW5nIGRlY2lzaW9uIHRocm91Z2ggdGhlIHdvcmtmbG93IFZNIHNvXG4gICAgICAgIC8vIHRoYXQgd2hlbiB0aGUgaGFuZGxlIGlzIGxhdGVyIHBhc3NlZCB0byBhIHN0ZXAgKHdoaWNoIHJlYWRzXG4gICAgICAgIC8vIHRoZSBhY3R1YWwgYnl0ZXMgZnJvbSB0aGUgc2VydmVyKSB3ZSBrbm93IHdoZXRoZXIgdG8gdW5mcmFtZS5cbiAgICAgICAgLy8gRGVmYXVsdHMgdG8gdW5kZWZpbmVkIGZvciBzdHJlYW1zIHdob3NlIHNlcmlhbGl6ZWQgcmVmIGRpZG4ndFxuICAgICAgICAvLyBjYXJyeSB0aGUgZmllbGQg4oCUIHRob3NlIGFyZSB0cmVhdGVkIGFzIGxlZ2FjeSByYXcgYnl0ZXMuXG4gICAgICAgIFtTVFJFQU1fRlJBTUlOR19TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmZyYW1pbmcsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JNYXAgPSB7XG4gICAgICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIC8vIFByZXNlcnZlIHRoZSBmb3JlaWduIHJ1bklkLCBpZiBwcmVzZW50LCBzbyB0aGF0IHdoZW4gdGhlXG4gICAgICAvLyBoYW5kbGUgaXMgbGF0ZXIgcGFzc2VkIHRvIGEgc3RlcCB0aGUgd29ya2Zsb3cgcmVkdWNlciBjYW5cbiAgICAgIC8vIGZvcndhcmQgaXQgdGhyb3VnaCB0byB0aGUgc3RlcCByZXZpdmVyLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5ydW5JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGVzY3JpcHRvcltTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xdID0ge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5ydW5JZCxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGVzY3JpcHRvcltTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXSA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUuZGVwbG95bWVudElkLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIFByZXNlcnZlIHRoZSBvd25lcidzIHB1YmxpYyBrZXkgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB0aGUgcnVuSWRcbiAgICAgIC8vIGFib3ZlLiBXaXRob3V0IGl0LCBmb3J3YXJkaW5nIGEgd3JpdGFibGUgdGhyb3VnaCBhIHdvcmtmbG93IHRvIGEgc3RlcFxuICAgICAgLy8gc2lsZW50bHkgZHJvcHMgdGhlIGtleSwgYW5kIHRoZSBzdGVwIGZhbGxzIGJhY2sgdG8gZmV0Y2hpbmcgdGhlXG4gICAgICAvLyBvd25lcidzIHN5bW1ldHJpYyBrZXkg4oCUIHRoZSByb3VuZCB0cmlwIHNlYWxpbmcgZXhpc3RzIHRvIHJlbW92ZS5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZGVzY3JpcHRvcltTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXSA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLCBkZXNjcmlwdG9yKTtcbiAgICB9LFxuXG4gICAgLy8gQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJldml2ZWQgaW5zaWRlIHRoZSB3b3JrZmxvdyBWTS4gVXNlIHRoZVxuICAgIC8vIHJlYWwgV29ya2Zsb3dBYm9ydFNpZ25hbCBjbGFzcyBzbyBhZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGZuKSBhY3R1YWxseVxuICAgIC8vIGZpcmVzIHdoZW4gdGhlIHNpZ25hbCBhYm9ydHMgKHRoZSBwcmV2aW91cyBuby1vcCBzdHViIHNpbGVudGx5IGRyb3BwZWRcbiAgICAvLyBsaXN0ZW5lciByZWdpc3RyYXRpb25zIOKAlCBzaWxlbnQgY29ycmVjdG5lc3MgYnVnIGZvciBuYXR1cmFsIHBhdHRlcm5zXG4gICAgLy8gbGlrZSBgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZm4pYCBhZnRlciByZWNlaXZpbmcgYSBkZXNlcmlhbGl6ZWRcbiAgICAvLyBzaWduYWwpLiBUaGUgc2lnbmFsIGRvZXMgbm90IG93biBhIGhvb2sgc3Vic2NyaXB0aW9uIGhlcmUg4oCUIGFib3J0IHN0YXRlXG4gICAgLy8gaXMgZGVsaXZlcmVkIHZpYSB0aGUgZXhpc3RpbmcgcmVwbGF5IG1hY2hpbmVyeSBvbiB0aGUgc291cmNlIHNpZGUuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHZhbHVlLnN0cmVhbU5hbWUsIHZhbHVlLmhvb2tUb2tlbik7XG4gICAgICBpZiAodmFsdWUuYWJvcnRlZCkgc2lnbmFsLl9zZXRBYm9ydGVkKHZhbHVlLnJlYXNvbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbQUJPUlRfU1RSRUFNX05BTUVdOiB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgICBbQUJPUlRfSE9PS19UT0tFTl06IHZhbHVlLmhvb2tUb2tlbixcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgICB9O1xuICAgIH0sXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwodmFsdWUuc3RyZWFtTmFtZSwgdmFsdWUuaG9va1Rva2VuKTtcbiAgICAgIGlmICh2YWx1ZS5hYm9ydGVkKSBzaWduYWwuX3NldEFib3J0ZWQodmFsdWUucmVhc29uKTtcbiAgICAgIHJldHVybiBzaWduYWw7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHJlY2VpdmluZyBhcmd1bWVudHMgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldFN0ZXBSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHJldml2ZXIgZm9yIHN0ZXAgY29udGV4dCAtIHJldHVybnMgcmF3IHN0ZXAgZnVuY3Rpb25cbiAgICAvLyB3aXRoIGNsb3N1cmUgdmFyaWFibGUgc3VwcG9ydCB2aWEgQXN5bmNMb2NhbFN0b3JhZ2UuXG4gICAgLy9cbiAgICAvLyBIYW5kbGVzIGZvdXIgaW5kZXBlbmRlbnQgZmxhZ3MgZnJvbSB0aGUgc2VyaWFsaXplZCBwYXlsb2FkOlxuICAgIC8vICAgLSBgY2xvc3VyZVZhcnNgOiBpbnZva2UgdGhlIGJvZHkgaW5zaWRlIGFuIEFzeW5jTG9jYWxTdG9yYWdlIGZyYW1lXG4gICAgLy8gICAgIHNvIHRoZSBTV0MtZW1pdHRlZCBgV09SS0ZMT1dfU1RFUF9DT05URVhUX1NUT1JBR0VgIElJRkUgaW4gdGhlXG4gICAgLy8gICAgIGhvaXN0ZWQgYm9keSBjYW4gcHVsbCB0aGUgY2xvc3VyZSB2YXJpYWJsZXMgYmFjayBvdXQuXG4gICAgLy8gICAtIGBib3VuZFRoaXNgOiAgIGEgYHRoaXNgIHZhbHVlIGNhcHR1cmVkIGJ5XG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzKWAgaW4gdGhlIHdvcmtmbG93IGJ1bmRsZSAobGV4aWNhbC1gdGhpc2BcbiAgICAvLyAgICAgYXJyb3cgc3RlcHMpLiBUaGUgd3JhcHBlciBpbnZva2VzIHRoZSBib2R5IHZpYVxuICAgIC8vICAgICBgc3RlcEZuLmFwcGx5KGJvdW5kVGhpcywgYXJncylgIHNvIHRoZSBib2R5IHNlZXMgdGhlIHNhbWVcbiAgICAvLyAgICAgYHRoaXNgIGl0IHdvdWxkIGhhdmUgaGFkIGluIHRoZSB3b3JrZmxvdyBidW5kbGUuIFByb3BlcnR5XG4gICAgLy8gICAgIHByZXNlbmNlIOKAlCBub3QgdHJ1dGhpbmVzcyDigJQgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZVxuICAgIC8vICAgICBgYmluZChudWxsKWAgYW5kIGBiaW5kKHVuZGVmaW5lZClgIGFyZSBib3RoIGxlZ2FsIGFuZCBzaG91bGRcbiAgICAvLyAgICAgcm91bmQtdHJpcCBmYWl0aGZ1bGx5LlxuICAgIC8vICAgLSBgYm91bmRBcmdzYDogICBwcmVmaWxsZWQgYXJncyBmcm9tXG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzQXJnLCB4LCB5KWAuIFByZXBlbmRlZCB0byB0aGUgY2FsbCBhcmdzXG4gICAgLy8gICAgIHNvIHBhcnRpYWwgYXBwbGljYXRpb24gc3Vydml2ZXMgc2VyaWFsaXphdGlvbi5cbiAgICBTdGVwRnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc3RlcElkID0gdmFsdWUuc3RlcElkO1xuICAgICAgY29uc3QgY2xvc3VyZVZhcnMgPSB2YWx1ZS5jbG9zdXJlVmFycztcbiAgICAgIGNvbnN0IGhhc0JvdW5kVGhpcyA9ICdib3VuZFRoaXMnIGluIHZhbHVlO1xuICAgICAgY29uc3QgYm91bmRUaGlzID0gaGFzQm91bmRUaGlzID8gdmFsdWUuYm91bmRUaGlzIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgYm91bmRBcmdzID0gQXJyYXkuaXNBcnJheSh2YWx1ZS5ib3VuZEFyZ3MpID8gdmFsdWUuYm91bmRBcmdzIDogW107XG5cbiAgICAgIGNvbnN0IHN0ZXBGbiA9IGdldFN0ZXBGdW5jdGlvbihzdGVwSWQpO1xuICAgICAgaWYgKCFzdGVwRm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICBgU3RlcCBmdW5jdGlvbiBcIiR7c3RlcElkfVwiIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHRoZSBzdGVwIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnTWFrZSBzdXJlIHRoZSBzdGVwIGZpbGUgaXMgaW5jbHVkZWQgaW4geW91ciBidWlsZCAoaS5lLiBpdCBpcyBsaXN0ZWQgaW4gdGhlIHdvcmtmbG93IG1hbmlmZXN0KSwgYW5kIHRoYXQgdGhlIFNXQyBwbHVnaW4gaXMgY29uZmlndXJlZCBmb3IgdGhlIGZpbGUuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogbm90aGluZyB0byB3cmFwLlxuICAgICAgaWYgKCFjbG9zdXJlVmFycyAmJiAhaGFzQm91bmRUaGlzICYmIGJvdW5kQXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3JhcHBlZFN0ZXBGbiA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBjYWxsVGhpcyA9IGhhc0JvdW5kVGhpcyA/IGJvdW5kVGhpcyA6IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhbGxBcmdzID0gYm91bmRBcmdzLmxlbmd0aCA+IDAgPyBbLi4uYm91bmRBcmdzLCAuLi5hcmdzXSA6IGFyZ3M7XG4gICAgICAgIGlmIChjbG9zdXJlVmFycykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICAgICAgICBpZiAoIWN1cnJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICdDYW5ub3QgY2FsbCBzdGVwIGZ1bmN0aW9uIHdpdGggY2xvc3VyZSB2YXJpYWJsZXMgb3V0c2lkZSBzdGVwIGNvbnRleHQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdDb250ZXh0ID0ge1xuICAgICAgICAgICAgLi4uY3VycmVudENvbnRleHQsXG4gICAgICAgICAgICBjbG9zdXJlVmFycyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBjb250ZXh0U3RvcmFnZS5ydW4obmV3Q29udGV4dCwgKCkgPT5cbiAgICAgICAgICAgIHN0ZXBGbi5hcHBseShjYWxsVGhpcywgY2FsbEFyZ3MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RlcEZuLmFwcGx5KGNhbGxUaGlzLCBjYWxsQXJncyk7XG4gICAgICB9IGFzIGFueTtcblxuICAgICAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gb3JpZ2luYWwgc3RlcCBmdW5jdGlvblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWRTdGVwRm4sICduYW1lJywge1xuICAgICAgICB2YWx1ZTogc3RlcEZuLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkU3RlcEZuLCAnc3RlcElkJywge1xuICAgICAgICB2YWx1ZTogc3RlcElkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAoc3RlcEZuLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3cmFwcGVkU3RlcEZuLm1heFJldHJpZXMgPSBzdGVwRm4ubWF4UmV0cmllcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdyYXBwZWRTdGVwRm47XG4gICAgfSxcblxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcblxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCAmIHsgZHVwbGV4Pzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGluaXQuc2lnbmFsID0gdmFsdWUuc2lnbmFsO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBnbG9iYWwuUmVxdWVzdCh2YWx1ZS51cmwsIGluaXQpO1xuICAgICAgLy8gVGhlIFJlcXVlc3QgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnRlcm5hbCBzaWduYWwgY29weSwgc28gdGhlXG4gICAgICAvLyBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIHNldCBieSByZXZpdmVBYm9ydFNpZ25hbCBkb24ndCBwcm9wYWdhdGUuXG4gICAgICAvLyBSZS10YWcgdGhlIHJlcXVlc3QncyBvd24gc2lnbmFsIHNvIGNhbmNlbEFib3J0UmVhZGVycyBjYW4gZmluZCBpdC5cbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGNvcHlBYm9ydEludGVybmFscyh2YWx1ZS5zaWduYWwsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGggPSBhc3luYyAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd3JpdGVyID0gcmVzcG9uc2VXcml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVzcG9uc2UpO1xuICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBOb3RlOiBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgc3RhdHVzLCBzdGF0dXNUZXh0LCBhbmQgaGVhZGVyc1xuICAgICAgLy8gVGhlIHR5cGUsIHVybCwgYW5kIHJlZGlyZWN0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGFuZCBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yXG4gICAgICByZXR1cm4gbmV3IGdsb2JhbC5SZXNwb25zZSh2YWx1ZS5ib2R5LCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIElmIHRoaXMgaGFzIGJvZHlJbml0LCBpdCBjYW1lIGZyb20gYSBSZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgLy8gQ29udmVydCBpdCB0byBhIFJFQUwgc3RyZWFtIG5vdyB0aGF0IHdlJ3JlIGluIHRoZSBzdGVwIGVudmlyb25tZW50XG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5SW5pdCA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBjb252ZXJ0IEJvZHlJbml0IHRvIFJlYWRhYmxlU3RyZWFtXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IGdsb2JhbC5SZXNwb25zZShib2R5SW5pdCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIC8vIEZvciBieXRlIHN0cmVhbXMsIHVzZSBmbHVzaGFibGUgcGlwZSB3aXRoIGxvY2sgcG9sbGluZy5cbiAgICAgICAgLy8gSWYgdGhlIHByb2R1Y2VyIHdyb3RlIGZyYW1lZCBieXRlcyAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpLFxuICAgICAgICAvLyB1bndyYXAgdGhlIGxlbmd0aC1wcmVmaXggZW52ZWxvcGUgYmVmb3JlIGhhbmRpbmcgY2h1bmtzIHRvXG4gICAgICAgIC8vIHRoZSB1c2VyIHN0ZXAuIEFic2VudCAvICdyYXcnIGZyYW1pbmcgbWVhbnMgbGVnYWN5IHJhdyBieXRlcyDigJRcbiAgICAgICAgLy8gcGlwZSB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlkZW50aXR5IChvciB1bmZyYW1pbmcpIHRyYW5zZm9ybSB0byBnaXZlIHRoZSB1c2VyIGEgcmVhZGFibGVcbiAgICAgICAgY29uc3QgeyByZWFkYWJsZTogdXNlclJlYWRhYmxlLCB3cml0YWJsZSB9ID1cbiAgICAgICAgICB2YWx1ZS5mcmFtaW5nID09PSAnZnJhbWVkLXYxJ1xuICAgICAgICAgICAgPyBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKClcbiAgICAgICAgICAgIDogbmV3IGdsb2JhbC5UcmFuc2Zvcm1TdHJlYW0oKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgd3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh1c2VyUmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdXNlclJlYWRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5LCBkZXBsb3ltZW50SWQpLFxuICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB0cmFuc2Zvcm0ud3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh0cmFuc2Zvcm0ucmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgICAgfVxuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2FtZS1ydW4gY2FzZTogdGhlIHdyaXRhYmxlIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcnVuLiBVc2UgdGhlXG4gICAgICAvLyBsb2NhbCBjcnlwdG9LZXkgYW5kIHdyaXRlIHRvIHRoZSBsb2NhbCBydW5JZCdzIHNlcnZlciBzdHJlYW0uXG4gICAgICAvL1xuICAgICAgLy8gQ3Jvc3MtcnVuIGNhc2UgKHBhcmVudCDihpIgY2hpbGQgdmlhIGBzdGFydCgpYCk6IHRoZSBkZXNjcmlwdG9yXG4gICAgICAvLyBjYXJyaWVzIHRoZSBvcmlnaW5hbCBgcnVuSWRgIGFuZCBgbmFtZWAuIE9wZW4gYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZSBUSEFUIHJ1bidzIGtleVxuICAgICAgLy8gZm9yIGVuY3J5cHRpb24uIFRoZSByZXNvbHV0aW9uIGlzIGFzeW5jIGJ1dCBkb2Vzbid0IG5lZWQgdG9cbiAgICAgIC8vIGJsb2NrIHJldml2ZXIgcmV0dXJuIOKAlCBgZ2V0U2VyaWFsaXplU3RyZWFtYCBhY2NlcHRzIHRoZVxuICAgICAgLy8gYFByb21pc2U8Q3J5cHRvS2V5IHwgdW5kZWZpbmVkPmAgZGlyZWN0bHkgYW5kIGF3YWl0cyBpdCBsYXppbHlcbiAgICAgIC8vIG9uIHRoZSBmaXJzdCBjaHVuayB3cml0dGVuLiBUaGUga2V5IGlzIGltcG9ydGVkIGVuY3J5cHQtb25seVxuICAgICAgLy8gc28gdGhlIHJlY2VpdmluZyBydW4gY2FuIG5ldmVyIGRlY3J5cHQgYW55dGhpbmcgZWxzZSBvbiB0aGVcbiAgICAgIC8vIG93bmluZyBydW4ncyBzdHJlYW0g4oCUIGl0IGNhbiBvbmx5IGNvbnRyaWJ1dGUgbmV3IHdyaXRlcy5cbiAgICAgIGNvbnN0IHRhcmdldFJ1bklkID0gdHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJyA/IHZhbHVlLnJ1bklkIDogcnVuSWQ7XG4gICAgICBjb25zdCB0YXJnZXREZXBsb3ltZW50SWQgPVxuICAgICAgICB0eXBlb2YgdmFsdWUuZGVwbG95bWVudElkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gdmFsdWUuZGVwbG95bWVudElkXG4gICAgICAgICAgOiB0YXJnZXRSdW5JZCA9PT0gcnVuSWRcbiAgICAgICAgICAgID8gZGVwbG95bWVudElkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRhcmdldEtleTogRW5jcnlwdGlvbktleVBhcmFtID1cbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgPyBjcnlwdG9LZXlcbiAgICAgICAgICA6IGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgdGFyZ2V0UnVuSWQsXG4gICAgICAgICAgICAgIHRhcmdldERlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleVxuICAgICAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplID0gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICBnZXRTdGVwUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHRhcmdldFJ1bklkLCB0YXJnZXRLZXkpLFxuICAgICAgICB0YXJnZXRLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXJ2ZXJXcml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgdmFsdWUubmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIGZsdXNoYWJsZSBzdGF0ZSBmb3IgdGhpcyBzdHJlYW1cbiAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgcG9sbFdyaXRhYmxlTG9jayhzZXJpYWxpemUud3JpdGFibGUsIHN0YXRlKTtcblxuICAgICAgLy8gUmVjb3JkIHRoZSB1bmRlcmx5aW5nIGAocnVuSWQsIG5hbWUpYCBzbyBkb3duc3RyZWFtIHJlZHVjZXJzIGNhblxuICAgICAgLy8gcmVjb2duaXplIHRoYXQgdGhpcyB3cml0YWJsZSBpcyBhbHJlYWR5IGJhY2tlZCBieSBhIHdvcmtmbG93XG4gICAgICAvLyBzZXJ2ZXIgc3RyZWFtLiBXaGVuIGZvcndhcmRlZCBhY3Jvc3MgYHN0YXJ0KClgIGFnYWluIOKAlCBlLmcuXG4gICAgICAvLyB0aGUgY2hpbGQgcGFzc2VzIHRoaXMgd3JpdGFibGUgb24gdG8gYSBncmFuZGNoaWxkIOKAlCB0aGVcbiAgICAgIC8vIGV4dGVybmFsIHJlZHVjZXIgbmVlZHMgYm90aCB0byBlbWl0IHRoZSBvcmlnaW5hbCBgcnVuSWRgIGluXG4gICAgICAvLyB0aGUgZGVzY3JpcHRvci5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9OQU1FX1NZTUJPTCwge1xuICAgICAgICB2YWx1ZTogdmFsdWUubmFtZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHRhcmdldFJ1bklkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmICh0YXJnZXREZXBsb3ltZW50SWQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgIHNlcmlhbGl6ZS53cml0YWJsZSxcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiB0YXJnZXREZXBsb3ltZW50SWQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gS2VlcCB0aGUgb3duZXIncyBwdWJsaWMga2V5IG9uIHRoZSBoYW5kbGUgc28gYSBmdXJ0aGVyIGZvcndhcmQgc3RheXMgb25cbiAgICAgIC8vIHRoZSB6ZXJvLWxvb2t1cCBzZWFsZWQgcGF0aC5cbiAgICAgIC8vXG4gICAgICAvLyBXaGVuIHRoZSBkZXNjcmlwdG9yIGNhcnJpZXMgbm8ga2V5IGFuZCB0aGUgc3RyZWFtIGJlbG9uZ3MgdG8gVEhJUyBydW4sXG4gICAgICAvLyBkZXJpdmUgaXQuIEEgd3JpdGFibGUgdGFrZW4gd2l0aCBgZ2V0V3JpdGFibGUoKWAgaW4gYSB3b3JrZmxvdyBib2R5IGhhc1xuICAgICAgLy8gb25seSBhIG5hbWUgb24gaXQg4oCUIHRoZSB3b3JrZmxvdyBWTSBob2xkcyBubyBrZXkgbWF0ZXJpYWwgYnkgZGVzaWduIOKAlFxuICAgICAgLy8gc28gbm90aGluZyBjb3VsZCBwdWJsaXNoIHRoZSBrZXkgd2hlbiB0aGUgaGFuZGxlIHdhcyBjcmVhdGVkLiBSZXZpdmluZ1xuICAgICAgLy8gaGFwcGVucyBpbiBhIHN0ZXAsIHdoaWNoIGRvZXMgaG9sZCB0aGlzIHJ1bidzIGtleSwgYW5kIGFueSBsYXRlclxuICAgICAgLy8gZm9yd2FyZCB0aGVuIGp1c3QgY29waWVzIHRoZSBzeW1ib2wuXG4gICAgICAvL1xuICAgICAgLy8gSXQgaGFzIHRvIGhhcHBlbiBoZXJlIHJhdGhlciB0aGFuIGF0IHNlcmlhbGl6YXRpb24gdGltZTogYHN0YXJ0KClgXG4gICAgICAvLyBkZWh5ZHJhdGVzIGl0cyBhcmd1bWVudHMgd2l0aCB0aGUgQ0hJTEQncyBydW5JZCBhbmQgdGhlIENISUxEJ3Mga2V5LCBzb1xuICAgICAgLy8gdGhlIG93bmluZyBydW4ncyBrZXkgaXMgbm8gbG9uZ2VyIGluIHNjb3BlIGJ5IHRoZW4uXG4gICAgICAvL1xuICAgICAgLy8gYHRhcmdldFJ1bklkID09PSBydW5JZGAgaXMgdGhlIGd1YXJkIHRoYXQgbWF0dGVycy4gRm9yIGEgc3RyZWFtIGFub3RoZXJcbiAgICAgIC8vIHJ1biBvd25zIHdlIG11c3Qgbm90IGFkdmVydGlzZSBvdXIga2V5IOKAlCB0aGUgcmVjZWl2ZXIgd291bGQgc2VhbCB0byB1c1xuICAgICAgLy8gYW5kIHRoZSByZWFsIG93bmVyIGNvdWxkIG5ldmVyIG9wZW4gd2hhdCBpdCB3cm90ZS5cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgIT09ICdzdHJpbmcnICYmXG4gICAgICAgIHRhcmdldFJ1bklkID09PSBydW5JZCAmJlxuICAgICAgICBpc1J1blBheWxvYWRLZXlzKGNyeXB0b0tleSlcbiAgICAgICkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgc2VyaWFsaXplLndyaXRhYmxlLFxuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0wsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IGJ5dGVzVG9CYXNlNjQoY3J5cHRvS2V5LmtleVBhaXIucHVibGljS2V5KSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXJpYWxpemUud3JpdGFibGU7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiByZXZpdmVBYm9ydENvbnRyb2xsZXIodmFsdWUsIG9wcywgcnVuSWQpLFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHJldml2ZUFib3J0U2lnbmFsKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRW5jcnlwdGlvbiBIZWxwZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUaGVzZSBkZWxlZ2F0ZSB0byB0aGUgbW9kdWxhciBgZW5jcnlwdGAvYGRlY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYFxuLy8gYnV0IGFyZSBrZXB0IGFzIG5hbWVkIGV4cG9ydHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29uc3VtZXJzLlxuXG4vKipcbiAqIEVuY3J5cHQgZGF0YSBpZiB0aGUgd29ybGQgc3VwcG9ydHMgZW5jcnlwdGlvbi5cbiAqIFJldHVybnMgb3JpZ2luYWwgZGF0YSBpZiBlbmNyeXB0aW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBlbmNyeXB0YCBmcm9tIGAuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qc2AgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1heWJlRW5jcnlwdChcbiAgZGF0YTogVWludDhBcnJheSxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIChhd2FpdCBlbmNyeXB0KGRhdGEsIGtleSkpIGFzIFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogRGVjcnlwdCBkYXRhIGlmIGl0IGhhcyB0aGUgJ2VuY3InIHByZWZpeC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGRlY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF5YmVEZWNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIHJldHVybiBkZWNyeXB0KGRhdGEsIGtleSk7XG59XG5cbi8qKlxuICogUmVwbGF5IGh5ZHJhdGlvbiBoYXMgdHdvIHN0YWdlczpcbiAqXG4gKiAxLiBIb3N0LXNpZGUgcHJlcGFyYXRpb24gZGVjcnlwdHMgYW5kIGRlY29tcHJlc3NlcyBwZXJzaXN0ZWQgZGF0YS4gVGhhdCB3b3JrXG4gKiAgICBpcyBpbmRlcGVuZGVudCBvZiBhIHdvcmtmbG93IFZNIGFuZCBjYW4gYmUgY2FjaGVkIGFjcm9zcyByZXBsYXkgVk1zLlxuICogMi4gRGVzZXJpYWxpemF0aW9uIHJldml2ZXMgdGhlIHByZXBhcmVkIHJlcHJlc2VudGF0aW9uIGFnYWluc3QgdGhlIGN1cnJlbnRcbiAqICAgIFZNJ3MgZ2xvYmFscy4gSXQgbXVzdCBydW4gYWdhaW4gZm9yIGV2ZXJ5IFZNIHRvIHByb2R1Y2UgZnJlc2ggb2JqZWN0IGdyYXBoc1xuICogICAgYW5kIGNvcnJlY3RseSBzY29wZWQgV29ya2Zsb3cgb2JqZWN0cy5cbiAqXG4gKiBgZGF0YWAgaXMgdGhlIGJvdW5kYXJ5IGJldHdlZW4gdGhvc2Ugc3RhZ2VzLiBGb3IgY3VycmVudC1mb3JtYXQgcGF5bG9hZHMgaXRcbiAqIGlzIHN0aWxsIGZvcm1hdC1wcmVmaXhlZCBzZXJpYWxpemVkIGJ5dGVzLCBub3QgYSBsaXZlIEphdmFTY3JpcHQgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZWRSZXBsYXlQYXlsb2FkIHtcbiAgcmVhZG9ubHkgZGF0YTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBTd2FwcGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGhvc3Qtc2lkZSBwcmVwYXJhdGlvbiBzdGFnZS4gU3VwcG9ydGluZ1xuICogYm90aCBkaXJlY3QgYW5kIHByb21pc2VkIHJlc3VsdHMgbGV0cyBhIGZ1dHVyZSBzeW5jaHJvbm91cyBOb2RlIGRlY3J5cHRvciB1c2VcbiAqIHRoZSBzYW1lIGNhY2hlIGNvbnRyYWN0IGFzIHRvZGF5J3MgYXN5bmNocm9ub3VzIFdlYiBDcnlwdG8gaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFJlcGxheVBheWxvYWRQcmVwYXJlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZFxuKSA9PiBQcmVwYXJlZFJlcGxheVBheWxvYWQgfCBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD47XG5cbi8qKlxuICogRGVjcnlwdCBhbmQgZGVjb21wcmVzcyBwZXJzaXN0ZWQgZGF0YSB3aXRob3V0IHBhcnNpbmcgaXQgaW50byBKYXZhU2NyaXB0LlxuICogTGVnYWN5IG5vbi1iaW5hcnkgdmFsdWVzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgZm9yIHRoZWlyIGNvbnN1bWVyIHRvIHJldml2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHByZXBhcmVSZXBsYXlQYXlsb2FkOiBSZXBsYXlQYXlsb2FkUHJlcGFyZXIgPSBhc3luYyAoXG4gIHZhbHVlLFxuICBrZXlcbikgPT4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IHByZXBhcmVkID0gYXdhaXQgZGVjb21wcmVzcyhcbiAgICBhd2FpdCBkZWNyeXB0KHZhbHVlLCBrZXkpLFxuICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgKTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiB7IGRhdGE6IHByZXBhcmVkIH07XG59O1xuXG4vKipcbiAqIFBhcnNlIGEgcHJlcGFyZWQgd29ya2Zsb3cgYXJndW1lbnQgb3Igc3VjY2Vzc2Z1bCBzdGVwL2hvb2sgcGF5bG9hZCB1c2luZyB0aGVcbiAqIGN1cnJlbnQgd29ya2Zsb3cgVk0ncyBnbG9iYWxzIGFuZCByZXZpdmVycy4gRWFjaCBjYWxsIGludGVudGlvbmFsbHkgY3JlYXRlc1xuICogYSBmcmVzaCBvYmplY3QgZ3JhcGggc28gbXV0YXRpb25zIGNhbm5vdCBsZWFrIGFjcm9zcyByZXBsYXkgaXRlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplUHJlcGFyZWRSZXBsYXlQYXlsb2FkKFxuICBwcmVwYXJlZDogUHJlcGFyZWRSZXBsYXlQYXlsb2FkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBhbnkge1xuICByZXR1cm4gd29ya2Zsb3dNb2R1bGUuZGVzZXJpYWxpemUocHJlcGFyZWQuZGF0YSwge1xuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzOiB7XG4gICAgICAuLi5nZXRTdHJlYW1BbmRSZXF1ZXN0UmV2aXZlcnMoZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGFyc2UgYSBwcmVwYXJlZCBzdGVwIGVycm9yIHVzaW5nIHRoZSBjdXJyZW50IHdvcmtmbG93IFZNJ3MgY2xhc3MgcmV2aXZlcnMuXG4gKiBUaGlzIHByZXNlcnZlcyB0aHJvd24tdmFsdWUgaWRlbnRpdHkgd2l0aG91dCBzaGFyaW5nIG9iamVjdHMgYmV0d2VlbiBWTXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVByZXBhcmVkU3RlcEVycm9yKFxuICBwcmVwYXJlZDogUHJlcGFyZWRSZXBsYXlQYXlsb2FkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiB1bmtub3duIHtcbiAgY29uc3QgeyBkYXRhIH0gPSBwcmVwYXJlZDtcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgcmV0dXJuIHVuZmxhdHRlbihkYXRhIGFzIGFueVtdLCB7XG4gICAgICAuLi5nZXRXb3JrZmxvd1Jldml2ZXJzKGdsb2JhbCksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkYXRhKTtcbiAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgY29uc3Qgc3RyID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBheWxvYWQpO1xuICAgIHJldHVybiBwYXJzZShzdHIsIHtcbiAgICAgIC4uLmdldFdvcmtmbG93UmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVoeWRyYXRlIC8gSHlkcmF0ZSBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRoZXNlIGRlbGVnYXRlIHRvIHRoZSBtb2R1bGFyIG1vZGUgbW9kdWxlcyAod29ya2Zsb3csIHN0ZXAsIGNsaWVudCkgcGFzc2luZ1xuLy8gbW9kZS1zcGVjaWZpYyBzdHJlYW0gYW5kIFJlcXVlc3QvUmVzcG9uc2UgcmVkdWNlcnMvcmV2aXZlcnMgYXMgZXh0cmEgb3B0aW9ucy5cbi8vIFRoZSB2MUNvbXBhdCBwYXRoIGlzIGhhbmRsZWQgaW5saW5lIGJlZm9yZSBkZWxlZ2F0aW5nIHRvIHRoZSBtb2R1bGVzLlxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBgc3RhcnQoKWAgZnVuY3Rpb24gdG8gc2VyaWFsaXplIHRoZSB3b3JrZmxvdyBhcmd1bWVudHNcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlIGFuZCB0aGVuIGh5ZHJhdGVkIGZyb21cbiAqIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXJpYWxpemVcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKHJlcXVpcmVkIGZvciBlbmNyeXB0aW9uIGNvbnRleHQpXG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB2MUNvbXBhdCAtIEVuYWJsZSBsZWdhY3kgdjEgY29tcGF0aWJpbGl0eSBtb2RlXG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWRcbiAqICAgYnl0ZSBzdHJlYW1zLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgY2FwYWJpbGl0eSDigJQgc2VlXG4gKiAgIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvclxuICogICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXksIGZyYW1lZEJ5dGVTdHJlYW1zKVxuICAgICk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBmcmFtZWRCeXRlU3RyZWFtcylcbiAgICAgICksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IGFyZ3VtZW50cycsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50IHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93XG4gKiBhcmd1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHdvcmtmbG93IGV4ZWN1dGlvbi4gQSBwcmVwYXJlZFxuICogcGF5bG9hZCBza2lwcyBob3N0LXNpZGUgZGVjcnlwdC9kZWNvbXByZXNzIGJ1dCBhbHdheXMgcGVyZm9ybXMgVk0gcmV2aXZhbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBwcmVwYXJlZD86IFByZXBhcmVkUmVwbGF5UGF5bG9hZFxuKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplUHJlcGFyZWRSZXBsYXlQYXlsb2FkKFxuICAgIHByZXBhcmVkID8/IChhd2FpdCBwcmVwYXJlUmVwbGF5UGF5bG9hZCh2YWx1ZSwga2V5KSksXG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnNcbiAgKTtcbn1cblxuLyoqXG4gKiBEZWh5ZHJhdGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlIGZvciBzdG9yYWdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzaW5rIHJlY2VpdmluZyBldmVyeSB3b3JrZmxvdy1jb2RlIGV4ZWN1dGlvbiBzZXJpYWxpemF0aW9uIGNvdWxkXG4gICAqIG5vdCBhdm9pZCwgZm9yIGNhbGxlcnMgdGhhdCBuZWVkIHRoZW0gcHJvZ3JhbW1hdGljYWxseSAoZS5nLiBhXG4gICAqIHJldGFpbmVkLVZNIGdhdGUgZGVjaWRpbmcgd2hldGhlciB0aGUgVk0gaXMgc3RpbGwgcmV1c2FibGUpLiBUaGVcbiAgICogZXhlY3V0aW9ucyBhcmUgZW1pdHRlZCBhcyBzcGFuIGF0dHJpYnV0ZXMgZWl0aGVyIHdheSwgc28gb21pdHRpbmcgdGhpc1xuICAgKiBsb3NlcyBub3RoaW5nIG9ic2VydmFiaWxpdHktd2lzZS4gVGhlIHJldGFpbmVkLVZNIGdhdGUgaW5cbiAgICogcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIudHMgcGFzc2VzIG9uZSBmb3Igc3RlcC1pbnB1dCBkZWh5ZHJhdGlvbi5cbiAgICovXG4gIGd1ZXN0Q29kZVN0YXRzT3V0PzogR3Vlc3RDb2RlU3RhdHNcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKHYxQ29tcGF0KSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBndWVzdENvZGVTdGF0czogR3Vlc3RDb2RlU3RhdHMgPSBndWVzdENvZGVTdGF0c091dCA/PyB7XG4gICAgICBleGVjdXRpb25zOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2R1bGUuc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGV4dHJhUmVkdWNlcnM6IGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzLFxuICAgICAgZ3Vlc3RDb2RlU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIGF3YWl0IHJlY29yZEd1ZXN0Q29kZUV4ZWN1dGlvbnMoZ3Vlc3RDb2RlU3RhdHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IHJldHVybiB2YWx1ZScsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZVxuICogb2YgYSBjb21wbGV0ZWQgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPGFueT4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudE1vZHVsZS5kZXNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgICAgICAgZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSlcbiAgICAgICksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0sXG4gICAgY29tcHJlc3Npb25TdGF0cyxcbiAgfSk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gYSBzdGVwIGlzIGJlaW5nIGNyZWF0ZWQuXG4gKiBEZWh5ZHJhdGVzIHZhbHVlcyBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8qKiBTZWUgYGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWVgLiAqL1xuICBndWVzdENvZGVTdGF0c091dD86IEd1ZXN0Q29kZVN0YXRzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgZ3Vlc3RDb2RlU3RhdHM6IEd1ZXN0Q29kZVN0YXRzID0gZ3Vlc3RDb2RlU3RhdHNPdXQgPz8ge1xuICAgICAgZXhlY3V0aW9uczogW10sXG4gICAgfTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICAgIGd1ZXN0Q29kZVN0YXRzLFxuICAgIH0pO1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICBhd2FpdCByZWNvcmRHdWVzdENvZGVFeGVjdXRpb25zKGd1ZXN0Q29kZVN0YXRzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcignc3RlcCBhcmd1bWVudHMnLCBjYXVzZSk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHN0ZXAgZXhlY3V0b3IgdG8gaHlkcmF0ZSB0aGUgYXJndW1lbnRzIG9mIGEgc3RlcFxuICogZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdGVwIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5kZXNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBkZXBsb3ltZW50SWQpXG4gICAgICApLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gIH0pO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBleGVjdXRvciB3aGVuIGEgc3RlcCBoYXMgY29tcGxldGVkLlxuICogRGVoeWRyYXRlcyB2YWx1ZXMgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gKiBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2VyaWFsaXplXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdjFDb21wYXQgLSBFbmFibGUgbGVnYWN5IHYxIGNvbXBhdGliaWxpdHkgbW9kZVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hldGhlciB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlIHdpcmUtZnJhbWVkXG4gKiAgIGJ5dGUgc3RyZWFtcy4gU2hvdWxkIG1hdGNoIHRoZSB0YXJnZXQgZGVwbG95bWVudCdzIGNhcGFiaWxpdHkg4oCUIHNlZVxuICogICBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHMgdG8gYGZhbHNlYCBmb3JcbiAqICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8YW55PltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IG9yZGVyIHRoZSBmaXJzdCBjaHVuayBvZiBhIHJldHVybmVkIHN0cmVhbSBhZnRlclxuICAvLyB0aGUgYmFja2dyb3VuZGVkIGBydW5fc3RhcnRlZGAuIFRocmVhZGVkIGludG8gdGhlIHN0ZXAgcmVkdWNlcnMnIHN0cmVhbVxuICAvLyBzaW5rLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJibyAvIG9uIHRoZSBhd2FpdCBwYXRoLlxuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShcbiAgICAgIHZhbHVlLFxuICAgICAgZ2V0U3RlcFJlZHVjZXJzKFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGtleSxcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2R1bGUuc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGV4dHJhUmVkdWNlcnM6IGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhcbiAgICAgICAgZ2V0U3RlcFJlZHVjZXJzKFxuICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICBvcHMsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICApXG4gICAgICApLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzLFxuICAgIH0pO1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICdzdGVwIHJldHVybiB2YWx1ZScsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHN0ZXAgZXhlY3V0b3Igd2hlbiBhIHN0ZXAgdGhyb3dzLiBEZWh5ZHJhdGVzIHRoZSB0aHJvd25cbiAqIHZhbHVlIGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuXG4gKiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgaW4gYSBgc3RlcF9mYWlsZWRgIG9yIGBzdGVwX3JldHJ5aW5nYCBldmVudC5cbiAqXG4gKiBBbnkgSmF2YVNjcmlwdCB2YWx1ZSBjYW4gYmUgdGhyb3duIChzdHJpbmdzLCBudW1iZXJzLCBvYmplY3RzLCBFcnJvcnMsXG4gKiBFcnJvciBzdWJjbGFzc2VzKSwgc28gdGhlIHNhbWUgc2VyaWFsaXphdGlvbiBwaXBlbGluZSB1c2VkIGZvciBzdGVwXG4gKiBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMgaXMgYXBwbGllZCBoZXJlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB0aHJvd24gdmFsdWUgdG8gc2VyaWFsaXplIChjYW4gYmUgYW55IHR5cGUpXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTxhbnk+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRTdGVwUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpKTtcbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG4gICAgICBwYXlsb2FkXG4gICAgKSBhcyBVaW50OEFycmF5O1xuICAgIC8vIENvbXByZXNzIGJlZm9yZSBlbmNyeXB0aW5nIOKAlCBlbmNyeXB0ZWQgYnl0ZXMgZG9uJ3QgY29tcHJlc3MuXG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBjb21wcmVzcyhcbiAgICAgIHNlcmlhbGl6ZWQsXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgICApO1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IChhd2FpdCBtYXliZUVuY3J5cHQoXG4gICAgICBjb21wcmVzc2VkIGFzIFVpbnQ4QXJyYXksXG4gICAgICBrZXlcbiAgICApKSBhcyBVaW50OEFycmF5O1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcignc3RlcCBlcnJvcicsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nIG9mIGFcbiAqIGBzdGVwX2ZhaWxlZGAgb3IgYHN0ZXBfcmV0cnlpbmdgIGV2ZW50LiBIeWRyYXRlcyB0aGUgdGhyb3duIHZhbHVlIGZyb21cbiAqIHRoZSBkYXRhYmFzZSBzbyB0aGUgd29ya2Zsb3cgY2FuIHNlZSB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIEBwYXJhbSBwcmVwYXJlZCAtIE9wdGlvbmFsIGNhY2hlZCBkZWNyeXB0L2RlY29tcHJlc3MgcmVzdWx0XG4gKiBAcmV0dXJucyBUaGUgaHlkcmF0ZWQgdGhyb3duIHZhbHVlLCByZWFkeSB0byByZWplY3QgdGhlIHN0ZXAgcHJvbWlzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVN0ZXBFcnJvcihcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBwcmVwYXJlZD86IFByZXBhcmVkUmVwbGF5UGF5bG9hZFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIHJldHVybiBkZXNlcmlhbGl6ZVByZXBhcmVkU3RlcEVycm9yKFxuICAgIHByZXBhcmVkID8/IChhd2FpdCBwcmVwYXJlUmVwbGF5UGF5bG9hZCh2YWx1ZSwga2V5KSksXG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnNcbiAgKTtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHRoZSB3b3JrZmxvdyBpdHNlbGYgdGhyb3dzLlxuICogRGVoeWRyYXRlcyB0aGUgdGhyb3duIHZhbHVlIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlIGluIGEgYHJ1bl9mYWlsZWRgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB0aHJvd24gdmFsdWUgdG8gc2VyaWFsaXplIChjYW4gYmUgYW55IHR5cGUpXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIHNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlUnVuRXJyb3IoXG4gIHZhbHVlOiB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgcGF5bG9hZFxuICAgICkgYXMgVWludDhBcnJheTtcbiAgICAvLyBDb21wcmVzcyBiZWZvcmUgZW5jcnlwdGluZyDigJQgZW5jcnlwdGVkIGJ5dGVzIGRvbid0IGNvbXByZXNzLlxuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgY29tcHJlc3MoXG4gICAgICBzZXJpYWxpemVkLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzXG4gICAgKTtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSAoYXdhaXQgbWF5YmVFbmNyeXB0KFxuICAgICAgY29tcHJlc3NlZCBhcyBVaW50OEFycmF5LFxuICAgICAga2V5XG4gICAgKSkgYXMgVWludDhBcnJheTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIGVuY3J5cHRlZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ3J1biBlcnJvcicsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgY2xpZW50IHNpZGUgKG9yIG9ic2VydmFiaWxpdHkgdG9vbHMpIHRvIGh5ZHJhdGUgdGhlIHJ1blxuICogZXJyb3IgdmFsdWUgb2YgYSBmYWlsZWQgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBvcHMgLSBQcm9taXNlIGFycmF5IGZvciBzdHJlYW0gb3BlcmF0aW9uc1xuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHJldHVybnMgVGhlIGh5ZHJhdGVkIHRocm93biB2YWx1ZSwgcmVhZHkgdG8gYmUgY29uc3VtZWQgYnkgdGhlIGNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVJ1bkVycm9yKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjb21wcmVzcyhcbiAgICBhd2FpdCBkZWNyeXB0KHZhbHVlLCBrZXkpLFxuICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgKTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG5cbiAgaWYgKCEoZGVjcnlwdGVkIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAvLyBTZWUgdGhlIG1hdGNoaW5nIG5vdGUgaW4gYGh5ZHJhdGVTdGVwRXJyb3JgOiB0aGlzIGJyYW5jaCBpcyBmb3JcbiAgICAvLyBkZXZhbHVlIGZsYXR0ZW5lZCBhcnJheXMgZnJvbSBsZWdhY3kgY2FsbGVyczsgY3VycmVudCBTREsgdmVyc2lvbnNcbiAgICAvLyBhbHdheXMgZW1pdCBhIFVpbnQ4QXJyYXksIGFuZCBhIG1pc3NoYXBlbiB2YWx1ZSBoZXJlIGludGVudGlvbmFsbHlcbiAgICAvLyB0aHJvd3MgdmlhIGB1bmZsYXR0ZW5gIHNvIHRoZSBzdXJyb3VuZGluZyB0cnkvY2F0Y2ggaW4gbzExeSBoZWxwZXJzXG4gICAgLy8gc3VyZmFjZXMgdGhlIGlzc3VlIHJhdGhlciB0aGFuIG1hc2tpbmcgaXQuXG4gICAgcmV0dXJuIHVuZmxhdHRlbihkZWNyeXB0ZWQgYXMgYW55W10sIHtcbiAgICAgIC4uLmdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGVjcnlwdGVkKTtcblxuICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICBjb25zdCBzdHIgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZCk7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwge1xuICAgICAgLi4uZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdDogJHtmb3JtYXR9YCk7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZyBvZiBhIGBzdGVwX2NvbXBsZXRlZGAgZXZlbnQuXG4gKiBIeWRyYXRlcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgc3RlcCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBCaW5hcnkgc2VyaWFsaXplZCBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZGVjcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGRlY3J5cHRpb24pXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3IgZGVzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBleHRyYVJldml2ZXJzIC0gQWRkaXRpb25hbCByZXZpdmVycyBmb3IgY3VzdG9tIHR5cGVzXG4gKiBAcGFyYW0gcHJlcGFyZWQgLSBPcHRpb25hbCBjYWNoZWQgZGVjcnlwdC9kZWNvbXByZXNzIHJlc3VsdFxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZ1xuICogb2YgYSBgc3RlcF9jb21wbGV0ZWRgIGV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBwcmVwYXJlZD86IFByZXBhcmVkUmVwbGF5UGF5bG9hZFxuKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplUHJlcGFyZWRSZXBsYXlQYXlsb2FkKFxuICAgIHByZXBhcmVkID8/IChhd2FpdCBwcmVwYXJlUmVwbGF5UGF5bG9hZCh2YWx1ZSwga2V5KSksXG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnNcbiAgKTtcbn1cblxuLy8gLS0tLSBIZWxwZXJzIHRvIGV4dHJhY3Qgc3RyZWFtL1JlcXVlc3QvUmVzcG9uc2UgcmVkdWNlcnMgYW5kIHJldml2ZXJzIC0tLS1cbi8vIFRoZSBtb2RlLXNwZWNpZmljIGdldCpSZWR1Y2Vycy9nZXQqUmV2aXZlcnMgZnVuY3Rpb25zIHJldHVybiBvYmplY3RzIHRoYXRcbi8vIGluY2x1ZGUgYm90aCBcImNvbW1vblwiIGVudHJpZXMgKERhdGUsIEVycm9yLCBNYXAsIGV0Yy4pIGFuZCBtb2RlLXNwZWNpZmljXG4vLyBlbnRyaWVzIChSZWFkYWJsZVN0cmVhbSwgV3JpdGFibGVTdHJlYW0sIFJlcXVlc3QsIFJlc3BvbnNlLCBTdGVwRnVuY3Rpb24pLlxuLy8gVGhlIGNvbW1vbiBlbnRyaWVzIGFyZSBhbHJlYWR5IGNvbXBvc2VkIGJ5IHRoZSBjb2RlYy4gV2Ugb25seSBuZWVkIHRvXG4vLyBwYXNzIHRocm91Z2ggdGhlIG1vZGUtc3BlY2lmaWMgZW50cmllcyBhcyBleHRyYVJlZHVjZXJzL2V4dHJhUmV2aXZlcnMuXG5cbmNvbnN0IFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTID0gW1xuICAnUmVhZGFibGVTdHJlYW0nLFxuICAnV3JpdGFibGVTdHJlYW0nLFxuICAnUmVxdWVzdCcsXG4gICdSZXNwb25zZScsXG4gICdTdGVwRnVuY3Rpb24nLFxuICAvLyBXaXJlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCB0aHJvdWdoIHRoZSBjbGllbnQgc2VyaWFsaXphdGlvbiBwYXRoIHNvXG4gIC8vIHNpZ25hbHMgcmVhY2hhYmxlIHZpYSBSZXF1ZXN0LnNpZ25hbCAob3IgYXMgZGlyZWN0IGFyZ3VtZW50cykgZ2V0IHRoZWlyXG4gIC8vIGRlZGljYXRlZCByZWR1Y2VyLiBXaXRob3V0IHRoaXMsIGRldmFsdWUgZmFsbHMgYmFjayB0byBpdHMgYXJiaXRyYXJ5LVBPSk9cbiAgLy8gcGF0aCBhbmQgZmFpbHMgZm9yIGFueSBzaWduYWwgdGhlIFJlcXVlc3QgcmVkdWNlciBmb3J3YXJkcy5cbiAgJ0Fib3J0Q29udHJvbGxlcicsXG4gICdBYm9ydFNpZ25hbCcsXG5dIGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gIGFsbFJlZHVjZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiB7XG4gIGNvbnN0IGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBTVFJFQU1fQU5EX1JFUVVFU1RfS0VZUykge1xuICAgIGlmIChrZXkgaW4gYWxsUmVkdWNlcnMpIHtcbiAgICAgIGV4dHJhW2tleV0gPSBhbGxSZWR1Y2Vyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG5cbmZ1bmN0aW9uIGdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgYWxsUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+IHtcbiAgY29uc3QgZXh0cmE6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTKSB7XG4gICAgaWYgKGtleSBpbiBhbGxSZXZpdmVycykge1xuICAgICAgZXh0cmFba2V5XSA9IGFsbFJldml2ZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRyYTtcbn1cbiJdfQ==
|
|
3066
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixvQkFBb0IsR0FDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQywyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw0REFBNEQ7QUFDNUQsc0VBQXNFO0FBQ3RFLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLGtCQUFrQixHQUNuQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxZQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUVMLFFBQVEsRUFDUixVQUFVLEdBQ1gsTUFBTSxnQ0FBZ0MsQ0FB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QUssQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBSdW50aW1lRGVjcnlwdGlvbkVycm9yLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIFN0cmVhbUV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgb25jZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcGFyc2UsIHN0cmluZ2lmeSwgdW5mbGF0dGVuIH0gZnJvbSAnZGV2YWx1ZSc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmx1c2hhYmxlU3RhdGUsXG4gIGZsdXNoYWJsZVBpcGUsXG4gIGdldE1heEJ1ZmZlcmVkQnl0ZXMsXG4gIGdldE1heEJ5dGVzUGVyQmF0Y2gsXG4gIGdldE1heENodW5rc1BlckJhdGNoLFxuICBnZXRNYXhJbmZsaWdodENodW5rcyxcbiAgcG9sbFJlYWRhYmxlTG9jayxcbiAgcG9sbFdyaXRhYmxlTG9jayxcbn0gZnJvbSAnLi9mbHVzaGFibGUtc3RyZWFtLmpzJztcbmltcG9ydCB7IGdldFN0ZXBGdW5jdGlvbiB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG4vLyBWMjogdXNlIGdldFdvcmxkTGF6eSBpbiBzdGVwLXNpZGUgY29kZSBwYXRocyBzbyBUdXJib3BhY2sgY2FuIHN0YXRpY2FsbHlcbi8vIHJlc29sdmUgdGhlIHdvcmxkIGJyaWRnZSBmcm9tIHRoZSBzdGVwIGJ1bmRsZSB3aXRob3V0IGRyYWdnaW5nIHRoZSBmdWxsXG4vLyB3b3JsZC50cyBtb2R1bGUgKGFuZCBpdHMgZHluYW1pYy1pbXBvcnQgYmVoYXZpb3VyKSBpbnRvIHRoZSBmbG93IHJvdXRlLlxuLy8gU2VlIGBwYWNrYWdlcy9jb3JlL3NyYy9ydW50aW1lL2dldC13b3JsZC1sYXp5LnRzYCBhbmQgdGhlXG4vLyBcIlR1cmJvcGFjayBORlQgVHJhY2luZyBFcnJvcnMgaW4gVjIgQ29tYmluZWQgRmxvdyBSb3V0ZVwiIHNlY3Rpb24gb2Zcbi8vIGBkb2NzL2NvbnRlbnQvZG9jcy9jaGFuZ2Vsb2cvZWFnZXItcHJvY2Vzc2luZy5tZHhgLlxuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIGJ5dGVzVG9CYXNlNjQsXG4gIGNyZWF0ZU9wZW5TZXNzaW9uLFxuICBjcmVhdGVTZWFsU2Vzc2lvbixcbiAgZGVjb2RlUnVuUHVibGljS2V5LFxufSBmcm9tICcuL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0ICogYXMgY2xpZW50TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9jbGllbnQuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBDb21wcmVzc2lvblN0YXRzLFxuICBjb21wcmVzcyxcbiAgZGVjb21wcmVzcyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB7XG4gIGFlc0tleU9mLFxuICBkZWNyeXB0LFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGVuY3J5cHQsXG4gIGlzUnVuUGF5bG9hZEtleXMsXG4gIGlzU2VhbFRhcmdldCxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxuICByZXNvbHZlRW5jcnlwdGlvbktleSxcbiAgcnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgU2VhbFRhcmdldCxcbiAgc2VhbFRvLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IsXG4gIHJldGhyb3dJZlJ1bnRpbWVFcnJvcixcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2Vycm9ycy5qcyc7XG5pbXBvcnQge1xuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGlzRW5jcnlwdGVkLFxuICBwZWVrRm9ybWF0UHJlZml4LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZm9ybWF0LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgR3Vlc3RDb2RlU3RhdHMsXG4gIGlzSW5zdGFuY2VPZlByb3RvdHlwZSxcbiAgcmVhZFByb3BlcnR5LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vaGFyZGVuZWQuanMnO1xuaW1wb3J0IHtcbiAgZ2V0Q2xhc3NSZWR1Y2VycyxcbiAgZ2V0Q2xhc3NSZXZpdmVycyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NsYXNzLmpzJztcbmltcG9ydCB7XG4gIGdldENvbW1vblJlZHVjZXJzLFxuICBnZXRDb21tb25SZXZpdmVycyBhcyBnZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUsXG4gIHJldml2ZSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NvbW1vbi5qcyc7XG5pbXBvcnQge1xuICBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyLFxuICBnZXRTdGVwRnVuY3Rpb25SZXZpdmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBzdGVwTW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9zdGVwLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybWF0UHJlZml4LFxuICBpc0Zvcm1hdFByZWZpeCxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcbmltcG9ydCAqIGFzIHdvcmtmbG93TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0IHtcbiAgQUJPUlRfSE9PS19UT0tFTixcbiAgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQsXG4gIEFCT1JUX1JFQURFUl9DQU5DRUwsXG4gIEFCT1JUX1NUUkVBTV9OQU1FLFxuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgU1RSRUFNX0RSQUlOX1NZTUJPTCxcbiAgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MLFxuICBTVFJFQU1fTkFNRV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCxcbiAgU1RSRUFNX1RZUEVfU1lNQk9MLFxuICBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFLFxufSBmcm9tICcuL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0ciBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVTcGFuLCBnZXRTcGFuS2luZCwgcmVjb3JkRWxhcHNlZFNwYW4gfSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRBYm9ydFN0cmVhbUlkIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IFdvcmtmbG93QWJvcnRTaWduYWwgfSBmcm9tICcuL3dvcmtmbG93L2Fib3J0LWNvbnRyb2xsZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyBmcm9tIHRoZSBtb2R1bGFyIHNlcmlhbGl6YXRpb24gbW9kdWxlc1xuLy8gc28gZXhpc3RpbmcgY29uc3VtZXJzIG9mIGBAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uYCBrZWVwIHdvcmtpbmcuXG5leHBvcnQge1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICB0eXBlIEZvcm1hdFByZWZpeCxcbiAgaXNGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGRlY29kZUZvcm1hdFByZWZpeCxcbiAgcGVla0Zvcm1hdFByZWZpeCxcbiAgaXNFbmNyeXB0ZWQsXG4gIGVuY3J5cHQsXG4gIGRlY3J5cHQsXG4gIGNvbXByZXNzLFxuICBkZWNvbXByZXNzLFxuICB0eXBlIEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgLy8gU2VhbGVkLWJveCAoJ2VuY3AnKSBrZXkgdmFyaWFudHM6IHNlZSBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMuXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgdHlwZSBSdW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBTZWFsVGFyZ2V0LFxuICBzZWFsVG8sXG4gIHJ1blBheWxvYWRLZXlzLFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgaXNTZWFsVGFyZ2V0LFxuICBpc1J1blBheWxvYWRLZXlzLFxuICBhZXNLZXlPZixcbn07XG5cbi8vIFJlLWV4cG9ydCB0aGUgbGVnYWN5IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbi8vIE5ldyBjb2RlIHNob3VsZCB1c2UgRm9ybWF0UHJlZml4IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcycuXG5leHBvcnQgdHlwZSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSA9XG4gICh0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdClba2V5b2YgdHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXRdO1xuXG4vKipcbiAqIERlZmF1bHQgVUxJRCBnZW5lcmF0b3IgZm9yIGNvbnRleHRzIHdoZXJlIFZNJ3Mgc2VlZGVkIGBzdGFibGVVbGlkYCBpc24ndCBhdmFpbGFibGUuXG4gKiBVc2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBzZXJpYWxpemluZyBzdHJlYW1zIG91dHNpZGUgdGhlIHdvcmtmbG93IFZNIGNvbnRleHRcbiAqIChlLmcuLCB3aGVuIHN0YXJ0aW5nIGEgd29ya2Zsb3cgb3IgaGFuZGxpbmcgc3RlcCByZXR1cm4gdmFsdWVzKS5cbiAqL1xuY29uc3QgZGVmYXVsdFVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogRGV0ZWN0IGlmIGEgcmVhZGFibGUgc3RyZWFtIGlzIGEgYnl0ZSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHN0cmVhbVxuICogQHJldHVybnMgYFwiYnl0ZXNcImAgaWYgdGhlIHN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLCBgdW5kZWZpbmVkYCBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmVhbVR5cGUoc3RyZWFtOiBSZWFkYWJsZVN0cmVhbSk6ICdieXRlcycgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoeyBtb2RlOiAnYnlvYicgfSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgcmV0dXJuICdieXRlcyc7XG4gIH0gY2F0Y2gge31cbn1cblxuLyoqXG4gKiBGcmFtZSBmb3JtYXQgZm9yIHN0cmVhbSBjaHVua3M6XG4gKiAgIFs0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhdW2Zvcm1hdC1wcmVmaXhlZCBwYXlsb2FkXVxuICpcbiAqIEVhY2ggY2h1bmsgaXMgaW5kZXBlbmRlbnRseSBmcmFtZWQgc28gdGhlIGRlc2VyaWFsaXplciBjYW4gZmluZFxuICogY2h1bmsgYm91bmRhcmllcyBldmVuIHdoZW4gbXVsdGlwbGUgY2h1bmtzIGFyZSBjb25jYXRlbmF0ZWQgb3JcbiAqIHNwbGl0IGFjcm9zcyB0cmFuc3BvcnQgcmVhZHMuXG4gKi9cbmNvbnN0IEZSQU1FX0hFQURFUl9TSVpFID0gNDtcblxuLyoqXG4gKiBUaGUgbW9kZS1zcGVjaWZpYyBzZXJpYWxpemVycyAoYC4vc2VyaWFsaXphdGlvbi97Y2xpZW50LHN0ZXAsd29ya2Zsb3d9LnRzYClcbiAqIGFscmVhZHkgdGhyb3cgYSBgU2VyaWFsaXphdGlvbkVycm9yYCB3aG9zZSBgLmNhdXNlYCBpcyB0aGUgdW5kZXJseWluZ1xuICogZGV2YWx1ZSAvIHNlcmRlIGZhaWx1cmUuIFRoZSBvdXRlciBkZWh5ZHJhdGUvaHlkcmF0ZSB3cmFwcGVycyB3YW50IHRvXG4gKiByZS1mcmFtZSB0aGF0IGVycm9yIHdpdGggYSBtb3JlIHNwZWNpZmljIGNvbnRleHQgbGFiZWwgKGUuZy4gXCJ3b3JrZmxvd1xuICogYXJndW1lbnRzXCIgaW5zdGVhZCBvZiBnZW5lcmljIFwid29ya2Zsb3cgdmFsdWVcIiksIHNvIHRoZXkgdW53cmFwIHRoZVxuICogaW5uZXIgU2VyaWFsaXphdGlvbkVycm9yIGFuZCByZWZvcm1hdCB3aXRoIHRoZSBvcmlnaW5hbCBjYXVzZS4gRXJyb3JzXG4gKiB0aGF0IGFyZW4ndCBhbHJlYWR5IFNlcmlhbGl6YXRpb25FcnJvciBmbG93IHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBpcyBhbiBleGNlcHRpb246IGl0IG11c3Qga2VlcCBpdHMgaWRlbnRpdHkgKGFuZFxuICogYGNvbnRleHRgKSBzbyB0aGUgcnVuLWZhaWx1cmUgY2xhc3NpZmllciByb3V0ZXMgaXQgdG8gYFJVTlRJTUVfRVJST1JgLFxuICogc28gdGhpcyByZXRocm93cyBpdCB1bmNoYW5nZWQgYmVmb3JlIGFueSB1bndyYXBwaW5nLiBOb3RlIHRoaXMgZ3VhcmRcbiAqIG11c3QgcnVuIGJlZm9yZSB0aGUgZ2VuZXJpYyBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIHVud3JhcCBiZWxvdywgc2luY2VcbiAqIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCBleHRlbmRzIGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgYW5kIGNhcnJpZXMgYVxuICogYGNhdXNlYCAodGhlIHVuZGVybHlpbmcgRE9NRXhjZXB0aW9uKSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSB1bndyYXBwZWRcbiAqIGFuZCByZWZyYW1lZCBhcyBhIGBTZXJpYWxpemF0aW9uRXJyb3JgLlxuICovXG5mdW5jdGlvbiB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3I6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0aHJvd0lmUnVudGltZUVycm9yKGVycm9yKTtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VyaWFsaXphdGlvbkVycm9yICYmIGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2U7XG4gIH1cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya2Zsb3dSdW50aW1lRXJyb3IgJiYgZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbi8qKlxuICogRW1pdCBjb21wcmVzc2lvbiB0ZWxlbWV0cnkgb250byB0aGUgYWN0aXZlIHNwYW4gYWZ0ZXIgYSAoZGUpc2VyaWFsaXplLlxuICpcbiAqIFRoZSBjb21wcmVzc2lvbiBsYXllciBwb3B1bGF0ZXMgYHN0YXRzYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgcmFuIChiaW5hcnlcbiAqIGRhdGEgb24gYSBzcGVjID49IDUgcGF0aCk7IGxlZ2FjeSAvIHYxQ29tcGF0IHBhdGhzIGxlYXZlIGl0IHVucmVjb3JkZWQsIHNvXG4gKiB0aGlzIG5vLW9wcyBmb3IgdGhlbSBhbmQgYXZvaWRzIHRoZSBgZ2V0QWN0aXZlU3BhbmAgbG9va3VwLiBBdHRyaWJ1dGVzIGxhbmRcbiAqIG9uIHdoYXRldmVyIHNwYW4gaXMgYWN0aXZlLCB0eXBpY2FsbHkgdGhlIGRlZGljYXRlZCBgc3RlcC5kZWh5ZHJhdGVgIC9cbiAqIGBzdGVwLmh5ZHJhdGVgIHNwYW4sIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIHJ1bi9zdGFydCBzcGFuLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWNvcmRDb21wcmVzc2lvbihcbiAgc3RhdHM6IENvbXByZXNzaW9uU3RhdHMsXG4gIG9wZXJhdGlvbjogJ3NlcmlhbGl6ZScgfCAnZGVzZXJpYWxpemUnXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFzdGF0cy5yZWNvcmRlZCkgcmV0dXJuO1xuICAvLyBUZWxlbWV0cnkgbXVzdCBuZXZlciBicmVhayB0aGUgc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgcGF0aDogYVxuICAvLyBtaXNzaW5nL2ZhaWxpbmcgdHJhY2VyIGlzIHB1cmVseSBhbiBvYnNlcnZhYmlsaXR5IGxvc3MuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCB1bmNvbXByZXNzZWRCeXRlcyA9IHN0YXRzLnVuY29tcHJlc3NlZEJ5dGVzID8/IDA7XG4gICAgY29uc3Qgc3RvcmVkQnl0ZXMgPSBzdGF0cy5zdG9yZWRCeXRlcyA/PyAwO1xuICAgIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25PcGVyYXRpb24ob3BlcmF0aW9uKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvbkNvbXByZXNzZWQoc3RhdHMuY29tcHJlc3NlZCA/PyBmYWxzZSksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25Db2RlYyhzdGF0cy5jb2RlYyA/PyAnbm9uZScpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uVW5jb21wcmVzc2VkQnl0ZXModW5jb21wcmVzc2VkQnl0ZXMpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uU3RvcmVkQnl0ZXMoc3RvcmVkQnl0ZXMpLFxuICAgICAgLi4uKHN0YXRzLmNvbXByZXNzZWQgJiYgdW5jb21wcmVzc2VkQnl0ZXMgPiAwXG4gICAgICAgID8gQXR0ci5TZXJpYWxpemF0aW9uQ29tcHJlc3Npb25SYXRpbyhcbiAgICAgICAgICAgIDEgLSBzdG9yZWRCeXRlcyAvIHVuY29tcHJlc3NlZEJ5dGVzXG4gICAgICAgICAgKVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIHRlbGVtZXRyeSBmYWlsdXJlc1xuICB9XG59XG5cbi8qKlxuICogRW1pdHMgT1RlbCBzcGFuIGF0dHJpYnV0ZXMgZm9yIHdvcmtmbG93IChndWVzdCkgY29kZSBleGVjdXRpb25zIHRoYXQgdGhlXG4gKiBoYXJkZW5lZCBzZXJpYWxpemVyIGNvdWxkIG5vdCBhdm9pZCAoZ2V0dGVycywgcHJveGllcywgY3VzdG9tXG4gKiBzZXJpYWxpemVycykuIE5vLW9wcyB3aGVuIHNlcmlhbGl6YXRpb24gd2FzIGZ1bGx5IHNpZGUtZWZmZWN0IGZyZWUsXG4gKiB0aGUgY29tbW9uIGNhc2UuIFNhbWUgbmV2ZXItYnJlYWstdGhlLWRhdGEtcGF0aCBjb250cmFjdCBhc1xuICogYHJlY29yZENvbXByZXNzaW9uYCBhYm92ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkR3Vlc3RDb2RlRXhlY3V0aW9ucyhzdGF0czogR3Vlc3RDb2RlU3RhdHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHN0YXRzLmV4ZWN1dGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3Qgc3BhbiA9IGF3YWl0IGdldEFjdGl2ZVNwYW4oKTtcbiAgICBpZiAoIXNwYW4pIHJldHVybjtcbiAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgc3RhdHMuZXhlY3V0aW9ucy5tYXAoKGUpID0+XG4gICAgICAgICAgZS5kZXRhaWwgPyBgJHtlLmtpbmR9ICgke2UuZGV0YWlsfSlgIDogZS5raW5kXG4gICAgICAgIClcbiAgICAgICksXG4gICAgXTtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uR3Vlc3RDb2RlRXhlY3V0aW9ucyhzdGF0cy5leGVjdXRpb25zLmxlbmd0aCksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25HdWVzdENvZGVEZXRhaWxzKGRldGFpbHMpLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgdGVsZW1ldHJ5IGZhaWx1cmVzXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgcmVkdWNlcnM6IFBhcnRpYWw8UmVkdWNlcnM+LFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogVHJhbnNmb3JtU3RyZWFtPGFueSwgVWludDhBcnJheT4ge1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIC8vIFJlc29sdmUgdGhlIGtleSBpbnB1dCBvbmNlIG9uIGZpcnN0IHVzZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC5cbiAgLy8gTm90ZTogaWYgcmVzb2x2aW5nIGNyeXB0b0tleSByZWplY3RzIChlLmcuLCBuZXR3b3JrIGVycm9yIGZldGNoaW5nXG4gIC8vIHRoZSBkZXJpdmVkIGtleSksIHRoZSByZWplY3Rpb24gd29uJ3Qgc3VyZmFjZSB1bnRpbCB0aGUgZmlyc3QgY2h1bmtcbiAgLy8gaXMgcHJvY2Vzc2VkLCBub3QgYXQgc3RyZWFtIGNvbnN0cnVjdGlvbiB0aW1lLlxuICBjb25zdCBrZXlTdGF0ZSA9IHtcbiAgICByZXNvbHZlZDogZmFsc2UsXG4gICAga2V5OiB1bmRlZmluZWQgYXMgUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgfTtcbiAgLy8gU2V0IHdoZW4gdGhlIHJlc29sdmVkIGtleSBpcyBhIHNlYWwgdGFyZ2V0OyBhbW9ydGl6ZXMgdGhlIEtFTSBhY3Jvc3MgYWxsXG4gIC8vIGZyYW1lcyB0aGlzIHN0cmVhbSBpbnN0YW5jZSB3cml0ZXMuXG4gIGxldCBzZWFsU2Vzc2lvbjogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlU2VhbFNlc3Npb24+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPGFueSwgVWludDhBcnJheT4oe1xuICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFrZXlTdGF0ZS5yZXNvbHZlZCkge1xuICAgICAgICAgIGtleVN0YXRlLmtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICAgICAga2V5U3RhdGUucmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpc1NlYWxUYXJnZXQoa2V5U3RhdGUua2V5KSkge1xuICAgICAgICAgICAgc2VhbFNlc3Npb24gPSBjcmVhdGVTZWFsU2Vzc2lvbihcbiAgICAgICAgICAgICAga2V5U3RhdGUua2V5LnJlY2lwaWVudFB1YmxpY0tleSxcbiAgICAgICAgICAgICAga2V5U3RhdGUua2V5LmFhZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHN0cmluZ2lmeShjaHVuaywgcmVkdWNlcnMpO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gZW5jb2Rlci5lbmNvZGUoc2VyaWFsaXplZCk7XG4gICAgICAgIGxldCBwcmVmaXhlZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKSBhcyBVaW50OEFycmF5O1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIGZyYW1lIHBheWxvYWQgaWYgYSBrZXkgaXMgcHJvdmlkZWQuXG4gICAgICAgIC8vIFRoZSBsZW5ndGggaGVhZGVyIHJlbWFpbnMgaW4gdGhlIGNsZWFyIHNvIHRoZSBkZXNlcmlhbGl6ZXIgY2FuXG4gICAgICAgIC8vIGZpbmQgZnJhbWUgYm91bmRhcmllcyByZWdhcmRsZXNzIG9mIHRyYW5zcG9ydCBjaHVua2luZy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRXZlcnkgZnJhbWUgZ2V0cyBhIGZyZXNoIHJhbmRvbSBub25jZS4gTmV2ZXIgc3dpdGNoIHRoaXMgdG8gYVxuICAgICAgICAvLyBjb3VudGVyOiBhIHN0cmVhbSByZWNvbm5lY3Qgb3IgYSBkdXJhYmxlIHJlcGxheSByZXN0YXJ0cyB0aGUgd3JpdGVyLFxuICAgICAgICAvLyB3aGljaCB3b3VsZCByZXBlYXQgYChrZXksIG5vbmNlKWAgYW5kIGNhdGFzdHJvcGhpY2FsbHkgYnJlYWtcbiAgICAgICAgLy8gQUVTLUdDTS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gT24gdGhlIHNlYWxlZCBwYXRoIHRoZSBLRU0gaXMgYW1vcnRpemVkIGFjcm9zcyB0aGUgc3RyZWFtIHZpYSBhXG4gICAgICAgIC8vIHNlc3Npb24gKG9uZSBFQ0RIIHBlciB3cml0ZXIgaW5zdGVhZCBvZiBvbmUgcGVyIGZyYW1lKS4gVGhhdCBpcyBzYWZlXG4gICAgICAgIC8vIHByZWNpc2VseSBiZWNhdXNlIHRoZSBub25jZXMgc3RheSByYW5kb20sIGFuZCBiZWNhdXNlIHRoZSBzZXNzaW9uIGlzXG4gICAgICAgIC8vIHNjb3BlZCB0byB0aGlzIHN0cmVhbSBpbnN0YW5jZTogYSByZXBsYXllZCBvciByZWNvbm5lY3RlZCB3cml0ZXJcbiAgICAgICAgLy8gYnVpbGRzIGEgbmV3IG9uZSBhbmQgbmV2ZXIgaW5oZXJpdHMgYSBwcmV2aW91cyBjb250ZW50IGtleS5cbiAgICAgICAgaWYgKHNlYWxTZXNzaW9uKSB7XG4gICAgICAgICAgcHJlZml4ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRUQsXG4gICAgICAgICAgICBhd2FpdCBzZWFsU2Vzc2lvbi5zZWFsKHByZWZpeGVkKVxuICAgICAgICAgICkgYXMgVWludDhBcnJheTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlTdGF0ZS5rZXkpIHtcbiAgICAgICAgICBwcmVmaXhlZCA9IChhd2FpdCBlbmNyeXB0KHByZWZpeGVkLCBrZXlTdGF0ZS5rZXkpKSBhcyBVaW50OEFycmF5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgbGVuZ3RoLXByZWZpeGVkIGZyYW1lOiBbNC1ieXRlIGxlbmd0aF1bcHJlZml4ZWQgZGF0YV1cbiAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgVWludDhBcnJheShGUkFNRV9IRUFERVJfU0laRSArIHByZWZpeGVkLmxlbmd0aCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhmcmFtZS5idWZmZXIpLnNldFVpbnQzMigwLCBwcmVmaXhlZC5sZW5ndGgsIGZhbHNlKTtcbiAgICAgICAgZnJhbWUuc2V0KHByZWZpeGVkLCBGUkFNRV9IRUFERVJfU0laRSk7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShmcmFtZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFbmNyeXB0aW9uIGZhaWx1cmVzIG11c3Qga2VlcCB0aGVpciBSdW50aW1lRGVjcnlwdGlvbkVycm9yXG4gICAgICAgIC8vIGlkZW50aXR5IChSVU5USU1FX0VSUk9SKSByYXRoZXIgdGhhbiBiZSByZWZyYW1lZCBhcyBhXG4gICAgICAgIC8vIFNlcmlhbGl6YXRpb25FcnJvciAoVVNFUl9FUlJPUikuXG4gICAgICAgIGlmIChSdW50aW1lRGVjcnlwdGlvbkVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnc3RyZWFtIGNodW5rJyxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApO1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZTogZXJyb3IgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICByZXZpdmVyczogUGFydGlhbDxSZXZpdmVycz4sXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgYW55PiB7XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHQuXG4gIGNvbnN0IGtleVN0YXRlID0ge1xuICAgIHJlc29sdmVkOiBmYWxzZSxcbiAgICBrZXk6IHVuZGVmaW5lZCBhcyBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICB9O1xuICAvLyBNaXJyb3Igb2YgdGhlIHdyaXRlcidzIHNlYWwgc2Vzc2lvbjogZXZlcnkgZnJhbWUgZnJvbSBvbmUgd3JpdGVyIGNhcnJpZXNcbiAgLy8gdGhlIHNhbWUgZXBoZW1lcmFsIHB1YmxpYyBrZXksIHNvIHRoaXMgdHVybnMgYW4gRUNESCBwZXIgZnJhbWUgaW50byBhblxuICAvLyBFQ0RIIHBlciB3cml0ZXIuXG4gIGxldCBvcGVuU2Vzc2lvbjogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlT3BlblNlc3Npb24+IHwgdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGFwcGVuZFRvQnVmZmVyKGRhdGE6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBuZXdCdWZmZXIgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgZGF0YS5sZW5ndGgpO1xuICAgIG5ld0J1ZmZlci5zZXQoYnVmZmVyLCAwKTtcbiAgICBuZXdCdWZmZXIuc2V0KGRhdGEsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGcmFtZXMoXG4gICAgY29udHJvbGxlcjogVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI8YW55PlxuICApIHtcbiAgICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHRcbiAgICBpZiAoIWtleVN0YXRlLnJlc29sdmVkKSB7XG4gICAgICBrZXlTdGF0ZS5rZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAga2V5U3RhdGUucmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgaWYgKGlzUnVuUGF5bG9hZEtleXMoa2V5U3RhdGUua2V5KSkge1xuICAgICAgICBvcGVuU2Vzc2lvbiA9IGNyZWF0ZU9wZW5TZXNzaW9uKGtleVN0YXRlLmtleS5rZXlQYWlyLCBrZXlTdGF0ZS5rZXkuYWFkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBjb21wbGV0ZSBsZW5ndGgtcHJlZml4ZWQgZnJhbWVzXG4gICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICBidWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcblxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrOyAvLyBJbmNvbXBsZXRlIGZyYW1lLCB3YWl0IGZvciBtb3JlIGRhdGFcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJhbWVEYXRhID0gYnVmZmVyLnNsaWNlKFxuICAgICAgICBGUkFNRV9IRUFERVJfU0laRSxcbiAgICAgICAgRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aFxuICAgICAgKTtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoKTtcblxuICAgICAgbGV0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZnJhbWVEYXRhKTtcblxuICAgICAgLy8gSWYgdGhlIGZyYW1lIHBheWxvYWQgaXMgZW5jcnlwdGVkIG9yIHNlYWxlZCwgcmVjb3ZlciBpdCBmaXJzdCB0b1xuICAgICAgLy8gcmV2ZWFsIHRoZSBpbm5lciBmb3JtYXQtcHJlZml4ZWQgZGF0YSAoZS5nLiwgJ2RldmwnICsgc2VyaWFsaXplZFxuICAgICAgLy8gdGV4dCksIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHRoZSBub3JtYWwgZGVzZXJpYWxpemF0aW9uIHBhdGguXG4gICAgICBpZiAoXG4gICAgICAgIGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQgfHxcbiAgICAgICAgZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlNFQUxFRFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHNlYWxlZCA9IGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRUQ7XG4gICAgICAgIC8vIEEgc2VhbGVkIGZyYW1lIG5lZWRzIHRoZSBydW4ncyBrZXlwYWlyOyBhIHN5bW1ldHJpYyBmcmFtZSBuZWVkcyBhblxuICAgICAgICAvLyBBRVMga2V5LiBSZXBvcnQgdGhlIHNob3J0ZmFsbCBwcmVjaXNlbHk6IFwibm8ga2V5IGF0IGFsbFwiIGFuZCBcInRoZVxuICAgICAgICAvLyB3cm9uZyBraW5kIG9mIGtleVwiIGhhdmUgZGlzdGluY3QgY2F1c2VzLlxuICAgICAgICBjb25zdCB1c2FibGUgPSBzZWFsZWRcbiAgICAgICAgICA/IGlzUnVuUGF5bG9hZEtleXMoa2V5U3RhdGUua2V5KVxuICAgICAgICAgIDogYWVzS2V5T2Yoa2V5U3RhdGUua2V5KSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIXVzYWJsZSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgICBuZXcgUnVudGltZURlY3J5cHRpb25FcnJvcihcbiAgICAgICAgICAgICAgc2VhbGVkXG4gICAgICAgICAgICAgICAgPyAnU2VhbGVkIHN0cmVhbSBkYXRhIGVuY291bnRlcmVkIGJ1dCBubyBydW4ga2V5cGFpciBpcyBhdmFpbGFibGUuICcgK1xuICAgICAgICAgICAgICAgICAgICBcIk9wZW5pbmcgYSBzZWFsZWQgZnJhbWUgcmVxdWlyZXMgdGhlIHJ1bidzIG93biBlbmNyeXB0aW9uIGtleSBtYXRlcmlhbC5cIlxuICAgICAgICAgICAgICAgIDogJ0VuY3J5cHRlZCBzdHJlYW0gZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8gZW5jcnlwdGlvbiBrZXkgaXMgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ0VuY3J5cHRpb24gaXMgbm90IGNvbmZpZ3VyZWQgb3Igbm8ga2V5IHdhcyBwcm92aWRlZCBmb3IgdGhpcyBydW4uJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2RlY3J5cHQnLFxuICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogcGF5bG9hZC5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgZm9ybWF0UHJlZml4OiBzZWFsZWQgPyAnZW5jcCcgOiAnZW5jcicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkZWNyeXB0ZWQ6IFVpbnQ4QXJyYXk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gU2VhbGVkIGZyYW1lcyBnbyB0aHJvdWdoIHRoZSBzZXNzaW9uIHNvIHJlcGVhdGVkIGZyYW1lcyBmcm9tIG9uZVxuICAgICAgICAgIC8vIHdyaXRlciByZXVzZSBhIHNpbmdsZSBkZWNhcHN1bGF0aW9uLiBFdmVyeXRoaW5nIGVsc2UgZGVsZWdhdGVzIHRvXG4gICAgICAgICAgLy8gdGhlIHNoYXJlZCBlbnZlbG9wZSBsYXllciwga2VlcGluZyB0aGUgdHdvIHNjaGVtZXMgaW4gbG9ja3N0ZXBcbiAgICAgICAgICAvLyB3aXRoIHRoZSBvbmUtc2hvdCBwYXRoLlxuICAgICAgICAgIGRlY3J5cHRlZCA9IHNlYWxlZFxuICAgICAgICAgICAgPyBhd2FpdCBvcGVuU2Vzc2lvbiEub3BlbihkZWNvZGVGb3JtYXRQcmVmaXgoZnJhbWVEYXRhKS5wYXlsb2FkKVxuICAgICAgICAgICAgOiAoKGF3YWl0IGRlY3J5cHQoZnJhbWVEYXRhLCBrZXlTdGF0ZS5rZXkpKSBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGUgbG93LWxldmVsIGNyeXB0byBsYXllciBvbmx5IHNlZXMgdGhlIHN0cmlwcGVkIHBheWxvYWQsIHNvIGl0XG4gICAgICAgICAgLy8gY2Fubm90IHJlY29yZCB0aGUgb3V0ZXIgZW52ZWxvcGUgcHJlZml4LiBXZSBwZWVrZWQgaXQgaGVyZSwgc29cbiAgICAgICAgICAvLyBlbnJpY2ggdGhlIGRpYWdub3N0aWMgY29udGV4dCB3aXRoIHRoZSByZWFsIGZvcm1hdCBwcmVmaXggYmVmb3JlXG4gICAgICAgICAgLy8gcHJvcGFnYXRpbmcsIG1pcnJvcmluZyBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMuXG4gICAgICAgICAgaWYgKFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuaXMoZXJyb3IpICYmIGVycm9yLmNvbnRleHQpIHtcbiAgICAgICAgICAgIGVycm9yLmNvbnRleHQuZm9ybWF0UHJlZml4ID0gZm9ybWF0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAoeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZShwYXlsb2FkKTtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHBhcnNlKHRleHQsIHJldml2ZXJzKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RyZWFtID0gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBhbnk+KHtcbiAgICBhc3luYyB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIEZpcnN0LCB0cnkgdG8gZGV0ZWN0IGlmIHRoaXMgaXMgbGVuZ3RoLXByZWZpeGVkIGZyYW1lZCBkYXRhXG4gICAgICAvLyBieSBjaGVja2luZyBpZiB0aGUgZmlyc3QgNCBieXRlcyBmb3JtIGEgcGxhdXNpYmxlIGxlbmd0aC5cbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwICYmIGNodW5rLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICBjb25zdCBwb3NzaWJsZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgICBjaHVuay5idWZmZXIsXG4gICAgICAgICAgY2h1bmsuYnl0ZU9mZnNldCxcbiAgICAgICAgICBjaHVuay5ieXRlTGVuZ3RoXG4gICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBvc3NpYmxlTGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHBvc3NpYmxlTGVuZ3RoIDwgMTAwXzAwMF8wMDAgLy8gc2FuaXR5IGNoZWNrOiA8IDEwME1CXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIExvb2tzIGxpa2UgZnJhbWVkIGRhdGFcbiAgICAgICAgICBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG4gICAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gQWxyZWFkeSBpbiBmcmFtZWQgbW9kZSAoaGF2ZSBidWZmZXJlZCBkYXRhKVxuICAgICAgICBhcHBlbmRUb0J1ZmZlcihjaHVuayk7XG4gICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTGVnYWN5IGZvcm1hdDogbmV3bGluZS1kZWxpbWl0ZWQgZGV2YWx1ZSB0ZXh0IChubyBmcmFtaW5nKVxuICAgICAgY29uc3QgdGV4dCA9IGRlY29kZXIuZGVjb2RlKGNodW5rKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShwYXJzZShsaW5lLCByZXZpdmVycykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICAvLyBQcm9jZXNzIGFueSByZW1haW5pbmcgZnJhbWVkIGRhdGFcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCeXRlLXN0cmVhbSB3aXJlIGZyYW1pbmdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vXG4vLyBCeXRlIHN0cmVhbXMgKGB0eXBlOiAnYnl0ZXMnYCBSZWFkYWJsZVN0cmVhbXMgcGFzc2VkIGFjcm9zcyBib3VuZGFyaWVzKVxuLy8gYXJlIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgd29ybGQncyBzdHJlYW0gdHJhbnNwb3J0IG9uZSB1c2VyIGNodW5rIGF0XG4vLyBhIHRpbWUuIFdpdGhvdXQgYW4gaW4tYmFuZCBlbnZlbG9wZSwgdGhlIHJlYWRlciBzZWVzIGEgZmxhdCBzdHJlYW0gb2Zcbi8vIGJ5dGVzOiB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCB3aGVyZSBvbmUgdXNlciBjaHVuayBlbmRzIGFuZCB0aGUgbmV4dFxuLy8gYmVnaW5zLCB3aGljaCBtYWtlcyBtaWQtc3RyZWFtIHJlY29ubmVjdCBpbXBvc3NpYmxlICh3ZSBkb24ndCBrbm93IGhvd1xuLy8gbWFueSBzZXJ2ZXItc2lkZSBjaHVua3MgaGF2ZSBiZWVuIGNvbnN1bWVkKS5cbi8vXG4vLyBUbyBlbmFibGUgdHJhbnNwYXJlbnQgcmVjb25uZWN0LCB0aGlzIFBSIGludHJvZHVjZXMgYW4gb3B0LWluIHdpcmVcbi8vIGVudmVsb3BlIHRoYXQgd3JhcHMgZWFjaCB1c2VyIGNodW5rIGluIGEgbGVuZ3RoLXByZWZpeDpcbi8vXG4vLyAgIFs0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhdW3VzZXIgcGF5bG9hZCBieXRlc11cbi8vXG4vLyBUaGUgZW52ZWxvcGUgaXMgaWRlbnRpY2FsIGluIHNoYXBlIHRvIGBnZXRTZXJpYWxpemVTdHJlYW1gJ3MgZnJhbWluZyxcbi8vIGJ1dCB0aGUgcGF5bG9hZCBoZXJlIGlzICpyYXcgdXNlciBieXRlcyo6IHRoZXJlIGlzIG5vIGlubmVyXG4vLyBmb3JtYXQtcHJlZml4LCBubyBkZXZhbHVlLCBubyBlbmNyeXB0aW9uLiBBIGZyYW1lZCBieXRlIHN0cmVhbSBzdGF5c1xuLy8gc2VtYW50aWNhbGx5IGEgYnl0ZSBzdHJlYW0gZW5kLXRvLWVuZDsgdGhlIGZyYW1pbmcgaXMgcHVyZWx5IHRyYW5zcG9ydC5cbi8vXG4vLyBUaGUgZGVjaXNpb24gdG8gdXNlIGZyYW1pbmcgZm9yIGEgZ2l2ZW4gc3RyZWFtIGlzIHJlY29yZGVkIGluIHRoZVxuLy8gc2VyaWFsaXplZCBzdHJlYW0gcmVmIChgZnJhbWluZzogJ2ZyYW1lZC12MSdgKSwgc28gYm90aCBzaWRlcyBhZ3JlZSBvblxuLy8gdGhlIHdpcmUgZm9ybWF0IHdpdGhvdXQgcnVudGltZSBuZWdvdGlhdGlvbi4gUHJvZHVjZXJzIHRoYXQgdGFyZ2V0IGFcbi8vIHJ1biB3aG9zZSBkZXBsb3ltZW50IGRvZXNuJ3Qgc3VwcG9ydCBmcmFtaW5nIChzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2Bcbi8vIGluIGNhcGFiaWxpdGllcy50cykgZW1pdCByYXcgYnl0ZXMgYW5kIGEgcmVmIHdpdGhvdXQgdGhlIGZpZWxkLCB3aGljaFxuLy8gdGhlIHJlYWRlciB0cmVhdHMgYXMgbGVnYWN5IHJhdyBieXRlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5cbi8qKlxuICogTWF4aW11bSBhbGxvd2VkIGJ5dGUtc3RyZWFtIGZyYW1lIHBheWxvYWQgc2l6ZSAoMTAwTUIpLiBTaGFyZWQgYnkgdGhlXG4gKiBmcmFtZXIgKHJlamVjdHMgb3ZlcnNpemVkIHVzZXIgY2h1bmtzIGF0IHdyaXRlIHRpbWUsIHdoZXJlIHRoZSBlcnJvciBpc1xuICogYWN0aW9uYWJsZSkgYW5kIHRoZSB1bmZyYW1lciAocmVqZWN0cyBvdmVyc2l6ZWQgbGVuZ3RoIGhlYWRlcnMgYXQgcmVhZFxuICogdGltZSwgd2hpY2ggdXN1YWxseSBpbmRpY2F0ZSBhIG5vbi1mcmFtZWQgd2lyZSBiZWluZyByZWFkIGFzIGZyYW1lZCkuXG4gKiBLZWVwaW5nIGJvdGggc2lkZXMgb24gb25lIGNvbnN0YW50IGd1YXJhbnRlZXMgYW55IGNodW5rIHRoZSBmcmFtZXJcbiAqIGFjY2VwdHMgY2FuIGFsd2F5cyBiZSBkZWNvZGVkIGJ5IHRoZSB1bmZyYW1lci5cbiAqL1xuY29uc3QgTUFYX0ZSQU1FX1NJWkUgPSAxMDBfMDAwXzAwMDtcblxuLyoqXG4gKiBXcmFwcyBlYWNoIGNodW5rIG9mIGEgYnl0ZSBzdHJlYW0gaW4gYSA0LWJ5dGUgYmlnLWVuZGlhbiBsZW5ndGhcbiAqIHByZWZpeC4gVXNlZCBieSB0aGUgcHJvZHVjZXIgc2lkZSBvZiBhIGZyYW1lZCBieXRlLXN0cmVhbSBwaXBlLlxuICpcbiAqIEVtcHR5IGNodW5rcyAobGVuZ3RoIDApIGFyZSBkcm9wcGVkOiB0aGUgcmVzdWx0aW5nIGBbMHgwMCAweDAwIDB4MDAgMHgwMF1gXG4gKiBmcmFtZSB3b3VsZCBiZSBhbWJpZ3VvdXMgd2l0aCB0aGUgbGVnYWN5IFwibG9va3MgZnJhbWVkXCIgZGV0ZWN0aW9uIGluXG4gKiBgZ2V0RGVzZXJpYWxpemVTdHJlYW1gLCBhbmQgaXQgY2FycmllcyBubyBpbmZvcm1hdGlvbi5cbiAqXG4gKiBMb2FkLWJlYXJpbmcgaW52YXJpYW50OiBlYWNoIHVzZXIgY2h1bmsgYmVjb21lcyBleGFjdGx5IG9uZSBmcmFtZSwgYW5kXG4gKiBlYWNoIGZyYW1lIGlzIGVucXVldWVkIGFzIGV4YWN0bHkgb25lIHRyYW5zcG9ydCBjaHVuayAodGhlIGRvd25zdHJlYW1cbiAqIHdyaXRhYmxlIHBlcmZvcm1zIG9uZSB3aXJlIHdyaXRlIHBlciBjaHVuaywgcHJlc2VydmluZyBib3VuZGFyaWVzKS4gVGhlXG4gKiBzZXJ2ZXIgdGhlcmVmb3JlIHN0b3JlcyBvbmUgZnJhbWUgcGVyIGNodW5rIGluZGV4LCB3aGljaCBpcyB3aGF0IGFsbG93c1xuICogYSBmdXR1cmUgcmVjb25uZWN0aW5nIHJlYWRlciB0byByZXN1bWUgYSBmcmFtZWQgYnl0ZSBzdHJlYW0gYXRcbiAqIGBzdGFydEluZGV4ICsgY29uc3VtZWRGcmFtZXNgLCB0aGUgc2FtZSBhcml0aG1ldGljXG4gKiBgY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtYCByZWxpZXMgb24gZm9yIG9iamVjdCBzdHJlYW1zLiBEbyBub3RcbiAqIGNvYWxlc2NlIG9yIHNwbGl0IGZyYW1lcyBoZXJlIHdpdGhvdXQgcmV2aXNpdGluZyB0aGF0IHJlc3VtZSBsb2dpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ5dGVGcmFtaW5nU3RyZWFtKCk6IFRyYW5zZm9ybVN0cmVhbTxcbiAgVWludDhBcnJheSxcbiAgVWludDhBcnJheVxuPiB7XG4gIHJldHVybiBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+KHtcbiAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiBNQVhfRlJBTUVfU0laRSkge1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBjaHVuayBvZiAke2NodW5rLmxlbmd0aH0gYnl0ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSBgICtcbiAgICAgICAgICAgICAgYGZyYW1lZCBjaHVuayBzaXplICgke01BWF9GUkFNRV9TSVpFfSkuIFNwbGl0IHRoZSBkYXRhIGludG8gYCArXG4gICAgICAgICAgICAgIGBzbWFsbGVyIGNodW5rcyBiZWZvcmUgd3JpdGluZy5gLFxuICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFVpbnQ4QXJyYXkoRlJBTUVfSEVBREVSX1NJWkUgKyBjaHVuay5sZW5ndGgpO1xuICAgICAgbmV3IERhdGFWaWV3KGZyYW1lLmJ1ZmZlcikuc2V0VWludDMyKDAsIGNodW5rLmxlbmd0aCwgZmFsc2UpO1xuICAgICAgZnJhbWUuc2V0KGNodW5rLCBGUkFNRV9IRUFERVJfU0laRSk7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUoZnJhbWUpO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFVud3JhcHMgbGVuZ3RoLXByZWZpeGVkIGJ5dGUtc3RyZWFtIGZyYW1lcyBiYWNrIGludG8gdGhlIG9yaWdpbmFsIHVzZXJcbiAqIGNodW5rcy4gVXNlZCBieSB0aGUgY29uc3VtZXIgc2lkZSBvZiBhIGZyYW1lZCBieXRlLXN0cmVhbSBwaXBlLlxuICpcbiAqIEJ1ZmZlcnMgYWNyb3NzIHJlYWQgYm91bmRhcmllcywgc2luY2UgdGhlIHRyYW5zcG9ydCBtYXkgc3BsaXQgYSBzaW5nbGVcbiAqIGZyYW1lIGFjcm9zcyBtdWx0aXBsZSByZWFkcyAoaGVhZGVyIGluIG9uZSBjaHVuaywgcGF5bG9hZCBpbiBhbm90aGVyKVxuICogb3IgY29hbGVzY2UgbXVsdGlwbGUgZnJhbWVzIGludG8gYSBzaW5nbGUgcmVhZC4gVGhlIHRyYW5zZm9ybSBlbWl0c1xuICogd2hvbGUgdXNlciBjaHVua3MgcmVnYXJkbGVzcyBvZiB0cmFuc3BvcnQgY2h1bmtpbmcuXG4gKlxuICogRXJyb3JzIHRoZSBzdHJlYW0gaWYgdGhlIGxlbmd0aCBoZWFkZXIgYWR2ZXJ0aXNlcyBhIGZyYW1lIGxhcmdlciB0aGFuXG4gKiBgTUFYX0ZSQU1FX1NJWkVgIGJ5dGVzLCBzaW5jZSB0aGF0IGFsbW9zdCBjZXJ0YWlubHkgaW5kaWNhdGVzIGFcbiAqIG1pc2ZyYW1lZCB3aXJlIChlLmcuIGEgcmF3IGJ5dGUgc3RyZWFtIGJlaW5nIGZlZCB0aHJvdWdoIHRoaXMgdHJhbnNmb3JtXG4gKiBieSBtaXN0YWtlKSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBhbiBlbm9ybW91cyBidWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKCk6IFRyYW5zZm9ybVN0cmVhbTxcbiAgVWludDhBcnJheSxcbiAgVWludDhBcnJheVxuPiB7XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcblxuICBmdW5jdGlvbiBhcHBlbmRUb0J1ZmZlcihkYXRhOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5sZW5ndGggKyBkYXRhLmxlbmd0aCk7XG4gICAgbmV4dC5zZXQoYnVmZmVyLCAwKTtcbiAgICBuZXh0LnNldChkYXRhLCBidWZmZXIubGVuZ3RoKTtcbiAgICBidWZmZXIgPSBuZXh0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgVWludDhBcnJheT4oe1xuICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IDApIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcblxuICAgICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgICBidWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKGZyYW1lTGVuZ3RoID4gTUFYX0ZSQU1FX1NJWkUpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICBgQnl0ZS1zdHJlYW0gZnJhbWUgbGVuZ3RoICR7ZnJhbWVMZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSAoJHtNQVhfRlJBTUVfU0laRX0pLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyB1c3VhbGx5IG1lYW5zIGEgbm9uLWZyYW1lZCBieXRlIHN0cmVhbSBpcyBiZWluZyByZWFkIGFzIGZyYW1lZC5gLFxuICAgICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWwgPSBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoO1xuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IHRvdGFsKSBicmVhaztcblxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYnVmZmVyLnNsaWNlKEZSQU1FX0hFQURFUl9TSVpFLCB0b3RhbCkpO1xuICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UodG90YWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGVuZGVkIHdpdGggJHtidWZmZXIubGVuZ3RofSBieXRlcyBvZiBpbmNvbXBsZXRlIGZyYW1lIGRhdGEuIGAgK1xuICAgICAgICAgICAgICBgVGhlIHN0cmVhbSB3YXMgdHJ1bmNhdGVkIG1pZC1mcmFtZS5gLFxuICAgICAgICAgICAgeyBzbHVnOiAnc2VyaWFsaXphdGlvbi1mYWlsZWQnIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRW1pdCB0aGUgY2xpZW50LW9ic2VydmVkIGVuZC10by1lbmQgdGltZS10by1maXJzdC1jaHVuayBzcGFuIGZvciBhIGxpdmUgcmVhZDpcbiAqIHJlYWQgZGlzcGF0Y2ggKGBzdGFydEVwb2NoTXNgKSDihpIgdGhlIGZpcnN0IG5vbi1lbXB0eSBjaHVuayByZWFjaGluZyB0aGVcbiAqIHJlYWRlciwgaW5jbHVkaW5nIHRoZSBuZXR3b3JrIGhvcC4gRmlyZS1hbmQtZm9yZ2V0OyBuby1vcCB3aXRob3V0IE9URUwuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBzdGFydEluZGV4PzogbnVtYmVyLFxuICBjb25uZWN0TXM/OiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5yZWFkJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAncmVhZCcsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC50dGZjX21zJzogRGF0ZS5ub3coKSAtIHN0YXJ0RXBvY2hNcyxcbiAgICAgICAgLi4uKHR5cGVvZiBjb25uZWN0TXMgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB7ICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb25uZWN0X21zJzogY29ubmVjdE1zIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHR5cGVvZiBzdGFydEluZGV4ID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8geyAnd29ya2Zsb3cuc3RyZWFtLnN0YXJ0X2luZGV4Jzogc3RhcnRJbmRleCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGNsaWVudC1vYnNlcnZlZCByZWFkLWNvbXBsZXRpb24gc3BhbiB3aGVuIGEgc3RyZWFtIHJlYWQgZHJhaW5zOlxuICogYmFjay1kYXRlZCB0byB0aGUgcmVhZCBkaXNwYXRjaCwgc28gaXRzIGR1cmF0aW9uIGlzIHRoZSB0b3RhbCByZWFkLCB3aXRoXG4gKiBjaHVuay9ieXRlIGNvdW50cyBmb3IgdGhyb3VnaHB1dC4gQ2FuY2VsbGVkIHJlYWRzIGVtaXQgbm90aGluZy4gRmlyZS1hbmQtXG4gKiBmb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkU3RyZWFtUmVhZENvbXBsZXRlKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBjaHVua0NvdW50OiBudW1iZXIsXG4gIGJ5dGVDb3VudDogbnVtYmVyLFxuICByZWNvbm5lY3RzPzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb21wbGV0ZScsIHN0YXJ0RXBvY2hNcywge1xuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ0NMSUVOVCcpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAnd29ya2Zsb3cucnVuLmlkJzogcnVuSWQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ubmFtZSc6IG5hbWUsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ub3BlcmF0aW9uJzogJ3JlYWRfY29tcGxldGUnLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQudG90YWxfbXMnOiBEYXRlLm5vdygpIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLnJlYWQuY2h1bmtzJzogY2h1bmtDb3VudCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5yZWFkLmJ5dGVzJzogYnl0ZUNvdW50LFxuICAgICAgICAuLi4odHlwZW9mIHJlY29ubmVjdHMgPT09ICdudW1iZXInXG4gICAgICAgICAgPyB7ICd3b3JrZmxvdy5zdHJlYW0ucmVhZC5yZWNvbm5lY3RzJzogcmVjb25uZWN0cyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbSBleHRlbmRzIFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgI3JlYWRlcj86IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PjtcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0YXJ0SW5kZXg/OiBudW1iZXIpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIHRpbWUtdG8tZmlyc3QtY2h1bmsgc3RhdGUuIGByZWFkU3RhcnRgIGlzIHN0YW1wZWQgd2hlbiB0aGVcbiAgICAvLyByZWFkZXIgc3RhcnRzIGNvbnN1bWluZyAoZmlyc3QgcHVsbCDihpIgdGhlIHJlYWQgZGlzcGF0Y2gpOyB0aGUgc3BhbiBpc1xuICAgIC8vIGVtaXR0ZWQgb25jZSwgd2hlbiB0aGUgZmlyc3Qgbm9uLWVtcHR5IGNodW5rIHJlYWNoZXMgdGhlIHJlYWRlci4gU28gaXRzXG4gICAgLy8gZHVyYXRpb24gaXMgdGhlIGVuZC10by1lbmQgVFRGQyBpbmNsdWRpbmcgdGhlIG5ldHdvcmsgaG9wLiBOby1vcCB3aXRob3V0XG4gICAgLy8gYW4gT3BlblRlbGVtZXRyeSBTREsgcmVnaXN0ZXJlZC5cbiAgICBsZXQgcmVhZFN0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZpcnN0Q2h1bmtSZXBvcnRlZCA9IGZhbHNlO1xuICAgIC8vIENsaWVudC1vYnNlcnZlZCBjb25uZWN0IGR1cmF0aW9uOiB0aGUgd29ybGQuc3RyZWFtcy5nZXQgYXdhaXQgKHJlYWRcbiAgICAvLyBkaXNwYXRjaCAtPiBzdHJlYW0gaGFuZGxlIC8gcmVzcG9uc2UgaGVhZGVycykuIFN0YW1wZWQgb24gdGhlXG4gICAgLy8gd29ya2Zsb3cuc3RyZWFtLnJlYWQgc3BhbiBvbmNlIHRoZSBmaXJzdCBjaHVuayBhcnJpdmVzLlxuICAgIGxldCBjb25uZWN0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBSZWFkLWNvbXBsZXRpb24gY291bnRlcnMgZm9yIHRoZSB3b3JrZmxvdy5zdHJlYW0ucmVhZC5jb21wbGV0ZSBzcGFuXG4gICAgLy8gZW1pdHRlZCB3aGVuIHRoZSBzdHJlYW0gZHJhaW5zLlxuICAgIGxldCBjaHVua3NEZWxpdmVyZWQgPSAwO1xuICAgIGxldCBieXRlc0RlbGl2ZXJlZCA9IDA7XG4gICAgc3VwZXIoe1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb3Qgc3VyZSB3aHkgVHlwZVNjcmlwdCBpcyBjb21wbGFpbmluZyBhYm91dCB0aGlzXG4gICAgICB0eXBlOiAnYnl0ZXMnLFxuXG4gICAgICBwdWxsOiBhc3luYyAoY29udHJvbGxlcikgPT4ge1xuICAgICAgICBsZXQgcmVhZGVyID0gdGhpcy4jcmVhZGVyO1xuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIGlmIChyZWFkU3RhcnQgPT09IHVuZGVmaW5lZCkgcmVhZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgICAgICAgIGNvbnN0IGNvbm5lY3RTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQocnVuSWQsIG5hbWUsIHN0YXJ0SW5kZXgpO1xuICAgICAgICAgIGNvbm5lY3RNcyA9IERhdGUubm93KCkgLSBjb25uZWN0U3RhcnQ7XG4gICAgICAgICAgcmVhZGVyID0gdGhpcy4jcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgcmVhZGVyJykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuI3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAocmVhZFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlY29yZFN0cmVhbVJlYWRDb21wbGV0ZShcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgY2h1bmtzRGVsaXZlcmVkLFxuICAgICAgICAgICAgICBieXRlc0RlbGl2ZXJlZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgZmx1c2hlcyBhIGxlYWRpbmcgemVyby1sZW5ndGggY2h1bmsgKHYzKykgdG8gY29tbWl0XG4gICAgICAgICAgLy8gcmVzcG9uc2UgaGVhZGVycyBiZWZvcmUgYW55IGRhdGE7IHNraXAgZW1wdGllcyBzbyBUVEZDIG1lYXN1cmVzIHRvXG4gICAgICAgICAgLy8gdGhlIGZpcnN0IHJlYWwgY2h1bmsuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWZpcnN0Q2h1bmtSZXBvcnRlZCAmJlxuICAgICAgICAgICAgcmVzdWx0LnZhbHVlLmJ5dGVMZW5ndGggPiAwICYmXG4gICAgICAgICAgICByZWFkU3RhcnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlyc3RDaHVua1JlcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlY29yZFJlYWRUaW1lVG9GaXJzdENodW5rKFxuICAgICAgICAgICAgICByZWFkU3RhcnQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgICAgICBjb25uZWN0TXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNodW5rc0RlbGl2ZXJlZCArPSAxO1xuICAgICAgICAgIGJ5dGVzRGVsaXZlcmVkICs9IHJlc3VsdC52YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIC8vIEZvcndhcmQgcmF3IGJ5dGVzOyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gaXMgaGFuZGxlZCBhdCB0aGVcbiAgICAgICAgICAvLyBmcmFtaW5nIGxldmVsIGJ5IGdldFNlcmlhbGl6ZVN0cmVhbS9nZXREZXNlcmlhbGl6ZVN0cmVhbS5cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbmNlbDogYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy4jcmVhZGVyKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy4jcmVhZGVyLmNhbmNlbChyZWFzb24pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICB0aGlzLiNyZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYXhpbXVtIGNvbnNlY3V0aXZlIHJlY29ubmVjdCBhdHRlbXB0cyBmb3IgYSBzaW5nbGUgZnJhbWVkIHN0cmVhbSBzZXNzaW9uLlxuICogVGhlIGNvdW50ZXIgcmVzZXRzIHRvIHplcm8gd2hlbmV2ZXIgYSByZWNvbm5lY3QgbWFrZXMgZm9yd2FyZCBwcm9ncmVzcyAoYVxuICogZnJhbWUgaXMgZGVsaXZlcmVkKSwgc28gdGhpcyBib3VuZHMgKmNvbnNlY3V0aXZlKiBmYWlsdXJlcywgbm90IHRoZSBsaWZldGltZVxuICogdG90YWw6IGEgbG9uZy1saXZlZCBzZXJ2ZXJsZXNzIHN0cmVhbSBtYXkgbGVnaXRpbWF0ZWx5IHJlY29ubmVjdCBmYXIgbW9yZVxuICogdGhhbiB0aGlzIG1hbnkgdGltZXMgYXMgbG9uZyBhcyBlYWNoIHJlY29ubmVjdCBrZWVwcyBkZWxpdmVyaW5nIGRhdGEuIFdlIG9ubHlcbiAqIGdpdmUgdXAgYWZ0ZXIgdGhpcyBtYW55IHJlY29ubmVjdHMgaW4gYSByb3cgcHJvZHVjZSBub3RoaW5nLlxuICovXG5leHBvcnQgY29uc3QgRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUyA9IDUwO1xuXG4vKiogRWZmZWN0aXZlIGNvbnNlY3V0aXZlLXJlY29ubmVjdCBjYXAuIE92ZXJyaWRlOiBgV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUU2AuICovXG5jb25zdCBnZXRGcmFtZWRTdHJlYW1NYXhSZWNvbm5lY3RzID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMnLFxuICAgIEZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMsXG4gICAge1xuICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgIG1pbjogMSxcbiAgICB9XG4gICk7XG5cbi8qKlxuICogQWJzb2x1dGUgYmFja3N0b3Agb24gdG90YWwgcmVjb25uZWN0cyBmb3IgYSBzaW5nbGUgc2Vzc2lvbiwgaW5kZXBlbmRlbnQgb2ZcbiAqIHByb2dyZXNzLiBUaGUgY29uc2VjdXRpdmUgY2FwIGFib3ZlIHJlc2V0cyBvbiBmb3J3YXJkIHByb2dyZXNzLCB3aGljaCBpc1xuICogY29ycmVjdCBmb3IgYSB3ZWxsLWJlaGF2ZWQgYmFja2VuZCB0aGF0IGhvbm9ycyBgc3RhcnRJbmRleGAuIEJ1dCBpZiBhIFdvcmxkJ3NcbiAqIGBzdHJlYW1zLmdldGAgZXZlciBpZ25vcmVkIGBzdGFydEluZGV4YCBhbmQgcmUtZGVsaXZlcmVkIGVhcmxpZXIgY2h1bmtzLFxuICogXCJwcm9ncmVzc1wiIHdvdWxkIGJlIHJlcG9ydGVkIGV2ZXJ5IHJlY29ubmVjdCBhbmQgdGhlIGNvbnNlY3V0aXZlIGNhcCB3b3VsZFxuICogbmV2ZXIgdHJpcCwgdHVybmluZyBhIGJvdW5kZWQgZmFpbHVyZSBpbnRvIGFuIHVuYm91bmRlZCByZWNvbm5lY3QgbG9vcC4gVGhpc1xuICogaGFyZCBjZWlsaW5nIGd1YXJhbnRlZXMgdGhlIGxvb3AgYWx3YXlzIHRlcm1pbmF0ZXMuIEl0IGlzIHNldCBoaWdoIGVub3VnaFxuICogKGhvdXJzIG9mIHN0cmVhbWluZyBhdCByZWFsaXN0aWMgcGVyLXNlc3Npb24gdGltZW91dHMpIHRvIG5ldmVyIGludGVyZmVyZVxuICogd2l0aCBsZWdpdGltYXRlIGxvbmctbGl2ZWQgc3RyZWFtcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMgPSAxMDAwO1xuXG4vKiogRWZmZWN0aXZlIHRvdGFsLXJlY29ubmVjdCBiYWNrc3RvcC4gT3ZlcnJpZGU6IGBXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTYC4gKi9cbmNvbnN0IGdldEZyYW1lZFN0cmVhbU1heFRvdGFsUmVjb25uZWN0cyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTJyxcbiAgICBGUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcblxuLyoqXG4gKiBXcmFwcyB0aGUgbGVuZ3RoLXByZWZpeC1mcmFtZWQgYnl0ZSBzdHJlYW0gZnJvbSBgd29ybGQuc3RyZWFtcy5nZXRgIHdpdGhcbiAqIHRyYW5zcGFyZW50IGF1dG8tcmVjb25uZWN0LlxuICpcbiAqIEV2ZXJ5IGZ1bGx5LWRlY29kZWQgb3V0ZXIgZnJhbWUgY29ycmVzcG9uZHMgdG8gZXhhY3RseSBvbmUgc2VydmVyLXNpZGVcbiAqIGNodW5rICh0aGUgc2VyaWFsaXplIHRyYW5zZm9ybSBlbnF1ZXVlcyBvbmUgZnJhbWUgcGVyIHdvcmtmbG93IHdyaXRlLCBhbmRcbiAqIHRoZSB3cml0YWJsZSBidWZmZXJzIG9uZSBmcmFtZSBwZXIgY2h1bmsgd2hlbiBtdWx0aS13cml0aW5nKS4gVGhlIHdyYXBwZXJcbiAqIGNvdW50cyBjb21wbGV0ZWQgZnJhbWVzIGFuZCwgb24gdXBzdHJlYW0gZXJyb3IsIHJlb3BlbnMgdGhlIGNvbm5lY3Rpb25cbiAqIHdpdGggYHN0YXJ0SW5kZXggPSByZXNvbHZlZFN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc2AuIFBhcnRpYWwtZnJhbWVcbiAqIGJ5dGVzIGJ1ZmZlcmVkIGJlZm9yZSB0aGUgY3V0IGFyZSBkaXNjYXJkZWQ7IHRoZSBzZXJ2ZXIgd2lsbCByZXNlbmQgdGhlXG4gKiBpbi1mbGlnaHQgY2h1bmsgaW4gZnVsbCBmcm9tIHRoZSBuZXcgc3RhcnRJbmRleC5cbiAqXG4gKiBBIGNsZWFuIHVwc3RyZWFtIGNsb3NlIChFT0Ygd2l0aCBubyBlcnJvcikgaXMgTk9UIHRydXN0ZWQgYXMgY29tcGxldGlvblxuICogb24gaXRzIG93bjogc29tZSB0cmFuc3BvcnQgcGF0aHMgbm9ybWFsaXplIGEgbWlkLXN0cmVhbSBhYm9ydCBpbnRvIGFcbiAqIGdyYWNlZnVsIGVuZCAob2JzZXJ2ZWQgaW4gcHJvZHVjdGlvbiBvbiBWZXJjZWwgcmVzcG9uc2Ugc3RyZWFtaW5nLCB3aGVyZVxuICogdGhlIHNlcnZlcidzIG1heC1kdXJhdGlvbiBhYm9ydCBhcnJpdmVzIGF0IHRoZSBjbGllbnQgYXMgYSBjbGVhbiBFT0YpLlxuICogT24gRU9GIHRoZSB3cmFwcGVyIHZlcmlmaWVzIGFnYWluc3QgdGhlIHN0cmVhbSdzIGF1dGhvcml0YXRpdmUgbWV0YWRhdGFcbiAqIChgc3RyZWFtcy5nZXRJbmZvYCkgdGhhdCB0aGUgc3RyZWFtIGlzIGNvbXBsZXRlIEFORCB0aGF0IGV2ZXJ5IGNodW5rIHVwIHRvXG4gKiBgZG9uZWAgd2FzIGRlbGl2ZXJlZDsgb3RoZXJ3aXNlIGl0IHJlY29ubmVjdHMgZnJvbSB0aGUgbmV4dCBjaHVuayBleGFjdGx5XG4gKiBsaWtlIGFuIGVycm9yZWQgY29ubmVjdGlvbi4gSWYgdGhlIG1ldGFkYXRhIHJlYWQgaXRzZWxmIGZhaWxzLCB0aGUgRU9GIGlzXG4gKiB0cnVzdGVkIChsZWdhY3kgYmVoYXZpb3IpIHJhdGhlciB0aGFuIGZhaWxpbmcgYSByZWFkIHRoYXQgbWF5IHdlbGwgYmVcbiAqIGNvbXBsZXRlLlxuICpcbiAqIE5lZ2F0aXZlIGBzdGFydEluZGV4YCB2YWx1ZXMgKGxhc3QtTiBzZW1hbnRpY3MpIHNraXAgdGhlIHJlY29ubmVjdFxuICogbWFjaGluZXJ5IGJlY2F1c2Ugd2UgY2Fubm90IGNvbXB1dGUgYW4gYWJzb2x1dGUgcmVzdW1lIHBvc2l0aW9uIHdpdGhvdXRcbiAqIGEgdGFpbC1pbmRleCBsb29rdXA7IHRoZSByZXR1cm5lZCBzdHJlYW0gYmVoYXZlcyBhcyBhIHNpbmdsZS1zaG90IHJlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWNvbm5lY3RpbmdGcmFtZWRTdHJlYW0oXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgc3RhcnRJbmRleD86IG51bWJlclxuKTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICBjb25zdCByZWNvbm5lY3RTdXBwb3J0ZWQgPSBzdGFydEluZGV4ID09PSB1bmRlZmluZWQgfHwgc3RhcnRJbmRleCA+PSAwO1xuICBsZXQgY3VycmVudFN0YXJ0SW5kZXggPSBzdGFydEluZGV4ID8/IDA7XG4gIGxldCBjb25zdW1lZEZyYW1lcyA9IDA7XG4gIGxldCByZWNvbm5lY3RDb3VudCA9IDA7XG4gIGxldCB0b3RhbFJlY29ubmVjdENvdW50ID0gMDtcbiAgbGV0IHJlYWRlcjogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+IHwgdW5kZWZpbmVkO1xuICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gIC8vIFJlYWQgdGVsZW1ldHJ5IChzYW1lIHNlbWFudGljcyBhcyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKTpcbiAgLy8gZGlzcGF0Y2ggdGltZSwgZmlyc3QtY29ubmVjdCBkdXJhdGlvbiwgZmlyc3QtZnJhbWUgbGF0Y2gsIGFuZCB0b3RhbHMuXG4gIGxldCByZWFkU3RhcnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvbm5lY3RNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RDaHVua1JlcG9ydGVkID0gZmFsc2U7XG4gIGxldCBjaHVua3NEZWxpdmVyZWQgPSAwO1xuICBsZXQgYnl0ZXNEZWxpdmVyZWQgPSAwO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVTdGFydEluZGV4ID0gcmVjb25uZWN0U3VwcG9ydGVkXG4gICAgICA/IGN1cnJlbnRTdGFydEluZGV4ICsgY29uc3VtZWRGcmFtZXNcbiAgICAgIDogc3RhcnRJbmRleDtcbiAgICBjb25zdCBjb25uZWN0U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0KHJ1bklkLCBuYW1lLCBlZmZlY3RpdmVTdGFydEluZGV4KTtcbiAgICBpZiAoY29ubmVjdE1zID09PSB1bmRlZmluZWQpIGNvbm5lY3RNcyA9IERhdGUubm93KCkgLSBjb25uZWN0U3RhcnQ7XG4gICAgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gdXBzdHJlYW0gRU9GIHJlcHJlc2VudHMgZ2VudWluZSBjb21wbGV0aW9uOiB0aGUgc3RyZWFtJ3NcbiAgICogYXV0aG9yaXRhdGl2ZSBtZXRhZGF0YSBzYXlzIGl0IGlzIGRvbmUgQU5EIHRoZSBmcmFtZXMgZGVsaXZlcmVkIHNvIGZhclxuICAgKiBjb3ZlciBldmVyeSBjaHVuayB1cCB0byB0aGUgdGFpbCAob25lIG91dGVyIGZyYW1lID09IG9uZSBzZXJ2ZXIgY2h1bmspLlxuICAgKiBBIG1ldGFkYXRhIGZhaWx1cmUgdHJ1c3RzIHRoZSBFT0YsIHNpbmNlIHR1cm5pbmcgYSBoZWFsdGh5IGNvbXBsZXRpb25cbiAgICogaW50byBhbiBlcnJvciAob3IgYSByZWNvbm5lY3QgbG9vcCkgb24gYSB0cmFuc2llbnQgbWV0YWRhdGEgYmxpcCB3b3VsZFxuICAgKiBiZSB3b3JzZSB0aGFuIHRoZSBsZWdhY3kgYmVoYXZpb3IgdGhpcyBjaGVjayBndWFyZHMgYWdhaW5zdC5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGlzVmVyaWZpZWRDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldEluZm8ocnVuSWQsIG5hbWUpO1xuICAgICAgcmV0dXJuIGluZm8uZG9uZSAmJiBjdXJyZW50U3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzID4gaW5mby50YWlsSW5kZXg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHJlYWRlcikge1xuICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gQWR2YW5jZSB0aGUgcmVzdW1lIHBvc2l0aW9uIHBhc3QgdGhlIGZyYW1lcyBhbHJlYWR5IGRlbGl2ZXJlZCwgdGhlblxuICAgIC8vIGRyb3AgYW55IHBhcnRpYWwtZnJhbWUgYnl0ZXM6IHRoZSByZW9wZW5lZCBjb25uZWN0aW9uIHJlLXNlbmRzIGZyb20gYVxuICAgIC8vIGZyYW1lIGJvdW5kYXJ5IGF0IHRoZSBuZXcgaW5kZXguXG4gICAgY3VycmVudFN0YXJ0SW5kZXggKz0gY29uc3VtZWRGcmFtZXM7XG4gICAgY29uc3VtZWRGcmFtZXMgPSAwO1xuICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gICAgLy8gUmV0cnkgdGhlIHJlb3BlbiBpdHNlbGYgYWdhaW5zdCB0aGUgcmVjb25uZWN0IGJ1ZGdldC4gQSB0cmFuc2llbnRcbiAgICAvLyBmYWlsdXJlIG9mIGNvbm5lY3QoKSAodGhlIHNlcnZlciBicmllZmx5IHVuYXZhaWxhYmxlIGR1cmluZyB0aGVcbiAgICAvLyByZWNvbm5lY3Qgd2luZG93KSBpcyB0aGUgZXhhY3QgYmxpcCB0aGlzIHdyYXBwZXIgZXhpc3RzIHRvIHN1cnZpdmUsIHNvXG4gICAgLy8gY291bnQgaXQgYWdhaW5zdCB0aGUgYnVkZ2V0IGFuZCB0cnkgYWdhaW4gcmF0aGVyIHRoYW4gdHJlYXRpbmcgaXQgYXNcbiAgICAvLyBmYXRhbC4gT25seSBidWRnZXQgZXhoYXVzdGlvbiAoYSBzZXJ2ZXIgdGhhdCBzdGF5cyBkb3duKSB0ZXJtaW5hdGVzIHRoZVxuICAgIC8vIHN0cmVhbS5cbiAgICBjb25zdCBtYXhSZWNvbm5lY3RzID0gZ2V0RnJhbWVkU3RyZWFtTWF4UmVjb25uZWN0cygpO1xuICAgIGNvbnN0IG1heFRvdGFsUmVjb25uZWN0cyA9IGdldEZyYW1lZFN0cmVhbU1heFRvdGFsUmVjb25uZWN0cygpO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHJlY29ubmVjdENvdW50Kys7XG4gICAgICB0b3RhbFJlY29ubmVjdENvdW50Kys7XG4gICAgICBpZiAocmVjb25uZWN0Q291bnQgPiBtYXhSZWNvbm5lY3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU3RyZWFtIFwiJHtuYW1lfVwiIGV4Y2VlZGVkIG1heGltdW0gcmVjb25uZWN0aW9uIGF0dGVtcHRzICgke21heFJlY29ubmVjdHN9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbFJlY29ubmVjdENvdW50ID4gbWF4VG90YWxSZWNvbm5lY3RzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU3RyZWFtIFwiJHtuYW1lfVwiIGV4Y2VlZGVkIG1heGltdW0gdG90YWwgcmVjb25uZWN0aW9uIGF0dGVtcHRzICgke21heFRvdGFsUmVjb25uZWN0c30pYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBSZXRlbnRpb24gZXhwaXJ5IGlzIHRlcm1pbmFsIGFuZCByZXRyeWluZyBjYW5ub3QgcmVzdG9yZSB0aGUgc3RyZWFtLlxuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgdHlwZWQgZXJyb3IgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB0dXJuaW5nIG9uZSA0MTAgaW50b1xuICAgICAgICAvLyA1MCByZWNvbm5lY3QgYXR0ZW1wdHMgYW5kIGEgZ2VuZXJpYyBidWRnZXQtZXhoYXVzdGlvbiBlcnJvci5cbiAgICAgICAgaWYgKFN0cmVhbUV4cGlyZWRFcnJvci5pcyhlcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICAvLyBSZW9wZW4gZmFpbGVkIHRyYW5zaWVudGx5OyBsb29wIHRvIHJldHJ5LCBjb3VudGluZyBhZ2FpbnN0IHRoZVxuICAgICAgICAvLyBidWRnZXQgc28gYSBzZXJ2ZXIgdGhhdCBuZXZlciByZWNvdmVycyBzdGlsbCB0ZXJtaW5hdGVzIHRoZSBzdHJlYW0uXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgcHVsbDogYXN5bmMgKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgIGlmIChyZWFkU3RhcnQgPT09IHVuZGVmaW5lZCkgcmVhZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIExvb3AgdW50aWwgd2UgZW1pdCBzb21ldGhpbmcsIGhpdCBFT0YsIG9yIGZhdGFsbHkgZXJyb3IuIFJlYWRzIHRoYXRcbiAgICAgIC8vIG9ubHkgZXh0ZW5kIHRoZSBpbi1mbGlnaHQtZnJhbWUgYnVmZmVyIGRvbid0IGVucXVldWUgYW55dGhpbmc7IHdlXG4gICAgICAvLyBrZWVwIHJlYWRpbmcgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGVtcHR5LWhhbmRlZC5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgY29ubmVjdCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQ6IHsgZG9uZTogYm9vbGVhbjsgdmFsdWU/OiBVaW50OEFycmF5IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBjb25uZWN0KCkgZ3VhcmFudGVlcyByZWFkZXJcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkZXIhLnJlYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFyZWNvbm5lY3RTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHJlY29ubmVjdCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKHJlY29ubmVjdEVycikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihyZWNvbm5lY3RFcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSB8fCAhcmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgIC8vIEEgY2xlYW4gRU9GIGlzIG9ubHkgdHJ1c3R3b3J0aHkgaWYgdGhlIHN0cmVhbSBpcyBhY3R1YWxseVxuICAgICAgICAgIC8vIGNvbXBsZXRlIGFuZCB0aGlzIHNlc3Npb24gZGVsaXZlcmVkIGV2ZXJ5IGNodW5rIHVwIHRvIGBkb25lYC5cbiAgICAgICAgICAvLyBJbmZyYXN0cnVjdHVyZSBjYW4gbm9ybWFsaXplIGEgbWlkLXN0cmVhbSBhYm9ydCBpbnRvIGEgZ3JhY2VmdWxcbiAgICAgICAgICAvLyBlbmQgKHRoZSBzZXJ2ZXIncyBtYXgtZHVyYXRpb24gY3V0IGlzIGRlc2lnbmVkIHRvIGFycml2ZSBhcyBhblxuICAgICAgICAgIC8vIGVycm9yZWQgYm9keSwgYnV0IG9uIHNvbWUgcGF0aHMgaXQgcmVhY2hlcyB0aGUgY2xpZW50IGFzIGEgY2xlYW5cbiAgICAgICAgICAvLyBFT0YpLCBhbmQgYSBjb21wbGV0ZWQgc3RyZWFtIGNhbiBzdGlsbCBiZSBjdXQgbWlkLWJvZHk7IGJvdGhcbiAgICAgICAgICAvLyB3b3VsZCBvdGhlcndpc2UgYmUgc2lsZW50bHkgcmVhZCBhcyBhIHNob3J0ZXIsIGNvbXBsZXRlIHN0cmVhbS5cbiAgICAgICAgICBpZiAocmVjb25uZWN0U3VwcG9ydGVkICYmICEoYXdhaXQgaXNWZXJpZmllZENvbXBsZXRlKCkpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCByZWNvbm5lY3QoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHJlY29ubmVjdEVycikge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKHJlY29ubmVjdEVycik7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBHZW51aW5lIGVuZC1vZi1zdHJlYW0uIERyb3AgYW55IHBhcnRpYWwtZnJhbWUgYnl0ZXMgKHRoZXJlXG4gICAgICAgICAgLy8gc2hvdWxkbid0IGJlIGFueTsgYSB3ZWxsLWZvcm1lZCBzdHJlYW0gZW5kcyBvbiBhIGZyYW1lIGJvdW5kYXJ5KS5cbiAgICAgICAgICBpZiAocmVhZFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlY29yZFN0cmVhbVJlYWRDb21wbGV0ZShcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgY2h1bmtzRGVsaXZlcmVkLFxuICAgICAgICAgICAgICBieXRlc0RlbGl2ZXJlZCxcbiAgICAgICAgICAgICAgdG90YWxSZWNvbm5lY3RDb3VudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGVuZCB0byBidWZmZXIgYW5kIGVtaXQgYWxsIGNvbXBsZXRlIGZyYW1lcy5cbiAgICAgICAgY29uc3QgaW5jb21pbmcgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmIChpbmNvbWluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgaW5jb21pbmcubGVuZ3RoKTtcbiAgICAgICAgICBjb21iaW5lZC5zZXQoYnVmZmVyLCAwKTtcbiAgICAgICAgICBjb21iaW5lZC5zZXQoaW5jb21pbmcsIGJ1ZmZlci5sZW5ndGgpO1xuICAgICAgICAgIGJ1ZmZlciA9IGNvbWJpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVtaXR0ZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPj0gRlJBTUVfSEVBREVSX1NJWkUpIHtcbiAgICAgICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgICAgIGJ1ZmZlci5idWZmZXIsXG4gICAgICAgICAgICBidWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuICAgICAgICAgIGNvbnN0IHRvdGFsID0gRlJBTUVfSEVBREVSX1NJWkUgKyBmcmFtZUxlbmd0aDtcbiAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IHRvdGFsKSBicmVhaztcbiAgICAgICAgICAvLyBGb3J3YXJkIHRoZSBlbnRpcmUgZnJhbWVkIGNodW5rIChoZWFkZXIgKyBwYXlsb2FkKSB0byB0aGVcbiAgICAgICAgICAvLyBkb3duc3RyZWFtIGRlc2VyaWFsaXplciwgd2hpY2ggYWxyZWFkeSBleHBlY3RzIHRoaXMgbGF5b3V0LlxuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShidWZmZXIuc2xpY2UoMCwgdG90YWwpKTtcbiAgICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UodG90YWwpO1xuICAgICAgICAgIGNvbnN1bWVkRnJhbWVzKys7XG4gICAgICAgICAgY2h1bmtzRGVsaXZlcmVkKys7XG4gICAgICAgICAgYnl0ZXNEZWxpdmVyZWQgKz0gdG90YWw7XG4gICAgICAgICAgaWYgKCFmaXJzdENodW5rUmVwb3J0ZWQgJiYgcmVhZFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZpcnN0Q2h1bmtSZXBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICByZWNvcmRSZWFkVGltZVRvRmlyc3RDaHVuayhcbiAgICAgICAgICAgICAgcmVhZFN0YXJ0LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgc3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgY29ubmVjdE1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbWl0dGVkKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBwcm9ncmVzcyBvbiB0aGUgY3VycmVudCBjb25uZWN0aW9uOiBjbGVhciB0aGVcbiAgICAgICAgICAvLyBjb25zZWN1dGl2ZS1mYWlsdXJlIGJ1ZGdldCBzbyBhIGxvbmcgc3RyZWFtIHRoYXQgcmVjb25uZWN0c1xuICAgICAgICAgIC8vIG1hbnkgdGltZXMgKGJ1dCBrZWVwcyBkZWxpdmVyaW5nKSBpcyBuZXZlciBmYWxzZWx5IGNhcHBlZC5cbiAgICAgICAgICByZWNvbm5lY3RDb3VudCA9IDA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgcGFydGlhbCBieXRlczogcmVhZCBtb3JlLlxuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocmVhZGVyKSB7XG4gICAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBjbG9zaW5nIFJlYWRhYmxlU3RyZWFtIHJlYWRlcjonLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmF1bHQgZ3JvdXAtY29tbWl0IHdpbmRvdyBmb3IgdGhlIExFQURJTkcgY2h1bmsgb2YgYW4gaWRsZSBzdHJlYW0uXG4gKlxuICogMCA9IGRpc3BhdGNoIHRoZSBmaXJzdCBjaHVuayBpbW1lZGlhdGVseS4gTWVhc3VyZWQgcHJvZHVjdGlvbiBwcm9kdWNlclxuICogcmF0ZXMgKG1vc3QgYWdlbnRzOiB+MS4yIGNodW5rcyBwZXIgZmx1c2gsID43MCUgb2YgY2h1bmtzIGFycml2aW5nIG1vcmVcbiAqIHRoYW4gMTBtcyBhZnRlciB0aGUgcHJldmlvdXMgcmVxdWVzdCBhbHJlYWR5IGZpbmlzaGVkKSBzaG93IGEgZml4ZWRcbiAqIGxlYWRpbmctZWRnZSB3aW5kb3cgdGF4ZXMgaXNvbGF0ZWQtY2h1bmsgZGVsaXZlcnkgKH4rMjAlIG9uIGEgfjUwbXMgUlRUKVxuICogd2hpbGUgYmF0Y2hpbmcgYWxtb3N0IG5vdGhpbmcgZm9yIHNsb3cgcHJvZHVjZXJzOyBmYXN0IHByb2R1Y2VycyBnZXRcbiAqIHRoZWlyIGJhdGNoaW5nIGZyb20gaW4tZmxpZ2h0IGFjY3VtdWxhdGlvbiByZWdhcmRsZXNzLiBTZXR0aW5nIGEgcG9zaXRpdmVcbiAqIGludGVydmFsIChlbnYgb3IgYHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNc2ApIG9wdHMgYSBkZXBsb3ltZW50IGludG9cbiAqIHdpbmRvd2VkIGxlYWRpbmctZWRnZSBiYXRjaGluZywgdHJhZGluZyBmaXJzdC1jaHVuayBsYXRlbmN5IGZvciBsYXJnZXJcbiAqIGdyb3Vwcy5cbiAqL1xuY29uc3QgU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TID0gMDtcblxuLyoqXG4gKiBgV09SS0ZMT1dfU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TYCwgd2hlbiBzZXQsIG92ZXJyaWRlc1xuICogYHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNc2A7IHdoZW4gdW5zZXQgdGhlIFdvcmxkIG9wdGlvbiAob3IgdGhlXG4gKiBkZWZhdWx0KSBnb3Zlcm5zLiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciB1bnNldC9pbnZhbGlkIHZhbHVlcyBzbyB0aGVcbiAqIGNhbGxlciBjYW4gZmFsbCB0aHJvdWdoIHRvIHRoZSBXb3JsZCBvcHRpb24uXG4gKi9cbmNvbnN0IGdldEVudlN0cmVhbUZsdXNoSW50ZXJ2YWxNcyA9ICgpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2YWx1ZSA9IGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TJywgTnVtYmVyLk5hTiwge1xuICAgIGludGVnZXI6IHRydWUsXG4gIH0pO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xufTtcblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgc3BhbiBmb3Igb25lIGZsdXNoZWQgYmF0Y2ggb2Ygc3RyZWFtIHdyaXRlczogZmlyc3RcbiAqIGB3cml0ZSgpYCBvZiB0aGUgYmF0Y2ggKGBzdGFydEVwb2NoTXNgKSDihpIgdGhlIHNlcnZlciB3cml0ZSBzZXR0bGluZy4gVGhlXG4gKiBzcGFuJ3MgZHVyYXRpb24gaXMgdGhlcmVmb3JlIHRoZSBhcHAtcGVyY2VpdmVkIGxhdGVuY3kgb2YgdGhlIGJhdGNoXG4gKiAoYnVmZmVyIGR3ZWxsICsgYmFja3ByZXNzdXJlICsgUlBDKTsgYGJ1ZmZlcl9kd2VsbF9tc2AgaXNvbGF0ZXMgdGhlXG4gKiBwcmUtZGlzcGF0Y2ggc2hhcmUgc28gY2xpZW50LXNpZGUgYmF0Y2hpbmcgY29zdCBjYW4gYmUgdG9sZCBhcGFydCBmcm9tXG4gKiBuZXR3b3JrL3NlcnZlciB0aW1lLiBOYW1lZCBgd29ya2Zsb3cuc3RyZWFtLmZsdXNoYDsgdGhlIHBlci1yZXF1ZXN0IFJQQ1xuICogYmVuZWF0aCBpdCBpcyB3b3JsZC12ZXJjZWwncyBgd29ya2Zsb3cuc3RyZWFtLndyaXRlYCBzcGFuIChjaHVua19ydHQpLCBhbmRcbiAqIHRoZSB0d28gbXVzdCBzdGF5IGRpc3Rpbmd1aXNoYWJsZS4gRmlyZS1hbmQtZm9yZ2V0OyBuby1vcCB3aXRob3V0IE9URUwuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFN0cmVhbVdyaXRlRmx1c2goXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBkaXNwYXRjaEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBjaHVua0NvdW50OiBudW1iZXIsXG4gIGJ5dGVDb3VudDogbnVtYmVyLFxuICBycGNNczogbnVtYmVyXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0uZmx1c2gnLCBzdGFydEVwb2NoTXMsIHtcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdDTElFTlQnKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgJ3dvcmtmbG93LnJ1bi5pZCc6IHJ1bklkLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm5hbWUnOiBuYW1lLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm9wZXJhdGlvbic6ICdmbHVzaCcsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0uZmx1c2guYnVmZmVyX2R3ZWxsX21zJzogZGlzcGF0Y2hFcG9jaE1zIC0gc3RhcnRFcG9jaE1zLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLmZsdXNoLmNodW5rcyc6IGNodW5rQ291bnQsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0uZmx1c2guYnl0ZXMnOiBieXRlQ291bnQsXG4gICAgICAgIC8vIENsaWVudC1vYnNlcnZlZCBXb3JsZCB3cml0ZSBSUEMgZHVyYXRpb24gKG5ldHdvcmsgaG9wIGluY2x1ZGVkKS5cbiAgICAgICAgLy8gU2FtZSBrZXkgYXMgd29ybGQtdmVyY2VsJ3MgcGVyLXJlcXVlc3Qgc3BhbiBhdHRyaWJ1dGUgc28gcXVlcmllc1xuICAgICAgICAvLyB3b3JrIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggbGF5ZXIgZW1pdHRlZCBpdC5cbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS53cml0ZS5jaHVua19ydHQnOiBycGNNcyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pKCk7XG59XG5cbi8qKlxuICogRW1pdCB0aGUgY2xpZW50LW9ic2VydmVkIHNwYW4gZm9yIHRoZSBzdHJlYW0tY2xvc2UgUlBDOiBpdHMgZHVyYXRpb24gaXMgdGhlXG4gKiBgd29ybGQuc3RyZWFtcy5jbG9zZWAgcm91bmQgdHJpcCAobmV0d29yayBob3AgaW5jbHVkZWQpLiBGaXJlLWFuZC1mb3JnZXQ7XG4gKiBuby1vcCB3aXRob3V0IE9URUwuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFN0cmVhbUNsb3NlKFxuICBzdGFydEVwb2NoTXM6IG51bWJlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nXG4pOiB2b2lkIHtcbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlY29yZEVsYXBzZWRTcGFuKCd3b3JrZmxvdy5zdHJlYW0uY2xvc2UnLCBzdGFydEVwb2NoTXMsIHtcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdDTElFTlQnKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgJ3dvcmtmbG93LnJ1bi5pZCc6IHJ1bklkLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm5hbWUnOiBuYW1lLFxuICAgICAgICAnd29ya2Zsb3cuc3RyZWFtLm9wZXJhdGlvbic6ICdjbG9zZScsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0uY2xvc2UucnBjX21zJzogRGF0ZS5ub3coKSAtIHN0YXJ0RXBvY2hNcyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtIGV4dGVuZHMgV3JpdGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICAvKipcbiAgICogQHBhcmFtIHJ1blJlYWR5QmFycmllciBUdXJibyBtb2RlIG9ubHk6IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlXG4gICAqIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuIFdoZW4gdGhlIHN0ZXAgYm9keSBydW5zXG4gICAqIG9wdGltaXN0aWNhbGx5IChiZWZvcmUgYHJ1bl9zdGFydGVkYCBpcyBkdXJhYmxlKSwgdGhlIGZpcnN0IGNodW5rIHdyaXRlIHRvXG4gICAqIGEgYnJhbmQtbmV3IHN0cmVhbSB3b3VsZCBvdGhlcndpc2UgcmVhY2ggdGhlIFdvcmxkIGJlZm9yZSB0aGUgcnVuIGV4aXN0c1xuICAgKiBhbmQgYmUgcmVqZWN0ZWQgYXMgcnVuLW5vdC1mb3VuZC4gQXdhaXRpbmcgdGhpcyBvbmNlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICogZmx1c2gvY2xvc2Ugb3JkZXJzIHRoZSB3cml0ZSBhZnRlciB0aGUgcnVuJ3MgY3JlYXRpb24uIGB1bmRlZmluZWRgIG91dHNpZGVcbiAgICogdHVyYm8gYW5kIG9uIHRoZSBhd2FpdCBwYXRoLCB3aGVyZSB0aGUgcnVuIHdhcyBhbHJlYWR5IGR1cmFibGUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj4pIHtcbiAgICBpZiAodHlwZW9mIHJ1bklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgXCJydW5JZFwiIG11c3QgYmUgYSBzdHJpbmcsIGdvdCBcIiR7dHlwZW9mIHJ1bklkfVwiYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKGBcIm5hbWVcIiBpcyByZXF1aXJlZCwgZ290IFwiJHtuYW1lfVwiYCk7XG4gICAgfVxuICAgIGNvbnN0IHdvcmxkUHJvbWlzZSA9IGdldFdvcmxkTGF6eSgpO1xuXG4gICAgLy8gSG9sZCB0aGUgZmlyc3Qgc2VydmVyIHdyaXRlIHVudGlsIHRoZSBydW4gZXhpc3RzICh0dXJibyBvcHRpbWlzdGljXG4gICAgLy8gc3RhcnQpLiBBd2FpdGVkIG9uY2UsIHRoZW4gY2xlYXJlZCBzbyBsYXRlciBmbHVzaGVzIHBheSBub3RoaW5nLiBUaGVcbiAgICAvLyByZWplY3Rpb24gaXMgc3dhbGxvd2VkIGZvciBvcmRlcmluZyBvbmx5OiBpZiBgcnVuX3N0YXJ0ZWRgIHRydWx5IGZhaWxlZFxuICAgIC8vIHRoZSBydW4gZG9lcyBub3QgZXhpc3QsIHNvIHRoZSB3cml0ZSBiZWxvdyBzdXJmYWNlcyB0aGUgcmVhbCBlcnJvci5cbiAgICBsZXQgcGVuZGluZ1J1blJlYWR5OiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkID0gcnVuUmVhZHlCYXJyaWVyO1xuICAgIGNvbnN0IGVuc3VyZVJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgaWYgKHBlbmRpbmdSdW5SZWFkeSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHBlbmRpbmdSdW5SZWFkeTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gaW50ZW50aW9uYWw6IG9yZGVyaW5nIGJhcnJpZXIgb25seSwgc2VlIGFib3ZlLlxuICAgICAgICB9XG4gICAgICAgIHBlbmRpbmdSdW5SZWFkeSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gR3JvdXAtY29tbWl0IGJ1ZmZlcmluZy5cbiAgICAvL1xuICAgIC8vIGB3cml0ZSgpYCByZXNvbHZlcyBhcyBzb29uIGFzIHRoZSBjaHVuayBlbnRlcnMgdGhpcyBib3VuZGVkIGJ1ZmZlcixcbiAgICAvLyBOT1Qgd2hlbiBpdCBpcyBkdXJhYmxlLiBUaGF0IGlzIHRoZSBwcm9wZXJ0eSB0aGF0IG1ha2VzIGJhdGNoaW5nXG4gICAgLy8gcGF0aC1pbmRlcGVuZGVudDogYSBuYXRpdmUgYHJlYWRhYmxlLnBpcGVUbyhzZXJ2ZXJXcml0YWJsZSlgIHB1bGxzIHRoZVxuICAgIC8vIG5leHQgY2h1bmsgdGhlIG1vbWVudCBgd3JpdGUoKWAgcmVzb2x2ZXMsIHNvIGNodW5rcyBhY2N1bXVsYXRlIGhlcmVcbiAgICAvLyBkdXJpbmcgdGhlIGZsdXNoLXRpbWVyIHdpbmRvdyBhbmQgd2hpbGUgYSBzZXJ2ZXIgcmVxdWVzdCBpcyBpblxuICAgIC8vIGZsaWdodCwgYW5kIGVhY2ggYWNjdW11bGF0ZWQgZ3JvdXAgZ29lcyBvdXQgYXMgb25lIGB3cml0ZU11bHRpYC5cbiAgICAvLyAoUHJldmlvdXNseSBgd3JpdGUoKWAgcmVzb2x2ZWQgb25seSBhZnRlciB0aGUgdGltZXIgQU5EIHRoZSBzZXJ2ZXJcbiAgICAvLyByb3VuZCB0cmlwLCBzbyBuYXRpdmUgcGlwaW5nIHNlcmlhbGl6ZWQgdG8gb25lIHJlcXVlc3QgcGVyIGNodW5rIGFuZFxuICAgIC8vIGJhdGNoaW5nIG9ubHkgd29ya2VkIHRocm91Z2ggYGZsdXNoYWJsZVBpcGVgJ3MgYmVzcG9rZSBjb2FsZXNjaW5nLilcbiAgICAvL1xuICAgIC8vIER1cmFiaWxpdHkgaGFzIGEgZGVkaWNhdGVkIGJhcnJpZXIgaW5zdGVhZDogYGRyYWluKClgIChleHBvc2VkIHZpYVxuICAgIC8vIHtAbGluayBTVFJFQU1fRFJBSU5fU1lNQk9MfSkgcmVzb2x2ZXMgb25seSB3aGVuIHRoZSBidWZmZXIgaXMgZW1wdHlcbiAgICAvLyBhbmQgbm8gcmVxdWVzdCBpcyBpbiBmbGlnaHQuIGBjbG9zZSgpYCBhd2FpdHMgaXQgYmVmb3JlIGNsb3NpbmcgdGhlXG4gICAgLy8gc2VydmVyIHN0cmVhbSwgYW5kIHRoZSBmbHVzaGFibGUtc3RyZWFtIGxvY2stcmVsZWFzZSBjb21wbGV0aW9uXG4gICAgLy8gYXdhaXRzIGl0IGJlZm9yZSBsZXR0aW5nIGEgc3RlcCBmaW5pc2gsIHNvIFwic3RlcCBjb21wbGV0ZWRcIiBzdGlsbFxuICAgIC8vIGltcGxpZXMgXCJzdHJlYW0gZGF0YSBkdXJhYmxlXCIsIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgIC8vXG4gICAgLy8gRW5jcnlwdGlvbi9kZWNyeXB0aW9uIGlzIGhhbmRsZWQgYXQgdGhlIGZyYW1pbmcgbGV2ZWwgYnlcbiAgICAvLyBnZXRTZXJpYWxpemVTdHJlYW0vZ2V0RGVzZXJpYWxpemVTdHJlYW0sIG5vdCBoZXJlLlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGxldCBidWZmZXI6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgIGxldCBidWZmZXJCeXRlcyA9IDA7XG4gICAgLy8gVGhlIGdyb3VwIGN1cnJlbnRseSBpbnNpZGUgYSBzZXJ2ZXIgcmVxdWVzdC4gQ291bnRlZCBhZ2FpbnN0IHRoZVxuICAgIC8vIGJ1ZmZlciBib3VuZCBzbyBgV09SS0ZMT1dfU1RSRUFNX01BWF9JTkZMSUdIVF9DSFVOS1NgIGtlZXBzIGl0c1xuICAgIC8vIGRvY3VtZW50ZWQgbWVhbmluZyAoYW4gdXBwZXIgYm91bmQgYWNyb3NzIEFMTCByZWFkLWJ1dC1ub3QtZHVyYWJsZVxuICAgIC8vIGNodW5rcyksIG5vdCBqdXN0IHRoZSBxdWV1ZWQgZm9sbG93LXVwIGdyb3VwLlxuICAgIGxldCBpbkZsaWdodENodW5rcyA9IDA7XG4gICAgbGV0IGluRmxpZ2h0Qnl0ZXMgPSAwO1xuICAgIGxldCBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIC8qKiBUaGUgaW4tZmxpZ2h0IGRpc3BhdGNoIGNoYWluLiBBdCBtb3N0IG9uZSwgcHJlc2VydmluZyBjaHVuayBvcmRlci4gKi9cbiAgICBsZXQgaW5GbGlnaHQ6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGlja3kgZmFpbHVyZTogb25jZSBhIGRpc3BhdGNoIGZhaWxzLCB0aGUgZmFpbGVkIGdyb3VwIGlzIHJlLXF1ZXVlZFxuICAgICAqIChyZXRhaW5lZCwgZXhhY3RseSBhcyB0aGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gcmV0YWluZWQgaXRzIGJ1ZmZlcilcbiAgICAgKiBhbmQgZXZlcnkgc3Vic2VxdWVudCBgd3JpdGUoKWAsIGBjbG9zZSgpYCBhbmQgYGRyYWluKClgIHJlamVjdHMgd2l0aFxuICAgICAqIHRoZSBvcmlnaW5hbCBlcnJvci4gQ2h1bmtzIHdob3NlIGB3cml0ZSgpYCBhbHJlYWR5IHJlc29sdmVkIHN1cmZhY2VcbiAgICAgKiB0aGVpciBmYWlsdXJlIGF0IHRoZSBkdXJhYmlsaXR5IGJhcnJpZXI6IHRoYXQgaXMgdGhlIGNvbnRyYWN0IG9mIGFuXG4gICAgICogZWFybHktYWNrIHNpbmsuXG4gICAgICovXG4gICAgbGV0IHNpbmtFcnJvcjogdW5rbm93bjtcbiAgICAvLyBHcm91cC1jb21taXQgd2luZG93LiBUaGUgZW52IHZhciwgd2hlbiBzZXQsIG92ZXJyaWRlcyB0aGUgV29ybGRcbiAgICAvLyBvcHRpb247IG90aGVyd2lzZSBgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zYCBnb3Zlcm5zIChkZWZhdWx0IDApLFxuICAgIC8vIGluY2x1ZGluZyB0aGUgZmlyc3QgY2h1bmsuIFdoZW4gaXQgbXVzdCBjb21lIGZyb20gdGhlIHdvcmxkLFxuICAgIC8vIGBzY2hlZHVsZUdyb3VwQ29tbWl0YCB3YWl0cyBmb3IgYHdvcmxkUHJvbWlzZWAgYmVmb3JlIGRlY2lkaW5nLCB3aGljaFxuICAgIC8vIGNvc3RzIG5vdGhpbmc6IG5vIHJlcXVlc3QgY2FuIGxlYXZlIGJlZm9yZSBgc2VuZEdyb3VwYCdzIG93biB3b3JsZFxuICAgIC8vIGF3YWl0IGVpdGhlci5cbiAgICBsZXQgcmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPSBnZXRFbnZTdHJlYW1GbHVzaEludGVydmFsTXMoKTtcbiAgICBsZXQgX2ZsdXNoSW50ZXJ2YWxSZXNvbHV0aW9uOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gICAgLy8gUGVyLXJlcXVlc3Qgd2lyZSBsaW1pdHMgKHNlcnZlciBjYXBzKSBhbmQgdGhlIGJ1ZmZlciBib3VuZC4gVGhlIGJvdW5kXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBrbm9icyB0aGUgY29hbGVzY2luZyBwaXBlIHVzZWQsIHNvIHByb2R1Y2VyIGJhY2twcmVzc3VyZVxuICAgIC8vIGJlaGF2aW9yIGlzIHVuY2hhbmdlZDogb25jZSBhIHJlcXVlc3Qtd29ydGggb2YgY2h1bmtzIChvciB0aGUgYnl0ZVxuICAgIC8vIGJvdW5kKSBpcyBidWZmZXJlZCwgYHdyaXRlKClgIGJsb2NrcyB1bnRpbCBhIGdyb3VwIGxhbmRzIGR1cmFibHkuXG4gICAgY29uc3QgbWF4Q2h1bmtzUGVyUmVxdWVzdCA9IGdldE1heENodW5rc1BlckJhdGNoKCk7XG4gICAgY29uc3QgbWF4Qnl0ZXNQZXJSZXF1ZXN0ID0gZ2V0TWF4Qnl0ZXNQZXJCYXRjaCgpO1xuICAgIGNvbnN0IG1heEJ1ZmZlcmVkQ2h1bmtzID0gZ2V0TWF4SW5mbGlnaHRDaHVua3MoKTtcbiAgICBjb25zdCBtYXhCdWZmZXJlZEJ5dGVzID0gZ2V0TWF4QnVmZmVyZWRCeXRlcygpO1xuICAgIC8vIENsaWVudC1vYnNlcnZlZCB3cml0ZS1iYXRjaCB0aW1pbmc6IHN0YW1wZWQgd2hlbiB0aGUgYnVmZmVyIGdvZXNcbiAgICAvLyBlbXB0eeKGkm5vbi1lbXB0eSwgY29uc3VtZWQgYnkgdGhlIGdyb3VwIHRoYXQgY2FycmllcyB0aGF0IGNodW5rIG91dC5cbiAgICBsZXQgYnVmZmVyVDA6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIHR5cGUgV2FpdGVyID0geyByZXNvbHZlOiAoKSA9PiB2b2lkOyByZWplY3Q6IChlcnI6IHVua25vd24pID0+IHZvaWQgfTtcbiAgICAvKiogd3JpdGUoKSBjYWxscyBibG9ja2VkIG9uIHRoZSBidWZmZXIgYm91bmQuICovXG4gICAgbGV0IGNhcGFjaXR5V2FpdGVyczogV2FpdGVyW10gPSBbXTtcbiAgICAvKiogZHJhaW4oKSBjYWxscyB3YWl0aW5nIGZvciBmdWxsIGR1cmFiaWxpdHkuICovXG4gICAgbGV0IGRyYWluV2FpdGVyczogV2FpdGVyW10gPSBbXTtcblxuICAgIGNvbnN0IHJlamVjdFdhaXRlcnMgPSAoZXJyOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBhbGwgPSBbLi4uY2FwYWNpdHlXYWl0ZXJzLCAuLi5kcmFpbldhaXRlcnNdO1xuICAgICAgY2FwYWNpdHlXYWl0ZXJzID0gW107XG4gICAgICBkcmFpbldhaXRlcnMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdyBvZiBhbGwpIHcucmVqZWN0KGVycik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRha2UgdGhlIGxhcmdlc3QgbGVhZGluZyBncm91cCB0aGF0IGZpdHMgb25lIHJlcXVlc3Q6IGF0IG1vc3RcbiAgICAgKiBgbWF4Q2h1bmtzUGVyUmVxdWVzdGAgY2h1bmtzIGFuZCBgbWF4Qnl0ZXNQZXJSZXF1ZXN0YCBjdW11bGF0aXZlIGJ5dGVzXG4gICAgICogKGEgc2luZ2xlIG92ZXJzaXplZCBjaHVuayBzdGlsbCBnb2VzIG91dCBhbG9uZSkuXG4gICAgICovXG4gICAgY29uc3QgdGFrZUdyb3VwID0gKCk6IHsgZ3JvdXA6IFVpbnQ4QXJyYXlbXTsgYnl0ZXM6IG51bWJlciB9ID0+IHtcbiAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICBsZXQgYnl0ZXMgPSAwO1xuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBidWZmZXIpIHtcbiAgICAgICAgaWYgKGNvdW50ID49IG1heENodW5rc1BlclJlcXVlc3QpIGJyZWFrO1xuICAgICAgICBpZiAoY291bnQgPiAwICYmIGJ5dGVzICsgY2h1bmsuYnl0ZUxlbmd0aCA+IG1heEJ5dGVzUGVyUmVxdWVzdCkgYnJlYWs7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGJ5dGVzICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IGJ1ZmZlci5zbGljZSgwLCBjb3VudCk7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoY291bnQpO1xuICAgICAgYnVmZmVyQnl0ZXMgLT0gYnl0ZXM7XG4gICAgICByZXR1cm4geyBncm91cCwgYnl0ZXMgfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggbG9vcDogd2hpbGUgY2h1bmtzIGFyZSBidWZmZXJlZCwgc2VuZCB0aGVtIGdyb3VwIGJ5IGdyb3VwLlxuICAgICAqIEV4YWN0bHkgb25lIGxvb3AgcnVucyBhdCBhIHRpbWUgKGBpbkZsaWdodGApLCBzbyBncm91cHMgcmVhY2ggdGhlXG4gICAgICogc2VydmVyIGluIHdyaXRlIG9yZGVyLiBDaHVua3MgdGhhdCBhcnJpdmUgd2hpbGUgYSBncm91cCdzIHJlcXVlc3QgaXNcbiAgICAgKiBpbiBmbGlnaHQgYWNjdW11bGF0ZSBhbmQgZm9ybSB0aGUgbmV4dCBncm91cDogdGhlIGdyb3VwLWNvbW1pdFxuICAgICAqIGJlaGF2aW9yLCBub3cgaW5kZXBlbmRlbnQgb2YgaG93IHRoZSBwcm9kdWNlciBwaXBlcy5cbiAgICAgKi9cbiAgICAvKipcbiAgICAgKiBTZW5kIG9uZSBncm91cCB0byB0aGUgc2VydmVyOiBnYXRlIG9uIHJ1biByZWFkaW5lc3MsIHRoZW4gb25lXG4gICAgICogYHdyaXRlTXVsdGlgIChvciBzZXF1ZW50aWFsIGB3cml0ZWBzIHdoZW4gdGhlIHdvcmxkIGxhY2tzIGl0KS4gRW1pdHNcbiAgICAgKiB0aGUgd3JpdGUtZmx1c2ggc3BhbjsgZHdlbGwgaXMgbWVhc3VyZWQgdXAgdG8ganVzdCBiZWZvcmUgdGhlIFJQQyBzbyBhXG4gICAgICogdHVyYm8gcnVuLXJlYWR5IGJhcnJpZXIgd2FpdCBjb3VudHMgYXMgYnVmZmVyIGR3ZWxsLCBtYXRjaGluZyB0aGVcbiAgICAgKiBwcmUtZ3JvdXAtY29tbWl0IHRlbGVtZXRyeS5cbiAgICAgKi9cbiAgICBjb25zdCBzZW5kR3JvdXAgPSBhc3luYyAoXG4gICAgICBncm91cDogVWludDhBcnJheVtdLFxuICAgICAgYnl0ZXM6IG51bWJlcixcbiAgICAgIGdyb3VwVDA6IG51bWJlciB8IHVuZGVmaW5lZFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgd29ybGRQcm9taXNlO1xuICAgICAgY29uc3QgZGlzcGF0Y2hBdCA9IERhdGUubm93KCk7XG4gICAgICBpZiAodHlwZW9mIHdvcmxkLnN0cmVhbXMud3JpdGVNdWx0aSA9PT0gJ2Z1bmN0aW9uJyAmJiBncm91cC5sZW5ndGggPiAxKSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGVNdWx0aShydW5JZCwgbmFtZSwgZ3JvdXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHNlcXVlbnRpYWwgd3JpdGVzXG4gICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgZ3JvdXApIHtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKHJ1bklkLCBuYW1lLCBjaHVuayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChncm91cFQwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVjb3JkU3RyZWFtV3JpdGVGbHVzaChcbiAgICAgICAgICBncm91cFQwLFxuICAgICAgICAgIGRpc3BhdGNoQXQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBncm91cC5sZW5ndGgsXG4gICAgICAgICAgYnl0ZXMsXG4gICAgICAgICAgRGF0ZS5ub3coKSAtIGRpc3BhdGNoQXRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZGlzcGF0Y2hMb29wID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChmbHVzaFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGZsdXNoVGltZXIpO1xuICAgICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdyb3VwVDAgPSBidWZmZXJUMDtcbiAgICAgICAgY29uc3QgZ3JvdXBUYWtlbkF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgeyBncm91cCwgYnl0ZXMgfSA9IHRha2VHcm91cCgpO1xuICAgICAgICBpbkZsaWdodENodW5rcyA9IGdyb3VwLmxlbmd0aDtcbiAgICAgICAgaW5GbGlnaHRCeXRlcyA9IGJ5dGVzO1xuICAgICAgICBidWZmZXJUMCA9IGJ1ZmZlci5sZW5ndGggPiAwID8gZ3JvdXBUYWtlbkF0IDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2VuZEdyb3VwKGdyb3VwLCBieXRlcywgZ3JvdXBUMCk7XG4gICAgICAgICAgaW5GbGlnaHRDaHVua3MgPSAwO1xuICAgICAgICAgIGluRmxpZ2h0Qnl0ZXMgPSAwO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIFJldGFpbiB0aGUgZmFpbGVkIGdyb3VwIChhbmQgaXRzIG9yaWdpbmFsIHQwKSBhdCB0aGUgZnJvbnQgb2ZcbiAgICAgICAgICAvLyB0aGUgYnVmZmVyLCBwb2lzb24gdGhlIHNpbmssIGFuZCBzdXJmYWNlIHRoZSBmYWlsdXJlIHRvIGV2ZXJ5XG4gICAgICAgICAgLy8gYmxvY2tlZCB3cml0ZXIgYW5kIGRyYWluIHdhaXRlci5cbiAgICAgICAgICBidWZmZXIgPSBncm91cC5jb25jYXQoYnVmZmVyKTtcbiAgICAgICAgICBidWZmZXJCeXRlcyArPSBieXRlcztcbiAgICAgICAgICBpbkZsaWdodENodW5rcyA9IDA7XG4gICAgICAgICAgaW5GbGlnaHRCeXRlcyA9IDA7XG4gICAgICAgICAgYnVmZmVyVDAgPVxuICAgICAgICAgICAgZ3JvdXBUMCAhPT0gdW5kZWZpbmVkICYmIGJ1ZmZlclQwICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBNYXRoLm1pbihncm91cFQwLCBidWZmZXJUMClcbiAgICAgICAgICAgICAgOiAoZ3JvdXBUMCA/PyBidWZmZXJUMCk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIGdyb3VwIGlzIGR1cmFibGU6IHJlbGlldmUgd3JpdGVycyBibG9ja2VkIG9uIHRoZSBib3VuZCAodGhleVxuICAgICAgICAvLyByZS1jaGVjayBpdCBhbmQgbWF5IGJsb2NrIGFnYWluKS5cbiAgICAgICAgY29uc3QgcmVsaWV2ZWQgPSBjYXBhY2l0eVdhaXRlcnM7XG4gICAgICAgIGNhcGFjaXR5V2FpdGVycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHcgb2YgcmVsaWV2ZWQpIHcucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogU3RhcnQgKG9yIGpvaW4pIHRoZSBkaXNwYXRjaCBjaGFpbi4gTmV2ZXIgbGVhdmVzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uICovXG4gICAgY29uc3Qgc3RhcnREaXNwYXRjaCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChpbkZsaWdodCB8fCBzaW5rRXJyb3IgIT09IHVuZGVmaW5lZCB8fCBidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBpbkZsaWdodCA9IGRpc3BhdGNoTG9vcCgpLnRoZW4oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBpbkZsaWdodCA9IG51bGw7XG4gICAgICAgICAgLy8gQSB3cml0ZSBjYW4gbGFuZCBpbiB0aGUgbWljcm90YXNrIGdhcCBiZXR3ZWVuIHRoZSBsb29wJ3NcbiAgICAgICAgICAvLyBlbXB0eS1idWZmZXIgZXhpdCBhbmQgdGhpcyByZWFjdGlvbi4gc2NoZWR1bGVHcm91cENvbW1pdCBzYXdcbiAgICAgICAgICAvLyBpbkZsaWdodCBzdGlsbCBzZXQgYW5kIGFybWVkIG5vIHRpbWVyLCBzbyB3aXRob3V0IHRoaXMgY2hlY2tcbiAgICAgICAgICAvLyB0aGUgY2h1bmsgd291bGQgc2l0IHN0cmFuZGVkIHVudGlsIGEgbGF0ZXIgd3JpdGUvY2xvc2UvZHJhaW4uXG4gICAgICAgICAgLy8gVHJlYXQgaXQgbGlrZSBhbiBpbi1yZXF1ZXN0IGFycml2YWw6IGRpc3BhdGNoIGltbWVkaWF0ZWx5ICh0aGVcbiAgICAgICAgICAvLyBuZXcgY2hhaW4gc2V0dGxlcyB0aGUgZHJhaW4gd2FpdGVycyB3aGVuIGl0IGZpbmlzaGVzKS5cbiAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN0YXJ0RGlzcGF0Y2goKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRnVsbHkgaWRsZSAodGhlIGxvb3Agb25seSBleGl0cyB3aXRoIGFuIGVtcHR5IGJ1ZmZlcik6IHNldHRsZVxuICAgICAgICAgIC8vIHRoZSBkdXJhYmlsaXR5IGJhcnJpZXIuXG4gICAgICAgICAgY29uc3Qgc2V0dGxlZCA9IGRyYWluV2FpdGVycztcbiAgICAgICAgICBkcmFpbldhaXRlcnMgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHcgb2Ygc2V0dGxlZCkgdy5yZXNvbHZlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGluRmxpZ2h0ID0gbnVsbDtcbiAgICAgICAgICBzaW5rRXJyb3IgPz89IGVycm9yO1xuICAgICAgICAgIHJlamVjdFdhaXRlcnMoc2lua0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTGVhZGluZy1lZGdlIGRpc3BhdGNoIHBvbGljeSBmb3IgYW4gaWRsZSBzaW5rOlxuICAgICAqIC0gd2luZG93IDw9IDAgKHRoZSBkZWZhdWx0KTogZGlzcGF0Y2ggdGhlIGxlYWRpbmcgY2h1bmsgaW1tZWRpYXRlbHkuXG4gICAgICogICBGYXN0IHByb2R1Y2VycyBzdGlsbCBiYXRjaCB2aWEgaW4tZmxpZ2h0IGFjY3VtdWxhdGlvbjogY2h1bmtzXG4gICAgICogICBhcnJpdmluZyBkdXJpbmcgdGhlIHJlcXVlc3QgZm9ybSB0aGUgbmV4dCBncm91cC4gVGhlIHRyYWRlIGZvciBhblxuICAgICAqICAgaWRsZSBidXJzdCBpcyBvbmUgZXh0cmEgcmVxdWVzdCAoYSAzMC1jaHVuayBidXJzdCBzaGlwcyBhcyAxICsgMjlcbiAgICAgKiAgIGluc3RlYWQgb2Ygb25lIDMwLWNodW5rIGdyb3VwIHVuZGVyIGEgcG9zaXRpdmUgd2luZG93KSBpbiBleGNoYW5nZVxuICAgICAqICAgZm9yIHplcm8gZml4ZWQgZmlyc3QtY2h1bmsgZGVsYXksIHdoaWNoIG1hdGNoZXMgbWVhc3VyZWQgcHJvZHVjZXJcbiAgICAgKiAgIGJlaGF2aW9yLCB3aGVyZSBpc29sYXRlZCBjaHVua3MgZG9taW5hdGUuXG4gICAgICogLSB3aW5kb3cgPiAwIChleHBsaWNpdGx5IGNvbmZpZ3VyZWQpOiBhcm0gdGhlIGdyb3VwLWNvbW1pdCB0aW1lciBzb1xuICAgICAqICAgdGhlIGxlYWRpbmcgY2h1bmsgd2FpdHMgdXAgdG8gdGhlIHdpbmRvdyBjb2xsZWN0aW5nIGEgZ3JvdXAsXG4gICAgICogICB0aGUgb3B0LWluIHRyYWRlIGZvciBzbG93LWJ1dC1zdGVhZHkgcHJvZHVjZXJzLlxuICAgICAqIFdpbmRvdyByZXNvbHV0aW9uOiBgV09SS0ZMT1dfU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TYCwgd2hlbiBzZXQsXG4gICAgICogb3ZlcnJpZGVzIGB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXNgOyBvdGhlcndpc2UgdGhlIFdvcmxkIG9wdGlvblxuICAgICAqIChkZWZhdWx0IDApIGdvdmVybnMsIGluY2x1ZGluZyB0aGUgZmlyc3QgY2h1bmsuIERlY2lkaW5nIG1heVxuICAgICAqIGhhdmUgdG8gd2FpdCBmb3IgdGhlIHdvcmxkIHRvIHJlc29sdmU7IHRoYXQgYWRkcyBubyBsYXRlbmN5IGJlY2F1c2VcbiAgICAgKiBgc2VuZEdyb3VwYCBhd2FpdHMgdGhlIHNhbWUgcHJvbWlzZSBiZWZvcmUgYW55IHJlcXVlc3QgbGVhdmVzLlxuICAgICAqL1xuICAgIGNvbnN0IHNjaGVkdWxlR3JvdXBDb21taXQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZmx1c2hUaW1lciB8fCBpbkZsaWdodCkgcmV0dXJuO1xuICAgICAgaWYgKHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gUHJvbWlzZS5yZXNvbHZlOiBldmVyeXdoZXJlIGVsc2UgdGhlIHdvcmxkIGlzIG9ubHkgZXZlciBhd2FpdGVkLFxuICAgICAgICAvLyB3aGljaCB0b2xlcmF0ZXMgYSBzeW5jaHJvbm91cyB2YWx1ZSAodGVzdHMgc3R1YiBnZXRXb3JsZExhenkgdGhhdFxuICAgICAgICAvLyB3YXkpOyAudGhlbigpIG11c3QgYmUgZ2l2ZW4gYSByZWFsIHByb21pc2UuXG4gICAgICAgIF9mbHVzaEludGVydmFsUmVzb2x1dGlvbiA/Pz0gUHJvbWlzZS5yZXNvbHZlKHdvcmxkUHJvbWlzZSlcbiAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICh3b3JsZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA9XG4gICAgICAgICAgICAgICAgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zID8/IFNUUkVBTV9GTFVTSF9JTlRFUlZBTF9NUztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFdvcmxkIHJlc29sdXRpb24gZmFpbHVyZSBzdXJmYWNlcyBvbiBkaXNwYXRjaDsgZmFsbCBiYWNrIHRvXG4gICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHNvIGJ1ZmZlcmVkIGNodW5rcyBzdGlsbCByZWFjaCB0aGUgZGlzcGF0Y2ggcGF0aFxuICAgICAgICAgICAgICAvLyAod2hlcmUgdGhlIGVycm9yIHBvaXNvbnMgdGhlIHNpbmspLlxuICAgICAgICAgICAgICByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA9IFNUUkVBTV9GTFVTSF9JTlRFUlZBTF9NUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmUtZXZhbHVhdGU6IHRoZSBidWZmZXIgbWF5IGhhdmUgYmVlbiBkaXNwYXRjaGVkIGJ5IGRyYWluKClcbiAgICAgICAgICAgIC8vIG9yIGEgZnVsbC1yZXF1ZXN0IGZhc3QgcGF0aCB3aGlsZSB0aGUgd29ybGQgcmVzb2x2ZWQuXG4gICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHNjaGVkdWxlR3JvdXBDb21taXQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zIDw9IDApIHtcbiAgICAgICAgc3RhcnREaXNwYXRjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmbHVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICB9LCByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIER1cmFiaWxpdHkgYmFycmllcjogcmVzb2x2ZXMgd2hlbiBldmVyeSBhY2NlcHRlZCBjaHVuayBoYXMgcmVhY2hlZCB0aGVcbiAgICAgKiBzZXJ2ZXIgYW5kIG5vdGhpbmcgaXMgYnVmZmVyZWQgb3IgaW4gZmxpZ2h0OyByZWplY3RzIHdpdGggdGhlIHNpbmsnc1xuICAgICAqIHN0aWNreSBlcnJvciBpZiBhbnkgZGlzcGF0Y2ggZmFpbGVkLiBGbHVzaGVzIGEgcGVuZGluZyBncm91cC1jb21taXRcbiAgICAgKiB3aW5kb3cgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdGluZyBvdXQgdGhlIHRpbWVyLlxuICAgICAqL1xuICAgIGNvbnN0IGRyYWluID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKHNpbmtFcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBzaW5rRXJyb3I7XG4gICAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwICYmICFpbkZsaWdodCkgcmV0dXJuO1xuICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBkcmFpbldhaXRlcnMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHN1cGVyKHtcbiAgICAgIGFzeW5jIHdyaXRlKGNodW5rKSB7XG4gICAgICAgIGlmIChzaW5rRXJyb3IgIT09IHVuZGVmaW5lZCkgdGhyb3cgc2lua0Vycm9yO1xuICAgICAgICBpZiAoYnVmZmVyVDAgPT09IHVuZGVmaW5lZCkgYnVmZmVyVDAgPSBEYXRlLm5vdygpO1xuICAgICAgICBidWZmZXIucHVzaChjaHVuayk7XG4gICAgICAgIGJ1ZmZlckJ5dGVzICs9IGNodW5rLmJ5dGVMZW5ndGg7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGJ1ZmZlci5sZW5ndGggPj0gbWF4Q2h1bmtzUGVyUmVxdWVzdCB8fFxuICAgICAgICAgIGJ1ZmZlckJ5dGVzID49IG1heEJ5dGVzUGVyUmVxdWVzdFxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBUaGUgYnVmZmVyZWQgZ3JvdXAgYWxyZWFkeSBmaWxscyBhIHJlcXVlc3Q6IG5vIHBvaW50IGR3ZWxsaW5nIGluXG4gICAgICAgICAgLy8gdGhlIGNvbW1pdCB3aW5kb3cuXG4gICAgICAgICAgc3RhcnREaXNwYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjaGVkdWxlR3JvdXBDb21taXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJvdW5kZWQgYnVmZmVyOiBhY2NlcHQgdGhlIGNodW5rIChuZXZlciBkcm9wKSwgdGhlbiBibG9jayB1bnRpbFxuICAgICAgICAvLyB0aGUgcmVhZC1idXQtbm90LWR1cmFibGUgcG9wdWxhdGlvbiAoYnVmZmVyZWQgQU5EIGluIHRoZSBhY3RpdmVcbiAgICAgICAgLy8gcmVxdWVzdCkgaXMgYmFjayB1bmRlciB0aGUgYm91bmQuIEVhY2ggZHVyYWJseS1zZW50IGdyb3VwXG4gICAgICAgIC8vIHJlbGlldmVzIHRoaXMuXG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICBzaW5rRXJyb3IgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIChidWZmZXIubGVuZ3RoICsgaW5GbGlnaHRDaHVua3MgPj0gbWF4QnVmZmVyZWRDaHVua3MgfHxcbiAgICAgICAgICAgIGJ1ZmZlckJ5dGVzICsgaW5GbGlnaHRCeXRlcyA+PSBtYXhCdWZmZXJlZEJ5dGVzKVxuICAgICAgICApIHtcbiAgICAgICAgICBzdGFydERpc3BhdGNoKCk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY2FwYWNpdHlXYWl0ZXJzLnB1c2goeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpbmtFcnJvciAhPT0gdW5kZWZpbmVkKSB0aHJvdyBzaW5rRXJyb3I7XG4gICAgICB9LFxuICAgICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICAgIC8vIEV2ZXJ5dGhpbmcgYWNjZXB0ZWQgbXVzdCBiZSBkdXJhYmxlIGJlZm9yZSB0aGUgc2VydmVyIHN0cmVhbSBpc1xuICAgICAgICAvLyBjbG9zZWQ6IHRoZSBzZXJ2ZXIgZmVuY2VzIHBvc3QtY2xvc2Ugd3JpdGVzLlxuICAgICAgICBhd2FpdCBkcmFpbigpO1xuXG4gICAgICAgIC8vIEEgY2xvc2Ugd2l0aCBhbiBlbXB0eSBidWZmZXIgc2tpcHMgdGhlIGRpc3BhdGNoIHBhdGggKGFuZCBpdHNcbiAgICAgICAgLy8gYmFycmllciksIGJ1dCBjYW4gaXRzZWxmIGJlIHRoZSBmaXJzdCB3cml0ZSB0byBhIGJyYW5kLW5ld1xuICAgICAgICAvLyBzdHJlYW0sIHNvIGdhdGUgaXQgdG9vLlxuICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuXG4gICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgd29ybGRQcm9taXNlO1xuICAgICAgICBjb25zdCBjbG9zZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgbmFtZSk7XG4gICAgICAgIHJlY29yZFN0cmVhbUNsb3NlKGNsb3NlU3RhcnQsIHJ1bklkLCBuYW1lKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBhYm9ydChyZWFzb24pIHtcbiAgICAgICAgLy8gQnVmZmVyZWQgY2h1bmtzIHdlcmUgYWxyZWFkeSBBQ0tFRCB0byB0aGVpciB3cml0ZXJzIChlYXJseS1hY2tcbiAgICAgICAgLy8gY29udHJhY3QpLCBhbmQgbmF0aXZlIHBpcGVUbyBhYm9ydHMgdGhpcyBzaW5rIHdoZW5ldmVyIGl0cyBTT1VSQ0VcbiAgICAgICAgLy8gZXJyb3JzLCBlLmcuIGFuIEFJIHN0cmVhbSB0aGF0IGVtaXRzIHRlbiBkZWx0YXMgYW5kIHRoZW4gdGhyb3dzLlxuICAgICAgICAvLyBEaXNjYXJkaW5nIGhlcmUgd291bGQgc2lsZW50bHkgbG9zZSB0aGUgYWNjZXB0ZWQgdGFpbCBvZiB0aGVcbiAgICAgICAgLy8gcHJlZml4LCBzbyBkZWxpdmVyIGl0IGZpcnN0OyBvbmx5IHRoZSBzZXJ2ZXIgc3RyZWFtIGNsb3NlIGlzXG4gICAgICAgIC8vIHNraXBwZWQuIEEgZGlzcGF0Y2ggZmFpbHVyZSBkdXJpbmcgdGhpcyBkcmFpbiBpcyBhbHJlYWR5IHN0aWNreVxuICAgICAgICAvLyBhbmQgc3VyZmFjZXMgdGhyb3VnaCB0aGUgc2luaydzIGVycm9yIHBhdGhzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgdW4tdGltZWJveGVkICh1bmxpa2UgdGhlIHN0ZXAtZXhlY3V0b3IncyA1MDBtc1xuICAgICAgICAvLyBpbmxpbmUgZmx1c2gpOiBnaXZpbmcgdXAgZWFybHkgd291bGQgZHJvcCBhY2tlZCBjaHVua3MsIHRoZVxuICAgICAgICAvLyBleGFjdCBsb3NzIHRoaXMgcGF0aCBleGlzdHMgdG8gcHJldmVudC4gSXQgaXMgc3RpbGwgYm91bmRlZCBpblxuICAgICAgICAvLyBwcmFjdGljZSBieSB0aGUgV29ybGQgdHJhbnNwb3J0J3Mgb3duIHRpbWVvdXQvcmV0cnkgYnVkZ2V0OiBhXG4gICAgICAgIC8vIHN0YWxsZWQgd3JpdGUgZW5kcyBpbiBhIHRlcm1pbmFsIHJlamVjdGlvbiBhZnRlciBmaW5pdGUgcmV0cmllcyxcbiAgICAgICAgLy8gd2hpY2ggcmVqZWN0cyB0aGUgZGlzcGF0Y2ggYW5kIGxhbmRzIGluIHRoZSBjYXRjaCBiZWxvdy4gVGhlXG4gICAgICAgIC8vIHNhbWUgY2F0Y2ggYWJzb3JicyB0aGUgZXhwZWN0ZWQgY29uZmxpY3Qgd2hlbiBhIHRlYXJkb3duLWRyaXZlblxuICAgICAgICAvLyBhYm9ydCBkcmFpbnMgaW50byBhbiBhbHJlYWR5LXRlcm1pbmFsIHJ1bi5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBkcmFpbigpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBzaW5rRXJyb3IgaXMgc2V0OyBhY2NlcHRlZC1idXQtdW5kZWxpdmVyYWJsZSBjaHVua3Mgc3VyZmFjZSBpdC5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmx1c2hUaW1lcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChmbHVzaFRpbWVyKTtcbiAgICAgICAgICBmbHVzaFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgICAgYnVmZmVyQnl0ZXMgPSAwO1xuICAgICAgICBzaW5rRXJyb3IgPz89IHJlYXNvbiA/PyBuZXcgRXJyb3IoJ1N0cmVhbSBhYm9ydGVkJyk7XG4gICAgICAgIC8vIFJlamVjdCBibG9ja2VkIHdyaXRlcnMgYW5kIGRyYWluIHdhaXRlcnMgc28gbm90aGluZyBsZWFrcyBvclxuICAgICAgICAvLyBoYW5ncyBvbiBhIHByb21pc2Ugd2hvc2UgdGltZXIgd2FzIGp1c3QgY2xlYXJlZC5cbiAgICAgICAgcmVqZWN0V2FpdGVycyhzaW5rRXJyb3IpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIER1cmFiaWxpdHkgYmFycmllciBmb3Igb3duZXJzIHRoYXQgY29tcGxldGUgd2l0aG91dCBjbG9zaW5nIHRoZVxuICAgIC8vIHN0cmVhbTogYGZsdXNoYWJsZVBpcGVgJ3MgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gYXdhaXRzIHRoaXMgc28gYVxuICAgIC8vIHN0ZXAgY2Fubm90IGZpbmlzaCAoYW5kIHRoZSBmdW5jdGlvbiBzdXNwZW5kKSB3aGlsZSBhY2NlcHRlZCBjaHVua3NcbiAgICAvLyBhcmUgc3RpbGwgY2xpZW50LWJ1ZmZlcmVkIG9yIGluIGZsaWdodC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU1RSRUFNX0RSQUlOX1NZTUJPTCwge1xuICAgICAgdmFsdWU6IGRyYWluLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZyb20gdGhlIG1vZHVsYXIgc2VyaWFsaXphdGlvbiBtb2R1bGVzLlxuZXhwb3J0IHR5cGUge1xuICBCeXRlU3RyZWFtRnJhbWluZyxcbiAgUmVkdWNlcnMsXG4gIFJldml2ZXJzLFxuICBTZXJpYWxpemFibGVTcGVjaWFsLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnO1xuXG4vLyBJbXBvcnQgdHlwZXMgbG9jYWxseSBmb3IgdXNlIHdpdGhpbiB0aGlzIGZpbGUuXG5pbXBvcnQgdHlwZSB7XG4gIEJ5dGVTdHJlYW1GcmFtaW5nLFxuICBSZWR1Y2VycyxcbiAgUmV2aXZlcnMsXG4gIFNlcmlhbGl6YWJsZVNwZWNpYWwsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQ29tcG9zZWQgcmVkdWNlcnMgLS0tLVxuLy8gQ29tcG9zZXMgbW9kdWxhciByZWR1Y2VycyAoY29tbW9uLCBjbGFzcywgc3RlcC1mdW5jdGlvbikgd2l0aFxuLy8gbW9kZS1zcGVjaWZpYyBSZXF1ZXN0L1Jlc3BvbnNlL1N0cmVhbSByZWR1Y2VycyBiZWxvdy5cblxuLyoqXG4gKiBCYXNlIHJlZHVjZXJzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gYm91bmRhcmllcy5cbiAqIENvbXBvc2VzOiBjbGFzcyArIHN0ZXAtZnVuY3Rpb24gKyBjb21tb24gcmVkdWNlcnMgZnJvbSB0aGUgbW9kdWxhciBtb2R1bGVzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxCYXNlUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgY29uc3QgcmVxdWVzdFByb3RvdHlwZSA9IG9uY2UoKCkgPT4gZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ1JlcXVlc3QnKSk7XG4gIGNvbnN0IHJlc3BvbnNlUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdSZXNwb25zZScpXG4gICk7XG4gIC8vIENsYXNzL0luc3RhbmNlIE1VU1QgY29tZSBiZWZvcmUgRXJyb3Igc28gdGhhdCBjdXN0b20gRXJyb3Igc3ViY2xhc3Nlc1xuICAvLyB3aXRoIFdPUktGTE9XX1NFUklBTElaRSB0YWtlIHByZWNlZGVuY2UgKGRldmFsdWUgdXNlcyBmaXJzdC1tYXRjaC13aW5zKS5cbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDbGFzc1JlZHVjZXJzKCksXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcigpLFxuICAgIC4uLmdldENvbW1vblJlZHVjZXJzKGdsb2JhbCksXG4gICAgLy8gUmVxdWVzdCBhbmQgUmVzcG9uc2UgcmVkdWNlcnMgYXJlIG1vZGUtc3BlY2lmaWMgYW5kIGFkZGVkIGJ5XG4gICAgLy8gZ2V0RXh0ZXJuYWxSZWR1Y2VycyAvIGdldFdvcmtmbG93UmVkdWNlcnMgLyBnZXRTdGVwUmVkdWNlcnMgYmVsb3cuXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBDaGFpbiB3YWxrIHJhdGhlciB0aGFuIGBpbnN0YW5jZW9mIGdsb2JhbC5SZXF1ZXN0YDogc2VlIHRoZVxuICAgICAgLy8gUmVhZGFibGVTdHJlYW0gcmVkdWNlciBpbiBnZXRXb3JrZmxvd1JlZHVjZXJzIGZvciB3aHkuIFJlYWRzIGdvXG4gICAgICAvLyB0aHJvdWdoIGRlc2NyaXB0b3JzIHNvIGEgZ2V0dGVyIGNhbm5vdCBydW4gdW5yZXBvcnRlZC5cbiAgICAgIGlmICghaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCByZXF1ZXN0UHJvdG90eXBlLnZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YTogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVxdWVzdCddID0ge1xuICAgICAgICBtZXRob2Q6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ21ldGhvZCcpIGFzIHN0cmluZyxcbiAgICAgICAgdXJsOiByZWFkUHJvcGVydHkodmFsdWUsICd1cmwnKSBhcyBzdHJpbmcsXG4gICAgICAgIGhlYWRlcnM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2hlYWRlcnMnKSBhcyBIZWFkZXJzLFxuICAgICAgICBib2R5OiByZWFkUHJvcGVydHkodmFsdWUsICdib2R5JykgYXMgUmVhZGFibGVTdHJlYW0gfCBudWxsLFxuICAgICAgICBkdXBsZXg6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2R1cGxleCcpIGFzICdoYWxmJyxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXNwb25zZVdyaXRhYmxlID0gcmVhZFByb3BlcnR5KHZhbHVlLCBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFKSBhc1xuICAgICAgICB8IFdyaXRhYmxlU3RyZWFtPFJlc3BvbnNlPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIGRhdGEucmVzcG9uc2VXcml0YWJsZSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICB9XG4gICAgICAvLyBGb3J3YXJkIHRoZSBzaWduYWwgaW4gdHdvIGNhc2VzOlxuICAgICAgLy8gICAxLiBBbHJlYWR5IGFib3J0ZWQ6IHByZXNlcnZlIGFib3J0ZWQ9dHJ1ZS9yZWFzb24gc28gdGhlIGh5ZHJhdGVkXG4gICAgICAvLyAgICAgIHN0ZXAgc2VlcyB0aGUgY2FuY2VsbGF0aW9uIHRoYXQgaGFwcGVuZWQgYmVmb3JlIHNlcmlhbGl6ZS5cbiAgICAgIC8vICAgMi4gQWxyZWFkeSB0YWdnZWQgd2l0aCB3b3JrZmxvdyBpbmZyYXN0cnVjdHVyZSwgaS5lLiBhIHNpZ25hbFxuICAgICAgLy8gICAgICBmcm9tIGEgd29ya2Zsb3ctbWFuYWdlZCBBYm9ydENvbnRyb2xsZXIsIHdoaWNoIGhhcyBzdHJlYW0vaG9va1xuICAgICAgLy8gICAgICBiYWNraW5nIGZvciBjcm9zcy1ib3VuZGFyeSBwcm9wYWdhdGlvbi5cbiAgICAgIC8vIFBsYWluIG5vbi1hYm9ydGVkIG5hdGl2ZSBzaWduYWxzIGFyZSBpbnRlbnRpb25hbGx5IGRyb3BwZWQgKHdvdWxkXG4gICAgICAvLyBtaW50IHN0cmVhbSBpbmZyYSBmb3IgZXZlcnkgUmVxdWVzdCwgaW5jbHVkaW5nIHRoZSBhdXRvLWdlbmVyYXRlZFxuICAgICAgLy8gc2lnbmFsIG9uIGBuZXcgUmVxdWVzdCh1cmwpYCkuXG4gICAgICBjb25zdCBzaWduYWwgPSByZWFkUHJvcGVydHkodmFsdWUsICdzaWduYWwnKTtcbiAgICAgIGlmIChcbiAgICAgICAgc2lnbmFsICYmXG4gICAgICAgIChyZWFkUHJvcGVydHkoc2lnbmFsLCAnYWJvcnRlZCcpIHx8XG4gICAgICAgICAgcmVhZFByb3BlcnR5KHNpZ25hbCwgQUJPUlRfU1RSRUFNX05BTUUpKVxuICAgICAgKSB7XG4gICAgICAgIGRhdGEuc2lnbmFsID0gc2lnbmFsIGFzIEFib3J0U2lnbmFsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBTZWUgdGhlIFJlcXVlc3QgcmVkdWNlciBhYm92ZS5cbiAgICAgIGlmICghaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCByZXNwb25zZVByb3RvdHlwZS52YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3R5cGUnKSBhcyBSZXNwb25zZVsndHlwZSddLFxuICAgICAgICB1cmw6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3VybCcpIGFzIHN0cmluZyxcbiAgICAgICAgc3RhdHVzOiByZWFkUHJvcGVydHkodmFsdWUsICdzdGF0dXMnKSBhcyBudW1iZXIsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3N0YXR1c1RleHQnKSBhcyBzdHJpbmcsXG4gICAgICAgIGhlYWRlcnM6IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ2hlYWRlcnMnKSBhcyBIZWFkZXJzLFxuICAgICAgICBib2R5OiByZWFkUHJvcGVydHkodmFsdWUsICdib2R5JykgYXMgUmVhZGFibGVTdHJlYW0gfCBudWxsLFxuICAgICAgICByZWRpcmVjdGVkOiByZWFkUHJvcGVydHkodmFsdWUsICdyZWRpcmVjdGVkJykgYXMgYm9vbGVhbixcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgYWJvcnQgcmVkdWNlciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBBYm9ydFNlcmlhbGl6ZWREYXRhID0ge1xuICBzdHJlYW1OYW1lOiBzdHJpbmc7XG4gIGhvb2tUb2tlbjogc3RyaW5nO1xuICBhYm9ydGVkOiBib29sZWFuO1xuICByZWFzb246IHVua25vd247XG59O1xuXG4vKipcbiAqIFN5bWJvbC1rZXllZCBpbnRlcm5hbCBmaWVsZHMgdGFnZ2VkIG9udG8gQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsXG4gKiBpbnN0YW5jZXMgKGFuZCBgaG9sZGVyYHMgaW4gcmVkdWNlciBoZWxwZXJzKS4gQWxsIG9wdGlvbmFsOiBhIHBsYWluXG4gKiBuYXRpdmUgaW5zdGFuY2UgaGFzIG5vbmUgb2YgdGhlbSBzZXQuXG4gKi9cbnR5cGUgQWJvcnRJbnRlcm5hbHMgPSB7XG4gIFtBQk9SVF9TVFJFQU1fTkFNRV0/OiBzdHJpbmc7XG4gIFtBQk9SVF9IT09LX1RPS0VOXT86IHN0cmluZztcbiAgW0FCT1JUX1JFQURFUl9DQU5DRUxdPzogQWJvcnRDb250cm9sbGVyO1xufTtcblxudHlwZSBBYm9ydFNpZ25hbExpa2UgPSBBYm9ydEludGVybmFscyAmIHtcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogdW5rbm93bjtcbiAgYWRkRXZlbnRMaXN0ZW5lcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBBYm9ydEhvbGRlciA9IEFib3J0SW50ZXJuYWxzICYgeyBzaWduYWw/OiBBYm9ydEludGVybmFscyB9O1xuXG4vKipcbiAqIFNoYXJlZCBsb2dpYyBmb3IgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJlZHVjZXJzIGluIGV4dGVybmFsIGFuZCBzdGVwXG4gKiBjb250ZXh0cy4gQXNzaWducyBzdHJlYW0vaG9vayBuYW1lcyBpZiBub3QgYWxyZWFkeSBwcmVzZW50LCBvcHRpb25hbGx5XG4gKiBhdHRhY2hlcyBhbiBhYm9ydCBsaXN0ZW5lciBmb3IgcmVhbC10aW1lIHByb3BhZ2F0aW9uLCBhbmQgcmV0dXJucyB0aGVcbiAqIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICBzaWduYWw6IEFib3J0U2lnbmFsTGlrZSxcbiAgaG9sZGVyOiBBYm9ydEhvbGRlcixcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IEFib3J0U2VyaWFsaXplZERhdGEge1xuICBsZXQgc3RyZWFtTmFtZSA9IGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV07XG4gIGxldCBob29rVG9rZW4gPSBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl07XG4gIGlmICghc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IGlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgc3RyZWFtTmFtZSA9IGdldEFib3J0U3RyZWFtSWQoaWQpO1xuICAgIGhvb2tUb2tlbiA9IGBhYnJ0XyR7aWR9YDtcbiAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl0gPSBob29rVG9rZW47XG4gICAgaWYgKGhvbGRlci5zaWduYWwpIHtcbiAgICAgIGhvbGRlci5zaWduYWxbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICAgIGhvbGRlci5zaWduYWxbQUJPUlRfSE9PS19UT0tFTl0gPSBob29rVG9rZW47XG4gICAgfVxuICB9XG5cbiAgLy8gRGVkdXBlZCB2aWEgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQgbWFya2VyOiBzZWUgYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UuXG4gIGF0dGFjaEFib3J0TGlzdGVuZXJPbmNlKFxuICAgIHNpZ25hbCBhcyBBYm9ydFNpZ25hbCxcbiAgICBzdHJlYW1OYW1lLFxuICAgIHJ1bklkLFxuICAgIGNyeXB0b0tleSxcbiAgICBvcHNcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHN0cmVhbU5hbWUsXG4gICAgaG9va1Rva2VuOiBob29rVG9rZW4hLFxuICAgIGFib3J0ZWQ6IHNpZ25hbC5hYm9ydGVkLFxuICAgIHJlYXNvbjogc2lnbmFsLmFib3J0ZWQgPyBzaWduYWwucmVhc29uIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBsb2dpYyBmb3IgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJlZHVjZXJzIGluIHdvcmtmbG93IGNvbnRleHQuXG4gKiBSZWFkcyBleGlzdGluZyBzdHJlYW0vaG9vayBuYW1lcyBmcm9tIHN5bWJvbHMgKG11c3QgYWxyZWFkeSBiZSBzZXQpLlxuICovXG5mdW5jdGlvbiByZWR1Y2VBYm9ydEJ5U3ltYm9sKFxuICBzaWduYWw6IHsgYWJvcnRlZDogYm9vbGVhbjsgcmVhc29uPzogdW5rbm93biB9LFxuICBob2xkZXI6IEFib3J0SG9sZGVyXG4pOiBBYm9ydFNlcmlhbGl6ZWREYXRhIHwgZmFsc2Uge1xuICBjb25zdCBzdHJlYW1OYW1lID1cbiAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9TVFJFQU1fTkFNRV07XG4gIGNvbnN0IGhvb2tUb2tlbiA9XG4gICAgaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9IT09LX1RPS0VOXTtcbiAgaWYgKCFzdHJlYW1OYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgc3RyZWFtIG5hbWUgaXMgbm90IHNldCcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RyZWFtTmFtZSxcbiAgICBob29rVG9rZW46IGhvb2tUb2tlbiEsXG4gICAgYWJvcnRlZDogc2lnbmFsLmFib3J0ZWQsXG4gICAgcmVhc29uOiBzaWduYWwuYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGEgc2luZ2xlIGFib3J0IGxpc3RlbmVyIHRvIGEgc2lnbmFsLCBkZWR1cGVkIGFjcm9zcyBjYWxscy5cbiAqXG4gKiBFYWNoIHNlcmlhbGl6YXRpb24gcGFzcyBnb2VzIHRocm91Z2ggdGhlIHJlZHVjZXIsIGJ1dCBhIGNvbnRyb2xsZXIgcGFzc2VkXG4gKiB0byBOIHN0ZXBzIHdvdWxkIG90aGVyd2lzZSBhY2N1bXVsYXRlIE4gbGlzdGVuZXJzLCBlYWNoIHdyaXRpbmcgdGhlIHNhbWVcbiAqIHN0cmVhbSBwYWNrZXQgYW5kIGRvdWJsZS1jbG9zaW5nIHRoZSBzdHJlYW0gb24gYWJvcnQuIFRoZSBtYXJrZXIgc3ltYm9sXG4gKiBlbnN1cmVzIHRoZSBzdHJlYW0td3JpdGUgc2lkZS1lZmZlY3QgcnVucyBhdCBtb3N0IG9uY2UgcGVyIChzaWduYWwsIHJ1bklkKS5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UoXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gIHN0cmVhbU5hbWU6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdXG4pOiB2b2lkIHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gIGlmICgoc2lnbmFsIGFzIGFueSlbQUJPUlRfTElTVEVORVJfQVRUQUNIRURdKSByZXR1cm47XG4gIChzaWduYWwgYXMgYW55KVtBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRF0gPSB0cnVlO1xuXG4gIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICdhYm9ydCcsXG4gICAgKCkgPT4ge1xuICAgICAgb3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB2aWEgdGhlIHNhbWUgbWFjaGluZXJ5IHRoZSByZWFkZXIgdXNlcyAoaHlkcmF0ZVN0ZXBBcmd1bWVudHMpXG4gICAgICAgICAgICAvLyBzbyB0aGUgcmVhc29uIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5IChET01FeGNlcHRpb24sXG4gICAgICAgICAgICAvLyBFcnJvcnMsIGN1c3RvbSBjbGFzc2VzLCBldGMuKSBhbmQgcmVzcGVjdHMgdGhlIHJ1bidzIGVuY3J5cHRpb24ga2V5LlxuICAgICAgICAgICAgLy8gQSBiYXJlIEpTT04uc3RyaW5naWZ5IGhlcmUgd291bGQgd3JpdGUgYSBwYWNrZXQgdGhlIHJlYWRlciBjYW4ndFxuICAgICAgICAgICAgLy8gZGVjb2RlIGFuZCB0aGUgbGlzdGVuZXItc2lkZSBhYm9ydCB3b3VsZCBwcm9wYWdhdGUgd2l0aCBubyByZWFzb24uXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICAgIHsgYWJvcnRlZDogdHJ1ZSwgcmVhc29uOiBzaWduYWwucmVhc29uIH0sXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgc3RyZWFtTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLndyaXRlKHBheWxvYWQgYXMgVWludDhBcnJheSk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IHN0cmVhbSB3cml0ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9LFxuICAgIHsgb25jZTogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsIHBhc3NpbmcgYXJndW1lbnRzXG4gKiB0byB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEBwYXJhbSBjcnlwdG9LZXlcbiAqIEBwYXJhbSBmcmFtZWRCeXRlU3RyZWFtcyAtIFdoZW4gYHRydWVgLCBieXRlIHN0cmVhbXMgKGB0eXBlOiAnYnl0ZXMnYClcbiAqICAgYXJlIHdyYXBwZWQgaW4gbGVuZ3RoLXByZWZpeGVkIGZyYW1lcyBvbiB0aGUgd2lyZSBzbyB0aGUgY29uc3VtZXJcbiAqICAgY2FuIHJlY29ubmVjdCBvbiB0cmFuc2llbnQgZXJyb3JzLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBydW4nc1xuICogICBjYXBhYmlsaXR5OiBzZWUgYGdldFJ1bkNhcGFiaWxpdGllc2AgaW4gYGNhcGFiaWxpdGllcy50c2AuIERlZmF1bHRzXG4gKiAgIHRvIGBmYWxzZWAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcnVucy5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IGEgbmVzdGVkIGBSZWFkYWJsZVN0cmVhbWAgZm91bmQgd2hpbGUgc2VyaWFsaXppbmdcbiAgLy8gaXMgcGlwZWQgdG8gaXRzIG93biBzZXJ2ZXIgc3RyZWFtIGluZGVwZW5kZW50bHkgb2YgdGhlIG91dGVyIHNpbmssIHNvIGl0c1xuICAvLyBmaXJzdCBjaHVuayBjYW4gcmFjZSBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWQgdGhlIHJ1bi1yZWFkeSBiYXJyaWVyIGludG8gdGhhdFxuICAvLyBzaW5rIHNvIHRoZSB3cml0ZSBvcmRlcnMgYWZ0ZXIgdGhlIHJ1biBleGlzdHMuIFVuZGVmaW5lZCBvdXRzaWRlIHR1cmJvIC9cbiAgLy8gb24gdGhlIGF3YWl0IHBhdGguXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj5cbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRBbGxCYXNlUmVkdWNlcnMoZ2xvYmFsKSxcblxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlYWRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBTdHJlYW0gbXVzdCBub3QgYmUgbG9ja2VkIHdoZW4gcGFzc2luZyBhY3Jvc3MgZXhlY3V0aW9uIGJvdW5kYXJ5XG4gICAgICBpZiAodmFsdWUubG9ja2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgJ1JlYWRhYmxlU3RyZWFtIGlzIGxvY2tlZCBhbmQgY2Fubm90IGJlIHBhc3NlZCBhY3Jvc3MgYSB3b3JrZmxvdyBib3VuZGFyeS4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhpbnQ6ICdQYXNzIHRoZSBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgLmdldFJlYWRlcigpIC8gLnBpcGVUaHJvdWdoKCkgLyAucGlwZVRvKCksIG9yIHRlZSBpdCB3aXRoIC50ZWUoKSBhbmQgcGFzcyBvbmUgb2YgdGhlIGJyYW5jaGVzLicsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdHJlYW1JZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgICAgY29uc3QgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRTdHJlYW1UeXBlKHZhbHVlKTtcblxuICAgICAgY29uc3Qgd3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgKTtcbiAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIGlmIChmcmFtZWRCeXRlU3RyZWFtcykge1xuICAgICAgICAgIG9wcy5wdXNoKHZhbHVlLnBpcGVUaHJvdWdoKGdldEJ5dGVGcmFtaW5nU3RyZWFtKCkpLnBpcGVUbyh3cml0YWJsZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wcy5wdXNoKHZhbHVlLnBpcGVUbyh3cml0YWJsZSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICBnZXRTZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgICAgICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhcbiAgICAgICAgICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgY3J5cHRvS2V5LFxuICAgICAgICAgICAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZWFkYWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICBpZiAodHlwZSkgcy50eXBlID0gdHlwZTtcbiAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnICYmIGZyYW1lZEJ5dGVTdHJlYW1zKSBzLmZyYW1pbmcgPSAnZnJhbWVkLXYxJztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG5cbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5Xcml0YWJsZVN0cmVhbSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gRmFzdCBwYXRoOiB3aGVuIHRoZSB3cml0YWJsZSBpcyBhbHJlYWR5IGJhY2tlZCBieSBhIHdvcmtmbG93XG4gICAgICAvLyBzZXJ2ZXIgc3RyZWFtIChlLmcuIGl0IGNhbWUgZnJvbSBhIHN0ZXAtY29udGV4dCBgZ2V0V3JpdGFibGUoKWBcbiAgICAgIC8vIG9yIHdhcyBoeWRyYXRlZCBmcm9tIGEgd29ya2Zsb3cgaW5wdXQgYnkgYGdldFN0ZXBSZXZpdmVyc2ApLFxuICAgICAgLy8gZm9yd2FyZCBpdHMgdW5kZXJseWluZyBgKHJ1bklkLCBuYW1lKWAgdG8gdGhlIHJlY2VpdmluZyBydW4uXG4gICAgICAvLyBUaGUgcmVjZWl2aW5nIHJ1bidzIHN0ZXAtc2lkZSByZXZpdmVyIG9wZW5zIGEgc2VydmVyIHdyaXRhYmxlXG4gICAgICAvLyBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBgKHJ1bklkLCBuYW1lKWAgYW5kIHJlc29sdmVzIHRoYXQgcnVuJ3NcbiAgICAgIC8vIGVuY3J5cHRpb24ga2V5IGRpcmVjdGx5LCBzbyB3cml0ZXMgbGFuZCBvbiB0aGUgb3JpZ2luYWwgc3RyZWFtXG4gICAgICAvLyBmb3IgdGhlIGZ1bGwgbGlmZXRpbWUgb2YgdGhlIHJlY2VpdmluZyBydW4sIHdpdGggbm8gaW4tcHJvY2Vzc1xuICAgICAgLy8gYnJpZGdlIHRpZWQgdG8gdGhlIGRlaHlkcmF0aW5nIHN0ZXAncyBsaWZldGltZS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nTmFtZSA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBjb25zdCBleGlzdGluZ1J1bklkID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV4aXN0aW5nTmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIGV4aXN0aW5nUnVuSWQgPT09ICdzdHJpbmcnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcjogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHtcbiAgICAgICAgICBuYW1lOiBleGlzdGluZ05hbWUsXG4gICAgICAgICAgcnVuSWQ6IGV4aXN0aW5nUnVuSWQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUHVibGljS2V5ID0gKHZhbHVlIGFzIGFueSlbXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTFxuICAgICAgICBdO1xuICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRlc2NyaXB0b3IuZW5jcnlwdGlvblB1YmxpY0tleSA9IGV4aXN0aW5nUHVibGljS2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRGVwbG95bWVudElkID0gKHZhbHVlIGFzIGFueSlbXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTFxuICAgICAgICBdO1xuICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nRGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRlc2NyaXB0b3IuZGVwbG95bWVudElkID0gZXhpc3RpbmdEZXBsb3ltZW50SWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShydW5JZCwgbmFtZSk7XG4gICAgICBvcHMucHVzaChyZWFkYWJsZS5waXBlVG8odmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHsgbmFtZSB9O1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0Q29udHJvbGxlciB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlciAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZS5zaWduYWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0U2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRTaWduYWwgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHBhc3NpbmcgcmV0dXJuIHZhbHVlIHRvIHRoZSBjbGllbnQgc2lkZSBhbmQgaW50byBzdGVwIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcmV0dXJuc1xuICovXG4vKipcbiAqIFByb3RvdHlwZXMgdXNlZCBmb3IgYnJhbmQtc3R5bGUgaWRlbnRpZmljYXRpb24gaW4gdGhlIHJlZHVjZXJzIGJlbG93LlxuICpcbiAqIFRoZSBzdHJlYW0gYW5kIGFib3J0IGNsYXNzZXMgYXJlIGhvc3QgY2xhc3NlcyBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LCBzb1xuICogaW5zdGFuY2VzIGNhcnJ5IHRoZSBob3N0IHByb3RvdHlwZSBpbiB0aGVpciBjaGFpbiBhbmQgYSBjaGFpbiB3YWxrXG4gKiBpZGVudGlmaWVzIHRoZW0gd2l0aG91dCBjb25zdWx0aW5nIGBTeW1ib2wuaGFzSW5zdGFuY2VgIG9uIHRoZSBzYW5kYm94XG4gKiBjbGFzcy4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgcnVudGltZSBsYWNrcyB0aGUgY2xhc3MsIGluIHdoaWNoIGNhc2VcbiAqIGlkZW50aWZpY2F0aW9uIGZhbGxzIGJhY2sgdG8gdGhlIGluZnJhc3RydWN0dXJlIHN5bWJvbHMgYWxvbmUuXG4gKi9cbi8qKlxuICogVGhlIHByb3RvdHlwZSBvZiBhIGhvc3QgY2xhc3MgdGhhdCBtYXkgYWxzbyBiZSBpbmplY3RlZCBpbnRvIHRoZSBzYW5kYm94LlxuICogUHJlZmVycyB0aGUgc2FuZGJveCBiaW5kaW5nICh0aGUgc2FtZSBob3N0IGNsYXNzIG9iamVjdCBpbiBwcmFjdGljZSkgYW5kXG4gKiBmYWxscyBiYWNrIHRvIHRoZSBob3N0J3Mgb3duLCBzbyBhIGNoYWluIHdhbGsgaWRlbnRpZmllcyBpbnN0YW5jZXMgZnJvbVxuICogZWl0aGVyIHJlYWxtIHdpdGhvdXQgY29uc3VsdGluZyBgU3ltYm9sLmhhc0luc3RhbmNlYC5cbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdENsYXNzUHJvdG90eXBlKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG5hbWU6IHN0cmluZ1xuKTogb2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgLy8gRGVzY3JpcHRvciByZWFkcyAoYHJlYWRQcm9wZXJ0eWApLCBub3QgYmFyZSBnZXRzOiBhbiBhY2Nlc3NvciBvciBQcm94eVxuICAvLyBwbGFudGVkIG9uIHRoZSBzYW5kYm94IGdsb2JhbCAob3IgdGhlIGNvbnN0cnVjdG9yKSBtdXN0IGJlIHJlY29yZGVkIGluXG4gIC8vIHRoZSBndWVzdC1jb2RlIHNpbmsgKGl0IGdhdGVzIFZNIHJldGVudGlvbiksIG5vdCBzaWxlbnRseSBleGVjdXRlZC5cbiAgLy8gQ2FsbGVycyB3cmFwIHRoaXMgaW4gYG9uY2UoLi4uKWAgcGVyIHJlZHVjZXIgc2V0LCBzbyB0aGUgcmVhZCBoYXBwZW5zXG4gIC8vIGV4YWN0bHkgb25jZSBwZXIgc2VyaWFsaXplIHBhc3MsIG9uIHRoZSBmaXJzdCBndWFyZCBpbnZvY2F0aW9uLCBpbnNpZGVcbiAgLy8gdGhlIHBhc3MncyBzaW5rIHNjb3BlLCBuZXZlciBwZXIgdmFsdWUuXG4gIGNvbnN0IGN0b3IgPSByZWFkUHJvcGVydHkoZ2xvYmFsLCBuYW1lKSA/PyByZWFkUHJvcGVydHkoZ2xvYmFsVGhpcywgbmFtZSk7XG4gIGlmICh0eXBlb2YgY3RvciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHJlYWRQcm9wZXJ0eShjdG9yLCAncHJvdG90eXBlJykgYXMgb2JqZWN0IHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICBjb25zdCByZWFkYWJsZVN0cmVhbVByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnUmVhZGFibGVTdHJlYW0nKVxuICApO1xuICBjb25zdCB3cml0YWJsZVN0cmVhbVByb3RvdHlwZSA9IG9uY2UoKCkgPT5cbiAgICBnZXRIb3N0Q2xhc3NQcm90b3R5cGUoZ2xvYmFsLCAnV3JpdGFibGVTdHJlYW0nKVxuICApO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXJQcm90b3R5cGUgPSBvbmNlKCgpID0+XG4gICAgZ2V0SG9zdENsYXNzUHJvdG90eXBlKGdsb2JhbCwgJ0Fib3J0Q29udHJvbGxlcicpXG4gICk7XG4gIGNvbnN0IGFib3J0U2lnbmFsUHJvdG90eXBlID0gb25jZSgoKSA9PlxuICAgIGdldEhvc3RDbGFzc1Byb3RvdHlwZShnbG9iYWwsICdBYm9ydFNpZ25hbCcpXG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICAvLyBSZWFkYWJsZS9Xcml0YWJsZSBzdHJlYW1zIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAgICAvLyBhcmUgXCJoYW5kbGVzXCIgdGhhdCBjYW4gYmUgcGFzc2VkIGFyb3VuZCB0byBvdGhlciBzdGVwcy5cbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBXYWxrIHRoZSBwcm90b3R5cGUgY2hhaW4gaW5zdGVhZCBvZiBgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW1gOlxuICAgICAgLy8gdGhlIGNsYXNzIGlzIGhvc3QtcHJvdmlkZWQgKGluamVjdGVkIGludG8gdGhlIHNhbmRib3gpLCBzbyBpdHNcbiAgICAgIC8vIHByb3RvdHlwZSBpcyBpbiB0aGUgY2hhaW4gb2YgYm90aCByZWFsIHN0cmVhbXMgYW5kIHRoZVxuICAgICAgLy8gYE9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlKWAgaGFuZGxlcyB1c2VkIGZvciByZXF1ZXN0XG4gICAgICAvLyBib2RpZXMsIGJ1dCBhIGNoYWluIHdhbGsgbmV2ZXIgY29uc3VsdHMgYFN5bWJvbC5oYXNJbnN0YW5jZWAsIHdoaWNoXG4gICAgICAvLyB0aGUgc2FuZGJveCBjYW4gZGVmaW5lIGFuZCB3aGljaCByYW4gZm9yIGV2ZXJ5IHZhbHVlIHRoZSBlYXJsaWVyXG4gICAgICAvLyByZWR1Y2VycyBkaWQgbm90IGNsYWltLiBSZWFkcyBiZWxvdyBnbyB0aHJvdWdoIGRlc2NyaXB0b3JzIHNvIGFcbiAgICAgIC8vIGdldHRlciBvbiBhIHN0ZXAgYXJndW1lbnQgY2Fubm90IHJ1biB1bnJlcG9ydGVkLlxuICAgICAgaWYgKCFpc0luc3RhbmNlT2ZQcm90b3R5cGUodmFsdWUsIHJlYWRhYmxlU3RyZWFtUHJvdG90eXBlLnZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZmFrZSBzdHJlYW0gc3RvcmluZyBCb2R5SW5pdCBmcm9tIFJlcXVlc3QvUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IGJvZHlJbml0ID0gcmVhZFByb3BlcnR5KHZhbHVlLCBCT0RZX0lOSVRfU1lNQk9MKTtcbiAgICAgIGlmIChib2R5SW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBmYWtlIHN0cmVhbSAtIHNlcmlhbGl6ZSB0aGUgQm9keUluaXQgZGlyZWN0bHlcbiAgICAgICAgLy8gZGV2YWx1ZSB3aWxsIGhhbmRsZSBzZXJpYWxpemluZyBzdHJpbmdzLCBVaW50OEFycmF5LCBldGMuXG4gICAgICAgIHJldHVybiB7IGJvZHlJbml0IH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9OQU1FX1NZTUJPTCkgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignUmVhZGFibGVTdHJlYW0gYG5hbWVgIGlzIG5vdCBzZXQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHM6IEV4dHJhY3Q8XG4gICAgICAgIFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10sXG4gICAgICAgIHsgbmFtZTogc3RyaW5nIH1cbiAgICAgID4gPSB7IG5hbWUgfTtcbiAgICAgIGNvbnN0IHR5cGUgPSByZWFkUHJvcGVydHkodmFsdWUsIFNUUkVBTV9UWVBFX1NZTUJPTCkgYXNcbiAgICAgICAgfCAnYnl0ZXMnXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBjb25zdCBmcmFtaW5nID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fRlJBTUlOR19TWU1CT0wpIGFzXG4gICAgICAgIHwgQnl0ZVN0cmVhbUZyYW1pbmdcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2VlIHRoZSBSZWFkYWJsZVN0cmVhbSByZWR1Y2VyIGFib3ZlIGZvciB3aHkgdGhpcyB3YWxrcyB0aGUgY2hhaW4uXG4gICAgICBpZiAoIWlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgd3JpdGFibGVTdHJlYW1Qcm90b3R5cGUudmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBuYW1lID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fTkFNRV9TWU1CT0wpIGFzIHN0cmluZztcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlU3RyZWFtIGBuYW1lYCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICAvLyBXaGVuIHRoZSBoYW5kbGUgd2FzIGZvcndhcmRlZCBmcm9tIGFub3RoZXIgcnVuIChwYXJlbnQg4oaSIGNoaWxkXG4gICAgICAvLyB2aWEgYHN0YXJ0KClgKSwgcHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQgc28gdGhlIHN0ZXAtc2lkZVxuICAgICAgLy8gcmV2aXZlciBvcGVucyB0aGUgd3JpdGFibGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgICAgY29uc3QgZm9yZWlnblJ1bklkID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wpO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUnVuSWQgPT09ICdzdHJpbmcnKSBzLnJ1bklkID0gZm9yZWlnblJ1bklkO1xuICAgICAgY29uc3QgZm9yZWlnbkRlcGxveW1lbnRJZCA9IHJlYWRQcm9wZXJ0eShcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xcbiAgICAgICk7XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcmVpZ25QdWJsaWNLZXkgPSByZWFkUHJvcGVydHkoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXG4gICAgICApO1xuICAgICAgaWYgKHR5cGVvZiBmb3JlaWduUHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBzLmVuY3J5cHRpb25QdWJsaWNLZXkgPSBmb3JlaWduUHVibGljS2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBpbiB3b3JrZmxvdyBjb250ZXh0OiByZWFkIG9ubHkgc3ltYm9scyAoaGFuZGxlcykuXG4gICAgLy8gSW4gdGhlIHdvcmtmbG93IFZNLCBnbG9iYWwuQWJvcnRDb250cm9sbGVyIGlzIGEgY2xhc3MgYnV0IGdsb2JhbC5BYm9ydFNpZ25hbFxuICAgIC8vIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgYSBjbGFzcyksIHNvIGluc3RhbmNlb2YgY2hlY2tzIHdvbid0IHdvcmsgZm9yIHNpZ25hbHMuXG4gICAgLy8gRGV0ZWN0IGluc3RhbmNlcyBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIEFCT1JUX1NUUkVBTV9OQU1FIHN5bWJvbCBpbnN0ZWFkLlxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBgdmFsdWUuc2lnbmFsYCB3YXMgYSBiYXJlIHJlYWQsIHNvIGEgYHNpZ25hbGAgZ2V0dGVyIG9uIGFueSBvYmplY3RcbiAgICAgIC8vIHJlYWNoaW5nIHRoaXMgcmVkdWNlciBleGVjdXRlZCB1bnJlcG9ydGVkLiBSZWFkIHRocm91Z2ggZGVzY3JpcHRvcnNcbiAgICAgIC8vIGFuZCBnYXRlIG9uIHRoZSBpbmZyYXN0cnVjdHVyZSBzeW1ib2wgLyBwcm90b3R5cGUgZmlyc3QuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgaG9sZGVyID0gdmFsdWUgYXMgQWJvcnRDb250cm9sbGVyICYgQWJvcnRIb2xkZXI7XG4gICAgICBjb25zdCBvd25TeW1ib2wgPSByZWFkUHJvcGVydHkodmFsdWUsIEFCT1JUX1NUUkVBTV9OQU1FKTtcbiAgICAgIGNvbnN0IGlzTmF0aXZlQWJvcnRDb250cm9sbGVyID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyUHJvdG90eXBlLnZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKG93blN5bWJvbCA9PT0gdW5kZWZpbmVkICYmICFpc05hdGl2ZUFib3J0Q29udHJvbGxlcikge1xuICAgICAgICAvLyBOb3Qgb3VycyBhbmQgbm90IGEgbmF0aXZlIGNvbnRyb2xsZXIsIGJ1dCBhIGZvcmVpZ24gY29udHJvbGxlclxuICAgICAgICAvLyBtYXkgc3RpbGwgY2FycnkgdGhlIHN5bWJvbCBvbiBpdHMgc2lnbmFsLlxuICAgICAgICBjb25zdCBtYXliZVNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWF5YmVTaWduYWwgPT09IG51bGwgfHxcbiAgICAgICAgICB0eXBlb2YgbWF5YmVTaWduYWwgIT09ICdvYmplY3QnIHx8XG4gICAgICAgICAgcmVhZFByb3BlcnR5KG1heWJlU2lnbmFsLCBBQk9SVF9TVFJFQU1fTkFNRSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZ25hbCA9IHJlYWRQcm9wZXJ0eSh2YWx1ZSwgJ3NpZ25hbCcpO1xuICAgICAgaWYgKCFzaWduYWwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHNpZ25hbCBhcyBBYm9ydFNpZ25hbCwgaG9sZGVyKTtcbiAgICB9LFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBoYXNBYm9ydFN5bWJvbCA9XG4gICAgICAgIHJlYWRQcm9wZXJ0eSh2YWx1ZSwgQUJPUlRfU1RSRUFNX05BTUUpICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBpc05hdGl2ZUFib3J0U2lnbmFsID0gaXNJbnN0YW5jZU9mUHJvdG90eXBlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWJvcnRTaWduYWxQcm90b3R5cGUudmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAoIWhhc0Fib3J0U3ltYm9sICYmICFpc05hdGl2ZUFib3J0U2lnbmFsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRCeVN5bWJvbCh2YWx1ZSBhcyBBYm9ydFNpZ25hbCwgdmFsdWUgYXMgQWJvcnRIb2xkZXIpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcGFzc2luZyByZXR1cm4gdmFsdWUgdG8gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBnZXRTdGVwUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSByZXR1cm5lZCBgUmVhZGFibGVTdHJlYW1gIGlzIHBpcGVkIHRvIHRoZSBzZXJ2ZXJcbiAgLy8gYWZ0ZXIgdGhlIGJvZHkgYnV0IHdpdGhpbiB0aGUgc2FtZSBvcCBmbHVzaCwgc28gaXRzIGZpcnN0IGNodW5rIGNhbiByYWNlXG4gIC8vIGBydW5fc3RhcnRlZGAuIFRocmVhZCB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgaW50byB0aGUgc2luayBzbyB0aGF0IHdyaXRlXG4gIC8vIG9yZGVycyBhZnRlciB0aGUgcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdHJlYW0gYWxyZWFkeSBoYXMgdGhlIG5hbWUgc3ltYm9sIHNldCwgaW4gd2hpY2ggY2FzZVxuICAgICAgLy8gaXQncyBhbHJlYWR5IGJlaW5nIHN1bmsgdG8gdGhlIHNlcnZlciBhbmQgd2UgY2FuIHJldHVybiB0aGVcbiAgICAgIC8vIG5hbWUgYW5kIHR5cGUuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBsZXQgdHlwZSA9IHZhbHVlW1NUUkVBTV9UWVBFX1NZTUJPTF07XG4gICAgICAvLyBUaGUgZnJhbWluZyBzeW1ib2wgaXMgc2V0IHdoZW4gYSB3b3JrZmxvdyBWTSByZXZpdmVzIGEgc3RyZWFtXG4gICAgICAvLyBoYW5kbGUgZnJvbSBhIHByZXZpb3VzIHN0ZXAgKHNlZSBgZ2V0V29ya2Zsb3dSZXZpdmVyc2ApLiBXaGVuXG4gICAgICAvLyBwcmVzZW50IHdlIG11c3QgcHJvcGFnYXRlIHRoZSBzYW1lIGZyYW1pbmcgY2hvaWNlIG9uIHRoZSB3YXlcbiAgICAgIC8vIGJhY2sgb3V0LCBzaW5jZSB0aGUgYnl0ZXMgYWxyZWFkeSBvbiB0aGUgc2VydmVyJ3Mgc3RyZWFtIGFyZSBpblxuICAgICAgLy8gdGhhdCBmb3JtYXQ7IHN3aXRjaGluZyBmb3JtYXQgbWlkLXN0cmVhbSB3b3VsZCBjb3JydXB0IHRoZW0uXG4gICAgICBsZXQgZnJhbWluZzogQnl0ZVN0cmVhbUZyYW1pbmcgfCB1bmRlZmluZWQgPSB2YWx1ZVtTVFJFQU1fRlJBTUlOR19TWU1CT0xdO1xuXG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgICAgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgICAgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuICAgICAgICBmcmFtaW5nID0gdHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcyA/ICdmcmFtZWQtdjEnIDogZnJhbWluZztcblxuICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgICAgaWYgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSB7XG4gICAgICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICAgICAgdmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgaWYgKGZyYW1pbmcpIHMuZnJhbWluZyA9IGZyYW1pbmc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuV3JpdGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGxldCBuYW1lID0gdmFsdWVbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGNvbnN0IGZvcmVpZ25SdW5JZCA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTF07XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgICAgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgICAgb3BzLnB1c2goXG4gICAgICAgICAgbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIG5hbWUpXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgICAgICAgIGdldFN0ZXBSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGNyeXB0b0tleSksXG4gICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlVG8odmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1dyaXRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblJ1bklkID09PSAnc3RyaW5nJykgcy5ydW5JZCA9IGZvcmVpZ25SdW5JZDtcbiAgICAgIGNvbnN0IGZvcmVpZ25QdWJsaWNLZXkgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5lbmNyeXB0aW9uUHVibGljS2V5ID0gZm9yZWlnblB1YmxpY0tleTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvcmVpZ25EZXBsb3ltZW50SWQgPSAodmFsdWUgYXMgYW55KVtcbiAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTFxuICAgICAgXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnbkRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5kZXBsb3ltZW50SWQgPSBmb3JlaWduRGVwbG95bWVudElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRDb250cm9sbGVyIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLnNpZ25hbCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRTaWduYWwgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydFNpZ25hbCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0U2lnbmFsKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDYW5jZWwgZGFuZ2xpbmcgYWJvcnQtc3RyZWFtIHJlYWRlcnMgb24gYW55IEFib3J0Q29udHJvbGxlciBpbnN0YW5jZXMgZm91bmRcbiAqIGluIHRoZSBoeWRyYXRlZCBzdGVwIGFyZ3VtZW50cy4gQ2FsbGVkIGFmdGVyIHRoZSBzdGVwIGZ1bmN0aW9uIHJldHVybnNcbiAqIChzdWNjZXNzIG9yIGZhaWx1cmUpIHRvIHByZXZlbnQgcmVhZGVyIHByb21pc2VzIGZyb20ga2VlcGluZyB0aGUgc2VydmVybGVzc1xuICogZnVuY3Rpb24gYWxpdmUgaW5kZWZpbml0ZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsQWJvcnRSZWFkZXJzKC4uLnZhbHVlczogdW5rbm93bltdKTogdm9pZCB7XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgV2Vha1NldCgpO1xuICBmdW5jdGlvbiBjYW5jZWxJZlByZXNlbnQodmFsOiBBYm9ydEludGVybmFscyk6IHZvaWQge1xuICAgIGNvbnN0IGNhbmNlbCA9IHZhbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXTtcbiAgICBpZiAoY2FuY2VsICYmICFjYW5jZWwuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNhbmNlbC5hYm9ydCgpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB3YWxrKHZhbDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGlmICh2aXNpdGVkLmhhcyh2YWwgYXMgb2JqZWN0KSkgcmV0dXJuO1xuICAgIHZpc2l0ZWQuYWRkKHZhbCBhcyBvYmplY3QpO1xuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIGNhbmNlbElmUHJlc2VudCh2YWwgYXMgQWJvcnRDb250cm9sbGVyICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbC5zaWduYWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkge1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbCkgd2FsayhpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZhbC52YWx1ZXMoKSkgd2Fsayh2KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZhbCkgd2Fsayh2KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmVxdWVzdC9SZXNwb25zZSBleHBvc2UgYHNpZ25hbGAvYGJvZHlgIGFzIHByb3RvdHlwZSBnZXR0ZXJzLCBzb1xuICAgIC8vIE9iamVjdC52YWx1ZXMoKSB3b24ndCBmaW5kIHRoZW0uIERlc2NlbmQgZXhwbGljaXRseS5cbiAgICBpZiAodHlwZW9mIFJlcXVlc3QgIT09ICd1bmRlZmluZWQnICYmIHZhbCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIHdhbGsodmFsLnNpZ25hbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgdiBvZiBPYmplY3QudmFsdWVzKHZhbCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHdhbGsodik7XG4gIH1cbiAgZm9yIChjb25zdCB2IG9mIHZhbHVlcykgd2Fsayh2KTtcbn1cblxuLyoqXG4gKiBTZXRzIHVwIGEgc3RyZWFtIHJlYWRlciBvbiB0aGUgY29udHJvbGxlciB0aGF0IGxpc3RlbnMgZm9yIGFuIGFib3J0IHBhY2tldC5cbiAqIFJldHVybnMgdGhlIHJlYWRlckNhbmNlbCBjb250cm9sbGVyIHNvIGl0IGNhbiBiZSBzdG9yZWQgb24gYm90aCB0aGVcbiAqIGNvbnRyb2xsZXIgYW5kIHNpZ25hbCBmb3IgY2xlYW51cCBieSBjYW5jZWxBYm9ydFJlYWRlcnMuXG4gKi9cbmZ1bmN0aW9uIHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgc3RyZWFtTmFtZTogc3RyaW5nLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXVxuKTogQWJvcnRDb250cm9sbGVyIHtcbiAgY29uc3QgcmVhZGVyQ2FuY2VsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIG9wcy5wdXNoKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBzdHJlYW1OYW1lKTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgcmVhZGVyLnJlYWQoKSxcbiAgICAgICAgICBuZXcgUHJvbWlzZTx7IHZhbHVlOiB1bmRlZmluZWQ7IGRvbmU6IHRydWUgfT4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWFkZXJDYW5jZWwuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlckNhbmNlbC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgICAgICAgKCkgPT4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSksXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAvLyBBbiBhYm9ydCBwYWNrZXQgYXJyaXZlZDogcHJvcGFnYXRlIGl0IGFzIGZhc3QgYXMgcG9zc2libGUuIFJlbGVhc2VcbiAgICAgICAgICAvLyB0aGUgbG9jayAoc3luY2hyb25vdXMpIHJhdGhlciB0aGFuIGNhbmNlbGxpbmcgaGVyZTogb24gYVxuICAgICAgICAgIC8vIHNlcnZpY2UtYmFja2VkIFdvcmxkIGByZWFkZXIuY2FuY2VsKClgIGNhbiBkbyBhIG5ldHdvcmsgcm91bmQtdHJpcCxcbiAgICAgICAgICAvLyBhbmQgYXdhaXRpbmcgaXQgYmVmb3JlIGBjb250cm9sbGVyLmFib3J0KClgIHdvdWxkIGRlbGF5IChvciwgaWYgaXRcbiAgICAgICAgICAvLyBoYW5ncywgZHJvcCkgcmVhbC10aW1lIGFib3J0IGRlbGl2ZXJ5IHRvIHRoZSBpbi1mbGlnaHQgc3RlcC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBSZWFkZXIgbWF5IGFscmVhZHkgYmUgcmVsZWFzZWQ7IGlnbm9yZS5cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEh5ZHJhdGUgdmlhIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgd3JpdGVyIHVzZWQgc28gdGhlIHJlYXNvblxuICAgICAgICAgICAgLy8gcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHkuIEVuY3J5cHRpb24ga2V5IChpZiBhbnkpXG4gICAgICAgICAgICAvLyBjb21lcyBmcm9tIHRoZSBzdGVwIGNvbnRleHQsIHNldCB1cCBieSB0aGUgc3RlcCBleGVjdXRvciBiZWZvcmVcbiAgICAgICAgICAgIC8vIHRoaXMgcmVhZGVyIHJ1bnMuIEZhbGxiYWNrIHRvIHVuZGVmaW5lZCBmb3IgZXh0ZXJuYWwtY29udGV4dFxuICAgICAgICAgICAgLy8gcmV2aXZlcyAodGhlIGh5ZHJhdGUgcGF0aCBpcyBlbmNyeXB0aW9uLWtleS10b2xlcmFudCkuXG4gICAgICAgICAgICBjb25zdCBjdHhGb3JLZXkgPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgY3R4Rm9yS2V5Py5lbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApKSBhcyB7IHJlYXNvbj86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZGF0YT8ucmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIHN0ZXAgZmluaXNoZWQgKG9yIHRoZSByZWFkZXIgd2FzIGNhbmNlbGxlZCkgd2l0aG91dCBhbiBhYm9ydC5cbiAgICAgICAgICAvLyBDYW5jZWwgKG5vdCBqdXN0IHJlbGVhc2UpIHNvIHRoZSB1bmRlcmx5aW5nIFdvcmxkIHN0cmVhbSBpcyB0b3JuXG4gICAgICAgICAgLy8gZG93bjogYSBwb2xsaW5nIFdvcmxkIChlLmcuIHdvcmxkLWxvY2FsKSBvdGhlcndpc2UgbGVha3MgYSB0YWlsXG4gICAgICAgICAgLy8gcmVhZGVyIChhIDEwMG1zIGZpbGVzeXN0ZW0gcG9sbCBwbHVzIGVtaXR0ZXIgbGlzdGVuZXJzKSBwZXIgc3RlcFxuICAgICAgICAgIC8vIGludm9jYXRpb24gZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9jZXNzLCBzaW5jZSBhIHNpZ25hbC1iZWFyaW5nIHN0ZXBcbiAgICAgICAgICAvLyBvcGVucyBvbmUgb2YgdGhlc2Ugb24gZXZlcnkgcmV2aXZhbCBhbmQgdXN1YWxseSBuZXZlciBhYm9ydHMuIEZpcmVcbiAgICAgICAgICAvLyBhbmQgZm9yZ2V0OiBhIHNlcnZpY2UtYmFja2VkIFdvcmxkJ3MgY2FuY2VsIG1heSBoaXQgdGhlIG5ldHdvcmssXG4gICAgICAgICAgLy8gYW5kIHRoaXMgcGF0aCBtdXN0IG5vdCBibG9jayB0aGUgc3RlcCdzIG9wcy1zZXR0bGUgd2luZG93LlxuICAgICAgICAgIHZvaWQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN0cmVhbSByZWFkIGZhaWxlZDogc2lnbmFsIHdvbid0IHByb3BhZ2F0ZSBpbiByZWFsLXRpbWUsXG4gICAgICAgIC8vIGJ1dCBob29rLWJhc2VkIHByb3BhZ2F0aW9uIG9uIG5leHQgcmVwbGF5IHByb3ZpZGVzIGZhbGxiYWNrXG4gICAgICB9XG4gICAgfSkoKVxuICApO1xuXG4gIHJldHVybiByZWFkZXJDYW5jZWw7XG59XG5cbi8qKlxuICogU3RvcmVzIGFib3J0IHNlcmlhbGl6YXRpb24gc3ltYm9scyBhbmQgdGhlIHJlYWRlckNhbmNlbCBjb250cm9sbGVyXG4gKiBvbiBib3RoIHRoZSBjb250cm9sbGVyIGFuZCBpdHMgc2lnbmFsLlxuICovXG5mdW5jdGlvbiB0YWdBYm9ydFBhaXIoXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgdmFsdWU6IHsgc3RyZWFtTmFtZTogc3RyaW5nOyBob29rVG9rZW46IHN0cmluZyB9LFxuICByZWFkZXJDYW5jZWw/OiBBYm9ydENvbnRyb2xsZXJcbik6IHZvaWQge1xuICBjb25zdCB0YWdnZWRDb250cm9sbGVyID0gY29udHJvbGxlciBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEludGVybmFscztcbiAgY29uc3QgdGFnZ2VkU2lnbmFsID0gY29udHJvbGxlci5zaWduYWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscztcbiAgdGFnZ2VkQ29udHJvbGxlcltBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX0hPT0tfVE9LRU5dID0gdmFsdWUuaG9va1Rva2VuO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfU1RSRUFNX05BTUVdID0gdmFsdWUuc3RyZWFtTmFtZTtcbiAgdGFnZ2VkU2lnbmFsW0FCT1JUX0hPT0tfVE9LRU5dID0gdmFsdWUuaG9va1Rva2VuO1xuICBpZiAocmVhZGVyQ2FuY2VsKSB7XG4gICAgdGFnZ2VkQ29udHJvbGxlcltBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgICB0YWdnZWRTaWduYWxbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSByZWFkZXJDYW5jZWw7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wYWdhdGUgYWJvcnQtaW50ZXJuYWwgc3ltYm9scyBmcm9tIG9uZSBzaWduYWwgdG8gYW5vdGhlci4gVXNlZCBieSB0aGVcbiAqIFJlcXVlc3QgcmV2aXZlciBiZWNhdXNlIGBuZXcgUmVxdWVzdCh1cmwsIHsgc2lnbmFsIH0pYCBjb3BpZXMgdGhlIHNpZ25hbFxuICogaW50ZXJuYWxseTogdGhlIGNvbnN0cnVjdGVkIGByZXF1ZXN0LnNpZ25hbGAgaXMgYSBmcmVzaCBBYm9ydFNpZ25hbCB0aGF0XG4gKiBkb2Vzbid0IGNhcnJ5IHN5bWJvbHMgZnJvbSB0aGUgc291cmNlLlxuICovXG5mdW5jdGlvbiBjb3B5QWJvcnRJbnRlcm5hbHMoc3JjOiBBYm9ydFNpZ25hbCwgZGVzdDogQWJvcnRTaWduYWwpOiB2b2lkIHtcbiAgY29uc3QgcyA9IHNyYyBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCBkID0gZGVzdCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICBpZiAoc1tBQk9SVF9TVFJFQU1fTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfU1RSRUFNX05BTUVdID0gc1tBQk9SVF9TVFJFQU1fTkFNRV07XG4gIH1cbiAgaWYgKHNbQUJPUlRfSE9PS19UT0tFTl0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfSE9PS19UT0tFTl0gPSBzW0FCT1JUX0hPT0tfVE9LRU5dO1xuICB9XG4gIGlmIChzW0FCT1JUX1JFQURFUl9DQU5DRUxdICE9PSB1bmRlZmluZWQpIHtcbiAgICBkW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gc1tBQk9SVF9SRUFERVJfQ0FOQ0VMXTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQWJvcnRDb250cm9sbGVyIHdpdGggc3RyZWFtLWJhY2tlZCBhYm9ydCBwcm9wYWdhdGlvbi5cbiAqIFVzZWQgYnkgc3RlcCBhbmQgZXh0ZXJuYWwgcmV2aXZlcnMgd2hlcmUgcmVhbCBhYm9ydCBzaWduYWwgYmVoYXZpb3IgaXMgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzZXJpYWxpemVkIGFib3J0IGNvbnRyb2xsZXIvc2lnbmFsIGRhdGFcbiAqIEBwYXJhbSBvcHMgLSBUaGUgb3BzIGFycmF5IGZvciB0cmFja2luZyBhc3luYyB3b3JrXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElEIChmb3Igc3RyZWFtIHJlYWRzKVxuICogQHJldHVybnMgQSByZWFsIEFib3J0Q29udHJvbGxlciB3aXRoIHBhdGNoZWQgYWJvcnQoKSBtZXRob2RcbiAqL1xuZnVuY3Rpb24gcmV2aXZlQWJvcnRDb250cm9sbGVyKFxuICB2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFsnQWJvcnRDb250cm9sbGVyJ10sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGlmICh2YWx1ZS5hYm9ydGVkKSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgICBjb250cm9sbGVyLmFib3J0KHZhbHVlLnJlYXNvbik7XG4gIH0gZWxzZSBpZiAodmFsdWUuc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IHJlYWRlckNhbmNlbCA9IHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgcnVuSWQsXG4gICAgICB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgb3BzXG4gICAgKTtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUsIHJlYWRlckNhbmNlbCk7XG4gIH0gZWxzZSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIGFib3J0KCkgdG8gYWxzbyB3cml0ZSBzdHJlYW0gKyByZXN1bWUgaG9vayAoZm9yIHN0ZXAtaW5pdGlhdGVkIGFib3J0KVxuICBjb25zdCBvcmlnaW5hbEFib3J0ID0gY29udHJvbGxlci5hYm9ydC5iaW5kKGNvbnRyb2xsZXIpO1xuICBjb250cm9sbGVyLmFib3J0ID0gKHJlYXNvbj86IHVua25vd24pID0+IHtcbiAgICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgIG9yaWdpbmFsQWJvcnQocmVhc29uKTtcblxuICAgIGNvbnN0IGN0eCA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgY3R4Lm9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIGFib3J0IHBheWxvYWQgdGhyb3VnaCB0aGUgc2FtZSBtYWNoaW5lcnkgdGhlIGhvb2tcbiAgICAgICAgICAgIC8vIGV2ZW50IHVzZXMgc28gdGhlIGByZWFzb25gIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5XG4gICAgICAgICAgICAvLyAoRE9NRXhjZXB0aW9uLCBjdXN0b20gZXJyb3JzLCBldGMuKSBhbmQgcmVzcGVjdHMgdGhlIHJ1bidzXG4gICAgICAgICAgICAvLyBlbmNyeXB0aW9uIGtleSwgc3ltbWV0cmljIHdpdGggd2hhdCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAvLyB3cml0ZXMgZm9yIHdvcmtmbG93LWluaXRpYXRlZCBhYm9ydHMuXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfSxcbiAgICAgICAgICAgICAgY3R4LndvcmtmbG93TWV0YWRhdGEud29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICB2YWx1ZS5zdHJlYW1OYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocGF5bG9hZCBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgc3RyZWFtIHdyaXRlXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuXG4gICAgICBpZiAodmFsdWUuaG9va1Rva2VuKSB7XG4gICAgICAgIC8vIFRoZSBkdXJhYmxlIGhvb2sgcmVzdW1lICh3aGljaCB3cml0ZXMgdGhlIGBob29rX3JlY2VpdmVkYCBldmVudCB0aGF0XG4gICAgICAgIC8vIHJlY29yZHMgdGhpcyBhYm9ydCBpbiB0aGUgd29ya2Zsb3cncyBldmVudCBsb2cpIG11c3QgYmUgY29tbWl0dGVkXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgc3RlcCBjb21wbGV0ZXMuIE90aGVyd2lzZSB0aGUgd29ya2Zsb3cgY29udGludWF0aW9uXG4gICAgICAgIC8vIGVucXVldWVkIGJ5IGBzdGVwX2NvbXBsZXRlZGAgY2FuIGFkdmFuY2UgcGFzdCB0aGUgYWJvcnQgKGRpc3BhdGNoaW5nXG4gICAgICAgIC8vIGEgbGF0ZXIgc3RlcCB3aXRoIGEgc3RhbGUsIG5vbi1hYm9ydGVkIGBzaWduYWxgKSBiZWZvcmUgdGhlIGV2ZW50XG4gICAgICAgIC8vIGV4aXN0cy4gUm91dGUgaXQgdG8gYHByZUNvbXBsZXRpb25PcHNgIChhd2FpdGVkIGlubGluZSBiZWZvcmVcbiAgICAgICAgLy8gY29tcGxldGlvbikgcmF0aGVyIHRoYW4gYG9wc2AgKGJlc3QtZWZmb3J0LCBiYWNrZ3JvdW5kKS4gVGhlIHN0cmVhbVxuICAgICAgICAvLyB3cml0ZSBhYm92ZSBzdGF5cyBpbiBgb3BzYDogaXQgbXVzdCBmaXJlIEFTQVAgdG8gcmVhY2ggYW4gaW4tZmxpZ2h0XG4gICAgICAgIC8vIHNpYmxpbmcgc3RlcCBhbmQgaXMgbm90IHRoZSBkdXJhYmxlIHJlY29yZC5cbiAgICAgICAgLy8gU3dhbGxvdyBlcnJvcnMgaGVyZSBzbyB0aGUgcHJvbWlzZSBjYW4gb25seSBldmVyIGVuZm9yY2Ugb3JkZXJpbmdcbiAgICAgICAgLy8gd2hlbiBhd2FpdGVkIChzZWUgdGhlIG5vLXJlamVjdCBjb250cmFjdCBvblxuICAgICAgICAvLyBTdGVwQ29udGV4dC5wcmVDb21wbGV0aW9uT3BzKTsgYSBmYWlsZWQgcmVzdW1lIHJldHJpZXMgb24gbmV4dCByZXBsYXkuXG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bWUgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHJlc3VtZUhvb2s6IHJlc3VtZUhvb2tGbiB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgICAgICAnLi9ydW50aW1lL3Jlc3VtZS1ob29rLmpzJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHJlc3VtZUhvb2tGbih2YWx1ZS5ob29rVG9rZW4sIHtcbiAgICAgICAgICAgICAgYWJvcnRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBob29rIHJlc3VtZTogcmV0cnkgb24gbmV4dCByZXBsYXlcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGN0eC5wcmVDb21wbGV0aW9uT3BzLnB1c2goaG9va1Jlc3VtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG4vKipcbiAqIFJldml2ZXMgb25seSBhbiBBYm9ydFNpZ25hbCB3aXRob3V0IHRoZSBwYXRjaGVkIGFib3J0KCkgb3ZlcmhlYWQuXG4gKiBVc2VkIHdoZW4gb25seSBhIHNpZ25hbCAobm90IGEgY29udHJvbGxlcikgd2FzIHNlcmlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIHJldml2ZUFib3J0U2lnbmFsKFxuICB2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFsnQWJvcnRTaWduYWwnXSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmdcbik6IEFib3J0U2lnbmFsIHtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBpZiAodmFsdWUuYWJvcnRlZCkge1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSk7XG4gICAgY29udHJvbGxlci5hYm9ydCh2YWx1ZS5yZWFzb24pO1xuICB9IGVsc2UgaWYgKHZhbHVlLnN0cmVhbU5hbWUpIHtcbiAgICBjb25zdCByZWFkZXJDYW5jZWwgPSBzZXR1cEFib3J0U3RyZWFtUmVhZGVyKFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHJ1bklkLFxuICAgICAgdmFsdWUuc3RyZWFtTmFtZSxcbiAgICAgIG9wc1xuICAgICk7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlLCByZWFkZXJDYW5jZWwpO1xuICB9IGVsc2Uge1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG59XG5cbi8qKlxuICogQmFzZSByZXZpdmVycyBzaGFyZWQgYWNyb3NzIGFsbCBzZXJpYWxpemF0aW9uIGJvdW5kYXJpZXMuXG4gKiBDb21wb3NlczogY2xhc3MgKyBjb21tb24gcmV2aXZlcnMgZnJvbSB0aGUgbW9kdWxhciBtb2R1bGVzLlxuICpcbiAqIFRoaXMgaXMgZXhwb3J0ZWQgYmVjYXVzZSBzZXJpYWxpemF0aW9uLWZvcm1hdC50cyBhbmQgb3RoZXIgZmlsZXMgcmVmZXJlbmNlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcykge1xuICByZXR1cm4ge1xuICAgIC4uLmdldENsYXNzUmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAuLi5nZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUoZ2xvYmFsKSxcbiAgfSBhcyBjb25zdCBzYXRpc2ZpZXMgUGFydGlhbDxSZXZpdmVycz47XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgd3JpdGUtb25seSBrZXkgYSBydW4gbmVlZHMgd2hlbiB3cml0aW5nIGludG8gYW5vdGhlciBydW4nc1xuICogZm9yd2FyZGVkIHN0cmVhbS5cbiAqXG4gKiBUaHJlZSB0aWVycywgY2hlYXBlc3QgZmlyc3Q6XG4gKlxuICogMS4gVGhlIGRlc2NyaXB0b3IgY2FycmllcyB0aGUgb3duZXIncyBYMjU1MTkgcHVibGljIGtleTogc2VhbCB0byBpdCB3aXRoXG4gKiAgICBubyBJL08gd2hhdHNvZXZlci4gVGhlIG93bmVyIHB1Ymxpc2hlZCB0aGUga2V5IHdoZW4gaXQgY3JlYXRlZCB0aGVcbiAqICAgIHN0cmVhbSwgc28gdGhpcyBpcyB0aGUgemVyby1yb3VuZC10cmlwIHBhdGguXG4gKiAyLiBUaGUgZGVzY3JpcHRvciBjYXJyaWVzIHRoZSBvd25lcidzIGRlcGxveW1lbnQgSUQ6IHJlc29sdmUgdGhlIG93bmVyJ3NcbiAqICAgIHN5bW1ldHJpYyBrZXksIHdoaWNoIGNyb3NzLWRlcGxveW1lbnQgbWVhbnMgYSBrZXktQVBJIHJvdW5kIHRyaXAuXG4gKiAzLiBOZWl0aGVyIChkZXNjcmlwdG9ycyB3cml0dGVuIGJ5IG9sZGVyIFNES3MpOiBsb2FkIHRoZSBvd25pbmcgcnVuIGZpcnN0LFxuICogICAgdGhlbiByZXNvbHZlIGl0cyBzeW1tZXRyaWMga2V5LlxuICpcbiAqIFRpZXJzIDIgYW5kIDMgaW1wb3J0IHRoZSBrZXkgZW5jcnlwdC1vbmx5LCB3aGljaCBpcyBhbiBob25vci1zeXN0ZW1cbiAqIHJlc3RyaWN0aW9uOiB0aGUgc2FtZSBieXRlcyBjb3VsZCBkZWNyeXB0LiBUaWVyIDEgbWFrZXMgaXQgYSBjcnlwdG9ncmFwaGljXG4gKiBndWFyYW50ZWU6IGEgcHVibGljIGtleSBjYW5ub3QgcmVhZCBhbnl0aGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Rm9yd2FyZGVkV3JpdGFibGVFbmNyeXB0aW9uS2V5KFxuICBydW5JZDogc3RyaW5nLFxuICBkZXBsb3ltZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZW5jcnlwdGlvblB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgb3duZXJQdWJsaWNLZXkgPSBkZWNvZGVSdW5QdWJsaWNLZXkoZW5jcnlwdGlvblB1YmxpY0tleSk7XG4gIGlmIChvd25lclB1YmxpY0tleSkgcmV0dXJuIHNlYWxUbyhvd25lclB1YmxpY0tleSk7XG5cbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgaWYgKCF3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHJhd0tleSA9IGRlcGxveW1lbnRJZFxuICAgID8gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bihydW5JZCwgeyBkZXBsb3ltZW50SWQgfSlcbiAgICA6IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4oYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQpKTtcbiAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXksIFsnZW5jcnlwdCddKSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gdGhlIGNsaWVudCBzaWRlLFxuICogcmVjZWl2aW5nIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVybmFsUmV2aXZlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldENvbW1vblJldml2ZXJzKGdsb2JhbCksXG5cbiAgICAvLyBTdGVwRnVuY3Rpb24gc2hvdWxkIG5vdCBiZSByZXR1cm5lZCBmcm9tIHdvcmtmbG93cyB0byBjbGllbnRzXG4gICAgU3RlcEZ1bmN0aW9uOiAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAnU3RlcCBmdW5jdGlvbnMgY2Fubm90IGJlIGRlc2VyaWFsaXplZCBpbiBjbGllbnQgY29udGV4dC4gU3RlcCBmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSByZXR1cm5lZCBmcm9tIHdvcmtmbG93cy4nLFxuICAgICAgICB7XG4gICAgICAgICAgaGludDogJ0Egc3RlcCBmdW5jdGlvbiByZWZlcmVuY2UgcmVhY2hlZCB0aGUgY2xpZW50LiBSZXR1cm4gYSBzZXJpYWxpemFibGUgdmFsdWUgKGUuZy4gdGhlIHN0ZXAgcmVzdWx0KSBpbnN0ZWFkIG9mIHRoZSBzdGVwIGl0c2VsZi4nLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG5cbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ICYgeyBkdXBsZXg/OiBzdHJpbmcgfSA9IHtcbiAgICAgICAgbWV0aG9kOiB2YWx1ZS5tZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBnbG9iYWwuSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgZHVwbGV4OiB2YWx1ZS5kdXBsZXgsXG4gICAgICB9O1xuICAgICAgaWYgKHZhbHVlLnNpZ25hbCkgaW5pdC5zaWduYWwgPSB2YWx1ZS5zaWduYWw7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IGdsb2JhbC5SZXF1ZXN0KHZhbHVlLnVybCwgaW5pdCk7XG4gICAgICAvLyBUaGUgUmVxdWVzdCBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGludGVybmFsIHNpZ25hbCBjb3B5LCBzbyB0aGVcbiAgICAgIC8vIGFib3J0LWludGVybmFsIHN5bWJvbHMgc2V0IGJ5IHJldml2ZUFib3J0U2lnbmFsIGRvbid0IHByb3BhZ2F0ZS5cbiAgICAgIC8vIFJlLXRhZyB0aGUgcmVxdWVzdCdzIG93biBzaWduYWwgc28gY2FuY2VsQWJvcnRSZWFkZXJzIGNhbiBmaW5kIGl0LlxuICAgICAgaWYgKHZhbHVlLnNpZ25hbCkgY29weUFib3J0SW50ZXJuYWxzKHZhbHVlLnNpZ25hbCwgcmVxdWVzdC5zaWduYWwpO1xuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBOb3RlOiBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgc3RhdHVzLCBzdGF0dXNUZXh0LCBhbmQgaGVhZGVyc1xuICAgICAgLy8gVGhlIHR5cGUsIHVybCwgYW5kIHJlZGlyZWN0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGFuZCBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yXG4gICAgICByZXR1cm4gbmV3IGdsb2JhbC5SZXNwb25zZSh2YWx1ZS5ib2R5LCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIElmIHRoaXMgaGFzIGJvZHlJbml0LCBpdCBjYW1lIGZyb20gYSBSZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgLy8gQ29udmVydCBpdCB0byBhIFJFQUwgc3RyZWFtIG5vdyB0aGF0IHdlJ3JlIG91dHNpZGUgdGhlIHdvcmtmbG93XG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5SW5pdCA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBjb252ZXJ0IEJvZHlJbml0IHRvIFJlYWRhYmxlU3RyZWFtXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IGdsb2JhbC5SZXNwb25zZShib2R5SW5pdCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUudHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICAvLyBGb3IgYnl0ZSBzdHJlYW1zLCB1c2UgZmx1c2hhYmxlIHBpcGUgd2l0aCBsb2NrIHBvbGxpbmcuXG4gICAgICAgIC8vIElmIHRoZSBwcm9kdWNlciB3cm90ZSBmcmFtZWQgYnl0ZXMgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSxcbiAgICAgICAgLy8gdW53cmFwIHRoZSBsZW5ndGgtcHJlZml4IGVudmVsb3BlIGJlZm9yZSBoYW5kaW5nIGNodW5rcyB0b1xuICAgICAgICAvLyB0aGUgdXNlci4gQWJzZW50IC8gJ3JhdycgZnJhbWluZyBtZWFucyBsZWdhY3kgcmF3IGJ5dGVzOlxuICAgICAgICAvLyBwaXBlIHRocm91Z2ggdW5jaGFuZ2VkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm8gYXV0by1yZWNvbm5lY3QgaGVyZSB5ZXQ6IHJhdyBieXRlIHN0cmVhbXMgaGF2ZSBubyB3aXJlXG4gICAgICAgIC8vIGZyYW1pbmcgdG8gY291bnQgY29uc3VtZWQgY2h1bmtzIHdpdGguIEZyYW1lZC12MSBieXRlIHN0cmVhbXNcbiAgICAgICAgLy8gbWFrZSBmcmFtZSBjb3VudGluZyBwb3NzaWJsZSwgc28gZXh0ZW5kaW5nIHRoZSByZWNvbm5lY3RpbmdcbiAgICAgICAgLy8gcmVhZGVyIHRvIHRoZW0gaXMgYSBzZXBhcmF0ZSBmb2xsb3ctdXAuXG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0oXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdmFsdWUubmFtZSxcbiAgICAgICAgICB2YWx1ZS5zdGFydEluZGV4XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlkZW50aXR5IChvciB1bmZyYW1pbmcpIHRyYW5zZm9ybSB0byBnaXZlIHRoZSB1c2VyIGEgcmVhZGFibGVcbiAgICAgICAgY29uc3QgeyByZWFkYWJsZTogdXNlclJlYWRhYmxlLCB3cml0YWJsZSB9ID1cbiAgICAgICAgICB2YWx1ZS5mcmFtaW5nID09PSAnZnJhbWVkLXYxJ1xuICAgICAgICAgICAgPyBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKClcbiAgICAgICAgICAgIDogbmV3IGdsb2JhbC5UcmFuc2Zvcm1TdHJlYW0oKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgd3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh1c2VyUmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdXNlclJlYWRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9uLWJ5dGUgc3RyZWFtcyBjYXJyeSBsZW5ndGgtcHJlZml4ZWQgZnJhbWVzLCBzbyB3ZSBjYW4gY291bnRcbiAgICAgICAgLy8gY29tcGxldGVkIGZyYW1lcyBhbmQgdHJhbnNwYXJlbnRseSByZWNvbm5lY3Qgd2hlbiB0aGUgc2VydmVyXG4gICAgICAgIC8vIHN0cmVhbSBjb25uZWN0aW9uIHRpbWVzIG91dCBtaWQtcnVuLlxuICAgICAgICBjb25zdCByZWFkYWJsZSA9IGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHZhbHVlLnN0YXJ0SW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGNyeXB0b0tleSksXG4gICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIGZsdXNoYWJsZVBpcGUocmVhZGFibGUsIHRyYW5zZm9ybS53cml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgICBwb2xsUmVhZGFibGVMb2NrKHRyYW5zZm9ybS5yZWFkYWJsZSwgc3RhdGUpO1xuXG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0ucmVhZGFibGU7XG4gICAgICB9XG4gICAgfSxcbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBTYW1lIGhhbmRsaW5nIGFzIGBnZXRTdGVwUmV2aXZlcnMuV3JpdGFibGVTdHJlYW1gOiBzZWUgY29tbWVudHNcbiAgICAgIC8vIHRoZXJlIGZvciB0aGUgY3Jvc3MtcnVuIGNhc2UgKHdyaXRhYmxlIGNhcnJpZXMgYHJ1bklkYCBmcm9tXG4gICAgICAvLyBwYXJlbnQg4oaSIGNoaWxkIGZvcndhcmRpbmcgdmlhIGBzdGFydCgpYCkuXG4gICAgICBjb25zdCB0YXJnZXRSdW5JZCA9IHR5cGVvZiB2YWx1ZS5ydW5JZCA9PT0gJ3N0cmluZycgPyB2YWx1ZS5ydW5JZCA6IHJ1bklkO1xuICAgICAgY29uc3QgdGFyZ2V0S2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0gPVxuICAgICAgICB0YXJnZXRSdW5JZCA9PT0gcnVuSWRcbiAgICAgICAgICA/IGNyeXB0b0tleVxuICAgICAgICAgIDogZ2V0Rm9yd2FyZGVkV3JpdGFibGVFbmNyeXB0aW9uS2V5KFxuICAgICAgICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgICAgICAgdmFsdWUuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICB2YWx1ZS5lbmNyeXB0aW9uUHVibGljS2V5XG4gICAgICAgICAgICApO1xuXG4gICAgICBjb25zdCBzZXJpYWxpemUgPSBnZXRTZXJpYWxpemVTdHJlYW0oXG4gICAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHRhcmdldFJ1bklkLCB0YXJnZXRLZXkpLFxuICAgICAgICB0YXJnZXRLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXJ2ZXJXcml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgdmFsdWUubmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIGZsdXNoYWJsZSBzdGF0ZSBmb3IgdGhpcyBzdHJlYW1cbiAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgcG9sbFdyaXRhYmxlTG9jayhzZXJpYWxpemUud3JpdGFibGUsIHN0YXRlKTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX05BTUVfU1lNQk9MLCB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZS5uYW1lLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCwge1xuICAgICAgICB2YWx1ZTogdGFyZ2V0UnVuSWQsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5kZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEtlZXAgdGhlIG93bmVyJ3MgcHVibGljIGtleSBvbiB0aGUgaGFuZGxlIHNvIGEgZnVydGhlciBmb3J3YXJkIHN0YXlzIG9uXG4gICAgICAvLyB0aGUgemVyby1sb29rdXAgc2VhbGVkIHBhdGguXG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXJpYWxpemUud3JpdGFibGU7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiByZXZpdmVBYm9ydENvbnRyb2xsZXIodmFsdWUsIG9wcywgcnVuSWQpLFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHJldml2ZUFib3J0U2lnbmFsKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCByZWNlaXZpbmcgYXJndW1lbnRzIGZyb20gdGhlIGNsaWVudCBzaWRlLCBhbmQgcmV0dXJuIHZhbHVlc1xuICogZnJvbSB0aGUgc3RlcHMuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93UmV2aXZlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuICAgIC8vIFN0ZXBGdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0IC0gdXNlcyB0aGUgbW9kdWxhciByZXZpdmVyXG4gICAgLy8gd2hpY2ggY2FsbHMgV09SS0ZMT1dfVVNFX1NURVAgZnJvbSBnbG9iYWwgdG8gcmVjb25zdHJ1Y3Qgc3RlcCBwcm94aWVzXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmV2aXZlcihnbG9iYWwpLFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVxdWVzdC5wcm90b3R5cGUpO1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBpZiAocmVzcG9uc2VXcml0YWJsZSkge1xuICAgICAgICAodmFsdWUgYXMgYW55KVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICAgIGRlbGV0ZSB2YWx1ZS5yZXNwb25zZVdyaXRhYmxlO1xuICAgICAgICAodmFsdWUgYXMgYW55KS5yZXNwb25kV2l0aCA9ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ2ByZXNwb25kV2l0aCgpYCBtdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIHN0ZXAgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ01vdmUgdGhlIGByZXNwb25kV2l0aCguLi4pYCBjYWxsIGluc2lkZSBhIGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9uIOKAlCBpdCBjYW5ub3QgYmUgaW52b2tlZCBmcm9tIGEgd29ya2Zsb3cgY29udGV4dC4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICAvLyBXb3JrZmxvdyBmdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0OiByZXR1cm5zIGEgZnVuY3Rpb24tbGlrZVxuICAgIC8vIG9iamVjdCB3aXRoIC53b3JrZmxvd0lkIHRoYXQgbWltaWNzIHdoYXQgdGhlIFNXQyBjb21waWxlciBwcm9kdWNlcyxcbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVzcG9uc2UucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBCb2R5SW5pdCB0aGF0IHNob3VsZCBiZSB3cmFwcGVkIGluIGEgZmFrZSBzdHJlYW1cbiAgICAgIGlmICgnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIFJlY3JlYXRlIHRoZSBmYWtlIHN0cmVhbSB3aXRoIHRoZSBCb2R5SW5pdFxuICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuYm9keUluaXQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ3VsYXIgc3RyZWFtIGhhbmRsaW5nXG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBbU1RSRUFNX1RZUEVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gQ2FycnkgdGhlIHdpcmUtZnJhbWluZyBkZWNpc2lvbiB0aHJvdWdoIHRoZSB3b3JrZmxvdyBWTSBzb1xuICAgICAgICAvLyB0aGF0IHdoZW4gdGhlIGhhbmRsZSBpcyBsYXRlciBwYXNzZWQgdG8gYSBzdGVwICh3aGljaCByZWFkc1xuICAgICAgICAvLyB0aGUgYWN0dWFsIGJ5dGVzIGZyb20gdGhlIHNlcnZlcikgd2Uga25vdyB3aGV0aGVyIHRvIHVuZnJhbWUuXG4gICAgICAgIC8vIERlZmF1bHRzIHRvIHVuZGVmaW5lZCBmb3Igc3RyZWFtcyB3aG9zZSBzZXJpYWxpemVkIHJlZiBkaWRuJ3RcbiAgICAgICAgLy8gY2FycnkgdGhlIGZpZWxkOyB0aG9zZSBhcmUgdHJlYXRlZCBhcyBsZWdhY3kgcmF3IGJ5dGVzLlxuICAgICAgICBbU1RSRUFNX0ZSQU1JTkdfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5mcmFtaW5nLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yTWFwID0ge1xuICAgICAgICBbU1RSRUFNX05BTUVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgZm9yZWlnbiBydW5JZCwgaWYgcHJlc2VudCwgc28gdGhhdCB3aGVuIHRoZVxuICAgICAgLy8gaGFuZGxlIGlzIGxhdGVyIHBhc3NlZCB0byBhIHN0ZXAgdGhlIHdvcmtmbG93IHJlZHVjZXIgY2FuXG4gICAgICAvLyBmb3J3YXJkIGl0IHRocm91Z2ggdG8gdGhlIHN0ZXAgcmV2aXZlci5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXSA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUucnVuSWQsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5kZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgb3duZXIncyBwdWJsaWMga2V5IGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIHJ1bklkXG4gICAgICAvLyBhYm92ZS4gV2l0aG91dCBpdCwgZm9yd2FyZGluZyBhIHdyaXRhYmxlIHRocm91Z2ggYSB3b3JrZmxvdyB0byBhIHN0ZXBcbiAgICAgIC8vIHNpbGVudGx5IGRyb3BzIHRoZSBrZXksIGFuZCB0aGUgc3RlcCBmYWxscyBiYWNrIHRvIGZldGNoaW5nIHRoZVxuICAgICAgLy8gb3duZXIncyBzeW1tZXRyaWMga2V5LCB0aGUgcm91bmQgdHJpcCBzZWFsaW5nIGV4aXN0cyB0byByZW1vdmUuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXksXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2xvYmFsLldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwgZGVzY3JpcHRvcik7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZXZpdmVkIGluc2lkZSB0aGUgd29ya2Zsb3cgVk0uIFVzZSB0aGVcbiAgICAvLyByZWFsIFdvcmtmbG93QWJvcnRTaWduYWwgY2xhc3Mgc28gYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmbikgYWN0dWFsbHlcbiAgICAvLyBmaXJlcyB3aGVuIHRoZSBzaWduYWwgYWJvcnRzICh0aGUgcHJldmlvdXMgbm8tb3Agc3R1YiBzaWxlbnRseSBkcm9wcGVkXG4gICAgLy8gbGlzdGVuZXIgcmVnaXN0cmF0aW9ucywgYSBzaWxlbnQgY29ycmVjdG5lc3MgYnVnIGZvciBuYXR1cmFsIHBhdHRlcm5zXG4gICAgLy8gbGlrZSBgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZm4pYCBhZnRlciByZWNlaXZpbmcgYSBkZXNlcmlhbGl6ZWRcbiAgICAvLyBzaWduYWwpLiBUaGUgc2lnbmFsIGRvZXMgbm90IG93biBhIGhvb2sgc3Vic2NyaXB0aW9uIGhlcmU7IGFib3J0IHN0YXRlXG4gICAgLy8gaXMgZGVsaXZlcmVkIHZpYSB0aGUgZXhpc3RpbmcgcmVwbGF5IG1hY2hpbmVyeSBvbiB0aGUgc291cmNlIHNpZGUuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHZhbHVlLnN0cmVhbU5hbWUsIHZhbHVlLmhvb2tUb2tlbik7XG4gICAgICBpZiAodmFsdWUuYWJvcnRlZCkgc2lnbmFsLl9zZXRBYm9ydGVkKHZhbHVlLnJlYXNvbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbQUJPUlRfU1RSRUFNX05BTUVdOiB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgICBbQUJPUlRfSE9PS19UT0tFTl06IHZhbHVlLmhvb2tUb2tlbixcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgICB9O1xuICAgIH0sXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwodmFsdWUuc3RyZWFtTmFtZSwgdmFsdWUuaG9va1Rva2VuKTtcbiAgICAgIGlmICh2YWx1ZS5hYm9ydGVkKSBzaWduYWwuX3NldEFib3J0ZWQodmFsdWUucmVhc29uKTtcbiAgICAgIHJldHVybiBzaWduYWw7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHJlY2VpdmluZyBhcmd1bWVudHMgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldFN0ZXBSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHJldml2ZXIgZm9yIHN0ZXAgY29udGV4dCAtIHJldHVybnMgcmF3IHN0ZXAgZnVuY3Rpb25cbiAgICAvLyB3aXRoIGNsb3N1cmUgdmFyaWFibGUgc3VwcG9ydCB2aWEgQXN5bmNMb2NhbFN0b3JhZ2UuXG4gICAgLy9cbiAgICAvLyBIYW5kbGVzIGZvdXIgaW5kZXBlbmRlbnQgZmxhZ3MgZnJvbSB0aGUgc2VyaWFsaXplZCBwYXlsb2FkOlxuICAgIC8vICAgLSBgY2xvc3VyZVZhcnNgOiBpbnZva2UgdGhlIGJvZHkgaW5zaWRlIGFuIEFzeW5jTG9jYWxTdG9yYWdlIGZyYW1lXG4gICAgLy8gICAgIHNvIHRoZSBTV0MtZW1pdHRlZCBgV09SS0ZMT1dfU1RFUF9DT05URVhUX1NUT1JBR0VgIElJRkUgaW4gdGhlXG4gICAgLy8gICAgIGhvaXN0ZWQgYm9keSBjYW4gcHVsbCB0aGUgY2xvc3VyZSB2YXJpYWJsZXMgYmFjayBvdXQuXG4gICAgLy8gICAtIGBib3VuZFRoaXNgOiAgIGEgYHRoaXNgIHZhbHVlIGNhcHR1cmVkIGJ5XG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzKWAgaW4gdGhlIHdvcmtmbG93IGJ1bmRsZSAobGV4aWNhbC1gdGhpc2BcbiAgICAvLyAgICAgYXJyb3cgc3RlcHMpLiBUaGUgd3JhcHBlciBpbnZva2VzIHRoZSBib2R5IHZpYVxuICAgIC8vICAgICBgc3RlcEZuLmFwcGx5KGJvdW5kVGhpcywgYXJncylgIHNvIHRoZSBib2R5IHNlZXMgdGhlIHNhbWVcbiAgICAvLyAgICAgYHRoaXNgIGl0IHdvdWxkIGhhdmUgaGFkIGluIHRoZSB3b3JrZmxvdyBidW5kbGUuIFByb3BlcnR5XG4gICAgLy8gICAgIHByZXNlbmNlLCBub3QgdHJ1dGhpbmVzcywgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZVxuICAgIC8vICAgICBgYmluZChudWxsKWAgYW5kIGBiaW5kKHVuZGVmaW5lZClgIGFyZSBib3RoIGxlZ2FsIGFuZCBzaG91bGRcbiAgICAvLyAgICAgcm91bmQtdHJpcCBmYWl0aGZ1bGx5LlxuICAgIC8vICAgLSBgYm91bmRBcmdzYDogICBwcmVmaWxsZWQgYXJncyBmcm9tXG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzQXJnLCB4LCB5KWAuIFByZXBlbmRlZCB0byB0aGUgY2FsbCBhcmdzXG4gICAgLy8gICAgIHNvIHBhcnRpYWwgYXBwbGljYXRpb24gc3Vydml2ZXMgc2VyaWFsaXphdGlvbi5cbiAgICBTdGVwRnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc3RlcElkID0gdmFsdWUuc3RlcElkO1xuICAgICAgY29uc3QgY2xvc3VyZVZhcnMgPSB2YWx1ZS5jbG9zdXJlVmFycztcbiAgICAgIGNvbnN0IGhhc0JvdW5kVGhpcyA9ICdib3VuZFRoaXMnIGluIHZhbHVlO1xuICAgICAgY29uc3QgYm91bmRUaGlzID0gaGFzQm91bmRUaGlzID8gdmFsdWUuYm91bmRUaGlzIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgYm91bmRBcmdzID0gQXJyYXkuaXNBcnJheSh2YWx1ZS5ib3VuZEFyZ3MpID8gdmFsdWUuYm91bmRBcmdzIDogW107XG5cbiAgICAgIGNvbnN0IHN0ZXBGbiA9IGdldFN0ZXBGdW5jdGlvbihzdGVwSWQpO1xuICAgICAgaWYgKCFzdGVwRm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICBgU3RlcCBmdW5jdGlvbiBcIiR7c3RlcElkfVwiIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHRoZSBzdGVwIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnTWFrZSBzdXJlIHRoZSBzdGVwIGZpbGUgaXMgaW5jbHVkZWQgaW4geW91ciBidWlsZCAoaS5lLiBpdCBpcyBsaXN0ZWQgaW4gdGhlIHdvcmtmbG93IG1hbmlmZXN0KSwgYW5kIHRoYXQgdGhlIFNXQyBwbHVnaW4gaXMgY29uZmlndXJlZCBmb3IgdGhlIGZpbGUuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogbm90aGluZyB0byB3cmFwLlxuICAgICAgaWYgKCFjbG9zdXJlVmFycyAmJiAhaGFzQm91bmRUaGlzICYmIGJvdW5kQXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3JhcHBlZFN0ZXBGbiA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBjYWxsVGhpcyA9IGhhc0JvdW5kVGhpcyA/IGJvdW5kVGhpcyA6IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhbGxBcmdzID0gYm91bmRBcmdzLmxlbmd0aCA+IDAgPyBbLi4uYm91bmRBcmdzLCAuLi5hcmdzXSA6IGFyZ3M7XG4gICAgICAgIGlmIChjbG9zdXJlVmFycykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICAgICAgICBpZiAoIWN1cnJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICdDYW5ub3QgY2FsbCBzdGVwIGZ1bmN0aW9uIHdpdGggY2xvc3VyZSB2YXJpYWJsZXMgb3V0c2lkZSBzdGVwIGNvbnRleHQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdDb250ZXh0ID0ge1xuICAgICAgICAgICAgLi4uY3VycmVudENvbnRleHQsXG4gICAgICAgICAgICBjbG9zdXJlVmFycyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBjb250ZXh0U3RvcmFnZS5ydW4obmV3Q29udGV4dCwgKCkgPT5cbiAgICAgICAgICAgIHN0ZXBGbi5hcHBseShjYWxsVGhpcywgY2FsbEFyZ3MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RlcEZuLmFwcGx5KGNhbGxUaGlzLCBjYWxsQXJncyk7XG4gICAgICB9IGFzIGFueTtcblxuICAgICAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gb3JpZ2luYWwgc3RlcCBmdW5jdGlvblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWRTdGVwRm4sICduYW1lJywge1xuICAgICAgICB2YWx1ZTogc3RlcEZuLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkU3RlcEZuLCAnc3RlcElkJywge1xuICAgICAgICB2YWx1ZTogc3RlcElkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAoc3RlcEZuLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3cmFwcGVkU3RlcEZuLm1heFJldHJpZXMgPSBzdGVwRm4ubWF4UmV0cmllcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdyYXBwZWRTdGVwRm47XG4gICAgfSxcblxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcblxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCAmIHsgZHVwbGV4Pzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGluaXQuc2lnbmFsID0gdmFsdWUuc2lnbmFsO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBnbG9iYWwuUmVxdWVzdCh2YWx1ZS51cmwsIGluaXQpO1xuICAgICAgLy8gVGhlIFJlcXVlc3QgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnRlcm5hbCBzaWduYWwgY29weSwgc28gdGhlXG4gICAgICAvLyBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIHNldCBieSByZXZpdmVBYm9ydFNpZ25hbCBkb24ndCBwcm9wYWdhdGUuXG4gICAgICAvLyBSZS10YWcgdGhlIHJlcXVlc3QncyBvd24gc2lnbmFsIHNvIGNhbmNlbEFib3J0UmVhZGVycyBjYW4gZmluZCBpdC5cbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGNvcHlBYm9ydEludGVybmFscyh2YWx1ZS5zaWduYWwsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGggPSBhc3luYyAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd3JpdGVyID0gcmVzcG9uc2VXcml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVzcG9uc2UpO1xuICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBOb3RlOiBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgc3RhdHVzLCBzdGF0dXNUZXh0LCBhbmQgaGVhZGVyc1xuICAgICAgLy8gVGhlIHR5cGUsIHVybCwgYW5kIHJlZGlyZWN0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGFuZCBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yXG4gICAgICByZXR1cm4gbmV3IGdsb2JhbC5SZXNwb25zZSh2YWx1ZS5ib2R5LCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIElmIHRoaXMgaGFzIGJvZHlJbml0LCBpdCBjYW1lIGZyb20gYSBSZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgLy8gQ29udmVydCBpdCB0byBhIFJFQUwgc3RyZWFtIG5vdyB0aGF0IHdlJ3JlIGluIHRoZSBzdGVwIGVudmlyb25tZW50XG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5SW5pdCA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBjb252ZXJ0IEJvZHlJbml0IHRvIFJlYWRhYmxlU3RyZWFtXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IGdsb2JhbC5SZXNwb25zZShib2R5SW5pdCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIC8vIEZvciBieXRlIHN0cmVhbXMsIHVzZSBmbHVzaGFibGUgcGlwZSB3aXRoIGxvY2sgcG9sbGluZy5cbiAgICAgICAgLy8gSWYgdGhlIHByb2R1Y2VyIHdyb3RlIGZyYW1lZCBieXRlcyAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpLFxuICAgICAgICAvLyB1bndyYXAgdGhlIGxlbmd0aC1wcmVmaXggZW52ZWxvcGUgYmVmb3JlIGhhbmRpbmcgY2h1bmtzIHRvXG4gICAgICAgIC8vIHRoZSB1c2VyIHN0ZXAuIEFic2VudCAvICdyYXcnIGZyYW1pbmcgbWVhbnMgbGVnYWN5IHJhdyBieXRlczpcbiAgICAgICAgLy8gcGlwZSB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlkZW50aXR5IChvciB1bmZyYW1pbmcpIHRyYW5zZm9ybSB0byBnaXZlIHRoZSB1c2VyIGEgcmVhZGFibGVcbiAgICAgICAgY29uc3QgeyByZWFkYWJsZTogdXNlclJlYWRhYmxlLCB3cml0YWJsZSB9ID1cbiAgICAgICAgICB2YWx1ZS5mcmFtaW5nID09PSAnZnJhbWVkLXYxJ1xuICAgICAgICAgICAgPyBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKClcbiAgICAgICAgICAgIDogbmV3IGdsb2JhbC5UcmFuc2Zvcm1TdHJlYW0oKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgd3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh1c2VyUmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdXNlclJlYWRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5LCBkZXBsb3ltZW50SWQpLFxuICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB0cmFuc2Zvcm0ud3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh0cmFuc2Zvcm0ucmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgICAgfVxuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2FtZS1ydW4gY2FzZTogdGhlIHdyaXRhYmxlIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcnVuLiBVc2UgdGhlXG4gICAgICAvLyBsb2NhbCBjcnlwdG9LZXkgYW5kIHdyaXRlIHRvIHRoZSBsb2NhbCBydW5JZCdzIHNlcnZlciBzdHJlYW0uXG4gICAgICAvL1xuICAgICAgLy8gQ3Jvc3MtcnVuIGNhc2UgKHBhcmVudCDihpIgY2hpbGQgdmlhIGBzdGFydCgpYCk6IHRoZSBkZXNjcmlwdG9yXG4gICAgICAvLyBjYXJyaWVzIHRoZSBvcmlnaW5hbCBgcnVuSWRgIGFuZCBgbmFtZWAuIE9wZW4gYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZSBUSEFUIHJ1bidzIGtleVxuICAgICAgLy8gZm9yIGVuY3J5cHRpb24uIFRoZSByZXNvbHV0aW9uIGlzIGFzeW5jIGJ1dCBkb2Vzbid0IG5lZWQgdG9cbiAgICAgIC8vIGJsb2NrIHJldml2ZXIgcmV0dXJuOiBgZ2V0U2VyaWFsaXplU3RyZWFtYCBhY2NlcHRzIHRoZVxuICAgICAgLy8gYFByb21pc2U8Q3J5cHRvS2V5IHwgdW5kZWZpbmVkPmAgZGlyZWN0bHkgYW5kIGF3YWl0cyBpdCBsYXppbHlcbiAgICAgIC8vIG9uIHRoZSBmaXJzdCBjaHVuayB3cml0dGVuLiBUaGUga2V5IGlzIGltcG9ydGVkIGVuY3J5cHQtb25seVxuICAgICAgLy8gc28gdGhlIHJlY2VpdmluZyBydW4gY2FuIG5ldmVyIGRlY3J5cHQgYW55dGhpbmcgZWxzZSBvbiB0aGVcbiAgICAgIC8vIG93bmluZyBydW4ncyBzdHJlYW07IGl0IGNhbiBvbmx5IGNvbnRyaWJ1dGUgbmV3IHdyaXRlcy5cbiAgICAgIGNvbnN0IHRhcmdldFJ1bklkID0gdHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJyA/IHZhbHVlLnJ1bklkIDogcnVuSWQ7XG4gICAgICBjb25zdCB0YXJnZXREZXBsb3ltZW50SWQgPVxuICAgICAgICB0eXBlb2YgdmFsdWUuZGVwbG95bWVudElkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gdmFsdWUuZGVwbG95bWVudElkXG4gICAgICAgICAgOiB0YXJnZXRSdW5JZCA9PT0gcnVuSWRcbiAgICAgICAgICAgID8gZGVwbG95bWVudElkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRhcmdldEtleTogRW5jcnlwdGlvbktleVBhcmFtID1cbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgPyBjcnlwdG9LZXlcbiAgICAgICAgICA6IGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgdGFyZ2V0UnVuSWQsXG4gICAgICAgICAgICAgIHRhcmdldERlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleVxuICAgICAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplID0gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICBnZXRTdGVwUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHRhcmdldFJ1bklkLCB0YXJnZXRLZXkpLFxuICAgICAgICB0YXJnZXRLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXJ2ZXJXcml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgdmFsdWUubmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIGZsdXNoYWJsZSBzdGF0ZSBmb3IgdGhpcyBzdHJlYW1cbiAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgcG9sbFdyaXRhYmxlTG9jayhzZXJpYWxpemUud3JpdGFibGUsIHN0YXRlKTtcblxuICAgICAgLy8gUmVjb3JkIHRoZSB1bmRlcmx5aW5nIGAocnVuSWQsIG5hbWUpYCBzbyBkb3duc3RyZWFtIHJlZHVjZXJzIGNhblxuICAgICAgLy8gcmVjb2duaXplIHRoYXQgdGhpcyB3cml0YWJsZSBpcyBhbHJlYWR5IGJhY2tlZCBieSBhIHdvcmtmbG93XG4gICAgICAvLyBzZXJ2ZXIgc3RyZWFtLiBXaGVuIGZvcndhcmRlZCBhY3Jvc3MgYHN0YXJ0KClgIGFnYWluIChlLmcuXG4gICAgICAvLyB0aGUgY2hpbGQgcGFzc2VzIHRoaXMgd3JpdGFibGUgb24gdG8gYSBncmFuZGNoaWxkKSwgdGhlXG4gICAgICAvLyBleHRlcm5hbCByZWR1Y2VyIG5lZWRzIGJvdGggdG8gZW1pdCB0aGUgb3JpZ2luYWwgYHJ1bklkYCBpblxuICAgICAgLy8gdGhlIGRlc2NyaXB0b3IuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fTkFNRV9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MLCB7XG4gICAgICAgIHZhbHVlOiB0YXJnZXRSdW5JZCxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAodGFyZ2V0RGVwbG95bWVudElkKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdGFyZ2V0RGVwbG95bWVudElkLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEtlZXAgdGhlIG93bmVyJ3MgcHVibGljIGtleSBvbiB0aGUgaGFuZGxlIHNvIGEgZnVydGhlciBmb3J3YXJkIHN0YXlzIG9uXG4gICAgICAvLyB0aGUgemVyby1sb29rdXAgc2VhbGVkIHBhdGguXG4gICAgICAvL1xuICAgICAgLy8gV2hlbiB0aGUgZGVzY3JpcHRvciBjYXJyaWVzIG5vIGtleSBhbmQgdGhlIHN0cmVhbSBiZWxvbmdzIHRvIFRISVMgcnVuLFxuICAgICAgLy8gZGVyaXZlIGl0LiBBIHdyaXRhYmxlIHRha2VuIHdpdGggYGdldFdyaXRhYmxlKClgIGluIGEgd29ya2Zsb3cgYm9keSBoYXNcbiAgICAgIC8vIG9ubHkgYSBuYW1lIG9uIGl0ICh0aGUgd29ya2Zsb3cgVk0gaG9sZHMgbm8ga2V5IG1hdGVyaWFsIGJ5IGRlc2lnbiksXG4gICAgICAvLyBzbyBub3RoaW5nIGNvdWxkIHB1Ymxpc2ggdGhlIGtleSB3aGVuIHRoZSBoYW5kbGUgd2FzIGNyZWF0ZWQuIFJldml2aW5nXG4gICAgICAvLyBoYXBwZW5zIGluIGEgc3RlcCwgd2hpY2ggZG9lcyBob2xkIHRoaXMgcnVuJ3Mga2V5LCBhbmQgYW55IGxhdGVyXG4gICAgICAvLyBmb3J3YXJkIHRoZW4gY29waWVzIHRoZSBzeW1ib2wuXG4gICAgICAvL1xuICAgICAgLy8gSXQgaGFzIHRvIGhhcHBlbiBoZXJlIHJhdGhlciB0aGFuIGF0IHNlcmlhbGl6YXRpb24gdGltZTogYHN0YXJ0KClgXG4gICAgICAvLyBkZWh5ZHJhdGVzIGl0cyBhcmd1bWVudHMgd2l0aCB0aGUgQ0hJTEQncyBydW5JZCBhbmQgdGhlIENISUxEJ3Mga2V5LCBzb1xuICAgICAgLy8gdGhlIG93bmluZyBydW4ncyBrZXkgaXMgbm8gbG9uZ2VyIGluIHNjb3BlIGJ5IHRoZW4uXG4gICAgICAvL1xuICAgICAgLy8gYHRhcmdldFJ1bklkID09PSBydW5JZGAgaXMgdGhlIGd1YXJkIHRoYXQgbWF0dGVycy4gRm9yIGEgc3RyZWFtIGFub3RoZXJcbiAgICAgIC8vIHJ1biBvd25zIHdlIG11c3Qgbm90IGFkdmVydGlzZSBvdXIga2V5OiB0aGUgcmVjZWl2ZXIgd291bGQgc2VhbCB0byB1c1xuICAgICAgLy8gYW5kIHRoZSByZWFsIG93bmVyIGNvdWxkIG5ldmVyIG9wZW4gd2hhdCBpdCB3cm90ZS5cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgIT09ICdzdHJpbmcnICYmXG4gICAgICAgIHRhcmdldFJ1bklkID09PSBydW5JZCAmJlxuICAgICAgICBpc1J1blBheWxvYWRLZXlzKGNyeXB0b0tleSlcbiAgICAgICkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgc2VyaWFsaXplLndyaXRhYmxlLFxuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfUFVCTElDX0tFWV9TWU1CT0wsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IGJ5dGVzVG9CYXNlNjQoY3J5cHRvS2V5LmtleVBhaXIucHVibGljS2V5KSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuZW5jcnlwdGlvblB1YmxpY0tleSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXJpYWxpemUud3JpdGFibGU7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiByZXZpdmVBYm9ydENvbnRyb2xsZXIodmFsdWUsIG9wcywgcnVuSWQpLFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHJldml2ZUFib3J0U2lnbmFsKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRW5jcnlwdGlvbiBIZWxwZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUaGVzZSBkZWxlZ2F0ZSB0byB0aGUgbW9kdWxhciBgZW5jcnlwdGAvYGRlY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYFxuLy8gYnV0IGFyZSBrZXB0IGFzIG5hbWVkIGV4cG9ydHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29uc3VtZXJzLlxuXG4vKipcbiAqIEVuY3J5cHQgZGF0YSBpZiB0aGUgd29ybGQgc3VwcG9ydHMgZW5jcnlwdGlvbi5cbiAqIFJldHVybnMgb3JpZ2luYWwgZGF0YSBpZiBlbmNyeXB0aW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBlbmNyeXB0YCBmcm9tIGAuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qc2AgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1heWJlRW5jcnlwdChcbiAgZGF0YTogVWludDhBcnJheSxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIChhd2FpdCBlbmNyeXB0KGRhdGEsIGtleSkpIGFzIFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogRGVjcnlwdCBkYXRhIGlmIGl0IGhhcyB0aGUgJ2VuY3InIHByZWZpeC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGRlY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF5YmVEZWNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIHJldHVybiBkZWNyeXB0KGRhdGEsIGtleSk7XG59XG5cbi8qKlxuICogUmVwbGF5IGh5ZHJhdGlvbiBoYXMgdHdvIHN0YWdlczpcbiAqXG4gKiAxLiBIb3N0LXNpZGUgcHJlcGFyYXRpb24gZGVjcnlwdHMgYW5kIGRlY29tcHJlc3NlcyBwZXJzaXN0ZWQgZGF0YS4gVGhhdCB3b3JrXG4gKiAgICBpcyBpbmRlcGVuZGVudCBvZiBhIHdvcmtmbG93IFZNIGFuZCBjYW4gYmUgY2FjaGVkIGFjcm9zcyByZXBsYXkgVk1zLlxuICogMi4gRGVzZXJpYWxpemF0aW9uIHJldml2ZXMgdGhlIHByZXBhcmVkIHJlcHJlc2VudGF0aW9uIGFnYWluc3QgdGhlIGN1cnJlbnRcbiAqICAgIFZNJ3MgZ2xvYmFscy4gSXQgbXVzdCBydW4gYWdhaW4gZm9yIGV2ZXJ5IFZNIHRvIHByb2R1Y2UgZnJlc2ggb2JqZWN0IGdyYXBoc1xuICogICAgYW5kIGNvcnJlY3RseSBzY29wZWQgV29ya2Zsb3cgb2JqZWN0cy5cbiAqXG4gKiBgZGF0YWAgaXMgdGhlIGJvdW5kYXJ5IGJldHdlZW4gdGhvc2Ugc3RhZ2VzLiBGb3IgY3VycmVudC1mb3JtYXQgcGF5bG9hZHMgaXRcbiAqIGlzIHN0aWxsIGZvcm1hdC1wcmVmaXhlZCBzZXJpYWxpemVkIGJ5dGVzLCBub3QgYSBsaXZlIEphdmFTY3JpcHQgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZWRSZXBsYXlQYXlsb2FkIHtcbiAgcmVhZG9ubHkgZGF0YTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBTd2FwcGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGhvc3Qtc2lkZSBwcmVwYXJhdGlvbiBzdGFnZS4gU3VwcG9ydGluZ1xuICogYm90aCBkaXJlY3QgYW5kIHByb21pc2VkIHJlc3VsdHMgbGV0cyBhIGZ1dHVyZSBzeW5jaHJvbm91cyBOb2RlIGRlY3J5cHRvciB1c2VcbiAqIHRoZSBzYW1lIGNhY2hlIGNvbnRyYWN0IGFzIHRvZGF5J3MgYXN5bmNocm9ub3VzIFdlYiBDcnlwdG8gaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFJlcGxheVBheWxvYWRQcmVwYXJlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZFxuKSA9PiBQcmVwYXJlZFJlcGxheVBheWxvYWQgfCBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD47XG5cbi8qKlxuICogRGVjcnlwdCBhbmQgZGVjb21wcmVzcyBwZXJzaXN0ZWQgZGF0YSB3aXRob3V0IHBhcnNpbmcgaXQgaW50byBKYXZhU2NyaXB0LlxuICogTGVnYWN5IG5vbi1iaW5hcnkgdmFsdWVzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgZm9yIHRoZWlyIGNvbnN1bWVyIHRvIHJldml2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHByZXBhcmVSZXBsYXlQYXlsb2FkOiBSZXBsYXlQYXlsb2FkUHJlcGFyZXIgPSBhc3luYyAoXG4gIHZhbHVlLFxuICBrZXlcbikgPT4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IHByZXBhcmVkID0gYXdhaXQgZGVjb21wcmVzcyhcbiAgICBhd2FpdCBkZWNyeXB0KHZhbHVlLCBrZXkpLFxuICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgKTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiB7IGRhdGE6IHByZXBhcmVkIH07XG59O1xuXG4vKipcbiAqIFBhcnNlIGEgcHJlcGFyZWQgd29ya2Zsb3cgYXJndW1lbnQgb3Igc3VjY2Vzc2Z1bCBzdGVwL2hvb2sgcGF5bG9hZCB1c2luZyB0aGVcbiAqIGN1cnJlbnQgd29ya2Zsb3cgVk0ncyBnbG9iYWxzIGFuZCByZXZpdmVycy4gRWFjaCBjYWxsIGludGVudGlvbmFsbHkgY3JlYXRlc1xuICogYSBmcmVzaCBvYmplY3QgZ3JhcGggc28gbXV0YXRpb25zIGNhbm5vdCBsZWFrIGFjcm9zcyByZXBsYXkgaXRlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplUHJlcGFyZWRSZXBsYXlQYXlsb2FkKFxuICBwcmVwYXJlZDogUHJlcGFyZWRSZXBsYXlQYXlsb2FkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBhbnkge1xuICByZXR1cm4gd29ya2Zsb3dNb2R1bGUuZGVzZXJpYWxpemUocHJlcGFyZWQuZGF0YSwge1xuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzOiB7XG4gICAgICAuLi5nZXRTdHJlYW1BbmRSZXF1ZXN0UmV2aXZlcnMoZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGFyc2UgYSBwcmVwYXJlZCBzdGVwIGVycm9yIHVzaW5nIHRoZSBjdXJyZW50IHdvcmtmbG93IFZNJ3MgY2xhc3MgcmV2aXZlcnMuXG4gKiBUaGlzIHByZXNlcnZlcyB0aHJvd24tdmFsdWUgaWRlbnRpdHkgd2l0aG91dCBzaGFyaW5nIG9iamVjdHMgYmV0d2VlbiBWTXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVByZXBhcmVkU3RlcEVycm9yKFxuICBwcmVwYXJlZDogUHJlcGFyZWRSZXBsYXlQYXlsb2FkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiB1bmtub3duIHtcbiAgY29uc3QgeyBkYXRhIH0gPSBwcmVwYXJlZDtcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgcmV0dXJuIHVuZmxhdHRlbihkYXRhIGFzIGFueVtdLCB7XG4gICAgICAuLi5nZXRXb3JrZmxvd1Jldml2ZXJzKGdsb2JhbCksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkYXRhKTtcbiAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgY29uc3Qgc3RyID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBheWxvYWQpO1xuICAgIHJldHVybiBwYXJzZShzdHIsIHtcbiAgICAgIC4uLmdldFdvcmtmbG93UmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVoeWRyYXRlIC8gSHlkcmF0ZSBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRoZXNlIGRlbGVnYXRlIHRvIHRoZSBtb2R1bGFyIG1vZGUgbW9kdWxlcyAod29ya2Zsb3csIHN0ZXAsIGNsaWVudCkgcGFzc2luZ1xuLy8gbW9kZS1zcGVjaWZpYyBzdHJlYW0gYW5kIFJlcXVlc3QvUmVzcG9uc2UgcmVkdWNlcnMvcmV2aXZlcnMgYXMgZXh0cmEgb3B0aW9ucy5cbi8vIFRoZSB2MUNvbXBhdCBwYXRoIGlzIGhhbmRsZWQgaW5saW5lIGJlZm9yZSBkZWxlZ2F0aW5nIHRvIHRoZSBtb2R1bGVzLlxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBgc3RhcnQoKWAgZnVuY3Rpb24gdG8gc2VyaWFsaXplIHRoZSB3b3JrZmxvdyBhcmd1bWVudHNcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlIGFuZCB0aGVuIGh5ZHJhdGVkIGZyb21cbiAqIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXJpYWxpemVcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKHJlcXVpcmVkIGZvciBlbmNyeXB0aW9uIGNvbnRleHQpXG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB2MUNvbXBhdCAtIEVuYWJsZSBsZWdhY3kgdjEgY29tcGF0aWJpbGl0eSBtb2RlXG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWRcbiAqICAgYnl0ZSBzdHJlYW1zLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgY2FwYWJpbGl0eTogc2VlXG4gKiAgIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvclxuICogICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXksIGZyYW1lZEJ5dGVTdHJlYW1zKVxuICAgICk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBmcmFtZWRCeXRlU3RyZWFtcylcbiAgICAgICksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IGFyZ3VtZW50cycsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50IHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93XG4gKiBhcmd1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHdvcmtmbG93IGV4ZWN1dGlvbi4gQSBwcmVwYXJlZFxuICogcGF5bG9hZCBza2lwcyBob3N0LXNpZGUgZGVjcnlwdC9kZWNvbXByZXNzIGJ1dCBhbHdheXMgcGVyZm9ybXMgVk0gcmV2aXZhbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBwcmVwYXJlZD86IFByZXBhcmVkUmVwbGF5UGF5bG9hZFxuKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplUHJlcGFyZWRSZXBsYXlQYXlsb2FkKFxuICAgIHByZXBhcmVkID8/IChhd2FpdCBwcmVwYXJlUmVwbGF5UGF5bG9hZCh2YWx1ZSwga2V5KSksXG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnNcbiAgKTtcbn1cblxuLyoqXG4gKiBEZWh5ZHJhdGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlIGZvciBzdG9yYWdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzaW5rIHJlY2VpdmluZyBldmVyeSB3b3JrZmxvdy1jb2RlIGV4ZWN1dGlvbiBzZXJpYWxpemF0aW9uIGNvdWxkXG4gICAqIG5vdCBhdm9pZCwgZm9yIGNhbGxlcnMgdGhhdCBuZWVkIHRoZW0gcHJvZ3JhbW1hdGljYWxseSAoZS5nLiBhXG4gICAqIHJldGFpbmVkLVZNIGdhdGUgZGVjaWRpbmcgd2hldGhlciB0aGUgVk0gaXMgc3RpbGwgcmV1c2FibGUpLiBUaGVcbiAgICogZXhlY3V0aW9ucyBhcmUgZW1pdHRlZCBhcyBzcGFuIGF0dHJpYnV0ZXMgZWl0aGVyIHdheSwgc28gb21pdHRpbmcgdGhpc1xuICAgKiBsb3NlcyBub3RoaW5nIG9ic2VydmFiaWxpdHktd2lzZS4gVGhlIHJldGFpbmVkLVZNIGdhdGUgaW5cbiAgICogcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIudHMgcGFzc2VzIG9uZSBmb3Igc3RlcC1pbnB1dCBkZWh5ZHJhdGlvbi5cbiAgICovXG4gIGd1ZXN0Q29kZVN0YXRzT3V0PzogR3Vlc3RDb2RlU3RhdHNcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKHYxQ29tcGF0KSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBndWVzdENvZGVTdGF0czogR3Vlc3RDb2RlU3RhdHMgPSBndWVzdENvZGVTdGF0c091dCA/PyB7XG4gICAgICBleGVjdXRpb25zOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2R1bGUuc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGV4dHJhUmVkdWNlcnM6IGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzLFxuICAgICAgZ3Vlc3RDb2RlU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIGF3YWl0IHJlY29yZEd1ZXN0Q29kZUV4ZWN1dGlvbnMoZ3Vlc3RDb2RlU3RhdHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IHJldHVybiB2YWx1ZScsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZVxuICogb2YgYSBjb21wbGV0ZWQgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPGFueT4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudE1vZHVsZS5kZXNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgICAgICAgZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSlcbiAgICAgICksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0sXG4gICAgY29tcHJlc3Npb25TdGF0cyxcbiAgfSk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gYSBzdGVwIGlzIGJlaW5nIGNyZWF0ZWQuXG4gKiBEZWh5ZHJhdGVzIHZhbHVlcyBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8qKiBTZWUgYGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWVgLiAqL1xuICBndWVzdENvZGVTdGF0c091dD86IEd1ZXN0Q29kZVN0YXRzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgZ3Vlc3RDb2RlU3RhdHM6IEd1ZXN0Q29kZVN0YXRzID0gZ3Vlc3RDb2RlU3RhdHNPdXQgPz8ge1xuICAgICAgZXhlY3V0aW9uczogW10sXG4gICAgfTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICAgIGd1ZXN0Q29kZVN0YXRzLFxuICAgIH0pO1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICBhd2FpdCByZWNvcmRHdWVzdENvZGVFeGVjdXRpb25zKGd1ZXN0Q29kZVN0YXRzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcignc3RlcCBhcmd1bWVudHMnLCBjYXVzZSk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHN0ZXAgZXhlY3V0b3IgdG8gaHlkcmF0ZSB0aGUgYXJndW1lbnRzIG9mIGEgc3RlcFxuICogZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdGVwIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5kZXNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBkZXBsb3ltZW50SWQpXG4gICAgICApLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gIH0pO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBleGVjdXRvciB3aGVuIGEgc3RlcCBoYXMgY29tcGxldGVkLlxuICogRGVoeWRyYXRlcyB2YWx1ZXMgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gKiBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2VyaWFsaXplXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdjFDb21wYXQgLSBFbmFibGUgbGVnYWN5IHYxIGNvbXBhdGliaWxpdHkgbW9kZVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hldGhlciB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlIHdpcmUtZnJhbWVkXG4gKiAgIGJ5dGUgc3RyZWFtcy4gU2hvdWxkIG1hdGNoIHRoZSB0YXJnZXQgZGVwbG95bWVudCdzIGNhcGFiaWxpdHk6IHNlZVxuICogICBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHMgdG8gYGZhbHNlYCBmb3JcbiAqICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8YW55PltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IG9yZGVyIHRoZSBmaXJzdCBjaHVuayBvZiBhIHJldHVybmVkIHN0cmVhbSBhZnRlclxuICAvLyB0aGUgYmFja2dyb3VuZGVkIGBydW5fc3RhcnRlZGAuIFRocmVhZGVkIGludG8gdGhlIHN0ZXAgcmVkdWNlcnMnIHN0cmVhbVxuICAvLyBzaW5rLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJibyAvIG9uIHRoZSBhd2FpdCBwYXRoLlxuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShcbiAgICAgIHZhbHVlLFxuICAgICAgZ2V0U3RlcFJlZHVjZXJzKFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGtleSxcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2R1bGUuc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGV4dHJhUmVkdWNlcnM6IGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhcbiAgICAgICAgZ2V0U3RlcFJlZHVjZXJzKFxuICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICBvcHMsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICApXG4gICAgICApLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzLFxuICAgIH0pO1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICdzdGVwIHJldHVybiB2YWx1ZScsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHN0ZXAgZXhlY3V0b3Igd2hlbiBhIHN0ZXAgdGhyb3dzLiBEZWh5ZHJhdGVzIHRoZSB0aHJvd25cbiAqIHZhbHVlIGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuXG4gKiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgaW4gYSBgc3RlcF9mYWlsZWRgIG9yIGBzdGVwX3JldHJ5aW5nYCBldmVudC5cbiAqXG4gKiBBbnkgSmF2YVNjcmlwdCB2YWx1ZSBjYW4gYmUgdGhyb3duIChzdHJpbmdzLCBudW1iZXJzLCBvYmplY3RzLCBFcnJvcnMsXG4gKiBFcnJvciBzdWJjbGFzc2VzKSwgc28gdGhlIHNhbWUgc2VyaWFsaXphdGlvbiBwaXBlbGluZSB1c2VkIGZvciBzdGVwXG4gKiBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMgaXMgYXBwbGllZCBoZXJlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB0aHJvd24gdmFsdWUgdG8gc2VyaWFsaXplIChjYW4gYmUgYW55IHR5cGUpXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTxhbnk+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRTdGVwUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpKTtcbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG4gICAgICBwYXlsb2FkXG4gICAgKSBhcyBVaW50OEFycmF5O1xuICAgIC8vIENvbXByZXNzIGJlZm9yZSBlbmNyeXB0aW5nOiBlbmNyeXB0ZWQgYnl0ZXMgZG9uJ3QgY29tcHJlc3MuXG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBjb21wcmVzcyhcbiAgICAgIHNlcmlhbGl6ZWQsXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgICApO1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IChhd2FpdCBtYXliZUVuY3J5cHQoXG4gICAgICBjb21wcmVzc2VkIGFzIFVpbnQ4QXJyYXksXG4gICAgICBrZXlcbiAgICApKSBhcyBVaW50OEFycmF5O1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcignc3RlcCBlcnJvcicsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nIG9mIGFcbiAqIGBzdGVwX2ZhaWxlZGAgb3IgYHN0ZXBfcmV0cnlpbmdgIGV2ZW50LiBIeWRyYXRlcyB0aGUgdGhyb3duIHZhbHVlIGZyb21cbiAqIHRoZSBkYXRhYmFzZSBzbyB0aGUgd29ya2Zsb3cgY2FuIHNlZSB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIEBwYXJhbSBwcmVwYXJlZCAtIE9wdGlvbmFsIGNhY2hlZCBkZWNyeXB0L2RlY29tcHJlc3MgcmVzdWx0XG4gKiBAcmV0dXJucyBUaGUgaHlkcmF0ZWQgdGhyb3duIHZhbHVlLCByZWFkeSB0byByZWplY3QgdGhlIHN0ZXAgcHJvbWlzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVN0ZXBFcnJvcihcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBwcmVwYXJlZD86IFByZXBhcmVkUmVwbGF5UGF5bG9hZFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIHJldHVybiBkZXNlcmlhbGl6ZVByZXBhcmVkU3RlcEVycm9yKFxuICAgIHByZXBhcmVkID8/IChhd2FpdCBwcmVwYXJlUmVwbGF5UGF5bG9hZCh2YWx1ZSwga2V5KSksXG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnNcbiAgKTtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHRoZSB3b3JrZmxvdyBpdHNlbGYgdGhyb3dzLlxuICogRGVoeWRyYXRlcyB0aGUgdGhyb3duIHZhbHVlIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlIGluIGEgYHJ1bl9mYWlsZWRgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB0aHJvd24gdmFsdWUgdG8gc2VyaWFsaXplIChjYW4gYmUgYW55IHR5cGUpXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIHNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlUnVuRXJyb3IoXG4gIHZhbHVlOiB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgcGF5bG9hZFxuICAgICkgYXMgVWludDhBcnJheTtcbiAgICAvLyBDb21wcmVzcyBiZWZvcmUgZW5jcnlwdGluZzogZW5jcnlwdGVkIGJ5dGVzIGRvbid0IGNvbXByZXNzLlxuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgY29tcHJlc3MoXG4gICAgICBzZXJpYWxpemVkLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzXG4gICAgKTtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSAoYXdhaXQgbWF5YmVFbmNyeXB0KFxuICAgICAgY29tcHJlc3NlZCBhcyBVaW50OEFycmF5LFxuICAgICAga2V5XG4gICAgKSkgYXMgVWludDhBcnJheTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIGVuY3J5cHRlZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ3J1biBlcnJvcicsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgY2xpZW50IHNpZGUgKG9yIG9ic2VydmFiaWxpdHkgdG9vbHMpIHRvIGh5ZHJhdGUgdGhlIHJ1blxuICogZXJyb3IgdmFsdWUgb2YgYSBmYWlsZWQgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBvcHMgLSBQcm9taXNlIGFycmF5IGZvciBzdHJlYW0gb3BlcmF0aW9uc1xuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHJldHVybnMgVGhlIGh5ZHJhdGVkIHRocm93biB2YWx1ZSwgcmVhZHkgdG8gYmUgY29uc3VtZWQgYnkgdGhlIGNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVJ1bkVycm9yKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjb21wcmVzcyhcbiAgICBhd2FpdCBkZWNyeXB0KHZhbHVlLCBrZXkpLFxuICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgKTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG5cbiAgaWYgKCEoZGVjcnlwdGVkIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAvLyBTZWUgdGhlIG1hdGNoaW5nIG5vdGUgaW4gYGh5ZHJhdGVTdGVwRXJyb3JgOiB0aGlzIGJyYW5jaCBpcyBmb3JcbiAgICAvLyBkZXZhbHVlIGZsYXR0ZW5lZCBhcnJheXMgZnJvbSBsZWdhY3kgY2FsbGVyczsgY3VycmVudCBTREsgdmVyc2lvbnNcbiAgICAvLyBhbHdheXMgZW1pdCBhIFVpbnQ4QXJyYXksIGFuZCBhIG1pc3NoYXBlbiB2YWx1ZSBoZXJlIGludGVudGlvbmFsbHlcbiAgICAvLyB0aHJvd3MgdmlhIGB1bmZsYXR0ZW5gIHNvIHRoZSBzdXJyb3VuZGluZyB0cnkvY2F0Y2ggaW4gbzExeSBoZWxwZXJzXG4gICAgLy8gc3VyZmFjZXMgdGhlIGlzc3VlIHJhdGhlciB0aGFuIG1hc2tpbmcgaXQuXG4gICAgcmV0dXJuIHVuZmxhdHRlbihkZWNyeXB0ZWQgYXMgYW55W10sIHtcbiAgICAgIC4uLmdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGVjcnlwdGVkKTtcblxuICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICBjb25zdCBzdHIgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZCk7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwge1xuICAgICAgLi4uZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdDogJHtmb3JtYXR9YCk7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZyBvZiBhIGBzdGVwX2NvbXBsZXRlZGAgZXZlbnQuXG4gKiBIeWRyYXRlcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgc3RlcCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBCaW5hcnkgc2VyaWFsaXplZCBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZGVjcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGRlY3J5cHRpb24pXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3IgZGVzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBleHRyYVJldml2ZXJzIC0gQWRkaXRpb25hbCByZXZpdmVycyBmb3IgY3VzdG9tIHR5cGVzXG4gKiBAcGFyYW0gcHJlcGFyZWQgLSBPcHRpb25hbCBjYWNoZWQgZGVjcnlwdC9kZWNvbXByZXNzIHJlc3VsdFxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZ1xuICogb2YgYSBgc3RlcF9jb21wbGV0ZWRgIGV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBwcmVwYXJlZD86IFByZXBhcmVkUmVwbGF5UGF5bG9hZFxuKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIGRlc2VyaWFsaXplUHJlcGFyZWRSZXBsYXlQYXlsb2FkKFxuICAgIHByZXBhcmVkID8/IChhd2FpdCBwcmVwYXJlUmVwbGF5UGF5bG9hZCh2YWx1ZSwga2V5KSksXG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnNcbiAgKTtcbn1cblxuLy8gLS0tLSBIZWxwZXJzIHRvIGV4dHJhY3Qgc3RyZWFtL1JlcXVlc3QvUmVzcG9uc2UgcmVkdWNlcnMgYW5kIHJldml2ZXJzIC0tLS1cbi8vIFRoZSBtb2RlLXNwZWNpZmljIGdldCpSZWR1Y2Vycy9nZXQqUmV2aXZlcnMgZnVuY3Rpb25zIHJldHVybiBvYmplY3RzIHRoYXRcbi8vIGluY2x1ZGUgYm90aCBcImNvbW1vblwiIGVudHJpZXMgKERhdGUsIEVycm9yLCBNYXAsIGV0Yy4pIGFuZCBtb2RlLXNwZWNpZmljXG4vLyBlbnRyaWVzIChSZWFkYWJsZVN0cmVhbSwgV3JpdGFibGVTdHJlYW0sIFJlcXVlc3QsIFJlc3BvbnNlLCBTdGVwRnVuY3Rpb24pLlxuLy8gVGhlIGNvbW1vbiBlbnRyaWVzIGFyZSBhbHJlYWR5IGNvbXBvc2VkIGJ5IHRoZSBjb2RlYy4gV2Ugb25seSBuZWVkIHRvXG4vLyBwYXNzIHRocm91Z2ggdGhlIG1vZGUtc3BlY2lmaWMgZW50cmllcyBhcyBleHRyYVJlZHVjZXJzL2V4dHJhUmV2aXZlcnMuXG5cbmNvbnN0IFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTID0gW1xuICAnUmVhZGFibGVTdHJlYW0nLFxuICAnV3JpdGFibGVTdHJlYW0nLFxuICAnUmVxdWVzdCcsXG4gICdSZXNwb25zZScsXG4gICdTdGVwRnVuY3Rpb24nLFxuICAvLyBXaXJlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCB0aHJvdWdoIHRoZSBjbGllbnQgc2VyaWFsaXphdGlvbiBwYXRoIHNvXG4gIC8vIHNpZ25hbHMgcmVhY2hhYmxlIHZpYSBSZXF1ZXN0LnNpZ25hbCAob3IgYXMgZGlyZWN0IGFyZ3VtZW50cykgZ2V0IHRoZWlyXG4gIC8vIGRlZGljYXRlZCByZWR1Y2VyLiBXaXRob3V0IHRoaXMsIGRldmFsdWUgZmFsbHMgYmFjayB0byBpdHMgYXJiaXRyYXJ5LVBPSk9cbiAgLy8gcGF0aCBhbmQgZmFpbHMgZm9yIGFueSBzaWduYWwgdGhlIFJlcXVlc3QgcmVkdWNlciBmb3J3YXJkcy5cbiAgJ0Fib3J0Q29udHJvbGxlcicsXG4gICdBYm9ydFNpZ25hbCcsXG5dIGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gIGFsbFJlZHVjZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiB7XG4gIGNvbnN0IGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBTVFJFQU1fQU5EX1JFUVVFU1RfS0VZUykge1xuICAgIGlmIChrZXkgaW4gYWxsUmVkdWNlcnMpIHtcbiAgICAgIGV4dHJhW2tleV0gPSBhbGxSZWR1Y2Vyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG5cbmZ1bmN0aW9uIGdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgYWxsUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+IHtcbiAgY29uc3QgZXh0cmE6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTKSB7XG4gICAgaWYgKGtleSBpbiBhbGxSZXZpdmVycykge1xuICAgICAgZXh0cmFba2V5XSA9IGFsbFJldml2ZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRyYTtcbn1cbiJdfQ==
|