@pipeline-builder/api-core 4.1.22 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/errors/app-errors.d.ts +4 -2
- package/lib/errors/app-errors.js +6 -4
- package/lib/helpers/content-disposition.d.ts +14 -0
- package/lib/helpers/content-disposition.js +22 -0
- package/lib/helpers/index.d.ts +1 -0
- package/lib/helpers/index.js +2 -1
- package/lib/middleware/assurance.js +2 -2
- package/lib/middleware/auth.js +7 -7
- package/lib/middleware/ecosystem-guard.js +3 -3
- package/lib/middleware/permission-gates.js +3 -3
- package/lib/middleware/service-tokens.js +2 -2
- package/lib/middleware/step-up.js +2 -2
- package/lib/services/api-key-exchange.js +2 -2
- package/lib/services/compliance-client.js +2 -2
- package/lib/services/durable-event-bus.js +3 -1
- package/lib/services/index.d.ts +1 -1
- package/lib/services/index.js +2 -2
- package/lib/services/jwks-cache.js +2 -2
- package/lib/services/leader-lock.d.ts +56 -3
- package/lib/services/leader-lock.js +60 -4
- package/lib/services/quota.js +2 -2
- package/lib/services/scheduler.d.ts +20 -4
- package/lib/services/scheduler.js +36 -6
- package/lib/services/service-keys.d.ts +0 -4
- package/lib/services/service-keys.js +1 -14
- package/lib/types/catalog-metadata.d.ts +0 -6
- package/lib/types/catalog-metadata.js +1 -1
- package/lib/types/ecosystem.d.ts +0 -1
- package/lib/types/ecosystem.js +1 -1
- package/lib/types/feature-flags.d.ts +1 -1
- package/lib/types/feature-flags.js +6 -1
- package/lib/types/index.d.ts +3 -2
- package/lib/types/index.js +3 -2
- package/lib/types/permissions.d.ts +16 -1
- package/lib/types/permissions.js +23 -2
- package/lib/types/plugin-scan.d.ts +26 -0
- package/lib/types/plugin-scan.js +1 -1
- package/lib/types/remote-audit-actions.d.ts +1 -1
- package/lib/types/remote-audit-actions.js +35 -1
- package/lib/types/reserved-tags.d.ts +28 -0
- package/lib/types/reserved-tags.js +37 -0
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +2 -2
- package/lib/utils/params.d.ts +33 -1
- package/lib/utils/params.js +54 -2
- package/lib/utils/response.js +2 -2
- package/lib/utils/secret-encryption.d.ts +0 -2
- package/lib/utils/secret-encryption.js +1 -5
- package/lib/validation/message-schemas.d.ts +0 -7
- package/lib/validation/message-schemas.js +3 -2
- package/lib/validation/pipeline-schemas.d.ts +6 -0
- package/lib/validation/pipeline-schemas.js +32 -2
- package/lib/validation/plugin-catalog-detect.d.ts +1 -1
- package/lib/validation/plugin-catalog-detect.js +2 -2
- package/lib/validation/plugin-spec-schema.js +2 -2
- package/package.json +2 -4
|
@@ -35,6 +35,35 @@ const RELEASE_IF_OWNER = 'if redis.call("get", KEYS[1]) == ARGV[1] then return r
|
|
|
35
35
|
const EXTEND_IF_OWNER = 'if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("pexpire", KEYS[1], ARGV[2]) else return 0 end';
|
|
36
36
|
/** Longest a run waits for a not-yet-connected client before skipping the window. */
|
|
37
37
|
const LOCK_READY_TIMEOUT_MS = 10_000;
|
|
38
|
+
/**
|
|
39
|
+
* Default lock lifetime — a CRASH-RECOVERY window, not a run-duration cover.
|
|
40
|
+
*
|
|
41
|
+
* The holder heartbeats (compare-and-PEXPIRE every `ttlMs / 3`) for as long as
|
|
42
|
+
* `fn` runs, so a six-hour job holds a two-minute lock perfectly well. What the
|
|
43
|
+
* TTL actually decides is how long a job stays BLOCKED after the pod holding it
|
|
44
|
+
* dies without releasing — the key simply sits there until it expires. Sizing the
|
|
45
|
+
* TTL to the expected run time (which is what several callers used to do) turned a
|
|
46
|
+
* crashed pod into hours of silent inactivity.
|
|
47
|
+
*
|
|
48
|
+
* Two minutes leaves three missed heartbeats of slack, so an event-loop stall or a
|
|
49
|
+
* brief Redis blip does not hand the lock to a second pod mid-run, while recovery
|
|
50
|
+
* after a real crash is bounded at two minutes.
|
|
51
|
+
*/
|
|
52
|
+
export const DEFAULT_LEADER_LOCK_TTL_MS = 120_000;
|
|
53
|
+
/**
|
|
54
|
+
* The one way to build a leader-lock key: `<service>:<job>:leader`.
|
|
55
|
+
*
|
|
56
|
+
* Four conventions had grown up — `plugin:vuln-rescan:leader`,
|
|
57
|
+
* `platform:leader:org-purge`, a bare `ecosystem-stats:leader`, and billing's
|
|
58
|
+
* unnamespaced `subscription-lifecycle` — which meant no single glob found every
|
|
59
|
+
* lock. `KEYS '*:leader'` missed billing's three entirely, so an operator asking
|
|
60
|
+
* "what is held right now" got a partial answer. The env Redis client sets no
|
|
61
|
+
* `keyPrefix`, so these share one flat keyspace with cache, BullMQ and spool keys;
|
|
62
|
+
* the `<service>:` segment is what keeps them apart.
|
|
63
|
+
*/
|
|
64
|
+
export function leaderLockKey(service, job) {
|
|
65
|
+
return `${service}:${job}:leader`;
|
|
66
|
+
}
|
|
38
67
|
/**
|
|
39
68
|
* Run `fn` only if this process wins a short-lived distributed lock — the
|
|
40
69
|
* across-pods "single runner" guard for periodic jobs (digest flushes, etc.).
|
|
@@ -50,10 +79,23 @@ const LOCK_READY_TIMEOUT_MS = 10_000;
|
|
|
50
79
|
* If Redis can't be reached the run is skipped (returns false) rather than
|
|
51
80
|
* rejecting — callers are timers, and a Redis blip must not crash the process.
|
|
52
81
|
*
|
|
82
|
+
* EVERY outcome is counted, because they mean very different things and the
|
|
83
|
+
* difference used to be visible only in a log line:
|
|
84
|
+
* - `leader_lock_acquired_total` — this pod ran the window. A job whose count
|
|
85
|
+
* stays flat is not running ANYWHERE, which is the condition worth alerting on.
|
|
86
|
+
* - `leader_lock_contended_total` — another pod holds it. Healthy and expected
|
|
87
|
+
* with replicas > 1; exactly one acquire per window across the fleet.
|
|
88
|
+
* - `leader_lock_unavailable_total` — Redis unreachable, so NOBODY ran this
|
|
89
|
+
* window. A Redis blip silently stopping every sweep fleet-wide was previously
|
|
90
|
+
* a WARN log and nothing else.
|
|
91
|
+
*
|
|
53
92
|
* @returns true if we held the lock and ran `fn`; false if another holder did or
|
|
54
93
|
* the lock couldn't be taken.
|
|
55
94
|
*/
|
|
56
|
-
export async function withLeaderLock(redis, key, ttlMs, fn) {
|
|
95
|
+
export async function withLeaderLock(redis, key, ttlMs, fn, opts = {}) {
|
|
96
|
+
// Asked to stop before we even tried: don't take a lock we are about to drop.
|
|
97
|
+
if (opts.signal?.aborted)
|
|
98
|
+
return false;
|
|
57
99
|
const token = randomUUID();
|
|
58
100
|
let acquired;
|
|
59
101
|
try {
|
|
@@ -70,11 +112,24 @@ export async function withLeaderLock(redis, key, ttlMs, fn) {
|
|
|
70
112
|
lockLogger.warn('Leader lock unavailable; skipping this run', {
|
|
71
113
|
key, error: errorMessage(err),
|
|
72
114
|
});
|
|
115
|
+
emitCounter('leader_lock_unavailable_total', { key });
|
|
73
116
|
return false;
|
|
74
117
|
}
|
|
75
|
-
if (acquired !== 'OK')
|
|
118
|
+
if (acquired !== 'OK') {
|
|
119
|
+
emitCounter('leader_lock_contended_total', { key });
|
|
76
120
|
return false;
|
|
121
|
+
}
|
|
122
|
+
emitCounter('leader_lock_acquired_total', { key });
|
|
77
123
|
const lost = new AbortController();
|
|
124
|
+
// Shutdown is merged into the SAME signal a lock loss uses: from `fn`'s point of
|
|
125
|
+
// view both mean "stop between units of work and return". `signal.reason` says
|
|
126
|
+
// which. Registered with `once` so a long-lived caller signal doesn't retain
|
|
127
|
+
// this controller after the run.
|
|
128
|
+
const onExternalAbort = () => {
|
|
129
|
+
if (!lost.signal.aborted)
|
|
130
|
+
lost.abort('shutdown');
|
|
131
|
+
};
|
|
132
|
+
opts.signal?.addEventListener('abort', onExternalAbort, { once: true });
|
|
78
133
|
let heartbeat;
|
|
79
134
|
if (typeof redis.eval === 'function') {
|
|
80
135
|
const evalFn = redis.eval.bind(redis);
|
|
@@ -83,7 +138,7 @@ export async function withLeaderLock(redis, key, ttlMs, fn) {
|
|
|
83
138
|
if (Number(extended) !== 1 && !lost.signal.aborted) {
|
|
84
139
|
lockLogger.warn('Leader lock lost mid-run (another holder, or the key expired)', { key });
|
|
85
140
|
emitCounter('leader_lock_lost_total', { key });
|
|
86
|
-
lost.abort();
|
|
141
|
+
lost.abort('lock-lost');
|
|
87
142
|
}
|
|
88
143
|
}).catch((err) => {
|
|
89
144
|
// A blip: the next beat retries; the TTL still covers this interval.
|
|
@@ -98,6 +153,7 @@ export async function withLeaderLock(redis, key, ttlMs, fn) {
|
|
|
98
153
|
finally {
|
|
99
154
|
if (heartbeat)
|
|
100
155
|
clearInterval(heartbeat);
|
|
156
|
+
opts.signal?.removeEventListener('abort', onExternalAbort);
|
|
101
157
|
// Release only if the lock is still ours — if our run overran the TTL and
|
|
102
158
|
// another holder took over, releasing here would free their lock early.
|
|
103
159
|
// Prefer an atomic CAS (Lua); fall back to get-then-del for clients without
|
|
@@ -153,4 +209,4 @@ export async function releaseSharedEnvLock() {
|
|
|
153
209
|
sharedLock = undefined;
|
|
154
210
|
await closeLeaderLock(client);
|
|
155
211
|
}
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVhZGVyLWxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvbGVhZGVyLWxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFcEQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBb0IvQzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsS0FBbUM7SUFDdkUsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBQ25CLElBQUksQ0FBQztRQUNILElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsNkJBQTZCO0lBQy9CLENBQUM7SUFDRCxJQUFJLENBQUM7UUFBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztJQUFDLENBQUM7SUFBQyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDtpRUFDaUU7QUFDakUsTUFBTSxnQkFBZ0IsR0FDcEIsbUdBQW1HLENBQUM7QUFFdEcsOERBQThEO0FBQzlELE1BQU0sZUFBZSxHQUNuQixnSEFBZ0gsQ0FBQztBQUVuSCxxRkFBcUY7QUFDckYs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LGVBQWUsR0FBRyxDQUFDO1FBQUUsT0FBTztJQUNoQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUM7SUFDMUIsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUN2QixNQUFNLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQsIHdoZW5SZWRpc1JlYWR5LCB0eXBlIFJlYWR5QXdhcmVSZWRpcyB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuY29uc3QgbG9ja0xvZ2dlciA9IGNyZWF0ZUxvZ2dlcignbGVhZGVyLWxvY2snKTtcblxuLyoqXG4gKiBNaW5pbWFsIFJlZGlzIGNsaWVudCBzdXJmYWNlIG5lZWRlZCBmb3IgYSBsZWFkZXIgbG9jayAoYSBzdWJzZXQgb2YgaW9yZWRpcykuXG4gKiBgc2V0YCBpcyB2YXJpYWRpYyBzbyBjYWxsZXJzIGNhbiBwYXNzIGAnUFgnLCB0dGwsICdOWCdgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2tSZWRpcyBleHRlbmRzIFJlYWR5QXdhcmVSZWRpcyB7XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgZGVsKC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICAvKiogT3B0aW9uYWwgTHVhIGV2YWwgKGlvcmVkaXMgaGFzIGl0KS4gV2hlbiBwcmVzZW50LCByZWxlYXNlIHVzZXMgYW4gYXRvbWljXG4gICAqICBjb21wYXJlLWFuZC1kZWxldGUgc28gYSBsYXBzZWQgaG9sZGVyIGNhbid0IGZyZWUgYSBzdWNjZXNzb3IncyBsb2NrLiAqL1xuICBldmFsPyhzY3JpcHQ6IHN0cmluZywgbnVtS2V5czogbnVtYmVyLCAuLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+O1xuICAvKiogR3JhY2VmdWwgY2xvc2UgKGlvcmVkaXMgYHF1aXRgKSDigJQgY2FsbGVkIG9uIHNodXRkb3duIHNvIHRoZSBjb25uZWN0aW9uXG4gICAqICBkb2Vzbid0IGtlZXAgdGhlIGV2ZW50IGxvb3AgYWxpdmUuICovXG4gIHF1aXQ/KCk6IFByb21pc2U8dW5rbm93bj47XG4gIC8qKiBJbW1lZGlhdGUgY2xvc2UgKGlvcmVkaXMgYGRpc2Nvbm5lY3RgKSDigJQgdGhlIGZhbGxiYWNrIGlmIGBxdWl0YCBmYWlscy4gKi9cbiAgZGlzY29ubmVjdD8oKTogdm9pZDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBjbG9zZSBvZiBhIGxlYWRlci1sb2NrIFJlZGlzIGNsaWVudCBvbiBzaHV0ZG93bi4gUHJlZmVycyBncmFjZWZ1bFxuICogYHF1aXRgOyBmYWxscyBiYWNrIHRvIGBkaXNjb25uZWN0YC4gTm8tb3AgZm9yIGEgbnVsbCBjbGllbnQgLyBvbmUgd2l0aG91dFxuICogZWl0aGVyIG1ldGhvZC4gTmV2ZXIgdGhyb3dzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvc2VMZWFkZXJMb2NrKHJlZGlzOiBMb2NrUmVkaXMgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcmVkaXMpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIHJlZGlzLnF1aXQgPT09ICdmdW5jdGlvbicpIHsgYXdhaXQgcmVkaXMucXVpdCgpOyByZXR1cm47IH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoIHRvIGRpc2Nvbm5lY3RcbiAgfVxuICB0cnkgeyByZWRpcy5kaXNjb25uZWN0Py4oKTsgfSBjYXRjaCB7IC8qIGJlc3QtZWZmb3J0ICovIH1cbn1cblxuLyoqIEF0b21pYyBcImRlbGV0ZSBvbmx5IGlmIEkgc3RpbGwgb3duIGl0XCIg4oCUIGNsb3NlcyB0aGUgZ2V0LXRoZW4tZGVsIHJhY2Ugd2hlcmVcbiAqICB0aGUgbG9jayBleHBpcmVzIGFuZCBpcyByZS1hY3F1aXJlZCBiZXR3ZWVuIHRoZSB0d28gY2FsbHMuICovXG5jb25zdCBSRUxFQVNFX0lGX09XTkVSID1cbiAgJ2lmIHJlZGlzLmNhbGwoXCJnZXRcIiwgS0VZU1sxXSkgPT0gQVJHVlsxXSB0aGVuIHJldHVybiByZWRpcy5jYWxsKFwiZGVsXCIsIEtFWVNbMV0pIGVsc2UgcmV0dXJuIDAgZW5kJztcblxuLyoqIEF0b21pYyBcImV4dGVuZCBvbmx5IGlmIEkgc3RpbGwgb3duIGl0XCIg4oCUIHRoZSBoZWFydGJlYXQuICovXG5jb25zdCBFWFRFTkRfSUZfT1dORVIgPVxuICAnaWYgcmVkaXMuY2FsbChcImdldFwiLCBLRVlTWzFdKSA9PSBBUkdWWzFdIHRoZW4gcmV0dXJuIHJlZGlzLmNhbGwoXCJwZXhwaXJlXCIsIEtFWVNbMV0sIEFSR1ZbMl0pIGVsc2UgcmV0dXJuIDAgZW5kJztcblxuLyoqIExvbmdlc3QgYSBydW4gd2FpdHMgZm9yIGEgbm90LXlldC1jb25uZWN0ZWQgY2xpZW50IGJlZm9yZSBza2lwcGluZyB0aGUgd2luZG93LiAqL1xuY29uc3QgTE9DS19SRUFEWV9USU1FT1VUX01TID0gMTBfMDAwO1xuXG4vKiogV2hhdCBhIGxlYWRlci1sb2NrZWQgcnVuIGlzIHRvbGQgd2hpbGUgaXQgcnVucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGVhZGVyTG9ja1J1biB7XG4gIC8qKlxuICAgKiBBYm9ydGVkIHdoZW4gdGhlIGxvY2sgaXMgTE9TVCBtaWQtcnVuIChhIGhlYXJ0YmVhdCBmb3VuZCBhbm90aGVyIGhvbGRlciwgb3JcbiAgICogdGhlIGtleSBnb25lKS4gTG9uZyBydW5zIHNob3VsZCBjaGVjayBpdCBiZXR3ZWVuIHVuaXRzIG9mIHdvcmsgYW5kIHN0b3Ag4oCUXG4gICAqIHBhc3QgdGhhdCBwb2ludCBhbm90aGVyIHBvZCBtYXkgYmUgZG9pbmcgdGhlIHNhbWUgd29yay5cbiAgICovXG4gIHNpZ25hbDogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogUnVuIGBmbmAgb25seSBpZiB0aGlzIHByb2Nlc3Mgd2lucyBhIHNob3J0LWxpdmVkIGRpc3RyaWJ1dGVkIGxvY2sg4oCUIHRoZVxuICogYWNyb3NzLXBvZHMgXCJzaW5nbGUgcnVubmVyXCIgZ3VhcmQgZm9yIHBlcmlvZGljIGpvYnMgKGRpZ2VzdCBmbHVzaGVzLCBldGMuKS5cbiAqXG4gKiBVc2VzIGBTRVQga2V5IHRva2VuIE5YIFBYIHR0bGAsIHNvIGV4YWN0bHkgb25lIGhvbGRlciBydW5zIHBlciB3aW5kb3cgYW5kIHRoZVxuICogbG9jayBhdXRvLWV4cGlyZXMgaWYgdGhhdCBob2xkZXIgZGllcyBtaWQtcnVuIChubyBzdHVjayBsb2NrKS4gV2hpbGUgYGZuYFxuICogcnVucywgdGhlIGhvbGRlciBIRUFSVEJFQVRTIChjb21wYXJlLWFuZC1QRVhQSVJFIGV2ZXJ5IGB0dGxNcyAvIDNgKSwgc28gYSBydW5cbiAqIHRoYXQgb3V0bGFzdHMgYHR0bE1zYCBrZWVwcyB0aGUgbG9jayBpbnN0ZWFkIG9mIHNpbGVudGx5IGxldHRpbmcgYSBzZWNvbmQgcG9kXG4gKiBzdGFydCB0aGUgc2FtZSB3b3JrOyBhIGhlYXJ0YmVhdCB0aGF0IGZpbmRzIHRoZSBsb2NrIGdvbmUgYWJvcnRzXG4gKiBgcnVuLnNpZ25hbGAuIFRoZSBsb2NrIGlzIHJlbGVhc2VkIG9uIGNvbXBsZXRpb24sIGJ1dCBvbmx5IGlmIHdlIHN0aWxsIG93blxuICogaXQg4oCUIGEgc2xvd2VyIHByZWRlY2Vzc29yIG5ldmVyIGRlbGV0ZXMgYSBzdWNjZXNzb3IncyBsb2NrLlxuICpcbiAqIElmIFJlZGlzIGNhbid0IGJlIHJlYWNoZWQgdGhlIHJ1biBpcyBza2lwcGVkIChyZXR1cm5zIGZhbHNlKSByYXRoZXIgdGhhblxuICogcmVqZWN0aW5nIOKAlCBjYWxsZXJzIGFyZSB0aW1lcnMsIGFuZCBhIFJlZGlzIGJsaXAgbXVzdCBub3QgY3Jhc2ggdGhlIHByb2Nlc3MuXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiB3ZSBoZWxkIHRoZSBsb2NrIGFuZCByYW4gYGZuYDsgZmFsc2UgaWYgYW5vdGhlciBob2xkZXIgZGlkIG9yXG4gKiAgIHRoZSBsb2NrIGNvdWxkbid0IGJlIHRha2VuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aExlYWRlckxvY2soXG4gIHJlZGlzOiBMb2NrUmVkaXMsXG4gIGtleTogc3RyaW5nLFxuICB0dGxNczogbnVtYmVyLFxuICBmbjogKHJ1bjogTGVhZGVyTG9ja1J1bikgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB0b2tlbiA9IHJhbmRvbVVVSUQoKTtcbiAgbGV0IGFjcXVpcmVkOiB1bmtub3duO1xuICB0cnkge1xuICAgIC8vIFRoZSBlbnYgY2xpZW50IGhhcyBubyBvZmZsaW5lIHF1ZXVlOiBhIFNFVCBiZWZvcmUgdGhlIGZpcnN0IGNvbm5lY3Rpb25cbiAgICAvLyBjb21wbGV0ZXMgaXMgcmVqZWN0ZWQsIHdoaWNoIG1hZGUgdGhlIEZJUlNUIHRpY2sgYWZ0ZXIgZXZlcnkgYm9vdCBhXG4gICAgLy8gZ3VhcmFudGVlZCBza2lwLiBXYWl0IChib3VuZGVkKSBmb3IgcmVhZGluZXNzIGZpcnN0LlxuICAgIGF3YWl0IHdoZW5SZWRpc1JlYWR5KHJlZGlzLCBNYXRoLm1pbihMT0NLX1JFQURZX1RJTUVPVVRfTVMsIE1hdGgubWF4KDEsIHR0bE1zKSkpO1xuICAgIGFjcXVpcmVkID0gYXdhaXQgcmVkaXMuc2V0KGtleSwgdG9rZW4sICdQWCcsIHR0bE1zLCAnTlgnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gUmVkaXMgdW5yZWFjaGFibGUgKGluY2x1ZGluZyBiZWZvcmUgdGhlIGZpcnN0IGNvbm5lY3Rpb24gY29tcGxldGVzKTogbm9cbiAgICAvLyBwb2QgY2FuIHByb3ZlIGl0J3MgdGhlIGxlYWRlciwgc28gbm9ib2R5IHJ1bnMgdGhpcyB3aW5kb3cuIFNraXBwaW5nIGlzXG4gICAgLy8gdGhlIHNhZmUgc2lkZSDigJQgcnVubmluZyBoZXJlIGNvdWxkIGR1cGxpY2F0ZSBkZXN0cnVjdGl2ZSB3b3JrIGFjcm9zcyBwb2RzLlxuICAgIGxvY2tMb2dnZXIud2FybignTGVhZGVyIGxvY2sgdW5hdmFpbGFibGU7IHNraXBwaW5nIHRoaXMgcnVuJywge1xuICAgICAga2V5LCBlcnJvcjogZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhY3F1aXJlZCAhPT0gJ09LJykgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvc3QgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGxldCBoZWFydGJlYXQ6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIHJlZGlzLmV2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBldmFsRm4gPSByZWRpcy5ldmFsLmJpbmQocmVkaXMpO1xuICAgIGhlYXJ0YmVhdCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGV2YWxGbihFWFRFTkRfSUZfT1dORVIsIDEsIGtleSwgdG9rZW4sIHR0bE1zKS50aGVuKChleHRlbmRlZCkgPT4ge1xuICAgICAgICBpZiAoTnVtYmVyKGV4dGVuZGVkKSAhPT0gMSAmJiAhbG9zdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGxvY2tMb2dnZXIud2FybignTGVhZGVyIGxvY2sgbG9zdCBtaWQtcnVuIChhbm90aGVyIGhvbGRlciwgb3IgdGhlIGtleSBleHBpcmVkKScsIHsga2V5IH0pO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdsZWFkZXJfbG9ja19sb3N0X3RvdGFsJywgeyBrZXkgfSk7XG4gICAgICAgICAgbG9zdC5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIC8vIEEgYmxpcDogdGhlIG5leHQgYmVhdCByZXRyaWVzOyB0aGUgVFRMIHN0aWxsIGNvdmVycyB0aGlzIGludGVydmFsLlxuICAgICAgICBsb2NrTG9nZ2VyLmRlYnVnKCdMZWFkZXIgbG9jayBoZWFydGJlYXQgZmFpbGVkJywgeyBrZXksIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgIH0pO1xuICAgIH0sIE1hdGgubWF4KDEsIE1hdGguZmxvb3IodHRsTXMgLyAzKSkpO1xuICAgIGhlYXJ0YmVhdC51bnJlZj8uKCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGZuKHsgc2lnbmFsOiBsb3N0LnNpZ25hbCB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoaGVhcnRiZWF0KSBjbGVhckludGVydmFsKGhlYXJ0YmVhdCk7XG4gICAgLy8gUmVsZWFzZSBvbmx5IGlmIHRoZSBsb2NrIGlzIHN0aWxsIG91cnMg4oCUIGlmIG91ciBydW4gb3ZlcnJhbiB0aGUgVFRMIGFuZFxuICAgIC8vIGFub3RoZXIgaG9sZGVyIHRvb2sgb3ZlciwgcmVsZWFzaW5nIGhlcmUgd291bGQgZnJlZSB0aGVpciBsb2NrIGVhcmx5LlxuICAgIC8vIFByZWZlciBhbiBhdG9taWMgQ0FTIChMdWEpOyBmYWxsIGJhY2sgdG8gZ2V0LXRoZW4tZGVsIGZvciBjbGllbnRzIHdpdGhvdXRcbiAgICAvLyBldmFsICh0aGUgc21hbGwgbm9uLWF0b21pYyB3aW5kb3cgaXMgVFRMLWJvdW5kZWQpLlxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHJlZGlzLmV2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXdhaXQgcmVkaXMuZXZhbChSRUxFQVNFX0lGX09XTkVSLCAxLCBrZXksIHRva2VuKTtcbiAgICAgIH0gZWxzZSBpZiAoKGF3YWl0IHJlZGlzLmdldChrZXkpKSA9PT0gdG9rZW4pIHtcbiAgICAgICAgYXdhaXQgcmVkaXMuZGVsKGtleSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0LWVmZm9ydDogdGhlIFRUTCBleHBpcmVzIHRoZSBsb2NrIHJlZ2FyZGxlc3MuXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEEgYExvY2tSZWRpc2AgYmFja2VkIGJ5IHRoZSBzaGFyZWQgZW52IFJlZGlzIGNsaWVudCAoc2VlIGVudi1yZWRpcy50cykg4oCUIHRoZSBsZWFkZXItbG9jayBjb3VudGVycGFydCB0byBgY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sYCAvXG4gKiBgY3JlYXRlRW52UmVkaXNUb2tlblJldm9jYXRpb25TdG9yZWAsIGZvciBhIHNlcnZpY2UgdGhhdCBoYXMgbm8gQnVsbE1RIGNsaWVudCB0b1xuICogYm9ycm93LiBSZXR1cm5zIGBudWxsYCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQsIHNvIGEgY2FsbGVyIGNhbiBkZWdyYWRlIHRvXG4gKiBydW5uaW5nIG9uIGV2ZXJ5IHBvZCAodGhlIGF0b21pYyBndWFyZHMgaXQgd3JhcHMgbXVzdCBzdGlsbCBtYWtlIHRoYXQgc2FmZSkuXG4gKiBUaGUgY2xpZW50IGlzIGEgcmVhbCBpb3JlZGlzIGluc3RhbmNlOyBpb3JlZGlzIGV4cG9zZXMgYHNldGAvYGdldGAvYGRlbGAvYGV2YWxgLFxuICogc2F0aXNmeWluZyBgTG9ja1JlZGlzYCBpbmNsdWRpbmcgdGhlIGF0b21pYyBDQVMgcmVsZWFzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudlJlZGlzTG9jaygpOiBMb2NrUmVkaXMgfCBudWxsIHtcbiAgY29uc3QgaW5zdCA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PExvY2tSZWRpcz4oJ2xlYWRlci1sb2NrJyk7XG4gIGlmIChpbnN0KSBsb2NrTG9nZ2VyLmluZm8oJ1JlZGlzIGxlYWRlci1sb2NrIGNsaWVudCBpbml0aWFsaXplZCcpO1xuICByZXR1cm4gaW5zdDtcbn1cblxuLy8gT25lIGVudi1jb25maWd1cmVkIGxvY2sgY2xpZW50IHBlciBwcm9jZXNzLCBzaGFyZWQgYnkgZXZlcnkgc2NoZWR1bGVyIHRoYXRcbi8vIGFza3MgZm9yIGEgbG9jayB3aXRob3V0IHN1cHBseWluZyBpdHMgb3duIGNsaWVudC4gUmVmZXJlbmNlLWNvdW50ZWQgc28gdGhlXG4vLyBjb25uZWN0aW9uIGlzIGNsb3NlZCB3aGVuIHRoZSBsYXN0IHN1Y2ggc2NoZWR1bGVyIHN0b3BzLlxubGV0IHNoYXJlZExvY2s6IExvY2tSZWRpcyB8IG51bGwgfCB1bmRlZmluZWQ7XG5sZXQgc2hhcmVkTG9ja1VzZXJzID0gMDtcblxuLyoqIFRha2UgYSByZWZlcmVuY2Ugb24gdGhlIHNoYXJlZCBlbnYgbG9jayBjbGllbnQgKGBudWxsYCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjcXVpcmVTaGFyZWRFbnZMb2NrKCk6IExvY2tSZWRpcyB8IG51bGwge1xuICBpZiAoc2hhcmVkTG9jayA9PT0gdW5kZWZpbmVkKSBzaGFyZWRMb2NrID0gY3JlYXRlRW52UmVkaXNMb2NrKCk7XG4gIHNoYXJlZExvY2tVc2VycysrO1xuICByZXR1cm4gc2hhcmVkTG9jaztcbn1cblxuLyoqIERyb3AgYSByZWZlcmVuY2UgdGFrZW4gYnkge0BsaW5rIGFjcXVpcmVTaGFyZWRFbnZMb2NrfTsgdGhlIGxhc3Qgb25lIGNsb3NlcyB0aGUgY2xpZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VTaGFyZWRFbnZMb2NrKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc2hhcmVkTG9ja1VzZXJzID09PSAwKSByZXR1cm47XG4gIHNoYXJlZExvY2tVc2Vycy0tO1xuICBpZiAoc2hhcmVkTG9ja1VzZXJzID4gMCkgcmV0dXJuO1xuICBjb25zdCBjbGllbnQgPSBzaGFyZWRMb2NrO1xuICBzaGFyZWRMb2NrID0gdW5kZWZpbmVkO1xuICBhd2FpdCBjbG9zZUxlYWRlckxvY2soY2xpZW50KTtcbn1cbiJdfQ==
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVhZGVyLWxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvbGVhZGVyLWxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFcEQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBb0IvQzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsS0FBbUM7SUFDdkUsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBQ25CLElBQUksQ0FBQztRQUNILElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsNkJBQTZCO0lBQy9CLENBQUM7SUFDRCxJQUFJLENBQUM7UUFBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztJQUFDLENBQUM7SUFBQyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDtpRUFDaUU7QUFDakUsTUFBTSxnQkFBZ0IsR0FDcEIsbUdBQW1HLENBQUM7QUFFdEcsOERBQThEO0FBQzlELE1BQU0sZUFBZSxHQUNuQixnSEFBZ0gsQ0FBQztBQUVuSCxxRkFBcUY7QUFDckYs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QUFlLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQ2xpZW50LCB3aGVuUmVkaXNSZWFkeSwgdHlwZSBSZWFkeUF3YXJlUmVkaXMgfSBmcm9tICcuL2Vudi1yZWRpcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvY2tMb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2xlYWRlci1sb2NrJyk7XG5cbi8qKlxuICogTWluaW1hbCBSZWRpcyBjbGllbnQgc3VyZmFjZSBuZWVkZWQgZm9yIGEgbGVhZGVyIGxvY2sgKGEgc3Vic2V0IG9mIGlvcmVkaXMpLlxuICogYHNldGAgaXMgdmFyaWFkaWMgc28gY2FsbGVycyBjYW4gcGFzcyBgJ1BYJywgdHRsLCAnTlgnYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NrUmVkaXMgZXh0ZW5kcyBSZWFkeUF3YXJlUmVkaXMge1xuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj47XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIGRlbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIE9wdGlvbmFsIEx1YSBldmFsIChpb3JlZGlzIGhhcyBpdCkuIFdoZW4gcHJlc2VudCwgcmVsZWFzZSB1c2VzIGFuIGF0b21pY1xuICAgKiAgY29tcGFyZS1hbmQtZGVsZXRlIHNvIGEgbGFwc2VkIGhvbGRlciBjYW4ndCBmcmVlIGEgc3VjY2Vzc29yJ3MgbG9jay4gKi9cbiAgZXZhbD8oc2NyaXB0OiBzdHJpbmcsIG51bUtleXM6IG51bWJlciwgLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgLyoqIEdyYWNlZnVsIGNsb3NlIChpb3JlZGlzIGBxdWl0YCkg4oCUIGNhbGxlZCBvbiBzaHV0ZG93biBzbyB0aGUgY29ubmVjdGlvblxuICAgKiAgZG9lc24ndCBrZWVwIHRoZSBldmVudCBsb29wIGFsaXZlLiAqL1xuICBxdWl0PygpOiBQcm9taXNlPHVua25vd24+O1xuICAvKiogSW1tZWRpYXRlIGNsb3NlIChpb3JlZGlzIGBkaXNjb25uZWN0YCkg4oCUIHRoZSBmYWxsYmFjayBpZiBgcXVpdGAgZmFpbHMuICovXG4gIGRpc2Nvbm5lY3Q/KCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgY2xvc2Ugb2YgYSBsZWFkZXItbG9jayBSZWRpcyBjbGllbnQgb24gc2h1dGRvd24uIFByZWZlcnMgZ3JhY2VmdWxcbiAqIGBxdWl0YDsgZmFsbHMgYmFjayB0byBgZGlzY29ubmVjdGAuIE5vLW9wIGZvciBhIG51bGwgY2xpZW50IC8gb25lIHdpdGhvdXRcbiAqIGVpdGhlciBtZXRob2QuIE5ldmVyIHRocm93cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlTGVhZGVyTG9jayhyZWRpczogTG9ja1JlZGlzIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlZGlzKSByZXR1cm47XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiByZWRpcy5xdWl0ID09PSAnZnVuY3Rpb24nKSB7IGF3YWl0IHJlZGlzLnF1aXQoKTsgcmV0dXJuOyB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byBkaXNjb25uZWN0XG4gIH1cbiAgdHJ5IHsgcmVkaXMuZGlzY29ubmVjdD8uKCk7IH0gY2F0Y2ggeyAvKiBiZXN0LWVmZm9ydCAqLyB9XG59XG5cbi8qKiBBdG9taWMgXCJkZWxldGUgb25seSBpZiBJIHN0aWxsIG93biBpdFwiIOKAlCBjbG9zZXMgdGhlIGdldC10aGVuLWRlbCByYWNlIHdoZXJlXG4gKiAgdGhlIGxvY2sgZXhwaXJlcyBhbmQgaXMgcmUtYWNxdWlyZWQgYmV0d2VlbiB0aGUgdHdvIGNhbGxzLiAqL1xuY29uc3QgUkVMRUFTRV9JRl9PV05FUiA9XG4gICdpZiByZWRpcy5jYWxsKFwiZ2V0XCIsIEtFWVNbMV0pID09IEFSR1ZbMV0gdGhlbiByZXR1cm4gcmVkaXMuY2FsbChcImRlbFwiLCBLRVlTWzFdKSBlbHNlIHJldHVybiAwIGVuZCc7XG5cbi8qKiBBdG9taWMgXCJleHRlbmQgb25seSBpZiBJIHN0aWxsIG93biBpdFwiIOKAlCB0aGUgaGVhcnRiZWF0LiAqL1xuY29uc3QgRVhURU5EX0lGX09XTkVSID1cbiAgJ2lmIHJlZGlzLmNhbGwoXCJnZXRcIiwgS0VZU1sxXSkgPT0gQVJHVlsxXSB0aGVuIHJldHVybiByZWRpcy5jYWxsKFwicGV4cGlyZVwiLCBLRVlTWzFdLCBBUkdWWzJdKSBlbHNlIHJldHVybiAwIGVuZCc7XG5cbi8qKiBMb25nZXN0IGEgcnVuIHdhaXRzIGZvciBhIG5vdC15ZXQtY29ubmVjdGVkIGNsaWVudCBiZWZvcmUgc2tpcHBpbmcgdGhlIHdpbmRvdy4gKi9cbmNvbnN0IExPQ0tfUkVBRFlfVElNRU9VVF9NUyA9IDEwXzAwMDtcblxuLyoqXG4gKiBEZWZhdWx0IGxvY2sgbGlmZXRpbWUg4oCUIGEgQ1JBU0gtUkVDT1ZFUlkgd2luZG93LCBub3QgYSBydW4tZHVyYXRpb24gY292ZXIuXG4gKlxuICogVGhlIGhvbGRlciBoZWFydGJlYXRzIChjb21wYXJlLWFuZC1QRVhQSVJFIGV2ZXJ5IGB0dGxNcyAvIDNgKSBmb3IgYXMgbG9uZyBhc1xuICogYGZuYCBydW5zLCBzbyBhIHNpeC1ob3VyIGpvYiBob2xkcyBhIHR3by1taW51dGUgbG9jayBwZXJmZWN0bHkgd2VsbC4gV2hhdCB0aGVcbiAqIFRUTCBhY3R1YWxseSBkZWNpZGVzIGlzIGhvdyBsb25nIGEgam9iIHN0YXlzIEJMT0NLRUQgYWZ0ZXIgdGhlIHBvZCBob2xkaW5nIGl0XG4gKiBkaWVzIHdpdGhvdXQgcmVsZWFzaW5nIOKAlCB0aGUga2V5IHNpbXBseSBzaXRzIHRoZXJlIHVudGlsIGl0IGV4cGlyZXMuIFNpemluZyB0aGVcbiAqIFRUTCB0byB0aGUgZXhwZWN0ZWQgcnVuIHRpbWUgKHdoaWNoIGlzIHdoYXQgc2V2ZXJhbCBjYWxsZXJzIHVzZWQgdG8gZG8pIHR1cm5lZCBhXG4gKiBjcmFzaGVkIHBvZCBpbnRvIGhvdXJzIG9mIHNpbGVudCBpbmFjdGl2aXR5LlxuICpcbiAqIFR3byBtaW51dGVzIGxlYXZlcyB0aHJlZSBtaXNzZWQgaGVhcnRiZWF0cyBvZiBzbGFjaywgc28gYW4gZXZlbnQtbG9vcCBzdGFsbCBvciBhXG4gKiBicmllZiBSZWRpcyBibGlwIGRvZXMgbm90IGhhbmQgdGhlIGxvY2sgdG8gYSBzZWNvbmQgcG9kIG1pZC1ydW4sIHdoaWxlIHJlY292ZXJ5XG4gKiBhZnRlciBhIHJlYWwgY3Jhc2ggaXMgYm91bmRlZCBhdCB0d28gbWludXRlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTEVBREVSX0xPQ0tfVFRMX01TID0gMTIwXzAwMDtcblxuLyoqXG4gKiBUaGUgb25lIHdheSB0byBidWlsZCBhIGxlYWRlci1sb2NrIGtleTogYDxzZXJ2aWNlPjo8am9iPjpsZWFkZXJgLlxuICpcbiAqIEZvdXIgY29udmVudGlvbnMgaGFkIGdyb3duIHVwIOKAlCBgcGx1Z2luOnZ1bG4tcmVzY2FuOmxlYWRlcmAsXG4gKiBgcGxhdGZvcm06bGVhZGVyOm9yZy1wdXJnZWAsIGEgYmFyZSBgZWNvc3lzdGVtLXN0YXRzOmxlYWRlcmAsIGFuZCBiaWxsaW5nJ3NcbiAqIHVubmFtZXNwYWNlZCBgc3Vic2NyaXB0aW9uLWxpZmVjeWNsZWAg4oCUIHdoaWNoIG1lYW50IG5vIHNpbmdsZSBnbG9iIGZvdW5kIGV2ZXJ5XG4gKiBsb2NrLiBgS0VZUyAnKjpsZWFkZXInYCBtaXNzZWQgYmlsbGluZydzIHRocmVlIGVudGlyZWx5LCBzbyBhbiBvcGVyYXRvciBhc2tpbmdcbiAqIFwid2hhdCBpcyBoZWxkIHJpZ2h0IG5vd1wiIGdvdCBhIHBhcnRpYWwgYW5zd2VyLiBUaGUgZW52IFJlZGlzIGNsaWVudCBzZXRzIG5vXG4gKiBga2V5UHJlZml4YCwgc28gdGhlc2Ugc2hhcmUgb25lIGZsYXQga2V5c3BhY2Ugd2l0aCBjYWNoZSwgQnVsbE1RIGFuZCBzcG9vbCBrZXlzO1xuICogdGhlIGA8c2VydmljZT46YCBzZWdtZW50IGlzIHdoYXQga2VlcHMgdGhlbSBhcGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxlYWRlckxvY2tLZXkoc2VydmljZTogc3RyaW5nLCBqb2I6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzZXJ2aWNlfToke2pvYn06bGVhZGVyYDtcbn1cblxuLyoqIFdoeSBhIGxlYWRlci1sb2NrZWQgcnVuIHdhcyB0b2xkIHRvIHN0b3AuICovXG5leHBvcnQgdHlwZSBMZWFkZXJMb2NrQWJvcnRSZWFzb24gPSAnbG9jay1sb3N0JyB8ICdzaHV0ZG93bic7XG5cbi8qKiBXaGF0IGEgbGVhZGVyLWxvY2tlZCBydW4gaXMgdG9sZCB3aGlsZSBpdCBydW5zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWFkZXJMb2NrUnVuIHtcbiAgLyoqXG4gICAqIEFib3J0ZWQgd2hlbiB0aGUgbG9jayBpcyBMT1NUIG1pZC1ydW4gKGEgaGVhcnRiZWF0IGZvdW5kIGFub3RoZXIgaG9sZGVyLCBvclxuICAgKiB0aGUga2V5IGdvbmUpLCBvciB3aGVuIHRoZSBjYWxsZXIgaXMgU0hVVFRJTkcgRE9XTi4gTG9uZyBydW5zIG11c3QgY2hlY2sgaXRcbiAgICogYmV0d2VlbiB1bml0cyBvZiB3b3JrIGFuZCByZXR1cm46IHBhc3QgYSBsb2NrIGxvc3MgYW5vdGhlciBwb2QgbWF5IGJlIGRvaW5nXG4gICAqIHRoZSBzYW1lIHdvcmssIGFuZCBvbiBzaHV0ZG93biByZXR1cm5pbmcgcHJvbXB0bHkgaXMgd2hhdCByZWxlYXNlcyB0aGUgbG9ja1xuICAgKiBpbnN0ZWFkIG9mIGxlYXZpbmcgaXQgdG8gZXhwaXJlLlxuICAgKlxuICAgKiBgc2lnbmFsLnJlYXNvbmAgaXMgYSB7QGxpbmsgTGVhZGVyTG9ja0Fib3J0UmVhc29ufS5cbiAgICovXG4gIHNpZ25hbDogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBDYWxsZXItc3VwcGxpZWQgY29udHJvbHMgZm9yIHtAbGluayB3aXRoTGVhZGVyTG9ja30uICovXG5leHBvcnQgaW50ZXJmYWNlIExlYWRlckxvY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFib3J0ZWQgYnkgdGhlIGNhbGxlciB0byBhc2sgYSBydW5uaW5nIGpvYiB0byBzdG9wIOKAlCBhIHNjaGVkdWxlcidzIGBzdG9wKClgXG4gICAqIG9uIHNodXRkb3duLiBNZXJnZWQgaW50byB7QGxpbmsgTGVhZGVyTG9ja1J1bi5zaWduYWx9LCBzbyBhIHNpZ25hbC1hd2FyZSBgZm5gXG4gICAqIHJldHVybnMgYW5kIHRoZSBsb2NrIGlzIHJlbGVhc2VkIGluIHRoZSBgZmluYWxseWAgcmF0aGVyIHRoYW4gbGluZ2VyaW5nIGZvclxuICAgKiB0aGUgcmVzdCBvZiB0aGUgVFRMLlxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogUnVuIGBmbmAgb25seSBpZiB0aGlzIHByb2Nlc3Mgd2lucyBhIHNob3J0LWxpdmVkIGRpc3RyaWJ1dGVkIGxvY2sg4oCUIHRoZVxuICogYWNyb3NzLXBvZHMgXCJzaW5nbGUgcnVubmVyXCIgZ3VhcmQgZm9yIHBlcmlvZGljIGpvYnMgKGRpZ2VzdCBmbHVzaGVzLCBldGMuKS5cbiAqXG4gKiBVc2VzIGBTRVQga2V5IHRva2VuIE5YIFBYIHR0bGAsIHNvIGV4YWN0bHkgb25lIGhvbGRlciBydW5zIHBlciB3aW5kb3cgYW5kIHRoZVxuICogbG9jayBhdXRvLWV4cGlyZXMgaWYgdGhhdCBob2xkZXIgZGllcyBtaWQtcnVuIChubyBzdHVjayBsb2NrKS4gV2hpbGUgYGZuYFxuICogcnVucywgdGhlIGhvbGRlciBIRUFSVEJFQVRTIChjb21wYXJlLWFuZC1QRVhQSVJFIGV2ZXJ5IGB0dGxNcyAvIDNgKSwgc28gYSBydW5cbiAqIHRoYXQgb3V0bGFzdHMgYHR0bE1zYCBrZWVwcyB0aGUgbG9jayBpbnN0ZWFkIG9mIHNpbGVudGx5IGxldHRpbmcgYSBzZWNvbmQgcG9kXG4gKiBzdGFydCB0aGUgc2FtZSB3b3JrOyBhIGhlYXJ0YmVhdCB0aGF0IGZpbmRzIHRoZSBsb2NrIGdvbmUgYWJvcnRzXG4gKiBgcnVuLnNpZ25hbGAuIFRoZSBsb2NrIGlzIHJlbGVhc2VkIG9uIGNvbXBsZXRpb24sIGJ1dCBvbmx5IGlmIHdlIHN0aWxsIG93blxuICogaXQg4oCUIGEgc2xvd2VyIHByZWRlY2Vzc29yIG5ldmVyIGRlbGV0ZXMgYSBzdWNjZXNzb3IncyBsb2NrLlxuICpcbiAqIElmIFJlZGlzIGNhbid0IGJlIHJlYWNoZWQgdGhlIHJ1biBpcyBza2lwcGVkIChyZXR1cm5zIGZhbHNlKSByYXRoZXIgdGhhblxuICogcmVqZWN0aW5nIOKAlCBjYWxsZXJzIGFyZSB0aW1lcnMsIGFuZCBhIFJlZGlzIGJsaXAgbXVzdCBub3QgY3Jhc2ggdGhlIHByb2Nlc3MuXG4gKlxuICogRVZFUlkgb3V0Y29tZSBpcyBjb3VudGVkLCBiZWNhdXNlIHRoZXkgbWVhbiB2ZXJ5IGRpZmZlcmVudCB0aGluZ3MgYW5kIHRoZVxuICogZGlmZmVyZW5jZSB1c2VkIHRvIGJlIHZpc2libGUgb25seSBpbiBhIGxvZyBsaW5lOlxuICogIC0gYGxlYWRlcl9sb2NrX2FjcXVpcmVkX3RvdGFsYCDigJQgdGhpcyBwb2QgcmFuIHRoZSB3aW5kb3cuIEEgam9iIHdob3NlIGNvdW50XG4gKiAgICBzdGF5cyBmbGF0IGlzIG5vdCBydW5uaW5nIEFOWVdIRVJFLCB3aGljaCBpcyB0aGUgY29uZGl0aW9uIHdvcnRoIGFsZXJ0aW5nIG9uLlxuICogIC0gYGxlYWRlcl9sb2NrX2NvbnRlbmRlZF90b3RhbGAg4oCUIGFub3RoZXIgcG9kIGhvbGRzIGl0LiBIZWFsdGh5IGFuZCBleHBlY3RlZFxuICogICAgd2l0aCByZXBsaWNhcyA+IDE7IGV4YWN0bHkgb25lIGFjcXVpcmUgcGVyIHdpbmRvdyBhY3Jvc3MgdGhlIGZsZWV0LlxuICogIC0gYGxlYWRlcl9sb2NrX3VuYXZhaWxhYmxlX3RvdGFsYCDigJQgUmVkaXMgdW5yZWFjaGFibGUsIHNvIE5PQk9EWSByYW4gdGhpc1xuICogICAgd2luZG93LiBBIFJlZGlzIGJsaXAgc2lsZW50bHkgc3RvcHBpbmcgZXZlcnkgc3dlZXAgZmxlZXQtd2lkZSB3YXMgcHJldmlvdXNseVxuICogICAgYSBXQVJOIGxvZyBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgd2UgaGVsZCB0aGUgbG9jayBhbmQgcmFuIGBmbmA7IGZhbHNlIGlmIGFub3RoZXIgaG9sZGVyIGRpZCBvclxuICogICB0aGUgbG9jayBjb3VsZG4ndCBiZSB0YWtlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhMZWFkZXJMb2NrKFxuICByZWRpczogTG9ja1JlZGlzLFxuICBrZXk6IHN0cmluZyxcbiAgdHRsTXM6IG51bWJlcixcbiAgZm46IChydW46IExlYWRlckxvY2tSdW4pID0+IFByb21pc2U8dm9pZD4sXG4gIG9wdHM6IExlYWRlckxvY2tPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQXNrZWQgdG8gc3RvcCBiZWZvcmUgd2UgZXZlbiB0cmllZDogZG9uJ3QgdGFrZSBhIGxvY2sgd2UgYXJlIGFib3V0IHRvIGRyb3AuXG4gIGlmIChvcHRzLnNpZ25hbD8uYWJvcnRlZCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHRva2VuID0gcmFuZG9tVVVJRCgpO1xuICBsZXQgYWNxdWlyZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgLy8gVGhlIGVudiBjbGllbnQgaGFzIG5vIG9mZmxpbmUgcXVldWU6IGEgU0VUIGJlZm9yZSB0aGUgZmlyc3QgY29ubmVjdGlvblxuICAgIC8vIGNvbXBsZXRlcyBpcyByZWplY3RlZCwgd2hpY2ggbWFkZSB0aGUgRklSU1QgdGljayBhZnRlciBldmVyeSBib290IGFcbiAgICAvLyBndWFyYW50ZWVkIHNraXAuIFdhaXQgKGJvdW5kZWQpIGZvciByZWFkaW5lc3MgZmlyc3QuXG4gICAgYXdhaXQgd2hlblJlZGlzUmVhZHkocmVkaXMsIE1hdGgubWluKExPQ0tfUkVBRFlfVElNRU9VVF9NUywgTWF0aC5tYXgoMSwgdHRsTXMpKSk7XG4gICAgYWNxdWlyZWQgPSBhd2FpdCByZWRpcy5zZXQoa2V5LCB0b2tlbiwgJ1BYJywgdHRsTXMsICdOWCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBSZWRpcyB1bnJlYWNoYWJsZSAoaW5jbHVkaW5nIGJlZm9yZSB0aGUgZmlyc3QgY29ubmVjdGlvbiBjb21wbGV0ZXMpOiBub1xuICAgIC8vIHBvZCBjYW4gcHJvdmUgaXQncyB0aGUgbGVhZGVyLCBzbyBub2JvZHkgcnVucyB0aGlzIHdpbmRvdy4gU2tpcHBpbmcgaXNcbiAgICAvLyB0aGUgc2FmZSBzaWRlIOKAlCBydW5uaW5nIGhlcmUgY291bGQgZHVwbGljYXRlIGRlc3RydWN0aXZlIHdvcmsgYWNyb3NzIHBvZHMuXG4gICAgbG9ja0xvZ2dlci53YXJuKCdMZWFkZXIgbG9jayB1bmF2YWlsYWJsZTsgc2tpcHBpbmcgdGhpcyBydW4nLCB7XG4gICAgICBrZXksIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICBlbWl0Q291bnRlcignbGVhZGVyX2xvY2tfdW5hdmFpbGFibGVfdG90YWwnLCB7IGtleSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGFjcXVpcmVkICE9PSAnT0snKSB7XG4gICAgZW1pdENvdW50ZXIoJ2xlYWRlcl9sb2NrX2NvbnRlbmRlZF90b3RhbCcsIHsga2V5IH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBlbWl0Q291bnRlcignbGVhZGVyX2xvY2tfYWNxdWlyZWRfdG90YWwnLCB7IGtleSB9KTtcblxuICBjb25zdCBsb3N0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAvLyBTaHV0ZG93biBpcyBtZXJnZWQgaW50byB0aGUgU0FNRSBzaWduYWwgYSBsb2NrIGxvc3MgdXNlczogZnJvbSBgZm5gJ3MgcG9pbnQgb2ZcbiAgLy8gdmlldyBib3RoIG1lYW4gXCJzdG9wIGJldHdlZW4gdW5pdHMgb2Ygd29yayBhbmQgcmV0dXJuXCIuIGBzaWduYWwucmVhc29uYCBzYXlzXG4gIC8vIHdoaWNoLiBSZWdpc3RlcmVkIHdpdGggYG9uY2VgIHNvIGEgbG9uZy1saXZlZCBjYWxsZXIgc2lnbmFsIGRvZXNuJ3QgcmV0YWluXG4gIC8vIHRoaXMgY29udHJvbGxlciBhZnRlciB0aGUgcnVuLlxuICBjb25zdCBvbkV4dGVybmFsQWJvcnQgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKCFsb3N0LnNpZ25hbC5hYm9ydGVkKSBsb3N0LmFib3J0KCdzaHV0ZG93bicgc2F0aXNmaWVzIExlYWRlckxvY2tBYm9ydFJlYXNvbik7XG4gIH07XG4gIG9wdHMuc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uRXh0ZXJuYWxBYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuXG4gIGxldCBoZWFydGJlYXQ6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIHJlZGlzLmV2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBldmFsRm4gPSByZWRpcy5ldmFsLmJpbmQocmVkaXMpO1xuICAgIGhlYXJ0YmVhdCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGV2YWxGbihFWFRFTkRfSUZfT1dORVIsIDEsIGtleSwgdG9rZW4sIHR0bE1zKS50aGVuKChleHRlbmRlZCkgPT4ge1xuICAgICAgICBpZiAoTnVtYmVyKGV4dGVuZGVkKSAhPT0gMSAmJiAhbG9zdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGxvY2tMb2dnZXIud2FybignTGVhZGVyIGxvY2sgbG9zdCBtaWQtcnVuIChhbm90aGVyIGhvbGRlciwgb3IgdGhlIGtleSBleHBpcmVkKScsIHsga2V5IH0pO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdsZWFkZXJfbG9ja19sb3N0X3RvdGFsJywgeyBrZXkgfSk7XG4gICAgICAgICAgbG9zdC5hYm9ydCgnbG9jay1sb3N0JyBzYXRpc2ZpZXMgTGVhZGVyTG9ja0Fib3J0UmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAvLyBBIGJsaXA6IHRoZSBuZXh0IGJlYXQgcmV0cmllczsgdGhlIFRUTCBzdGlsbCBjb3ZlcnMgdGhpcyBpbnRlcnZhbC5cbiAgICAgICAgbG9ja0xvZ2dlci5kZWJ1ZygnTGVhZGVyIGxvY2sgaGVhcnRiZWF0IGZhaWxlZCcsIHsga2V5LCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICB9KTtcbiAgICB9LCBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHR0bE1zIC8gMykpKTtcbiAgICBoZWFydGJlYXQudW5yZWY/LigpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmbih7IHNpZ25hbDogbG9zdC5zaWduYWwgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGhlYXJ0YmVhdCkgY2xlYXJJbnRlcnZhbChoZWFydGJlYXQpO1xuICAgIG9wdHMuc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uRXh0ZXJuYWxBYm9ydCk7XG4gICAgLy8gUmVsZWFzZSBvbmx5IGlmIHRoZSBsb2NrIGlzIHN0aWxsIG91cnMg4oCUIGlmIG91ciBydW4gb3ZlcnJhbiB0aGUgVFRMIGFuZFxuICAgIC8vIGFub3RoZXIgaG9sZGVyIHRvb2sgb3ZlciwgcmVsZWFzaW5nIGhlcmUgd291bGQgZnJlZSB0aGVpciBsb2NrIGVhcmx5LlxuICAgIC8vIFByZWZlciBhbiBhdG9taWMgQ0FTIChMdWEpOyBmYWxsIGJhY2sgdG8gZ2V0LXRoZW4tZGVsIGZvciBjbGllbnRzIHdpdGhvdXRcbiAgICAvLyBldmFsICh0aGUgc21hbGwgbm9uLWF0b21pYyB3aW5kb3cgaXMgVFRMLWJvdW5kZWQpLlxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHJlZGlzLmV2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXdhaXQgcmVkaXMuZXZhbChSRUxFQVNFX0lGX09XTkVSLCAxLCBrZXksIHRva2VuKTtcbiAgICAgIH0gZWxzZSBpZiAoKGF3YWl0IHJlZGlzLmdldChrZXkpKSA9PT0gdG9rZW4pIHtcbiAgICAgICAgYXdhaXQgcmVkaXMuZGVsKGtleSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0LWVmZm9ydDogdGhlIFRUTCBleHBpcmVzIHRoZSBsb2NrIHJlZ2FyZGxlc3MuXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEEgYExvY2tSZWRpc2AgYmFja2VkIGJ5IHRoZSBzaGFyZWQgZW52IFJlZGlzIGNsaWVudCAoc2VlIGVudi1yZWRpcy50cykg4oCUIHRoZSBsZWFkZXItbG9jayBjb3VudGVycGFydCB0byBgY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sYCAvXG4gKiBgY3JlYXRlRW52UmVkaXNUb2tlblJldm9jYXRpb25TdG9yZWAsIGZvciBhIHNlcnZpY2UgdGhhdCBoYXMgbm8gQnVsbE1RIGNsaWVudCB0b1xuICogYm9ycm93LiBSZXR1cm5zIGBudWxsYCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQsIHNvIGEgY2FsbGVyIGNhbiBkZWdyYWRlIHRvXG4gKiBydW5uaW5nIG9uIGV2ZXJ5IHBvZCAodGhlIGF0b21pYyBndWFyZHMgaXQgd3JhcHMgbXVzdCBzdGlsbCBtYWtlIHRoYXQgc2FmZSkuXG4gKiBUaGUgY2xpZW50IGlzIGEgcmVhbCBpb3JlZGlzIGluc3RhbmNlOyBpb3JlZGlzIGV4cG9zZXMgYHNldGAvYGdldGAvYGRlbGAvYGV2YWxgLFxuICogc2F0aXNmeWluZyBgTG9ja1JlZGlzYCBpbmNsdWRpbmcgdGhlIGF0b21pYyBDQVMgcmVsZWFzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudlJlZGlzTG9jaygpOiBMb2NrUmVkaXMgfCBudWxsIHtcbiAgY29uc3QgaW5zdCA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PExvY2tSZWRpcz4oJ2xlYWRlci1sb2NrJyk7XG4gIGlmIChpbnN0KSBsb2NrTG9nZ2VyLmluZm8oJ1JlZGlzIGxlYWRlci1sb2NrIGNsaWVudCBpbml0aWFsaXplZCcpO1xuICByZXR1cm4gaW5zdDtcbn1cblxuLy8gT25lIGVudi1jb25maWd1cmVkIGxvY2sgY2xpZW50IHBlciBwcm9jZXNzLCBzaGFyZWQgYnkgZXZlcnkgc2NoZWR1bGVyIHRoYXRcbi8vIGFza3MgZm9yIGEgbG9jayB3aXRob3V0IHN1cHBseWluZyBpdHMgb3duIGNsaWVudC4gUmVmZXJlbmNlLWNvdW50ZWQgc28gdGhlXG4vLyBjb25uZWN0aW9uIGlzIGNsb3NlZCB3aGVuIHRoZSBsYXN0IHN1Y2ggc2NoZWR1bGVyIHN0b3BzLlxubGV0IHNoYXJlZExvY2s6IExvY2tSZWRpcyB8IG51bGwgfCB1bmRlZmluZWQ7XG5sZXQgc2hhcmVkTG9ja1VzZXJzID0gMDtcblxuLyoqIFRha2UgYSByZWZlcmVuY2Ugb24gdGhlIHNoYXJlZCBlbnYgbG9jayBjbGllbnQgKGBudWxsYCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjcXVpcmVTaGFyZWRFbnZMb2NrKCk6IExvY2tSZWRpcyB8IG51bGwge1xuICBpZiAoc2hhcmVkTG9jayA9PT0gdW5kZWZpbmVkKSBzaGFyZWRMb2NrID0gY3JlYXRlRW52UmVkaXNMb2NrKCk7XG4gIHNoYXJlZExvY2tVc2VycysrO1xuICByZXR1cm4gc2hhcmVkTG9jaztcbn1cblxuLyoqIERyb3AgYSByZWZlcmVuY2UgdGFrZW4gYnkge0BsaW5rIGFjcXVpcmVTaGFyZWRFbnZMb2NrfTsgdGhlIGxhc3Qgb25lIGNsb3NlcyB0aGUgY2xpZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VTaGFyZWRFbnZMb2NrKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc2hhcmVkTG9ja1VzZXJzID09PSAwKSByZXR1cm47XG4gIHNoYXJlZExvY2tVc2Vycy0tO1xuICBpZiAoc2hhcmVkTG9ja1VzZXJzID4gMCkgcmV0dXJuO1xuICBjb25zdCBjbGllbnQgPSBzaGFyZWRMb2NrO1xuICBzaGFyZWRMb2NrID0gdW5kZWZpbmVkO1xuICBhd2FpdCBjbG9zZUxlYWRlckxvY2soY2xpZW50KTtcbn1cbiJdfQ==
|
package/lib/services/quota.js
CHANGED
|
@@ -4,11 +4,11 @@ import { createSafeClient } from './http-client.js';
|
|
|
4
4
|
import { getServiceAuthHeader } from '../middleware/service-tokens.js';
|
|
5
5
|
import { ErrorCode } from '../types/error-codes.js';
|
|
6
6
|
import { DEFAULT_TIER, isValidTier } from '../types/quota-tiers.js';
|
|
7
|
+
import { envBool } from '../utils/env.js';
|
|
7
8
|
import { createLogger } from '../utils/logger.js';
|
|
8
9
|
import { emitCounter } from '../utils/metric-emitter.js';
|
|
9
10
|
import { errorMessage, sendError, sendQuotaExceeded } from '../utils/response.js';
|
|
10
11
|
import { serviceEndpoint } from '../utils/service-registry.js';
|
|
11
|
-
import { envBool } from '../utils/env.js';
|
|
12
12
|
/**
|
|
13
13
|
* Retry options for quota calls — fail fast (a slow quota service must not stall the request).
|
|
14
14
|
*
|
|
@@ -299,4 +299,4 @@ export function sendQuotaReserveDenied(res, quotaType, reservation) {
|
|
|
299
299
|
export function decrementQuota(quotaService, orgId, quotaType, authHeader, logWarn, amount = 1, resetAtSnapshot) {
|
|
300
300
|
quotaService.decrement(orgId, quotaType, authHeader, amount, resetAtSnapshot).catch((err) => logWarn('Quota rollback failed', { error: errorMessage(err) }));
|
|
301
301
|
}
|
|
302
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcXVvdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUl0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTFDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBK0Q7SUFDeEYsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QixVQUFVLEVBQUUsQ0FBQztDQUNkLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFckMsK0NBQStDO0FBQy9DLEVBQUU7QUFDRiw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLGdGQUFnRjtBQUNoRixpRkFBaUY7QUFDakYsb0VBQW9FO0FBQ3BFLG1FQUFtRTtBQUNuRSwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSxnRkFBZ0Y7QUFDaEYs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QkFBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUUsWUFBMEIsRUFDeEQsS0FBYSxFQUNiLFNBQW9CLEVBQ3BCLFVBQWtCLEVBQ2xCLE9BQWtELEVBQ2xELE1BQU0sR0FBVyxDQUFDLEVBQ2xCLGVBQXdCO0lBRXhCLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQVksRUFBRSxFQUFFLENBQ25HLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUMvRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVNhZmVDbGllbnQsIHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zZXJ2aWNlLXRva2Vucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSwgUXVvdGFDaGVja1Jlc3VsdCwgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi90eXBlcy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1RJRVIsIGlzVmFsaWRUaWVyLCB0eXBlIFF1b3RhVGllciB9IGZyb20gJy4uL3R5cGVzL3F1b3RhLXRpZXJzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSwgc2VuZEVycm9yLCBzZW5kUXVvdGFFeGNlZWRlZCB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IHNlcnZpY2VFbmRwb2ludCB9IGZyb20gJy4uL3V0aWxzL3NlcnZpY2UtcmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgZW52Qm9vbCB9IGZyb20gJy4uL3V0aWxzL2Vudi5qcyc7XG5cbi8qKlxuICogUmV0cnkgb3B0aW9ucyBmb3IgcXVvdGEgY2FsbHMg4oCUIGZhaWwgZmFzdCAoYSBzbG93IHF1b3RhIHNlcnZpY2UgbXVzdCBub3Qgc3RhbGwgdGhlIHJlcXVlc3QpLlxuICpcbiAqIE5FVkVSIHJldHJ5IGEgNDI5LiBUaGUgcXVvdGEgc2VydmljZSBhbnN3ZXJzIGFuIG92ZXItbGltaXQgb3JnIHdpdGggNDI5XG4gKiBRVU9UQV9FWENFRURFRCBhbmQgYFJldHJ5LUFmdGVyYCA9IHNlY29uZHMgdW50aWwgdGhlIHBlcmlvZCByZXNldHM7IHRoZSBIVFRQXG4gKiBjbGllbnQgaG9ub3JzIHRoYXQgKGNhcHBlZCBhdCA2MHMpLCBzbyBhIHNpbmdsZSByYXRlLWxpbWl0IHJldHJ5IHN0YWxsZWQgdGhlXG4gKiByZXF1ZXN0IHdlbGwgcGFzdCB0aGUgaGFuZGxlciB0aW1lb3V0LCB3aGljaCB0aGVuIGFuc3dlcmVkIDUwMyBhbmQgdGhlIHJlYWxcbiAqIDQyOSB3YXMgbG9zdC4gQSA0MjkgaXMgYSBmaW5hbCBhbnN3ZXIgaGVyZS5cbiAqL1xuY29uc3QgUVVPVEFfUkVRVUVTVF9PUFRJT05TOiBQaWNrPFJlcXVlc3RPcHRpb25zLCAnbWF4UmF0ZUxpbWl0UmV0cmllcycgfCAnbWF4UmV0cmllcyc+ID0ge1xuICBtYXhSYXRlTGltaXRSZXRyaWVzOiAwLFxuICBtYXhSZXRyaWVzOiAxLFxufTtcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdxdW90YScpO1xuXG4vLyBSRVNFUlZFIEZBSUwgTU9ERSDigJQgZXhwbGljaXQsIHNpbmdsZSBwb2xpY3kuXG4vL1xuLy8gYHJlc2VydmVgIGdhdGVzIEVYUEVOU0lWRSwgYmlsbGFibGUgcmVzb3VyY2VzIChwaXBlbGluZXMsIHBsdWdpbiBidWlsZHMsIEFJXG4vLyBjYWxscywgcGxhdGZvcm0gZmVhdHVyZSBzbG90cykuIEV2ZXJ5IHF1b3RhIHR5cGUgaXMgYSBwZXItcGVyaW9kIEZMT1cgY291bnRlclxuLy8gd2l0aCBubyBhZnRlci10aGUtZmFjdCByZWNvbmNpbGlhdGlvbjogYSB1bml0IGNvbnN1bWVkIHdoaWxlIHRoZSByZXNlcnZhdGlvblxuLy8gY291bGQgbm90IGJlIGNvbmZpcm1lZCBpcyBuZXZlciBjb3VudGVkLCBzbyBmYWlsLW9wZW4gbGV0cyBhbiBvcmcgY29uc3VtZVxuLy8gdW5ib3VuZGVkIHVubWV0ZXJlZCB1bml0cyBmb3IgdGhlIHdob2xlIGxlbmd0aCBvZiBhbiBpbmNpZGVudCDigJQgYW5kIGFuXG4vLyB1bmNvbmZpcm1lZCByZXNlcnZlICh0aW1lb3V0LCBvcGVuIGNpcmN1aXQpIG1heSBldmVuIGhhdmUgbGFuZGVkIHNlcnZlci1zaWRlLlxuLy8gU28gYHJlc2VydmVgIGZhaWxzIENMT1NFRCB3aGVuZXZlciB0aGUgcXVvdGEgc2VydmljZSBkaWQgbm90IENPTkZJUk0gdGhlIHNsb3Q6XG4vLyAgIC0gdW5yZWFjaGFibGUgLyB0aW1lZCBvdXQgLyBjaXJjdWl0IGJyZWFrZXIgb3BlbiAobm8gcmVzcG9uc2UpLFxuLy8gICAtIGEgcmVhY2hhYmxlLWJ1dC1lcnJvcmVkIHJlc3BvbnNlICg1eHgsIDR4eCwgbWFsZm9ybWVkIGJvZHkpLFxuLy8gICAtIGEgNDI5IHRoYXQgaXMgTk9UIGEgZ2VudWluZSBRVU9UQV9FWENFRURFRCAoZ2F0ZXdheSAvIHJhdGUgbGltaXRlcikuXG4vLyBPcGVyYXRvcnMgd2hvIHByZWZlciBhdmFpbGFiaWxpdHkgb3ZlciBlbmZvcmNlbWVudCBvcHQgdGhlIFdIT0xFIHNldCBpbnRvXG4vLyBmYWlsLW9wZW4gd2l0aCBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTj10cnVlLiBCb3RoIG91dGNvbWVzIGVtaXQgYSBjb3VudGVyXG4vLyAoYHF1b3RhX2ZhaWxfY2xvc2VkX3RvdGFsYCAvIGBxdW90YV9mYWlsX29wZW5fdG90YWxgKSB0YWdnZWQgd2l0aCB0aGUgcmVhc29uLlxuLy8gYGNoZWNrYCAoYSBjaGVhcCByZWFkIGdhdGUpIHN0YXlzIGZhaWwtb3BlbjsgYGluY3JlbWVudGAgaXMgZmlyZS1hbmQtZm9yZ2V0LlxuY29uc3QgUVVPVEFfUkVTRVJWRV9GQUlMX09QRU4gPSBlbnZCb29sKCdRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTicsIGZhbHNlKTtcblxuLyoqXG4gKiBTZXJ2aWNlLXByaW5jaXBhbCBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIGZvciBhIHF1b3RhIGNhbGwgbWFkZSBvbiBiZWhhbGYgb2ZcbiAqIGBvcmdJZGAgYnkgdGhlIENVUlJFTlQgc2VydmljZSAoYFNFUlZJQ0VfTkFNRWAsIHRoZSBzYW1lIGlkZW50aXR5IHRoZSBoZWFsdGhcbiAqIHJvdXRlciByZXBvcnRzKS5cbiAqXG4gKiBUaGUgcXVvdGEgc2VydmljZSdzIG11dGF0aW9uIGVuZHBvaW50cyAoYC86b3JnSWQvaW5jcmVtZW50YCwgYC9kZWNyZW1lbnRgKVxuICogcmVqZWN0IGFueXRoaW5nIGJ1dCBhIHNpZ25lZCBzZXJ2aWNlIHByaW5jaXBhbCBvciBhIHN5c3RlbSBhZG1pbiwgc29cbiAqIGZvcndhcmRpbmcgdGhlIGVuZCB1c2VyJ3MgYmVhcmVyIHRva2VuIHRoZXJlIGlzIGFsd2F5cyBhIDQwMy4gU2VydmljZSB0b2tlbnNcbiAqIGFyZSBhbHNvIGV4ZW1wdCBmcm9tIHRoZSBxdW90YSBzZXJ2aWNlJ3MgcGVyLUlQIHJhdGUgbGltaXRlciwgc28gaG90LXBhdGhcbiAqIHF1b3RhIHRyYWZmaWMgZnJvbSBhIGJ1c3kgcG9kIGNhbid0IGV4aGF1c3QgdGhhdCBwb2QgSVAncyBidWNrZXQgYW5kIHNpbGVudGx5XG4gKiB0dXJuIGVuZm9yY2VtZW50IG9mZi4gU2NvcGVkIHRvIHRoZSB0YXJnZXQgb3JnIHdpdGggdGhlIGxvd2VzdCByb2xlIChtZW1iZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVvdGFTZXJ2aWNlQXV0aEhlYWRlcihvcmdJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWU6IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAnYXBpJywgb3JnSWQsIHJvbGU6ICdtZW1iZXInIH0pO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIHN5bmNocm9ub3VzIHF1b3RhIHJlc2VydmF0aW9uICB0aGUgYXRvbWljIGNoZWNrK2luY3JlbWVudFxuICogdmFyaWFudC4gYGV4Y2VlZGVkOiB0cnVlYCBtZWFucyB0aGUgb3BlcmF0aW9uIHdhcyByZWplY3RlZCBhdCB0aGUgREJcbiAqIGxldmVsOyB0aGUgY2FsbGVyIHNob3VsZCByZXR1cm4gNDI5IHdpdGhvdXQgcnVubmluZyB0aGUgZ2F0ZWQgYWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhUmVzZXJ2ZVJlc3VsdCB7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHNsb3Qgd2FzIE5PVCByZXNlcnZlZCDigJQgdGhlIGdhdGVkIGFjdGlvbiBtdXN0IG5vdCBydW4uICovXG4gIGV4Y2VlZGVkOiBib29sZWFuO1xuICAvKipcbiAgICogU2V0ICh0cnVlKSBieSB0aGUgcXVvdGEgQ0xJRU5UIHdoZW4gdGhlIHJlc2VydmF0aW9uIHdhcyBkZW5pZWQgYmVjYXVzZSB0aGVcbiAgICogcXVvdGEgc2VydmljZSBjb3VsZCBub3QgQ09ORklSTSBpdCAodW5yZWFjaGFibGUgLyB0aW1lb3V0IC8gY2lyY3VpdCBvcGVuIC9cbiAgICogZXJyb3JlZCkg4oCUIG5vdCBiZWNhdXNlIHRoZSBvcmcgaXMgb3ZlciBpdHMgbGltaXQuIEFsd2F5cyBwYWlyZWQgd2l0aFxuICAgKiBgZXhjZWVkZWQ6IHRydWVgLiBBbnN3ZXIgd2l0aCB7QGxpbmsgc2VuZFF1b3RhUmVzZXJ2ZURlbmllZH0sIHdoaWNoIG1hcHMgaXQgdG9cbiAgICogNTAzIGluc3RlYWQgb2YgYSBtaXNsZWFkaW5nIDQyOSBcInF1b3RhIGV4Y2VlZGVkXCIuXG4gICAqL1xuICB1bmF2YWlsYWJsZT86IGJvb2xlYW47XG4gIHF1b3RhOiB7XG4gICAgdHlwZTogUXVvdGFUeXBlO1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgdXNlZDogbnVtYmVyO1xuICAgIHJlbWFpbmluZzogbnVtYmVyO1xuICAgIHJlc2V0QXQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbi8qKlxuICogUXVvdGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhU2VydmljZSB7XG4gIC8qKiBDaGVjayBpZiBxdW90YSBpcyBhdmFpbGFibGUgKGZhaWwtb3BlbiBvbiBlcnJvcikuICovXG4gIGNoZWNrKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFDaGVja1Jlc3VsdD47XG4gIC8qKiBJbmNyZW1lbnQgcXVvdGEgdXNhZ2UuIFJldHVybnMgYSBwcm9taXNlIHNvIGNhbGxlcnMgY2FuIG9wdGlvbmFsbHkgaGFuZGxlIGVycm9ycy4gKi9cbiAgaW5jcmVtZW50KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudD86IG51bWJlciwgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEF0b21pYyByZXNlcnZlICB0aGUgc2FtZSBhdG9taWMgY2hlY2sraW5jcmVtZW50IGFzIGBpbmNyZW1lbnRgLCBidXRcbiAgICogcGFyc2VzIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBzZWUgd2hldGhlciB0aGUgc2xvdCB3YXMgYWN0dWFsbHlcbiAgICogcmVzZXJ2ZWQuIFVzZSB0aGlzIGZvciBleHBlbnNpdmUgcmVzb3VyY2VzIHdoZXJlIHRoZSBwb3N0LWhvYyBmaXJlLVxuICAgKiBhbmQtZm9yZ2V0IHBhdHRlcm4gYWxsb3dzIGNvbmN1cnJlbnQgb3Zlci1zcGVuZC5cbiAgICpcbiAgICogRmFpbHMgQ0xPU0VEIChgZXhjZWVkZWQ6IHRydWVgKSB3aGVuZXZlciB0aGUgc2xvdCBpcyBub3QgY29uZmlybWVkIOKAlFxuICAgKiB1bnJlYWNoYWJsZSwgdGltZW91dCwgb3BlbiBjaXJjdWl0LCBub24tb2ssIG9yIGEgbm9uLXF1b3RhIDQyOSDigJQgdW5sZXNzXG4gICAqIGBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTj10cnVlYCAoc2VlIHRoZSBwb2xpY3kgbm90ZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZSkuXG4gICAqL1xuICByZXNlcnZlKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudD86IG51bWJlciwgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVJlc2VydmVSZXN1bHQ+O1xuICAvKipcbiAgICogUm9sbCBiYWNrIGEgcHJldmlvdXNseSByZXNlcnZlZCBzbG90LiBGaXJlLWFuZC1mb3JnZXQg4oCUIG5ldmVyIHRocm93cy5cbiAgICogUGFzcyBgcmVzZXRBdFNuYXBzaG90YCAodGhlIGBxdW90YS5yZXNldEF0YCBvYnNlcnZlZCB3aGVuIHRoZSBzbG90IHdhc1xuICAgKiByZXNlcnZlZCkgdG8gbWFrZSB0aGUgcm9sbGJhY2sgY29uZGl0aW9uYWw6IGlmIHRoZSBwZXJpb2Qgcm9sbGVkIG92ZXJcbiAgICogYmV0d2VlbiByZXNlcnZlIGFuZCByb2xsYmFjaywgdGhlIHNlcnZlciBza2lwcyB0aGUgZGVjcmVtZW50IHNvIGl0IGRvZXNuJ3RcbiAgICogc3RlYWwgY2FwYWNpdHkgZnJvbSB0aGUgbmV3IHBlcmlvZC5cbiAgICovXG4gIGRlY3JlbWVudChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ/OiBudW1iZXIsIHJlc2V0QXRTbmFwc2hvdD86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEdldCB0aGUgb3JnJ3MgcXVvdGEgYFF1b3RhVGllcmAuIFVzZWQgYnkgdGhlIHBsdWdpbi1idWlsZCBxdWV1ZSBwYXJ0aXRpb25pbmdcbiAgICogdG8gcm91dGUgYSBidWlsZCB0byB0aGUgcmlnaHQgcGVyLXRpZXIgcXVldWUuIEZhaWwtb3BlbiByZXR1cm5zIGBERUZBVUxUX1RJRVJgXG4gICAqIChgZGV2ZWxvcGVyYCB3aGVuIGJpbGxpbmcgaXMgZW5hYmxlZCwgYHVubGltaXRlZGAgd2hlbiBpdCdzIGRpc2FibGVkKTsgYVxuICAgKiBtaXNjbGFzc2lmaWVkIG9yZyBzdGlsbCBidWlsZHMgb24gdGhlIGRlZmF1bHQgcXVldWUsIGp1c3Qgd2l0aG91dCB0aGVcbiAgICogdGllci1zY29wZWQgc2NoZWR1bGluZyBib29zdC5cbiAgICovXG4gIGdldFRpZXIob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhVGllcj47XG4gIC8qKlxuICAgKiBGQUlMLUNMT1NFRCB0d2luIG9mIHtAbGluayBnZXRUaWVyfTogdGhlIG9yZydzIHRpZXIgYXMgdGhlIHF1b3RhIHNlcnZpY2VcbiAgICogQ09ORklSTUVEIGl0LCBvciBgbnVsbGAgd2hlbiBpdCBjb3VsZCBub3QgYmUgY29uZmlybWVkICh1bnJlYWNoYWJsZSwgbm9uLW9rLFxuICAgKiBtaXNzaW5nIG9yIHVucmVjb2duaXplZCB0aWVyKS4gRm9yIGRlY2lzaW9ucyB0aGF0IG11c3QgbmV2ZXIgYmUgdGFrZW4gb24gYVxuICAgKiBndWVzcyDigJQgYW55dGhpbmcgdGhhdCByZXZva2VzLCBkb3duZ3JhZGVzIG9yIGRlbGV0ZXMgb24gdGhlIHN0cmVuZ3RoIG9mIGFcbiAgICogdGllciAoZS5nLiBhIHZlcmlmaWVkLXB1Ymxpc2hlciBncmFjZSBzd2VlcCkgbXVzdCBza2lwIHRoZSBvcmcgb24gYG51bGxgLFxuICAgKiBuZXZlciBhY3Qgb24gYERFRkFVTFRfVElFUmAuXG4gICAqL1xuICBnZXRUaWVyU3RyaWN0KG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVRpZXIgfCBudWxsPjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBxdW90YSBzZXJ2aWNlIGNsaWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVNlcnZpY2VDb25maWcge1xuICAvKiogUXVvdGEgc2VydmljZSBob3N0IChkZWZhdWx0OiBlbnYgUVVPVEFfU0VSVklDRV9IT1NUIG9yICdxdW90YScpICovXG4gIGhvc3Q/OiBzdHJpbmc7XG4gIC8qKiBRdW90YSBzZXJ2aWNlIHBvcnQgKGRlZmF1bHQ6IGVudiBRVU9UQV9TRVJWSUNFX1BPUlQgb3IgMzAwMCkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQXBwbHkgdGhlIGV4cGxpY2l0IHJlc2VydmUgZmFpbC1tb2RlIHBvbGljeSB0byBhIHJlc2VydmF0aW9uIHRoZSBxdW90YSBzZXJ2aWNlXG4gKiBkaWQgTk9UIGNvbmZpcm0gKHNlZSBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTiBhYm92ZSkuIERlZmF1bHQ6IGRlbnkuXG4gKi9cbmZ1bmN0aW9uIHVuY29uZmlybWVkUmVzZXJ2ZShcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4gIHJlYXNvbjogJ3VucmVhY2hhYmxlJyB8ICd0cmFuc2llbnQtNDI5JyB8ICdub24tb2snLFxuICBzdGF0dXNDb2RlPzogbnVtYmVyLFxuKTogUXVvdGFSZXNlcnZlUmVzdWx0IHtcbiAgaWYgKFFVT1RBX1JFU0VSVkVfRkFJTF9PUEVOKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1FVT1RBX0ZBSUxfT1BFTjogcXVvdGEgcmVzZXJ2ZSBub3QgY29uZmlybWVkLCBhbGxvd2luZyByZXF1ZXN0JywgeyBvcmdJZCwgcXVvdGFUeXBlLCByZWFzb24sIHN0YXR1c0NvZGUgfSk7XG4gICAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfb3Blbl90b3RhbCcsIHsgb3BlcmF0aW9uOiAncmVzZXJ2ZScsIHJlYXNvbiwgcXVvdGFUeXBlIH0pO1xuICAgIHJldHVybiB7IGV4Y2VlZGVkOiBmYWxzZSwgcXVvdGE6IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogLTEsIHVzZWQ6IDAsIHJlbWFpbmluZzogLTEgfSB9O1xuICB9XG4gIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX0NMT1NFRDogcXVvdGEgcmVzZXJ2ZSBub3QgY29uZmlybWVkLCBkZW55aW5nIHJlcXVlc3QnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIHJlYXNvbiwgc3RhdHVzQ29kZSB9KTtcbiAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfY2xvc2VkX3RvdGFsJywgeyBvcGVyYXRpb246ICdyZXNlcnZlJywgcmVhc29uLCBxdW90YVR5cGUgfSk7XG4gIHJldHVybiB7IGV4Y2VlZGVkOiB0cnVlLCB1bmF2YWlsYWJsZTogdHJ1ZSwgcXVvdGE6IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogMCwgdXNlZDogMCwgcmVtYWluaW5nOiAwIH0gfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmYWlsLW9wZW4gcXVvdGEgcmVzdWx0IChhbGxvd3MgdGhlIHJlcXVlc3QpLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGYWlsT3BlblJlc3VsdCgpOiBRdW90YUNoZWNrUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICBhbGxvd2VkOiB0cnVlLFxuICAgIGxpbWl0OiAtMSxcbiAgICB1c2VkOiAwLFxuICAgIHJlbWFpbmluZzogLTEsXG4gICAgcmVzZXRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIHVubGltaXRlZDogdHJ1ZSxcbiAgICAvLyBUYWcgdGhlIHNlbnRpbmVsIHNvIGZhaWwtY2xvc2VkIGNhbGxlcnMgY2FuIHRlbGwgYW4gb3V0YWdlIGFwYXJ0IGZyb20gYVxuICAgIC8vIHJlYWwgdW5saW1pdGVkICgtMSkgcmVhZGluZy4gUmVhbCBxdW90YSByZXN1bHRzIG5ldmVyIHNldCB0aGlzLlxuICAgIGZhaWxPcGVuOiB0cnVlLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGNvbW1vbiByZXF1ZXN0IGhlYWRlcnMgd2l0aCBvcHRpb25hbCByZXF1ZXN0IElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nLlxuICovXG5mdW5jdGlvbiBidWlsZEhlYWRlcnMob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcj86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7ICd4LW9yZy1pZCc6IG9yZ0lkIH07XG4gIGlmIChhdXRoSGVhZGVyKSBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBhdXRoSGVhZGVyO1xuICBpZiAocmVxdWVzdElkKSBoZWFkZXJzWydYLVJlcXVlc3QtSWQnXSA9IHJlcXVlc3RJZDtcbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcXVvdGEgc2VydmljZSBjbGllbnQuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHNlcnZpY2UgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgUXVvdGEgc2VydmljZSBjbGllbnRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcXVvdGFTZXJ2aWNlID0gY3JlYXRlUXVvdGFTZXJ2aWNlKCk7XG4gKlxuICogLy8gQ2hlY2sgcXVvdGEgYmVmb3JlIHByb2Nlc3NpbmdcbiAqIGNvbnN0IHF1b3RhID0gYXdhaXQgcXVvdGFTZXJ2aWNlLmNoZWNrKG9yZ0lkLCAnYXBpQ2FsbHMnLCBhdXRoSGVhZGVyKTtcbiAqIGlmICghcXVvdGEuYWxsb3dlZCkge1xuICogcmV0dXJuIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdRdW90YSBleGNlZWRlZCcgfSk7XG4gKiB9XG4gKlxuICogLy8gSW5jcmVtZW50IHF1b3RhIGFmdGVyIHN1Y2Nlc3NcbiAqIHF1b3RhU2VydmljZS5pbmNyZW1lbnQob3JnSWQsICdhcGlDYWxscycsIGF1dGhIZWFkZXIpLmNhdGNoKGVyciA9PiBsb2dnZXIud2FybignUXVvdGEgaW5jcmVtZW50IGZhaWxlZCcsIHsgZXJyb3I6IGVyciB9KSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1b3RhU2VydmljZShjb25maWc6IFF1b3RhU2VydmljZUNvbmZpZyA9IHt9KTogUXVvdGFTZXJ2aWNlIHtcbiAgY29uc3Qgc2VydmljZUNvbmZpZzogU2VydmljZUNvbmZpZyA9IHtcbiAgICBob3N0OiBjb25maWcuaG9zdCA/PyBzZXJ2aWNlRW5kcG9pbnQoJ3F1b3RhJykuaG9zdCxcbiAgICBwb3J0OiBjb25maWcucG9ydCA/PyBzZXJ2aWNlRW5kcG9pbnQoJ3F1b3RhJykucG9ydCxcbiAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCA/PyA1MDAwLFxuICB9O1xuXG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNhZmVDbGllbnQoc2VydmljZUNvbmZpZyk7XG5cbiAgLyoqIE9uZSB0aWVyIHJlYWQ6IHRoZSBjb25maXJtZWQgdGllciwgb3Igd2h5IHRoZXJlIGlzbid0IG9uZS4gKi9cbiAgYXN5bmMgZnVuY3Rpb24gcmVhZFRpZXIoXG4gICAgb3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyB0aWVyOiBRdW90YVRpZXI7IHJlYXNvbj86IHVuZGVmaW5lZDsgc3RhdHVzQ29kZT86IG51bWJlciB9IHwgeyB0aWVyOiBudWxsOyByZWFzb246ICd1bnJlYWNoYWJsZScgfCAnbm9uLW9rJyB8ICdpbnZhbGlkLXRpZXInOyBzdGF0dXNDb2RlPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8e1xuICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgIGRhdGE/OiB7IHF1b3RhPzogeyB0aWVyPzogc3RyaW5nIH0gfTtcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgfT4oYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfWAsIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG4gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuIHsgdGllcjogbnVsbCwgcmVhc29uOiAndW5yZWFjaGFibGUnIH07XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCB8fCAhcmVzcG9uc2UuYm9keT8uc3VjY2VzcykgcmV0dXJuIHsgdGllcjogbnVsbCwgcmVhc29uOiAnbm9uLW9rJywgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSB9O1xuICAgIGNvbnN0IHRpZXIgPSByZXNwb25zZS5ib2R5LmRhdGE/LnF1b3RhPy50aWVyO1xuICAgIGlmICghdGllciB8fCAhaXNWYWxpZFRpZXIodGllcikpIHJldHVybiB7IHRpZXI6IG51bGwsIHJlYXNvbjogJ2ludmFsaWQtdGllcicsIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUgfTtcbiAgICByZXR1cm4geyB0aWVyLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNoZWNrKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFDaGVja1Jlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vJHtlbmNvZGVVUklDb21wb25lbnQocXVvdGFUeXBlKX1gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8e1xuICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgICAgICBkYXRhPzogeyBxdW90YVR5cGU6IHN0cmluZzsgc3RhdHVzOiBRdW90YUNoZWNrUmVzdWx0IH07XG4gICAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIHNlcnZpY2UgdW5yZWFjaGFibGUsIGFsbG93aW5nIHJlcXVlc3QnLCB7IG9yZ0lkLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ2NoZWNrJywgcmVhc29uOiAndW5yZWFjaGFibGUnLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVGYWlsT3BlblJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFyZXNwb25zZS5ib2R5LnN1Y2Nlc3MgfHwgIXJlc3BvbnNlLmJvZHkuZGF0YT8uc3RhdHVzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIGNoZWNrIHJldHVybmVkIG5vbi1vaywgYWxsb3dpbmcgcmVxdWVzdCcsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLCBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9vcGVuX3RvdGFsJywgeyBvcGVyYXRpb246ICdjaGVjaycsIHJlYXNvbjogJ25vbi1vaycsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZhaWxPcGVuUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZS5ib2R5LmRhdGEuc3RhdHVzO1xuICAgIH0sXG5cbiAgICBhc3luYyBpbmNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2luY3JlbWVudGA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50XG4gICAgICAgIC5wb3N0KHBhdGgsIHsgcXVvdGFUeXBlLCBhbW91bnQgfSwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCksIC4uLlFVT1RBX1JFUVVFU1RfT1BUSU9OUyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBpbmNyZW1lbnQgcXVvdGEnLCB7XG4gICAgICAgICAgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50LCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1F1b3RhIGluY3JlbWVudGVkJywgeyBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlc2VydmUob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhUmVzZXJ2ZVJlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vaW5jcmVtZW50YDtcblxuICAgICAgLy8gMjAwIGNhcnJpZXMgYGRhdGEucXVvdGFgOyA0MjkgKFFVT1RBX0VYQ0VFREVEKSBjYXJyaWVzIGBkZXRhaWxzLnF1b3RhYC5cbiAgICAgIC8vIEJvdGggc2hhcGVzIGFyZSBub3JtYWxpemVkIGludG8gUXVvdGFSZXNlcnZlUmVzdWx0LlxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDx7XG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIGRhdGE/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIGRldGFpbHM/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIC8qKiBgc2VuZEVycm9yYCdzIGVycm9yLWNvZGUgZmllbGQuICovXG4gICAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IHF1b3RhVHlwZSwgYW1vdW50IH0sIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UpIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ3VucmVhY2hhYmxlJyk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MjkpIHtcbiAgICAgICAgY29uc3QgcSA9IHJlc3BvbnNlLmJvZHkuZGV0YWlscz8ucXVvdGE7XG4gICAgICAgIC8vIE9ubHkgYSBHRU5VSU5FIHF1b3RhLWV4Y2VlZGVkIDQyOSBtZWFucyBcIm92ZXIgcXVvdGFcIi4gQSBnZW5lcmljIDQyOSDigJRcbiAgICAgICAgLy8gYW4gaW50ZXJ2ZW5pbmcgZ2F0ZXdheSBvciByYXRlIGxpbWl0ZXIg4oCUIGRpZCBub3QgY29uZmlybSBhbnl0aGluZywgc29cbiAgICAgICAgLy8gaXQgZ29lcyB0aHJvdWdoIHRoZSBzYW1lIHVuY29uZmlybWVkLXJlc2VydmF0aW9uIHBvbGljeSBhcyBhbiBvdXRhZ2UuXG4gICAgICAgIGlmIChyZXNwb25zZS5ib2R5LmNvZGUgPT09IEVycm9yQ29kZS5RVU9UQV9FWENFRURFRCB8fCBxKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4Y2VlZGVkOiB0cnVlLFxuICAgICAgICAgICAgcXVvdGE6IHEgPz8geyB0eXBlOiBxdW90YVR5cGUsIGxpbWl0OiAwLCB1c2VkOiAwLCByZW1haW5pbmc6IDAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ3RyYW5zaWVudC00MjknLCByZXNwb25zZS5zdGF0dXNDb2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCB8fCAhcmVzcG9uc2UuYm9keS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ25vbi1vaycsIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxID0gcmVzcG9uc2UuYm9keS5kYXRhPy5xdW90YTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4Y2VlZGVkOiBmYWxzZSxcbiAgICAgICAgcXVvdGE6IHEgPz8geyB0eXBlOiBxdW90YVR5cGUsIGxpbWl0OiAtMSwgdXNlZDogMCwgcmVtYWluaW5nOiAtMSB9LFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVjcmVtZW50KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyID0gMSwgcmVzZXRBdFNuYXBzaG90Pzogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2RlY3JlbWVudGA7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudFxuICAgICAgICAucG9zdChwYXRoLCB7IHF1b3RhVHlwZSwgYW1vdW50LCAuLi4ocmVzZXRBdFNuYXBzaG90ICYmIHsgcmVzZXRBdFNuYXBzaG90IH0pIH0sIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgIC8vIFJvbGxiYWNrIGZhaWx1cmUgaXMgbG9nZ2VkIGJ1dCBuZXZlciBwcm9wYWdhdGVkICB0aGUgYWN0aW9uJ3Mgb3duXG4gICAgICAgIC8vIGZhaWx1cmUgaGFzIGFscmVhZHkgYmVlbiBzdXJmYWNlZCB0byB0aGUgY2FsbGVyOyBhIHN0dWNrIGNvdW50ZXJcbiAgICAgICAgLy8gcmVzb2x2ZXMgb24gdGhlIG5leHQgcGVyaW9kIHJlc2V0LlxuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGRlY3JlbWVudCBxdW90YSAoc2xvdCB3aWxsIHJlc2V0IG9uIG5leHQgcGVyaW9kKScsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUXVvdGEgZGVjcmVtZW50ZWQnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIGFtb3VudCB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGllcihvcmdJZDogc3RyaW5nLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFUaWVyPiB7XG4gICAgICBjb25zdCByZWFkID0gYXdhaXQgcmVhZFRpZXIob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCk7XG4gICAgICBpZiAocmVhZC50aWVyKSByZXR1cm4gcmVhZC50aWVyO1xuICAgICAgbG9nZ2VyLndhcm4oYFFVT1RBX0ZBSUxfT1BFTjogdGllciBsb29rdXAgZmFpbGVkLCBkZWZhdWx0aW5nIHRvICR7REVGQVVMVF9USUVSfSB0aWVyYCwge1xuICAgICAgICBvcmdJZCwgc3RhdHVzQ29kZTogcmVhZC5zdGF0dXNDb2RlLCByZWFzb246IHJlYWQucmVhc29uLCBkZWZhdWx0VGllcjogREVGQVVMVF9USUVSLFxuICAgICAgfSk7XG4gICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9vcGVuX3RvdGFsJywgeyBvcGVyYXRpb246ICd0aWVyJywgcmVhc29uOiByZWFkLnJlYXNvbiwgcXVvdGFUeXBlOiAndGllcicgfSk7XG4gICAgICByZXR1cm4gREVGQVVMVF9USUVSO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaWVyU3RyaWN0KG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVRpZXIgfCBudWxsPiB7XG4gICAgICBjb25zdCByZWFkID0gYXdhaXQgcmVhZFRpZXIob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCk7XG4gICAgICBpZiAocmVhZC50aWVyKSByZXR1cm4gcmVhZC50aWVyO1xuICAgICAgbG9nZ2VyLndhcm4oJ1FVT1RBX0ZBSUxfQ0xPU0VEOiB0aWVyIGNvdWxkIG5vdCBiZSBjb25maXJtZWQnLCB7IG9yZ0lkLCBzdGF0dXNDb2RlOiByZWFkLnN0YXR1c0NvZGUsIHJlYXNvbjogcmVhZC5yZWFzb24gfSk7XG4gICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9jbG9zZWRfdG90YWwnLCB7IG9wZXJhdGlvbjogJ3RpZXInLCByZWFzb246IHJlYWQucmVhc29uLCBxdW90YVR5cGU6ICd0aWVyJyB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogRmlyZS1hbmQtZm9yZ2V0IHF1b3RhIE1FVEVSSU5HIGluY3JlbWVudCB3aXRoIHN0YW5kYXJkaXplZCBlcnJvciBsb2dnaW5nLlxuICpcbiAqIEF1dGhlbnRpY2F0ZXMgYXMgdGhlIGNhbGxpbmcgU0VSVklDRSAoe0BsaW5rIGdldFF1b3RhU2VydmljZUF1dGhIZWFkZXJ9KSwgbmV2ZXJcbiAqIHdpdGggdGhlIGVuZCB1c2VyJ3MgdG9rZW46IGAvcXVvdGFzLzpvcmdJZC9pbmNyZW1lbnRgIGlzIHNlcnZpY2UtcHJpbmNpcGFsIC9cbiAqIHN5c3RlbS1hZG1pbiBvbmx5LCBzbyBhIGZvcndhcmRlZCB1c2VyIEpXVCB3YXMgYWx3YXlzIHJlamVjdGVkICg0MDMpIGFuZCB0aGVcbiAqIG1ldGVyZWQgcXVvdGEgKGUuZy4gYGFwaUNhbGxzYCwgYW5kIHRoZSBgYXBpX3BhY2tgIGJ1bmRsZSByYWlzaW5nIGl0KSBuZXZlclxuICogbW92ZWQuXG4gKlxuICogQHBhcmFtIHF1b3RhU2VydmljZSAtIFF1b3RhIHNlcnZpY2UgY2xpZW50XG4gKiBAcGFyYW0gb3JnSWQgLSBPcmdhbml6YXRpb24gSUQgd2hvc2UgY291bnRlciBpcyBpbmNyZW1lbnRlZFxuICogQHBhcmFtIHF1b3RhVHlwZSAtIFF1b3RhIHR5cGUgdG8gaW5jcmVtZW50XG4gKiBAcGFyYW0gbG9nV2FybiAtIExvZ2dpbmcgZnVuY3Rpb24gZm9yIHdhcm5pbmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRRdW90YSggcXVvdGFTZXJ2aWNlOiBRdW90YVNlcnZpY2UsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICBsb2dXYXJuOiAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZCxcbik6IHZvaWQge1xuICBxdW90YVNlcnZpY2UuaW5jcmVtZW50KG9yZ0lkLCBxdW90YVR5cGUsIGdldFF1b3RhU2VydmljZUF1dGhIZWFkZXIob3JnSWQpKS5jYXRjaCgoZXJyOiB1bmtub3duKSA9PlxuICAgIGxvZ1dhcm4oJ1F1b3RhIGluY3JlbWVudCBmYWlsZWQnLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBBdG9taWMgcmVzZXJ2ZSBoZWxwZXIgZm9yIHRoZSBcInJlc2VydmUgKyBjb21taXQgLyByb2xsYmFja1wiIHBhdHRlcm4uXG4gKiBVc2UgZm9yIGV4cGVuc2l2ZSByZXNvdXJjZXMgKHBpcGVsaW5lcywgcGx1Z2lucywgQUkgY2FsbHMpIHdoZXJlIHRoZVxuICogZmlyZS1hbmQtZm9yZ2V0IHBvc3QtaG9jIGBpbmNyZW1lbnRRdW90YWAgYWxsb3dzIGNvbmN1cnJlbnQgb3Zlci1zcGVuZC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIHJlc3VsdCBzbyB0aGUgY2FsbGVyIGNhbiBkZWNpZGUgd2hldGhlciB0byBydW5cbiAqIHRoZSBnYXRlZCBhY3Rpb24gb3IgNDI5IHRoZSBjbGllbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc2VydmF0aW9uID0gYXdhaXQgcmVzZXJ2ZVF1b3RhKHF1b3RhU2VydmljZSwgb3JnSWQsICdwaXBlbGluZXMnLCBhdXRoSGVhZGVyKTtcbiAqIGlmIChyZXNlcnZhdGlvbi5leGNlZWRlZCkgcmV0dXJuIHNlbmRRdW90YVJlc2VydmVEZW5pZWQocmVzLCAncGlwZWxpbmVzJywgcmVzZXJ2YXRpb24pO1xuICogdHJ5IHtcbiAqIGF3YWl0IGRvRXhwZW5zaXZlVGhpbmcoKTtcbiAqIH0gY2F0Y2ggKGVycikge1xuICogLy8gUGFzcyB0aGUgcmVzZXJ2ZWQgcmVzZXRBdCBzbyBhIHBlcmlvZCByb2xsb3ZlciBkb2Vzbid0IGdldCBkb3VibGUtY2hhcmdlZC5cbiAqIGRlY3JlbWVudFF1b3RhKHF1b3RhU2VydmljZSwgb3JnSWQsICdwaXBlbGluZXMnLCBhdXRoSGVhZGVyLCBsb2dXYXJuLCAxLCByZXNlcnZhdGlvbi5xdW90YS5yZXNldEF0KTtcbiAqIHRocm93IGVycjtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXJ2ZVF1b3RhKCBxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4gIGF1dGhIZWFkZXI6IHN0cmluZyxcbiAgYW1vdW50OiBudW1iZXIgPSAxLFxuICByZXF1ZXN0SWQ/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFF1b3RhUmVzZXJ2ZVJlc3VsdD4ge1xuICByZXR1cm4gcXVvdGFTZXJ2aWNlLnJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgYXV0aEhlYWRlciwgYW1vdW50LCByZXF1ZXN0SWQpO1xufVxuXG4vKiogU2Vjb25kcyBhIGNsaWVudCBzaG91bGQgd2FpdCBiZWZvcmUgcmV0cnlpbmcgd2hlbiBxdW90YSBjb3VsZG4ndCBiZSBjb25maXJtZWQuICovXG5jb25zdCBRVU9UQV9VTkFWQUlMQUJMRV9SRVRSWV9BRlRFUl9TRUNPTkRTID0gNTtcblxuLyoqXG4gKiBBbnN3ZXIgYSBERU5JRUQgcmVzZXJ2YXRpb24gKGByZXNlcnZhdGlvbi5leGNlZWRlZCA9PT0gdHJ1ZWApLlxuICpcbiAqIC0gYHVuYXZhaWxhYmxlYCAodGhlIHF1b3RhIHNlcnZpY2UgY291bGRuJ3QgY29uZmlybSB0aGUgc2xvdCkg4oaSICoqNTAzKipcbiAqICAgYFNFUlZJQ0VfVU5BVkFJTEFCTEVgIHdpdGggYSBzaG9ydCBgUmV0cnktQWZ0ZXJgOiB0aGUgb3JnIGlzIG5vdCBvdmVyIGl0c1xuICogICBsaW1pdCwgc28gYSA0MjkgXCJxdW90YSBleGNlZWRlZFwiIHdvdWxkIHNlbmQgdXNlcnMgdG8gdXBncmFkZSBmb3IgYW4gb3V0YWdlLlxuICogLSBvdGhlcndpc2Ug4oaSIHRoZSBzdGFuZGFyZCA0MjkgYFFVT1RBX0VYQ0VFREVEYCB3aXRoIHRoZSBYLVF1b3RhLSogaGVhZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbmRRdW90YVJlc2VydmVEZW5pZWQocmVzOiBSZXNwb25zZSwgcXVvdGFUeXBlOiBRdW90YVR5cGUsIHJlc2VydmF0aW9uOiBRdW90YVJlc2VydmVSZXN1bHQpOiB2b2lkIHtcbiAgaWYgKHJlc2VydmF0aW9uLnVuYXZhaWxhYmxlKSB7XG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHJlcy5zZXRIZWFkZXIoJ1JldHJ5LUFmdGVyJywgUVVPVEFfVU5BVkFJTEFCTEVfUkVUUllfQUZURVJfU0VDT05EUyk7XG4gICAgc2VuZEVycm9yKFxuICAgICAgcmVzLFxuICAgICAgNTAzLFxuICAgICAgYFVuYWJsZSB0byBjb25maXJtICR7cXVvdGFUeXBlfSBxdW90YSByaWdodCBub3cuIFBsZWFzZSB0cnkgYWdhaW4gc2hvcnRseS5gLFxuICAgICAgRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgc2VuZFF1b3RhRXhjZWVkZWQocmVzLCBxdW90YVR5cGUsIHJlc2VydmF0aW9uLnF1b3RhLCByZXNlcnZhdGlvbi5xdW90YS5yZXNldEF0KTtcbn1cblxuLyoqXG4gKiBGaXJlLWFuZC1mb3JnZXQgcm9sbGJhY2sgZm9yIGEgcHJldmlvdXNseSByZXNlcnZlZCBxdW90YSBzbG90LlxuICogTG9ncyBvbiBmYWlsdXJlIGJ1dCBuZXZlciB0aHJvd3MgIHRoZSBhY3Rpb24gdGhhdCBuZWVkZWQgdGhlIHJvbGxiYWNrXG4gKiBoYXMgYWxyZWFkeSBmYWlsZWQsIG5vIHBvaW50IGNvbXBvdW5kaW5nIHRoZSBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY3JlbWVudFF1b3RhKCBxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4gIGF1dGhIZWFkZXI6IHN0cmluZyxcbiAgbG9nV2FybjogKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQsXG4gIGFtb3VudDogbnVtYmVyID0gMSxcbiAgcmVzZXRBdFNuYXBzaG90Pzogc3RyaW5nLFxuKTogdm9pZCB7XG4gIHF1b3RhU2VydmljZS5kZWNyZW1lbnQob3JnSWQsIHF1b3RhVHlwZSwgYXV0aEhlYWRlciwgYW1vdW50LCByZXNldEF0U25hcHNob3QpLmNhdGNoKChlcnI6IHVua25vd24pID0+XG4gICAgbG9nV2FybignUXVvdGEgcm9sbGJhY2sgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSksXG4gICk7XG59XG4iXX0=
|
|
302
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcXVvdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUl0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRS9EOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBK0Q7SUFDeEYsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QixVQUFVLEVBQUUsQ0FBQztDQUNkLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFckMsK0NBQStDO0FBQy9DLEVBQUU7QUFDRiw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLGdGQUFnRjtBQUNoRixpRkFBaUY7QUFDakYsb0VBQW9FO0FBQ3BFLG1FQUFtRTtBQUNuRSwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSxnRkFBZ0Y7QUFDaEYs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QkFBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUUsWUFBMEIsRUFDeEQsS0FBYSxFQUNiLFNBQW9CLEVBQ3BCLFVBQWtCLEVBQ2xCLE9BQWtELEVBQ2xELE1BQU0sR0FBVyxDQUFDLEVBQ2xCLGVBQXdCO0lBRXhCLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQVksRUFBRSxFQUFFLENBQ25HLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUMvRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVNhZmVDbGllbnQsIHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zZXJ2aWNlLXRva2Vucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSwgUXVvdGFDaGVja1Jlc3VsdCwgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi90eXBlcy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1RJRVIsIGlzVmFsaWRUaWVyLCB0eXBlIFF1b3RhVGllciB9IGZyb20gJy4uL3R5cGVzL3F1b3RhLXRpZXJzLmpzJztcbmltcG9ydCB7IGVudkJvb2wgfSBmcm9tICcuLi91dGlscy9lbnYuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlLCBzZW5kRXJyb3IsIHNlbmRRdW90YUV4Y2VlZGVkIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgc2VydmljZUVuZHBvaW50IH0gZnJvbSAnLi4vdXRpbHMvc2VydmljZS1yZWdpc3RyeS5qcyc7XG5cbi8qKlxuICogUmV0cnkgb3B0aW9ucyBmb3IgcXVvdGEgY2FsbHMg4oCUIGZhaWwgZmFzdCAoYSBzbG93IHF1b3RhIHNlcnZpY2UgbXVzdCBub3Qgc3RhbGwgdGhlIHJlcXVlc3QpLlxuICpcbiAqIE5FVkVSIHJldHJ5IGEgNDI5LiBUaGUgcXVvdGEgc2VydmljZSBhbnN3ZXJzIGFuIG92ZXItbGltaXQgb3JnIHdpdGggNDI5XG4gKiBRVU9UQV9FWENFRURFRCBhbmQgYFJldHJ5LUFmdGVyYCA9IHNlY29uZHMgdW50aWwgdGhlIHBlcmlvZCByZXNldHM7IHRoZSBIVFRQXG4gKiBjbGllbnQgaG9ub3JzIHRoYXQgKGNhcHBlZCBhdCA2MHMpLCBzbyBhIHNpbmdsZSByYXRlLWxpbWl0IHJldHJ5IHN0YWxsZWQgdGhlXG4gKiByZXF1ZXN0IHdlbGwgcGFzdCB0aGUgaGFuZGxlciB0aW1lb3V0LCB3aGljaCB0aGVuIGFuc3dlcmVkIDUwMyBhbmQgdGhlIHJlYWxcbiAqIDQyOSB3YXMgbG9zdC4gQSA0MjkgaXMgYSBmaW5hbCBhbnN3ZXIgaGVyZS5cbiAqL1xuY29uc3QgUVVPVEFfUkVRVUVTVF9PUFRJT05TOiBQaWNrPFJlcXVlc3RPcHRpb25zLCAnbWF4UmF0ZUxpbWl0UmV0cmllcycgfCAnbWF4UmV0cmllcyc+ID0ge1xuICBtYXhSYXRlTGltaXRSZXRyaWVzOiAwLFxuICBtYXhSZXRyaWVzOiAxLFxufTtcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdxdW90YScpO1xuXG4vLyBSRVNFUlZFIEZBSUwgTU9ERSDigJQgZXhwbGljaXQsIHNpbmdsZSBwb2xpY3kuXG4vL1xuLy8gYHJlc2VydmVgIGdhdGVzIEVYUEVOU0lWRSwgYmlsbGFibGUgcmVzb3VyY2VzIChwaXBlbGluZXMsIHBsdWdpbiBidWlsZHMsIEFJXG4vLyBjYWxscywgcGxhdGZvcm0gZmVhdHVyZSBzbG90cykuIEV2ZXJ5IHF1b3RhIHR5cGUgaXMgYSBwZXItcGVyaW9kIEZMT1cgY291bnRlclxuLy8gd2l0aCBubyBhZnRlci10aGUtZmFjdCByZWNvbmNpbGlhdGlvbjogYSB1bml0IGNvbnN1bWVkIHdoaWxlIHRoZSByZXNlcnZhdGlvblxuLy8gY291bGQgbm90IGJlIGNvbmZpcm1lZCBpcyBuZXZlciBjb3VudGVkLCBzbyBmYWlsLW9wZW4gbGV0cyBhbiBvcmcgY29uc3VtZVxuLy8gdW5ib3VuZGVkIHVubWV0ZXJlZCB1bml0cyBmb3IgdGhlIHdob2xlIGxlbmd0aCBvZiBhbiBpbmNpZGVudCDigJQgYW5kIGFuXG4vLyB1bmNvbmZpcm1lZCByZXNlcnZlICh0aW1lb3V0LCBvcGVuIGNpcmN1aXQpIG1heSBldmVuIGhhdmUgbGFuZGVkIHNlcnZlci1zaWRlLlxuLy8gU28gYHJlc2VydmVgIGZhaWxzIENMT1NFRCB3aGVuZXZlciB0aGUgcXVvdGEgc2VydmljZSBkaWQgbm90IENPTkZJUk0gdGhlIHNsb3Q6XG4vLyAgIC0gdW5yZWFjaGFibGUgLyB0aW1lZCBvdXQgLyBjaXJjdWl0IGJyZWFrZXIgb3BlbiAobm8gcmVzcG9uc2UpLFxuLy8gICAtIGEgcmVhY2hhYmxlLWJ1dC1lcnJvcmVkIHJlc3BvbnNlICg1eHgsIDR4eCwgbWFsZm9ybWVkIGJvZHkpLFxuLy8gICAtIGEgNDI5IHRoYXQgaXMgTk9UIGEgZ2VudWluZSBRVU9UQV9FWENFRURFRCAoZ2F0ZXdheSAvIHJhdGUgbGltaXRlcikuXG4vLyBPcGVyYXRvcnMgd2hvIHByZWZlciBhdmFpbGFiaWxpdHkgb3ZlciBlbmZvcmNlbWVudCBvcHQgdGhlIFdIT0xFIHNldCBpbnRvXG4vLyBmYWlsLW9wZW4gd2l0aCBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTj10cnVlLiBCb3RoIG91dGNvbWVzIGVtaXQgYSBjb3VudGVyXG4vLyAoYHF1b3RhX2ZhaWxfY2xvc2VkX3RvdGFsYCAvIGBxdW90YV9mYWlsX29wZW5fdG90YWxgKSB0YWdnZWQgd2l0aCB0aGUgcmVhc29uLlxuLy8gYGNoZWNrYCAoYSBjaGVhcCByZWFkIGdhdGUpIHN0YXlzIGZhaWwtb3BlbjsgYGluY3JlbWVudGAgaXMgZmlyZS1hbmQtZm9yZ2V0LlxuY29uc3QgUVVPVEFfUkVTRVJWRV9GQUlMX09QRU4gPSBlbnZCb29sKCdRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTicsIGZhbHNlKTtcblxuLyoqXG4gKiBTZXJ2aWNlLXByaW5jaXBhbCBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIGZvciBhIHF1b3RhIGNhbGwgbWFkZSBvbiBiZWhhbGYgb2ZcbiAqIGBvcmdJZGAgYnkgdGhlIENVUlJFTlQgc2VydmljZSAoYFNFUlZJQ0VfTkFNRWAsIHRoZSBzYW1lIGlkZW50aXR5IHRoZSBoZWFsdGhcbiAqIHJvdXRlciByZXBvcnRzKS5cbiAqXG4gKiBUaGUgcXVvdGEgc2VydmljZSdzIG11dGF0aW9uIGVuZHBvaW50cyAoYC86b3JnSWQvaW5jcmVtZW50YCwgYC9kZWNyZW1lbnRgKVxuICogcmVqZWN0IGFueXRoaW5nIGJ1dCBhIHNpZ25lZCBzZXJ2aWNlIHByaW5jaXBhbCBvciBhIHN5c3RlbSBhZG1pbiwgc29cbiAqIGZvcndhcmRpbmcgdGhlIGVuZCB1c2VyJ3MgYmVhcmVyIHRva2VuIHRoZXJlIGlzIGFsd2F5cyBhIDQwMy4gU2VydmljZSB0b2tlbnNcbiAqIGFyZSBhbHNvIGV4ZW1wdCBmcm9tIHRoZSBxdW90YSBzZXJ2aWNlJ3MgcGVyLUlQIHJhdGUgbGltaXRlciwgc28gaG90LXBhdGhcbiAqIHF1b3RhIHRyYWZmaWMgZnJvbSBhIGJ1c3kgcG9kIGNhbid0IGV4aGF1c3QgdGhhdCBwb2QgSVAncyBidWNrZXQgYW5kIHNpbGVudGx5XG4gKiB0dXJuIGVuZm9yY2VtZW50IG9mZi4gU2NvcGVkIHRvIHRoZSB0YXJnZXQgb3JnIHdpdGggdGhlIGxvd2VzdCByb2xlIChtZW1iZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVvdGFTZXJ2aWNlQXV0aEhlYWRlcihvcmdJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWU6IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAnYXBpJywgb3JnSWQsIHJvbGU6ICdtZW1iZXInIH0pO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIHN5bmNocm9ub3VzIHF1b3RhIHJlc2VydmF0aW9uICB0aGUgYXRvbWljIGNoZWNrK2luY3JlbWVudFxuICogdmFyaWFudC4gYGV4Y2VlZGVkOiB0cnVlYCBtZWFucyB0aGUgb3BlcmF0aW9uIHdhcyByZWplY3RlZCBhdCB0aGUgREJcbiAqIGxldmVsOyB0aGUgY2FsbGVyIHNob3VsZCByZXR1cm4gNDI5IHdpdGhvdXQgcnVubmluZyB0aGUgZ2F0ZWQgYWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhUmVzZXJ2ZVJlc3VsdCB7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHNsb3Qgd2FzIE5PVCByZXNlcnZlZCDigJQgdGhlIGdhdGVkIGFjdGlvbiBtdXN0IG5vdCBydW4uICovXG4gIGV4Y2VlZGVkOiBib29sZWFuO1xuICAvKipcbiAgICogU2V0ICh0cnVlKSBieSB0aGUgcXVvdGEgQ0xJRU5UIHdoZW4gdGhlIHJlc2VydmF0aW9uIHdhcyBkZW5pZWQgYmVjYXVzZSB0aGVcbiAgICogcXVvdGEgc2VydmljZSBjb3VsZCBub3QgQ09ORklSTSBpdCAodW5yZWFjaGFibGUgLyB0aW1lb3V0IC8gY2lyY3VpdCBvcGVuIC9cbiAgICogZXJyb3JlZCkg4oCUIG5vdCBiZWNhdXNlIHRoZSBvcmcgaXMgb3ZlciBpdHMgbGltaXQuIEFsd2F5cyBwYWlyZWQgd2l0aFxuICAgKiBgZXhjZWVkZWQ6IHRydWVgLiBBbnN3ZXIgd2l0aCB7QGxpbmsgc2VuZFF1b3RhUmVzZXJ2ZURlbmllZH0sIHdoaWNoIG1hcHMgaXQgdG9cbiAgICogNTAzIGluc3RlYWQgb2YgYSBtaXNsZWFkaW5nIDQyOSBcInF1b3RhIGV4Y2VlZGVkXCIuXG4gICAqL1xuICB1bmF2YWlsYWJsZT86IGJvb2xlYW47XG4gIHF1b3RhOiB7XG4gICAgdHlwZTogUXVvdGFUeXBlO1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgdXNlZDogbnVtYmVyO1xuICAgIHJlbWFpbmluZzogbnVtYmVyO1xuICAgIHJlc2V0QXQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbi8qKlxuICogUXVvdGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhU2VydmljZSB7XG4gIC8qKiBDaGVjayBpZiBxdW90YSBpcyBhdmFpbGFibGUgKGZhaWwtb3BlbiBvbiBlcnJvcikuICovXG4gIGNoZWNrKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFDaGVja1Jlc3VsdD47XG4gIC8qKiBJbmNyZW1lbnQgcXVvdGEgdXNhZ2UuIFJldHVybnMgYSBwcm9taXNlIHNvIGNhbGxlcnMgY2FuIG9wdGlvbmFsbHkgaGFuZGxlIGVycm9ycy4gKi9cbiAgaW5jcmVtZW50KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudD86IG51bWJlciwgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEF0b21pYyByZXNlcnZlICB0aGUgc2FtZSBhdG9taWMgY2hlY2sraW5jcmVtZW50IGFzIGBpbmNyZW1lbnRgLCBidXRcbiAgICogcGFyc2VzIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBzZWUgd2hldGhlciB0aGUgc2xvdCB3YXMgYWN0dWFsbHlcbiAgICogcmVzZXJ2ZWQuIFVzZSB0aGlzIGZvciBleHBlbnNpdmUgcmVzb3VyY2VzIHdoZXJlIHRoZSBwb3N0LWhvYyBmaXJlLVxuICAgKiBhbmQtZm9yZ2V0IHBhdHRlcm4gYWxsb3dzIGNvbmN1cnJlbnQgb3Zlci1zcGVuZC5cbiAgICpcbiAgICogRmFpbHMgQ0xPU0VEIChgZXhjZWVkZWQ6IHRydWVgKSB3aGVuZXZlciB0aGUgc2xvdCBpcyBub3QgY29uZmlybWVkIOKAlFxuICAgKiB1bnJlYWNoYWJsZSwgdGltZW91dCwgb3BlbiBjaXJjdWl0LCBub24tb2ssIG9yIGEgbm9uLXF1b3RhIDQyOSDigJQgdW5sZXNzXG4gICAqIGBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTj10cnVlYCAoc2VlIHRoZSBwb2xpY3kgbm90ZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZSkuXG4gICAqL1xuICByZXNlcnZlKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudD86IG51bWJlciwgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVJlc2VydmVSZXN1bHQ+O1xuICAvKipcbiAgICogUm9sbCBiYWNrIGEgcHJldmlvdXNseSByZXNlcnZlZCBzbG90LiBGaXJlLWFuZC1mb3JnZXQg4oCUIG5ldmVyIHRocm93cy5cbiAgICogUGFzcyBgcmVzZXRBdFNuYXBzaG90YCAodGhlIGBxdW90YS5yZXNldEF0YCBvYnNlcnZlZCB3aGVuIHRoZSBzbG90IHdhc1xuICAgKiByZXNlcnZlZCkgdG8gbWFrZSB0aGUgcm9sbGJhY2sgY29uZGl0aW9uYWw6IGlmIHRoZSBwZXJpb2Qgcm9sbGVkIG92ZXJcbiAgICogYmV0d2VlbiByZXNlcnZlIGFuZCByb2xsYmFjaywgdGhlIHNlcnZlciBza2lwcyB0aGUgZGVjcmVtZW50IHNvIGl0IGRvZXNuJ3RcbiAgICogc3RlYWwgY2FwYWNpdHkgZnJvbSB0aGUgbmV3IHBlcmlvZC5cbiAgICovXG4gIGRlY3JlbWVudChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ/OiBudW1iZXIsIHJlc2V0QXRTbmFwc2hvdD86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEdldCB0aGUgb3JnJ3MgcXVvdGEgYFF1b3RhVGllcmAuIFVzZWQgYnkgdGhlIHBsdWdpbi1idWlsZCBxdWV1ZSBwYXJ0aXRpb25pbmdcbiAgICogdG8gcm91dGUgYSBidWlsZCB0byB0aGUgcmlnaHQgcGVyLXRpZXIgcXVldWUuIEZhaWwtb3BlbiByZXR1cm5zIGBERUZBVUxUX1RJRVJgXG4gICAqIChgZGV2ZWxvcGVyYCB3aGVuIGJpbGxpbmcgaXMgZW5hYmxlZCwgYHVubGltaXRlZGAgd2hlbiBpdCdzIGRpc2FibGVkKTsgYVxuICAgKiBtaXNjbGFzc2lmaWVkIG9yZyBzdGlsbCBidWlsZHMgb24gdGhlIGRlZmF1bHQgcXVldWUsIGp1c3Qgd2l0aG91dCB0aGVcbiAgICogdGllci1zY29wZWQgc2NoZWR1bGluZyBib29zdC5cbiAgICovXG4gIGdldFRpZXIob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhVGllcj47XG4gIC8qKlxuICAgKiBGQUlMLUNMT1NFRCB0d2luIG9mIHtAbGluayBnZXRUaWVyfTogdGhlIG9yZydzIHRpZXIgYXMgdGhlIHF1b3RhIHNlcnZpY2VcbiAgICogQ09ORklSTUVEIGl0LCBvciBgbnVsbGAgd2hlbiBpdCBjb3VsZCBub3QgYmUgY29uZmlybWVkICh1bnJlYWNoYWJsZSwgbm9uLW9rLFxuICAgKiBtaXNzaW5nIG9yIHVucmVjb2duaXplZCB0aWVyKS4gRm9yIGRlY2lzaW9ucyB0aGF0IG11c3QgbmV2ZXIgYmUgdGFrZW4gb24gYVxuICAgKiBndWVzcyDigJQgYW55dGhpbmcgdGhhdCByZXZva2VzLCBkb3duZ3JhZGVzIG9yIGRlbGV0ZXMgb24gdGhlIHN0cmVuZ3RoIG9mIGFcbiAgICogdGllciAoZS5nLiBhIHZlcmlmaWVkLXB1Ymxpc2hlciBncmFjZSBzd2VlcCkgbXVzdCBza2lwIHRoZSBvcmcgb24gYG51bGxgLFxuICAgKiBuZXZlciBhY3Qgb24gYERFRkFVTFRfVElFUmAuXG4gICAqL1xuICBnZXRUaWVyU3RyaWN0KG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVRpZXIgfCBudWxsPjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBxdW90YSBzZXJ2aWNlIGNsaWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVNlcnZpY2VDb25maWcge1xuICAvKiogUXVvdGEgc2VydmljZSBob3N0IChkZWZhdWx0OiBlbnYgUVVPVEFfU0VSVklDRV9IT1NUIG9yICdxdW90YScpICovXG4gIGhvc3Q/OiBzdHJpbmc7XG4gIC8qKiBRdW90YSBzZXJ2aWNlIHBvcnQgKGRlZmF1bHQ6IGVudiBRVU9UQV9TRVJWSUNFX1BPUlQgb3IgMzAwMCkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQXBwbHkgdGhlIGV4cGxpY2l0IHJlc2VydmUgZmFpbC1tb2RlIHBvbGljeSB0byBhIHJlc2VydmF0aW9uIHRoZSBxdW90YSBzZXJ2aWNlXG4gKiBkaWQgTk9UIGNvbmZpcm0gKHNlZSBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTiBhYm92ZSkuIERlZmF1bHQ6IGRlbnkuXG4gKi9cbmZ1bmN0aW9uIHVuY29uZmlybWVkUmVzZXJ2ZShcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4gIHJlYXNvbjogJ3VucmVhY2hhYmxlJyB8ICd0cmFuc2llbnQtNDI5JyB8ICdub24tb2snLFxuICBzdGF0dXNDb2RlPzogbnVtYmVyLFxuKTogUXVvdGFSZXNlcnZlUmVzdWx0IHtcbiAgaWYgKFFVT1RBX1JFU0VSVkVfRkFJTF9PUEVOKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1FVT1RBX0ZBSUxfT1BFTjogcXVvdGEgcmVzZXJ2ZSBub3QgY29uZmlybWVkLCBhbGxvd2luZyByZXF1ZXN0JywgeyBvcmdJZCwgcXVvdGFUeXBlLCByZWFzb24sIHN0YXR1c0NvZGUgfSk7XG4gICAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfb3Blbl90b3RhbCcsIHsgb3BlcmF0aW9uOiAncmVzZXJ2ZScsIHJlYXNvbiwgcXVvdGFUeXBlIH0pO1xuICAgIHJldHVybiB7IGV4Y2VlZGVkOiBmYWxzZSwgcXVvdGE6IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogLTEsIHVzZWQ6IDAsIHJlbWFpbmluZzogLTEgfSB9O1xuICB9XG4gIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX0NMT1NFRDogcXVvdGEgcmVzZXJ2ZSBub3QgY29uZmlybWVkLCBkZW55aW5nIHJlcXVlc3QnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIHJlYXNvbiwgc3RhdHVzQ29kZSB9KTtcbiAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfY2xvc2VkX3RvdGFsJywgeyBvcGVyYXRpb246ICdyZXNlcnZlJywgcmVhc29uLCBxdW90YVR5cGUgfSk7XG4gIHJldHVybiB7IGV4Y2VlZGVkOiB0cnVlLCB1bmF2YWlsYWJsZTogdHJ1ZSwgcXVvdGE6IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogMCwgdXNlZDogMCwgcmVtYWluaW5nOiAwIH0gfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmYWlsLW9wZW4gcXVvdGEgcmVzdWx0IChhbGxvd3MgdGhlIHJlcXVlc3QpLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGYWlsT3BlblJlc3VsdCgpOiBRdW90YUNoZWNrUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICBhbGxvd2VkOiB0cnVlLFxuICAgIGxpbWl0OiAtMSxcbiAgICB1c2VkOiAwLFxuICAgIHJlbWFpbmluZzogLTEsXG4gICAgcmVzZXRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIHVubGltaXRlZDogdHJ1ZSxcbiAgICAvLyBUYWcgdGhlIHNlbnRpbmVsIHNvIGZhaWwtY2xvc2VkIGNhbGxlcnMgY2FuIHRlbGwgYW4gb3V0YWdlIGFwYXJ0IGZyb20gYVxuICAgIC8vIHJlYWwgdW5saW1pdGVkICgtMSkgcmVhZGluZy4gUmVhbCBxdW90YSByZXN1bHRzIG5ldmVyIHNldCB0aGlzLlxuICAgIGZhaWxPcGVuOiB0cnVlLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGNvbW1vbiByZXF1ZXN0IGhlYWRlcnMgd2l0aCBvcHRpb25hbCByZXF1ZXN0IElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nLlxuICovXG5mdW5jdGlvbiBidWlsZEhlYWRlcnMob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcj86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7ICd4LW9yZy1pZCc6IG9yZ0lkIH07XG4gIGlmIChhdXRoSGVhZGVyKSBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBhdXRoSGVhZGVyO1xuICBpZiAocmVxdWVzdElkKSBoZWFkZXJzWydYLVJlcXVlc3QtSWQnXSA9IHJlcXVlc3RJZDtcbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcXVvdGEgc2VydmljZSBjbGllbnQuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHNlcnZpY2UgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgUXVvdGEgc2VydmljZSBjbGllbnRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcXVvdGFTZXJ2aWNlID0gY3JlYXRlUXVvdGFTZXJ2aWNlKCk7XG4gKlxuICogLy8gQ2hlY2sgcXVvdGEgYmVmb3JlIHByb2Nlc3NpbmdcbiAqIGNvbnN0IHF1b3RhID0gYXdhaXQgcXVvdGFTZXJ2aWNlLmNoZWNrKG9yZ0lkLCAnYXBpQ2FsbHMnLCBhdXRoSGVhZGVyKTtcbiAqIGlmICghcXVvdGEuYWxsb3dlZCkge1xuICogcmV0dXJuIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdRdW90YSBleGNlZWRlZCcgfSk7XG4gKiB9XG4gKlxuICogLy8gSW5jcmVtZW50IHF1b3RhIGFmdGVyIHN1Y2Nlc3NcbiAqIHF1b3RhU2VydmljZS5pbmNyZW1lbnQob3JnSWQsICdhcGlDYWxscycsIGF1dGhIZWFkZXIpLmNhdGNoKGVyciA9PiBsb2dnZXIud2FybignUXVvdGEgaW5jcmVtZW50IGZhaWxlZCcsIHsgZXJyb3I6IGVyciB9KSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1b3RhU2VydmljZShjb25maWc6IFF1b3RhU2VydmljZUNvbmZpZyA9IHt9KTogUXVvdGFTZXJ2aWNlIHtcbiAgY29uc3Qgc2VydmljZUNvbmZpZzogU2VydmljZUNvbmZpZyA9IHtcbiAgICBob3N0OiBjb25maWcuaG9zdCA/PyBzZXJ2aWNlRW5kcG9pbnQoJ3F1b3RhJykuaG9zdCxcbiAgICBwb3J0OiBjb25maWcucG9ydCA/PyBzZXJ2aWNlRW5kcG9pbnQoJ3F1b3RhJykucG9ydCxcbiAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCA/PyA1MDAwLFxuICB9O1xuXG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNhZmVDbGllbnQoc2VydmljZUNvbmZpZyk7XG5cbiAgLyoqIE9uZSB0aWVyIHJlYWQ6IHRoZSBjb25maXJtZWQgdGllciwgb3Igd2h5IHRoZXJlIGlzbid0IG9uZS4gKi9cbiAgYXN5bmMgZnVuY3Rpb24gcmVhZFRpZXIoXG4gICAgb3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyB0aWVyOiBRdW90YVRpZXI7IHJlYXNvbj86IHVuZGVmaW5lZDsgc3RhdHVzQ29kZT86IG51bWJlciB9IHwgeyB0aWVyOiBudWxsOyByZWFzb246ICd1bnJlYWNoYWJsZScgfCAnbm9uLW9rJyB8ICdpbnZhbGlkLXRpZXInOyBzdGF0dXNDb2RlPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8e1xuICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgIGRhdGE/OiB7IHF1b3RhPzogeyB0aWVyPzogc3RyaW5nIH0gfTtcbiAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgfT4oYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfWAsIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG4gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuIHsgdGllcjogbnVsbCwgcmVhc29uOiAndW5yZWFjaGFibGUnIH07XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCB8fCAhcmVzcG9uc2UuYm9keT8uc3VjY2VzcykgcmV0dXJuIHsgdGllcjogbnVsbCwgcmVhc29uOiAnbm9uLW9rJywgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSB9O1xuICAgIGNvbnN0IHRpZXIgPSByZXNwb25zZS5ib2R5LmRhdGE/LnF1b3RhPy50aWVyO1xuICAgIGlmICghdGllciB8fCAhaXNWYWxpZFRpZXIodGllcikpIHJldHVybiB7IHRpZXI6IG51bGwsIHJlYXNvbjogJ2ludmFsaWQtdGllcicsIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUgfTtcbiAgICByZXR1cm4geyB0aWVyLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNoZWNrKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFDaGVja1Jlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vJHtlbmNvZGVVUklDb21wb25lbnQocXVvdGFUeXBlKX1gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8e1xuICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgICAgICBkYXRhPzogeyBxdW90YVR5cGU6IHN0cmluZzsgc3RhdHVzOiBRdW90YUNoZWNrUmVzdWx0IH07XG4gICAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIHNlcnZpY2UgdW5yZWFjaGFibGUsIGFsbG93aW5nIHJlcXVlc3QnLCB7IG9yZ0lkLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ2NoZWNrJywgcmVhc29uOiAndW5yZWFjaGFibGUnLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVGYWlsT3BlblJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFyZXNwb25zZS5ib2R5LnN1Y2Nlc3MgfHwgIXJlc3BvbnNlLmJvZHkuZGF0YT8uc3RhdHVzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIGNoZWNrIHJldHVybmVkIG5vbi1vaywgYWxsb3dpbmcgcmVxdWVzdCcsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLCBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9vcGVuX3RvdGFsJywgeyBvcGVyYXRpb246ICdjaGVjaycsIHJlYXNvbjogJ25vbi1vaycsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZhaWxPcGVuUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZS5ib2R5LmRhdGEuc3RhdHVzO1xuICAgIH0sXG5cbiAgICBhc3luYyBpbmNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2luY3JlbWVudGA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50XG4gICAgICAgIC5wb3N0KHBhdGgsIHsgcXVvdGFUeXBlLCBhbW91bnQgfSwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCksIC4uLlFVT1RBX1JFUVVFU1RfT1BUSU9OUyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBpbmNyZW1lbnQgcXVvdGEnLCB7XG4gICAgICAgICAgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50LCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1F1b3RhIGluY3JlbWVudGVkJywgeyBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlc2VydmUob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhUmVzZXJ2ZVJlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vaW5jcmVtZW50YDtcblxuICAgICAgLy8gMjAwIGNhcnJpZXMgYGRhdGEucXVvdGFgOyA0MjkgKFFVT1RBX0VYQ0VFREVEKSBjYXJyaWVzIGBkZXRhaWxzLnF1b3RhYC5cbiAgICAgIC8vIEJvdGggc2hhcGVzIGFyZSBub3JtYWxpemVkIGludG8gUXVvdGFSZXNlcnZlUmVzdWx0LlxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDx7XG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIGRhdGE/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIGRldGFpbHM/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIC8qKiBgc2VuZEVycm9yYCdzIGVycm9yLWNvZGUgZmllbGQuICovXG4gICAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IHF1b3RhVHlwZSwgYW1vdW50IH0sIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UpIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ3VucmVhY2hhYmxlJyk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MjkpIHtcbiAgICAgICAgY29uc3QgcSA9IHJlc3BvbnNlLmJvZHkuZGV0YWlscz8ucXVvdGE7XG4gICAgICAgIC8vIE9ubHkgYSBHRU5VSU5FIHF1b3RhLWV4Y2VlZGVkIDQyOSBtZWFucyBcIm92ZXIgcXVvdGFcIi4gQSBnZW5lcmljIDQyOSDigJRcbiAgICAgICAgLy8gYW4gaW50ZXJ2ZW5pbmcgZ2F0ZXdheSBvciByYXRlIGxpbWl0ZXIg4oCUIGRpZCBub3QgY29uZmlybSBhbnl0aGluZywgc29cbiAgICAgICAgLy8gaXQgZ29lcyB0aHJvdWdoIHRoZSBzYW1lIHVuY29uZmlybWVkLXJlc2VydmF0aW9uIHBvbGljeSBhcyBhbiBvdXRhZ2UuXG4gICAgICAgIGlmIChyZXNwb25zZS5ib2R5LmNvZGUgPT09IEVycm9yQ29kZS5RVU9UQV9FWENFRURFRCB8fCBxKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4Y2VlZGVkOiB0cnVlLFxuICAgICAgICAgICAgcXVvdGE6IHEgPz8geyB0eXBlOiBxdW90YVR5cGUsIGxpbWl0OiAwLCB1c2VkOiAwLCByZW1haW5pbmc6IDAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ3RyYW5zaWVudC00MjknLCByZXNwb25zZS5zdGF0dXNDb2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCB8fCAhcmVzcG9uc2UuYm9keS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ25vbi1vaycsIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxID0gcmVzcG9uc2UuYm9keS5kYXRhPy5xdW90YTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4Y2VlZGVkOiBmYWxzZSxcbiAgICAgICAgcXVvdGE6IHEgPz8geyB0eXBlOiBxdW90YVR5cGUsIGxpbWl0OiAtMSwgdXNlZDogMCwgcmVtYWluaW5nOiAtMSB9LFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVjcmVtZW50KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyID0gMSwgcmVzZXRBdFNuYXBzaG90Pzogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2RlY3JlbWVudGA7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudFxuICAgICAgICAucG9zdChwYXRoLCB7IHF1b3RhVHlwZSwgYW1vdW50LCAuLi4ocmVzZXRBdFNuYXBzaG90ICYmIHsgcmVzZXRBdFNuYXBzaG90IH0pIH0sIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgIC8vIFJvbGxiYWNrIGZhaWx1cmUgaXMgbG9nZ2VkIGJ1dCBuZXZlciBwcm9wYWdhdGVkICB0aGUgYWN0aW9uJ3Mgb3duXG4gICAgICAgIC8vIGZhaWx1cmUgaGFzIGFscmVhZHkgYmVlbiBzdXJmYWNlZCB0byB0aGUgY2FsbGVyOyBhIHN0dWNrIGNvdW50ZXJcbiAgICAgICAgLy8gcmVzb2x2ZXMgb24gdGhlIG5leHQgcGVyaW9kIHJlc2V0LlxuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGRlY3JlbWVudCBxdW90YSAoc2xvdCB3aWxsIHJlc2V0IG9uIG5leHQgcGVyaW9kKScsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUXVvdGEgZGVjcmVtZW50ZWQnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIGFtb3VudCB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGllcihvcmdJZDogc3RyaW5nLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFUaWVyPiB7XG4gICAgICBjb25zdCByZWFkID0gYXdhaXQgcmVhZFRpZXIob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCk7XG4gICAgICBpZiAocmVhZC50aWVyKSByZXR1cm4gcmVhZC50aWVyO1xuICAgICAgbG9nZ2VyLndhcm4oYFFVT1RBX0ZBSUxfT1BFTjogdGllciBsb29rdXAgZmFpbGVkLCBkZWZhdWx0aW5nIHRvICR7REVGQVVMVF9USUVSfSB0aWVyYCwge1xuICAgICAgICBvcmdJZCwgc3RhdHVzQ29kZTogcmVhZC5zdGF0dXNDb2RlLCByZWFzb246IHJlYWQucmVhc29uLCBkZWZhdWx0VGllcjogREVGQVVMVF9USUVSLFxuICAgICAgfSk7XG4gICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9vcGVuX3RvdGFsJywgeyBvcGVyYXRpb246ICd0aWVyJywgcmVhc29uOiByZWFkLnJlYXNvbiwgcXVvdGFUeXBlOiAndGllcicgfSk7XG4gICAgICByZXR1cm4gREVGQVVMVF9USUVSO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaWVyU3RyaWN0KG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVRpZXIgfCBudWxsPiB7XG4gICAgICBjb25zdCByZWFkID0gYXdhaXQgcmVhZFRpZXIob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCk7XG4gICAgICBpZiAocmVhZC50aWVyKSByZXR1cm4gcmVhZC50aWVyO1xuICAgICAgbG9nZ2VyLndhcm4oJ1FVT1RBX0ZBSUxfQ0xPU0VEOiB0aWVyIGNvdWxkIG5vdCBiZSBjb25maXJtZWQnLCB7IG9yZ0lkLCBzdGF0dXNDb2RlOiByZWFkLnN0YXR1c0NvZGUsIHJlYXNvbjogcmVhZC5yZWFzb24gfSk7XG4gICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9jbG9zZWRfdG90YWwnLCB7IG9wZXJhdGlvbjogJ3RpZXInLCByZWFzb246IHJlYWQucmVhc29uLCBxdW90YVR5cGU6ICd0aWVyJyB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogRmlyZS1hbmQtZm9yZ2V0IHF1b3RhIE1FVEVSSU5HIGluY3JlbWVudCB3aXRoIHN0YW5kYXJkaXplZCBlcnJvciBsb2dnaW5nLlxuICpcbiAqIEF1dGhlbnRpY2F0ZXMgYXMgdGhlIGNhbGxpbmcgU0VSVklDRSAoe0BsaW5rIGdldFF1b3RhU2VydmljZUF1dGhIZWFkZXJ9KSwgbmV2ZXJcbiAqIHdpdGggdGhlIGVuZCB1c2VyJ3MgdG9rZW46IGAvcXVvdGFzLzpvcmdJZC9pbmNyZW1lbnRgIGlzIHNlcnZpY2UtcHJpbmNpcGFsIC9cbiAqIHN5c3RlbS1hZG1pbiBvbmx5LCBzbyBhIGZvcndhcmRlZCB1c2VyIEpXVCB3YXMgYWx3YXlzIHJlamVjdGVkICg0MDMpIGFuZCB0aGVcbiAqIG1ldGVyZWQgcXVvdGEgKGUuZy4gYGFwaUNhbGxzYCwgYW5kIHRoZSBgYXBpX3BhY2tgIGJ1bmRsZSByYWlzaW5nIGl0KSBuZXZlclxuICogbW92ZWQuXG4gKlxuICogQHBhcmFtIHF1b3RhU2VydmljZSAtIFF1b3RhIHNlcnZpY2UgY2xpZW50XG4gKiBAcGFyYW0gb3JnSWQgLSBPcmdhbml6YXRpb24gSUQgd2hvc2UgY291bnRlciBpcyBpbmNyZW1lbnRlZFxuICogQHBhcmFtIHF1b3RhVHlwZSAtIFF1b3RhIHR5cGUgdG8gaW5jcmVtZW50XG4gKiBAcGFyYW0gbG9nV2FybiAtIExvZ2dpbmcgZnVuY3Rpb24gZm9yIHdhcm5pbmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRRdW90YSggcXVvdGFTZXJ2aWNlOiBRdW90YVNlcnZpY2UsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICBsb2dXYXJuOiAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZCxcbik6IHZvaWQge1xuICBxdW90YVNlcnZpY2UuaW5jcmVtZW50KG9yZ0lkLCBxdW90YVR5cGUsIGdldFF1b3RhU2VydmljZUF1dGhIZWFkZXIob3JnSWQpKS5jYXRjaCgoZXJyOiB1bmtub3duKSA9PlxuICAgIGxvZ1dhcm4oJ1F1b3RhIGluY3JlbWVudCBmYWlsZWQnLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBBdG9taWMgcmVzZXJ2ZSBoZWxwZXIgZm9yIHRoZSBcInJlc2VydmUgKyBjb21taXQgLyByb2xsYmFja1wiIHBhdHRlcm4uXG4gKiBVc2UgZm9yIGV4cGVuc2l2ZSByZXNvdXJjZXMgKHBpcGVsaW5lcywgcGx1Z2lucywgQUkgY2FsbHMpIHdoZXJlIHRoZVxuICogZmlyZS1hbmQtZm9yZ2V0IHBvc3QtaG9jIGBpbmNyZW1lbnRRdW90YWAgYWxsb3dzIGNvbmN1cnJlbnQgb3Zlci1zcGVuZC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIHJlc3VsdCBzbyB0aGUgY2FsbGVyIGNhbiBkZWNpZGUgd2hldGhlciB0byBydW5cbiAqIHRoZSBnYXRlZCBhY3Rpb24gb3IgNDI5IHRoZSBjbGllbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc2VydmF0aW9uID0gYXdhaXQgcmVzZXJ2ZVF1b3RhKHF1b3RhU2VydmljZSwgb3JnSWQsICdwaXBlbGluZXMnLCBhdXRoSGVhZGVyKTtcbiAqIGlmIChyZXNlcnZhdGlvbi5leGNlZWRlZCkgcmV0dXJuIHNlbmRRdW90YVJlc2VydmVEZW5pZWQocmVzLCAncGlwZWxpbmVzJywgcmVzZXJ2YXRpb24pO1xuICogdHJ5IHtcbiAqIGF3YWl0IGRvRXhwZW5zaXZlVGhpbmcoKTtcbiAqIH0gY2F0Y2ggKGVycikge1xuICogLy8gUGFzcyB0aGUgcmVzZXJ2ZWQgcmVzZXRBdCBzbyBhIHBlcmlvZCByb2xsb3ZlciBkb2Vzbid0IGdldCBkb3VibGUtY2hhcmdlZC5cbiAqIGRlY3JlbWVudFF1b3RhKHF1b3RhU2VydmljZSwgb3JnSWQsICdwaXBlbGluZXMnLCBhdXRoSGVhZGVyLCBsb2dXYXJuLCAxLCByZXNlcnZhdGlvbi5xdW90YS5yZXNldEF0KTtcbiAqIHRocm93IGVycjtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXJ2ZVF1b3RhKCBxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4gIGF1dGhIZWFkZXI6IHN0cmluZyxcbiAgYW1vdW50OiBudW1iZXIgPSAxLFxuICByZXF1ZXN0SWQ/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFF1b3RhUmVzZXJ2ZVJlc3VsdD4ge1xuICByZXR1cm4gcXVvdGFTZXJ2aWNlLnJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgYXV0aEhlYWRlciwgYW1vdW50LCByZXF1ZXN0SWQpO1xufVxuXG4vKiogU2Vjb25kcyBhIGNsaWVudCBzaG91bGQgd2FpdCBiZWZvcmUgcmV0cnlpbmcgd2hlbiBxdW90YSBjb3VsZG4ndCBiZSBjb25maXJtZWQuICovXG5jb25zdCBRVU9UQV9VTkFWQUlMQUJMRV9SRVRSWV9BRlRFUl9TRUNPTkRTID0gNTtcblxuLyoqXG4gKiBBbnN3ZXIgYSBERU5JRUQgcmVzZXJ2YXRpb24gKGByZXNlcnZhdGlvbi5leGNlZWRlZCA9PT0gdHJ1ZWApLlxuICpcbiAqIC0gYHVuYXZhaWxhYmxlYCAodGhlIHF1b3RhIHNlcnZpY2UgY291bGRuJ3QgY29uZmlybSB0aGUgc2xvdCkg4oaSICoqNTAzKipcbiAqICAgYFNFUlZJQ0VfVU5BVkFJTEFCTEVgIHdpdGggYSBzaG9ydCBgUmV0cnktQWZ0ZXJgOiB0aGUgb3JnIGlzIG5vdCBvdmVyIGl0c1xuICogICBsaW1pdCwgc28gYSA0MjkgXCJxdW90YSBleGNlZWRlZFwiIHdvdWxkIHNlbmQgdXNlcnMgdG8gdXBncmFkZSBmb3IgYW4gb3V0YWdlLlxuICogLSBvdGhlcndpc2Ug4oaSIHRoZSBzdGFuZGFyZCA0MjkgYFFVT1RBX0VYQ0VFREVEYCB3aXRoIHRoZSBYLVF1b3RhLSogaGVhZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbmRRdW90YVJlc2VydmVEZW5pZWQocmVzOiBSZXNwb25zZSwgcXVvdGFUeXBlOiBRdW90YVR5cGUsIHJlc2VydmF0aW9uOiBRdW90YVJlc2VydmVSZXN1bHQpOiB2b2lkIHtcbiAgaWYgKHJlc2VydmF0aW9uLnVuYXZhaWxhYmxlKSB7XG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHJlcy5zZXRIZWFkZXIoJ1JldHJ5LUFmdGVyJywgUVVPVEFfVU5BVkFJTEFCTEVfUkVUUllfQUZURVJfU0VDT05EUyk7XG4gICAgc2VuZEVycm9yKFxuICAgICAgcmVzLFxuICAgICAgNTAzLFxuICAgICAgYFVuYWJsZSB0byBjb25maXJtICR7cXVvdGFUeXBlfSBxdW90YSByaWdodCBub3cuIFBsZWFzZSB0cnkgYWdhaW4gc2hvcnRseS5gLFxuICAgICAgRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgc2VuZFF1b3RhRXhjZWVkZWQocmVzLCBxdW90YVR5cGUsIHJlc2VydmF0aW9uLnF1b3RhLCByZXNlcnZhdGlvbi5xdW90YS5yZXNldEF0KTtcbn1cblxuLyoqXG4gKiBGaXJlLWFuZC1mb3JnZXQgcm9sbGJhY2sgZm9yIGEgcHJldmlvdXNseSByZXNlcnZlZCBxdW90YSBzbG90LlxuICogTG9ncyBvbiBmYWlsdXJlIGJ1dCBuZXZlciB0aHJvd3MgIHRoZSBhY3Rpb24gdGhhdCBuZWVkZWQgdGhlIHJvbGxiYWNrXG4gKiBoYXMgYWxyZWFkeSBmYWlsZWQsIG5vIHBvaW50IGNvbXBvdW5kaW5nIHRoZSBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY3JlbWVudFF1b3RhKCBxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4gIGF1dGhIZWFkZXI6IHN0cmluZyxcbiAgbG9nV2FybjogKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQsXG4gIGFtb3VudDogbnVtYmVyID0gMSxcbiAgcmVzZXRBdFNuYXBzaG90Pzogc3RyaW5nLFxuKTogdm9pZCB7XG4gIHF1b3RhU2VydmljZS5kZWNyZW1lbnQob3JnSWQsIHF1b3RhVHlwZSwgYXV0aEhlYWRlciwgYW1vdW50LCByZXNldEF0U25hcHNob3QpLmNhdGNoKChlcnI6IHVua25vd24pID0+XG4gICAgbG9nV2FybignUXVvdGEgcm9sbGJhY2sgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSksXG4gICk7XG59XG4iXX0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type LockRedis } from './leader-lock.js';
|
|
1
|
+
import { type LeaderLockRun, type LockRedis } from './leader-lock.js';
|
|
2
2
|
/**
|
|
3
3
|
* Optional cross-pod single-runner lock for a scheduler's cycle. Without
|
|
4
4
|
* `redis` the scheduler uses the process's shared env-configured lock client
|
|
@@ -16,8 +16,17 @@ export interface SchedulerOptions {
|
|
|
16
16
|
name: string;
|
|
17
17
|
/** Interval between cycles (ms). */
|
|
18
18
|
intervalMs: number;
|
|
19
|
-
/**
|
|
20
|
-
|
|
19
|
+
/**
|
|
20
|
+
* The work to run each cycle. Errors are caught + logged, never thrown.
|
|
21
|
+
*
|
|
22
|
+
* `run.signal` is aborted when a leader-locked cycle LOSES its lock mid-run, or
|
|
23
|
+
* when `stop()` is called. A job that iterates over units of work (orgs, repos,
|
|
24
|
+
* entities) must check it between units and return: past a lock loss another pod
|
|
25
|
+
* may be doing the same work, and on shutdown returning promptly is what
|
|
26
|
+
* releases the lock instead of leaving it to expire. Unlocked schedulers get a
|
|
27
|
+
* signal too — it fires on `stop()` only.
|
|
28
|
+
*/
|
|
29
|
+
run: (run: LeaderLockRun) => Promise<void>;
|
|
21
30
|
/** Run a cycle immediately when started. Default true. */
|
|
22
31
|
runOnStart?: boolean;
|
|
23
32
|
/** Delay before the first cycle (and before the interval begins), ms.
|
|
@@ -30,7 +39,14 @@ export interface SchedulerOptions {
|
|
|
30
39
|
export interface Scheduler {
|
|
31
40
|
/** Start the timer. Idempotent — repeated calls are no-ops. */
|
|
32
41
|
start(): void;
|
|
33
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* Stop the timer (and cancel a pending startup delay). Safe before start.
|
|
44
|
+
*
|
|
45
|
+
* Also ABORTS an in-flight cycle's `run.signal` and defers closing the shared
|
|
46
|
+
* lock client until that cycle settles: a running cycle used to keep its lock
|
|
47
|
+
* key until the TTL lapsed, so a rolling deploy mid-run parked the job for the
|
|
48
|
+
* rest of the TTL. A signal-aware `run` returns and the lock is released.
|
|
49
|
+
*/
|
|
34
50
|
stop(): void;
|
|
35
51
|
}
|
|
36
52
|
/**
|
|
@@ -21,6 +21,10 @@ export function createScheduler(opts) {
|
|
|
21
21
|
/** The shared env client this scheduler holds a reference on (own-client locks don't). */
|
|
22
22
|
let envLock = null;
|
|
23
23
|
let holdsEnvLock = false;
|
|
24
|
+
/** Aborted by `stop()`, so an in-flight cycle can return and release its lock. */
|
|
25
|
+
let shutdown = new AbortController();
|
|
26
|
+
/** The in-flight cycle, so `stop()` can wait for it before closing the client. */
|
|
27
|
+
let inFlight = null;
|
|
24
28
|
const cycle = async () => {
|
|
25
29
|
// Same-pod re-entrancy guard: setInterval doesn't await the async cycle, so
|
|
26
30
|
// a cycle slower than intervalMs would otherwise overlap ITSELF on this pod
|
|
@@ -32,15 +36,20 @@ export function createScheduler(opts) {
|
|
|
32
36
|
return;
|
|
33
37
|
}
|
|
34
38
|
running = true;
|
|
39
|
+
const signal = shutdown.signal;
|
|
35
40
|
try {
|
|
36
41
|
const redis = opts.lock ? (opts.lock.redis ? opts.lock.redis() : envLock) : null;
|
|
37
42
|
if (opts.lock && redis) {
|
|
38
|
-
|
|
43
|
+
// withLeaderLock merges `signal` into the run's own, so `run` sees a single
|
|
44
|
+
// signal for both "lock lost" and "shutting down".
|
|
45
|
+
const ran = await withLeaderLock(redis, opts.lock.key, opts.lock.ttlMs, opts.run, { signal });
|
|
39
46
|
if (!ran)
|
|
40
47
|
log.debug('Cycle skipped — another pod holds the lock');
|
|
41
48
|
}
|
|
42
49
|
else {
|
|
43
|
-
|
|
50
|
+
// Unlocked: still give the job a signal, so `stop()` can cut a long cycle
|
|
51
|
+
// short rather than waiting for it during shutdown.
|
|
52
|
+
await opts.run({ signal });
|
|
44
53
|
}
|
|
45
54
|
}
|
|
46
55
|
catch (err) {
|
|
@@ -50,12 +59,18 @@ export function createScheduler(opts) {
|
|
|
50
59
|
running = false;
|
|
51
60
|
}
|
|
52
61
|
};
|
|
62
|
+
/** Run a cycle and publish it as `inFlight` so `stop()` can await it. */
|
|
63
|
+
const runCycle = () => {
|
|
64
|
+
const p = cycle().finally(() => { if (inFlight === p)
|
|
65
|
+
inFlight = null; });
|
|
66
|
+
inFlight = p;
|
|
67
|
+
};
|
|
53
68
|
const begin = () => {
|
|
54
69
|
if (stopped)
|
|
55
70
|
return; // stop() called during the startup delay
|
|
56
71
|
if (opts.runOnStart !== false)
|
|
57
|
-
|
|
58
|
-
interval = setInterval(() =>
|
|
72
|
+
runCycle();
|
|
73
|
+
interval = setInterval(() => runCycle(), opts.intervalMs);
|
|
59
74
|
interval.unref();
|
|
60
75
|
};
|
|
61
76
|
return {
|
|
@@ -63,6 +78,10 @@ export function createScheduler(opts) {
|
|
|
63
78
|
if (interval || startup)
|
|
64
79
|
return;
|
|
65
80
|
stopped = false;
|
|
81
|
+
// A restart needs a fresh controller: the previous stop() aborted the old
|
|
82
|
+
// one, and an already-aborted signal would make every cycle a no-op.
|
|
83
|
+
if (shutdown.signal.aborted)
|
|
84
|
+
shutdown = new AbortController();
|
|
66
85
|
if (opts.lock && !opts.lock.redis && !holdsEnvLock) {
|
|
67
86
|
envLock = acquireSharedEnvLock();
|
|
68
87
|
holdsEnvLock = true;
|
|
@@ -86,13 +105,24 @@ export function createScheduler(opts) {
|
|
|
86
105
|
clearInterval(interval);
|
|
87
106
|
interval = null;
|
|
88
107
|
}
|
|
108
|
+
// Ask an in-flight cycle to wind up. A signal-aware `run` returns between
|
|
109
|
+
// units of work, which lets withLeaderLock's `finally` RELEASE the lock —
|
|
110
|
+
// otherwise the key sat there until the TTL lapsed and the job was parked
|
|
111
|
+
// fleet-wide for that long after every rolling deploy.
|
|
112
|
+
if (!shutdown.signal.aborted)
|
|
113
|
+
shutdown.abort('shutdown');
|
|
89
114
|
if (holdsEnvLock) {
|
|
90
115
|
holdsEnvLock = false;
|
|
116
|
+
const pending = inFlight;
|
|
91
117
|
envLock = null;
|
|
92
|
-
|
|
118
|
+
// Closing the client under a running cycle kills its heartbeat and its
|
|
119
|
+
// release, so wait for the cycle to settle first. Bounded by the cycle
|
|
120
|
+
// itself, which is now being asked to stop.
|
|
121
|
+
void (pending ? pending.catch(() => undefined) : Promise.resolve())
|
|
122
|
+
.then(() => releaseSharedEnvLock());
|
|
93
123
|
}
|
|
94
124
|
log.info('Scheduler stopped');
|
|
95
125
|
},
|
|
96
126
|
};
|
|
97
127
|
}
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NjaGVkdWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQWtCLE1BQU0sa0JBQWtCLENBQUM7QUFDOUcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQXVDcEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQXNCO0lBQ3BELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsSUFBSSxRQUFRLEdBQTBDLElBQUksQ0FBQztJQUMzRCxJQUFJLE9BQU8sR0FBeUMsSUFBSSxDQUFDO0lBQ3pELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEIsMEZBQTBGO0lBQzFGLElBQUksT0FBTyxHQUFxQixJQUFJLENBQUM7SUFDckMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXpCLE1BQU0sS0FBSyxHQUFHLEtBQUssSUFBbUIsRUFBRTtRQUN0Qyw0RUFBNEU7UUFDNUUsNEVBQTRFO1FBQzVFLDZFQUE2RTtRQUM3RSw4RUFBOEU7UUFDOUUscUJBQXFCO1FBQ3JCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixHQUFHLENBQUMsS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDakYsT0FBTztRQUNULENBQUM7UUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENB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SSxDQUFDO1lBQUMsQ0FBQztZQUMzRCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNmLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztZQUM5QixDQUFDO1lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBhY3F1aXJlU2hhcmVkRW52TG9jaywgcmVsZWFzZVNoYXJlZEVudkxvY2ssIHdpdGhMZWFkZXJMb2NrLCB0eXBlIExvY2tSZWRpcyB9IGZyb20gJy4vbGVhZGVyLWxvY2suanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuLyoqXG4gKiBPcHRpb25hbCBjcm9zcy1wb2Qgc2luZ2xlLXJ1bm5lciBsb2NrIGZvciBhIHNjaGVkdWxlcidzIGN5Y2xlLiBXaXRob3V0XG4gKiBgcmVkaXNgIHRoZSBzY2hlZHVsZXIgdXNlcyB0aGUgcHJvY2VzcydzIHNoYXJlZCBlbnYtY29uZmlndXJlZCBsb2NrIGNsaWVudFxuICogKHRha2VuIG9uIGBzdGFydGAsIHJlbGVhc2VkIG9uIGBzdG9wYCk7IHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZCB0aGUgY3ljbGVcbiAqIHJ1bnMgb24gZXZlcnkgcG9kLCBzbyB0aGUgd29yayBpdCB3cmFwcyBtdXN0IHN0YXkgc2FmZSB0byBydW4gY29uY3VycmVudGx5LlxuICogQSBzdXBwbGllZCBgcmVkaXNgIGZhY3RvcnkgaXMgcmVzb2x2ZWQgcGVyIGN5Y2xlIChlLmcuIGEgQnVsbE1RIGNvbm5lY3Rpb24pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlckxvY2sge1xuICBrZXk6IHN0cmluZztcbiAgdHRsTXM6IG51bWJlcjtcbiAgcmVkaXM/OiAoKSA9PiBMb2NrUmVkaXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyT3B0aW9ucyB7XG4gIC8qKiBMb2cgbGFiZWwgKGFsc28gdGhlIGxvZ2dlciBuYW1lKS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogSW50ZXJ2YWwgYmV0d2VlbiBjeWNsZXMgKG1zKS4gKi9cbiAgaW50ZXJ2YWxNczogbnVtYmVyO1xuICAvKiogVGhlIHdvcmsgdG8gcnVuIGVhY2ggY3ljbGUuIEVycm9ycyBhcmUgY2F1Z2h0ICsgbG9nZ2VkLCBuZXZlciB0aHJvd24uICovXG4gIHJ1bjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJ1biBhIGN5Y2xlIGltbWVkaWF0ZWx5IHdoZW4gc3RhcnRlZC4gRGVmYXVsdCB0cnVlLiAqL1xuICBydW5PblN0YXJ0PzogYm9vbGVhbjtcbiAgLyoqIERlbGF5IGJlZm9yZSB0aGUgZmlyc3QgY3ljbGUgKGFuZCBiZWZvcmUgdGhlIGludGVydmFsIGJlZ2lucyksIG1zLlxuICAgKiAgRGVmYXVsdCAwLiBMZXRzIGEgc2VydmljZSB3YWl0IGZvciBkZXBlbmRlbmNpZXMgdG8gY29tZSB1cC4gKi9cbiAgc3RhcnR1cERlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGVuIHNldCwgZWFjaCBjeWNsZSBydW5zIG9ubHkgb24gdGhlIHBvZCB0aGF0IHdpbnMgdGhpcyBsb2NrIOKAlCBzbyB3aXRoXG4gICAqICBtdWx0aXBsZSByZXBsaWNhcyBvbmx5IG9uZSBydW5zIHBlciB3aW5kb3cuICovXG4gIGxvY2s/OiBTY2hlZHVsZXJMb2NrO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlciB7XG4gIC8qKiBTdGFydCB0aGUgdGltZXIuIElkZW1wb3RlbnQg4oCUIHJlcGVhdGVkIGNhbGxzIGFyZSBuby1vcHMuICovXG4gIHN0YXJ0KCk6IHZvaWQ7XG4gIC8qKiBTdG9wIHRoZSB0aW1lciAoYW5kIGNhbmNlbCBhIHBlbmRpbmcgc3RhcnR1cCBkZWxheSkuIFNhZmUgYmVmb3JlIHN0YXJ0LiAqL1xuICBzdG9wKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBwZXJpb2RpYyBiYWNrZ3JvdW5kIGpvYjogYSBzaW5nbGUgdW5yZWYnZCBgc2V0SW50ZXJ2YWxgIHdpdGggc3RhcnQtb25jZVxuICogc2VtYW50aWNzLCBlcnJvciBpc29sYXRpb24gKGEgdGhyb3dpbmcgY3ljbGUgaXMgbG9nZ2VkLCBuZXZlciBjcmFzaGVzIHRoZVxuICogbG9vcCksIGFuIG9wdGlvbmFsIHN0YXJ0dXAgZGVsYXksIGFuZCBhbiBvcHRpb25hbCBjcm9zcy1wb2QgbGVhZGVyIGxvY2suXG4gKlxuICogUmVwbGFjZXMgdGhlIGhhbmQtcm9sbGVkIHRpbWVyL2B1bnJlZmAvYGNhdGNoYC9zdGFydC1zdG9wIGJvaWxlcnBsYXRlIHRoYXRcbiAqIGVhY2ggc2NoZWR1bGVyIChzY2FuLCBkaWdlc3QsIHJlZ2lzdHJ5IEdDLCBiaWxsaW5nIGxpZmVjeWNsZSkgcmVwZWF0ZWQsIGFuZFxuICogbWFrZXMgdGhlIGxlYWRlciBsb2NrIGF2YWlsYWJsZSB0byBhbGwgb2YgdGhlbSB1bmlmb3JtbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTY2hlZHVsZXIob3B0czogU2NoZWR1bGVyT3B0aW9ucyk6IFNjaGVkdWxlciB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihvcHRzLm5hbWUpO1xuICBsZXQgaW50ZXJ2YWw6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuICBsZXQgc3RhcnR1cDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgbGV0IHJ1bm5pbmcgPSBmYWxzZTtcbiAgLyoqIFRoZSBzaGFyZWQgZW52IGNsaWVudCB0aGlzIHNjaGVkdWxlciBob2xkcyBhIHJlZmVyZW5jZSBvbiAob3duLWNsaWVudCBsb2NrcyBkb24ndCkuICovXG4gIGxldCBlbnZMb2NrOiBMb2NrUmVkaXMgfCBudWxsID0gbnVsbDtcbiAgbGV0IGhvbGRzRW52TG9jayA9IGZhbHNlO1xuXG4gIGNvbnN0IGN5Y2xlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIFNhbWUtcG9kIHJlLWVudHJhbmN5IGd1YXJkOiBzZXRJbnRlcnZhbCBkb2Vzbid0IGF3YWl0IHRoZSBhc3luYyBjeWNsZSwgc29cbiAgICAvLyBhIGN5Y2xlIHNsb3dlciB0aGFuIGludGVydmFsTXMgd291bGQgb3RoZXJ3aXNlIG92ZXJsYXAgSVRTRUxGIG9uIHRoaXMgcG9kXG4gICAgLy8gKGRvdWJsZS1wcm9jZXNzaW5nLCBkdXBsaWNhdGUgc2lkZSBlZmZlY3RzKS4gVGhlIG9wdGlvbmFsIGxlYWRlciBsb2NrIG9ubHlcbiAgICAvLyBndWFyZHMgQ1JPU1MtcG9kIG92ZXJsYXA7IHRoaXMgZ3VhcmRzIHNhbWUtcG9kLiBBIHNraXBwZWQgdGljayBqdXN0IHJ1bnMgb25cbiAgICAvLyB0aGUgbmV4dCBpbnRlcnZhbC5cbiAgICBpZiAocnVubmluZykge1xuICAgICAgbG9nLmRlYnVnKCdDeWNsZSBza2lwcGVkIOKAlCBwcmV2aW91cyBjeWNsZSBzdGlsbCBydW5uaW5nIChzYW1lLXBvZCByZS1lbnRyYW5jeSknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcnVubmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZGlzID0gb3B0cy5sb2NrID8gKG9wdHMubG9jay5yZWRpcyA/IG9wdHMubG9jay5yZWRpcygpIDogZW52TG9jaykgOiBudWxsO1xuICAgICAgaWYgKG9wdHMubG9jayAmJiByZWRpcykge1xuICAgICAgICBjb25zdCByYW4gPSBhd2FpdCB3aXRoTGVhZGVyTG9jayhyZWRpcywgb3B0cy5sb2NrLmtleSwgb3B0cy5sb2NrLnR0bE1zLCBvcHRzLnJ1bik7XG4gICAgICAgIGlmICghcmFuKSBsb2cuZGVidWcoJ0N5Y2xlIHNraXBwZWQg4oCUIGFub3RoZXIgcG9kIGhvbGRzIHRoZSBsb2NrJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBvcHRzLnJ1bigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yKCdTY2hlZHVsZXIgY3ljbGUgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYmVnaW4gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHN0b3BwZWQpIHJldHVybjsgLy8gc3RvcCgpIGNhbGxlZCBkdXJpbmcgdGhlIHN0YXJ0dXAgZGVsYXlcbiAgICBpZiAob3B0cy5ydW5PblN0YXJ0ICE9PSBmYWxzZSkgdm9pZCBjeWNsZSgpO1xuICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdm9pZCBjeWNsZSgpLCBvcHRzLmludGVydmFsTXMpO1xuICAgIGludGVydmFsLnVucmVmKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydCgpOiB2b2lkIHtcbiAgICAgIGlmIChpbnRlcnZhbCB8fCBzdGFydHVwKSByZXR1cm47XG4gICAgICBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBpZiAob3B0cy5sb2NrICYmICFvcHRzLmxvY2sucmVkaXMgJiYgIWhvbGRzRW52TG9jaykge1xuICAgICAgICBlbnZMb2NrID0gYWNxdWlyZVNoYXJlZEVudkxvY2soKTtcbiAgICAgICAgaG9sZHNFbnZMb2NrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLnN0YXJ0dXBEZWxheU1zICYmIG9wdHMuc3RhcnR1cERlbGF5TXMgPiAwKSB7XG4gICAgICAgIHN0YXJ0dXAgPSBzZXRUaW1lb3V0KCgpID0+IHsgc3RhcnR1cCA9IG51bGw7IGJlZ2luKCk7IH0sIG9wdHMuc3RhcnR1cERlbGF5TXMpO1xuICAgICAgICBzdGFydHVwLnVucmVmKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiZWdpbigpO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oJ1NjaGVkdWxlciBzdGFydGVkJywgeyBpbnRlcnZhbE1zOiBvcHRzLmludGVydmFsTXMsIGxvY2tlZDogISFvcHRzLmxvY2sgJiYgKCEhb3B0cy5sb2NrLnJlZGlzIHx8ICEhZW52TG9jaykgfSk7XG4gICAgfSxcbiAgICBzdG9wKCk6IHZvaWQge1xuICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICBpZiAoc3RhcnR1cCkgeyBjbGVhclRpbWVvdXQoc3RhcnR1cCk7IHN0YXJ0dXAgPSBudWxsOyB9XG4gICAgICBpZiAoaW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7IGludGVydmFsID0gbnVsbDsgfVxuICAgICAgaWYgKGhvbGRzRW52TG9jaykge1xuICAgICAgICBob2xkc0VudkxvY2sgPSBmYWxzZTtcbiAgICAgICAgZW52TG9jayA9IG51bGw7XG4gICAgICAgIHZvaWQgcmVsZWFzZVNoYXJlZEVudkxvY2soKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKCdTY2hlZHVsZXIgc3RvcHBlZCcpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NjaGVkdWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQXNDLE1BQU0sa0JBQWtCLENBQUM7QUFDbEksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQXVEcEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQXNCO0lBQ3BELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsSUFBSSxRQUFRLEdBQTBDLElBQUksQ0FBQztJQUMzRCxJQUFJLE9BQU8sR0FBeUMsSUFBSSxDQUFDO0lBQ3pELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEIsMEZBQTBGO0lBQzFGLElBQUksT0FBTyxHQUFxQixJQUFJLENBQUM7SUFDckMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLGtGQUFrRjtJQUNsRixJQUFJLFFBQVEsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3JDLGtGQUFrRjtJQUNsRixJQUFJLFFBQVEsR0FBeUIsSUFBSSxDQUFDO0lBRTFDLE1BQU0sS0FBSyxHQUFHLEtBQUssSUFBbUIsRUFBRTtRQUN0Qyw0RUFBNEU7UUFDNUUsNEVBQTRFO1FBQzVFLDZFQUE2RTtRQUM3RSw4RUFBOEU7UUFDOUUscUJBQXFCO1FBQ3JCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixHQUFHLENBQUMsS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDakYsT0FBTztRQUNULENBQUM7UUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2pGLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsNEVBQTRFO2dCQUM1RSxtREFBbUQ7Z0JBQ25ELE1BQU0sR0FBRyxHQUFHLE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDOUYsSUFBSSxDQUFDLEdBQUc7b0JBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7aUJBQU0sQ0FBQztnQkFDTiwwRUFBMEU7Z0JBQzFFLG9EQUFvRDtnQkFDcEQsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixHQUFHLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYseUVBQXlFO0lBQ3pFLE1BQU0sUUFBUSxHQUFHLEdBQVMsRUFBRTtRQUMxQixNQUFNLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxRQUFRLEtBQUssQ0FBQztZQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUYsTUFBTSxLQUFLLEdBQUcsR0FBUyxFQUFFO1FBQ3ZCLElBQUksT0FBTztZQUFFLE9BQU8sQ0FBQyx5Q0FBeUM7UUFDOUQsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUs7WUFBRSxRQUFRLEVBQUUsQ0FBQztRQUMxQyxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxRCxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUYsT0FBTztRQUNMLEtBQUs7WUFDSCxJQUFJLFFBQVEsSUFBSSxPQUFPO2dCQUFFLE9BQU87WUFDaEMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQiwwRUFBMEU7WUFDMUUscUVBQXFFO1lBQ3JFLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUFFLFFBQVEsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQzlELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ25ELE9BQU8sR0FBRyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNqQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssRUFBRSxDQUFDO1lBQ1YsQ0FBQztZQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxSCxDQUFDO1FBQ0QsSUFBSTtZQUNGLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQUMsQ0FBQztZQUN2RCxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQUMsQ0FBQztZQUMzRCwwRUFBMEU7WUFDMUUsMEVBQTBFO1lBQzFFLDBFQUEwRTtZQUMxRSx1REFBdUQ7WUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pELElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztnQkFDekIsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDZix1RUFBdUU7Z0JBQ3ZFLHVFQUF1RTtnQkFDdkUsNENBQTRDO2dCQUM1QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7cUJBQ2hFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNoQyxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgYWNxdWlyZVNoYXJlZEVudkxvY2ssIHJlbGVhc2VTaGFyZWRFbnZMb2NrLCB3aXRoTGVhZGVyTG9jaywgdHlwZSBMZWFkZXJMb2NrUnVuLCB0eXBlIExvY2tSZWRpcyB9IGZyb20gJy4vbGVhZGVyLWxvY2suanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuLyoqXG4gKiBPcHRpb25hbCBjcm9zcy1wb2Qgc2luZ2xlLXJ1bm5lciBsb2NrIGZvciBhIHNjaGVkdWxlcidzIGN5Y2xlLiBXaXRob3V0XG4gKiBgcmVkaXNgIHRoZSBzY2hlZHVsZXIgdXNlcyB0aGUgcHJvY2VzcydzIHNoYXJlZCBlbnYtY29uZmlndXJlZCBsb2NrIGNsaWVudFxuICogKHRha2VuIG9uIGBzdGFydGAsIHJlbGVhc2VkIG9uIGBzdG9wYCk7IHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZCB0aGUgY3ljbGVcbiAqIHJ1bnMgb24gZXZlcnkgcG9kLCBzbyB0aGUgd29yayBpdCB3cmFwcyBtdXN0IHN0YXkgc2FmZSB0byBydW4gY29uY3VycmVudGx5LlxuICogQSBzdXBwbGllZCBgcmVkaXNgIGZhY3RvcnkgaXMgcmVzb2x2ZWQgcGVyIGN5Y2xlIChlLmcuIGEgQnVsbE1RIGNvbm5lY3Rpb24pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlckxvY2sge1xuICBrZXk6IHN0cmluZztcbiAgdHRsTXM6IG51bWJlcjtcbiAgcmVkaXM/OiAoKSA9PiBMb2NrUmVkaXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyT3B0aW9ucyB7XG4gIC8qKiBMb2cgbGFiZWwgKGFsc28gdGhlIGxvZ2dlciBuYW1lKS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogSW50ZXJ2YWwgYmV0d2VlbiBjeWNsZXMgKG1zKS4gKi9cbiAgaW50ZXJ2YWxNczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHdvcmsgdG8gcnVuIGVhY2ggY3ljbGUuIEVycm9ycyBhcmUgY2F1Z2h0ICsgbG9nZ2VkLCBuZXZlciB0aHJvd24uXG4gICAqXG4gICAqIGBydW4uc2lnbmFsYCBpcyBhYm9ydGVkIHdoZW4gYSBsZWFkZXItbG9ja2VkIGN5Y2xlIExPU0VTIGl0cyBsb2NrIG1pZC1ydW4sIG9yXG4gICAqIHdoZW4gYHN0b3AoKWAgaXMgY2FsbGVkLiBBIGpvYiB0aGF0IGl0ZXJhdGVzIG92ZXIgdW5pdHMgb2Ygd29yayAob3JncywgcmVwb3MsXG4gICAqIGVudGl0aWVzKSBtdXN0IGNoZWNrIGl0IGJldHdlZW4gdW5pdHMgYW5kIHJldHVybjogcGFzdCBhIGxvY2sgbG9zcyBhbm90aGVyIHBvZFxuICAgKiBtYXkgYmUgZG9pbmcgdGhlIHNhbWUgd29yaywgYW5kIG9uIHNodXRkb3duIHJldHVybmluZyBwcm9tcHRseSBpcyB3aGF0XG4gICAqIHJlbGVhc2VzIHRoZSBsb2NrIGluc3RlYWQgb2YgbGVhdmluZyBpdCB0byBleHBpcmUuIFVubG9ja2VkIHNjaGVkdWxlcnMgZ2V0IGFcbiAgICogc2lnbmFsIHRvbyDigJQgaXQgZmlyZXMgb24gYHN0b3AoKWAgb25seS5cbiAgICovXG4gIHJ1bjogKHJ1bjogTGVhZGVyTG9ja1J1bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJ1biBhIGN5Y2xlIGltbWVkaWF0ZWx5IHdoZW4gc3RhcnRlZC4gRGVmYXVsdCB0cnVlLiAqL1xuICBydW5PblN0YXJ0PzogYm9vbGVhbjtcbiAgLyoqIERlbGF5IGJlZm9yZSB0aGUgZmlyc3QgY3ljbGUgKGFuZCBiZWZvcmUgdGhlIGludGVydmFsIGJlZ2lucyksIG1zLlxuICAgKiAgRGVmYXVsdCAwLiBMZXRzIGEgc2VydmljZSB3YWl0IGZvciBkZXBlbmRlbmNpZXMgdG8gY29tZSB1cC4gKi9cbiAgc3RhcnR1cERlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGVuIHNldCwgZWFjaCBjeWNsZSBydW5zIG9ubHkgb24gdGhlIHBvZCB0aGF0IHdpbnMgdGhpcyBsb2NrIOKAlCBzbyB3aXRoXG4gICAqICBtdWx0aXBsZSByZXBsaWNhcyBvbmx5IG9uZSBydW5zIHBlciB3aW5kb3cuICovXG4gIGxvY2s/OiBTY2hlZHVsZXJMb2NrO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlciB7XG4gIC8qKiBTdGFydCB0aGUgdGltZXIuIElkZW1wb3RlbnQg4oCUIHJlcGVhdGVkIGNhbGxzIGFyZSBuby1vcHMuICovXG4gIHN0YXJ0KCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBTdG9wIHRoZSB0aW1lciAoYW5kIGNhbmNlbCBhIHBlbmRpbmcgc3RhcnR1cCBkZWxheSkuIFNhZmUgYmVmb3JlIHN0YXJ0LlxuICAgKlxuICAgKiBBbHNvIEFCT1JUUyBhbiBpbi1mbGlnaHQgY3ljbGUncyBgcnVuLnNpZ25hbGAgYW5kIGRlZmVycyBjbG9zaW5nIHRoZSBzaGFyZWRcbiAgICogbG9jayBjbGllbnQgdW50aWwgdGhhdCBjeWNsZSBzZXR0bGVzOiBhIHJ1bm5pbmcgY3ljbGUgdXNlZCB0byBrZWVwIGl0cyBsb2NrXG4gICAqIGtleSB1bnRpbCB0aGUgVFRMIGxhcHNlZCwgc28gYSByb2xsaW5nIGRlcGxveSBtaWQtcnVuIHBhcmtlZCB0aGUgam9iIGZvciB0aGVcbiAgICogcmVzdCBvZiB0aGUgVFRMLiBBIHNpZ25hbC1hd2FyZSBgcnVuYCByZXR1cm5zIGFuZCB0aGUgbG9jayBpcyByZWxlYXNlZC5cbiAgICovXG4gIHN0b3AoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIHBlcmlvZGljIGJhY2tncm91bmQgam9iOiBhIHNpbmdsZSB1bnJlZidkIGBzZXRJbnRlcnZhbGAgd2l0aCBzdGFydC1vbmNlXG4gKiBzZW1hbnRpY3MsIGVycm9yIGlzb2xhdGlvbiAoYSB0aHJvd2luZyBjeWNsZSBpcyBsb2dnZWQsIG5ldmVyIGNyYXNoZXMgdGhlXG4gKiBsb29wKSwgYW4gb3B0aW9uYWwgc3RhcnR1cCBkZWxheSwgYW5kIGFuIG9wdGlvbmFsIGNyb3NzLXBvZCBsZWFkZXIgbG9jay5cbiAqXG4gKiBSZXBsYWNlcyB0aGUgaGFuZC1yb2xsZWQgdGltZXIvYHVucmVmYC9gY2F0Y2hgL3N0YXJ0LXN0b3AgYm9pbGVycGxhdGUgdGhhdFxuICogZWFjaCBzY2hlZHVsZXIgKHNjYW4sIGRpZ2VzdCwgcmVnaXN0cnkgR0MsIGJpbGxpbmcgbGlmZWN5Y2xlKSByZXBlYXRlZCwgYW5kXG4gKiBtYWtlcyB0aGUgbGVhZGVyIGxvY2sgYXZhaWxhYmxlIHRvIGFsbCBvZiB0aGVtIHVuaWZvcm1seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjaGVkdWxlcihvcHRzOiBTY2hlZHVsZXJPcHRpb25zKTogU2NoZWR1bGVyIHtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKG9wdHMubmFtZSk7XG4gIGxldCBpbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIGxldCBzdGFydHVwOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICBsZXQgcnVubmluZyA9IGZhbHNlO1xuICAvKiogVGhlIHNoYXJlZCBlbnYgY2xpZW50IHRoaXMgc2NoZWR1bGVyIGhvbGRzIGEgcmVmZXJlbmNlIG9uIChvd24tY2xpZW50IGxvY2tzIGRvbid0KS4gKi9cbiAgbGV0IGVudkxvY2s6IExvY2tSZWRpcyB8IG51bGwgPSBudWxsO1xuICBsZXQgaG9sZHNFbnZMb2NrID0gZmFsc2U7XG4gIC8qKiBBYm9ydGVkIGJ5IGBzdG9wKClgLCBzbyBhbiBpbi1mbGlnaHQgY3ljbGUgY2FuIHJldHVybiBhbmQgcmVsZWFzZSBpdHMgbG9jay4gKi9cbiAgbGV0IHNodXRkb3duID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAvKiogVGhlIGluLWZsaWdodCBjeWNsZSwgc28gYHN0b3AoKWAgY2FuIHdhaXQgZm9yIGl0IGJlZm9yZSBjbG9zaW5nIHRoZSBjbGllbnQuICovXG4gIGxldCBpbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IGN5Y2xlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIFNhbWUtcG9kIHJlLWVudHJhbmN5IGd1YXJkOiBzZXRJbnRlcnZhbCBkb2Vzbid0IGF3YWl0IHRoZSBhc3luYyBjeWNsZSwgc29cbiAgICAvLyBhIGN5Y2xlIHNsb3dlciB0aGFuIGludGVydmFsTXMgd291bGQgb3RoZXJ3aXNlIG92ZXJsYXAgSVRTRUxGIG9uIHRoaXMgcG9kXG4gICAgLy8gKGRvdWJsZS1wcm9jZXNzaW5nLCBkdXBsaWNhdGUgc2lkZSBlZmZlY3RzKS4gVGhlIG9wdGlvbmFsIGxlYWRlciBsb2NrIG9ubHlcbiAgICAvLyBndWFyZHMgQ1JPU1MtcG9kIG92ZXJsYXA7IHRoaXMgZ3VhcmRzIHNhbWUtcG9kLiBBIHNraXBwZWQgdGljayBqdXN0IHJ1bnMgb25cbiAgICAvLyB0aGUgbmV4dCBpbnRlcnZhbC5cbiAgICBpZiAocnVubmluZykge1xuICAgICAgbG9nLmRlYnVnKCdDeWNsZSBza2lwcGVkIOKAlCBwcmV2aW91cyBjeWNsZSBzdGlsbCBydW5uaW5nIChzYW1lLXBvZCByZS1lbnRyYW5jeSknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcnVubmluZyA9IHRydWU7XG4gICAgY29uc3Qgc2lnbmFsID0gc2h1dGRvd24uc2lnbmFsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWRpcyA9IG9wdHMubG9jayA/IChvcHRzLmxvY2sucmVkaXMgPyBvcHRzLmxvY2sucmVkaXMoKSA6IGVudkxvY2spIDogbnVsbDtcbiAgICAgIGlmIChvcHRzLmxvY2sgJiYgcmVkaXMpIHtcbiAgICAgICAgLy8gd2l0aExlYWRlckxvY2sgbWVyZ2VzIGBzaWduYWxgIGludG8gdGhlIHJ1bidzIG93biwgc28gYHJ1bmAgc2VlcyBhIHNpbmdsZVxuICAgICAgICAvLyBzaWduYWwgZm9yIGJvdGggXCJsb2NrIGxvc3RcIiBhbmQgXCJzaHV0dGluZyBkb3duXCIuXG4gICAgICAgIGNvbnN0IHJhbiA9IGF3YWl0IHdpdGhMZWFkZXJMb2NrKHJlZGlzLCBvcHRzLmxvY2sua2V5LCBvcHRzLmxvY2sudHRsTXMsIG9wdHMucnVuLCB7IHNpZ25hbCB9KTtcbiAgICAgICAgaWYgKCFyYW4pIGxvZy5kZWJ1ZygnQ3ljbGUgc2tpcHBlZCDigJQgYW5vdGhlciBwb2QgaG9sZHMgdGhlIGxvY2snKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVubG9ja2VkOiBzdGlsbCBnaXZlIHRoZSBqb2IgYSBzaWduYWwsIHNvIGBzdG9wKClgIGNhbiBjdXQgYSBsb25nIGN5Y2xlXG4gICAgICAgIC8vIHNob3J0IHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIGl0IGR1cmluZyBzaHV0ZG93bi5cbiAgICAgICAgYXdhaXQgb3B0cy5ydW4oeyBzaWduYWwgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cuZXJyb3IoJ1NjaGVkdWxlciBjeWNsZSBmYWlsZWQnLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvKiogUnVuIGEgY3ljbGUgYW5kIHB1Ymxpc2ggaXQgYXMgYGluRmxpZ2h0YCBzbyBgc3RvcCgpYCBjYW4gYXdhaXQgaXQuICovXG4gIGNvbnN0IHJ1bkN5Y2xlID0gKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHAgPSBjeWNsZSgpLmZpbmFsbHkoKCkgPT4geyBpZiAoaW5GbGlnaHQgPT09IHApIGluRmxpZ2h0ID0gbnVsbDsgfSk7XG4gICAgaW5GbGlnaHQgPSBwO1xuICB9O1xuXG4gIGNvbnN0IGJlZ2luID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChzdG9wcGVkKSByZXR1cm47IC8vIHN0b3AoKSBjYWxsZWQgZHVyaW5nIHRoZSBzdGFydHVwIGRlbGF5XG4gICAgaWYgKG9wdHMucnVuT25TdGFydCAhPT0gZmFsc2UpIHJ1bkN5Y2xlKCk7XG4gICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiBydW5DeWNsZSgpLCBvcHRzLmludGVydmFsTXMpO1xuICAgIGludGVydmFsLnVucmVmKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydCgpOiB2b2lkIHtcbiAgICAgIGlmIChpbnRlcnZhbCB8fCBzdGFydHVwKSByZXR1cm47XG4gICAgICBzdG9wcGVkID0gZmFsc2U7XG4gICAgICAvLyBBIHJlc3RhcnQgbmVlZHMgYSBmcmVzaCBjb250cm9sbGVyOiB0aGUgcHJldmlvdXMgc3RvcCgpIGFib3J0ZWQgdGhlIG9sZFxuICAgICAgLy8gb25lLCBhbmQgYW4gYWxyZWFkeS1hYm9ydGVkIHNpZ25hbCB3b3VsZCBtYWtlIGV2ZXJ5IGN5Y2xlIGEgbm8tb3AuXG4gICAgICBpZiAoc2h1dGRvd24uc2lnbmFsLmFib3J0ZWQpIHNodXRkb3duID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgaWYgKG9wdHMubG9jayAmJiAhb3B0cy5sb2NrLnJlZGlzICYmICFob2xkc0VudkxvY2spIHtcbiAgICAgICAgZW52TG9jayA9IGFjcXVpcmVTaGFyZWRFbnZMb2NrKCk7XG4gICAgICAgIGhvbGRzRW52TG9jayA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5zdGFydHVwRGVsYXlNcyAmJiBvcHRzLnN0YXJ0dXBEZWxheU1zID4gMCkge1xuICAgICAgICBzdGFydHVwID0gc2V0VGltZW91dCgoKSA9PiB7IHN0YXJ0dXAgPSBudWxsOyBiZWdpbigpOyB9LCBvcHRzLnN0YXJ0dXBEZWxheU1zKTtcbiAgICAgICAgc3RhcnR1cC51bnJlZigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmVnaW4oKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKCdTY2hlZHVsZXIgc3RhcnRlZCcsIHsgaW50ZXJ2YWxNczogb3B0cy5pbnRlcnZhbE1zLCBsb2NrZWQ6ICEhb3B0cy5sb2NrICYmICghIW9wdHMubG9jay5yZWRpcyB8fCAhIWVudkxvY2spIH0pO1xuICAgIH0sXG4gICAgc3RvcCgpOiB2b2lkIHtcbiAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgaWYgKHN0YXJ0dXApIHsgY2xlYXJUaW1lb3V0KHN0YXJ0dXApOyBzdGFydHVwID0gbnVsbDsgfVxuICAgICAgaWYgKGludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOyBpbnRlcnZhbCA9IG51bGw7IH1cbiAgICAgIC8vIEFzayBhbiBpbi1mbGlnaHQgY3ljbGUgdG8gd2luZCB1cC4gQSBzaWduYWwtYXdhcmUgYHJ1bmAgcmV0dXJucyBiZXR3ZWVuXG4gICAgICAvLyB1bml0cyBvZiB3b3JrLCB3aGljaCBsZXRzIHdpdGhMZWFkZXJMb2NrJ3MgYGZpbmFsbHlgIFJFTEVBU0UgdGhlIGxvY2sg4oCUXG4gICAgICAvLyBvdGhlcndpc2UgdGhlIGtleSBzYXQgdGhlcmUgdW50aWwgdGhlIFRUTCBsYXBzZWQgYW5kIHRoZSBqb2Igd2FzIHBhcmtlZFxuICAgICAgLy8gZmxlZXQtd2lkZSBmb3IgdGhhdCBsb25nIGFmdGVyIGV2ZXJ5IHJvbGxpbmcgZGVwbG95LlxuICAgICAgaWYgKCFzaHV0ZG93bi5zaWduYWwuYWJvcnRlZCkgc2h1dGRvd24uYWJvcnQoJ3NodXRkb3duJyk7XG4gICAgICBpZiAoaG9sZHNFbnZMb2NrKSB7XG4gICAgICAgIGhvbGRzRW52TG9jayA9IGZhbHNlO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gaW5GbGlnaHQ7XG4gICAgICAgIGVudkxvY2sgPSBudWxsO1xuICAgICAgICAvLyBDbG9zaW5nIHRoZSBjbGllbnQgdW5kZXIgYSBydW5uaW5nIGN5Y2xlIGtpbGxzIGl0cyBoZWFydGJlYXQgYW5kIGl0c1xuICAgICAgICAvLyByZWxlYXNlLCBzbyB3YWl0IGZvciB0aGUgY3ljbGUgdG8gc2V0dGxlIGZpcnN0LiBCb3VuZGVkIGJ5IHRoZSBjeWNsZVxuICAgICAgICAvLyBpdHNlbGYsIHdoaWNoIGlzIG5vdyBiZWluZyBhc2tlZCB0byBzdG9wLlxuICAgICAgICB2b2lkIChwZW5kaW5nID8gcGVuZGluZy5jYXRjaCgoKSA9PiB1bmRlZmluZWQpIDogUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4gcmVsZWFzZVNoYXJlZEVudkxvY2soKSk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbygnU2NoZWR1bGVyIHN0b3BwZWQnKTtcbiAgICB9LFxuICB9O1xufVxuIl19
|
|
@@ -22,8 +22,6 @@ export declare class ServiceKeyError extends Error {
|
|
|
22
22
|
* audit and metric labels use, so there is one source of truth for "who am I".
|
|
23
23
|
*/
|
|
24
24
|
export declare function serviceIdentity(): string;
|
|
25
|
-
/** Whether this process signs with a mounted key (`configured`) or an in-process one. */
|
|
26
|
-
export declare function serviceKeyMode(): 'configured' | 'ephemeral';
|
|
27
25
|
/**
|
|
28
26
|
* Whether `kid` belongs to an internal SERVICE key. This is how a bearer token
|
|
29
27
|
* is routed between the two ES256 chains: both user and service tokens are
|
|
@@ -33,8 +31,6 @@ export declare function serviceKeyMode(): 'configured' | 'ephemeral';
|
|
|
33
31
|
* takes the user chain and is rejected there.
|
|
34
32
|
*/
|
|
35
33
|
export declare function isServiceKid(kid: string): boolean;
|
|
36
|
-
/** Every service name the bundle publishes a key for. Diagnostics and tests. */
|
|
37
|
-
export declare function knownServiceNames(): string[];
|
|
38
34
|
/**
|
|
39
35
|
* Sign `claims` as this service's internal token: ES256, `kid` = the signer's
|
|
40
36
|
* thumbprint, `sub` = `service:<serviceName>`. `iat`/`exp` and the optional
|