@workflow/utils 5.0.0-beta.4 → 5.0.0-beta.5
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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-port-internals.d.ts","sourceRoot":"","sources":["../src/get-port-internals.ts"],"names":[],"mappings":"AAQA,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,MAAM,EAAE,CA2BV"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
function parsePort(value, radix = 10) {
|
|
2
|
+
const port = parseInt(value, radix);
|
|
3
|
+
if (!Number.isNaN(port) && port >= 0 && port <= 65535) {
|
|
4
|
+
return port;
|
|
5
|
+
}
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
export function parseWindowsNetstatPortsForPid(stdout, pid) {
|
|
9
|
+
const ports = [];
|
|
10
|
+
const lines = stdout.trim().split('\n');
|
|
11
|
+
for (const line of lines) {
|
|
12
|
+
const parts = line.trim().split(/\s+/);
|
|
13
|
+
if (parts.length < 5 || parts[0]?.toUpperCase() !== 'TCP') {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
const [, localAddress, , state, rowPid] = parts;
|
|
17
|
+
if (state?.toUpperCase() !== 'LISTENING' || rowPid !== pid.toString()) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const colonIndex = localAddress.lastIndexOf(':');
|
|
21
|
+
if (colonIndex === -1) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const port = parsePort(localAddress.slice(colonIndex + 1));
|
|
25
|
+
if (port !== undefined) {
|
|
26
|
+
ports.push(port);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return ports;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXBvcnQtaW50ZXJuYWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dldC1wb3J0LWludGVybmFscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxTQUFTLFNBQVMsQ0FBQyxLQUFhLEVBQUUsS0FBSyxHQUFHLEVBQUU7SUFDMUMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsTUFBTSxVQUFVLDhCQUE4QixDQUM1QyxNQUFjLEVBQ2QsR0FBVztJQUVYLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXhDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMxRCxTQUFTO1FBQ1gsQ0FBQztRQUVELE1BQU0sQ0FBQyxFQUFFLFlBQVksRUFBRSxBQUFELEVBQUcsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNoRCxJQUFJLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxXQUFXLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3RFLFNBQVM7UUFDWCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RCLFNBQVM7UUFDWCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIHBhcnNlUG9ydCh2YWx1ZTogc3RyaW5nLCByYWRpeCA9IDEwKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHZhbHVlLCByYWRpeCk7XG4gIGlmICghTnVtYmVyLmlzTmFOKHBvcnQpICYmIHBvcnQgPj0gMCAmJiBwb3J0IDw9IDY1NTM1KSB7XG4gICAgcmV0dXJuIHBvcnQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlV2luZG93c05ldHN0YXRQb3J0c0ZvclBpZChcbiAgc3Rkb3V0OiBzdHJpbmcsXG4gIHBpZDogbnVtYmVyXG4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHBvcnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBsaW5lcyA9IHN0ZG91dC50cmltKCkuc3BsaXQoJ1xcbicpO1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGNvbnN0IHBhcnRzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAocGFydHMubGVuZ3RoIDwgNSB8fCBwYXJ0c1swXT8udG9VcHBlckNhc2UoKSAhPT0gJ1RDUCcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIGxvY2FsQWRkcmVzcywgLCBzdGF0ZSwgcm93UGlkXSA9IHBhcnRzO1xuICAgIGlmIChzdGF0ZT8udG9VcHBlckNhc2UoKSAhPT0gJ0xJU1RFTklORycgfHwgcm93UGlkICE9PSBwaWQudG9TdHJpbmcoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb25JbmRleCA9IGxvY2FsQWRkcmVzcy5sYXN0SW5kZXhPZignOicpO1xuICAgIGlmIChjb2xvbkluZGV4ID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlUG9ydChsb2NhbEFkZHJlc3Muc2xpY2UoY29sb25JbmRleCArIDEpKTtcbiAgICBpZiAocG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwb3J0cy5wdXNoKHBvcnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwb3J0cztcbn1cbiJdfQ==
|
package/dist/get-port.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-port.d.ts","sourceRoot":"","sources":["../src/get-port.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-port.d.ts","sourceRoot":"","sources":["../src/get-port.ts"],"names":[],"mappings":"AAoLA;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBrD;AAED;;;GAGG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAG3D;AAMD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiCD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqC7B"}
|
package/dist/get-port.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { execFile } from 'node:child_process';
|
|
2
2
|
import { readdir, readFile, readlink } from 'node:fs/promises';
|
|
3
3
|
import { promisify } from 'node:util';
|
|
4
|
+
import { parseWindowsNetstatPortsForPid } from './get-port-internals.js';
|
|
4
5
|
const execFileAsync = promisify(execFile);
|
|
5
6
|
/**
|
|
6
7
|
* Parses a port string and returns it if valid (0-65535), otherwise undefined.
|
|
@@ -150,27 +151,9 @@ async function getWindowsPorts(pid) {
|
|
|
150
151
|
try {
|
|
151
152
|
const { stdout } = await execFileAsync('cmd', [
|
|
152
153
|
'/c',
|
|
153
|
-
|
|
154
|
+
'netstat -ano -p tcp | findstr LISTENING',
|
|
154
155
|
]);
|
|
155
|
-
|
|
156
|
-
const trimmedOutput = stdout.trim();
|
|
157
|
-
if (trimmedOutput) {
|
|
158
|
-
const lines = trimmedOutput.split('\n');
|
|
159
|
-
for (const line of lines) {
|
|
160
|
-
// Extract port from the local address column
|
|
161
|
-
// Matches both IPv4 (e.g., "127.0.0.1:3000") and IPv6 bracket notation (e.g., "[::1]:3000")
|
|
162
|
-
const match = line
|
|
163
|
-
.trim()
|
|
164
|
-
.match(/^\s*TCP\s+(?:\[[\da-f:]+\]|[\d.]+):(\d+)\s+/i);
|
|
165
|
-
if (match) {
|
|
166
|
-
const port = parsePort(match[1]);
|
|
167
|
-
if (port !== undefined) {
|
|
168
|
-
ports.push(port);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
return ports;
|
|
156
|
+
return parseWindowsNetstatPortsForPid(stdout, pid);
|
|
174
157
|
}
|
|
175
158
|
catch {
|
|
176
159
|
return [];
|
|
@@ -274,4 +257,4 @@ export async function getWorkflowPort(options) {
|
|
|
274
257
|
}
|
|
275
258
|
return ports[0];
|
|
276
259
|
}
|
|
277
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ2V0LXBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEMsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRTFDOztHQUVHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBYSxFQUFFLEtBQUssR0FBRyxFQUFFO0lBQzFDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixnR0FBZ0c7QUFDaEcscUdBQXFHO0FBQ3JHLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBYSxFQUFFLEdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFMUM7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLGFBQWEsQ0FBQyxHQUFXO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLG9DQUFvQztJQUM5RCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsU0FBUyxVQUFV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QUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVELElBQUksWUFBWSxFQUFFLENBQUM7UUFDakIsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxxRUFBcUU7SUFDckUsNEJBQTRCO0lBQzVCLDhDQUE4QztJQUM5QyxrQ0FBa0M7SUFDbEMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxhQUFhLEVBQUUsQ0FBQztRQUMzQyxPQUFPLENBQUMsS0FBSyxDQUNYLCtEQUErRCxFQUMvRCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ1QsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY0ZpbGUgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcmVhZGRpciwgcmVhZEZpbGUsIHJlYWRsaW5rIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnO1xuXG5jb25zdCBleGVjRmlsZUFzeW5jID0gcHJvbWlzaWZ5KGV4ZWNGaWxlKTtcblxuLyoqXG4gKiBQYXJzZXMgYSBwb3J0IHN0cmluZyBhbmQgcmV0dXJucyBpdCBpZiB2YWxpZCAoMC02NTUzNSksIG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUG9ydCh2YWx1ZTogc3RyaW5nLCByYWRpeCA9IDEwKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHZhbHVlLCByYWRpeCk7XG4gIGlmICghTnVtYmVyLmlzTmFOKHBvcnQpICYmIHBvcnQgPj0gMCAmJiBwb3J0IDw9IDY1NTM1KSB7XG4gICAgcmV0dXJuIHBvcnQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLy8gTk9URTogV2UgYnVpbGQgL3Byb2MgcGF0aHMgZHluYW1pY2FsbHkgdG8gcHJldmVudCBAdmVyY2VsL25mdCBmcm9tIHRyYWNpbmcgdGhlbS5cbi8vIE5GVCdzIHN0YXRpYyBhbmFseXNpcyB0cmllcyB0byBidW5kbGUgYW55IGZpbGUgcGF0aCBsaXRlcmFsIGl0IGZpbmRzIChlLmcuLCAnL3Byb2MvbmV0L3RjcCcpLlxuLy8gU2luY2UgL3Byb2MgaXMgYSB2aXJ0dWFsIExpbnV4IGZpbGVzeXN0ZW0sIHRoaXMgY2F1c2VzIGJ1aWxkIGZhaWx1cmVzIGluIEBzdmVsdGVqcy9hZGFwdGVyLXZlcmNlbC5cbmNvbnN0IGpvaW4gPSAoYXJyOiBzdHJpbmdbXSwgc2VwOiBzdHJpbmcpID0+IGFyci5qb2luKHNlcCk7XG5jb25zdCBQUk9DX1JPT1QgPSBqb2luKFsnJywgJ3Byb2MnXSwgJy8nKTtcblxuLyoqXG4gKiBHZXRzIEFMTCBsaXN0ZW5pbmcgcG9ydHMgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3Mgb24gTGludXggYnkgcmVhZGluZyAvcHJvYyBmaWxlc3lzdGVtLlxuICogUmV0dXJucyBwb3J0cyBpbiBvcmRlciBvZiBmaWxlIGRlc2NyaXB0b3IgKGRldGVybWluaXN0aWMgb3JkZXJpbmcpLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRMaW51eFBvcnRzKHBpZDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICBjb25zdCBsaXN0ZW5TdGF0ZSA9ICcwQSc7IC8vIFRDUCBMSVNURU4gc3RhdGUgaW4gL3Byb2MvbmV0L3RjcFxuICBjb25zdCB0Y3BGaWxlcyA9IFtgJHtQUk9DX1JPT1R9L25ldC90Y3BgLCBgJHtQUk9DX1JPT1R9L25ldC90Y3A2YF0gYXMgY29uc3Q7XG5cbiAgLy8gU3RlcCAxOiBHZXQgc29ja2V0IGlub2RlcyBmcm9tIC9wcm9jLzxwaWQ+L2ZkLyBpbiBvcmRlclxuICAvLyBXZSBwcmVzZXJ2ZSBvcmRlciB0byBtYWludGFpbiBkZXRlcm1pbmlzdGljIGJlaGF2aW9yXG4gIC8vIFVzZSBib3RoIGFycmF5IChmb3Igb3JkZXIpIGFuZCBTZXQgKGZvciBPKDEpIGxvb2t1cClcbiAgY29uc3Qgc29ja2V0SW5vZGVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzb2NrZXRJbm9kZXNTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmRQYXRoID0gYCR7UFJPQ19ST09UfS8ke3BpZH0vZmRgO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZmRzID0gYXdhaXQgcmVhZGRpcihmZFBhdGgpO1xuICAgIC8vIFNvcnQgRkRzIG51bWVyaWNhbGx5IHRvIGVuc3VyZSBkZXRlcm1pbmlzdGljIG9yZGVyIChGRHMgYXJlIGFsd2F5cyBudW1lcmljIHN0cmluZ3MpXG4gICAgY29uc3Qgc29ydGVkRmRzID0gZmRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IG51bUEgPSBOdW1iZXIucGFyc2VJbnQoYSwgMTApO1xuICAgICAgY29uc3QgbnVtQiA9IE51bWJlci5wYXJzZUludChiLCAxMCk7XG4gICAgICByZXR1cm4gbnVtQSAtIG51bUI7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgc29ydGVkRmRzLm1hcChhc3luYyAoZmQpID0+IHtcbiAgICAgICAgY29uc3QgbGluayA9IGF3YWl0IHJlYWRsaW5rKGAke2ZkUGF0aH0vJHtmZH1gKTtcbiAgICAgICAgLy8gU29ja2V0IGxpbmtzIGxvb2sgbGlrZTogc29ja2V0OlsxMjM0NV1cbiAgICAgICAgY29uc3QgbWF0Y2ggPSBsaW5rLm1hdGNoKC9ec29ja2V0OlxcWyhcXGQrKVxcXSQvKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoPy5bMV0gPz8gbnVsbDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByZXN1bHQudmFsdWUpIHtcbiAgICAgICAgc29ja2V0SW5vZGVzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgc29ja2V0SW5vZGVzU2V0LmFkZChyZXN1bHQudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gUHJvY2VzcyBtaWdodCBub3QgZXhpc3Qgb3Igbm8gcGVybWlzc2lvblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGlmIChzb2NrZXRJbm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gU3RlcCAyOiBSZWFkIC9wcm9jL25ldC90Y3AgYW5kIC9wcm9jL25ldC90Y3A2IHRvIGZpbmQgbGlzdGVuaW5nIHNvY2tldHNcbiAgLy8gRm9ybWF0OiBzbCBsb2NhbF9hZGRyZXNzIHJlbV9hZGRyZXNzIHN0IC4uLiBpbm9kZVxuICAvLyBsb2NhbF9hZGRyZXNzIGlzIGhleCBJUDpwb3J0LCBzdD0wQSBtZWFucyBMSVNURU5cbiAgY29uc3QgaW5vZGVUb1BvcnQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIGZvciAoY29uc3QgdGNwRmlsZSBvZiB0Y3BGaWxlcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUodGNwRmlsZSwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJykuc2xpY2UoMSk7IC8vIFNraXAgaGVhZGVyXG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoIWxpbmUudHJpbSgpKSBjb250aW51ZTsgLy8gU2tpcCBlbXB0eSBsaW5lc1xuXG4gICAgICAgIGNvbnN0IHBhcnRzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA8IDEwKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBsb2NhbEFkZHIgPSBwYXJ0c1sxXTsgLy8gZS5nLiwgXCIwMDAwMDAwMDowQkI4XCIgKDAuMC4wLjA6MzAwMClcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBwYXJ0c1szXTsgLy8gXCIwQVwiID0gTElTVEVOXG4gICAgICAgIGNvbnN0IGlub2RlID0gcGFydHNbOV07XG5cbiAgICAgICAgaWYgKCFsb2NhbEFkZHIgfHwgc3RhdGUgIT09IGxpc3RlblN0YXRlIHx8ICFpbm9kZSkgY29udGludWU7XG4gICAgICAgIGlmICghc29ja2V0SW5vZGVzU2V0Lmhhcyhpbm9kZSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgcG9ydCBmcm9tIGhleCBmb3JtYXQgKGUuZy4sIFwiMEJCOFwiIC0+IDMwMDApXG4gICAgICAgIGNvbnN0IGNvbG9uSW5kZXggPSBsb2NhbEFkZHIuaW5kZXhPZignOicpO1xuICAgICAgICBpZiAoY29sb25JbmRleCA9PT0gLTEpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHBvcnRIZXggPSBsb2NhbEFkZHIuc2xpY2UoY29sb25JbmRleCArIDEpO1xuICAgICAgICBpZiAoIXBvcnRIZXgpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZVBvcnQocG9ydEhleCwgMTYpO1xuICAgICAgICBpZiAocG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaW5vZGVUb1BvcnQuc2V0KGlub2RlLCBwb3J0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIC8vIFJldHVybiBhbGwgcG9ydHMgaW4gc29ja2V0IGlub2RlIG9yZGVyIChkZXRlcm1pbmlzdGljKVxuICBjb25zdCBwb3J0czogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBpbm9kZSBvZiBzb2NrZXRJbm9kZXMpIHtcbiAgICBjb25zdCBwb3J0ID0gaW5vZGVUb1BvcnQuZ2V0KGlub2RlKTtcbiAgICBpZiAocG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwb3J0cy5wdXNoKHBvcnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwb3J0cztcbn1cblxuLyoqXG4gKiBHZXRzIEFMTCBsaXN0ZW5pbmcgcG9ydHMgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3Mgb24gbWFjT1MgdXNpbmcgbHNvZi5cbiAqIFJldHVybnMgcG9ydHMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIGxzb2Ygb3V0cHV0LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXREYXJ3aW5Qb3J0cyhwaWQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgZXhlY0ZpbGVBc3luYygnbHNvZicsIFtcbiAgICAgICctYScsXG4gICAgICAnLWknLFxuICAgICAgJy1QJyxcbiAgICAgICctbicsXG4gICAgICAnLXAnLFxuICAgICAgcGlkLnRvU3RyaW5nKCksXG4gICAgXSk7XG5cbiAgICBjb25zdCBwb3J0czogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBsaW5lcyA9IHN0ZG91dC5zcGxpdCgnXFxuJyk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGlmIChsaW5lLmluY2x1ZGVzKCdMSVNURU4nKSkge1xuICAgICAgICAvLyBDb2x1bW4gOSAoMC1pbmRleGVkOiA4KSBjb250YWlucyB0aGUgYWRkcmVzcyBsaWtlIFwiKjozMDAwXCIgb3IgXCIxMjcuMC4wLjE6MzAwMFwiXG4gICAgICAgIGNvbnN0IHBhcnRzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgY29uc3QgYWRkciA9IHBhcnRzWzhdO1xuICAgICAgICBpZiAoYWRkcikge1xuICAgICAgICAgIGNvbnN0IGNvbG9uSW5kZXggPSBhZGRyLmxhc3RJbmRleE9mKCc6Jyk7XG4gICAgICAgICAgaWYgKGNvbG9uSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBwb3J0ID0gcGFyc2VQb3J0KGFkZHIuc2xpY2UoY29sb25JbmRleCArIDEpKTtcbiAgICAgICAgICAgIGlmIChwb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcG9ydHMucHVzaChwb3J0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9ydHM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgQUxMIGxpc3RlbmluZyBwb3J0cyBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBvbiBXaW5kb3dzIHVzaW5nIG5ldHN0YXQuXG4gKiBSZXR1cm5zIHBvcnRzIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBuZXRzdGF0IG91dHB1dC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93c1BvcnRzKHBpZDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBleGVjRmlsZUFzeW5jKCdjbWQnLCBbXG4gICAgICAnL2MnLFxuICAgICAgYG5ldHN0YXQgLWFubyB8IGZpbmRzdHIgJHtwaWR9IHwgZmluZHN0ciBMSVNURU5JTkdgLFxuICAgIF0pO1xuXG4gICAgY29uc3QgcG9ydHM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgdHJpbW1lZE91dHB1dCA9IHN0ZG91dC50cmltKCk7XG5cbiAgICBpZiAodHJpbW1lZE91dHB1dCkge1xuICAgICAgY29uc3QgbGluZXMgPSB0cmltbWVkT3V0cHV0LnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAvLyBFeHRyYWN0IHBvcnQgZnJvbSB0aGUgbG9jYWwgYWRkcmVzcyBjb2x1bW5cbiAgICAgICAgLy8gTWF0Y2hlcyBib3RoIElQdjQgKGUuZy4sIFwiMTI3LjAuMC4xOjMwMDBcIikgYW5kIElQdjYgYnJhY2tldCBub3RhdGlvbiAoZS5nLiwgXCJbOjoxXTozMDAwXCIpXG4gICAgICAgIGNvbnN0IG1hdGNoID0gbGluZVxuICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAubWF0Y2goL15cXHMqVENQXFxzKyg/OlxcW1tcXGRhLWY6XStcXF18W1xcZC5dKyk6KFxcZCspXFxzKy9pKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlUG9ydChtYXRjaFsxXSk7XG4gICAgICAgICAgaWYgKHBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcG9ydHMucHVzaChwb3J0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9ydHM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYWxsIGxpc3RlbmluZyBwb3J0cyBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy5cbiAqIEByZXR1cm5zIEFycmF5IG9mIHBvcnQgbnVtYmVycyB0aGUgcHJvY2VzcyBpcyBsaXN0ZW5pbmcgb24sIGluIGRldGVybWluaXN0aWMgb3JkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBbGxQb3J0cygpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gIGNvbnN0IHsgcGlkLCBwbGF0Zm9ybSB9ID0gcHJvY2VzcztcblxuICB0cnkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgIGNhc2UgJ2xpbnV4JzpcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldExpbnV4UG9ydHMocGlkKTtcbiAgICAgIGNhc2UgJ2Rhcndpbic6XG4gICAgICAgIHJldHVybiBhd2FpdCBnZXREYXJ3aW5Qb3J0cyhwaWQpO1xuICAgICAgY2FzZSAnd2luMzInOlxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0V2luZG93c1BvcnRzKHBpZCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2dldEFsbFBvcnRzXSBEZXRlY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcG9ydCBudW1iZXIgdGhhdCB0aGUgcHJvY2VzcyBpcyBsaXN0ZW5pbmcgb24uXG4gKiBAcmV0dXJucyBUaGUgcG9ydCBudW1iZXIgdGhhdCB0aGUgcHJvY2VzcyBpcyBsaXN0ZW5pbmcgb24sIG9yIHVuZGVmaW5lZCBpZiB0aGUgcHJvY2VzcyBpcyBub3QgbGlzdGVuaW5nIG9uIGFueSBwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UG9ydCgpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwb3J0cyA9IGF3YWl0IGdldEFsbFBvcnRzKCk7XG4gIHJldHVybiBwb3J0c1swXTtcbn1cblxuLy8gQ29uZmlndXJhdGlvbiBmb3IgSFRUUCBwcm9iaW5nXG5jb25zdCBQUk9CRV9USU1FT1VUX01TID0gNTAwO1xuY29uc3QgUFJPQkVfRU5EUE9JTlQgPSAnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3c/X19oZWFsdGgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2JlT3B0aW9ucyB7XG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb2JlcyBhIHBvcnQgdG8gY2hlY2sgaWYgaXQncyBzZXJ2aW5nIHRoZSB3b3JrZmxvdyBIVFRQIHNlcnZlci5cbiAqIFVzZXMgSEVBRCByZXF1ZXN0IHRvIG1pbmltaXplIG92ZXJoZWFkLlxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHBvcnQgcmVzcG9uZHMgd2l0aCBhIDIwMCBzdGF0dXMgZnJvbSB0aGUgaGVhbHRoIGNoZWNrIGVuZHBvaW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChcbiAgcG9ydDogbnVtYmVyLFxuICBvcHRpb25zOiBQcm9iZU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHsgZW5kcG9pbnQgPSBQUk9CRV9FTkRQT0lOVCwgdGltZW91dCA9IFBST0JFX1RJTUVPVVRfTVMgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9JHtlbmRwb2ludH1gLCB7XG4gICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgd29ya2Zsb3cgaGVhbHRoIGVuZHBvaW50IHJldHVybnMgMjAwIGZvciBoZWFsdGh5XG4gICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwO1xuICB9IGNhdGNoIHtcbiAgICAvLyBDb25uZWN0aW9uIHJlZnVzZWQsIHRpbWVvdXQsIG9yIG90aGVyIGVycm9yXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgd29ya2Zsb3cgc2VydmVyIHBvcnQgYnkgcHJvYmluZyBhbGwgbGlzdGVuaW5nIHBvcnRzLlxuICogVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gZ2V0UG9ydCgpIHdoZW4gb3RoZXIgc2VydmljZXMgKGxpa2UgTm9kZS5qcyBpbnNwZWN0b3IpXG4gKiBtYXkgYWxzbyBiZSBsaXN0ZW5pbmcgb24gcG9ydHMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciBwcm9iaW5nXG4gKiBAcmV0dXJucyBUaGUgcG9ydCBudW1iZXIgb2YgdGhlIHdvcmtmbG93IHNlcnZlciwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V29ya2Zsb3dQb3J0KFxuICBvcHRpb25zPzogUHJvYmVPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwb3J0cyA9IGF3YWl0IGdldEFsbFBvcnRzKCk7XG5cbiAgaWYgKHBvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAocG9ydHMubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gT25seSBvbmUgcG9ydCwgbm8gbmVlZCB0byBwcm9iZVxuICAgIHJldHVybiBwb3J0c1swXTtcbiAgfVxuXG4gIC8vIFByb2JlIGFsbCBwb3J0cyBpbiBwYXJhbGxlbFxuICBjb25zdCBwcm9iZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwb3J0cy5tYXAoYXN5bmMgKHBvcnQpID0+ICh7XG4gICAgICBwb3J0LFxuICAgICAgaXNXb3JrZmxvdzogYXdhaXQgcHJvYmVQb3J0KHBvcnQsIG9wdGlvbnMpLFxuICAgIH0pKVxuICApO1xuXG4gIC8vIFJldHVybiBmaXJzdCBwb3J0IHRoYXQgcmVzcG9uZGVkIGFzIHdvcmtmbG93IHNlcnZlclxuICBjb25zdCB3b3JrZmxvd1BvcnQgPSBwcm9iZVJlc3VsdHMuZmluZCgocikgPT4gci5pc1dvcmtmbG93KTtcbiAgaWYgKHdvcmtmbG93UG9ydCkge1xuICAgIHJldHVybiB3b3JrZmxvd1BvcnQucG9ydDtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGZpcnN0IHBvcnQgaWYgcHJvYmluZyBkb2Vzbid0IGlkZW50aWZ5IHdvcmtmbG93IHNlcnZlclxuICAvLyBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmU6XG4gIC8vIC0gU2VydmVyIGhhc24ndCBzdGFydGVkIHdvcmtmbG93IHJvdXRlcyB5ZXRcbiAgLy8gLSBOZXR3b3JrIGlzc3VlcyBkdXJpbmcgcHJvYmluZ1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgJ1tnZXRXb3JrZmxvd1BvcnRdIFByb2JpbmcgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZmlyc3QgcG9ydDonLFxuICAgICAgcG9ydHNbMF1cbiAgICApO1xuICB9XG4gIHJldHVybiBwb3J0c1swXTtcbn1cbiJdfQ==
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZ2V0LXBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFekUsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRTFDOztHQUVHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBYSxFQUFFLEtBQUssR0FBRyxFQUFFO0lBQzFDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixnR0FBZ0c7QUFDaEcscUdBQXFHO0FBQ3JHLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBYSxFQUFFLEdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFMUM7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLGFBQWEsQ0FBQyxHQUFXO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLG9D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LElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLGtDQUFrQztRQUNsQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsOEJBQThCO0lBQzlCLE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDcEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLElBQUk7UUFDSixVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztLQUMzQyxDQUFDLENBQUMsQ0FDSixDQUFDO0lBRUYsc0RBQXNEO0lBQ3RELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1RCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLDRCQUE0QjtJQUM1Qiw4Q0FBOEM7SUFDOUMsa0NBQWtDO0lBQ2xDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDM0MsT0FBTyxDQUFDLEtBQUssQ0FDWCwrREFBK0QsRUFDL0QsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUNULENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHJlYWRkaXIsIHJlYWRGaWxlLCByZWFkbGluayB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7IHBhcnNlV2luZG93c05ldHN0YXRQb3J0c0ZvclBpZCB9IGZyb20gJy4vZ2V0LXBvcnQtaW50ZXJuYWxzLmpzJztcblxuY29uc3QgZXhlY0ZpbGVBc3luYyA9IHByb21pc2lmeShleGVjRmlsZSk7XG5cbi8qKlxuICogUGFyc2VzIGEgcG9ydCBzdHJpbmcgYW5kIHJldHVybnMgaXQgaWYgdmFsaWQgKDAtNjU1MzUpLCBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZVBvcnQodmFsdWU6IHN0cmluZywgcmFkaXggPSAxMCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBvcnQgPSBwYXJzZUludCh2YWx1ZSwgcmFkaXgpO1xuICBpZiAoIU51bWJlci5pc05hTihwb3J0KSAmJiBwb3J0ID49IDAgJiYgcG9ydCA8PSA2NTUzNSkge1xuICAgIHJldHVybiBwb3J0O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIE5PVEU6IFdlIGJ1aWxkIC9wcm9jIHBhdGhzIGR5bmFtaWNhbGx5IHRvIHByZXZlbnQgQHZlcmNlbC9uZnQgZnJvbSB0cmFjaW5nIHRoZW0uXG4vLyBORlQncyBzdGF0aWMgYW5hbHlzaXMgdHJpZXMgdG8gYnVuZGxlIGFueSBmaWxlIHBhdGggbGl0ZXJhbCBpdCBmaW5kcyAoZS5nLiwgJy9wcm9jL25ldC90Y3AnKS5cbi8vIFNpbmNlIC9wcm9jIGlzIGEgdmlydHVhbCBMaW51eCBmaWxlc3lzdGVtLCB0aGlzIGNhdXNlcyBidWlsZCBmYWlsdXJlcyBpbiBAc3ZlbHRlanMvYWRhcHRlci12ZXJjZWwuXG5jb25zdCBqb2luID0gKGFycjogc3RyaW5nW10sIHNlcDogc3RyaW5nKSA9PiBhcnIuam9pbihzZXApO1xuY29uc3QgUFJPQ19ST09UID0gam9pbihbJycsICdwcm9jJ10sICcvJyk7XG5cbi8qKlxuICogR2V0cyBBTEwgbGlzdGVuaW5nIHBvcnRzIGZvciB0aGUgY3VycmVudCBwcm9jZXNzIG9uIExpbnV4IGJ5IHJlYWRpbmcgL3Byb2MgZmlsZXN5c3RlbS5cbiAqIFJldHVybnMgcG9ydHMgaW4gb3JkZXIgb2YgZmlsZSBkZXNjcmlwdG9yIChkZXRlcm1pbmlzdGljIG9yZGVyaW5nKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TGludXhQb3J0cyhwaWQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgY29uc3QgbGlzdGVuU3RhdGUgPSAnMEEnOyAvLyBUQ1AgTElTVEVOIHN0YXRlIGluIC9wcm9jL25ldC90Y3BcbiAgY29uc3QgdGNwRmlsZXMgPSBbYCR7UFJPQ19ST09UfS9uZXQvdGNwYCwgYCR7UFJPQ19ST09UfS9uZXQvdGNwNmBdIGFzIGNvbnN0O1xuXG4gIC8vIFN0ZXAgMTogR2V0IHNvY2tldCBpbm9kZXMgZnJvbSAvcHJvYy88cGlkPi9mZC8gaW4gb3JkZXJcbiAgLy8gV2UgcHJlc2VydmUgb3JkZXIgdG8gbWFpbnRhaW4gZGV0ZXJtaW5pc3RpYyBiZWhhdmlvclxuICAvLyBVc2UgYm90aCBhcnJheSAoZm9yIG9yZGVyKSBhbmQgU2V0IChmb3IgTygxKSBsb29rdXApXG4gIGNvbnN0IHNvY2tldElub2Rlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc29ja2V0SW5vZGVzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZkUGF0aCA9IGAke1BST0NfUk9PVH0vJHtwaWR9L2ZkYDtcblxuICB0cnkge1xuICAgIGNvbnN0IGZkcyA9IGF3YWl0IHJlYWRkaXIoZmRQYXRoKTtcbiAgICAvLyBTb3J0IEZEcyBudW1lcmljYWxseSB0byBlbnN1cmUgZGV0ZXJtaW5pc3RpYyBvcmRlciAoRkRzIGFyZSBhbHdheXMgbnVtZXJpYyBzdHJpbmdzKVxuICAgIGNvbnN0IHNvcnRlZEZkcyA9IGZkcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBudW1BID0gTnVtYmVyLnBhcnNlSW50KGEsIDEwKTtcbiAgICAgIGNvbnN0IG51bUIgPSBOdW1iZXIucGFyc2VJbnQoYiwgMTApO1xuICAgICAgcmV0dXJuIG51bUEgLSBudW1CO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHNvcnRlZEZkcy5tYXAoYXN5bmMgKGZkKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmsgPSBhd2FpdCByZWFkbGluayhgJHtmZFBhdGh9LyR7ZmR9YCk7XG4gICAgICAgIC8vIFNvY2tldCBsaW5rcyBsb29rIGxpa2U6IHNvY2tldDpbMTIzNDVdXG4gICAgICAgIGNvbnN0IG1hdGNoID0gbGluay5tYXRjaCgvXnNvY2tldDpcXFsoXFxkKylcXF0kLyk7XG4gICAgICAgIHJldHVybiBtYXRjaD8uWzFdID8/IG51bGw7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgcmVzdWx0LnZhbHVlKSB7XG4gICAgICAgIHNvY2tldElub2Rlcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIHNvY2tldElub2Rlc1NldC5hZGQocmVzdWx0LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIFByb2Nlc3MgbWlnaHQgbm90IGV4aXN0IG9yIG5vIHBlcm1pc3Npb25cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZiAoc29ja2V0SW5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIFN0ZXAgMjogUmVhZCAvcHJvYy9uZXQvdGNwIGFuZCAvcHJvYy9uZXQvdGNwNiB0byBmaW5kIGxpc3RlbmluZyBzb2NrZXRzXG4gIC8vIEZvcm1hdDogc2wgbG9jYWxfYWRkcmVzcyByZW1fYWRkcmVzcyBzdCAuLi4gaW5vZGVcbiAgLy8gbG9jYWxfYWRkcmVzcyBpcyBoZXggSVA6cG9ydCwgc3Q9MEEgbWVhbnMgTElTVEVOXG4gIGNvbnN0IGlub2RlVG9Qb3J0ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICBmb3IgKGNvbnN0IHRjcEZpbGUgb2YgdGNwRmlsZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRjcEZpbGUsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpLnNsaWNlKDEpOyAvLyBTa2lwIGhlYWRlclxuXG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKCFsaW5lLnRyaW0oKSkgY29udGludWU7IC8vIFNraXAgZW1wdHkgbGluZXNcblxuICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAxMCkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgbG9jYWxBZGRyID0gcGFydHNbMV07IC8vIGUuZy4sIFwiMDAwMDAwMDA6MEJCOFwiICgwLjAuMC4wOjMwMDApXG4gICAgICAgIGNvbnN0IHN0YXRlID0gcGFydHNbM107IC8vIFwiMEFcIiA9IExJU1RFTlxuICAgICAgICBjb25zdCBpbm9kZSA9IHBhcnRzWzldO1xuXG4gICAgICAgIGlmICghbG9jYWxBZGRyIHx8IHN0YXRlICE9PSBsaXN0ZW5TdGF0ZSB8fCAhaW5vZGUpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXNvY2tldElub2Rlc1NldC5oYXMoaW5vZGUpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBFeHRyYWN0IHBvcnQgZnJvbSBoZXggZm9ybWF0IChlLmcuLCBcIjBCQjhcIiAtPiAzMDAwKVxuICAgICAgICBjb25zdCBjb2xvbkluZGV4ID0gbG9jYWxBZGRyLmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKGNvbG9uSW5kZXggPT09IC0xKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBwb3J0SGV4ID0gbG9jYWxBZGRyLnNsaWNlKGNvbG9uSW5kZXggKyAxKTtcbiAgICAgICAgaWYgKCFwb3J0SGV4KSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBwb3J0ID0gcGFyc2VQb3J0KHBvcnRIZXgsIDE2KTtcbiAgICAgICAgaWYgKHBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlub2RlVG9Qb3J0LnNldChpbm9kZSwgcG9ydCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICAvLyBSZXR1cm4gYWxsIHBvcnRzIGluIHNvY2tldCBpbm9kZSBvcmRlciAoZGV0ZXJtaW5pc3RpYylcbiAgY29uc3QgcG9ydHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgaW5vZGUgb2Ygc29ja2V0SW5vZGVzKSB7XG4gICAgY29uc3QgcG9ydCA9IGlub2RlVG9Qb3J0LmdldChpbm9kZSk7XG4gICAgaWYgKHBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcG9ydHMucHVzaChwb3J0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcG9ydHM7XG59XG5cbi8qKlxuICogR2V0cyBBTEwgbGlzdGVuaW5nIHBvcnRzIGZvciB0aGUgY3VycmVudCBwcm9jZXNzIG9uIG1hY09TIHVzaW5nIGxzb2YuXG4gKiBSZXR1cm5zIHBvcnRzIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBsc29mIG91dHB1dC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RGFyd2luUG9ydHMocGlkOiBudW1iZXIpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWNGaWxlQXN5bmMoJ2xzb2YnLCBbXG4gICAgICAnLWEnLFxuICAgICAgJy1pJyxcbiAgICAgICctUCcsXG4gICAgICAnLW4nLFxuICAgICAgJy1wJyxcbiAgICAgIHBpZC50b1N0cmluZygpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgcG9ydHM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgbGluZXMgPSBzdGRvdXQuc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBpZiAobGluZS5pbmNsdWRlcygnTElTVEVOJykpIHtcbiAgICAgICAgLy8gQ29sdW1uIDkgKDAtaW5kZXhlZDogOCkgY29udGFpbnMgdGhlIGFkZHJlc3MgbGlrZSBcIio6MzAwMFwiIG9yIFwiMTI3LjAuMC4xOjMwMDBcIlxuICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIGNvbnN0IGFkZHIgPSBwYXJ0c1s4XTtcbiAgICAgICAgaWYgKGFkZHIpIHtcbiAgICAgICAgICBjb25zdCBjb2xvbkluZGV4ID0gYWRkci5sYXN0SW5kZXhPZignOicpO1xuICAgICAgICAgIGlmIChjb2xvbkluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlUG9ydChhZGRyLnNsaWNlKGNvbG9uSW5kZXggKyAxKSk7XG4gICAgICAgICAgICBpZiAocG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHBvcnRzLnB1c2gocG9ydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvcnRzO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIEFMTCBsaXN0ZW5pbmcgcG9ydHMgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3Mgb24gV2luZG93cyB1c2luZyBuZXRzdGF0LlxuICogUmV0dXJucyBwb3J0cyBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gbmV0c3RhdCBvdXRwdXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd3NQb3J0cyhwaWQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgZXhlY0ZpbGVBc3luYygnY21kJywgW1xuICAgICAgJy9jJyxcbiAgICAgICduZXRzdGF0IC1hbm8gLXAgdGNwIHwgZmluZHN0ciBMSVNURU5JTkcnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHBhcnNlV2luZG93c05ldHN0YXRQb3J0c0ZvclBpZChzdGRvdXQsIHBpZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYWxsIGxpc3RlbmluZyBwb3J0cyBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy5cbiAqIEByZXR1cm5zIEFycmF5IG9mIHBvcnQgbnVtYmVycyB0aGUgcHJvY2VzcyBpcyBsaXN0ZW5pbmcgb24sIGluIGRldGVybWluaXN0aWMgb3JkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBbGxQb3J0cygpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gIGNvbnN0IHsgcGlkLCBwbGF0Zm9ybSB9ID0gcHJvY2VzcztcblxuICB0cnkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgIGNhc2UgJ2xpbnV4JzpcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldExpbnV4UG9ydHMocGlkKTtcbiAgICAgIGNhc2UgJ2Rhcndpbic6XG4gICAgICAgIHJldHVybiBhd2FpdCBnZXREYXJ3aW5Qb3J0cyhwaWQpO1xuICAgICAgY2FzZSAnd2luMzInOlxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0V2luZG93c1BvcnRzKHBpZCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2dldEFsbFBvcnRzXSBEZXRlY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcG9ydCBudW1iZXIgdGhhdCB0aGUgcHJvY2VzcyBpcyBsaXN0ZW5pbmcgb24uXG4gKiBAcmV0dXJucyBUaGUgcG9ydCBudW1iZXIgdGhhdCB0aGUgcHJvY2VzcyBpcyBsaXN0ZW5pbmcgb24sIG9yIHVuZGVmaW5lZCBpZiB0aGUgcHJvY2VzcyBpcyBub3QgbGlzdGVuaW5nIG9uIGFueSBwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UG9ydCgpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwb3J0cyA9IGF3YWl0IGdldEFsbFBvcnRzKCk7XG4gIHJldHVybiBwb3J0c1swXTtcbn1cblxuLy8gQ29uZmlndXJhdGlvbiBmb3IgSFRUUCBwcm9iaW5nXG5jb25zdCBQUk9CRV9USU1FT1VUX01TID0gNTAwO1xuY29uc3QgUFJPQkVfRU5EUE9JTlQgPSAnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3c/X19oZWFsdGgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2JlT3B0aW9ucyB7XG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb2JlcyBhIHBvcnQgdG8gY2hlY2sgaWYgaXQncyBzZXJ2aW5nIHRoZSB3b3JrZmxvdyBIVFRQIHNlcnZlci5cbiAqIFVzZXMgSEVBRCByZXF1ZXN0IHRvIG1pbmltaXplIG92ZXJoZWFkLlxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHBvcnQgcmVzcG9uZHMgd2l0aCBhIDIwMCBzdGF0dXMgZnJvbSB0aGUgaGVhbHRoIGNoZWNrIGVuZHBvaW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChcbiAgcG9ydDogbnVtYmVyLFxuICBvcHRpb25zOiBQcm9iZU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHsgZW5kcG9pbnQgPSBQUk9CRV9FTkRQT0lOVCwgdGltZW91dCA9IFBST0JFX1RJTUVPVVRfTVMgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9JHtlbmRwb2ludH1gLCB7XG4gICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgd29ya2Zsb3cgaGVhbHRoIGVuZHBvaW50IHJldHVybnMgMjAwIGZvciBoZWFsdGh5XG4gICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwO1xuICB9IGNhdGNoIHtcbiAgICAvLyBDb25uZWN0aW9uIHJlZnVzZWQsIHRpbWVvdXQsIG9yIG90aGVyIGVycm9yXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgd29ya2Zsb3cgc2VydmVyIHBvcnQgYnkgcHJvYmluZyBhbGwgbGlzdGVuaW5nIHBvcnRzLlxuICogVGhpcyBpcyBtb3JlIHJlbGlhYmxlIHRoYW4gZ2V0UG9ydCgpIHdoZW4gb3RoZXIgc2VydmljZXMgKGxpa2UgTm9kZS5qcyBpbnNwZWN0b3IpXG4gKiBtYXkgYWxzbyBiZSBsaXN0ZW5pbmcgb24gcG9ydHMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciBwcm9iaW5nXG4gKiBAcmV0dXJucyBUaGUgcG9ydCBudW1iZXIgb2YgdGhlIHdvcmtmbG93IHNlcnZlciwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V29ya2Zsb3dQb3J0KFxuICBvcHRpb25zPzogUHJvYmVPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwb3J0cyA9IGF3YWl0IGdldEFsbFBvcnRzKCk7XG5cbiAgaWYgKHBvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAocG9ydHMubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gT25seSBvbmUgcG9ydCwgbm8gbmVlZCB0byBwcm9iZVxuICAgIHJldHVybiBwb3J0c1swXTtcbiAgfVxuXG4gIC8vIFByb2JlIGFsbCBwb3J0cyBpbiBwYXJhbGxlbFxuICBjb25zdCBwcm9iZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwb3J0cy5tYXAoYXN5bmMgKHBvcnQpID0+ICh7XG4gICAgICBwb3J0LFxuICAgICAgaXNXb3JrZmxvdzogYXdhaXQgcHJvYmVQb3J0KHBvcnQsIG9wdGlvbnMpLFxuICAgIH0pKVxuICApO1xuXG4gIC8vIFJldHVybiBmaXJzdCBwb3J0IHRoYXQgcmVzcG9uZGVkIGFzIHdvcmtmbG93IHNlcnZlclxuICBjb25zdCB3b3JrZmxvd1BvcnQgPSBwcm9iZVJlc3VsdHMuZmluZCgocikgPT4gci5pc1dvcmtmbG93KTtcbiAgaWYgKHdvcmtmbG93UG9ydCkge1xuICAgIHJldHVybiB3b3JrZmxvd1BvcnQucG9ydDtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGZpcnN0IHBvcnQgaWYgcHJvYmluZyBkb2Vzbid0IGlkZW50aWZ5IHdvcmtmbG93IHNlcnZlclxuICAvLyBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmU6XG4gIC8vIC0gU2VydmVyIGhhc24ndCBzdGFydGVkIHdvcmtmbG93IHJvdXRlcyB5ZXRcbiAgLy8gLSBOZXR3b3JrIGlzc3VlcyBkdXJpbmcgcHJvYmluZ1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgJ1tnZXRXb3JrZmxvd1BvcnRdIFByb2JpbmcgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZmlyc3QgcG9ydDonLFxuICAgICAgcG9ydHNbMF1cbiAgICApO1xuICB9XG4gIHJldHVybiBwb3J0c1swXTtcbn1cbiJdfQ==
|