@fgv/ts-utils 1.6.0 → 1.6.2
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/package.json +1 -1
- package/recordJarHelpers.d.ts +18 -7
- package/recordJarHelpers.d.ts.map +1 -1
- package/recordJarHelpers.js +69 -24
package/package.json
CHANGED
package/recordJarHelpers.d.ts
CHANGED
|
@@ -1,23 +1,34 @@
|
|
|
1
1
|
import { Result } from './result';
|
|
2
|
+
/**
|
|
3
|
+
* Represents a single record in a JAR file
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
export type JarRecord = Record<string, string | string[]>;
|
|
7
|
+
export type JarFieldPicker<T extends JarRecord = JarRecord> = (record: T) => (keyof T)[];
|
|
8
|
+
/**
|
|
9
|
+
* Options for a JAR record parser.
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export interface JarRecordParserOptions {
|
|
13
|
+
readonly arrayFields?: string[] | JarFieldPicker;
|
|
14
|
+
readonly fixedContinuationSize?: number;
|
|
15
|
+
}
|
|
2
16
|
/**
|
|
3
17
|
* Reads a record-jar from an array of strings, each of which represents one
|
|
4
18
|
* line in the source file.
|
|
5
19
|
* @param lines - the array of strings to be parsed
|
|
20
|
+
* @param options - Optional parser configuration
|
|
6
21
|
* @returns a corresponding array of `Record<string, string>`
|
|
7
22
|
* @public
|
|
8
23
|
*/
|
|
9
|
-
export declare function parseRecordJarLines(lines: string[]): Result<
|
|
10
|
-
/**
|
|
11
|
-
* A {@link Converter} to an array of `Record<string, string>` from an array of strings.
|
|
12
|
-
* @public
|
|
13
|
-
*/
|
|
14
|
-
export declare const recordJar: import("./converter").Converter<Record<string, string>[], unknown>;
|
|
24
|
+
export declare function parseRecordJarLines(lines: string[], options?: JarRecordParserOptions): Result<JarRecord[]>;
|
|
15
25
|
/**
|
|
16
26
|
* Reads a record-jar file from a supplied path.
|
|
17
27
|
* @param srcPath - Source path from which the file is read.
|
|
28
|
+
* @param options - Optional parser configuration
|
|
18
29
|
* @returns The contents of the file as an array of `Record<string, string>`
|
|
19
30
|
* @see https://datatracker.ietf.org/doc/html/draft-phillips-record-jar-01
|
|
20
31
|
* @public
|
|
21
32
|
*/
|
|
22
|
-
export declare function readRecordJarFileSync(srcPath: string): Result<
|
|
33
|
+
export declare function readRecordJarFileSync(srcPath: string, options?: JarRecordParserOptions): Result<JarRecord[]>;
|
|
23
34
|
//# sourceMappingURL=recordJarHelpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordJarHelpers.d.ts","sourceRoot":"","sources":["../src/recordJarHelpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recordJarHelpers.d.ts","sourceRoot":"","sources":["../src/recordJarHelpers.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,MAAM,EAAgC,MAAM,UAAU,CAAC;AAQhE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;AAE1D,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;AAEzF;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;IACjD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC3C;AAuMD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAE1G;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAO5G"}
|
package/recordJarHelpers.js
CHANGED
|
@@ -44,25 +44,24 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
44
44
|
return result;
|
|
45
45
|
};
|
|
46
46
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
-
exports.readRecordJarFileSync = exports.
|
|
48
|
-
const Converters = __importStar(require("./converters"));
|
|
47
|
+
exports.readRecordJarFileSync = exports.parseRecordJarLines = void 0;
|
|
49
48
|
const fs = __importStar(require("fs"));
|
|
50
49
|
const path = __importStar(require("path"));
|
|
51
50
|
const result_1 = require("./result");
|
|
52
|
-
const
|
|
51
|
+
const utils_1 = require("./utils");
|
|
53
52
|
class RecordParser {
|
|
54
53
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
55
|
-
constructor() {
|
|
54
|
+
constructor(options) {
|
|
56
55
|
this.records = [];
|
|
57
|
-
this._fields =
|
|
56
|
+
this._fields = {};
|
|
58
57
|
this._name = undefined;
|
|
59
58
|
this._body = undefined;
|
|
59
|
+
this.options = options !== null && options !== void 0 ? options : {};
|
|
60
60
|
}
|
|
61
|
-
static parse(lines) {
|
|
62
|
-
return new RecordParser()._parse(lines);
|
|
61
|
+
static parse(lines, options) {
|
|
62
|
+
return new RecordParser(options)._parse(lines);
|
|
63
63
|
}
|
|
64
|
-
static _parseRecordBody(
|
|
65
|
-
let body = `${oldBody !== null && oldBody !== void 0 ? oldBody : ''}${from.trim()}`;
|
|
64
|
+
static _parseRecordBody(body) {
|
|
66
65
|
const isContinuation = body.endsWith('\\');
|
|
67
66
|
if (isContinuation) {
|
|
68
67
|
body = body.slice(0, body.length - 1);
|
|
@@ -102,6 +101,21 @@ class RecordParser {
|
|
|
102
101
|
}
|
|
103
102
|
return (0, result_1.succeed)(escaped);
|
|
104
103
|
}
|
|
104
|
+
static _applyOptions(record, options) {
|
|
105
|
+
if (options.arrayFields) {
|
|
106
|
+
record = { ...record }; // don't edit incoming values
|
|
107
|
+
const arrayFields = Array.isArray(options.arrayFields)
|
|
108
|
+
? options.arrayFields
|
|
109
|
+
: options.arrayFields(record);
|
|
110
|
+
for (const field of arrayFields) {
|
|
111
|
+
if ((0, utils_1.isKeyOf)(field, record) && typeof record[field] === 'string') {
|
|
112
|
+
const current = record[field];
|
|
113
|
+
record[field] = [current];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return record;
|
|
118
|
+
}
|
|
105
119
|
_parse(lines) {
|
|
106
120
|
var _a, _b;
|
|
107
121
|
for (let n = 0; n < lines.length; n++) {
|
|
@@ -124,7 +138,7 @@ class RecordParser {
|
|
|
124
138
|
if (this._body === undefined) {
|
|
125
139
|
return (0, result_1.fail)(`${n}: continuation ("${line}") without prior value.`);
|
|
126
140
|
}
|
|
127
|
-
const result =
|
|
141
|
+
const result = this._parseContinuation(line);
|
|
128
142
|
if (result.isFailure()) {
|
|
129
143
|
return (0, result_1.fail)(`${n}: ${result.message}`);
|
|
130
144
|
}
|
|
@@ -154,18 +168,42 @@ class RecordParser {
|
|
|
154
168
|
];
|
|
155
169
|
return this._writePendingField().onSuccess(() => {
|
|
156
170
|
this._name = parts[0].trimEnd();
|
|
157
|
-
return RecordParser._parseRecordBody(parts[1]).onSuccess((body) => {
|
|
171
|
+
return RecordParser._parseRecordBody(parts[1].trim()).onSuccess((body) => {
|
|
158
172
|
this._body = body;
|
|
159
173
|
return (0, result_1.succeed)(true);
|
|
160
174
|
});
|
|
161
175
|
});
|
|
162
176
|
}
|
|
177
|
+
_parseContinuation(line) {
|
|
178
|
+
var _a, _b;
|
|
179
|
+
let trimmed = line.trim();
|
|
180
|
+
if (!this._body.isContinuation) {
|
|
181
|
+
// istanbul ignore next
|
|
182
|
+
const fixedSize = (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.fixedContinuationSize) !== null && _b !== void 0 ? _b : 0;
|
|
183
|
+
if (fixedSize > 0) {
|
|
184
|
+
if (trimmed.length < line.length - fixedSize) {
|
|
185
|
+
// oops, took too much
|
|
186
|
+
trimmed = line.slice(fixedSize);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return RecordParser._parseRecordBody(trimmed).onSuccess((newBody) => {
|
|
191
|
+
return (0, result_1.succeed)({
|
|
192
|
+
body: `${this._body.body}${newBody.body}`,
|
|
193
|
+
isContinuation: newBody.isContinuation,
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
_havePendingRecord() {
|
|
198
|
+
return Object.keys(this._fields).length > 0;
|
|
199
|
+
}
|
|
163
200
|
_writePendingRecord() {
|
|
164
201
|
return this._writePendingField().onSuccess(() => {
|
|
165
|
-
|
|
202
|
+
let record = this._havePendingRecord() ? this._fields : undefined;
|
|
166
203
|
if (record !== undefined) {
|
|
204
|
+
record = RecordParser._applyOptions(record, this.options);
|
|
167
205
|
this.records.push(record);
|
|
168
|
-
this._fields =
|
|
206
|
+
this._fields = {};
|
|
169
207
|
}
|
|
170
208
|
return (0, result_1.succeed)(undefined);
|
|
171
209
|
});
|
|
@@ -175,7 +213,17 @@ class RecordParser {
|
|
|
175
213
|
if (this._body.body.length < 1) {
|
|
176
214
|
return (0, result_1.fail)('empty body value not allowed');
|
|
177
215
|
}
|
|
178
|
-
|
|
216
|
+
if (!(0, utils_1.isKeyOf)(this._name, this._fields)) {
|
|
217
|
+
this._fields[this._name] = this._body.body;
|
|
218
|
+
}
|
|
219
|
+
else if (typeof this._fields[this._name] === 'string') {
|
|
220
|
+
const current = this._fields[this._name];
|
|
221
|
+
this._fields[this._name] = [current, this._body.body];
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
const current = this._fields[this._name];
|
|
225
|
+
current.push(this._body.body);
|
|
226
|
+
}
|
|
179
227
|
this._name = undefined;
|
|
180
228
|
this._body = undefined;
|
|
181
229
|
}
|
|
@@ -186,32 +234,29 @@ class RecordParser {
|
|
|
186
234
|
* Reads a record-jar from an array of strings, each of which represents one
|
|
187
235
|
* line in the source file.
|
|
188
236
|
* @param lines - the array of strings to be parsed
|
|
237
|
+
* @param options - Optional parser configuration
|
|
189
238
|
* @returns a corresponding array of `Record<string, string>`
|
|
190
239
|
* @public
|
|
191
240
|
*/
|
|
192
|
-
function parseRecordJarLines(lines) {
|
|
193
|
-
return RecordParser.parse(lines);
|
|
241
|
+
function parseRecordJarLines(lines, options) {
|
|
242
|
+
return RecordParser.parse(lines, options);
|
|
194
243
|
}
|
|
195
244
|
exports.parseRecordJarLines = parseRecordJarLines;
|
|
196
|
-
/**
|
|
197
|
-
* A {@link Converter} to an array of `Record<string, string>` from an array of strings.
|
|
198
|
-
* @public
|
|
199
|
-
*/
|
|
200
|
-
exports.recordJar = Converters.validated(validation_1.Validators.arrayOf(validation_1.Validators.string)).map(parseRecordJarLines);
|
|
201
245
|
/**
|
|
202
246
|
* Reads a record-jar file from a supplied path.
|
|
203
247
|
* @param srcPath - Source path from which the file is read.
|
|
248
|
+
* @param options - Optional parser configuration
|
|
204
249
|
* @returns The contents of the file as an array of `Record<string, string>`
|
|
205
250
|
* @see https://datatracker.ietf.org/doc/html/draft-phillips-record-jar-01
|
|
206
251
|
* @public
|
|
207
252
|
*/
|
|
208
|
-
function readRecordJarFileSync(srcPath) {
|
|
253
|
+
function readRecordJarFileSync(srcPath, options) {
|
|
209
254
|
return (0, result_1.captureResult)(() => {
|
|
210
255
|
const fullPath = path.resolve(srcPath);
|
|
211
256
|
return fs.readFileSync(fullPath, 'utf8').toString().split(/\r?\n/);
|
|
212
257
|
}).onSuccess((lines) => {
|
|
213
|
-
return parseRecordJarLines(lines);
|
|
258
|
+
return parseRecordJarLines(lines, options);
|
|
214
259
|
});
|
|
215
260
|
}
|
|
216
261
|
exports.readRecordJarFileSync = readRecordJarFileSync;
|
|
217
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkSmFySGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWNvcmRKYXJIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgseURBQTJDO0FBQzNDLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFN0IscUNBQWdFO0FBQ2hFLDZDQUEwQztBQU8xQyxNQUFNLFlBQVk7SUFPZCxnRUFBZ0U7SUFDaEU7UUFQZ0IsWUFBTyxHQUE2QixFQUFFLENBQUM7UUFFN0MsWUFBTyxHQUF1QixFQUFFLENBQUM7UUFDakMsVUFBSyxHQUF1QixTQUFTLENBQUM7UUFDdEMsVUFBSyxHQUEyQixTQUFTLENBQUM7SUFHN0IsQ0FBQztJQUVqQixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQWU7UUFDL0IsT0FBTyxJQUFJLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRVMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQVksRUFBRSxPQUFnQjtRQUM1RCxJQUFJLElBQUksR0FBRyxHQUFHLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM1QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksY0FBYyxFQUFFO1lBQ2hCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFD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Q0FBQztRQUN2QyxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNuQixPQUFPLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVBELHNEQU9DIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMiBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCAqIGFzIENvbnZlcnRlcnMgZnJvbSAnLi9jb252ZXJ0ZXJzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IFJlc3VsdCwgY2FwdHVyZVJlc3VsdCwgZmFpbCwgc3VjY2VlZCB9IGZyb20gJy4vcmVzdWx0JztcbmltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuXG5pbnRlcmZhY2UgUmVjb3JkQm9keSB7XG4gICAgYm9keTogc3RyaW5nO1xuICAgIGlzQ29udGludWF0aW9uOiBib29sZWFuO1xufVxuXG5jbGFzcyBSZWNvcmRQYXJzZXIge1xuICAgIHB1YmxpYyByZWFkb25seSByZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gPSBbXTtcblxuICAgIHByb3RlY3RlZCBfZmllbGRzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgICBwcm90ZWN0ZWQgX25hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBwcm90ZWN0ZWQgX2JvZHk6IFJlY29yZEJvZHkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlKGxpbmVzOiBzdHJpbmdbXSk6IFJlc3VsdDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWNvcmRQYXJzZXIoKS5fcGFyc2UobGluZXMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzdGF0aWMgX3BhcnNlUmVjb3JkQm9keShmcm9tOiBzdHJpbmcsIG9sZEJvZHk/OiBzdHJpbmcpOiBSZXN1bHQ8UmVjb3JkQm9keT4ge1xuICAgICAgICBsZXQgYm9keSA9IGAke29sZEJvZHkgPz8gJyd9JHtmcm9tLnRyaW0oKX1gO1xuICAgICAgICBjb25zdCBpc0NvbnRpbnVhdGlvbiA9IGJvZHkuZW5kc1dpdGgoJ1xcXFwnKTtcbiAgICAgICAgaWYgKGlzQ29udGludWF0aW9uKSB7XG4gICAgICAgICAgICBib2R5ID0gYm9keS5zbGljZSgwLCBib2R5Lmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9oYXNFc2NhcGVzKGJvZHkpKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9yZXBsYWNlRXNjYXBlcyhib2R5KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBib2R5ID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHsgYm9keSwgaXNDb250aW51YXRpb24gfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfaGFzRXNjYXBlcyhmcm9tOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZyb20uaW5jbHVkZXMoJ1xcXFwnKSB8fCBmcm9tLmluY2x1ZGVzKCcmJyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfcmVwbGFjZUVzY2FwZXMoYm9keTogc3RyaW5nKTogUmVzdWx0PHN0cmluZz4ge1xuICAgICAgICBjb25zdCBpbnZhbGlkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBlc2NhcGVkID0gYm9keS5yZXBsYWNlKC8oXFxcXC4pfCgmI3hbYS1mQS1GMC05XXsyLDZ9OykvZywgKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxcXFxcXFwnOiByZXR1cm4gJ1xcXFwnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFwmJzogcmV0dXJuICcmJztcbiAgICAgICAgICAgICAgICBjYXNlICdcXFxccic6IHJldHVybiAnXFxyJztcbiAgICAgICAgICAgICAgICBjYXNlICdcXFxcbic6IHJldHVybiAnXFxuJztcbiAgICAgICAgICAgICAgICBjYXNlICdcXFxcdCc6IHJldHVybiAnXFx0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaC5zdGFydHNXaXRoKCcmJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZXhDb2RlID0gYDB4JHttYXRjaC5zbGljZSgzLCBtYXRjaC5sZW5ndGggLSAxKX1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gTnVtYmVyLnBhcnNlSW50KGhleENvZGUsIDE2KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnZhbGlkLnB1c2gobWF0Y2gpO1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbnZhbGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGB1bnJlY29nbml6ZWQgZXNjYXBlIFwiJHtpbnZhbGlkLmpvaW4oJywgJyl9XCIgaW4gcmVjb3JkLWphciBib2R5YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZXNjYXBlZCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9wYXJzZShsaW5lczogc3RyaW5nW10pOiBSZXN1bHQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPltdPiB7XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbGluZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tuXTtcbiAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJyUlJykgJiYgIXRoaXMuX2JvZHk/LmlzQ29udGludWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fd3JpdGVQZW5kaW5nUmVjb3JkKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgvXlxccyokLy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGJsYW5rIGxpbmVzIGJ1dCBjYW5jZWwgY29udGludWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2JvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYm9keS5pc0NvbnRpbnVhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2JvZHk/LmlzQ29udGludWF0aW9uIHx8IC9eXFxzKy8udGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNvbnRpbnVhdGlvbiBvbiBwcmV2aW91cyBsaW5lIG9yIGltcGxpY2l0IHN0YXJ0cyB3aXRoIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGAke259OiBjb250aW51YXRpb24gKFwiJHtsaW5lfVwiKSB3aXRob3V0IHByaW9yIHZhbHVlLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWNvcmRQYXJzZXIuX3BhcnNlUmVjb3JkQm9keShsaW5lLCB0aGlzLl9ib2R5LmJvZHkpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bn06ICR7cmVzdWx0Lm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2JvZHkgPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZUZpZWxkKGxpbmUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bn06ICR7cmVzdWx0Lm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fd3JpdGVQZW5kaW5nUmVjb3JkKCk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGAke2xpbmVzLmxlbmd0aH06ICR7cmVzdWx0Lm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodGhpcy5yZWNvcmRzKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhcnNlRmllbGQobGluZTogc3RyaW5nKTogUmVzdWx0PGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKHNlcGFyYXRvckluZGV4IDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYG1hbGZvcm1lZCBsaW5lIChcIiR7bGluZX1cIikgaW4gcmVjb3JkLWphci5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgICAgICAgIGxpbmUuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLFxuICAgICAgICAgICAgbGluZS5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpLFxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZVBlbmRpbmdGaWVsZCgpLm9uU3VjY2VzcygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gcGFydHNbMF0udHJpbUVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuIFJlY29yZFBhcnNlci5fcGFyc2VSZWNvcmRCb2R5KHBhcnRzWzFdKS5vblN1Y2Nlc3MoKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ib2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3dyaXRlUGVuZGluZ1JlY29yZCgpOiBSZXN1bHQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVQZW5kaW5nRmllbGQoKS5vblN1Y2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5fZmllbGRzLmxlbmd0aCA+IDAgPyBPYmplY3QuZnJvbUVudHJpZXModGhpcy5fZmllbGRzKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChyZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3dyaXRlUGVuZGluZ0ZpZWxkKCk6IFJlc3VsdDxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLl9uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ib2R5IS5ib2R5Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbCgnZW1wdHkgYm9keSB2YWx1ZSBub3QgYWxsb3dlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZmllbGRzLnB1c2goW3RoaXMuX25hbWUsIHRoaXMuX2JvZHkhLmJvZHldKTtcbiAgICAgICAgICAgIHRoaXMuX25hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9ib2R5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHRydWUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWFkcyBhIHJlY29yZC1qYXIgZnJvbSBhbiBhcnJheSBvZiBzdHJpbmdzLCBlYWNoIG9mIHdoaWNoIHJlcHJlc2VudHMgb25lXG4gKiBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZS5cbiAqIEBwYXJhbSBsaW5lcyAtIHRoZSBhcnJheSBvZiBzdHJpbmdzIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMgYSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIGBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+YFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZWNvcmRKYXJMaW5lcyhsaW5lczogc3RyaW5nW10pOiBSZXN1bHQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPltdPiB7XG4gICAgcmV0dXJuIFJlY29yZFBhcnNlci5wYXJzZShsaW5lcyk7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgQ29udmVydGVyfSB0byBhbiBhcnJheSBvZiBgUmVjb3JkPHN0cmluZywgc3RyaW5nPmAgZnJvbSBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVjb3JkSmFyID0gQ29udmVydGVycy52YWxpZGF0ZWQoVmFsaWRhdG9ycy5hcnJheU9mKFZhbGlkYXRvcnMuc3RyaW5nKSkubWFwKHBhcnNlUmVjb3JkSmFyTGluZXMpO1xuXG4vKipcbiAqIFJlYWRzIGEgcmVjb3JkLWphciBmaWxlIGZyb20gYSBzdXBwbGllZCBwYXRoLlxuICogQHBhcmFtIHNyY1BhdGggLSBTb3VyY2UgcGF0aCBmcm9tIHdoaWNoIHRoZSBmaWxlIGlzIHJlYWQuXG4gKiBAcmV0dXJucyBUaGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXMgYW4gYXJyYXkgb2YgYFJlY29yZDxzdHJpbmcsIHN0cmluZz5gXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtcGhpbGxpcHMtcmVjb3JkLWphci0wMVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlY29yZEphckZpbGVTeW5jKHNyY1BhdGg6IHN0cmluZyk6IFJlc3VsdDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10+IHtcbiAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHNyY1BhdGgpO1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmOCcpLnRvU3RyaW5nKCkuc3BsaXQoL1xccj9cXG4vKTtcbiAgICB9KS5vblN1Y2Nlc3MoKGxpbmVzKSA9PiB7XG4gICAgICAgIHJldHVybiBwYXJzZVJlY29yZEphckxpbmVzKGxpbmVzKTtcbiAgICB9KTtcbn1cbiJdfQ==
|
|
262
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkSmFySGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWNvcmRKYXJIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUU3QixxQ0FBZ0U7QUFDaEUsbUNBQWtDO0FBd0JsQyxNQUFNLFlBQVk7SUFRZCxnRUFBZ0U7SUFDaEUsWUFBb0IsT0FBZ0M7UUFScEMsWUFBTyxHQUFnQixFQUFFLENBQUM7UUFHaEMsWUFBTyxHQUFjLEVBQUUsQ0FBQztRQUN4QixVQUFLLEdBQXVCLFNBQVMsQ0FBQztRQUN0QyxVQUFLLEdBQTJCLFNBQVMsQ0FBQztRQUloRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFlLEVBQUUsT0FBZ0M7UUFDakUsT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVTLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFZO1FBQzFDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxjQUFjLEVBQUU7WUFDaEIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDekM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQyxJQUFJLE1BQU0sQ0FBQyxTQUFT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QUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFQRCxzREFPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBSZXN1bHQsIGNhcHR1cmVSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5pbXBvcnQgeyBpc0tleU9mIH0gZnJvbSAnLi91dGlscyc7XG5cbmludGVyZmFjZSBSZWNvcmRCb2R5IHtcbiAgICBib2R5OiBzdHJpbmc7XG4gICAgaXNDb250aW51YXRpb246IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHNpbmdsZSByZWNvcmQgaW4gYSBKQVIgZmlsZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBKYXJSZWNvcmQgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT47XG5cbmV4cG9ydCB0eXBlIEphckZpZWxkUGlja2VyPFQgZXh0ZW5kcyBKYXJSZWNvcmQgPSBKYXJSZWNvcmQ+ID0gKHJlY29yZDogVCkgPT4gKGtleW9mIFQpW107XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSBKQVIgcmVjb3JkIHBhcnNlci5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKYXJSZWNvcmRQYXJzZXJPcHRpb25zIHtcbiAgICByZWFkb25seSBhcnJheUZpZWxkcz86IHN0cmluZ1tdIHwgSmFyRmllbGRQaWNrZXI7XG4gICAgcmVhZG9ubHkgZml4ZWRDb250aW51YXRpb25TaXplPzogbnVtYmVyO1xufVxuXG5jbGFzcyBSZWNvcmRQYXJzZXIge1xuICAgIHB1YmxpYyByZWFkb25seSByZWNvcmRzOiBKYXJSZWNvcmRbXSA9IFtdO1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zO1xuXG4gICAgcHJvdGVjdGVkIF9maWVsZHM6IEphclJlY29yZCA9IHt9O1xuICAgIHByb3RlY3RlZCBfbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfYm9keTogUmVjb3JkQm9keSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZShsaW5lczogc3RyaW5nW10sIG9wdGlvbnM/OiBKYXJSZWNvcmRQYXJzZXJPcHRpb25zKTogUmVzdWx0PEphclJlY29yZFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUmVjb3JkUGFyc2VyKG9wdGlvbnMpLl9wYXJzZShsaW5lcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfcGFyc2VSZWNvcmRCb2R5KGJvZHk6IHN0cmluZyk6IFJlc3VsdDxSZWNvcmRCb2R5PiB7XG4gICAgICAgIGNvbnN0IGlzQ29udGludWF0aW9uID0gYm9keS5lbmRzV2l0aCgnXFxcXCcpO1xuICAgICAgICBpZiAoaXNDb250aW51YXRpb24pIHtcbiAgICAgICAgICAgIGJvZHkgPSBib2R5LnNsaWNlKDAsIGJvZHkubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2hhc0VzY2FwZXMoYm9keSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3JlcGxhY2VFc2NhcGVzKGJvZHkpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJvZHkgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoeyBib2R5LCBpc0NvbnRpbnVhdGlvbiB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9oYXNFc2NhcGVzKGZyb206IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZnJvbS5pbmNsdWRlcygnXFxcXCcpIHx8IGZyb20uaW5jbHVkZXMoJyYnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9yZXBsYWNlRXNjYXBlcyhib2R5OiBzdHJpbmcpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGludmFsaWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IGVzY2FwZWQgPSBib2R5LnJlcGxhY2UoLyhcXFxcLil8KCYjeFthLWZBLUYwLTldezIsNn07KS9nLCAobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdcXFxcXFxcXCc6IHJldHVybiAnXFxcXCc7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxcXCYnOiByZXR1cm4gJyYnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFxyJzogcmV0dXJuICdcXHInO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFxuJzogcmV0dXJuICdcXG4nO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1xcXFx0JzogcmV0dXJuICdcXHQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoLnN0YXJ0c1dpdGgoJyYnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhleENvZGUgPSBgMHgke21hdGNoLnNsaWNlKDMsIG1hdGNoLmxlbmd0aCAtIDEpfWA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSBOdW1iZXIucGFyc2VJbnQoaGV4Q29kZSwgMTYpO1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludmFsaWQucHVzaChtYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFwnO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGludmFsaWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYHVucmVjb2duaXplZCBlc2NhcGUgXCIke2ludmFsaWQuam9pbignLCAnKX1cIiBpbiByZWNvcmQtamFyIGJvZHlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZChlc2NhcGVkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9hcHBseU9wdGlvbnMocmVjb3JkOiBKYXJSZWNvcmQsIG9wdGlvbnM6IEphclJlY29yZFBhcnNlck9wdGlvbnMpOiBKYXJSZWNvcmQge1xuICAgICAgICBpZiAob3B0aW9ucy5hcnJheUZpZWxkcykge1xuICAgICAgICAgICAgcmVjb3JkID0geyAuLi5yZWNvcmQgfTsgLy8gZG9uJ3QgZWRpdCBpbmNvbWluZyB2YWx1ZXNcbiAgICAgICAgICAgIGNvbnN0IGFycmF5RmllbGRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmFycmF5RmllbGRzKVxuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5hcnJheUZpZWxkc1xuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5hcnJheUZpZWxkcyhyZWNvcmQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGFycmF5RmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzS2V5T2YoZmllbGQsIHJlY29yZCkgJiYgdHlwZW9mIHJlY29yZFtmaWVsZF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSByZWNvcmRbZmllbGRdIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2ZpZWxkXSA9IFtjdXJyZW50XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhcnNlKGxpbmVzOiBzdHJpbmdbXSk6IFJlc3VsdDxKYXJSZWNvcmRbXT4ge1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGxpbmVzLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbbl07XG4gICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCclJScpICYmICF0aGlzLl9ib2R5Py5pc0NvbnRpbnVhdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3dyaXRlUGVuZGluZ1JlY29yZCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bn06ICR7cmVzdWx0Lm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoL15cXHMqJC8udGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBibGFuayBsaW5lcyBidXQgY2FuY2VsIGNvbnRpbnVhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2JvZHkuaXNDb250aW51YXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9ib2R5Py5pc0NvbnRpbnVhdGlvbiB8fCAvXlxccysvLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBjb250aW51YXRpb24gb24gcHJldmlvdXMgbGluZSBvciBpbXBsaWNpdCBzdGFydHMgd2l0aCB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2JvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogY29udGludWF0aW9uIChcIiR7bGluZX1cIikgd2l0aG91dCBwcmlvciB2YWx1ZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2VDb250aW51YXRpb24obGluZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fYm9keSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlRmllbGQobGluZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtufTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl93cml0ZVBlbmRpbmdSZWNvcmQoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bGluZXMubGVuZ3RofTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZCh0aGlzLnJlY29yZHMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcGFyc2VGaWVsZChsaW5lOiBzdHJpbmcpOiBSZXN1bHQ8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgbWFsZm9ybWVkIGxpbmUgKFwiJHtsaW5lfVwiKSBpbiByZWNvcmQtamFyLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgICAgICAgbGluZS5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCksXG4gICAgICAgICAgICBsaW5lLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSksXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlUGVuZGluZ0ZpZWxkKCkub25TdWNjZXNzKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX25hbWUgPSBwYXJ0c1swXS50cmltRW5kKCk7XG4gICAgICAgICAgICByZXR1cm4gUmVjb3JkUGFyc2VyLl9wYXJzZVJlY29yZEJvZHkocGFydHNbMV0udHJpbSgpKS5vblN1Y2Nlc3MoKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ib2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhcnNlQ29udGludWF0aW9uKGxpbmU6IHN0cmluZyk6IFJlc3VsdDxSZWNvcmRCb2R5PiB7XG4gICAgICAgIGxldCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICAgIGlmICghdGhpcy5fYm9keSEuaXNDb250aW51YXRpb24pIHtcbiAgICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgICAgICBjb25zdCBmaXhlZFNpemUgPSB0aGlzLm9wdGlvbnM/LmZpeGVkQ29udGludWF0aW9uU2l6ZSA/PyAwO1xuICAgICAgICAgICAgaWYgKGZpeGVkU2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodHJpbW1lZC5sZW5ndGggPCBsaW5lLmxlbmd0aCAtIGZpeGVkU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBvb3BzLCB0b29rIHRvbyBtdWNoXG4gICAgICAgICAgICAgICAgICAgIHRyaW1tZWQgPSBsaW5lLnNsaWNlKGZpeGVkU2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWNvcmRQYXJzZXIuX3BhcnNlUmVjb3JkQm9keSh0cmltbWVkKS5vblN1Y2Nlc3MoKG5ld0JvZHkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHtcbiAgICAgICAgICAgICAgICBib2R5OiBgJHt0aGlzLl9ib2R5IS5ib2R5fSR7bmV3Qm9keS5ib2R5fWAsXG4gICAgICAgICAgICAgICAgaXNDb250aW51YXRpb246IG5ld0JvZHkuaXNDb250aW51YXRpb24sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9oYXZlUGVuZGluZ1JlY29yZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2ZpZWxkcykubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3dyaXRlUGVuZGluZ1JlY29yZCgpOiBSZXN1bHQ8SmFyUmVjb3JkIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZVBlbmRpbmdGaWVsZCgpLm9uU3VjY2VzcygoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVjb3JkID0gdGhpcy5faGF2ZVBlbmRpbmdSZWNvcmQoKSA/IHRoaXMuX2ZpZWxkcyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChyZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlY29yZCA9IFJlY29yZFBhcnNlci5fYXBwbHlPcHRpb25zKHJlY29yZCwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF93cml0ZVBlbmRpbmdGaWVsZCgpOiBSZXN1bHQ8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy5fbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYm9keSEuYm9keS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoJ2VtcHR5IGJvZHkgdmFsdWUgbm90IGFsbG93ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNLZXlPZih0aGlzLl9uYW1lLCB0aGlzLl9maWVsZHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzW3RoaXMuX25hbWVdID0gdGhpcy5fYm9keSEuYm9keTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9maWVsZHNbdGhpcy5fbmFtZV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2ZpZWxkc1t0aGlzLl9uYW1lXSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzW3RoaXMuX25hbWVdID0gW2N1cnJlbnQsIHRoaXMuX2JvZHkhLmJvZHldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2ZpZWxkc1t0aGlzLl9uYW1lXSBhcyBzdHJpbmdbXTtcbiAgICAgICAgICAgICAgICBjdXJyZW50LnB1c2godGhpcy5fYm9keSEuYm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fYm9keSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVhZHMgYSByZWNvcmQtamFyIGZyb20gYW4gYXJyYXkgb2Ygc3RyaW5ncywgZWFjaCBvZiB3aGljaCByZXByZXNlbnRzIG9uZVxuICogbGluZSBpbiB0aGUgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gbGluZXMgLSB0aGUgYXJyYXkgb2Ygc3RyaW5ncyB0byBiZSBwYXJzZWRcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcGFyc2VyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIGEgY29ycmVzcG9uZGluZyBhcnJheSBvZiBgUmVjb3JkPHN0cmluZywgc3RyaW5nPmBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVjb3JkSmFyTGluZXMobGluZXM6IHN0cmluZ1tdLCBvcHRpb25zPzogSmFyUmVjb3JkUGFyc2VyT3B0aW9ucyk6IFJlc3VsdDxKYXJSZWNvcmRbXT4ge1xuICAgIHJldHVybiBSZWNvcmRQYXJzZXIucGFyc2UobGluZXMsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgcmVjb3JkLWphciBmaWxlIGZyb20gYSBzdXBwbGllZCBwYXRoLlxuICogQHBhcmFtIHNyY1BhdGggLSBTb3VyY2UgcGF0aCBmcm9tIHdoaWNoIHRoZSBmaWxlIGlzIHJlYWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHBhcnNlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBUaGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXMgYW4gYXJyYXkgb2YgYFJlY29yZDxzdHJpbmcsIHN0cmluZz5gXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtcGhpbGxpcHMtcmVjb3JkLWphci0wMVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlY29yZEphckZpbGVTeW5jKHNyY1BhdGg6IHN0cmluZywgb3B0aW9ucz86IEphclJlY29yZFBhcnNlck9wdGlvbnMpOiBSZXN1bHQ8SmFyUmVjb3JkW10+IHtcbiAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHNyY1BhdGgpO1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmOCcpLnRvU3RyaW5nKCkuc3BsaXQoL1xccj9cXG4vKTtcbiAgICB9KS5vblN1Y2Nlc3MoKGxpbmVzKSA9PiB7XG4gICAgICAgIHJldHVybiBwYXJzZVJlY29yZEphckxpbmVzKGxpbmVzLCBvcHRpb25zKTtcbiAgICB9KTtcbn1cbiJdfQ==
|