footprintjs 9.5.0 → 9.6.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 +2 -0
- package/README.md +14 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/capture/index.js +2 -2
- package/dist/esm/lib/recorder/CombinedRecorder.js +4 -4
- package/dist/esm/lib/recorder/invokeHook.js +38 -0
- package/dist/esm/lib/runner/DeferredObserverTier.js +366 -0
- package/dist/esm/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +152 -22
- package/dist/esm/lib/runner/index.js +1 -1
- package/dist/esm/lib/scope/ScopeFacade.js +11 -8
- package/dist/index.js +1 -1
- package/dist/lib/capture/index.js +3 -3
- package/dist/lib/recorder/CombinedRecorder.js +8 -8
- package/dist/lib/recorder/invokeHook.js +42 -0
- package/dist/lib/runner/DeferredObserverTier.js +370 -0
- package/dist/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/lib/runner/FlowChartExecutor.js +152 -22
- package/dist/lib/runner/index.js +1 -1
- package/dist/lib/scope/ScopeFacade.js +11 -8
- package/dist/types/index.d.ts +24 -0
- package/dist/types/lib/capture/index.d.ts +1 -1
- package/dist/types/lib/recorder/CombinedRecorder.d.ts +36 -0
- package/dist/types/lib/recorder/invokeHook.d.ts +32 -0
- package/dist/types/lib/runner/DeferredObserverTier.d.ts +204 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +8 -0
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +49 -10
- package/dist/types/lib/runner/index.d.ts +1 -0
- package/package.json +2 -1
|
@@ -31,6 +31,7 @@ const detectCircular_js_1 = require("../scope/detectCircular.js");
|
|
|
31
31
|
const readonlyInput_js_1 = require("../scope/protection/readonlyInput.js");
|
|
32
32
|
const ScopeFacade_js_1 = require("../scope/ScopeFacade.js");
|
|
33
33
|
const checkpointSanitize_js_1 = require("./checkpointSanitize.js");
|
|
34
|
+
const DeferredObserverTier_js_1 = require("./DeferredObserverTier.js");
|
|
34
35
|
const ExecutionRuntime_js_1 = require("./ExecutionRuntime.js");
|
|
35
36
|
const runId_js_1 = require("./runId.js");
|
|
36
37
|
const validateInput_js_1 = require("./validateInput.js");
|
|
@@ -49,6 +50,13 @@ class FlowChartExecutor {
|
|
|
49
50
|
combinedRecorder;
|
|
50
51
|
flowRecorders = [];
|
|
51
52
|
scopeRecorders = [];
|
|
53
|
+
/**
|
|
54
|
+
* RFC-001 deferred-observer wiring — created LAZILY on the first
|
|
55
|
+
* `delivery: 'deferred'` attach. `undefined` for every executor that never
|
|
56
|
+
* opts in: zero allocation, zero per-event cost, byte-identical behavior
|
|
57
|
+
* (the emit fast-path precedent).
|
|
58
|
+
*/
|
|
59
|
+
deferredTier;
|
|
52
60
|
redactionPolicy;
|
|
53
61
|
sharedRedactedKeys = new Set();
|
|
54
62
|
sharedRedactedFieldsByKey = new Map();
|
|
@@ -179,6 +187,18 @@ class FlowChartExecutor {
|
|
|
179
187
|
}
|
|
180
188
|
});
|
|
181
189
|
}
|
|
190
|
+
// 2b. Deferred-observer scope tap (RFC-001 Block 7) — a synthetic
|
|
191
|
+
// recorder whose hooks CAPTURE into the bounded queue instead of doing
|
|
192
|
+
// observer work. It rides the same per-stage recorder list as inline
|
|
193
|
+
// recorders, so it receives exactly the post-redaction events they do.
|
|
194
|
+
// Absent (zero work, identical list) when nobody opted into deferral.
|
|
195
|
+
const scopeTap = this.deferredTier?.buildScopeTap();
|
|
196
|
+
if (scopeTap) {
|
|
197
|
+
modifiers.push((scope) => {
|
|
198
|
+
if (typeof scope.attachScopeRecorder === 'function')
|
|
199
|
+
scope.attachScopeRecorder(scopeTap);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
182
202
|
// 3. Redaction policy (conditional — only when policy is set)
|
|
183
203
|
if (this.redactionPolicy) {
|
|
184
204
|
const policy = this.redactionPolicy;
|
|
@@ -608,13 +628,23 @@ class FlowChartExecutor {
|
|
|
608
628
|
};
|
|
609
629
|
for (const r of this.scopeRecorders)
|
|
610
630
|
r.onResume?.(scopeResumeEvent);
|
|
631
|
+
// Deferred tier (RFC-001): these executor-synthesized onResume events
|
|
632
|
+
// bypass the per-stage dispatch sites, so capture them directly.
|
|
633
|
+
if (this.deferredTier) {
|
|
634
|
+
this.deferredTier.capture('flow', 'onResume', resumeRuntimeStageId, this._currentRunId, flowResumeEvent);
|
|
635
|
+
this.deferredTier.capture('scope', 'onResume', scopeResumeEvent.runtimeStageId, scopeResumeEvent.pipelineId, scopeResumeEvent);
|
|
636
|
+
}
|
|
611
637
|
// Set AFTER all sync validation/lookup throws above (nothing can leak the
|
|
612
638
|
// flag); no await between the top-of-method check and here, so race-free.
|
|
613
639
|
this._isExecuting = true;
|
|
614
640
|
try {
|
|
615
|
-
|
|
641
|
+
const result = await this.traverser.execute();
|
|
642
|
+
// Terminal flush (RFC-001 Block 8) — same boundary contract as run().
|
|
643
|
+
this.deferredTier?.terminalFlush();
|
|
644
|
+
return result;
|
|
616
645
|
}
|
|
617
646
|
catch (error) {
|
|
647
|
+
this.deferredTier?.terminalFlush();
|
|
618
648
|
if ((0, types_js_2.isPauseSignal)(error)) {
|
|
619
649
|
this.lastCheckpoint = this.buildPauseCheckpoint(error);
|
|
620
650
|
return { paused: true, checkpoint: this.lastCheckpoint };
|
|
@@ -795,12 +825,36 @@ class FlowChartExecutor {
|
|
|
795
825
|
* executor.attachScopeRecorder(new MetricRecorder('my-metrics'));
|
|
796
826
|
* executor.attachScopeRecorder(new MetricRecorder('my-metrics')); // replaces previous
|
|
797
827
|
* ```
|
|
828
|
+
*
|
|
829
|
+
* **Delivery tier (RFC-001):** pass `{ delivery: 'deferred' }` to take the
|
|
830
|
+
* recorder out of the engine's hot path — events are captured into a
|
|
831
|
+
* bounded queue and delivered at the next microtask checkpoint ("one beat
|
|
832
|
+
* behind"). Omitting `delivery` keeps the historical synchronous call,
|
|
833
|
+
* byte-identical to previous releases. Re-attaching the same `id` with a
|
|
834
|
+
* different tier SWAPS tiers cleanly — never double delivery. See
|
|
835
|
+
* `docs/guides/observers-deferred.md`.
|
|
798
836
|
*/
|
|
799
|
-
attachScopeRecorder(recorder) {
|
|
800
|
-
//
|
|
837
|
+
attachScopeRecorder(recorder, options) {
|
|
838
|
+
// Tier swap, both directions: an id lives on exactly ONE tier per list.
|
|
801
839
|
this.scopeRecorders = this.scopeRecorders.filter((r) => r.id !== recorder.id);
|
|
840
|
+
if (options?.delivery === 'deferred') {
|
|
841
|
+
this.ensureDeferredTier(options).register(recorder, { scope: true }, options);
|
|
842
|
+
return;
|
|
843
|
+
}
|
|
844
|
+
this.deferredTier?.removeFromLists(recorder.id, { scope: true });
|
|
802
845
|
this.scopeRecorders.push(recorder);
|
|
803
846
|
}
|
|
847
|
+
/**
|
|
848
|
+
* Lazily create the executor's ONE deferred-observer tier (one merged
|
|
849
|
+
* queue, total event order across all three channels). The FIRST deferred
|
|
850
|
+
* attach's options configure the dispatcher; later differing options are
|
|
851
|
+
* dev-warned and ignored (see `AttachRecorderOptions`).
|
|
852
|
+
*/
|
|
853
|
+
ensureDeferredTier(options) {
|
|
854
|
+
if (!this.deferredTier)
|
|
855
|
+
this.deferredTier = new DeferredObserverTier_js_1.DeferredObserverTier(options);
|
|
856
|
+
return this.deferredTier;
|
|
857
|
+
}
|
|
804
858
|
// ─── Detach (T4) ─────────────────────────────────────────────────────────
|
|
805
859
|
//
|
|
806
860
|
// Bare-executor entry point for fire-and-forget child flowchart execution.
|
|
@@ -842,13 +896,14 @@ class FlowChartExecutor {
|
|
|
842
896
|
detachAndForget(driver, child, input) {
|
|
843
897
|
(0, spawn_js_1.detachAndForget)(driver, child, input, '__executor__');
|
|
844
898
|
}
|
|
845
|
-
/** Detach all scope Recorders with the given ID. */
|
|
899
|
+
/** Detach all scope Recorders with the given ID — both delivery tiers. */
|
|
846
900
|
detachScopeRecorder(id) {
|
|
847
901
|
this.scopeRecorders = this.scopeRecorders.filter((r) => r.id !== id);
|
|
902
|
+
this.deferredTier?.removeFromLists(id, { scope: true });
|
|
848
903
|
}
|
|
849
|
-
/** Returns a defensive copy of attached scope Recorders. */
|
|
904
|
+
/** Returns a defensive copy of attached scope Recorders (both tiers). */
|
|
850
905
|
getScopeRecorders() {
|
|
851
|
-
return [...this.scopeRecorders];
|
|
906
|
+
return [...this.scopeRecorders, ...(this.deferredTier?.scopeListRecorders() ?? [])];
|
|
852
907
|
}
|
|
853
908
|
// ─── FlowRecorder Management ───
|
|
854
909
|
/**
|
|
@@ -857,20 +912,29 @@ class FlowChartExecutor {
|
|
|
857
912
|
* Must be called before run() — recorders are passed to the traverser at creation time.
|
|
858
913
|
*
|
|
859
914
|
* **Idempotent by ID:** replaces existing recorder with same `id`.
|
|
915
|
+
*
|
|
916
|
+
* **Delivery tier (RFC-001):** pass `{ delivery: 'deferred' }` for
|
|
917
|
+
* next-checkpoint delivery off the hot path — see `attachScopeRecorder`.
|
|
860
918
|
*/
|
|
861
|
-
attachFlowRecorder(recorder) {
|
|
862
|
-
//
|
|
919
|
+
attachFlowRecorder(recorder, options) {
|
|
920
|
+
// Tier swap, both directions: an id lives on exactly ONE tier per list.
|
|
863
921
|
this.flowRecorders = this.flowRecorders.filter((r) => r.id !== recorder.id);
|
|
864
|
-
this.flowRecorders.push(recorder);
|
|
865
922
|
this.narrativeEnabled = true;
|
|
923
|
+
if (options?.delivery === 'deferred') {
|
|
924
|
+
this.ensureDeferredTier(options).register(recorder, { flow: true }, options);
|
|
925
|
+
return;
|
|
926
|
+
}
|
|
927
|
+
this.deferredTier?.removeFromLists(recorder.id, { flow: true });
|
|
928
|
+
this.flowRecorders.push(recorder);
|
|
866
929
|
}
|
|
867
|
-
/** Detach all FlowRecorders with the given ID. */
|
|
930
|
+
/** Detach all FlowRecorders with the given ID — both delivery tiers. */
|
|
868
931
|
detachFlowRecorder(id) {
|
|
869
932
|
this.flowRecorders = this.flowRecorders.filter((r) => r.id !== id);
|
|
933
|
+
this.deferredTier?.removeFromLists(id, { flow: true });
|
|
870
934
|
}
|
|
871
|
-
/** Returns a defensive copy of attached FlowRecorders. */
|
|
935
|
+
/** Returns a defensive copy of attached FlowRecorders (both tiers). */
|
|
872
936
|
getFlowRecorders() {
|
|
873
|
-
return [...this.flowRecorders];
|
|
937
|
+
return [...this.flowRecorders, ...(this.deferredTier?.flowListRecorders() ?? [])];
|
|
874
938
|
}
|
|
875
939
|
// ─── Combined ScopeRecorder Management ───
|
|
876
940
|
/**
|
|
@@ -918,10 +982,16 @@ class FlowChartExecutor {
|
|
|
918
982
|
* executor.attachCombinedRecorder(audit);
|
|
919
983
|
* ```
|
|
920
984
|
*/
|
|
921
|
-
attachCombinedRecorder(recorder) {
|
|
985
|
+
attachCombinedRecorder(recorder, options) {
|
|
922
986
|
const hasData = (0, CombinedRecorder_js_1.hasRecorderMethods)(recorder);
|
|
923
987
|
const hasFlow = (0, CombinedRecorder_js_1.hasFlowRecorderMethods)(recorder);
|
|
924
988
|
const hasEmit = (0, CombinedRecorder_js_1.hasEmitRecorderMethods)(recorder);
|
|
989
|
+
// Delivery tier (RFC-001): options bag OR the recorder's own
|
|
990
|
+
// `delivery: 'deferred'` field. The field is a string — channel routing
|
|
991
|
+
// above counts event-METHOD properties only, so declaring it never
|
|
992
|
+
// changes which channels the recorder lands on.
|
|
993
|
+
const delivery = options?.delivery ?? recorder.delivery;
|
|
994
|
+
const tierOptions = delivery === undefined ? options : { ...options, delivery };
|
|
925
995
|
// Emit recorders live on the SAME channel as data-flow recorders
|
|
926
996
|
// (ScopeFacade iterates `_recorders` for onEmit dispatch). So
|
|
927
997
|
// attachEmitRecorder internally calls attachScopeRecorder — but we want to
|
|
@@ -929,9 +999,9 @@ class FlowChartExecutor {
|
|
|
929
999
|
// other ScopeRecorder methods. Short-circuit: if hasData OR hasEmit, the
|
|
930
1000
|
// recorder lands on the scope-recorder list exactly once.
|
|
931
1001
|
if (hasData || hasEmit)
|
|
932
|
-
this.attachScopeRecorder(recorder);
|
|
1002
|
+
this.attachScopeRecorder(recorder, tierOptions);
|
|
933
1003
|
if (hasFlow)
|
|
934
|
-
this.attachFlowRecorder(recorder);
|
|
1004
|
+
this.attachFlowRecorder(recorder, tierOptions);
|
|
935
1005
|
if (!hasData && !hasFlow && !hasEmit && (0, detectCircular_js_1.isDevMode)()) {
|
|
936
1006
|
// Dev-mode only: silent skips are invisible and produce hard-to-debug
|
|
937
1007
|
// "why didn't my recorder fire" reports. Per library convention, gated
|
|
@@ -978,19 +1048,20 @@ class FlowChartExecutor {
|
|
|
978
1048
|
* });
|
|
979
1049
|
* ```
|
|
980
1050
|
*/
|
|
981
|
-
attachEmitRecorder(recorder) {
|
|
982
|
-
this.attachScopeRecorder(recorder);
|
|
1051
|
+
attachEmitRecorder(recorder, options) {
|
|
1052
|
+
this.attachScopeRecorder(recorder, options);
|
|
983
1053
|
}
|
|
984
1054
|
/** Detach an `EmitRecorder` by id. Safe to call if never attached. */
|
|
985
1055
|
detachEmitRecorder(id) {
|
|
986
1056
|
this.detachScopeRecorder(id);
|
|
987
1057
|
}
|
|
988
1058
|
/**
|
|
989
|
-
* Returns a defensive copy of attached recorders
|
|
990
|
-
* implement `onEmit`. Useful for inspection during
|
|
1059
|
+
* Returns a defensive copy of attached recorders (both delivery tiers)
|
|
1060
|
+
* filtered to those that implement `onEmit`. Useful for inspection during
|
|
1061
|
+
* testing.
|
|
991
1062
|
*/
|
|
992
1063
|
getEmitRecorders() {
|
|
993
|
-
return this.
|
|
1064
|
+
return this.getScopeRecorders().filter((r) => typeof r.onEmit === 'function');
|
|
994
1065
|
}
|
|
995
1066
|
/**
|
|
996
1067
|
* Returns structured narrative entries — the single public narrative API.
|
|
@@ -1016,6 +1087,12 @@ class FlowChartExecutor {
|
|
|
1016
1087
|
recorders.push(this.combinedRecorder);
|
|
1017
1088
|
}
|
|
1018
1089
|
recorders.push(...this.flowRecorders);
|
|
1090
|
+
// Deferred-observer flow tap (RFC-001 Block 7) — captures every flow
|
|
1091
|
+
// event for deferred listeners. Appended like any other flow recorder,
|
|
1092
|
+
// so the FlowRecorderDispatcher site needs no tier logic of its own.
|
|
1093
|
+
const flowTap = this.deferredTier?.buildFlowTap();
|
|
1094
|
+
if (flowTap)
|
|
1095
|
+
recorders.push(flowTap);
|
|
1019
1096
|
return recorders.length > 0 ? recorders : undefined;
|
|
1020
1097
|
}
|
|
1021
1098
|
async run(options) {
|
|
@@ -1052,6 +1129,7 @@ class FlowChartExecutor {
|
|
|
1052
1129
|
for (const r of this.scopeRecorders) {
|
|
1053
1130
|
r.clear?.();
|
|
1054
1131
|
}
|
|
1132
|
+
this.deferredTier?.clearRecorders();
|
|
1055
1133
|
this.lastCheckpoint = undefined;
|
|
1056
1134
|
this._executionCounter = { value: 0 }; // Reset counter on fresh run
|
|
1057
1135
|
this._currentRunId = (0, runId_js_1.generateRunId)(); // Fresh runId per run() call
|
|
@@ -1062,9 +1140,20 @@ class FlowChartExecutor {
|
|
|
1062
1140
|
// no await between the top-of-method check and here, so this is race-free.
|
|
1063
1141
|
this._isExecuting = true;
|
|
1064
1142
|
try {
|
|
1065
|
-
|
|
1143
|
+
const result = await this.traverser.execute();
|
|
1144
|
+
// Terminal flush (RFC-001 Block 8) at the RESOLVE boundary: every
|
|
1145
|
+
// captured-but-undelivered observer event is delivered synchronously
|
|
1146
|
+
// before run() returns — "one beat behind" never becomes "lost at exit".
|
|
1147
|
+
this.deferredTier?.terminalFlush();
|
|
1148
|
+
return result;
|
|
1066
1149
|
}
|
|
1067
1150
|
catch (error) {
|
|
1151
|
+
// Terminal flush at the PAUSE and REJECT boundaries — this is the
|
|
1152
|
+
// OUTERMOST handler (a pause re-throws through subflow traversers
|
|
1153
|
+
// without exit events, so per-traverser hooks would miss it). Runs
|
|
1154
|
+
// before the checkpoint is exposed and before the error reaches the
|
|
1155
|
+
// caller.
|
|
1156
|
+
this.deferredTier?.terminalFlush();
|
|
1068
1157
|
if ((0, types_js_2.isPauseSignal)(error)) {
|
|
1069
1158
|
// Build a detached checkpoint from current execution state — see
|
|
1070
1159
|
// buildPauseCheckpoint() for the deep-copy rationale.
|
|
@@ -1080,6 +1169,20 @@ class FlowChartExecutor {
|
|
|
1080
1169
|
clearTimeout(timeoutId);
|
|
1081
1170
|
}
|
|
1082
1171
|
}
|
|
1172
|
+
/**
|
|
1173
|
+
* Flush the deferred-observer backlog, then await async listener
|
|
1174
|
+
* completions under a deadline (RFC-001 Block 8 — the serverless /
|
|
1175
|
+
* graceful-shutdown pattern: call before the process freezes or exits so
|
|
1176
|
+
* "one beat behind" work is not lost). Resolves immediately with zeros
|
|
1177
|
+
* when no deferred observer was ever attached. `pending === 0` means a
|
|
1178
|
+
* full drain; a non-zero `pending` reports continuations (plus any queued
|
|
1179
|
+
* events) still outstanding at the deadline — honest, never silent.
|
|
1180
|
+
*/
|
|
1181
|
+
drainObservers(opts) {
|
|
1182
|
+
if (!this.deferredTier)
|
|
1183
|
+
return Promise.resolve({ done: 0, failed: 0, pending: 0 });
|
|
1184
|
+
return this.deferredTier.drain(opts);
|
|
1185
|
+
}
|
|
1083
1186
|
// ─── Introspection ───
|
|
1084
1187
|
/**
|
|
1085
1188
|
* Returns the runtime snapshot.
|
|
@@ -1142,9 +1245,36 @@ class FlowChartExecutor {
|
|
|
1142
1245
|
});
|
|
1143
1246
|
}
|
|
1144
1247
|
}
|
|
1248
|
+
if (this.deferredTier) {
|
|
1249
|
+
// Deferred recorders are attached observers too — collect their
|
|
1250
|
+
// snapshots once per id (a combined recorder registers once in the
|
|
1251
|
+
// tier, unlike the two inline lists).
|
|
1252
|
+
const seen = new Set();
|
|
1253
|
+
for (const r of [...this.deferredTier.scopeListRecorders(), ...this.deferredTier.flowListRecorders()]) {
|
|
1254
|
+
if (seen.has(r.id))
|
|
1255
|
+
continue;
|
|
1256
|
+
seen.add(r.id);
|
|
1257
|
+
if (r.toSnapshot) {
|
|
1258
|
+
const snap = r.toSnapshot();
|
|
1259
|
+
recorderSnapshots.push({
|
|
1260
|
+
id: r.id,
|
|
1261
|
+
name: snap.name,
|
|
1262
|
+
description: snap.description,
|
|
1263
|
+
preferredOperation: snap.preferredOperation,
|
|
1264
|
+
data: snap.data,
|
|
1265
|
+
});
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1145
1269
|
if (recorderSnapshots.length > 0) {
|
|
1146
1270
|
snapshot.recorders = recorderSnapshots;
|
|
1147
1271
|
}
|
|
1272
|
+
// RFC-001 Block 9: the deferred-observer accounting surface. Present
|
|
1273
|
+
// ONLY when a deferred observer was attached on this executor —
|
|
1274
|
+
// zero-cost discipline for everyone else.
|
|
1275
|
+
if (this.deferredTier) {
|
|
1276
|
+
snapshot.observerStats = this.deferredTier.getStats();
|
|
1277
|
+
}
|
|
1148
1278
|
return snapshot;
|
|
1149
1279
|
}
|
|
1150
1280
|
/** @internal */
|
|
@@ -1189,4 +1319,4 @@ class FlowChartExecutor {
|
|
|
1189
1319
|
}
|
|
1190
1320
|
}
|
|
1191
1321
|
exports.FlowChartExecutor = FlowChartExecutor;
|
|
1192
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFHSCxpREFBb0g7QUFFcEgsbUdBQTZGO0FBRzdGLG1HQUE2RjtBQUU3RixtRUFBa0U7QUFDbEUscUZBQStFO0FBQy9FLGlEQVc0QjtBQUc1QixnREFBa0Q7QUFFbEQseUVBQXFIO0FBRXJILGtFQUF1RDtBQUN2RCwyRUFBa0U7QUFFbEUsNERBQXNEO0FBRXRELG1FQUFpRztBQUNqRywrREFBc0c7QUFDdEcseUNBQTJDO0FBQzNDLHlEQUFtRDtBQUVuRCwwRUFBMEU7QUFDMUUsTUFBTSxtQkFBbUIsR0FBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUMxRSxJQUFJLDRCQUFXLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7QUE0R2pELE1BQWEsaUJBQWlCO0lBQ3BCLFNBQVMsQ0FBbUM7SUFDcEQsOEVBQThFO0lBQ3RFLGlCQUFpQixHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3pDOzsrQkFFMkI7SUFDbkIsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUNuQixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDekIsZ0JBQWdCLENBQW9DO0lBQ3BELGdCQUFnQixDQUF3QztJQUN4RCxhQUFhLEdBQW1CLEVBQUUsQ0FBQztJQUNuQyxjQUFjLEdBQW9CLEVBQUUsQ0FBQztJQUNyQyxlQUFlLENBQThCO0lBQzdDLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdkMseUJBQXlCLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDM0QsY0FBYyxDQUFrQztJQUN4RDs7Ozs7Ozs7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YyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0I7UUFDaEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSw4Q0FBb0IsQ0FFcEUsQ0FBQztRQUNkLE9BQU8sUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLFNBQWlCO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksOENBQW9CLENBRXBFLENBQUM7UUFDZCxPQUFPLFFBQVEsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGO0FBcHhDRCw4Q0FveENDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Q2hhcnRFeGVjdXRvciDigJQgUHVibGljIEFQSSBmb3IgZXhlY3V0aW5nIGEgY29tcGlsZWQgRmxvd0NoYXJ0LlxuICpcbiAqIFdyYXBzIEZsb3djaGFydFRyYXZlcnNlci4gQnVpbGQgYSBjaGFydCB3aXRoIGZsb3dDaGFydCgpIGFuZCBwYXNzIHRoZSByZXN1bHQgaGVyZTpcbiAqXG4gKiAgIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdlbnRyeScsIGVudHJ5Rm4pLmFkZEZ1bmN0aW9uKCdwcm9jZXNzJywgcHJvY2Vzc0ZuKS5idWlsZCgpO1xuICpcbiAqICAgLy8gTm8tb3B0aW9ucyBmb3JtICh1c2VzIGF1dG8tZGV0ZWN0ZWQgVHlwZWRTY29wZSBmYWN0b3J5IGZyb20gdGhlIGNoYXJ0KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICpcbiAqICAgLy8gT3B0aW9ucy1vYmplY3QgZm9ybSAocHJlZmVycmVkIHdoZW4geW91IG5lZWQgdG8gY3VzdG9taXplIGJlaGF2aW9yKTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnkgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXRhY2hBbmRGb3JnZXQgYXMgX2RldGFjaEFuZEZvcmdldCwgZGV0YWNoQW5kSm9pbkxhdGVyIGFzIF9kZXRhY2hBbmRKb2luTGF0ZXIgfSBmcm9tICcuLi9kZXRhY2gvc3Bhd24uanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCB9IGZyb20gJy4uL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEV4ZWN1dG9yUmVzdWx0LFxuICB0eXBlIFBhdXNlZFJlc3VsdCxcbiAgdHlwZSBSdW5PcHRpb25zLFxuICB0eXBlIFNjb3BlRmFjdG9yeSxcbiAgdHlwZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHR5cGUgU3RhZ2VOb2RlLFxuICB0eXBlIFN0cmVhbUhhbmRsZXJzLFxuICB0eXBlIFN1YmZsb3dSZXN1bHQsXG4gIHR5cGUgVHJhdmVyc2FsUmVzdWx0LFxuICBkZWZhdWx0TG9nZ2VyLFxufSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkVHJhY2tpbmdNb2RlLCBTdGFnZVNuYXBzaG90LCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgaGFzRW1pdFJlY29yZGVyTWV0aG9kcywgaGFzRmxvd1JlY29yZGVyTWV0aG9kcywgaGFzUmVjb3JkZXJNZXRob2RzIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0VtaXRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9zY29wZS9kZXRlY3RDaXJjdWxhci5qcyc7XG5pbXBvcnQgeyBkZWVwRnJlZXplIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgU2NvcGVGYWNhZGUgfSBmcm9tICcuLi9zY29wZS9TY29wZUZhY2FkZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblBvbGljeSwgUmVkYWN0aW9uUmVwb3J0LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVzY3JpYmVDaGVja3BvaW50Q2xvbmVGYWlsdXJlLCBzYW5pdGl6ZURpYWdub3N0aWNCYWdzIH0gZnJvbSAnLi9jaGVja3BvaW50U2FuaXRpemUuanMnO1xuaW1wb3J0IHsgdHlwZSBSZWNvcmRlclNuYXBzaG90LCB0eXBlIFJ1bnRpbWVTbmFwc2hvdCwgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJ1bklkIH0gZnJvbSAnLi9ydW5JZC5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUlucHV0IH0gZnJvbSAnLi92YWxpZGF0ZUlucHV0LmpzJztcblxuLyoqIERlZmF1bHQgc2NvcGUgZmFjdG9yeSDigJQgY3JlYXRlcyBhIHBsYWluIFNjb3BlRmFjYWRlIGZvciBlYWNoIHN0YWdlLiAqL1xuY29uc3QgZGVmYXVsdFNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5ID0gKGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52KSA9PlxuICBuZXcgU2NvcGVGYWNhZGUoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnYpO1xuXG4vKipcbiAqIE9wdGlvbnMgb2JqZWN0IGZvciBgRmxvd0NoYXJ0RXhlY3V0b3JgIOKAlCBwcmVmZXJyZWQgb3ZlciBwb3NpdGlvbmFsIHBhcmFtcy5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleCA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwge1xuICogICBzY29wZUZhY3Rvcnk6IG15RmFjdG9yeSxcbiAqICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ6IHsgLi4uIH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICoqU3luYyBub3RlIGZvciBtYWludGFpbmVyczoqKiBFdmVyeSBmaWVsZCBhZGRlZCBoZXJlIG11c3QgYWxzbyBhcHBlYXIgaW4gdGhlXG4gKiBgZmxvd0NoYXJ0QXJnc2AgcHJpdmF0ZSBmaWVsZCB0eXBlIGFuZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb25cbiAqIGJsb2NrICh0aGUgYGVsc2UgaWZgIGJyYW5jaCB0aGF0IHJlYWRzIGZyb20gYG9wdHNgKS4gTWlzc2luZyBhbnkgb25lIG9mIHRoZVxuICogdGhyZWUgY2F1c2VzIHNpbGVudCBvbWlzc2lvbiDigJQgdGhlIG9wdGlvbiBpcyBhY2NlcHRlZCBidXQgbmV2ZXIgYXBwbGllZC5cbiAqXG4gKiAqKlRTY29wZSBpbmZlcmVuY2Ugbm90ZToqKiBXaGVuIHVzaW5nIHRoZSBvcHRpb25zLW9iamVjdCBmb3JtIHdpdGggYSBjdXN0b20gc2NvcGUsXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBpbmZlciBgVFNjb3BlYCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdC4gUGFzcyB0aGUgdHlwZVxuICogZXhwbGljaXRseTogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0LCBNeVNjb3BlPihjaGFydCwgeyBzY29wZUZhY3RvcnkgfSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGUgPSBhbnk+IHtcbiAgLy8g4pSA4pSAIENvbW1vbiBvcHRpb25zIChtb3N0IGNhbGxlcnMgbmVlZCBvbmx5IHRoZXNlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ3VzdG9tIHNjb3BlIGZhY3RvcnkuIERlZmF1bHRzIHRvIFR5cGVkU2NvcGUgb3IgU2NvcGVGYWNhZGUgYXV0by1kZXRlY3Rpb24uICovXG4gIHNjb3BlRmFjdG9yeT86IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuXG4gIC8vIOKUgOKUgCBDb250ZXh0IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIHByZS1wb3B1bGF0ZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgYmVmb3JlICoqZWFjaCoqIHN0YWdlXG4gICAqIChyZS1hcHBsaWVkIGV2ZXJ5IHN0YWdlLCBhY3RpbmcgYXMgYmFzZWxpbmUgZGVmYXVsdHMpLlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAvKipcbiAgICogSW5pdGlhbCBjb250ZXh0IHZhbHVlcyBtZXJnZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgKipvbmNlKiogYXQgc3RhcnR1cFxuICAgKiAoYXBwbGllZCBiZWZvcmUgdGhlIGZpcnN0IHN0YWdlLCBub3QgcmVwZWF0ZWQgb24gc3Vic2VxdWVudCBzdGFnZXMpLlxuICAgKiBEaXN0aW5jdCBmcm9tIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAsIHdoaWNoIGlzIHJlLWFwcGxpZWQgZXZlcnkgc3RhZ2UuXG4gICAqL1xuICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gIC8qKiBSZWFkLW9ubHkgaW5wdXQgYWNjZXNzaWJsZSB2aWEgYHNjb3BlLmdldEFyZ3MoKWAg4oCUIG5ldmVyIHRyYWNrZWQgb3Igd3JpdHRlbi4gKi9cbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcblxuICAvLyDilIDilIAgT2JzZXJ2YWJpbGl0eSBjb3N0IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgKCMxNCkuIERlZmF1bHQgYCdmdWxsJ2Ag4oCUIGV2ZXJ5XG4gICAqIHRyYWNrZWQgcmVhZCBgc3RydWN0dXJlZENsb25lYHMgdGhlIHZhbHVlIGludG8gdGhlIHN0YWdlJ3MgcmVhZCB2aWV3XG4gICAqICh0aGUgaGlzdG9yaWNhbCBiZWhhdmlvcjsgd2hhdCBsZW5zL2FnZW50Zm9vdHByaW50IHNuYXBzaG90cyBzaG93KS5cbiAgICogYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwIHR5cGUvc2l6ZS9wcmV2aWV3IG1hcmtlciBwZXIgcmVhZDsgYCdvZmYnYFxuICAgKiByZWNvcmRzIG5vdGhpbmcg4oCUIHplcm8gcGVyLXJlYWQgY2xvbmUgY29zdCAocmVhZHMgb2YgbGFyZ2UgdmFsdWVzIGJlY29tZVxuICAgKiB+ZnJlZSkuIE5hcnJhdGl2ZSBhbmQgYFNjb3BlUmVjb3JkZXIub25SZWFkYCBhcmUgaWRlbnRpY2FsIGluIGV2ZXJ5IG1vZGUuXG4gICAqIENhdmVhdDogdW5kZXIgYCdvZmYnYCBhIHN0YWdlJ3Mgc25hcHNob3QgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBvbmVcbiAgICogdGhhdCByZWFkIG5vdGhpbmcg4oCUIGF1ZGl0aW5nIGNvbnN1bWVycyB0aGF0IG5lZWQgXCJkaWQgaXQgcmVhZD9cIiB3aXRob3V0XG4gICAqIHRoZSB2YWx1ZSBjb3N0IHNob3VsZCBwcmVmZXIgYCdzdW1tYXJ5J2AuXG4gICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBgZXhlY3V0b3Iuc2V0UmVhZFRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAgICovXG4gIHJlYWRUcmFja2luZz86IFJlYWRUcmFja2luZ01vZGU7XG5cbiAgLyoqXG4gICAqIFBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgICgjMTNjLUEpIOKAlCB0aGUgc2libGluZyBvZlxuICAgKiB7QGxpbmsgcmVhZFRyYWNraW5nfTsgdGhlIHR3byBkaWFscyBhcmUgaW5kZXBlbmRlbnQuIERlZmF1bHQgYCdmdWxsJ2Ag4oCUXG4gICAqIGV2ZXJ5IHRyYWNrZWQgd3JpdGUgYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSB2YWx1ZSBpbnRvIHRoZSBzdGFnZSdzIHdyaXRlXG4gICAqIHZpZXcgKHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yKS4gYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwXG4gICAqIGBXcml0ZVN1bW1hcnlNYXJrZXJgICh0eXBlL3NpemUvcHJldmlldykgcGVyIHdyaXRlOyBgJ29mZidgIHJlY29yZHNcbiAgICogbm90aGluZyDigJQgYHN0YWdlV3JpdGVzYCBpcyBhYnNlbnQgZnJvbSB0aGUgc25hcHNob3QuXG4gICAqXG4gICAqIE9ic2VydmFibGUgY29uc2VxdWVuY2VzIOKAlCB3aGF0IHRoZSBwb2xpY3kgRE9FUyBnb3Zlcm46XG4gICAqIC0gYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgIChtYXJrZXJzIHVuZGVyIGAnc3VtbWFyeSdgLCBhYnNlbnQgdW5kZXJcbiAgICogICBgJ29mZidgKS5cbiAgICogLSBUaGUgY29tbWl0IG9ic2VydmVyIHBheWxvYWQ6IGBTY29wZVJlY29yZGVyLm9uQ29tbWl0KG11dGF0aW9ucylgXG4gICAqICAgcmVjZWl2ZXMgdGhlIHJldGFpbmVkIGBfc3RhZ2VXcml0ZXNgIGVudHJpZXMsIHNvIGl0IGNhcnJpZXMgdGhlIHNhbWVcbiAgICogICBtYXJrZXJzIHVuZGVyIGAnc3VtbWFyeSdgIGFuZCBhbiBlbXB0eSBtdXRhdGlvbnMgYmFnIHVuZGVyIGAnb2ZmJ2Ag4oCUXG4gICAqICAgZGVmZXJyZWQvb2JzZXJ2ZXIgY29uc3VtZXJzIHNlZSBleGFjdGx5IHdoYXQgcmV0ZW50aW9uIHN0b3JlZC5cbiAgICpcbiAgICogV2hhdCBpdCBkb2VzIE5PVCBnb3Zlcm46XG4gICAqIC0gVGhlIHdyaXRlcyB0aGVtc2VsdmVzOiBzaGFyZWQgc3RhdGUsIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIsIGFuZCB0aGVcbiAgICogICBDT01NSVQgTE9HIGFyZSBpZGVudGljYWwgaW4gZXZlcnkgbW9kZSAoY29tbWl0TG9nIHZhbHVlcyBrZWVwIHRoZWlyXG4gICAqICAgZnVsbCBwYXlsb2FkcyDigJQgdGhlIGxvc3NsZXNzIGxpbmVhci1jb3N0IGZpeCBmb3IgdGhvc2UgaXMgIzEzYy1CJ3NcbiAgICogICBkZWx0YSB2ZXJiLCBvdXQgb2Ygc2NvcGUgaGVyZSkuXG4gICAqIC0gUGVyLW9wIGBTY29wZVJlY29yZGVyLm9uV3JpdGVgIGV2ZW50cyDigJQgdGhleSBmaXJlIHdpdGggbGl2ZSB2YWx1ZXNcbiAgICogICByZWdhcmRsZXNzIChkZWxpdmVyeSB0aWVyLCBSRkMtMDAxJ3MgY29uY2VybiksIHNvIG5hcnJhdGl2ZSBvdXRwdXQgaXNcbiAgICogICBpZGVudGljYWwgaW4gZXZlcnkgbW9kZS5cbiAgICogLSBSZWRhY3Rpb246IGEgcG9saWN5L3Blci1jYWxsLXJlZGFjdGVkIHdyaXRlIHN0b3JlcyBgJ1tSRURBQ1RFRF0nYFxuICAgKiAgIHVuZGVyIGAnZnVsbCdgIEFORCBgJ3N1bW1hcnknYCAocmVkYWN0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGVcbiAgICogICBkaWFsOyBhIG1hcmtlciB3b3VsZCBsZWFrIHNpemUvcHJldmlldyksIGFuZCBub3RoaW5nIHVuZGVyIGAnb2ZmJ2AuXG4gICAqXG4gICAqIENhdmVhdDogdW5kZXIgYCdvZmYnYCBhIHN0YWdlJ3MgU05BUFNIT1QgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBvbmVcbiAgICogdGhhdCB3cm90ZSBub3RoaW5nIOKAlCBidXQgdW5saWtlIGByZWFkVHJhY2tpbmc6ICdvZmYnYCwgdGhlIGNvbW1pdCBsb2dcbiAgICogc3RpbGwgcmVjb3JkcyBldmVyeSBuZXQgY2hhbmdlLCBzbyBcImRpZCBpdCB3cml0ZT9cIiBzdGF5cyBhbnN3ZXJhYmxlLlxuICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICAgKi9cbiAgd3JpdGVUcmFja2luZz86IFdyaXRlVHJhY2tpbmdNb2RlO1xuXG4gIC8vIOKUgOKUgCBBZHZhbmNlZCAvIGVzY2FwZS1oYXRjaCBvcHRpb25zIChtb3N0IGNhbGxlcnMgZG8gbm90IG5lZWQgdGhlc2UpIOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgY2xhc3NpZmllciBmb3IgdGhyb3R0bGluZyBkZXRlY3Rpb24uIFJldHVybiBgdHJ1ZWAgaWYgdGhlXG4gICAqIGVycm9yIHJlcHJlc2VudHMgYSByYXRlLWxpbWl0IG9yIGJhY2twcmVzc3VyZSBjb25kaXRpb24gKHRoZSBleGVjdXRvciB3aWxsXG4gICAqIHRyZWF0IGl0IGRpZmZlcmVudGx5IGZyb20gaGFyZCBmYWlsdXJlcykuIERlZmF1bHRzIHRvIG5vIHRocm90dGxpbmcgY2xhc3NpZmljYXRpb24uXG4gICAqL1xuICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyPzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICAvKiogSGFuZGxlcnMgZm9yIHN0cmVhbWluZyBzdGFnZSBsaWZlY3ljbGUgZXZlbnRzIChzZWUgYGFkZFN0cmVhbWluZ0Z1bmN0aW9uYCkuICovXG4gIHN0cmVhbUhhbmRsZXJzPzogU3RyZWFtSGFuZGxlcnM7XG4gIC8qKiBTY29wZSBwcm90ZWN0aW9uIG1vZGUgZm9yIFR5cGVkU2NvcGUgZGlyZWN0LWFzc2lnbm1lbnQgZGV0ZWN0aW9uLiAqL1xuICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3dDaGFydEV4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHRyYXZlcnNlcjogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT47XG4gIC8qKiBTaGFyZWQgZXhlY3V0aW9uIGNvdW50ZXIg4oCUIHN1cnZpdmVzIHBhdXNlL3Jlc3VtZS4gUmVzZXQgb24gZnJlc2ggcnVuKCkuICovXG4gIHByaXZhdGUgX2V4ZWN1dGlvbkNvdW50ZXIgPSB7IHZhbHVlOiAwIH07XG4gIC8qKiBQZXItYHJ1bigpYCBpZGVudGlmaWVyIOKAlCBnZW5lcmF0ZWQgZnJlc2ggcGVyIHJ1biArIHBlciByZXN1bWUuIFRocmVhZGVkXG4gICAqICB0aHJvdWdoIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHQgc28gcmVjb3JkZXJzIGNhbiBzY29wZSBzdGF0ZSB0byBhIHNpbmdsZVxuICAgKiAgcnVuLiBTZWUgYHJ1bklkLnRzYC4gKi9cbiAgcHJpdmF0ZSBfY3VycmVudFJ1bklkID0gJyc7XG4gIHByaXZhdGUgbmFycmF0aXZlRW5hYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIG5hcnJhdGl2ZU9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSBjb21iaW5lZFJlY29yZGVyOiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGZsb3dSZWNvcmRlcnM6IEZsb3dSZWNvcmRlcltdID0gW107XG4gIHByaXZhdGUgc2NvcGVSZWNvcmRlcnM6IFNjb3BlUmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGlvblBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIHByaXZhdGUgbGFzdENoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBgdHJ1ZWAgb25jZSBgcnVuKClgIChvciBhIHByZXZpb3VzIGByZXN1bWUoKWApIGhhcyBleGVjdXRlZCBvblxuICAgKiB0aGlzIGluc3RhbmNlLiBgcmVzdW1lKClgIGJyYW5jaGVzIG9uIGl0OlxuICAgKlxuICAgKiAgIOKAoiB0cnVlICDihpIgcmV1c2UgdGhlIGNvbnN0cnVjdG9yLXRpbWUgcnVudGltZSAoc2FtZS1leGVjdXRvclxuICAgKiAgICAgICAgICAgICBjb250aW51aXR5OiBleGVjdXRpb24gdHJlZSwgcmVjb3JkZXJzLCBuYXJyYXRpdmVcbiAgICogICAgICAgICAgICAgYWNjdW11bGF0ZSBhY3Jvc3MgcGF1c2UvcmVzdW1lIGN5Y2xlcylcbiAgICogICDigKIgZmFsc2Ug4oaSIHNlZWQgYSBmcmVzaCBydW50aW1lIGZyb20gYGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVgXG4gICAqICAgICAgICAgICAgIChjcm9zcy1leGVjdXRvciAvIGNyb3NzLXByb2Nlc3MgcmVzdW1lOiBuZXcgaW5zdGFuY2VcbiAgICogICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcm9tIGEgc2VyaWFsaXplZCBjaGVja3BvaW50KVxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMgZmxhZywgZnJlc2ggZXhlY3V0b3JzIHNpbGVudGx5IGRpc2NhcmRlZCB0aGVcbiAgICogY2hlY2twb2ludCdzIHNoYXJlZFN0YXRlIGFuZCByZXN1bWUgaGFuZGxlcnMgY291bGRuJ3QgcmVhZCBwcmUtcGF1c2VcbiAgICogc2NvcGUuIFNlZSBgdGVzdC9saWIvcGF1c2UvY3Jvc3MtZXhlY3V0b3ItcmVzdW1lLnRlc3QudHNgLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFzUnVuQmVmb3JlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZS1lbnRyYW5jeSBndWFyZC4gYHJ1bigpYCBhbmQgYHJlc3VtZSgpYCBtdXRhdGUgcGVyLXJ1biBpbnN0YW5jZSBzdGF0ZVxuICAgKiAodHJhdmVyc2VyLCBydW5JZCwgZXhlY3V0aW9uIGNvdW50ZXIsIGNoZWNrcG9pbnQpIGFuZCBjbGVhciBhdHRhY2hlZFxuICAgKiByZWNvcmRlcnMg4oCUIGEgc2Vjb25kIGNvbmN1cnJlbnQgZW50cnkgb24gdGhlIFNBTUUgZXhlY3V0b3Igd291bGRcbiAgICogaW50ZXJsZWF2ZSBydW5JZHMgYW5kIGNyb3NzLWNvbnRhbWluYXRlIHJlY29yZGVyL25hcnJhdGl2ZSBzdGF0ZSwgYW5kXG4gICAqIGBnZXRDaGVja3BvaW50KClgIHdvdWxkIHJldHVybiB3aGljaGV2ZXIgcnVuIHBhdXNlZCBsYXN0LiBPbmUgZXhlY3V0b3IgPVxuICAgKiBvbmUgaW4tZmxpZ2h0IGV4ZWN1dGlvbjsgY3JlYXRlIGFuIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi5cbiAgICogU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC5cbiAgICovXG4gIHByaXZhdGUgX2lzRXhlY3V0aW5nID0gZmFsc2U7XG5cbiAgLy8gU1lOQyBSRVFVSVJFRDogZXZlcnkgb3B0aW9uYWwgZmllbGQgaGVyZSBtdXN0IG1pcnJvciBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNcbiAgLy8gQU5EIGJlIGFzc2lnbmVkIGluIHRoZSBjb25zdHJ1Y3RvcidzIG9wdGlvbnMtcmVzb2x1dGlvbiBibG9jayAodGhlIGBlbHNlIGlmYCBicmFuY2gpLlxuICAvLyBBZGRpbmcgYSBmaWVsZCB0byBvbmx5IG9uZSBvZiB0aGUgdGhyZWUgcGxhY2VzIGNhdXNlcyBzaWxlbnQgb21pc3Npb24uXG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd0NoYXJ0QXJnczoge1xuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT47XG4gICAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd247XG4gICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICAgIHJlYWRUcmFja2luZz86IFJlYWRUcmFja2luZ01vZGU7XG4gICAgd3JpdGVUcmFja2luZz86IFdyaXRlVHJhY2tpbmdNb2RlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBGbG93Q2hhcnRFeGVjdXRvci5cbiAgICpcbiAgICogKipPcHRpb25zIG9iamVjdCBmb3JtKiogKHByZWZlcnJlZCk6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeSwgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQgfSlcbiAgICogYGBgXG4gICAqXG4gICAqICoqMi1wYXJhbSBmb3JtKiogKGFsc28gc3VwcG9ydGVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBmbG93Q2hhcnQgLSBUaGUgY29tcGlsZWQgRmxvd0NoYXJ0IHJldHVybmVkIGJ5IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYFxuICAgKiBAcGFyYW0gZmFjdG9yeU9yT3B0aW9ucyAtIEEgYFNjb3BlRmFjdG9yeTxUU2NvcGU+YCBPUiBhIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPmAgb3B0aW9ucyBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIGZhY3RvcnlPck9wdGlvbnM/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+LFxuICApIHtcbiAgICAvLyBEZXRlY3Qgb3B0aW9ucy1vYmplY3QgZm9ybSB2cyBmYWN0b3J5IGZvcm1cbiAgICBsZXQgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IGluaXRpYWxDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCByZWFkT25seUNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IHRocm90dGxpbmdFcnJvckNoZWNrZXI6ICgoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1IYW5kbGVyczogU3RyZWFtSGFuZGxlcnMgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNjb3BlUHJvdGVjdGlvbk1vZGU6IFNjb3BlUHJvdGVjdGlvbk1vZGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlYWRUcmFja2luZzogUmVhZFRyYWNraW5nTW9kZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgd3JpdGVUcmFja2luZzogV3JpdGVUcmFja2luZ01vZGUgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnlPck9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIDItcGFyYW0gZm9ybTogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBzY29wZUZhY3RvcnkpXG4gICAgICBzY29wZUZhY3RvcnkgPSBmYWN0b3J5T3JPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAoZmFjdG9yeU9yT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBPcHRpb25zIG9iamVjdCBmb3JtXG4gICAgICBjb25zdCBvcHRzID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICAgIHNjb3BlRmFjdG9yeSA9IG9wdHMuc2NvcGVGYWN0b3J5O1xuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQgPSBvcHRzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0O1xuICAgICAgaW5pdGlhbENvbnRleHQgPSBvcHRzLmluaXRpYWxDb250ZXh0O1xuICAgICAgcmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyID0gb3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyO1xuICAgICAgc3RyZWFtSGFuZGxlcnMgPSBvcHRzLnN0cmVhbUhhbmRsZXJzO1xuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZSA9IG9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgICAgIHJlYWRUcmFja2luZyA9IG9wdHMucmVhZFRyYWNraW5nO1xuICAgICAgd3JpdGVUcmFja2luZyA9IG9wdHMud3JpdGVUcmFja2luZztcbiAgICB9XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzID0ge1xuICAgICAgZmxvd0NoYXJ0LFxuICAgICAgc2NvcGVGYWN0b3J5OiBzY29wZUZhY3RvcnkgPz8gZmxvd0NoYXJ0LnNjb3BlRmFjdG9yeSA/PyAoZGVmYXVsdFNjb3BlRmFjdG9yeSBhcyBTY29wZUZhY3Rvcnk8VFNjb3BlPiksXG4gICAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dCxcbiAgICAgIGluaXRpYWxDb250ZXh0LFxuICAgICAgcmVhZE9ubHlDb250ZXh0LFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgIHJlYWRUcmFja2luZyxcbiAgICAgIHdyaXRlVHJhY2tpbmcsXG4gICAgfTtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYXZlcnNlcihcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICByZWFkT25seUNvbnRleHRPdmVycmlkZT86IHVua25vd24sXG4gICAgZW52PzogaW1wb3J0KCcuLi9lbmdpbmUvdHlwZXMnKS5FeGVjdXRpb25FbnYsXG4gICAgbWF4RGVwdGg/OiBudW1iZXIsXG4gICAgbWF4SXRlcmF0aW9ucz86IG51bWJlcixcbiAgICBvdmVycmlkZXM/OiB7XG4gICAgICByb290PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gICAgICBwcmVzZXJ2ZVJlY29yZGVycz86IGJvb2xlYW47XG4gICAgICBleGlzdGluZ1J1bnRpbWU/OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+O1xuICAgICAgLyoqIFBlci1zdWJmbG93IHNjb3BlIGNhcHR1cmVzIGZyb20gYSBjaGVja3BvaW50IOKAlCBwYXNzZWQgdGhyb3VnaFxuICAgICAgICogIHRvIEhhbmRsZXJEZXBzIHNvIFN1YmZsb3dFeGVjdXRvciBjYW4gcmUtc2VlZCBuZXN0ZWQgcnVudGltZXNcbiAgICAgICAqICBvbiB0aGUgcmVzdW1lIHBhdGguIFVuZGVmaW5lZCBvbiBub3JtYWwgcnVuKCkgcGF0aHMuICovXG4gICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgICAgLyoqIFJlc3VtZS1vbmx5IG92ZXJyaWRlIG9mIHRoZSBzdWJmbG93cyBkaWN0IOKAlCBzdWJzdGl0dXRlcyB0aGVcbiAgICAgICAqICBsZWFmIHN1YmZsb3cncyByb290IHdpdGggYSByZXN1bWUgY2hhaW4gc28gdGhlIHN1YmZsb3cgYm9keVxuICAgICAgICogIHBpY2tzIHVwIGF0IHRoZSBwYXVzZSBwb2ludC4gT3RoZXIgZW50cmllcyBwYXNzIHRocm91Z2hcbiAgICAgICAqICB1bmNoYW5nZWQuICovXG4gICAgICBzdWJmbG93c092ZXJyaWRlPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgICB9LFxuICApOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZmxvd0NoYXJ0QXJncztcbiAgICBjb25zdCBmYyA9IGFyZ3MuZmxvd0NoYXJ0O1xuICAgIGNvbnN0IG5hcnJhdGl2ZUZsYWcgPSB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgfHwgKGZjLmVuYWJsZU5hcnJhdGl2ZSA/PyBmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgQ29tcG9zZWQgc2NvcGUgZmFjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAvLyBDb2xsZWN0IGFsbCBzY29wZSBtb2RpZmllcnMgKHJlY29yZGVycywgcmVkYWN0aW9uKSBpbnRvIGEgc2luZ2xlIGxpc3QsXG4gICAgLy8gdGhlbiBjcmVhdGUgT05FIGZhY3RvcnkgdGhhdCBhcHBsaWVzIHRoZW0gaW4gYSBsb29wLiBSZXBsYWNlcyB0aGVcbiAgICAvLyBwcmV2aW91cyA0LWRlZXAgY2xvc3VyZSBuZXN0aW5nIHdpdGggYSBmbGF0LCBkZWJ1Z2dhYmxlIGNvbXBvc2l0aW9uLlxuXG4gICAgaWYgKG92ZXJyaWRlcz8ucHJlc2VydmVSZWNvcmRlcnMpIHtcbiAgICAgIC8vIFJlc3VtZSBtb2RlOiBrZWVwIGV4aXN0aW5nIGNvbWJpbmVkUmVjb3JkZXIgc28gbmFycmF0aXZlIGFjY3VtdWxhdGVzXG4gICAgfSBlbHNlIGlmIChuYXJyYXRpdmVGbGFnKSB7XG4gICAgICB0aGlzLmNvbWJpbmVkUmVjb3JkZXIgPSBuZXcgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlcih0aGlzLm5hcnJhdGl2ZU9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbWJpbmVkUmVjb3JkZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5zaGFyZWRSZWRhY3RlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG5cbiAgICAvLyBCdWlsZCBtb2RpZmllciBsaXN0IOKAlCBlYWNoIG1vZGlmaWVyIHJlY2VpdmVzIHRoZSBzY29wZSBhZnRlciBjcmVhdGlvblxuICAgIHR5cGUgU2NvcGVNb2RpZmllciA9IChzY29wZTogYW55KSA9PiB2b2lkO1xuICAgIGNvbnN0IG1vZGlmaWVyczogU2NvcGVNb2RpZmllcltdID0gW107XG5cbiAgICAvLyAxLiBOYXJyYXRpdmUgcmVjb3JkZXIgKGlmIGVuYWJsZWQpXG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmNvbWJpbmVkUmVjb3JkZXI7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyID09PSAnZnVuY3Rpb24nKSBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDIuIFVzZXItcHJvdmlkZWQgc2NvcGUgcmVjb3JkZXJzXG4gICAgaWYgKHRoaXMuc2NvcGVSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycztcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmF0dGFjaFNjb3BlUmVjb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgcmVjb3JkZXJzKSBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyKHIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWRhY3Rpb24gcG9saWN5IChjb25kaXRpb25hbCDigJQgb25seSB3aGVuIHBvbGljeSBpcyBzZXQpXG4gICAgaWYgKHRoaXMucmVkYWN0aW9uUG9saWN5KSB7XG4gICAgICBjb25zdCBwb2xpY3kgPSB0aGlzLnJlZGFjdGlvblBvbGljeTtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeShwb2xpY3kpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIFByZS1wb3B1bGF0ZSBleGVjdXRvci1sZXZlbCBmaWVsZCByZWRhY3Rpb24gbWFwIGZyb20gcG9saWN5XG4gICAgICAvLyBzbyBnZXRSZWRhY3Rpb25SZXBvcnQoKSBpbmNsdWRlcyBmaWVsZC1sZXZlbCByZWRhY3Rpb25zLlxuICAgICAgaWYgKHBvbGljeS5maWVsZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHBvbGljeS5maWVsZHMpKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5LnNldChrZXksIG5ldyBTZXQoZmllbGRzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21wb3NlOiBiYXNlIGZhY3RvcnkgKyBtb2RpZmllcnMgaW4gYSBzaW5nbGUgcGFzcy5cbiAgICAvLyBTaGFyZWQgcmVkYWN0ZWQga2V5cyBhcmUgQUxXQVlTIHdpcmVkIHVwICh1bmNvbmRpdGlvbmFsIOKAlCBlbnN1cmVzIGNyb3NzLXN0YWdlXG4gICAgLy8gcHJvcGFnYXRpb24gZXZlbiB3aXRob3V0IGEgcG9saWN5LCBiZWNhdXNlIHN0YWdlcyBjYW4gY2FsbCBzZXRWYWx1ZShrZXksIHZhbCwgdHJ1ZSlcbiAgICAvLyBmb3IgcGVyLWNhbGwgcmVkYWN0aW9uKS4gT3B0aW9uYWwgbW9kaWZpZXJzIChyZWNvcmRlcnMsIHBvbGljeSkgYXJlIGluIHRoZSBsaXN0LlxuICAgIGNvbnN0IGJhc2VGYWN0b3J5ID0gYXJncy5zY29wZUZhY3Rvcnk7XG4gICAgY29uc3Qgc2hhcmVkUmVkYWN0ZWRLZXlzID0gdGhpcy5zaGFyZWRSZWRhY3RlZEtleXM7XG4gICAgY29uc3Qgc2NvcGVGYWN0b3J5ID0gKChjdHg6IGFueSwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5PzogdW5rbm93biwgZW52QXJnPzogYW55KSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IGJhc2VGYWN0b3J5KGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52QXJnKTtcbiAgICAgIC8vIEFsd2F5cyB3aXJlIHNoYXJlZCByZWRhY3Rpb24gc3RhdGVcbiAgICAgIGlmICh0eXBlb2YgKHNjb3BlIGFzIGFueSkudXNlU2hhcmVkUmVkYWN0ZWRLZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRSZWRhY3RlZEtleXMpO1xuICAgICAgfVxuICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgbW9kaWZpZXJzXG4gICAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2RpZmllcnMpIG1vZChzY29wZSk7XG4gICAgICByZXR1cm4gc2NvcGU7XG4gICAgfSkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgICBjb25zdCBlZmZlY3RpdmVSb290ID0gb3ZlcnJpZGVzPy5yb290ID8/IGZjLnJvb3Q7XG4gICAgY29uc3QgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQgPSBvdmVycmlkZXM/LmluaXRpYWxDb250ZXh0ID8/IGFyZ3MuaW5pdGlhbENvbnRleHQ7XG5cbiAgICBsZXQgcnVudGltZTogRXhlY3V0aW9uUnVudGltZTtcbiAgICBpZiAob3ZlcnJpZGVzPy5leGlzdGluZ1J1bnRpbWUpIHtcbiAgICAgIC8vIFJlc3VtZSBtb2RlOiByZXVzZSBleGlzdGluZyBydW50aW1lIHNvIGV4ZWN1dGlvbiB0cmVlIGNvbnRpbnVlcyBmcm9tIHBhdXNlIHBvaW50LlxuICAgICAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIHJvb3QgZm9yIGdldFNuYXBzaG90KCkgKGZ1bGwgdHJlZSksIHRoZW4gYWR2YW5jZVxuICAgICAgLy8gcm9vdFN0YWdlQ29udGV4dCB0byBhIGNvbnRpbnVhdGlvbiBmcm9tIHRoZSBsZWFmIChmb3IgdHJhdmVyc2FsKS5cbiAgICAgIHJ1bnRpbWUgPSBvdmVycmlkZXMuZXhpc3RpbmdSdW50aW1lO1xuICAgICAgcnVudGltZS5wcmVzZXJ2ZVNuYXBzaG90Um9vdCgpO1xuICAgICAgbGV0IGxlYWYgPSBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgICB3aGlsZSAobGVhZi5uZXh0KSBsZWFmID0gbGVhZi5uZXh0O1xuICAgICAgcnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbGVhZi5jcmVhdGVOZXh0KCcnLCBlZmZlY3RpdmVSb290Lm5hbWUsIGVmZmVjdGl2ZVJvb3QuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBydW50aW1lID0gbmV3IEV4ZWN1dGlvblJ1bnRpbWUoXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QubmFtZSxcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5pZCxcbiAgICAgICAgYXJncy5kZWZhdWx0VmFsdWVzRm9yQ29udGV4dCxcbiAgICAgICAgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFdoZW4gYSByZWRhY3Rpb24gcG9saWN5IGlzIGNvbmZpZ3VyZWQsIG1haW50YWluIGEgcGFyYWxsZWwgcmVkYWN0ZWRcbiAgICAvLyBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYCBkdXJpbmcgdHJhdmVyc2FsLiBFYWNoIGNvbW1pdCBhcHBsaWVzIHRoZVxuICAgIC8vIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyDigJQgc2FtZSBvbmVzIGZlZCB0byB0aGUgZXZlbnQgbG9nIOKAlFxuICAgIC8vIHNvIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgcmV0dXJucyBhIHNjcnViYmVkIHNoYXJlZFN0YXRlIGF0XG4gICAgLy8gemVybyBwb3N0LXBhc3MgY29zdC4gU2tpcHBlZCB3aGVuIG5vIHBvbGljeSBleGlzdHMgKHplcm8gYWxsb2NhdGlvbikuXG4gICAgaWYgKHRoaXMucmVkYWN0aW9uUG9saWN5KSB7XG4gICAgICBydW50aW1lLmVuYWJsZVJlZGFjdGVkTWlycm9yKCk7XG4gICAgfVxuXG4gICAgLy8gUmVhZC10cmFja2luZyBwb2xpY3kgKCMxNCk6IHNldCBvbiB0aGUgcnVudGltZSdzIHJvb3QgY29udGV4dCBzbyBldmVyeVxuICAgIC8vIGRlc2NlbmRhbnQgY29udGV4dCAoY3JlYXRlTmV4dC9jcmVhdGVDaGlsZCkgYW5kIHN1YmZsb3cgcm9vdCBpbmhlcml0cy5cbiAgICAvLyBBcHBsaWVkIEFGVEVSIHRoZSByZXN1bWUtcGF0aCByb290IHN3YXAgYWJvdmUgc28gdGhlIGNvbnRpbnVhdGlvbiByb290XG4gICAgLy8gY2FycmllcyB0aGUgcG9saWN5IHRvby4gU2tpcHBlZCBmb3IgdGhlIGRlZmF1bHQgJ2Z1bGwnIOKAlCB6ZXJvIHdvcmsuXG4gICAgY29uc3QgcmVhZFRyYWNraW5nID0gYXJncy5yZWFkVHJhY2tpbmc7XG4gICAgaWYgKHJlYWRUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmIHJlYWRUcmFja2luZyAhPT0gJ2Z1bGwnKSB7XG4gICAgICBydW50aW1lLnVzZVJlYWRUcmFja2luZyhyZWFkVHJhY2tpbmcpO1xuICAgIH1cblxuICAgIC8vIFdyaXRlLXRyYWNraW5nIHBvbGljeSAoIzEzYy1BKTogaWRlbnRpY2FsIHBsdW1iaW5nIHRvIHJlYWRUcmFja2luZyDigJRcbiAgICAvLyBzYW1lIHJvb3QtY29udGV4dCBhbmNob3IsIHNhbWUgaW5oZXJpdGFuY2UsIHNhbWUgcmVzdW1lLXBhdGggb3JkZXJpbmcuXG4gICAgY29uc3Qgd3JpdGVUcmFja2luZyA9IGFyZ3Mud3JpdGVUcmFja2luZztcbiAgICBpZiAod3JpdGVUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmIHdyaXRlVHJhY2tpbmcgIT09ICdmdWxsJykge1xuICAgICAgcnVudGltZS51c2VXcml0ZVRyYWNraW5nKHdyaXRlVHJhY2tpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgcm9vdDogZWZmZWN0aXZlUm9vdCxcbiAgICAgIHN0YWdlTWFwOiBmYy5zdGFnZU1hcCxcbiAgICAgIHNjb3BlRmFjdG9yeSxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHJ1bnRpbWUsXG4gICAgICByZWFkT25seUNvbnRleHQ6IHJlYWRPbmx5Q29udGV4dE92ZXJyaWRlID8/IGFyZ3MucmVhZE9ubHlDb250ZXh0LFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogYXJncy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnM6IGFyZ3Muc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBhcmdzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgICBuYXJyYXRpdmVFbmFibGVkOiBuYXJyYXRpdmVGbGFnLFxuICAgICAgYnVpbGRUaW1lU3RydWN0dXJlOiBmYy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICBsb2dnZXI6IGZjLmxvZ2dlciA/PyBkZWZhdWx0TG9nZ2VyLFxuICAgICAgc2lnbmFsLFxuICAgICAgZXhlY3V0aW9uRW52OiBlbnYsXG4gICAgICBmbG93UmVjb3JkZXJzOiB0aGlzLmJ1aWxkRmxvd1JlY29yZGVyc0xpc3QoKSxcbiAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsXG4gICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgLi4uKG92ZXJyaWRlcz8uc3ViZmxvd3NPdmVycmlkZSAmJiB7IHN1YmZsb3dzOiBvdmVycmlkZXMuc3ViZmxvd3NPdmVycmlkZSB9KSxcbiAgICAgIC4uLihvdmVycmlkZXM/LnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgJiYge1xuICAgICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lOiBvdmVycmlkZXMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSxcbiAgICAgIH0pLFxuICAgICAgLi4uKG1heERlcHRoICE9PSB1bmRlZmluZWQgJiYgeyBtYXhEZXB0aCB9KSxcbiAgICAgIC4uLihtYXhJdGVyYXRpb25zICE9PSB1bmRlZmluZWQgJiYgeyBtYXhJdGVyYXRpb25zIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZW5hYmxlTmFycmF0aXZlKG9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMubmFycmF0aXZlRW5hYmxlZCA9IHRydWU7XG4gICAgaWYgKG9wdGlvbnMpIHRoaXMubmFycmF0aXZlT3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeSB0aGF0IGFwcGxpZXMgdG8gYWxsIHN0YWdlcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKi9cbiAgc2V0UmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3Rpb25Qb2xpY3kgPSBwb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByZWFkLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgKCMxNCkuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS4gRXF1aXZhbGVudCB0byB0aGUgYHJlYWRUcmFja2luZ2BcbiAgICogY29uc3RydWN0b3Igb3B0aW9uIOKAlCBzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy5yZWFkVHJhY2tpbmd9XG4gICAqIGZvciB0aGUgbW9kZSBzZW1hbnRpY3MgKCdmdWxsJyBkZWZhdWx0IC8gJ3N1bW1hcnknIC8gJ29mZicpLlxuICAgKi9cbiAgc2V0UmVhZFRyYWNraW5nKG1vZGU6IFJlYWRUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MucmVhZFRyYWNraW5nID0gbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHdyaXRlLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgICgjMTNjLUEpLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuIEVxdWl2YWxlbnQgdG8gdGhlIGB3cml0ZVRyYWNraW5nYFxuICAgKiBjb25zdHJ1Y3RvciBvcHRpb24g4oCUIHNlZSB7QGxpbmsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zLndyaXRlVHJhY2tpbmd9XG4gICAqIGZvciB0aGUgbW9kZSBzZW1hbnRpY3MgKCdmdWxsJyBkZWZhdWx0IC8gJ3N1bW1hcnknIC8gJ29mZicpLCB0aGVcbiAgICogb25Db21taXQtcGF5bG9hZCBjb25zZXF1ZW5jZSwgYW5kIHRoZSByZWRhY3Rpb24tcHJlY2VkZW5jZSBydWxlLlxuICAgKi9cbiAgc2V0V3JpdGVUcmFja2luZyhtb2RlOiBXcml0ZVRyYWNraW5nTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncy53cml0ZVRyYWNraW5nID0gbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eSBmcm9tIHRoZVxuICAgKiBtb3N0IHJlY2VudCBydW4uIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICBjb25zdCBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiB0aGlzLnNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkpIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9uc1trZXldID0gWy4uLmZpZWxkc107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZWRhY3RlZEtleXM6IFsuLi50aGlzLnNoYXJlZFJlZGFjdGVkS2V5c10sXG4gICAgICBmaWVsZFJlZGFjdGlvbnMsXG4gICAgICBwYXR0ZXJuczogKHRoaXMucmVkYWN0aW9uUG9saWN5Py5wYXR0ZXJucyA/PyBbXSkubWFwKChwKSA9PiBwLnNvdXJjZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQYXVzZS9SZXN1bWUg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNoZWNrcG9pbnQgZnJvbSB0aGUgbW9zdCByZWNlbnQgcGF1c2VkIGV4ZWN1dGlvbiwgb3IgYHVuZGVmaW5lZGBcbiAgICogaWYgdGhlIGxhc3QgcnVuIGNvbXBsZXRlZCB3aXRob3V0IHBhdXNpbmcuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGlzIEpTT04tc2VyaWFsaXphYmxlIOKAlCBzdG9yZSBpdCBpbiBSZWRpcywgUG9zdGdyZXMsIGxvY2FsU3RvcmFnZSwgZXRjLlxuICAgKlxuICAgKiBJdCBpcyBmdWxseSBERVRBQ0hFRCBmcm9tIGVuZ2luZSBzdGF0ZTogZXZlcnkgZmllbGQgd2FzIGRlZXAtY29waWVkIGF0XG4gICAqIHBhdXNlIHRpbWUgKHNlZSBgYnVpbGRQYXVzZUNoZWNrcG9pbnRgKS4gSG9sZGluZywgbXV0YXRpbmcsIG9yIHBlcnNpc3RpbmdcbiAgICogaXQgY2Fubm90IGFmZmVjdCB0aGUgZXhlY3V0b3IsIGFuZCBhIGxhdGVyIHNhbWUtZXhlY3V0b3IgcmVzdW1lIGNhbm5vdFxuICAgKiBtdXRhdGUgYSBjaGVja3BvaW50IHlvdSBhbHJlYWR5IHN0b3JlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAgICogaWYgKGV4ZWN1dG9yLmlzUGF1c2VkKCkpIHtcbiAgICogICBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogICBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRDaGVja3BvaW50KCk6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50O1xuICB9XG5cbiAgLyoqIFJldHVybnMgYHRydWVgIGlmIHRoZSBtb3N0IHJlY2VudCBydW4oKSB3YXMgcGF1c2VkIChjaGVja3BvaW50IGF2YWlsYWJsZSkuICovXG4gIGlzUGF1c2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50ICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogTnVtYmVyIG9mIGNvbW1pdHMgaW4gdGhlIHJ1bidzIGNvbW1pdCBsb2cuIE8oMSkg4oCUIGRpcmVjdCBsZW5ndGhcbiAgICogcmVhZCwgbm8gc25hcHNob3QgbWF0ZXJpYWxpemF0aW9uLiBVc2UgdGhpcyB0byBzdGFtcCBjb21taXRcbiAgICogaW5kaWNlcyBvbiBvYnNlcnZlciBldmVudHMgKGUuZy4sIGBCb3VuZGFyeVJlY29yZGVyYCBzdG9yaW5nXG4gICAqIGBjb21taXRJZHhCZWZvcmVgIC8gYGNvbW1pdElkeEFmdGVyYCBwZXIgZG9tYWluIGV2ZW50IGZvclxuICAgKiBgQ29tbWl0UmFuZ2VJbmRleGAgcXVlcmllcyDigJQgc2VlIGBmb290cHJpbnRqcy90cmFjZWApLlxuICAgKlxuICAgKiBSZXR1cm5zIDAgYmVmb3JlIGFueSBydW47IGFmdGVyLCByZXR1cm5zIHRoZSBjdW11bGF0aXZlIGNvbW1pdFxuICAgKiBjb3VudCBhY3Jvc3MgdGhlIGV4ZWN1dG9yJ3MgbGlmZXRpbWUgKGluY2x1ZGluZyByZXN1bWVzKS5cbiAgICpcbiAgICogSU1QTEVNRU5UQVRJT04gTk9URTogdGhpcyByZXR1cm5zIGBydW50aW1lLmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoYCxcbiAgICogd2hpY2ggaXMgdGhlIHNhbWUgdmFsdWUgYXMgYGdldFNuYXBzaG90KCkuY29tbWl0TG9nLmxlbmd0aGAuIFRoZVxuICAgKiBuYW1pbmcgYXN5bW1ldHJ5IGlzIGhpc3RvcmljYWwg4oCUIHRoZSB1bmRlcmx5aW5nIGBFdmVudExvZ2AgZmllbGRcbiAgICogaXMgbmFtZWQgYGV4ZWN1dGlvbkhpc3RvcnlgIGJ1dCBzdG9yZXMgdGhlIGBDb21taXRCdW5kbGVbXWAgdGhhdFxuICAgKiBgY29tbWl0TG9nYCBleHBvc2VzLiBUaGV5IGFyZSB0aGUgU0FNRSBhcnJheSAodmVyaWZpZWQgYnkgdGhlXG4gICAqIFwibWF0Y2hlcyBjb21taXRMb2cubGVuZ3RoXCIgaW50ZWdyYXRpb24gdGVzdCkuXG4gICAqL1xuICBnZXRDb21taXRDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPiB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcnVudGltZT8uZXhlY3V0aW9uSGlzdG9yeS5sZW5ndGggPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgYSBwYXVzZWQgZmxvd2NoYXJ0IGZyb20gYSBjaGVja3BvaW50LlxuICAgKlxuICAgKiBSZXN0b3JlcyB0aGUgc2NvcGUgc3RhdGUsIGNhbGxzIHRoZSBwYXVzZWQgc3RhZ2UncyBgcmVzdW1lRm5gIHdpdGggdGhlXG4gICAqIHByb3ZpZGVkIGlucHV0LCB0aGVuIGNvbnRpbnVlcyB0cmF2ZXJzYWwgZnJvbSB0aGUgbmV4dCBzdGFnZS5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgY2FuIGNvbWUgZnJvbSBgZ2V0Q2hlY2twb2ludCgpYCBvbiBhIHByZXZpb3VzIHJ1biwgb3IgZnJvbVxuICAgKiBhIHNlcmlhbGl6ZWQgY2hlY2twb2ludCBzdG9yZWQgaW4gUmVkaXMvUG9zdGdyZXMvbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiAqKk5hcnJhdGl2ZS9yZWNvcmRlciBzdGF0ZSBpcyByZXNldCBvbiByZXN1bWUuKiogVG8ga2VlcCBhIHVuaWZpZWQgbmFycmF0aXZlXG4gICAqIGFjcm9zcyBwYXVzZS9yZXN1bWUgY3ljbGVzLCBjb2xsZWN0IGl0IGJlZm9yZSBjYWxsaW5nIHJlc3VtZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBQcm9jZXNzIEEg4oCUIGFmdGVyIGEgcGF1c2UsIHBlcnNpc3QgdGhlIGNoZWNrcG9pbnQ6XG4gICAqIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICAgKiBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqXG4gICAqIC8vIFByb2Nlc3MgQiAocG9zc2libHkgZGlmZmVyZW50IHNlcnZlciwgc2FtZSBjaGFydCkg4oCUIHJlc3RvcmUgYW5kIHJlc3VtZTpcbiAgICogY29uc3QgcmVzdG9yZWQgPSBKU09OLnBhcnNlKGF3YWl0IHJlZGlzLmdldChgc2Vzc2lvbjoke2lkfWApKTtcbiAgICogY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5yZXN1bWUocmVzdG9yZWQsIHsgYXBwcm92ZWQ6IHRydWUgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzdW1lKFxuICAgIGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQsXG4gICAgcmVzdW1lSW5wdXQ/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQaWNrPFJ1bk9wdGlvbnMsICdzaWduYWwnIHwgJ2VudicgfCAnbWF4RGVwdGgnIHwgJ21heEl0ZXJhdGlvbnMnPixcbiAgKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIC8vIFJlLWVudHJhbmN5IGd1YXJkIEZJUlNUIOKAlCByZXN1bWUoKSBtdXRhdGVzIHRoZSBzYW1lIHBlci1ydW4gc3RhdGUgcnVuKClcbiAgICAvLyBkb2VzICh0cmF2ZXJzZXIsIHJ1bklkLCBjaGVja3BvaW50KSwgc28gcmVzdW1lLWR1cmluZy1ydW4gYW5kXG4gICAgLy8gZG91YmxlLXJlc3VtZSBhcmUgdGhlIHNhbWUgY29ycnVwdGlvbiBjbGFzcyBhcyBjb25jdXJyZW50IHJ1bigpLlxuICAgIGlmICh0aGlzLl9pc0V4ZWN1dGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRmxvd0NoYXJ0RXhlY3V0b3I6IHJlc3VtZSgpIGNhbGxlZCB3aGlsZSBhbm90aGVyIHJ1bigpL3Jlc3VtZSgpIGlzIGluIGZsaWdodCBvbiB0aGlzICcgK1xuICAgICAgICAgICdleGVjdXRvci4gQW4gZXhlY3V0b3IgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycywgY2hlY2twb2ludCkg4oCUIGNyZWF0ZSAnICtcbiAgICAgICAgICAnb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi4gU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8g4pSA4pSAIFZhbGlkYXRlIGNoZWNrcG9pbnQgc3RydWN0dXJlIChtYXkgY29tZSBmcm9tIHVudHJ1c3RlZCBleHRlcm5hbCBzdG9yYWdlKSDilIDilIBcbiAgICAvLyAobGFzdENoZWNrcG9pbnQgaXMgd2lwZWQgQUZURVIgdmFsaWRhdGlvbiDigJQgYSByZWplY3RlZCBjaGVja3BvaW50IG11c3RcbiAgICAvLyBub3QgZGVzdHJveSB0aGUgZXhlY3V0b3IncyBleGlzdGluZyBjaGVja3BvaW50IHN0YXRlLilcbiAgICBpZiAoXG4gICAgICAhY2hlY2twb2ludCB8fFxuICAgICAgdHlwZW9mIGNoZWNrcG9pbnQgIT09ICdvYmplY3QnIHx8XG4gICAgICB0eXBlb2YgY2hlY2twb2ludC5zaGFyZWRTdGF0ZSAhPT0gJ29iamVjdCcgfHxcbiAgICAgIGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUgPT09IG51bGwgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkoY2hlY2twb2ludC5zaGFyZWRTdGF0ZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBzaGFyZWRTdGF0ZSBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCAhPT0gJ3N0cmluZycgfHwgY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHBhdXNlZFN0YWdlSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFBcnJheS5pc0FycmF5KGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpIHx8XG4gICAgICAhY2hlY2twb2ludC5zdWJmbG93UGF0aC5ldmVyeSgoczogdW5rbm93bikgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHN1YmZsb3dQYXRoIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncy4nKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBwYXVzZWQgbm9kZSBpbiB0aGUgZ3JhcGhcbiAgICBjb25zdCBwYXVzZWROb2RlID0gdGhpcy5maW5kTm9kZUluR3JhcGgoY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkLCBjaGVja3BvaW50LnN1YmZsb3dQYXRoKTtcbiAgICBpZiAoIXBhdXNlZE5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke2NoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZH0nIG5vdCBmb3VuZCBpbiBmbG93Y2hhcnQuIGAgK1xuICAgICAgICAgICdUaGUgY2hhcnQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFwYXVzZWROb2RlLnJlc3VtZUZuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdGFnZSAnJHtwYXVzZWROb2RlLm5hbWV9JyAoJHtwYXVzZWROb2RlLmlkfSkgaGFzIG5vIHJlc3VtZUZuLiBgICtcbiAgICAgICAgICAnT25seSBzdGFnZXMgY3JlYXRlZCB3aXRoIGFkZFBhdXNhYmxlRnVuY3Rpb24oKSBjYW4gYmUgcmVzdW1lZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIEJ1aWxkIGEgc3ludGhldGljIHJlc3VtZSBub2RlOiBjYWxscyByZXN1bWVGbiB3aXRoIHJlc3VtZUlucHV0LCB0aGVuIGNvbnRpbnVlcy5cbiAgICAvLyByZXN1bWVGbiBzaWduYXR1cmUgaXMgKHNjb3BlLCBpbnB1dCkgcGVyIFBhdXNhYmxlSGFuZGxlciDigJQgd3JhcCB0byBtYXRjaCBTdGFnZUZ1bmN0aW9uKHNjb3BlLCBicmVha0ZuKS5cbiAgICBjb25zdCByZXN1bWVGbiA9IHBhdXNlZE5vZGUucmVzdW1lRm47XG4gICAgY29uc3QgcmVzdW1lU3RhZ2VGbiA9IChzY29wZTogVFNjb3BlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzdW1lRm4oc2NvcGUsIHJlc3VtZUlucHV0KTtcbiAgICB9O1xuXG4gICAgLy8gRGV0ZXJtaW5lIGNvbnRpbnVhdGlvbjogZm9yIGJyYW5jaCBjaGlsZHJlbiAoZGVjaWRlci9zZWxlY3RvciksXG4gICAgLy8gcGF1c2VkTm9kZS5uZXh0IGlzIHVuZGVmaW5lZC4gVGhlIGNoZWNrcG9pbnQnc1xuICAgIC8vIGNvbnRpbnVhdGlvblN0YWdlSWQgKGNvbGxlY3RlZCBkdXJpbmcgdHJhdmVyc2FsIGJ1YmJsZS11cClcbiAgICAvLyBwb2ludHMgdG8gdGhlIGludm9rZXIncyBuZXh0IG5vZGUuXG4gICAgLy9cbiAgICAvLyBGb3IgcGF1c2VzIGluc2lkZSBhIHN1YmZsb3csIHRoZSBjb250aW51YXRpb24gbGl2ZXMgSU5TSURFIHRoZVxuICAgIC8vIGxlYWYgc3ViZmxvdyAoZS5nLiwgdGhlIGxvb3AgdGFyZ2V0IGJhY2sgdG8gYG1lc3NhZ2VzYCkuIFNlYXJjaFxuICAgIC8vIHRoZSBsZWFmIHN1YmZsb3cgZmlyc3Q7IGZhbGwgYmFjayB0byB0b3AtbGV2ZWwgZm9yIHJvb3QtbGV2ZWxcbiAgICAvLyBwYXVzZXMuXG4gICAgLy8gQ2xvbmUtaW46IGBzdWJmbG93U3RhdGVzYCBzZWVkcyBuZXN0ZWQgcnVudGltZXMgaW4gU3ViZmxvd0V4ZWN1dG9yXG4gICAgLy8gKHNoYWxsb3ctbWVyZ2VkIGludG8gZWFjaCBuZXN0ZWQgU2hhcmVkTWVtb3J5KSwgc28gd2l0aG91dCBhIGNvcHkgdGhlXG4gICAgLy8gZW5naW5lIHdvdWxkIGhvbGQgbGl2ZSByZWZlcmVuY2VzIGludG8gdGhlIGNhbGxlcidzIGNoZWNrcG9pbnQgb2JqZWN0IOKAlFxuICAgIC8vIGNhbGxlciBtdXRhdGlvbnMgd291bGQgYmxlZWQgaW50byB0aGUgcmVzdW1lZCBydW4gYW5kIGVuZ2luZSB3cml0ZXNcbiAgICAvLyB3b3VsZCByZWFjaCBhIGNoZWNrcG9pbnQgdGhlIGNhbGxlciBtYXkgaGF2ZSBhbHJlYWR5IHBlcnNpc3RlZC5cbiAgICBjb25zdCBzZlN0YXRlcyA9IHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXMpO1xuICAgIGNvbnN0IGxlYWZTdWJmbG93SWQgPVxuICAgICAgY2hlY2twb2ludC5zdWJmbG93UGF0aC5sZW5ndGggPiAwID8gY2hlY2twb2ludC5zdWJmbG93UGF0aFtjaGVja3BvaW50LnN1YmZsb3dQYXRoLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgIGxldCBjb250aW51YXRpb25OZXh0ID0gcGF1c2VkTm9kZS5uZXh0O1xuICAgIC8vIEEgYnJhbmNoLXNvdXJjZWQgbG9vcCAoYHsgbG9vcFRvIH1gIC8gYERlY2lkZXJMaXN0Lmxvb3BUb2ApIHNldHMgdGhlXG4gICAgLy8gbG9vcGluZyBicmFuY2gncyBgbmV4dGAgdG8gYSBsb29wLXJlZiBTVFVCIOKAlCBgeyBpZCwgaXNMb29wUmVmOnRydWUgfWBcbiAgICAvLyB3aXRoIG5vIGZuL2NoaWxkcmVuL3N1YmZsb3dJZC4gT24gYSBOT1JNQUwgcnVuIHRoYXQgc3R1YiByZXNvbHZlcyBmaW5lOlxuICAgIC8vIHRoZSByZWFsIHRhcmdldCBub2RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBjaGFydCByb290LCBzbyB0aGUgdHJhdmVyc2VyJ3NcbiAgICAvLyBub2RlIG1hcCBhbHJlYWR5IGhvbGRzIGl0ICh0aGUgc3R1YiBpcyBza2lwcGVkIOKAlCBmaXJzdC13cml0ZS13aW5zKS4gT25cbiAgICAvLyBSRVNVTUUgdGhlIG5vZGUgbWFwIGlzIGJ1aWx0IGZyb20gdGhlIHRydW5jYXRlZCByZXN1bWUgcm9vdCwgd2hlcmUgdGhlXG4gICAgLy8gcmVhbCB0YXJnZXQgaXMgdW5yZWFjaGFibGUsIHNvIHRoZSBzdHViIHdvdWxkIHdpbiB0aGUgaWQgc2xvdCBhbmRcbiAgICAvLyBgZXhlY3V0ZU5vZGVgIHRocm93cyBcIk5vZGUgJzx0YXJnZXQ+JyBtdXN0IGRlZmluZSAuLi5cIi4gUmVzb2x2ZSB0aGUgc3R1YlxuICAgIC8vIHRvIHRoZSBSRUFMIHRhcmdldCBub2RlIGhlcmUgKGRmc0ZpbmQgc2tpcHMgbG9vcC1yZWZzIGFuZCByZXR1cm5zIHRoZVxuICAgIC8vIHJlYWwgbm9kZSBXSVRIIGl0cyBmdWxsIGRvd25zdHJlYW0gY2hhaW4g4oCUIGUuZy4gYSBzdWJmbG93IE1PVU5UIG5vZGUsXG4gICAgLy8gd2hvc2UgYC5uZXh0YCBjYXJyaWVzIHRoZSBkZWNpZGVyL3Rlcm1pbmFsIGNvbnRpbnVhdGlvbiB0aGUgbG9vcCBtdXN0XG4gICAgLy8gcmUtZW50ZXIpLiBTZWUgdGVzdC9saWIvcGF1c2UvcmVzdW1lLWJyYW5jaC1sb29wLXN1YmZsb3cudGVzdC50cy5cbiAgICBpZiAoY29udGludWF0aW9uTmV4dD8uaXNMb29wUmVmKSB7XG4gICAgICBjb25zdCBsb29wVGFyZ2V0SWQgPSBjb250aW51YXRpb25OZXh0LmlkO1xuICAgICAgY29uc3QgcmVhbFRhcmdldCA9XG4gICAgICAgIChsZWFmU3ViZmxvd0lkICE9PSB1bmRlZmluZWQgPyB0aGlzLmZpbmROb2RlSW5HcmFwaChsb29wVGFyZ2V0SWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpIDogdW5kZWZpbmVkKSA/P1xuICAgICAgICB0aGlzLmZpbmROb2RlSW5HcmFwaChsb29wVGFyZ2V0SWQsIFtdKTtcbiAgICAgIGlmIChyZWFsVGFyZ2V0KSBjb250aW51YXRpb25OZXh0ID0gcmVhbFRhcmdldDtcbiAgICB9XG4gICAgaWYgKCFjb250aW51YXRpb25OZXh0ICYmIGNoZWNrcG9pbnQuY29udGludWF0aW9uU3RhZ2VJZCkge1xuICAgICAgLy8gU2VhcmNoIGxlYWYgc3ViZmxvdyBmaXJzdCAobG9vcCB0YXJnZXRzIC8gYnJhbmNoIGpvaW5zIGxpdmUgdGhlcmUpLFxuICAgICAgLy8gdGhlbiBmYWxsIGJhY2sgdG8gdG9wIGxldmVsLlxuICAgICAgY29udGludWF0aW9uTmV4dCA9IGxlYWZTdWJmbG93SWRcbiAgICAgICAgPyB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCFjb250aW51YXRpb25OZXh0KSB7XG4gICAgICAgIGNvbnRpbnVhdGlvbk5leHQgPSB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQsIFtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgXCJpbm5lclwiIHJlc3VtZSBjaGFpbjogcmVzdW1lRm4g4oaSIGNvbnRpbnVhdGlvbi4gVGhpcyBpcyB3aGF0XG4gICAgLy8gcnVucyBJTlNJREUgdGhlIGxlYWYgc3ViZmxvdydzIGJvZHkuIEZvciBhIHJvb3QtbGV2ZWwgcGF1c2VcbiAgICAvLyAoc3ViZmxvd1BhdGggZW1wdHkpLCB0aGlzIGlzIGFsc28gdGhlIHRvcC1sZXZlbCByZXN1bWUgcm9vdC5cbiAgICBjb25zdCBpbm5lclJlc3VtZUNoYWluOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIGlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgZGVzY3JpcHRpb246IHBhdXNlZE5vZGUuZGVzY3JpcHRpb24sXG4gICAgICBmbjogcmVzdW1lU3RhZ2VGbixcbiAgICAgIG5leHQ6IGNvbnRpbnVhdGlvbk5leHQsXG4gICAgfTtcblxuICAgIC8vIERvbid0IGNsZWFyIHJlY29yZGVycyDigJQgcmVzdW1lIGNvbnRpbnVlcyBmcm9tIHByZXZpb3VzIHN0YXRlLlxuICAgIC8vIE5hcnJhdGl2ZSwgbWV0cmljcywgZGVidWcgZW50cmllcyBhY2N1bXVsYXRlIGFjcm9zcyBwYXVzZS9yZXN1bWUuXG4gICAgLy9cbiAgICAvLyBUd28tbW9kZSByZXN1bWU6XG4gICAgLy8gICDigKIgU2FtZS1leGVjdXRvciAocnVuKCkgcHJldmlvdXNseSBjYWxsZWQgb24gVEhJUyBpbnN0YW5jZSk6XG4gICAgLy8gICAgIHJldXNlIHRoZSBleGlzdGluZyBydW50aW1lIHNvIHRoZSBleGVjdXRpb24gdHJlZSBjb250aW51ZXNcbiAgICAvLyAgICAgZnJvbSB0aGUgcGF1c2UgcG9pbnQgYW5kIHJlY29yZGVycy9uYXJyYXRpdmUgYWNjdW11bGF0ZS5cbiAgICAvLyAgIOKAoiBDcm9zcy1leGVjdXRvciAoZnJlc2ggZXhlY3V0b3IgcmVjb25zdHJ1Y3RlZCBmcm9tIGEgc3RvcmVkXG4gICAgLy8gICAgIGNoZWNrcG9pbnQpOiBzZWVkIGEgTkVXIHJ1bnRpbWUgZnJvbSBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWBcbiAgICAvLyAgICAgc28gcmVzdW1lIGhhbmRsZXJzIGNhbiByZWFkIHByZS1wYXVzZSBzY29wZS4gVGhlIGV4ZWN1dGlvblxuICAgIC8vICAgICB0cmVlIHN0YXJ0cyBhdCB0aGUgcmVzdW1lIG5vZGUg4oCUIHdlIGRvbid0IGhhdmUgdGhlIHByZXZpb3VzXG4gICAgLy8gICAgIHRyYXZlcnNhbCdzIHRyZWUgb24gYSBmcmVzaCBwcm9jZXNzIGFueXdheS5cbiAgICBjb25zdCBzYW1lRXhlY3V0b3IgPSB0aGlzLl9oYXNSdW5CZWZvcmU7XG4gICAgY29uc3QgZXhpc3RpbmdSdW50aW1lID0gc2FtZUV4ZWN1dG9yXG4gICAgICA/ICh0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPilcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX2hhc1J1bkJlZm9yZSA9IHRydWU7IC8vIGFueSBwYXRoIHRoYXQgcmVzdW1lcyBjb3VudHMgYXMgYSBydW5cbiAgICAvLyBSZXN1bWUgZ2V0cyBhIE5FVyBydW5JZCDigJQgcmVzdW1lIGlzIGxvZ2ljYWxseSBhIGRpc3RpbmN0IHJ1bi5cbiAgICAvLyBPcmlnaW5hbCBydW5JZCBpcyByZWNvdmVyYWJsZSBmcm9tIGNoZWNrcG9pbnQgbWV0YWRhdGEgaWYgYSBjb25zdW1lclxuICAgIC8vIG5lZWRzIGNyb3NzLXJ1biBhdWRpdCAod2UgZG9uJ3Qgc3RvcmUgaXQgb24gdGhlIGNoZWNrcG9pbnQgdG9kYXk7XG4gICAgLy8gZnV0dXJlIGVuaGFuY2VtZW50KS4gU2VlIGBydW5JZC50c2AuXG4gICAgdGhpcy5fY3VycmVudFJ1bklkID0gZ2VuZXJhdGVSdW5JZCgpO1xuXG4gICAgLy8gUGljayB0aGUgcmVzdW1lIHJvb3QgKyBpbml0aWFsIGNvbnRleHQuXG4gICAgLy9cbiAgICAvLyAgIFJPT1QtTEVWRUwgUEFVU0UgKHN1YmZsb3dQYXRoIGVtcHR5KTpcbiAgICAvLyAgICAgcmVzdW1lIHJvb3QgPSBpbm5lclJlc3VtZUNoYWluIChydW4gcmVzdW1lRm4gYXQgdG9wIGxldmVsKS5cbiAgICAvLyAgICAgaW5pdGlhbENvbnRleHQgPSBjaGVja3BvaW50LnNoYXJlZFN0YXRlLlxuICAgIC8vXG4gICAgLy8gICBTVUJGTE9XLU5FU1RFRCBQQVVTRSAoc3ViZmxvd1BhdGggbm9uLWVtcHR5KTpcbiAgICAvLyAgICAgVGhlIHBhdXNlIHdhcyBJTlNJREUgYSBzdWJmbG93J3MgYm9keS4gVG8gcnVuIHRoZSBzdWJmbG93J3NcbiAgICAvLyAgICAgb3V0cHV0TWFwcGVyIGFuZCB0aGUgcGFyZW50J3MgY29udGludWF0aW9uLCB3ZSBoYXZlIHRvIGVudGVyXG4gICAgLy8gICAgIHRocm91Z2ggdGhlIE9VVEVSIE1PVU5UICh0aGUgcGFyZW50J3Mgbm9kZSB0aGF0IG1vdW50cyB0aGVcbiAgICAvLyAgICAgbGVhZiBzdWJmbG93KS4gV2Ugc3dhcCB0aGUgbGVhZiBzdWJmbG93J3Mgcm9vdCB3aXRoXG4gICAgLy8gICAgIGlubmVyUmVzdW1lQ2hhaW4gc28gU3ViZmxvd0V4ZWN1dG9yOlxuICAgIC8vICAgICAgIDEuIGVudGVycyB0aGUgc3ViZmxvdyBib3VuZGFyeSxcbiAgICAvLyAgICAgICAyLiBzZWVkcyB0aGUgbmVzdGVkIHJ1bnRpbWUgZnJvbSBzdWJmbG93U3RhdGVzW2xlYWZdXG4gICAgLy8gICAgICAgICAgKHNraXBwaW5nIHRoZSBpbnB1dE1hcHBlciDigJQgc2VlIFN1YmZsb3dFeGVjdXRvci50cyksXG4gICAgLy8gICAgICAgMy4gcnVucyB0aGUgcmVzdW1lRm4g4oaSIGNvbnRpbnVhdGlvbiBjaGFpbixcbiAgICAvLyAgICAgICA0LiBydW5zIHRoZSBvdXRwdXRNYXBwZXIgYXQgZXhpdCxcbiAgICAvLyAgICAgICA1LiBwYXJlbnQgdHJhdmVyc2FsIGNvbnRpbnVlcyBub3JtYWxseS5cbiAgICAvL1xuICAgIC8vICAgICBDcm9zcy1leGVjdXRvcjogaW5pdGlhbENvbnRleHQgPSBjaGVja3BvaW50LnNoYXJlZFN0YXRlICh0aGVcbiAgICAvLyAgICAgICBwYXJlbnQncyB2aWV3IGF0IHBhdXNlIHRpbWUg4oCUIG91dHB1dE1hcHBlciB3cml0ZXMgYmFjayBpbnRvIGl0KS5cbiAgICAvLyAgICAgU2FtZS1leGVjdXRvcjogZXhpc3RpbmdSdW50aW1lIGlzIHJldXNlZDsgaW5pdGlhbENvbnRleHQgaXMgbW9vdFxuICAgIC8vICAgICAgIGZvciB0aGUgc3ViZmxvdyBmcmFtZSAoYWxyZWFkeSBpbiB0aGUgcnVudGltZSBzdGFjayksIGJ1dCB3ZVxuICAgIC8vICAgICAgIHN0aWxsIHBhc3Mgc2hhcmVkU3RhdGUgZm9yIGNvbnNpc3RlbmN5LlxuICAgIGNvbnN0IGZjID0gdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydDtcbiAgICBsZXQgcmVzdW1lUm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSBpbm5lclJlc3VtZUNoYWluO1xuICAgIGxldCBzdWJmbG93c092ZXJyaWRlOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChsZWFmU3ViZmxvd0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEZpbmQgdGhlIE9VVEVSIG1vdW50IG5vZGUgZm9yIHRoZSBGSVJTVCBlbnRyeSBvbiB0aGUgcGF0aC5cbiAgICAgIC8vIEZvciBzaW5nbGUtbGV2ZWwgcGF1c2VzLCB0aGlzIGlzIHRoZSBvbmx5IG1vdW50IHdlIG5lZWQgdG9cbiAgICAgIC8vIGVudGVyIHRocm91Z2guIEZvciBuZXN0ZWQgbW91bnRzIHRoZSBwYXR0ZXJuIHdvdWxkIGV4dGVuZCwgYnV0XG4gICAgICAvLyBzaW5nbGUtbGV2ZWwgY292ZXJzIGFsbCBjdXJyZW50IHVzZSBjYXNlcyAoU2VxdWVuY2UoQWdlbnQpLFxuICAgICAgLy8gQ29uZGl0aW9uYWwoQWdlbnQpLCBQYXJhbGxlbCBicmFuY2hlcyB3aXRoIHBhdXNlZCBhZ2VudHMpLlxuICAgICAgY29uc3Qgb3V0ZXJTdWJmbG93SWQgPSBjaGVja3BvaW50LnN1YmZsb3dQYXRoWzBdO1xuICAgICAgY29uc3Qgb3V0ZXJNb3VudCA9IHRoaXMuZmluZE1vdW50SW5HcmFwaChmYy5yb290LCBvdXRlclN1YmZsb3dJZCk7XG4gICAgICBpZiAob3V0ZXJNb3VudCkge1xuICAgICAgICByZXN1bWVSb290ID0gb3V0ZXJNb3VudDtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2UgdGhlIGxlYWYgc3ViZmxvdydzIHJvb3Qgd2l0aCB0aGUgcmVzdW1lIGNoYWluIHNvIHRoZVxuICAgICAgLy8gYm9keSBydW5zIGZyb20gdGhlIHBhdXNlIHBvaW50IGZvcndhcmQuXG4gICAgICBzdWJmbG93c092ZXJyaWRlID0geyAuLi4oZmMuc3ViZmxvd3MgPz8ge30pIH07XG4gICAgICBzdWJmbG93c092ZXJyaWRlW2xlYWZTdWJmbG93SWRdID0geyByb290OiBpbm5lclJlc3VtZUNoYWluIH07XG4gICAgfVxuICAgIC8vIENsb25lLWluIGZvciB0aGUgc2FtZSByZWFzb24gYXMgYHNmU3RhdGVzYCBhYm92ZTogYGluaXRpYWxDb250ZXh0YFxuICAgIC8vIHNlZWRzIHRoZSBmcmVzaCBTaGFyZWRNZW1vcnkgdmlhIGBtZXJnZUNvbnRleHRXaW5zYCwgd2hpY2ggY29waWVzIG9ubHlcbiAgICAvLyB0aGUgVE9QIGxldmVsIOKAlCBuZXN0ZWQgb2JqZWN0cyB3b3VsZCBhbGlhcyB0aGUgY2FsbGVyJ3MgY2hlY2twb2ludC5cbiAgICBjb25zdCByZXN1bWVJbml0aWFsQ29udGV4dCA9IHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50LnNoYXJlZFN0YXRlKTtcblxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoXG4gICAgICBvcHRpb25zPy5zaWduYWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBvcHRpb25zPy5lbnYsXG4gICAgICBvcHRpb25zPy5tYXhEZXB0aCxcbiAgICAgIG9wdGlvbnM/Lm1heEl0ZXJhdGlvbnMsXG4gICAgICB7XG4gICAgICAgIHJvb3Q6IHJlc3VtZVJvb3QsXG4gICAgICAgIGluaXRpYWxDb250ZXh0OiByZXN1bWVJbml0aWFsQ29udGV4dCxcbiAgICAgICAgcHJlc2VydmVSZWNvcmRlcnM6IHRydWUsXG4gICAgICAgIC4uLihleGlzdGluZ1J1bnRpbWUgPyB7IGV4aXN0aW5nUnVudGltZSB9IDoge30pLFxuICAgICAgICAvLyBIYW5kIHRoZSBwZXItc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBkb3duIHRvIFN1YmZsb3dFeGVjdXRvci5cbiAgICAgICAgLy8gQWx3YXlzIHByZXNlbnQgb24gYSBjaGVja3BvaW50IOKAlCBlbXB0eSBge31gIGZvciByb290IHBhdXNlcy5cbiAgICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZTogc2ZTdGF0ZXMsXG4gICAgICAgIC4uLihzdWJmbG93c092ZXJyaWRlICYmIHsgc3ViZmxvd3NPdmVycmlkZSB9KSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEZpcmUgb25SZXN1bWUgZXZlbnQgb24gYWxsIHJlY29yZGVycyAoZmxvdyArIHNjb3BlKS4gU3RhbXAgdGhlXG4gICAgLy8gc3ludGhldGljIFRyYXZlcnNhbENvbnRleHQgZm9yIHRoZSByZXN1bWVkIHN0YWdlIHdpdGggdGhlIE5FV1xuICAgIC8vIHJ1bklkIHNvIGNvbnN1bWVycyBkZXRlY3QgXCJ0aGlzIGlzIGEgZnJlc2ggbG9naWNhbCBydW5cIiB2aWFcbiAgICAvLyB0aGUgc2FtZSBydW5JZC1jaGFuZ2UgcGF0dGVybiB0aGV5IHVzZSBmb3IgYG9uUnVuU3RhcnRgLlxuICAgIGNvbnN0IGhhc0lucHV0ID0gcmVzdW1lSW5wdXQgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXN1bWVSdW50aW1lU3RhZ2VJZCA9IGJ1aWxkUnVudGltZVN0YWdlSWQocGF1c2VkTm9kZS5pZCwgdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSk7XG4gICAgY29uc3QgZmxvd1Jlc3VtZUV2ZW50ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgaGFzSW5wdXQsXG4gICAgICB0cmF2ZXJzYWxDb250ZXh0OiB7XG4gICAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiByZXN1bWVSdW50aW1lU3RhZ2VJZCxcbiAgICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICAgIGRlcHRoOiAwLFxuICAgICAgfSxcbiAgICAgIGNoYW5uZWw6ICdmbG93JyBhcyBjb25zdCxcbiAgICB9O1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHRoaXMuY29tYmluZWRSZWNvcmRlci5vblJlc3VtZShmbG93UmVzdW1lRXZlbnQpO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHIub25SZXN1bWU/LihmbG93UmVzdW1lRXZlbnQpO1xuXG4gICAgY29uc3Qgc2NvcGVSZXN1bWVFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBidWlsZFJ1bnRpbWVTdGFnZUlkKHBhdXNlZE5vZGUuaWQsIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUpLFxuICAgICAgaGFzSW5wdXQsXG4gICAgICBwaXBlbGluZUlkOiAnJyxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGNoYW5uZWw6ICdzY29wZScgYXMgY29uc3QsXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykgci5vblJlc3VtZT8uKHNjb3BlUmVzdW1lRXZlbnQpO1xuXG4gICAgLy8gU2V0IEFGVEVSIGFsbCBzeW5jIHZhbGlkYXRpb24vbG9va3VwIHRocm93cyBhYm92ZSAobm90aGluZyBjYW4gbGVhayB0aGVcbiAgICAvLyBmbGFnKTsgbm8gYXdhaXQgYmV0d2VlbiB0aGUgdG9wLW9mLW1ldGhvZCBjaGVjayBhbmQgaGVyZSwgc28gcmFjZS1mcmVlLlxuICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB0aGlzLmJ1aWxkUGF1c2VDaGVja3BvaW50KGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHsgcGF1c2VkOiB0cnVlLCBjaGVja3BvaW50OiB0aGlzLmxhc3RDaGVja3BvaW50IH0gc2F0aXNmaWVzIFBhdXNlZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGZ1bGx5IERFVEFDSEVEIGNoZWNrcG9pbnQgZnJvbSBhIGNhdWdodCBQYXVzZVNpZ25hbC5cbiAgICpcbiAgICogRXZlcnkgZmllbGQgaXMgZGVlcC1jb3BpZWQgdmlhIG9uZSBgc3RydWN0dXJlZENsb25lYCBvZiB0aGUgYXNzZW1ibGVkXG4gICAqIGNoZWNrcG9pbnQsIGJlY2F1c2UgdGhlIHJhdyBwaWVjZXMgYWxpYXMgbGl2ZSBlbmdpbmUgc3RhdGU6XG4gICAqXG4gICAqICAgLSBgc2hhcmVkU3RhdGVgIElTIGBTaGFyZWRNZW1vcnlgJ3MgaW50ZXJuYWwgY29udGV4dCBvYmplY3Qg4oCUIHRoZSBhbGlhc1xuICAgKiAgICAgb25seSBkZXRhY2hlcyBhdCB0aGUgbmV4dCBjb21taXQgKGBhcHBseVNtYXJ0TWVyZ2VgIHJlYnVpbGRzIGl0KSwgYW5kXG4gICAqICAgICBhZnRlciBhIHBhdXNlIHRoZXJlIGlzIG5vIG5leHQgY29tbWl0IHVudGlsIHJlc3VtZS5cbiAgICogICAtIGBleGVjdXRpb25UcmVlYCBub2RlcyBhcmUgZnJlc2gsIGJ1dCB0aGVpciBgbG9nc2AvYGVycm9yc2AvYG1ldHJpY3NgL1xuICAgKiAgICAgYGV2YWxzYC9gc3RhZ2VSZWFkc2AvYGZsb3dNZXNzYWdlc2AgZmllbGRzIHJlZmVyZW5jZSBsaXZlXG4gICAqICAgICBgRGlhZ25vc3RpY0NvbGxlY3RvcmAgYmFncyB0aGF0IGtlZXAgYWNjdW11bGF0aW5nIG9uIHNhbWUtZXhlY3V0b3JcbiAgICogICAgIHJlc3VtZS5cbiAgICogICAtIGBzdWJmbG93U3RhdGVzYCB2YWx1ZXMgYXJlIHNoYWxsb3cgY29waWVzIHdob3NlIE5FU1RFRCBvYmplY3RzIGFsaWFzXG4gICAqICAgICBzdWJmbG93IG1lbW9yeSwgYW5kIHRoZXkgZ2V0IHNlZWRlZCBiYWNrIGludG8gbGl2ZSBydW50aW1lcyBvbiByZXN1bWUuXG4gICAqICAgLSBgc3ViZmxvd1Jlc3VsdHNgIHZhbHVlcyBzdGF5IHJlZmVyZW5jZWQgYnkgdGhlIHRyYXZlcnNlcidzIHJlc3VsdHMgbWFwLlxuICAgKlxuICAgKiBUaGUgY2hlY2twb2ludCBpcyBwZXJzaXN0ZWQgYnkgY29udHJhY3QgKFwic3RvcmUgaW4gUmVkaXMvUG9zdGdyZXNcIikg4oCUIGl0XG4gICAqIG11c3QgbmV2ZXIgc2hhcmUgc3RydWN0dXJlIHdpdGggdGhlIGVuZ2luZS4gUGF1c2UgaXMgbm90IGEgaG90IHBhdGg7IHRoZVxuICAgKiBjbG9uZSBjb3N0IGlzIGlycmVsZXZhbnQuXG4gICAqXG4gICAqIFRoZSBKU09OLXNhZmUgY2hlY2twb2ludCBjb250cmFjdCAobm8gZnVuY3Rpb25zLCBubyBjbGFzcyBpbnN0YW5jZXMpXG4gICAqIGdvdmVybnMgQ09OU1VNRVItb3duZWQgZGF0YSDigJQgYnV0IHRoZSBleGVjdXRpb25UcmVlJ3MgZGlhZ25vc3RpYyBiYWdzXG4gICAqIGFjY2VwdCBBTlkgdmFsdWUgYXQgd3JpdGUgdGltZSB3aXRob3V0IGNsb25pbmcgKCRkZWJ1Zy8kZXJyb3IvJG1ldHJpYy9cbiAgICogJGV2YWwgc3RvcmUgcmF3IHJlZmVyZW5jZXMpLCBzbyBhIGNvbnRyYWN0LWNvbXBsaWFudCBydW4gY2FuIHN0aWxsIGNhcnJ5XG4gICAqIGEgbm9uLWNsb25lYWJsZSBkaWFnbm9zdGljLiBPYnNlcnZhYmlsaXR5IHNpZGUtYmFncyBuZXZlciBhYm9ydCB0cmF2ZXJzYWxcbiAgICogYW55d2hlcmUgZWxzZSBpbiB0aGUgbGlicmFyeSwgc28gdGhleSBtdXN0IG5vdCBhYm9ydCB0aGUgcGF1c2UgZWl0aGVyOlxuICAgKiBvbiBjbG9uZSBmYWlsdXJlIHdlIHNhbml0aXplIHRoZSBkaWFnbm9zdGljIGJhZ3MgKG5vbi1jbG9uZWFibGUgdmFsdWVzXG4gICAqIGJlY29tZSAnW25vbi1zZXJpYWxpemFibGU6IOKApl0nIG1hcmtlcnMg4oCUIHRoZSBsaXZlIGVuZ2luZSBiYWdzIGFyZSBuZXZlclxuICAgKiB0b3VjaGVkKSBhbmQgcmV0cnkuIElmIHRoZSByZXRyeSBTVElMTCBmYWlscywgdGhlIHZpb2xhdGlvbiBpcyBpblxuICAgKiBjb25zdW1lci1vd25lZCBkYXRhIChyZWFsaXN0aWNhbGx5IGBwYXVzZURhdGFgIOKAlCBhIGZ1bmN0aW9uIGNhbiBuZXZlclxuICAgKiByZWFjaCBzaGFyZWQgc3RhdGUgaW4gdGhlIGZpcnN0IHBsYWNlOiBUcmFuc2FjdGlvbkJ1ZmZlciBjbG9uZXMgZXZlcnlcbiAgICogd3JpdHRlbiB2YWx1ZSBhdCB3cml0ZSB0aW1lLCBzbyB0aGUgb2ZmZW5kaW5nIHdyaXRlIGFscmVhZHkgcmVqZWN0ZWQpXG4gICAqIGFuZCB3ZSB0aHJvdyBhIERFU0NSSVBUSVZFIGNvbnRyYWN0IGVycm9yIG5hbWluZyB0aGUgb2ZmZW5kaW5nXG4gICAqIGNoZWNrcG9pbnQgZmllbGQocykuIEEgbmFrZWQgRGF0YUNsb25lRXJyb3IgbmV2ZXIgZXNjYXBlcy5cbiAgICpcbiAgICogU3ViZmxvdyBzY29wZSBjYXB0dXJlIChgc3ViZmxvd1N0YXRlc2ApIHN1cnZpdmVzIE9OTFkgb24gdGhlIHNpZ25hbCDigJQgdGhlXG4gICAqIG5lc3RlZCBydW50aW1lcyBhcmUgR0MnZCBhcyB0aGUgc3RhY2sgdW53aW5kcy4gUHJvbW90aW5nIGl0IG9udG8gdGhlXG4gICAqIGNoZWNrcG9pbnQgaGVyZSBsZXRzIGNyb3NzLWV4ZWN1dG9yIHJlc3VtZSByZXN0b3JlIHByZS1wYXVzZSBzdWJmbG93XG4gICAqIHNjb3BlIChlLmcuIGFuIEFnZW50J3MgYHNjb3BlLmhpc3RvcnlgKS4gRW1wdHkgYHt9YCBmb3Igcm9vdC1sZXZlbCBwYXVzZXMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUGF1c2VDaGVja3BvaW50KHNpZ25hbDogUGF1c2VTaWduYWwpOiBGbG93Y2hhcnRDaGVja3BvaW50IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudHJhdmVyc2VyLmdldFNuYXBzaG90KCk7XG4gICAgY29uc3Qgc2ZSZXN1bHRzID0gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgICBjb25zdCBjaGVja3BvaW50ID0ge1xuICAgICAgc2hhcmVkU3RhdGU6IHNuYXBzaG90LnNoYXJlZFN0YXRlLFxuICAgICAgZXhlY3V0aW9uVHJlZTogc25hcHNob3QuZXhlY3V0aW9uVHJlZSxcbiAgICAgIHBhdXNlZFN0YWdlSWQ6IHNpZ25hbC5zdGFnZUlkLFxuICAgICAgc3ViZmxvd1BhdGg6IHNpZ25hbC5zdWJmbG93UGF0aCxcbiAgICAgIHBhdXNlRGF0YTogc2lnbmFsLnBhdXNlRGF0YSxcbiAgICAgIHN1YmZsb3dTdGF0ZXM6IHNpZ25hbC5zdWJmbG93U3RhdGVzLFxuICAgICAgLi4uKHNmUmVzdWx0cy5zaXplID4gMCAmJiB7IHN1YmZsb3dSZXN1bHRzOiBPYmplY3QuZnJvbUVudHJpZXMoc2ZSZXN1bHRzKSB9KSxcbiAgICAgIC8vIEludm9rZXIgY29udGV4dCDigJQgY29sbGVjdGVkIGR1cmluZyB0cmF2ZXJzYWwgYnViYmxlLXVwIChub3QgdHJlZS13YWxrZWQpXG4gICAgICAuLi4oc2lnbmFsLmludm9rZXJTdGFnZUlkICYmIHsgaW52b2tlclN0YWdlSWQ6IHNpZ25hbC5pbnZva2VyU3RhZ2VJZCB9KSxcbiAgICAgIC4uLihzaWduYWwuY29udGludWF0aW9uU3RhZ2VJZCAmJiB7IGNvbnRpbnVhdGlvblN0YWdlSWQ6IHNpZ25hbC5jb250aW51YXRpb25TdGFnZUlkIH0pLFxuICAgICAgcGF1c2VkQXQ6IERhdGUubm93KCksXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5vbi1jbG9uZWFibGUgZGlhZ25vc3RpY3MgbXVzdCBub3Qgc3dhbGxvdyB0aGUgcGF1c2Ug4oCUIHNhbml0aXplIHRoZVxuICAgICAgLy8gZXhlY3V0aW9uVHJlZSdzIGJhZ3MgKG1hcmtlcnMgcmVwbGFjZSB0aGUgb2ZmZW5kZXJzKSBhbmQgcmV0cnkuXG4gICAgICB0cnkge1xuICAgICAgICBjaGVja3BvaW50LmV4ZWN1dGlvblRyZWUgPSBzYW5pdGl6ZURpYWdub3N0aWNCYWdzKGNoZWNrcG9pbnQuZXhlY3V0aW9uVHJlZSBhcyBTdGFnZVNuYXBzaG90KTtcbiAgICAgICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50KTtcbiAgICAgIH0gY2F0Y2ggKHJldHJ5RXJyb3IpIHtcbiAgICAgICAgLy8gR2VudWluZSBKU09OLXNhZmUgY29udHJhY3QgdmlvbGF0aW9uIGluIGNvbnN1bWVyLW93bmVkIGRhdGEuXG4gICAgICAgIHRocm93IGRlc2NyaWJlQ2hlY2twb2ludENsb25lRmFpbHVyZShjaGVja3BvaW50LCByZXRyeUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIFN0YWdlTm9kZSBpbiB0aGUgY29tcGlsZWQgZ3JhcGggYnkgSUQuXG4gICAqIEhhbmRsZXMgc3ViZmxvdyBwYXRocyBieSBkcmlsbGluZyBpbnRvIHJlZ2lzdGVyZWQgc3ViZmxvd3MuXG4gICAqL1xuICBwcml2YXRlIGZpbmROb2RlSW5HcmFwaChzdGFnZUlkOiBzdHJpbmcsIHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXSk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmYyA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQ7XG5cbiAgICBpZiAoc3ViZmxvd1BhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUb3AtbGV2ZWw6IERGUyBmcm9tIHJvb3RcbiAgICAgIHJldHVybiB0aGlzLmRmc0ZpbmQoZmMucm9vdCwgc3RhZ2VJZCk7XG4gICAgfVxuXG4gICAgLy8gU3ViZmxvdzogZHJpbGwgaW50byB0aGUgc3ViZmxvdyBjaGFpbiwgdGhlbiBzZWFyY2ggZnJvbSB0aGUgbGFzdCBzdWJmbG93J3Mgcm9vdFxuICAgIGxldCBzdWJmbG93Um9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBzZklkIG9mIHN1YmZsb3dQYXRoKSB7XG4gICAgICBjb25zdCBzdWJmbG93ID0gZmMuc3ViZmxvd3M/LltzZklkXTtcbiAgICAgIGlmICghc3ViZmxvdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHN1YmZsb3dSb290ID0gc3ViZmxvdy5yb290O1xuICAgIH1cbiAgICBpZiAoIXN1YmZsb3dSb290KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmRmc0ZpbmQoc3ViZmxvd1Jvb3QsIHN0YWdlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIG1vdW50IG5vZGUgKHRoZSBub2RlIHRoYXQgbW91bnRzIGEgc3ViZmxvdyBib3VuZGFyeSlcbiAgICogZm9yIGEgZ2l2ZW4gc3ViZmxvd0lkLCBieSBERlMgZnJvbSBgc3RhcnRgLiBVc2VkIGJ5IGByZXN1bWUoKWAgdG9cbiAgICogbG9jYXRlIHRoZSBPVVRFUiBub2RlIHdlIGhhdmUgdG8gZW50ZXIgdGhyb3VnaCBzbyB0aGUgc3ViZmxvdydzXG4gICAqIG91dHB1dE1hcHBlciBhbmQgcGFyZW50IGNvbnRpbnVhdGlvbiBleGVjdXRlLlxuICAgKlxuICAgKiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gUmV0dXJucyB0aGUgZmlyc3QgbWF0Y2ggKERGUyBvcmRlcikuXG4gICAqL1xuICBwcml2YXRlIGZpbmRNb3VudEluR3JhcGgoXG4gICAgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKSxcbiAgKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChzdGFydC5pc0xvb3BSZWYpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHN0YXJ0LmlkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB2aXNpdGVkLmFkZChzdGFydC5pZCk7XG4gICAgaWYgKHN0YXJ0LnN1YmZsb3dJZCA9PT0gc3ViZmxvd0lkKSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKHN0YXJ0LmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHN0YXJ0LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kTW91bnRJbkdyYXBoKGNoaWxkLCBzdWJmbG93SWQsIHZpc2l0ZWQpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0Lm5leHQpIHJldHVybiB0aGlzLmZpbmRNb3VudEluR3JhcGgoc3RhcnQubmV4dCwgc3ViZmxvd0lkLCB2aXNpdGVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIERGUyBzZWFyY2ggZm9yIGEgbm9kZSBieSBJRCBpbiB0aGUgU3RhZ2VOb2RlIGdyYXBoLiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gKi9cbiAgcHJpdmF0ZSBkZnNGaW5kKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHRhcmdldElkOiBzdHJpbmcsXG4gICAgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgLy8gU2tpcCBsb29wIGJhY2stZWRnZSByZWZlcmVuY2VzICh0aGV5IHNoYXJlIHRoZSB0YXJnZXQncyBJRCBidXQgaGF2ZSBubyBmbi9yZXN1bWVGbilcbiAgICBpZiAobm9kZS5pc0xvb3BSZWYpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUuaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZpc2l0ZWQuYWRkKG5vZGUuaWQpO1xuICAgIGlmIChub2RlLmlkID09PSB0YXJnZXRJZCkgcmV0dXJuIG5vZGU7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZGZzRmluZChjaGlsZCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5vZGUubmV4dCkgcmV0dXJuIHRoaXMuZGZzRmluZChub2RlLm5leHQsIHRhcmdldElkLCB2aXNpdGVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgc2NvcGUgU2NvcGVSZWNvcmRlciB0byBvYnNlcnZlIGRhdGEgb3BlcmF0aW9ucyAocmVhZHMsIHdyaXRlcywgY29tbWl0cykuXG4gICAqIEF1dG9tYXRpY2FsbHkgYXR0YWNoZWQgdG8gZXZlcnkgU2NvcGVGYWNhZGUgY3JlYXRlZCBkdXJpbmcgdHJhdmVyc2FsLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuXG4gICAqXG4gICAqICoqSWRlbXBvdGVudCBieSBJRDoqKiBJZiBhIHJlY29yZGVyIHdpdGggdGhlIHNhbWUgYGlkYCBpcyBhbHJlYWR5IGF0dGFjaGVkLFxuICAgKiBpdCBpcyByZXBsYWNlZCAobm90IGR1cGxpY2F0ZWQpLiBUaGlzIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZyB3aGVuIGJvdGhcbiAgICogYSBmcmFtZXdvcmsgYW5kIHRoZSB1c2VyIGF0dGFjaCB0aGUgc2FtZSByZWNvcmRlciB0eXBlLlxuICAgKlxuICAgKiBCdWlsdC1pbiByZWNvcmRlcnMgdXNlIGF1dG8taW5jcmVtZW50IElEcyAoYG1ldHJpY3MtMWAsIGBkZWJ1Zy0xYCwgLi4uKSBieVxuICAgKiBkZWZhdWx0LCBzbyBtdWx0aXBsZSBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uZmlncyBjb2V4aXN0LiBUbyBvdmVycmlkZVxuICAgKiBhIGZyYW1ld29yay1hdHRhY2hlZCByZWNvcmRlciwgcGFzcyB0aGUgc2FtZSB3ZWxsLWtub3duIElELlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIE11bHRpcGxlIHJlY29yZGVycyB3aXRoIGRpZmZlcmVudCBjb25maWdzIOKAlCBlYWNoIGdldHMgYSB1bmlxdWUgSURcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IERlYnVnUmVjb3JkZXIoeyB2ZXJib3NpdHk6ICdtaW5pbWFsJyB9KSk7XG4gICAqXG4gICAqIC8vIE92ZXJyaWRlIGEgZnJhbWV3b3JrLWF0dGFjaGVkIHJlY29yZGVyIGJ5IHBhc3NpbmcgaXRzIHdlbGwta25vd24gSURcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ21ldHJpY3MnKSk7XG4gICAqXG4gICAqIC8vIEF0dGFjaGluZyB0d2ljZSB3aXRoIHNhbWUgSUQgcmVwbGFjZXMgKG5vIGRvdWJsZS1jb3VudGluZylcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdteS1tZXRyaWNzJykpOyAvLyByZXBsYWNlcyBwcmV2aW91c1xuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMgPSB0aGlzLnNjb3BlUmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gIH1cblxuICAvLyDilIDilIDilIAgRGV0YWNoIChUNCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIEJhcmUtZXhlY3V0b3IgZW50cnkgcG9pbnQgZm9yIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnQgZXhlY3V0aW9uLlxuICAvLyBVc2UgZnJvbSBvdXRzaWRlIGFueSBjaGFydCAoY29uc3VtZXIgY29kZSB0aGF0IHdhbnRzIHRvIGRldGFjaCB3b3JrXG4gIC8vIHdpdGhvdXQgZmlyc3QgcnVubmluZyBhIHBhcmVudCBjaGFydCkuIEZvciBkZXRhY2ggRlJPTSBJTlNJREUgYSBzdGFnZSxcbiAgLy8gdXNlIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgIC8gYHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQoLi4uKWAg4oCUXG4gIC8vIHRob3NlIG1pbnQgcmVmSWRzIGZyb20gdGhlIGNhbGxpbmcgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCBmb3IgdHJhY2VcbiAgLy8gY29ycmVsYXRpb247IHRoZSBiYXJlLWV4ZWN1dG9yIGVudHJpZXMgdXNlIGEgc3ludGhldGljIHByZWZpeFxuICAvLyAoYF9fZXhlY3V0b3JfX2ApIGluc3RlYWQuXG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZCByZXR1cm4gYSBgRGV0YWNoSGFuZGxlYFxuICAgKiB0aGUgY2FsbGVyIGNhbiBgd2FpdCgpYCBvbiAoUHJvbWlzZSkgb3IgcmVhZCBgLnN0YXR1c2AgZnJvbSAoc3luYykuXG4gICAqXG4gICAqIFRoZSBkcml2ZXIgaXMgYSBSRVFVSVJFRCBmaXJzdCBhcmd1bWVudCDigJQgdGhlcmUgaXMgbm8gbGlicmFyeS1kZWZhdWx0LFxuICAgKiB0byBrZWVwIHRoZSBlbmdpbmUgZnJlZSBvZiBkcml2ZXIgaW1wb3J0cyBhbmQgdG8gbWFrZSB0aGUgY2hvaWNlIG9mXG4gICAqIHNjaGVkdWxpbmcgYWxnb3JpdGhtIGV4cGxpY2l0IGF0IHRoZSBjYWxsIHNpdGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IHsgbWljcm90YXNrQmF0Y2hEcml2ZXIgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKlxuICAgKiBjb25zdCBleGVjID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKHBhcmVudENoYXJ0KTtcbiAgICogY29uc3QgaGFuZGxlID0gZXhlYy5kZXRhY2hBbmRKb2luTGF0ZXIobWljcm90YXNrQmF0Y2hEcml2ZXIsIHRlbGVtZXRyeUNoYXJ0LCB7IGV2ZW50OiAneCcgfSk7XG4gICAqIGF3YWl0IGhhbmRsZS53YWl0KCk7IC8vIG9wdGlvbmFsXG4gICAqIGBgYFxuICAgKi9cbiAgZGV0YWNoQW5kSm9pbkxhdGVyKFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlIHtcbiAgICByZXR1cm4gX2RldGFjaEFuZEpvaW5MYXRlcihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgJ19fZXhlY3V0b3JfXycpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZCBESVNDQVJEIHRoZSBoYW5kbGUuXG4gICAqIFVzZSBmb3IgdGVsZW1ldHJ5IGV4cG9ydHMgLyBmaXJlLWFuZC1mb3JnZXQgc2lkZSBlZmZlY3RzIHdoZXJlIHRoZVxuICAgKiBjYWxsZXIgZG9lc24ndCBjYXJlIGFib3V0IHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEVycm9ycyByYWlzZWQgYnkgdGhlIGNoaWxkIHN0aWxsIGxhbmQgb24gdGhlIChkaXNjYXJkZWQpIGhhbmRsZSDigJQgdGhleVxuICAgKiBnbyBzaWxlbnQgdW5sZXNzIHN1cmZhY2VkIHRocm91Z2ggYSByZWNvcmRlci4gRm9yIG9ic2VydmFibGUgZGV0YWNoLFxuICAgKiBwcmVmZXIgYGRldGFjaEFuZEpvaW5MYXRlcmAgYW5kIHN1cmZhY2UgZmFpbHVyZXMgdmlhIGAud2FpdCgpLmNhdGNoKClgLlxuICAgKi9cbiAgZGV0YWNoQW5kRm9yZ2V0KFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IHZvaWQge1xuICAgIF9kZXRhY2hBbmRGb3JnZXQoZHJpdmVyLCBjaGlsZCwgaW5wdXQsICdfX2V4ZWN1dG9yX18nKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIHNjb3BlIFJlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRC4gKi9cbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zY29wZVJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSBpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIHNjb3BlIFJlY29yZGVycy4gKi9cbiAgZ2V0U2NvcGVSZWNvcmRlcnMoKTogU2NvcGVSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2NvcGVSZWNvcmRlcnNdO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEZsb3dSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBGbG93UmVjb3JkZXIgdG8gb2JzZXJ2ZSBjb250cm9sIGZsb3cgZXZlbnRzLlxuICAgKiBBdXRvbWF0aWNhbGx5IGVuYWJsZXMgbmFycmF0aXZlIGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKSDigJQgcmVjb3JkZXJzIGFyZSBwYXNzZWQgdG8gdGhlIHRyYXZlcnNlciBhdCBjcmVhdGlvbiB0aW1lLlxuICAgKlxuICAgKiAqKklkZW1wb3RlbnQgYnkgSUQ6KiogcmVwbGFjZXMgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIGBpZGAuXG4gICAqL1xuICBhdHRhY2hGbG93UmVjb3JkZXIocmVjb3JkZXI6IEZsb3dSZWNvcmRlcik6IHZvaWQge1xuICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIElEIChpZGVtcG90ZW50IOKAlCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcpXG4gICAgdGhpcy5mbG93UmVjb3JkZXJzID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIHRoaXMuZmxvd1JlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgICB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgRmxvd1JlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRC4gKi9cbiAgZGV0YWNoRmxvd1JlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSBpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIEZsb3dSZWNvcmRlcnMuICovXG4gIGdldEZsb3dSZWNvcmRlcnMoKTogRmxvd1JlY29yZGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5mbG93UmVjb3JkZXJzXTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBDb21iaW5lZCBTY29wZVJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHJlY29yZGVyIHRoYXQgbWF5IG9ic2VydmUgbXVsdGlwbGUgZXZlbnQgc3RyZWFtcyAoc2NvcGVcbiAgICogZGF0YS1mbG93LCBjb250cm9sLWZsb3csIG9yIGJvdGgpLiBEZXRlY3RzIGF0IHJ1bnRpbWUgd2hpY2ggc3RyZWFtcyB0aGVcbiAgICogcmVjb3JkZXIgaGFzIG1ldGhvZHMgZm9yIGFuZCByb3V0ZXMgaXQgdG8gdGhlIGNvcnJlY3QgaW50ZXJuYWwgY2hhbm5lbHMuXG4gICAqXG4gICAqIFByZWZlcnJlZCBvdmVyIGNhbGxpbmcgYGF0dGFjaFNjb3BlUmVjb3JkZXJgIGFuZCBgYXR0YWNoRmxvd1JlY29yZGVyYFxuICAgKiBzZXBhcmF0ZWx5LCBiZWNhdXNlIGZvcmdldHRpbmcgb25lIG9mIHRoZSB0d28gaXMgYSBzaWxlbnQgZm9vdC1ndW4g4oCUXG4gICAqIGhhbGYgeW91ciBldmVudHMgbmV2ZXIgZmlyZSBhbmQgdGhlcmUgaXMgbm8gcnVudGltZSB3YXJuaW5nLiBXaXRoXG4gICAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCB0aGUgbGlicmFyeSBndWFyYW50ZWVzIHRoZSByZWNvcmRlcidzIGRlY2xhcmVkXG4gICAqIG1ldGhvZHMgYWxsIGZpcmUsIGFuZCBhZGRzIG5vIG92ZXJoZWFkIHZlcnN1cyB0d28gZXhwbGljaXQgY2FsbHMuXG4gICAqXG4gICAqICMjIElkZW1wb3RlbmN5XG4gICAqXG4gICAqIElkZW1wb3RlbnQgYnkgYGlkYCBhY3Jvc3MgQUxMIGNoYW5uZWxzIOKAlCByZS1hdHRhY2hpbmcgd2l0aCB0aGUgc2FtZSBgaWRgXG4gICAqIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBldmVyeXdoZXJlIGl0IHdhcyByZWdpc3RlcmVkLiBNaXhpbmdcbiAgICogYGF0dGFjaENvbWJpbmVkUmVjb3JkZXIoeClgIHdpdGggYSBwcmlvciBgYXR0YWNoU2NvcGVSZWNvcmRlcih5KWAgb3JcbiAgICogYGF0dGFjaEZsb3dSZWNvcmRlcih5KWAgdGhhdCBzaGFyZSBgeC5pZCA9PT0geS5pZGAgaXMgYWxzbyBzYWZlOiB0aGVcbiAgICogY29tYmluZWQgYXR0YWNoIHJlcGxhY2VzIHRoZSBzaW5nbGUtY2hhbm5lbCByZWdpc3RyYXRpb24gb24gd2hpY2hldmVyXG4gICAqIGNoYW5uZWwocykgYHhgIGhhcyBtZXRob2RzIGZvci4gTm8gZHVwbGljYXRlIGZpcmluZ3Mgb2NjdXIuXG4gICAqXG4gICAqICMjIE5hcnJhdGl2ZSBhY3RpdmF0aW9uXG4gICAqXG4gICAqIElmIHRoZSByZWNvcmRlciBoYXMgYW55IGNvbnRyb2wtZmxvdyBtZXRob2RzLCBgZW5hYmxlTmFycmF0aXZlKClgIGlzXG4gICAqIGNhbGxlZCBhcyBhIHNpZGUgZWZmZWN0ICh0aGUgbmFycmF0aXZlIHN1YnN5c3RlbSBpcyByZXF1aXJlZCB0byBlbWl0XG4gICAqIGNvbnRyb2wtZmxvdyBldmVudHMpLiBEYXRhLWZsb3ctb25seSByZWNvcmRlcnMgZG8gTk9UIGFjdGl2YXRlIHRoZVxuICAgKiBuYXJyYXRpdmUuXG4gICAqXG4gICAqICMjIERldGVjdGlvbiBydWxlXG4gICAqXG4gICAqIE9ubHkgKipvd24qKiBldmVudCBtZXRob2RzIGNvdW50IChzZWUgYGhhc1JlY29yZGVyTWV0aG9kc2ApLiBNZXRob2RzXG4gICAqIGluaGVyaXRlZCB2aWEgdGhlIHByb3RvdHlwZSBjaGFpbiBhcmUgaWdub3JlZCDigJQgdGhpcyBwcm90ZWN0cyBhZ2FpbnN0XG4gICAqIGFjY2lkZW50YWwgYE9iamVjdC5wcm90b3R5cGVgIHBvbGx1dGlvbiBhdHRhY2hpbmcgaGFuZGxlcnMgeW91IG5ldmVyXG4gICAqIGRlY2xhcmVkLiBBIHJlY29yZGVyIHRoYXQgcHJvdmlkZXMgb25seSBgY2xlYXJgL2B0b1NuYXBzaG90YCBpcyBhXG4gICAqIG5vLW9wIGFuZCBlbWl0cyBhIGRldi1tb2RlIHdhcm5pbmcgdG8gc3VyZmFjZSB0aGUgbGlrZWx5IG1pc3Rha2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYXVkaXQ6IENvbWJpbmVkUmVjb3JkZXIgPSB7XG4gICAqICAgaWQ6ICdhdWRpdCcsXG4gICAqICAgb25Xcml0ZTogKGUpID0+IGxvZygnc2NvcGUgd3JpdGUnLCBlLmtleSksXG4gICAqICAgb25EZWNpc2lvbjogKGUpID0+IGxvZygncm91dGVkIHRvJywgZS5jaG9zZW4pLFxuICAgKiB9O1xuICAgKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGF1ZGl0KTtcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hDb21iaW5lZFJlY29yZGVyKHJlY29yZGVyOiBDb21iaW5lZFJlY29yZGVyKTogdm9pZCB7XG4gICAgY29uc3QgaGFzRGF0YSA9IGhhc1JlY29yZGVyTWV0aG9kcyhyZWNvcmRlcik7XG4gICAgY29uc3QgaGFzRmxvdyA9IGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMocmVjb3JkZXIpO1xuICAgIGNvbnN0IGhhc0VtaXQgPSBoYXNFbWl0UmVjb3JkZXJNZXRob2RzKHJlY29yZGVyKTtcblxuICAgIC8vIEVtaXQgcmVjb3JkZXJzIGxpdmUgb24gdGhlIFNBTUUgY2hhbm5lbCBhcyBkYXRhLWZsb3cgcmVjb3JkZXJzXG4gICAgLy8gKFNjb3BlRmFjYWRlIGl0ZXJhdGVzIGBfcmVjb3JkZXJzYCBmb3Igb25FbWl0IGRpc3BhdGNoKS4gU29cbiAgICAvLyBhdHRhY2hFbWl0UmVjb3JkZXIgaW50ZXJuYWxseSBjYWxscyBhdHRhY2hTY29wZVJlY29yZGVyIOKAlCBidXQgd2Ugd2FudCB0b1xuICAgIC8vIGF2b2lkIGRvdWJsZS1hdHRhY2ggd2hlbiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBCT1RIIG9uRW1pdCBBTkRcbiAgICAvLyBvdGhlciBTY29wZVJlY29yZGVyIG1ldGhvZHMuIFNob3J0LWNpcmN1aXQ6IGlmIGhhc0RhdGEgT1IgaGFzRW1pdCwgdGhlXG4gICAgLy8gcmVjb3JkZXIgbGFuZHMgb24gdGhlIHNjb3BlLXJlY29yZGVyIGxpc3QgZXhhY3RseSBvbmNlLlxuICAgIGlmIChoYXNEYXRhIHx8IGhhc0VtaXQpIHRoaXMuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlciBhcyBTY29wZVJlY29yZGVyKTtcbiAgICBpZiAoaGFzRmxvdykgdGhpcy5hdHRhY2hGbG93UmVjb3JkZXIocmVjb3JkZXIgYXMgRmxvd1JlY29yZGVyKTtcblxuICAgIGlmICghaGFzRGF0YSAmJiAhaGFzRmxvdyAmJiAhaGFzRW1pdCAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgLy8gRGV2LW1vZGUgb25seTogc2lsZW50IHNraXBzIGFyZSBpbnZpc2libGUgYW5kIHByb2R1Y2UgaGFyZC10by1kZWJ1Z1xuICAgICAgLy8gXCJ3aHkgZGlkbid0IG15IHJlY29yZGVyIGZpcmVcIiByZXBvcnRzLiBQZXIgbGlicmFyeSBjb252ZW50aW9uLCBnYXRlZFxuICAgICAgLy8gb24gdGhlIGNlbnRyYWwgaXNEZXZNb2RlKCkgZmxhZyAobm90IHByb2Nlc3MuZW52KSBzbyBjb25zdW1lcnMgY2FuXG4gICAgICAvLyBjb250cm9sIGRldiB0b29saW5nIGNlbnRyYWxseSB2aWEgZW5hYmxlRGV2TW9kZSgpL2Rpc2FibGVEZXZNb2RlKCkuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludGpzXSBhdHRhY2hDb21iaW5lZFJlY29yZGVyOiByZWNvcmRlciAnJHtyZWNvcmRlci5pZH0nIGhhcyBgICtcbiAgICAgICAgICAnbm8gb2JzZXJ2ZXIgZXZlbnQgbWV0aG9kcyDigJQgbm90aGluZyB0byBhdHRhY2guIERpZCB5b3UgZm9yZ2V0IHRvICcgK1xuICAgICAgICAgICdhZGQgYW4gb24qIGhhbmRsZXIgKG9uV3JpdGUsIG9uRGVjaXNpb24sIG9uU3ViZmxvd0VudHJ5LCAuLi4pPyAnICtcbiAgICAgICAgICAnTm90ZTogb25seSBPV04gcHJvcGVydGllcyBjb3VudDsgbWV0aG9kcyBvbiB0aGUgcHJvdG90eXBlIGNoYWluICcgK1xuICAgICAgICAgICdhcmUgaWdub3JlZCBvbiBwdXJwb3NlLicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjb21iaW5lZCByZWNvcmRlciBmcm9tIGFsbCBjaGFubmVscyBpdCB3YXMgYXR0YWNoZWQgdG8uXG4gICAqIFNhZmUgdG8gY2FsbCBpZiB0aGUgcmVjb3JkZXIgd2FzIG9ubHkgb24gb25lIGNoYW5uZWwgb3IgbmV2ZXIgYXR0YWNoZWQuXG4gICAqL1xuICBkZXRhY2hDb21iaW5lZFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFNjb3BlUmVjb3JkZXIoaWQpO1xuICAgIHRoaXMuZGV0YWNoRmxvd1JlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBFbWl0IFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCAoUGhhc2UgMykg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhbiBgRW1pdFJlY29yZGVyYCDigJQgYW4gb2JzZXJ2ZXIgZm9yIGNvbnN1bWVyLWVtaXR0ZWQgc3RydWN0dXJlZFxuICAgKiBldmVudHMgZmlyZWQgdmlhIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAuXG4gICAqXG4gICAqIEludGVybmFsbHksIGVtaXQgcmVjb3JkZXJzIHNoYXJlIHRoZSBzY29wZS1yZWNvcmRlciBjaGFubmVsIGJlY2F1c2VcbiAgICogZW1pdCBldmVudHMgZmlyZSBmcm9tIGluc2lkZSBgU2NvcGVGYWNhZGVgIGR1cmluZyBzdGFnZSBleGVjdXRpb24sXG4gICAqIHNhbWUgdGltaW5nIGFzIGBvblJlYWRgL2BvbldyaXRlYC4gVGhpcyBtZXRob2QgaXMgYSBjb252ZW5pZW5jZSB0aGF0XG4gICAqIGRlbGVnYXRlcyB0byBgYXR0YWNoU2NvcGVSZWNvcmRlcmAg4oCUIGNvbnN1bWVycyBjYW4gYWxzbyB1c2VcbiAgICogYGF0dGFjaFNjb3BlUmVjb3JkZXJgIGRpcmVjdGx5IGZvciBhIHJlY29yZGVyIHRoYXQgaW1wbGVtZW50cyBCT1RIXG4gICAqIGBvbldyaXRlYCBhbmQgYG9uRW1pdGAuIEVpdGhlciBhcHByb2FjaCBwbGFjZXMgdGhlIHJlY29yZGVyIG9uIHRoZVxuICAgKiBzYW1lIHVuZGVybHlpbmcgbGlzdCwgc28gYG9uRW1pdGAgZmlyZXMgZXhhY3RseSBvbmNlIHBlciBldmVudC5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IGBpZGA6KiogcmVwbGFjZXMgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIGBpZGAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZXhlY3V0b3IuYXR0YWNoRW1pdFJlY29yZGVyKHtcbiAgICogICBpZDogJ3Rva2VuLW1ldGVyJyxcbiAgICogICBvbkVtaXQ6IChlKSA9PiB7XG4gICAqICAgICBpZiAoZS5uYW1lID09PSAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucycpIHRyYWNrVG9rZW5zKGUucGF5bG9hZCk7XG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoRW1pdFJlY29yZGVyKHJlY29yZGVyOiBFbWl0UmVjb3JkZXIpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXIgYXMgU2NvcGVSZWNvcmRlcik7XG4gIH1cblxuICAvKiogRGV0YWNoIGFuIGBFbWl0UmVjb3JkZXJgIGJ5IGlkLiBTYWZlIHRvIGNhbGwgaWYgbmV2ZXIgYXR0YWNoZWQuICovXG4gIGRldGFjaEVtaXRSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hTY29wZVJlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgcmVjb3JkZXJzIGZpbHRlcmVkIHRvIHRob3NlIHRoYXRcbiAgICogaW1wbGVtZW50IGBvbkVtaXRgLiBVc2VmdWwgZm9yIGluc3BlY3Rpb24gZHVyaW5nIHRlc3RpbmcuXG4gICAqL1xuICBnZXRFbWl0UmVjb3JkZXJzKCk6IEVtaXRSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoXG4gICAgICAocik6IHIgaXMgRW1pdFJlY29yZGVyID0+IHR5cGVvZiAociBhcyB7IG9uRW1pdD86IHVua25vd24gfSkub25FbWl0ID09PSAnZnVuY3Rpb24nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzdHJ1Y3R1cmVkIG5hcnJhdGl2ZSBlbnRyaWVzIOKAlCB0aGUgc2luZ2xlIHB1YmxpYyBuYXJyYXRpdmUgQVBJLlxuICAgKiBFYWNoIGVudHJ5IGhhcyBhIHR5cGUgKHN0YWdlLCBzdGVwLCBjb25kaXRpb24sIGZvcmssIGV0Yy4pLCB0ZXh0LCBhbmRcbiAgICogZGVwdGguIENvbnN1bWVycyByZW5kZXIgaG93ZXZlciB0aGV5IHdhbnQ7IGNhbGwgYC5tYXAoZSA9PiBlLnRleHQpYFxuICAgKiBpZiBhIGZsYXQgYHN0cmluZ1tdYCBpcyBuZWVkZWQgbG9jYWxseS5cbiAgICovXG4gIGdldE5hcnJhdGl2ZUVudHJpZXMoKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21iaW5lZFJlY29yZGVyLmdldEVudHJpZXMoKTtcbiAgICB9XG4gICAgY29uc3QgZmxvd1NlbnRlbmNlcyA9IHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICAgIHJldHVybiBmbG93U2VudGVuY2VzLm1hcCgodGV4dCkgPT4gKHsgdHlwZTogJ3N0YWdlJyBhcyBjb25zdCwgdGV4dCwgZGVwdGg6IDAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbWJpbmVkIEZsb3dSZWNvcmRlcnMgbGlzdC4gV2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZCxcbiAgICogaW5jbHVkZXMgdGhlIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgKHdoaWNoIGJ1aWxkcyBtZXJnZWQgZmxvdytkYXRhXG4gICAqIGVudHJpZXMgaW5saW5lKS4gUGx1cyBhbnkgdXNlci1hdHRhY2hlZCByZWNvcmRlcnMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRmxvd1JlY29yZGVyc0xpc3QoKTogRmxvd1JlY29yZGVyW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyczogRmxvd1JlY29yZGVyW10gPSBbXTtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZWNvcmRlcnMucHVzaCh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpO1xuICAgIH1cbiAgICByZWNvcmRlcnMucHVzaCguLi50aGlzLmZsb3dSZWNvcmRlcnMpO1xuICAgIHJldHVybiByZWNvcmRlcnMubGVuZ3RoID4gMCA/IHJlY29yZGVycyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFzeW5jIHJ1bihvcHRpb25zPzogUnVuT3B0aW9ucyk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICAvLyBSZS1lbnRyYW5jeSBndWFyZCBGSVJTVCDigJQgYmVmb3JlIGNsZWFyaW5nIHJlY29yZGVycyBvciB0b3VjaGluZyBhbnlcbiAgICAvLyBwZXItcnVuIGZpZWxkLCBzbyBhIHJlamVjdGVkIGNvbmN1cnJlbnQgY2FsbCBsZWF2ZXMgdGhlIGluLWZsaWdodCBydW5cbiAgICAvLyBjb21wbGV0ZWx5IHVudG91Y2hlZC5cbiAgICBpZiAodGhpcy5faXNFeGVjdXRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Zsb3dDaGFydEV4ZWN1dG9yOiBydW4oKSBjYWxsZWQgd2hpbGUgYW5vdGhlciBydW4oKS9yZXN1bWUoKSBpcyBpbiBmbGlnaHQgb24gdGhpcyAnICtcbiAgICAgICAgICAnZXhlY3V0b3IuIEFuIGV4ZWN1dG9yIGhvbGRzIHBlci1ydW4gc3RhdGUgKHJ1bklkLCByZWNvcmRlcnMsIGNoZWNrcG9pbnQpIOKAlCBjcmVhdGUgJyArXG4gICAgICAgICAgJ29uZSBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIGlucHV0IGFnYWluc3QgaW5wdXRTY2hlbWEgaWYgYm90aCBhcmUgcHJlc2VudC4gVmFsaWRhdGlvbiBydW5zXG4gICAgLy8gQkVGT1JFIHRoZSB0aW1lb3V0IHRpbWVyIGlzIGNyZWF0ZWQgc28gYSByZWplY3RlZCBpbnB1dCBjYW4ndCBsZWFrIGFcbiAgICAvLyBwZW5kaW5nIHRpbWVyIChzYW1lIFwiZmFpbGVkIGVudHJ5IGxlYXZlcyBubyBzaWRlIGVmZmVjdHNcIiBydWxlIGFzIHRoZVxuICAgIC8vIHJlLWVudHJhbmN5IGd1YXJkIGFib3ZlKS5cbiAgICBsZXQgdmFsaWRhdGVkSW5wdXQgPSBvcHRpb25zPy5pbnB1dDtcbiAgICBpZiAodmFsaWRhdGVkSW5wdXQgJiYgdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5pbnB1dFNjaGVtYSkge1xuICAgICAgdmFsaWRhdGVkSW5wdXQgPSB2YWxpZGF0ZUlucHV0KHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEsIHZhbGlkYXRlZElucHV0KTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludGVybmFsIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dE1zXG4gICAgaWYgKG9wdGlvbnM/LnRpbWVvdXRNcyAmJiAhc2lnbmFsKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBjb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcihgRXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke29wdGlvbnMudGltZW91dE1zfW1zYCkpLFxuICAgICAgICBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVXNlci1hdHRhY2hlZCByZWNvcmRlcnMgKGZsb3dSZWNvcmRlcnMgKyBzY29wZVJlY29yZGVycykgYXJlIGNsZWFyZWQgdmlhIGNsZWFyKCkgdG8gcHJldmVudFxuICAgIC8vIGNyb3NzLXJ1biBhY2N1bXVsYXRpb24uIFRoZSBjb21iaW5lZFJlY29yZGVyIGlzIE5PVCBjbGVhcmVkIGhlcmUg4oCUIGNyZWF0ZVRyYXZlcnNlcigpIGFsd2F5c1xuICAgIC8vIGNyZWF0ZXMgYSBmcmVzaCBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGluc3RhbmNlIG9uIGVhY2ggcnVuLCBzbyBzdGFsZSBzdGF0ZSBpcyBuZXZlciBhbiBpc3N1ZS5cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICByLmNsZWFyPy4oKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHtcbiAgICAgIHIuY2xlYXI/LigpO1xuICAgIH1cblxuICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTsgLy8gUmVzZXQgY291bnRlciBvbiBmcmVzaCBydW5cbiAgICB0aGlzLl9jdXJyZW50UnVuSWQgPSBnZW5lcmF0ZVJ1bklkKCk7IC8vIEZyZXNoIHJ1bklkIHBlciBydW4oKSBjYWxsXG4gICAgdGhpcy5faGFzUnVuQmVmb3JlID0gdHJ1ZTsgLy8gbWFyayBzbyBhIGxhdGVyIHJlc3VtZSgpIHRha2VzIHRoZVxuICAgIC8vIHNhbWUtZXhlY3V0b3IgYnJhbmNoIChyZXVzZSBydW50aW1lLCBhY2N1bXVsYXRlIGV4ZWN1dGlvbiB0cmVlKS5cbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKFxuICAgICAgc2lnbmFsLFxuICAgICAgdmFsaWRhdGVkSW5wdXQsXG4gICAgICBvcHRpb25zPy5lbnYsXG4gICAgICBvcHRpb25zPy5tYXhEZXB0aCxcbiAgICAgIG9wdGlvbnM/Lm1heEl0ZXJhdGlvbnMsXG4gICAgKTtcbiAgICAvLyBTZXQgQUZURVIgYWxsIHN5bmMgdmFsaWRhdGlvbiB0aHJvd3MgKG5vdGhpbmcgYWJvdmUgY2FuIGxlYWsgdGhlIGZsYWcpO1xuICAgIC8vIG5vIGF3YWl0IGJldHdlZW4gdGhlIHRvcC1vZi1tZXRob2QgY2hlY2sgYW5kIGhlcmUsIHNvIHRoaXMgaXMgcmFjZS1mcmVlLlxuICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIC8vIEJ1aWxkIGEgZGV0YWNoZWQgY2hlY2twb2ludCBmcm9tIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlIOKAlCBzZWVcbiAgICAgICAgLy8gYnVpbGRQYXVzZUNoZWNrcG9pbnQoKSBmb3IgdGhlIGRlZXAtY29weSByYXRpb25hbGUuXG4gICAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB0aGlzLmJ1aWxkUGF1c2VDaGVja3BvaW50KGVycm9yKTtcbiAgICAgICAgLy8gUmV0dXJuIGEgUGF1c2VSZXN1bHQtc2hhcGVkIHZhbHVlIHNvIGNhbGxlcnMgY2FuIGNoZWNrIHdpdGhvdXQgdHJ5L2NhdGNoXG4gICAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEludHJvc3BlY3Rpb24g4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGFjdCAgV2hlbiBgdHJ1ZWAsIGBzaGFyZWRTdGF0ZWAgY29tZXMgZnJvbSB0aGUgcGFyYWxsZWxcbiAgICogICByZWRhY3RlZCBtaXJyb3IgKGlmIG1haW50YWluZWQg4oCUIHNlZSBgc2V0UmVkYWN0aW9uUG9saWN5YCkuIFRoaXMgaXNcbiAgICogICB0aGUgc2FmZSB2aWV3IGZvciBleHBvcnRpbmcgdHJhY2VzIGV4dGVybmFsbHkgKHBhc3RlIGludG8gYSB2aWV3ZXIsXG4gICAqICAgc2hhcmUgd2l0aCBzdXBwb3J0KS4gV2hlbiBubyByZWRhY3Rpb24gcG9saWN5IGlzIGNvbmZpZ3VyZWQgdGhlXG4gICAqICAgcmVkYWN0ZWQgbWlycm9yIGlzIG5vdCBtYWludGFpbmVkLCBzbyB0aGlzIGZsYWcgaXMgYSBuby1vcCDigJRcbiAgICogICBgc2hhcmVkU3RhdGVgIGlzIHRoZSByYXcgd29ya2luZyBtZW1vcnkgZWl0aGVyIHdheS4gRGVmYXVsdCBgZmFsc2VgLlxuICAgKlxuICAgKiAgIFRoZSBjb21taXQgbG9nIGlzIGFscmVhZHkgcmVkYWN0ZWQgYXQgd3JpdGUtdGltZSByZWdhcmRsZXNzIG9mIHRoaXNcbiAgICogICBmbGFnLCBhbmQgdGhlIGV4ZWN1dGlvbiB0cmVlIGNhcnJpZXMgb25seSBzdHJ1Y3R1cmFsIG1ldGFkYXRhLlxuICAgKlxuICAgKiAqKlRyZWF0IGBzaGFyZWRTdGF0ZWAgYXMgUkVBRC1PTkxZLioqIEluIHByb2R1Y3Rpb24gaXQgaXMgYSBsaXZlIHZpZXcgb2ZcbiAgICogdGhlIGVuZ2luZSdzIHdvcmtpbmcgbWVtb3J5ICh6ZXJvIGNvcHkgY29zdCkg4oCUIG11dGF0aW5nIGl0IGNvcnJ1cHRzXG4gICAqIGVuZ2luZSBzdGF0ZS4gSW4gZGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSBpdCBpcyBhIGRlZXAtZnJvemVuIENMT05FLFxuICAgKiBzbyBhbnkgY29uc3VtZXIgbXV0YXRpb24gdGhyb3dzIGxvdWRseSBpbnN0ZWFkIG9mIGNvcnJ1cHRpbmcgc2lsZW50bHkuXG4gICAqL1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiBSdW50aW1lU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3Qob3B0aW9ucykgYXMgUnVudGltZVNuYXBzaG90O1xuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgLy8gRGV2LW1vZGUgbXV0YXRpb24gZ3VhcmQ6IGZyZWV6ZSBhIENMT05FLCBuZXZlciB0aGUgbGl2ZSBlbmdpbmVcbiAgICAgIC8vIHN0YXRlIOKAlCBgc25hcHNob3Quc2hhcmVkU3RhdGVgIGFsaWFzZXMgU2hhcmVkTWVtb3J5J3MgaW50ZXJuYWxcbiAgICAgIC8vIGNvbnRleHQgdW50aWwgdGhlIG5leHQgY29tbWl0IHJlYnVpbGRzIGl0IChwb3N0LXJ1bjogZm9yZXZlcikuXG4gICAgICAvLyBQcm9kdWN0aW9uIHN0YXlzIHplcm8tY29weTsgY2xvbmUtYWx3YXlzIGlzIGEgbWVhc3VyZWQgZGVjaXNpb25cbiAgICAgIC8vIGRlZmVycmVkIHVudGlsIHRoZSBiZW5jaCBzYXlzIGl0J3MgYWZmb3JkYWJsZSAoQkFDS0xPRyAjOCkuXG4gICAgICAvLyBOT1RFOiBkZWVwRnJlZXplIChyZXVzZWQgZnJvbSByZWFkb25seUlucHV0KSBmcmVlemVzIHBsYWluIG9iamVjdHMvXG4gICAgICAvLyBhcnJheXMgb25seSDigJQgTWFwL1NldCBJTlRFUk5BTFMgc3RheSBtdXRhYmxlIChgbWFwLnNldCgpYCBvbiB0aGVcbiAgICAgIC8vIGZyb3plbiBjbG9uZSB3b24ndCB0aHJvdykuIFRoZSBDTE9ORSBzdGlsbCBpc29sYXRlcyB0aGUgZW5naW5lLlxuICAgICAgc25hcHNob3Quc2hhcmVkU3RhdGUgPSBkZWVwRnJlZXplKHN0cnVjdHVyZWRDbG9uZShzbmFwc2hvdC5zaGFyZWRTdGF0ZSkpO1xuICAgIH1cbiAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgIGlmIChzZlJlc3VsdHMuc2l6ZSA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dSZXN1bHRzID0gT2JqZWN0LmZyb21FbnRyaWVzKHNmUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCBzbmFwc2hvdCBkYXRhIGZyb20gcmVjb3JkZXJzIHRoYXQgaW1wbGVtZW50IHRvU25hcHNob3QoKVxuICAgIGNvbnN0IHJlY29yZGVyU25hcHNob3RzOiBSZWNvcmRlclNuYXBzaG90W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykge1xuICAgICAgaWYgKHIudG9TbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBzbmFwID0gci50b1NuYXBzaG90KCk7XG4gICAgICAgIHJlY29yZGVyU25hcHNob3RzLnB1c2goe1xuICAgICAgICAgIGlkOiByLmlkLFxuICAgICAgICAgIG5hbWU6IHNuYXAubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc25hcC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwcmVmZXJyZWRPcGVyYXRpb246IHNuYXAucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgICAgICAgIGRhdGE6IHNuYXAuZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgIGlmIChyLnRvU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgc25hcCA9IHIudG9TbmFwc2hvdCgpO1xuICAgICAgICByZWNvcmRlclNuYXBzaG90cy5wdXNoKHtcbiAgICAgICAgICBpZDogci5pZCxcbiAgICAgICAgICBuYW1lOiBzbmFwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHNuYXAuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiBzbmFwLnByZWZlcnJlZE9wZXJhdGlvbixcbiAgICAgICAgICBkYXRhOiBzbmFwLmRhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVjb3JkZXJTbmFwc2hvdHMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QucmVjb3JkZXJzID0gcmVjb3JkZXJTbmFwc2hvdHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMudHJhdmVyc2VyLnNldFJvb3RPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0QnJhbmNoSWRzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVSb290KCk6IFN0YWdlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVSb290KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVN0cnVjdHVyZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3ViZmxvdyBtYW5pZmVzdCBmcm9tIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyLlxuICAgKiBSZXR1cm5zIGVtcHR5IGFycmF5IGlmIG5vIE1hbmlmZXN0Rmxvd1JlY29yZGVyIGlzIGF0dGFjaGVkLlxuICAgKi9cbiAgZ2V0U3ViZmxvd01hbmlmZXN0KCk6IE1hbmlmZXN0RW50cnlbXSB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRNYW5pZmVzdCgpID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZ1bGwgc3BlYyBmb3IgYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIHN1YmZsb3cuXG4gICAqIFJlcXVpcmVzIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyIHRoYXQgb2JzZXJ2ZWQgdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIGdldFN1YmZsb3dTcGVjKHN1YmZsb3dJZDogc3RyaW5nKTogdW5rbm93biB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRTcGVjKHN1YmZsb3dJZCk7XG4gIH1cbn1cbiJdfQ==
|
|
1322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFHSCxpREFBb0g7QUFFcEgsbUdBQTZGO0FBRzdGLG1HQUE2RjtBQUU3RixtRUFBa0U7QUFDbEUscUZBQStFO0FBQy9FLGlEQVc0QjtBQUc1QixnREFBa0Q7QUFFbEQseUVBQXFIO0FBRXJILGtFQUF1RDtBQUN2RCwyRUFBa0U7QUFFbEUsNERBQXNEO0FBRXRELG1FQUFpRztBQUNqRyx1RUFBdUg7QUFDdkgsK0RBQXNHO0FBQ3RHLHlDQUEyQztBQUMzQyx5REFBbUQ7QUFFbkQsMEVBQTBFO0FBQzFFLE1BQU0sbUJBQW1CLEdBQWlCLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FDMUUsSUFBSSw0QkFBVyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBNEdqRCxNQUFhLGlCQUFpQjtJQUNwQixTQUFTLENBQW1DO0lBQ3BELDhFQUE4RTtJQUN0RSxpQkFBaUIsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN6Qzs7K0JBRTJCO0lBQ25CLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDbkIsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLGdCQUFnQixDQUFvQztJQUNwRCxnQkFBZ0IsQ0FBd0M7SUFDeEQsYUFBYSxHQUFtQixFQUFFLENBQUM7SUFDbkMsY0FBYyxHQUFvQixFQUFFLENBQUM7SUFDN0M7Ozs7O09BS0c7SUFDSyxZQUFZLENBQXdCO0lBQ3BDLGVBQWUsQ0FBOEI7SUFDN0Msa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUN2Qyx5QkFBeUIsR0FBRyxJQUFJLEdB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QUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0I7UUFDaEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSw4Q0FBb0IsQ0FFcEUsQ0FBQztRQUNkLE9BQU8sUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLFNBQWlCO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksOENBQW9CLENBRXBFLENBQUM7UUFDZCxPQUFPLFFBQVEsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGO0FBNTVDRCw4Q0E0NUNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Q2hhcnRFeGVjdXRvciDigJQgUHVibGljIEFQSSBmb3IgZXhlY3V0aW5nIGEgY29tcGlsZWQgRmxvd0NoYXJ0LlxuICpcbiAqIFdyYXBzIEZsb3djaGFydFRyYXZlcnNlci4gQnVpbGQgYSBjaGFydCB3aXRoIGZsb3dDaGFydCgpIGFuZCBwYXNzIHRoZSByZXN1bHQgaGVyZTpcbiAqXG4gKiAgIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdlbnRyeScsIGVudHJ5Rm4pLmFkZEZ1bmN0aW9uKCdwcm9jZXNzJywgcHJvY2Vzc0ZuKS5idWlsZCgpO1xuICpcbiAqICAgLy8gTm8tb3B0aW9ucyBmb3JtICh1c2VzIGF1dG8tZGV0ZWN0ZWQgVHlwZWRTY29wZSBmYWN0b3J5IGZyb20gdGhlIGNoYXJ0KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICpcbiAqICAgLy8gT3B0aW9ucy1vYmplY3QgZm9ybSAocHJlZmVycmVkIHdoZW4geW91IG5lZWQgdG8gY3VzdG9taXplIGJlaGF2aW9yKTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnkgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXRhY2hBbmRGb3JnZXQgYXMgX2RldGFjaEFuZEZvcmdldCwgZGV0YWNoQW5kSm9pbkxhdGVyIGFzIF9kZXRhY2hBbmRKb2luTGF0ZXIgfSBmcm9tICcuLi9kZXRhY2gvc3Bhd24uanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCB9IGZyb20gJy4uL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEV4ZWN1dG9yUmVzdWx0LFxuICB0eXBlIFBhdXNlZFJlc3VsdCxcbiAgdHlwZSBSdW5PcHRpb25zLFxuICB0eXBlIFNjb3BlRmFjdG9yeSxcbiAgdHlwZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHR5cGUgU3RhZ2VOb2RlLFxuICB0eXBlIFN0cmVhbUhhbmRsZXJzLFxuICB0eXBlIFN1YmZsb3dSZXN1bHQsXG4gIHR5cGUgVHJhdmVyc2FsUmVzdWx0LFxuICBkZWZhdWx0TG9nZ2VyLFxufSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkVHJhY2tpbmdNb2RlLCBTdGFnZVNuYXBzaG90LCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgaGFzRW1pdFJlY29yZGVyTWV0aG9kcywgaGFzRmxvd1JlY29yZGVyTWV0aG9kcywgaGFzUmVjb3JkZXJNZXRob2RzIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0VtaXRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9zY29wZS9kZXRlY3RDaXJjdWxhci5qcyc7XG5pbXBvcnQgeyBkZWVwRnJlZXplIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgU2NvcGVGYWNhZGUgfSBmcm9tICcuLi9zY29wZS9TY29wZUZhY2FkZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblBvbGljeSwgUmVkYWN0aW9uUmVwb3J0LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVzY3JpYmVDaGVja3BvaW50Q2xvbmVGYWlsdXJlLCBzYW5pdGl6ZURpYWdub3N0aWNCYWdzIH0gZnJvbSAnLi9jaGVja3BvaW50U2FuaXRpemUuanMnO1xuaW1wb3J0IHsgdHlwZSBBdHRhY2hSZWNvcmRlck9wdGlvbnMsIHR5cGUgT2JzZXJ2ZXJEcmFpblJlc3VsdCwgRGVmZXJyZWRPYnNlcnZlclRpZXIgfSBmcm9tICcuL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLmpzJztcbmltcG9ydCB7IHR5cGUgUmVjb3JkZXJTbmFwc2hvdCwgdHlwZSBSdW50aW1lU25hcHNob3QsIEV4ZWN1dGlvblJ1bnRpbWUgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSdW5JZCB9IGZyb20gJy4vcnVuSWQuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnB1dCB9IGZyb20gJy4vdmFsaWRhdGVJbnB1dC5qcyc7XG5cbi8qKiBEZWZhdWx0IHNjb3BlIGZhY3Rvcnkg4oCUIGNyZWF0ZXMgYSBwbGFpbiBTY29wZUZhY2FkZSBmb3IgZWFjaCBzdGFnZS4gKi9cbmNvbnN0IGRlZmF1bHRTY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeSA9IChjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudikgPT5cbiAgbmV3IFNjb3BlRmFjYWRlKGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52KTtcblxuLyoqXG4gKiBPcHRpb25zIG9iamVjdCBmb3IgYEZsb3dDaGFydEV4ZWN1dG9yYCDigJQgcHJlZmVycmVkIG92ZXIgcG9zaXRpb25hbCBwYXJhbXMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZXggPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHtcbiAqICAgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnksXG4gKiAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0OiB7IC4uLiB9LFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAqKlN5bmMgbm90ZSBmb3IgbWFpbnRhaW5lcnM6KiogRXZlcnkgZmllbGQgYWRkZWQgaGVyZSBtdXN0IGFsc28gYXBwZWFyIGluIHRoZVxuICogYGZsb3dDaGFydEFyZ3NgIHByaXZhdGUgZmllbGQgdHlwZSBhbmQgaW4gdGhlIGNvbnN0cnVjdG9yJ3Mgb3B0aW9ucy1yZXNvbHV0aW9uXG4gKiBibG9jayAodGhlIGBlbHNlIGlmYCBicmFuY2ggdGhhdCByZWFkcyBmcm9tIGBvcHRzYCkuIE1pc3NpbmcgYW55IG9uZSBvZiB0aGVcbiAqIHRocmVlIGNhdXNlcyBzaWxlbnQgb21pc3Npb24g4oCUIHRoZSBvcHRpb24gaXMgYWNjZXB0ZWQgYnV0IG5ldmVyIGFwcGxpZWQuXG4gKlxuICogKipUU2NvcGUgaW5mZXJlbmNlIG5vdGU6KiogV2hlbiB1c2luZyB0aGUgb3B0aW9ucy1vYmplY3QgZm9ybSB3aXRoIGEgY3VzdG9tIHNjb3BlLFxuICogVHlwZVNjcmlwdCBjYW5ub3QgaW5mZXIgYFRTY29wZWAgdGhyb3VnaCB0aGUgb3B0aW9ucyBvYmplY3QuIFBhc3MgdGhlIHR5cGVcbiAqIGV4cGxpY2l0bHk6IGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3I8VE91dCwgTXlTY29wZT4oY2hhcnQsIHsgc2NvcGVGYWN0b3J5IH0pYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlID0gYW55PiB7XG4gIC8vIOKUgOKUgCBDb21tb24gb3B0aW9ucyAobW9zdCBjYWxsZXJzIG5lZWQgb25seSB0aGVzZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEN1c3RvbSBzY29wZSBmYWN0b3J5LiBEZWZhdWx0cyB0byBUeXBlZFNjb3BlIG9yIFNjb3BlRmFjYWRlIGF1dG8tZGV0ZWN0aW9uLiAqL1xuICBzY29wZUZhY3Rvcnk/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcblxuICAvLyDilIDilIAgQ29udGV4dCBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBwcmUtcG9wdWxhdGVkIGludG8gdGhlIHNoYXJlZCBjb250ZXh0IGJlZm9yZSAqKmVhY2gqKiBzdGFnZVxuICAgKiAocmUtYXBwbGllZCBldmVyeSBzdGFnZSwgYWN0aW5nIGFzIGJhc2VsaW5lIGRlZmF1bHRzKS5cbiAgICovXG4gIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEluaXRpYWwgY29udGV4dCB2YWx1ZXMgbWVyZ2VkIGludG8gdGhlIHNoYXJlZCBjb250ZXh0ICoqb25jZSoqIGF0IHN0YXJ0dXBcbiAgICogKGFwcGxpZWQgYmVmb3JlIHRoZSBmaXJzdCBzdGFnZSwgbm90IHJlcGVhdGVkIG9uIHN1YnNlcXVlbnQgc3RhZ2VzKS5cbiAgICogRGlzdGluY3QgZnJvbSBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgLCB3aGljaCBpcyByZS1hcHBsaWVkIGV2ZXJ5IHN0YWdlLlxuICAgKi9cbiAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAvKiogUmVhZC1vbmx5IGlucHV0IGFjY2Vzc2libGUgdmlhIGBzY29wZS5nZXRBcmdzKClgIOKAlCBuZXZlciB0cmFja2VkIG9yIHdyaXR0ZW4uICovXG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG5cbiAgLy8g4pSA4pSAIE9ic2VydmFiaWxpdHkgY29zdCBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBQb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgICgjMTQpLiBEZWZhdWx0IGAnZnVsbCdgIOKAlCBldmVyeVxuICAgKiB0cmFja2VkIHJlYWQgYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSB2YWx1ZSBpbnRvIHRoZSBzdGFnZSdzIHJlYWQgdmlld1xuICAgKiAodGhlIGhpc3RvcmljYWwgYmVoYXZpb3I7IHdoYXQgbGVucy9hZ2VudGZvb3RwcmludCBzbmFwc2hvdHMgc2hvdykuXG4gICAqIGAnc3VtbWFyeSdgIHJlY29yZHMgYSBjaGVhcCB0eXBlL3NpemUvcHJldmlldyBtYXJrZXIgcGVyIHJlYWQ7IGAnb2ZmJ2BcbiAgICogcmVjb3JkcyBub3RoaW5nIOKAlCB6ZXJvIHBlci1yZWFkIGNsb25lIGNvc3QgKHJlYWRzIG9mIGxhcmdlIHZhbHVlcyBiZWNvbWVcbiAgICogfmZyZWUpLiBOYXJyYXRpdmUgYW5kIGBTY29wZVJlY29yZGVyLm9uUmVhZGAgYXJlIGlkZW50aWNhbCBpbiBldmVyeSBtb2RlLlxuICAgKiBDYXZlYXQ6IHVuZGVyIGAnb2ZmJ2AgYSBzdGFnZSdzIHNuYXBzaG90IGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gb25lXG4gICAqIHRoYXQgcmVhZCBub3RoaW5nIOKAlCBhdWRpdGluZyBjb25zdW1lcnMgdGhhdCBuZWVkIFwiZGlkIGl0IHJlYWQ/XCIgd2l0aG91dFxuICAgKiB0aGUgdmFsdWUgY29zdCBzaG91bGQgcHJlZmVyIGAnc3VtbWFyeSdgLlxuICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgYGV4ZWN1dG9yLnNldFJlYWRUcmFja2luZyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gICAqL1xuICByZWFkVHJhY2tpbmc/OiBSZWFkVHJhY2tpbmdNb2RlO1xuXG4gIC8qKlxuICAgKiBQb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoIzEzYy1BKSDigJQgdGhlIHNpYmxpbmcgb2ZcbiAgICoge0BsaW5rIHJlYWRUcmFja2luZ307IHRoZSB0d28gZGlhbHMgYXJlIGluZGVwZW5kZW50LiBEZWZhdWx0IGAnZnVsbCdgIOKAlFxuICAgKiBldmVyeSB0cmFja2VkIHdyaXRlIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50byB0aGUgc3RhZ2UncyB3cml0ZVxuICAgKiB2aWV3ICh0aGUgaGlzdG9yaWNhbCBiZWhhdmlvcikuIGAnc3VtbWFyeSdgIHJlY29yZHMgYSBjaGVhcFxuICAgKiBgV3JpdGVTdW1tYXJ5TWFya2VyYCAodHlwZS9zaXplL3ByZXZpZXcpIHBlciB3cml0ZTsgYCdvZmYnYCByZWNvcmRzXG4gICAqIG5vdGhpbmcg4oCUIGBzdGFnZVdyaXRlc2AgaXMgYWJzZW50IGZyb20gdGhlIHNuYXBzaG90LlxuICAgKlxuICAgKiBPYnNlcnZhYmxlIGNvbnNlcXVlbmNlcyDigJQgd2hhdCB0aGUgcG9saWN5IERPRVMgZ292ZXJuOlxuICAgKiAtIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAobWFya2VycyB1bmRlciBgJ3N1bW1hcnknYCwgYWJzZW50IHVuZGVyXG4gICAqICAgYCdvZmYnYCkuXG4gICAqIC0gVGhlIGNvbW1pdCBvYnNlcnZlciBwYXlsb2FkOiBgU2NvcGVSZWNvcmRlci5vbkNvbW1pdChtdXRhdGlvbnMpYFxuICAgKiAgIHJlY2VpdmVzIHRoZSByZXRhaW5lZCBgX3N0YWdlV3JpdGVzYCBlbnRyaWVzLCBzbyBpdCBjYXJyaWVzIHRoZSBzYW1lXG4gICAqICAgbWFya2VycyB1bmRlciBgJ3N1bW1hcnknYCBhbmQgYW4gZW1wdHkgbXV0YXRpb25zIGJhZyB1bmRlciBgJ29mZidgIOKAlFxuICAgKiAgIGRlZmVycmVkL29ic2VydmVyIGNvbnN1bWVycyBzZWUgZXhhY3RseSB3aGF0IHJldGVudGlvbiBzdG9yZWQuXG4gICAqXG4gICAqIFdoYXQgaXQgZG9lcyBOT1QgZ292ZXJuOlxuICAgKiAtIFRoZSB3cml0ZXMgdGhlbXNlbHZlczogc2hhcmVkIHN0YXRlLCB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyLCBhbmQgdGhlXG4gICAqICAgQ09NTUlUIExPRyBhcmUgaWRlbnRpY2FsIGluIGV2ZXJ5IG1vZGUgKGNvbW1pdExvZyB2YWx1ZXMga2VlcCB0aGVpclxuICAgKiAgIGZ1bGwgcGF5bG9hZHMg4oCUIHRoZSBsb3NzbGVzcyBsaW5lYXItY29zdCBmaXggZm9yIHRob3NlIGlzICMxM2MtQidzXG4gICAqICAgZGVsdGEgdmVyYiwgb3V0IG9mIHNjb3BlIGhlcmUpLlxuICAgKiAtIFBlci1vcCBgU2NvcGVSZWNvcmRlci5vbldyaXRlYCBldmVudHMg4oCUIHRoZXkgZmlyZSB3aXRoIGxpdmUgdmFsdWVzXG4gICAqICAgcmVnYXJkbGVzcyAoZGVsaXZlcnkgdGllciwgUkZDLTAwMSdzIGNvbmNlcm4pLCBzbyBuYXJyYXRpdmUgb3V0cHV0IGlzXG4gICAqICAgaWRlbnRpY2FsIGluIGV2ZXJ5IG1vZGUuXG4gICAqIC0gUmVkYWN0aW9uOiBhIHBvbGljeS9wZXItY2FsbC1yZWRhY3RlZCB3cml0ZSBzdG9yZXMgYCdbUkVEQUNURURdJ2BcbiAgICogICB1bmRlciBgJ2Z1bGwnYCBBTkQgYCdzdW1tYXJ5J2AgKHJlZGFjdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlXG4gICAqICAgZGlhbDsgYSBtYXJrZXIgd291bGQgbGVhayBzaXplL3ByZXZpZXcpLCBhbmQgbm90aGluZyB1bmRlciBgJ29mZidgLlxuICAgKlxuICAgKiBDYXZlYXQ6IHVuZGVyIGAnb2ZmJ2AgYSBzdGFnZSdzIFNOQVBTSE9UIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gb25lXG4gICAqIHRoYXQgd3JvdGUgbm90aGluZyDigJQgYnV0IHVubGlrZSBgcmVhZFRyYWNraW5nOiAnb2ZmJ2AsIHRoZSBjb21taXQgbG9nXG4gICAqIHN0aWxsIHJlY29yZHMgZXZlcnkgbmV0IGNoYW5nZSwgc28gXCJkaWQgaXQgd3JpdGU/XCIgc3RheXMgYW5zd2VyYWJsZS5cbiAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIGBleGVjdXRvci5zZXRXcml0ZVRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAgICovXG4gIHdyaXRlVHJhY2tpbmc/OiBXcml0ZVRyYWNraW5nTW9kZTtcblxuICAvLyDilIDilIAgQWR2YW5jZWQgLyBlc2NhcGUtaGF0Y2ggb3B0aW9ucyAobW9zdCBjYWxsZXJzIGRvIG5vdCBuZWVkIHRoZXNlKSDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIGNsYXNzaWZpZXIgZm9yIHRocm90dGxpbmcgZGV0ZWN0aW9uLiBSZXR1cm4gYHRydWVgIGlmIHRoZVxuICAgKiBlcnJvciByZXByZXNlbnRzIGEgcmF0ZS1saW1pdCBvciBiYWNrcHJlc3N1cmUgY29uZGl0aW9uICh0aGUgZXhlY3V0b3Igd2lsbFxuICAgKiB0cmVhdCBpdCBkaWZmZXJlbnRseSBmcm9tIGhhcmQgZmFpbHVyZXMpLiBEZWZhdWx0cyB0byBubyB0aHJvdHRsaW5nIGNsYXNzaWZpY2F0aW9uLlxuICAgKi9cbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgLyoqIEhhbmRsZXJzIGZvciBzdHJlYW1pbmcgc3RhZ2UgbGlmZWN5Y2xlIGV2ZW50cyAoc2VlIGBhZGRTdHJlYW1pbmdGdW5jdGlvbmApLiAqL1xuICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAvKiogU2NvcGUgcHJvdGVjdGlvbiBtb2RlIGZvciBUeXBlZFNjb3BlIGRpcmVjdC1hc3NpZ25tZW50IGRldGVjdGlvbi4gKi9cbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG59XG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+O1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIOKAlCBzdXJ2aXZlcyBwYXVzZS9yZXN1bWUuIFJlc2V0IG9uIGZyZXNoIHJ1bigpLiAqL1xuICBwcml2YXRlIF9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICAvKiogUGVyLWBydW4oKWAgaWRlbnRpZmllciDigJQgZ2VuZXJhdGVkIGZyZXNoIHBlciBydW4gKyBwZXIgcmVzdW1lLiBUaHJlYWRlZFxuICAgKiAgdGhyb3VnaCBldmVyeSBUcmF2ZXJzYWxDb250ZXh0IHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGVcbiAgICogIHJ1bi4gU2VlIGBydW5JZC50c2AuICovXG4gIHByaXZhdGUgX2N1cnJlbnRSdW5JZCA9ICcnO1xuICBwcml2YXRlIG5hcnJhdGl2ZUVuYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBuYXJyYXRpdmVPcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnM7XG4gIHByaXZhdGUgY29tYmluZWRSZWNvcmRlcjogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBmbG93UmVjb3JkZXJzOiBGbG93UmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHNjb3BlUmVjb3JkZXJzOiBTY29wZVJlY29yZGVyW10gPSBbXTtcbiAgLyoqXG4gICAqIFJGQy0wMDEgZGVmZXJyZWQtb2JzZXJ2ZXIgd2lyaW5nIOKAlCBjcmVhdGVkIExBWklMWSBvbiB0aGUgZmlyc3RcbiAgICogYGRlbGl2ZXJ5OiAnZGVmZXJyZWQnYCBhdHRhY2guIGB1bmRlZmluZWRgIGZvciBldmVyeSBleGVjdXRvciB0aGF0IG5ldmVyXG4gICAqIG9wdHMgaW46IHplcm8gYWxsb2NhdGlvbiwgemVybyBwZXItZXZlbnQgY29zdCwgYnl0ZS1pZGVudGljYWwgYmVoYXZpb3JcbiAgICogKHRoZSBlbWl0IGZhc3QtcGF0aCBwcmVjZWRlbnQpLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWZlcnJlZFRpZXI/OiBEZWZlcnJlZE9ic2VydmVyVGllcjtcbiAgcHJpdmF0ZSByZWRhY3Rpb25Qb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzaGFyZWRSZWRhY3RlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBwcml2YXRlIGxhc3RDaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogYHRydWVgIG9uY2UgYHJ1bigpYCAob3IgYSBwcmV2aW91cyBgcmVzdW1lKClgKSBoYXMgZXhlY3V0ZWQgb25cbiAgICogdGhpcyBpbnN0YW5jZS4gYHJlc3VtZSgpYCBicmFuY2hlcyBvbiBpdDpcbiAgICpcbiAgICogICDigKIgdHJ1ZSAg4oaSIHJldXNlIHRoZSBjb25zdHJ1Y3Rvci10aW1lIHJ1bnRpbWUgKHNhbWUtZXhlY3V0b3JcbiAgICogICAgICAgICAgICAgY29udGludWl0eTogZXhlY3V0aW9uIHRyZWUsIHJlY29yZGVycywgbmFycmF0aXZlXG4gICAqICAgICAgICAgICAgIGFjY3VtdWxhdGUgYWNyb3NzIHBhdXNlL3Jlc3VtZSBjeWNsZXMpXG4gICAqICAg4oCiIGZhbHNlIOKGkiBzZWVkIGEgZnJlc2ggcnVudGltZSBmcm9tIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYFxuICAgKiAgICAgICAgICAgICAoY3Jvc3MtZXhlY3V0b3IgLyBjcm9zcy1wcm9jZXNzIHJlc3VtZTogbmV3IGluc3RhbmNlXG4gICAqICAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJvbSBhIHNlcmlhbGl6ZWQgY2hlY2twb2ludClcbiAgICpcbiAgICogV2l0aG91dCB0aGlzIGZsYWcsIGZyZXNoIGV4ZWN1dG9ycyBzaWxlbnRseSBkaXNjYXJkZWQgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBzaGFyZWRTdGF0ZSBhbmQgcmVzdW1lIGhhbmRsZXJzIGNvdWxkbid0IHJlYWQgcHJlLXBhdXNlXG4gICAqIHNjb3BlLiBTZWUgYHRlc3QvbGliL3BhdXNlL2Nyb3NzLWV4ZWN1dG9yLXJlc3VtZS50ZXN0LnRzYC5cbiAgICovXG4gIHByaXZhdGUgX2hhc1J1bkJlZm9yZSA9IGZhbHNlO1xuICAvKipcbiAgICogUmUtZW50cmFuY3kgZ3VhcmQuIGBydW4oKWAgYW5kIGByZXN1bWUoKWAgbXV0YXRlIHBlci1ydW4gaW5zdGFuY2Ugc3RhdGVcbiAgICogKHRyYXZlcnNlciwgcnVuSWQsIGV4ZWN1dGlvbiBjb3VudGVyLCBjaGVja3BvaW50KSBhbmQgY2xlYXIgYXR0YWNoZWRcbiAgICogcmVjb3JkZXJzIOKAlCBhIHNlY29uZCBjb25jdXJyZW50IGVudHJ5IG9uIHRoZSBTQU1FIGV4ZWN1dG9yIHdvdWxkXG4gICAqIGludGVybGVhdmUgcnVuSWRzIGFuZCBjcm9zcy1jb250YW1pbmF0ZSByZWNvcmRlci9uYXJyYXRpdmUgc3RhdGUsIGFuZFxuICAgKiBgZ2V0Q2hlY2twb2ludCgpYCB3b3VsZCByZXR1cm4gd2hpY2hldmVyIHJ1biBwYXVzZWQgbGFzdC4gT25lIGV4ZWN1dG9yID1cbiAgICogb25lIGluLWZsaWdodCBleGVjdXRpb247IGNyZWF0ZSBhbiBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uXG4gICAqIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuXG4gICAqL1xuICBwcml2YXRlIF9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuXG4gIC8vIFNZTkMgUkVRVUlSRUQ6IGV2ZXJ5IG9wdGlvbmFsIGZpZWxkIGhlcmUgbXVzdCBtaXJyb3IgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zXG4gIC8vIEFORCBiZSBhc3NpZ25lZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb24gYmxvY2sgKHRoZSBgZWxzZSBpZmAgYnJhbmNoKS5cbiAgLy8gQWRkaW5nIGEgZmllbGQgdG8gb25seSBvbmUgb2YgdGhlIHRocmVlIHBsYWNlcyBjYXVzZXMgc2lsZW50IG9taXNzaW9uLlxuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dDaGFydEFyZ3M6IHtcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+O1xuICAgIHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAgIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gICAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgICByZWFkVHJhY2tpbmc/OiBSZWFkVHJhY2tpbmdNb2RlO1xuICAgIHdyaXRlVHJhY2tpbmc/OiBXcml0ZVRyYWNraW5nTW9kZTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgRmxvd0NoYXJ0RXhlY3V0b3IuXG4gICAqXG4gICAqICoqT3B0aW9ucyBvYmplY3QgZm9ybSoqIChwcmVmZXJyZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0IH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiAqKjItcGFyYW0gZm9ybSoqIChhbHNvIHN1cHBvcnRlZCk6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBzY29wZUZhY3RvcnkpXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZmxvd0NoYXJ0IC0gVGhlIGNvbXBpbGVkIEZsb3dDaGFydCByZXR1cm5lZCBieSBgZmxvd0NoYXJ0KC4uLikuYnVpbGQoKWBcbiAgICogQHBhcmFtIGZhY3RvcnlPck9wdGlvbnMgLSBBIGBTY29wZUZhY3Rvcnk8VFNjb3BlPmAgT1IgYSBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT5gIG9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZmxvd0NoYXJ0OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBmYWN0b3J5T3JPcHRpb25zPzogU2NvcGVGYWN0b3J5PFRTY29wZT4gfCBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPixcbiAgKSB7XG4gICAgLy8gRGV0ZWN0IG9wdGlvbnMtb2JqZWN0IGZvcm0gdnMgZmFjdG9yeSBmb3JtXG4gICAgbGV0IHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCBpbml0aWFsQ29udGV4dDogdW5rbm93bjtcbiAgICBsZXQgcmVhZE9ubHlDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiAoKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtSGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzY29wZVByb3RlY3Rpb25Nb2RlOiBTY29wZVByb3RlY3Rpb25Nb2RlIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWFkVHJhY2tpbmc6IFJlYWRUcmFja2luZ01vZGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHdyaXRlVHJhY2tpbmc6IFdyaXRlVHJhY2tpbmdNb2RlIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBmYWN0b3J5T3JPcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyAyLXBhcmFtIGZvcm06IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgc2NvcGVGYWN0b3J5KVxuICAgICAgc2NvcGVGYWN0b3J5ID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKGZhY3RvcnlPck9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT3B0aW9ucyBvYmplY3QgZm9ybVxuICAgICAgY29uc3Qgb3B0cyA9IGZhY3RvcnlPck9wdGlvbnM7XG4gICAgICBzY29wZUZhY3RvcnkgPSBvcHRzLnNjb3BlRmFjdG9yeTtcbiAgICAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0ID0gb3B0cy5kZWZhdWx0VmFsdWVzRm9yQ29udGV4dDtcbiAgICAgIGluaXRpYWxDb250ZXh0ID0gb3B0cy5pbml0aWFsQ29udGV4dDtcbiAgICAgIHJlYWRPbmx5Q29udGV4dCA9IG9wdHMucmVhZE9ubHlDb250ZXh0O1xuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlciA9IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjtcbiAgICAgIHN0cmVhbUhhbmRsZXJzID0gb3B0cy5zdHJlYW1IYW5kbGVycztcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGUgPSBvcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gICAgICByZWFkVHJhY2tpbmcgPSBvcHRzLnJlYWRUcmFja2luZztcbiAgICAgIHdyaXRlVHJhY2tpbmcgPSBvcHRzLndyaXRlVHJhY2tpbmc7XG4gICAgfVxuICAgIHRoaXMuZmxvd0NoYXJ0QXJncyA9IHtcbiAgICAgIGZsb3dDaGFydCxcbiAgICAgIHNjb3BlRmFjdG9yeTogc2NvcGVGYWN0b3J5ID8/IGZsb3dDaGFydC5zY29wZUZhY3RvcnkgPz8gKGRlZmF1bHRTY29wZUZhY3RvcnkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICBpbml0aWFsQ29udGV4dCxcbiAgICAgIHJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICByZWFkVHJhY2tpbmcsXG4gICAgICB3cml0ZVRyYWNraW5nLFxuICAgIH07XG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUcmF2ZXJzZXIoXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGU/OiB1bmtub3duLFxuICAgIGVudj86IGltcG9ydCgnLi4vZW5naW5lL3R5cGVzJykuRXhlY3V0aW9uRW52LFxuICAgIG1heERlcHRoPzogbnVtYmVyLFxuICAgIG1heEl0ZXJhdGlvbnM/OiBudW1iZXIsXG4gICAgb3ZlcnJpZGVzPzoge1xuICAgICAgcm9vdD86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgICAgcHJlc2VydmVSZWNvcmRlcnM/OiBib29sZWFuO1xuICAgICAgZXhpc3RpbmdSdW50aW1lPzogSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPjtcbiAgICAgIC8qKiBQZXItc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBmcm9tIGEgY2hlY2twb2ludCDigJQgcGFzc2VkIHRocm91Z2hcbiAgICAgICAqICB0byBIYW5kbGVyRGVwcyBzbyBTdWJmbG93RXhlY3V0b3IgY2FuIHJlLXNlZWQgbmVzdGVkIHJ1bnRpbWVzXG4gICAgICAgKiAgb24gdGhlIHJlc3VtZSBwYXRoLiBVbmRlZmluZWQgb24gbm9ybWFsIHJ1bigpIHBhdGhzLiAqL1xuICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZT86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgICAgIC8qKiBSZXN1bWUtb25seSBvdmVycmlkZSBvZiB0aGUgc3ViZmxvd3MgZGljdCDigJQgc3Vic3RpdHV0ZXMgdGhlXG4gICAgICAgKiAgbGVhZiBzdWJmbG93J3Mgcm9vdCB3aXRoIGEgcmVzdW1lIGNoYWluIHNvIHRoZSBzdWJmbG93IGJvZHlcbiAgICAgICAqICBwaWNrcyB1cCBhdCB0aGUgcGF1c2UgcG9pbnQuIE90aGVyIGVudHJpZXMgcGFzcyB0aHJvdWdoXG4gICAgICAgKiAgdW5jaGFuZ2VkLiAqL1xuICAgICAgc3ViZmxvd3NPdmVycmlkZT86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT47XG4gICAgfSxcbiAgKTogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmZsb3dDaGFydEFyZ3M7XG4gICAgY29uc3QgZmMgPSBhcmdzLmZsb3dDaGFydDtcbiAgICBjb25zdCBuYXJyYXRpdmVGbGFnID0gdGhpcy5uYXJyYXRpdmVFbmFibGVkIHx8IChmYy5lbmFibGVOYXJyYXRpdmUgPz8gZmFsc2UpO1xuXG4gICAgLy8g4pSA4pSAIENvbXBvc2VkIHNjb3BlIGZhY3Rvcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gQ29sbGVjdCBhbGwgc2NvcGUgbW9kaWZpZXJzIChyZWNvcmRlcnMsIHJlZGFjdGlvbikgaW50byBhIHNpbmdsZSBsaXN0LFxuICAgIC8vIHRoZW4gY3JlYXRlIE9ORSBmYWN0b3J5IHRoYXQgYXBwbGllcyB0aGVtIGluIGEgbG9vcC4gUmVwbGFjZXMgdGhlXG4gICAgLy8gcHJldmlvdXMgNC1kZWVwIGNsb3N1cmUgbmVzdGluZyB3aXRoIGEgZmxhdCwgZGVidWdnYWJsZSBjb21wb3NpdGlvbi5cblxuICAgIGlmIChvdmVycmlkZXM/LnByZXNlcnZlUmVjb3JkZXJzKSB7XG4gICAgICAvLyBSZXN1bWUgbW9kZToga2VlcCBleGlzdGluZyBjb21iaW5lZFJlY29yZGVyIHNvIG5hcnJhdGl2ZSBhY2N1bXVsYXRlc1xuICAgIH0gZWxzZSBpZiAobmFycmF0aXZlRmxhZykge1xuICAgICAgdGhpcy5jb21iaW5lZFJlY29yZGVyID0gbmV3IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIodGhpcy5uYXJyYXRpdmVPcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21iaW5lZFJlY29yZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXG4gICAgLy8gQnVpbGQgbW9kaWZpZXIgbGlzdCDigJQgZWFjaCBtb2RpZmllciByZWNlaXZlcyB0aGUgc2NvcGUgYWZ0ZXIgY3JlYXRpb25cbiAgICB0eXBlIFNjb3BlTW9kaWZpZXIgPSAoc2NvcGU6IGFueSkgPT4gdm9pZDtcbiAgICBjb25zdCBtb2RpZmllcnM6IFNjb3BlTW9kaWZpZXJbXSA9IFtdO1xuXG4gICAgLy8gMS4gTmFycmF0aXZlIHJlY29yZGVyIChpZiBlbmFibGVkKVxuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5jb21iaW5lZFJlY29yZGVyO1xuICAgICAgbW9kaWZpZXJzLnB1c2goKHNjb3BlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlciA9PT0gJ2Z1bmN0aW9uJykgc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAyLiBVc2VyLXByb3ZpZGVkIHNjb3BlIHJlY29yZGVyc1xuICAgIGlmICh0aGlzLnNjb3BlUmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnM7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByIG9mIHJlY29yZGVycykgc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlcihyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMmIuIERlZmVycmVkLW9ic2VydmVyIHNjb3BlIHRhcCAoUkZDLTAwMSBCbG9jayA3KSDigJQgYSBzeW50aGV0aWNcbiAgICAvLyByZWNvcmRlciB3aG9zZSBob29rcyBDQVBUVVJFIGludG8gdGhlIGJvdW5kZWQgcXVldWUgaW5zdGVhZCBvZiBkb2luZ1xuICAgIC8vIG9ic2VydmVyIHdvcmsuIEl0IHJpZGVzIHRoZSBzYW1lIHBlci1zdGFnZSByZWNvcmRlciBsaXN0IGFzIGlubGluZVxuICAgIC8vIHJlY29yZGVycywgc28gaXQgcmVjZWl2ZXMgZXhhY3RseSB0aGUgcG9zdC1yZWRhY3Rpb24gZXZlbnRzIHRoZXkgZG8uXG4gICAgLy8gQWJzZW50ICh6ZXJvIHdvcmssIGlkZW50aWNhbCBsaXN0KSB3aGVuIG5vYm9keSBvcHRlZCBpbnRvIGRlZmVycmFsLlxuICAgIGNvbnN0IHNjb3BlVGFwID0gdGhpcy5kZWZlcnJlZFRpZXI/LmJ1aWxkU2NvcGVUYXAoKTtcbiAgICBpZiAoc2NvcGVUYXApIHtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmF0dGFjaFNjb3BlUmVjb3JkZXIgPT09ICdmdW5jdGlvbicpIHNjb3BlLmF0dGFjaFNjb3BlUmVjb3JkZXIoc2NvcGVUYXApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMy4gUmVkYWN0aW9uIHBvbGljeSAoY29uZGl0aW9uYWwg4oCUIG9ubHkgd2hlbiBwb2xpY3kgaXMgc2V0KVxuICAgIGlmICh0aGlzLnJlZGFjdGlvblBvbGljeSkge1xuICAgICAgY29uc3QgcG9saWN5ID0gdGhpcy5yZWRhY3Rpb25Qb2xpY3k7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS51c2VSZWRhY3Rpb25Qb2xpY3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzY29wZS51c2VSZWRhY3Rpb25Qb2xpY3kocG9saWN5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBQcmUtcG9wdWxhdGUgZXhlY3V0b3ItbGV2ZWwgZmllbGQgcmVkYWN0aW9uIG1hcCBmcm9tIHBvbGljeVxuICAgICAgLy8gc28gZ2V0UmVkYWN0aW9uUmVwb3J0KCkgaW5jbHVkZXMgZmllbGQtbGV2ZWwgcmVkYWN0aW9ucy5cbiAgICAgIGlmIChwb2xpY3kuZmllbGRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyhwb2xpY3kuZmllbGRzKSkge1xuICAgICAgICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleS5zZXQoa2V5LCBuZXcgU2V0KGZpZWxkcykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tcG9zZTogYmFzZSBmYWN0b3J5ICsgbW9kaWZpZXJzIGluIGEgc2luZ2xlIHBhc3MuXG4gICAgLy8gU2hhcmVkIHJlZGFjdGVkIGtleXMgYXJlIEFMV0FZUyB3aXJlZCB1cCAodW5jb25kaXRpb25hbCDigJQgZW5zdXJlcyBjcm9zcy1zdGFnZVxuICAgIC8vIHByb3BhZ2F0aW9uIGV2ZW4gd2l0aG91dCBhIHBvbGljeSwgYmVjYXVzZSBzdGFnZXMgY2FuIGNhbGwgc2V0VmFsdWUoa2V5LCB2YWwsIHRydWUpXG4gICAgLy8gZm9yIHBlci1jYWxsIHJlZGFjdGlvbikuIE9wdGlvbmFsIG1vZGlmaWVycyAocmVjb3JkZXJzLCBwb2xpY3kpIGFyZSBpbiB0aGUgbGlzdC5cbiAgICBjb25zdCBiYXNlRmFjdG9yeSA9IGFyZ3Muc2NvcGVGYWN0b3J5O1xuICAgIGNvbnN0IHNoYXJlZFJlZGFjdGVkS2V5cyA9IHRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzO1xuICAgIGNvbnN0IHNjb3BlRmFjdG9yeSA9ICgoY3R4OiBhbnksIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seT86IHVua25vd24sIGVudkFyZz86IGFueSkgPT4ge1xuICAgICAgY29uc3Qgc2NvcGUgPSBiYXNlRmFjdG9yeShjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudkFyZyk7XG4gICAgICAvLyBBbHdheXMgd2lyZSBzaGFyZWQgcmVkYWN0aW9uIHN0YXRlXG4gICAgICBpZiAodHlwZW9mIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAoc2NvcGUgYXMgYW55KS51c2VTaGFyZWRSZWRhY3RlZEtleXMoc2hhcmVkUmVkYWN0ZWRLZXlzKTtcbiAgICAgIH1cbiAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIG1vZGlmaWVyc1xuICAgICAgZm9yIChjb25zdCBtb2Qgb2YgbW9kaWZpZXJzKSBtb2Qoc2NvcGUpO1xuICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH0pIGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuXG4gICAgY29uc3QgZWZmZWN0aXZlUm9vdCA9IG92ZXJyaWRlcz8ucm9vdCA/PyBmYy5yb290O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0ID0gb3ZlcnJpZGVzPy5pbml0aWFsQ29udGV4dCA/PyBhcmdzLmluaXRpYWxDb250ZXh0O1xuXG4gICAgbGV0IHJ1bnRpbWU6IEV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgaWYgKG92ZXJyaWRlcz8uZXhpc3RpbmdSdW50aW1lKSB7XG4gICAgICAvLyBSZXN1bWUgbW9kZTogcmV1c2UgZXhpc3RpbmcgcnVudGltZSBzbyBleGVjdXRpb24gdHJlZSBjb250aW51ZXMgZnJvbSBwYXVzZSBwb2ludC5cbiAgICAgIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCByb290IGZvciBnZXRTbmFwc2hvdCgpIChmdWxsIHRyZWUpLCB0aGVuIGFkdmFuY2VcbiAgICAgIC8vIHJvb3RTdGFnZUNvbnRleHQgdG8gYSBjb250aW51YXRpb24gZnJvbSB0aGUgbGVhZiAoZm9yIHRyYXZlcnNhbCkuXG4gICAgICBydW50aW1lID0gb3ZlcnJpZGVzLmV4aXN0aW5nUnVudGltZTtcbiAgICAgIHJ1bnRpbWUucHJlc2VydmVTbmFwc2hvdFJvb3QoKTtcbiAgICAgIGxldCBsZWFmID0gcnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuICAgICAgd2hpbGUgKGxlYWYubmV4dCkgbGVhZiA9IGxlYWYubmV4dDtcbiAgICAgIHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IGxlYWYuY3JlYXRlTmV4dCgnJywgZWZmZWN0aXZlUm9vdC5uYW1lLCBlZmZlY3RpdmVSb290LmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lKFxuICAgICAgICBlZmZlY3RpdmVSb290Lm5hbWUsXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QuaWQsXG4gICAgICAgIGFyZ3MuZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICAgIGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIGEgcmVkYWN0aW9uIHBvbGljeSBpcyBjb25maWd1cmVkLCBtYWludGFpbiBhIHBhcmFsbGVsIHJlZGFjdGVkXG4gICAgLy8gbWlycm9yIG9mIGBnbG9iYWxTdG9yZWAgZHVyaW5nIHRyYXZlcnNhbC4gRWFjaCBjb21taXQgYXBwbGllcyB0aGVcbiAgICAvLyBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMg4oCUIHNhbWUgb25lcyBmZWQgdG8gdGhlIGV2ZW50IGxvZyDigJRcbiAgICAvLyBzbyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIHJldHVybnMgYSBzY3J1YmJlZCBzaGFyZWRTdGF0ZSBhdFxuICAgIC8vIHplcm8gcG9zdC1wYXNzIGNvc3QuIFNraXBwZWQgd2hlbiBubyBwb2xpY3kgZXhpc3RzICh6ZXJvIGFsbG9jYXRpb24pLlxuICAgIGlmICh0aGlzLnJlZGFjdGlvblBvbGljeSkge1xuICAgICAgcnVudGltZS5lbmFibGVSZWRhY3RlZE1pcnJvcigpO1xuICAgIH1cblxuICAgIC8vIFJlYWQtdHJhY2tpbmcgcG9saWN5ICgjMTQpOiBzZXQgb24gdGhlIHJ1bnRpbWUncyByb290IGNvbnRleHQgc28gZXZlcnlcbiAgICAvLyBkZXNjZW5kYW50IGNvbnRleHQgKGNyZWF0ZU5leHQvY3JlYXRlQ2hpbGQpIGFuZCBzdWJmbG93IHJvb3QgaW5oZXJpdHMuXG4gICAgLy8gQXBwbGllZCBBRlRFUiB0aGUgcmVzdW1lLXBhdGggcm9vdCBzd2FwIGFib3ZlIHNvIHRoZSBjb250aW51YXRpb24gcm9vdFxuICAgIC8vIGNhcnJpZXMgdGhlIHBvbGljeSB0b28uIFNraXBwZWQgZm9yIHRoZSBkZWZhdWx0ICdmdWxsJyDigJQgemVybyB3b3JrLlxuICAgIGNvbnN0IHJlYWRUcmFja2luZyA9IGFyZ3MucmVhZFRyYWNraW5nO1xuICAgIGlmIChyZWFkVHJhY2tpbmcgIT09IHVuZGVmaW5lZCAmJiByZWFkVHJhY2tpbmcgIT09ICdmdWxsJykge1xuICAgICAgcnVudGltZS51c2VSZWFkVHJhY2tpbmcocmVhZFRyYWNraW5nKTtcbiAgICB9XG5cbiAgICAvLyBXcml0ZS10cmFja2luZyBwb2xpY3kgKCMxM2MtQSk6IGlkZW50aWNhbCBwbHVtYmluZyB0byByZWFkVHJhY2tpbmcg4oCUXG4gICAgLy8gc2FtZSByb290LWNvbnRleHQgYW5jaG9yLCBzYW1lIGluaGVyaXRhbmNlLCBzYW1lIHJlc3VtZS1wYXRoIG9yZGVyaW5nLlxuICAgIGNvbnN0IHdyaXRlVHJhY2tpbmcgPSBhcmdzLndyaXRlVHJhY2tpbmc7XG4gICAgaWYgKHdyaXRlVHJhY2tpbmcgIT09IHVuZGVmaW5lZCAmJiB3cml0ZVRyYWNraW5nICE9PSAnZnVsbCcpIHtcbiAgICAgIHJ1bnRpbWUudXNlV3JpdGVUcmFja2luZyh3cml0ZVRyYWNraW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgIHJvb3Q6IGVmZmVjdGl2ZVJvb3QsXG4gICAgICBzdGFnZU1hcDogZmMuc3RhZ2VNYXAsXG4gICAgICBzY29wZUZhY3RvcnksXG4gICAgICBleGVjdXRpb25SdW50aW1lOiBydW50aW1lLFxuICAgICAgcmVhZE9ubHlDb250ZXh0OiByZWFkT25seUNvbnRleHRPdmVycmlkZSA/PyBhcmdzLnJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IGFyZ3MudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBhcmdzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogYXJncy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgc3ViZmxvd3M6IGZjLnN1YmZsb3dzLFxuICAgICAgbmFycmF0aXZlRW5hYmxlZDogbmFycmF0aXZlRmxhZyxcbiAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogZmMuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgbG9nZ2VyOiBmYy5sb2dnZXIgPz8gZGVmYXVsdExvZ2dlcixcbiAgICAgIHNpZ25hbCxcbiAgICAgIGV4ZWN1dGlvbkVudjogZW52LFxuICAgICAgZmxvd1JlY29yZGVyczogdGhpcy5idWlsZEZsb3dSZWNvcmRlcnNMaXN0KCksXG4gICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLFxuICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgIC4uLihvdmVycmlkZXM/LnN1YmZsb3dzT3ZlcnJpZGUgJiYgeyBzdWJmbG93czogb3ZlcnJpZGVzLnN1YmZsb3dzT3ZlcnJpZGUgfSksXG4gICAgICAuLi4ob3ZlcnJpZGVzPy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lICYmIHtcbiAgICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZTogb3ZlcnJpZGVzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUsXG4gICAgICB9KSxcbiAgICAgIC4uLihtYXhEZXB0aCAhPT0gdW5kZWZpbmVkICYmIHsgbWF4RGVwdGggfSksXG4gICAgICAuLi4obWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4SXRlcmF0aW9ucyB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZU5hcnJhdGl2ZShvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgPSB0cnVlO1xuICAgIGlmIChvcHRpb25zKSB0aGlzLm5hcnJhdGl2ZU9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kgdGhhdCBhcHBsaWVzIHRvIGFsbCBzdGFnZXMuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICovXG4gIHNldFJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0aW9uUG9saWN5ID0gcG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcmVhZC10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgICgjMTQpLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuIEVxdWl2YWxlbnQgdG8gdGhlIGByZWFkVHJhY2tpbmdgXG4gICAqIGNvbnN0cnVjdG9yIG9wdGlvbiDigJQgc2VlIHtAbGluayBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMucmVhZFRyYWNraW5nfVxuICAgKiBmb3IgdGhlIG1vZGUgc2VtYW50aWNzICgnZnVsbCcgZGVmYXVsdCAvICdzdW1tYXJ5JyAvICdvZmYnKS5cbiAgICovXG4gIHNldFJlYWRUcmFja2luZyhtb2RlOiBSZWFkVHJhY2tpbmdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzLnJlYWRUcmFja2luZyA9IG1vZGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB3cml0ZS10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoIzEzYy1BKS5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLiBFcXVpdmFsZW50IHRvIHRoZSBgd3JpdGVUcmFja2luZ2BcbiAgICogY29uc3RydWN0b3Igb3B0aW9uIOKAlCBzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy53cml0ZVRyYWNraW5nfVxuICAgKiBmb3IgdGhlIG1vZGUgc2VtYW50aWNzICgnZnVsbCcgZGVmYXVsdCAvICdzdW1tYXJ5JyAvICdvZmYnKSwgdGhlXG4gICAqIG9uQ29tbWl0LXBheWxvYWQgY29uc2VxdWVuY2UsIGFuZCB0aGUgcmVkYWN0aW9uLXByZWNlZGVuY2UgcnVsZS5cbiAgICovXG4gIHNldFdyaXRlVHJhY2tpbmcobW9kZTogV3JpdGVUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3Mud3JpdGVUcmFja2luZyA9IG1vZGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkgZnJvbSB0aGVcbiAgICogbW9zdCByZWNlbnQgcnVuLiBOZXZlciBpbmNsdWRlcyBhY3R1YWwgdmFsdWVzLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgY29uc3QgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5KSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnNba2V5XSA9IFsuLi5maWVsZHNdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVkYWN0ZWRLZXlzOiBbLi4udGhpcy5zaGFyZWRSZWRhY3RlZEtleXNdLFxuICAgICAgZmllbGRSZWRhY3Rpb25zLFxuICAgICAgcGF0dGVybnM6ICh0aGlzLnJlZGFjdGlvblBvbGljeT8ucGF0dGVybnMgPz8gW10pLm1hcCgocCkgPT4gcC5zb3VyY2UpLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIAgUGF1c2UvUmVzdW1lIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjaGVja3BvaW50IGZyb20gdGhlIG1vc3QgcmVjZW50IHBhdXNlZCBleGVjdXRpb24sIG9yIGB1bmRlZmluZWRgXG4gICAqIGlmIHRoZSBsYXN0IHJ1biBjb21wbGV0ZWQgd2l0aG91dCBwYXVzaW5nLlxuICAgKlxuICAgKiBUaGUgY2hlY2twb2ludCBpcyBKU09OLXNlcmlhbGl6YWJsZSDigJQgc3RvcmUgaXQgaW4gUmVkaXMsIFBvc3RncmVzLCBsb2NhbFN0b3JhZ2UsIGV0Yy5cbiAgICpcbiAgICogSXQgaXMgZnVsbHkgREVUQUNIRUQgZnJvbSBlbmdpbmUgc3RhdGU6IGV2ZXJ5IGZpZWxkIHdhcyBkZWVwLWNvcGllZCBhdFxuICAgKiBwYXVzZSB0aW1lIChzZWUgYGJ1aWxkUGF1c2VDaGVja3BvaW50YCkuIEhvbGRpbmcsIG11dGF0aW5nLCBvciBwZXJzaXN0aW5nXG4gICAqIGl0IGNhbm5vdCBhZmZlY3QgdGhlIGV4ZWN1dG9yLCBhbmQgYSBsYXRlciBzYW1lLWV4ZWN1dG9yIHJlc3VtZSBjYW5ub3RcbiAgICogbXV0YXRlIGEgY2hlY2twb2ludCB5b3UgYWxyZWFkeSBzdG9yZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gICAqIGlmIChleGVjdXRvci5pc1BhdXNlZCgpKSB7XG4gICAqICAgY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKSE7XG4gICAqICAgYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2hlY2twb2ludCgpOiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hlY2twb2ludDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9zdCByZWNlbnQgcnVuKCkgd2FzIHBhdXNlZCAoY2hlY2twb2ludCBhdmFpbGFibGUpLiAqL1xuICBpc1BhdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hlY2twb2ludCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBjb21taXRzIGluIHRoZSBydW4ncyBjb21taXQgbG9nLiBPKDEpIOKAlCBkaXJlY3QgbGVuZ3RoXG4gICAqIHJlYWQsIG5vIHNuYXBzaG90IG1hdGVyaWFsaXphdGlvbi4gVXNlIHRoaXMgdG8gc3RhbXAgY29tbWl0XG4gICAqIGluZGljZXMgb24gb2JzZXJ2ZXIgZXZlbnRzIChlLmcuLCBgQm91bmRhcnlSZWNvcmRlcmAgc3RvcmluZ1xuICAgKiBgY29tbWl0SWR4QmVmb3JlYCAvIGBjb21taXRJZHhBZnRlcmAgcGVyIGRvbWFpbiBldmVudCBmb3JcbiAgICogYENvbW1pdFJhbmdlSW5kZXhgIHF1ZXJpZXMg4oCUIHNlZSBgZm9vdHByaW50anMvdHJhY2VgKS5cbiAgICpcbiAgICogUmV0dXJucyAwIGJlZm9yZSBhbnkgcnVuOyBhZnRlciwgcmV0dXJucyB0aGUgY3VtdWxhdGl2ZSBjb21taXRcbiAgICogY291bnQgYWNyb3NzIHRoZSBleGVjdXRvcidzIGxpZmV0aW1lIChpbmNsdWRpbmcgcmVzdW1lcykuXG4gICAqXG4gICAqIElNUExFTUVOVEFUSU9OIE5PVEU6IHRoaXMgcmV0dXJucyBgcnVudGltZS5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aGAsXG4gICAqIHdoaWNoIGlzIHRoZSBzYW1lIHZhbHVlIGFzIGBnZXRTbmFwc2hvdCgpLmNvbW1pdExvZy5sZW5ndGhgLiBUaGVcbiAgICogbmFtaW5nIGFzeW1tZXRyeSBpcyBoaXN0b3JpY2FsIOKAlCB0aGUgdW5kZXJseWluZyBgRXZlbnRMb2dgIGZpZWxkXG4gICAqIGlzIG5hbWVkIGBleGVjdXRpb25IaXN0b3J5YCBidXQgc3RvcmVzIHRoZSBgQ29tbWl0QnVuZGxlW11gIHRoYXRcbiAgICogYGNvbW1pdExvZ2AgZXhwb3Nlcy4gVGhleSBhcmUgdGhlIFNBTUUgYXJyYXkgKHZlcmlmaWVkIGJ5IHRoZVxuICAgKiBcIm1hdGNoZXMgY29tbWl0TG9nLmxlbmd0aFwiIGludGVncmF0aW9uIHRlc3QpLlxuICAgKi9cbiAgZ2V0Q29tbWl0Q291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBydW50aW1lID0gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT4gfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJ1bnRpbWU/LmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIGEgcGF1c2VkIGZsb3djaGFydCBmcm9tIGEgY2hlY2twb2ludC5cbiAgICpcbiAgICogUmVzdG9yZXMgdGhlIHNjb3BlIHN0YXRlLCBjYWxscyB0aGUgcGF1c2VkIHN0YWdlJ3MgYHJlc3VtZUZuYCB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBpbnB1dCwgdGhlbiBjb250aW51ZXMgdHJhdmVyc2FsIGZyb20gdGhlIG5leHQgc3RhZ2UuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGNhbiBjb21lIGZyb20gYGdldENoZWNrcG9pbnQoKWAgb24gYSBwcmV2aW91cyBydW4sIG9yIGZyb21cbiAgICogYSBzZXJpYWxpemVkIGNoZWNrcG9pbnQgc3RvcmVkIGluIFJlZGlzL1Bvc3RncmVzL2xvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogKipOYXJyYXRpdmUvcmVjb3JkZXIgc3RhdGUgaXMgcmVzZXQgb24gcmVzdW1lLioqIFRvIGtlZXAgYSB1bmlmaWVkIG5hcnJhdGl2ZVxuICAgKiBhY3Jvc3MgcGF1c2UvcmVzdW1lIGN5Y2xlcywgY29sbGVjdCBpdCBiZWZvcmUgY2FsbGluZyByZXN1bWUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gUHJvY2VzcyBBIOKAlCBhZnRlciBhIHBhdXNlLCBwZXJzaXN0IHRoZSBjaGVja3BvaW50OlxuICAgKiBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKlxuICAgKiAvLyBQcm9jZXNzIEIgKHBvc3NpYmx5IGRpZmZlcmVudCBzZXJ2ZXIsIHNhbWUgY2hhcnQpIOKAlCByZXN0b3JlIGFuZCByZXN1bWU6XG4gICAqIGNvbnN0IHJlc3RvcmVkID0gSlNPTi5wYXJzZShhd2FpdCByZWRpcy5nZXQoYHNlc3Npb246JHtpZH1gKSk7XG4gICAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucmVzdW1lKHJlc3RvcmVkLCB7IGFwcHJvdmVkOiB0cnVlIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3VtZShcbiAgICBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICAgIHJlc3VtZUlucHV0PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUGljazxSdW5PcHRpb25zLCAnc2lnbmFsJyB8ICdlbnYnIHwgJ21heERlcHRoJyB8ICdtYXhJdGVyYXRpb25zJz4sXG4gICk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICAvLyBSZS1lbnRyYW5jeSBndWFyZCBGSVJTVCDigJQgcmVzdW1lKCkgbXV0YXRlcyB0aGUgc2FtZSBwZXItcnVuIHN0YXRlIHJ1bigpXG4gICAgLy8gZG9lcyAodHJhdmVyc2VyLCBydW5JZCwgY2hlY2twb2ludCksIHNvIHJlc3VtZS1kdXJpbmctcnVuIGFuZFxuICAgIC8vIGRvdWJsZS1yZXN1bWUgYXJlIHRoZSBzYW1lIGNvcnJ1cHRpb24gY2xhc3MgYXMgY29uY3VycmVudCBydW4oKS5cbiAgICBpZiAodGhpcy5faXNFeGVjdXRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Zsb3dDaGFydEV4ZWN1dG9yOiByZXN1bWUoKSBjYWxsZWQgd2hpbGUgYW5vdGhlciBydW4oKS9yZXN1bWUoKSBpcyBpbiBmbGlnaHQgb24gdGhpcyAnICtcbiAgICAgICAgICAnZXhlY3V0b3IuIEFuIGV4ZWN1dG9yIGhvbGRzIHBlci1ydW4gc3RhdGUgKHJ1bklkLCByZWNvcmRlcnMsIGNoZWNrcG9pbnQpIOKAlCBjcmVhdGUgJyArXG4gICAgICAgICAgJ29uZSBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIOKUgOKUgCBWYWxpZGF0ZSBjaGVja3BvaW50IHN0cnVjdHVyZSAobWF5IGNvbWUgZnJvbSB1bnRydXN0ZWQgZXh0ZXJuYWwgc3RvcmFnZSkg4pSA4pSAXG4gICAgLy8gKGxhc3RDaGVja3BvaW50IGlzIHdpcGVkIEFGVEVSIHZhbGlkYXRpb24g4oCUIGEgcmVqZWN0ZWQgY2hlY2twb2ludCBtdXN0XG4gICAgLy8gbm90IGRlc3Ryb3kgdGhlIGV4ZWN1dG9yJ3MgZXhpc3RpbmcgY2hlY2twb2ludCBzdGF0ZS4pXG4gICAgaWYgKFxuICAgICAgIWNoZWNrcG9pbnQgfHxcbiAgICAgIHR5cGVvZiBjaGVja3BvaW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgdHlwZW9mIGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUgIT09ICdvYmplY3QnIHx8XG4gICAgICBjaGVja3BvaW50LnNoYXJlZFN0YXRlID09PSBudWxsIHx8XG4gICAgICBBcnJheS5pc0FycmF5KGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogc2hhcmVkU3RhdGUgbXVzdCBiZSBhIHBsYWluIG9iamVjdC4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQgIT09ICdzdHJpbmcnIHx8IGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBwYXVzZWRTdGFnZUlkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhQXJyYXkuaXNBcnJheShjaGVja3BvaW50LnN1YmZsb3dQYXRoKSB8fFxuICAgICAgIWNoZWNrcG9pbnQuc3ViZmxvd1BhdGguZXZlcnkoKHM6IHVua25vd24pID0+IHR5cGVvZiBzID09PSAnc3RyaW5nJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBzdWJmbG93UGF0aCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MuJyk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgcGF1c2VkIG5vZGUgaW4gdGhlIGdyYXBoXG4gICAgY29uc3QgcGF1c2VkTm9kZSA9IHRoaXMuZmluZE5vZGVJbkdyYXBoKGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCwgY2hlY2twb2ludC5zdWJmbG93UGF0aCk7XG4gICAgaWYgKCFwYXVzZWROb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdGFnZSAnJHtjaGVja3BvaW50LnBhdXNlZFN0YWdlSWR9JyBub3QgZm91bmQgaW4gZmxvd2NoYXJ0LiBgICtcbiAgICAgICAgICAnVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcGF1c2VkTm9kZS5yZXN1bWVGbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pIGhhcyBubyByZXN1bWVGbi4gYCArXG4gICAgICAgICAgJ09ubHkgc3RhZ2VzIGNyZWF0ZWQgd2l0aCBhZGRQYXVzYWJsZUZ1bmN0aW9uKCkgY2FuIGJlIHJlc3VtZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBCdWlsZCBhIHN5bnRoZXRpYyByZXN1bWUgbm9kZTogY2FsbHMgcmVzdW1lRm4gd2l0aCByZXN1bWVJbnB1dCwgdGhlbiBjb250aW51ZXMuXG4gICAgLy8gcmVzdW1lRm4gc2lnbmF0dXJlIGlzIChzY29wZSwgaW5wdXQpIHBlciBQYXVzYWJsZUhhbmRsZXIg4oCUIHdyYXAgdG8gbWF0Y2ggU3RhZ2VGdW5jdGlvbihzY29wZSwgYnJlYWtGbikuXG4gICAgY29uc3QgcmVzdW1lRm4gPSBwYXVzZWROb2RlLnJlc3VtZUZuO1xuICAgIGNvbnN0IHJlc3VtZVN0YWdlRm4gPSAoc2NvcGU6IFRTY29wZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VtZUZuKHNjb3BlLCByZXN1bWVJbnB1dCk7XG4gICAgfTtcblxuICAgIC8vIERldGVybWluZSBjb250aW51YXRpb246IGZvciBicmFuY2ggY2hpbGRyZW4gKGRlY2lkZXIvc2VsZWN0b3IpLFxuICAgIC8vIHBhdXNlZE5vZGUubmV4dCBpcyB1bmRlZmluZWQuIFRoZSBjaGVja3BvaW50J3NcbiAgICAvLyBjb250aW51YXRpb25TdGFnZUlkIChjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbCBidWJibGUtdXApXG4gICAgLy8gcG9pbnRzIHRvIHRoZSBpbnZva2VyJ3MgbmV4dCBub2RlLlxuICAgIC8vXG4gICAgLy8gRm9yIHBhdXNlcyBpbnNpZGUgYSBzdWJmbG93LCB0aGUgY29udGludWF0aW9uIGxpdmVzIElOU0lERSB0aGVcbiAgICAvLyBsZWFmIHN1YmZsb3cgKGUuZy4sIHRoZSBsb29wIHRhcmdldCBiYWNrIHRvIGBtZXNzYWdlc2ApLiBTZWFyY2hcbiAgICAvLyB0aGUgbGVhZiBzdWJmbG93IGZpcnN0OyBmYWxsIGJhY2sgdG8gdG9wLWxldmVsIGZvciByb290LWxldmVsXG4gICAgLy8gcGF1c2VzLlxuICAgIC8vIENsb25lLWluOiBgc3ViZmxvd1N0YXRlc2Agc2VlZHMgbmVzdGVkIHJ1bnRpbWVzIGluIFN1YmZsb3dFeGVjdXRvclxuICAgIC8vIChzaGFsbG93LW1lcmdlZCBpbnRvIGVhY2ggbmVzdGVkIFNoYXJlZE1lbW9yeSksIHNvIHdpdGhvdXQgYSBjb3B5IHRoZVxuICAgIC8vIGVuZ2luZSB3b3VsZCBob2xkIGxpdmUgcmVmZXJlbmNlcyBpbnRvIHRoZSBjYWxsZXIncyBjaGVja3BvaW50IG9iamVjdCDigJRcbiAgICAvLyBjYWxsZXIgbXV0YXRpb25zIHdvdWxkIGJsZWVkIGludG8gdGhlIHJlc3VtZWQgcnVuIGFuZCBlbmdpbmUgd3JpdGVzXG4gICAgLy8gd291bGQgcmVhY2ggYSBjaGVja3BvaW50IHRoZSBjYWxsZXIgbWF5IGhhdmUgYWxyZWFkeSBwZXJzaXN0ZWQuXG4gICAgY29uc3Qgc2ZTdGF0ZXMgPSBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludC5zdWJmbG93U3RhdGVzKTtcbiAgICBjb25zdCBsZWFmU3ViZmxvd0lkID1cbiAgICAgIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgubGVuZ3RoID4gMCA/IGNoZWNrcG9pbnQuc3ViZmxvd1BhdGhbY2hlY2twb2ludC5zdWJmbG93UGF0aC5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgY29udGludWF0aW9uTmV4dCA9IHBhdXNlZE5vZGUubmV4dDtcbiAgICAvLyBBIGJyYW5jaC1zb3VyY2VkIGxvb3AgKGB7IGxvb3BUbyB9YCAvIGBEZWNpZGVyTGlzdC5sb29wVG9gKSBzZXRzIHRoZVxuICAgIC8vIGxvb3BpbmcgYnJhbmNoJ3MgYG5leHRgIHRvIGEgbG9vcC1yZWYgU1RVQiDigJQgYHsgaWQsIGlzTG9vcFJlZjp0cnVlIH1gXG4gICAgLy8gd2l0aCBubyBmbi9jaGlsZHJlbi9zdWJmbG93SWQuIE9uIGEgTk9STUFMIHJ1biB0aGF0IHN0dWIgcmVzb2x2ZXMgZmluZTpcbiAgICAvLyB0aGUgcmVhbCB0YXJnZXQgbm9kZSBpcyByZWFjaGFibGUgZnJvbSB0aGUgY2hhcnQgcm9vdCwgc28gdGhlIHRyYXZlcnNlcidzXG4gICAgLy8gbm9kZSBtYXAgYWxyZWFkeSBob2xkcyBpdCAodGhlIHN0dWIgaXMgc2tpcHBlZCDigJQgZmlyc3Qtd3JpdGUtd2lucykuIE9uXG4gICAgLy8gUkVTVU1FIHRoZSBub2RlIG1hcCBpcyBidWlsdCBmcm9tIHRoZSB0cnVuY2F0ZWQgcmVzdW1lIHJvb3QsIHdoZXJlIHRoZVxuICAgIC8vIHJlYWwgdGFyZ2V0IGlzIHVucmVhY2hhYmxlLCBzbyB0aGUgc3R1YiB3b3VsZCB3aW4gdGhlIGlkIHNsb3QgYW5kXG4gICAgLy8gYGV4ZWN1dGVOb2RlYCB0aHJvd3MgXCJOb2RlICc8dGFyZ2V0PicgbXVzdCBkZWZpbmUgLi4uXCIuIFJlc29sdmUgdGhlIHN0dWJcbiAgICAvLyB0byB0aGUgUkVBTCB0YXJnZXQgbm9kZSBoZXJlIChkZnNGaW5kIHNraXBzIGxvb3AtcmVmcyBhbmQgcmV0dXJucyB0aGVcbiAgICAvLyByZWFsIG5vZGUgV0lUSCBpdHMgZnVsbCBkb3duc3RyZWFtIGNoYWluIOKAlCBlLmcuIGEgc3ViZmxvdyBNT1VOVCBub2RlLFxuICAgIC8vIHdob3NlIGAubmV4dGAgY2FycmllcyB0aGUgZGVjaWRlci90ZXJtaW5hbCBjb250aW51YXRpb24gdGhlIGxvb3AgbXVzdFxuICAgIC8vIHJlLWVudGVyKS4gU2VlIHRlc3QvbGliL3BhdXNlL3Jlc3VtZS1icmFuY2gtbG9vcC1zdWJmbG93LnRlc3QudHMuXG4gICAgaWYgKGNvbnRpbnVhdGlvbk5leHQ/LmlzTG9vcFJlZikge1xuICAgICAgY29uc3QgbG9vcFRhcmdldElkID0gY29udGludWF0aW9uTmV4dC5pZDtcbiAgICAgIGNvbnN0IHJlYWxUYXJnZXQgPVxuICAgICAgICAobGVhZlN1YmZsb3dJZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5maW5kTm9kZUluR3JhcGgobG9vcFRhcmdldElkLCBjaGVja3BvaW50LnN1YmZsb3dQYXRoKSA6IHVuZGVmaW5lZCkgPz9cbiAgICAgICAgdGhpcy5maW5kTm9kZUluR3JhcGgobG9vcFRhcmdldElkLCBbXSk7XG4gICAgICBpZiAocmVhbFRhcmdldCkgY29udGludWF0aW9uTmV4dCA9IHJlYWxUYXJnZXQ7XG4gICAgfVxuICAgIGlmICghY29udGludWF0aW9uTmV4dCAmJiBjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQpIHtcbiAgICAgIC8vIFNlYXJjaCBsZWFmIHN1YmZsb3cgZmlyc3QgKGxvb3AgdGFyZ2V0cyAvIGJyYW5jaCBqb2lucyBsaXZlIHRoZXJlKSxcbiAgICAgIC8vIHRoZW4gZmFsbCBiYWNrIHRvIHRvcCBsZXZlbC5cbiAgICAgIGNvbnRpbnVhdGlvbk5leHQgPSBsZWFmU3ViZmxvd0lkXG4gICAgICAgID8gdGhpcy5maW5kTm9kZUluR3JhcGgoY2hlY2twb2ludC5jb250aW51YXRpb25TdGFnZUlkLCBjaGVja3BvaW50LnN1YmZsb3dQYXRoKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICghY29udGludWF0aW9uTmV4dCkge1xuICAgICAgICBjb250aW51YXRpb25OZXh0ID0gdGhpcy5maW5kTm9kZUluR3JhcGgoY2hlY2twb2ludC5jb250aW51YXRpb25TdGFnZUlkLCBbXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIFwiaW5uZXJcIiByZXN1bWUgY2hhaW46IHJlc3VtZUZuIOKGkiBjb250aW51YXRpb24uIFRoaXMgaXMgd2hhdFxuICAgIC8vIHJ1bnMgSU5TSURFIHRoZSBsZWFmIHN1YmZsb3cncyBib2R5LiBGb3IgYSByb290LWxldmVsIHBhdXNlXG4gICAgLy8gKHN1YmZsb3dQYXRoIGVtcHR5KSwgdGhpcyBpcyBhbHNvIHRoZSB0b3AtbGV2ZWwgcmVzdW1lIHJvb3QuXG4gICAgY29uc3QgaW5uZXJSZXN1bWVDaGFpbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBpZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBwYXVzZWROb2RlLmRlc2NyaXB0aW9uLFxuICAgICAgZm46IHJlc3VtZVN0YWdlRm4sXG4gICAgICBuZXh0OiBjb250aW51YXRpb25OZXh0LFxuICAgIH07XG5cbiAgICAvLyBEb24ndCBjbGVhciByZWNvcmRlcnMg4oCUIHJlc3VtZSBjb250aW51ZXMgZnJvbSBwcmV2aW91cyBzdGF0ZS5cbiAgICAvLyBOYXJyYXRpdmUsIG1ldHJpY3MsIGRlYnVnIGVudHJpZXMgYWNjdW11bGF0ZSBhY3Jvc3MgcGF1c2UvcmVzdW1lLlxuICAgIC8vXG4gICAgLy8gVHdvLW1vZGUgcmVzdW1lOlxuICAgIC8vICAg4oCiIFNhbWUtZXhlY3V0b3IgKHJ1bigpIHByZXZpb3VzbHkgY2FsbGVkIG9uIFRISVMgaW5zdGFuY2UpOlxuICAgIC8vICAgICByZXVzZSB0aGUgZXhpc3RpbmcgcnVudGltZSBzbyB0aGUgZXhlY3V0aW9uIHRyZWUgY29udGludWVzXG4gICAgLy8gICAgIGZyb20gdGhlIHBhdXNlIHBvaW50IGFuZCByZWNvcmRlcnMvbmFycmF0aXZlIGFjY3VtdWxhdGUuXG4gICAgLy8gICDigKIgQ3Jvc3MtZXhlY3V0b3IgKGZyZXNoIGV4ZWN1dG9yIHJlY29uc3RydWN0ZWQgZnJvbSBhIHN0b3JlZFxuICAgIC8vICAgICBjaGVja3BvaW50KTogc2VlZCBhIE5FVyBydW50aW1lIGZyb20gYGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVgXG4gICAgLy8gICAgIHNvIHJlc3VtZSBoYW5kbGVycyBjYW4gcmVhZCBwcmUtcGF1c2Ugc2NvcGUuIFRoZSBleGVjdXRpb25cbiAgICAvLyAgICAgdHJlZSBzdGFydHMgYXQgdGhlIHJlc3VtZSBub2RlIOKAlCB3ZSBkb24ndCBoYXZlIHRoZSBwcmV2aW91c1xuICAgIC8vICAgICB0cmF2ZXJzYWwncyB0cmVlIG9uIGEgZnJlc2ggcHJvY2VzcyBhbnl3YXkuXG4gICAgY29uc3Qgc2FtZUV4ZWN1dG9yID0gdGhpcy5faGFzUnVuQmVmb3JlO1xuICAgIGNvbnN0IGV4aXN0aW5nUnVudGltZSA9IHNhbWVFeGVjdXRvclxuICAgICAgPyAodGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBhbnkgcGF0aCB0aGF0IHJlc3VtZXMgY291bnRzIGFzIGEgcnVuXG4gICAgLy8gUmVzdW1lIGdldHMgYSBORVcgcnVuSWQg4oCUIHJlc3VtZSBpcyBsb2dpY2FsbHkgYSBkaXN0aW5jdCBydW4uXG4gICAgLy8gT3JpZ2luYWwgcnVuSWQgaXMgcmVjb3ZlcmFibGUgZnJvbSBjaGVja3BvaW50IG1ldGFkYXRhIGlmIGEgY29uc3VtZXJcbiAgICAvLyBuZWVkcyBjcm9zcy1ydW4gYXVkaXQgKHdlIGRvbid0IHN0b3JlIGl0IG9uIHRoZSBjaGVja3BvaW50IHRvZGF5O1xuICAgIC8vIGZ1dHVyZSBlbmhhbmNlbWVudCkuIFNlZSBgcnVuSWQudHNgLlxuICAgIHRoaXMuX2N1cnJlbnRSdW5JZCA9IGdlbmVyYXRlUnVuSWQoKTtcblxuICAgIC8vIFBpY2sgdGhlIHJlc3VtZSByb290ICsgaW5pdGlhbCBjb250ZXh0LlxuICAgIC8vXG4gICAgLy8gICBST09ULUxFVkVMIFBBVVNFIChzdWJmbG93UGF0aCBlbXB0eSk6XG4gICAgLy8gICAgIHJlc3VtZSByb290ID0gaW5uZXJSZXN1bWVDaGFpbiAocnVuIHJlc3VtZUZuIGF0IHRvcCBsZXZlbCkuXG4gICAgLy8gICAgIGluaXRpYWxDb250ZXh0ID0gY2hlY2twb2ludC5zaGFyZWRTdGF0ZS5cbiAgICAvL1xuICAgIC8vICAgU1VCRkxPVy1ORVNURUQgUEFVU0UgKHN1YmZsb3dQYXRoIG5vbi1lbXB0eSk6XG4gICAgLy8gICAgIFRoZSBwYXVzZSB3YXMgSU5TSURFIGEgc3ViZmxvdydzIGJvZHkuIFRvIHJ1biB0aGUgc3ViZmxvdydzXG4gICAgLy8gICAgIG91dHB1dE1hcHBlciBhbmQgdGhlIHBhcmVudCdzIGNvbnRpbnVhdGlvbiwgd2UgaGF2ZSB0byBlbnRlclxuICAgIC8vICAgICB0aHJvdWdoIHRoZSBPVVRFUiBNT1VOVCAodGhlIHBhcmVudCdzIG5vZGUgdGhhdCBtb3VudHMgdGhlXG4gICAgLy8gICAgIGxlYWYgc3ViZmxvdykuIFdlIHN3YXAgdGhlIGxlYWYgc3ViZmxvdydzIHJvb3Qgd2l0aFxuICAgIC8vICAgICBpbm5lclJlc3VtZUNoYWluIHNvIFN1YmZsb3dFeGVjdXRvcjpcbiAgICAvLyAgICAgICAxLiBlbnRlcnMgdGhlIHN1YmZsb3cgYm91bmRhcnksXG4gICAgLy8gICAgICAgMi4gc2VlZHMgdGhlIG5lc3RlZCBydW50aW1lIGZyb20gc3ViZmxvd1N0YXRlc1tsZWFmXVxuICAgIC8vICAgICAgICAgIChza2lwcGluZyB0aGUgaW5wdXRNYXBwZXIg4oCUIHNlZSBTdWJmbG93RXhlY3V0b3IudHMpLFxuICAgIC8vICAgICAgIDMuIHJ1bnMgdGhlIHJlc3VtZUZuIOKGkiBjb250aW51YXRpb24gY2hhaW4sXG4gICAgLy8gICAgICAgNC4gcnVucyB0aGUgb3V0cHV0TWFwcGVyIGF0IGV4aXQsXG4gICAgLy8gICAgICAgNS4gcGFyZW50IHRyYXZlcnNhbCBjb250aW51ZXMgbm9ybWFsbHkuXG4gICAgLy9cbiAgICAvLyAgICAgQ3Jvc3MtZXhlY3V0b3I6IGluaXRpYWxDb250ZXh0ID0gY2hlY2twb2ludC5zaGFyZWRTdGF0ZSAodGhlXG4gICAgLy8gICAgICAgcGFyZW50J3MgdmlldyBhdCBwYXVzZSB0aW1lIOKAlCBvdXRwdXRNYXBwZXIgd3JpdGVzIGJhY2sgaW50byBpdCkuXG4gICAgLy8gICAgIFNhbWUtZXhlY3V0b3I6IGV4aXN0aW5nUnVudGltZSBpcyByZXVzZWQ7IGluaXRpYWxDb250ZXh0IGlzIG1vb3RcbiAgICAvLyAgICAgICBmb3IgdGhlIHN1YmZsb3cgZnJhbWUgKGFscmVhZHkgaW4gdGhlIHJ1bnRpbWUgc3RhY2spLCBidXQgd2VcbiAgICAvLyAgICAgICBzdGlsbCBwYXNzIHNoYXJlZFN0YXRlIGZvciBjb25zaXN0ZW5jeS5cbiAgICBjb25zdCBmYyA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQ7XG4gICAgbGV0IHJlc3VtZVJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0gaW5uZXJSZXN1bWVDaGFpbjtcbiAgICBsZXQgc3ViZmxvd3NPdmVycmlkZTogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZDtcbiAgICBpZiAobGVhZlN1YmZsb3dJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBGaW5kIHRoZSBPVVRFUiBtb3VudCBub2RlIGZvciB0aGUgRklSU1QgZW50cnkgb24gdGhlIHBhdGguXG4gICAgICAvLyBGb3Igc2luZ2xlLWxldmVsIHBhdXNlcywgdGhpcyBpcyB0aGUgb25seSBtb3VudCB3ZSBuZWVkIHRvXG4gICAgICAvLyBlbnRlciB0aHJvdWdoLiBGb3IgbmVzdGVkIG1vdW50cyB0aGUgcGF0dGVybiB3b3VsZCBleHRlbmQsIGJ1dFxuICAgICAgLy8gc2luZ2xlLWxldmVsIGNvdmVycyBhbGwgY3VycmVudCB1c2UgY2FzZXMgKFNlcXVlbmNlKEFnZW50KSxcbiAgICAgIC8vIENvbmRpdGlvbmFsKEFnZW50KSwgUGFyYWxsZWwgYnJhbmNoZXMgd2l0aCBwYXVzZWQgYWdlbnRzKS5cbiAgICAgIGNvbnN0IG91dGVyU3ViZmxvd0lkID0gY2hlY2twb2ludC5zdWJmbG93UGF0aFswXTtcbiAgICAgIGNvbnN0IG91dGVyTW91bnQgPSB0aGlzLmZpbmRNb3VudEluR3JhcGgoZmMucm9vdCwgb3V0ZXJTdWJmbG93SWQpO1xuICAgICAgaWYgKG91dGVyTW91bnQpIHtcbiAgICAgICAgcmVzdW1lUm9vdCA9IG91dGVyTW91bnQ7XG4gICAgICB9XG4gICAgICAvLyBSZXBsYWNlIHRoZSBsZWFmIHN1YmZsb3cncyByb290IHdpdGggdGhlIHJlc3VtZSBjaGFpbiBzbyB0aGVcbiAgICAgIC8vIGJvZHkgcnVucyBmcm9tIHRoZSBwYXVzZSBwb2ludCBmb3J3YXJkLlxuICAgICAgc3ViZmxvd3NPdmVycmlkZSA9IHsgLi4uKGZjLnN1YmZsb3dzID8/IHt9KSB9O1xuICAgICAgc3ViZmxvd3NPdmVycmlkZVtsZWFmU3ViZmxvd0lkXSA9IHsgcm9vdDogaW5uZXJSZXN1bWVDaGFpbiB9O1xuICAgIH1cbiAgICAvLyBDbG9uZS1pbiBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIGBzZlN0YXRlc2AgYWJvdmU6IGBpbml0aWFsQ29udGV4dGBcbiAgICAvLyBzZWVkcyB0aGUgZnJlc2ggU2hhcmVkTWVtb3J5IHZpYSBgbWVyZ2VDb250ZXh0V2luc2AsIHdoaWNoIGNvcGllcyBvbmx5XG4gICAgLy8gdGhlIFRPUCBsZXZlbCDigJQgbmVzdGVkIG9iamVjdHMgd291bGQgYWxpYXMgdGhlIGNhbGxlcidzIGNoZWNrcG9pbnQuXG4gICAgY29uc3QgcmVzdW1lSW5pdGlhbENvbnRleHQgPSBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludC5zaGFyZWRTdGF0ZSk7XG5cbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKFxuICAgICAgb3B0aW9ucz8uc2lnbmFsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgb3B0aW9ucz8uZW52LFxuICAgICAgb3B0aW9ucz8ubWF4RGVwdGgsXG4gICAgICBvcHRpb25zPy5tYXhJdGVyYXRpb25zLFxuICAgICAge1xuICAgICAgICByb290OiByZXN1bWVSb290LFxuICAgICAgICBpbml0aWFsQ29udGV4dDogcmVzdW1lSW5pdGlhbENvbnRleHQsXG4gICAgICAgIHByZXNlcnZlUmVjb3JkZXJzOiB0cnVlLFxuICAgICAgICAuLi4oZXhpc3RpbmdSdW50aW1lID8geyBleGlzdGluZ1J1bnRpbWUgfSA6IHt9KSxcbiAgICAgICAgLy8gSGFuZCB0aGUgcGVyLXN1YmZsb3cgc2NvcGUgY2FwdHVyZXMgZG93biB0byBTdWJmbG93RXhlY3V0b3IuXG4gICAgICAgIC8vIEFsd2F5cyBwcmVzZW50IG9uIGEgY2hlY2twb2ludCDigJQgZW1wdHkgYHt9YCBmb3Igcm9vdCBwYXVzZXMuXG4gICAgICAgIHN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU6IHNmU3RhdGVzLFxuICAgICAgICAuLi4oc3ViZmxvd3NPdmVycmlkZSAmJiB7IHN1YmZsb3dzT3ZlcnJpZGUgfSksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBGaXJlIG9uUmVzdW1lIGV2ZW50IG9uIGFsbCByZWNvcmRlcnMgKGZsb3cgKyBzY29wZSkuIFN0YW1wIHRoZVxuICAgIC8vIHN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciB0aGUgcmVzdW1lZCBzdGFnZSB3aXRoIHRoZSBORVdcbiAgICAvLyBydW5JZCBzbyBjb25zdW1lcnMgZGV0ZWN0IFwidGhpcyBpcyBhIGZyZXNoIGxvZ2ljYWwgcnVuXCIgdmlhXG4gICAgLy8gdGhlIHNhbWUgcnVuSWQtY2hhbmdlIHBhdHRlcm4gdGhleSB1c2UgZm9yIGBvblJ1blN0YXJ0YC5cbiAgICBjb25zdCBoYXNJbnB1dCA9IHJlc3VtZUlucHV0ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzdW1lUnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKHBhdXNlZE5vZGUuaWQsIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUpO1xuICAgIGNvbnN0IGZsb3dSZXN1bWVFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgdHJhdmVyc2FsQ29udGV4dDoge1xuICAgICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogcmVzdW1lUnVudGltZVN0YWdlSWQsXG4gICAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgICBkZXB0aDogMCxcbiAgICAgIH0sXG4gICAgICBjaGFubmVsOiAnZmxvdycgYXMgY29uc3QsXG4gICAgfTtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB0aGlzLmNvbWJpbmVkUmVjb3JkZXIub25SZXN1bWUoZmxvd1Jlc3VtZUV2ZW50KTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSByLm9uUmVzdW1lPy4oZmxvd1Jlc3VtZUV2ZW50KTtcblxuICAgIGNvbnN0IHNjb3BlUmVzdW1lRXZlbnQgPSB7XG4gICAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogYnVpbGRSdW50aW1lU3RhZ2VJZChwYXVzZWROb2RlLmlkLCB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlKSxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgcGlwZWxpbmVJZDogJycsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBjaGFubmVsOiAnc2NvcGUnIGFzIGNvbnN0LFxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHIub25SZXN1bWU/LihzY29wZVJlc3VtZUV2ZW50KTtcblxuICAgIC8vIERlZmVycmVkIHRpZXIgKFJGQy0wMDEpOiB0aGVzZSBleGVjdXRvci1zeW50aGVzaXplZCBvblJlc3VtZSBldmVudHNcbiAgICAvLyBieXBhc3MgdGhlIHBlci1zdGFnZSBkaXNwYXRjaCBzaXRlcywgc28gY2FwdHVyZSB0aGVtIGRpcmVjdGx5LlxuICAgIGlmICh0aGlzLmRlZmVycmVkVGllcikge1xuICAgICAgdGhpcy5kZWZlcnJlZFRpZXIuY2FwdHVyZSgnZmxvdycsICdvblJlc3VtZScsIHJlc3VtZVJ1bnRpbWVTdGFnZUlkLCB0aGlzLl9jdXJyZW50UnVuSWQsIGZsb3dSZXN1bWVFdmVudCk7XG4gICAgICB0aGlzLmRlZmVycmVkVGllci5jYXB0dXJlKFxuICAgICAgICAnc2NvcGUnLFxuICAgICAgICAnb25SZXN1bWUnLFxuICAgICAgICBzY29wZVJlc3VtZUV2ZW50LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBzY29wZVJlc3VtZUV2ZW50LnBpcGVsaW5lSWQsXG4gICAgICAgIHNjb3BlUmVzdW1lRXZlbnQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNldCBBRlRFUiBhbGwgc3luYyB2YWxpZGF0aW9uL2xvb2t1cCB0aHJvd3MgYWJvdmUgKG5vdGhpbmcgY2FuIGxlYWsgdGhlXG4gICAgLy8gZmxhZyk7IG5vIGF3YWl0IGJldHdlZW4gdGhlIHRvcC1vZi1tZXRob2QgY2hlY2sgYW5kIGhlcmUsIHNvIHJhY2UtZnJlZS5cbiAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICAgIC8vIFRlcm1pbmFsIGZsdXNoIChSRkMtMDAxIEJsb2NrIDgpIOKAlCBzYW1lIGJvdW5kYXJ5IGNvbnRyYWN0IGFzIHJ1bigpLlxuICAgICAgdGhpcy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMuZGVmZXJyZWRUaWVyPy50ZXJtaW5hbEZsdXNoKCk7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHRoaXMuYnVpbGRQYXVzZUNoZWNrcG9pbnQoZXJyb3IpO1xuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgZnVsbHkgREVUQUNIRUQgY2hlY2twb2ludCBmcm9tIGEgY2F1Z2h0IFBhdXNlU2lnbmFsLlxuICAgKlxuICAgKiBFdmVyeSBmaWVsZCBpcyBkZWVwLWNvcGllZCB2aWEgb25lIGBzdHJ1Y3R1cmVkQ2xvbmVgIG9mIHRoZSBhc3NlbWJsZWRcbiAgICogY2hlY2twb2ludCwgYmVjYXVzZSB0aGUgcmF3IHBpZWNlcyBhbGlhcyBsaXZlIGVuZ2luZSBzdGF0ZTpcbiAgICpcbiAgICogICAtIGBzaGFyZWRTdGF0ZWAgSVMgYFNoYXJlZE1lbW9yeWAncyBpbnRlcm5hbCBjb250ZXh0IG9iamVjdCDigJQgdGhlIGFsaWFzXG4gICAqICAgICBvbmx5IGRldGFjaGVzIGF0IHRoZSBuZXh0IGNvbW1pdCAoYGFwcGx5U21hcnRNZXJnZWAgcmVidWlsZHMgaXQpLCBhbmRcbiAgICogICAgIGFmdGVyIGEgcGF1c2UgdGhlcmUgaXMgbm8gbmV4dCBjb21taXQgdW50aWwgcmVzdW1lLlxuICAgKiAgIC0gYGV4ZWN1dGlvblRyZWVgIG5vZGVzIGFyZSBmcmVzaCwgYnV0IHRoZWlyIGBsb2dzYC9gZXJyb3JzYC9gbWV0cmljc2AvXG4gICAqICAgICBgZXZhbHNgL2BzdGFnZVJlYWRzYC9gZmxvd01lc3NhZ2VzYCBmaWVsZHMgcmVmZXJlbmNlIGxpdmVcbiAgICogICAgIGBEaWFnbm9zdGljQ29sbGVjdG9yYCBiYWdzIHRoYXQga2VlcCBhY2N1bXVsYXRpbmcgb24gc2FtZS1leGVjdXRvclxuICAgKiAgICAgcmVzdW1lLlxuICAgKiAgIC0gYHN1YmZsb3dTdGF0ZXNgIHZhbHVlcyBhcmUgc2hhbGxvdyBjb3BpZXMgd2hvc2UgTkVTVEVEIG9iamVjdHMgYWxpYXNcbiAgICogICAgIHN1YmZsb3cgbWVtb3J5LCBhbmQgdGhleSBnZXQgc2VlZGVkIGJhY2sgaW50byBsaXZlIHJ1bnRpbWVzIG9uIHJlc3VtZS5cbiAgICogICAtIGBzdWJmbG93UmVzdWx0c2AgdmFsdWVzIHN0YXkgcmVmZXJlbmNlZCBieSB0aGUgdHJhdmVyc2VyJ3MgcmVzdWx0cyBtYXAuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGlzIHBlcnNpc3RlZCBieSBjb250cmFjdCAoXCJzdG9yZSBpbiBSZWRpcy9Qb3N0Z3Jlc1wiKSDigJQgaXRcbiAgICogbXVzdCBuZXZlciBzaGFyZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgZW5naW5lLiBQYXVzZSBpcyBub3QgYSBob3QgcGF0aDsgdGhlXG4gICAqIGNsb25lIGNvc3QgaXMgaXJyZWxldmFudC5cbiAgICpcbiAgICogVGhlIEpTT04tc2FmZSBjaGVja3BvaW50IGNvbnRyYWN0IChubyBmdW5jdGlvbnMsIG5vIGNsYXNzIGluc3RhbmNlcylcbiAgICogZ292ZXJucyBDT05TVU1FUi1vd25lZCBkYXRhIOKAlCBidXQgdGhlIGV4ZWN1dGlvblRyZWUncyBkaWFnbm9zdGljIGJhZ3NcbiAgICogYWNjZXB0IEFOWSB2YWx1ZSBhdCB3cml0ZSB0aW1lIHdpdGhvdXQgY2xvbmluZyAoJGRlYnVnLyRlcnJvci8kbWV0cmljL1xuICAgKiAkZXZhbCBzdG9yZSByYXcgcmVmZXJlbmNlcyksIHNvIGEgY29udHJhY3QtY29tcGxpYW50IHJ1biBjYW4gc3RpbGwgY2FycnlcbiAgICogYSBub24tY2xvbmVhYmxlIGRpYWdub3N0aWMuIE9ic2VydmFiaWxpdHkgc2lkZS1iYWdzIG5ldmVyIGFib3J0IHRyYXZlcnNhbFxuICAgKiBhbnl3aGVyZSBlbHNlIGluIHRoZSBsaWJyYXJ5LCBzbyB0aGV5IG11c3Qgbm90IGFib3J0IHRoZSBwYXVzZSBlaXRoZXI6XG4gICAqIG9uIGNsb25lIGZhaWx1cmUgd2Ugc2FuaXRpemUgdGhlIGRpYWdub3N0aWMgYmFncyAobm9uLWNsb25lYWJsZSB2YWx1ZXNcbiAgICogYmVjb21lICdbbm9uLXNlcmlhbGl6YWJsZTog4oCmXScgbWFya2VycyDigJQgdGhlIGxpdmUgZW5naW5lIGJhZ3MgYXJlIG5ldmVyXG4gICAqIHRvdWNoZWQpIGFuZCByZXRyeS4gSWYgdGhlIHJldHJ5IFNUSUxMIGZhaWxzLCB0aGUgdmlvbGF0aW9uIGlzIGluXG4gICAqIGNvbnN1bWVyLW93bmVkIGRhdGEgKHJlYWxpc3RpY2FsbHkgYHBhdXNlRGF0YWAg4oCUIGEgZnVuY3Rpb24gY2FuIG5ldmVyXG4gICAqIHJlYWNoIHNoYXJlZCBzdGF0ZSBpbiB0aGUgZmlyc3QgcGxhY2U6IFRyYW5zYWN0aW9uQnVmZmVyIGNsb25lcyBldmVyeVxuICAgKiB3cml0dGVuIHZhbHVlIGF0IHdyaXRlIHRpbWUsIHNvIHRoZSBvZmZlbmRpbmcgd3JpdGUgYWxyZWFkeSByZWplY3RlZClcbiAgICogYW5kIHdlIHRocm93IGEgREVTQ1JJUFRJVkUgY29udHJhY3QgZXJyb3IgbmFtaW5nIHRoZSBvZmZlbmRpbmdcbiAgICogY2hlY2twb2ludCBmaWVsZChzKS4gQSBuYWtlZCBEYXRhQ2xvbmVFcnJvciBuZXZlciBlc2NhcGVzLlxuICAgKlxuICAgKiBTdWJmbG93IHNjb3BlIGNhcHR1cmUgKGBzdWJmbG93U3RhdGVzYCkgc3Vydml2ZXMgT05MWSBvbiB0aGUgc2lnbmFsIOKAlCB0aGVcbiAgICogbmVzdGVkIHJ1bnRpbWVzIGFyZSBHQydkIGFzIHRoZSBzdGFjayB1bndpbmRzLiBQcm9tb3RpbmcgaXQgb250byB0aGVcbiAgICogY2hlY2twb2ludCBoZXJlIGxldHMgY3Jvc3MtZXhlY3V0b3IgcmVzdW1lIHJlc3RvcmUgcHJlLXBhdXNlIHN1YmZsb3dcbiAgICogc2NvcGUgKGUuZy4gYW4gQWdlbnQncyBgc2NvcGUuaGlzdG9yeWApLiBFbXB0eSBge31gIGZvciByb290LWxldmVsIHBhdXNlcy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRQYXVzZUNoZWNrcG9pbnQoc2lnbmFsOiBQYXVzZVNpZ25hbCk6IEZsb3djaGFydENoZWNrcG9pbnQge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3QoKTtcbiAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSB7XG4gICAgICBzaGFyZWRTdGF0ZTogc25hcHNob3Quc2hhcmVkU3RhdGUsXG4gICAgICBleGVjdXRpb25UcmVlOiBzbmFwc2hvdC5leGVjdXRpb25UcmVlLFxuICAgICAgcGF1c2VkU3RhZ2VJZDogc2lnbmFsLnN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogc2lnbmFsLnN1YmZsb3dQYXRoLFxuICAgICAgcGF1c2VEYXRhOiBzaWduYWwucGF1c2VEYXRhLFxuICAgICAgc3ViZmxvd1N0YXRlczogc2lnbmFsLnN1YmZsb3dTdGF0ZXMsXG4gICAgICAuLi4oc2ZSZXN1bHRzLnNpemUgPiAwICYmIHsgc3ViZmxvd1Jlc3VsdHM6IE9iamVjdC5mcm9tRW50cmllcyhzZlJlc3VsdHMpIH0pLFxuICAgICAgLy8gSW52b2tlciBjb250ZXh0IOKAlCBjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbCBidWJibGUtdXAgKG5vdCB0cmVlLXdhbGtlZClcbiAgICAgIC4uLihzaWduYWwuaW52b2tlclN0YWdlSWQgJiYgeyBpbnZva2VyU3RhZ2VJZDogc2lnbmFsLmludm9rZXJTdGFnZUlkIH0pLFxuICAgICAgLi4uKHNpZ25hbC5jb250aW51YXRpb25TdGFnZUlkICYmIHsgY29udGludWF0aW9uU3RhZ2VJZDogc2lnbmFsLmNvbnRpbnVhdGlvblN0YWdlSWQgfSksXG4gICAgICBwYXVzZWRBdDogRGF0ZS5ub3coKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm9uLWNsb25lYWJsZSBkaWFnbm9zdGljcyBtdXN0IG5vdCBzd2FsbG93IHRoZSBwYXVzZSDigJQgc2FuaXRpemUgdGhlXG4gICAgICAvLyBleGVjdXRpb25UcmVlJ3MgYmFncyAobWFya2VycyByZXBsYWNlIHRoZSBvZmZlbmRlcnMpIGFuZCByZXRyeS5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNoZWNrcG9pbnQuZXhlY3V0aW9uVHJlZSA9IHNhbml0aXplRGlhZ25vc3RpY0JhZ3MoY2hlY2twb2ludC5leGVjdXRpb25UcmVlIGFzIFN0YWdlU25hcHNob3QpO1xuICAgICAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQpO1xuICAgICAgfSBjYXRjaCAocmV0cnlFcnJvcikge1xuICAgICAgICAvLyBHZW51aW5lIEpTT04tc2FmZSBjb250cmFjdCB2aW9sYXRpb24gaW4gY29uc3VtZXItb3duZWQgZGF0YS5cbiAgICAgICAgdGhyb3cgZGVzY3JpYmVDaGVja3BvaW50Q2xvbmVGYWlsdXJlKGNoZWNrcG9pbnQsIHJldHJ5RXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgU3RhZ2VOb2RlIGluIHRoZSBjb21waWxlZCBncmFwaCBieSBJRC5cbiAgICogSGFuZGxlcyBzdWJmbG93IHBhdGhzIGJ5IGRyaWxsaW5nIGludG8gcmVnaXN0ZXJlZCBzdWJmbG93cy5cbiAgICovXG4gIHByaXZhdGUgZmluZE5vZGVJbkdyYXBoKHN0YWdlSWQ6IHN0cmluZywgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZjID0gdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydDtcblxuICAgIGlmIChzdWJmbG93UGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFRvcC1sZXZlbDogREZTIGZyb20gcm9vdFxuICAgICAgcmV0dXJuIHRoaXMuZGZzRmluZChmYy5yb290LCBzdGFnZUlkKTtcbiAgICB9XG5cbiAgICAvLyBTdWJmbG93OiBkcmlsbCBpbnRvIHRoZSBzdWJmbG93IGNoYWluLCB0aGVuIHNlYXJjaCBmcm9tIHRoZSBsYXN0IHN1YmZsb3cncyByb290XG4gICAgbGV0IHN1YmZsb3dSb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHNmSWQgb2Ygc3ViZmxvd1BhdGgpIHtcbiAgICAgIGNvbnN0IHN1YmZsb3cgPSBmYy5zdWJmbG93cz8uW3NmSWRdO1xuICAgICAgaWYgKCFzdWJmbG93KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgc3ViZmxvd1Jvb3QgPSBzdWJmbG93LnJvb3Q7XG4gICAgfVxuICAgIGlmICghc3ViZmxvd1Jvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZGZzRmluZChzdWJmbG93Um9vdCwgc3RhZ2VJZCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgbW91bnQgbm9kZSAodGhlIG5vZGUgdGhhdCBtb3VudHMgYSBzdWJmbG93IGJvdW5kYXJ5KVxuICAgKiBmb3IgYSBnaXZlbiBzdWJmbG93SWQsIGJ5IERGUyBmcm9tIGBzdGFydGAuIFVzZWQgYnkgYHJlc3VtZSgpYCB0b1xuICAgKiBsb2NhdGUgdGhlIE9VVEVSIG5vZGUgd2UgaGF2ZSB0byBlbnRlciB0aHJvdWdoIHNvIHRoZSBzdWJmbG93J3NcbiAgICogb3V0cHV0TWFwcGVyIGFuZCBwYXJlbnQgY29udGludWF0aW9uIGV4ZWN1dGUuXG4gICAqXG4gICAqIEN5Y2xlLXNhZmUgdmlhIHZpc2l0ZWQgc2V0LiBSZXR1cm5zIHRoZSBmaXJzdCBtYXRjaCAoREZTIG9yZGVyKS5cbiAgICovXG4gIHByaXZhdGUgZmluZE1vdW50SW5HcmFwaChcbiAgICBzdGFydDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHN0YXJ0LmlzTG9vcFJlZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodmlzaXRlZC5oYXMoc3RhcnQuaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZpc2l0ZWQuYWRkKHN0YXJ0LmlkKTtcbiAgICBpZiAoc3RhcnQuc3ViZmxvd0lkID09PSBzdWJmbG93SWQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoc3RhcnQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhcnQuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRNb3VudEluR3JhcGgoY2hpbGQsIHN1YmZsb3dJZCwgdmlzaXRlZCk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhcnQubmV4dCkgcmV0dXJuIHRoaXMuZmluZE1vdW50SW5HcmFwaChzdGFydC5uZXh0LCBzdWJmbG93SWQsIHZpc2l0ZWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogREZTIHNlYXJjaCBmb3IgYSBub2RlIGJ5IElEIGluIHRoZSBTdGFnZU5vZGUgZ3JhcGguIEN5Y2xlLXNhZmUgdmlhIHZpc2l0ZWQgc2V0LiAqL1xuICBwcml2YXRlIGRmc0ZpbmQoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCksXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICAvLyBTa2lwIGxvb3AgYmFjay1lZGdlIHJlZmVyZW5jZXMgKHRoZXkgc2hhcmUgdGhlIHRhcmdldCdzIElEIGJ1dCBoYXZlIG5vIGZuL3Jlc3VtZUZuKVxuICAgIGlmIChub2RlLmlzTG9vcFJlZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodmlzaXRlZC5oYXMobm9kZS5pZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdmlzaXRlZC5hZGQobm9kZS5pZCk7XG4gICAgaWYgKG5vZGUuaWQgPT09IHRhcmdldElkKSByZXR1cm4gbm9kZTtcbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5kZnNGaW5kKGNoaWxkLCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZS5uZXh0KSByZXR1cm4gdGhpcy5kZnNGaW5kKG5vZGUubmV4dCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIDilIAgU2NvcGVSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBzY29wZSBTY29wZVJlY29yZGVyIHRvIG9ic2VydmUgZGF0YSBvcGVyYXRpb25zIChyZWFkcywgd3JpdGVzLCBjb21taXRzKS5cbiAgICogQXV0b21hdGljYWxseSBhdHRhY2hlZCB0byBldmVyeSBTY29wZUZhY2FkZSBjcmVhdGVkIGR1cmluZyB0cmF2ZXJzYWwuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IElEOioqIElmIGEgcmVjb3JkZXIgd2l0aCB0aGUgc2FtZSBgaWRgIGlzIGFscmVhZHkgYXR0YWNoZWQsXG4gICAqIGl0IGlzIHJlcGxhY2VkIChub3QgZHVwbGljYXRlZCkuIFRoaXMgcHJldmVudHMgZG91YmxlLWNvdW50aW5nIHdoZW4gYm90aFxuICAgKiBhIGZyYW1ld29yayBhbmQgdGhlIHVzZXIgYXR0YWNoIHRoZSBzYW1lIHJlY29yZGVyIHR5cGUuXG4gICAqXG4gICAqIEJ1aWx0LWluIHJlY29yZGVycyB1c2UgYXV0by1pbmNyZW1lbnQgSURzIChgbWV0cmljcy0xYCwgYGRlYnVnLTFgLCAuLi4pIGJ5XG4gICAqIGRlZmF1bHQsIHNvIG11bHRpcGxlIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25maWdzIGNvZXhpc3QuIFRvIG92ZXJyaWRlXG4gICAqIGEgZnJhbWV3b3JrLWF0dGFjaGVkIHJlY29yZGVyLCBwYXNzIHRoZSBzYW1lIHdlbGwta25vd24gSUQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gTXVsdGlwbGUgcmVjb3JkZXJzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3Mg4oCUIGVhY2ggZ2V0cyBhIHVuaXF1ZSBJRFxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcigpKTtcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgRGVidWdSZWNvcmRlcih7IHZlcmJvc2l0eTogJ21pbmltYWwnIH0pKTtcbiAgICpcbiAgICogLy8gT3ZlcnJpZGUgYSBmcmFtZXdvcmstYXR0YWNoZWQgcmVjb3JkZXIgYnkgcGFzc2luZyBpdHMgd2VsbC1rbm93biBJRFxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbWV0cmljcycpKTtcbiAgICpcbiAgICogLy8gQXR0YWNoaW5nIHR3aWNlIHdpdGggc2FtZSBJRCByZXBsYWNlcyAobm8gZG91YmxlLWNvdW50aW5nKVxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbXktbWV0cmljcycpKTtcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7IC8vIHJlcGxhY2VzIHByZXZpb3VzXG4gICAqIGBgYFxuICAgKlxuICAgKiAqKkRlbGl2ZXJ5IHRpZXIgKFJGQy0wMDEpOioqIHBhc3MgYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgdG8gdGFrZSB0aGVcbiAgICogcmVjb3JkZXIgb3V0IG9mIHRoZSBlbmdpbmUncyBob3QgcGF0aCDigJQgZXZlbnRzIGFyZSBjYXB0dXJlZCBpbnRvIGFcbiAgICogYm91bmRlZCBxdWV1ZSBhbmQgZGVsaXZlcmVkIGF0IHRoZSBuZXh0IG1pY3JvdGFzayBjaGVja3BvaW50IChcIm9uZSBiZWF0XG4gICAqIGJlaGluZFwiKS4gT21pdHRpbmcgYGRlbGl2ZXJ5YCBrZWVwcyB0aGUgaGlzdG9yaWNhbCBzeW5jaHJvbm91cyBjYWxsLFxuICAgKiBieXRlLWlkZW50aWNhbCB0byBwcmV2aW91cyByZWxlYXNlcy4gUmUtYXR0YWNoaW5nIHRoZSBzYW1lIGBpZGAgd2l0aCBhXG4gICAqIGRpZmZlcmVudCB0aWVyIFNXQVBTIHRpZXJzIGNsZWFubHkg4oCUIG5ldmVyIGRvdWJsZSBkZWxpdmVyeS4gU2VlXG4gICAqIGBkb2NzL2d1aWRlcy9vYnNlcnZlcnMtZGVmZXJyZWQubWRgLlxuICAgKi9cbiAgYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcjogU2NvcGVSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIC8vIFRpZXIgc3dhcCwgYm90aCBkaXJlY3Rpb25zOiBhbiBpZCBsaXZlcyBvbiBleGFjdGx5IE9ORSB0aWVyIHBlciBsaXN0LlxuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMgPSB0aGlzLnNjb3BlUmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIGlmIChvcHRpb25zPy5kZWxpdmVyeSA9PT0gJ2RlZmVycmVkJykge1xuICAgICAgdGhpcy5lbnN1cmVEZWZlcnJlZFRpZXIob3B0aW9ucykucmVnaXN0ZXIocmVjb3JkZXIsIHsgc2NvcGU6IHRydWUgfSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGVmZXJyZWRUaWVyPy5yZW1vdmVGcm9tTGlzdHMocmVjb3JkZXIuaWQsIHsgc2NvcGU6IHRydWUgfSk7XG4gICAgdGhpcy5zY29wZVJlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXppbHkgY3JlYXRlIHRoZSBleGVjdXRvcidzIE9ORSBkZWZlcnJlZC1vYnNlcnZlciB0aWVyIChvbmUgbWVyZ2VkXG4gICAqIHF1ZXVlLCB0b3RhbCBldmVudCBvcmRlciBhY3Jvc3MgYWxsIHRocmVlIGNoYW5uZWxzKS4gVGhlIEZJUlNUIGRlZmVycmVkXG4gICAqIGF0dGFjaCdzIG9wdGlvbnMgY29uZmlndXJlIHRoZSBkaXNwYXRjaGVyOyBsYXRlciBkaWZmZXJpbmcgb3B0aW9ucyBhcmVcbiAgICogZGV2LXdhcm5lZCBhbmQgaWdub3JlZCAoc2VlIGBBdHRhY2hSZWNvcmRlck9wdGlvbnNgKS5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlRGVmZXJyZWRUaWVyKG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiBEZWZlcnJlZE9ic2VydmVyVGllciB7XG4gICAgaWYgKCF0aGlzLmRlZmVycmVkVGllcikgdGhpcy5kZWZlcnJlZFRpZXIgPSBuZXcgRGVmZXJyZWRPYnNlcnZlclRpZXIob3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMuZGVmZXJyZWRUaWVyO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIERldGFjaCAoVDQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBCYXJlLWV4ZWN1dG9yIGVudHJ5IHBvaW50IGZvciBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgZmxvd2NoYXJ0IGV4ZWN1dGlvbi5cbiAgLy8gVXNlIGZyb20gb3V0c2lkZSBhbnkgY2hhcnQgKGNvbnN1bWVyIGNvZGUgdGhhdCB3YW50cyB0byBkZXRhY2ggd29ya1xuICAvLyB3aXRob3V0IGZpcnN0IHJ1bm5pbmcgYSBwYXJlbnQgY2hhcnQpLiBGb3IgZGV0YWNoIEZST00gSU5TSURFIGEgc3RhZ2UsXG4gIC8vIHVzZSBgc2NvcGUuJGRldGFjaEFuZEpvaW5MYXRlciguLi4pYCAvIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgIOKAlFxuICAvLyB0aG9zZSBtaW50IHJlZklkcyBmcm9tIHRoZSBjYWxsaW5nIHN0YWdlJ3MgcnVudGltZVN0YWdlSWQgZm9yIHRyYWNlXG4gIC8vIGNvcnJlbGF0aW9uOyB0aGUgYmFyZS1leGVjdXRvciBlbnRyaWVzIHVzZSBhIHN5bnRoZXRpYyBwcmVmaXhcbiAgLy8gKGBfX2V4ZWN1dG9yX19gKSBpbnN0ZWFkLlxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmQgcmV0dXJuIGEgYERldGFjaEhhbmRsZWBcbiAgICogdGhlIGNhbGxlciBjYW4gYHdhaXQoKWAgb24gKFByb21pc2UpIG9yIHJlYWQgYC5zdGF0dXNgIGZyb20gKHN5bmMpLlxuICAgKlxuICAgKiBUaGUgZHJpdmVyIGlzIGEgUkVRVUlSRUQgZmlyc3QgYXJndW1lbnQg4oCUIHRoZXJlIGlzIG5vIGxpYnJhcnktZGVmYXVsdCxcbiAgICogdG8ga2VlcCB0aGUgZW5naW5lIGZyZWUgb2YgZHJpdmVyIGltcG9ydHMgYW5kIHRvIG1ha2UgdGhlIGNob2ljZSBvZlxuICAgKiBzY2hlZHVsaW5nIGFsZ29yaXRobSBleHBsaWNpdCBhdCB0aGUgY2FsbCBzaXRlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IG1pY3JvdGFza0JhdGNoRHJpdmVyIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICpcbiAgICogY29uc3QgZXhlYyA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihwYXJlbnRDaGFydCk7XG4gICAqIGNvbnN0IGhhbmRsZSA9IGV4ZWMuZGV0YWNoQW5kSm9pbkxhdGVyKG1pY3JvdGFza0JhdGNoRHJpdmVyLCB0ZWxlbWV0cnlDaGFydCwgeyBldmVudDogJ3gnIH0pO1xuICAgKiBhd2FpdCBoYW5kbGUud2FpdCgpOyAvLyBvcHRpb25hbFxuICAgKiBgYGBcbiAgICovXG4gIGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZSB7XG4gICAgcmV0dXJuIF9kZXRhY2hBbmRKb2luTGF0ZXIoZHJpdmVyLCBjaGlsZCwgaW5wdXQsICdfX2V4ZWN1dG9yX18nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmQgRElTQ0FSRCB0aGUgaGFuZGxlLlxuICAgKiBVc2UgZm9yIHRlbGVtZXRyeSBleHBvcnRzIC8gZmlyZS1hbmQtZm9yZ2V0IHNpZGUgZWZmZWN0cyB3aGVyZSB0aGVcbiAgICogY2FsbGVyIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBFcnJvcnMgcmFpc2VkIGJ5IHRoZSBjaGlsZCBzdGlsbCBsYW5kIG9uIHRoZSAoZGlzY2FyZGVkKSBoYW5kbGUg4oCUIHRoZXlcbiAgICogZ28gc2lsZW50IHVubGVzcyBzdXJmYWNlZCB0aHJvdWdoIGEgcmVjb3JkZXIuIEZvciBvYnNlcnZhYmxlIGRldGFjaCxcbiAgICogcHJlZmVyIGBkZXRhY2hBbmRKb2luTGF0ZXJgIGFuZCBzdXJmYWNlIGZhaWx1cmVzIHZpYSBgLndhaXQoKS5jYXRjaCgpYC5cbiAgICovXG4gIGRldGFjaEFuZEZvcmdldChcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiB2b2lkIHtcbiAgICBfZGV0YWNoQW5kRm9yZ2V0KGRyaXZlciwgY2hpbGQsIGlucHV0LCAnX19leGVjdXRvcl9fJyk7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBzY29wZSBSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQg4oCUIGJvdGggZGVsaXZlcnkgdGllcnMuICovXG4gIGRldGFjaFNjb3BlUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMgPSB0aGlzLnNjb3BlUmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gaWQpO1xuICAgIHRoaXMuZGVmZXJyZWRUaWVyPy5yZW1vdmVGcm9tTGlzdHMoaWQsIHsgc2NvcGU6IHRydWUgfSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIHNjb3BlIFJlY29yZGVycyAoYm90aCB0aWVycykuICovXG4gIGdldFNjb3BlUmVjb3JkZXJzKCk6IFNjb3BlUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnNjb3BlUmVjb3JkZXJzLCAuLi4odGhpcy5kZWZlcnJlZFRpZXI/LnNjb3BlTGlzdFJlY29yZGVycygpID8/IFtdKV07XG4gIH1cblxuICAvLyDilIDilIDilIAgRmxvd1JlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIEZsb3dSZWNvcmRlciB0byBvYnNlcnZlIGNvbnRyb2wgZmxvdyBldmVudHMuXG4gICAqIEF1dG9tYXRpY2FsbHkgZW5hYmxlcyBuYXJyYXRpdmUgaWYgbm90IGFscmVhZHkgZW5hYmxlZC5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpIOKAlCByZWNvcmRlcnMgYXJlIHBhc3NlZCB0byB0aGUgdHJhdmVyc2VyIGF0IGNyZWF0aW9uIHRpbWUuXG4gICAqXG4gICAqICoqSWRlbXBvdGVudCBieSBJRDoqKiByZXBsYWNlcyBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgYGlkYC5cbiAgICpcbiAgICogKipEZWxpdmVyeSB0aWVyIChSRkMtMDAxKToqKiBwYXNzIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIGZvclxuICAgKiBuZXh0LWNoZWNrcG9pbnQgZGVsaXZlcnkgb2ZmIHRoZSBob3QgcGF0aCDigJQgc2VlIGBhdHRhY2hTY29wZVJlY29yZGVyYC5cbiAgICovXG4gIGF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlcjogRmxvd1JlY29yZGVyLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgLy8gVGllciBzd2FwLCBib3RoIGRpcmVjdGlvbnM6IGFuIGlkIGxpdmVzIG9uIGV4YWN0bHkgT05FIHRpZXIgcGVyIGxpc3QuXG4gICAgdGhpcy5mbG93UmVjb3JkZXJzID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIHRoaXMubmFycmF0aXZlRW5hYmxlZCA9IHRydWU7XG4gICAgaWYgKG9wdGlvbnM/LmRlbGl2ZXJ5ID09PSAnZGVmZXJyZWQnKSB7XG4gICAgICB0aGlzLmVuc3VyZURlZmVycmVkVGllcihvcHRpb25zKS5yZWdpc3RlcihyZWNvcmRlciwgeyBmbG93OiB0cnVlIH0sIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRlZmVycmVkVGllcj8ucmVtb3ZlRnJvbUxpc3RzKHJlY29yZGVyLmlkLCB7IGZsb3c6IHRydWUgfSk7XG4gICAgdGhpcy5mbG93UmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgRmxvd1JlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRCDigJQgYm90aCBkZWxpdmVyeSB0aWVycy4gKi9cbiAgZGV0YWNoRmxvd1JlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSBpZCk7XG4gICAgdGhpcy5kZWZlcnJlZFRpZXI/LnJlbW92ZUZyb21MaXN0cyhpZCwgeyBmbG93OiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBGbG93UmVjb3JkZXJzIChib3RoIHRpZXJzKS4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVycygpOiBGbG93UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmZsb3dSZWNvcmRlcnMsIC4uLih0aGlzLmRlZmVycmVkVGllcj8uZmxvd0xpc3RSZWNvcmRlcnMoKSA/PyBbXSldO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIENvbWJpbmVkIFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgcmVjb3JkZXIgdGhhdCBtYXkgb2JzZXJ2ZSBtdWx0aXBsZSBldmVudCBzdHJlYW1zIChzY29wZVxuICAgKiBkYXRhLWZsb3csIGNvbnRyb2wtZmxvdywgb3IgYm90aCkuIERldGVjdHMgYXQgcnVudGltZSB3aGljaCBzdHJlYW1zIHRoZVxuICAgKiByZWNvcmRlciBoYXMgbWV0aG9kcyBmb3IgYW5kIHJvdXRlcyBpdCB0byB0aGUgY29ycmVjdCBpbnRlcm5hbCBjaGFubmVscy5cbiAgICpcbiAgICogUHJlZmVycmVkIG92ZXIgY2FsbGluZyBgYXR0YWNoU2NvcGVSZWNvcmRlcmAgYW5kIGBhdHRhY2hGbG93UmVjb3JkZXJgXG4gICAqIHNlcGFyYXRlbHksIGJlY2F1c2UgZm9yZ2V0dGluZyBvbmUgb2YgdGhlIHR3byBpcyBhIHNpbGVudCBmb290LWd1biDigJRcbiAgICogaGFsZiB5b3VyIGV2ZW50cyBuZXZlciBmaXJlIGFuZCB0aGVyZSBpcyBubyBydW50aW1lIHdhcm5pbmcuIFdpdGhcbiAgICogYGF0dGFjaENvbWJpbmVkUmVjb3JkZXJgIHRoZSBsaWJyYXJ5IGd1YXJhbnRlZXMgdGhlIHJlY29yZGVyJ3MgZGVjbGFyZWRcbiAgICogbWV0aG9kcyBhbGwgZmlyZSwgYW5kIGFkZHMgbm8gb3ZlcmhlYWQgdmVyc3VzIHR3byBleHBsaWNpdCBjYWxscy5cbiAgICpcbiAgICogIyMgSWRlbXBvdGVuY3lcbiAgICpcbiAgICogSWRlbXBvdGVudCBieSBgaWRgIGFjcm9zcyBBTEwgY2hhbm5lbHMg4oCUIHJlLWF0dGFjaGluZyB3aXRoIHRoZSBzYW1lIGBpZGBcbiAgICogcmVwbGFjZXMgdGhlIHByZXZpb3VzIGluc3RhbmNlIGV2ZXJ5d2hlcmUgaXQgd2FzIHJlZ2lzdGVyZWQuIE1peGluZ1xuICAgKiBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcih4KWAgd2l0aCBhIHByaW9yIGBhdHRhY2hTY29wZVJlY29yZGVyKHkpYCBvclxuICAgKiBgYXR0YWNoRmxvd1JlY29yZGVyKHkpYCB0aGF0IHNoYXJlIGB4LmlkID09PSB5LmlkYCBpcyBhbHNvIHNhZmU6IHRoZVxuICAgKiBjb21iaW5lZCBhdHRhY2ggcmVwbGFjZXMgdGhlIHNpbmdsZS1jaGFubmVsIHJlZ2lzdHJhdGlvbiBvbiB3aGljaGV2ZXJcbiAgICogY2hhbm5lbChzKSBgeGAgaGFzIG1ldGhvZHMgZm9yLiBObyBkdXBsaWNhdGUgZmlyaW5ncyBvY2N1ci5cbiAgICpcbiAgICogIyMgTmFycmF0aXZlIGFjdGl2YXRpb25cbiAgICpcbiAgICogSWYgdGhlIHJlY29yZGVyIGhhcyBhbnkgY29udHJvbC1mbG93IG1ldGhvZHMsIGBlbmFibGVOYXJyYXRpdmUoKWAgaXNcbiAgICogY2FsbGVkIGFzIGEgc2lkZSBlZmZlY3QgKHRoZSBuYXJyYXRpdmUgc3Vic3lzdGVtIGlzIHJlcXVpcmVkIHRvIGVtaXRcbiAgICogY29udHJvbC1mbG93IGV2ZW50cykuIERhdGEtZmxvdy1vbmx5IHJlY29yZGVycyBkbyBOT1QgYWN0aXZhdGUgdGhlXG4gICAqIG5hcnJhdGl2ZS5cbiAgICpcbiAgICogIyMgRGV0ZWN0aW9uIHJ1bGVcbiAgICpcbiAgICogT25seSAqKm93bioqIGV2ZW50IG1ldGhvZHMgY291bnQgKHNlZSBgaGFzUmVjb3JkZXJNZXRob2RzYCkuIE1ldGhvZHNcbiAgICogaW5oZXJpdGVkIHZpYSB0aGUgcHJvdG90eXBlIGNoYWluIGFyZSBpZ25vcmVkIOKAlCB0aGlzIHByb3RlY3RzIGFnYWluc3RcbiAgICogYWNjaWRlbnRhbCBgT2JqZWN0LnByb3RvdHlwZWAgcG9sbHV0aW9uIGF0dGFjaGluZyBoYW5kbGVycyB5b3UgbmV2ZXJcbiAgICogZGVjbGFyZWQuIEEgcmVjb3JkZXIgdGhhdCBwcm92aWRlcyBvbmx5IGBjbGVhcmAvYHRvU25hcHNob3RgIGlzIGFcbiAgICogbm8tb3AgYW5kIGVtaXRzIGEgZGV2LW1vZGUgd2FybmluZyB0byBzdXJmYWNlIHRoZSBsaWtlbHkgbWlzdGFrZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAgICogICBpZDogJ2F1ZGl0JyxcbiAgICogICBvbldyaXRlOiAoZSkgPT4gbG9nKCdzY29wZSB3cml0ZScsIGUua2V5KSxcbiAgICogICBvbkRlY2lzaW9uOiAoZSkgPT4gbG9nKCdyb3V0ZWQgdG8nLCBlLmNob3NlbiksXG4gICAqIH07XG4gICAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoYXVkaXQpO1xuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXI6IENvbWJpbmVkUmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNEYXRhID0gaGFzUmVjb3JkZXJNZXRob2RzKHJlY29yZGVyKTtcbiAgICBjb25zdCBoYXNGbG93ID0gaGFzRmxvd1JlY29yZGVyTWV0aG9kcyhyZWNvcmRlcik7XG4gICAgY29uc3QgaGFzRW1pdCA9IGhhc0VtaXRSZWNvcmRlck1ldGhvZHMocmVjb3JkZXIpO1xuXG4gICAgLy8gRGVsaXZlcnkgdGllciAoUkZDLTAwMSk6IG9wdGlvbnMgYmFnIE9SIHRoZSByZWNvcmRlcidzIG93blxuICAgIC8vIGBkZWxpdmVyeTogJ2RlZmVycmVkJ2AgZmllbGQuIFRoZSBmaWVsZCBpcyBhIHN0cmluZyDigJQgY2hhbm5lbCByb3V0aW5nXG4gICAgLy8gYWJvdmUgY291bnRzIGV2ZW50LU1FVEhPRCBwcm9wZXJ0aWVzIG9ubHksIHNvIGRlY2xhcmluZyBpdCBuZXZlclxuICAgIC8vIGNoYW5nZXMgd2hpY2ggY2hhbm5lbHMgdGhlIHJlY29yZGVyIGxhbmRzIG9uLlxuICAgIGNvbnN0IGRlbGl2ZXJ5ID0gb3B0aW9ucz8uZGVsaXZlcnkgPz8gcmVjb3JkZXIuZGVsaXZlcnk7XG4gICAgY29uc3QgdGllck9wdGlvbnM6IEF0dGFjaFJlY29yZGVyT3B0aW9ucyB8IHVuZGVmaW5lZCA9IGRlbGl2ZXJ5ID09PSB1bmRlZmluZWQgPyBvcHRpb25zIDogeyAuLi5vcHRpb25zLCBkZWxpdmVyeSB9O1xuXG4gICAgLy8gRW1pdCByZWNvcmRlcnMgbGl2ZSBvbiB0aGUgU0FNRSBjaGFubmVsIGFzIGRhdGEtZmxvdyByZWNvcmRlcnNcbiAgICAvLyAoU2NvcGVGYWNhZGUgaXRlcmF0ZXMgYF9yZWNvcmRlcnNgIGZvciBvbkVtaXQgZGlzcGF0Y2gpLiBTb1xuICAgIC8vIGF0dGFjaEVtaXRSZWNvcmRlciBpbnRlcm5hbGx5IGNhbGxzIGF0dGFjaFNjb3BlUmVjb3JkZXIg4oCUIGJ1dCB3ZSB3YW50IHRvXG4gICAgLy8gYXZvaWQgZG91YmxlLWF0dGFjaCB3aGVuIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIEJPVEggb25FbWl0IEFORFxuICAgIC8vIG90aGVyIFNjb3BlUmVjb3JkZXIgbWV0aG9kcy4gU2hvcnQtY2lyY3VpdDogaWYgaGFzRGF0YSBPUiBoYXNFbWl0LCB0aGVcbiAgICAvLyByZWNvcmRlciBsYW5kcyBvbiB0aGUgc2NvcGUtcmVjb3JkZXIgbGlzdCBleGFjdGx5IG9uY2UuXG4gICAgaWYgKGhhc0RhdGEgfHwgaGFzRW1pdCkgdGhpcy5hdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyIGFzIFNjb3BlUmVjb3JkZXIsIHRpZXJPcHRpb25zKTtcbiAgICBpZiAoaGFzRmxvdykgdGhpcy5hdHRhY2hGbG93UmVjb3JkZXIocmVjb3JkZXIgYXMgRmxvd1JlY29yZGVyLCB0aWVyT3B0aW9ucyk7XG5cbiAgICBpZiAoIWhhc0RhdGEgJiYgIWhhc0Zsb3cgJiYgIWhhc0VtaXQgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgIC8vIERldi1tb2RlIG9ubHk6IHNpbGVudCBza2lwcyBhcmUgaW52aXNpYmxlIGFuZCBwcm9kdWNlIGhhcmQtdG8tZGVidWdcbiAgICAgIC8vIFwid2h5IGRpZG4ndCBteSByZWNvcmRlciBmaXJlXCIgcmVwb3J0cy4gUGVyIGxpYnJhcnkgY29udmVudGlvbiwgZ2F0ZWRcbiAgICAgIC8vIG9uIHRoZSBjZW50cmFsIGlzRGV2TW9kZSgpIGZsYWcgKG5vdCBwcm9jZXNzLmVudikgc28gY29uc3VtZXJzIGNhblxuICAgICAgLy8gY29udHJvbCBkZXYgdG9vbGluZyBjZW50cmFsbHkgdmlhIGVuYWJsZURldk1vZGUoKS9kaXNhYmxlRGV2TW9kZSgpLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRqc10gYXR0YWNoQ29tYmluZWRSZWNvcmRlcjogcmVjb3JkZXIgJyR7cmVjb3JkZXIuaWR9JyBoYXMgYCArXG4gICAgICAgICAgJ25vIG9ic2VydmVyIGV2ZW50IG1ldGhvZHMg4oCUIG5vdGhpbmcgdG8gYXR0YWNoLiBEaWQgeW91IGZvcmdldCB0byAnICtcbiAgICAgICAgICAnYWRkIGFuIG9uKiBoYW5kbGVyIChvbldyaXRlLCBvbkRlY2lzaW9uLCBvblN1YmZsb3dFbnRyeSwgLi4uKT8gJyArXG4gICAgICAgICAgJ05vdGU6IG9ubHkgT1dOIHByb3BlcnRpZXMgY291bnQ7IG1ldGhvZHMgb24gdGhlIHByb3RvdHlwZSBjaGFpbiAnICtcbiAgICAgICAgICAnYXJlIGlnbm9yZWQgb24gcHVycG9zZS4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0YWNoIGEgY29tYmluZWQgcmVjb3JkZXIgZnJvbSBhbGwgY2hhbm5lbHMgaXQgd2FzIGF0dGFjaGVkIHRvLlxuICAgKiBTYWZlIHRvIGNhbGwgaWYgdGhlIHJlY29yZGVyIHdhcyBvbmx5IG9uIG9uZSBjaGFubmVsIG9yIG5ldmVyIGF0dGFjaGVkLlxuICAgKi9cbiAgZGV0YWNoQ29tYmluZWRSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hTY29wZVJlY29yZGVyKGlkKTtcbiAgICB0aGlzLmRldGFjaEZsb3dSZWNvcmRlcihpZCk7XG4gIH1cblxuICAvLyDilIDilIDilIAgRW1pdCBTY29wZVJlY29yZGVyIE1hbmFnZW1lbnQgKFBoYXNlIDMpIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYW4gYEVtaXRSZWNvcmRlcmAg4oCUIGFuIG9ic2VydmVyIGZvciBjb25zdW1lci1lbWl0dGVkIHN0cnVjdHVyZWRcbiAgICogZXZlbnRzIGZpcmVkIHZpYSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgLlxuICAgKlxuICAgKiBJbnRlcm5hbGx5LCBlbWl0IHJlY29yZGVycyBzaGFyZSB0aGUgc2NvcGUtcmVjb3JkZXIgY2hhbm5lbCBiZWNhdXNlXG4gICAqIGVtaXQgZXZlbnRzIGZpcmUgZnJvbSBpbnNpZGUgYFNjb3BlRmFjYWRlYCBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uLFxuICAgKiBzYW1lIHRpbWluZyBhcyBgb25SZWFkYC9gb25Xcml0ZWAuIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgdGhhdFxuICAgKiBkZWxlZ2F0ZXMgdG8gYGF0dGFjaFNjb3BlUmVjb3JkZXJgIOKAlCBjb25zdW1lcnMgY2FuIGFsc28gdXNlXG4gICAqIGBhdHRhY2hTY29wZVJlY29yZGVyYCBkaXJlY3RseSBmb3IgYSByZWNvcmRlciB0aGF0IGltcGxlbWVudHMgQk9USFxuICAgKiBgb25Xcml0ZWAgYW5kIGBvbkVtaXRgLiBFaXRoZXIgYXBwcm9hY2ggcGxhY2VzIHRoZSByZWNvcmRlciBvbiB0aGVcbiAgICogc2FtZSB1bmRlcmx5aW5nIGxpc3QsIHNvIGBvbkVtaXRgIGZpcmVzIGV4YWN0bHkgb25jZSBwZXIgZXZlbnQuXG4gICAqXG4gICAqICoqSWRlbXBvdGVudCBieSBgaWRgOioqIHJlcGxhY2VzIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBgaWRgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGV4ZWN1dG9yLmF0dGFjaEVtaXRSZWNvcmRlcih7XG4gICAqICAgaWQ6ICd0b2tlbi1tZXRlcicsXG4gICAqICAgb25FbWl0OiAoZSkgPT4ge1xuICAgKiAgICAgaWYgKGUubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LmxsbS50b2tlbnMnKSB0cmFja1Rva2VucyhlLnBheWxvYWQpO1xuICAgKiAgIH0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaEVtaXRSZWNvcmRlcihyZWNvcmRlcjogRW1pdFJlY29yZGVyLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5hdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyIGFzIFNjb3BlUmVjb3JkZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbiBgRW1pdFJlY29yZGVyYCBieSBpZC4gU2FmZSB0byBjYWxsIGlmIG5ldmVyIGF0dGFjaGVkLiAqL1xuICBkZXRhY2hFbWl0UmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoU2NvcGVSZWNvcmRlcihpZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIHJlY29yZGVycyAoYm90aCBkZWxpdmVyeSB0aWVycylcbiAgICogZmlsdGVyZWQgdG8gdGhvc2UgdGhhdCBpbXBsZW1lbnQgYG9uRW1pdGAuIFVzZWZ1bCBmb3IgaW5zcGVjdGlvbiBkdXJpbmdcbiAgICogdGVzdGluZy5cbiAgICovXG4gIGdldEVtaXRSZWNvcmRlcnMoKTogRW1pdFJlY29yZGVyW10ge1xuICAgIHJldHVybiB0aGlzLmdldFNjb3BlUmVjb3JkZXJzKCkuZmlsdGVyKFxuICAgICAgKHIpOiByIGlzIEVtaXRSZWNvcmRlciA9PiB0eXBlb2YgKHIgYXMgeyBvbkVtaXQ/OiB1bmtub3duIH0pLm9uRW1pdCA9PT0gJ2Z1bmN0aW9uJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc3RydWN0dXJlZCBuYXJyYXRpdmUgZW50cmllcyDigJQgdGhlIHNpbmdsZSBwdWJsaWMgbmFycmF0aXZlIEFQSS5cbiAgICogRWFjaCBlbnRyeSBoYXMgYSB0eXBlIChzdGFnZSwgc3RlcCwgY29uZGl0aW9uLCBmb3JrLCBldGMuKSwgdGV4dCwgYW5kXG4gICAqIGRlcHRoLiBDb25zdW1lcnMgcmVuZGVyIGhvd2V2ZXIgdGhleSB3YW50OyBjYWxsIGAubWFwKGUgPT4gZS50ZXh0KWBcbiAgICogaWYgYSBmbGF0IGBzdHJpbmdbXWAgaXMgbmVlZGVkIGxvY2FsbHkuXG4gICAqL1xuICBnZXROYXJyYXRpdmVFbnRyaWVzKCk6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSB7XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWRSZWNvcmRlci5nZXRFbnRyaWVzKCk7XG4gICAgfVxuICAgIGNvbnN0IGZsb3dTZW50ZW5jZXMgPSB0aGlzLnRyYXZlcnNlci5nZXROYXJyYXRpdmUoKTtcbiAgICByZXR1cm4gZmxvd1NlbnRlbmNlcy5tYXAoKHRleHQpID0+ICh7IHR5cGU6ICdzdGFnZScgYXMgY29uc3QsIHRleHQsIGRlcHRoOiAwIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21iaW5lZCBGbG93UmVjb3JkZXJzIGxpc3QuIFdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQsXG4gICAqIGluY2x1ZGVzIHRoZSBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyICh3aGljaCBidWlsZHMgbWVyZ2VkIGZsb3crZGF0YVxuICAgKiBlbnRyaWVzIGlubGluZSkuIFBsdXMgYW55IHVzZXItYXR0YWNoZWQgcmVjb3JkZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEZsb3dSZWNvcmRlcnNMaXN0KCk6IEZsb3dSZWNvcmRlcltdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmRlcnM6IEZsb3dSZWNvcmRlcltdID0gW107XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmVjb3JkZXJzLnB1c2godGhpcy5jb21iaW5lZFJlY29yZGVyKTtcbiAgICB9XG4gICAgcmVjb3JkZXJzLnB1c2goLi4udGhpcy5mbG93UmVjb3JkZXJzKTtcbiAgICAvLyBEZWZlcnJlZC1vYnNlcnZlciBmbG93IHRhcCAoUkZDLTAwMSBCbG9jayA3KSDigJQgY2FwdHVyZXMgZXZlcnkgZmxvd1xuICAgIC8vIGV2ZW50IGZvciBkZWZlcnJlZCBsaXN0ZW5lcnMuIEFwcGVuZGVkIGxpa2UgYW55IG90aGVyIGZsb3cgcmVjb3JkZXIsXG4gICAgLy8gc28gdGhlIEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgc2l0ZSBuZWVkcyBubyB0aWVyIGxvZ2ljIG9mIGl0cyBvd24uXG4gICAgY29uc3QgZmxvd1RhcCA9IHRoaXMuZGVmZXJyZWRUaWVyPy5idWlsZEZsb3dUYXAoKTtcbiAgICBpZiAoZmxvd1RhcCkgcmVjb3JkZXJzLnB1c2goZmxvd1RhcCk7XG4gICAgcmV0dXJuIHJlY29yZGVycy5sZW5ndGggPiAwID8gcmVjb3JkZXJzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgYXN5bmMgcnVuKG9wdGlvbnM/OiBSdW5PcHRpb25zKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIC8vIFJlLWVudHJhbmN5IGd1YXJkIEZJUlNUIOKAlCBiZWZvcmUgY2xlYXJpbmcgcmVjb3JkZXJzIG9yIHRvdWNoaW5nIGFueVxuICAgIC8vIHBlci1ydW4gZmllbGQsIHNvIGEgcmVqZWN0ZWQgY29uY3VycmVudCBjYWxsIGxlYXZlcyB0aGUgaW4tZmxpZ2h0IHJ1blxuICAgIC8vIGNvbXBsZXRlbHkgdW50b3VjaGVkLlxuICAgIGlmICh0aGlzLl9pc0V4ZWN1dGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRmxvd0NoYXJ0RXhlY3V0b3I6IHJ1bigpIGNhbGxlZCB3aGlsZSBhbm90aGVyIHJ1bigpL3Jlc3VtZSgpIGlzIGluIGZsaWdodCBvbiB0aGlzICcgK1xuICAgICAgICAgICdleGVjdXRvci4gQW4gZXhlY3V0b3IgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycywgY2hlY2twb2ludCkg4oCUIGNyZWF0ZSAnICtcbiAgICAgICAgICAnb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi4gU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgaW5wdXQgYWdhaW5zdCBpbnB1dFNjaGVtYSBpZiBib3RoIGFyZSBwcmVzZW50LiBWYWxpZGF0aW9uIHJ1bnNcbiAgICAvLyBCRUZPUkUgdGhlIHRpbWVvdXQgdGltZXIgaXMgY3JlYXRlZCBzbyBhIHJlamVjdGVkIGlucHV0IGNhbid0IGxlYWsgYVxuICAgIC8vIHBlbmRpbmcgdGltZXIgKHNhbWUgXCJmYWlsZWQgZW50cnkgbGVhdmVzIG5vIHNpZGUgZWZmZWN0c1wiIHJ1bGUgYXMgdGhlXG4gICAgLy8gcmUtZW50cmFuY3kgZ3VhcmQgYWJvdmUpLlxuICAgIGxldCB2YWxpZGF0ZWRJbnB1dCA9IG9wdGlvbnM/LmlucHV0O1xuICAgIGlmICh2YWxpZGF0ZWRJbnB1dCAmJiB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hKSB7XG4gICAgICB2YWxpZGF0ZWRJbnB1dCA9IHZhbGlkYXRlSW5wdXQodGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5pbnB1dFNjaGVtYSwgdmFsaWRhdGVkSW5wdXQpO1xuICAgIH1cblxuICAgIGxldCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgbGV0IHRpbWVvdXRJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW50ZXJuYWwgQWJvcnRDb250cm9sbGVyIGZvciB0aW1lb3V0TXNcbiAgICBpZiAob3B0aW9ucz8udGltZW91dE1zICYmICFzaWduYWwpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBzaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbDtcbiAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IGNvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKGBFeGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7b3B0aW9ucy50aW1lb3V0TXN9bXNgKSksXG4gICAgICAgIG9wdGlvbnMudGltZW91dE1zLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBVc2VyLWF0dGFjaGVkIHJlY29yZGVycyAoZmxvd1JlY29yZGVycyArIHNjb3BlUmVjb3JkZXJzKSBhcmUgY2xlYXJlZCB2aWEgY2xlYXIoKSB0byBwcmV2ZW50XG4gICAgLy8gY3Jvc3MtcnVuIGFjY3VtdWxhdGlvbi4gVGhlIGNvbWJpbmVkUmVjb3JkZXIgaXMgTk9UIGNsZWFyZWQgaGVyZSDigJQgY3JlYXRlVHJhdmVyc2VyKCkgYWx3YXlzXG4gICAgLy8gY3JlYXRlcyBhIGZyZXNoIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgaW5zdGFuY2Ugb24gZWFjaCBydW4sIHNvIHN0YWxlIHN0YXRlIGlzIG5ldmVyIGFuIGlzc3VlLlxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgIHIuY2xlYXI/LigpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykge1xuICAgICAgci5jbGVhcj8uKCk7XG4gICAgfVxuICAgIHRoaXMuZGVmZXJyZWRUaWVyPy5jbGVhclJlY29yZGVycygpO1xuXG4gICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9OyAvLyBSZXNldCBjb3VudGVyIG9uIGZyZXNoIHJ1blxuICAgIHRoaXMuX2N1cnJlbnRSdW5JZCA9IGdlbmVyYXRlUnVuSWQoKTsgLy8gRnJlc2ggcnVuSWQgcGVyIHJ1bigpIGNhbGxcbiAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBtYXJrIHNvIGEgbGF0ZXIgcmVzdW1lKCkgdGFrZXMgdGhlXG4gICAgLy8gc2FtZS1leGVjdXRvciBicmFuY2ggKHJldXNlIHJ1bnRpbWUsIGFjY3VtdWxhdGUgZXhlY3V0aW9uIHRyZWUpLlxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoXG4gICAgICBzaWduYWwsXG4gICAgICB2YWxpZGF0ZWRJbnB1dCxcbiAgICAgIG9wdGlvbnM/LmVudixcbiAgICAgIG9wdGlvbnM/Lm1heERlcHRoLFxuICAgICAgb3B0aW9ucz8ubWF4SXRlcmF0aW9ucyxcbiAgICApO1xuICAgIC8vIFNldCBBRlRFUiBhbGwgc3luYyB2YWxpZGF0aW9uIHRocm93cyAobm90aGluZyBhYm92ZSBjYW4gbGVhayB0aGUgZmxhZyk7XG4gICAgLy8gbm8gYXdhaXQgYmV0d2VlbiB0aGUgdG9wLW9mLW1ldGhvZCBjaGVjayBhbmQgaGVyZSwgc28gdGhpcyBpcyByYWNlLWZyZWUuXG4gICAgdGhpcy5faXNFeGVjdXRpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgICAvLyBUZXJtaW5hbCBmbHVzaCAoUkZDLTAwMSBCbG9jayA4KSBhdCB0aGUgUkVTT0xWRSBib3VuZGFyeTogZXZlcnlcbiAgICAgIC8vIGNhcHR1cmVkLWJ1dC11bmRlbGl2ZXJlZCBvYnNlcnZlciBldmVudCBpcyBkZWxpdmVyZWQgc3luY2hyb25vdXNseVxuICAgICAgLy8gYmVmb3JlIHJ1bigpIHJldHVybnMg4oCUIFwib25lIGJlYXQgYmVoaW5kXCIgbmV2ZXIgYmVjb21lcyBcImxvc3QgYXQgZXhpdFwiLlxuICAgICAgdGhpcy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFRlcm1pbmFsIGZsdXNoIGF0IHRoZSBQQVVTRSBhbmQgUkVKRUNUIGJvdW5kYXJpZXMg4oCUIHRoaXMgaXMgdGhlXG4gICAgICAvLyBPVVRFUk1PU1QgaGFuZGxlciAoYSBwYXVzZSByZS10aHJvd3MgdGhyb3VnaCBzdWJmbG93IHRyYXZlcnNlcnNcbiAgICAgIC8vIHdpdGhvdXQgZXhpdCBldmVudHMsIHNvIHBlci10cmF2ZXJzZXIgaG9va3Mgd291bGQgbWlzcyBpdCkuIFJ1bnNcbiAgICAgIC8vIGJlZm9yZSB0aGUgY2hlY2twb2ludCBpcyBleHBvc2VkIGFuZCBiZWZvcmUgdGhlIGVycm9yIHJlYWNoZXMgdGhlXG4gICAgICAvLyBjYWxsZXIuXG4gICAgICB0aGlzLmRlZmVycmVkVGllcj8udGVybWluYWxGbHVzaCgpO1xuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIC8vIEJ1aWxkIGEgZGV0YWNoZWQgY2hlY2twb2ludCBmcm9tIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlIOKAlCBzZWVcbiAgICAgICAgLy8gYnVpbGRQYXVzZUNoZWNrcG9pbnQoKSBmb3IgdGhlIGRlZXAtY29weSByYXRpb25hbGUuXG4gICAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB0aGlzLmJ1aWxkUGF1c2VDaGVja3BvaW50KGVycm9yKTtcbiAgICAgICAgLy8gUmV0dXJuIGEgUGF1c2VSZXN1bHQtc2hhcGVkIHZhbHVlIHNvIGNhbGxlcnMgY2FuIGNoZWNrIHdpdGhvdXQgdHJ5L2NhdGNoXG4gICAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHRoZSBkZWZlcnJlZC1vYnNlcnZlciBiYWNrbG9nLCB0aGVuIGF3YWl0IGFzeW5jIGxpc3RlbmVyXG4gICAqIGNvbXBsZXRpb25zIHVuZGVyIGEgZGVhZGxpbmUgKFJGQy0wMDEgQmxvY2sgOCDigJQgdGhlIHNlcnZlcmxlc3MgL1xuICAgKiBncmFjZWZ1bC1zaHV0ZG93biBwYXR0ZXJuOiBjYWxsIGJlZm9yZSB0aGUgcHJvY2VzcyBmcmVlemVzIG9yIGV4aXRzIHNvXG4gICAqIFwib25lIGJlYXQgYmVoaW5kXCIgd29yayBpcyBub3QgbG9zdCkuIFJlc29sdmVzIGltbWVkaWF0ZWx5IHdpdGggemVyb3NcbiAgICogd2hlbiBubyBkZWZlcnJlZCBvYnNlcnZlciB3YXMgZXZlciBhdHRhY2hlZC4gYHBlbmRpbmcgPT09IDBgIG1lYW5zIGFcbiAgICogZnVsbCBkcmFpbjsgYSBub24temVybyBgcGVuZGluZ2AgcmVwb3J0cyBjb250aW51YXRpb25zIChwbHVzIGFueSBxdWV1ZWRcbiAgICogZXZlbnRzKSBzdGlsbCBvdXRzdGFuZGluZyBhdCB0aGUgZGVhZGxpbmUg4oCUIGhvbmVzdCwgbmV2ZXIgc2lsZW50LlxuICAgKi9cbiAgZHJhaW5PYnNlcnZlcnMob3B0cz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPE9ic2VydmVyRHJhaW5SZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuZGVmZXJyZWRUaWVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogMCwgZmFpbGVkOiAwLCBwZW5kaW5nOiAwIH0pO1xuICAgIHJldHVybiB0aGlzLmRlZmVycmVkVGllci5kcmFpbihvcHRzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRyb3NwZWN0aW9uIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRhY3QgIFdoZW4gYHRydWVgLCBgc2hhcmVkU3RhdGVgIGNvbWVzIGZyb20gdGhlIHBhcmFsbGVsXG4gICAqICAgcmVkYWN0ZWQgbWlycm9yIChpZiBtYWludGFpbmVkIOKAlCBzZWUgYHNldFJlZGFjdGlvblBvbGljeWApLiBUaGlzIGlzXG4gICAqICAgdGhlIHNhZmUgdmlldyBmb3IgZXhwb3J0aW5nIHRyYWNlcyBleHRlcm5hbGx5IChwYXN0ZSBpbnRvIGEgdmlld2VyLFxuICAgKiAgIHNoYXJlIHdpdGggc3VwcG9ydCkuIFdoZW4gbm8gcmVkYWN0aW9uIHBvbGljeSBpcyBjb25maWd1cmVkIHRoZVxuICAgKiAgIHJlZGFjdGVkIG1pcnJvciBpcyBub3QgbWFpbnRhaW5lZCwgc28gdGhpcyBmbGFnIGlzIGEgbm8tb3Ag4oCUXG4gICAqICAgYHNoYXJlZFN0YXRlYCBpcyB0aGUgcmF3IHdvcmtpbmcgbWVtb3J5IGVpdGhlciB3YXkuIERlZmF1bHQgYGZhbHNlYC5cbiAgICpcbiAgICogICBUaGUgY29tbWl0IGxvZyBpcyBhbHJlYWR5IHJlZGFjdGVkIGF0IHdyaXRlLXRpbWUgcmVnYXJkbGVzcyBvZiB0aGlzXG4gICAqICAgZmxhZywgYW5kIHRoZSBleGVjdXRpb24gdHJlZSBjYXJyaWVzIG9ubHkgc3RydWN0dXJhbCBtZXRhZGF0YS5cbiAgICpcbiAgICogKipUcmVhdCBgc2hhcmVkU3RhdGVgIGFzIFJFQUQtT05MWS4qKiBJbiBwcm9kdWN0aW9uIGl0IGlzIGEgbGl2ZSB2aWV3IG9mXG4gICAqIHRoZSBlbmdpbmUncyB3b3JraW5nIG1lbW9yeSAoemVybyBjb3B5IGNvc3QpIOKAlCBtdXRhdGluZyBpdCBjb3JydXB0c1xuICAgKiBlbmdpbmUgc3RhdGUuIEluIGRldiBtb2RlIChgZW5hYmxlRGV2TW9kZSgpYCkgaXQgaXMgYSBkZWVwLWZyb3plbiBDTE9ORSxcbiAgICogc28gYW55IGNvbnN1bWVyIG11dGF0aW9uIHRocm93cyBsb3VkbHkgaW5zdGVhZCBvZiBjb3JydXB0aW5nIHNpbGVudGx5LlxuICAgKi9cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KTogUnVudGltZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudHJhdmVyc2VyLmdldFNuYXBzaG90KG9wdGlvbnMpIGFzIFJ1bnRpbWVTbmFwc2hvdDtcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgIC8vIERldi1tb2RlIG11dGF0aW9uIGd1YXJkOiBmcmVlemUgYSBDTE9ORSwgbmV2ZXIgdGhlIGxpdmUgZW5naW5lXG4gICAgICAvLyBzdGF0ZSDigJQgYHNuYXBzaG90LnNoYXJlZFN0YXRlYCBhbGlhc2VzIFNoYXJlZE1lbW9yeSdzIGludGVybmFsXG4gICAgICAvLyBjb250ZXh0IHVudGlsIHRoZSBuZXh0IGNvbW1pdCByZWJ1aWxkcyBpdCAocG9zdC1ydW46IGZvcmV2ZXIpLlxuICAgICAgLy8gUHJvZHVjdGlvbiBzdGF5cyB6ZXJvLWNvcHk7IGNsb25lLWFsd2F5cyBpcyBhIG1lYXN1cmVkIGRlY2lzaW9uXG4gICAgICAvLyBkZWZlcnJlZCB1bnRpbCB0aGUgYmVuY2ggc2F5cyBpdCdzIGFmZm9yZGFibGUgKEJBQ0tMT0cgIzgpLlxuICAgICAgLy8gTk9URTogZGVlcEZyZWV6ZSAocmV1c2VkIGZyb20gcmVhZG9ubHlJbnB1dCkgZnJlZXplcyBwbGFpbiBvYmplY3RzL1xuICAgICAgLy8gYXJyYXlzIG9ubHkg4oCUIE1hcC9TZXQgSU5URVJOQUxTIHN0YXkgbXV0YWJsZSAoYG1hcC5zZXQoKWAgb24gdGhlXG4gICAgICAvLyBmcm96ZW4gY2xvbmUgd29uJ3QgdGhyb3cpLiBUaGUgQ0xPTkUgc3RpbGwgaXNvbGF0ZXMgdGhlIGVuZ2luZS5cbiAgICAgIHNuYXBzaG90LnNoYXJlZFN0YXRlID0gZGVlcEZyZWV6ZShzdHJ1Y3R1cmVkQ2xvbmUoc25hcHNob3Quc2hhcmVkU3RhdGUpKTtcbiAgICB9XG4gICAgY29uc3Qgc2ZSZXN1bHRzID0gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgICBpZiAoc2ZSZXN1bHRzLnNpemUgPiAwKSB7XG4gICAgICBzbmFwc2hvdC5zdWJmbG93UmVzdWx0cyA9IE9iamVjdC5mcm9tRW50cmllcyhzZlJlc3VsdHMpO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3Qgc25hcHNob3QgZGF0YSBmcm9tIHJlY29yZGVycyB0aGF0IGltcGxlbWVudCB0b1NuYXBzaG90KClcbiAgICBjb25zdCByZWNvcmRlclNuYXBzaG90czogUmVjb3JkZXJTbmFwc2hvdFtdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHtcbiAgICAgIGlmIChyLnRvU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgc25hcCA9IHIudG9TbmFwc2hvdCgpO1xuICAgICAgICByZWNvcmRlclNuYXBzaG90cy5wdXNoKHtcbiAgICAgICAgICBpZDogci5pZCxcbiAgICAgICAgICBuYW1lOiBzbmFwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHNuYXAuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiBzbmFwLnByZWZlcnJlZE9wZXJhdGlvbixcbiAgICAgICAgICBkYXRhOiBzbmFwLmRhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICBpZiAoci50b1NuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IHNuYXAgPSByLnRvU25hcHNob3QoKTtcbiAgICAgICAgcmVjb3JkZXJTbmFwc2hvdHMucHVzaCh7XG4gICAgICAgICAgaWQ6IHIuaWQsXG4gICAgICAgICAgbmFtZTogc25hcC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBzbmFwLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogc25hcC5wcmVmZXJyZWRPcGVyYXRpb24sXG4gICAgICAgICAgZGF0YTogc25hcC5kYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZGVmZXJyZWRUaWVyKSB7XG4gICAgICAvLyBEZWZlcnJlZCByZWNvcmRlcnMgYXJlIGF0dGFjaGVkIG9ic2VydmVycyB0b28g4oCUIGNvbGxlY3QgdGhlaXJcbiAgICAgIC8vIHNuYXBzaG90cyBvbmNlIHBlciBpZCAoYSBjb21iaW5lZCByZWNvcmRlciByZWdpc3RlcnMgb25jZSBpbiB0aGVcbiAgICAgIC8vIHRpZXIsIHVubGlrZSB0aGUgdHdvIGlubGluZSBsaXN0cykuXG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgWy4uLnRoaXMuZGVmZXJyZWRUaWVyLnNjb3BlTGlzdFJlY29yZGVycygpLCAuLi50aGlzLmRlZmVycmVkVGllci5mbG93TGlzdFJlY29yZGVycygpXSkge1xuICAgICAgICBpZiAoc2Vlbi5oYXMoci5pZCkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZChyLmlkKTtcbiAgICAgICAgaWYgKHIudG9TbmFwc2hvdCkge1xuICAgICAgICAgIGNvbnN0IHNuYXAgPSByLnRvU25hcHNob3QoKTtcbiAgICAgICAgICByZWNvcmRlclNuYXBzaG90cy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiByLmlkLFxuICAgICAgICAgICAgbmFtZTogc25hcC5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHNuYXAuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwcmVmZXJyZWRPcGVyYXRpb246IHNuYXAucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgICAgICAgICAgZGF0YTogc25hcC5kYXRhLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWNvcmRlclNuYXBzaG90cy5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5yZWNvcmRlcnMgPSByZWNvcmRlclNuYXBzaG90cztcbiAgICB9XG5cbiAgICAvLyBSRkMtMDAxIEJsb2NrIDk6IHRoZSBkZWZlcnJlZC1vYnNlcnZlciBhY2NvdW50aW5nIHN1cmZhY2UuIFByZXNlbnRcbiAgICAvLyBPTkxZIHdoZW4gYSBkZWZlcnJlZCBvYnNlcnZlciB3YXMgYXR0YWNoZWQgb24gdGhpcyBleGVjdXRvciDigJRcbiAgICAvLyB6ZXJvLWNvc3QgZGlzY2lwbGluZSBmb3IgZXZlcnlvbmUgZWxzZS5cbiAgICBpZiAodGhpcy5kZWZlcnJlZFRpZXIpIHtcbiAgICAgIHNuYXBzaG90Lm9ic2VydmVyU3RhdHMgPSB0aGlzLmRlZmVycmVkVGllci5nZXRTdGF0cygpO1xuICAgIH1cblxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnRyYXZlcnNlci5zZXRSb290T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRCcmFuY2hJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEJyYW5jaElkcygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lUm9vdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1YmZsb3cgbWFuaWZlc3QgZnJvbSBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlci5cbiAgICogUmV0dXJucyBlbXB0eSBhcnJheSBpZiBubyBNYW5pZmVzdEZsb3dSZWNvcmRlciBpcyBhdHRhY2hlZC5cbiAgICovXG4gIGdldFN1YmZsb3dNYW5pZmVzdCgpOiBNYW5pZmVzdEVudHJ5W10ge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0TWFuaWZlc3QoKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIHNwZWMgZm9yIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBzdWJmbG93LlxuICAgKiBSZXF1aXJlcyBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlciB0aGF0IG9ic2VydmVkIHRoZSByZWdpc3RyYXRpb24uXG4gICAqL1xuICBnZXRTdWJmbG93U3BlYyhzdWJmbG93SWQ6IHN0cmluZyk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0U3BlYyhzdWJmbG93SWQpO1xuICB9XG59XG4iXX0=
|