@dbx-tools/core 0.9.68 → 0.9.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/exec.js CHANGED
@@ -44,10 +44,16 @@
44
44
  * @module
45
45
  */
46
46
  import { spawn as nodeSpawn, spawnSync as nodeSpawnSync, } from "node:child_process";
47
+ import { readdir, readFile } from "node:fs/promises";
47
48
  import * as readline from "node:readline";
49
+ import { text } from "node:stream/consumers";
48
50
  import { finished } from "node:stream/promises";
49
51
  /** Shell-compatible exit code returned when an executable cannot be found. */
50
52
  export const COMMAND_NOT_FOUND_EXIT_CODE = 127;
53
+ const DEFAULT_GRACEFUL_TIMEOUT_MS = 10_000;
54
+ const DEFAULT_FORCE_TIMEOUT_MS = 4_000;
55
+ const DEFAULT_KILL_POLL_INTERVAL_MS = 100;
56
+ const WINDOWS_PROCESS_SNAPSHOT_SCRIPT = "Get-CimInstance Win32_Process | ForEach-Object { '{0} {1} {2}' -f $_.ProcessId, $_.ParentProcessId, $_.CreationDate.ToFileTimeUtc() }";
51
57
  function parseSpawnArgs(input) {
52
58
  let [value, ...values] = input;
53
59
  const [command, ...commandArgs] = shlex(value);
@@ -124,6 +130,226 @@ function commandLabel(command, args) {
124
130
  function isCommandNotFoundError(error) {
125
131
  return error instanceof Error && "code" in error && error.code === "ENOENT";
126
132
  }
133
+ /** Return whether a process operation failed because the PID no longer exists. */
134
+ function isMissingProcessError(error) {
135
+ return error instanceof Error && "code" in error && error.code === "ESRCH";
136
+ }
137
+ /** Validate a finite non-negative timeout. */
138
+ function timeoutValue(value, name) {
139
+ if (!Number.isFinite(value) || value < 0) {
140
+ throw new RangeError(`${name} must be a finite non-negative number`);
141
+ }
142
+ return value;
143
+ }
144
+ /** Validate a finite positive polling interval. */
145
+ function pollIntervalValue(value) {
146
+ if (!Number.isFinite(value) || value <= 0) {
147
+ throw new RangeError("pollIntervalMs must be a finite positive number");
148
+ }
149
+ return value;
150
+ }
151
+ /** Parse the common `pid parentPid identity` process-snapshot format. */
152
+ function parseProcessSnapshot(lines) {
153
+ const snapshot = [];
154
+ for (const line of lines) {
155
+ const match = /^\s*(\d+)\s+(\d+)(?:\s+(.+?))?\s*$/.exec(line);
156
+ const identity = match?.[3]?.trim();
157
+ if (!match || !identity)
158
+ continue;
159
+ snapshot.push({
160
+ pid: Number.parseInt(match[1], 10),
161
+ parentPid: Number.parseInt(match[2], 10),
162
+ identity,
163
+ });
164
+ }
165
+ return snapshot;
166
+ }
167
+ /** Return whether a `/proc` record disappeared or is inaccessible during a snapshot. */
168
+ function isUnavailableProcRecord(error) {
169
+ if (!(error instanceof Error) || !("code" in error))
170
+ return false;
171
+ return error.code === "ENOENT" || error.code === "EACCES" || error.code === "EPERM";
172
+ }
173
+ /** Parse Linux `/proc/<pid>/stat` parent PID and exact process-start ticks. */
174
+ function parseLinuxProcessStat(pid, stat) {
175
+ const commandEnd = stat.lastIndexOf(")");
176
+ if (commandEnd < 0)
177
+ return undefined;
178
+ const fields = stat
179
+ .slice(commandEnd + 1)
180
+ .trim()
181
+ .split(/\s+/);
182
+ const parentPid = Number.parseInt(fields[1], 10);
183
+ const startTicks = fields[19];
184
+ if (!Number.isSafeInteger(parentPid) || !startTicks)
185
+ return undefined;
186
+ return { pid, parentPid, identity: startTicks };
187
+ }
188
+ /** Capture Linux process identities from `/proc` without second-level truncation. */
189
+ async function linuxProcessSnapshot() {
190
+ const directories = await readdir("/proc", { withFileTypes: true });
191
+ const entries = await Promise.all(directories
192
+ .filter((entry) => entry.isDirectory() && /^\d+$/.test(entry.name))
193
+ .map(async (entry) => {
194
+ const pid = Number.parseInt(entry.name, 10);
195
+ try {
196
+ return parseLinuxProcessStat(pid, await readFile(`/proc/${entry.name}/stat`, "utf8"));
197
+ }
198
+ catch (error) {
199
+ if (isUnavailableProcRecord(error))
200
+ return undefined;
201
+ throw error;
202
+ }
203
+ }));
204
+ return entries.filter((entry) => entry !== undefined);
205
+ }
206
+ /**
207
+ * Capture the current PID, parent PID, and process-start identity table.
208
+ *
209
+ * Linux reads exact start ticks from `/proc`. Windows uses the built-in
210
+ * PowerShell CIM provider. macOS and other POSIX platforms combine `ps`
211
+ * process start time and executable name.
212
+ */
213
+ async function processSnapshot() {
214
+ if (process.platform === "linux")
215
+ return linuxProcessSnapshot();
216
+ const command = process.platform === "win32" ? "powershell.exe" : "ps";
217
+ const args = process.platform === "win32"
218
+ ? ["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", WINDOWS_PROCESS_SNAPSHOT_SCRIPT]
219
+ : ["-A", "-o", "pid=", "-o", "ppid=", "-o", "lstart=", "-o", "comm="];
220
+ const proc = nodeSpawn(command, args, {
221
+ stdio: ["ignore", "pipe", "pipe"],
222
+ windowsHide: true,
223
+ });
224
+ const stdout = text(proc.stdout);
225
+ const stderr = text(proc.stderr);
226
+ const [exitCode, stdoutText, stderrText] = await Promise.all([waitForExit(proc), stdout, stderr]);
227
+ if (exitCode !== 0) {
228
+ throw new Error(`${commandLabel(command, args)} failed (exit ${exitCode})${stderrText ? `: ${stderrText.trim()}` : ""}`);
229
+ }
230
+ return parseProcessSnapshot(linesFromCapturedOutput(stdoutText));
231
+ }
232
+ /** Group a process snapshot by parent PID. */
233
+ function processChildren(snapshot) {
234
+ const children = new Map();
235
+ for (const entry of snapshot) {
236
+ const siblings = children.get(entry.parentPid) ?? [];
237
+ siblings.push(entry);
238
+ children.set(entry.parentPid, siblings);
239
+ }
240
+ return children;
241
+ }
242
+ /** Select one snapshotted process tree in descendant-first signal order. */
243
+ function processTree(snapshot, rootPid) {
244
+ const root = snapshot.find((entry) => entry.pid === rootPid);
245
+ if (!root)
246
+ throw new Error(`Unable to identify child process ${rootPid}`);
247
+ const children = processChildren(snapshot);
248
+ const tree = [];
249
+ const visited = new Set([rootPid]);
250
+ const appendDescendants = (parentPid) => {
251
+ for (const child of children.get(parentPid) ?? []) {
252
+ if (visited.has(child.pid))
253
+ continue;
254
+ visited.add(child.pid);
255
+ appendDescendants(child.pid);
256
+ tree.push(child);
257
+ }
258
+ };
259
+ appendDescendants(rootPid);
260
+ tree.push(root);
261
+ return tree;
262
+ }
263
+ /** Return whether two snapshots identify the same process lifetime. */
264
+ function sameProcess(previous, current) {
265
+ return previous.identity === current.identity;
266
+ }
267
+ /**
268
+ * Refresh retained process identities and merge descendants created after the
269
+ * initial snapshot.
270
+ */
271
+ function refreshProcessTree(retained, snapshot) {
272
+ const currentByPid = new Map(snapshot.map((entry) => [entry.pid, entry]));
273
+ const children = processChildren(snapshot);
274
+ const processes = new Map();
275
+ const discovered = [];
276
+ const queue = [];
277
+ for (const previous of retained.values()) {
278
+ const current = currentByPid.get(previous.pid);
279
+ if (!current || !sameProcess(previous, current))
280
+ continue;
281
+ retained.set(current.pid, current);
282
+ processes.set(current.pid, current);
283
+ queue.push(current);
284
+ }
285
+ const visited = new Set(processes.keys());
286
+ for (let index = 0; index < queue.length; index += 1) {
287
+ const parent = queue[index];
288
+ for (const child of children.get(parent.pid) ?? []) {
289
+ const previous = retained.get(child.pid);
290
+ if (!previous || !sameProcess(previous, child)) {
291
+ retained.set(child.pid, child);
292
+ discovered.push(child);
293
+ }
294
+ processes.set(child.pid, child);
295
+ if (visited.has(child.pid))
296
+ continue;
297
+ visited.add(child.pid);
298
+ queue.push(child);
299
+ }
300
+ }
301
+ return { processes: [...processes.values()], discovered };
302
+ }
303
+ /** Build the per-lifetime key used to prevent repeated signals after PID reuse. */
304
+ function processIdentity(entry) {
305
+ return `${entry.pid}:${entry.identity}`;
306
+ }
307
+ /** Signal each process identity once, ignoring PIDs that already exited. */
308
+ function signalProcesses(processes, signal, signaled) {
309
+ const errors = [];
310
+ for (const entry of processes) {
311
+ const identity = processIdentity(entry);
312
+ if (signaled.has(identity))
313
+ continue;
314
+ signaled.add(identity);
315
+ try {
316
+ process.kill(entry.pid, signal);
317
+ }
318
+ catch (error) {
319
+ if (!isMissingProcessError(error))
320
+ errors.push(error);
321
+ }
322
+ }
323
+ if (errors.length > 0) {
324
+ throw new AggregateError(errors, `Failed to send ${signal} to the complete process tree`);
325
+ }
326
+ }
327
+ /** Pause without detaching the shutdown operation from the event loop. */
328
+ function delay(milliseconds) {
329
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
330
+ }
331
+ /**
332
+ * Poll refreshed process snapshots until the retained tree exits or the
333
+ * timeout elapses. Descendants created during shutdown are retained and receive
334
+ * the current shutdown signal once.
335
+ */
336
+ async function waitForProcessTreeExit(retained, initialProcesses, signal, signaled, timeoutMs, pollIntervalMs) {
337
+ let survivors = [...initialProcesses];
338
+ const deadline = Date.now() + timeoutMs;
339
+ while (survivors.length > 0) {
340
+ const remainingMs = deadline - Date.now();
341
+ if (remainingMs > 0)
342
+ await delay(Math.min(pollIntervalMs, remainingMs));
343
+ const refreshed = refreshProcessTree(retained, await processSnapshot());
344
+ if (refreshed.discovered.length > 0) {
345
+ signalProcesses(refreshed.discovered, signal, signaled);
346
+ }
347
+ survivors = refreshed.processes;
348
+ if (Date.now() >= deadline)
349
+ break;
350
+ }
351
+ return survivors;
352
+ }
127
353
  /**
128
354
  * Build the object returned from {@link spawn} with live line arrays and lazy
129
355
  * trimmed `stdout` / `stderr` getters derived from those lines.
@@ -357,6 +583,55 @@ function capturedText(output) {
357
583
  function linesFromCapturedOutput(output) {
358
584
  return output.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
359
585
  }
586
+ /**
587
+ * Stop a child process and descendants discovered through operating-system
588
+ * process snapshots.
589
+ *
590
+ * The initial tree is retained before signaling so descendants remain
591
+ * targetable after their parent exits or they are reparented. Polling refreshes
592
+ * the process table, merges newly created descendants, and sends each one the
593
+ * active shutdown signal once. Identity-matched survivors receive the force
594
+ * signal after the graceful timeout. macOS and other POSIX platforms use `ps`;
595
+ * Windows uses the built-in PowerShell CIM process provider.
596
+ *
597
+ * Windows does not implement POSIX signal semantics. Node terminates processes
598
+ * unconditionally for supported signals there, including `SIGTERM`.
599
+ *
600
+ * @param child - Root child process whose snapshotted tree should stop
601
+ * @param options - Graceful signal, force signal, timeout, and polling policy
602
+ * @throws When the process table cannot be captured, a signal cannot be sent,
603
+ * or identity-matched processes remain after the force timeout
604
+ */
605
+ export async function kill(child, options = {}) {
606
+ if (child.pid === undefined || child.exitCode !== null || child.signalCode !== null) {
607
+ return;
608
+ }
609
+ const gracefulTimeoutMs = timeoutValue(options.gracefulTimeoutMs ?? DEFAULT_GRACEFUL_TIMEOUT_MS, "gracefulTimeoutMs");
610
+ const forceTimeoutMs = timeoutValue(options.forceTimeoutMs ?? DEFAULT_FORCE_TIMEOUT_MS, "forceTimeoutMs");
611
+ const pollIntervalMs = pollIntervalValue(options.pollIntervalMs ?? DEFAULT_KILL_POLL_INTERVAL_MS);
612
+ const snapshot = await processSnapshot();
613
+ if (child.exitCode !== null || child.signalCode !== null)
614
+ return;
615
+ const tree = processTree(snapshot, child.pid);
616
+ const retained = new Map(tree.map((entry) => [entry.pid, entry]));
617
+ const gracefulSignal = options.gracefulSignal ?? "SIGTERM";
618
+ const gracefulSignaled = new Set();
619
+ signalProcesses(tree, gracefulSignal, gracefulSignaled);
620
+ const gracefulSurvivors = await waitForProcessTreeExit(retained, tree, gracefulSignal, gracefulSignaled, gracefulTimeoutMs, pollIntervalMs);
621
+ const forceTargets = gracefulSurvivors;
622
+ if (forceTargets.length === 0)
623
+ return;
624
+ const forceSignal = options.forceSignal ?? "SIGKILL";
625
+ const forceSignaled = new Set();
626
+ signalProcesses(forceTargets, forceSignal, forceSignaled);
627
+ const forcedSurvivors = await waitForProcessTreeExit(retained, forceTargets, forceSignal, forceSignaled, forceTimeoutMs, pollIntervalMs);
628
+ const remaining = forcedSurvivors;
629
+ if (remaining.length > 0) {
630
+ throw new Error(`Processes did not terminate after ${forceSignal}: ${remaining
631
+ .map((entry) => entry.pid)
632
+ .join(", ")}`);
633
+ }
634
+ }
360
635
  /**
361
636
  * Spawn a subprocess. Returns the LIVE child handle that is ALSO a
362
637
  * `Promise<ExecResult>` resolving on exit - see {@link ChildProcessResult}.
@@ -547,4 +822,4 @@ export function shlex(command) {
547
822
  push();
548
823
  return args.length ? args : [command];
549
824
  }
550
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRDRztBQUNILE9BQU8sRUFHTCxLQUFLLElBQUksU0FBUyxFQUNsQixTQUFTLElBQUksYUFBYSxHQUMzQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sS0FBSyxRQUFRLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDO0FBcUkvQyxTQUFTLGNBQWMsQ0FBeUIsS0FBbUI7SUFDakUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUMvQixNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQU0sQ0FBQyxDQUFDO0lBRWhELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLE9BQU8sR0FDWCxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZGLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlELE1BQU0sU0FBUyxHQUNiLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFFckIsT0FBTztRQUNMLE9BQU8sRUFBRSxPQUFRO1FBQ2pCLFdBQVcsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLEdBQUcsU0FBUyxDQUFDO1FBQzNDLE9BQU8sRUFBRSxPQUFZO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyw2QkFBNkIsQ0FBQyxLQUF3QjtJQUM3RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3ZELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsT0FBTyxLQUFpQixDQUFDO0FBQzNCLENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsU0FBUyx5QkFBeUIsQ0FBQyxJQUFZO0lBQzdDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxnREFBZ0Q7QUFDaEQsU0FBUyxvQkFBb0IsQ0FBQyxLQUF3QixFQUFFLElBQXlCO0lBQy9FLElBQUksSUFBSSxLQUFLLElBQUk7UUFBRSxPQUFPLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRSxPQUFPLEtBQWlCLENBQUM7QUFDM0IsQ0FBQztBQUVELHlEQUF5RDtBQUN6RCxTQUFTLHdCQUF3QixDQUFDLEtBQXdCLEVBQUUsSUFBeUI7SUFDbkYsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ2hELENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsU0FBUyxtQkFBbUIsQ0FBQyxLQUF3QixFQUFFLElBQXlCO0lBQzlFLElBQUksSUFBSSxLQUFLLEtBQUs7UUFBRSxPQUFPLEtBQWlCLENBQUM7SUFDN0MsSUFBSSxJQUFJLEtBQUssSUFBSTtRQUFFLE9BQU8sdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sNkJBQTZCLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELCtDQUErQztBQUMvQyxTQUFTLHNCQUFzQixDQUM3QixJQUF3QixFQUN4QixJQUF5QjtJQUV6QixJQUFJLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDekMsSUFBSSxJQUFJLEtBQUssS0FBSztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2hDLElBQUksSUFBSSxLQUFLLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QyxPQUFPLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxPQUFlLEVBQUUsSUFBYztJQUNuRCxPQUFPLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUM1QyxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLFNBQVMsc0JBQXNCLENBQUMsS0FBYztJQUM1QyxPQUFPLEtBQUssWUFBWSxLQUFLLElBQUksTUFBTSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsUUFBZ0IsRUFDaEIsV0FBcUIsRUFDckIsV0FBcUIsRUFDckIsSUFBeUI7SUFFekIsT0FBTztRQUNMLFFBQVE7UUFDUixJQUFJLFdBQVc7WUFDYixPQUFPLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxXQUFXO1lBQ2IsT0FBTyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELElBQUksTUFBTTtZQUNSLE9BQU8sd0JBQXdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxJQUFJLE1BQU07WUFDUixPQUFPLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLG9CQUFvQixDQUMzQixRQUFnQixFQUNoQixVQUE4QixFQUM5QixVQUE4QixFQUM5QixJQUF5QjtJQUV6QixJQUFJLGdCQUFzQyxDQUFDO0lBQzNDLElBQUksZ0JBQXNDLENBQUM7SUFFM0MsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUF3QixFQUF3QixFQUFFO1FBQ25FLElBQUksSUFBSSxLQUFLLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6QyxPQUFPLG1CQUFtQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxRQUFRO1FBQ1IsSUFBSSxXQUFXO1lBQ2IsSUFBSSxVQUFVLEtBQUssU0FBUztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUN4QyxnQkFBZ0IsS0FBSyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pELE9BQU8sZ0JBQWdCLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksV0FBVztZQUNiLElBQUksVUFBVSxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxFQUFFLENBQUM7WUFDeEMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqRCxPQUFPLGdCQUFnQixDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLE1BQU07WUFDUixPQUFPLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEQsQ0FBQztRQUNELElBQUksTUFBTTtZQUNSLE9BQU8sc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsWUFBWSxDQUFDLE1BQW1CO0lBQ3ZDLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVTtRQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQXVCLEVBQUUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtRQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsTUFBbUI7SUFDeEMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE1BQWU7SUFDeEMsT0FBTyxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQztBQUMxRSxDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLFNBQVMsY0FBYyxDQUFDLEtBQXFDO0lBQzNELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLFlBQVksQ0FDbkIsTUFBK0IsRUFDL0IsS0FBZSxFQUNmLGNBQXlCLFNBQVM7SUFFbEMsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDdkQsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEtBQUssTUFBTTtRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFFNUUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxPQUFPO1FBQ0wsSUFBSSxFQUFFLE1BQU07UUFDWixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNmLElBQUksT0FBTztnQkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlCLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUTtnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxLQUFLLFVBQVUsU0FBUyxDQUFDLE1BQWdCLEVBQUUsTUFBbUI7SUFDNUQsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDNUUsSUFBSSxDQUFDO1FBQ0gsSUFBSSxLQUFLLEVBQUUsTUFBTSxJQUFJLElBQUksRUFBRTtZQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO1lBQVMsQ0FBQztRQUNULEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNiLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxjQUFjLENBQ3JCLEtBQXNCLEVBQ3RCLE1BQXVCLEVBQ3ZCLE9BQXNCO0lBRXRCLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxNQUFNO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxLQUFLLFVBQVUsVUFBVSxDQUN2QixJQUFrQixFQUNsQixLQUFxQztJQUVyQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBQ2xELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxVQUFVLENBQUM7SUFDbkIsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksS0FBSyxJQUFJLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7WUFBRSxNQUFNLEdBQUcsQ0FBQztJQUNsRixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFrQjtJQUNyQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxTQUFTLENBQUMsT0FBZSxFQUFFLElBQWMsRUFBRSxNQUFrQjtJQUNwRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUMsT0FBTyxJQUFJLEtBQUssQ0FDZCxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2hHLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGdCQUFnQixDQUN2QixNQUFpQyxFQUNqQyxjQUF5QixTQUFTO0lBRWxDLElBQUksTUFBTSxLQUFLLFNBQVM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUM3QyxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDeEMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBMEM7SUFDOUQsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUQsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxNQUFjO0lBQzdDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsR0FBRyxJQUE0QjtJQUNuRCxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ3JFLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUNqQyxNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7SUFDakMsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4RCxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sU0FBUyxHQUFjLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsQ0FBQztJQUVuRixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRTtRQUMzQyxHQUFHLFNBQVM7UUFDWixLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDO0tBQzNELENBQUMsQ0FBQztJQUVILE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFM0MsTUFBTSxLQUFLLEdBQW9CLEVBQUUsQ0FBQztJQUNsQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDbEQsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRWxELE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBSyxJQUF5QixFQUFFO1FBQ2xELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLG9CQUF1RCxDQUFDO1FBQzVELElBQUksQ0FBQztZQUNILFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLO2dCQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzRCxvQkFBb0IsR0FBRyxHQUFHLENBQUM7WUFDM0IsUUFBUSxHQUFHLDJCQUEyQixDQUFDO1FBQ3pDLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRSxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELElBQUksb0JBQW9CO2dCQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUM7WUFDM0QsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVMLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLE9BQU8sYUFBYSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFzQixNQUFTLEVBQUUsT0FBbUI7SUFDeEUsTUFBTSxNQUFNLEdBQUcsTUFBd0IsQ0FBQztJQUN4QyxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFHLElBQWdDO0lBQzNELE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDckUsTUFBTSxTQUFTLEdBQWMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQ25GLE1BQU0sYUFBYSxHQUFHLE1BQU0sS0FBSyxTQUFTLENBQUM7SUFDM0MsTUFBTSxhQUFhLEdBQUcsTUFBTSxLQUFLLFNBQVMsQ0FBQztJQUMzQyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRTtRQUNqRCxHQUFHLFNBQVM7UUFDWixRQUFRLEVBQUUsYUFBYSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdELEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1FBQzFDLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztLQUNqRCxDQUFDLENBQUM7SUFFSCxNQUFNLGVBQWUsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzNFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzNFLE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRWhGLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEQsR0FBRyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVELElBQUksS0FBSyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssQ0FBQztRQUFFLE1BQU0sU0FBUyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDMUYsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsT0FBZTtJQUNuQyxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFFMUIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLElBQUksS0FBNEIsQ0FBQztJQUNqQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRW5CLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtRQUNoQixJQUFJLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztJQUVGLEtBQUssTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUM7UUFDekIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDZCxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ2hCLFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDaEIsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksRUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNqQixLQUFLLEdBQUcsU0FBUyxDQUFDO2dCQUNsQixNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxTQUFTO1FBQ1gsQ0FBQztRQUVELElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDN0IsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNYLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDZCxTQUFTO1FBQ1gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2xCLElBQUksRUFBRSxDQUFDO1lBQ1AsU0FBUztRQUNYLENBQUM7UUFFRCxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixPQUFPLElBQUksSUFBSSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLEVBQUUsQ0FBQztJQUVQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvcnRhYmxlIHN1YnByb2Nlc3MgaGVscGVyIGJ1aWx0IG9uIGBjaGlsZF9wcm9jZXNzLnNwYXduYCBhbmQgbGluZSBzdHJlYW1pbmcuXG4gKlxuICogRWFjaCBzdGRpbyBmZCBkZWZhdWx0cyB0byBgXCJpbmhlcml0XCJgLiB7QGxpbmsgc3Bhd259IHN0cmVhbXMgb3V0cHV0XG4gKiBsaW5lLWJ5LWxpbmUgaW50byB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRvdXRMaW5lc31cbiAqIC8ge0BsaW5rIEV4ZWNSZXN1bHQuc3RkZXJyTGluZXN9OyBpdHMgYHN0ZG91dGAgLyBgc3RkZXJyYCBnZXR0ZXJzIGpvaW4gdGhvc2UgbGluZXMuXG4gKiB7QGxpbmsgc3Bhd25TeW5jfSBrZWVwcyB0aGUgY2FwdHVyZWQgc3RyaW5nOyBpdHMgYHN0ZG91dGAgLyBgc3RkZXJyYCBnZXR0ZXJzIHJlYWRcbiAqIHRoYXQgc3RyaW5nIGRpcmVjdGx5IChsaW5lIGFycmF5cyBzcGxpdCBsYXppbHkgb24gcmVhZCkuXG4gKiBPbWl0dGVkIGB0cmltYCAoZGVmYXVsdCkgYXBwbGllcyBhZGFwdGl2ZSBub3JtYWxpemF0aW9uOiB7QGxpbmsgc3Bhd25TeW5jfSBkcm9wc1xuICogYXQgbW9zdCBvbmUgdHJhaWxpbmcgZW1wdHkgbGluZSAvIG5ld2xpbmUgYHNwYXduU3luY2AgYWRkczsge0BsaW5rIHNwYXdufSBkb2VzXG4gKiBub3QgKHJlYWRsaW5lIG5ldmVyIGVtaXRzIHRoYXQgZXh0cmEgbGluZSkuIGB0cmltOiB0cnVlYCBzdHJpcHMgYWxsIGxlYWRpbmcvXG4gKiB0cmFpbGluZyB3aGl0ZXNwYWNlIGluIGJvdGggbW9kZXM7IGB0cmltOiBmYWxzZWAgbGVhdmVzIG91dHB1dCB1bmNoYW5nZWQuXG4gKlxuICogVGhpcyBtb2R1bGUgb3ducyBzdWJwcm9jZXNzIGV4ZWN1dGlvbiBwb2xpY3kgZm9yIE5vZGUgYW5kIEJ1biBwYWNrYWdlcy4gUmV1c2VcbiAqIGl0IGluc3RlYWQgb2Ygd3JhcHBpbmcgYGNoaWxkX3Byb2Nlc3NgIGxvY2FsbHkgd2hlbiBjYWxsZXJzIG5lZWQgY29uc2lzdGVudFxuICogYXJndiBwYXJzaW5nLCBzdGRpbyBjYXB0dXJlLCBsaW5lIGNhbGxiYWNrcywgY2FuY2VsbGF0aW9uLCBhbmQgZXhpdCBjaGVja2luZy5cbiAqXG4gKiBAZXhhbXBsZSBDYXB0dXJlIGNvbW1hbmQgb3V0cHV0XG4gKiBgYGB0c1xuICogY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWMoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1zaG93LXRvcGxldmVsXCJdLCB7XG4gKiAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gKiAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAqICAgc3RkaW46IFwiaWdub3JlXCIsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFN0cmVhbSBhbmQgY2FwdHVyZSB0b2dldGhlclxuICogYGBgdHNcbiAqIGF3YWl0IGV4ZWMoXCJwbnBtXCIsIFtcImluc3RhbGxcIl0sIHtcbiAqICAgc3Rkb3V0OiBbKGxpbmUpID0+IGNvbnNvbGUubG9nKGxpbmUpLCBcImNhcHR1cmVcIl0sXG4gKiAgIGNoZWNrOiB0cnVlLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBTeW5jaHJvbm91cyBjYXB0dXJlIChubyBsaW5lIGNhbGxiYWNrcylcbiAqIGBgYHRzXG4gKiBjb25zdCB7IHN0ZG91dCB9ID0gZXhlY1N5bmMoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1zaG93LXRvcGxldmVsXCJdLCB7XG4gKiAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gKiAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAqICAgc3RkaW46IFwiaWdub3JlXCIsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHtcbiAgdHlwZSBDaGlsZFByb2Nlc3MsXG4gIHR5cGUgU3Bhd25PcHRpb25zLFxuICBzcGF3biBhcyBub2RlU3Bhd24sXG4gIHNwYXduU3luYyBhcyBub2RlU3Bhd25TeW5jLFxufSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tIFwibm9kZTpyZWFkbGluZVwiO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB7IGZpbmlzaGVkIH0gZnJvbSBcIm5vZGU6c3RyZWFtL3Byb21pc2VzXCI7XG5cbi8qKiBTaGVsbC1jb21wYXRpYmxlIGV4aXQgY29kZSByZXR1cm5lZCB3aGVuIGFuIGV4ZWN1dGFibGUgY2Fubm90IGJlIGZvdW5kLiAqL1xuZXhwb3J0IGNvbnN0IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERSA9IDEyNztcblxuLyoqIFN0ZGlvIG1vZGUgZm9yIGEgc3VicHJvY2VzcyBmZC4gKi9cbmV4cG9ydCB0eXBlIEV4ZWNTdGRpbyA9IFwiaW5oZXJpdFwiIHwgXCJwaXBlXCIgfCBcImlnbm9yZVwiO1xuXG4vKiogSW52b2tlZCBvbmNlIHBlciBvdXRwdXQgbGluZSB3aGVuIGEgZmQgaXMgcGlwZWQuICovXG5leHBvcnQgdHlwZSBMaW5lSGFuZGxlciA9IChsaW5lOiBzdHJpbmcpID0+IHZvaWQ7XG5cbi8qKiBTdHJlYW0gbGluZXMgdG8gYSBoYW5kbGVyIHdpdGggb3B0aW9uYWwgcmVzdWx0IGNhcHR1cmUuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmVPdXRwdXRPcHRpb25zIHtcbiAgLyoqIEludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmUuICovXG4gIG9uTGluZTogTGluZUhhbmRsZXI7XG4gIC8qKiBSZXRhaW4gbGluZXMgaW4gdGhlIGNvbXBsZXRlZCByZXN1bHQuIERlZmF1bHRzIHRvIGB0cnVlYC4gKi9cbiAgY2FwdHVyZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU3RkaW8gY29uZmlnIGZvciBvbmUgZmQuXG4gKlxuICogLSBgXCJpbmhlcml0XCJgIC8gYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCDigJQgcGFzcyB0aHJvdWdoIHRvIGBzcGF3bmBcbiAqIC0gYFwiY2FwdHVyZVwiYCDigJQgcGlwZSB0aGUgZmQgYW5kIGFwcGVuZCBlYWNoIGxpbmUgdG8gdGhlIHJlc3VsdFxuICogLSB7QGxpbmsgTGluZUhhbmRsZXJ9IOKAlCBwaXBlIGFuZCBpbnZva2UgdGhlIGhhbmRsZXIgcGVyIGxpbmUgKGxpbmVzIGFyZSBzdGlsbCBjYXB0dXJlZClcbiAqIC0ge0BsaW5rIExpbmVPdXRwdXRPcHRpb25zfSDigJQgcGlwZSBhbmQgaW52b2tlIHRoZSBoYW5kbGVyLCB3aXRoIG9wdGlvbmFsIGNhcHR1cmVcbiAqIC0gYChMaW5lSGFuZGxlciB8IFwiY2FwdHVyZVwiKVtdYCDigJQgcGlwZTsgYFwiY2FwdHVyZVwiYCBpcyBhIG5vLW9wIG1hcmtlciwgaGFuZGxlcnMgcnVuIHBlciBsaW5lXG4gKi9cbmV4cG9ydCB0eXBlIFN0ZGlvT3B0aW9uID1cbiAgRXhlY1N0ZGlvIHwgTGluZUhhbmRsZXIgfCBMaW5lT3V0cHV0T3B0aW9ucyB8IFwiY2FwdHVyZVwiIHwgKExpbmVIYW5kbGVyIHwgXCJjYXB0dXJlXCIpW107XG5cbi8qKiBPdXRjb21lIG9mIHtAbGluayBzcGF3bn0gLyB7QGxpbmsgc3Bhd25TeW5jfTogZXhpdCBjb2RlLCBjYXB0dXJlZCBvdXRwdXQsIGFuZCBsaW5lIHZpZXdzLiAqL1xuZXhwb3J0IHR5cGUgRXhlY1Jlc3VsdCA9IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCBsaW5lcy4gRm9yIHtAbGluayBzcGF3bn0gdGhlc2UgYXJlIGJ1aWx0IHdoaWxlIHRoZSBwcm9jZXNzIHJ1bnM7XG4gICAqIGZvciB7QGxpbmsgc3Bhd25TeW5jfSB0aGV5IGFyZSBzcGxpdCBmcm9tIHRoZSBjYXB0dXJlZCBzdHJpbmcgb24gZmlyc3QgcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZG91dExpbmVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciBsaW5lcy4gRm9yIHtAbGluayBzcGF3bn0gdGhlc2UgYXJlIGJ1aWx0IHdoaWxlIHRoZSBwcm9jZXNzIHJ1bnM7XG4gICAqIGZvciB7QGxpbmsgc3Bhd25TeW5jfSB0aGV5IGFyZSBzcGxpdCBmcm9tIHRoZSBjYXB0dXJlZCBzdHJpbmcgb24gZmlyc3QgcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZGVyckxpbmVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCB0ZXh0LiB7QGxpbmsgc3Bhd25TeW5jfSByZWFkcyB0aGUgY2FwdHVyZWQgc3RyaW5nO1xuICAgKiB7QGxpbmsgc3Bhd259IGpvaW5zIHtAbGluayBzdGRvdXRMaW5lc30uIFNlZSBgdHJpbWAgZm9yIG5vcm1hbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciB0ZXh0LiB7QGxpbmsgc3Bhd25TeW5jfSByZWFkcyB0aGUgY2FwdHVyZWQgc3RyaW5nO1xuICAgKiB7QGxpbmsgc3Bhd259IGpvaW5zIHtAbGluayBzdGRlcnJMaW5lc30uIFNlZSBgdHJpbWAgZm9yIG5vcm1hbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbn07XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgc3Bhd259IHJldHVybnM6IHRoZSBMSVZFIGBDaGlsZFByb2Nlc3NgIGhhbmRsZSB0aGF0IGlzIEFMU08gYVxuICogYFByb21pc2U8RXhlY1Jlc3VsdD5gIHJlc29sdmluZyBvbiBleGl0LlxuICpcbiAqIFRoaXMgaXMgYWRkaXRpdmUgLSB0aGUgb2JqZWN0IHN0aWxsIHNhdGlzZmllcyBgUHJvbWlzZTxFeGVjUmVzdWx0PmAsIHNvIGV2ZXJ5XG4gKiBleGlzdGluZyBgYXdhaXQgc3Bhd24oLi4uKWAgLyBgc3Bhd24oLi4uKS50aGVuKC4uLilgIGNhbGxlciBpcyB1bmNoYW5nZWQuIFdoYXRcbiAqIGlzIG5ldyBpcyB0aGF0IHRoZSBzYW1lIHZhbHVlIGlzIHRoZSBsaXZlIGNoaWxkOiBjYWxsZXJzIHRoYXQgd2FudCB0byBzdXBlcnZpc2VcbiAqIGl0IChyZWFkIGAucGlkYCwgYC5raWxsKHNpZ25hbClgLCBsaXN0ZW4gZm9yIGBleGl0YCkgY2FuLCB3aXRob3V0IGEgc2Vjb25kXG4gKiBzcGF3bi4gYEBkYngtdG9vbHMvYXBwa2l0YCdzIGBiaW5kUHJvY2Vzc2AgY29uc3VtZXMgZXhhY3RseSB0aGlzIC0gb25lIGNvZGUgcGF0aFxuICogc3VwZXJ2aXNlcyBib3RoIGEgYmFyZSBgQ2hpbGRQcm9jZXNzYCAoZS5nLiBwb3J0cikgYW5kIGEgYHNwYXduKClgIHJlc3VsdC5cbiAqXG4gKiBAZXhhbXBsZSBBd2FpdCBpdCAodW5jaGFuZ2VkKVxuICogY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIHsgc3Rkb3V0OiBcImNhcHR1cmVcIiB9KTtcbiAqXG4gKiBAZXhhbXBsZSBTdXBlcnZpc2UgaXRcbiAqIGNvbnN0IHByb2MgPSBzcGF3bihcImJ1blwiLCBbXCJzcmMvc2VydmVyLnRzXCJdKTtcbiAqIGN0eC5iaW5kUHJvY2Vzcyhwcm9jKTsgICAgICAgICAgICAvLyBsaXZlIGhhbmRsZVxuICogY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcHJvYzsgIC8vIHN0aWxsIGEgcHJvbWlzZVxuICovXG5leHBvcnQgdHlwZSBDaGlsZFByb2Nlc3NSZXN1bHQgPSBDaGlsZFByb2Nlc3MgJiBQcm9taXNlPEV4ZWNSZXN1bHQ+O1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHNwYXdufS4gRXh0ZW5kcyBgU3Bhd25PcHRpb25zYCBleGNlcHQgYHN0ZGlvYCwgd2hpY2ggaXMgZHJpdmVuIGJ5IGBzdGRpbmAgLyBgc3Rkb3V0YCAvIGBzdGRlcnJgLiAqL1xuZXhwb3J0IHR5cGUgRXhlY09wdGlvbnMgPSBPbWl0PFNwYXduT3B0aW9ucywgXCJzdGRpb1wiPiAmIHtcbiAgLyoqIGBcImluaGVyaXRcImAgYnkgZGVmYXVsdDsgYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCBzZWxlY3QgbW9kZXMsIGFueSBvdGhlciBzdHJpbmcgaXMgaW5wdXQuICovXG4gIHN0ZGluPzogRXhlY1N0ZGlvIHwgc3RyaW5nO1xuICBzdGRvdXQ/OiBTdGRpb09wdGlvbjtcbiAgc3RkZXJyPzogU3RkaW9PcHRpb247XG4gIC8qKiBUaHJvdyB3aGVuIHRoZSBwcm9jZXNzIGV4aXRzIHdpdGggYSBub24temVybyBjb2RlLiAqL1xuICBjaGVjaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPbWl0dGVkIOKAlCBhZGFwdGl2ZSB0cmltICh7QGxpbmsgc3Bhd25TeW5jfSBkcm9wcyBvbmUgc3Bhd24gdHJhaWxpbmcgbmV3bGluZSxcbiAgICoge0BsaW5rIHNwYXdufSBkb2VzIG5vdCk7IGB0cnVlYCDigJQgc3RyaXAgYWxsIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZTtcbiAgICogYGZhbHNlYCDigJQgbGVhdmUgY2FwdHVyZWQgb3V0cHV0IHVuY2hhbmdlZC5cbiAgICovXG4gIHRyaW0/OiBib29sZWFuO1xufTtcblxuLyoqIFN0ZGlvIG1vZGUgZm9yIHtAbGluayBzcGF3blN5bmN9IChubyBwZXItbGluZSBjYWxsYmFja3MpLiAqL1xuZXhwb3J0IHR5cGUgU3luY0V4ZWNTdGRpbyA9IEV4ZWNTdGRpbyB8IFwiY2FwdHVyZVwiO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHNwYXduU3luY30uIFNhbWUgc2hhcGUgYXMge0BsaW5rIEV4ZWNPcHRpb25zfSBidXQgd2l0aG91dCBsaW5lLWhhbmRsZXIgc3RkaW8uICovXG5leHBvcnQgdHlwZSBTeW5jRXhlY09wdGlvbnMgPSBPbWl0PFNwYXduT3B0aW9ucywgXCJzdGRpb1wiPiAmIHtcbiAgLyoqIGBcImluaGVyaXRcImAgYnkgZGVmYXVsdDsgYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCBzZWxlY3QgbW9kZXMsIGFueSBvdGhlciBzdHJpbmcgaXMgaW5wdXQuICovXG4gIHN0ZGluPzogRXhlY1N0ZGlvIHwgc3RyaW5nO1xuICBzdGRvdXQ/OiBTeW5jRXhlY1N0ZGlvO1xuICBzdGRlcnI/OiBTeW5jRXhlY1N0ZGlvO1xuICAvKiogVGhyb3cgd2hlbiB0aGUgcHJvY2VzcyBleGl0cyB3aXRoIGEgbm9uLXplcm8gY29kZS4gKi9cbiAgY2hlY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogT21pdHRlZCDigJQgYWRhcHRpdmUgdHJpbSAoe0BsaW5rIHNwYXduU3luY30gZHJvcHMgb25lIHNwYXduIHRyYWlsaW5nIG5ld2xpbmUsXG4gICAqIHtAbGluayBzcGF3bn0gZG9lcyBub3QpOyBgdHJ1ZWAg4oCUIHN0cmlwIGFsbCBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2U7XG4gICAqIGBmYWxzZWAg4oCUIGxlYXZlIGNhcHR1cmVkIG91dHB1dCB1bmNoYW5nZWQuXG4gICAqL1xuICB0cmltPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd24gc3RkaW8gbW9kZSBwbHVzIGFuIG9wdGlvbmFsIHBlci1saW5lIGNhbGxiYWNrIGFmdGVyIHtAbGluayByZXNvbHZlU3RkaW99XG4gKiBtYXBzIGEge0BsaW5rIFN0ZGlvT3B0aW9ufSBpbnRvIHNvbWV0aGluZyBgc3Bhd25gIGNhbiBjb25zdW1lLlxuICovXG50eXBlIFJlc29sdmVkU3RkaW8gPSB7XG4gIC8qKiBWYWx1ZSBwYXNzZWQgdG8gYHNwYXduYCdzIGBzdGRpb2AgdHVwbGUgZm9yIHRoaXMgZmQuICovXG4gIG1vZGU6IEV4ZWNTdGRpbztcbiAgLyoqIFdoZW4gc2V0LCBlYWNoIG91dHB1dCBsaW5lIGlzIGFwcGVuZGVkIHRvIHRoZSBjYXB0dXJlIGJ1ZmZlciBhbmQgZm9yd2FyZGVkIGhlcmUuICovXG4gIG9uTGluZT86IExpbmVIYW5kbGVyO1xufTtcblxuLyoqIFN1cHBvcnRlZCBjb21tYW5kLCBhcmd1bWVudC1hcnJheSwgdmFyaWFkaWMtYXJndW1lbnQsIGFuZCBvcHRpb25zIGNhbGwgZm9ybXMuICovXG5leHBvcnQgdHlwZSBTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4gPVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBvcHRpb25zOiBUXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIC4uLmFyZ3NBbmRPcHRpb25zOiBbLi4uc3RyaW5nW10sIFRdXTtcblxuaW50ZXJmYWNlIFBhcnNlZFNwYXduQXJnczxUIGV4dGVuZHMgU3Bhd25PcHRpb25zPiB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgY29tbWFuZEFyZ3M6IHN0cmluZ1tdO1xuICBvcHRpb25zPzogVDtcbn1cblxuZnVuY3Rpb24gcGFyc2VTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4oaW5wdXQ6IFNwYXduQXJnczxUPik6IFBhcnNlZFNwYXduQXJnczxUPiB7XG4gIGxldCBbdmFsdWUsIC4uLnZhbHVlc10gPSBpbnB1dDtcbiAgY29uc3QgW2NvbW1hbmQsIC4uLmNvbW1hbmRBcmdzXSA9IHNobGV4KHZhbHVlISk7XG5cbiAgY29uc3QgbGFzdCA9IHZhbHVlcy5hdCgtMSk7XG4gIGNvbnN0IG9wdGlvbnMgPVxuICAgIGxhc3QgIT09IG51bGwgJiYgdHlwZW9mIGxhc3QgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkobGFzdCkgPyBsYXN0IDogdW5kZWZpbmVkO1xuICBjb25zdCBhcmd1bWVudFZhbHVlcyA9IG9wdGlvbnMgPyB2YWx1ZXMuc2xpY2UoMCwgLTEpIDogdmFsdWVzO1xuICBjb25zdCB2YWx1ZUFyZ3M6IHN0cmluZ1tdID1cbiAgICBhcmd1bWVudFZhbHVlcy5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcmd1bWVudFZhbHVlc1swXSlcbiAgICAgID8gWy4uLmFyZ3VtZW50VmFsdWVzWzBdXVxuICAgICAgOiBhcmd1bWVudFZhbHVlcztcblxuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6IGNvbW1hbmQhLFxuICAgIGNvbW1hbmRBcmdzOiBbLi4uY29tbWFuZEFyZ3MsIC4uLnZhbHVlQXJnc10sXG4gICAgb3B0aW9uczogb3B0aW9ucyBhcyBULFxuICB9O1xufVxuXG4vKipcbiAqIERyb3AgdGhlIHNpbmdsZSB0cmFpbGluZyBlbXB0eSBlbnRyeSBgc3Bhd25TeW5jYCBhZGRzIHdoZW4gc3BsaXR0aW5nIG9uIGEgZmluYWxcbiAqIG5ld2xpbmUgKGBcImhpXFxuXCJgIC0+IGBbXCJoaVwiLCBcIlwiXWApLiBEb2VzIG5vdCByZW1vdmUgbXVsdGlwbGUgdHJhaWxpbmcgZW1wdGllcy5cbiAqL1xuZnVuY3Rpb24gd2l0aG91dFNwYXduVHJhaWxpbmdFbXB0eUxpbmUobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gXCJcIikge1xuICAgIHJldHVybiBsaW5lcy5zbGljZSgwLCAtMSk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xufVxuXG4vKiogUmVtb3ZlIGF0IG1vc3Qgb25lIHRyYWlsaW5nIG5ld2xpbmUgZnJvbSBjYXB0dXJlZCBzcGF3biBzdGRvdXQvc3RkZXJyIHRleHQuICovXG5mdW5jdGlvbiB0cmltU2luZ2xlVHJhaWxpbmdOZXdsaW5lKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiXFxyXFxuXCIpKSByZXR1cm4gdGV4dC5zbGljZSgwLCAtMik7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiXFxuXCIpKSByZXR1cm4gdGV4dC5zbGljZSgwLCAtMSk7XG4gIHJldHVybiB0ZXh0O1xufVxuXG4vKiogTGluZS1hcnJheSB2aWV3IG9mIGFzeW5jLWNhcHR1cmVkIG91dHB1dC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRBc3luY0xpbmVzKGxpbmVzOiByZWFkb25seSBzdHJpbmdbXSwgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRyaW0gPT09IHRydWUpIHJldHVybiBsaW5lc0Zyb21DYXB0dXJlZE91dHB1dChsaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKSk7XG4gIHJldHVybiBsaW5lcyBhcyBzdHJpbmdbXTtcbn1cblxuLyoqIEpvaW4gYXN5bmMtY2FwdHVyZWQgbGluZXMgaW50byBzdGRvdXQvc3RkZXJyIHRleHQuICovXG5mdW5jdGlvbiBmb3JtYXRBc3luY0NhcHR1cmVkTGluZXMobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgY29uc3Qgam9pbmVkID0gbGluZXMuam9pbihcIlxcblwiKTtcbiAgcmV0dXJuIHRyaW0gPT09IHRydWUgPyBqb2luZWQudHJpbSgpIDogam9pbmVkO1xufVxuXG4vKiogTGluZS1hcnJheSB2aWV3IG9mIHN5bmMtY2FwdHVyZWQgb3V0cHV0LiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplZFN5bmNMaW5lcyhsaW5lczogcmVhZG9ubHkgc3RyaW5nW10sIHRyaW06IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIGlmICh0cmltID09PSBmYWxzZSkgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xuICBpZiAodHJpbSA9PT0gdHJ1ZSkgcmV0dXJuIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KGxpbmVzLmpvaW4oXCJcXG5cIikudHJpbSgpKTtcbiAgcmV0dXJuIHdpdGhvdXRTcGF3blRyYWlsaW5nRW1wdHlMaW5lKGxpbmVzKTtcbn1cblxuLyoqIEZvcm1hdCBzeW5jLWNhcHR1cmVkIHN0ZG91dC9zdGRlcnIgdGV4dC4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN5bmNDYXB0dXJlZFRleHQoXG4gIHRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0cmltID09PSBmYWxzZSkgcmV0dXJuIHRleHQ7XG4gIGlmICh0cmltID09PSB0cnVlKSByZXR1cm4gdGV4dC50cmltKCk7XG4gIHJldHVybiB0cmltU2luZ2xlVHJhaWxpbmdOZXdsaW5lKHRleHQpO1xufVxuXG4vKipcbiAqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciBhIHNwYXduZWQgY29tbWFuZCwgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIEV4ZWN1dGFibGUgbmFtZSBvciBwYXRoXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEByZXR1cm5zIEJhY2t0aWNrLXdyYXBwZWQgYGNvbW1hbmQgYXJnMSBhcmcyIC4uLmAgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNvbW1hbmRMYWJlbChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcXGAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX1cXGBgO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgTm9kZSBmYWlsZWQgdG8gc3Bhd24gYmVjYXVzZSB0aGUgZXhlY3V0YWJsZSB3YXMgbm90IGZvdW5kLiAqL1xuZnVuY3Rpb24gaXNDb21tYW5kTm90Rm91bmRFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCI7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHtAbGluayBzcGF3bn0gd2l0aCBsaXZlIGxpbmUgYXJyYXlzIGFuZCBsYXp5XG4gKiB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVycyBkZXJpdmVkIGZyb20gdGhvc2UgbGluZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUV4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dExpbmVzOiBzdHJpbmdbXSxcbiAgc3RkZXJyTGluZXM6IHN0cmluZ1tdLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgZXhpdENvZGUsXG4gICAgZ2V0IHN0ZG91dExpbmVzKCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRBc3luY0xpbmVzKHN0ZG91dExpbmVzLCB0cmltKTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkQXN5bmNMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3Rkb3V0KCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRvdXRMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20ge0BsaW5rIHNwYXduU3luY30uIENhcHR1cmVkIHN0cmluZ3MgYXJlIHN0b3JlZFxuICogYXMtaXM7IGBzdGRvdXRgIC8gYHN0ZGVycmAgdHJpbSBkaXJlY3RseSwgYW5kIGxpbmUgYXJyYXlzIHNwbGl0IG9ubHkgb24gcmVhZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3luY0V4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dFRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgc3RkZXJyVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIGxldCBzdGRvdXRMaW5lc0NhY2hlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0ZGVyckxpbmVzQ2FjaGU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN5bmNMaW5lcyA9ICh0ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbm9ybWFsaXplZFN5bmNMaW5lcyhsaW5lc0Zyb21DYXB0dXJlZE91dHB1dCh0ZXh0KSwgdHJpbSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZSxcbiAgICBnZXQgc3Rkb3V0TGluZXMoKSB7XG4gICAgICBpZiAoc3Rkb3V0VGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgICBzdGRvdXRMaW5lc0NhY2hlID8/PSBzeW5jTGluZXMoc3Rkb3V0VGV4dCkgPz8gW107XG4gICAgICByZXR1cm4gc3Rkb3V0TGluZXNDYWNoZTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIGlmIChzdGRlcnJUZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgICAgIHN0ZGVyckxpbmVzQ2FjaGUgPz89IHN5bmNMaW5lcyhzdGRlcnJUZXh0KSA/PyBbXTtcbiAgICAgIHJldHVybiBzdGRlcnJMaW5lc0NhY2hlO1xuICAgIH0sXG4gICAgZ2V0IHN0ZG91dCgpIHtcbiAgICAgIHJldHVybiBmb3JtYXRTeW5jQ2FwdHVyZWRUZXh0KHN0ZG91dFRleHQsIHRyaW0pID8/IFwiXCI7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdFN5bmNDYXB0dXJlZFRleHQoc3RkZXJyVGV4dCwgdHJpbSkgPz8gXCJcIjtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdXNlci1zdXBwbGllZCBsaW5lIGhhbmRsZXJzIGZyb20gYSB7QGxpbmsgU3RkaW9PcHRpb259LlxuICpcbiAqIFRoZSBgXCJjYXB0dXJlXCJgIG1hcmtlciBpcyBmaWx0ZXJlZCBvdXQ7IGNhcHR1cmUgaXRzZWxmIGlzIGFsd2F5cyBoYW5kbGVkIGJ5XG4gKiBwdXNoaW5nIGludG8gdGhlIGxpbmUgYnVmZmVyIGluc2lkZSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gU3RkaW8gb3B0aW9uIHRoYXQgbWF5IGVtYmVkIG9uZSBvciBtb3JlIGhhbmRsZXJzXG4gKiBAcmV0dXJucyBIYW5kbGVycyB0byBpbnZva2UgYWZ0ZXIgZWFjaCBjYXB0dXJlZCBsaW5lIChtYXkgYmUgZW1wdHkpXG4gKi9cbmZ1bmN0aW9uIGxpbmVIYW5kbGVycyhvcHRpb246IFN0ZGlvT3B0aW9uKTogTGluZUhhbmRsZXJbXSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbb3B0aW9uXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uKSkge1xuICAgIHJldHVybiBvcHRpb24uZmlsdGVyKChpdGVtKTogaXRlbSBpcyBMaW5lSGFuZGxlciA9PiBpdGVtICE9PSBcImNhcHR1cmVcIik7XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb24gPT09IFwib2JqZWN0XCIpIHJldHVybiBbb3B0aW9uLm9uTGluZV07XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY2FwdHVyZXNMaW5lcyhvcHRpb246IFN0ZGlvT3B0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygb3B0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9uKSB8fCBvcHRpb24uY2FwdHVyZSAhPT0gZmFsc2U7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGEgc3RkaW8gb3B0aW9uIGlzIGEgc3RyaW5nIHNwYXduIG1vZGUgcmF0aGVyIHRoYW4gY2FwdHVyZS9oYW5kbGVycy5cbiAqXG4gKiB7QGxpbmsgcmVzb2x2ZVN0ZGlvfSBzdGlsbCB0cmVhdHMgYFwicGlwZVwiYCBhcyBwaXBlLWFuZC1jYXB0dXJlOyBvbmx5XG4gKiBgXCJpbmhlcml0XCJgIGFuZCBgXCJpZ25vcmVcImAgcmV0dXJuIHdpdGhvdXQgYSBsaW5lIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSBvcHRpb24gLSBTdGRpbyBvcHRpb24gdG8gY2xhc3NpZnlcbiAqIEByZXR1cm5zIFdoZXRoZXIgYG9wdGlvbmAgaXMgYFwiaW5oZXJpdFwiYCwgYFwicGlwZVwiYCwgb3IgYFwiaWdub3JlXCJgXG4gKi9cbmZ1bmN0aW9uIGlzUGFzc3Rocm91Z2hNb2RlKG9wdGlvbjogdW5rbm93bik6IG9wdGlvbiBpcyBFeGVjU3RkaW8ge1xuICByZXR1cm4gb3B0aW9uID09PSBcImluaGVyaXRcIiB8fCBvcHRpb24gPT09IFwicGlwZVwiIHx8IG9wdGlvbiA9PT0gXCJpZ25vcmVcIjtcbn1cblxuLyoqIFRydWUgd2hlbiBzdGRpbiBpcyBkYXRhIHJhdGhlciB0aGFuIG9uZSBvZiB0aGUgdGhyZWUgcmVzZXJ2ZWQgc3RkaW8gbW9kZXMuICovXG5mdW5jdGlvbiBpc1N0ZGluUGF5bG9hZChzdGRpbjogRXhlY1N0ZGlvIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RkaW4gaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBzdGRpbiA9PT0gXCJzdHJpbmdcIiAmJiAhaXNQYXNzdGhyb3VnaE1vZGUoc3RkaW4pO1xufVxuXG4vKipcbiAqIE1hcCBhIHtAbGluayBTdGRpb09wdGlvbn0gaW50byBhIHNwYXduIHN0ZGlvIG1vZGUgYW5kIG9wdGlvbmFsIGxpbmUgY2FsbGJhY2suXG4gKlxuICogUGlwZWQgbW9kZXMgKGBcImNhcHR1cmVcImAsIGBcInBpcGVcImAsIGhhbmRsZXJzLCBhcnJheXMpIGFwcGVuZCBldmVyeSBsaW5lIHRvXG4gKiBgbGluZXNgIGFuZCBpbnZva2UgYW55IGVtYmVkZGVkIGhhbmRsZXJzLiBPbWl0dGVkIG9wdGlvbnMgdXNlIGBkZWZhdWx0TW9kZWAuXG4gKlxuICogQHBhcmFtIG9wdGlvbiAtIENhbGxlciBzdGRpbyBwcmVmZXJlbmNlIGZvciBvbmUgZmRcbiAqIEBwYXJhbSBsaW5lcyAtIE11dGFibGUgYnVmZmVyIHRoYXQgcmVjZWl2ZXMgZWFjaCBwaXBlZCBsaW5lXG4gKiBAcGFyYW0gZGVmYXVsdE1vZGUgLSBTcGF3biBtb2RlIHdoZW4gYG9wdGlvbmAgaXMgb21pdHRlZCAoYFwiaW5oZXJpdFwiYCBieSBkZWZhdWx0KVxuICogQHJldHVybnMgUmVzb2x2ZWQgc3Bhd24gbW9kZSBhbmQgb3B0aW9uYWwgcGVyLWxpbmUgY2FsbGJhY2tcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0ZGlvKFxuICBvcHRpb246IFN0ZGlvT3B0aW9uIHwgdW5kZWZpbmVkLFxuICBsaW5lczogc3RyaW5nW10sXG4gIGRlZmF1bHRNb2RlOiBFeGVjU3RkaW8gPSBcImluaGVyaXRcIixcbik6IFJlc29sdmVkU3RkaW8ge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB7IG1vZGU6IGRlZmF1bHRNb2RlIH07XG4gIGlmIChpc1Bhc3N0aHJvdWdoTW9kZShvcHRpb24pICYmIG9wdGlvbiAhPT0gXCJwaXBlXCIpIHJldHVybiB7IG1vZGU6IG9wdGlvbiB9O1xuXG4gIGNvbnN0IGhhbmRsZXJzID0gbGluZUhhbmRsZXJzKG9wdGlvbik7XG4gIGNvbnN0IGNhcHR1cmUgPSBjYXB0dXJlc0xpbmVzKG9wdGlvbik7XG4gIHJldHVybiB7XG4gICAgbW9kZTogXCJwaXBlXCIsXG4gICAgb25MaW5lOiAobGluZSkgPT4ge1xuICAgICAgaWYgKGNhcHR1cmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIGhhbmRsZXIobGluZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgcmVhZGFibGUgc3RyZWFtIGxpbmUtYnktbGluZSBhbmQgaW52b2tlIGBvbkxpbmVgIGZvciBlYWNoIGNodW5rLlxuICpcbiAqIFVzZXMgYHJlYWRsaW5lYCBzbyBgXFxyXFxuYCBhbmQgYmFyZSBgXFxuYCBhcmUgbm9ybWFsaXplZC4gVGhlIGludGVyZmFjZSBpc1xuICogYWx3YXlzIGNsb3NlZCBpbiBhIGBmaW5hbGx5YCBibG9jay5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdGRvdXQgb3Igc3RkZXJyIHN0cmVhbVxuICogQHBhcmFtIG9uTGluZSAtIENhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZExpbmVzKHN0cmVhbTogUmVhZGFibGUsIG9uTGluZTogTGluZUhhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogc3RyZWFtLCBjcmxmRGVsYXk6IEluZmluaXR5IH0pO1xuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBybCkgb25MaW5lKGxpbmUpO1xuICB9IGZpbmFsbHkge1xuICAgIHJsLmNsb3NlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGFydCBhIGJhY2tncm91bmQgbGluZSByZWFkIHdoZW4gdGhlIHJlc29sdmVkIGhhbmRsZXIgcGlwZXMgYSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHJlYWRzIC0gUHJvbWlzZSBsaXN0IGF3YWl0ZWQgYmVmb3JlIHJldHVybmluZyB0aGUge0BsaW5rIEV4ZWNSZXN1bHR9XG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdHJlYW0gZm9yIHRoaXMgZmQgKGBudWxsYCB3aGVuIHVuYXZhaWxhYmxlKVxuICogQHBhcmFtIGhhbmRsZXIgLSBSZXNvbHZlZCBzdGRpbyBjb25maWcgZnJvbSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfVxuICovXG5mdW5jdGlvbiBxdWV1ZUxpbmVSZWFkcyhcbiAgcmVhZHM6IFByb21pc2U8dm9pZD5bXSxcbiAgc3RyZWFtOiBSZWFkYWJsZSB8IG51bGwsXG4gIGhhbmRsZXI6IFJlc29sdmVkU3RkaW8sXG4pOiB2b2lkIHtcbiAgaWYgKGhhbmRsZXIub25MaW5lICYmIHN0cmVhbSkgcmVhZHMucHVzaChyZWFkTGluZXMoc3RyZWFtLCBoYW5kbGVyLm9uTGluZSkpO1xufVxuXG4vKipcbiAqIFdyaXRlIHN0cmluZyBzdGRpbiB0byBhIHNwYXduZWQgcHJvY2VzcyBhbmQgY2xvc2UgdGhlIHN0cmVhbS5cbiAqXG4gKiBOby1vcCB1bmxlc3MgYHN0ZGluYCBpcyBhIHBheWxvYWQgc3RyaW5nIChub3QgYSBzdGRpbyBtb2RlKSBhbmRcbiAqIGBwcm9jLnN0ZGluYCBpcyBhdmFpbGFibGUuIEEgY2hpbGQgdGhhdCBleGl0cyBiZWZvcmUgY29uc3VtaW5nIHRoZSBwYXlsb2FkXG4gKiBjbG9zZXMgaXRzIHBpcGU7IEVQSVBFIGlzIGV4cGVjdGVkIGluIHRoYXQgY2FzZSBhbmQgaXMgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcGFyYW0gc3RkaW4gLSBTdGRpbyBtb2RlIG9yIHN0cmluZyBwYXlsb2FkIGZyb20ge0BsaW5rIEV4ZWNPcHRpb25zfVxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN0ZGluKFxuICBwcm9jOiBDaGlsZFByb2Nlc3MsXG4gIHN0ZGluOiBFeGVjU3RkaW8gfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1N0ZGluUGF5bG9hZChzdGRpbikgfHwgIXByb2Muc3RkaW4pIHJldHVybjtcbiAgY29uc3QgY29tcGxldGlvbiA9IGZpbmlzaGVkKHByb2Muc3RkaW4sIHsgY2xlYW51cDogdHJ1ZSB9KTtcbiAgcHJvYy5zdGRpbi5lbmQoc3RkaW4pO1xuICB0cnkge1xuICAgIGF3YWl0IGNvbXBsZXRpb247XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVyciAmJiBlcnIuY29kZSA9PT0gXCJFUElQRVwiKSkgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogQXdhaXQgcHJvY2VzcyBleGl0IGFuZCBub3JtYWxpemUgYSBtaXNzaW5nIGV4aXQgY29kZSB0byBgMWAuXG4gKlxuICogUmVqZWN0cyB3aGVuIHNwYXduIGZhaWxzIGJlZm9yZSBgY2xvc2VgIChlLmcuIGV4ZWN1dGFibGUgbm90IGZvdW5kKS5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcmV0dXJucyBSZXNvbHZlZCBleGl0IGNvZGVcbiAqL1xuZnVuY3Rpb24gd2FpdEZvckV4aXQocHJvYzogQ2hpbGRQcm9jZXNzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBwcm9jLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgIHByb2Mub25jZShcImNsb3NlXCIsIChjb2RlKSA9PiByZXNvbHZlKGNvZGUgPz8gMSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBgRXJyb3JgIGZvciBhIG5vbi16ZXJvIGV4aXQgd2hlbiB7QGxpbmsgRXhlY09wdGlvbnMuY2hlY2t9IGlzIHNldC5cbiAqXG4gKiBQcmVmZXJzIHRyaW1tZWQgc3RkZXJyIHRleHQsIHRoZW4gc3Rkb3V0LCBpbiB0aGUgbWVzc2FnZSBib2R5LlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSBuYW1lIG9yIHBhdGhcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHJlc3VsdCAtIENvbXBsZXRlZCBleGVjIG91dGNvbWUgd2l0aCBjYXB0dXJlZCBvdXRwdXRcbiAqIEByZXR1cm5zIEVycm9yIHN1aXRhYmxlIGZvciB0aHJvd2luZyBmcm9tIHtAbGluayBzcGF3bn1cbiAqL1xuZnVuY3Rpb24gZXhlY0Vycm9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIHJlc3VsdDogRXhlY1Jlc3VsdCk6IEVycm9yIHtcbiAgY29uc3QgZGV0YWlsID0gcmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0O1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGAke2NvbW1hbmRMYWJlbChjb21tYW5kLCBhcmdzKX0gZmFpbGVkIChleGl0ICR7cmVzdWx0LmV4aXRDb2RlfSkke2RldGFpbCA/IGA6ICR7ZGV0YWlsfWAgOiBcIlwifWAsXG4gICk7XG59XG5cbi8qKlxuICogTWFwIGEge0BsaW5rIFN5bmNFeGVjU3RkaW99IG9wdGlvbiB0byBhIGBzcGF3blN5bmNgIHN0ZGlvIG1vZGUuXG4gKlxuICogYFwiY2FwdHVyZVwiYCBwaXBlcyB0aGUgZmQgc28gb3V0cHV0IGNhbiBiZSByZWFkIGludG8gdGhlIHtAbGluayBFeGVjUmVzdWx0fS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gQ2FsbGVyIHN0ZGlvIHByZWZlcmVuY2UgZm9yIG9uZSBmZFxuICogQHBhcmFtIGRlZmF1bHRNb2RlIC0gU3Bhd24gbW9kZSB3aGVuIGBvcHRpb25gIGlzIG9taXR0ZWQgKGBcImluaGVyaXRcImAgYnkgZGVmYXVsdClcbiAqIEByZXR1cm5zIFZhbHVlIGZvciB0aGUgYHNwYXduU3luY2Agc3RkaW8gdHVwbGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN5bmNTdGRpbyhcbiAgb3B0aW9uOiBTeW5jRXhlY1N0ZGlvIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0TW9kZTogRXhlY1N0ZGlvID0gXCJpbmhlcml0XCIsXG4pOiBFeGVjU3RkaW8ge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0TW9kZTtcbiAgaWYgKG9wdGlvbiA9PT0gXCJjYXB0dXJlXCIpIHJldHVybiBcInBpcGVcIjtcbiAgcmV0dXJuIG9wdGlvbjtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGBzcGF3blN5bmNgIG91dHB1dCB0byBhIFVURi04IHN0cmluZyB3aGVuIGNhcHR1cmUgaXMgZW5hYmxlZC5cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZWRUZXh0KG91dHB1dDogc3RyaW5nIHwgQnVmZmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvdXRwdXQgPT09IG51bGwgfHwgb3V0cHV0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiID8gb3V0cHV0IDogb3V0cHV0LnRvU3RyaW5nKFwidXRmOFwiKTtcbn1cblxuLyoqXG4gKiBTcGxpdCBjYXB0dXJlZCBwcm9jZXNzIG91dHB1dCBpbnRvIGxpbmVzIGZvciB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRvdXRMaW5lc30gL1xuICoge0BsaW5rIEV4ZWNSZXN1bHQuc3RkZXJyTGluZXN9ICh7QGxpbmsgc3Bhd25TeW5jfSBvbmx5OyBpbnZva2VkIGxhemlseSkuXG4gKi9cbmZ1bmN0aW9uIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoL1xcclxcbi9nLCBcIlxcblwiKS5yZXBsYWNlKC9cXHIvZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG59XG5cbi8qKlxuICogU3Bhd24gYSBzdWJwcm9jZXNzLiBSZXR1cm5zIHRoZSBMSVZFIGNoaWxkIGhhbmRsZSB0aGF0IGlzIEFMU08gYVxuICogYFByb21pc2U8RXhlY1Jlc3VsdD5gIHJlc29sdmluZyBvbiBleGl0IC0gc2VlIHtAbGluayBDaGlsZFByb2Nlc3NSZXN1bHR9LlxuICpcbiAqIFRoZSBwcm9taXNlIGhhbGYgaXMgdGhlIGV4YWN0IGJlaGF2aW91ciB0aGlzIGZ1bmN0aW9uIGhhZCBiZWZvcmU6IGl0IGF3YWl0c1xuICogZXhpdCAoYW5kIGFueSBsaW5lIHJlYWRzIC8gc3RkaW4gd3JpdGUpLCB0aGVuIHJlc29sdmVzIHRvIHRoZSB7QGxpbmsgRXhlY1Jlc3VsdH1cbiAqIG9yIHJlamVjdHMgKHNwYXduIGVycm9yIG90aGVyIHRoYW4gYSBtaXNzaW5nIGV4ZWN1dGFibGUsIG9yIGBjaGVja2Agb24gbm9uLXplcm9cbiAqIGV4aXQpLiBFeGlzdGluZyBgYXdhaXQgc3Bhd24oLi4uKWAgY2FsbGVycyBhcmUgdW5hZmZlY3RlZC4gVGhlIGhhbmRsZSBoYWxmIGxldHMgYVxuICogY2FsbGVyIHN1cGVydmlzZSB0aGUgcHJvY2VzcyAoYC5waWRgLCBgLmtpbGwoc2lnbmFsKWAsIGBleGl0YCBldmVudCkgd2l0aG91dCBhXG4gKiBzZWNvbmQgc3Bhd24gLSBlLmcuIGBAZGJ4LXRvb2xzL2FwcGtpdGAncyBgYmluZFByb2Nlc3NgLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSB0byBydW4gKHJlc29sdmVkIG9uIGBQQVRIYCB3aGVuIGBzaGVsbGAgaXMgc2V0IG9uIG9wdGlvbnMpXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdmVyYmF0aW0gdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gU3Bhd24sIHN0ZGlvLCBhbmQgY2hlY2sgb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGxpdmUgYENoaWxkUHJvY2Vzc2AsIGF3YWl0YWJsZSB0byBleGl0IGNvZGUgKyBjYXB0dXJlZCBvdXRwdXRcbiAqIEB0aHJvd3MgKG9uIHRoZSBwcm9taXNlKSBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZ1xuICogZXhlY3V0YWJsZSwgbGluZSByZWFkcyBmYWlsLCBvciBgY2hlY2tgIGlzIHRydWUgYW5kIGV4aXQgY29kZSBpcyBub24temVyb1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3Bhd24oLi4uYXJnczogU3Bhd25BcmdzPEV4ZWNPcHRpb25zPik6IENoaWxkUHJvY2Vzc1Jlc3VsdCB7XG4gIGNvbnN0IHsgY29tbWFuZCwgY29tbWFuZEFyZ3MsIG9wdGlvbnMgPSB7fSB9ID0gcGFyc2VTcGF3bkFyZ3MoYXJncyk7XG4gIGNvbnN0IHsgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBjaGVjaywgdHJpbSwgLi4uc3Bhd25PcHRzIH0gPSBvcHRpb25zO1xuICBjb25zdCBzdGRvdXRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RkZXJyTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0ZG91dEhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3Rkb3V0LCBzdGRvdXRMaW5lcyk7XG4gIGNvbnN0IHN0ZGVyckhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3RkZXJyLCBzdGRlcnJMaW5lcyk7XG4gIGNvbnN0IHN0ZGluTW9kZTogRXhlY1N0ZGlvID0gaXNTdGRpblBheWxvYWQoc3RkaW4pID8gXCJwaXBlXCIgOiAoc3RkaW4gPz8gXCJpbmhlcml0XCIpO1xuXG4gIGNvbnN0IHByb2MgPSBub2RlU3Bhd24oY29tbWFuZCwgY29tbWFuZEFyZ3MsIHtcbiAgICAuLi5zcGF3bk9wdHMsXG4gICAgc3RkaW86IFtzdGRpbk1vZGUsIHN0ZG91dEhhbmRsZXIubW9kZSwgc3RkZXJySGFuZGxlci5tb2RlXSxcbiAgfSk7XG5cbiAgY29uc3Qgc3RkaW5Xcml0ZSA9IHdyaXRlU3RkaW4ocHJvYywgc3RkaW4pO1xuXG4gIGNvbnN0IHJlYWRzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3Rkb3V0LCBzdGRvdXRIYW5kbGVyKTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3RkZXJyLCBzdGRlcnJIYW5kbGVyKTtcblxuICBjb25zdCBjb21wbGV0aW9uID0gKGFzeW5jICgpOiBQcm9taXNlPEV4ZWNSZXN1bHQ+ID0+IHtcbiAgICBsZXQgZXhpdENvZGUgPSAxO1xuICAgIGxldCBjb21tYW5kTm90Rm91bmRFcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBleGl0Q29kZSA9IGF3YWl0IHdhaXRGb3JFeGl0KHByb2MpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoIWlzQ29tbWFuZE5vdEZvdW5kRXJyb3IoZXJyKSkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHByb2Muc3RkaW4/LmRlc3Ryb3koKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5kZXN0cm95KCk7XG4gICAgICBwcm9jLnN0ZGVycj8uZGVzdHJveSgpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtzdGRpbldyaXRlXSk7XG4gICAgICBmb3IgKGNvbnN0IHJlYWQgb2YgcmVhZHMpIHZvaWQgcmVhZC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgY29tbWFuZE5vdEZvdW5kRXJyb3IgPSBlcnI7XG4gICAgICBleGl0Q29kZSA9IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRMaW5lcywgc3RkZXJyTGluZXMsIHRyaW0pO1xuICAgIGlmIChjaGVjayAmJiByZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgcmVzdWx0KTtcbiAgICAgIGlmIChjb21tYW5kTm90Rm91bmRFcnJvcikgZXJyLmNhdXNlID0gY29tbWFuZE5vdEZvdW5kRXJyb3I7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pKCk7XG5cbiAgLy8gQXR0YWNoIHRoZSBwcm9taXNlIGludGVyZmFjZSBvbnRvIHRoZSBsaXZlIGNoaWxkIHNvIE9ORSBvYmplY3QgaXMgYm90aC4gVGhlXG4gIC8vIG1ldGhvZHMgYXJlIGJvdW5kIHRvIGBjb21wbGV0aW9uYCBzbyBgdGhpc2AgaXMgdGhlIHJlYWwgcHJvbWlzZTsgdGhlIGNoaWxkXG4gIC8vIG93bnMgbm8gY29uZmxpY3RpbmcgYHRoZW5gL2BjYXRjaGAvYGZpbmFsbHlgLCBzbyB0aGlzIGlzIHB1cmVseSBhZGRpdGl2ZS5cbiAgcmV0dXJuIGF0dGFjaFByb21pc2UocHJvYywgY29tcGxldGlvbik7XG59XG5cbi8qKlxuICogQXR0YWNoIGEgcHJvbWlzZSdzIGB0aGVuYCAvIGBjYXRjaGAgLyBgZmluYWxseWAgb250byBhIGxpdmUgb2JqZWN0LCByZXR1cm5pbmdcbiAqIHRoZSBzYW1lIG9iamVjdCB0eXBlZCBhcyBib3RoLiBVc2VkIGJ5IHtAbGluayBzcGF3bn0gdG8gbWFrZSBpdHMgYENoaWxkUHJvY2Vzc2BcbiAqIGF3YWl0YWJsZSB3aXRob3V0IHdyYXBwaW5nIGl0IC0gc28gY2FsbGVycyBrZWVwIHRoZSBsaXZlIGhhbmRsZSBBTkQgYGF3YWl0YCBpdC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoUHJvbWlzZTxUIGV4dGVuZHMgb2JqZWN0LCBSPih0YXJnZXQ6IFQsIHByb21pc2U6IFByb21pc2U8Uj4pOiBUICYgUHJvbWlzZTxSPiB7XG4gIGNvbnN0IGh5YnJpZCA9IHRhcmdldCBhcyBUICYgUHJvbWlzZTxSPjtcbiAgaHlicmlkLnRoZW4gPSBwcm9taXNlLnRoZW4uYmluZChwcm9taXNlKTtcbiAgaHlicmlkLmNhdGNoID0gcHJvbWlzZS5jYXRjaC5iaW5kKHByb21pc2UpO1xuICBoeWJyaWQuZmluYWxseSA9IHByb21pc2UuZmluYWxseS5iaW5kKHByb21pc2UpO1xuICByZXR1cm4gaHlicmlkO1xufVxuXG4vKipcbiAqIFNwYXduIGEgc3VicHJvY2VzcyBzeW5jaHJvbm91c2x5IGFuZCB3YWl0IGZvciBleGl0LlxuICpcbiAqIFVubGlrZSB7QGxpbmsgc3Bhd259LCBzdGRpbyBvcHRpb25zIGFyZSBsaW1pdGVkIHRvIGBcImluaGVyaXRcImAsIGBcInBpcGVcImAsXG4gKiBgXCJpZ25vcmVcImAsIGFuZCBgXCJjYXB0dXJlXCJgIOKAlCBubyBwZXItbGluZSBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBFeGVjdXRhYmxlIHRvIHJ1biAocmVzb2x2ZWQgb24gYFBBVEhgIHdoZW4gYHNoZWxsYCBpcyBzZXQgb24gb3B0aW9ucylcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB2ZXJiYXRpbSB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHNwYXduU3luYyAtIFNwYXduLCBzdGRpbywgYW5kIGNoZWNrIG9wdGlvbnNcbiAqIEByZXR1cm5zIEV4aXQgY29kZSwgY2FwdHVyZWQgbGluZSBhcnJheXMsIGFuZCB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVyc1xuICogQHRocm93cyBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZyBleGVjdXRhYmxlLCBvclxuICogYGNoZWNrYCBpcyB0cnVlIGFuZCBleGl0IGNvZGUgaXMgbm9uLXplcm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyguLi5hcmdzOiBTcGF3bkFyZ3M8U3luY0V4ZWNPcHRpb25zPik6IEV4ZWNSZXN1bHQge1xuICBjb25zdCB7IGNvbW1hbmQsIGNvbW1hbmRBcmdzLCBvcHRpb25zID0ge30gfSA9IHBhcnNlU3Bhd25BcmdzKGFyZ3MpO1xuICBjb25zdCB7IHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgY2hlY2ssIHRyaW0sIC4uLnNwYXduT3B0cyB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3RkaW5Nb2RlOiBFeGVjU3RkaW8gPSBpc1N0ZGluUGF5bG9hZChzdGRpbikgPyBcInBpcGVcIiA6IChzdGRpbiA/PyBcImluaGVyaXRcIik7XG4gIGNvbnN0IGNhcHR1cmVTdGRvdXQgPSBzdGRvdXQgPT09IFwiY2FwdHVyZVwiO1xuICBjb25zdCBjYXB0dXJlU3RkZXJyID0gc3RkZXJyID09PSBcImNhcHR1cmVcIjtcbiAgY29uc3Qgc3Rkb3V0TW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3Rkb3V0KTtcbiAgY29uc3Qgc3RkZXJyTW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3RkZXJyKTtcblxuICBjb25zdCByZXN1bHQgPSBub2RlU3Bhd25TeW5jKGNvbW1hbmQsIGNvbW1hbmRBcmdzLCB7XG4gICAgLi4uc3Bhd25PcHRzLFxuICAgIGVuY29kaW5nOiBjYXB0dXJlU3Rkb3V0IHx8IGNhcHR1cmVTdGRlcnIgPyBcInV0ZjhcIiA6IHVuZGVmaW5lZCxcbiAgICBzdGRpbzogW3N0ZGluTW9kZSwgc3Rkb3V0TW9kZSwgc3RkZXJyTW9kZV0sXG4gICAgaW5wdXQ6IGlzU3RkaW5QYXlsb2FkKHN0ZGluKSA/IHN0ZGluIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICBjb25zdCBjb21tYW5kTm90Rm91bmQgPSBpc0NvbW1hbmROb3RGb3VuZEVycm9yKHJlc3VsdC5lcnJvcik7XG4gIGNvbnN0IGV4aXRDb2RlID0gY29tbWFuZE5vdEZvdW5kID8gQ09NTUFORF9OT1RfRk9VTkRfRVhJVF9DT0RFIDogKHJlc3VsdC5zdGF0dXMgPz8gMSk7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSBjYXB0dXJlU3Rkb3V0ID8gY2FwdHVyZWRUZXh0KHJlc3VsdC5zdGRvdXQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGRlcnJUZXh0ID0gY2FwdHVyZVN0ZGVyciA/IGNhcHR1cmVkVGV4dChyZXN1bHQuc3RkZXJyKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGNyZWF0ZVN5bmNFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRUZXh0LCBzdGRlcnJUZXh0LCB0cmltKTtcblxuICBpZiAocmVzdWx0LmVycm9yICYmICghY29tbWFuZE5vdEZvdW5kIHx8IGNoZWNrKSkge1xuICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgZXhlY1Jlc3VsdCk7XG4gICAgZXJyLmNhdXNlID0gcmVzdWx0LmVycm9yO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGlmIChjaGVjayAmJiBleGVjUmVzdWx0LmV4aXRDb2RlICE9PSAwKSB0aHJvdyBleGVjRXJyb3IoY29tbWFuZCwgY29tbWFuZEFyZ3MsIGV4ZWNSZXN1bHQpO1xuICByZXR1cm4gZXhlY1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBzaGVsbC1saWtlIGNvbW1hbmQgaW50byBhcmd2LlxuICpcbiAqIFN1cHBvcnRzOlxuICogICAtIHdoaXRlc3BhY2Ugc2VwYXJhdG9yc1xuICogICAtIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlc1xuICogICAtIGJhY2tzbGFzaCBlc2NhcGluZ1xuICogICAtIGVzY2FwZWQgc3BhY2VzXG4gKiAgIC0gZW1wdHkgcXVvdGVkIHN0cmluZ3NcbiAqXG4gKiBJZiB0aGUgaW5wdXQgaXMgbWFsZm9ybWVkIChmb3IgZXhhbXBsZSwgYW4gdW50ZXJtaW5hdGVkIHF1b3RlKSxcbiAqIHJldHVybnMgdGhlIG9yaWdpbmFsIHN0cmluZyBhcyBhIHNpbmdsZSBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNobGV4KGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICBsZXQgY3VycmVudCA9IFwiXCI7XG4gIGxldCBxdW90ZTogXCInXCIgfCAnXCInIHwgdW5kZWZpbmVkO1xuICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuICBsZXQgcXVvdGVkID0gZmFsc2U7XG5cbiAgY29uc3QgcHVzaCA9ICgpID0+IHtcbiAgICBpZiAocXVvdGVkIHx8IGN1cnJlbnQubGVuZ3RoID4gMCkge1xuICAgICAgYXJncy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cbiAgICBjdXJyZW50ID0gXCJcIjtcbiAgICBxdW90ZWQgPSBmYWxzZTtcbiAgfTtcblxuICBmb3IgKGNvbnN0IGNoIG9mIGNvbW1hbmQpIHtcbiAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCJcXFxcXCIpIHtcbiAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG4gICAgICAgIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCInXCIgfHwgY2ggPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2g7XG4gICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKC9cXHMvLnRlc3QoY2gpKSB7XG4gICAgICBwdXNoKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjdXJyZW50ICs9IGNoO1xuICB9XG5cbiAgLy8gTWFsZm9ybWVkIGlucHV0OiB0cmVhdCBhcyBhIGxpdGVyYWwgY29tbWFuZC5cbiAgaWYgKHF1b3RlKSB7XG4gICAgcmV0dXJuIFtjb21tYW5kXTtcbiAgfVxuXG4gIC8vIFRyYWlsaW5nIGJhY2tzbGFzaCBpcyBsaXRlcmFsLlxuICBpZiAoZXNjYXBlZCkge1xuICAgIGN1cnJlbnQgKz0gXCJcXFxcXCI7XG4gIH1cblxuICBwdXNoKCk7XG5cbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID8gYXJncyA6IFtjb21tYW5kXTtcbn1cbiJdfQ==
825
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRDRztBQUNILE9BQU8sRUFHTCxLQUFLLElBQUksU0FBUyxFQUNsQixTQUFTLElBQUksYUFBYSxHQUMzQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxLQUFLLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDO0FBRS9DLE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxDQUFDO0FBQzNDLE1BQU0sd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBQ3ZDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFDO0FBQzFDLE1BQU0sK0JBQStCLEdBQ25DLHVJQUF1SSxDQUFDO0FBZ0sxSSxTQUFTLGNBQWMsQ0FBeUIsS0FBbUI7SUFDakUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUMvQixNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQU0sQ0FBQyxDQUFDO0lBRWhELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLE9BQU8sR0FDWCxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENB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LEVBQUUsQ0FBQztRQUNaLE9BQU8sSUFBSSxJQUFJLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksRUFBRSxDQUFDO0lBRVAsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUG9ydGFibGUgc3VicHJvY2VzcyBoZWxwZXIgYnVpbHQgb24gYGNoaWxkX3Byb2Nlc3Muc3Bhd25gIGFuZCBsaW5lIHN0cmVhbWluZy5cbiAqXG4gKiBFYWNoIHN0ZGlvIGZkIGRlZmF1bHRzIHRvIGBcImluaGVyaXRcImAuIHtAbGluayBzcGF3bn0gc3RyZWFtcyBvdXRwdXRcbiAqIGxpbmUtYnktbGluZSBpbnRvIHtAbGluayBFeGVjUmVzdWx0LnN0ZG91dExpbmVzfVxuICogLyB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRlcnJMaW5lc307IGl0cyBgc3Rkb3V0YCAvIGBzdGRlcnJgIGdldHRlcnMgam9pbiB0aG9zZSBsaW5lcy5cbiAqIHtAbGluayBzcGF3blN5bmN9IGtlZXBzIHRoZSBjYXB0dXJlZCBzdHJpbmc7IGl0cyBgc3Rkb3V0YCAvIGBzdGRlcnJgIGdldHRlcnMgcmVhZFxuICogdGhhdCBzdHJpbmcgZGlyZWN0bHkgKGxpbmUgYXJyYXlzIHNwbGl0IGxhemlseSBvbiByZWFkKS5cbiAqIE9taXR0ZWQgYHRyaW1gIChkZWZhdWx0KSBhcHBsaWVzIGFkYXB0aXZlIG5vcm1hbGl6YXRpb246IHtAbGluayBzcGF3blN5bmN9IGRyb3BzXG4gKiBhdCBtb3N0IG9uZSB0cmFpbGluZyBlbXB0eSBsaW5lIC8gbmV3bGluZSBgc3Bhd25TeW5jYCBhZGRzOyB7QGxpbmsgc3Bhd259IGRvZXNcbiAqIG5vdCAocmVhZGxpbmUgbmV2ZXIgZW1pdHMgdGhhdCBleHRyYSBsaW5lKS4gYHRyaW06IHRydWVgIHN0cmlwcyBhbGwgbGVhZGluZy9cbiAqIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gYm90aCBtb2RlczsgYHRyaW06IGZhbHNlYCBsZWF2ZXMgb3V0cHV0IHVuY2hhbmdlZC5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIHN1YnByb2Nlc3MgZXhlY3V0aW9uIHBvbGljeSBmb3IgTm9kZSBhbmQgQnVuIHBhY2thZ2VzLiBSZXVzZVxuICogaXQgaW5zdGVhZCBvZiB3cmFwcGluZyBgY2hpbGRfcHJvY2Vzc2AgbG9jYWxseSB3aGVuIGNhbGxlcnMgbmVlZCBjb25zaXN0ZW50XG4gKiBhcmd2IHBhcnNpbmcsIHN0ZGlvIGNhcHR1cmUsIGxpbmUgY2FsbGJhY2tzLCBjYW5jZWxsYXRpb24sIGFuZCBleGl0IGNoZWNraW5nLlxuICpcbiAqIEBleGFtcGxlIENhcHR1cmUgY29tbWFuZCBvdXRwdXRcbiAqIGBgYHRzXG4gKiBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgZXhlYyhcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIHtcbiAqICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAqICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICogICBzdGRpbjogXCJpZ25vcmVcIixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU3RyZWFtIGFuZCBjYXB0dXJlIHRvZ2V0aGVyXG4gKiBgYGB0c1xuICogYXdhaXQgZXhlYyhcInBucG1cIiwgW1wiaW5zdGFsbFwiXSwge1xuICogICBzdGRvdXQ6IFsobGluZSkgPT4gY29uc29sZS5sb2cobGluZSksIFwiY2FwdHVyZVwiXSxcbiAqICAgY2hlY2s6IHRydWUsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFN5bmNocm9ub3VzIGNhcHR1cmUgKG5vIGxpbmUgY2FsbGJhY2tzKVxuICogYGBgdHNcbiAqIGNvbnN0IHsgc3Rkb3V0IH0gPSBleGVjU3luYyhcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIHtcbiAqICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAqICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICogICBzdGRpbjogXCJpZ25vcmVcIixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQge1xuICB0eXBlIENoaWxkUHJvY2VzcyxcbiAgdHlwZSBTcGF3bk9wdGlvbnMsXG4gIHNwYXduIGFzIG5vZGVTcGF3bixcbiAgc3Bhd25TeW5jIGFzIG5vZGVTcGF3blN5bmMsXG59IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRkaXIsIHJlYWRGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gXCJub2RlOnJlYWRsaW5lXCI7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCJub2RlOnN0cmVhbS9jb25zdW1lcnNcIjtcbmltcG9ydCB7IGZpbmlzaGVkIH0gZnJvbSBcIm5vZGU6c3RyZWFtL3Byb21pc2VzXCI7XG5cbi8qKiBTaGVsbC1jb21wYXRpYmxlIGV4aXQgY29kZSByZXR1cm5lZCB3aGVuIGFuIGV4ZWN1dGFibGUgY2Fubm90IGJlIGZvdW5kLiAqL1xuZXhwb3J0IGNvbnN0IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERSA9IDEyNztcblxuY29uc3QgREVGQVVMVF9HUkFDRUZVTF9USU1FT1VUX01TID0gMTBfMDAwO1xuY29uc3QgREVGQVVMVF9GT1JDRV9USU1FT1VUX01TID0gNF8wMDA7XG5jb25zdCBERUZBVUxUX0tJTExfUE9MTF9JTlRFUlZBTF9NUyA9IDEwMDtcbmNvbnN0IFdJTkRPV1NfUFJPQ0VTU19TTkFQU0hPVF9TQ1JJUFQgPVxuICBcIkdldC1DaW1JbnN0YW5jZSBXaW4zMl9Qcm9jZXNzIHwgRm9yRWFjaC1PYmplY3QgeyAnezB9IHsxfSB7Mn0nIC1mICRfLlByb2Nlc3NJZCwgJF8uUGFyZW50UHJvY2Vzc0lkLCAkXy5DcmVhdGlvbkRhdGUuVG9GaWxlVGltZVV0YygpIH1cIjtcblxuLyoqIFN0ZGlvIG1vZGUgZm9yIGEgc3VicHJvY2VzcyBmZC4gKi9cbmV4cG9ydCB0eXBlIEV4ZWNTdGRpbyA9IFwiaW5oZXJpdFwiIHwgXCJwaXBlXCIgfCBcImlnbm9yZVwiO1xuXG4vKiogSW52b2tlZCBvbmNlIHBlciBvdXRwdXQgbGluZSB3aGVuIGEgZmQgaXMgcGlwZWQuICovXG5leHBvcnQgdHlwZSBMaW5lSGFuZGxlciA9IChsaW5lOiBzdHJpbmcpID0+IHZvaWQ7XG5cbi8qKiBTdHJlYW0gbGluZXMgdG8gYSBoYW5kbGVyIHdpdGggb3B0aW9uYWwgcmVzdWx0IGNhcHR1cmUuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmVPdXRwdXRPcHRpb25zIHtcbiAgLyoqIEludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmUuICovXG4gIG9uTGluZTogTGluZUhhbmRsZXI7XG4gIC8qKiBSZXRhaW4gbGluZXMgaW4gdGhlIGNvbXBsZXRlZCByZXN1bHQuIERlZmF1bHRzIHRvIGB0cnVlYC4gKi9cbiAgY2FwdHVyZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU3RkaW8gY29uZmlnIGZvciBvbmUgZmQuXG4gKlxuICogLSBgXCJpbmhlcml0XCJgIC8gYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCDigJQgcGFzcyB0aHJvdWdoIHRvIGBzcGF3bmBcbiAqIC0gYFwiY2FwdHVyZVwiYCDigJQgcGlwZSB0aGUgZmQgYW5kIGFwcGVuZCBlYWNoIGxpbmUgdG8gdGhlIHJlc3VsdFxuICogLSB7QGxpbmsgTGluZUhhbmRsZXJ9IOKAlCBwaXBlIGFuZCBpbnZva2UgdGhlIGhhbmRsZXIgcGVyIGxpbmUgKGxpbmVzIGFyZSBzdGlsbCBjYXB0dXJlZClcbiAqIC0ge0BsaW5rIExpbmVPdXRwdXRPcHRpb25zfSDigJQgcGlwZSBhbmQgaW52b2tlIHRoZSBoYW5kbGVyLCB3aXRoIG9wdGlvbmFsIGNhcHR1cmVcbiAqIC0gYChMaW5lSGFuZGxlciB8IFwiY2FwdHVyZVwiKVtdYCDigJQgcGlwZTsgYFwiY2FwdHVyZVwiYCBpcyBhIG5vLW9wIG1hcmtlciwgaGFuZGxlcnMgcnVuIHBlciBsaW5lXG4gKi9cbmV4cG9ydCB0eXBlIFN0ZGlvT3B0aW9uID1cbiAgRXhlY1N0ZGlvIHwgTGluZUhhbmRsZXIgfCBMaW5lT3V0cHV0T3B0aW9ucyB8IFwiY2FwdHVyZVwiIHwgKExpbmVIYW5kbGVyIHwgXCJjYXB0dXJlXCIpW107XG5cbi8qKiBPdXRjb21lIG9mIHtAbGluayBzcGF3bn0gLyB7QGxpbmsgc3Bhd25TeW5jfTogZXhpdCBjb2RlLCBjYXB0dXJlZCBvdXRwdXQsIGFuZCBsaW5lIHZpZXdzLiAqL1xuZXhwb3J0IHR5cGUgRXhlY1Jlc3VsdCA9IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCBsaW5lcy4gRm9yIHtAbGluayBzcGF3bn0gdGhlc2UgYXJlIGJ1aWx0IHdoaWxlIHRoZSBwcm9jZXNzIHJ1bnM7XG4gICAqIGZvciB7QGxpbmsgc3Bhd25TeW5jfSB0aGV5IGFyZSBzcGxpdCBmcm9tIHRoZSBjYXB0dXJlZCBzdHJpbmcgb24gZmlyc3QgcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZG91dExpbmVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciBsaW5lcy4gRm9yIHtAbGluayBzcGF3bn0gdGhlc2UgYXJlIGJ1aWx0IHdoaWxlIHRoZSBwcm9jZXNzIHJ1bnM7XG4gICAqIGZvciB7QGxpbmsgc3Bhd25TeW5jfSB0aGV5IGFyZSBzcGxpdCBmcm9tIHRoZSBjYXB0dXJlZCBzdHJpbmcgb24gZmlyc3QgcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZGVyckxpbmVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCB0ZXh0LiB7QGxpbmsgc3Bhd25TeW5jfSByZWFkcyB0aGUgY2FwdHVyZWQgc3RyaW5nO1xuICAgKiB7QGxpbmsgc3Bhd259IGpvaW5zIHtAbGluayBzdGRvdXRMaW5lc30uIFNlZSBgdHJpbWAgZm9yIG5vcm1hbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciB0ZXh0LiB7QGxpbmsgc3Bhd25TeW5jfSByZWFkcyB0aGUgY2FwdHVyZWQgc3RyaW5nO1xuICAgKiB7QGxpbmsgc3Bhd259IGpvaW5zIHtAbGluayBzdGRlcnJMaW5lc30uIFNlZSBgdHJpbWAgZm9yIG5vcm1hbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbn07XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgc3Bhd259IHJldHVybnM6IHRoZSBMSVZFIGBDaGlsZFByb2Nlc3NgIGhhbmRsZSB0aGF0IGlzIEFMU08gYVxuICogYFByb21pc2U8RXhlY1Jlc3VsdD5gIHJlc29sdmluZyBvbiBleGl0LlxuICpcbiAqIFRoaXMgaXMgYWRkaXRpdmUgLSB0aGUgb2JqZWN0IHN0aWxsIHNhdGlzZmllcyBgUHJvbWlzZTxFeGVjUmVzdWx0PmAsIHNvIGV2ZXJ5XG4gKiBleGlzdGluZyBgYXdhaXQgc3Bhd24oLi4uKWAgLyBgc3Bhd24oLi4uKS50aGVuKC4uLilgIGNhbGxlciBpcyB1bmNoYW5nZWQuIFdoYXRcbiAqIGlzIG5ldyBpcyB0aGF0IHRoZSBzYW1lIHZhbHVlIGlzIHRoZSBsaXZlIGNoaWxkOiBjYWxsZXJzIHRoYXQgd2FudCB0byBzdXBlcnZpc2VcbiAqIGl0IChyZWFkIGAucGlkYCwgYC5raWxsKHNpZ25hbClgLCBsaXN0ZW4gZm9yIGBleGl0YCkgY2FuLCB3aXRob3V0IGEgc2Vjb25kXG4gKiBzcGF3bi4gYEBkYngtdG9vbHMvYXBwa2l0YCdzIGBiaW5kUHJvY2Vzc2AgY29uc3VtZXMgZXhhY3RseSB0aGlzIC0gb25lIGNvZGUgcGF0aFxuICogc3VwZXJ2aXNlcyBib3RoIGEgYmFyZSBgQ2hpbGRQcm9jZXNzYCAoZS5nLiBwb3J0cikgYW5kIGEgYHNwYXduKClgIHJlc3VsdC5cbiAqXG4gKiBAZXhhbXBsZSBBd2FpdCBpdCAodW5jaGFuZ2VkKVxuICogY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIkhFQURcIl0sIHsgc3Rkb3V0OiBcImNhcHR1cmVcIiB9KTtcbiAqXG4gKiBAZXhhbXBsZSBTdXBlcnZpc2UgaXRcbiAqIGNvbnN0IHByb2MgPSBzcGF3bihcImJ1blwiLCBbXCJzcmMvc2VydmVyLnRzXCJdKTtcbiAqIGN0eC5iaW5kUHJvY2Vzcyhwcm9jKTsgICAgICAgICAgICAvLyBsaXZlIGhhbmRsZVxuICogY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcHJvYzsgIC8vIHN0aWxsIGEgcHJvbWlzZVxuICovXG5leHBvcnQgdHlwZSBDaGlsZFByb2Nlc3NSZXN1bHQgPSBDaGlsZFByb2Nlc3MgJiBQcm9taXNlPEV4ZWNSZXN1bHQ+O1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHNwYXdufS4gRXh0ZW5kcyBgU3Bhd25PcHRpb25zYCBleGNlcHQgYHN0ZGlvYCwgd2hpY2ggaXMgZHJpdmVuIGJ5IGBzdGRpbmAgLyBgc3Rkb3V0YCAvIGBzdGRlcnJgLiAqL1xuZXhwb3J0IHR5cGUgRXhlY09wdGlvbnMgPSBPbWl0PFNwYXduT3B0aW9ucywgXCJzdGRpb1wiPiAmIHtcbiAgLyoqIGBcImluaGVyaXRcImAgYnkgZGVmYXVsdDsgYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCBzZWxlY3QgbW9kZXMsIGFueSBvdGhlciBzdHJpbmcgaXMgaW5wdXQuICovXG4gIHN0ZGluPzogRXhlY1N0ZGlvIHwgc3RyaW5nO1xuICBzdGRvdXQ/OiBTdGRpb09wdGlvbjtcbiAgc3RkZXJyPzogU3RkaW9PcHRpb247XG4gIC8qKiBUaHJvdyB3aGVuIHRoZSBwcm9jZXNzIGV4aXRzIHdpdGggYSBub24temVybyBjb2RlLiAqL1xuICBjaGVjaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPbWl0dGVkIOKAlCBhZGFwdGl2ZSB0cmltICh7QGxpbmsgc3Bhd25TeW5jfSBkcm9wcyBvbmUgc3Bhd24gdHJhaWxpbmcgbmV3bGluZSxcbiAgICoge0BsaW5rIHNwYXdufSBkb2VzIG5vdCk7IGB0cnVlYCDigJQgc3RyaXAgYWxsIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZTtcbiAgICogYGZhbHNlYCDigJQgbGVhdmUgY2FwdHVyZWQgb3V0cHV0IHVuY2hhbmdlZC5cbiAgICovXG4gIHRyaW0/OiBib29sZWFuO1xufTtcblxuLyoqIEdyYWNlZnVsIGFuZCBmb3JjZWQgc2h1dGRvd24gcG9saWN5IGZvciB7QGxpbmsga2lsbH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEtpbGxPcHRpb25zIHtcbiAgLyoqIFNpZ25hbCBzZW50IHRvIHRoZSBzbmFwc2hvdHRlZCBwcm9jZXNzIHRyZWUuIERlZmF1bHRzIHRvIGBTSUdURVJNYC4gKi9cbiAgZ3JhY2VmdWxTaWduYWw/OiBOb2RlSlMuU2lnbmFscztcbiAgLyoqIFRpbWUgdG8gd2FpdCBmb3IgZ3JhY2VmdWwgc2h1dGRvd24uIERlZmF1bHRzIHRvIDEwIHNlY29uZHMuICovXG4gIGdyYWNlZnVsVGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogU2lnbmFsIHNlbnQgdG8gc3Vydml2aW5nIHByb2Nlc3NlcyBhZnRlciB0aGUgZ3JhY2VmdWwgdGltZW91dC4gRGVmYXVsdHMgdG8gYFNJR0tJTExgLiAqL1xuICBmb3JjZVNpZ25hbD86IE5vZGVKUy5TaWduYWxzO1xuICAvKiogVGltZSB0byBwb2xsIGFuZCBmb3JjZSBuZXdseSBkaXNjb3ZlcmVkIGRlc2NlbmRhbnRzLiBEZWZhdWx0cyB0byA0IHNlY29uZHMuICovXG4gIGZvcmNlVGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogSW50ZXJ2YWwgdXNlZCB0byByZWZyZXNoIGFuZCBwb2xsIHRoZSBwcm9jZXNzIHRyZWUuIERlZmF1bHRzIHRvIDEwMCBtaWxsaXNlY29uZHMuICovXG4gIHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyO1xufVxuXG4vKiogU3RkaW8gbW9kZSBmb3Ige0BsaW5rIHNwYXduU3luY30gKG5vIHBlci1saW5lIGNhbGxiYWNrcykuICovXG5leHBvcnQgdHlwZSBTeW5jRXhlY1N0ZGlvID0gRXhlY1N0ZGlvIHwgXCJjYXB0dXJlXCI7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgc3Bhd25TeW5jfS4gU2FtZSBzaGFwZSBhcyB7QGxpbmsgRXhlY09wdGlvbnN9IGJ1dCB3aXRob3V0IGxpbmUtaGFuZGxlciBzdGRpby4gKi9cbmV4cG9ydCB0eXBlIFN5bmNFeGVjT3B0aW9ucyA9IE9taXQ8U3Bhd25PcHRpb25zLCBcInN0ZGlvXCI+ICYge1xuICAvKiogYFwiaW5oZXJpdFwiYCBieSBkZWZhdWx0OyBgXCJwaXBlXCJgIC8gYFwiaWdub3JlXCJgIHNlbGVjdCBtb2RlcywgYW55IG90aGVyIHN0cmluZyBpcyBpbnB1dC4gKi9cbiAgc3RkaW4/OiBFeGVjU3RkaW8gfCBzdHJpbmc7XG4gIHN0ZG91dD86IFN5bmNFeGVjU3RkaW87XG4gIHN0ZGVycj86IFN5bmNFeGVjU3RkaW87XG4gIC8qKiBUaHJvdyB3aGVuIHRoZSBwcm9jZXNzIGV4aXRzIHdpdGggYSBub24temVybyBjb2RlLiAqL1xuICBjaGVjaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPbWl0dGVkIOKAlCBhZGFwdGl2ZSB0cmltICh7QGxpbmsgc3Bhd25TeW5jfSBkcm9wcyBvbmUgc3Bhd24gdHJhaWxpbmcgbmV3bGluZSxcbiAgICoge0BsaW5rIHNwYXdufSBkb2VzIG5vdCk7IGB0cnVlYCDigJQgc3RyaXAgYWxsIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZTtcbiAgICogYGZhbHNlYCDigJQgbGVhdmUgY2FwdHVyZWQgb3V0cHV0IHVuY2hhbmdlZC5cbiAgICovXG4gIHRyaW0/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3biBzdGRpbyBtb2RlIHBsdXMgYW4gb3B0aW9uYWwgcGVyLWxpbmUgY2FsbGJhY2sgYWZ0ZXIge0BsaW5rIHJlc29sdmVTdGRpb31cbiAqIG1hcHMgYSB7QGxpbmsgU3RkaW9PcHRpb259IGludG8gc29tZXRoaW5nIGBzcGF3bmAgY2FuIGNvbnN1bWUuXG4gKi9cbnR5cGUgUmVzb2x2ZWRTdGRpbyA9IHtcbiAgLyoqIFZhbHVlIHBhc3NlZCB0byBgc3Bhd25gJ3MgYHN0ZGlvYCB0dXBsZSBmb3IgdGhpcyBmZC4gKi9cbiAgbW9kZTogRXhlY1N0ZGlvO1xuICAvKiogV2hlbiBzZXQsIGVhY2ggb3V0cHV0IGxpbmUgaXMgYXBwZW5kZWQgdG8gdGhlIGNhcHR1cmUgYnVmZmVyIGFuZCBmb3J3YXJkZWQgaGVyZS4gKi9cbiAgb25MaW5lPzogTGluZUhhbmRsZXI7XG59O1xuXG4vKiogU3VwcG9ydGVkIGNvbW1hbmQsIGFyZ3VtZW50LWFycmF5LCB2YXJpYWRpYy1hcmd1bWVudCwgYW5kIG9wdGlvbnMgY2FsbCBmb3Jtcy4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXJnczxUIGV4dGVuZHMgU3Bhd25PcHRpb25zPiA9XG4gIHwgW2NvbW1hbmQ6IHN0cmluZywgLi4uYXJnczogc3RyaW5nW11dXG4gIHwgW2NvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW11dXG4gIHwgW2NvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIG9wdGlvbnM6IFRdXG4gIHwgW2NvbW1hbmQ6IHN0cmluZywgLi4uYXJnc0FuZE9wdGlvbnM6IFsuLi5zdHJpbmdbXSwgVF1dO1xuXG5pbnRlcmZhY2UgUGFyc2VkU3Bhd25BcmdzPFQgZXh0ZW5kcyBTcGF3bk9wdGlvbnM+IHtcbiAgY29tbWFuZDogc3RyaW5nO1xuICBjb21tYW5kQXJnczogc3RyaW5nW107XG4gIG9wdGlvbnM/OiBUO1xufVxuXG4vKiogT25lIG9wZXJhdGluZy1zeXN0ZW0gcHJvY2VzcyBjYXB0dXJlZCBiZWZvcmUgdHJlZSBzaHV0ZG93biBiZWdpbnMuICovXG5pbnRlcmZhY2UgUHJvY2Vzc1NuYXBzaG90RW50cnkge1xuICBwaWQ6IG51bWJlcjtcbiAgcGFyZW50UGlkOiBudW1iZXI7XG4gIGlkZW50aXR5OiBzdHJpbmc7XG59XG5cbi8qKiBDdXJyZW50IHJldGFpbmVkIHByb2Nlc3NlcyBwbHVzIGRlc2NlbmRhbnRzIGZpcnN0IG9ic2VydmVkIGJ5IG9uZSByZWZyZXNoLiAqL1xuaW50ZXJmYWNlIFJlZnJlc2hlZFByb2Nlc3NUcmVlIHtcbiAgcHJvY2Vzc2VzOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdO1xuICBkaXNjb3ZlcmVkOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNwYXduQXJnczxUIGV4dGVuZHMgU3Bhd25PcHRpb25zPihpbnB1dDogU3Bhd25BcmdzPFQ+KTogUGFyc2VkU3Bhd25BcmdzPFQ+IHtcbiAgbGV0IFt2YWx1ZSwgLi4udmFsdWVzXSA9IGlucHV0O1xuICBjb25zdCBbY29tbWFuZCwgLi4uY29tbWFuZEFyZ3NdID0gc2hsZXgodmFsdWUhKTtcblxuICBjb25zdCBsYXN0ID0gdmFsdWVzLmF0KC0xKTtcbiAgY29uc3Qgb3B0aW9ucyA9XG4gICAgbGFzdCAhPT0gbnVsbCAmJiB0eXBlb2YgbGFzdCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShsYXN0KSA/IGxhc3QgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFyZ3VtZW50VmFsdWVzID0gb3B0aW9ucyA/IHZhbHVlcy5zbGljZSgwLCAtMSkgOiB2YWx1ZXM7XG4gIGNvbnN0IHZhbHVlQXJnczogc3RyaW5nW10gPVxuICAgIGFyZ3VtZW50VmFsdWVzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50VmFsdWVzWzBdKVxuICAgICAgPyBbLi4uYXJndW1lbnRWYWx1ZXNbMF1dXG4gICAgICA6IGFyZ3VtZW50VmFsdWVzO1xuXG4gIHJldHVybiB7XG4gICAgY29tbWFuZDogY29tbWFuZCEsXG4gICAgY29tbWFuZEFyZ3M6IFsuLi5jb21tYW5kQXJncywgLi4udmFsdWVBcmdzXSxcbiAgICBvcHRpb25zOiBvcHRpb25zIGFzIFQsXG4gIH07XG59XG5cbi8qKlxuICogRHJvcCB0aGUgc2luZ2xlIHRyYWlsaW5nIGVtcHR5IGVudHJ5IGBzcGF3blN5bmNgIGFkZHMgd2hlbiBzcGxpdHRpbmcgb24gYSBmaW5hbFxuICogbmV3bGluZSAoYFwiaGlcXG5cImAgLT4gYFtcImhpXCIsIFwiXCJdYCkuIERvZXMgbm90IHJlbW92ZSBtdWx0aXBsZSB0cmFpbGluZyBlbXB0aWVzLlxuICovXG5mdW5jdGlvbiB3aXRob3V0U3Bhd25UcmFpbGluZ0VtcHR5TGluZShsaW5lczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGlmIChsaW5lcy5sZW5ndGggPiAwICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGxpbmVzLnNsaWNlKDAsIC0xKTtcbiAgfVxuICByZXR1cm4gbGluZXMgYXMgc3RyaW5nW107XG59XG5cbi8qKiBSZW1vdmUgYXQgbW9zdCBvbmUgdHJhaWxpbmcgbmV3bGluZSBmcm9tIGNhcHR1cmVkIHNwYXduIHN0ZG91dC9zdGRlcnIgdGV4dC4gKi9cbmZ1bmN0aW9uIHRyaW1TaW5nbGVUcmFpbGluZ05ld2xpbmUodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRleHQuZW5kc1dpdGgoXCJcXHJcXG5cIikpIHJldHVybiB0ZXh0LnNsaWNlKDAsIC0yKTtcbiAgaWYgKHRleHQuZW5kc1dpdGgoXCJcXG5cIikpIHJldHVybiB0ZXh0LnNsaWNlKDAsIC0xKTtcbiAgcmV0dXJuIHRleHQ7XG59XG5cbi8qKiBMaW5lLWFycmF5IHZpZXcgb2YgYXN5bmMtY2FwdHVyZWQgb3V0cHV0LiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplZEFzeW5jTGluZXMobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICBpZiAodHJpbSA9PT0gdHJ1ZSkgcmV0dXJuIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KGxpbmVzLmpvaW4oXCJcXG5cIikudHJpbSgpKTtcbiAgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xufVxuXG4vKiogSm9pbiBhc3luYy1jYXB0dXJlZCBsaW5lcyBpbnRvIHN0ZG91dC9zdGRlcnIgdGV4dC4gKi9cbmZ1bmN0aW9uIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhsaW5lczogcmVhZG9ubHkgc3RyaW5nW10sIHRyaW06IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCBqb2luZWQgPSBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICByZXR1cm4gdHJpbSA9PT0gdHJ1ZSA/IGpvaW5lZC50cmltKCkgOiBqb2luZWQ7XG59XG5cbi8qKiBMaW5lLWFycmF5IHZpZXcgb2Ygc3luYy1jYXB0dXJlZCBvdXRwdXQuICovXG5mdW5jdGlvbiBub3JtYWxpemVkU3luY0xpbmVzKGxpbmVzOiByZWFkb25seSBzdHJpbmdbXSwgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRyaW0gPT09IGZhbHNlKSByZXR1cm4gbGluZXMgYXMgc3RyaW5nW107XG4gIGlmICh0cmltID09PSB0cnVlKSByZXR1cm4gbGluZXNGcm9tQ2FwdHVyZWRPdXRwdXQobGluZXMuam9pbihcIlxcblwiKS50cmltKCkpO1xuICByZXR1cm4gd2l0aG91dFNwYXduVHJhaWxpbmdFbXB0eUxpbmUobGluZXMpO1xufVxuXG4vKiogRm9ybWF0IHN5bmMtY2FwdHVyZWQgc3Rkb3V0L3N0ZGVyciB0ZXh0LiAqL1xuZnVuY3Rpb24gZm9ybWF0U3luY0NhcHR1cmVkVGV4dChcbiAgdGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHRyaW0gPT09IGZhbHNlKSByZXR1cm4gdGV4dDtcbiAgaWYgKHRyaW0gPT09IHRydWUpIHJldHVybiB0ZXh0LnRyaW0oKTtcbiAgcmV0dXJuIHRyaW1TaW5nbGVUcmFpbGluZ05ld2xpbmUodGV4dCk7XG59XG5cbi8qKlxuICogSHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIGEgc3Bhd25lZCBjb21tYW5kLCB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSBuYW1lIG9yIHBhdGhcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZXhlY3V0YWJsZVxuICogQHJldHVybnMgQmFja3RpY2std3JhcHBlZCBgY29tbWFuZCBhcmcxIGFyZzIgLi4uYCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gY29tbWFuZExhYmVsKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYFxcYCR7Y29tbWFuZH0gJHthcmdzLmpvaW4oXCIgXCIpfVxcYGA7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBOb2RlIGZhaWxlZCB0byBzcGF3biBiZWNhdXNlIHRoZSBleGVjdXRhYmxlIHdhcyBub3QgZm91bmQuICovXG5mdW5jdGlvbiBpc0NvbW1hbmROb3RGb3VuZEVycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIjtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGEgcHJvY2VzcyBvcGVyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIFBJRCBubyBsb25nZXIgZXhpc3RzLiAqL1xuZnVuY3Rpb24gaXNNaXNzaW5nUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gXCJFU1JDSFwiO1xufVxuXG4vKiogVmFsaWRhdGUgYSBmaW5pdGUgbm9uLW5lZ2F0aXZlIHRpbWVvdXQuICovXG5mdW5jdGlvbiB0aW1lb3V0VmFsdWUodmFsdWU6IG51bWJlciwgbmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBmaW5pdGUgbm9uLW5lZ2F0aXZlIG51bWJlcmApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqIFZhbGlkYXRlIGEgZmluaXRlIHBvc2l0aXZlIHBvbGxpbmcgaW50ZXJ2YWwuICovXG5mdW5jdGlvbiBwb2xsSW50ZXJ2YWxWYWx1ZSh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInBvbGxJbnRlcnZhbE1zIG11c3QgYmUgYSBmaW5pdGUgcG9zaXRpdmUgbnVtYmVyXCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqIFBhcnNlIHRoZSBjb21tb24gYHBpZCBwYXJlbnRQaWQgaWRlbnRpdHlgIHByb2Nlc3Mtc25hcHNob3QgZm9ybWF0LiAqL1xuZnVuY3Rpb24gcGFyc2VQcm9jZXNzU25hcHNob3QobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvY2Vzc1NuYXBzaG90RW50cnlbXSB7XG4gIGNvbnN0IHNuYXBzaG90OiBQcm9jZXNzU25hcHNob3RFbnRyeVtdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGNvbnN0IG1hdGNoID0gL15cXHMqKFxcZCspXFxzKyhcXGQrKSg/OlxccysoLis/KSk/XFxzKiQvLmV4ZWMobGluZSk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBtYXRjaD8uWzNdPy50cmltKCk7XG4gICAgaWYgKCFtYXRjaCB8fCAhaWRlbnRpdHkpIGNvbnRpbnVlO1xuICAgIHNuYXBzaG90LnB1c2goe1xuICAgICAgcGlkOiBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0hLCAxMCksXG4gICAgICBwYXJlbnRQaWQ6IE51bWJlci5wYXJzZUludChtYXRjaFsyXSEsIDEwKSxcbiAgICAgIGlkZW50aXR5LFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzbmFwc2hvdDtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGEgYC9wcm9jYCByZWNvcmQgZGlzYXBwZWFyZWQgb3IgaXMgaW5hY2Nlc3NpYmxlIGR1cmluZyBhIHNuYXBzaG90LiAqL1xuZnVuY3Rpb24gaXNVbmF2YWlsYWJsZVByb2NSZWNvcmQoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB8fCAhKFwiY29kZVwiIGluIGVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIiB8fCBlcnJvci5jb2RlID09PSBcIkVBQ0NFU1wiIHx8IGVycm9yLmNvZGUgPT09IFwiRVBFUk1cIjtcbn1cblxuLyoqIFBhcnNlIExpbnV4IGAvcHJvYy88cGlkPi9zdGF0YCBwYXJlbnQgUElEIGFuZCBleGFjdCBwcm9jZXNzLXN0YXJ0IHRpY2tzLiAqL1xuZnVuY3Rpb24gcGFyc2VMaW51eFByb2Nlc3NTdGF0KHBpZDogbnVtYmVyLCBzdGF0OiBzdHJpbmcpOiBQcm9jZXNzU25hcHNob3RFbnRyeSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbW1hbmRFbmQgPSBzdGF0Lmxhc3RJbmRleE9mKFwiKVwiKTtcbiAgaWYgKGNvbW1hbmRFbmQgPCAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBmaWVsZHMgPSBzdGF0XG4gICAgLnNsaWNlKGNvbW1hbmRFbmQgKyAxKVxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcGFyZW50UGlkID0gTnVtYmVyLnBhcnNlSW50KGZpZWxkc1sxXSEsIDEwKTtcbiAgY29uc3Qgc3RhcnRUaWNrcyA9IGZpZWxkc1sxOV07XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIocGFyZW50UGlkKSB8fCAhc3RhcnRUaWNrcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgcGlkLCBwYXJlbnRQaWQsIGlkZW50aXR5OiBzdGFydFRpY2tzIH07XG59XG5cbi8qKiBDYXB0dXJlIExpbnV4IHByb2Nlc3MgaWRlbnRpdGllcyBmcm9tIGAvcHJvY2Agd2l0aG91dCBzZWNvbmQtbGV2ZWwgdHJ1bmNhdGlvbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpbnV4UHJvY2Vzc1NuYXBzaG90KCk6IFByb21pc2U8UHJvY2Vzc1NuYXBzaG90RW50cnlbXT4ge1xuICBjb25zdCBkaXJlY3RvcmllcyA9IGF3YWl0IHJlYWRkaXIoXCIvcHJvY1wiLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBkaXJlY3Rvcmllc1xuICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgL15cXGQrJC8udGVzdChlbnRyeS5uYW1lKSlcbiAgICAgIC5tYXAoYXN5bmMgKGVudHJ5KTogUHJvbWlzZTxQcm9jZXNzU25hcHNob3RFbnRyeSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICBjb25zdCBwaWQgPSBOdW1iZXIucGFyc2VJbnQoZW50cnkubmFtZSwgMTApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBwYXJzZUxpbnV4UHJvY2Vzc1N0YXQocGlkLCBhd2FpdCByZWFkRmlsZShgL3Byb2MvJHtlbnRyeS5uYW1lfS9zdGF0YCwgXCJ1dGY4XCIpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoaXNVbmF2YWlsYWJsZVByb2NSZWNvcmQoZXJyb3IpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgKTtcbiAgcmV0dXJuIGVudHJpZXMuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIFByb2Nlc3NTbmFwc2hvdEVudHJ5ID0+IGVudHJ5ICE9PSB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIENhcHR1cmUgdGhlIGN1cnJlbnQgUElELCBwYXJlbnQgUElELCBhbmQgcHJvY2Vzcy1zdGFydCBpZGVudGl0eSB0YWJsZS5cbiAqXG4gKiBMaW51eCByZWFkcyBleGFjdCBzdGFydCB0aWNrcyBmcm9tIGAvcHJvY2AuIFdpbmRvd3MgdXNlcyB0aGUgYnVpbHQtaW5cbiAqIFBvd2VyU2hlbGwgQ0lNIHByb3ZpZGVyLiBtYWNPUyBhbmQgb3RoZXIgUE9TSVggcGxhdGZvcm1zIGNvbWJpbmUgYHBzYFxuICogcHJvY2VzcyBzdGFydCB0aW1lIGFuZCBleGVjdXRhYmxlIG5hbWUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NTbmFwc2hvdCgpOiBQcm9taXNlPFByb2Nlc3NTbmFwc2hvdEVudHJ5W10+IHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwibGludXhcIikgcmV0dXJuIGxpbnV4UHJvY2Vzc1NuYXBzaG90KCk7XG5cbiAgY29uc3QgY29tbWFuZCA9IHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIiA/IFwicG93ZXJzaGVsbC5leGVcIiA6IFwicHNcIjtcbiAgY29uc3QgYXJncyA9XG4gICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiXG4gICAgICA/IFtcIi1Ob0xvZ29cIiwgXCItTm9Qcm9maWxlXCIsIFwiLU5vbkludGVyYWN0aXZlXCIsIFwiLUNvbW1hbmRcIiwgV0lORE9XU19QUk9DRVNTX1NOQVBTSE9UX1NDUklQVF1cbiAgICAgIDogW1wiLUFcIiwgXCItb1wiLCBcInBpZD1cIiwgXCItb1wiLCBcInBwaWQ9XCIsIFwiLW9cIiwgXCJsc3RhcnQ9XCIsIFwiLW9cIiwgXCJjb21tPVwiXTtcbiAgY29uc3QgcHJvYyA9IG5vZGVTcGF3bihjb21tYW5kLCBhcmdzLCB7XG4gICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgIHdpbmRvd3NIaWRlOiB0cnVlLFxuICB9KTtcbiAgY29uc3Qgc3Rkb3V0ID0gdGV4dChwcm9jLnN0ZG91dCEpO1xuICBjb25zdCBzdGRlcnIgPSB0ZXh0KHByb2Muc3RkZXJyISk7XG4gIGNvbnN0IFtleGl0Q29kZSwgc3Rkb3V0VGV4dCwgc3RkZXJyVGV4dF0gPSBhd2FpdCBQcm9taXNlLmFsbChbd2FpdEZvckV4aXQocHJvYyksIHN0ZG91dCwgc3RkZXJyXSk7XG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2NvbW1hbmRMYWJlbChjb21tYW5kLCBhcmdzKX0gZmFpbGVkIChleGl0ICR7ZXhpdENvZGV9KSR7XG4gICAgICAgIHN0ZGVyclRleHQgPyBgOiAke3N0ZGVyclRleHQudHJpbSgpfWAgOiBcIlwiXG4gICAgICB9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBwYXJzZVByb2Nlc3NTbmFwc2hvdChsaW5lc0Zyb21DYXB0dXJlZE91dHB1dChzdGRvdXRUZXh0KSk7XG59XG5cbi8qKiBHcm91cCBhIHByb2Nlc3Mgc25hcHNob3QgYnkgcGFyZW50IFBJRC4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDaGlsZHJlbihcbiAgc25hcHNob3Q6IHJlYWRvbmx5IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10sXG4pOiBNYXA8bnVtYmVyLCBQcm9jZXNzU25hcHNob3RFbnRyeVtdPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gbmV3IE1hcDxudW1iZXIsIFByb2Nlc3NTbmFwc2hvdEVudHJ5W10+KCk7XG4gIGZvciAoY29uc3QgZW50cnkgb2Ygc25hcHNob3QpIHtcbiAgICBjb25zdCBzaWJsaW5ncyA9IGNoaWxkcmVuLmdldChlbnRyeS5wYXJlbnRQaWQpID8/IFtdO1xuICAgIHNpYmxpbmdzLnB1c2goZW50cnkpO1xuICAgIGNoaWxkcmVuLnNldChlbnRyeS5wYXJlbnRQaWQsIHNpYmxpbmdzKTtcbiAgfVxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbi8qKiBTZWxlY3Qgb25lIHNuYXBzaG90dGVkIHByb2Nlc3MgdHJlZSBpbiBkZXNjZW5kYW50LWZpcnN0IHNpZ25hbCBvcmRlci4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NUcmVlKFxuICBzbmFwc2hvdDogcmVhZG9ubHkgUHJvY2Vzc1NuYXBzaG90RW50cnlbXSxcbiAgcm9vdFBpZDogbnVtYmVyLFxuKTogUHJvY2Vzc1NuYXBzaG90RW50cnlbXSB7XG4gIGNvbnN0IHJvb3QgPSBzbmFwc2hvdC5maW5kKChlbnRyeSkgPT4gZW50cnkucGlkID09PSByb290UGlkKTtcbiAgaWYgKCFyb290KSB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBpZGVudGlmeSBjaGlsZCBwcm9jZXNzICR7cm9vdFBpZH1gKTtcblxuICBjb25zdCBjaGlsZHJlbiA9IHByb2Nlc3NDaGlsZHJlbihzbmFwc2hvdCk7XG4gIGNvbnN0IHRyZWU6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8bnVtYmVyPihbcm9vdFBpZF0pO1xuICBjb25zdCBhcHBlbmREZXNjZW5kYW50cyA9IChwYXJlbnRQaWQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4uZ2V0KHBhcmVudFBpZCkgPz8gW10pIHtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhjaGlsZC5waWQpKSBjb250aW51ZTtcbiAgICAgIHZpc2l0ZWQuYWRkKGNoaWxkLnBpZCk7XG4gICAgICBhcHBlbmREZXNjZW5kYW50cyhjaGlsZC5waWQpO1xuICAgICAgdHJlZS5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH07XG4gIGFwcGVuZERlc2NlbmRhbnRzKHJvb3RQaWQpO1xuICB0cmVlLnB1c2gocm9vdCk7XG4gIHJldHVybiB0cmVlO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgdHdvIHNuYXBzaG90cyBpZGVudGlmeSB0aGUgc2FtZSBwcm9jZXNzIGxpZmV0aW1lLiAqL1xuZnVuY3Rpb24gc2FtZVByb2Nlc3MocHJldmlvdXM6IFByb2Nlc3NTbmFwc2hvdEVudHJ5LCBjdXJyZW50OiBQcm9jZXNzU25hcHNob3RFbnRyeSk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJldmlvdXMuaWRlbnRpdHkgPT09IGN1cnJlbnQuaWRlbnRpdHk7XG59XG5cbi8qKlxuICogUmVmcmVzaCByZXRhaW5lZCBwcm9jZXNzIGlkZW50aXRpZXMgYW5kIG1lcmdlIGRlc2NlbmRhbnRzIGNyZWF0ZWQgYWZ0ZXIgdGhlXG4gKiBpbml0aWFsIHNuYXBzaG90LlxuICovXG5mdW5jdGlvbiByZWZyZXNoUHJvY2Vzc1RyZWUoXG4gIHJldGFpbmVkOiBNYXA8bnVtYmVyLCBQcm9jZXNzU25hcHNob3RFbnRyeT4sXG4gIHNuYXBzaG90OiByZWFkb25seSBQcm9jZXNzU25hcHNob3RFbnRyeVtdLFxuKTogUmVmcmVzaGVkUHJvY2Vzc1RyZWUge1xuICBjb25zdCBjdXJyZW50QnlQaWQgPSBuZXcgTWFwKHNuYXBzaG90Lm1hcCgoZW50cnkpID0+IFtlbnRyeS5waWQsIGVudHJ5XSkpO1xuICBjb25zdCBjaGlsZHJlbiA9IHByb2Nlc3NDaGlsZHJlbihzbmFwc2hvdCk7XG4gIGNvbnN0IHByb2Nlc3NlcyA9IG5ldyBNYXA8bnVtYmVyLCBQcm9jZXNzU25hcHNob3RFbnRyeT4oKTtcbiAgY29uc3QgZGlzY292ZXJlZDogUHJvY2Vzc1NuYXBzaG90RW50cnlbXSA9IFtdO1xuICBjb25zdCBxdWV1ZTogUHJvY2Vzc1NuYXBzaG90RW50cnlbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcHJldmlvdXMgb2YgcmV0YWluZWQudmFsdWVzKCkpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gY3VycmVudEJ5UGlkLmdldChwcmV2aW91cy5waWQpO1xuICAgIGlmICghY3VycmVudCB8fCAhc2FtZVByb2Nlc3MocHJldmlvdXMsIGN1cnJlbnQpKSBjb250aW51ZTtcbiAgICByZXRhaW5lZC5zZXQoY3VycmVudC5waWQsIGN1cnJlbnQpO1xuICAgIHByb2Nlc3Nlcy5zZXQoY3VycmVudC5waWQsIGN1cnJlbnQpO1xuICAgIHF1ZXVlLnB1c2goY3VycmVudCk7XG4gIH1cblxuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldChwcm9jZXNzZXMua2V5cygpKTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHF1ZXVlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IHBhcmVudCA9IHF1ZXVlW2luZGV4XSE7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbi5nZXQocGFyZW50LnBpZCkgPz8gW10pIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gcmV0YWluZWQuZ2V0KGNoaWxkLnBpZCk7XG4gICAgICBpZiAoIXByZXZpb3VzIHx8ICFzYW1lUHJvY2VzcyhwcmV2aW91cywgY2hpbGQpKSB7XG4gICAgICAgIHJldGFpbmVkLnNldChjaGlsZC5waWQsIGNoaWxkKTtcbiAgICAgICAgZGlzY292ZXJlZC5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3Nlcy5zZXQoY2hpbGQucGlkLCBjaGlsZCk7XG4gICAgICBpZiAodmlzaXRlZC5oYXMoY2hpbGQucGlkKSkgY29udGludWU7XG4gICAgICB2aXNpdGVkLmFkZChjaGlsZC5waWQpO1xuICAgICAgcXVldWUucHVzaChjaGlsZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgcHJvY2Vzc2VzOiBbLi4ucHJvY2Vzc2VzLnZhbHVlcygpXSwgZGlzY292ZXJlZCB9O1xufVxuXG4vKiogQnVpbGQgdGhlIHBlci1saWZldGltZSBrZXkgdXNlZCB0byBwcmV2ZW50IHJlcGVhdGVkIHNpZ25hbHMgYWZ0ZXIgUElEIHJldXNlLiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0lkZW50aXR5KGVudHJ5OiBQcm9jZXNzU25hcHNob3RFbnRyeSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtlbnRyeS5waWR9OiR7ZW50cnkuaWRlbnRpdHl9YDtcbn1cblxuLyoqIFNpZ25hbCBlYWNoIHByb2Nlc3MgaWRlbnRpdHkgb25jZSwgaWdub3JpbmcgUElEcyB0aGF0IGFscmVhZHkgZXhpdGVkLiAqL1xuZnVuY3Rpb24gc2lnbmFsUHJvY2Vzc2VzKFxuICBwcm9jZXNzZXM6IHJlYWRvbmx5IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10sXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMsXG4gIHNpZ25hbGVkOiBTZXQ8c3RyaW5nPixcbik6IHZvaWQge1xuICBjb25zdCBlcnJvcnM6IHVua25vd25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHByb2Nlc3Nlcykge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gcHJvY2Vzc0lkZW50aXR5KGVudHJ5KTtcbiAgICBpZiAoc2lnbmFsZWQuaGFzKGlkZW50aXR5KSkgY29udGludWU7XG4gICAgc2lnbmFsZWQuYWRkKGlkZW50aXR5KTtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKGVudHJ5LnBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc01pc3NpbmdQcm9jZXNzRXJyb3IoZXJyb3IpKSBlcnJvcnMucHVzaChlcnJvcik7XG4gICAgfVxuICB9XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIGBGYWlsZWQgdG8gc2VuZCAke3NpZ25hbH0gdG8gdGhlIGNvbXBsZXRlIHByb2Nlc3MgdHJlZWApO1xuICB9XG59XG5cbi8qKiBQYXVzZSB3aXRob3V0IGRldGFjaGluZyB0aGUgc2h1dGRvd24gb3BlcmF0aW9uIGZyb20gdGhlIGV2ZW50IGxvb3AuICovXG5mdW5jdGlvbiBkZWxheShtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG5cbi8qKlxuICogUG9sbCByZWZyZXNoZWQgcHJvY2VzcyBzbmFwc2hvdHMgdW50aWwgdGhlIHJldGFpbmVkIHRyZWUgZXhpdHMgb3IgdGhlXG4gKiB0aW1lb3V0IGVsYXBzZXMuIERlc2NlbmRhbnRzIGNyZWF0ZWQgZHVyaW5nIHNodXRkb3duIGFyZSByZXRhaW5lZCBhbmQgcmVjZWl2ZVxuICogdGhlIGN1cnJlbnQgc2h1dGRvd24gc2lnbmFsIG9uY2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JQcm9jZXNzVHJlZUV4aXQoXG4gIHJldGFpbmVkOiBNYXA8bnVtYmVyLCBQcm9jZXNzU25hcHNob3RFbnRyeT4sXG4gIGluaXRpYWxQcm9jZXNzZXM6IHJlYWRvbmx5IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10sXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMsXG4gIHNpZ25hbGVkOiBTZXQ8c3RyaW5nPixcbiAgdGltZW91dE1zOiBudW1iZXIsXG4gIHBvbGxJbnRlcnZhbE1zOiBudW1iZXIsXG4pOiBQcm9taXNlPFByb2Nlc3NTbmFwc2hvdEVudHJ5W10+IHtcbiAgbGV0IHN1cnZpdm9ycyA9IFsuLi5pbml0aWFsUHJvY2Vzc2VzXTtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGltZW91dE1zO1xuICB3aGlsZSAoc3Vydml2b3JzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IGRlYWRsaW5lIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAocmVtYWluaW5nTXMgPiAwKSBhd2FpdCBkZWxheShNYXRoLm1pbihwb2xsSW50ZXJ2YWxNcywgcmVtYWluaW5nTXMpKTtcblxuICAgIGNvbnN0IHJlZnJlc2hlZCA9IHJlZnJlc2hQcm9jZXNzVHJlZShyZXRhaW5lZCwgYXdhaXQgcHJvY2Vzc1NuYXBzaG90KCkpO1xuICAgIGlmIChyZWZyZXNoZWQuZGlzY292ZXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICBzaWduYWxQcm9jZXNzZXMocmVmcmVzaGVkLmRpc2NvdmVyZWQsIHNpZ25hbCwgc2lnbmFsZWQpO1xuICAgIH1cbiAgICBzdXJ2aXZvcnMgPSByZWZyZXNoZWQucHJvY2Vzc2VzO1xuICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSBicmVhaztcbiAgfVxuICByZXR1cm4gc3Vydml2b3JzO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB7QGxpbmsgc3Bhd259IHdpdGggbGl2ZSBsaW5lIGFycmF5cyBhbmQgbGF6eVxuICogdHJpbW1lZCBgc3Rkb3V0YCAvIGBzdGRlcnJgIGdldHRlcnMgZGVyaXZlZCBmcm9tIHRob3NlIGxpbmVzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFeGVjUmVzdWx0KFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBzdGRvdXRMaW5lczogc3RyaW5nW10sXG4gIHN0ZGVyckxpbmVzOiBzdHJpbmdbXSxcbiAgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IEV4ZWNSZXN1bHQge1xuICByZXR1cm4ge1xuICAgIGV4aXRDb2RlLFxuICAgIGdldCBzdGRvdXRMaW5lcygpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkQXN5bmNMaW5lcyhzdGRvdXRMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyTGluZXMoKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEFzeW5jTGluZXMoc3RkZXJyTGluZXMsIHRyaW0pO1xuICAgIH0sXG4gICAgZ2V0IHN0ZG91dCgpIHtcbiAgICAgIHJldHVybiBmb3JtYXRBc3luY0NhcHR1cmVkTGluZXMoc3Rkb3V0TGluZXMsIHRyaW0pO1xuICAgIH0sXG4gICAgZ2V0IHN0ZGVycigpIHtcbiAgICAgIHJldHVybiBmb3JtYXRBc3luY0NhcHR1cmVkTGluZXMoc3RkZXJyTGluZXMsIHRyaW0pO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHtAbGluayBzcGF3blN5bmN9LiBDYXB0dXJlZCBzdHJpbmdzIGFyZSBzdG9yZWRcbiAqIGFzLWlzOyBgc3Rkb3V0YCAvIGBzdGRlcnJgIHRyaW0gZGlyZWN0bHksIGFuZCBsaW5lIGFycmF5cyBzcGxpdCBvbmx5IG9uIHJlYWQuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN5bmNFeGVjUmVzdWx0KFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBzdGRvdXRUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHN0ZGVyclRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IEV4ZWNSZXN1bHQge1xuICBsZXQgc3Rkb3V0TGluZXNDYWNoZTogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIGxldCBzdGRlcnJMaW5lc0NhY2hlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdCBzeW5jTGluZXMgPSAodGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW10gfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRTeW5jTGluZXMobGluZXNGcm9tQ2FwdHVyZWRPdXRwdXQodGV4dCksIHRyaW0pO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZXhpdENvZGUsXG4gICAgZ2V0IHN0ZG91dExpbmVzKCkge1xuICAgICAgaWYgKHN0ZG91dFRleHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICAgICAgc3Rkb3V0TGluZXNDYWNoZSA/Pz0gc3luY0xpbmVzKHN0ZG91dFRleHQpID8/IFtdO1xuICAgICAgcmV0dXJuIHN0ZG91dExpbmVzQ2FjaGU7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyTGluZXMoKSB7XG4gICAgICBpZiAoc3RkZXJyVGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgICBzdGRlcnJMaW5lc0NhY2hlID8/PSBzeW5jTGluZXMoc3RkZXJyVGV4dCkgPz8gW107XG4gICAgICByZXR1cm4gc3RkZXJyTGluZXNDYWNoZTtcbiAgICB9LFxuICAgIGdldCBzdGRvdXQoKSB7XG4gICAgICByZXR1cm4gZm9ybWF0U3luY0NhcHR1cmVkVGV4dChzdGRvdXRUZXh0LCB0cmltKSA/PyBcIlwiO1xuICAgIH0sXG4gICAgZ2V0IHN0ZGVycigpIHtcbiAgICAgIHJldHVybiBmb3JtYXRTeW5jQ2FwdHVyZWRUZXh0KHN0ZGVyclRleHQsIHRyaW0pID8/IFwiXCI7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVzZXItc3VwcGxpZWQgbGluZSBoYW5kbGVycyBmcm9tIGEge0BsaW5rIFN0ZGlvT3B0aW9ufS5cbiAqXG4gKiBUaGUgYFwiY2FwdHVyZVwiYCBtYXJrZXIgaXMgZmlsdGVyZWQgb3V0OyBjYXB0dXJlIGl0c2VsZiBpcyBhbHdheXMgaGFuZGxlZCBieVxuICogcHVzaGluZyBpbnRvIHRoZSBsaW5lIGJ1ZmZlciBpbnNpZGUge0BsaW5rIHJlc29sdmVTdGRpb30uXG4gKlxuICogQHBhcmFtIG9wdGlvbiAtIFN0ZGlvIG9wdGlvbiB0aGF0IG1heSBlbWJlZCBvbmUgb3IgbW9yZSBoYW5kbGVyc1xuICogQHJldHVybnMgSGFuZGxlcnMgdG8gaW52b2tlIGFmdGVyIGVhY2ggY2FwdHVyZWQgbGluZSAobWF5IGJlIGVtcHR5KVxuICovXG5mdW5jdGlvbiBsaW5lSGFuZGxlcnMob3B0aW9uOiBTdGRpb09wdGlvbik6IExpbmVIYW5kbGVyW10ge1xuICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gW29wdGlvbl07XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbikpIHtcbiAgICByZXR1cm4gb3B0aW9uLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgTGluZUhhbmRsZXIgPT4gaXRlbSAhPT0gXCJjYXB0dXJlXCIpO1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcIm9iamVjdFwiKSByZXR1cm4gW29wdGlvbi5vbkxpbmVdO1xuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVzTGluZXMob3B0aW9uOiBTdGRpb09wdGlvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIG9wdGlvbiAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG9wdGlvbikgfHwgb3B0aW9uLmNhcHR1cmUgIT09IGZhbHNlO1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBhIHN0ZGlvIG9wdGlvbiBpcyBhIHN0cmluZyBzcGF3biBtb2RlIHJhdGhlciB0aGFuIGNhcHR1cmUvaGFuZGxlcnMuXG4gKlxuICoge0BsaW5rIHJlc29sdmVTdGRpb30gc3RpbGwgdHJlYXRzIGBcInBpcGVcImAgYXMgcGlwZS1hbmQtY2FwdHVyZTsgb25seVxuICogYFwiaW5oZXJpdFwiYCBhbmQgYFwiaWdub3JlXCJgIHJldHVybiB3aXRob3V0IGEgbGluZSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gU3RkaW8gb3B0aW9uIHRvIGNsYXNzaWZ5XG4gKiBAcmV0dXJucyBXaGV0aGVyIGBvcHRpb25gIGlzIGBcImluaGVyaXRcImAsIGBcInBpcGVcImAsIG9yIGBcImlnbm9yZVwiYFxuICovXG5mdW5jdGlvbiBpc1Bhc3N0aHJvdWdoTW9kZShvcHRpb246IHVua25vd24pOiBvcHRpb24gaXMgRXhlY1N0ZGlvIHtcbiAgcmV0dXJuIG9wdGlvbiA9PT0gXCJpbmhlcml0XCIgfHwgb3B0aW9uID09PSBcInBpcGVcIiB8fCBvcHRpb24gPT09IFwiaWdub3JlXCI7XG59XG5cbi8qKiBUcnVlIHdoZW4gc3RkaW4gaXMgZGF0YSByYXRoZXIgdGhhbiBvbmUgb2YgdGhlIHRocmVlIHJlc2VydmVkIHN0ZGlvIG1vZGVzLiAqL1xuZnVuY3Rpb24gaXNTdGRpblBheWxvYWQoc3RkaW46IEV4ZWNTdGRpbyB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0ZGluIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2Ygc3RkaW4gPT09IFwic3RyaW5nXCIgJiYgIWlzUGFzc3Rocm91Z2hNb2RlKHN0ZGluKTtcbn1cblxuLyoqXG4gKiBNYXAgYSB7QGxpbmsgU3RkaW9PcHRpb259IGludG8gYSBzcGF3biBzdGRpbyBtb2RlIGFuZCBvcHRpb25hbCBsaW5lIGNhbGxiYWNrLlxuICpcbiAqIFBpcGVkIG1vZGVzIChgXCJjYXB0dXJlXCJgLCBgXCJwaXBlXCJgLCBoYW5kbGVycywgYXJyYXlzKSBhcHBlbmQgZXZlcnkgbGluZSB0b1xuICogYGxpbmVzYCBhbmQgaW52b2tlIGFueSBlbWJlZGRlZCBoYW5kbGVycy4gT21pdHRlZCBvcHRpb25zIHVzZSBgZGVmYXVsdE1vZGVgLlxuICpcbiAqIEBwYXJhbSBvcHRpb24gLSBDYWxsZXIgc3RkaW8gcHJlZmVyZW5jZSBmb3Igb25lIGZkXG4gKiBAcGFyYW0gbGluZXMgLSBNdXRhYmxlIGJ1ZmZlciB0aGF0IHJlY2VpdmVzIGVhY2ggcGlwZWQgbGluZVxuICogQHBhcmFtIGRlZmF1bHRNb2RlIC0gU3Bhd24gbW9kZSB3aGVuIGBvcHRpb25gIGlzIG9taXR0ZWQgKGBcImluaGVyaXRcImAgYnkgZGVmYXVsdClcbiAqIEByZXR1cm5zIFJlc29sdmVkIHNwYXduIG1vZGUgYW5kIG9wdGlvbmFsIHBlci1saW5lIGNhbGxiYWNrXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTdGRpbyhcbiAgb3B0aW9uOiBTdGRpb09wdGlvbiB8IHVuZGVmaW5lZCxcbiAgbGluZXM6IHN0cmluZ1tdLFxuICBkZWZhdWx0TW9kZTogRXhlY1N0ZGlvID0gXCJpbmhlcml0XCIsXG4pOiBSZXNvbHZlZFN0ZGlvIHtcbiAgaWYgKG9wdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4geyBtb2RlOiBkZWZhdWx0TW9kZSB9O1xuICBpZiAoaXNQYXNzdGhyb3VnaE1vZGUob3B0aW9uKSAmJiBvcHRpb24gIT09IFwicGlwZVwiKSByZXR1cm4geyBtb2RlOiBvcHRpb24gfTtcblxuICBjb25zdCBoYW5kbGVycyA9IGxpbmVIYW5kbGVycyhvcHRpb24pO1xuICBjb25zdCBjYXB0dXJlID0gY2FwdHVyZXNMaW5lcyhvcHRpb24pO1xuICByZXR1cm4ge1xuICAgIG1vZGU6IFwicGlwZVwiLFxuICAgIG9uTGluZTogKGxpbmUpID0+IHtcbiAgICAgIGlmIChjYXB0dXJlKSBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSBoYW5kbGVyKGxpbmUpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVhZCBhIHJlYWRhYmxlIHN0cmVhbSBsaW5lLWJ5LWxpbmUgYW5kIGludm9rZSBgb25MaW5lYCBmb3IgZWFjaCBjaHVuay5cbiAqXG4gKiBVc2VzIGByZWFkbGluZWAgc28gYFxcclxcbmAgYW5kIGJhcmUgYFxcbmAgYXJlIG5vcm1hbGl6ZWQuIFRoZSBpbnRlcmZhY2UgaXNcbiAqIGFsd2F5cyBjbG9zZWQgaW4gYSBgZmluYWxseWAgYmxvY2suXG4gKlxuICogQHBhcmFtIHN0cmVhbSAtIFN1YnByb2Nlc3Mgc3Rkb3V0IG9yIHN0ZGVyciBzdHJlYW1cbiAqIEBwYXJhbSBvbkxpbmUgLSBDYWxsYmFjayBpbnZva2VkIG9uY2UgcGVyIG91dHB1dCBsaW5lXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRMaW5lcyhzdHJlYW06IFJlYWRhYmxlLCBvbkxpbmU6IExpbmVIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHsgaW5wdXQ6IHN0cmVhbSwgY3JsZkRlbGF5OiBJbmZpbml0eSB9KTtcbiAgdHJ5IHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGxpbmUgb2YgcmwpIG9uTGluZShsaW5lKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBybC5jbG9zZSgpO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnQgYSBiYWNrZ3JvdW5kIGxpbmUgcmVhZCB3aGVuIHRoZSByZXNvbHZlZCBoYW5kbGVyIHBpcGVzIGEgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSByZWFkcyAtIFByb21pc2UgbGlzdCBhd2FpdGVkIGJlZm9yZSByZXR1cm5pbmcgdGhlIHtAbGluayBFeGVjUmVzdWx0fVxuICogQHBhcmFtIHN0cmVhbSAtIFN1YnByb2Nlc3Mgc3RyZWFtIGZvciB0aGlzIGZkIChgbnVsbGAgd2hlbiB1bmF2YWlsYWJsZSlcbiAqIEBwYXJhbSBoYW5kbGVyIC0gUmVzb2x2ZWQgc3RkaW8gY29uZmlnIGZyb20ge0BsaW5rIHJlc29sdmVTdGRpb31cbiAqL1xuZnVuY3Rpb24gcXVldWVMaW5lUmVhZHMoXG4gIHJlYWRzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHN0cmVhbTogUmVhZGFibGUgfCBudWxsLFxuICBoYW5kbGVyOiBSZXNvbHZlZFN0ZGlvLFxuKTogdm9pZCB7XG4gIGlmIChoYW5kbGVyLm9uTGluZSAmJiBzdHJlYW0pIHJlYWRzLnB1c2gocmVhZExpbmVzKHN0cmVhbSwgaGFuZGxlci5vbkxpbmUpKTtcbn1cblxuLyoqXG4gKiBXcml0ZSBzdHJpbmcgc3RkaW4gdG8gYSBzcGF3bmVkIHByb2Nlc3MgYW5kIGNsb3NlIHRoZSBzdHJlYW0uXG4gKlxuICogTm8tb3AgdW5sZXNzIGBzdGRpbmAgaXMgYSBwYXlsb2FkIHN0cmluZyAobm90IGEgc3RkaW8gbW9kZSkgYW5kXG4gKiBgcHJvYy5zdGRpbmAgaXMgYXZhaWxhYmxlLiBBIGNoaWxkIHRoYXQgZXhpdHMgYmVmb3JlIGNvbnN1bWluZyB0aGUgcGF5bG9hZFxuICogY2xvc2VzIGl0cyBwaXBlOyBFUElQRSBpcyBleHBlY3RlZCBpbiB0aGF0IGNhc2UgYW5kIGlzIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHByb2MgLSBDaGlsZCBwcm9jZXNzIHJldHVybmVkIGZyb20gYHNwYXduYFxuICogQHBhcmFtIHN0ZGluIC0gU3RkaW8gbW9kZSBvciBzdHJpbmcgcGF5bG9hZCBmcm9tIHtAbGluayBFeGVjT3B0aW9uc31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVTdGRpbihcbiAgcHJvYzogQ2hpbGRQcm9jZXNzLFxuICBzdGRpbjogRXhlY1N0ZGlvIHwgc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNTdGRpblBheWxvYWQoc3RkaW4pIHx8ICFwcm9jLnN0ZGluKSByZXR1cm47XG4gIGNvbnN0IGNvbXBsZXRpb24gPSBmaW5pc2hlZChwcm9jLnN0ZGluLCB7IGNsZWFudXA6IHRydWUgfSk7XG4gIHByb2Muc3RkaW4uZW5kKHN0ZGluKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjb21wbGV0aW9uO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoIShlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBcImNvZGVcIiBpbiBlcnIgJiYgZXJyLmNvZGUgPT09IFwiRVBJUEVcIikpIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIEF3YWl0IHByb2Nlc3MgZXhpdCBhbmQgbm9ybWFsaXplIGEgbWlzc2luZyBleGl0IGNvZGUgdG8gYDFgLlxuICpcbiAqIFJlamVjdHMgd2hlbiBzcGF3biBmYWlscyBiZWZvcmUgYGNsb3NlYCAoZS5nLiBleGVjdXRhYmxlIG5vdCBmb3VuZCkuXG4gKlxuICogQHBhcmFtIHByb2MgLSBDaGlsZCBwcm9jZXNzIHJldHVybmVkIGZyb20gYHNwYXduYFxuICogQHJldHVybnMgUmVzb2x2ZWQgZXhpdCBjb2RlXG4gKi9cbmZ1bmN0aW9uIHdhaXRGb3JFeGl0KHByb2M6IENoaWxkUHJvY2Vzcyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcHJvYy5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICBwcm9jLm9uY2UoXCJjbG9zZVwiLCAoY29kZSkgPT4gcmVzb2x2ZShjb2RlID8/IDEpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgYW4gYEVycm9yYCBmb3IgYSBub24temVybyBleGl0IHdoZW4ge0BsaW5rIEV4ZWNPcHRpb25zLmNoZWNrfSBpcyBzZXQuXG4gKlxuICogUHJlZmVycyB0cmltbWVkIHN0ZGVyciB0ZXh0LCB0aGVuIHN0ZG91dCwgaW4gdGhlIG1lc3NhZ2UgYm9keS5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIEV4ZWN1dGFibGUgbmFtZSBvciBwYXRoXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEBwYXJhbSByZXN1bHQgLSBDb21wbGV0ZWQgZXhlYyBvdXRjb21lIHdpdGggY2FwdHVyZWQgb3V0cHV0XG4gKiBAcmV0dXJucyBFcnJvciBzdWl0YWJsZSBmb3IgdGhyb3dpbmcgZnJvbSB7QGxpbmsgc3Bhd259XG4gKi9cbmZ1bmN0aW9uIGV4ZWNFcnJvcihjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCByZXN1bHQ6IEV4ZWNSZXN1bHQpOiBFcnJvciB7XG4gIGNvbnN0IGRldGFpbCA9IHJlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dDtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgJHtjb21tYW5kTGFiZWwoY29tbWFuZCwgYXJncyl9IGZhaWxlZCAoZXhpdCAke3Jlc3VsdC5leGl0Q29kZX0pJHtkZXRhaWwgPyBgOiAke2RldGFpbH1gIDogXCJcIn1gLFxuICApO1xufVxuXG4vKipcbiAqIE1hcCBhIHtAbGluayBTeW5jRXhlY1N0ZGlvfSBvcHRpb24gdG8gYSBgc3Bhd25TeW5jYCBzdGRpbyBtb2RlLlxuICpcbiAqIGBcImNhcHR1cmVcImAgcGlwZXMgdGhlIGZkIHNvIG91dHB1dCBjYW4gYmUgcmVhZCBpbnRvIHRoZSB7QGxpbmsgRXhlY1Jlc3VsdH0uXG4gKlxuICogQHBhcmFtIG9wdGlvbiAtIENhbGxlciBzdGRpbyBwcmVmZXJlbmNlIGZvciBvbmUgZmRcbiAqIEBwYXJhbSBkZWZhdWx0TW9kZSAtIFNwYXduIG1vZGUgd2hlbiBgb3B0aW9uYCBpcyBvbWl0dGVkIChgXCJpbmhlcml0XCJgIGJ5IGRlZmF1bHQpXG4gKiBAcmV0dXJucyBWYWx1ZSBmb3IgdGhlIGBzcGF3blN5bmNgIHN0ZGlvIHR1cGxlXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTeW5jU3RkaW8oXG4gIG9wdGlvbjogU3luY0V4ZWNTdGRpbyB8IHVuZGVmaW5lZCxcbiAgZGVmYXVsdE1vZGU6IEV4ZWNTdGRpbyA9IFwiaW5oZXJpdFwiLFxuKTogRXhlY1N0ZGlvIHtcbiAgaWYgKG9wdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdE1vZGU7XG4gIGlmIChvcHRpb24gPT09IFwiY2FwdHVyZVwiKSByZXR1cm4gXCJwaXBlXCI7XG4gIHJldHVybiBvcHRpb247XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHJhdyBgc3Bhd25TeW5jYCBvdXRwdXQgdG8gYSBVVEYtOCBzdHJpbmcgd2hlbiBjYXB0dXJlIGlzIGVuYWJsZWQuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVkVGV4dChvdXRwdXQ6IHN0cmluZyB8IEJ1ZmZlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3V0cHV0ID09PSBudWxsIHx8IG91dHB1dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIG91dHB1dCA9PT0gXCJzdHJpbmdcIiA/IG91dHB1dCA6IG91dHB1dC50b1N0cmluZyhcInV0ZjhcIik7XG59XG5cbi8qKlxuICogU3BsaXQgY2FwdHVyZWQgcHJvY2VzcyBvdXRwdXQgaW50byBsaW5lcyBmb3Ige0BsaW5rIEV4ZWNSZXN1bHQuc3Rkb3V0TGluZXN9IC9cbiAqIHtAbGluayBFeGVjUmVzdWx0LnN0ZGVyckxpbmVzfSAoe0BsaW5rIHNwYXduU3luY30gb25seTsgaW52b2tlZCBsYXppbHkpLlxuICovXG5mdW5jdGlvbiBsaW5lc0Zyb21DYXB0dXJlZE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIG91dHB1dC5yZXBsYWNlKC9cXHJcXG4vZywgXCJcXG5cIikucmVwbGFjZSgvXFxyL2csIFwiXFxuXCIpLnNwbGl0KFwiXFxuXCIpO1xufVxuXG4vKipcbiAqIFN0b3AgYSBjaGlsZCBwcm9jZXNzIGFuZCBkZXNjZW5kYW50cyBkaXNjb3ZlcmVkIHRocm91Z2ggb3BlcmF0aW5nLXN5c3RlbVxuICogcHJvY2VzcyBzbmFwc2hvdHMuXG4gKlxuICogVGhlIGluaXRpYWwgdHJlZSBpcyByZXRhaW5lZCBiZWZvcmUgc2lnbmFsaW5nIHNvIGRlc2NlbmRhbnRzIHJlbWFpblxuICogdGFyZ2V0YWJsZSBhZnRlciB0aGVpciBwYXJlbnQgZXhpdHMgb3IgdGhleSBhcmUgcmVwYXJlbnRlZC4gUG9sbGluZyByZWZyZXNoZXNcbiAqIHRoZSBwcm9jZXNzIHRhYmxlLCBtZXJnZXMgbmV3bHkgY3JlYXRlZCBkZXNjZW5kYW50cywgYW5kIHNlbmRzIGVhY2ggb25lIHRoZVxuICogYWN0aXZlIHNodXRkb3duIHNpZ25hbCBvbmNlLiBJZGVudGl0eS1tYXRjaGVkIHN1cnZpdm9ycyByZWNlaXZlIHRoZSBmb3JjZVxuICogc2lnbmFsIGFmdGVyIHRoZSBncmFjZWZ1bCB0aW1lb3V0LiBtYWNPUyBhbmQgb3RoZXIgUE9TSVggcGxhdGZvcm1zIHVzZSBgcHNgO1xuICogV2luZG93cyB1c2VzIHRoZSBidWlsdC1pbiBQb3dlclNoZWxsIENJTSBwcm9jZXNzIHByb3ZpZGVyLlxuICpcbiAqIFdpbmRvd3MgZG9lcyBub3QgaW1wbGVtZW50IFBPU0lYIHNpZ25hbCBzZW1hbnRpY3MuIE5vZGUgdGVybWluYXRlcyBwcm9jZXNzZXNcbiAqIHVuY29uZGl0aW9uYWxseSBmb3Igc3VwcG9ydGVkIHNpZ25hbHMgdGhlcmUsIGluY2x1ZGluZyBgU0lHVEVSTWAuXG4gKlxuICogQHBhcmFtIGNoaWxkIC0gUm9vdCBjaGlsZCBwcm9jZXNzIHdob3NlIHNuYXBzaG90dGVkIHRyZWUgc2hvdWxkIHN0b3BcbiAqIEBwYXJhbSBvcHRpb25zIC0gR3JhY2VmdWwgc2lnbmFsLCBmb3JjZSBzaWduYWwsIHRpbWVvdXQsIGFuZCBwb2xsaW5nIHBvbGljeVxuICogQHRocm93cyBXaGVuIHRoZSBwcm9jZXNzIHRhYmxlIGNhbm5vdCBiZSBjYXB0dXJlZCwgYSBzaWduYWwgY2Fubm90IGJlIHNlbnQsXG4gKiBvciBpZGVudGl0eS1tYXRjaGVkIHByb2Nlc3NlcyByZW1haW4gYWZ0ZXIgdGhlIGZvcmNlIHRpbWVvdXRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGwoY2hpbGQ6IENoaWxkUHJvY2Vzcywgb3B0aW9uczogS2lsbE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQgfHwgY2hpbGQuZXhpdENvZGUgIT09IG51bGwgfHwgY2hpbGQuc2lnbmFsQ29kZSAhPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGdyYWNlZnVsVGltZW91dE1zID0gdGltZW91dFZhbHVlKFxuICAgIG9wdGlvbnMuZ3JhY2VmdWxUaW1lb3V0TXMgPz8gREVGQVVMVF9HUkFDRUZVTF9USU1FT1VUX01TLFxuICAgIFwiZ3JhY2VmdWxUaW1lb3V0TXNcIixcbiAgKTtcbiAgY29uc3QgZm9yY2VUaW1lb3V0TXMgPSB0aW1lb3V0VmFsdWUoXG4gICAgb3B0aW9ucy5mb3JjZVRpbWVvdXRNcyA/PyBERUZBVUxUX0ZPUkNFX1RJTUVPVVRfTVMsXG4gICAgXCJmb3JjZVRpbWVvdXRNc1wiLFxuICApO1xuICBjb25zdCBwb2xsSW50ZXJ2YWxNcyA9IHBvbGxJbnRlcnZhbFZhbHVlKG9wdGlvbnMucG9sbEludGVydmFsTXMgPz8gREVGQVVMVF9LSUxMX1BPTExfSU5URVJWQUxfTVMpO1xuICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHByb2Nlc3NTbmFwc2hvdCgpO1xuICBpZiAoY2hpbGQuZXhpdENvZGUgIT09IG51bGwgfHwgY2hpbGQuc2lnbmFsQ29kZSAhPT0gbnVsbCkgcmV0dXJuO1xuICBjb25zdCB0cmVlID0gcHJvY2Vzc1RyZWUoc25hcHNob3QsIGNoaWxkLnBpZCk7XG4gIGNvbnN0IHJldGFpbmVkID0gbmV3IE1hcCh0cmVlLm1hcCgoZW50cnkpID0+IFtlbnRyeS5waWQsIGVudHJ5XSkpO1xuXG4gIGNvbnN0IGdyYWNlZnVsU2lnbmFsID0gb3B0aW9ucy5ncmFjZWZ1bFNpZ25hbCA/PyBcIlNJR1RFUk1cIjtcbiAgY29uc3QgZ3JhY2VmdWxTaWduYWxlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBzaWduYWxQcm9jZXNzZXModHJlZSwgZ3JhY2VmdWxTaWduYWwsIGdyYWNlZnVsU2lnbmFsZWQpO1xuICBjb25zdCBncmFjZWZ1bFN1cnZpdm9ycyA9IGF3YWl0IHdhaXRGb3JQcm9jZXNzVHJlZUV4aXQoXG4gICAgcmV0YWluZWQsXG4gICAgdHJlZSxcbiAgICBncmFjZWZ1bFNpZ25hbCxcbiAgICBncmFjZWZ1bFNpZ25hbGVkLFxuICAgIGdyYWNlZnVsVGltZW91dE1zLFxuICAgIHBvbGxJbnRlcnZhbE1zLFxuICApO1xuICBjb25zdCBmb3JjZVRhcmdldHMgPSBncmFjZWZ1bFN1cnZpdm9ycztcbiAgaWYgKGZvcmNlVGFyZ2V0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBmb3JjZVNpZ25hbCA9IG9wdGlvbnMuZm9yY2VTaWduYWwgPz8gXCJTSUdLSUxMXCI7XG4gIGNvbnN0IGZvcmNlU2lnbmFsZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgc2lnbmFsUHJvY2Vzc2VzKGZvcmNlVGFyZ2V0cywgZm9yY2VTaWduYWwsIGZvcmNlU2lnbmFsZWQpO1xuICBjb25zdCBmb3JjZWRTdXJ2aXZvcnMgPSBhd2FpdCB3YWl0Rm9yUHJvY2Vzc1RyZWVFeGl0KFxuICAgIHJldGFpbmVkLFxuICAgIGZvcmNlVGFyZ2V0cyxcbiAgICBmb3JjZVNpZ25hbCxcbiAgICBmb3JjZVNpZ25hbGVkLFxuICAgIGZvcmNlVGltZW91dE1zLFxuICAgIHBvbGxJbnRlcnZhbE1zLFxuICApO1xuICBjb25zdCByZW1haW5pbmcgPSBmb3JjZWRTdXJ2aXZvcnM7XG4gIGlmIChyZW1haW5pbmcubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBQcm9jZXNzZXMgZGlkIG5vdCB0ZXJtaW5hdGUgYWZ0ZXIgJHtmb3JjZVNpZ25hbH06ICR7cmVtYWluaW5nXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS5waWQpXG4gICAgICAgIC5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogU3Bhd24gYSBzdWJwcm9jZXNzLiBSZXR1cm5zIHRoZSBMSVZFIGNoaWxkIGhhbmRsZSB0aGF0IGlzIEFMU08gYVxuICogYFByb21pc2U8RXhlY1Jlc3VsdD5gIHJlc29sdmluZyBvbiBleGl0IC0gc2VlIHtAbGluayBDaGlsZFByb2Nlc3NSZXN1bHR9LlxuICpcbiAqIFRoZSBwcm9taXNlIGhhbGYgaXMgdGhlIGV4YWN0IGJlaGF2aW91ciB0aGlzIGZ1bmN0aW9uIGhhZCBiZWZvcmU6IGl0IGF3YWl0c1xuICogZXhpdCAoYW5kIGFueSBsaW5lIHJlYWRzIC8gc3RkaW4gd3JpdGUpLCB0aGVuIHJlc29sdmVzIHRvIHRoZSB7QGxpbmsgRXhlY1Jlc3VsdH1cbiAqIG9yIHJlamVjdHMgKHNwYXduIGVycm9yIG90aGVyIHRoYW4gYSBtaXNzaW5nIGV4ZWN1dGFibGUsIG9yIGBjaGVja2Agb24gbm9uLXplcm9cbiAqIGV4aXQpLiBFeGlzdGluZyBgYXdhaXQgc3Bhd24oLi4uKWAgY2FsbGVycyBhcmUgdW5hZmZlY3RlZC4gVGhlIGhhbmRsZSBoYWxmIGxldHMgYVxuICogY2FsbGVyIHN1cGVydmlzZSB0aGUgcHJvY2VzcyAoYC5waWRgLCBgLmtpbGwoc2lnbmFsKWAsIGBleGl0YCBldmVudCkgd2l0aG91dCBhXG4gKiBzZWNvbmQgc3Bhd24gLSBlLmcuIGBAZGJ4LXRvb2xzL2FwcGtpdGAncyBgYmluZFByb2Nlc3NgLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSB0byBydW4gKHJlc29sdmVkIG9uIGBQQVRIYCB3aGVuIGBzaGVsbGAgaXMgc2V0IG9uIG9wdGlvbnMpXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdmVyYmF0aW0gdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gU3Bhd24sIHN0ZGlvLCBhbmQgY2hlY2sgb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGxpdmUgYENoaWxkUHJvY2Vzc2AsIGF3YWl0YWJsZSB0byBleGl0IGNvZGUgKyBjYXB0dXJlZCBvdXRwdXRcbiAqIEB0aHJvd3MgKG9uIHRoZSBwcm9taXNlKSBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZ1xuICogZXhlY3V0YWJsZSwgbGluZSByZWFkcyBmYWlsLCBvciBgY2hlY2tgIGlzIHRydWUgYW5kIGV4aXQgY29kZSBpcyBub24temVyb1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3Bhd24oLi4uYXJnczogU3Bhd25BcmdzPEV4ZWNPcHRpb25zPik6IENoaWxkUHJvY2Vzc1Jlc3VsdCB7XG4gIGNvbnN0IHsgY29tbWFuZCwgY29tbWFuZEFyZ3MsIG9wdGlvbnMgPSB7fSB9ID0gcGFyc2VTcGF3bkFyZ3MoYXJncyk7XG4gIGNvbnN0IHsgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBjaGVjaywgdHJpbSwgLi4uc3Bhd25PcHRzIH0gPSBvcHRpb25zO1xuICBjb25zdCBzdGRvdXRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RkZXJyTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0ZG91dEhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3Rkb3V0LCBzdGRvdXRMaW5lcyk7XG4gIGNvbnN0IHN0ZGVyckhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3RkZXJyLCBzdGRlcnJMaW5lcyk7XG4gIGNvbnN0IHN0ZGluTW9kZTogRXhlY1N0ZGlvID0gaXNTdGRpblBheWxvYWQoc3RkaW4pID8gXCJwaXBlXCIgOiAoc3RkaW4gPz8gXCJpbmhlcml0XCIpO1xuXG4gIGNvbnN0IHByb2MgPSBub2RlU3Bhd24oY29tbWFuZCwgY29tbWFuZEFyZ3MsIHtcbiAgICAuLi5zcGF3bk9wdHMsXG4gICAgc3RkaW86IFtzdGRpbk1vZGUsIHN0ZG91dEhhbmRsZXIubW9kZSwgc3RkZXJySGFuZGxlci5tb2RlXSxcbiAgfSk7XG5cbiAgY29uc3Qgc3RkaW5Xcml0ZSA9IHdyaXRlU3RkaW4ocHJvYywgc3RkaW4pO1xuXG4gIGNvbnN0IHJlYWRzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3Rkb3V0LCBzdGRvdXRIYW5kbGVyKTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3RkZXJyLCBzdGRlcnJIYW5kbGVyKTtcblxuICBjb25zdCBjb21wbGV0aW9uID0gKGFzeW5jICgpOiBQcm9taXNlPEV4ZWNSZXN1bHQ+ID0+IHtcbiAgICBsZXQgZXhpdENvZGUgPSAxO1xuICAgIGxldCBjb21tYW5kTm90Rm91bmRFcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBleGl0Q29kZSA9IGF3YWl0IHdhaXRGb3JFeGl0KHByb2MpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoIWlzQ29tbWFuZE5vdEZvdW5kRXJyb3IoZXJyKSkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHByb2Muc3RkaW4/LmRlc3Ryb3koKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5kZXN0cm95KCk7XG4gICAgICBwcm9jLnN0ZGVycj8uZGVzdHJveSgpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtzdGRpbldyaXRlXSk7XG4gICAgICBmb3IgKGNvbnN0IHJlYWQgb2YgcmVhZHMpIHZvaWQgcmVhZC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgY29tbWFuZE5vdEZvdW5kRXJyb3IgPSBlcnI7XG4gICAgICBleGl0Q29kZSA9IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRMaW5lcywgc3RkZXJyTGluZXMsIHRyaW0pO1xuICAgIGlmIChjaGVjayAmJiByZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgcmVzdWx0KTtcbiAgICAgIGlmIChjb21tYW5kTm90Rm91bmRFcnJvcikgZXJyLmNhdXNlID0gY29tbWFuZE5vdEZvdW5kRXJyb3I7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pKCk7XG5cbiAgLy8gQXR0YWNoIHRoZSBwcm9taXNlIGludGVyZmFjZSBvbnRvIHRoZSBsaXZlIGNoaWxkIHNvIE9ORSBvYmplY3QgaXMgYm90aC4gVGhlXG4gIC8vIG1ldGhvZHMgYXJlIGJvdW5kIHRvIGBjb21wbGV0aW9uYCBzbyBgdGhpc2AgaXMgdGhlIHJlYWwgcHJvbWlzZTsgdGhlIGNoaWxkXG4gIC8vIG93bnMgbm8gY29uZmxpY3RpbmcgYHRoZW5gL2BjYXRjaGAvYGZpbmFsbHlgLCBzbyB0aGlzIGlzIHB1cmVseSBhZGRpdGl2ZS5cbiAgcmV0dXJuIGF0dGFjaFByb21pc2UocHJvYywgY29tcGxldGlvbik7XG59XG5cbi8qKlxuICogQXR0YWNoIGEgcHJvbWlzZSdzIGB0aGVuYCAvIGBjYXRjaGAgLyBgZmluYWxseWAgb250byBhIGxpdmUgb2JqZWN0LCByZXR1cm5pbmdcbiAqIHRoZSBzYW1lIG9iamVjdCB0eXBlZCBhcyBib3RoLiBVc2VkIGJ5IHtAbGluayBzcGF3bn0gdG8gbWFrZSBpdHMgYENoaWxkUHJvY2Vzc2BcbiAqIGF3YWl0YWJsZSB3aXRob3V0IHdyYXBwaW5nIGl0IC0gc28gY2FsbGVycyBrZWVwIHRoZSBsaXZlIGhhbmRsZSBBTkQgYGF3YWl0YCBpdC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoUHJvbWlzZTxUIGV4dGVuZHMgb2JqZWN0LCBSPih0YXJnZXQ6IFQsIHByb21pc2U6IFByb21pc2U8Uj4pOiBUICYgUHJvbWlzZTxSPiB7XG4gIGNvbnN0IGh5YnJpZCA9IHRhcmdldCBhcyBUICYgUHJvbWlzZTxSPjtcbiAgaHlicmlkLnRoZW4gPSBwcm9taXNlLnRoZW4uYmluZChwcm9taXNlKTtcbiAgaHlicmlkLmNhdGNoID0gcHJvbWlzZS5jYXRjaC5iaW5kKHByb21pc2UpO1xuICBoeWJyaWQuZmluYWxseSA9IHByb21pc2UuZmluYWxseS5iaW5kKHByb21pc2UpO1xuICByZXR1cm4gaHlicmlkO1xufVxuXG4vKipcbiAqIFNwYXduIGEgc3VicHJvY2VzcyBzeW5jaHJvbm91c2x5IGFuZCB3YWl0IGZvciBleGl0LlxuICpcbiAqIFVubGlrZSB7QGxpbmsgc3Bhd259LCBzdGRpbyBvcHRpb25zIGFyZSBsaW1pdGVkIHRvIGBcImluaGVyaXRcImAsIGBcInBpcGVcImAsXG4gKiBgXCJpZ25vcmVcImAsIGFuZCBgXCJjYXB0dXJlXCJgIOKAlCBubyBwZXItbGluZSBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBFeGVjdXRhYmxlIHRvIHJ1biAocmVzb2x2ZWQgb24gYFBBVEhgIHdoZW4gYHNoZWxsYCBpcyBzZXQgb24gb3B0aW9ucylcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB2ZXJiYXRpbSB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHNwYXduU3luYyAtIFNwYXduLCBzdGRpbywgYW5kIGNoZWNrIG9wdGlvbnNcbiAqIEByZXR1cm5zIEV4aXQgY29kZSwgY2FwdHVyZWQgbGluZSBhcnJheXMsIGFuZCB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVyc1xuICogQHRocm93cyBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZyBleGVjdXRhYmxlLCBvclxuICogYGNoZWNrYCBpcyB0cnVlIGFuZCBleGl0IGNvZGUgaXMgbm9uLXplcm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyguLi5hcmdzOiBTcGF3bkFyZ3M8U3luY0V4ZWNPcHRpb25zPik6IEV4ZWNSZXN1bHQge1xuICBjb25zdCB7IGNvbW1hbmQsIGNvbW1hbmRBcmdzLCBvcHRpb25zID0ge30gfSA9IHBhcnNlU3Bhd25BcmdzKGFyZ3MpO1xuICBjb25zdCB7IHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgY2hlY2ssIHRyaW0sIC4uLnNwYXduT3B0cyB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3RkaW5Nb2RlOiBFeGVjU3RkaW8gPSBpc1N0ZGluUGF5bG9hZChzdGRpbikgPyBcInBpcGVcIiA6IChzdGRpbiA/PyBcImluaGVyaXRcIik7XG4gIGNvbnN0IGNhcHR1cmVTdGRvdXQgPSBzdGRvdXQgPT09IFwiY2FwdHVyZVwiO1xuICBjb25zdCBjYXB0dXJlU3RkZXJyID0gc3RkZXJyID09PSBcImNhcHR1cmVcIjtcbiAgY29uc3Qgc3Rkb3V0TW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3Rkb3V0KTtcbiAgY29uc3Qgc3RkZXJyTW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3RkZXJyKTtcblxuICBjb25zdCByZXN1bHQgPSBub2RlU3Bhd25TeW5jKGNvbW1hbmQsIGNvbW1hbmRBcmdzLCB7XG4gICAgLi4uc3Bhd25PcHRzLFxuICAgIGVuY29kaW5nOiBjYXB0dXJlU3Rkb3V0IHx8IGNhcHR1cmVTdGRlcnIgPyBcInV0ZjhcIiA6IHVuZGVmaW5lZCxcbiAgICBzdGRpbzogW3N0ZGluTW9kZSwgc3Rkb3V0TW9kZSwgc3RkZXJyTW9kZV0sXG4gICAgaW5wdXQ6IGlzU3RkaW5QYXlsb2FkKHN0ZGluKSA/IHN0ZGluIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICBjb25zdCBjb21tYW5kTm90Rm91bmQgPSBpc0NvbW1hbmROb3RGb3VuZEVycm9yKHJlc3VsdC5lcnJvcik7XG4gIGNvbnN0IGV4aXRDb2RlID0gY29tbWFuZE5vdEZvdW5kID8gQ09NTUFORF9OT1RfRk9VTkRfRVhJVF9DT0RFIDogKHJlc3VsdC5zdGF0dXMgPz8gMSk7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSBjYXB0dXJlU3Rkb3V0ID8gY2FwdHVyZWRUZXh0KHJlc3VsdC5zdGRvdXQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGRlcnJUZXh0ID0gY2FwdHVyZVN0ZGVyciA/IGNhcHR1cmVkVGV4dChyZXN1bHQuc3RkZXJyKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGNyZWF0ZVN5bmNFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRUZXh0LCBzdGRlcnJUZXh0LCB0cmltKTtcblxuICBpZiAocmVzdWx0LmVycm9yICYmICghY29tbWFuZE5vdEZvdW5kIHx8IGNoZWNrKSkge1xuICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgZXhlY1Jlc3VsdCk7XG4gICAgZXJyLmNhdXNlID0gcmVzdWx0LmVycm9yO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGlmIChjaGVjayAmJiBleGVjUmVzdWx0LmV4aXRDb2RlICE9PSAwKSB0aHJvdyBleGVjRXJyb3IoY29tbWFuZCwgY29tbWFuZEFyZ3MsIGV4ZWNSZXN1bHQpO1xuICByZXR1cm4gZXhlY1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBzaGVsbC1saWtlIGNvbW1hbmQgaW50byBhcmd2LlxuICpcbiAqIFN1cHBvcnRzOlxuICogICAtIHdoaXRlc3BhY2Ugc2VwYXJhdG9yc1xuICogICAtIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlc1xuICogICAtIGJhY2tzbGFzaCBlc2NhcGluZ1xuICogICAtIGVzY2FwZWQgc3BhY2VzXG4gKiAgIC0gZW1wdHkgcXVvdGVkIHN0cmluZ3NcbiAqXG4gKiBJZiB0aGUgaW5wdXQgaXMgbWFsZm9ybWVkIChmb3IgZXhhbXBsZSwgYW4gdW50ZXJtaW5hdGVkIHF1b3RlKSxcbiAqIHJldHVybnMgdGhlIG9yaWdpbmFsIHN0cmluZyBhcyBhIHNpbmdsZSBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNobGV4KGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICBsZXQgY3VycmVudCA9IFwiXCI7XG4gIGxldCBxdW90ZTogXCInXCIgfCAnXCInIHwgdW5kZWZpbmVkO1xuICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuICBsZXQgcXVvdGVkID0gZmFsc2U7XG5cbiAgY29uc3QgcHVzaCA9ICgpID0+IHtcbiAgICBpZiAocXVvdGVkIHx8IGN1cnJlbnQubGVuZ3RoID4gMCkge1xuICAgICAgYXJncy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cbiAgICBjdXJyZW50ID0gXCJcIjtcbiAgICBxdW90ZWQgPSBmYWxzZTtcbiAgfTtcblxuICBmb3IgKGNvbnN0IGNoIG9mIGNvbW1hbmQpIHtcbiAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCJcXFxcXCIpIHtcbiAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG4gICAgICAgIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCInXCIgfHwgY2ggPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2g7XG4gICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKC9cXHMvLnRlc3QoY2gpKSB7XG4gICAgICBwdXNoKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjdXJyZW50ICs9IGNoO1xuICB9XG5cbiAgLy8gTWFsZm9ybWVkIGlucHV0OiB0cmVhdCBhcyBhIGxpdGVyYWwgY29tbWFuZC5cbiAgaWYgKHF1b3RlKSB7XG4gICAgcmV0dXJuIFtjb21tYW5kXTtcbiAgfVxuXG4gIC8vIFRyYWlsaW5nIGJhY2tzbGFzaCBpcyBsaXRlcmFsLlxuICBpZiAoZXNjYXBlZCkge1xuICAgIGN1cnJlbnQgKz0gXCJcXFxcXCI7XG4gIH1cblxuICBwdXNoKCk7XG5cbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID8gYXJncyA6IFtjb21tYW5kXTtcbn1cbiJdfQ==