@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.
Files changed (57) hide show
  1. package/.idea/LNKD.tech Editor.xml +194 -0
  2. package/.idea/codeStyles/Project.xml +52 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  5. package/.idea/js-runner.iml +12 -0
  6. package/.idea/modules.xml +8 -0
  7. package/.idea/vcs.xml +6 -0
  8. package/__tests__/channels.test.ts +1 -38
  9. package/dist/args.d.ts +4 -0
  10. package/dist/args.js +58 -0
  11. package/dist/connectors/file.d.ts +15 -0
  12. package/dist/connectors/file.js +89 -0
  13. package/dist/connectors/http.d.ts +14 -0
  14. package/dist/connectors/http.js +82 -0
  15. package/dist/connectors/kafka.d.ts +48 -0
  16. package/dist/connectors/kafka.js +68 -0
  17. package/dist/connectors/ws.d.ts +10 -0
  18. package/dist/connectors/ws.js +72 -0
  19. package/dist/connectors.d.ts +73 -0
  20. package/dist/connectors.js +168 -0
  21. package/dist/index.cjs +732 -0
  22. package/dist/index.d.ts +42 -0
  23. package/dist/index.js +83 -0
  24. package/dist/tsconfig.tsbuildinfo +1 -0
  25. package/dist/util.d.ts +71 -0
  26. package/dist/util.js +92 -0
  27. package/examples/echo/pipeline.ttl +22 -4
  28. package/examples/echo/processors.ttl +5 -7
  29. package/examples/echo/src/processors.ts +3 -4
  30. package/index.ttl +29 -21
  31. package/lib/index.d.ts +3 -0
  32. package/lib/index.js +4 -1
  33. package/lib/jsonld.js +4 -3
  34. package/lib/logger.d.ts +3 -1
  35. package/lib/logger.js +23 -1
  36. package/lib/reader.d.ts +2 -1
  37. package/lib/reader.js +7 -16
  38. package/lib/reexports.d.ts +3 -0
  39. package/lib/reexports.js +4 -0
  40. package/lib/runner.d.ts +4 -3
  41. package/lib/runner.js +30 -20
  42. package/lib/testUtils.d.ts +24 -0
  43. package/lib/testUtils.js +150 -0
  44. package/lib/tsconfig.tsbuildinfo +1 -1
  45. package/lib/writer.d.ts +2 -1
  46. package/lib/writer.js +1 -1
  47. package/package.json +3 -3
  48. package/src/index.ts +4 -0
  49. package/src/jsonld.ts +5 -2
  50. package/src/logger.ts +27 -1
  51. package/src/reader.ts +9 -15
  52. package/src/reexports.ts +6 -0
  53. package/src/runner.ts +51 -40
  54. package/src/testUtils.ts +196 -0
  55. package/src/writer.ts +2 -1
  56. package/examples/echo/test.ttl +0 -14
  57. package/examples/echo/untitled:/types/MyType.ttl +0 -0
@@ -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=