semantifold 0.4.0 → 0.6.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 +13 -7
- package/build/index.d.ts +12 -8
- package/build/index.d.ts.map +1 -1
- package/build/index.js +10 -7
- 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 +1278 -0
- package/build/src/backends/identifiers.d.ts +6 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +30 -1
- package/build/src/backends/ios.js +2 -2
- package/build/src/backends/kotlin.d.ts +10 -0
- package/build/src/backends/kotlin.d.ts.map +1 -1
- package/build/src/backends/kotlin.js +11 -9
- 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/program.d.ts +6 -4
- package/build/src/backends/program.d.ts.map +1 -1
- package/build/src/backends/program.js +5 -4
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +2 -1
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +20 -4
- package/build/src/backends/writer.d.ts +21 -1
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +25 -2
- package/build/src/backends/zig-runtime.d.ts +5 -0
- package/build/src/backends/zig-runtime.d.ts.map +1 -0
- package/build/src/backends/zig-runtime.js +92 -0
- package/build/src/backends/zig-validation.d.ts +9 -0
- package/build/src/backends/zig-validation.d.ts.map +1 -0
- package/build/src/backends/zig-validation.js +73 -0
- package/build/src/backends/zig.d.ts +42 -0
- package/build/src/backends/zig.d.ts.map +1 -0
- package/build/src/backends/zig.js +584 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +2 -1
- package/build/src/frontends/zig-parser.d.ts +31 -0
- package/build/src/frontends/zig-parser.d.ts.map +1 -0
- package/build/src/frontends/zig-parser.js +17 -0
- package/build/src/frontends/zig.d.ts +14 -0
- package/build/src/frontends/zig.d.ts.map +1 -0
- package/build/src/frontends/zig.js +970 -0
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +40 -1
- package/build/src/mapping.js +2 -2
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +184 -4
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +45 -3
- package/build/src/semantic/validate.js +2 -2
- package/build/src/toolchains.d.ts +6 -0
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +2 -1
- package/build/src/zig-bindings.d.ts +10 -0
- package/build/src/zig-bindings.d.ts.map +1 -0
- package/build/src/zig-bindings.js +54 -0
- package/docs/android.md +79 -0
- package/docs/architecture.md +13 -5
- package/docs/goals.md +1 -1
- package/docs/ios.md +1 -1
- package/docs/language-support.md +15 -4
- package/docs/parser-qualification.md +31 -1
- package/docs/source-maps.md +7 -3
- package/docs/specification.md +5 -0
- package/docs/testing.md +40 -3
- package/docs/zig.md +33 -0
- package/index.js +9 -6
- package/node_modules/semantifold-tree-sitter-zig-internal/LICENSE +15 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/README.md +5 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/README.md +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/binding.gyp +29 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/grammar.js +900 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/package.json +57 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/darwin-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/darwin-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/linux-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/linux-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/win32-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/win32-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/folds.scm +23 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/highlights.scm +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/indents.scm +22 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/injections.scm +10 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/grammar.json +6570 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/node-types.json +3178 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/parser.c +169829 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/array.h +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/tree-sitter-zig.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/tree-sitter.json +38 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/README.md +128 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/binding.gyp +80 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/index.js +916 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/package.json +76 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/language.cc +106 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/node.cc +1088 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/parser.cc +306 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/query.cc +397 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/query.h +40 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree.cc +316 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/tree-sitter.d.ts +1042 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1318 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +223 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +297 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +435 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +920 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2165 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +206 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4187 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +130 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1066 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +712 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +83 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1302 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1859 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/package.json +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/src/zig.js +134 -0
- package/package.json +11 -6
- package/src/backends/android.js +1374 -0
- package/src/backends/identifiers.js +30 -0
- package/src/backends/ios.js +1 -1
- package/src/backends/kotlin.js +11 -8
- package/src/backends/native-validation.js +1 -1
- package/src/backends/program.js +4 -3
- package/src/backends/scalars.js +1 -0
- package/src/backends/shared.js +22 -3
- package/src/backends/writer.js +27 -2
- package/src/backends/zig-runtime.js +93 -0
- package/src/backends/zig-validation.js +68 -0
- package/src/backends/zig.js +579 -0
- package/src/frontends/scalars.js +1 -0
- package/src/frontends/zig-parser.js +20 -0
- package/src/frontends/zig.js +994 -0
- package/src/language-registry.js +40 -0
- package/src/mapping.js +1 -1
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +47 -2
- package/src/semantic/validate.js +1 -1
- package/src/toolchains.js +1 -0
- package/src/zig-bindings.js +46 -0
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { unsupportedCapability } from "../diagnostic.js";
|
|
4
|
+
import { finalizeMapping, toSourceMapV3 } from "../mapping.js";
|
|
5
|
+
import { parseZigCst } from "../frontends/zig-parser.js";
|
|
6
|
+
import { validateNativeGraph } from "./native-validation.js";
|
|
7
|
+
import { emitScalarType } from "./scalars.js";
|
|
8
|
+
import { validateBackendModule } from "./shared.js";
|
|
9
|
+
import { SourceWriter } from "./writer.js";
|
|
10
|
+
import { zigBuild, zigRuntime } from "./zig-runtime.js";
|
|
11
|
+
import { maximumZigSourceLength, validateZigValues } from "./zig-validation.js";
|
|
12
|
+
import { collectZigBindingUsage } from "../zig-bindings.js";
|
|
13
|
+
/** @typedef {import("../semantic/types.js").SemanticModule} SemanticModule */
|
|
14
|
+
/** @typedef {import("../semantic/types.js").SemanticNode} SemanticNode */
|
|
15
|
+
/** @typedef {import("../semantic/types.js").Expression} Expression */
|
|
16
|
+
/** @typedef {import("../semantic/types.js").Statement} Statement */
|
|
17
|
+
/** @typedef {import("../semantic/types.js").FunctionReturnTypeName} Scalar */
|
|
18
|
+
/** @typedef {{expression: Expression, path: string, type: Scalar, name?: string}} ZigPlannedValue */
|
|
19
|
+
/** @typedef {{result: ZigPlannedValue, operands: ZigPlannedValue[], rightSteps?: ZigPlannedStep[]}} ZigPlannedStep */
|
|
20
|
+
/** @typedef {{id: string, steps: ZigPlannedStep[], terminal?: ZigPlannedStep, value?: ZigPlannedValue}} ZigStatementPlan */
|
|
21
|
+
const operators = new Map([
|
|
22
|
+
["IntegerAdd", "semantifold_integer_add"], ["IntegerSubtract", "semantifold_integer_subtract"],
|
|
23
|
+
["IntegerMultiply", "semantifold_integer_multiply"], ["IntegerEqual", "=="], ["IntegerNotEqual", "!="],
|
|
24
|
+
["IntegerLessThan", "<"], ["IntegerLessThanOrEqual", "<="], ["IntegerGreaterThan", ">"], ["IntegerGreaterThanOrEqual", ">="],
|
|
25
|
+
["BooleanEqual", "=="], ["BooleanNotEqual", "!="], ["BooleanAnd", "and"], ["BooleanOr", "or"],
|
|
26
|
+
["StringConcat", "semantifold_string_concat"], ["StringEqual", "semantifold_string_equal"],
|
|
27
|
+
["StringNotEqual", "semantifold_string_not_equal"]
|
|
28
|
+
]);
|
|
29
|
+
/** Plans scalar operations by occurrence without rewriting caller-owned semantic values. */
|
|
30
|
+
class ZigExpressionPlanner {
|
|
31
|
+
/**
|
|
32
|
+
* Creates a planner for one validated scalar module.
|
|
33
|
+
* @param {SemanticModule} module - Validated module.
|
|
34
|
+
*/
|
|
35
|
+
constructor(module) {
|
|
36
|
+
this.functions = new Map(module.functions.map(declaration => [declaration.name, zigType(declaration.returnType, declaration.location)]));
|
|
37
|
+
this.nextTemporary = 1;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolves one already-validated expression type.
|
|
41
|
+
* @param {Expression} expression - Expression occurrence.
|
|
42
|
+
* @param {Map<string, Scalar>} bindings - Visible scalar bindings.
|
|
43
|
+
* @returns {Scalar} Exact result type.
|
|
44
|
+
*/
|
|
45
|
+
type(expression, bindings) {
|
|
46
|
+
if (expression.kind == "IntegerLiteral")
|
|
47
|
+
return "integer";
|
|
48
|
+
if (expression.kind == "BooleanLiteral")
|
|
49
|
+
return "boolean";
|
|
50
|
+
if (expression.kind == "StringLiteral")
|
|
51
|
+
return "string";
|
|
52
|
+
if (expression.kind == "UnaryExpression" || expression.kind == "BinaryExpression")
|
|
53
|
+
return expression.type;
|
|
54
|
+
if (expression.kind != "CallExpression" && expression.kind != "IdentifierExpression") {
|
|
55
|
+
return unsupportedCapability("zig", "collection expression reached scalar planning", expression.location);
|
|
56
|
+
}
|
|
57
|
+
const type = expression.kind == "CallExpression" ? this.functions.get(expression.callee) : bindings.get(expression.name);
|
|
58
|
+
if (!type)
|
|
59
|
+
return unsupportedCapability("zig", "unresolved expression type", expression.location);
|
|
60
|
+
return type;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Plans one value expression in semantic left-to-right order.
|
|
64
|
+
* @param {Expression} expression - Expression occurrence.
|
|
65
|
+
* @param {string} path - Canonical occurrence path.
|
|
66
|
+
* @param {Map<string, Scalar>} bindings - Visible scalar bindings.
|
|
67
|
+
* @param {ZigPlannedStep[]} steps - Ordered enclosing prelude.
|
|
68
|
+
* @returns {ZigPlannedValue} Pure final value.
|
|
69
|
+
*/
|
|
70
|
+
plan(expression, path, bindings, steps) {
|
|
71
|
+
const result = { expression, path, type: this.type(expression, bindings) };
|
|
72
|
+
if (!["CallExpression", "UnaryExpression", "BinaryExpression"].includes(expression.kind))
|
|
73
|
+
return result;
|
|
74
|
+
const operands = [];
|
|
75
|
+
/** @type {ZigPlannedStep[] | undefined} */
|
|
76
|
+
let rightSteps;
|
|
77
|
+
if (expression.kind == "CallExpression") {
|
|
78
|
+
for (const [index, argument] of expression.arguments.entries())
|
|
79
|
+
operands.push(this.plan(argument, `${path}/arguments/${index}`, bindings, steps));
|
|
80
|
+
}
|
|
81
|
+
else if (expression.kind == "UnaryExpression")
|
|
82
|
+
operands.push(this.plan(expression.operand, `${path}/operand`, bindings, steps));
|
|
83
|
+
else if (expression.kind == "BinaryExpression") {
|
|
84
|
+
operands.push(this.plan(expression.left, `${path}/left`, bindings, steps));
|
|
85
|
+
if (expression.operation == "BooleanAnd" || expression.operation == "BooleanOr") {
|
|
86
|
+
const planned = { ...result, name: this.allocate(expression) };
|
|
87
|
+
rightSteps = [];
|
|
88
|
+
operands.push(this.plan(expression.right, `${path}/right`, bindings, rightSteps));
|
|
89
|
+
steps.push({ operands, result: planned, rightSteps });
|
|
90
|
+
return planned;
|
|
91
|
+
}
|
|
92
|
+
operands.push(this.plan(expression.right, `${path}/right`, bindings, steps));
|
|
93
|
+
}
|
|
94
|
+
if (result.type == "void")
|
|
95
|
+
throw new Error("Void Zig call reached value planning.");
|
|
96
|
+
const planned = { ...result, name: this.allocate(expression) };
|
|
97
|
+
steps.push({ operands, result: planned });
|
|
98
|
+
return planned;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Plans the arguments of one terminal void call without inventing a void temporary.
|
|
102
|
+
* @param {Expression} expression - Terminal expression occurrence.
|
|
103
|
+
* @param {string} path - Canonical occurrence path.
|
|
104
|
+
* @param {Map<string, Scalar>} bindings - Visible scalar bindings.
|
|
105
|
+
* @param {ZigPlannedStep[]} steps - Ordered enclosing prelude.
|
|
106
|
+
* @returns {ZigPlannedStep} Terminal direct-call step.
|
|
107
|
+
*/
|
|
108
|
+
terminal(expression, path, bindings, steps) {
|
|
109
|
+
if (expression.kind != "CallExpression" || this.type(expression, bindings) != "void") {
|
|
110
|
+
throw new Error("Non-void expression reached Zig terminal-call planning.");
|
|
111
|
+
}
|
|
112
|
+
const result = { expression, path, type: /** @type {const} */ ("void") };
|
|
113
|
+
const operands = expression.arguments.map((argument, index) => this.plan(argument, `${path}/arguments/${index}`, bindings, steps));
|
|
114
|
+
return { operands, result };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Allocates one bounded deterministic occurrence name.
|
|
118
|
+
* @param {Expression} expression - Related semantic occurrence.
|
|
119
|
+
* @returns {string} Reserved occurrence name.
|
|
120
|
+
*/
|
|
121
|
+
allocate(expression) {
|
|
122
|
+
if (this.nextTemporary > 999999)
|
|
123
|
+
return unsupportedCapability("zig", "ordered-expression occurrence limit", expression.location);
|
|
124
|
+
return `semantifold_ordered_${String(this.nextTemporary++).padStart(6, "0")}`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Plans every Zig statement before writer construction or artifact exposure.
|
|
129
|
+
* @param {SemanticModule} module - Validated module.
|
|
130
|
+
* @returns {Map<string, ZigStatementPlan>} Plans by semantic occurrence path.
|
|
131
|
+
*/
|
|
132
|
+
function planZigModule(module) {
|
|
133
|
+
const planner = new ZigExpressionPlanner(module);
|
|
134
|
+
/** @type {Map<string, ZigStatementPlan>} */
|
|
135
|
+
const plans = new Map();
|
|
136
|
+
/**
|
|
137
|
+
* Plans one lexical block with independent branch environments.
|
|
138
|
+
* @param {import("../semantic/types.js").Block} block - Block to plan.
|
|
139
|
+
* @param {string} path - Canonical block path.
|
|
140
|
+
* @param {Map<string, Scalar>} inherited - Visible scalar bindings.
|
|
141
|
+
*/
|
|
142
|
+
const visit = (block, path, inherited) => {
|
|
143
|
+
const bindings = new Map(inherited);
|
|
144
|
+
block.statements.forEach((statement, index) => {
|
|
145
|
+
const statementPath = `${path}/statements/${index}`;
|
|
146
|
+
const field = statement.kind == "IfStatement" ? "condition" : statement.kind == "LocalDeclaration" ? "initializer" : "expression";
|
|
147
|
+
const expression = statement.kind == "IfStatement" ? statement.condition : statement.kind == "LocalDeclaration" ? statement.initializer :
|
|
148
|
+
statement.kind == "AssignmentStatement" || statement.kind == "ExpressionStatement" || statement.kind == "PrintStatement" ? statement.expression :
|
|
149
|
+
statement.kind == "ReturnStatement" ? statement.expression : undefined;
|
|
150
|
+
/** @type {ZigPlannedStep[]} */
|
|
151
|
+
const steps = [];
|
|
152
|
+
/** @type {ZigStatementPlan} */
|
|
153
|
+
const plan = { id: String(plans.size + 1).padStart(6, "0"), steps };
|
|
154
|
+
if (statement.kind == "ExpressionStatement")
|
|
155
|
+
plan.terminal = planner.terminal(statement.expression, `${statementPath}/${field}`, bindings, steps);
|
|
156
|
+
else if (expression)
|
|
157
|
+
plan.value = planner.plan(expression, `${statementPath}/${field}`, bindings, steps);
|
|
158
|
+
plans.set(statementPath, plan);
|
|
159
|
+
if (statement.kind == "LocalDeclaration")
|
|
160
|
+
bindings.set(statement.name, zigType(statement.type, statement.location));
|
|
161
|
+
if (statement.kind == "IfStatement") {
|
|
162
|
+
visit(statement.consequent, `${statementPath}/consequent`, bindings);
|
|
163
|
+
if (statement.alternate)
|
|
164
|
+
visit(statement.alternate, `${statementPath}/alternate`, bindings);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
module.functions.forEach((declaration, index) => visit(declaration.body, `/functions/${index}/body`, new Map(declaration.parameters.map(parameter => [parameter.name, zigType(parameter.type, parameter.location)]))));
|
|
169
|
+
visit(module.entryPoint.body, "/entryPoint/body", new Map());
|
|
170
|
+
return plans;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Binds an ordered region to its exact semantic consumer and expression.
|
|
174
|
+
* @param {Statement} statement - Semantic statement occurrence.
|
|
175
|
+
* @returns {string} Stable scaffold signature.
|
|
176
|
+
*/
|
|
177
|
+
function zigStatementSignature(statement) {
|
|
178
|
+
const consumer = statement.kind == "LocalDeclaration" ? [statement.kind, statement.name,
|
|
179
|
+
zigType(statement.type, statement.location), statement.mutable] :
|
|
180
|
+
statement.kind == "AssignmentStatement" ? [statement.kind, statement.target.name] : [statement.kind];
|
|
181
|
+
const expression = statement.kind == "IfStatement" ? statement.condition : statement.kind == "LocalDeclaration" ? statement.initializer :
|
|
182
|
+
statement.kind == "AssignmentStatement" || statement.kind == "ExpressionStatement" || statement.kind == "PrintStatement" ? statement.expression :
|
|
183
|
+
statement.kind == "ReturnStatement" ? statement.expression : undefined;
|
|
184
|
+
return createHash("sha256").update(JSON.stringify([consumer, expression ? zigExpressionSignature(expression) : null])).digest("hex");
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Serializes only the closed semantic expression fields.
|
|
188
|
+
* @param {Expression} expression - Closed scalar expression.
|
|
189
|
+
* @returns {unknown[]} Stable signature data.
|
|
190
|
+
*/
|
|
191
|
+
function zigExpressionSignature(expression) {
|
|
192
|
+
if (expression.kind == "IdentifierExpression")
|
|
193
|
+
return [expression.kind, expression.name];
|
|
194
|
+
if (expression.kind == "IntegerLiteral" || expression.kind == "BooleanLiteral" || expression.kind == "StringLiteral") {
|
|
195
|
+
return [expression.kind, expression.value];
|
|
196
|
+
}
|
|
197
|
+
if (expression.kind == "CallExpression")
|
|
198
|
+
return [expression.kind, expression.callee, ...expression.arguments.map(zigExpressionSignature)];
|
|
199
|
+
if (expression.kind == "UnaryExpression")
|
|
200
|
+
return [expression.kind, expression.operation, expression.type, zigExpressionSignature(expression.operand)];
|
|
201
|
+
if (expression.kind == "BinaryExpression") {
|
|
202
|
+
return [expression.kind, expression.operation, expression.type, zigExpressionSignature(expression.left), zigExpressionSignature(expression.right)];
|
|
203
|
+
}
|
|
204
|
+
return [expression.kind];
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Produces a deterministic dependency-free Zig 0.15.2 native project after complete preflight.
|
|
208
|
+
* @param {{filename?: string, mapDirective?: unknown, module: SemanticModule, sourceMapFilename?: unknown, sources?: {filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]}} input - Artifact request.
|
|
209
|
+
* @returns {{artifacts: import("../semantic/types.js").GeneratedSetArtifact[], target: string}} Candidate project.
|
|
210
|
+
*/
|
|
211
|
+
export function generateZigProject({ filename, mapDirective, module, sourceMapFilename, sources }) {
|
|
212
|
+
validateNativeGraph(module, "zig");
|
|
213
|
+
validateBackendModule(module, "zig");
|
|
214
|
+
validateZigValues(module);
|
|
215
|
+
if (filename !== undefined && filename != "src/main.zig")
|
|
216
|
+
unsupportedCapability("zig", "artifact filename other than src/main.zig", module.location);
|
|
217
|
+
if (mapDirective !== undefined || sourceMapFilename !== undefined)
|
|
218
|
+
unsupportedCapability("zig", "source-map filename or directive option", module.location);
|
|
219
|
+
new ZigEmitter(module).program(module);
|
|
220
|
+
const writer = new SourceWriter({ filename: "src/main.zig", language: "zig", module, sources });
|
|
221
|
+
new ZigEmitter(module, writer).program(module);
|
|
222
|
+
const mapping = finalizeMapping(writer.finish());
|
|
223
|
+
validateGeneratedZig(mapping.generated.content, module.location);
|
|
224
|
+
const root = mapping.nodes.find(node => node.path == "");
|
|
225
|
+
if (!root)
|
|
226
|
+
throw new Error("Validated Zig module omitted root provenance.");
|
|
227
|
+
const origin = root.origin;
|
|
228
|
+
const relatedOrigins = origin.kind == "source" ? [{ location: origin.location, nodeId: root.id, role: "module", sourceId: origin.sourceId }] :
|
|
229
|
+
(origin.kind == "derived" ? origin.origins : origin.relatedOrigins).map(item => ({ ...item, nodeId: item.nodeId ?? root.id, role: item.role ?? "module" }));
|
|
230
|
+
return { target: "zig", artifacts: [{
|
|
231
|
+
path: "build.zig", role: "manifest", ownership: "generated", contentKind: "text", mediaType: "text/x-zig", content: zigBuild,
|
|
232
|
+
provenance: { kind: "synthetic", reason: "Fixed dependency-free Zig 0.15.2 native-host project with caller-selected Debug, ReleaseSafe, or ReleaseFast optimization.", relatedOrigins }
|
|
233
|
+
}, {
|
|
234
|
+
path: "src/main.zig", role: "entry", ownership: "generated", contentKind: "text", mediaType: "text/x-zig", content: mapping.generated.content,
|
|
235
|
+
provenance: { kind: "text", mapping, sourceMap: toSourceMapV3(mapping) }
|
|
236
|
+
}] };
|
|
237
|
+
}
|
|
238
|
+
/** Emits exact Zig support and Tasks 001-005 semantic occurrences. */
|
|
239
|
+
class ZigEmitter {
|
|
240
|
+
/**
|
|
241
|
+
* Creates a validation-only or writing emitter for one module.
|
|
242
|
+
* @param {SemanticModule} module - Validated semantic module.
|
|
243
|
+
* @param {SourceWriter} [writer] - Optional provenance-aware output writer.
|
|
244
|
+
*/
|
|
245
|
+
constructor(module, writer) {
|
|
246
|
+
this.writer = writer;
|
|
247
|
+
this.plans = planZigModule(module);
|
|
248
|
+
this.length = 0;
|
|
249
|
+
this.location = module.location;
|
|
250
|
+
this.usage = { reads: new Set(), writes: new Set() };
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Accounts for generated size before any text becomes observable.
|
|
254
|
+
* @param {string} text - Text about to be emitted.
|
|
255
|
+
* @param {SemanticNode} node - Owning semantic occurrence.
|
|
256
|
+
*/
|
|
257
|
+
checkSize(text, node) {
|
|
258
|
+
this.length += text.length;
|
|
259
|
+
if (this.length > maximumZigSourceLength)
|
|
260
|
+
unsupportedCapability("zig", "generated source exceeds the 1000000 UTF-16 input limit", "location" in node ? node.location : this.location);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Emits synthetic Zig syntax when a writer is present.
|
|
264
|
+
* @param {string} text - Text to emit.
|
|
265
|
+
* @param {SemanticNode} node - Related semantic node.
|
|
266
|
+
* @param {string} path - Canonical semantic path.
|
|
267
|
+
* @param {string} [reason] - Synthetic provenance reason.
|
|
268
|
+
*/
|
|
269
|
+
synthetic(text, node, path, reason = "Zig declaration and expression syntax") {
|
|
270
|
+
this.checkSize(text, node);
|
|
271
|
+
this.writer?.synthetic(text, reason, [node], [path]);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Emits an exact or anchored semantic occurrence when a writer is present.
|
|
275
|
+
* @param {string} text - Text to emit.
|
|
276
|
+
* @param {SemanticNode} node - Owning semantic node.
|
|
277
|
+
* @param {string} path - Canonical semantic path.
|
|
278
|
+
* @param {string} [role] - Exact parser-token role when available.
|
|
279
|
+
*/
|
|
280
|
+
mapped(text, node, path, role) {
|
|
281
|
+
this.checkSize(text, node);
|
|
282
|
+
this.writer?.mapped(text, { mappingKind: role ? "exact" : "anchor", node, path, ...(role ? { role } : {}) });
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Validates or emits the complete deterministic entry source.
|
|
286
|
+
* @param {SemanticModule} module - Semantic module to process.
|
|
287
|
+
*/
|
|
288
|
+
program(module) {
|
|
289
|
+
this.synthetic(zigRuntime, module, "", "Exact Zig arena, UTF-8, output, comparison, and checked-arithmetic support");
|
|
290
|
+
this.synthetic("// semantifold:program:zig:v1\n", module, "", "Exact generated Zig ordered-expression profile marker");
|
|
291
|
+
module.functions.forEach((declaration, index) => {
|
|
292
|
+
const path = `/functions/${index}`;
|
|
293
|
+
this.synthetic("\n", declaration, path);
|
|
294
|
+
this.mapped("fn", declaration, path);
|
|
295
|
+
this.synthetic(" ", declaration, path);
|
|
296
|
+
this.mapped(declaration.name, declaration, path, "name");
|
|
297
|
+
this.synthetic("(", declaration, path);
|
|
298
|
+
declaration.parameters.forEach((parameter, parameterIndex) => {
|
|
299
|
+
const parameterPath = `${path}/parameters/${parameterIndex}`;
|
|
300
|
+
if (parameterIndex)
|
|
301
|
+
this.synthetic(", ", parameter, parameterPath);
|
|
302
|
+
this.mapped(parameter.name, parameter, parameterPath, "name");
|
|
303
|
+
this.synthetic(": ", parameter, parameterPath);
|
|
304
|
+
this.mapped(emitScalarType("zig", parameter.type), parameter.type, `${parameterPath}/type`, "type");
|
|
305
|
+
});
|
|
306
|
+
this.synthetic(") ", declaration, path);
|
|
307
|
+
this.mapped(emitScalarType("zig", declaration.returnType), declaration.returnType, `${path}/returnType`, "type");
|
|
308
|
+
this.synthetic(" {\n", declaration, path);
|
|
309
|
+
this.usage = collectZigBindingUsage(declaration.body);
|
|
310
|
+
declaration.parameters.forEach((parameter, parameterIndex) => {
|
|
311
|
+
const parameterPath = `${path}/parameters/${parameterIndex}`;
|
|
312
|
+
if (!this.usage.reads.has(parameter.name)) {
|
|
313
|
+
this.synthetic(" _ = ", parameter, parameterPath, "Zig explicit unused-parameter scaffold");
|
|
314
|
+
this.mapped(parameter.name, parameter, parameterPath, "name");
|
|
315
|
+
this.synthetic(";\n", parameter, parameterPath, "Zig explicit unused-parameter scaffold");
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
this.block(declaration.body, `${path}/body`, " ");
|
|
319
|
+
this.synthetic("}\n", declaration, path);
|
|
320
|
+
});
|
|
321
|
+
this.usage = collectZigBindingUsage(module.entryPoint.body);
|
|
322
|
+
this.synthetic("\npub fn main() void {\n defer semantifold_arena.deinit();\n", module.entryPoint, "/entryPoint", "Zig generated entry and arena lifetime shell");
|
|
323
|
+
this.block(module.entryPoint.body, "/entryPoint/body", " ");
|
|
324
|
+
this.synthetic("}\n", module.entryPoint, "/entryPoint", "Zig generated entry shell");
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Emits one lexical block and compiler-required binding scaffolds.
|
|
328
|
+
* @param {import("../semantic/types.js").Block} block - Semantic block.
|
|
329
|
+
* @param {string} path - Canonical block path.
|
|
330
|
+
* @param {string} indent - Current output indentation.
|
|
331
|
+
*/
|
|
332
|
+
block(block, path, indent) {
|
|
333
|
+
block.statements.forEach((statement, index) => {
|
|
334
|
+
this.statement(statement, `${path}/statements/${index}`, indent);
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Emits one complete paired ordered region and its pure final consumer.
|
|
339
|
+
* @param {import("../semantic/types.js").Statement} statement - Statement to emit.
|
|
340
|
+
* @param {string} path - Canonical statement path.
|
|
341
|
+
* @param {string} indent - Current output indentation.
|
|
342
|
+
*/
|
|
343
|
+
statement(statement, path, indent) {
|
|
344
|
+
const plan = this.plans.get(path);
|
|
345
|
+
if (!plan)
|
|
346
|
+
throw new Error("Missing validated Zig statement plan.");
|
|
347
|
+
const marker = "semantifold:ordered-expression:zig:v1";
|
|
348
|
+
const signature = zigStatementSignature(statement);
|
|
349
|
+
this.synthetic(`${indent}// ${marker} begin ${plan.id} ${signature}\n`, statement, path, "Zig ordered-expression region marker");
|
|
350
|
+
this.steps(plan.steps, indent);
|
|
351
|
+
this.synthetic(indent, statement, path, "indentation");
|
|
352
|
+
if (statement.kind == "LocalDeclaration") {
|
|
353
|
+
this.mapped(statement.mutable ? "var" : "const", statement, path);
|
|
354
|
+
this.synthetic(" ", statement, path);
|
|
355
|
+
this.mapped(statement.name, statement, path, "name");
|
|
356
|
+
this.synthetic(": ", statement, path);
|
|
357
|
+
this.mapped(emitScalarType("zig", statement.type), statement.type, `${path}/type`, "type");
|
|
358
|
+
this.synthetic(" ", statement, path);
|
|
359
|
+
this.mapped("=", statement, path, "operator");
|
|
360
|
+
this.synthetic(" ", statement, path);
|
|
361
|
+
this.value(requiredPlanValue(plan, statement));
|
|
362
|
+
}
|
|
363
|
+
else if (statement.kind == "AssignmentStatement") {
|
|
364
|
+
this.mapped(statement.target.name, statement.target, `${path}/target`, "name");
|
|
365
|
+
this.synthetic(" ", statement, path);
|
|
366
|
+
this.mapped("=", statement, path, "operator");
|
|
367
|
+
this.synthetic(" ", statement, path);
|
|
368
|
+
this.value(requiredPlanValue(plan, statement));
|
|
369
|
+
}
|
|
370
|
+
else if (statement.kind == "ReturnStatement") {
|
|
371
|
+
this.mapped("return", statement, path);
|
|
372
|
+
if (statement.expression) {
|
|
373
|
+
this.synthetic(" ", statement, path);
|
|
374
|
+
this.value(requiredPlanValue(plan, statement));
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
else if (statement.kind == "PrintStatement") {
|
|
378
|
+
const value = requiredPlanValue(plan, statement);
|
|
379
|
+
this.mapped(`semantifold_print_${value.type}`, statement, path);
|
|
380
|
+
this.synthetic("(", statement, path);
|
|
381
|
+
this.value(value);
|
|
382
|
+
this.synthetic(")", statement, path);
|
|
383
|
+
}
|
|
384
|
+
else if (statement.kind == "ExpressionStatement") {
|
|
385
|
+
if (!plan.terminal)
|
|
386
|
+
throw new Error("Missing validated Zig terminal call.");
|
|
387
|
+
this.operation(plan.terminal);
|
|
388
|
+
}
|
|
389
|
+
else if (statement.kind == "IfStatement") {
|
|
390
|
+
this.mapped("if", statement, path);
|
|
391
|
+
this.synthetic(" (", statement, path);
|
|
392
|
+
this.value(requiredPlanValue(plan, statement));
|
|
393
|
+
this.synthetic(") {\n", statement, path);
|
|
394
|
+
this.block(statement.consequent, `${path}/consequent`, indent + " ");
|
|
395
|
+
this.synthetic(indent + "}", statement, path);
|
|
396
|
+
if (statement.alternate) {
|
|
397
|
+
this.mapped(" else", statement, path);
|
|
398
|
+
this.synthetic(" {\n", statement, path);
|
|
399
|
+
this.block(statement.alternate, `${path}/alternate`, indent + " ");
|
|
400
|
+
this.synthetic(indent + "}", statement, path);
|
|
401
|
+
}
|
|
402
|
+
this.synthetic("\n", statement, path);
|
|
403
|
+
}
|
|
404
|
+
else
|
|
405
|
+
throw new TypeError("Unsupported Zig statement reached emission after preflight.");
|
|
406
|
+
if (statement.kind != "IfStatement")
|
|
407
|
+
this.synthetic(";\n", statement, path);
|
|
408
|
+
if (statement.kind == "LocalDeclaration") {
|
|
409
|
+
const unmutated = statement.mutable && !this.usage.writes.has(statement.name);
|
|
410
|
+
const unread = !statement.mutable && !this.usage.reads.has(statement.name);
|
|
411
|
+
if (unmutated || unread) {
|
|
412
|
+
this.synthetic(indent + "_ = ", statement, path, "Zig explicit local binding scaffold");
|
|
413
|
+
if (unmutated)
|
|
414
|
+
this.synthetic("&", statement, path, "Zig explicit unmutated-var scaffold");
|
|
415
|
+
this.mapped(statement.name, statement, path, "name");
|
|
416
|
+
this.synthetic(";\n", statement, path, "Zig explicit local binding scaffold");
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
this.synthetic(`${indent}// ${marker} end ${plan.id} ${signature}\n`, statement, path, "Zig ordered-expression region marker");
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Emits eager steps in semantic order and keeps a Boolean RHS conditional.
|
|
423
|
+
* @param {ZigPlannedStep[]} steps - Ordered private steps.
|
|
424
|
+
* @param {string} indent - Current indentation.
|
|
425
|
+
*/
|
|
426
|
+
steps(steps, indent) {
|
|
427
|
+
for (const step of steps) {
|
|
428
|
+
const { expression, path, name, type } = step.result;
|
|
429
|
+
if (!name || type == "void")
|
|
430
|
+
throw new Error("Invalid Zig ordered value step.");
|
|
431
|
+
this.synthetic(`${indent}${step.rightSteps ? "var" : "const"} ${name}: ${emitScalarType("zig", { kind: "TypeReference", name: type })} = `, expression, path, "Zig typed ordered-expression temporary");
|
|
432
|
+
if (step.rightSteps) {
|
|
433
|
+
this.value(step.operands[0]);
|
|
434
|
+
this.synthetic(`;\n${indent}if (`, expression, path, "Zig conditional ordered-expression RHS");
|
|
435
|
+
if (expression.kind != "BinaryExpression")
|
|
436
|
+
throw new Error("Invalid Zig conditional ordered plan.");
|
|
437
|
+
this.synthetic(`${expression.operation == "BooleanOr" ? "!" : ""}${name}) {\n`, expression, path, "Zig conditional ordered-expression RHS");
|
|
438
|
+
this.steps(step.rightSteps, indent + " ");
|
|
439
|
+
this.synthetic(`${indent} ${name} = ${name} `, expression, path, "Zig conditional ordered-expression result");
|
|
440
|
+
this.mapped(expression.operation == "BooleanOr" ? "or" : "and", expression, path, "operator");
|
|
441
|
+
this.synthetic(" ", expression, path);
|
|
442
|
+
this.value(step.operands[1]);
|
|
443
|
+
this.synthetic(`;\n${indent}}\n`, expression, path, "Zig conditional ordered-expression RHS");
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
this.operation(step);
|
|
447
|
+
this.synthetic(";\n", expression, path);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Emits one operation whose operands are already pure.
|
|
453
|
+
* @param {ZigPlannedStep} step - Planned operation.
|
|
454
|
+
*/
|
|
455
|
+
operation({ result: { expression, path }, operands }) {
|
|
456
|
+
if (expression.kind == "CallExpression") {
|
|
457
|
+
this.mapped(expression.callee, expression, path, "callee");
|
|
458
|
+
this.synthetic("(", expression, path);
|
|
459
|
+
operands.forEach((operand, index) => {
|
|
460
|
+
if (index)
|
|
461
|
+
this.synthetic(", ", expression, path);
|
|
462
|
+
this.value(operand);
|
|
463
|
+
});
|
|
464
|
+
this.synthetic(")", expression, path);
|
|
465
|
+
}
|
|
466
|
+
else if (expression.kind == "UnaryExpression") {
|
|
467
|
+
this.mapped(expression.operation == "IntegerNegate" ? "semantifold_integer_negate" : "!", expression, path, "operator");
|
|
468
|
+
this.synthetic("(", expression, path);
|
|
469
|
+
this.value(operands[0]);
|
|
470
|
+
this.synthetic(")", expression, path);
|
|
471
|
+
}
|
|
472
|
+
else if (expression.kind == "BinaryExpression") {
|
|
473
|
+
const token = operators.get(expression.operation);
|
|
474
|
+
if (!token)
|
|
475
|
+
throw new Error("Unsupported operation passed Zig validation.");
|
|
476
|
+
const helper = token.startsWith("semantifold_");
|
|
477
|
+
if (helper)
|
|
478
|
+
this.mapped(token, expression, path, "operator");
|
|
479
|
+
this.synthetic("(", expression, path);
|
|
480
|
+
this.value(operands[0]);
|
|
481
|
+
if (helper)
|
|
482
|
+
this.synthetic(", ", expression, path);
|
|
483
|
+
else {
|
|
484
|
+
this.synthetic(" ", expression, path);
|
|
485
|
+
this.mapped(token, expression, path, "operator");
|
|
486
|
+
this.synthetic(" ", expression, path);
|
|
487
|
+
}
|
|
488
|
+
this.value(operands[1]);
|
|
489
|
+
this.synthetic(")", expression, path);
|
|
490
|
+
}
|
|
491
|
+
else
|
|
492
|
+
throw new Error("Pure value reached Zig operation emission.");
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Emits one pure literal, binding, or ordered temporary use.
|
|
496
|
+
* @param {ZigPlannedValue} value - Planned pure value.
|
|
497
|
+
* @returns {void} Text is emitted through the configured writer.
|
|
498
|
+
*/
|
|
499
|
+
value({ expression, path, name }) {
|
|
500
|
+
if (name)
|
|
501
|
+
return this.synthetic(name, expression, path, "Zig ordered-expression temporary use");
|
|
502
|
+
if (expression.kind == "IdentifierExpression")
|
|
503
|
+
return this.mapped(expression.name, expression, path, "name");
|
|
504
|
+
if (expression.kind == "BooleanLiteral")
|
|
505
|
+
return this.mapped(String(expression.value), expression, path, "literal");
|
|
506
|
+
if (expression.kind == "IntegerLiteral")
|
|
507
|
+
return this.mapped(String(expression.value), expression, path, "literal");
|
|
508
|
+
if (expression.kind == "StringLiteral")
|
|
509
|
+
return this.mapped(zigString(expression.value), expression, path, "literal");
|
|
510
|
+
throw new Error("Unsequenced expression passed Zig emission.");
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Requires the final pure value owned by a non-void statement plan.
|
|
515
|
+
* @param {ZigStatementPlan} plan - Statement plan.
|
|
516
|
+
* @param {Statement} statement - Owning semantic statement.
|
|
517
|
+
* @returns {ZigPlannedValue} Required planned value.
|
|
518
|
+
*/
|
|
519
|
+
function requiredPlanValue(plan, statement) {
|
|
520
|
+
if (!plan.value)
|
|
521
|
+
throw new Error(`Missing validated Zig value for ${statement.kind}.`);
|
|
522
|
+
return plan.value;
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Narrows an already validated semantic type to the Zig scalar cohort.
|
|
526
|
+
* @param {import("../semantic/types.js").SemanticFunctionReturnType} type - Semantic type.
|
|
527
|
+
* @param {import("../semantic/types.js").SourceLocation} location - Diagnostic location.
|
|
528
|
+
* @returns {Scalar} Scalar type name.
|
|
529
|
+
*/
|
|
530
|
+
function zigType(type, location) {
|
|
531
|
+
if (type.kind != "TypeReference")
|
|
532
|
+
return unsupportedCapability("zig", "collection type reached scalar emission", location);
|
|
533
|
+
return type.name;
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Encodes a Unicode scalar string as a canonical Zig literal.
|
|
537
|
+
* @param {string} value - Semantic string value.
|
|
538
|
+
* @returns {string} Zig literal spelling.
|
|
539
|
+
*/
|
|
540
|
+
function zigString(value) {
|
|
541
|
+
let literal = '"';
|
|
542
|
+
for (const character of value) {
|
|
543
|
+
const scalar = /** @type {number} */ (character.codePointAt(0));
|
|
544
|
+
if (character == '"')
|
|
545
|
+
literal += '\\"';
|
|
546
|
+
else if (character == "\\")
|
|
547
|
+
literal += "\\\\";
|
|
548
|
+
else if (scalar < 32 || scalar == 127)
|
|
549
|
+
literal += `\\x${scalar.toString(16).padStart(2, "0")}`;
|
|
550
|
+
else if (scalar == 0x2028 || scalar == 0x2029)
|
|
551
|
+
literal += `\\u{${scalar.toString(16)}}`;
|
|
552
|
+
else
|
|
553
|
+
literal += character;
|
|
554
|
+
}
|
|
555
|
+
return literal + '"';
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Reparses the complete generated source and rejects recovery or excessive depth.
|
|
559
|
+
* @param {string} source - Generated Zig source.
|
|
560
|
+
* @param {import("../semantic/types.js").SourceLocation} location - Module diagnostic location.
|
|
561
|
+
* @returns {void} Returns only after the complete CST is accepted.
|
|
562
|
+
*/
|
|
563
|
+
function validateGeneratedZig(source, location) {
|
|
564
|
+
let snapshot;
|
|
565
|
+
try {
|
|
566
|
+
snapshot = parseZigCst(source);
|
|
567
|
+
}
|
|
568
|
+
catch (error) {
|
|
569
|
+
return unsupportedCapability("zig", `generated source could not be reparsed: ${error instanceof Error ? error.message : error}`, location);
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Validates one generated CST subtree.
|
|
573
|
+
* @param {import("../frontends/zig-parser.js").CstNode} node - Current parser node.
|
|
574
|
+
* @param {number} depth - Current nesting depth.
|
|
575
|
+
*/
|
|
576
|
+
const visit = (node, depth) => {
|
|
577
|
+
if (depth > 512 || node.error || node.missing || node.hasError)
|
|
578
|
+
unsupportedCapability("zig", "generated source contains parser recovery or exceeds the CST depth limit", location);
|
|
579
|
+
for (const { node: child } of node.children)
|
|
580
|
+
visit(child, depth + 1);
|
|
581
|
+
};
|
|
582
|
+
visit(snapshot.root, 0);
|
|
583
|
+
}
|
|
584
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3ppZy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUN0QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFDdEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDMUQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUMzQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDakQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUN4QyxPQUFPLEVBQUMsUUFBUSxFQUFFLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQzdFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBRXpELDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsc0VBQXNFO0FBQ3RFLG9FQUFvRTtBQUNwRSw4RUFBOEU7QUFDOUUscUdBQXFHO0FBQ3JHLHNIQUFzSDtBQUN0SCw0SEFBNEg7QUFFNUgsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDeEIsQ0FBQyxZQUFZLEVBQUUseUJBQXlCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLDhCQUE4QixDQUFDO0lBQzlGLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsRUFB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RztBQUNILFNBQVMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFFBQVE7SUFDNUMsSUFBSSxRQUFRLENBQUE7SUFFWixJQUFJLENBQUM7UUFDSCxRQUFRLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsMkNBQTJDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzVJLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDNUIsSUFBSSxLQUFLLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLHFCQUFxQixDQUFDLEtBQUssRUFBRSwwRUFBMEUsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNsTCxLQUFLLE1BQU0sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNwRSxDQUFDLENBQUE7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Y3JlYXRlSGFzaH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcbmltcG9ydCB7dW5zdXBwb3J0ZWRDYXBhYmlsaXR5fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2ZpbmFsaXplTWFwcGluZywgdG9Tb3VyY2VNYXBWM30gZnJvbSBcIi4uL21hcHBpbmcuanNcIlxuaW1wb3J0IHtwYXJzZVppZ0NzdH0gZnJvbSBcIi4uL2Zyb250ZW5kcy96aWctcGFyc2VyLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVOYXRpdmVHcmFwaH0gZnJvbSBcIi4vbmF0aXZlLXZhbGlkYXRpb24uanNcIlxuaW1wb3J0IHtlbWl0U2NhbGFyVHlwZX0gZnJvbSBcIi4vc2NhbGFycy5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlQmFja2VuZE1vZHVsZX0gZnJvbSBcIi4vc2hhcmVkLmpzXCJcbmltcG9ydCB7U291cmNlV3JpdGVyfSBmcm9tIFwiLi93cml0ZXIuanNcIlxuaW1wb3J0IHt6aWdCdWlsZCwgemlnUnVudGltZX0gZnJvbSBcIi4vemlnLXJ1bnRpbWUuanNcIlxuaW1wb3J0IHttYXhpbXVtWmlnU291cmNlTGVuZ3RoLCB2YWxpZGF0ZVppZ1ZhbHVlc30gZnJvbSBcIi4vemlnLXZhbGlkYXRpb24uanNcIlxuaW1wb3J0IHtjb2xsZWN0WmlnQmluZGluZ1VzYWdlfSBmcm9tIFwiLi4vemlnLWJpbmRpbmdzLmpzXCJcblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gU2VtYW50aWNNb2R1bGUgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBTZW1hbnRpY05vZGUgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gRXhwcmVzc2lvbiAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvblJldHVyblR5cGVOYW1lfSBTY2FsYXIgKi9cbi8qKiBAdHlwZWRlZiB7e2V4cHJlc3Npb246IEV4cHJlc3Npb24sIHBhdGg6IHN0cmluZywgdHlwZTogU2NhbGFyLCBuYW1lPzogc3RyaW5nfX0gWmlnUGxhbm5lZFZhbHVlICovXG4vKiogQHR5cGVkZWYge3tyZXN1bHQ6IFppZ1BsYW5uZWRWYWx1ZSwgb3BlcmFuZHM6IFppZ1BsYW5uZWRWYWx1ZVtdLCByaWdodFN0ZXBzPzogWmlnUGxhbm5lZFN0ZXBbXX19IFppZ1BsYW5uZWRTdGVwICovXG4vKiogQHR5cGVkZWYge3tpZDogc3RyaW5nLCBzdGVwczogWmlnUGxhbm5lZFN0ZXBbXSwgdGVybWluYWw/OiBaaWdQbGFubmVkU3RlcCwgdmFsdWU/OiBaaWdQbGFubmVkVmFsdWV9fSBaaWdTdGF0ZW1lbnRQbGFuICovXG5cbmNvbnN0IG9wZXJhdG9ycyA9IG5ldyBNYXAoW1xuICBbXCJJbnRlZ2VyQWRkXCIsIFwic2VtYW50aWZvbGRfaW50ZWdlcl9hZGRcIl0sIFtcIkludGVnZXJTdWJ0cmFjdFwiLCBcInNlbWFudGlmb2xkX2ludGVnZXJfc3VidHJhY3RcIl0sXG4gIFtcIkludGVnZXJNdWx0aXBseVwiLCBcInNlbWFudGlmb2xkX2ludGVnZXJfbXVsdGlwbHlcIl0sIFtcIkludGVnZXJFcXVhbFwiLCBcIj09XCJdLCBbXCJJbnRlZ2VyTm90RXF1YWxcIiwgXCIhPVwiXSxcbiAgW1wiSW50ZWdlckxlc3NUaGFuXCIsIFwiPFwiXSwgW1wiSW50ZWdlckxlc3NUaGFuT3JFcXVhbFwiLCBcIjw9XCJdLCBbXCJJbnRlZ2VyR3JlYXRlclRoYW5cIiwgXCI+XCJdLCBbXCJJbnRlZ2VyR3JlYXRlclRoYW5PckVxdWFsXCIsIFwiPj1cIl0sXG4gIFtcIkJvb2xlYW5FcXVhbFwiLCBcIj09XCJdLCBbXCJCb29sZWFuTm90RXF1YWxcIiwgXCIhPVwiXSwgW1wiQm9vbGVhbkFuZFwiLCBcImFuZFwiXSwgW1wiQm9vbGVhbk9yXCIsIFwib3JcIl0sXG4gIFtcIlN0cmluZ0NvbmNhdFwiLCBcInNlbWFudGlmb2xkX3N0cmluZ19jb25jYXRcIl0sIFtcIlN0cmluZ0VxdWFsXCIsIFwic2VtYW50aWZvbGRfc3RyaW5nX2VxdWFsXCJdLFxuICBbXCJTdHJpbmdOb3RFcXVhbFwiLCBcInNlbWFudGlmb2xkX3N0cmluZ19ub3RfZXF1YWxcIl1cbl0pXG5cbi8qKiBQbGFucyBzY2FsYXIgb3BlcmF0aW9ucyBieSBvY2N1cnJlbmNlIHdpdGhvdXQgcmV3cml0aW5nIGNhbGxlci1vd25lZCBzZW1hbnRpYyB2YWx1ZXMuICovXG5jbGFzcyBaaWdFeHByZXNzaW9uUGxhbm5lciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGxhbm5lciBmb3Igb25lIHZhbGlkYXRlZCBzY2FsYXIgbW9kdWxlLlxuICAgKiBAcGFyYW0ge1NlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBWYWxpZGF0ZWQgbW9kdWxlLlxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kdWxlKSB7XG4gICAgdGhpcy5mdW5jdGlvbnMgPSBuZXcgTWFwKG1vZHVsZS5mdW5jdGlvbnMubWFwKGRlY2xhcmF0aW9uID0+IFtkZWNsYXJhdGlvbi5uYW1lLCB6aWdUeXBlKGRlY2xhcmF0aW9uLnJldHVyblR5cGUsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKV0pKVxuICAgIHRoaXMubmV4dFRlbXBvcmFyeSA9IDFcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmUgYWxyZWFkeS12YWxpZGF0ZWQgZXhwcmVzc2lvbiB0eXBlLlxuICAgKiBAcGFyYW0ge0V4cHJlc3Npb259IGV4cHJlc3Npb24gLSBFeHByZXNzaW9uIG9jY3VycmVuY2UuXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2NhbGFyPn0gYmluZGluZ3MgLSBWaXNpYmxlIHNjYWxhciBiaW5kaW5ncy5cbiAgICogQHJldHVybnMge1NjYWxhcn0gRXhhY3QgcmVzdWx0IHR5cGUuXG4gICAqL1xuICB0eXBlKGV4cHJlc3Npb24sIGJpbmRpbmdzKSB7XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkludGVnZXJMaXRlcmFsXCIpIHJldHVybiBcImludGVnZXJcIlxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCb29sZWFuTGl0ZXJhbFwiKSByZXR1cm4gXCJib29sZWFuXCJcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiU3RyaW5nTGl0ZXJhbFwiKSByZXR1cm4gXCJzdHJpbmdcIlxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHJldHVybiBleHByZXNzaW9uLnR5cGVcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kICE9IFwiQ2FsbEV4cHJlc3Npb25cIiAmJiBleHByZXNzaW9uLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwiemlnXCIsIFwiY29sbGVjdGlvbiBleHByZXNzaW9uIHJlYWNoZWQgc2NhbGFyIHBsYW5uaW5nXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiID8gdGhpcy5mdW5jdGlvbnMuZ2V0KGV4cHJlc3Npb24uY2FsbGVlKSA6IGJpbmRpbmdzLmdldChleHByZXNzaW9uLm5hbWUpXG5cbiAgICBpZiAoIXR5cGUpIHJldHVybiB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJ6aWdcIiwgXCJ1bnJlc29sdmVkIGV4cHJlc3Npb24gdHlwZVwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIHJldHVybiB0eXBlXG4gIH1cblxuICAvKipcbiAgICogUGxhbnMgb25lIHZhbHVlIGV4cHJlc3Npb24gaW4gc2VtYW50aWMgbGVmdC10by1yaWdodCBvcmRlci5cbiAgICogQHBhcmFtIHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gRXhwcmVzc2lvbiBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIENhbm9uaWNhbCBvY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2NhbGFyPn0gYmluZGluZ3MgLSBWaXNpYmxlIHNjYWxhciBiaW5kaW5ncy5cbiAgICogQHBhcmFtIHtaaWdQbGFubmVkU3RlcFtdfSBzdGVwcyAtIE9yZGVyZWQgZW5jbG9zaW5nIHByZWx1ZGUuXG4gICAqIEByZXR1cm5zIHtaaWdQbGFubmVkVmFsdWV9IFB1cmUgZmluYWwgdmFsdWUuXG4gICAqL1xuICBwbGFuKGV4cHJlc3Npb24sIHBhdGgsIGJpbmRpbmdzLCBzdGVwcykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtleHByZXNzaW9uLCBwYXRoLCB0eXBlOiB0aGlzLnR5cGUoZXhwcmVzc2lvbiwgYmluZGluZ3MpfVxuXG4gICAgaWYgKCFbXCJDYWxsRXhwcmVzc2lvblwiLCBcIlVuYXJ5RXhwcmVzc2lvblwiLCBcIkJpbmFyeUV4cHJlc3Npb25cIl0uaW5jbHVkZXMoZXhwcmVzc2lvbi5raW5kKSkgcmV0dXJuIHJlc3VsdFxuICAgIGNvbnN0IG9wZXJhbmRzID0gW11cbiAgICAvKiogQHR5cGUge1ppZ1BsYW5uZWRTdGVwW10gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IHJpZ2h0U3RlcHNcblxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgYXJndW1lbnRdIG9mIGV4cHJlc3Npb24uYXJndW1lbnRzLmVudHJpZXMoKSkgb3BlcmFuZHMucHVzaCh0aGlzLnBsYW4oYXJndW1lbnQsIGAke3BhdGh9L2FyZ3VtZW50cy8ke2luZGV4fWAsIGJpbmRpbmdzLCBzdGVwcykpXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIikgb3BlcmFuZHMucHVzaCh0aGlzLnBsYW4oZXhwcmVzc2lvbi5vcGVyYW5kLCBgJHtwYXRofS9vcGVyYW5kYCwgYmluZGluZ3MsIHN0ZXBzKSlcbiAgICBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIG9wZXJhbmRzLnB1c2godGhpcy5wbGFuKGV4cHJlc3Npb24ubGVmdCwgYCR7cGF0aH0vbGVmdGAsIGJpbmRpbmdzLCBzdGVwcykpXG4gICAgICBpZiAoZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJCb29sZWFuQW5kXCIgfHwgZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJCb29sZWFuT3JcIikge1xuICAgICAgICBjb25zdCBwbGFubmVkID0gey4uLnJlc3VsdCwgbmFtZTogdGhpcy5hbGxvY2F0ZShleHByZXNzaW9uKX1cblxuICAgICAgICByaWdodFN0ZXBzID0gW11cbiAgICAgICAgb3BlcmFuZHMucHVzaCh0aGlzLnBsYW4oZXhwcmVzc2lvbi5yaWdodCwgYCR7cGF0aH0vcmlnaHRgLCBiaW5kaW5ncywgcmlnaHRTdGVwcykpXG4gICAgICAgIHN0ZXBzLnB1c2goe29wZXJhbmRzLCByZXN1bHQ6IHBsYW5uZWQsIHJpZ2h0U3RlcHN9KVxuICAgICAgICByZXR1cm4gcGxhbm5lZFxuICAgICAgfVxuICAgICAgb3BlcmFuZHMucHVzaCh0aGlzLnBsYW4oZXhwcmVzc2lvbi5yaWdodCwgYCR7cGF0aH0vcmlnaHRgLCBiaW5kaW5ncywgc3RlcHMpKVxuICAgIH1cbiAgICBpZiAocmVzdWx0LnR5cGUgPT0gXCJ2b2lkXCIpIHRocm93IG5ldyBFcnJvcihcIlZvaWQgWmlnIGNhbGwgcmVhY2hlZCB2YWx1ZSBwbGFubmluZy5cIilcbiAgICBjb25zdCBwbGFubmVkID0gey4uLnJlc3VsdCwgbmFtZTogdGhpcy5hbGxvY2F0ZShleHByZXNzaW9uKX1cblxuICAgIHN0ZXBzLnB1c2goe29wZXJhbmRzLCByZXN1bHQ6IHBsYW5uZWR9KVxuICAgIHJldHVybiBwbGFubmVkXG4gIH1cblxuICAvKipcbiAgICogUGxhbnMgdGhlIGFyZ3VtZW50cyBvZiBvbmUgdGVybWluYWwgdm9pZCBjYWxsIHdpdGhvdXQgaW52ZW50aW5nIGEgdm9pZCB0ZW1wb3JhcnkuXG4gICAqIEBwYXJhbSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFRlcm1pbmFsIGV4cHJlc3Npb24gb2NjdXJyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBDYW5vbmljYWwgb2NjdXJyZW5jZSBwYXRoLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNjYWxhcj59IGJpbmRpbmdzIC0gVmlzaWJsZSBzY2FsYXIgYmluZGluZ3MuXG4gICAqIEBwYXJhbSB7WmlnUGxhbm5lZFN0ZXBbXX0gc3RlcHMgLSBPcmRlcmVkIGVuY2xvc2luZyBwcmVsdWRlLlxuICAgKiBAcmV0dXJucyB7WmlnUGxhbm5lZFN0ZXB9IFRlcm1pbmFsIGRpcmVjdC1jYWxsIHN0ZXAuXG4gICAqL1xuICB0ZXJtaW5hbChleHByZXNzaW9uLCBwYXRoLCBiaW5kaW5ncywgc3RlcHMpIHtcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kICE9IFwiQ2FsbEV4cHJlc3Npb25cIiB8fCB0aGlzLnR5cGUoZXhwcmVzc2lvbiwgYmluZGluZ3MpICE9IFwidm9pZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb24tdm9pZCBleHByZXNzaW9uIHJlYWNoZWQgWmlnIHRlcm1pbmFsLWNhbGwgcGxhbm5pbmcuXCIpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHtleHByZXNzaW9uLCBwYXRoLCB0eXBlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJ2b2lkXCIpfVxuICAgIGNvbnN0IG9wZXJhbmRzID0gZXhwcmVzc2lvbi5hcmd1bWVudHMubWFwKChhcmd1bWVudCwgaW5kZXgpID0+IHRoaXMucGxhbihhcmd1bWVudCwgYCR7cGF0aH0vYXJndW1lbnRzLyR7aW5kZXh9YCwgYmluZGluZ3MsIHN0ZXBzKSlcblxuICAgIHJldHVybiB7b3BlcmFuZHMsIHJlc3VsdH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvY2F0ZXMgb25lIGJvdW5kZWQgZGV0ZXJtaW5pc3RpYyBvY2N1cnJlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFJlbGF0ZWQgc2VtYW50aWMgb2NjdXJyZW5jZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmVzZXJ2ZWQgb2NjdXJyZW5jZSBuYW1lLlxuICAgKi9cbiAgYWxsb2NhdGUoZXhwcmVzc2lvbikge1xuICAgIGlmICh0aGlzLm5leHRUZW1wb3JhcnkgPiA5OTk5OTkpIHJldHVybiB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJ6aWdcIiwgXCJvcmRlcmVkLWV4cHJlc3Npb24gb2NjdXJyZW5jZSBsaW1pdFwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIHJldHVybiBgc2VtYW50aWZvbGRfb3JkZXJlZF8ke1N0cmluZyh0aGlzLm5leHRUZW1wb3JhcnkrKykucGFkU3RhcnQoNiwgXCIwXCIpfWBcbiAgfVxufVxuXG4vKipcbiAqIFBsYW5zIGV2ZXJ5IFppZyBzdGF0ZW1lbnQgYmVmb3JlIHdyaXRlciBjb25zdHJ1Y3Rpb24gb3IgYXJ0aWZhY3QgZXhwb3N1cmUuXG4gKiBAcGFyYW0ge1NlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBWYWxpZGF0ZWQgbW9kdWxlLlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIFppZ1N0YXRlbWVudFBsYW4+fSBQbGFucyBieSBzZW1hbnRpYyBvY2N1cnJlbmNlIHBhdGguXG4gKi9cbmZ1bmN0aW9uIHBsYW5aaWdNb2R1bGUobW9kdWxlKSB7XG4gIGNvbnN0IHBsYW5uZXIgPSBuZXcgWmlnRXhwcmVzc2lvblBsYW5uZXIobW9kdWxlKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFppZ1N0YXRlbWVudFBsYW4+fSAqL1xuICBjb25zdCBwbGFucyA9IG5ldyBNYXAoKVxuICAvKipcbiAgICogUGxhbnMgb25lIGxleGljYWwgYmxvY2sgd2l0aCBpbmRlcGVuZGVudCBicmFuY2ggZW52aXJvbm1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIEJsb2NrIHRvIHBsYW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gQ2Fub25pY2FsIGJsb2NrIHBhdGguXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2NhbGFyPn0gaW5oZXJpdGVkIC0gVmlzaWJsZSBzY2FsYXIgYmluZGluZ3MuXG4gICAqL1xuICBjb25zdCB2aXNpdCA9IChibG9jaywgcGF0aCwgaW5oZXJpdGVkKSA9PiB7XG4gICAgY29uc3QgYmluZGluZ3MgPSBuZXcgTWFwKGluaGVyaXRlZClcblxuICAgIGJsb2NrLnN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVtZW50UGF0aCA9IGAke3BhdGh9L3N0YXRlbWVudHMvJHtpbmRleH1gXG4gICAgICBjb25zdCBmaWVsZCA9IHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIiA/IFwiY29uZGl0aW9uXCIgOiBzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiA/IFwiaW5pdGlhbGl6ZXJcIiA6IFwiZXhwcmVzc2lvblwiXG4gICAgICBjb25zdCBleHByZXNzaW9uID0gc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiID8gc3RhdGVtZW50LmNvbmRpdGlvbiA6IHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiID8gc3RhdGVtZW50LmluaXRpYWxpemVyIDpcbiAgICAgICAgc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiID8gc3RhdGVtZW50LmV4cHJlc3Npb24gOlxuICAgICAgICAgIHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIgPyBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA6IHVuZGVmaW5lZFxuICAgICAgLyoqIEB0eXBlIHtaaWdQbGFubmVkU3RlcFtdfSAqL1xuICAgICAgY29uc3Qgc3RlcHMgPSBbXVxuICAgICAgLyoqIEB0eXBlIHtaaWdTdGF0ZW1lbnRQbGFufSAqL1xuICAgICAgY29uc3QgcGxhbiA9IHtpZDogU3RyaW5nKHBsYW5zLnNpemUgKyAxKS5wYWRTdGFydCg2LCBcIjBcIiksIHN0ZXBzfVxuXG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIpIHBsYW4udGVybWluYWwgPSBwbGFubmVyLnRlcm1pbmFsKHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtzdGF0ZW1lbnRQYXRofS8ke2ZpZWxkfWAsIGJpbmRpbmdzLCBzdGVwcylcbiAgICAgIGVsc2UgaWYgKGV4cHJlc3Npb24pIHBsYW4udmFsdWUgPSBwbGFubmVyLnBsYW4oZXhwcmVzc2lvbiwgYCR7c3RhdGVtZW50UGF0aH0vJHtmaWVsZH1gLCBiaW5kaW5ncywgc3RlcHMpXG4gICAgICBwbGFucy5zZXQoc3RhdGVtZW50UGF0aCwgcGxhbilcbiAgICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIikgYmluZGluZ3Muc2V0KHN0YXRlbWVudC5uYW1lLCB6aWdUeXBlKHN0YXRlbWVudC50eXBlLCBzdGF0ZW1lbnQubG9jYXRpb24pKVxuICAgICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgICB2aXNpdChzdGF0ZW1lbnQuY29uc2VxdWVudCwgYCR7c3RhdGVtZW50UGF0aH0vY29uc2VxdWVudGAsIGJpbmRpbmdzKVxuICAgICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkgdmlzaXQoc3RhdGVtZW50LmFsdGVybmF0ZSwgYCR7c3RhdGVtZW50UGF0aH0vYWx0ZXJuYXRlYCwgYmluZGluZ3MpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGluZGV4KSA9PiB2aXNpdChkZWNsYXJhdGlvbi5ib2R5LCBgL2Z1bmN0aW9ucy8ke2luZGV4fS9ib2R5YCxcbiAgICBuZXcgTWFwKGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBbcGFyYW1ldGVyLm5hbWUsIHppZ1R5cGUocGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbildKSkpKVxuICB2aXNpdChtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBcIi9lbnRyeVBvaW50L2JvZHlcIiwgbmV3IE1hcCgpKVxuICByZXR1cm4gcGxhbnNcbn1cblxuLyoqXG4gKiBCaW5kcyBhbiBvcmRlcmVkIHJlZ2lvbiB0byBpdHMgZXhhY3Qgc2VtYW50aWMgY29uc3VtZXIgYW5kIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge1N0YXRlbWVudH0gc3RhdGVtZW50IC0gU2VtYW50aWMgc3RhdGVtZW50IG9jY3VycmVuY2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgc2NhZmZvbGQgc2lnbmF0dXJlLlxuICovXG5mdW5jdGlvbiB6aWdTdGF0ZW1lbnRTaWduYXR1cmUoc3RhdGVtZW50KSB7XG4gIGNvbnN0IGNvbnN1bWVyID0gc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIgPyBbc3RhdGVtZW50LmtpbmQsIHN0YXRlbWVudC5uYW1lLFxuICAgIHppZ1R5cGUoc3RhdGVtZW50LnR5cGUsIHN0YXRlbWVudC5sb2NhdGlvbiksIHN0YXRlbWVudC5tdXRhYmxlXSA6XG4gICAgc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIgPyBbc3RhdGVtZW50LmtpbmQsIHN0YXRlbWVudC50YXJnZXQubmFtZV0gOiBbc3RhdGVtZW50LmtpbmRdXG4gIGNvbnN0IGV4cHJlc3Npb24gPSBzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIgPyBzdGF0ZW1lbnQuY29uZGl0aW9uIDogc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIgPyBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIgOlxuICAgIHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIiA/IHN0YXRlbWVudC5leHByZXNzaW9uIDpcbiAgICAgIHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIgPyBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA6IHVuZGVmaW5lZFxuXG4gIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShKU09OLnN0cmluZ2lmeShbY29uc3VtZXIsIGV4cHJlc3Npb24gPyB6aWdFeHByZXNzaW9uU2lnbmF0dXJlKGV4cHJlc3Npb24pIDogbnVsbF0pKS5kaWdlc3QoXCJoZXhcIilcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVzIG9ubHkgdGhlIGNsb3NlZCBzZW1hbnRpYyBleHByZXNzaW9uIGZpZWxkcy5cbiAqIEBwYXJhbSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIENsb3NlZCBzY2FsYXIgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIHt1bmtub3duW119IFN0YWJsZSBzaWduYXR1cmUgZGF0YS5cbiAqL1xuZnVuY3Rpb24gemlnRXhwcmVzc2lvblNpZ25hdHVyZShleHByZXNzaW9uKSB7XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24ua2luZCwgZXhwcmVzc2lvbi5uYW1lXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSW50ZWdlckxpdGVyYWxcIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJCb29sZWFuTGl0ZXJhbFwiIHx8IGV4cHJlc3Npb24ua2luZCA9PSBcIlN0cmluZ0xpdGVyYWxcIikge1xuICAgIHJldHVybiBbZXhwcmVzc2lvbi5raW5kLCBleHByZXNzaW9uLnZhbHVlXVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24ua2luZCwgZXhwcmVzc2lvbi5jYWxsZWUsIC4uLmV4cHJlc3Npb24uYXJndW1lbnRzLm1hcCh6aWdFeHByZXNzaW9uU2lnbmF0dXJlKV1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24ua2luZCwgZXhwcmVzc2lvbi5vcGVyYXRpb24sIGV4cHJlc3Npb24udHlwZSwgemlnRXhwcmVzc2lvblNpZ25hdHVyZShleHByZXNzaW9uLm9wZXJhbmQpXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQmluYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgcmV0dXJuIFtleHByZXNzaW9uLmtpbmQsIGV4cHJlc3Npb24ub3BlcmF0aW9uLCBleHByZXNzaW9uLnR5cGUsIHppZ0V4cHJlc3Npb25TaWduYXR1cmUoZXhwcmVzc2lvbi5sZWZ0KSwgemlnRXhwcmVzc2lvblNpZ25hdHVyZShleHByZXNzaW9uLnJpZ2h0KV1cbiAgfVxuICByZXR1cm4gW2V4cHJlc3Npb24ua2luZF1cbn1cblxuLyoqXG4gKiBQcm9kdWNlcyBhIGRldGVybWluaXN0aWMgZGVwZW5kZW5jeS1mcmVlIFppZyAwLjE1LjIgbmF0aXZlIHByb2plY3QgYWZ0ZXIgY29tcGxldGUgcHJlZmxpZ2h0LlxuICogQHBhcmFtIHt7ZmlsZW5hbWU/OiBzdHJpbmcsIG1hcERpcmVjdGl2ZT86IHVua25vd24sIG1vZHVsZTogU2VtYW50aWNNb2R1bGUsIHNvdXJjZU1hcEZpbGVuYW1lPzogdW5rbm93biwgc291cmNlcz86IHtmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxhbmd1YWdlPzogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX1bXX19IGlucHV0IC0gQXJ0aWZhY3QgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHt7YXJ0aWZhY3RzOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRTZXRBcnRpZmFjdFtdLCB0YXJnZXQ6IHN0cmluZ319IENhbmRpZGF0ZSBwcm9qZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVaaWdQcm9qZWN0KHtmaWxlbmFtZSwgbWFwRGlyZWN0aXZlLCBtb2R1bGUsIHNvdXJjZU1hcEZpbGVuYW1lLCBzb3VyY2VzfSkge1xuICB2YWxpZGF0ZU5hdGl2ZUdyYXBoKG1vZHVsZSwgXCJ6aWdcIilcbiAgdmFsaWRhdGVCYWNrZW5kTW9kdWxlKG1vZHVsZSwgXCJ6aWdcIilcbiAgdmFsaWRhdGVaaWdWYWx1ZXMobW9kdWxlKVxuICBpZiAoZmlsZW5hbWUgIT09IHVuZGVmaW5lZCAmJiBmaWxlbmFtZSAhPSBcInNyYy9tYWluLnppZ1wiKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJ6aWdcIiwgXCJhcnRpZmFjdCBmaWxlbmFtZSBvdGhlciB0aGFuIHNyYy9tYWluLnppZ1wiLCBtb2R1bGUubG9jYXRpb24pXG4gIGlmIChtYXBEaXJlY3RpdmUgIT09IHVuZGVmaW5lZCB8fCBzb3VyY2VNYXBGaWxlbmFtZSAhPT0gdW5kZWZpbmVkKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJ6aWdcIiwgXCJzb3VyY2UtbWFwIGZpbGVuYW1lIG9yIGRpcmVjdGl2ZSBvcHRpb25cIiwgbW9kdWxlLmxvY2F0aW9uKVxuICBuZXcgWmlnRW1pdHRlcihtb2R1bGUpLnByb2dyYW0obW9kdWxlKVxuICBjb25zdCB3cml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKHtmaWxlbmFtZTogXCJzcmMvbWFpbi56aWdcIiwgbGFuZ3VhZ2U6IFwiemlnXCIsIG1vZHVsZSwgc291cmNlc30pXG5cbiAgbmV3IFppZ0VtaXR0ZXIobW9kdWxlLCB3cml0ZXIpLnByb2dyYW0obW9kdWxlKVxuICBjb25zdCBtYXBwaW5nID0gZmluYWxpemVNYXBwaW5nKHdyaXRlci5maW5pc2goKSlcbiAgdmFsaWRhdGVHZW5lcmF0ZWRaaWcobWFwcGluZy5nZW5lcmF0ZWQuY29udGVudCwgbW9kdWxlLmxvY2F0aW9uKVxuICBjb25zdCByb290ID0gbWFwcGluZy5ub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5wYXRoID09IFwiXCIpXG5cbiAgaWYgKCFyb290KSB0aHJvdyBuZXcgRXJyb3IoXCJWYWxpZGF0ZWQgWmlnIG1vZHVsZSBvbWl0dGVkIHJvb3QgcHJvdmVuYW5jZS5cIilcbiAgY29uc3Qgb3JpZ2luID0gcm9vdC5vcmlnaW5cbiAgY29uc3QgcmVsYXRlZE9yaWdpbnMgPSBvcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiID8gW3tsb2NhdGlvbjogb3JpZ2luLmxvY2F0aW9uLCBub2RlSWQ6IHJvb3QuaWQsIHJvbGU6IFwibW9kdWxlXCIsIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9XSA6XG4gICAgKG9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiID8gb3JpZ2luLm9yaWdpbnMgOiBvcmlnaW4ucmVsYXRlZE9yaWdpbnMpLm1hcChpdGVtID0+ICh7Li4uaXRlbSwgbm9kZUlkOiBpdGVtLm5vZGVJZCA/PyByb290LmlkLCByb2xlOiBpdGVtLnJvbGUgPz8gXCJtb2R1bGVcIn0pKVxuXG4gIHJldHVybiB7dGFyZ2V0OiBcInppZ1wiLCBhcnRpZmFjdHM6IFt7XG4gICAgcGF0aDogXCJidWlsZC56aWdcIiwgcm9sZTogXCJtYW5pZmVzdFwiLCBvd25lcnNoaXA6IFwiZ2VuZXJhdGVkXCIsIGNvbnRlbnRLaW5kOiBcInRleHRcIiwgbWVkaWFUeXBlOiBcInRleHQveC16aWdcIiwgY29udGVudDogemlnQnVpbGQsXG4gICAgcHJvdmVuYW5jZToge2tpbmQ6IFwic3ludGhldGljXCIsIHJlYXNvbjogXCJGaXhlZCBkZXBlbmRlbmN5LWZyZWUgWmlnIDAuMTUuMiBuYXRpdmUtaG9zdCBwcm9qZWN0IHdpdGggY2FsbGVyLXNlbGVjdGVkIERlYnVnLCBSZWxlYXNlU2FmZSwgb3IgUmVsZWFzZUZhc3Qgb3B0aW1pemF0aW9uLlwiLCByZWxhdGVkT3JpZ2luc31cbiAgfSwge1xuICAgIHBhdGg6IFwic3JjL21haW4uemlnXCIsIHJvbGU6IFwiZW50cnlcIiwgb3duZXJzaGlwOiBcImdlbmVyYXRlZFwiLCBjb250ZW50S2luZDogXCJ0ZXh0XCIsIG1lZGlhVHlwZTogXCJ0ZXh0L3gtemlnXCIsIGNvbnRlbnQ6IG1hcHBpbmcuZ2VuZXJhdGVkLmNvbnRlbnQsXG4gICAgcHJvdmVuYW5jZToge2tpbmQ6IFwidGV4dFwiLCBtYXBwaW5nLCBzb3VyY2VNYXA6IHRvU291cmNlTWFwVjMobWFwcGluZyl9XG4gIH1dfVxufVxuXG4vKiogRW1pdHMgZXhhY3QgWmlnIHN1cHBvcnQgYW5kIFRhc2tzIDAwMS0wMDUgc2VtYW50aWMgb2NjdXJyZW5jZXMuICovXG5jbGFzcyBaaWdFbWl0dGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB2YWxpZGF0aW9uLW9ubHkgb3Igd3JpdGluZyBlbWl0dGVyIGZvciBvbmUgbW9kdWxlLlxuICAgKiBAcGFyYW0ge1NlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBWYWxpZGF0ZWQgc2VtYW50aWMgbW9kdWxlLlxuICAgKiBAcGFyYW0ge1NvdXJjZVdyaXRlcn0gW3dyaXRlcl0gLSBPcHRpb25hbCBwcm92ZW5hbmNlLWF3YXJlIG91dHB1dCB3cml0ZXIuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2R1bGUsIHdyaXRlcikge1xuICAgIHRoaXMud3JpdGVyID0gd3JpdGVyXG4gICAgdGhpcy5wbGFucyA9IHBsYW5aaWdNb2R1bGUobW9kdWxlKVxuICAgIHRoaXMubGVuZ3RoID0gMFxuICAgIHRoaXMubG9jYXRpb24gPSBtb2R1bGUubG9jYXRpb25cbiAgICB0aGlzLnVzYWdlID0ge3JlYWRzOiBuZXcgU2V0KCksIHdyaXRlczogbmV3IFNldCgpfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjY291bnRzIGZvciBnZW5lcmF0ZWQgc2l6ZSBiZWZvcmUgYW55IHRleHQgYmVjb21lcyBvYnNlcnZhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRleHQgYWJvdXQgdG8gYmUgZW1pdHRlZC5cbiAgICogQHBhcmFtIHtTZW1hbnRpY05vZGV9IG5vZGUgLSBPd25pbmcgc2VtYW50aWMgb2NjdXJyZW5jZS5cbiAgICovXG4gIGNoZWNrU2l6ZSh0ZXh0LCBub2RlKSB7XG4gICAgdGhpcy5sZW5ndGggKz0gdGV4dC5sZW5ndGhcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXhpbXVtWmlnU291cmNlTGVuZ3RoKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJ6aWdcIiwgXCJnZW5lcmF0ZWQgc291cmNlIGV4Y2VlZHMgdGhlIDEwMDAwMDAgVVRGLTE2IGlucHV0IGxpbWl0XCIsIFwibG9jYXRpb25cIiBpbiBub2RlID8gbm9kZS5sb2NhdGlvbiA6IHRoaXMubG9jYXRpb24pXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgc3ludGhldGljIFppZyBzeW50YXggd2hlbiBhIHdyaXRlciBpcyBwcmVzZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRleHQgdG8gZW1pdC5cbiAgICogQHBhcmFtIHtTZW1hbnRpY05vZGV9IG5vZGUgLSBSZWxhdGVkIHNlbWFudGljIG5vZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gQ2Fub25pY2FsIHNlbWFudGljIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIFN5bnRoZXRpYyBwcm92ZW5hbmNlIHJlYXNvbi5cbiAgICovXG4gIHN5bnRoZXRpYyh0ZXh0LCBub2RlLCBwYXRoLCByZWFzb24gPSBcIlppZyBkZWNsYXJhdGlvbiBhbmQgZXhwcmVzc2lvbiBzeW50YXhcIikge1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQsIG5vZGUpXG4gICAgdGhpcy53cml0ZXI/LnN5bnRoZXRpYyh0ZXh0LCByZWFzb24sIFtub2RlXSwgW3BhdGhdKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV4YWN0IG9yIGFuY2hvcmVkIHNlbWFudGljIG9jY3VycmVuY2Ugd2hlbiBhIHdyaXRlciBpcyBwcmVzZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRleHQgdG8gZW1pdC5cbiAgICogQHBhcmFtIHtTZW1hbnRpY05vZGV9IG5vZGUgLSBPd25pbmcgc2VtYW50aWMgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBDYW5vbmljYWwgc2VtYW50aWMgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyb2xlXSAtIEV4YWN0IHBhcnNlci10b2tlbiByb2xlIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgbWFwcGVkKHRleHQsIG5vZGUsIHBhdGgsIHJvbGUpIHtcbiAgICB0aGlzLmNoZWNrU2l6ZSh0ZXh0LCBub2RlKVxuICAgIHRoaXMud3JpdGVyPy5tYXBwZWQodGV4dCwge21hcHBpbmdLaW5kOiByb2xlID8gXCJleGFjdFwiIDogXCJhbmNob3JcIiwgbm9kZSwgcGF0aCwgLi4uKHJvbGUgPyB7cm9sZX0gOiB7fSl9KVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBvciBlbWl0cyB0aGUgY29tcGxldGUgZGV0ZXJtaW5pc3RpYyBlbnRyeSBzb3VyY2UuXG4gICAqIEBwYXJhbSB7U2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZSB0byBwcm9jZXNzLlxuICAgKi9cbiAgcHJvZ3JhbShtb2R1bGUpIHtcbiAgICB0aGlzLnN5bnRoZXRpYyh6aWdSdW50aW1lLCBtb2R1bGUsIFwiXCIsIFwiRXhhY3QgWmlnIGFyZW5hLCBVVEYtOCwgb3V0cHV0LCBjb21wYXJpc29uLCBhbmQgY2hlY2tlZC1hcml0aG1ldGljIHN1cHBvcnRcIilcbiAgICB0aGlzLnN5bnRoZXRpYyhcIi8vIHNlbWFudGlmb2xkOnByb2dyYW06emlnOnYxXFxuXCIsIG1vZHVsZSwgXCJcIiwgXCJFeGFjdCBnZW5lcmF0ZWQgWmlnIG9yZGVyZWQtZXhwcmVzc2lvbiBwcm9maWxlIG1hcmtlclwiKVxuICAgIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9mdW5jdGlvbnMvJHtpbmRleH1gXG5cbiAgICAgIHRoaXMuc3ludGhldGljKFwiXFxuXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoXCJmblwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKGRlY2xhcmF0aW9uLm5hbWUsIGRlY2xhcmF0aW9uLCBwYXRoLCBcIm5hbWVcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKFwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyLCBwYXJhbWV0ZXJJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJQYXRoID0gYCR7cGF0aH0vcGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fWBcblxuICAgICAgICBpZiAocGFyYW1ldGVySW5kZXgpIHRoaXMuc3ludGhldGljKFwiLCBcIiwgcGFyYW1ldGVyLCBwYXJhbWV0ZXJQYXRoKVxuICAgICAgICB0aGlzLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyLCBwYXJhbWV0ZXJQYXRoLCBcIm5hbWVcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCI6IFwiLCBwYXJhbWV0ZXIsIHBhcmFtZXRlclBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiemlnXCIsIHBhcmFtZXRlci50eXBlKSwgcGFyYW1ldGVyLnR5cGUsIGAke3BhcmFtZXRlclBhdGh9L3R5cGVgLCBcInR5cGVcIilcbiAgICAgIH0pXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIikgXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJ6aWdcIiwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSksIGRlY2xhcmF0aW9uLnJldHVyblR5cGUsIGAke3BhdGh9L3JldHVyblR5cGVgLCBcInR5cGVcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIHtcXG5cIiwgZGVjbGFyYXRpb24sIHBhdGgpXG4gICAgICB0aGlzLnVzYWdlID0gY29sbGVjdFppZ0JpbmRpbmdVc2FnZShkZWNsYXJhdGlvbi5ib2R5KVxuICAgICAgZGVjbGFyYXRpb24ucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIHBhcmFtZXRlckluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlclBhdGggPSBgJHtwYXRofS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YFxuXG4gICAgICAgIGlmICghdGhpcy51c2FnZS5yZWFkcy5oYXMocGFyYW1ldGVyLm5hbWUpKSB7XG4gICAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgICAgXyA9IFwiLCBwYXJhbWV0ZXIsIHBhcmFtZXRlclBhdGgsIFwiWmlnIGV4cGxpY2l0IHVudXNlZC1wYXJhbWV0ZXIgc2NhZmZvbGRcIilcbiAgICAgICAgICB0aGlzLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyLCBwYXJhbWV0ZXJQYXRoLCBcIm5hbWVcIilcbiAgICAgICAgICB0aGlzLnN5bnRoZXRpYyhcIjtcXG5cIiwgcGFyYW1ldGVyLCBwYXJhbWV0ZXJQYXRoLCBcIlppZyBleHBsaWNpdCB1bnVzZWQtcGFyYW1ldGVyIHNjYWZmb2xkXCIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICB0aGlzLmJsb2NrKGRlY2xhcmF0aW9uLmJvZHksIGAke3BhdGh9L2JvZHlgLCBcIiAgICBcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwifVxcblwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICB9KVxuICAgIHRoaXMudXNhZ2UgPSBjb2xsZWN0WmlnQmluZGluZ1VzYWdlKG1vZHVsZS5lbnRyeVBvaW50LmJvZHkpXG4gICAgdGhpcy5zeW50aGV0aWMoXCJcXG5wdWIgZm4gbWFpbigpIHZvaWQge1xcbiAgICBkZWZlciBzZW1hbnRpZm9sZF9hcmVuYS5kZWluaXQoKTtcXG5cIiwgbW9kdWxlLmVudHJ5UG9pbnQsIFwiL2VudHJ5UG9pbnRcIiwgXCJaaWcgZ2VuZXJhdGVkIGVudHJ5IGFuZCBhcmVuYSBsaWZldGltZSBzaGVsbFwiKVxuICAgIHRoaXMuYmxvY2sobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgXCIvZW50cnlQb2ludC9ib2R5XCIsIFwiICAgIFwiKVxuICAgIHRoaXMuc3ludGhldGljKFwifVxcblwiLCBtb2R1bGUuZW50cnlQb2ludCwgXCIvZW50cnlQb2ludFwiLCBcIlppZyBnZW5lcmF0ZWQgZW50cnkgc2hlbGxcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgbGV4aWNhbCBibG9jayBhbmQgY29tcGlsZXItcmVxdWlyZWQgYmluZGluZyBzY2FmZm9sZHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gU2VtYW50aWMgYmxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gQ2Fub25pY2FsIGJsb2NrIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBDdXJyZW50IG91dHB1dCBpbmRlbnRhdGlvbi5cbiAgICovXG4gIGJsb2NrKGJsb2NrLCBwYXRoLCBpbmRlbnQpIHtcbiAgICBibG9jay5zdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGVtZW50KHN0YXRlbWVudCwgYCR7cGF0aH0vc3RhdGVtZW50cy8ke2luZGV4fWAsIGluZGVudClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIG9uZSBjb21wbGV0ZSBwYWlyZWQgb3JkZXJlZCByZWdpb24gYW5kIGl0cyBwdXJlIGZpbmFsIGNvbnN1bWVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlN0YXRlbWVudH0gc3RhdGVtZW50IC0gU3RhdGVtZW50IHRvIGVtaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gQ2Fub25pY2FsIHN0YXRlbWVudCBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gQ3VycmVudCBvdXRwdXQgaW5kZW50YXRpb24uXG4gICAqL1xuICBzdGF0ZW1lbnQoc3RhdGVtZW50LCBwYXRoLCBpbmRlbnQpIHtcbiAgICBjb25zdCBwbGFuID0gdGhpcy5wbGFucy5nZXQocGF0aClcblxuICAgIGlmICghcGxhbikgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyB2YWxpZGF0ZWQgWmlnIHN0YXRlbWVudCBwbGFuLlwiKVxuICAgIGNvbnN0IG1hcmtlciA9IFwic2VtYW50aWZvbGQ6b3JkZXJlZC1leHByZXNzaW9uOnppZzp2MVwiXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gemlnU3RhdGVtZW50U2lnbmF0dXJlKHN0YXRlbWVudClcblxuICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0vLyAke21hcmtlcn0gYmVnaW4gJHtwbGFuLmlkfSAke3NpZ25hdHVyZX1cXG5gLCBzdGF0ZW1lbnQsIHBhdGgsIFwiWmlnIG9yZGVyZWQtZXhwcmVzc2lvbiByZWdpb24gbWFya2VyXCIpXG4gICAgdGhpcy5zdGVwcyhwbGFuLnN0ZXBzLCBpbmRlbnQpXG4gICAgdGhpcy5zeW50aGV0aWMoaW5kZW50LCBzdGF0ZW1lbnQsIHBhdGgsIFwiaW5kZW50YXRpb25cIilcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHtcbiAgICAgIHRoaXMubWFwcGVkKHN0YXRlbWVudC5tdXRhYmxlID8gXCJ2YXJcIiA6IFwiY29uc3RcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQsIHBhdGgsIFwibmFtZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCI6IFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChlbWl0U2NhbGFyVHlwZShcInppZ1wiLCBzdGF0ZW1lbnQudHlwZSksIHN0YXRlbWVudC50eXBlLCBgJHtwYXRofS90eXBlYCwgXCJ0eXBlXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoXCI9XCIsIHN0YXRlbWVudCwgcGF0aCwgXCJvcGVyYXRvclwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMudmFsdWUocmVxdWlyZWRQbGFuVmFsdWUocGxhbiwgc3RhdGVtZW50KSlcbiAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUsIHN0YXRlbWVudC50YXJnZXQsIGAke3BhdGh9L3RhcmdldGAsIFwibmFtZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKFwiPVwiLCBzdGF0ZW1lbnQsIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLnZhbHVlKHJlcXVpcmVkUGxhblZhbHVlKHBsYW4sIHN0YXRlbWVudCkpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChcInJldHVyblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgICAgdGhpcy52YWx1ZShyZXF1aXJlZFBsYW5WYWx1ZShwbGFuLCBzdGF0ZW1lbnQpKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHJlcXVpcmVkUGxhblZhbHVlKHBsYW4sIHN0YXRlbWVudClcblxuICAgICAgdGhpcy5tYXBwZWQoYHNlbWFudGlmb2xkX3ByaW50XyR7dmFsdWUudHlwZX1gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy52YWx1ZSh2YWx1ZSlcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKVwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xuICAgICAgaWYgKCFwbGFuLnRlcm1pbmFsKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHZhbGlkYXRlZCBaaWcgdGVybWluYWwgY2FsbC5cIilcbiAgICAgIHRoaXMub3BlcmF0aW9uKHBsYW4udGVybWluYWwpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgIHRoaXMubWFwcGVkKFwiaWZcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgKFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLnZhbHVlKHJlcXVpcmVkUGxhblZhbHVlKHBsYW4sIHN0YXRlbWVudCkpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIikge1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLmJsb2NrKHN0YXRlbWVudC5jb25zZXF1ZW50LCBgJHtwYXRofS9jb25zZXF1ZW50YCwgaW5kZW50ICsgXCIgICAgXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhpbmRlbnQgKyBcIn1cIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHtcbiAgICAgICAgdGhpcy5tYXBwZWQoXCIgZWxzZVwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwiIHtcXG5cIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgICB0aGlzLmJsb2NrKHN0YXRlbWVudC5hbHRlcm5hdGUsIGAke3BhdGh9L2FsdGVybmF0ZWAsIGluZGVudCArIFwiICAgIFwiKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhpbmRlbnQgKyBcIn1cIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgfVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCJcXG5cIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgIH0gZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5zdXBwb3J0ZWQgWmlnIHN0YXRlbWVudCByZWFjaGVkIGVtaXNzaW9uIGFmdGVyIHByZWZsaWdodC5cIilcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgIT0gXCJJZlN0YXRlbWVudFwiKSB0aGlzLnN5bnRoZXRpYyhcIjtcXG5cIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIikge1xuICAgICAgY29uc3QgdW5tdXRhdGVkID0gc3RhdGVtZW50Lm11dGFibGUgJiYgIXRoaXMudXNhZ2Uud3JpdGVzLmhhcyhzdGF0ZW1lbnQubmFtZSlcbiAgICAgIGNvbnN0IHVucmVhZCA9ICFzdGF0ZW1lbnQubXV0YWJsZSAmJiAhdGhpcy51c2FnZS5yZWFkcy5oYXMoc3RhdGVtZW50Lm5hbWUpXG5cbiAgICAgIGlmICh1bm11dGF0ZWQgfHwgdW5yZWFkKSB7XG4gICAgICAgIHRoaXMuc3ludGhldGljKGluZGVudCArIFwiXyA9IFwiLCBzdGF0ZW1lbnQsIHBhdGgsIFwiWmlnIGV4cGxpY2l0IGxvY2FsIGJpbmRpbmcgc2NhZmZvbGRcIilcbiAgICAgICAgaWYgKHVubXV0YXRlZCkgdGhpcy5zeW50aGV0aWMoXCImXCIsIHN0YXRlbWVudCwgcGF0aCwgXCJaaWcgZXhwbGljaXQgdW5tdXRhdGVkLXZhciBzY2FmZm9sZFwiKVxuICAgICAgICB0aGlzLm1hcHBlZChzdGF0ZW1lbnQubmFtZSwgc3RhdGVtZW50LCBwYXRoLCBcIm5hbWVcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCI7XFxuXCIsIHN0YXRlbWVudCwgcGF0aCwgXCJaaWcgZXhwbGljaXQgbG9jYWwgYmluZGluZyBzY2FmZm9sZFwiKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN5bnRoZXRpYyhgJHtpbmRlbnR9Ly8gJHttYXJrZXJ9IGVuZCAke3BsYW4uaWR9ICR7c2lnbmF0dXJlfVxcbmAsIHN0YXRlbWVudCwgcGF0aCwgXCJaaWcgb3JkZXJlZC1leHByZXNzaW9uIHJlZ2lvbiBtYXJrZXJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBlYWdlciBzdGVwcyBpbiBzZW1hbnRpYyBvcmRlciBhbmQga2VlcHMgYSBCb29sZWFuIFJIUyBjb25kaXRpb25hbC5cbiAgICogQHBhcmFtIHtaaWdQbGFubmVkU3RlcFtdfSBzdGVwcyAtIE9yZGVyZWQgcHJpdmF0ZSBzdGVwcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEN1cnJlbnQgaW5kZW50YXRpb24uXG4gICAqL1xuICBzdGVwcyhzdGVwcywgaW5kZW50KSB7XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBzKSB7XG4gICAgICBjb25zdCB7ZXhwcmVzc2lvbiwgcGF0aCwgbmFtZSwgdHlwZX0gPSBzdGVwLnJlc3VsdFxuXG4gICAgICBpZiAoIW5hbWUgfHwgdHlwZSA9PSBcInZvaWRcIikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBaaWcgb3JkZXJlZCB2YWx1ZSBzdGVwLlwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fSR7c3RlcC5yaWdodFN0ZXBzID8gXCJ2YXJcIiA6IFwiY29uc3RcIn0gJHtuYW1lfTogJHtlbWl0U2NhbGFyVHlwZShcInppZ1wiLCB7a2luZDogXCJUeXBlUmVmZXJlbmNlXCIsIG5hbWU6IHR5cGV9KX0gPSBgLFxuICAgICAgICBleHByZXNzaW9uLCBwYXRoLCBcIlppZyB0eXBlZCBvcmRlcmVkLWV4cHJlc3Npb24gdGVtcG9yYXJ5XCIpXG4gICAgICBpZiAoc3RlcC5yaWdodFN0ZXBzKSB7XG4gICAgICAgIHRoaXMudmFsdWUoc3RlcC5vcGVyYW5kc1swXSlcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoYDtcXG4ke2luZGVudH1pZiAoYCwgZXhwcmVzc2lvbiwgcGF0aCwgXCJaaWcgY29uZGl0aW9uYWwgb3JkZXJlZC1leHByZXNzaW9uIFJIU1wiKVxuICAgICAgICBpZiAoZXhwcmVzc2lvbi5raW5kICE9IFwiQmluYXJ5RXhwcmVzc2lvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFppZyBjb25kaXRpb25hbCBvcmRlcmVkIHBsYW4uXCIpXG4gICAgICAgIHRoaXMuc3ludGhldGljKGAke2V4cHJlc3Npb24ub3BlcmF0aW9uID09IFwiQm9vbGVhbk9yXCIgPyBcIiFcIiA6IFwiXCJ9JHtuYW1lfSkge1xcbmAsIGV4cHJlc3Npb24sIHBhdGgsXG4gICAgICAgICAgXCJaaWcgY29uZGl0aW9uYWwgb3JkZXJlZC1leHByZXNzaW9uIFJIU1wiKVxuICAgICAgICB0aGlzLnN0ZXBzKHN0ZXAucmlnaHRTdGVwcywgaW5kZW50ICsgXCIgICAgXCIpXG4gICAgICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0gICAgJHtuYW1lfSA9ICR7bmFtZX0gYCwgZXhwcmVzc2lvbiwgcGF0aCwgXCJaaWcgY29uZGl0aW9uYWwgb3JkZXJlZC1leHByZXNzaW9uIHJlc3VsdFwiKVxuICAgICAgICB0aGlzLm1hcHBlZChleHByZXNzaW9uLm9wZXJhdGlvbiA9PSBcIkJvb2xlYW5PclwiID8gXCJvclwiIDogXCJhbmRcIiwgZXhwcmVzc2lvbiwgcGF0aCwgXCJvcGVyYXRvclwiKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgICAgdGhpcy52YWx1ZShzdGVwLm9wZXJhbmRzWzFdKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhgO1xcbiR7aW5kZW50fX1cXG5gLCBleHByZXNzaW9uLCBwYXRoLCBcIlppZyBjb25kaXRpb25hbCBvcmRlcmVkLWV4cHJlc3Npb24gUkhTXCIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbihzdGVwKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhcIjtcXG5cIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgb25lIG9wZXJhdGlvbiB3aG9zZSBvcGVyYW5kcyBhcmUgYWxyZWFkeSBwdXJlLlxuICAgKiBAcGFyYW0ge1ppZ1BsYW5uZWRTdGVwfSBzdGVwIC0gUGxhbm5lZCBvcGVyYXRpb24uXG4gICAqL1xuICBvcGVyYXRpb24oe3Jlc3VsdDoge2V4cHJlc3Npb24sIHBhdGh9LCBvcGVyYW5kc30pIHtcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgdGhpcy5tYXBwZWQoZXhwcmVzc2lvbi5jYWxsZWUsIGV4cHJlc3Npb24sIHBhdGgsIFwiY2FsbGVlXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIG9wZXJhbmRzLmZvckVhY2goKG9wZXJhbmQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCkgdGhpcy5zeW50aGV0aWMoXCIsIFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgICB0aGlzLnZhbHVlKG9wZXJhbmQpXG4gICAgICB9KVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIpXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgdGhpcy5tYXBwZWQoZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJJbnRlZ2VyTmVnYXRlXCIgPyBcInNlbWFudGlmb2xkX2ludGVnZXJfbmVnYXRlXCIgOiBcIiFcIiwgZXhwcmVzc2lvbiwgcGF0aCwgXCJvcGVyYXRvclwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIoXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICB0aGlzLnZhbHVlKG9wZXJhbmRzWzBdKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIpXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gb3BlcmF0b3JzLmdldChleHByZXNzaW9uLm9wZXJhdGlvbilcblxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uIHBhc3NlZCBaaWcgdmFsaWRhdGlvbi5cIilcbiAgICAgIGNvbnN0IGhlbHBlciA9IHRva2VuLnN0YXJ0c1dpdGgoXCJzZW1hbnRpZm9sZF9cIilcblxuICAgICAgaWYgKGhlbHBlcikgdGhpcy5tYXBwZWQodG9rZW4sIGV4cHJlc3Npb24sIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgdGhpcy52YWx1ZShvcGVyYW5kc1swXSlcbiAgICAgIGlmIChoZWxwZXIpIHRoaXMuc3ludGhldGljKFwiLCBcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgICAgdGhpcy5tYXBwZWQodG9rZW4sIGV4cHJlc3Npb24sIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlKG9wZXJhbmRzWzFdKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIpXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihcIlB1cmUgdmFsdWUgcmVhY2hlZCBaaWcgb3BlcmF0aW9uIGVtaXNzaW9uLlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIG9uZSBwdXJlIGxpdGVyYWwsIGJpbmRpbmcsIG9yIG9yZGVyZWQgdGVtcG9yYXJ5IHVzZS5cbiAgICogQHBhcmFtIHtaaWdQbGFubmVkVmFsdWV9IHZhbHVlIC0gUGxhbm5lZCBwdXJlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gVGV4dCBpcyBlbWl0dGVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgd3JpdGVyLlxuICAgKi9cbiAgdmFsdWUoe2V4cHJlc3Npb24sIHBhdGgsIG5hbWV9KSB7XG4gICAgaWYgKG5hbWUpIHJldHVybiB0aGlzLnN5bnRoZXRpYyhuYW1lLCBleHByZXNzaW9uLCBwYXRoLCBcIlppZyBvcmRlcmVkLWV4cHJlc3Npb24gdGVtcG9yYXJ5IHVzZVwiKVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZXR1cm4gdGhpcy5tYXBwZWQoZXhwcmVzc2lvbi5uYW1lLCBleHByZXNzaW9uLCBwYXRoLCBcIm5hbWVcIilcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQm9vbGVhbkxpdGVyYWxcIikgcmV0dXJuIHRoaXMubWFwcGVkKFN0cmluZyhleHByZXNzaW9uLnZhbHVlKSwgZXhwcmVzc2lvbiwgcGF0aCwgXCJsaXRlcmFsXCIpXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkludGVnZXJMaXRlcmFsXCIpIHJldHVybiB0aGlzLm1hcHBlZChTdHJpbmcoZXhwcmVzc2lvbi52YWx1ZSksIGV4cHJlc3Npb24sIHBhdGgsIFwibGl0ZXJhbFwiKVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIpIHJldHVybiB0aGlzLm1hcHBlZCh6aWdTdHJpbmcoZXhwcmVzc2lvbi52YWx1ZSksIGV4cHJlc3Npb24sIHBhdGgsIFwibGl0ZXJhbFwiKVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuc2VxdWVuY2VkIGV4cHJlc3Npb24gcGFzc2VkIFppZyBlbWlzc2lvbi5cIilcbiAgfVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIHRoZSBmaW5hbCBwdXJlIHZhbHVlIG93bmVkIGJ5IGEgbm9uLXZvaWQgc3RhdGVtZW50IHBsYW4uXG4gKiBAcGFyYW0ge1ppZ1N0YXRlbWVudFBsYW59IHBsYW4gLSBTdGF0ZW1lbnQgcGxhbi5cbiAqIEBwYXJhbSB7U3RhdGVtZW50fSBzdGF0ZW1lbnQgLSBPd25pbmcgc2VtYW50aWMgc3RhdGVtZW50LlxuICogQHJldHVybnMge1ppZ1BsYW5uZWRWYWx1ZX0gUmVxdWlyZWQgcGxhbm5lZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZWRQbGFuVmFsdWUocGxhbiwgc3RhdGVtZW50KSB7XG4gIGlmICghcGxhbi52YWx1ZSkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHZhbGlkYXRlZCBaaWcgdmFsdWUgZm9yICR7c3RhdGVtZW50LmtpbmR9LmApXG4gIHJldHVybiBwbGFuLnZhbHVlXG59XG5cbi8qKlxuICogTmFycm93cyBhbiBhbHJlYWR5IHZhbGlkYXRlZCBzZW1hbnRpYyB0eXBlIHRvIHRoZSBaaWcgc2NhbGFyIGNvaG9ydC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBTZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBEaWFnbm9zdGljIGxvY2F0aW9uLlxuICogQHJldHVybnMge1NjYWxhcn0gU2NhbGFyIHR5cGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gemlnVHlwZSh0eXBlLCBsb2NhdGlvbikge1xuICBpZiAodHlwZS5raW5kICE9IFwiVHlwZVJlZmVyZW5jZVwiKSByZXR1cm4gdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwiemlnXCIsIFwiY29sbGVjdGlvbiB0eXBlIHJlYWNoZWQgc2NhbGFyIGVtaXNzaW9uXCIsIGxvY2F0aW9uKVxuICByZXR1cm4gdHlwZS5uYW1lXG59XG5cbi8qKlxuICogRW5jb2RlcyBhIFVuaWNvZGUgc2NhbGFyIHN0cmluZyBhcyBhIGNhbm9uaWNhbCBaaWcgbGl0ZXJhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFNlbWFudGljIHN0cmluZyB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFppZyBsaXRlcmFsIHNwZWxsaW5nLlxuICovXG5mdW5jdGlvbiB6aWdTdHJpbmcodmFsdWUpIHtcbiAgbGV0IGxpdGVyYWwgPSAnXCInXG5cbiAgZm9yIChjb25zdCBjaGFyYWN0ZXIgb2YgdmFsdWUpIHtcbiAgICBjb25zdCBzY2FsYXIgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGNoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKSlcblxuICAgIGlmIChjaGFyYWN0ZXIgPT0gJ1wiJykgbGl0ZXJhbCArPSAnXFxcXFwiJ1xuICAgIGVsc2UgaWYgKGNoYXJhY3RlciA9PSBcIlxcXFxcIikgbGl0ZXJhbCArPSBcIlxcXFxcXFxcXCJcbiAgICBlbHNlIGlmIChzY2FsYXIgPCAzMiB8fCBzY2FsYXIgPT0gMTI3KSBsaXRlcmFsICs9IGBcXFxceCR7c2NhbGFyLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIil9YFxuICAgIGVsc2UgaWYgKHNjYWxhciA9PSAweDIwMjggfHwgc2NhbGFyID09IDB4MjAyOSkgbGl0ZXJhbCArPSBgXFxcXHV7JHtzY2FsYXIudG9TdHJpbmcoMTYpfX1gXG4gICAgZWxzZSBsaXRlcmFsICs9IGNoYXJhY3RlclxuICB9XG4gIHJldHVybiBsaXRlcmFsICsgJ1wiJ1xufVxuXG4vKipcbiAqIFJlcGFyc2VzIHRoZSBjb21wbGV0ZSBnZW5lcmF0ZWQgc291cmNlIGFuZCByZWplY3RzIHJlY292ZXJ5IG9yIGV4Y2Vzc2l2ZSBkZXB0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBHZW5lcmF0ZWQgWmlnIHNvdXJjZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gTW9kdWxlIGRpYWdub3N0aWMgbG9jYXRpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gUmV0dXJucyBvbmx5IGFmdGVyIHRoZSBjb21wbGV0ZSBDU1QgaXMgYWNjZXB0ZWQuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlR2VuZXJhdGVkWmlnKHNvdXJjZSwgbG9jYXRpb24pIHtcbiAgbGV0IHNuYXBzaG90XG5cbiAgdHJ5IHtcbiAgICBzbmFwc2hvdCA9IHBhcnNlWmlnQ3N0KHNvdXJjZSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwiemlnXCIsIGBnZW5lcmF0ZWQgc291cmNlIGNvdWxkIG5vdCBiZSByZXBhcnNlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWAsIGxvY2F0aW9uKVxuICB9XG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgb25lIGdlbmVyYXRlZCBDU1Qgc3VidHJlZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mcm9udGVuZHMvemlnLXBhcnNlci5qc1wiKS5Dc3ROb2RlfSBub2RlIC0gQ3VycmVudCBwYXJzZXIgbm9kZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIC0gQ3VycmVudCBuZXN0aW5nIGRlcHRoLlxuICAgKi9cbiAgY29uc3QgdmlzaXQgPSAobm9kZSwgZGVwdGgpID0+IHtcbiAgICBpZiAoZGVwdGggPiA1MTIgfHwgbm9kZS5lcnJvciB8fCBub2RlLm1pc3NpbmcgfHwgbm9kZS5oYXNFcnJvcikgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwiemlnXCIsIFwiZ2VuZXJhdGVkIHNvdXJjZSBjb250YWlucyBwYXJzZXIgcmVjb3Zlcnkgb3IgZXhjZWVkcyB0aGUgQ1NUIGRlcHRoIGxpbWl0XCIsIGxvY2F0aW9uKVxuICAgIGZvciAoY29uc3Qge25vZGU6IGNoaWxkfSBvZiBub2RlLmNoaWxkcmVuKSB2aXNpdChjaGlsZCwgZGVwdGggKyAxKVxuICB9XG5cbiAgdmlzaXQoc25hcHNob3Qucm9vdCwgMClcbn1cbiJdfQ==
|