1 | import from2 from "from2";
|
2 | import fs from "fs";
|
3 | import libReport from "istanbul-lib-report";
|
4 | import merge2 from "merge2";
|
5 | import sysPath from "path";
|
6 | import stream from "stream";
|
7 | import Vinyl from "vinyl";
|
8 | function createContext(options) {
|
9 | const context = libReport.createContext(options);
|
10 | if (context.writer !== options.writer) {
|
11 | Object.defineProperty(context, "writer", { value: options.writer });
|
12 | }
|
13 | return context;
|
14 | }
|
15 | export function wrapFileReporter(reporter) {
|
16 | function reportVinyl(options) {
|
17 | let done = false;
|
18 | return from2({ objectMode: true }, (_, next) => {
|
19 | if (done) {
|
20 | next(null, null); // end of stream
|
21 | return;
|
22 | }
|
23 | const cwd = process.cwd();
|
24 | const writer = new VinylWriter(cwd, cwd, next);
|
25 | // TODO: Fix istanbul-lib-report types
|
26 | const context = createContext({
|
27 | coverageMap: options.map,
|
28 | writer,
|
29 | sourceFinder: options.sourceFinder,
|
30 | });
|
31 | const tree = context.getTree("pkg");
|
32 | tree.visit(reporter, context);
|
33 | done = true;
|
34 | });
|
35 | }
|
36 | return { reportVinyl };
|
37 | }
|
38 | class VinylWriter {
|
39 | constructor(base, dir, next) {
|
40 | this.base = base;
|
41 | this.dir = dir;
|
42 | this.next = next;
|
43 | }
|
44 | copyFile(source, dest) {
|
45 | const content = fs.readFileSync(source);
|
46 | const resolvedPath = sysPath.join(this.dir, dest);
|
47 | const vinyl = new Vinyl({
|
48 | cwd: this.base,
|
49 | base: this.base,
|
50 | path: resolvedPath,
|
51 | contents: content,
|
52 | });
|
53 | this.next(null, vinyl);
|
54 | }
|
55 | writeFile(file) {
|
56 | if (typeof file !== "string") {
|
57 | throw new Error("NotSupported: StreamWriter#writeFile(file: null)");
|
58 | }
|
59 | const resolvedPath = sysPath.join(this.dir, file);
|
60 | return new VinylContentWriter((content) => {
|
61 | const vinyl = new Vinyl({
|
62 | cwd: this.base,
|
63 | base: this.base,
|
64 | path: resolvedPath,
|
65 | contents: content,
|
66 | });
|
67 | this.next(null, vinyl);
|
68 | });
|
69 | }
|
70 | writeForDir(subdir) {
|
71 | return new VinylWriter(this.base, sysPath.join(this.dir, subdir), this.next);
|
72 | }
|
73 | }
|
74 | class VinylContentWriter {
|
75 | constructor(done) {
|
76 | this.chunks = [];
|
77 | this.done = done;
|
78 | }
|
79 | write(str) {
|
80 | this.chunks.push(str);
|
81 | }
|
82 | println(str) {
|
83 | this.write(str);
|
84 | this.write("\n");
|
85 | }
|
86 | colorize(str) {
|
87 | return str;
|
88 | }
|
89 | close() {
|
90 | return this.done(Buffer.from(this.chunks.join("")));
|
91 | }
|
92 | }
|
93 | export function wrapStreamReporter(reporter) {
|
94 | function reportStream(options) {
|
95 | const duplex = new stream.PassThrough();
|
96 | const writer = new StreamWriter(duplex);
|
97 | const context = createContext({
|
98 | coverageMap: options.map,
|
99 | writer,
|
100 | sourceFinder: options.sourceFinder,
|
101 | });
|
102 | const tree = context.getTree("pkg");
|
103 | tree.visit(reporter, context);
|
104 | return duplex;
|
105 | }
|
106 | return { reportStream };
|
107 | }
|
108 | class StreamWriter {
|
109 | constructor(stream) {
|
110 | this.stream = stream;
|
111 | this.fileName = undefined;
|
112 | }
|
113 | copyFile(source, dest) {
|
114 | throw new Error("NotSupported: StreamWriter#copyFile");
|
115 | }
|
116 | writeFile(file) {
|
117 | if (typeof file !== "string") {
|
118 | file = null;
|
119 | }
|
120 | if (this.fileName === undefined) {
|
121 | this.fileName = file;
|
122 | }
|
123 | else if (file !== this.fileName) {
|
124 | throw new Error(`NotSupported: Write to multiple different files: ${this.fileName}, ${file}`);
|
125 | }
|
126 | return new StreamContentWriter(this.stream);
|
127 | }
|
128 | writeForDir(subdir) {
|
129 | throw new Error("NotSupported: StreamWriter#writeForDir");
|
130 | }
|
131 | }
|
132 | class StreamContentWriter {
|
133 | constructor(stream) {
|
134 | this.stream = stream;
|
135 | }
|
136 | write(str) {
|
137 | this.stream.write(Buffer.from(str));
|
138 | }
|
139 | println(str) {
|
140 | this.write(str);
|
141 | this.write("\n");
|
142 | }
|
143 | colorize(str) {
|
144 | return str;
|
145 | }
|
146 | close() {
|
147 | this.stream.end();
|
148 | }
|
149 | }
|
150 | export function toVinylOnlyReporter(reporter, fileName) {
|
151 | function reportVinyl(options) {
|
152 | let done = false;
|
153 | const wrappedStream = from2({ objectMode: true }, (_, next) => {
|
154 | if (done) {
|
155 | next(null, null); // end of stream
|
156 | return;
|
157 | }
|
158 | const stream = reporter.reportStream(options);
|
159 | next(null, streamToVinyl(stream, fileName));
|
160 | done = true;
|
161 | });
|
162 | const streams = [wrappedStream];
|
163 | if (reporter.reportVinyl !== undefined) {
|
164 | streams.push(reporter.reportVinyl(options));
|
165 | }
|
166 | return merge2(streams);
|
167 | }
|
168 | return { reportVinyl };
|
169 | }
|
170 | function streamToVinyl(stream, fileName) {
|
171 | const cwd = process.cwd();
|
172 | const resolvedPath = sysPath.join(cwd, fileName);
|
173 | return new Vinyl({
|
174 | cwd,
|
175 | base: cwd,
|
176 | path: resolvedPath,
|
177 | contents: stream,
|
178 | });
|
179 | }
|
180 |
|
181 | //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIl9zcmMvd3JhcC1pc3RhbmJ1bC1yZXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLE9BQU8sTUFBTSxNQUFNLENBQUM7QUFDM0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQU8xQixTQUFTLGFBQWEsQ0FBQyxPQUF1QjtJQUM1QyxNQUFNLE9BQU8sR0FBc0IsU0FBUyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sRUFBRTtRQUNyQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUM7S0FDbkU7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQTJCO0lBQzFELFNBQVMsV0FBVyxDQUFDLE9BQWdDO1FBQ25ELElBQUksSUFBSSxHQUFZLEtBQUssQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQyxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUMsRUFBRSxDQUFDLENBQVMsRUFBRSxJQUE2QyxFQUFRLEVBQUU7WUFDbEcsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFXLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtnQkFDekMsT0FBTzthQUNSO1lBQ0QsTUFBTSxHQUFHLEdBQVcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sTUFBTSxHQUFnQixJQUFJLFdB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QUUsTUFBTTtLQUNqQixDQUFDLENBQUM7QUFDTCxDQUFDIiwiZmlsZSI6IndyYXAtaXN0YW5idWwtcmVwb3J0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnJvbTIgZnJvbSBcImZyb20yXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgbGliUmVwb3J0IGZyb20gXCJpc3RhbmJ1bC1saWItcmVwb3J0XCI7XG5pbXBvcnQgbWVyZ2UyIGZyb20gXCJtZXJnZTJcIjtcbmltcG9ydCBzeXNQYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgc3RyZWFtIGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCBWaW55bCBmcm9tIFwidmlueWxcIjtcbmltcG9ydCB7IFJlcG9ydE9wdGlvbnMsIFN0cmVhbVJlcG9ydGVyLCBWaW55bFJlcG9ydGVyIH0gZnJvbSBcIi4vcmVwb3J0ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb250ZXh0T3B0aW9ucyBleHRlbmRzIGxpYlJlcG9ydC5Db250ZXh0IHtcbiAgd3JpdGVyOiBsaWJSZXBvcnQuRmlsZVdyaXRlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChvcHRpb25zOiBDb250ZXh0T3B0aW9ucyk6IGFueSB7XG4gIGNvbnN0IGNvbnRleHQ6IGxpYlJlcG9ydC5Db250ZXh0ID0gbGliUmVwb3J0LmNyZWF0ZUNvbnRleHQob3B0aW9ucyk7XG4gIGlmIChjb250ZXh0LndyaXRlciAhPT0gb3B0aW9ucy53cml0ZXIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGV4dCwgXCJ3cml0ZXJcIiwge3ZhbHVlOiBvcHRpb25zLndyaXRlcn0pO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcEZpbGVSZXBvcnRlcihyZXBvcnRlcjogbGliUmVwb3J0LlZpc2l0b3IpOiBWaW55bFJlcG9ydGVyIHtcbiAgZnVuY3Rpb24gcmVwb3J0VmlueWwob3B0aW9uczogUmVhZG9ubHk8UmVwb3J0T3B0aW9ucz4pOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0ge1xuICAgIGxldCBkb25lOiBib29sZWFuID0gZmFsc2U7XG4gICAgcmV0dXJuIGZyb20yKHtvYmplY3RNb2RlOiB0cnVlfSwgKF86IG51bWJlciwgbmV4dDogKGVycjogbnVsbCB8IEVycm9yLCBvYmo6IFZpbnlsKSA9PiB2b2lkKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBuZXh0KG51bGwsIG51bGwgYXMgYW55KTsgLy8gZW5kIG9mIHN0cmVhbVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG4gICAgICBjb25zdCB3cml0ZXI6IFZpbnlsV3JpdGVyID0gbmV3IFZpbnlsV3JpdGVyKGN3ZCwgY3dkLCBuZXh0KTtcbiAgICAgIC8vIFRPRE86IEZpeCBpc3RhbmJ1bC1saWItcmVwb3J0IHR5cGVzXG4gICAgICBjb25zdCBjb250ZXh0OiBsaWJSZXBvcnQuQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoe1xuICAgICAgICBjb3ZlcmFnZU1hcDogb3B0aW9ucy5tYXAsXG4gICAgICAgIHdyaXRlcixcbiAgICAgICAgc291cmNlRmluZGVyOiBvcHRpb25zLnNvdXJjZUZpbmRlcixcbiAgICAgIH0gYXMgYW55IGFzIENvbnRleHRPcHRpb25zKTtcbiAgICAgIGNvbnN0IHRyZWU6IGxpYlJlcG9ydC5UcmVlID0gY29udGV4dC5nZXRUcmVlKFwicGtnXCIpO1xuICAgICAgdHJlZS52aXNpdChyZXBvcnRlciwgY29udGV4dCk7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7cmVwb3J0VmlueWx9O1xufVxuXG5jbGFzcyBWaW55bFdyaXRlciBpbXBsZW1lbnRzIGxpYlJlcG9ydC5GaWxlV3JpdGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGJhc2U6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG5leHQ6IChlcnI6IG51bGwgfCBFcnJvciwgb2JqOiBWaW55bCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihiYXNlOiBzdHJpbmcsIGRpcjogc3RyaW5nLCBuZXh0OiAoZXJyOiBudWxsIHwgRXJyb3IsIG9iajogVmlueWwpID0+IHZvaWQpIHtcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMuZGlyID0gZGlyO1xuICAgIHRoaXMubmV4dCA9IG5leHQ7XG4gIH1cblxuICBwdWJsaWMgY29weUZpbGUoc291cmNlOiBzdHJpbmcsIGRlc3Q6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRlbnQ6IEJ1ZmZlciA9IGZzLnJlYWRGaWxlU3luYyhzb3VyY2UpO1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aDogc3RyaW5nID0gc3lzUGF0aC5qb2luKHRoaXMuZGlyLCBkZXN0KTtcbiAgICBjb25zdCB2aW55bDogVmlueWwgPSBuZXcgVmlueWwoe1xuICAgICAgY3dkOiB0aGlzLmJhc2UsXG4gICAgICBiYXNlOiB0aGlzLmJhc2UsXG4gICAgICBwYXRoOiByZXNvbHZlZFBhdGgsXG4gICAgICBjb250ZW50czogY29udGVudCxcbiAgICB9KTtcbiAgICB0aGlzLm5leHQobnVsbCwgdmlueWwpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlRmlsZShmaWxlOiBzdHJpbmcgfCBudWxsKTogVmlueWxDb250ZW50V3JpdGVyIHtcbiAgICBpZiAodHlwZW9mIGZpbGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdFN1cHBvcnRlZDogU3RyZWFtV3JpdGVyI3dyaXRlRmlsZShmaWxlOiBudWxsKVwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoOiBzdHJpbmcgPSBzeXNQYXRoLmpvaW4odGhpcy5kaXIsIGZpbGUpO1xuICAgIHJldHVybiBuZXcgVmlueWxDb250ZW50V3JpdGVyKChjb250ZW50OiBCdWZmZXIpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHZpbnlsOiBWaW55bCA9IG5ldyBWaW55bCh7XG4gICAgICAgIGN3ZDogdGhpcy5iYXNlLFxuICAgICAgICBiYXNlOiB0aGlzLmJhc2UsXG4gICAgICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAgICAgY29udGVudHM6IGNvbnRlbnQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMubmV4dChudWxsLCB2aW55bCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVGb3JEaXIoc3ViZGlyOiBzdHJpbmcpOiBWaW55bFdyaXRlciB7XG4gICAgcmV0dXJuIG5ldyBWaW55bFdyaXRlcih0aGlzLmJhc2UsIHN5c1BhdGguam9pbih0aGlzLmRpciwgc3ViZGlyKSwgdGhpcy5uZXh0KTtcbiAgfVxufVxuXG5jbGFzcyBWaW55bENvbnRlbnRXcml0ZXIgaW1wbGVtZW50cyBsaWJSZXBvcnQuQ29udGVudFdyaXRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2h1bmtzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkb25lOiAoY29udGVudDogQnVmZmVyKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKGRvbmU6IChjb250ZW50OiBCdWZmZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgIHRoaXMuZG9uZSA9IGRvbmU7XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoc3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNodW5rcy5wdXNoKHN0cik7XG4gIH1cblxuICBwdWJsaWMgcHJpbnRsbihzdHI6IHN0cmluZykge1xuICAgIHRoaXMud3JpdGUoc3RyKTtcbiAgICB0aGlzLndyaXRlKFwiXFxuXCIpO1xuICB9XG5cbiAgcHVibGljIGNvbG9yaXplKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmRvbmUoQnVmZmVyLmZyb20odGhpcy5jaHVua3Muam9pbihcIlwiKSkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwU3RyZWFtUmVwb3J0ZXIocmVwb3J0ZXI6IGxpYlJlcG9ydC5WaXNpdG9yKTogU3RyZWFtUmVwb3J0ZXIge1xuICBmdW5jdGlvbiByZXBvcnRTdHJlYW0ob3B0aW9uczogUmVhZG9ubHk8UmVwb3J0T3B0aW9ucz4pOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0ge1xuICAgIGNvbnN0IGR1cGxleDogc3RyZWFtLkR1cGxleCA9IG5ldyBzdHJlYW0uUGFzc1Rocm91Z2goKTtcbiAgICBjb25zdCB3cml0ZXI6IFN0cmVhbVdyaXRlciA9IG5ldyBTdHJlYW1Xcml0ZXIoZHVwbGV4KTtcbiAgICBjb25zdCBjb250ZXh0OiBsaWJSZXBvcnQuQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoe1xuICAgICAgY292ZXJhZ2VNYXA6IG9wdGlvbnMubWFwLFxuICAgICAgd3JpdGVyLFxuICAgICAgc291cmNlRmluZGVyOiBvcHRpb25zLnNvdXJjZUZpbmRlcixcbiAgICB9IGFzIGFueSBhcyBDb250ZXh0T3B0aW9ucyk7XG4gICAgY29uc3QgdHJlZTogbGliUmVwb3J0LlRyZWUgPSBjb250ZXh0LmdldFRyZWUoXCJwa2dcIik7XG4gICAgdHJlZS52aXNpdChyZXBvcnRlciwgY29udGV4dCk7XG4gICAgcmV0dXJuIGR1cGxleDtcbiAgfVxuXG4gIHJldHVybiB7cmVwb3J0U3RyZWFtfTtcbn1cblxuY2xhc3MgU3RyZWFtV3JpdGVyIGltcGxlbWVudHMgbGliUmVwb3J0LkZpbGVXcml0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0cmVhbTogTm9kZUpTLldyaXRhYmxlU3RyZWFtO1xuICBwcml2YXRlIGZpbGVOYW1lOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbTogTm9kZUpTLldyaXRhYmxlU3RyZWFtKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5maWxlTmFtZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBjb3B5RmlsZShzb3VyY2U6IHN0cmluZywgZGVzdDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90U3VwcG9ydGVkOiBTdHJlYW1Xcml0ZXIjY29weUZpbGVcIik7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVGaWxlKGZpbGU6IHN0cmluZyB8IG51bGwpOiBTdHJlYW1Db250ZW50V3JpdGVyIHtcbiAgICBpZiAodHlwZW9mIGZpbGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGZpbGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5maWxlTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZTtcbiAgICB9IGVsc2UgaWYgKGZpbGUgIT09IHRoaXMuZmlsZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90U3VwcG9ydGVkOiBXcml0ZSB0byBtdWx0aXBsZSBkaWZmZXJlbnQgZmlsZXM6ICR7dGhpcy5maWxlTmFtZX0sICR7ZmlsZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN0cmVhbUNvbnRlbnRXcml0ZXIodGhpcy5zdHJlYW0pO1xuICB9XG5cbiAgcHVibGljIHdyaXRlRm9yRGlyKHN1YmRpcjogc3RyaW5nKTogU3RyZWFtV3JpdGVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3RTdXBwb3J0ZWQ6IFN0cmVhbVdyaXRlciN3cml0ZUZvckRpclwiKTtcbiAgfVxufVxuXG5jbGFzcyBTdHJlYW1Db250ZW50V3JpdGVyIGltcGxlbWVudHMgbGliUmVwb3J0LkNvbnRlbnRXcml0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0cmVhbTogTm9kZUpTLldyaXRhYmxlU3RyZWFtO1xuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbTogTm9kZUpTLldyaXRhYmxlU3RyZWFtKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoc3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0cmVhbS53cml0ZShCdWZmZXIuZnJvbShzdHIpKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmludGxuKHN0cjogc3RyaW5nKSB7XG4gICAgdGhpcy53cml0ZShzdHIpO1xuICAgIHRoaXMud3JpdGUoXCJcXG5cIik7XG4gIH1cblxuICBwdWJsaWMgY29sb3JpemUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5zdHJlYW0uZW5kKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvVmlueWxPbmx5UmVwb3J0ZXIocmVwb3J0ZXI6IFN0cmVhbVJlcG9ydGVyLCBmaWxlTmFtZTogc3RyaW5nKTogVmlueWxSZXBvcnRlciB7XG4gIGZ1bmN0aW9uIHJlcG9ydFZpbnlsKG9wdGlvbnM6IFJlYWRvbmx5PFJlcG9ydE9wdGlvbnM+KTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtIHtcbiAgICBsZXQgZG9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGNvbnN0IHdyYXBwZWRTdHJlYW06IE5vZGVKUy5SZWFkYWJsZVN0cmVhbSA9IGZyb20yKFxuICAgICAge29iamVjdE1vZGU6IHRydWV9LFxuICAgICAgKF86IG51bWJlciwgbmV4dDogKGVycjogbnVsbCB8IEVycm9yLCBvYmo6IFZpbnlsKSA9PiB2b2lkKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgbmV4dChudWxsLCBudWxsIGFzIGFueSk7IC8vIGVuZCBvZiBzdHJlYW1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyZWFtOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0gPSByZXBvcnRlci5yZXBvcnRTdHJlYW0ob3B0aW9ucyk7XG4gICAgICAgIG5leHQobnVsbCwgc3RyZWFtVG9WaW55bChzdHJlYW0sIGZpbGVOYW1lKSk7XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IHN0cmVhbXM6IE5vZGVKUy5SZWFkYWJsZVN0cmVhbVtdID0gW3dyYXBwZWRTdHJlYW1dO1xuICAgIGlmIChyZXBvcnRlci5yZXBvcnRWaW55bCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdHJlYW1zLnB1c2gocmVwb3J0ZXIucmVwb3J0VmlueWwob3B0aW9ucykpO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2UyKHN0cmVhbXMpO1xuICB9XG5cbiAgcmV0dXJuIHtyZXBvcnRWaW55bH07XG59XG5cbmZ1bmN0aW9uIHN0cmVhbVRvVmlueWwoc3RyZWFtOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0sIGZpbGVOYW1lOiBzdHJpbmcpOiBWaW55bCB7XG4gIGNvbnN0IGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcmVzb2x2ZWRQYXRoOiBzdHJpbmcgPSBzeXNQYXRoLmpvaW4oY3dkLCBmaWxlTmFtZSk7XG4gIHJldHVybiBuZXcgVmlueWwoe1xuICAgIGN3ZCxcbiAgICBiYXNlOiBjd2QsXG4gICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgIGNvbnRlbnRzOiBzdHJlYW0sXG4gIH0pO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==
|