@rdfc/js-runner 2.0.0-alpha.1 → 2.0.0-alpha.10
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/.idea/LNKD.tech Editor.xml +194 -0
- package/.idea/codeStyles/Project.xml +52 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/js-runner.iml +12 -0
- package/.idea/modules.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/__tests__/channels.test.ts +1 -38
- package/dist/args.d.ts +4 -0
- package/dist/args.js +58 -0
- package/dist/connectors/file.d.ts +15 -0
- package/dist/connectors/file.js +89 -0
- package/dist/connectors/http.d.ts +14 -0
- package/dist/connectors/http.js +82 -0
- package/dist/connectors/kafka.d.ts +48 -0
- package/dist/connectors/kafka.js +68 -0
- package/dist/connectors/ws.d.ts +10 -0
- package/dist/connectors/ws.js +72 -0
- package/dist/connectors.d.ts +73 -0
- package/dist/connectors.js +168 -0
- package/dist/index.cjs +732 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +83 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/util.d.ts +71 -0
- package/dist/util.js +92 -0
- package/examples/echo/pipeline.ttl +22 -4
- package/examples/echo/processors.ttl +5 -7
- package/examples/echo/src/processors.ts +3 -4
- package/index.ttl +29 -21
- package/lib/index.d.ts +3 -0
- package/lib/index.js +4 -1
- package/lib/jsonld.js +4 -3
- package/lib/logger.d.ts +3 -1
- package/lib/logger.js +23 -1
- package/lib/reader.d.ts +2 -1
- package/lib/reader.js +7 -16
- package/lib/reexports.d.ts +3 -0
- package/lib/reexports.js +4 -0
- package/lib/runner.d.ts +4 -3
- package/lib/runner.js +30 -20
- package/lib/testUtils.d.ts +24 -0
- package/lib/testUtils.js +150 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/writer.d.ts +2 -1
- package/lib/writer.js +1 -1
- package/package.json +3 -3
- package/src/index.ts +4 -0
- package/src/jsonld.ts +5 -2
- package/src/logger.ts +27 -1
- package/src/reader.ts +9 -15
- package/src/reexports.ts +6 -0
- package/src/runner.ts +51 -40
- package/src/testUtils.ts +196 -0
- package/src/writer.ts +2 -1
- package/examples/echo/test.ttl +0 -14
- package/examples/echo/untitled:/types/MyType.ttl +0 -0
package/lib/testUtils.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { RunnerClient } from "@rdfc/proto";
|
|
2
|
+
import * as grpc from "@grpc/grpc-js";
|
|
3
|
+
import { ClientReadableStreamImpl } from "./reexports.js";
|
|
4
|
+
import { extractShapes } from "rdf-lens";
|
|
5
|
+
import { NamedNode, Parser, Writer } from "n3";
|
|
6
|
+
import { readFile } from "fs/promises";
|
|
7
|
+
import winston, { createLogger } from "winston";
|
|
8
|
+
import { WriterInstance } from "./writer.js";
|
|
9
|
+
import { ReaderInstance } from "./reader.js";
|
|
10
|
+
import { Runner } from "./runner.js";
|
|
11
|
+
import { createTermNamespace } from "@treecg/types";
|
|
12
|
+
import { expect } from "vitest";
|
|
13
|
+
export async function getProcessorShape(baseIRI = process.cwd() + "/node_modules/@rdfc/js-runner/index.ttl") {
|
|
14
|
+
const configFile = await readFile(baseIRI, { encoding: "utf8" });
|
|
15
|
+
const configQuads = new Parser().parse(configFile);
|
|
16
|
+
const shapes = extractShapes(configQuads);
|
|
17
|
+
return shapes;
|
|
18
|
+
}
|
|
19
|
+
export class TestClient extends RunnerClient {
|
|
20
|
+
next;
|
|
21
|
+
constructor() {
|
|
22
|
+
super("localhost:5400", grpc.credentials.createInsecure());
|
|
23
|
+
}
|
|
24
|
+
nextStream() {
|
|
25
|
+
return new Promise((res) => (this.next = res));
|
|
26
|
+
}
|
|
27
|
+
receiveStreamMessage() {
|
|
28
|
+
const stream = new ClientReadableStreamImpl((data) => {
|
|
29
|
+
return { data };
|
|
30
|
+
});
|
|
31
|
+
this.next(stream);
|
|
32
|
+
return stream;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function one(iter) {
|
|
36
|
+
for await (const item of iter) {
|
|
37
|
+
return item;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export const client = new TestClient();
|
|
41
|
+
export const uri = "someUri";
|
|
42
|
+
export const logger = createLogger({
|
|
43
|
+
transports: new winston.transports.Console({
|
|
44
|
+
level: process.env["DEBUG"] || "info",
|
|
45
|
+
}),
|
|
46
|
+
});
|
|
47
|
+
export function createWriter(iri = uri) {
|
|
48
|
+
const reader = createReader(iri);
|
|
49
|
+
const writeStream = new WriterInstance(iri, client, async (msg) => {
|
|
50
|
+
if (msg.msg) {
|
|
51
|
+
reader.handleMsg(msg.msg);
|
|
52
|
+
}
|
|
53
|
+
if (msg.close) {
|
|
54
|
+
reader.close();
|
|
55
|
+
}
|
|
56
|
+
}, logger);
|
|
57
|
+
return [writeStream, reader];
|
|
58
|
+
}
|
|
59
|
+
export function createReader(iri = uri) {
|
|
60
|
+
const reader = new ReaderInstance(iri, client, logger);
|
|
61
|
+
return reader;
|
|
62
|
+
}
|
|
63
|
+
const shapeQuads = `
|
|
64
|
+
@prefix rdfc: <https://w3id.org/rdf-connect#>.
|
|
65
|
+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
|
|
66
|
+
@prefix sh: <http://www.w3.org/ns/shacl#>.
|
|
67
|
+
[ ] a sh:NodeShape;
|
|
68
|
+
sh:targetClass <JsProcessorShape>;
|
|
69
|
+
sh:property [
|
|
70
|
+
sh:path rdfc:entrypoint;
|
|
71
|
+
sh:name "location";
|
|
72
|
+
sh:minCount 1;
|
|
73
|
+
sh:maxCount 1;
|
|
74
|
+
sh:datatype xsd:string;
|
|
75
|
+
], [
|
|
76
|
+
sh:path rdfc:file;
|
|
77
|
+
sh:name "file";
|
|
78
|
+
sh:minCount 1;
|
|
79
|
+
sh:maxCount 1;
|
|
80
|
+
sh:datatype xsd:string;
|
|
81
|
+
], [
|
|
82
|
+
sh:path rdfc:class;
|
|
83
|
+
sh:name "clazz";
|
|
84
|
+
sh:maxCount 1;
|
|
85
|
+
sh:datatype xsd:string;
|
|
86
|
+
].
|
|
87
|
+
`;
|
|
88
|
+
const OWL = createTermNamespace("http://www.w3.org/2002/07/owl#", "imports");
|
|
89
|
+
const processorShapes = extractShapes(new Parser().parse(shapeQuads));
|
|
90
|
+
const base = "https://w3id.org/rdf-connect#";
|
|
91
|
+
export async function importFile(file) {
|
|
92
|
+
const done = new Set();
|
|
93
|
+
const todo = [new URL("file://" + file)];
|
|
94
|
+
const quads = [];
|
|
95
|
+
let item = todo.pop();
|
|
96
|
+
while (item !== undefined) {
|
|
97
|
+
if (done.has(item.toString())) {
|
|
98
|
+
item = todo.pop();
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
done.add(item.toString());
|
|
102
|
+
if (item.protocol !== "file:") {
|
|
103
|
+
throw "No supported protocol " + item.protocol;
|
|
104
|
+
}
|
|
105
|
+
const txt = await readFile(item.pathname, { encoding: "utf8" });
|
|
106
|
+
const extras = new Parser({ baseIRI: item.toString() }).parse(txt);
|
|
107
|
+
for (const o of extras
|
|
108
|
+
.filter((x) => x.subject.value === item?.toString() &&
|
|
109
|
+
x.predicate.equals(OWL.imports))
|
|
110
|
+
.map((x) => x.object.value)) {
|
|
111
|
+
todo.push(new URL(o));
|
|
112
|
+
}
|
|
113
|
+
quads.push(...extras);
|
|
114
|
+
item = todo.pop();
|
|
115
|
+
}
|
|
116
|
+
return quads;
|
|
117
|
+
}
|
|
118
|
+
export async function getProc(config, ty, configLocation, uri = "http://example.com/ns#processor") {
|
|
119
|
+
const configQuads = await importFile(configLocation);
|
|
120
|
+
const procConfig = processorShapes.lenses["JsProcessorShape"].execute({
|
|
121
|
+
id: new NamedNode(base + ty),
|
|
122
|
+
quads: configQuads,
|
|
123
|
+
});
|
|
124
|
+
const msgs = [];
|
|
125
|
+
const write = async (x) => {
|
|
126
|
+
msgs.push(x);
|
|
127
|
+
};
|
|
128
|
+
const runner = new Runner(new TestClient(), write, "http://example.com/ns#", logger);
|
|
129
|
+
configQuads.push(...new Parser().parse(config));
|
|
130
|
+
await runner.handleOrchMessage({
|
|
131
|
+
pipeline: new Writer().quadsToString(configQuads),
|
|
132
|
+
});
|
|
133
|
+
const proc = await runner.addProcessor({
|
|
134
|
+
config: JSON.stringify(procConfig),
|
|
135
|
+
arguments: "",
|
|
136
|
+
uri,
|
|
137
|
+
});
|
|
138
|
+
return proc;
|
|
139
|
+
}
|
|
140
|
+
export async function checkProcDefinition(file, n) {
|
|
141
|
+
const quads = await importFile(file);
|
|
142
|
+
const procConfig = (processorShapes.lenses["JsProcessorShape"].execute({
|
|
143
|
+
id: new NamedNode(base + n),
|
|
144
|
+
quads: quads,
|
|
145
|
+
}));
|
|
146
|
+
expect(procConfig.file, n + " has file").toBeDefined();
|
|
147
|
+
expect(procConfig.location, n + " has location").toBeDefined();
|
|
148
|
+
expect(procConfig.clazz, n + " has clazz").toBeDefined();
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3RVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBRXRDLE9BQU8sRUFBRSx3QkFBd0IsRUFBdUIsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFMUMsT0FBTyxFQUFZLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUU1QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVoQyxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNuQyxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLHlDQUF5QztJQUVuRSxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNqRSxNQUFNLFdBQVcsR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLENB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QU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLFlBQVksQ0FBSTtRQUN0QyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFDbEMsU0FBUyxFQUFFLEVBQUU7UUFDYixHQUFHO0tBQ04sQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsSUFBWSxFQUFFLENBQVM7SUFDN0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsTUFBTSxVQUFVLEdBQW9ELENBQ2hFLGVBQWUsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDL0MsRUFBRSxFQUFFLElBQUksU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDM0IsS0FBSyxFQUFFLEtBQUs7S0FDZixDQUFDLENBQ0wsQ0FBQztJQUNGLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2RCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhQ2h1bmssIFJ1bm5lckNsaWVudCB9IGZyb20gXCJAcmRmYy9wcm90b1wiO1xuaW1wb3J0ICogYXMgZ3JwYyBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgQ2xpZW50UmVhZGFibGVTdHJlYW0gfSBmcm9tIFwiQGdycGMvZ3JwYy1qc1wiO1xuaW1wb3J0IHsgQ2xpZW50UmVhZGFibGVTdHJlYW1JbXBsLCBPcmNoZXN0cmF0b3JNZXNzYWdlIH0gZnJvbSBcIi4vcmVleHBvcnRzXCI7XG5pbXBvcnQgeyBleHRyYWN0U2hhcGVzIH0gZnJvbSBcInJkZi1sZW5zXCI7XG5pbXBvcnQgeyBOYW1lZE5vZGUsIFBhcnNlciwgV3JpdGVyIH0gZnJvbSBcIm4zXCI7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHdpbnN0b24sIHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIndpbnN0b25cIjtcbmltcG9ydCB7IFdyaXRlckluc3RhbmNlIH0gZnJvbSBcIi4vd3JpdGVyXCI7XG5pbXBvcnQgeyBSZWFkZXJJbnN0YW5jZSB9IGZyb20gXCIuL3JlYWRlclwiO1xuaW1wb3J0IHsgUHJvY2Vzc29yIH0gZnJvbSBcIi4vcHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBGdWxsUHJvYywgUnVubmVyIH0gZnJvbSBcIi4vcnVubmVyXCI7XG5pbXBvcnQgeyBRdWFkLCBUZXJtIH0gZnJvbSBcIkByZGZqcy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlVGVybU5hbWVzcGFjZSB9IGZyb20gXCJAdHJlZWNnL3R5cGVzXCI7XG5pbXBvcnQgeyBleHBlY3QgfSBmcm9tIFwidml0ZXN0XCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm9jZXNzb3JTaGFwZShcbiAgICBiYXNlSVJJID0gcHJvY2Vzcy5jd2QoKSArIFwiL25vZGVfbW9kdWxlcy9AcmRmYy9qcy1ydW5uZXIvaW5kZXgudHRsXCIsXG4pIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gYXdhaXQgcmVhZEZpbGUoYmFzZUlSSSwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgY29uc3QgY29uZmlnUXVhZHMgPSBuZXcgUGFyc2VyKCkucGFyc2UoY29uZmlnRmlsZSk7XG4gICAgY29uc3Qgc2hhcGVzID0gZXh0cmFjdFNoYXBlcyhjb25maWdRdWFkcyk7XG5cbiAgICByZXR1cm4gc2hhcGVzO1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdENsaWVudCBleHRlbmRzIFJ1bm5lckNsaWVudCB7XG4gICAgbmV4dDogKHN0cmVhbTogQ2xpZW50UmVhZGFibGVTdHJlYW08RGF0YUNodW5rPikgPT4gdW5rbm93bjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImxvY2FsaG9zdDo1NDAwXCIsIGdycGMuY3JlZGVudGlhbHMuY3JlYXRlSW5zZWN1cmUoKSk7XG4gICAgfVxuXG4gICAgbmV4dFN0cmVhbSgpOiBQcm9taXNlPENsaWVudFJlYWRhYmxlU3RyZWFtPERhdGFDaHVuaz4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMpID0+ICh0aGlzLm5leHQgPSByZXMpKTtcbiAgICB9XG5cbiAgICByZWNlaXZlU3RyZWFtTWVzc2FnZSgpOiBDbGllbnRSZWFkYWJsZVN0cmVhbTxEYXRhQ2h1bms+IHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IENsaWVudFJlYWRhYmxlU3RyZWFtSW1wbDxEYXRhQ2h1bms+KChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGEgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubmV4dChzdHJlYW0pO1xuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZTxUPihpdGVyOiBBc3luY0l0ZXJhYmxlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGl0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgY2xpZW50ID0gbmV3IFRlc3RDbGllbnQoKTtcbmV4cG9ydCBjb25zdCB1cmkgPSBcInNvbWVVcmlcIjtcbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoe1xuICAgIHRyYW5zcG9ydHM6IG5ldyB3aW5zdG9uLnRyYW5zcG9ydHMuQ29uc29sZSh7XG4gICAgICAgIGxldmVsOiBwcm9jZXNzLmVudltcIkRFQlVHXCJdIHx8IFwiaW5mb1wiLFxuICAgIH0pLFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXcml0ZXIoaXJpID0gdXJpKTogW1dyaXRlckluc3RhbmNlLCBSZWFkZXJJbnN0YW5jZV0ge1xuICAgIGNvbnN0IHJlYWRlciA9IGNyZWF0ZVJlYWRlcihpcmkpO1xuICAgIGNvbnN0IHdyaXRlU3RyZWFtID0gbmV3IFdyaXRlckluc3RhbmNlKFxuICAgICAgICBpcmksXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgYXN5bmMgKG1zZykgPT4ge1xuICAgICAgICAgICAgaWYgKG1zZy5tc2cpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIuaGFuZGxlTXNnKG1zZy5tc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1zZy5jbG9zZSkge1xuICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsb2dnZXIsXG4gICAgKTtcbiAgICByZXR1cm4gW3dyaXRlU3RyZWFtLCByZWFkZXJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhZGVyKGlyaSA9IHVyaSk6IFJlYWRlckluc3RhbmNlIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUmVhZGVySW5zdGFuY2UoaXJpLCBjbGllbnQsIGxvZ2dlcik7XG4gICAgcmV0dXJuIHJlYWRlcjtcbn1cblxuY29uc3Qgc2hhcGVRdWFkcyA9IGBcbkBwcmVmaXggcmRmYzogPGh0dHBzOi8vdzNpZC5vcmcvcmRmLWNvbm5lY3QjPi5cbkBwcmVmaXggeHNkOiA8aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjPi5cbkBwcmVmaXggc2g6IDxodHRwOi8vd3d3LnczLm9yZy9ucy9zaGFjbCM+LlxuWyBdIGEgc2g6Tm9kZVNoYXBlO1xuICBzaDp0YXJnZXRDbGFzcyA8SnNQcm9jZXNzb3JTaGFwZT47XG4gIHNoOnByb3BlcnR5IFtcbiAgICBzaDpwYXRoIHJkZmM6ZW50cnlwb2ludDtcbiAgICBzaDpuYW1lIFwibG9jYXRpb25cIjtcbiAgICBzaDptaW5Db3VudCAxO1xuICAgIHNoOm1heENvdW50IDE7XG4gICAgc2g6ZGF0YXR5cGUgeHNkOnN0cmluZztcbiAgXSwgW1xuICAgIHNoOnBhdGggcmRmYzpmaWxlO1xuICAgIHNoOm5hbWUgXCJmaWxlXCI7XG4gICAgc2g6bWluQ291bnQgMTtcbiAgICBzaDptYXhDb3VudCAxO1xuICAgIHNoOmRhdGF0eXBlIHhzZDpzdHJpbmc7XG4gIF0sIFtcbiAgICBzaDpwYXRoIHJkZmM6Y2xhc3M7XG4gICAgc2g6bmFtZSBcImNsYXp6XCI7XG4gICAgc2g6bWF4Q291bnQgMTtcbiAgICBzaDpkYXRhdHlwZSB4c2Q6c3RyaW5nO1xuICBdLlxuYDtcbmNvbnN0IE9XTCA9IGNyZWF0ZVRlcm1OYW1lc3BhY2UoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAyLzA3L293bCNcIiwgXCJpbXBvcnRzXCIpO1xuY29uc3QgcHJvY2Vzc29yU2hhcGVzID0gZXh0cmFjdFNoYXBlcyhuZXcgUGFyc2VyKCkucGFyc2Uoc2hhcGVRdWFkcykpO1xuY29uc3QgYmFzZSA9IFwiaHR0cHM6Ly93M2lkLm9yZy9yZGYtY29ubmVjdCNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEZpbGUoZmlsZTogc3RyaW5nKTogUHJvbWlzZTxRdWFkW10+IHtcbiAgICBjb25zdCBkb25lID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgdG9kbyA9IFtuZXcgVVJMKFwiZmlsZTovL1wiICsgZmlsZSldO1xuICAgIGNvbnN0IHF1YWRzOiBRdWFkW10gPSBbXTtcblxuICAgIGxldCBpdGVtID0gdG9kby5wb3AoKTtcbiAgICB3aGlsZSAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChkb25lLmhhcyhpdGVtLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICBpdGVtID0gdG9kby5wb3AoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGRvbmUuYWRkKGl0ZW0udG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChpdGVtLnByb3RvY29sICE9PSBcImZpbGU6XCIpIHtcbiAgICAgICAgICAgIHRocm93IFwiTm8gc3VwcG9ydGVkIHByb3RvY29sIFwiICsgaXRlbS5wcm90b2NvbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHR4dCA9IGF3YWl0IHJlYWRGaWxlKGl0ZW0ucGF0aG5hbWUsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pO1xuICAgICAgICBjb25zdCBleHRyYXMgPSBuZXcgUGFyc2VyKHsgYmFzZUlSSTogaXRlbS50b1N0cmluZygpIH0pLnBhcnNlKHR4dCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBvIG9mIGV4dHJhc1xuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgICAgICAgICAgeC5zdWJqZWN0LnZhbHVlID09PSBpdGVtPy50b1N0cmluZygpICYmXG4gICAgICAgICAgICAgICAgICAgIHgucHJlZGljYXRlLmVxdWFscyhPV0wuaW1wb3J0cyksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKCh4KSA9PiB4Lm9iamVjdC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRvZG8ucHVzaChuZXcgVVJMKG8pKTtcbiAgICAgICAgfVxuICAgICAgICBxdWFkcy5wdXNoKC4uLmV4dHJhcyk7XG5cbiAgICAgICAgaXRlbSA9IHRvZG8ucG9wKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1YWRzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHJvYzxUIGV4dGVuZHMgUHJvY2Vzc29yPHVua25vd24+PihcbiAgICBjb25maWc6IHN0cmluZyxcbiAgICB0eTogc3RyaW5nLFxuICAgIGNvbmZpZ0xvY2F0aW9uOiBzdHJpbmcsXG4gICAgdXJpID0gXCJodHRwOi8vZXhhbXBsZS5jb20vbnMjcHJvY2Vzc29yXCIsXG4pOiBQcm9taXNlPEZ1bGxQcm9jPFQ+PiB7XG4gICAgY29uc3QgY29uZmlnUXVhZHMgPSBhd2FpdCBpbXBvcnRGaWxlKGNvbmZpZ0xvY2F0aW9uKTtcbiAgICBjb25zdCBwcm9jQ29uZmlnID0gcHJvY2Vzc29yU2hhcGVzLmxlbnNlc1tcIkpzUHJvY2Vzc29yU2hhcGVcIl0uZXhlY3V0ZSh7XG4gICAgICAgIGlkOiBuZXcgTmFtZWROb2RlKGJhc2UgKyB0eSksXG4gICAgICAgIHF1YWRzOiBjb25maWdRdWFkcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1zZ3M6IE9yY2hlc3RyYXRvck1lc3NhZ2VbXSA9IFtdO1xuICAgIGNvbnN0IHdyaXRlID0gYXN5bmMgKHg6IE9yY2hlc3RyYXRvck1lc3NhZ2UpID0+IHtcbiAgICAgICAgbXNncy5wdXNoKHgpO1xuICAgIH07XG4gICAgY29uc3QgcnVubmVyID0gbmV3IFJ1bm5lcihcbiAgICAgICAgbmV3IFRlc3RDbGllbnQoKSxcbiAgICAgICAgd3JpdGUsXG4gICAgICAgIFwiaHR0cDovL2V4YW1wbGUuY29tL25zI1wiLFxuICAgICAgICBsb2dnZXIsXG4gICAgKTtcbiAgICBjb25maWdRdWFkcy5wdXNoKC4uLm5ldyBQYXJzZXIoKS5wYXJzZShjb25maWcpKTtcbiAgICBhd2FpdCBydW5uZXIuaGFuZGxlT3JjaE1lc3NhZ2Uoe1xuICAgICAgICBwaXBlbGluZTogbmV3IFdyaXRlcigpLnF1YWRzVG9TdHJpbmcoY29uZmlnUXVhZHMpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvYyA9IGF3YWl0IHJ1bm5lci5hZGRQcm9jZXNzb3I8VD4oe1xuICAgICAgICBjb25maWc6IEpTT04uc3RyaW5naWZ5KHByb2NDb25maWcpLFxuICAgICAgICBhcmd1bWVudHM6IFwiXCIsXG4gICAgICAgIHVyaSxcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9jO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tQcm9jRGVmaW5pdGlvbihmaWxlOiBzdHJpbmcsIG46IHN0cmluZykge1xuICAgIGNvbnN0IHF1YWRzID0gYXdhaXQgaW1wb3J0RmlsZShmaWxlKTtcbiAgICBjb25zdCBwcm9jQ29uZmlnID0gPHsgZmlsZTogVGVybTsgbG9jYXRpb246IHN0cmluZzsgY2xheno6IHN0cmluZyB9PihcbiAgICAgICAgcHJvY2Vzc29yU2hhcGVzLmxlbnNlc1tcIkpzUHJvY2Vzc29yU2hhcGVcIl0uZXhlY3V0ZSh7XG4gICAgICAgICAgICBpZDogbmV3IE5hbWVkTm9kZShiYXNlICsgbiksXG4gICAgICAgICAgICBxdWFkczogcXVhZHMsXG4gICAgICAgIH0pXG4gICAgKTtcbiAgICBleHBlY3QocHJvY0NvbmZpZy5maWxlLCBuICsgXCIgaGFzIGZpbGVcIikudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QocHJvY0NvbmZpZy5sb2NhdGlvbiwgbiArIFwiIGhhcyBsb2NhdGlvblwiKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChwcm9jQ29uZmlnLmNsYXp6LCBuICsgXCIgaGFzIGNsYXp6XCIpLnRvQmVEZWZpbmVkKCk7XG59XG4iXX0=
|