semantifold 0.3.0 → 0.5.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/README.md +61 -15
- package/build/index.d.ts +52 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +60 -8
- package/build/src/artifact-path.d.ts +23 -1
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +45 -3
- package/build/src/artifacts.d.ts.map +1 -1
- package/build/src/artifacts.js +66 -1
- package/build/src/backends/android.d.ts +49 -0
- package/build/src/backends/android.d.ts.map +1 -0
- package/build/src/backends/android.js +1274 -0
- package/build/src/backends/c-validation.d.ts.map +1 -1
- package/build/src/backends/c-validation.js +7 -3
- package/build/src/backends/cpp-validation.d.ts.map +1 -1
- package/build/src/backends/cpp-validation.js +7 -3
- package/build/src/backends/csharp.js +7 -1
- package/build/src/backends/dart-runtime.d.ts +2 -0
- package/build/src/backends/dart-runtime.d.ts.map +1 -0
- package/build/src/backends/dart-runtime.js +41 -0
- package/build/src/backends/dart.d.ts +20 -0
- package/build/src/backends/dart.d.ts.map +1 -0
- package/build/src/backends/dart.js +321 -0
- package/build/src/backends/effects.d.ts +60 -0
- package/build/src/backends/effects.d.ts.map +1 -0
- package/build/src/backends/effects.js +746 -0
- package/build/src/backends/go.js +18 -4
- package/build/src/backends/identifiers.d.ts +36 -4
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +160 -10
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -4
- package/build/src/backends/ios.d.ts +68 -0
- package/build/src/backends/ios.d.ts.map +1 -0
- package/build/src/backends/ios.js +1503 -0
- package/build/src/backends/java.d.ts.map +1 -1
- package/build/src/backends/java.js +429 -36
- package/build/src/backends/javascript.d.ts +6 -0
- package/build/src/backends/javascript.d.ts.map +1 -1
- package/build/src/backends/javascript.js +380 -24
- package/build/src/backends/kotlin-runtime.d.ts +3 -0
- package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
- package/build/src/backends/kotlin-runtime.js +29 -0
- package/build/src/backends/kotlin.d.ts +33 -0
- package/build/src/backends/kotlin.d.ts.map +1 -0
- package/build/src/backends/kotlin.js +138 -0
- package/build/src/backends/native-validation.d.ts +2 -2
- package/build/src/backends/native-validation.d.ts.map +1 -1
- package/build/src/backends/native-validation.js +2 -2
- package/build/src/backends/ordered-expressions.d.ts.map +1 -1
- package/build/src/backends/ordered-expressions.js +39 -7
- package/build/src/backends/php-stdlib-support.d.ts +19 -0
- package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
- package/build/src/backends/php-stdlib-support.js +227 -0
- package/build/src/backends/php.d.ts.map +1 -1
- package/build/src/backends/php.js +448 -33
- package/build/src/backends/program.d.ts +83 -0
- package/build/src/backends/program.d.ts.map +1 -0
- package/build/src/backends/program.js +1309 -0
- package/build/src/backends/python.js +7 -1
- package/build/src/backends/ruby.d.ts.map +1 -1
- package/build/src/backends/ruby.js +310 -24
- package/build/src/backends/rust-runtime.d.ts +7 -0
- package/build/src/backends/rust-runtime.d.ts.map +1 -0
- package/build/src/backends/rust-runtime.js +32 -0
- package/build/src/backends/rust-validation.d.ts +9 -0
- package/build/src/backends/rust-validation.d.ts.map +1 -0
- package/build/src/backends/rust-validation.js +78 -0
- package/build/src/backends/rust.d.ts +24 -0
- package/build/src/backends/rust.d.ts.map +1 -0
- package/build/src/backends/rust.js +344 -0
- package/build/src/backends/scalars.d.ts +14 -6
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +167 -17
- package/build/src/backends/shared.d.ts +23 -4
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +2174 -62
- package/build/src/backends/stdlib-support.d.ts +14 -0
- package/build/src/backends/stdlib-support.d.ts.map +1 -0
- package/build/src/backends/stdlib-support.js +237 -0
- package/build/src/backends/swift-runtime.d.ts +3 -0
- package/build/src/backends/swift-runtime.d.ts.map +1 -0
- package/build/src/backends/swift-runtime.js +14 -0
- package/build/src/backends/swift.d.ts +8 -0
- package/build/src/backends/swift.d.ts.map +1 -0
- package/build/src/backends/swift.js +127 -0
- package/build/src/backends/typescript.d.ts.map +1 -1
- package/build/src/backends/typescript.js +344 -24
- package/build/src/backends/wasm.d.ts +43 -0
- package/build/src/backends/wasm.d.ts.map +1 -0
- package/build/src/backends/wasm.js +2164 -0
- package/build/src/backends/writer.d.ts +255 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +491 -3
- package/build/src/diagnostic.d.ts +4 -3
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +5 -3
- package/build/src/frontends/c.d.ts.map +1 -1
- package/build/src/frontends/c.js +5 -3
- package/build/src/frontends/cpp.d.ts.map +1 -1
- package/build/src/frontends/cpp.js +5 -3
- package/build/src/frontends/csharp.d.ts.map +1 -1
- package/build/src/frontends/csharp.js +7 -3
- package/build/src/frontends/dart.d.ts +10 -0
- package/build/src/frontends/dart.d.ts.map +1 -0
- package/build/src/frontends/dart.js +913 -0
- package/build/src/frontends/index.d.ts +3 -1
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +15 -5
- package/build/src/frontends/java.d.ts +110 -1
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +1725 -70
- package/build/src/frontends/javascript-typescript.d.ts +69 -1
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +1825 -93
- package/build/src/frontends/kotlin.d.ts +10 -0
- package/build/src/frontends/kotlin.d.ts.map +1 -0
- package/build/src/frontends/kotlin.js +685 -0
- package/build/src/frontends/php.d.ts +118 -1
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +1583 -76
- package/build/src/frontends/program.d.ts +74 -0
- package/build/src/frontends/program.d.ts.map +1 -0
- package/build/src/frontends/program.js +989 -0
- package/build/src/frontends/ruby.d.ts +68 -1
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +1446 -101
- package/build/src/frontends/rust-parser.d.ts +11 -0
- package/build/src/frontends/rust-parser.d.ts.map +1 -0
- package/build/src/frontends/rust-parser.js +15 -0
- package/build/src/frontends/rust.d.ts +14 -0
- package/build/src/frontends/rust.d.ts.map +1 -0
- package/build/src/frontends/rust.js +715 -0
- package/build/src/frontends/scalars.d.ts +10 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +28 -2
- package/build/src/frontends/swift.d.ts +10 -0
- package/build/src/frontends/swift.d.ts.map +1 -0
- package/build/src/frontends/swift.js +860 -0
- package/build/src/frontends/types.d.ts +186 -0
- package/build/src/frontends/types.d.ts.map +1 -0
- package/build/src/frontends/types.js +634 -0
- package/build/src/language-registry.d.ts +46 -4
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +177 -13
- package/build/src/mapping.d.ts +2 -2
- package/build/src/mapping.d.ts.map +1 -1
- package/build/src/mapping.js +31 -10
- package/build/src/semantic/capabilities.d.ts +66 -0
- package/build/src/semantic/capabilities.d.ts.map +1 -0
- package/build/src/semantic/capabilities.js +649 -0
- package/build/src/semantic/effects.d.ts +26 -0
- package/build/src/semantic/effects.d.ts.map +1 -0
- package/build/src/semantic/effects.js +764 -0
- package/build/src/semantic/generics.d.ts +23 -0
- package/build/src/semantic/generics.d.ts.map +1 -0
- package/build/src/semantic/generics.js +61 -0
- package/build/src/semantic/lifetime.d.ts +37 -0
- package/build/src/semantic/lifetime.d.ts.map +1 -0
- package/build/src/semantic/lifetime.js +527 -0
- package/build/src/semantic/provenance.d.ts +9 -2
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +462 -20
- package/build/src/semantic/scalars.d.ts +11 -0
- package/build/src/semantic/scalars.d.ts.map +1 -1
- package/build/src/semantic/scalars.js +16 -1
- package/build/src/semantic/stdlib.d.ts +254 -0
- package/build/src/semantic/stdlib.d.ts.map +1 -0
- package/build/src/semantic/stdlib.js +880 -0
- package/build/src/semantic/types.d.ts +3108 -178
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +730 -15
- package/build/src/semantic/validate.d.ts +85 -5
- package/build/src/semantic/validate.d.ts.map +1 -1
- package/build/src/semantic/validate.js +2576 -98
- package/build/src/stdlib-facades.d.ts +304 -0
- package/build/src/stdlib-facades.d.ts.map +1 -0
- package/build/src/stdlib-facades.js +1167 -0
- package/build/src/stdlib-negotiation.d.ts +69 -0
- package/build/src/stdlib-negotiation.d.ts.map +1 -0
- package/build/src/stdlib-negotiation.js +403 -0
- package/build/src/stdlib-providers.d.ts +72 -0
- package/build/src/stdlib-providers.d.ts.map +1 -0
- package/build/src/stdlib-providers.js +339 -0
- package/build/src/toolchains.d.ts +55 -1
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +15 -4
- package/docs/android.md +79 -0
- package/docs/architecture.md +47 -13
- package/docs/dart.md +60 -0
- package/docs/goals.md +3 -3
- package/docs/ios.md +121 -0
- package/docs/kotlin.md +42 -0
- package/docs/language-support.md +238 -26
- package/docs/multi-file-modules.md +52 -0
- package/docs/parser-qualification.md +121 -8
- package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
- package/docs/rust.md +88 -0
- package/docs/source-maps.md +17 -7
- package/docs/specification.md +5 -0
- package/docs/standard-library-portability.md +39 -8
- package/docs/swift.md +44 -0
- package/docs/testing.md +381 -4
- package/docs/webassembly.md +52 -0
- package/index.js +66 -8
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
- package/package.json +5 -2
- package/src/artifact-path.js +47 -2
- package/src/artifacts.js +67 -0
- package/src/backends/android.js +1370 -0
- package/src/backends/c-validation.js +6 -1
- package/src/backends/cpp-validation.js +6 -1
- package/src/backends/csharp.js +3 -0
- package/src/backends/dart-runtime.js +41 -0
- package/src/backends/dart.js +326 -0
- package/src/backends/effects.js +705 -0
- package/src/backends/go.js +14 -2
- package/src/backends/identifiers.js +166 -9
- package/src/backends/index.js +27 -2
- package/src/backends/ios.js +1612 -0
- package/src/backends/java.js +454 -36
- package/src/backends/javascript.js +389 -23
- package/src/backends/kotlin-runtime.js +29 -0
- package/src/backends/kotlin.js +144 -0
- package/src/backends/native-validation.js +1 -1
- package/src/backends/ordered-expressions.js +40 -6
- package/src/backends/php-stdlib-support.js +239 -0
- package/src/backends/php.js +469 -32
- package/src/backends/program.js +1408 -0
- package/src/backends/python.js +3 -0
- package/src/backends/ruby.js +326 -23
- package/src/backends/rust-runtime.js +34 -0
- package/src/backends/rust-validation.js +75 -0
- package/src/backends/rust.js +335 -0
- package/src/backends/scalars.js +141 -16
- package/src/backends/shared.js +2314 -115
- package/src/backends/stdlib-support.js +234 -0
- package/src/backends/swift-runtime.js +14 -0
- package/src/backends/swift.js +132 -0
- package/src/backends/typescript.js +349 -23
- package/src/backends/wasm.js +2208 -0
- package/src/backends/writer.js +545 -2
- package/src/diagnostic.js +4 -2
- package/src/frontends/c.js +4 -2
- package/src/frontends/cpp.js +4 -2
- package/src/frontends/csharp.js +4 -2
- package/src/frontends/dart.js +963 -0
- package/src/frontends/index.js +14 -4
- package/src/frontends/java.js +1977 -69
- package/src/frontends/javascript-typescript.js +2046 -102
- package/src/frontends/kotlin.js +713 -0
- package/src/frontends/php.js +1725 -79
- package/src/frontends/program.js +1062 -0
- package/src/frontends/ruby.js +1624 -98
- package/src/frontends/rust-parser.js +18 -0
- package/src/frontends/rust.js +714 -0
- package/src/frontends/scalars.js +31 -1
- package/src/frontends/swift.js +893 -0
- package/src/frontends/types.js +750 -0
- package/src/language-registry.js +182 -12
- package/src/mapping.js +33 -9
- package/src/semantic/capabilities.js +671 -0
- package/src/semantic/effects.js +737 -0
- package/src/semantic/generics.js +58 -0
- package/src/semantic/lifetime.js +517 -0
- package/src/semantic/provenance.js +412 -19
- package/src/semantic/scalars.js +17 -0
- package/src/semantic/stdlib.js +921 -0
- package/src/semantic/types.js +810 -14
- package/src/semantic/validate.js +2934 -209
- package/src/stdlib-facades.js +1211 -0
- package/src/stdlib-negotiation.js +446 -0
- package/src/stdlib-providers.js +377 -0
- package/src/toolchains.js +16 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
import { emitExpression } from "./shared.js";
|
|
3
|
-
import {
|
|
2
|
+
import { emitExpression, emitType } from "./shared.js";
|
|
3
|
+
import { emitEffectPrefixes, emitEffectSupport } from "./effects.js";
|
|
4
4
|
/**
|
|
5
5
|
* Emits an independently executable Ruby program through the source-aware writer.
|
|
6
6
|
* @param {import("../semantic/types.js").SemanticModule} module - Semantic module.
|
|
@@ -8,29 +8,110 @@ import { emitScalarType } from "./scalars.js";
|
|
|
8
8
|
* @returns {void}
|
|
9
9
|
*/
|
|
10
10
|
export function generateRuby(module, writer) {
|
|
11
|
+
const records = module.records ?? [];
|
|
12
|
+
const classes = module.classes ?? [];
|
|
13
|
+
const errors = module.errors ?? [];
|
|
14
|
+
if (writer.program) {
|
|
15
|
+
const programModule = /** @type {import("../semantic/types.js").SemanticProgramModule} */ ( /** @type {unknown} */(module));
|
|
16
|
+
for (const moduleId of [...new Set(programModule.imports.map((item) => item.moduleId))]) {
|
|
17
|
+
const relative = writer.relativeModuleSpecifier(moduleId).replace(/\.rb$/u, "").replace(/^\.\//u, "");
|
|
18
|
+
const imported = /** @type {import("../semantic/types.js").SemanticImport} */ (programModule.imports.find((item) => item.moduleId == moduleId));
|
|
19
|
+
const importPath = `/imports/${programModule.imports.indexOf(imported)}`;
|
|
20
|
+
writer.synthetic("require_relative ", "Ruby require-relative edge", [imported], [importPath]);
|
|
21
|
+
writer.mapped(JSON.stringify(relative), { mappingKind: "anchor", node: imported, path: importPath, role: "path" });
|
|
22
|
+
writer.synthetic("\n", "Ruby require-relative terminator", [imported], [importPath]);
|
|
23
|
+
}
|
|
24
|
+
if (programModule.imports.length > 0)
|
|
25
|
+
writer.synthetic("\n", "Ruby require/module separator", [module]);
|
|
26
|
+
if (writer.stdlibProviderEntries) {
|
|
27
|
+
const relative = writer.stdlibProviderSpecifier().replace(/\.rb$/u, "").replace(/^\.\//u, "");
|
|
28
|
+
writer.synthetic("require_relative ", "Ruby stdlib provider require-relative edge", [module]);
|
|
29
|
+
writer.synthetic(JSON.stringify(relative), "Ruby stdlib provider require-relative path", [module]);
|
|
30
|
+
writer.synthetic("\n", "Ruby stdlib provider require-relative terminator", [module]);
|
|
31
|
+
writer.synthetic("\n", "Ruby stdlib provider require separator", [module]);
|
|
32
|
+
}
|
|
33
|
+
writer.synthetic(`module ${writer.programModuleName(programModule.id)}\n`, "Ruby semantic module wrapper", [module]);
|
|
34
|
+
if (module.functions.length > 0)
|
|
35
|
+
writer.synthetic("module_function\n\n", "Ruby module-function profile", [module]);
|
|
36
|
+
}
|
|
37
|
+
emitEffectSupport(writer, module, "ruby");
|
|
38
|
+
errors.forEach((error, index) => {
|
|
39
|
+
const path = `/errors/${index}`;
|
|
40
|
+
if (index > 0)
|
|
41
|
+
writer.synthetic("\n\n", "error declaration separator", [error], [path]);
|
|
42
|
+
writer.mapped("class", { mappingKind: "anchor", node: error, path });
|
|
43
|
+
writer.synthetic(" ", "error declaration spacing", [error], [path]);
|
|
44
|
+
writer.mapped(error.name, { mappingKind: "exact", node: error, path, role: "name" });
|
|
45
|
+
writer.synthetic(" < StandardError\nend", "Ruby unchecked error scaffolding", [error], [path]);
|
|
46
|
+
});
|
|
47
|
+
if (errors.length > 0)
|
|
48
|
+
writer.synthetic("\n\n", "error/declaration separator", [module]);
|
|
49
|
+
records.forEach((record, recordIndex) => {
|
|
50
|
+
const recordPath = `/records/${recordIndex}`;
|
|
51
|
+
if (recordIndex > 0)
|
|
52
|
+
writer.synthetic("\n\n", "record declaration separator", [record], [recordPath]);
|
|
53
|
+
emitTemplateComments(writer, record.typeParameters ?? [], `${recordPath}/typeParameters`);
|
|
54
|
+
writer.mapped("class", { mappingKind: "anchor", node: record, path: recordPath });
|
|
55
|
+
writer.synthetic(" ", "record declaration spacing", [record], [recordPath]);
|
|
56
|
+
writer.mapped(record.name, { mappingKind: "exact", node: record, path: recordPath, role: "name" });
|
|
57
|
+
writer.synthetic("\n", "line break", [record], [recordPath]);
|
|
58
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
59
|
+
const fieldPath = `${recordPath}/fields/${fieldIndex}`;
|
|
60
|
+
writer.synthetic(" # @type [", "Ruby record field type scaffolding", [field], [fieldPath]);
|
|
61
|
+
emitType(writer, field.type, `${fieldPath}/type`, "ruby");
|
|
62
|
+
writer.synthetic("]\n attr_reader :", "Ruby record reader scaffolding", [field], [fieldPath]);
|
|
63
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
64
|
+
writer.synthetic("\n", "line break", [field], [fieldPath]);
|
|
65
|
+
});
|
|
66
|
+
writer.synthetic("\n", "record constructor separator", [record], [recordPath]);
|
|
67
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
68
|
+
const fieldPath = `${recordPath}/fields/${fieldIndex}`;
|
|
69
|
+
writer.synthetic(" # @param ", "Ruby record constructor type scaffolding", [field], [fieldPath]);
|
|
70
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
71
|
+
writer.synthetic(" [", "Ruby record constructor type scaffolding", [field], [fieldPath]);
|
|
72
|
+
emitType(writer, field.type, `${fieldPath}/type`, "ruby");
|
|
73
|
+
writer.synthetic("]\n", "Ruby record constructor type scaffolding", [field], [fieldPath]);
|
|
74
|
+
});
|
|
75
|
+
writer.synthetic(" def initialize(", "Ruby record constructor scaffolding", [record], [recordPath]);
|
|
76
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
77
|
+
if (fieldIndex)
|
|
78
|
+
writer.synthetic(", ", "record field separator", [record], [recordPath]);
|
|
79
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: `${recordPath}/fields/${fieldIndex}`, role: "name" });
|
|
80
|
+
});
|
|
81
|
+
writer.synthetic(")\n", "Ruby record constructor scaffolding", [record], [recordPath]);
|
|
82
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
83
|
+
const fieldPath = `${recordPath}/fields/${fieldIndex}`;
|
|
84
|
+
writer.synthetic(" @", "Ruby record storage scaffolding", [field], [fieldPath]);
|
|
85
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
86
|
+
writer.synthetic(" = ", "Ruby record storage scaffolding", [field], [fieldPath]);
|
|
87
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
88
|
+
writer.synthetic("\n", "line break", [field], [fieldPath]);
|
|
89
|
+
});
|
|
90
|
+
writer.synthetic(" ::Kernel.instance_method(:freeze).bind_call(self)\n end\nend", "Ruby record immutability scaffolding", [record], [recordPath]);
|
|
91
|
+
});
|
|
92
|
+
if (records.length > 0)
|
|
93
|
+
writer.synthetic("\n\n", "record/function separator", [module]);
|
|
94
|
+
classes.forEach((declaration, classIndex) => {
|
|
95
|
+
if (classIndex > 0)
|
|
96
|
+
writer.synthetic("\n\n", "reference class separator", [declaration], [`/classes/${classIndex}`]);
|
|
97
|
+
emitReferenceClass(writer, declaration, classIndex);
|
|
98
|
+
});
|
|
99
|
+
if (classes.length > 0)
|
|
100
|
+
writer.synthetic("\n\n", "reference class/function separator", [module]);
|
|
11
101
|
module.functions.forEach((declaration, functionIndex) => {
|
|
12
102
|
if (functionIndex > 0)
|
|
13
103
|
writer.synthetic("\n\n", "declaration separator", [declaration]);
|
|
104
|
+
emitTemplateComments(writer, declaration.typeParameters ?? [], `/functions/${functionIndex}/typeParameters`);
|
|
14
105
|
for (const [parameterIndex, parameter] of declaration.parameters.entries()) {
|
|
15
106
|
const parameterPath = `/functions/${functionIndex}/parameters/${parameterIndex}`;
|
|
16
107
|
writer.synthetic("# @param ", "Ruby type scaffolding", [parameter], [parameterPath]);
|
|
17
108
|
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: parameterPath, role: "name" });
|
|
18
109
|
writer.synthetic(" [", "Ruby type scaffolding", [parameter], [parameterPath]);
|
|
19
|
-
writer
|
|
20
|
-
mappingKind: "exact",
|
|
21
|
-
node: parameter.type,
|
|
22
|
-
path: `${parameterPath}/type`,
|
|
23
|
-
role: "type"
|
|
24
|
-
});
|
|
110
|
+
emitType(writer, parameter.type, `${parameterPath}/type`, "ruby");
|
|
25
111
|
writer.synthetic("]\n", "Ruby type scaffolding", [parameter], [parameterPath]);
|
|
26
112
|
}
|
|
27
113
|
writer.synthetic("# @return [", "Ruby type scaffolding", [declaration]);
|
|
28
|
-
writer
|
|
29
|
-
mappingKind: "exact",
|
|
30
|
-
node: declaration.returnType,
|
|
31
|
-
path: `/functions/${functionIndex}/returnType`,
|
|
32
|
-
role: "type"
|
|
33
|
-
});
|
|
114
|
+
emitType(writer, declaration.returnType, `/functions/${functionIndex}/returnType`, "ruby");
|
|
34
115
|
writer.synthetic("]\n", "Ruby type scaffolding", [declaration]);
|
|
35
116
|
writer.mapped("def", { mappingKind: "anchor", node: declaration });
|
|
36
117
|
writer.synthetic(" ", "function spacing", [declaration]);
|
|
@@ -51,8 +132,121 @@ export function generateRuby(module, writer) {
|
|
|
51
132
|
emitBlock(writer, declaration.body, " ", `/functions/${functionIndex}/body`);
|
|
52
133
|
writer.mapped("end", { mappingKind: "anchor", node: declaration });
|
|
53
134
|
});
|
|
54
|
-
writer.
|
|
55
|
-
|
|
135
|
+
if (writer.program) {
|
|
136
|
+
const privateNominals = [...errors, ...records].filter((declaration) => !writer.isExported(declaration.id));
|
|
137
|
+
const privateFunctions = module.functions.filter((declaration) => !writer.isExported(declaration.id));
|
|
138
|
+
for (const declaration of privateNominals) {
|
|
139
|
+
writer.synthetic("\nprivate_constant :", "Ruby private semantic nominal declaration", [declaration]);
|
|
140
|
+
writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, role: "name" });
|
|
141
|
+
}
|
|
142
|
+
for (const declaration of privateFunctions) {
|
|
143
|
+
writer.synthetic("\nprivate_class_method :", "Ruby private semantic function", [declaration]);
|
|
144
|
+
writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, role: "name" });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (!writer.program || writer.isProgramEntry()) {
|
|
148
|
+
writer.synthetic("\n\n", "entry-point separator", [module.entryPoint]);
|
|
149
|
+
emitBlock(writer, module.entryPoint.body, "", "/entryPoint/body");
|
|
150
|
+
}
|
|
151
|
+
if (writer.program)
|
|
152
|
+
writer.synthetic("\nend\n", "Ruby semantic module close", [module]);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Emits one native Ruby reference class.
|
|
156
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
157
|
+
* @param {import("../semantic/types.js").ClassDeclaration} declaration - Reference class.
|
|
158
|
+
* @param {number} classIndex - Module class index.
|
|
159
|
+
* @returns {void}
|
|
160
|
+
*/
|
|
161
|
+
function emitReferenceClass(writer, declaration, classIndex) {
|
|
162
|
+
const path = `/classes/${classIndex}`;
|
|
163
|
+
writer.mapped("class", { mappingKind: "anchor", node: declaration, path });
|
|
164
|
+
writer.synthetic(" ", "reference class spacing", [declaration], [path]);
|
|
165
|
+
writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, path, role: "name" });
|
|
166
|
+
writer.synthetic("\n", "line break", [declaration], [path]);
|
|
167
|
+
declaration.fields.forEach((field, index) => {
|
|
168
|
+
const fieldPath = `${path}/fields/${index}`;
|
|
169
|
+
writer.synthetic(" # @semantifold-private ", "private field metadata", [field], [fieldPath]);
|
|
170
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
171
|
+
writer.synthetic(" [", "private field type metadata", [field], [fieldPath]);
|
|
172
|
+
emitType(writer, field.type, `${fieldPath}/type`, "ruby");
|
|
173
|
+
writer.synthetic("]\n", "line break", [field], [fieldPath]);
|
|
174
|
+
});
|
|
175
|
+
const constructor = declaration.constructor;
|
|
176
|
+
const constructorPath = `${path}/constructor`;
|
|
177
|
+
writer.synthetic("\n", "constructor spacing", [constructor], [constructorPath]);
|
|
178
|
+
emitRubyCallableComments(writer, constructor.parameters, undefined, `${constructorPath}/parameters`, undefined);
|
|
179
|
+
writer.synthetic(" ", "constructor indentation", [constructor], [constructorPath]);
|
|
180
|
+
writer.mapped("def initialize", { mappingKind: "exact", node: constructor, path: constructorPath, role: "constructor" });
|
|
181
|
+
emitRubyParameters(writer, constructor.parameters, `${constructorPath}/parameters`);
|
|
182
|
+
writer.synthetic("\n", "line break", [constructor], [constructorPath]);
|
|
183
|
+
emitBlock(writer, constructor.body, " ", `${constructorPath}/body`);
|
|
184
|
+
writer.synthetic(" end", "constructor close", [constructor], [constructorPath]);
|
|
185
|
+
declaration.methods.forEach((method, index) => {
|
|
186
|
+
const methodPath = `${path}/methods/${index}`;
|
|
187
|
+
writer.synthetic("\n\n", "method spacing", [method], [methodPath]);
|
|
188
|
+
emitRubyCallableComments(writer, method.parameters, method.returnType, `${methodPath}/parameters`, `${methodPath}/returnType`);
|
|
189
|
+
writer.synthetic(" def ", "method indentation", [method], [methodPath]);
|
|
190
|
+
writer.mapped(method.name, { mappingKind: "exact", node: method, path: methodPath, role: "name" });
|
|
191
|
+
emitRubyParameters(writer, method.parameters, `${methodPath}/parameters`);
|
|
192
|
+
writer.synthetic("\n", "line break", [method], [methodPath]);
|
|
193
|
+
emitBlock(writer, method.body, " ", `${methodPath}/body`);
|
|
194
|
+
writer.synthetic(" end", "method close", [method], [methodPath]);
|
|
195
|
+
});
|
|
196
|
+
writer.synthetic("\n", "line break", [declaration], [path]);
|
|
197
|
+
writer.mapped("end", { mappingKind: "anchor", node: declaration, path });
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Emits exact Ruby callable type comments.
|
|
201
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
202
|
+
* @param {import("../semantic/types.js").Parameter[]} parameters - Ordered parameters.
|
|
203
|
+
* @param {import("../semantic/types.js").SemanticFunctionReturnType | undefined} returnType - Optional return type.
|
|
204
|
+
* @param {string} parameterPath - Parameter collection path.
|
|
205
|
+
* @param {string | undefined} returnPath - Return type path.
|
|
206
|
+
* @returns {void}
|
|
207
|
+
*/
|
|
208
|
+
function emitRubyCallableComments(writer, parameters, returnType, parameterPath, returnPath) {
|
|
209
|
+
for (const [index, parameter] of parameters.entries()) {
|
|
210
|
+
writer.synthetic(" # @param ", "parameter type metadata", [parameter], [`${parameterPath}/${index}`]);
|
|
211
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: `${parameterPath}/${index}`, role: "name" });
|
|
212
|
+
writer.synthetic(" [", "parameter type metadata", [parameter], [`${parameterPath}/${index}`]);
|
|
213
|
+
emitType(writer, parameter.type, `${parameterPath}/${index}/type`, "ruby");
|
|
214
|
+
writer.synthetic("]\n", "line break", [parameter]);
|
|
215
|
+
}
|
|
216
|
+
if (returnType && returnPath) {
|
|
217
|
+
writer.synthetic(" # @return [", "return type metadata", []);
|
|
218
|
+
emitType(writer, returnType, returnPath, "ruby");
|
|
219
|
+
writer.synthetic("]\n", "line break", []);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Emits one Ruby parameter list.
|
|
224
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
225
|
+
* @param {import("../semantic/types.js").Parameter[]} parameters - Ordered parameters.
|
|
226
|
+
* @param {string} path - Parameter collection path.
|
|
227
|
+
* @returns {void}
|
|
228
|
+
*/
|
|
229
|
+
function emitRubyParameters(writer, parameters, path) {
|
|
230
|
+
writer.synthetic("(", "parameter list open", parameters);
|
|
231
|
+
parameters.forEach((parameter, index) => {
|
|
232
|
+
if (index)
|
|
233
|
+
writer.synthetic(", ", "parameter separator", parameters);
|
|
234
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: `${path}/${index}`, role: "name" });
|
|
235
|
+
});
|
|
236
|
+
writer.synthetic(")", "parameter list close", parameters);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Emits exact RDoc declaration parameters.
|
|
240
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
241
|
+
* @param {import("../semantic/types.js").TypeParameter[]} parameters - Ordered type parameters.
|
|
242
|
+
* @param {string} path - Type-parameter collection path.
|
|
243
|
+
*/
|
|
244
|
+
function emitTemplateComments(writer, parameters, path) {
|
|
245
|
+
parameters.forEach((parameter, index) => {
|
|
246
|
+
writer.synthetic("# @template ", "Ruby type parameter scaffolding", [parameter], [`${path}/${index}`]);
|
|
247
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: `${path}/${index}`, role: "name" });
|
|
248
|
+
writer.synthetic("\n", "line break", [parameter]);
|
|
249
|
+
});
|
|
56
250
|
}
|
|
57
251
|
/**
|
|
58
252
|
* Emits one ordered Ruby block body.
|
|
@@ -74,12 +268,109 @@ function emitBlock(writer, block, indent, path) {
|
|
|
74
268
|
* @returns {void}
|
|
75
269
|
*/
|
|
76
270
|
function emitStatement(writer, statement, indent, path) {
|
|
271
|
+
emitEffectPrefixes(writer, statement, indent, path, "ruby", (expression, expressionPath) => emitExpression(writer, expression, expressionPath, "ruby", identity));
|
|
77
272
|
if (statement.kind == "LocalDeclaration" || statement.kind == "AssignmentStatement")
|
|
78
273
|
return emitLocal(writer, statement, indent, path);
|
|
79
274
|
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
275
|
+
if (statement.kind == "PrivateFieldWriteStatement") {
|
|
276
|
+
const field = writer.privateFieldForId(statement.field);
|
|
277
|
+
writer.mapped(`@${field.name}`, { mappingKind: "exact", name: field.name, node: statement, path, role: "member" });
|
|
278
|
+
writer.synthetic(" = ", "private field assignment", [statement], [path]);
|
|
279
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "ruby", identity);
|
|
280
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (statement.kind == "BreakStatement" || statement.kind == "ContinueStatement") {
|
|
284
|
+
writer.mapped(statement.kind == "BreakStatement" ? "break" : "next", { mappingKind: "exact", node: statement, path });
|
|
285
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
if (statement.kind == "WhileStatement") {
|
|
289
|
+
writer.mapped("while", { mappingKind: "exact", node: statement, path });
|
|
290
|
+
writer.synthetic(" ", "condition-controlled loop spacing", [statement], [path]);
|
|
291
|
+
emitExpression(writer, statement.condition, `${path}/condition`, "ruby", identity);
|
|
292
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
293
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`);
|
|
294
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
295
|
+
writer.mapped("end", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
296
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
if (statement.kind == "ForEachStatement") {
|
|
300
|
+
emitExpression(writer, statement.list, `${path}/list`, "ruby", identity);
|
|
301
|
+
writer.mapped(".each", { mappingKind: "anchor", node: statement, path });
|
|
302
|
+
writer.synthetic(" ", "loop spacing", [statement], [path]);
|
|
303
|
+
writer.mapped("do", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
304
|
+
writer.synthetic(" |", "iteration binding delimiter", [statement.valueBinding], [`${path}/valueBinding`]);
|
|
305
|
+
writer.mapped(statement.valueBinding.name, {
|
|
306
|
+
mappingKind: "exact", node: statement.valueBinding, path: `${path}/valueBinding`, role: "name"
|
|
307
|
+
});
|
|
308
|
+
writer.synthetic("|\n", "iteration binding delimiter", [statement.valueBinding], [`${path}/valueBinding`]);
|
|
309
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`);
|
|
310
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
311
|
+
writer.mapped("end", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
312
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
if (statement.kind == "ForEachMapStatement") {
|
|
316
|
+
emitExpression(writer, statement.map, `${path}/map`, "ruby", identity);
|
|
317
|
+
writer.mapped(".each", { mappingKind: "anchor", node: statement, path });
|
|
318
|
+
writer.synthetic(" ", "map loop spacing", [statement], [path]);
|
|
319
|
+
writer.mapped("do", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
320
|
+
writer.synthetic(" |", "map iteration binding delimiter", [statement], [path]);
|
|
321
|
+
writer.mapped(statement.keyBinding.name, {
|
|
322
|
+
mappingKind: "exact", node: statement.keyBinding, path: `${path}/keyBinding`, role: "name"
|
|
323
|
+
});
|
|
324
|
+
writer.synthetic(", ", "map iteration binding separator", [statement], [path]);
|
|
325
|
+
writer.mapped(statement.valueBinding.name, {
|
|
326
|
+
mappingKind: "exact", node: statement.valueBinding, path: `${path}/valueBinding`, role: "name"
|
|
327
|
+
});
|
|
328
|
+
writer.synthetic("|\n", "map iteration binding delimiter", [statement], [path]);
|
|
329
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`);
|
|
330
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
331
|
+
writer.mapped("end", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
332
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (statement.kind == "RaiseStatement") {
|
|
336
|
+
const type = statement.error.error;
|
|
337
|
+
const error = writer.errorForId(type.declarationId);
|
|
338
|
+
writer.mapped("raise", { mappingKind: "anchor", node: statement, path });
|
|
339
|
+
writer.synthetic(" ", "raise spacing", [statement], [path]);
|
|
340
|
+
writer.mapped(writer.errorNameForId(type.declarationId), { mappingKind: "exact", name: error.name, node: statement.error, path: `${path}/error`, role: "type" });
|
|
341
|
+
writer.synthetic(", ", "error message separator", [statement.error], [`${path}/error`]);
|
|
342
|
+
emitExpression(writer, statement.error.message, `${path}/error/message`, "ruby", identity);
|
|
343
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
if (statement.kind == "TryStatement") {
|
|
347
|
+
const caught = writer.errorForId(statement.catchType.declarationId);
|
|
348
|
+
writer.mapped("begin", { mappingKind: "anchor", node: statement, path });
|
|
349
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
350
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`);
|
|
351
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
352
|
+
writer.mapped("rescue", { mappingKind: "anchor", node: statement, path, role: "catch" });
|
|
353
|
+
writer.synthetic(" ", "rescue spacing", [statement], [path]);
|
|
354
|
+
writer.mapped(writer.errorNameForId(statement.catchType.declarationId), { mappingKind: "exact", name: caught.name, node: statement.catchType, path: `${path}/catchType`, role: "type" });
|
|
355
|
+
writer.synthetic(" => ", "catch binding separator", [statement.catchBinding], [`${path}/catchBinding`]);
|
|
356
|
+
writer.mapped(statement.catchBinding.name, { mappingKind: "exact", node: statement.catchBinding, path: `${path}/catchBinding`, role: "name" });
|
|
357
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
358
|
+
emitBlock(writer, statement.catchBody, `${indent} `, `${path}/catchBody`);
|
|
359
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
360
|
+
writer.mapped("end", { mappingKind: "anchor", node: statement.catchBody, path: `${path}/catchBody` });
|
|
361
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
80
364
|
if (statement.kind == "ReturnStatement") {
|
|
81
365
|
writer.mapped("return", { mappingKind: "anchor", node: statement, path });
|
|
82
|
-
|
|
366
|
+
if (statement.expression) {
|
|
367
|
+
writer.synthetic(" ", "return spacing", [statement], [path]);
|
|
368
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "ruby", identity);
|
|
369
|
+
}
|
|
370
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
if (statement.kind == "ExpressionStatement") {
|
|
83
374
|
emitExpression(writer, statement.expression, `${path}/expression`, "ruby", identity);
|
|
84
375
|
writer.synthetic("\n", "line break", [statement], [path]);
|
|
85
376
|
return;
|
|
@@ -126,12 +417,7 @@ function emitLocal(writer, statement, indent, statementPath) {
|
|
|
126
417
|
return;
|
|
127
418
|
}
|
|
128
419
|
writer.synthetic("# @type [", "Ruby local type scaffolding", [statement], [statementPath]);
|
|
129
|
-
writer
|
|
130
|
-
mappingKind: "exact",
|
|
131
|
-
node: statement.type,
|
|
132
|
-
path: `${statementPath}/type`,
|
|
133
|
-
role: "type"
|
|
134
|
-
});
|
|
420
|
+
emitType(writer, statement.type, `${statementPath}/type`, "ruby");
|
|
135
421
|
writer.synthetic("]\n", "Ruby local type scaffolding", [statement], [statementPath]);
|
|
136
422
|
if (!statement.mutable) {
|
|
137
423
|
writer.synthetic(`${indent}# @semantifold-immutable\n`, "Ruby immutability scaffolding", [statement], [statementPath]);
|
|
@@ -152,4 +438,4 @@ function emitLocal(writer, statement, indent, statementPath) {
|
|
|
152
438
|
function identity(name) {
|
|
153
439
|
return name;
|
|
154
440
|
}
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVieS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9ydWJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQzFDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFM0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNO0lBQ3pDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxFQUFFO1FBQ3RELElBQUksYUFBYSxHQUFHLENBQUM7WUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFFdkYsS0FBSyxNQUFNLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUMzRSxNQUFNLGFBQWEsR0FBRyxjQUFjLGFBQWEsZUFBZSxjQUFjLEVBQUUsQ0FBQTtZQUVoRixNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtZQUNwRixNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtZQUN6RyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtZQUM3RSxNQUFNLENB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QUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDekQsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLGFBQWEsQ0FBQyxDQUFBO0lBQzVFLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RCxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksWUFBWSxDQUFDLENBQUE7SUFDNUUsQ0FBQztJQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQ3BFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUMzRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMs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LFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0lBQ2xHLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO0lBQ3pFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxHQUFHLGFBQWEsY0FBYyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMvRixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7QUFDcEUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxJQUFJO0lBQ3BCLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2VtaXRFeHByZXNzaW9ufSBmcm9tIFwiLi9zaGFyZWQuanNcIlxuaW1wb3J0IHtlbWl0U2NhbGFyVHlwZX0gZnJvbSBcIi4vc2NhbGFycy5qc1wiXG5cbi8qKlxuICogRW1pdHMgYW4gaW5kZXBlbmRlbnRseSBleGVjdXRhYmxlIFJ1YnkgcHJvZ3JhbSB0aHJvdWdoIHRoZSBzb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUnVieShtb2R1bGUsIHdyaXRlcikge1xuICBtb2R1bGUuZnVuY3Rpb25zLmZvckVhY2goKGRlY2xhcmF0aW9uLCBmdW5jdGlvbkluZGV4KSA9PiB7XG4gICAgaWYgKGZ1bmN0aW9uSW5kZXggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwiZGVjbGFyYXRpb24gc2VwYXJhdG9yXCIsIFtkZWNsYXJhdGlvbl0pXG5cbiAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJJbmRleCwgcGFyYW1ldGVyXSBvZiBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgcGFyYW1ldGVyUGF0aCA9IGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vcGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fWBcblxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiMgQHBhcmFtIFwiLCBcIlJ1YnkgdHlwZSBzY2FmZm9sZGluZ1wiLCBbcGFyYW1ldGVyXSwgW3BhcmFtZXRlclBhdGhdKVxuICAgICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogcGFyYW1ldGVyUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBbXCIsIFwiUnVieSB0eXBlIHNjYWZmb2xkaW5nXCIsIFtwYXJhbWV0ZXJdLCBbcGFyYW1ldGVyUGF0aF0pXG4gICAgICB3cml0ZXIubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwicnVieVwiLCBwYXJhbWV0ZXIudHlwZSksIHtcbiAgICAgICAgbWFwcGluZ0tpbmQ6IFwiZXhhY3RcIixcbiAgICAgICAgbm9kZTogcGFyYW1ldGVyLnR5cGUsXG4gICAgICAgIHBhdGg6IGAke3BhcmFtZXRlclBhdGh9L3R5cGVgLFxuICAgICAgICByb2xlOiBcInR5cGVcIlxuICAgICAgfSlcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCJdXFxuXCIsIFwiUnVieSB0eXBlIHNjYWZmb2xkaW5nXCIsIFtwYXJhbWV0ZXJdLCBbcGFyYW1ldGVyUGF0aF0pXG4gICAgfVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIjIEByZXR1cm4gW1wiLCBcIlJ1YnkgdHlwZSBzY2FmZm9sZGluZ1wiLCBbZGVjbGFyYXRpb25dKVxuICAgIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJydWJ5XCIsIGRlY2xhcmF0aW9uLnJldHVyblR5cGUpLCB7XG4gICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLFxuICAgICAgbm9kZTogZGVjbGFyYXRpb24ucmV0dXJuVHlwZSxcbiAgICAgIHBhdGg6IGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vcmV0dXJuVHlwZWAsXG4gICAgICByb2xlOiBcInR5cGVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIl1cXG5cIiwgXCJSdWJ5IHR5cGUgc2NhZmZvbGRpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiZGVmXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZnVuY3Rpb24gc3BhY2luZ1wiLCBbZGVjbGFyYXRpb25dKVxuICAgIHdyaXRlci5tYXBwZWQoZGVjbGFyYXRpb24ubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGRlY2xhcmF0aW9uLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgZGVjbGFyYXRpb24ucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJwYXJhbWV0ZXIgc2VwYXJhdG9yXCIsIFtkZWNsYXJhdGlvbl0pXG4gICAgICB3cml0ZXIubWFwcGVkKHBhcmFtZXRlci5uYW1lLCB7XG4gICAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsXG4gICAgICAgIG5vZGU6IHBhcmFtZXRlcixcbiAgICAgICAgcGF0aDogYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9wYXJhbWV0ZXJzLyR7aW5kZXh9YCxcbiAgICAgICAgcm9sZTogXCJuYW1lXCJcbiAgICAgIH0pXG4gICAgfSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbZGVjbGFyYXRpb25dKVxuXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgZGVjbGFyYXRpb24uYm9keSwgXCIgIFwiLCBgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L2JvZHlgKVxuICAgIHdyaXRlci5tYXBwZWQoXCJlbmRcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gIH0pXG5cbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcImVudHJ5LXBvaW50IHNlcGFyYXRvclwiLCBbbW9kdWxlLmVudHJ5UG9pbnRdKVxuICBlbWl0QmxvY2sod3JpdGVyLCBtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBcIlwiLCBcIi9lbnRyeVBvaW50L2JvZHlcIilcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgb3JkZXJlZCBSdWJ5IGJsb2NrIGJvZHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gU2VtYW50aWMgYmxvY2suXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gSW5kZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEV4YWN0IGJsb2NrIHBhdGguXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdEJsb2NrKHdyaXRlciwgYmxvY2ssIGluZGVudCwgcGF0aCkge1xuICBibG9jay5zdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCwgaW5kZXgpID0+IGVtaXRTdGF0ZW1lbnQod3JpdGVyLCBzdGF0ZW1lbnQsIGluZGVudCwgYCR7cGF0aH0vc3RhdGVtZW50cy8ke2luZGV4fWApKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBSdWJ5IHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFNlbWFudGljIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBJbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRXhhY3Qgc3RhdGVtZW50IHBhdGguXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdFN0YXRlbWVudCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoKSB7XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikgcmV0dXJuIGVtaXRMb2NhbCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoKVxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJyZXR1cm5cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwicmV0dXJuIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgXCJydWJ5XCIsIGlkZW50aXR5KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJwdXRzXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInByaW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgXCJydWJ5XCIsIGlkZW50aXR5KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgd3JpdGVyLm1hcHBlZChcImlmXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmNvbmRpdGlvbiwgYCR7cGF0aH0vY29uZGl0aW9uYCwgXCJydWJ5XCIsIGlkZW50aXR5KVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuY29uc2VxdWVudCwgYCR7aW5kZW50fSAgYCwgYCR7cGF0aH0vY29uc2VxdWVudGApXG4gIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB7XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiZWxzZVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBgJHtpbmRlbnR9ICBgLCBgJHtwYXRofS9hbHRlcm5hdGVgKVxuICB9XG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCJlbmRcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBSdWJ5IGxvY2FsIHN0YXRlbWVudCB3aXRoIGV4YWN0IFNlbWFudGlmb2xkIHByb2ZpbGUgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuTG9jYWxTdGF0ZW1lbnR9IHN0YXRlbWVudCAtIExvY2FsIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBMZWFkaW5nIGluZGVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlbWVudFBhdGggLSBFeGFjdCBKU09OIFBvaW50ZXIgZm9yIHRoaXMgc3RhdGVtZW50IG9jY3VycmVuY2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdExvY2FsKHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIHN0YXRlbWVudFBhdGgpIHtcbiAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcblxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpIHtcbiAgICB3cml0ZXIubWFwcGVkKHN0YXRlbWVudC50YXJnZXQubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudC50YXJnZXQsIHBhdGg6IGAke3N0YXRlbWVudFBhdGh9L3RhcmdldGAsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImFzc2lnbm1lbnQgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCI9XCIsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGg6IHN0YXRlbWVudFBhdGgsIHJvbGU6IFwib3BlcmF0b3JcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtzdGF0ZW1lbnRQYXRofS9leHByZXNzaW9uYCwgXCJydWJ5XCIsIGlkZW50aXR5KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cblxuICB3cml0ZXIuc3ludGhldGljKFwiIyBAdHlwZSBbXCIsIFwiUnVieSBsb2NhbCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJydWJ5XCIsIHN0YXRlbWVudC50eXBlKSwge1xuICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsXG4gICAgbm9kZTogc3RhdGVtZW50LnR5cGUsXG4gICAgcGF0aDogYCR7c3RhdGVtZW50UGF0aH0vdHlwZWAsXG4gICAgcm9sZTogXCJ0eXBlXCJcbiAgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIl1cXG5cIiwgXCJSdWJ5IGxvY2FsIHR5cGUgc2NhZmZvbGRpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgaWYgKCFzdGF0ZW1lbnQubXV0YWJsZSkge1xuICAgIHdyaXRlci5zeW50aGV0aWMoYCR7aW5kZW50fSMgQHNlbWFudGlmb2xkLWltbXV0YWJsZVxcbmAsIFwiUnVieSBpbW11dGFiaWxpdHkgc2NhZmZvbGRpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgfVxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB3cml0ZXIubWFwcGVkKHN0YXRlbWVudC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCI9XCIsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGg6IHN0YXRlbWVudFBhdGgsIHJvbGU6IFwib3BlcmF0b3JcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmluaXRpYWxpemVyLCBgJHtzdGF0ZW1lbnRQYXRofS9pbml0aWFsaXplcmAsIFwicnVieVwiLCBpZGVudGl0eSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIHVuY2hhbmdlZCBSdWJ5IGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIElkZW50aWZpZXIuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBJZGVudGlmaWVyLlxuICovXG5mdW5jdGlvbiBpZGVudGl0eShuYW1lKSB7XG4gIHJldHVybiBuYW1lXG59XG4iXX0=
|
|
441
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVieS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9ydWJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsY0FBYyxFQUFFLFFBQVEsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUNwRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbEU7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFBO0lBRWxDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLE1BQU0sYUFBYSxHQUFHLG1FQUFtRSxDQUFDLEVBQUMsc0JBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUUzSCxLQUFLLE1BQU0sUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDckcsTUFBTSxRQUFRLEdBQUcsNERBQTRELENBQUMsQ0FDNUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUs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QUMsVUFBVSxDQUFDLElBQUksRUFBRTtZQUN2QyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNO1NBQzNGLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGlDQUFpQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzlFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUU7WUFDekMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTTtTQUMvRixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxpQ0FBaUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUMvRSxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUE7UUFDaEUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBQyxDQUFDLENBQUE7UUFDekYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3pELE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUE7UUFDbEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUN0RSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDM0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFDOUosTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUN2RixjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDMUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3pELE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUVuRSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ3RFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RCxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUE7UUFDaEUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUN0RixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFDdEwsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQTtRQUN2RyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUM1SSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekQsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFBO1FBQzFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxZQUFZLEVBQUMsQ0FBQyxDQUFBO1FBQ25HLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDdkUsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDNUQsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3RGLENBQUM7UUFDRCxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekQsT0FBTTtJQUNSLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUM1QyxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLGFBQWEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDcEYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3pELE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUNyRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDM0QsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3BGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RCxPQUFNO0lBQ1IsQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7SUFDbkUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDakUsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ2xGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUN6RCxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksYUFBYSxDQUFDLENBQUE7SUFDNUUsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDckUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3pELFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBSSxFQUFFLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQTtJQUM1RSxDQUFDO0lBQ0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7SUFDcEUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQzNELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsYUFBYTtJQUN6RCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7SUFFckUsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsYUFBYSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFDbkksTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7UUFDekUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtRQUNsRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtRQUN6RSxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxhQUFhLGFBQWEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDN0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO1FBQ2xFLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7SUFDMUYsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsYUFBYSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDakUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7SUFDcEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSw0QkFBNEIsRUFBRSwrQkFBK0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtJQUN4SCxDQUFDO0lBQ0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO0lBQ3JFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO0lBQ3pHLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO0lBQ3pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7SUFDbEcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7SUFDekUsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLEdBQUcsYUFBYSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQy9GLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtBQUNwRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLElBQUk7SUFDcEIsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZW1pdEV4cHJlc3Npb24sIGVtaXRUeXBlfSBmcm9tIFwiLi9zaGFyZWQuanNcIlxuaW1wb3J0IHtlbWl0RWZmZWN0UHJlZml4ZXMsIGVtaXRFZmZlY3RTdXBwb3J0fSBmcm9tIFwiLi9lZmZlY3RzLmpzXCJcblxuLyoqXG4gKiBFbWl0cyBhbiBpbmRlcGVuZGVudGx5IGV4ZWN1dGFibGUgUnVieSBwcm9ncmFtIHRocm91Z2ggdGhlIHNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSdWJ5KG1vZHVsZSwgd3JpdGVyKSB7XG4gIGNvbnN0IHJlY29yZHMgPSBtb2R1bGUucmVjb3JkcyA/PyBbXVxuICBjb25zdCBjbGFzc2VzID0gbW9kdWxlLmNsYXNzZXMgPz8gW11cbiAgY29uc3QgZXJyb3JzID0gbW9kdWxlLmVycm9ycyA/PyBbXVxuXG4gIGlmICh3cml0ZXIucHJvZ3JhbSkge1xuICAgIGNvbnN0IHByb2dyYW1Nb2R1bGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKG1vZHVsZSkpXG5cbiAgICBmb3IgKGNvbnN0IG1vZHVsZUlkIG9mIFsuLi5uZXcgU2V0KHByb2dyYW1Nb2R1bGUuaW1wb3J0cy5tYXAoKGl0ZW0pID0+IGl0ZW0ubW9kdWxlSWQpKV0pIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlID0gd3JpdGVyLnJlbGF0aXZlTW9kdWxlU3BlY2lmaWVyKG1vZHVsZUlkKS5yZXBsYWNlKC9cXC5yYiQvdSwgXCJcIikucmVwbGFjZSgvXlxcLlxcLy91LCBcIlwiKVxuICAgICAgY29uc3QgaW1wb3J0ZWQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljSW1wb3J0fSAqLyAoXG4gICAgICAgIHByb2dyYW1Nb2R1bGUuaW1wb3J0cy5maW5kKChpdGVtKSA9PiBpdGVtLm1vZHVsZUlkID09IG1vZHVsZUlkKSlcbiAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBgL2ltcG9ydHMvJHtwcm9ncmFtTW9kdWxlLmltcG9ydHMuaW5kZXhPZihpbXBvcnRlZCl9YFxuXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwicmVxdWlyZV9yZWxhdGl2ZSBcIiwgXCJSdWJ5IHJlcXVpcmUtcmVsYXRpdmUgZWRnZVwiLCBbaW1wb3J0ZWRdLCBbaW1wb3J0UGF0aF0pXG4gICAgICB3cml0ZXIubWFwcGVkKEpTT04uc3RyaW5naWZ5KHJlbGF0aXZlKSwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBpbXBvcnRlZCwgcGF0aDogaW1wb3J0UGF0aCwgcm9sZTogXCJwYXRoXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcIlJ1YnkgcmVxdWlyZS1yZWxhdGl2ZSB0ZXJtaW5hdG9yXCIsIFtpbXBvcnRlZF0sIFtpbXBvcnRQYXRoXSlcbiAgICB9XG4gICAgaWYgKHByb2dyYW1Nb2R1bGUuaW1wb3J0cy5sZW5ndGggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwiUnVieSByZXF1aXJlL21vZHVsZSBzZXBhcmF0b3JcIiwgW21vZHVsZV0pXG4gICAgaWYgKHdyaXRlci5zdGRsaWJQcm92aWRlckVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlID0gd3JpdGVyLnN0ZGxpYlByb3ZpZGVyU3BlY2lmaWVyKCkucmVwbGFjZSgvXFwucmIkL3UsIFwiXCIpLnJlcGxhY2UoL15cXC5cXC8vdSwgXCJcIilcblxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcInJlcXVpcmVfcmVsYXRpdmUgXCIsIFwiUnVieSBzdGRsaWIgcHJvdmlkZXIgcmVxdWlyZS1yZWxhdGl2ZSBlZGdlXCIsIFttb2R1bGVdKVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhKU09OLnN0cmluZ2lmeShyZWxhdGl2ZSksIFwiUnVieSBzdGRsaWIgcHJvdmlkZXIgcmVxdWlyZS1yZWxhdGl2ZSBwYXRoXCIsIFttb2R1bGVdKVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcIlJ1Ynkgc3RkbGliIHByb3ZpZGVyIHJlcXVpcmUtcmVsYXRpdmUgdGVybWluYXRvclwiLCBbbW9kdWxlXSlcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJSdWJ5IHN0ZGxpYiBwcm92aWRlciByZXF1aXJlIHNlcGFyYXRvclwiLCBbbW9kdWxlXSlcbiAgICB9XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhgbW9kdWxlICR7d3JpdGVyLnByb2dyYW1Nb2R1bGVOYW1lKHByb2dyYW1Nb2R1bGUuaWQpfVxcbmAsIFwiUnVieSBzZW1hbnRpYyBtb2R1bGUgd3JhcHBlclwiLCBbbW9kdWxlXSlcbiAgICBpZiAobW9kdWxlLmZ1bmN0aW9ucy5sZW5ndGggPiAwKSB3cml0ZXIuc3ludGhldGljKFwibW9kdWxlX2Z1bmN0aW9uXFxuXFxuXCIsIFwiUnVieSBtb2R1bGUtZnVuY3Rpb24gcHJvZmlsZVwiLCBbbW9kdWxlXSlcbiAgfVxuXG4gIGVtaXRFZmZlY3RTdXBwb3J0KHdyaXRlciwgbW9kdWxlLCBcInJ1YnlcIilcbiAgZXJyb3JzLmZvckVhY2goKGVycm9yLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBgL2Vycm9ycy8ke2luZGV4fWBcblxuICAgIGlmIChpbmRleCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJlcnJvciBkZWNsYXJhdGlvbiBzZXBhcmF0b3JcIiwgW2Vycm9yXSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJjbGFzc1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGVycm9yLCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImVycm9yIGRlY2xhcmF0aW9uIHNwYWNpbmdcIiwgW2Vycm9yXSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoZXJyb3IubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGVycm9yLCBwYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiA8IFN0YW5kYXJkRXJyb3JcXG5lbmRcIiwgXCJSdWJ5IHVuY2hlY2tlZCBlcnJvciBzY2FmZm9sZGluZ1wiLCBbZXJyb3JdLCBbcGF0aF0pXG4gIH0pXG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcImVycm9yL2RlY2xhcmF0aW9uIHNlcGFyYXRvclwiLCBbbW9kdWxlXSlcblxuICByZWNvcmRzLmZvckVhY2goKHJlY29yZCwgcmVjb3JkSW5kZXgpID0+IHtcbiAgICBjb25zdCByZWNvcmRQYXRoID0gYC9yZWNvcmRzLyR7cmVjb3JkSW5kZXh9YFxuXG4gICAgaWYgKHJlY29yZEluZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcInJlY29yZCBkZWNsYXJhdGlvbiBzZXBhcmF0b3JcIiwgW3JlY29yZF0sIFtyZWNvcmRQYXRoXSlcbiAgICBlbWl0VGVtcGxhdGVDb21tZW50cyh3cml0ZXIsIHJlY29yZC50eXBlUGFyYW1ldGVycyA/PyBbXSwgYCR7cmVjb3JkUGF0aH0vdHlwZVBhcmFtZXRlcnNgKVxuICAgIHdyaXRlci5tYXBwZWQoXCJjbGFzc1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHJlY29yZCwgcGF0aDogcmVjb3JkUGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJyZWNvcmQgZGVjbGFyYXRpb24gc3BhY2luZ1wiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQocmVjb3JkLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiByZWNvcmQsIHBhdGg6IHJlY29yZFBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICAgIHJlY29yZC5maWVsZHMuZm9yRWFjaCgoZmllbGQsIGZpZWxkSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkUGF0aCA9IGAke3JlY29yZFBhdGh9L2ZpZWxkcy8ke2ZpZWxkSW5kZXh9YFxuXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiICAjIEB0eXBlIFtcIiwgXCJSdWJ5IHJlY29yZCBmaWVsZCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgICAgZW1pdFR5cGUod3JpdGVyLCBmaWVsZC50eXBlLCBgJHtmaWVsZFBhdGh9L3R5cGVgLCBcInJ1YnlcIilcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCJdXFxuICBhdHRyX3JlYWRlciA6XCIsIFwiUnVieSByZWNvcmQgcmVhZGVyIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgICAgd3JpdGVyLm1hcHBlZChmaWVsZC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZmllbGQsIHBhdGg6IGZpZWxkUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwicmVjb3JkIGNvbnN0cnVjdG9yIHNlcGFyYXRvclwiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICAgIHJlY29yZC5maWVsZHMuZm9yRWFjaCgoZmllbGQsIGZpZWxkSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkUGF0aCA9IGAke3JlY29yZFBhdGh9L2ZpZWxkcy8ke2ZpZWxkSW5kZXh9YFxuXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiICAjIEBwYXJhbSBcIiwgXCJSdWJ5IHJlY29yZCBjb25zdHJ1Y3RvciB0eXBlIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgICAgd3JpdGVyLm1hcHBlZChmaWVsZC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZmllbGQsIHBhdGg6IGZpZWxkUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBbXCIsIFwiUnVieSByZWNvcmQgY29uc3RydWN0b3IgdHlwZSBzY2FmZm9sZGluZ1wiLCBbZmllbGRdLCBbZmllbGRQYXRoXSlcbiAgICAgIGVtaXRUeXBlKHdyaXRlciwgZmllbGQudHlwZSwgYCR7ZmllbGRQYXRofS90eXBlYCwgXCJydWJ5XCIpXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiXVxcblwiLCBcIlJ1YnkgcmVjb3JkIGNvbnN0cnVjdG9yIHR5cGUgc2NhZmZvbGRpbmdcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICBkZWYgaW5pdGlhbGl6ZShcIiwgXCJSdWJ5IHJlY29yZCBjb25zdHJ1Y3RvciBzY2FmZm9sZGluZ1wiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICAgIHJlY29yZC5maWVsZHMuZm9yRWFjaCgoZmllbGQsIGZpZWxkSW5kZXgpID0+IHtcbiAgICAgIGlmIChmaWVsZEluZGV4KSB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJyZWNvcmQgZmllbGQgc2VwYXJhdG9yXCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG4gICAgICB3cml0ZXIubWFwcGVkKGZpZWxkLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBmaWVsZCwgcGF0aDogYCR7cmVjb3JkUGF0aH0vZmllbGRzLyR7ZmllbGRJbmRleH1gLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiKVxcblwiLCBcIlJ1YnkgcmVjb3JkIGNvbnN0cnVjdG9yIHNjYWZmb2xkaW5nXCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG4gICAgcmVjb3JkLmZpZWxkcy5mb3JFYWNoKChmaWVsZCwgZmllbGRJbmRleCkgPT4ge1xuICAgICAgY29uc3QgZmllbGRQYXRoID0gYCR7cmVjb3JkUGF0aH0vZmllbGRzLyR7ZmllbGRJbmRleH1gXG5cbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCIgICAgQFwiLCBcIlJ1YnkgcmVjb3JkIHN0b3JhZ2Ugc2NhZmZvbGRpbmdcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgICB3cml0ZXIubWFwcGVkKGZpZWxkLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBmaWVsZCwgcGF0aDogZmllbGRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiID0gXCIsIFwiUnVieSByZWNvcmQgc3RvcmFnZSBzY2FmZm9sZGluZ1wiLCBbZmllbGRdLCBbZmllbGRQYXRoXSlcbiAgICAgIHdyaXRlci5tYXBwZWQoZmllbGQubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGZpZWxkLCBwYXRoOiBmaWVsZFBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAgICA6Oktlcm5lbC5pbnN0YW5jZV9tZXRob2QoOmZyZWV6ZSkuYmluZF9jYWxsKHNlbGYpXFxuICBlbmRcXG5lbmRcIiwgXCJSdWJ5IHJlY29yZCBpbW11dGFiaWxpdHkgc2NhZmZvbGRpbmdcIiwgW3JlY29yZF0sIFtyZWNvcmRQYXRoXSlcbiAgfSlcbiAgaWYgKHJlY29yZHMubGVuZ3RoID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcInJlY29yZC9mdW5jdGlvbiBzZXBhcmF0b3JcIiwgW21vZHVsZV0pXG5cbiAgY2xhc3Nlcy5mb3JFYWNoKChkZWNsYXJhdGlvbiwgY2xhc3NJbmRleCkgPT4ge1xuICAgIGlmIChjbGFzc0luZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcInJlZmVyZW5jZSBjbGFzcyBzZXBhcmF0b3JcIiwgW2RlY2xhcmF0aW9uXSwgW2AvY2xhc3Nlcy8ke2NsYXNzSW5kZXh9YF0pXG4gICAgZW1pdFJlZmVyZW5jZUNsYXNzKHdyaXRlciwgZGVjbGFyYXRpb24sIGNsYXNzSW5kZXgpXG4gIH0pXG4gIGlmIChjbGFzc2VzLmxlbmd0aCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJyZWZlcmVuY2UgY2xhc3MvZnVuY3Rpb24gc2VwYXJhdG9yXCIsIFttb2R1bGVdKVxuXG4gIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGZ1bmN0aW9uSW5kZXgpID0+IHtcbiAgICBpZiAoZnVuY3Rpb25JbmRleCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJkZWNsYXJhdGlvbiBzZXBhcmF0b3JcIiwgW2RlY2xhcmF0aW9uXSlcblxuICAgIGVtaXRUZW1wbGF0ZUNvbW1lbnRzKHdyaXRlciwgZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPz8gW10sIGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vdHlwZVBhcmFtZXRlcnNgKVxuICAgIGZvciAoY29uc3QgW3BhcmFtZXRlckluZGV4LCBwYXJhbWV0ZXJdIG9mIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJQYXRoID0gYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YFxuXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiIyBAcGFyYW0gXCIsIFwiUnVieSB0eXBlIHNjYWZmb2xkaW5nXCIsIFtwYXJhbWV0ZXJdLCBbcGFyYW1ldGVyUGF0aF0pXG4gICAgICB3cml0ZXIubWFwcGVkKHBhcmFtZXRlci5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogcGFyYW1ldGVyLCBwYXRoOiBwYXJhbWV0ZXJQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiIFtcIiwgXCJSdWJ5IHR5cGUgc2NhZmZvbGRpbmdcIiwgW3BhcmFtZXRlcl0sIFtwYXJhbWV0ZXJQYXRoXSlcbiAgICAgIGVtaXRUeXBlKHdyaXRlciwgcGFyYW1ldGVyLnR5cGUsIGAke3BhcmFtZXRlclBhdGh9L3R5cGVgLCBcInJ1YnlcIilcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCJdXFxuXCIsIFwiUnVieSB0eXBlIHNjYWZmb2xkaW5nXCIsIFtwYXJhbWV0ZXJdLCBbcGFyYW1ldGVyUGF0aF0pXG4gICAgfVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIjIEByZXR1cm4gW1wiLCBcIlJ1YnkgdHlwZSBzY2FmZm9sZGluZ1wiLCBbZGVjbGFyYXRpb25dKVxuICAgIGVtaXRUeXBlKHdyaXRlciwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9yZXR1cm5UeXBlYCwgXCJydWJ5XCIpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIl1cXG5cIiwgXCJSdWJ5IHR5cGUgc2NhZmZvbGRpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiZGVmXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZnVuY3Rpb24gc3BhY2luZ1wiLCBbZGVjbGFyYXRpb25dKVxuICAgIHdyaXRlci5tYXBwZWQoZGVjbGFyYXRpb24ubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGRlY2xhcmF0aW9uLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgZGVjbGFyYXRpb24ucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJwYXJhbWV0ZXIgc2VwYXJhdG9yXCIsIFtkZWNsYXJhdGlvbl0pXG4gICAgICB3cml0ZXIubWFwcGVkKHBhcmFtZXRlci5uYW1lLCB7XG4gICAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsXG4gICAgICAgIG5vZGU6IHBhcmFtZXRlcixcbiAgICAgICAgcGF0aDogYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9wYXJhbWV0ZXJzLyR7aW5kZXh9YCxcbiAgICAgICAgcm9sZTogXCJuYW1lXCJcbiAgICAgIH0pXG4gICAgfSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbZGVjbGFyYXRpb25dKVxuXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgZGVjbGFyYXRpb24uYm9keSwgXCIgIFwiLCBgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L2JvZHlgKVxuICAgIHdyaXRlci5tYXBwZWQoXCJlbmRcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gIH0pXG5cbiAgaWYgKHdyaXRlci5wcm9ncmFtKSB7XG4gICAgY29uc3QgcHJpdmF0ZU5vbWluYWxzID0gWy4uLmVycm9ycywgLi4ucmVjb3Jkc10uZmlsdGVyKChkZWNsYXJhdGlvbikgPT4gIXdyaXRlci5pc0V4cG9ydGVkKGRlY2xhcmF0aW9uLmlkKSlcbiAgICBjb25zdCBwcml2YXRlRnVuY3Rpb25zID0gbW9kdWxlLmZ1bmN0aW9ucy5maWx0ZXIoKGRlY2xhcmF0aW9uKSA9PiAhd3JpdGVyLmlzRXhwb3J0ZWQoZGVjbGFyYXRpb24uaWQpKVxuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBwcml2YXRlTm9taW5hbHMpIHtcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5wcml2YXRlX2NvbnN0YW50IDpcIiwgXCJSdWJ5IHByaXZhdGUgc2VtYW50aWMgbm9taW5hbCBkZWNsYXJhdGlvblwiLCBbZGVjbGFyYXRpb25dKVxuICAgICAgd3JpdGVyLm1hcHBlZChkZWNsYXJhdGlvbi5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZGVjbGFyYXRpb24sIHJvbGU6IFwibmFtZVwifSlcbiAgICB9XG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBwcml2YXRlRnVuY3Rpb25zKSB7XG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiXFxucHJpdmF0ZV9jbGFzc19tZXRob2QgOlwiLCBcIlJ1YnkgcHJpdmF0ZSBzZW1hbnRpYyBmdW5jdGlvblwiLCBbZGVjbGFyYXRpb25dKVxuICAgICAgd3JpdGVyLm1hcHBlZChkZWNsYXJhdGlvbi5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZGVjbGFyYXRpb24sIHJvbGU6IFwibmFtZVwifSlcbiAgICB9XG4gIH1cblxuICBpZiAoIXdyaXRlci5wcm9ncmFtIHx8IHdyaXRlci5pc1Byb2dyYW1FbnRyeSgpKSB7XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcImVudHJ5LXBvaW50IHNlcGFyYXRvclwiLCBbbW9kdWxlLmVudHJ5UG9pbnRdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIG1vZHVsZS5lbnRyeVBvaW50LmJvZHksIFwiXCIsIFwiL2VudHJ5UG9pbnQvYm9keVwiKVxuICB9XG4gIGlmICh3cml0ZXIucHJvZ3JhbSkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcbmVuZFxcblwiLCBcIlJ1Ynkgc2VtYW50aWMgbW9kdWxlIGNsb3NlXCIsIFttb2R1bGVdKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBuYXRpdmUgUnVieSByZWZlcmVuY2UgY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBSZWZlcmVuY2UgY2xhc3MuXG4gKiBAcGFyYW0ge251bWJlcn0gY2xhc3NJbmRleCAtIE1vZHVsZSBjbGFzcyBpbmRleC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0UmVmZXJlbmNlQ2xhc3Mod3JpdGVyLCBkZWNsYXJhdGlvbiwgY2xhc3NJbmRleCkge1xuICBjb25zdCBwYXRoID0gYC9jbGFzc2VzLyR7Y2xhc3NJbmRleH1gXG5cbiAgd3JpdGVyLm1hcHBlZChcImNsYXNzXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb24sIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInJlZmVyZW5jZSBjbGFzcyBzcGFjaW5nXCIsIFtkZWNsYXJhdGlvbl0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChkZWNsYXJhdGlvbi5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZGVjbGFyYXRpb24sIHBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW2RlY2xhcmF0aW9uXSwgW3BhdGhdKVxuICBkZWNsYXJhdGlvbi5maWVsZHMuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZmllbGRQYXRoID0gYCR7cGF0aH0vZmllbGRzLyR7aW5kZXh9YFxuXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAgIyBAc2VtYW50aWZvbGQtcHJpdmF0ZSBcIiwgXCJwcml2YXRlIGZpZWxkIG1ldGFkYXRhXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoZmllbGQubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGZpZWxkLCBwYXRoOiBmaWVsZFBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFtcIiwgXCJwcml2YXRlIGZpZWxkIHR5cGUgbWV0YWRhdGFcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgZW1pdFR5cGUod3JpdGVyLCBmaWVsZC50eXBlLCBgJHtmaWVsZFBhdGh9L3R5cGVgLCBcInJ1YnlcIilcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXVxcblwiLCBcImxpbmUgYnJlYWtcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gIH0pXG4gIGNvbnN0IGNvbnN0cnVjdG9yID0gZGVjbGFyYXRpb24uY29uc3RydWN0b3JcbiAgY29uc3QgY29uc3RydWN0b3JQYXRoID0gYCR7cGF0aH0vY29uc3RydWN0b3JgXG5cbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImNvbnN0cnVjdG9yIHNwYWNpbmdcIiwgW2NvbnN0cnVjdG9yXSwgW2NvbnN0cnVjdG9yUGF0aF0pXG4gIGVtaXRSdWJ5Q2FsbGFibGVDb21tZW50cyh3cml0ZXIsIGNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIHVuZGVmaW5lZCwgYCR7Y29uc3RydWN0b3JQYXRofS9wYXJhbWV0ZXJzYCwgdW5kZWZpbmVkKVxuICB3cml0ZXIuc3ludGhldGljKFwiICBcIiwgXCJjb25zdHJ1Y3RvciBpbmRlbnRhdGlvblwiLCBbY29uc3RydWN0b3JdLCBbY29uc3RydWN0b3JQYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcImRlZiBpbml0aWFsaXplXCIsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBjb25zdHJ1Y3RvciwgcGF0aDogY29uc3RydWN0b3JQYXRoLCByb2xlOiBcImNvbnN0cnVjdG9yXCJ9KVxuICBlbWl0UnVieVBhcmFtZXRlcnMod3JpdGVyLCBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCBgJHtjb25zdHJ1Y3RvclBhdGh9L3BhcmFtZXRlcnNgKVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbY29uc3RydWN0b3JdLCBbY29uc3RydWN0b3JQYXRoXSlcbiAgZW1pdEJsb2NrKHdyaXRlciwgY29uc3RydWN0b3IuYm9keSwgXCIgICAgXCIsIGAke2NvbnN0cnVjdG9yUGF0aH0vYm9keWApXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgIGVuZFwiLCBcImNvbnN0cnVjdG9yIGNsb3NlXCIsIFtjb25zdHJ1Y3Rvcl0sIFtjb25zdHJ1Y3RvclBhdGhdKVxuICBkZWNsYXJhdGlvbi5tZXRob2RzLmZvckVhY2goKG1ldGhvZCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBtZXRob2RQYXRoID0gYCR7cGF0aH0vbWV0aG9kcy8ke2luZGV4fWBcblxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJtZXRob2Qgc3BhY2luZ1wiLCBbbWV0aG9kXSwgW21ldGhvZFBhdGhdKVxuICAgIGVtaXRSdWJ5Q2FsbGFibGVDb21tZW50cyh3cml0ZXIsIG1ldGhvZC5wYXJhbWV0ZXJzLCBtZXRob2QucmV0dXJuVHlwZSwgYCR7bWV0aG9kUGF0aH0vcGFyYW1ldGVyc2AsIGAke21ldGhvZFBhdGh9L3JldHVyblR5cGVgKVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgIGRlZiBcIiwgXCJtZXRob2QgaW5kZW50YXRpb25cIiwgW21ldGhvZF0sIFttZXRob2RQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKG1ldGhvZC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogbWV0aG9kLCBwYXRoOiBtZXRob2RQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgZW1pdFJ1YnlQYXJhbWV0ZXJzKHdyaXRlciwgbWV0aG9kLnBhcmFtZXRlcnMsIGAke21ldGhvZFBhdGh9L3BhcmFtZXRlcnNgKVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFttZXRob2RdLCBbbWV0aG9kUGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgbWV0aG9kLmJvZHksIFwiICAgIFwiLCBgJHttZXRob2RQYXRofS9ib2R5YClcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICBlbmRcIiwgXCJtZXRob2QgY2xvc2VcIiwgW21ldGhvZF0sIFttZXRob2RQYXRoXSlcbiAgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW2RlY2xhcmF0aW9uXSwgW3BhdGhdKVxuICB3cml0ZXIubWFwcGVkKFwiZW5kXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb24sIHBhdGh9KVxufVxuXG4vKipcbiAqIEVtaXRzIGV4YWN0IFJ1YnkgY2FsbGFibGUgdHlwZSBjb21tZW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5QYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIE9yZGVyZWQgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgfCB1bmRlZmluZWR9IHJldHVyblR5cGUgLSBPcHRpb25hbCByZXR1cm4gdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbWV0ZXJQYXRoIC0gUGFyYW1ldGVyIGNvbGxlY3Rpb24gcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSByZXR1cm5QYXRoIC0gUmV0dXJuIHR5cGUgcGF0aC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0UnVieUNhbGxhYmxlQ29tbWVudHMod3JpdGVyLCBwYXJhbWV0ZXJzLCByZXR1cm5UeXBlLCBwYXJhbWV0ZXJQYXRoLCByZXR1cm5QYXRoKSB7XG4gIGZvciAoY29uc3QgW2luZGV4LCBwYXJhbWV0ZXJdIG9mIHBhcmFtZXRlcnMuZW50cmllcygpKSB7XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAgIyBAcGFyYW0gXCIsIFwicGFyYW1ldGVyIHR5cGUgbWV0YWRhdGFcIiwgW3BhcmFtZXRlcl0sIFtgJHtwYXJhbWV0ZXJQYXRofS8ke2luZGV4fWBdKVxuICAgIHdyaXRlci5tYXBwZWQocGFyYW1ldGVyLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBwYXJhbWV0ZXIsIHBhdGg6IGAke3BhcmFtZXRlclBhdGh9LyR7aW5kZXh9YCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgW1wiLCBcInBhcmFtZXRlciB0eXBlIG1ldGFkYXRhXCIsIFtwYXJhbWV0ZXJdLCBbYCR7cGFyYW1ldGVyUGF0aH0vJHtpbmRleH1gXSlcbiAgICBlbWl0VHlwZSh3cml0ZXIsIHBhcmFtZXRlci50eXBlLCBgJHtwYXJhbWV0ZXJQYXRofS8ke2luZGV4fS90eXBlYCwgXCJydWJ5XCIpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIl1cXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtwYXJhbWV0ZXJdKVxuICB9XG4gIGlmIChyZXR1cm5UeXBlICYmIHJldHVyblBhdGgpIHtcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICAjIEByZXR1cm4gW1wiLCBcInJldHVybiB0eXBlIG1ldGFkYXRhXCIsIFtdKVxuICAgIGVtaXRUeXBlKHdyaXRlciwgcmV0dXJuVHlwZSwgcmV0dXJuUGF0aCwgXCJydWJ5XCIpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIl1cXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtdKVxuICB9XG59XG5cbi8qKlxuICogRW1pdHMgb25lIFJ1YnkgcGFyYW1ldGVyIGxpc3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBPcmRlcmVkIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhcmFtZXRlciBjb2xsZWN0aW9uIHBhdGguXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdFJ1YnlQYXJhbWV0ZXJzKHdyaXRlciwgcGFyYW1ldGVycywgcGF0aCkge1xuICB3cml0ZXIuc3ludGhldGljKFwiKFwiLCBcInBhcmFtZXRlciBsaXN0IG9wZW5cIiwgcGFyYW1ldGVycylcbiAgcGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKGluZGV4KSB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJwYXJhbWV0ZXIgc2VwYXJhdG9yXCIsIHBhcmFtZXRlcnMpXG4gICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogYCR7cGF0aH0vJHtpbmRleH1gLCByb2xlOiBcIm5hbWVcIn0pXG4gIH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIpXCIsIFwicGFyYW1ldGVyIGxpc3QgY2xvc2VcIiwgcGFyYW1ldGVycylcbn1cblxuLyoqXG4gKiBFbWl0cyBleGFjdCBSRG9jIGRlY2xhcmF0aW9uIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gT3JkZXJlZCB0eXBlIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFR5cGUtcGFyYW1ldGVyIGNvbGxlY3Rpb24gcGF0aC5cbiAqL1xuZnVuY3Rpb24gZW1pdFRlbXBsYXRlQ29tbWVudHMod3JpdGVyLCBwYXJhbWV0ZXJzLCBwYXRoKSB7XG4gIHBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgIHdyaXRlci5zeW50aGV0aWMoXCIjIEB0ZW1wbGF0ZSBcIiwgXCJSdWJ5IHR5cGUgcGFyYW1ldGVyIHNjYWZmb2xkaW5nXCIsIFtwYXJhbWV0ZXJdLCBbYCR7cGF0aH0vJHtpbmRleH1gXSlcbiAgICB3cml0ZXIubWFwcGVkKHBhcmFtZXRlci5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogcGFyYW1ldGVyLCBwYXRoOiBgJHtwYXRofS8ke2luZGV4fWAsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbcGFyYW1ldGVyXSlcbiAgfSlcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgb3JkZXJlZCBSdWJ5IGJsb2NrIGJvZHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gU2VtYW50aWMgYmxvY2suXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gSW5kZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEV4YWN0IGJsb2NrIHBhdGguXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdEJsb2NrKHdyaXRlciwgYmxvY2ssIGluZGVudCwgcGF0aCkge1xuICBibG9jay5zdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCwgaW5kZXgpID0+IGVtaXRTdGF0ZW1lbnQod3JpdGVyLCBzdGF0ZW1lbnQsIGluZGVudCwgYCR7cGF0aH0vc3RhdGVtZW50cy8ke2luZGV4fWApKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBSdWJ5IHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFNlbWFudGljIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBJbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRXhhY3Qgc3RhdGVtZW50IHBhdGguXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdFN0YXRlbWVudCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoKSB7XG4gIGVtaXRFZmZlY3RQcmVmaXhlcyh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoLCBcInJ1YnlcIixcbiAgICAoZXhwcmVzc2lvbiwgZXhwcmVzc2lvblBhdGgpID0+IGVtaXRFeHByZXNzaW9uKHdyaXRlciwgZXhwcmVzc2lvbiwgZXhwcmVzc2lvblBhdGgsIFwicnVieVwiLCBpZGVudGl0eSkpXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikgcmV0dXJuIGVtaXRMb2NhbCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoKVxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiKSB7XG4gICAgY29uc3QgZmllbGQgPSB3cml0ZXIucHJpdmF0ZUZpZWxkRm9ySWQoc3RhdGVtZW50LmZpZWxkKVxuXG4gICAgd3JpdGVyLm1hcHBlZChgQCR7ZmllbGQubmFtZX1gLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbmFtZTogZmllbGQubmFtZSwgbm9kZTogc3RhdGVtZW50LCBwYXRoLCByb2xlOiBcIm1lbWJlclwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiID0gXCIsIFwicHJpdmF0ZSBmaWVsZCBhc3NpZ25tZW50XCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIFwicnVieVwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkJyZWFrU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJDb250aW51ZVN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQua2luZCA9PSBcIkJyZWFrU3RhdGVtZW50XCIgPyBcImJyZWFrXCIgOiBcIm5leHRcIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJXaGlsZVN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcIndoaWxlXCIsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiY29uZGl0aW9uLWNvbnRyb2xsZWQgbG9vcCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuY29uZGl0aW9uLCBgJHtwYXRofS9jb25kaXRpb25gLCBcInJ1YnlcIiwgaWRlbnRpdHkpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuYm9keSwgYCR7aW5kZW50fSAgYCwgYCR7cGF0aH0vYm9keWApXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiZW5kXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmJvZHksIHBhdGg6IGAke3BhdGh9L2JvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hTdGF0ZW1lbnRcIikge1xuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50Lmxpc3QsIGAke3BhdGh9L2xpc3RgLCBcInJ1YnlcIiwgaWRlbnRpdHkpXG4gICAgd3JpdGVyLm1hcHBlZChcIi5lYWNoXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImxvb3Agc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJkb1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5ib2R5LCBwYXRoOiBgJHtwYXRofS9ib2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiB8XCIsIFwiaXRlcmF0aW9uIGJpbmRpbmcgZGVsaW1pdGVyXCIsIFtzdGF0ZW1lbnQudmFsdWVCaW5kaW5nXSwgW2Ake3BhdGh9L3ZhbHVlQmluZGluZ2BdKVxuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LnZhbHVlQmluZGluZy5uYW1lLCB7XG4gICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLCBwYXRoOiBgJHtwYXRofS92YWx1ZUJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcInxcXG5cIiwgXCJpdGVyYXRpb24gYmluZGluZyBkZWxpbWl0ZXJcIiwgW3N0YXRlbWVudC52YWx1ZUJpbmRpbmddLCBbYCR7cGF0aH0vdmFsdWVCaW5kaW5nYF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmJvZHksIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2JvZHlgKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcImVuZFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5ib2R5LCBwYXRoOiBgJHtwYXRofS9ib2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoTWFwU3RhdGVtZW50XCIpIHtcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5tYXAsIGAke3BhdGh9L21hcGAsIFwicnVieVwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIubWFwcGVkKFwiLmVhY2hcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwibWFwIGxvb3Agc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJkb1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5ib2R5LCBwYXRoOiBgJHtwYXRofS9ib2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiB8XCIsIFwibWFwIGl0ZXJhdGlvbiBiaW5kaW5nIGRlbGltaXRlclwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LmtleUJpbmRpbmcubmFtZSwge1xuICAgICAgbWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LmtleUJpbmRpbmcsIHBhdGg6IGAke3BhdGh9L2tleUJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiwgXCIsIFwibWFwIGl0ZXJhdGlvbiBiaW5kaW5nIHNlcGFyYXRvclwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LnZhbHVlQmluZGluZy5uYW1lLCB7XG4gICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLCBwYXRoOiBgJHtwYXRofS92YWx1ZUJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcInxcXG5cIiwgXCJtYXAgaXRlcmF0aW9uIGJpbmRpbmcgZGVsaW1pdGVyXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmJvZHksIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2JvZHlgKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcImVuZFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5ib2R5LCBwYXRoOiBgJHtwYXRofS9ib2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSYWlzZVN0YXRlbWVudFwiKSB7XG4gICAgY29uc3QgdHlwZSA9IHN0YXRlbWVudC5lcnJvci5lcnJvclxuICAgIGNvbnN0IGVycm9yID0gd3JpdGVyLmVycm9yRm9ySWQodHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgd3JpdGVyLm1hcHBlZChcInJhaXNlXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInJhaXNlIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKHdyaXRlci5lcnJvck5hbWVGb3JJZCh0eXBlLmRlY2xhcmF0aW9uSWQpLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbmFtZTogZXJyb3IubmFtZSwgbm9kZTogc3RhdGVtZW50LmVycm9yLCBwYXRoOiBgJHtwYXRofS9lcnJvcmAsIHJvbGU6IFwidHlwZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJlcnJvciBtZXNzYWdlIHNlcGFyYXRvclwiLCBbc3RhdGVtZW50LmVycm9yXSwgW2Ake3BhdGh9L2Vycm9yYF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXJyb3IubWVzc2FnZSwgYCR7cGF0aH0vZXJyb3IvbWVzc2FnZWAsIFwicnVieVwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlRyeVN0YXRlbWVudFwiKSB7XG4gICAgY29uc3QgY2F1Z2h0ID0gd3JpdGVyLmVycm9yRm9ySWQoc3RhdGVtZW50LmNhdGNoVHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgd3JpdGVyLm1hcHBlZChcImJlZ2luXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIHN0YXRlbWVudC5ib2R5LCBgJHtpbmRlbnR9ICBgLCBgJHtwYXRofS9ib2R5YClcbiAgICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJyZXNjdWVcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGgsIHJvbGU6IFwiY2F0Y2hcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJyZXNjdWUgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQod3JpdGVyLmVycm9yTmFtZUZvcklkKHN0YXRlbWVudC5jYXRjaFR5cGUuZGVjbGFyYXRpb25JZCksIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBuYW1lOiBjYXVnaHQubmFtZSwgbm9kZTogc3RhdGVtZW50LmNhdGNoVHlwZSwgcGF0aDogYCR7cGF0aH0vY2F0Y2hUeXBlYCwgcm9sZTogXCJ0eXBlXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgPT4gXCIsIFwiY2F0Y2ggYmluZGluZyBzZXBhcmF0b3JcIiwgW3N0YXRlbWVudC5jYXRjaEJpbmRpbmddLCBbYCR7cGF0aH0vY2F0Y2hCaW5kaW5nYF0pXG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLCBwYXRoOiBgJHtwYXRofS9jYXRjaEJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuY2F0Y2hCb2R5LCBgJHtpbmRlbnR9ICBgLCBgJHtwYXRofS9jYXRjaEJvZHlgKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcImVuZFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5jYXRjaEJvZHksIHBhdGg6IGAke3BhdGh9L2NhdGNoQm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIpIHtcbiAgICB3cml0ZXIubWFwcGVkKFwicmV0dXJuXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24pIHtcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwicmV0dXJuIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBcInJ1YnlcIiwgaWRlbnRpdHkpXG4gICAgfVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSB7XG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIFwicnVieVwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIpIHtcbiAgICB3cml0ZXIubWFwcGVkKFwicHV0c1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJwcmludCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIFwicnVieVwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIHdyaXRlci5tYXBwZWQoXCJpZlwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiY29uZGl0aW9uYWwgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5jb25kaXRpb24sIGAke3BhdGh9L2NvbmRpdGlvbmAsIFwicnVieVwiLCBpZGVudGl0eSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmNvbnNlcXVlbnQsIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2NvbnNlcXVlbnRgKVxuICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkge1xuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcImVsc2VcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmFsdGVybmF0ZSwgYCR7aW5kZW50fSAgYCwgYCR7cGF0aH0vYWx0ZXJuYXRlYClcbiAgfVxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICB3cml0ZXIubWFwcGVkKFwiZW5kXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgUnVieSBsb2NhbCBzdGF0ZW1lbnQgd2l0aCBleGFjdCBTZW1hbnRpZm9sZCBwcm9maWxlIG1ldGFkYXRhLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkxvY2FsU3RhdGVtZW50fSBzdGF0ZW1lbnQgLSBMb2NhbCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gTGVhZGluZyBpbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZW1lbnRQYXRoIC0gRXhhY3QgSlNPTiBQb2ludGVyIGZvciB0aGlzIHN0YXRlbWVudCBvY2N1cnJlbmNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVtaXRMb2NhbCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBzdGF0ZW1lbnRQYXRoKSB7XG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG5cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQudGFyZ2V0LCBwYXRoOiBgJHtzdGF0ZW1lbnRQYXRofS90YXJnZXRgLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiPVwiLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm9wZXJhdG9yXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7c3RhdGVtZW50UGF0aH0vZXhwcmVzc2lvbmAsIFwicnVieVwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICAgIHJldHVyblxuICB9XG5cbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiMgQHR5cGUgW1wiLCBcIlJ1YnkgbG9jYWwgdHlwZSBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICBlbWl0VHlwZSh3cml0ZXIsIHN0YXRlbWVudC50eXBlLCBgJHtzdGF0ZW1lbnRQYXRofS90eXBlYCwgXCJydWJ5XCIpXG4gIHdyaXRlci5zeW50aGV0aWMoXCJdXFxuXCIsIFwiUnVieSBsb2NhbCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIGlmICghc3RhdGVtZW50Lm11dGFibGUpIHtcbiAgICB3cml0ZXIuc3ludGhldGljKGAke2luZGVudH0jIEBzZW1hbnRpZm9sZC1pbW11dGFibGVcXG5gLCBcIlJ1YnkgaW1tdXRhYmlsaXR5IHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIH1cbiAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImFzc2lnbm1lbnQgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB3cml0ZXIubWFwcGVkKFwiPVwiLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm9wZXJhdG9yXCJ9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImFzc2lnbm1lbnQgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5pbml0aWFsaXplciwgYCR7c3RhdGVtZW50UGF0aH0vaW5pdGlhbGl6ZXJgLCBcInJ1YnlcIiwgaWRlbnRpdHkpXG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG59XG5cbi8qKlxuICogUmV0dXJucyBhbiB1bmNoYW5nZWQgUnVieSBpZGVudGlmaWVyLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBJZGVudGlmaWVyLlxuICogQHJldHVybnMge3N0cmluZ30gSWRlbnRpZmllci5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkobmFtZSkge1xuICByZXR1cm4gbmFtZVxufVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Qualified edition-2021 support. Every token is checked by the Rust frontend before collapse. */
|
|
2
|
+
export declare const rustRuntime = "#![allow(dead_code, unused_variables, unused_mut, unused_assignments, unused_parens, unconditional_recursion, non_snake_case)]\nfn semantifold_print_integer(value: i64) { println!(\"{}\", value); }\nfn semantifold_print_boolean(value: bool) { println!(\"{}\", value); }\nfn semantifold_print_string(value: String) { println!(\"{}\", value); }\nfn semantifold_integer_add(left: i64, right: i64) -> i64 {\n let (result, overflow): (i64, bool) = left.overflowing_add(right);\n if overflow { eprintln!(\"semantifold: integer overflow\"); std::process::exit(70); }\n return result;\n}\nfn semantifold_integer_subtract(left: i64, right: i64) -> i64 {\n let (result, overflow): (i64, bool) = left.overflowing_sub(right);\n if overflow { eprintln!(\"semantifold: integer overflow\"); std::process::exit(70); }\n return result;\n}\nfn semantifold_integer_multiply(left: i64, right: i64) -> i64 {\n let (result, overflow): (i64, bool) = left.overflowing_mul(right);\n if overflow { eprintln!(\"semantifold: integer overflow\"); std::process::exit(70); }\n return result;\n}\nfn semantifold_integer_negate(value: i64) -> i64 {\n let (result, overflow): (i64, bool) = value.overflowing_neg();\n if overflow { eprintln!(\"semantifold: integer overflow\"); std::process::exit(70); }\n return result;\n}\n";
|
|
3
|
+
/** Actual manifest qualified with Cargo 1.98.1 on Ubuntu 24.04 and 26.04. */
|
|
4
|
+
export declare const rustManifest = "[package]\nname = \"semantifold-generated\"\nversion = \"0.0.0\"\nedition = \"2021\"\nrust-version = \"1.98.1\"\npublish = false\nbuild = false\n\n[profile.dev]\noverflow-checks = true\npanic = \"abort\"\n\n[profile.release]\noverflow-checks = true\npanic = \"abort\"\n";
|
|
5
|
+
/** Cargo-generated bytes, SHA-256 185a41f6648ef49c8e7721f3321604abf05fae11c7007f823121c17fe48eec64. */
|
|
6
|
+
export declare const rustLockfile = "# This file is automatically @generated by Cargo.\n# It is not intended for manual editing.\nversion = 4\n\n[[package]]\nname = \"semantifold-generated\"\nversion = \"0.0.0\"\n";
|
|
7
|
+
//# sourceMappingURL=rust-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rust-runtime.d.ts","sourceRoot":"","sources":["../../../src/backends/rust-runtime.js"],"names":[],"mappings":"AAEA,mGAAmG;AACnG,eAAO,MAAM,WAAW,mzCAwBvB,CAAA;AAED,6EAA6E;AAC7E,eAAO,MAAM,YAAY,kRAAsQ,CAAA;AAE/R,uGAAuG;AACvG,eAAO,MAAM,YAAY,qLAAiL,CAAA"}
|