semantifold 0.1.0
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/LICENSE +15 -0
- package/README.md +71 -0
- package/build/index.d.ts +54 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +45 -0
- package/build/src/backends/identifiers.d.ts +19 -0
- package/build/src/backends/identifiers.d.ts.map +1 -0
- package/build/src/backends/identifiers.js +93 -0
- package/build/src/backends/index.d.ts +35 -0
- package/build/src/backends/index.d.ts.map +1 -0
- package/build/src/backends/index.js +149 -0
- package/build/src/backends/java.d.ts +8 -0
- package/build/src/backends/java.d.ts.map +1 -0
- package/build/src/backends/java.js +172 -0
- package/build/src/backends/javascript.d.ts +8 -0
- package/build/src/backends/javascript.d.ts.map +1 -0
- package/build/src/backends/javascript.js +173 -0
- package/build/src/backends/php.d.ts +8 -0
- package/build/src/backends/php.d.ts.map +1 -0
- package/build/src/backends/php.js +175 -0
- package/build/src/backends/ruby.d.ts +8 -0
- package/build/src/backends/ruby.d.ts.map +1 -0
- package/build/src/backends/ruby.js +155 -0
- package/build/src/backends/scalars.d.ts +15 -0
- package/build/src/backends/scalars.d.ts.map +1 -0
- package/build/src/backends/scalars.js +138 -0
- package/build/src/backends/shared.d.ts +26 -0
- package/build/src/backends/shared.d.ts.map +1 -0
- package/build/src/backends/shared.js +424 -0
- package/build/src/backends/typescript.d.ts +8 -0
- package/build/src/backends/typescript.d.ts.map +1 -0
- package/build/src/backends/typescript.js +160 -0
- package/build/src/backends/writer.d.ts +87 -0
- package/build/src/backends/writer.d.ts.map +1 -0
- package/build/src/backends/writer.js +207 -0
- package/build/src/diagnostic.d.ts +67 -0
- package/build/src/diagnostic.d.ts.map +1 -0
- package/build/src/diagnostic.js +96 -0
- package/build/src/frontends/index.d.ts +14 -0
- package/build/src/frontends/index.d.ts.map +1 -0
- package/build/src/frontends/index.js +36 -0
- package/build/src/frontends/java.d.ts +12 -0
- package/build/src/frontends/java.d.ts.map +1 -0
- package/build/src/frontends/java.js +630 -0
- package/build/src/frontends/javascript-typescript.d.ts +19 -0
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -0
- package/build/src/frontends/javascript-typescript.js +633 -0
- package/build/src/frontends/php.d.ts +12 -0
- package/build/src/frontends/php.d.ts.map +1 -0
- package/build/src/frontends/php.js +523 -0
- package/build/src/frontends/ruby.d.ts +12 -0
- package/build/src/frontends/ruby.d.ts.map +1 -0
- package/build/src/frontends/ruby.js +515 -0
- package/build/src/frontends/scalars.d.ts +19 -0
- package/build/src/frontends/scalars.d.ts.map +1 -0
- package/build/src/frontends/scalars.js +71 -0
- package/build/src/mapping.d.ts +160 -0
- package/build/src/mapping.d.ts.map +1 -0
- package/build/src/mapping.js +1120 -0
- package/build/src/semantic/location.d.ts +61 -0
- package/build/src/semantic/location.d.ts.map +1 -0
- package/build/src/semantic/location.js +142 -0
- package/build/src/semantic/operators.d.ts +16 -0
- package/build/src/semantic/operators.d.ts.map +1 -0
- package/build/src/semantic/operators.js +24 -0
- package/build/src/semantic/provenance.d.ts +74 -0
- package/build/src/semantic/provenance.d.ts.map +1 -0
- package/build/src/semantic/provenance.js +577 -0
- package/build/src/semantic/scalars.d.ts +19 -0
- package/build/src/semantic/scalars.d.ts.map +1 -0
- package/build/src/semantic/scalars.js +40 -0
- package/build/src/semantic/types.d.ts +1003 -0
- package/build/src/semantic/types.d.ts.map +1 -0
- package/build/src/semantic/types.js +279 -0
- package/build/src/semantic/validate.d.ts +60 -0
- package/build/src/semantic/validate.d.ts.map +1 -0
- package/build/src/semantic/validate.js +472 -0
- package/docs/architecture.md +39 -0
- package/docs/coding-standards.md +7 -0
- package/docs/goals.md +7 -0
- package/docs/language-support.md +69 -0
- package/docs/plans/2026-09-02-initial-toolchain.md +54 -0
- package/docs/source-maps.md +134 -0
- package/docs/testing.md +25 -0
- package/index.js +63 -0
- package/package.json +69 -0
- package/src/backends/identifiers.js +101 -0
- package/src/backends/index.js +159 -0
- package/src/backends/java.js +182 -0
- package/src/backends/javascript.js +184 -0
- package/src/backends/php.js +184 -0
- package/src/backends/ruby.js +163 -0
- package/src/backends/scalars.js +120 -0
- package/src/backends/shared.js +456 -0
- package/src/backends/typescript.js +168 -0
- package/src/backends/writer.js +224 -0
- package/src/diagnostic.js +103 -0
- package/src/frontends/index.js +36 -0
- package/src/frontends/java.js +735 -0
- package/src/frontends/javascript-typescript.js +718 -0
- package/src/frontends/php.js +593 -0
- package/src/frontends/ruby.js +622 -0
- package/src/frontends/scalars.js +77 -0
- package/src/mapping.js +1260 -0
- package/src/semantic/location.js +154 -0
- package/src/semantic/operators.js +28 -0
- package/src/semantic/provenance.js +629 -0
- package/src/semantic/scalars.js +44 -0
- package/src/semantic/types.js +319 -0
- package/src/semantic/validate.js +529 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { emitExpression, requiresCanonicalZeroRendering } from "./shared.js";
|
|
3
|
+
import { emitScalarType } from "./scalars.js";
|
|
4
|
+
/**
|
|
5
|
+
* Emits an independently executable TypeScript program through the source-aware writer.
|
|
6
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Semantic module.
|
|
7
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
8
|
+
* @returns {void}
|
|
9
|
+
*/
|
|
10
|
+
export function generateTypeScript(module, writer) {
|
|
11
|
+
const canonicalizeZero = requiresCanonicalZeroRendering(module);
|
|
12
|
+
module.functions.forEach((declaration, functionIndex) => {
|
|
13
|
+
if (functionIndex > 0)
|
|
14
|
+
writer.synthetic("\n\n", "declaration separator", [declaration]);
|
|
15
|
+
writer.mapped("function", { mappingKind: "anchor", node: declaration });
|
|
16
|
+
writer.synthetic(" ", "function spacing", [declaration]);
|
|
17
|
+
writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, role: "name" });
|
|
18
|
+
writer.mapped("(", { mappingKind: "anchor", node: declaration });
|
|
19
|
+
declaration.parameters.forEach((parameter, index) => {
|
|
20
|
+
const parameterPath = `/functions/${functionIndex}/parameters/${index}`;
|
|
21
|
+
if (index > 0)
|
|
22
|
+
writer.synthetic(", ", "parameter separator", [declaration]);
|
|
23
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: parameterPath, role: "name" });
|
|
24
|
+
writer.synthetic(": ", "type separator", [parameter], [parameterPath]);
|
|
25
|
+
writer.mapped(emitScalarType("typescript", parameter.type), {
|
|
26
|
+
mappingKind: "exact",
|
|
27
|
+
node: parameter.type,
|
|
28
|
+
path: `${parameterPath}/type`,
|
|
29
|
+
role: "type"
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
writer.mapped(")", { mappingKind: "anchor", node: declaration });
|
|
33
|
+
writer.synthetic(": ", "return type separator", [declaration]);
|
|
34
|
+
writer.mapped(emitScalarType("typescript", declaration.returnType), {
|
|
35
|
+
mappingKind: "exact",
|
|
36
|
+
node: declaration.returnType,
|
|
37
|
+
path: `/functions/${functionIndex}/returnType`,
|
|
38
|
+
role: "type"
|
|
39
|
+
});
|
|
40
|
+
writer.synthetic(" ", "function spacing", [declaration]);
|
|
41
|
+
writer.mapped("{", { mappingKind: "anchor", node: declaration });
|
|
42
|
+
writer.synthetic("\n", "line break", [declaration]);
|
|
43
|
+
emitBlock(writer, declaration.body, " ", `/functions/${functionIndex}/body`, canonicalizeZero);
|
|
44
|
+
writer.mapped("}", { mappingKind: "anchor", node: declaration });
|
|
45
|
+
});
|
|
46
|
+
writer.synthetic("\n\n", "entry-point separator", [module.entryPoint]);
|
|
47
|
+
emitBlock(writer, module.entryPoint.body, "", "/entryPoint/body", canonicalizeZero);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Emits one ordered TypeScript block body.
|
|
51
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
52
|
+
* @param {import("../semantic/types.js").Block} block - Semantic block.
|
|
53
|
+
* @param {string} indent - Indentation.
|
|
54
|
+
* @param {string} path - Exact block path.
|
|
55
|
+
* @param {boolean} canonicalizeZero - Whether printed integer zero must be canonicalized.
|
|
56
|
+
* @returns {void}
|
|
57
|
+
*/
|
|
58
|
+
function emitBlock(writer, block, indent, path, canonicalizeZero) {
|
|
59
|
+
block.statements.forEach((statement, index) => emitStatement(writer, statement, indent, `${path}/statements/${index}`, canonicalizeZero));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Emits one TypeScript statement.
|
|
63
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
64
|
+
* @param {import("../semantic/types.js").Statement} statement - Semantic statement.
|
|
65
|
+
* @param {string} indent - Indentation.
|
|
66
|
+
* @param {string} path - Exact statement path.
|
|
67
|
+
* @param {boolean} canonicalizeZero - Whether printed integer zero must be canonicalized.
|
|
68
|
+
* @returns {void}
|
|
69
|
+
*/
|
|
70
|
+
function emitStatement(writer, statement, indent, path, canonicalizeZero) {
|
|
71
|
+
if (statement.kind == "LocalDeclaration" || statement.kind == "AssignmentStatement") {
|
|
72
|
+
emitLocal(writer, statement, indent, path);
|
|
73
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
77
|
+
if (statement.kind == "ReturnStatement") {
|
|
78
|
+
writer.mapped("return", { mappingKind: "anchor", node: statement, path });
|
|
79
|
+
writer.synthetic(" ", "return spacing", [statement], [path]);
|
|
80
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "typescript", identity);
|
|
81
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (statement.kind == "PrintStatement") {
|
|
85
|
+
writer.mapped("console.log", { mappingKind: "anchor", node: statement, path });
|
|
86
|
+
writer.mapped("(", { mappingKind: "anchor", node: statement, path });
|
|
87
|
+
if (canonicalizeZero)
|
|
88
|
+
writer.synthetic("(", "canonical integer output", [statement], [path]);
|
|
89
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "typescript", identity);
|
|
90
|
+
if (canonicalizeZero)
|
|
91
|
+
writer.synthetic(").toString()", "canonical integer output", [statement], [path]);
|
|
92
|
+
writer.mapped(")", { mappingKind: "anchor", node: statement, path });
|
|
93
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
writer.mapped("if", { mappingKind: "anchor", node: statement, path });
|
|
97
|
+
writer.synthetic(" ", "conditional spacing", [statement], [path]);
|
|
98
|
+
writer.mapped("(", { mappingKind: "anchor", node: statement, path });
|
|
99
|
+
emitExpression(writer, statement.condition, `${path}/condition`, "typescript", identity);
|
|
100
|
+
writer.mapped(")", { mappingKind: "anchor", node: statement, path });
|
|
101
|
+
writer.synthetic(" ", "conditional spacing", [statement], [path]);
|
|
102
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.consequent, path: `${path}/consequent` });
|
|
103
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
104
|
+
emitBlock(writer, statement.consequent, `${indent} `, `${path}/consequent`, canonicalizeZero);
|
|
105
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
106
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.consequent, path: `${path}/consequent` });
|
|
107
|
+
if (statement.alternate) {
|
|
108
|
+
writer.synthetic(" ", "conditional spacing", [statement], [path]);
|
|
109
|
+
writer.mapped("else", { mappingKind: "anchor", node: statement, path });
|
|
110
|
+
writer.synthetic(" ", "conditional spacing", [statement], [path]);
|
|
111
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.alternate, path: `${path}/alternate` });
|
|
112
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
113
|
+
emitBlock(writer, statement.alternate, `${indent} `, `${path}/alternate`, canonicalizeZero);
|
|
114
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
115
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.alternate, path: `${path}/alternate` });
|
|
116
|
+
}
|
|
117
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Emits one TypeScript local statement.
|
|
121
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
122
|
+
* @param {import("../semantic/types.js").LocalStatement} statement - Local statement.
|
|
123
|
+
* @param {string} indent - Leading indentation.
|
|
124
|
+
* @param {string} statementPath - Exact JSON Pointer for this statement occurrence.
|
|
125
|
+
* @returns {void}
|
|
126
|
+
*/
|
|
127
|
+
function emitLocal(writer, statement, indent, statementPath) {
|
|
128
|
+
writer.synthetic(indent, "indentation", [statement], [statementPath]);
|
|
129
|
+
if (statement.kind == "AssignmentStatement") {
|
|
130
|
+
writer.mapped(statement.target.name, { mappingKind: "exact", node: statement.target, path: `${statementPath}/target`, role: "name" });
|
|
131
|
+
writer.synthetic(" ", "assignment spacing", [statement], [statementPath]);
|
|
132
|
+
writer.mapped("=", { mappingKind: "exact", node: statement, path: statementPath, role: "operator" });
|
|
133
|
+
writer.synthetic(" ", "assignment spacing", [statement], [statementPath]);
|
|
134
|
+
emitExpression(writer, statement.expression, `${statementPath}/expression`, "typescript", identity);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
writer.mapped(statement.mutable ? "let" : "const", { mappingKind: "anchor", node: statement, path: statementPath });
|
|
138
|
+
writer.synthetic(" ", "declaration spacing", [statement], [statementPath]);
|
|
139
|
+
writer.mapped(statement.name, { mappingKind: "exact", node: statement, path: statementPath, role: "name" });
|
|
140
|
+
writer.synthetic(": ", "type separator", [statement], [statementPath]);
|
|
141
|
+
writer.mapped(emitScalarType("typescript", statement.type), {
|
|
142
|
+
mappingKind: "exact",
|
|
143
|
+
node: statement.type,
|
|
144
|
+
path: `${statementPath}/type`,
|
|
145
|
+
role: "type"
|
|
146
|
+
});
|
|
147
|
+
writer.synthetic(" ", "assignment spacing", [statement], [statementPath]);
|
|
148
|
+
writer.mapped("=", { mappingKind: "exact", node: statement, path: statementPath, role: "operator" });
|
|
149
|
+
writer.synthetic(" ", "assignment spacing", [statement], [statementPath]);
|
|
150
|
+
emitExpression(writer, statement.initializer, `${statementPath}/initializer`, "typescript", identity);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Returns an unchanged TypeScript identifier.
|
|
154
|
+
* @param {string} name - Identifier.
|
|
155
|
+
* @returns {string} Identifier.
|
|
156
|
+
*/
|
|
157
|
+
function identity(name) {
|
|
158
|
+
return name;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy90eXBlc2NyaXB0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsY0FBYyxFQUFFLDhCQUE4QixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQzFFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFM0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU07SUFDL0MsTUFBTSxnQkFBZ0IsR0FBRyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUUvRCxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsRUFBRTtRQUN0RCxJQUFJLGFBQWEsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBRXZGLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUNyRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDeEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQ3hGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUM5RCxXQUFXLENBQUMsVUFBVSxDQUFD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QUFDLENBQUE7SUFDekUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtJQUNsRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtJQUN6RSxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxhQUFhLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDdkcsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxJQUFJO0lBQ3BCLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2VtaXRFeHByZXNzaW9uLCByZXF1aXJlc0Nhbm9uaWNhbFplcm9SZW5kZXJpbmd9IGZyb20gXCIuL3NoYXJlZC5qc1wiXG5pbXBvcnQge2VtaXRTY2FsYXJUeXBlfSBmcm9tIFwiLi9zY2FsYXJzLmpzXCJcblxuLyoqXG4gKiBFbWl0cyBhbiBpbmRlcGVuZGVudGx5IGV4ZWN1dGFibGUgVHlwZVNjcmlwdCBwcm9ncmFtIHRocm91Z2ggdGhlIHNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlU2NyaXB0KG1vZHVsZSwgd3JpdGVyKSB7XG4gIGNvbnN0IGNhbm9uaWNhbGl6ZVplcm8gPSByZXF1aXJlc0Nhbm9uaWNhbFplcm9SZW5kZXJpbmcobW9kdWxlKVxuXG4gIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGZ1bmN0aW9uSW5kZXgpID0+IHtcbiAgICBpZiAoZnVuY3Rpb25JbmRleCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJkZWNsYXJhdGlvbiBzZXBhcmF0b3JcIiwgW2RlY2xhcmF0aW9uXSlcblxuICAgIHdyaXRlci5tYXBwZWQoXCJmdW5jdGlvblwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImZ1bmN0aW9uIHNwYWNpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKGRlY2xhcmF0aW9uLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBkZWNsYXJhdGlvbiwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5tYXBwZWQoXCIoXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGFyYW1ldGVyUGF0aCA9IGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vcGFyYW1ldGVycy8ke2luZGV4fWBcblxuICAgICAgaWYgKGluZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIiwgXCIsIFwicGFyYW1ldGVyIHNlcGFyYXRvclwiLCBbZGVjbGFyYXRpb25dKVxuICAgICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogcGFyYW1ldGVyUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIjogXCIsIFwidHlwZSBzZXBhcmF0b3JcIiwgW3BhcmFtZXRlcl0sIFtwYXJhbWV0ZXJQYXRoXSlcbiAgICAgIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJ0eXBlc2NyaXB0XCIsIHBhcmFtZXRlci50eXBlKSwge1xuICAgICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLFxuICAgICAgICBub2RlOiBwYXJhbWV0ZXIudHlwZSxcbiAgICAgICAgcGF0aDogYCR7cGFyYW1ldGVyUGF0aH0vdHlwZWAsXG4gICAgICAgIHJvbGU6IFwidHlwZVwiXG4gICAgICB9KVxuICAgIH0pXG4gICAgd3JpdGVyLm1hcHBlZChcIilcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIjogXCIsIFwicmV0dXJuIHR5cGUgc2VwYXJhdG9yXCIsIFtkZWNsYXJhdGlvbl0pXG4gICAgd3JpdGVyLm1hcHBlZChlbWl0U2NhbGFyVHlwZShcInR5cGVzY3JpcHRcIiwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSksIHtcbiAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsXG4gICAgICBub2RlOiBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLFxuICAgICAgcGF0aDogYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9yZXR1cm5UeXBlYCxcbiAgICAgIHJvbGU6IFwidHlwZVwiXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImZ1bmN0aW9uIHNwYWNpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKFwie1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbZGVjbGFyYXRpb25dKVxuXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgZGVjbGFyYXRpb24uYm9keSwgXCIgIFwiLCBgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L2JvZHlgLCBjYW5vbmljYWxpemVaZXJvKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICB9KVxuXG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJlbnRyeS1wb2ludCBzZXBhcmF0b3JcIiwgW21vZHVsZS5lbnRyeVBvaW50XSlcbiAgZW1pdEJsb2NrKHdyaXRlciwgbW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgXCJcIiwgXCIvZW50cnlQb2ludC9ib2R5XCIsIGNhbm9uaWNhbGl6ZVplcm8pXG59XG5cbi8qKlxuICogRW1pdHMgb25lIG9yZGVyZWQgVHlwZVNjcmlwdCBibG9jayBib2R5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEluZGVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBFeGFjdCBibG9jayBwYXRoLlxuICogQHBhcmFtIHtib29sZWFufSBjYW5vbmljYWxpemVaZXJvIC0gV2hldGhlciBwcmludGVkIGludGVnZXIgemVybyBtdXN0IGJlIGNhbm9uaWNhbGl6ZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdEJsb2NrKHdyaXRlciwgYmxvY2ssIGluZGVudCwgcGF0aCwgY2Fub25pY2FsaXplWmVybykge1xuICBibG9jay5zdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCwgaW5kZXgpID0+IGVtaXRTdGF0ZW1lbnQod3JpdGVyLCBzdGF0ZW1lbnQsIGluZGVudCwgYCR7cGF0aH0vc3RhdGVtZW50cy8ke2luZGV4fWAsIGNhbm9uaWNhbGl6ZVplcm8pKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBUeXBlU2NyaXB0IHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFNlbWFudGljIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBJbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRXhhY3Qgc3RhdGVtZW50IHBhdGguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNhbm9uaWNhbGl6ZVplcm8gLSBXaGV0aGVyIHByaW50ZWQgaW50ZWdlciB6ZXJvIG11c3QgYmUgY2Fub25pY2FsaXplZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0U3RhdGVtZW50KHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIHBhdGgsIGNhbm9uaWNhbGl6ZVplcm8pIHtcbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgZW1pdExvY2FsKHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIHBhdGgpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJyZXR1cm5cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwicmV0dXJuIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgXCJ0eXBlc2NyaXB0XCIsIGlkZW50aXR5KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJjb25zb2xlLmxvZ1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIGlmIChjYW5vbmljYWxpemVaZXJvKSB3cml0ZXIuc3ludGhldGljKFwiKFwiLCBcImNhbm9uaWNhbCBpbnRlZ2VyIG91dHB1dFwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBcInR5cGVzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgaWYgKGNhbm9uaWNhbGl6ZVplcm8pIHdyaXRlci5zeW50aGV0aWMoXCIpLnRvU3RyaW5nKClcIiwgXCJjYW5vbmljYWwgaW50ZWdlciBvdXRwdXRcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICB3cml0ZXIubWFwcGVkKFwiaWZcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5jb25kaXRpb24sIGAke3BhdGh9L2NvbmRpdGlvbmAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgd3JpdGVyLm1hcHBlZChcIilcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuY29uc2VxdWVudCwgcGF0aDogYCR7cGF0aH0vY29uc2VxdWVudGB9KVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuY29uc2VxdWVudCwgYCR7aW5kZW50fSAgYCwgYCR7cGF0aH0vY29uc2VxdWVudGAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmNvbnNlcXVlbnQsIHBhdGg6IGAke3BhdGh9L2NvbnNlcXVlbnRgfSlcbiAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHtcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiZWxzZVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBwYXRoOiBgJHtwYXRofS9hbHRlcm5hdGVgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIHN0YXRlbWVudC5hbHRlcm5hdGUsIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2FsdGVybmF0ZWAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5hbHRlcm5hdGUsIHBhdGg6IGAke3BhdGh9L2FsdGVybmF0ZWB9KVxuICB9XG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG59XG5cbi8qKlxuICogRW1pdHMgb25lIFR5cGVTY3JpcHQgbG9jYWwgc3RhdGVtZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkxvY2FsU3RhdGVtZW50fSBzdGF0ZW1lbnQgLSBMb2NhbCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gTGVhZGluZyBpbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZW1lbnRQYXRoIC0gRXhhY3QgSlNPTiBQb2ludGVyIGZvciB0aGlzIHN0YXRlbWVudCBvY2N1cnJlbmNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVtaXRMb2NhbCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBzdGF0ZW1lbnRQYXRoKSB7XG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG5cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQudGFyZ2V0LCBwYXRoOiBgJHtzdGF0ZW1lbnRQYXRofS90YXJnZXRgLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiPVwiLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm9wZXJhdG9yXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7c3RhdGVtZW50UGF0aH0vZXhwcmVzc2lvbmAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50Lm11dGFibGUgPyBcImxldFwiIDogXCJjb25zdFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZGVjbGFyYXRpb24gc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB3cml0ZXIubWFwcGVkKHN0YXRlbWVudC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCI6IFwiLCBcInR5cGUgc2VwYXJhdG9yXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJ0eXBlc2NyaXB0XCIsIHN0YXRlbWVudC50eXBlKSwge1xuICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsXG4gICAgbm9kZTogc3RhdGVtZW50LnR5cGUsXG4gICAgcGF0aDogYCR7c3RhdGVtZW50UGF0aH0vdHlwZWAsXG4gICAgcm9sZTogXCJ0eXBlXCJcbiAgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIj1cIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aCwgcm9sZTogXCJvcGVyYXRvclwifSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIGAke3N0YXRlbWVudFBhdGh9L2luaXRpYWxpemVyYCwgXCJ0eXBlc2NyaXB0XCIsIGlkZW50aXR5KVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gdW5jaGFuZ2VkIFR5cGVTY3JpcHQgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gSWRlbnRpZmllci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IElkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KG5hbWUpIHtcbiAgcmV0dXJuIG5hbWVcbn1cbiJdfQ==
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/** Source-aware deterministic generated-output builder. */
|
|
2
|
+
export declare class SourceWriter {
|
|
3
|
+
#private;
|
|
4
|
+
filename: string;
|
|
5
|
+
language: import("../semantic/types.js").SemanticLanguage;
|
|
6
|
+
index: {
|
|
7
|
+
provenance: import("../semantic/types.js").SemanticProvenance;
|
|
8
|
+
recordFor: (node: import("../semantic/types.js").SemanticNode, path?: string) => import("../semantic/types.js").SemanticNodeProvenance;
|
|
9
|
+
};
|
|
10
|
+
/** @type {string[]} */
|
|
11
|
+
parts: string[];
|
|
12
|
+
/** @type {import("../semantic/types.js").SemantifoldMappingSpan[]} */
|
|
13
|
+
spans: import("../semantic/types.js").SemantifoldMappingSpan[];
|
|
14
|
+
offset: number;
|
|
15
|
+
line: number;
|
|
16
|
+
column: number;
|
|
17
|
+
/**
|
|
18
|
+
* Creates a source-aware writer.
|
|
19
|
+
* @param {object} options - Writer options.
|
|
20
|
+
* @param {string} options.filename - Output filename.
|
|
21
|
+
* @param {import("../semantic/types.js").SemanticLanguage} options.language - Output language.
|
|
22
|
+
* @param {import("../semantic/types.js").SemanticModule} options.module - Semantic module.
|
|
23
|
+
* @param {{filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]} [options.sources] - Caller-provided sources.
|
|
24
|
+
*/
|
|
25
|
+
constructor({ filename, language, module, sources }: {
|
|
26
|
+
filename: string;
|
|
27
|
+
language: import("../semantic/types.js").SemanticLanguage;
|
|
28
|
+
module: import("../semantic/types.js").SemanticModule;
|
|
29
|
+
sources?: {
|
|
30
|
+
filename: string;
|
|
31
|
+
content: string;
|
|
32
|
+
language?: import("../semantic/types.js").SemanticLanguage;
|
|
33
|
+
}[];
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* Returns generated content so far.
|
|
37
|
+
* @returns {string} Generated content.
|
|
38
|
+
*/
|
|
39
|
+
get code(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Returns the current JSON Pointer for one unambiguous semantic occurrence.
|
|
42
|
+
* @param {import("../semantic/types.js").SemanticNode} node - Semantic node occurrence.
|
|
43
|
+
* @returns {string} Current occurrence path.
|
|
44
|
+
*/
|
|
45
|
+
occurrencePath(node: import("../semantic/types.js").SemanticNode): string;
|
|
46
|
+
/**
|
|
47
|
+
* Reports whether an exact parser-owned role range is available.
|
|
48
|
+
* @param {import("../semantic/types.js").SemanticNode} node - Semantic node occurrence.
|
|
49
|
+
* @param {string} path - JSON Pointer for a shared node occurrence.
|
|
50
|
+
* @param {string} role - Semantic token role.
|
|
51
|
+
* @returns {boolean} Whether the role has an exact source range.
|
|
52
|
+
*/
|
|
53
|
+
hasRange(node: import("../semantic/types.js").SemanticNode, path: string, role: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Writes text mapped to a semantic node.
|
|
56
|
+
* @param {string} text - Generated text.
|
|
57
|
+
* @param {object} annotation - Mapping annotation.
|
|
58
|
+
* @param {import("../semantic/types.js").SemanticNode} annotation.node - Semantic node.
|
|
59
|
+
* @param {"exact" | "anchor"} annotation.mappingKind - Mapping precision.
|
|
60
|
+
* @param {string} [annotation.role] - Semantic token role.
|
|
61
|
+
* @param {string} [annotation.name] - Source Map name.
|
|
62
|
+
* @param {string} [annotation.path] - JSON Pointer for a shared node occurrence.
|
|
63
|
+
* @returns {void}
|
|
64
|
+
*/
|
|
65
|
+
mapped(text: string, { mappingKind, name, node, path, role }: {
|
|
66
|
+
node: import("../semantic/types.js").SemanticNode;
|
|
67
|
+
mappingKind: "exact" | "anchor";
|
|
68
|
+
role?: string;
|
|
69
|
+
name?: string;
|
|
70
|
+
path?: string;
|
|
71
|
+
}): void;
|
|
72
|
+
/**
|
|
73
|
+
* Writes source-free scaffolding with optional semantic context.
|
|
74
|
+
* @param {string} text - Generated text.
|
|
75
|
+
* @param {string} reason - Stable reason.
|
|
76
|
+
* @param {import("../semantic/types.js").SemanticNode[]} [relatedNodes] - Related nodes.
|
|
77
|
+
* @param {(string | undefined)[]} [relatedPaths] - Occurrence paths for shared related nodes.
|
|
78
|
+
* @returns {void}
|
|
79
|
+
*/
|
|
80
|
+
synthetic(text: string, reason: string, relatedNodes?: import("../semantic/types.js").SemanticNode[], relatedPaths?: (string | undefined)[]): void;
|
|
81
|
+
/**
|
|
82
|
+
* Returns the authoritative rich map for the current content.
|
|
83
|
+
* @returns {import("../semantic/types.js").SemantifoldMapping} Mapping.
|
|
84
|
+
*/
|
|
85
|
+
finish(): import("../semantic/types.js").SemantifoldMapping;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/backends/writer.js"],"names":[],"mappings":"AAIA,2DAA2D;AAC3D,qBAAa,YAAY;;IAYhB,QAAQ;IACR,QAAQ;IACR,KAAK;;;;IACV,uBAAuB;IAClB,KAAK,EADC,MAAM,EAAE;IAEnB,sEAAsE;IACjE,KAAK,EADC,OAAO,sBAAsB,EAAE,sBAAsB,EAAE;IAE7D,MAAM;IACN,IAAI;IACJ,MAAM;IApBb;;;;;;;OAOG;IACH,YAAY,EAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAC,EAL9C;QAAwB,QAAQ,EAAxB,MAAM,CACd;QAAiE,QAAQ,EAAjE,OAAO,sBAAsB,EAAE,gBAAgB,CACvD;QAA+D,MAAM,EAA7D,OAAO,sBAAsB,EAAE,cAAc,CACrD;QAAoH,OAAO,AAA3H,CACF,EADU;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;SAAC,EAAE,CAC3G;KACgD,EAahD;IAED;;;OAGG;IACH,IAAI,IAAI,IAFK,MAAM,CAIlB;IAED;;;;OAIG;IACH,cAAc,CAAC,IAAI,EAHR,OAAO,sBAAsB,EAAE,YAGvB,GAFN,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EALF,OAAO,sBAAsB,EAAE,YAK7B,EAAE,IAAI,EAJR,MAIQ,EAAE,IAAI,EAHd,MAGc,GAFZ,OAAO,CAInB;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,IAAI,EATA,MASA,EAAE,EAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,EAP/C;QAAgE,IAAI,EAA5D,OAAO,sBAAsB,EAAE,YAAY,CACnD;QAAuC,WAAW,EAA1C,OAAO,GAAG,QAAQ,CAC1B;QAA4B,IAAI,AAAhC,CACA,EADQ,MAAM,CACd;QAA4B,IAAI,AAAhC,CACA,EADQ,MAAM,CACd;QAA4B,IAAI,AAAhC,CACA,EADQ,MAAM,CACd;KAE+C,GAFrC,IAAI,CAqBhB;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,IAAI,EANH,MAMG,EAAE,MAAM,EALX,MAKW,EAAE,YAAY,AAJjC,CACA,EADQ,OAAO,sBAAsB,EAAE,YAAY,EAIb,EAAE,YAAY,AAHpD,CACA,EADQ,CAAC,MAAM,GAAG,SAAS,CAAC,EAG6B,GAF/C,IAAI,CA0BhB;IAED;;;OAGG;IACH,MAAM,IAFO,OAAO,sBAAsB,EAAE,kBAAkB,CAa7D;CAwDF"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { createGenerationIndex } from "../semantic/provenance.js";
|
|
3
|
+
/** Source-aware deterministic generated-output builder. */
|
|
4
|
+
export class SourceWriter {
|
|
5
|
+
/**
|
|
6
|
+
* Creates a source-aware writer.
|
|
7
|
+
* @param {object} options - Writer options.
|
|
8
|
+
* @param {string} options.filename - Output filename.
|
|
9
|
+
* @param {import("../semantic/types.js").SemanticLanguage} options.language - Output language.
|
|
10
|
+
* @param {import("../semantic/types.js").SemanticModule} options.module - Semantic module.
|
|
11
|
+
* @param {{filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]} [options.sources] - Caller-provided sources.
|
|
12
|
+
*/
|
|
13
|
+
constructor({ filename, language, module, sources }) {
|
|
14
|
+
const index = createGenerationIndex(module, sources);
|
|
15
|
+
this.filename = filename;
|
|
16
|
+
this.language = language;
|
|
17
|
+
this.index = index;
|
|
18
|
+
/** @type {string[]} */
|
|
19
|
+
this.parts = [];
|
|
20
|
+
/** @type {import("../semantic/types.js").SemantifoldMappingSpan[]} */
|
|
21
|
+
this.spans = [];
|
|
22
|
+
this.offset = 0;
|
|
23
|
+
this.line = 1;
|
|
24
|
+
this.column = 1;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns generated content so far.
|
|
28
|
+
* @returns {string} Generated content.
|
|
29
|
+
*/
|
|
30
|
+
get code() {
|
|
31
|
+
return this.parts.join("");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Returns the current JSON Pointer for one unambiguous semantic occurrence.
|
|
35
|
+
* @param {import("../semantic/types.js").SemanticNode} node - Semantic node occurrence.
|
|
36
|
+
* @returns {string} Current occurrence path.
|
|
37
|
+
*/
|
|
38
|
+
occurrencePath(node) {
|
|
39
|
+
return this.index.recordFor(node).path;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reports whether an exact parser-owned role range is available.
|
|
43
|
+
* @param {import("../semantic/types.js").SemanticNode} node - Semantic node occurrence.
|
|
44
|
+
* @param {string} path - JSON Pointer for a shared node occurrence.
|
|
45
|
+
* @param {string} role - Semantic token role.
|
|
46
|
+
* @returns {boolean} Whether the role has an exact source range.
|
|
47
|
+
*/
|
|
48
|
+
hasRange(node, path, role) {
|
|
49
|
+
return this.index.recordFor(node, path).ranges[role] !== undefined;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Writes text mapped to a semantic node.
|
|
53
|
+
* @param {string} text - Generated text.
|
|
54
|
+
* @param {object} annotation - Mapping annotation.
|
|
55
|
+
* @param {import("../semantic/types.js").SemanticNode} annotation.node - Semantic node.
|
|
56
|
+
* @param {"exact" | "anchor"} annotation.mappingKind - Mapping precision.
|
|
57
|
+
* @param {string} [annotation.role] - Semantic token role.
|
|
58
|
+
* @param {string} [annotation.name] - Source Map name.
|
|
59
|
+
* @param {string} [annotation.path] - JSON Pointer for a shared node occurrence.
|
|
60
|
+
* @returns {void}
|
|
61
|
+
*/
|
|
62
|
+
mapped(text, { mappingKind, name, node, path, role }) {
|
|
63
|
+
if (text.length == 0)
|
|
64
|
+
return;
|
|
65
|
+
const record = this.index.recordFor(node, path);
|
|
66
|
+
const roleLocation = role ? record.ranges[role] : undefined;
|
|
67
|
+
const origin = roleLocation ? this.#sourceOrigin(roleLocation, record.origin) : record.origin;
|
|
68
|
+
const precision = mappingKind == "exact" && role && !roleLocation ? "anchor" : mappingKind;
|
|
69
|
+
const symbol = record.symbolId
|
|
70
|
+
? this.index.provenance.symbols.find((candidate) => candidate.id == record.symbolId)
|
|
71
|
+
: undefined;
|
|
72
|
+
this.#append(text, {
|
|
73
|
+
mappingKind: precision,
|
|
74
|
+
name: name ?? symbol?.name,
|
|
75
|
+
nodeId: record.id,
|
|
76
|
+
origin,
|
|
77
|
+
role,
|
|
78
|
+
symbolId: record.symbolId
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Writes source-free scaffolding with optional semantic context.
|
|
83
|
+
* @param {string} text - Generated text.
|
|
84
|
+
* @param {string} reason - Stable reason.
|
|
85
|
+
* @param {import("../semantic/types.js").SemanticNode[]} [relatedNodes] - Related nodes.
|
|
86
|
+
* @param {(string | undefined)[]} [relatedPaths] - Occurrence paths for shared related nodes.
|
|
87
|
+
* @returns {void}
|
|
88
|
+
*/
|
|
89
|
+
synthetic(text, reason, relatedNodes = [], relatedPaths = []) {
|
|
90
|
+
if (text.length == 0)
|
|
91
|
+
return;
|
|
92
|
+
/** @type {Set<string>} */
|
|
93
|
+
const seen = new Set();
|
|
94
|
+
const relatedOrigins = relatedNodes.flatMap((node, index) => {
|
|
95
|
+
const record = this.index.recordFor(node, relatedPaths[index]);
|
|
96
|
+
return relatedOriginsFor(record.origin).flatMap((related) => {
|
|
97
|
+
const contextual = {
|
|
98
|
+
...related,
|
|
99
|
+
nodeId: related.nodeId ?? record.id,
|
|
100
|
+
role: related.role ?? "context"
|
|
101
|
+
};
|
|
102
|
+
const key = relatedOriginKey(contextual);
|
|
103
|
+
if (seen.has(key))
|
|
104
|
+
return [];
|
|
105
|
+
seen.add(key);
|
|
106
|
+
return [contextual];
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
this.#append(text, { mappingKind: "synthetic", origin: { kind: "synthetic", reason, relatedOrigins } });
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Returns the authoritative rich map for the current content.
|
|
113
|
+
* @returns {import("../semantic/types.js").SemantifoldMapping} Mapping.
|
|
114
|
+
*/
|
|
115
|
+
finish() {
|
|
116
|
+
return {
|
|
117
|
+
coordinateSystem: "utf16",
|
|
118
|
+
generated: { content: this.code, filename: this.filename, language: this.language },
|
|
119
|
+
nodes: [...this.index.provenance.nodes],
|
|
120
|
+
schema: "SemantifoldMapping",
|
|
121
|
+
sources: [...this.index.provenance.sources],
|
|
122
|
+
spans: [...this.spans],
|
|
123
|
+
symbols: [...this.index.provenance.symbols],
|
|
124
|
+
version: 1
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Appends one mapped span.
|
|
129
|
+
* @param {string} text - Generated text.
|
|
130
|
+
* @param {Omit<import("../semantic/types.js").SemantifoldMappingSpan, "generated">} annotation - Span annotation.
|
|
131
|
+
* @returns {void}
|
|
132
|
+
*/
|
|
133
|
+
#append(text, annotation) {
|
|
134
|
+
if (text.includes("\r"))
|
|
135
|
+
throw new TypeError("Generated output must use deterministic LF line endings.");
|
|
136
|
+
const start = { column: this.column, line: this.line, offset: this.offset };
|
|
137
|
+
this.parts.push(text);
|
|
138
|
+
for (let index = 0; index < text.length; index++) {
|
|
139
|
+
this.offset++;
|
|
140
|
+
if (text[index] == "\n") {
|
|
141
|
+
this.line++;
|
|
142
|
+
this.column = 1;
|
|
143
|
+
}
|
|
144
|
+
else
|
|
145
|
+
this.column++;
|
|
146
|
+
}
|
|
147
|
+
const compact = /** @type {Omit<import("../semantic/types.js").SemantifoldMappingSpan, "generated">} */ (Object.fromEntries(Object.entries(annotation).filter(([, value]) => value !== undefined)));
|
|
148
|
+
this.spans.push({
|
|
149
|
+
...compact,
|
|
150
|
+
generated: {
|
|
151
|
+
end: { column: this.column, line: this.line, offset: this.offset },
|
|
152
|
+
filename: this.filename,
|
|
153
|
+
start
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Creates a direct role origin using canonical source identities.
|
|
159
|
+
* @param {import("../semantic/types.js").SourceLocation} location - Exact role range.
|
|
160
|
+
* @param {import("../semantic/types.js").SemanticOrigin} fallback - Owning origin.
|
|
161
|
+
* @returns {import("../semantic/types.js").SemanticOrigin} Role origin.
|
|
162
|
+
*/
|
|
163
|
+
#sourceOrigin(location, fallback) {
|
|
164
|
+
/** @type {string | undefined} */
|
|
165
|
+
let fallbackSourceId;
|
|
166
|
+
if (fallback.kind == "source" && fallback.location.filename == location.filename)
|
|
167
|
+
fallbackSourceId = fallback.sourceId;
|
|
168
|
+
else if (fallback.kind == "derived") {
|
|
169
|
+
fallbackSourceId = fallback.origins.find((origin) => origin.location.filename == location.filename)?.sourceId;
|
|
170
|
+
}
|
|
171
|
+
else if (fallback.kind == "synthetic") {
|
|
172
|
+
fallbackSourceId = fallback.relatedOrigins.find((origin) => origin.location.filename == location.filename)?.sourceId;
|
|
173
|
+
}
|
|
174
|
+
const source = this.index.provenance.sources.find((candidate) => candidate.id == fallbackSourceId) ??
|
|
175
|
+
this.index.provenance.sources.find((candidate) => candidate.filename == location.filename);
|
|
176
|
+
return source ? { kind: "source", location, sourceId: source.id } : fallback;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Expands every closed provenance range in semantic order.
|
|
181
|
+
* @param {import("../semantic/types.js").SemanticOrigin} origin - Closed provenance.
|
|
182
|
+
* @returns {import("../semantic/types.js").RelatedOrigin[]} Related ranges.
|
|
183
|
+
*/
|
|
184
|
+
function relatedOriginsFor(origin) {
|
|
185
|
+
if (origin.kind == "source")
|
|
186
|
+
return [{ location: origin.location, sourceId: origin.sourceId }];
|
|
187
|
+
if (origin.kind == "derived")
|
|
188
|
+
return origin.origins;
|
|
189
|
+
return origin.relatedOrigins;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Builds a deterministic identity for one contextual related origin.
|
|
193
|
+
* @param {import("../semantic/types.js").RelatedOrigin} origin - Related origin.
|
|
194
|
+
* @returns {string} Stable identity.
|
|
195
|
+
*/
|
|
196
|
+
function relatedOriginKey(origin) {
|
|
197
|
+
return JSON.stringify([
|
|
198
|
+
origin.sourceId,
|
|
199
|
+
origin.location.filename,
|
|
200
|
+
origin.location.start.offset,
|
|
201
|
+
origin.location.end.offset,
|
|
202
|
+
origin.nodeId ?? null,
|
|
203
|
+
origin.symbolId ?? null,
|
|
204
|
+
origin.role ?? null
|
|
205
|
+
]);
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3dyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFL0QsMkRBQTJEO0FBQzNELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCOzs7Ozs7O09BT0c7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUVwRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7UUFDZixzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDNUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsSUFBSTtRQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsUUFBUSxDQUFDLElBQUksRUFBRSxJ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QUFTLGlCQUFpQixDQUFDLE1BQU07SUFDL0IsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVE7UUFBRSxPQUFPLENBQUMsRUFBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDNUYsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUE7SUFFbkQsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFBO0FBQzlCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNO0lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwQixNQUFNLENBQUMsUUFBUTtRQUNmLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUTtRQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQzVCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU07UUFDMUIsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO1FBQ3JCLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSTtRQUN2QixNQUFNLENBQUMsSUFBSSxJQUFJLElBQUk7S0FDcEIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2NyZWF0ZUdlbmVyYXRpb25JbmRleH0gZnJvbSBcIi4uL3NlbWFudGljL3Byb3ZlbmFuY2UuanNcIlxuXG4vKiogU291cmNlLWF3YXJlIGRldGVybWluaXN0aWMgZ2VuZXJhdGVkLW91dHB1dCBidWlsZGVyLiAqL1xuZXhwb3J0IGNsYXNzIFNvdXJjZVdyaXRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc291cmNlLWF3YXJlIHdyaXRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBXcml0ZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZmlsZW5hbWUgLSBPdXRwdXQgZmlsZW5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gb3B0aW9ucy5sYW5ndWFnZSAtIE91dHB1dCBsYW5ndWFnZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gb3B0aW9ucy5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbb3B0aW9ucy5zb3VyY2VzXSAtIENhbGxlci1wcm92aWRlZCBzb3VyY2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2ZpbGVuYW1lLCBsYW5ndWFnZSwgbW9kdWxlLCBzb3VyY2VzfSkge1xuICAgIGNvbnN0IGluZGV4ID0gY3JlYXRlR2VuZXJhdGlvbkluZGV4KG1vZHVsZSwgc291cmNlcylcblxuICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZVxuICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZVxuICAgIHRoaXMuaW5kZXggPSBpbmRleFxuICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5wYXJ0cyA9IFtdXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovXG4gICAgdGhpcy5zcGFucyA9IFtdXG4gICAgdGhpcy5vZmZzZXQgPSAwXG4gICAgdGhpcy5saW5lID0gMVxuICAgIHRoaXMuY29sdW1uID0gMVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ2VuZXJhdGVkIGNvbnRlbnQgc28gZmFyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBHZW5lcmF0ZWQgY29udGVudC5cbiAgICovXG4gIGdldCBjb2RlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnRzLmpvaW4oXCJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEpTT04gUG9pbnRlciBmb3Igb25lIHVuYW1iaWd1b3VzIHNlbWFudGljIG9jY3VycmVuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDdXJyZW50IG9jY3VycmVuY2UgcGF0aC5cbiAgICovXG4gIG9jY3VycmVuY2VQYXRoKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleC5yZWNvcmRGb3Iobm9kZSkucGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbiBleGFjdCBwYXJzZXItb3duZWQgcm9sZSByYW5nZSBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmb3IgYSBzaGFyZWQgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIFNlbWFudGljIHRva2VuIHJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByb2xlIGhhcyBhbiBleGFjdCBzb3VyY2UgcmFuZ2UuXG4gICAqL1xuICBoYXNSYW5nZShub2RlLCBwYXRoLCByb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpLnJhbmdlc1tyb2xlXSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRleHQgbWFwcGVkIHRvIGEgc2VtYW50aWMgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFubm90YXRpb24gLSBNYXBwaW5nIGFubm90YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBhbm5vdGF0aW9uLm5vZGUgLSBTZW1hbnRpYyBub2RlLlxuICAgKiBAcGFyYW0ge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCJ9IGFubm90YXRpb24ubWFwcGluZ0tpbmQgLSBNYXBwaW5nIHByZWNpc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLnJvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLm5hbWVdIC0gU291cmNlIE1hcCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ucGF0aF0gLSBKU09OIFBvaW50ZXIgZm9yIGEgc2hhcmVkIG5vZGUgb2NjdXJyZW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwge21hcHBpbmdLaW5kLCBuYW1lLCBub2RlLCBwYXRoLCByb2xlfSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpXG4gICAgY29uc3Qgcm9sZUxvY2F0aW9uID0gcm9sZSA/IHJlY29yZC5yYW5nZXNbcm9sZV0gOiB1bmRlZmluZWRcbiAgICBjb25zdCBvcmlnaW4gPSByb2xlTG9jYXRpb24gPyB0aGlzLiNzb3VyY2VPcmlnaW4ocm9sZUxvY2F0aW9uLCByZWNvcmQub3JpZ2luKSA6IHJlY29yZC5vcmlnaW5cbiAgICBjb25zdCBwcmVjaXNpb24gPSBtYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiYgcm9sZSAmJiAhcm9sZUxvY2F0aW9uID8gXCJhbmNob3JcIiA6IG1hcHBpbmdLaW5kXG4gICAgY29uc3Qgc3ltYm9sID0gcmVjb3JkLnN5bWJvbElkXG4gICAgICA/IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zeW1ib2xzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IHJlY29yZC5zeW1ib2xJZClcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICB0aGlzLiNhcHBlbmQodGV4dCwge1xuICAgICAgbWFwcGluZ0tpbmQ6IHByZWNpc2lvbixcbiAgICAgIG5hbWU6IG5hbWUgPz8gc3ltYm9sPy5uYW1lLFxuICAgICAgbm9kZUlkOiByZWNvcmQuaWQsXG4gICAgICBvcmlnaW4sXG4gICAgICByb2xlLFxuICAgICAgc3ltYm9sSWQ6IHJlY29yZC5zeW1ib2xJZFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHNvdXJjZS1mcmVlIHNjYWZmb2xkaW5nIHdpdGggb3B0aW9uYWwgc2VtYW50aWMgY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSByZWFzb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlW119IFtyZWxhdGVkTm9kZXNdIC0gUmVsYXRlZCBub2Rlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgdW5kZWZpbmVkKVtdfSBbcmVsYXRlZFBhdGhzXSAtIE9jY3VycmVuY2UgcGF0aHMgZm9yIHNoYXJlZCByZWxhdGVkIG5vZGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN5bnRoZXRpYyh0ZXh0LCByZWFzb24sIHJlbGF0ZWROb2RlcyA9IFtdLCByZWxhdGVkUGF0aHMgPSBbXSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHJlbGF0ZWRPcmlnaW5zID0gcmVsYXRlZE5vZGVzLmZsYXRNYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlLCByZWxhdGVkUGF0aHNbaW5kZXhdKVxuXG4gICAgICByZXR1cm4gcmVsYXRlZE9yaWdpbnNGb3IocmVjb3JkLm9yaWdpbikuZmxhdE1hcCgocmVsYXRlZCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsID0ge1xuICAgICAgICAgIC4uLnJlbGF0ZWQsXG4gICAgICAgICAgbm9kZUlkOiByZWxhdGVkLm5vZGVJZCA/PyByZWNvcmQuaWQsXG4gICAgICAgICAgcm9sZTogcmVsYXRlZC5yb2xlID8/IFwiY29udGV4dFwiXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gcmVsYXRlZE9yaWdpbktleShjb250ZXh0dWFsKVxuXG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gW11cbiAgICAgICAgc2Vlbi5hZGQoa2V5KVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dHVhbF1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuI2FwcGVuZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IFwic3ludGhldGljXCIsIG9yaWdpbjoge2tpbmQ6IFwic3ludGhldGljXCIsIHJlYXNvbiwgcmVsYXRlZE9yaWdpbnN9fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpdGF0aXZlIHJpY2ggbWFwIGZvciB0aGUgY3VycmVudCBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBNYXBwaW5nLlxuICAgKi9cbiAgZmluaXNoKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgICBnZW5lcmF0ZWQ6IHtjb250ZW50OiB0aGlzLmNvZGUsIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLCBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZX0sXG4gICAgICBub2RlczogWy4uLnRoaXMuaW5kZXgucHJvdmVuYW5jZS5ub2Rlc10sXG4gICAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgICBzb3VyY2VzOiBbLi4udGhpcy5pbmRleC5wcm92ZW5hbmNlLnNvdXJjZXNdLFxuICAgICAgc3BhbnM6IFsuLi50aGlzLnNwYW5zXSxcbiAgICAgIHN5bWJvbHM6IFsuLi50aGlzLmluZGV4LnByb3ZlbmFuY2Uuc3ltYm9sc10sXG4gICAgICB2ZXJzaW9uOiAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgb25lIG1hcHBlZCBzcGFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59IGFubm90YXRpb24gLSBTcGFuIGFubm90YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgI2FwcGVuZCh0ZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoXCJcXHJcIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0ZWQgb3V0cHV0IG11c3QgdXNlIGRldGVybWluaXN0aWMgTEYgbGluZSBlbmRpbmdzLlwiKVxuXG4gICAgY29uc3Qgc3RhcnQgPSB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fVxuXG4gICAgdGhpcy5wYXJ0cy5wdXNoKHRleHQpXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRleHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB0aGlzLm9mZnNldCsrXG4gICAgICBpZiAodGV4dFtpbmRleF0gPT0gXCJcXG5cIikge1xuICAgICAgICB0aGlzLmxpbmUrK1xuICAgICAgICB0aGlzLmNvbHVtbiA9IDFcbiAgICAgIH0gZWxzZSB0aGlzLmNvbHVtbisrXG4gICAgfVxuICAgIGNvbnN0IGNvbXBhY3QgPSAvKiogQHR5cGUge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59ICovIChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhbm5vdGF0aW9uKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpXG4gICAgKVxuXG4gICAgdGhpcy5zcGFucy5wdXNoKHtcbiAgICAgIC4uLmNvbXBhY3QsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgZW5kOiB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fSxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIHN0YXJ0XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0IHJvbGUgb3JpZ2luIHVzaW5nIGNhbm9uaWNhbCBzb3VyY2UgaWRlbnRpdGllcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByb2xlIHJhbmdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBmYWxsYmFjayAtIE93bmluZyBvcmlnaW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gUm9sZSBvcmlnaW4uXG4gICAqL1xuICAjc291cmNlT3JpZ2luKGxvY2F0aW9uLCBmYWxsYmFjaykge1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBmYWxsYmFja1NvdXJjZUlkXG5cbiAgICBpZiAoZmFsbGJhY2sua2luZCA9PSBcInNvdXJjZVwiICYmIGZhbGxiYWNrLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKSBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2suc291cmNlSWRcbiAgICBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwiZGVyaXZlZFwiKSB7XG4gICAgICBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2sub3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfSBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICAgIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5yZWxhdGVkT3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGZhbGxiYWNrU291cmNlSWQpID8/XG4gICAgICB0aGlzLmluZGV4LnByb3ZlbmFuY2Uuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSlcblxuICAgIHJldHVybiBzb3VyY2UgPyB7a2luZDogXCJzb3VyY2VcIiwgbG9jYXRpb24sIHNvdXJjZUlkOiBzb3VyY2UuaWR9IDogZmFsbGJhY2tcbiAgfVxufVxuXG4vKipcbiAqIEV4cGFuZHMgZXZlcnkgY2xvc2VkIHByb3ZlbmFuY2UgcmFuZ2UgaW4gc2VtYW50aWMgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IFJlbGF0ZWQgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiByZWxhdGVkT3JpZ2luc0ZvcihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBbe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9XVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1xuXG4gIHJldHVybiBvcmlnaW4ucmVsYXRlZE9yaWdpbnNcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXRlcm1pbmlzdGljIGlkZW50aXR5IGZvciBvbmUgY29udGV4dHVhbCByZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gb3JpZ2luIC0gUmVsYXRlZCBvcmlnaW4uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5LZXkob3JpZ2luKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgb3JpZ2luLnNvdXJjZUlkLFxuICAgIG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSxcbiAgICBvcmlnaW4ubG9jYXRpb24uc3RhcnQub2Zmc2V0LFxuICAgIG9yaWdpbi5sb2NhdGlvbi5lbmQub2Zmc2V0LFxuICAgIG9yaWdpbi5ub2RlSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4uc3ltYm9sSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4ucm9sZSA/PyBudWxsXG4gIF0pXG59XG4iXX0=
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** A clear parser, semantic, or backend capability diagnostic. */
|
|
2
|
+
export declare class SemantifoldDiagnostic extends Error {
|
|
3
|
+
code: string;
|
|
4
|
+
detail: string;
|
|
5
|
+
generatedLocation: import("./semantic/types.js").SourceLocation | undefined;
|
|
6
|
+
language: import("./semantic/types.js").SemanticLanguage;
|
|
7
|
+
location: import("./semantic/types.js").SourceLocation | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a diagnostic.
|
|
10
|
+
* @param {object} options - Diagnostic fields.
|
|
11
|
+
* @param {string} options.code - Stable diagnostic code.
|
|
12
|
+
* @param {string} options.message - Human-readable message.
|
|
13
|
+
* @param {import("./semantic/types.js").SemanticLanguage} options.language - Related language.
|
|
14
|
+
* @param {import("./semantic/types.js").SourceLocation | undefined} [options.location] - Related location.
|
|
15
|
+
* @param {import("./semantic/types.js").SourceLocation | undefined} [options.generatedLocation] - Pre-remapping generated location.
|
|
16
|
+
* @param {Error | undefined} [options.cause] - Preserved parser error.
|
|
17
|
+
*/
|
|
18
|
+
constructor({ cause, code, generatedLocation, language, location, message }: {
|
|
19
|
+
code: string;
|
|
20
|
+
message: string;
|
|
21
|
+
language: import("./semantic/types.js").SemanticLanguage;
|
|
22
|
+
location?: import("./semantic/types.js").SourceLocation | undefined;
|
|
23
|
+
generatedLocation?: import("./semantic/types.js").SourceLocation | undefined;
|
|
24
|
+
cause?: Error | undefined;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Throws a normalized parser diagnostic while preserving the parser error.
|
|
29
|
+
* @param {import("./semantic/types.js").SemanticLanguage} language - Frontend language.
|
|
30
|
+
* @param {unknown} error - Opaque parser error, narrowed immediately.
|
|
31
|
+
* @returns {never} Always throws.
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseFailure(language: import("./semantic/types.js").SemanticLanguage, error: unknown): never;
|
|
34
|
+
/**
|
|
35
|
+
* Throws an unsupported-syntax diagnostic.
|
|
36
|
+
* @param {import("./semantic/types.js").SemanticLanguage} language - Frontend language.
|
|
37
|
+
* @param {string} syntax - Parser syntax kind.
|
|
38
|
+
* @param {import("./semantic/types.js").SourceLocation | undefined} location - Source location.
|
|
39
|
+
* @returns {never} Always throws.
|
|
40
|
+
*/
|
|
41
|
+
export declare function unsupportedSyntax(language: import("./semantic/types.js").SemanticLanguage, syntax: string, location: import("./semantic/types.js").SourceLocation | undefined): never;
|
|
42
|
+
/**
|
|
43
|
+
* Throws a missing-type diagnostic.
|
|
44
|
+
* @param {import("./semantic/types.js").SemanticLanguage} language - Frontend language.
|
|
45
|
+
* @param {string} subject - Untyped subject.
|
|
46
|
+
* @param {import("./semantic/types.js").SourceLocation | undefined} location - Source location.
|
|
47
|
+
* @returns {never} Always throws.
|
|
48
|
+
*/
|
|
49
|
+
export declare function missingType(language: import("./semantic/types.js").SemanticLanguage, subject: string, location: import("./semantic/types.js").SourceLocation | undefined): never;
|
|
50
|
+
/**
|
|
51
|
+
* Throws a language-neutral semantic diagnostic discovered after adaptation.
|
|
52
|
+
* @param {import("./semantic/types.js").SemanticLanguage} language - Source language.
|
|
53
|
+
* @param {string} code - Stable semantic diagnostic code.
|
|
54
|
+
* @param {string} detail - Human-readable semantic failure.
|
|
55
|
+
* @param {import("./semantic/types.js").SourceLocation | undefined} location - Source location.
|
|
56
|
+
* @returns {never} Always throws.
|
|
57
|
+
*/
|
|
58
|
+
export declare function semanticFailure(language: import("./semantic/types.js").SemanticLanguage, code: string, detail: string, location: import("./semantic/types.js").SourceLocation | undefined): never;
|
|
59
|
+
/**
|
|
60
|
+
* Throws an unsupported backend-capability diagnostic.
|
|
61
|
+
* @param {import("./semantic/types.js").SemanticLanguage} language - Backend language.
|
|
62
|
+
* @param {string} capability - Unsupported semantic capability.
|
|
63
|
+
* @param {import("./semantic/types.js").SourceLocation | undefined} location - Semantic source location.
|
|
64
|
+
* @returns {never} Always throws.
|
|
65
|
+
*/
|
|
66
|
+
export declare function unsupportedCapability(language: import("./semantic/types.js").SemanticLanguage, capability: string, location: import("./semantic/types.js").SourceLocation | undefined): never;
|
|
67
|
+
//# sourceMappingURL=diagnostic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../src/diagnostic.js"],"names":[],"mappings":"AAEA,kEAAkE;AAClE,qBAAa,qBAAsB,SAAQ,KAAK;IAgBvC,IAAI;IACJ,MAAM;IACN,iBAAiB;IACjB,QAAQ;IACR,QAAQ;IAnBf;;;;;;;;;OASG;IACH,YAAY,EAAC,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAC,EAPtE;QAAwB,IAAI,EAApB,MAAM,CACd;QAAwB,OAAO,EAAvB,MAAM,CACd;QAAgE,QAAQ,EAAhE,OAAO,qBAAqB,EAAE,gBAAgB,CACtD;QAA2E,QAAQ,AAAnF,CACA,EADQ,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAAS,CAChE;QAA2E,iBAAiB,AAA5F,CACA,EADQ,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAAS,CAChE;QAAoC,KAAK,AAAzC,CACF,EADU,KAAK,GAAG,SAAS,CAC3B;KACwE,EAUxE;CACF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAJ1B,OAAO,qBAAqB,EAAE,gBAIJ,EAAE,KAAK,EAHjC,OAGiC,GAF/B,KAAK,CAWjB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAL/B,OAAO,qBAAqB,EAAE,gBAKC,EAAE,MAAM,EAJvC,MAIuC,EAAE,QAAQ,EAHjD,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAGE,GAF/C,KAAK,CASjB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EALzB,OAAO,qBAAqB,EAAE,gBAKL,EAAE,OAAO,EAJlC,MAIkC,EAAE,QAAQ,EAH5C,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAGH,GAF1C,KAAK,CASjB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAN7B,OAAO,qBAAqB,EAAE,gBAMD,EAAE,IAAI,EALnC,MAKmC,EAAE,MAAM,EAJ3C,MAI2C,EAAE,QAAQ,EAHrD,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAGM,GAFnD,KAAK,CAIjB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EALnC,OAAO,qBAAqB,EAAE,gBAKK,EAAE,UAAU,EAJ/C,MAI+C,EAAE,QAAQ,EAHzD,OAAO,qBAAqB,EAAE,cAAc,GAAG,SAGU,GAFvD,KAAK,CASjB"}
|