footprintjs 9.45.0 → 9.46.0
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/CLAUDE.md +9 -9
- package/dist/esm/lib/memory/RecordFrame.d.ts +197 -0
- package/dist/esm/lib/memory/RecordFrame.js +265 -0
- package/dist/esm/lib/memory/SharedMemory.d.ts +1 -1
- package/dist/esm/lib/memory/SharedMemory.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +52 -143
- package/dist/esm/lib/memory/StageContext.js +106 -223
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +2 -2
- package/dist/esm/lib/memory/TransactionBuffer.js +3 -3
- package/dist/esm/lib/memory/utils.d.ts +2 -2
- package/dist/esm/lib/memory/utils.js +3 -3
- package/dist/esm/lib/reactive/structuralWrite.d.ts +1 -1
- package/dist/esm/lib/reactive/structuralWrite.js +2 -2
- package/dist/lib/memory/RecordFrame.js +269 -0
- package/dist/lib/memory/SharedMemory.js +2 -2
- package/dist/lib/memory/StageContext.js +106 -223
- package/dist/lib/memory/TransactionBuffer.js +3 -3
- package/dist/lib/memory/utils.js +3 -3
- package/dist/lib/reactive/structuralWrite.js +2 -2
- package/dist/types/lib/memory/RecordFrame.d.ts +197 -0
- package/dist/types/lib/memory/SharedMemory.d.ts +1 -1
- package/dist/types/lib/memory/StageContext.d.ts +52 -143
- package/dist/types/lib/memory/TransactionBuffer.d.ts +2 -2
- package/dist/types/lib/memory/utils.d.ts +2 -2
- package/dist/types/lib/reactive/structuralWrite.d.ts +1 -1
- package/package.json +1 -1
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
* StageContext — Execution context for a single stage in a flowchart run
|
|
4
4
|
*
|
|
5
5
|
* Like a stack frame in a compiler/runtime:
|
|
6
|
-
* -
|
|
7
|
-
*
|
|
6
|
+
* - A RecordFrame — the record half (C3): the heap, the address, the
|
|
7
|
+
* first-touch base, the lazy transaction buffer, the readKeys list
|
|
8
8
|
* - Links to parent/child/next contexts (call stack frames)
|
|
9
|
+
* - What belongs to a stage inside a run: retention of reads and writes, the
|
|
10
|
+
* redaction verdict per write, the dev-mode warnings, the commit observer
|
|
9
11
|
* - DiagnosticCollector for logs, errors, metrics
|
|
10
12
|
*/
|
|
11
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -14,12 +16,10 @@ const summarize_js_1 = require("../capture/summarize.js");
|
|
|
14
16
|
const devMode_js_1 = require("../devMode.js");
|
|
15
17
|
const borrowedMutation_js_1 = require("./borrowedMutation.js");
|
|
16
18
|
const DiagnosticCollector_js_1 = require("./DiagnosticCollector.js");
|
|
17
|
-
const pathOps_js_1 = require("./pathOps.js");
|
|
18
19
|
const placeholders_js_1 = require("./placeholders.js");
|
|
19
|
-
const
|
|
20
|
+
const RecordFrame_js_1 = require("./RecordFrame.js");
|
|
20
21
|
const redaction_js_1 = require("./redaction.js");
|
|
21
22
|
const runPolicy_js_1 = require("./runPolicy.js");
|
|
22
|
-
const TransactionBuffer_js_1 = require("./TransactionBuffer.js");
|
|
23
23
|
/** The user-level key of a write or read — dotted only for a nested path (a
|
|
24
24
|
* subflow seed's `['profile'] + 'auth'`); no allocation for the common
|
|
25
25
|
* single-segment case. */
|
|
@@ -29,25 +29,28 @@ function userKeyOf(path, key) {
|
|
|
29
29
|
/**
|
|
30
30
|
* The key run namespaces sit under — a frame with run id `c0` (a fork or
|
|
31
31
|
* selector child takes its own id at the top level) writes at `runs/c0/…`. The
|
|
32
|
-
* engine's one spelling of it: every frame's address is built from it
|
|
33
|
-
* record layer takes that address as data (C2).
|
|
32
|
+
* engine's one spelling of it: every frame's address is built from it
|
|
33
|
+
* ({@link runAddress}), and the record layer takes that address as data (C2).
|
|
34
34
|
*/
|
|
35
35
|
const RUN_NAMESPACE = 'runs';
|
|
36
|
+
/** The root's address, shared by every frame without a run id (most of them). Never edited. */
|
|
37
|
+
const ROOT_ADDRESS = Object.freeze([]);
|
|
38
|
+
/** Where a frame with run id `runId` reads and writes: `['runs', <id>]`, or `[]` (the root) with none. */
|
|
39
|
+
function runAddress(runId) {
|
|
40
|
+
return runId ? [RUN_NAMESPACE, runId] : ROOT_ADDRESS;
|
|
41
|
+
}
|
|
36
42
|
class StageContext {
|
|
37
|
-
sharedMemory;
|
|
38
43
|
/**
|
|
39
|
-
*
|
|
40
|
-
* the
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* — consumers share the redacted view externally without leaking raw PII
|
|
48
|
-
* through `sharedState`.
|
|
44
|
+
* The record half of this frame (`RecordFrame.ts`, L3, C3): the heap and,
|
|
45
|
+
* when the run keeps them, the redacted mirror and the log; the address;
|
|
46
|
+
* the first-touch base; the lazy transaction buffer; the readKeys list.
|
|
47
|
+
* Every state read of this frame goes through it, and so does every
|
|
48
|
+
* commit. The mirror is present **only** when the run's policy keeps a
|
|
49
|
+
* redacted view (a `RedactionPolicy` is configured) — read via
|
|
50
|
+
* `FlowChartExecutor.getSnapshot({ redact: true })`, the foundation for
|
|
51
|
+
* sharing a trace without leaking raw PII through `sharedState`.
|
|
49
52
|
*/
|
|
50
|
-
|
|
53
|
+
record;
|
|
51
54
|
/**
|
|
52
55
|
* The run's policy — the four dials, the redaction rule, the mirror flag
|
|
53
56
|
* (`runPolicy.ts`, F5). Held BY REFERENCE: one frozen object per run (and
|
|
@@ -57,15 +60,6 @@ class StageContext {
|
|
|
57
60
|
* ({@link usePolicy}). Never edited; a change is a new object.
|
|
58
61
|
*/
|
|
59
62
|
policy = runPolicy_js_1.DEFAULT_RUN_POLICY;
|
|
60
|
-
buffer;
|
|
61
|
-
/**
|
|
62
|
-
* Committed-state view captured at this stage's FIRST touch (first read OR
|
|
63
|
-
* first write) — held by REFERENCE, never cloned. See
|
|
64
|
-
* {@link firstTouchState} for the algorithm and the immutability invariant
|
|
65
|
-
* that makes a bare reference safe.
|
|
66
|
-
*/
|
|
67
|
-
stateView;
|
|
68
|
-
eventLog;
|
|
69
63
|
/** The emitting frame's logical leg, never the mutable executor's current leg. */
|
|
70
64
|
emitRunId;
|
|
71
65
|
stageName = '';
|
|
@@ -82,6 +76,12 @@ class StageContext {
|
|
|
82
76
|
* none — the same once-per-execution law `_untrackedSources` keeps.
|
|
83
77
|
*/
|
|
84
78
|
tags;
|
|
79
|
+
/**
|
|
80
|
+
* The run this frame belongs to — its identity on every event, and the run
|
|
81
|
+
* namespace it reads and writes in ({@link runAddress}), read once, when the
|
|
82
|
+
* frame is built (C3). Only {@link useAddressOf} moves the address after
|
|
83
|
+
* that, and only before the first write.
|
|
84
|
+
*/
|
|
85
85
|
runId;
|
|
86
86
|
/**
|
|
87
87
|
* The run namespace this frame writes and reads in when that is not its own
|
|
@@ -145,11 +145,6 @@ class StageContext {
|
|
|
145
145
|
* tier (`ScopeFacade`, one per stage execution), not here.
|
|
146
146
|
*/
|
|
147
147
|
_committed = false;
|
|
148
|
-
/** Lazily-allocated ordered registry of keys tracked-read in THIS stage —
|
|
149
|
-
* the source of the per-write prefix. Only allocated under the
|
|
150
|
-
* `'reads-prefix'` dial; insertion-ordered (a Set) and monotonic, which
|
|
151
|
-
* is what makes "last write's prefix == union" hold in delta mode. */
|
|
152
|
-
_provenanceReads;
|
|
153
148
|
/** Tracked reads of a selected value ({@link selectedReads}). */
|
|
154
149
|
_selectedReads = 0;
|
|
155
150
|
/** Each object this frame read under a selected name → that read's verdict (`stageWrite` hands it on). */
|
|
@@ -170,40 +165,40 @@ class StageContext {
|
|
|
170
165
|
this.runId = runId;
|
|
171
166
|
this.stageName = name;
|
|
172
167
|
this.stageId = stageId;
|
|
173
|
-
this.
|
|
168
|
+
this.record = new RecordFrame_js_1.RecordFrame(sharedMemory, eventLog, runAddress(runId));
|
|
169
|
+
this.record.useEncoding(this.policy);
|
|
174
170
|
this.branchId = branchId;
|
|
175
|
-
this.eventLog = eventLog;
|
|
176
171
|
this.isDecider = !!isDecider;
|
|
177
172
|
this.isFork = false;
|
|
178
173
|
}
|
|
179
174
|
/** Returns the SharedMemory instance (needed by scope layer). */
|
|
180
175
|
getSharedMemory() {
|
|
181
|
-
return this.
|
|
176
|
+
return this.record.state;
|
|
182
177
|
}
|
|
183
178
|
/** @internal Stamped beside runtimeStageId, before scope construction. */
|
|
184
179
|
bindEmitOrigin(runId, drillPath) {
|
|
185
180
|
this.emitRunId = drillPath === undefined ? undefined : runId;
|
|
186
181
|
if (drillPath !== undefined)
|
|
187
|
-
this.
|
|
182
|
+
this.record.log?.bindAddress(runId, drillPath);
|
|
188
183
|
}
|
|
189
184
|
/** Capture from this frame's OWN log. A manual/unaddressable frame stays unknown. */
|
|
190
185
|
captureEmitPosition() {
|
|
191
|
-
return this.emitRunId === undefined ? undefined : this.
|
|
186
|
+
return this.emitRunId === undefined ? undefined : this.record.log?.capturePosition(this.emitRunId);
|
|
192
187
|
}
|
|
193
188
|
/**
|
|
194
189
|
* Install a parallel redacted mirror. Subsequent `commit()` calls apply
|
|
195
190
|
* the already-computed redacted patches — the ones the log records — to
|
|
196
|
-
* this mirror, beside the raw patches on
|
|
191
|
+
* this mirror, beside the raw patches on the heap (`recordCommit`).
|
|
197
192
|
* Child / next contexts inherit the mirror via `createNext` / `createChild`.
|
|
198
193
|
*
|
|
199
194
|
* Called on a runtime's root frame by `ExecutionRuntime` when the run's policy keeps a mirror.
|
|
200
195
|
*/
|
|
201
196
|
useRedactedMirror(mirror) {
|
|
202
|
-
this.
|
|
197
|
+
this.record.useMirror(mirror);
|
|
203
198
|
}
|
|
204
199
|
/** Returns the redacted mirror if installed, else undefined. */
|
|
205
200
|
getRedactedSharedMemory() {
|
|
206
|
-
return this.
|
|
201
|
+
return this.record.mirror;
|
|
207
202
|
}
|
|
208
203
|
/**
|
|
209
204
|
* Install the run's policy (`runPolicy.ts`) on this frame — called on a
|
|
@@ -214,7 +209,7 @@ class StageContext {
|
|
|
214
209
|
* frame after commit under the run's dials too.
|
|
215
210
|
*/
|
|
216
211
|
usePolicy(policy) {
|
|
217
|
-
this.policy
|
|
212
|
+
this.adoptPolicy(policy);
|
|
218
213
|
}
|
|
219
214
|
/** The run's policy this frame retains, encodes and scrubs under. */
|
|
220
215
|
getPolicy() {
|
|
@@ -233,7 +228,7 @@ class StageContext {
|
|
|
233
228
|
*/
|
|
234
229
|
useRedactionRule(rule) {
|
|
235
230
|
if (this.policy.redaction !== rule)
|
|
236
|
-
this.
|
|
231
|
+
this.adoptPolicy((0, runPolicy_js_1.withRedaction)(this.policy, rule));
|
|
237
232
|
}
|
|
238
233
|
/** The installed redaction rule, if any (the facade's lookup). */
|
|
239
234
|
getRedactionRule() {
|
|
@@ -245,8 +240,17 @@ class StageContext {
|
|
|
245
240
|
* {@link createChild} both call it, and it names no dial.
|
|
246
241
|
*/
|
|
247
242
|
inheritRun(from) {
|
|
248
|
-
this.
|
|
249
|
-
this.
|
|
243
|
+
this.adoptPolicy(from.policy);
|
|
244
|
+
this.record.useMirror(from.record.mirror);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* The ONE place this frame's policy changes: the frame holds it, and its
|
|
248
|
+
* record frame encodes under the same reference (`commitValues`,
|
|
249
|
+
* `writeProvenance` — `RecordFrame · useEncoding`), so the two never differ.
|
|
250
|
+
*/
|
|
251
|
+
adoptPolicy(policy) {
|
|
252
|
+
this.policy = policy;
|
|
253
|
+
this.record.useEncoding(policy);
|
|
250
254
|
}
|
|
251
255
|
/**
|
|
252
256
|
* Record a tracked user-level write, policy-gated (#13c-A) — the single
|
|
@@ -368,7 +372,7 @@ class StageContext {
|
|
|
368
372
|
verdict = rule.verdictAt(path, key);
|
|
369
373
|
}
|
|
370
374
|
const whole = verdict.kind === 'whole';
|
|
371
|
-
const buffer = this.getTransactionBuffer();
|
|
375
|
+
const buffer = this.record.getTransactionBuffer();
|
|
372
376
|
if (verb === 'merge')
|
|
373
377
|
buffer.merge(nsPath, value, whole);
|
|
374
378
|
else if (verb === 'delete')
|
|
@@ -387,95 +391,6 @@ class StageContext {
|
|
|
387
391
|
}
|
|
388
392
|
return verdict;
|
|
389
393
|
}
|
|
390
|
-
/**
|
|
391
|
-
* ── The first-touch state view (#13) ────────────────────────────────────
|
|
392
|
-
*
|
|
393
|
-
* WHAT: returns the committed shared state as it was at this stage's FIRST
|
|
394
|
-
* touch (first read or first write), capturing the reference on first call.
|
|
395
|
-
* Serves two consumers: reads before the first write ({@link readState})
|
|
396
|
-
* and the transaction buffer's diff base ({@link getTransactionBuffer}).
|
|
397
|
-
*
|
|
398
|
-
* WHY A BARE REFERENCE IS SAFE — the invariant this rests on: committed
|
|
399
|
-
* state is immutable-after-swap. Every write to `SharedMemory` builds the
|
|
400
|
-
* NEXT generation and swaps it in (copy-on-write, 9.29.0: `applyPatch` via
|
|
401
|
-
* `nextGeneration`, and `setValue`/`updateValue` too) — it copies the root
|
|
402
|
-
* and the containers on each written path, shares the rest, and never
|
|
403
|
-
* edits a container of the generation a stage captured here. Holding the
|
|
404
|
-
* reference therefore gives this stage a stable snapshot at zero cost — no
|
|
405
|
-
* clone, which is the entire point of #13. The transaction buffer's
|
|
406
|
-
* net-change diff base rests on the same guarantee: it IS this view.
|
|
407
|
-
*
|
|
408
|
-
* WHY FIRST TOUCH, not first write: the pre-#13 eager engine cloned the
|
|
409
|
-
* state into the buffer at the stage's first ACCESS, anchoring both its
|
|
410
|
-
* snapshot reads and its commit baseline (the net-change diff base) there.
|
|
411
|
-
* #13's first cut anchored the lazy buffer at first WRITE — observably
|
|
412
|
-
* different when something else commits in the gap between this stage's
|
|
413
|
-
* first read and its first write. That gap is REACHABLE: fork siblings are
|
|
414
|
-
* namespace-isolated for run-scoped keys (each child writes under
|
|
415
|
-
* `runs/<childId>/`), but ROOT-level keys are shared — written via
|
|
416
|
-
* `setGlobal` from consumer scope code and, critically, by
|
|
417
|
-
* `SubflowInputMapper`'s output mapping (`parentContext.setGlobal`), which
|
|
418
|
-
* is exactly what runs when a subflow is a fork branch. A sibling's
|
|
419
|
-
* root-key commit landing in the gap would shift this stage's diff base,
|
|
420
|
-
* making its CommitBundle record a phantom change (or swallow a real one)
|
|
421
|
-
* relative to the eager engine. Anchoring the view at first touch restores
|
|
422
|
-
* the EXACT eager semantics — sequential AND parallel — at zero clone cost.
|
|
423
|
-
*
|
|
424
|
-
* Read visibility is two-tier, matching eager byte-for-byte: keys present
|
|
425
|
-
* in the view at first touch read repeatably from it; keys ABSENT from it
|
|
426
|
-
* fall back to LIVE state (the eager engine's exact fallback — a
|
|
427
|
-
* mid-flight sibling root-key write was always visible to reads, and
|
|
428
|
-
* stays visible; only the DIFF BASE is pinned).
|
|
429
|
-
*/
|
|
430
|
-
firstTouchState() {
|
|
431
|
-
if (!this.stateView) {
|
|
432
|
-
this.stateView = this.sharedMemory.getState();
|
|
433
|
-
}
|
|
434
|
-
return this.stateView;
|
|
435
|
-
}
|
|
436
|
-
/** Lazily creates the transaction buffer on the stage's FIRST WRITE (#13).
|
|
437
|
-
*
|
|
438
|
-
* Reads NEVER construct it: read-your-writes only matters once a staged
|
|
439
|
-
* write exists, so before that {@link getValue}/{@link getValueDirect}
|
|
440
|
-
* serve from the first-touch state view and {@link commit} records an
|
|
441
|
-
* empty bundle — all with ZERO `structuredClone`s of the shared state.
|
|
442
|
-
*
|
|
443
|
-
* The buffer's base is the FIRST-TOUCH view, NOT the live state at write
|
|
444
|
-
* time: under parallel forks a sibling may have committed between this
|
|
445
|
-
* stage's first read and this write, and the net-change diff base must
|
|
446
|
-
* stay anchored at first touch to match the eager engine — see
|
|
447
|
-
* {@link firstTouchState}. */
|
|
448
|
-
getTransactionBuffer() {
|
|
449
|
-
if (!this.buffer) {
|
|
450
|
-
// Per-write provenance (#P1): hand the buffer a live view of this
|
|
451
|
-
// stage's read prefix — evaluated AT EACH WRITE, so each staged op
|
|
452
|
-
// captures exactly the reads that preceded it (temporal prefix).
|
|
453
|
-
const readKeysProvider = this.policy.writeProvenance === 'reads-prefix' ? () => [...(this._provenanceReads ?? [])] : undefined;
|
|
454
|
-
// The stage's address (9.30.0: the admitted record reads the containers
|
|
455
|
-
// there as where the stage writes, never as a value it read).
|
|
456
|
-
this.buffer = new TransactionBuffer_js_1.TransactionBuffer(this.firstTouchState(), this.policy.commitValues, readKeysProvider, this.address);
|
|
457
|
-
}
|
|
458
|
-
return this.buffer;
|
|
459
|
-
}
|
|
460
|
-
/**
|
|
461
|
-
* Where this frame writes and reads: `['runs', <id>]`, or `[]` (the root) with
|
|
462
|
-
* no run id. Handed to the record layer as data (C2): the buffer's address,
|
|
463
|
-
* and where `SharedMemory · getValue` looks before the root.
|
|
464
|
-
*/
|
|
465
|
-
get address() {
|
|
466
|
-
return this.namespaceId ? [RUN_NAMESPACE, this.namespaceId] : [];
|
|
467
|
-
}
|
|
468
|
-
/** Builds an absolute path inside the shared memory: this frame's {@link address}, then the path. */
|
|
469
|
-
withNamespace(path, key) {
|
|
470
|
-
// Spelled out, not `[...this.address, …]`: every read and write builds one, and the spread
|
|
471
|
-
// allocates the address array per call (+3% on a namespaced frame's read/write loop).
|
|
472
|
-
const id = this.namespaceId;
|
|
473
|
-
return id ? [RUN_NAMESPACE, id, ...path, key] : [...path, key];
|
|
474
|
-
}
|
|
475
|
-
/** The run namespace writes and reads go to: {@link addressRunId}, else `runId`. */
|
|
476
|
-
get namespaceId() {
|
|
477
|
-
return this.addressRunId ?? this.runId;
|
|
478
|
-
}
|
|
479
394
|
/**
|
|
480
395
|
* Write and read at ANOTHER frame's address (its run namespace) while this
|
|
481
396
|
* frame keeps its own identity on the record — `stage`, `stageId`,
|
|
@@ -483,23 +398,30 @@ class StageContext {
|
|
|
483
398
|
* (`SubflowExecutor · executeSubflow`, R13): the mount frame of a branch or
|
|
484
399
|
* fork child lands its values where its parent writes, as before, and its
|
|
485
400
|
* bundle now names the mount instead of the stage before it. Refused once
|
|
486
|
-
* the frame has staged anything — its buffer's address is fixed then.
|
|
401
|
+
* the frame has staged anything — its buffer's address is fixed then. The
|
|
402
|
+
* decision is the engine's (namespace ids, as since R13); the record frame
|
|
403
|
+
* takes the address it comes to (`RecordFrame · useAddress`).
|
|
487
404
|
*/
|
|
488
405
|
useAddressOf(frame) {
|
|
489
|
-
if (this.
|
|
406
|
+
if (this.record.hasStaged && frame.namespaceId !== this.namespaceId) {
|
|
490
407
|
throw new Error(`[footprint] StageContext.useAddressOf: '${this.stageId}' has already staged writes at its own address.`);
|
|
491
408
|
}
|
|
492
409
|
this.addressRunId = frame.namespaceId;
|
|
410
|
+
this.record.useAddress(runAddress(this.namespaceId));
|
|
411
|
+
}
|
|
412
|
+
/** The run namespace writes and reads go to: {@link addressRunId}, else `runId`. */
|
|
413
|
+
get namespaceId() {
|
|
414
|
+
return this.addressRunId ?? this.runId;
|
|
493
415
|
}
|
|
494
416
|
// ── Write operations ───────────────────────────────────────────────────
|
|
495
417
|
patch(path, key, value, shouldRedact = false) {
|
|
496
|
-
return this.stageWrite(this.
|
|
418
|
+
return this.stageWrite(this.record.at(path, key), path, key, value, shouldRedact, 'set');
|
|
497
419
|
}
|
|
498
420
|
set(path, key, value) {
|
|
499
421
|
this.patch(path, key, value);
|
|
500
422
|
}
|
|
501
423
|
merge(path, key, value, shouldRedact) {
|
|
502
|
-
return this.stageWrite(this.
|
|
424
|
+
return this.stageWrite(this.record.at(path, key), path, key, value, shouldRedact, 'merge');
|
|
503
425
|
}
|
|
504
426
|
setObject(path, key, value, shouldRedact, description, operationOverride) {
|
|
505
427
|
// Explicit deletion (ScopeFacade.deleteValue) stages a distinct op so
|
|
@@ -507,8 +429,8 @@ class StageContext {
|
|
|
507
429
|
// Under the default 'full' mode the buffer commits it as a
|
|
508
430
|
// set-of-undefined — byte-identical to the historical flattening.
|
|
509
431
|
const verdict = operationOverride === 'delete'
|
|
510
|
-
? this.stageWrite(this.
|
|
511
|
-
: this.stageWrite(this.
|
|
432
|
+
? this.stageWrite(this.record.at(path, key), path, key, undefined, shouldRedact, 'delete')
|
|
433
|
+
: this.stageWrite(this.record.at(path, key), path, key, value, shouldRedact, 'set');
|
|
512
434
|
// Track user-level write (pre-namespace) for memory view + onCommit —
|
|
513
435
|
// policy-gated (#13c-A), see trackWrite.
|
|
514
436
|
this.trackWrite(userKeyOf(path, key), value, verdict, operationOverride ?? 'set');
|
|
@@ -554,36 +476,6 @@ class StageContext {
|
|
|
554
476
|
this.setObject(path, key, merged, false, description);
|
|
555
477
|
}
|
|
556
478
|
// ── Read operations ────────────────────────────────────────────────────
|
|
557
|
-
/** Buffer-aware read, mirroring the eager engine's read order byte-for-byte:
|
|
558
|
-
*
|
|
559
|
-
* 1. staged writes + first-touch snapshot — `buffer.get` over its
|
|
560
|
-
* workingCopy when the buffer exists, else `nativeGet` over the
|
|
561
|
-
* zero-clone state view (the buffer's base IS that view, so the two
|
|
562
|
-
* tiers agree on content);
|
|
563
|
-
* 2. LIVE state via `sharedMemory.getValue` for keys absent from the
|
|
564
|
-
* snapshot — including its run→global namespace fallback. The eager
|
|
565
|
-
* engine had this exact live fallback for snapshot-missing keys;
|
|
566
|
-
* byte-identity over purity. After the stage's first write such a
|
|
567
|
-
* value can be the very container the buffer's diff base holds at
|
|
568
|
-
* the path (the stage deleted or unset it, or replaced a container
|
|
569
|
-
* above it), so the base is detached there first
|
|
570
|
-
* (`TransactionBuffer · detachBase`): an in-place edit of the value
|
|
571
|
-
* (out of contract) written back is recorded, as on 9.28.0, whose
|
|
572
|
-
* base was a clone taken at the first write.
|
|
573
|
-
*
|
|
574
|
-
* Reads never construct the buffer (#13): a stage that never writes
|
|
575
|
-
* performs zero clones of the shared state. */
|
|
576
|
-
readState(path, key) {
|
|
577
|
-
const namespaced = this.withNamespace(path, key);
|
|
578
|
-
const fromSnapshot = this.buffer ? this.buffer.get(namespaced) : (0, pathOps_js_1.nativeGet)(this.firstTouchState(), namespaced);
|
|
579
|
-
if (typeof fromSnapshot !== 'undefined')
|
|
580
|
-
return fromSnapshot;
|
|
581
|
-
const live = this.sharedMemory.getValue(this.address, path, key);
|
|
582
|
-
// Tier 2 after the first write: keep the diff base exact (see above).
|
|
583
|
-
if (this.buffer && live !== null && typeof live === 'object')
|
|
584
|
-
this.buffer.detachBase(namespaced);
|
|
585
|
-
return live;
|
|
586
|
-
}
|
|
587
479
|
/**
|
|
588
480
|
* Tracked read. The returned value is BORROWED — see the contract on
|
|
589
481
|
* `ScopeFacade.getValue`. Read-tracking cost is policy-gated (#14):
|
|
@@ -591,12 +483,12 @@ class StageContext {
|
|
|
591
483
|
* `'summary'` records a cheap marker, `'off'` records nothing.
|
|
592
484
|
*/
|
|
593
485
|
getValue(path, key, description) {
|
|
594
|
-
|
|
595
|
-
//
|
|
596
|
-
//
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
486
|
+
// The record frame serves the value (two tiers) and keeps the per-write
|
|
487
|
+
// provenance registry (#P1) — key strings only, independent of the
|
|
488
|
+
// readTracking retention dial (which governs VALUE retention below).
|
|
489
|
+
const value = this.record.read(path, key);
|
|
490
|
+
if (key !== undefined)
|
|
491
|
+
this.record.noteRead(path, key);
|
|
600
492
|
// The verdict, once — for the retained read below and the selected-read
|
|
601
493
|
// count (`selectedReads`). No policy and no marks → no verdict call, no
|
|
602
494
|
// allocation (activeRule).
|
|
@@ -615,7 +507,7 @@ class StageContext {
|
|
|
615
507
|
if (path.length > 0)
|
|
616
508
|
(this._nestedReads ??= new Set()).add(userKeyOf(path, key));
|
|
617
509
|
else if (this.policy.readTracking === 'full' && (0, devMode_js_1.isDevMode)()) {
|
|
618
|
-
if (this.
|
|
510
|
+
if (this.record.hasStaged)
|
|
619
511
|
this._viewReads?.delete(key);
|
|
620
512
|
else
|
|
621
513
|
(this._viewReads ??= new Set()).add(key);
|
|
@@ -643,16 +535,16 @@ class StageContext {
|
|
|
643
535
|
/** Read state without tracking in _stageReads or paying structuredClone cost.
|
|
644
536
|
* Used by ScopeFacade.getValueSilent() for array proxy internal operations. */
|
|
645
537
|
getValueDirect(path, key) {
|
|
646
|
-
return this.
|
|
538
|
+
return this.record.read(path, key);
|
|
647
539
|
}
|
|
648
540
|
getRoot(key) {
|
|
649
|
-
return this.
|
|
541
|
+
return this.record.readLive(key);
|
|
650
542
|
}
|
|
651
543
|
getGlobal(key) {
|
|
652
|
-
return this.
|
|
544
|
+
return this.record.readGlobal(key);
|
|
653
545
|
}
|
|
654
546
|
getScope() {
|
|
655
|
-
return this.
|
|
547
|
+
return this.record.state.getState();
|
|
656
548
|
}
|
|
657
549
|
getRunId() {
|
|
658
550
|
return this.runId;
|
|
@@ -695,8 +587,8 @@ class StageContext {
|
|
|
695
587
|
* those are engine reads (the subflow merge-back), not user reads.
|
|
696
588
|
*
|
|
697
589
|
* It also only looks at keys served from the PINNED source — the first-touch
|
|
698
|
-
* view or this stage's own buffer. A key absent from both was served by
|
|
699
|
-
*
|
|
590
|
+
* view or this stage's own buffer. A key absent from both was served by the
|
|
591
|
+
* read's live fallback (`RecordFrame · read`, tier 2), which a parallel sibling's root-key commit can
|
|
700
592
|
* legitimately move; accusing the stage there would be a false alarm. For
|
|
701
593
|
* the same reason it runs on the frame's FIRST commit only: the reads belong
|
|
702
594
|
* to that round, and by the engine's second round (a fork double-commit, a
|
|
@@ -726,15 +618,15 @@ class StageContext {
|
|
|
726
618
|
continue;
|
|
727
619
|
if (rule !== undefined && rule.verdictAt([], key).kind !== 'clear')
|
|
728
620
|
continue;
|
|
729
|
-
const namespaced = this.
|
|
730
|
-
if (Object.prototype.hasOwnProperty.call(this._stageWrites, key) || this.
|
|
621
|
+
const namespaced = this.record.at([], key);
|
|
622
|
+
if (Object.prototype.hasOwnProperty.call(this._stageWrites, key) || this.record.wasStaged(namespaced)) {
|
|
731
623
|
this.warnOnCommittedMutation(key, namespaced, retained);
|
|
732
624
|
continue;
|
|
733
625
|
}
|
|
734
626
|
// The pinned source only — see the note on the live fallback above.
|
|
735
627
|
// `peek`, not `get`: a report compares, and must not take the private
|
|
736
628
|
// copy a stage's read would (copy-on-write, 9.29.0).
|
|
737
|
-
const current = this.
|
|
629
|
+
const current = this.record.peek(namespaced);
|
|
738
630
|
if (current === undefined)
|
|
739
631
|
continue;
|
|
740
632
|
const path = (0, borrowedMutation_js_1.firstDifferingPath)(retained, current);
|
|
@@ -748,7 +640,7 @@ class StageContext {
|
|
|
748
640
|
warnOnCommittedMutation(key, namespaced, retained) {
|
|
749
641
|
if (!this._viewReads?.has(key))
|
|
750
642
|
return;
|
|
751
|
-
const committed =
|
|
643
|
+
const committed = this.record.baseAt(namespaced);
|
|
752
644
|
if (committed === undefined)
|
|
753
645
|
return;
|
|
754
646
|
const path = (0, borrowedMutation_js_1.firstDifferingPath)(retained, committed);
|
|
@@ -769,21 +661,16 @@ class StageContext {
|
|
|
769
661
|
* `outputMapper` (a lazy mount, every `parallelForEach` branch), whose exit
|
|
770
662
|
* is its only bundle, records that bundle as its own, tags and all.
|
|
771
663
|
*
|
|
772
|
-
* Commit is the stage's lifecycle end:
|
|
773
|
-
*
|
|
774
|
-
*
|
|
775
|
-
*
|
|
776
|
-
*
|
|
777
|
-
*
|
|
778
|
-
* O(N²) before copy-on-write (9.29.0), when each generation and each
|
|
779
|
-
* buffer was a whole-state clone: 563.8MB at N=200 on an agent-style
|
|
780
|
-
* chart; a 500-iteration agent OOMed a default Node heap (backlog #18).
|
|
781
|
-
* Generations now share every unchanged subtree, but a pinned one still
|
|
782
|
-
* keeps the containers later commits replaced alive.
|
|
664
|
+
* Commit is the stage's lifecycle end: the record frame's buffer and
|
|
665
|
+
* first-touch base are only needed DURING execution, as the read snapshot +
|
|
666
|
+
* net-change diff base, so the record frame releases them once the commit
|
|
667
|
+
* has landed and the observer has seen it (`RecordFrame · release` — why a
|
|
668
|
+
* frame that kept them would retain one state generation per executed
|
|
669
|
+
* stage, and why a re-used frame re-anchors on current state, is there).
|
|
783
670
|
*
|
|
784
|
-
* RE-USE AFTER COMMIT stays correct because both
|
|
785
|
-
* - a later READ re-anchors
|
|
786
|
-
*
|
|
671
|
+
* RE-USE AFTER COMMIT stays correct because both re-create lazily:
|
|
672
|
+
* - a later READ re-anchors on the CURRENT committed state (which includes
|
|
673
|
+
* this stage's own flushed writes);
|
|
787
674
|
* - a later WRITE constructs a fresh buffer on that re-anchored view, so a
|
|
788
675
|
* second commit diffs against post-first-commit state. The pre-release
|
|
789
676
|
* buffer behaved the same for VALUES (its `workingCopy` was reset on
|
|
@@ -807,16 +694,17 @@ class StageContext {
|
|
|
807
694
|
const continuation = this._committed ? phase : undefined;
|
|
808
695
|
this.materialiseWrites();
|
|
809
696
|
this.warnOnBorrowedMutation();
|
|
810
|
-
// The record's half (`recordCommit.ts`). No buffer
|
|
811
|
-
// one (#13): the commit is empty by construction,
|
|
812
|
-
|
|
697
|
+
// The record's half (`RecordFrame · commit` → `recordCommit.ts`). No buffer
|
|
698
|
+
// = no write ever built one (#13): the commit is empty by construction,
|
|
699
|
+
// recorded with ZERO clones. The names are read once the payload is built.
|
|
700
|
+
this.record.commit(() => ({
|
|
813
701
|
stage: this.stageName,
|
|
814
702
|
stageId: this.stageId,
|
|
815
703
|
runtimeStageId: this.runtimeStageId,
|
|
816
704
|
untrackedSources: this._untrackedSources,
|
|
817
705
|
tags: this.tags,
|
|
818
706
|
phase: continuation,
|
|
819
|
-
}
|
|
707
|
+
}));
|
|
820
708
|
// The observer (ScopeFacade) sees the tracked mutations, THEN the staging
|
|
821
709
|
// state is released (#13b), so it sees the world as it was. D2's markers
|
|
822
710
|
// and the declared tags release with it — one stamp per execution, so the
|
|
@@ -824,8 +712,7 @@ class StageContext {
|
|
|
824
712
|
if (this._commitObserver) {
|
|
825
713
|
this._commitObserver({ ...this._stageWrites });
|
|
826
714
|
}
|
|
827
|
-
this.
|
|
828
|
-
this.stateView = undefined;
|
|
715
|
+
this.record.release();
|
|
829
716
|
this._untrackedSources = undefined;
|
|
830
717
|
this.tags = undefined;
|
|
831
718
|
this._committed = true;
|
|
@@ -841,20 +728,18 @@ class StageContext {
|
|
|
841
728
|
* (M1: the transaction buffer holds writes until `commit()` flushes them).
|
|
842
729
|
*
|
|
843
730
|
* What is released, and why each one matters for the next attempt:
|
|
844
|
-
* -
|
|
845
|
-
* with nothing staged
|
|
846
|
-
*
|
|
847
|
-
*
|
|
848
|
-
*
|
|
731
|
+
* - the record frame's staged state (`RecordFrame · discard`) — the buffer
|
|
732
|
+
* (the next attempt starts with nothing staged), the
|
|
733
|
+
* first-touch base (it re-anchors on committed state as
|
|
734
|
+
* it stands NOW — a sibling fork branch may legitimately
|
|
735
|
+
* have committed in between) and the readKeys list (#P1:
|
|
736
|
+
* a discarded attempt's reads must never reach the next
|
|
737
|
+
* attempt's `TraceEntry.readKeys`);
|
|
849
738
|
* - `_stageWrites` / `_pendingWrites` / `_stageReads` — the snapshot
|
|
850
739
|
* payload; without the reset the execution tree would
|
|
851
740
|
* report writes that were discarded, which is the exact
|
|
852
741
|
* lie this feature exists to prevent (the pending map
|
|
853
742
|
* holds bare references — dropping it un-clones nothing);
|
|
854
|
-
* - `_provenanceReads` — the per-write read prefix (#P1); a discarded
|
|
855
|
-
* attempt's reads must never appear in the next attempt's
|
|
856
|
-
* `TraceEntry.readKeys`, or a backward slice would follow
|
|
857
|
-
* an edge that no committed write ever had;
|
|
858
743
|
* - `_untrackedSources` — the D2 honesty markers, released with the rest.
|
|
859
744
|
*
|
|
860
745
|
* What is deliberately KEPT: `debug` (logs, metrics, errors, flow messages).
|
|
@@ -865,10 +750,8 @@ class StageContext {
|
|
|
865
750
|
* cursor stop, because from shared state's point of view it never happened.
|
|
866
751
|
*/
|
|
867
752
|
discardStaged() {
|
|
868
|
-
this.
|
|
869
|
-
this.stateView = undefined;
|
|
753
|
+
this.record.discard();
|
|
870
754
|
this._untrackedSources = undefined;
|
|
871
|
-
this._provenanceReads = undefined;
|
|
872
755
|
this._pendingWrites = undefined;
|
|
873
756
|
this._stageWrites = {};
|
|
874
757
|
this._stageReads = {};
|
|
@@ -888,7 +771,7 @@ class StageContext {
|
|
|
888
771
|
*/
|
|
889
772
|
createNext(path, stageName, stageId, isDecider = false) {
|
|
890
773
|
if (!this.next) {
|
|
891
|
-
this.next = new StageContext(path, stageName, stageId, this.
|
|
774
|
+
this.next = new StageContext(path, stageName, stageId, this.record.state, '', this.record.log, isDecider);
|
|
892
775
|
this.next.parent = this;
|
|
893
776
|
this.next.inheritRun(this);
|
|
894
777
|
}
|
|
@@ -904,7 +787,7 @@ class StageContext {
|
|
|
904
787
|
if (!this.children) {
|
|
905
788
|
this.children = [];
|
|
906
789
|
}
|
|
907
|
-
const child = new StageContext(runId, stageName, stageId, this.
|
|
790
|
+
const child = new StageContext(runId, stageName, stageId, this.record.state, branchId, this.record.log, isDecider);
|
|
908
791
|
child.parent = this;
|
|
909
792
|
child.inheritRun(this);
|
|
910
793
|
this.children.push(child);
|
|
@@ -1021,4 +904,4 @@ class StageContext {
|
|
|
1021
904
|
}
|
|
1022
905
|
}
|
|
1023
906
|
exports.StageContext = StageContext;
|
|
1024
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRzs7O0FBRUgsMERBQWtGO0FBQ2xGLDhDQUEwQztBQUMxQywrREFBOEc7QUFDOUcscUVBQXVGO0FBR3ZGLDZDQUF5QztBQUN6Qyx1REFBc0Q7QUFDdEQsdURBQWlEO0FBRWpELGlEQUFzRDtBQUV0RCxpREFBbUU7QUFFbkUsaUVBQTJEO0FBVzNEOzsyQkFFMkI7QUFDM0IsU0FBUyxTQUFTLENBQUMsSUFBYyxFQUFFLEdBQVc7SUFDNUMsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFFN0IsTUFBYSxZQUFZO0lBQ2YsWUFBWSxDQUFlO0lBQ25DOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssb0JBQW9CLENBQWdCO0lBQzVDOzs7Ozs7O09BT0c7SUFDSyxNQUFNLEdBQWMsaUNBQWtCLENBQUM7SUFDdkMsTUFBTSxDQUFxQjtJQUNuQzs7Ozs7T0FLRztJQUNLLFNBQVMsQ0FBMkI7SUFDcEMsUUFBUSxDQUFZO0lBQzVCLGtGQUFrRjtJQUMxRSxTQUFTLENBQVU7SUFFcEIsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0Qix1RUFBdUU7SUFDaEUsT0FBTyxDQUFTO0lBQ3ZCLHFGQUFxRjtJQUM5RSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQzNCOzs7Ozs7O09BT0c7SUFDSSxJQUFJLENBQXFCO0lBQ3pCLEtBQUssQ0FBUztJQUNyQjs7Ozs7O09BTUc7SUFDSyxZQUFZLENBQVU7SUFD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RTtZQUNsRSxNQUFNLE1BQU0sR0FBNEIsRUFBRSxDQUFDO1lBQzNDLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzFCLENBQUM7WUFDRCxRQUFRLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNsRCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBcGxDRCxvQ0FvbENDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFnZUNvbnRleHQg4oCUIEV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIHNpbmdsZSBzdGFnZSBpbiBhIGZsb3djaGFydCBydW5cbiAqXG4gKiBMaWtlIGEgc3RhY2sgZnJhbWUgaW4gYSBjb21waWxlci9ydW50aW1lOlxuICogLSBSZWZlcmVuY2UgdG8gU2hhcmVkTWVtb3J5IChhY2Nlc3NpbmcgaGVhcCBtZW1vcnkpXG4gKiAtIFRyYW5zYWN0aW9uQnVmZmVyIGZvciBzdGFnaW5nIG11dGF0aW9ucyAodHJhbnNhY3Rpb24gYnVmZmVyKVxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIERpYWdub3N0aWNDb2xsZWN0b3IgZm9yIGxvZ3MsIGVycm9ycywgbWV0cmljc1xuICovXG5cbmltcG9ydCB7IHN1bW1hcml6ZVJlYWRWYWx1ZSwgc3VtbWFyaXplV3JpdGVWYWx1ZSB9IGZyb20gJy4uL2NhcHR1cmUvc3VtbWFyaXplLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgYm9ycm93ZWRNdXRhdGlvbk1lc3NhZ2UsIGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSwgZmlyc3REaWZmZXJpbmdQYXRoIH0gZnJvbSAnLi9ib3Jyb3dlZE11dGF0aW9uLmpzJztcbmltcG9ydCB7IHR5cGUgRGlhZ25vc3RpY0NoYW5uZWwsIERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuaW1wb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL0V2ZW50TG9nLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFNvdXJjZVBvc2l0aW9uIH0gZnJvbSAnLi9ldmVudFBvc2l0aW9uLmpzJztcbmltcG9ydCB7IG5hdGl2ZUdldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgeyBTQ09QRV9QTEFDRUhPTERFUiB9IGZyb20gJy4vcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB7IHJlY29yZENvbW1pdCB9IGZyb20gJy4vcmVjb3JkQ29tbWl0LmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uVmVyZGljdCB9IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IENMRUFSLCBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1ksIHdpdGhSZWRhY3Rpb24gfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICcuL1NoYXJlZE1lbW9yeS5qcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1ZmZlciB9IGZyb20gJy4vVHJhbnNhY3Rpb25CdWZmZXIuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDb21taXRQaGFzZSxcbiAgRmxvd0NvbnRyb2xUeXBlLFxuICBGbG93TWVzc2FnZSxcbiAgUmVhZFRyYWNraW5nTW9kZSxcbiAgU3RhZ2VTbmFwc2hvdCxcbiAgVW50cmFja2VkU291cmNlLFxuICBXcml0ZVRyYWNraW5nTW9kZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBUaGUgdXNlci1sZXZlbCBrZXkgb2YgYSB3cml0ZSBvciByZWFkIOKAlCBkb3R0ZWQgb25seSBmb3IgYSBuZXN0ZWQgcGF0aCAoYVxuICogIHN1YmZsb3cgc2VlZCdzIGBbJ3Byb2ZpbGUnXSArICdhdXRoJ2ApOyBubyBhbGxvY2F0aW9uIGZvciB0aGUgY29tbW9uXG4gKiAgc2luZ2xlLXNlZ21lbnQgY2FzZS4gKi9cbmZ1bmN0aW9uIHVzZXJLZXlPZihwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5O1xufVxuXG4vKipcbiAqIFRoZSBrZXkgcnVuIG5hbWVzcGFjZXMgc2l0IHVuZGVyIOKAlCBhIGZyYW1lIHdpdGggcnVuIGlkIGBjMGAgKGEgZm9yayBvclxuICogc2VsZWN0b3IgY2hpbGQgdGFrZXMgaXRzIG93biBpZCBhdCB0aGUgdG9wIGxldmVsKSB3cml0ZXMgYXQgYHJ1bnMvYzAv4oCmYC4gVGhlXG4gKiBlbmdpbmUncyBvbmUgc3BlbGxpbmcgb2YgaXQ6IGV2ZXJ5IGZyYW1lJ3MgYWRkcmVzcyBpcyBidWlsdCBmcm9tIGl0LCBhbmQgdGhlXG4gKiByZWNvcmQgbGF5ZXIgdGFrZXMgdGhhdCBhZGRyZXNzIGFzIGRhdGEgKEMyKS5cbiAqL1xuY29uc3QgUlVOX05BTUVTUEFDRSA9ICdydW5zJztcblxuZXhwb3J0IGNsYXNzIFN0YWdlQ29udGV4dCB7XG4gIHByaXZhdGUgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnk7XG4gIC8qKlxuICAgKiBQYXJhbGxlbCByZWRhY3RlZCBtaXJyb3Igb2YgYHNoYXJlZE1lbW9yeWAuIFBvcHVsYXRlZCBpbiBgY29tbWl0KClgIHdpdGhcbiAgICogdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyAodGhlIHNhbWUgb25lcyBmZWQgdG8gYGV2ZW50TG9nYCkuXG4gICAqIFByZXNlbnQgKipvbmx5Kiogd2hlbiB0aGUgZXhlY3V0b3IgaGFzIGJlZW4gdG9sZCB0byBtYWludGFpbiBhIHJlZGFjdGVkXG4gICAqIHZpZXcg4oCUIGkuZS4gd2hlbiBhIGBSZWRhY3Rpb25Qb2xpY3lgIGlzIGNvbmZpZ3VyZWQuIE90aGVyd2lzZSB1bmRlZmluZWQsXG4gICAqIHplcm8gZXh0cmEgd29yayBwZXIgY29tbWl0LlxuICAgKlxuICAgKiBUaGUgbWlycm9yIGlzIHJlYWQgdmlhIGBGbG93Q2hhcnRFeGVjdXRvci5nZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWBcbiAgICogYW5kIGlzIHRoZSBmb3VuZGF0aW9uIGZvciB0aGUgXCJleHBvcnQgdHJhY2VcIiAvIHBhc3RlLWludG8tdmlld2VyIGZlYXR1cmVcbiAgICog4oCUIGNvbnN1bWVycyBzaGFyZSB0aGUgcmVkYWN0ZWQgdmlldyBleHRlcm5hbGx5IHdpdGhvdXQgbGVha2luZyByYXcgUElJXG4gICAqIHRocm91Z2ggYHNoYXJlZFN0YXRlYC5cbiAgICovXG4gIHByaXZhdGUgcmVkYWN0ZWRTaGFyZWRNZW1vcnk/OiBTaGFyZWRNZW1vcnk7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgcG9saWN5IOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWdcbiAgICogKGBydW5Qb2xpY3kudHNgLCBGNSkuIEhlbGQgQlkgUkVGRVJFTkNFOiBvbmUgZnJvemVuIG9iamVjdCBwZXIgcnVuIChhbmRcbiAgICogcGVyIHJlc3VtZSksIHNoYXJlZCBieSBldmVyeSBmcmFtZSBvZiB0aGUgcnVuLCBhIHN1YmZsb3cncyBpbmNsdWRlZCDigJRcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0gcGFzcyB0aGUgcmVmZXJlbmNlXG4gICAqICh7QGxpbmsgaW5oZXJpdFJ1bn0pLCB0aGUgcnVudGltZSBpbnN0YWxscyBpdCBvbiBpdHMgcm9vdFxuICAgKiAoe0BsaW5rIHVzZVBvbGljeX0pLiBOZXZlciBlZGl0ZWQ7IGEgY2hhbmdlIGlzIGEgbmV3IG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1k7XG4gIHByaXZhdGUgYnVmZmVyPzogVHJhbnNhY3Rpb25CdWZmZXI7XG4gIC8qKlxuICAgKiBDb21taXR0ZWQtc3RhdGUgdmlldyBjYXB0dXJlZCBhdCB0aGlzIHN0YWdlJ3MgRklSU1QgdG91Y2ggKGZpcnN0IHJlYWQgT1JcbiAgICogZmlyc3Qgd3JpdGUpIOKAlCBoZWxkIGJ5IFJFRkVSRU5DRSwgbmV2ZXIgY2xvbmVkLiBTZWVcbiAgICoge0BsaW5rIGZpcnN0VG91Y2hTdGF0ZX0gZm9yIHRoZSBhbGdvcml0aG0gYW5kIHRoZSBpbW11dGFiaWxpdHkgaW52YXJpYW50XG4gICAqIHRoYXQgbWFrZXMgYSBiYXJlIHJlZmVyZW5jZSBzYWZlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0ZVZpZXc/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJpdmF0ZSBldmVudExvZz86IEV2ZW50TG9nO1xuICAvKiogVGhlIGVtaXR0aW5nIGZyYW1lJ3MgbG9naWNhbCBsZWcsIG5ldmVyIHRoZSBtdXRhYmxlIGV4ZWN1dG9yJ3MgY3VycmVudCBsZWcuICovXG4gIHByaXZhdGUgZW1pdFJ1bklkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBzdGFnZU5hbWUgPSAnJztcbiAgLyoqIFVuaXF1ZSBzdGFnZSBpZGVudGlmaWVyIGZyb20gdGhlIGJ1aWxkZXIgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gKi9cbiAgcHVibGljIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllci4gU2V0IGJ5IHRyYXZlcnNlciBiZWZvcmUgc3RhZ2UgZXhlY3V0aW9uLiAqL1xuICBwdWJsaWMgcnVudGltZVN0YWdlSWQgPSAnJztcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkgZm9yIHRoZSBzdGFnZSB0aGlzIGNvbnRleHQgaXMgZXhlY3V0aW5nLiBTZXQgYnlcbiAgICogdGhlIHRyYXZlcnNlciBiZXNpZGUgYHJ1bnRpbWVTdGFnZUlkYCAocGVyLW5vZGUgaWRlbnRpdHkg4oCUIE5PVCBpbmhlcml0ZWRcbiAgICogYnkgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYCksIHJlY29yZGVkIG9uIHRoZSBmaXJzdCBidW5kbGVcbiAgICogYGNvbW1pdCgpYCB3cml0ZXMsIHRoZW4gcmVsZWFzZWQgc28gYSByb3V0aW5lIHNlY29uZCBjb21taXQgb24gdGhlIHNhbWVcbiAgICogY29udGV4dCAoYSBmb3JrIGNoaWxkJ3MgZmFuLW91dCByZXBlYXQsIGEgbW91bnQncyBleGl0IGJ1bmRsZSkgY2Fycmllc1xuICAgKiBub25lIOKAlCB0aGUgc2FtZSBvbmNlLXBlci1leGVjdXRpb24gbGF3IGBfdW50cmFja2VkU291cmNlc2Aga2VlcHMuXG4gICAqL1xuICBwdWJsaWMgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICBwdWJsaWMgcnVuSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4gbmFtZXNwYWNlIHRoaXMgZnJhbWUgd3JpdGVzIGFuZCByZWFkcyBpbiB3aGVuIHRoYXQgaXMgbm90IGl0cyBvd25cbiAgICogYHJ1bklkYCDigJQgc2V0IG9uY2UsIGJlZm9yZSB0aGUgZnJhbWUncyBmaXJzdCB3cml0ZSwgYnlcbiAgICoge0BsaW5rIHVzZUFkZHJlc3NPZn0uIEl0cyBvbmUgdXNlciBpcyBhIHN1YmZsb3cgbW91bnQncyBtZXJnZS1iYWNrIChSMTMpOlxuICAgKiB0aGUgcmVjb3JkIG5hbWVzIHRoZSBtb3VudCwgdGhlIHZhbHVlcyBsYW5kIHdoZXJlIHRoZSBtb3VudCdzIHBhcmVudFxuICAgKiB3cml0ZXMuIEFic2VudCDihpIgYHJ1bklkYCwgc28gZXZlcnkgb3RoZXIgZnJhbWUgaXMgdW50b3VjaGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRyZXNzUnVuSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBicmFuY2hJZD86IHN0cmluZztcbiAgcHVibGljIGlzRGVjaWRlcjogYm9vbGVhbjtcbiAgcHVibGljIGlzRm9yazogYm9vbGVhbjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZyb20gYnVpbGRlciAoc2V0IGJ5IHRyYXZlcnNlciBiZWZvcmUgZXhlY3V0aW9uKS4gKi9cbiAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIChzZXQgYnkgdHJhdmVyc2VyIHdoZW4gdGhpcyBpcyBhIHN1YmZsb3cgZW50cnkgcG9pbnQpLiAqL1xuICBwdWJsaWMgc3ViZmxvd0lkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBwYXJlbnQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBuZXh0PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgY2hpbGRyZW4/OiBTdGFnZUNvbnRleHRbXTtcblxuICBwdWJsaWMgZGVidWc6IERpYWdub3N0aWNDb2xsZWN0b3IgPSBuZXcgRGlhZ25vc3RpY0NvbGxlY3RvcigoKSA9PiB0aGlzLnBvbGljeS5yZWRhY3Rpb24pO1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCB3cml0ZXMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcgYW5kIG9uQ29tbWl0XG4gICAqICDigJQgaW4gdGhlaXIgUkVUQUlORUQgZm9ybSAoY2xvbmVkIC8gc3VtbWFyaXNlZCAvIHJlZGFjdGVkKS4gRmlsbGVkIGZyb21cbiAgICogIHtAbGluayBfcGVuZGluZ1dyaXRlc30gYnkge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfSBhdCBjb21taXQuICovXG4gIHByaXZhdGUgX3N0YWdlV3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgd3JpdGVzIG9mIHRoZSBDVVJSRU5UIGV4ZWN1dGlvbiwgaGVsZCBieSByZWZlcmVuY2Ugd2l0aCB0aGUgdmVyZGljdFxuICAgKiB0aGV5IHdlcmUgc3RhZ2VkIHVuZGVyICg5LjIzLjApLiBBIGtleSB3cml0dGVuIGsgdGltZXMgaG9sZHMgaXRzIExBU1RcbiAgICogdmFsdWU7IHRoZSByZXRhaW5lZCBmb3JtICh0aGUgYHdyaXRlVHJhY2tpbmdgIGNsb25lIG9yIHN1bW1hcnksIHRoZVxuICAgKiByZWRhY3Rpb24gcGxhY2Vob2xkZXIgb3IgZmllbGQgc2NydWIpIGlzIHRha2VuIE9OQ0UgcGVyIGtleSBhdCBjb21taXQg4oCUXG4gICAqIHNlZSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LiBTYW1lIGxhdyBhcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3NcbiAgICogcGF0Y2ggdHJlZXM6IHRoZSBjb3B5IHRoZSByZWNvcmQgbmVlZHMgaXMgcGFpZCBhdCB0aGUgYm91bmRhcnksIG5vdCBhdFxuICAgKiBldmVyeSB3cml0ZS4gTGF6aWx5IGFsbG9jYXRlZDsgYSBzdGFnZSB0aGF0IG5ldmVyIHdyaXRlcyBwYXlzIG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF9wZW5kaW5nV3JpdGVzPzogTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IHZhbHVlOiB1bmtub3duOyB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0OyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9XG4gID47XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHJlYWRzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3LiAqL1xuICBwcml2YXRlIF9zdGFnZVJlYWRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgYF9zdGFnZVJlYWRzYCBrZXlzIHRoYXQgd2VyZSByZWFkIGF0IGEgTkVTVEVEIHBhdGggKGBnZXRWYWx1ZShwYXRoLFxuICAgKiBrZXkpYCB3aXRoIGEgbm9uLWVtcHR5IGBwYXRoYCkuIE9ubHkgdGhlIGVuZ2luZSByZWFkcyB0aGF0IHdheSDigJQgdGhlXG4gICAqIGZhY2FkZSByZWFkcyByb290cyDigJQgc28gdGhlc2UgYXJlIG5vdCB1c2VyIHJlYWRzIGFuZCB0aGUgYm9ycm93ZWQtcmVhZFxuICAgKiBndWFyZCBza2lwcyB0aGVtIGJ5IHRoaXMgbWFya2VyLCBuZXZlciBieSBndWVzc2luZyBmcm9tIGEgZG90IGluIHRoZSBrZXlcbiAgICogKGEgdXNlcidzIHRvcC1sZXZlbCBrZXkgbWF5IGl0c2VsZiBjb250YWluIG9uZSkuIExhemlseSBjcmVhdGVkOyB0aGVcbiAgICogZmFjYWRlIHBhdGggbmV2ZXIgYWxsb2NhdGVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfbmVzdGVkUmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogRGV2IG1vZGUgb25seTogdGhlIHJvb3Qga2V5cyB3aG9zZSBMQVNUIHRyYWNrZWQgcmVhZCB3YXMgc2VydmVkIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlIOKAlCBiZWZvcmUgdGhpcyBzdGFnZSdzIGZpcnN0IHdyaXRlLCB3aGVuIG5vIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlciBleGlzdHMgeWV0LiBTdWNoIGEgcmVhZCBpcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIHNvIGFuXG4gICAqIGluLXBsYWNlIGVkaXQgb2YgaXQgbW92ZXMgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSB0b28gKGNvcHktb24td3JpdGUsXG4gICAqIDkuMjkuMCk7IHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufSBjaGVja3MgdGhlc2Uga2V5cyBldmVuIHdoZW4gdGhlXG4gICAqIHN0YWdlIHdyb3RlIHRoZW0uIE5ldmVyIGFsbG9jYXRlZCBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdmlld1JlYWRzPzogU2V0PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhhcyB0aGlzIGZyYW1lIGNvbW1pdHRlZCBhdCBsZWFzdCBvbmNlPyBUaGUgYm9ycm93ZWQtcmVhZCBndWFyZCBydW5zIG9uXG4gICAqIHRoZSBGSVJTVCBjb21taXQgb25seSDigJQgc2VlIHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufS4gVGhlIGZyYW1lXG4gICAqIGl0c2VsZiBzdGF5cyByZS11c2FibGUgYWZ0ZXIgY29tbWl0ICgjMTNiKTogdGhlIGVuZ2luZSdzIGRvdWJsZS1jb21taXRcbiAgICogcGF0aHMgYW5kIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGJyYW5jaCBwYXJlbnQgcmVseSBvbiBpdC4gVGhlXG4gICAqIHVzZXItbGV2ZWwgcmVmdXNhbCBvZiBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGxpdmVzIGF0IHRoZSBzY29wZVxuICAgKiB0aWVyIChgU2NvcGVGYWNhZGVgLCBvbmUgcGVyIHN0YWdlIGV4ZWN1dGlvbiksIG5vdCBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqIExhemlseS1hbGxvY2F0ZWQgb3JkZXJlZCByZWdpc3RyeSBvZiBrZXlzIHRyYWNrZWQtcmVhZCBpbiBUSElTIHN0YWdlIOKAlFxuICAgKiAgdGhlIHNvdXJjZSBvZiB0aGUgcGVyLXdyaXRlIHByZWZpeC4gT25seSBhbGxvY2F0ZWQgdW5kZXIgdGhlXG4gICAqICBgJ3JlYWRzLXByZWZpeCdgIGRpYWw7IGluc2VydGlvbi1vcmRlcmVkIChhIFNldCkgYW5kIG1vbm90b25pYywgd2hpY2hcbiAgICogIGlzIHdoYXQgbWFrZXMgXCJsYXN0IHdyaXRlJ3MgcHJlZml4ID09IHVuaW9uXCIgaG9sZCBpbiBkZWx0YSBtb2RlLiAqL1xuICBwcml2YXRlIF9wcm92ZW5hbmNlUmVhZHM/OiBTZXQ8c3RyaW5nPjtcbiAgLyoqIFRyYWNrZWQgcmVhZHMgb2YgYSBzZWxlY3RlZCB2YWx1ZSAoe0BsaW5rIHNlbGVjdGVkUmVhZHN9KS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSZWFkcyA9IDA7XG4gIC8qKiBFYWNoIG9iamVjdCB0aGlzIGZyYW1lIHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lIOKGkiB0aGF0IHJlYWQncyB2ZXJkaWN0IChgc3RhZ2VXcml0ZWAgaGFuZHMgaXQgb24pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZE9iamVjdHM/OiBXZWFrTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD47XG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDIgaG9uZXN0eSBtYXJrZXJzIOKAlCB1bnRyYWNrZWQgcmVhZCBwYXRocyB1c2VkIGR1cmluZyBUSElTXG4gICAqIHN0YWdlJ3MgZXhlY3V0aW9uIChgJ2FyZ3MnYCAvIGAnZW52J2AgLyBgJ3NpbGVudCdgKS4gTWFya2VkIGJ5XG4gICAqIGBTY29wZUZhY2FkZWAsIHN1cmZhY2VkIG9uIHRoZSBzdGFnZSdzIENvbW1pdEJ1bmRsZSBhc1xuICAgKiBgdW50cmFja2VkU291cmNlc2AsIHRoZW4gUkVMRUFTRUQgd2l0aCB0aGUgc3RhZ2luZyBzdGF0ZSBhdCBjb21taXQgZW5kXG4gICAqIChzbyB0aGUgcm91dGluZSBkb3VibGUtY29tbWl0IHBhdGhzIOKAlCBmb3JrIGNoaWxkcmVuLCBzdWJmbG93IG1vdW50cyDigJRcbiAgICogcmVjb3JkIHRoZSBmaWVsZCBleGFjdGx5IG9uY2UsIG9uIHRoZSBmaXJzdCBjb21taXQpLiBMYXppbHkgYWxsb2NhdGVkOlxuICAgKiBzdGFnZXMgdGhhdCBuZXZlciB0b3VjaCBhbiB1bnRyYWNrZWQgcGF0aCBwYXkgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3VudHJhY2tlZFNvdXJjZXM/OiBTZXQ8VW50cmFja2VkU291cmNlPjtcblxuICAvKiogT2JzZXJ2ZXIgY2FsbGVkIGFmdGVyIGNvbW1pdCgpIOKAlCB1c2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGZpcmUgU2NvcGVSZWNvcmRlci5vbkNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfY29tbWl0T2JzZXJ2ZXI/OiAoXG4gICAgbXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PixcbiAgKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeSxcbiAgICBicmFuY2hJZD86IHN0cmluZyxcbiAgICBldmVudExvZz86IEV2ZW50TG9nLFxuICAgIGlzRGVjaWRlcj86IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLnN0YWdlTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICB0aGlzLnNoYXJlZE1lbW9yeSA9IHNoYXJlZE1lbW9yeTtcbiAgICB0aGlzLmJyYW5jaElkID0gYnJhbmNoSWQ7XG4gICAgdGhpcy5ldmVudExvZyA9IGV2ZW50TG9nO1xuICAgIHRoaXMuaXNEZWNpZGVyID0gISFpc0RlY2lkZXI7XG4gICAgdGhpcy5pc0ZvcmsgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBTaGFyZWRNZW1vcnkgaW5zdGFuY2UgKG5lZWRlZCBieSBzY29wZSBsYXllcikuICovXG4gIGdldFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgU3RhbXBlZCBiZXNpZGUgcnVudGltZVN0YWdlSWQsIGJlZm9yZSBzY29wZSBjb25zdHJ1Y3Rpb24uICovXG4gIGJpbmRFbWl0T3JpZ2luKHJ1bklkOiBzdHJpbmcsIGRyaWxsUGF0aDogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXRSdW5JZCA9IGRyaWxsUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcnVuSWQ7XG4gICAgaWYgKGRyaWxsUGF0aCAhPT0gdW5kZWZpbmVkKSB0aGlzLmV2ZW50TG9nPy5iaW5kQWRkcmVzcyhydW5JZCwgZHJpbGxQYXRoKTtcbiAgfVxuXG4gIC8qKiBDYXB0dXJlIGZyb20gdGhpcyBmcmFtZSdzIE9XTiBsb2cuIEEgbWFudWFsL3VuYWRkcmVzc2FibGUgZnJhbWUgc3RheXMgdW5rbm93bi4gKi9cbiAgY2FwdHVyZUVtaXRQb3NpdGlvbigpOiBFbWl0U291cmNlUG9zaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVtaXRSdW5JZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5ldmVudExvZz8uY2FwdHVyZVBvc2l0aW9uKHRoaXMuZW1pdFJ1bklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGEgcGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yLiBTdWJzZXF1ZW50IGBjb21taXQoKWAgY2FsbHMgYXBwbHlcbiAgICogdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyDigJQgdGhlIG9uZXMgdGhlIGxvZyByZWNvcmRzIOKAlCB0b1xuICAgKiB0aGlzIG1pcnJvciwgYmVzaWRlIHRoZSByYXcgcGF0Y2hlcyBvbiBgc2hhcmVkTWVtb3J5YCAoYHJlY29yZENvbW1pdGApLlxuICAgKiBDaGlsZCAvIG5leHQgY29udGV4dHMgaW5oZXJpdCB0aGUgbWlycm9yIHZpYSBgY3JlYXRlTmV4dGAgLyBgY3JlYXRlQ2hpbGRgLlxuICAgKlxuICAgKiBDYWxsZWQgb24gYSBydW50aW1lJ3Mgcm9vdCBmcmFtZSBieSBgRXhlY3V0aW9uUnVudGltZWAgd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGEgbWlycm9yLlxuICAgKi9cbiAgdXNlUmVkYWN0ZWRNaXJyb3IobWlycm9yOiBTaGFyZWRNZW1vcnkpOiB2b2lkIHtcbiAgICB0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5ID0gbWlycm9yO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHJlZGFjdGVkIG1pcnJvciBpZiBpbnN0YWxsZWQsIGVsc2UgdW5kZWZpbmVkLiAqL1xuICBnZXRSZWRhY3RlZFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgdGhlIHJ1bidzIHBvbGljeSAoYHJ1blBvbGljeS50c2ApIG9uIHRoaXMgZnJhbWUg4oCUIGNhbGxlZCBvbiBhXG4gICAqIHJ1bnRpbWUncyByb290IGJ5IGBFeGVjdXRpb25SdW50aW1lYCAoYXQgY29uc3RydWN0aW9uLCBhbmQgYnlcbiAgICogYEV4ZWN1dGlvblJ1bnRpbWUudXNlUG9saWN5YCBvbiBhIHNhbWUtZXhlY3V0b3IgcmVzdW1lKS4gRGVzY2VuZGFudHMgZ2V0XG4gICAqIHRoZSBzYW1lIHJlZmVyZW5jZSB0aHJvdWdoIHtAbGluayBjcmVhdGVOZXh0fS97QGxpbmsgY3JlYXRlQ2hpbGR9OyBhXG4gICAqIHN1YmZsb3cncyBydW50aW1lIGlzIGNvbnN0cnVjdGVkIHdpdGggaXQsIHNvIGl0cyBzZWVkIGZyYW1lIGFuZCBldmVyeVxuICAgKiBmcmFtZSBhZnRlciBjb21taXQgdW5kZXIgdGhlIHJ1bidzIGRpYWxzIHRvby5cbiAgICovXG4gIHVzZVBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICB9XG5cbiAgLyoqIFRoZSBydW4ncyBwb2xpY3kgdGhpcyBmcmFtZSByZXRhaW5zLCBlbmNvZGVzIGFuZCBzY3J1YnMgdW5kZXIuICovXG4gIGdldFBvbGljeSgpOiBSdW5Qb2xpY3kge1xuICAgIHJldHVybiB0aGlzLnBvbGljeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGEgcmVkYWN0aW9uIHJ1bGUg4oCUIHRoZSBPTkUgb3duZXIgb2YgXCJ3aGF0IGRvZXMgdGhlIHBvbGljeSBzYXlcbiAgICogYWJvdXQgdGhpcyBwYXRoXCIgKGBtZW1vcnkvcmVkYWN0aW9uLnRzYCkg4oCUIGFzIGEgTkVXIHBvbGljeSBmb3IgdGhpcyBmcmFtZVxuICAgKiAodGhlIHNoYXJlZCBvbmUgaXMgbmV2ZXIgZWRpdGVkKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgYXJyaXZlc1xuICAgKiB3aXRoIHRoZSBydW4ncyBwb2xpY3k7IHRoaXMgZG9vciBpcyBmb3IgYSBgU2NvcGVGYWNhZGVgIG9uIGEgYmFyZSBmcmFtZVxuICAgKiAodW5pdCB0ZXN0cywgaGFuZC1idWlsdCBzY29wZXMpLCB3aGljaCBicmluZ3MgaXRzIG93biBydWxlLiBFdmVyeSBzdGFnZWRcbiAgICogd3JpdGUgYW5kIGV2ZXJ5IHRyYWNrZWQgcmVhZCBhc2tzIGl0LCBzbyBhIHdyaXRlIHRoYXQgbmV2ZXIgcGFzc2VzIGFcbiAgICogZmFjYWRlIOKAlCBhIHN1YmZsb3cgc2VlZCwgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2UtYmFjaywgYSByZXN1bWUgcmUtc2VlZCDigJRcbiAgICogaXMgcmV0YWluZWQgdW5kZXIgdGhlIHNhbWUgdmVyZGljdCBhcyBhIGZhY2FkZSB3cml0ZS4gQWJzZW50OiBldmVyeVxuICAgKiB2ZXJkaWN0IGlzIGAnY2xlYXInYCB1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWQgYW4gZXhwbGljaXQgZmxhZy5cbiAgICovXG4gIHVzZVJlZGFjdGlvblJ1bGUocnVsZTogUmVkYWN0aW9uUnVsZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbGljeS5yZWRhY3Rpb24gIT09IHJ1bGUpIHRoaXMucG9saWN5ID0gd2l0aFJlZGFjdGlvbih0aGlzLnBvbGljeSwgcnVsZSk7XG4gIH1cblxuICAvKiogVGhlIGluc3RhbGxlZCByZWRhY3Rpb24gcnVsZSwgaWYgYW55ICh0aGUgZmFjYWRlJ3MgbG9va3VwKS4gKi9cbiAgZ2V0UmVkYWN0aW9uUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgdGhlIHJ1biBmcm9tIGBmcm9tYDogdGhlIHBvbGljeSAoYnkgcmVmZXJlbmNlKSBhbmQgdGhlIHJ1bidzIG1pcnJvclxuICAgKiBzdG9yZS4gVGhlIE9ORSBpbmhlcml0YW5jZSBzdGVwIOKAlCB7QGxpbmsgY3JlYXRlTmV4dH0gYW5kXG4gICAqIHtAbGluayBjcmVhdGVDaGlsZH0gYm90aCBjYWxsIGl0LCBhbmQgaXQgbmFtZXMgbm8gZGlhbC5cbiAgICovXG4gIHByaXZhdGUgaW5oZXJpdFJ1bihmcm9tOiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICB0aGlzLnBvbGljeSA9IGZyb20ucG9saWN5O1xuICAgIHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnkgPSBmcm9tLnJlZGFjdGVkU2hhcmVkTWVtb3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHRyYWNrZWQgdXNlci1sZXZlbCB3cml0ZSwgcG9saWN5LWdhdGVkICgjMTNjLUEpIOKAlCB0aGUgc2luZ2xlXG4gICAqIGJvb2trZWVwaW5nIHBhdGggZm9yIHtAbGluayBzZXRPYmplY3R9IGFuZCB7QGxpbmsgdXBkYXRlT2JqZWN0fS4gSG9sZHNcbiAgICogdGhlIFJFRkVSRU5DRSBhbmQgdGhlIHZlcmRpY3QgKDkuMjMuMCk7IHRoZSByZXRhaW5lZCBmb3JtIGlzIHRha2VuIGF0XG4gICAqIGNvbW1pdCBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LCBvbmNlIHBlciBrZXkuXG4gICAqXG4gICAqIFJlZGFjdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGRpYWwgaW4gRVZFUlkgbW9kZTogYSByZWRhY3RlZFxuICAgKiB3cml0ZSBzdG9yZXMgdGhlIGAnW1JFREFDVEVEXSdgIHBsYWNlaG9sZGVyIHVuZGVyIGAnZnVsbCdgIEFORFxuICAgKiBgJ3N1bW1hcnknYCAoYSBzdW1tYXJ5IG1hcmtlciB3b3VsZCBsZWFrIHRoZSB2YWx1ZSdzIHByZXZpZXcvc2l6ZSksXG4gICAqIGFuZCBzdG9yZXMgbm90aGluZyB1bmRlciBgJ29mZidgIChlbnRyeSBza2lwcGVkIGVudGlyZWx5IOKAlCBub3RoaW5nIHRvXG4gICAqIGxlYWspLiBBIGZpZWxkLWxldmVsIHZlcmRpY3Qgc2NydWJzIGEgY2xvbmUgQkVGT1JFIHRoZSBkaWFsIHNlZXMgaXQsIHNvXG4gICAqIGEgc3VtbWFyeSBwcmV2aWV3IGNhbiBuZXZlciBzaG93IHRoZSBzZWNyZXQgZWl0aGVyLiBUaGUgdmVyZGljdCBpcyB0aGVcbiAgICogb25lIGBzdGFnZVdyaXRlYCBhc2tlZCB0aGUgcnVsZSBmb3IgQkVGT1JFIHN0YWdpbmcsIGNhcnJpZWQgdG8gY29tbWl0XG4gICAqIHdpdGggdGhlIHZhbHVlLiBUaGUgc3RhZ2VkIHdyaXRlIGl0c2VsZiBpcyB1bmFmZmVjdGVkIOKAlCByZWRhY3Rpb24gb2ZcbiAgICogdGhlIGNvbW1pdHRlZCBwYXlsb2FkIGlzIGhhbmRsZWQgYnkgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzXG4gICAqIGByZWRhY3RlZFBhdGhzYC5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tXcml0ZShcbiAgICB1c2VyS2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyxcbiAgKSB7XG4gICAgaWYgKHRoaXMucG9saWN5LndyaXRlVHJhY2tpbmcgPT09ICdvZmYnKSByZXR1cm47XG4gICAgKHRoaXMuX3BlbmRpbmdXcml0ZXMgPz89IG5ldyBNYXAoKSkuc2V0KHVzZXJLZXksIHsgdmFsdWUsIHZlcmRpY3QsIG9wZXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgX3N0YWdlV3JpdGVzYCB3aXRoIGV2ZXJ5IHBlbmRpbmcgd3JpdGUgZm9sZGVkIGluIGFzIGl0cyByZXRhaW5lZCBmb3JtXG4gICAqIOKAlCB0aGUgcmVjb3JkIGEgcmVhZGVyIHNlZXMuIENvbnN1bWVzIG5vdGhpbmc6IGEgbWlkLXJ1biBzbmFwc2hvdCByZWFkc1xuICAgKiB0aGUgd3JpdGVzIHNvIGZhciwgYW5kIGNvbW1pdCBzdGlsbCBtYXRlcmlhbGlzZXMgdGhlIGZpbmFsIHZhbHVlcy5cbiAgICogUmV0dXJucyBgX3N0YWdlV3JpdGVzYCBpdHNlbGYgd2hlbiBub3RoaW5nIGlzIHBlbmRpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkV3JpdGVzKCk6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+IHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdXcml0ZXMpIHJldHVybiB0aGlzLl9zdGFnZVdyaXRlcztcbiAgICBjb25zdCBvdXQgPSB7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB3XSBvZiB0aGlzLl9wZW5kaW5nV3JpdGVzKSB7XG4gICAgICBvdXRba2V5XSA9IHtcbiAgICAgICAgdmFsdWU6IHRoaXMucmV0YWluZWRGb3JtKHcudmVyZGljdCwgdy52YWx1ZSwgdGhpcy5wb2xpY3kud3JpdGVUcmFja2luZywgc3VtbWFyaXplV3JpdGVWYWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogdy5vcGVyYXRpb24sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgdGhlIHJldGFpbmVkIGZvcm0gb2YgZXZlcnkgcGVuZGluZyB3cml0ZSDigJQgT05DRSBwZXIga2V5LCBmcm9tIHRoZVxuICAgKiB2YWx1ZSBhcyBpdCBzdGFuZHMgYXQgY29tbWl0ICg5LjIzLjApIOKAlCBhbmQgcmVsZWFzZSB0aGUgcmVmZXJlbmNlcy4gVGhlXG4gICAqIGZpcnN0IHRoaW5nIGBjb21taXQoKWAgZG9lcywgc28gdGhlIGJvcnJvd2VkLW11dGF0aW9uIGd1YXJkIGFuZCB0aGVcbiAgICogY29tbWl0IG9ic2VydmVyIHNlZSB0aGUgZmluaXNoZWQgcmVjb3JkLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXRlcmlhbGlzZVdyaXRlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdXcml0ZXMpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlbGVhc2VkIGV2ZW4gd2hlbiBhIHJldGFpbmVkIGZvcm0gY2Fubm90IGJlIHRha2VuIOKAlCBhbiB1bmNsb25lYWJsZVxuICAgICAgLy8gdmFsdWUgKGEgZnVuY3Rpb24sIGEgUHJveHkpIGlzIGEgY29udHJhY3QgdmlvbGF0aW9uIChcInN0YXRlIHZhbHVlc1xuICAgICAgLy8gbXVzdCBzdXJ2aXZlIHN0cnVjdHVyZWRDbG9uZVwiKSB0aGF0IG5vdyBzdXJmYWNlcyBIRVJFLCBhdCBjb21taXQsXG4gICAgICAvLyBhbmQgZmFpbHMgdGhlIHJ1biBsb3VkbHk7IGEgbGF0ZXIgc25hcHNob3Qgb2YgdGhlIGZhaWxlZCBydW4gbXVzdFxuICAgICAgLy8gbm90IHRocm93IHRoZSBzYW1lIGVycm9yIGFnYWluLlxuICAgICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvcm0gb2YgYSB2YWx1ZSB0aGUgZW5naW5lIFJFVEFJTlMgKHJlYWRzIGFuZCB3cml0ZXMgcmV0ZW50aW9uKTpcbiAgICogdGhlIHBsYWNlaG9sZGVyIGJlYXRzIGV2ZXJ5IGRpYWw7IGEgZmllbGQtbGV2ZWwgc2NydWIgaGFwcGVucyBiZWZvcmUgdGhlXG4gICAqIGRpYWwgc2VlcyB0aGUgdmFsdWU7IGEgY2xlYXIgdmFsdWUgaXMgc3VtbWFyaXplZCBvciBjbG9uZWQgYXMgdGhlIGRpYWxcbiAgICogc2F5cy4gQ2FsbGVycyBoYW5kbGUgYHVuZGVmaW5lZGAgYmVmb3JlIGFza2luZy5cbiAgICovXG4gIHByaXZhdGUgcmV0YWluZWRGb3JtKFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgbW9kZTogUmVhZFRyYWNraW5nTW9kZSB8IFdyaXRlVHJhY2tpbmdNb2RlLFxuICAgIHN1bW1hcml6ZTogKHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3duLFxuICApOiB1bmtub3duIHtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gU0NPUEVfUExBQ0VIT0xERVI7XG4gICAgY29uc3Qgc2NydWJiZWQgPSB2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnID8gUmVkYWN0aW9uUnVsZS5zY3J1YkZpZWxkcyh2YWx1ZSwgdmVyZGljdC5wYXRocykgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG1vZGUgPT09ICdzdW1tYXJ5JykgcmV0dXJuIHN1bW1hcml6ZShzY3J1YmJlZCA/PyB2YWx1ZSk7XG4gICAgcmV0dXJuIHNjcnViYmVkID8/IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJ1bGUgd2l0aCBzb21ldGhpbmcgdG8gc2F5IOKAlCBgdW5kZWZpbmVkYCBvbiB0aGUgbm8tcG9saWN5IHBhdGggKG5vXG4gICAqIHJ1bGUgaW5zdGFsbGVkLCBvciBhIHJ1bGUgd2l0aCBubyBwb2xpY3kgZW50cmllcyBhbmQgbm8gbWFya2VkIGtleXMpLCBzb1xuICAgKiBhIHRyYWNrZWQgcmVhZCBvciBhIHN0YWdlZCB3cml0ZSB0aGVyZSBwYXlzIG5vIHZlcmRpY3QgY2FsbCBhbmQgbm8gcGF0aFxuICAgKiBhbGxvY2F0aW9uLiBUaGUgZGVmYXVsdCBydW4gaXMgYnl0ZS1pZGVudGljYWwgQU5EIGNvc3QtaWRlbnRpY2FsLlxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVSdWxlKCk6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gICAgcmV0dXJuIHJ1bGUgIT09IHVuZGVmaW5lZCAmJiAhcnVsZS5pc0luZXJ0KCkgPyBydWxlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBPTkUgRlVOTkVMIGV2ZXJ5IHN0YWdlZCB3cml0ZSBwYXNzZXMgdGhyb3VnaCDigJQgZmFjYWRlIHdyaXRlcyBBTkRcbiAgICogdGhlIHBhdGhzIHRoYXQgYnlwYXNzIHRoZSBmYWNhZGUgKHN1YmZsb3cgc2VlZCwgYG91dHB1dE1hcHBlcmBcbiAgICogbWVyZ2UtYmFjaywgcmVzdW1lIHJlLXNlZWQpLiBUaGUgT05FIGRlY2lzaW9uIGlzIG1hZGUgaGVyZTogYW4gZXhwbGljaXRcbiAgICogcGVyLWNhbGwgZmxhZyBtYWtlcyB0aGUgdmFsdWUgc2VjcmV0IG91dHJpZ2h0IChhbmQgbWFya3MgdGhlIGtleSBmb3IgdGhlXG4gICAqIHJlc3Qgb2YgdGhlIHJ1biwgdGhlIGRlY2xhcmUtb25jZSBjb250cmFjdCk7IG90aGVyd2lzZSB0aGUgaW5zdGFsbGVkXG4gICAqIHJ1bGUgZGVjaWRlcyBmcm9tIHRoZSB1c2VyLWxldmVsIHBhdGguIEl0IHN0YWdlcyB0aGUgd3JpdGUsIHJlZ2lzdGVyc1xuICAgKiB0aGUgcmVkYWN0ZWQgcGF0aHMgdGhlIGNvbW1pdCBsb2cgYW5kIG1pcnJvciB3aWxsIHNjcnViICh3aG9sZSBrZXksIG9yXG4gICAqIHRoZSBmaWVsZHMgaW5zaWRlIHRoZSB2YWx1ZSksIGFuZCBrZWVwcyB0aGUgcnVuJ3MgbWFya2VkLWtleXMgc2V0IGluXG4gICAqIHN0ZXAgKGEgd2hvbGUgdmVyZGljdCBtYXJrcyBpdHMga2V5OyBhIGRlbGV0ZSBjbGVhcnMgdGhlIG1hcmspLiBSZXR1cm5zXG4gICAqIHRoZSB2ZXJkaWN0IHNvIHRoZSBjYWxsZXIgcmV0YWlucyBhbmQgcmVwb3J0cyB1bmRlciB0aGUgc2FtZSBkZWNpc2lvbi5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VXcml0ZShcbiAgICBuc1BhdGg6IHN0cmluZ1tdLFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGV4cGxpY2l0OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgIHZlcmI6ICdzZXQnIHwgJ21lcmdlJyB8ICdkZWxldGUnLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCBydWxlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgbGV0IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgPSBleHBsaWNpdFxuICAgICAgPyB7IGtpbmQ6ICd3aG9sZScsIGtleTogdXNlcktleU9mKHBhdGgsIGtleSkgfVxuICAgICAgOiBydWxlICE9PSB1bmRlZmluZWRcbiAgICAgID8gcnVsZS52ZXJkaWN0QXQocGF0aCwga2V5KVxuICAgICAgOiBDTEVBUjtcbiAgICAvLyBBIGNvcHkgSU5TSURFIHRoZSBzdGFnZTogdGhlIHZlcnkgb2JqZWN0IGl0IHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lLCB3cml0dGVuIHVuZGVyXG4gICAgLy8gYW5vdGhlciAoYHMucGVyc29uID0gcy5wcm9maWxlYCksIGtlZXBzIHRoYXQgcnVsZSDigJQgbWF0Y2hlZCBieSBJREVOVElUWS4gQSBuZXcgb2JqZWN0XG4gICAgLy8gb3IgYSBwcmltaXRpdmUgY29waWVkIGFjcm9zcyBuYW1lcyBpcyBzZWxlY3RlZCBieSBpdHMgb3duIG5hbWUgb25seS5cbiAgICBjb25zdCByZWFkID1cbiAgICAgIHJ1bGUgIT09IHVuZGVmaW5lZCAmJiB2ZXJkaWN0LmtpbmQgIT09ICd3aG9sZScgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgICA/IHRoaXMuX3NlbGVjdGVkT2JqZWN0cz8uZ2V0KHZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAocmVhZCAhPT0gdW5kZWZpbmVkICYmIHJ1bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHJlYWQua2luZCA9PT0gJ3dob2xlJykgcnVsZS5tYXJrKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgICAgIGVsc2UgaWYgKHJlYWQua2luZCA9PT0gJ2ZpZWxkcycpIHtcbiAgICAgICAgY29uc3QgYXQgPSBbLi4ucGF0aC5zbGljZSgxKSwgLi4uKHBhdGgubGVuZ3RoID4gMCA/IFtrZXldIDogW10pXTtcbiAgICAgICAgcnVsZS5pbmhlcml0RmllbGRzKFxuICAgICAgICAgIHBhdGhbMF0gPz8ga2V5LFxuICAgICAgICAgIHJlYWQucGF0aHMubWFwKChmaWVsZCkgPT4gWy4uLmF0LCBmaWVsZF0uam9pbignLicpKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHZlcmRpY3QgPSBydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkpO1xuICAgIH1cbiAgICBjb25zdCB3aG9sZSA9IHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJztcbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCk7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIGJ1ZmZlci5tZXJnZShuc1BhdGgsIHZhbHVlLCB3aG9sZSk7XG4gICAgZWxzZSBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIGJ1ZmZlci5kZWxldGUobnNQYXRoLCB3aG9sZSk7XG4gICAgZWxzZSBidWZmZXIuc2V0KG5zUGF0aCwgdmFsdWUsIHdob2xlKTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgYnVmZmVyLm1hcmtSZWRhY3RlZEZpZWxkcyhuc1BhdGgsIHZlcmRpY3QucGF0aHMpO1xuICAgIGlmICh2ZXJiID09PSAnZGVsZXRlJykge1xuICAgICAgcnVsZT8udW5tYXJrKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgICB9IGVsc2UgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykge1xuICAgICAgLy8gVGhlIFJFQUwgcnVsZSwgbm90IHRoZSBhY3RpdmUgb25lOiBhbiBleHBsaWNpdCBtYXJrIG9uIGFuIGluZXJ0IHJ1bGVcbiAgICAgIC8vIGlzIGV4YWN0bHkgd2hhdCBtYWtlcyBpdCBhY3RpdmUgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4uXG4gICAgICB0aGlzLnBvbGljeS5yZWRhY3Rpb24/Lm1hcmsodmVyZGljdC5rZXkpO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDilIDilIAgVGhlIGZpcnN0LXRvdWNoIHN0YXRlIHZpZXcgKCMxMykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqXG4gICAqIFdIQVQ6IHJldHVybnMgdGhlIGNvbW1pdHRlZCBzaGFyZWQgc3RhdGUgYXMgaXQgd2FzIGF0IHRoaXMgc3RhZ2UncyBGSVJTVFxuICAgKiB0b3VjaCAoZmlyc3QgcmVhZCBvciBmaXJzdCB3cml0ZSksIGNhcHR1cmluZyB0aGUgcmVmZXJlbmNlIG9uIGZpcnN0IGNhbGwuXG4gICAqIFNlcnZlcyB0d28gY29uc3VtZXJzOiByZWFkcyBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlICh7QGxpbmsgcmVhZFN0YXRlfSlcbiAgICogYW5kIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBkaWZmIGJhc2UgKHtAbGluayBnZXRUcmFuc2FjdGlvbkJ1ZmZlcn0pLlxuICAgKlxuICAgKiBXSFkgQSBCQVJFIFJFRkVSRU5DRSBJUyBTQUZFIOKAlCB0aGUgaW52YXJpYW50IHRoaXMgcmVzdHMgb246IGNvbW1pdHRlZFxuICAgKiBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcC4gRXZlcnkgd3JpdGUgdG8gYFNoYXJlZE1lbW9yeWAgYnVpbGRzIHRoZVxuICAgKiBORVhUIGdlbmVyYXRpb24gYW5kIHN3YXBzIGl0IGluIChjb3B5LW9uLXdyaXRlLCA5LjI5LjA6IGBhcHBseVBhdGNoYCB2aWFcbiAgICogYG5leHRHZW5lcmF0aW9uYCwgYW5kIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYCB0b28pIOKAlCBpdCBjb3BpZXMgdGhlIHJvb3RcbiAgICogYW5kIHRoZSBjb250YWluZXJzIG9uIGVhY2ggd3JpdHRlbiBwYXRoLCBzaGFyZXMgdGhlIHJlc3QsIGFuZCBuZXZlclxuICAgKiBlZGl0cyBhIGNvbnRhaW5lciBvZiB0aGUgZ2VuZXJhdGlvbiBhIHN0YWdlIGNhcHR1cmVkIGhlcmUuIEhvbGRpbmcgdGhlXG4gICAqIHJlZmVyZW5jZSB0aGVyZWZvcmUgZ2l2ZXMgdGhpcyBzdGFnZSBhIHN0YWJsZSBzbmFwc2hvdCBhdCB6ZXJvIGNvc3Qg4oCUIG5vXG4gICAqIGNsb25lLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mICMxMy4gVGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzXG4gICAqIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIHJlc3RzIG9uIHRoZSBzYW1lIGd1YXJhbnRlZTogaXQgSVMgdGhpcyB2aWV3LlxuICAgKlxuICAgKiBXSFkgRklSU1QgVE9VQ0gsIG5vdCBmaXJzdCB3cml0ZTogdGhlIHByZS0jMTMgZWFnZXIgZW5naW5lIGNsb25lZCB0aGVcbiAgICogc3RhdGUgaW50byB0aGUgYnVmZmVyIGF0IHRoZSBzdGFnZSdzIGZpcnN0IEFDQ0VTUywgYW5jaG9yaW5nIGJvdGggaXRzXG4gICAqIHNuYXBzaG90IHJlYWRzIGFuZCBpdHMgY29tbWl0IGJhc2VsaW5lICh0aGUgbmV0LWNoYW5nZSBkaWZmIGJhc2UpIHRoZXJlLlxuICAgKiAjMTMncyBmaXJzdCBjdXQgYW5jaG9yZWQgdGhlIGxhenkgYnVmZmVyIGF0IGZpcnN0IFdSSVRFIOKAlCBvYnNlcnZhYmx5XG4gICAqIGRpZmZlcmVudCB3aGVuIHNvbWV0aGluZyBlbHNlIGNvbW1pdHMgaW4gdGhlIGdhcCBiZXR3ZWVuIHRoaXMgc3RhZ2Unc1xuICAgKiBmaXJzdCByZWFkIGFuZCBpdHMgZmlyc3Qgd3JpdGUuIFRoYXQgZ2FwIGlzIFJFQUNIQUJMRTogZm9yayBzaWJsaW5ncyBhcmVcbiAgICogbmFtZXNwYWNlLWlzb2xhdGVkIGZvciBydW4tc2NvcGVkIGtleXMgKGVhY2ggY2hpbGQgd3JpdGVzIHVuZGVyXG4gICAqIGBydW5zLzxjaGlsZElkPi9gKSwgYnV0IFJPT1QtbGV2ZWwga2V5cyBhcmUgc2hhcmVkIOKAlCB3cml0dGVuIHZpYVxuICAgKiBgc2V0R2xvYmFsYCBmcm9tIGNvbnN1bWVyIHNjb3BlIGNvZGUgYW5kLCBjcml0aWNhbGx5LCBieVxuICAgKiBgU3ViZmxvd0lucHV0TWFwcGVyYCdzIG91dHB1dCBtYXBwaW5nIChgcGFyZW50Q29udGV4dC5zZXRHbG9iYWxgKSwgd2hpY2hcbiAgICogaXMgZXhhY3RseSB3aGF0IHJ1bnMgd2hlbiBhIHN1YmZsb3cgaXMgYSBmb3JrIGJyYW5jaC4gQSBzaWJsaW5nJ3NcbiAgICogcm9vdC1rZXkgY29tbWl0IGxhbmRpbmcgaW4gdGhlIGdhcCB3b3VsZCBzaGlmdCB0aGlzIHN0YWdlJ3MgZGlmZiBiYXNlLFxuICAgKiBtYWtpbmcgaXRzIENvbW1pdEJ1bmRsZSByZWNvcmQgYSBwaGFudG9tIGNoYW5nZSAob3Igc3dhbGxvdyBhIHJlYWwgb25lKVxuICAgKiByZWxhdGl2ZSB0byB0aGUgZWFnZXIgZW5naW5lLiBBbmNob3JpbmcgdGhlIHZpZXcgYXQgZmlyc3QgdG91Y2ggcmVzdG9yZXNcbiAgICogdGhlIEVYQUNUIGVhZ2VyIHNlbWFudGljcyDigJQgc2VxdWVudGlhbCBBTkQgcGFyYWxsZWwg4oCUIGF0IHplcm8gY2xvbmUgY29zdC5cbiAgICpcbiAgICogUmVhZCB2aXNpYmlsaXR5IGlzIHR3by10aWVyLCBtYXRjaGluZyBlYWdlciBieXRlLWZvci1ieXRlOiBrZXlzIHByZXNlbnRcbiAgICogaW4gdGhlIHZpZXcgYXQgZmlyc3QgdG91Y2ggcmVhZCByZXBlYXRhYmx5IGZyb20gaXQ7IGtleXMgQUJTRU5UIGZyb20gaXRcbiAgICogZmFsbCBiYWNrIHRvIExJVkUgc3RhdGUgKHRoZSBlYWdlciBlbmdpbmUncyBleGFjdCBmYWxsYmFjayDigJQgYVxuICAgKiBtaWQtZmxpZ2h0IHNpYmxpbmcgcm9vdC1rZXkgd3JpdGUgd2FzIGFsd2F5cyB2aXNpYmxlIHRvIHJlYWRzLCBhbmRcbiAgICogc3RheXMgdmlzaWJsZTsgb25seSB0aGUgRElGRiBCQVNFIGlzIHBpbm5lZCkuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0VG91Y2hTdGF0ZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLnN0YXRlVmlldykge1xuICAgICAgdGhpcy5zdGF0ZVZpZXcgPSB0aGlzLnNoYXJlZE1lbW9yeS5nZXRTdGF0ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZVZpZXc7XG4gIH1cblxuICAvKiogTGF6aWx5IGNyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciBvbiB0aGUgc3RhZ2UncyBGSVJTVCBXUklURSAoIzEzKS5cbiAgICpcbiAgICogIFJlYWRzIE5FVkVSIGNvbnN0cnVjdCBpdDogcmVhZC15b3VyLXdyaXRlcyBvbmx5IG1hdHRlcnMgb25jZSBhIHN0YWdlZFxuICAgKiAgd3JpdGUgZXhpc3RzLCBzbyBiZWZvcmUgdGhhdCB7QGxpbmsgZ2V0VmFsdWV9L3tAbGluayBnZXRWYWx1ZURpcmVjdH1cbiAgICogIHNlcnZlIGZyb20gdGhlIGZpcnN0LXRvdWNoIHN0YXRlIHZpZXcgYW5kIHtAbGluayBjb21taXR9IHJlY29yZHMgYW5cbiAgICogIGVtcHR5IGJ1bmRsZSDigJQgYWxsIHdpdGggWkVSTyBgc3RydWN0dXJlZENsb25lYHMgb2YgdGhlIHNoYXJlZCBzdGF0ZS5cbiAgICpcbiAgICogIFRoZSBidWZmZXIncyBiYXNlIGlzIHRoZSBGSVJTVC1UT1VDSCB2aWV3LCBOT1QgdGhlIGxpdmUgc3RhdGUgYXQgd3JpdGVcbiAgICogIHRpbWU6IHVuZGVyIHBhcmFsbGVsIGZvcmtzIGEgc2libGluZyBtYXkgaGF2ZSBjb21taXR0ZWQgYmV0d2VlbiB0aGlzXG4gICAqICBzdGFnZSdzIGZpcnN0IHJlYWQgYW5kIHRoaXMgd3JpdGUsIGFuZCB0aGUgbmV0LWNoYW5nZSBkaWZmIGJhc2UgbXVzdFxuICAgKiAgc3RheSBhbmNob3JlZCBhdCBmaXJzdCB0b3VjaCB0byBtYXRjaCB0aGUgZWFnZXIgZW5naW5lIOKAlCBzZWVcbiAgICogIHtAbGluayBmaXJzdFRvdWNoU3RhdGV9LiAqL1xuICBnZXRUcmFuc2FjdGlvbkJ1ZmZlcigpOiBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmJ1ZmZlcikge1xuICAgICAgLy8gUGVyLXdyaXRlIHByb3ZlbmFuY2UgKCNQMSk6IGhhbmQgdGhlIGJ1ZmZlciBhIGxpdmUgdmlldyBvZiB0aGlzXG4gICAgICAvLyBzdGFnZSdzIHJlYWQgcHJlZml4IOKAlCBldmFsdWF0ZWQgQVQgRUFDSCBXUklURSwgc28gZWFjaCBzdGFnZWQgb3BcbiAgICAgIC8vIGNhcHR1cmVzIGV4YWN0bHkgdGhlIHJlYWRzIHRoYXQgcHJlY2VkZWQgaXQgKHRlbXBvcmFsIHByZWZpeCkuXG4gICAgICBjb25zdCByZWFkS2V5c1Byb3ZpZGVyID1cbiAgICAgICAgdGhpcy5wb2xpY3kud3JpdGVQcm92ZW5hbmNlID09PSAncmVhZHMtcHJlZml4JyA/ICgpID0+IFsuLi4odGhpcy5fcHJvdmVuYW5jZVJlYWRzID8/IFtdKV0gOiB1bmRlZmluZWQ7XG4gICAgICAvLyBUaGUgc3RhZ2UncyBhZGRyZXNzICg5LjMwLjA6IHRoZSBhZG1pdHRlZCByZWNvcmQgcmVhZHMgdGhlIGNvbnRhaW5lcnNcbiAgICAgIC8vIHRoZXJlIGFzIHdoZXJlIHRoZSBzdGFnZSB3cml0ZXMsIG5ldmVyIGFzIGEgdmFsdWUgaXQgcmVhZCkuXG4gICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBUcmFuc2FjdGlvbkJ1ZmZlcihcbiAgICAgICAgdGhpcy5maXJzdFRvdWNoU3RhdGUoKSxcbiAgICAgICAgdGhpcy5wb2xpY3kuY29tbWl0VmFsdWVzLFxuICAgICAgICByZWFkS2V5c1Byb3ZpZGVyLFxuICAgICAgICB0aGlzLmFkZHJlc3MsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gIH1cblxuICAvKipcbiAgICogV2hlcmUgdGhpcyBmcmFtZSB3cml0ZXMgYW5kIHJlYWRzOiBgWydydW5zJywgPGlkPl1gLCBvciBgW11gICh0aGUgcm9vdCkgd2l0aFxuICAgKiBubyBydW4gaWQuIEhhbmRlZCB0byB0aGUgcmVjb3JkIGxheWVyIGFzIGRhdGEgKEMyKTogdGhlIGJ1ZmZlcidzIGFkZHJlc3MsXG4gICAqIGFuZCB3aGVyZSBgU2hhcmVkTWVtb3J5IMK3IGdldFZhbHVlYCBsb29rcyBiZWZvcmUgdGhlIHJvb3QuXG4gICAqL1xuICBwcml2YXRlIGdldCBhZGRyZXNzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2VJZCA/IFtSVU5fTkFNRVNQQUNFLCB0aGlzLm5hbWVzcGFjZUlkXSA6IFtdO1xuICB9XG5cbiAgLyoqIEJ1aWxkcyBhbiBhYnNvbHV0ZSBwYXRoIGluc2lkZSB0aGUgc2hhcmVkIG1lbW9yeTogdGhpcyBmcmFtZSdzIHtAbGluayBhZGRyZXNzfSwgdGhlbiB0aGUgcGF0aC4gKi9cbiAgcHJpdmF0ZSB3aXRoTmFtZXNwYWNlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAvLyBTcGVsbGVkIG91dCwgbm90IGBbLi4udGhpcy5hZGRyZXNzLCDigKZdYDogZXZlcnkgcmVhZCBhbmQgd3JpdGUgYnVpbGRzIG9uZSwgYW5kIHRoZSBzcHJlYWRcbiAgICAvLyBhbGxvY2F0ZXMgdGhlIGFkZHJlc3MgYXJyYXkgcGVyIGNhbGwgKCszJSBvbiBhIG5hbWVzcGFjZWQgZnJhbWUncyByZWFkL3dyaXRlIGxvb3ApLlxuICAgIGNvbnN0IGlkID0gdGhpcy5uYW1lc3BhY2VJZDtcbiAgICByZXR1cm4gaWQgPyBbUlVOX05BTUVTUEFDRSwgaWQsIC4uLnBhdGgsIGtleV0gOiBbLi4ucGF0aCwga2V5XTtcbiAgfVxuXG4gIC8qKiBUaGUgcnVuIG5hbWVzcGFjZSB3cml0ZXMgYW5kIHJlYWRzIGdvIHRvOiB7QGxpbmsgYWRkcmVzc1J1bklkfSwgZWxzZSBgcnVuSWRgLiAqL1xuICBwcml2YXRlIGdldCBuYW1lc3BhY2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFkZHJlc3NSdW5JZCA/PyB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGFuZCByZWFkIGF0IEFOT1RIRVIgZnJhbWUncyBhZGRyZXNzIChpdHMgcnVuIG5hbWVzcGFjZSkgd2hpbGUgdGhpc1xuICAgKiBmcmFtZSBrZWVwcyBpdHMgb3duIGlkZW50aXR5IG9uIHRoZSByZWNvcmQg4oCUIGBzdGFnZWAsIGBzdGFnZUlkYCxcbiAgICogYHJ1bnRpbWVTdGFnZUlkYCwgdGFncy4gQSBzdWJmbG93IG1vdW50J3MgbWVyZ2UtYmFjayBpcyB0aGUgb25lIGNhbGxlclxuICAgKiAoYFN1YmZsb3dFeGVjdXRvciDCtyBleGVjdXRlU3ViZmxvd2AsIFIxMyk6IHRoZSBtb3VudCBmcmFtZSBvZiBhIGJyYW5jaCBvclxuICAgKiBmb3JrIGNoaWxkIGxhbmRzIGl0cyB2YWx1ZXMgd2hlcmUgaXRzIHBhcmVudCB3cml0ZXMsIGFzIGJlZm9yZSwgYW5kIGl0c1xuICAgKiBidW5kbGUgbm93IG5hbWVzIHRoZSBtb3VudCBpbnN0ZWFkIG9mIHRoZSBzdGFnZSBiZWZvcmUgaXQuIFJlZnVzZWQgb25jZVxuICAgKiB0aGUgZnJhbWUgaGFzIHN0YWdlZCBhbnl0aGluZyDigJQgaXRzIGJ1ZmZlcidzIGFkZHJlc3MgaXMgZml4ZWQgdGhlbi5cbiAgICovXG4gIHVzZUFkZHJlc3NPZihmcmFtZTogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYnVmZmVyICYmIGZyYW1lLm5hbWVzcGFjZUlkICE9PSB0aGlzLm5hbWVzcGFjZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbZm9vdHByaW50XSBTdGFnZUNvbnRleHQudXNlQWRkcmVzc09mOiAnJHt0aGlzLnN0YWdlSWR9JyBoYXMgYWxyZWFkeSBzdGFnZWQgd3JpdGVzIGF0IGl0cyBvd24gYWRkcmVzcy5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hZGRyZXNzUnVuSWQgPSBmcmFtZS5uYW1lc3BhY2VJZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXcml0ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBhdGNoKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2gocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBtZXJnZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnbWVyZ2UnKTtcbiAgfVxuXG4gIHNldE9iamVjdChcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBzaG91bGRSZWRhY3Q/OiBib29sZWFuLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wZXJhdGlvbk92ZXJyaWRlPzogJ3NldCcgfCAnZGVsZXRlJyxcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgLy8gRXhwbGljaXQgZGVsZXRpb24gKFNjb3BlRmFjYWRlLmRlbGV0ZVZhbHVlKSBzdGFnZXMgYSBkaXN0aW5jdCBvcCBzb1xuICAgIC8vIGRlbHRhLW1vZGUgY29tbWl0cyAoIzEzYy1CKSBjYW4gZW1pdCBhIHJlYWwgYGRlbGV0ZWAgdHJhY2UgZW50cnkuXG4gICAgLy8gVW5kZXIgdGhlIGRlZmF1bHQgJ2Z1bGwnIG1vZGUgdGhlIGJ1ZmZlciBjb21taXRzIGl0IGFzIGFcbiAgICAvLyBzZXQtb2YtdW5kZWZpbmVkIOKAlCBieXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLlxuICAgIGNvbnN0IHZlcmRpY3QgPVxuICAgICAgb3BlcmF0aW9uT3ZlcnJpZGUgPT09ICdkZWxldGUnXG4gICAgICAgID8gdGhpcy5zdGFnZVdyaXRlKHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHVuZGVmaW5lZCwgc2hvdWxkUmVkYWN0LCAnZGVsZXRlJylcbiAgICAgICAgOiB0aGlzLnN0YWdlV3JpdGUodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ3NldCcpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0IOKAlFxuICAgIC8vIHBvbGljeS1nYXRlZCAoIzEzYy1BKSwgc2VlIHRyYWNrV3JpdGUuXG4gICAgdGhpcy50cmFja1dyaXRlKHVzZXJLZXlPZihwYXRoLCBrZXkpLCB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uT3ZlcnJpZGUgPz8gJ3NldCcpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdGFnZ2VkID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgnWycpID8gZGVzY3JpcHRpb24gOiBgW1dSSVRFXSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIHRhZ2dlZCk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgdXBkYXRlT2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLm1lcmdlKHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCAndXBkYXRlJyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICBzZXRSb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2goW10sIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIFJvb3QtbGV2ZWwgKHVuLW5hbWVzcGFjZWQpIHdyaXRlIOKAlCB0aGUgc3ViZmxvdyBzZWVkIGFuZCBtZXJnZS1iYWNrIHBhdGguICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVHbG9iYWxDb250ZXh0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuc3RhZ2VXcml0ZShba2V5XSwgW10sIGtleSwgdmFsdWUsIHVuZGVmaW5lZCwgJ3NldCcpO1xuICB9XG5cbiAgYXBwZW5kVG9BcnJheShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIGl0ZW1zOiB1bmtub3duW10sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuaXNBcnJheShleGlzdGluZykgPyBbLi4uZXhpc3RpbmcsIC4uLml0ZW1zXSA6IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBtZXJnZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID1cbiAgICAgIGV4aXN0aW5nICYmIHR5cGVvZiBleGlzdGluZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmcpXG4gICAgICAgID8geyAuLi4oZXhpc3RpbmcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLCAuLi5vYmogfVxuICAgICAgICA6IHsgLi4ub2JqIH07XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBCdWZmZXItYXdhcmUgcmVhZCwgbWlycm9yaW5nIHRoZSBlYWdlciBlbmdpbmUncyByZWFkIG9yZGVyIGJ5dGUtZm9yLWJ5dGU6XG4gICAqXG4gICAqICAgIDEuIHN0YWdlZCB3cml0ZXMgKyBmaXJzdC10b3VjaCBzbmFwc2hvdCDigJQgYGJ1ZmZlci5nZXRgIG92ZXIgaXRzXG4gICAqICAgICAgIHdvcmtpbmdDb3B5IHdoZW4gdGhlIGJ1ZmZlciBleGlzdHMsIGVsc2UgYG5hdGl2ZUdldGAgb3ZlciB0aGVcbiAgICogICAgICAgemVyby1jbG9uZSBzdGF0ZSB2aWV3ICh0aGUgYnVmZmVyJ3MgYmFzZSBJUyB0aGF0IHZpZXcsIHNvIHRoZSB0d29cbiAgICogICAgICAgdGllcnMgYWdyZWUgb24gY29udGVudCk7XG4gICAqICAgIDIuIExJVkUgc3RhdGUgdmlhIGBzaGFyZWRNZW1vcnkuZ2V0VmFsdWVgIGZvciBrZXlzIGFic2VudCBmcm9tIHRoZVxuICAgKiAgICAgICBzbmFwc2hvdCDigJQgaW5jbHVkaW5nIGl0cyBydW7ihpJnbG9iYWwgbmFtZXNwYWNlIGZhbGxiYWNrLiBUaGUgZWFnZXJcbiAgICogICAgICAgZW5naW5lIGhhZCB0aGlzIGV4YWN0IGxpdmUgZmFsbGJhY2sgZm9yIHNuYXBzaG90LW1pc3Npbmcga2V5cztcbiAgICogICAgICAgYnl0ZS1pZGVudGl0eSBvdmVyIHB1cml0eS4gQWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgc3VjaCBhXG4gICAqICAgICAgIHZhbHVlIGNhbiBiZSB0aGUgdmVyeSBjb250YWluZXIgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSBob2xkcyBhdFxuICAgKiAgICAgICB0aGUgcGF0aCAodGhlIHN0YWdlIGRlbGV0ZWQgb3IgdW5zZXQgaXQsIG9yIHJlcGxhY2VkIGEgY29udGFpbmVyXG4gICAqICAgICAgIGFib3ZlIGl0KSwgc28gdGhlIGJhc2UgaXMgZGV0YWNoZWQgdGhlcmUgZmlyc3RcbiAgICogICAgICAgKGBUcmFuc2FjdGlvbkJ1ZmZlciDCtyBkZXRhY2hCYXNlYCk6IGFuIGluLXBsYWNlIGVkaXQgb2YgdGhlIHZhbHVlXG4gICAqICAgICAgIChvdXQgb2YgY29udHJhY3QpIHdyaXR0ZW4gYmFjayBpcyByZWNvcmRlZCwgYXMgb24gOS4yOC4wLCB3aG9zZVxuICAgKiAgICAgICBiYXNlIHdhcyBhIGNsb25lIHRha2VuIGF0IHRoZSBmaXJzdCB3cml0ZS5cbiAgICpcbiAgICogIFJlYWRzIG5ldmVyIGNvbnN0cnVjdCB0aGUgYnVmZmVyICgjMTMpOiBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzXG4gICAqICBwZXJmb3JtcyB6ZXJvIGNsb25lcyBvZiB0aGUgc2hhcmVkIHN0YXRlLiAqL1xuICBwcml2YXRlIHJlYWRTdGF0ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgbmFtZXNwYWNlZCA9IHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkgYXMgc3RyaW5nKTtcbiAgICBjb25zdCBmcm9tU25hcHNob3QgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyLmdldChuYW1lc3BhY2VkKSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2hTdGF0ZSgpLCBuYW1lc3BhY2VkKTtcbiAgICBpZiAodHlwZW9mIGZyb21TbmFwc2hvdCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmcm9tU25hcHNob3Q7XG4gICAgY29uc3QgbGl2ZSA9IHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMuYWRkcmVzcywgcGF0aCwga2V5KTtcbiAgICAvLyBUaWVyIDIgYWZ0ZXIgdGhlIGZpcnN0IHdyaXRlOiBrZWVwIHRoZSBkaWZmIGJhc2UgZXhhY3QgKHNlZSBhYm92ZSkuXG4gICAgaWYgKHRoaXMuYnVmZmVyICYmIGxpdmUgIT09IG51bGwgJiYgdHlwZW9mIGxpdmUgPT09ICdvYmplY3QnKSB0aGlzLmJ1ZmZlci5kZXRhY2hCYXNlKG5hbWVzcGFjZWQpO1xuICAgIHJldHVybiBsaXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIEJPUlJPV0VEIOKAlCBzZWUgdGhlIGNvbnRyYWN0IG9uXG4gICAqIGBTY29wZUZhY2FkZS5nZXRWYWx1ZWAuIFJlYWQtdHJhY2tpbmcgY29zdCBpcyBwb2xpY3ktZ2F0ZWQgKCMxNCk6XG4gICAqIGAnZnVsbCdgIGNsb25lcyB0aGUgdmFsdWUgaW50byBgX3N0YWdlUmVhZHNgIChoaXN0b3JpY2FsIGRlZmF1bHQpLFxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgbWFya2VyLCBgJ29mZidgIHJlY29yZHMgbm90aGluZy5cbiAgICovXG4gIGdldFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRTdGF0ZShwYXRoLCBrZXkpO1xuICAgIC8vIFBlci13cml0ZSBwcm92ZW5hbmNlIHJlZ2lzdHJ5ICgjUDEpIOKAlCBrZXkgc3RyaW5ncyBvbmx5LCBpbmRlcGVuZGVudCBvZlxuICAgIC8vIHRoZSByZWFkVHJhY2tpbmcgcmV0ZW50aW9uIGRpYWwgKHdoaWNoIGdvdmVybnMgVkFMVUUgcmV0ZW50aW9uIGJlbG93KS5cbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wb2xpY3kud3JpdGVQcm92ZW5hbmNlID09PSAncmVhZHMtcHJlZml4Jykge1xuICAgICAgKHRoaXMuX3Byb3ZlbmFuY2VSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQocGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5KTtcbiAgICB9XG4gICAgLy8gVGhlIHZlcmRpY3QsIG9uY2Ug4oCUIGZvciB0aGUgcmV0YWluZWQgcmVhZCBiZWxvdyBhbmQgdGhlIHNlbGVjdGVkLXJlYWRcbiAgICAvLyBjb3VudCAoYHNlbGVjdGVkUmVhZHNgKS4gTm8gcG9saWN5IGFuZCBubyBtYXJrcyDihpIgbm8gdmVyZGljdCBjYWxsLCBub1xuICAgIC8vIGFsbG9jYXRpb24gKGFjdGl2ZVJ1bGUpLlxuICAgIGNvbnN0IHJ1bGUgPSBrZXkgIT09IHVuZGVmaW5lZCA/IHRoaXMuYWN0aXZlUnVsZSgpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZlcmRpY3QgPSBydWxlICE9PSB1bmRlZmluZWQgPyBydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkgYXMgc3RyaW5nKSA6IENMRUFSO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSZWFkcyArPSAxO1xuICAgICAgLy8gQW4gb2JqZWN0IHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lLCB3cml0dGVuIGJhY2sgdW5kZXIgYW5vdGhlciwga2VlcHMgaXRzIHJ1bGUgKHN0YWdlV3JpdGUpLlxuICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpICh0aGlzLl9zZWxlY3RlZE9iamVjdHMgPz89IG5ldyBXZWFrTWFwKCkpLnNldCh2YWx1ZSwgdmVyZGljdCk7XG4gICAgfVxuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgcmVhZCAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3IOKAlCByZXRhaW5lZCB1bmRlclxuICAgIC8vIHRoZSBydWxlJ3MgdmVyZGljdCAoOS4xOS4wKTogYSByZWRhY3RlZCBrZXkgaXMgcmV0YWluZWQgYXMgdGhlXG4gICAgLy8gcGxhY2Vob2xkZXIsIGEgZmllbGQtbGV2ZWwga2V5IGFzIGEgc2NydWJiZWQgY2xvbmUsIG5ldmVyIHRoZSBzZWNyZXQuXG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucG9saWN5LnJlYWRUcmFja2luZyAhPT0gJ29mZicpIHtcbiAgICAgIGlmIChwYXRoLmxlbmd0aCA+IDApICh0aGlzLl9uZXN0ZWRSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICAgICAgZWxzZSBpZiAodGhpcy5wb2xpY3kucmVhZFRyYWNraW5nID09PSAnZnVsbCcgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB0aGlzLl92aWV3UmVhZHM/LmRlbGV0ZShrZXkpO1xuICAgICAgICBlbHNlICh0aGlzLl92aWV3UmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKGtleSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFnZVJlYWRzW3VzZXJLZXlPZihwYXRoLCBrZXkpXSA9XG4gICAgICAgIHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogdGhpcy5yZXRhaW5lZEZvcm0odmVyZGljdCwgdmFsdWUsIHRoaXMucG9saWN5LnJlYWRUcmFja2luZywgc3VtbWFyaXplUmVhZFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGBbUkVBRF0gJHtkZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRyYWNrZWQgcmVhZHMgb2YgdGhpcyBmcmFtZSByZWFkIGEgdmFsdWUgdGhlIHJ1bidzIHJ1bGUgc2VsZWN0c1xuICAgKiAoYSBrZXkgaXQgbWFza3Mgd2hvbGUsIG9yIG9uZSB3aXRoIHNlY3JldCBmaWVsZHMpLiBBIGJvdW5kYXJ5IHRoYXQgbWFwc1xuICAgKiB3aGF0IGEgc3RhZ2UgZnVuY3Rpb24gUkVBRCBpbnRvIGEgbmV3IG5hbWUg4oCUIHRoZSBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtc1xuICAgKiBzZWxlY3RvciDigJQgY29tcGFyZXMgaXQgYmVmb3JlIGFuZCBhZnRlciwgYXMgYSBzdWJmbG93IG1hcHBlcidzIHRhaW50IGRvZXNcbiAgICogKGBtZW1vcnkvcmVkYWN0aW9uLnRzIMK3IE1hcHBlclRhaW50YCkuIEFsd2F5cyAwIHdpdGhvdXQgYSBwb2xpY3kgb3IgYSBtYXJrLlxuICAgKi9cbiAgZ2V0IHNlbGVjdGVkUmVhZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSZWFkcztcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgdHJhY2tpbmcgaW4gX3N0YWdlUmVhZHMgb3IgcGF5aW5nIHN0cnVjdHVyZWRDbG9uZSBjb3N0LlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZS5nZXRWYWx1ZVNpbGVudCgpIGZvciBhcnJheSBwcm94eSBpbnRlcm5hbCBvcGVyYXRpb25zLiAqL1xuICBnZXRWYWx1ZURpcmVjdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMucmVhZFN0YXRlKHBhdGgsIGtleSk7XG4gIH1cblxuICBnZXRSb290KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMuYWRkcmVzcywgW10sIGtleSk7XG4gIH1cblxuICBnZXRHbG9iYWwoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0VmFsdWUoW10sIFtdLCBrZXkpO1xuICB9XG5cbiAgZ2V0U2NvcGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRTdGF0ZSgpO1xuICB9XG5cbiAgZ2V0UnVuSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDb21taXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDI6IHJlY29yZCB0aGF0IHRoaXMgc3RhZ2UgY29uc3VtZWQgYW4gdW50cmFja2VkIHJlYWQgcGF0aC5cbiAgICogQ2FsbGVkIGJ5IGBTY29wZUZhY2FkZWAgKGBnZXRBcmdzYC9gZ2V0RW52YC91bnNoYWRvd2VkIGBnZXRWYWx1ZVNpbGVudGApO1xuICAgKiBzdXJmYWNlZCBhcyBgQ29tbWl0QnVuZGxlLnVudHJhY2tlZFNvdXJjZXNgIG9uIHRoaXMgc3RhZ2UncyBjb21taXQuXG4gICAqL1xuICBtYXJrVW50cmFja2VkU291cmNlKHNvdXJjZTogVW50cmFja2VkU291cmNlKTogdm9pZCB7XG4gICAgKHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPz89IG5ldyBTZXQoKSkuYWRkKHNvdXJjZSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgdGhhdCBmaXJlcyBhZnRlciBjb21taXQoKSBhcHBsaWVzIHBhdGNoZXMuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGRpc3BhdGNoIFNjb3BlUmVjb3JkZXIub25Db21taXQgZXZlbnRzLiAqL1xuICBzZXRDb21taXRPYnNlcnZlcihcbiAgICBvYnNlcnZlcjogKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogRGV2LW1vZGUgb25seTogZGlkIHRoaXMgc3RhZ2UgY2hhbmdlLCBJTiBQTEFDRSwgYSB2YWx1ZSBpdCBtZXJlbHkgUkVBRD9cbiAgICpcbiAgICogVGhlIHR5cGVkIHNjb3BlIGludGVyY2VwdHMgZXZlcnkgd3JpdGUgaXQgY2FuIHJlYWNoIOKAlCBhIHByb3BlcnR5IGF0IGFueVxuICAgKiBkZXB0aCwgYW4gaW5kZXhlZCBlbGVtZW50LCBhbiBhcnJheSBtZXRob2QuIFdoYXQgaXQgY2Fubm90IHJlYWNoIGlzIGFuXG4gICAqIGVsZW1lbnQgaGFuZGVkIG91dCBieSBhIHJlYWQgbWV0aG9kIChgZmluZGAsIGBmaWx0ZXJgLCBgZm9y4oCmb2ZgLFxuICAgKiBgZm9yRWFjaGAsIGRlc3RydWN0dXJpbmcpOiB3cmFwcGluZyB0aG9zZSB3b3VsZCBtZWFuIHJldHVybmluZyBwcm94aWVzIG91dFxuICAgKiBvZiBldmVyeSByZWFkLCB3aGljaCBpcyBhIGNvc3QgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBwYXkuIFNvIHRoYXQgZmFtaWx5XG4gICAqIGlzIFdBUk5FRCBBQk9VVCByYXRoZXIgdGhhbiBpbnRlcmNlcHRlZCDigJQgbG91ZGx5LCBoZXJlLCBpbnN0ZWFkIG9mIGVuZGluZ1xuICAgKiB0aGUgcnVuIHdpdGggYSBjb21taXQgbG9nIHRoYXQgc2lsZW50bHkgZGlzYWdyZWVzIHdpdGggZmluYWwgc3RhdGUuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBSRVBPUlQgYWZ0ZXIgdGhlIGZhY3QsIG5vdCBhIHJlZnVzYWwgYXQgdGhlIHdyaXRlOiB0aGUgd3JpdGUgaGFzXG4gICAqIGFscmVhZHkgaGFwcGVuZWQgaW4gcGxhY2UgYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJjZXB0LiBJdCBydW5zIHVuZGVyXG4gICAqIFRXTyBwcmVjb25kaXRpb25zLCBib3RoIG5hbWVkIGluIHRoZSBSRUFETUUg4oCUIGBlbmFibGVEZXZNb2RlKClgLCBhbmRcbiAgICogYHJlYWRUcmFja2luZzogJ2Z1bGwnYCAodGhlIGRlZmF1bHQpLCBiZWNhdXNlIHRoZSBjb21wYXJpc29uIG5lZWRzIHRoZVxuICAgKiBjbG9uZSBvZiB0aGUgdmFsdWUgdGhhdCBtb2RlIHJldGFpbnMgYXQgcmVhZCB0aW1lLiBBIGtleSB0aGUgc3RhZ2UgbmV2ZXJcbiAgICogc3RhZ2VkIG11c3Qgc3RpbGwgaG9sZCB0aGF0IGNsb25lIOKAlCBjb21taXR0ZWQgc3RhdGUgaXMgaW1tdXRhYmxlLWFmdGVyLXN3YXBcbiAgICogYW5kIHRoZSBidWZmZXIncyB3b3JraW5nIGNvcHkgaXMgcHJpdmF0ZSB0byB0aGlzIHN0YWdlLiBLZXlzIHRoZSBzdGFnZSBESURcbiAgICogc3RhZ2UgYXJlIHNraXBwZWQgKHRoZXkgYXJlIGV4cGVjdGVkIHRvIGRpZmZlciwgYW5kIHRoZXkgYXJlIGluIHRoZSByZWNvcmQpLFxuICAgKiBzbyBhcmUga2V5cyB1bmRlciBhIHJlZGFjdGlvbiB2ZXJkaWN0LCB3aG9zZSByZXRhaW5lZCBmb3JtIGlzIGRlbGliZXJhdGVseVxuICAgKiBub3QgdGhlIHZhbHVlLCBhbmQgc28gYXJlIGtleXMgcmVhZCBhdCBhIG5lc3RlZCBwYXRoIChgX25lc3RlZFJlYWRzYCkg4oCUXG4gICAqIHRob3NlIGFyZSBlbmdpbmUgcmVhZHMgKHRoZSBzdWJmbG93IG1lcmdlLWJhY2spLCBub3QgdXNlciByZWFkcy5cbiAgICpcbiAgICogSXQgYWxzbyBvbmx5IGxvb2tzIGF0IGtleXMgc2VydmVkIGZyb20gdGhlIFBJTk5FRCBzb3VyY2Ug4oCUIHRoZSBmaXJzdC10b3VjaFxuICAgKiB2aWV3IG9yIHRoaXMgc3RhZ2UncyBvd24gYnVmZmVyLiBBIGtleSBhYnNlbnQgZnJvbSBib3RoIHdhcyBzZXJ2ZWQgYnlcbiAgICogYHJlYWRTdGF0ZWAncyBsaXZlIGZhbGxiYWNrLCB3aGljaCBhIHBhcmFsbGVsIHNpYmxpbmcncyByb290LWtleSBjb21taXQgY2FuXG4gICAqIGxlZ2l0aW1hdGVseSBtb3ZlOyBhY2N1c2luZyB0aGUgc3RhZ2UgdGhlcmUgd291bGQgYmUgYSBmYWxzZSBhbGFybS4gRm9yXG4gICAqIHRoZSBzYW1lIHJlYXNvbiBpdCBydW5zIG9uIHRoZSBmcmFtZSdzIEZJUlNUIGNvbW1pdCBvbmx5OiB0aGUgcmVhZHMgYmVsb25nXG4gICAqIHRvIHRoYXQgcm91bmQsIGFuZCBieSB0aGUgZW5naW5lJ3Mgc2Vjb25kIHJvdW5kIChhIGZvcmsgZG91YmxlLWNvbW1pdCwgYVxuICAgKiBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZCBicmFuY2ggcGFyZW50KSBvdGhlciBzdGFnZXMgaGF2ZVxuICAgKiBsZWdpdGltYXRlbHkgbW92ZWQgdGhlIHN0YXRlIHRoZXkgd2VyZSBjb21wYXJlZCBhZ2FpbnN0LlxuICAgKlxuICAgKiBBIGtleSB0aGUgc3RhZ2UgRElEIHN0YWdlIGlzIHN0aWxsIGNoZWNrZWQgd2hlbiBpdHMgbGFzdCByZWFkIGNhbWUgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUgKHtAbGluayBfdmlld1JlYWRzfSDigJQgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlKTpcbiAgICogdGhhdCByZWFkIHdhcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIGFuZCB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIElTXG4gICAqIHRoYXQgb2JqZWN0IChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLCBzbyBhbiBpbi1wbGFjZSBlZGl0IGZvbGxvd2VkIGJ5IGFcbiAgICogd3JpdGUgb2YgdGhlIGtleSBjb21taXRzIE5PIGNoYW5nZSDigJQgbGl2ZSBzdGF0ZSBrZWVwcyB0aGUgZWRpdCwgdGhlIGxvZ1xuICAgKiBkb2VzIG5vdC4gQ29tcGFyZWQgYWdhaW5zdCBjb21taXR0ZWQgc3RhdGUsIG5vdCB0aGUgd3JpdHRlbiB2YWx1ZSwgc28gYVxuICAgKiBsZWdpdGltYXRlIHdyaXRlIG5ldmVyIHRyaXBzIGl0LlxuICAgKlxuICAgKiBDb3N0cyBub3RoaW5nIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIHdhcm5PbkJvcnJvd2VkTXV0YXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCFpc0Rldk1vZGUoKSB8fCB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgIT09ICdmdWxsJyB8fCB0aGlzLl9jb21taXR0ZWQpIHJldHVybjtcbiAgICBjb25zdCBydWxlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykpIHtcbiAgICAgIGNvbnN0IHJldGFpbmVkID0gdGhpcy5fc3RhZ2VSZWFkc1trZXldO1xuICAgICAgLy8gT25seSBhIGNvbnRhaW5lciBjYW4gYmUgbXV0YXRlZCBpbiBwbGFjZTsgYSBwcmltaXRpdmUgcmVhZCBjYW5ub3QuXG4gICAgICBpZiAocmV0YWluZWQgPT09IG51bGwgfHwgdHlwZW9mIHJldGFpbmVkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBpZiAodGhpcy5fbmVzdGVkUmVhZHM/LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChydWxlICE9PSB1bmRlZmluZWQgJiYgcnVsZS52ZXJkaWN0QXQoW10sIGtleSkua2luZCAhPT0gJ2NsZWFyJykgY29udGludWU7XG4gICAgICBjb25zdCBuYW1lc3BhY2VkID0gdGhpcy53aXRoTmFtZXNwYWNlKFtdLCBrZXkpO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zdGFnZVdyaXRlcywga2V5KSB8fCB0aGlzLmJ1ZmZlcj8ud2FzU3RhZ2VkKG5hbWVzcGFjZWQpKSB7XG4gICAgICAgIHRoaXMud2Fybk9uQ29tbWl0dGVkTXV0YXRpb24oa2V5LCBuYW1lc3BhY2VkLCByZXRhaW5lZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgcGlubmVkIHNvdXJjZSBvbmx5IOKAlCBzZWUgdGhlIG5vdGUgb24gdGhlIGxpdmUgZmFsbGJhY2sgYWJvdmUuXG4gICAgICAvLyBgcGVla2AsIG5vdCBgZ2V0YDogYSByZXBvcnQgY29tcGFyZXMsIGFuZCBtdXN0IG5vdCB0YWtlIHRoZSBwcml2YXRlXG4gICAgICAvLyBjb3B5IGEgc3RhZ2UncyByZWFkIHdvdWxkIChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLlxuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIucGVlayhuYW1lc3BhY2VkKSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2hTdGF0ZSgpLCBuYW1lc3BhY2VkKTtcbiAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYXRoID0gZmlyc3REaWZmZXJpbmdQYXRoKHJldGFpbmVkLCBjdXJyZW50KTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2Fybihib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBzdGFnZWQta2V5IGhhbGYgb2Yge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259OiBkaWQgY29tbWl0dGVkIHN0YXRlIGl0c2VsZiBtb3ZlIHVuZGVyIGEgcmVhZD8gKi9cbiAgcHJpdmF0ZSB3YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXk6IHN0cmluZywgbmFtZXNwYWNlZDogc3RyaW5nW10sIHJldGFpbmVkOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92aWV3UmVhZHM/LmhhcyhrZXkpKSByZXR1cm47XG4gICAgY29uc3QgY29tbWl0dGVkID0gbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaFN0YXRlKCksIG5hbWVzcGFjZWQpO1xuICAgIGlmIChjb21taXR0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGNvbW1pdHRlZCk7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggc3RhZ2VkIHdyaXRlcyB0byBzaGFyZWQgbWVtb3J5IGFuZCBSRUxFQVNFIHRoZSBwZXItc3RhZ2Ugc3RhZ2luZ1xuICAgKiBzdGF0ZSAoIzEzYikuXG4gICAqXG4gICAqIGBwaGFzZWAgKDkuMzkuMCkgaXMgdGhlIGNhbGxlcidzIHN0YXRlbWVudCBvZiB3aGF0IGEgQ09OVElOVUFUSU9OIGNvbW1pdFxuICAgKiBpcyDigJQgYCdleGl0J2AgZnJvbSBhIHN1YmZsb3cgbW91bnQncyBleGl0LCBgJ3JlcGVhdCdgIGZyb20gYSBmb3JrXG4gICAqIGZhbi1vdXQncyBzZXR0bGUuIEl0IGlzIHN0YW1wZWQgb24gdGhlIGJ1bmRsZSAoYENvbW1pdEJ1bmRsZS5waGFzZWApIG9ubHlcbiAgICogd2hlbiB0aGlzIGZyYW1lIGhhcyBBTFJFQURZIGNvbW1pdHRlZDogdGhlIEZJUlNUIGJ1bmRsZSBvZiBhbiBleGVjdXRpb25cbiAgICogaXMgdGhlIHN0YWdlJ3Mgb3duIGFuZCBuZXZlciBjYXJyaWVzIGEgYHBoYXNlYCDigJQgc28gYSBtb3VudCB3aXRob3V0IGFuXG4gICAqIGBvdXRwdXRNYXBwZXJgIChhIGxhenkgbW91bnQsIGV2ZXJ5IGBwYXJhbGxlbEZvckVhY2hgIGJyYW5jaCksIHdob3NlIGV4aXRcbiAgICogaXMgaXRzIG9ubHkgYnVuZGxlLCByZWNvcmRzIHRoYXQgYnVuZGxlIGFzIGl0cyBvd24sIHRhZ3MgYW5kIGFsbC5cbiAgICpcbiAgICogQ29tbWl0IGlzIHRoZSBzdGFnZSdzIGxpZmVjeWNsZSBlbmQ6IGBidWZmZXJgIChpdHMgd29ya2luZyBjb3B5IGFuZFxuICAgKiB3aGF0ZXZlciBwcml2YXRlIGNvcGllcyBpdHMgcmVhZHMgdG9vaykgYW5kIGBzdGF0ZVZpZXdgIChhIHJlZmVyZW5jZSB0aGF0XG4gICAqIHBpbnMgb25lIGNvbW1pdHRlZC1zdGF0ZSBHRU5FUkFUSU9OKSBhcmUgb25seSBuZWVkZWQgRFVSSU5HIGV4ZWN1dGlvbixcbiAgICogYXMgdGhlIHJlYWQgc25hcHNob3QgKyBuZXQtY2hhbmdlIGRpZmYgYmFzZS4gVGhlIGV4ZWN1dGlvbiB0cmVlIHJldGFpbnNcbiAgICogZXZlcnkgU3RhZ2VDb250ZXh0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHJ1biwgc28gV0lUSE9VVCB0aGUgcmVsZWFzZSBhXG4gICAqIGxvbmcgbG9vcCByZXRhaW5zIG9uZSBzdGF0ZSBnZW5lcmF0aW9uIHBlciBleGVjdXRlZCBzdGFnZSDigJQgbWVhc3VyZWRcbiAgICogTyhOwrIpIGJlZm9yZSBjb3B5LW9uLXdyaXRlICg5LjI5LjApLCB3aGVuIGVhY2ggZ2VuZXJhdGlvbiBhbmQgZWFjaFxuICAgKiBidWZmZXIgd2FzIGEgd2hvbGUtc3RhdGUgY2xvbmU6IDU2My44TUIgYXQgTj0yMDAgb24gYW4gYWdlbnQtc3R5bGVcbiAgICogY2hhcnQ7IGEgNTAwLWl0ZXJhdGlvbiBhZ2VudCBPT01lZCBhIGRlZmF1bHQgTm9kZSBoZWFwIChiYWNrbG9nICMxOCkuXG4gICAqIEdlbmVyYXRpb25zIG5vdyBzaGFyZSBldmVyeSB1bmNoYW5nZWQgc3VidHJlZSwgYnV0IGEgcGlubmVkIG9uZSBzdGlsbFxuICAgKiBrZWVwcyB0aGUgY29udGFpbmVycyBsYXRlciBjb21taXRzIHJlcGxhY2VkIGFsaXZlLlxuICAgKlxuICAgKiBSRS1VU0UgQUZURVIgQ09NTUlUIHN0YXlzIGNvcnJlY3QgYmVjYXVzZSBib3RoIGZpZWxkcyByZS1jcmVhdGUgbGF6aWx5OlxuICAgKiAtIGEgbGF0ZXIgUkVBRCByZS1hbmNob3JzIHZpYSB7QGxpbmsgZmlyc3RUb3VjaFN0YXRlfSBvbiB0aGUgQ1VSUkVOVFxuICAgKiAgIGNvbW1pdHRlZCBzdGF0ZSAod2hpY2ggaW5jbHVkZXMgdGhpcyBzdGFnZSdzIG93biBmbHVzaGVkIHdyaXRlcyk7XG4gICAqIC0gYSBsYXRlciBXUklURSBjb25zdHJ1Y3RzIGEgZnJlc2ggYnVmZmVyIG9uIHRoYXQgcmUtYW5jaG9yZWQgdmlldywgc28gYVxuICAgKiAgIHNlY29uZCBjb21taXQgZGlmZnMgYWdhaW5zdCBwb3N0LWZpcnN0LWNvbW1pdCBzdGF0ZS4gVGhlIHByZS1yZWxlYXNlXG4gICAqICAgYnVmZmVyIGJlaGF2ZWQgdGhlIHNhbWUgZm9yIFZBTFVFUyAoaXRzIGB3b3JraW5nQ29weWAgd2FzIHJlc2V0IG9uXG4gICAqICAgY29tbWl0LCBmYWxsaW5nIHJlYWRzIHRocm91Z2ggdG8gbGl2ZSBzdGF0ZSkgYnV0IGtlcHQgdGhlIE9SSUdJTkFMXG4gICAqICAgYGJhc2VTbmFwc2hvdGAgYXMgZGlmZiBiYXNlIOKAlCB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZTogdGhlIGVuZ2luZSdzXG4gICAqICAgb25seSB3cml0ZXMgYWZ0ZXIgYSBjb21taXQgYXJlIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZFxuICAgKiAgIGJyYW5jaCBwYXJlbnQgKGEgZGVjaWRlciBvciBmb3JrIGZyYW1lIGNvbW1pdHMgYmVmb3JlIGl0cyBicmFuY2ggcnVucyk7XG4gICAqICAgdGhlIG90aGVyIFwid3JpdGUgYWZ0ZXIgY29tbWl0XCJcbiAgICogICBzaXRlcyAoU3ViZmxvd0V4ZWN1dG9yIHNlZWQg4oaSIHJlcGxhY2VzIHRoZSBjb250ZXh0OyByZXN1bWUg4oaSIGZyZXNoXG4gICAqICAgY29udGV4dCB2aWEgYGxlYWYuY3JlYXRlTmV4dGApIG5ldmVyIHJlLXVzZSBhIGNvbW1pdHRlZCBjb250ZXh0LlxuICAgKiAtIEEgVVNFUiBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSBpcyBhIGRpZmZlcmVudCBtYXR0ZXI6IGl0cyB3cml0ZXNcbiAgICogICB3b3VsZCBsYW5kIGluIGEgYnVmZmVyIG5vdGhpbmcgZXZlciBjb21taXRzLiBUaGF0IHJlZnVzYWwgbGl2ZXMgb24gdGhlXG4gICAqICAgc2NvcGUgdGllciAoYFNjb3BlRmFjYWRlYCwgc2VhbGVkIGJ5IHRoZSBjb21taXQgb2JzZXJ2ZXIg4oCUIDkuMjIuMCksXG4gICAqICAgYmVjYXVzZSB0aGUgZnJhbWUncyByZS11c2FiaWxpdHkgaXMgZXhhY3RseSB3aGF0IHRoZSBlbmdpbmUgcGF0aHNcbiAgICogICBhYm92ZSBuZWVkLlxuICAgKiAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9zdGFnZVJlYWRzYCBhcmUgTk9UIHJlbGVhc2VkIOKAlCBgc25hcHNob3RTZWxmKClgXG4gICAqICAgcmVhZHMgdGhlbSBwb3N0LXJ1biBmb3IgdGhlIGV4ZWN1dGlvbi10cmVlIHNuYXBzaG90LlxuICAgKi9cbiAgY29tbWl0KHBoYXNlPzogQ29tbWl0UGhhc2UpOiB2b2lkIHtcbiAgICAvLyBBIGNvbnRpbnVhdGlvbiBvbmx5IEFGVEVSIHRoZSBleGVjdXRpb24ncyBvd24gYnVuZGxlIChzZWUgYWJvdmUpLlxuICAgIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHRoaXMuX2NvbW1pdHRlZCA/IHBoYXNlIDogdW5kZWZpbmVkO1xuICAgIHRoaXMubWF0ZXJpYWxpc2VXcml0ZXMoKTtcbiAgICB0aGlzLndhcm5PbkJvcnJvd2VkTXV0YXRpb24oKTtcbiAgICAvLyBUaGUgcmVjb3JkJ3MgaGFsZiAoYHJlY29yZENvbW1pdC50c2ApLiBObyBidWZmZXIgPSBubyB3cml0ZSBldmVyIGJ1aWx0XG4gICAgLy8gb25lICgjMTMpOiB0aGUgY29tbWl0IGlzIGVtcHR5IGJ5IGNvbnN0cnVjdGlvbiwgcmVjb3JkZWQgd2l0aCBaRVJPIGNsb25lcy5cbiAgICByZWNvcmRDb21taXQoXG4gICAgICB0aGlzLmJ1ZmZlcj8uY29tbWl0KCksXG4gICAgICB7XG4gICAgICAgIHN0YWdlOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgdW50cmFja2VkU291cmNlczogdGhpcy5fdW50cmFja2VkU291cmNlcyxcbiAgICAgICAgdGFnczogdGhpcy50YWdzLFxuICAgICAgICBwaGFzZTogY29udGludWF0aW9uLFxuICAgICAgfSxcbiAgICAgIHsgc3RhdGU6IHRoaXMuc2hhcmVkTWVtb3J5LCBtaXJyb3I6IHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnksIGxvZzogdGhpcy5ldmVudExvZyB9LFxuICAgICk7XG4gICAgLy8gVGhlIG9ic2VydmVyIChTY29wZUZhY2FkZSkgc2VlcyB0aGUgdHJhY2tlZCBtdXRhdGlvbnMsIFRIRU4gdGhlIHN0YWdpbmdcbiAgICAvLyBzdGF0ZSBpcyByZWxlYXNlZCAoIzEzYiksIHNvIGl0IHNlZXMgdGhlIHdvcmxkIGFzIGl0IHdhcy4gRDIncyBtYXJrZXJzXG4gICAgLy8gYW5kIHRoZSBkZWNsYXJlZCB0YWdzIHJlbGVhc2Ugd2l0aCBpdCDigJQgb25lIHN0YW1wIHBlciBleGVjdXRpb24sIHNvIHRoZVxuICAgIC8vIGVuZ2luZSdzIGRvdWJsZS1jb21taXQgcGF0aHMgcmVjb3JkIHRoZW0gZXhhY3RseSBvbmNlLlxuICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICB9XG4gICAgdGhpcy5idWZmZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdGF0ZVZpZXcgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhpcyBzdGFnZSBoYXMgU1RBR0VELCB3aXRob3V0IGNvbW1pdHRpbmcgYW55IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIHByaW1pdGl2ZSBiZWhpbmQgZGVjbGFyYXRpdmUgcmV0cnk6IHdoZW4gYSBub24tZmluYWwgYXR0ZW1wdFxuICAgKiBmYWlscywgdGhlIHdyaXRlcyBpdCBzdGFnZWQgbXVzdCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbmV4dCBhdHRlbXB0LCBtdXN0XG4gICAqIG5vdCByZWFjaCBzaGFyZWQgc3RhdGUsIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cgb3IgaW4gdGhpc1xuICAgKiBzdGFnZSdzIHNuYXBzaG90LiBEcm9wcGluZyB0aGUgc3RhZ2luZyBzdGF0ZSBhY2hpZXZlcyBhbGwgZm91ciBhdCBvbmNlIOKAlFxuICAgKiB0aGVyZSBpcyBubyByb2xsYmFjayBtYWNoaW5lcnkgdG8gaW52b2tlIGJlY2F1c2Ugbm90aGluZyB3YXMgZXZlciBhcHBsaWVkXG4gICAqIChNMTogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciBob2xkcyB3cml0ZXMgdW50aWwgYGNvbW1pdCgpYCBmbHVzaGVzIHRoZW0pLlxuICAgKlxuICAgKiBXaGF0IGlzIHJlbGVhc2VkLCBhbmQgd2h5IGVhY2ggb25lIG1hdHRlcnMgZm9yIHRoZSBuZXh0IGF0dGVtcHQ6XG4gICAqICAtIGBidWZmZXJgICAgICAg4oCUIHRoZSBzdGFnZWQgd3JpdGVzIHRoZW1zZWx2ZXM7IHRoZSBuZXh0IGF0dGVtcHQgc3RhcnRzXG4gICAqICAgICAgICAgICAgICAgICAgICB3aXRoIG5vdGhpbmcgc3RhZ2VkO1xuICAgKiAgLSBgc3RhdGVWaWV3YCAgIOKAlCB0aGUgZmlyc3QtdG91Y2ggYW5jaG9yOyB0aGUgbmV4dCBhdHRlbXB0IHJlLWFuY2hvcnMgb25cbiAgICogICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZCBzdGF0ZSBhcyBpdCBzdGFuZHMgTk9XIChhIHNpYmxpbmcgZm9yayBicmFuY2hcbiAgICogICAgICAgICAgICAgICAgICAgIG1heSBsZWdpdGltYXRlbHkgaGF2ZSBjb21taXR0ZWQgaW4gYmV0d2Vlbik7XG4gICAqICAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9wZW5kaW5nV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2Ag4oCUIHRoZSBzbmFwc2hvdFxuICAgKiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDsgd2l0aG91dCB0aGUgcmVzZXQgdGhlIGV4ZWN1dGlvbiB0cmVlIHdvdWxkXG4gICAqICAgICAgICAgICAgICAgICAgICByZXBvcnQgd3JpdGVzIHRoYXQgd2VyZSBkaXNjYXJkZWQsIHdoaWNoIGlzIHRoZSBleGFjdFxuICAgKiAgICAgICAgICAgICAgICAgICAgbGllIHRoaXMgZmVhdHVyZSBleGlzdHMgdG8gcHJldmVudCAodGhlIHBlbmRpbmcgbWFwXG4gICAqICAgICAgICAgICAgICAgICAgICBob2xkcyBiYXJlIHJlZmVyZW5jZXMg4oCUIGRyb3BwaW5nIGl0IHVuLWNsb25lcyBub3RoaW5nKTtcbiAgICogIC0gYF9wcm92ZW5hbmNlUmVhZHNgIOKAlCB0aGUgcGVyLXdyaXRlIHJlYWQgcHJlZml4ICgjUDEpOyBhIGRpc2NhcmRlZFxuICAgKiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCdzIHJlYWRzIG11c3QgbmV2ZXIgYXBwZWFyIGluIHRoZSBuZXh0IGF0dGVtcHQnc1xuICAgKiAgICAgICAgICAgICAgICAgICAgYFRyYWNlRW50cnkucmVhZEtleXNgLCBvciBhIGJhY2t3YXJkIHNsaWNlIHdvdWxkIGZvbGxvd1xuICAgKiAgICAgICAgICAgICAgICAgICAgYW4gZWRnZSB0aGF0IG5vIGNvbW1pdHRlZCB3cml0ZSBldmVyIGhhZDtcbiAgICogIC0gYF91bnRyYWNrZWRTb3VyY2VzYCDigJQgdGhlIEQyIGhvbmVzdHkgbWFya2VycywgcmVsZWFzZWQgd2l0aCB0aGUgcmVzdC5cbiAgICpcbiAgICogV2hhdCBpcyBkZWxpYmVyYXRlbHkgS0VQVDogYGRlYnVnYCAobG9ncywgbWV0cmljcywgZXJyb3JzLCBmbG93IG1lc3NhZ2VzKS5cbiAgICogRGlhZ25vc3RpY3MgYXJlIHRoZSBhcHBlbmQtb25seSByZWNvcmQgb2Ygd2hhdCBldmVyeSBhdHRlbXB0IGRpZCwgYW5kIHRoZVxuICAgKiByZXRyeSBmZWF0dXJlJ3Mgd2hvbGUgcG9pbnQgaXMgdGhhdCB0aGUgZWFybGllciBhdHRlbXB0cyBzdGF5IHZpc2libGUuXG4gICAqXG4gICAqIE5vIGNvbW1pdCBpcyByZWNvcmRlZCBhbmQgbm8gb2JzZXJ2ZXIgZmlyZXMg4oCUIGEgZGlzY2FyZGVkIGF0dGVtcHQgaXMgbm90IGFcbiAgICogY3Vyc29yIHN0b3AsIGJlY2F1c2UgZnJvbSBzaGFyZWQgc3RhdGUncyBwb2ludCBvZiB2aWV3IGl0IG5ldmVyIGhhcHBlbmVkLlxuICAgKi9cbiAgZGlzY2FyZFN0YWdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN0YXRlVmlldyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl91bnRyYWNrZWRTb3VyY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Byb3ZlbmFuY2VSZWFkcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YWdlV3JpdGVzID0ge307XG4gICAgdGhpcy5fc3RhZ2VSZWFkcyA9IHt9O1xuICAgIHRoaXMuX25lc3RlZFJlYWRzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZpZXdSZWFkcyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUcmVlIG5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIENyZWF0ZSAob3IgcmV0dXJuKSB0aGlzIGNvbnRleHQncyBsaW5rZWQgc3VjY2Vzc29yLlxuICAgKlxuICAgKiBNRU1PSVpFRDogdGhlIGZpcnN0IGNhbGwgY3JlYXRlcyBgdGhpcy5uZXh0YDsgZXZlcnkgbGF0ZXIgY2FsbCByZXR1cm5zXG4gICAqIHRoYXQgU0FNRSBjb250ZXh0IGFuZCBJR05PUkVTIGl0cyBhcmd1bWVudHMuIEluIG5vcm1hbCB0cmF2ZXJzYWwgZWFjaFxuICAgKiBjb250ZXh0IGFkdmFuY2VzIGV4YWN0bHkgb25jZSwgc28gdGhlIG1lbW8gbmV2ZXIgYml0ZXMg4oCUIGJ1dCBhIGNhbGxlclxuICAgKiBleHBlY3RpbmcgYSBmcmVzaCBjb250ZXh0IGZvciBkaWZmZXJlbnQgYHN0YWdlTmFtZWAvYHN0YWdlSWRgIGFyZ3MgZ2V0c1xuICAgKiB0aGUgb2xkIG9uZSBzaWxlbnRseS4gRGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSB3YXJucyBvbiB0aGF0XG4gICAqIG1pc21hdGNoIChiYWNrbG9nIEI0KS5cbiAgICovXG4gIGNyZWF0ZU5leHQocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLm5leHQpIHtcbiAgICAgIHRoaXMubmV4dCA9IG5ldyBTdGFnZUNvbnRleHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnNoYXJlZE1lbW9yeSwgJycsIHRoaXMuZXZlbnRMb2csIGlzRGVjaWRlcik7XG4gICAgICB0aGlzLm5leHQucGFyZW50ID0gdGhpcztcbiAgICAgIHRoaXMubmV4dC5pbmhlcml0UnVuKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoaXNEZXZNb2RlKCkgJiYgKHRoaXMubmV4dC5zdGFnZUlkICE9PSBzdGFnZUlkIHx8IHRoaXMubmV4dC5zdGFnZU5hbWUgIT09IHN0YWdlTmFtZSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50XSBTdGFnZUNvbnRleHQuY3JlYXRlTmV4dDogbmV4dCBjb250ZXh0IGFscmVhZHkgZXhpc3RzIGFzIFwiJHt0aGlzLm5leHQuc3RhZ2VOYW1lfVwiIGAgK1xuICAgICAgICAgIGAoaWQ6IFwiJHt0aGlzLm5leHQuc3RhZ2VJZH1cIikg4oCUIGFyZ3VtZW50cyBcIiR7c3RhZ2VOYW1lfVwiIChpZDogXCIke3N0YWdlSWR9XCIpIGFyZSBpZ25vcmVkIGAgK1xuICAgICAgICAgICdhbmQgdGhlIGV4aXN0aW5nIGNvbnRleHQgaXMgcmV0dXJuZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5leHQ7XG4gIH1cblxuICBjcmVhdGVDaGlsZChydW5JZDogc3RyaW5nLCBicmFuY2hJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkID0gbmV3IFN0YWdlQ29udGV4dChydW5JZCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnNoYXJlZE1lbW9yeSwgYnJhbmNoSWQsIHRoaXMuZXZlbnRMb2csIGlzRGVjaWRlcik7XG4gICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICBjaGlsZC5pbmhlcml0UnVuKHRoaXMpO1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgY3JlYXRlRGVjaWRlcihwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcpOiBTdGFnZUNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5leHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0cnVlKTtcbiAgfVxuXG4gIHNldEFzRGVjaWRlcigpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNEZWNpZGVyID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEFzRm9yaygpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNGb3JrID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEaWFnbm9zdGljcyBkZWxlZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBAaW50ZXJuYWwgUmV0YWluZWQgaW5jb21pbmcgdmFsdWUgZm9yIHRoZSBmYWNhZGUncyBsZWdhY3kgZW1pdCBjaGFubmVsLiAqL1xuICBhZGREaWFnbm9zdGljKGNoYW5uZWw6IERpYWdub3N0aWNDaGFubmVsLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLmRlYnVnLmFkZChjaGFubmVsLCBrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFcnJvcihrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXJyb3Ioa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRGbG93RGVidWdNZXNzYWdlKFxuICAgIHR5cGU6IEZsb3dDb250cm9sVHlwZSxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107IHJhdGlvbmFsZT86IHN0cmluZzsgY291bnQ/OiBudW1iZXI7IGl0ZXJhdGlvbj86IG51bWJlciB9LFxuICApIHtcbiAgICBjb25zdCBmbG93TWVzc2FnZTogRmxvd01lc3NhZ2UgPSB7IHR5cGUsIGRlc2NyaXB0aW9uLCB0aW1lc3RhbXA6IERhdGUubm93KCksIC4uLm9wdGlvbnMgfTtcbiAgICB0aGlzLmRlYnVnLmFkZEZsb3dNZXNzYWdlKGZsb3dNZXNzYWdlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTbmFwc2hvdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXRTdGFnZUlkKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnJ1bklkIHx8IHRoaXMucnVuSWQgPT09ICcnKSByZXR1cm4gdGhpcy5zdGFnZU5hbWU7XG4gICAgcmV0dXJuIGAke3RoaXMucnVuSWR9LiR7dGhpcy5zdGFnZU5hbWV9YDtcbiAgfVxuXG4gIGdldFNuYXBzaG90KCk6IFN0YWdlU25hcHNob3Qge1xuICAgIC8vIEl0ZXJhdGl2ZSB3YWxrIChleHBsaWNpdCB3b3JrIHN0YWNrKSwgTk9UIHJlY3Vyc2lvbjogdGhlIGV4ZWN1dGlvblxuICAgIC8vIHRyZWUgZGVlcGVucyBieSBvbmUgbGV2ZWwgcGVyIGV4ZWN1dGVkIHN0YWdlIGFsb25nIGBuZXh0YCBjaGFpbnMsIGFuZFxuICAgIC8vIHRoZSB0cmFtcG9saW5lZCB0cmF2ZXJzZXIgYWxsb3dzIGNoYWlucy9sb29wcyBvZiB0ZW5zIG9mIHRob3VzYW5kcyBvZlxuICAgIC8vIHN0YWdlcyDigJQgZmFyIGRlZXBlciB0aGFuIGEgcmVjdXJzaXZlIHNlcmlhbGl6ZXIgY2FuIHdhbGsgYmVmb3JlXG4gICAgLy8gXCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnNuYXBzaG90U2VsZigpO1xuICAgIGNvbnN0IHdvcms6IEFycmF5PHsgY3R4OiBTdGFnZUNvbnRleHQ7IHNuYXA6IFN0YWdlU25hcHNob3QgfT4gPSBbeyBjdHg6IHRoaXMsIHNuYXA6IHJvb3QgfV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBjdHgsIHNuYXAgfSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKGN0eC5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG5leHRTbmFwID0gY3R4Lm5leHQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgIHNuYXAubmV4dCA9IG5leHRTbmFwO1xuICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGN0eC5uZXh0LCBzbmFwOiBuZXh0U25hcCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjdHguY2hpbGRyZW4pIHtcbiAgICAgICAgc25hcC5jaGlsZHJlbiA9IGN0eC5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGRTbmFwID0gY2hpbGQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjaGlsZCwgc25hcDogY2hpbGRTbmFwIH0pO1xuICAgICAgICAgIHJldHVybiBjaGlsZFNuYXA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKiBTbmFwc2hvdCBvZiBUSElTIGNvbnRleHQncyBvd24gZmllbGRzIOKAlCBgbmV4dGAvYGNoaWxkcmVuYCBhcmUgZmlsbGVkXG4gICAqICBpbiBieSB0aGUgaXRlcmF0aXZlIHdhbGsgaW4gYGdldFNuYXBzaG90YC4gKi9cbiAgcHJpdmF0ZSBzbmFwc2hvdFNlbGYoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3Q6IFN0YWdlU25hcHNob3QgPSB7XG4gICAgICBpZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgbmFtZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBpc0RlY2lkZXI6IHRoaXMuaXNEZWNpZGVyLFxuICAgICAgaXNGb3JrOiB0aGlzLmlzRm9yayxcbiAgICAgIGxvZ3M6IHRoaXMuZGVidWcubG9nQ29udGV4dCxcbiAgICAgIGVycm9yczogdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgICBtZXRyaWNzOiB0aGlzLmRlYnVnLm1ldHJpY0NvbnRleHQsXG4gICAgICBldmFsczogdGhpcy5kZWJ1Zy5ldmFsQ29udGV4dCxcbiAgICB9O1xuICAgIGNvbnN0IHN0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzdGFnZVdyaXRlcykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gRXh0cmFjdCB2YWx1ZXMgb25seSBmb3IgdGhlIHNuYXBzaG90IChzdHJpcCBvcGVyYXRpb24gbWV0YWRhdGEpXG4gICAgICBjb25zdCB3cml0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhZ2VXcml0ZXMpKSB7XG4gICAgICAgIHdyaXRlc1trXSA9IGVudHJ5LnZhbHVlO1xuICAgICAgfVxuICAgICAgc25hcHNob3Quc3RhZ2VXcml0ZXMgPSB3cml0ZXM7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5zdGFnZVJlYWRzID0gdGhpcy5fc3RhZ2VSZWFkcztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIHNuYXBzaG90LmRlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3ViZmxvd0lkKSB7XG4gICAgICBzbmFwc2hvdC5zdWJmbG93SWQgPSB0aGlzLnN1YmZsb3dJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LmZsb3dNZXNzYWdlcyA9IHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cbn1cbiJdfQ==
|
|
907
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7OztHQVVHOzs7QUFFSCwwREFBa0Y7QUFDbEYsOENBQTBDO0FBQzFDLCtEQUE4RztBQUM5RyxxRUFBdUY7QUFHdkYsdURBQXNEO0FBQ3RELHFEQUErQztBQUUvQyxpREFBc0Q7QUFFdEQsaURBQW1FO0FBWW5FOzsyQkFFMkI7QUFDM0IsU0FBUyxTQUFTLENBQUMsSUFBYyxFQUFFLEdBQVc7SUFDNUMsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFFN0IsK0ZBQStGO0FBQy9GLE1BQU0sWUFBWSxHQUFzQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTFELDBHQUEwRztBQUMxRyxTQUFTLFVBQVUsQ0FBQyxLQUFhO0lBQy9CLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0FBQ3ZELENBQUM7QUFFRCxNQUFhLFlBQVk7SUFDdkI7Ozs7Ozs7OztPQVNHO0lBQ2MsTUFBTSxDQUFjO0lBQ3JDOzs7Ozs7O09BT0c7SUFDSyxNQUFNLEdBQWMsaUNBQWtCLENBQUM7SUFDL0Msa0ZBQWtGO0lBQzFFLFNBQVMsQ0FBVTtJQUVwQixTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLHVFQUF1RTtJQUNoRSxPQUFPLENBQVM7SUFDdkIscUZBQXFGO0lBQzlFLGNBQWMsR0FBRyxF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Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFnZUNvbnRleHQg4oCUIEV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIHNpbmdsZSBzdGFnZSBpbiBhIGZsb3djaGFydCBydW5cbiAqXG4gKiBMaWtlIGEgc3RhY2sgZnJhbWUgaW4gYSBjb21waWxlci9ydW50aW1lOlxuICogLSBBIFJlY29yZEZyYW1lIOKAlCB0aGUgcmVjb3JkIGhhbGYgKEMzKTogdGhlIGhlYXAsIHRoZSBhZGRyZXNzLCB0aGVcbiAqICAgZmlyc3QtdG91Y2ggYmFzZSwgdGhlIGxhenkgdHJhbnNhY3Rpb24gYnVmZmVyLCB0aGUgcmVhZEtleXMgbGlzdFxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIFdoYXQgYmVsb25ncyB0byBhIHN0YWdlIGluc2lkZSBhIHJ1bjogcmV0ZW50aW9uIG9mIHJlYWRzIGFuZCB3cml0ZXMsIHRoZVxuICogICByZWRhY3Rpb24gdmVyZGljdCBwZXIgd3JpdGUsIHRoZSBkZXYtbW9kZSB3YXJuaW5ncywgdGhlIGNvbW1pdCBvYnNlcnZlclxuICogLSBEaWFnbm9zdGljQ29sbGVjdG9yIGZvciBsb2dzLCBlcnJvcnMsIG1ldHJpY3NcbiAqL1xuXG5pbXBvcnQgeyBzdW1tYXJpemVSZWFkVmFsdWUsIHN1bW1hcml6ZVdyaXRlVmFsdWUgfSBmcm9tICcuLi9jYXB0dXJlL3N1bW1hcml6ZS5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB7IGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlLCBjb21taXR0ZWRNdXRhdGlvbk1lc3NhZ2UsIGZpcnN0RGlmZmVyaW5nUGF0aCB9IGZyb20gJy4vYm9ycm93ZWRNdXRhdGlvbi5qcyc7XG5pbXBvcnQgeyB0eXBlIERpYWdub3N0aWNDaGFubmVsLCBEaWFnbm9zdGljQ29sbGVjdG9yIH0gZnJvbSAnLi9EaWFnbm9zdGljQ29sbGVjdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgRXZlbnRMb2cgfSBmcm9tICcuL0V2ZW50TG9nLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFNvdXJjZVBvc2l0aW9uIH0gZnJvbSAnLi9ldmVudFBvc2l0aW9uLmpzJztcbmltcG9ydCB7IFNDT1BFX1BMQUNFSE9MREVSIH0gZnJvbSAnLi9wbGFjZWhvbGRlcnMuanMnO1xuaW1wb3J0IHsgUmVjb3JkRnJhbWUgfSBmcm9tICcuL1JlY29yZEZyYW1lLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uVmVyZGljdCB9IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IENMRUFSLCBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1ksIHdpdGhSZWRhY3Rpb24gfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29tbWl0UGhhc2UsXG4gIEZsb3dDb250cm9sVHlwZSxcbiAgRmxvd01lc3NhZ2UsXG4gIFJlYWRUcmFja2luZ01vZGUsXG4gIFN0YWdlU25hcHNob3QsXG4gIFVudHJhY2tlZFNvdXJjZSxcbiAgV3JpdGVUcmFja2luZ01vZGUsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogVGhlIHVzZXItbGV2ZWwga2V5IG9mIGEgd3JpdGUgb3IgcmVhZCDigJQgZG90dGVkIG9ubHkgZm9yIGEgbmVzdGVkIHBhdGggKGFcbiAqICBzdWJmbG93IHNlZWQncyBgWydwcm9maWxlJ10gKyAnYXV0aCdgKTsgbm8gYWxsb2NhdGlvbiBmb3IgdGhlIGNvbW1vblxuICogIHNpbmdsZS1zZWdtZW50IGNhc2UuICovXG5mdW5jdGlvbiB1c2VyS2V5T2YocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleTtcbn1cblxuLyoqXG4gKiBUaGUga2V5IHJ1biBuYW1lc3BhY2VzIHNpdCB1bmRlciDigJQgYSBmcmFtZSB3aXRoIHJ1biBpZCBgYzBgIChhIGZvcmsgb3JcbiAqIHNlbGVjdG9yIGNoaWxkIHRha2VzIGl0cyBvd24gaWQgYXQgdGhlIHRvcCBsZXZlbCkgd3JpdGVzIGF0IGBydW5zL2MwL+KApmAuIFRoZVxuICogZW5naW5lJ3Mgb25lIHNwZWxsaW5nIG9mIGl0OiBldmVyeSBmcmFtZSdzIGFkZHJlc3MgaXMgYnVpbHQgZnJvbSBpdFxuICogKHtAbGluayBydW5BZGRyZXNzfSksIGFuZCB0aGUgcmVjb3JkIGxheWVyIHRha2VzIHRoYXQgYWRkcmVzcyBhcyBkYXRhIChDMikuXG4gKi9cbmNvbnN0IFJVTl9OQU1FU1BBQ0UgPSAncnVucyc7XG5cbi8qKiBUaGUgcm9vdCdzIGFkZHJlc3MsIHNoYXJlZCBieSBldmVyeSBmcmFtZSB3aXRob3V0IGEgcnVuIGlkIChtb3N0IG9mIHRoZW0pLiBOZXZlciBlZGl0ZWQuICovXG5jb25zdCBST09UX0FERFJFU1M6IHJlYWRvbmx5IHN0cmluZ1tdID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbi8qKiBXaGVyZSBhIGZyYW1lIHdpdGggcnVuIGlkIGBydW5JZGAgcmVhZHMgYW5kIHdyaXRlczogYFsncnVucycsIDxpZD5dYCwgb3IgYFtdYCAodGhlIHJvb3QpIHdpdGggbm9uZS4gKi9cbmZ1bmN0aW9uIHJ1bkFkZHJlc3MocnVuSWQ6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJ1bklkID8gW1JVTl9OQU1FU1BBQ0UsIHJ1bklkXSA6IFJPT1RfQUREUkVTUztcbn1cblxuZXhwb3J0IGNsYXNzIFN0YWdlQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgcmVjb3JkIGhhbGYgb2YgdGhpcyBmcmFtZSAoYFJlY29yZEZyYW1lLnRzYCwgTDMsIEMzKTogdGhlIGhlYXAgYW5kLFxuICAgKiB3aGVuIHRoZSBydW4ga2VlcHMgdGhlbSwgdGhlIHJlZGFjdGVkIG1pcnJvciBhbmQgdGhlIGxvZzsgdGhlIGFkZHJlc3M7XG4gICAqIHRoZSBmaXJzdC10b3VjaCBiYXNlOyB0aGUgbGF6eSB0cmFuc2FjdGlvbiBidWZmZXI7IHRoZSByZWFkS2V5cyBsaXN0LlxuICAgKiBFdmVyeSBzdGF0ZSByZWFkIG9mIHRoaXMgZnJhbWUgZ29lcyB0aHJvdWdoIGl0LCBhbmQgc28gZG9lcyBldmVyeVxuICAgKiBjb21taXQuIFRoZSBtaXJyb3IgaXMgcHJlc2VudCAqKm9ubHkqKiB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYVxuICAgKiByZWRhY3RlZCB2aWV3IChhIGBSZWRhY3Rpb25Qb2xpY3lgIGlzIGNvbmZpZ3VyZWQpIOKAlCByZWFkIHZpYVxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3IuZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgLCB0aGUgZm91bmRhdGlvbiBmb3JcbiAgICogc2hhcmluZyBhIHRyYWNlIHdpdGhvdXQgbGVha2luZyByYXcgUElJIHRocm91Z2ggYHNoYXJlZFN0YXRlYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb3JkOiBSZWNvcmRGcmFtZTtcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBwb2xpY3kg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGUgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3IgZmxhZ1xuICAgKiAoYHJ1blBvbGljeS50c2AsIEY1KS4gSGVsZCBCWSBSRUZFUkVOQ0U6IG9uZSBmcm96ZW4gb2JqZWN0IHBlciBydW4gKGFuZFxuICAgKiBwZXIgcmVzdW1lKSwgc2hhcmVkIGJ5IGV2ZXJ5IGZyYW1lIG9mIHRoZSBydW4sIGEgc3ViZmxvdydzIGluY2x1ZGVkIOKAlFxuICAgKiB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfSBwYXNzIHRoZSByZWZlcmVuY2VcbiAgICogKHtAbGluayBpbmhlcml0UnVufSksIHRoZSBydW50aW1lIGluc3RhbGxzIGl0IG9uIGl0cyByb290XG4gICAqICh7QGxpbmsgdXNlUG9saWN5fSkuIE5ldmVyIGVkaXRlZDsgYSBjaGFuZ2UgaXMgYSBuZXcgb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBwb2xpY3k6IFJ1blBvbGljeSA9IERFRkFVTFRfUlVOX1BPTElDWTtcbiAgLyoqIFRoZSBlbWl0dGluZyBmcmFtZSdzIGxvZ2ljYWwgbGVnLCBuZXZlciB0aGUgbXV0YWJsZSBleGVjdXRvcidzIGN1cnJlbnQgbGVnLiAqL1xuICBwcml2YXRlIGVtaXRSdW5JZD86IHN0cmluZztcblxuICBwdWJsaWMgc3RhZ2VOYW1lID0gJyc7XG4gIC8qKiBVbmlxdWUgc3RhZ2UgaWRlbnRpZmllciBmcm9tIHRoZSBidWlsZGVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHB1YmxpYyBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIFNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIHN0YWdlIGV4ZWN1dGlvbi4gKi9cbiAgcHVibGljIHJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gIC8qKlxuICAgKiBEZWNsYXJlZCB0YWdzICg5LjIxLjApIGZvciB0aGUgc3RhZ2UgdGhpcyBjb250ZXh0IGlzIGV4ZWN1dGluZy4gU2V0IGJ5XG4gICAqIHRoZSB0cmF2ZXJzZXIgYmVzaWRlIGBydW50aW1lU3RhZ2VJZGAgKHBlci1ub2RlIGlkZW50aXR5IOKAlCBOT1QgaW5oZXJpdGVkXG4gICAqIGJ5IGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGApLCByZWNvcmRlZCBvbiB0aGUgZmlyc3QgYnVuZGxlXG4gICAqIGBjb21taXQoKWAgd3JpdGVzLCB0aGVuIHJlbGVhc2VkIHNvIGEgcm91dGluZSBzZWNvbmQgY29tbWl0IG9uIHRoZSBzYW1lXG4gICAqIGNvbnRleHQgKGEgZm9yayBjaGlsZCdzIGZhbi1vdXQgcmVwZWF0LCBhIG1vdW50J3MgZXhpdCBidW5kbGUpIGNhcnJpZXNcbiAgICogbm9uZSDigJQgdGhlIHNhbWUgb25jZS1wZXItZXhlY3V0aW9uIGxhdyBgX3VudHJhY2tlZFNvdXJjZXNgIGtlZXBzLlxuICAgKi9cbiAgcHVibGljIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBydW4gdGhpcyBmcmFtZSBiZWxvbmdzIHRvIOKAlCBpdHMgaWRlbnRpdHkgb24gZXZlcnkgZXZlbnQsIGFuZCB0aGUgcnVuXG4gICAqIG5hbWVzcGFjZSBpdCByZWFkcyBhbmQgd3JpdGVzIGluICh7QGxpbmsgcnVuQWRkcmVzc30pLCByZWFkIG9uY2UsIHdoZW4gdGhlXG4gICAqIGZyYW1lIGlzIGJ1aWx0IChDMykuIE9ubHkge0BsaW5rIHVzZUFkZHJlc3NPZn0gbW92ZXMgdGhlIGFkZHJlc3MgYWZ0ZXJcbiAgICogdGhhdCwgYW5kIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1biBuYW1lc3BhY2UgdGhpcyBmcmFtZSB3cml0ZXMgYW5kIHJlYWRzIGluIHdoZW4gdGhhdCBpcyBub3QgaXRzIG93blxuICAgKiBgcnVuSWRgIOKAlCBzZXQgb25jZSwgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlLCBieVxuICAgKiB7QGxpbmsgdXNlQWRkcmVzc09mfS4gSXRzIG9uZSB1c2VyIGlzIGEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgKFIxMyk6XG4gICAqIHRoZSByZWNvcmQgbmFtZXMgdGhlIG1vdW50LCB0aGUgdmFsdWVzIGxhbmQgd2hlcmUgdGhlIG1vdW50J3MgcGFyZW50XG4gICAqIHdyaXRlcy4gQWJzZW50IOKGkiBgcnVuSWRgLCBzbyBldmVyeSBvdGhlciBmcmFtZSBpcyB1bnRvdWNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFkZHJlc3NSdW5JZD86IHN0cmluZztcbiAgcHVibGljIGJyYW5jaElkPzogc3RyaW5nO1xuICBwdWJsaWMgaXNEZWNpZGVyOiBib29sZWFuO1xuICBwdWJsaWMgaXNGb3JrOiBib29sZWFuO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZnJvbSBidWlsZGVyIChzZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBleGVjdXRpb24pLiAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIgKHNldCBieSB0cmF2ZXJzZXIgd2hlbiB0aGlzIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludCkuICovXG4gIHB1YmxpYyBzdWJmbG93SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHBhcmVudD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIG5leHQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBjaGlsZHJlbj86IFN0YWdlQ29udGV4dFtdO1xuXG4gIHB1YmxpYyBkZWJ1ZzogRGlhZ25vc3RpY0NvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCgpID0+IHRoaXMucG9saWN5LnJlZGFjdGlvbik7XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHdyaXRlcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldyBhbmQgb25Db21taXRcbiAgICogIOKAlCBpbiB0aGVpciBSRVRBSU5FRCBmb3JtIChjbG9uZWQgLyBzdW1tYXJpc2VkIC8gcmVkYWN0ZWQpLiBGaWxsZWQgZnJvbVxuICAgKiAge0BsaW5rIF9wZW5kaW5nV3JpdGVzfSBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9IGF0IGNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VXcml0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZXMgb2YgdGhlIENVUlJFTlQgZXhlY3V0aW9uLCBoZWxkIGJ5IHJlZmVyZW5jZSB3aXRoIHRoZSB2ZXJkaWN0XG4gICAqIHRoZXkgd2VyZSBzdGFnZWQgdW5kZXIgKDkuMjMuMCkuIEEga2V5IHdyaXR0ZW4gayB0aW1lcyBob2xkcyBpdHMgTEFTVFxuICAgKiB2YWx1ZTsgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBgd3JpdGVUcmFja2luZ2AgY2xvbmUgb3Igc3VtbWFyeSwgdGhlXG4gICAqIHJlZGFjdGlvbiBwbGFjZWhvbGRlciBvciBmaWVsZCBzY3J1YikgaXMgdGFrZW4gT05DRSBwZXIga2V5IGF0IGNvbW1pdCDigJRcbiAgICogc2VlIHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30uIFNhbWUgbGF3IGFzIHRoZSB0cmFuc2FjdGlvbiBidWZmZXInc1xuICAgKiBwYXRjaCB0cmVlczogdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyBwYWlkIGF0IHRoZSBib3VuZGFyeSwgbm90IGF0XG4gICAqIGV2ZXJ5IHdyaXRlLiBMYXppbHkgYWxsb2NhdGVkOyBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzIHBheXMgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdXcml0ZXM/OiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHsgdmFsdWU6IHVua25vd247IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3Q7IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH1cbiAgPjtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgcmVhZHMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcuICovXG4gIHByaXZhdGUgX3N0YWdlUmVhZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBgX3N0YWdlUmVhZHNgIGtleXMgdGhhdCB3ZXJlIHJlYWQgYXQgYSBORVNURUQgcGF0aCAoYGdldFZhbHVlKHBhdGgsXG4gICAqIGtleSlgIHdpdGggYSBub24tZW1wdHkgYHBhdGhgKS4gT25seSB0aGUgZW5naW5lIHJlYWRzIHRoYXQgd2F5IOKAlCB0aGVcbiAgICogZmFjYWRlIHJlYWRzIHJvb3RzIOKAlCBzbyB0aGVzZSBhcmUgbm90IHVzZXIgcmVhZHMgYW5kIHRoZSBib3Jyb3dlZC1yZWFkXG4gICAqIGd1YXJkIHNraXBzIHRoZW0gYnkgdGhpcyBtYXJrZXIsIG5ldmVyIGJ5IGd1ZXNzaW5nIGZyb20gYSBkb3QgaW4gdGhlIGtleVxuICAgKiAoYSB1c2VyJ3MgdG9wLWxldmVsIGtleSBtYXkgaXRzZWxmIGNvbnRhaW4gb25lKS4gTGF6aWx5IGNyZWF0ZWQ7IHRoZVxuICAgKiBmYWNhZGUgcGF0aCBuZXZlciBhbGxvY2F0ZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIF9uZXN0ZWRSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBEZXYgbW9kZSBvbmx5OiB0aGUgcm9vdCBrZXlzIHdob3NlIExBU1QgdHJhY2tlZCByZWFkIHdhcyBzZXJ2ZWQgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUg4oCUIGJlZm9yZSB0aGlzIHN0YWdlJ3MgZmlyc3Qgd3JpdGUsIHdoZW4gbm8gdHJhbnNhY3Rpb25cbiAgICogYnVmZmVyIGV4aXN0cyB5ZXQuIFN1Y2ggYSByZWFkIGlzIHRoZSBjb21taXR0ZWQgb2JqZWN0IGl0c2VsZiwgc28gYW5cbiAgICogaW4tcGxhY2UgZWRpdCBvZiBpdCBtb3ZlcyB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIHRvbyAoY29weS1vbi13cml0ZSxcbiAgICogOS4yOS4wKTsge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259IGNoZWNrcyB0aGVzZSBrZXlzIGV2ZW4gd2hlbiB0aGVcbiAgICogc3RhZ2Ugd3JvdGUgdGhlbS4gTmV2ZXIgYWxsb2NhdGVkIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIF92aWV3UmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogSGFzIHRoaXMgZnJhbWUgY29tbWl0dGVkIGF0IGxlYXN0IG9uY2U/IFRoZSBib3Jyb3dlZC1yZWFkIGd1YXJkIHJ1bnMgb25cbiAgICogdGhlIEZJUlNUIGNvbW1pdCBvbmx5IOKAlCBzZWUge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259LiBUaGUgZnJhbWVcbiAgICogaXRzZWxmIHN0YXlzIHJlLXVzYWJsZSBhZnRlciBjb21taXQgKCMxM2IpOiB0aGUgZW5naW5lJ3MgZG91YmxlLWNvbW1pdFxuICAgKiBwYXRocyBhbmQgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgYnJhbmNoIHBhcmVudCByZWx5IG9uIGl0LiBUaGVcbiAgICogdXNlci1sZXZlbCByZWZ1c2FsIG9mIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgbGl2ZXMgYXQgdGhlIHNjb3BlXG4gICAqIHRpZXIgKGBTY29wZUZhY2FkZWAsIG9uZSBwZXIgc3RhZ2UgZXhlY3V0aW9uKSwgbm90IGhlcmUuXG4gICAqL1xuICBwcml2YXRlIF9jb21taXR0ZWQgPSBmYWxzZTtcblxuICAvKiogVHJhY2tlZCByZWFkcyBvZiBhIHNlbGVjdGVkIHZhbHVlICh7QGxpbmsgc2VsZWN0ZWRSZWFkc30pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZFJlYWRzID0gMDtcbiAgLyoqIEVhY2ggb2JqZWN0IHRoaXMgZnJhbWUgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUg4oaSIHRoYXQgcmVhZCdzIHZlcmRpY3QgKGBzdGFnZVdyaXRlYCBoYW5kcyBpdCBvbikuICovXG4gIHByaXZhdGUgX3NlbGVjdGVkT2JqZWN0cz86IFdlYWtNYXA8b2JqZWN0LCBSZWRhY3Rpb25WZXJkaWN0PjtcblxuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlcnMg4oCUIHVudHJhY2tlZCByZWFkIHBhdGhzIHVzZWQgZHVyaW5nIFRISVNcbiAgICogc3RhZ2UncyBleGVjdXRpb24gKGAnYXJncydgIC8gYCdlbnYnYCAvIGAnc2lsZW50J2ApLiBNYXJrZWQgYnlcbiAgICogYFNjb3BlRmFjYWRlYCwgc3VyZmFjZWQgb24gdGhlIHN0YWdlJ3MgQ29tbWl0QnVuZGxlIGFzXG4gICAqIGB1bnRyYWNrZWRTb3VyY2VzYCwgdGhlbiBSRUxFQVNFRCB3aXRoIHRoZSBzdGFnaW5nIHN0YXRlIGF0IGNvbW1pdCBlbmRcbiAgICogKHNvIHRoZSByb3V0aW5lIGRvdWJsZS1jb21taXQgcGF0aHMg4oCUIGZvcmsgY2hpbGRyZW4sIHN1YmZsb3cgbW91bnRzIOKAlFxuICAgKiByZWNvcmQgdGhlIGZpZWxkIGV4YWN0bHkgb25jZSwgb24gdGhlIGZpcnN0IGNvbW1pdCkuIExhemlseSBhbGxvY2F0ZWQ6XG4gICAqIHN0YWdlcyB0aGF0IG5ldmVyIHRvdWNoIGFuIHVudHJhY2tlZCBwYXRoIHBheSBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfdW50cmFja2VkU291cmNlcz86IFNldDxVbnRyYWNrZWRTb3VyY2U+O1xuXG4gIC8qKiBPYnNlcnZlciBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkg4oCUIHVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZmlyZSBTY29wZVJlY29yZGVyLm9uQ29tbWl0LiAqL1xuICBwcml2YXRlIF9jb21taXRPYnNlcnZlcj86IChcbiAgICBtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+LFxuICApID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5LFxuICAgIGJyYW5jaElkPzogc3RyaW5nLFxuICAgIGV2ZW50TG9nPzogRXZlbnRMb2csXG4gICAgaXNEZWNpZGVyPzogYm9vbGVhbixcbiAgKSB7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuc3RhZ2VOYW1lID0gbmFtZTtcbiAgICB0aGlzLnN0YWdlSWQgPSBzdGFnZUlkO1xuICAgIHRoaXMucmVjb3JkID0gbmV3IFJlY29yZEZyYW1lKHNoYXJlZE1lbW9yeSwgZXZlbnRMb2csIHJ1bkFkZHJlc3MocnVuSWQpKTtcbiAgICB0aGlzLnJlY29yZC51c2VFbmNvZGluZyh0aGlzLnBvbGljeSk7XG4gICAgdGhpcy5icmFuY2hJZCA9IGJyYW5jaElkO1xuICAgIHRoaXMuaXNEZWNpZGVyID0gISFpc0RlY2lkZXI7XG4gICAgdGhpcy5pc0ZvcmsgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBTaGFyZWRNZW1vcnkgaW5zdGFuY2UgKG5lZWRlZCBieSBzY29wZSBsYXllcikuICovXG4gIGdldFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5zdGF0ZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgU3RhbXBlZCBiZXNpZGUgcnVudGltZVN0YWdlSWQsIGJlZm9yZSBzY29wZSBjb25zdHJ1Y3Rpb24uICovXG4gIGJpbmRFbWl0T3JpZ2luKHJ1bklkOiBzdHJpbmcsIGRyaWxsUGF0aDogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXRSdW5JZCA9IGRyaWxsUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcnVuSWQ7XG4gICAgaWYgKGRyaWxsUGF0aCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5sb2c/LmJpbmRBZGRyZXNzKHJ1bklkLCBkcmlsbFBhdGgpO1xuICB9XG5cbiAgLyoqIENhcHR1cmUgZnJvbSB0aGlzIGZyYW1lJ3MgT1dOIGxvZy4gQSBtYW51YWwvdW5hZGRyZXNzYWJsZSBmcmFtZSBzdGF5cyB1bmtub3duLiAqL1xuICBjYXB0dXJlRW1pdFBvc2l0aW9uKCk6IEVtaXRTb3VyY2VQb3NpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdFJ1bklkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnJlY29yZC5sb2c/LmNhcHR1cmVQb3NpdGlvbih0aGlzLmVtaXRSdW5JZCk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvci4gU3Vic2VxdWVudCBgY29tbWl0KClgIGNhbGxzIGFwcGx5XG4gICAqIHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMg4oCUIHRoZSBvbmVzIHRoZSBsb2cgcmVjb3JkcyDigJQgdG9cbiAgICogdGhpcyBtaXJyb3IsIGJlc2lkZSB0aGUgcmF3IHBhdGNoZXMgb24gdGhlIGhlYXAgKGByZWNvcmRDb21taXRgKS5cbiAgICogQ2hpbGQgLyBuZXh0IGNvbnRleHRzIGluaGVyaXQgdGhlIG1pcnJvciB2aWEgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYC5cbiAgICpcbiAgICogQ2FsbGVkIG9uIGEgcnVudGltZSdzIHJvb3QgZnJhbWUgYnkgYEV4ZWN1dGlvblJ1bnRpbWVgIHdoZW4gdGhlIHJ1bidzIHBvbGljeSBrZWVwcyBhIG1pcnJvci5cbiAgICovXG4gIHVzZVJlZGFjdGVkTWlycm9yKG1pcnJvcjogU2hhcmVkTWVtb3J5KTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQudXNlTWlycm9yKG1pcnJvcik7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcmVkYWN0ZWQgbWlycm9yIGlmIGluc3RhbGxlZCwgZWxzZSB1bmRlZmluZWQuICovXG4gIGdldFJlZGFjdGVkU2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLm1pcnJvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBwb2xpY3kgKGBydW5Qb2xpY3kudHNgKSBvbiB0aGlzIGZyYW1lIOKAlCBjYWxsZWQgb24gYVxuICAgKiBydW50aW1lJ3Mgcm9vdCBieSBgRXhlY3V0aW9uUnVudGltZWAgKGF0IGNvbnN0cnVjdGlvbiwgYW5kIGJ5XG4gICAqIGBFeGVjdXRpb25SdW50aW1lLnVzZVBvbGljeWAgb24gYSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSkuIERlc2NlbmRhbnRzIGdldFxuICAgKiB0aGUgc2FtZSByZWZlcmVuY2UgdGhyb3VnaCB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfTsgYVxuICAgKiBzdWJmbG93J3MgcnVudGltZSBpcyBjb25zdHJ1Y3RlZCB3aXRoIGl0LCBzbyBpdHMgc2VlZCBmcmFtZSBhbmQgZXZlcnlcbiAgICogZnJhbWUgYWZ0ZXIgY29tbWl0IHVuZGVyIHRoZSBydW4ncyBkaWFscyB0b28uXG4gICAqL1xuICB1c2VQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLmFkb3B0UG9saWN5KHBvbGljeSk7XG4gIH1cblxuICAvKiogVGhlIHJ1bidzIHBvbGljeSB0aGlzIGZyYW1lIHJldGFpbnMsIGVuY29kZXMgYW5kIHNjcnVicyB1bmRlci4gKi9cbiAgZ2V0UG9saWN5KCk6IFJ1blBvbGljeSB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSByZWRhY3Rpb24gcnVsZSDigJQgdGhlIE9ORSBvd25lciBvZiBcIndoYXQgZG9lcyB0aGUgcG9saWN5IHNheVxuICAgKiBhYm91dCB0aGlzIHBhdGhcIiAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKSDigJQgYXMgYSBORVcgcG9saWN5IGZvciB0aGlzIGZyYW1lXG4gICAqICh0aGUgc2hhcmVkIG9uZSBpcyBuZXZlciBlZGl0ZWQpLiBVbmRlciBhbiBleGVjdXRvciB0aGUgcnVsZSBhcnJpdmVzXG4gICAqIHdpdGggdGhlIHJ1bidzIHBvbGljeTsgdGhpcyBkb29yIGlzIGZvciBhIGBTY29wZUZhY2FkZWAgb24gYSBiYXJlIGZyYW1lXG4gICAqICh1bml0IHRlc3RzLCBoYW5kLWJ1aWx0IHNjb3BlcyksIHdoaWNoIGJyaW5ncyBpdHMgb3duIHJ1bGUuIEV2ZXJ5IHN0YWdlZFxuICAgKiB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIGFza3MgaXQsIHNvIGEgd3JpdGUgdGhhdCBuZXZlciBwYXNzZXMgYVxuICAgKiBmYWNhZGUg4oCUIGEgc3ViZmxvdyBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCBhIHJlc3VtZSByZS1zZWVkIOKAlFxuICAgKiBpcyByZXRhaW5lZCB1bmRlciB0aGUgc2FtZSB2ZXJkaWN0IGFzIGEgZmFjYWRlIHdyaXRlLiBBYnNlbnQ6IGV2ZXJ5XG4gICAqIHZlcmRpY3QgaXMgYCdjbGVhcidgIHVubGVzcyB0aGUgY2FsbGVyIHBhc3NlZCBhbiBleHBsaWNpdCBmbGFnLlxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUnVsZShydWxlOiBSZWRhY3Rpb25SdWxlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9saWN5LnJlZGFjdGlvbiAhPT0gcnVsZSkgdGhpcy5hZG9wdFBvbGljeSh3aXRoUmVkYWN0aW9uKHRoaXMucG9saWN5LCBydWxlKSk7XG4gIH1cblxuICAvKiogVGhlIGluc3RhbGxlZCByZWRhY3Rpb24gcnVsZSwgaWYgYW55ICh0aGUgZmFjYWRlJ3MgbG9va3VwKS4gKi9cbiAgZ2V0UmVkYWN0aW9uUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgdGhlIHJ1biBmcm9tIGBmcm9tYDogdGhlIHBvbGljeSAoYnkgcmVmZXJlbmNlKSBhbmQgdGhlIHJ1bidzIG1pcnJvclxuICAgKiBzdG9yZS4gVGhlIE9ORSBpbmhlcml0YW5jZSBzdGVwIOKAlCB7QGxpbmsgY3JlYXRlTmV4dH0gYW5kXG4gICAqIHtAbGluayBjcmVhdGVDaGlsZH0gYm90aCBjYWxsIGl0LCBhbmQgaXQgbmFtZXMgbm8gZGlhbC5cbiAgICovXG4gIHByaXZhdGUgaW5oZXJpdFJ1bihmcm9tOiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICB0aGlzLmFkb3B0UG9saWN5KGZyb20ucG9saWN5KTtcbiAgICB0aGlzLnJlY29yZC51c2VNaXJyb3IoZnJvbS5yZWNvcmQubWlycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgT05FIHBsYWNlIHRoaXMgZnJhbWUncyBwb2xpY3kgY2hhbmdlczogdGhlIGZyYW1lIGhvbGRzIGl0LCBhbmQgaXRzXG4gICAqIHJlY29yZCBmcmFtZSBlbmNvZGVzIHVuZGVyIHRoZSBzYW1lIHJlZmVyZW5jZSAoYGNvbW1pdFZhbHVlc2AsXG4gICAqIGB3cml0ZVByb3ZlbmFuY2VgIOKAlCBgUmVjb3JkRnJhbWUgwrcgdXNlRW5jb2RpbmdgKSwgc28gdGhlIHR3byBuZXZlciBkaWZmZXIuXG4gICAqL1xuICBwcml2YXRlIGFkb3B0UG9saWN5KHBvbGljeTogUnVuUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgdGhpcy5yZWNvcmQudXNlRW5jb2RpbmcocG9saWN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSB0cmFja2VkIHVzZXItbGV2ZWwgd3JpdGUsIHBvbGljeS1nYXRlZCAoIzEzYy1BKSDigJQgdGhlIHNpbmdsZVxuICAgKiBib29ra2VlcGluZyBwYXRoIGZvciB7QGxpbmsgc2V0T2JqZWN0fSBhbmQge0BsaW5rIHVwZGF0ZU9iamVjdH0uIEhvbGRzXG4gICAqIHRoZSBSRUZFUkVOQ0UgYW5kIHRoZSB2ZXJkaWN0ICg5LjIzLjApOyB0aGUgcmV0YWluZWQgZm9ybSBpcyB0YWtlbiBhdFxuICAgKiBjb21taXQgYnkge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfSwgb25jZSBwZXIga2V5LlxuICAgKlxuICAgKiBSZWRhY3Rpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBkaWFsIGluIEVWRVJZIG1vZGU6IGEgcmVkYWN0ZWRcbiAgICogd3JpdGUgc3RvcmVzIHRoZSBgJ1tSRURBQ1RFRF0nYCBwbGFjZWhvbGRlciB1bmRlciBgJ2Z1bGwnYCBBTkRcbiAgICogYCdzdW1tYXJ5J2AgKGEgc3VtbWFyeSBtYXJrZXIgd291bGQgbGVhayB0aGUgdmFsdWUncyBwcmV2aWV3L3NpemUpLFxuICAgKiBhbmQgc3RvcmVzIG5vdGhpbmcgdW5kZXIgYCdvZmYnYCAoZW50cnkgc2tpcHBlZCBlbnRpcmVseSDigJQgbm90aGluZyB0b1xuICAgKiBsZWFrKS4gQSBmaWVsZC1sZXZlbCB2ZXJkaWN0IHNjcnVicyBhIGNsb25lIEJFRk9SRSB0aGUgZGlhbCBzZWVzIGl0LCBzb1xuICAgKiBhIHN1bW1hcnkgcHJldmlldyBjYW4gbmV2ZXIgc2hvdyB0aGUgc2VjcmV0IGVpdGhlci4gVGhlIHZlcmRpY3QgaXMgdGhlXG4gICAqIG9uZSBgc3RhZ2VXcml0ZWAgYXNrZWQgdGhlIHJ1bGUgZm9yIEJFRk9SRSBzdGFnaW5nLCBjYXJyaWVkIHRvIGNvbW1pdFxuICAgKiB3aXRoIHRoZSB2YWx1ZS4gVGhlIHN0YWdlZCB3cml0ZSBpdHNlbGYgaXMgdW5hZmZlY3RlZCDigJQgcmVkYWN0aW9uIG9mXG4gICAqIHRoZSBjb21taXR0ZWQgcGF5bG9hZCBpcyBoYW5kbGVkIGJ5IHRoZSB0cmFuc2FjdGlvbiBidWZmZXInc1xuICAgKiBgcmVkYWN0ZWRQYXRoc2AuXG4gICAqL1xuICBwcml2YXRlIHRyYWNrV3JpdGUoXG4gICAgdXNlcktleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScsXG4gICkge1xuICAgIGlmICh0aGlzLnBvbGljeS53cml0ZVRyYWNraW5nID09PSAnb2ZmJykgcmV0dXJuO1xuICAgICh0aGlzLl9wZW5kaW5nV3JpdGVzID8/PSBuZXcgTWFwKCkpLnNldCh1c2VyS2V5LCB7IHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogYF9zdGFnZVdyaXRlc2Agd2l0aCBldmVyeSBwZW5kaW5nIHdyaXRlIGZvbGRlZCBpbiBhcyBpdHMgcmV0YWluZWQgZm9ybVxuICAgKiDigJQgdGhlIHJlY29yZCBhIHJlYWRlciBzZWVzLiBDb25zdW1lcyBub3RoaW5nOiBhIG1pZC1ydW4gc25hcHNob3QgcmVhZHNcbiAgICogdGhlIHdyaXRlcyBzbyBmYXIsIGFuZCBjb21taXQgc3RpbGwgbWF0ZXJpYWxpc2VzIHRoZSBmaW5hbCB2YWx1ZXMuXG4gICAqIFJldHVybnMgYF9zdGFnZVdyaXRlc2AgaXRzZWxmIHdoZW4gbm90aGluZyBpcyBwZW5kaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRhaW5lZFdyaXRlcygpOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm4gdGhpcy5fc3RhZ2VXcml0ZXM7XG4gICAgY29uc3Qgb3V0ID0geyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgd10gb2YgdGhpcy5fcGVuZGluZ1dyaXRlcykge1xuICAgICAgb3V0W2tleV0gPSB7XG4gICAgICAgIHZhbHVlOiB0aGlzLnJldGFpbmVkRm9ybSh3LnZlcmRpY3QsIHcudmFsdWUsIHRoaXMucG9saWN5LndyaXRlVHJhY2tpbmcsIHN1bW1hcml6ZVdyaXRlVmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246IHcub3BlcmF0aW9uLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSByZXRhaW5lZCBmb3JtIG9mIGV2ZXJ5IHBlbmRpbmcgd3JpdGUg4oCUIE9OQ0UgcGVyIGtleSwgZnJvbSB0aGVcbiAgICogdmFsdWUgYXMgaXQgc3RhbmRzIGF0IGNvbW1pdCAoOS4yMy4wKSDigJQgYW5kIHJlbGVhc2UgdGhlIHJlZmVyZW5jZXMuIFRoZVxuICAgKiBmaXJzdCB0aGluZyBgY29tbWl0KClgIGRvZXMsIHNvIHRoZSBib3Jyb3dlZC1tdXRhdGlvbiBndWFyZCBhbmQgdGhlXG4gICAqIGNvbW1pdCBvYnNlcnZlciBzZWUgdGhlIGZpbmlzaGVkIHJlY29yZC5cbiAgICovXG4gIHByaXZhdGUgbWF0ZXJpYWxpc2VXcml0ZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3N0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZWxlYXNlZCBldmVuIHdoZW4gYSByZXRhaW5lZCBmb3JtIGNhbm5vdCBiZSB0YWtlbiDigJQgYW4gdW5jbG9uZWFibGVcbiAgICAgIC8vIHZhbHVlIChhIGZ1bmN0aW9uLCBhIFByb3h5KSBpcyBhIGNvbnRyYWN0IHZpb2xhdGlvbiAoXCJzdGF0ZSB2YWx1ZXNcbiAgICAgIC8vIG11c3Qgc3Vydml2ZSBzdHJ1Y3R1cmVkQ2xvbmVcIikgdGhhdCBub3cgc3VyZmFjZXMgSEVSRSwgYXQgY29tbWl0LFxuICAgICAgLy8gYW5kIGZhaWxzIHRoZSBydW4gbG91ZGx5OyBhIGxhdGVyIHNuYXBzaG90IG9mIHRoZSBmYWlsZWQgcnVuIG11c3RcbiAgICAgIC8vIG5vdCB0aHJvdyB0aGUgc2FtZSBlcnJvciBhZ2Fpbi5cbiAgICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIG9mIGEgdmFsdWUgdGhlIGVuZ2luZSBSRVRBSU5TIChyZWFkcyBhbmQgd3JpdGVzIHJldGVudGlvbik6XG4gICAqIHRoZSBwbGFjZWhvbGRlciBiZWF0cyBldmVyeSBkaWFsOyBhIGZpZWxkLWxldmVsIHNjcnViIGhhcHBlbnMgYmVmb3JlIHRoZVxuICAgKiBkaWFsIHNlZXMgdGhlIHZhbHVlOyBhIGNsZWFyIHZhbHVlIGlzIHN1bW1hcml6ZWQgb3IgY2xvbmVkIGFzIHRoZSBkaWFsXG4gICAqIHNheXMuIENhbGxlcnMgaGFuZGxlIGB1bmRlZmluZWRgIGJlZm9yZSBhc2tpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkRm9ybShcbiAgICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG1vZGU6IFJlYWRUcmFja2luZ01vZGUgfCBXcml0ZVRyYWNraW5nTW9kZSxcbiAgICBzdW1tYXJpemU6ICh2YWx1ZTogdW5rbm93bikgPT4gdW5rbm93bixcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFNDT1BFX1BMQUNFSE9MREVSO1xuICAgIGNvbnN0IHNjcnViYmVkID0gdmVyZGljdC5raW5kID09PSAnZmllbGRzJyA/IFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtb2RlID09PSAnc3VtbWFyeScpIHJldHVybiBzdW1tYXJpemUoc2NydWJiZWQgPz8gdmFsdWUpO1xuICAgIHJldHVybiBzY3J1YmJlZCA/PyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBydWxlIHdpdGggc29tZXRoaW5nIHRvIHNheSDigJQgYHVuZGVmaW5lZGAgb24gdGhlIG5vLXBvbGljeSBwYXRoIChub1xuICAgKiBydWxlIGluc3RhbGxlZCwgb3IgYSBydWxlIHdpdGggbm8gcG9saWN5IGVudHJpZXMgYW5kIG5vIG1hcmtlZCBrZXlzKSwgc29cbiAgICogYSB0cmFja2VkIHJlYWQgb3IgYSBzdGFnZWQgd3JpdGUgdGhlcmUgcGF5cyBubyB2ZXJkaWN0IGNhbGwgYW5kIG5vIHBhdGhcbiAgICogYWxsb2NhdGlvbi4gVGhlIGRlZmF1bHQgcnVuIGlzIGJ5dGUtaWRlbnRpY2FsIEFORCBjb3N0LWlkZW50aWNhbC5cbiAgICovXG4gIHByaXZhdGUgYWN0aXZlUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBydWxlID0gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgJiYgIXJ1bGUuaXNJbmVydCgpID8gcnVsZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUSEUgT05FIEZVTk5FTCBldmVyeSBzdGFnZWQgd3JpdGUgcGFzc2VzIHRocm91Z2gg4oCUIGZhY2FkZSB3cml0ZXMgQU5EXG4gICAqIHRoZSBwYXRocyB0aGF0IGJ5cGFzcyB0aGUgZmFjYWRlIChzdWJmbG93IHNlZWQsIGBvdXRwdXRNYXBwZXJgXG4gICAqIG1lcmdlLWJhY2ssIHJlc3VtZSByZS1zZWVkKS4gVGhlIE9ORSBkZWNpc2lvbiBpcyBtYWRlIGhlcmU6IGFuIGV4cGxpY2l0XG4gICAqIHBlci1jYWxsIGZsYWcgbWFrZXMgdGhlIHZhbHVlIHNlY3JldCBvdXRyaWdodCAoYW5kIG1hcmtzIHRoZSBrZXkgZm9yIHRoZVxuICAgKiByZXN0IG9mIHRoZSBydW4sIHRoZSBkZWNsYXJlLW9uY2UgY29udHJhY3QpOyBvdGhlcndpc2UgdGhlIGluc3RhbGxlZFxuICAgKiBydWxlIGRlY2lkZXMgZnJvbSB0aGUgdXNlci1sZXZlbCBwYXRoLiBJdCBzdGFnZXMgdGhlIHdyaXRlLCByZWdpc3RlcnNcbiAgICogdGhlIHJlZGFjdGVkIHBhdGhzIHRoZSBjb21taXQgbG9nIGFuZCBtaXJyb3Igd2lsbCBzY3J1YiAod2hvbGUga2V5LCBvclxuICAgKiB0aGUgZmllbGRzIGluc2lkZSB0aGUgdmFsdWUpLCBhbmQga2VlcHMgdGhlIHJ1bidzIG1hcmtlZC1rZXlzIHNldCBpblxuICAgKiBzdGVwIChhIHdob2xlIHZlcmRpY3QgbWFya3MgaXRzIGtleTsgYSBkZWxldGUgY2xlYXJzIHRoZSBtYXJrKS4gUmV0dXJuc1xuICAgKiB0aGUgdmVyZGljdCBzbyB0aGUgY2FsbGVyIHJldGFpbnMgYW5kIHJlcG9ydHMgdW5kZXIgdGhlIHNhbWUgZGVjaXNpb24uXG4gICAqL1xuICBwcml2YXRlIHN0YWdlV3JpdGUoXG4gICAgbnNQYXRoOiBzdHJpbmdbXSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBleHBsaWNpdDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfCAnZGVsZXRlJyxcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgIGxldCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0ID0gZXhwbGljaXRcbiAgICAgID8geyBraW5kOiAnd2hvbGUnLCBrZXk6IHVzZXJLZXlPZihwYXRoLCBrZXkpIH1cbiAgICAgIDogcnVsZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSlcbiAgICAgIDogQ0xFQVI7XG4gICAgLy8gQSBjb3B5IElOU0lERSB0aGUgc3RhZ2U6IHRoZSB2ZXJ5IG9iamVjdCBpdCByZWFkIHVuZGVyIGEgc2VsZWN0ZWQgbmFtZSwgd3JpdHRlbiB1bmRlclxuICAgIC8vIGFub3RoZXIgKGBzLnBlcnNvbiA9IHMucHJvZmlsZWApLCBrZWVwcyB0aGF0IHJ1bGUg4oCUIG1hdGNoZWQgYnkgSURFTlRJVFkuIEEgbmV3IG9iamVjdFxuICAgIC8vIG9yIGEgcHJpbWl0aXZlIGNvcGllZCBhY3Jvc3MgbmFtZXMgaXMgc2VsZWN0ZWQgYnkgaXRzIG93biBuYW1lIG9ubHkuXG4gICAgY29uc3QgcmVhZCA9XG4gICAgICBydWxlICE9PSB1bmRlZmluZWQgJiYgdmVyZGljdC5raW5kICE9PSAnd2hvbGUnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyB0aGlzLl9zZWxlY3RlZE9iamVjdHM/LmdldCh2YWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHJlYWQgIT09IHVuZGVmaW5lZCAmJiBydWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChyZWFkLmtpbmQgPT09ICd3aG9sZScpIHJ1bGUubWFyayh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gICAgICBlbHNlIGlmIChyZWFkLmtpbmQgPT09ICdmaWVsZHMnKSB7XG4gICAgICAgIGNvbnN0IGF0ID0gWy4uLnBhdGguc2xpY2UoMSksIC4uLihwYXRoLmxlbmd0aCA+IDAgPyBba2V5XSA6IFtdKV07XG4gICAgICAgIHJ1bGUuaW5oZXJpdEZpZWxkcyhcbiAgICAgICAgICBwYXRoWzBdID8/IGtleSxcbiAgICAgICAgICByZWFkLnBhdGhzLm1hcCgoZmllbGQpID0+IFsuLi5hdCwgZmllbGRdLmpvaW4oJy4nKSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB2ZXJkaWN0ID0gcnVsZS52ZXJkaWN0QXQocGF0aCwga2V5KTtcbiAgICB9XG4gICAgY29uc3Qgd2hvbGUgPSB2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZSc7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5yZWNvcmQuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTtcbiAgICBpZiAodmVyYiA9PT0gJ21lcmdlJykgYnVmZmVyLm1lcmdlKG5zUGF0aCwgdmFsdWUsIHdob2xlKTtcbiAgICBlbHNlIGlmICh2ZXJiID09PSAnZGVsZXRlJykgYnVmZmVyLmRlbGV0ZShuc1BhdGgsIHdob2xlKTtcbiAgICBlbHNlIGJ1ZmZlci5zZXQobnNQYXRoLCB2YWx1ZSwgd2hvbGUpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSBidWZmZXIubWFya1JlZGFjdGVkRmllbGRzKG5zUGF0aCwgdmVyZGljdC5wYXRocyk7XG4gICAgaWYgKHZlcmIgPT09ICdkZWxldGUnKSB7XG4gICAgICBydWxlPy51bm1hcmsodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICAgIH0gZWxzZSBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSB7XG4gICAgICAvLyBUaGUgUkVBTCBydWxlLCBub3QgdGhlIGFjdGl2ZSBvbmU6IGFuIGV4cGxpY2l0IG1hcmsgb24gYW4gaW5lcnQgcnVsZVxuICAgICAgLy8gaXMgZXhhY3RseSB3aGF0IG1ha2VzIGl0IGFjdGl2ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1bi5cbiAgICAgIHRoaXMucG9saWN5LnJlZGFjdGlvbj8ubWFyayh2ZXJkaWN0LmtleSk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGFuZCByZWFkIGF0IEFOT1RIRVIgZnJhbWUncyBhZGRyZXNzIChpdHMgcnVuIG5hbWVzcGFjZSkgd2hpbGUgdGhpc1xuICAgKiBmcmFtZSBrZWVwcyBpdHMgb3duIGlkZW50aXR5IG9uIHRoZSByZWNvcmQg4oCUIGBzdGFnZWAsIGBzdGFnZUlkYCxcbiAgICogYHJ1bnRpbWVTdGFnZUlkYCwgdGFncy4gQSBzdWJmbG93IG1vdW50J3MgbWVyZ2UtYmFjayBpcyB0aGUgb25lIGNhbGxlclxuICAgKiAoYFN1YmZsb3dFeGVjdXRvciDCtyBleGVjdXRlU3ViZmxvd2AsIFIxMyk6IHRoZSBtb3VudCBmcmFtZSBvZiBhIGJyYW5jaCBvclxuICAgKiBmb3JrIGNoaWxkIGxhbmRzIGl0cyB2YWx1ZXMgd2hlcmUgaXRzIHBhcmVudCB3cml0ZXMsIGFzIGJlZm9yZSwgYW5kIGl0c1xuICAgKiBidW5kbGUgbm93IG5hbWVzIHRoZSBtb3VudCBpbnN0ZWFkIG9mIHRoZSBzdGFnZSBiZWZvcmUgaXQuIFJlZnVzZWQgb25jZVxuICAgKiB0aGUgZnJhbWUgaGFzIHN0YWdlZCBhbnl0aGluZyDigJQgaXRzIGJ1ZmZlcidzIGFkZHJlc3MgaXMgZml4ZWQgdGhlbi4gVGhlXG4gICAqIGRlY2lzaW9uIGlzIHRoZSBlbmdpbmUncyAobmFtZXNwYWNlIGlkcywgYXMgc2luY2UgUjEzKTsgdGhlIHJlY29yZCBmcmFtZVxuICAgKiB0YWtlcyB0aGUgYWRkcmVzcyBpdCBjb21lcyB0byAoYFJlY29yZEZyYW1lIMK3IHVzZUFkZHJlc3NgKS5cbiAgICovXG4gIHVzZUFkZHJlc3NPZihmcmFtZTogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkLmhhc1N0YWdlZCAmJiBmcmFtZS5uYW1lc3BhY2VJZCAhPT0gdGhpcy5uYW1lc3BhY2VJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgW2Zvb3RwcmludF0gU3RhZ2VDb250ZXh0LnVzZUFkZHJlc3NPZjogJyR7dGhpcy5zdGFnZUlkfScgaGFzIGFscmVhZHkgc3RhZ2VkIHdyaXRlcyBhdCBpdHMgb3duIGFkZHJlc3MuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYWRkcmVzc1J1bklkID0gZnJhbWUubmFtZXNwYWNlSWQ7XG4gICAgdGhpcy5yZWNvcmQudXNlQWRkcmVzcyhydW5BZGRyZXNzKHRoaXMubmFtZXNwYWNlSWQpKTtcbiAgfVxuXG4gIC8qKiBUaGUgcnVuIG5hbWVzcGFjZSB3cml0ZXMgYW5kIHJlYWRzIGdvIHRvOiB7QGxpbmsgYWRkcmVzc1J1bklkfSwgZWxzZSBgcnVuSWRgLiAqL1xuICBwcml2YXRlIGdldCBuYW1lc3BhY2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFkZHJlc3NSdW5JZCA/PyB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIFdyaXRlIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcGF0Y2gocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ3NldCcpO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnBhdGNoKHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgbWVyZ2UocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIHJldHVybiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnbWVyZ2UnKTtcbiAgfVxuXG4gIHNldE9iamVjdChcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBzaG91bGRSZWRhY3Q/OiBib29sZWFuLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wZXJhdGlvbk92ZXJyaWRlPzogJ3NldCcgfCAnZGVsZXRlJyxcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgLy8gRXhwbGljaXQgZGVsZXRpb24gKFNjb3BlRmFjYWRlLmRlbGV0ZVZhbHVlKSBzdGFnZXMgYSBkaXN0aW5jdCBvcCBzb1xuICAgIC8vIGRlbHRhLW1vZGUgY29tbWl0cyAoIzEzYy1CKSBjYW4gZW1pdCBhIHJlYWwgYGRlbGV0ZWAgdHJhY2UgZW50cnkuXG4gICAgLy8gVW5kZXIgdGhlIGRlZmF1bHQgJ2Z1bGwnIG1vZGUgdGhlIGJ1ZmZlciBjb21taXRzIGl0IGFzIGFcbiAgICAvLyBzZXQtb2YtdW5kZWZpbmVkIOKAlCBieXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLlxuICAgIGNvbnN0IHZlcmRpY3QgPVxuICAgICAgb3BlcmF0aW9uT3ZlcnJpZGUgPT09ICdkZWxldGUnXG4gICAgICAgID8gdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdW5kZWZpbmVkLCBzaG91bGRSZWRhY3QsICdkZWxldGUnKVxuICAgICAgICA6IHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdzZXQnKTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdCDigJRcbiAgICAvLyBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSksIHNlZSB0cmFja1dyaXRlLlxuICAgIHRoaXMudHJhY2tXcml0ZSh1c2VyS2V5T2YocGF0aCwga2V5KSwgdmFsdWUsIHZlcmRpY3QsIG9wZXJhdGlvbk92ZXJyaWRlID8/ICdzZXQnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IHRhZ2dlZCA9IGRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoJ1snKSA/IGRlc2NyaXB0aW9uIDogYFtXUklURV0gJHtkZXNjcmlwdGlvbn1gO1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCB0YWdnZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIHVwZGF0ZU9iamVjdChcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBzaG91bGRSZWRhY3Q/OiBib29sZWFuLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5tZXJnZShwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0IOKAlFxuICAgIC8vIHBvbGljeS1nYXRlZCAoIzEzYy1BKSwgc2VlIHRyYWNrV3JpdGUuXG4gICAgdGhpcy50cmFja1dyaXRlKHVzZXJLZXlPZihwYXRoLCBrZXkpLCB2YWx1ZSwgdmVyZGljdCwgJ3VwZGF0ZScpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgc2V0Um9vdChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnBhdGNoKFtdLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBSb290LWxldmVsICh1bi1uYW1lc3BhY2VkKSB3cml0ZSDigJQgdGhlIHN1YmZsb3cgc2VlZCBhbmQgbWVyZ2UtYmFjayBwYXRoLiAqL1xuICBzZXRHbG9iYWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHRoaXMuc3RhZ2VXcml0ZShba2V5XSwgW10sIGtleSwgdmFsdWUsIHVuZGVmaW5lZCwgJ3NldCcpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlR2xvYmFsQ29udGV4dChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnN0YWdlV3JpdGUoW2tleV0sIFtdLCBrZXksIHZhbHVlLCB1bmRlZmluZWQsICdzZXQnKTtcbiAgfVxuXG4gIGFwcGVuZFRvQXJyYXkocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBpdGVtczogdW5rbm93bltdLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXRWYWx1ZShwYXRoLCBrZXkpO1xuICAgIGNvbnN0IG1lcmdlZCA9IEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpID8gWy4uLmV4aXN0aW5nLCAuLi5pdGVtc10gOiBbLi4uaXRlbXNdO1xuICAgIHRoaXMuc2V0T2JqZWN0KHBhdGgsIGtleSwgbWVyZ2VkLCBmYWxzZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgbWVyZ2VPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXRWYWx1ZShwYXRoLCBrZXkpO1xuICAgIGNvbnN0IG1lcmdlZCA9XG4gICAgICBleGlzdGluZyAmJiB0eXBlb2YgZXhpc3RpbmcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGV4aXN0aW5nKVxuICAgICAgICA/IHsgLi4uKGV4aXN0aW5nIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSwgLi4ub2JqIH1cbiAgICAgICAgOiB7IC4uLm9iaiB9O1xuICAgIHRoaXMuc2V0T2JqZWN0KHBhdGgsIGtleSwgbWVyZ2VkLCBmYWxzZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVHJhY2tlZCByZWFkLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgQk9SUk9XRUQg4oCUIHNlZSB0aGUgY29udHJhY3Qgb25cbiAgICogYFNjb3BlRmFjYWRlLmdldFZhbHVlYC4gUmVhZC10cmFja2luZyBjb3N0IGlzIHBvbGljeS1nYXRlZCAoIzE0KTpcbiAgICogYCdmdWxsJ2AgY2xvbmVzIHRoZSB2YWx1ZSBpbnRvIGBfc3RhZ2VSZWFkc2AgKGhpc3RvcmljYWwgZGVmYXVsdCksXG4gICAqIGAnc3VtbWFyeSdgIHJlY29yZHMgYSBjaGVhcCBtYXJrZXIsIGAnb2ZmJ2AgcmVjb3JkcyBub3RoaW5nLlxuICAgKi9cbiAgZ2V0VmFsdWUocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICAvLyBUaGUgcmVjb3JkIGZyYW1lIHNlcnZlcyB0aGUgdmFsdWUgKHR3byB0aWVycykgYW5kIGtlZXBzIHRoZSBwZXItd3JpdGVcbiAgICAvLyBwcm92ZW5hbmNlIHJlZ2lzdHJ5ICgjUDEpIOKAlCBrZXkgc3RyaW5ncyBvbmx5LCBpbmRlcGVuZGVudCBvZiB0aGVcbiAgICAvLyByZWFkVHJhY2tpbmcgcmV0ZW50aW9uIGRpYWwgKHdoaWNoIGdvdmVybnMgVkFMVUUgcmV0ZW50aW9uIGJlbG93KS5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHRoaXMucmVjb3JkLm5vdGVSZWFkKHBhdGgsIGtleSk7XG4gICAgLy8gVGhlIHZlcmRpY3QsIG9uY2Ug4oCUIGZvciB0aGUgcmV0YWluZWQgcmVhZCBiZWxvdyBhbmQgdGhlIHNlbGVjdGVkLXJlYWRcbiAgICAvLyBjb3VudCAoYHNlbGVjdGVkUmVhZHNgKS4gTm8gcG9saWN5IGFuZCBubyBtYXJrcyDihpIgbm8gdmVyZGljdCBjYWxsLCBub1xuICAgIC8vIGFsbG9jYXRpb24gKGFjdGl2ZVJ1bGUpLlxuICAgIGNvbnN0IHJ1bGUgPSBrZXkgIT09IHVuZGVmaW5lZCA/IHRoaXMuYWN0aXZlUnVsZSgpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZlcmRpY3QgPSBydWxlICE9PSB1bmRlZmluZWQgPyBydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkgYXMgc3RyaW5nKSA6IENMRUFSO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSZWFkcyArPSAxO1xuICAgICAgLy8gQW4gb2JqZWN0IHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lLCB3cml0dGVuIGJhY2sgdW5kZXIgYW5vdGhlciwga2VlcHMgaXRzIHJ1bGUgKHN0YWdlV3JpdGUpLlxuICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpICh0aGlzLl9zZWxlY3RlZE9iamVjdHMgPz89IG5ldyBXZWFrTWFwKCkpLnNldCh2YWx1ZSwgdmVyZGljdCk7XG4gICAgfVxuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgcmVhZCAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3IOKAlCByZXRhaW5lZCB1bmRlclxuICAgIC8vIHRoZSBydWxlJ3MgdmVyZGljdCAoOS4xOS4wKTogYSByZWRhY3RlZCBrZXkgaXMgcmV0YWluZWQgYXMgdGhlXG4gICAgLy8gcGxhY2Vob2xkZXIsIGEgZmllbGQtbGV2ZWwga2V5IGFzIGEgc2NydWJiZWQgY2xvbmUsIG5ldmVyIHRoZSBzZWNyZXQuXG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucG9saWN5LnJlYWRUcmFja2luZyAhPT0gJ29mZicpIHtcbiAgICAgIGlmIChwYXRoLmxlbmd0aCA+IDApICh0aGlzLl9uZXN0ZWRSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICAgICAgZWxzZSBpZiAodGhpcy5wb2xpY3kucmVhZFRyYWNraW5nID09PSAnZnVsbCcgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgaWYgKHRoaXMucmVjb3JkLmhhc1N0YWdlZCkgdGhpcy5fdmlld1JlYWRzPy5kZWxldGUoa2V5KTtcbiAgICAgICAgZWxzZSAodGhpcy5fdmlld1JlYWRzID8/PSBuZXcgU2V0KCkpLmFkZChrZXkpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RhZ2VSZWFkc1t1c2VyS2V5T2YocGF0aCwga2V5KV0gPVxuICAgICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IHRoaXMucmV0YWluZWRGb3JtKHZlcmRpY3QsIHZhbHVlLCB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcsIHN1bW1hcml6ZVJlYWRWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBgW1JFQURdICR7ZGVzY3JpcHRpb259YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3cgbWFueSB0cmFja2VkIHJlYWRzIG9mIHRoaXMgZnJhbWUgcmVhZCBhIHZhbHVlIHRoZSBydW4ncyBydWxlIHNlbGVjdHNcbiAgICogKGEga2V5IGl0IG1hc2tzIHdob2xlLCBvciBvbmUgd2l0aCBzZWNyZXQgZmllbGRzKS4gQSBib3VuZGFyeSB0aGF0IG1hcHNcbiAgICogd2hhdCBhIHN0YWdlIGZ1bmN0aW9uIFJFQUQgaW50byBhIG5ldyBuYW1lIOKAlCB0aGUgYHBhcmFsbGVsRm9yRWFjaGAgaXRlbXNcbiAgICogc2VsZWN0b3Ig4oCUIGNvbXBhcmVzIGl0IGJlZm9yZSBhbmQgYWZ0ZXIsIGFzIGEgc3ViZmxvdyBtYXBwZXIncyB0YWludCBkb2VzXG4gICAqIChgbWVtb3J5L3JlZGFjdGlvbi50cyDCtyBNYXBwZXJUYWludGApLiBBbHdheXMgMCB3aXRob3V0IGEgcG9saWN5IG9yIGEgbWFyay5cbiAgICovXG4gIGdldCBzZWxlY3RlZFJlYWRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkUmVhZHM7XG4gIH1cblxuICAvKiogUmVhZCBzdGF0ZSB3aXRob3V0IHRyYWNraW5nIGluIF9zdGFnZVJlYWRzIG9yIHBheWluZyBzdHJ1Y3R1cmVkQ2xvbmUgY29zdC5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUuZ2V0VmFsdWVTaWxlbnQoKSBmb3IgYXJyYXkgcHJveHkgaW50ZXJuYWwgb3BlcmF0aW9ucy4gKi9cbiAgZ2V0VmFsdWVEaXJlY3QocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkKHBhdGgsIGtleSk7XG4gIH1cblxuICBnZXRSb290KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWRMaXZlKGtleSk7XG4gIH1cblxuICBnZXRHbG9iYWwoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZEdsb2JhbChrZXkpO1xuICB9XG5cbiAgZ2V0U2NvcGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5zdGF0ZS5nZXRTdGF0ZSgpO1xuICB9XG5cbiAgZ2V0UnVuSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDb21taXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDI6IHJlY29yZCB0aGF0IHRoaXMgc3RhZ2UgY29uc3VtZWQgYW4gdW50cmFja2VkIHJlYWQgcGF0aC5cbiAgICogQ2FsbGVkIGJ5IGBTY29wZUZhY2FkZWAgKGBnZXRBcmdzYC9gZ2V0RW52YC91bnNoYWRvd2VkIGBnZXRWYWx1ZVNpbGVudGApO1xuICAgKiBzdXJmYWNlZCBhcyBgQ29tbWl0QnVuZGxlLnVudHJhY2tlZFNvdXJjZXNgIG9uIHRoaXMgc3RhZ2UncyBjb21taXQuXG4gICAqL1xuICBtYXJrVW50cmFja2VkU291cmNlKHNvdXJjZTogVW50cmFja2VkU291cmNlKTogdm9pZCB7XG4gICAgKHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPz89IG5ldyBTZXQoKSkuYWRkKHNvdXJjZSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgdGhhdCBmaXJlcyBhZnRlciBjb21taXQoKSBhcHBsaWVzIHBhdGNoZXMuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGRpc3BhdGNoIFNjb3BlUmVjb3JkZXIub25Db21taXQgZXZlbnRzLiAqL1xuICBzZXRDb21taXRPYnNlcnZlcihcbiAgICBvYnNlcnZlcjogKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogRGV2LW1vZGUgb25seTogZGlkIHRoaXMgc3RhZ2UgY2hhbmdlLCBJTiBQTEFDRSwgYSB2YWx1ZSBpdCBtZXJlbHkgUkVBRD9cbiAgICpcbiAgICogVGhlIHR5cGVkIHNjb3BlIGludGVyY2VwdHMgZXZlcnkgd3JpdGUgaXQgY2FuIHJlYWNoIOKAlCBhIHByb3BlcnR5IGF0IGFueVxuICAgKiBkZXB0aCwgYW4gaW5kZXhlZCBlbGVtZW50LCBhbiBhcnJheSBtZXRob2QuIFdoYXQgaXQgY2Fubm90IHJlYWNoIGlzIGFuXG4gICAqIGVsZW1lbnQgaGFuZGVkIG91dCBieSBhIHJlYWQgbWV0aG9kIChgZmluZGAsIGBmaWx0ZXJgLCBgZm9y4oCmb2ZgLFxuICAgKiBgZm9yRWFjaGAsIGRlc3RydWN0dXJpbmcpOiB3cmFwcGluZyB0aG9zZSB3b3VsZCBtZWFuIHJldHVybmluZyBwcm94aWVzIG91dFxuICAgKiBvZiBldmVyeSByZWFkLCB3aGljaCBpcyBhIGNvc3QgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBwYXkuIFNvIHRoYXQgZmFtaWx5XG4gICAqIGlzIFdBUk5FRCBBQk9VVCByYXRoZXIgdGhhbiBpbnRlcmNlcHRlZCDigJQgbG91ZGx5LCBoZXJlLCBpbnN0ZWFkIG9mIGVuZGluZ1xuICAgKiB0aGUgcnVuIHdpdGggYSBjb21taXQgbG9nIHRoYXQgc2lsZW50bHkgZGlzYWdyZWVzIHdpdGggZmluYWwgc3RhdGUuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBSRVBPUlQgYWZ0ZXIgdGhlIGZhY3QsIG5vdCBhIHJlZnVzYWwgYXQgdGhlIHdyaXRlOiB0aGUgd3JpdGUgaGFzXG4gICAqIGFscmVhZHkgaGFwcGVuZWQgaW4gcGxhY2UgYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJjZXB0LiBJdCBydW5zIHVuZGVyXG4gICAqIFRXTyBwcmVjb25kaXRpb25zLCBib3RoIG5hbWVkIGluIHRoZSBSRUFETUUg4oCUIGBlbmFibGVEZXZNb2RlKClgLCBhbmRcbiAgICogYHJlYWRUcmFja2luZzogJ2Z1bGwnYCAodGhlIGRlZmF1bHQpLCBiZWNhdXNlIHRoZSBjb21wYXJpc29uIG5lZWRzIHRoZVxuICAgKiBjbG9uZSBvZiB0aGUgdmFsdWUgdGhhdCBtb2RlIHJldGFpbnMgYXQgcmVhZCB0aW1lLiBBIGtleSB0aGUgc3RhZ2UgbmV2ZXJcbiAgICogc3RhZ2VkIG11c3Qgc3RpbGwgaG9sZCB0aGF0IGNsb25lIOKAlCBjb21taXR0ZWQgc3RhdGUgaXMgaW1tdXRhYmxlLWFmdGVyLXN3YXBcbiAgICogYW5kIHRoZSBidWZmZXIncyB3b3JraW5nIGNvcHkgaXMgcHJpdmF0ZSB0byB0aGlzIHN0YWdlLiBLZXlzIHRoZSBzdGFnZSBESURcbiAgICogc3RhZ2UgYXJlIHNraXBwZWQgKHRoZXkgYXJlIGV4cGVjdGVkIHRvIGRpZmZlciwgYW5kIHRoZXkgYXJlIGluIHRoZSByZWNvcmQpLFxuICAgKiBzbyBhcmUga2V5cyB1bmRlciBhIHJlZGFjdGlvbiB2ZXJkaWN0LCB3aG9zZSByZXRhaW5lZCBmb3JtIGlzIGRlbGliZXJhdGVseVxuICAgKiBub3QgdGhlIHZhbHVlLCBhbmQgc28gYXJlIGtleXMgcmVhZCBhdCBhIG5lc3RlZCBwYXRoIChgX25lc3RlZFJlYWRzYCkg4oCUXG4gICAqIHRob3NlIGFyZSBlbmdpbmUgcmVhZHMgKHRoZSBzdWJmbG93IG1lcmdlLWJhY2spLCBub3QgdXNlciByZWFkcy5cbiAgICpcbiAgICogSXQgYWxzbyBvbmx5IGxvb2tzIGF0IGtleXMgc2VydmVkIGZyb20gdGhlIFBJTk5FRCBzb3VyY2Ug4oCUIHRoZSBmaXJzdC10b3VjaFxuICAgKiB2aWV3IG9yIHRoaXMgc3RhZ2UncyBvd24gYnVmZmVyLiBBIGtleSBhYnNlbnQgZnJvbSBib3RoIHdhcyBzZXJ2ZWQgYnkgdGhlXG4gICAqIHJlYWQncyBsaXZlIGZhbGxiYWNrIChgUmVjb3JkRnJhbWUgwrcgcmVhZGAsIHRpZXIgMiksIHdoaWNoIGEgcGFyYWxsZWwgc2libGluZydzIHJvb3Qta2V5IGNvbW1pdCBjYW5cbiAgICogbGVnaXRpbWF0ZWx5IG1vdmU7IGFjY3VzaW5nIHRoZSBzdGFnZSB0aGVyZSB3b3VsZCBiZSBhIGZhbHNlIGFsYXJtLiBGb3JcbiAgICogdGhlIHNhbWUgcmVhc29uIGl0IHJ1bnMgb24gdGhlIGZyYW1lJ3MgRklSU1QgY29tbWl0IG9ubHk6IHRoZSByZWFkcyBiZWxvbmdcbiAgICogdG8gdGhhdCByb3VuZCwgYW5kIGJ5IHRoZSBlbmdpbmUncyBzZWNvbmQgcm91bmQgKGEgZm9yayBkb3VibGUtY29tbWl0LCBhXG4gICAqIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgY29tbWl0dGVkIGJyYW5jaCBwYXJlbnQpIG90aGVyIHN0YWdlcyBoYXZlXG4gICAqIGxlZ2l0aW1hdGVseSBtb3ZlZCB0aGUgc3RhdGUgdGhleSB3ZXJlIGNvbXBhcmVkIGFnYWluc3QuXG4gICAqXG4gICAqIEEga2V5IHRoZSBzdGFnZSBESUQgc3RhZ2UgaXMgc3RpbGwgY2hlY2tlZCB3aGVuIGl0cyBsYXN0IHJlYWQgY2FtZSBmcm9tXG4gICAqIGNvbW1pdHRlZCBzdGF0ZSAoe0BsaW5rIF92aWV3UmVhZHN9IOKAlCByZWFkIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUpOlxuICAgKiB0aGF0IHJlYWQgd2FzIHRoZSBjb21taXR0ZWQgb2JqZWN0IGl0c2VsZiwgYW5kIHRoZSBidWZmZXIncyBkaWZmIGJhc2UgSVNcbiAgICogdGhhdCBvYmplY3QgKGNvcHktb24td3JpdGUsIDkuMjkuMCksIHNvIGFuIGluLXBsYWNlIGVkaXQgZm9sbG93ZWQgYnkgYVxuICAgKiB3cml0ZSBvZiB0aGUga2V5IGNvbW1pdHMgTk8gY2hhbmdlIOKAlCBsaXZlIHN0YXRlIGtlZXBzIHRoZSBlZGl0LCB0aGUgbG9nXG4gICAqIGRvZXMgbm90LiBDb21wYXJlZCBhZ2FpbnN0IGNvbW1pdHRlZCBzdGF0ZSwgbm90IHRoZSB3cml0dGVuIHZhbHVlLCBzbyBhXG4gICAqIGxlZ2l0aW1hdGUgd3JpdGUgbmV2ZXIgdHJpcHMgaXQuXG4gICAqXG4gICAqIENvc3RzIG5vdGhpbmcgb3V0c2lkZSBgZW5hYmxlRGV2TW9kZSgpYC5cbiAgICovXG4gIHByaXZhdGUgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIWlzRGV2TW9kZSgpIHx8IHRoaXMucG9saWN5LnJlYWRUcmFja2luZyAhPT0gJ2Z1bGwnIHx8IHRoaXMuX2NvbW1pdHRlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKSkge1xuICAgICAgY29uc3QgcmV0YWluZWQgPSB0aGlzLl9zdGFnZVJlYWRzW2tleV07XG4gICAgICAvLyBPbmx5IGEgY29udGFpbmVyIGNhbiBiZSBtdXRhdGVkIGluIHBsYWNlOyBhIHByaW1pdGl2ZSByZWFkIGNhbm5vdC5cbiAgICAgIGlmIChyZXRhaW5lZCA9PT0gbnVsbCB8fCB0eXBlb2YgcmV0YWluZWQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLl9uZXN0ZWRSZWFkcz8uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHJ1bGUgIT09IHVuZGVmaW5lZCAmJiBydWxlLnZlcmRpY3RBdChbXSwga2V5KS5raW5kICE9PSAnY2xlYXInKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWQgPSB0aGlzLnJlY29yZC5hdChbXSwga2V5KTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc3RhZ2VXcml0ZXMsIGtleSkgfHwgdGhpcy5yZWNvcmQud2FzU3RhZ2VkKG5hbWVzcGFjZWQpKSB7XG4gICAgICAgIHRoaXMud2Fybk9uQ29tbWl0dGVkTXV0YXRpb24oa2V5LCBuYW1lc3BhY2VkLCByZXRhaW5lZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgcGlubmVkIHNvdXJjZSBvbmx5IOKAlCBzZWUgdGhlIG5vdGUgb24gdGhlIGxpdmUgZmFsbGJhY2sgYWJvdmUuXG4gICAgICAvLyBgcGVla2AsIG5vdCBgZ2V0YDogYSByZXBvcnQgY29tcGFyZXMsIGFuZCBtdXN0IG5vdCB0YWtlIHRoZSBwcml2YXRlXG4gICAgICAvLyBjb3B5IGEgc3RhZ2UncyByZWFkIHdvdWxkIChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLlxuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMucmVjb3JkLnBlZWsobmFtZXNwYWNlZCk7XG4gICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcGF0aCA9IGZpcnN0RGlmZmVyaW5nUGF0aChyZXRhaW5lZCwgY3VycmVudCk7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oYm9ycm93ZWRNdXRhdGlvbk1lc3NhZ2UodGhpcy5zdGFnZU5hbWUsIGtleSwgcGF0aCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgc3RhZ2VkLWtleSBoYWxmIG9mIHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufTogZGlkIGNvbW1pdHRlZCBzdGF0ZSBpdHNlbGYgbW92ZSB1bmRlciBhIHJlYWQ/ICovXG4gIHByaXZhdGUgd2Fybk9uQ29tbWl0dGVkTXV0YXRpb24oa2V5OiBzdHJpbmcsIG5hbWVzcGFjZWQ6IHN0cmluZ1tdLCByZXRhaW5lZDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fdmlld1JlYWRzPy5oYXMoa2V5KSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbW1pdHRlZCA9IHRoaXMucmVjb3JkLmJhc2VBdChuYW1lc3BhY2VkKTtcbiAgICBpZiAoY29tbWl0dGVkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBwYXRoID0gZmlyc3REaWZmZXJpbmdQYXRoKHJldGFpbmVkLCBjb21taXR0ZWQpO1xuICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2Fybihjb21taXR0ZWRNdXRhdGlvbk1lc3NhZ2UodGhpcy5zdGFnZU5hbWUsIGtleSwgcGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHN0YWdlZCB3cml0ZXMgdG8gc2hhcmVkIG1lbW9yeSBhbmQgUkVMRUFTRSB0aGUgcGVyLXN0YWdlIHN0YWdpbmdcbiAgICogc3RhdGUgKCMxM2IpLlxuICAgKlxuICAgKiBgcGhhc2VgICg5LjM5LjApIGlzIHRoZSBjYWxsZXIncyBzdGF0ZW1lbnQgb2Ygd2hhdCBhIENPTlRJTlVBVElPTiBjb21taXRcbiAgICogaXMg4oCUIGAnZXhpdCdgIGZyb20gYSBzdWJmbG93IG1vdW50J3MgZXhpdCwgYCdyZXBlYXQnYCBmcm9tIGEgZm9ya1xuICAgKiBmYW4tb3V0J3Mgc2V0dGxlLiBJdCBpcyBzdGFtcGVkIG9uIHRoZSBidW5kbGUgKGBDb21taXRCdW5kbGUucGhhc2VgKSBvbmx5XG4gICAqIHdoZW4gdGhpcyBmcmFtZSBoYXMgQUxSRUFEWSBjb21taXR0ZWQ6IHRoZSBGSVJTVCBidW5kbGUgb2YgYW4gZXhlY3V0aW9uXG4gICAqIGlzIHRoZSBzdGFnZSdzIG93biBhbmQgbmV2ZXIgY2FycmllcyBhIGBwaGFzZWAg4oCUIHNvIGEgbW91bnQgd2l0aG91dCBhblxuICAgKiBgb3V0cHV0TWFwcGVyYCAoYSBsYXp5IG1vdW50LCBldmVyeSBgcGFyYWxsZWxGb3JFYWNoYCBicmFuY2gpLCB3aG9zZSBleGl0XG4gICAqIGlzIGl0cyBvbmx5IGJ1bmRsZSwgcmVjb3JkcyB0aGF0IGJ1bmRsZSBhcyBpdHMgb3duLCB0YWdzIGFuZCBhbGwuXG4gICAqXG4gICAqIENvbW1pdCBpcyB0aGUgc3RhZ2UncyBsaWZlY3ljbGUgZW5kOiB0aGUgcmVjb3JkIGZyYW1lJ3MgYnVmZmVyIGFuZFxuICAgKiBmaXJzdC10b3VjaCBiYXNlIGFyZSBvbmx5IG5lZWRlZCBEVVJJTkcgZXhlY3V0aW9uLCBhcyB0aGUgcmVhZCBzbmFwc2hvdCArXG4gICAqIG5ldC1jaGFuZ2UgZGlmZiBiYXNlLCBzbyB0aGUgcmVjb3JkIGZyYW1lIHJlbGVhc2VzIHRoZW0gb25jZSB0aGUgY29tbWl0XG4gICAqIGhhcyBsYW5kZWQgYW5kIHRoZSBvYnNlcnZlciBoYXMgc2VlbiBpdCAoYFJlY29yZEZyYW1lIMK3IHJlbGVhc2VgIOKAlCB3aHkgYVxuICAgKiBmcmFtZSB0aGF0IGtlcHQgdGhlbSB3b3VsZCByZXRhaW4gb25lIHN0YXRlIGdlbmVyYXRpb24gcGVyIGV4ZWN1dGVkXG4gICAqIHN0YWdlLCBhbmQgd2h5IGEgcmUtdXNlZCBmcmFtZSByZS1hbmNob3JzIG9uIGN1cnJlbnQgc3RhdGUsIGlzIHRoZXJlKS5cbiAgICpcbiAgICogUkUtVVNFIEFGVEVSIENPTU1JVCBzdGF5cyBjb3JyZWN0IGJlY2F1c2UgYm90aCByZS1jcmVhdGUgbGF6aWx5OlxuICAgKiAtIGEgbGF0ZXIgUkVBRCByZS1hbmNob3JzIG9uIHRoZSBDVVJSRU5UIGNvbW1pdHRlZCBzdGF0ZSAod2hpY2ggaW5jbHVkZXNcbiAgICogICB0aGlzIHN0YWdlJ3Mgb3duIGZsdXNoZWQgd3JpdGVzKTtcbiAgICogLSBhIGxhdGVyIFdSSVRFIGNvbnN0cnVjdHMgYSBmcmVzaCBidWZmZXIgb24gdGhhdCByZS1hbmNob3JlZCB2aWV3LCBzbyBhXG4gICAqICAgc2Vjb25kIGNvbW1pdCBkaWZmcyBhZ2FpbnN0IHBvc3QtZmlyc3QtY29tbWl0IHN0YXRlLiBUaGUgcHJlLXJlbGVhc2VcbiAgICogICBidWZmZXIgYmVoYXZlZCB0aGUgc2FtZSBmb3IgVkFMVUVTIChpdHMgYHdvcmtpbmdDb3B5YCB3YXMgcmVzZXQgb25cbiAgICogICBjb21taXQsIGZhbGxpbmcgcmVhZHMgdGhyb3VnaCB0byBsaXZlIHN0YXRlKSBidXQga2VwdCB0aGUgT1JJR0lOQUxcbiAgICogICBgYmFzZVNuYXBzaG90YCBhcyBkaWZmIGJhc2Ug4oCUIHVucmVhY2hhYmxlIGluIHByYWN0aWNlOiB0aGUgZW5naW5lJ3NcbiAgICogICBvbmx5IHdyaXRlcyBhZnRlciBhIGNvbW1pdCBhcmUgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgY29tbWl0dGVkXG4gICAqICAgYnJhbmNoIHBhcmVudCAoYSBkZWNpZGVyIG9yIGZvcmsgZnJhbWUgY29tbWl0cyBiZWZvcmUgaXRzIGJyYW5jaCBydW5zKTtcbiAgICogICB0aGUgb3RoZXIgXCJ3cml0ZSBhZnRlciBjb21taXRcIlxuICAgKiAgIHNpdGVzIChTdWJmbG93RXhlY3V0b3Igc2VlZCDihpIgcmVwbGFjZXMgdGhlIGNvbnRleHQ7IHJlc3VtZSDihpIgZnJlc2hcbiAgICogICBjb250ZXh0IHZpYSBgbGVhZi5jcmVhdGVOZXh0YCkgbmV2ZXIgcmUtdXNlIGEgY29tbWl0dGVkIGNvbnRleHQuXG4gICAqIC0gQSBVU0VSIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGlzIGEgZGlmZmVyZW50IG1hdHRlcjogaXRzIHdyaXRlc1xuICAgKiAgIHdvdWxkIGxhbmQgaW4gYSBidWZmZXIgbm90aGluZyBldmVyIGNvbW1pdHMuIFRoYXQgcmVmdXNhbCBsaXZlcyBvbiB0aGVcbiAgICogICBzY29wZSB0aWVyIChgU2NvcGVGYWNhZGVgLCBzZWFsZWQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlciDigJQgOS4yMi4wKSxcbiAgICogICBiZWNhdXNlIHRoZSBmcmFtZSdzIHJlLXVzYWJpbGl0eSBpcyBleGFjdGx5IHdoYXQgdGhlIGVuZ2luZSBwYXRoc1xuICAgKiAgIGFib3ZlIG5lZWQuXG4gICAqIC0gYF9zdGFnZVdyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIGFyZSBOT1QgcmVsZWFzZWQg4oCUIGBzbmFwc2hvdFNlbGYoKWBcbiAgICogICByZWFkcyB0aGVtIHBvc3QtcnVuIGZvciB0aGUgZXhlY3V0aW9uLXRyZWUgc25hcHNob3QuXG4gICAqL1xuICBjb21taXQocGhhc2U/OiBDb21taXRQaGFzZSk6IHZvaWQge1xuICAgIC8vIEEgY29udGludWF0aW9uIG9ubHkgQUZURVIgdGhlIGV4ZWN1dGlvbidzIG93biBidW5kbGUgKHNlZSBhYm92ZSkuXG4gICAgY29uc3QgY29udGludWF0aW9uID0gdGhpcy5fY29tbWl0dGVkID8gcGhhc2UgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXRlcmlhbGlzZVdyaXRlcygpO1xuICAgIHRoaXMud2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpO1xuICAgIC8vIFRoZSByZWNvcmQncyBoYWxmIChgUmVjb3JkRnJhbWUgwrcgY29tbWl0YCDihpIgYHJlY29yZENvbW1pdC50c2ApLiBObyBidWZmZXJcbiAgICAvLyA9IG5vIHdyaXRlIGV2ZXIgYnVpbHQgb25lICgjMTMpOiB0aGUgY29tbWl0IGlzIGVtcHR5IGJ5IGNvbnN0cnVjdGlvbixcbiAgICAvLyByZWNvcmRlZCB3aXRoIFpFUk8gY2xvbmVzLiBUaGUgbmFtZXMgYXJlIHJlYWQgb25jZSB0aGUgcGF5bG9hZCBpcyBidWlsdC5cbiAgICB0aGlzLnJlY29yZC5jb21taXQoKCkgPT4gKHtcbiAgICAgIHN0YWdlOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgdW50cmFja2VkU291cmNlczogdGhpcy5fdW50cmFja2VkU291cmNlcyxcbiAgICAgIHRhZ3M6IHRoaXMudGFncyxcbiAgICAgIHBoYXNlOiBjb250aW51YXRpb24sXG4gICAgfSkpO1xuICAgIC8vIFRoZSBvYnNlcnZlciAoU2NvcGVGYWNhZGUpIHNlZXMgdGhlIHRyYWNrZWQgbXV0YXRpb25zLCBUSEVOIHRoZSBzdGFnaW5nXG4gICAgLy8gc3RhdGUgaXMgcmVsZWFzZWQgKCMxM2IpLCBzbyBpdCBzZWVzIHRoZSB3b3JsZCBhcyBpdCB3YXMuIEQyJ3MgbWFya2Vyc1xuICAgIC8vIGFuZCB0aGUgZGVjbGFyZWQgdGFncyByZWxlYXNlIHdpdGggaXQg4oCUIG9uZSBzdGFtcCBwZXIgZXhlY3V0aW9uLCBzbyB0aGVcbiAgICAvLyBlbmdpbmUncyBkb3VibGUtY29tbWl0IHBhdGhzIHJlY29yZCB0aGVtIGV4YWN0bHkgb25jZS5cbiAgICBpZiAodGhpcy5fY29tbWl0T2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyKHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfSk7XG4gICAgfVxuICAgIHRoaXMucmVjb3JkLnJlbGVhc2UoKTtcbiAgICB0aGlzLl91bnRyYWNrZWRTb3VyY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudGFncyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jb21taXR0ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93IGF3YXkgZXZlcnl0aGluZyB0aGlzIHN0YWdlIGhhcyBTVEFHRUQsIHdpdGhvdXQgY29tbWl0dGluZyBhbnkgb2YgaXQuXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gcHJpbWl0aXZlIGJlaGluZCBkZWNsYXJhdGl2ZSByZXRyeTogd2hlbiBhIG5vbi1maW5hbCBhdHRlbXB0XG4gICAqIGZhaWxzLCB0aGUgd3JpdGVzIGl0IHN0YWdlZCBtdXN0IG5vdCBiZSB2aXNpYmxlIHRvIHRoZSBuZXh0IGF0dGVtcHQsIG11c3RcbiAgICogbm90IHJlYWNoIHNoYXJlZCBzdGF0ZSwgYW5kIG11c3Qgbm90IGFwcGVhciBpbiB0aGUgY29tbWl0IGxvZyBvciBpbiB0aGlzXG4gICAqIHN0YWdlJ3Mgc25hcHNob3QuIERyb3BwaW5nIHRoZSBzdGFnaW5nIHN0YXRlIGFjaGlldmVzIGFsbCBmb3VyIGF0IG9uY2Ug4oCUXG4gICAqIHRoZXJlIGlzIG5vIHJvbGxiYWNrIG1hY2hpbmVyeSB0byBpbnZva2UgYmVjYXVzZSBub3RoaW5nIHdhcyBldmVyIGFwcGxpZWRcbiAgICogKE0xOiB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIGhvbGRzIHdyaXRlcyB1bnRpbCBgY29tbWl0KClgIGZsdXNoZXMgdGhlbSkuXG4gICAqXG4gICAqIFdoYXQgaXMgcmVsZWFzZWQsIGFuZCB3aHkgZWFjaCBvbmUgbWF0dGVycyBmb3IgdGhlIG5leHQgYXR0ZW1wdDpcbiAgICogIC0gdGhlIHJlY29yZCBmcmFtZSdzIHN0YWdlZCBzdGF0ZSAoYFJlY29yZEZyYW1lIMK3IGRpc2NhcmRgKSDigJQgdGhlIGJ1ZmZlclxuICAgKiAgICAgICAgICAgICAgICAgICAgKHRoZSBuZXh0IGF0dGVtcHQgc3RhcnRzIHdpdGggbm90aGluZyBzdGFnZWQpLCB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgIGZpcnN0LXRvdWNoIGJhc2UgKGl0IHJlLWFuY2hvcnMgb24gY29tbWl0dGVkIHN0YXRlIGFzXG4gICAqICAgICAgICAgICAgICAgICAgICBpdCBzdGFuZHMgTk9XIOKAlCBhIHNpYmxpbmcgZm9yayBicmFuY2ggbWF5IGxlZ2l0aW1hdGVseVxuICAgKiAgICAgICAgICAgICAgICAgICAgaGF2ZSBjb21taXR0ZWQgaW4gYmV0d2VlbikgYW5kIHRoZSByZWFkS2V5cyBsaXN0ICgjUDE6XG4gICAqICAgICAgICAgICAgICAgICAgICBhIGRpc2NhcmRlZCBhdHRlbXB0J3MgcmVhZHMgbXVzdCBuZXZlciByZWFjaCB0aGUgbmV4dFxuICAgKiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCdzIGBUcmFjZUVudHJ5LnJlYWRLZXlzYCk7XG4gICAqICAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9wZW5kaW5nV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2Ag4oCUIHRoZSBzbmFwc2hvdFxuICAgKiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDsgd2l0aG91dCB0aGUgcmVzZXQgdGhlIGV4ZWN1dGlvbiB0cmVlIHdvdWxkXG4gICAqICAgICAgICAgICAgICAgICAgICByZXBvcnQgd3JpdGVzIHRoYXQgd2VyZSBkaXNjYXJkZWQsIHdoaWNoIGlzIHRoZSBleGFjdFxuICAgKiAgICAgICAgICAgICAgICAgICAgbGllIHRoaXMgZmVhdHVyZSBleGlzdHMgdG8gcHJldmVudCAodGhlIHBlbmRpbmcgbWFwXG4gICAqICAgICAgICAgICAgICAgICAgICBob2xkcyBiYXJlIHJlZmVyZW5jZXMg4oCUIGRyb3BwaW5nIGl0IHVuLWNsb25lcyBub3RoaW5nKTtcbiAgICogIC0gYF91bnRyYWNrZWRTb3VyY2VzYCDigJQgdGhlIEQyIGhvbmVzdHkgbWFya2VycywgcmVsZWFzZWQgd2l0aCB0aGUgcmVzdC5cbiAgICpcbiAgICogV2hhdCBpcyBkZWxpYmVyYXRlbHkgS0VQVDogYGRlYnVnYCAobG9ncywgbWV0cmljcywgZXJyb3JzLCBmbG93IG1lc3NhZ2VzKS5cbiAgICogRGlhZ25vc3RpY3MgYXJlIHRoZSBhcHBlbmQtb25seSByZWNvcmQgb2Ygd2hhdCBldmVyeSBhdHRlbXB0IGRpZCwgYW5kIHRoZVxuICAgKiByZXRyeSBmZWF0dXJlJ3Mgd2hvbGUgcG9pbnQgaXMgdGhhdCB0aGUgZWFybGllciBhdHRlbXB0cyBzdGF5IHZpc2libGUuXG4gICAqXG4gICAqIE5vIGNvbW1pdCBpcyByZWNvcmRlZCBhbmQgbm8gb2JzZXJ2ZXIgZmlyZXMg4oCUIGEgZGlzY2FyZGVkIGF0dGVtcHQgaXMgbm90IGFcbiAgICogY3Vyc29yIHN0b3AsIGJlY2F1c2UgZnJvbSBzaGFyZWQgc3RhdGUncyBwb2ludCBvZiB2aWV3IGl0IG5ldmVyIGhhcHBlbmVkLlxuICAgKi9cbiAgZGlzY2FyZFN0YWdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZC5kaXNjYXJkKCk7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YWdlV3JpdGVzID0ge307XG4gICAgdGhpcy5fc3RhZ2VSZWFkcyA9IHt9O1xuICAgIHRoaXMuX25lc3RlZFJlYWRzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZpZXdSZWFkcyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUcmVlIG5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIENyZWF0ZSAob3IgcmV0dXJuKSB0aGlzIGNvbnRleHQncyBsaW5rZWQgc3VjY2Vzc29yLlxuICAgKlxuICAgKiBNRU1PSVpFRDogdGhlIGZpcnN0IGNhbGwgY3JlYXRlcyBgdGhpcy5uZXh0YDsgZXZlcnkgbGF0ZXIgY2FsbCByZXR1cm5zXG4gICAqIHRoYXQgU0FNRSBjb250ZXh0IGFuZCBJR05PUkVTIGl0cyBhcmd1bWVudHMuIEluIG5vcm1hbCB0cmF2ZXJzYWwgZWFjaFxuICAgKiBjb250ZXh0IGFkdmFuY2VzIGV4YWN0bHkgb25jZSwgc28gdGhlIG1lbW8gbmV2ZXIgYml0ZXMg4oCUIGJ1dCBhIGNhbGxlclxuICAgKiBleHBlY3RpbmcgYSBmcmVzaCBjb250ZXh0IGZvciBkaWZmZXJlbnQgYHN0YWdlTmFtZWAvYHN0YWdlSWRgIGFyZ3MgZ2V0c1xuICAgKiB0aGUgb2xkIG9uZSBzaWxlbnRseS4gRGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSB3YXJucyBvbiB0aGF0XG4gICAqIG1pc21hdGNoIChiYWNrbG9nIEI0KS5cbiAgICovXG4gIGNyZWF0ZU5leHQocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLm5leHQpIHtcbiAgICAgIHRoaXMubmV4dCA9IG5ldyBTdGFnZUNvbnRleHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnJlY29yZC5zdGF0ZSwgJycsIHRoaXMucmVjb3JkLmxvZywgaXNEZWNpZGVyKTtcbiAgICAgIHRoaXMubmV4dC5wYXJlbnQgPSB0aGlzO1xuICAgICAgdGhpcy5uZXh0LmluaGVyaXRSdW4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChpc0Rldk1vZGUoKSAmJiAodGhpcy5uZXh0LnN0YWdlSWQgIT09IHN0YWdlSWQgfHwgdGhpcy5uZXh0LnN0YWdlTmFtZSAhPT0gc3RhZ2VOYW1lKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC5jcmVhdGVOZXh0OiBuZXh0IGNvbnRleHQgYWxyZWFkeSBleGlzdHMgYXMgXCIke3RoaXMubmV4dC5zdGFnZU5hbWV9XCIgYCArXG4gICAgICAgICAgYChpZDogXCIke3RoaXMubmV4dC5zdGFnZUlkfVwiKSDigJQgYXJndW1lbnRzIFwiJHtzdGFnZU5hbWV9XCIgKGlkOiBcIiR7c3RhZ2VJZH1cIikgYXJlIGlnbm9yZWQgYCArXG4gICAgICAgICAgJ2FuZCB0aGUgZXhpc3RpbmcgY29udGV4dCBpcyByZXR1cm5lZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmV4dDtcbiAgfVxuXG4gIGNyZWF0ZUNoaWxkKHJ1bklkOiBzdHJpbmcsIGJyYW5jaElkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGQgPSBuZXcgU3RhZ2VDb250ZXh0KHJ1bklkLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMucmVjb3JkLnN0YXRlLCBicmFuY2hJZCwgdGhpcy5yZWNvcmQubG9nLCBpc0RlY2lkZXIpO1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgY2hpbGQuaW5oZXJpdFJ1bih0aGlzKTtcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIGNyZWF0ZURlY2lkZXIocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdHJ1ZSk7XG4gIH1cblxuICBzZXRBc0RlY2lkZXIoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRGVjaWRlciA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBc0ZvcmsoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRm9yayA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGlhZ25vc3RpY3MgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQGludGVybmFsIFJldGFpbmVkIGluY29taW5nIHZhbHVlIGZvciB0aGUgZmFjYWRlJ3MgbGVnYWN5IGVtaXQgY2hhbm5lbC4gKi9cbiAgYWRkRGlhZ25vc3RpYyhjaGFubmVsOiBEaWFnbm9zdGljQ2hhbm5lbCwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5kZWJ1Zy5hZGQoY2hhbm5lbCwga2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXJyb3Ioa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEVycm9yKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRmxvd0RlYnVnTWVzc2FnZShcbiAgICB0eXBlOiBGbG93Q29udHJvbFR5cGUsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyB0YXJnZXRTdGFnZT86IHN0cmluZyB8IHN0cmluZ1tdOyByYXRpb25hbGU/OiBzdHJpbmc7IGNvdW50PzogbnVtYmVyOyBpdGVyYXRpb24/OiBudW1iZXIgfSxcbiAgKSB7XG4gICAgY29uc3QgZmxvd01lc3NhZ2U6IEZsb3dNZXNzYWdlID0geyB0eXBlLCBkZXNjcmlwdGlvbiwgdGltZXN0YW1wOiBEYXRlLm5vdygpLCAuLi5vcHRpb25zIH07XG4gICAgdGhpcy5kZWJ1Zy5hZGRGbG93TWVzc2FnZShmbG93TWVzc2FnZSk7XG4gIH1cblxuICAvLyDilIDilIAgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0U3RhZ2VJZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5ydW5JZCB8fCB0aGlzLnJ1bklkID09PSAnJykgcmV0dXJuIHRoaXMuc3RhZ2VOYW1lO1xuICAgIHJldHVybiBgJHt0aGlzLnJ1bklkfS4ke3RoaXMuc3RhZ2VOYW1lfWA7XG4gIH1cblxuICBnZXRTbmFwc2hvdCgpOiBTdGFnZVNuYXBzaG90IHtcbiAgICAvLyBJdGVyYXRpdmUgd2FsayAoZXhwbGljaXQgd29yayBzdGFjayksIE5PVCByZWN1cnNpb246IHRoZSBleGVjdXRpb25cbiAgICAvLyB0cmVlIGRlZXBlbnMgYnkgb25lIGxldmVsIHBlciBleGVjdXRlZCBzdGFnZSBhbG9uZyBgbmV4dGAgY2hhaW5zLCBhbmRcbiAgICAvLyB0aGUgdHJhbXBvbGluZWQgdHJhdmVyc2VyIGFsbG93cyBjaGFpbnMvbG9vcHMgb2YgdGVucyBvZiB0aG91c2FuZHMgb2ZcbiAgICAvLyBzdGFnZXMg4oCUIGZhciBkZWVwZXIgdGhhbiBhIHJlY3Vyc2l2ZSBzZXJpYWxpemVyIGNhbiB3YWxrIGJlZm9yZVxuICAgIC8vIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgICBjb25zdCByb290ID0gdGhpcy5zbmFwc2hvdFNlbGYoKTtcbiAgICBjb25zdCB3b3JrOiBBcnJheTx7IGN0eDogU3RhZ2VDb250ZXh0OyBzbmFwOiBTdGFnZVNuYXBzaG90IH0+ID0gW3sgY3R4OiB0aGlzLCBzbmFwOiByb290IH1dO1xuICAgIHdoaWxlICh3b3JrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgY3R4LCBzbmFwIH0gPSB3b3JrLnBvcCgpITtcbiAgICAgIGlmIChjdHgubmV4dCkge1xuICAgICAgICBjb25zdCBuZXh0U25hcCA9IGN0eC5uZXh0LnNuYXBzaG90U2VsZigpO1xuICAgICAgICBzbmFwLm5leHQgPSBuZXh0U25hcDtcbiAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjdHgubmV4dCwgc25hcDogbmV4dFNuYXAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY3R4LmNoaWxkcmVuKSB7XG4gICAgICAgIHNuYXAuY2hpbGRyZW4gPSBjdHguY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaWxkU25hcCA9IGNoaWxkLnNuYXBzaG90U2VsZigpO1xuICAgICAgICAgIHdvcmsucHVzaCh7IGN0eDogY2hpbGQsIHNuYXA6IGNoaWxkU25hcCB9KTtcbiAgICAgICAgICByZXR1cm4gY2hpbGRTbmFwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKiogU25hcHNob3Qgb2YgVEhJUyBjb250ZXh0J3Mgb3duIGZpZWxkcyDigJQgYG5leHRgL2BjaGlsZHJlbmAgYXJlIGZpbGxlZFxuICAgKiAgaW4gYnkgdGhlIGl0ZXJhdGl2ZSB3YWxrIGluIGBnZXRTbmFwc2hvdGAuICovXG4gIHByaXZhdGUgc25hcHNob3RTZWxmKCk6IFN0YWdlU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90OiBTdGFnZVNuYXBzaG90ID0ge1xuICAgICAgaWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkIHx8IHVuZGVmaW5lZCxcbiAgICAgIG5hbWU6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgaXNEZWNpZGVyOiB0aGlzLmlzRGVjaWRlcixcbiAgICAgIGlzRm9yazogdGhpcy5pc0ZvcmssXG4gICAgICBsb2dzOiB0aGlzLmRlYnVnLmxvZ0NvbnRleHQsXG4gICAgICBlcnJvcnM6IHRoaXMuZGVidWcuZXJyb3JDb250ZXh0LFxuICAgICAgbWV0cmljczogdGhpcy5kZWJ1Zy5tZXRyaWNDb250ZXh0LFxuICAgICAgZXZhbHM6IHRoaXMuZGVidWcuZXZhbENvbnRleHQsXG4gICAgfTtcbiAgICBjb25zdCBzdGFnZVdyaXRlcyA9IHRoaXMucmV0YWluZWRXcml0ZXMoKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3RhZ2VXcml0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEV4dHJhY3QgdmFsdWVzIG9ubHkgZm9yIHRoZSBzbmFwc2hvdCAoc3RyaXAgb3BlcmF0aW9uIG1ldGFkYXRhKVxuICAgICAgY29uc3Qgd3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaywgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHN0YWdlV3JpdGVzKSkge1xuICAgICAgICB3cml0ZXNba10gPSBlbnRyeS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHNuYXBzaG90LnN0YWdlV3JpdGVzID0gd3JpdGVzO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3Quc3RhZ2VSZWFkcyA9IHRoaXMuX3N0YWdlUmVhZHM7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICBzbmFwc2hvdC5kZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLnN1YmZsb3dJZCkge1xuICAgICAgc25hcHNob3Quc3ViZmxvd0lkID0gdGhpcy5zdWJmbG93SWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5mbG93TWVzc2FnZXMgPSB0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcztcbiAgICB9XG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG59XG4iXX0=
|