footprintjs 10.6.0 → 10.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +2 -1
- package/dist/esm/index.d.ts +12 -2
- package/dist/esm/index.js +5 -3
- package/dist/esm/lib/attempt/backoff.d.ts +96 -0
- package/dist/esm/lib/attempt/backoff.js +173 -0
- package/dist/esm/lib/attempt/deadline.d.ts +0 -5
- package/dist/esm/lib/attempt/deadline.js +2 -27
- package/dist/esm/lib/attempt/index.d.ts +6 -4
- package/dist/esm/lib/attempt/index.js +6 -5
- package/dist/esm/lib/attempt/runner.js +3 -2
- package/dist/esm/lib/detach/drivers/setTimeout.d.ts +4 -2
- package/dist/esm/lib/detach/drivers/setTimeout.js +12 -2
- package/dist/esm/lib/detach/flush.d.ts +6 -1
- package/dist/esm/lib/detach/flush.js +8 -6
- package/dist/esm/lib/observer-queue/deferredDispatcher.d.ts +8 -1
- package/dist/esm/lib/observer-queue/deferredDispatcher.js +13 -6
- package/dist/esm/lib/recorder/AttemptRecorder.js +8 -9
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +7 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +8 -3
- package/dist/esm/lib/runner/captureHistory.js +6 -4
- package/dist/esm/lib/runner/deadline.js +3 -2
- package/dist/esm/lib/runner/recordSink.d.ts +2 -1
- package/dist/esm/lib/runner/recordSink.js +12 -7
- package/dist/esm/lib/sinks/fileSink.js +7 -6
- package/dist/esm/lib/sinks/indexedIO.js +5 -3
- package/dist/esm/lib/timers/longTimeout.d.ts +37 -0
- package/dist/esm/lib/timers/longTimeout.js +56 -0
- package/dist/index.js +8 -3
- package/dist/lib/attempt/backoff.js +178 -0
- package/dist/lib/attempt/deadline.js +4 -30
- package/dist/lib/attempt/index.js +9 -6
- package/dist/lib/attempt/runner.js +4 -3
- package/dist/lib/detach/drivers/setTimeout.js +12 -2
- package/dist/lib/detach/flush.js +8 -6
- package/dist/lib/observer-queue/deferredDispatcher.js +13 -6
- package/dist/lib/recorder/AttemptRecorder.js +8 -9
- package/dist/lib/runner/FlowChartExecutor.js +8 -3
- package/dist/lib/runner/captureHistory.js +6 -4
- package/dist/lib/runner/deadline.js +3 -2
- package/dist/lib/runner/recordSink.js +12 -7
- package/dist/lib/sinks/fileSink.js +7 -6
- package/dist/lib/sinks/indexedIO.js +5 -3
- package/dist/lib/timers/longTimeout.js +60 -0
- package/dist/types/index.d.ts +12 -2
- package/dist/types/lib/attempt/backoff.d.ts +96 -0
- package/dist/types/lib/attempt/deadline.d.ts +0 -5
- package/dist/types/lib/attempt/index.d.ts +6 -4
- package/dist/types/lib/detach/drivers/setTimeout.d.ts +4 -2
- package/dist/types/lib/detach/flush.d.ts +6 -1
- package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +8 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +7 -2
- package/dist/types/lib/runner/recordSink.d.ts +2 -1
- package/dist/types/lib/timers/longTimeout.d.ts +37 -0
- package/package.json +2 -2
package/CLAUDE.md
CHANGED
|
@@ -18,7 +18,8 @@ Entry points: `footprintjs` (engine API), `/recorders`, `/trace` (engine recorde
|
|
|
18
18
|
| reactive/ | TypedScope deep Proxy over the facade — four write laws + the honest boundary (what `find`/`for…of` hands back is raw and WARNED ABOUT in dev mode, not intercepted; a proxy held past its stage IS refused — `ScopeFacade` · `assertLive`); handles.ts = the registry of every proxy the factories built → the value behind it, asked wherever an app value enters the record (the set traps since 9.24.0 — no JSON round-trip any more; fan-out `resolveItems`, subflow in/out mappers, `$setValue`/`$update`/`$batchArray` since 9.23.3, after a fan-out over object items seeded the handle and lost every child); see src/lib/reactive/README.md |
|
|
19
19
|
| decide/ | decide()/select() evidence capture |
|
|
20
20
|
| filter/ | `evaluator.ts · evaluateFilter` — the ONE filter-rule law, shared by decide() and the attempt rule table; its own leaf module since P2 (10.1), because in decide/ it made attempt/ reach scope/ and `scope.$call` closed an attempt ⇄ decide ⇄ scope module cycle |
|
|
21
|
-
| attempt/ | the ONE retry loop and its record (10.1, docs/design/2026-10-time-and-failure-evidence.md): `runner.ts · runAttempts` runs a policy and makes one frozen `AttemptRecord` per try (timing, outcome, category, the retry-or-stop decision as `DecisionEvidence`) + an `AttemptSummary`; `decision.ts · retryRules` = the one rule table as `decide()` rules (first match, labels ARE the reasons) + `decideAttempt`, decide()'s evaluation without a scope (filter rows from `filter/evaluator`; a property test pins equal evidence); `category.ts · errorCategory` = the one classifier (seven fixed values); `errors.ts`, `anySignal.ts
|
|
21
|
+
| attempt/ | the ONE retry loop and its record (10.1, docs/design/2026-10-time-and-failure-evidence.md): `runner.ts · runAttempts` runs a policy and makes one frozen `AttemptRecord` per try (timing, outcome, category, the retry-or-stop decision as `DecisionEvidence`) + an `AttemptSummary`; `decision.ts · retryRules` = the one rule table as `decide()` rules (first match, labels ARE the reasons) + `decideAttempt`, decide()'s evaluation without a scope (filter rows from `filter/evaluator`; a property test pins equal evidence); `category.ts · errorCategory` = the one classifier (seven fixed values); `errors.ts`, `anySignal.ts`; `backoff.ts · exponentialBackoff` / `statedWaitFirst` build the function `RetryPolicy.backoffMs` takes (exponential ceiling, `'none'`/`'equal'`/`'full'` jitter from an injectable `random`, a stated wait first — the cap stays `maxBackoffMs`, so the budget still counts it). L5 beside decide/, but `types.ts` (with `decide/types.ts`) is an L0 leaf because `StageSnapshot` (L4) names it. `RetryPolicy` is declared here, re-exported by engine/types.ts |
|
|
22
|
+
| timers/ | the ONE long-timer law, a neutral L0 leaf folder (like `ids/`): `longTimeout.ts · setLongTimeout(fn, ms, { unref? })` — `Infinity` arms no timer; a delay past 2^31 − 1 ms is waited in chunks, never 1 ms; anything not a number > 0 is due at once. Every caller-supplied wait in `src/` arms it (the runner's caps, waits and deadline, the observer queue's `drain` at L1, `flushAllDetached`, `flushRecord`, the file sink, the indexed reader, the `attempts()` recorder, capture history, the `setTimeout` detach driver). `test/architecture/timer-law.test.ts` refuses, outside it: a raw `setTimeout` / `setInterval` whose delay is not a literal a host timer holds (or a constant on its named allow-list), any indirect reach of one (alias, `globalThis['setTimeout']`, `.call`, destructuring, `Reflect.apply`), a `timers` / `timers/promises` import, `scheduler.wait`, and `AbortSignal.timeout` past 2^31 − 1 or non-literal; see src/lib/timers/README.md |
|
|
22
23
|
| recorder/ | engine stores (KeyedStore/SequenceStore/BoundaryStateStore), CombinedRecorder routing, and built-in Topology/InOut/ControlDep/Quality recorders. `CommitRangeIndex` is owned and exported by foottrace. `attemptSeries.ts` = the ONE predicate every built-in recorder uses for attempt rows (P1c, 10.1: a series that RETRIED, GAVE UP or TIMED OUT; a first-time success adds no row anywhere, so no-retry runs stay byte-identical) — it lives here, not in attempt/, because a recorder → attempt runtime edge closes the attempt⇄decide⇄recorder⇄scope module cycle. Quality/Debug see `onAttempt` only through `attachCombinedRecorder` |
|
|
23
24
|
| pause/ | PauseSignal / FlowchartCheckpoint types + `interrupt(scope, payload)` (throws InterruptSignal; converted to PauseSignal at the StageRunner boundary, `pausedBy:'interrupt'`) |
|
|
24
25
|
| engine/ | FlowchartTraverser + handlers/; narrative/ = the whole FlowRecorder channel (dispatcher + 9 strategies), not just text; `lib/ids/branchSegment.ts` (moved to the `ids/` leaf in 9.37.0) = the ONE owner of the generated-segment grammar (`<stageId>~<index>`, marker `~` RESERVED); `executeStage` (:720) = the ONE funnel every stage fn passes through — and therefore the ONE owner of the declarative `retry` loop; `handlers/ResumeEntry.ts` = the ONE owner of a resume's ONE-SHOT re-entry (M2, 9.28.0: start + one hop per subflow on the pause path, each level's dispatcher continuation read from the chart, waiting sibling pauses queued at their fan-out) |
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -75,9 +75,19 @@ export type { AttemptOutcomeCounts, AttemptRef } from './lib/recorder/attemptSer
|
|
|
75
75
|
*
|
|
76
76
|
* `attempt()` — the attempt runner for code that is not a stage (records go to its `onAttempt`); `errorCategory`
|
|
77
77
|
* — the one failure classifier (seven fixed categories); `retryRules` — the one retry rule table, as `decide()`
|
|
78
|
-
* rules; the attempt contract's two errors
|
|
78
|
+
* rules; the attempt contract's two errors; `exponentialBackoff` / `statedWaitFirst` — deterministic builders of
|
|
79
|
+
* the function a `RetryPolicy.backoffMs` takes (`BackoffSpec.maxDelayMs` caps the schedule before the jitter draw; the
|
|
80
|
+
* policy's `maxBackoffMs` still caps every wait after it).
|
|
79
81
|
*/
|
|
80
|
-
export { attempt, AttemptTimeoutError, errorCategory, retryRules, UnknownEffectError } from './lib/attempt/index.js';
|
|
82
|
+
export { attempt, AttemptTimeoutError, errorCategory, exponentialBackoff, retryRules, statedWaitFirst, UnknownEffectError, } from './lib/attempt/index.js';
|
|
83
|
+
/**
|
|
84
|
+
* @category Attempts
|
|
85
|
+
*
|
|
86
|
+
* What the backoff builders take and build: an exponential schedule (`BackoffSpec`, its `BackoffJitter`), the
|
|
87
|
+
* `RetryPolicy.backoffMs` function they return (`BackoffFunction`), and the reader of a stated wait
|
|
88
|
+
* (`StatedWaitReader` — a parsed `Retry-After`, in milliseconds).
|
|
89
|
+
*/
|
|
90
|
+
export type { BackoffFunction, BackoffJitter, BackoffSpec, StatedWaitReader } from './lib/attempt/index.js';
|
|
81
91
|
/**
|
|
82
92
|
* @category Correlation
|
|
83
93
|
*
|
package/dist/esm/index.js
CHANGED
|
@@ -27,9 +27,11 @@ export { decide, select } from './lib/decide/index.js';
|
|
|
27
27
|
*
|
|
28
28
|
* `attempt()` — the attempt runner for code that is not a stage (records go to its `onAttempt`); `errorCategory`
|
|
29
29
|
* — the one failure classifier (seven fixed categories); `retryRules` — the one retry rule table, as `decide()`
|
|
30
|
-
* rules; the attempt contract's two errors
|
|
30
|
+
* rules; the attempt contract's two errors; `exponentialBackoff` / `statedWaitFirst` — deterministic builders of
|
|
31
|
+
* the function a `RetryPolicy.backoffMs` takes (`BackoffSpec.maxDelayMs` caps the schedule before the jitter draw; the
|
|
32
|
+
* policy's `maxBackoffMs` still caps every wait after it).
|
|
31
33
|
*/
|
|
32
|
-
export { attempt, AttemptTimeoutError, errorCategory, retryRules, UnknownEffectError } from './lib/attempt/index.js';
|
|
34
|
+
export { attempt, AttemptTimeoutError, errorCategory, exponentialBackoff, retryRules, statedWaitFirst, UnknownEffectError, } from './lib/attempt/index.js';
|
|
33
35
|
export { formatTraceparent, parseTraceparent, TraceparentError } from './lib/attempt/index.js';
|
|
34
36
|
/** @category Run */
|
|
35
37
|
export { RecordSinkError } from './lib/runner/index.js';
|
|
@@ -95,4 +97,4 @@ export { extractErrorInfo, formatErrorInfo } from './lib/engine/index.js';
|
|
|
95
97
|
*/
|
|
96
98
|
export { disableDevMode, enableDevMode, isDevMode } from './lib/devMode.js';
|
|
97
99
|
export { stringifySnapshot } from './lib/runner/stringifySnapshot.js';
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFTSCw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBc0N4RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFRbkQsNEJBQTRCO0FBQzVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQW9CM0MsbUNBQW1DO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFpRHZEOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBV3JILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBZ0MvRixvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBUXhELG9CQUFvQjtBQUNwQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBcUJuRCwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXRELCtCQUErQjtBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsb0NBQW9DO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBbUM1RCxxRUFBcUU7QUFDckUsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLFdBQVcsR0FDWixNQUFNLHlCQUF5QixDQUFDO0FBa0RqQywrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFLOUQsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTdELCtCQUErQjtBQUMvQixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdkUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXpFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdEUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQW1CdEUsdUNBQXVDO0FBQ3ZDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTdFLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBRS9FLDhCQUE4QjtBQUM5QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQTBCNUQsNkJBQTZCO0FBQzdCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWdFakQsc0NBQXNDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTNFLHNDQUFzQztBQUN0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFTckcsZ0NBQWdDO0FBQ2hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRSwrRUFBK0U7QUFDL0UsaURBQWlEO0FBQ2pELCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBMEI1RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9vdFByaW50IOKAlCBQdWJsaWMgQVBJICh2MylcbiAqXG4gKiBUaGUgZmxvd2NoYXJ0IHBhdHRlcm4gZm9yIGJhY2tlbmQgY29kZS5cbiAqIEJ1aWxkIOKGkiBSdW4g4oaSIE9ic2VydmUuXG4gKlxuICogKipUaGUgY29tbW9uIGltcG9ydCBwYXRoczoqKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGZsb3dDaGFydCwgZGVjaWRlLCBuYXJyYXRpdmUgfSBmcm9tICdmb290cHJpbnRqcyc7ICAgICAgICAgICAvLyBtYWluIOKAlCBzdGFydCBoZXJlXG4gKiBpbXBvcnQgeyBtZXRyaWNzLCBkZWJ1ZywgbWFuaWZlc3QgfSAgICAgZnJvbSAnZm9vdHByaW50anMvcmVjb3JkZXJzJzsgLy8gcmVjb3JkZXIgZmFjdG9yaWVzXG4gKiBpbXBvcnQgeyBzdGF0ZUF0LCBjYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3R0cmFjZSc7ICAgICAvLyByZWFkIGEgZmluaXNoZWQgcnVuXG4gKiBpbXBvcnQgeyBSZWNvcmRGcmFtZSwgRXZlbnRMb2cgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnOyAgICAgLy8gd3JpdGUgYSByZWNvcmQgeW91cnNlbGZcbiAqIGltcG9ydCB7IFN0YWdlQ29udGV4dCB9ICAgICAgICAgICAgICAgICBmcm9tICdmb290cHJpbnRqcy9hZHZhbmNlZCc7ICAvLyBlbmdpbmUgaW50ZXJuYWxzXG4gKiBgYGBcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUXVpY2sgU3RhcnQg4oCUIEV2ZXJ5dGhpbmcgeW91IG5lZWQgZm9yIDkwJSBvZiB1c2UgY2FzZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnQsIFN0YWdlRnVuY3Rpb24gYXMgU3RhZ2VIYW5kbGVyLCBTdHJlYW1IYW5kbGVycyB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgeyBmbG93Q2hhcnQsIEZsb3dDaGFydEJ1aWxkZXIsIGZsb3dDaGFydFNlbGVjdG9yIH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0XG4gKlxuICogQ29uZmlnIGZvciBgLmFkZFBhcmFsbGVsRm9yRWFjaCgpYCDigJQgb25lIGJyYW5jaCBwZXIgaXRlbSwgYnJhbmNoIGNvdW50XG4gKiBkZWNpZGVkIGF0IHJ1biB0aW1lIGZyb20gdGhlIHBheWxvYWQuIGBtYXhCcmFuY2hlc2AgYW5kIGBpbnRvYCBhcmUgcmVxdWlyZWRcbiAqIG9uIHB1cnBvc2UgKHNlZSBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZCkuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQnJhbmNoQ2hhcnQsIFBhcmFsbGVsRm9yRWFjaENvbmZpZywgUmV0cnlQb2xpY3kgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCDigJQgYnVpbGQtdGltZSBvYnNlcnZlciAodHdpbiBvZiBGbG93UmVjb3JkZXIpICovXG5leHBvcnQgdHlwZSB7XG4gIFN0cnVjdHVyZURlY2lkZXJDb21wbGV0ZUV2ZW50LFxuICBTdHJ1Y3R1cmVFZGdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlRWRnZUtpbmQsXG4gIFN0cnVjdHVyZUxvb3BFZGdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlUmVjb3JkZXIsXG4gIFN0cnVjdHVyZVN0YWdlQWRkZWRFdmVudCxcbiAgU3RydWN0dXJlU3RhZ2VUYWdnZWRFdmVudCxcbiAgU3RydWN0dXJlU3ViZmxvd01vdW50ZWRFdmVudCxcbn0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IFRpbWUgQnVkZ2V0XG4gKlxuICogYHRpbWVCdWRnZXQoY2hhcnQpYCDigJQgdGhlIHNsb3dlc3QgYSBjaGFydCBjYW4gdGFrZSwgZnJvbSBpdHMgZGVjbGFyZWQgcmV0cnkgcG9saWNpZXMgKGBhdHRlbXB0cyDDlyB0aW1lb3V0TXNgIHBsdXNcbiAqIHRoZSB3YWl0cywgc3VtbWVkIGFsb25nIHRoZSBzbG93ZXN0IHBhdGgpLCBhbmQgZXZlcnkgc3RhZ2UgdGhhdCBtYWtlcyBhIHBhdGggdW5ib3VuZGVkLCBieSBuYW1lLiBgLmJ1ZGdldChtcylgXG4gKiBkZWNsYXJlcyB0aGUgY2FsbGVyJ3MgY29udHJhY3Q7IGBidWlsZCgpYCByZWZ1c2VzIGEgY2hhcnQgdGhhdCBjYW5ub3Qga2VlcCBpdC4gQWxzbyBgY2hhcnQudGltZUJ1ZGdldCgpYC5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBCdWRnZXRBc3N1bXB0aW9ucyxcbiAgQnVkZ2V0U3RlcCxcbiAgVGltZUJ1ZGdldE9wdGlvbnMsXG4gIFRpbWVCdWRnZXRSZXBvcnQsXG4gIFVuYm91bmRlZFJlYXNvbixcbiAgVW5ib3VuZGVkU3RhZ2UsXG59IGZyb20gJy4vbGliL2J1ZGdldC9pbmRleC5qcyc7XG5leHBvcnQgeyB0aW1lQnVkZ2V0IH0gZnJvbSAnLi9saWIvYnVkZ2V0L2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBUeXBlZFN0YWdlRnVuY3Rpb24gfSBmcm9tICcuL2xpYi9idWlsZGVyL3R5cGVkRmxvd0NoYXJ0LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHR5cGUgeyBTY29wZU1ldGhvZHMsIFR5cGVkU2NvcGUgfSBmcm9tICcuL2xpYi9yZWFjdGl2ZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB7IG5hcnJhdGl2ZSB9IGZyb20gJy4vcmVjb3JkZXJzLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVjaXNpb24gQnJhbmNoaW5nIOKAlCBkZWNpZGUoKSAvIHNlbGVjdCgpIHdpdGggZXZpZGVuY2UgY2FwdHVyZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IERlY2lzaW9uIEJyYW5jaGluZyAqL1xuZXhwb3J0IHR5cGUge1xuICBEZWNpZGVSdWxlLFxuICBEZWNpc2lvbkV2aWRlbmNlLFxuICBEZWNpc2lvblJlc3VsdCxcbiAgRGVmYXVsdEJyYW5jaCxcbiAgRmlsdGVyT3BzLFxuICBSdWxlRXZpZGVuY2UsXG4gIFNlbGVjdGlvbkV2aWRlbmNlLFxuICBTZWxlY3Rpb25SZXN1bHQsXG4gIFdoZW5DbGF1c2UsXG4gIFdoZXJlRmlsdGVyLFxufSBmcm9tICcuL2xpYi9kZWNpZGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IERlY2lzaW9uIEJyYW5jaGluZyAqL1xuZXhwb3J0IHsgZGVjaWRlLCBzZWxlY3QgfSBmcm9tICcuL2xpYi9kZWNpZGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IEVycm9ycyAqL1xuZXhwb3J0IHR5cGUgeyBUZXJtaW5hbEZhaWx1cmVDb250ZXh0IH0gZnJvbSAnLi9saWIvZXJyb3JzL3Rlcm1pbmFsRmFpbHVyZS5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEF0dGVtcHRzIOKAlCBldmVyeSB0cnkgb2YgYSByZXRyaWVkIHN0YWdlLCBhbmQgdGhlIGRlY2lzaW9uIHRoYXQgZm9sbG93ZWQgaXRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBAY2F0ZWdvcnkgQXR0ZW1wdHNcbiAqXG4gKiBPbmUgYEF0dGVtcHRSZWNvcmRgIHBlciBhdHRlbXB0IG9mIGEgc3RhZ2Ugd2l0aCBhIGRlY2xhcmVkIGByZXRyeWAgcG9saWN5LCBhIGB0aW1lb3V0TXNgLCBvciBhIHJ1biBkZWFkbGluZSDigJRcbiAqIHRpbWluZywgb3V0Y29tZSwgZmFpbHVyZSBjYXRlZ29yeSwgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIGFzIGBEZWNpc2lvbkV2aWRlbmNlYCDigJQgb24gdGhlIHN0YWdlJ3NcbiAqIGV4ZWN1dGlvbi10cmVlIG5vZGUgKGBTdGFnZVNuYXBzaG90LmF0dGVtcHRzYCAvIGBhdHRlbXB0U3VtbWFyeWApIGFuZCBvbiBgRmxvd1JlY29yZGVyLm9uQXR0ZW1wdGAuXG4gKiBBIGNhbGwgYSBzdGFnZSBtYWtlcyB0aHJvdWdoIGBzY29wZS4kY2FsbGAgaXMgcmVjb3JkZWQgdGhlIHNhbWUgd2F5IChraW5kIGAnY2FsbCdgKSwgYW5kIHNvIGlzIGFuIFNESydzIG93biByZXRyeVxuICogYW4gYWRhcHRlciByZXBvcnRzIHRocm91Z2ggYG9ic2VydmVkKClgIChgT2JzZXJ2ZWRBdHRlbXB0YCwga2luZCBgJ29ic2VydmVkJ2ApLiBgQXR0ZW1wdENvbnRleHRgIGlzIHdoYXRcbiAqIGBzY29wZS4kYXR0ZW1wdCgpYCByZXR1cm5zLCBhbmQgd2hhdCBhIGNhbGwncyBmdW5jdGlvbiBnZXRzICh0aGUgYXR0ZW1wdCdzIHNpZ25hbCwgdGhlIHRpbWUgbGVmdCwgYG9ic2VydmVkYCk7XG4gKiBgTGF0ZVdyaXRlYCBpcyBhIHdyaXRlIChvciBjYWxsKSBhbiBlbmRlZCBhdHRlbXB0IHRyaWVkIChgU3RhZ2VTbmFwc2hvdC5sYXRlV3JpdGVzYCkuIEEgc3RhZ2UgdGhhdCBjaGFuZ2VzIGFuXG4gKiBvdXRzaWRlIHN5c3RlbSBkZWNsYXJlcyBpdCAoYFN0YWdlVG91Y2hlc2AsIGAudG91Y2hlcygpYCksIGFuZCBhIGNhbGwgZG9lcyAoYENhbGxPcHRpb25zYCk6IGV2ZXJ5IGF0dGVtcHQgdGhlblxuICogY2FycmllcyBpdHMgYEF0dGVtcHRFZmZlY3RgLCBhbmQgdGhlIGtleSBydWxlIGlzIGhhbmRlZCBhbiBgSWRlbXBvdGVuY3lLZXlDb250ZXh0YCBvbmNlIHBlciBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENhdGVnb3J5LFxuICBBdHRlbXB0Q29udGV4dCxcbiAgQXR0ZW1wdEVmZmVjdCxcbiAgQXR0ZW1wdEVycm9yLFxuICBBdHRlbXB0SW5wdXRzLFxuICBBdHRlbXB0S2luZCxcbiAgQXR0ZW1wdE5leHQsXG4gIEF0dGVtcHRPcHRpb25zLFxuICBBdHRlbXB0T3V0Y29tZSxcbiAgQXR0ZW1wdFJlYXNvbixcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQXR0ZW1wdFN1bW1hcnksXG4gIENhbGxPcHRpb25zLFxuICBJZGVtcG90ZW5jeUtleUNvbnRleHQsXG4gIExhdGVXcml0ZSxcbiAgT2JzZXJ2ZWRBdHRlbXB0LFxuICBTdGFnZVRvdWNoZXMsXG4gIFVua25vd25FZmZlY3RJbml0LFxufSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcbi8qKlxuICogQGNhdGVnb3J5IEF0dGVtcHRzXG4gKlxuICogQW4gYXR0ZW1wdCBieSBuYW1lIChgc2VyaWVzYCArIGBhdHRlbXB0YCkgYW5kIHBlci1vdXRjb21lIGNvdW50cyDigJQgd2hhdCByZWNvcmRlciByb3dzIGhvbGQgb2YgYXR0ZW1wdHMuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQXR0ZW1wdE91dGNvbWVDb3VudHMsIEF0dGVtcHRSZWYgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9hdHRlbXB0U2VyaWVzLmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQXR0ZW1wdHNcbiAqXG4gKiBgYXR0ZW1wdCgpYCDigJQgdGhlIGF0dGVtcHQgcnVubmVyIGZvciBjb2RlIHRoYXQgaXMgbm90IGEgc3RhZ2UgKHJlY29yZHMgZ28gdG8gaXRzIGBvbkF0dGVtcHRgKTsgYGVycm9yQ2F0ZWdvcnlgXG4gKiDigJQgdGhlIG9uZSBmYWlsdXJlIGNsYXNzaWZpZXIgKHNldmVuIGZpeGVkIGNhdGVnb3JpZXMpOyBgcmV0cnlSdWxlc2Ag4oCUIHRoZSBvbmUgcmV0cnkgcnVsZSB0YWJsZSwgYXMgYGRlY2lkZSgpYFxuICogcnVsZXM7IHRoZSBhdHRlbXB0IGNvbnRyYWN0J3MgdHdvIGVycm9ycy5cbiAqL1xuZXhwb3J0IHsgYXR0ZW1wdCwgQXR0ZW1wdFRpbWVvdXRFcnJvciwgZXJyb3JDYXRlZ29yeSwgcmV0cnlSdWxlcywgVW5rbm93bkVmZmVjdEVycm9yIH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvcnJlbGF0aW9uXG4gKlxuICogVGhlIHJ1bidzIGNvcnJlbGF0aW9uICgxMC4xKTogYGVudi50cmFjZXBhcmVudGAgKFczQywgcGFyc2VkIHN0cmljdGx5KSBvciBgZW52LnRyYWNlSWRgICsgYGVudi5vcGVyYXRpb25JZGBcbiAqIGJlY29tZSBPTkUgZnJvemVuIGBSdW5Db3JyZWxhdGlvbmAgcGVyIHJ1biDigJQgb24gYGdldFNuYXBzaG90KCkuY29ycmVsYXRpb25gLCBldmVyeSBmbG93IGV2ZW50J3NcbiAqIGB0cmF2ZXJzYWxDb250ZXh0LmNvcnJlbGF0aW9uYCBhbmQgZXZlcnkgc2NvcGUgYW5kIGVtaXQgZXZlbnQncyBgY29ycmVsYXRpb25gLiBgcGFyc2VUcmFjZXBhcmVudGAgL1xuICogYGZvcm1hdFRyYWNlcGFyZW50YCBhcmUgdGhlIFczQyBjb2RlYzsgYSByZWZ1c2VkIGhlYWRlciB0aHJvd3MgYFRyYWNlcGFyZW50RXJyb3JgIHdpdGggYSBuYW1lZCBgcmVhc29uYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBQYXJzZWRUcmFjZXBhcmVudCwgUnVuQ29ycmVsYXRpb24sIFRyYWNlcGFyZW50RmllbGRzLCBUcmFjZXBhcmVudFJlZnVzYWwgfSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcbmV4cG9ydCB7IGZvcm1hdFRyYWNlcGFyZW50LCBwYXJzZVRyYWNlcGFyZW50LCBUcmFjZXBhcmVudEVycm9yIH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJ1biDigJQgRXhlY3V0ZSBjaGFydHMgYW5kIGNvbGxlY3QgcmVzdWx0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUge1xuICBDYXB0dXJlSGlzdG9yeU9wdGlvbnMsXG4gIENhcHR1cmVIaXN0b3J5UmVjZWlwdCxcbiAgQ2FwdHVyZUhpc3RvcnlTdGF0dXMsXG4gIENhcHR1cmVIaXN0b3J5VGFyZ2V0LFxufSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuZXhwb3J0IHR5cGUgeyBSdW5SZXN1bHQgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIFRoZSBjcmFzaC1zYWZlIHJlY29yZCAoMTAuMSk6IHRoZSBleGVjdXRvcidzIGBzaW5rYCBvcHRpb24sIGl0cyBhY2NvdW50aW5nIG9uIGBnZXRTbmFwc2hvdCgpLnNpbmtgLFxuICogYGV4ZWN1dG9yLmZsdXNoUmVjb3JkKClgJ3MgcmVzdWx0LCBhbmQgdGhlIGVycm9yIGEgcnVuIHdpdGggYG9uRmFpbHVyZTogJ2ZhaWwnYCByZWplY3RzIHdpdGguIFRoZSBwb3J0XG4gKiAoYFJlY29yZFNpbmtgLCBgbWVtb3J5U2lua2ApIGlzIGBmb290dHJhY2Uvd3JpdGVgJ3M7IHRoZSBmaWxlIGFkYXB0ZXIgaXMgYGZvb3RwcmludGpzL3NpbmtzYC5cbiAqIEBjYXRlZ29yeSBSdW5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBSZWNvcmRGbHVzaFJlc3VsdCxcbiAgUmVjb3JkU2lua0ZhaWx1cmVNb2RlLFxuICBSZWNvcmRTaW5rRmx1c2hNb2RlLFxuICBSZWNvcmRTaW5rT3B0aW9uLFxuICBSZWNvcmRTaW5rT3B0aW9ucyxcbiAgUmVjb3JkU2lua1N0YXRzLFxufSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB7IFJlY29yZFNpbmtFcnJvciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKlxuICogVGhlIGZvdXIgb2JzZXJ2YWJpbGl0eSBkaWFscyBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zYCBpbmhlcml0cy5cbiAqIEBjYXRlZ29yeSBSdW5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSdW5EaWFscyB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBGbG93Q2hhcnRFeGVjdXRvciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBSdW5Db250ZXh0IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB0eXBlIHsgQ2hhcnRPcGVuQVBJT3B0aW9ucywgTUNQVG9vbERlc2NyaXB0aW9uLCBSdW5uYWJsZUZsb3dDaGFydCB9IGZyb20gJy4vbGliL3J1bm5lci9SdW5uYWJsZUNoYXJ0LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT2JzZXJ2ZSDigJQgRGF0YSAoc2NvcGUgcmVjb3JkZXJzLCBmaXJlIGR1cmluZyBzdGFnZSBleGVjdXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGF0YSAqL1xuZXhwb3J0IHR5cGUge1xuICBDb21taXRFdmVudCxcbiAgRXJyb3JFdmVudCxcbiAgUmVhZEV2ZW50LFxuICBSZWRhY3Rpb25Qb2xpY3ksXG4gIFJlZGFjdGlvblJlcG9ydCxcbiAgU2NvcGVSZWNvcmRlcixcbiAgU3RhZ2VFdmVudCxcbiAgV3JpdGVFdmVudCxcbn0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB7IE1ldHJpY1JlY29yZGVyIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB7IERlYnVnUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgT3BlcmF0aW9uICovXG5leHBvcnQgeyBSZWNvcmRlck9wZXJhdGlvbiB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGVsaXZlcnkgdGllciAoUkZDLTAwMSBkZWZlcnJlZCBvYnNlcnZlcnMpXG4gKlxuICogRXZlcnkgYGF0dGFjaCpSZWNvcmRlcmAgY2FsbCBhY2NlcHRzIGFuIG9wdGlvbnMgYmFnOlxuICogYGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjLCB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH0pYCB0YWtlcyB0aGVcbiAqIHJlY29yZGVyIE9VVCBvZiB0aGUgZW5naW5lJ3MgaG90IHBhdGgg4oCUIGV2ZW50cyBhcmUgY2FwdHVyZWQgaW50byBvbmVcbiAqIGJvdW5kZWQsIHRvdGFsbHktb3JkZXJlZCBxdWV1ZSBhbmQgZGVsaXZlcmVkIGF0IHRoZSBuZXh0IG1pY3JvdGFza1xuICogY2hlY2twb2ludCAoXCJvbmUgYmVhdCBiZWhpbmRcIikuIE9taXQgYGRlbGl2ZXJ5YCBmb3IgdGhlIGhpc3RvcmljYWxcbiAqIHN5bmNocm9ub3VzIGNhbGwgKGJ5dGUtaWRlbnRpY2FsIHRvIHByZXZpb3VzIHJlbGVhc2VzKS4gQWNjb3VudGluZ1xuICogc3VyZmFjZXMgb24gYHNuYXBzaG90Lm9ic2VydmVyU3RhdHNgOyBgZXhlY3V0b3IuZHJhaW5PYnNlcnZlcnMoKWAgc2V0dGxlc1xuICogYXN5bmMgbGlzdGVuZXJzIGJlZm9yZSBzaHV0ZG93bi4gU2VlIGBkb2NzL2d1aWRlcy9vYnNlcnZlcnMtZGVmZXJyZWQubWRgLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEF0dGFjaFJlY29yZGVyT3B0aW9ucyxcbiAgT2JzZXJ2ZXJEZWxpdmVyeSxcbiAgT2JzZXJ2ZXJEcmFpblJlc3VsdCxcbiAgT2JzZXJ2ZXJTdGF0cyxcbn0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGVsaXZlcnkgdGllciAoUkZDLTAwMSBkZWZlcnJlZCBvYnNlcnZlcnMpXG4gKlxuICogYENhcHR1cmVQb2xpY3lgIOKAlCBob3cgYSBkZWZlcnJlZCBldmVudCdzIHBheWxvYWQgaXMgbWF0ZXJpYWxpemVkIGF0XG4gKiBjYXB0dXJlIHRpbWUgKGAnY2xvbmUnYCBieSBkZWZhdWx0IGZvciBhdHRhY2ggb3B0aW9ucyAvIGAnc3VtbWFyeSdgIC8gYCdyZWYnYCkuIGBPdmVyZmxvd1BvbGljeWBcbiAqIOKAlCB3aGF0IGEgc2F0dXJhdGVkIHF1ZXVlIGRvZXMgKGAnZHJvcC1vbGRlc3QnYCBkZWZhdWx0IC8gYCdzYW1wbGUnYCAvXG4gKiBgJ2Jsb2NrJ2ApLiBgRGlzcGF0Y2hlclN0YXRzYCAvIGBMaXN0ZW5lclN0YXRzYCDigJQgdGhlIGFjY291bnRpbmcgc2hhcGVzXG4gKiBlbWJlZGRlZCBpbiBgT2JzZXJ2ZXJTdGF0c2AuIFR5cGVzIG9ubHkg4oCUIHRoZSBvYnNlcnZlci1xdWV1ZSBtb2R1bGVcbiAqIGl0c2VsZiBpcyBpbnRlcm5hbDsgY29uc3VtZXJzIHVzZSB0aGUgYXR0YWNoIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZVBvbGljeSwgRGlzcGF0Y2hlclN0YXRzLCBMaXN0ZW5lclN0YXRzLCBPdmVyZmxvd1BvbGljeSB9IGZyb20gJy4vbGliL29ic2VydmVyLXF1ZXVlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBDb21iaW5lZCAoYm90aCBkYXRhLWZsb3cgYW5kIGNvbnRyb2wtZmxvdykgKi9cbmV4cG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgQ29tYmluZWQgKGJvdGggZGF0YS1mbG93IGFuZCBjb250cm9sLWZsb3cpICovXG5leHBvcnQge1xuICBoYXNFbWl0UmVjb3JkZXJNZXRob2RzLFxuICBoYXNGbG93UmVjb3JkZXJNZXRob2RzLFxuICBoYXNSZWNvcmRlck1ldGhvZHMsXG4gIGlzRmxvd0V2ZW50LFxufSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEVtaXQgKHVzZXItYXV0aG9yZWQgc3RydWN0dXJlZCBldmVudHMpXG4gKlxuICogVGhpcmQgb2JzZXJ2ZXIgY2hhbm5lbCAoYWxvbmdzaWRlIGBTY29wZVJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmApLiBDb25zdW1lclxuICogY29kZSBjYWxscyBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIGZyb20gaW5zaWRlIGEgc3RhZ2U7IGV2ZXJ5IGF0dGFjaGVkXG4gKiBgRW1pdFJlY29yZGVyLm9uRW1pdChldmVudClgIGZpcmVzIHN5bmNocm9ub3VzbHkgd2l0aCBzdGFnZS1jb250ZXh0XG4gKiBlbnJpY2htZW50LiBQYXNzLXRocm91Z2gg4oCUIG5vIGJ1ZmZlcmluZywgemVybyBhbGxvY2F0aW9uIHdoZW4gbm8gcmVjb3JkZXJcbiAqIGlzIGF0dGFjaGVkLlxuICovXG5leHBvcnQgdHlwZSB7IEVtaXRFdmVudCwgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPYnNlcnZlIOKAlCBGbG93IChGbG93UmVjb3JkZXIsIGZpcmVzIGFmdGVyIHN0YWdlIGV4ZWN1dGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dCcmVha0V2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dGb3JrRXZlbnQsXG4gIEZsb3dMb29wRXZlbnQsXG4gIEZsb3dOZXh0RXZlbnQsXG4gIEZsb3dSZWNvcmRlcixcbiAgRmxvd1J1bkV2ZW50LFxuICBGbG93UnVuRmFpbGVkRXZlbnQsXG4gIEZsb3dTZWxlY3RlZEV2ZW50LFxuICBGbG93U3RhZ2VFdmVudCxcbiAgRmxvd1N0YWdlUmV0cnlFdmVudCxcbiAgRmxvd1N1YmZsb3dFdmVudCxcbiAgRmxvd1N1YmZsb3dSZWdpc3RlcmVkRXZlbnQsXG4gIEZsb3dUaHJvdHRsZWRFdmVudCxcbiAgUmVzdW1lTGluayxcbiAgVHJhdmVyc2FsQ29udGV4dCxcbn0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93XG4gKlxuICogYE5hcnJhdGl2ZUZvcm1hdHRlcmAg4oCUIHBsdWdnYWJsZSBmb3JtYXR0ZXIgdGhhdCBjb252ZXJ0cyBldmVudCBjb250ZXh0XG4gKiBvYmplY3RzIGludG8gdGhlIHRleHQgbGluZXMgb2YgdGhlIG5hcnJhdGl2ZS5cbiAqL1xuZXhwb3J0IHR5cGUgeyBOYXJyYXRpdmVGb3JtYXR0ZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUgeyBNYW5pZmVzdEF0dGVtcHRSb3csIE1hbmlmZXN0RW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBBZGFwdGl2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTWlsZXN0b25lTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBQcm9ncmVzc2l2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgUkxFTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBTZXBhcmF0ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgU2lsZW50TmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBXaW5kb3dlZE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNlbGYtRGVzY3JpYmluZyDigJQgLmNvbnRyYWN0KCksIHRvT3BlbkFQSSgpLCB0b01DUFRvb2woKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNlbGYtRGVzY3JpYmluZyAqL1xuZXhwb3J0IHR5cGUgeyBKc29uU2NoZW1hIH0gZnJvbSAnLi9saWIvY29udHJhY3QvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTbmFwc2hvdCAmIENvbXBvc2l0aW9uIOKAlCBTdWJmbG93IG5hdmlnYXRpb24gYW5kIENvbXBvc2FibGVSdW5uZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBTbmFwc2hvdCAmIENvbXBvc2l0aW9uICovXG5leHBvcnQgdHlwZSB7IENvbXBvc2FibGVSdW5uZXIgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgUmVjb3JkZXJTbmFwc2hvdCwgUnVudGltZVNuYXBzaG90LCBTdWJ0cmVlU25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB7IGdldFN1YnRyZWVTbmFwc2hvdCwgbGlzdFN1YmZsb3dQYXRocyB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNjb3BlUmVjb3JkZXIgQ29tcG9zaXRpb24g4oCUIEJ1bmRsZSBtdWx0aXBsZSByZWNvcmRlcnMgaW50byBkb21haW4gcHJlc2V0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNjb3BlUmVjb3JkZXIgKi9cbmV4cG9ydCB7IENvbXBvc2l0ZVJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXVzZS9SZXN1bWUg4oCUIFNlcmlhbGl6YWJsZSBjaGVja3BvaW50cyBmb3IgbG9uZy1ydW5uaW5nIG9yIGh1bWFuLWluLXRoZS1sb29wIGZsb3dzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuZXhwb3J0IHR5cGUge1xuICBGbG93Y2hhcnRDaGVja3BvaW50LFxuICBQYXVzYWJsZUhhbmRsZXIsXG4gIFBhdXNlZEV4ZWN1dGlvbixcbiAgUGVuZGluZ1BhdXNlLFxuICBSZWRhY3Rpb25NYXJrcyxcbn0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWVcbiAqXG4gKiBgaW50ZXJydXB0KHNjb3BlLCB7IHJlYXNvbiwgZXhwZWN0cz8gfSlgIOKAlCBzdG9wIG1pZC1zdGFnZSB0byBhc2sgYSBxdWVzdGlvbixcbiAqIGFuZCBnZXQgdGhlIGFuc3dlciBiYWNrIGF0IHRoZSBzYW1lIGNhbGwgc2l0ZSB3aGVuIHRoZSBydW4gcmVzdW1lcy4gUmVzdW1lXG4gKiByZS1lbnRlcnMgdGhlIHN0YWdlIGZyb20gaXRzIFRPUCAoc3RhZ2VzIGFyZSBhdG9taWMpLCBzbyBrZWVwIHRoZSBoYWxmXG4gKiBiZWZvcmUgdGhlIGNhbGwgaWRlbXBvdGVudC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBJbnRlcnJ1cHRQYXlsb2FkIH0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuZXhwb3J0IHsgaW50ZXJydXB0IH0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNjb3BlUmVjb3JkZXIgKi9cbmV4cG9ydCB0eXBlIHsgQ29tcG9zaXRlU25hcHNob3QgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbmZpZ3VyYXRpb24g4oCUIFR5cGVzIHBhc3NlZCB0byBGbG93Q2hhcnRFeGVjdXRvciBhbmQgcnVuKClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uICovXG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiwgRXhlY3V0b3JSZXN1bHQsIFBhdXNlZFJlc3VsdCwgUnVuT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBTY29wZUZhY3RvcnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uXG4gKlxuICogUmVhZC10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgICgjMTQpOlxuICogYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIHBlci1yZWFkIHZhbHVlIGNsb25lLCBoaXN0b3JpY2FsIGJlaGF2aW9yKSAvXG4gKiBgJ3N1bW1hcnknYCAoY2hlYXAgYFJlYWRTdW1tYXJ5TWFya2VyYCBwZXIgcmVhZCkgLyBgJ29mZidgIChubyB0cmFja2luZyxcbiAqIHplcm8gcGVyLXJlYWQgY2xvbmUpLiBQYXNzIGFzIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgcmVhZFRyYWNraW5nIH0pYFxuICogb3IgY2FsbCBgZXhlY3V0b3Iuc2V0UmVhZFRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSZWFkU3VtbWFyeU1hcmtlciwgUmVhZFRyYWNraW5nTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBXcml0ZS10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoIzEzYy1BKSDigJQgdGhlXG4gKiBzaWJsaW5nIG9mIGBSZWFkVHJhY2tpbmdNb2RlYDsgYm90aCBhbGlhcyB0aGUgc2hhcmVkIGBSZXRlbnRpb25Qb2xpY3lgXG4gKiBmYW1pbHkgZnJvbSBgbGliL2NhcHR1cmVgLiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgcGVyLXdyaXRlIHZhbHVlIGNsb25lLFxuICogaGlzdG9yaWNhbCBiZWhhdmlvcikgLyBgJ3N1bW1hcnknYCAoY2hlYXAgYFdyaXRlU3VtbWFyeU1hcmtlcmAgcGVyIHdyaXRlKVxuICogLyBgJ29mZidgIChubyB0cmFja2luZzsgYHN0YWdlV3JpdGVzYCBhYnNlbnQgYW5kIHRoZSBgb25Db21taXRgIG11dGF0aW9uc1xuICogcGF5bG9hZCBpcyBlbXB0eSDigJQgd3JpdGVzIHRoZW1zZWx2ZXMgc3RpbGwgY29tbWl0LCBhbmQgdGhlIGNvbW1pdCBsb2cgaXNcbiAqIHVuYWZmZWN0ZWQpLiBQYXNzIGFzIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgd3JpdGVUcmFja2luZyB9KWAgb3JcbiAqIGNhbGwgYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICovXG5leHBvcnQgdHlwZSB7IFJldGVudGlvblBvbGljeSwgV3JpdGVTdW1tYXJ5TWFya2VyLCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBDb21taXQtdmFsdWVzIGVuY29kaW5nIGZvciB0aGUgQ09NTUlUIExPRyAoIzEzYy1CKSDigJQgdGhlIHRoaXJkIGRpYWwgb2ZcbiAqIHRoZSBmYW1pbHksIGFuZCB0aGUgb25seSBMT1NTTEVTUyBvbmUgKGl0IGNoYW5nZXMgdGhlIGxvZydzIGVuY29kaW5nLFxuICogbmV2ZXIgaXRzIGluZm9ybWF0aW9uKS4gYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIGV2ZXJ5IHN1cnZpdmluZyBgc2V0YCBzdG9yZXNcbiAqIHRoZSBmdWxsIGZpbmFsIHZhbHVlLCBieXRlLWlkZW50aWNhbCB0byBoaXN0b3J5KSAvIGAnZGVsdGEnYCAoYXJyYXlcbiAqIG5ldC1jaGFuZ2VzIHRoYXQgYXJlIFwiYmFzZSBwbHVzIGEgdGFpbFwiIGNvbW1pdCBhcyBhbiBgYXBwZW5kYCB2ZXJiXG4gKiBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGBkZWxldGVWYWx1ZSgpYCBjb21taXRzIGFzIGEgcmVhbCBgZGVsZXRlYCB2ZXJiO1xuICogb25lIHRyYWNlIGVudHJ5IHBlciBzdXJ2aXZpbmcgcGF0aCkuIFJlcGxheSByZWNvbnN0cnVjdHMgZXZlcnkgc3RlcCdzXG4gKiBmdWxsIHN0YXRlIGV4YWN0bHkuIENvbnN1bWVycyByZWFkaW5nIGBidW5kbGUub3ZlcndyaXRlW2tleV1gIGFzIHRoZSBmdWxsXG4gKiB2YWx1ZSBtdXN0IHVzZSBgY29tbWl0VmFsdWVBdGAgZnJvbSBgZm9vdHRyYWNlYC4gUGFzcyBhc1xuICogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBjb21taXRWYWx1ZXMgfSlgIG9yIGNhbGxcbiAqIGBleGVjdXRvci5zZXRDb21taXRWYWx1ZXMobW9kZSlgIGJlZm9yZSBgcnVuKClgOyB0aGUgYWN0aXZlIG1vZGUgaXMgdGhlXG4gKiBzbmFwc2hvdCBkaXNjcmltaW5hbnQgYGdldFNuYXBzaG90KCkuY29tbWl0VmFsdWVzYC5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb250cmFjdCAmIFZhbGlkYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgU2NoZW1hS2luZCwgVmFsaWRhdGlvbklzc3VlLCBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB7IGRldGVjdFNjaGVtYSwgaXNWYWxpZGF0YWJsZSwgaXNab2QgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHsgSW5wdXRWYWxpZGF0aW9uRXJyb3IsIHZhbGlkYXRlQWdhaW5zdFNjaGVtYSwgdmFsaWRhdGVPclRocm93IH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXJyb3IgVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgRXJyb3IgVXRpbGl0aWVzICovXG5leHBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IEVycm9yIFV0aWxpdGllcyAqL1xuZXhwb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgZm9ybWF0RXJyb3JJbmZvIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGV2IFRvb2xzIOKAlCBNb2RlIGZsYWdzIGFuZCBab2Qgc2NvcGUgdXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQGNhdGVnb3J5IERldiBUb29sc1xuICpcbiAqIEdsb2JhbCBkZXYtbW9kZSBmbGFnLiBDYWxsIGBlbmFibGVEZXZNb2RlKClgIGF0IGFwcGxpY2F0aW9uIHN0YXJ0dXAgdG9cbiAqIHR1cm4gb24gZGV2ZWxvcGVyLW9ubHkgZGlhZ25vc3RpY3MgYWNyb3NzIHRoZSBsaWJyYXJ5IOKAlCBjaXJjdWxhci1yZWZlcmVuY2VcbiAqIGRldGVjdGlvbiBpbiBzY29wZSB3cml0ZXMsIHdhcm5pbmdzIHdoZW4gYSByZWNvcmRlciBoYXMgbm8gb2JzZXJ2ZXJcbiAqIG1ldGhvZHMsIHN1c3BpY2lvdXMtcHJlZGljYXRlIHdhcm5pbmdzIGluIGRlY2lkZS9zZWxlY3QsIHN0cnVjdHVyYWxcbiAqIGNoZWNrcyBpbiBgZ2V0U3VidHJlZVNuYXBzaG90YCwgYW5kIGFueSBmdXR1cmUgZGV2LW9ubHkgZGlhZ25vc3RpYy5cbiAqXG4gKiBQcm9kdWN0aW9uIGxlYXZlcyBpdCBPRkYgYnkgZGVmYXVsdCAoemVybyBvdmVyaGVhZCkuIFNlZSB0aGUgSlNEb2Mgb25cbiAqIGBlbmFibGVEZXZNb2RlYCBmb3IgdGhlIGZ1bGwgbGlzdCBhbmQgdXNhZ2UgZXhhbXBsZS5cbiAqL1xuZXhwb3J0IHsgZGlzYWJsZURldk1vZGUsIGVuYWJsZURldk1vZGUsIGlzRGV2TW9kZSB9IGZyb20gJy4vbGliL2Rldk1vZGUuanMnO1xuXG4vLyBgZGVmaW5lU2NvcGVGcm9tWm9kYCBhbmQgdGhlIG90aGVyIHpvZC1iYXNlZCBzY29wZSBoZWxwZXJzIG1vdmVkIHRvIHRoZSBvcHQtaW5cbi8vIGBmb290cHJpbnRqcy96b2RgIGVudHJ5IOKAlCBrZWVwaW5nIHpvZCBvdXQgb2YgdGhlIGNvcmUgbG9hZCBwYXRoIChpdCBpcyBhblxuLy8gb3B0aW9uYWwgcGVlcikuIEltcG9ydCB0aGVtIGZyb20gJ2Zvb3RwcmludGpzL3pvZCcuXG4vLyBBIHJ1bidzIHJlY29yZCBhcyBKU09OIHdpdGhvdXQgdGhlIGVuZ2luZSdzIHJlY3Vyc2lvbiBsaW1pdCAoOS4yNi4wKTogdGhlXG4vLyBzYW1lIGJ5dGVzIEpTT04uc3RyaW5naWZ5IGVtaXRzLCBmb3IgYSBkZWVwIGBuZXh0YCBjaGFpbiBpdCBjYW5ub3QgZW5jb2RlLlxuZXhwb3J0IHR5cGUgeyBSZXRyeUxvb3BDYWxsLCBSZXRyeUxvb3BEZWNpc2lvbiwgUmV0cnlMb29wSWRlbnRpdHkgfSBmcm9tICcuL2xpYi9hdHRlbXB0L3JldHJ5TG9vcFR5cGVzLmpzJztcbmV4cG9ydCB0eXBlIHsgUmV0cnlMb29wQ29udGV4dCwgUmV0cnlMb29wT3B0aW9ucywgUmV0cnlMb29wU3RhdGUgfSBmcm9tICcuL2xpYi9idWlsZGVyL3JldHJ5TG9vcC5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENhcHR1cmVDaGFubmVsU3RhdHVzLFxuICBDYXB0dXJlTGltaXRhdGlvbixcbiAgTmF0aXZlQ2FwdHVyZU5vdGUsXG4gIFJlY29yZGVyQ2FwdHVyZUFja25vd2xlZGdlbWVudCxcbn0gZnJvbSAnLi9saWIvY2FwdHVyZS9uYXRpdmVDb3ZlcmFnZS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEVuZ2luZVJlYWRTb3VyY2VzLFxuICBOYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb24sXG4gIE5hdGl2ZVJlYWRDYXB0dXJlTm90ZSxcbiAgU291cmNlTGltaXRhdGlvbixcbn0gZnJvbSAnLi9saWIvY2FwdHVyZS9yZWFkU291cmNlcy5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFNvdXJjZUV4ZWN1dGlvbk93bmVyc2hpcCxcbiAgU291cmNlT3duZXJzaGlwR2FwLFxuICBTb3VyY2VPd25lcnNoaXBXaXRuZXNzLFxufSBmcm9tICcuL2xpYi9jYXB0dXJlL3NvdXJjZU93bmVyc2hpcEZvcm1hdC5qcyc7XG5leHBvcnQgeyBzdHJpbmdpZnlTbmFwc2hvdCB9IGZyb20gJy4vbGliL3J1bm5lci9zdHJpbmdpZnlTbmFwc2hvdC5qcyc7XG4iXX0=
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFTSCw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBc0N4RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFRbkQsNEJBQTRCO0FBQzVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQW9CM0MsbUNBQW1DO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFpRHZEOzs7Ozs7OztHQVFHO0FBQ0gsT0FBTyxFQUNMLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsZUFBZSxFQUNmLGtCQUFrQixHQUNuQixNQUFNLHdCQUF3QixDQUFDO0FBbUJoQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWdDL0Ysb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVF4RCxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQXFCbkQsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXJELG9DQUFvQztBQUNwQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQW1DNUQscUVBQXFFO0FBQ3JFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixXQUFXLEdBQ1osTUFBTSx5QkFBeUIsQ0FBQztBQWtEakMsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSzlELCtCQUErQjtBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RCwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdEUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXZFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFakUsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFtQnRFLHVDQUF1QztBQUN2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RSwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUUvRSw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUEwQjVELDZCQUE2QjtBQUM3QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFnRWpELHNDQUFzQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRSxzQ0FBc0M7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBU3JHLGdDQUFnQztBQUNoQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUUsK0VBQStFO0FBQy9FLGlEQUFpRDtBQUNqRCwrRUFBK0U7QUFFL0U7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQTBCNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZvb3RQcmludCDigJQgUHVibGljIEFQSSAodjMpXG4gKlxuICogVGhlIGZsb3djaGFydCBwYXR0ZXJuIGZvciBiYWNrZW5kIGNvZGUuXG4gKiBCdWlsZCDihpIgUnVuIOKGkiBPYnNlcnZlLlxuICpcbiAqICoqVGhlIGNvbW1vbiBpbXBvcnQgcGF0aHM6KipcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBmbG93Q2hhcnQsIGRlY2lkZSwgbmFycmF0aXZlIH0gZnJvbSAnZm9vdHByaW50anMnOyAgICAgICAgICAgLy8gbWFpbiDigJQgc3RhcnQgaGVyZVxuICogaW1wb3J0IHsgbWV0cmljcywgZGVidWcsIG1hbmlmZXN0IH0gICAgIGZyb20gJ2Zvb3RwcmludGpzL3JlY29yZGVycyc7IC8vIHJlY29yZGVyIGZhY3Rvcmllc1xuICogaW1wb3J0IHsgc3RhdGVBdCwgY2F1c2FsQ2hhaW4gfSBmcm9tICdmb290dHJhY2UnOyAgICAgLy8gcmVhZCBhIGZpbmlzaGVkIHJ1blxuICogaW1wb3J0IHsgUmVjb3JkRnJhbWUsIEV2ZW50TG9nIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJzsgICAgIC8vIHdyaXRlIGEgcmVjb3JkIHlvdXJzZWxmXG4gKiBpbXBvcnQgeyBTdGFnZUNvbnRleHQgfSAgICAgICAgICAgICAgICAgZnJvbSAnZm9vdHByaW50anMvYWR2YW5jZWQnOyAgLy8gZW5naW5lIGludGVybmFsc1xuICogYGBgXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFF1aWNrIFN0YXJ0IOKAlCBFdmVyeXRoaW5nIHlvdSBuZWVkIGZvciA5MCUgb2YgdXNlIGNhc2VzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB0eXBlIHsgRmxvd0NoYXJ0LCBTdGFnZUZ1bmN0aW9uIGFzIFN0YWdlSGFuZGxlciwgU3RyZWFtSGFuZGxlcnMgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHsgZmxvd0NoYXJ0LCBGbG93Q2hhcnRCdWlsZGVyLCBmbG93Q2hhcnRTZWxlY3RvciB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBRdWljayBTdGFydFxuICpcbiAqIENvbmZpZyBmb3IgYC5hZGRQYXJhbGxlbEZvckVhY2goKWAg4oCUIG9uZSBicmFuY2ggcGVyIGl0ZW0sIGJyYW5jaCBjb3VudFxuICogZGVjaWRlZCBhdCBydW4gdGltZSBmcm9tIHRoZSBwYXlsb2FkLiBgbWF4QnJhbmNoZXNgIGFuZCBgaW50b2AgYXJlIHJlcXVpcmVkXG4gKiBvbiBwdXJwb3NlIChzZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQpLlxuICovXG5leHBvcnQgdHlwZSB7IEJyYW5jaENoYXJ0LCBQYXJhbGxlbEZvckVhY2hDb25maWcsIFJldHJ5UG9saWN5IH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQg4oCUIGJ1aWxkLXRpbWUgb2JzZXJ2ZXIgKHR3aW4gb2YgRmxvd1JlY29yZGVyKSAqL1xuZXhwb3J0IHR5cGUge1xuICBTdHJ1Y3R1cmVEZWNpZGVyQ29tcGxldGVFdmVudCxcbiAgU3RydWN0dXJlRWRnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZUVkZ2VLaW5kLFxuICBTdHJ1Y3R1cmVMb29wRWRnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZVJlY29yZGVyLFxuICBTdHJ1Y3R1cmVTdGFnZUFkZGVkRXZlbnQsXG4gIFN0cnVjdHVyZVN0YWdlVGFnZ2VkRXZlbnQsXG4gIFN0cnVjdHVyZVN1YmZsb3dNb3VudGVkRXZlbnQsXG59IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBUaW1lIEJ1ZGdldFxuICpcbiAqIGB0aW1lQnVkZ2V0KGNoYXJ0KWAg4oCUIHRoZSBzbG93ZXN0IGEgY2hhcnQgY2FuIHRha2UsIGZyb20gaXRzIGRlY2xhcmVkIHJldHJ5IHBvbGljaWVzIChgYXR0ZW1wdHMgw5cgdGltZW91dE1zYCBwbHVzXG4gKiB0aGUgd2FpdHMsIHN1bW1lZCBhbG9uZyB0aGUgc2xvd2VzdCBwYXRoKSwgYW5kIGV2ZXJ5IHN0YWdlIHRoYXQgbWFrZXMgYSBwYXRoIHVuYm91bmRlZCwgYnkgbmFtZS4gYC5idWRnZXQobXMpYFxuICogZGVjbGFyZXMgdGhlIGNhbGxlcidzIGNvbnRyYWN0OyBgYnVpbGQoKWAgcmVmdXNlcyBhIGNoYXJ0IHRoYXQgY2Fubm90IGtlZXAgaXQuIEFsc28gYGNoYXJ0LnRpbWVCdWRnZXQoKWAuXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQnVkZ2V0QXNzdW1wdGlvbnMsXG4gIEJ1ZGdldFN0ZXAsXG4gIFRpbWVCdWRnZXRPcHRpb25zLFxuICBUaW1lQnVkZ2V0UmVwb3J0LFxuICBVbmJvdW5kZWRSZWFzb24sXG4gIFVuYm91bmRlZFN0YWdlLFxufSBmcm9tICcuL2xpYi9idWRnZXQvaW5kZXguanMnO1xuZXhwb3J0IHsgdGltZUJ1ZGdldCB9IGZyb20gJy4vbGliL2J1ZGdldC9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB0eXBlIHsgVHlwZWRTdGFnZUZ1bmN0aW9uIH0gZnJvbSAnLi9saWIvYnVpbGRlci90eXBlZEZsb3dDaGFydC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB0eXBlIHsgU2NvcGVNZXRob2RzLCBUeXBlZFNjb3BlIH0gZnJvbSAnLi9saWIvcmVhY3RpdmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgeyBuYXJyYXRpdmUgfSBmcm9tICcuL3JlY29yZGVycy5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERlY2lzaW9uIEJyYW5jaGluZyDigJQgZGVjaWRlKCkgLyBzZWxlY3QoKSB3aXRoIGV2aWRlbmNlIGNhcHR1cmVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBEZWNpc2lvbiBCcmFuY2hpbmcgKi9cbmV4cG9ydCB0eXBlIHtcbiAgRGVjaWRlUnVsZSxcbiAgRGVjaXNpb25FdmlkZW5jZSxcbiAgRGVjaXNpb25SZXN1bHQsXG4gIERlZmF1bHRCcmFuY2gsXG4gIEZpbHRlck9wcyxcbiAgUnVsZUV2aWRlbmNlLFxuICBTZWxlY3Rpb25FdmlkZW5jZSxcbiAgU2VsZWN0aW9uUmVzdWx0LFxuICBXaGVuQ2xhdXNlLFxuICBXaGVyZUZpbHRlcixcbn0gZnJvbSAnLi9saWIvZGVjaWRlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBEZWNpc2lvbiBCcmFuY2hpbmcgKi9cbmV4cG9ydCB7IGRlY2lkZSwgc2VsZWN0IH0gZnJvbSAnLi9saWIvZGVjaWRlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBFcnJvcnMgKi9cbmV4cG9ydCB0eXBlIHsgVGVybWluYWxGYWlsdXJlQ29udGV4dCB9IGZyb20gJy4vbGliL2Vycm9ycy90ZXJtaW5hbEZhaWx1cmUuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBdHRlbXB0cyDigJQgZXZlcnkgdHJ5IG9mIGEgcmV0cmllZCBzdGFnZSwgYW5kIHRoZSBkZWNpc2lvbiB0aGF0IGZvbGxvd2VkIGl0XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQGNhdGVnb3J5IEF0dGVtcHRzXG4gKlxuICogT25lIGBBdHRlbXB0UmVjb3JkYCBwZXIgYXR0ZW1wdCBvZiBhIHN0YWdlIHdpdGggYSBkZWNsYXJlZCBgcmV0cnlgIHBvbGljeSwgYSBgdGltZW91dE1zYCwgb3IgYSBydW4gZGVhZGxpbmUg4oCUXG4gKiB0aW1pbmcsIG91dGNvbWUsIGZhaWx1cmUgY2F0ZWdvcnksIGFuZCB0aGUgcmV0cnktb3Itc3RvcCBkZWNpc2lvbiBhcyBgRGVjaXNpb25FdmlkZW5jZWAg4oCUIG9uIHRoZSBzdGFnZSdzXG4gKiBleGVjdXRpb24tdHJlZSBub2RlIChgU3RhZ2VTbmFwc2hvdC5hdHRlbXB0c2AgLyBgYXR0ZW1wdFN1bW1hcnlgKSBhbmQgb24gYEZsb3dSZWNvcmRlci5vbkF0dGVtcHRgLlxuICogQSBjYWxsIGEgc3RhZ2UgbWFrZXMgdGhyb3VnaCBgc2NvcGUuJGNhbGxgIGlzIHJlY29yZGVkIHRoZSBzYW1lIHdheSAoa2luZCBgJ2NhbGwnYCksIGFuZCBzbyBpcyBhbiBTREsncyBvd24gcmV0cnlcbiAqIGFuIGFkYXB0ZXIgcmVwb3J0cyB0aHJvdWdoIGBvYnNlcnZlZCgpYCAoYE9ic2VydmVkQXR0ZW1wdGAsIGtpbmQgYCdvYnNlcnZlZCdgKS4gYEF0dGVtcHRDb250ZXh0YCBpcyB3aGF0XG4gKiBgc2NvcGUuJGF0dGVtcHQoKWAgcmV0dXJucywgYW5kIHdoYXQgYSBjYWxsJ3MgZnVuY3Rpb24gZ2V0cyAodGhlIGF0dGVtcHQncyBzaWduYWwsIHRoZSB0aW1lIGxlZnQsIGBvYnNlcnZlZGApO1xuICogYExhdGVXcml0ZWAgaXMgYSB3cml0ZSAob3IgY2FsbCkgYW4gZW5kZWQgYXR0ZW1wdCB0cmllZCAoYFN0YWdlU25hcHNob3QubGF0ZVdyaXRlc2ApLiBBIHN0YWdlIHRoYXQgY2hhbmdlcyBhblxuICogb3V0c2lkZSBzeXN0ZW0gZGVjbGFyZXMgaXQgKGBTdGFnZVRvdWNoZXNgLCBgLnRvdWNoZXMoKWApLCBhbmQgYSBjYWxsIGRvZXMgKGBDYWxsT3B0aW9uc2ApOiBldmVyeSBhdHRlbXB0IHRoZW5cbiAqIGNhcnJpZXMgaXRzIGBBdHRlbXB0RWZmZWN0YCwgYW5kIHRoZSBrZXkgcnVsZSBpcyBoYW5kZWQgYW4gYElkZW1wb3RlbmN5S2V5Q29udGV4dGAgb25jZSBwZXIgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEF0dGVtcHRDYXRlZ29yeSxcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRFZmZlY3QsXG4gIEF0dGVtcHRFcnJvcixcbiAgQXR0ZW1wdElucHV0cyxcbiAgQXR0ZW1wdEtpbmQsXG4gIEF0dGVtcHROZXh0LFxuICBBdHRlbXB0T3B0aW9ucyxcbiAgQXR0ZW1wdE91dGNvbWUsXG4gIEF0dGVtcHRSZWFzb24sXG4gIEF0dGVtcHRSZWNvcmQsXG4gIEF0dGVtcHRTdW1tYXJ5LFxuICBDYWxsT3B0aW9ucyxcbiAgSWRlbXBvdGVuY3lLZXlDb250ZXh0LFxuICBMYXRlV3JpdGUsXG4gIE9ic2VydmVkQXR0ZW1wdCxcbiAgU3RhZ2VUb3VjaGVzLFxuICBVbmtub3duRWZmZWN0SW5pdCxcbn0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG4vKipcbiAqIEBjYXRlZ29yeSBBdHRlbXB0c1xuICpcbiAqIEFuIGF0dGVtcHQgYnkgbmFtZSAoYHNlcmllc2AgKyBgYXR0ZW1wdGApIGFuZCBwZXItb3V0Y29tZSBjb3VudHMg4oCUIHdoYXQgcmVjb3JkZXIgcm93cyBob2xkIG9mIGF0dGVtcHRzLlxuICovXG5leHBvcnQgdHlwZSB7IEF0dGVtcHRPdXRjb21lQ291bnRzLCBBdHRlbXB0UmVmIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvYXR0ZW1wdFNlcmllcy5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IEF0dGVtcHRzXG4gKlxuICogYGF0dGVtcHQoKWAg4oCUIHRoZSBhdHRlbXB0IHJ1bm5lciBmb3IgY29kZSB0aGF0IGlzIG5vdCBhIHN0YWdlIChyZWNvcmRzIGdvIHRvIGl0cyBgb25BdHRlbXB0YCk7IGBlcnJvckNhdGVnb3J5YFxuICog4oCUIHRoZSBvbmUgZmFpbHVyZSBjbGFzc2lmaWVyIChzZXZlbiBmaXhlZCBjYXRlZ29yaWVzKTsgYHJldHJ5UnVsZXNgIOKAlCB0aGUgb25lIHJldHJ5IHJ1bGUgdGFibGUsIGFzIGBkZWNpZGUoKWBcbiAqIHJ1bGVzOyB0aGUgYXR0ZW1wdCBjb250cmFjdCdzIHR3byBlcnJvcnM7IGBleHBvbmVudGlhbEJhY2tvZmZgIC8gYHN0YXRlZFdhaXRGaXJzdGAg4oCUIGRldGVybWluaXN0aWMgYnVpbGRlcnMgb2ZcbiAqIHRoZSBmdW5jdGlvbiBhIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIHRha2VzIChgQmFja29mZlNwZWMubWF4RGVsYXlNc2AgY2FwcyB0aGUgc2NoZWR1bGUgYmVmb3JlIHRoZSBqaXR0ZXIgZHJhdzsgdGhlXG4gKiBwb2xpY3kncyBgbWF4QmFja29mZk1zYCBzdGlsbCBjYXBzIGV2ZXJ5IHdhaXQgYWZ0ZXIgaXQpLlxuICovXG5leHBvcnQge1xuICBhdHRlbXB0LFxuICBBdHRlbXB0VGltZW91dEVycm9yLFxuICBlcnJvckNhdGVnb3J5LFxuICBleHBvbmVudGlhbEJhY2tvZmYsXG4gIHJldHJ5UnVsZXMsXG4gIHN0YXRlZFdhaXRGaXJzdCxcbiAgVW5rbm93bkVmZmVjdEVycm9yLFxufSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcbi8qKlxuICogQGNhdGVnb3J5IEF0dGVtcHRzXG4gKlxuICogV2hhdCB0aGUgYmFja29mZiBidWlsZGVycyB0YWtlIGFuZCBidWlsZDogYW4gZXhwb25lbnRpYWwgc2NoZWR1bGUgKGBCYWNrb2ZmU3BlY2AsIGl0cyBgQmFja29mZkppdHRlcmApLCB0aGVcbiAqIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIGZ1bmN0aW9uIHRoZXkgcmV0dXJuIChgQmFja29mZkZ1bmN0aW9uYCksIGFuZCB0aGUgcmVhZGVyIG9mIGEgc3RhdGVkIHdhaXRcbiAqIChgU3RhdGVkV2FpdFJlYWRlcmAg4oCUIGEgcGFyc2VkIGBSZXRyeS1BZnRlcmAsIGluIG1pbGxpc2Vjb25kcykuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQmFja29mZkZ1bmN0aW9uLCBCYWNrb2ZmSml0dGVyLCBCYWNrb2ZmU3BlYywgU3RhdGVkV2FpdFJlYWRlciB9IGZyb20gJy4vbGliL2F0dGVtcHQvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb3JyZWxhdGlvblxuICpcbiAqIFRoZSBydW4ncyBjb3JyZWxhdGlvbiAoMTAuMSk6IGBlbnYudHJhY2VwYXJlbnRgIChXM0MsIHBhcnNlZCBzdHJpY3RseSkgb3IgYGVudi50cmFjZUlkYCArIGBlbnYub3BlcmF0aW9uSWRgXG4gKiBiZWNvbWUgT05FIGZyb3plbiBgUnVuQ29ycmVsYXRpb25gIHBlciBydW4g4oCUIG9uIGBnZXRTbmFwc2hvdCgpLmNvcnJlbGF0aW9uYCwgZXZlcnkgZmxvdyBldmVudCdzXG4gKiBgdHJhdmVyc2FsQ29udGV4dC5jb3JyZWxhdGlvbmAgYW5kIGV2ZXJ5IHNjb3BlIGFuZCBlbWl0IGV2ZW50J3MgYGNvcnJlbGF0aW9uYC4gYHBhcnNlVHJhY2VwYXJlbnRgIC9cbiAqIGBmb3JtYXRUcmFjZXBhcmVudGAgYXJlIHRoZSBXM0MgY29kZWM7IGEgcmVmdXNlZCBoZWFkZXIgdGhyb3dzIGBUcmFjZXBhcmVudEVycm9yYCB3aXRoIGEgbmFtZWQgYHJlYXNvbmAuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUGFyc2VkVHJhY2VwYXJlbnQsIFJ1bkNvcnJlbGF0aW9uLCBUcmFjZXBhcmVudEZpZWxkcywgVHJhY2VwYXJlbnRSZWZ1c2FsIH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG5leHBvcnQgeyBmb3JtYXRUcmFjZXBhcmVudCwgcGFyc2VUcmFjZXBhcmVudCwgVHJhY2VwYXJlbnRFcnJvciB9IGZyb20gJy4vbGliL2F0dGVtcHQvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSdW4g4oCUIEV4ZWN1dGUgY2hhcnRzIGFuZCBjb2xsZWN0IHJlc3VsdHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQ2FwdHVyZUhpc3RvcnlPcHRpb25zLFxuICBDYXB0dXJlSGlzdG9yeVJlY2VpcHQsXG4gIENhcHR1cmVIaXN0b3J5U3RhdHVzLFxuICBDYXB0dXJlSGlzdG9yeVRhcmdldCxcbn0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcbmV4cG9ydCB0eXBlIHsgUnVuUmVzdWx0IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB0eXBlIHsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEpOiB0aGUgZXhlY3V0b3IncyBgc2lua2Agb3B0aW9uLCBpdHMgYWNjb3VudGluZyBvbiBgZ2V0U25hcHNob3QoKS5zaW5rYCxcbiAqIGBleGVjdXRvci5mbHVzaFJlY29yZCgpYCdzIHJlc3VsdCwgYW5kIHRoZSBlcnJvciBhIHJ1biB3aXRoIGBvbkZhaWx1cmU6ICdmYWlsJ2AgcmVqZWN0cyB3aXRoLiBUaGUgcG9ydFxuICogKGBSZWNvcmRTaW5rYCwgYG1lbW9yeVNpbmtgKSBpcyBgZm9vdHRyYWNlL3dyaXRlYCdzOyB0aGUgZmlsZSBhZGFwdGVyIGlzIGBmb290cHJpbnRqcy9zaW5rc2AuXG4gKiBAY2F0ZWdvcnkgUnVuXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgUmVjb3JkRmx1c2hSZXN1bHQsXG4gIFJlY29yZFNpbmtGYWlsdXJlTW9kZSxcbiAgUmVjb3JkU2lua0ZsdXNoTW9kZSxcbiAgUmVjb3JkU2lua09wdGlvbixcbiAgUmVjb3JkU2lua09wdGlvbnMsXG4gIFJlY29yZFNpbmtTdGF0cyxcbn0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBSZWNvcmRTaW5rRXJyb3IgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIFRoZSBmb3VyIG9ic2VydmFiaWxpdHkgZGlhbHMgYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uc2AgaW5oZXJpdHMuXG4gKiBAY2F0ZWdvcnkgUnVuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUnVuRGlhbHMgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHsgRmxvd0NoYXJ0RXhlY3V0b3IgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHsgUnVuQ29udGV4dCB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgdHlwZSB7IENoYXJ0T3BlbkFQSU9wdGlvbnMsIE1DUFRvb2xEZXNjcmlwdGlvbiwgUnVubmFibGVGbG93Q2hhcnQgfSBmcm9tICcuL2xpYi9ydW5uZXIvUnVubmFibGVDaGFydC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9ic2VydmUg4oCUIERhdGEgKHNjb3BlIHJlY29yZGVycywgZmlyZSBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB0eXBlIHtcbiAgQ29tbWl0RXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIFJlYWRFdmVudCxcbiAgUmVkYWN0aW9uUG9saWN5LFxuICBSZWRhY3Rpb25SZXBvcnQsXG4gIFNjb3BlUmVjb3JkZXIsXG4gIFN0YWdlRXZlbnQsXG4gIFdyaXRlRXZlbnQsXG59IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEYXRhICovXG5leHBvcnQgeyBNZXRyaWNSZWNvcmRlciB9IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEYXRhICovXG5leHBvcnQgeyBEZWJ1Z1JlY29yZGVyIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIE9wZXJhdGlvbiAqL1xuZXhwb3J0IHsgUmVjb3JkZXJPcGVyYXRpb24gfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERlbGl2ZXJ5IHRpZXIgKFJGQy0wMDEgZGVmZXJyZWQgb2JzZXJ2ZXJzKVxuICpcbiAqIEV2ZXJ5IGBhdHRhY2gqUmVjb3JkZXJgIGNhbGwgYWNjZXB0cyBhbiBvcHRpb25zIGJhZzpcbiAqIGBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKHJlYywgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9KWAgdGFrZXMgdGhlXG4gKiByZWNvcmRlciBPVVQgb2YgdGhlIGVuZ2luZSdzIGhvdCBwYXRoIOKAlCBldmVudHMgYXJlIGNhcHR1cmVkIGludG8gb25lXG4gKiBib3VuZGVkLCB0b3RhbGx5LW9yZGVyZWQgcXVldWUgYW5kIGRlbGl2ZXJlZCBhdCB0aGUgbmV4dCBtaWNyb3Rhc2tcbiAqIGNoZWNrcG9pbnQgKFwib25lIGJlYXQgYmVoaW5kXCIpLiBPbWl0IGBkZWxpdmVyeWAgZm9yIHRoZSBoaXN0b3JpY2FsXG4gKiBzeW5jaHJvbm91cyBjYWxsIChieXRlLWlkZW50aWNhbCB0byBwcmV2aW91cyByZWxlYXNlcykuIEFjY291bnRpbmdcbiAqIHN1cmZhY2VzIG9uIGBzbmFwc2hvdC5vYnNlcnZlclN0YXRzYDsgYGV4ZWN1dG9yLmRyYWluT2JzZXJ2ZXJzKClgIHNldHRsZXNcbiAqIGFzeW5jIGxpc3RlbmVycyBiZWZvcmUgc2h1dGRvd24uIFNlZSBgZG9jcy9ndWlkZXMvb2JzZXJ2ZXJzLWRlZmVycmVkLm1kYC5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBBdHRhY2hSZWNvcmRlck9wdGlvbnMsXG4gIE9ic2VydmVyRGVsaXZlcnksXG4gIE9ic2VydmVyRHJhaW5SZXN1bHQsXG4gIE9ic2VydmVyU3RhdHMsXG59IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERlbGl2ZXJ5IHRpZXIgKFJGQy0wMDEgZGVmZXJyZWQgb2JzZXJ2ZXJzKVxuICpcbiAqIGBDYXB0dXJlUG9saWN5YCDigJQgaG93IGEgZGVmZXJyZWQgZXZlbnQncyBwYXlsb2FkIGlzIG1hdGVyaWFsaXplZCBhdFxuICogY2FwdHVyZSB0aW1lIChgJ2Nsb25lJ2AgYnkgZGVmYXVsdCBmb3IgYXR0YWNoIG9wdGlvbnMgLyBgJ3N1bW1hcnknYCAvIGAncmVmJ2ApLiBgT3ZlcmZsb3dQb2xpY3lgXG4gKiDigJQgd2hhdCBhIHNhdHVyYXRlZCBxdWV1ZSBkb2VzIChgJ2Ryb3Atb2xkZXN0J2AgZGVmYXVsdCAvIGAnc2FtcGxlJ2AgL1xuICogYCdibG9jaydgKS4gYERpc3BhdGNoZXJTdGF0c2AgLyBgTGlzdGVuZXJTdGF0c2Ag4oCUIHRoZSBhY2NvdW50aW5nIHNoYXBlc1xuICogZW1iZWRkZWQgaW4gYE9ic2VydmVyU3RhdHNgLiBUeXBlcyBvbmx5IOKAlCB0aGUgb2JzZXJ2ZXItcXVldWUgbW9kdWxlXG4gKiBpdHNlbGYgaXMgaW50ZXJuYWw7IGNvbnN1bWVycyB1c2UgdGhlIGF0dGFjaCBvcHRpb25zLlxuICovXG5leHBvcnQgdHlwZSB7IENhcHR1cmVQb2xpY3ksIERpc3BhdGNoZXJTdGF0cywgTGlzdGVuZXJTdGF0cywgT3ZlcmZsb3dQb2xpY3kgfSBmcm9tICcuL2xpYi9vYnNlcnZlci1xdWV1ZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgQ29tYmluZWQgKGJvdGggZGF0YS1mbG93IGFuZCBjb250cm9sLWZsb3cpICovXG5leHBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIENvbWJpbmVkIChib3RoIGRhdGEtZmxvdyBhbmQgY29udHJvbC1mbG93KSAqL1xuZXhwb3J0IHtcbiAgaGFzRW1pdFJlY29yZGVyTWV0aG9kcyxcbiAgaGFzRmxvd1JlY29yZGVyTWV0aG9kcyxcbiAgaGFzUmVjb3JkZXJNZXRob2RzLFxuICBpc0Zsb3dFdmVudCxcbn0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBFbWl0ICh1c2VyLWF1dGhvcmVkIHN0cnVjdHVyZWQgZXZlbnRzKVxuICpcbiAqIFRoaXJkIG9ic2VydmVyIGNoYW5uZWwgKGFsb25nc2lkZSBgU2NvcGVSZWNvcmRlcmAgYW5kIGBGbG93UmVjb3JkZXJgKS4gQ29uc3VtZXJcbiAqIGNvZGUgY2FsbHMgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBmcm9tIGluc2lkZSBhIHN0YWdlOyBldmVyeSBhdHRhY2hlZFxuICogYEVtaXRSZWNvcmRlci5vbkVtaXQoZXZlbnQpYCBmaXJlcyBzeW5jaHJvbm91c2x5IHdpdGggc3RhZ2UtY29udGV4dFxuICogZW5yaWNobWVudC4gUGFzcy10aHJvdWdoIOKAlCBubyBidWZmZXJpbmcsIHplcm8gYWxsb2NhdGlvbiB3aGVuIG5vIHJlY29yZGVyXG4gKiBpcyBhdHRhY2hlZC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBFbWl0RXZlbnQsIEVtaXRSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT2JzZXJ2ZSDigJQgRmxvdyAoRmxvd1JlY29yZGVyLCBmaXJlcyBhZnRlciBzdGFnZSBleGVjdXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUge1xuICBGbG93QXR0ZW1wdEV2ZW50LFxuICBGbG93QnJlYWtFdmVudCxcbiAgRmxvd0RlY2lzaW9uRXZlbnQsXG4gIEZsb3dFcnJvckV2ZW50LFxuICBGbG93Rm9ya0V2ZW50LFxuICBGbG93TG9vcEV2ZW50LFxuICBGbG93TmV4dEV2ZW50LFxuICBGbG93UmVjb3JkZXIsXG4gIEZsb3dSdW5FdmVudCxcbiAgRmxvd1J1bkZhaWxlZEV2ZW50LFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG4gIEZsb3dTdGFnZVJldHJ5RXZlbnQsXG4gIEZsb3dTdWJmbG93RXZlbnQsXG4gIEZsb3dTdWJmbG93UmVnaXN0ZXJlZEV2ZW50LFxuICBGbG93VGhyb3R0bGVkRXZlbnQsXG4gIFJlc3VtZUxpbmssXG4gIFRyYXZlcnNhbENvbnRleHQsXG59IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvd1xuICpcbiAqIGBOYXJyYXRpdmVGb3JtYXR0ZXJgIOKAlCBwbHVnZ2FibGUgZm9ybWF0dGVyIHRoYXQgY29udmVydHMgZXZlbnQgY29udGV4dFxuICogb2JqZWN0cyBpbnRvIHRoZSB0ZXh0IGxpbmVzIG9mIHRoZSBuYXJyYXRpdmUuXG4gKi9cbmV4cG9ydCB0eXBlIHsgTmFycmF0aXZlRm9ybWF0dGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB0eXBlIHsgTWFuaWZlc3RBdHRlbXB0Um93LCBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBNYW5pZmVzdEZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgQWRhcHRpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE1pbGVzdG9uZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgUHJvZ3Jlc3NpdmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFJMRU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgU2VwYXJhdGVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFNpbGVudE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgV2luZG93ZWROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTZWxmLURlc2NyaWJpbmcg4oCUIC5jb250cmFjdCgpLCB0b09wZW5BUEkoKSwgdG9NQ1BUb29sKClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBTZWxmLURlc2NyaWJpbmcgKi9cbmV4cG9ydCB0eXBlIHsgSnNvblNjaGVtYSB9IGZyb20gJy4vbGliL2NvbnRyYWN0L2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU25hcHNob3QgJiBDb21wb3NpdGlvbiDigJQgU3ViZmxvdyBuYXZpZ2F0aW9uIGFuZCBDb21wb3NhYmxlUnVubmVyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgU25hcHNob3QgJiBDb21wb3NpdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBDb21wb3NhYmxlUnVubmVyIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBTbmFwc2hvdCAmIENvbXBvc2l0aW9uICovXG5leHBvcnQgdHlwZSB7IFJlY29yZGVyU25hcHNob3QsIFJ1bnRpbWVTbmFwc2hvdCwgU3VidHJlZVNuYXBzaG90IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBTbmFwc2hvdCAmIENvbXBvc2l0aW9uICovXG5leHBvcnQgeyBnZXRTdWJ0cmVlU25hcHNob3QsIGxpc3RTdWJmbG93UGF0aHMgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTY29wZVJlY29yZGVyIENvbXBvc2l0aW9uIOKAlCBCdW5kbGUgbXVsdGlwbGUgcmVjb3JkZXJzIGludG8gZG9tYWluIHByZXNldHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBTY29wZVJlY29yZGVyICovXG5leHBvcnQgeyBDb21wb3NpdGVSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGF1c2UvUmVzdW1lIOKAlCBTZXJpYWxpemFibGUgY2hlY2twb2ludHMgZm9yIGxvbmctcnVubmluZyBvciBodW1hbi1pbi10aGUtbG9vcCBmbG93c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuLyoqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWUgKi9cbmV4cG9ydCB0eXBlIHtcbiAgRmxvd2NoYXJ0Q2hlY2twb2ludCxcbiAgUGF1c2FibGVIYW5kbGVyLFxuICBQYXVzZWRFeGVjdXRpb24sXG4gIFBlbmRpbmdQYXVzZSxcbiAgUmVkYWN0aW9uTWFya3MsXG59IGZyb20gJy4vbGliL3BhdXNlL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lXG4gKlxuICogYGludGVycnVwdChzY29wZSwgeyByZWFzb24sIGV4cGVjdHM/IH0pYCDigJQgc3RvcCBtaWQtc3RhZ2UgdG8gYXNrIGEgcXVlc3Rpb24sXG4gKiBhbmQgZ2V0IHRoZSBhbnN3ZXIgYmFjayBhdCB0aGUgc2FtZSBjYWxsIHNpdGUgd2hlbiB0aGUgcnVuIHJlc3VtZXMuIFJlc3VtZVxuICogcmUtZW50ZXJzIHRoZSBzdGFnZSBmcm9tIGl0cyBUT1AgKHN0YWdlcyBhcmUgYXRvbWljKSwgc28ga2VlcCB0aGUgaGFsZlxuICogYmVmb3JlIHRoZSBjYWxsIGlkZW1wb3RlbnQuXG4gKi9cbmV4cG9ydCB0eXBlIHsgSW50ZXJydXB0UGF5bG9hZCB9IGZyb20gJy4vbGliL3BhdXNlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWUgKi9cbmV4cG9ydCB7IGludGVycnVwdCB9IGZyb20gJy4vbGliL3BhdXNlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBTY29wZVJlY29yZGVyICovXG5leHBvcnQgdHlwZSB7IENvbXBvc2l0ZVNuYXBzaG90IH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb25maWd1cmF0aW9uIOKAlCBUeXBlcyBwYXNzZWQgdG8gRmxvd0NoYXJ0RXhlY3V0b3IgYW5kIHJ1bigpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYsIEV4ZWN1dG9yUmVzdWx0LCBQYXVzZWRSZXN1bHQsIFJ1bk9wdGlvbnMgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvblxuICpcbiAqIFJlYWQtdHJhY2tpbmcgcG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVJlYWRzYCAoIzE0KTpcbiAqIGAnZnVsbCdgIChkZWZhdWx0IOKAlCBwZXItcmVhZCB2YWx1ZSBjbG9uZSwgaGlzdG9yaWNhbCBiZWhhdmlvcikgL1xuICogYCdzdW1tYXJ5J2AgKGNoZWFwIGBSZWFkU3VtbWFyeU1hcmtlcmAgcGVyIHJlYWQpIC8gYCdvZmYnYCAobm8gdHJhY2tpbmcsXG4gKiB6ZXJvIHBlci1yZWFkIGNsb25lKS4gUGFzcyBhcyBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHJlYWRUcmFja2luZyB9KWBcbiAqIG9yIGNhbGwgYGV4ZWN1dG9yLnNldFJlYWRUcmFja2luZyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUmVhZFN1bW1hcnlNYXJrZXIsIFJlYWRUcmFja2luZ01vZGUgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uXG4gKlxuICogV3JpdGUtdHJhY2tpbmcgcG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVdyaXRlc2AgKCMxM2MtQSkg4oCUIHRoZVxuICogc2libGluZyBvZiBgUmVhZFRyYWNraW5nTW9kZWA7IGJvdGggYWxpYXMgdGhlIHNoYXJlZCBgUmV0ZW50aW9uUG9saWN5YFxuICogZmFtaWx5IGZyb20gYGxpYi9jYXB0dXJlYC4gYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIHBlci13cml0ZSB2YWx1ZSBjbG9uZSxcbiAqIGhpc3RvcmljYWwgYmVoYXZpb3IpIC8gYCdzdW1tYXJ5J2AgKGNoZWFwIGBXcml0ZVN1bW1hcnlNYXJrZXJgIHBlciB3cml0ZSlcbiAqIC8gYCdvZmYnYCAobm8gdHJhY2tpbmc7IGBzdGFnZVdyaXRlc2AgYWJzZW50IGFuZCB0aGUgYG9uQ29tbWl0YCBtdXRhdGlvbnNcbiAqIHBheWxvYWQgaXMgZW1wdHkg4oCUIHdyaXRlcyB0aGVtc2VsdmVzIHN0aWxsIGNvbW1pdCwgYW5kIHRoZSBjb21taXQgbG9nIGlzXG4gKiB1bmFmZmVjdGVkKS4gUGFzcyBhcyBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHdyaXRlVHJhY2tpbmcgfSlgIG9yXG4gKiBjYWxsIGBleGVjdXRvci5zZXRXcml0ZVRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSZXRlbnRpb25Qb2xpY3ksIFdyaXRlU3VtbWFyeU1hcmtlciwgV3JpdGVUcmFja2luZ01vZGUgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uXG4gKlxuICogQ29tbWl0LXZhbHVlcyBlbmNvZGluZyBmb3IgdGhlIENPTU1JVCBMT0cgKCMxM2MtQikg4oCUIHRoZSB0aGlyZCBkaWFsIG9mXG4gKiB0aGUgZmFtaWx5LCBhbmQgdGhlIG9ubHkgTE9TU0xFU1Mgb25lIChpdCBjaGFuZ2VzIHRoZSBsb2cncyBlbmNvZGluZyxcbiAqIG5ldmVyIGl0cyBpbmZvcm1hdGlvbikuIGAnZnVsbCdgIChkZWZhdWx0IOKAlCBldmVyeSBzdXJ2aXZpbmcgYHNldGAgc3RvcmVzXG4gKiB0aGUgZnVsbCBmaW5hbCB2YWx1ZSwgYnl0ZS1pZGVudGljYWwgdG8gaGlzdG9yeSkgLyBgJ2RlbHRhJ2AgKGFycmF5XG4gKiBuZXQtY2hhbmdlcyB0aGF0IGFyZSBcImJhc2UgcGx1cyBhIHRhaWxcIiBjb21taXQgYXMgYW4gYGFwcGVuZGAgdmVyYlxuICogc3RvcmluZyBvbmx5IHRoZSB0YWlsOyBgZGVsZXRlVmFsdWUoKWAgY29tbWl0cyBhcyBhIHJlYWwgYGRlbGV0ZWAgdmVyYjtcbiAqIG9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGgpLiBSZXBsYXkgcmVjb25zdHJ1Y3RzIGV2ZXJ5IHN0ZXAnc1xuICogZnVsbCBzdGF0ZSBleGFjdGx5LiBDb25zdW1lcnMgcmVhZGluZyBgYnVuZGxlLm92ZXJ3cml0ZVtrZXldYCBhcyB0aGUgZnVsbFxuICogdmFsdWUgbXVzdCB1c2UgYGNvbW1pdFZhbHVlQXRgIGZyb20gYGZvb3R0cmFjZWAuIFBhc3MgYXNcbiAqIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgY29tbWl0VmFsdWVzIH0pYCBvciBjYWxsXG4gKiBgZXhlY3V0b3Iuc2V0Q29tbWl0VmFsdWVzKG1vZGUpYCBiZWZvcmUgYHJ1bigpYDsgdGhlIGFjdGl2ZSBtb2RlIGlzIHRoZVxuICogc25hcHNob3QgZGlzY3JpbWluYW50IGBnZXRTbmFwc2hvdCgpLmNvbW1pdFZhbHVlc2AuXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29udHJhY3QgJiBWYWxpZGF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgQ29udHJhY3QgJiBWYWxpZGF0aW9uICovXG5leHBvcnQgdHlwZSB7IFNjaGVtYUtpbmQsIFZhbGlkYXRpb25Jc3N1ZSwgVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4vbGliL3NjaGVtYS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29udHJhY3QgJiBWYWxpZGF0aW9uICovXG5leHBvcnQgeyBkZXRlY3RTY2hlbWEsIGlzVmFsaWRhdGFibGUsIGlzWm9kIH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB7IElucHV0VmFsaWRhdGlvbkVycm9yLCB2YWxpZGF0ZUFnYWluc3RTY2hlbWEsIHZhbGlkYXRlT3JUaHJvdyB9IGZyb20gJy4vbGliL3NjaGVtYS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVycm9yIFV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IEVycm9yIFV0aWxpdGllcyAqL1xuZXhwb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBFcnJvciBVdGlsaXRpZXMgKi9cbmV4cG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIGZvcm1hdEVycm9ySW5mbyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERldiBUb29scyDigJQgTW9kZSBmbGFncyBhbmQgWm9kIHNjb3BlIHV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEBjYXRlZ29yeSBEZXYgVG9vbHNcbiAqXG4gKiBHbG9iYWwgZGV2LW1vZGUgZmxhZy4gQ2FsbCBgZW5hYmxlRGV2TW9kZSgpYCBhdCBhcHBsaWNhdGlvbiBzdGFydHVwIHRvXG4gKiB0dXJuIG9uIGRldmVsb3Blci1vbmx5IGRpYWdub3N0aWNzIGFjcm9zcyB0aGUgbGlicmFyeSDigJQgY2lyY3VsYXItcmVmZXJlbmNlXG4gKiBkZXRlY3Rpb24gaW4gc2NvcGUgd3JpdGVzLCB3YXJuaW5ncyB3aGVuIGEgcmVjb3JkZXIgaGFzIG5vIG9ic2VydmVyXG4gKiBtZXRob2RzLCBzdXNwaWNpb3VzLXByZWRpY2F0ZSB3YXJuaW5ncyBpbiBkZWNpZGUvc2VsZWN0LCBzdHJ1Y3R1cmFsXG4gKiBjaGVja3MgaW4gYGdldFN1YnRyZWVTbmFwc2hvdGAsIGFuZCBhbnkgZnV0dXJlIGRldi1vbmx5IGRpYWdub3N0aWMuXG4gKlxuICogUHJvZHVjdGlvbiBsZWF2ZXMgaXQgT0ZGIGJ5IGRlZmF1bHQgKHplcm8gb3ZlcmhlYWQpLiBTZWUgdGhlIEpTRG9jIG9uXG4gKiBgZW5hYmxlRGV2TW9kZWAgZm9yIHRoZSBmdWxsIGxpc3QgYW5kIHVzYWdlIGV4YW1wbGUuXG4gKi9cbmV4cG9ydCB7IGRpc2FibGVEZXZNb2RlLCBlbmFibGVEZXZNb2RlLCBpc0Rldk1vZGUgfSBmcm9tICcuL2xpYi9kZXZNb2RlLmpzJztcblxuLy8gYGRlZmluZVNjb3BlRnJvbVpvZGAgYW5kIHRoZSBvdGhlciB6b2QtYmFzZWQgc2NvcGUgaGVscGVycyBtb3ZlZCB0byB0aGUgb3B0LWluXG4vLyBgZm9vdHByaW50anMvem9kYCBlbnRyeSDigJQga2VlcGluZyB6b2Qgb3V0IG9mIHRoZSBjb3JlIGxvYWQgcGF0aCAoaXQgaXMgYW5cbi8vIG9wdGlvbmFsIHBlZXIpLiBJbXBvcnQgdGhlbSBmcm9tICdmb290cHJpbnRqcy96b2QnLlxuLy8gQSBydW4ncyByZWNvcmQgYXMgSlNPTiB3aXRob3V0IHRoZSBlbmdpbmUncyByZWN1cnNpb24gbGltaXQgKDkuMjYuMCk6IHRoZVxuLy8gc2FtZSBieXRlcyBKU09OLnN0cmluZ2lmeSBlbWl0cywgZm9yIGEgZGVlcCBgbmV4dGAgY2hhaW4gaXQgY2Fubm90IGVuY29kZS5cbmV4cG9ydCB0eXBlIHsgUmV0cnlMb29wQ2FsbCwgUmV0cnlMb29wRGVjaXNpb24sIFJldHJ5TG9vcElkZW50aXR5IH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9yZXRyeUxvb3BUeXBlcy5qcyc7XG5leHBvcnQgdHlwZSB7IFJldHJ5TG9vcENvbnRleHQsIFJldHJ5TG9vcE9wdGlvbnMsIFJldHJ5TG9vcFN0YXRlIH0gZnJvbSAnLi9saWIvYnVpbGRlci9yZXRyeUxvb3AuanMnO1xuZXhwb3J0IHR5cGUge1xuICBDYXB0dXJlQ2hhbm5lbFN0YXR1cyxcbiAgQ2FwdHVyZUxpbWl0YXRpb24sXG4gIE5hdGl2ZUNhcHR1cmVOb3RlLFxuICBSZWNvcmRlckNhcHR1cmVBY2tub3dsZWRnZW1lbnQsXG59IGZyb20gJy4vbGliL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UuanMnO1xuZXhwb3J0IHR5cGUge1xuICBFbmdpbmVSZWFkU291cmNlcyxcbiAgTmF0aXZlQ2FwdHVyZU9ic2VydmF0aW9uLFxuICBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUsXG4gIFNvdXJjZUxpbWl0YXRpb24sXG59IGZyb20gJy4vbGliL2NhcHR1cmUvcmVhZFNvdXJjZXMuanMnO1xuZXhwb3J0IHR5cGUge1xuICBTb3VyY2VFeGVjdXRpb25Pd25lcnNoaXAsXG4gIFNvdXJjZU93bmVyc2hpcEdhcCxcbiAgU291cmNlT3duZXJzaGlwV2l0bmVzcyxcbn0gZnJvbSAnLi9saWIvY2FwdHVyZS9zb3VyY2VPd25lcnNoaXBGb3JtYXQuanMnO1xuZXhwb3J0IHsgc3RyaW5naWZ5U25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXIvc3RyaW5naWZ5U25hcHNob3QuanMnO1xuIl19
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* attempt/backoff.ts — deterministic builders of a `RetryPolicy.backoffMs` function.
|
|
3
|
+
*
|
|
4
|
+
* WHY: every retry loop needs the same few lines — an exponential ceiling and some jitter — and every hand copy of them
|
|
5
|
+
* drifts: a different base, a different jitter, a stated `Retry-After` honoured in one loop and not the next. These
|
|
6
|
+
* helpers build the FUNCTION `RetryPolicy.backoffMs` already takes, so the policy keeps its one shape and the runner
|
|
7
|
+
* keeps its one law: it asks the function once per retry, caps the answer at `maxBackoffMs`, stops a series whose wait
|
|
8
|
+
* would outlast the run's deadline (`no-time-left`), and records the wait it chose (`AttemptRecord.delayMs`,
|
|
9
|
+
* `onStageRetry`'s `delayMs`). The trace explains every wait as it was waited; nothing is redrawn to explain it.
|
|
10
|
+
*
|
|
11
|
+
* exponentialBackoff({ baseDelayMs, multiplier = 2, maxDelayMs?, jitter = 'none', random = Math.random })
|
|
12
|
+
* the wait after failed attempt n, under its ceiling c = min(maxDelayMs, baseDelayMs × multiplier^(n − 1)):
|
|
13
|
+
* 'none' → c deterministic: `random` is never called
|
|
14
|
+
* 'equal' → c/2 + r × c/2 half fixed, half random (r = random(), in [0, 1])
|
|
15
|
+
* 'full' → r × c
|
|
16
|
+
* statedWaitFirst(readStatedWaitMs, inner)
|
|
17
|
+
* a wait the outside system STATED (a `Retry-After`, read off the error) wins; otherwise `inner` decides.
|
|
18
|
+
*
|
|
19
|
+
* TWO CAPS, two jobs:
|
|
20
|
+
* - `BackoffSpec.maxDelayMs` caps the SCHEDULE: it bounds the ceiling BEFORE the draw, so a capped schedule keeps its
|
|
21
|
+
* jitter. Capping after the draw instead would flatten every jittered wait to one constant once the schedule
|
|
22
|
+
* passes twice the cap — a fleet would retry in lockstep, which is what jitter is for preventing.
|
|
23
|
+
* - `RetryPolicy.maxBackoffMs` caps EVERY wait, a stated one included, after the draw; the runner enforces it and the
|
|
24
|
+
* static time budget counts a function backoff at it without calling it.
|
|
25
|
+
* A stated wait is never capped by the inner schedule's `maxDelayMs` — only `maxBackoffMs` and the deadline bound it.
|
|
26
|
+
* Without `maxDelayMs` a ceiling saturates at `Number.MAX_SAFE_INTEGER` ms, so no attempt makes a wait `Infinity`.
|
|
27
|
+
*
|
|
28
|
+
* THE SERVER CHOOSES A STATED WAIT. `statedWaitFirst` hands the wait to the outside system — a broken or hostile one
|
|
29
|
+
* can ask for an hour. Whenever the wait comes from the server, declare the policy's `maxBackoffMs` (the runner caps
|
|
30
|
+
* every wait at it) or run under a deadline (the runner stops a series whose wait would outlast it).
|
|
31
|
+
*
|
|
32
|
+
* Refused when built — by the field's name and the shape it needs, NEVER the value it was given (a field can hold a
|
|
33
|
+
* secret): a `TypeError` for a wrong type (`'100'` included), a `RangeError` for a number out of range. The rules: a
|
|
34
|
+
* `baseDelayMs` that is a finite number >= 0, a `multiplier` >= 1, a `maxDelayMs` >= `baseDelayMs`, a `jitter` of the
|
|
35
|
+
* three names, a `random` or a reader that is a function, an `inner` that is a function or a finite number >= 0.
|
|
36
|
+
*
|
|
37
|
+
* A DRAW IS NOT TRUSTED BLINDLY: a `random()` that answers anything but a number in [0, 1] — or throws — makes that
|
|
38
|
+
* wait the ceiling `c`, the longest the schedule allows. Never 0: a broken source cannot make every jittered retry
|
|
39
|
+
* fire at once. The default source is `Math.random`, looked up at each draw (so a spy installed later takes effect).
|
|
40
|
+
*/
|
|
41
|
+
import type { RetryPolicy } from './types.js';
|
|
42
|
+
/** How much of an exponential wait is random: none of it, half of it, or all of it. */
|
|
43
|
+
export type BackoffJitter = 'none' | 'equal' | 'full';
|
|
44
|
+
/** The schedule {@link exponentialBackoff} builds a `RetryPolicy.backoffMs` function from. */
|
|
45
|
+
export interface BackoffSpec {
|
|
46
|
+
/** The ceiling of the first wait (after attempt 1), in milliseconds — a finite number >= 0. */
|
|
47
|
+
readonly baseDelayMs: number;
|
|
48
|
+
/** How much each ceiling grows over the one before — a finite number >= 1. Default `2`. */
|
|
49
|
+
readonly multiplier?: number;
|
|
50
|
+
/**
|
|
51
|
+
* The most a ceiling may grow to, in milliseconds — a finite number >= `baseDelayMs`. It caps the SCHEDULE before
|
|
52
|
+
* the jitter is drawn, so waits at the cap still spread (`'equal'` between `maxDelayMs / 2` and `maxDelayMs`). It
|
|
53
|
+
* is not `RetryPolicy.maxBackoffMs`, which caps every wait after the draw, a stated one included. Absent: the
|
|
54
|
+
* ceiling grows until it saturates at `Number.MAX_SAFE_INTEGER`.
|
|
55
|
+
*/
|
|
56
|
+
readonly maxDelayMs?: number;
|
|
57
|
+
/** How much of each wait is random. Default `'none'`: the wait IS the ceiling. */
|
|
58
|
+
readonly jitter?: BackoffJitter;
|
|
59
|
+
/**
|
|
60
|
+
* The jitter's random source, answering in [0, 1]. Default `Math.random`, looked up at each draw; a fixed one makes a
|
|
61
|
+
* test exact. A draw outside [0, 1] (or a throw) makes that wait the ceiling — never 0.
|
|
62
|
+
*/
|
|
63
|
+
readonly random?: () => number;
|
|
64
|
+
}
|
|
65
|
+
/** A `RetryPolicy.backoffMs` function: the wait in milliseconds after failed attempt `attempt` (1-based). */
|
|
66
|
+
export type BackoffFunction = (attempt: number, error?: unknown) => number;
|
|
67
|
+
/** Reads the wait an error states (a parsed `Retry-After`), in milliseconds, or `undefined` when it states none. */
|
|
68
|
+
export type StatedWaitReader = (error: unknown) => number | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* A `RetryPolicy.backoffMs` function for an exponential schedule: the wait after failed attempt `n` is drawn under the
|
|
71
|
+
* ceiling `min(maxDelayMs, baseDelayMs × multiplier^(n − 1))` by the declared jitter — the schedule is capped BEFORE
|
|
72
|
+
* the draw, so it keeps its spread. The policy's `maxBackoffMs` still caps every wait after it.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```ts
|
|
76
|
+
* .retry({ attempts: 6, backoffMs: exponentialBackoff({ baseDelayMs: 200, maxDelayMs: 2_000, jitter: 'equal' }), maxBackoffMs: 5_000 })
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare function exponentialBackoff(spec: BackoffSpec): BackoffFunction;
|
|
80
|
+
/**
|
|
81
|
+
* A `RetryPolicy.backoffMs` function that honours a wait the outside system stated: when `readStatedWaitMs(error)`
|
|
82
|
+
* answers a finite number >= 0, that is the wait; otherwise `inner` (a backoff function, or a fixed number of
|
|
83
|
+
* milliseconds) decides. A reader that throws or answers anything else states nothing — a malformed `Retry-After`
|
|
84
|
+
* falls back to the schedule rather than to a wrong wait. The runner still caps the stated wait at `maxBackoffMs` and
|
|
85
|
+
* stops the series when it would outlast the run's deadline.
|
|
86
|
+
*
|
|
87
|
+
* The outside system chooses this wait, and a broken or hostile one can ask for an hour: whenever the wait comes from
|
|
88
|
+
* the server, declare the policy's `maxBackoffMs` (or run under a deadline).
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```ts
|
|
92
|
+
* const retryAfterMs = (error: unknown) => (error as { retryAfterMs?: number }).retryAfterMs;
|
|
93
|
+
* .retry({ attempts: 3, backoffMs: statedWaitFirst(retryAfterMs, exponentialBackoff({ baseDelayMs: 100 })), maxBackoffMs: 10_000 })
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export declare function statedWaitFirst(readStatedWaitMs: StatedWaitReader, inner: NonNullable<RetryPolicy['backoffMs']>): BackoffFunction;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* attempt/backoff.ts — deterministic builders of a `RetryPolicy.backoffMs` function.
|
|
3
|
+
*
|
|
4
|
+
* WHY: every retry loop needs the same few lines — an exponential ceiling and some jitter — and every hand copy of them
|
|
5
|
+
* drifts: a different base, a different jitter, a stated `Retry-After` honoured in one loop and not the next. These
|
|
6
|
+
* helpers build the FUNCTION `RetryPolicy.backoffMs` already takes, so the policy keeps its one shape and the runner
|
|
7
|
+
* keeps its one law: it asks the function once per retry, caps the answer at `maxBackoffMs`, stops a series whose wait
|
|
8
|
+
* would outlast the run's deadline (`no-time-left`), and records the wait it chose (`AttemptRecord.delayMs`,
|
|
9
|
+
* `onStageRetry`'s `delayMs`). The trace explains every wait as it was waited; nothing is redrawn to explain it.
|
|
10
|
+
*
|
|
11
|
+
* exponentialBackoff({ baseDelayMs, multiplier = 2, maxDelayMs?, jitter = 'none', random = Math.random })
|
|
12
|
+
* the wait after failed attempt n, under its ceiling c = min(maxDelayMs, baseDelayMs × multiplier^(n − 1)):
|
|
13
|
+
* 'none' → c deterministic: `random` is never called
|
|
14
|
+
* 'equal' → c/2 + r × c/2 half fixed, half random (r = random(), in [0, 1])
|
|
15
|
+
* 'full' → r × c
|
|
16
|
+
* statedWaitFirst(readStatedWaitMs, inner)
|
|
17
|
+
* a wait the outside system STATED (a `Retry-After`, read off the error) wins; otherwise `inner` decides.
|
|
18
|
+
*
|
|
19
|
+
* TWO CAPS, two jobs:
|
|
20
|
+
* - `BackoffSpec.maxDelayMs` caps the SCHEDULE: it bounds the ceiling BEFORE the draw, so a capped schedule keeps its
|
|
21
|
+
* jitter. Capping after the draw instead would flatten every jittered wait to one constant once the schedule
|
|
22
|
+
* passes twice the cap — a fleet would retry in lockstep, which is what jitter is for preventing.
|
|
23
|
+
* - `RetryPolicy.maxBackoffMs` caps EVERY wait, a stated one included, after the draw; the runner enforces it and the
|
|
24
|
+
* static time budget counts a function backoff at it without calling it.
|
|
25
|
+
* A stated wait is never capped by the inner schedule's `maxDelayMs` — only `maxBackoffMs` and the deadline bound it.
|
|
26
|
+
* Without `maxDelayMs` a ceiling saturates at `Number.MAX_SAFE_INTEGER` ms, so no attempt makes a wait `Infinity`.
|
|
27
|
+
*
|
|
28
|
+
* THE SERVER CHOOSES A STATED WAIT. `statedWaitFirst` hands the wait to the outside system — a broken or hostile one
|
|
29
|
+
* can ask for an hour. Whenever the wait comes from the server, declare the policy's `maxBackoffMs` (the runner caps
|
|
30
|
+
* every wait at it) or run under a deadline (the runner stops a series whose wait would outlast it).
|
|
31
|
+
*
|
|
32
|
+
* Refused when built — by the field's name and the shape it needs, NEVER the value it was given (a field can hold a
|
|
33
|
+
* secret): a `TypeError` for a wrong type (`'100'` included), a `RangeError` for a number out of range. The rules: a
|
|
34
|
+
* `baseDelayMs` that is a finite number >= 0, a `multiplier` >= 1, a `maxDelayMs` >= `baseDelayMs`, a `jitter` of the
|
|
35
|
+
* three names, a `random` or a reader that is a function, an `inner` that is a function or a finite number >= 0.
|
|
36
|
+
*
|
|
37
|
+
* A DRAW IS NOT TRUSTED BLINDLY: a `random()` that answers anything but a number in [0, 1] — or throws — makes that
|
|
38
|
+
* wait the ceiling `c`, the longest the schedule allows. Never 0: a broken source cannot make every jittered retry
|
|
39
|
+
* fire at once. The default source is `Math.random`, looked up at each draw (so a spy installed later takes effect).
|
|
40
|
+
*/
|
|
41
|
+
const JITTERS = ['none', 'equal', 'full'];
|
|
42
|
+
/** Where a ceiling saturates: a wait is never `Infinity` and never `NaN`. */
|
|
43
|
+
const MAX_WAIT_MS = Number.MAX_SAFE_INTEGER;
|
|
44
|
+
/** The default random source: `Math.random`, looked up at each draw — so a spy installed after building takes effect. */
|
|
45
|
+
const drawMathRandom = () => Math.random();
|
|
46
|
+
/**
|
|
47
|
+
* A `RetryPolicy.backoffMs` function for an exponential schedule: the wait after failed attempt `n` is drawn under the
|
|
48
|
+
* ceiling `min(maxDelayMs, baseDelayMs × multiplier^(n − 1))` by the declared jitter — the schedule is capped BEFORE
|
|
49
|
+
* the draw, so it keeps its spread. The policy's `maxBackoffMs` still caps every wait after it.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* .retry({ attempts: 6, backoffMs: exponentialBackoff({ baseDelayMs: 200, maxDelayMs: 2_000, jitter: 'equal' }), maxBackoffMs: 5_000 })
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export function exponentialBackoff(spec) {
|
|
57
|
+
const { baseDelayMs, multiplier, maxDelayMs, jitter, random } = readSpec(spec);
|
|
58
|
+
return (attempt) => {
|
|
59
|
+
const ceiling = ceilingOf(baseDelayMs, multiplier, maxDelayMs, stepOf(attempt));
|
|
60
|
+
if (jitter === 'none')
|
|
61
|
+
return ceiling;
|
|
62
|
+
const r = draw(random);
|
|
63
|
+
// An untrusted draw waits the ceiling — never 0, so a broken source cannot fire every jittered retry at once.
|
|
64
|
+
if (r === undefined)
|
|
65
|
+
return ceiling;
|
|
66
|
+
// Never above the ceiling, rounding included: halving a subnormal ceiling is inexact and can round up.
|
|
67
|
+
return jitter === 'equal' ? Math.min(ceiling, ceiling / 2 + (r * ceiling) / 2) : r * ceiling;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A `RetryPolicy.backoffMs` function that honours a wait the outside system stated: when `readStatedWaitMs(error)`
|
|
72
|
+
* answers a finite number >= 0, that is the wait; otherwise `inner` (a backoff function, or a fixed number of
|
|
73
|
+
* milliseconds) decides. A reader that throws or answers anything else states nothing — a malformed `Retry-After`
|
|
74
|
+
* falls back to the schedule rather than to a wrong wait. The runner still caps the stated wait at `maxBackoffMs` and
|
|
75
|
+
* stops the series when it would outlast the run's deadline.
|
|
76
|
+
*
|
|
77
|
+
* The outside system chooses this wait, and a broken or hostile one can ask for an hour: whenever the wait comes from
|
|
78
|
+
* the server, declare the policy's `maxBackoffMs` (or run under a deadline).
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```ts
|
|
82
|
+
* const retryAfterMs = (error: unknown) => (error as { retryAfterMs?: number }).retryAfterMs;
|
|
83
|
+
* .retry({ attempts: 3, backoffMs: statedWaitFirst(retryAfterMs, exponentialBackoff({ baseDelayMs: 100 })), maxBackoffMs: 10_000 })
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export function statedWaitFirst(readStatedWaitMs, inner) {
|
|
87
|
+
if (typeof readStatedWaitMs !== 'function') {
|
|
88
|
+
throw new TypeError('statedWaitFirst: readStatedWaitMs must be a function');
|
|
89
|
+
}
|
|
90
|
+
if (typeof inner !== 'function') {
|
|
91
|
+
checkNumber('statedWaitFirst: inner', inner, 0, 'a backoff function or a finite number >= 0');
|
|
92
|
+
}
|
|
93
|
+
return (attempt, error) => {
|
|
94
|
+
const stated = statedWaitOf(readStatedWaitMs, error);
|
|
95
|
+
if (stated !== undefined)
|
|
96
|
+
return stated;
|
|
97
|
+
return typeof inner === 'function' ? inner(attempt, error) : inner;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Each field read ONCE, then checked: what is checked is exactly what the function keeps (a getter cannot differ). */
|
|
101
|
+
function readSpec(spec) {
|
|
102
|
+
if (spec === null || typeof spec !== 'object') {
|
|
103
|
+
throw new TypeError('exponentialBackoff: the spec must be an object ({ baseDelayMs, multiplier?, maxDelayMs?, jitter?, random? })');
|
|
104
|
+
}
|
|
105
|
+
const { baseDelayMs, multiplier = 2, maxDelayMs, jitter = 'none', random = drawMathRandom } = spec;
|
|
106
|
+
checkNumber('exponentialBackoff: baseDelayMs', baseDelayMs, 0, 'a finite number >= 0');
|
|
107
|
+
checkNumber('exponentialBackoff: multiplier', multiplier, 1, 'a finite number >= 1');
|
|
108
|
+
// At least the base: a cap below it would make every wait the cap — a fixed schedule written as an exponential one.
|
|
109
|
+
if (maxDelayMs !== undefined) {
|
|
110
|
+
checkNumber('exponentialBackoff: maxDelayMs', maxDelayMs, baseDelayMs, 'a finite number >= baseDelayMs');
|
|
111
|
+
}
|
|
112
|
+
const jitterRule = "exponentialBackoff: jitter must be 'none', 'equal' or 'full'";
|
|
113
|
+
if (typeof jitter !== 'string')
|
|
114
|
+
throw new TypeError(jitterRule);
|
|
115
|
+
if (!JITTERS.includes(jitter))
|
|
116
|
+
throw new RangeError(jitterRule);
|
|
117
|
+
if (typeof random !== 'function') {
|
|
118
|
+
throw new TypeError('exponentialBackoff: random must be a function answering a number in [0, 1]');
|
|
119
|
+
}
|
|
120
|
+
return { baseDelayMs, multiplier, maxDelayMs: maxDelayMs ?? MAX_WAIT_MS, jitter, random };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* A finite number >= `min`, or the error that names `field` and the shape it needs — never the value it was given (a
|
|
124
|
+
* field can hold a secret): a `TypeError` for a non-number, a `RangeError` for a number out of range.
|
|
125
|
+
*/
|
|
126
|
+
function checkNumber(field, value, min, rule) {
|
|
127
|
+
if (typeof value !== 'number')
|
|
128
|
+
throw new TypeError(`${field} must be ${rule}`);
|
|
129
|
+
if (!Number.isFinite(value) || value < min)
|
|
130
|
+
throw new RangeError(`${field} must be ${rule}`);
|
|
131
|
+
}
|
|
132
|
+
/** The attempt as a schedule step: its whole part, at least 1 (anything that is not a finite number reads as 1). */
|
|
133
|
+
function stepOf(attempt) {
|
|
134
|
+
return typeof attempt === 'number' && Number.isFinite(attempt) && attempt >= 1 ? Math.floor(attempt) : 1;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* `min(maxDelayMs, baseDelayMs × multiplier^(step − 1))` — the schedule's cap, applied BEFORE any jitter is drawn
|
|
138
|
+
* (`maxDelayMs` is {@link MAX_WAIT_MS} when none was declared, so the ceiling saturates rather than overflows).
|
|
139
|
+
*/
|
|
140
|
+
function ceilingOf(baseDelayMs, multiplier, maxDelayMs, step) {
|
|
141
|
+
if (baseDelayMs === 0)
|
|
142
|
+
return 0;
|
|
143
|
+
const ceiling = baseDelayMs * multiplier ** (step - 1);
|
|
144
|
+
return ceiling < maxDelayMs ? ceiling : maxDelayMs;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* One draw from the random source: a number in [0, 1] (`-0` reads as `0`), or `undefined` when the source answers
|
|
148
|
+
* anything else or throws — an untrusted draw, which the caller turns into the ceiling.
|
|
149
|
+
*/
|
|
150
|
+
function draw(random) {
|
|
151
|
+
let r;
|
|
152
|
+
try {
|
|
153
|
+
r = random();
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
if (typeof r !== 'number' || !(r >= 0 && r <= 1))
|
|
159
|
+
return undefined;
|
|
160
|
+
return r === 0 ? 0 : r;
|
|
161
|
+
}
|
|
162
|
+
/** The wait `error` states, read once — none when the reader throws or answers anything but a finite number >= 0. */
|
|
163
|
+
function statedWaitOf(read, error) {
|
|
164
|
+
let value;
|
|
165
|
+
try {
|
|
166
|
+
value = read(error);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja29mZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYXR0ZW1wdC9iYWNrb2ZmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Q0c7QUFtQ0gsTUFBTSxPQUFPLEdBQTZCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUVwRSw2RUFBNkU7QUFDN0UsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0FBRTVDLHlIQUF5SDtBQUN6SCxNQUFNLGNBQWMsR0FBRyxHQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFFbkQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQWlCO0lBQ2xELE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9FLE9BQU8sQ0FBQyxPQUFlLEVBQVUsRUFBRTtRQUNqQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDaEYsSUFBSSxNQUFNLEtBQUssTUFBTTtZQUFFLE9BQU8sT0FBTyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2Qiw4R0FBOEc7UUFDOUcsSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLE9BQU8sT0FBTyxDQUFDO1FBQ3BDLHVHQUF1RztRQUN2RyxPQUFPLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDL0YsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLGdCQUFrQyxFQUNsQyxLQUE0QztJQUU1QyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDM0MsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLDRDQUE0QyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUNELE9BQU8sQ0FBQyxPQUFlLEVBQUUsS0FBZSxFQUFVLEVBQUU7UUFDbEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUN4QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCx1SEFBdUg7QUFDdkgsU0FBUyxRQUFRLENBQUMsSUFBaUI7SUFDakMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLDhHQUE4RyxDQUMvRyxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLEdBQUcsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ25HLFdBQVcsQ0FBQyxpQ0FBaUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDdkYsV0FBVyxDQUFDLGdDQUFnQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUNyRixvSEFBb0g7SUFDcEgsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsV0FBVyxDQUFDLGdDQUFnQyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztJQUMzRyxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsOERBQThELENBQUM7SUFDbEYsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLFNBQVMsQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxJQUFJLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDNUYsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsV0FBVyxDQUFDLEtBQWEsRUFBRSxLQUFjLEVBQUUsR0FBVyxFQUFFLElBQVk7SUFDM0UsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxHQUFHLEtBQUssWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxHQUFHO1FBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLEtBQUssWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQy9GLENBQUM7QUFFRCxvSEFBb0g7QUFDcEgsU0FBUyxNQUFNLENBQUMsT0FBZ0I7SUFDOUIsT0FBTyxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0csQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsU0FBUyxDQUFDLFdBQW1CLEVBQUUsVUFBa0IsRUFBRSxVQUFrQixFQUFFLElBQVk7SUFDMUYsSUFBSSxXQUFXLEtBQUssQ0FBQztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sT0FBTyxHQUFHLFdBQVcsR0FBRyxVQUFVLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkQsT0FBTyxPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxJQUFJLENBQUMsTUFBb0I7SUFDaEMsSUFBSSxDQUFVLENBQUM7SUFDZixJQUFJLENBQUM7UUFDSCxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDZixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNuRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxxSEFBcUg7QUFDckgsU0FBUyxZQUFZLENBQUMsSUFBc0IsRUFBRSxLQUFjO0lBQzFELElBQUksS0FBYyxDQUFDO0lBQ25CLElBQUksQ0FBQztRQUNILEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQy9GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGF0dGVtcHQvYmFja29mZi50cyDigJQgZGV0ZXJtaW5pc3RpYyBidWlsZGVycyBvZiBhIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIGZ1bmN0aW9uLlxuICpcbiAqIFdIWTogZXZlcnkgcmV0cnkgbG9vcCBuZWVkcyB0aGUgc2FtZSBmZXcgbGluZXMg4oCUIGFuIGV4cG9uZW50aWFsIGNlaWxpbmcgYW5kIHNvbWUgaml0dGVyIOKAlCBhbmQgZXZlcnkgaGFuZCBjb3B5IG9mIHRoZW1cbiAqIGRyaWZ0czogYSBkaWZmZXJlbnQgYmFzZSwgYSBkaWZmZXJlbnQgaml0dGVyLCBhIHN0YXRlZCBgUmV0cnktQWZ0ZXJgIGhvbm91cmVkIGluIG9uZSBsb29wIGFuZCBub3QgdGhlIG5leHQuIFRoZXNlXG4gKiBoZWxwZXJzIGJ1aWxkIHRoZSBGVU5DVElPTiBgUmV0cnlQb2xpY3kuYmFja29mZk1zYCBhbHJlYWR5IHRha2VzLCBzbyB0aGUgcG9saWN5IGtlZXBzIGl0cyBvbmUgc2hhcGUgYW5kIHRoZSBydW5uZXJcbiAqIGtlZXBzIGl0cyBvbmUgbGF3OiBpdCBhc2tzIHRoZSBmdW5jdGlvbiBvbmNlIHBlciByZXRyeSwgY2FwcyB0aGUgYW5zd2VyIGF0IGBtYXhCYWNrb2ZmTXNgLCBzdG9wcyBhIHNlcmllcyB3aG9zZSB3YWl0XG4gKiB3b3VsZCBvdXRsYXN0IHRoZSBydW4ncyBkZWFkbGluZSAoYG5vLXRpbWUtbGVmdGApLCBhbmQgcmVjb3JkcyB0aGUgd2FpdCBpdCBjaG9zZSAoYEF0dGVtcHRSZWNvcmQuZGVsYXlNc2AsXG4gKiBgb25TdGFnZVJldHJ5YCdzIGBkZWxheU1zYCkuIFRoZSB0cmFjZSBleHBsYWlucyBldmVyeSB3YWl0IGFzIGl0IHdhcyB3YWl0ZWQ7IG5vdGhpbmcgaXMgcmVkcmF3biB0byBleHBsYWluIGl0LlxuICpcbiAqICAgZXhwb25lbnRpYWxCYWNrb2ZmKHsgYmFzZURlbGF5TXMsIG11bHRpcGxpZXIgPSAyLCBtYXhEZWxheU1zPywgaml0dGVyID0gJ25vbmUnLCByYW5kb20gPSBNYXRoLnJhbmRvbSB9KVxuICogICAgIHRoZSB3YWl0IGFmdGVyIGZhaWxlZCBhdHRlbXB0IG4sIHVuZGVyIGl0cyBjZWlsaW5nIGMgPSBtaW4obWF4RGVsYXlNcywgYmFzZURlbGF5TXMgw5cgbXVsdGlwbGllcl4obiDiiJIgMSkpOlxuICogICAgICAgJ25vbmUnICDihpIgYyAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmlzdGljOiBgcmFuZG9tYCBpcyBuZXZlciBjYWxsZWRcbiAqICAgICAgICdlcXVhbCcg4oaSIGMvMiArIHIgw5cgYy8yICAgICAgIGhhbGYgZml4ZWQsIGhhbGYgcmFuZG9tIChyID0gcmFuZG9tKCksIGluIFswLCAxXSlcbiAqICAgICAgICdmdWxsJyAg4oaSIHIgw5cgY1xuICogICBzdGF0ZWRXYWl0Rmlyc3QocmVhZFN0YXRlZFdhaXRNcywgaW5uZXIpXG4gKiAgICAgYSB3YWl0IHRoZSBvdXRzaWRlIHN5c3RlbSBTVEFURUQgKGEgYFJldHJ5LUFmdGVyYCwgcmVhZCBvZmYgdGhlIGVycm9yKSB3aW5zOyBvdGhlcndpc2UgYGlubmVyYCBkZWNpZGVzLlxuICpcbiAqIFRXTyBDQVBTLCB0d28gam9iczpcbiAqICAgLSBgQmFja29mZlNwZWMubWF4RGVsYXlNc2AgY2FwcyB0aGUgU0NIRURVTEU6IGl0IGJvdW5kcyB0aGUgY2VpbGluZyBCRUZPUkUgdGhlIGRyYXcsIHNvIGEgY2FwcGVkIHNjaGVkdWxlIGtlZXBzIGl0c1xuICogICAgIGppdHRlci4gQ2FwcGluZyBhZnRlciB0aGUgZHJhdyBpbnN0ZWFkIHdvdWxkIGZsYXR0ZW4gZXZlcnkgaml0dGVyZWQgd2FpdCB0byBvbmUgY29uc3RhbnQgb25jZSB0aGUgc2NoZWR1bGVcbiAqICAgICBwYXNzZXMgdHdpY2UgdGhlIGNhcCDigJQgYSBmbGVldCB3b3VsZCByZXRyeSBpbiBsb2Nrc3RlcCwgd2hpY2ggaXMgd2hhdCBqaXR0ZXIgaXMgZm9yIHByZXZlbnRpbmcuXG4gKiAgIC0gYFJldHJ5UG9saWN5Lm1heEJhY2tvZmZNc2AgY2FwcyBFVkVSWSB3YWl0LCBhIHN0YXRlZCBvbmUgaW5jbHVkZWQsIGFmdGVyIHRoZSBkcmF3OyB0aGUgcnVubmVyIGVuZm9yY2VzIGl0IGFuZCB0aGVcbiAqICAgICBzdGF0aWMgdGltZSBidWRnZXQgY291bnRzIGEgZnVuY3Rpb24gYmFja29mZiBhdCBpdCB3aXRob3V0IGNhbGxpbmcgaXQuXG4gKiBBIHN0YXRlZCB3YWl0IGlzIG5ldmVyIGNhcHBlZCBieSB0aGUgaW5uZXIgc2NoZWR1bGUncyBgbWF4RGVsYXlNc2Ag4oCUIG9ubHkgYG1heEJhY2tvZmZNc2AgYW5kIHRoZSBkZWFkbGluZSBib3VuZCBpdC5cbiAqIFdpdGhvdXQgYG1heERlbGF5TXNgIGEgY2VpbGluZyBzYXR1cmF0ZXMgYXQgYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYCBtcywgc28gbm8gYXR0ZW1wdCBtYWtlcyBhIHdhaXQgYEluZmluaXR5YC5cbiAqXG4gKiBUSEUgU0VSVkVSIENIT09TRVMgQSBTVEFURUQgV0FJVC4gYHN0YXRlZFdhaXRGaXJzdGAgaGFuZHMgdGhlIHdhaXQgdG8gdGhlIG91dHNpZGUgc3lzdGVtIOKAlCBhIGJyb2tlbiBvciBob3N0aWxlIG9uZVxuICogY2FuIGFzayBmb3IgYW4gaG91ci4gV2hlbmV2ZXIgdGhlIHdhaXQgY29tZXMgZnJvbSB0aGUgc2VydmVyLCBkZWNsYXJlIHRoZSBwb2xpY3kncyBgbWF4QmFja29mZk1zYCAodGhlIHJ1bm5lciBjYXBzXG4gKiBldmVyeSB3YWl0IGF0IGl0KSBvciBydW4gdW5kZXIgYSBkZWFkbGluZSAodGhlIHJ1bm5lciBzdG9wcyBhIHNlcmllcyB3aG9zZSB3YWl0IHdvdWxkIG91dGxhc3QgaXQpLlxuICpcbiAqIFJlZnVzZWQgd2hlbiBidWlsdCDigJQgYnkgdGhlIGZpZWxkJ3MgbmFtZSBhbmQgdGhlIHNoYXBlIGl0IG5lZWRzLCBORVZFUiB0aGUgdmFsdWUgaXQgd2FzIGdpdmVuIChhIGZpZWxkIGNhbiBob2xkIGFcbiAqIHNlY3JldCk6IGEgYFR5cGVFcnJvcmAgZm9yIGEgd3JvbmcgdHlwZSAoYCcxMDAnYCBpbmNsdWRlZCksIGEgYFJhbmdlRXJyb3JgIGZvciBhIG51bWJlciBvdXQgb2YgcmFuZ2UuIFRoZSBydWxlczogYVxuICogYGJhc2VEZWxheU1zYCB0aGF0IGlzIGEgZmluaXRlIG51bWJlciA+PSAwLCBhIGBtdWx0aXBsaWVyYCA+PSAxLCBhIGBtYXhEZWxheU1zYCA+PSBgYmFzZURlbGF5TXNgLCBhIGBqaXR0ZXJgIG9mIHRoZVxuICogdGhyZWUgbmFtZXMsIGEgYHJhbmRvbWAgb3IgYSByZWFkZXIgdGhhdCBpcyBhIGZ1bmN0aW9uLCBhbiBgaW5uZXJgIHRoYXQgaXMgYSBmdW5jdGlvbiBvciBhIGZpbml0ZSBudW1iZXIgPj0gMC5cbiAqXG4gKiBBIERSQVcgSVMgTk9UIFRSVVNURUQgQkxJTkRMWTogYSBgcmFuZG9tKClgIHRoYXQgYW5zd2VycyBhbnl0aGluZyBidXQgYSBudW1iZXIgaW4gWzAsIDFdIOKAlCBvciB0aHJvd3Mg4oCUIG1ha2VzIHRoYXRcbiAqIHdhaXQgdGhlIGNlaWxpbmcgYGNgLCB0aGUgbG9uZ2VzdCB0aGUgc2NoZWR1bGUgYWxsb3dzLiBOZXZlciAwOiBhIGJyb2tlbiBzb3VyY2UgY2Fubm90IG1ha2UgZXZlcnkgaml0dGVyZWQgcmV0cnlcbiAqIGZpcmUgYXQgb25jZS4gVGhlIGRlZmF1bHQgc291cmNlIGlzIGBNYXRoLnJhbmRvbWAsIGxvb2tlZCB1cCBhdCBlYWNoIGRyYXcgKHNvIGEgc3B5IGluc3RhbGxlZCBsYXRlciB0YWtlcyBlZmZlY3QpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmV0cnlQb2xpY3kgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIEhvdyBtdWNoIG9mIGFuIGV4cG9uZW50aWFsIHdhaXQgaXMgcmFuZG9tOiBub25lIG9mIGl0LCBoYWxmIG9mIGl0LCBvciBhbGwgb2YgaXQuICovXG5leHBvcnQgdHlwZSBCYWNrb2ZmSml0dGVyID0gJ25vbmUnIHwgJ2VxdWFsJyB8ICdmdWxsJztcblxuLyoqIFRoZSBzY2hlZHVsZSB7QGxpbmsgZXhwb25lbnRpYWxCYWNrb2ZmfSBidWlsZHMgYSBgUmV0cnlQb2xpY3kuYmFja29mZk1zYCBmdW5jdGlvbiBmcm9tLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYWNrb2ZmU3BlYyB7XG4gIC8qKiBUaGUgY2VpbGluZyBvZiB0aGUgZmlyc3Qgd2FpdCAoYWZ0ZXIgYXR0ZW1wdCAxKSwgaW4gbWlsbGlzZWNvbmRzIOKAlCBhIGZpbml0ZSBudW1iZXIgPj0gMC4gKi9cbiAgcmVhZG9ubHkgYmFzZURlbGF5TXM6IG51bWJlcjtcbiAgLyoqIEhvdyBtdWNoIGVhY2ggY2VpbGluZyBncm93cyBvdmVyIHRoZSBvbmUgYmVmb3JlIOKAlCBhIGZpbml0ZSBudW1iZXIgPj0gMS4gRGVmYXVsdCBgMmAuICovXG4gIHJlYWRvbmx5IG11bHRpcGxpZXI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbW9zdCBhIGNlaWxpbmcgbWF5IGdyb3cgdG8sIGluIG1pbGxpc2Vjb25kcyDigJQgYSBmaW5pdGUgbnVtYmVyID49IGBiYXNlRGVsYXlNc2AuIEl0IGNhcHMgdGhlIFNDSEVEVUxFIGJlZm9yZVxuICAgKiB0aGUgaml0dGVyIGlzIGRyYXduLCBzbyB3YWl0cyBhdCB0aGUgY2FwIHN0aWxsIHNwcmVhZCAoYCdlcXVhbCdgIGJldHdlZW4gYG1heERlbGF5TXMgLyAyYCBhbmQgYG1heERlbGF5TXNgKS4gSXRcbiAgICogaXMgbm90IGBSZXRyeVBvbGljeS5tYXhCYWNrb2ZmTXNgLCB3aGljaCBjYXBzIGV2ZXJ5IHdhaXQgYWZ0ZXIgdGhlIGRyYXcsIGEgc3RhdGVkIG9uZSBpbmNsdWRlZC4gQWJzZW50OiB0aGVcbiAgICogY2VpbGluZyBncm93cyB1bnRpbCBpdCBzYXR1cmF0ZXMgYXQgYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICovXG4gIHJlYWRvbmx5IG1heERlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBIb3cgbXVjaCBvZiBlYWNoIHdhaXQgaXMgcmFuZG9tLiBEZWZhdWx0IGAnbm9uZSdgOiB0aGUgd2FpdCBJUyB0aGUgY2VpbGluZy4gKi9cbiAgcmVhZG9ubHkgaml0dGVyPzogQmFja29mZkppdHRlcjtcbiAgLyoqXG4gICAqIFRoZSBqaXR0ZXIncyByYW5kb20gc291cmNlLCBhbnN3ZXJpbmcgaW4gWzAsIDFdLiBEZWZhdWx0IGBNYXRoLnJhbmRvbWAsIGxvb2tlZCB1cCBhdCBlYWNoIGRyYXc7IGEgZml4ZWQgb25lIG1ha2VzIGFcbiAgICogdGVzdCBleGFjdC4gQSBkcmF3IG91dHNpZGUgWzAsIDFdIChvciBhIHRocm93KSBtYWtlcyB0aGF0IHdhaXQgdGhlIGNlaWxpbmcg4oCUIG5ldmVyIDAuXG4gICAqL1xuICByZWFkb25seSByYW5kb20/OiAoKSA9PiBudW1iZXI7XG59XG5cbi8qKiBBIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIGZ1bmN0aW9uOiB0aGUgd2FpdCBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgZmFpbGVkIGF0dGVtcHQgYGF0dGVtcHRgICgxLWJhc2VkKS4gKi9cbmV4cG9ydCB0eXBlIEJhY2tvZmZGdW5jdGlvbiA9IChhdHRlbXB0OiBudW1iZXIsIGVycm9yPzogdW5rbm93bikgPT4gbnVtYmVyO1xuXG4vKiogUmVhZHMgdGhlIHdhaXQgYW4gZXJyb3Igc3RhdGVzIChhIHBhcnNlZCBgUmV0cnktQWZ0ZXJgKSwgaW4gbWlsbGlzZWNvbmRzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IHN0YXRlcyBub25lLiAqL1xuZXhwb3J0IHR5cGUgU3RhdGVkV2FpdFJlYWRlciA9IChlcnJvcjogdW5rbm93bikgPT4gbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG5jb25zdCBKSVRURVJTOiByZWFkb25seSBCYWNrb2ZmSml0dGVyW10gPSBbJ25vbmUnLCAnZXF1YWwnLCAnZnVsbCddO1xuXG4vKiogV2hlcmUgYSBjZWlsaW5nIHNhdHVyYXRlczogYSB3YWl0IGlzIG5ldmVyIGBJbmZpbml0eWAgYW5kIG5ldmVyIGBOYU5gLiAqL1xuY29uc3QgTUFYX1dBSVRfTVMgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcblxuLyoqIFRoZSBkZWZhdWx0IHJhbmRvbSBzb3VyY2U6IGBNYXRoLnJhbmRvbWAsIGxvb2tlZCB1cCBhdCBlYWNoIGRyYXcg4oCUIHNvIGEgc3B5IGluc3RhbGxlZCBhZnRlciBidWlsZGluZyB0YWtlcyBlZmZlY3QuICovXG5jb25zdCBkcmF3TWF0aFJhbmRvbSA9ICgpOiBudW1iZXIgPT4gTWF0aC5yYW5kb20oKTtcblxuLyoqXG4gKiBBIGBSZXRyeVBvbGljeS5iYWNrb2ZmTXNgIGZ1bmN0aW9uIGZvciBhbiBleHBvbmVudGlhbCBzY2hlZHVsZTogdGhlIHdhaXQgYWZ0ZXIgZmFpbGVkIGF0dGVtcHQgYG5gIGlzIGRyYXduIHVuZGVyIHRoZVxuICogY2VpbGluZyBgbWluKG1heERlbGF5TXMsIGJhc2VEZWxheU1zIMOXIG11bHRpcGxpZXJeKG4g4oiSIDEpKWAgYnkgdGhlIGRlY2xhcmVkIGppdHRlciDigJQgdGhlIHNjaGVkdWxlIGlzIGNhcHBlZCBCRUZPUkVcbiAqIHRoZSBkcmF3LCBzbyBpdCBrZWVwcyBpdHMgc3ByZWFkLiBUaGUgcG9saWN5J3MgYG1heEJhY2tvZmZNc2Agc3RpbGwgY2FwcyBldmVyeSB3YWl0IGFmdGVyIGl0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLnJldHJ5KHsgYXR0ZW1wdHM6IDYsIGJhY2tvZmZNczogZXhwb25lbnRpYWxCYWNrb2ZmKHsgYmFzZURlbGF5TXM6IDIwMCwgbWF4RGVsYXlNczogMl8wMDAsIGppdHRlcjogJ2VxdWFsJyB9KSwgbWF4QmFja29mZk1zOiA1XzAwMCB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvbmVudGlhbEJhY2tvZmYoc3BlYzogQmFja29mZlNwZWMpOiBCYWNrb2ZmRnVuY3Rpb24ge1xuICBjb25zdCB7IGJhc2VEZWxheU1zLCBtdWx0aXBsaWVyLCBtYXhEZWxheU1zLCBqaXR0ZXIsIHJhbmRvbSB9ID0gcmVhZFNwZWMoc3BlYyk7XG4gIHJldHVybiAoYXR0ZW1wdDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICBjb25zdCBjZWlsaW5nID0gY2VpbGluZ09mKGJhc2VEZWxheU1zLCBtdWx0aXBsaWVyLCBtYXhEZWxheU1zLCBzdGVwT2YoYXR0ZW1wdCkpO1xuICAgIGlmIChqaXR0ZXIgPT09ICdub25lJykgcmV0dXJuIGNlaWxpbmc7XG4gICAgY29uc3QgciA9IGRyYXcocmFuZG9tKTtcbiAgICAvLyBBbiB1bnRydXN0ZWQgZHJhdyB3YWl0cyB0aGUgY2VpbGluZyDigJQgbmV2ZXIgMCwgc28gYSBicm9rZW4gc291cmNlIGNhbm5vdCBmaXJlIGV2ZXJ5IGppdHRlcmVkIHJldHJ5IGF0IG9uY2UuXG4gICAgaWYgKHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGNlaWxpbmc7XG4gICAgLy8gTmV2ZXIgYWJvdmUgdGhlIGNlaWxpbmcsIHJvdW5kaW5nIGluY2x1ZGVkOiBoYWx2aW5nIGEgc3Vibm9ybWFsIGNlaWxpbmcgaXMgaW5leGFjdCBhbmQgY2FuIHJvdW5kIHVwLlxuICAgIHJldHVybiBqaXR0ZXIgPT09ICdlcXVhbCcgPyBNYXRoLm1pbihjZWlsaW5nLCBjZWlsaW5nIC8gMiArIChyICogY2VpbGluZykgLyAyKSA6IHIgKiBjZWlsaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIEEgYFJldHJ5UG9saWN5LmJhY2tvZmZNc2AgZnVuY3Rpb24gdGhhdCBob25vdXJzIGEgd2FpdCB0aGUgb3V0c2lkZSBzeXN0ZW0gc3RhdGVkOiB3aGVuIGByZWFkU3RhdGVkV2FpdE1zKGVycm9yKWBcbiAqIGFuc3dlcnMgYSBmaW5pdGUgbnVtYmVyID49IDAsIHRoYXQgaXMgdGhlIHdhaXQ7IG90aGVyd2lzZSBgaW5uZXJgIChhIGJhY2tvZmYgZnVuY3Rpb24sIG9yIGEgZml4ZWQgbnVtYmVyIG9mXG4gKiBtaWxsaXNlY29uZHMpIGRlY2lkZXMuIEEgcmVhZGVyIHRoYXQgdGhyb3dzIG9yIGFuc3dlcnMgYW55dGhpbmcgZWxzZSBzdGF0ZXMgbm90aGluZyDigJQgYSBtYWxmb3JtZWQgYFJldHJ5LUFmdGVyYFxuICogZmFsbHMgYmFjayB0byB0aGUgc2NoZWR1bGUgcmF0aGVyIHRoYW4gdG8gYSB3cm9uZyB3YWl0LiBUaGUgcnVubmVyIHN0aWxsIGNhcHMgdGhlIHN0YXRlZCB3YWl0IGF0IGBtYXhCYWNrb2ZmTXNgIGFuZFxuICogc3RvcHMgdGhlIHNlcmllcyB3aGVuIGl0IHdvdWxkIG91dGxhc3QgdGhlIHJ1bidzIGRlYWRsaW5lLlxuICpcbiAqIFRoZSBvdXRzaWRlIHN5c3RlbSBjaG9vc2VzIHRoaXMgd2FpdCwgYW5kIGEgYnJva2VuIG9yIGhvc3RpbGUgb25lIGNhbiBhc2sgZm9yIGFuIGhvdXI6IHdoZW5ldmVyIHRoZSB3YWl0IGNvbWVzIGZyb21cbiAqIHRoZSBzZXJ2ZXIsIGRlY2xhcmUgdGhlIHBvbGljeSdzIGBtYXhCYWNrb2ZmTXNgIChvciBydW4gdW5kZXIgYSBkZWFkbGluZSkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCByZXRyeUFmdGVyTXMgPSAoZXJyb3I6IHVua25vd24pID0+IChlcnJvciBhcyB7IHJldHJ5QWZ0ZXJNcz86IG51bWJlciB9KS5yZXRyeUFmdGVyTXM7XG4gKiAucmV0cnkoeyBhdHRlbXB0czogMywgYmFja29mZk1zOiBzdGF0ZWRXYWl0Rmlyc3QocmV0cnlBZnRlck1zLCBleHBvbmVudGlhbEJhY2tvZmYoeyBiYXNlRGVsYXlNczogMTAwIH0pKSwgbWF4QmFja29mZk1zOiAxMF8wMDAgfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhdGVkV2FpdEZpcnN0KFxuICByZWFkU3RhdGVkV2FpdE1zOiBTdGF0ZWRXYWl0UmVhZGVyLFxuICBpbm5lcjogTm9uTnVsbGFibGU8UmV0cnlQb2xpY3lbJ2JhY2tvZmZNcyddPixcbik6IEJhY2tvZmZGdW5jdGlvbiB7XG4gIGlmICh0eXBlb2YgcmVhZFN0YXRlZFdhaXRNcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3N0YXRlZFdhaXRGaXJzdDogcmVhZFN0YXRlZFdhaXRNcyBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICBpZiAodHlwZW9mIGlubmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgY2hlY2tOdW1iZXIoJ3N0YXRlZFdhaXRGaXJzdDogaW5uZXInLCBpbm5lciwgMCwgJ2EgYmFja29mZiBmdW5jdGlvbiBvciBhIGZpbml0ZSBudW1iZXIgPj0gMCcpO1xuICB9XG4gIHJldHVybiAoYXR0ZW1wdDogbnVtYmVyLCBlcnJvcj86IHVua25vd24pOiBudW1iZXIgPT4ge1xuICAgIGNvbnN0IHN0YXRlZCA9IHN0YXRlZFdhaXRPZihyZWFkU3RhdGVkV2FpdE1zLCBlcnJvcik7XG4gICAgaWYgKHN0YXRlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gc3RhdGVkO1xuICAgIHJldHVybiB0eXBlb2YgaW5uZXIgPT09ICdmdW5jdGlvbicgPyBpbm5lcihhdHRlbXB0LCBlcnJvcikgOiBpbm5lcjtcbiAgfTtcbn1cblxuLyoqIEVhY2ggZmllbGQgcmVhZCBPTkNFLCB0aGVuIGNoZWNrZWQ6IHdoYXQgaXMgY2hlY2tlZCBpcyBleGFjdGx5IHdoYXQgdGhlIGZ1bmN0aW9uIGtlZXBzIChhIGdldHRlciBjYW5ub3QgZGlmZmVyKS4gKi9cbmZ1bmN0aW9uIHJlYWRTcGVjKHNwZWM6IEJhY2tvZmZTcGVjKTogUmVxdWlyZWQ8QmFja29mZlNwZWM+IHtcbiAgaWYgKHNwZWMgPT09IG51bGwgfHwgdHlwZW9mIHNwZWMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdleHBvbmVudGlhbEJhY2tvZmY6IHRoZSBzcGVjIG11c3QgYmUgYW4gb2JqZWN0ICh7IGJhc2VEZWxheU1zLCBtdWx0aXBsaWVyPywgbWF4RGVsYXlNcz8sIGppdHRlcj8sIHJhbmRvbT8gfSknLFxuICAgICk7XG4gIH1cbiAgY29uc3QgeyBiYXNlRGVsYXlNcywgbXVsdGlwbGllciA9IDIsIG1heERlbGF5TXMsIGppdHRlciA9ICdub25lJywgcmFuZG9tID0gZHJhd01hdGhSYW5kb20gfSA9IHNwZWM7XG4gIGNoZWNrTnVtYmVyKCdleHBvbmVudGlhbEJhY2tvZmY6IGJhc2VEZWxheU1zJywgYmFzZURlbGF5TXMsIDAsICdhIGZpbml0ZSBudW1iZXIgPj0gMCcpO1xuICBjaGVja051bWJlcignZXhwb25lbnRpYWxCYWNrb2ZmOiBtdWx0aXBsaWVyJywgbXVsdGlwbGllciwgMSwgJ2EgZmluaXRlIG51bWJlciA+PSAxJyk7XG4gIC8vIEF0IGxlYXN0IHRoZSBiYXNlOiBhIGNhcCBiZWxvdyBpdCB3b3VsZCBtYWtlIGV2ZXJ5IHdhaXQgdGhlIGNhcCDigJQgYSBmaXhlZCBzY2hlZHVsZSB3cml0dGVuIGFzIGFuIGV4cG9uZW50aWFsIG9uZS5cbiAgaWYgKG1heERlbGF5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNoZWNrTnVtYmVyKCdleHBvbmVudGlhbEJhY2tvZmY6IG1heERlbGF5TXMnLCBtYXhEZWxheU1zLCBiYXNlRGVsYXlNcywgJ2EgZmluaXRlIG51bWJlciA+PSBiYXNlRGVsYXlNcycpO1xuICB9XG4gIGNvbnN0IGppdHRlclJ1bGUgPSBcImV4cG9uZW50aWFsQmFja29mZjogaml0dGVyIG11c3QgYmUgJ25vbmUnLCAnZXF1YWwnIG9yICdmdWxsJ1wiO1xuICBpZiAodHlwZW9mIGppdHRlciAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3Ioaml0dGVyUnVsZSk7XG4gIGlmICghSklUVEVSUy5pbmNsdWRlcyhqaXR0ZXIpKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihqaXR0ZXJSdWxlKTtcbiAgaWYgKHR5cGVvZiByYW5kb20gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBvbmVudGlhbEJhY2tvZmY6IHJhbmRvbSBtdXN0IGJlIGEgZnVuY3Rpb24gYW5zd2VyaW5nIGEgbnVtYmVyIGluIFswLCAxXScpO1xuICB9XG4gIHJldHVybiB7IGJhc2VEZWxheU1zLCBtdWx0aXBsaWVyLCBtYXhEZWxheU1zOiBtYXhEZWxheU1zID8/IE1BWF9XQUlUX01TLCBqaXR0ZXIsIHJhbmRvbSB9O1xufVxuXG4vKipcbiAqIEEgZmluaXRlIG51bWJlciA+PSBgbWluYCwgb3IgdGhlIGVycm9yIHRoYXQgbmFtZXMgYGZpZWxkYCBhbmQgdGhlIHNoYXBlIGl0IG5lZWRzIOKAlCBuZXZlciB0aGUgdmFsdWUgaXQgd2FzIGdpdmVuIChhXG4gKiBmaWVsZCBjYW4gaG9sZCBhIHNlY3JldCk6IGEgYFR5cGVFcnJvcmAgZm9yIGEgbm9uLW51bWJlciwgYSBgUmFuZ2VFcnJvcmAgZm9yIGEgbnVtYmVyIG91dCBvZiByYW5nZS5cbiAqL1xuZnVuY3Rpb24gY2hlY2tOdW1iZXIoZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24sIG1pbjogbnVtYmVyLCBydWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgJHtydWxlfWApO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKGAke2ZpZWxkfSBtdXN0IGJlICR7cnVsZX1gKTtcbn1cblxuLyoqIFRoZSBhdHRlbXB0IGFzIGEgc2NoZWR1bGUgc3RlcDogaXRzIHdob2xlIHBhcnQsIGF0IGxlYXN0IDEgKGFueXRoaW5nIHRoYXQgaXMgbm90IGEgZmluaXRlIG51bWJlciByZWFkcyBhcyAxKS4gKi9cbmZ1bmN0aW9uIHN0ZXBPZihhdHRlbXB0OiB1bmtub3duKTogbnVtYmVyIHtcbiAgcmV0dXJuIHR5cGVvZiBhdHRlbXB0ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoYXR0ZW1wdCkgJiYgYXR0ZW1wdCA+PSAxID8gTWF0aC5mbG9vcihhdHRlbXB0KSA6IDE7XG59XG5cbi8qKlxuICogYG1pbihtYXhEZWxheU1zLCBiYXNlRGVsYXlNcyDDlyBtdWx0aXBsaWVyXihzdGVwIOKIkiAxKSlgIOKAlCB0aGUgc2NoZWR1bGUncyBjYXAsIGFwcGxpZWQgQkVGT1JFIGFueSBqaXR0ZXIgaXMgZHJhd25cbiAqIChgbWF4RGVsYXlNc2AgaXMge0BsaW5rIE1BWF9XQUlUX01TfSB3aGVuIG5vbmUgd2FzIGRlY2xhcmVkLCBzbyB0aGUgY2VpbGluZyBzYXR1cmF0ZXMgcmF0aGVyIHRoYW4gb3ZlcmZsb3dzKS5cbiAqL1xuZnVuY3Rpb24gY2VpbGluZ09mKGJhc2VEZWxheU1zOiBudW1iZXIsIG11bHRpcGxpZXI6IG51bWJlciwgbWF4RGVsYXlNczogbnVtYmVyLCBzdGVwOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoYmFzZURlbGF5TXMgPT09IDApIHJldHVybiAwO1xuICBjb25zdCBjZWlsaW5nID0gYmFzZURlbGF5TXMgKiBtdWx0aXBsaWVyICoqIChzdGVwIC0gMSk7XG4gIHJldHVybiBjZWlsaW5nIDwgbWF4RGVsYXlNcyA/IGNlaWxpbmcgOiBtYXhEZWxheU1zO1xufVxuXG4vKipcbiAqIE9uZSBkcmF3IGZyb20gdGhlIHJhbmRvbSBzb3VyY2U6IGEgbnVtYmVyIGluIFswLCAxXSAoYC0wYCByZWFkcyBhcyBgMGApLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzb3VyY2UgYW5zd2Vyc1xuICogYW55dGhpbmcgZWxzZSBvciB0aHJvd3Mg4oCUIGFuIHVudHJ1c3RlZCBkcmF3LCB3aGljaCB0aGUgY2FsbGVyIHR1cm5zIGludG8gdGhlIGNlaWxpbmcuXG4gKi9cbmZ1bmN0aW9uIGRyYXcocmFuZG9tOiAoKSA9PiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBsZXQgcjogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByID0gcmFuZG9tKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiByICE9PSAnbnVtYmVyJyB8fCAhKHIgPj0gMCAmJiByIDw9IDEpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gciA9PT0gMCA/IDAgOiByO1xufVxuXG4vKiogVGhlIHdhaXQgYGVycm9yYCBzdGF0ZXMsIHJlYWQgb25jZSDigJQgbm9uZSB3aGVuIHRoZSByZWFkZXIgdGhyb3dzIG9yIGFuc3dlcnMgYW55dGhpbmcgYnV0IGEgZmluaXRlIG51bWJlciA+PSAwLiAqL1xuZnVuY3Rpb24gc3RhdGVkV2FpdE9mKHJlYWQ6IFN0YXRlZFdhaXRSZWFkZXIsIGVycm9yOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgbGV0IHZhbHVlOiB1bmtub3duO1xuICB0cnkge1xuICAgIHZhbHVlID0gcmVhZChlcnJvcik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAwID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
@@ -24,11 +24,6 @@ export declare function isDeadlineReason(reason: unknown): boolean;
|
|
|
24
24
|
export declare function isCancelled(signal: AbortSignal | undefined): boolean;
|
|
25
25
|
/** A deadline as the engine reads one: a finite number (epoch ms), else none. */
|
|
26
26
|
export declare function readDeadline(value: unknown): number | undefined;
|
|
27
|
-
/**
|
|
28
|
-
* `setTimeout` for any delay: a delay past the host's limit is waited in chunks, so a 30-day deadline does not fire
|
|
29
|
-
* in a millisecond. Returns the one call that cancels it.
|
|
30
|
-
*/
|
|
31
|
-
export declare function setLongTimeout(fn: () => void, ms: number): () => void;
|
|
32
27
|
/** Whether `value` is an AbortSignal (structurally — a signal from another realm counts). */
|
|
33
28
|
export declare function isAbortSignal(value: unknown): value is AbortSignal;
|
|
34
29
|
/** A signal that aborts at a deadline (or with its input), and the one call that releases both. */
|