footprintjs 9.7.0 → 9.9.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.
Files changed (46) hide show
  1. package/CLAUDE.md +3 -1
  2. package/dist/advanced.js +1 -1
  3. package/dist/esm/advanced.js +1 -1
  4. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +16 -1
  5. package/dist/esm/lib/engine/narrative/types.js +1 -1
  6. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +40 -2
  7. package/dist/esm/lib/engine/types.js +1 -1
  8. package/dist/esm/lib/memory/StageContext.js +36 -2
  9. package/dist/esm/lib/memory/backtrack.js +145 -35
  10. package/dist/esm/lib/memory/index.js +1 -1
  11. package/dist/esm/lib/memory/types.js +1 -1
  12. package/dist/esm/lib/recorder/ControlDepRecorder.js +228 -0
  13. package/dist/esm/lib/runner/ExecutionRuntime.js +1 -1
  14. package/dist/esm/lib/runner/FlowChartExecutor.js +30 -2
  15. package/dist/esm/lib/runner/getSubtreeSnapshot.js +7 -2
  16. package/dist/esm/lib/scope/ScopeFacade.js +44 -2
  17. package/dist/esm/trace.js +2 -1
  18. package/dist/lib/engine/handlers/SubflowExecutor.js +16 -1
  19. package/dist/lib/engine/narrative/types.js +1 -1
  20. package/dist/lib/engine/traversal/FlowchartTraverser.js +40 -2
  21. package/dist/lib/engine/types.js +1 -1
  22. package/dist/lib/memory/StageContext.js +36 -2
  23. package/dist/lib/memory/backtrack.js +145 -35
  24. package/dist/lib/memory/index.js +1 -1
  25. package/dist/lib/memory/types.js +1 -1
  26. package/dist/lib/recorder/ControlDepRecorder.js +233 -0
  27. package/dist/lib/runner/ExecutionRuntime.js +1 -1
  28. package/dist/lib/runner/FlowChartExecutor.js +30 -2
  29. package/dist/lib/runner/getSubtreeSnapshot.js +7 -2
  30. package/dist/lib/scope/ScopeFacade.js +44 -2
  31. package/dist/trace.js +5 -2
  32. package/dist/types/advanced.d.ts +1 -1
  33. package/dist/types/lib/engine/narrative/types.d.ts +18 -1
  34. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +28 -0
  35. package/dist/types/lib/engine/types.d.ts +8 -0
  36. package/dist/types/lib/memory/StageContext.d.ts +23 -1
  37. package/dist/types/lib/memory/backtrack.d.ts +108 -2
  38. package/dist/types/lib/memory/index.d.ts +1 -1
  39. package/dist/types/lib/memory/types.d.ts +22 -0
  40. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +133 -0
  41. package/dist/types/lib/runner/ExecutionRuntime.d.ts +10 -1
  42. package/dist/types/lib/runner/FlowChartExecutor.d.ts +3 -0
  43. package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +10 -0
  44. package/dist/types/lib/scope/ScopeFacade.d.ts +30 -1
  45. package/dist/types/trace.d.ts +4 -1
  46. package/package.json +1 -1
@@ -53,6 +53,7 @@
53
53
  * console.log(formatCausalChain(dag)); // human-readable
54
54
  * ```
55
55
  */
56
+ import { isDevMode } from '../scope/detectCircular.js';
56
57
  import { findLastWriter } from './commitLogUtils.js';
57
58
  // ── Staged optimization: writer lookup strategies ──────────────────────
58
59
  /**
@@ -127,6 +128,16 @@ function createWriterLookup(commitLog) {
127
128
  return reverseIndexLookup(commitLog);
128
129
  }
129
130
  // ── Core algorithm ─────────────────────────────────────────────────────
131
+ /**
132
+ * RFC-003 D2: the `incompleteSources` node fragment for a commit — `{}`
133
+ * when the stage consumed no untracked read paths, keeping the field
134
+ * ABSENT (not empty-array-valued) for fully-tracked stages.
135
+ */
136
+ function incompleteSourcesFragment(commit) {
137
+ if (!commit.untrackedSources || commit.untrackedSources.length === 0)
138
+ return {};
139
+ return { incompleteSources: commit.untrackedSources };
140
+ }
130
141
  /**
131
142
  * Build the causal DAG rooted at `startId` by walking backwards
132
143
  * through read→write dependencies in the commit log.
@@ -147,6 +158,13 @@ function createWriterLookup(commitLog) {
147
158
  export function causalChain(commitLog, startId, getKeysRead, options) {
148
159
  const maxDepth = options?.maxDepth ?? 20;
149
160
  const maxNodes = options?.maxNodes ?? 100;
161
+ const controlDeps = options?.controlDeps;
162
+ const weigh = options?.weigh;
163
+ // RFC-003 D4 — truncation visibility. Set only when a limit actually
164
+ // cuts the slice; surfaced on the root as `truncated` so a consumer can
165
+ // never mistake a truncated slice for a complete one.
166
+ let truncatedByDepth = false;
167
+ let truncatedByNodes = false;
150
168
  // Build position index: runtimeStageId → array position (O(n) once)
151
169
  const idxMap = new Map();
152
170
  for (let i = 0; i < commitLog.length; i++) {
@@ -168,52 +186,111 @@ export function causalChain(commitLog, startId, getKeysRead, options) {
168
186
  linkedBy: '',
169
187
  depth: 0,
170
188
  parents: [],
189
+ parentEdges: [],
190
+ ...incompleteSourcesFragment(startCommit),
171
191
  };
172
192
  nodeMap.set(startId, root);
173
193
  // BFS queue: [node, commitIdx, depth]
174
194
  const queue = [[root, startIdx, 0]];
175
195
  let visited = 1;
196
+ /**
197
+ * Link `node → parent` (creating + enqueueing the parent when new).
198
+ * Shared by data-edge expansion (read→write) and control-edge expansion
199
+ * (D3). One CausalEdge per distinct (parent, kind, key) link; `parents`
200
+ * keeps its historical one-entry-per-parent dedup.
201
+ */
202
+ function linkParent(node, parentCommit, kind, key, depth) {
203
+ const parentId = parentCommit.runtimeStageId;
204
+ let parentNode = nodeMap.get(parentId);
205
+ if (!parentNode) {
206
+ // New node — create and enqueue (respecting the node budget)
207
+ if (visited >= maxNodes) {
208
+ truncatedByNodes = true; // D4: a discovered parent was dropped
209
+ return;
210
+ }
211
+ const parentIdx = idxMap.get(parentId);
212
+ if (parentIdx === undefined)
213
+ return;
214
+ parentNode = {
215
+ runtimeStageId: parentId,
216
+ stageId: parentCommit.stageId,
217
+ stageName: parentCommit.stage,
218
+ keysWritten: parentCommit.trace.map((t) => t.path),
219
+ // linkedBy stays a DATA-key concept (back-compat) — control-linked
220
+ // nodes carry their label on the edge instead.
221
+ linkedBy: kind === 'data' ? key ?? '' : '',
222
+ depth: depth + 1,
223
+ parents: [],
224
+ parentEdges: [],
225
+ ...incompleteSourcesFragment(parentCommit),
226
+ };
227
+ nodeMap.set(parentId, parentNode);
228
+ visited++;
229
+ queue.push([parentNode, parentIdx, depth + 1]);
230
+ }
231
+ // DAG merge: one parents[] entry per distinct parent (historical shape)
232
+ if (!node.parents.some((p) => p.runtimeStageId === parentId)) {
233
+ node.parents.push(parentNode);
234
+ }
235
+ // One edge per distinct (parent, kind, key) link. The weigher (D4)
236
+ // stamps the weight at creation; `undefined` → 1.0 — the engine never
237
+ // computes weights itself.
238
+ if (!node.parentEdges.some((e) => e.parent.runtimeStageId === parentId && e.kind === kind && e.key === key)) {
239
+ // Error isolation (review finding): a consumer weigher that throws
240
+ // must degrade to the default weight, never crash the slice — the
241
+ // same contract every other consumer callback in the library gets.
242
+ let weight = 1.0;
243
+ if (weigh) {
244
+ try {
245
+ weight = weigh(node, parentNode, key, kind) ?? 1.0;
246
+ }
247
+ catch {
248
+ /* weigher threw — keep 1.0, the slice stays usable */
249
+ }
250
+ }
251
+ node.parentEdges.push({ parent: parentNode, kind, key, weight });
252
+ }
253
+ }
176
254
  while (queue.length > 0) {
177
255
  const [node, commitIdx, depth] = queue.shift();
178
- if (depth >= maxDepth)
256
+ if (depth >= maxDepth) {
257
+ // D4: only a node that still HAD something to expand counts as a cut
258
+ // (a leaf at the horizon truncates nothing).
259
+ if (getKeysRead(node.runtimeStageId).length > 0 || controlDeps?.(node.runtimeStageId) !== undefined) {
260
+ truncatedByDepth = true;
261
+ }
179
262
  continue;
263
+ }
264
+ // Data edges: for each key read, find who wrote it
180
265
  const keysRead = getKeysRead(node.runtimeStageId);
181
- if (keysRead.length === 0)
182
- continue;
183
- // For each key read, find who wrote it
184
266
  for (const key of keysRead) {
185
267
  const writer = findWriter(key, commitIdx);
186
268
  if (!writer)
187
269
  continue;
188
- const writerId = writer.runtimeStageId;
189
- // Check if we already have a node for this writer
190
- let parentNode = nodeMap.get(writerId);
191
- if (parentNode) {
192
- // DAG merge: add as parent if not already linked
193
- if (!node.parents.some((p) => p.runtimeStageId === writerId)) {
194
- node.parents.push(parentNode);
270
+ linkParent(node, writer, 'data', key, depth);
271
+ }
272
+ // Control edge (RFC-003 D3): link the governing decider, labeled by the
273
+ // decide() rule label when present. The decider node then expands
274
+ // normally through its own data reads (and its own control parent).
275
+ if (controlDeps) {
276
+ const dep = controlDeps(node.runtimeStageId);
277
+ if (dep) {
278
+ const deciderIdx = idxMap.get(dep.deciderId);
279
+ if (deciderIdx !== undefined) {
280
+ linkParent(node, commitLog[deciderIdx], 'control', dep.label, depth);
195
281
  }
196
- continue;
197
282
  }
198
- // New node — create and enqueue
199
- if (visited >= maxNodes)
200
- continue;
201
- const writerIdx = idxMap.get(writerId);
202
- if (writerIdx === undefined)
203
- continue;
204
- parentNode = {
205
- runtimeStageId: writerId,
206
- stageId: writer.stageId,
207
- stageName: writer.stage,
208
- keysWritten: writer.trace.map((t) => t.path),
209
- linkedBy: key,
210
- depth: depth + 1,
211
- parents: [],
212
- };
213
- nodeMap.set(writerId, parentNode);
214
- node.parents.push(parentNode);
215
- visited++;
216
- queue.push([parentNode, writerIdx, depth + 1]);
283
+ }
284
+ }
285
+ // RFC-003 D4 — truncation visibility on the root (absent when complete).
286
+ if (truncatedByDepth || truncatedByNodes) {
287
+ root.truncated = { byDepth: truncatedByDepth, byNodes: truncatedByNodes };
288
+ if (isDevMode()) {
289
+ // eslint-disable-next-line no-console
290
+ console.warn(`[footprint] causalChain('${startId}') truncated by ` +
291
+ `${[truncatedByDepth && `maxDepth (${maxDepth})`, truncatedByNodes && `maxNodes (${maxNodes})`]
292
+ .filter(Boolean)
293
+ .join(' + ')} the slice is incomplete. Raise the limits or narrow keysRead.`);
217
294
  }
218
295
  }
219
296
  return root;
@@ -245,27 +322,60 @@ export function flattenCausalDAG(root) {
245
322
  /**
246
323
  * Format a causal DAG as human-readable indented text.
247
324
  * Shows the dependency chain with depth indentation and linked-by keys.
325
+ *
326
+ * RFC-003 D2: nodes that consumed untracked read paths render an extra
327
+ * `⚠ also consumed … — slice may be incomplete here` line, so a consumer
328
+ * (human or LLM) debugging from the slice is TOLD when it is incomplete.
329
+ *
330
+ * RFC-003 D3: control edges render as `← [control: <rule label>]`
331
+ * (label omitted when the decision carried none). Data rendering is
332
+ * byte-identical to the pre-D3 output — `← via <key>` from the node's
333
+ * discovery-time `linkedBy`.
334
+ *
335
+ * RFC-003 D4: edge weights from the `weigh` hook render as a suffix —
336
+ * `← via systemPrompt (0.18)` — only when ≠ 1.0, so unweighted output is
337
+ * unchanged. A truncated slice (root.truncated) appends a final
338
+ * `⚠ slice truncated …` line.
248
339
  */
249
340
  export function formatCausalChain(root) {
250
341
  const lines = [];
251
342
  const visited = new Set();
252
- function walk(node, indent) {
343
+ const weightSuffix = (edge) => edge !== undefined && edge.weight !== 1 ? ` (${edge.weight})` : '';
344
+ function walk(node, indent, edgesFromChild) {
253
345
  if (visited.has(node.runtimeStageId)) {
254
346
  lines.push(`${' '.repeat(indent)}↳ ${node.runtimeStageId} (see above)`);
255
347
  return;
256
348
  }
257
349
  visited.add(node.runtimeStageId);
258
- const link = node.linkedBy ? ` ← via ${node.linkedBy}` : '';
350
+ const linkParts = [];
351
+ if (node.linkedBy) {
352
+ const dataEdge = edgesFromChild?.find((e) => e.kind === 'data');
353
+ linkParts.push(`via ${node.linkedBy}${weightSuffix(dataEdge)}`);
354
+ }
355
+ const controlEdge = edgesFromChild?.find((e) => e.kind === 'control');
356
+ if (controlEdge) {
357
+ linkParts.push(`[control${controlEdge.key ? `: ${controlEdge.key}` : ''}]${weightSuffix(controlEdge)}`);
358
+ }
359
+ const link = linkParts.length > 0 ? ` ← ${linkParts.join(' ← ')}` : '';
259
360
  const writes = node.keysWritten.length > 0 ? ` [wrote: ${node.keysWritten.join(', ')}]` : '';
260
361
  lines.push(`${' '.repeat(indent)}${node.stageName} (${node.runtimeStageId})${link}${writes}`);
362
+ if (node.incompleteSources && node.incompleteSources.length > 0) {
363
+ lines.push(`${' '.repeat(indent + 1)}⚠ also consumed ${node.incompleteSources.join('/')} — slice may be incomplete here`);
364
+ }
261
365
  for (const parent of node.parents) {
262
- walk(parent, indent + 1);
366
+ walk(parent, indent + 1, node.parentEdges.filter((e) => e.parent === parent));
263
367
  }
264
368
  }
265
369
  walk(root, 0);
370
+ if (root.truncated) {
371
+ const causes = [root.truncated.byDepth && 'maxDepth reached', root.truncated.byNodes && 'maxNodes reached']
372
+ .filter(Boolean)
373
+ .join(', ');
374
+ lines.push(`⚠ slice truncated (${causes}) — older causes exist beyond this horizon`);
375
+ }
266
376
  return lines.join('\n');
267
377
  }
268
378
  // ── Exported for testing (internal) ────────────────────────────────────
269
379
  /** @internal Exposed for testing the strategy selection. */
270
380
  export const _REVERSE_INDEX_THRESHOLD = REVERSE_INDEX_THRESHOLD;
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzREc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUF5Q3JELDBFQUEwRTtBQUUxRTs7OztHQUlHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFRcEMsa0VBQWtFO0FBQ2xFLFNBQVMsZ0JBQWdCLENBQUMsU0FBeUI7SUFDakQsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsa0JBQWtCLENBQUMsU0FBeUI7SUFDbkQsa0VBQWtFO0lBQ2xFLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUMsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNULEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQ1QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxHQUFHLENBQUMsSUFB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QUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0YsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRS9GLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNkLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsMEVBQTBFO0FBRTFFLDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYmFja3RyYWNrLnRzIOKAlCBCYWNrd2FyZCBjYXVzYWwgY2hhaW4gYW5hbHlzaXMgb24gdGhlIGNvbW1pdCBsb2cuXG4gKlxuICogSW1wbGVtZW50cyAqKmJhY2t3YXJkIHByb2dyYW0gc2xpY2luZyoqIChXZWlzZXIgMTk4NCwgdGhpbi1zbGljZSB2YXJpYW50KTpcbiAqIGdpdmVuIGEgc3RhcnRpbmcgZXhlY3V0aW9uIHN0ZXAsIHdhbGsgYmFja3dhcmRzIHRocm91Z2ggcmVhZOKGkndyaXRlXG4gKiBkZXBlbmRlbmNpZXMgdG8gYnVpbGQgdGhlIGNhdXNhbCBEQUcgdGhhdCBwcm9kdWNlZCB0aGUgZGF0YSBhdCB0aGF0IHN0ZXAuXG4gKlxuICogIyMgQWxnb3JpdGhtXG4gKlxuICogQkZTIG9uIHRoZSBpbXBsaWNpdCBkZXBlbmRlbmN5IGdyYXBoIHdoZXJlIGVkZ2VzIHJ1biBmcm9tIHJlYWRlciDihpIgd3JpdGVyLlxuICpcbiAqIDEuIExvY2F0ZSBzdGFydElkIGluIGNvbW1pdExvZyDihpIgcm9vdCBub2RlXG4gKiAyLiBHZXQga2V5c1JlYWQgZm9yIHJvb3QgdmlhIGBnZXRLZXlzUmVhZGAgY2FsbGJhY2tcbiAqIDMuIEZvciBlYWNoIGtleSByZWFkLCBmaW5kIHdobyBsYXN0IHdyb3RlIGl0IGJlZm9yZSB0aGlzIHN0ZXAg4oaSIHBhcmVudCBjb21taXRcbiAqIDQuIENyZWF0ZSBwYXJlbnQgQ2F1c2FsTm9kZSwgbGluayB0byByb290LnBhcmVudHNcbiAqIDUuIEVucXVldWUgcGFyZW50LiBSZXBlYXQgdW50aWwgcXVldWUgZW1wdHkgb3IgbGltaXRzIGhpdC5cbiAqXG4gKiBPdXRwdXQgaXMgYSAqKkRBRyoqIChub3QgYSBsaW5rZWQgbGlzdCk6IGEgc3RhZ2UgcmVhZGluZyBgY3JlZGl0U2NvcmVgIEFORCBgZHRpYFxuICogZnJvbSBkaWZmZXJlbnQgd3JpdGVycyBoYXMgdHdvIHBhcmVudHMuXG4gKlxuICogIyMgU3RhZ2VkIE9wdGltaXphdGlvblxuICpcbiAqIFR3byB3cml0ZXItbG9va3VwIHN0cmF0ZWdpZXMsIGNob3NlbiBhdXRvbWF0aWNhbGx5IGJ5IGNvbW1pdCBsb2cgc2l6ZTpcbiAqXG4gKiB8IFN0cmF0ZWd5IHwgV2hlbiB8IENvbXBsZXhpdHkgcGVyIGxvb2t1cCB8XG4gKiB8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgTGluZWFyIHNjYW4gfCBOIOKJpCAyNTYgfCBPKE4pIOKAlCBzaW1wbGUgYmFja3dhcmQgc2NhbiB8XG4gKiB8IFJldmVyc2UgaW5kZXggfCBOID4gMjU2IHwgTyhLIGxvZyBOKSDigJQgcHJlYnVpbHQga2V54oaSW2luZGljZXNdLCBiaW5hcnkgc2VhcmNoIHxcbiAqXG4gKiBUaGUgdGhyZXNob2xkICgyNTYpIGlzIGNob3NlbiBzbyB0aGUgTyhOKSBidWlsZCBjb3N0IG9mIHRoZSByZXZlcnNlIGluZGV4XG4gKiBpcyBhbW9ydGl6ZWQgb3ZlciB0aGUgQkZTIHRyYXZlcnNhbC4gQmVsb3cgMjU2LCBsaW5lYXIgc2NhbiB3aW5zIGJlY2F1c2VcbiAqIHRoZXJlJ3Mgbm8gaW5kZXggYnVpbGQgb3ZlcmhlYWQuIFRoZSBjb25zdW1lciBuZXZlciBzZWVzIHRoaXMg4oCUIGBjYXVzYWxDaGFpbigpYFxuICogcGlja3MgdGhlIHJpZ2h0IHN0cmF0ZWd5IGludGVybmFsbHkgKGxpa2UgYSBxdWVyeSBvcHRpbWl6ZXIgY2hvb3NpbmcgYmV0d2VlblxuICogc2VxdWVudGlhbCBzY2FuIHZzIGluZGV4IHNjYW4gYmFzZWQgb24gdGFibGUgc2l6ZSkuXG4gKlxuICogIyMgQ29tcGxleGl0eVxuICpcbiAqIC0gKipTbWFsbCBsb2dzIChOIOKJpCAyNTYpOioqIE8oViDDlyBLIMOXIE4pIHRvdGFsLiBWPXZpc2l0ZWQsIEs9YXZnIGtleXMvbm9kZS5cbiAqIC0gKipMYXJnZSBsb2dzIChOID4gMjU2KToqKiBPKE4gw5cgVSkgaW5kZXggYnVpbGQgKyBPKFYgw5cgSyDDlyBsb2cgTikgbG9va3Vwcy5cbiAqICAgVSA9IHVuaXF1ZSBrZXlzLiBBbW9ydGl6ZWQgb3ZlciBhbGwgQkZTIGhvcHMuXG4gKlxuICogIyMgUmVmZXJlbmNlc1xuICpcbiAqIC0gV2Vpc2VyLCBNLiAoMTk4NCkuIFwiUHJvZ3JhbSBTbGljaW5nLlwiIElFRUUgVFNFLlxuICogLSBTcmlkaGFyYW4sIE0uIGV0IGFsLiAoMjAwNykuIFwiVGhpbiBTbGljaW5nLlwiIFBMREkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNhdXNhbENoYWluLCBmbGF0dGVuQ2F1c2FsREFHLCBmb3JtYXRDYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3RwcmludGpzL3RyYWNlJztcbiAqXG4gKiBjb25zdCBkYWcgPSBjYXVzYWxDaGFpbihjb21taXRMb2csICdkZWNpZGUjMicsIChpZCkgPT4gcmVjb3JkZXIuZ2V0S2V5c1JlYWQoaWQpKTtcbiAqIGNvbnN0IGZsYXQgPSBmbGF0dGVuQ2F1c2FsREFHKGRhZyk7ICAgICAvLyBCRlMtb3JkZXJlZCBmbGF0IGxpc3RcbiAqIGNvbnNvbGUubG9nKGZvcm1hdENhdXNhbENoYWluKGRhZykpOyAgICAgLy8gaHVtYW4tcmVhZGFibGVcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IGZpbmRMYXN0V3JpdGVyIH0gZnJvbSAnLi9jb21taXRMb2dVdGlscy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIHNpbmdsZSBub2RlIGluIHRoZSBjYXVzYWwgREFHLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxOb2RlIHtcbiAgLyoqIFVuaXF1ZSBleGVjdXRpb24gc3RlcCBpZGVudGlmaWVyLiAqL1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogS2V5cyB0aGlzIHN0YWdlIHdyb3RlIChmcm9tIGl0cyBDb21taXRCdW5kbGUudHJhY2UpLiAqL1xuICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gIC8qKiBUaGUga2V5IHdob3NlIHJlYWTihpJ3cml0ZSBkZXBlbmRlbmN5IGxpbmtlZCB0aGlzIG5vZGUgdG8gaXRzIGNoaWxkLiBFbXB0eSBmb3IgdGhlIHJvb3QuICovXG4gIGxpbmtlZEJ5OiBzdHJpbmc7XG4gIC8qKiBCRlMgZGVwdGggZnJvbSB0aGUgc3RhcnRpbmcgbm9kZSAoMCA9IHN0YXJ0KS4gKi9cbiAgZGVwdGg6IG51bWJlcjtcbiAgLyoqIFBhcmVudCBub2RlcyDigJQgc3RhZ2VzIHRoYXQgd3JvdGUgZGF0YSB0aGlzIG5vZGUgcmVhZC4gREFHOiBtdWx0aXBsZSBwYXJlbnRzIHBvc3NpYmxlLiAqL1xuICBwYXJlbnRzOiBDYXVzYWxOb2RlW107XG59XG5cbi8qKiBPcHRpb25zIGZvciBjYXVzYWxDaGFpbigpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzYWxDaGFpbk9wdGlvbnMge1xuICAvKiogTWF4aW11bSBCRlMgZGVwdGggKGRlZmF1bHQ6IDIwKS4gUHJldmVudHMgcnVuYXdheSB0cmF2ZXJzYWwuICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSB0b3RhbCBub2RlcyB0byB2aXNpdCAoZGVmYXVsdDogMTAwKS4gSGFyZCBjYXAgZm9yIHNhZmV0eS4gKi9cbiAgbWF4Tm9kZXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2FsbGJhY2sgdGhhdCByZXR1cm5zIHRoZSBrZXlzIGEgc3RhZ2UgcmVhZCBkdXJpbmcgZXhlY3V0aW9uLlxuICogVGhlIGJhY2t0cmFja2VyIGNhbGxzIHRoaXMgZm9yIGVhY2ggdmlzaXRlZCBub2RlIHRvIGRldGVybWluZVxuICogd2hpY2ggcmVhZOKGkndyaXRlIGVkZ2VzIHRvIGZvbGxvdy5cbiAqXG4gKiBJbXBsZW1lbnRvcnM6IFF1YWxpdHlSZWNvcmRlciB0cmFja3Mga2V5c1JlYWQgcGVyIHN0ZXAsXG4gKiBvciBidWlsZCBhIE1hcDxydW50aW1lU3RhZ2VJZCwgc3RyaW5nW10+IGZyb20gU2NvcGVSZWNvcmRlci5vblJlYWQgZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBLZXlzUmVhZExvb2t1cCA9IChydW50aW1lU3RhZ2VJZDogc3RyaW5nKSA9PiBzdHJpbmdbXTtcblxuLy8g4pSA4pSAIFN0YWdlZCBvcHRpbWl6YXRpb246IHdyaXRlciBsb29rdXAgc3RyYXRlZ2llcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBUaHJlc2hvbGQgZm9yIHN3aXRjaGluZyBmcm9tIGxpbmVhciBzY2FuIHRvIHJldmVyc2UgaW5kZXguXG4gKiBCZWxvdyB0aGlzLCBPKE4pIHNjYW4gaXMgZmFzdGVyIChubyBpbmRleCBidWlsZCBjb3N0KS5cbiAqIEFib3ZlIHRoaXMsIE8obG9nIE4pIGJpbmFyeSBzZWFyY2ggd2lucy5cbiAqL1xuY29uc3QgUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQgPSAyNTY7XG5cbi8qKlxuICogV3JpdGVyIGxvb2t1cCBmdW5jdGlvbiBzaWduYXR1cmUuXG4gKiBSZXR1cm5zIHRoZSBDb21taXRCdW5kbGUgdGhhdCBsYXN0IHdyb3RlIGBrZXlgIGJlZm9yZSBwb3NpdGlvbiBgYmVmb3JlSWR4YC5cbiAqL1xudHlwZSBXcml0ZXJMb29rdXAgPSAoa2V5OiBzdHJpbmcsIGJlZm9yZUlkeDogbnVtYmVyKSA9PiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQ7XG5cbi8qKiBTdHJhdGVneSAxOiBMaW5lYXIgc2NhbiDigJQgTyhOKSBwZXIgbG9va3VwLCB6ZXJvIHNldHVwIGNvc3QuICovXG5mdW5jdGlvbiBsaW5lYXJTY2FuTG9va3VwKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10pOiBXcml0ZXJMb29rdXAge1xuICByZXR1cm4gKGtleSwgYmVmb3JlSWR4KSA9PiBmaW5kTGFzdFdyaXRlcihjb21taXRMb2csIGtleSwgYmVmb3JlSWR4KTtcbn1cblxuLyoqXG4gKiBTdHJhdGVneSAyOiBSZXZlcnNlIGluZGV4IOKAlCBPKE7Dl1UpIGJ1aWxkLCBPKGxvZyBOKSBwZXIgbG9va3VwLlxuICogQnVpbGRzIGEgTWFwPGtleSwgc29ydGVkSW5kaWNlc1tdPiB3aGVyZSBpbmRpY2VzIGFyZSBjb21taXQgcG9zaXRpb25zXG4gKiB0aGF0IHdyb3RlIHRoYXQga2V5LiBMb29rdXAgdXNlcyBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgdGhlIGxhc3Qgd3JpdGVyXG4gKiBiZWZvcmUgYSBnaXZlbiBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZUluZGV4TG9va3VwKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10pOiBXcml0ZXJMb29rdXAge1xuICAvLyBCdWlsZDoga2V5IOKGkiBzb3J0ZWQgYXJyYXkgb2YgY29tbWl0IGluZGljZXMgdGhhdCB3cm90ZSB0aGlzIGtleVxuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21taXRMb2cubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGNvbnN0IHQgb2YgY29tbWl0TG9nW2ldLnRyYWNlKSB7XG4gICAgICBsZXQgYXJyID0gaW5kZXguZ2V0KHQucGF0aCk7XG4gICAgICBpZiAoIWFycikge1xuICAgICAgICBhcnIgPSBbXTtcbiAgICAgICAgaW5kZXguc2V0KHQucGF0aCwgYXJyKTtcbiAgICAgIH1cbiAgICAgIGFyci5wdXNoKGkpOyAvLyBhbHJlYWR5IHNvcnRlZCAod2UgaXRlcmF0ZSBpbiBvcmRlcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGtleTogc3RyaW5nLCBiZWZvcmVJZHg6IG51bWJlcik6IENvbW1pdEJ1bmRsZSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgaW5kaWNlcyA9IGluZGV4LmdldChrZXkpO1xuICAgIGlmICghaW5kaWNlcyB8fCBpbmRpY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIEJpbmFyeSBzZWFyY2g6IGZpbmQgbGFyZ2VzdCBpbmRleCA8IGJlZm9yZUlkeFxuICAgIGxldCBsbyA9IDA7XG4gICAgbGV0IGhpID0gaW5kaWNlcy5sZW5ndGggLSAxO1xuICAgIGxldCByZXN1bHQgPSAtMTtcblxuICAgIHdoaWxlIChsbyA8PSBoaSkge1xuICAgICAgY29uc3QgbWlkID0gKGxvICsgaGkpID4+PiAxO1xuICAgICAgaWYgKGluZGljZXNbbWlkXSA8IGJlZm9yZUlkeCkge1xuICAgICAgICByZXN1bHQgPSBpbmRpY2VzW21pZF07XG4gICAgICAgIGxvID0gbWlkICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpID0gbWlkIC0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0ID49IDAgPyBjb21taXRMb2dbcmVzdWx0XSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFnZWQgb3B0aW1pemF0aW9uOiBwaWNrIHRoZSByaWdodCB3cml0ZXItbG9va3VwIHN0cmF0ZWd5IGJhc2VkIG9uIGRhdGEgc2l6ZS5cbiAqXG4gKiBMaWtlIGEgZGF0YWJhc2UgcXVlcnkgb3B0aW1pemVyIGNob29zaW5nIGJldHdlZW4gc2VxdWVudGlhbCBzY2FuIGFuZCBpbmRleCBzY2FuOlxuICpcbiAqIC0gKipTbWFsbCBsb2cgKOKJpCAyNTYpOioqIExpbmVhciBzY2FuIHdpbnMuIFplcm8gc2V0dXAgY29zdCwgZ29vZCBjYWNoZSBsb2NhbGl0eS5cbiAqICAgVGhlIG92ZXJoZWFkIG9mIGJ1aWxkaW5nIGEgcmV2ZXJzZSBpbmRleCBpc24ndCB3b3J0aCBpdCBmb3Igc2hvcnQgbG9ncy5cbiAqXG4gKiAtICoqTGFyZ2UgbG9nICg+IDI1Nik6KiogUmV2ZXJzZSBpbmRleCB3aW5zLiBPKE7Dl1UpIHVwZnJvbnQgYnVpbGQgY29zdCBpcyBhbW9ydGl6ZWRcbiAqICAgYWNyb3NzIGFsbCBCRlMgaG9wcy4gRWFjaCBsb29rdXAgYmVjb21lcyBPKGxvZyBOKSB2aWEgYmluYXJ5IHNlYXJjaCBpbnN0ZWFkIG9mIE8oTikuXG4gKiAgIEZvciBhbiBhZ2VudCBsb29wIHdpdGggNTAwIGl0ZXJhdGlvbnMgYW5kIDUga2V5cyBwZXIgaG9wLCB0aGlzIGlzIDUwMMOXNcOXbG9nKDUwMCniiYgyMksgb3BzXG4gKiAgIHZzIDUwMMOXNcOXNTAwPTEuMjVNIG9wcyB3aXRoIGxpbmVhciBzY2FuLlxuICpcbiAqIFRoZSBjYWxsZXIgbmV2ZXIgc2VlcyB0aGlzIOKAlCBgY2F1c2FsQ2hhaW4oKWAgcGlja3MgYXV0b21hdGljYWxseS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlV3JpdGVyTG9va3VwKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10pOiBXcml0ZXJMb29rdXAge1xuICBpZiAoY29tbWl0TG9nLmxlbmd0aCA8PSBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRCkge1xuICAgIHJldHVybiBsaW5lYXJTY2FuTG9va3VwKGNvbW1pdExvZyk7XG4gIH1cbiAgcmV0dXJuIHJldmVyc2VJbmRleExvb2t1cChjb21taXRMb2cpO1xufVxuXG4vLyDilIDilIAgQ29yZSBhbGdvcml0aG0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQnVpbGQgdGhlIGNhdXNhbCBEQUcgcm9vdGVkIGF0IGBzdGFydElkYCBieSB3YWxraW5nIGJhY2t3YXJkc1xuICogdGhyb3VnaCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgb3B0aW1hbCB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5OlxuICogLSBMaW5lYXIgc2NhbiBmb3Igc21hbGwgbG9ncyAo4omkIDI1NiBjb21taXRzKVxuICogLSBSZXZlcnNlIGluZGV4IHdpdGggYmluYXJ5IHNlYXJjaCBmb3IgbGFyZ2UgbG9ncyAoPiAyNTYgY29tbWl0cylcbiAqXG4gKiBQcm9kdWNlcyBhIERBRyAobm90IGEgdHJlZSk6IGlmIHR3byBjaGlsZHJlbiBib3RoIHJlYWQgZnJvbSB0aGUgc2FtZVxuICogcGFyZW50LCB0aGUgcGFyZW50IG5vZGUgaXMgc2hhcmVkIChkZWR1cGVkIGJ5IHJ1bnRpbWVTdGFnZUlkKS5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TG9nICAgT3JkZXJlZCBjb21taXQgYnVuZGxlcyBmcm9tIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkuY29tbWl0TG9nXG4gKiBAcGFyYW0gc3RhcnRJZCAgICAgcnVudGltZVN0YWdlSWQgdG8gc3RhcnQgYmFja3RyYWNraW5nIGZyb21cbiAqIEBwYXJhbSBnZXRLZXlzUmVhZCBDYWxsYmFjayByZXR1cm5pbmcga2V5cyByZWFkIGJ5IGEgZ2l2ZW4gZXhlY3V0aW9uIHN0ZXBcbiAqIEBwYXJhbSBvcHRpb25zICAgICBEZXB0aCBhbmQgbm9kZSBsaW1pdHNcbiAqIEByZXR1cm5zIFJvb3QgQ2F1c2FsTm9kZSB3aXRoIC5wYXJlbnRzIGZvcm1pbmcgdGhlIERBRywgb3IgdW5kZWZpbmVkIGlmIHN0YXJ0SWQgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4pOiBDYXVzYWxOb2RlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF4RGVwdGggPSBvcHRpb25zPy5tYXhEZXB0aCA/PyAyMDtcbiAgY29uc3QgbWF4Tm9kZXMgPSBvcHRpb25zPy5tYXhOb2RlcyA/PyAxMDA7XG5cbiAgLy8gQnVpbGQgcG9zaXRpb24gaW5kZXg6IHJ1bnRpbWVTdGFnZUlkIOKGkiBhcnJheSBwb3NpdGlvbiAoTyhuKSBvbmNlKVxuICBjb25zdCBpZHhNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1pdExvZy5sZW5ndGg7IGkrKykge1xuICAgIGlkeE1hcC5zZXQoY29tbWl0TG9nW2ldLnJ1bnRpbWVTdGFnZUlkLCBpKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0SWR4ID0gaWR4TWFwLmdldChzdGFydElkKTtcbiAgaWYgKHN0YXJ0SWR4ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3RhcnRDb21taXQgPSBjb21taXRMb2dbc3RhcnRJZHhdO1xuXG4gIC8vIFBpY2sgd3JpdGVyIGxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBsb2cgc2l6ZVxuICBjb25zdCBmaW5kV3JpdGVyID0gY3JlYXRlV3JpdGVyTG9va3VwKGNvbW1pdExvZyk7XG5cbiAgLy8gTm9kZSBkZWR1cCBtYXA6IHJ1bnRpbWVTdGFnZUlkIOKGkiBDYXVzYWxOb2RlIChlbnN1cmVzIERBRywgbm90IHRyZWUpXG4gIGNvbnN0IG5vZGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2F1c2FsTm9kZT4oKTtcblxuICBjb25zdCByb290OiBDYXVzYWxOb2RlID0ge1xuICAgIHJ1bnRpbWVTdGFnZUlkOiBzdGFydElkLFxuICAgIHN0YWdlSWQ6IHN0YXJ0Q29tbWl0LnN0YWdlSWQsXG4gICAgc3RhZ2VOYW1lOiBzdGFydENvbW1pdC5zdGFnZSxcbiAgICBrZXlzV3JpdHRlbjogc3RhcnRDb21taXQudHJhY2UubWFwKCh0KSA9PiB0LnBhdGgpLFxuICAgIGxpbmtlZEJ5OiAnJyxcbiAgICBkZXB0aDogMCxcbiAgICBwYXJlbnRzOiBbXSxcbiAgfTtcbiAgbm9kZU1hcC5zZXQoc3RhcnRJZCwgcm9vdCk7XG5cbiAgLy8gQkZTIHF1ZXVlOiBbbm9kZSwgY29tbWl0SWR4LCBkZXB0aF1cbiAgY29uc3QgcXVldWU6IEFycmF5PFtDYXVzYWxOb2RlLCBudW1iZXIsIG51bWJlcl0+ID0gW1tyb290LCBzdGFydElkeCwgMF1dO1xuICBsZXQgdmlzaXRlZCA9IDE7XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBbbm9kZSwgY29tbWl0SWR4LCBkZXB0aF0gPSBxdWV1ZS5zaGlmdCgpITtcblxuICAgIGlmIChkZXB0aCA+PSBtYXhEZXB0aCkgY29udGludWU7XG5cbiAgICBjb25zdCBrZXlzUmVhZCA9IGdldEtleXNSZWFkKG5vZGUucnVudGltZVN0YWdlSWQpO1xuICAgIGlmIChrZXlzUmVhZC5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgLy8gRm9yIGVhY2gga2V5IHJlYWQsIGZpbmQgd2hvIHdyb3RlIGl0XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1JlYWQpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IGZpbmRXcml0ZXIoa2V5LCBjb21taXRJZHgpO1xuICAgICAgaWYgKCF3cml0ZXIpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB3cml0ZXJJZCA9IHdyaXRlci5ydW50aW1lU3RhZ2VJZDtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgbm9kZSBmb3IgdGhpcyB3cml0ZXJcbiAgICAgIGxldCBwYXJlbnROb2RlID0gbm9kZU1hcC5nZXQod3JpdGVySWQpO1xuICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgLy8gREFHIG1lcmdlOiBhZGQgYXMgcGFyZW50IGlmIG5vdCBhbHJlYWR5IGxpbmtlZFxuICAgICAgICBpZiAoIW5vZGUucGFyZW50cy5zb21lKChwKSA9PiBwLnJ1bnRpbWVTdGFnZUlkID09PSB3cml0ZXJJZCkpIHtcbiAgICAgICAgICBub2RlLnBhcmVudHMucHVzaChwYXJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTmV3IG5vZGUg4oCUIGNyZWF0ZSBhbmQgZW5xdWV1ZVxuICAgICAgaWYgKHZpc2l0ZWQgPj0gbWF4Tm9kZXMpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB3cml0ZXJJZHggPSBpZHhNYXAuZ2V0KHdyaXRlcklkKTtcbiAgICAgIGlmICh3cml0ZXJJZHggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIHBhcmVudE5vZGUgPSB7XG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB3cml0ZXJJZCxcbiAgICAgICAgc3RhZ2VJZDogd3JpdGVyLnN0YWdlSWQsXG4gICAgICAgIHN0YWdlTmFtZTogd3JpdGVyLnN0YWdlLFxuICAgICAgICBrZXlzV3JpdHRlbjogd3JpdGVyLnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSxcbiAgICAgICAgbGlua2VkQnk6IGtleSxcbiAgICAgICAgZGVwdGg6IGRlcHRoICsgMSxcbiAgICAgICAgcGFyZW50czogW10sXG4gICAgICB9O1xuICAgICAgbm9kZU1hcC5zZXQod3JpdGVySWQsIHBhcmVudE5vZGUpO1xuICAgICAgbm9kZS5wYXJlbnRzLnB1c2gocGFyZW50Tm9kZSk7XG4gICAgICB2aXNpdGVkKys7XG5cbiAgICAgIHF1ZXVlLnB1c2goW3BhcmVudE5vZGUsIHdyaXRlcklkeCwgZGVwdGggKyAxXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmxhdHRlbiB0aGUgY2F1c2FsIERBRyBpbnRvIGEgQkZTLW9yZGVyZWQgbGlzdCBvZiBub2Rlcy5cbiAqIEVhY2ggbm9kZSBhcHBlYXJzIGV4YWN0bHkgb25jZSAoZmlyc3Qgb2NjdXJyZW5jZSBieSBCRlMgb3JkZXIpLlxuICogVXNlZnVsIGZvciBsaW5lYXIgZGlzcGxheSBvciBpdGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQ2F1c2FsREFHKHJvb3Q6IENhdXNhbE5vZGUpOiBDYXVzYWxOb2RlW10ge1xuICBjb25zdCByZXN1bHQ6IENhdXNhbE5vZGVbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHF1ZXVlOiBDYXVzYWxOb2RlW10gPSBbcm9vdF07XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKSE7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSBjb250aW51ZTtcbiAgICB2aXNpdGVkLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXN1bHQucHVzaChub2RlKTtcblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhwYXJlbnQucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNhdXNhbCBEQUcgYXMgaHVtYW4tcmVhZGFibGUgaW5kZW50ZWQgdGV4dC5cbiAqIFNob3dzIHRoZSBkZXBlbmRlbmN5IGNoYWluIHdpdGggZGVwdGggaW5kZW50YXRpb24gYW5kIGxpbmtlZC1ieSBrZXlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Q2F1c2FsQ2hhaW4ocm9vdDogQ2F1c2FsTm9kZSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZnVuY3Rpb24gd2Fsayhub2RlOiBDYXVzYWxOb2RlLCBpbmRlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLnJ1bnRpbWVTdGFnZUlkKSkge1xuICAgICAgbGluZXMucHVzaChgJHsnICAnLnJlcGVhdChpbmRlbnQpfeKGsyAke25vZGUucnVudGltZVN0YWdlSWR9IChzZWUgYWJvdmUpYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZpc2l0ZWQuYWRkKG5vZGUucnVudGltZVN0YWdlSWQpO1xuXG4gICAgY29uc3QgbGluayA9IG5vZGUubGlua2VkQnkgPyBgIOKGkCB2aWEgJHtub2RlLmxpbmtlZEJ5fWAgOiAnJztcbiAgICBjb25zdCB3cml0ZXMgPSBub2RlLmtleXNXcml0dGVuLmxlbmd0aCA+IDAgPyBgIFt3cm90ZTogJHtub2RlLmtleXNXcml0dGVuLmpvaW4oJywgJyl9XWAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl9JHtub2RlLnN0YWdlTmFtZX0gKCR7bm9kZS5ydW50aW1lU3RhZ2VJZH0pJHtsaW5rfSR7d3JpdGVzfWApO1xuXG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2Ygbm9kZS5wYXJlbnRzKSB7XG4gICAgICB3YWxrKHBhcmVudCwgaW5kZW50ICsgMSk7XG4gICAgfVxuICB9XG5cbiAgd2Fsayhyb290LCAwKTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG4vLyDilIDilIAgRXhwb3J0ZWQgZm9yIHRlc3RpbmcgKGludGVybmFsKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEBpbnRlcm5hbCBFeHBvc2VkIGZvciB0ZXN0aW5nIHRoZSBzdHJhdGVneSBzZWxlY3Rpb24uICovXG5leHBvcnQgY29uc3QgX1JFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQ7XG4iXX0=
381
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzREc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBMklyRCwwRUFBMEU7QUFFMUU7Ozs7R0FJRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBUXBDLGtFQUFrRTtBQUNsRSxTQUFTLGdCQUFnQixDQUFDLFNBQXlCO0lBQ2pELE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQXlCO0lBQ25ELGtFQUFrRTtJQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzFDLEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVCxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUNULEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxH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LE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FDL0csQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQ0YsTUFBTSxFQUNOLE1BQU0sR0FBRyxDQUFDLEVBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQ3BELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFZCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLGtCQUFrQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLGtCQUFrQixDQUFDO2FBQ3hHLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixNQUFNLDRDQUE0QyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsMEVBQTBFO0FBRTFFLDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYmFja3RyYWNrLnRzIOKAlCBCYWNrd2FyZCBjYXVzYWwgY2hhaW4gYW5hbHlzaXMgb24gdGhlIGNvbW1pdCBsb2cuXG4gKlxuICogSW1wbGVtZW50cyAqKmJhY2t3YXJkIHByb2dyYW0gc2xpY2luZyoqIChXZWlzZXIgMTk4NCwgdGhpbi1zbGljZSB2YXJpYW50KTpcbiAqIGdpdmVuIGEgc3RhcnRpbmcgZXhlY3V0aW9uIHN0ZXAsIHdhbGsgYmFja3dhcmRzIHRocm91Z2ggcmVhZOKGkndyaXRlXG4gKiBkZXBlbmRlbmNpZXMgdG8gYnVpbGQgdGhlIGNhdXNhbCBEQUcgdGhhdCBwcm9kdWNlZCB0aGUgZGF0YSBhdCB0aGF0IHN0ZXAuXG4gKlxuICogIyMgQWxnb3JpdGhtXG4gKlxuICogQkZTIG9uIHRoZSBpbXBsaWNpdCBkZXBlbmRlbmN5IGdyYXBoIHdoZXJlIGVkZ2VzIHJ1biBmcm9tIHJlYWRlciDihpIgd3JpdGVyLlxuICpcbiAqIDEuIExvY2F0ZSBzdGFydElkIGluIGNvbW1pdExvZyDihpIgcm9vdCBub2RlXG4gKiAyLiBHZXQga2V5c1JlYWQgZm9yIHJvb3QgdmlhIGBnZXRLZXlzUmVhZGAgY2FsbGJhY2tcbiAqIDMuIEZvciBlYWNoIGtleSByZWFkLCBmaW5kIHdobyBsYXN0IHdyb3RlIGl0IGJlZm9yZSB0aGlzIHN0ZXAg4oaSIHBhcmVudCBjb21taXRcbiAqIDQuIENyZWF0ZSBwYXJlbnQgQ2F1c2FsTm9kZSwgbGluayB0byByb290LnBhcmVudHNcbiAqIDUuIEVucXVldWUgcGFyZW50LiBSZXBlYXQgdW50aWwgcXVldWUgZW1wdHkgb3IgbGltaXRzIGhpdC5cbiAqXG4gKiBPdXRwdXQgaXMgYSAqKkRBRyoqIChub3QgYSBsaW5rZWQgbGlzdCk6IGEgc3RhZ2UgcmVhZGluZyBgY3JlZGl0U2NvcmVgIEFORCBgZHRpYFxuICogZnJvbSBkaWZmZXJlbnQgd3JpdGVycyBoYXMgdHdvIHBhcmVudHMuXG4gKlxuICogIyMgU3RhZ2VkIE9wdGltaXphdGlvblxuICpcbiAqIFR3byB3cml0ZXItbG9va3VwIHN0cmF0ZWdpZXMsIGNob3NlbiBhdXRvbWF0aWNhbGx5IGJ5IGNvbW1pdCBsb2cgc2l6ZTpcbiAqXG4gKiB8IFN0cmF0ZWd5IHwgV2hlbiB8IENvbXBsZXhpdHkgcGVyIGxvb2t1cCB8XG4gKiB8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgTGluZWFyIHNjYW4gfCBOIOKJpCAyNTYgfCBPKE4pIOKAlCBzaW1wbGUgYmFja3dhcmQgc2NhbiB8XG4gKiB8IFJldmVyc2UgaW5kZXggfCBOID4gMjU2IHwgTyhLIGxvZyBOKSDigJQgcHJlYnVpbHQga2V54oaSW2luZGljZXNdLCBiaW5hcnkgc2VhcmNoIHxcbiAqXG4gKiBUaGUgdGhyZXNob2xkICgyNTYpIGlzIGNob3NlbiBzbyB0aGUgTyhOKSBidWlsZCBjb3N0IG9mIHRoZSByZXZlcnNlIGluZGV4XG4gKiBpcyBhbW9ydGl6ZWQgb3ZlciB0aGUgQkZTIHRyYXZlcnNhbC4gQmVsb3cgMjU2LCBsaW5lYXIgc2NhbiB3aW5zIGJlY2F1c2VcbiAqIHRoZXJlJ3Mgbm8gaW5kZXggYnVpbGQgb3ZlcmhlYWQuIFRoZSBjb25zdW1lciBuZXZlciBzZWVzIHRoaXMg4oCUIGBjYXVzYWxDaGFpbigpYFxuICogcGlja3MgdGhlIHJpZ2h0IHN0cmF0ZWd5IGludGVybmFsbHkgKGxpa2UgYSBxdWVyeSBvcHRpbWl6ZXIgY2hvb3NpbmcgYmV0d2VlblxuICogc2VxdWVudGlhbCBzY2FuIHZzIGluZGV4IHNjYW4gYmFzZWQgb24gdGFibGUgc2l6ZSkuXG4gKlxuICogIyMgQ29tcGxleGl0eVxuICpcbiAqIC0gKipTbWFsbCBsb2dzIChOIOKJpCAyNTYpOioqIE8oViDDlyBLIMOXIE4pIHRvdGFsLiBWPXZpc2l0ZWQsIEs9YXZnIGtleXMvbm9kZS5cbiAqIC0gKipMYXJnZSBsb2dzIChOID4gMjU2KToqKiBPKE4gw5cgVSkgaW5kZXggYnVpbGQgKyBPKFYgw5cgSyDDlyBsb2cgTikgbG9va3Vwcy5cbiAqICAgVSA9IHVuaXF1ZSBrZXlzLiBBbW9ydGl6ZWQgb3ZlciBhbGwgQkZTIGhvcHMuXG4gKlxuICogIyMgUmVmZXJlbmNlc1xuICpcbiAqIC0gV2Vpc2VyLCBNLiAoMTk4NCkuIFwiUHJvZ3JhbSBTbGljaW5nLlwiIElFRUUgVFNFLlxuICogLSBTcmlkaGFyYW4sIE0uIGV0IGFsLiAoMjAwNykuIFwiVGhpbiBTbGljaW5nLlwiIFBMREkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNhdXNhbENoYWluLCBmbGF0dGVuQ2F1c2FsREFHLCBmb3JtYXRDYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3RwcmludGpzL3RyYWNlJztcbiAqXG4gKiBjb25zdCBkYWcgPSBjYXVzYWxDaGFpbihjb21taXRMb2csICdkZWNpZGUjMicsIChpZCkgPT4gcmVjb3JkZXIuZ2V0S2V5c1JlYWQoaWQpKTtcbiAqIGNvbnN0IGZsYXQgPSBmbGF0dGVuQ2F1c2FsREFHKGRhZyk7ICAgICAvLyBCRlMtb3JkZXJlZCBmbGF0IGxpc3RcbiAqIGNvbnNvbGUubG9nKGZvcm1hdENhdXNhbENoYWluKGRhZykpOyAgICAgLy8gaHVtYW4tcmVhZGFibGVcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcbmltcG9ydCB7IGZpbmRMYXN0V3JpdGVyIH0gZnJvbSAnLi9jb21taXRMb2dVdGlscy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgVW50cmFja2VkU291cmNlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEEgc2luZ2xlIG5vZGUgaW4gdGhlIGNhdXNhbCBEQUcuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbE5vZGUge1xuICAvKiogVW5pcXVlIGV4ZWN1dGlvbiBzdGVwIGlkZW50aWZpZXIuICovXG4gIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllci4gKi9cbiAgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBLZXlzIHRoaXMgc3RhZ2Ugd3JvdGUgKGZyb20gaXRzIENvbW1pdEJ1bmRsZS50cmFjZSkuICovXG4gIGtleXNXcml0dGVuOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBrZXkgd2hvc2UgcmVhZOKGkndyaXRlIGRlcGVuZGVuY3kgbGlua2VkIHRoaXMgbm9kZSB0byBpdHMgY2hpbGQuIEVtcHR5IGZvciB0aGUgcm9vdC4gKi9cbiAgbGlua2VkQnk6IHN0cmluZztcbiAgLyoqIEJGUyBkZXB0aCBmcm9tIHRoZSBzdGFydGluZyBub2RlICgwID0gc3RhcnQpLiAqL1xuICBkZXB0aDogbnVtYmVyO1xuICAvKipcbiAgICogUGFyZW50IG5vZGVzIOKAlCBzdGFnZXMgdGhpcyBub2RlIGRlcGVuZHMgb24uIERBRzogbXVsdGlwbGUgcGFyZW50c1xuICAgKiBwb3NzaWJsZS4gS0VQVCBmb3IgY29tcGF0aWJpbGl0eTsgd2l0aCB0aGUgYGNvbnRyb2xEZXBzYCBvcHRpb25cbiAgICogKFJGQy0wMDMgRDMpIGdvdmVybmluZyBkZWNpZGVycyBhcHBlYXIgaGVyZSB0b28uIEZvciB0eXBlZC9rZXllZC9cbiAgICogd2VpZ2h0ZWQgZGV0YWlsIHVzZSB7QGxpbmsgcGFyZW50RWRnZXN9LlxuICAgKi9cbiAgcGFyZW50czogQ2F1c2FsTm9kZVtdO1xuICAvKipcbiAgICogUkZDLTAwMyBEMyDigJQgb25lIGVkZ2UgcGVyIGRlcGVuZGVuY3kgTElOSyAobm90IHBlciBwYXJlbnQpOiBhIG5vZGVcbiAgICogcmVhZGluZyB0d28ga2V5cyBmcm9tIHRoZSBzYW1lIHdyaXRlciBoYXMgT05FIGVudHJ5IGluIHtAbGluayBwYXJlbnRzfVxuICAgKiBidXQgVFdPIGAnZGF0YSdgIGVkZ2VzIGhlcmUuIENvbnRyb2wgZGVwZW5kZW5jaWVzICh2aWEgdGhlXG4gICAqIGBjb250cm9sRGVwc2Agb3B0aW9uKSBhZGQgYSBgJ2NvbnRyb2wnYCBlZGdlIHRvIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci5cbiAgICovXG4gIHBhcmVudEVkZ2VzOiBDYXVzYWxFZGdlW107XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyIGhvbmVzdHkgbWFya2VyIOKAlCBzdGFtcGVkIGZyb20gdGhlIHN0YWdlJ3NcbiAgICogYENvbW1pdEJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzYC4gUHJlc2VudCB3aGVuIHRoaXMgc3RhZ2UgQUxTTyBjb25zdW1lZFxuICAgKiB1bnRyYWNrZWQgcmVhZCBwYXRocyAoYGFyZ3NgIC8gYGVudmAgLyB1bnNoYWRvd2VkIGBzaWxlbnRgIHJlYWRzKTogdGhlXG4gICAqIGJhY2t3YXJkIHNsaWNlIHRocm91Z2ggdGhpcyBub2RlIG1heSBiZSBpbmNvbXBsZXRlLCBiZWNhdXNlIHRob3NlIHJlYWRzXG4gICAqIHByb2R1Y2Ugbm8gcmVhZOKGkndyaXRlIGVkZ2UgdG8gZm9sbG93LiBgZm9ybWF0Q2F1c2FsQ2hhaW5gIHJlbmRlcnMgdGhpc1xuICAgKiBhcyBhIGDimqAg4oCmIHNsaWNlIG1heSBiZSBpbmNvbXBsZXRlIGhlcmVgIGxpbmUuIEFic2VudCB3aGVuIHRoZSBzdGFnZSdzXG4gICAqIHJlYWRzIHdlcmUgZnVsbHkgdHJhY2tlZC5cbiAgICovXG4gIGluY29tcGxldGVTb3VyY2VzPzogUmVhZG9ubHlBcnJheTxVbnRyYWNrZWRTb3VyY2U+O1xuICAvKipcbiAgICogUkZDLTAwMyBENCB0cnVuY2F0aW9uIHZpc2liaWxpdHkg4oCUIHNldCBvbiB0aGUgUk9PVCBub2RlIG9ubHksIGFuZCBvbmx5XG4gICAqIHdoZW4gYSBsaW1pdCBhY3R1YWxseSBjdXQgdGhlIHNsaWNlOiBgYnlEZXB0aGAgd2hlbiBhIG5vZGUgYXQgdGhlXG4gICAqIGBtYXhEZXB0aGAgaG9yaXpvbiBzdGlsbCBoYWQgZWRnZXMgdG8gZXhwYW5kLCBgYnlOb2Rlc2Agd2hlbiB0aGVcbiAgICogYG1heE5vZGVzYCBidWRnZXQgYmxvY2tlZCBjcmVhdGluZyBhIGRpc2NvdmVyZWQgcGFyZW50LiBBYnNlbnQgd2hlbiB0aGVcbiAgICogc2xpY2UgaXMgY29tcGxldGUuIERldiBtb2RlIChgZW5hYmxlRGV2TW9kZSgpYCkgYWxzbyB3YXJucyBvblxuICAgKiB0cnVuY2F0aW9uLCBhbmQgYGZvcm1hdENhdXNhbENoYWluYCBhcHBlbmRzIGEgYOKaoCBzbGljZSB0cnVuY2F0ZWQg4oCmYFxuICAgKiBsaW5lIOKAlCBhIGNvbnN1bWVyIG11c3QgbmV2ZXIgbWlzdGFrZSBhIHRydW5jYXRlZCBzbGljZSBmb3IgYSBmdWxsIG9uZS5cbiAgICovXG4gIHRydW5jYXRlZD86IHsgYnlEZXB0aDogYm9vbGVhbjsgYnlOb2RlczogYm9vbGVhbiB9O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgdHlwZWQgZGVwZW5kZW5jeSBlZGdlIGZyb20gYSBjaGlsZCBub2RlIHRvIG9uZSBwYXJlbnQuXG4gKlxuICogLSBga2luZDogJ2RhdGEnYCAgICDigJQgcmVhZOKGkndyaXRlIGRlcGVuZGVuY3k7IGBrZXlgIGlzIHRoZSBzdGF0ZSBrZXkuXG4gKiAtIGBraW5kOiAnY29udHJvbCdgIOKAlCB0aGUgcGFyZW50IGlzIHRoZSBkZWNpZGVyL3NlbGVjdG9yIHdob3NlIGRlY2lzaW9uXG4gKiAgIGFsbG93ZWQgdGhlIGNoaWxkIHRvIHJ1bjsgYGtleWAgaXMgdGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgd2hlbiBwcmVzZW50LlxuICpcbiAqIGB3ZWlnaHRgIGRlZmF1bHRzIHRvIDEuMDsgdGhlIGB3ZWlnaGAgaG9vayAoUkZDLTAwMyBENCkgY2FuIG92ZXJyaWRlIGl0LlxuICogVGhlIGVuZ2luZSBpdHNlbGYgTkVWRVIgY29tcHV0ZXMgd2VpZ2h0cyDigJQgc2VtYW50aWNzIGJlbG9uZyB0byB0aGVcbiAqIGNvbnN1bWVyLWluamVjdGVkIHdlaWdoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2FsRWRnZSB7XG4gIHBhcmVudDogQ2F1c2FsTm9kZTtcbiAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnO1xuICBrZXk/OiBzdHJpbmc7XG4gIHdlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgY29udHJvbCBkZXBlbmRlbmN5IHJlc29sdmVkIGZvciBvbmUgZXhlY3V0aW9uIHN0ZXA6XG4gKiB3aGljaCBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBlbmRlbmN5IHtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gc3RlcC4gKi9cbiAgZGVjaWRlcklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCBmb3IgdGhlIGNob3NlbiBicmFuY2gsIHdoZW4gcHJlc2VudC4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgY2FsbGJhY2sgcmVzb2x2aW5nIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciBmb3IgYW4gZXhlY3V0aW9uXG4gKiBzdGVwLiBSZXR1cm4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgc3RlcCBpcyBub3QgY29udHJvbC1kZXBlbmRlbnQgb24gYW55XG4gKiByZWNvcmRlZCBkZWNpc2lvbi4gQnVpbGQgb25lIHdpdGggYGNvbnRyb2xEZXBSZWNvcmRlcigpYCBmcm9tXG4gKiBgZm9vdHByaW50anMvdHJhY2VgLCBvciBzdXBwbHkgeW91ciBvd24uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRyb2xEZXBMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUkZDLTAwMyBENCDigJQgY29uc3VtZXItaW5qZWN0ZWQgZWRnZSB3ZWlnaGVyLiBDYWxsZWQgb25jZSBwZXIgY3JlYXRlZFxuICogZWRnZTsgcmV0dXJuIGEgd2VpZ2h0LCBvciBgdW5kZWZpbmVkYCB0byBrZWVwIHRoZSBkZWZhdWx0IDEuMC4gVGhlXG4gKiBFTkdJTkUgbmV2ZXIgY29tcHV0ZXMgd2VpZ2h0cyAoemVybyBuZXcgZGVwZW5kZW5jaWVzIOKAlCBzZW1hbnRpY3MgbGlrZVxuICogZW1iZWRkaW5nIHNpbWlsYXJpdHkgb3IgRkRMIGluZmx1ZW5jZSBiZWxvbmcgdG8gZG93bnN0cmVhbSBsaWJyYXJpZXMsXG4gKiB0aGUgc2FtZSBwbHVnLWluIHBhdHRlcm4gYXMgYE5hcnJhdGl2ZUZvcm1hdHRlcmApLiBXZWlnaHRzIHJlbmRlciBpblxuICogYGZvcm1hdENhdXNhbENoYWluYCBhcyBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYC5cbiAqL1xuZXhwb3J0IHR5cGUgRWRnZVdlaWdoZXIgPSAoXG4gIGNoaWxkOiBDYXVzYWxOb2RlLFxuICBwYXJlbnQ6IENhdXNhbE5vZGUsXG4gIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCcsXG4pID0+IG51bWJlciB8IHVuZGVmaW5lZDtcblxuLyoqIE9wdGlvbnMgZm9yIGNhdXNhbENoYWluKCkuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIEJGUyBkZXB0aCAoZGVmYXVsdDogMjApLiBQcmV2ZW50cyBydW5hd2F5IHRyYXZlcnNhbC4gKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHRvdGFsIG5vZGVzIHRvIHZpc2l0IChkZWZhdWx0OiAxMDApLiBIYXJkIGNhcCBmb3Igc2FmZXR5LiAqL1xuICBtYXhOb2Rlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSBsb29rdXAuIFdoZW4gcHJvdmlkZWQsIGV4cGFuZGluZyBhIG5vZGVcbiAgICogQUxTTyBsaW5rcyBhIGAnY29udHJvbCdgIGVkZ2UgdG8gaXRzIGdvdmVybmluZyBkZWNpZGVyIChsYWJlbGVkIGJ5IHRoZVxuICAgKiBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudCk7IHRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAqIG5vcm1hbGx5IHRocm91Z2ggaXRzIG93biBkYXRhIHJlYWRzLCBzbyBjaGFpbnMgbGlrZVxuICAgKiBgc3RhdHVzIOKGkCBbY29udHJvbF0gQ2xhc3NpZnlSaXNrIOKGkCBbZGF0YTogY3JlZGl0U2NvcmVdIFB1bGxCdXJlYXVgXG4gICAqIHJlc29sdmUgZW5kLXRvLWVuZC4gV2l0aG91dCB0aGlzIG9wdGlvbiBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBjb250cm9sRGVwcz86IENvbnRyb2xEZXBMb29rdXA7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IOKAlCBlZGdlIHdlaWdoZXIuIFN0YW1wcyBgQ2F1c2FsRWRnZS53ZWlnaHRgIGF0IGVkZ2UgY3JlYXRpb247XG4gICAqIGB1bmRlZmluZWRgIChvciBubyB3ZWlnaGVyKSDihpIgMS4wLiBTZWUge0BsaW5rIEVkZ2VXZWlnaGVyfS5cbiAgICovXG4gIHdlaWdoPzogRWRnZVdlaWdoZXI7XG59XG5cbi8qKlxuICogQ2FsbGJhY2sgdGhhdCByZXR1cm5zIHRoZSBrZXlzIGEgc3RhZ2UgcmVhZCBkdXJpbmcgZXhlY3V0aW9uLlxuICogVGhlIGJhY2t0cmFja2VyIGNhbGxzIHRoaXMgZm9yIGVhY2ggdmlzaXRlZCBub2RlIHRvIGRldGVybWluZVxuICogd2hpY2ggcmVhZOKGkndyaXRlIGVkZ2VzIHRvIGZvbGxvdy5cbiAqXG4gKiBJbXBsZW1lbnRvcnM6IFF1YWxpdHlSZWNvcmRlciB0cmFja3Mga2V5c1JlYWQgcGVyIHN0ZXAsXG4gKiBvciBidWlsZCBhIE1hcDxydW50aW1lU3RhZ2VJZCwgc3RyaW5nW10+IGZyb20gU2NvcGVSZWNvcmRlci5vblJlYWQgZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBLZXlzUmVhZExvb2t1cCA9IChydW50aW1lU3RhZ2VJZDogc3RyaW5nKSA9PiBzdHJpbmdbXTtcblxuLy8g4pSA4pSAIFN0YWdlZCBvcHRpbWl6YXRpb246IHdyaXRlciBsb29rdXAgc3RyYXRlZ2llcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBUaHJlc2hvbGQgZm9yIHN3aXRjaGluZyBmcm9tIGxpbmVhciBzY2FuIHRvIHJldmVyc2UgaW5kZXguXG4gKiBCZWxvdyB0aGlzLCBPKE4pIHNjYW4gaXMgZmFzdGVyIChubyBpbmRleCBidWlsZCBjb3N0KS5cbiAqIEFib3ZlIHRoaXMsIE8obG9nIE4pIGJpbmFyeSBzZWFyY2ggd2lucy5cbiAqL1xuY29uc3QgUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQgPSAyNTY7XG5cbi8qKlxuICogV3JpdGVyIGxvb2t1cCBmdW5jdGlvbiBzaWduYXR1cmUuXG4gKiBSZXR1cm5zIHRoZSBDb21taXRCdW5kbGUgdGhhdCBsYXN0IHdyb3RlIGBrZXlgIGJlZm9yZSBwb3NpdGlvbiBgYmVmb3JlSWR4YC5cbiAqL1xudHlwZSBXcml0ZXJMb29rdXAgPSAoa2V5OiBzdHJpbmcsIGJlZm9yZUlkeDogbnVtYmVyKSA9PiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQ7XG5cbi8qKiBTdHJhdGVneSAxOiBMaW5lYXIgc2NhbiDigJQgTyhOKSBwZXIgbG9va3VwLCB6ZXJvIHNldHVwIGNvc3QuICovXG5mdW5jdGlvbiBsaW5lYXJTY2FuTG9va3VwKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10pOiBXcml0ZXJMb29rdXAge1xuICByZXR1cm4gKGtleSwgYmVmb3JlSWR4KSA9PiBmaW5kTGFzdFdyaXRlcihjb21taXRMb2csIGtleSwgYmVmb3JlSWR4KTtcbn1cblxuLyoqXG4gKiBTdHJhdGVneSAyOiBSZXZlcnNlIGluZGV4IOKAlCBPKE7Dl1UpIGJ1aWxkLCBPKGxvZyBOKSBwZXIgbG9va3VwLlxuICogQnVpbGRzIGEgTWFwPGtleSwgc29ydGVkSW5kaWNlc1tdPiB3aGVyZSBpbmRpY2VzIGFyZSBjb21taXQgcG9zaXRpb25zXG4gKiB0aGF0IHdyb3RlIHRoYXQga2V5LiBMb29rdXAgdXNlcyBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgdGhlIGxhc3Qgd3JpdGVyXG4gKiBiZWZvcmUgYSBnaXZlbiBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZUluZGV4TG9va3VwKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10pOiBXcml0ZXJMb29rdXAge1xuICAvLyBCdWlsZDoga2V5IOKGkiBzb3J0ZWQgYXJyYXkgb2YgY29tbWl0IGluZGljZXMgdGhhdCB3cm90ZSB0aGlzIGtleVxuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21taXRMb2cubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGNvbnN0IHQgb2YgY29tbWl0TG9nW2ldLnRyYWNlKSB7XG4gICAgICBsZXQgYXJyID0gaW5kZXguZ2V0KHQucGF0aCk7XG4gICAgICBpZiAoIWFycikge1xuICAgICAgICBhcnIgPSBbXTtcbiAgICAgICAgaW5kZXguc2V0KHQucGF0aCwgYXJyKTtcbiAgICAgIH1cbiAgICAgIGFyci5wdXNoKGkpOyAvLyBhbHJlYWR5IHNvcnRlZCAod2UgaXRlcmF0ZSBpbiBvcmRlcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGtleTogc3RyaW5nLCBiZWZvcmVJZHg6IG51bWJlcik6IENvbW1pdEJ1bmRsZSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgaW5kaWNlcyA9IGluZGV4LmdldChrZXkpO1xuICAgIGlmICghaW5kaWNlcyB8fCBpbmRpY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIEJpbmFyeSBzZWFyY2g6IGZpbmQgbGFyZ2VzdCBpbmRleCA8IGJlZm9yZUlkeFxuICAgIGxldCBsbyA9IDA7XG4gICAgbGV0IGhpID0gaW5kaWNlcy5sZW5ndGggLSAxO1xuICAgIGxldCByZXN1bHQgPSAtMTtcblxuICAgIHdoaWxlIChsbyA8PSBoaSkge1xuICAgICAgY29uc3QgbWlkID0gKGxvICsgaGkpID4+PiAxO1xuICAgICAgaWYgKGluZGljZXNbbWlkXSA8IGJlZm9yZUlkeCkge1xuICAgICAgICByZXN1bHQgPSBpbmRpY2VzW21pZF07XG4gICAgICAgIGxvID0gbWlkICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpID0gbWlkIC0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0ID49IDAgPyBjb21taXRMb2dbcmVzdWx0XSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFnZWQgb3B0aW1pemF0aW9uOiBwaWNrIHRoZSByaWdodCB3cml0ZXItbG9va3VwIHN0cmF0ZWd5IGJhc2VkIG9uIGRhdGEgc2l6ZS5cbiAqXG4gKiBMaWtlIGEgZGF0YWJhc2UgcXVlcnkgb3B0aW1pemVyIGNob29zaW5nIGJldHdlZW4gc2VxdWVudGlhbCBzY2FuIGFuZCBpbmRleCBzY2FuOlxuICpcbiAqIC0gKipTbWFsbCBsb2cgKOKJpCAyNTYpOioqIExpbmVhciBzY2FuIHdpbnMuIFplcm8gc2V0dXAgY29zdCwgZ29vZCBjYWNoZSBsb2NhbGl0eS5cbiAqICAgVGhlIG92ZXJoZWFkIG9mIGJ1aWxkaW5nIGEgcmV2ZXJzZSBpbmRleCBpc24ndCB3b3J0aCBpdCBmb3Igc2hvcnQgbG9ncy5cbiAqXG4gKiAtICoqTGFyZ2UgbG9nICg+IDI1Nik6KiogUmV2ZXJzZSBpbmRleCB3aW5zLiBPKE7Dl1UpIHVwZnJvbnQgYnVpbGQgY29zdCBpcyBhbW9ydGl6ZWRcbiAqICAgYWNyb3NzIGFsbCBCRlMgaG9wcy4gRWFjaCBsb29rdXAgYmVjb21lcyBPKGxvZyBOKSB2aWEgYmluYXJ5IHNlYXJjaCBpbnN0ZWFkIG9mIE8oTikuXG4gKiAgIEZvciBhbiBhZ2VudCBsb29wIHdpdGggNTAwIGl0ZXJhdGlvbnMgYW5kIDUga2V5cyBwZXIgaG9wLCB0aGlzIGlzIDUwMMOXNcOXbG9nKDUwMCniiYgyMksgb3BzXG4gKiAgIHZzIDUwMMOXNcOXNTAwPTEuMjVNIG9wcyB3aXRoIGxpbmVhciBzY2FuLlxuICpcbiAqIFRoZSBjYWxsZXIgbmV2ZXIgc2VlcyB0aGlzIOKAlCBgY2F1c2FsQ2hhaW4oKWAgcGlja3MgYXV0b21hdGljYWxseS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlV3JpdGVyTG9va3VwKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10pOiBXcml0ZXJMb29rdXAge1xuICBpZiAoY29tbWl0TG9nLmxlbmd0aCA8PSBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRCkge1xuICAgIHJldHVybiBsaW5lYXJTY2FuTG9va3VwKGNvbW1pdExvZyk7XG4gIH1cbiAgcmV0dXJuIHJldmVyc2VJbmRleExvb2t1cChjb21taXRMb2cpO1xufVxuXG4vLyDilIDilIAgQ29yZSBhbGdvcml0aG0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUkZDLTAwMyBEMjogdGhlIGBpbmNvbXBsZXRlU291cmNlc2Agbm9kZSBmcmFnbWVudCBmb3IgYSBjb21taXQg4oCUIGB7fWBcbiAqIHdoZW4gdGhlIHN0YWdlIGNvbnN1bWVkIG5vIHVudHJhY2tlZCByZWFkIHBhdGhzLCBrZWVwaW5nIHRoZSBmaWVsZFxuICogQUJTRU5UIChub3QgZW1wdHktYXJyYXktdmFsdWVkKSBmb3IgZnVsbHktdHJhY2tlZCBzdGFnZXMuXG4gKi9cbmZ1bmN0aW9uIGluY29tcGxldGVTb3VyY2VzRnJhZ21lbnQoY29tbWl0OiBDb21taXRCdW5kbGUpOiB7IGluY29tcGxldGVTb3VyY2VzPzogUmVhZG9ubHlBcnJheTxVbnRyYWNrZWRTb3VyY2U+IH0ge1xuICBpZiAoIWNvbW1pdC51bnRyYWNrZWRTb3VyY2VzIHx8IGNvbW1pdC51bnRyYWNrZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9O1xuICByZXR1cm4geyBpbmNvbXBsZXRlU291cmNlczogY29tbWl0LnVudHJhY2tlZFNvdXJjZXMgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2F1c2FsIERBRyByb290ZWQgYXQgYHN0YXJ0SWRgIGJ5IHdhbGtpbmcgYmFja3dhcmRzXG4gKiB0aHJvdWdoIHJlYWTihpJ3cml0ZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNvbW1pdCBsb2cuXG4gKlxuICogQXV0b21hdGljYWxseSBzZWxlY3RzIHRoZSBvcHRpbWFsIHdyaXRlciBsb29rdXAgc3RyYXRlZ3k6XG4gKiAtIExpbmVhciBzY2FuIGZvciBzbWFsbCBsb2dzICjiiaQgMjU2IGNvbW1pdHMpXG4gKiAtIFJldmVyc2UgaW5kZXggd2l0aCBiaW5hcnkgc2VhcmNoIGZvciBsYXJnZSBsb2dzICg+IDI1NiBjb21taXRzKVxuICpcbiAqIFByb2R1Y2VzIGEgREFHIChub3QgYSB0cmVlKTogaWYgdHdvIGNoaWxkcmVuIGJvdGggcmVhZCBmcm9tIHRoZSBzYW1lXG4gKiBwYXJlbnQsIHRoZSBwYXJlbnQgbm9kZSBpcyBzaGFyZWQgKGRlZHVwZWQgYnkgcnVudGltZVN0YWdlSWQpLlxuICpcbiAqIEBwYXJhbSBjb21taXRMb2cgICBPcmRlcmVkIGNvbW1pdCBidW5kbGVzIGZyb20gZXhlY3V0b3IuZ2V0U25hcHNob3QoKS5jb21taXRMb2dcbiAqIEBwYXJhbSBzdGFydElkICAgICBydW50aW1lU3RhZ2VJZCB0byBzdGFydCBiYWNrdHJhY2tpbmcgZnJvbVxuICogQHBhcmFtIGdldEtleXNSZWFkIENhbGxiYWNrIHJldHVybmluZyBrZXlzIHJlYWQgYnkgYSBnaXZlbiBleGVjdXRpb24gc3RlcFxuICogQHBhcmFtIG9wdGlvbnMgICAgIERlcHRoIGFuZCBub2RlIGxpbWl0c1xuICogQHJldHVybnMgUm9vdCBDYXVzYWxOb2RlIHdpdGggLnBhcmVudHMgZm9ybWluZyB0aGUgREFHLCBvciB1bmRlZmluZWQgaWYgc3RhcnRJZCBub3QgZm91bmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhdXNhbENoYWluKFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICBzdGFydElkOiBzdHJpbmcsXG4gIGdldEtleXNSZWFkOiBLZXlzUmVhZExvb2t1cCxcbiAgb3B0aW9ucz86IENhdXNhbENoYWluT3B0aW9ucyxcbik6IENhdXNhbE5vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXhEZXB0aCA9IG9wdGlvbnM/Lm1heERlcHRoID8/IDIwO1xuICBjb25zdCBtYXhOb2RlcyA9IG9wdGlvbnM/Lm1heE5vZGVzID8/IDEwMDtcbiAgY29uc3QgY29udHJvbERlcHMgPSBvcHRpb25zPy5jb250cm9sRGVwcztcbiAgY29uc3Qgd2VpZ2ggPSBvcHRpb25zPy53ZWlnaDtcblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkuIFNldCBvbmx5IHdoZW4gYSBsaW1pdCBhY3R1YWxseVxuICAvLyBjdXRzIHRoZSBzbGljZTsgc3VyZmFjZWQgb24gdGhlIHJvb3QgYXMgYHRydW5jYXRlZGAgc28gYSBjb25zdW1lciBjYW5cbiAgLy8gbmV2ZXIgbWlzdGFrZSBhIHRydW5jYXRlZCBzbGljZSBmb3IgYSBjb21wbGV0ZSBvbmUuXG4gIGxldCB0cnVuY2F0ZWRCeURlcHRoID0gZmFsc2U7XG4gIGxldCB0cnVuY2F0ZWRCeU5vZGVzID0gZmFsc2U7XG5cbiAgLy8gQnVpbGQgcG9zaXRpb24gaW5kZXg6IHJ1bnRpbWVTdGFnZUlkIOKGkiBhcnJheSBwb3NpdGlvbiAoTyhuKSBvbmNlKVxuICBjb25zdCBpZHhNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1pdExvZy5sZW5ndGg7IGkrKykge1xuICAgIGlkeE1hcC5zZXQoY29tbWl0TG9nW2ldLnJ1bnRpbWVTdGFnZUlkLCBpKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0SWR4ID0gaWR4TWFwLmdldChzdGFydElkKTtcbiAgaWYgKHN0YXJ0SWR4ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3RhcnRDb21taXQgPSBjb21taXRMb2dbc3RhcnRJZHhdO1xuXG4gIC8vIFBpY2sgd3JpdGVyIGxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBsb2cgc2l6ZVxuICBjb25zdCBmaW5kV3JpdGVyID0gY3JlYXRlV3JpdGVyTG9va3VwKGNvbW1pdExvZyk7XG5cbiAgLy8gTm9kZSBkZWR1cCBtYXA6IHJ1bnRpbWVTdGFnZUlkIOKGkiBDYXVzYWxOb2RlIChlbnN1cmVzIERBRywgbm90IHRyZWUpXG4gIGNvbnN0IG5vZGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2F1c2FsTm9kZT4oKTtcblxuICBjb25zdCByb290OiBDYXVzYWxOb2RlID0ge1xuICAgIHJ1bnRpbWVTdGFnZUlkOiBzdGFydElkLFxuICAgIHN0YWdlSWQ6IHN0YXJ0Q29tbWl0LnN0YWdlSWQsXG4gICAgc3RhZ2VOYW1lOiBzdGFydENvbW1pdC5zdGFnZSxcbiAgICBrZXlzV3JpdHRlbjogc3RhcnRDb21taXQudHJhY2UubWFwKCh0KSA9PiB0LnBhdGgpLFxuICAgIGxpbmtlZEJ5OiAnJyxcbiAgICBkZXB0aDogMCxcbiAgICBwYXJlbnRzOiBbXSxcbiAgICBwYXJlbnRFZGdlczogW10sXG4gICAgLi4uaW5jb21wbGV0ZVNvdXJjZXNGcmFnbWVudChzdGFydENvbW1pdCksXG4gIH07XG4gIG5vZGVNYXAuc2V0KHN0YXJ0SWQsIHJvb3QpO1xuXG4gIC8vIEJGUyBxdWV1ZTogW25vZGUsIGNvbW1pdElkeCwgZGVwdGhdXG4gIGNvbnN0IHF1ZXVlOiBBcnJheTxbQ2F1c2FsTm9kZSwgbnVtYmVyLCBudW1iZXJdPiA9IFtbcm9vdCwgc3RhcnRJZHgsIDBdXTtcbiAgbGV0IHZpc2l0ZWQgPSAxO1xuXG4gIC8qKlxuICAgKiBMaW5rIGBub2RlIOKGkiBwYXJlbnRgIChjcmVhdGluZyArIGVucXVldWVpbmcgdGhlIHBhcmVudCB3aGVuIG5ldykuXG4gICAqIFNoYXJlZCBieSBkYXRhLWVkZ2UgZXhwYW5zaW9uIChyZWFk4oaSd3JpdGUpIGFuZCBjb250cm9sLWVkZ2UgZXhwYW5zaW9uXG4gICAqIChEMykuIE9uZSBDYXVzYWxFZGdlIHBlciBkaXN0aW5jdCAocGFyZW50LCBraW5kLCBrZXkpIGxpbms7IGBwYXJlbnRzYFxuICAgKiBrZWVwcyBpdHMgaGlzdG9yaWNhbCBvbmUtZW50cnktcGVyLXBhcmVudCBkZWR1cC5cbiAgICovXG4gIGZ1bmN0aW9uIGxpbmtQYXJlbnQoXG4gICAgbm9kZTogQ2F1c2FsTm9kZSxcbiAgICBwYXJlbnRDb21taXQ6IENvbW1pdEJ1bmRsZSxcbiAgICBraW5kOiAnZGF0YScgfCAnY29udHJvbCcsXG4gICAga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZGVwdGg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50SWQgPSBwYXJlbnRDb21taXQucnVudGltZVN0YWdlSWQ7XG5cbiAgICBsZXQgcGFyZW50Tm9kZSA9IG5vZGVNYXAuZ2V0KHBhcmVudElkKTtcbiAgICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICAgIC8vIE5ldyBub2RlIOKAlCBjcmVhdGUgYW5kIGVucXVldWUgKHJlc3BlY3RpbmcgdGhlIG5vZGUgYnVkZ2V0KVxuICAgICAgaWYgKHZpc2l0ZWQgPj0gbWF4Tm9kZXMpIHtcbiAgICAgICAgdHJ1bmNhdGVkQnlOb2RlcyA9IHRydWU7IC8vIEQ0OiBhIGRpc2NvdmVyZWQgcGFyZW50IHdhcyBkcm9wcGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50SWR4ID0gaWR4TWFwLmdldChwYXJlbnRJZCk7XG4gICAgICBpZiAocGFyZW50SWR4ID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgcGFyZW50Tm9kZSA9IHtcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHBhcmVudElkLFxuICAgICAgICBzdGFnZUlkOiBwYXJlbnRDb21taXQuc3RhZ2VJZCxcbiAgICAgICAgc3RhZ2VOYW1lOiBwYXJlbnRDb21taXQuc3RhZ2UsXG4gICAgICAgIGtleXNXcml0dGVuOiBwYXJlbnRDb21taXQudHJhY2UubWFwKCh0KSA9PiB0LnBhdGgpLFxuICAgICAgICAvLyBsaW5rZWRCeSBzdGF5cyBhIERBVEEta2V5IGNvbmNlcHQgKGJhY2stY29tcGF0KSDigJQgY29udHJvbC1saW5rZWRcbiAgICAgICAgLy8gbm9kZXMgY2FycnkgdGhlaXIgbGFiZWwgb24gdGhlIGVkZ2UgaW5zdGVhZC5cbiAgICAgICAgbGlua2VkQnk6IGtpbmQgPT09ICdkYXRhJyA/IGtleSA/PyAnJyA6ICcnLFxuICAgICAgICBkZXB0aDogZGVwdGggKyAxLFxuICAgICAgICBwYXJlbnRzOiBbXSxcbiAgICAgICAgcGFyZW50RWRnZXM6IFtdLFxuICAgICAgICAuLi5pbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KHBhcmVudENvbW1pdCksXG4gICAgICB9O1xuICAgICAgbm9kZU1hcC5zZXQocGFyZW50SWQsIHBhcmVudE5vZGUpO1xuICAgICAgdmlzaXRlZCsrO1xuICAgICAgcXVldWUucHVzaChbcGFyZW50Tm9kZSwgcGFyZW50SWR4LCBkZXB0aCArIDFdKTtcbiAgICB9XG5cbiAgICAvLyBEQUcgbWVyZ2U6IG9uZSBwYXJlbnRzW10gZW50cnkgcGVyIGRpc3RpbmN0IHBhcmVudCAoaGlzdG9yaWNhbCBzaGFwZSlcbiAgICBpZiAoIW5vZGUucGFyZW50cy5zb21lKChwKSA9PiBwLnJ1bnRpbWVTdGFnZUlkID09PSBwYXJlbnRJZCkpIHtcbiAgICAgIG5vZGUucGFyZW50cy5wdXNoKHBhcmVudE5vZGUpO1xuICAgIH1cbiAgICAvLyBPbmUgZWRnZSBwZXIgZGlzdGluY3QgKHBhcmVudCwga2luZCwga2V5KSBsaW5rLiBUaGUgd2VpZ2hlciAoRDQpXG4gICAgLy8gc3RhbXBzIHRoZSB3ZWlnaHQgYXQgY3JlYXRpb247IGB1bmRlZmluZWRgIOKGkiAxLjAg4oCUIHRoZSBlbmdpbmUgbmV2ZXJcbiAgICAvLyBjb21wdXRlcyB3ZWlnaHRzIGl0c2VsZi5cbiAgICBpZiAoIW5vZGUucGFyZW50RWRnZXMuc29tZSgoZSkgPT4gZS5wYXJlbnQucnVudGltZVN0YWdlSWQgPT09IHBhcmVudElkICYmIGUua2luZCA9PT0ga2luZCAmJiBlLmtleSA9PT0ga2V5KSkge1xuICAgICAgLy8gRXJyb3IgaXNvbGF0aW9uIChyZXZpZXcgZmluZGluZyk6IGEgY29uc3VtZXIgd2VpZ2hlciB0aGF0IHRocm93c1xuICAgICAgLy8gbXVzdCBkZWdyYWRlIHRvIHRoZSBkZWZhdWx0IHdlaWdodCwgbmV2ZXIgY3Jhc2ggdGhlIHNsaWNlIOKAlCB0aGVcbiAgICAgIC8vIHNhbWUgY29udHJhY3QgZXZlcnkgb3RoZXIgY29uc3VtZXIgY2FsbGJhY2sgaW4gdGhlIGxpYnJhcnkgZ2V0cy5cbiAgICAgIGxldCB3ZWlnaHQgPSAxLjA7XG4gICAgICBpZiAod2VpZ2gpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3ZWlnaHQgPSB3ZWlnaChub2RlLCBwYXJlbnROb2RlLCBrZXksIGtpbmQpID8/IDEuMDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLyogd2VpZ2hlciB0aHJldyDigJQga2VlcCAxLjAsIHRoZSBzbGljZSBzdGF5cyB1c2FibGUgKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbm9kZS5wYXJlbnRFZGdlcy5wdXNoKHsgcGFyZW50OiBwYXJlbnROb2RlLCBraW5kLCBrZXksIHdlaWdodCB9KTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IFtub2RlLCBjb21taXRJZHgsIGRlcHRoXSA9IHF1ZXVlLnNoaWZ0KCkhO1xuXG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoKSB7XG4gICAgICAvLyBENDogb25seSBhIG5vZGUgdGhhdCBzdGlsbCBIQUQgc29tZXRoaW5nIHRvIGV4cGFuZCBjb3VudHMgYXMgYSBjdXRcbiAgICAgIC8vIChhIGxlYWYgYXQgdGhlIGhvcml6b24gdHJ1bmNhdGVzIG5vdGhpbmcpLlxuICAgICAgaWYgKGdldEtleXNSZWFkKG5vZGUucnVudGltZVN0YWdlSWQpLmxlbmd0aCA+IDAgfHwgY29udHJvbERlcHM/Lihub2RlLnJ1bnRpbWVTdGFnZUlkKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRydW5jYXRlZEJ5RGVwdGggPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gRGF0YSBlZGdlczogZm9yIGVhY2gga2V5IHJlYWQsIGZpbmQgd2hvIHdyb3RlIGl0XG4gICAgY29uc3Qga2V5c1JlYWQgPSBnZXRLZXlzUmVhZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzUmVhZCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gZmluZFdyaXRlcihrZXksIGNvbW1pdElkeCk7XG4gICAgICBpZiAoIXdyaXRlcikgY29udGludWU7XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHdyaXRlciwgJ2RhdGEnLCBrZXksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvLyBDb250cm9sIGVkZ2UgKFJGQy0wMDMgRDMpOiBsaW5rIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciwgbGFiZWxlZCBieSB0aGVcbiAgICAvLyBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudC4gVGhlIGRlY2lkZXIgbm9kZSB0aGVuIGV4cGFuZHNcbiAgICAvLyBub3JtYWxseSB0aHJvdWdoIGl0cyBvd24gZGF0YSByZWFkcyAoYW5kIGl0cyBvd24gY29udHJvbCBwYXJlbnQpLlxuICAgIGlmIChjb250cm9sRGVwcykge1xuICAgICAgY29uc3QgZGVwID0gY29udHJvbERlcHMobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAoZGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2lkZXJJZHggPSBpZHhNYXAuZ2V0KGRlcC5kZWNpZGVySWQpO1xuICAgICAgICBpZiAoZGVjaWRlcklkeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGlua1BhcmVudChub2RlLCBjb21taXRMb2dbZGVjaWRlcklkeF0sICdjb250cm9sJywgZGVwLmxhYmVsLCBkZXB0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkgb24gdGhlIHJvb3QgKGFic2VudCB3aGVuIGNvbXBsZXRlKS5cbiAgaWYgKHRydW5jYXRlZEJ5RGVwdGggfHwgdHJ1bmNhdGVkQnlOb2Rlcykge1xuICAgIHJvb3QudHJ1bmNhdGVkID0geyBieURlcHRoOiB0cnVuY2F0ZWRCeURlcHRoLCBieU5vZGVzOiB0cnVuY2F0ZWRCeU5vZGVzIH07XG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gY2F1c2FsQ2hhaW4oJyR7c3RhcnRJZH0nKSB0cnVuY2F0ZWQgYnkgYCArXG4gICAgICAgICAgYCR7W3RydW5jYXRlZEJ5RGVwdGggJiYgYG1heERlcHRoICgke21heERlcHRofSlgLCB0cnVuY2F0ZWRCeU5vZGVzICYmIGBtYXhOb2RlcyAoJHttYXhOb2Rlc30pYF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKCcgKyAnKX0g4oCUIHRoZSBzbGljZSBpcyBpbmNvbXBsZXRlLiBSYWlzZSB0aGUgbGltaXRzIG9yIG5hcnJvdyBrZXlzUmVhZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcm9vdDtcbn1cblxuLy8g4pSA4pSAIFV0aWxpdGllcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBGbGF0dGVuIHRoZSBjYXVzYWwgREFHIGludG8gYSBCRlMtb3JkZXJlZCBsaXN0IG9mIG5vZGVzLlxuICogRWFjaCBub2RlIGFwcGVhcnMgZXhhY3RseSBvbmNlIChmaXJzdCBvY2N1cnJlbmNlIGJ5IEJGUyBvcmRlcikuXG4gKiBVc2VmdWwgZm9yIGxpbmVhciBkaXNwbGF5IG9yIGl0ZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5DYXVzYWxEQUcocm9vdDogQ2F1c2FsTm9kZSk6IENhdXNhbE5vZGVbXSB7XG4gIGNvbnN0IHJlc3VsdDogQ2F1c2FsTm9kZVtdID0gW107XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgcXVldWU6IENhdXNhbE5vZGVbXSA9IFtyb290XTtcblxuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5vZGUgPSBxdWV1ZS5zaGlmdCgpITtcbiAgICBpZiAodmlzaXRlZC5oYXMobm9kZS5ydW50aW1lU3RhZ2VJZCkpIGNvbnRpbnVlO1xuICAgIHZpc2l0ZWQuYWRkKG5vZGUucnVudGltZVN0YWdlSWQpO1xuICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xuXG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2Ygbm9kZS5wYXJlbnRzKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKHBhcmVudC5ydW50aW1lU3RhZ2VJZCkpIHtcbiAgICAgICAgcXVldWUucHVzaChwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRm9ybWF0IGEgY2F1c2FsIERBRyBhcyBodW1hbi1yZWFkYWJsZSBpbmRlbnRlZCB0ZXh0LlxuICogU2hvd3MgdGhlIGRlcGVuZGVuY3kgY2hhaW4gd2l0aCBkZXB0aCBpbmRlbnRhdGlvbiBhbmQgbGlua2VkLWJ5IGtleXMuXG4gKlxuICogUkZDLTAwMyBEMjogbm9kZXMgdGhhdCBjb25zdW1lZCB1bnRyYWNrZWQgcmVhZCBwYXRocyByZW5kZXIgYW4gZXh0cmFcbiAqIGDimqAgYWxzbyBjb25zdW1lZCDigKYg4oCUIHNsaWNlIG1heSBiZSBpbmNvbXBsZXRlIGhlcmVgIGxpbmUsIHNvIGEgY29uc3VtZXJcbiAqIChodW1hbiBvciBMTE0pIGRlYnVnZ2luZyBmcm9tIHRoZSBzbGljZSBpcyBUT0xEIHdoZW4gaXQgaXMgaW5jb21wbGV0ZS5cbiAqXG4gKiBSRkMtMDAzIEQzOiBjb250cm9sIGVkZ2VzIHJlbmRlciBhcyBg4oaQIFtjb250cm9sOiA8cnVsZSBsYWJlbD5dYFxuICogKGxhYmVsIG9taXR0ZWQgd2hlbiB0aGUgZGVjaXNpb24gY2FycmllZCBub25lKS4gRGF0YSByZW5kZXJpbmcgaXNcbiAqIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBwcmUtRDMgb3V0cHV0IOKAlCBg4oaQIHZpYSA8a2V5PmAgZnJvbSB0aGUgbm9kZSdzXG4gKiBkaXNjb3ZlcnktdGltZSBgbGlua2VkQnlgLlxuICpcbiAqIFJGQy0wMDMgRDQ6IGVkZ2Ugd2VpZ2h0cyBmcm9tIHRoZSBgd2VpZ2hgIGhvb2sgcmVuZGVyIGFzIGEgc3VmZml4IOKAlFxuICogYOKGkCB2aWEgc3lzdGVtUHJvbXB0ICgwLjE4KWAg4oCUIG9ubHkgd2hlbiDiiaAgMS4wLCBzbyB1bndlaWdodGVkIG91dHB1dCBpc1xuICogdW5jaGFuZ2VkLiBBIHRydW5jYXRlZCBzbGljZSAocm9vdC50cnVuY2F0ZWQpIGFwcGVuZHMgYSBmaW5hbFxuICogYOKaoCBzbGljZSB0cnVuY2F0ZWQg4oCmYCBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Q2F1c2FsQ2hhaW4ocm9vdDogQ2F1c2FsTm9kZSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3Qgd2VpZ2h0U3VmZml4ID0gKGVkZ2U6IENhdXNhbEVkZ2UgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT5cbiAgICBlZGdlICE9PSB1bmRlZmluZWQgJiYgZWRnZS53ZWlnaHQgIT09IDEgPyBgICgke2VkZ2Uud2VpZ2h0fSlgIDogJyc7XG5cbiAgZnVuY3Rpb24gd2Fsayhub2RlOiBDYXVzYWxOb2RlLCBpbmRlbnQ6IG51bWJlciwgZWRnZXNGcm9tQ2hpbGQ/OiBDYXVzYWxFZGdlW10pOiB2b2lkIHtcbiAgICBpZiAodmlzaXRlZC5oYXMobm9kZS5ydW50aW1lU3RhZ2VJZCkpIHtcbiAgICAgIGxpbmVzLnB1c2goYCR7JyAgJy5yZXBlYXQoaW5kZW50KX3ihrMgJHtub2RlLnJ1bnRpbWVTdGFnZUlkfSAoc2VlIGFib3ZlKWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2aXNpdGVkLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcblxuICAgIGNvbnN0IGxpbmtQYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAobm9kZS5saW5rZWRCeSkge1xuICAgICAgY29uc3QgZGF0YUVkZ2UgPSBlZGdlc0Zyb21DaGlsZD8uZmluZCgoZSkgPT4gZS5raW5kID09PSAnZGF0YScpO1xuICAgICAgbGlua1BhcnRzLnB1c2goYHZpYSAke25vZGUubGlua2VkQnl9JHt3ZWlnaHRTdWZmaXgoZGF0YUVkZ2UpfWApO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sRWRnZSA9IGVkZ2VzRnJvbUNoaWxkPy5maW5kKChlKSA9PiBlLmtpbmQgPT09ICdjb250cm9sJyk7XG4gICAgaWYgKGNvbnRyb2xFZGdlKSB7XG4gICAgICBsaW5rUGFydHMucHVzaChgW2NvbnRyb2wke2NvbnRyb2xFZGdlLmtleSA/IGA6ICR7Y29udHJvbEVkZ2Uua2V5fWAgOiAnJ31dJHt3ZWlnaHRTdWZmaXgoY29udHJvbEVkZ2UpfWApO1xuICAgIH1cbiAgICBjb25zdCBsaW5rID0gbGlua1BhcnRzLmxlbmd0aCA+IDAgPyBgIOKGkCAke2xpbmtQYXJ0cy5qb2luKCcg4oaQICcpfWAgOiAnJztcblxuICAgIGNvbnN0IHdyaXRlcyA9IG5vZGUua2V5c1dyaXR0ZW4ubGVuZ3RoID4gMCA/IGAgW3dyb3RlOiAke25vZGUua2V5c1dyaXR0ZW4uam9pbignLCAnKX1dYCA6ICcnO1xuICAgIGxpbmVzLnB1c2goYCR7JyAgJy5yZXBlYXQoaW5kZW50KX0ke25vZGUuc3RhZ2VOYW1lfSAoJHtub2RlLnJ1bnRpbWVTdGFnZUlkfSkke2xpbmt9JHt3cml0ZXN9YCk7XG5cbiAgICBpZiAobm9kZS5pbmNvbXBsZXRlU291cmNlcyAmJiBub2RlLmluY29tcGxldGVTb3VyY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIGAkeycgICcucmVwZWF0KGluZGVudCArIDEpfeKaoCBhbHNvIGNvbnN1bWVkICR7bm9kZS5pbmNvbXBsZXRlU291cmNlcy5qb2luKCcvJyl9IOKAlCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2Ygbm9kZS5wYXJlbnRzKSB7XG4gICAgICB3YWxrKFxuICAgICAgICBwYXJlbnQsXG4gICAgICAgIGluZGVudCArIDEsXG4gICAgICAgIG5vZGUucGFyZW50RWRnZXMuZmlsdGVyKChlKSA9PiBlLnBhcmVudCA9PT0gcGFyZW50KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgd2Fsayhyb290LCAwKTtcblxuICBpZiAocm9vdC50cnVuY2F0ZWQpIHtcbiAgICBjb25zdCBjYXVzZXMgPSBbcm9vdC50cnVuY2F0ZWQuYnlEZXB0aCAmJiAnbWF4RGVwdGggcmVhY2hlZCcsIHJvb3QudHJ1bmNhdGVkLmJ5Tm9kZXMgJiYgJ21heE5vZGVzIHJlYWNoZWQnXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oJywgJyk7XG4gICAgbGluZXMucHVzaChg4pqgIHNsaWNlIHRydW5jYXRlZCAoJHtjYXVzZXN9KSDigJQgb2xkZXIgY2F1c2VzIGV4aXN0IGJleW9uZCB0aGlzIGhvcml6b25gKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuLy8g4pSA4pSAIEV4cG9ydGVkIGZvciB0ZXN0aW5nIChpbnRlcm5hbCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBAaW50ZXJuYWwgRXhwb3NlZCBmb3IgdGVzdGluZyB0aGUgc3RyYXRlZ3kgc2VsZWN0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IF9SRVZFUlNFX0lOREVYX1RIUkVTSE9MRCA9IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEO1xuIl19
@@ -14,4 +14,4 @@ export { TransactionBuffer } from './TransactionBuffer.js';
14
14
  export { READ_PREVIEW_LENGTH, SUMMARY_PREVIEW_LENGTH } from './types.js';
15
15
  // Utilities
16
16
  export { applySmartMerge, deepSmartMerge, DELIM, getNestedValue, getRunAndGlobalPaths, normalisePath, redactPatch, setNestedValue, updateNestedValue, updateValue, } from './utils.js';
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwwQkFBMEI7QUFDMUI7Ozs7O0dBS0c7QUFFSCxVQUFVO0FBQ1YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBa0IzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekUsWUFBWTtBQUNaLE9BQU8sRUFDTCxlQUFlLEVBQ2YsY0FBYyxFQUNkLEtBQUssRUFDTCxjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixXQUFXLEdBQ1osTUFBTSxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuLyoqXG4gKiBtZW1vcnkvIOKAlCBGb3VuZGF0aW9uIGxpYnJhcnkgKHplcm8gZXh0ZXJuYWwgZGVwcylcbiAqXG4gKiBUcmFuc2FjdGlvbmFsIHN0YXRlIG1hbmFnZW1lbnQgd2l0aCBuYW1lc3BhY2UgaXNvbGF0aW9uLFxuICogYXRvbWljIGNvbW1pdHMsIGFuZCBldmVudC1zb3VyY2VkIHRpbWUtdHJhdmVsLlxuICovXG5cbi8vIENsYXNzZXNcbmV4cG9ydCB7IERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuZXhwb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL0V2ZW50TG9nLmpzJztcbmV4cG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmV4cG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4vU3RhZ2VDb250ZXh0LmpzJztcbmV4cG9ydCB7IFRyYW5zYWN0aW9uQnVmZmVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkJ1ZmZlci5qcyc7XG5cbi8vIFR5cGVzXG5leHBvcnQgdHlwZSB7XG4gIENvbW1pdEJ1bmRsZSxcbiAgQ29tbWl0VmFsdWVzTW9kZSxcbiAgRmxvd0NvbnRyb2xUeXBlLFxuICBGbG93TWVzc2FnZSxcbiAgTWVtb3J5UGF0Y2gsXG4gIFJlYWRTdW1tYXJ5TWFya2VyLFxuICBSZWFkVHJhY2tpbmdNb2RlLFxuICBSZXRlbnRpb25Qb2xpY3ksXG4gIFNjb3BlRmFjdG9yeSxcbiAgU3RhZ2VTbmFwc2hvdCxcbiAgVHJhY2VFbnRyeSxcbiAgV3JpdGVTdW1tYXJ5TWFya2VyLFxuICBXcml0ZVRyYWNraW5nTW9kZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5leHBvcnQgeyBSRUFEX1BSRVZJRVdfTEVOR1RILCBTVU1NQVJZX1BSRVZJRVdfTEVOR1RIIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIFV0aWxpdGllc1xuZXhwb3J0IHtcbiAgYXBwbHlTbWFydE1lcmdlLFxuICBkZWVwU21hcnRNZXJnZSxcbiAgREVMSU0sXG4gIGdldE5lc3RlZFZhbHVlLFxuICBnZXRSdW5BbmRHbG9iYWxQYXRocyxcbiAgbm9ybWFsaXNlUGF0aCxcbiAgcmVkYWN0UGF0Y2gsXG4gIHNldE5lc3RlZFZhbHVlLFxuICB1cGRhdGVOZXN0ZWRWYWx1ZSxcbiAgdXBkYXRlVmFsdWUsXG59IGZyb20gJy4vdXRpbHMuanMnO1xuIl19
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwwQkFBMEI7QUFDMUI7Ozs7O0dBS0c7QUFFSCxVQUFVO0FBQ1YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBbUIzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekUsWUFBWTtBQUNaLE9BQU8sRUFDTCxlQUFlLEVBQ2YsY0FBYyxFQUNkLEtBQUssRUFDTCxjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixXQUFXLEdBQ1osTUFBTSxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuLyoqXG4gKiBtZW1vcnkvIOKAlCBGb3VuZGF0aW9uIGxpYnJhcnkgKHplcm8gZXh0ZXJuYWwgZGVwcylcbiAqXG4gKiBUcmFuc2FjdGlvbmFsIHN0YXRlIG1hbmFnZW1lbnQgd2l0aCBuYW1lc3BhY2UgaXNvbGF0aW9uLFxuICogYXRvbWljIGNvbW1pdHMsIGFuZCBldmVudC1zb3VyY2VkIHRpbWUtdHJhdmVsLlxuICovXG5cbi8vIENsYXNzZXNcbmV4cG9ydCB7IERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuZXhwb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL0V2ZW50TG9nLmpzJztcbmV4cG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmV4cG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4vU3RhZ2VDb250ZXh0LmpzJztcbmV4cG9ydCB7IFRyYW5zYWN0aW9uQnVmZmVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkJ1ZmZlci5qcyc7XG5cbi8vIFR5cGVzXG5leHBvcnQgdHlwZSB7XG4gIENvbW1pdEJ1bmRsZSxcbiAgQ29tbWl0VmFsdWVzTW9kZSxcbiAgRmxvd0NvbnRyb2xUeXBlLFxuICBGbG93TWVzc2FnZSxcbiAgTWVtb3J5UGF0Y2gsXG4gIFJlYWRTdW1tYXJ5TWFya2VyLFxuICBSZWFkVHJhY2tpbmdNb2RlLFxuICBSZXRlbnRpb25Qb2xpY3ksXG4gIFNjb3BlRmFjdG9yeSxcbiAgU3RhZ2VTbmFwc2hvdCxcbiAgVHJhY2VFbnRyeSxcbiAgVW50cmFja2VkU291cmNlLFxuICBXcml0ZVN1bW1hcnlNYXJrZXIsXG4gIFdyaXRlVHJhY2tpbmdNb2RlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCB7IFJFQURfUFJFVklFV19MRU5HVEgsIFNVTU1BUllfUFJFVklFV19MRU5HVEggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8gVXRpbGl0aWVzXG5leHBvcnQge1xuICBhcHBseVNtYXJ0TWVyZ2UsXG4gIGRlZXBTbWFydE1lcmdlLFxuICBERUxJTSxcbiAgZ2V0TmVzdGVkVmFsdWUsXG4gIGdldFJ1bkFuZEdsb2JhbFBhdGhzLFxuICBub3JtYWxpc2VQYXRoLFxuICByZWRhY3RQYXRjaCxcbiAgc2V0TmVzdGVkVmFsdWUsXG4gIHVwZGF0ZU5lc3RlZFZhbHVlLFxuICB1cGRhdGVWYWx1ZSxcbn0gZnJvbSAnLi91dGlscy5qcyc7XG4iXX0=
@@ -8,4 +8,4 @@
8
8
  * implementation).
9
9
  */
10
10
  export { READ_PREVIEW_LENGTH, SUMMARY_PREVIEW_LENGTH } from '../capture/summarize.js';
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQWdGSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdHlwZXMudHMg4oCUIENvcmUgdHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIG1lbW9yeSBsaWJyYXJ5XG4gKlxuICogWmVybyBkZXBlbmRlbmNpZXMgb24gb2xkIGNvZGUgb3Igb3RoZXIgbGlicmFyaWVzIGluIHRoaXMgcGFja2FnZSwgd2l0aCBvbmVcbiAqIGRlbGliZXJhdGUgZXhjZXB0aW9uOiBgY2FwdHVyZS9gIOKAlCB0aGUgc3RhbmRhbG9uZSBsZWFmIG1vZHVsZSBob2xkaW5nIHRoZVxuICogc2hhcmVkIHJldGVudGlvbi1wb2xpY3kgZmFtaWx5IGFuZCBzdW1tYXJ5LW1hcmtlciBidWlsZGVycyAoZXh0cmFjdGVkIGZyb21cbiAqIGhlcmUgaW4gIzEzYy1BIHNvIHRoZSByZWFkIGFuZCB3cml0ZSBkaWFscywgYW5kIGxhdGVyIFJGQy0wMDEsIHNoYXJlIG9uZVxuICogaW1wbGVtZW50YXRpb24pLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5IH0gZnJvbSAnLi4vY2FwdHVyZS9wb2xpY2llcy5qcyc7XG5cbi8vIOKUgOKUgCBQYXRjaCAmIFRyYWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQSBmbGF0IGtleS12YWx1ZSBiYWcgcmVwcmVzZW50aW5nIGEgc3RhdGUgcGF0Y2ggKG92ZXJ3cml0ZSBvciBtZXJnZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVBhdGNoIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKiogQSBzaW5nbGUgZW50cnkgaW4gdGhlIGNocm9ub2xvZ2ljYWwgb3BlcmF0aW9uIHRyYWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFjZUVudHJ5IHtcbiAgLyoqIENhbm9uaWNhbCBwYXRoIHN0cmluZyAoc2VnbWVudHMgam9pbmVkIGJ5IERFTElNKS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogLSBgJ3NldCdgICAgIOKAlCBoYXJkIG92ZXJ3cml0ZTsgYG92ZXJ3cml0ZVtwYXRoXWAgaG9sZHMgdGhlIGZ1bGwgZmluYWwgdmFsdWUuXG4gICAqIC0gYCdtZXJnZSdgICDigJQgZGVlcCB1bmlvbiBtZXJnZTsgYHVwZGF0ZXNbcGF0aF1gIGhvbGRzIHRoZSBhY2N1bXVsYXRlZCBkZWx0YS5cbiAgICogLSBgJ2FwcGVuZCdgIOKAlCAoIzEzYy1CLCBwcm9kdWNlZCBvbmx5IHVuZGVyIHtAbGluayBDb21taXRWYWx1ZXNNb2RlfVxuICAgKiAgIGAnZGVsdGEnYCkgdGhlIHBhdGgncyBmaW5hbCB2YWx1ZSBpcyBpdHMgYmFzZSB2YWx1ZSBwbHVzIGEgdGFpbCBvZiBuZXdcbiAgICogICB0cmFpbGluZyBlbGVtZW50czsgYG92ZXJ3cml0ZVtwYXRoXWAgaG9sZHMgT05MWSB0aGUgdGFpbC4gUmVwbGF5XG4gICAqICAgcmVjb25zdHJ1Y3RzIGJ5IGNvbmNhdGVuYXRpb24uIE5PVCBpZGVtcG90ZW50IOKAlCBkZWx0YS1tb2RlIGJ1bmRsZXNcbiAgICogICBjYXJyeSBleGFjdGx5IG9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGguXG4gICAqIC0gYCdkZWxldGUnYCDigJQgKCMxM2MtQiwgcHJvZHVjZWQgb25seSB1bmRlciBgJ2RlbHRhJ2A7IGFic29yYnMgYmFja2xvZ1xuICAgKiAgIEI4KSB0aGUga2V5IHdhcyBleHBsaWNpdGx5IHJlbW92ZWQgdmlhIGBkZWxldGVWYWx1ZSgpYC4gUmVwbGF5IHJlbW92ZXNcbiAgICogICB0aGUga2V5LiBgb3ZlcndyaXRlW3BhdGhdYCBzdGlsbCBFTlVNRVJBVEVTIHRoZSBwYXRoICh2YWx1ZVxuICAgKiAgIGB1bmRlZmluZWRgKSBzbyBrZXktc2V0IGNvbnN1bWVycyBrZWVwIHNlZWluZyB0aGUgY2hhbmdlZCBrZXkuXG4gICAqXG4gICAqIGBvdmVyd3JpdGVgIHZhbHVlcyBhcmUgdGhlcmVmb3JlIFZFUkItUVVBTElGSUVEOiBjb25zdW1lcnMgdGhhdCByZWFkXG4gICAqIGBidW5kbGUub3ZlcndyaXRlW2tleV1gIGFzIFwidGhlIGZ1bGwgdmFsdWUgd3JpdHRlblwiIG11c3QgdXNlXG4gICAqIGBjb21taXRWYWx1ZUF0KGNvbW1pdExvZywgaWR4LCBrZXkpYCAoZnJvbSBgZm9vdHByaW50anMvdHJhY2VgKSB3aGVuIHRoZVxuICAgKiBsb2cgbWF5IGNvbnRhaW4gZGVsdGEtbW9kZSBidW5kbGVzLlxuICAgKi9cbiAgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIHwgJ2FwcGVuZCcgfCAnZGVsZXRlJztcbn1cblxuLyoqIFRoZSBhdG9taWMgYnVuZGxlIHByb2R1Y2VkIGJ5IFRyYW5zYWN0aW9uQnVmZmVyLmNvbW1pdCgpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21taXRCdW5kbGUge1xuICAvKiogQXV0by1hc3NpZ25lZCBzdGVwIGluZGV4IChzZXQgYnkgRXZlbnRMb2cucmVjb3JkKS4gKi9cbiAgaWR4PzogbnVtYmVyO1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgc3RhZ2U6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllci4gRm9ybWF0OiBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXggKi9cbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIENocm9ub2xvZ2ljYWwgd3JpdGUgbG9nIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheS4gKi9cbiAgdHJhY2U6IFRyYWNlRW50cnlbXTtcbiAgLyoqIFBhdGhzIHRoYXQgc2hvdWxkIGJlIHJlZGFjdGVkIGluIFVJIChzZW5zaXRpdmUgZGF0YSkuICovXG4gIHJlZGFjdGVkUGF0aHM6IHN0cmluZ1tdO1xuICAvKiogSGFyZCBvdmVyd3JpdGUgcGF0Y2hlcy4gKi9cbiAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgLyoqIERlZXAgbWVyZ2UgcGF0Y2hlcy4gKi9cbiAgdXBkYXRlczogTWVtb3J5UGF0Y2g7XG59XG5cbi8vIOKUgOKUgCBGbG93IENvbnRyb2wgTmFycmF0aXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogVHlwZXMgb2YgY29udHJvbCBmbG93IGRlY2lzaW9ucyBjYXB0dXJlZCBieSB0aGUgZXhlY3V0aW9uIGVuZ2luZS4gKi9cbmV4cG9ydCB0eXBlIEZsb3dDb250cm9sVHlwZSA9ICduZXh0JyB8ICdicmFuY2gnIHwgJ2NoaWxkcmVuJyB8ICdzZWxlY3RlZCcgfCAnc3ViZmxvdycgfCAnbG9vcCc7XG5cbi8qKiBBIHNpbmdsZSBmbG93IGNvbnRyb2wgbmFycmF0aXZlIGVudHJ5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93TWVzc2FnZSB7XG4gIHR5cGU6IEZsb3dDb250cm9sVHlwZTtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgcmF0aW9uYWxlPzogc3RyaW5nO1xuICBjb3VudD86IG51bWJlcjtcbiAgaXRlcmF0aW9uPzogbnVtYmVyO1xuICB0aW1lc3RhbXA/OiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgCBSZWFkIC8gV3JpdGUgVHJhY2tpbmcgKCMxNCwgIzEzYy1BKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vXG4vLyBUaGUgcG9saWN5IGZhbWlseSBhbmQgbWFya2VyIHNoYXBlcyBhcmUgb3duZWQgYnkgYGNhcHR1cmUvYCAoc2hhcmVkIHdpdGhcbi8vIHRoZSB3cml0ZSBkaWFsIGFuZCwgbGF0ZXIsIFJGQy0wMDEncyBkZWZlcnJlZC1vYnNlcnZlciBjYXB0dXJlIHRpZXIpLlxuLy8gUmUtZXhwb3J0ZWQgaGVyZSBzbyBldmVyeSBwcmUtZXh0cmFjdGlvbiBpbXBvcnQgcGF0aCBrZWVwcyB3b3JraW5nLlxuXG5leHBvcnQgdHlwZSB7IFJldGVudGlvblBvbGljeSB9IGZyb20gJy4uL2NhcHR1cmUvcG9saWNpZXMuanMnO1xuZXhwb3J0IHR5cGUgeyBSZWFkU3VtbWFyeU1hcmtlciwgV3JpdGVTdW1tYXJ5TWFya2VyIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuZXhwb3J0IHsgUkVBRF9QUkVWSUVXX0xFTkdUSCwgU1VNTUFSWV9QUkVWSUVXX0xFTkdUSCB9IGZyb20gJy4uL2NhcHR1cmUvc3VtbWFyaXplLmpzJztcblxuLyoqXG4gKiBQb2xpY3kgZm9yIGhvdyB0cmFja2VkIHJlYWRzIGFyZSByZWNvcmRlZCBpbnRvIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgLlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSB0cmFja2VkIHJlYWQgYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSB2YWx1ZSBpbnRvXG4gKiAgIHRoZSBzdGFnZSdzIHJlYWQgdmlldy4gQnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgYmVoYXZpb3I7IHRoaXMgaXNcbiAqICAgd2hhdCBzbmFwc2hvdCBjb25zdW1lcnMgKGxlbnMsIGFnZW50Zm9vdHByaW50KSBzZWUgdG9kYXkuXG4gKiAtIGAnc3VtbWFyeSdgIOKAlCByZWFkcyByZWNvcmQgYSBjaGVhcCB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9ICh0eXBlICsgc2l6ZVxuICogICBwcm94eSArIHNob3J0IHByZXZpZXcpIGluc3RlYWQgb2YgdGhlIGNsb25lZCB2YWx1ZS4gTygxKS1pc2ggcGVyIHJlYWQg4oCUXG4gKiAgIG5vIHZhbHVlIGNsb25lLCBubyBzZXJpYWxpemF0aW9uIG9mIGxhcmdlIG9iamVjdHMuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHJlYWRzIGFyZSBub3QgcmVjb3JkZWQgYXQgYWxsOyBgc3RhZ2VSZWFkc2AgaXMgYWJzZW50IGZyb20gdGhlXG4gKiAgIHNuYXBzaG90LiBaZXJvIHBlci1yZWFkIGNvc3QuIFZhbHVlcyBhcmUgc3RpbGwgcmVhZGFibGUsIGFuZCB0aGVcbiAqICAgYFNjb3BlUmVjb3JkZXIub25SZWFkYCBldmVudCBzdGlsbCBmaXJlcyAoaXQgcGFzc2VzIHRoZSBsaXZlIHJlZmVyZW5jZSBhbmRcbiAqICAgbmV2ZXIgY2xvbmVkKSDigJQgc28gbmFycmF0aXZlIG91dHB1dCBpcyBpZGVudGljYWwgaW4gZXZlcnkgbW9kZS4gVGhlIHBvbGljeVxuICogICBzY29wZXMgT05MWSB0aGUgc25hcHNob3QncyBgc3RhZ2VSZWFkc2AgcGF5bG9hZC5cbiAqXG4gKiBTZXQgdmlhIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgcmVhZFRyYWNraW5nIH0pYCBvclxuICogYGV4ZWN1dG9yLnNldFJlYWRUcmFja2luZyhtb2RlKWAgKGJlZm9yZSBgcnVuKClgKS5cbiAqXG4gKiBBbGlhcyBvZiB0aGUgc2hhcmVkIHtAbGluayBSZXRlbnRpb25Qb2xpY3l9IGZhbWlseSAoIzEzYy1BKSDigJQga2VwdCBhcyB0aGVcbiAqIHNoaXBwZWQgcHVibGljIG5hbWUgZm9yIHRoZSByZWFkIGRpYWwuXG4gKi9cbmV4cG9ydCB0eXBlIFJlYWRUcmFja2luZ01vZGUgPSBSZXRlbnRpb25Qb2xpY3k7XG5cbi8qKlxuICogUG9saWN5IGZvciBob3cgdHJhY2tlZCB3cml0ZXMgYXJlIHJlY29yZGVkIGludG8gYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgXG4gKiAoIzEzYy1BKSDigJQgdGhlIHNpYmxpbmcgb2Yge0BsaW5rIFJlYWRUcmFja2luZ01vZGV9LlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSB0cmFja2VkIHdyaXRlIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50b1xuICogICB0aGUgc3RhZ2UncyB3cml0ZSB2aWV3LiBCeXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBiZWhhdmlvci5cbiAqIC0gYCdzdW1tYXJ5J2Ag4oCUIHdyaXRlcyByZWNvcmQgYSBjaGVhcCB7QGxpbmsgV3JpdGVTdW1tYXJ5TWFya2VyfSBpbnN0ZWFkIG9mXG4gKiAgIHRoZSBjbG9uZWQgdmFsdWUuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHdyaXRlcyBhcmUgbm90IHJlY29yZGVkIGF0IGFsbDsgYHN0YWdlV3JpdGVzYCBpcyBhYnNlbnQgZnJvbSB0aGVcbiAqICAgc25hcHNob3QuIFRoZSB3cml0ZXMgdGhlbXNlbHZlcyBzdGlsbCBjb21taXQgdG8gc2hhcmVkIHN0YXRlIGFuZCBzdGlsbFxuICogICBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cg4oCUIG9ubHkgdGhlIHBlci1zdGFnZSBzbmFwc2hvdCBib29ra2VlcGluZyAoYW5kXG4gKiAgIHRoZXJlZm9yZSB0aGUgY29tbWl0IG9ic2VydmVyJ3MgbXV0YXRpb25zIHBheWxvYWQpIGlzIGFmZmVjdGVkLiAoVGhlXG4gKiAgIGNvbW1pdCBsb2cncyBvd24gdmFsdWUgZW5jb2RpbmcgaGFzIGl0cyBvd24gbG9zc2xlc3MgZGlhbCDigJRcbiAqICAge0BsaW5rIENvbW1pdFZhbHVlc01vZGV9LCAjMTNjLUIuKVxuICpcbiAqIFNldCB2aWEgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyB3cml0ZVRyYWNraW5nIH0pYCBvclxuICogYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIChiZWZvcmUgYHJ1bigpYCkuIFNlZVxuICogYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy53cml0ZVRyYWNraW5nYCBmb3IgdGhlIGZ1bGwgb2JzZXJ2YWJsZS1jb25zZXF1ZW5jZVxuICogY29udHJhY3QgKG9uQ29tbWl0IHBheWxvYWQsIHJlZGFjdGlvbiBwcmVjZWRlbmNlLCB3aGF0IGlzIE9VVCBvZiBzY29wZSkuXG4gKi9cbmV4cG9ydCB0eXBlIFdyaXRlVHJhY2tpbmdNb2RlID0gUmV0ZW50aW9uUG9saWN5O1xuXG4vKipcbiAqIFBvbGljeSBmb3IgaG93IGNvbW1pdC1idW5kbGUgVkFMVUVTIGFyZSBlbmNvZGVkIGludG8gdGhlIGNvbW1pdCBsb2dcbiAqICgjMTNjLUIpIOKAlCBjb21wbGV0ZXMgdGhlIGByZWFkVHJhY2tpbmdgL2B3cml0ZVRyYWNraW5nYCBkaWFsIGZhbWlseS5cbiAqIFVubGlrZSB0aG9zZSB0d28gKHdoaWNoIGdhdGUgbG9zc3kgc25hcHNob3QgYm9va2tlZXBpbmcpLCB0aGlzIGRpYWwgaXNcbiAqICoqbG9zc2xlc3MgaW4gYm90aCBtb2RlcyoqIOKAlCBpdCBjaGFuZ2VzIHRoZSBjb21taXQgbG9nJ3MgKmVuY29kaW5nKixcbiAqIG5ldmVyIGl0cyAqaW5mb3JtYXRpb24qOyBhbnkgc3RlcCdzIGZ1bGwgc3RhdGUgc3RheXMgZXhhY3RseVxuICogcmVjb25zdHJ1Y3RhYmxlIGJ5IHJlcGxheS5cbiAqXG4gKiAtIGAnZnVsbCdgIChkZWZhdWx0KSDigJQgZXZlcnkgc3Vydml2aW5nIGBzZXRgIHBhdGggc3RvcmVzIHRoZSBmdWxsIGZpbmFsXG4gKiAgIHZhbHVlLCBvbmUgdHJhY2UgZW50cnkgcGVyIG9wZXJhdGlvbi4gQnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWxcbiAqICAgYmVoYXZpb3IuXG4gKiAtIGAnZGVsdGEnYCDigJQgdHdvIGNoYW5nZXMsIGJvdGggcmVwbGF5LWNvdmVyZWQgYnkgYGFwcGx5U21hcnRNZXJnZWA6XG4gKiAgIDEuICoqYGFwcGVuZGAgZGV0ZWN0aW9uKio6IHdoZW4gYSBwYXRoJ3MgbmV0IGNoYW5nZSBpcyBcInRoZSBiYXNlIGFycmF5XG4gKiAgICAgIHBsdXMgbmV3IHRyYWlsaW5nIGVsZW1lbnRzXCIgKHN0cmljdCBwcmVmaXgpLCB0aGUgYnVuZGxlIHJlY29yZHMgT05MWVxuICogICAgICB0aGUgdGFpbCB1bmRlciBhIGB2ZXJiOiAnYXBwZW5kJ2AgdHJhY2UgZW50cnkg4oCUIHRoZSBncm93aW5nLWhpc3RvcnlcbiAqICAgICAgY29tbWl0IGxvZyBiZWNvbWVzIGxpbmVhciBpbiB0YWlsIHNpemUgaW5zdGVhZCBvZiBPKE7CsikgcmV0YWluZWQuXG4gKiAgICAgIEEgcmVhbCBgdmVyYjogJ2RlbGV0ZSdgIGVudHJ5IHJlcGxhY2VzIHRoZSBgc2V0OiB1bmRlZmluZWRgIGZsYXR0ZW5pbmdcbiAqICAgICAgZm9yIGBkZWxldGVWYWx1ZSgpYCAoY2xvc2VzIHRoZSBkb2N1bWVudGVkIE1lbW9yeVBhdGNoIGxpbWl0YXRpb24pLlxuICogICAyLiAqKk9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGgqKiAoYXBwZW5kIGlzIG5vdCBpZGVtcG90ZW50IG9uXG4gKiAgICAgIHJlcGxheSk6IHRoZSB2ZXJiIGlzIHJlc29sdmVkIGZyb20gdGhlIHBhdGgncyBiYXNl4oaSZmluYWwgcmVsYXRpb25zaGlwXG4gKiAgICAgIGFuZCBvcCBtaXg7IGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgZWFjaCBwYXRoJ3MgTEFTVCB0b3VjaC5cbiAqXG4gKiBIb25lc3QgY29zdCBub3RlOiBhcHBlbmQgZGV0ZWN0aW9uIGlzIE5FVyB3YWxsIHdvcmsg4oCUIGFuIE8ofGJhc2V8KVxuICogc3RydWN0dXJhbCBwcmVmaXggY29tcGFyZSBwZXIgYXJyYXktc2V0IHBhdGggcGVyIGNvbW1pdCAodG9kYXknc1xuICogYGRlZXBFcXVhbGAgZmFzdC1mYWlscyBvbiBsZW5ndGggaW4gTygxKSBmb3IgYSBncm93biBhcnJheSkuIE9uIGEgaGl0IHRoZVxuICogY29tbWl0IGdldHMgY2hlYXBlciBpbiBib3RoIHdhbGwgYW5kIGhlYXAgKHRoZSBPKHxmaW5hbHwpIGNsb25lIHNocmlua3MgdG9cbiAqIE8ofHRhaWx8KSk7IG9uIGEgbWlzcyBpdCBwYXlzIGNvbXBhcmUgKyBmdWxsIGNsb25lLiBgJ2Z1bGwnYCBwYXlzIHplcm8g4oCUXG4gKiB0aGUgZGV0ZWN0aW9uIGJyYW5jaCBpcyBtb2RlLWdhdGVkLlxuICpcbiAqIFNldCB2aWEgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBjb21taXRWYWx1ZXMgfSlgIG9yXG4gKiBgZXhlY3V0b3Iuc2V0Q29tbWl0VmFsdWVzKG1vZGUpYCAoYmVmb3JlIGBydW4oKWApLiBUaGUgYWN0aXZlIG1vZGUgaXNcbiAqIHN1cmZhY2VkIGFzIHRoZSBzbmFwc2hvdCBkaXNjcmltaW5hbnQgYFJ1bnRpbWVTbmFwc2hvdC5jb21taXRWYWx1ZXNgLlxuICovXG5leHBvcnQgdHlwZSBDb21taXRWYWx1ZXNNb2RlID0gJ2Z1bGwnIHwgJ2RlbHRhJztcblxuLy8g4pSA4pSAIFN0YWdlIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogU2VyaWFsaXNhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RhZ2UncyBzdGF0ZSAoZm9yIGRlYnVnZ2luZyAvIHZpc3VhbGlzYXRpb24pLiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VTbmFwc2hvdCA9IHtcbiAgaWQ6IHN0cmluZztcbiAgLyoqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllci4gRm9ybWF0OiBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXggKi9cbiAgcnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgc3RhZ2UgZG9lcyAoZnJvbSBidWlsZGVyKS4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIg4oCUIHByZXNlbnQgd2hlbiB0aGlzIHN0YWdlIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludC4gKi9cbiAgc3ViZmxvd0lkPzogc3RyaW5nO1xuICBpc0RlY2lkZXI/OiBib29sZWFuO1xuICBpc0Zvcms/OiBib29sZWFuO1xuICAvKiogVXNlci1sZXZlbCB3cml0ZXMgbWFkZSBieSB0aGlzIHN0YWdlIChwcmUtbmFtZXNwYWNlIGtleXMg4oaSIHZhbHVlcykuXG4gICAqICBTaGFwZSBkZXBlbmRzIG9uIHtAbGluayBXcml0ZVRyYWNraW5nTW9kZX06IGNsb25lZCB2YWx1ZXMgdW5kZXIgYCdmdWxsJ2BcbiAgICogIChkZWZhdWx0KSwge0BsaW5rIFdyaXRlU3VtbWFyeU1hcmtlcn1zIHVuZGVyIGAnc3VtbWFyeSdgLCBhYnNlbnQgdW5kZXJcbiAgICogIGAnb2ZmJ2AuIFJlZGFjdGVkIHdyaXRlcyBzaG93IGAnW1JFREFDVEVEXSdgIHJlZ2FyZGxlc3Mgb2YgbW9kZS4gKi9cbiAgc3RhZ2VXcml0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFVzZXItbGV2ZWwgcmVhZHMgbWFkZSBieSB0aGlzIHN0YWdlIChwcmUtbmFtZXNwYWNlIGtleXMg4oaSIHZhbHVlcyBhdCByZWFkXG4gICAqICB0aW1lKS4gU2hhcGUgZGVwZW5kcyBvbiB7QGxpbmsgUmVhZFRyYWNraW5nTW9kZX06IGNsb25lZCB2YWx1ZXMgdW5kZXJcbiAgICogIGAnZnVsbCdgIChkZWZhdWx0KSwge0BsaW5rIFJlYWRTdW1tYXJ5TWFya2VyfXMgdW5kZXIgYCdzdW1tYXJ5J2AsIGFic2VudFxuICAgKiAgdW5kZXIgYCdvZmYnYC4gKi9cbiAgc3RhZ2VSZWFkcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBsb2dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbWV0cmljczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV2YWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZmxvd01lc3NhZ2VzPzogRmxvd01lc3NhZ2VbXTtcbiAgbmV4dD86IFN0YWdlU25hcHNob3Q7XG4gIGNoaWxkcmVuPzogU3RhZ2VTbmFwc2hvdFtdO1xufTtcblxuLy8g4pSA4pSAIFNjb3BlIEZhY3Rvcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBGb3J3YXJkLWRlY2xhcmVkIHNvIFN0YWdlQ29udGV4dCBjYW4gYWNjZXB0IGl0IHdpdGhvdXQgaW1wb3J0aW5nIHNjb3BlLy4gKi9cbmV4cG9ydCB0eXBlIFNjb3BlRmFjdG9yeTxUU2NvcGU+ID0gKGNvcmU6IFN0YWdlQ29udGV4dCwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5Q29udGV4dD86IHVua25vd24pID0+IFRTY29wZTtcblxuLy8g4pSA4pSAIFN0YWdlQ29udGV4dCAoZm9yd2FyZCByZWZlcmVuY2UgZm9yIFNjb3BlRmFjdG9yeSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8vIFRoZSBhY3R1YWwgY2xhc3MgbGl2ZXMgaW4gU3RhZ2VDb250ZXh0LnRzOyB3ZSBqdXN0IG5lZWQgdGhlIHR5cGUgaGVyZSBmb3Jcbi8vIHRoZSBTY29wZUZhY3RvcnkgZ2VuZXJpYy4gVHlwZVNjcmlwdCdzIGltcG9ydC10eXBlIGhhbmRsZXMgdGhpczpcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi9TdGFnZUNvbnRleHQuanMnO1xuIl19
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQXVHSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdHlwZXMudHMg4oCUIENvcmUgdHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIG1lbW9yeSBsaWJyYXJ5XG4gKlxuICogWmVybyBkZXBlbmRlbmNpZXMgb24gb2xkIGNvZGUgb3Igb3RoZXIgbGlicmFyaWVzIGluIHRoaXMgcGFja2FnZSwgd2l0aCBvbmVcbiAqIGRlbGliZXJhdGUgZXhjZXB0aW9uOiBgY2FwdHVyZS9gIOKAlCB0aGUgc3RhbmRhbG9uZSBsZWFmIG1vZHVsZSBob2xkaW5nIHRoZVxuICogc2hhcmVkIHJldGVudGlvbi1wb2xpY3kgZmFtaWx5IGFuZCBzdW1tYXJ5LW1hcmtlciBidWlsZGVycyAoZXh0cmFjdGVkIGZyb21cbiAqIGhlcmUgaW4gIzEzYy1BIHNvIHRoZSByZWFkIGFuZCB3cml0ZSBkaWFscywgYW5kIGxhdGVyIFJGQy0wMDEsIHNoYXJlIG9uZVxuICogaW1wbGVtZW50YXRpb24pLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5IH0gZnJvbSAnLi4vY2FwdHVyZS9wb2xpY2llcy5qcyc7XG5cbi8vIOKUgOKUgCBQYXRjaCAmIFRyYWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQSBmbGF0IGtleS12YWx1ZSBiYWcgcmVwcmVzZW50aW5nIGEgc3RhdGUgcGF0Y2ggKG92ZXJ3cml0ZSBvciBtZXJnZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVBhdGNoIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKiogQSBzaW5nbGUgZW50cnkgaW4gdGhlIGNocm9ub2xvZ2ljYWwgb3BlcmF0aW9uIHRyYWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFjZUVudHJ5IHtcbiAgLyoqIENhbm9uaWNhbCBwYXRoIHN0cmluZyAoc2VnbWVudHMgam9pbmVkIGJ5IERFTElNKS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogLSBgJ3NldCdgICAgIOKAlCBoYXJkIG92ZXJ3cml0ZTsgYG92ZXJ3cml0ZVtwYXRoXWAgaG9sZHMgdGhlIGZ1bGwgZmluYWwgdmFsdWUuXG4gICAqIC0gYCdtZXJnZSdgICDigJQgZGVlcCB1bmlvbiBtZXJnZTsgYHVwZGF0ZXNbcGF0aF1gIGhvbGRzIHRoZSBhY2N1bXVsYXRlZCBkZWx0YS5cbiAgICogLSBgJ2FwcGVuZCdgIOKAlCAoIzEzYy1CLCBwcm9kdWNlZCBvbmx5IHVuZGVyIHtAbGluayBDb21taXRWYWx1ZXNNb2RlfVxuICAgKiAgIGAnZGVsdGEnYCkgdGhlIHBhdGgncyBmaW5hbCB2YWx1ZSBpcyBpdHMgYmFzZSB2YWx1ZSBwbHVzIGEgdGFpbCBvZiBuZXdcbiAgICogICB0cmFpbGluZyBlbGVtZW50czsgYG92ZXJ3cml0ZVtwYXRoXWAgaG9sZHMgT05MWSB0aGUgdGFpbC4gUmVwbGF5XG4gICAqICAgcmVjb25zdHJ1Y3RzIGJ5IGNvbmNhdGVuYXRpb24uIE5PVCBpZGVtcG90ZW50IOKAlCBkZWx0YS1tb2RlIGJ1bmRsZXNcbiAgICogICBjYXJyeSBleGFjdGx5IG9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGguXG4gICAqIC0gYCdkZWxldGUnYCDigJQgKCMxM2MtQiwgcHJvZHVjZWQgb25seSB1bmRlciBgJ2RlbHRhJ2A7IGFic29yYnMgYmFja2xvZ1xuICAgKiAgIEI4KSB0aGUga2V5IHdhcyBleHBsaWNpdGx5IHJlbW92ZWQgdmlhIGBkZWxldGVWYWx1ZSgpYC4gUmVwbGF5IHJlbW92ZXNcbiAgICogICB0aGUga2V5LiBgb3ZlcndyaXRlW3BhdGhdYCBzdGlsbCBFTlVNRVJBVEVTIHRoZSBwYXRoICh2YWx1ZVxuICAgKiAgIGB1bmRlZmluZWRgKSBzbyBrZXktc2V0IGNvbnN1bWVycyBrZWVwIHNlZWluZyB0aGUgY2hhbmdlZCBrZXkuXG4gICAqXG4gICAqIGBvdmVyd3JpdGVgIHZhbHVlcyBhcmUgdGhlcmVmb3JlIFZFUkItUVVBTElGSUVEOiBjb25zdW1lcnMgdGhhdCByZWFkXG4gICAqIGBidW5kbGUub3ZlcndyaXRlW2tleV1gIGFzIFwidGhlIGZ1bGwgdmFsdWUgd3JpdHRlblwiIG11c3QgdXNlXG4gICAqIGBjb21taXRWYWx1ZUF0KGNvbW1pdExvZywgaWR4LCBrZXkpYCAoZnJvbSBgZm9vdHByaW50anMvdHJhY2VgKSB3aGVuIHRoZVxuICAgKiBsb2cgbWF5IGNvbnRhaW4gZGVsdGEtbW9kZSBidW5kbGVzLlxuICAgKi9cbiAgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIHwgJ2FwcGVuZCcgfCAnZGVsZXRlJztcbn1cblxuLyoqXG4gKiBSRkMtMDAzIEQyIOKAlCByZWFkIHBhdGhzIHRoYXQgQllQQVNTIHJlYWQgdHJhY2tpbmc6XG4gKiAtIGAnYXJncydgICAg4oCUIHRoZSBzdGFnZSBjYWxsZWQgYGdldEFyZ3MoKWAgLyBgJGdldEFyZ3MoKWAgd2l0aCBub24tZW1wdHlcbiAqICAgcnVuIGlucHV0IChmcm96ZW4sIHVudHJhY2tlZCBieSBkZXNpZ24pXG4gKiAtIGAnZW52J2AgICAg4oCUIHRoZSBzdGFnZSBjYWxsZWQgYGdldEVudigpYCAvIGAkZ2V0RW52KClgIHdpdGggYSBub24tZW1wdHlcbiAqICAgZXhlY3V0aW9uIGVudmlyb25tZW50IChmcm96ZW4sIHVudHJhY2tlZCBieSBkZXNpZ24pXG4gKiAtIGAnc2lsZW50J2Ag4oCUIHRoZSBzdGFnZSBwZXJmb3JtZWQgYSBzaWxlbnQgcmVhZCAoYGdldFZhbHVlU2lsZW50YCAvXG4gKiAgIGBnZXRWYWx1ZURpcmVjdGApIG9mIGEga2V5IGl0IG5ldmVyIHRyYWNrZWQtcmVhZCBpbiB0aGUgc2FtZSBzdGFnZS5cbiAqICAgU2lsZW50IHJlYWRzIFNIQURPV0VEIGJ5IGEgdHJhY2tlZCByZWFkIG9mIHRoZSBzYW1lIGtleSBpbiB0aGUgc2FtZVxuICogICBzdGFnZSAoVHlwZWRTY29wZSBhcnJheS1wcm94eSBpbnRlcm5hbHMsIGAkYmF0Y2hBcnJheWApIGFyZSBOT1RcbiAqICAgZmxhZ2dlZCDigJQgdGhlaXIgcmVhZOKGkndyaXRlIGVkZ2UgaXMgYWxyZWFkeSBjYXB0dXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgVW50cmFja2VkU291cmNlID0gJ2FyZ3MnIHwgJ2VudicgfCAnc2lsZW50JztcblxuLyoqIFRoZSBhdG9taWMgYnVuZGxlIHByb2R1Y2VkIGJ5IFRyYW5zYWN0aW9uQnVmZmVyLmNvbW1pdCgpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21taXRCdW5kbGUge1xuICAvKiogQXV0by1hc3NpZ25lZCBzdGVwIGluZGV4IChzZXQgYnkgRXZlbnRMb2cucmVjb3JkKS4gKi9cbiAgaWR4PzogbnVtYmVyO1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgc3RhZ2U6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBzdGFnZSBpZGVudGlmaWVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllci4gRm9ybWF0OiBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXggKi9cbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIENocm9ub2xvZ2ljYWwgd3JpdGUgbG9nIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheS4gKi9cbiAgdHJhY2U6IFRyYWNlRW50cnlbXTtcbiAgLyoqIFBhdGhzIHRoYXQgc2hvdWxkIGJlIHJlZGFjdGVkIGluIFVJIChzZW5zaXRpdmUgZGF0YSkuICovXG4gIHJlZGFjdGVkUGF0aHM6IHN0cmluZ1tdO1xuICAvKiogSGFyZCBvdmVyd3JpdGUgcGF0Y2hlcy4gKi9cbiAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgLyoqIERlZXAgbWVyZ2UgcGF0Y2hlcy4gKi9cbiAgdXBkYXRlczogTWVtb3J5UGF0Y2g7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyIGhvbmVzdHkgbWFya2VycyDigJQgdW50cmFja2VkIHJlYWQgcGF0aHMgdGhpcyBzdGFnZSBjb25zdW1lZFxuICAgKiAoc2VlIHtAbGluayBVbnRyYWNrZWRTb3VyY2V9KS4gQUJTRU5UIHdoZW4gdGhlIHN0YWdlIHVzZWQgbm9uZSwgc29cbiAgICogY2hhcnRzIHRoYXQgbmV2ZXIgdG91Y2ggdGhvc2UgcGF0aHMga2VlcCBieXRlLWlkZW50aWNhbCBjb21taXQgbG9ncy5cbiAgICogQ2F1c2FsLXNsaWNlIGNvbnN1bWVycyAoYGNhdXNhbENoYWluYC9gZm9ybWF0Q2F1c2FsQ2hhaW5gKSBzdXJmYWNlIHRoaXNcbiAgICogYXMgXCJzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlXCIuIFJlc2lkdWFsIGxpbWl0YXRpb24gKGJ5IGRlc2lnbik6XG4gICAqIHZhbHVlcyBzbXVnZ2xlZCB0aHJvdWdoIEpTIGNsb3N1cmVzIGFyZSB1bmRldGVjdGFibGUuXG4gICAqL1xuICB1bnRyYWNrZWRTb3VyY2VzPzogUmVhZG9ubHlBcnJheTxVbnRyYWNrZWRTb3VyY2U+O1xufVxuXG4vLyDilIDilIAgRmxvdyBDb250cm9sIE5hcnJhdGl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFR5cGVzIG9mIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMgY2FwdHVyZWQgYnkgdGhlIGV4ZWN1dGlvbiBlbmdpbmUuICovXG5leHBvcnQgdHlwZSBGbG93Q29udHJvbFR5cGUgPSAnbmV4dCcgfCAnYnJhbmNoJyB8ICdjaGlsZHJlbicgfCAnc2VsZWN0ZWQnIHwgJ3N1YmZsb3cnIHwgJ2xvb3AnO1xuXG4vKiogQSBzaW5nbGUgZmxvdyBjb250cm9sIG5hcnJhdGl2ZSBlbnRyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd01lc3NhZ2Uge1xuICB0eXBlOiBGbG93Q29udHJvbFR5cGU7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIHJhdGlvbmFsZT86IHN0cmluZztcbiAgY291bnQ/OiBudW1iZXI7XG4gIGl0ZXJhdGlvbj86IG51bWJlcjtcbiAgdGltZXN0YW1wPzogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgUmVhZCAvIFdyaXRlIFRyYWNraW5nICgjMTQsICMxM2MtQSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gVGhlIHBvbGljeSBmYW1pbHkgYW5kIG1hcmtlciBzaGFwZXMgYXJlIG93bmVkIGJ5IGBjYXB0dXJlL2AgKHNoYXJlZCB3aXRoXG4vLyB0aGUgd3JpdGUgZGlhbCBhbmQsIGxhdGVyLCBSRkMtMDAxJ3MgZGVmZXJyZWQtb2JzZXJ2ZXIgY2FwdHVyZSB0aWVyKS5cbi8vIFJlLWV4cG9ydGVkIGhlcmUgc28gZXZlcnkgcHJlLWV4dHJhY3Rpb24gaW1wb3J0IHBhdGgga2VlcHMgd29ya2luZy5cblxuZXhwb3J0IHR5cGUgeyBSZXRlbnRpb25Qb2xpY3kgfSBmcm9tICcuLi9jYXB0dXJlL3BvbGljaWVzLmpzJztcbmV4cG9ydCB0eXBlIHsgUmVhZFN1bW1hcnlNYXJrZXIsIFdyaXRlU3VtbWFyeU1hcmtlciB9IGZyb20gJy4uL2NhcHR1cmUvc3VtbWFyaXplLmpzJztcbmV4cG9ydCB7IFJFQURfUFJFVklFV19MRU5HVEgsIFNVTU1BUllfUFJFVklFV19MRU5HVEggfSBmcm9tICcuLi9jYXB0dXJlL3N1bW1hcml6ZS5qcyc7XG5cbi8qKlxuICogUG9saWN5IGZvciBob3cgdHJhY2tlZCByZWFkcyBhcmUgcmVjb3JkZWQgaW50byBgU3RhZ2VTbmFwc2hvdC5zdGFnZVJlYWRzYC5cbiAqXG4gKiAtIGAnZnVsbCdgIChkZWZhdWx0KSDigJQgZXZlcnkgdHJhY2tlZCByZWFkIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50b1xuICogICB0aGUgc3RhZ2UncyByZWFkIHZpZXcuIEJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yOyB0aGlzIGlzXG4gKiAgIHdoYXQgc25hcHNob3QgY29uc3VtZXJzIChsZW5zLCBhZ2VudGZvb3RwcmludCkgc2VlIHRvZGF5LlxuICogLSBgJ3N1bW1hcnknYCDigJQgcmVhZHMgcmVjb3JkIGEgY2hlYXAge0BsaW5rIFJlYWRTdW1tYXJ5TWFya2VyfSAodHlwZSArIHNpemVcbiAqICAgcHJveHkgKyBzaG9ydCBwcmV2aWV3KSBpbnN0ZWFkIG9mIHRoZSBjbG9uZWQgdmFsdWUuIE8oMSktaXNoIHBlciByZWFkIOKAlFxuICogICBubyB2YWx1ZSBjbG9uZSwgbm8gc2VyaWFsaXphdGlvbiBvZiBsYXJnZSBvYmplY3RzLlxuICogLSBgJ29mZidgIOKAlCByZWFkcyBhcmUgbm90IHJlY29yZGVkIGF0IGFsbDsgYHN0YWdlUmVhZHNgIGlzIGFic2VudCBmcm9tIHRoZVxuICogICBzbmFwc2hvdC4gWmVybyBwZXItcmVhZCBjb3N0LiBWYWx1ZXMgYXJlIHN0aWxsIHJlYWRhYmxlLCBhbmQgdGhlXG4gKiAgIGBTY29wZVJlY29yZGVyLm9uUmVhZGAgZXZlbnQgc3RpbGwgZmlyZXMgKGl0IHBhc3NlcyB0aGUgbGl2ZSByZWZlcmVuY2UgYW5kXG4gKiAgIG5ldmVyIGNsb25lZCkg4oCUIHNvIG5hcnJhdGl2ZSBvdXRwdXQgaXMgaWRlbnRpY2FsIGluIGV2ZXJ5IG1vZGUuIFRoZSBwb2xpY3lcbiAqICAgc2NvcGVzIE9OTFkgdGhlIHNuYXBzaG90J3MgYHN0YWdlUmVhZHNgIHBheWxvYWQuXG4gKlxuICogU2V0IHZpYSBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHJlYWRUcmFja2luZyB9KWAgb3JcbiAqIGBleGVjdXRvci5zZXRSZWFkVHJhY2tpbmcobW9kZSlgIChiZWZvcmUgYHJ1bigpYCkuXG4gKlxuICogQWxpYXMgb2YgdGhlIHNoYXJlZCB7QGxpbmsgUmV0ZW50aW9uUG9saWN5fSBmYW1pbHkgKCMxM2MtQSkg4oCUIGtlcHQgYXMgdGhlXG4gKiBzaGlwcGVkIHB1YmxpYyBuYW1lIGZvciB0aGUgcmVhZCBkaWFsLlxuICovXG5leHBvcnQgdHlwZSBSZWFkVHJhY2tpbmdNb2RlID0gUmV0ZW50aW9uUG9saWN5O1xuXG4vKipcbiAqIFBvbGljeSBmb3IgaG93IHRyYWNrZWQgd3JpdGVzIGFyZSByZWNvcmRlZCBpbnRvIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYFxuICogKCMxM2MtQSkg4oCUIHRoZSBzaWJsaW5nIG9mIHtAbGluayBSZWFkVHJhY2tpbmdNb2RlfS5cbiAqXG4gKiAtIGAnZnVsbCdgIChkZWZhdWx0KSDigJQgZXZlcnkgdHJhY2tlZCB3cml0ZSBgc3RydWN0dXJlZENsb25lYHMgdGhlIHZhbHVlIGludG9cbiAqICAgdGhlIHN0YWdlJ3Mgd3JpdGUgdmlldy4gQnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgYmVoYXZpb3IuXG4gKiAtIGAnc3VtbWFyeSdgIOKAlCB3cml0ZXMgcmVjb3JkIGEgY2hlYXAge0BsaW5rIFdyaXRlU3VtbWFyeU1hcmtlcn0gaW5zdGVhZCBvZlxuICogICB0aGUgY2xvbmVkIHZhbHVlLlxuICogLSBgJ29mZidgIOKAlCB3cml0ZXMgYXJlIG5vdCByZWNvcmRlZCBhdCBhbGw7IGBzdGFnZVdyaXRlc2AgaXMgYWJzZW50IGZyb20gdGhlXG4gKiAgIHNuYXBzaG90LiBUaGUgd3JpdGVzIHRoZW1zZWx2ZXMgc3RpbGwgY29tbWl0IHRvIHNoYXJlZCBzdGF0ZSBhbmQgc3RpbGxcbiAqICAgYXBwZWFyIGluIHRoZSBjb21taXQgbG9nIOKAlCBvbmx5IHRoZSBwZXItc3RhZ2Ugc25hcHNob3QgYm9va2tlZXBpbmcgKGFuZFxuICogICB0aGVyZWZvcmUgdGhlIGNvbW1pdCBvYnNlcnZlcidzIG11dGF0aW9ucyBwYXlsb2FkKSBpcyBhZmZlY3RlZC4gKFRoZVxuICogICBjb21taXQgbG9nJ3Mgb3duIHZhbHVlIGVuY29kaW5nIGhhcyBpdHMgb3duIGxvc3NsZXNzIGRpYWwg4oCUXG4gKiAgIHtAbGluayBDb21taXRWYWx1ZXNNb2RlfSwgIzEzYy1CLilcbiAqXG4gKiBTZXQgdmlhIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgd3JpdGVUcmFja2luZyB9KWAgb3JcbiAqIGBleGVjdXRvci5zZXRXcml0ZVRyYWNraW5nKG1vZGUpYCAoYmVmb3JlIGBydW4oKWApLiBTZWVcbiAqIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMud3JpdGVUcmFja2luZ2AgZm9yIHRoZSBmdWxsIG9ic2VydmFibGUtY29uc2VxdWVuY2VcbiAqIGNvbnRyYWN0IChvbkNvbW1pdCBwYXlsb2FkLCByZWRhY3Rpb24gcHJlY2VkZW5jZSwgd2hhdCBpcyBPVVQgb2Ygc2NvcGUpLlxuICovXG5leHBvcnQgdHlwZSBXcml0ZVRyYWNraW5nTW9kZSA9IFJldGVudGlvblBvbGljeTtcblxuLyoqXG4gKiBQb2xpY3kgZm9yIGhvdyBjb21taXQtYnVuZGxlIFZBTFVFUyBhcmUgZW5jb2RlZCBpbnRvIHRoZSBjb21taXQgbG9nXG4gKiAoIzEzYy1CKSDigJQgY29tcGxldGVzIHRoZSBgcmVhZFRyYWNraW5nYC9gd3JpdGVUcmFja2luZ2AgZGlhbCBmYW1pbHkuXG4gKiBVbmxpa2UgdGhvc2UgdHdvICh3aGljaCBnYXRlIGxvc3N5IHNuYXBzaG90IGJvb2trZWVwaW5nKSwgdGhpcyBkaWFsIGlzXG4gKiAqKmxvc3NsZXNzIGluIGJvdGggbW9kZXMqKiDigJQgaXQgY2hhbmdlcyB0aGUgY29tbWl0IGxvZydzICplbmNvZGluZyosXG4gKiBuZXZlciBpdHMgKmluZm9ybWF0aW9uKjsgYW55IHN0ZXAncyBmdWxsIHN0YXRlIHN0YXlzIGV4YWN0bHlcbiAqIHJlY29uc3RydWN0YWJsZSBieSByZXBsYXkuXG4gKlxuICogLSBgJ2Z1bGwnYCAoZGVmYXVsdCkg4oCUIGV2ZXJ5IHN1cnZpdmluZyBgc2V0YCBwYXRoIHN0b3JlcyB0aGUgZnVsbCBmaW5hbFxuICogICB2YWx1ZSwgb25lIHRyYWNlIGVudHJ5IHBlciBvcGVyYXRpb24uIEJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsXG4gKiAgIGJlaGF2aW9yLlxuICogLSBgJ2RlbHRhJ2Ag4oCUIHR3byBjaGFuZ2VzLCBib3RoIHJlcGxheS1jb3ZlcmVkIGJ5IGBhcHBseVNtYXJ0TWVyZ2VgOlxuICogICAxLiAqKmBhcHBlbmRgIGRldGVjdGlvbioqOiB3aGVuIGEgcGF0aCdzIG5ldCBjaGFuZ2UgaXMgXCJ0aGUgYmFzZSBhcnJheVxuICogICAgICBwbHVzIG5ldyB0cmFpbGluZyBlbGVtZW50c1wiIChzdHJpY3QgcHJlZml4KSwgdGhlIGJ1bmRsZSByZWNvcmRzIE9OTFlcbiAqICAgICAgdGhlIHRhaWwgdW5kZXIgYSBgdmVyYjogJ2FwcGVuZCdgIHRyYWNlIGVudHJ5IOKAlCB0aGUgZ3Jvd2luZy1oaXN0b3J5XG4gKiAgICAgIGNvbW1pdCBsb2cgYmVjb21lcyBsaW5lYXIgaW4gdGFpbCBzaXplIGluc3RlYWQgb2YgTyhOwrIpIHJldGFpbmVkLlxuICogICAgICBBIHJlYWwgYHZlcmI6ICdkZWxldGUnYCBlbnRyeSByZXBsYWNlcyB0aGUgYHNldDogdW5kZWZpbmVkYCBmbGF0dGVuaW5nXG4gKiAgICAgIGZvciBgZGVsZXRlVmFsdWUoKWAgKGNsb3NlcyB0aGUgZG9jdW1lbnRlZCBNZW1vcnlQYXRjaCBsaW1pdGF0aW9uKS5cbiAqICAgMi4gKipPbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKiogKGFwcGVuZCBpcyBub3QgaWRlbXBvdGVudCBvblxuICogICAgICByZXBsYXkpOiB0aGUgdmVyYiBpcyByZXNvbHZlZCBmcm9tIHRoZSBwYXRoJ3MgYmFzZeKGkmZpbmFsIHJlbGF0aW9uc2hpcFxuICogICAgICBhbmQgb3AgbWl4OyBlbnRyaWVzIGFyZSBvcmRlcmVkIGJ5IGVhY2ggcGF0aCdzIExBU1QgdG91Y2guXG4gKlxuICogSG9uZXN0IGNvc3Qgbm90ZTogYXBwZW5kIGRldGVjdGlvbiBpcyBORVcgd2FsbCB3b3JrIOKAlCBhbiBPKHxiYXNlfClcbiAqIHN0cnVjdHVyYWwgcHJlZml4IGNvbXBhcmUgcGVyIGFycmF5LXNldCBwYXRoIHBlciBjb21taXQgKHRvZGF5J3NcbiAqIGBkZWVwRXF1YWxgIGZhc3QtZmFpbHMgb24gbGVuZ3RoIGluIE8oMSkgZm9yIGEgZ3Jvd24gYXJyYXkpLiBPbiBhIGhpdCB0aGVcbiAqIGNvbW1pdCBnZXRzIGNoZWFwZXIgaW4gYm90aCB3YWxsIGFuZCBoZWFwICh0aGUgTyh8ZmluYWx8KSBjbG9uZSBzaHJpbmtzIHRvXG4gKiBPKHx0YWlsfCkpOyBvbiBhIG1pc3MgaXQgcGF5cyBjb21wYXJlICsgZnVsbCBjbG9uZS4gYCdmdWxsJ2AgcGF5cyB6ZXJvIOKAlFxuICogdGhlIGRldGVjdGlvbiBicmFuY2ggaXMgbW9kZS1nYXRlZC5cbiAqXG4gKiBTZXQgdmlhIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgY29tbWl0VmFsdWVzIH0pYCBvclxuICogYGV4ZWN1dG9yLnNldENvbW1pdFZhbHVlcyhtb2RlKWAgKGJlZm9yZSBgcnVuKClgKS4gVGhlIGFjdGl2ZSBtb2RlIGlzXG4gKiBzdXJmYWNlZCBhcyB0aGUgc25hcHNob3QgZGlzY3JpbWluYW50IGBSdW50aW1lU25hcHNob3QuY29tbWl0VmFsdWVzYC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tbWl0VmFsdWVzTW9kZSA9ICdmdWxsJyB8ICdkZWx0YSc7XG5cbi8vIOKUgOKUgCBTdGFnZSBTbmFwc2hvdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFNlcmlhbGlzYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhIHN0YWdlJ3Mgc3RhdGUgKGZvciBkZWJ1Z2dpbmcgLyB2aXN1YWxpc2F0aW9uKS4gKi9cbmV4cG9ydCB0eXBlIFN0YWdlU25hcHNob3QgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIEZvcm1hdDogW3N1YmZsb3dQYXRoL11zdGFnZUlkI2V4ZWN1dGlvbkluZGV4ICovXG4gIHJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIHN0YWdlIGRvZXMgKGZyb20gYnVpbGRlcikuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIOKAlCBwcmVzZW50IHdoZW4gdGhpcyBzdGFnZSBpcyBhIHN1YmZsb3cgZW50cnkgcG9pbnQuICovXG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgaXNEZWNpZGVyPzogYm9vbGVhbjtcbiAgaXNGb3JrPzogYm9vbGVhbjtcbiAgLyoqIFVzZXItbGV2ZWwgd3JpdGVzIG1hZGUgYnkgdGhpcyBzdGFnZSAocHJlLW5hbWVzcGFjZSBrZXlzIOKGkiB2YWx1ZXMpLlxuICAgKiAgU2hhcGUgZGVwZW5kcyBvbiB7QGxpbmsgV3JpdGVUcmFja2luZ01vZGV9OiBjbG9uZWQgdmFsdWVzIHVuZGVyIGAnZnVsbCdgXG4gICAqICAoZGVmYXVsdCksIHtAbGluayBXcml0ZVN1bW1hcnlNYXJrZXJ9cyB1bmRlciBgJ3N1bW1hcnknYCwgYWJzZW50IHVuZGVyXG4gICAqICBgJ29mZidgLiBSZWRhY3RlZCB3cml0ZXMgc2hvdyBgJ1tSRURBQ1RFRF0nYCByZWdhcmRsZXNzIG9mIG1vZGUuICovXG4gIHN0YWdlV3JpdGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBVc2VyLWxldmVsIHJlYWRzIG1hZGUgYnkgdGhpcyBzdGFnZSAocHJlLW5hbWVzcGFjZSBrZXlzIOKGkiB2YWx1ZXMgYXQgcmVhZFxuICAgKiAgdGltZSkuIFNoYXBlIGRlcGVuZHMgb24ge0BsaW5rIFJlYWRUcmFja2luZ01vZGV9OiBjbG9uZWQgdmFsdWVzIHVuZGVyXG4gICAqICBgJ2Z1bGwnYCAoZGVmYXVsdCksIHtAbGluayBSZWFkU3VtbWFyeU1hcmtlcn1zIHVuZGVyIGAnc3VtbWFyeSdgLCBhYnNlbnRcbiAgICogIHVuZGVyIGAnb2ZmJ2AuICovXG4gIHN0YWdlUmVhZHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbG9nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGVycm9yczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIG1ldHJpY3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBldmFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZsb3dNZXNzYWdlcz86IEZsb3dNZXNzYWdlW107XG4gIG5leHQ/OiBTdGFnZVNuYXBzaG90O1xuICBjaGlsZHJlbj86IFN0YWdlU25hcHNob3RbXTtcbn07XG5cbi8vIOKUgOKUgCBTY29wZSBGYWN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogRm9yd2FyZC1kZWNsYXJlZCBzbyBTdGFnZUNvbnRleHQgY2FuIGFjY2VwdCBpdCB3aXRob3V0IGltcG9ydGluZyBzY29wZS8uICovXG5leHBvcnQgdHlwZSBTY29wZUZhY3Rvcnk8VFNjb3BlPiA9IChjb3JlOiBTdGFnZUNvbnRleHQsIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seUNvbnRleHQ/OiB1bmtub3duKSA9PiBUU2NvcGU7XG5cbi8vIOKUgOKUgCBTdGFnZUNvbnRleHQgKGZvcndhcmQgcmVmZXJlbmNlIGZvciBTY29wZUZhY3RvcnkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vLyBUaGUgYWN0dWFsIGNsYXNzIGxpdmVzIGluIFN0YWdlQ29udGV4dC50czsgd2UganVzdCBuZWVkIHRoZSB0eXBlIGhlcmUgZm9yXG4vLyB0aGUgU2NvcGVGYWN0b3J5IGdlbmVyaWMuIFR5cGVTY3JpcHQncyBpbXBvcnQtdHlwZSBoYW5kbGVzIHRoaXM6XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4vU3RhZ2VDb250ZXh0LmpzJztcbiJdfQ==