@pipeline-builder/api-core 4.1.7 → 4.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/lib/helpers/org-hierarchy.d.ts +19 -0
- package/lib/helpers/org-hierarchy.js +29 -1
- package/lib/index.d.ts +26 -0
- package/lib/index.js +27 -1
- package/lib/services/api-key-exchange.js +3 -2
- package/lib/services/audit-spool.js +3 -2
- package/lib/services/cache-service.js +5 -4
- package/lib/services/compliance-event-subscriber.js +3 -2
- package/lib/services/durable-event-bus.js +3 -2
- package/lib/services/entity-events.js +3 -2
- package/lib/services/env-redis.js +3 -2
- package/lib/services/http-client.js +8 -7
- package/lib/services/index.d.ts +6 -2
- package/lib/services/index.js +11 -3
- package/lib/services/jwks-cache.d.ts +0 -12
- package/lib/services/jwks-cache.js +7 -6
- package/lib/services/leader-lock.js +3 -2
- package/lib/services/notification-channels.d.ts +112 -0
- package/lib/services/notification-channels.js +123 -0
- package/lib/services/quota.js +4 -4
- package/lib/services/remote-audit-client.d.ts +1 -1
- package/lib/services/remote-audit-client.js +4 -4
- package/lib/services/retry-forever.d.ts +37 -0
- package/lib/services/retry-forever.js +58 -0
- package/lib/services/retry-strategy.d.ts +7 -3
- package/lib/services/retry-strategy.js +2 -2
- package/lib/services/scheduler.js +2 -2
- package/lib/services/service-boot.d.ts +20 -4
- package/lib/services/service-boot.js +10 -6
- package/lib/services/service-keys.js +6 -5
- package/lib/services/sse-ticket-store.js +3 -2
- package/lib/services/token-revocation.js +6 -5
- package/lib/testing/mock-api-core.d.ts +150 -0
- package/lib/testing/mock-api-core.js +246 -0
- package/lib/testing/mock-drizzle.d.ts +6 -0
- package/lib/testing/mock-drizzle.js +57 -0
- package/lib/types/http.d.ts +4 -0
- package/lib/types/http.js +1 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.js +2 -1
- package/lib/types/metadata-keys.d.ts +543 -0
- package/lib/types/metadata-keys.js +117 -0
- package/lib/types/permissions.d.ts +19 -0
- package/lib/types/permissions.js +33 -1
- package/lib/types/quota-tiers.js +21 -31
- package/lib/utils/api-key.d.ts +0 -9
- package/lib/utils/api-key.js +2 -13
- package/lib/utils/audit.js +3 -2
- package/lib/utils/env.d.ts +6 -2
- package/lib/utils/env.js +9 -4
- package/lib/utils/identity.d.ts +37 -1
- package/lib/utils/identity.js +62 -10
- package/lib/utils/index.d.ts +2 -1
- package/lib/utils/index.js +7 -2
- package/lib/utils/params.d.ts +35 -0
- package/lib/utils/params.js +24 -1
- package/lib/utils/secret-encryption.d.ts +4 -4
- package/lib/utils/secret-encryption.js +5 -5
- package/lib/utils/ssrf.d.ts +73 -14
- package/lib/utils/ssrf.js +138 -21
- package/package.json +26 -1
package/lib/utils/ssrf.js
CHANGED
|
@@ -12,14 +12,21 @@
|
|
|
12
12
|
* NAT / cloud-metadata range, so a tenant can't aim a webhook at
|
|
13
13
|
* `169.254.169.254` or an in-cluster service.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
15
|
+
* TWO POSTURES, ONE SURVIVOR. `assertSafeUrl` only *validates* a URL: it
|
|
16
|
+
* resolves the host, checks the addresses and then throws the hostname away.
|
|
17
|
+
* Anything that goes on to `fetch(url)` re-resolves DNS and can therefore be
|
|
18
|
+
* pointed at a private address between the check and the connect (classic
|
|
19
|
+
* DNS rebinding). {@link safeFetch} is the posture that actually holds: it
|
|
20
|
+
* resolves, PINS the vetted IP into the socket's `lookup`, refuses redirects,
|
|
21
|
+
* and caps both the response size and the wall-clock time.
|
|
22
|
+
*
|
|
23
|
+
* So: use {@link safeFetch} for every outbound request to a user/tenant-supplied
|
|
24
|
+
* URL. `assertSafeUrl` is for NON-FETCH validation only — rejecting a bad URL at
|
|
25
|
+
* create/update time before it is ever stored. Never pair it with `fetch`.
|
|
21
26
|
*/
|
|
22
27
|
import { lookup } from 'dns/promises';
|
|
28
|
+
import { request as httpRequest } from 'http';
|
|
29
|
+
import { request as httpsRequest } from 'https';
|
|
23
30
|
import { isIP } from 'net';
|
|
24
31
|
/**
|
|
25
32
|
* True for loopback / private / link-local / CGNAT / cloud-metadata / ULA
|
|
@@ -61,12 +68,15 @@ export function isPrivateAddress(ip) {
|
|
|
61
68
|
|| addr.startsWith('fe80'); // link-local
|
|
62
69
|
}
|
|
63
70
|
/**
|
|
64
|
-
*
|
|
71
|
+
* Resolve and vet an outbound URL, returning the pinned target to connect to.
|
|
72
|
+
*
|
|
73
|
+
* Rejects a URL that is malformed, uses a disallowed protocol, or points at a
|
|
65
74
|
* private/loopback/link-local/metadata address (by IP literal or by DNS
|
|
66
|
-
* resolution).
|
|
67
|
-
*
|
|
75
|
+
* resolution). Rejects if ANY resolution is private (defence in depth), then
|
|
76
|
+
* pins the first vetted address so the connection can never reach an address
|
|
77
|
+
* this function did not approve.
|
|
68
78
|
*/
|
|
69
|
-
export async function
|
|
79
|
+
export async function resolveSafeTarget(rawUrl, opts = {}) {
|
|
70
80
|
const protocols = opts.protocols ?? ['https:'];
|
|
71
81
|
let u;
|
|
72
82
|
try {
|
|
@@ -78,9 +88,14 @@ export async function assertSafeUrl(rawUrl, opts = {}) {
|
|
|
78
88
|
if (!protocols.includes(u.protocol)) {
|
|
79
89
|
throw new Error(`url must use ${protocols.map((p) => p.replace(/:$/, '')).join('/')}`);
|
|
80
90
|
}
|
|
81
|
-
const host = u.hostname;
|
|
82
|
-
|
|
83
|
-
|
|
91
|
+
const host = u.hostname.replace(/^\[|\]$/g, '');
|
|
92
|
+
const port = u.port ? Number(u.port) : (u.protocol === 'http:' ? 80 : 443);
|
|
93
|
+
const literalFamily = isIP(host);
|
|
94
|
+
if (literalFamily) {
|
|
95
|
+
if (isPrivateAddress(host))
|
|
96
|
+
throw new Error('url targets a private address');
|
|
97
|
+
return { host, address: host, family: literalFamily, port, protocol: u.protocol };
|
|
98
|
+
}
|
|
84
99
|
let addrs;
|
|
85
100
|
try {
|
|
86
101
|
addrs = await lookup(host, { all: true });
|
|
@@ -92,15 +107,117 @@ export async function assertSafeUrl(rawUrl, opts = {}) {
|
|
|
92
107
|
throw new Error('url host did not resolve');
|
|
93
108
|
if (addrs.some((a) => isPrivateAddress(a.address)))
|
|
94
109
|
throw new Error('url resolves to a private address');
|
|
110
|
+
return { host, address: addrs[0].address, family: addrs[0].family, port, protocol: u.protocol };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* VALIDATION ONLY — never pair this with a `fetch`.
|
|
114
|
+
*
|
|
115
|
+
* Resolves the host and throws when the URL is malformed, uses a disallowed
|
|
116
|
+
* protocol, or resolves to a private/loopback/link-local/metadata address. Use
|
|
117
|
+
* it to reject a bad URL at create/update time (before it is stored), or in any
|
|
118
|
+
* other place where nothing is about to connect. For an actual outbound request
|
|
119
|
+
* use {@link safeFetch}, which pins the address it vetted — validating here and
|
|
120
|
+
* then letting `fetch` re-resolve is a DNS-rebinding TOCTOU hole.
|
|
121
|
+
*/
|
|
122
|
+
export async function assertSafeUrl(rawUrl, opts = {}) {
|
|
123
|
+
await resolveSafeTarget(rawUrl, opts);
|
|
95
124
|
}
|
|
125
|
+
/** Default wall-clock cap for one {@link safeFetch} request. */
|
|
126
|
+
export const SAFE_FETCH_TIMEOUT_MS = 10_000;
|
|
127
|
+
/** Default response-body cap for {@link safeFetch} (5 MiB). */
|
|
128
|
+
export const SAFE_FETCH_MAX_BYTES = 5 * 1024 * 1024;
|
|
96
129
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
130
|
+
* SSRF-safe outbound request to a user/tenant-supplied URL.
|
|
131
|
+
*
|
|
132
|
+
* - resolves + vets the host, then PINS the exact validated IP into the socket
|
|
133
|
+
* `lookup` so `net.connect` never re-resolves — this is what defeats DNS
|
|
134
|
+
* rebinding. SNI + Host stay the original hostname so TLS verification is
|
|
135
|
+
* unchanged.
|
|
136
|
+
* - REFUSES redirects: `http(s).request` never follows one, and a 3xx comes back
|
|
137
|
+
* as `{ redirected: true, ok: false }` for the caller to record as a failure.
|
|
138
|
+
* - caps the response body ({@link SafeFetchOptions.maxResponseBytes}) and the
|
|
139
|
+
* wall clock ({@link SafeFetchOptions.timeoutMs}).
|
|
140
|
+
*
|
|
141
|
+
* Throws on a rejected URL, a transport error, a timeout, or an oversized body.
|
|
100
142
|
*/
|
|
101
|
-
export
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
143
|
+
export async function safeFetch(rawUrl, opts = {}) {
|
|
144
|
+
const maxBytes = opts.maxResponseBytes ?? SAFE_FETCH_MAX_BYTES;
|
|
145
|
+
const pin = await resolveSafeTarget(rawUrl, opts);
|
|
146
|
+
const u = new URL(rawUrl);
|
|
147
|
+
const body = opts.body === undefined
|
|
148
|
+
? undefined
|
|
149
|
+
: (Buffer.isBuffer(opts.body) ? opts.body : Buffer.from(opts.body, 'utf8'));
|
|
150
|
+
// Compose the caller's abort with our own deadline so whichever fires first wins.
|
|
151
|
+
const timeout = AbortSignal.timeout(opts.timeoutMs ?? SAFE_FETCH_TIMEOUT_MS);
|
|
152
|
+
const signal = opts.signal ? AbortSignal.any([opts.signal, timeout]) : timeout;
|
|
153
|
+
const options = {
|
|
154
|
+
method: opts.method ?? 'GET',
|
|
155
|
+
hostname: pin.host,
|
|
156
|
+
port: pin.port,
|
|
157
|
+
path: `${u.pathname}${u.search}`,
|
|
158
|
+
servername: pin.protocol === 'https:' ? pin.host : undefined,
|
|
159
|
+
signal,
|
|
160
|
+
headers: {
|
|
161
|
+
...opts.headers,
|
|
162
|
+
...(body ? { 'Content-Length': String(body.byteLength) } : {}),
|
|
163
|
+
},
|
|
164
|
+
// Pin the vetted IP: net.connect uses this instead of re-resolving the host.
|
|
165
|
+
lookup: ((_hostname, _lookupOpts, cb) => {
|
|
166
|
+
cb(null, pin.address, pin.family);
|
|
167
|
+
}),
|
|
168
|
+
};
|
|
169
|
+
const send = pin.protocol === 'https:' ? httpsRequest : httpRequest;
|
|
170
|
+
return new Promise((resolve, reject) => {
|
|
171
|
+
const clientReq = send(options, (res) => {
|
|
172
|
+
const status = res.statusCode ?? 0;
|
|
173
|
+
const headers = {};
|
|
174
|
+
for (const [k, v] of Object.entries(res.headers)) {
|
|
175
|
+
if (v !== undefined)
|
|
176
|
+
headers[k] = Array.isArray(v) ? v.join(', ') : String(v);
|
|
177
|
+
}
|
|
178
|
+
const redirected = status >= 300 && status < 400;
|
|
179
|
+
if (redirected) {
|
|
180
|
+
// Never follow, never buffer — drain so the socket can be released.
|
|
181
|
+
res.resume();
|
|
182
|
+
res.on('end', () => resolve(makeResponse(status, res.statusMessage, headers, Buffer.alloc(0), true)));
|
|
183
|
+
res.on('error', reject);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
// Early reject on a declared oversize before buffering anything.
|
|
187
|
+
const declared = Number(headers['content-length']);
|
|
188
|
+
if (Number.isFinite(declared) && declared > maxBytes) {
|
|
189
|
+
res.destroy();
|
|
190
|
+
reject(new Error(`Response body exceeds ${maxBytes} bytes`));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const chunks = [];
|
|
194
|
+
let received = 0;
|
|
195
|
+
res.on('data', (chunk) => {
|
|
196
|
+
received += chunk.byteLength;
|
|
197
|
+
if (received > maxBytes) {
|
|
198
|
+
res.destroy();
|
|
199
|
+
reject(new Error(`Response body exceeds ${maxBytes} bytes`));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
chunks.push(chunk);
|
|
203
|
+
});
|
|
204
|
+
res.on('end', () => resolve(makeResponse(status, res.statusMessage, headers, Buffer.concat(chunks), false)));
|
|
205
|
+
res.on('error', reject);
|
|
206
|
+
});
|
|
207
|
+
clientReq.on('error', reject);
|
|
208
|
+
clientReq.end(body);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
function makeResponse(status, statusText, headers, body, redirected) {
|
|
212
|
+
return {
|
|
213
|
+
ok: status >= 200 && status < 300,
|
|
214
|
+
status,
|
|
215
|
+
statusText: statusText ?? '',
|
|
216
|
+
redirected,
|
|
217
|
+
headers,
|
|
218
|
+
body,
|
|
219
|
+
text: () => body.toString('utf8'),
|
|
220
|
+
json: () => JSON.parse(body.toString('utf8')),
|
|
221
|
+
};
|
|
105
222
|
}
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NyZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zc3JmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEtBQUssQ0FBQztBQUUzQjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsRUFBVTtJQUN6QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0RCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDdEUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNQLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHO2VBQ2xDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsNENBQTRDO2VBQ3JFLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7ZUFDakMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7ZUFDeEIsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUTtJ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SyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQUMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUFDLENBQUM7SUFDekcsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDcEUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7QUFDM0csQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBaUIsRUFBRSxDQUFDO0FBRS9ELGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBdUM7SUFDdkUsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNyRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU2hhcmVkIFNTUkYgZ3VhcmQgZm9yIHVzZXIvdGVuYW50LXN1cHBsaWVkIG91dGJvdW5kIFVSTHMgKHdlYmhvb2sgdGFyZ2V0cyxcbiAqIGNhbGxiYWNrcywg4oCmKS4gUHJvbW90ZWQgdG8gYXBpLWNvcmUgc28gZXZlcnkgc2VydmljZSB0aGF0IGxldHMgYW4gb3JnIHBvaW50XG4gKiB0aGUgcGxhdGZvcm0gYXQgYW4gYXJiaXRyYXJ5IFVSTCBlbmZvcmNlcyB0aGUgU0FNRSBkZW55bGlzdCBpbnN0ZWFkIG9mIGVhY2hcbiAqIHJlLWRlcml2aW5nIGl0ICh0aGUgY29tcGxpYW5jZSBub3RpZmllciBhbmQgdGhlIHBsYXRmb3JtIGFsZXJ0IHJlbGF5IGJvdGhcbiAqIGNvbnN1bWUgdGhpcykuXG4gKlxuICogVGhlIGd1YXJkIHJlc29sdmVzIHRoZSBob3N0IHVwIGZyb250IGFuZCByZWplY3RzIGFueSBhZGRyZXNzIHRoYXQgaXMg4oCUIG9yXG4gKiByZXNvbHZlcyB0byDigJQgYSBsb29wYmFjayAvIHByaXZhdGUgLyBsaW5rLWxvY2FsIC8gdW5pcXVlLWxvY2FsIC8gY2Fycmllci1ncmFkZVxuICogTkFUIC8gY2xvdWQtbWV0YWRhdGEgcmFuZ2UsIHNvIGEgdGVuYW50IGNhbid0IGFpbSBhIHdlYmhvb2sgYXRcbiAqIGAxNjkuMjU0LjE2OS4yNTRgIG9yIGFuIGluLWNsdXN0ZXIgc2VydmljZS5cbiAqXG4gKiBETlMtcmViaW5kaW5nIG5vdGU6IHRoZSB1cC1mcm9udCByZXNvbHZlIHZhbGlkYXRlcyB0aGUgKmluaXRpYWwqIGhvc3Qgb25seS5cbiAqIE5vZGUncyBnbG9iYWwgYGZldGNoYCAodW5kaWNpKSByZS1yZXNvbHZlcyBETlMgZm9yIGEgcmVkaXJlY3QgdGFyZ2V0XG4gKiBpbmRlcGVuZGVudGx5LCBzbyBjYWxsZXJzIE1VU1Qgc2VuZCB3aXRoIGByZWRpcmVjdDogJ21hbnVhbCdgIGFuZCB0cmVhdCBhbnlcbiAqIDN4eCBhcyBhIGZhaWxlZCBkZWxpdmVyeSDigJQgc2VlIHtAbGluayBTU1JGX0ZFVENIX0lOSVR9LiBQaW5uaW5nIHRoZSBleGFjdFxuICogcmVzb2x2ZWQgSVAgZm9yIHRoZSBjb25uZWN0aW9uIHdvdWxkIG5lZWQgYSBjdXN0b20gdW5kaWNpIGRpc3BhdGNoZXIgKG5vdCBhXG4gKiBkZXBlbmRlbmN5IGhlcmUpOyByZWZ1c2luZyByZWRpcmVjdHMgY2xvc2VzIHRoZSBwcmFjdGljYWwgcmViaW5kaW5nIHBpdm90LlxuICovXG5cbmltcG9ydCB7IGxvb2t1cCB9IGZyb20gJ2Rucy9wcm9taXNlcyc7XG5pbXBvcnQgeyBpc0lQIH0gZnJvbSAnbmV0JztcblxuLyoqXG4gKiBUcnVlIGZvciBsb29wYmFjayAvIHByaXZhdGUgLyBsaW5rLWxvY2FsIC8gQ0dOQVQgLyBjbG91ZC1tZXRhZGF0YSAvIFVMQVxuICogYWRkcmVzc2VzIOKAlCB0aGUgcmFuZ2VzIGFuIG91dGJvdW5kIHRlbmFudCB3ZWJob29rIG11c3QgbmV2ZXIgcmVhY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVBZGRyZXNzKGlwOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYWRkciA9IGlwLnJlcGxhY2UoL15cXFt8XFxdJC9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgdjQgPSBhZGRyLm1hdGNoKC9eKFxcZHsxLDN9KVxcLihcXGR7MSwzfSlcXC4oXFxkezEsM30pXFwuKFxcZHsxLDN9KSQvKTtcbiAgaWYgKHY0KSB7XG4gICAgY29uc3QgYSA9IE51bWJlcih2NFsxXSksIGIgPSBOdW1iZXIodjRbMl0pO1xuICAgIHJldHVybiBhID09PSAwIHx8IGEgPT09IDEwIHx8IGEgPT09IDEyN1xuICAgICAgfHwgKGEgPT09IDE2OSAmJiBiID09PSAyNTQpIC8vIGxpbmstbG9jYWwgaW5jbC4gMTY5LjI1NC4xNjkuMjU0IG1ldGFkYXRhXG4gICAgICB8fCAoYSA9PT0gMTcyICYmIGIgPj0gMTYgJiYgYiA8PSAzMSlcbiAgICAgIHx8IChhID09PSAxOTIgJiYgYiA9PT0gMTY4KVxuICAgICAgfHwgKGEgPT09IDEwMCAmJiBiID49IDY0ICYmIGIgPD0gMTI3KTsgLy8gQ0dOQVRcbiAgfVxuICBpZiAoYWRkciA9PT0gJzo6MScgfHwgYWRkciA9PT0gJzo6JykgcmV0dXJuIHRydWU7XG4gIGlmIChhZGRyLnN0YXJ0c1dpdGgoJzo6ZmZmZjonKSkge1xuICAgIGNvbnN0IHN1ZmZpeCA9IGFkZHIuc2xpY2UoNyk7XG4gICAgLy8gRG90dGVkIGZvcm0gKGA6OmZmZmY6MTI3LjAuMC4xYCkg4oCUIHJlY3Vyc2Ugc3RyYWlnaHQgaW50byB0aGUgdjQgY2hlY2tzLlxuICAgIGlmIChzdWZmaXguaW5jbHVkZXMoJy4nKSkgcmV0dXJuIGlzUHJpdmF0ZUFkZHJlc3Moc3VmZml4KTtcbiAgICAvLyBIZXggZm9ybSAoYDo6ZmZmZjo3ZjAwOjFgID0gMTI3LjAuMC4xLCBgOjpmZmZmOmMwYTg6MWAgPSAxOTIuMTY4LjAuMSk6XG4gICAgLy8gdGhlIGxvdyAzMiBiaXRzIGFyZSB3cml0dGVuIGFzIHRoZSBsYXN0IG9uZS90d28gaGV4IGdyb3Vwcy4gRm9sZCB0aGVtIGludG9cbiAgICAvLyBhIGRvdHRlZCBxdWFkIGFuZCByZWN1cnNlIHNvIHRoZSB2NCByYW5nZXMgYmVsb3cgc3RpbGwgY2F0Y2ggaXQg4oCUIHdpdGhvdXRcbiAgICAvLyB0aGlzIHRoZSBoZXggZm9ybSBzbGlwcyBwYXN0IGV2ZXJ5IGNoZWNrIGFuZCByZWFjaGVzIGxvb3BiYWNrL3ByaXZhdGUgc3BhY2UuXG4gICAgY29uc3QgZ3JvdXBzID0gc3VmZml4LnNwbGl0KCc6Jyk7XG4gICAgY29uc3QgaGlnaCA9IHBhcnNlSW50KGdyb3Vwc1tncm91cHMubGVuZ3RoIC0gMl0gPz8gJzAnLCAxNik7XG4gICAgY29uc3QgbG93ID0gcGFyc2VJbnQoZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXSA/PyAnMCcsIDE2KTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGhpZ2gpIHx8IE51bWJlci5pc05hTihsb3cpKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gRm9sZCBlYWNoIDE2LWJpdCBoYWxmIGludG8gdHdvIG9jdGV0cyAoYXJpdGhtZXRpYywgbm90IGJpdHdpc2UsIHRvIHNhdGlzZnlcbiAgICAvLyB0aGUgbm8tYml0d2lzZSBsaW50KTogaGlnaCDihpIgYS5iLCBsb3cg4oaSIGMuZC5cbiAgICBjb25zdCBkb3R0ZWQgPSBgJHtNYXRoLmZsb29yKGhpZ2ggLyAyNTYpICUgMjU2fS4ke2hpZ2ggJSAyNTZ9LiR7TWF0aC5mbG9vcihsb3cgLyAyNTYpICUgMjU2fS4ke2xvdyAlIDI1Nn1gO1xuICAgIHJldHVybiBpc1ByaXZhdGVBZGRyZXNzKGRvdHRlZCk7XG4gIH1cbiAgcmV0dXJuIGFkZHIuc3RhcnRzV2l0aCgnZmMnKSB8fCBhZGRyLnN0YXJ0c1dpdGgoJ2ZkJykgLy8gdW5pcXVlLWxvY2FsXG4gICAgfHwgYWRkci5zdGFydHNXaXRoKCdmZTgwJyk7IC8vIGxpbmstbG9jYWxcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBhc3NlcnRTYWZlVXJsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FmZVVybE9wdGlvbnMge1xuICAvKiogQWxsb3dlZCBVUkwgcHJvdG9jb2xzIChkZWZhdWx0OiBgWydodHRwczonXWApLiAqL1xuICBwcm90b2NvbHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBSZWplY3QgYSBVUkwgdGhhdCBpcyBtYWxmb3JtZWQsIHVzZXMgYSBkaXNhbGxvd2VkIHByb3RvY29sLCBvciBwb2ludHMgYXQgYVxuICogcHJpdmF0ZS9sb29wYmFjay9saW5rLWxvY2FsL21ldGFkYXRhIGFkZHJlc3MgKGJ5IElQIGxpdGVyYWwgb3IgYnkgRE5TXG4gKiByZXNvbHV0aW9uKS4gVGhyb3dzIGEgcGxhaW4gYEVycm9yYCB3aXRoIGEgY2FsbGVyLXNhZmUgbWVzc2FnZSBvbiByZWplY3Rpb247XG4gKiByZXNvbHZlcyBzaWxlbnRseSB3aGVuIHRoZSBVUkwgaXMgc2FmZSB0byBmZXRjaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydFNhZmVVcmwocmF3VXJsOiBzdHJpbmcsIG9wdHM6IFNhZmVVcmxPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvdG9jb2xzID0gb3B0cy5wcm90b2NvbHMgPz8gWydodHRwczonXTtcbiAgbGV0IHU6IFVSTDtcbiAgdHJ5IHsgdSA9IG5ldyBVUkwocmF3VXJsKTsgfSBjYXRjaCB7IHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1cmwnKTsgfVxuICBpZiAoIXByb3RvY29scy5pbmNsdWRlcyh1LnByb3RvY29sKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdXJsIG11c3QgdXNlICR7cHJvdG9jb2xzLm1hcCgocCkgPT4gcC5yZXBsYWNlKC86JC8sICcnKSkuam9pbignLycpfWApO1xuICB9XG4gIGNvbnN0IGhvc3QgPSB1Lmhvc3RuYW1lO1xuICBpZiAoaXNJUChob3N0KSAmJiBpc1ByaXZhdGVBZGRyZXNzKGhvc3QpKSB0aHJvdyBuZXcgRXJyb3IoJ3VybCB0YXJnZXRzIGEgcHJpdmF0ZSBhZGRyZXNzJyk7XG4gIGxldCBhZGRyczogeyBhZGRyZXNzOiBzdHJpbmcgfVtdO1xuICB0cnkgeyBhZGRycyA9IGF3YWl0IGxvb2t1cChob3N0LCB7IGFsbDogdHJ1ZSB9KTsgfSBjYXRjaCB7IHRocm93IG5ldyBFcnJvcigndXJsIGhvc3QgZGlkIG5vdCByZXNvbHZlJyk7IH1cbiAgaWYgKGFkZHJzLmxlbmd0aCA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKCd1cmwgaG9zdCBkaWQgbm90IHJlc29sdmUnKTtcbiAgaWYgKGFkZHJzLnNvbWUoKGEpID0+IGlzUHJpdmF0ZUFkZHJlc3MoYS5hZGRyZXNzKSkpIHRocm93IG5ldyBFcnJvcigndXJsIHJlc29sdmVzIHRvIGEgcHJpdmF0ZSBhZGRyZXNzJyk7XG59XG5cbi8qKlxuICogYGZldGNoYCBpbml0IGZyYWdtZW50IGV2ZXJ5IFNTUkYtZ3VhcmRlZCBjYWxsIE1VU1Qgc3ByZWFkIHNvIGEgcmVkaXJlY3QgY2FuJ3RcbiAqIHBpdm90IHRvIGFuIHVudmFsaWRhdGVkIChhbmQgcmUtcmVzb2x2ZWQpIGhvc3QuIENhbGxlcnMgdHJlYXQgYSAzeHggLyBvcGFxdWVcbiAqIHJlZGlyZWN0IHJlc3BvbnNlIGFzIGEgZmFpbGVkIGRlbGl2ZXJ5IHJhdGhlciB0aGFuIGZvbGxvd2luZyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNTUkZfRkVUQ0hfSU5JVCA9IHsgcmVkaXJlY3Q6ICdtYW51YWwnIGFzIGNvbnN0IH07XG5cbi8qKiBUcnVlIHdoZW4gYSBgZmV0Y2hgIFJlc3BvbnNlIGlzIChvciB3YXMpIGEgcmVkaXJlY3QgdGhlIGNhbGxlciBtdXN0IHJlZnVzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZnVzZWRSZWRpcmVjdChyZXNwOiB7IHR5cGU/OiBzdHJpbmc7IHN0YXR1czogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlc3AudHlwZSA9PT0gJ29wYXF1ZXJlZGlyZWN0JyB8fCAocmVzcC5zdGF0dXMgPj0gMzAwICYmIHJlc3Auc3RhdHVzIDwgNDAwKTtcbn1cbiJdfQ==
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NyZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zc3JmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBdUIsTUFBTSxPQUFPLENBQUM7QUFDckUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEtBQUssQ0FBQztBQUUzQjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsRUFBVTtJQUN6QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0RCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDdEUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNQLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHO2VBQ2xDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsNENBQTRDO2VBQ3JFLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7ZUFDakMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJ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OUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsTUFBYyxFQUNkLFVBQThCLEVBQzlCLE9BQStCLEVBQy9CLElBQVksRUFDWixVQUFtQjtJQUVuQixPQUFPO1FBQ0wsRUFBRSxFQUFFLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxHQUFHLEdBQUc7UUFDakMsTUFBTTtRQUNOLFVBQVUsRUFBRSxVQUFVLElBQUksRUFBRTtRQUM1QixVQUFVO1FBQ1YsT0FBTztRQUNQLElBQUk7UUFDSixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDakMsSUFBSSxFQUFFLEdBQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBTTtLQUN0RCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBTU1JGIGd1YXJkIGZvciB1c2VyL3RlbmFudC1zdXBwbGllZCBvdXRib3VuZCBVUkxzICh3ZWJob29rIHRhcmdldHMsXG4gKiBjYWxsYmFja3MsIOKApikuIFByb21vdGVkIHRvIGFwaS1jb3JlIHNvIGV2ZXJ5IHNlcnZpY2UgdGhhdCBsZXRzIGFuIG9yZyBwb2ludFxuICogdGhlIHBsYXRmb3JtIGF0IGFuIGFyYml0cmFyeSBVUkwgZW5mb3JjZXMgdGhlIFNBTUUgZGVueWxpc3QgaW5zdGVhZCBvZiBlYWNoXG4gKiByZS1kZXJpdmluZyBpdCAodGhlIGNvbXBsaWFuY2Ugbm90aWZpZXIgYW5kIHRoZSBwbGF0Zm9ybSBhbGVydCByZWxheSBib3RoXG4gKiBjb25zdW1lIHRoaXMpLlxuICpcbiAqIFRoZSBndWFyZCByZXNvbHZlcyB0aGUgaG9zdCB1cCBmcm9udCBhbmQgcmVqZWN0cyBhbnkgYWRkcmVzcyB0aGF0IGlzIOKAlCBvclxuICogcmVzb2x2ZXMgdG8g4oCUIGEgbG9vcGJhY2sgLyBwcml2YXRlIC8gbGluay1sb2NhbCAvIHVuaXF1ZS1sb2NhbCAvIGNhcnJpZXItZ3JhZGVcbiAqIE5BVCAvIGNsb3VkLW1ldGFkYXRhIHJhbmdlLCBzbyBhIHRlbmFudCBjYW4ndCBhaW0gYSB3ZWJob29rIGF0XG4gKiBgMTY5LjI1NC4xNjkuMjU0YCBvciBhbiBpbi1jbHVzdGVyIHNlcnZpY2UuXG4gKlxuICogVFdPIFBPU1RVUkVTLCBPTkUgU1VSVklWT1IuIGBhc3NlcnRTYWZlVXJsYCBvbmx5ICp2YWxpZGF0ZXMqIGEgVVJMOiBpdFxuICogcmVzb2x2ZXMgdGhlIGhvc3QsIGNoZWNrcyB0aGUgYWRkcmVzc2VzIGFuZCB0aGVuIHRocm93cyB0aGUgaG9zdG5hbWUgYXdheS5cbiAqIEFueXRoaW5nIHRoYXQgZ29lcyBvbiB0byBgZmV0Y2godXJsKWAgcmUtcmVzb2x2ZXMgRE5TIGFuZCBjYW4gdGhlcmVmb3JlIGJlXG4gKiBwb2ludGVkIGF0IGEgcHJpdmF0ZSBhZGRyZXNzIGJldHdlZW4gdGhlIGNoZWNrIGFuZCB0aGUgY29ubmVjdCAoY2xhc3NpY1xuICogRE5TIHJlYmluZGluZykuIHtAbGluayBzYWZlRmV0Y2h9IGlzIHRoZSBwb3N0dXJlIHRoYXQgYWN0dWFsbHkgaG9sZHM6IGl0XG4gKiByZXNvbHZlcywgUElOUyB0aGUgdmV0dGVkIElQIGludG8gdGhlIHNvY2tldCdzIGBsb29rdXBgLCByZWZ1c2VzIHJlZGlyZWN0cyxcbiAqIGFuZCBjYXBzIGJvdGggdGhlIHJlc3BvbnNlIHNpemUgYW5kIHRoZSB3YWxsLWNsb2NrIHRpbWUuXG4gKlxuICogU286IHVzZSB7QGxpbmsgc2FmZUZldGNofSBmb3IgZXZlcnkgb3V0Ym91bmQgcmVxdWVzdCB0byBhIHVzZXIvdGVuYW50LXN1cHBsaWVkXG4gKiBVUkwuIGBhc3NlcnRTYWZlVXJsYCBpcyBmb3IgTk9OLUZFVENIIHZhbGlkYXRpb24gb25seSDigJQgcmVqZWN0aW5nIGEgYmFkIFVSTCBhdFxuICogY3JlYXRlL3VwZGF0ZSB0aW1lIGJlZm9yZSBpdCBpcyBldmVyIHN0b3JlZC4gTmV2ZXIgcGFpciBpdCB3aXRoIGBmZXRjaGAuXG4gKi9cblxuaW1wb3J0IHsgbG9va3VwIH0gZnJvbSAnZG5zL3Byb21pc2VzJztcbmltcG9ydCB7IHJlcXVlc3QgYXMgaHR0cFJlcXVlc3QgfSBmcm9tICdodHRwJztcbmltcG9ydCB7IHJlcXVlc3QgYXMgaHR0cHNSZXF1ZXN0LCB0eXBlIFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHsgaXNJUCB9IGZyb20gJ25ldCc7XG5cbi8qKlxuICogVHJ1ZSBmb3IgbG9vcGJhY2sgLyBwcml2YXRlIC8gbGluay1sb2NhbCAvIENHTkFUIC8gY2xvdWQtbWV0YWRhdGEgLyBVTEFcbiAqIGFkZHJlc3NlcyDigJQgdGhlIHJhbmdlcyBhbiBvdXRib3VuZCB0ZW5hbnQgd2ViaG9vayBtdXN0IG5ldmVyIHJlYWNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcml2YXRlQWRkcmVzcyhpcDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFkZHIgPSBpcC5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHY0ID0gYWRkci5tYXRjaCgvXihcXGR7MSwzfSlcXC4oXFxkezEsM30pXFwuKFxcZHsxLDN9KVxcLihcXGR7MSwzfSkkLyk7XG4gIGlmICh2NCkge1xuICAgIGNvbnN0IGEgPSBOdW1iZXIodjRbMV0pLCBiID0gTnVtYmVyKHY0WzJdKTtcbiAgICByZXR1cm4gYSA9PT0gMCB8fCBhID09PSAxMCB8fCBhID09PSAxMjdcbiAgICAgIHx8IChhID09PSAxNjkgJiYgYiA9PT0gMjU0KSAvLyBsaW5rLWxvY2FsIGluY2wuIDE2OS4yNTQuMTY5LjI1NCBtZXRhZGF0YVxuICAgICAgfHwgKGEgPT09IDE3MiAmJiBiID49IDE2ICYmIGIgPD0gMzEpXG4gICAgICB8fCAoYSA9PT0gMTkyICYmIGIgPT09IDE2OClcbiAgICAgIHx8IChhID09PSAxMDAgJiYgYiA+PSA2NCAmJiBiIDw9IDEyNyk7IC8vIENHTkFUXG4gIH1cbiAgaWYgKGFkZHIgPT09ICc6OjEnIHx8IGFkZHIgPT09ICc6OicpIHJldHVybiB0cnVlO1xuICBpZiAoYWRkci5zdGFydHNXaXRoKCc6OmZmZmY6JykpIHtcbiAgICBjb25zdCBzdWZmaXggPSBhZGRyLnNsaWNlKDcpO1xuICAgIC8vIERvdHRlZCBmb3JtIChgOjpmZmZmOjEyNy4wLjAuMWApIOKAlCByZWN1cnNlIHN0cmFpZ2h0IGludG8gdGhlIHY0IGNoZWNrcy5cbiAgICBpZiAoc3VmZml4LmluY2x1ZGVzKCcuJykpIHJldHVybiBpc1ByaXZhdGVBZGRyZXNzKHN1ZmZpeCk7XG4gICAgLy8gSGV4IGZvcm0gKGA6OmZmZmY6N2YwMDoxYCA9IDEyNy4wLjAuMSwgYDo6ZmZmZjpjMGE4OjFgID0gMTkyLjE2OC4wLjEpOlxuICAgIC8vIHRoZSBsb3cgMzIgYml0cyBhcmUgd3JpdHRlbiBhcyB0aGUgbGFzdCBvbmUvdHdvIGhleCBncm91cHMuIEZvbGQgdGhlbSBpbnRvXG4gICAgLy8gYSBkb3R0ZWQgcXVhZCBhbmQgcmVjdXJzZSBzbyB0aGUgdjQgcmFuZ2VzIGJlbG93IHN0aWxsIGNhdGNoIGl0IOKAlCB3aXRob3V0XG4gICAgLy8gdGhpcyB0aGUgaGV4IGZvcm0gc2xpcHMgcGFzdCBldmVyeSBjaGVjayBhbmQgcmVhY2hlcyBsb29wYmFjay9wcml2YXRlIHNwYWNlLlxuICAgIGNvbnN0IGdyb3VwcyA9IHN1ZmZpeC5zcGxpdCgnOicpO1xuICAgIGNvbnN0IGhpZ2ggPSBwYXJzZUludChncm91cHNbZ3JvdXBzLmxlbmd0aCAtIDJdID8/ICcwJywgMTYpO1xuICAgIGNvbnN0IGxvdyA9IHBhcnNlSW50KGdyb3Vwc1tncm91cHMubGVuZ3RoIC0gMV0gPz8gJzAnLCAxNik7XG4gICAgaWYgKE51bWJlci5pc05hTihoaWdoKSB8fCBOdW1iZXIuaXNOYU4obG93KSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEZvbGQgZWFjaCAxNi1iaXQgaGFsZiBpbnRvIHR3byBvY3RldHMgKGFyaXRobWV0aWMsIG5vdCBiaXR3aXNlLCB0byBzYXRpc2Z5XG4gICAgLy8gdGhlIG5vLWJpdHdpc2UgbGludCk6IGhpZ2gg4oaSIGEuYiwgbG93IOKGkiBjLmQuXG4gICAgY29uc3QgZG90dGVkID0gYCR7TWF0aC5mbG9vcihoaWdoIC8gMjU2KSAlIDI1Nn0uJHtoaWdoICUgMjU2fS4ke01hdGguZmxvb3IobG93IC8gMjU2KSAlIDI1Nn0uJHtsb3cgJSAyNTZ9YDtcbiAgICByZXR1cm4gaXNQcml2YXRlQWRkcmVzcyhkb3R0ZWQpO1xuICB9XG4gIHJldHVybiBhZGRyLnN0YXJ0c1dpdGgoJ2ZjJykgfHwgYWRkci5zdGFydHNXaXRoKCdmZCcpIC8vIHVuaXF1ZS1sb2NhbFxuICAgIHx8IGFkZHIuc3RhcnRzV2l0aCgnZmU4MCcpOyAvLyBsaW5rLWxvY2FsXG59XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgYXNzZXJ0U2FmZVVybH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNhZmVVcmxPcHRpb25zIHtcbiAgLyoqIEFsbG93ZWQgVVJMIHByb3RvY29scyAoZGVmYXVsdDogYFsnaHR0cHM6J11gKS4gKi9cbiAgcHJvdG9jb2xzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBETlMtcmVzb2x2ZWQsIFNTUkYtdmV0dGVkIHRhcmdldCB0byBjb25uZWN0IHRvIGJ5IFBJTk5FRCBJUC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaW5uZWRUYXJnZXQge1xuICAvKiogT3JpZ2luYWwgaG9zdG5hbWUg4oCUIHByZXNlcnZlZCBmb3IgdGhlIEhvc3QgaGVhZGVyIGFuZCBUTFMgU05JLiAqL1xuICBob3N0OiBzdHJpbmc7XG4gIC8qKiBUaGUgZXhhY3QgdmFsaWRhdGVkIElQIHRoZSBzb2NrZXQgbXVzdCBjb25uZWN0IHRvIChubyByZS1yZXNvbHV0aW9uKS4gKi9cbiAgYWRkcmVzczogc3RyaW5nO1xuICBmYW1pbHk6IG51bWJlcjtcbiAgcG9ydDogbnVtYmVyO1xuICAvKiogYCdodHRwczonYCBvciBgJ2h0dHA6J2AuICovXG4gIHByb3RvY29sOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhbmQgdmV0IGFuIG91dGJvdW5kIFVSTCwgcmV0dXJuaW5nIHRoZSBwaW5uZWQgdGFyZ2V0IHRvIGNvbm5lY3QgdG8uXG4gKlxuICogUmVqZWN0cyBhIFVSTCB0aGF0IGlzIG1hbGZvcm1lZCwgdXNlcyBhIGRpc2FsbG93ZWQgcHJvdG9jb2wsIG9yIHBvaW50cyBhdCBhXG4gKiBwcml2YXRlL2xvb3BiYWNrL2xpbmstbG9jYWwvbWV0YWRhdGEgYWRkcmVzcyAoYnkgSVAgbGl0ZXJhbCBvciBieSBETlNcbiAqIHJlc29sdXRpb24pLiBSZWplY3RzIGlmIEFOWSByZXNvbHV0aW9uIGlzIHByaXZhdGUgKGRlZmVuY2UgaW4gZGVwdGgpLCB0aGVuXG4gKiBwaW5zIHRoZSBmaXJzdCB2ZXR0ZWQgYWRkcmVzcyBzbyB0aGUgY29ubmVjdGlvbiBjYW4gbmV2ZXIgcmVhY2ggYW4gYWRkcmVzc1xuICogdGhpcyBmdW5jdGlvbiBkaWQgbm90IGFwcHJvdmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2FmZVRhcmdldChyYXdVcmw6IHN0cmluZywgb3B0czogU2FmZVVybE9wdGlvbnMgPSB7fSk6IFByb21pc2U8UGlubmVkVGFyZ2V0PiB7XG4gIGNvbnN0IHByb3RvY29scyA9IG9wdHMucHJvdG9jb2xzID8/IFsnaHR0cHM6J107XG4gIGxldCB1OiBVUkw7XG4gIHRyeSB7IHUgPSBuZXcgVVJMKHJhd1VybCk7IH0gY2F0Y2ggeyB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdXJsJyk7IH1cbiAgaWYgKCFwcm90b2NvbHMuaW5jbHVkZXModS5wcm90b2NvbCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVybCBtdXN0IHVzZSAke3Byb3RvY29scy5tYXAoKHApID0+IHAucmVwbGFjZSgvOiQvLCAnJykpLmpvaW4oJy8nKX1gKTtcbiAgfVxuICBjb25zdCBob3N0ID0gdS5ob3N0bmFtZS5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpO1xuICBjb25zdCBwb3J0ID0gdS5wb3J0ID8gTnVtYmVyKHUucG9ydCkgOiAodS5wcm90b2NvbCA9PT0gJ2h0dHA6JyA/IDgwIDogNDQzKTtcbiAgY29uc3QgbGl0ZXJhbEZhbWlseSA9IGlzSVAoaG9zdCk7XG4gIGlmIChsaXRlcmFsRmFtaWx5KSB7XG4gICAgaWYgKGlzUHJpdmF0ZUFkZHJlc3MoaG9zdCkpIHRocm93IG5ldyBFcnJvcigndXJsIHRhcmdldHMgYSBwcml2YXRlIGFkZHJlc3MnKTtcbiAgICByZXR1cm4geyBob3N0LCBhZGRyZXNzOiBob3N0LCBmYW1pbHk6IGxpdGVyYWxGYW1pbHksIHBvcnQsIHByb3RvY29sOiB1LnByb3RvY29sIH07XG4gIH1cbiAgbGV0IGFkZHJzOiB7IGFkZHJlc3M6IHN0cmluZzsgZmFtaWx5OiBudW1iZXIgfVtdO1xuICB0cnkgeyBhZGRycyA9IGF3YWl0IGxvb2t1cChob3N0LCB7IGFsbDogdHJ1ZSB9KTsgfSBjYXRjaCB7IHRocm93IG5ldyBFcnJvcigndXJsIGhvc3QgZGlkIG5vdCByZXNvbHZlJyk7IH1cbiAgaWYgKGFkZHJzLmxlbmd0aCA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKCd1cmwgaG9zdCBkaWQgbm90IHJlc29sdmUnKTtcbiAgaWYgKGFkZHJzLnNvbWUoKGEpID0+IGlzUHJpdmF0ZUFkZHJlc3MoYS5hZGRyZXNzKSkpIHRocm93IG5ldyBFcnJvcigndXJsIHJlc29sdmVzIHRvIGEgcHJpdmF0ZSBhZGRyZXNzJyk7XG4gIHJldHVybiB7IGhvc3QsIGFkZHJlc3M6IGFkZHJzWzBdLmFkZHJlc3MsIGZhbWlseTogYWRkcnNbMF0uZmFtaWx5LCBwb3J0LCBwcm90b2NvbDogdS5wcm90b2NvbCB9O1xufVxuXG4vKipcbiAqIFZBTElEQVRJT04gT05MWSDigJQgbmV2ZXIgcGFpciB0aGlzIHdpdGggYSBgZmV0Y2hgLlxuICpcbiAqIFJlc29sdmVzIHRoZSBob3N0IGFuZCB0aHJvd3Mgd2hlbiB0aGUgVVJMIGlzIG1hbGZvcm1lZCwgdXNlcyBhIGRpc2FsbG93ZWRcbiAqIHByb3RvY29sLCBvciByZXNvbHZlcyB0byBhIHByaXZhdGUvbG9vcGJhY2svbGluay1sb2NhbC9tZXRhZGF0YSBhZGRyZXNzLiBVc2VcbiAqIGl0IHRvIHJlamVjdCBhIGJhZCBVUkwgYXQgY3JlYXRlL3VwZGF0ZSB0aW1lIChiZWZvcmUgaXQgaXMgc3RvcmVkKSwgb3IgaW4gYW55XG4gKiBvdGhlciBwbGFjZSB3aGVyZSBub3RoaW5nIGlzIGFib3V0IHRvIGNvbm5lY3QuIEZvciBhbiBhY3R1YWwgb3V0Ym91bmQgcmVxdWVzdFxuICogdXNlIHtAbGluayBzYWZlRmV0Y2h9LCB3aGljaCBwaW5zIHRoZSBhZGRyZXNzIGl0IHZldHRlZCDigJQgdmFsaWRhdGluZyBoZXJlIGFuZFxuICogdGhlbiBsZXR0aW5nIGBmZXRjaGAgcmUtcmVzb2x2ZSBpcyBhIEROUy1yZWJpbmRpbmcgVE9DVE9VIGhvbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRTYWZlVXJsKHJhd1VybDogc3RyaW5nLCBvcHRzOiBTYWZlVXJsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlc29sdmVTYWZlVGFyZ2V0KHJhd1VybCwgb3B0cyk7XG59XG5cbi8qKiBEZWZhdWx0IHdhbGwtY2xvY2sgY2FwIGZvciBvbmUge0BsaW5rIHNhZmVGZXRjaH0gcmVxdWVzdC4gKi9cbmV4cG9ydCBjb25zdCBTQUZFX0ZFVENIX1RJTUVPVVRfTVMgPSAxMF8wMDA7XG4vKiogRGVmYXVsdCByZXNwb25zZS1ib2R5IGNhcCBmb3Ige0BsaW5rIHNhZmVGZXRjaH0gKDUgTWlCKS4gKi9cbmV4cG9ydCBjb25zdCBTQUZFX0ZFVENIX01BWF9CWVRFUyA9IDUgKiAxMDI0ICogMTAyNDtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBzYWZlRmV0Y2h9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYWZlRmV0Y2hPcHRpb25zIGV4dGVuZHMgU2FmZVVybE9wdGlvbnMge1xuICBtZXRob2Q/OiBzdHJpbmc7XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBib2R5Pzogc3RyaW5nIHwgQnVmZmVyO1xuICAvKiogQ2FsbGVyIGFib3J0IChjb21wb3NlZCB3aXRoIGB0aW1lb3V0TXNgKS4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKiBXYWxsLWNsb2NrIGNhcCBmb3IgdGhlIHdob2xlIHJlcXVlc3QgKGRlZmF1bHQge0BsaW5rIFNBRkVfRkVUQ0hfVElNRU9VVF9NU30pLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKiBCb2R5LXNpemUgY2FwOyBleGNlZWRpbmcgaXQgYWJvcnRzIGFuZCB0aHJvd3MgKGRlZmF1bHQge0BsaW5rIFNBRkVfRkVUQ0hfTUFYX0JZVEVTfSkuICovXG4gIG1heFJlc3BvbnNlQnl0ZXM/OiBudW1iZXI7XG59XG5cbi8qKiBOb3JtYWxpemVkIHJlc3BvbnNlIGZyb20ge0BsaW5rIHNhZmVGZXRjaH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNhZmVGZXRjaFJlc3BvbnNlIHtcbiAgLyoqIFRydWUgb25seSBmb3IgYSAyeHguIEEgcmVmdXNlZCByZWRpcmVjdCBpcyBuZXZlciBgb2tgLiAqL1xuICBvazogYm9vbGVhbjtcbiAgc3RhdHVzOiBudW1iZXI7XG4gIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgLyoqIFRydWUgd2hlbiB0aGUgb3JpZ2luIGFuc3dlcmVkIHdpdGggYSAzeHgg4oCUIFJFRlVTRUQsIG5ldmVyIGZvbGxvd2VkLiAqL1xuICByZWRpcmVjdGVkOiBib29sZWFuO1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUmF3IGJvZHkgYnl0ZXMgKGVtcHR5IGZvciBhIHJlZnVzZWQgcmVkaXJlY3QsIHdob3NlIGJvZHkgaXMgZGlzY2FyZGVkKS4gKi9cbiAgYm9keTogQnVmZmVyO1xuICB0ZXh0KCk6IHN0cmluZztcbiAganNvbjxUID0gdW5rbm93bj4oKTogVDtcbn1cblxuLyoqXG4gKiBTU1JGLXNhZmUgb3V0Ym91bmQgcmVxdWVzdCB0byBhIHVzZXIvdGVuYW50LXN1cHBsaWVkIFVSTC5cbiAqXG4gKiAtIHJlc29sdmVzICsgdmV0cyB0aGUgaG9zdCwgdGhlbiBQSU5TIHRoZSBleGFjdCB2YWxpZGF0ZWQgSVAgaW50byB0aGUgc29ja2V0XG4gKiAgIGBsb29rdXBgIHNvIGBuZXQuY29ubmVjdGAgbmV2ZXIgcmUtcmVzb2x2ZXMg4oCUIHRoaXMgaXMgd2hhdCBkZWZlYXRzIEROU1xuICogICByZWJpbmRpbmcuIFNOSSArIEhvc3Qgc3RheSB0aGUgb3JpZ2luYWwgaG9zdG5hbWUgc28gVExTIHZlcmlmaWNhdGlvbiBpc1xuICogICB1bmNoYW5nZWQuXG4gKiAtIFJFRlVTRVMgcmVkaXJlY3RzOiBgaHR0cChzKS5yZXF1ZXN0YCBuZXZlciBmb2xsb3dzIG9uZSwgYW5kIGEgM3h4IGNvbWVzIGJhY2tcbiAqICAgYXMgYHsgcmVkaXJlY3RlZDogdHJ1ZSwgb2s6IGZhbHNlIH1gIGZvciB0aGUgY2FsbGVyIHRvIHJlY29yZCBhcyBhIGZhaWx1cmUuXG4gKiAtIGNhcHMgdGhlIHJlc3BvbnNlIGJvZHkgKHtAbGluayBTYWZlRmV0Y2hPcHRpb25zLm1heFJlc3BvbnNlQnl0ZXN9KSBhbmQgdGhlXG4gKiAgIHdhbGwgY2xvY2sgKHtAbGluayBTYWZlRmV0Y2hPcHRpb25zLnRpbWVvdXRNc30pLlxuICpcbiAqIFRocm93cyBvbiBhIHJlamVjdGVkIFVSTCwgYSB0cmFuc3BvcnQgZXJyb3IsIGEgdGltZW91dCwgb3IgYW4gb3ZlcnNpemVkIGJvZHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYWZlRmV0Y2gocmF3VXJsOiBzdHJpbmcsIG9wdHM6IFNhZmVGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2FmZUZldGNoUmVzcG9uc2U+IHtcbiAgY29uc3QgbWF4Qnl0ZXMgPSBvcHRzLm1heFJlc3BvbnNlQnl0ZXMgPz8gU0FGRV9GRVRDSF9NQVhfQllURVM7XG4gIGNvbnN0IHBpbiA9IGF3YWl0IHJlc29sdmVTYWZlVGFyZ2V0KHJhd1VybCwgb3B0cyk7XG4gIGNvbnN0IHUgPSBuZXcgVVJMKHJhd1VybCk7XG4gIGNvbnN0IGJvZHkgPSBvcHRzLmJvZHkgPT09IHVuZGVmaW5lZFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAoQnVmZmVyLmlzQnVmZmVyKG9wdHMuYm9keSkgPyBvcHRzLmJvZHkgOiBCdWZmZXIuZnJvbShvcHRzLmJvZHksICd1dGY4JykpO1xuXG4gIC8vIENvbXBvc2UgdGhlIGNhbGxlcidzIGFib3J0IHdpdGggb3VyIG93biBkZWFkbGluZSBzbyB3aGljaGV2ZXIgZmlyZXMgZmlyc3Qgd2lucy5cbiAgY29uc3QgdGltZW91dCA9IEFib3J0U2lnbmFsLnRpbWVvdXQob3B0cy50aW1lb3V0TXMgPz8gU0FGRV9GRVRDSF9USU1FT1VUX01TKTtcbiAgY29uc3Qgc2lnbmFsID0gb3B0cy5zaWduYWwgPyBBYm9ydFNpZ25hbC5hbnkoW29wdHMuc2lnbmFsLCB0aW1lb3V0XSkgOiB0aW1lb3V0O1xuXG4gIGNvbnN0IG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgIG1ldGhvZDogb3B0cy5tZXRob2QgPz8gJ0dFVCcsXG4gICAgaG9zdG5hbWU6IHBpbi5ob3N0LFxuICAgIHBvcnQ6IHBpbi5wb3J0LFxuICAgIHBhdGg6IGAke3UucGF0aG5hbWV9JHt1LnNlYXJjaH1gLFxuICAgIHNlcnZlcm5hbWU6IHBpbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBwaW4uaG9zdCA6IHVuZGVmaW5lZCxcbiAgICBzaWduYWwsXG4gICAgaGVhZGVyczoge1xuICAgICAgLi4ub3B0cy5oZWFkZXJzLFxuICAgICAgLi4uKGJvZHkgPyB7ICdDb250ZW50LUxlbmd0aCc6IFN0cmluZyhib2R5LmJ5dGVMZW5ndGgpIH0gOiB7fSksXG4gICAgfSxcbiAgICAvLyBQaW4gdGhlIHZldHRlZCBJUDogbmV0LmNvbm5lY3QgdXNlcyB0aGlzIGluc3RlYWQgb2YgcmUtcmVzb2x2aW5nIHRoZSBob3N0LlxuICAgIGxvb2t1cDogKChfaG9zdG5hbWU6IHN0cmluZywgX2xvb2t1cE9wdHM6IHVua25vd24sIGNiOiAoZXJyOiBFcnJvciB8IG51bGwsIGFkZHJlc3M6IHN0cmluZywgZmFtaWx5OiBudW1iZXIpID0+IHZvaWQpID0+IHtcbiAgICAgIGNiKG51bGwsIHBpbi5hZGRyZXNzLCBwaW4uZmFtaWx5KTtcbiAgICB9KSBhcyB1bmtub3duIGFzIFJlcXVlc3RPcHRpb25zWydsb29rdXAnXSxcbiAgfTtcblxuICBjb25zdCBzZW5kID0gcGluLnByb3RvY29sID09PSAnaHR0cHM6JyA/IGh0dHBzUmVxdWVzdCA6IGh0dHBSZXF1ZXN0O1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxTYWZlRmV0Y2hSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudFJlcSA9IHNlbmQob3B0aW9ucywgKHJlcykgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gcmVzLnN0YXR1c0NvZGUgPz8gMDtcbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHJlcy5oZWFkZXJzKSkge1xuICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSBoZWFkZXJzW2tdID0gQXJyYXkuaXNBcnJheSh2KSA/IHYuam9pbignLCAnKSA6IFN0cmluZyh2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlZGlyZWN0ZWQgPSBzdGF0dXMgPj0gMzAwICYmIHN0YXR1cyA8IDQwMDtcbiAgICAgIGlmIChyZWRpcmVjdGVkKSB7XG4gICAgICAgIC8vIE5ldmVyIGZvbGxvdywgbmV2ZXIgYnVmZmVyIOKAlCBkcmFpbiBzbyB0aGUgc29ja2V0IGNhbiBiZSByZWxlYXNlZC5cbiAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHJlc29sdmUobWFrZVJlc3BvbnNlKHN0YXR1cywgcmVzLnN0YXR1c01lc3NhZ2UsIGhlYWRlcnMsIEJ1ZmZlci5hbGxvYygwKSwgdHJ1ZSkpKTtcbiAgICAgICAgcmVzLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEVhcmx5IHJlamVjdCBvbiBhIGRlY2xhcmVkIG92ZXJzaXplIGJlZm9yZSBidWZmZXJpbmcgYW55dGhpbmcuXG4gICAgICBjb25zdCBkZWNsYXJlZCA9IE51bWJlcihoZWFkZXJzWydjb250ZW50LWxlbmd0aCddKTtcbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZGVjbGFyZWQpICYmIGRlY2xhcmVkID4gbWF4Qnl0ZXMpIHtcbiAgICAgICAgcmVzLmRlc3Ryb3koKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUmVzcG9uc2UgYm9keSBleGNlZWRzICR7bWF4Qnl0ZXN9IGJ5dGVzYCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW107XG4gICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rOiBCdWZmZXIpID0+IHtcbiAgICAgICAgcmVjZWl2ZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgaWYgKHJlY2VpdmVkID4gbWF4Qnl0ZXMpIHtcbiAgICAgICAgICByZXMuZGVzdHJveSgpO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFJlc3BvbnNlIGJvZHkgZXhjZWVkcyAke21heEJ5dGVzfSBieXRlc2ApKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgfSk7XG4gICAgICByZXMub24oJ2VuZCcsICgpID0+IHJlc29sdmUobWFrZVJlc3BvbnNlKHN0YXR1cywgcmVzLnN0YXR1c01lc3NhZ2UsIGhlYWRlcnMsIEJ1ZmZlci5jb25jYXQoY2h1bmtzKSwgZmFsc2UpKSk7XG4gICAgICByZXMub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICB9KTtcbiAgICBjbGllbnRSZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICBjbGllbnRSZXEuZW5kKGJvZHkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWFrZVJlc3BvbnNlKFxuICBzdGF0dXM6IG51bWJlcixcbiAgc3RhdHVzVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBib2R5OiBCdWZmZXIsXG4gIHJlZGlyZWN0ZWQ6IGJvb2xlYW4sXG4pOiBTYWZlRmV0Y2hSZXNwb25zZSB7XG4gIHJldHVybiB7XG4gICAgb2s6IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwLFxuICAgIHN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiBzdGF0dXNUZXh0ID8/ICcnLFxuICAgIHJlZGlyZWN0ZWQsXG4gICAgaGVhZGVycyxcbiAgICBib2R5LFxuICAgIHRleHQ6ICgpID0+IGJvZHkudG9TdHJpbmcoJ3V0ZjgnKSxcbiAgICBqc29uOiA8VD4oKSA9PiBKU09OLnBhcnNlKGJvZHkudG9TdHJpbmcoJ3V0ZjgnKSkgYXMgVCxcbiAgfTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -91,10 +91,13 @@
|
|
|
91
91
|
"*": {
|
|
92
92
|
"permissions": [
|
|
93
93
|
"lib/types/permissions.d.ts"
|
|
94
|
+
],
|
|
95
|
+
"metadata-keys": [
|
|
96
|
+
"lib/types/metadata-keys.d.ts"
|
|
94
97
|
]
|
|
95
98
|
}
|
|
96
99
|
},
|
|
97
|
-
"version": "4.1.
|
|
100
|
+
"version": "4.1.9",
|
|
98
101
|
"bugs": {
|
|
99
102
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
100
103
|
},
|
|
@@ -153,6 +156,24 @@
|
|
|
153
156
|
"moduleNameMapper": {
|
|
154
157
|
"^uuid$": "<rootDir>/../../jest-uuid-stub.js",
|
|
155
158
|
"^(\\.{1,2}/.*)\\.js$": "$1"
|
|
159
|
+
},
|
|
160
|
+
"restoreMocks": true,
|
|
161
|
+
"setupFilesAfterEnv": [
|
|
162
|
+
"<rootDir>/../../jest-env-guard.js"
|
|
163
|
+
],
|
|
164
|
+
"coverageThreshold": {
|
|
165
|
+
"global": {
|
|
166
|
+
"statements": 95,
|
|
167
|
+
"branches": 88,
|
|
168
|
+
"functions": 88,
|
|
169
|
+
"lines": 95
|
|
170
|
+
},
|
|
171
|
+
"**/src/utils/audit.ts": {
|
|
172
|
+
"statements": 95,
|
|
173
|
+
"branches": 95,
|
|
174
|
+
"functions": 95,
|
|
175
|
+
"lines": 95
|
|
176
|
+
}
|
|
156
177
|
}
|
|
157
178
|
},
|
|
158
179
|
"types": "lib/index.d.ts",
|
|
@@ -166,6 +187,10 @@
|
|
|
166
187
|
"types": "./lib/types/permissions.d.ts",
|
|
167
188
|
"default": "./lib/types/permissions.js"
|
|
168
189
|
},
|
|
190
|
+
"./metadata-keys": {
|
|
191
|
+
"types": "./lib/types/metadata-keys.d.ts",
|
|
192
|
+
"default": "./lib/types/metadata-keys.js"
|
|
193
|
+
},
|
|
169
194
|
"./lib/*": "./lib/*",
|
|
170
195
|
"./package.json": "./package.json"
|
|
171
196
|
},
|