tryharder 0.1.0 → 0.1.1

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/README.md CHANGED
@@ -59,10 +59,9 @@ const result = await try$
59
59
  - [all and allSettled](#all-and-allsettled)
60
60
  - [flow and $exit](#flow-and-exit)
61
61
  - [gen](#gen)
62
- - [dispose](#dispose)
62
+ - [dispose](#dispose)
63
63
  - [API Reference](#api-reference)
64
64
  - [Common Recipes](#common-recipes)
65
- - [Limitations](#limitations)
66
65
  - [When not to use tryharder](#when-not-to-use-tryharder)
67
66
  - [Contributing](#contributing)
68
67
  - [Acknowledgments](#acknowledgments)
@@ -498,37 +497,46 @@ const value = await try$.gen(function* (use) {
498
497
 
499
498
  ### dispose
500
499
 
501
- Use `dispose()` when cleanup should stay colocated with the workflow that allocates the resource, even across async boundaries.
500
+ Use `dispose()` when cleanup should stay colocated with the workflow that allocates the resource, even across async boundaries. The returned `AsyncDisposer` gives you three core operations:
501
+
502
+ - `add(fn)` registers a cleanup callback.
503
+ - `use(resource)` tracks a disposable resource.
504
+ - `cleanup()` runs the registered teardown in reverse order.
502
505
 
503
506
  ```ts
504
507
  await using disposer = try$.dispose()
505
- const connection = await db.connect()
506
508
 
507
- disposer.defer(async () => {
508
- await connection.close()
509
- })
509
+ {
510
+ const connection = await db.connect()
511
+
512
+ disposer.add(async () => {
513
+ await connection.close()
514
+ })
510
515
 
511
- const user = await connection.users.findById("user_123")
516
+ const user = await connection.users.findById("user_123")
517
+ }
512
518
  ```
513
519
 
520
+ `tryharder` handles the cleanup bookkeeping internally, so native `DisposableStack` or `AsyncDisposableStack` globals are not required.
521
+
514
522
  ## API Reference
515
523
 
516
524
  ### Runtime
517
525
 
518
- | Export | Description |
519
- | -------------- | ------------------------------------------------------------------ |
520
- | `run` | Async terminal execution API |
521
- | `runSync` | Sync terminal execution API |
522
- | `retry` | Create an execution-scoped retry builder |
523
- | `retryOptions` | Normalize retry policy input |
524
- | `timeout` | Add a total execution timeout |
525
- | `signal` | Add external cancellation to execution or root-level orchestration |
526
- | `wrap` | Add top-level observational middleware |
527
- | `all` | Run a fail-fast parallel named task graph |
528
- | `allSettled` | Run a settled parallel named task graph |
529
- | `flow` | Run an ordered workflow with explicit early exit |
530
- | `gen` | Compose `run(...)` results through generators |
531
- | `dispose` | Create an `AsyncDisposableStack` helper |
526
+ | Export | Description |
527
+ | -------------- | ----------------------------------------------------------------------- |
528
+ | `run` | Async terminal execution API |
529
+ | `runSync` | Sync terminal execution API |
530
+ | `retry` | Create an execution-scoped retry builder |
531
+ | `retryOptions` | Normalize retry policy input |
532
+ | `timeout` | Add a total execution timeout |
533
+ | `signal` | Add external cancellation to execution or root-level orchestration |
534
+ | `wrap` | Add top-level observational middleware |
535
+ | `all` | Run a fail-fast parallel named task graph |
536
+ | `allSettled` | Run a settled parallel named task graph |
537
+ | `flow` | Run an ordered workflow with explicit early exit |
538
+ | `gen` | Compose `run(...)` results through generators |
539
+ | `dispose` | Create an `AsyncDisposer` helper with `add()`, `use()`, and `cleanup()` |
532
540
 
533
541
  ### Errors
534
542
 
@@ -549,6 +557,7 @@ Exports from `tryharder/types`:
549
557
  | Export | Description |
550
558
  | ------------------ | ---------------------------------------------------- |
551
559
  | `AllSettledResult` | Settled result map returned by `allSettled(...)` |
560
+ | `AsyncDisposer` | Async cleanup helper returned by `dispose()` |
552
561
  | `SettledFulfilled` | Fulfilled branch of a settled task result |
553
562
  | `SettledRejected` | Rejected branch of a settled task result |
554
563
  | `SettledResult` | Union of fulfilled and rejected settled task results |
@@ -557,7 +566,7 @@ Exports from `tryharder/types`:
557
566
  ```ts
558
567
  import * as try$ from "tryharder"
559
568
  import { Panic, TimeoutError, UnhandledException } from "tryharder/errors"
560
- import type { FlowExit, SettledResult } from "tryharder/types"
569
+ import type { AsyncDisposer, FlowExit, SettledResult } from "tryharder/types"
561
570
  ```
562
571
 
563
572
  ## Common Recipes
@@ -672,20 +681,11 @@ const value = await try$.run({
672
681
  })
673
682
  ```
674
683
 
675
- ## Limitations
676
-
677
- - `tryharder` currently assumes `DisposableStack` and `AsyncDisposableStack` are available at runtime because the executor layer uses them internally, not just when you call `dispose()` yourself.
678
- - This can break consumers on runtimes that do not yet provide those globals, notably Firefox and Safari.
679
- - The tracked fix is [#36 Bundle DisposableStack polyfill for runtimes without native support](https://github.com/adelrodriguez/tryharder/issues/36).
680
- - Until that issue is resolved, use `tryharder` on runtimes with native disposable-stack support or provide a compatible polyfill before loading the package.
684
+ ## When not to use
681
685
 
682
- ## When not to use tryharder
686
+ When you can use [`Effect`](https://github.com/Effect-TS/effect) in your codebase.
683
687
 
684
- - **Small scripts or one-off tasks** - Plain `try/catch` is often simpler when you do not need retries, cancellation, or orchestration.
685
- - **You already use an effect system or result abstraction** - If your codebase already has a consistent execution model, adding `tryharder` may be redundant.
686
- - **Your workflows are mostly straightforward Promise chains** - `all(...)` and `flow(...)` help when coordination matters; otherwise native composition may be clearer.
687
- - **Your team prefers explicit `Result` values everywhere** - `tryharder` centers execution wrappers, not a dedicated result data type.
688
- - **You do not want policy-driven execution behavior** - If retry and timeout semantics are unnecessary overhead, the abstraction may not pay for itself.
688
+ Seriously, Effect is a much more powerful and complete solution.
689
689
 
690
690
  ## Contributing
691
691
 
package/dist/errors.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  RetryExhaustedError,
5
5
  TimeoutError,
6
6
  UnhandledException
7
- } from "./shared/chunk-vqm4xgxv.js";
7
+ } from "./shared/chunk-vavcyath.js";
8
8
  export {
9
9
  UnhandledException,
10
10
  TimeoutError,
package/dist/index.d.ts CHANGED
@@ -12,13 +12,20 @@ declare class RetryExhaustedError extends Error {
12
12
  declare class UnhandledException extends Error {
13
13
  constructor(message?: string, options?: ErrorOptions);
14
14
  }
15
+ interface AsyncDisposer extends AsyncDisposable {
16
+ add(fn: () => void | PromiseLike<void>): void;
17
+ cleanup(): Promise<void>;
18
+ defer(fn: () => void | PromiseLike<void>): void;
19
+ use<T extends AsyncDisposable | Disposable | null | undefined>(value: T): T;
20
+ disposeAsync(): Promise<void>;
21
+ }
15
22
  type TaskRecord = Record<string, any>;
16
23
  type TaskValidation<T extends TaskRecord> = { [K in keyof T] : T[K] extends (...args: any[]) => any ? T[K] : never };
17
24
  type TaskResult<T> = T extends (...args: any[]) => infer R ? Awaited<R> : never;
18
25
  type InferredTaskContext<T extends TaskRecord> = {
19
26
  $result: { readonly [K in keyof T] : ReturnType<T[K]> extends Promise<infer R> ? Promise<R> : Promise<ReturnType<T[K]>> };
20
27
  $signal: AbortSignal;
21
- $disposer: AsyncDisposableStack;
28
+ $disposer: AsyncDisposer;
22
29
  };
23
30
  type AllValue<T extends TaskRecord> = { [K in keyof T] : TaskResult<T[K]> };
24
31
  interface AllCatchContext<T extends TaskRecord> {
@@ -241,7 +248,7 @@ declare class RunBuilder<
241
248
  allSettled<T extends TaskRecord>(tasks: T & TaskValidation<NoInfer<T>> & ThisType<InferredTaskContext<T>>): Promise<AllSettledResult<T>>;
242
249
  flow<T extends TaskRecord>(tasks: T & ThisType<InferredFlowTaskContext<T>>): Promise<FlowResult<T>>;
243
250
  }
244
- declare function dispose(): AsyncDisposableStack;
251
+ declare function dispose(): AsyncDisposer;
245
252
  type GenUnwrap<T> = Exclude<Awaited<T>, Error>;
246
253
  type GenUse = <T>(value: T) => Generator<T, GenUnwrap<T>, GenUnwrap<T>>;
247
254
  type GenErrors<TYield> = Extract<Awaited<TYield>, Error>;
package/dist/index.js CHANGED
@@ -7,7 +7,171 @@ import {
7
7
  UnhandledException,
8
8
  __callDispose,
9
9
  __using
10
- } from "./shared/chunk-vqm4xgxv.js";
10
+ } from "./shared/chunk-vavcyath.js";
11
+
12
+ // src/shims/disposer.ts
13
+ var SUPPRESSED_ERROR_MESSAGE = "An error was suppressed during disposal";
14
+ var nativeDispose = Reflect.get(Symbol, "dispose");
15
+ var nativeAsyncDispose = Reflect.get(Symbol, "asyncDispose");
16
+ var DISPOSE = typeof nativeDispose === "symbol" ? nativeDispose : Symbol.for("Symbol.dispose");
17
+ var ASYNC_DISPOSE = typeof nativeAsyncDispose === "symbol" ? nativeAsyncDispose : Symbol.for("Symbol.asyncDispose");
18
+ function defineDisposeAlias(prototype) {
19
+ Object.defineProperty(prototype, DISPOSE, {
20
+ configurable: true,
21
+ value() {
22
+ this.dispose();
23
+ },
24
+ writable: true
25
+ });
26
+ }
27
+ function defineAsyncDisposeAlias(prototype) {
28
+ Object.defineProperty(prototype, ASYNC_DISPOSE, {
29
+ configurable: true,
30
+ async value() {
31
+ await this.disposeAsync();
32
+ },
33
+ writable: true
34
+ });
35
+ }
36
+ function createSuppressedError(error, suppressed) {
37
+ if (typeof SuppressedError === "function") {
38
+ return new SuppressedError(error, suppressed, SUPPRESSED_ERROR_MESSAGE);
39
+ }
40
+ const wrapped = new Error(SUPPRESSED_ERROR_MESSAGE);
41
+ wrapped.name = "SuppressedError";
42
+ wrapped.error = error;
43
+ wrapped.suppressed = suppressed;
44
+ return wrapped;
45
+ }
46
+ function checkCanRegister(disposed, name) {
47
+ if (disposed) {
48
+ throw new ReferenceError(`${name} already disposed`);
49
+ }
50
+ }
51
+ function resolveSyncDisposer(value) {
52
+ const candidate = value;
53
+ const disposer = candidate[DISPOSE];
54
+ if (typeof disposer !== "function") {
55
+ throw new TypeError("Object not disposable");
56
+ }
57
+ return () => {
58
+ disposer.call(value);
59
+ };
60
+ }
61
+ function resolveAsyncDisposer(value) {
62
+ const asyncCandidate = value;
63
+ const asyncDisposer = asyncCandidate[ASYNC_DISPOSE];
64
+ if (typeof asyncDisposer === "function") {
65
+ return () => asyncDisposer.call(value);
66
+ }
67
+ const syncCandidate = value;
68
+ const syncDisposer = syncCandidate[DISPOSE];
69
+ if (typeof syncDisposer === "function") {
70
+ return () => {
71
+ syncDisposer.call(value);
72
+ };
73
+ }
74
+ throw new TypeError("Object not disposable");
75
+ }
76
+
77
+ class InternalDisposableStack {
78
+ #disposed = false;
79
+ #stack = [];
80
+ defer(fn) {
81
+ checkCanRegister(this.#disposed, "DisposableStack");
82
+ if (typeof fn !== "function") {
83
+ throw new TypeError(`${String(fn)} is not a function`);
84
+ }
85
+ this.#stack.push(fn);
86
+ }
87
+ use(value) {
88
+ if (value === null || value === undefined) {
89
+ return value;
90
+ }
91
+ checkCanRegister(this.#disposed, "DisposableStack");
92
+ this.#stack.push(resolveSyncDisposer(value));
93
+ return value;
94
+ }
95
+ dispose() {
96
+ this.#disposeAll();
97
+ }
98
+ #disposeAll() {
99
+ if (this.#disposed) {
100
+ return;
101
+ }
102
+ this.#disposed = true;
103
+ let error;
104
+ while (this.#stack.length > 0) {
105
+ const disposer = this.#stack.pop();
106
+ if (!disposer) {
107
+ continue;
108
+ }
109
+ try {
110
+ disposer();
111
+ } catch (caughtError) {
112
+ error = error === undefined ? caughtError : createSuppressedError(caughtError, error);
113
+ }
114
+ }
115
+ if (error !== undefined) {
116
+ throw error;
117
+ }
118
+ }
119
+ }
120
+ defineDisposeAlias(InternalDisposableStack.prototype);
121
+
122
+ class AsyncDisposerStack {
123
+ #disposed = false;
124
+ #stack = [];
125
+ add(fn) {
126
+ this.defer(fn);
127
+ }
128
+ defer(fn) {
129
+ checkCanRegister(this.#disposed, "AsyncDisposableStack");
130
+ if (typeof fn !== "function") {
131
+ throw new TypeError(`${String(fn)} is not a function`);
132
+ }
133
+ this.#stack.push(fn);
134
+ }
135
+ use(value) {
136
+ if (value === null || value === undefined) {
137
+ return value;
138
+ }
139
+ checkCanRegister(this.#disposed, "AsyncDisposableStack");
140
+ this.#stack.push(resolveAsyncDisposer(value));
141
+ return value;
142
+ }
143
+ async disposeAsync() {
144
+ await this.#disposeAllAsync();
145
+ }
146
+ async cleanup() {
147
+ await this.disposeAsync();
148
+ }
149
+ async#disposeAllAsync() {
150
+ if (this.#disposed) {
151
+ return;
152
+ }
153
+ this.#disposed = true;
154
+ let error;
155
+ while (this.#stack.length > 0) {
156
+ const disposer = this.#stack.pop();
157
+ if (!disposer) {
158
+ continue;
159
+ }
160
+ try {
161
+ await disposer();
162
+ } catch (caughtError) {
163
+ error = error === undefined ? caughtError : createSuppressedError(caughtError, error);
164
+ }
165
+ }
166
+ if (error !== undefined) {
167
+ throw error;
168
+ }
169
+ }
170
+ }
171
+ defineAsyncDisposeAlias(AsyncDisposerStack.prototype);
172
+ function createAsyncDisposer() {
173
+ return new AsyncDisposerStack;
174
+ }
11
175
 
12
176
  // src/lib/utils.ts
13
177
  function assertUnreachable(value, code) {
@@ -38,7 +202,7 @@ async function resolveWithAbort(signal, promise, createAbortResult) {
38
202
  });
39
203
  return createAbortResult();
40
204
  }
41
- const disposer = __using(__stack, new DisposableStack, 0);
205
+ const disposer = __using(__stack, new InternalDisposableStack, 0);
42
206
  const abortPromise = new Promise((resolve) => {
43
207
  const onAbort = () => {
44
208
  resolve(createAbortResult());
@@ -158,10 +322,11 @@ class SignalController {
158
322
  }
159
323
  return resolveWithAbort(this.signal, promise, () => new CancellationError(undefined, { cause: cause ?? this.signal?.reason }));
160
324
  }
161
- [Symbol.dispose]() {
325
+ dispose() {
162
326
  this.signal;
163
327
  }
164
328
  }
329
+ defineDisposeAlias(SignalController.prototype);
165
330
 
166
331
  // src/lib/modifiers/timeout.ts
167
332
  class TimeoutController {
@@ -231,12 +396,13 @@ class TimeoutController {
231
396
  }
232
397
  return resolveWithAbort(this.signal, promise, () => this.checkDidTimeout(cause) ?? new TimeoutError(`Execution exceeded timeout of ${this.#timeoutMs}ms`, { cause }));
233
398
  }
234
- [Symbol.dispose]() {
399
+ dispose() {
235
400
  if (this.#timeoutId !== undefined) {
236
401
  clearTimeout(this.#timeoutId);
237
402
  }
238
403
  }
239
404
  }
405
+ defineDisposeAlias(TimeoutController.prototype);
240
406
 
241
407
  // src/lib/executors/base.ts
242
408
  class RetryDirective {
@@ -272,23 +438,20 @@ class BaseExecution {
272
438
  }
273
439
  return next();
274
440
  }
275
- [Symbol.dispose]() {
276
- let __stack = [];
441
+ dispose() {
442
+ if (!this.#timeoutController && !this.#signalController) {
443
+ return;
444
+ }
445
+ const disposer = new InternalDisposableStack;
277
446
  try {
278
- if (!this.#timeoutController && !this.#signalController) {
279
- return;
280
- }
281
- const disposer = __using(__stack, new DisposableStack, 0);
282
447
  if (this.#timeoutController) {
283
448
  disposer.use(this.#timeoutController);
284
449
  }
285
450
  if (this.#signalController) {
286
451
  disposer.use(this.#signalController);
287
452
  }
288
- } catch (_catch) {
289
- var _err = _catch, _hasErr = 1;
290
453
  } finally {
291
- __callDispose(__stack, _err, _hasErr);
454
+ disposer.dispose();
292
455
  }
293
456
  }
294
457
  static createContext(config, signal, retryLimit) {
@@ -408,6 +571,7 @@ class BaseExecution {
408
571
  return this.#wrapCtxCache;
409
572
  }
410
573
  }
574
+ defineDisposeAlias(BaseExecution.prototype);
411
575
 
412
576
  // src/lib/executors/shared.ts
413
577
  class OrchestrationExecution extends BaseExecution {
@@ -441,7 +605,7 @@ class TaskGraphExecutionBase {
441
605
  resolvers;
442
606
  internalController = new AbortController;
443
607
  taskSignal;
444
- disposer = new AsyncDisposableStack;
608
+ disposer = createAsyncDisposer();
445
609
  firstRejection;
446
610
  constructor(signal, tasks) {
447
611
  this.tasks = tasks;
@@ -451,7 +615,7 @@ class TaskGraphExecutionBase {
451
615
  this.resolvers = new Map;
452
616
  this.taskSignal = signal ? AbortSignal.any([signal, this.internalController.signal]) : this.internalController.signal;
453
617
  }
454
- async[Symbol.asyncDispose]() {
618
+ async disposeAsync() {
455
619
  await this.disposer.disposeAsync();
456
620
  }
457
621
  getTaskHandler(taskName) {
@@ -567,6 +731,7 @@ class TaskGraphExecutionBase {
567
731
  }
568
732
  }
569
733
  }
734
+ defineAsyncDisposeAlias(TaskGraphExecutionBase.prototype);
570
735
 
571
736
  class TaskExecution extends TaskGraphExecutionBase {
572
737
  #mode;
@@ -1152,7 +1317,7 @@ class ExecutionBuilder extends RunBuilder {
1152
1317
 
1153
1318
  // src/lib/dispose.ts
1154
1319
  function dispose() {
1155
- return new AsyncDisposableStack;
1320
+ return createAsyncDisposer();
1156
1321
  }
1157
1322
  // src/lib/gen.ts
1158
1323
  function* use(value) {
@@ -1231,5 +1396,5 @@ export {
1231
1396
  all
1232
1397
  };
1233
1398
 
1234
- //# debugId=E242E3120E0E34C864756E2164756E21
1235
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2xpYi91dGlscy50cyIsICJzcmMvbGliL21vZGlmaWVycy9yZXRyeS50cyIsICJzcmMvbGliL21vZGlmaWVycy9zaWduYWwudHMiLCAic3JjL2xpYi9tb2RpZmllcnMvdGltZW91dC50cyIsICJzcmMvbGliL2V4ZWN1dG9ycy9iYXNlLnRzIiwgInNyYy9saWIvZXhlY3V0b3JzL3NoYXJlZC50cyIsICJzcmMvbGliL2V4ZWN1dG9ycy9hbGwudHMiLCAic3JjL2xpYi9leGVjdXRvcnMvYWxsLXNldHRsZWQudHMiLCAic3JjL2xpYi9leGVjdXRvcnMvZmxvdy50cyIsICJzcmMvbGliL2V4ZWN1dG9ycy9ydW4udHMiLCAic3JjL2xpYi9leGVjdXRvcnMvcnVuLXN5bmMudHMiLCAic3JjL2xpYi9idWlsZGVyLnRzIiwgInNyYy9saWIvZGlzcG9zZS50cyIsICJzcmMvbGliL2dlbi50cyIsICJzcmMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgUGFuaWMsIHR5cGUgUGFuaWNDb2RlIH0gZnJvbSBcIi4vZXJyb3JzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFVucmVhY2hhYmxlKHZhbHVlOiBuZXZlciwgY29kZTogUGFuaWNDb2RlKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgUGFuaWMoY29kZSwgeyBtZXNzYWdlOiBgVW5yZWFjaGFibGUgY2FzZTogJHtTdHJpbmcodmFsdWUpfWAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb246IHVua25vd24sIGVycm9yOiBFcnJvcik6IGFzc2VydHMgY29uZGl0aW9uIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChtcyA8PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKVxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc1Byb21pc2VMaWtlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZUxpa2U8dW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgdGhlbj86IHVua25vd24gfSkudGhlbiA9PT0gXCJmdW5jdGlvblwiXG4gIClcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXaXRoQWJvcnQ8ViwgRT4oXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gIHByb21pc2U6IFByb21pc2VMaWtlPFY+LFxuICBjcmVhdGVBYm9ydFJlc3VsdDogKCkgPT4gRVxuKTogUHJvbWlzZTxWIHwgRT4ge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAvLyBXZSByZXR1cm4gdGhlIGFib3J0IHJlc3VsdCBpbW1lZGlhdGVseSwgc28gYXR0YWNoIGEgbm8tb3AgaGFuZGxlciB0b1xuICAgIC8vIGF2b2lkIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gaWYgdGhlIG9yaWdpbmFsIHByb21pc2UgcmVqZWN0cyBsYXRlci5cbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZShwcm9taXNlKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHZvaWQgZXJyb3IpXG4gICAgcmV0dXJuIGNyZWF0ZUFib3J0UmVzdWx0KClcbiAgfVxuXG4gIHVzaW5nIGRpc3Bvc2VyID0gbmV3IERpc3Bvc2FibGVTdGFjaygpXG5cbiAgY29uc3QgYWJvcnRQcm9taXNlID0gbmV3IFByb21pc2U8RT4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgICAgcmVzb2x2ZShjcmVhdGVBYm9ydFJlc3VsdCgpKVxuICAgIH1cblxuICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgb25BYm9ydCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KVxuICAgIGRpc3Bvc2VyLmRlZmVyKCgpID0+IHtcbiAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydClcbiAgICB9KVxuICB9KVxuXG4gIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW1Byb21pc2UucmVzb2x2ZShwcm9taXNlKSwgYWJvcnRQcm9taXNlXSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBCdWlsZGVyQ29uZmlnIH0gZnJvbSBcIi4uL2J1aWxkZXJcIlxuaW1wb3J0IHR5cGUgeyBUcnlDdHggfSBmcm9tIFwiLi4vZXhlY3V0b3JzL3NoYXJlZFwiXG5pbXBvcnQgeyBQYW5pYyB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgYXNzZXJ0VW5yZWFjaGFibGUsIGludmFyaWFudCB9IGZyb20gXCIuLi91dGlsc1wiXG5cbmludGVyZmFjZSBCYXNlUmV0cnlQb2xpY3kge1xuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgZmlyc3QgcnVuLlxuICAgKi9cbiAgbGltaXQ6IG51bWJlclxuICAvKipcbiAgICogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gYXR0ZW1wdHMuIERlZmF1bHRzIHRvIDAuXG4gICAqL1xuICBkZWxheU1zPzogbnVtYmVyXG4gIC8qKlxuICAgKiBBZGRzIHJhbmRvbSBqaXR0ZXIgdG8gZGVsYXlzIHdoZW4gZW5hYmxlZC5cbiAgICovXG4gIGppdHRlcj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFJldHVybiB0cnVlIHRvIHJldHJ5IGFmdGVyIGFuIGVycm9yLCBmYWxzZSB0byBzdG9wLlxuICAgKi9cbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24sIGN0eDogVHJ5Q3R4KSA9PiBib29sZWFuXG59XG5cbmludGVyZmFjZSBMaW5lYXJCYWNrb2ZmUmV0cnlQb2xpY3kgZXh0ZW5kcyBCYXNlUmV0cnlQb2xpY3kge1xuICAvKipcbiAgICogVXNlIGxpbmVhcmx5IGluY3JlYXNpbmcgZGVsYXkgYmV0d2VlbiBhdHRlbXB0cy5cbiAgICovXG4gIGJhY2tvZmY6IFwibGluZWFyXCJcbiAgLyoqXG4gICAqIE5vdCBzdXBwb3J0ZWQgZm9yIGxpbmVhciBiYWNrb2ZmLlxuICAgKi9cbiAgbWF4RGVsYXlNcz86IG5ldmVyXG59XG5cbmludGVyZmFjZSBFeHBvbmVudGlhbEJhY2tvZmZSZXRyeVBvbGljeSBleHRlbmRzIEJhc2VSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBVc2UgZXhwb25lbnRpYWwgZGVsYXkgZ3Jvd3RoIGJldHdlZW4gYXR0ZW1wdHMuXG4gICAqL1xuICBiYWNrb2ZmOiBcImV4cG9uZW50aWFsXCJcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhcCBmb3IgZXhwb25lbnRpYWwgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgbWF4RGVsYXlNcz86IG51bWJlclxufVxuXG4vKipcbiAqIFJldHJ5IHBvbGljeSB1c2luZyBhIGNvbnN0YW50IGRlbGF5IHN0cmF0ZWd5LlxuICovXG5pbnRlcmZhY2UgQ29uc3RhbnRCYWNrb2ZmUmV0cnlQb2xpY3kgZXh0ZW5kcyBCYXNlUmV0cnlQb2xpY3kge1xuICAvKipcbiAgICogUmVxdWlyZWQgZGlzY3JpbWluYW50OiB1c2UgYSBmaXhlZCBkZWxheSBiZXR3ZWVuIGF0dGVtcHRzLlxuICAgKi9cbiAgYmFja29mZjogXCJjb25zdGFudFwiXG4gIC8qKlxuICAgKiBOb3Qgc3VwcG9ydGVkIGZvciBjb25zdGFudCBiYWNrb2ZmLlxuICAgKi9cbiAgbWF4RGVsYXlNcz86IG5ldmVyXG59XG5cbi8qKlxuICogUmV0cnkgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gKi9cbmV4cG9ydCB0eXBlIFJldHJ5UG9saWN5ID1cbiAgfCBMaW5lYXJCYWNrb2ZmUmV0cnlQb2xpY3lcbiAgfCBFeHBvbmVudGlhbEJhY2tvZmZSZXRyeVBvbGljeVxuICB8IENvbnN0YW50QmFja29mZlJldHJ5UG9saWN5XG5cbi8qKlxuICogUmV0cnkgc2hvcnRoYW5kIG9yIGZ1bGwgcmV0cnkgY29uZmlndXJhdGlvbi5cbiAqXG4gKiAtIGBudW1iZXJgOiBhdHRlbXB0IGxpbWl0XG4gKiAtIGBSZXRyeVBvbGljeWA6IGRldGFpbGVkIHJldHJ5IHNldHRpbmdzXG4gKi9cbmV4cG9ydCB0eXBlIFJldHJ5T3B0aW9ucyA9IG51bWJlciB8IFJldHJ5UG9saWN5XG5cbmV4cG9ydCBmdW5jdGlvbiByZXRyeU9wdGlvbnMocG9saWN5OiBSZXRyeU9wdGlvbnMpOiBSZXRyeVBvbGljeSB7XG4gIGNvbnN0IGxpbWl0ID0gdHlwZW9mIHBvbGljeSA9PT0gXCJudW1iZXJcIiA/IHBvbGljeSA6IHBvbGljeS5saW1pdFxuXG4gIGludmFyaWFudChOdW1iZXIuaXNGaW5pdGUobGltaXQpLCBuZXcgUGFuaWMoXCJSRVRSWV9JTlZBTElEX0xJTUlUXCIpKVxuICBpbnZhcmlhbnQobGltaXQgPj0gMCwgbmV3IFBhbmljKFwiUkVUUllfSU5WQUxJRF9MSU1JVFwiKSlcblxuICBpZiAodHlwZW9mIHBvbGljeSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiB7XG4gICAgICBiYWNrb2ZmOiBcImNvbnN0YW50XCIsXG4gICAgICBkZWxheU1zOiAwLFxuICAgICAgbGltaXQ6IHBvbGljeSxcbiAgICB9XG4gIH1cblxuICBjb25zdCBiYXNlID0ge1xuICAgIGRlbGF5TXM6IHBvbGljeS5kZWxheU1zID8/IDAsXG4gICAgaml0dGVyOiBwb2xpY3kuaml0dGVyLFxuICAgIGxpbWl0OiBwb2xpY3kubGltaXQsXG4gICAgc2hvdWxkUmV0cnk6IHBvbGljeS5zaG91bGRSZXRyeSxcbiAgfVxuXG4gIHN3aXRjaCAocG9saWN5LmJhY2tvZmYpIHtcbiAgICBjYXNlIFwiY29uc3RhbnRcIjpcbiAgICBjYXNlIFwibGluZWFyXCI6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBiYWNrb2ZmOiBwb2xpY3kuYmFja29mZiB9XG4gICAgY2FzZSBcImV4cG9uZW50aWFsXCI6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBiYWNrb2ZmOiBwb2xpY3kuYmFja29mZiwgbWF4RGVsYXlNczogcG9saWN5Lm1heERlbGF5TXMgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gYXNzZXJ0VW5yZWFjaGFibGUocG9saWN5LCBcIlVOUkVBQ0hBQkxFX1JFVFJZX1BPTElDWV9CQUNLT0ZGXCIpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVJldHJ5RGVsYXkoYXR0ZW1wdDogbnVtYmVyLCBjb25maWc6IEJ1aWxkZXJDb25maWcpOiBudW1iZXIge1xuICBjb25zdCBwb2xpY3kgPSBjb25maWcucmV0cnlcblxuICBpZiAoIXBvbGljeSkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICBjb25zdCBiYXNlRGVsYXkgPSBwb2xpY3kuZGVsYXlNcyA/PyAwXG4gIGxldCBkZWxheSA9IDBcblxuICBzd2l0Y2ggKHBvbGljeS5iYWNrb2ZmKSB7XG4gICAgY2FzZSBcImNvbnN0YW50XCI6XG4gICAgICBkZWxheSA9IGJhc2VEZWxheVxuICAgICAgYnJlYWtcbiAgICBjYXNlIFwibGluZWFyXCI6XG4gICAgICBkZWxheSA9IGJhc2VEZWxheSAqIGF0dGVtcHRcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBcImV4cG9uZW50aWFsXCI6XG4gICAgICBkZWxheSA9IGJhc2VEZWxheSAqIDIgKiogKGF0dGVtcHQgLSAxKVxuXG4gICAgICBpZiAocG9saWN5Lm1heERlbGF5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxheSA9IE1hdGgubWluKGRlbGF5LCBwb2xpY3kubWF4RGVsYXlNcylcbiAgICAgIH1cblxuICAgICAgYnJlYWtcbiAgfVxuXG4gIGlmICghcG9saWN5LmppdHRlciB8fCBkZWxheSA8PSAwKSB7XG4gICAgcmV0dXJuIGRlbGF5XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZGVsYXkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1Nob3VsZEF0dGVtcHRSZXRyeShcbiAgZXJyb3I6IHVua25vd24sXG4gIGN0eDogVHJ5Q3R4LFxuICBjb25maWc6IEJ1aWxkZXJDb25maWdcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwb2xpY3kgPSBjb25maWcucmV0cnlcblxuICBpZiAoIXBvbGljeSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKGN0eC5yZXRyeS5hdHRlbXB0ID49IHBvbGljeS5saW1pdCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKCFwb2xpY3kuc2hvdWxkUmV0cnkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIHBvbGljeS5zaG91bGRSZXRyeShlcnJvciwgY3R4KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc1JldHJ5RXhoYXVzdGVkKGF0dGVtcHQ6IG51bWJlciwgY29uZmlnOiBCdWlsZGVyQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcucmV0cnkgIT09IHVuZGVmaW5lZCAmJiBhdHRlbXB0ID49IGNvbmZpZy5yZXRyeS5saW1pdFxufVxuIiwKICAgICJpbXBvcnQgeyBDYW5jZWxsYXRpb25FcnJvciwgVGltZW91dEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyByZXNvbHZlV2l0aEFib3J0IH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuZXhwb3J0IGNsYXNzIFNpZ25hbENvbnRyb2xsZXIge1xuICByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbFxuXG4gIGNvbnN0cnVjdG9yKHNpZ25hbHM6IHJlYWRvbmx5IEFib3J0U2lnbmFsW10gPSBbXSkge1xuICAgIGlmIChzaWduYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2lnbmFsID0gQWJvcnRTaWduYWwuYW55KFsuLi5zaWduYWxzXSlcbiAgICB9XG4gIH1cblxuICBjaGVja0RpZENhbmNlbChjYXVzZT86IHVua25vd24pOiBDYW5jZWxsYXRpb25FcnJvciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDYW5jZWxsYXRpb25FcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGNhdXNlID8/IHRoaXMuc2lnbmFsLnJlYXNvbiB9KVxuICB9XG5cbiAgcmFjZTxWPihwcm9taXNlOiBQcm9taXNlTGlrZTxWPiwgY2F1c2U/OiB1bmtub3duKTogUHJvbWlzZUxpa2U8ViB8IENhbmNlbGxhdGlvbkVycm9yPiB7XG4gICAgY29uc3QgY2FuY2VsbGVkID0gdGhpcy5jaGVja0RpZENhbmNlbChjYXVzZSlcblxuICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FuY2VsbGVkKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zaWduYWwpIHtcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVXaXRoQWJvcnQoXG4gICAgICB0aGlzLnNpZ25hbCxcbiAgICAgIHByb21pc2UsXG4gICAgICAoKSA9PiBuZXcgQ2FuY2VsbGF0aW9uRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBjYXVzZSA/PyB0aGlzLnNpZ25hbD8ucmVhc29uIH0pXG4gICAgKVxuICB9XG5cbiAgW1N5bWJvbC5kaXNwb3NlXSgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuc2lnbmFsXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgUGFuaWMsIFRpbWVvdXRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgaW52YXJpYW50LCByZXNvbHZlV2l0aEFib3J0IH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuZXhwb3J0IGNsYXNzIFRpbWVvdXRDb250cm9sbGVyIHtcbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWxcbiAgcmVhZG9ubHkgI2NvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXJcbiAgcmVhZG9ubHkgI3N0YXJ0ZWRBdCA9IERhdGUubm93KClcbiAgcmVhZG9ubHkgI3RpbWVvdXRNczogbnVtYmVyXG4gICN0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkXG5cbiAgY29uc3RydWN0b3IodGltZW91dE1zPzogbnVtYmVyKSB7XG4gICAgdGhpcy4jdGltZW91dE1zID0gdGltZW91dE1zID8/IC0xXG5cbiAgICBpZiAodGltZW91dE1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGludmFyaWFudChOdW1iZXIuaXNGaW5pdGUodGltZW91dE1zKSwgbmV3IFBhbmljKFwiVElNRU9VVF9JTlZBTElEX01TXCIpKVxuICAgIGludmFyaWFudCh0aW1lb3V0TXMgPj0gMCwgbmV3IFBhbmljKFwiVElNRU9VVF9JTlZBTElEX01TXCIpKVxuXG4gICAgdGhpcy4jY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIHRoaXMuc2lnbmFsID0gdGhpcy4jY29udHJvbGxlci5zaWduYWxcblxuICAgIGlmICh0aGlzLiN0aW1lb3V0TXMgPD0gMCkge1xuICAgICAgdGhpcy4jYWJvcnQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy4jdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiNhYm9ydCgpXG4gICAgfSwgdGhpcy4jdGltZW91dE1zKVxuICB9XG5cbiAgI2Fib3J0KGNhdXNlPzogdW5rbm93bikge1xuICAgIGNvbnN0IHRpbWVvdXRFcnJvciA9IG5ldyBUaW1lb3V0RXJyb3IoYEV4ZWN1dGlvbiBleGNlZWRlZCB0aW1lb3V0IG9mICR7dGhpcy4jdGltZW91dE1zfW1zYCwge1xuICAgICAgY2F1c2UsXG4gICAgfSlcblxuICAgIGlmICghdGhpcy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRoaXMuI2NvbnRyb2xsZXI/LmFib3J0KHRpbWVvdXRFcnJvcilcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZW91dEVycm9yXG4gIH1cblxuICBnZXQgI3JlbWFpbmluZygpIHtcbiAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHRoaXMuI3N0YXJ0ZWRBdFxuXG4gICAgcmV0dXJuIHRoaXMuI3RpbWVvdXRNcyAtIGVsYXBzZWRcbiAgfVxuXG4gIGNoZWNrRGlkVGltZW91dChjYXVzZT86IHVua25vd24pOiBUaW1lb3V0RXJyb3IgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5zaWduYWwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjb25zdCByZWFzb24gPSB0aGlzLnNpZ25hbC5yZWFzb25cblxuICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikge1xuICAgICAgICByZXR1cm4gcmVhc29uXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgVGltZW91dEVycm9yKGBFeGVjdXRpb24gZXhjZWVkZWQgdGltZW91dCBvZiAke3RoaXMuI3RpbWVvdXRNc31tc2AsIHtcbiAgICAgICAgY2F1c2U6IGNhdXNlID8/IHJlYXNvbixcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuI3JlbWFpbmluZyA+IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNhYm9ydChjYXVzZSlcbiAgfVxuXG4gIHJhY2U8Vj4ocHJvbWlzZTogUHJvbWlzZUxpa2U8Vj4sIGNhdXNlPzogdW5rbm93bik6IFByb21pc2VMaWtlPFYgfCBUaW1lb3V0RXJyb3I+IHtcbiAgICBpZiAoIXRoaXMuc2lnbmFsKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGlmICh0aGlzLiNyZW1haW5pbmcgPD0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLiNhYm9ydChjYXVzZSkpXG4gICAgfVxuXG4gICAgY29uc3QgdGltZWRPdXQgPSB0aGlzLmNoZWNrRGlkVGltZW91dChjYXVzZSlcblxuICAgIGlmICh0aW1lZE91dCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aW1lZE91dClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZVdpdGhBYm9ydChcbiAgICAgIHRoaXMuc2lnbmFsLFxuICAgICAgcHJvbWlzZSxcbiAgICAgICgpID0+XG4gICAgICAgIHRoaXMuY2hlY2tEaWRUaW1lb3V0KGNhdXNlKSA/P1xuICAgICAgICBuZXcgVGltZW91dEVycm9yKGBFeGVjdXRpb24gZXhjZWVkZWQgdGltZW91dCBvZiAke3RoaXMuI3RpbWVvdXRNc31tc2AsIHsgY2F1c2UgfSlcbiAgICApXG4gIH1cblxuICBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiN0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3RpbWVvdXRJZClcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBCdWlsZGVyQ29uZmlnLCBXcmFwQ3R4IH0gZnJvbSBcIi4uL2J1aWxkZXJcIlxuaW1wb3J0IHR5cGUgeyBSZXRyeUV4aGF1c3RlZEVycm9yLCBVbmhhbmRsZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB0eXBlIHsgVHJ5Q3R4IH0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7IENhbmNlbGxhdGlvbkVycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZVJldHJ5RGVsYXksXG4gIGNoZWNrSXNSZXRyeUV4aGF1c3RlZCxcbiAgY2hlY2tTaG91bGRBdHRlbXB0UmV0cnksXG59IGZyb20gXCIuLi9tb2RpZmllcnMvcmV0cnlcIlxuaW1wb3J0IHsgU2lnbmFsQ29udHJvbGxlciB9IGZyb20gXCIuLi9tb2RpZmllcnMvc2lnbmFsXCJcbmltcG9ydCB7IFRpbWVvdXRDb250cm9sbGVyIH0gZnJvbSBcIi4uL21vZGlmaWVycy90aW1lb3V0XCJcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIi4uL3V0aWxzXCJcblxuaW50ZXJmYWNlIEJhc2VFeGVjdXRpb25PcHRpb25zIHtcbiAgcmV0cnlMaW1pdD86IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBSZXRyeURlY2lzaW9uID0ge1xuICBkZWxheTogbnVtYmVyXG4gIGlzUmV0cnlFeGhhdXN0ZWQ6IGJvb2xlYW5cbiAgc2hvdWxkQXR0ZW1wdFJldHJ5OiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFJ1bm5lckVycm9yID1cbiAgfCBDYW5jZWxsYXRpb25FcnJvclxuICB8IFJldHJ5RXhoYXVzdGVkRXJyb3JcbiAgfCBUaW1lb3V0RXJyb3JcbiAgfCBVbmhhbmRsZWRFeGNlcHRpb25cblxuZXhwb3J0IGNsYXNzIFJldHJ5RGlyZWN0aXZlIHtcbiAgcmVhZG9ubHkgZGVjaXNpb246IFJldHJ5RGVjaXNpb25cblxuICBjb25zdHJ1Y3RvcihkZWNpc2lvbjogUmV0cnlEZWNpc2lvbikge1xuICAgIHRoaXMuZGVjaXNpb24gPSBkZWNpc2lvblxuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRXhlY3V0aW9uPFRSZXN1bHQgPSB1bmtub3duPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb25maWc6IEJ1aWxkZXJDb25maWdcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGN0eDogVHJ5Q3R4XG4gIHByb3RlY3RlZCByZWFkb25seSBleGVjdXRpb25TaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkXG4gICN3cmFwQ3R4Q2FjaGU6IFdyYXBDdHggfCB1bmRlZmluZWRcbiAgcmVhZG9ubHkgI3NpZ25hbENvbnRyb2xsZXI6IFNpZ25hbENvbnRyb2xsZXIgfCB1bmRlZmluZWRcbiAgcmVhZG9ubHkgI3RpbWVvdXRDb250cm9sbGVyOiBUaW1lb3V0Q29udHJvbGxlciB8IHVuZGVmaW5lZFxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcsIG9wdGlvbnM6IEJhc2VFeGVjdXRpb25PcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZ1xuICAgIHRoaXMuI3RpbWVvdXRDb250cm9sbGVyID0gQmFzZUV4ZWN1dGlvbi5jcmVhdGVUaW1lb3V0Q29udHJvbGxlcihjb25maWcudGltZW91dClcbiAgICB0aGlzLiNzaWduYWxDb250cm9sbGVyID0gQmFzZUV4ZWN1dGlvbi5jcmVhdGVTaWduYWxDb250cm9sbGVyKFxuICAgICAgY29uZmlnLnNpZ25hbHMsXG4gICAgICB0aGlzLiN0aW1lb3V0Q29udHJvbGxlcj8uc2lnbmFsXG4gICAgKVxuICAgIHRoaXMuZXhlY3V0aW9uU2lnbmFsID0gdGhpcy4jc2lnbmFsQ29udHJvbGxlcj8uc2lnbmFsXG4gICAgdGhpcy5jdHggPSBCYXNlRXhlY3V0aW9uLmNyZWF0ZUNvbnRleHQoY29uZmlnLCB0aGlzLmV4ZWN1dGlvblNpZ25hbCwgb3B0aW9ucy5yZXRyeUxpbWl0KVxuICB9XG5cbiAgZXhlY3V0ZSgpOiBUUmVzdWx0IHtcbiAgICAvLyBXcmFwcyBjb3ZlciB0aGUgZnVsbCByZXRyeSBzY29wZTsgYGN0eC5yZXRyeS5hdHRlbXB0YCBtYXkgcmVmbGVjdCB0aGUgZmluYWxcbiAgICAvLyBhdHRlbXB0IHdoZW4gb2JzZXJ2ZWQgYWZ0ZXIgYG5leHQoKWAgcmVzb2x2ZXMuXG4gICAgY29uc3Qgd3JhcHMgPSB0aGlzLmNvbmZpZy53cmFwc1xuXG4gICAgaWYgKCF3cmFwcyB8fCB3cmFwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVDb3JlKClcbiAgICB9XG5cbiAgICBsZXQgbmV4dCA9ICgpOiB1bmtub3duID0+IHRoaXMuZXhlY3V0ZUNvcmUoKVxuXG4gICAgZm9yIChjb25zdCB3cmFwIG9mIHdyYXBzLnRvUmV2ZXJzZWQoKSkge1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBuZXh0XG4gICAgICBuZXh0ID0gKCkgPT4gd3JhcCh0aGlzLiN3cmFwQ3R4LCBwcmV2aW91cylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dCgpIGFzIFRSZXN1bHRcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBleGVjdXRlQ29yZSgpOiBUUmVzdWx0XG5cbiAgW1N5bWJvbC5kaXNwb3NlXSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI3RpbWVvdXRDb250cm9sbGVyICYmICF0aGlzLiNzaWduYWxDb250cm9sbGVyKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1c2luZyBkaXNwb3NlciA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKVxuICAgIGlmICh0aGlzLiN0aW1lb3V0Q29udHJvbGxlcikge1xuICAgICAgZGlzcG9zZXIudXNlKHRoaXMuI3RpbWVvdXRDb250cm9sbGVyKVxuICAgIH1cblxuICAgIGlmICh0aGlzLiNzaWduYWxDb250cm9sbGVyKSB7XG4gICAgICBkaXNwb3Nlci51c2UodGhpcy4jc2lnbmFsQ29udHJvbGxlcilcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNyZWF0ZUNvbnRleHQoXG4gICAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gICAgcmV0cnlMaW1pdD86IG51bWJlclxuICApOiBUcnlDdHgge1xuICAgIHJldHVybiB7XG4gICAgICByZXRyeToge1xuICAgICAgICBhdHRlbXB0OiAxLFxuICAgICAgICBsaW1pdDogcmV0cnlMaW1pdCA/PyBjb25maWcucmV0cnk/LmxpbWl0ID8/IDEsXG4gICAgICB9LFxuICAgICAgc2lnbmFsLFxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgY3JlYXRlVGltZW91dENvbnRyb2xsZXIoXG4gICAgdGltZW91dE1zOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgKTogVGltZW91dENvbnRyb2xsZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aW1lb3V0TXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG5ldyBUaW1lb3V0Q29udHJvbGxlcih0aW1lb3V0TXMpXG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNyZWF0ZVNpZ25hbENvbnRyb2xsZXIoXG4gICAgc2lnbmFsczogcmVhZG9ubHkgQWJvcnRTaWduYWxbXSB8IHVuZGVmaW5lZCxcbiAgICB0aW1lb3V0U2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZFxuICApOiBTaWduYWxDb250cm9sbGVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb21wb3NlZFNpZ25hbHMgPSBbLi4uKHNpZ25hbHMgPz8gW10pLCB0aW1lb3V0U2lnbmFsXS5maWx0ZXIoXG4gICAgICAodmFsdWUpOiB2YWx1ZSBpcyBBYm9ydFNpZ25hbCA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgKVxuXG4gICAgcmV0dXJuIGNvbXBvc2VkU2lnbmFscy5sZW5ndGggPiAwID8gbmV3IFNpZ25hbENvbnRyb2xsZXIoY29tcG9zZWRTaWduYWxzKSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBjcmVhdGVXcmFwQ29udGV4dChjdHg6IFRyeUN0eCk6IFdyYXBDdHgge1xuICAgIGNvbnN0IHJldHJ5ID0gbmV3IFByb3h5KGN0eC5yZXRyeSwge1xuICAgICAgZGVmaW5lUHJvcGVydHk6ICgpID0+IGZhbHNlLFxuICAgICAgZGVsZXRlUHJvcGVydHk6ICgpID0+IGZhbHNlLFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHkpXG5cbiAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVzY3JpcHRvcixcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6ICgpID0+IGZhbHNlLFxuICAgIH0pIGFzIFdyYXBDdHhbXCJyZXRyeVwiXVxuXG4gICAgcmV0dXJuIG5ldyBQcm94eShjdHgsIHtcbiAgICAgIGRlZmluZVByb3BlcnR5OiAoKSA9PiBmYWxzZSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiAoKSA9PiBmYWxzZSxcbiAgICAgIGdldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICAgICAgICBpZiAocHJvcGVydHkgPT09IFwicmV0cnlcIikge1xuICAgICAgICAgIHJldHVybiByZXRyeVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSBhcyB1bmtub3duXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHkpXG5cbiAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJyZXRyeVwiKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmRlc2NyaXB0b3IsXG4gICAgICAgICAgICB2YWx1ZTogcmV0cnksXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5kZXNjcmlwdG9yLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogKCkgPT4gZmFsc2UsXG4gICAgfSkgYXMgV3JhcEN0eFxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrRGlkQ2FuY2VsKGNhdXNlPzogdW5rbm93bik6IENhbmNlbGxhdGlvbkVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jc2lnbmFsQ29udHJvbGxlcj8uY2hlY2tEaWRDYW5jZWwoY2F1c2UpXG4gIH1cblxuICBwcm90ZWN0ZWQgcmFjZVdpdGhDYW5jZWxsYXRpb248Vj4oXG4gICAgcHJvbWlzZTogUHJvbWlzZUxpa2U8Vj4sXG4gICAgY2F1c2U/OiB1bmtub3duXG4gICk6IFByb21pc2VMaWtlPFYgfCBDYW5jZWxsYXRpb25FcnJvcj4ge1xuICAgIHJldHVybiB0aGlzLiNzaWduYWxDb250cm9sbGVyID8gdGhpcy4jc2lnbmFsQ29udHJvbGxlci5yYWNlKHByb21pc2UsIGNhdXNlKSA6IHByb21pc2VcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0RpZENvbnRyb2xGYWlsKGNhdXNlPzogdW5rbm93bik6IENhbmNlbGxhdGlvbkVycm9yIHwgVGltZW91dEVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0RpZENhbmNlbChjYXVzZSkgPz8gdGhpcy4jdGltZW91dENvbnRyb2xsZXI/LmNoZWNrRGlkVGltZW91dChjYXVzZSlcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlU3luY1N1Y2Nlc3M8VD4odmFsdWU6IFQpOiBUIHwgQ2FuY2VsbGF0aW9uRXJyb3IgfCBUaW1lb3V0RXJyb3Ige1xuICAgIHJldHVybiB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoKSA/PyB2YWx1ZVxuICB9XG5cbiAgcHJvdGVjdGVkIHJhY2U8Vj4oXG4gICAgcHJvbWlzZTogUHJvbWlzZUxpa2U8Vj4sXG4gICAgY2F1c2U/OiB1bmtub3duXG4gICk6IFByb21pc2VMaWtlPFYgfCBDYW5jZWxsYXRpb25FcnJvciB8IFRpbWVvdXRFcnJvcj4ge1xuICAgIGNvbnN0IHRpbWVvdXRDb250cm9sbGVyID0gdGhpcy4jdGltZW91dENvbnRyb2xsZXJcblxuICAgIGlmICghdGltZW91dENvbnRyb2xsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJhY2VXaXRoQ2FuY2VsbGF0aW9uKHByb21pc2UsIGNhdXNlKVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICB0aW1lb3V0Q29udHJvbGxlci5yYWNlKHRoaXMucmFjZVdpdGhDYW5jZWxsYXRpb24ocHJvbWlzZSwgY2F1c2UpLCBjYXVzZSlcbiAgICApLnRoZW4oKHJhY2VkKSA9PiB7XG4gICAgICBpZiAocmFjZWQgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tEaWRDYW5jZWwoY2F1c2UpID8/IHJhY2VkXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByYWNlZFxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgd2FpdEZvclJldHJ5RGVsYXkoXG4gICAgZGVsYXk6IG51bWJlclxuICApOiBQcm9taXNlPENhbmNlbGxhdGlvbkVycm9yIHwgVGltZW91dEVycm9yIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKGRlbGF5IDw9IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBzbGVlcFJlc3VsdCA9IGF3YWl0IHRoaXMucmFjZShzbGVlcChkZWxheSkpXG5cbiAgICBpZiAoc2xlZXBSZXN1bHQgaW5zdGFuY2VvZiBDYW5jZWxsYXRpb25FcnJvciB8fCBzbGVlcFJlc3VsdCBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikge1xuICAgICAgcmV0dXJuIHNsZWVwUmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcHJvdGVjdGVkIHNob3VsZEF0dGVtcHRSZXRyeShlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja1Nob3VsZEF0dGVtcHRSZXRyeShlcnJvciwgdGhpcy5jdHgsIHRoaXMuY29uZmlnKVxuICB9XG5cbiAgcHJvdGVjdGVkIHJldHJ5RGVsYXlGb3JDdXJyZW50QXR0ZW1wdCgpOiBudW1iZXIge1xuICAgIHJldHVybiBjYWxjdWxhdGVSZXRyeURlbGF5KHRoaXMuY3R4LnJldHJ5LmF0dGVtcHQsIHRoaXMuY29uZmlnKVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrSXNSZXRyeUV4aGF1c3RlZEN1cnJlbnRBdHRlbXB0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja0lzUmV0cnlFeGhhdXN0ZWQodGhpcy5jdHgucmV0cnkuYXR0ZW1wdCwgdGhpcy5jb25maWcpXG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSZXRyeURlY2lzaW9uKGVycm9yOiB1bmtub3duKTogUmV0cnlEZWNpc2lvbiB7XG4gICAgY29uc3Qgc2hvdWxkQXR0ZW1wdFJldHJ5ID0gdGhpcy5zaG91bGRBdHRlbXB0UmV0cnkoZXJyb3IpXG5cbiAgICByZXR1cm4ge1xuICAgICAgZGVsYXk6IHNob3VsZEF0dGVtcHRSZXRyeSA/IHRoaXMucmV0cnlEZWxheUZvckN1cnJlbnRBdHRlbXB0KCkgOiAwLFxuICAgICAgaXNSZXRyeUV4aGF1c3RlZDogdGhpcy5jaGVja0lzUmV0cnlFeGhhdXN0ZWRDdXJyZW50QXR0ZW1wdCgpLFxuICAgICAgc2hvdWxkQXR0ZW1wdFJldHJ5LFxuICAgIH1cbiAgfVxuXG4gIGdldCAjd3JhcEN0eCgpOiBXcmFwQ3R4IHtcbiAgICB0aGlzLiN3cmFwQ3R4Q2FjaGUgPz89IEJhc2VFeGVjdXRpb24uY3JlYXRlV3JhcENvbnRleHQodGhpcy5jdHgpXG4gICAgcmV0dXJuIHRoaXMuI3dyYXBDdHhDYWNoZVxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi9idWlsZGVyXCJcbmltcG9ydCB7IFBhbmljLCBVbmhhbmRsZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7IGludmFyaWFudCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBCYXNlRXhlY3V0aW9uIH0gZnJvbSBcIi4vYmFzZVwiXG5cbnR5cGUgUmVzb2x2ZXJQYWlyID0gWyh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCwgKHJlYXNvbj86IHVua25vd24pID0+IHZvaWRdXG5cbnR5cGUgVGFza0V4ZWN1dGlvbk1vZGUgPSBcImZhaWwtZmFzdFwiIHwgXCJzZXR0bGVkXCJcblxuLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4cGxpY2l0LWFueSAtLSBSZXF1aXJlZCBmb3IgdGFzay1tYXAgaW5mZXJlbmNlXG5leHBvcnQgdHlwZSBUYXNrUmVjb3JkID0gUmVjb3JkPHN0cmluZywgYW55PlxuXG5leHBvcnQgdHlwZSBUYXNrVmFsaWRhdGlvbjxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSB7XG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHBsaWNpdC1hbnkgLS0gUmVxdWlyZWQgZm9yIGZ1bmN0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBjb250ZXh0dWFsIGB0aGlzYFxuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gVFtLXSA6IG5ldmVyXG59XG5cbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHBsaWNpdC1hbnkgLS0gUmVxdWlyZWQgZm9yIGZ1bmN0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBjb250ZXh0dWFsIGB0aGlzYFxuZXhwb3J0IHR5cGUgVGFza1Jlc3VsdDxUPiA9IFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGluZmVyIFIgPyBBd2FpdGVkPFI+IDogbmV2ZXJcblxuZXhwb3J0IHR5cGUgUmVzdWx0UHJveHk8VCBleHRlbmRzIFRhc2tSZWNvcmQ+ID0ge1xuICByZWFkb25seSBbSyBpbiBrZXlvZiBUXTogUHJvbWlzZTxUYXNrUmVzdWx0PFRbS10+PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tDb250ZXh0PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiB7XG4gICRyZXN1bHQ6IFJlc3VsdFByb3h5PFQ+XG4gICRzaWduYWw6IEFib3J0U2lnbmFsXG4gICRkaXNwb3NlcjogQXN5bmNEaXNwb3NhYmxlU3RhY2tcbn1cblxuZXhwb3J0IHR5cGUgSW5mZXJyZWRUYXNrQ29udGV4dDxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSB7XG4gICRyZXN1bHQ6IHtcbiAgICByZWFkb25seSBbSyBpbiBrZXlvZiBUXTogUmV0dXJuVHlwZTxUW0tdPiBleHRlbmRzIFByb21pc2U8aW5mZXIgUj5cbiAgICAgID8gUHJvbWlzZTxSPlxuICAgICAgOiBQcm9taXNlPFJldHVyblR5cGU8VFtLXT4+XG4gIH1cbiAgJHNpZ25hbDogQWJvcnRTaWduYWxcbiAgJGRpc3Bvc2VyOiBBc3luY0Rpc3Bvc2FibGVTdGFja1xufVxuXG5leHBvcnQgdHlwZSBBbGxWYWx1ZTxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUYXNrUmVzdWx0PFRbS10+XG59XG5cbmludGVyZmFjZSBBbGxDYXRjaENvbnRleHQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+IHtcbiAgZmFpbGVkVGFzazogKGtleW9mIFQgJiBzdHJpbmcpIHwgdW5kZWZpbmVkXG4gIHBhcnRpYWw6IFBhcnRpYWw8QWxsVmFsdWU8VD4+XG4gIHNpZ25hbDogQWJvcnRTaWduYWxcbn1cblxudHlwZSBBbGxDYXRjaEZuPFQgZXh0ZW5kcyBUYXNrUmVjb3JkLCBDPiA9IChcbiAgZXJyb3I6IHVua25vd24sXG4gIGN0eDogQWxsQ2F0Y2hDb250ZXh0PFQ+XG4pID0+IEMgfCBQcm9taXNlPEM+XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWxsT3B0aW9uczxUIGV4dGVuZHMgVGFza1JlY29yZCwgQz4ge1xuICBjYXRjaDogQWxsQ2F0Y2hGbjxULCBDPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHRsZWRGdWxmaWxsZWQ8VD4ge1xuICBzdGF0dXM6IFwiZnVsZmlsbGVkXCJcbiAgdmFsdWU6IFRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXR0bGVkUmVqZWN0ZWQge1xuICBzdGF0dXM6IFwicmVqZWN0ZWRcIlxuICByZWFzb246IHVua25vd25cbn1cblxuZXhwb3J0IHR5cGUgU2V0dGxlZFJlc3VsdDxUPiA9IFNldHRsZWRGdWxmaWxsZWQ8VD4gfCBTZXR0bGVkUmVqZWN0ZWRcblxuZXhwb3J0IHR5cGUgQWxsU2V0dGxlZFJlc3VsdDxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBTZXR0bGVkUmVzdWx0PFRhc2tSZXN1bHQ8VFtLXT4+XG59XG5cbmludGVyZmFjZSBSZXRyeUluZm8ge1xuICBhdHRlbXB0OiBudW1iZXJcbiAgbGltaXQ6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VUcnlDdHgge1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbFxufVxuXG5leHBvcnQgdHlwZSBUcnlDdHhGb3I8SGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuPiA9IEJhc2VUcnlDdHggJlxuICAoSGFzUmV0cnkgZXh0ZW5kcyB0cnVlID8geyByZXRyeTogUmV0cnlJbmZvIH0gOiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPilcblxuZXhwb3J0IHR5cGUgVHJ5Q3R4ID0gVHJ5Q3R4Rm9yPHRydWU+XG5cbmV4cG9ydCB0eXBlIE5vblByb21pc2U8VD4gPSBUIGV4dGVuZHMgUHJvbWlzZUxpa2U8dW5rbm93bj4gPyBuZXZlciA6IFRcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9yY2hlc3RyYXRpb25FeGVjdXRpb248VFJlc3VsdD4gZXh0ZW5kcyBCYXNlRXhlY3V0aW9uPFByb21pc2U8VFJlc3VsdD4+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGNvbmZpZzogQnVpbGRlckNvbmZpZykge1xuICAgIGNvbnN0IHVuc3VwcG9ydGVkUG9saWNpZXMgPSBbXG4gICAgICBjb25maWcucmV0cnkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFwicmV0cnlcIixcbiAgICAgIGNvbmZpZy50aW1lb3V0ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBcInRpbWVvdXRcIixcbiAgICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBcInJldHJ5XCIgfCBcInRpbWVvdXRcIiA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuXG4gICAgaW52YXJpYW50KFxuICAgICAgdW5zdXBwb3J0ZWRQb2xpY2llcy5sZW5ndGggPT09IDAsXG4gICAgICBuZXcgUGFuaWMoXCJPUkNIRVNUUkFUSU9OX1VOU1VQUE9SVEVEX1BPTElDWVwiLCB7XG4gICAgICAgIG1lc3NhZ2U6IGBPcmNoZXN0cmF0aW9uIGRvZXMgbm90IHN1cHBvcnQgJHt1bnN1cHBvcnRlZFBvbGljaWVzLmpvaW4oXCIgb3IgXCIpfSBwb2xpY2llcy5gLFxuICAgICAgfSlcbiAgICApXG5cbiAgICBzdXBlcih7XG4gICAgICBzaWduYWxzOiBjb25maWcuc2lnbmFscyxcbiAgICAgIHdyYXBzOiBjb25maWcud3JhcHMsXG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBleGVjdXRlQ29yZSgpOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICAvLyBPcmNoZXN0cmF0aW9uIGV4ZWN1dG9ycyBzdGlsbCBzaGFyZSBvdXRlciB3cmFwcy9jYW5jZWxsYXRpb24gY2hlY2tzIGV2ZW5cbiAgICAvLyB0aG91Z2ggdGhlaXIgdGFzayBleGVjdXRpb24gc3RyYXRlZ2llcyBkaWZmZXIuXG4gICAgY29uc3QgY29udHJvbEJlZm9yZUV4ZWN1dGlvbiA9IHRoaXMuY2hlY2tEaWRDb250cm9sRmFpbCgpXG5cbiAgICBpZiAoY29udHJvbEJlZm9yZUV4ZWN1dGlvbikge1xuICAgICAgdGhyb3cgY29udHJvbEJlZm9yZUV4ZWN1dGlvblxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVUYXNrcygpXG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZXhlY3V0ZVRhc2tzKCk6IFByb21pc2U8VFJlc3VsdD5cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRhc2tHcmFwaEV4ZWN1dGlvbkJhc2U8XG4gIFQgZXh0ZW5kcyBUYXNrUmVjb3JkLFxuICBUQ29udGV4dCBleHRlbmRzIFRhc2tDb250ZXh0PFQ+LFxuPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSB0YXNrczogVFxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGFza05hbWVzOiBBcnJheTxrZXlvZiBUICYgc3RyaW5nPlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzdWx0cyE6IE1hcDxrZXlvZiBULCB1bmtub3duPlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXJyb3JzITogTWFwPGtleW9mIFQsIHVua25vd24+XG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlcnMhOiBNYXA8a2V5b2YgVCwgUmVzb2x2ZXJQYWlyW10+XG4gIHByb3RlY3RlZCByZWFkb25seSBpbnRlcm5hbENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGFza1NpZ25hbDogQWJvcnRTaWduYWxcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2VyOiBBc3luY0Rpc3Bvc2FibGVTdGFjayA9IG5ldyBBc3luY0Rpc3Bvc2FibGVTdGFjaygpXG4gIHByb3RlY3RlZCBmaXJzdFJlamVjdGlvbjogdW5rbm93blxuXG4gIGNvbnN0cnVjdG9yKHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsIHRhc2tzOiBUKSB7XG4gICAgdGhpcy50YXNrcyA9IHRhc2tzXG4gICAgdGhpcy50YXNrTmFtZXMgPSBPYmplY3Qua2V5cyh0YXNrcykgYXMgQXJyYXk8a2V5b2YgVCAmIHN0cmluZz5cbiAgICB0aGlzLnJlc3VsdHMgPSBuZXcgTWFwPGtleW9mIFQsIHVua25vd24+KClcbiAgICB0aGlzLmVycm9ycyA9IG5ldyBNYXA8a2V5b2YgVCwgdW5rbm93bj4oKVxuICAgIHRoaXMucmVzb2x2ZXJzID0gbmV3IE1hcDxrZXlvZiBULCBSZXNvbHZlclBhaXJbXT4oKVxuICAgIHRoaXMudGFza1NpZ25hbCA9IHNpZ25hbFxuICAgICAgPyBBYm9ydFNpZ25hbC5hbnkoW3NpZ25hbCwgdGhpcy5pbnRlcm5hbENvbnRyb2xsZXIuc2lnbmFsXSlcbiAgICAgIDogdGhpcy5pbnRlcm5hbENvbnRyb2xsZXIuc2lnbmFsXG4gIH1cblxuICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kaXNwb3Nlci5kaXNwb3NlQXN5bmMoKVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRhc2tIYW5kbGVyKHRhc2tOYW1lOiBrZXlvZiBUKSB7XG4gICAgY29uc3QgdGFza0ZuID0gdGhpcy50YXNrc1t0YXNrTmFtZV1cblxuICAgIGludmFyaWFudChcbiAgICAgIHR5cGVvZiB0YXNrRm4gPT09IFwiZnVuY3Rpb25cIixcbiAgICAgIG5ldyBQYW5pYyhcIlRBU0tfSU5WQUxJRF9IQU5ETEVSXCIsIHtcbiAgICAgICAgbWVzc2FnZTogYFRhc2sgXCIke1N0cmluZyh0YXNrTmFtZSl9XCIgaXMgbm90IGEgZnVuY3Rpb25gLFxuICAgICAgfSlcbiAgICApXG5cbiAgICByZXR1cm4gdGFza0ZuIGFzICh0aGlzOiBUQ29udGV4dCkgPT4gdW5rbm93blxuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc3VsdFByb3h5KHJlcXVlc3RlclRhc2tOYW1lOiBrZXlvZiBUKTogUmVzdWx0UHJveHk8VD4ge1xuICAgIHJldHVybiBuZXcgUHJveHkoe30gYXMgUmVzdWx0UHJveHk8VD4sIHtcbiAgICAgIGdldDogKF8sIHJlZmVyZW5jZWRUYXNrTmFtZTogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLndhaXRGb3JSZXN1bHQocmVmZXJlbmNlZFRhc2tOYW1lIGFzIGtleW9mIFQsIHJlcXVlc3RlclRhc2tOYW1lKSxcbiAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRGb3JSZXN1bHQodGFza05hbWU6IGtleW9mIFQsIHJlcXVlc3RlclRhc2tOYW1lPzoga2V5b2YgVCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmIChyZXF1ZXN0ZXJUYXNrTmFtZSA9PT0gdGFza05hbWUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFBhbmljKFwiVEFTS19TRUxGX1JFRkVSRU5DRVwiLCB7XG4gICAgICAgICAgbWVzc2FnZTogYFRhc2sgXCIke1N0cmluZyh0YXNrTmFtZSl9XCIgY2Fubm90IGF3YWl0IGl0cyBvd24gcmVzdWx0YCxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9XG5cbiAgICBpZiAoIU9iamVjdC5oYXNPd24odGhpcy50YXNrcywgdGFza05hbWUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBQYW5pYyhcIlRBU0tfVU5LTk9XTl9SRUZFUkVOQ0VcIiwge1xuICAgICAgICAgIG1lc3NhZ2U6IGBVbmtub3duIHRhc2sgXCIke1N0cmluZyh0YXNrTmFtZSl9XCJgLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc3VsdHMuaGFzKHRhc2tOYW1lKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnJlc3VsdHMuZ2V0KHRhc2tOYW1lKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lcnJvcnMuaGFzKHRhc2tOYW1lKSkge1xuICAgICAgY29uc3Qgc3RvcmVkRXJyb3IgPSB0aGlzLm1hcFN0b3JlZEVycm9yKHRoaXMuZXJyb3JzLmdldCh0YXNrTmFtZSkpXG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChzdG9yZWRFcnJvcilcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmVycy5nZXQodGFza05hbWUpXG5cbiAgICAgIGlmIChxdWV1ZSkge1xuICAgICAgICBxdWV1ZS5wdXNoKFtyZXNvbHZlLCByZWplY3RdKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNvbHZlcnMuc2V0KHRhc2tOYW1lLCBbW3Jlc29sdmUsIHJlamVjdF1dKVxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgc3RvcmVSZXN1bHQodGFza05hbWU6IGtleW9mIFQsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5yZXN1bHRzLnNldCh0YXNrTmFtZSwgdmFsdWUpXG4gICAgdGhpcy5yZXNvbHZlV2FpdGVycyh0YXNrTmFtZSwgdmFsdWUpXG4gIH1cblxuICBwcm90ZWN0ZWQgc3RvcmVFcnJvcih0YXNrTmFtZToga2V5b2YgVCwgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBtYXBwZWRFcnJvciA9IHRoaXMubWFwU3RvcmVkRXJyb3IoZXJyb3IpXG5cbiAgICB0aGlzLmVycm9ycy5zZXQodGFza05hbWUsIG1hcHBlZEVycm9yKVxuICAgIHRoaXMucmVqZWN0V2FpdGVycyh0YXNrTmFtZSwgbWFwcGVkRXJyb3IpXG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVdhaXRlcnModGFza05hbWU6IGtleW9mIFQsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgZnVsZmlsbGVkID0gdGhpcy5yZXNvbHZlcnMuZ2V0KHRhc2tOYW1lKVxuXG4gICAgaWYgKGZ1bGZpbGxlZCkge1xuICAgICAgZm9yIChjb25zdCBbcmVzb2x2ZV0gb2YgZnVsZmlsbGVkKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpXG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVzb2x2ZXJzLmRlbGV0ZSh0YXNrTmFtZSlcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVqZWN0V2FpdGVycyh0YXNrTmFtZToga2V5b2YgVCwgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCByZWplY3RlZCA9IHRoaXMucmVzb2x2ZXJzLmdldCh0YXNrTmFtZSlcblxuICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgZm9yIChjb25zdCBbLCByZWplY3RdIG9mIHJlamVjdGVkKSB7XG4gICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNvbHZlcnMuZGVsZXRlKHRhc2tOYW1lKVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhYm9ydEludGVybmFsKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmludGVybmFsQ29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgdGhpcy5pbnRlcm5hbENvbnRyb2xsZXIuYWJvcnQoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uVGFza1Jlc3VsdChfdGFza05hbWU6IGtleW9mIFQsIF92YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHZvaWQgdGhpcy50YXNrc1xuICAgIHZvaWQgX3Rhc2tOYW1lXG4gICAgdm9pZCBfdmFsdWVcbiAgfVxuXG4gIHByb3RlY3RlZCBvblRhc2tFcnJvcihfdGFza05hbWU6IGtleW9mIFQsIF9lcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIHZvaWQgdGhpcy50YXNrc1xuICAgIHZvaWQgX3Rhc2tOYW1lXG4gICAgdm9pZCBfZXJyb3JcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXBTdG9yZWRFcnJvcihlcnJvcjogdW5rbm93bik6IEVycm9yIHtcbiAgICB2b2lkIHRoaXMudGFza3NcbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IFVuaGFuZGxlZEV4Y2VwdGlvbih1bmRlZmluZWQsIHsgY2F1c2U6IGVycm9yIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvdWxkQWJvcnRPblRhc2tFcnJvcihfZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICB2b2lkIHRoaXMudGFza3NcbiAgICB2b2lkIF9lcnJvclxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcHJvdGVjdGVkIHNob3VsZFJldGhyb3dUYXNrRXJyb3IoX2Vycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgdm9pZCB0aGlzLnRhc2tzXG4gICAgdm9pZCBfZXJyb3JcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldEZpcnN0UmVqZWN0aW9uKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5maXJzdFJlamVjdGlvbiA/Pz0gZXJyb3JcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVUYXNrQ29udGV4dChyZXN1bHRQcm94eTogUmVzdWx0UHJveHk8VD4pOiBUQ29udGV4dFxuXG4gIHByb3RlY3RlZCBhc3luYyBydW5UYXNrKHRhc2tOYW1lOiBrZXlvZiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhc2tGbiA9IHRoaXMuZ2V0VGFza0hhbmRsZXIodGFza05hbWUpXG4gICAgICBjb25zdCByZXN1bHRQcm94eSA9IHRoaXMuY3JlYXRlUmVzdWx0UHJveHkodGFza05hbWUpXG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVUYXNrQ29udGV4dChyZXN1bHRQcm94eSlcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhc2tGbi5jYWxsKGNvbnRleHQpXG5cbiAgICAgIHRoaXMuc3RvcmVSZXN1bHQodGFza05hbWUsIHJlc3VsdClcbiAgICAgIHRoaXMub25UYXNrUmVzdWx0KHRhc2tOYW1lLCByZXN1bHQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuc2V0Rmlyc3RSZWplY3Rpb24oZXJyb3IpXG4gICAgICB0aGlzLnN0b3JlRXJyb3IodGFza05hbWUsIGVycm9yKVxuICAgICAgdGhpcy5vblRhc2tFcnJvcih0YXNrTmFtZSwgZXJyb3IpXG5cbiAgICAgIGlmICh0aGlzLnNob3VsZEFib3J0T25UYXNrRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMuYWJvcnRJbnRlcm5hbChlcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2hvdWxkUmV0aHJvd1Rhc2tFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhc2tFeGVjdXRpb248VCBleHRlbmRzIFRhc2tSZWNvcmQ+IGV4dGVuZHMgVGFza0dyYXBoRXhlY3V0aW9uQmFzZTxULCBUYXNrQ29udGV4dDxUPj4ge1xuICByZWFkb25seSAjbW9kZTogVGFza0V4ZWN1dGlvbk1vZGVcbiAgcmVhZG9ubHkgI3JldHVyblZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICNmYWlsZWRUYXNrOiAoa2V5b2YgVCAmIHN0cmluZykgfCB1bmRlZmluZWRcbiAgcHJpdmF0ZSBzZXR0bGVkUHJvbWlzZTogUHJvbWlzZTxBcnJheTxQcm9taXNlU2V0dGxlZFJlc3VsdDx2b2lkPj4+IHwgdW5kZWZpbmVkXG5cbiAgY29uc3RydWN0b3Ioc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCwgdGFza3M6IFQsIG1vZGU6IFRhc2tFeGVjdXRpb25Nb2RlKSB7XG4gICAgc3VwZXIoc2lnbmFsLCB0YXNrcylcbiAgICB0aGlzLiNtb2RlID0gbW9kZVxuICB9XG5cbiAgZ2V0IGZhaWxlZFRhc2soKTogKGtleW9mIFQgJiBzdHJpbmcpIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jZmFpbGVkVGFza1xuICB9XG5cbiAgZ2V0IHNpZ25hbCgpOiBBYm9ydFNpZ25hbCB7XG4gICAgcmV0dXJuIHRoaXMudGFza1NpZ25hbFxuICB9XG5cbiAgZ2V0IHJldHVyblZhbHVlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy4jcmV0dXJuVmFsdWVcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy50YXNrTmFtZXMubWFwKGFzeW5jIChuYW1lKSA9PiB0aGlzLnJ1blRhc2sobmFtZSkpXG4gICAgdGhpcy5zZXR0bGVkUHJvbWlzZSA9IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcylcblxuICAgIGlmICh0aGlzLiNtb2RlID09PSBcInNldHRsZWRcIikge1xuICAgICAgYXdhaXQgdGhpcy5zZXR0bGVkUHJvbWlzZVxuICAgICAgcmV0dXJuIHRoaXMuI3JldHVyblZhbHVlXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgdGhpcy5tYXBTdG9yZWRFcnJvcih0aGlzLmZpcnN0UmVqZWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNyZXR1cm5WYWx1ZVxuICB9XG5cbiAgYXN5bmMgd2FpdEZvclRhc2tzVG9TZXR0bGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXR0bGVkUHJvbWlzZVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZVRhc2tDb250ZXh0KHJlc3VsdFByb3h5OiBSZXN1bHRQcm94eTxUPik6IFRhc2tDb250ZXh0PFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgJGRpc3Bvc2VyOiB0aGlzLmRpc3Bvc2VyLFxuICAgICAgJHJlc3VsdDogcmVzdWx0UHJveHksXG4gICAgICAkc2lnbmFsOiB0aGlzLnRhc2tTaWduYWwsXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uVGFza1Jlc3VsdCh0YXNrTmFtZToga2V5b2YgVCwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gXCJzZXR0bGVkXCIpIHtcbiAgICAgIHRoaXMuI3JldHVyblZhbHVlW3Rhc2tOYW1lIGFzIHN0cmluZ10gPSB7IHN0YXR1czogXCJmdWxmaWxsZWRcIiwgdmFsdWUgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNyZXR1cm5WYWx1ZVt0YXNrTmFtZSBhcyBzdHJpbmddID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb25UYXNrRXJyb3IodGFza05hbWU6IGtleW9mIFQsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy4jZmFpbGVkVGFzayA/Pz0gdGFza05hbWUgYXMga2V5b2YgVCAmIHN0cmluZ1xuXG4gICAgaWYgKHRoaXMuI21vZGUgPT09IFwic2V0dGxlZFwiKSB7XG4gICAgICB0aGlzLiNyZXR1cm5WYWx1ZVt0YXNrTmFtZSBhcyBzdHJpbmddID0geyByZWFzb246IGVycm9yLCBzdGF0dXM6IFwicmVqZWN0ZWRcIiB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNob3VsZEFib3J0T25UYXNrRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI21vZGUgPT09IFwiZmFpbC1mYXN0XCJcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzaG91bGRSZXRocm93VGFza0Vycm9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNtb2RlID09PSBcImZhaWwtZmFzdFwiXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBCdWlsZGVyQ29uZmlnIH0gZnJvbSBcIi4uL2J1aWxkZXJcIlxuaW1wb3J0IHR5cGUge1xuICBBbGxPcHRpb25zLFxuICBBbGxWYWx1ZSxcbiAgSW5mZXJyZWRUYXNrQ29udGV4dCxcbiAgVGFza1JlY29yZCxcbiAgVGFza1Jlc3VsdCxcbiAgVGFza1ZhbGlkYXRpb24sXG59IGZyb20gXCIuL3NoYXJlZFwiXG5pbXBvcnQgeyBDYW5jZWxsYXRpb25FcnJvciwgUGFuaWMgfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7IGNoZWNrSXNQcm9taXNlTGlrZSB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uRXhlY3V0aW9uLCBUYXNrRXhlY3V0aW9uIH0gZnJvbSBcIi4vc2hhcmVkXCJcblxuY2xhc3MgQWxsRXhlY3V0aW9uPFQgZXh0ZW5kcyBUYXNrUmVjb3JkLCBDPiBleHRlbmRzIE9yY2hlc3RyYXRpb25FeGVjdXRpb248QWxsVmFsdWU8VD4gfCBDPiB7XG4gIHJlYWRvbmx5ICN0YXNrczogVFxuICByZWFkb25seSAjb3B0aW9uczogQWxsT3B0aW9uczxULCBDPiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQnVpbGRlckNvbmZpZywgdGFza3M6IFQsIG9wdGlvbnM/OiBBbGxPcHRpb25zPFQsIEM+KSB7XG4gICAgc3VwZXIoY29uZmlnKVxuICAgIHRoaXMuI3Rhc2tzID0gdGFza3NcbiAgICB0aGlzLiNvcHRpb25zID0gb3B0aW9uc1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGV4ZWN1dGVUYXNrcygpOiBQcm9taXNlPEFsbFZhbHVlPFQ+IHwgQz4ge1xuICAgIGF3YWl0IHVzaW5nIGV4ZWN1dGlvbiA9IG5ldyBUYXNrRXhlY3V0aW9uKHRoaXMuZXhlY3V0aW9uU2lnbmFsLCB0aGlzLiN0YXNrcywgXCJmYWlsLWZhc3RcIilcbiAgICBsZXQgcmVzdWx0ITogQWxsVmFsdWU8VD4gfCBDXG4gICAgbGV0IHRocmV3ID0gZmFsc2VcbiAgICBsZXQgdGhyb3duRXJyb3I6IHVua25vd25cblxuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSAoYXdhaXQgdGhpcy5yYWNlV2l0aENhbmNlbGxhdGlvbihleGVjdXRpb24uZXhlY3V0ZSgpKSkgYXMgQWxsVmFsdWU8VD5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgY29udHJvbEFmdGVyRmFpbHVyZSA9IHRoaXMuY2hlY2tEaWRDb250cm9sRmFpbChlcnJvcilcbiAgICAgIGNvbnN0IGNhdGNoRm4gPSB0aGlzLiNvcHRpb25zPy5jYXRjaFxuXG4gICAgICBpZiAoY29udHJvbEFmdGVyRmFpbHVyZSkge1xuICAgICAgICB0aHJldyA9IHRydWVcbiAgICAgICAgdGhyb3duRXJyb3IgPSBjb250cm9sQWZ0ZXJGYWlsdXJlXG4gICAgICB9IGVsc2UgaWYgKGNhdGNoRm4pIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICBmYWlsZWRUYXNrOiBleGVjdXRpb24uZmFpbGVkVGFzayxcbiAgICAgICAgICBwYXJ0aWFsOiBleGVjdXRpb24ucmV0dXJuVmFsdWUgYXMgUGFydGlhbDxBbGxWYWx1ZTxUPj4sXG4gICAgICAgICAgc2lnbmFsOiBleGVjdXRpb24uc2lnbmFsLFxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtYXBwZWQgPSBjYXRjaEZuKGVycm9yLCBjb250ZXh0KVxuICAgICAgICAgIGlmIChjaGVja0lzUHJvbWlzZUxpa2UobWFwcGVkKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gKGF3YWl0IHRoaXMucmFjZVdpdGhDYW5jZWxsYXRpb24oXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKG1hcHBlZCkuY2F0Y2goKGNhdGNoRXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChjYXRjaEVycm9yIGluc3RhbmNlb2YgQ2FuY2VsbGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgY2F0Y2hFcnJvclxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFuaWMoXCJBTExfQ0FUQ0hfSEFORExFUl9SRUpFQ1RcIiwgeyBjYXVzZTogY2F0Y2hFcnJvciB9KVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICkpIGFzIENcbiAgICAgICAgICAgIH0gY2F0Y2ggKG1hcHBlZEVycm9yKSB7XG4gICAgICAgICAgICAgIHRocmV3ID0gdHJ1ZVxuICAgICAgICAgICAgICB0aHJvd25FcnJvciA9IG1hcHBlZEVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG1hcHBlZFxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoY2F0Y2hFcnJvcikge1xuICAgICAgICAgIHRocmV3ID0gdHJ1ZVxuICAgICAgICAgIHRocm93bkVycm9yID0gbmV3IFBhbmljKFwiQUxMX0NBVENIX0hBTkRMRVJfVEhST1dcIiwgeyBjYXVzZTogY2F0Y2hFcnJvciB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJldyA9IHRydWVcbiAgICAgICAgdGhyb3duRXJyb3IgPSBlcnJvclxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBleGVjdXRpb24ud2FpdEZvclRhc2tzVG9TZXR0bGUoKVxuICAgIH1cblxuICAgIGNvbnN0IGNhbmNlbGxhdGlvbiA9IHRoaXMuY2hlY2tEaWRDYW5jZWwodGhyb3duRXJyb3IpXG5cbiAgICBpZiAoY2FuY2VsbGF0aW9uKSB7XG4gICAgICB0aHJvdyBjYW5jZWxsYXRpb25cbiAgICB9XG5cbiAgICBpZiAodGhyZXcpIHtcbiAgICAgIHRocm93IHRocm93bkVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQWxsPFQgZXh0ZW5kcyBUYXNrUmVjb3JkLCBDID0gbmV2ZXI+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIHRhc2tzOiBUICYgVGFza1ZhbGlkYXRpb248Tm9JbmZlcjxUPj4gJiBUaGlzVHlwZTxJbmZlcnJlZFRhc2tDb250ZXh0PFQ+PixcbiAgb3B0aW9ucz86IEFsbE9wdGlvbnM8VCwgQz5cbik6IFByb21pc2U8eyBbSyBpbiBrZXlvZiBUXTogVGFza1Jlc3VsdDxUW0tdPiB9IHwgQz4ge1xuICB1c2luZyBleGVjdXRpb24gPSBuZXcgQWxsRXhlY3V0aW9uKGNvbmZpZywgdGFza3MsIG9wdGlvbnMpXG4gIHJldHVybiAoYXdhaXQgZXhlY3V0aW9uLmV4ZWN1dGUoKSkgYXMgeyBbSyBpbiBrZXlvZiBUXTogVGFza1Jlc3VsdDxUW0tdPiB9IHwgQ1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7IEFsbFNldHRsZWRSZXN1bHQsIEluZmVycmVkVGFza0NvbnRleHQsIFRhc2tSZWNvcmQsIFRhc2tWYWxpZGF0aW9uIH0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7IE9yY2hlc3RyYXRpb25FeGVjdXRpb24sIFRhc2tFeGVjdXRpb24gfSBmcm9tIFwiLi9zaGFyZWRcIlxuXG5jbGFzcyBBbGxTZXR0bGVkRXhlY3V0aW9uPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiBleHRlbmRzIE9yY2hlc3RyYXRpb25FeGVjdXRpb248XG4gIEFsbFNldHRsZWRSZXN1bHQ8VD5cbj4ge1xuICByZWFkb25seSAjdGFza3M6IFRcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcsIHRhc2tzOiBUKSB7XG4gICAgc3VwZXIoY29uZmlnKVxuICAgIHRoaXMuI3Rhc2tzID0gdGFza3NcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBleGVjdXRlVGFza3MoKTogUHJvbWlzZTxBbGxTZXR0bGVkUmVzdWx0PFQ+PiB7XG4gICAgYXdhaXQgdXNpbmcgZXhlY3V0aW9uID0gbmV3IFRhc2tFeGVjdXRpb24odGhpcy5leGVjdXRpb25TaWduYWwsIHRoaXMuI3Rhc2tzLCBcInNldHRsZWRcIilcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJhY2VXaXRoQ2FuY2VsbGF0aW9uKGV4ZWN1dGlvbi5leGVjdXRlKCkpXG4gICAgY29uc3QgY2FuY2VsbGF0aW9uID0gdGhpcy5jaGVja0RpZENhbmNlbCgpXG5cbiAgICBpZiAoY2FuY2VsbGF0aW9uKSB7XG4gICAgICB0aHJvdyBjYW5jZWxsYXRpb25cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIEFsbFNldHRsZWRSZXN1bHQ8VD5cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFsbFNldHRsZWQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIHRhc2tzOiBUICYgVGFza1ZhbGlkYXRpb248Tm9JbmZlcjxUPj4gJiBUaGlzVHlwZTxJbmZlcnJlZFRhc2tDb250ZXh0PFQ+PlxuKTogUHJvbWlzZTxBbGxTZXR0bGVkUmVzdWx0PFQ+PiB7XG4gIHVzaW5nIGV4ZWN1dGlvbiA9IG5ldyBBbGxTZXR0bGVkRXhlY3V0aW9uKGNvbmZpZywgdGFza3MpXG4gIHJldHVybiBhd2FpdCBleGVjdXRpb24uZXhlY3V0ZSgpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi9idWlsZGVyXCJcbmltcG9ydCB0eXBlIHtcbiAgSW5mZXJyZWRUYXNrQ29udGV4dCxcbiAgUmVzdWx0UHJveHksXG4gIFRhc2tDb250ZXh0LFxuICBUYXNrUmVjb3JkLFxuICBUYXNrUmVzdWx0LFxufSBmcm9tIFwiLi9zaGFyZWRcIlxuaW1wb3J0IHsgUGFuaWMgfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7IE9yY2hlc3RyYXRpb25FeGVjdXRpb24sIFRhc2tHcmFwaEV4ZWN1dGlvbkJhc2UgfSBmcm9tIFwiLi9zaGFyZWRcIlxuXG5kZWNsYXJlIGNvbnN0IEZMT1dfRVhJVF9CUkFORDogdW5pcXVlIHN5bWJvbFxuXG5leHBvcnQgdHlwZSBGbG93RXhpdDxUPiA9IHtcbiAgcmVhZG9ubHkgW0ZMT1dfRVhJVF9CUkFORF06IFRcbn1cblxudHlwZSBFeGl0VmFsdWU8VD4gPSBUIGV4dGVuZHMgRmxvd0V4aXQ8aW5mZXIgVj4gPyBWIDogbmV2ZXJcblxudHlwZSBGbG93RXhpdFZhbHVlPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IEV4aXRWYWx1ZTxUYXNrUmVzdWx0PFRbS10+PlxufVtrZXlvZiBUXVxuXG5pbnRlcmZhY2UgRmxvd1Rhc2tDb250ZXh0PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiBleHRlbmRzIFRhc2tDb250ZXh0PFQ+IHtcbiAgJGV4aXQ8Vj4odmFsdWU6IFYpOiBGbG93RXhpdDxWPlxufVxuXG5leHBvcnQgdHlwZSBJbmZlcnJlZEZsb3dUYXNrQ29udGV4dDxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSBJbmZlcnJlZFRhc2tDb250ZXh0PFQ+ICYge1xuICAkZXhpdDxWPih2YWx1ZTogVik6IEZsb3dFeGl0PFY+XG59XG5cbmV4cG9ydCB0eXBlIEZsb3dSZXN1bHQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+ID0gRmxvd0V4aXRWYWx1ZTxUPlxuXG5jbGFzcyBGbG93RXhpdFNpZ25hbCBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd25cblxuICBjb25zdHJ1Y3Rvcih2YWx1ZTogdW5rbm93bikge1xuICAgIHN1cGVyKFwiRmxvdyBleGl0ZWRcIilcbiAgICB0aGlzLm5hbWUgPSBcIkZsb3dFeGl0U2lnbmFsXCJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgfVxufVxuXG5jbGFzcyBGbG93RXhlY3V0aW9uPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiBleHRlbmRzIFRhc2tHcmFwaEV4ZWN1dGlvbkJhc2U8VCwgRmxvd1Rhc2tDb250ZXh0PFQ+PiB7XG4gICNmaXJzdFJlamVjdGlvbldhaXRlcnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW11cbiAgI3NldHRsZWRQcm9taXNlOiBQcm9taXNlPEFycmF5PFByb21pc2VTZXR0bGVkUmVzdWx0PHZvaWQ+Pj4gfCB1bmRlZmluZWRcblxuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8Rmxvd1Jlc3VsdDxUPj4ge1xuICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy50YXNrTmFtZXMubWFwKGFzeW5jIChuYW1lKSA9PiB0aGlzLnJ1blRhc2sobmFtZSkpXG4gICAgdGhpcy4jc2V0dGxlZFByb21pc2UgPSBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpXG5cbiAgICAvLyBSYWNlIFByb21pc2UuYWxsU2V0dGxlZCgpIGFnYWluc3QgdGhlIGZpcnN0IHJlamVjdGlvbiByZWNvcmRlZCBieSBydW5UYXNrKCkuXG4gICAgYXdhaXQgUHJvbWlzZS5yYWNlKFt0aGlzLiNzZXR0bGVkUHJvbWlzZSwgdGhpcy53YWl0Rm9yRmlyc3RSZWplY3Rpb24oKV0pXG5cbiAgICBpZiAodGhpcy5maXJzdFJlamVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5maXJzdFJlamVjdGlvbiBpbnN0YW5jZW9mIEZsb3dFeGl0U2lnbmFsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpcnN0UmVqZWN0aW9uLnZhbHVlIGFzIEZsb3dSZXN1bHQ8VD5cbiAgICAgIH1cblxuICAgICAgdGhyb3cgdGhpcy5maXJzdFJlamVjdGlvblxuICAgIH1cblxuICAgIHRocm93IG5ldyBQYW5pYyhcIkZMT1dfTk9fRVhJVFwiKVxuICB9XG5cbiAgYXN5bmMgd2FpdEZvclRhc2tzVG9TZXR0bGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy4jc2V0dGxlZFByb21pc2VcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzZXRGaXJzdFJlamVjdGlvbihlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGhhZEZpcnN0UmVqZWN0aW9uID0gdGhpcy5maXJzdFJlamVjdGlvbiAhPT0gdW5kZWZpbmVkXG5cbiAgICBzdXBlci5zZXRGaXJzdFJlamVjdGlvbihlcnJvcilcblxuICAgIGlmIChoYWRGaXJzdFJlamVjdGlvbiB8fCB0aGlzLmZpcnN0UmVqZWN0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVzb2x2ZSBvZiB0aGlzLiNmaXJzdFJlamVjdGlvbldhaXRlcnMpIHtcbiAgICAgIHJlc29sdmUoKVxuICAgIH1cblxuICAgIHRoaXMuI2ZpcnN0UmVqZWN0aW9uV2FpdGVycyA9IFtdXG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlVGFza0NvbnRleHQocmVzdWx0UHJveHk6IFJlc3VsdFByb3h5PFQ+KTogRmxvd1Rhc2tDb250ZXh0PFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgJGRpc3Bvc2VyOiB0aGlzLmRpc3Bvc2VyLFxuICAgICAgJGV4aXQ6ICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRmxvd0V4aXRTaWduYWwodmFsdWUpXG4gICAgICB9LFxuICAgICAgJHJlc3VsdDogcmVzdWx0UHJveHksXG4gICAgICAkc2lnbmFsOiB0aGlzLnRhc2tTaWduYWwsXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG1hcFN0b3JlZEVycm9yKGVycm9yOiB1bmtub3duKTogRXJyb3Ige1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZsb3dFeGl0U2lnbmFsKSB7XG4gICAgICByZXR1cm4gZXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIubWFwU3RvcmVkRXJyb3IoZXJyb3IpXG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2hvdWxkQWJvcnRPblRhc2tFcnJvcigpOiBib29sZWFuIHtcbiAgICB2b2lkIHRoaXMudGFza05hbWVzXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHByaXZhdGUgd2FpdEZvckZpcnN0UmVqZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZpcnN0UmVqZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy4jZmlyc3RSZWplY3Rpb25XYWl0ZXJzLnB1c2gocmVzb2x2ZSlcbiAgICB9KVxuICB9XG59XG5cbmNsYXNzIEZsb3dSdW5uZXJFeGVjdXRpb248VCBleHRlbmRzIFRhc2tSZWNvcmQ+IGV4dGVuZHMgT3JjaGVzdHJhdGlvbkV4ZWN1dGlvbjxGbG93UmVzdWx0PFQ+PiB7XG4gIHJlYWRvbmx5ICN0YXNrczogVFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQnVpbGRlckNvbmZpZywgdGFza3M6IFQpIHtcbiAgICBzdXBlcihjb25maWcpXG4gICAgdGhpcy4jdGFza3MgPSB0YXNrc1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGV4ZWN1dGVUYXNrcygpOiBQcm9taXNlPEZsb3dSZXN1bHQ8VD4+IHtcbiAgICBhd2FpdCB1c2luZyBleGVjdXRpb24gPSBuZXcgRmxvd0V4ZWN1dGlvbih0aGlzLmV4ZWN1dGlvblNpZ25hbCwgdGhpcy4jdGFza3MpXG4gICAgbGV0IHJlc3VsdCE6IEZsb3dSZXN1bHQ8VD5cbiAgICBsZXQgdGhyZXcgPSBmYWxzZVxuICAgIGxldCB0aHJvd25FcnJvcjogdW5rbm93blxuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IChhd2FpdCB0aGlzLnJhY2VXaXRoQ2FuY2VsbGF0aW9uKGV4ZWN1dGlvbi5leGVjdXRlKCkpKSBhcyBGbG93UmVzdWx0PFQ+XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocmV3ID0gdHJ1ZVxuICAgICAgdGhyb3duRXJyb3IgPSBlcnJvclxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBleGVjdXRpb24ud2FpdEZvclRhc2tzVG9TZXR0bGUoKVxuICAgIH1cblxuICAgIGNvbnN0IGNhbmNlbGxhdGlvbiA9IHRoaXMuY2hlY2tEaWRDYW5jZWwodGhyb3duRXJyb3IpXG5cbiAgICBpZiAoY2FuY2VsbGF0aW9uKSB7XG4gICAgICB0aHJvdyBjYW5jZWxsYXRpb25cbiAgICB9XG5cbiAgICBpZiAodGhyZXcpIHtcbiAgICAgIHRocm93IHRocm93bkVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlRmxvdzxUIGV4dGVuZHMgVGFza1JlY29yZD4oXG4gIGNvbmZpZzogQnVpbGRlckNvbmZpZyxcbiAgdGFza3M6IFQgJiBUaGlzVHlwZTxJbmZlcnJlZEZsb3dUYXNrQ29udGV4dDxUPj5cbik6IFByb21pc2U8Rmxvd1Jlc3VsdDxUPj4ge1xuICB1c2luZyBleGVjdXRpb24gPSBuZXcgRmxvd1J1bm5lckV4ZWN1dGlvbihjb25maWcsIHRhc2tzKVxuICByZXR1cm4gYXdhaXQgZXhlY3V0aW9uLmV4ZWN1dGUoKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7IEJhc2VUcnlDdHgsIE5vblByb21pc2UgfSBmcm9tIFwiLi9zaGFyZWRcIlxuaW1wb3J0IHsgQ29udHJvbEVycm9yLCBQYW5pYywgUmV0cnlFeGhhdXN0ZWRFcnJvciwgVW5oYW5kbGVkRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBjaGVja0lzUHJvbWlzZUxpa2UgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQmFzZUV4ZWN1dGlvbiwgUmV0cnlEaXJlY3RpdmUsIHR5cGUgUmV0cnlEZWNpc2lvbiwgdHlwZSBSdW5uZXJFcnJvciB9IGZyb20gXCIuL2Jhc2VcIlxuXG5leHBvcnQgdHlwZSBSdW5UcnlGbjxULCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4ID0gQmFzZVRyeUN0eD4gPSAoXG4gIGN0eDogQ3R4XG4pID0+IE5vblByb21pc2U8VD4gfCBQcm9taXNlPFQ+XG5cbnR5cGUgUnVuQ2F0Y2hGbjxFPiA9IChlcnJvcjogdW5rbm93bikgPT4gTm9uUHJvbWlzZTxFPiB8IFByb21pc2U8RT5cblxuaW50ZXJmYWNlIFJ1bkFzeW5jT3B0aW9uczxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4ID0gQmFzZVRyeUN0eD4ge1xuICB0cnk6IFJ1blRyeUZuPFQsIEN0eD5cbiAgY2F0Y2g6IFJ1bkNhdGNoRm48RT5cbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNSdW5JbnB1dDxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4ID0gQmFzZVRyeUN0eD4gPVxuICB8IFJ1blRyeUZuPFQsIEN0eD5cbiAgfCBSdW5Bc3luY09wdGlvbnM8VCwgRSwgQ3R4PlxuXG4vKiogRW5jYXBzdWxhdGVzIHRoZSBzaGFyZWQgbXV0YWJsZSBzdGF0ZSBhbmQgbG9naWMgZm9yIGEgc2luZ2xlIHJ1biBleGVjdXRpb24uICovXG5jbGFzcyBSdW5FeGVjdXRpb248VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eD4gZXh0ZW5kcyBCYXNlRXhlY3V0aW9uPFxuICBQcm9taXNlPFQgfCBFIHwgUnVubmVyRXJyb3I+XG4+IHtcbiAgI2NhdGNoRm46IFJ1bkNhdGNoRm48RT4gfCB1bmRlZmluZWRcbiAgI3RyeUZuOiBSdW5UcnlGbjxULCBDdHg+XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnLCBpbnB1dDogQXN5bmNSdW5JbnB1dDxULCBFLCBDdHg+KSB7XG4gICAgc3VwZXIoY29uZmlnKVxuXG4gICAgdGhpcy4jY2F0Y2hGbiA9IHR5cGVvZiBpbnB1dCA9PT0gXCJmdW5jdGlvblwiID8gdW5kZWZpbmVkIDogaW5wdXQuY2F0Y2hcbiAgICB0aGlzLiN0cnlGbiA9IHR5cGVvZiBpbnB1dCA9PT0gXCJmdW5jdGlvblwiID8gaW5wdXQgOiBpbnB1dC50cnlcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBleGVjdXRlQ29yZSgpOiBQcm9taXNlPFQgfCBFIHwgUnVubmVyRXJyb3I+IHtcbiAgICByZXR1cm4gdGhpcy4jcnVuQXR0ZW1wdExvb3AoMSlcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGFuIGF0dGVtcHQgZXJyb3IgaW50byBlaXRoZXIgYSB0ZXJtaW5hbCByZXN1bHQgb3IgYSByZXRyeSBkZWNpc2lvbi4gKi9cbiAgYXN5bmMgI3Jlc29sdmVGYWlsdXJlKGVycm9yOiB1bmtub3duKTogUHJvbWlzZTxFIHwgUnVubmVyRXJyb3IgfCBSZXRyeURpcmVjdGl2ZT4ge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFBhbmljKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbnRyb2xFcnJvcikge1xuICAgICAgcmV0dXJuIGVycm9yXG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbEVycm9yID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKGVycm9yKVxuXG4gICAgaWYgKGNvbnRyb2xFcnJvcikge1xuICAgICAgcmV0dXJuIGNvbnRyb2xFcnJvclxuICAgIH1cblxuICAgIGNvbnN0IHJldHJ5RGVjaXNpb24gPSB0aGlzLmJ1aWxkUmV0cnlEZWNpc2lvbihlcnJvcilcblxuICAgIGlmIChyZXRyeURlY2lzaW9uLnNob3VsZEF0dGVtcHRSZXRyeSkge1xuICAgICAgcmV0dXJuIG5ldyBSZXRyeURpcmVjdGl2ZShyZXRyeURlY2lzaW9uKVxuICAgIH1cblxuICAgIGlmIChyZXRyeURlY2lzaW9uLmlzUmV0cnlFeGhhdXN0ZWQpIHtcbiAgICAgIHJldHVybiBuZXcgUmV0cnlFeGhhdXN0ZWRFcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGVycm9yIH0pXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLiNjYXRjaEZuKSB7XG4gICAgICAvLyBFdmVuIHdpdGhvdXQgYSBjYXRjaCBoYW5kbGVyLCBjYW5jZWxsYXRpb24vdGltZW91dCBtYXkgaGF2ZSB3b24gc2luY2VcbiAgICAgIC8vIHRoZSBvcmlnaW5hbCBmYWlsdXJlIHdhcyBmaXJzdCBvYnNlcnZlZC5cbiAgICAgIGNvbnN0IGZpbmFsaXplQ29udHJvbEVycm9yID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKGVycm9yKVxuXG4gICAgICBpZiAoZmluYWxpemVDb250cm9sRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGZpbmFsaXplQ29udHJvbEVycm9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgVW5oYW5kbGVkRXhjZXB0aW9uKHVuZGVmaW5lZCwgeyBjYXVzZTogZXJyb3IgfSlcbiAgICB9XG5cbiAgICBsZXQgbWFwcGVkOiBFIHwgUHJvbWlzZTxFPlxuXG4gICAgdHJ5IHtcbiAgICAgIG1hcHBlZCA9IHRoaXMuI2NhdGNoRm4oZXJyb3IpXG4gICAgfSBjYXRjaCAoY2F0Y2hFcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFBhbmljKFwiUlVOX0NBVENIX0hBTkRMRVJfVEhST1dcIiwgeyBjYXVzZTogY2F0Y2hFcnJvciB9KVxuICAgIH1cblxuICAgIGlmIChjaGVja0lzUHJvbWlzZUxpa2UobWFwcGVkKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmFjZShtYXBwZWQsIGVycm9yKVxuICAgICAgfSBjYXRjaCAoY2F0Y2hFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgUGFuaWMoXCJSVU5fQ0FUQ0hfSEFORExFUl9SRUpFQ1RcIiwgeyBjYXVzZTogY2F0Y2hFcnJvciB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnRyb2wgc3RhdGUgY2FuIGNoYW5nZSB3aGlsZSB0aGUgY2F0Y2ggaGFuZGxlciBydW5zLCBzbyBjaGVjayBhZ2FpblxuICAgIC8vIGJlZm9yZSByZXR1cm5pbmcgYSBtYXBwZWQgc3luYyB2YWx1ZS5cbiAgICBjb25zdCBjYXRjaENvbnRyb2xFcnJvciA9IHRoaXMuY2hlY2tEaWRDb250cm9sRmFpbChlcnJvcilcblxuICAgIGlmIChjYXRjaENvbnRyb2xFcnJvcikge1xuICAgICAgcmV0dXJuIGNhdGNoQ29udHJvbEVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcHBlZFxuICB9XG5cbiAgYXN5bmMgI3J1bkF0dGVtcHRMb29wKGF0dGVtcHQ6IG51bWJlcik6IFByb21pc2U8VCB8IEUgfCBSdW5uZXJFcnJvcj4ge1xuICAgIGxldCBjdXJyZW50QXR0ZW1wdCA9IGF0dGVtcHRcbiAgICBsZXQgY3VycmVudERlY2lzaW9uOiBSZXRyeURlY2lzaW9uIHwgdW5kZWZpbmVkXG5cbiAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgY29udHJvbEJlZm9yZUF0dGVtcHQgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoKVxuXG4gICAgICBpZiAoY29udHJvbEJlZm9yZUF0dGVtcHQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xCZWZvcmVBdHRlbXB0XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50RGVjaXNpb24pIHtcbiAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgY29uc3QgZGVsYXlDb250cm9sUmVzdWx0ID0gYXdhaXQgdGhpcy53YWl0Rm9yUmV0cnlEZWxheShjdXJyZW50RGVjaXNpb24uZGVsYXkpXG5cbiAgICAgICAgaWYgKGRlbGF5Q29udHJvbFJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiBkZWxheUNvbnRyb2xSZXN1bHRcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREZWNpc2lvbiA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICB0aGlzLmN0eC5yZXRyeS5hdHRlbXB0ID0gY3VycmVudEF0dGVtcHRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jdHJ5Rm4odGhpcy5jdHggYXMgdW5rbm93biBhcyBDdHgpXG5cbiAgICAgICAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZShyZXN1bHQpKSB7XG4gICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgICBjb25zdCByYWNlZCA9IGF3YWl0IHRoaXMucmFjZShyZXN1bHQpXG4gICAgICAgICAgcmV0dXJuIHJhY2VkXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlU3luY1N1Y2Nlc3MocmVzdWx0KVxuICAgICAgfSBjYXRjaCAoYXR0ZW1wdEVycm9yKSB7XG4gICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy4jcmVzb2x2ZUZhaWx1cmUoYXR0ZW1wdEVycm9yKVxuXG4gICAgICAgIGlmICghKHJlc29sdmVkIGluc3RhbmNlb2YgUmV0cnlEaXJlY3RpdmUpKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVkXG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50RGVjaXNpb24gPSByZXNvbHZlZC5kZWNpc2lvblxuICAgICAgICBjdXJyZW50QXR0ZW1wdCArPSAxXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlUnVuPFQsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHg+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIGlucHV0OiBSdW5UcnlGbjxULCBDdHg+XG4pOiBQcm9taXNlPFQgfCBVbmhhbmRsZWRFeGNlcHRpb24+XG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVJ1bjxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4PihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICBpbnB1dDogQXN5bmNSdW5JbnB1dDxULCBFLCBDdHg+XG4pOiBQcm9taXNlPFQgfCBFIHwgUnVubmVyRXJyb3I+XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVJ1bjxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4PihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICBpbnB1dDogQXN5bmNSdW5JbnB1dDxULCBFLCBDdHg+XG4pOiBQcm9taXNlPFQgfCBFIHwgUnVubmVyRXJyb3I+IHtcbiAgdXNpbmcgZXhlY3V0aW9uID0gbmV3IFJ1bkV4ZWN1dGlvbjxULCBFLCBDdHg+KGNvbmZpZywgaW5wdXQpXG4gIHJldHVybiBhd2FpdCBleGVjdXRpb24uZXhlY3V0ZSgpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi9idWlsZGVyXCJcbmltcG9ydCB0eXBlIHsgUnVubmVyRXJyb3IgfSBmcm9tIFwiLi9iYXNlXCJcbmltcG9ydCB0eXBlIHsgQmFzZVRyeUN0eCwgTm9uUHJvbWlzZSB9IGZyb20gXCIuL3NoYXJlZFwiXG5pbXBvcnQge1xuICBDb250cm9sRXJyb3IsXG4gIFBhbmljLFxuICBSZXRyeUV4aGF1c3RlZEVycm9yLFxuICBVbmhhbmRsZWRFeGNlcHRpb24sXG4gIHR5cGUgUGFuaWNDb2RlLFxufSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7IGNoZWNrSXNQcm9taXNlTGlrZSwgaW52YXJpYW50IH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEJhc2VFeGVjdXRpb24sIFJldHJ5RGlyZWN0aXZlIH0gZnJvbSBcIi4vYmFzZVwiXG5cbmV4cG9ydCB0eXBlIFN5bmNSdW5UcnlGbjxULCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4ID0gQmFzZVRyeUN0eD4gPSAoY3R4OiBDdHgpID0+IE5vblByb21pc2U8VD5cbmV4cG9ydCB0eXBlIFN5bmNSdW5DYXRjaEZuPEU+ID0gKGVycm9yOiB1bmtub3duKSA9PiBOb25Qcm9taXNlPEU+XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1J1bk9wdGlvbnM8VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eCA9IEJhc2VUcnlDdHg+IHtcbiAgdHJ5OiBTeW5jUnVuVHJ5Rm48VCwgQ3R4PlxuICBjYXRjaDogU3luY1J1bkNhdGNoRm48RT5cbn1cblxuZXhwb3J0IHR5cGUgU3luY1J1bklucHV0PFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHggPSBCYXNlVHJ5Q3R4PiA9XG4gIHwgU3luY1J1blRyeUZuPFQsIEN0eD5cbiAgfCBTeW5jUnVuT3B0aW9uczxULCBFLCBDdHg+XG5cbmZ1bmN0aW9uIGFzc2VydE5vdFByb21pc2VMaWtlKHZhbHVlOiB1bmtub3duLCBjb2RlOiBQYW5pY0NvZGUsIG1lc3NhZ2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaW52YXJpYW50KFxuICAgICFjaGVja0lzUHJvbWlzZUxpa2UodmFsdWUpLFxuICAgIG5ldyBQYW5pYyhjb2RlLCBtZXNzYWdlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IG1lc3NhZ2UgfSlcbiAgKVxufVxuXG5jbGFzcyBSdW5TeW5jRXhlY3V0aW9uPFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHg+IGV4dGVuZHMgQmFzZUV4ZWN1dGlvbjxUIHwgRSB8IFJ1bm5lckVycm9yPiB7XG4gICNjYXRjaEZuOiBTeW5jUnVuQ2F0Y2hGbjxFPiB8IHVuZGVmaW5lZFxuICAjdHJ5Rm46IFN5bmNSdW5UcnlGbjxULCBDdHg+XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnLCBpbnB1dDogU3luY1J1bklucHV0PFQsIEUsIEN0eD4pIHtcbiAgICBzdXBlcihjb25maWcpXG5cbiAgICB0aGlzLiNjYXRjaEZuID0gdHlwZW9mIGlucHV0ID09PSBcImZ1bmN0aW9uXCIgPyB1bmRlZmluZWQgOiBpbnB1dC5jYXRjaFxuICAgIHRoaXMuI3RyeUZuID0gdHlwZW9mIGlucHV0ID09PSBcImZ1bmN0aW9uXCIgPyBpbnB1dCA6IGlucHV0LnRyeVxuICB9XG5cbiAgb3ZlcnJpZGUgZXhlY3V0ZSgpOiBUIHwgRSB8IFJ1bm5lckVycm9yIHtcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5leGVjdXRlKClcbiAgICBhc3NlcnROb3RQcm9taXNlTGlrZShyZXN1bHQsIFwiUlVOX1NZTkNfV1JBUFBFRF9SRVNVTFRfUFJPTUlTRVwiKVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBleGVjdXRlQ29yZSgpOiBUIHwgRSB8IFJ1bm5lckVycm9yIHtcbiAgICByZXR1cm4gdGhpcy4jcnVuQXR0ZW1wdExvb3AoMSlcbiAgfVxuXG4gICNyZXNvbHZlRmFpbHVyZShlcnJvcjogdW5rbm93bik6IEUgfCBSdW5uZXJFcnJvciB8IFJldHJ5RGlyZWN0aXZlIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBQYW5pYykge1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb250cm9sRXJyb3IpIHtcbiAgICAgIHJldHVybiBlcnJvclxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xFcnJvciA9IHRoaXMuY2hlY2tEaWRDb250cm9sRmFpbChlcnJvcilcblxuICAgIGlmIChjb250cm9sRXJyb3IpIHtcbiAgICAgIHJldHVybiBjb250cm9sRXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCByZXRyeURlY2lzaW9uID0gdGhpcy5idWlsZFJldHJ5RGVjaXNpb24oZXJyb3IpXG5cbiAgICBpZiAocmV0cnlEZWNpc2lvbi5zaG91bGRBdHRlbXB0UmV0cnkpIHtcbiAgICAgIHJldHVybiBuZXcgUmV0cnlEaXJlY3RpdmUocmV0cnlEZWNpc2lvbilcbiAgICB9XG5cbiAgICBpZiAocmV0cnlEZWNpc2lvbi5pc1JldHJ5RXhoYXVzdGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFJldHJ5RXhoYXVzdGVkRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBlcnJvciB9KVxuICAgIH1cblxuICAgIGlmICghdGhpcy4jY2F0Y2hGbikge1xuICAgICAgLy8gRXZlbiB3aXRob3V0IGEgY2F0Y2ggaGFuZGxlciwgY2FuY2VsbGF0aW9uL3RpbWVvdXQgbWF5IGhhdmUgd29uIHNpbmNlXG4gICAgICAvLyB0aGUgb3JpZ2luYWwgZmFpbHVyZSB3YXMgZmlyc3Qgb2JzZXJ2ZWQuXG4gICAgICBjb25zdCBmaW5hbGl6ZUNvbnRyb2xFcnJvciA9IHRoaXMuY2hlY2tEaWRDb250cm9sRmFpbChlcnJvcilcblxuICAgICAgaWYgKGZpbmFsaXplQ29udHJvbEVycm9yKSB7XG4gICAgICAgIHJldHVybiBmaW5hbGl6ZUNvbnRyb2xFcnJvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFVuaGFuZGxlZEV4Y2VwdGlvbih1bmRlZmluZWQsIHsgY2F1c2U6IGVycm9yIH0pXG4gICAgfVxuXG4gICAgbGV0IG1hcHBlZDogRVxuXG4gICAgdHJ5IHtcbiAgICAgIG1hcHBlZCA9IHRoaXMuI2NhdGNoRm4oZXJyb3IpXG4gICAgfSBjYXRjaCAoY2F0Y2hFcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFBhbmljKFwiUlVOX1NZTkNfQ0FUQ0hfSEFORExFUl9USFJPV1wiLCB7IGNhdXNlOiBjYXRjaEVycm9yIH0pXG4gICAgfVxuXG4gICAgYXNzZXJ0Tm90UHJvbWlzZUxpa2UobWFwcGVkLCBcIlJVTl9TWU5DX0NBVENIX1BST01JU0VcIilcblxuICAgIC8vIENvbnRyb2wgc3RhdGUgY2FuIGNoYW5nZSB3aGlsZSB0aGUgY2F0Y2ggaGFuZGxlciBydW5zLCBzbyBjaGVjayBhZ2FpblxuICAgIC8vIGJlZm9yZSByZXR1cm5pbmcgYSBtYXBwZWQgc3luYyB2YWx1ZS5cbiAgICBjb25zdCBjYXRjaENvbnRyb2xFcnJvciA9IHRoaXMuY2hlY2tEaWRDb250cm9sRmFpbChlcnJvcilcblxuICAgIGlmIChjYXRjaENvbnRyb2xFcnJvcikge1xuICAgICAgcmV0dXJuIGNhdGNoQ29udHJvbEVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcHBlZFxuICB9XG5cbiAgI3J1bkF0dGVtcHRMb29wKGF0dGVtcHQ6IG51bWJlcik6IFQgfCBFIHwgUnVubmVyRXJyb3Ige1xuICAgIGxldCBjdXJyZW50QXR0ZW1wdCA9IGF0dGVtcHRcblxuICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBjb250cm9sQmVmb3JlQXR0ZW1wdCA9IHRoaXMuY2hlY2tEaWRDb250cm9sRmFpbCgpXG5cbiAgICAgIGlmIChjb250cm9sQmVmb3JlQXR0ZW1wdCkge1xuICAgICAgICByZXR1cm4gY29udHJvbEJlZm9yZUF0dGVtcHRcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdHgucmV0cnkuYXR0ZW1wdCA9IGN1cnJlbnRBdHRlbXB0XG5cbiAgICAgIGxldCByZXN1bHQ6IE5vblByb21pc2U8VD5cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy4jdHJ5Rm4odGhpcy5jdHggYXMgdW5rbm93biBhcyBDdHgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMuI3Jlc29sdmVGYWlsdXJlKGVycm9yKVxuXG4gICAgICAgIGlmIChyZXNvbHZlZCBpbnN0YW5jZW9mIFJldHJ5RGlyZWN0aXZlKSB7XG4gICAgICAgICAgaWYgKHJlc29sdmVkLmRlY2lzaW9uLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBhbmljKFwiUlVOX1NZTkNfQVNZTkNfUkVUUllfUE9MSUNZXCIpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3VycmVudEF0dGVtcHQgKz0gMVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0Tm90UHJvbWlzZUxpa2UocmVzdWx0LCBcIlJVTl9TWU5DX1RSWV9QUk9NSVNFXCIpXG5cbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVTeW5jU3VjY2VzcyhyZXN1bHQpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlUnVuU3luYzxULCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4PihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICBpbnB1dDogU3luY1J1blRyeUZuPFQsIEN0eD5cbik6IFQgfCBVbmhhbmRsZWRFeGNlcHRpb24gfCBSdW5uZXJFcnJvclxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVSdW5TeW5jPFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHg+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIGlucHV0OiBTeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4PlxuKTogVCB8IEUgfCBSdW5uZXJFcnJvclxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVSdW5TeW5jPFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHg+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIGlucHV0OiBTeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4PlxuKTogVCB8IEUgfCBSdW5uZXJFcnJvciB7XG4gIC8vIEJ1aWxkZXIgdHlwaW5nIGJsb2NrcyBhc3luYy1vbmx5IHJldHJ5IHBvbGljaWVzLCBidXQgZGlyZWN0IGV4ZWN1dG9yIHVzYWdlIGFuZFxuICAvLyB1bnNhZmUgY2FzdHMgc3RpbGwgbmVlZCBhIHJ1bnRpbWUgZ3VhcmQgaGVyZS5cbiAgY29uc3QgaXNTeW5jU2FmZVJldHJ5UG9saWN5ID1cbiAgICBjb25maWcucmV0cnkgPT09IHVuZGVmaW5lZCB8fFxuICAgIChjb25maWcucmV0cnkuYmFja29mZiA9PT0gXCJjb25zdGFudFwiICYmXG4gICAgICAhY29uZmlnLnJldHJ5LmppdHRlciAmJlxuICAgICAgKGNvbmZpZy5yZXRyeS5kZWxheU1zID8/IDApIDw9IDApXG5cbiAgaW52YXJpYW50KGlzU3luY1NhZmVSZXRyeVBvbGljeSwgbmV3IFBhbmljKFwiUlVOX1NZTkNfQVNZTkNfUkVUUllfUE9MSUNZXCIpKVxuXG4gIHVzaW5nIGV4ZWN1dGlvbiA9IG5ldyBSdW5TeW5jRXhlY3V0aW9uPFQsIEUsIEN0eD4oY29uZmlnLCBpbnB1dClcbiAgcmV0dXJuIGV4ZWN1dGlvbi5leGVjdXRlKClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBDYW5jZWxsYXRpb25FcnJvcixcbiAgUmV0cnlFeGhhdXN0ZWRFcnJvcixcbiAgVGltZW91dEVycm9yLFxuICBVbmhhbmRsZWRFeGNlcHRpb24sXG59IGZyb20gXCIuL2Vycm9yc1wiXG5pbXBvcnQgdHlwZSB7XG4gIEluZmVycmVkVGFza0NvbnRleHQsXG4gIFRhc2tSZWNvcmQsXG4gIFRhc2tSZXN1bHQsXG4gIFRhc2tWYWxpZGF0aW9uLFxuICBBbGxPcHRpb25zLFxuICBBbGxTZXR0bGVkUmVzdWx0LFxuICBUcnlDdHgsXG4gIFRyeUN0eEZvcixcbn0gZnJvbSBcIi4vZXhlY3V0b3JzL3NoYXJlZFwiXG5pbXBvcnQgdHlwZSB7IFJldHJ5T3B0aW9ucywgUmV0cnlQb2xpY3kgfSBmcm9tIFwiLi9tb2RpZmllcnMvcmV0cnlcIlxuaW1wb3J0IHsgUGFuaWMgfSBmcm9tIFwiLi9lcnJvcnNcIlxuaW1wb3J0IHsgZXhlY3V0ZUFsbCB9IGZyb20gXCIuL2V4ZWN1dG9ycy9hbGxcIlxuaW1wb3J0IHsgZXhlY3V0ZUFsbFNldHRsZWQgfSBmcm9tIFwiLi9leGVjdXRvcnMvYWxsLXNldHRsZWRcIlxuaW1wb3J0IHsgZXhlY3V0ZUZsb3csIHR5cGUgRmxvd1Jlc3VsdCwgdHlwZSBJbmZlcnJlZEZsb3dUYXNrQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dG9ycy9mbG93XCJcbmltcG9ydCB7IGV4ZWN1dGVSdW4sIHR5cGUgQXN5bmNSdW5JbnB1dCwgdHlwZSBSdW5UcnlGbiB9IGZyb20gXCIuL2V4ZWN1dG9ycy9ydW5cIlxuaW1wb3J0IHsgZXhlY3V0ZVJ1blN5bmMsIHR5cGUgU3luY1J1bklucHV0LCB0eXBlIFN5bmNSdW5UcnlGbiB9IGZyb20gXCIuL2V4ZWN1dG9ycy9ydW4tc3luY1wiXG5pbXBvcnQgeyByZXRyeU9wdGlvbnMgfSBmcm9tIFwiLi9tb2RpZmllcnMvcmV0cnlcIlxuaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSBcIi4vdXRpbHNcIlxuXG4vKipcbiAqIFdyYXBzIGFyZSBvYnNlcnZhdGlvbmFsIGhvb2tzOiB0aGV5IGNhbiBpbnNwZWN0IGV4ZWN1dGlvbiBjb250ZXh0IGFuZFxuICogc3Vycm91bmQgZXhlY3V0aW9uLCBidXQgdGhleSBtdXN0IG5vdCBtdXRhdGUgY29udGV4dCBvciByZXBsYWNlIGl0LlxuICovXG5leHBvcnQgdHlwZSBXcmFwQ3R4ID0gUmVhZG9ubHk8T21pdDxUcnlDdHgsIFwicmV0cnlcIj4+ICYge1xuICByZWFkb25seSByZXRyeTogUmVhZG9ubHk8VHJ5Q3R4W1wicmV0cnlcIl0+XG59XG5cbnR5cGUgV3JhcEZuID0gKGN0eDogV3JhcEN0eCwgbmV4dDogKCkgPT4gdW5rbm93bikgPT4gdW5rbm93blxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJDb25maWcge1xuICAvKipcbiAgICogUmV0cnkgY29uZmlndXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBydW4uXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5XG4gIC8qKlxuICAgKiBUaW1lb3V0IGNvbmZpZ3VyYXRpb24gYXBwbGllZCB0byB0aGUgcnVuLlxuICAgKi9cbiAgdGltZW91dD86IG51bWJlclxuICAvKipcbiAgICogQWJvcnQgc2lnbmFscyB1c2VkIHRvIGNhbmNlbCBleGVjdXRpb24uXG4gICAqL1xuICBzaWduYWxzPzogQWJvcnRTaWduYWxbXVxuICAvKipcbiAgICogV3JhcHBlciBtaWRkbGV3YXJlIGNoYWluIGFyb3VuZCBleGVjdXRpb24uXG4gICAqL1xuICB3cmFwcz86IFdyYXBGbltdXG59XG5cbnR5cGUgQ29uZmlnUnVuRXJyb3JzID0gUmV0cnlFeGhhdXN0ZWRFcnJvciB8IFRpbWVvdXRFcnJvciB8IENhbmNlbGxhdGlvbkVycm9yXG50eXBlIE9yY2hlc3RyYXRpb25NZXRob2RzID0gXCJhbGxcIiB8IFwiYWxsU2V0dGxlZFwiIHwgXCJmbG93XCJcbnR5cGUgU2lnbmFsQnVpbGRlckhpZGRlbk1ldGhvZHM8U3VwcG9ydHNPcmNoZXN0cmF0aW9uIGV4dGVuZHMgYm9vbGVhbj4gPVxuICB8IFwicnVuU3luY1wiXG4gIHwgXCJ3cmFwXCJcbiAgfCAoU3VwcG9ydHNPcmNoZXN0cmF0aW9uIGV4dGVuZHMgdHJ1ZSA/IG5ldmVyIDogT3JjaGVzdHJhdGlvbk1ldGhvZHMpXG50eXBlIEV4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUgZXh0ZW5kcyBDb25maWdSdW5FcnJvcnMsIEhhc1JldHJ5IGV4dGVuZHMgYm9vbGVhbj4gPSBPbWl0PFxuICBSdW5CdWlsZGVyPEUsIEhhc1JldHJ5LCBmYWxzZT4sXG4gIE9yY2hlc3RyYXRpb25NZXRob2RzIHwgXCJ3cmFwXCJcbj5cbnR5cGUgQXN5bmNFeGVjdXRpb25CdWlsZGVyU3VyZmFjZTxFIGV4dGVuZHMgQ29uZmlnUnVuRXJyb3JzLCBIYXNSZXRyeSBleHRlbmRzIGJvb2xlYW4+ID0gT21pdDxcbiAgUnVuQnVpbGRlcjxFLCBIYXNSZXRyeSwgZmFsc2U+LFxuICBPcmNoZXN0cmF0aW9uTWV0aG9kcyB8IFwicnVuU3luY1wiIHwgXCJ3cmFwXCJcbj5cbnR5cGUgU2lnbmFsQnVpbGRlclN1cmZhY2U8XG4gIEUgZXh0ZW5kcyBDb25maWdSdW5FcnJvcnMsXG4gIEhhc1JldHJ5IGV4dGVuZHMgYm9vbGVhbixcbiAgU3VwcG9ydHNPcmNoZXN0cmF0aW9uIGV4dGVuZHMgYm9vbGVhbixcbj4gPSBPbWl0PFxuICBSdW5CdWlsZGVyPEUsIEhhc1JldHJ5LCBTdXBwb3J0c09yY2hlc3RyYXRpb24+LFxuICBTaWduYWxCdWlsZGVySGlkZGVuTWV0aG9kczxTdXBwb3J0c09yY2hlc3RyYXRpb24+XG4+XG5cbmV4cG9ydCBjbGFzcyBSdW5CdWlsZGVyPFxuICBFIGV4dGVuZHMgQ29uZmlnUnVuRXJyb3JzID0gbmV2ZXIsXG4gIEhhc1JldHJ5IGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICBTdXBwb3J0c09yY2hlc3RyYXRpb24gZXh0ZW5kcyBib29sZWFuID0gdHJ1ZSxcbj4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29uZmlnOiBCdWlsZGVyQ29uZmlnXG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZ1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUmV0cnlDb25maWcocG9saWN5OiBSZXRyeU9wdGlvbnMpOiBCdWlsZGVyQ29uZmlnIHtcbiAgICBjb25zdCBsaW1pdCA9IHR5cGVvZiBwb2xpY3kgPT09IFwibnVtYmVyXCIgPyBwb2xpY3kgOiBwb2xpY3kubGltaXRcblxuICAgIGludmFyaWFudChOdW1iZXIuaXNGaW5pdGUobGltaXQpLCBuZXcgUGFuaWMoXCJSRVRSWV9JTlZBTElEX0xJTUlUXCIpKVxuICAgIGludmFyaWFudChsaW1pdCA+PSAwLCBuZXcgUGFuaWMoXCJSRVRSWV9JTlZBTElEX0xJTUlUXCIpKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgcmV0cnk6IHJldHJ5T3B0aW9ucyhwb2xpY3kpLFxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFRpbWVvdXRDb25maWcobXM6IG51bWJlcik6IEJ1aWxkZXJDb25maWcge1xuICAgIGludmFyaWFudChOdW1iZXIuaXNGaW5pdGUobXMpLCBuZXcgUGFuaWMoXCJUSU1FT1VUX0lOVkFMSURfTVNcIikpXG4gICAgaW52YXJpYW50KG1zID49IDAsIG5ldyBQYW5pYyhcIlRJTUVPVVRfSU5WQUxJRF9NU1wiKSlcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHRpbWVvdXQ6IG1zLFxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFNpZ25hbENvbmZpZyhzaWduYWw6IEFib3J0U2lnbmFsKTogQnVpbGRlckNvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgc2lnbmFsczogWy4uLih0aGlzLmNvbmZpZy5zaWduYWxzID8/IFtdKSwgc2lnbmFsXSxcbiAgICB9XG4gIH1cblxuICByZXRyeShwb2xpY3k6IG51bWJlcik6IEV4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUgfCBSZXRyeUV4aGF1c3RlZEVycm9yLCB0cnVlPlxuICByZXRyeShwb2xpY3k6IFJldHJ5T3B0aW9ucyk6IEFzeW5jRXhlY3V0aW9uQnVpbGRlclN1cmZhY2U8RSB8IFJldHJ5RXhoYXVzdGVkRXJyb3IsIHRydWU+XG4gIHJldHJ5KHBvbGljeTogUmV0cnlPcHRpb25zKTogRXhlY3V0aW9uQnVpbGRlclN1cmZhY2U8RSB8IFJldHJ5RXhoYXVzdGVkRXJyb3IsIHRydWU+IHtcbiAgICByZXR1cm4gbmV3IEV4ZWN1dGlvbkJ1aWxkZXIodGhpcy5idWlsZFJldHJ5Q29uZmlnKHBvbGljeSkpXG4gIH1cblxuICB0aW1lb3V0KG1zOiBudW1iZXIpOiBBc3luY0V4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUgfCBUaW1lb3V0RXJyb3IsIEhhc1JldHJ5PiB7XG4gICAgcmV0dXJuIG5ldyBFeGVjdXRpb25CdWlsZGVyKHRoaXMuYnVpbGRUaW1lb3V0Q29uZmlnKG1zKSlcbiAgfVxuXG4gIHNpZ25hbChcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsXG4gICk6IFNpZ25hbEJ1aWxkZXJTdXJmYWNlPEUgfCBDYW5jZWxsYXRpb25FcnJvciwgSGFzUmV0cnksIFN1cHBvcnRzT3JjaGVzdHJhdGlvbj4ge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRXhlY3V0aW9uQnVpbGRlcikge1xuICAgICAgcmV0dXJuIG5ldyBFeGVjdXRpb25CdWlsZGVyKFxuICAgICAgICB0aGlzLmJ1aWxkU2lnbmFsQ29uZmlnKHNpZ25hbClcbiAgICAgICkgYXMgdW5rbm93biBhcyBTaWduYWxCdWlsZGVyU3VyZmFjZTxFIHwgQ2FuY2VsbGF0aW9uRXJyb3IsIEhhc1JldHJ5LCBTdXBwb3J0c09yY2hlc3RyYXRpb24+XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBSdW5CdWlsZGVyKHRoaXMuYnVpbGRTaWduYWxDb25maWcoc2lnbmFsKSkgYXMgdW5rbm93biBhcyBTaWduYWxCdWlsZGVyU3VyZmFjZTxcbiAgICAgIEUgfCBDYW5jZWxsYXRpb25FcnJvcixcbiAgICAgIEhhc1JldHJ5LFxuICAgICAgU3VwcG9ydHNPcmNoZXN0cmF0aW9uXG4gICAgPlxuICB9XG5cbiAgd3JhcChmbjogV3JhcEZuKTogUnVuQnVpbGRlcjxFLCBIYXNSZXRyeSwgU3VwcG9ydHNPcmNoZXN0cmF0aW9uPiB7XG4gICAgcmV0dXJuIG5ldyBSdW5CdWlsZGVyKHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgd3JhcHM6IFsuLi4odGhpcy5jb25maWcud3JhcHMgPz8gW10pLCBmbl0sXG4gICAgfSlcbiAgfVxuXG4gIHJ1bjxUPih0cnlGbjogUnVuVHJ5Rm48VCwgVHJ5Q3R4Rm9yPEhhc1JldHJ5Pj4pOiBQcm9taXNlPFQgfCBVbmhhbmRsZWRFeGNlcHRpb24gfCBFPlxuICBydW48VCwgQz4ob3B0aW9uczogQXN5bmNSdW5JbnB1dDxULCBDLCBUcnlDdHhGb3I8SGFzUmV0cnk+Pik6IFByb21pc2U8VCB8IEMgfCBFPlxuICBydW48VCwgQz4oaW5wdXQ6IEFzeW5jUnVuSW5wdXQ8VCwgQywgVHJ5Q3R4Rm9yPEhhc1JldHJ5Pj4pIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJ1bih0aGlzLmNvbmZpZywgaW5wdXQpXG4gIH1cblxuICBydW5TeW5jPFQ+KHRyeUZuOiBTeW5jUnVuVHJ5Rm48VCwgVHJ5Q3R4Rm9yPEhhc1JldHJ5Pj4pOiBUIHwgVW5oYW5kbGVkRXhjZXB0aW9uIHwgRVxuICBydW5TeW5jPFQsIEM+KGlucHV0OiBTeW5jUnVuSW5wdXQ8VCwgQywgVHJ5Q3R4Rm9yPEhhc1JldHJ5Pj4pOiBUIHwgQyB8IEVcbiAgcnVuU3luYzxULCBDPihpbnB1dDogU3luY1J1bklucHV0PFQsIEMsIFRyeUN0eEZvcjxIYXNSZXRyeT4+KSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSdW5TeW5jKHRoaXMuY29uZmlnLCBpbnB1dClcbiAgfVxuXG4gIGFsbDxUIGV4dGVuZHMgVGFza1JlY29yZCwgQyA9IG5ldmVyPihcbiAgICB0YXNrczogVCAmIFRhc2tWYWxpZGF0aW9uPE5vSW5mZXI8VD4+ICYgVGhpc1R5cGU8SW5mZXJyZWRUYXNrQ29udGV4dDxUPj4sXG4gICAgb3B0aW9ucz86IEFsbE9wdGlvbnM8VCwgQz5cbiAgKTogUHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBUYXNrUmVzdWx0PFRbS10+IH0gfCBDPiB7XG4gICAgcmV0dXJuIGV4ZWN1dGVBbGwodGhpcy5jb25maWcsIHRhc2tzLCBvcHRpb25zKVxuICB9XG5cbiAgYWxsU2V0dGxlZDxUIGV4dGVuZHMgVGFza1JlY29yZD4oXG4gICAgdGFza3M6IFQgJiBUYXNrVmFsaWRhdGlvbjxOb0luZmVyPFQ+PiAmIFRoaXNUeXBlPEluZmVycmVkVGFza0NvbnRleHQ8VD4+XG4gICk6IFByb21pc2U8QWxsU2V0dGxlZFJlc3VsdDxUPj4ge1xuICAgIHJldHVybiBleGVjdXRlQWxsU2V0dGxlZCh0aGlzLmNvbmZpZywgdGFza3MpXG4gIH1cblxuICBmbG93PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPihcbiAgICB0YXNrczogVCAmIFRoaXNUeXBlPEluZmVycmVkRmxvd1Rhc2tDb250ZXh0PFQ+PlxuICApOiBQcm9taXNlPEZsb3dSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gZXhlY3V0ZUZsb3codGhpcy5jb25maWcsIHRhc2tzKVxuICB9XG59XG5cbmNsYXNzIEV4ZWN1dGlvbkJ1aWxkZXI8XG4gIEUgZXh0ZW5kcyBDb25maWdSdW5FcnJvcnMgPSBuZXZlcixcbiAgSGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+IGV4dGVuZHMgUnVuQnVpbGRlcjxFLCBIYXNSZXRyeSwgZmFsc2U+IHtcbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpXG5cbiAgICAvLyBSZXRyeS90aW1lb3V0IGNoYWlucyBtdXN0IG5vdCBzaWxlbnRseSBrZWVwIG9yY2hlc3RyYXRpb24gZW50cnlwb2ludHMgYXRcbiAgICAvLyBydW50aW1lLCBldmVuIHRob3VnaCB0aGUgdHlwZSBzdXJmYWNlIGFscmVhZHkgcmVtb3ZlcyB0aGVtLlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgIGFsbDogeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQsIHdyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgYWxsU2V0dGxlZDogeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQsIHdyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgZmxvdzogeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQsIHdyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgd3JhcDogeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQsIHdyaXRhYmxlOiBmYWxzZSB9LFxuICAgIH0pXG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2UoKTogQXN5bmNEaXNwb3NhYmxlU3RhY2sge1xuICByZXR1cm4gbmV3IEFzeW5jRGlzcG9zYWJsZVN0YWNrKClcbn1cbiIsCiAgICAiaW1wb3J0IHsgY2hlY2tJc1Byb21pc2VMaWtlIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG50eXBlIEdlblVud3JhcDxUPiA9IEV4Y2x1ZGU8QXdhaXRlZDxUPiwgRXJyb3I+XG5leHBvcnQgdHlwZSBHZW5Vc2UgPSA8VD4odmFsdWU6IFQpID0+IEdlbmVyYXRvcjxULCBHZW5VbndyYXA8VD4sIEdlblVud3JhcDxUPj5cblxudHlwZSBHZW5FcnJvcnM8VFlpZWxkPiA9IEV4dHJhY3Q8QXdhaXRlZDxUWWllbGQ+LCBFcnJvcj5cbnR5cGUgQ2hlY2tJc0FzeW5jPFRZaWVsZCwgVFJldHVybj4gPVxuICBFeHRyYWN0PFRZaWVsZCB8IFRSZXR1cm4sIFByb21pc2VMaWtlPHVua25vd24+PiBleHRlbmRzIG5ldmVyID8gZmFsc2UgOiB0cnVlXG5cbmV4cG9ydCB0eXBlIEdlblJlc3VsdDxUWWllbGQsIFRSZXR1cm4+ID1cbiAgQ2hlY2tJc0FzeW5jPFRZaWVsZCwgVFJldHVybj4gZXh0ZW5kcyB0cnVlXG4gICAgPyBQcm9taXNlPEF3YWl0ZWQ8VFJldHVybj4gfCBHZW5FcnJvcnM8VFlpZWxkPj5cbiAgICA6IEF3YWl0ZWQ8VFJldHVybj4gfCBHZW5FcnJvcnM8VFlpZWxkPlxuXG5mdW5jdGlvbiogdXNlPFQ+KHZhbHVlOiBUKTogR2VuZXJhdG9yPFQsIEdlblVud3JhcDxUPiwgR2VuVW53cmFwPFQ+PiB7XG4gIHJldHVybiB5aWVsZCB2YWx1ZVxufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlQXN5bmNHZW5lcmF0b3I8VFlpZWxkLCBUUmV0dXJuPihcbiAgaXRlcmF0b3I6IEdlbmVyYXRvcjxUWWllbGQsIFRSZXR1cm4sIHVua25vd24+LFxuICBpbml0aWFsU3RlcDogSXRlcmF0b3JSZXN1bHQ8VFlpZWxkLCBUUmV0dXJuPlxuKTogUHJvbWlzZTxBd2FpdGVkPFRSZXR1cm4+IHwgR2VuRXJyb3JzPFRZaWVsZD4+IHtcbiAgbGV0IGN1cnJlbnRTdGVwID0gaW5pdGlhbFN0ZXBcblxuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoY3VycmVudFN0ZXAuZG9uZSkge1xuICAgICAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZShjdXJyZW50U3RlcC52YWx1ZSkpIHtcbiAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgcmV0dXJuIGF3YWl0IGN1cnJlbnRTdGVwLnZhbHVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50U3RlcC52YWx1ZSBhcyBBd2FpdGVkPFRSZXR1cm4+XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnRWYWx1ZTogdW5rbm93blxuXG4gICAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZShjdXJyZW50U3RlcC52YWx1ZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IGF3YWl0IGN1cnJlbnRTdGVwLnZhbHVlXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjdXJyZW50U3RlcCA9IGl0ZXJhdG9yLnRocm93KGVycm9yKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50U3RlcC52YWx1ZVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZSBhcyBHZW5FcnJvcnM8VFlpZWxkPlxuICAgIH1cblxuICAgIGN1cnJlbnRTdGVwID0gaXRlcmF0b3IubmV4dChjdXJyZW50VmFsdWUpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyaXZlR2VuPFRZaWVsZCwgVFJldHVybj4oXG4gIGZhY3Rvcnk6ICh1c2VGbjogR2VuVXNlKSA9PiBHZW5lcmF0b3I8VFlpZWxkLCBUUmV0dXJuLCB1bmtub3duPlxuKTogR2VuUmVzdWx0PFRZaWVsZCwgVFJldHVybj4ge1xuICBjb25zdCBpdGVyYXRvciA9IGZhY3RvcnkodXNlKVxuXG4gIGxldCBjdXJyZW50VmFsdWU6IHVua25vd24gPSB1bmRlZmluZWRcblxuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBzdGVwID0gaXRlcmF0b3IubmV4dChjdXJyZW50VmFsdWUpXG5cbiAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHN0ZXAudmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3RlcC52YWx1ZSkgYXMgR2VuUmVzdWx0PFRZaWVsZCwgVFJldHVybj5cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0ZXAudmFsdWUgYXMgR2VuUmVzdWx0PFRZaWVsZCwgVFJldHVybj5cbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHN0ZXAudmFsdWUpKSB7XG4gICAgICByZXR1cm4gZXhlY3V0ZUFzeW5jR2VuZXJhdG9yKGl0ZXJhdG9yLCBzdGVwKSBhcyBHZW5SZXN1bHQ8VFlpZWxkLCBUUmV0dXJuPlxuICAgIH1cblxuICAgIGlmIChzdGVwLnZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBzdGVwLnZhbHVlIGFzIEdlblJlc3VsdDxUWWllbGQsIFRSZXR1cm4+XG4gICAgfVxuXG4gICAgY3VycmVudFZhbHVlID0gc3RlcC52YWx1ZVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IFJ1bkJ1aWxkZXIgfSBmcm9tIFwiLi9saWIvYnVpbGRlclwiXG5cbmNvbnN0IHJvb3QgPSBuZXcgUnVuQnVpbGRlcigpXG5cbmV4cG9ydCBjb25zdCBhbGw6IFJ1bkJ1aWxkZXJbXCJhbGxcIl0gPSByb290LmFsbC5iaW5kKHJvb3QpXG5leHBvcnQgY29uc3QgYWxsU2V0dGxlZDogUnVuQnVpbGRlcltcImFsbFNldHRsZWRcIl0gPSByb290LmFsbFNldHRsZWQuYmluZChyb290KVxuZXhwb3J0IGNvbnN0IGZsb3c6IFJ1bkJ1aWxkZXJbXCJmbG93XCJdID0gcm9vdC5mbG93LmJpbmQocm9vdClcbmV4cG9ydCBjb25zdCByZXRyeTogUnVuQnVpbGRlcltcInJldHJ5XCJdID0gcm9vdC5yZXRyeS5iaW5kKHJvb3QpXG5leHBvcnQgY29uc3QgcnVuOiBSdW5CdWlsZGVyW1wicnVuXCJdID0gcm9vdC5ydW4uYmluZChyb290KVxuZXhwb3J0IGNvbnN0IHJ1blN5bmM6IFJ1bkJ1aWxkZXJbXCJydW5TeW5jXCJdID0gcm9vdC5ydW5TeW5jLmJpbmQocm9vdClcbmV4cG9ydCBjb25zdCBzaWduYWw6IFJ1bkJ1aWxkZXJbXCJzaWduYWxcIl0gPSByb290LnNpZ25hbC5iaW5kKHJvb3QpXG5leHBvcnQgY29uc3QgdGltZW91dDogUnVuQnVpbGRlcltcInRpbWVvdXRcIl0gPSByb290LnRpbWVvdXQuYmluZChyb290KVxuZXhwb3J0IGNvbnN0IHdyYXA6IFJ1bkJ1aWxkZXJbXCJ3cmFwXCJdID0gcm9vdC53cmFwLmJpbmQocm9vdClcblxuZXhwb3J0IHsgZGlzcG9zZSB9IGZyb20gXCIuL2xpYi9kaXNwb3NlXCJcbmV4cG9ydCB7IGRyaXZlR2VuIGFzIGdlbiB9IGZyb20gXCIuL2xpYi9nZW5cIlxuXG5leHBvcnQgeyByZXRyeU9wdGlvbnMgfSBmcm9tIFwiLi9saWIvbW9kaWZpZXJzL3JldHJ5XCJcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7OztBQUVPLFNBQVMsaUJBQWlCLENBQUMsT0FBYyxNQUF3QjtBQUFBLEVBQ3RFLE1BQU0sSUFBSSxNQUFNLE1BQU0sRUFBRSxTQUFTLHFCQUFxQixPQUFPLEtBQUssSUFBSSxDQUFDO0FBQUE7QUFHbEUsU0FBUyxTQUFTLENBQUMsV0FBb0IsT0FBaUM7QUFBQSxFQUM3RSxJQUFJLENBQUMsV0FBVztBQUFBLElBQ2QsTUFBTTtBQUFBLEVBQ1I7QUFBQTtBQUdLLFNBQVMsS0FBSyxDQUFDLElBQTJCO0FBQUEsRUFDL0MsSUFBSSxNQUFNLEdBQUc7QUFBQSxJQUNYLE9BQU8sUUFBUSxRQUFRO0FBQUEsRUFDekI7QUFBQSxFQUVBLE9BQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUFBLElBQzlCLFdBQVcsU0FBUyxF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QUNyQjtBQUFBLElBRUEsSUFBSTtBQUFBLElBRUosSUFBSSxtQkFBbUIsWUFBWSxLQUFLLEdBQUc7QUFBQSxNQUN6QyxJQUFJO0FBQUEsUUFFRixlQUFlLE1BQU0sWUFBWTtBQUFBLFFBQ2pDLE9BQU8sT0FBTztBQUFBLFFBQ2QsY0FBYyxTQUFTLE1BQU0sS0FBSztBQUFBLFFBQ2xDO0FBQUE7QUFBQSxJQUVKLEVBQU87QUFBQSxNQUNMLGVBQWUsWUFBWTtBQUFBO0FBQUEsSUFHN0IsSUFBSSx3QkFBd0IsT0FBTztBQUFBLE1BQ2pDLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxjQUFjLFNBQVMsS0FBSyxZQUFZO0FBQUEsRUFDMUM7QUFBQTtBQUdLLFNBQVMsUUFBeUIsQ0FDdkMsU0FDNEI7QUFBQSxFQUM1QixNQUFNLFdBQVcsUUFBUSxHQUFHO0FBQUEsRUFFNUIsSUFBSSxlQUF3QjtBQUFBLEVBRzVCLE9BQU8sTUFBTTtBQUFBLElBQ1gsTUFBTSxPQUFPLFNBQVMsS0FBSyxZQUFZO0FBQUEsSUFFdkMsSUFBSSxLQUFLLE1BQU07QUFBQSxNQUNiLElBQUksbUJBQW1CLEtBQUssS0FBSyxHQUFHO0FBQUEsUUFDbEMsT0FBTyxRQUFRLFFBQVEsS0FBSyxLQUFLO0FBQUEsTUFDbkM7QUFBQSxNQUVBLE9BQU8sS0FBSztBQUFBLElBQ2Q7QUFBQSxJQUVBLElBQUksbUJBQW1CLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDbEMsT0FBTyxzQkFBc0IsVUFBVSxJQUFJO0FBQUEsSUFDN0M7QUFBQSxJQUVBLElBQUksS0FBSyxpQkFBaUIsT0FBTztBQUFBLE1BQy9CLE9BQU8sS0FBSztBQUFBLElBQ2Q7QUFBQSxJQUVBLGVBQWUsS0FBSztBQUFBLEVBQ3RCO0FBQUE7OztBQ25GRixJQUFNLE9BQU8sSUFBSTtBQUVWLElBQU0sTUFBeUIsS0FBSyxJQUFJLEtBQUssSUFBSTtBQUNqRCxJQUFNLGFBQXVDLEtBQUssV0FBVyxLQUFLLElBQUk7QUFDdEUsSUFBTSxPQUEyQixLQUFLLEtBQUssS0FBSyxJQUFJO0FBQ3BELElBQU0sUUFBNkIsS0FBSyxNQUFNLEtBQUssSUFBSTtBQUN2RCxJQUFNLE1BQXlCLEtBQUssSUFBSSxLQUFLLElBQUk7QUFDakQsSUFBTSxVQUFpQyxLQUFLLFFBQVEsS0FBSyxJQUFJO0FBQzdELElBQU0sU0FBK0IsS0FBSyxPQUFPLEtBQUssSUFBSTtBQUMxRCxJQUFNLFVBQWlDLEtBQUssUUFBUSxLQUFLLElBQUk7QUFDN0QsSUFBTSxPQUEyQixLQUFLLEtBQUssS0FBSyxJQUFJOyIsCiAgImRlYnVnSWQiOiAiRTI0MkUzMTIwRTBFMzRDODY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
1399
+ //# debugId=913D511D8FAE8B1964756E2164756E21
1400
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3NoaW1zL2Rpc3Bvc2VyLnRzIiwgInNyYy9saWIvdXRpbHMudHMiLCAic3JjL2xpYi9tb2RpZmllcnMvcmV0cnkudHMiLCAic3JjL2xpYi9tb2RpZmllcnMvc2lnbmFsLnRzIiwgInNyYy9saWIvbW9kaWZpZXJzL3RpbWVvdXQudHMiLCAic3JjL2xpYi9leGVjdXRvcnMvYmFzZS50cyIsICJzcmMvbGliL2V4ZWN1dG9ycy9zaGFyZWQudHMiLCAic3JjL2xpYi9leGVjdXRvcnMvYWxsLnRzIiwgInNyYy9saWIvZXhlY3V0b3JzL2FsbC1zZXR0bGVkLnRzIiwgInNyYy9saWIvZXhlY3V0b3JzL2Zsb3cudHMiLCAic3JjL2xpYi9leGVjdXRvcnMvcnVuLnRzIiwgInNyYy9saWIvZXhlY3V0b3JzL3J1bi1zeW5jLnRzIiwgInNyYy9saWIvYnVpbGRlci50cyIsICJzcmMvbGliL2Rpc3Bvc2UudHMiLCAic3JjL2xpYi9nZW4udHMiLCAic3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImNvbnN0IFNVUFBSRVNTRURfRVJST1JfTUVTU0FHRSA9IFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsXCJcblxuY29uc3QgbmF0aXZlRGlzcG9zZSA9IFJlZmxlY3QuZ2V0KFN5bWJvbCwgXCJkaXNwb3NlXCIpXG5jb25zdCBuYXRpdmVBc3luY0Rpc3Bvc2UgPSBSZWZsZWN0LmdldChTeW1ib2wsIFwiYXN5bmNEaXNwb3NlXCIpXG5cbmV4cG9ydCBjb25zdCBESVNQT1NFOiBzeW1ib2wgPVxuICB0eXBlb2YgbmF0aXZlRGlzcG9zZSA9PT0gXCJzeW1ib2xcIiA/IG5hdGl2ZURpc3Bvc2UgOiBTeW1ib2wuZm9yKFwiU3ltYm9sLmRpc3Bvc2VcIilcbmV4cG9ydCBjb25zdCBBU1lOQ19ESVNQT1NFOiBzeW1ib2wgPVxuICB0eXBlb2YgbmF0aXZlQXN5bmNEaXNwb3NlID09PSBcInN5bWJvbFwiID8gbmF0aXZlQXN5bmNEaXNwb3NlIDogU3ltYm9sLmZvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2VcIilcblxudHlwZSBTeW5jRGlzcG9zZXIgPSAoKSA9PiB2b2lkXG50eXBlIEFzeW5jRGlzcG9zZXJGbiA9ICgpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPlxuXG5leHBvcnQgdHlwZSBEaXNwb3NhYmxlTGlrZSA9IHtcbiAgW0RJU1BPU0VdKCk6IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNEaXNwb3NhYmxlTGlrZSA9IHtcbiAgW0FTWU5DX0RJU1BPU0VdKCk6IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPlxufVxuXG5leHBvcnQgdHlwZSBNYXliZURpc3Bvc2FibGUgPSBBc3luY0Rpc3Bvc2FibGVMaWtlIHwgRGlzcG9zYWJsZUxpa2UgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNEaXNwb3NlciBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIGFkZChmbjogKCkgPT4gdm9pZCB8IFByb21pc2VMaWtlPHZvaWQ+KTogdm9pZFxuICBjbGVhbnVwKCk6IFByb21pc2U8dm9pZD5cbiAgZGVmZXIoZm46ICgpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPik6IHZvaWRcbiAgdXNlPFQgZXh0ZW5kcyBBc3luY0Rpc3Bvc2FibGUgfCBEaXNwb3NhYmxlIHwgbnVsbCB8IHVuZGVmaW5lZD4odmFsdWU6IFQpOiBUXG4gIGRpc3Bvc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVEaXNwb3NlQWxpYXMocHJvdG90eXBlOiB7IGRpc3Bvc2UoKTogdm9pZCB9KTogdm9pZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUsIERJU1BPU0UsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWUodGhpczogeyBkaXNwb3NlKCk6IHZvaWQgfSkge1xuICAgICAgdGhpcy5kaXNwb3NlKClcbiAgICB9LFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQXN5bmNEaXNwb3NlQWxpYXMocHJvdG90eXBlOiB7IGRpc3Bvc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IH0pOiB2b2lkIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgQVNZTkNfRElTUE9TRSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBhc3luYyB2YWx1ZSh0aGlzOiB7IGRpc3Bvc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IH0pIHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcG9zZUFzeW5jKClcbiAgICB9LFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICB9KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdXBwcmVzc2VkRXJyb3IoZXJyb3I6IHVua25vd24sIHN1cHByZXNzZWQ6IHVua25vd24pOiBFcnJvciB7XG4gIGlmICh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gbmV3IFN1cHByZXNzZWRFcnJvcihlcnJvciwgc3VwcHJlc3NlZCwgU1VQUFJFU1NFRF9FUlJPUl9NRVNTQUdFKVxuICB9XG5cbiAgY29uc3Qgd3JhcHBlZCA9IG5ldyBFcnJvcihTVVBQUkVTU0VEX0VSUk9SX01FU1NBR0UpIGFzIEVycm9yICYge1xuICAgIGVycm9yOiB1bmtub3duXG4gICAgc3VwcHJlc3NlZDogdW5rbm93blxuICB9XG5cbiAgd3JhcHBlZC5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIlxuICB3cmFwcGVkLmVycm9yID0gZXJyb3JcbiAgd3JhcHBlZC5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZFxuXG4gIHJldHVybiB3cmFwcGVkXG59XG5cbmZ1bmN0aW9uIGNoZWNrQ2FuUmVnaXN0ZXIoZGlzcG9zZWQ6IGJvb2xlYW4sIG5hbWU6IHN0cmluZykge1xuICBpZiAoZGlzcG9zZWQpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoYCR7bmFtZX0gYWxyZWFkeSBkaXNwb3NlZGApXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVN5bmNEaXNwb3Nlcih2YWx1ZTogRGlzcG9zYWJsZSB8IERpc3Bvc2FibGVMaWtlKTogU3luY0Rpc3Bvc2VyIHtcbiAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWUgYXMgRGlzcG9zYWJsZUxpa2VcbiAgY29uc3QgZGlzcG9zZXIgPSBjYW5kaWRhdGVbRElTUE9TRV1cblxuICBpZiAodHlwZW9mIGRpc3Bvc2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlXCIpXG4gIH1cblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRpc3Bvc2VyLmNhbGwodmFsdWUpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFzeW5jRGlzcG9zZXIoXG4gIHZhbHVlOiBBc3luY0Rpc3Bvc2FibGUgfCBEaXNwb3NhYmxlIHwgTWF5YmVEaXNwb3NhYmxlXG4pOiBBc3luY0Rpc3Bvc2VyRm4ge1xuICBjb25zdCBhc3luY0NhbmRpZGF0ZSA9IHZhbHVlIGFzIEFzeW5jRGlzcG9zYWJsZUxpa2VcbiAgY29uc3QgYXN5bmNEaXNwb3NlciA9IGFzeW5jQ2FuZGlkYXRlW0FTWU5DX0RJU1BPU0VdXG5cbiAgaWYgKHR5cGVvZiBhc3luY0Rpc3Bvc2VyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gYXN5bmNEaXNwb3Nlci5jYWxsKHZhbHVlKVxuICB9XG5cbiAgY29uc3Qgc3luY0NhbmRpZGF0ZSA9IHZhbHVlIGFzIERpc3Bvc2FibGVMaWtlXG4gIGNvbnN0IHN5bmNEaXNwb3NlciA9IHN5bmNDYW5kaWRhdGVbRElTUE9TRV1cblxuICBpZiAodHlwZW9mIHN5bmNEaXNwb3NlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHN5bmNEaXNwb3Nlci5jYWxsKHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGVcIilcbn1cblxuZXhwb3J0IGNsYXNzIEludGVybmFsRGlzcG9zYWJsZVN0YWNrIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gICNkaXNwb3NlZCA9IGZhbHNlXG4gICNzdGFjazogU3luY0Rpc3Bvc2VyW10gPSBbXVxuICBkZWNsYXJlIFtTeW1ib2wuZGlzcG9zZV06ICgpID0+IHZvaWRcblxuICBkZWZlcihmbjogU3luY0Rpc3Bvc2VyKTogdm9pZCB7XG4gICAgY2hlY2tDYW5SZWdpc3Rlcih0aGlzLiNkaXNwb3NlZCwgXCJEaXNwb3NhYmxlU3RhY2tcIilcbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7U3RyaW5nKGZuKX0gaXMgbm90IGEgZnVuY3Rpb25gKVxuICAgIH1cbiAgICB0aGlzLiNzdGFjay5wdXNoKGZuKVxuICB9XG5cbiAgdXNlPFQgZXh0ZW5kcyBEaXNwb3NhYmxlIHwgRGlzcG9zYWJsZUxpa2U+KHZhbHVlOiBUKTogVFxuICB1c2UodmFsdWU6IG51bGwpOiBudWxsXG4gIHVzZSh2YWx1ZTogdW5kZWZpbmVkKTogdW5kZWZpbmVkXG4gIHVzZSh2YWx1ZTogRGlzcG9zYWJsZSB8IERpc3Bvc2FibGVMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBjaGVja0NhblJlZ2lzdGVyKHRoaXMuI2Rpc3Bvc2VkLCBcIkRpc3Bvc2FibGVTdGFja1wiKVxuICAgIHRoaXMuI3N0YWNrLnB1c2gocmVzb2x2ZVN5bmNEaXNwb3Nlcih2YWx1ZSkpXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuI2Rpc3Bvc2VBbGwoKVxuICB9XG5cbiAgI2Rpc3Bvc2VBbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLiNkaXNwb3NlZCA9IHRydWVcblxuICAgIGxldCBlcnJvcjogdW5rbm93blxuXG4gICAgd2hpbGUgKHRoaXMuI3N0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRpc3Bvc2VyID0gdGhpcy4jc3RhY2sucG9wKClcblxuICAgICAgaWYgKCFkaXNwb3Nlcikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBkaXNwb3NlcigpXG4gICAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgICBlcnJvciA9IGVycm9yID09PSB1bmRlZmluZWQgPyBjYXVnaHRFcnJvciA6IGNyZWF0ZVN1cHByZXNzZWRFcnJvcihjYXVnaHRFcnJvciwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG59XG5kZWZpbmVEaXNwb3NlQWxpYXMoSW50ZXJuYWxEaXNwb3NhYmxlU3RhY2sucHJvdG90eXBlKVxuXG5jbGFzcyBBc3luY0Rpc3Bvc2VyU3RhY2sgaW1wbGVtZW50cyBBc3luY0Rpc3Bvc2VyIHtcbiAgI2Rpc3Bvc2VkID0gZmFsc2VcbiAgI3N0YWNrOiBBc3luY0Rpc3Bvc2VyRm5bXSA9IFtdXG4gIGRlY2xhcmUgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG5cbiAgYWRkKGZuOiBBc3luY0Rpc3Bvc2VyRm4pOiB2b2lkIHtcbiAgICB0aGlzLmRlZmVyKGZuKVxuICB9XG5cbiAgZGVmZXIoZm46IEFzeW5jRGlzcG9zZXJGbik6IHZvaWQge1xuICAgIGNoZWNrQ2FuUmVnaXN0ZXIodGhpcy4jZGlzcG9zZWQsIFwiQXN5bmNEaXNwb3NhYmxlU3RhY2tcIilcbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7U3RyaW5nKGZuKX0gaXMgbm90IGEgZnVuY3Rpb25gKVxuICAgIH1cbiAgICB0aGlzLiNzdGFjay5wdXNoKGZuKVxuICB9XG5cbiAgdXNlPFQgZXh0ZW5kcyBBc3luY0Rpc3Bvc2FibGUgfCBEaXNwb3NhYmxlPih2YWx1ZTogVCk6IFRcbiAgdXNlKHZhbHVlOiBudWxsKTogbnVsbFxuICB1c2UodmFsdWU6IHVuZGVmaW5lZCk6IHVuZGVmaW5lZFxuICB1c2UodmFsdWU6IEFzeW5jRGlzcG9zYWJsZSB8IERpc3Bvc2FibGUgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGNoZWNrQ2FuUmVnaXN0ZXIodGhpcy4jZGlzcG9zZWQsIFwiQXN5bmNEaXNwb3NhYmxlU3RhY2tcIilcbiAgICB0aGlzLiNzdGFjay5wdXNoKHJlc29sdmVBc3luY0Rpc3Bvc2VyKHZhbHVlKSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGFzeW5jIGRpc3Bvc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLiNkaXNwb3NlQWxsQXN5bmMoKVxuICB9XG5cbiAgYXN5bmMgY2xlYW51cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3Bvc2VBc3luYygpXG4gIH1cblxuICBhc3luYyAjZGlzcG9zZUFsbEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy4jZGlzcG9zZWQgPSB0cnVlXG5cbiAgICBsZXQgZXJyb3I6IHVua25vd25cblxuICAgIHdoaWxlICh0aGlzLiNzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkaXNwb3NlciA9IHRoaXMuI3N0YWNrLnBvcCgpXG5cbiAgICAgIGlmICghZGlzcG9zZXIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2xlYW51cCBtdXN0IHJlbWFpbiBzZXF1ZW50aWFsIHNvIExJRk8gdGVhcmRvd24gb3JkZXIgaXMgcHJlc2VydmVkLlxuICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICBhd2FpdCBkaXNwb3NlcigpXG4gICAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgICBlcnJvciA9IGVycm9yID09PSB1bmRlZmluZWQgPyBjYXVnaHRFcnJvciA6IGNyZWF0ZVN1cHByZXNzZWRFcnJvcihjYXVnaHRFcnJvciwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG59XG5kZWZpbmVBc3luY0Rpc3Bvc2VBbGlhcyhBc3luY0Rpc3Bvc2VyU3RhY2sucHJvdG90eXBlKVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXN5bmNEaXNwb3NlcigpOiBBc3luY0Rpc3Bvc2VyIHtcbiAgcmV0dXJuIG5ldyBBc3luY0Rpc3Bvc2VyU3RhY2soKVxufVxuIiwKICAgICJpbXBvcnQgeyBJbnRlcm5hbERpc3Bvc2FibGVTdGFjayB9IGZyb20gXCIuLi9zaGltcy9kaXNwb3NlclwiXG5pbXBvcnQgeyBQYW5pYywgdHlwZSBQYW5pY0NvZGUgfSBmcm9tIFwiLi9lcnJvcnNcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VW5yZWFjaGFibGUodmFsdWU6IG5ldmVyLCBjb2RlOiBQYW5pY0NvZGUpOiBuZXZlciB7XG4gIHRocm93IG5ldyBQYW5pYyhjb2RlLCB7IG1lc3NhZ2U6IGBVbnJlYWNoYWJsZSBjYXNlOiAke1N0cmluZyh2YWx1ZSl9YCB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbjogdW5rbm93biwgZXJyb3I6IEVycm9yKTogYXNzZXJ0cyBjb25kaXRpb24ge1xuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKG1zIDw9IDApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lzUHJvbWlzZUxpa2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcm9taXNlTGlrZTx1bmtub3duPiB7XG4gIHJldHVybiAoXG4gICAgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgeyB0aGVuPzogdW5rbm93biB9KS50aGVuID09PSBcImZ1bmN0aW9uXCJcbiAgKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdpdGhBYm9ydDxWLCBFPihcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgcHJvbWlzZTogUHJvbWlzZUxpa2U8Vj4sXG4gIGNyZWF0ZUFib3J0UmVzdWx0OiAoKSA9PiBFXG4pOiBQcm9taXNlPFYgfCBFPiB7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIC8vIFdlIHJldHVybiB0aGUgYWJvcnQgcmVzdWx0IGltbWVkaWF0ZWx5LCBzbyBhdHRhY2ggYSBuby1vcCBoYW5kbGVyIHRvXG4gICAgLy8gYXZvaWQgYW4gdW5oYW5kbGVkIHJlamVjdGlvbiBpZiB0aGUgb3JpZ2luYWwgcHJvbWlzZSByZWplY3RzIGxhdGVyLlxuICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKHByb21pc2UpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4gdm9pZCBlcnJvcilcbiAgICByZXR1cm4gY3JlYXRlQWJvcnRSZXN1bHQoKVxuICB9XG5cbiAgdXNpbmcgZGlzcG9zZXIgPSBuZXcgSW50ZXJuYWxEaXNwb3NhYmxlU3RhY2soKVxuXG4gIGNvbnN0IGFib3J0UHJvbWlzZSA9IG5ldyBQcm9taXNlPEU+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgIHJlc29sdmUoY3JlYXRlQWJvcnRSZXN1bHQoKSlcbiAgICB9XG5cbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIG9uQWJvcnQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSlcbiAgICBkaXNwb3Nlci5kZWZlcigoKSA9PiB7XG4gICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtQcm9taXNlLnJlc29sdmUocHJvbWlzZSksIGFib3J0UHJvbWlzZV0pXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi9idWlsZGVyXCJcbmltcG9ydCB0eXBlIHsgVHJ5Q3R4IH0gZnJvbSBcIi4uL2V4ZWN1dG9ycy9zaGFyZWRcIlxuaW1wb3J0IHsgUGFuaWMgfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7IGFzc2VydFVucmVhY2hhYmxlLCBpbnZhcmlhbnQgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG5pbnRlcmZhY2UgQmFzZVJldHJ5UG9saWN5IHtcbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGZpcnN0IHJ1bi5cbiAgICovXG4gIGxpbWl0OiBudW1iZXJcbiAgLyoqXG4gICAqIERlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGF0dGVtcHRzLiBEZWZhdWx0cyB0byAwLlxuICAgKi9cbiAgZGVsYXlNcz86IG51bWJlclxuICAvKipcbiAgICogQWRkcyByYW5kb20gaml0dGVyIHRvIGRlbGF5cyB3aGVuIGVuYWJsZWQuXG4gICAqL1xuICBqaXR0ZXI/OiBib29sZWFuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSB0byByZXRyeSBhZnRlciBhbiBlcnJvciwgZmFsc2UgdG8gc3RvcC5cbiAgICovXG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duLCBjdHg6IFRyeUN0eCkgPT4gYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgTGluZWFyQmFja29mZlJldHJ5UG9saWN5IGV4dGVuZHMgQmFzZVJldHJ5UG9saWN5IHtcbiAgLyoqXG4gICAqIFVzZSBsaW5lYXJseSBpbmNyZWFzaW5nIGRlbGF5IGJldHdlZW4gYXR0ZW1wdHMuXG4gICAqL1xuICBiYWNrb2ZmOiBcImxpbmVhclwiXG4gIC8qKlxuICAgKiBOb3Qgc3VwcG9ydGVkIGZvciBsaW5lYXIgYmFja29mZi5cbiAgICovXG4gIG1heERlbGF5TXM/OiBuZXZlclxufVxuXG5pbnRlcmZhY2UgRXhwb25lbnRpYWxCYWNrb2ZmUmV0cnlQb2xpY3kgZXh0ZW5kcyBCYXNlUmV0cnlQb2xpY3kge1xuICAvKipcbiAgICogVXNlIGV4cG9uZW50aWFsIGRlbGF5IGdyb3d0aCBiZXR3ZWVuIGF0dGVtcHRzLlxuICAgKi9cbiAgYmFja29mZjogXCJleHBvbmVudGlhbFwiXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjYXAgZm9yIGV4cG9uZW50aWFsIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIG1heERlbGF5TXM/OiBudW1iZXJcbn1cblxuLyoqXG4gKiBSZXRyeSBwb2xpY3kgdXNpbmcgYSBjb25zdGFudCBkZWxheSBzdHJhdGVneS5cbiAqL1xuaW50ZXJmYWNlIENvbnN0YW50QmFja29mZlJldHJ5UG9saWN5IGV4dGVuZHMgQmFzZVJldHJ5UG9saWN5IHtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGRpc2NyaW1pbmFudDogdXNlIGEgZml4ZWQgZGVsYXkgYmV0d2VlbiBhdHRlbXB0cy5cbiAgICovXG4gIGJhY2tvZmY6IFwiY29uc3RhbnRcIlxuICAvKipcbiAgICogTm90IHN1cHBvcnRlZCBmb3IgY29uc3RhbnQgYmFja29mZi5cbiAgICovXG4gIG1heERlbGF5TXM/OiBuZXZlclxufVxuXG4vKipcbiAqIFJldHJ5IGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICovXG5leHBvcnQgdHlwZSBSZXRyeVBvbGljeSA9XG4gIHwgTGluZWFyQmFja29mZlJldHJ5UG9saWN5XG4gIHwgRXhwb25lbnRpYWxCYWNrb2ZmUmV0cnlQb2xpY3lcbiAgfCBDb25zdGFudEJhY2tvZmZSZXRyeVBvbGljeVxuXG4vKipcbiAqIFJldHJ5IHNob3J0aGFuZCBvciBmdWxsIHJldHJ5IGNvbmZpZ3VyYXRpb24uXG4gKlxuICogLSBgbnVtYmVyYDogYXR0ZW1wdCBsaW1pdFxuICogLSBgUmV0cnlQb2xpY3lgOiBkZXRhaWxlZCByZXRyeSBzZXR0aW5nc1xuICovXG5leHBvcnQgdHlwZSBSZXRyeU9wdGlvbnMgPSBudW1iZXIgfCBSZXRyeVBvbGljeVxuXG5leHBvcnQgZnVuY3Rpb24gcmV0cnlPcHRpb25zKHBvbGljeTogUmV0cnlPcHRpb25zKTogUmV0cnlQb2xpY3kge1xuICBjb25zdCBsaW1pdCA9IHR5cGVvZiBwb2xpY3kgPT09IFwibnVtYmVyXCIgPyBwb2xpY3kgOiBwb2xpY3kubGltaXRcblxuICBpbnZhcmlhbnQoTnVtYmVyLmlzRmluaXRlKGxpbWl0KSwgbmV3IFBhbmljKFwiUkVUUllfSU5WQUxJRF9MSU1JVFwiKSlcbiAgaW52YXJpYW50KGxpbWl0ID49IDAsIG5ldyBQYW5pYyhcIlJFVFJZX0lOVkFMSURfTElNSVRcIikpXG5cbiAgaWYgKHR5cGVvZiBwb2xpY3kgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmFja29mZjogXCJjb25zdGFudFwiLFxuICAgICAgZGVsYXlNczogMCxcbiAgICAgIGxpbWl0OiBwb2xpY3ksXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYmFzZSA9IHtcbiAgICBkZWxheU1zOiBwb2xpY3kuZGVsYXlNcyA/PyAwLFxuICAgIGppdHRlcjogcG9saWN5LmppdHRlcixcbiAgICBsaW1pdDogcG9saWN5LmxpbWl0LFxuICAgIHNob3VsZFJldHJ5OiBwb2xpY3kuc2hvdWxkUmV0cnksXG4gIH1cblxuICBzd2l0Y2ggKHBvbGljeS5iYWNrb2ZmKSB7XG4gICAgY2FzZSBcImNvbnN0YW50XCI6XG4gICAgY2FzZSBcImxpbmVhclwiOlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgYmFja29mZjogcG9saWN5LmJhY2tvZmYgfVxuICAgIGNhc2UgXCJleHBvbmVudGlhbFwiOlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgYmFja29mZjogcG9saWN5LmJhY2tvZmYsIG1heERlbGF5TXM6IHBvbGljeS5tYXhEZWxheU1zIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGFzc2VydFVucmVhY2hhYmxlKHBvbGljeSwgXCJVTlJFQUNIQUJMRV9SRVRSWV9QT0xJQ1lfQkFDS09GRlwiKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVSZXRyeURlbGF5KGF0dGVtcHQ6IG51bWJlciwgY29uZmlnOiBCdWlsZGVyQ29uZmlnKTogbnVtYmVyIHtcbiAgY29uc3QgcG9saWN5ID0gY29uZmlnLnJldHJ5XG5cbiAgaWYgKCFwb2xpY3kpIHtcbiAgICByZXR1cm4gMFxuICB9XG5cbiAgY29uc3QgYmFzZURlbGF5ID0gcG9saWN5LmRlbGF5TXMgPz8gMFxuICBsZXQgZGVsYXkgPSAwXG5cbiAgc3dpdGNoIChwb2xpY3kuYmFja29mZikge1xuICAgIGNhc2UgXCJjb25zdGFudFwiOlxuICAgICAgZGVsYXkgPSBiYXNlRGVsYXlcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBcImxpbmVhclwiOlxuICAgICAgZGVsYXkgPSBiYXNlRGVsYXkgKiBhdHRlbXB0XG4gICAgICBicmVha1xuICAgIGNhc2UgXCJleHBvbmVudGlhbFwiOlxuICAgICAgZGVsYXkgPSBiYXNlRGVsYXkgKiAyICoqIChhdHRlbXB0IC0gMSlcblxuICAgICAgaWYgKHBvbGljeS5tYXhEZWxheU1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsYXkgPSBNYXRoLm1pbihkZWxheSwgcG9saWN5Lm1heERlbGF5TXMpXG4gICAgICB9XG5cbiAgICAgIGJyZWFrXG4gIH1cblxuICBpZiAoIXBvbGljeS5qaXR0ZXIgfHwgZGVsYXkgPD0gMCkge1xuICAgIHJldHVybiBkZWxheVxuICB9XG5cbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGRlbGF5KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTaG91bGRBdHRlbXB0UmV0cnkoXG4gIGVycm9yOiB1bmtub3duLFxuICBjdHg6IFRyeUN0eCxcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcG9saWN5ID0gY29uZmlnLnJldHJ5XG5cbiAgaWYgKCFwb2xpY3kpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChjdHgucmV0cnkuYXR0ZW1wdCA+PSBwb2xpY3kubGltaXQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICghcG9saWN5LnNob3VsZFJldHJ5KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHJldHVybiBwb2xpY3kuc2hvdWxkUmV0cnkoZXJyb3IsIGN0eClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNSZXRyeUV4aGF1c3RlZChhdHRlbXB0OiBudW1iZXIsIGNvbmZpZzogQnVpbGRlckNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLnJldHJ5ICE9PSB1bmRlZmluZWQgJiYgYXR0ZW1wdCA+PSBjb25maWcucmV0cnkubGltaXRcbn1cbiIsCiAgICAiaW1wb3J0IHsgZGVmaW5lRGlzcG9zZUFsaWFzIH0gZnJvbSBcIi4uLy4uL3NoaW1zL2Rpc3Bvc2VyXCJcbmltcG9ydCB7IENhbmNlbGxhdGlvbkVycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7IHJlc29sdmVXaXRoQWJvcnQgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG5leHBvcnQgY2xhc3MgU2lnbmFsQ29udHJvbGxlciB7XG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsXG4gIGRlY2xhcmUgW1N5bWJvbC5kaXNwb3NlXTogKCkgPT4gdm9pZFxuXG4gIGNvbnN0cnVjdG9yKHNpZ25hbHM6IHJlYWRvbmx5IEFib3J0U2lnbmFsW10gPSBbXSkge1xuICAgIGlmIChzaWduYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2lnbmFsID0gQWJvcnRTaWduYWwuYW55KFsuLi5zaWduYWxzXSlcbiAgICB9XG4gIH1cblxuICBjaGVja0RpZENhbmNlbChjYXVzZT86IHVua25vd24pOiBDYW5jZWxsYXRpb25FcnJvciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDYW5jZWxsYXRpb25FcnJvcih1bmRlZmluZWQsIHsgY2F1c2U6IGNhdXNlID8/IHRoaXMuc2lnbmFsLnJlYXNvbiB9KVxuICB9XG5cbiAgcmFjZTxWPihwcm9taXNlOiBQcm9taXNlTGlrZTxWPiwgY2F1c2U/OiB1bmtub3duKTogUHJvbWlzZUxpa2U8ViB8IENhbmNlbGxhdGlvbkVycm9yPiB7XG4gICAgY29uc3QgY2FuY2VsbGVkID0gdGhpcy5jaGVja0RpZENhbmNlbChjYXVzZSlcblxuICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FuY2VsbGVkKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zaWduYWwpIHtcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVXaXRoQWJvcnQoXG4gICAgICB0aGlzLnNpZ25hbCxcbiAgICAgIHByb21pc2UsXG4gICAgICAoKSA9PiBuZXcgQ2FuY2VsbGF0aW9uRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBjYXVzZSA/PyB0aGlzLnNpZ25hbD8ucmVhc29uIH0pXG4gICAgKVxuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuc2lnbmFsXG4gIH1cbn1cbmRlZmluZURpc3Bvc2VBbGlhcyhTaWduYWxDb250cm9sbGVyLnByb3RvdHlwZSlcbiIsCiAgICAiaW1wb3J0IHsgZGVmaW5lRGlzcG9zZUFsaWFzIH0gZnJvbSBcIi4uLy4uL3NoaW1zL2Rpc3Bvc2VyXCJcbmltcG9ydCB7IFBhbmljLCBUaW1lb3V0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7IGludmFyaWFudCwgcmVzb2x2ZVdpdGhBYm9ydCB9IGZyb20gXCIuLi91dGlsc1wiXG5cbmV4cG9ydCBjbGFzcyBUaW1lb3V0Q29udHJvbGxlciB7XG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsXG4gIHJlYWRvbmx5ICNjb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyXG4gIHJlYWRvbmx5ICNzdGFydGVkQXQgPSBEYXRlLm5vdygpXG4gIHJlYWRvbmx5ICN0aW1lb3V0TXM6IG51bWJlclxuICAjdGltZW91dElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZFxuICBkZWNsYXJlIFtTeW1ib2wuZGlzcG9zZV06ICgpID0+IHZvaWRcblxuICBjb25zdHJ1Y3Rvcih0aW1lb3V0TXM/OiBudW1iZXIpIHtcbiAgICB0aGlzLiN0aW1lb3V0TXMgPSB0aW1lb3V0TXMgPz8gLTFcblxuICAgIGlmICh0aW1lb3V0TXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaW52YXJpYW50KE51bWJlci5pc0Zpbml0ZSh0aW1lb3V0TXMpLCBuZXcgUGFuaWMoXCJUSU1FT1VUX0lOVkFMSURfTVNcIikpXG4gICAgaW52YXJpYW50KHRpbWVvdXRNcyA+PSAwLCBuZXcgUGFuaWMoXCJUSU1FT1VUX0lOVkFMSURfTVNcIikpXG5cbiAgICB0aGlzLiNjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgdGhpcy5zaWduYWwgPSB0aGlzLiNjb250cm9sbGVyLnNpZ25hbFxuXG4gICAgaWYgKHRoaXMuI3RpbWVvdXRNcyA8PSAwKSB7XG4gICAgICB0aGlzLiNhYm9ydCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLiN0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuI2Fib3J0KClcbiAgICB9LCB0aGlzLiN0aW1lb3V0TXMpXG4gIH1cblxuICAjYWJvcnQoY2F1c2U/OiB1bmtub3duKSB7XG4gICAgY29uc3QgdGltZW91dEVycm9yID0gbmV3IFRpbWVvdXRFcnJvcihgRXhlY3V0aW9uIGV4Y2VlZGVkIHRpbWVvdXQgb2YgJHt0aGlzLiN0aW1lb3V0TXN9bXNgLCB7XG4gICAgICBjYXVzZSxcbiAgICB9KVxuXG4gICAgaWYgKCF0aGlzLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgdGhpcy4jY29udHJvbGxlcj8uYWJvcnQodGltZW91dEVycm9yKVxuICAgIH1cblxuICAgIHJldHVybiB0aW1lb3V0RXJyb3JcbiAgfVxuXG4gIGdldCAjcmVtYWluaW5nKCkge1xuICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gdGhpcy4jc3RhcnRlZEF0XG5cbiAgICByZXR1cm4gdGhpcy4jdGltZW91dE1zIC0gZWxhcHNlZFxuICB9XG5cbiAgY2hlY2tEaWRUaW1lb3V0KGNhdXNlPzogdW5rbm93bik6IFRpbWVvdXRFcnJvciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnNpZ25hbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuc2lnbmFsLnJlYXNvblxuXG4gICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgVGltZW91dEVycm9yKSB7XG4gICAgICAgIHJldHVybiByZWFzb25cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBUaW1lb3V0RXJyb3IoYEV4ZWN1dGlvbiBleGNlZWRlZCB0aW1lb3V0IG9mICR7dGhpcy4jdGltZW91dE1zfW1zYCwge1xuICAgICAgICBjYXVzZTogY2F1c2UgPz8gcmVhc29uLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy4jcmVtYWluaW5nID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2Fib3J0KGNhdXNlKVxuICB9XG5cbiAgcmFjZTxWPihwcm9taXNlOiBQcm9taXNlTGlrZTxWPiwgY2F1c2U/OiB1bmtub3duKTogUHJvbWlzZUxpa2U8ViB8IFRpbWVvdXRFcnJvcj4ge1xuICAgIGlmICghdGhpcy5zaWduYWwpIHtcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuI3JlbWFpbmluZyA8PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuI2Fib3J0KGNhdXNlKSlcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lZE91dCA9IHRoaXMuY2hlY2tEaWRUaW1lb3V0KGNhdXNlKVxuXG4gICAgaWYgKHRpbWVkT3V0KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbWVkT3V0KVxuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlV2l0aEFib3J0KFxuICAgICAgdGhpcy5zaWduYWwsXG4gICAgICBwcm9taXNlLFxuICAgICAgKCkgPT5cbiAgICAgICAgdGhpcy5jaGVja0RpZFRpbWVvdXQoY2F1c2UpID8/XG4gICAgICAgIG5ldyBUaW1lb3V0RXJyb3IoYEV4ZWN1dGlvbiBleGNlZWRlZCB0aW1lb3V0IG9mICR7dGhpcy4jdGltZW91dE1zfW1zYCwgeyBjYXVzZSB9KVxuICAgIClcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI3RpbWVvdXRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jdGltZW91dElkKVxuICAgIH1cbiAgfVxufVxuZGVmaW5lRGlzcG9zZUFsaWFzKFRpbWVvdXRDb250cm9sbGVyLnByb3RvdHlwZSlcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBCdWlsZGVyQ29uZmlnLCBXcmFwQ3R4IH0gZnJvbSBcIi4uL2J1aWxkZXJcIlxuaW1wb3J0IHR5cGUgeyBSZXRyeUV4aGF1c3RlZEVycm9yLCBVbmhhbmRsZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB0eXBlIHsgVHJ5Q3R4IH0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7IGRlZmluZURpc3Bvc2VBbGlhcywgSW50ZXJuYWxEaXNwb3NhYmxlU3RhY2sgfSBmcm9tIFwiLi4vLi4vc2hpbXMvZGlzcG9zZXJcIlxuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uRXJyb3IsIFRpbWVvdXRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHtcbiAgY2FsY3VsYXRlUmV0cnlEZWxheSxcbiAgY2hlY2tJc1JldHJ5RXhoYXVzdGVkLFxuICBjaGVja1Nob3VsZEF0dGVtcHRSZXRyeSxcbn0gZnJvbSBcIi4uL21vZGlmaWVycy9yZXRyeVwiXG5pbXBvcnQgeyBTaWduYWxDb250cm9sbGVyIH0gZnJvbSBcIi4uL21vZGlmaWVycy9zaWduYWxcIlxuaW1wb3J0IHsgVGltZW91dENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vbW9kaWZpZXJzL3RpbWVvdXRcIlxuaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwiLi4vdXRpbHNcIlxuXG5pbnRlcmZhY2UgQmFzZUV4ZWN1dGlvbk9wdGlvbnMge1xuICByZXRyeUxpbWl0PzogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIFJldHJ5RGVjaXNpb24gPSB7XG4gIGRlbGF5OiBudW1iZXJcbiAgaXNSZXRyeUV4aGF1c3RlZDogYm9vbGVhblxuICBzaG91bGRBdHRlbXB0UmV0cnk6IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgUnVubmVyRXJyb3IgPVxuICB8IENhbmNlbGxhdGlvbkVycm9yXG4gIHwgUmV0cnlFeGhhdXN0ZWRFcnJvclxuICB8IFRpbWVvdXRFcnJvclxuICB8IFVuaGFuZGxlZEV4Y2VwdGlvblxuXG5leHBvcnQgY2xhc3MgUmV0cnlEaXJlY3RpdmUge1xuICByZWFkb25seSBkZWNpc2lvbjogUmV0cnlEZWNpc2lvblxuXG4gIGNvbnN0cnVjdG9yKGRlY2lzaW9uOiBSZXRyeURlY2lzaW9uKSB7XG4gICAgdGhpcy5kZWNpc2lvbiA9IGRlY2lzaW9uXG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFeGVjdXRpb248VFJlc3VsdCA9IHVua25vd24+IGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb25maWc6IEJ1aWxkZXJDb25maWdcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGN0eDogVHJ5Q3R4XG4gIHByb3RlY3RlZCByZWFkb25seSBleGVjdXRpb25TaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkXG4gICN3cmFwQ3R4Q2FjaGU6IFdyYXBDdHggfCB1bmRlZmluZWRcbiAgcmVhZG9ubHkgI3NpZ25hbENvbnRyb2xsZXI6IFNpZ25hbENvbnRyb2xsZXIgfCB1bmRlZmluZWRcbiAgcmVhZG9ubHkgI3RpbWVvdXRDb250cm9sbGVyOiBUaW1lb3V0Q29udHJvbGxlciB8IHVuZGVmaW5lZFxuICBkZWNsYXJlIFtTeW1ib2wuZGlzcG9zZV06ICgpID0+IHZvaWRcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnLCBvcHRpb25zOiBCYXNlRXhlY3V0aW9uT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWdcbiAgICB0aGlzLiN0aW1lb3V0Q29udHJvbGxlciA9IEJhc2VFeGVjdXRpb24uY3JlYXRlVGltZW91dENvbnRyb2xsZXIoY29uZmlnLnRpbWVvdXQpXG4gICAgdGhpcy4jc2lnbmFsQ29udHJvbGxlciA9IEJhc2VFeGVjdXRpb24uY3JlYXRlU2lnbmFsQ29udHJvbGxlcihcbiAgICAgIGNvbmZpZy5zaWduYWxzLFxuICAgICAgdGhpcy4jdGltZW91dENvbnRyb2xsZXI/LnNpZ25hbFxuICAgIClcbiAgICB0aGlzLmV4ZWN1dGlvblNpZ25hbCA9IHRoaXMuI3NpZ25hbENvbnRyb2xsZXI/LnNpZ25hbFxuICAgIHRoaXMuY3R4ID0gQmFzZUV4ZWN1dGlvbi5jcmVhdGVDb250ZXh0KGNvbmZpZywgdGhpcy5leGVjdXRpb25TaWduYWwsIG9wdGlvbnMucmV0cnlMaW1pdClcbiAgfVxuXG4gIGV4ZWN1dGUoKTogVFJlc3VsdCB7XG4gICAgLy8gV3JhcHMgY292ZXIgdGhlIGZ1bGwgcmV0cnkgc2NvcGU7IGBjdHgucmV0cnkuYXR0ZW1wdGAgbWF5IHJlZmxlY3QgdGhlIGZpbmFsXG4gICAgLy8gYXR0ZW1wdCB3aGVuIG9ic2VydmVkIGFmdGVyIGBuZXh0KClgIHJlc29sdmVzLlxuICAgIGNvbnN0IHdyYXBzID0gdGhpcy5jb25maWcud3JhcHNcblxuICAgIGlmICghd3JhcHMgfHwgd3JhcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQ29yZSgpXG4gICAgfVxuXG4gICAgbGV0IG5leHQgPSAoKTogdW5rbm93biA9PiB0aGlzLmV4ZWN1dGVDb3JlKClcblxuICAgIGZvciAoY29uc3Qgd3JhcCBvZiB3cmFwcy50b1JldmVyc2VkKCkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gbmV4dFxuICAgICAgbmV4dCA9ICgpID0+IHdyYXAodGhpcy4jd3JhcEN0eCwgcHJldmlvdXMpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoKSBhcyBUUmVzdWx0XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZXhlY3V0ZUNvcmUoKTogVFJlc3VsdFxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLiN0aW1lb3V0Q29udHJvbGxlciAmJiAhdGhpcy4jc2lnbmFsQ29udHJvbGxlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGlzcG9zZXIgPSBuZXcgSW50ZXJuYWxEaXNwb3NhYmxlU3RhY2soKVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLiN0aW1lb3V0Q29udHJvbGxlcikge1xuICAgICAgICBkaXNwb3Nlci51c2UodGhpcy4jdGltZW91dENvbnRyb2xsZXIpXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLiNzaWduYWxDb250cm9sbGVyKSB7XG4gICAgICAgIGRpc3Bvc2VyLnVzZSh0aGlzLiNzaWduYWxDb250cm9sbGVyKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNwb3Nlci5kaXNwb3NlKClcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNyZWF0ZUNvbnRleHQoXG4gICAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gICAgcmV0cnlMaW1pdD86IG51bWJlclxuICApOiBUcnlDdHgge1xuICAgIHJldHVybiB7XG4gICAgICByZXRyeToge1xuICAgICAgICBhdHRlbXB0OiAxLFxuICAgICAgICBsaW1pdDogcmV0cnlMaW1pdCA/PyBjb25maWcucmV0cnk/LmxpbWl0ID8/IDEsXG4gICAgICB9LFxuICAgICAgc2lnbmFsLFxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgY3JlYXRlVGltZW91dENvbnRyb2xsZXIoXG4gICAgdGltZW91dE1zOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgKTogVGltZW91dENvbnRyb2xsZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aW1lb3V0TXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG5ldyBUaW1lb3V0Q29udHJvbGxlcih0aW1lb3V0TXMpXG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGNyZWF0ZVNpZ25hbENvbnRyb2xsZXIoXG4gICAgc2lnbmFsczogcmVhZG9ubHkgQWJvcnRTaWduYWxbXSB8IHVuZGVmaW5lZCxcbiAgICB0aW1lb3V0U2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZFxuICApOiBTaWduYWxDb250cm9sbGVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb21wb3NlZFNpZ25hbHMgPSBbLi4uKHNpZ25hbHMgPz8gW10pLCB0aW1lb3V0U2lnbmFsXS5maWx0ZXIoXG4gICAgICAodmFsdWUpOiB2YWx1ZSBpcyBBYm9ydFNpZ25hbCA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgKVxuXG4gICAgcmV0dXJuIGNvbXBvc2VkU2lnbmFscy5sZW5ndGggPiAwID8gbmV3IFNpZ25hbENvbnRyb2xsZXIoY29tcG9zZWRTaWduYWxzKSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBjcmVhdGVXcmFwQ29udGV4dChjdHg6IFRyeUN0eCk6IFdyYXBDdHgge1xuICAgIGNvbnN0IHJldHJ5ID0gbmV3IFByb3h5KGN0eC5yZXRyeSwge1xuICAgICAgZGVmaW5lUHJvcGVydHk6ICgpID0+IGZhbHNlLFxuICAgICAgZGVsZXRlUHJvcGVydHk6ICgpID0+IGZhbHNlLFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHkpXG5cbiAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVzY3JpcHRvcixcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6ICgpID0+IGZhbHNlLFxuICAgIH0pIGFzIFdyYXBDdHhbXCJyZXRyeVwiXVxuXG4gICAgcmV0dXJuIG5ldyBQcm94eShjdHgsIHtcbiAgICAgIGRlZmluZVByb3BlcnR5OiAoKSA9PiBmYWxzZSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiAoKSA9PiBmYWxzZSxcbiAgICAgIGdldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICAgICAgICBpZiAocHJvcGVydHkgPT09IFwicmV0cnlcIikge1xuICAgICAgICAgIHJldHVybiByZXRyeVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSBhcyB1bmtub3duXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHkpXG5cbiAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJyZXRyeVwiKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmRlc2NyaXB0b3IsXG4gICAgICAgICAgICB2YWx1ZTogcmV0cnksXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5kZXNjcmlwdG9yLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogKCkgPT4gZmFsc2UsXG4gICAgfSkgYXMgV3JhcEN0eFxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrRGlkQ2FuY2VsKGNhdXNlPzogdW5rbm93bik6IENhbmNlbGxhdGlvbkVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jc2lnbmFsQ29udHJvbGxlcj8uY2hlY2tEaWRDYW5jZWwoY2F1c2UpXG4gIH1cblxuICBwcm90ZWN0ZWQgcmFjZVdpdGhDYW5jZWxsYXRpb248Vj4oXG4gICAgcHJvbWlzZTogUHJvbWlzZUxpa2U8Vj4sXG4gICAgY2F1c2U/OiB1bmtub3duXG4gICk6IFByb21pc2VMaWtlPFYgfCBDYW5jZWxsYXRpb25FcnJvcj4ge1xuICAgIHJldHVybiB0aGlzLiNzaWduYWxDb250cm9sbGVyID8gdGhpcy4jc2lnbmFsQ29udHJvbGxlci5yYWNlKHByb21pc2UsIGNhdXNlKSA6IHByb21pc2VcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0RpZENvbnRyb2xGYWlsKGNhdXNlPzogdW5rbm93bik6IENhbmNlbGxhdGlvbkVycm9yIHwgVGltZW91dEVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0RpZENhbmNlbChjYXVzZSkgPz8gdGhpcy4jdGltZW91dENvbnRyb2xsZXI/LmNoZWNrRGlkVGltZW91dChjYXVzZSlcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlU3luY1N1Y2Nlc3M8VD4odmFsdWU6IFQpOiBUIHwgQ2FuY2VsbGF0aW9uRXJyb3IgfCBUaW1lb3V0RXJyb3Ige1xuICAgIHJldHVybiB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoKSA/PyB2YWx1ZVxuICB9XG5cbiAgcHJvdGVjdGVkIHJhY2U8Vj4oXG4gICAgcHJvbWlzZTogUHJvbWlzZUxpa2U8Vj4sXG4gICAgY2F1c2U/OiB1bmtub3duXG4gICk6IFByb21pc2VMaWtlPFYgfCBDYW5jZWxsYXRpb25FcnJvciB8IFRpbWVvdXRFcnJvcj4ge1xuICAgIGNvbnN0IHRpbWVvdXRDb250cm9sbGVyID0gdGhpcy4jdGltZW91dENvbnRyb2xsZXJcblxuICAgIGlmICghdGltZW91dENvbnRyb2xsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJhY2VXaXRoQ2FuY2VsbGF0aW9uKHByb21pc2UsIGNhdXNlKVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICB0aW1lb3V0Q29udHJvbGxlci5yYWNlKHRoaXMucmFjZVdpdGhDYW5jZWxsYXRpb24ocHJvbWlzZSwgY2F1c2UpLCBjYXVzZSlcbiAgICApLnRoZW4oKHJhY2VkKSA9PiB7XG4gICAgICBpZiAocmFjZWQgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tEaWRDYW5jZWwoY2F1c2UpID8/IHJhY2VkXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByYWNlZFxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgd2FpdEZvclJldHJ5RGVsYXkoXG4gICAgZGVsYXk6IG51bWJlclxuICApOiBQcm9taXNlPENhbmNlbGxhdGlvbkVycm9yIHwgVGltZW91dEVycm9yIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKGRlbGF5IDw9IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBzbGVlcFJlc3VsdCA9IGF3YWl0IHRoaXMucmFjZShzbGVlcChkZWxheSkpXG5cbiAgICBpZiAoc2xlZXBSZXN1bHQgaW5zdGFuY2VvZiBDYW5jZWxsYXRpb25FcnJvciB8fCBzbGVlcFJlc3VsdCBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikge1xuICAgICAgcmV0dXJuIHNsZWVwUmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcHJvdGVjdGVkIHNob3VsZEF0dGVtcHRSZXRyeShlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja1Nob3VsZEF0dGVtcHRSZXRyeShlcnJvciwgdGhpcy5jdHgsIHRoaXMuY29uZmlnKVxuICB9XG5cbiAgcHJvdGVjdGVkIHJldHJ5RGVsYXlGb3JDdXJyZW50QXR0ZW1wdCgpOiBudW1iZXIge1xuICAgIHJldHVybiBjYWxjdWxhdGVSZXRyeURlbGF5KHRoaXMuY3R4LnJldHJ5LmF0dGVtcHQsIHRoaXMuY29uZmlnKVxuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrSXNSZXRyeUV4aGF1c3RlZEN1cnJlbnRBdHRlbXB0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja0lzUmV0cnlFeGhhdXN0ZWQodGhpcy5jdHgucmV0cnkuYXR0ZW1wdCwgdGhpcy5jb25maWcpXG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSZXRyeURlY2lzaW9uKGVycm9yOiB1bmtub3duKTogUmV0cnlEZWNpc2lvbiB7XG4gICAgY29uc3Qgc2hvdWxkQXR0ZW1wdFJldHJ5ID0gdGhpcy5zaG91bGRBdHRlbXB0UmV0cnkoZXJyb3IpXG5cbiAgICByZXR1cm4ge1xuICAgICAgZGVsYXk6IHNob3VsZEF0dGVtcHRSZXRyeSA/IHRoaXMucmV0cnlEZWxheUZvckN1cnJlbnRBdHRlbXB0KCkgOiAwLFxuICAgICAgaXNSZXRyeUV4aGF1c3RlZDogdGhpcy5jaGVja0lzUmV0cnlFeGhhdXN0ZWRDdXJyZW50QXR0ZW1wdCgpLFxuICAgICAgc2hvdWxkQXR0ZW1wdFJldHJ5LFxuICAgIH1cbiAgfVxuXG4gIGdldCAjd3JhcEN0eCgpOiBXcmFwQ3R4IHtcbiAgICB0aGlzLiN3cmFwQ3R4Q2FjaGUgPz89IEJhc2VFeGVjdXRpb24uY3JlYXRlV3JhcENvbnRleHQodGhpcy5jdHgpXG4gICAgcmV0dXJuIHRoaXMuI3dyYXBDdHhDYWNoZVxuICB9XG59XG5kZWZpbmVEaXNwb3NlQWxpYXMoQmFzZUV4ZWN1dGlvbi5wcm90b3R5cGUpXG4iLAogICAgImltcG9ydCB0eXBlIHsgQXN5bmNEaXNwb3NlciB9IGZyb20gXCIuLi8uLi9zaGltcy9kaXNwb3NlclwiXG5pbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgeyBjcmVhdGVBc3luY0Rpc3Bvc2VyLCBkZWZpbmVBc3luY0Rpc3Bvc2VBbGlhcyB9IGZyb20gXCIuLi8uLi9zaGltcy9kaXNwb3NlclwiXG5pbXBvcnQgeyBQYW5pYywgVW5oYW5kbGVkRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgQmFzZUV4ZWN1dGlvbiB9IGZyb20gXCIuL2Jhc2VcIlxuXG50eXBlIFJlc29sdmVyUGFpciA9IFsodmFsdWU6IHVua25vd24pID0+IHZvaWQsIChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkXVxuXG50eXBlIFRhc2tFeGVjdXRpb25Nb2RlID0gXCJmYWlsLWZhc3RcIiB8IFwic2V0dGxlZFwiXG5cbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHBsaWNpdC1hbnkgLS0gUmVxdWlyZWQgZm9yIHRhc2stbWFwIGluZmVyZW5jZVxuZXhwb3J0IHR5cGUgVGFza1JlY29yZCA9IFJlY29yZDxzdHJpbmcsIGFueT5cblxuZXhwb3J0IHR5cGUgVGFza1ZhbGlkYXRpb248VCBleHRlbmRzIFRhc2tSZWNvcmQ+ID0ge1xuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXhwbGljaXQtYW55IC0tIFJlcXVpcmVkIGZvciBmdW5jdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggY29udGV4dHVhbCBgdGhpc2BcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IFRbS10gOiBuZXZlclxufVxuXG4vLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXhwbGljaXQtYW55IC0tIFJlcXVpcmVkIGZvciBmdW5jdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggY29udGV4dHVhbCBgdGhpc2BcbmV4cG9ydCB0eXBlIFRhc2tSZXN1bHQ8VD4gPSBUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBpbmZlciBSID8gQXdhaXRlZDxSPiA6IG5ldmVyXG5cbmV4cG9ydCB0eXBlIFJlc3VsdFByb3h5PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiA9IHtcbiAgcmVhZG9ubHkgW0sgaW4ga2V5b2YgVF06IFByb21pc2U8VGFza1Jlc3VsdDxUW0tdPj5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXNrQ29udGV4dDxUIGV4dGVuZHMgVGFza1JlY29yZD4ge1xuICAkcmVzdWx0OiBSZXN1bHRQcm94eTxUPlxuICAkc2lnbmFsOiBBYm9ydFNpZ25hbFxuICAkZGlzcG9zZXI6IEFzeW5jRGlzcG9zZXJcbn1cblxuZXhwb3J0IHR5cGUgSW5mZXJyZWRUYXNrQ29udGV4dDxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSB7XG4gICRyZXN1bHQ6IHtcbiAgICByZWFkb25seSBbSyBpbiBrZXlvZiBUXTogUmV0dXJuVHlwZTxUW0tdPiBleHRlbmRzIFByb21pc2U8aW5mZXIgUj5cbiAgICAgID8gUHJvbWlzZTxSPlxuICAgICAgOiBQcm9taXNlPFJldHVyblR5cGU8VFtLXT4+XG4gIH1cbiAgJHNpZ25hbDogQWJvcnRTaWduYWxcbiAgJGRpc3Bvc2VyOiBBc3luY0Rpc3Bvc2VyXG59XG5cbmV4cG9ydCB0eXBlIEFsbFZhbHVlPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRhc2tSZXN1bHQ8VFtLXT5cbn1cblxuaW50ZXJmYWNlIEFsbENhdGNoQ29udGV4dDxUIGV4dGVuZHMgVGFza1JlY29yZD4ge1xuICBmYWlsZWRUYXNrOiAoa2V5b2YgVCAmIHN0cmluZykgfCB1bmRlZmluZWRcbiAgcGFydGlhbDogUGFydGlhbDxBbGxWYWx1ZTxUPj5cbiAgc2lnbmFsOiBBYm9ydFNpZ25hbFxufVxuXG50eXBlIEFsbENhdGNoRm48VCBleHRlbmRzIFRhc2tSZWNvcmQsIEM+ID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgY3R4OiBBbGxDYXRjaENvbnRleHQ8VD5cbikgPT4gQyB8IFByb21pc2U8Qz5cblxuZXhwb3J0IGludGVyZmFjZSBBbGxPcHRpb25zPFQgZXh0ZW5kcyBUYXNrUmVjb3JkLCBDPiB7XG4gIGNhdGNoOiBBbGxDYXRjaEZuPFQsIEM+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGxlZEZ1bGZpbGxlZDxUPiB7XG4gIHN0YXR1czogXCJmdWxmaWxsZWRcIlxuICB2YWx1ZTogVFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHRsZWRSZWplY3RlZCB7XG4gIHN0YXR1czogXCJyZWplY3RlZFwiXG4gIHJlYXNvbjogdW5rbm93blxufVxuXG5leHBvcnQgdHlwZSBTZXR0bGVkUmVzdWx0PFQ+ID0gU2V0dGxlZEZ1bGZpbGxlZDxUPiB8IFNldHRsZWRSZWplY3RlZFxuXG5leHBvcnQgdHlwZSBBbGxTZXR0bGVkUmVzdWx0PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFNldHRsZWRSZXN1bHQ8VGFza1Jlc3VsdDxUW0tdPj5cbn1cblxuaW50ZXJmYWNlIFJldHJ5SW5mbyB7XG4gIGF0dGVtcHQ6IG51bWJlclxuICBsaW1pdDogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVRyeUN0eCB7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsXG59XG5cbmV4cG9ydCB0eXBlIFRyeUN0eEZvcjxIYXNSZXRyeSBleHRlbmRzIGJvb2xlYW4+ID0gQmFzZVRyeUN0eCAmXG4gIChIYXNSZXRyeSBleHRlbmRzIHRydWUgPyB7IHJldHJ5OiBSZXRyeUluZm8gfSA6IFJlY29yZDxuZXZlciwgbmV2ZXI+KVxuXG5leHBvcnQgdHlwZSBUcnlDdHggPSBUcnlDdHhGb3I8dHJ1ZT5cblxuZXhwb3J0IHR5cGUgTm9uUHJvbWlzZTxUPiA9IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTx1bmtub3duPiA/IG5ldmVyIDogVFxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgT3JjaGVzdHJhdGlvbkV4ZWN1dGlvbjxUUmVzdWx0PiBleHRlbmRzIEJhc2VFeGVjdXRpb248UHJvbWlzZTxUUmVzdWx0Pj4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnKSB7XG4gICAgY29uc3QgdW5zdXBwb3J0ZWRQb2xpY2llcyA9IFtcbiAgICAgIGNvbmZpZy5yZXRyeSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogXCJyZXRyeVwiLFxuICAgICAgY29uZmlnLnRpbWVvdXQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFwidGltZW91dFwiLFxuICAgIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIFwicmV0cnlcIiB8IFwidGltZW91dFwiID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG5cbiAgICBpbnZhcmlhbnQoXG4gICAgICB1bnN1cHBvcnRlZFBvbGljaWVzLmxlbmd0aCA9PT0gMCxcbiAgICAgIG5ldyBQYW5pYyhcIk9SQ0hFU1RSQVRJT05fVU5TVVBQT1JURURfUE9MSUNZXCIsIHtcbiAgICAgICAgbWVzc2FnZTogYE9yY2hlc3RyYXRpb24gZG9lcyBub3Qgc3VwcG9ydCAke3Vuc3VwcG9ydGVkUG9saWNpZXMuam9pbihcIiBvciBcIil9IHBvbGljaWVzLmAsXG4gICAgICB9KVxuICAgIClcblxuICAgIHN1cGVyKHtcbiAgICAgIHNpZ25hbHM6IGNvbmZpZy5zaWduYWxzLFxuICAgICAgd3JhcHM6IGNvbmZpZy53cmFwcyxcbiAgICB9KVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGV4ZWN1dGVDb3JlKCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgIC8vIE9yY2hlc3RyYXRpb24gZXhlY3V0b3JzIHN0aWxsIHNoYXJlIG91dGVyIHdyYXBzL2NhbmNlbGxhdGlvbiBjaGVja3MgZXZlblxuICAgIC8vIHRob3VnaCB0aGVpciB0YXNrIGV4ZWN1dGlvbiBzdHJhdGVnaWVzIGRpZmZlci5cbiAgICBjb25zdCBjb250cm9sQmVmb3JlRXhlY3V0aW9uID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKClcblxuICAgIGlmIChjb250cm9sQmVmb3JlRXhlY3V0aW9uKSB7XG4gICAgICB0aHJvdyBjb250cm9sQmVmb3JlRXhlY3V0aW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZVRhc2tzKClcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBleGVjdXRlVGFza3MoKTogUHJvbWlzZTxUUmVzdWx0PlxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFza0dyYXBoRXhlY3V0aW9uQmFzZTxcbiAgVCBleHRlbmRzIFRhc2tSZWNvcmQsXG4gIFRDb250ZXh0IGV4dGVuZHMgVGFza0NvbnRleHQ8VD4sXG4+IGltcGxlbWVudHMgQXN5bmNEaXNwb3NhYmxlIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhc2tzOiBUXG4gIHByb3RlY3RlZCByZWFkb25seSB0YXNrTmFtZXM6IEFycmF5PGtleW9mIFQgJiBzdHJpbmc+XG4gIHByb3RlY3RlZCByZWFkb25seSByZXN1bHRzITogTWFwPGtleW9mIFQsIHVua25vd24+XG4gIHByb3RlY3RlZCByZWFkb25seSBlcnJvcnMhOiBNYXA8a2V5b2YgVCwgdW5rbm93bj5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVycyE6IE1hcDxrZXlvZiBULCBSZXNvbHZlclBhaXJbXT5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGludGVybmFsQ29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gIHByb3RlY3RlZCByZWFkb25seSB0YXNrU2lnbmFsOiBBYm9ydFNpZ25hbFxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcG9zZXI6IEFzeW5jRGlzcG9zZXIgPSBjcmVhdGVBc3luY0Rpc3Bvc2VyKClcbiAgcHJvdGVjdGVkIGZpcnN0UmVqZWN0aW9uOiB1bmtub3duXG4gIGRlY2xhcmUgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG5cbiAgY29uc3RydWN0b3Ioc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCwgdGFza3M6IFQpIHtcbiAgICB0aGlzLnRhc2tzID0gdGFza3NcbiAgICB0aGlzLnRhc2tOYW1lcyA9IE9iamVjdC5rZXlzKHRhc2tzKSBhcyBBcnJheTxrZXlvZiBUICYgc3RyaW5nPlxuICAgIHRoaXMucmVzdWx0cyA9IG5ldyBNYXA8a2V5b2YgVCwgdW5rbm93bj4oKVxuICAgIHRoaXMuZXJyb3JzID0gbmV3IE1hcDxrZXlvZiBULCB1bmtub3duPigpXG4gICAgdGhpcy5yZXNvbHZlcnMgPSBuZXcgTWFwPGtleW9mIFQsIFJlc29sdmVyUGFpcltdPigpXG4gICAgdGhpcy50YXNrU2lnbmFsID0gc2lnbmFsXG4gICAgICA/IEFib3J0U2lnbmFsLmFueShbc2lnbmFsLCB0aGlzLmludGVybmFsQ29udHJvbGxlci5zaWduYWxdKVxuICAgICAgOiB0aGlzLmludGVybmFsQ29udHJvbGxlci5zaWduYWxcbiAgfVxuXG4gIGFzeW5jIGRpc3Bvc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3Bvc2VyLmRpc3Bvc2VBc3luYygpXG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VGFza0hhbmRsZXIodGFza05hbWU6IGtleW9mIFQpIHtcbiAgICBjb25zdCB0YXNrRm4gPSB0aGlzLnRhc2tzW3Rhc2tOYW1lXVxuXG4gICAgaW52YXJpYW50KFxuICAgICAgdHlwZW9mIHRhc2tGbiA9PT0gXCJmdW5jdGlvblwiLFxuICAgICAgbmV3IFBhbmljKFwiVEFTS19JTlZBTElEX0hBTkRMRVJcIiwge1xuICAgICAgICBtZXNzYWdlOiBgVGFzayBcIiR7U3RyaW5nKHRhc2tOYW1lKX1cIiBpcyBub3QgYSBmdW5jdGlvbmAsXG4gICAgICB9KVxuICAgIClcblxuICAgIHJldHVybiB0YXNrRm4gYXMgKHRoaXM6IFRDb250ZXh0KSA9PiB1bmtub3duXG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzdWx0UHJveHkocmVxdWVzdGVyVGFza05hbWU6IGtleW9mIFQpOiBSZXN1bHRQcm94eTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBSZXN1bHRQcm94eTxUPiwge1xuICAgICAgZ2V0OiAoXywgcmVmZXJlbmNlZFRhc2tOYW1lOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMud2FpdEZvclJlc3VsdChyZWZlcmVuY2VkVGFza05hbWUgYXMga2V5b2YgVCwgcmVxdWVzdGVyVGFza05hbWUpLFxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEZvclJlc3VsdCh0YXNrTmFtZToga2V5b2YgVCwgcmVxdWVzdGVyVGFza05hbWU/OiBrZXlvZiBUKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKHJlcXVlc3RlclRhc2tOYW1lID09PSB0YXNrTmFtZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgUGFuaWMoXCJUQVNLX1NFTEZfUkVGRVJFTkNFXCIsIHtcbiAgICAgICAgICBtZXNzYWdlOiBgVGFzayBcIiR7U3RyaW5nKHRhc2tOYW1lKX1cIiBjYW5ub3QgYXdhaXQgaXRzIG93biByZXN1bHRgLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICghT2JqZWN0Lmhhc093bih0aGlzLnRhc2tzLCB0YXNrTmFtZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFBhbmljKFwiVEFTS19VTktOT1dOX1JFRkVSRU5DRVwiLCB7XG4gICAgICAgICAgbWVzc2FnZTogYFVua25vd24gdGFzayBcIiR7U3RyaW5nKHRhc2tOYW1lKX1cImAsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0cy5oYXModGFza05hbWUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMucmVzdWx0cy5nZXQodGFza05hbWUpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmVycm9ycy5oYXModGFza05hbWUpKSB7XG4gICAgICBjb25zdCBzdG9yZWRFcnJvciA9IHRoaXMubWFwU3RvcmVkRXJyb3IodGhpcy5lcnJvcnMuZ2V0KHRhc2tOYW1lKSlcblxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHN0b3JlZEVycm9yKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZXJzLmdldCh0YXNrTmFtZSlcblxuICAgICAgaWYgKHF1ZXVlKSB7XG4gICAgICAgIHF1ZXVlLnB1c2goW3Jlc29sdmUsIHJlamVjdF0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlc29sdmVycy5zZXQodGFza05hbWUsIFtbcmVzb2x2ZSwgcmVqZWN0XV0pXG4gICAgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBzdG9yZVJlc3VsdCh0YXNrTmFtZToga2V5b2YgVCwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnJlc3VsdHMuc2V0KHRhc2tOYW1lLCB2YWx1ZSlcbiAgICB0aGlzLnJlc29sdmVXYWl0ZXJzKHRhc2tOYW1lLCB2YWx1ZSlcbiAgfVxuXG4gIHByb3RlY3RlZCBzdG9yZUVycm9yKHRhc2tOYW1lOiBrZXlvZiBULCBlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IG1hcHBlZEVycm9yID0gdGhpcy5tYXBTdG9yZWRFcnJvcihlcnJvcilcblxuICAgIHRoaXMuZXJyb3JzLnNldCh0YXNrTmFtZSwgbWFwcGVkRXJyb3IpXG4gICAgdGhpcy5yZWplY3RXYWl0ZXJzKHRhc2tOYW1lLCBtYXBwZWRFcnJvcilcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlV2FpdGVycyh0YXNrTmFtZToga2V5b2YgVCwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBmdWxmaWxsZWQgPSB0aGlzLnJlc29sdmVycy5nZXQodGFza05hbWUpXG5cbiAgICBpZiAoZnVsZmlsbGVkKSB7XG4gICAgICBmb3IgKGNvbnN0IFtyZXNvbHZlXSBvZiBmdWxmaWxsZWQpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNvbHZlcnMuZGVsZXRlKHRhc2tOYW1lKVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZWplY3RXYWl0ZXJzKHRhc2tOYW1lOiBrZXlvZiBULCBlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHJlamVjdGVkID0gdGhpcy5yZXNvbHZlcnMuZ2V0KHRhc2tOYW1lKVxuXG4gICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICBmb3IgKGNvbnN0IFssIHJlamVjdF0gb2YgcmVqZWN0ZWQpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJlc29sdmVycy5kZWxldGUodGFza05hbWUpXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFib3J0SW50ZXJuYWwoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW50ZXJuYWxDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICB0aGlzLmludGVybmFsQ29udHJvbGxlci5hYm9ydChlcnJvcilcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25UYXNrUmVzdWx0KF90YXNrTmFtZToga2V5b2YgVCwgX3ZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLnRhc2tzXG4gICAgdm9pZCBfdGFza05hbWVcbiAgICB2b2lkIF92YWx1ZVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uVGFza0Vycm9yKF90YXNrTmFtZToga2V5b2YgVCwgX2Vycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLnRhc2tzXG4gICAgdm9pZCBfdGFza05hbWVcbiAgICB2b2lkIF9lcnJvclxuICB9XG5cbiAgcHJvdGVjdGVkIG1hcFN0b3JlZEVycm9yKGVycm9yOiB1bmtub3duKTogRXJyb3Ige1xuICAgIHZvaWQgdGhpcy50YXNrc1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgVW5oYW5kbGVkRXhjZXB0aW9uKHVuZGVmaW5lZCwgeyBjYXVzZTogZXJyb3IgfSlcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG91bGRBYm9ydE9uVGFza0Vycm9yKF9lcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHZvaWQgdGhpcy50YXNrc1xuICAgIHZvaWQgX2Vycm9yXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvdWxkUmV0aHJvd1Rhc2tFcnJvcihfZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICB2b2lkIHRoaXMudGFza3NcbiAgICB2b2lkIF9lcnJvclxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0Rmlyc3RSZWplY3Rpb24oZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmZpcnN0UmVqZWN0aW9uID8/PSBlcnJvclxuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZVRhc2tDb250ZXh0KHJlc3VsdFByb3h5OiBSZXN1bHRQcm94eTxUPik6IFRDb250ZXh0XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJ1blRhc2sodGFza05hbWU6IGtleW9mIFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFza0ZuID0gdGhpcy5nZXRUYXNrSGFuZGxlcih0YXNrTmFtZSlcbiAgICAgIGNvbnN0IHJlc3VsdFByb3h5ID0gdGhpcy5jcmVhdGVSZXN1bHRQcm94eSh0YXNrTmFtZSlcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZVRhc2tDb250ZXh0KHJlc3VsdFByb3h5KVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFza0ZuLmNhbGwoY29udGV4dClcblxuICAgICAgdGhpcy5zdG9yZVJlc3VsdCh0YXNrTmFtZSwgcmVzdWx0KVxuICAgICAgdGhpcy5vblRhc2tSZXN1bHQodGFza05hbWUsIHJlc3VsdClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zZXRGaXJzdFJlamVjdGlvbihlcnJvcilcbiAgICAgIHRoaXMuc3RvcmVFcnJvcih0YXNrTmFtZSwgZXJyb3IpXG4gICAgICB0aGlzLm9uVGFza0Vycm9yKHRhc2tOYW1lLCBlcnJvcilcblxuICAgICAgaWYgKHRoaXMuc2hvdWxkQWJvcnRPblRhc2tFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhpcy5hYm9ydEludGVybmFsKGVycm9yKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG91bGRSZXRocm93VGFza0Vycm9yKGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZGVmaW5lQXN5bmNEaXNwb3NlQWxpYXMoVGFza0dyYXBoRXhlY3V0aW9uQmFzZS5wcm90b3R5cGUpXG5cbmV4cG9ydCBjbGFzcyBUYXNrRXhlY3V0aW9uPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiBleHRlbmRzIFRhc2tHcmFwaEV4ZWN1dGlvbkJhc2U8VCwgVGFza0NvbnRleHQ8VD4+IHtcbiAgcmVhZG9ubHkgI21vZGU6IFRhc2tFeGVjdXRpb25Nb2RlXG4gIHJlYWRvbmx5ICNyZXR1cm5WYWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAjZmFpbGVkVGFzazogKGtleW9mIFQgJiBzdHJpbmcpIHwgdW5kZWZpbmVkXG4gIHByaXZhdGUgc2V0dGxlZFByb21pc2U6IFByb21pc2U8QXJyYXk8UHJvbWlzZVNldHRsZWRSZXN1bHQ8dm9pZD4+PiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsIHRhc2tzOiBULCBtb2RlOiBUYXNrRXhlY3V0aW9uTW9kZSkge1xuICAgIHN1cGVyKHNpZ25hbCwgdGFza3MpXG4gICAgdGhpcy4jbW9kZSA9IG1vZGVcbiAgfVxuXG4gIGdldCBmYWlsZWRUYXNrKCk6IChrZXlvZiBUICYgc3RyaW5nKSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZhaWxlZFRhc2tcbiAgfVxuXG4gIGdldCBzaWduYWwoKTogQWJvcnRTaWduYWwge1xuICAgIHJldHVybiB0aGlzLnRhc2tTaWduYWxcbiAgfVxuXG4gIGdldCByZXR1cm5WYWx1ZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuI3JldHVyblZhbHVlXG4gIH1cblxuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMudGFza05hbWVzLm1hcChhc3luYyAobmFtZSkgPT4gdGhpcy5ydW5UYXNrKG5hbWUpKVxuICAgIHRoaXMuc2V0dGxlZFByb21pc2UgPSBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpXG5cbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gXCJzZXR0bGVkXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0dGxlZFByb21pc2VcbiAgICAgIHJldHVybiB0aGlzLiNyZXR1cm5WYWx1ZVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IHRoaXMubWFwU3RvcmVkRXJyb3IodGhpcy5maXJzdFJlamVjdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jcmV0dXJuVmFsdWVcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JUYXNrc1RvU2V0dGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2V0dGxlZFByb21pc2VcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVUYXNrQ29udGV4dChyZXN1bHRQcm94eTogUmVzdWx0UHJveHk8VD4pOiBUYXNrQ29udGV4dDxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRkaXNwb3NlcjogdGhpcy5kaXNwb3NlcixcbiAgICAgICRyZXN1bHQ6IHJlc3VsdFByb3h5LFxuICAgICAgJHNpZ25hbDogdGhpcy50YXNrU2lnbmFsLFxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvblRhc2tSZXN1bHQodGFza05hbWU6IGtleW9mIFQsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI21vZGUgPT09IFwic2V0dGxlZFwiKSB7XG4gICAgICB0aGlzLiNyZXR1cm5WYWx1ZVt0YXNrTmFtZSBhcyBzdHJpbmddID0geyBzdGF0dXM6IFwiZnVsZmlsbGVkXCIsIHZhbHVlIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jcmV0dXJuVmFsdWVbdGFza05hbWUgYXMgc3RyaW5nXSA9IHZhbHVlXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uVGFza0Vycm9yKHRhc2tOYW1lOiBrZXlvZiBULCBlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuI2ZhaWxlZFRhc2sgPz89IHRhc2tOYW1lIGFzIGtleW9mIFQgJiBzdHJpbmdcblxuICAgIGlmICh0aGlzLiNtb2RlID09PSBcInNldHRsZWRcIikge1xuICAgICAgdGhpcy4jcmV0dXJuVmFsdWVbdGFza05hbWUgYXMgc3RyaW5nXSA9IHsgcmVhc29uOiBlcnJvciwgc3RhdHVzOiBcInJlamVjdGVkXCIgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzaG91bGRBYm9ydE9uVGFza0Vycm9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNtb2RlID09PSBcImZhaWwtZmFzdFwiXG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2hvdWxkUmV0aHJvd1Rhc2tFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jbW9kZSA9PT0gXCJmYWlsLWZhc3RcIlxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi9idWlsZGVyXCJcbmltcG9ydCB0eXBlIHtcbiAgQWxsT3B0aW9ucyxcbiAgQWxsVmFsdWUsXG4gIEluZmVycmVkVGFza0NvbnRleHQsXG4gIFRhc2tSZWNvcmQsXG4gIFRhc2tSZXN1bHQsXG4gIFRhc2tWYWxpZGF0aW9uLFxufSBmcm9tIFwiLi9zaGFyZWRcIlxuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uRXJyb3IsIFBhbmljIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBjaGVja0lzUHJvbWlzZUxpa2UgfSBmcm9tIFwiLi4vdXRpbHNcIlxuaW1wb3J0IHsgT3JjaGVzdHJhdGlvbkV4ZWN1dGlvbiwgVGFza0V4ZWN1dGlvbiB9IGZyb20gXCIuL3NoYXJlZFwiXG5cbmNsYXNzIEFsbEV4ZWN1dGlvbjxUIGV4dGVuZHMgVGFza1JlY29yZCwgQz4gZXh0ZW5kcyBPcmNoZXN0cmF0aW9uRXhlY3V0aW9uPEFsbFZhbHVlPFQ+IHwgQz4ge1xuICByZWFkb25seSAjdGFza3M6IFRcbiAgcmVhZG9ubHkgI29wdGlvbnM6IEFsbE9wdGlvbnM8VCwgQz4gfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcsIHRhc2tzOiBULCBvcHRpb25zPzogQWxsT3B0aW9uczxULCBDPikge1xuICAgIHN1cGVyKGNvbmZpZylcbiAgICB0aGlzLiN0YXNrcyA9IHRhc2tzXG4gICAgdGhpcy4jb3B0aW9ucyA9IG9wdGlvbnNcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBleGVjdXRlVGFza3MoKTogUHJvbWlzZTxBbGxWYWx1ZTxUPiB8IEM+IHtcbiAgICBhd2FpdCB1c2luZyBleGVjdXRpb24gPSBuZXcgVGFza0V4ZWN1dGlvbih0aGlzLmV4ZWN1dGlvblNpZ25hbCwgdGhpcy4jdGFza3MsIFwiZmFpbC1mYXN0XCIpXG4gICAgbGV0IHJlc3VsdCE6IEFsbFZhbHVlPFQ+IHwgQ1xuICAgIGxldCB0aHJldyA9IGZhbHNlXG4gICAgbGV0IHRocm93bkVycm9yOiB1bmtub3duXG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gKGF3YWl0IHRoaXMucmFjZVdpdGhDYW5jZWxsYXRpb24oZXhlY3V0aW9uLmV4ZWN1dGUoKSkpIGFzIEFsbFZhbHVlPFQ+XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xBZnRlckZhaWx1cmUgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoZXJyb3IpXG4gICAgICBjb25zdCBjYXRjaEZuID0gdGhpcy4jb3B0aW9ucz8uY2F0Y2hcblxuICAgICAgaWYgKGNvbnRyb2xBZnRlckZhaWx1cmUpIHtcbiAgICAgICAgdGhyZXcgPSB0cnVlXG4gICAgICAgIHRocm93bkVycm9yID0gY29udHJvbEFmdGVyRmFpbHVyZVxuICAgICAgfSBlbHNlIGlmIChjYXRjaEZuKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgZmFpbGVkVGFzazogZXhlY3V0aW9uLmZhaWxlZFRhc2ssXG4gICAgICAgICAgcGFydGlhbDogZXhlY3V0aW9uLnJldHVyblZhbHVlIGFzIFBhcnRpYWw8QWxsVmFsdWU8VD4+LFxuICAgICAgICAgIHNpZ25hbDogZXhlY3V0aW9uLnNpZ25hbCxcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbWFwcGVkID0gY2F0Y2hGbihlcnJvciwgY29udGV4dClcbiAgICAgICAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKG1hcHBlZCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IChhd2FpdCB0aGlzLnJhY2VXaXRoQ2FuY2VsbGF0aW9uKFxuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShtYXBwZWQpLmNhdGNoKChjYXRjaEVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoY2F0Y2hFcnJvciBpbnN0YW5jZW9mIENhbmNlbGxhdGlvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGNhdGNoRXJyb3JcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhbmljKFwiQUxMX0NBVENIX0hBTkRMRVJfUkVKRUNUXCIsIHsgY2F1c2U6IGNhdGNoRXJyb3IgfSlcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICApKSBhcyBDXG4gICAgICAgICAgICB9IGNhdGNoIChtYXBwZWRFcnJvcikge1xuICAgICAgICAgICAgICB0aHJldyA9IHRydWVcbiAgICAgICAgICAgICAgdGhyb3duRXJyb3IgPSBtYXBwZWRFcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBtYXBwZWRcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGNhdGNoRXJyb3IpIHtcbiAgICAgICAgICB0aHJldyA9IHRydWVcbiAgICAgICAgICB0aHJvd25FcnJvciA9IG5ldyBQYW5pYyhcIkFMTF9DQVRDSF9IQU5ETEVSX1RIUk9XXCIsIHsgY2F1c2U6IGNhdGNoRXJyb3IgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyZXcgPSB0cnVlXG4gICAgICAgIHRocm93bkVycm9yID0gZXJyb3JcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZXhlY3V0aW9uLndhaXRGb3JUYXNrc1RvU2V0dGxlKClcbiAgICB9XG5cbiAgICBjb25zdCBjYW5jZWxsYXRpb24gPSB0aGlzLmNoZWNrRGlkQ2FuY2VsKHRocm93bkVycm9yKVxuXG4gICAgaWYgKGNhbmNlbGxhdGlvbikge1xuICAgICAgdGhyb3cgY2FuY2VsbGF0aW9uXG4gICAgfVxuXG4gICAgaWYgKHRocmV3KSB7XG4gICAgICB0aHJvdyB0aHJvd25FcnJvclxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFsbDxUIGV4dGVuZHMgVGFza1JlY29yZCwgQyA9IG5ldmVyPihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICB0YXNrczogVCAmIFRhc2tWYWxpZGF0aW9uPE5vSW5mZXI8VD4+ICYgVGhpc1R5cGU8SW5mZXJyZWRUYXNrQ29udGV4dDxUPj4sXG4gIG9wdGlvbnM/OiBBbGxPcHRpb25zPFQsIEM+XG4pOiBQcm9taXNlPHsgW0sgaW4ga2V5b2YgVF06IFRhc2tSZXN1bHQ8VFtLXT4gfSB8IEM+IHtcbiAgdXNpbmcgZXhlY3V0aW9uID0gbmV3IEFsbEV4ZWN1dGlvbihjb25maWcsIHRhc2tzLCBvcHRpb25zKVxuICByZXR1cm4gKGF3YWl0IGV4ZWN1dGlvbi5leGVjdXRlKCkpIGFzIHsgW0sgaW4ga2V5b2YgVF06IFRhc2tSZXN1bHQ8VFtLXT4gfSB8IENcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBCdWlsZGVyQ29uZmlnIH0gZnJvbSBcIi4uL2J1aWxkZXJcIlxuaW1wb3J0IHR5cGUgeyBBbGxTZXR0bGVkUmVzdWx0LCBJbmZlcnJlZFRhc2tDb250ZXh0LCBUYXNrUmVjb3JkLCBUYXNrVmFsaWRhdGlvbiB9IGZyb20gXCIuL3NoYXJlZFwiXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uRXhlY3V0aW9uLCBUYXNrRXhlY3V0aW9uIH0gZnJvbSBcIi4vc2hhcmVkXCJcblxuY2xhc3MgQWxsU2V0dGxlZEV4ZWN1dGlvbjxUIGV4dGVuZHMgVGFza1JlY29yZD4gZXh0ZW5kcyBPcmNoZXN0cmF0aW9uRXhlY3V0aW9uPFxuICBBbGxTZXR0bGVkUmVzdWx0PFQ+XG4+IHtcbiAgcmVhZG9ubHkgI3Rhc2tzOiBUXG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWlsZGVyQ29uZmlnLCB0YXNrczogVCkge1xuICAgIHN1cGVyKGNvbmZpZylcbiAgICB0aGlzLiN0YXNrcyA9IHRhc2tzXG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZVRhc2tzKCk6IFByb21pc2U8QWxsU2V0dGxlZFJlc3VsdDxUPj4ge1xuICAgIGF3YWl0IHVzaW5nIGV4ZWN1dGlvbiA9IG5ldyBUYXNrRXhlY3V0aW9uKHRoaXMuZXhlY3V0aW9uU2lnbmFsLCB0aGlzLiN0YXNrcywgXCJzZXR0bGVkXCIpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yYWNlV2l0aENhbmNlbGxhdGlvbihleGVjdXRpb24uZXhlY3V0ZSgpKVxuICAgIGNvbnN0IGNhbmNlbGxhdGlvbiA9IHRoaXMuY2hlY2tEaWRDYW5jZWwoKVxuXG4gICAgaWYgKGNhbmNlbGxhdGlvbikge1xuICAgICAgdGhyb3cgY2FuY2VsbGF0aW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyBBbGxTZXR0bGVkUmVzdWx0PFQ+XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBbGxTZXR0bGVkPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICB0YXNrczogVCAmIFRhc2tWYWxpZGF0aW9uPE5vSW5mZXI8VD4+ICYgVGhpc1R5cGU8SW5mZXJyZWRUYXNrQ29udGV4dDxUPj5cbik6IFByb21pc2U8QWxsU2V0dGxlZFJlc3VsdDxUPj4ge1xuICB1c2luZyBleGVjdXRpb24gPSBuZXcgQWxsU2V0dGxlZEV4ZWN1dGlvbihjb25maWcsIHRhc2tzKVxuICByZXR1cm4gYXdhaXQgZXhlY3V0aW9uLmV4ZWN1dGUoKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7XG4gIEluZmVycmVkVGFza0NvbnRleHQsXG4gIFJlc3VsdFByb3h5LFxuICBUYXNrQ29udGV4dCxcbiAgVGFza1JlY29yZCxcbiAgVGFza1Jlc3VsdCxcbn0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7IFBhbmljIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uRXhlY3V0aW9uLCBUYXNrR3JhcGhFeGVjdXRpb25CYXNlIH0gZnJvbSBcIi4vc2hhcmVkXCJcblxuZGVjbGFyZSBjb25zdCBGTE9XX0VYSVRfQlJBTkQ6IHVuaXF1ZSBzeW1ib2xcblxuZXhwb3J0IHR5cGUgRmxvd0V4aXQ8VD4gPSB7XG4gIHJlYWRvbmx5IFtGTE9XX0VYSVRfQlJBTkRdOiBUXG59XG5cbnR5cGUgRXhpdFZhbHVlPFQ+ID0gVCBleHRlbmRzIEZsb3dFeGl0PGluZmVyIFY+ID8gViA6IG5ldmVyXG5cbnR5cGUgRmxvd0V4aXRWYWx1ZTxUIGV4dGVuZHMgVGFza1JlY29yZD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBFeGl0VmFsdWU8VGFza1Jlc3VsdDxUW0tdPj5cbn1ba2V5b2YgVF1cblxuaW50ZXJmYWNlIEZsb3dUYXNrQ29udGV4dDxUIGV4dGVuZHMgVGFza1JlY29yZD4gZXh0ZW5kcyBUYXNrQ29udGV4dDxUPiB7XG4gICRleGl0PFY+KHZhbHVlOiBWKTogRmxvd0V4aXQ8Vj5cbn1cblxuZXhwb3J0IHR5cGUgSW5mZXJyZWRGbG93VGFza0NvbnRleHQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+ID0gSW5mZXJyZWRUYXNrQ29udGV4dDxUPiAmIHtcbiAgJGV4aXQ8Vj4odmFsdWU6IFYpOiBGbG93RXhpdDxWPlxufVxuXG5leHBvcnQgdHlwZSBGbG93UmVzdWx0PFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiA9IEZsb3dFeGl0VmFsdWU8VD5cblxuY2xhc3MgRmxvd0V4aXRTaWduYWwgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duXG5cbiAgY29uc3RydWN0b3IodmFsdWU6IHVua25vd24pIHtcbiAgICBzdXBlcihcIkZsb3cgZXhpdGVkXCIpXG4gICAgdGhpcy5uYW1lID0gXCJGbG93RXhpdFNpZ25hbFwiXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cbn1cblxuY2xhc3MgRmxvd0V4ZWN1dGlvbjxUIGV4dGVuZHMgVGFza1JlY29yZD4gZXh0ZW5kcyBUYXNrR3JhcGhFeGVjdXRpb25CYXNlPFQsIEZsb3dUYXNrQ29udGV4dDxUPj4ge1xuICAjZmlyc3RSZWplY3Rpb25XYWl0ZXJzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdXG4gICNzZXR0bGVkUHJvbWlzZTogUHJvbWlzZTxBcnJheTxQcm9taXNlU2V0dGxlZFJlc3VsdDx2b2lkPj4+IHwgdW5kZWZpbmVkXG5cbiAgYXN5bmMgZXhlY3V0ZSgpOiBQcm9taXNlPEZsb3dSZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMudGFza05hbWVzLm1hcChhc3luYyAobmFtZSkgPT4gdGhpcy5ydW5UYXNrKG5hbWUpKVxuICAgIHRoaXMuI3NldHRsZWRQcm9taXNlID0gUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKVxuXG4gICAgLy8gUmFjZSBQcm9taXNlLmFsbFNldHRsZWQoKSBhZ2FpbnN0IHRoZSBmaXJzdCByZWplY3Rpb24gcmVjb3JkZWQgYnkgcnVuVGFzaygpLlxuICAgIGF3YWl0IFByb21pc2UucmFjZShbdGhpcy4jc2V0dGxlZFByb21pc2UsIHRoaXMud2FpdEZvckZpcnN0UmVqZWN0aW9uKCldKVxuXG4gICAgaWYgKHRoaXMuZmlyc3RSZWplY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuZmlyc3RSZWplY3Rpb24gaW5zdGFuY2VvZiBGbG93RXhpdFNpZ25hbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maXJzdFJlamVjdGlvbi52YWx1ZSBhcyBGbG93UmVzdWx0PFQ+XG4gICAgICB9XG5cbiAgICAgIHRocm93IHRoaXMuZmlyc3RSZWplY3Rpb25cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgUGFuaWMoXCJGTE9XX05PX0VYSVRcIilcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JUYXNrc1RvU2V0dGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuI3NldHRsZWRQcm9taXNlXG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2V0Rmlyc3RSZWplY3Rpb24oZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBoYWRGaXJzdFJlamVjdGlvbiA9IHRoaXMuZmlyc3RSZWplY3Rpb24gIT09IHVuZGVmaW5lZFxuXG4gICAgc3VwZXIuc2V0Rmlyc3RSZWplY3Rpb24oZXJyb3IpXG5cbiAgICBpZiAoaGFkRmlyc3RSZWplY3Rpb24gfHwgdGhpcy5maXJzdFJlamVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlc29sdmUgb2YgdGhpcy4jZmlyc3RSZWplY3Rpb25XYWl0ZXJzKSB7XG4gICAgICByZXNvbHZlKClcbiAgICB9XG5cbiAgICB0aGlzLiNmaXJzdFJlamVjdGlvbldhaXRlcnMgPSBbXVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZVRhc2tDb250ZXh0KHJlc3VsdFByb3h5OiBSZXN1bHRQcm94eTxUPik6IEZsb3dUYXNrQ29udGV4dDxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRkaXNwb3NlcjogdGhpcy5kaXNwb3NlcixcbiAgICAgICRleGl0OiAodmFsdWUpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEZsb3dFeGl0U2lnbmFsKHZhbHVlKVxuICAgICAgfSxcbiAgICAgICRyZXN1bHQ6IHJlc3VsdFByb3h5LFxuICAgICAgJHNpZ25hbDogdGhpcy50YXNrU2lnbmFsLFxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBtYXBTdG9yZWRFcnJvcihlcnJvcjogdW5rbm93bik6IEVycm9yIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGbG93RXhpdFNpZ25hbCkge1xuICAgICAgcmV0dXJuIGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLm1hcFN0b3JlZEVycm9yKGVycm9yKVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNob3VsZEFib3J0T25UYXNrRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgdm9pZCB0aGlzLnRhc2tOYW1lc1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JGaXJzdFJlamVjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5maXJzdFJlamVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuI2ZpcnN0UmVqZWN0aW9uV2FpdGVycy5wdXNoKHJlc29sdmUpXG4gICAgfSlcbiAgfVxufVxuXG5jbGFzcyBGbG93UnVubmVyRXhlY3V0aW9uPFQgZXh0ZW5kcyBUYXNrUmVjb3JkPiBleHRlbmRzIE9yY2hlc3RyYXRpb25FeGVjdXRpb248Rmxvd1Jlc3VsdDxUPj4ge1xuICByZWFkb25seSAjdGFza3M6IFRcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEJ1aWxkZXJDb25maWcsIHRhc2tzOiBUKSB7XG4gICAgc3VwZXIoY29uZmlnKVxuICAgIHRoaXMuI3Rhc2tzID0gdGFza3NcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBleGVjdXRlVGFza3MoKTogUHJvbWlzZTxGbG93UmVzdWx0PFQ+PiB7XG4gICAgYXdhaXQgdXNpbmcgZXhlY3V0aW9uID0gbmV3IEZsb3dFeGVjdXRpb24odGhpcy5leGVjdXRpb25TaWduYWwsIHRoaXMuI3Rhc2tzKVxuICAgIGxldCByZXN1bHQhOiBGbG93UmVzdWx0PFQ+XG4gICAgbGV0IHRocmV3ID0gZmFsc2VcbiAgICBsZXQgdGhyb3duRXJyb3I6IHVua25vd25cblxuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSAoYXdhaXQgdGhpcy5yYWNlV2l0aENhbmNlbGxhdGlvbihleGVjdXRpb24uZXhlY3V0ZSgpKSkgYXMgRmxvd1Jlc3VsdDxUPlxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJldyA9IHRydWVcbiAgICAgIHRocm93bkVycm9yID0gZXJyb3JcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZXhlY3V0aW9uLndhaXRGb3JUYXNrc1RvU2V0dGxlKClcbiAgICB9XG5cbiAgICBjb25zdCBjYW5jZWxsYXRpb24gPSB0aGlzLmNoZWNrRGlkQ2FuY2VsKHRocm93bkVycm9yKVxuXG4gICAgaWYgKGNhbmNlbGxhdGlvbikge1xuICAgICAgdGhyb3cgY2FuY2VsbGF0aW9uXG4gICAgfVxuXG4gICAgaWYgKHRocmV3KSB7XG4gICAgICB0aHJvdyB0aHJvd25FcnJvclxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUZsb3c8VCBleHRlbmRzIFRhc2tSZWNvcmQ+KFxuICBjb25maWc6IEJ1aWxkZXJDb25maWcsXG4gIHRhc2tzOiBUICYgVGhpc1R5cGU8SW5mZXJyZWRGbG93VGFza0NvbnRleHQ8VD4+XG4pOiBQcm9taXNlPEZsb3dSZXN1bHQ8VD4+IHtcbiAgdXNpbmcgZXhlY3V0aW9uID0gbmV3IEZsb3dSdW5uZXJFeGVjdXRpb24oY29uZmlnLCB0YXNrcylcbiAgcmV0dXJuIGF3YWl0IGV4ZWN1dGlvbi5leGVjdXRlKClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBCdWlsZGVyQ29uZmlnIH0gZnJvbSBcIi4uL2J1aWxkZXJcIlxuaW1wb3J0IHR5cGUgeyBCYXNlVHJ5Q3R4LCBOb25Qcm9taXNlIH0gZnJvbSBcIi4vc2hhcmVkXCJcbmltcG9ydCB7IENvbnRyb2xFcnJvciwgUGFuaWMsIFJldHJ5RXhoYXVzdGVkRXJyb3IsIFVuaGFuZGxlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgY2hlY2tJc1Byb21pc2VMaWtlIH0gZnJvbSBcIi4uL3V0aWxzXCJcbmltcG9ydCB7IEJhc2VFeGVjdXRpb24sIFJldHJ5RGlyZWN0aXZlLCB0eXBlIFJldHJ5RGVjaXNpb24sIHR5cGUgUnVubmVyRXJyb3IgfSBmcm9tIFwiLi9iYXNlXCJcblxuZXhwb3J0IHR5cGUgUnVuVHJ5Rm48VCwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eCA9IEJhc2VUcnlDdHg+ID0gKFxuICBjdHg6IEN0eFxuKSA9PiBOb25Qcm9taXNlPFQ+IHwgUHJvbWlzZTxUPlxuXG50eXBlIFJ1bkNhdGNoRm48RT4gPSAoZXJyb3I6IHVua25vd24pID0+IE5vblByb21pc2U8RT4gfCBQcm9taXNlPEU+XG5cbmludGVyZmFjZSBSdW5Bc3luY09wdGlvbnM8VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eCA9IEJhc2VUcnlDdHg+IHtcbiAgdHJ5OiBSdW5UcnlGbjxULCBDdHg+XG4gIGNhdGNoOiBSdW5DYXRjaEZuPEU+XG59XG5cbmV4cG9ydCB0eXBlIEFzeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eCA9IEJhc2VUcnlDdHg+ID1cbiAgfCBSdW5UcnlGbjxULCBDdHg+XG4gIHwgUnVuQXN5bmNPcHRpb25zPFQsIEUsIEN0eD5cblxuLyoqIEVuY2Fwc3VsYXRlcyB0aGUgc2hhcmVkIG11dGFibGUgc3RhdGUgYW5kIGxvZ2ljIGZvciBhIHNpbmdsZSBydW4gZXhlY3V0aW9uLiAqL1xuY2xhc3MgUnVuRXhlY3V0aW9uPFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHg+IGV4dGVuZHMgQmFzZUV4ZWN1dGlvbjxcbiAgUHJvbWlzZTxUIHwgRSB8IFJ1bm5lckVycm9yPlxuPiB7XG4gICNjYXRjaEZuOiBSdW5DYXRjaEZuPEU+IHwgdW5kZWZpbmVkXG4gICN0cnlGbjogUnVuVHJ5Rm48VCwgQ3R4PlxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQnVpbGRlckNvbmZpZywgaW5wdXQ6IEFzeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4Pikge1xuICAgIHN1cGVyKGNvbmZpZylcblxuICAgIHRoaXMuI2NhdGNoRm4gPSB0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIiA/IHVuZGVmaW5lZCA6IGlucHV0LmNhdGNoXG4gICAgdGhpcy4jdHJ5Rm4gPSB0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIiA/IGlucHV0IDogaW5wdXQudHJ5XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZXhlY3V0ZUNvcmUoKTogUHJvbWlzZTxUIHwgRSB8IFJ1bm5lckVycm9yPiB7XG4gICAgcmV0dXJuIHRoaXMuI3J1bkF0dGVtcHRMb29wKDEpXG4gIH1cblxuICAvKiogUmVzb2x2ZSBhbiBhdHRlbXB0IGVycm9yIGludG8gZWl0aGVyIGEgdGVybWluYWwgcmVzdWx0IG9yIGEgcmV0cnkgZGVjaXNpb24uICovXG4gIGFzeW5jICNyZXNvbHZlRmFpbHVyZShlcnJvcjogdW5rbm93bik6IFByb21pc2U8RSB8IFJ1bm5lckVycm9yIHwgUmV0cnlEaXJlY3RpdmU+IHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBQYW5pYykge1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb250cm9sRXJyb3IpIHtcbiAgICAgIHJldHVybiBlcnJvclxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xFcnJvciA9IHRoaXMuY2hlY2tEaWRDb250cm9sRmFpbChlcnJvcilcblxuICAgIGlmIChjb250cm9sRXJyb3IpIHtcbiAgICAgIHJldHVybiBjb250cm9sRXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCByZXRyeURlY2lzaW9uID0gdGhpcy5idWlsZFJldHJ5RGVjaXNpb24oZXJyb3IpXG5cbiAgICBpZiAocmV0cnlEZWNpc2lvbi5zaG91bGRBdHRlbXB0UmV0cnkpIHtcbiAgICAgIHJldHVybiBuZXcgUmV0cnlEaXJlY3RpdmUocmV0cnlEZWNpc2lvbilcbiAgICB9XG5cbiAgICBpZiAocmV0cnlEZWNpc2lvbi5pc1JldHJ5RXhoYXVzdGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFJldHJ5RXhoYXVzdGVkRXJyb3IodW5kZWZpbmVkLCB7IGNhdXNlOiBlcnJvciB9KVxuICAgIH1cblxuICAgIGlmICghdGhpcy4jY2F0Y2hGbikge1xuICAgICAgLy8gRXZlbiB3aXRob3V0IGEgY2F0Y2ggaGFuZGxlciwgY2FuY2VsbGF0aW9uL3RpbWVvdXQgbWF5IGhhdmUgd29uIHNpbmNlXG4gICAgICAvLyB0aGUgb3JpZ2luYWwgZmFpbHVyZSB3YXMgZmlyc3Qgb2JzZXJ2ZWQuXG4gICAgICBjb25zdCBmaW5hbGl6ZUNvbnRyb2xFcnJvciA9IHRoaXMuY2hlY2tEaWRDb250cm9sRmFpbChlcnJvcilcblxuICAgICAgaWYgKGZpbmFsaXplQ29udHJvbEVycm9yKSB7XG4gICAgICAgIHJldHVybiBmaW5hbGl6ZUNvbnRyb2xFcnJvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFVuaGFuZGxlZEV4Y2VwdGlvbih1bmRlZmluZWQsIHsgY2F1c2U6IGVycm9yIH0pXG4gICAgfVxuXG4gICAgbGV0IG1hcHBlZDogRSB8IFByb21pc2U8RT5cblxuICAgIHRyeSB7XG4gICAgICBtYXBwZWQgPSB0aGlzLiNjYXRjaEZuKGVycm9yKVxuICAgIH0gY2F0Y2ggKGNhdGNoRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBQYW5pYyhcIlJVTl9DQVRDSF9IQU5ETEVSX1RIUk9XXCIsIHsgY2F1c2U6IGNhdGNoRXJyb3IgfSlcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKG1hcHBlZCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJhY2UobWFwcGVkLCBlcnJvcilcbiAgICAgIH0gY2F0Y2ggKGNhdGNoRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbmljKFwiUlVOX0NBVENIX0hBTkRMRVJfUkVKRUNUXCIsIHsgY2F1c2U6IGNhdGNoRXJyb3IgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb250cm9sIHN0YXRlIGNhbiBjaGFuZ2Ugd2hpbGUgdGhlIGNhdGNoIGhhbmRsZXIgcnVucywgc28gY2hlY2sgYWdhaW5cbiAgICAvLyBiZWZvcmUgcmV0dXJuaW5nIGEgbWFwcGVkIHN5bmMgdmFsdWUuXG4gICAgY29uc3QgY2F0Y2hDb250cm9sRXJyb3IgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoZXJyb3IpXG5cbiAgICBpZiAoY2F0Y2hDb250cm9sRXJyb3IpIHtcbiAgICAgIHJldHVybiBjYXRjaENvbnRyb2xFcnJvclxuICAgIH1cblxuICAgIHJldHVybiBtYXBwZWRcbiAgfVxuXG4gIGFzeW5jICNydW5BdHRlbXB0TG9vcChhdHRlbXB0OiBudW1iZXIpOiBQcm9taXNlPFQgfCBFIHwgUnVubmVyRXJyb3I+IHtcbiAgICBsZXQgY3VycmVudEF0dGVtcHQgPSBhdHRlbXB0XG4gICAgbGV0IGN1cnJlbnREZWNpc2lvbjogUmV0cnlEZWNpc2lvbiB8IHVuZGVmaW5lZFxuXG4gICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xCZWZvcmVBdHRlbXB0ID0gdGhpcy5jaGVja0RpZENvbnRyb2xGYWlsKClcblxuICAgICAgaWYgKGNvbnRyb2xCZWZvcmVBdHRlbXB0KSB7XG4gICAgICAgIHJldHVybiBjb250cm9sQmVmb3JlQXR0ZW1wdFxuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudERlY2lzaW9uKSB7XG4gICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGNvbnN0IGRlbGF5Q29udHJvbFJlc3VsdCA9IGF3YWl0IHRoaXMud2FpdEZvclJldHJ5RGVsYXkoY3VycmVudERlY2lzaW9uLmRlbGF5KVxuXG4gICAgICAgIGlmIChkZWxheUNvbnRyb2xSZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gZGVsYXlDb250cm9sUmVzdWx0XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50RGVjaXNpb24gPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdHgucmV0cnkuYXR0ZW1wdCA9IGN1cnJlbnRBdHRlbXB0XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3RyeUZuKHRoaXMuY3R4IGFzIHVua25vd24gYXMgQ3R4KVxuXG4gICAgICAgIGlmIChjaGVja0lzUHJvbWlzZUxpa2UocmVzdWx0KSkge1xuICAgICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgY29uc3QgcmFjZWQgPSBhd2FpdCB0aGlzLnJhY2UocmVzdWx0KVxuICAgICAgICAgIHJldHVybiByYWNlZFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVN5bmNTdWNjZXNzKHJlc3VsdClcbiAgICAgIH0gY2F0Y2ggKGF0dGVtcHRFcnJvcikge1xuICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMuI3Jlc29sdmVGYWlsdXJlKGF0dGVtcHRFcnJvcilcblxuICAgICAgICBpZiAoIShyZXNvbHZlZCBpbnN0YW5jZW9mIFJldHJ5RGlyZWN0aXZlKSkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlZFxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudERlY2lzaW9uID0gcmVzb2x2ZWQuZGVjaXNpb25cbiAgICAgICAgY3VycmVudEF0dGVtcHQgKz0gMVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVJ1bjxULCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4PihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICBpbnB1dDogUnVuVHJ5Rm48VCwgQ3R4PlxuKTogUHJvbWlzZTxUIHwgVW5oYW5kbGVkRXhjZXB0aW9uPlxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVSdW48VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eD4oXG4gIGNvbmZpZzogQnVpbGRlckNvbmZpZyxcbiAgaW5wdXQ6IEFzeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4PlxuKTogUHJvbWlzZTxUIHwgRSB8IFJ1bm5lckVycm9yPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVSdW48VCwgRSwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eD4oXG4gIGNvbmZpZzogQnVpbGRlckNvbmZpZyxcbiAgaW5wdXQ6IEFzeW5jUnVuSW5wdXQ8VCwgRSwgQ3R4PlxuKTogUHJvbWlzZTxUIHwgRSB8IFJ1bm5lckVycm9yPiB7XG4gIHVzaW5nIGV4ZWN1dGlvbiA9IG5ldyBSdW5FeGVjdXRpb248VCwgRSwgQ3R4Pihjb25maWcsIGlucHV0KVxuICByZXR1cm4gYXdhaXQgZXhlY3V0aW9uLmV4ZWN1dGUoKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJ1aWxkZXJDb25maWcgfSBmcm9tIFwiLi4vYnVpbGRlclwiXG5pbXBvcnQgdHlwZSB7IFJ1bm5lckVycm9yIH0gZnJvbSBcIi4vYmFzZVwiXG5pbXBvcnQgdHlwZSB7IEJhc2VUcnlDdHgsIE5vblByb21pc2UgfSBmcm9tIFwiLi9zaGFyZWRcIlxuaW1wb3J0IHtcbiAgQ29udHJvbEVycm9yLFxuICBQYW5pYyxcbiAgUmV0cnlFeGhhdXN0ZWRFcnJvcixcbiAgVW5oYW5kbGVkRXhjZXB0aW9uLFxuICB0eXBlIFBhbmljQ29kZSxcbn0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBjaGVja0lzUHJvbWlzZUxpa2UsIGludmFyaWFudCB9IGZyb20gXCIuLi91dGlsc1wiXG5pbXBvcnQgeyBCYXNlRXhlY3V0aW9uLCBSZXRyeURpcmVjdGl2ZSB9IGZyb20gXCIuL2Jhc2VcIlxuXG5leHBvcnQgdHlwZSBTeW5jUnVuVHJ5Rm48VCwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eCA9IEJhc2VUcnlDdHg+ID0gKGN0eDogQ3R4KSA9PiBOb25Qcm9taXNlPFQ+XG5leHBvcnQgdHlwZSBTeW5jUnVuQ2F0Y2hGbjxFPiA9IChlcnJvcjogdW5rbm93bikgPT4gTm9uUHJvbWlzZTxFPlxuXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNSdW5PcHRpb25zPFQsIEUsIEN0eCBleHRlbmRzIEJhc2VUcnlDdHggPSBCYXNlVHJ5Q3R4PiB7XG4gIHRyeTogU3luY1J1blRyeUZuPFQsIEN0eD5cbiAgY2F0Y2g6IFN5bmNSdW5DYXRjaEZuPEU+XG59XG5cbmV4cG9ydCB0eXBlIFN5bmNSdW5JbnB1dDxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4ID0gQmFzZVRyeUN0eD4gPVxuICB8IFN5bmNSdW5UcnlGbjxULCBDdHg+XG4gIHwgU3luY1J1bk9wdGlvbnM8VCwgRSwgQ3R4PlxuXG5mdW5jdGlvbiBhc3NlcnROb3RQcm9taXNlTGlrZSh2YWx1ZTogdW5rbm93biwgY29kZTogUGFuaWNDb2RlLCBtZXNzYWdlPzogc3RyaW5nKTogdm9pZCB7XG4gIGludmFyaWFudChcbiAgICAhY2hlY2tJc1Byb21pc2VMaWtlKHZhbHVlKSxcbiAgICBuZXcgUGFuaWMoY29kZSwgbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogeyBtZXNzYWdlIH0pXG4gIClcbn1cblxuY2xhc3MgUnVuU3luY0V4ZWN1dGlvbjxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4PiBleHRlbmRzIEJhc2VFeGVjdXRpb248VCB8IEUgfCBSdW5uZXJFcnJvcj4ge1xuICAjY2F0Y2hGbjogU3luY1J1bkNhdGNoRm48RT4gfCB1bmRlZmluZWRcbiAgI3RyeUZuOiBTeW5jUnVuVHJ5Rm48VCwgQ3R4PlxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQnVpbGRlckNvbmZpZywgaW5wdXQ6IFN5bmNSdW5JbnB1dDxULCBFLCBDdHg+KSB7XG4gICAgc3VwZXIoY29uZmlnKVxuXG4gICAgdGhpcy4jY2F0Y2hGbiA9IHR5cGVvZiBpbnB1dCA9PT0gXCJmdW5jdGlvblwiID8gdW5kZWZpbmVkIDogaW5wdXQuY2F0Y2hcbiAgICB0aGlzLiN0cnlGbiA9IHR5cGVvZiBpbnB1dCA9PT0gXCJmdW5jdGlvblwiID8gaW5wdXQgOiBpbnB1dC50cnlcbiAgfVxuXG4gIG92ZXJyaWRlIGV4ZWN1dGUoKTogVCB8IEUgfCBSdW5uZXJFcnJvciB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuZXhlY3V0ZSgpXG4gICAgYXNzZXJ0Tm90UHJvbWlzZUxpa2UocmVzdWx0LCBcIlJVTl9TWU5DX1dSQVBQRURfUkVTVUxUX1BST01JU0VcIilcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZXhlY3V0ZUNvcmUoKTogVCB8IEUgfCBSdW5uZXJFcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuI3J1bkF0dGVtcHRMb29wKDEpXG4gIH1cblxuICAjcmVzb2x2ZUZhaWx1cmUoZXJyb3I6IHVua25vd24pOiBFIHwgUnVubmVyRXJyb3IgfCBSZXRyeURpcmVjdGl2ZSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUGFuaWMpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29udHJvbEVycm9yKSB7XG4gICAgICByZXR1cm4gZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sRXJyb3IgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoZXJyb3IpXG5cbiAgICBpZiAoY29udHJvbEVycm9yKSB7XG4gICAgICByZXR1cm4gY29udHJvbEVycm9yXG4gICAgfVxuXG4gICAgY29uc3QgcmV0cnlEZWNpc2lvbiA9IHRoaXMuYnVpbGRSZXRyeURlY2lzaW9uKGVycm9yKVxuXG4gICAgaWYgKHJldHJ5RGVjaXNpb24uc2hvdWxkQXR0ZW1wdFJldHJ5KSB7XG4gICAgICByZXR1cm4gbmV3IFJldHJ5RGlyZWN0aXZlKHJldHJ5RGVjaXNpb24pXG4gICAgfVxuXG4gICAgaWYgKHJldHJ5RGVjaXNpb24uaXNSZXRyeUV4aGF1c3RlZCkge1xuICAgICAgcmV0dXJuIG5ldyBSZXRyeUV4aGF1c3RlZEVycm9yKHVuZGVmaW5lZCwgeyBjYXVzZTogZXJyb3IgfSlcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuI2NhdGNoRm4pIHtcbiAgICAgIC8vIEV2ZW4gd2l0aG91dCBhIGNhdGNoIGhhbmRsZXIsIGNhbmNlbGxhdGlvbi90aW1lb3V0IG1heSBoYXZlIHdvbiBzaW5jZVxuICAgICAgLy8gdGhlIG9yaWdpbmFsIGZhaWx1cmUgd2FzIGZpcnN0IG9ic2VydmVkLlxuICAgICAgY29uc3QgZmluYWxpemVDb250cm9sRXJyb3IgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoZXJyb3IpXG5cbiAgICAgIGlmIChmaW5hbGl6ZUNvbnRyb2xFcnJvcikge1xuICAgICAgICByZXR1cm4gZmluYWxpemVDb250cm9sRXJyb3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBVbmhhbmRsZWRFeGNlcHRpb24odW5kZWZpbmVkLCB7IGNhdXNlOiBlcnJvciB9KVxuICAgIH1cblxuICAgIGxldCBtYXBwZWQ6IEVcblxuICAgIHRyeSB7XG4gICAgICBtYXBwZWQgPSB0aGlzLiNjYXRjaEZuKGVycm9yKVxuICAgIH0gY2F0Y2ggKGNhdGNoRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBQYW5pYyhcIlJVTl9TWU5DX0NBVENIX0hBTkRMRVJfVEhST1dcIiwgeyBjYXVzZTogY2F0Y2hFcnJvciB9KVxuICAgIH1cblxuICAgIGFzc2VydE5vdFByb21pc2VMaWtlKG1hcHBlZCwgXCJSVU5fU1lOQ19DQVRDSF9QUk9NSVNFXCIpXG5cbiAgICAvLyBDb250cm9sIHN0YXRlIGNhbiBjaGFuZ2Ugd2hpbGUgdGhlIGNhdGNoIGhhbmRsZXIgcnVucywgc28gY2hlY2sgYWdhaW5cbiAgICAvLyBiZWZvcmUgcmV0dXJuaW5nIGEgbWFwcGVkIHN5bmMgdmFsdWUuXG4gICAgY29uc3QgY2F0Y2hDb250cm9sRXJyb3IgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoZXJyb3IpXG5cbiAgICBpZiAoY2F0Y2hDb250cm9sRXJyb3IpIHtcbiAgICAgIHJldHVybiBjYXRjaENvbnRyb2xFcnJvclxuICAgIH1cblxuICAgIHJldHVybiBtYXBwZWRcbiAgfVxuXG4gICNydW5BdHRlbXB0TG9vcChhdHRlbXB0OiBudW1iZXIpOiBUIHwgRSB8IFJ1bm5lckVycm9yIHtcbiAgICBsZXQgY3VycmVudEF0dGVtcHQgPSBhdHRlbXB0XG5cbiAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgY29udHJvbEJlZm9yZUF0dGVtcHQgPSB0aGlzLmNoZWNrRGlkQ29udHJvbEZhaWwoKVxuXG4gICAgICBpZiAoY29udHJvbEJlZm9yZUF0dGVtcHQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xCZWZvcmVBdHRlbXB0XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3R4LnJldHJ5LmF0dGVtcHQgPSBjdXJyZW50QXR0ZW1wdFxuXG4gICAgICBsZXQgcmVzdWx0OiBOb25Qcm9taXNlPFQ+XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuI3RyeUZuKHRoaXMuY3R4IGFzIHVua25vd24gYXMgQ3R4KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLiNyZXNvbHZlRmFpbHVyZShlcnJvcilcblxuICAgICAgICBpZiAocmVzb2x2ZWQgaW5zdGFuY2VvZiBSZXRyeURpcmVjdGl2ZSkge1xuICAgICAgICAgIGlmIChyZXNvbHZlZC5kZWNpc2lvbi5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYW5pYyhcIlJVTl9TWU5DX0FTWU5DX1JFVFJZX1BPTElDWVwiKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGN1cnJlbnRBdHRlbXB0ICs9IDFcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG5cbiAgICAgIGFzc2VydE5vdFByb21pc2VMaWtlKHJlc3VsdCwgXCJSVU5fU1lOQ19UUllfUFJPTUlTRVwiKVxuXG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlU3luY1N1Y2Nlc3MocmVzdWx0KVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVJ1blN5bmM8VCwgQ3R4IGV4dGVuZHMgQmFzZVRyeUN0eD4oXG4gIGNvbmZpZzogQnVpbGRlckNvbmZpZyxcbiAgaW5wdXQ6IFN5bmNSdW5UcnlGbjxULCBDdHg+XG4pOiBUIHwgVW5oYW5kbGVkRXhjZXB0aW9uIHwgUnVubmVyRXJyb3JcbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlUnVuU3luYzxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4PihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICBpbnB1dDogU3luY1J1bklucHV0PFQsIEUsIEN0eD5cbik6IFQgfCBFIHwgUnVubmVyRXJyb3JcbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlUnVuU3luYzxULCBFLCBDdHggZXh0ZW5kcyBCYXNlVHJ5Q3R4PihcbiAgY29uZmlnOiBCdWlsZGVyQ29uZmlnLFxuICBpbnB1dDogU3luY1J1bklucHV0PFQsIEUsIEN0eD5cbik6IFQgfCBFIHwgUnVubmVyRXJyb3Ige1xuICAvLyBCdWlsZGVyIHR5cGluZyBibG9ja3MgYXN5bmMtb25seSByZXRyeSBwb2xpY2llcywgYnV0IGRpcmVjdCBleGVjdXRvciB1c2FnZSBhbmRcbiAgLy8gdW5zYWZlIGNhc3RzIHN0aWxsIG5lZWQgYSBydW50aW1lIGd1YXJkIGhlcmUuXG4gIGNvbnN0IGlzU3luY1NhZmVSZXRyeVBvbGljeSA9XG4gICAgY29uZmlnLnJldHJ5ID09PSB1bmRlZmluZWQgfHxcbiAgICAoY29uZmlnLnJldHJ5LmJhY2tvZmYgPT09IFwiY29uc3RhbnRcIiAmJlxuICAgICAgIWNvbmZpZy5yZXRyeS5qaXR0ZXIgJiZcbiAgICAgIChjb25maWcucmV0cnkuZGVsYXlNcyA/PyAwKSA8PSAwKVxuXG4gIGludmFyaWFudChpc1N5bmNTYWZlUmV0cnlQb2xpY3ksIG5ldyBQYW5pYyhcIlJVTl9TWU5DX0FTWU5DX1JFVFJZX1BPTElDWVwiKSlcblxuICB1c2luZyBleGVjdXRpb24gPSBuZXcgUnVuU3luY0V4ZWN1dGlvbjxULCBFLCBDdHg+KGNvbmZpZywgaW5wdXQpXG4gIHJldHVybiBleGVjdXRpb24uZXhlY3V0ZSgpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHtcbiAgQ2FuY2VsbGF0aW9uRXJyb3IsXG4gIFJldHJ5RXhoYXVzdGVkRXJyb3IsXG4gIFRpbWVvdXRFcnJvcixcbiAgVW5oYW5kbGVkRXhjZXB0aW9uLFxufSBmcm9tIFwiLi9lcnJvcnNcIlxuaW1wb3J0IHR5cGUge1xuICBJbmZlcnJlZFRhc2tDb250ZXh0LFxuICBUYXNrUmVjb3JkLFxuICBUYXNrUmVzdWx0LFxuICBUYXNrVmFsaWRhdGlvbixcbiAgQWxsT3B0aW9ucyxcbiAgQWxsU2V0dGxlZFJlc3VsdCxcbiAgVHJ5Q3R4LFxuICBUcnlDdHhGb3IsXG59IGZyb20gXCIuL2V4ZWN1dG9ycy9zaGFyZWRcIlxuaW1wb3J0IHR5cGUgeyBSZXRyeU9wdGlvbnMsIFJldHJ5UG9saWN5IH0gZnJvbSBcIi4vbW9kaWZpZXJzL3JldHJ5XCJcbmltcG9ydCB7IFBhbmljIH0gZnJvbSBcIi4vZXJyb3JzXCJcbmltcG9ydCB7IGV4ZWN1dGVBbGwgfSBmcm9tIFwiLi9leGVjdXRvcnMvYWxsXCJcbmltcG9ydCB7IGV4ZWN1dGVBbGxTZXR0bGVkIH0gZnJvbSBcIi4vZXhlY3V0b3JzL2FsbC1zZXR0bGVkXCJcbmltcG9ydCB7IGV4ZWN1dGVGbG93LCB0eXBlIEZsb3dSZXN1bHQsIHR5cGUgSW5mZXJyZWRGbG93VGFza0NvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRvcnMvZmxvd1wiXG5pbXBvcnQgeyBleGVjdXRlUnVuLCB0eXBlIEFzeW5jUnVuSW5wdXQsIHR5cGUgUnVuVHJ5Rm4gfSBmcm9tIFwiLi9leGVjdXRvcnMvcnVuXCJcbmltcG9ydCB7IGV4ZWN1dGVSdW5TeW5jLCB0eXBlIFN5bmNSdW5JbnB1dCwgdHlwZSBTeW5jUnVuVHJ5Rm4gfSBmcm9tIFwiLi9leGVjdXRvcnMvcnVuLXN5bmNcIlxuaW1wb3J0IHsgcmV0cnlPcHRpb25zIH0gZnJvbSBcIi4vbW9kaWZpZXJzL3JldHJ5XCJcbmltcG9ydCB7IGludmFyaWFudCB9IGZyb20gXCIuL3V0aWxzXCJcblxuLyoqXG4gKiBXcmFwcyBhcmUgb2JzZXJ2YXRpb25hbCBob29rczogdGhleSBjYW4gaW5zcGVjdCBleGVjdXRpb24gY29udGV4dCBhbmRcbiAqIHN1cnJvdW5kIGV4ZWN1dGlvbiwgYnV0IHRoZXkgbXVzdCBub3QgbXV0YXRlIGNvbnRleHQgb3IgcmVwbGFjZSBpdC5cbiAqL1xuZXhwb3J0IHR5cGUgV3JhcEN0eCA9IFJlYWRvbmx5PE9taXQ8VHJ5Q3R4LCBcInJldHJ5XCI+PiAmIHtcbiAgcmVhZG9ubHkgcmV0cnk6IFJlYWRvbmx5PFRyeUN0eFtcInJldHJ5XCJdPlxufVxuXG50eXBlIFdyYXBGbiA9IChjdHg6IFdyYXBDdHgsIG5leHQ6ICgpID0+IHVua25vd24pID0+IHVua25vd25cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZGVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIFJldHJ5IGNvbmZpZ3VyYXRpb24gYXBwbGllZCB0byB0aGUgcnVuLlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeVxuICAvKipcbiAgICogVGltZW91dCBjb25maWd1cmF0aW9uIGFwcGxpZWQgdG8gdGhlIHJ1bi5cbiAgICovXG4gIHRpbWVvdXQ/OiBudW1iZXJcbiAgLyoqXG4gICAqIEFib3J0IHNpZ25hbHMgdXNlZCB0byBjYW5jZWwgZXhlY3V0aW9uLlxuICAgKi9cbiAgc2lnbmFscz86IEFib3J0U2lnbmFsW11cbiAgLyoqXG4gICAqIFdyYXBwZXIgbWlkZGxld2FyZSBjaGFpbiBhcm91bmQgZXhlY3V0aW9uLlxuICAgKi9cbiAgd3JhcHM/OiBXcmFwRm5bXVxufVxuXG50eXBlIENvbmZpZ1J1bkVycm9ycyA9IFJldHJ5RXhoYXVzdGVkRXJyb3IgfCBUaW1lb3V0RXJyb3IgfCBDYW5jZWxsYXRpb25FcnJvclxudHlwZSBPcmNoZXN0cmF0aW9uTWV0aG9kcyA9IFwiYWxsXCIgfCBcImFsbFNldHRsZWRcIiB8IFwiZmxvd1wiXG50eXBlIFNpZ25hbEJ1aWxkZXJIaWRkZW5NZXRob2RzPFN1cHBvcnRzT3JjaGVzdHJhdGlvbiBleHRlbmRzIGJvb2xlYW4+ID1cbiAgfCBcInJ1blN5bmNcIlxuICB8IFwid3JhcFwiXG4gIHwgKFN1cHBvcnRzT3JjaGVzdHJhdGlvbiBleHRlbmRzIHRydWUgPyBuZXZlciA6IE9yY2hlc3RyYXRpb25NZXRob2RzKVxudHlwZSBFeGVjdXRpb25CdWlsZGVyU3VyZmFjZTxFIGV4dGVuZHMgQ29uZmlnUnVuRXJyb3JzLCBIYXNSZXRyeSBleHRlbmRzIGJvb2xlYW4+ID0gT21pdDxcbiAgUnVuQnVpbGRlcjxFLCBIYXNSZXRyeSwgZmFsc2U+LFxuICBPcmNoZXN0cmF0aW9uTWV0aG9kcyB8IFwid3JhcFwiXG4+XG50eXBlIEFzeW5jRXhlY3V0aW9uQnVpbGRlclN1cmZhY2U8RSBleHRlbmRzIENvbmZpZ1J1bkVycm9ycywgSGFzUmV0cnkgZXh0ZW5kcyBib29sZWFuPiA9IE9taXQ8XG4gIFJ1bkJ1aWxkZXI8RSwgSGFzUmV0cnksIGZhbHNlPixcbiAgT3JjaGVzdHJhdGlvbk1ldGhvZHMgfCBcInJ1blN5bmNcIiB8IFwid3JhcFwiXG4+XG50eXBlIFNpZ25hbEJ1aWxkZXJTdXJmYWNlPFxuICBFIGV4dGVuZHMgQ29uZmlnUnVuRXJyb3JzLFxuICBIYXNSZXRyeSBleHRlbmRzIGJvb2xlYW4sXG4gIFN1cHBvcnRzT3JjaGVzdHJhdGlvbiBleHRlbmRzIGJvb2xlYW4sXG4+ID0gT21pdDxcbiAgUnVuQnVpbGRlcjxFLCBIYXNSZXRyeSwgU3VwcG9ydHNPcmNoZXN0cmF0aW9uPixcbiAgU2lnbmFsQnVpbGRlckhpZGRlbk1ldGhvZHM8U3VwcG9ydHNPcmNoZXN0cmF0aW9uPlxuPlxuXG5leHBvcnQgY2xhc3MgUnVuQnVpbGRlcjxcbiAgRSBleHRlbmRzIENvbmZpZ1J1bkVycm9ycyA9IG5ldmVyLFxuICBIYXNSZXRyeSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbiAgU3VwcG9ydHNPcmNoZXN0cmF0aW9uIGV4dGVuZHMgYm9vbGVhbiA9IHRydWUsXG4+IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZzogQnVpbGRlckNvbmZpZ1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQnVpbGRlckNvbmZpZyA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWdcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFJldHJ5Q29uZmlnKHBvbGljeTogUmV0cnlPcHRpb25zKTogQnVpbGRlckNvbmZpZyB7XG4gICAgY29uc3QgbGltaXQgPSB0eXBlb2YgcG9saWN5ID09PSBcIm51bWJlclwiID8gcG9saWN5IDogcG9saWN5LmxpbWl0XG5cbiAgICBpbnZhcmlhbnQoTnVtYmVyLmlzRmluaXRlKGxpbWl0KSwgbmV3IFBhbmljKFwiUkVUUllfSU5WQUxJRF9MSU1JVFwiKSlcbiAgICBpbnZhcmlhbnQobGltaXQgPj0gMCwgbmV3IFBhbmljKFwiUkVUUllfSU5WQUxJRF9MSU1JVFwiKSlcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHJldHJ5OiByZXRyeU9wdGlvbnMocG9saWN5KSxcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRUaW1lb3V0Q29uZmlnKG1zOiBudW1iZXIpOiBCdWlsZGVyQ29uZmlnIHtcbiAgICBpbnZhcmlhbnQoTnVtYmVyLmlzRmluaXRlKG1zKSwgbmV3IFBhbmljKFwiVElNRU9VVF9JTlZBTElEX01TXCIpKVxuICAgIGludmFyaWFudChtcyA+PSAwLCBuZXcgUGFuaWMoXCJUSU1FT1VUX0lOVkFMSURfTVNcIikpXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICB0aW1lb3V0OiBtcyxcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRTaWduYWxDb25maWcoc2lnbmFsOiBBYm9ydFNpZ25hbCk6IEJ1aWxkZXJDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHNpZ25hbHM6IFsuLi4odGhpcy5jb25maWcuc2lnbmFscyA/PyBbXSksIHNpZ25hbF0sXG4gICAgfVxuICB9XG5cbiAgcmV0cnkocG9saWN5OiBudW1iZXIpOiBFeGVjdXRpb25CdWlsZGVyU3VyZmFjZTxFIHwgUmV0cnlFeGhhdXN0ZWRFcnJvciwgdHJ1ZT5cbiAgcmV0cnkocG9saWN5OiBSZXRyeU9wdGlvbnMpOiBBc3luY0V4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUgfCBSZXRyeUV4aGF1c3RlZEVycm9yLCB0cnVlPlxuICByZXRyeShwb2xpY3k6IFJldHJ5T3B0aW9ucyk6IEV4ZWN1dGlvbkJ1aWxkZXJTdXJmYWNlPEUgfCBSZXRyeUV4aGF1c3RlZEVycm9yLCB0cnVlPiB7XG4gICAgcmV0dXJuIG5ldyBFeGVjdXRpb25CdWlsZGVyKHRoaXMuYnVpbGRSZXRyeUNvbmZpZyhwb2xpY3kpKVxuICB9XG5cbiAgdGltZW91dChtczogbnVtYmVyKTogQXN5bmNFeGVjdXRpb25CdWlsZGVyU3VyZmFjZTxFIHwgVGltZW91dEVycm9yLCBIYXNSZXRyeT4ge1xuICAgIHJldHVybiBuZXcgRXhlY3V0aW9uQnVpbGRlcih0aGlzLmJ1aWxkVGltZW91dENvbmZpZyhtcykpXG4gIH1cblxuICBzaWduYWwoXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbFxuICApOiBTaWduYWxCdWlsZGVyU3VyZmFjZTxFIHwgQ2FuY2VsbGF0aW9uRXJyb3IsIEhhc1JldHJ5LCBTdXBwb3J0c09yY2hlc3RyYXRpb24+IHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEV4ZWN1dGlvbkJ1aWxkZXIpIHtcbiAgICAgIHJldHVybiBuZXcgRXhlY3V0aW9uQnVpbGRlcihcbiAgICAgICAgdGhpcy5idWlsZFNpZ25hbENvbmZpZyhzaWduYWwpXG4gICAgICApIGFzIHVua25vd24gYXMgU2lnbmFsQnVpbGRlclN1cmZhY2U8RSB8IENhbmNlbGxhdGlvbkVycm9yLCBIYXNSZXRyeSwgU3VwcG9ydHNPcmNoZXN0cmF0aW9uPlxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUnVuQnVpbGRlcih0aGlzLmJ1aWxkU2lnbmFsQ29uZmlnKHNpZ25hbCkpIGFzIHVua25vd24gYXMgU2lnbmFsQnVpbGRlclN1cmZhY2U8XG4gICAgICBFIHwgQ2FuY2VsbGF0aW9uRXJyb3IsXG4gICAgICBIYXNSZXRyeSxcbiAgICAgIFN1cHBvcnRzT3JjaGVzdHJhdGlvblxuICAgID5cbiAgfVxuXG4gIHdyYXAoZm46IFdyYXBGbik6IFJ1bkJ1aWxkZXI8RSwgSGFzUmV0cnksIFN1cHBvcnRzT3JjaGVzdHJhdGlvbj4ge1xuICAgIHJldHVybiBuZXcgUnVuQnVpbGRlcih7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHdyYXBzOiBbLi4uKHRoaXMuY29uZmlnLndyYXBzID8/IFtdKSwgZm5dLFxuICAgIH0pXG4gIH1cblxuICBydW48VD4odHJ5Rm46IFJ1blRyeUZuPFQsIFRyeUN0eEZvcjxIYXNSZXRyeT4+KTogUHJvbWlzZTxUIHwgVW5oYW5kbGVkRXhjZXB0aW9uIHwgRT5cbiAgcnVuPFQsIEM+KG9wdGlvbnM6IEFzeW5jUnVuSW5wdXQ8VCwgQywgVHJ5Q3R4Rm9yPEhhc1JldHJ5Pj4pOiBQcm9taXNlPFQgfCBDIHwgRT5cbiAgcnVuPFQsIEM+KGlucHV0OiBBc3luY1J1bklucHV0PFQsIEMsIFRyeUN0eEZvcjxIYXNSZXRyeT4+KSB7XG4gICAgcmV0dXJuIGV4ZWN1dGVSdW4odGhpcy5jb25maWcsIGlucHV0KVxuICB9XG5cbiAgcnVuU3luYzxUPih0cnlGbjogU3luY1J1blRyeUZuPFQsIFRyeUN0eEZvcjxIYXNSZXRyeT4+KTogVCB8IFVuaGFuZGxlZEV4Y2VwdGlvbiB8IEVcbiAgcnVuU3luYzxULCBDPihpbnB1dDogU3luY1J1bklucHV0PFQsIEMsIFRyeUN0eEZvcjxIYXNSZXRyeT4+KTogVCB8IEMgfCBFXG4gIHJ1blN5bmM8VCwgQz4oaW5wdXQ6IFN5bmNSdW5JbnB1dDxULCBDLCBUcnlDdHhGb3I8SGFzUmV0cnk+Pikge1xuICAgIHJldHVybiBleGVjdXRlUnVuU3luYyh0aGlzLmNvbmZpZywgaW5wdXQpXG4gIH1cblxuICBhbGw8VCBleHRlbmRzIFRhc2tSZWNvcmQsIEMgPSBuZXZlcj4oXG4gICAgdGFza3M6IFQgJiBUYXNrVmFsaWRhdGlvbjxOb0luZmVyPFQ+PiAmIFRoaXNUeXBlPEluZmVycmVkVGFza0NvbnRleHQ8VD4+LFxuICAgIG9wdGlvbnM/OiBBbGxPcHRpb25zPFQsIEM+XG4gICk6IFByb21pc2U8eyBbSyBpbiBrZXlvZiBUXTogVGFza1Jlc3VsdDxUW0tdPiB9IHwgQz4ge1xuICAgIHJldHVybiBleGVjdXRlQWxsKHRoaXMuY29uZmlnLCB0YXNrcywgb3B0aW9ucylcbiAgfVxuXG4gIGFsbFNldHRsZWQ8VCBleHRlbmRzIFRhc2tSZWNvcmQ+KFxuICAgIHRhc2tzOiBUICYgVGFza1ZhbGlkYXRpb248Tm9JbmZlcjxUPj4gJiBUaGlzVHlwZTxJbmZlcnJlZFRhc2tDb250ZXh0PFQ+PlxuICApOiBQcm9taXNlPEFsbFNldHRsZWRSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gZXhlY3V0ZUFsbFNldHRsZWQodGhpcy5jb25maWcsIHRhc2tzKVxuICB9XG5cbiAgZmxvdzxUIGV4dGVuZHMgVGFza1JlY29yZD4oXG4gICAgdGFza3M6IFQgJiBUaGlzVHlwZTxJbmZlcnJlZEZsb3dUYXNrQ29udGV4dDxUPj5cbiAgKTogUHJvbWlzZTxGbG93UmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIGV4ZWN1dGVGbG93KHRoaXMuY29uZmlnLCB0YXNrcylcbiAgfVxufVxuXG5jbGFzcyBFeGVjdXRpb25CdWlsZGVyPFxuICBFIGV4dGVuZHMgQ29uZmlnUnVuRXJyb3JzID0gbmV2ZXIsXG4gIEhhc1JldHJ5IGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPiBleHRlbmRzIFJ1bkJ1aWxkZXI8RSwgSGFzUmV0cnksIGZhbHNlPiB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQnVpbGRlckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKVxuXG4gICAgLy8gUmV0cnkvdGltZW91dCBjaGFpbnMgbXVzdCBub3Qgc2lsZW50bHkga2VlcCBvcmNoZXN0cmF0aW9uIGVudHJ5cG9pbnRzIGF0XG4gICAgLy8gcnVudGltZSwgZXZlbiB0aG91Z2ggdGhlIHR5cGUgc3VyZmFjZSBhbHJlYWR5IHJlbW92ZXMgdGhlbS5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICBhbGw6IHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkLCB3cml0YWJsZTogZmFsc2UgfSxcbiAgICAgIGFsbFNldHRsZWQ6IHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkLCB3cml0YWJsZTogZmFsc2UgfSxcbiAgICAgIGZsb3c6IHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkLCB3cml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHdyYXA6IHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkLCB3cml0YWJsZTogZmFsc2UgfSxcbiAgICB9KVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IGNyZWF0ZUFzeW5jRGlzcG9zZXIsIHR5cGUgQXN5bmNEaXNwb3NlciB9IGZyb20gXCIuLi9zaGltcy9kaXNwb3NlclwiXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlKCk6IEFzeW5jRGlzcG9zZXIge1xuICByZXR1cm4gY3JlYXRlQXN5bmNEaXNwb3NlcigpXG59XG4iLAogICAgImltcG9ydCB7IGNoZWNrSXNQcm9taXNlTGlrZSB9IGZyb20gXCIuL3V0aWxzXCJcblxudHlwZSBHZW5VbndyYXA8VD4gPSBFeGNsdWRlPEF3YWl0ZWQ8VD4sIEVycm9yPlxuZXhwb3J0IHR5cGUgR2VuVXNlID0gPFQ+KHZhbHVlOiBUKSA9PiBHZW5lcmF0b3I8VCwgR2VuVW53cmFwPFQ+LCBHZW5VbndyYXA8VD4+XG5cbnR5cGUgR2VuRXJyb3JzPFRZaWVsZD4gPSBFeHRyYWN0PEF3YWl0ZWQ8VFlpZWxkPiwgRXJyb3I+XG50eXBlIENoZWNrSXNBc3luYzxUWWllbGQsIFRSZXR1cm4+ID1cbiAgRXh0cmFjdDxUWWllbGQgfCBUUmV0dXJuLCBQcm9taXNlTGlrZTx1bmtub3duPj4gZXh0ZW5kcyBuZXZlciA/IGZhbHNlIDogdHJ1ZVxuXG5leHBvcnQgdHlwZSBHZW5SZXN1bHQ8VFlpZWxkLCBUUmV0dXJuPiA9XG4gIENoZWNrSXNBc3luYzxUWWllbGQsIFRSZXR1cm4+IGV4dGVuZHMgdHJ1ZVxuICAgID8gUHJvbWlzZTxBd2FpdGVkPFRSZXR1cm4+IHwgR2VuRXJyb3JzPFRZaWVsZD4+XG4gICAgOiBBd2FpdGVkPFRSZXR1cm4+IHwgR2VuRXJyb3JzPFRZaWVsZD5cblxuZnVuY3Rpb24qIHVzZTxUPih2YWx1ZTogVCk6IEdlbmVyYXRvcjxULCBHZW5VbndyYXA8VD4sIEdlblVud3JhcDxUPj4ge1xuICByZXR1cm4geWllbGQgdmFsdWVcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFzeW5jR2VuZXJhdG9yPFRZaWVsZCwgVFJldHVybj4oXG4gIGl0ZXJhdG9yOiBHZW5lcmF0b3I8VFlpZWxkLCBUUmV0dXJuLCB1bmtub3duPixcbiAgaW5pdGlhbFN0ZXA6IEl0ZXJhdG9yUmVzdWx0PFRZaWVsZCwgVFJldHVybj5cbik6IFByb21pc2U8QXdhaXRlZDxUUmV0dXJuPiB8IEdlbkVycm9yczxUWWllbGQ+PiB7XG4gIGxldCBjdXJyZW50U3RlcCA9IGluaXRpYWxTdGVwXG5cbiAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGN1cnJlbnRTdGVwLmRvbmUpIHtcbiAgICAgIGlmIChjaGVja0lzUHJvbWlzZUxpa2UoY3VycmVudFN0ZXAudmFsdWUpKSB7XG4gICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIHJldHVybiBhd2FpdCBjdXJyZW50U3RlcC52YWx1ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3VycmVudFN0ZXAudmFsdWUgYXMgQXdhaXRlZDxUUmV0dXJuPlxuICAgIH1cblxuICAgIGxldCBjdXJyZW50VmFsdWU6IHVua25vd25cblxuICAgIGlmIChjaGVja0lzUHJvbWlzZUxpa2UoY3VycmVudFN0ZXAudmFsdWUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICBjdXJyZW50VmFsdWUgPSBhd2FpdCBjdXJyZW50U3RlcC52YWx1ZVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY3VycmVudFN0ZXAgPSBpdGVyYXRvci50aHJvdyhlcnJvcilcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFN0ZXAudmFsdWVcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWUgYXMgR2VuRXJyb3JzPFRZaWVsZD5cbiAgICB9XG5cbiAgICBjdXJyZW50U3RlcCA9IGl0ZXJhdG9yLm5leHQoY3VycmVudFZhbHVlKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcml2ZUdlbjxUWWllbGQsIFRSZXR1cm4+KFxuICBmYWN0b3J5OiAodXNlRm46IEdlblVzZSkgPT4gR2VuZXJhdG9yPFRZaWVsZCwgVFJldHVybiwgdW5rbm93bj5cbik6IEdlblJlc3VsdDxUWWllbGQsIFRSZXR1cm4+IHtcbiAgY29uc3QgaXRlcmF0b3IgPSBmYWN0b3J5KHVzZSlcblxuICBsZXQgY3VycmVudFZhbHVlOiB1bmtub3duID0gdW5kZWZpbmVkXG5cbiAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3Qgc3RlcCA9IGl0ZXJhdG9yLm5leHQoY3VycmVudFZhbHVlKVxuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZShzdGVwLnZhbHVlKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0ZXAudmFsdWUpIGFzIEdlblJlc3VsdDxUWWllbGQsIFRSZXR1cm4+XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGVwLnZhbHVlIGFzIEdlblJlc3VsdDxUWWllbGQsIFRSZXR1cm4+XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZShzdGVwLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIGV4ZWN1dGVBc3luY0dlbmVyYXRvcihpdGVyYXRvciwgc3RlcCkgYXMgR2VuUmVzdWx0PFRZaWVsZCwgVFJldHVybj5cbiAgICB9XG5cbiAgICBpZiAoc3RlcC52YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICByZXR1cm4gc3RlcC52YWx1ZSBhcyBHZW5SZXN1bHQ8VFlpZWxkLCBUUmV0dXJuPlxuICAgIH1cblxuICAgIGN1cnJlbnRWYWx1ZSA9IHN0ZXAudmFsdWVcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBSdW5CdWlsZGVyIH0gZnJvbSBcIi4vbGliL2J1aWxkZXJcIlxuXG5jb25zdCByb290ID0gbmV3IFJ1bkJ1aWxkZXIoKVxuXG5leHBvcnQgY29uc3QgYWxsOiBSdW5CdWlsZGVyW1wiYWxsXCJdID0gcm9vdC5hbGwuYmluZChyb290KVxuZXhwb3J0IGNvbnN0IGFsbFNldHRsZWQ6IFJ1bkJ1aWxkZXJbXCJhbGxTZXR0bGVkXCJdID0gcm9vdC5hbGxTZXR0bGVkLmJpbmQocm9vdClcbmV4cG9ydCBjb25zdCBmbG93OiBSdW5CdWlsZGVyW1wiZmxvd1wiXSA9IHJvb3QuZmxvdy5iaW5kKHJvb3QpXG5leHBvcnQgY29uc3QgcmV0cnk6IFJ1bkJ1aWxkZXJbXCJyZXRyeVwiXSA9IHJvb3QucmV0cnkuYmluZChyb290KVxuZXhwb3J0IGNvbnN0IHJ1bjogUnVuQnVpbGRlcltcInJ1blwiXSA9IHJvb3QucnVuLmJpbmQocm9vdClcbmV4cG9ydCBjb25zdCBydW5TeW5jOiBSdW5CdWlsZGVyW1wicnVuU3luY1wiXSA9IHJvb3QucnVuU3luYy5iaW5kKHJvb3QpXG5leHBvcnQgY29uc3Qgc2lnbmFsOiBSdW5CdWlsZGVyW1wic2lnbmFsXCJdID0gcm9vdC5zaWduYWwuYmluZChyb290KVxuZXhwb3J0IGNvbnN0IHRpbWVvdXQ6IFJ1bkJ1aWxkZXJbXCJ0aW1lb3V0XCJdID0gcm9vdC50aW1lb3V0LmJpbmQocm9vdClcbmV4cG9ydCBjb25zdCB3cmFwOiBSdW5CdWlsZGVyW1wid3JhcFwiXSA9IHJvb3Qud3JhcC5iaW5kKHJvb3QpXG5cbmV4cG9ydCB7IGRpc3Bvc2UgfSBmcm9tIFwiLi9saWIvZGlzcG9zZVwiXG5leHBvcnQgeyBkcml2ZUdlbiBhcyBnZW4gfSBmcm9tIFwiLi9saWIvZ2VuXCJcblxuZXhwb3J0IHsgcmV0cnlPcHRpb25zIH0gZnJvbSBcIi4vbGliL21vZGlmaWVycy9yZXRyeVwiXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7QUFBQSxJQUFNLDJCQUEyQjtBQUVqQyxJQUFNLGdCQUFnQixRQUFRLElBQUksUUFBUSxTQUFTO0FBQ25ELElBQU0scUJBQXFCLFFBQVEsSUFBSSxRQUFRLGNBQWM7QUFFdEQsSUFBTSxVQUNYLE9BQU8sa0JBQWtCLFdBQVcsZ0JBQWdCLE9BQU8sSUFB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R0FBRztBQUFBLFFBRXpDLE9BQU8sTUFBTSxZQUFZO0FBQUEsTUFDM0I7QUFBQSxNQUVBLE9BQU8sWUFBWTtBQUFBLElBQ3JCO0FBQUEsSUFFQSxJQUFJO0FBQUEsSUFFSixJQUFJLG1CQUFtQixZQUFZLEtBQUssR0FBRztBQUFBLE1BQ3pDLElBQUk7QUFBQSxRQUVGLGVBQWUsTUFBTSxZQUFZO0FBQUEsUUFDakMsT0FBTyxPQUFPO0FBQUEsUUFDZCxjQUFjLFNBQVMsTUFBTSxLQUFLO0FBQUEsUUFDbEM7QUFBQTtBQUFBLElBRUosRUFBTztBQUFBLE1BQ0wsZUFBZSxZQUFZO0FBQUE7QUFBQSxJQUc3QixJQUFJLHdCQUF3QixPQUFPO0FBQUEsTUFDakMsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLGNBQWMsU0FBUyxLQUFLLFlBQVk7QUFBQSxFQUMxQztBQUFBO0FBR0ssU0FBUyxRQUF5QixDQUN2QyxTQUM0QjtBQUFBLEVBQzVCLE1BQU0sV0FBVyxRQUFRLEdBQUc7QUFBQSxFQUU1QixJQUFJLGVBQXdCO0FBQUEsRUFHNUIsT0FBTyxNQUFNO0FBQUEsSUFDWCxNQUFNLE9BQU8sU0FBUyxLQUFLLFlBQVk7QUFBQSxJQUV2QyxJQUFJLEtBQUssTUFBTTtBQUFBLE1BQ2IsSUFBSSxtQkFBbUIsS0FBSyxLQUFLLEdBQUc7QUFBQSxRQUNsQyxPQUFPLFFBQVEsUUFBUSxLQUFLLEtBQUs7QUFBQSxNQUNuQztBQUFBLE1BRUEsT0FBTyxLQUFLO0FBQUEsSUFDZDtBQUFBLElBRUEsSUFBSSxtQkFBbUIsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUNsQyxPQUFPLHNCQUFzQixVQUFVLElBQUk7QUFBQSxJQUM3QztBQUFBLElBRUEsSUFBSSxLQUFLLGlCQUFpQixPQUFPO0FBQUEsTUFDL0IsT0FBTyxLQUFLO0FBQUEsSUFDZDtBQUFBLElBRUEsZUFBZSxLQUFLO0FBQUEsRUFDdEI7QUFBQTs7O0FDbkZGLElBQU0sT0FBTyxJQUFJO0FBRVYsSUFBTSxNQUF5QixLQUFLLElBQUksS0FBSyxJQUFJO0FBQ2pELElBQU0sYUFBdUMsS0FBSyxXQUFXLEtBQUssSUFBSTtBQUN0RSxJQUFNLE9BQTJCLEtBQUssS0FBSyxLQUFLLElBQUk7QUFDcEQsSUFBTSxRQUE2QixLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQ3ZELElBQU0sTUFBeUIsS0FBSyxJQUFJLEtBQUssSUFBSTtBQUNqRCxJQUFNLFVBQWlDLEtBQUssUUFBUSxLQUFLLElBQUk7QUFDN0QsSUFBTSxTQUErQixLQUFLLE9BQU8sS0FBSyxJQUFJO0FBQzFELElBQU0sVUFBaUMsS0FBSyxRQUFRLEtBQUssSUFBSTtBQUM3RCxJQUFNLE9BQTJCLEtBQUssS0FBSyxLQUFLLElBQUk7IiwKICAiZGVidWdJZCI6ICI5MTNENTExRDhGQUU4QjE5NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
@@ -1,4 +1,3 @@
1
- import { createRequire } from "node:module";
2
1
  var __dispose = Symbol.dispose || /* @__PURE__ */ Symbol.for("Symbol.dispose");
3
2
  var __asyncDispose = Symbol.asyncDispose || /* @__PURE__ */ Symbol.for("Symbol.asyncDispose");
4
3
  var __using = (stack, value, async) => {
@@ -101,5 +100,5 @@ class Panic extends Error {
101
100
 
102
101
  export { __using, __callDispose, ControlError, CancellationError, TimeoutError, RetryExhaustedError, UnhandledException, Panic };
103
102
 
104
- //# debugId=55987E684DE2795864756E2164756E21
105
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2xpYi9lcnJvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgUGFuaWNDb2RlID1cbiAgfCBcIkFMTF9DQVRDSF9IQU5ETEVSX1JFSkVDVFwiXG4gIHwgXCJBTExfQ0FUQ0hfSEFORExFUl9USFJPV1wiXG4gIHwgXCJGTE9XX05PX0VYSVRcIlxuICB8IFwiT1JDSEVTVFJBVElPTl9VTlNVUFBPUlRFRF9QT0xJQ1lcIlxuICB8IFwiUkVUUllfSU5WQUxJRF9MSU1JVFwiXG4gIHwgXCJSVU5fQ0FUQ0hfSEFORExFUl9SRUpFQ1RcIlxuICB8IFwiUlVOX0NBVENIX0hBTkRMRVJfVEhST1dcIlxuICB8IFwiUlVOX1NZTkNfQVNZTkNfUkVUUllfUE9MSUNZXCJcbiAgfCBcIlJVTl9TWU5DX0NBVENIX0hBTkRMRVJfVEhST1dcIlxuICB8IFwiUlVOX1NZTkNfQ0FUQ0hfUFJPTUlTRVwiXG4gIHwgXCJSVU5fU1lOQ19UUllfUFJPTUlTRVwiXG4gIHwgXCJSVU5fU1lOQ19XUkFQUEVEX1JFU1VMVF9QUk9NSVNFXCJcbiAgfCBcIlRBU0tfSU5WQUxJRF9IQU5ETEVSXCJcbiAgfCBcIlRBU0tfU0VMRl9SRUZFUkVOQ0VcIlxuICB8IFwiVElNRU9VVF9JTlZBTElEX01TXCJcbiAgfCBcIlRBU0tfVU5LTk9XTl9SRUZFUkVOQ0VcIlxuICB8IFwiVU5SRUFDSEFCTEVfUkVUUllfUE9MSUNZX0JBQ0tPRkZcIlxuXG5leHBvcnQgY29uc3QgUGFuaWNNZXNzYWdlcyA9IHtcbiAgQUxMX0NBVENIX0hBTkRMRVJfUkVKRUNUOiBcIlBhbmljOiBhbGwoKSBjYXRjaCBoYW5kbGVyIHJlamVjdGVkXCIsXG4gIEFMTF9DQVRDSF9IQU5ETEVSX1RIUk9XOiBcIlBhbmljOiBhbGwoKSBjYXRjaCBoYW5kbGVyIHRocmV3XCIsXG4gIEZMT1dfTk9fRVhJVDogXCJmbG93KCkgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHRhc2sgdG8gY2FsbCAkZXhpdCgpLlwiLFxuICBPUkNIRVNUUkFUSU9OX1VOU1VQUE9SVEVEX1BPTElDWTogXCJPcmNoZXN0cmF0aW9uIGRvZXMgbm90IHN1cHBvcnQgcmV0cnkoKSBvciB0aW1lb3V0KCkgcG9saWNpZXMuXCIsXG4gIFJFVFJZX0lOVkFMSURfTElNSVQ6IFwicmV0cnkoKSByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgcmV0cnkgbGltaXQuXCIsXG4gIFJVTl9DQVRDSF9IQU5ETEVSX1JFSkVDVDogXCJQYW5pYzogcnVuKCkgY2F0Y2ggaGFuZGxlciByZWplY3RlZFwiLFxuICBSVU5fQ0FUQ0hfSEFORExFUl9USFJPVzogXCJQYW5pYzogcnVuKCkgY2F0Y2ggaGFuZGxlciB0aHJld1wiLFxuICBSVU5fU1lOQ19BU1lOQ19SRVRSWV9QT0xJQ1k6IFwiVGhpcyByZXRyeSBwb2xpY3kgbWF5IHJ1biBhc3luY2hyb25vdXNseS4gVXNlIHJ1bigpIGluc3RlYWQuXCIsXG4gIFJVTl9TWU5DX0NBVENIX0hBTkRMRVJfVEhST1c6IFwiUGFuaWM6IHJ1blN5bmMoKSBjYXRjaCBoYW5kbGVyIHRocmV3XCIsXG4gIFJVTl9TWU5DX0NBVENIX1BST01JU0U6IFwicnVuU3luYygpIGNhdGNoIGNhbm5vdCByZXR1cm4gYSBQcm9taXNlLiBVc2UgcnVuKCkgaW5zdGVhZC5cIixcbiAgUlVOX1NZTkNfVFJZX1BST01JU0U6IFwicnVuU3luYygpIGNhbm5vdCBoYW5kbGUgUHJvbWlzZSB2YWx1ZXMuIFVzZSBydW4oKSBpbnN0ZWFkLlwiLFxuICBSVU5fU1lOQ19XUkFQUEVEX1JFU1VMVF9QUk9NSVNFOlxuICAgIFwiV3JhcHBlZCBydW5TeW5jKCkgZXhlY3V0aW9uIHJldHVybmVkIGEgUHJvbWlzZS4gVXNlIHJ1bigpIGluc3RlYWQuXCIsXG4gIFRBU0tfSU5WQUxJRF9IQU5ETEVSOiBcIlRhc2sgcnVubmVyIGV4cGVjdGVkIGEgZnVuY3Rpb24gaGFuZGxlci5cIixcbiAgVEFTS19TRUxGX1JFRkVSRU5DRTogXCJUYXNrIGNhbm5vdCBhd2FpdCBpdHMgb3duIHJlc3VsdC5cIixcbiAgVEFTS19VTktOT1dOX1JFRkVSRU5DRTogXCJUYXNrIGF0dGVtcHRlZCB0byByZWFkIGFuIHVua25vd24gdGFzayByZXN1bHQuXCIsXG4gIFRJTUVPVVRfSU5WQUxJRF9NUzogXCJ0aW1lb3V0KCkgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIG1pbGxpc2Vjb25kIHZhbHVlLlwiLFxuICBVTlJFQUNIQUJMRV9SRVRSWV9QT0xJQ1lfQkFDS09GRjogXCJQYW5pYzogdW5yZWFjaGFibGUgcmV0cnkgcG9saWN5IGJhY2tvZmZcIixcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxQYW5pY0NvZGUsIHN0cmluZz5cbmV4cG9ydCB0eXBlIFBhbmljTWVzc2FnZXMgPSB0eXBlb2YgUGFuaWNNZXNzYWdlc1xuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgY2xhc3MgQ29udHJvbEVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuZXhwb3J0IGNsYXNzIENhbmNlbGxhdGlvbkVycm9yIGV4dGVuZHMgQ29udHJvbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9IFwiRXhlY3V0aW9uIHdhcyBjYW5jZWxsZWRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJDYW5jZWxsYXRpb25FcnJvclwiXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIENvbnRyb2xFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSBcIkV4ZWN1dGlvbiB0aW1lZCBvdXRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJUaW1lb3V0RXJyb3JcIlxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXRyeUV4aGF1c3RlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gXCJSZXRyeSBhdHRlbXB0cyBleGhhdXN0ZWRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJSZXRyeUV4aGF1c3RlZEVycm9yXCJcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5oYW5kbGVkRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gXCJVbmhhbmRsZWQgZXhjZXB0aW9uXCIsIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKVxuICAgIHRoaXMubmFtZSA9IFwiVW5oYW5kbGVkRXhjZXB0aW9uXCJcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFuaWMgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGU6IFBhbmljQ29kZVxuXG4gIGNvbnN0cnVjdG9yKGNvZGU6IFBhbmljQ29kZSwgb3B0aW9uczogRXJyb3JPcHRpb25zICYgeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4uZXJyb3JPcHRpb25zIH0gPSBvcHRpb25zXG5cbiAgICBzdXBlcihtZXNzYWdlID8/IFBhbmljTWVzc2FnZXNbY29kZV0sIGVycm9yT3B0aW9ucylcbiAgICB0aGlzLmNvZGUgPSBjb2RlXG4gICAgdGhpcy5uYW1lID0gXCJQYW5pY1wiXG4gIH1cbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQk8sSUFBTSxnQkFBZ0I7QUFBQSxFQUMzQiwwQkFBMEI7QUFBQSxFQUMxQix5QkFBeUI7QUFBQSxFQUN6QixjQUFjO0FBQUEsRUFDZCxrQ0FBa0M7QUFBQSxFQUNsQyxxQkFBcUI7QUFBQSxFQUNyQiwwQkFBMEI7QUFBQSxFQUMxQix5QkFBeUI7QUFBQSxFQUN6Qiw2QkFBNkI7QUFBQSxFQUM3Qiw4QkFBOEI7QUFBQSxFQUM5Qix3QkFBd0I7QUFBQSxFQUN4QixzQkFBc0I7QUFBQSxFQUN0QixpQ0FDRTtBQUFBLEVBQ0Ysc0JBQXNCO0FBQUEsRUFDdEIscUJBQXFCO0FBQUEsRUFDckIsd0JBQXdCO0FBQUEsRUFDeEIsb0JBQW9CO0FBQUEsRUFDcEIsa0NBQWtDO0FBQ3BDO0FBQUE7QUFJTyxNQUFNLHFCQUFxQixNQUFNO0FBQUM7QUFBQTtBQUVsQyxNQUFNLDBCQUEwQixhQUFhO0FBQUEsRUFDbEQsV0FBVyxDQUFDLFVBQVUsMkJBQTJCLFNBQXdCO0FBQUEsSUFDdkUsTUFBTSxTQUFTLE9BQU87QUFBQSxJQUN0QixLQUFLLE9BQU87QUFBQTtBQUVoQjtBQUFBO0FBRU8sTUFBTSxxQkFBcUIsYUFBYTtBQUFBLEVBQzdDLFdBQVcsQ0FBQyxVQUFVLHVCQUF1QixTQUF3QjtBQUFBLElBQ25FLE1BQU0sU0FBUyxPQUFPO0FBQUEsSUFDdEIsS0FBSyxPQUFPO0FBQUE7QUFFaEI7QUFBQTtBQUVPLE1BQU0sNEJBQTRCLE1BQU07QUFBQSxFQUM3QyxXQUFXLENBQUMsVUFBVSw0QkFBNEIsU0FBd0I7QUFBQSxJQUN4RSxNQUFNLFNBQVMsT0FBTztBQUFBLElBQ3RCLEtBQUssT0FBTztBQUFBO0FBRWhCO0FBQUE7QUFFTyxNQUFNLDJCQUEyQixNQUFNO0FBQUEsRUFDNUMsV0FBVyxDQUFDLFVBQVUsdUJBQXVCLFNBQXdCO0FBQUEsSUFDbkUsTUFBTSxTQUFTLE9BQU87QUFBQSxJQUN0QixLQUFLLE9BQU87QUFBQTtBQUVoQjtBQUFBO0FBRU8sTUFBTSxjQUFjLE1BQU07QUFBQSxFQUN0QjtBQUFBLEVBRVQsV0FBVyxDQUFDLE1BQWlCLFVBQStDLENBQUMsR0FBRztBQUFBLElBQzlFLFFBQVEsWUFBWSxpQkFBaUI7QUFBQSxJQUVyQyxNQUFNLFdBQVcsY0FBYyxPQUFPLFlBQVk7QUFBQSxJQUNsRCxLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssT0FBTztBQUFBO0FBRWhCOyIsCiAgImRlYnVnSWQiOiAiNTU5ODdFNjg0REUyNzk1ODY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
103
+ //# debugId=EF16E98BFCB81E7964756E2164756E21
104
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2xpYi9lcnJvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgUGFuaWNDb2RlID1cbiAgfCBcIkFMTF9DQVRDSF9IQU5ETEVSX1JFSkVDVFwiXG4gIHwgXCJBTExfQ0FUQ0hfSEFORExFUl9USFJPV1wiXG4gIHwgXCJGTE9XX05PX0VYSVRcIlxuICB8IFwiT1JDSEVTVFJBVElPTl9VTlNVUFBPUlRFRF9QT0xJQ1lcIlxuICB8IFwiUkVUUllfSU5WQUxJRF9MSU1JVFwiXG4gIHwgXCJSVU5fQ0FUQ0hfSEFORExFUl9SRUpFQ1RcIlxuICB8IFwiUlVOX0NBVENIX0hBTkRMRVJfVEhST1dcIlxuICB8IFwiUlVOX1NZTkNfQVNZTkNfUkVUUllfUE9MSUNZXCJcbiAgfCBcIlJVTl9TWU5DX0NBVENIX0hBTkRMRVJfVEhST1dcIlxuICB8IFwiUlVOX1NZTkNfQ0FUQ0hfUFJPTUlTRVwiXG4gIHwgXCJSVU5fU1lOQ19UUllfUFJPTUlTRVwiXG4gIHwgXCJSVU5fU1lOQ19XUkFQUEVEX1JFU1VMVF9QUk9NSVNFXCJcbiAgfCBcIlRBU0tfSU5WQUxJRF9IQU5ETEVSXCJcbiAgfCBcIlRBU0tfU0VMRl9SRUZFUkVOQ0VcIlxuICB8IFwiVElNRU9VVF9JTlZBTElEX01TXCJcbiAgfCBcIlRBU0tfVU5LTk9XTl9SRUZFUkVOQ0VcIlxuICB8IFwiVU5SRUFDSEFCTEVfUkVUUllfUE9MSUNZX0JBQ0tPRkZcIlxuXG5leHBvcnQgY29uc3QgUGFuaWNNZXNzYWdlcyA9IHtcbiAgQUxMX0NBVENIX0hBTkRMRVJfUkVKRUNUOiBcIlBhbmljOiBhbGwoKSBjYXRjaCBoYW5kbGVyIHJlamVjdGVkXCIsXG4gIEFMTF9DQVRDSF9IQU5ETEVSX1RIUk9XOiBcIlBhbmljOiBhbGwoKSBjYXRjaCBoYW5kbGVyIHRocmV3XCIsXG4gIEZMT1dfTk9fRVhJVDogXCJmbG93KCkgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHRhc2sgdG8gY2FsbCAkZXhpdCgpLlwiLFxuICBPUkNIRVNUUkFUSU9OX1VOU1VQUE9SVEVEX1BPTElDWTogXCJPcmNoZXN0cmF0aW9uIGRvZXMgbm90IHN1cHBvcnQgcmV0cnkoKSBvciB0aW1lb3V0KCkgcG9saWNpZXMuXCIsXG4gIFJFVFJZX0lOVkFMSURfTElNSVQ6IFwicmV0cnkoKSByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgcmV0cnkgbGltaXQuXCIsXG4gIFJVTl9DQVRDSF9IQU5ETEVSX1JFSkVDVDogXCJQYW5pYzogcnVuKCkgY2F0Y2ggaGFuZGxlciByZWplY3RlZFwiLFxuICBSVU5fQ0FUQ0hfSEFORExFUl9USFJPVzogXCJQYW5pYzogcnVuKCkgY2F0Y2ggaGFuZGxlciB0aHJld1wiLFxuICBSVU5fU1lOQ19BU1lOQ19SRVRSWV9QT0xJQ1k6IFwiVGhpcyByZXRyeSBwb2xpY3kgbWF5IHJ1biBhc3luY2hyb25vdXNseS4gVXNlIHJ1bigpIGluc3RlYWQuXCIsXG4gIFJVTl9TWU5DX0NBVENIX0hBTkRMRVJfVEhST1c6IFwiUGFuaWM6IHJ1blN5bmMoKSBjYXRjaCBoYW5kbGVyIHRocmV3XCIsXG4gIFJVTl9TWU5DX0NBVENIX1BST01JU0U6IFwicnVuU3luYygpIGNhdGNoIGNhbm5vdCByZXR1cm4gYSBQcm9taXNlLiBVc2UgcnVuKCkgaW5zdGVhZC5cIixcbiAgUlVOX1NZTkNfVFJZX1BST01JU0U6IFwicnVuU3luYygpIGNhbm5vdCBoYW5kbGUgUHJvbWlzZSB2YWx1ZXMuIFVzZSBydW4oKSBpbnN0ZWFkLlwiLFxuICBSVU5fU1lOQ19XUkFQUEVEX1JFU1VMVF9QUk9NSVNFOlxuICAgIFwiV3JhcHBlZCBydW5TeW5jKCkgZXhlY3V0aW9uIHJldHVybmVkIGEgUHJvbWlzZS4gVXNlIHJ1bigpIGluc3RlYWQuXCIsXG4gIFRBU0tfSU5WQUxJRF9IQU5ETEVSOiBcIlRhc2sgcnVubmVyIGV4cGVjdGVkIGEgZnVuY3Rpb24gaGFuZGxlci5cIixcbiAgVEFTS19TRUxGX1JFRkVSRU5DRTogXCJUYXNrIGNhbm5vdCBhd2FpdCBpdHMgb3duIHJlc3VsdC5cIixcbiAgVEFTS19VTktOT1dOX1JFRkVSRU5DRTogXCJUYXNrIGF0dGVtcHRlZCB0byByZWFkIGFuIHVua25vd24gdGFzayByZXN1bHQuXCIsXG4gIFRJTUVPVVRfSU5WQUxJRF9NUzogXCJ0aW1lb3V0KCkgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIG1pbGxpc2Vjb25kIHZhbHVlLlwiLFxuICBVTlJFQUNIQUJMRV9SRVRSWV9QT0xJQ1lfQkFDS09GRjogXCJQYW5pYzogdW5yZWFjaGFibGUgcmV0cnkgcG9saWN5IGJhY2tvZmZcIixcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxQYW5pY0NvZGUsIHN0cmluZz5cbmV4cG9ydCB0eXBlIFBhbmljTWVzc2FnZXMgPSB0eXBlb2YgUGFuaWNNZXNzYWdlc1xuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgY2xhc3MgQ29udHJvbEVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuZXhwb3J0IGNsYXNzIENhbmNlbGxhdGlvbkVycm9yIGV4dGVuZHMgQ29udHJvbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9IFwiRXhlY3V0aW9uIHdhcyBjYW5jZWxsZWRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJDYW5jZWxsYXRpb25FcnJvclwiXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIENvbnRyb2xFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSBcIkV4ZWN1dGlvbiB0aW1lZCBvdXRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJUaW1lb3V0RXJyb3JcIlxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXRyeUV4aGF1c3RlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gXCJSZXRyeSBhdHRlbXB0cyBleGhhdXN0ZWRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJSZXRyeUV4aGF1c3RlZEVycm9yXCJcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5oYW5kbGVkRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gXCJVbmhhbmRsZWQgZXhjZXB0aW9uXCIsIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKVxuICAgIHRoaXMubmFtZSA9IFwiVW5oYW5kbGVkRXhjZXB0aW9uXCJcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFuaWMgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGU6IFBhbmljQ29kZVxuXG4gIGNvbnN0cnVjdG9yKGNvZGU6IFBhbmljQ29kZSwgb3B0aW9uczogRXJyb3JPcHRpb25zICYgeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4uZXJyb3JPcHRpb25zIH0gPSBvcHRpb25zXG5cbiAgICBzdXBlcihtZXNzYWdlID8/IFBhbmljTWVzc2FnZXNbY29kZV0sIGVycm9yT3B0aW9ucylcbiAgICB0aGlzLmNvZGUgPSBjb2RlXG4gICAgdGhpcy5uYW1lID0gXCJQYW5pY1wiXG4gIH1cbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CTyxJQUFNLGdCQUFnQjtBQUFBLEVBQzNCLDBCQUEwQjtBQUFBLEVBQzFCLHlCQUF5QjtBQUFBLEVBQ3pCLGNBQWM7QUFBQSxFQUNkLGtDQUFrQztBQUFBLEVBQ2xDLHFCQUFxQjtBQUFBLEVBQ3JCLDBCQUEwQjtBQUFBLEVBQzFCLHlCQUF5QjtBQUFBLEVBQ3pCLDZCQUE2QjtBQUFBLEVBQzdCLDhCQUE4QjtBQUFBLEVBQzlCLHdCQUF3QjtBQUFBLEVBQ3hCLHNCQUFzQjtBQUFBLEVBQ3RCLGlDQUNFO0FBQUEsRUFDRixzQkFBc0I7QUFBQSxFQUN0QixxQkFBcUI7QUFBQSxFQUNyQix3QkFBd0I7QUFBQSxFQUN4QixvQkFBb0I7QUFBQSxFQUNwQixrQ0FBa0M7QUFDcEM7QUFBQTtBQUlPLE1BQU0scUJBQXFCLE1BQU07QUFBQztBQUFBO0FBRWxDLE1BQU0sMEJBQTBCLGFBQWE7QUFBQSxFQUNsRCxXQUFXLENBQUMsVUFBVSwyQkFBMkIsU0FBd0I7QUFBQSxJQUN2RSxNQUFNLFNBQVMsT0FBTztBQUFBLElBQ3RCLEtBQUssT0FBTztBQUFBO0FBRWhCO0FBQUE7QUFFTyxNQUFNLHFCQUFxQixhQUFhO0FBQUEsRUFDN0MsV0FBVyxDQUFDLFVBQVUsdUJBQXVCLFNBQXdCO0FBQUEsSUFDbkUsTUFBTSxTQUFTLE9BQU87QUFBQSxJQUN0QixLQUFLLE9BQU87QUFBQTtBQUVoQjtBQUFBO0FBRU8sTUFBTSw0QkFBNEIsTUFBTTtBQUFBLEVBQzdDLFdBQVcsQ0FBQyxVQUFVLDRCQUE0QixTQUF3QjtBQUFBLElBQ3hFLE1BQU0sU0FBUyxPQUFPO0FBQUEsSUFDdEIsS0FBSyxPQUFPO0FBQUE7QUFFaEI7QUFBQTtBQUVPLE1BQU0sMkJBQTJCLE1BQU07QUFBQSxFQUM1QyxXQUFXLENBQUMsVUFBVSx1QkFBdUIsU0FBd0I7QUFBQSxJQUNuRSxNQUFNLFNBQVMsT0FBTztBQUFBLElBQ3RCLEtBQUssT0FBTztBQUFBO0FBRWhCO0FBQUE7QUFFTyxNQUFNLGNBQWMsTUFBTTtBQUFBLEVBQ3RCO0FBQUEsRUFFVCxXQUFXLENBQUMsTUFBaUIsVUFBK0MsQ0FBQyxHQUFHO0FBQUEsSUFDOUUsUUFBUSxZQUFZLGlCQUFpQjtBQUFBLElBRXJDLE1BQU0sV0FBVyxjQUFjLE9BQU8sWUFBWTtBQUFBLElBQ2xELEtBQUssT0FBTztBQUFBLElBQ1osS0FBSyxPQUFPO0FBQUE7QUFFaEI7IiwKICAiZGVidWdJZCI6ICJFRjE2RTk4QkZDQjgxRTc5NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
package/dist/types.d.ts CHANGED
@@ -1,3 +1,10 @@
1
+ interface AsyncDisposer extends AsyncDisposable {
2
+ add(fn: () => void | PromiseLike<void>): void;
3
+ cleanup(): Promise<void>;
4
+ defer(fn: () => void | PromiseLike<void>): void;
5
+ use<T extends AsyncDisposable | Disposable | null | undefined>(value: T): T;
6
+ disposeAsync(): Promise<void>;
7
+ }
1
8
  declare const FLOW_EXIT_BRAND: unique symbol;
2
9
  type FlowExit<T> = {
3
10
  readonly [FLOW_EXIT_BRAND]: T;
@@ -14,4 +21,4 @@ interface SettledRejected {
14
21
  }
15
22
  type SettledResult<T> = SettledFulfilled<T> | SettledRejected;
16
23
  type AllSettledResult<T extends TaskRecord> = { [K in keyof T] : SettledResult<TaskResult<T[K]>> };
17
- export { SettledResult, SettledRejected, SettledFulfilled, FlowExit, AllSettledResult };
24
+ export { SettledResult, SettledRejected, SettledFulfilled, FlowExit, AsyncDisposer, AllSettledResult };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tryharder",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "A better try/catch for TypeScript",
5
5
  "keywords": [
6
6
  "abort-signal",
@@ -49,6 +49,7 @@
49
49
  "dev": "bunup --watch",
50
50
  "fix": "adamantite fix",
51
51
  "release": "changeset publish",
52
+ "release:ci": "bun run build && npm pack --dry-run && changeset publish",
52
53
  "test": "bun test",
53
54
  "test:coverage": "bun test --coverage",
54
55
  "test:watch": "bun test --watch",