velocious 1.0.713 → 1.0.714

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -39,7 +39,7 @@
39
39
  * Explicit database-free in-process HTTP applications with optional request and buffered-response byte limits (see [docs/http-server.md](docs/http-server.md#database-free-applications))
40
40
  * Client-disconnect hooks for buffered (`request.onClientDisconnect` / `request.clientDisconnected`) alongside the streaming `response.onStreamClose` so long-running handlers can settle in-flight work when the socket goes away (see [docs/http-server.md](docs/http-server.md#client-disconnect-for-buffered-requests))
41
41
  * Default-on buffered HTTP response compression with Brotli/gzip content negotiation, global and per-response opt-outs, and HEAD-correct representation headers (see [docs/http-server.md](docs/http-server.md#response-compression))
42
- * Background jobs with Node SQL/TCP workers plus a Browser/Expo local SQLite store and in-process dispatcher, including failure events, authorized database-scoped dashboard counts, bounded drain-stall detection/recovery for the main dispatcher (`drainStoreOperationTimeoutMs`, reported as `background-jobs-drain-stall`), and an opt-in release-scoped main/worker generation protocol with acknowledged activation, asynchronous retirement, and retired-main recovery. Production compliance additionally requires downstream supervisor retention/activation ordering and release pins (see [docs/background-jobs.md](docs/background-jobs.md), [docs/local-background-jobs.md](docs/local-background-jobs.md), and [docs/background-jobs-dashboard.md](docs/background-jobs-dashboard.md))
42
+ * Background jobs with Node SQL/TCP workers plus a Browser/Expo local SQLite store and in-process dispatcher, including per-job-class wall-clock timeouts (`static timeoutMs`), failure events, authorized database-scoped dashboard counts, bounded drain-stall detection/recovery for the main dispatcher (`drainStoreOperationTimeoutMs`, reported as `background-jobs-drain-stall`), and an opt-in release-scoped main/worker generation protocol with acknowledged activation, asynchronous retirement, and retired-main recovery. Production compliance additionally requires downstream supervisor retention/activation ordering and release pins (see [docs/background-jobs.md](docs/background-jobs.md), [docs/local-background-jobs.md](docs/local-background-jobs.md), and [docs/background-jobs-dashboard.md](docs/background-jobs-dashboard.md))
43
43
  * Durable one-off background-job scheduling with exact epoch timestamps plus stable replacement, cancellation, normalized readback, and duplicate-free wake across Node SQL/TCP and Browser/Expo local SQLite adapters (see [docs/scheduled-background-job-enqueue.md](docs/scheduled-background-job-enqueue.md))
44
44
  * Rails-style request and database query logging with structured credential redaction (see [docs/logging.md](docs/logging.md))
45
45
  * EJS-backed mailers with delivery, queueing, and payload rendering support (see [docs/mailers.md](docs/mailers.md))
@@ -55,6 +55,17 @@ export default class VelociousJob {
55
55
  */
56
56
  static processTitle = undefined
57
57
 
58
+ /**
59
+ * Wall-clock bound this job class runs under, in ms. Set e.g.
60
+ * `static timeoutMs = 60 * 60 * 1000` on a job whose work legitimately takes
61
+ * hours so its type carries its own bound instead of relying on one global
62
+ * `backgroundJobs.jobTimeoutMs` tuned for the slowest job in the system. The
63
+ * `{timeoutMs}` enqueue option overrides it. A non-positive value disables the
64
+ * bound for this class. Left undefined, the worker-level value applies.
65
+ * @type {number | undefined}
66
+ */
67
+ static timeoutMs = undefined
68
+
58
69
  /**
59
70
  * Stops this performance and reschedules the same logical job row. This is
60
71
  * normal control flow: it does not count as a failure or consume a retry.
@@ -93,6 +104,25 @@ export default class VelociousJob {
93
104
  return merged
94
105
  }
95
106
 
107
+ /**
108
+ * Folds this job class's static `timeoutMs` into the enqueue options unless the
109
+ * caller already specified one, so a job type carries its own wall-clock bound
110
+ * instead of every job sharing one worker-level value. A class that declares
111
+ * nothing leaves the option absent, and the worker falls back to its own
112
+ * default — the prior behavior.
113
+ * @param {import("./types.js").BackgroundJobOptions | undefined} options - Job options.
114
+ * @returns {import("./types.js").BackgroundJobOptions} - Options including the resolved timeout.
115
+ */
116
+ static _withTimeout(options) {
117
+ const merged = options ? {...options} : {}
118
+
119
+ if (merged.timeoutMs === undefined && typeof this.timeoutMs === "number") {
120
+ merged.timeoutMs = this.timeoutMs
121
+ }
122
+
123
+ return merged
124
+ }
125
+
96
126
  /**
97
127
  * Resolves class-derived enqueue options on a hydrated job instance. Explicit
98
128
  * per-enqueue options take precedence over the instance concurrency key.
@@ -102,7 +132,7 @@ export default class VelociousJob {
102
132
  * @returns {import("./types.js").BackgroundJobOptions} - Resolved job options.
103
133
  */
104
134
  static _withJobContext({jobArgs, jobOptions}) {
105
- const options = this._withQueue(jobOptions)
135
+ const options = this._withTimeout(this._withQueue(jobOptions))
106
136
 
107
137
  if (options.concurrencyKey !== undefined) return options
108
138
 
@@ -175,7 +175,7 @@
175
175
  * @property {boolean} [deduplicateWhileQueued] - When true, skip the enqueue if an identical still-queued job (same job name, args and queue) is scheduled no later than this enqueue, returning the earliest matching job's id. A future retry does not suppress earlier work. Deduplication is independent of `concurrencyKey`, so the job keeps its normal (e.g. queue-derived) concurrency cap. Keeps an interval-scheduled recurring job (e.g. retention pruning) from piling up redundant queued rows when it runs slower than its interval or no worker is free.
176
176
  * @property {string} [idempotencyKey] - Durable enqueue identity scoped to the resolved job class name and queue. Exact replay returns the original job id across every state and after job pruning; reuse with different canonical arguments or behavior-affecting options fails. Ownership is independent of `deduplicateWhileQueued` and is retained until an explicit future retention policy removes it.
177
177
  * @property {number} [scheduledAtMs] - Epoch timestamp in milliseconds when the job becomes eligible for dispatch. Defaults to enqueue time.
178
- * @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
178
+ * @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides a job class's `static timeoutMs` and the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
179
179
  */
180
180
  /**
181
181
  * @typedef {object} BackgroundJobPayload
@@ -39,6 +39,16 @@ export default class VelociousJob<TArgs extends Array<ReturnType<typeof JSON.par
39
39
  * @type {string | undefined}
40
40
  */
41
41
  static processTitle: string | undefined;
42
+ /**
43
+ * Wall-clock bound this job class runs under, in ms. Set e.g.
44
+ * `static timeoutMs = 60 * 60 * 1000` on a job whose work legitimately takes
45
+ * hours so its type carries its own bound instead of relying on one global
46
+ * `backgroundJobs.jobTimeoutMs` tuned for the slowest job in the system. The
47
+ * `{timeoutMs}` enqueue option overrides it. A non-positive value disables the
48
+ * bound for this class. Left undefined, the worker-level value applies.
49
+ * @type {number | undefined}
50
+ */
51
+ static timeoutMs: number | undefined;
42
52
  /**
43
53
  * Stops this performance and reschedules the same logical job row. This is
44
54
  * normal control flow: it does not count as a failure or consume a retry.
@@ -58,6 +68,16 @@ export default class VelociousJob<TArgs extends Array<ReturnType<typeof JSON.par
58
68
  * @returns {import("./types.js").BackgroundJobOptions} - Options including the resolved queue.
59
69
  */
60
70
  static _withQueue(options: import("./types.js").BackgroundJobOptions | undefined): import("./types.js").BackgroundJobOptions;
71
+ /**
72
+ * Folds this job class's static `timeoutMs` into the enqueue options unless the
73
+ * caller already specified one, so a job type carries its own wall-clock bound
74
+ * instead of every job sharing one worker-level value. A class that declares
75
+ * nothing leaves the option absent, and the worker falls back to its own
76
+ * default — the prior behavior.
77
+ * @param {import("./types.js").BackgroundJobOptions | undefined} options - Job options.
78
+ * @returns {import("./types.js").BackgroundJobOptions} - Options including the resolved timeout.
79
+ */
80
+ static _withTimeout(options: import("./types.js").BackgroundJobOptions | undefined): import("./types.js").BackgroundJobOptions;
61
81
  /**
62
82
  * Resolves class-derived enqueue options on a hydrated job instance. Explicit
63
83
  * per-enqueue options take precedence over the instance concurrency key.
@@ -1 +1 @@
1
- {"version":3,"file":"platform-job.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/platform-job.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform-job.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/platform-job.js"],"names":[],"mappings":"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"}
@@ -43,6 +43,16 @@ export default class VelociousJob {
43
43
  * @type {string | undefined}
44
44
  */
45
45
  static processTitle = undefined;
46
+ /**
47
+ * Wall-clock bound this job class runs under, in ms. Set e.g.
48
+ * `static timeoutMs = 60 * 60 * 1000` on a job whose work legitimately takes
49
+ * hours so its type carries its own bound instead of relying on one global
50
+ * `backgroundJobs.jobTimeoutMs` tuned for the slowest job in the system. The
51
+ * `{timeoutMs}` enqueue option overrides it. A non-positive value disables the
52
+ * bound for this class. Left undefined, the worker-level value applies.
53
+ * @type {number | undefined}
54
+ */
55
+ static timeoutMs = undefined;
46
56
  /**
47
57
  * Stops this performance and reschedules the same logical job row. This is
48
58
  * normal control flow: it does not count as a failure or consume a retry.
@@ -75,6 +85,22 @@ export default class VelociousJob {
75
85
  }
76
86
  return merged;
77
87
  }
88
+ /**
89
+ * Folds this job class's static `timeoutMs` into the enqueue options unless the
90
+ * caller already specified one, so a job type carries its own wall-clock bound
91
+ * instead of every job sharing one worker-level value. A class that declares
92
+ * nothing leaves the option absent, and the worker falls back to its own
93
+ * default — the prior behavior.
94
+ * @param {import("./types.js").BackgroundJobOptions | undefined} options - Job options.
95
+ * @returns {import("./types.js").BackgroundJobOptions} - Options including the resolved timeout.
96
+ */
97
+ static _withTimeout(options) {
98
+ const merged = options ? { ...options } : {};
99
+ if (merged.timeoutMs === undefined && typeof this.timeoutMs === "number") {
100
+ merged.timeoutMs = this.timeoutMs;
101
+ }
102
+ return merged;
103
+ }
78
104
  /**
79
105
  * Resolves class-derived enqueue options on a hydrated job instance. Explicit
80
106
  * per-enqueue options take precedence over the instance concurrency key.
@@ -84,7 +110,7 @@ export default class VelociousJob {
84
110
  * @returns {import("./types.js").BackgroundJobOptions} - Resolved job options.
85
111
  */
86
112
  static _withJobContext({ jobArgs, jobOptions }) {
87
- const options = this._withQueue(jobOptions);
113
+ const options = this._withTimeout(this._withQueue(jobOptions));
88
114
  if (options.concurrencyKey !== undefined)
89
115
  return options;
90
116
  const jobInstance = new this();
@@ -207,4 +233,4 @@ export default class VelociousJob {
207
233
  throw new Error("perform not implemented");
208
234
  }
209
235
  }
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9wbGF0Zm9ybS1qb2IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sNkJBQTZCLE1BQU0sd0JBQXdCLENBQUE7QUFDbEUsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLDZCQUE2QixFQUM3QiwwQkFBMEIsRUFDM0IsTUFBTSxjQUFjLENBQUE7QUFFckI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFZO0lBQy9CO1FBQ0Usb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUE7SUFFdEM7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUE7SUFFeEI7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUE7SUFFL0I7Ozs7O09BS0c7SUFDSCxZQUFZLENBQUMsT0FBTztRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLFNBQVMsQ0FBQyx1RUFBdUUsQ0FBQyxDQUFBO1FBQzlGLENBQUM7UUFFRCxNQUFNLElBQUksNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQ2xCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTztRQUN2QixNQUFNLE1BQU0s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RyxLQUFLO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEJhY2tncm91bmRKb2JSZXNjaGVkdWxlU2lnbmFsIGZyb20gXCIuL3Jlc2NoZWR1bGUtc2lnbmFsLmpzXCJcbmltcG9ydCB7XG4gIGNhbmNlbFNjaGVkdWxlZEJhY2tncm91bmRKb2IsXG4gIGVucXVldWVCYWNrZ3JvdW5kSm9iLFxuICBnZXRTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iLFxuICByZXBsYWNlU2NoZWR1bGVkQmFja2dyb3VuZEpvYixcbiAgd2FrZVNjaGVkdWxlZEJhY2tncm91bmRKb2Jcbn0gZnJvbSBcIi4vcnVudGltZS5qc1wiXG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYmFja2dyb3VuZCBqb2JzLlxuICpcbiAqIGBUQXJnc2AgaXMgdGhlIHR1cGxlIG9mIGFyZ3VtZW50cyB0aGUgc3ViY2xhc3MncyBgcGVyZm9ybWAgYWNjZXB0cywgc28gYSBqb2IgdGhhdFxuICogbmVlZHMgYXJndW1lbnRzIGRlY2xhcmVzIHRoZW0gYXMgcmVxdWlyZWQgYW5kIHR5cGVkIOKAlCBmb3IgZXhhbXBsZVxuICogYGNsYXNzIFJ1bkJ1aWxkSm9iIGV4dGVuZHMgVmVsb2Npb3VzSm9iPFtzdHJpbmddPmAgd2l0aCBgYXN5bmMgcGVyZm9ybShidWlsZElkKWAuXG4gKiBUaGUgZGVmYXVsdCBlbXB0eSB0dXBsZSBrZWVwcyBhcmd1bWVudC1sZXNzIGpvYnMgKGBleHRlbmRzIFZlbG9jaW91c0pvYmAsXG4gKiBgYXN5bmMgcGVyZm9ybSgpYCkgd29ya2luZyB1bmNoYW5nZWQuXG4gKiBAdGVtcGxhdGUge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW1RBcmdzPVtdXVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNKb2Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYkNvbnRleHQgfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5fYmFja2dyb3VuZEpvYkNvbnRleHQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSBpZGVudGlmaWVycyBjaGVja2VkIG91dCB3aGlsZSB0aGlzIGpvYiBwZXJmb3Jtcy4gU2V0IGFuIGV4cGxpY2l0XG4gICAqIGxpc3QgdG8gYXZvaWQgaG9sZGluZyB1bnJlbGF0ZWQgY29uZmlndXJlZCBkYXRhYmFzZSBjb25uZWN0aW9ucywgb3IgYFtdYFxuICAgKiB3aGVuIHRoZSBqb2IgZXN0YWJsaXNoZXMgYW55IGNvbm5lY3Rpb25zIGl0IG5lZWRzIGl0c2VsZi4gTGVmdCB1bmRlZmluZWQsXG4gICAqIGpvYnMgcmV0YWluIHRoZSBleGlzdGluZyBiZWhhdmlvciBvZiBjaGVja2luZyBvdXQgZXZlcnkgYWN0aXZlIGRhdGFiYXNlLlxuICAgKiBAdHlwZSB7c3RyaW5nW10gfCB1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgZGF0YWJhc2VJZGVudGlmaWVycyA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBRdWV1ZSB0aGlzIGpvYiBjbGFzcyBydW5zIG9uLiBTdWJjbGFzc2VzIHNldCBlLmcuIGBzdGF0aWMgcXVldWUgPSBcImJ1aWxkc1wiYFxuICAgKiB0byByb3V0ZSBvbnRvIGEgcXVldWUgd2l0aCBpdHMgb3duIGNsdXN0ZXItd2lkZSBjb25jdXJyZW5jeSBjYXAgKGNvbmZpZ3VyZWRcbiAgICogdmlhIGBiYWNrZ3JvdW5kSm9icy5xdWV1ZXNgKS4gVGhlIGB7cXVldWV9YCBlbnF1ZXVlIG9wdGlvbiBvdmVycmlkZXMgaXQuXG4gICAqIExlZnQgdW5kZWZpbmVkLCBqb2JzIHJ1biBvbiB0aGUgYFwiZGVmYXVsdFwiYCBxdWV1ZS5cbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHN0YXRpYyBxdWV1ZSA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwcm9jZXNzIHRpdGxlIHNob3duIGZvciB0aGUgcnVubmVyIHdoaWxlIHRoaXMgam9iIGV4ZWN1dGVzLlxuICAgKiBWZWxvY2lvdXMgc2V0cyBgcHJvY2Vzcy50aXRsZWAgdG8gdGhpcyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBqb2Ig4oCUIHNvXG4gICAqIGBwc2AvYHRvcGAvYGh0b3BgIGlkZW50aWZ5IHdoYXQgYSBydW5uZXIgaXMgZG9pbmcg4oCUIGFuZCByZXN0b3JlcyB0aGVcbiAgICogcnVubmVyJ3MgYmFzZSB0aXRsZSB3aGVuIHRoZSBqb2IgZmluaXNoZXMuIExlZnQgdW5kZWZpbmVkLCB0aGUgcnVubmVyIGZhbGxzXG4gICAqIGJhY2sgdG8gYHZlbG9jaW91cyBqb2ItcnVubmVyOiA8Sm9iTmFtZT5gLiBTZXQgZS5nLlxuICAgKiBgc3RhdGljIHByb2Nlc3NUaXRsZSA9IFwidmVsb2Npb3VzIG1lZGlhIHRyYW5zY29kZXJcImAgdG8gZ2l2ZSBhIGpvYiBhXG4gICAqIGN1c3RvbSwgaHVtYW4tcmVhZGFibGUgdGl0bGUuXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgcHJvY2Vzc1RpdGxlID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoaXMgcGVyZm9ybWFuY2UgYW5kIHJlc2NoZWR1bGVzIHRoZSBzYW1lIGxvZ2ljYWwgam9iIHJvdy4gVGhpcyBpc1xuICAgKiBub3JtYWwgY29udHJvbCBmbG93OiBpdCBkb2VzIG5vdCBjb3VudCBhcyBhIGZhaWx1cmUgb3IgY29uc3VtZSBhIHJldHJ5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlNcyAtIE5vbi1uZWdhdGl2ZSBzYWZlLWludGVnZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcmV0dXJucyB7bmV2ZXJ9IC0gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucy5cbiAgICovXG4gIHJlc2NoZWR1bGVJbihkZWxheU1zKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihkZWxheU1zKSB8fCBkZWxheU1zIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImJhY2tncm91bmQgam9iIHJlc2NoZWR1bGUgZGVsYXlNcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIHNhZmUgaW50ZWdlclwiKVxuICAgIH1cblxuICAgIHRocm93IG5ldyBCYWNrZ3JvdW5kSm9iUmVzY2hlZHVsZVNpZ25hbChkZWxheU1zKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgam9iIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSm9iIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgam9iTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lXG4gIH1cblxuICAvKipcbiAgICogRm9sZHMgdGhpcyBqb2IgY2xhc3MncyBzdGF0aWMgYHF1ZXVlYCBpbnRvIHRoZSBlbnF1ZXVlIG9wdGlvbnMgdW5sZXNzIHRoZVxuICAgKiBjYWxsZXIgYWxyZWFkeSBzcGVjaWZpZWQgb25lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnMgfCB1bmRlZmluZWR9IG9wdGlvbnMgLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IC0gT3B0aW9ucyBpbmNsdWRpbmcgdGhlIHJlc29sdmVkIHF1ZXVlLlxuICAgKi9cbiAgc3RhdGljIF93aXRoUXVldWUob3B0aW9ucykge1xuICAgIGNvbnN0IG1lcmdlZCA9IG9wdGlvbnMgPyB7Li4ub3B0aW9uc30gOiB7fVxuXG4gICAgaWYgKG1lcmdlZC5xdWV1ZSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0aGlzLnF1ZXVlID09PSBcInN0cmluZ1wiICYmIHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgbWVyZ2VkLnF1ZXVlID0gdGhpcy5xdWV1ZVxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjbGFzcy1kZXJpdmVkIGVucXVldWUgb3B0aW9ucyBvbiBhIGh5ZHJhdGVkIGpvYiBpbnN0YW5jZS4gRXhwbGljaXRcbiAgICogcGVyLWVucXVldWUgb3B0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgaW5zdGFuY2UgY29uY3VycmVuY3kga2V5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEpvYiBjb250ZXh0LlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5qb2JBcmdzIC0gSm9iIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zIHwgdW5kZWZpbmVkfSBhcmdzLmpvYk9wdGlvbnMgLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IC0gUmVzb2x2ZWQgam9iIG9wdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgX3dpdGhKb2JDb250ZXh0KHtqb2JBcmdzLCBqb2JPcHRpb25zfSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl93aXRoUXVldWUoam9iT3B0aW9ucylcblxuICAgIGlmIChvcHRpb25zLmNvbmN1cnJlbmN5S2V5ICE9PSB1bmRlZmluZWQpIHJldHVybiBvcHRpb25zXG5cbiAgICBjb25zdCBqb2JJbnN0YW5jZSA9IG5ldyB0aGlzKClcbiAgICBqb2JJbnN0YW5jZS5fc2V0QmFja2dyb3VuZEpvYkNvbnRleHQoe1xuICAgICAgYXJnczogam9iQXJncyxcbiAgICAgIGpvYkNsYXNzOiB0aGlzLFxuICAgICAgam9iTmFtZTogdGhpcy5qb2JOYW1lKCksXG4gICAgICBvcHRpb25zXG4gICAgfSlcbiAgICBjb25zdCBjb25jdXJyZW5jeUtleSA9IGpvYkluc3RhbmNlLmNvbmN1cnJlbmN5S2V5KClcblxuICAgIGlmIChjb25jdXJyZW5jeUtleSAhPT0gdW5kZWZpbmVkKSBvcHRpb25zLmNvbmN1cnJlbmN5S2V5ID0gY29uY3VycmVuY3lLZXlcblxuICAgIHJldHVybiBvcHRpb25zXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY29tcGxldGUgY29udGV4dCBhdmFpbGFibGUgdG8gdGhpcyBoeWRyYXRlZCBqb2IgaW5zdGFuY2UuXG4gICAqIEZyYW1ld29yayBlbnF1ZXVlL3J1bm5lciBib3VuZGFyaWVzIG93biB0aGlzIG1ldGhvZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JDb250ZXh0fSBjb250ZXh0IC0gSm9iIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3NldEJhY2tncm91bmRKb2JDb250ZXh0KGNvbnRleHQpIHtcbiAgICB0aGlzLl9iYWNrZ3JvdW5kSm9iQ29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoaXMgaHlkcmF0ZWQgam9iJ3MgY29tcGxldGUgZW5xdWV1ZSBvciBydW5uZXIgY29udGV4dC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYkNvbnRleHR9IC0gSm9iIGNvbnRleHQuXG4gICAqL1xuICBiYWNrZ3JvdW5kSm9iQ29udGV4dCgpIHtcbiAgICBpZiAoIXRoaXMuX2JhY2tncm91bmRKb2JDb250ZXh0KSB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYiBjb250ZXh0IGlzIG5vdCBoeWRyYXRlZFwiKVxuXG4gICAgcmV0dXJuIHRoaXMuX2JhY2tncm91bmRKb2JDb250ZXh0XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdG8gZGVyaXZlIGEgZHVyYWJsZSBjb25jdXJyZW5jeSBrZXkgZnJvbSBgYmFja2dyb3VuZEpvYkNvbnRleHQoKWAuXG4gICAqIFBhaXIgdGhlIGRlcml2ZWQga2V5IHdpdGggYG1heENvbmN1cnJlbmN5YCBpbiBlbnF1ZXVlIG9wdGlvbnMuIEFuIGV4cGxpY2l0XG4gICAqIHBlci1lbnF1ZXVlIGBjb25jdXJyZW5jeUtleWAgdGFrZXMgcHJlY2VkZW5jZSBhbmQgc2tpcHMgdGhpcyBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gRGVyaXZlZCBjb25jdXJyZW5jeSBrZXksIG9yIHVuZGVmaW5lZCBmb3Igbm9uZS5cbiAgICovXG4gIGNvbmN1cnJlbmN5S2V5KCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBlcmZvcm0gbGF0ZXIuXG4gICAqIEBwYXJhbSB7Li4uUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MgLSBKb2IgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBKb2IgaWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcGVyZm9ybUxhdGVyKC4uLmFyZ3MpIHtcbiAgICBjb25zdCB7am9iQXJncywgam9iT3B0aW9uc30gPSB0aGlzLl9zcGxpdEFyZ3NBbmRPcHRpb25zKGFyZ3MpXG4gICAgcmV0dXJuIGF3YWl0IGVucXVldWVCYWNrZ3JvdW5kSm9iKHtKb2JDbGFzczogdGhpcywgam9iQXJncywgam9iT3B0aW9uc30pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwZXJmb3JtIGxhdGVyIHdpdGggb3B0aW9ucy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gW2FyZ3Mub3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBKb2IgaWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcGVyZm9ybUxhdGVyV2l0aE9wdGlvbnMoe2FyZ3MsIG9wdGlvbnN9KSB7XG4gICAgcmV0dXJuIGF3YWl0IGVucXVldWVCYWNrZ3JvdW5kSm9iKHtKb2JDbGFzczogdGhpcywgam9iQXJnczogYXJncywgam9iT3B0aW9uczogb3B0aW9uc30pXG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSByZXBsYWNlcyB0aGlzIGpvYiBjbGFzcydzIHF1ZXVlZCBvd25lciBmb3IgYSBzdGFibGUgc2NoZWR1bGUga2V5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNjaGVkdWxlS2V5IC0gU3RhYmxlIGxvZ2ljYWwgc2NoZWR1bGUga2V5LlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gW2FyZ3Mub3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUmVwbGFjZW1lbnRSZXN1bHQ+fSAtIFJlcGxhY2VtZW50IHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZXBsYWNlU2NoZWR1bGVkKHtzY2hlZHVsZUtleSwgYXJncywgb3B0aW9uc30pIHtcbiAgICByZXR1cm4gYXdhaXQgcmVwbGFjZVNjaGVkdWxlZEJhY2tncm91bmRKb2Ioe0pvYkNsYXNzOiB0aGlzLCBzY2hlZHVsZUtleSwgam9iQXJnczogYXJncywgam9iT3B0aW9uczogb3B0aW9uc30pXG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBvciBkZXRhY2hlcyB0aGUgY3VycmVudCBvd25lciBvZiBhIHN0YWJsZSBzY2hlZHVsZSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iQ2FuY2VsbGF0aW9uUmVzdWx0Pn0gLSBDYW5jZWxsYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNhbmNlbFNjaGVkdWxlZChzY2hlZHVsZUtleSkge1xuICAgIHJldHVybiBhd2FpdCBjYW5jZWxTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iKHNjaGVkdWxlS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGN1cnJlbnQgb3duZXJzaGlwIGFuZCBvcHRpb25hbCB0ZXJtaW5hbCBoaXN0b3J5IGZvciBhIHN0YWJsZSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHt7aW5jbHVkZUxhdGVzdFRlcm1pbmFsPzogYm9vbGVhbn19IFtvcHRpb25zXSAtIExvb2t1cCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JTY2hlZHVsZWRMb29rdXBSZXN1bHQ+fSAtIE5vcm1hbGl6ZWQgc3RhYmxlIHNjaGVkdWxlIGpvYnMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0U2NoZWR1bGVkSm9iKHNjaGVkdWxlS2V5LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0U2NoZWR1bGVkQmFja2dyb3VuZEpvYihzY2hlZHVsZUtleSwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBlZGl0ZXMgYSBmdXR1cmUgcXVldWVkIG93bmVyIHdpdGhvdXQgY3JlYXRpbmcgYW5vdGhlciBqb2IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iV2FrZVJlc3VsdD59IC0gV2FrZSByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgd2FrZVNjaGVkdWxlZChzY2hlZHVsZUtleSkge1xuICAgIHJldHVybiBhd2FpdCB3YWtlU2NoZWR1bGVkQmFja2dyb3VuZEpvYihzY2hlZHVsZUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNwbGl0IGFyZ3MgYW5kIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEByZXR1cm5zIHt7am9iQXJnczogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBqb2JPcHRpb25zOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfX0gLSBTcGxpdCBhcmdzIGFuZCBvcHRpb25zLlxuICAgKi9cbiAgc3RhdGljIF9zcGxpdEFyZ3NBbmRPcHRpb25zKGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7am9iQXJnczogW10sIGpvYk9wdGlvbnM6IHt9fVxuICAgIH1cblxuICAgIGNvbnN0IGxhc3RBcmcgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV1cbiAgICBjb25zdCBpc09wdGlvbnNBcmcgPSBsYXN0QXJnICYmIHR5cGVvZiBsYXN0QXJnID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGxhc3RBcmcpICYmIFwiam9iT3B0aW9uc1wiIGluIGxhc3RBcmdcblxuICAgIGlmIChpc09wdGlvbnNBcmcpIHtcbiAgICAgIGNvbnN0IHtqb2JPcHRpb25zfSA9IC8qKiBAdHlwZSB7e2pvYk9wdGlvbnM6IGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9fSAqLyAobGFzdEFyZylcbiAgICAgIHJldHVybiB7am9iQXJnczogYXJncy5zbGljZSgwLCAtMSksIGpvYk9wdGlvbnM6IGpvYk9wdGlvbnMgfHwge319XG4gICAgfVxuXG4gICAgcmV0dXJuIHtqb2JBcmdzOiBhcmdzLCBqb2JPcHRpb25zOiB7fX1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzc2VzLlxuICAgKiBAcGFyYW0ge1RBcmdzfSBfYXJncyAtIEpvYiBhcmdzICh0aGUgdHVwbGUgdGhpcyBqb2IgY2xhc3Mgd2FzIHBhcmFtZXRlcml6ZWQgd2l0aCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBwZXJmb3JtKC4uLl9hcmdzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwicGVyZm9ybSBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxufVxuIl19
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9wbGF0Zm9ybS1qb2IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sNkJBQTZCLE1BQU0sd0JBQXdCLENBQUE7QUFDbEUsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLDZCQUE2QixFQUM3QiwwQkFBMEIsRUFDM0IsTUFBTSxjQUFjLENBQUE7QUFFckI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFZO0lBQy9CO1FBQ0Usb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUE7SUFFdEM7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUE7SUFFeEI7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUE7SUFFL0I7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtJQUU1Qjs7Ozs7T0FLRztJQUNILFlBQVksQ0FBQyxPQUFPO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksU0FBUyxDQUFDLHVFQUF1RSxDQUFDLENBQUE7UUFDOUYsQ0FBQztRQUVELE1BQU0sSUFBSSw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUE7SUFDbEIsQ0FBQztJQUVEOzs7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LEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksWUFBWSxJQUFJLE9BQU8sQ0FBQTtRQUVqSCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sRUFBQyxVQUFVLEVBQUMsR0FBRyxzRUFBc0UsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3JHLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxJQUFJLEVBQUUsRUFBQyxDQUFBO1FBQ25FLENBQUM7UUFFRCxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSztRQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUE7SUFDNUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCYWNrZ3JvdW5kSm9iUmVzY2hlZHVsZVNpZ25hbCBmcm9tIFwiLi9yZXNjaGVkdWxlLXNpZ25hbC5qc1wiXG5pbXBvcnQge1xuICBjYW5jZWxTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iLFxuICBlbnF1ZXVlQmFja2dyb3VuZEpvYixcbiAgZ2V0U2NoZWR1bGVkQmFja2dyb3VuZEpvYixcbiAgcmVwbGFjZVNjaGVkdWxlZEJhY2tncm91bmRKb2IsXG4gIHdha2VTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iXG59IGZyb20gXCIuL3J1bnRpbWUuanNcIlxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGJhY2tncm91bmQgam9icy5cbiAqXG4gKiBgVEFyZ3NgIGlzIHRoZSB0dXBsZSBvZiBhcmd1bWVudHMgdGhlIHN1YmNsYXNzJ3MgYHBlcmZvcm1gIGFjY2VwdHMsIHNvIGEgam9iIHRoYXRcbiAqIG5lZWRzIGFyZ3VtZW50cyBkZWNsYXJlcyB0aGVtIGFzIHJlcXVpcmVkIGFuZCB0eXBlZCDigJQgZm9yIGV4YW1wbGVcbiAqIGBjbGFzcyBSdW5CdWlsZEpvYiBleHRlbmRzIFZlbG9jaW91c0pvYjxbc3RyaW5nXT5gIHdpdGggYGFzeW5jIHBlcmZvcm0oYnVpbGRJZClgLlxuICogVGhlIGRlZmF1bHQgZW1wdHkgdHVwbGUga2VlcHMgYXJndW1lbnQtbGVzcyBqb2JzIChgZXh0ZW5kcyBWZWxvY2lvdXNKb2JgLFxuICogYGFzeW5jIHBlcmZvcm0oKWApIHdvcmtpbmcgdW5jaGFuZ2VkLlxuICogQHRlbXBsYXRlIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFtUQXJncz1bXV1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSm9iIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JDb250ZXh0IHwgdW5kZWZpbmVkfSAqL1xuICAgIHRoaXMuX2JhY2tncm91bmRKb2JDb250ZXh0ID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogRGF0YWJhc2UgaWRlbnRpZmllcnMgY2hlY2tlZCBvdXQgd2hpbGUgdGhpcyBqb2IgcGVyZm9ybXMuIFNldCBhbiBleHBsaWNpdFxuICAgKiBsaXN0IHRvIGF2b2lkIGhvbGRpbmcgdW5yZWxhdGVkIGNvbmZpZ3VyZWQgZGF0YWJhc2UgY29ubmVjdGlvbnMsIG9yIGBbXWBcbiAgICogd2hlbiB0aGUgam9iIGVzdGFibGlzaGVzIGFueSBjb25uZWN0aW9ucyBpdCBuZWVkcyBpdHNlbGYuIExlZnQgdW5kZWZpbmVkLFxuICAgKiBqb2JzIHJldGFpbiB0aGUgZXhpc3RpbmcgYmVoYXZpb3Igb2YgY2hlY2tpbmcgb3V0IGV2ZXJ5IGFjdGl2ZSBkYXRhYmFzZS5cbiAgICogQHR5cGUge3N0cmluZ1tdIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgc3RhdGljIGRhdGFiYXNlSWRlbnRpZmllcnMgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogUXVldWUgdGhpcyBqb2IgY2xhc3MgcnVucyBvbi4gU3ViY2xhc3NlcyBzZXQgZS5nLiBgc3RhdGljIHF1ZXVlID0gXCJidWlsZHNcImBcbiAgICogdG8gcm91dGUgb250byBhIHF1ZXVlIHdpdGggaXRzIG93biBjbHVzdGVyLXdpZGUgY29uY3VycmVuY3kgY2FwIChjb25maWd1cmVkXG4gICAqIHZpYSBgYmFja2dyb3VuZEpvYnMucXVldWVzYCkuIFRoZSBge3F1ZXVlfWAgZW5xdWV1ZSBvcHRpb24gb3ZlcnJpZGVzIGl0LlxuICAgKiBMZWZ0IHVuZGVmaW5lZCwgam9icyBydW4gb24gdGhlIGBcImRlZmF1bHRcImAgcXVldWUuXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgcXVldWUgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogT3B0aW9uYWwgcHJvY2VzcyB0aXRsZSBzaG93biBmb3IgdGhlIHJ1bm5lciB3aGlsZSB0aGlzIGpvYiBleGVjdXRlcy5cbiAgICogVmVsb2Npb3VzIHNldHMgYHByb2Nlc3MudGl0bGVgIHRvIHRoaXMgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgam9iIOKAlCBzb1xuICAgKiBgcHNgL2B0b3BgL2BodG9wYCBpZGVudGlmeSB3aGF0IGEgcnVubmVyIGlzIGRvaW5nIOKAlCBhbmQgcmVzdG9yZXMgdGhlXG4gICAqIHJ1bm5lcidzIGJhc2UgdGl0bGUgd2hlbiB0aGUgam9iIGZpbmlzaGVzLiBMZWZ0IHVuZGVmaW5lZCwgdGhlIHJ1bm5lciBmYWxsc1xuICAgKiBiYWNrIHRvIGB2ZWxvY2lvdXMgam9iLXJ1bm5lcjogPEpvYk5hbWU+YC4gU2V0IGUuZy5cbiAgICogYHN0YXRpYyBwcm9jZXNzVGl0bGUgPSBcInZlbG9jaW91cyBtZWRpYSB0cmFuc2NvZGVyXCJgIHRvIGdpdmUgYSBqb2IgYVxuICAgKiBjdXN0b20sIGh1bWFuLXJlYWRhYmxlIHRpdGxlLlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgc3RhdGljIHByb2Nlc3NUaXRsZSA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIGJvdW5kIHRoaXMgam9iIGNsYXNzIHJ1bnMgdW5kZXIsIGluIG1zLiBTZXQgZS5nLlxuICAgKiBgc3RhdGljIHRpbWVvdXRNcyA9IDYwICogNjAgKiAxMDAwYCBvbiBhIGpvYiB3aG9zZSB3b3JrIGxlZ2l0aW1hdGVseSB0YWtlc1xuICAgKiBob3VycyBzbyBpdHMgdHlwZSBjYXJyaWVzIGl0cyBvd24gYm91bmQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIG9uZSBnbG9iYWxcbiAgICogYGJhY2tncm91bmRKb2JzLmpvYlRpbWVvdXRNc2AgdHVuZWQgZm9yIHRoZSBzbG93ZXN0IGpvYiBpbiB0aGUgc3lzdGVtLiBUaGVcbiAgICogYHt0aW1lb3V0TXN9YCBlbnF1ZXVlIG9wdGlvbiBvdmVycmlkZXMgaXQuIEEgbm9uLXBvc2l0aXZlIHZhbHVlIGRpc2FibGVzIHRoZVxuICAgKiBib3VuZCBmb3IgdGhpcyBjbGFzcy4gTGVmdCB1bmRlZmluZWQsIHRoZSB3b3JrZXItbGV2ZWwgdmFsdWUgYXBwbGllcy5cbiAgICogQHR5cGUge251bWJlciB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHN0YXRpYyB0aW1lb3V0TXMgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogU3RvcHMgdGhpcyBwZXJmb3JtYW5jZSBhbmQgcmVzY2hlZHVsZXMgdGhlIHNhbWUgbG9naWNhbCBqb2Igcm93LiBUaGlzIGlzXG4gICAqIG5vcm1hbCBjb250cm9sIGZsb3c6IGl0IGRvZXMgbm90IGNvdW50IGFzIGEgZmFpbHVyZSBvciBjb25zdW1lIGEgcmV0cnkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheU1zIC0gTm9uLW5lZ2F0aXZlIHNhZmUtaW50ZWdlciBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gICAqIEByZXR1cm5zIHtuZXZlcn0gLSBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zLlxuICAgKi9cbiAgcmVzY2hlZHVsZUluKGRlbGF5TXMpIHtcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGRlbGF5TXMpIHx8IGRlbGF5TXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFja2dyb3VuZCBqb2IgcmVzY2hlZHVsZSBkZWxheU1zIG11c3QgYmUgYSBub24tbmVnYXRpdmUgc2FmZSBpbnRlZ2VyXCIpXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEJhY2tncm91bmRKb2JSZXNjaGVkdWxlU2lnbmFsKGRlbGF5TXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqb2IgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBKb2IgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBqb2JOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2xkcyB0aGlzIGpvYiBjbGFzcydzIHN0YXRpYyBgcXVldWVgIGludG8gdGhlIGVucXVldWUgb3B0aW9ucyB1bmxlc3MgdGhlXG4gICAqIGNhbGxlciBhbHJlYWR5IHNwZWNpZmllZCBvbmUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9ucyB8IHVuZGVmaW5lZH0gb3B0aW9ucyAtIEpvYiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gLSBPcHRpb25zIGluY2x1ZGluZyB0aGUgcmVzb2x2ZWQgcXVldWUuXG4gICAqL1xuICBzdGF0aWMgX3dpdGhRdWV1ZShvcHRpb25zKSB7XG4gICAgY29uc3QgbWVyZ2VkID0gb3B0aW9ucyA/IHsuLi5vcHRpb25zfSA6IHt9XG5cbiAgICBpZiAobWVyZ2VkLnF1ZXVlID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHRoaXMucXVldWUgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBtZXJnZWQucXVldWUgPSB0aGlzLnF1ZXVlXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZFxuICB9XG5cbiAgLyoqXG4gICAqIEZvbGRzIHRoaXMgam9iIGNsYXNzJ3Mgc3RhdGljIGB0aW1lb3V0TXNgIGludG8gdGhlIGVucXVldWUgb3B0aW9ucyB1bmxlc3MgdGhlXG4gICAqIGNhbGxlciBhbHJlYWR5IHNwZWNpZmllZCBvbmUsIHNvIGEgam9iIHR5cGUgY2FycmllcyBpdHMgb3duIHdhbGwtY2xvY2sgYm91bmRcbiAgICogaW5zdGVhZCBvZiBldmVyeSBqb2Igc2hhcmluZyBvbmUgd29ya2VyLWxldmVsIHZhbHVlLiBBIGNsYXNzIHRoYXQgZGVjbGFyZXNcbiAgICogbm90aGluZyBsZWF2ZXMgdGhlIG9wdGlvbiBhYnNlbnQsIGFuZCB0aGUgd29ya2VyIGZhbGxzIGJhY2sgdG8gaXRzIG93blxuICAgKiBkZWZhdWx0IOKAlCB0aGUgcHJpb3IgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9ucyB8IHVuZGVmaW5lZH0gb3B0aW9ucyAtIEpvYiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gLSBPcHRpb25zIGluY2x1ZGluZyB0aGUgcmVzb2x2ZWQgdGltZW91dC5cbiAgICovXG4gIHN0YXRpYyBfd2l0aFRpbWVvdXQob3B0aW9ucykge1xuICAgIGNvbnN0IG1lcmdlZCA9IG9wdGlvbnMgPyB7Li4ub3B0aW9uc30gOiB7fVxuXG4gICAgaWYgKG1lcmdlZC50aW1lb3V0TXMgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdGhpcy50aW1lb3V0TXMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1lcmdlZC50aW1lb3V0TXMgPSB0aGlzLnRpbWVvdXRNc1xuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjbGFzcy1kZXJpdmVkIGVucXVldWUgb3B0aW9ucyBvbiBhIGh5ZHJhdGVkIGpvYiBpbnN0YW5jZS4gRXhwbGljaXRcbiAgICogcGVyLWVucXVldWUgb3B0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgaW5zdGFuY2UgY29uY3VycmVuY3kga2V5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEpvYiBjb250ZXh0LlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5qb2JBcmdzIC0gSm9iIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zIHwgdW5kZWZpbmVkfSBhcmdzLmpvYk9wdGlvbnMgLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IC0gUmVzb2x2ZWQgam9iIG9wdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgX3dpdGhKb2JDb250ZXh0KHtqb2JBcmdzLCBqb2JPcHRpb25zfSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl93aXRoVGltZW91dCh0aGlzLl93aXRoUXVldWUoam9iT3B0aW9ucykpXG5cbiAgICBpZiAob3B0aW9ucy5jb25jdXJyZW5jeUtleSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gb3B0aW9uc1xuXG4gICAgY29uc3Qgam9iSW5zdGFuY2UgPSBuZXcgdGhpcygpXG4gICAgam9iSW5zdGFuY2UuX3NldEJhY2tncm91bmRKb2JDb250ZXh0KHtcbiAgICAgIGFyZ3M6IGpvYkFyZ3MsXG4gICAgICBqb2JDbGFzczogdGhpcyxcbiAgICAgIGpvYk5hbWU6IHRoaXMuam9iTmFtZSgpLFxuICAgICAgb3B0aW9uc1xuICAgIH0pXG4gICAgY29uc3QgY29uY3VycmVuY3lLZXkgPSBqb2JJbnN0YW5jZS5jb25jdXJyZW5jeUtleSgpXG5cbiAgICBpZiAoY29uY3VycmVuY3lLZXkgIT09IHVuZGVmaW5lZCkgb3B0aW9ucy5jb25jdXJyZW5jeUtleSA9IGNvbmN1cnJlbmN5S2V5XG5cbiAgICByZXR1cm4gb3B0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbXBsZXRlIGNvbnRleHQgYXZhaWxhYmxlIHRvIHRoaXMgaHlkcmF0ZWQgam9iIGluc3RhbmNlLlxuICAgKiBGcmFtZXdvcmsgZW5xdWV1ZS9ydW5uZXIgYm91bmRhcmllcyBvd24gdGhpcyBtZXRob2QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iQ29udGV4dH0gY29udGV4dCAtIEpvYiBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zZXRCYWNrZ3JvdW5kSm9iQ29udGV4dChjb250ZXh0KSB7XG4gICAgdGhpcy5fYmFja2dyb3VuZEpvYkNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGlzIGh5ZHJhdGVkIGpvYidzIGNvbXBsZXRlIGVucXVldWUgb3IgcnVubmVyIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JDb250ZXh0fSAtIEpvYiBjb250ZXh0LlxuICAgKi9cbiAgYmFja2dyb3VuZEpvYkNvbnRleHQoKSB7XG4gICAgaWYgKCF0aGlzLl9iYWNrZ3JvdW5kSm9iQ29udGV4dCkgdGhyb3cgbmV3IEVycm9yKFwiQmFja2dyb3VuZCBqb2IgY29udGV4dCBpcyBub3QgaHlkcmF0ZWRcIilcblxuICAgIHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kSm9iQ29udGV4dFxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRvIGRlcml2ZSBhIGR1cmFibGUgY29uY3VycmVuY3kga2V5IGZyb20gYGJhY2tncm91bmRKb2JDb250ZXh0KClgLlxuICAgKiBQYWlyIHRoZSBkZXJpdmVkIGtleSB3aXRoIGBtYXhDb25jdXJyZW5jeWAgaW4gZW5xdWV1ZSBvcHRpb25zLiBBbiBleHBsaWNpdFxuICAgKiBwZXItZW5xdWV1ZSBgY29uY3VycmVuY3lLZXlgIHRha2VzIHByZWNlZGVuY2UgYW5kIHNraXBzIHRoaXMgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIERlcml2ZWQgY29uY3VycmVuY3kga2V5LCBvciB1bmRlZmluZWQgZm9yIG5vbmUuXG4gICAqL1xuICBjb25jdXJyZW5jeUtleSgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwZXJmb3JtIGxhdGVyLlxuICAgKiBAcGFyYW0gey4uLlJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSm9iIGlkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHBlcmZvcm1MYXRlciguLi5hcmdzKSB7XG4gICAgY29uc3Qge2pvYkFyZ3MsIGpvYk9wdGlvbnN9ID0gdGhpcy5fc3BsaXRBcmdzQW5kT3B0aW9ucyhhcmdzKVxuICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlQmFja2dyb3VuZEpvYih7Sm9iQ2xhc3M6IHRoaXMsIGpvYkFyZ3MsIGpvYk9wdGlvbnN9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGVyZm9ybSBsYXRlciB3aXRoIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuYXJncyAtIEpvYiBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IFthcmdzLm9wdGlvbnNdIC0gSm9iIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSm9iIGlkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHBlcmZvcm1MYXRlcldpdGhPcHRpb25zKHthcmdzLCBvcHRpb25zfSkge1xuICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlQmFja2dyb3VuZEpvYih7Sm9iQ2xhc3M6IHRoaXMsIGpvYkFyZ3M6IGFyZ3MsIGpvYk9wdGlvbnM6IG9wdGlvbnN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgcmVwbGFjZXMgdGhpcyBqb2IgY2xhc3MncyBxdWV1ZWQgb3duZXIgZm9yIGEgc3RhYmxlIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuYXJncyAtIEpvYiBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IFthcmdzLm9wdGlvbnNdIC0gSm9iIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UmVzdWx0Pn0gLSBSZXBsYWNlbWVudCByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVwbGFjZVNjaGVkdWxlZCh7c2NoZWR1bGVLZXksIGFyZ3MsIG9wdGlvbnN9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlcGxhY2VTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iKHtKb2JDbGFzczogdGhpcywgc2NoZWR1bGVLZXksIGpvYkFyZ3M6IGFyZ3MsIGpvYk9wdGlvbnM6IG9wdGlvbnN9KVxuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgb3IgZGV0YWNoZXMgdGhlIGN1cnJlbnQgb3duZXIgb2YgYSBzdGFibGUgc2NoZWR1bGUga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYkNhbmNlbGxhdGlvblJlc3VsdD59IC0gQ2FuY2VsbGF0aW9uIHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjYW5jZWxTY2hlZHVsZWQoc2NoZWR1bGVLZXkpIHtcbiAgICByZXR1cm4gYXdhaXQgY2FuY2VsU2NoZWR1bGVkQmFja2dyb3VuZEpvYihzY2hlZHVsZUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBjdXJyZW50IG93bmVyc2hpcCBhbmQgb3B0aW9uYWwgdGVybWluYWwgaGlzdG9yeSBmb3IgYSBzdGFibGUga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkuXG4gICAqIEBwYXJhbSB7e2luY2x1ZGVMYXRlc3RUZXJtaW5hbD86IGJvb2xlYW59fSBbb3B0aW9uc10gLSBMb29rdXAgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iU2NoZWR1bGVkTG9va3VwUmVzdWx0Pn0gLSBOb3JtYWxpemVkIHN0YWJsZSBzY2hlZHVsZSBqb2JzLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldFNjaGVkdWxlZEpvYihzY2hlZHVsZUtleSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IGdldFNjaGVkdWxlZEJhY2tncm91bmRKb2Ioc2NoZWR1bGVLZXksIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogRXhwZWRpdGVzIGEgZnV0dXJlIHF1ZXVlZCBvd25lciB3aXRob3V0IGNyZWF0aW5nIGFub3RoZXIgam9iLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYldha2VSZXN1bHQ+fSAtIFdha2UgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHdha2VTY2hlZHVsZWQoc2NoZWR1bGVLZXkpIHtcbiAgICByZXR1cm4gYXdhaXQgd2FrZVNjaGVkdWxlZEJhY2tncm91bmRKb2Ioc2NoZWR1bGVLZXkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzcGxpdCBhcmdzIGFuZCBvcHRpb25zLlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncyAtIEpvYiBhcmdzLlxuICAgKiBAcmV0dXJucyB7e2pvYkFyZ3M6IEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgam9iT3B0aW9uczogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc319IC0gU3BsaXQgYXJncyBhbmQgb3B0aW9ucy5cbiAgICovXG4gIHN0YXRpYyBfc3BsaXRBcmdzQW5kT3B0aW9ucyhhcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge2pvYkFyZ3M6IFtdLCBqb2JPcHRpb25zOiB7fX1cbiAgICB9XG5cbiAgICBjb25zdCBsYXN0QXJnID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgaXNPcHRpb25zQXJnID0gbGFzdEFyZyAmJiB0eXBlb2YgbGFzdEFyZyA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShsYXN0QXJnKSAmJiBcImpvYk9wdGlvbnNcIiBpbiBsYXN0QXJnXG5cbiAgICBpZiAoaXNPcHRpb25zQXJnKSB7XG4gICAgICBjb25zdCB7am9iT3B0aW9uc30gPSAvKiogQHR5cGUge3tqb2JPcHRpb25zOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfX0gKi8gKGxhc3RBcmcpXG4gICAgICByZXR1cm4ge2pvYkFyZ3M6IGFyZ3Muc2xpY2UoMCwgLTEpLCBqb2JPcHRpb25zOiBqb2JPcHRpb25zIHx8IHt9fVxuICAgIH1cblxuICAgIHJldHVybiB7am9iQXJnczogYXJncywgam9iT3B0aW9uczoge319XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3Nlcy5cbiAgICogQHBhcmFtIHtUQXJnc30gX2FyZ3MgLSBKb2IgYXJncyAodGhlIHR1cGxlIHRoaXMgam9iIGNsYXNzIHdhcyBwYXJhbWV0ZXJpemVkIHdpdGgpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcGVyZm9ybSguLi5fYXJncykge1xuICAgIHRocm93IG5ldyBFcnJvcihcInBlcmZvcm0gbm90IGltcGxlbWVudGVkXCIpXG4gIH1cbn1cbiJdfQ==
@@ -464,7 +464,7 @@ export type BackgroundJobOptions = {
464
464
  */
465
465
  scheduledAtMs?: number;
466
466
  /**
467
- * - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
467
+ * - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides a job class's `static timeoutMs` and the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
468
468
  */
469
469
  timeoutMs?: number;
470
470
  };
@@ -1047,7 +1047,7 @@ export type BackgroundJobSocketMessage = BackgroundJobHelloMessage | BackgroundJ
1047
1047
  * @property {boolean} [deduplicateWhileQueued] - When true, skip the enqueue if an identical still-queued job (same job name, args and queue) is scheduled no later than this enqueue, returning the earliest matching job's id. A future retry does not suppress earlier work. Deduplication is independent of `concurrencyKey`, so the job keeps its normal (e.g. queue-derived) concurrency cap. Keeps an interval-scheduled recurring job (e.g. retention pruning) from piling up redundant queued rows when it runs slower than its interval or no worker is free.
1048
1048
  * @property {string} [idempotencyKey] - Durable enqueue identity scoped to the resolved job class name and queue. Exact replay returns the original job id across every state and after job pruning; reuse with different canonical arguments or behavior-affecting options fails. Ownership is independent of `deduplicateWhileQueued` and is retained until an explicit future retention policy removes it.
1049
1049
  * @property {number} [scheduledAtMs] - Epoch timestamp in milliseconds when the job becomes eligible for dispatch. Defaults to enqueue time.
1050
- * @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
1050
+ * @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides a job class's `static timeoutMs` and the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
1051
1051
  */
1052
1052
  /**
1053
1053
  * @typedef {object} BackgroundJobPayload
@@ -174,7 +174,7 @@
174
174
  * @property {boolean} [deduplicateWhileQueued] - When true, skip the enqueue if an identical still-queued job (same job name, args and queue) is scheduled no later than this enqueue, returning the earliest matching job's id. A future retry does not suppress earlier work. Deduplication is independent of `concurrencyKey`, so the job keeps its normal (e.g. queue-derived) concurrency cap. Keeps an interval-scheduled recurring job (e.g. retention pruning) from piling up redundant queued rows when it runs slower than its interval or no worker is free.
175
175
  * @property {string} [idempotencyKey] - Durable enqueue identity scoped to the resolved job class name and queue. Exact replay returns the original job id across every state and after job pruning; reuse with different canonical arguments or behavior-affecting options fails. Ownership is independent of `deduplicateWhileQueued` and is retained until an explicit future retention policy removes it.
176
176
  * @property {number} [scheduledAtMs] - Epoch timestamp in milliseconds when the job becomes eligible for dispatch. Defaults to enqueue time.
177
- * @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
177
+ * @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides a job class's `static timeoutMs` and the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
178
178
  */
179
179
  /**
180
180
  * @typedef {object} BackgroundJobPayload
@@ -303,4 +303,4 @@
303
303
  * @typedef {BackgroundJobHelloMessage | BackgroundJobGenerationAcceptedMessage | BackgroundJobGenerationRejectedMessage | BackgroundJobReadyMessage | BackgroundJobDrainingMessage | BackgroundJobHeartbeatMessage | BackgroundJobEnqueueMessage | BackgroundJobEnqueuedMessage | BackgroundJobEnqueueErrorMessage | BackgroundJobReplaceScheduledMessage | BackgroundJobScheduleReplacedMessage | BackgroundJobReplaceScheduledErrorMessage | BackgroundJobCancelScheduledMessage | BackgroundJobScheduleCancelledMessage | BackgroundJobCancelScheduledErrorMessage | BackgroundJobGetScheduledMessage | BackgroundJobScheduledMessage | BackgroundJobGetScheduledErrorMessage | BackgroundJobWakeScheduledMessage | BackgroundJobScheduleWokenMessage | BackgroundJobWakeScheduledErrorMessage | BackgroundJobJobMessage | BackgroundJobAcceptedMessage | BackgroundJobCompleteMessage | BackgroundJobFailedMessage | BackgroundJobRescheduleMessage | BackgroundJobUpdatedMessage | BackgroundJobUpdateErrorMessage} BackgroundJobSocketMessage
304
304
  */
305
305
  export const nothing = {};
306
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2dyb3VuZC1qb2JzL3R5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUNILHlGQUF5RjtBQUN6RixpSUFBaUk7QUFDakksNk5BQTZOO0FBQzdOLG1FQUFtRTtBQUNuRSwrRkFBK0Y7QUFDL0YsNkZBQTZGO0FBQzdGLG1HQUFtRztBQUNuRyxnRkFBZ0Y7QUFDaEYsdVBBQXVQO0FBQ3ZQOzs7R0FHRztBQUNILHdGQUF3RjtBQUN4Rjs7Ozs7Ozs7R0FRRztBQUNIOzs7Ozs7O0dBT0c7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0g7Ozs7Ozs7Ozs7R0FVRztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSDs7Ozs7R0FLRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7Ozs7OztHQU9HO0FBQ0g7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0g7OztHQUdHO0FBQ0g7Ozs7Ozs7R0FPRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7OztHQU1HO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7Ozs7Ozs7R0FTRztBQUNIOzs7Ozs7O0dBT0c7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSDs7R0FFRztBQUNIOzs7OztHQUtHO0FBQ0g7O0dBRUc7QUFDSDs7OztHQUlHO0FBQ0g7Ozs7R0FJRztBQUNIOztHQUVHO0FBQ0g7Ozs7R0FJRztBQUNIOzs7Ozs7Ozs7OztHQVdHO0FBQ0g7O0dBRUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSDs7R0FFRztBQUVILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAdHlwZWRlZiB7XCJpbmxpbmVcIiB8IFwiZm9ya2VkXCIgfCBcInBvb2xlZFwiIHwgXCJzcGF3bmVkXCJ9IEJhY2tncm91bmRKb2JFeGVjdXRpb25Nb2RlXG4gKi9cbi8qKiBAdHlwZWRlZiB7XCJjYW5kaWRhdGVcIiB8IFwiYWN0aXZlXCIgfCBcInJldGlyZWRcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uSW5pdGlhbFN0YXRlICovXG4vKiogQHR5cGVkZWYge1wic3RhcnRpbmdcIiB8IFwiY2FuZGlkYXRlXCIgfCBcImFjdGl2ZVwiIHwgXCJyZXRpcmluZ1wiIHwgXCJyZXRpcmVkXCIgfCBcInN0b3BwZWRcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uTGlmZWN5Y2xlU3RhdGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJtaXNzaW5nLWdlbmVyYXRpb25cIiB8IFwidW5leHBlY3RlZC1nZW5lcmF0aW9uXCIgfCBcIm1hbGZvcm1lZC1nZW5lcmF0aW9uXCIgfCBcImdlbmVyYXRpb24tbWlzbWF0Y2hcIiB8IFwid29ya2VyLWFkbWlzc2lvbi1yZXRpcmVkXCIgfCBcIndvcmtlci1oYXMtbm8tcmVjb3ZlcmFibGUtaGFuZG9mZnNcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uUmVqZWN0aW9uUmVhc29uICovXG4vKiogQHR5cGVkZWYge1wicXVldWVkXCIgfCBcImhhbmRlZF9vZmZcIn0gQmFja2dyb3VuZEpvYkFjdGl2ZVN0YXR1cyAqL1xuLyoqIEB0eXBlZGVmIHtcImNhbmNlbGxlZFwiIHwgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCIgfCBcIm9ycGhhbmVkXCJ9IEJhY2tncm91bmRKb2JUZXJtaW5hbFN0YXR1cyAqL1xuLyoqIEB0eXBlZGVmIHtCYWNrZ3JvdW5kSm9iQWN0aXZlU3RhdHVzIHwgQmFja2dyb3VuZEpvYlRlcm1pbmFsU3RhdHVzfSBCYWNrZ3JvdW5kSm9iU3RhdHVzICovXG4vKiogQHR5cGVkZWYge1wiZXhpdFwiIHwgXCJwcm9jZXNzLWVycm9yXCIgfCBcImlwYy1zZW5kXCIgfCBcImNoaWxkLXNpbGVuY2VcIn0gUG9vbGVkUnVubmVyRmFpbHVyZU9yaWdpbiAqL1xuLyoqIEB0eXBlZGVmIHtcInN0YXJ0aW5nXCIgfCBcInJ1bm5pbmdcIiB8IFwicmV0aXJpbmdcIn0gUG9vbGVkUnVubmVyTGlmZWN5Y2xlU3RhdGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJwYXJlbnRfcmV0aXJlX2RyYWluZWRcIiB8IFwiam9iX3RpbWVvdXRcIiB8IFwid29ya2VyX3N0b3BcIiB8IFwiY2hpbGRfc2lsZW5jZVwiIHwgXCJzaWduYWxfc2lndGVybVwiIHwgXCJzaWduYWxfc2lnaW50XCIgfCBcInNpZ25hbF9zaWdraWxsXCIgfCBcInNpZ25hbF9vdGhlclwiIHwgXCJpcGNfZGlzY29ubmVjdFwiIHwgXCJwcm9jZXNzX2Vycm9yXCIgfCBcInVuZXhwZWN0ZWRfZXhpdFwifSBQb29sZWRDaGlsZFNodXRkb3duUmVhc29uICovXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBQb29sZWRDaGlsZFNodXRkb3duUmVhc29uIGZvciBleGFjdCBzaHV0ZG93biBwcm92ZW5hbmNlLlxuICogQHR5cGVkZWYge1widW5leHBlY3RlZFwiIHwgXCJqb2ItdGltZW91dFwiIHwgXCJ3b3JrZXItc2h1dGRvd24tdGltZW91dFwifSBQb29sZWRSdW5uZXJUZXJtaW5hdGlvblJlYXNvblxuICovXG4vKiogQHR5cGVkZWYge1wicnVubmluZ1wiIHwgXCJyZXRpcmluZ1wiIHwgXCJzdG9wcGluZ1wifSBCYWNrZ3JvdW5kSm9ic1dvcmtlckxpZmVjeWNsZVN0YXRlICovXG4vKipcbiAqIEV4YWN0IGR1cmFibGUgaGFuZG9mZiBvd25lcnNoaXAgY2FycmllZCBieSBhbiBleGVjdXRpbmcgam9iIHdoZW4gaXQgcHJvZHVjZXNcbiAqIGZvbGxvdy11cCB3b3JrLlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlByb2R1Y2VyUHJvb2ZcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBqb2JJZCAtIFByb2R1Y2luZyBqb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGFuZG9mZklkIC0gUHJvZHVjaW5nIGhhbmRvZmYgbGVhc2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBXb3JrZXIgaWRlbnRpdHkgcGVyc2lzdGVkIHdpdGggdGhlIGhhbmRvZmYuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGFuZGVkT2ZmQXRNcyAtIER1cmFibGUgaGFuZG9mZiB0aW1lc3RhbXAuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUG9vbGVkUnVubmVyQWN0aXZlSm9iXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGhhbmRvZmZJZCAtIER1cmFibGUgaGFuZG9mZiBsZWFzZSBpZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gaGFuZGVkT2ZmQXRNcyAtIER1cmFibGUgaGFuZG9mZiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iSWQgLSBEdXJhYmxlIGJhY2tncm91bmQgam9iIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBSZWdpc3RlcmVkIGpvYiBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdvcmtlcklkIC0gV29ya2VyIGlkZW50aXR5IHBlcnNpc3RlZCB3aXRoIHRoZSBoYW5kb2ZmLlxuICovXG4vKipcbiAqIE9uZSBwcm9jZXNzLWZhaWx1cmUgc25hcHNob3Qgc2hhcmVkIGJ5IGV2ZXJ5IGpvYiBsb3N0IHdpdGggYSBwb29sZWQgY2hpbGQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb29sZWRSdW5uZXJGYWlsdXJlXG4gKiBAcHJvcGVydHkge1Bvb2xlZFJ1bm5lckFjdGl2ZUpvYltdfSBhY3RpdmVKb2JzIC0gSm9icyB0aGF0IHdlcmUgaW4gZmxpZ2h0IHdoZW4gdGhlIGNoaWxkIGZhaWxlZCwgb3JkZXJlZCBieSBqb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGNoaWxkSW5zdGFuY2VJZCAtIFN0YWJsZSBwb29sZWQtY2hpbGQgaWRlbnRpdHkgd2hlbiBpdHMgc3RhcnR1cCBvciBzaHV0ZG93biBvYnNlcnZhdGlvbiBhcnJpdmVkLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBleGl0Q29kZSAtIENoaWxkIGV4aXQgY29kZSwgb3IgbnVsbCBmb3Igc2lnbmFsL3Byb2Nlc3MgZXJyb3JzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBnZW5lcmF0aW9uSWQgLSBSZWxlYXNlIGdlbmVyYXRpb24gaWRlbnRpdHksIG9yIG51bGwgaW4gbGVnYWN5IG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBpbmZsaWdodEpvYklkcyAtIEJvdW5kZWQgam9iIGlkcyBpbiBmbGlnaHQgd2hlbiBmYWlsdXJlIGhhbmRsaW5nIHN0YXJ0ZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5mbGlnaHRKb2JJZHNUcnVuY2F0ZWRDb3VudCAtIEluLWZsaWdodCBpZHMgb21pdHRlZCBmcm9tIHRoZSBib3VuZGVkIHNuYXBzaG90LlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gb29tS2lsbGVkIC0gRmFsc2Ugd2hlbiB0aGUgb2JzZXJ2ZWQgZXhpdCBydWxlcyBPT00gb3V0OyBudWxsIHdoZW4gYW4gdW5leHBlY3RlZCBTSUdLSUxMIGNhbm5vdCBiZSBkaXN0aW5ndWlzaGVkIGZyb20gYW4gT09NIGtpbGwgd2l0aG91dCBzdXBlcnZpc29yL2tlcm5lbCBldmlkZW5jZS5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkUnVubmVyRmFpbHVyZU9yaWdpbn0gb3JpZ2luIC0gV29ya2VyIG9ic2VydmF0aW9uIHRoYXQgaW5pdGlhdGVkIGZhaWx1cmUgaGFuZGxpbmcuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnVubmVyQWdlTXMgLSBDaGlsZCBhZ2Ugd2hlbiBmYWlsdXJlIGhhbmRsaW5nIHN0YXJ0ZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnVubmVyQ3JlYXRlZEF0TXMgLSBDaGlsZCBjcmVhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJ1bm5lckRldGFjaGVkIC0gV2hldGhlciB0aGUgcnVubmVyIG93bmVkIGEgZGV0YWNoZWQgcHJvY2VzcyBncm91cC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBydW5uZXJKb2JzUnVuIC0gUHJldmlvdXNseSBhY2tub3dsZWRnZWQgam9icyBoYW5kbGVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkUnVubmVyTGlmZWN5Y2xlU3RhdGV9IHJ1bm5lckxpZmVjeWNsZSAtIENoaWxkIGxpZmVjeWNsZSBpbW1lZGlhdGVseSBiZWZvcmUgcmVjb3ZlcnkuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHJ1bm5lclBpZCAtIENoaWxkIHByb2Nlc3MgaWQgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKS5DaGlsZFByb2Nlc3NbXCJzaWduYWxDb2RlXCJdfSBzaWduYWwgLSBDaGlsZCB0ZXJtaW5hdGlvbiBzaWduYWwgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHNodXRkb3duT2JzZXJ2ZWRBdE1zIC0gVGltZSB0aGUgY2hpbGQgb3IgcGFyZW50IG9ic2VydmVkIHNodXRkb3duIGJlZ2lubmluZy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2h1dGRvd25SZXF1ZXN0ZWRBdE1zIC0gRXhhY3QgcGFyZW50IHJlcXVlc3QgdGltZXN0YW1wLCBvciBudWxsIGZvciBleHRlcm5hbC91bnJlcXVlc3RlZCBzaHV0ZG93bi5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkQ2hpbGRTaHV0ZG93blJlYXNvbn0gc2h1dGRvd25SZWFzb24gLSBFeGFjdCByZWNvcmRlZCBwYXJlbnQgcmVxdWVzdCBvciBvYnNlcnZlZCBjaGlsZCBzaHV0ZG93biBjYXVzZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2Vzc1tcInNpZ25hbENvZGVcIl19IHNodXRkb3duU2lnbmFsIC0gUGFyZW50LXJlcXVlc3RlZCBvciBjaGlsZC1vYnNlcnZlZCBzaHV0ZG93biBzaWduYWwgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge1Bvb2xlZFJ1bm5lclRlcm1pbmF0aW9uUmVhc29ufSB0ZXJtaW5hdGlvblJlYXNvbiAtIERlcHJlY2F0ZWQgY29tcGF0aWJpbGl0eSBjYXRlZ29yeTsgdXNlIHNodXRkb3duUmVhc29uIGZvciBleGFjdCBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSB0aW1lb3V0Sm9iSWQgLSBKb2Igd2hvc2UgdGltZW91dCBpbml0aWF0ZWQgY2hpbGQgdGVybWluYXRpb24sIG9yIG51bGwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBTdGFibGUgZ2VuZXJhdGlvbi1xdWFsaWZpZWQgd29ya2VyIGlkLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9ic1dvcmtlckxpZmVjeWNsZVN0YXRlfSB3b3JrZXJMaWZlY3ljbGUgLSBQYXJlbnQgd29ya2VyIGxpZmVjeWNsZSBpbW1lZGlhdGVseSBiZWZvcmUgcmVjb3ZlcnkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gd29ya2VyUGlkIC0gUGFyZW50IHdvcmtlciBwcm9jZXNzIGlkLlxuICovXG4vKipcbiAqIEJlc3QtZWZmb3J0IG9ic2VydmF0aW9uIHNlbnQgYmVmb3JlIGEgcG9vbGVkIGNoaWxkIGNsb3NlcyBpdHMgcmVzb3VyY2VzLlxuICogQHR5cGVkZWYge29iamVjdH0gUG9vbGVkQ2hpbGRTaHV0ZG93bk9ic2VydmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2hpbGRJbnN0YW5jZUlkIC0gU3RhYmxlIHBvb2xlZC1jaGlsZCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGluZmxpZ2h0Sm9iSWRzIC0gQm91bmRlZCBpbi1mbGlnaHQgZHVyYWJsZSBqb2IgaWRzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZmxpZ2h0Sm9iSWRzVHJ1bmNhdGVkQ291bnQgLSBJbi1mbGlnaHQgaWRzIG9taXR0ZWQgZnJvbSB0aGUgYm91bmRlZCBzbmFwc2hvdC5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkQ2hpbGRTaHV0ZG93blJlYXNvbn0gcmVhc29uIC0gU2h1dGRvd24gcmVhc29uIG9ic2VydmVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaHV0ZG93bk9ic2VydmVkQXRNcyAtIENoaWxkIG9ic2VydmF0aW9uIHRpbWVzdGFtcC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2h1dGRvd25SZXF1ZXN0ZWRBdE1zIC0gUGFyZW50IHJlcXVlc3QgdGltZXN0YW1wIHdoZW4gc3VwcGxpZWQgb3ZlciBJUEMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKS5DaGlsZFByb2Nlc3NbXCJzaWduYWxDb2RlXCJdfSBzaWduYWwgLSBSZXF1ZXN0ZWQgb3Igb2JzZXJ2ZWQgc2lnbmFsIHdoZW4gYXZhaWxhYmxlLlxuICovXG4vKipcbiAqIEJvdW5kZWQgcG9vbGVkLWNoaWxkIG1lbW9yeSBvYnNlcnZhdGlvbiBzZW50IG92ZXIgdGhlIGNoaWxkIElQQyBjaGFubmVsLlxuICogVGhlIHBvb2xlZCBjaGlsZCdzIHN0ZGlvIGlzIGlnbm9yZWQgYnkgdGhlIHdvcmtlciBmb3JrLCBzbyB0aGlzIG9ic2VydmF0aW9uXG4gKiAoc2VudCBwZXJpb2RpY2FsbHkgd2hpbGUgam9icyBydW4sIHBsdXMgb24gZGVtYW5kKSBpcyBob3cgYSBtZW1vcnkgcHJvYmxlbVxuICogaW4gYSBydW5uaW5nIGNoaWxkIG5hbWVzIGl0c2VsZi4gYGhlYXBTdGF0aXN0aWNzYCBhbmQgYG1lbW9yeVVzYWdlYFxuICogZGlzdGluZ3Vpc2ggVjgtaGVhcCBncm93dGggZnJvbSBleHRlcm5hbC9hcnJheS1idWZmZXIgKG5hdGl2ZSByZXNvdXJjZSlcbiAqIGdyb3d0aDsgYGFjdGl2ZUpvYklkc2AgdGllcyB0aGUgc2FtcGxlIHRvIHRoZSB3b3JrIHRoYXQgd2FzIGluIGZsaWdodC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBvb2xlZENoaWxkTWVtb3J5T2JzZXJ2YXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGFjdGl2ZUpvYklkcyAtIEluLWZsaWdodCBqb2IgaWRzLCBib3VuZGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGFjdGl2ZUpvYklkc1RydW5jYXRlZENvdW50IC0gSW4tZmxpZ2h0IGpvYiBpZHMgb21pdHRlZCBieSB0aGUgYm91bmQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2hpbGRJbnN0YW5jZUlkIC0gU3RhYmxlIGlkZW50aXR5IHJlcG9ydGVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjaGlsZFBpZCAtIENoaWxkIHByb2Nlc3MgaWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2hpbGRVcHRpbWVNcyAtIENoaWxkIHByb2Nlc3MgdXB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoXCJub2RlOnY4XCIpLmdldEhlYXBTdGF0aXN0aWNzPn0gaGVhcFN0YXRpc3RpY3MgLSBWOCBoZWFwLXN0YXQgYnJlYWtkb3duIGF0IHRoZSBzYW1wbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gam9iQ291bnQgLSBJbi1mbGlnaHQgam9iIGNvdW50LlxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoXCJub2RlOnByb2Nlc3NcIikubWVtb3J5VXNhZ2U+fSBtZW1vcnlVc2FnZSAtIFByb2Nlc3MgbWVtb3J5IGJyZWFrZG93biBhdCB0aGUgc2FtcGxlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG9ic2VydmVkQXRNcyAtIEVwb2NoIG1zIHRoZSBjaGlsZCBzYW1wbGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBlYWtSc3NCeXRlcyAtIENoaWxkLXJlcG9ydGVkIHBlYWsgUlNTIChrZXJuZWwgYFZtSFdNYCBoaWdoLXdhdGVyIG1hcmspIGluIGJ5dGVzLCBtb25vdG9uaWMgZm9yIHRoZSBjaGlsZCdzIGxpZmUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnNzQnl0ZXMgLSBSZXNpZGVudCBzZXQgc2l6ZSBpbiBieXRlcyBhdCB0aGUgc2FtcGxlLlxuICogQHByb3BlcnR5IHtcInBvb2xlZC1jaGlsZC1tZW1vcnlcIn0gdHlwZSAtIERpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdXB0aW1lTXMgLSBQcm9jZXNzIHVwdGltZSBpbiBtcy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2NhbEJhY2tncm91bmRKb2JzQ2xvY2tcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBub3cgLSBDdXJyZW50IGVwb2NoIG1pbGxpc2Vjb25kcy5cbiAqIEBwcm9wZXJ0eSB7KGNhbGxiYWNrOiAoKSA9PiB2b2lkLCBkZWxheU1zOiBudW1iZXIpID0+IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVtYmVyfSBzZXRUaW1lb3V0IC0gQXJtcyBhIHRpbWVyLlxuICogQHByb3BlcnR5IHsodGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudW1iZXIpID0+IHZvaWR9IGNsZWFyVGltZW91dCAtIENsZWFycyBhIHRpbWVyLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlc29sdmVkQmFja2dyb3VuZEpvYkNvbmN1cnJlbmN5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29uY3VycmVuY3lLZXkgLSBEdXJhYmxlIGNhcCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhDb25jdXJyZW5jeSAtIFBvc2l0aXZlIGNhcC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcXVldWVEZXJpdmVkIC0gV2hldGhlciBxdWV1ZSBjb25maWd1cmF0aW9uIG93bnMgdGhlIGNhcC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iQ29uY3VycmVuY3lSZXBhaXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhY3RpdmVDb3VudCAtIEV4YWN0IGhhbmRlZC1vZmYgam9iIGNvdW50IHBlcnNpc3RlZCBieSB0aGUgcmVwYWlyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbmN1cnJlbmN5S2V5IC0gRHVyYWJsZSBjYXAgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJldmlvdXNBY3RpdmVDb3VudCAtIFBlcnNpc3RlZCBjb3VudCByZXBsYWNlZCBieSB0aGUgcmVwYWlyLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JDb25jdXJyZW5jeVJlY29uY2lsaWF0aW9uXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2FuZGlkYXRlQ291bnQgLSBTbmFwc2hvdCBtaXNtYXRjaGVzIHJlY2hlY2tlZCB1bmRlciB0aGVpciBjb3VudGVyIGxvY2tzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNoZWNrZWRDb3VudCAtIEFjdGl2ZSBvciBub256ZXJvIGR1cmFibGUgY291bnRlcnMgY29tcGFyZWQgaW4gdGhlIGluaXRpYWwgc25hcHNob3QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmVwYWlyZWRDb3VudCAtIENvdW50ZXJzIHdob3NlIHBlcnNpc3RlZCB2YWx1ZXMgd2VyZSBjaGFuZ2VkLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iQ29uY3VycmVuY3lSZXBhaXJbXX0gcmVwYWlycyAtIEJvdW5kZWQgZGV0ZXJtaW5pc3RpYyBzYW1wbGUgb2YgYXBwbGllZCByZXBhaXJzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHJlcGFpcnNUcnVuY2F0ZWRDb3VudCAtIEFwcGxpZWQgcmVwYWlycyBvbWl0dGVkIGZyb20gdGhlIHNhbXBsZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmVwYXJlZExvY2FsQmFja2dyb3VuZEpvYlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFyZ3NEaWdlc3QgLSBGaXhlZC13aWR0aCBkaWdlc3Qgb2YgdGhlIHNlcmlhbGl6ZWQgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFyZ3NKc29uIC0gU2VyaWFsaXplZCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkQmFja2dyb3VuZEpvYkNvbmN1cnJlbmN5IHwgbnVsbH0gY29uY3VycmVuY3kgLSBSZXNvbHZlZCBjb25jdXJyZW5jeS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjcmVhdGVkQXRNcyAtIENyZWF0aW9uIHRpbWVzdGFtcC5cbiAqIEBwcm9wZXJ0eSB7XCJpbmxpbmVcIn0gZXhlY3V0aW9uTW9kZSAtIExvY2FsIGluLXByb2Nlc3MgZXhlY3V0aW9uIG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iSWQgLSBEdXJhYmxlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBSZWdpc3RlcmVkIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4UmV0cmllcyAtIFJldHJ5IGNhcC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWV1ZSAtIFF1ZXVlIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2NoZWR1bGVkQXRNcyAtIEVsaWdpYmlsaXR5IHRpbWVzdGFtcC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9ic0hlYWx0aFxuICogQHByb3BlcnR5IHtib29sZWFufSByZWFkeSAtIFdoZXRoZXIgdGhlIGFkYXB0ZXIgY2FuIGFjY2VwdCBhbmQgcHJvY2VzcyB3b3JrLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JzUHJvZHVjZXJcbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtqb2JOYW1lOiBzdHJpbmcsIGFyZ3M6IEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgb3B0aW9ucz86IEJhY2tncm91bmRKb2JPcHRpb25zLCBwcm9kdWNlckludm9jYXRpb25JZD86IHN0cmluZywgcHJvZHVjZXJQcm9vZj86IEJhY2tncm91bmRKb2JQcm9kdWNlclByb29mfSkgPT4gUHJvbWlzZTxzdHJpbmc+fSBlbnF1ZXVlIC0gRW5xdWV1ZXMgYSBqb2IuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7c2NoZWR1bGVLZXk6IHN0cmluZywgam9iTmFtZTogc3RyaW5nLCBhcmdzOiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG9wdGlvbnM/OiBCYWNrZ3JvdW5kSm9iT3B0aW9uc30pID0+IFByb21pc2U8QmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UmVzdWx0Pn0gcmVwbGFjZVNjaGVkdWxlZCAtIFJlcGxhY2VzIGEgc3RhYmxlIHNjaGVkdWxlLlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmd9KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JDYW5jZWxsYXRpb25SZXN1bHQ+fSBjYW5jZWxTY2hlZHVsZWQgLSBDYW5jZWxzIGEgc3RhYmxlIHNjaGVkdWxlLlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmcsIGluY2x1ZGVMYXRlc3RUZXJtaW5hbD86IGJvb2xlYW59KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JTY2hlZHVsZWRMb29rdXBSZXN1bHQ+fSBnZXRTY2hlZHVsZWRKb2IgLSBSZWFkcyBzdGFibGUgc2NoZWR1bGUgb3duZXJzaGlwIGFuZCBoaXN0b3J5LlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmd9KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JXYWtlUmVzdWx0Pn0gd2FrZVNjaGVkdWxlZCAtIEV4cGVkaXRlcyBhIHN0YWJsZSBzY2hlZHVsZSBvd25lci5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iSGFuZG9mZlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhhbmRvZmZJZCAtIFVuaXF1ZSBoYW5kb2ZmIGxlYXNlIGlkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhhbmRlZE9mZkF0TXMgLSBUaW1lIGhhbmRlZCB0byBhIHdvcmtlciBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYlJvd30gW2pvYl0gLSBFeGFjdCBjb21taXR0ZWQgam9iIHNuYXBzaG90IHdoZW4gdGhlIGFkYXB0ZXIgY2hhbmdlcyBkaXNwYXRjaCBkYXRhIGR1cmluZyB0aGUgY2xhaW0uXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYkhhbmRvZmZTbmFwc2hvdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYklkIC0gSm9iIGhvbGRpbmcgdGhlIGxlYXNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhhbmRvZmZJZCAtIEV4YWN0IGR1cmFibGUgbGVhc2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBTdGFibGUgd29ya2VyIGlkIHRoYXQgcmVjZWl2ZWQgdGhlIGxlYXNlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhhbmRlZE9mZkF0TXMgLSBUaW1lIGhhbmRlZCB0byB0aGUgd29ya2VyIGluIG1zLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JIYW5kb2ZmUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYklkIC0gSm9iIHRvIGNsYWltLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoYW5kb2ZmSWRdIC0gRXhhY3QgY2FsbGVyLXNlbGVjdGVkIGxlYXNlIGlkLiBBZGFwdGVycyBtdXN0IHBlcnNpc3QgYW5kIHJldHVybiB0aGlzIGlkIHdoZW4gc3VwcGxpZWQ7IGJ1aWx0LWluIGFkYXB0ZXJzIGdlbmVyYXRlIG9uZSB3aGVuIG9taXR0ZWQgZm9yIGxlZ2FjeSBkaXJlY3QgY2FsbGVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbd29ya2VySWRdIC0gV29ya2VyIGNsYWltaW5nIHRoZSBqb2IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYkV4ZWN1dGlvbk1vZGV9IFtleGVjdXRpb25Nb2RlXSAtIEhvdyB0aGUgam9iIHNob3VsZCBydW4uIE5vZGUgZGVmYXVsdHMgdG8gYFwicG9vbGVkXCJgIChhIHdhcm0sIHJldXNlZCBsb2NhbCBydW5uZXIgcHJvY2VzcykuIEJyb3dzZXIvRXhwbyBsb2NhbCBkaXNwYXRjaCBkZWZhdWx0cyB0byBhbmQgb25seSBhY2NlcHRzIGBcImlubGluZVwiYC4gYFwiZm9ya2VkXCJgIHJ1bnMgYSBOb2RlIGpvYiBpbiBhIGZyZXNoIGBjaGlsZF9wcm9jZXNzLmZvcmsoKWAgY2hpbGQsIGFuZCBgXCJzcGF3bmVkXCJgIGluIGEgZGV0YWNoZWQgQ0xJIHJ1bm5lci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4UmV0cmllc10gLSBNYXggcmV0cmllcyBmb3IgYSBmYWlsZWQgam9iIGJlZm9yZSBpdCBpcyBtYXJrZWQgZmFpbGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV0gLSBRdWV1ZSBuYW1lLiBEZWZhdWx0cyB0byBgXCJkZWZhdWx0XCJgLiBXaGVuIHRoZSBxdWV1ZSBoYXMgYSBjb25maWd1cmVkIGNhcCBpbiBgYmFja2dyb3VuZEpvYnMucXVldWVzYCwgdGhhdCBjYXAgaXMgZW5mb3JjZWQgY2x1c3Rlci13aWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb25jdXJyZW5jeUtleV0gLSBPcGFxdWUgbm9uLWVtcHR5IGtleSB1c2VkIHRvIHNoYXJlIGEgY29uY3VycmVuY3kgY2FwLiBPdmVycmlkZXMgYW55IHF1ZXVlLWRlcml2ZWQgY2FwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhDb25jdXJyZW5jeV0gLSBQb3NpdGl2ZSBpbnRlZ2VyIGNhcDsgbXVzdCBiZSBwYWlyZWQgd2l0aCBgY29uY3VycmVuY3lLZXlgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVkdXBsaWNhdGVXaGlsZVF1ZXVlZF0gLSBXaGVuIHRydWUsIHNraXAgdGhlIGVucXVldWUgaWYgYW4gaWRlbnRpY2FsIHN0aWxsLXF1ZXVlZCBqb2IgKHNhbWUgam9iIG5hbWUsIGFyZ3MgYW5kIHF1ZXVlKSBpcyBzY2hlZHVsZWQgbm8gbGF0ZXIgdGhhbiB0aGlzIGVucXVldWUsIHJldHVybmluZyB0aGUgZWFybGllc3QgbWF0Y2hpbmcgam9iJ3MgaWQuIEEgZnV0dXJlIHJldHJ5IGRvZXMgbm90IHN1cHByZXNzIGVhcmxpZXIgd29yay4gRGVkdXBsaWNhdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBgY29uY3VycmVuY3lLZXlgLCBzbyB0aGUgam9iIGtlZXBzIGl0cyBub3JtYWwgKGUuZy4gcXVldWUtZGVyaXZlZCkgY29uY3VycmVuY3kgY2FwLiBLZWVwcyBhbiBpbnRlcnZhbC1zY2hlZHVsZWQgcmVjdXJyaW5nIGpvYiAoZS5nLiByZXRlbnRpb24gcHJ1bmluZykgZnJvbSBwaWxpbmcgdXAgcmVkdW5kYW50IHF1ZXVlZCByb3dzIHdoZW4gaXQgcnVucyBzbG93ZXIgdGhhbiBpdHMgaW50ZXJ2YWwgb3Igbm8gd29ya2VyIGlzIGZyZWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkZW1wb3RlbmN5S2V5XSAtIER1cmFibGUgZW5xdWV1ZSBpZGVudGl0eSBzY29wZWQgdG8gdGhlIHJlc29sdmVkIGpvYiBjbGFzcyBuYW1lIGFuZCBxdWV1ZS4gRXhhY3QgcmVwbGF5IHJldHVybnMgdGhlIG9yaWdpbmFsIGpvYiBpZCBhY3Jvc3MgZXZlcnkgc3RhdGUgYW5kIGFmdGVyIGpvYiBwcnVuaW5nOyByZXVzZSB3aXRoIGRpZmZlcmVudCBjYW5vbmljYWwgYXJndW1lbnRzIG9yIGJlaGF2aW9yLWFmZmVjdGluZyBvcHRpb25zIGZhaWxzLiBPd25lcnNoaXAgaXMgaW5kZXBlbmRlbnQgb2YgYGRlZHVwbGljYXRlV2hpbGVRdWV1ZWRgIGFuZCBpcyByZXRhaW5lZCB1bnRpbCBhbiBleHBsaWNpdCBmdXR1cmUgcmV0ZW50aW9uIHBvbGljeSByZW1vdmVzIGl0LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzY2hlZHVsZWRBdE1zXSAtIEVwb2NoIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgd2hlbiB0aGUgam9iIGJlY29tZXMgZWxpZ2libGUgZm9yIGRpc3BhdGNoLiBEZWZhdWx0cyB0byBlbnF1ZXVlIHRpbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRNc10gLSBQZXItam9iIHdhbGwtY2xvY2sgdGltZW91dCBmb3IgZm9ya2VkIGFuZCBwb29sZWQgZXhlY3V0aW9uLiBBIHBvc2l0aXZlIGludGVnZXIgdXAgdG8gMiwxNDcsNDgzLDY0NyBvdmVycmlkZXMgdGhlIHdvcmtlci1sZXZlbCBgam9iVGltZW91dE1zYDsgYSBub24tcG9zaXRpdmUgZmluaXRlIHZhbHVlIGRpc2FibGVzIHRoZSB0aW1lb3V0IGZvciB0aGlzIGpvYi5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iUGF5bG9hZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBKb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iTmFtZSAtIEpvYiBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFthcmdzXSAtIFNlcmlhbGl6ZWQgam9iIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGFuZG9mZklkXSAtIFVuaXF1ZSBoYW5kb2ZmIGxlYXNlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt3b3JrZXJJZF0gLSBXb3JrZXIgaWQgaGFuZGxpbmcgdGhlIGpvYi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaGFuZGVkT2ZmQXRNc10gLSBUaW1lIGhhbmRlZCB0byBhIHdvcmtlciBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYk9wdGlvbnN9IFtvcHRpb25zXSAtIFJ1bnRpbWUgb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iQ29udGV4dFxuICogQHByb3BlcnR5IHt0eXBlb2YgaW1wb3J0KFwiLi9wbGF0Zm9ybS1qb2IuanNcIikuZGVmYXVsdH0gam9iQ2xhc3MgLSBDb25jcmV0ZSBqb2IgY2xhc3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iTmFtZSAtIFJlZ2lzdGVyZWQgam9iIG5hbWUuXG4gKiBAcHJvcGVydHkge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncyAtIFNlcmlhbGl6ZWQgam9iIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYk9wdGlvbnN9IG9wdGlvbnMgLSBSZXNvbHZlZCBlbnF1ZXVlL3J1bnRpbWUgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYlBheWxvYWR9IFtwYXlsb2FkXSAtIENvbXBsZXRlIHBlcnNpc3RlZCBydW5uZXIgcGF5bG9hZCB3aGVuIHRoZSBqb2IgaXMgcGVyZm9ybWluZy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iUm93XG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBKb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iTmFtZSAtIEpvYiBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MgLSBTZXJpYWxpemVkIGpvYiBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JFeGVjdXRpb25Nb2RlfSBleGVjdXRpb25Nb2RlIC0gSG93IHRoZSBqb2Igc2hvdWxkIHJ1bi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWV1ZSAtIFF1ZXVlIG5hbWUgKGRlZmF1bHRzIHRvIGBcImRlZmF1bHRcImApLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBzY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleSByZXRhaW5lZCBmb3IgaGlzdG9yeS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2NoZWR1bGVPcmRlciAtIFRyYW5zYWN0aW9uLWFzc2lnbmVkIG1vbm90b25pYyBvd25lcnNoaXAgb3JkZXIgZm9yIHRoaXMgc2NoZWR1bGUga2V5OyBOb2RlIHByZXNlcnZlcyBpdHMgaGlnaC13YXRlciBtYXJrIGFjcm9zcyB0ZXJtaW5hbC1oaXN0b3J5IHBydW5pbmcuIE51bGwgZm9yIGxlZ2FjeS9ub24tc2NoZWR1bGVkIHJvd3MuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JTdGF0dXN9IHN0YXR1cyAtIEN1cnJlbnQgam9iIHN0YXR1cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gYXR0ZW1wdHMgLSBGYWlsdXJlIGF0dGVtcHRzIGNvdW50LlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBtYXhSZXRyaWVzIC0gTWF4IHJldHJ5IGF0dGVtcHRzLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBzY2hlZHVsZWRBdE1zIC0gTmV4dCBzY2hlZHVsZWQgdGltZSBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gY3JlYXRlZEF0TXMgLSBDcmVhdGlvbiB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBoYW5kZWRPZmZBdE1zIC0gVGltZSBoYW5kZWQgdG8gd29ya2VyIGluIG1zLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBoYW5kb2ZmSWQgLSBVbmlxdWUgbGF0ZXN0IGhhbmRvZmYgbGVhc2UgaWQuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGNvbXBsZXRlZEF0TXMgLSBDb21wbGV0aW9uIHRpbWUgaW4gbXMuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGZhaWxlZEF0TXMgLSBGYWlsdXJlIHRpbWUgaW4gbXMuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IG9ycGhhbmVkQXRNcyAtIE9ycGhhbmVkIHRpbWUgaW4gbXMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHdvcmtlcklkIC0gV29ya2VyIGlkIGhhbmRsaW5nIHRoZSBqb2IuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGxhc3RFcnJvciAtIExhc3QgZmFpbHVyZSBtZXNzYWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBjb25jdXJyZW5jeUtleSAtIER1cmFibGUgY29uY3VycmVuY3kga2V5LlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBtYXhDb25jdXJyZW5jeSAtIER1cmFibGUgcGVyLWtleSBjYXAuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHRpbWVvdXRNcyAtIFBlci1qb2Igd2FsbC1jbG9jayB0aW1lb3V0IG92ZXJyaWRlLCBvciBudWxsIHdoZW4gb21pdHRlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gY2hpbGRSZWNlaXZlZEF0TXMgLSBFcG9jaCBtcyB3aGVuIHRoZSBleGVjdXRpbmcgcG9vbGVkIGNoaWxkJ3MgZXZlbnQgbG9vcCBwcm9jZXNzZWQgdGhlIGpvYiBtZXNzYWdlLCBvciBudWxsIHdoZW4gbm8gcnVubmVyIGFjY2VwdGVkIGl0IHlldC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gY2hpbGRTdGFydGVkQXRNcyAtIEVwb2NoIG1zIHdoZW4gdGhlIGpvYidzIHBlcmZvcm0gc3RhcnRlZCBpbiB0aGUgcG9vbGVkIGNoaWxkLCBvciBudWxsIHdoZW4gaXQgbmV2ZXIgc3RhcnRlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gY2hpbGRJbnN0YW5jZUlkIC0gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSBwb29sZWQgY2hpbGQgcHJvY2VzcyB0aGF0IGFjY2VwdGVkIHRoZSBqb2IsIG9yIG51bGwuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGNoaWxkUGlkIC0gT1MgcGlkIG9mIHRoZSBwb29sZWQgY2hpbGQgcHJvY2VzcyB0aGF0IGFjY2VwdGVkIHRoZSBqb2IsIG9yIG51bGwuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJ1bm5lckhvc3RuYW1lIC0gSG9zdG5hbWUgcmVwb3J0ZWQgYnkgdGhlIHBvb2xlZCBjaGlsZCBwcm9jZXNzIHRoYXQgYWNjZXB0ZWQgdGhlIGpvYiwgb3IgbnVsbC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7XCJxdWV1ZWRcIiB8IFwiaGFuZGVkX29mZlwiIHwgbnVsbH0gQmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UHJldmlvdXNTdGF0dXNcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iUmVwbGFjZW1lbnRSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBqb2JJZCAtIE5ld2x5IHF1ZXVlZCBqb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHByZXZpb3VzSm9iSWQgLSBQcmV2aW91cyBhY3RpdmUgb3duZXIncyBqb2IgaWQuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JSZXBsYWNlbWVudFByZXZpb3VzU3RhdHVzfSBwcmV2aW91c1N0YXR1cyAtIFByZXZpb3VzIG93bmVyJ3Mgb2JzZXJ2ZWQgc3RhdGUuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge1wiY2FuY2VsbGVkXCIgfCBcImhhbmRlZF9vZmZcIiB8IFwibm90X2ZvdW5kXCJ9IEJhY2tncm91bmRKb2JDYW5jZWxsYXRpb25PdXRjb21lXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYkNhbmNlbGxhdGlvblJlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBqb2JJZCAtIERldGFjaGVkIG93bmVyJ3Mgam9iIGlkLCB3aGVuIG9uZSB3YXMgYWN0aXZlLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iQ2FuY2VsbGF0aW9uT3V0Y29tZX0gb3V0Y29tZSAtIFRydXRoZnVsIGJlc3QtZWZmb3J0IG91dGNvbWUuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlNjaGVkdWxlZExvb2t1cFJlc3VsdFxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iUm93IHwgbnVsbH0gY3VycmVudEpvYiAtIEN1cnJlbnQgcXVldWVkIG9yIGhhbmRlZC1vZmYgb3duZXIuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JSb3cgfCBudWxsfSBsYXRlc3RUZXJtaW5hbEpvYiAtIExhdGVzdCB0ZXJtaW5hbCBoaXN0b3J5IHdoZW4gcmVxdWVzdGVkLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtcIndva2VuXCIgfCBcImFscmVhZHlfZHVlXCIgfCBcImhhbmRlZF9vZmZcIiB8IFwibm90X2ZvdW5kXCJ9IEJhY2tncm91bmRKb2JXYWtlT3V0Y29tZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JXYWtlUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGpvYklkIC0gQ3VycmVudCBvd25lcidzIGR1cmFibGUgam9iIGlkLCB3aGVuIGZvdW5kLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iV2FrZU91dGNvbWV9IG91dGNvbWUgLSBFeGFjdCB3YWtlIG91dGNvbWUuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYkZhaWx1cmVFdmVudFxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iUm93fSBqb2IgLSBVcGRhdGVkIGpvYiByb3cgYWZ0ZXIgZmFpbHVyZSBoYW5kbGluZy5cbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGVycm9yIC0gRmFpbHVyZSBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gYXR0ZW1wdHMgLSBVcGRhdGVkIGZhaWx1cmUgYXR0ZW1wdHMgY291bnQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRlcm1pbmFsIC0gV2hldGhlciB0aGlzIGZhaWx1cmUgZW5kZWQgdGhlIGpvYi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2lsbFJldHJ5IC0gV2hldGhlciB0aGUgam9iIHdhcyByZXR1cm5lZCB0byB0aGUgcXVldWUuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gaGFuZG9mZklkIC0gSGFuZG9mZiBsZWFzZSBpZCBmcm9tIHRoZSB3b3JrZXIgcmVwb3J0LlxuICogQHByb3BlcnR5IHtudW1iZXIgfCB1bmRlZmluZWR9IGhhbmRlZE9mZkF0TXMgLSBIYW5kb2ZmIHRpbWVzdGFtcCBmcm9tIHRoZSB3b3JrZXIgcmVwb3J0LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IHdvcmtlcklkIC0gV29ya2VyIGlkIGZyb20gdGhlIHdvcmtlciByZXBvcnQuXG4gKiBAcHJvcGVydHkge1Bvb2xlZFJ1bm5lckZhaWx1cmUgfCB1bmRlZmluZWR9IHJ1bm5lckZhaWx1cmUgLSBTaGFyZWQgcG9vbGVkLWNoaWxkIHByb2Nlc3MgZmFpbHVyZSBwcm92ZW5hbmNlLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtcIndvcmtlclwiIHwgXCJjbGllbnRcIiB8IFwicmVwb3J0ZXJcIn0gQmFja2dyb3VuZEpvYlNvY2tldFJvbGVcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiaGVsbG9cIiwgcm9sZTogQmFja2dyb3VuZEpvYlNvY2tldFJvbGUsIGdlbmVyYXRpb25JZD86IHN0cmluZywgc3VwcG9ydHNIYW5kb2ZmSWRSZXBvcnRpbmc/OiBib29sZWFuLCBzdXBwb3J0c0hlYXJ0YmVhdD86IGJvb2xlYW4sIHN1cHBvcnRzUG9vbGVkPzogYm9vbGVhbiwgd29ya2VySWQ/OiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iSGVsbG9NZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZ2VuZXJhdGlvbi1hY2NlcHRlZFwiLCBnZW5lcmF0aW9uSWQ6IHN0cmluZywgbGlmZWN5Y2xlU3RhdGU6IEJhY2tncm91bmRKb2JzR2VuZXJhdGlvbkxpZmVjeWNsZVN0YXRlfX0gQmFja2dyb3VuZEpvYkdlbmVyYXRpb25BY2NlcHRlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJnZW5lcmF0aW9uLXJlamVjdGVkXCIsIHJlYXNvbjogQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uUmVqZWN0aW9uUmVhc29ufX0gQmFja2dyb3VuZEpvYkdlbmVyYXRpb25SZWplY3RlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJyZWFkeVwiLCBhY2NlcHRzRm9ya2VkPzogYm9vbGVhbiwgYWNjZXB0c0lubGluZT86IGJvb2xlYW4sIGFjY2VwdHNQb29sZWQ/OiBib29sZWFuLCBhY2NlcHRzU3Bhd25lZD86IGJvb2xlYW4sIGF2YWlsYWJsZVBvb2xlZFNsb3RzPzogbnVtYmVyfX0gQmFja2dyb3VuZEpvYlJlYWR5TWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImRyYWluaW5nXCJ9fSBCYWNrZ3JvdW5kSm9iRHJhaW5pbmdNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiaGVhcnRiZWF0XCIsIHdvcmtlcklkPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkhlYXJ0YmVhdE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJlbnF1ZXVlXCIsIGpvYk5hbWU6IHN0cmluZywgYXJncz86IEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgb3B0aW9ucz86IEJhY2tncm91bmRKb2JPcHRpb25zLCBwcm9kdWNlckludm9jYXRpb25JZD86IHN0cmluZywgcHJvZHVjZXJQcm9vZj86IEJhY2tncm91bmRKb2JQcm9kdWNlclByb29mfX0gQmFja2dyb3VuZEpvYkVucXVldWVNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZW5xdWV1ZWRcIiwgam9iSWQ6IHN0cmluZ319IEJhY2tncm91bmRKb2JFbnF1ZXVlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJlbnF1ZXVlLWVycm9yXCIsIGVycm9yPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkVucXVldWVFcnJvck1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJyZXBsYWNlLXNjaGVkdWxlZFwiLCBzY2hlZHVsZUtleTogc3RyaW5nLCBqb2JOYW1lOiBzdHJpbmcsIGFyZ3M/OiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG9wdGlvbnM/OiBCYWNrZ3JvdW5kSm9iT3B0aW9uc319IEJhY2tncm91bmRKb2JSZXBsYWNlU2NoZWR1bGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcInNjaGVkdWxlLXJlcGxhY2VkXCIsIGpvYklkOiBzdHJpbmcsIHByZXZpb3VzSm9iSWQ6IHN0cmluZyB8IG51bGwsIHByZXZpb3VzU3RhdHVzOiBCYWNrZ3JvdW5kSm9iUmVwbGFjZW1lbnRQcmV2aW91c1N0YXR1c319IEJhY2tncm91bmRKb2JTY2hlZHVsZVJlcGxhY2VkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcInJlcGxhY2Utc2NoZWR1bGVkLWVycm9yXCIsIGVycm9yPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYlJlcGxhY2VTY2hlZHVsZWRFcnJvck1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJjYW5jZWwtc2NoZWR1bGVkXCIsIHNjaGVkdWxlS2V5OiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iQ2FuY2VsU2NoZWR1bGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcInNjaGVkdWxlLWNhbmNlbGxlZFwiLCBqb2JJZDogc3RyaW5nIHwgbnVsbCwgb3V0Y29tZTogQmFja2dyb3VuZEpvYkNhbmNlbGxhdGlvbk91dGNvbWV9fSBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVDYW5jZWxsZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiY2FuY2VsLXNjaGVkdWxlZC1lcnJvclwiLCBlcnJvcj86IHN0cmluZ319IEJhY2tncm91bmRKb2JDYW5jZWxTY2hlZHVsZWRFcnJvck1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJnZXQtc2NoZWR1bGVkLWpvYlwiLCBzY2hlZHVsZUtleTogc3RyaW5nLCBpbmNsdWRlTGF0ZXN0VGVybWluYWw/OiBib29sZWFufX0gQmFja2dyb3VuZEpvYkdldFNjaGVkdWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzY2hlZHVsZWQtam9iXCIsIGN1cnJlbnRKb2I6IEJhY2tncm91bmRKb2JSb3cgfCBudWxsLCBsYXRlc3RUZXJtaW5hbEpvYjogQmFja2dyb3VuZEpvYlJvdyB8IG51bGx9fSBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImdldC1zY2hlZHVsZWQtam9iLWVycm9yXCIsIGVycm9yPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkdldFNjaGVkdWxlZEVycm9yTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcIndha2Utc2NoZWR1bGVkXCIsIHNjaGVkdWxlS2V5OiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iV2FrZVNjaGVkdWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzY2hlZHVsZS13b2tlblwiLCBqb2JJZDogc3RyaW5nIHwgbnVsbCwgb3V0Y29tZTogQmFja2dyb3VuZEpvYldha2VPdXRjb21lfX0gQmFja2dyb3VuZEpvYlNjaGVkdWxlV29rZW5NZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwid2FrZS1zY2hlZHVsZWQtZXJyb3JcIiwgZXJyb3I/OiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iV2FrZVNjaGVkdWxlZEVycm9yTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYlwiLCBwYXlsb2FkOiBCYWNrZ3JvdW5kSm9iUGF5bG9hZH19IEJhY2tncm91bmRKb2JKb2JNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiam9iLWFjY2VwdGVkXCIsIGpvYklkOiBzdHJpbmcsIGhhbmRvZmZJZD86IHN0cmluZywgd29ya2VySWQ/OiBzdHJpbmcsIGhhbmRlZE9mZkF0TXM/OiBudW1iZXIsIHJlY2VpdmVkQXRNcz86IG51bWJlciwgc3RhcnRlZEF0TXM/OiBudW1iZXIsIGNoaWxkSW5zdGFuY2VJZD86IHN0cmluZywgY2hpbGRQaWQ/OiBudW1iZXIsIHJ1bm5lckhvc3RuYW1lPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkFjY2VwdGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYi1jb21wbGV0ZVwiLCBqb2JJZDogc3RyaW5nLCBoYW5kb2ZmSWQ/OiBzdHJpbmcsIHdvcmtlcklkPzogc3RyaW5nLCBoYW5kZWRPZmZBdE1zPzogbnVtYmVyfX0gQmFja2dyb3VuZEpvYkNvbXBsZXRlTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYi1mYWlsZWRcIiwgam9iSWQ6IHN0cmluZywgZXJyb3I/OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgaGFuZG9mZklkPzogc3RyaW5nLCB3b3JrZXJJZD86IHN0cmluZywgaGFuZGVkT2ZmQXRNcz86IG51bWJlciwgcnVubmVyRmFpbHVyZT86IFBvb2xlZFJ1bm5lckZhaWx1cmV9fSBCYWNrZ3JvdW5kSm9iRmFpbGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYi1yZXNjaGVkdWxlXCIsIGpvYklkOiBzdHJpbmcsIGRlbGF5TXM6IG51bWJlciwgaGFuZG9mZklkPzogc3RyaW5nLCB3b3JrZXJJZD86IHN0cmluZywgaGFuZGVkT2ZmQXRNcz86IG51bWJlcn19IEJhY2tncm91bmRKb2JSZXNjaGVkdWxlTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYi11cGRhdGVkXCIsIGpvYklkOiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iVXBkYXRlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2ItdXBkYXRlLWVycm9yXCIsIGpvYklkOiBzdHJpbmcsIGVycm9yPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYlVwZGF0ZUVycm9yTWVzc2FnZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtCYWNrZ3JvdW5kSm9iSGVsbG9NZXNzYWdlIHwgQmFja2dyb3VuZEpvYkdlbmVyYXRpb25BY2NlcHRlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iR2VuZXJhdGlvblJlamVjdGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JSZWFkeU1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iRHJhaW5pbmdNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkhlYXJ0YmVhdE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iRW5xdWV1ZU1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iRW5xdWV1ZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkVucXVldWVFcnJvck1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iUmVwbGFjZVNjaGVkdWxlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVSZXBsYWNlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iUmVwbGFjZVNjaGVkdWxlZEVycm9yTWVzc2FnZSB8IEJhY2tncm91bmRKb2JDYW5jZWxTY2hlZHVsZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlNjaGVkdWxlQ2FuY2VsbGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JDYW5jZWxTY2hlZHVsZWRFcnJvck1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iR2V0U2NoZWR1bGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JTY2hlZHVsZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkdldFNjaGVkdWxlZEVycm9yTWVzc2FnZSB8IEJhY2tncm91bmRKb2JXYWtlU2NoZWR1bGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JTY2hlZHVsZVdva2VuTWVzc2FnZSB8IEJhY2tncm91bmRKb2JXYWtlU2NoZWR1bGVkRXJyb3JNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkpvYk1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iQWNjZXB0ZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkNvbXBsZXRlTWVzc2FnZSB8IEJhY2tncm91bmRKb2JGYWlsZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlJlc2NoZWR1bGVNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlVwZGF0ZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlVwZGF0ZUVycm9yTWVzc2FnZX0gQmFja2dyb3VuZEpvYlNvY2tldE1lc3NhZ2VcbiAqL1xuXG5leHBvcnQgY29uc3Qgbm90aGluZyA9IHt9XG4iXX0=
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2dyb3VuZC1qb2JzL3R5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUNILHlGQUF5RjtBQUN6RixpSUFBaUk7QUFDakksNk5BQTZOO0FBQzdOLG1FQUFtRTtBQUNuRSwrRkFBK0Y7QUFDL0YsNkZBQTZGO0FBQzdGLG1HQUFtRztBQUNuRyxnRkFBZ0Y7QUFDaEYsdVBBQXVQO0FBQ3ZQOzs7R0FHRztBQUNILHdGQUF3RjtBQUN4Rjs7Ozs7Ozs7R0FRRztBQUNIOzs7Ozs7O0dBT0c7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0g7Ozs7Ozs7Ozs7R0FVRztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSDs7Ozs7R0FLRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7Ozs7OztHQU9HO0FBQ0g7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0g7OztHQUdHO0FBQ0g7Ozs7Ozs7R0FPRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7OztHQU1HO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7Ozs7Ozs7R0FTRztBQUNIOzs7Ozs7O0dBT0c7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSDs7R0FFRztBQUNIOzs7OztHQUtHO0FBQ0g7O0dBRUc7QUFDSDs7OztHQUlHO0FBQ0g7Ozs7R0FJRztBQUNIOztHQUVHO0FBQ0g7Ozs7R0FJRztBQUNIOzs7Ozs7Ozs7OztHQVdHO0FBQ0g7O0dBRUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSDs7R0FFRztBQUVILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAdHlwZWRlZiB7XCJpbmxpbmVcIiB8IFwiZm9ya2VkXCIgfCBcInBvb2xlZFwiIHwgXCJzcGF3bmVkXCJ9IEJhY2tncm91bmRKb2JFeGVjdXRpb25Nb2RlXG4gKi9cbi8qKiBAdHlwZWRlZiB7XCJjYW5kaWRhdGVcIiB8IFwiYWN0aXZlXCIgfCBcInJldGlyZWRcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uSW5pdGlhbFN0YXRlICovXG4vKiogQHR5cGVkZWYge1wic3RhcnRpbmdcIiB8IFwiY2FuZGlkYXRlXCIgfCBcImFjdGl2ZVwiIHwgXCJyZXRpcmluZ1wiIHwgXCJyZXRpcmVkXCIgfCBcInN0b3BwZWRcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uTGlmZWN5Y2xlU3RhdGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJtaXNzaW5nLWdlbmVyYXRpb25cIiB8IFwidW5leHBlY3RlZC1nZW5lcmF0aW9uXCIgfCBcIm1hbGZvcm1lZC1nZW5lcmF0aW9uXCIgfCBcImdlbmVyYXRpb24tbWlzbWF0Y2hcIiB8IFwid29ya2VyLWFkbWlzc2lvbi1yZXRpcmVkXCIgfCBcIndvcmtlci1oYXMtbm8tcmVjb3ZlcmFibGUtaGFuZG9mZnNcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uUmVqZWN0aW9uUmVhc29uICovXG4vKiogQHR5cGVkZWYge1wicXVldWVkXCIgfCBcImhhbmRlZF9vZmZcIn0gQmFja2dyb3VuZEpvYkFjdGl2ZVN0YXR1cyAqL1xuLyoqIEB0eXBlZGVmIHtcImNhbmNlbGxlZFwiIHwgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCIgfCBcIm9ycGhhbmVkXCJ9IEJhY2tncm91bmRKb2JUZXJtaW5hbFN0YXR1cyAqL1xuLyoqIEB0eXBlZGVmIHtCYWNrZ3JvdW5kSm9iQWN0aXZlU3RhdHVzIHwgQmFja2dyb3VuZEpvYlRlcm1pbmFsU3RhdHVzfSBCYWNrZ3JvdW5kSm9iU3RhdHVzICovXG4vKiogQHR5cGVkZWYge1wiZXhpdFwiIHwgXCJwcm9jZXNzLWVycm9yXCIgfCBcImlwYy1zZW5kXCIgfCBcImNoaWxkLXNpbGVuY2VcIn0gUG9vbGVkUnVubmVyRmFpbHVyZU9yaWdpbiAqL1xuLyoqIEB0eXBlZGVmIHtcInN0YXJ0aW5nXCIgfCBcInJ1bm5pbmdcIiB8IFwicmV0aXJpbmdcIn0gUG9vbGVkUnVubmVyTGlmZWN5Y2xlU3RhdGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJwYXJlbnRfcmV0aXJlX2RyYWluZWRcIiB8IFwiam9iX3RpbWVvdXRcIiB8IFwid29ya2VyX3N0b3BcIiB8IFwiY2hpbGRfc2lsZW5jZVwiIHwgXCJzaWduYWxfc2lndGVybVwiIHwgXCJzaWduYWxfc2lnaW50XCIgfCBcInNpZ25hbF9zaWdraWxsXCIgfCBcInNpZ25hbF9vdGhlclwiIHwgXCJpcGNfZGlzY29ubmVjdFwiIHwgXCJwcm9jZXNzX2Vycm9yXCIgfCBcInVuZXhwZWN0ZWRfZXhpdFwifSBQb29sZWRDaGlsZFNodXRkb3duUmVhc29uICovXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBQb29sZWRDaGlsZFNodXRkb3duUmVhc29uIGZvciBleGFjdCBzaHV0ZG93biBwcm92ZW5hbmNlLlxuICogQHR5cGVkZWYge1widW5leHBlY3RlZFwiIHwgXCJqb2ItdGltZW91dFwiIHwgXCJ3b3JrZXItc2h1dGRvd24tdGltZW91dFwifSBQb29sZWRSdW5uZXJUZXJtaW5hdGlvblJlYXNvblxuICovXG4vKiogQHR5cGVkZWYge1wicnVubmluZ1wiIHwgXCJyZXRpcmluZ1wiIHwgXCJzdG9wcGluZ1wifSBCYWNrZ3JvdW5kSm9ic1dvcmtlckxpZmVjeWNsZVN0YXRlICovXG4vKipcbiAqIEV4YWN0IGR1cmFibGUgaGFuZG9mZiBvd25lcnNoaXAgY2FycmllZCBieSBhbiBleGVjdXRpbmcgam9iIHdoZW4gaXQgcHJvZHVjZXNcbiAqIGZvbGxvdy11cCB3b3JrLlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlByb2R1Y2VyUHJvb2ZcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBqb2JJZCAtIFByb2R1Y2luZyBqb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGFuZG9mZklkIC0gUHJvZHVjaW5nIGhhbmRvZmYgbGVhc2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBXb3JrZXIgaWRlbnRpdHkgcGVyc2lzdGVkIHdpdGggdGhlIGhhbmRvZmYuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGFuZGVkT2ZmQXRNcyAtIER1cmFibGUgaGFuZG9mZiB0aW1lc3RhbXAuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUG9vbGVkUnVubmVyQWN0aXZlSm9iXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGhhbmRvZmZJZCAtIER1cmFibGUgaGFuZG9mZiBsZWFzZSBpZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gaGFuZGVkT2ZmQXRNcyAtIER1cmFibGUgaGFuZG9mZiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iSWQgLSBEdXJhYmxlIGJhY2tncm91bmQgam9iIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBSZWdpc3RlcmVkIGpvYiBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdvcmtlcklkIC0gV29ya2VyIGlkZW50aXR5IHBlcnNpc3RlZCB3aXRoIHRoZSBoYW5kb2ZmLlxuICovXG4vKipcbiAqIE9uZSBwcm9jZXNzLWZhaWx1cmUgc25hcHNob3Qgc2hhcmVkIGJ5IGV2ZXJ5IGpvYiBsb3N0IHdpdGggYSBwb29sZWQgY2hpbGQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb29sZWRSdW5uZXJGYWlsdXJlXG4gKiBAcHJvcGVydHkge1Bvb2xlZFJ1bm5lckFjdGl2ZUpvYltdfSBhY3RpdmVKb2JzIC0gSm9icyB0aGF0IHdlcmUgaW4gZmxpZ2h0IHdoZW4gdGhlIGNoaWxkIGZhaWxlZCwgb3JkZXJlZCBieSBqb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGNoaWxkSW5zdGFuY2VJZCAtIFN0YWJsZSBwb29sZWQtY2hpbGQgaWRlbnRpdHkgd2hlbiBpdHMgc3RhcnR1cCBvciBzaHV0ZG93biBvYnNlcnZhdGlvbiBhcnJpdmVkLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBleGl0Q29kZSAtIENoaWxkIGV4aXQgY29kZSwgb3IgbnVsbCBmb3Igc2lnbmFsL3Byb2Nlc3MgZXJyb3JzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBnZW5lcmF0aW9uSWQgLSBSZWxlYXNlIGdlbmVyYXRpb24gaWRlbnRpdHksIG9yIG51bGwgaW4gbGVnYWN5IG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBpbmZsaWdodEpvYklkcyAtIEJvdW5kZWQgam9iIGlkcyBpbiBmbGlnaHQgd2hlbiBmYWlsdXJlIGhhbmRsaW5nIHN0YXJ0ZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5mbGlnaHRKb2JJZHNUcnVuY2F0ZWRDb3VudCAtIEluLWZsaWdodCBpZHMgb21pdHRlZCBmcm9tIHRoZSBib3VuZGVkIHNuYXBzaG90LlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gb29tS2lsbGVkIC0gRmFsc2Ugd2hlbiB0aGUgb2JzZXJ2ZWQgZXhpdCBydWxlcyBPT00gb3V0OyBudWxsIHdoZW4gYW4gdW5leHBlY3RlZCBTSUdLSUxMIGNhbm5vdCBiZSBkaXN0aW5ndWlzaGVkIGZyb20gYW4gT09NIGtpbGwgd2l0aG91dCBzdXBlcnZpc29yL2tlcm5lbCBldmlkZW5jZS5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkUnVubmVyRmFpbHVyZU9yaWdpbn0gb3JpZ2luIC0gV29ya2VyIG9ic2VydmF0aW9uIHRoYXQgaW5pdGlhdGVkIGZhaWx1cmUgaGFuZGxpbmcuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnVubmVyQWdlTXMgLSBDaGlsZCBhZ2Ugd2hlbiBmYWlsdXJlIGhhbmRsaW5nIHN0YXJ0ZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnVubmVyQ3JlYXRlZEF0TXMgLSBDaGlsZCBjcmVhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJ1bm5lckRldGFjaGVkIC0gV2hldGhlciB0aGUgcnVubmVyIG93bmVkIGEgZGV0YWNoZWQgcHJvY2VzcyBncm91cC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBydW5uZXJKb2JzUnVuIC0gUHJldmlvdXNseSBhY2tub3dsZWRnZWQgam9icyBoYW5kbGVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkUnVubmVyTGlmZWN5Y2xlU3RhdGV9IHJ1bm5lckxpZmVjeWNsZSAtIENoaWxkIGxpZmVjeWNsZSBpbW1lZGlhdGVseSBiZWZvcmUgcmVjb3ZlcnkuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHJ1bm5lclBpZCAtIENoaWxkIHByb2Nlc3MgaWQgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKS5DaGlsZFByb2Nlc3NbXCJzaWduYWxDb2RlXCJdfSBzaWduYWwgLSBDaGlsZCB0ZXJtaW5hdGlvbiBzaWduYWwgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHNodXRkb3duT2JzZXJ2ZWRBdE1zIC0gVGltZSB0aGUgY2hpbGQgb3IgcGFyZW50IG9ic2VydmVkIHNodXRkb3duIGJlZ2lubmluZy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2h1dGRvd25SZXF1ZXN0ZWRBdE1zIC0gRXhhY3QgcGFyZW50IHJlcXVlc3QgdGltZXN0YW1wLCBvciBudWxsIGZvciBleHRlcm5hbC91bnJlcXVlc3RlZCBzaHV0ZG93bi5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkQ2hpbGRTaHV0ZG93blJlYXNvbn0gc2h1dGRvd25SZWFzb24gLSBFeGFjdCByZWNvcmRlZCBwYXJlbnQgcmVxdWVzdCBvciBvYnNlcnZlZCBjaGlsZCBzaHV0ZG93biBjYXVzZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2Vzc1tcInNpZ25hbENvZGVcIl19IHNodXRkb3duU2lnbmFsIC0gUGFyZW50LXJlcXVlc3RlZCBvciBjaGlsZC1vYnNlcnZlZCBzaHV0ZG93biBzaWduYWwgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge1Bvb2xlZFJ1bm5lclRlcm1pbmF0aW9uUmVhc29ufSB0ZXJtaW5hdGlvblJlYXNvbiAtIERlcHJlY2F0ZWQgY29tcGF0aWJpbGl0eSBjYXRlZ29yeTsgdXNlIHNodXRkb3duUmVhc29uIGZvciBleGFjdCBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSB0aW1lb3V0Sm9iSWQgLSBKb2Igd2hvc2UgdGltZW91dCBpbml0aWF0ZWQgY2hpbGQgdGVybWluYXRpb24sIG9yIG51bGwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBTdGFibGUgZ2VuZXJhdGlvbi1xdWFsaWZpZWQgd29ya2VyIGlkLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9ic1dvcmtlckxpZmVjeWNsZVN0YXRlfSB3b3JrZXJMaWZlY3ljbGUgLSBQYXJlbnQgd29ya2VyIGxpZmVjeWNsZSBpbW1lZGlhdGVseSBiZWZvcmUgcmVjb3ZlcnkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gd29ya2VyUGlkIC0gUGFyZW50IHdvcmtlciBwcm9jZXNzIGlkLlxuICovXG4vKipcbiAqIEJlc3QtZWZmb3J0IG9ic2VydmF0aW9uIHNlbnQgYmVmb3JlIGEgcG9vbGVkIGNoaWxkIGNsb3NlcyBpdHMgcmVzb3VyY2VzLlxuICogQHR5cGVkZWYge29iamVjdH0gUG9vbGVkQ2hpbGRTaHV0ZG93bk9ic2VydmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2hpbGRJbnN0YW5jZUlkIC0gU3RhYmxlIHBvb2xlZC1jaGlsZCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGluZmxpZ2h0Sm9iSWRzIC0gQm91bmRlZCBpbi1mbGlnaHQgZHVyYWJsZSBqb2IgaWRzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZmxpZ2h0Sm9iSWRzVHJ1bmNhdGVkQ291bnQgLSBJbi1mbGlnaHQgaWRzIG9taXR0ZWQgZnJvbSB0aGUgYm91bmRlZCBzbmFwc2hvdC5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkQ2hpbGRTaHV0ZG93blJlYXNvbn0gcmVhc29uIC0gU2h1dGRvd24gcmVhc29uIG9ic2VydmVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaHV0ZG93bk9ic2VydmVkQXRNcyAtIENoaWxkIG9ic2VydmF0aW9uIHRpbWVzdGFtcC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2h1dGRvd25SZXF1ZXN0ZWRBdE1zIC0gUGFyZW50IHJlcXVlc3QgdGltZXN0YW1wIHdoZW4gc3VwcGxpZWQgb3ZlciBJUEMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKS5DaGlsZFByb2Nlc3NbXCJzaWduYWxDb2RlXCJdfSBzaWduYWwgLSBSZXF1ZXN0ZWQgb3Igb2JzZXJ2ZWQgc2lnbmFsIHdoZW4gYXZhaWxhYmxlLlxuICovXG4vKipcbiAqIEJvdW5kZWQgcG9vbGVkLWNoaWxkIG1lbW9yeSBvYnNlcnZhdGlvbiBzZW50IG92ZXIgdGhlIGNoaWxkIElQQyBjaGFubmVsLlxuICogVGhlIHBvb2xlZCBjaGlsZCdzIHN0ZGlvIGlzIGlnbm9yZWQgYnkgdGhlIHdvcmtlciBmb3JrLCBzbyB0aGlzIG9ic2VydmF0aW9uXG4gKiAoc2VudCBwZXJpb2RpY2FsbHkgd2hpbGUgam9icyBydW4sIHBsdXMgb24gZGVtYW5kKSBpcyBob3cgYSBtZW1vcnkgcHJvYmxlbVxuICogaW4gYSBydW5uaW5nIGNoaWxkIG5hbWVzIGl0c2VsZi4gYGhlYXBTdGF0aXN0aWNzYCBhbmQgYG1lbW9yeVVzYWdlYFxuICogZGlzdGluZ3Vpc2ggVjgtaGVhcCBncm93dGggZnJvbSBleHRlcm5hbC9hcnJheS1idWZmZXIgKG5hdGl2ZSByZXNvdXJjZSlcbiAqIGdyb3d0aDsgYGFjdGl2ZUpvYklkc2AgdGllcyB0aGUgc2FtcGxlIHRvIHRoZSB3b3JrIHRoYXQgd2FzIGluIGZsaWdodC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBvb2xlZENoaWxkTWVtb3J5T2JzZXJ2YXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGFjdGl2ZUpvYklkcyAtIEluLWZsaWdodCBqb2IgaWRzLCBib3VuZGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGFjdGl2ZUpvYklkc1RydW5jYXRlZENvdW50IC0gSW4tZmxpZ2h0IGpvYiBpZHMgb21pdHRlZCBieSB0aGUgYm91bmQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2hpbGRJbnN0YW5jZUlkIC0gU3RhYmxlIGlkZW50aXR5IHJlcG9ydGVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjaGlsZFBpZCAtIENoaWxkIHByb2Nlc3MgaWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2hpbGRVcHRpbWVNcyAtIENoaWxkIHByb2Nlc3MgdXB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoXCJub2RlOnY4XCIpLmdldEhlYXBTdGF0aXN0aWNzPn0gaGVhcFN0YXRpc3RpY3MgLSBWOCBoZWFwLXN0YXQgYnJlYWtkb3duIGF0IHRoZSBzYW1wbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gam9iQ291bnQgLSBJbi1mbGlnaHQgam9iIGNvdW50LlxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoXCJub2RlOnByb2Nlc3NcIikubWVtb3J5VXNhZ2U+fSBtZW1vcnlVc2FnZSAtIFByb2Nlc3MgbWVtb3J5IGJyZWFrZG93biBhdCB0aGUgc2FtcGxlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG9ic2VydmVkQXRNcyAtIEVwb2NoIG1zIHRoZSBjaGlsZCBzYW1wbGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBlYWtSc3NCeXRlcyAtIENoaWxkLXJlcG9ydGVkIHBlYWsgUlNTIChrZXJuZWwgYFZtSFdNYCBoaWdoLXdhdGVyIG1hcmspIGluIGJ5dGVzLCBtb25vdG9uaWMgZm9yIHRoZSBjaGlsZCdzIGxpZmUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnNzQnl0ZXMgLSBSZXNpZGVudCBzZXQgc2l6ZSBpbiBieXRlcyBhdCB0aGUgc2FtcGxlLlxuICogQHByb3BlcnR5IHtcInBvb2xlZC1jaGlsZC1tZW1vcnlcIn0gdHlwZSAtIERpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdXB0aW1lTXMgLSBQcm9jZXNzIHVwdGltZSBpbiBtcy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2NhbEJhY2tncm91bmRKb2JzQ2xvY2tcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBub3cgLSBDdXJyZW50IGVwb2NoIG1pbGxpc2Vjb25kcy5cbiAqIEBwcm9wZXJ0eSB7KGNhbGxiYWNrOiAoKSA9PiB2b2lkLCBkZWxheU1zOiBudW1iZXIpID0+IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVtYmVyfSBzZXRUaW1lb3V0IC0gQXJtcyBhIHRpbWVyLlxuICogQHByb3BlcnR5IHsodGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudW1iZXIpID0+IHZvaWR9IGNsZWFyVGltZW91dCAtIENsZWFycyBhIHRpbWVyLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlc29sdmVkQmFja2dyb3VuZEpvYkNvbmN1cnJlbmN5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29uY3VycmVuY3lLZXkgLSBEdXJhYmxlIGNhcCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhDb25jdXJyZW5jeSAtIFBvc2l0aXZlIGNhcC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcXVldWVEZXJpdmVkIC0gV2hldGhlciBxdWV1ZSBjb25maWd1cmF0aW9uIG93bnMgdGhlIGNhcC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iQ29uY3VycmVuY3lSZXBhaXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhY3RpdmVDb3VudCAtIEV4YWN0IGhhbmRlZC1vZmYgam9iIGNvdW50IHBlcnNpc3RlZCBieSB0aGUgcmVwYWlyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbmN1cnJlbmN5S2V5IC0gRHVyYWJsZSBjYXAgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJldmlvdXNBY3RpdmVDb3VudCAtIFBlcnNpc3RlZCBjb3VudCByZXBsYWNlZCBieSB0aGUgcmVwYWlyLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JDb25jdXJyZW5jeVJlY29uY2lsaWF0aW9uXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2FuZGlkYXRlQ291bnQgLSBTbmFwc2hvdCBtaXNtYXRjaGVzIHJlY2hlY2tlZCB1bmRlciB0aGVpciBjb3VudGVyIGxvY2tzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNoZWNrZWRDb3VudCAtIEFjdGl2ZSBvciBub256ZXJvIGR1cmFibGUgY291bnRlcnMgY29tcGFyZWQgaW4gdGhlIGluaXRpYWwgc25hcHNob3QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmVwYWlyZWRDb3VudCAtIENvdW50ZXJzIHdob3NlIHBlcnNpc3RlZCB2YWx1ZXMgd2VyZSBjaGFuZ2VkLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iQ29uY3VycmVuY3lSZXBhaXJbXX0gcmVwYWlycyAtIEJvdW5kZWQgZGV0ZXJtaW5pc3RpYyBzYW1wbGUgb2YgYXBwbGllZCByZXBhaXJzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHJlcGFpcnNUcnVuY2F0ZWRDb3VudCAtIEFwcGxpZWQgcmVwYWlycyBvbWl0dGVkIGZyb20gdGhlIHNhbXBsZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmVwYXJlZExvY2FsQmFja2dyb3VuZEpvYlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFyZ3NEaWdlc3QgLSBGaXhlZC13aWR0aCBkaWdlc3Qgb2YgdGhlIHNlcmlhbGl6ZWQgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFyZ3NKc29uIC0gU2VyaWFsaXplZCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkQmFja2dyb3VuZEpvYkNvbmN1cnJlbmN5IHwgbnVsbH0gY29uY3VycmVuY3kgLSBSZXNvbHZlZCBjb25jdXJyZW5jeS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjcmVhdGVkQXRNcyAtIENyZWF0aW9uIHRpbWVzdGFtcC5cbiAqIEBwcm9wZXJ0eSB7XCJpbmxpbmVcIn0gZXhlY3V0aW9uTW9kZSAtIExvY2FsIGluLXByb2Nlc3MgZXhlY3V0aW9uIG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iSWQgLSBEdXJhYmxlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBSZWdpc3RlcmVkIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4UmV0cmllcyAtIFJldHJ5IGNhcC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWV1ZSAtIFF1ZXVlIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2NoZWR1bGVkQXRNcyAtIEVsaWdpYmlsaXR5IHRpbWVzdGFtcC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9ic0hlYWx0aFxuICogQHByb3BlcnR5IHtib29sZWFufSByZWFkeSAtIFdoZXRoZXIgdGhlIGFkYXB0ZXIgY2FuIGFjY2VwdCBhbmQgcHJvY2VzcyB3b3JrLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JzUHJvZHVjZXJcbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtqb2JOYW1lOiBzdHJpbmcsIGFyZ3M6IEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgb3B0aW9ucz86IEJhY2tncm91bmRKb2JPcHRpb25zLCBwcm9kdWNlckludm9jYXRpb25JZD86IHN0cmluZywgcHJvZHVjZXJQcm9vZj86IEJhY2tncm91bmRKb2JQcm9kdWNlclByb29mfSkgPT4gUHJvbWlzZTxzdHJpbmc+fSBlbnF1ZXVlIC0gRW5xdWV1ZXMgYSBqb2IuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7c2NoZWR1bGVLZXk6IHN0cmluZywgam9iTmFtZTogc3RyaW5nLCBhcmdzOiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG9wdGlvbnM/OiBCYWNrZ3JvdW5kSm9iT3B0aW9uc30pID0+IFByb21pc2U8QmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UmVzdWx0Pn0gcmVwbGFjZVNjaGVkdWxlZCAtIFJlcGxhY2VzIGEgc3RhYmxlIHNjaGVkdWxlLlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmd9KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JDYW5jZWxsYXRpb25SZXN1bHQ+fSBjYW5jZWxTY2hlZHVsZWQgLSBDYW5jZWxzIGEgc3RhYmxlIHNjaGVkdWxlLlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmcsIGluY2x1ZGVMYXRlc3RUZXJtaW5hbD86IGJvb2xlYW59KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JTY2hlZHVsZWRMb29rdXBSZXN1bHQ+fSBnZXRTY2hlZHVsZWRKb2IgLSBSZWFkcyBzdGFibGUgc2NoZWR1bGUgb3duZXJzaGlwIGFuZCBoaXN0b3J5LlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmd9KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JXYWtlUmVzdWx0Pn0gd2FrZVNjaGVkdWxlZCAtIEV4cGVkaXRlcyBhIHN0YWJsZSBzY2hlZHVsZSBvd25lci5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iSGFuZG9mZlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhhbmRvZmZJZCAtIFVuaXF1ZSBoYW5kb2ZmIGxlYXNlIGlkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhhbmRlZE9mZkF0TXMgLSBUaW1lIGhhbmRlZCB0byBhIHdvcmtlciBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYlJvd30gW2pvYl0gLSBFeGFjdCBjb21taXR0ZWQgam9iIHNuYXBzaG90IHdoZW4gdGhlIGFkYXB0ZXIgY2hhbmdlcyBkaXNwYXRjaCBkYXRhIGR1cmluZyB0aGUgY2xhaW0uXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYkhhbmRvZmZTbmFwc2hvdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYklkIC0gSm9iIGhvbGRpbmcgdGhlIGxlYXNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhhbmRvZmZJZCAtIEV4YWN0IGR1cmFibGUgbGVhc2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBTdGFibGUgd29ya2VyIGlkIHRoYXQgcmVjZWl2ZWQgdGhlIGxlYXNlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhhbmRlZE9mZkF0TXMgLSBUaW1lIGhhbmRlZCB0byB0aGUgd29ya2VyIGluIG1zLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JIYW5kb2ZmUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYklkIC0gSm9iIHRvIGNsYWltLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoYW5kb2ZmSWRdIC0gRXhhY3QgY2FsbGVyLXNlbGVjdGVkIGxlYXNlIGlkLiBBZGFwdGVycyBtdXN0IHBlcnNpc3QgYW5kIHJldHVybiB0aGlzIGlkIHdoZW4gc3VwcGxpZWQ7IGJ1aWx0LWluIGFkYXB0ZXJzIGdlbmVyYXRlIG9uZSB3aGVuIG9taXR0ZWQgZm9yIGxlZ2FjeSBkaXJlY3QgY2FsbGVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbd29ya2VySWRdIC0gV29ya2VyIGNsYWltaW5nIHRoZSBqb2IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYkV4ZWN1dGlvbk1vZGV9IFtleGVjdXRpb25Nb2RlXSAtIEhvdyB0aGUgam9iIHNob3VsZCBydW4uIE5vZGUgZGVmYXVsdHMgdG8gYFwicG9vbGVkXCJgIChhIHdhcm0sIHJldXNlZCBsb2NhbCBydW5uZXIgcHJvY2VzcykuIEJyb3dzZXIvRXhwbyBsb2NhbCBkaXNwYXRjaCBkZWZhdWx0cyB0byBhbmQgb25seSBhY2NlcHRzIGBcImlubGluZVwiYC4gYFwiZm9ya2VkXCJgIHJ1bnMgYSBOb2RlIGpvYiBpbiBhIGZyZXNoIGBjaGlsZF9wcm9jZXNzLmZvcmsoKWAgY2hpbGQsIGFuZCBgXCJzcGF3bmVkXCJgIGluIGEgZGV0YWNoZWQgQ0xJIHJ1bm5lci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4UmV0cmllc10gLSBNYXggcmV0cmllcyBmb3IgYSBmYWlsZWQgam9iIGJlZm9yZSBpdCBpcyBtYXJrZWQgZmFpbGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV0gLSBRdWV1ZSBuYW1lLiBEZWZhdWx0cyB0byBgXCJkZWZhdWx0XCJgLiBXaGVuIHRoZSBxdWV1ZSBoYXMgYSBjb25maWd1cmVkIGNhcCBpbiBgYmFja2dyb3VuZEpvYnMucXVldWVzYCwgdGhhdCBjYXAgaXMgZW5mb3JjZWQgY2x1c3Rlci13aWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb25jdXJyZW5jeUtleV0gLSBPcGFxdWUgbm9uLWVtcHR5IGtleSB1c2VkIHRvIHNoYXJlIGEgY29uY3VycmVuY3kgY2FwLiBPdmVycmlkZXMgYW55IHF1ZXVlLWRlcml2ZWQgY2FwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhDb25jdXJyZW5jeV0gLSBQb3NpdGl2ZSBpbnRlZ2VyIGNhcDsgbXVzdCBiZSBwYWlyZWQgd2l0aCBgY29uY3VycmVuY3lLZXlgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVkdXBsaWNhdGVXaGlsZVF1ZXVlZF0gLSBXaGVuIHRydWUsIHNraXAgdGhlIGVucXVldWUgaWYgYW4gaWRlbnRpY2FsIHN0aWxsLXF1ZXVlZCBqb2IgKHNhbWUgam9iIG5hbWUsIGFyZ3MgYW5kIHF1ZXVlKSBpcyBzY2hlZHVsZWQgbm8gbGF0ZXIgdGhhbiB0aGlzIGVucXVldWUsIHJldHVybmluZyB0aGUgZWFybGllc3QgbWF0Y2hpbmcgam9iJ3MgaWQuIEEgZnV0dXJlIHJldHJ5IGRvZXMgbm90IHN1cHByZXNzIGVhcmxpZXIgd29yay4gRGVkdXBsaWNhdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBgY29uY3VycmVuY3lLZXlgLCBzbyB0aGUgam9iIGtlZXBzIGl0cyBub3JtYWwgKGUuZy4gcXVldWUtZGVyaXZlZCkgY29uY3VycmVuY3kgY2FwLiBLZWVwcyBhbiBpbnRlcnZhbC1zY2hlZHVsZWQgcmVjdXJyaW5nIGpvYiAoZS5nLiByZXRlbnRpb24gcHJ1bmluZykgZnJvbSBwaWxpbmcgdXAgcmVkdW5kYW50IHF1ZXVlZCByb3dzIHdoZW4gaXQgcnVucyBzbG93ZXIgdGhhbiBpdHMgaW50ZXJ2YWwgb3Igbm8gd29ya2VyIGlzIGZyZWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkZW1wb3RlbmN5S2V5XSAtIER1cmFibGUgZW5xdWV1ZSBpZGVudGl0eSBzY29wZWQgdG8gdGhlIHJlc29sdmVkIGpvYiBjbGFzcyBuYW1lIGFuZCBxdWV1ZS4gRXhhY3QgcmVwbGF5IHJldHVybnMgdGhlIG9yaWdpbmFsIGpvYiBpZCBhY3Jvc3MgZXZlcnkgc3RhdGUgYW5kIGFmdGVyIGpvYiBwcnVuaW5nOyByZXVzZSB3aXRoIGRpZmZlcmVudCBjYW5vbmljYWwgYXJndW1lbnRzIG9yIGJlaGF2aW9yLWFmZmVjdGluZyBvcHRpb25zIGZhaWxzLiBPd25lcnNoaXAgaXMgaW5kZXBlbmRlbnQgb2YgYGRlZHVwbGljYXRlV2hpbGVRdWV1ZWRgIGFuZCBpcyByZXRhaW5lZCB1bnRpbCBhbiBleHBsaWNpdCBmdXR1cmUgcmV0ZW50aW9uIHBvbGljeSByZW1vdmVzIGl0LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzY2hlZHVsZWRBdE1zXSAtIEVwb2NoIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgd2hlbiB0aGUgam9iIGJlY29tZXMgZWxpZ2libGUgZm9yIGRpc3BhdGNoLiBEZWZhdWx0cyB0byBlbnF1ZXVlIHRpbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRNc10gLSBQZXItam9iIHdhbGwtY2xvY2sgdGltZW91dCBmb3IgZm9ya2VkIGFuZCBwb29sZWQgZXhlY3V0aW9uLiBBIHBvc2l0aXZlIGludGVnZXIgdXAgdG8gMiwxNDcsNDgzLDY0NyBvdmVycmlkZXMgYSBqb2IgY2xhc3MncyBgc3RhdGljIHRpbWVvdXRNc2AgYW5kIHRoZSB3b3JrZXItbGV2ZWwgYGpvYlRpbWVvdXRNc2A7IGEgbm9uLXBvc2l0aXZlIGZpbml0ZSB2YWx1ZSBkaXNhYmxlcyB0aGUgdGltZW91dCBmb3IgdGhpcyBqb2IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlBheWxvYWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gSm9iIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBKb2IgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbYXJnc10gLSBTZXJpYWxpemVkIGpvYiBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hhbmRvZmZJZF0gLSBVbmlxdWUgaGFuZG9mZiBsZWFzZSBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbd29ya2VySWRdIC0gV29ya2VyIGlkIGhhbmRsaW5nIHRoZSBqb2IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2hhbmRlZE9mZkF0TXNdIC0gVGltZSBoYW5kZWQgdG8gYSB3b3JrZXIgaW4gbXMuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JPcHRpb25zfSBbb3B0aW9uc10gLSBSdW50aW1lIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYkNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vcGxhdGZvcm0tam9iLmpzXCIpLmRlZmF1bHR9IGpvYkNsYXNzIC0gQ29uY3JldGUgam9iIGNsYXNzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBSZWdpc3RlcmVkIGpvYiBuYW1lLlxuICogQHByb3BlcnR5IHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MgLSBTZXJpYWxpemVkIGpvYiBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JPcHRpb25zfSBvcHRpb25zIC0gUmVzb2x2ZWQgZW5xdWV1ZS9ydW50aW1lIG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JQYXlsb2FkfSBbcGF5bG9hZF0gLSBDb21wbGV0ZSBwZXJzaXN0ZWQgcnVubmVyIHBheWxvYWQgd2hlbiB0aGUgam9iIGlzIHBlcmZvcm1pbmcuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlJvd1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gSm9iIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBKb2IgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzIC0gU2VyaWFsaXplZCBqb2IgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iRXhlY3V0aW9uTW9kZX0gZXhlY3V0aW9uTW9kZSAtIEhvdyB0aGUgam9iIHNob3VsZCBydW4uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVldWUgLSBRdWV1ZSBuYW1lIChkZWZhdWx0cyB0byBgXCJkZWZhdWx0XCJgKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkgcmV0YWluZWQgZm9yIGhpc3RvcnkuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHNjaGVkdWxlT3JkZXIgLSBUcmFuc2FjdGlvbi1hc3NpZ25lZCBtb25vdG9uaWMgb3duZXJzaGlwIG9yZGVyIGZvciB0aGlzIHNjaGVkdWxlIGtleTsgTm9kZSBwcmVzZXJ2ZXMgaXRzIGhpZ2gtd2F0ZXIgbWFyayBhY3Jvc3MgdGVybWluYWwtaGlzdG9yeSBwcnVuaW5nLiBOdWxsIGZvciBsZWdhY3kvbm9uLXNjaGVkdWxlZCByb3dzLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iU3RhdHVzfSBzdGF0dXMgLSBDdXJyZW50IGpvYiBzdGF0dXMuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGF0dGVtcHRzIC0gRmFpbHVyZSBhdHRlbXB0cyBjb3VudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gbWF4UmV0cmllcyAtIE1heCByZXRyeSBhdHRlbXB0cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2NoZWR1bGVkQXRNcyAtIE5leHQgc2NoZWR1bGVkIHRpbWUgaW4gbXMuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGNyZWF0ZWRBdE1zIC0gQ3JlYXRpb24gdGltZSBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gaGFuZGVkT2ZmQXRNcyAtIFRpbWUgaGFuZGVkIHRvIHdvcmtlciBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaGFuZG9mZklkIC0gVW5pcXVlIGxhdGVzdCBoYW5kb2ZmIGxlYXNlIGlkLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBjb21wbGV0ZWRBdE1zIC0gQ29tcGxldGlvbiB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBmYWlsZWRBdE1zIC0gRmFpbHVyZSB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBvcnBoYW5lZEF0TXMgLSBPcnBoYW5lZCB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSB3b3JrZXJJZCAtIFdvcmtlciBpZCBoYW5kbGluZyB0aGUgam9iLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBsYXN0RXJyb3IgLSBMYXN0IGZhaWx1cmUgbWVzc2FnZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gY29uY3VycmVuY3lLZXkgLSBEdXJhYmxlIGNvbmN1cnJlbmN5IGtleS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gbWF4Q29uY3VycmVuY3kgLSBEdXJhYmxlIHBlci1rZXkgY2FwLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSB0aW1lb3V0TXMgLSBQZXItam9iIHdhbGwtY2xvY2sgdGltZW91dCBvdmVycmlkZSwgb3IgbnVsbCB3aGVuIG9taXR0ZWQuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGNoaWxkUmVjZWl2ZWRBdE1zIC0gRXBvY2ggbXMgd2hlbiB0aGUgZXhlY3V0aW5nIHBvb2xlZCBjaGlsZCdzIGV2ZW50IGxvb3AgcHJvY2Vzc2VkIHRoZSBqb2IgbWVzc2FnZSwgb3IgbnVsbCB3aGVuIG5vIHJ1bm5lciBhY2NlcHRlZCBpdCB5ZXQuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGNoaWxkU3RhcnRlZEF0TXMgLSBFcG9jaCBtcyB3aGVuIHRoZSBqb2IncyBwZXJmb3JtIHN0YXJ0ZWQgaW4gdGhlIHBvb2xlZCBjaGlsZCwgb3IgbnVsbCB3aGVuIGl0IG5ldmVyIHN0YXJ0ZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGNoaWxkSW5zdGFuY2VJZCAtIFN0YWJsZSBpZGVudGl0eSBvZiB0aGUgcG9vbGVkIGNoaWxkIHByb2Nlc3MgdGhhdCBhY2NlcHRlZCB0aGUgam9iLCBvciBudWxsLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBjaGlsZFBpZCAtIE9TIHBpZCBvZiB0aGUgcG9vbGVkIGNoaWxkIHByb2Nlc3MgdGhhdCBhY2NlcHRlZCB0aGUgam9iLCBvciBudWxsLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBydW5uZXJIb3N0bmFtZSAtIEhvc3RuYW1lIHJlcG9ydGVkIGJ5IHRoZSBwb29sZWQgY2hpbGQgcHJvY2VzcyB0aGF0IGFjY2VwdGVkIHRoZSBqb2IsIG9yIG51bGwuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge1wicXVldWVkXCIgfCBcImhhbmRlZF9vZmZcIiB8IG51bGx9IEJhY2tncm91bmRKb2JSZXBsYWNlbWVudFByZXZpb3VzU3RhdHVzXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iSWQgLSBOZXdseSBxdWV1ZWQgam9iIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBwcmV2aW91c0pvYklkIC0gUHJldmlvdXMgYWN0aXZlIG93bmVyJ3Mgam9iIGlkLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iUmVwbGFjZW1lbnRQcmV2aW91c1N0YXR1c30gcHJldmlvdXNTdGF0dXMgLSBQcmV2aW91cyBvd25lcidzIG9ic2VydmVkIHN0YXRlLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtcImNhbmNlbGxlZFwiIHwgXCJoYW5kZWRfb2ZmXCIgfCBcIm5vdF9mb3VuZFwifSBCYWNrZ3JvdW5kSm9iQ2FuY2VsbGF0aW9uT3V0Y29tZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JDYW5jZWxsYXRpb25SZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gam9iSWQgLSBEZXRhY2hlZCBvd25lcidzIGpvYiBpZCwgd2hlbiBvbmUgd2FzIGFjdGl2ZS5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYkNhbmNlbGxhdGlvbk91dGNvbWV9IG91dGNvbWUgLSBUcnV0aGZ1bCBiZXN0LWVmZm9ydCBvdXRjb21lLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JTY2hlZHVsZWRMb29rdXBSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYlJvdyB8IG51bGx9IGN1cnJlbnRKb2IgLSBDdXJyZW50IHF1ZXVlZCBvciBoYW5kZWQtb2ZmIG93bmVyLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iUm93IHwgbnVsbH0gbGF0ZXN0VGVybWluYWxKb2IgLSBMYXRlc3QgdGVybWluYWwgaGlzdG9yeSB3aGVuIHJlcXVlc3RlZC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7XCJ3b2tlblwiIHwgXCJhbHJlYWR5X2R1ZVwiIHwgXCJoYW5kZWRfb2ZmXCIgfCBcIm5vdF9mb3VuZFwifSBCYWNrZ3JvdW5kSm9iV2FrZU91dGNvbWVcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iV2FrZVJlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBqb2JJZCAtIEN1cnJlbnQgb3duZXIncyBkdXJhYmxlIGpvYiBpZCwgd2hlbiBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYldha2VPdXRjb21lfSBvdXRjb21lIC0gRXhhY3Qgd2FrZSBvdXRjb21lLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JGYWlsdXJlRXZlbnRcbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYlJvd30gam9iIC0gVXBkYXRlZCBqb2Igcm93IGFmdGVyIGZhaWx1cmUgaGFuZGxpbmcuXG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBlcnJvciAtIEZhaWx1cmUgZXJyb3IuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGF0dGVtcHRzIC0gVXBkYXRlZCBmYWlsdXJlIGF0dGVtcHRzIGNvdW50LlxuICogQHByb3BlcnR5IHtib29sZWFufSB0ZXJtaW5hbCAtIFdoZXRoZXIgdGhpcyBmYWlsdXJlIGVuZGVkIHRoZSBqb2IuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpbGxSZXRyeSAtIFdoZXRoZXIgdGhlIGpvYiB3YXMgcmV0dXJuZWQgdG8gdGhlIHF1ZXVlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IGhhbmRvZmZJZCAtIEhhbmRvZmYgbGVhc2UgaWQgZnJvbSB0aGUgd29ya2VyIHJlcG9ydC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBoYW5kZWRPZmZBdE1zIC0gSGFuZG9mZiB0aW1lc3RhbXAgZnJvbSB0aGUgd29ya2VyIHJlcG9ydC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB3b3JrZXJJZCAtIFdvcmtlciBpZCBmcm9tIHRoZSB3b3JrZXIgcmVwb3J0LlxuICogQHByb3BlcnR5IHtQb29sZWRSdW5uZXJGYWlsdXJlIHwgdW5kZWZpbmVkfSBydW5uZXJGYWlsdXJlIC0gU2hhcmVkIHBvb2xlZC1jaGlsZCBwcm9jZXNzIGZhaWx1cmUgcHJvdmVuYW5jZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7XCJ3b3JrZXJcIiB8IFwiY2xpZW50XCIgfCBcInJlcG9ydGVyXCJ9IEJhY2tncm91bmRKb2JTb2NrZXRSb2xlXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge3t0eXBlOiBcImhlbGxvXCIsIHJvbGU6IEJhY2tncm91bmRKb2JTb2NrZXRSb2xlLCBnZW5lcmF0aW9uSWQ/OiBzdHJpbmcsIHN1cHBvcnRzSGFuZG9mZklkUmVwb3J0aW5nPzogYm9vbGVhbiwgc3VwcG9ydHNIZWFydGJlYXQ/OiBib29sZWFuLCBzdXBwb3J0c1Bvb2xlZD86IGJvb2xlYW4sIHdvcmtlcklkPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkhlbGxvTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImdlbmVyYXRpb24tYWNjZXB0ZWRcIiwgZ2VuZXJhdGlvbklkOiBzdHJpbmcsIGxpZmVjeWNsZVN0YXRlOiBCYWNrZ3JvdW5kSm9ic0dlbmVyYXRpb25MaWZlY3ljbGVTdGF0ZX19IEJhY2tncm91bmRKb2JHZW5lcmF0aW9uQWNjZXB0ZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZ2VuZXJhdGlvbi1yZWplY3RlZFwiLCByZWFzb246IEJhY2tncm91bmRKb2JzR2VuZXJhdGlvblJlamVjdGlvblJlYXNvbn19IEJhY2tncm91bmRKb2JHZW5lcmF0aW9uUmVqZWN0ZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwicmVhZHlcIiwgYWNjZXB0c0ZvcmtlZD86IGJvb2xlYW4sIGFjY2VwdHNJbmxpbmU/OiBib29sZWFuLCBhY2NlcHRzUG9vbGVkPzogYm9vbGVhbiwgYWNjZXB0c1NwYXduZWQ/OiBib29sZWFuLCBhdmFpbGFibGVQb29sZWRTbG90cz86IG51bWJlcn19IEJhY2tncm91bmRKb2JSZWFkeU1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJkcmFpbmluZ1wifX0gQmFja2dyb3VuZEpvYkRyYWluaW5nTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImhlYXJ0YmVhdFwiLCB3b3JrZXJJZD86IHN0cmluZ319IEJhY2tncm91bmRKb2JIZWFydGJlYXRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZW5xdWV1ZVwiLCBqb2JOYW1lOiBzdHJpbmcsIGFyZ3M/OiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG9wdGlvbnM/OiBCYWNrZ3JvdW5kSm9iT3B0aW9ucywgcHJvZHVjZXJJbnZvY2F0aW9uSWQ/OiBzdHJpbmcsIHByb2R1Y2VyUHJvb2Y/OiBCYWNrZ3JvdW5kSm9iUHJvZHVjZXJQcm9vZn19IEJhY2tncm91bmRKb2JFbnF1ZXVlTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImVucXVldWVkXCIsIGpvYklkOiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iRW5xdWV1ZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZW5xdWV1ZS1lcnJvclwiLCBlcnJvcj86IHN0cmluZ319IEJhY2tncm91bmRKb2JFbnF1ZXVlRXJyb3JNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwicmVwbGFjZS1zY2hlZHVsZWRcIiwgc2NoZWR1bGVLZXk6IHN0cmluZywgam9iTmFtZTogc3RyaW5nLCBhcmdzPzogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBvcHRpb25zPzogQmFja2dyb3VuZEpvYk9wdGlvbnN9fSBCYWNrZ3JvdW5kSm9iUmVwbGFjZVNjaGVkdWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzY2hlZHVsZS1yZXBsYWNlZFwiLCBqb2JJZDogc3RyaW5nLCBwcmV2aW91c0pvYklkOiBzdHJpbmcgfCBudWxsLCBwcmV2aW91c1N0YXR1czogQmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UHJldmlvdXNTdGF0dXN9fSBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVSZXBsYWNlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJyZXBsYWNlLXNjaGVkdWxlZC1lcnJvclwiLCBlcnJvcj86IHN0cmluZ319IEJhY2tncm91bmRKb2JSZXBsYWNlU2NoZWR1bGVkRXJyb3JNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiY2FuY2VsLXNjaGVkdWxlZFwiLCBzY2hlZHVsZUtleTogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkNhbmNlbFNjaGVkdWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzY2hlZHVsZS1jYW5jZWxsZWRcIiwgam9iSWQ6IHN0cmluZyB8IG51bGwsIG91dGNvbWU6IEJhY2tncm91bmRKb2JDYW5jZWxsYXRpb25PdXRjb21lfX0gQmFja2dyb3VuZEpvYlNjaGVkdWxlQ2FuY2VsbGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImNhbmNlbC1zY2hlZHVsZWQtZXJyb3JcIiwgZXJyb3I/OiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iQ2FuY2VsU2NoZWR1bGVkRXJyb3JNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZ2V0LXNjaGVkdWxlZC1qb2JcIiwgc2NoZWR1bGVLZXk6IHN0cmluZywgaW5jbHVkZUxhdGVzdFRlcm1pbmFsPzogYm9vbGVhbn19IEJhY2tncm91bmRKb2JHZXRTY2hlZHVsZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwic2NoZWR1bGVkLWpvYlwiLCBjdXJyZW50Sm9iOiBCYWNrZ3JvdW5kSm9iUm93IHwgbnVsbCwgbGF0ZXN0VGVybWluYWxKb2I6IEJhY2tncm91bmRKb2JSb3cgfCBudWxsfX0gQmFja2dyb3VuZEpvYlNjaGVkdWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJnZXQtc2NoZWR1bGVkLWpvYi1lcnJvclwiLCBlcnJvcj86IHN0cmluZ319IEJhY2tncm91bmRKb2JHZXRTY2hlZHVsZWRFcnJvck1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJ3YWtlLXNjaGVkdWxlZFwiLCBzY2hlZHVsZUtleTogc3RyaW5nfX0gQmFja2dyb3VuZEpvYldha2VTY2hlZHVsZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwic2NoZWR1bGUtd29rZW5cIiwgam9iSWQ6IHN0cmluZyB8IG51bGwsIG91dGNvbWU6IEJhY2tncm91bmRKb2JXYWtlT3V0Y29tZX19IEJhY2tncm91bmRKb2JTY2hlZHVsZVdva2VuTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcIndha2Utc2NoZWR1bGVkLWVycm9yXCIsIGVycm9yPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYldha2VTY2hlZHVsZWRFcnJvck1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2JcIiwgcGF5bG9hZDogQmFja2dyb3VuZEpvYlBheWxvYWR9fSBCYWNrZ3JvdW5kSm9iSm9iTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYi1hY2NlcHRlZFwiLCBqb2JJZDogc3RyaW5nLCBoYW5kb2ZmSWQ/OiBzdHJpbmcsIHdvcmtlcklkPzogc3RyaW5nLCBoYW5kZWRPZmZBdE1zPzogbnVtYmVyLCByZWNlaXZlZEF0TXM/OiBudW1iZXIsIHN0YXJ0ZWRBdE1zPzogbnVtYmVyLCBjaGlsZEluc3RhbmNlSWQ/OiBzdHJpbmcsIGNoaWxkUGlkPzogbnVtYmVyLCBydW5uZXJIb3N0bmFtZT86IHN0cmluZ319IEJhY2tncm91bmRKb2JBY2NlcHRlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2ItY29tcGxldGVcIiwgam9iSWQ6IHN0cmluZywgaGFuZG9mZklkPzogc3RyaW5nLCB3b3JrZXJJZD86IHN0cmluZywgaGFuZGVkT2ZmQXRNcz86IG51bWJlcn19IEJhY2tncm91bmRKb2JDb21wbGV0ZU1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2ItZmFpbGVkXCIsIGpvYklkOiBzdHJpbmcsIGVycm9yPzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGhhbmRvZmZJZD86IHN0cmluZywgd29ya2VySWQ/OiBzdHJpbmcsIGhhbmRlZE9mZkF0TXM/OiBudW1iZXIsIHJ1bm5lckZhaWx1cmU/OiBQb29sZWRSdW5uZXJGYWlsdXJlfX0gQmFja2dyb3VuZEpvYkZhaWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2ItcmVzY2hlZHVsZVwiLCBqb2JJZDogc3RyaW5nLCBkZWxheU1zOiBudW1iZXIsIGhhbmRvZmZJZD86IHN0cmluZywgd29ya2VySWQ/OiBzdHJpbmcsIGhhbmRlZE9mZkF0TXM/OiBudW1iZXJ9fSBCYWNrZ3JvdW5kSm9iUmVzY2hlZHVsZU1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2ItdXBkYXRlZFwiLCBqb2JJZDogc3RyaW5nfX0gQmFja2dyb3VuZEpvYlVwZGF0ZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiam9iLXVwZGF0ZS1lcnJvclwiLCBqb2JJZDogc3RyaW5nLCBlcnJvcj86IHN0cmluZ319IEJhY2tncm91bmRKb2JVcGRhdGVFcnJvck1lc3NhZ2VcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7QmFja2dyb3VuZEpvYkhlbGxvTWVzc2FnZSB8IEJhY2tncm91bmRKb2JHZW5lcmF0aW9uQWNjZXB0ZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkdlbmVyYXRpb25SZWplY3RlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iUmVhZHlNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkRyYWluaW5nTWVzc2FnZSB8IEJhY2tncm91bmRKb2JIZWFydGJlYXRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkVucXVldWVNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkVucXVldWVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JFbnF1ZXVlRXJyb3JNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlJlcGxhY2VTY2hlZHVsZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlNjaGVkdWxlUmVwbGFjZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlJlcGxhY2VTY2hlZHVsZWRFcnJvck1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iQ2FuY2VsU2NoZWR1bGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JTY2hlZHVsZUNhbmNlbGxlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iQ2FuY2VsU2NoZWR1bGVkRXJyb3JNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkdldFNjaGVkdWxlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JHZXRTY2hlZHVsZWRFcnJvck1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iV2FrZVNjaGVkdWxlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVXb2tlbk1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iV2FrZVNjaGVkdWxlZEVycm9yTWVzc2FnZSB8IEJhY2tncm91bmRKb2JKb2JNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkFjY2VwdGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JDb21wbGV0ZU1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iRmFpbGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JSZXNjaGVkdWxlTWVzc2FnZSB8IEJhY2tncm91bmRKb2JVcGRhdGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JVcGRhdGVFcnJvck1lc3NhZ2V9IEJhY2tncm91bmRKb2JTb2NrZXRNZXNzYWdlXG4gKi9cblxuZXhwb3J0IGNvbnN0IG5vdGhpbmcgPSB7fVxuIl19
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.713",
6
+ "version": "1.0.714",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -55,6 +55,17 @@ export default class VelociousJob {
55
55
  */
56
56
  static processTitle = undefined
57
57
 
58
+ /**
59
+ * Wall-clock bound this job class runs under, in ms. Set e.g.
60
+ * `static timeoutMs = 60 * 60 * 1000` on a job whose work legitimately takes
61
+ * hours so its type carries its own bound instead of relying on one global
62
+ * `backgroundJobs.jobTimeoutMs` tuned for the slowest job in the system. The
63
+ * `{timeoutMs}` enqueue option overrides it. A non-positive value disables the
64
+ * bound for this class. Left undefined, the worker-level value applies.
65
+ * @type {number | undefined}
66
+ */
67
+ static timeoutMs = undefined
68
+
58
69
  /**
59
70
  * Stops this performance and reschedules the same logical job row. This is
60
71
  * normal control flow: it does not count as a failure or consume a retry.
@@ -93,6 +104,25 @@ export default class VelociousJob {
93
104
  return merged
94
105
  }
95
106
 
107
+ /**
108
+ * Folds this job class's static `timeoutMs` into the enqueue options unless the
109
+ * caller already specified one, so a job type carries its own wall-clock bound
110
+ * instead of every job sharing one worker-level value. A class that declares
111
+ * nothing leaves the option absent, and the worker falls back to its own
112
+ * default — the prior behavior.
113
+ * @param {import("./types.js").BackgroundJobOptions | undefined} options - Job options.
114
+ * @returns {import("./types.js").BackgroundJobOptions} - Options including the resolved timeout.
115
+ */
116
+ static _withTimeout(options) {
117
+ const merged = options ? {...options} : {}
118
+
119
+ if (merged.timeoutMs === undefined && typeof this.timeoutMs === "number") {
120
+ merged.timeoutMs = this.timeoutMs
121
+ }
122
+
123
+ return merged
124
+ }
125
+
96
126
  /**
97
127
  * Resolves class-derived enqueue options on a hydrated job instance. Explicit
98
128
  * per-enqueue options take precedence over the instance concurrency key.
@@ -102,7 +132,7 @@ export default class VelociousJob {
102
132
  * @returns {import("./types.js").BackgroundJobOptions} - Resolved job options.
103
133
  */
104
134
  static _withJobContext({jobArgs, jobOptions}) {
105
- const options = this._withQueue(jobOptions)
135
+ const options = this._withTimeout(this._withQueue(jobOptions))
106
136
 
107
137
  if (options.concurrencyKey !== undefined) return options
108
138
 
@@ -175,7 +175,7 @@
175
175
  * @property {boolean} [deduplicateWhileQueued] - When true, skip the enqueue if an identical still-queued job (same job name, args and queue) is scheduled no later than this enqueue, returning the earliest matching job's id. A future retry does not suppress earlier work. Deduplication is independent of `concurrencyKey`, so the job keeps its normal (e.g. queue-derived) concurrency cap. Keeps an interval-scheduled recurring job (e.g. retention pruning) from piling up redundant queued rows when it runs slower than its interval or no worker is free.
176
176
  * @property {string} [idempotencyKey] - Durable enqueue identity scoped to the resolved job class name and queue. Exact replay returns the original job id across every state and after job pruning; reuse with different canonical arguments or behavior-affecting options fails. Ownership is independent of `deduplicateWhileQueued` and is retained until an explicit future retention policy removes it.
177
177
  * @property {number} [scheduledAtMs] - Epoch timestamp in milliseconds when the job becomes eligible for dispatch. Defaults to enqueue time.
178
- * @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
178
+ * @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides a job class's `static timeoutMs` and the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
179
179
  */
180
180
  /**
181
181
  * @typedef {object} BackgroundJobPayload