footprintjs 9.34.0 → 9.36.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 -2
- package/dist/advanced.js +41 -38
- package/dist/esm/advanced.d.ts +3 -0
- package/dist/esm/advanced.js +2 -1
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +0 -12
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +19 -86
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
- package/dist/esm/lib/engine/narrative/types.d.ts +1 -9
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/types.d.ts +6 -7
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.d.ts +36 -102
- package/dist/esm/lib/memory/StageContext.js +57 -145
- package/dist/esm/lib/memory/index.d.ts +2 -0
- package/dist/esm/lib/memory/index.js +2 -1
- package/dist/esm/lib/memory/runPolicy.d.ts +150 -0
- package/dist/esm/lib/memory/runPolicy.js +69 -0
- package/dist/esm/lib/recorder/CombinedRecorder.d.ts +2 -33
- package/dist/esm/lib/recorder/CombinedRecorder.js +10 -62
- package/dist/esm/lib/recorder/CompositeRecorder.d.ts +15 -26
- package/dist/esm/lib/recorder/CompositeRecorder.js +33 -97
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +2 -7
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/hooks.d.ts +249 -0
- package/dist/esm/lib/recorder/hooks.js +132 -0
- package/dist/esm/lib/recorder/snapshot.d.ts +19 -0
- package/dist/esm/lib/recorder/snapshot.js +26 -0
- package/dist/esm/lib/runner/DeferredObserverTier.js +13 -23
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +33 -64
- package/dist/esm/lib/runner/ExecutionRuntime.js +52 -92
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +10 -98
- package/dist/esm/lib/runner/FlowChartExecutor.js +48 -88
- package/dist/esm/lib/scope/ScopeFacade.d.ts +5 -0
- package/dist/esm/lib/scope/ScopeFacade.js +30 -52
- package/dist/esm/lib/scope/types.d.ts +1 -9
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/engine/handlers/SubflowExecutor.js +19 -86
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +57 -145
- package/dist/lib/memory/index.js +5 -2
- package/dist/lib/memory/runPolicy.js +76 -0
- package/dist/lib/recorder/CombinedRecorder.js +11 -63
- package/dist/lib/recorder/CompositeRecorder.js +33 -97
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/hooks.js +140 -0
- package/dist/lib/recorder/snapshot.js +30 -0
- package/dist/lib/runner/DeferredObserverTier.js +14 -24
- package/dist/lib/runner/ExecutionRuntime.js +52 -92
- package/dist/lib/runner/FlowChartExecutor.js +48 -88
- package/dist/lib/scope/ScopeFacade.js +30 -52
- package/dist/lib/scope/types.js +1 -1
- package/dist/types/advanced.d.ts +3 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +0 -12
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
- package/dist/types/lib/engine/narrative/types.d.ts +1 -9
- package/dist/types/lib/engine/types.d.ts +6 -7
- package/dist/types/lib/memory/StageContext.d.ts +36 -102
- package/dist/types/lib/memory/index.d.ts +2 -0
- package/dist/types/lib/memory/runPolicy.d.ts +150 -0
- package/dist/types/lib/recorder/CombinedRecorder.d.ts +2 -33
- package/dist/types/lib/recorder/CompositeRecorder.d.ts +15 -26
- package/dist/types/lib/recorder/EmitRecorder.d.ts +2 -7
- package/dist/types/lib/recorder/hooks.d.ts +249 -0
- package/dist/types/lib/recorder/snapshot.d.ts +19 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +33 -64
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +10 -98
- package/dist/types/lib/scope/ScopeFacade.d.ts +5 -0
- package/dist/types/lib/scope/types.d.ts +1 -9
- package/package.json +1 -1
- package/dist/esm/lib/recorder/invokeHook.d.ts +0 -8
- package/dist/esm/lib/recorder/invokeHook.js +0 -9
- package/dist/lib/recorder/invokeHook.js +0 -13
- package/dist/types/lib/recorder/invokeHook.d.ts +0 -8
|
@@ -124,20 +124,15 @@ export class SubflowExecutor {
|
|
|
124
124
|
throw error;
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
|
-
// The run's
|
|
128
|
-
//
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
// dials are. When it does, the nested runtime keeps a mirror of its own,
|
|
137
|
-
// so the subflow's SERVED state is a mirror too — the fold of its own
|
|
138
|
-
// scrubbed log — and never a second scrub. No policy: no mirror, no
|
|
139
|
-
// allocation, and the served state is the raw heap it always was.
|
|
140
|
-
const keepsMirror = parentContext.getRedactedSharedMemory?.() !== undefined;
|
|
127
|
+
// The run's policy (F5) — the four dials, the redaction rule, the mirror
|
|
128
|
+
// flag — read off the parent-mount frame, which holds it by reference.
|
|
129
|
+
// The nested runtime is constructed WITH it, so the seed commit below
|
|
130
|
+
// (`history[0]`) and every later commit of the subflow run under the same
|
|
131
|
+
// object, and the nested runtime keeps a mirror of its own exactly when
|
|
132
|
+
// the run does (its SERVED state is then the fold of its own scrubbed
|
|
133
|
+
// log, never a second scrub).
|
|
134
|
+
const policy = parentContext.getPolicy();
|
|
135
|
+
const redactionRule = policy.redaction;
|
|
141
136
|
// Narrative receives the RETAINED form of the mapped input — an
|
|
142
137
|
// inputMapper may inject values from anywhere, so the seed is scrubbed
|
|
143
138
|
// under the policy before any recorder sees it. Same object when nothing
|
|
@@ -161,8 +156,7 @@ export class SubflowExecutor {
|
|
|
161
156
|
// resume hop's entry on a re-entry, the subflow's root otherwise.
|
|
162
157
|
const ExecutionRuntimeClass = this.deps.executionRuntime.constructor;
|
|
163
158
|
const firstNode = resumeHop?.entry ?? node;
|
|
164
|
-
const nestedRuntime = new ExecutionRuntimeClass(firstNode.name, firstNode.id);
|
|
165
|
-
let nestedRootContext = nestedRuntime.rootStageContext;
|
|
159
|
+
const nestedRuntime = new ExecutionRuntimeClass(firstNode.name, firstNode.id, undefined, undefined, policy);
|
|
166
160
|
// Seed GlobalStore with the right shape for the path:
|
|
167
161
|
// • Resume into THIS subflow → seed from the captured pre-pause
|
|
168
162
|
// scope so resume handlers see history, pausedToolCallId, etc.
|
|
@@ -171,10 +165,11 @@ export class SubflowExecutor {
|
|
|
171
165
|
const seedValues = isResumeForThisSubflow ? resumeCapture : mappedInput;
|
|
172
166
|
if (Object.keys(seedValues).length > 0) {
|
|
173
167
|
// The seed is committed as the subflow's `history[0]` by its root
|
|
174
|
-
// context, not by a facade —
|
|
175
|
-
//
|
|
176
|
-
//
|
|
177
|
-
|
|
168
|
+
// context, not by a facade — that frame already holds the run's policy
|
|
169
|
+
// (the runtime was constructed with it), so the seed retains under the
|
|
170
|
+
// rule, lands in the mirror as the placeholder, and commits under the
|
|
171
|
+
// run's dials like every other write (C-F5: under `writeProvenance:
|
|
172
|
+
// 'reads-prefix'` its rows carry `readKeys: []`).
|
|
178
173
|
// The seed is the mount's act too: its bundle — `history[0]` of the
|
|
179
174
|
// subflow's own log — carries the mount's stage, stageId and
|
|
180
175
|
// runtimeStageId (R13; through 9.33.0 it carried runtimeStageId '' and
|
|
@@ -182,51 +177,9 @@ export class SubflowExecutor {
|
|
|
182
177
|
seedSubflowGlobalStore(nestedRuntime, seedValues, parentContext);
|
|
183
178
|
// Refresh rootStageContext so WriteBuffer sees committed data. Named
|
|
184
179
|
// after the first node again — the seed context now carries the mount's
|
|
185
|
-
// names (R13), which belong to the seed bundle only.
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
nestedRuntime.rootStageContext = nestedRootContext;
|
|
189
|
-
}
|
|
190
|
-
// Read-tracking policy (#14): subflows get an ISOLATED runtime, so the
|
|
191
|
-
// executor-level policy doesn't reach them via the root context chain.
|
|
192
|
-
// Inherit it from the parent-mount context (which inherited it from ITS
|
|
193
|
-
// root via createNext/createChild) — applied to the FINAL nested root,
|
|
194
|
-
// after the seeding block above may have replaced it. Nested subflows
|
|
195
|
-
// chain the same way, one hop per mount. Optional-chained because this
|
|
196
|
-
// section is duck-typed by design (dynamic construction to avoid the
|
|
197
|
-
// circular import) — and skipped at the default 'full', where the fresh
|
|
198
|
-
// nested context is already correct, so the default path does zero work.
|
|
199
|
-
const parentReadTracking = parentContext.getReadTracking?.();
|
|
200
|
-
if (parentReadTracking !== undefined && parentReadTracking !== 'full') {
|
|
201
|
-
nestedRootContext.useReadTracking(parentReadTracking);
|
|
202
|
-
}
|
|
203
|
-
// Redaction rule (9.19.0) and mirror (9.20.0): same hop as the dials,
|
|
204
|
-
// applied to the FINAL nested root (the seeding block above may have
|
|
205
|
-
// replaced it) so every stage context the subflow creates inherits both.
|
|
206
|
-
this.inheritRedaction(nestedRuntime, nestedRootContext, redactionRule, keepsMirror);
|
|
207
|
-
// Write-tracking policy (#13c-A): same inheritance hop as readTracking
|
|
208
|
-
// above — subflow runtimes are isolated, so the parent-mount context's
|
|
209
|
-
// mode is pushed into the FINAL nested root with the same duck-type
|
|
210
|
-
// guard and the same skip-at-default fast path.
|
|
211
|
-
const parentWriteTracking = parentContext.getWriteTracking?.();
|
|
212
|
-
if (parentWriteTracking !== undefined && parentWriteTracking !== 'full') {
|
|
213
|
-
nestedRootContext.useWriteTracking(parentWriteTracking);
|
|
214
|
-
}
|
|
215
|
-
// Commit-values encoding (#13c-B): same inheritance hop as the two
|
|
216
|
-
// tracking dials above — subflow runtimes are isolated, so the
|
|
217
|
-
// parent-mount context's mode is pushed into the FINAL nested root with
|
|
218
|
-
// the same duck-type guard and the same skip-at-default fast path, so
|
|
219
|
-
// nested charts commit in the same encoding as the parent.
|
|
220
|
-
const parentCommitValues = parentContext.getCommitValues?.();
|
|
221
|
-
if (parentCommitValues !== undefined && parentCommitValues !== 'full') {
|
|
222
|
-
nestedRootContext.useCommitValues(parentCommitValues);
|
|
223
|
-
}
|
|
224
|
-
// Per-write read provenance (#P1): fourth dial, same inheritance hop —
|
|
225
|
-
// duck-type guard, skip-at-default ('off') fast path, so nested charts
|
|
226
|
-
// stamp TraceEntry.readKeys exactly when the parent does.
|
|
227
|
-
const parentWriteProvenance = parentContext.getWriteProvenance?.();
|
|
228
|
-
if (parentWriteProvenance !== undefined && parentWriteProvenance !== 'off') {
|
|
229
|
-
nestedRootContext.useWriteProvenance(parentWriteProvenance);
|
|
180
|
+
// names (R13), which belong to the seed bundle only. `newRoot` gives it
|
|
181
|
+
// the same policy and mirror.
|
|
182
|
+
nestedRuntime.rootStageContext = nestedRuntime.newRoot(firstNode.name, firstNode.id);
|
|
230
183
|
}
|
|
231
184
|
// Prepare subflow root node — strip isSubflowRoot to prevent re-delegation.
|
|
232
185
|
//
|
|
@@ -431,25 +384,5 @@ export class SubflowExecutor {
|
|
|
431
384
|
}
|
|
432
385
|
return subflowOutput;
|
|
433
386
|
}
|
|
434
|
-
/**
|
|
435
|
-
* Push the run's redaction into a nested root the way the dials are pushed
|
|
436
|
-
* — the triplicated propagation (root install · createNext/createChild ·
|
|
437
|
-
* this hop). Called TWICE on purpose: on the runtime's first root, so the
|
|
438
|
-
* SEED commit (`history[0]`) retains and mirrors under the policy, and on
|
|
439
|
-
* the FINAL root after the seeding block replaces it. Rule before mirror,
|
|
440
|
-
* as the executor orders them (the mirror's seed is scrubbed with the rule;
|
|
441
|
-
* for a nested runtime that seed is empty — its input arrives as a commit).
|
|
442
|
-
* `enableRedactedMirror` is idempotent, so the second call only re-installs
|
|
443
|
-
* the ONE mirror on the fresh root.
|
|
444
|
-
*/
|
|
445
|
-
inheritRedaction(runtime, root, rule, keepsMirror) {
|
|
446
|
-
if (rule)
|
|
447
|
-
root.useRedactionRule(rule);
|
|
448
|
-
if (!keepsMirror)
|
|
449
|
-
return;
|
|
450
|
-
runtime.enableRedactedMirror?.();
|
|
451
|
-
if (runtime.redactedStore)
|
|
452
|
-
root.useRedactedMirror(runtime.redactedStore);
|
|
453
|
-
}
|
|
454
387
|
}
|
|
455
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFJSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBOEI7SUFDdkQsSUFBSSxHQUF3QyxDQUFDO0lBQzdDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFBRSxTQUFTO1FBQ25DLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDO0FBQ3RCLENBQUM7QUFFRCx5R0FBeUc7QUFDekcsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxJ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Q3pCLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7UUFDakMsSUFBSSxPQUFPLENBQUMsYUFBYTtZQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdWJmbG93RXhlY3V0b3Ig4oCUIElzb2xhdGlvbiBib3VuZGFyeSBmb3Igc3ViZmxvdyBleGVjdXRpb24uXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGlzb2xhdGVkIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIGVhY2ggc3ViZmxvd1xuICogLSBBcHBseSBpbnB1dC9vdXRwdXQgbWFwcGluZyB2aWEgU3ViZmxvd0lucHV0TWFwcGVyXG4gKiAtIERlbGVnYXRlIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAqIC0gVHJhY2sgc3ViZmxvdyByZXN1bHRzIGZvciBkZWJ1Z2dpbmcvdmlzdWFsaXphdGlvblxuICpcbiAqIEVhY2ggc3ViZmxvdyBnZXRzIGl0cyBvd24gR2xvYmFsU3RvcmUgZm9yIGlzb2xhdGlvbi5cbiAqIFRyYXZlcnNhbCB1c2VzIHRoZSBTQU1FIDctcGhhc2UgYWxnb3JpdGhtIGFzIHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2VyXG4gKiAodmlhIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KSwgc28gZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGxhenkgc3ViZmxvd3MsXG4gKiBhbmQgYWJvcnQgc2lnbmFscyBhbGwgd29yayBpbnNpZGUgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuLi8uLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgU3ViZmxvd1RyYXZlcnNlckhhbmRsZSxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgUmVzdW1lRW50cnkgfSBmcm9tICcuL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUgfSBmcm9tICcuL3NlcnZlZFN1YmZsb3dSZXN1bHRzLmpzJztcbmltcG9ydCB7IGFwcGx5T3V0cHV0TWFwcGluZywgZ2V0SW5pdGlhbFNjb3BlVmFsdWVzLCBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlIH0gZnJvbSAnLi9TdWJmbG93SW5wdXRNYXBwZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmVha0ZsYWcgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBUaGUgbWFwcGVkIGlucHV0LCBkZXRhY2hlZCBmcm9tIHRoZSBwYXJlbnQncyBzdGF0ZSBPTkNFIHBlciBtb3VudCAoRDEsXG4gKiA5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpLlxuICpcbiAqIFRoZSBpbnB1dE1hcHBlciByZWFkcyB0aGUgcGFyZW50J3MgTElWRSBzdGF0ZSAoYGdldFNjb3BlKClgKSwgc28gYSB2YWx1ZSBpdFxuICogcGFzc2VzIHRocm91Z2ggKGAocCkgPT4gKHsgY2ZnOiBwLmNmZyB9KWApIGlzIHRoZSBwYXJlbnQncyBjb21taXR0ZWRcbiAqIG9iamVjdCDigJQgYW5kIHRoZSBzdWJmbG93J3MgYXJncyBhcmUgZGVlcC1GUk9aRU4gaW4gcGxhY2VcbiAqIChgcmVhZG9ubHlJbnB1dCDCtyBjcmVhdGVGcm96ZW5BcmdzYCkuIFRoZSB0eXBlZCBzY29wZSBkb2VzIG5vdCBwcm94eSBhXG4gKiBmcm96ZW4gdmFsdWUgKGBhbGxvd2xpc3Qgwrcgc2hvdWxkV3JhcFdpdGhQcm94eWApLCBzbyBhIGxhdGVyXG4gKiBgc2NvcGUuY2ZnLnggPSAxYCBpbiB0aGUgcGFyZW50IG1ldCB0aGUgcmF3IGZyb3plbiBvYmplY3Q6IGEgVHlwZUVycm9yIGluXG4gKiBzdHJpY3QgY29kZS4gQmVmb3JlIDkuMjkuMCB0aGUgcGFyZW50J3MgbmV4dCB3aG9sZS1zdGF0ZSBjbG9uZSByZXBsYWNlZCB0aGVcbiAqIGZyb3plbiBvYmplY3QgKGEgbW91bnQgdGhhdCBjb21taXR0ZWQgbm90aGluZyBsZWZ0IGl0IGluIHBsYWNlIOKAlCB0aGUgYnVnXG4gKiBleGlzdGVkLCBpdCB3YXMgb25seSBzaG9ydC1saXZlZCk7IHVuZGVyIGNvcHktb24td3JpdGUgbm90aGluZyByZS1jbG9uZXMsXG4gKiBzbyB0aGUgZnJlZXplIHdvdWxkIGxhc3QgdW50aWwgdGhlIGtleSBpcyByZXdyaXR0ZW4uIEEgbW91bnQgbXVzdCBuZXZlclxuICogZWRpdCDigJQgb3IgZnJlZXplIOKAlCB0aGUgcGFyZW50J3MgY29tbWl0dGVkIG9iamVjdHM6IGV2ZXJ5IHBsYWluIG9iamVjdCxcbiAqIGFycmF5LCBgRGF0ZWAsIGBNYXBgIGFuZCBgU2V0YCB0aGUgbWFwcGVyIHJldHVybnMgaXMgY2xvbmVkIGhlcmUsIGJlZm9yZSBpdFxuICogYmVjb21lcyB0aGUgYXJncy4gQSBjbGFzcyBpbnN0YW5jZSBwYXNzZXMgYnkgcmVmZXJlbmNlLCBhcyBiZWZvcmUgKGl0XG4gKiBjYW5ub3QgY29tZSBmcm9tIGNvbW1pdHRlZCBzdGF0ZSwgYW5kIGEgY2xvbmUgd291bGQgZHJvcCBpdHMgcHJvdG90eXBlKS5cbiAqIFRoZSBzZWVkIGlzIGNsb25lZCBhZ2FpbiBhdCBpdHMgY29tbWl0LCBzbyB0aGUgc3ViZmxvdydzIHN0YXRlIGlzXG4gKiB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGRldGFjaE1hcHBlZElucHV0KGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgIGlmICghaXNEZXRhY2hhYmxlKHZhbHVlKSkgY29udGludWU7XG4gICAgKG91dCA/Pz0geyAuLi5pbnB1dCB9KVtrZXldID0gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gb3V0ID8/IGlucHV0O1xufVxuXG4vKiogQSB2YWx1ZSBgc3RydWN0dXJlZENsb25lYCByZXByb2R1Y2VzIHdpdGggaXRzIG93biB0eXBlOiBwbGFpbiBvYmplY3QsIGFycmF5LCBgRGF0ZWAsIGBNYXBgLCBgU2V0YC4gKi9cbmZ1bmN0aW9uIGlzRGV0YWNoYWJsZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0KSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJmbG93RXhlY3V0b3I8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKlxuICAgKiBUaGUgcmVzdW1lJ3Mgb25lLXNob3QgcmUtZW50cnkgKGBkZXBzLnJlc3VtZWApLCBvciBhIHNlZWQtb25seSBvbmUgYnVpbHRcbiAgICogZnJvbSB0aGUgZGVwcmVjYXRlZCBgZGVwcy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lYC4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsXG4gICAqIHJ1bi4gQXNrZWQgb25jZSBwZXIgc3ViZmxvdyBlbnRyeSDigJQgc2VlIHtAbGluayBSZXN1bWVFbnRyeX0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VtZTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSB0cmF2ZXJzZXJGYWN0b3J5OiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+LFxuICApIHtcbiAgICB0aGlzLnJlc3VtZSA9XG4gICAgICBkZXBzLnJlc3VtZSA/P1xuICAgICAgKGRlcHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSA/IFJlc3VtZUVudHJ5LmZyb21DYXB0dXJlczxUT3V0LCBUU2NvcGU+KGRlcHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSkgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWJmbG93IHdpdGggaXNvbGF0ZWQgY29udGV4dC5cbiAgICpcbiAgICogMS4gQ3JlYXRlcyBhIGZyZXNoIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93XG4gICAqIDIuIEFwcGxpZXMgaW5wdXQgbWFwcGluZyB0byBzZWVkIHRoZSBzdWJmbG93J3MgR2xvYmFsU3RvcmVcbiAgICogMy4gRGVsZWdhdGVzIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAgICogNC4gQXBwbGllcyBvdXRwdXQgbWFwcGluZyB0byB3cml0ZSByZXN1bHRzIGJhY2sgdG8gcGFyZW50IHNjb3BlXG4gICAqIDUuIFN0b3JlcyBleGVjdXRpb24gZGF0YSBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJmbG93KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXA6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+LFxuICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkITtcbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG5vZGUuc3ViZmxvd05hbWUgPz8gbm9kZS5uYW1lO1xuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEVudGVyaW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFJlc3VtZSByZS1lbnRyeSAob25lLXNob3QpIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gV2hlbiB0aGlzIGVudHJ5IGlzIHRoZSByZXN1bWUncyB3YXkgYmFjayBpbnRvIGEgcGF1c2VkIHN1YmZsb3csIHRoZVxuICAgIC8vIGhvcCBuYW1lcyB3aGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgKHRoZSBuZXh0IG1vdW50IG9uIHRoZVxuICAgIC8vIHBhdXNlIHBhdGgsIG9yIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiksIGNhcnJpZXMgdGhlIHN1YmZsb3cnc1xuICAgIC8vIGNhcHR1cmVkIHByZS1wYXVzZSBzdGF0ZSwgYW5kIGFueSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGluIGl0LiBUYWtlblxuICAgIC8vIE9OQ0U6IGFueSBsYXRlciBlbnRyeSBpbnRvIHRoaXMgc3ViZmxvdyDigJQgYSBsb29wIHBhc3NpbmcgaXRzIG1vdW50XG4gICAgLy8gYWdhaW4g4oCUIGdldHMgYHVuZGVmaW5lZGAgYW5kIHJ1bnMgdGhlIHJlYWwgc3ViZmxvdyBmcm9tIGl0cyByZWFsIHJvb3QsXG4gICAgLy8gaW5wdXRNYXBwZXIgYW5kIGFsbC5cbiAgICBjb25zdCByZXN1bWVIb3AgPSB0aGlzLnJlc3VtZT8uZW50ZXJTdWJmbG93KHN1YmZsb3dJZCk7XG5cbiAgICAvLyDilIDilIDilIAgSW5wdXQgTWFwcGluZyDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFRoZSBtYXBwZXIgcnVucyBvbiBFVkVSWSBlbnRyeTogaXRzIHJlc3VsdCBpcyB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICAvLyBhcmdzIChgJGdldEFyZ3MoKWApLCBhbmQgYSByZS1lbnRlcmVkIHN1YmZsb3cncyBzdGFnZXMgcmVhZCB0aGUgc2FtZVxuICAgIC8vIGFyZ3MgdGhleSByZWFkIGJlZm9yZSB0aGUgcGF1c2UgKHRoZSBwYXJlbnQncyB2aWV3IGlzIHRoZSBzYW1lIG9uZSDigJRcbiAgICAvLyBpdCB3YXMgYmxvY2tlZCBpbiB0aGlzIG1vdW50KS4gV2hhdCBhIHJlc3VtZSBjaGFuZ2VzIGlzIG9ubHkgdGhlIFNFRUQ6XG4gICAgLy8gd2hlbiB0aGUgaG9wIGNhcnJpZXMgYSBjYXB0dXJlLCB0aGUgbmVzdGVkIG1lbW9yeSBpcyBzZWVkZWQgZnJvbSB0aGVcbiAgICAvLyBjYXB0dXJlLCBub3QgZnJvbSB0aGUgbWFwcGVyIOKAlCB0aGUgY2FwdHVyZSBpcyB0aGUgcG9zdC1pbnB1dCBwcmUtcGF1c2VcbiAgICAvLyBtZW1vcnksIGFuZCBzZWVkaW5nIHRoZSBtYXBwZXIncyB2YWx1ZXMgd291bGQgY2xvYmJlciBwb3N0LWlucHV0XG4gICAgLy8gd3JpdGVzIChoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuKSB3aXRoIHRoZSBzdGFydC1vZi1zdWJmbG93IHZpZXcuXG4gICAgY29uc3QgbW91bnRPcHRpb25zID0gbm9kZS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIGxldCBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCByZXN1bWVDYXB0dXJlID0gcmVzdW1lSG9wPy5zZWVkO1xuICAgIGNvbnN0IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPSByZXN1bWVDYXB0dXJlICE9PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAobW91bnRPcHRpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IHBhcmVudENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgbWFwcGVkSW5wdXQgPSBkZXRhY2hNYXBwZWRJbnB1dChnZXRJbml0aWFsU2NvcGVWYWx1ZXMocGFyZW50U2NvcGUsIG1vdW50T3B0aW9ucykpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFwcGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBtYXBwZWRJbnB1dCBpcyBjYXB0dXJlZCBpbiBTdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0IGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdpbnB1dE1hcHBlckVycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIGlucHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3IgfSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSAoOS4xOS4wKSwgcmVhZCBvZmYgdGhlIHBhcmVudC1tb3VudCBjb250ZXh0XG4gICAgLy8gdGhlIHdheSB0aGUgZGlhbHMgYXJlIChkdWNrLXR5cGVkOiB0aGlzIHNlY3Rpb24gY29uc3RydWN0cyBpdHMgcnVudGltZVxuICAgIC8vIGR5bmFtaWNhbGx5IHRvIGF2b2lkIHRoZSBjaXJjdWxhciBpbXBvcnQpLiBUaGUgc2VlZCBuYXJyYXRlZCBiZWxvdyBhbmRcbiAgICAvLyB0aGUgc2VlZCBDT01NSVRURUQgYmVsb3cgYm90aCByZXRhaW4gdW5kZXIgaXQ7IHRoZSBzdWJmbG93J3Mgc3RhZ2VzXG4gICAgLy8gc3RpbGwgY29tcHV0ZSBvbiB0aGUgcmVhbCBgbWFwcGVkSW5wdXRgICh0aGVpciBmcm96ZW4gYXJncykuXG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IHBhcmVudENvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZT8uKCk7XG4gICAgLy8gVGhlIHJ1bidzIHJlZGFjdGVkIG1pcnJvciAoOS4yMC4wKTogdGhlIHBhcmVudC1tb3VudCBjb250ZXh0IGNhcnJpZXMgaXRcbiAgICAvLyBleGFjdGx5IHdoZW4gdGhlIHJvb3QgZW5hYmxlZCBvbmUgKGBFeGVjdXRpb25SdW50aW1lLmVuYWJsZVJlZGFjdGVkTWlycm9yYFxuICAgIC8vIHVuZGVyIGEgcG9saWN5LCBpbmhlcml0ZWQgYnkgY3JlYXRlTmV4dC9jcmVhdGVDaGlsZCkg4oCUIHJlYWQgdGhlIHdheSB0aGVcbiAgICAvLyBkaWFscyBhcmUuIFdoZW4gaXQgZG9lcywgdGhlIG5lc3RlZCBydW50aW1lIGtlZXBzIGEgbWlycm9yIG9mIGl0cyBvd24sXG4gICAgLy8gc28gdGhlIHN1YmZsb3cncyBTRVJWRUQgc3RhdGUgaXMgYSBtaXJyb3IgdG9vIOKAlCB0aGUgZm9sZCBvZiBpdHMgb3duXG4gICAgLy8gc2NydWJiZWQgbG9nIOKAlCBhbmQgbmV2ZXIgYSBzZWNvbmQgc2NydWIuIE5vIHBvbGljeTogbm8gbWlycm9yLCBub1xuICAgIC8vIGFsbG9jYXRpb24sIGFuZCB0aGUgc2VydmVkIHN0YXRlIGlzIHRoZSByYXcgaGVhcCBpdCBhbHdheXMgd2FzLlxuICAgIGNvbnN0IGtlZXBzTWlycm9yID0gcGFyZW50Q29udGV4dC5nZXRSZWRhY3RlZFNoYXJlZE1lbW9yeT8uKCkgIT09IHVuZGVmaW5lZDtcbiAgICAvLyBOYXJyYXRpdmUgcmVjZWl2ZXMgdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIG1hcHBlZCBpbnB1dCDigJQgYW5cbiAgICAvLyBpbnB1dE1hcHBlciBtYXkgaW5qZWN0IHZhbHVlcyBmcm9tIGFueXdoZXJlLCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgIC8vIHVuZGVyIHRoZSBwb2xpY3kgYmVmb3JlIGFueSByZWNvcmRlciBzZWVzIGl0LiBTYW1lIG9iamVjdCB3aGVuIG5vdGhpbmdcbiAgICAvLyBpbiBpdCBpcyByZWRhY3RlZCAodGhlIG5vLXBvbGljeSBwYXRoIGFsbG9jYXRlcyBub3RoaW5nKS5cbiAgICBjb25zdCBuYXJyYXRpdmVJbnB1dCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpblJlY29yZChtYXBwZWRJbnB1dCkgOiBtYXBwZWRJbnB1dDtcbiAgICAvLyBgRmxvd1N1YmZsb3dFdmVudC5kZXNjcmlwdGlvbmAgaXMgc2VtYW50aWNhbGx5IFwid2hhdCB0aGlzIHN1YmZsb3cgZG9lc1wiIOKAlCBzb3VyY2VkIGZyb21cbiAgICAvLyB0aGUgc3ViZmxvdydzIG93biByb290IHN0YWdlLCBub3QgdGhlIHBhcmVudCBtb3VudCBwb2ludC4gVGhlIG1vdW50IG5vZGUgbmV2ZXIgY2Fycmllc1xuICAgIC8vIGEgZGVzY3JpcHRpb24gKGJ1aWxkZXJzIGRvbid0IGNvcHkgaXQpLCBzbyByZWFkaW5nIGBub2RlLmRlc2NyaXB0aW9uYCBoZXJlIHJldHVybnNcbiAgICAvLyBgdW5kZWZpbmVkYCBhbmQgdGF4b25vbXkgbWFya2VycyBzZXQgb24gdGhlIHN1YmZsb3cgcm9vdCAoZS5nLiBhZ2VudGZvb3RwcmludCdzXG4gICAgLy8gYCdBZ2VudDogUmVBY3QgbG9vcCdgIC8gYCdMTE1DYWxsOiBvbmUtc2hvdCdgKSBuZXZlciByZWFjaCBkb3duc3RyZWFtIGNvbnN1bWVycy5cbiAgICBjb25zdCByb290RGVzY3JpcHRpb24gPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdPy5yb290Py5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0VudHJ5KFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93SWQsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICBuYXJyYXRpdmVJbnB1dCxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIGZvciB0aGUgbW91bnQgbm9kZSBBRlRFUlxuICAgIC8vIG9uU3ViZmxvd0VudHJ5IHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmtcbiAgICAvLyB1bmlmb3JtbHkgYWNyb3NzIGxpbmVhciAvIGRlY2lkZXIgLyBmb3JrIC8gc2VsZWN0b3IgLyBzdWJmbG93LW1vdW50LlxuICAgIC8vIEZpcmVzIG9uIEVOVFJZIChub3QgZXhpdCkg4oCUIGVudHJ5ID0gXCJ0aGlzIG1vdW50IHJhblwiOyB0aGVcbiAgICAvLyBzdWJmbG93J3MgY2hpbGRyZW4gZXhlY3V0ZSBhZnRlciBhcyBzZXBhcmF0ZSBzdGFnZXMuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQoXG4gICAgICBub2RlLm5hbWUsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICAnc3ViZmxvdy1tb3VudCcsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBpc29sYXRlZCBydW50aW1lIHZpYSBkeW5hbWljIGNvbnN0cnVjdGlvbiAoYXZvaWRzIGNpcmN1bGFyIGltcG9ydCkuXG4gICAgLy8gSXRzIHJvb3QgY29udGV4dCBpcyB0aGUgZmlyc3Qgc3RhZ2UgdGhlIHN1YmZsb3cgdHJhdmVyc2FsIHJ1bnMg4oCUIHRoZVxuICAgIC8vIHJlc3VtZSBob3AncyBlbnRyeSBvbiBhIHJlLWVudHJ5LCB0aGUgc3ViZmxvdydzIHJvb3Qgb3RoZXJ3aXNlLlxuICAgIGNvbnN0IEV4ZWN1dGlvblJ1bnRpbWVDbGFzcyA9IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLmNvbnN0cnVjdG9yIGFzIG5ldyAoXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBpZDogc3RyaW5nLFxuICAgICkgPT4gSUV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgY29uc3QgZmlyc3ROb2RlID0gcmVzdW1lSG9wPy5lbnRyeSA/PyBub2RlO1xuICAgIGNvbnN0IG5lc3RlZFJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZUNsYXNzKGZpcnN0Tm9kZS5uYW1lLCBmaXJzdE5vZGUuaWQpO1xuICAgIGxldCBuZXN0ZWRSb290Q29udGV4dCA9IG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcblxuICAgIC8vIFNlZWQgR2xvYmFsU3RvcmUgd2l0aCB0aGUgcmlnaHQgc2hhcGUgZm9yIHRoZSBwYXRoOlxuICAgIC8vICAg4oCiIFJlc3VtZSBpbnRvIFRISVMgc3ViZmxvdyDihpIgc2VlZCBmcm9tIHRoZSBjYXB0dXJlZCBwcmUtcGF1c2VcbiAgICAvLyAgICAgc2NvcGUgc28gcmVzdW1lIGhhbmRsZXJzIHNlZSBoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuXG4gICAgLy8gICAgIChgbWFwcGVkSW5wdXRgIHN0aWxsIHJlYWNoZXMgdGhlIHN0YWdlcywgYXMgdGhlaXIgcmVhZC1vbmx5IGFyZ3MuKVxuICAgIC8vICAg4oCiIE5vcm1hbCBlbnRyeSDihpIgc2VlZCBmcm9tIHRoZSBpbnB1dE1hcHBlcidzIG1hcHBlZElucHV0LlxuICAgIGNvbnN0IHNlZWRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gaXNSZXN1bWVGb3JUaGlzU3ViZmxvdyA/IHJlc3VtZUNhcHR1cmUhIDogbWFwcGVkSW5wdXQ7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlZWRWYWx1ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBzZWVkIGlzIGNvbW1pdHRlZCBhcyB0aGUgc3ViZmxvdydzIGBoaXN0b3J5WzBdYCBieSBpdHMgcm9vdFxuICAgICAgLy8gY29udGV4dCwgbm90IGJ5IGEgZmFjYWRlIOKAlCBpbnN0YWxsIHRoZSBydWxlIChhbmQgdGhlIG1pcnJvcikgb24gVEhBVFxuICAgICAgLy8gY29udGV4dCBmaXJzdCBzbyB0aGUgc2VlZCBjb21taXQgcmV0YWlucyB1bmRlciB0aGUgcG9saWN5IGxpa2UgZXZlcnlcbiAgICAgIC8vIG90aGVyIHdyaXRlLCBhbmQgbGFuZHMgaW4gdGhlIG1pcnJvciBhcyB0aGUgcGxhY2Vob2xkZXIuXG4gICAgICB0aGlzLmluaGVyaXRSZWRhY3Rpb24obmVzdGVkUnVudGltZSwgbmVzdGVkUm9vdENvbnRleHQsIHJlZGFjdGlvblJ1bGUsIGtlZXBzTWlycm9yKTtcbiAgICAgIC8vIFRoZSBzZWVkIGlzIHRoZSBtb3VudCdzIGFjdCB0b286IGl0cyBidW5kbGUg4oCUIGBoaXN0b3J5WzBdYCBvZiB0aGVcbiAgICAgIC8vIHN1YmZsb3cncyBvd24gbG9nIOKAlCBjYXJyaWVzIHRoZSBtb3VudCdzIHN0YWdlLCBzdGFnZUlkIGFuZFxuICAgICAgLy8gcnVudGltZVN0YWdlSWQgKFIxMzsgdGhyb3VnaCA5LjMzLjAgaXQgY2FycmllZCBydW50aW1lU3RhZ2VJZCAnJyBhbmRcbiAgICAgIC8vIHRoZSBmaXJzdCBzdGFnZSdzIG5hbWVzLCB3aGljaCBvbiBhIHJlc3VtZSB3YXMgdGhlIHJlLWVudHJ5IHBvaW50KS5cbiAgICAgIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUobmVzdGVkUnVudGltZSwgc2VlZFZhbHVlcywgcGFyZW50Q29udGV4dCk7XG4gICAgICAvLyBSZWZyZXNoIHJvb3RTdGFnZUNvbnRleHQgc28gV3JpdGVCdWZmZXIgc2VlcyBjb21taXR0ZWQgZGF0YS4gTmFtZWRcbiAgICAgIC8vIGFmdGVyIHRoZSBmaXJzdCBub2RlIGFnYWluIOKAlCB0aGUgc2VlZCBjb250ZXh0IG5vdyBjYXJyaWVzIHRoZSBtb3VudCdzXG4gICAgICAvLyBuYW1lcyAoUjEzKSwgd2hpY2ggYmVsb25nIHRvIHRoZSBzZWVkIGJ1bmRsZSBvbmx5LlxuICAgICAgY29uc3QgU3RhZ2VDb250ZXh0Q2xhc3MgPSBuZXN0ZWRSb290Q29udGV4dC5jb25zdHJ1Y3RvciBhcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBTdGFnZUNvbnRleHQ7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dCA9IG5ldyBTdGFnZUNvbnRleHRDbGFzcyhcbiAgICAgICAgJycsXG4gICAgICAgIGZpcnN0Tm9kZS5uYW1lLFxuICAgICAgICBmaXJzdE5vZGUuaWQsXG4gICAgICAgIG5lc3RlZFJ1bnRpbWUuZ2xvYmFsU3RvcmUsXG4gICAgICAgICcnLFxuICAgICAgICBuZXN0ZWRSdW50aW1lLmV4ZWN1dGlvbkhpc3RvcnksXG4gICAgICApO1xuICAgICAgbmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbmVzdGVkUm9vdENvbnRleHQ7XG4gICAgfVxuXG4gICAgLy8gUmVhZC10cmFja2luZyBwb2xpY3kgKCMxNCk6IHN1YmZsb3dzIGdldCBhbiBJU09MQVRFRCBydW50aW1lLCBzbyB0aGVcbiAgICAvLyBleGVjdXRvci1sZXZlbCBwb2xpY3kgZG9lc24ndCByZWFjaCB0aGVtIHZpYSB0aGUgcm9vdCBjb250ZXh0IGNoYWluLlxuICAgIC8vIEluaGVyaXQgaXQgZnJvbSB0aGUgcGFyZW50LW1vdW50IGNvbnRleHQgKHdoaWNoIGluaGVyaXRlZCBpdCBmcm9tIElUU1xuICAgIC8vIHJvb3QgdmlhIGNyZWF0ZU5leHQvY3JlYXRlQ2hpbGQpIOKAlCBhcHBsaWVkIHRvIHRoZSBGSU5BTCBuZXN0ZWQgcm9vdCxcbiAgICAvLyBhZnRlciB0aGUgc2VlZGluZyBibG9jayBhYm92ZSBtYXkgaGF2ZSByZXBsYWNlZCBpdC4gTmVzdGVkIHN1YmZsb3dzXG4gICAgLy8gY2hhaW4gdGhlIHNhbWUgd2F5LCBvbmUgaG9wIHBlciBtb3VudC4gT3B0aW9uYWwtY2hhaW5lZCBiZWNhdXNlIHRoaXNcbiAgICAvLyBzZWN0aW9uIGlzIGR1Y2stdHlwZWQgYnkgZGVzaWduIChkeW5hbWljIGNvbnN0cnVjdGlvbiB0byBhdm9pZCB0aGVcbiAgICAvLyBjaXJjdWxhciBpbXBvcnQpIOKAlCBhbmQgc2tpcHBlZCBhdCB0aGUgZGVmYXVsdCAnZnVsbCcsIHdoZXJlIHRoZSBmcmVzaFxuICAgIC8vIG5lc3RlZCBjb250ZXh0IGlzIGFscmVhZHkgY29ycmVjdCwgc28gdGhlIGRlZmF1bHQgcGF0aCBkb2VzIHplcm8gd29yay5cbiAgICBjb25zdCBwYXJlbnRSZWFkVHJhY2tpbmcgPSBwYXJlbnRDb250ZXh0LmdldFJlYWRUcmFja2luZz8uKCk7XG4gICAgaWYgKHBhcmVudFJlYWRUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmIHBhcmVudFJlYWRUcmFja2luZyAhPT0gJ2Z1bGwnKSB7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dC51c2VSZWFkVHJhY2tpbmcocGFyZW50UmVhZFRyYWNraW5nKTtcbiAgICB9XG5cbiAgICAvLyBSZWRhY3Rpb24gcnVsZSAoOS4xOS4wKSBhbmQgbWlycm9yICg5LjIwLjApOiBzYW1lIGhvcCBhcyB0aGUgZGlhbHMsXG4gICAgLy8gYXBwbGllZCB0byB0aGUgRklOQUwgbmVzdGVkIHJvb3QgKHRoZSBzZWVkaW5nIGJsb2NrIGFib3ZlIG1heSBoYXZlXG4gICAgLy8gcmVwbGFjZWQgaXQpIHNvIGV2ZXJ5IHN0YWdlIGNvbnRleHQgdGhlIHN1YmZsb3cgY3JlYXRlcyBpbmhlcml0cyBib3RoLlxuICAgIHRoaXMuaW5oZXJpdFJlZGFjdGlvbihuZXN0ZWRSdW50aW1lLCBuZXN0ZWRSb290Q29udGV4dCwgcmVkYWN0aW9uUnVsZSwga2VlcHNNaXJyb3IpO1xuXG4gICAgLy8gV3JpdGUtdHJhY2tpbmcgcG9saWN5ICgjMTNjLUEpOiBzYW1lIGluaGVyaXRhbmNlIGhvcCBhcyByZWFkVHJhY2tpbmdcbiAgICAvLyBhYm92ZSDigJQgc3ViZmxvdyBydW50aW1lcyBhcmUgaXNvbGF0ZWQsIHNvIHRoZSBwYXJlbnQtbW91bnQgY29udGV4dCdzXG4gICAgLy8gbW9kZSBpcyBwdXNoZWQgaW50byB0aGUgRklOQUwgbmVzdGVkIHJvb3Qgd2l0aCB0aGUgc2FtZSBkdWNrLXR5cGVcbiAgICAvLyBndWFyZCBhbmQgdGhlIHNhbWUgc2tpcC1hdC1kZWZhdWx0IGZhc3QgcGF0aC5cbiAgICBjb25zdCBwYXJlbnRXcml0ZVRyYWNraW5nID0gcGFyZW50Q29udGV4dC5nZXRXcml0ZVRyYWNraW5nPy4oKTtcbiAgICBpZiAocGFyZW50V3JpdGVUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmIHBhcmVudFdyaXRlVHJhY2tpbmcgIT09ICdmdWxsJykge1xuICAgICAgbmVzdGVkUm9vdENvbnRleHQudXNlV3JpdGVUcmFja2luZyhwYXJlbnRXcml0ZVRyYWNraW5nKTtcbiAgICB9XG5cbiAgICAvLyBDb21taXQtdmFsdWVzIGVuY29kaW5nICgjMTNjLUIpOiBzYW1lIGluaGVyaXRhbmNlIGhvcCBhcyB0aGUgdHdvXG4gICAgLy8gdHJhY2tpbmcgZGlhbHMgYWJvdmUg4oCUIHN1YmZsb3cgcnVudGltZXMgYXJlIGlzb2xhdGVkLCBzbyB0aGVcbiAgICAvLyBwYXJlbnQtbW91bnQgY29udGV4dCdzIG1vZGUgaXMgcHVzaGVkIGludG8gdGhlIEZJTkFMIG5lc3RlZCByb290IHdpdGhcbiAgICAvLyB0aGUgc2FtZSBkdWNrLXR5cGUgZ3VhcmQgYW5kIHRoZSBzYW1lIHNraXAtYXQtZGVmYXVsdCBmYXN0IHBhdGgsIHNvXG4gICAgLy8gbmVzdGVkIGNoYXJ0cyBjb21taXQgaW4gdGhlIHNhbWUgZW5jb2RpbmcgYXMgdGhlIHBhcmVudC5cbiAgICBjb25zdCBwYXJlbnRDb21taXRWYWx1ZXMgPSBwYXJlbnRDb250ZXh0LmdldENvbW1pdFZhbHVlcz8uKCk7XG4gICAgaWYgKHBhcmVudENvbW1pdFZhbHVlcyAhPT0gdW5kZWZpbmVkICYmIHBhcmVudENvbW1pdFZhbHVlcyAhPT0gJ2Z1bGwnKSB7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dC51c2VDb21taXRWYWx1ZXMocGFyZW50Q29tbWl0VmFsdWVzKTtcbiAgICB9XG5cbiAgICAvLyBQZXItd3JpdGUgcmVhZCBwcm92ZW5hbmNlICgjUDEpOiBmb3VydGggZGlhbCwgc2FtZSBpbmhlcml0YW5jZSBob3Ag4oCUXG4gICAgLy8gZHVjay10eXBlIGd1YXJkLCBza2lwLWF0LWRlZmF1bHQgKCdvZmYnKSBmYXN0IHBhdGgsIHNvIG5lc3RlZCBjaGFydHNcbiAgICAvLyBzdGFtcCBUcmFjZUVudHJ5LnJlYWRLZXlzIGV4YWN0bHkgd2hlbiB0aGUgcGFyZW50IGRvZXMuXG4gICAgY29uc3QgcGFyZW50V3JpdGVQcm92ZW5hbmNlID0gcGFyZW50Q29udGV4dC5nZXRXcml0ZVByb3ZlbmFuY2U/LigpO1xuICAgIGlmIChwYXJlbnRXcml0ZVByb3ZlbmFuY2UgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRXcml0ZVByb3ZlbmFuY2UgIT09ICdvZmYnKSB7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dC51c2VXcml0ZVByb3ZlbmFuY2UocGFyZW50V3JpdGVQcm92ZW5hbmNlKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHN1YmZsb3cgcm9vdCBub2RlIOKAlCBzdHJpcCBpc1N1YmZsb3dSb290IHRvIHByZXZlbnQgcmUtZGVsZWdhdGlvbi5cbiAgICAvL1xuICAgIC8vIFBSRVNFUlZFIGBuZXh0YC4gRWFybGllciByZXZpc2lvbnMgc3RyaXBwZWQgYG5leHRgIHdoZW5ldmVyIHRoZVxuICAgIC8vIHN1YmZsb3cgcm9vdCBoYWQgY2hpbGRyZW4sIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYG5leHRgIHdhc1xuICAgIC8vIGFsd2F5cyB0aGUgT1VURVIgbW91bnQncyBjb250aW51YXRpb24gbGVha2luZyBpbnRvIHRoZSBpbm5lclxuICAgIC8vIHRyZWUuIFRoYXQgYXNzdW1wdGlvbiB3YXMgd3Jvbmc6IHRoZSByZXNvbHZlZCBzdWJmbG93IHJvb3Qnc1xuICAgIC8vIGBuZXh0YCBpcyB0aGUgSU5ORVIgam9pbiBzdGFnZSAoZS5nLiwgUGFyYWxsZWwncyBNZXJnZSBhZnRlciBhXG4gICAgLy8gZmFuLW91dCwgVG9UJ3MgUHJ1bmVyKS4gU3RyaXBwaW5nIGl0IGJyb2tlIGNvbXBvc2l0ZSBzdWJmbG93cyDigJRcbiAgICAvLyB0aGUgam9pbiBzdGFnZSBuZXZlciByYW4sIHNvIHRoZSBzdWJmbG93IHJldHVybmVkIHBhcnRpYWwgc3RhdGUuXG4gICAgLy9cbiAgICAvLyBUaGUgb3V0ZXIgbW91bnQncyBwb3N0LXN1YmZsb3cgY29udGludWF0aW9uIGlzIGhhbmRsZWQgc2VwYXJhdGVseVxuICAgIC8vIGJ5IHRoZSBwYXJlbnQgdHJhdmVyc2VyIHZpYSBgcGFyZW50Q29udGV4dC5uZXh0Tm9kZWAgYW5kIGlzIG5ldmVyXG4gICAgLy8gY29uZmxhdGVkIHdpdGggdGhlIGlubmVyIHN1YmZsb3cncyBgbmV4dGAgY2hhaW4uXG4gICAgY29uc3Qgc3ViZmxvd05vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgLi4ubm9kZSxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyDilIDilIDilIAgRXhlY3V0ZSB2aWEgZmFjdG9yeSB0cmF2ZXJzZXIg4pSA4pSA4pSAXG4gICAgLy8gVGhlIGZhY3RvcnkgY3JlYXRlcyBhIGZ1bGwgRmxvd2NoYXJ0VHJhdmVyc2VyIHdpdGggdGhlIHNhbWUgNy1waGFzZSBhbGdvcml0aG0sXG4gICAgLy8gc2hhcmluZyB0aGUgcGFyZW50J3Mgc3RhZ2VNYXAsIHN1YmZsb3dzIGRpY3QsIGFuZCBuYXJyYXRpdmUgZ2VuZXJhdG9yLlxuICAgIGxldCBzdWJmbG93T3V0cHV0OiBhbnk7XG4gICAgbGV0IHN1YmZsb3dFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRyYXZlcnNlckhhbmRsZTogU3ViZmxvd1RyYXZlcnNlckhhbmRsZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRyYXZlcnNlckhhbmRsZSA9IHRoaXMudHJhdmVyc2VyRmFjdG9yeSh7XG4gICAgICAgIC8vIFRoZSBSRUFMIHN1YmZsb3cgZ3JhcGgg4oCUIGV2ZXJ5IGlkIGluc2lkZSB0aGUgc3ViZmxvdyAobG9vcCB0YXJnZXRzLFxuICAgICAgICAvLyBhIHJlLXZpc2l0IG9mIHRoZSBwYXVzZWQgc3RhZ2UpIHJlc29sdmVzIGFnYWluc3QgaXQsIHJlLWVudHJ5IG9yIG5vdC5cbiAgICAgICAgcm9vdDogc3ViZmxvd05vZGUsXG4gICAgICAgIC8vIFdoZXJlIHRoaXMgdHJhdmVyc2FsIHN0YXJ0cyBvbiBhIHJlc3VtZSByZS1lbnRyeTsgdmlzaXRlZCBvbmNlIOKAlFxuICAgICAgICAvLyBhbmQgdGhlIHNpYmxpbmcgcGF1c2VzIGl0IHJhaXNlcyBvbmNlIHRoYXQgZW50cnkncyBjaGFpbiBlbmRzLlxuICAgICAgICAuLi4ocmVzdW1lSG9wPy5lbnRyeSAmJiB7IGVudHJ5OiByZXN1bWVIb3AuZW50cnkgfSksXG4gICAgICAgIC4uLihyZXN1bWVIb3A/LnBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiByZXN1bWVIb3AucGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogbmVzdGVkUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBtYXBwZWRJbnB1dCxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICAvLyBSRkMtMDAzIEQxOiB0aGUgbW91bnQgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCDigJQgdGhlIHN1YmZsb3cgcm9vdFxuICAgICAgICAvLyBzdGFnZSdzIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgc28gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHRoZSBtb3VudC5cbiAgICAgICAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDogcGFyZW50VHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICB9KTtcblxuICAgICAgc3ViZmxvd091dHB1dCA9IGF3YWl0IHRyYXZlcnNlckhhbmRsZS5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gUGF1c2VTaWduYWwgaXMgbm90IGFuIGVycm9yIOKAlCBwcmVwZW5kIHN1YmZsb3cgSUQgYW5kIHJlLXRocm93XG4gICAgICAvLyBpbW1lZGlhdGVseS4gTm8gZXJyb3IgbG9nZ2luZywgbm8gc3ViZmxvd1Jlc3VsdCByZWNvcmRpbmcg4oCUXG4gICAgICAvLyB0aGUgcGF1c2UgaXMgY29udHJvbCBmbG93LlxuICAgICAgLy9cbiAgICAgIC8vIEJFRk9SRSByZS10aHJvdywgc25hcHNob3QgdGhlIG5lc3RlZCBydW50aW1lJ3MgYHNoYXJlZFN0YXRlYFxuICAgICAgLy8gb250byB0aGUgc2lnbmFsLiBUaGlzIGlzIHRoZSBvbmx5IGNoYW5jZSDigJQgb25jZSB3ZSByZS10aHJvdyxcbiAgICAgIC8vIHRoZSBvdXRlciB0cmF2ZXJzZXIgdW53aW5kcyBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGlzIEdDJ2QuIE9uXG4gICAgICAvLyByZXN1bWUsIHdlJ2xsIHJlLXNlZWQgYSBmcmVzaCBuZXN0ZWQgcnVudGltZSBmcm9tIHRoaXMgY2FwdHVyZVxuICAgICAgLy8gc28gcmVzdW1lIGhhbmRsZXJzIGNhbiByZWFkIHRoZSBwcmUtcGF1c2Ugc3ViZmxvdyBzY29wZS5cbiAgICAgIC8vXG4gICAgICAvLyBDYXB0dXJlIGlzIGtleWVkIGJ5IHRoZSBTQU1FIHBhdGgtcHJlZml4ZWQgYHN1YmZsb3dJZGAgdXNlZCBpblxuICAgICAgLy8gYHN1YmZsb3dQYXRoYCwgc28gcmVzdW1lIGNhbiBsb29rIHVwIFwic2NvcGUgZm9yIHNmLWZvb1wiIGJ5IGlkLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc25hcCA9IG5lc3RlZFJ1bnRpbWUuZ2V0U25hcHNob3QoKTtcbiAgICAgICAgICAvLyBgc2hhcmVkU3RhdGVgIGlzIHRoZSBzdWJmbG93J3Mgd29ya2luZyBtZW1vcnkgYXQgcGF1c2VcbiAgICAgICAgICAvLyB0aW1lIChhZnRlciBldmVyeSBjb21taXR0ZWQgd3JpdGUgdXAgdG8gdGhlIHBhdXNlKS4gQ2FzdFxuICAgICAgICAgIC8vIGlzIHNhZmUg4oCUIFNoYXJlZE1lbW9yeSBzbmFwc2hvdCByZXR1cm5zIGEgcGxhaW4gb2JqZWN0LlxuICAgICAgICAgIGVycm9yLmNhcHR1cmVTdWJmbG93U2NvcGUoc3ViZmxvd0lkLCBzbmFwLnNoYXJlZFN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gU25hcHNob3QgZmFpbHVyZSBzaG91bGRuJ3QgbWFzayB0aGUgcGF1c2Ug4oCUIGxldCB0aGUgcGF1c2VcbiAgICAgICAgICAvLyBidWJibGUgdXA7IHJlc3VtZSB3aWxsIGZhbGwgYmFjayB0byBjaGVja3BvaW50LnNoYXJlZFN0YXRlXG4gICAgICAgICAgLy8gKHRoZSBwYXJlbnQgc2NvcGUpIGZvciB0aGlzIHN1YmZsb3cncyBrZXlzLlxuICAgICAgICB9XG4gICAgICAgIGVycm9yLnByZXBlbmRTdWJmbG93KHN1YmZsb3dJZCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgc3ViZmxvd0Vycm9yID0gZXJyb3I7XG4gICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdzdWJmbG93RXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICAvLyBBbHdheXMgbWVyZ2UgbmVzdGVkIHN1YmZsb3cgcmVzdWx0cyAoZXZlbiBvbiBlcnJvciDigJQgcGFydGlhbCByZXN1bHRzIGFpZCBkZWJ1Z2dpbmcpXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhdmVyc2VySGFuZGxlLmdldFN1YmZsb3dSZXN1bHRzKCkpIHtcbiAgICAgICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBCcmVhayBwcm9wYWdhdGlvbiAob3B0LWluIHZpYSBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrKSDilIDilIBcbiAgICAvL1xuICAgIC8vIElmIHRoZSBzdWJmbG93J3MgaW5uZXIgdHJhdmVyc2FsIGJyb2tlIChiZWNhdXNlIGEgc3RhZ2UgY2FsbGVkXG4gICAgLy8gYHNjb3BlLiRicmVhayhyZWFzb24pYCkgQU5EIHRoZSBtb3VudCBkZWNsYXJlZCBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLFxuICAgIC8vIGZvcndhcmQgdGhlIGJyZWFrIHN0YXRlIHRvIHRoZSBQQVJFTlQncyBicmVha0ZsYWcuIFRoZSBwYXJlbnRcbiAgICAvLyB0cmF2ZXJzZXIgd2lsbCBzZWUgYHNob3VsZEJyZWFrYCBvbiBpdHMgbmV4dCBzdGVwIGFuZCBzdG9wLlxuICAgIC8vXG4gICAgLy8gV2l0aG91dCB0aGlzLCBpbm5lciBicmVha3MgYXJlIGxvY2FsbHkgc2NvcGVkIHRvIHRoZSBzdWJmbG93IOKAlCB0aGVcbiAgICAvLyBwYXJlbnQgY29udGludWVzIGFzIGlmIHRoZSBzdWJmbG93IHJldHVybmVkIG5vcm1hbGx5LlxuICAgIC8vXG4gICAgLy8gSU1QT1JUQU5UOiB0aGlzIHJ1bnMgQkVGT1JFIGBvdXRwdXRNYXBwaW5nYCBiZWxvdywgaW50ZW50aW9uYWxseS4gVGhlXG4gICAgLy8gb3V0cHV0TWFwcGVyIHN0aWxsIGV4ZWN1dGVzLCBzbyB0aGUgc3ViZmxvdydzIHBhcnRpYWwgcmVzdWx0IHN0aWxsXG4gICAgLy8gbGFuZHMgaW4gdGhlIHBhcmVudCBzY29wZS4gQ29uc3VtZXJzIHdobyBuZWVkIHRvIHN1cHByZXNzIG91dHB1dCBvblxuICAgIC8vIGJyZWFrIGNoZWNrIHRoZSBicmVhayBzdGF0ZSBpbnNpZGUgdGhlaXIgb3V0cHV0TWFwcGVyIGFuZCBlYXJseS1yZXR1cm4uXG4gICAgLy8gU2VlIGBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrYCBKU0RvYyBmb3IgcmF0aW9uYWxlLlxuICAgIGlmICh0cmF2ZXJzZXJIYW5kbGUgJiYgbW91bnRPcHRpb25zPy5wcm9wYWdhdGVCcmVhayA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaW5uZXJCcmVhayA9IHRyYXZlcnNlckhhbmRsZS5nZXRCcmVha1N0YXRlKCk7XG4gICAgICBpZiAoaW5uZXJCcmVhay5zaG91bGRCcmVhaykge1xuICAgICAgICBicmVha0ZsYWcuc2hvdWxkQnJlYWsgPSB0cnVlO1xuICAgICAgICBpZiAoaW5uZXJCcmVhay5yZWFzb24gIT09IHVuZGVmaW5lZCAmJiBicmVha0ZsYWcucmVhc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBicmVha0ZsYWcucmVhc29uID0gaW5uZXJCcmVhay5yZWFzb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmFpc2UgYSBwYXJlbnQtbGV2ZWwgb25CcmVhayBldmVudCBzbyByZWNvcmRlcnMgY2FuIGRpc3Rpbmd1aXNoXG4gICAgICAgIC8vIHRoZSBpbm5lciBvcmlnaW5hdGluZyBicmVhayAoZmlyZWQgaW5zaWRlIHRoZSBzdWJmbG93KSBmcm9tIHRoaXNcbiAgICAgICAgLy8gcHJvcGFnYXRlZCBvbmUgKGZpcmVkIGF0IHRoZSBtb3VudCBsZXZlbCBvbiB0aGUgcGFyZW50KS5cbiAgICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKHN1YmZsb3dOYW1lLCBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LCBpbm5lckJyZWFrLnJlYXNvbiwgc3ViZmxvd0lkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93VHJlZUNvbnRleHQgPSBuZXN0ZWRSdW50aW1lLmdldFNuYXBzaG90KCk7XG5cbiAgICAvLyDilIDilIDilIAgT3V0cHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgaWYgKCFzdWJmbG93RXJyb3IgJiYgbW91bnRPcHRpb25zPy5vdXRwdXRNYXBwZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoZSBtZXJnZS1iYWNrIGlzIHRoZSBNT1VOVCdzIGFjdCwgc28gdGhlIG1vdW50J3MgZnJhbWUgc3RhZ2VzIGFuZFxuICAgICAgICAvLyBjb21taXRzIGl0IOKAlCBpdHMgYnVuZGxlIGNhcnJpZXMgdGhlIG1vdW50J3MgcnVudGltZVN0YWdlSWQgKFIxMykuXG4gICAgICAgIC8vIEEgYnJhbmNoIG9yIGZvcmstY2hpbGQgbW91bnQgc3RpbGwgbGFuZHMgaXRzIHZhbHVlcyB3aGVyZSBpdHNcbiAgICAgICAgLy8gcGFyZW50IHdyaXRlcyAodGhlIHBhcmVudCdzIHJ1biBuYW1lc3BhY2UpLCBhcyBiZWZvcmU7IHVudGlsIDkuMzMuMFxuICAgICAgICAvLyBpdCBjb21taXR0ZWQgT04gdGhlIHBhcmVudCdzIGZyYW1lLCBzbyB0aGUgYnVuZGxlIG5hbWVkIHRoZSBzdGFnZVxuICAgICAgICAvLyBiZWZvcmUgdGhlIG1vdW50LCBvciB0aGUgYnJhbmNoaW5nIGRlY2lkZXIuXG4gICAgICAgIGNvbnN0IG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkge1xuICAgICAgICAgIG91dHB1dENvbnRleHQudXNlQWRkcmVzc09mKHBhcmVudENvbnRleHQucGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gb3V0cHV0Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBGb3IgVHlwZWRTY29wZSBzdWJmbG93cywgc3RhZ2UgZnVuY3Rpb25zIHJldHVybiB2b2lkIOKAlCBmYWxsIGJhY2sgdG8gYSBzaGFsbG93IGNsb25lXG4gICAgICAgIC8vIG9mIHRoZSBzdWJmbG93J3Mgc2hhcmVkIHN0YXRlIHNvIG91dHB1dE1hcHBlciBjYW4gYWNjZXNzIGFsbCBzY29wZSB2YWx1ZXMgd3JpdHRlblxuICAgICAgICAvLyBkdXJpbmcgdGhlIHN1YmZsb3cuIFdlIHNoYWxsb3ctY2xvbmUgdG8gYXZvaWQgYWxpYXNpbmcgdGhlIGxpdmUgU2hhcmVkTWVtb3J5IGNvbnRleHQuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBmdWxsIHNjb3BlIGlzIHBhc3NlZCAobm90IGp1c3QgZGVjbGFyZWQgb3V0cHV0cykg4oCUIG91dHB1dE1hcHBlciBtdXN0XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgc2VsZWN0IHdoYXQgdG8gcHJvcGFnYXRlIHRvIHRoZSBwYXJlbnQuXG4gICAgICAgIC8vIFJlZGFjdGlvbjogYGFwcGx5T3V0cHV0TWFwcGluZ2Agd3JpdGVzIHRocm91Z2ggYG91dHB1dENvbnRleHRgIChhXG4gICAgICAgIC8vIFN0YWdlQ29udGV4dCwgbm90IGEgZmFjYWRlKS4gVGhlIGNvbnRleHQncyB3cml0ZSBmdW5uZWwgYXNrcyB0aGVcbiAgICAgICAgLy8gcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHNoYXJlZCB3aXRoIHRoZSBzdWJmbG93J3MgY29udGV4dHMsIHNvIGEga2V5XG4gICAgICAgIC8vIHRoZSBwb2xpY3kgbmFtZXMgT1IgYSBrZXkgbWFya2VkIHBlci1jYWxsIGluc2lkZSB0aGUgc3ViZmxvdyBpc1xuICAgICAgICAvLyBzY3J1YmJlZCBpbiB0aGUgUEFSRU5UJ3MgbG9nIGFuZCBtaXJyb3IgdG9vICg5LjE5LjA7IGJlZm9yZSwgdGhpc1xuICAgICAgICAvLyBtZXJnZS1iYWNrIHJldGFpbmVkIHBsYWludGV4dCkuXG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZU91dHB1dCA9IHN1YmZsb3dPdXRwdXQgPz8geyAuLi5zdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUgfTtcbiAgICAgICAgY29uc3QgbWFwcGVkT3V0cHV0ID0gYXBwbHlPdXRwdXRNYXBwaW5nKGVmZmVjdGl2ZU91dHB1dCwgcGFyZW50U2NvcGUsIG91dHB1dENvbnRleHQsIG1vdW50T3B0aW9ucyk7XG5cbiAgICAgICAgb3V0cHV0Q29udGV4dC5jb21taXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gQSBtZXJnZS1iYWNrIHRoYXQgZmFpbGVkIHRvIGNvbW1pdCAoYW4gdW5jbG9uZWFibGUgdmFsdWUpIGxlYXZlcyBpdHNcbiAgICAgICAgLy8gd3JpdGVzIHN0YWdlZCBvbiB0aGUgbW91bnQncyBmcmFtZTsgdGhlIG1vdW50J3MgZXhpdCBjb21taXQgYmVsb3dcbiAgICAgICAgLy8gd291bGQgdGhyb3cgdGhlbSBhZ2Fpbiwgb3V0c2lkZSB0aGlzIGNhdGNoLiBUaHJvdWdoIDkuMzMuMCB0aGV5XG4gICAgICAgIC8vIHdlcmUgc3RhZ2VkIG9uIHRoZSBwYXJlbnQncyBmcmFtZSwgd2hpY2ggd2FzIG5vdCBjb21taXR0ZWQgYWdhaW4sXG4gICAgICAgIC8vIHNvIHRoZSBydW4gd2VudCBvbiDigJQgZHJvcCB0aGVtLCBhcyBpdCBkaWQuIEEgbGluZWFyIG1vdW50J3MgZnJhbWVcbiAgICAgICAgLy8gaXMgbGVmdCBhcyBpdCBhbHdheXMgd2FzLlxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkgcGFyZW50Q29udGV4dC5kaXNjYXJkU3RhZ2VkKCk7XG4gICAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ291dHB1dE1hcHBlckVycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIG91dHB1dE1hcHBlciBmb3Igc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dSZXN1bHQ6IFN1YmZsb3dSZXN1bHQgPSB7XG4gICAgICBzdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgIGdsb2JhbENvbnRleHQ6IHN1YmZsb3dUcmVlQ29udGV4dC5zaGFyZWRTdGF0ZSxcbiAgICAgICAgc3RhZ2VDb250ZXh0czogc3ViZmxvd1RyZWVDb250ZXh0LmV4ZWN1dGlvblRyZWUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgaGlzdG9yeTogc3ViZmxvd1RyZWVDb250ZXh0LmNvbW1pdExvZyxcbiAgICAgICAgLy8gVGhlIHN1YmZsb3cncyBvd24gZm9sZCBiYXNlIHRyYXZlbHMgd2l0aCBpdHMgb3duIGxvZyDigJQgc2FtZVxuICAgICAgICAvLyBjb250cmFjdCBhcyB0aGUgcnVuLWxldmVsIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYC5cbiAgICAgICAgaW5pdGlhbFN0YXRlOiBzdWJmbG93VHJlZUNvbnRleHQuaW5pdGlhbFN0YXRlLFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWdlSWQ6IHBhcmVudENvbnRleHQuZ2V0U3RhZ2VJZCgpLFxuICAgIH07XG5cbiAgICBjb25zdCBzdWJmbG93RGVmID0gdGhpcy5kZXBzLnN1YmZsb3dzPy5bc3ViZmxvd0lkXTtcbiAgICBpZiAoc3ViZmxvd0RlZiAmJiAoc3ViZmxvd0RlZiBhcyBhbnkpLmJ1aWxkVGltZVN0cnVjdHVyZSkge1xuICAgICAgc3ViZmxvd1Jlc3VsdC5waXBlbGluZVN0cnVjdHVyZSA9IChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlO1xuICAgIH1cblxuICAgIC8vIFRoZSBzZXJ2ZWQgc3RhdGUgKDkuMjAuMCk6IHRoZSBuZXN0ZWQgbWlycm9yJ3MgZmluYWwgc3RhdGUsIHJlbWVtYmVyZWRcbiAgICAvLyBCRVNJREUgdGhlIHJlc3VsdCDigJQgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIHN0YXlzIHRoZSBsaXZlIGhlYXAgZm9yXG4gICAgLy8gdGhlIHBsYWluIHNuYXBzaG90IGFuZCB0aGUgY2hlY2twb2ludDsgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYFxuICAgIC8vIHN1YnN0aXR1dGVzIHRoZSBtaXJyb3IgdGhyb3VnaCBgc2VydmVkU3ViZmxvd1Jlc3VsdHNgLiBBYnNlbnQgd2l0aG91dFxuICAgIC8vIGEgcG9saWN5LiBUaGUgZXhpdCBldmVudCBiZWxvdyBjYXJyaWVzIHRoZSBzYW1lIHNlcnZlZCB2aWV3OyB3aXRob3V0IGFcbiAgICAvLyBtaXJyb3IgaXQgY2FycmllcyB0aGUgaGVhcCByZXRhaW5lZCB1bmRlciB0aGUgcnVsZSAocGVyLWNhbGwgbWFya3NcbiAgICAvLyBhbG9uZSBrZWVwIG5vIG1pcnJvcikg4oCUIHRoZSBzYW1lIG9iamVjdCB3aGVuIG5vdGhpbmcgaXMgcmVkYWN0ZWQuXG4gICAgY29uc3QgcmF3U3RhdGUgPSBzdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHQ7XG4gICAgY29uc3QgbWlycm9yU3RhdGUgPSBuZXN0ZWRSdW50aW1lLnJlZGFjdGVkU3RvcmU/LmdldFN0YXRlKCk7XG4gICAgaWYgKG1pcnJvclN0YXRlICE9PSB1bmRlZmluZWQpIHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUoc3ViZmxvd1Jlc3VsdCwgbWlycm9yU3RhdGUpO1xuICAgIGNvbnN0IGV4aXRTdGF0ZSA9IG1pcnJvclN0YXRlID8/IChyZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5SZWNvcmQocmF3U3RhdGUpIDogcmF3U3RhdGUpO1xuXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KHN1YmZsb3dJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgLy8gQWRkaXRpdmUgcGVyLWV4ZWN1dGlvbiBrZXkgKGRlc2lnbjogZG9jcy9kZXNpZ24vc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eS5tZCkuIEEgTE9PUElOR1xuICAgIC8vIHN1YmZsb3cgcmUtZW50ZXJzIHdpdGggdGhlIFNBTUUgc3ViZmxvd0lkLCBzbyB0aGUgcGF0aCBrZXkgYWJvdmUgaXMgT1ZFUldSSVRURU4gZWFjaFxuICAgIC8vIGl0ZXJhdGlvbiAoYmFjay1jb21wYXQ6IGl0IGhvbGRzIHRoZSBMQVNUIGl0ZXJhdGlvbiDigJQgd2hhdCBnZXRTdWJ0cmVlU25hcHNob3QvbGlzdFN1YmZsb3dQYXRoc1xuICAgIC8vIGFuZCB0aGUgZXVpIGZhbGxiYWNrIHNlZSwgdW5jaGFuZ2VkKS4gQUxTTyBrZXkgYnkgdGhlIG1vdW50J3MgVU5JUVVFIHJ1bnRpbWVTdGFnZUlkIHNvIEVWRVJZXG4gICAgLy8gaXRlcmF0aW9uJ3MgcmVzdWx0IGlzIHJldGFpbmVkIGFuZCBhZGRyZXNzYWJsZSAoZXVpIHBlci1sb29wIGRyaWxsLWRvd24sIHBlci1zY29wZSBsb2NhbGl6YXRpb24pLlxuICAgIC8vIHJ1bnRpbWVTdGFnZUlkIGFsd2F5cyBjb250YWlucyAnIyc7IHN1YmZsb3dJZCBuZXZlciBkb2VzIOKAlCBzbyB0aGV5IG5ldmVyIGNvbGxpZGUsIGFuZFxuICAgIC8vIGxpc3RTdWJmbG93UGF0aHMgZmlsdGVycyAnIycga2V5cyB0byBrZWVwIGl0cyBwYXRoLW9ubHkgY29udHJhY3QuIFRoZSBwYXVzZSBjaGVja3BvaW50IGZpbHRlcnNcbiAgICAvLyB0aGVzZSBvdXQgKGJ1aWxkUGF1c2VDaGVja3BvaW50KSBzbyBpdCBzdGF5cyBsZWFuLlxuICAgIGNvbnN0IG1vdW50UnVudGltZVN0YWdlSWQgPSBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAobW91bnRSdW50aW1lU3RhZ2VJZCAmJiBtb3VudFJ1bnRpbWVTdGFnZUlkICE9PSBzdWJmbG93SWQpIHtcbiAgICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChtb3VudFJ1bnRpbWVTdGFnZUlkLCBzdWJmbG93UmVzdWx0KTtcbiAgICB9XG5cbiAgICBwYXJlbnRDb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ3N1YmZsb3cnLCBgRXhpdGluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0V4aXQoc3ViZmxvd05hbWUsIHN1YmZsb3dJZCwgcGFyZW50VHJhdmVyc2FsQ29udGV4dCwgZXhpdFN0YXRlKTtcblxuICAgIHBhcmVudENvbnRleHQuY29tbWl0KCk7XG5cbiAgICBpZiAoc3ViZmxvd0Vycm9yKSB7XG4gICAgICB0aHJvdyBzdWJmbG93RXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCB0aGUgcnVuJ3MgcmVkYWN0aW9uIGludG8gYSBuZXN0ZWQgcm9vdCB0aGUgd2F5IHRoZSBkaWFscyBhcmUgcHVzaGVkXG4gICAqIOKAlCB0aGUgdHJpcGxpY2F0ZWQgcHJvcGFnYXRpb24gKHJvb3QgaW5zdGFsbCDCtyBjcmVhdGVOZXh0L2NyZWF0ZUNoaWxkIMK3XG4gICAqIHRoaXMgaG9wKS4gQ2FsbGVkIFRXSUNFIG9uIHB1cnBvc2U6IG9uIHRoZSBydW50aW1lJ3MgZmlyc3Qgcm9vdCwgc28gdGhlXG4gICAqIFNFRUQgY29tbWl0IChgaGlzdG9yeVswXWApIHJldGFpbnMgYW5kIG1pcnJvcnMgdW5kZXIgdGhlIHBvbGljeSwgYW5kIG9uXG4gICAqIHRoZSBGSU5BTCByb290IGFmdGVyIHRoZSBzZWVkaW5nIGJsb2NrIHJlcGxhY2VzIGl0LiBSdWxlIGJlZm9yZSBtaXJyb3IsXG4gICAqIGFzIHRoZSBleGVjdXRvciBvcmRlcnMgdGhlbSAodGhlIG1pcnJvcidzIHNlZWQgaXMgc2NydWJiZWQgd2l0aCB0aGUgcnVsZTtcbiAgICogZm9yIGEgbmVzdGVkIHJ1bnRpbWUgdGhhdCBzZWVkIGlzIGVtcHR5IOKAlCBpdHMgaW5wdXQgYXJyaXZlcyBhcyBhIGNvbW1pdCkuXG4gICAqIGBlbmFibGVSZWRhY3RlZE1pcnJvcmAgaXMgaWRlbXBvdGVudCwgc28gdGhlIHNlY29uZCBjYWxsIG9ubHkgcmUtaW5zdGFsbHNcbiAgICogdGhlIE9ORSBtaXJyb3Igb24gdGhlIGZyZXNoIHJvb3QuXG4gICAqL1xuICBwcml2YXRlIGluaGVyaXRSZWRhY3Rpb24oXG4gICAgcnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgcm9vdDogU3RhZ2VDb250ZXh0LFxuICAgIHJ1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQsXG4gICAga2VlcHNNaXJyb3I6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGlmIChydWxlKSByb290LnVzZVJlZGFjdGlvblJ1bGUocnVsZSk7XG4gICAgaWYgKCFrZWVwc01pcnJvcikgcmV0dXJuO1xuICAgIHJ1bnRpbWUuZW5hYmxlUmVkYWN0ZWRNaXJyb3I/LigpO1xuICAgIGlmIChydW50aW1lLnJlZGFjdGVkU3RvcmUpIHJvb3QudXNlUmVkYWN0ZWRNaXJyb3IocnVudGltZS5yZWRhY3RlZFN0b3JlKTtcbiAgfVxufVxuIl19
|
|
388
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFJSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBOEI7SUFDdkQsSUFBSSxHQUF3QyxDQUFDO0lBQzdDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFBRSxTQUFTO1FBQ25DLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDO0FBQ3RCLENBQUM7QUFFRCx5R0FBeUc7QUFDekcsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxJ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U0FBUyxFQUFFLFdBQVcsV0FBVyxVQUFVLEVBQUU7WUFDN0UsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUV0RyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFdkIsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixNQUFNLFlBQVksQ0FBQztRQUNyQixDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdWJmbG93RXhlY3V0b3Ig4oCUIElzb2xhdGlvbiBib3VuZGFyeSBmb3Igc3ViZmxvdyBleGVjdXRpb24uXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGlzb2xhdGVkIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIGVhY2ggc3ViZmxvd1xuICogLSBBcHBseSBpbnB1dC9vdXRwdXQgbWFwcGluZyB2aWEgU3ViZmxvd0lucHV0TWFwcGVyXG4gKiAtIERlbGVnYXRlIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAqIC0gVHJhY2sgc3ViZmxvdyByZXN1bHRzIGZvciBkZWJ1Z2dpbmcvdmlzdWFsaXphdGlvblxuICpcbiAqIEVhY2ggc3ViZmxvdyBnZXRzIGl0cyBvd24gR2xvYmFsU3RvcmUgZm9yIGlzb2xhdGlvbi5cbiAqIFRyYXZlcnNhbCB1c2VzIHRoZSBTQU1FIDctcGhhc2UgYWxnb3JpdGhtIGFzIHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2VyXG4gKiAodmlhIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KSwgc28gZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGxhenkgc3ViZmxvd3MsXG4gKiBhbmQgYWJvcnQgc2lnbmFscyBhbGwgd29yayBpbnNpZGUgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJ1blBvbGljeSB9IGZyb20gJy4uLy4uL21lbW9yeS9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBTdWJmbG93VHJhdmVyc2VySGFuZGxlLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBSZXN1bWVFbnRyeSB9IGZyb20gJy4vUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHsgcmVtZW1iZXJSZWRhY3RlZFN1YmZsb3dTdGF0ZSB9IGZyb20gJy4vc2VydmVkU3ViZmxvd1Jlc3VsdHMuanMnO1xuaW1wb3J0IHsgYXBwbHlPdXRwdXRNYXBwaW5nLCBnZXRJbml0aWFsU2NvcGVWYWx1ZXMsIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUgfSBmcm9tICcuL1N1YmZsb3dJbnB1dE1hcHBlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSBtYXBwZWQgaW5wdXQsIGRldGFjaGVkIGZyb20gdGhlIHBhcmVudCdzIHN0YXRlIE9OQ0UgcGVyIG1vdW50IChEMSxcbiAqIDkuMjkuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCkuXG4gKlxuICogVGhlIGlucHV0TWFwcGVyIHJlYWRzIHRoZSBwYXJlbnQncyBMSVZFIHN0YXRlIChgZ2V0U2NvcGUoKWApLCBzbyBhIHZhbHVlIGl0XG4gKiBwYXNzZXMgdGhyb3VnaCAoYChwKSA9PiAoeyBjZmc6IHAuY2ZnIH0pYCkgaXMgdGhlIHBhcmVudCdzIGNvbW1pdHRlZFxuICogb2JqZWN0IOKAlCBhbmQgdGhlIHN1YmZsb3cncyBhcmdzIGFyZSBkZWVwLUZST1pFTiBpbiBwbGFjZVxuICogKGByZWFkb25seUlucHV0IMK3IGNyZWF0ZUZyb3plbkFyZ3NgKS4gVGhlIHR5cGVkIHNjb3BlIGRvZXMgbm90IHByb3h5IGFcbiAqIGZyb3plbiB2YWx1ZSAoYGFsbG93bGlzdCDCtyBzaG91bGRXcmFwV2l0aFByb3h5YCksIHNvIGEgbGF0ZXJcbiAqIGBzY29wZS5jZmcueCA9IDFgIGluIHRoZSBwYXJlbnQgbWV0IHRoZSByYXcgZnJvemVuIG9iamVjdDogYSBUeXBlRXJyb3IgaW5cbiAqIHN0cmljdCBjb2RlLiBCZWZvcmUgOS4yOS4wIHRoZSBwYXJlbnQncyBuZXh0IHdob2xlLXN0YXRlIGNsb25lIHJlcGxhY2VkIHRoZVxuICogZnJvemVuIG9iamVjdCAoYSBtb3VudCB0aGF0IGNvbW1pdHRlZCBub3RoaW5nIGxlZnQgaXQgaW4gcGxhY2Ug4oCUIHRoZSBidWdcbiAqIGV4aXN0ZWQsIGl0IHdhcyBvbmx5IHNob3J0LWxpdmVkKTsgdW5kZXIgY29weS1vbi13cml0ZSBub3RoaW5nIHJlLWNsb25lcyxcbiAqIHNvIHRoZSBmcmVlemUgd291bGQgbGFzdCB1bnRpbCB0aGUga2V5IGlzIHJld3JpdHRlbi4gQSBtb3VudCBtdXN0IG5ldmVyXG4gKiBlZGl0IOKAlCBvciBmcmVlemUg4oCUIHRoZSBwYXJlbnQncyBjb21taXR0ZWQgb2JqZWN0czogZXZlcnkgcGxhaW4gb2JqZWN0LFxuICogYXJyYXksIGBEYXRlYCwgYE1hcGAgYW5kIGBTZXRgIHRoZSBtYXBwZXIgcmV0dXJucyBpcyBjbG9uZWQgaGVyZSwgYmVmb3JlIGl0XG4gKiBiZWNvbWVzIHRoZSBhcmdzLiBBIGNsYXNzIGluc3RhbmNlIHBhc3NlcyBieSByZWZlcmVuY2UsIGFzIGJlZm9yZSAoaXRcbiAqIGNhbm5vdCBjb21lIGZyb20gY29tbWl0dGVkIHN0YXRlLCBhbmQgYSBjbG9uZSB3b3VsZCBkcm9wIGl0cyBwcm90b3R5cGUpLlxuICogVGhlIHNlZWQgaXMgY2xvbmVkIGFnYWluIGF0IGl0cyBjb21taXQsIHNvIHRoZSBzdWJmbG93J3Mgc3RhdGUgaXNcbiAqIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gZGV0YWNoTWFwcGVkSW5wdXQoaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgaWYgKCFpc0RldGFjaGFibGUodmFsdWUpKSBjb250aW51ZTtcbiAgICAob3V0ID8/PSB7IC4uLmlucHV0IH0pW2tleV0gPSBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG4gIHJldHVybiBvdXQgPz8gaW5wdXQ7XG59XG5cbi8qKiBBIHZhbHVlIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlcHJvZHVjZXMgd2l0aCBpdHMgb3duIHR5cGU6IHBsYWluIG9iamVjdCwgYXJyYXksIGBEYXRlYCwgYE1hcGAsIGBTZXRgLiAqL1xuZnVuY3Rpb24gaXNEZXRhY2hhYmxlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIFN1YmZsb3dFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoYGRlcHMucmVzdW1lYCksIG9yIGEgc2VlZC1vbmx5IG9uZSBidWlsdFxuICAgKiBmcm9tIHRoZSBkZXByZWNhdGVkIGBkZXBzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWVgLiBVbmRlZmluZWQgb24gYSBub3JtYWxcbiAgICogcnVuLiBBc2tlZCBvbmNlIHBlciBzdWJmbG93IGVudHJ5IOKAlCBzZWUge0BsaW5rIFJlc3VtZUVudHJ5fS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzdW1lOiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGVwczogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPixcbiAgICBwcml2YXRlIHRyYXZlcnNlckZhY3Rvcnk6IFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5PFRPdXQsIFRTY29wZT4sXG4gICkge1xuICAgIHRoaXMucmVzdW1lID1cbiAgICAgIGRlcHMucmVzdW1lID8/XG4gICAgICAoZGVwcy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lID8gUmVzdW1lRW50cnkuZnJvbUNhcHR1cmVzPFRPdXQsIFRTY29wZT4oZGVwcy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lKSA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHN1YmZsb3cgd2l0aCBpc29sYXRlZCBjb250ZXh0LlxuICAgKlxuICAgKiAxLiBDcmVhdGVzIGEgZnJlc2ggRXhlY3V0aW9uUnVudGltZSBmb3IgdGhlIHN1YmZsb3dcbiAgICogMi4gQXBwbGllcyBpbnB1dCBtYXBwaW5nIHRvIHNlZWQgdGhlIHN1YmZsb3cncyBHbG9iYWxTdG9yZVxuICAgKiAzLiBEZWxlZ2F0ZXMgdHJhdmVyc2FsIHRvIGEgZmFjdG9yeS1jcmVhdGVkIEZsb3djaGFydFRyYXZlcnNlclxuICAgKiA0LiBBcHBsaWVzIG91dHB1dCBtYXBwaW5nIHRvIHdyaXRlIHJlc3VsdHMgYmFjayB0byBwYXJlbnQgc2NvcGVcbiAgICogNS4gU3RvcmVzIGV4ZWN1dGlvbiBkYXRhIGZvciBkZWJ1Z2dpbmcvdmlzdWFsaXphdGlvblxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVN1YmZsb3coXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgcGFyZW50Q29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdWJmbG93UmVzdWx0c01hcDogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4sXG4gICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc3ViZmxvd0lkID0gbm9kZS5zdWJmbG93SWQhO1xuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbm9kZS5zdWJmbG93TmFtZSA/PyBub2RlLm5hbWU7XG5cbiAgICBwYXJlbnRDb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ3N1YmZsb3cnLCBgRW50ZXJpbmcgJHtzdWJmbG93TmFtZX0gc3ViZmxvd2AsIHtcbiAgICAgIHRhcmdldFN0YWdlOiBzdWJmbG93SWQsXG4gICAgfSk7XG5cbiAgICAvLyDilIDilIDilIAgUmVzdW1lIHJlLWVudHJ5IChvbmUtc2hvdCkg4pSA4pSA4pSAXG4gICAgLy9cbiAgICAvLyBXaGVuIHRoaXMgZW50cnkgaXMgdGhlIHJlc3VtZSdzIHdheSBiYWNrIGludG8gYSBwYXVzZWQgc3ViZmxvdywgdGhlXG4gICAgLy8gaG9wIG5hbWVzIHdoZXJlIHRoZSBzdWJmbG93J3MgdHJhdmVyc2FsIHN0YXJ0cyAodGhlIG5leHQgbW91bnQgb24gdGhlXG4gICAgLy8gcGF1c2UgcGF0aCwgb3IgdGhlIHBhdXNlZCBzdGFnZSdzIHN0YW5kLWluKSwgY2FycmllcyB0aGUgc3ViZmxvdydzXG4gICAgLy8gY2FwdHVyZWQgcHJlLXBhdXNlIHN0YXRlLCBhbmQgYW55IHNpYmxpbmcgcGF1c2VzIHdhaXRpbmcgaW4gaXQuIFRha2VuXG4gICAgLy8gT05DRTogYW55IGxhdGVyIGVudHJ5IGludG8gdGhpcyBzdWJmbG93IOKAlCBhIGxvb3AgcGFzc2luZyBpdHMgbW91bnRcbiAgICAvLyBhZ2FpbiDigJQgZ2V0cyBgdW5kZWZpbmVkYCBhbmQgcnVucyB0aGUgcmVhbCBzdWJmbG93IGZyb20gaXRzIHJlYWwgcm9vdCxcbiAgICAvLyBpbnB1dE1hcHBlciBhbmQgYWxsLlxuICAgIGNvbnN0IHJlc3VtZUhvcCA9IHRoaXMucmVzdW1lPy5lbnRlclN1YmZsb3coc3ViZmxvd0lkKTtcblxuICAgIC8vIOKUgOKUgOKUgCBJbnB1dCBNYXBwaW5nIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gVGhlIG1hcHBlciBydW5zIG9uIEVWRVJZIGVudHJ5OiBpdHMgcmVzdWx0IGlzIHRoZSBzdGFnZXMnIHJlYWQtb25seVxuICAgIC8vIGFyZ3MgKGAkZ2V0QXJncygpYCksIGFuZCBhIHJlLWVudGVyZWQgc3ViZmxvdydzIHN0YWdlcyByZWFkIHRoZSBzYW1lXG4gICAgLy8gYXJncyB0aGV5IHJlYWQgYmVmb3JlIHRoZSBwYXVzZSAodGhlIHBhcmVudCdzIHZpZXcgaXMgdGhlIHNhbWUgb25lIOKAlFxuICAgIC8vIGl0IHdhcyBibG9ja2VkIGluIHRoaXMgbW91bnQpLiBXaGF0IGEgcmVzdW1lIGNoYW5nZXMgaXMgb25seSB0aGUgU0VFRDpcbiAgICAvLyB3aGVuIHRoZSBob3AgY2FycmllcyBhIGNhcHR1cmUsIHRoZSBuZXN0ZWQgbWVtb3J5IGlzIHNlZWRlZCBmcm9tIHRoZVxuICAgIC8vIGNhcHR1cmUsIG5vdCBmcm9tIHRoZSBtYXBwZXIg4oCUIHRoZSBjYXB0dXJlIGlzIHRoZSBwb3N0LWlucHV0IHByZS1wYXVzZVxuICAgIC8vIG1lbW9yeSwgYW5kIHNlZWRpbmcgdGhlIG1hcHBlcidzIHZhbHVlcyB3b3VsZCBjbG9iYmVyIHBvc3QtaW5wdXRcbiAgICAvLyB3cml0ZXMgKGhpc3RvcnksIHBhdXNlZFRvb2xDYWxsSWQsIGV0Yy4pIHdpdGggdGhlIHN0YXJ0LW9mLXN1YmZsb3cgdmlldy5cbiAgICBjb25zdCBtb3VudE9wdGlvbnMgPSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnM7XG4gICAgbGV0IG1hcHBlZElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGNvbnN0IHJlc3VtZUNhcHR1cmUgPSByZXN1bWVIb3A/LnNlZWQ7XG4gICAgY29uc3QgaXNSZXN1bWVGb3JUaGlzU3ViZmxvdyA9IHJlc3VtZUNhcHR1cmUgIT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChtb3VudE9wdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gcGFyZW50Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICBtYXBwZWRJbnB1dCA9IGRldGFjaE1hcHBlZElucHV0KGdldEluaXRpYWxTY29wZVZhbHVlcyhwYXJlbnRTY29wZSwgbW91bnRPcHRpb25zKSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhtYXBwZWRJbnB1dCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIG1hcHBlZElucHV0IGlzIGNhcHR1cmVkIGluIFN1YmZsb3dSZXN1bHQudHJlZUNvbnRleHQgZm9yIGRlYnVnZ2luZ1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ2lucHV0TWFwcGVyRXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaW5wdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwgeyBlcnJvciB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHJ1bidzIHBvbGljeSAoRjUpIOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yXG4gICAgLy8gZmxhZyDigJQgcmVhZCBvZmYgdGhlIHBhcmVudC1tb3VudCBmcmFtZSwgd2hpY2ggaG9sZHMgaXQgYnkgcmVmZXJlbmNlLlxuICAgIC8vIFRoZSBuZXN0ZWQgcnVudGltZSBpcyBjb25zdHJ1Y3RlZCBXSVRIIGl0LCBzbyB0aGUgc2VlZCBjb21taXQgYmVsb3dcbiAgICAvLyAoYGhpc3RvcnlbMF1gKSBhbmQgZXZlcnkgbGF0ZXIgY29tbWl0IG9mIHRoZSBzdWJmbG93IHJ1biB1bmRlciB0aGUgc2FtZVxuICAgIC8vIG9iamVjdCwgYW5kIHRoZSBuZXN0ZWQgcnVudGltZSBrZWVwcyBhIG1pcnJvciBvZiBpdHMgb3duIGV4YWN0bHkgd2hlblxuICAgIC8vIHRoZSBydW4gZG9lcyAoaXRzIFNFUlZFRCBzdGF0ZSBpcyB0aGVuIHRoZSBmb2xkIG9mIGl0cyBvd24gc2NydWJiZWRcbiAgICAvLyBsb2csIG5ldmVyIGEgc2Vjb25kIHNjcnViKS5cbiAgICBjb25zdCBwb2xpY3k6IFJ1blBvbGljeSA9IHBhcmVudENvbnRleHQuZ2V0UG9saWN5KCk7XG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IHBvbGljeS5yZWRhY3Rpb247XG4gICAgLy8gTmFycmF0aXZlIHJlY2VpdmVzIHRoZSBSRVRBSU5FRCBmb3JtIG9mIHRoZSBtYXBwZWQgaW5wdXQg4oCUIGFuXG4gICAgLy8gaW5wdXRNYXBwZXIgbWF5IGluamVjdCB2YWx1ZXMgZnJvbSBhbnl3aGVyZSwgc28gdGhlIHNlZWQgaXMgc2NydWJiZWRcbiAgICAvLyB1bmRlciB0aGUgcG9saWN5IGJlZm9yZSBhbnkgcmVjb3JkZXIgc2VlcyBpdC4gU2FtZSBvYmplY3Qgd2hlbiBub3RoaW5nXG4gICAgLy8gaW4gaXQgaXMgcmVkYWN0ZWQgKHRoZSBuby1wb2xpY3kgcGF0aCBhbGxvY2F0ZXMgbm90aGluZykuXG4gICAgY29uc3QgbmFycmF0aXZlSW5wdXQgPSByZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5SZWNvcmQobWFwcGVkSW5wdXQpIDogbWFwcGVkSW5wdXQ7XG4gICAgLy8gYEZsb3dTdWJmbG93RXZlbnQuZGVzY3JpcHRpb25gIGlzIHNlbWFudGljYWxseSBcIndoYXQgdGhpcyBzdWJmbG93IGRvZXNcIiDigJQgc291cmNlZCBmcm9tXG4gICAgLy8gdGhlIHN1YmZsb3cncyBvd24gcm9vdCBzdGFnZSwgbm90IHRoZSBwYXJlbnQgbW91bnQgcG9pbnQuIFRoZSBtb3VudCBub2RlIG5ldmVyIGNhcnJpZXNcbiAgICAvLyBhIGRlc2NyaXB0aW9uIChidWlsZGVycyBkb24ndCBjb3B5IGl0KSwgc28gcmVhZGluZyBgbm9kZS5kZXNjcmlwdGlvbmAgaGVyZSByZXR1cm5zXG4gICAgLy8gYHVuZGVmaW5lZGAgYW5kIHRheG9ub215IG1hcmtlcnMgc2V0IG9uIHRoZSBzdWJmbG93IHJvb3QgKGUuZy4gYWdlbnRmb290cHJpbnQnc1xuICAgIC8vIGAnQWdlbnQ6IFJlQWN0IGxvb3AnYCAvIGAnTExNQ2FsbDogb25lLXNob3QnYCkgbmV2ZXIgcmVhY2ggZG93bnN0cmVhbSBjb25zdW1lcnMuXG4gICAgY29uc3Qgcm9vdERlc2NyaXB0aW9uID0gdGhpcy5kZXBzLnN1YmZsb3dzPy5bc3ViZmxvd0lkXT8ucm9vdD8uZGVzY3JpcHRpb247XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dFbnRyeShcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd0lkLFxuICAgICAgcm9vdERlc2NyaXB0aW9uID8/IG5vZGUuZGVzY3JpcHRpb24sXG4gICAgICBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LFxuICAgICAgbmFycmF0aXZlSW5wdXQsXG4gICAgKTtcbiAgICAvLyBQcm9wb3NhbCAjMDAzOiBmaXJlIG9uU3RhZ2VFeGVjdXRlZCBmb3IgdGhlIG1vdW50IG5vZGUgQUZURVJcbiAgICAvLyBvblN1YmZsb3dFbnRyeSBzbyBjb25zdW1lcnMgdHJhY2tpbmcgXCJkaWQgdGhpcyBzdGFnZSBydW5cIiB3b3JrXG4gICAgLy8gdW5pZm9ybWx5IGFjcm9zcyBsaW5lYXIgLyBkZWNpZGVyIC8gZm9yayAvIHNlbGVjdG9yIC8gc3ViZmxvdy1tb3VudC5cbiAgICAvLyBGaXJlcyBvbiBFTlRSWSAobm90IGV4aXQpIOKAlCBlbnRyeSA9IFwidGhpcyBtb3VudCByYW5cIjsgdGhlXG4gICAgLy8gc3ViZmxvdydzIGNoaWxkcmVuIGV4ZWN1dGUgYWZ0ZXIgYXMgc2VwYXJhdGUgc3RhZ2VzLlxuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKFxuICAgICAgbm9kZS5uYW1lLFxuICAgICAgcm9vdERlc2NyaXB0aW9uID8/IG5vZGUuZGVzY3JpcHRpb24sXG4gICAgICBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LFxuICAgICAgJ3N1YmZsb3ctbW91bnQnLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgaXNvbGF0ZWQgcnVudGltZSB2aWEgZHluYW1pYyBjb25zdHJ1Y3Rpb24gKGF2b2lkcyBjaXJjdWxhciBpbXBvcnQpLlxuICAgIC8vIEl0cyByb290IGNvbnRleHQgaXMgdGhlIGZpcnN0IHN0YWdlIHRoZSBzdWJmbG93IHRyYXZlcnNhbCBydW5zIOKAlCB0aGVcbiAgICAvLyByZXN1bWUgaG9wJ3MgZW50cnkgb24gYSByZS1lbnRyeSwgdGhlIHN1YmZsb3cncyByb290IG90aGVyd2lzZS5cbiAgICBjb25zdCBFeGVjdXRpb25SdW50aW1lQ2xhc3MgPSB0aGlzLmRlcHMuZXhlY3V0aW9uUnVudGltZS5jb25zdHJ1Y3RvciBhcyBuZXcgKFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgaWQ6IHN0cmluZyxcbiAgICAgIGRlZmF1bHRWYWx1ZXM6IHVuZGVmaW5lZCxcbiAgICAgIGluaXRpYWxTdGF0ZTogdW5kZWZpbmVkLFxuICAgICAgcG9saWN5OiBSdW5Qb2xpY3ksXG4gICAgKSA9PiBJRXhlY3V0aW9uUnVudGltZTtcbiAgICBjb25zdCBmaXJzdE5vZGUgPSByZXN1bWVIb3A/LmVudHJ5ID8/IG5vZGU7XG4gICAgY29uc3QgbmVzdGVkUnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lQ2xhc3MoZmlyc3ROb2RlLm5hbWUsIGZpcnN0Tm9kZS5pZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHBvbGljeSk7XG5cbiAgICAvLyBTZWVkIEdsb2JhbFN0b3JlIHdpdGggdGhlIHJpZ2h0IHNoYXBlIGZvciB0aGUgcGF0aDpcbiAgICAvLyAgIOKAoiBSZXN1bWUgaW50byBUSElTIHN1YmZsb3cg4oaSIHNlZWQgZnJvbSB0aGUgY2FwdHVyZWQgcHJlLXBhdXNlXG4gICAgLy8gICAgIHNjb3BlIHNvIHJlc3VtZSBoYW5kbGVycyBzZWUgaGlzdG9yeSwgcGF1c2VkVG9vbENhbGxJZCwgZXRjLlxuICAgIC8vICAgICAoYG1hcHBlZElucHV0YCBzdGlsbCByZWFjaGVzIHRoZSBzdGFnZXMsIGFzIHRoZWlyIHJlYWQtb25seSBhcmdzLilcbiAgICAvLyAgIOKAoiBOb3JtYWwgZW50cnkg4oaSIHNlZWQgZnJvbSB0aGUgaW5wdXRNYXBwZXIncyBtYXBwZWRJbnB1dC5cbiAgICBjb25zdCBzZWVkVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPyByZXN1bWVDYXB0dXJlISA6IG1hcHBlZElucHV0O1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWVkVmFsdWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgc2VlZCBpcyBjb21taXR0ZWQgYXMgdGhlIHN1YmZsb3cncyBgaGlzdG9yeVswXWAgYnkgaXRzIHJvb3RcbiAgICAgIC8vIGNvbnRleHQsIG5vdCBieSBhIGZhY2FkZSDigJQgdGhhdCBmcmFtZSBhbHJlYWR5IGhvbGRzIHRoZSBydW4ncyBwb2xpY3lcbiAgICAgIC8vICh0aGUgcnVudGltZSB3YXMgY29uc3RydWN0ZWQgd2l0aCBpdCksIHNvIHRoZSBzZWVkIHJldGFpbnMgdW5kZXIgdGhlXG4gICAgICAvLyBydWxlLCBsYW5kcyBpbiB0aGUgbWlycm9yIGFzIHRoZSBwbGFjZWhvbGRlciwgYW5kIGNvbW1pdHMgdW5kZXIgdGhlXG4gICAgICAvLyBydW4ncyBkaWFscyBsaWtlIGV2ZXJ5IG90aGVyIHdyaXRlIChDLUY1OiB1bmRlciBgd3JpdGVQcm92ZW5hbmNlOlxuICAgICAgLy8gJ3JlYWRzLXByZWZpeCdgIGl0cyByb3dzIGNhcnJ5IGByZWFkS2V5czogW11gKS5cbiAgICAgIC8vIFRoZSBzZWVkIGlzIHRoZSBtb3VudCdzIGFjdCB0b286IGl0cyBidW5kbGUg4oCUIGBoaXN0b3J5WzBdYCBvZiB0aGVcbiAgICAgIC8vIHN1YmZsb3cncyBvd24gbG9nIOKAlCBjYXJyaWVzIHRoZSBtb3VudCdzIHN0YWdlLCBzdGFnZUlkIGFuZFxuICAgICAgLy8gcnVudGltZVN0YWdlSWQgKFIxMzsgdGhyb3VnaCA5LjMzLjAgaXQgY2FycmllZCBydW50aW1lU3RhZ2VJZCAnJyBhbmRcbiAgICAgIC8vIHRoZSBmaXJzdCBzdGFnZSdzIG5hbWVzLCB3aGljaCBvbiBhIHJlc3VtZSB3YXMgdGhlIHJlLWVudHJ5IHBvaW50KS5cbiAgICAgIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUobmVzdGVkUnVudGltZSwgc2VlZFZhbHVlcywgcGFyZW50Q29udGV4dCk7XG4gICAgICAvLyBSZWZyZXNoIHJvb3RTdGFnZUNvbnRleHQgc28gV3JpdGVCdWZmZXIgc2VlcyBjb21taXR0ZWQgZGF0YS4gTmFtZWRcbiAgICAgIC8vIGFmdGVyIHRoZSBmaXJzdCBub2RlIGFnYWluIOKAlCB0aGUgc2VlZCBjb250ZXh0IG5vdyBjYXJyaWVzIHRoZSBtb3VudCdzXG4gICAgICAvLyBuYW1lcyAoUjEzKSwgd2hpY2ggYmVsb25nIHRvIHRoZSBzZWVkIGJ1bmRsZSBvbmx5LiBgbmV3Um9vdGAgZ2l2ZXMgaXRcbiAgICAgIC8vIHRoZSBzYW1lIHBvbGljeSBhbmQgbWlycm9yLlxuICAgICAgbmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbmVzdGVkUnVudGltZS5uZXdSb290KGZpcnN0Tm9kZS5uYW1lLCBmaXJzdE5vZGUuaWQpO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgc3ViZmxvdyByb290IG5vZGUg4oCUIHN0cmlwIGlzU3ViZmxvd1Jvb3QgdG8gcHJldmVudCByZS1kZWxlZ2F0aW9uLlxuICAgIC8vXG4gICAgLy8gUFJFU0VSVkUgYG5leHRgLiBFYXJsaWVyIHJldmlzaW9ucyBzdHJpcHBlZCBgbmV4dGAgd2hlbmV2ZXIgdGhlXG4gICAgLy8gc3ViZmxvdyByb290IGhhZCBjaGlsZHJlbiwgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBgbmV4dGAgd2FzXG4gICAgLy8gYWx3YXlzIHRoZSBPVVRFUiBtb3VudCdzIGNvbnRpbnVhdGlvbiBsZWFraW5nIGludG8gdGhlIGlubmVyXG4gICAgLy8gdHJlZS4gVGhhdCBhc3N1bXB0aW9uIHdhcyB3cm9uZzogdGhlIHJlc29sdmVkIHN1YmZsb3cgcm9vdCdzXG4gICAgLy8gYG5leHRgIGlzIHRoZSBJTk5FUiBqb2luIHN0YWdlIChlLmcuLCBQYXJhbGxlbCdzIE1lcmdlIGFmdGVyIGFcbiAgICAvLyBmYW4tb3V0LCBUb1QncyBQcnVuZXIpLiBTdHJpcHBpbmcgaXQgYnJva2UgY29tcG9zaXRlIHN1YmZsb3dzIOKAlFxuICAgIC8vIHRoZSBqb2luIHN0YWdlIG5ldmVyIHJhbiwgc28gdGhlIHN1YmZsb3cgcmV0dXJuZWQgcGFydGlhbCBzdGF0ZS5cbiAgICAvL1xuICAgIC8vIFRoZSBvdXRlciBtb3VudCdzIHBvc3Qtc3ViZmxvdyBjb250aW51YXRpb24gaXMgaGFuZGxlZCBzZXBhcmF0ZWx5XG4gICAgLy8gYnkgdGhlIHBhcmVudCB0cmF2ZXJzZXIgdmlhIGBwYXJlbnRDb250ZXh0Lm5leHROb2RlYCBhbmQgaXMgbmV2ZXJcbiAgICAvLyBjb25mbGF0ZWQgd2l0aCB0aGUgaW5uZXIgc3ViZmxvdydzIGBuZXh0YCBjaGFpbi5cbiAgICBjb25zdCBzdWJmbG93Tm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICAuLi5ub2RlLFxuICAgICAgaXNTdWJmbG93Um9vdDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIOKUgOKUgOKUgCBFeGVjdXRlIHZpYSBmYWN0b3J5IHRyYXZlcnNlciDilIDilIDilIBcbiAgICAvLyBUaGUgZmFjdG9yeSBjcmVhdGVzIGEgZnVsbCBGbG93Y2hhcnRUcmF2ZXJzZXIgd2l0aCB0aGUgc2FtZSA3LXBoYXNlIGFsZ29yaXRobSxcbiAgICAvLyBzaGFyaW5nIHRoZSBwYXJlbnQncyBzdGFnZU1hcCwgc3ViZmxvd3MgZGljdCwgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0b3IuXG4gICAgbGV0IHN1YmZsb3dPdXRwdXQ6IGFueTtcbiAgICBsZXQgc3ViZmxvd0Vycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdHJhdmVyc2VySGFuZGxlOiBTdWJmbG93VHJhdmVyc2VySGFuZGxlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgdHJhdmVyc2VySGFuZGxlID0gdGhpcy50cmF2ZXJzZXJGYWN0b3J5KHtcbiAgICAgICAgLy8gVGhlIFJFQUwgc3ViZmxvdyBncmFwaCDigJQgZXZlcnkgaWQgaW5zaWRlIHRoZSBzdWJmbG93IChsb29wIHRhcmdldHMsXG4gICAgICAgIC8vIGEgcmUtdmlzaXQgb2YgdGhlIHBhdXNlZCBzdGFnZSkgcmVzb2x2ZXMgYWdhaW5zdCBpdCwgcmUtZW50cnkgb3Igbm90LlxuICAgICAgICByb290OiBzdWJmbG93Tm9kZSxcbiAgICAgICAgLy8gV2hlcmUgdGhpcyB0cmF2ZXJzYWwgc3RhcnRzIG9uIGEgcmVzdW1lIHJlLWVudHJ5OyB2aXNpdGVkIG9uY2Ug4oCUXG4gICAgICAgIC8vIGFuZCB0aGUgc2libGluZyBwYXVzZXMgaXQgcmFpc2VzIG9uY2UgdGhhdCBlbnRyeSdzIGNoYWluIGVuZHMuXG4gICAgICAgIC4uLihyZXN1bWVIb3A/LmVudHJ5ICYmIHsgZW50cnk6IHJlc3VtZUhvcC5lbnRyeSB9KSxcbiAgICAgICAgLi4uKHJlc3VtZUhvcD8ucGVuZGluZ1BhdXNlcyAmJiB7IHBlbmRpbmdQYXVzZXM6IHJlc3VtZUhvcC5wZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgICBleGVjdXRpb25SdW50aW1lOiBuZXN0ZWRSdW50aW1lLFxuICAgICAgICByZWFkT25seUNvbnRleHQ6IG1hcHBlZElucHV0LFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIC8vIFJGQy0wMDMgRDE6IHRoZSBtb3VudCBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIOKAlCB0aGUgc3ViZmxvdyByb290XG4gICAgICAgIC8vIHN0YWdlJ3MgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBzbyBhbmNlc3RvciBjaGFpbnMgY3Jvc3MgdGhlIG1vdW50LlxuICAgICAgICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkOiBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIH0pO1xuXG4gICAgICBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdHJhdmVyc2VySGFuZGxlLmV4ZWN1dGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBub3QgYW4gZXJyb3Ig4oCUIHByZXBlbmQgc3ViZmxvdyBJRCBhbmQgcmUtdGhyb3dcbiAgICAgIC8vIGltbWVkaWF0ZWx5LiBObyBlcnJvciBsb2dnaW5nLCBubyBzdWJmbG93UmVzdWx0IHJlY29yZGluZyDigJRcbiAgICAgIC8vIHRoZSBwYXVzZSBpcyBjb250cm9sIGZsb3cuXG4gICAgICAvL1xuICAgICAgLy8gQkVGT1JFIHJlLXRocm93LCBzbmFwc2hvdCB0aGUgbmVzdGVkIHJ1bnRpbWUncyBgc2hhcmVkU3RhdGVgXG4gICAgICAvLyBvbnRvIHRoZSBzaWduYWwuIFRoaXMgaXMgdGhlIG9ubHkgY2hhbmNlIOKAlCBvbmNlIHdlIHJlLXRocm93LFxuICAgICAgLy8gdGhlIG91dGVyIHRyYXZlcnNlciB1bndpbmRzIGFuZCB0aGUgbmVzdGVkIHJ1bnRpbWUgaXMgR0MnZC4gT25cbiAgICAgIC8vIHJlc3VtZSwgd2UnbGwgcmUtc2VlZCBhIGZyZXNoIG5lc3RlZCBydW50aW1lIGZyb20gdGhpcyBjYXB0dXJlXG4gICAgICAvLyBzbyByZXN1bWUgaGFuZGxlcnMgY2FuIHJlYWQgdGhlIHByZS1wYXVzZSBzdWJmbG93IHNjb3BlLlxuICAgICAgLy9cbiAgICAgIC8vIENhcHR1cmUgaXMga2V5ZWQgYnkgdGhlIFNBTUUgcGF0aC1wcmVmaXhlZCBgc3ViZmxvd0lkYCB1c2VkIGluXG4gICAgICAvLyBgc3ViZmxvd1BhdGhgLCBzbyByZXN1bWUgY2FuIGxvb2sgdXAgXCJzY29wZSBmb3Igc2YtZm9vXCIgYnkgaWQuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzbmFwID0gbmVzdGVkUnVudGltZS5nZXRTbmFwc2hvdCgpO1xuICAgICAgICAgIC8vIGBzaGFyZWRTdGF0ZWAgaXMgdGhlIHN1YmZsb3cncyB3b3JraW5nIG1lbW9yeSBhdCBwYXVzZVxuICAgICAgICAgIC8vIHRpbWUgKGFmdGVyIGV2ZXJ5IGNvbW1pdHRlZCB3cml0ZSB1cCB0byB0aGUgcGF1c2UpLiBDYXN0XG4gICAgICAgICAgLy8gaXMgc2FmZSDigJQgU2hhcmVkTWVtb3J5IHNuYXBzaG90IHJldHVybnMgYSBwbGFpbiBvYmplY3QuXG4gICAgICAgICAgZXJyb3IuY2FwdHVyZVN1YmZsb3dTY29wZShzdWJmbG93SWQsIHNuYXAuc2hhcmVkU3RhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBTbmFwc2hvdCBmYWlsdXJlIHNob3VsZG4ndCBtYXNrIHRoZSBwYXVzZSDigJQgbGV0IHRoZSBwYXVzZVxuICAgICAgICAgIC8vIGJ1YmJsZSB1cDsgcmVzdW1lIHdpbGwgZmFsbCBiYWNrIHRvIGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVcbiAgICAgICAgICAvLyAodGhlIHBhcmVudCBzY29wZSkgZm9yIHRoaXMgc3ViZmxvdydzIGtleXMuXG4gICAgICAgIH1cbiAgICAgICAgZXJyb3IucHJlcGVuZFN1YmZsb3coc3ViZmxvd0lkKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBzdWJmbG93RXJyb3IgPSBlcnJvcjtcbiAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ3N1YmZsb3dFcnJvcicsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7IGVycm9yIH0pO1xuICAgIH1cblxuICAgIC8vIEFsd2F5cyBtZXJnZSBuZXN0ZWQgc3ViZmxvdyByZXN1bHRzIChldmVuIG9uIGVycm9yIOKAlCBwYXJ0aWFsIHJlc3VsdHMgYWlkIGRlYnVnZ2luZylcbiAgICBpZiAodHJhdmVyc2VySGFuZGxlKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmF2ZXJzZXJIYW5kbGUuZ2V0U3ViZmxvd1Jlc3VsdHMoKSkge1xuICAgICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEJyZWFrIHByb3BhZ2F0aW9uIChvcHQtaW4gdmlhIFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWspIOKUgOKUgFxuICAgIC8vXG4gICAgLy8gSWYgdGhlIHN1YmZsb3cncyBpbm5lciB0cmF2ZXJzYWwgYnJva2UgKGJlY2F1c2UgYSBzdGFnZSBjYWxsZWRcbiAgICAvLyBgc2NvcGUuJGJyZWFrKHJlYXNvbilgKSBBTkQgdGhlIG1vdW50IGRlY2xhcmVkIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAsXG4gICAgLy8gZm9yd2FyZCB0aGUgYnJlYWsgc3RhdGUgdG8gdGhlIFBBUkVOVCdzIGJyZWFrRmxhZy4gVGhlIHBhcmVudFxuICAgIC8vIHRyYXZlcnNlciB3aWxsIHNlZSBgc2hvdWxkQnJlYWtgIG9uIGl0cyBuZXh0IHN0ZXAgYW5kIHN0b3AuXG4gICAgLy9cbiAgICAvLyBXaXRob3V0IHRoaXMsIGlubmVyIGJyZWFrcyBhcmUgbG9jYWxseSBzY29wZWQgdG8gdGhlIHN1YmZsb3cg4oCUIHRoZVxuICAgIC8vIHBhcmVudCBjb250aW51ZXMgYXMgaWYgdGhlIHN1YmZsb3cgcmV0dXJuZWQgbm9ybWFsbHkuXG4gICAgLy9cbiAgICAvLyBJTVBPUlRBTlQ6IHRoaXMgcnVucyBCRUZPUkUgYG91dHB1dE1hcHBpbmdgIGJlbG93LCBpbnRlbnRpb25hbGx5LiBUaGVcbiAgICAvLyBvdXRwdXRNYXBwZXIgc3RpbGwgZXhlY3V0ZXMsIHNvIHRoZSBzdWJmbG93J3MgcGFydGlhbCByZXN1bHQgc3RpbGxcbiAgICAvLyBsYW5kcyBpbiB0aGUgcGFyZW50IHNjb3BlLiBDb25zdW1lcnMgd2hvIG5lZWQgdG8gc3VwcHJlc3Mgb3V0cHV0IG9uXG4gICAgLy8gYnJlYWsgY2hlY2sgdGhlIGJyZWFrIHN0YXRlIGluc2lkZSB0aGVpciBvdXRwdXRNYXBwZXIgYW5kIGVhcmx5LXJldHVybi5cbiAgICAvLyBTZWUgYFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWtgIEpTRG9jIGZvciByYXRpb25hbGUuXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSAmJiBtb3VudE9wdGlvbnM/LnByb3BhZ2F0ZUJyZWFrID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBpbm5lckJyZWFrID0gdHJhdmVyc2VySGFuZGxlLmdldEJyZWFrU3RhdGUoKTtcbiAgICAgIGlmIChpbm5lckJyZWFrLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWU7XG4gICAgICAgIGlmIChpbm5lckJyZWFrLnJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIGJyZWFrRmxhZy5yZWFzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrRmxhZy5yZWFzb24gPSBpbm5lckJyZWFrLnJlYXNvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBSYWlzZSBhIHBhcmVudC1sZXZlbCBvbkJyZWFrIGV2ZW50IHNvIHJlY29yZGVycyBjYW4gZGlzdGluZ3Vpc2hcbiAgICAgICAgLy8gdGhlIGlubmVyIG9yaWdpbmF0aW5nIGJyZWFrIChmaXJlZCBpbnNpZGUgdGhlIHN1YmZsb3cpIGZyb20gdGhpc1xuICAgICAgICAvLyBwcm9wYWdhdGVkIG9uZSAoZmlyZWQgYXQgdGhlIG1vdW50IGxldmVsIG9uIHRoZSBwYXJlbnQpLlxuICAgICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uQnJlYWsoc3ViZmxvd05hbWUsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGlubmVyQnJlYWsucmVhc29uLCBzdWJmbG93SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dUcmVlQ29udGV4dCA9IG5lc3RlZFJ1bnRpbWUuZ2V0U25hcHNob3QoKTtcblxuICAgIC8vIOKUgOKUgOKUgCBPdXRwdXQgTWFwcGluZyDilIDilIDilIBcbiAgICBpZiAoIXN1YmZsb3dFcnJvciAmJiBtb3VudE9wdGlvbnM/Lm91dHB1dE1hcHBlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhlIG1lcmdlLWJhY2sgaXMgdGhlIE1PVU5UJ3MgYWN0LCBzbyB0aGUgbW91bnQncyBmcmFtZSBzdGFnZXMgYW5kXG4gICAgICAgIC8vIGNvbW1pdHMgaXQg4oCUIGl0cyBidW5kbGUgY2FycmllcyB0aGUgbW91bnQncyBydW50aW1lU3RhZ2VJZCAoUjEzKS5cbiAgICAgICAgLy8gQSBicmFuY2ggb3IgZm9yay1jaGlsZCBtb3VudCBzdGlsbCBsYW5kcyBpdHMgdmFsdWVzIHdoZXJlIGl0c1xuICAgICAgICAvLyBwYXJlbnQgd3JpdGVzICh0aGUgcGFyZW50J3MgcnVuIG5hbWVzcGFjZSksIGFzIGJlZm9yZTsgdW50aWwgOS4zMy4wXG4gICAgICAgIC8vIGl0IGNvbW1pdHRlZCBPTiB0aGUgcGFyZW50J3MgZnJhbWUsIHNvIHRoZSBidW5kbGUgbmFtZWQgdGhlIHN0YWdlXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgbW91bnQsIG9yIHRoZSBicmFuY2hpbmcgZGVjaWRlci5cbiAgICAgICAgY29uc3Qgb3V0cHV0Q29udGV4dCA9IHBhcmVudENvbnRleHQ7XG4gICAgICAgIGlmIChwYXJlbnRDb250ZXh0LmJyYW5jaElkICYmIHBhcmVudENvbnRleHQucGFyZW50KSB7XG4gICAgICAgICAgb3V0cHV0Q29udGV4dC51c2VBZGRyZXNzT2YocGFyZW50Q29udGV4dC5wYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50U2NvcGUgPSBvdXRwdXRDb250ZXh0LmdldFNjb3BlKCk7XG4gICAgICAgIC8vIEZvciBUeXBlZFNjb3BlIHN1YmZsb3dzLCBzdGFnZSBmdW5jdGlvbnMgcmV0dXJuIHZvaWQg4oCUIGZhbGwgYmFjayB0byBhIHNoYWxsb3cgY2xvbmVcbiAgICAgICAgLy8gb2YgdGhlIHN1YmZsb3cncyBzaGFyZWQgc3RhdGUgc28gb3V0cHV0TWFwcGVyIGNhbiBhY2Nlc3MgYWxsIHNjb3BlIHZhbHVlcyB3cml0dGVuXG4gICAgICAgIC8vIGR1cmluZyB0aGUgc3ViZmxvdy4gV2Ugc2hhbGxvdy1jbG9uZSB0byBhdm9pZCBhbGlhc2luZyB0aGUgbGl2ZSBTaGFyZWRNZW1vcnkgY29udGV4dC5cbiAgICAgICAgLy8gTk9URTogdGhlIGZ1bGwgc2NvcGUgaXMgcGFzc2VkIChub3QganVzdCBkZWNsYXJlZCBvdXRwdXRzKSDigJQgb3V0cHV0TWFwcGVyIG11c3RcbiAgICAgICAgLy8gZXhwbGljaXRseSBzZWxlY3Qgd2hhdCB0byBwcm9wYWdhdGUgdG8gdGhlIHBhcmVudC5cbiAgICAgICAgLy8gUmVkYWN0aW9uOiBgYXBwbHlPdXRwdXRNYXBwaW5nYCB3cml0ZXMgdGhyb3VnaCBgb3V0cHV0Q29udGV4dGAgKGFcbiAgICAgICAgLy8gU3RhZ2VDb250ZXh0LCBub3QgYSBmYWNhZGUpLiBUaGUgY29udGV4dCdzIHdyaXRlIGZ1bm5lbCBhc2tzIHRoZVxuICAgICAgICAvLyBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgc2hhcmVkIHdpdGggdGhlIHN1YmZsb3cncyBjb250ZXh0cywgc28gYSBrZXlcbiAgICAgICAgLy8gdGhlIHBvbGljeSBuYW1lcyBPUiBhIGtleSBtYXJrZWQgcGVyLWNhbGwgaW5zaWRlIHRoZSBzdWJmbG93IGlzXG4gICAgICAgIC8vIHNjcnViYmVkIGluIHRoZSBQQVJFTlQncyBsb2cgYW5kIG1pcnJvciB0b28gKDkuMTkuMDsgYmVmb3JlLCB0aGlzXG4gICAgICAgIC8vIG1lcmdlLWJhY2sgcmV0YWluZWQgcGxhaW50ZXh0KS5cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlT3V0cHV0ID0gc3ViZmxvd091dHB1dCA/PyB7IC4uLnN1YmZsb3dUcmVlQ29udGV4dC5zaGFyZWRTdGF0ZSB9O1xuICAgICAgICBjb25zdCBtYXBwZWRPdXRwdXQgPSBhcHBseU91dHB1dE1hcHBpbmcoZWZmZWN0aXZlT3V0cHV0LCBwYXJlbnRTY29wZSwgb3V0cHV0Q29udGV4dCwgbW91bnRPcHRpb25zKTtcblxuICAgICAgICBvdXRwdXRDb250ZXh0LmNvbW1pdCgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAvLyBBIG1lcmdlLWJhY2sgdGhhdCBmYWlsZWQgdG8gY29tbWl0IChhbiB1bmNsb25lYWJsZSB2YWx1ZSkgbGVhdmVzIGl0c1xuICAgICAgICAvLyB3cml0ZXMgc3RhZ2VkIG9uIHRoZSBtb3VudCdzIGZyYW1lOyB0aGUgbW91bnQncyBleGl0IGNvbW1pdCBiZWxvd1xuICAgICAgICAvLyB3b3VsZCB0aHJvdyB0aGVtIGFnYWluLCBvdXRzaWRlIHRoaXMgY2F0Y2guIFRocm91Z2ggOS4zMy4wIHRoZXlcbiAgICAgICAgLy8gd2VyZSBzdGFnZWQgb24gdGhlIHBhcmVudCdzIGZyYW1lLCB3aGljaCB3YXMgbm90IGNvbW1pdHRlZCBhZ2FpbixcbiAgICAgICAgLy8gc28gdGhlIHJ1biB3ZW50IG9uIOKAlCBkcm9wIHRoZW0sIGFzIGl0IGRpZC4gQSBsaW5lYXIgbW91bnQncyBmcmFtZVxuICAgICAgICAvLyBpcyBsZWZ0IGFzIGl0IGFsd2F5cyB3YXMuXG4gICAgICAgIGlmIChwYXJlbnRDb250ZXh0LmJyYW5jaElkICYmIHBhcmVudENvbnRleHQucGFyZW50KSBwYXJlbnRDb250ZXh0LmRpc2NhcmRTdGFnZWQoKTtcbiAgICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignb3V0cHV0TWFwcGVyRXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gb3V0cHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1Jlc3VsdDogU3ViZmxvd1Jlc3VsdCA9IHtcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDogc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlLFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBzdWJmbG93VHJlZUNvbnRleHQuZXhlY3V0aW9uVHJlZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBzdWJmbG93VHJlZUNvbnRleHQuY29tbWl0TG9nLFxuICAgICAgICAvLyBUaGUgc3ViZmxvdydzIG93biBmb2xkIGJhc2UgdHJhdmVscyB3aXRoIGl0cyBvd24gbG9nIOKAlCBzYW1lXG4gICAgICAgIC8vIGNvbnRyYWN0IGFzIHRoZSBydW4tbGV2ZWwgYFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGVgLlxuICAgICAgICBpbml0aWFsU3RhdGU6IHN1YmZsb3dUcmVlQ29udGV4dC5pbml0aWFsU3RhdGUsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZDogcGFyZW50Q29udGV4dC5nZXRTdGFnZUlkKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHN1YmZsb3dEZWYgPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdO1xuICAgIGlmIChzdWJmbG93RGVmICYmIChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlKSB7XG4gICAgICBzdWJmbG93UmVzdWx0LnBpcGVsaW5lU3RydWN0dXJlID0gKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmU7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNlcnZlZCBzdGF0ZSAoOS4yMC4wKTogdGhlIG5lc3RlZCBtaXJyb3IncyBmaW5hbCBzdGF0ZSwgcmVtZW1iZXJlZFxuICAgIC8vIEJFU0lERSB0aGUgcmVzdWx0IOKAlCBgdHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgc3RheXMgdGhlIGxpdmUgaGVhcCBmb3JcbiAgICAvLyB0aGUgcGxhaW4gc25hcHNob3QgYW5kIHRoZSBjaGVja3BvaW50OyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgXG4gICAgLy8gc3Vic3RpdHV0ZXMgdGhlIG1pcnJvciB0aHJvdWdoIGBzZXJ2ZWRTdWJmbG93UmVzdWx0c2AuIEFic2VudCB3aXRob3V0XG4gICAgLy8gYSBwb2xpY3kuIFRoZSBleGl0IGV2ZW50IGJlbG93IGNhcnJpZXMgdGhlIHNhbWUgc2VydmVkIHZpZXc7IHdpdGhvdXQgYVxuICAgIC8vIG1pcnJvciBpdCBjYXJyaWVzIHRoZSBoZWFwIHJldGFpbmVkIHVuZGVyIHRoZSBydWxlIChwZXItY2FsbCBtYXJrc1xuICAgIC8vIGFsb25lIGtlZXAgbm8gbWlycm9yKSDigJQgdGhlIHNhbWUgb2JqZWN0IHdoZW4gbm90aGluZyBpcyByZWRhY3RlZC5cbiAgICBjb25zdCByYXdTdGF0ZSA9IHN1YmZsb3dSZXN1bHQudHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dDtcbiAgICBjb25zdCBtaXJyb3JTdGF0ZSA9IG5lc3RlZFJ1bnRpbWUucmVkYWN0ZWRTdG9yZT8uZ2V0U3RhdGUoKTtcbiAgICBpZiAobWlycm9yU3RhdGUgIT09IHVuZGVmaW5lZCkgcmVtZW1iZXJSZWRhY3RlZFN1YmZsb3dTdGF0ZShzdWJmbG93UmVzdWx0LCBtaXJyb3JTdGF0ZSk7XG4gICAgY29uc3QgZXhpdFN0YXRlID0gbWlycm9yU3RhdGUgPz8gKHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpblJlY29yZChyYXdTdGF0ZSkgOiByYXdTdGF0ZSk7XG5cbiAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoc3ViZmxvd0lkLCBzdWJmbG93UmVzdWx0KTtcbiAgICAvLyBBZGRpdGl2ZSBwZXItZXhlY3V0aW9uIGtleSAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKS4gQSBMT09QSU5HXG4gICAgLy8gc3ViZmxvdyByZS1lbnRlcnMgd2l0aCB0aGUgU0FNRSBzdWJmbG93SWQsIHNvIHRoZSBwYXRoIGtleSBhYm92ZSBpcyBPVkVSV1JJVFRFTiBlYWNoXG4gICAgLy8gaXRlcmF0aW9uIChiYWNrLWNvbXBhdDogaXQgaG9sZHMgdGhlIExBU1QgaXRlcmF0aW9uIOKAlCB3aGF0IGdldFN1YnRyZWVTbmFwc2hvdC9saXN0U3ViZmxvd1BhdGhzXG4gICAgLy8gYW5kIHRoZSBldWkgZmFsbGJhY2sgc2VlLCB1bmNoYW5nZWQpLiBBTFNPIGtleSBieSB0aGUgbW91bnQncyBVTklRVUUgcnVudGltZVN0YWdlSWQgc28gRVZFUllcbiAgICAvLyBpdGVyYXRpb24ncyByZXN1bHQgaXMgcmV0YWluZWQgYW5kIGFkZHJlc3NhYmxlIChldWkgcGVyLWxvb3AgZHJpbGwtZG93biwgcGVyLXNjb3BlIGxvY2FsaXphdGlvbikuXG4gICAgLy8gcnVudGltZVN0YWdlSWQgYWx3YXlzIGNvbnRhaW5zICcjJzsgc3ViZmxvd0lkIG5ldmVyIGRvZXMg4oCUIHNvIHRoZXkgbmV2ZXIgY29sbGlkZSwgYW5kXG4gICAgLy8gbGlzdFN1YmZsb3dQYXRocyBmaWx0ZXJzICcjJyBrZXlzIHRvIGtlZXAgaXRzIHBhdGgtb25seSBjb250cmFjdC4gVGhlIHBhdXNlIGNoZWNrcG9pbnQgZmlsdGVyc1xuICAgIC8vIHRoZXNlIG91dCAoYnVpbGRQYXVzZUNoZWNrcG9pbnQpIHNvIGl0IHN0YXlzIGxlYW4uXG4gICAgY29uc3QgbW91bnRSdW50aW1lU3RhZ2VJZCA9IHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGlmIChtb3VudFJ1bnRpbWVTdGFnZUlkICYmIG1vdW50UnVudGltZVN0YWdlSWQgIT09IHN1YmZsb3dJZCkge1xuICAgICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KG1vdW50UnVudGltZVN0YWdlSWQsIHN1YmZsb3dSZXN1bHQpO1xuICAgIH1cblxuICAgIHBhcmVudENvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnc3ViZmxvdycsIGBFeGl0aW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93RXhpdChzdWJmbG93TmFtZSwgc3ViZmxvd0lkLCBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LCBleGl0U3RhdGUpO1xuXG4gICAgcGFyZW50Q29udGV4dC5jb21taXQoKTtcblxuICAgIGlmIChzdWJmbG93RXJyb3IpIHtcbiAgICAgIHRocm93IHN1YmZsb3dFcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgfVxufVxuIl19
|
|
@@ -155,7 +155,7 @@ export declare class CombinedNarrativeRecorder implements CombinedRecorder {
|
|
|
155
155
|
description: string;
|
|
156
156
|
preferredOperation: "translate";
|
|
157
157
|
data: {
|
|
158
|
-
type: "subflow" | "loop" | "stage" | "error" | "pause" | "fork" | "selector" | "step" | "condition" | "break" | "resume" | "
|
|
158
|
+
type: "subflow" | "loop" | "stage" | "error" | "pause" | "emit" | "fork" | "selector" | "step" | "condition" | "break" | "resume" | "retry";
|
|
159
159
|
text: string;
|
|
160
160
|
depth: number;
|
|
161
161
|
stageName?: string | undefined;
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* Implements IControlFlowNarrative so it can replace the single
|
|
5
5
|
* ControlFlowNarrativeGenerator in the traverser's HandlerDeps.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Every event goes through `recorder/hooks.ts · fire` (the one per-recorder loop): a failing
|
|
8
|
+
* recorder is warned about in dev mode and never breaks execution — even when what it threw
|
|
9
|
+
* cannot be turned into a string.
|
|
9
10
|
*
|
|
10
11
|
* When no recorders are attached, every method is a fast no-op (empty array check).
|
|
11
12
|
*/
|