semantifold 0.5.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 +10 -7
- package/build/src/backends/android.js +7 -3
- 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 +24 -1
- package/build/src/backends/ios.js +2 -2
- 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/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +2 -1
- package/build/src/backends/shared.js +4 -4
- 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 +30 -1
- package/build/src/mapping.js +2 -2
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +2 -2
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +2 -2
- 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 +2 -2
- package/docs/architecture.md +11 -5
- package/docs/goals.md +1 -1
- package/docs/language-support.md +8 -4
- package/docs/parser-qualification.md +31 -1
- package/docs/source-maps.md +5 -3
- package/docs/testing.md +26 -4
- package/docs/zig.md +33 -0
- 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 +6 -2
- package/src/backends/identifiers.js +24 -0
- package/src/backends/ios.js +1 -1
- package/src/backends/native-validation.js +1 -1
- package/src/backends/scalars.js +1 -0
- package/src/backends/shared.js +3 -3
- 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 +30 -0
- package/src/mapping.js +1 -1
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +1 -1
- package/src/semantic/validate.js +1 -1
- package/src/toolchains.js +1 -0
- package/src/zig-bindings.js +46 -0
|
@@ -101,6 +101,12 @@ export declare const canonicalToolchains: {
|
|
|
101
101
|
supportedVersion: RegExp;
|
|
102
102
|
versionArguments: string[];
|
|
103
103
|
};
|
|
104
|
+
zig: {
|
|
105
|
+
canonicalCommand: string;
|
|
106
|
+
overrideEnvironmentVariable: string;
|
|
107
|
+
supportedVersion: RegExp;
|
|
108
|
+
versionArguments: string[];
|
|
109
|
+
};
|
|
104
110
|
swiftc: {
|
|
105
111
|
canonicalCommand: string;
|
|
106
112
|
overrideEnvironmentVariable: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolchains.d.ts","sourceRoot":"","sources":["../../src/toolchains.js"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB;;
|
|
1
|
+
{"version":3,"file":"toolchains.d.ts","sourceRoot":"","sources":["../../src/toolchains.js"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB;;0BAoLA,MAAM;qCAA+B,MAAM;0BAAoB,MAAM;0BAAoB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA5J/H,CAAA;AAEF;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAJxC,MAAM,OAAO,mBAI2B,EAAE,OAAO,AAHzD,CACA,EADQ;IAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAG5C,GAFpD,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CA+BtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAT1C;IAAsB,gBAAgB,EAA9B,MAAM,CACd;IAA6D,WAAW,AAAxE,CACA,EADQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CACpD;IAAsB,EAAE,EAAhB,MAAM,CACd;IAAuB,QAAQ,AAA/B,CACA,EADQ,MAAM,CACd;IAAuB,gBAAgB,AAAvC,CACA,EADQ,MAAM,CACd;IAAuB,SAAS,AAAhC,CACA,EADQ,MAAM,CACd;IAAwB,gBAAgB,EAAhC,MAAM,EAAE,CAChB;CAE0C,GAFhC,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CAmGtE;AA+HD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,GAHzC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAGqB,GAF9D,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqB5C"}
|
package/build/src/toolchains.js
CHANGED
|
@@ -25,6 +25,7 @@ export const canonicalToolchains = deepFreeze({
|
|
|
25
25
|
clang: definition("clang", "SEMANTIFOLD_CLANG", ["--version"], /^Ubuntu clang version 21\.1\.8 [^\n]+\nTarget: x86_64-pc-linux-gnu\n/u),
|
|
26
26
|
rustc: definition("rustc", "SEMANTIFOLD_RUSTC", ["--version", "--verbose"], /^rustc 1\.98\.1 \(48a229cea 2026-09-01\)\nbinary: rustc\ncommit-hash: 48a229ceaefd4985c50990b14116b6d856af0985\ncommit-date: 2026-09-01\nhost: x86_64-unknown-linux-gnu\nrelease: 1\.98\.1\nLLVM version: 22\.1\.8$/u),
|
|
27
27
|
cargo: definition("cargo", "SEMANTIFOLD_CARGO", ["--version", "--verbose"], /^cargo 1\.98\.1 \(797e8a9bc 2026-08-05\)\nrelease: 1\.98\.1\ncommit-hash: 797e8a9bca276c1c9f9f738d2a20f484fa4eea9d\ncommit-date: 2026-08-05\nhost: x86_64-unknown-linux-gnu\n/u),
|
|
28
|
+
zig: definition("zig", "SEMANTIFOLD_ZIG", ["version"], /^0\.15\.2$/u),
|
|
28
29
|
swiftc: definition("swiftc", "SEMANTIFOLD_SWIFTC", ["--driver-mode=swiftc", "--version"], /^Swift version 6\.3\.3 \(swift-6\.3\.3-RELEASE\)\nTarget: x86_64-unknown-linux-gnu$/u),
|
|
29
30
|
"wasm-validate": definition("wasm-validate", "SEMANTIFOLD_WASM_VALIDATE", ["--version"], /^1\.0\.36$/u),
|
|
30
31
|
chromium: definition("chromium", "SEMANTIFOLD_CHROMIUM", ["--version"], /^Google Chrome 152\.0\.7977\.82$/u)
|
|
@@ -425,4 +426,4 @@ function deepFreeze(value) {
|
|
|
425
426
|
deepFreeze(nested);
|
|
426
427
|
return Object.freeze(value);
|
|
427
428
|
}
|
|
428
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWlucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sY2hhaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQ3hELDJGQUEyRixDQUFDO0lBQzlGLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsZ0VBQWdFLENBQUM7SUFDNUgsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDekUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtC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RSxPQUFPLFNBQVMsQ0FBQTtZQUMzRixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUE7QUFDL0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLElBQUkscUJBQXFCLENBQUMsRUFBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO0FBQ3JGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU5RSxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Y29uc3RhbnRzIGFzIGZzQ29uc3RhbnRzfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQge2FjY2VzcywgcmVhbHBhdGgsIHN0YXR9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtpc0RlbnNlQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7ZXhjZWVkZWRPd25lZERlYWRsaW5lLCBleGVjdXRlRmlsZVdpdGhEZWFkbGluZX0gZnJvbSBcIi4vc3VicHJvY2Vzcy5qc1wiXG5pbXBvcnQge2lzU3VwcG9ydGVkVGltZW91dE1zLCBtYXhpbXVtVGltZW91dE1zfSBmcm9tIFwiLi90aW1lb3V0LmpzXCJcblxuY29uc3QgZGVmYXVsdFRpbWVvdXRNcyA9IDEwXzAwMFxuXG5leHBvcnQgY29uc3QgY2Fub25pY2FsVG9vbGNoYWlucyA9IGRlZXBGcmVlemUoe1xuICBkYXJ0OiBkZWZpbml0aW9uKFwiZGFydFwiLCBcIlNFTUFOVElGT0xEX0RBUlRcIiwgW1wiLS12ZXJzaW9uXCJdLFxuICAgIC9eRGFydCBTREsgdmVyc2lvbjogM1xcLjEzXFwuMyBcXChzdGFibGVcXCkgXFwoVHVlIFNlcCAxIDAxOjA3OjE3IDIwMjYgLTA3MDBcXCkgb24gXCJsaW51eF94NjRcIiQvdSksXG4gIHBocDogZGVmaW5pdGlvbihcInBocFwiLCBcIlNFTUFOVElGT0xEX1BIUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eUEhQIDhcXC4vdSksXG4gIHBocDgyOiBkZWZpbml0aW9uKFwicGhwXCIsIFwiU0VNQU5USUZPTERfUEhQXCIsIFtcIi0tdmVyc2lvblwiXSwgL15QSFAgKD86OFxcLig/OlsyLTldfFsxLTldWzAtOV0rKXwoPzo5fFsxLTldWzAtOV0rKVxcLlswLTldKylcXC4vdSksXG4gIHJ1Ynk6IGRlZmluaXRpb24oXCJydWJ5XCIsIFwiU0VNQU5USUZPTERfUlVCWVwiLCBbXCItLXZlcnNpb25cIl0sIC9ecnVieSAzXFwuL3UpLFxuICBub2RlOiBkZWZpbml0aW9uKFwibm9kZVwiLCBcIlNFTUFOVElGT0xEX05PREVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXnYyNFxcLi91KSxcbiAgdHNjOiBkZWZpbml0aW9uKFwidHNjXCIsIFwiU0VNQU5USUZPTERfVFNDXCIsIFtcIi0tdmVyc2lvblwiXSwgL15WZXJzaW9uIDdcXC4vdSksXG4gIGphdmFjOiBkZWZpbml0aW9uKFwiamF2YWNcIiwgXCJTRU1BTlRJRk9MRF9KQVZBQ1wiLCBbXCItdmVyc2lvblwiXSwgL15qYXZhYyAoPzoxWzctOV18MlswLTldKVxcLi91KSxcbiAgamF2YTogZGVmaW5pdGlvbihcImphdmFcIiwgXCJTRU1BTlRJRk9MRF9KQVZBXCIsIFtcIi12ZXJzaW9uXCJdLCAvXig/Om9wZW5qZGt8amF2YSkgdmVyc2lvbiBcIig/OjFbNy05XXwyWzAtOV0pXFwuL3UpLFxuICBqYXZhMjU6IGRlZmluaXRpb24oXCJqYXZhXCIsIFwiU0VNQU5USUZPTERfSkFWQVwiLCBbXCItdmVyc2lvblwiXSxcbiAgICAvXm9wZW5qZGsgdmVyc2lvbiBcIjI1XFwuMFxcLjRcIiAyMDI2LTA3LTIxXFxuT3BlbkpESyBSdW50aW1lIEVudmlyb25tZW50IFxcKGJ1aWxkIDI1XFwuMFxcLjRcXCs3LTEtKCg/OjI0fDI2KVxcLjA0KS1VYnVudHVcXClcXG5PcGVuSkRLIDY0LUJpdCBTZXJ2ZXIgVk0gXFwoYnVpbGQgMjVcXC4wXFwuNFxcKzctMS1cXDEtVWJ1bnR1LCBtaXhlZCBtb2RlLCBzaGFyaW5nXFwpJC91KSxcbiAga290bGluYzogZGVmaW5pdGlvbihcImtvdGxpbmNcIiwgXCJTRU1BTlRJRk9MRF9LT1RMSU5DXCIsIFtcIi12ZXJzaW9uXCJdLCAvXmluZm86IGtvdGxpbmMtanZtIDJcXC40XFwuMjAgXFwoSlJFIDI1XFwuMFxcLjRcXCs3LTEtKD86MjR8MjYpXFwuMDQtVWJ1bnR1XFwpJC91KSxcbiAgcHl0aG9uOiBkZWZpbml0aW9uKFwicHl0aG9uM1wiLCBcIlNFTUFOVElGT0xEX1BZVEhPTlwiLCBbXCItLXZlcnNpb25cIl0sIC9eUHl0aG9uIDNcXC4vdSksXG4gIGRvdG5ldDogZGVmaW5pdGlvbihcImRvdG5ldFwiLCBcIlNFTUFOVElGT0xEX0RPVE5FVFwiLCBbXCItLXZlcnNpb25cIl0sIC9eMTBcXC4vdSksXG4gIGdvOiBkZWZpbml0aW9uKFwiZ29cIiwgXCJTRU1BTlRJRk9MRF9HT1wiLCBbXCJ2ZXJzaW9uXCJdLCAvXmdvIHZlcnNpb24gZ28xXFwuMjZcXC5cXGQrIGxpbnV4XFwvYW1kNjQkL3UpLFxuICBjbGFuZ3BwOiBkZWZpbml0aW9uKFwiY2xhbmcrK1wiLCBcIlNFTUFOVElGT0xEX0NMQU5HUFBcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXlVidW50dSBjbGFuZyB2ZXJzaW9uIDIxXFwuMVxcLjggW15cXG5dK1xcblRhcmdldDogeDg2XzY0LXBjLWxpbnV4LWdudVxcbi91KSxcbiAgY2xhbmc6IGRlZmluaXRpb24oXCJjbGFuZ1wiLCBcIlNFTUFOVElGT0xEX0NMQU5HXCIsIFtcIi0tdmVyc2lvblwiXSwgL15VYnVudHUgY2xhbmcgdmVyc2lvbiAyMVxcLjFcXC44IFteXFxuXStcXG5UYXJnZXQ6IHg4Nl82NC1wYy1saW51eC1nbnVcXG4vdSksXG4gIHJ1c3RjOiBkZWZpbml0aW9uKFwicnVzdGNcIiwgXCJTRU1BTlRJRk9MRF9SVVNUQ1wiLCBbXCItLXZlcnNpb25cIiwgXCItLXZlcmJvc2VcIl0sIC9ecnVzdGMgMVxcLjk4XFwuMSBcXCg0OGEyMjljZWEgMjAyNi0wOS0wMVxcKVxcbmJpbmFyeTogcnVzdGNcXG5jb21taXQtaGFzaDogNDhhMjI5Y2VhZWZkNDk4NWM1MDk5MGIxNDExNmI2ZDg1NmFmMDk4NVxcbmNvbW1pdC1kYXRlOiAyMDI2LTA5LTAxXFxuaG9zdDogeDg2XzY0LXVua25vd24tbGludXgtZ251XFxucmVsZWFzZTogMVxcLjk4XFwuMVxcbkxMVk0gdmVyc2lvbjogMjJcXC4xXFwuOCQvdSksXG4gIGNhcmdvOiBkZWZpbml0aW9uKFwiY2FyZ29cIiwgXCJTRU1BTlRJRk9MRF9DQVJHT1wiLCBbXCItLXZlcnNpb25cIiwgXCItLXZlcmJvc2VcIl0sIC9eY2FyZ28gMVxcLjk4XFwuMSBcXCg3OTdlOGE5YmMgMjAyNi0wOC0wNVxcKVxcbnJlbGVhc2U6IDFcXC45OFxcLjFcXG5jb21taXQtaGFzaDogNzk3ZThhOWJjYTI3NmMxYzlmOWY3MzhkMmEyMGY0ODRmYTRlZWE5ZFxcbmNvbW1pdC1kYXRlOiAyMDI2LTA4LTA1XFxuaG9zdDogeDg2XzY0LXVua25vd24tbGludXgtZ251XFxuL3UpLFxuICBzd2lmdGM6IGRlZmluaXRpb24oXCJzd2lmdGNcIiwgXCJTRU1BTlRJRk9MRF9TV0lGVENcIiwgW1wiLS1kcml2ZXItbW9kZT1zd2lmdGNcIiwgXCItLXZlcnNpb25cIl0sIC9eU3dpZnQgdmVyc2lvbiA2XFwuM1xcLjMgXFwoc3dpZnQtNlxcLjNcXC4zLVJFTEVBU0VcXClcXG5UYXJnZXQ6IHg4Nl82NC11bmtub3duLWxpbnV4LWdudSQvdSksXG4gIFwid2FzbS12YWxpZGF0ZVwiOiBkZWZpbml0aW9uKFwid2FzbS12YWxpZGF0ZVwiLCBcIlNFTUFOVElGT0xEX1dBU01fVkFMSURBVEVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXjFcXC4wXFwuMzYkL3UpLFxuICBjaHJvbWl1bTogZGVmaW5pdGlvbihcImNocm9taXVtXCIsIFwiU0VNQU5USUZPTERfQ0hST01JVU1cIiwgW1wiLS12ZXJzaW9uXCJdLCAvXkdvb2dsZSBDaHJvbWUgMTUyXFwuMFxcLjc5NzdcXC44MiQvdSlcbn0pXG5cbi8qKlxuICogRGlzY292ZXJzIG9uZSByZXBvc2l0b3J5LWRlY2xhcmVkIGNhbm9uaWNhbCB0b29sY2hhaW4uXG4gKiBAcGFyYW0ge2tleW9mIHR5cGVvZiBjYW5vbmljYWxUb29sY2hhaW5zfSBpZCAtIENhbm9uaWNhbCB0b29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3tlbnZpcm9ubWVudD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+LCBvdmVycmlkZT86IHN0cmluZywgdGltZW91dE1zPzogbnVtYmVyfX0gW29wdGlvbnNdIC0gRGlzY292ZXJ5IG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkRpc2NvdmVyZWRUb29sY2hhaW4+fSBFeGFjdCBleGVjdXRhYmxlIGFuZCB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJDYW5vbmljYWxUb29sY2hhaW4oaWQsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAodHlwZW9mIGlkICE9IFwic3RyaW5nXCIgfHwgaWQubGVuZ3RoID09IDApIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBJRCBtdXN0IGJlIGEgbm9uLWVtcHR5IHByaW1pdGl2ZSBzdHJpbmcuXCIsIFwidG9vbGNoYWluXCIpXG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9wdGlvbnMpKSBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0LlwiLCBpZClcbiAgY29uc3QgZGVmaW5pdGlvbiA9IE9iamVjdC5oYXNPd24oY2Fub25pY2FsVG9vbGNoYWlucywgaWQpXG4gICAgPyBjYW5vbmljYWxUb29sY2hhaW5zWy8qKiBAdHlwZSB7a2V5b2YgdHlwZW9mIGNhbm9uaWNhbFRvb2xjaGFpbnN9ICovIChpZCldXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAoIWRlZmluaXRpb24pIGludmFsaWRUb29sY2hhaW4oYFVua25vd24gY2Fub25pY2FsIHRvb2xjaGFpbiAnJHtpZH0nLmAsIGlkKVxuICBjb25zdCBjb25maWd1cmF0aW9uRW52aXJvbm1lbnQgPSBvcHRpb25zLmVudmlyb25tZW50ID09PSB1bmRlZmluZWRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogc25hcHNob3RFbnZpcm9ubWVudChvcHRpb25zLmVudmlyb25tZW50LCBpZClcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBjb25maWd1cmF0aW9uRW52aXJvbm1lbnQgPz8gZGVmYXVsdEVudmlyb25tZW50KClcbiAgY29uc3QgY29uZmlndXJlZCA9IG9wdGlvbnMub3ZlcnJpZGUgPT09IHVuZGVmaW5lZFxuICAgID8gY29uZmlndXJhdGlvbkVudmlyb25tZW50ID09PSB1bmRlZmluZWRcbiAgICAgID8gcHJvY2Vzcy5lbnZbZGVmaW5pdGlvbi5vdmVycmlkZUVudmlyb25tZW50VmFyaWFibGVdXG4gICAgICA6IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudFtkZWZpbml0aW9uLm92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZV1cbiAgICA6IG9wdGlvbnMub3ZlcnJpZGVcblxuICByZXR1cm4gZGlzY292ZXJUb29sY2hhaW4oe1xuICAgIGNhbm9uaWNhbENvbW1hbmQ6IGRlZmluaXRpb24uY2Fub25pY2FsQ29tbWFuZCxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBpZCxcbiAgICBvdmVycmlkZTogY29uZmlndXJlZCxcbiAgICBzdXBwb3J0ZWRWZXJzaW9uOiBkZWZpbml0aW9uLnN1cHBvcnRlZFZlcnNpb24sXG4gICAgdGltZW91dE1zOiBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICB2ZXJzaW9uQXJndW1lbnRzOiBkZWZpbml0aW9uLnZlcnNpb25Bcmd1bWVudHNcbiAgfSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhbmQgdmVyc2lvbnMgb25lIGNvbmZpZ3VyZWQgb3IgY2Fub25pY2FsIGV4ZWN1dGFibGUgd2l0aG91dCBpbnZva2luZyBhIHNoZWxsLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gRGlzY292ZXJ5IHJlcXVlc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuY2Fub25pY2FsQ29tbWFuZCAtIENhbm9uaWNhbCBQQVRIIGNvbW1hbmQuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBbaW5wdXQuZW52aXJvbm1lbnRdIC0gRXhwbGljaXQgZGlzY292ZXJ5IGVudmlyb25tZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmlkIC0gVG9vbGNoYWluIElELlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbnB1dC5vdmVycmlkZV0gLSBDb25maWd1cmVkIGFic29sdXRlIGV4ZWN1dGFibGUgcGF0aC5cbiAqIEBwYXJhbSB7UmVnRXhwfSBbaW5wdXQuc3VwcG9ydGVkVmVyc2lvbl0gLSBGdWxsIHNlbGVjdGVkLXN0cmVhbSB2ZXJzaW9uIHBvbGljeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW5wdXQudGltZW91dE1zXSAtIFZlcnNpb24gY29tbWFuZCB0aW1lb3V0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gaW5wdXQudmVyc2lvbkFyZ3VtZW50cyAtIEV4YWN0IHZlcnNpb24gYXJndW1lbnQgYXJyYXkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkRpc2NvdmVyZWRUb29sY2hhaW4+fSBEaXNjb3ZlcmVkIHRvb2wuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlclRvb2xjaGFpbihpbnB1dCkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXQpKSBpbnZhbGlkVG9vbGNoYWluKFwiVG9vbGNoYWluIGRpc2NvdmVyeSByZXF1aXJlcyBhIHJlcXVlc3Qgb2JqZWN0LlwiLCBcInRvb2xjaGFpblwiKVxuICBjb25zdCB2ZXJzaW9uQXJndW1lbnRDYW5kaWRhdGUgPSBpbnB1dC52ZXJzaW9uQXJndW1lbnRzXG4gIGNvbnN0IHZlcnNpb25Bcmd1bWVudHMgPSBpc0RlbnNlQXJyYXkodmVyc2lvbkFyZ3VtZW50Q2FuZGlkYXRlKSA/IFsuLi52ZXJzaW9uQXJndW1lbnRDYW5kaWRhdGVdIDogdW5kZWZpbmVkXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHtcbiAgICBjYW5vbmljYWxDb21tYW5kOiBpbnB1dC5jYW5vbmljYWxDb21tYW5kLFxuICAgIGVudmlyb25tZW50OiBpbnB1dC5lbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdEVudmlyb25tZW50KCkgOiBpbnB1dC5lbnZpcm9ubWVudCxcbiAgICBpZDogaW5wdXQuaWQsXG4gICAgb3ZlcnJpZGU6IGlucHV0Lm92ZXJyaWRlLFxuICAgIHN1cHBvcnRlZFZlcnNpb246IGlucHV0LnN1cHBvcnRlZFZlcnNpb24sXG4gICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0TXMgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRUaW1lb3V0TXMgOiBpbnB1dC50aW1lb3V0TXMsXG4gICAgdmVyc2lvbkFyZ3VtZW50c1xuICB9XG5cbiAgdmFsaWRhdGVEaXNjb3ZlcnkoY2FuZGlkYXRlKVxuICBjb25zdCBjYW5vbmljYWxDb21tYW5kID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChjYW5kaWRhdGUuY2Fub25pY2FsQ29tbWFuZClcbiAgY29uc3QgZW52aXJvbm1lbnQgPSAvKiogQHR5cGUge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSAqLyAoY2FuZGlkYXRlLmVudmlyb25tZW50KVxuICBjb25zdCBpZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoY2FuZGlkYXRlLmlkKVxuICBjb25zdCBvdmVycmlkZSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqLyAoY2FuZGlkYXRlLm92ZXJyaWRlKVxuICBjb25zdCBzdXBwb3J0ZWRWZXJzaW9uID0gY2FuZGlkYXRlLnN1cHBvcnRlZFZlcnNpb24gaW5zdGFuY2VvZiBSZWdFeHBcbiAgICA/IG5ldyBSZWdFeHAoY2FuZGlkYXRlLnN1cHBvcnRlZFZlcnNpb24uc291cmNlLCBjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbi5mbGFncylcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCB0aW1lb3V0TXMgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGNhbmRpZGF0ZS50aW1lb3V0TXMpXG4gIGNvbnN0IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoY2FuZGlkYXRlLnZlcnNpb25Bcmd1bWVudHMpXG4gIGNvbnN0IG5vcm1hbGl6ZWRFbnZpcm9ubWVudCA9IGRldGVybWluaXN0aWNFbnZpcm9ubWVudChlbnZpcm9ubWVudClcbiAgY29uc3Qge2V4ZWN1dGFibGUsIHNvdXJjZX0gPSBvdmVycmlkZSA9PT0gdW5kZWZpbmVkXG4gICAgPyBhd2FpdCByZXNvbHZlQ2Fub25pY2FsKGlkLCBjYW5vbmljYWxDb21tYW5kLCBub3JtYWxpemVkRW52aXJvbm1lbnQuUEFUSCA/PyBcIlwiKVxuICAgIDoge2V4ZWN1dGFibGU6IGF3YWl0IHJlc29sdmVPdmVycmlkZShpZCwgb3ZlcnJpZGUsIGNhbm9uaWNhbENvbW1hbmQpLCBzb3VyY2U6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIm92ZXJyaWRlXCIpfVxuICAvKiogQHR5cGUge3tzdGRvdXQ6IHN0cmluZywgc3RkZXJyOiBzdHJpbmd9fSAqL1xuICBsZXQgcmVzdWx0XG5cbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBhd2FpdCBleGVjdXRlRmlsZVdpdGhEZWFkbGluZSh7XG4gICAgICBhcmd1bWVudHM6IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMsXG4gICAgICBlbnZpcm9ubWVudDogbm9ybWFsaXplZEVudmlyb25tZW50LFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0TXNcbiAgICB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IHByb2Nlc3NFcnJvckZpZWxkcyhlcnJvcilcbiAgICBjb25zdCB0aW1lZE91dCA9IGV4Y2VlZGVkT3duZWREZWFkbGluZShlcnJvcilcblxuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgLi4ucHJvY2Vzc0Vycm9yLFxuICAgICAgY2F1c2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZCxcbiAgICAgIGNvZGU6IHRpbWVkT3V0ID8gXCJUT09MX1ZFUlNJT05fVElNRU9VVFwiIDogXCJUT09MX1ZFUlNJT05fRkFJTFVSRVwiLFxuICAgICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiB0aW1lZE91dFxuICAgICAgICA/IGBWZXJzaW9uIGNvbW1hbmQgZm9yICcke2V4ZWN1dGFibGV9JyBleGNlZWRlZCAke3RpbWVvdXRNc31tcy5gXG4gICAgICAgIDogYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIGZhaWxlZC5gLFxuICAgICAgc3RkZXJyOiBwcm9jZXNzRXJyb3Iuc3RkZXJyLFxuICAgICAgc3Rkb3V0OiBwcm9jZXNzRXJyb3Iuc3Rkb3V0XG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IHtzdGRlcnIsIHN0ZG91dH0gPSByZXN1bHRcbiAgY29uc3Qgbm9ybWFsaXplZFN0ZG91dCA9IHN0ZG91dC50cmltKClcbiAgY29uc3Qgbm9ybWFsaXplZFN0ZGVyciA9IHN0ZGVyci50cmltKClcbiAgY29uc3QgdmVyc2lvbk91dHB1dCA9IG5vcm1hbGl6ZWRTdGRvdXQubGVuZ3RoID4gMCA/IG5vcm1hbGl6ZWRTdGRvdXQgOiBub3JtYWxpemVkU3RkZXJyXG4gIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uT3V0cHV0LnNwbGl0KC9cXHI/XFxuL3UpWzBdID8/IFwiXCJcblxuICBpZiAodmVyc2lvbi5sZW5ndGggPT0gMCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX1ZFUlNJT05fRkFJTFVSRVwiLFxuICAgICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiBgVmVyc2lvbiBjb21tYW5kIGZvciAnJHtleGVjdXRhYmxlfScgcmV0dXJuZWQgbm8gdmVyc2lvbiBvdXRwdXQuYCxcbiAgICAgIHN0ZGVycixcbiAgICAgIHN0ZG91dFxuICAgIH0pXG4gIH1cbiAgaWYgKHN1cHBvcnRlZFZlcnNpb24gJiYgIXN1cHBvcnRlZFZlcnNpb24udGVzdCh2ZXJzaW9uT3V0cHV0KSkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX1VOU1VQUE9SVEVEX1ZFUlNJT05cIixcbiAgICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYEV4ZWN1dGFibGUgJyR7ZXhlY3V0YWJsZX0nIHJlcG9ydGVkIHVuc3VwcG9ydGVkIHZlcnNpb24gJyR7dmVyc2lvbn0nLmAsXG4gICAgICBzdGRlcnIsXG4gICAgICBzdGRvdXQsXG4gICAgICB2ZXJzaW9uXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBkZWVwRnJlZXplKHtcbiAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgIGV4ZWN1dGFibGUsXG4gICAgaWQsXG4gICAgc291cmNlLFxuICAgIHZlcnNpb24sXG4gICAgdmVyc2lvbkFyZ3VtZW50czogdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyxcbiAgICB2ZXJzaW9uT3V0cHV0XG4gIH0pXG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSBjYW5vbmljYWwgaW1tdXRhYmxlIHRvb2xjaGFpbiBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjYW5vbmljYWxDb21tYW5kIC0gUEFUSCBjb21tYW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IG92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZSAtIENvbmZpZ3VyZWQgb3ZlcnJpZGUgdmFyaWFibGUuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB2ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge1JlZ0V4cH0gc3VwcG9ydGVkVmVyc2lvbiAtIFN1cHBvcnRlZCB2ZXJzaW9uIG91dHB1dC5cbiAqIEByZXR1cm5zIHt7Y2Fub25pY2FsQ29tbWFuZDogc3RyaW5nLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGU6IHN0cmluZywgc3VwcG9ydGVkVmVyc2lvbjogUmVnRXhwLCB2ZXJzaW9uQXJndW1lbnRzOiBzdHJpbmdbXX19IERlY2xhcmF0aW9uLlxuICovXG5mdW5jdGlvbiBkZWZpbml0aW9uKGNhbm9uaWNhbENvbW1hbmQsIG92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZSwgdmVyc2lvbkFyZ3VtZW50cywgc3VwcG9ydGVkVmVyc2lvbikge1xuICByZXR1cm4ge2Nhbm9uaWNhbENvbW1hbmQsIG92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZSwgc3VwcG9ydGVkVmVyc2lvbiwgdmVyc2lvbkFyZ3VtZW50c31cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdG9vbCBkaXNjb3ZlcnkgYmVmb3JlIGZpbGVzeXN0ZW0gb3IgcHJvY2VzcyBhY2Nlc3MuXG4gKiBAcGFyYW0ge3tcbiAqICAgY2Fub25pY2FsQ29tbWFuZDogdW5rbm93bixcbiAqICAgZW52aXJvbm1lbnQ6IHVua25vd24sXG4gKiAgIGlkOiB1bmtub3duLFxuICogICBvdmVycmlkZTogdW5rbm93bixcbiAqICAgc3VwcG9ydGVkVmVyc2lvbjogdW5rbm93bixcbiAqICAgdGltZW91dE1zOiB1bmtub3duLFxuICogICB2ZXJzaW9uQXJndW1lbnRzOiB1bmtub3duXG4gKiB9fSBpbnB1dCAtIENhbmRpZGF0ZSBkaXNjb3ZlcnkgZmllbGRzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRGlzY292ZXJ5KGlucHV0KSB7XG4gIGlmICh0eXBlb2YgaW5wdXQuaWQgIT0gXCJzdHJpbmdcIiB8fCBpbnB1dC5pZC5sZW5ndGggPT0gMCB8fFxuICAgIHR5cGVvZiBpbnB1dC5jYW5vbmljYWxDb21tYW5kICE9IFwic3RyaW5nXCIgfHwgaW5wdXQuY2Fub25pY2FsQ29tbWFuZC5sZW5ndGggPT0gMCB8fFxuICAgIGlucHV0LmNhbm9uaWNhbENvbW1hbmQuaW5jbHVkZXMoXCIvXCIpIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQuaW5jbHVkZXMoXCJcXFxcXCIpIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQuaW5jbHVkZXMoXCJcXDBcIikgfHxcbiAgICAhaXNEZW5zZUFycmF5KGlucHV0LnZlcnNpb25Bcmd1bWVudHMpIHx8ICFpbnB1dC52ZXJzaW9uQXJndW1lbnRzLmV2ZXJ5KHZhbGlkQXJndW1lbnQpIHx8XG4gICAgIWlzRW52aXJvbm1lbnQoaW5wdXQuZW52aXJvbm1lbnQpIHx8ICFpc1N1cHBvcnRlZFRpbWVvdXRNcyhpbnB1dC50aW1lb3V0TXMpIHx8XG4gICAgKGlucHV0Lm92ZXJyaWRlICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBpbnB1dC5vdmVycmlkZSAhPSBcInN0cmluZ1wiIHx8ICFwYXRoLmlzQWJzb2x1dGUoaW5wdXQub3ZlcnJpZGUpIHx8IGlucHV0Lm92ZXJyaWRlLmluY2x1ZGVzKFwiXFwwXCIpKSkgfHxcbiAgICAoaW5wdXQuc3VwcG9ydGVkVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmICghKGlucHV0LnN1cHBvcnRlZFZlcnNpb24gaW5zdGFuY2VvZiBSZWdFeHApIHx8IGlucHV0LnN1cHBvcnRlZFZlcnNpb24uZ2xvYmFsIHx8IGlucHV0LnN1cHBvcnRlZFZlcnNpb24uc3RpY2t5KSkpIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKGBUb29sY2hhaW4gZGlzY292ZXJ5IHJlcXVpcmVzIGEgY2Fub25pY2FsIGJhc2VuYW1lLCBhYnNvbHV0ZSBvdmVycmlkZSwgYXJndW1lbnQgYXJyYXksIGVudmlyb25tZW50LCBhbmQgdGltZW91dCBmcm9tIDEgdGhyb3VnaCAke21heGltdW1UaW1lb3V0TXN9bXMuYCxcbiAgICAgIHR5cGVvZiBpbnB1dC5pZCA9PSBcInN0cmluZ1wiID8gaW5wdXQuaWQgOiBcInRvb2xjaGFpblwiKVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIHVuYW1iaWd1b3VzIGNhbm9uaWNhbCBjb21tYW5kIGZyb20gYW4gZXhwbGljaXQgUEFUSC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIC0gQ2Fub25pY2FsIGNvbW1hbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFZhbHVlIC0gRXhwbGljaXQgUEFUSC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtleGVjdXRhYmxlOiBzdHJpbmcsIHNvdXJjZTogXCJjYW5vbmljYWxcIn0+fSBFeGFjdCBleGVjdXRhYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2Fub25pY2FsKGlkLCBjb21tYW5kLCBwYXRoVmFsdWUpIHtcbiAgY29uc3QgbWF0Y2hlcyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIHBhdGhWYWx1ZS5zcGxpdChwYXRoLmRlbGltaXRlcikpIHtcbiAgICBpZiAoZGlyZWN0b3J5Lmxlbmd0aCA9PSAwIHx8ICFwYXRoLmlzQWJzb2x1dGUoZGlyZWN0b3J5KSkgY29udGludWVcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBjb21tYW5kKVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKGNhbmRpZGF0ZSlcblxuICAgICAgaWYgKGV4YWN0ICE9IHVuZGVmaW5lZCkgbWF0Y2hlcy5zZXQoZXhhY3QsIGV4YWN0KVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQSBQQVRIIGNhbmRpZGF0ZSBpcyBhYnNlbnQgb3Igbm9uLWV4ZWN1dGFibGU7IGRpc2NvdmVyeSBjb250aW51ZXMgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gICAgfVxuICB9XG5cbiAgaWYgKG1hdGNoZXMuc2l6ZSA9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIlRPT0xfTk9UX0ZPVU5EXCIsXG4gICAgICBjb21tYW5kLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYENhbm9uaWNhbCBjb21tYW5kICcke2NvbW1hbmR9JyB3YXMgbm90IGZvdW5kIGFzIGFuIGV4ZWN1dGFibGUgb24gUEFUSC5gXG4gICAgfSlcbiAgfVxuICBpZiAobWF0Y2hlcy5zaXplID4gMSkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX0FNQklHVU9VU1wiLFxuICAgICAgY29tbWFuZCxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBDYW5vbmljYWwgY29tbWFuZCAnJHtjb21tYW5kfScgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgZXhlY3V0YWJsZXM6ICR7Wy4uLm1hdGNoZXMua2V5cygpXS5qb2luKFwiLCBcIil9LmBcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtleGVjdXRhYmxlOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKFsuLi5tYXRjaGVzLmtleXMoKV1bMF0pLCBzb3VyY2U6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImNhbm9uaWNhbFwiKX1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmUgY29uZmlndXJlZCBhYnNvbHV0ZSBleGVjdXRhYmxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIElELlxuICogQHBhcmFtIHtzdHJpbmd9IG92ZXJyaWRlIC0gQWJzb2x1dGUgb3ZlcnJpZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIENhbm9uaWNhbCBjb21tYW5kLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gRXhhY3QgZXhlY3V0YWJsZSBwYXRoLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlT3ZlcnJpZGUoaWQsIG92ZXJyaWRlLCBjb21tYW5kKSB7XG4gIC8qKiBAdHlwZSB7RXJyb3IgfCB1bmRlZmluZWR9ICovXG4gIGxldCBjYXVzZVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhhY3QgPSBhd2FpdCByZXNvbHZlRXhlY3V0YWJsZUZpbGUob3ZlcnJpZGUpXG5cbiAgICBpZiAoZXhhY3QgIT0gdW5kZWZpbmVkKSByZXR1cm4gZXhhY3RcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXVzZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZFxuICB9XG5cbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgY2F1c2UsXG4gICAgY29kZTogXCJUT09MX05PVF9GT1VORFwiLFxuICAgIGNvbW1hbmQsXG4gICAgZXhlY3V0YWJsZTogb3ZlcnJpZGUsXG4gICAgbGFuZ3VhZ2U6IGlkLFxuICAgIG1lc3NhZ2U6IGBDb25maWd1cmVkIGV4ZWN1dGFibGUgJyR7b3ZlcnJpZGV9JyBpcyBtaXNzaW5nIG9yIG5vdCBleGVjdXRhYmxlLmBcbiAgfSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmUgY2FuZGlkYXRlIHRvIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBwYXRoLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPn0gRXhhY3QgcmVndWxhciBleGVjdXRhYmxlLCBpZiB0aGUgZmlsZSB0eXBlIGlzIHZhbGlkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRXhlY3V0YWJsZUZpbGUoY2FuZGlkYXRlKSB7XG4gIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVhbHBhdGgoY2FuZGlkYXRlKVxuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzdGF0KGV4YWN0KVxuXG4gIGlmICghc3RhdHVzLmlzRmlsZSgpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGF3YWl0IGFjY2VzcyhleGFjdCwgZnNDb25zdGFudHMuWF9PSylcblxuICByZXR1cm4gZXhhY3Rcbn1cblxuLyoqXG4gKiBQcm9kdWNlcyB0aGUgbWluaW1hbCBkZXRlcm1pbmlzdGljIHByb2Nlc3MgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBlbnZpcm9ubWVudCAtIEV4cGxpY2l0IGlucHV0cy5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pn0gTm9ybWFsaXplZCBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluaXN0aWNFbnZpcm9ubWVudChlbnZpcm9ubWVudCA9IGRlZmF1bHRFbnZpcm9ubWVudCgpKSB7XG4gIGNvbnN0IGVudHJpZXMgPSBlbnZpcm9ubWVudEVudHJpZXMoZW52aXJvbm1lbnQpXG5cbiAgaWYgKGVudHJpZXMgPT0gdW5kZWZpbmVkKSBpbnZhbGlkVG9vbGNoYWluKFwiUHJvY2VzcyBlbnZpcm9ubWVudCBtdXN0IGJlIGEgcGxhaW4gb3duLXByb3BlcnR5IGRhdGEgcmVjb3JkIG9mIHN0cmluZyBvciB1bmRlZmluZWQgdmFsdWVzLlwiLCBcImVudmlyb25tZW50XCIpXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCEvXltBLVphLXpfXVtBLVphLXowLTlfXSokL3UudGVzdChrZXkpIHx8IGtleS5pbmNsdWRlcyhcIlxcMFwiKSB8fCAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5pbmNsdWRlcyhcIlxcMFwiKSkpIHtcbiAgICAgIGludmFsaWRUb29sY2hhaW4oXCJQcm9jZXNzIGVudmlyb25tZW50IGNvbnRhaW5zIGFuIGludmFsaWQga2V5IG9yIHZhbHVlLlwiLCBcImVudmlyb25tZW50XCIpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkW2tleV0gPSB2YWx1ZVxuICB9XG4gIG5vcm1hbGl6ZWQuTEFORyA9IFwiQy5VVEYtOFwiXG4gIG5vcm1hbGl6ZWQuTENfQUxMID0gXCJDLlVURi04XCJcbiAgbm9ybWFsaXplZC5UWiA9IFwiVVRDXCJcbiAgbm9ybWFsaXplZC5QQVRIID8/PSBcIi91c3IvbG9jYWwvYmluOi91c3IvYmluOi9iaW5cIlxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKG5vcm1hbGl6ZWQpXG59XG5cbi8qKlxuICogUmV0YWlucyBvbmx5IGV4ZWN1dGFibGUgbG9va3VwIGZyb20gdGhlIGFtYmllbnQgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IE1pbmltYWwgZGVmYXVsdCBlbnZpcm9ubWVudC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEVudmlyb25tZW50KCkge1xuICByZXR1cm4ge1BBVEg6IHByb2Nlc3MuZW52LlBBVEh9XG59XG5cbi8qKlxuICogTmFycm93cyBzdGFibGUgZmllbGRzIGZyb20gYSB2ZXJzaW9uIHN1YnByb2Nlc3MgcmVqZWN0aW9uLlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIFByb2Nlc3MgcmVqZWN0aW9uLlxuICogQHJldHVybnMge3tleGl0Q29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RkZXJyOiBzdHJpbmcsIHN0ZG91dDogc3RyaW5nfX0gU3RhYmxlIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKSB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9IFwib2JqZWN0XCIpIHJldHVybiB7ZXhpdENvZGU6IHVuZGVmaW5lZCwgc2lnbmFsOiB1bmRlZmluZWQsIHN0ZGVycjogXCJcIiwgc3Rkb3V0OiBcIlwifVxuICBjb25zdCB2YWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChlcnJvcilcblxuICByZXR1cm4ge1xuICAgIGV4aXRDb2RlOiB0eXBlb2YgdmFsdWUuY29kZSA9PSBcIm51bWJlclwiID8gdmFsdWUuY29kZSA6IHVuZGVmaW5lZCxcbiAgICBzaWduYWw6IHR5cGVvZiB2YWx1ZS5zaWduYWwgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNpZ25hbCA6IHVuZGVmaW5lZCxcbiAgICBzdGRlcnI6IHR5cGVvZiB2YWx1ZS5zdGRlcnIgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLnN0ZGVyciA6IFwiXCIsXG4gICAgc3Rkb3V0OiB0eXBlb2YgdmFsdWUuc3Rkb3V0ID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRvdXQgOiBcIlwiXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgb25lIHNoZWxsLWZyZWUgYXJndW1lbnQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGFyZ3VtZW50LlxuICogQHJldHVybnMge3ZhbHVlIGlzIHN0cmluZ30gV2hldGhlciB0aGUgYXJndW1lbnQgaXMgc2FmZSB0byBwYXNzIGRpcmVjdGx5LlxuICovXG5mdW5jdGlvbiB2YWxpZEFyZ3VtZW50KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuaW5jbHVkZXMoXCJcXDBcIilcbn1cblxuLyoqXG4gKiBDaGVja3MgZXhwbGljaXQgcHJvY2Vzcy1lbnZpcm9ubWVudCB2YWx1ZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50LlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBXaGV0aGVyIGVudHJpZXMgYXJlIHN0cmluZ3Mgb3IgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBpc0Vudmlyb25tZW50KHZhbHVlKSB7XG4gIHJldHVybiBlbnZpcm9ubWVudEVudHJpZXModmFsdWUpICE9IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIERldGFjaGVzIGFuIGV4cGxpY2l0IGVudmlyb25tZW50IGJlZm9yZSBjYW5vbmljYWwgb3ZlcnJpZGUgbG9va3VwIGNhbiB5aWVsZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgZW52aXJvbm1lbnQgcmVjb3JkLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIGlkZW50aXR5LlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBPd25lZCBlbnZpcm9ubWVudCBkYXRhLlxuICovXG5mdW5jdGlvbiBzbmFwc2hvdEVudmlyb25tZW50KHZhbHVlLCBpZCkge1xuICBjb25zdCBlbnRyaWVzID0gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKVxuXG4gIGlmIChlbnRyaWVzID09IHVuZGVmaW5lZCkge1xuICAgIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIGVudmlyb25tZW50IG11c3QgYmUgYSBwbGFpbiBvd24tcHJvcGVydHkgZGF0YSByZWNvcmQgb2Ygc3RyaW5nIG9yIHVuZGVmaW5lZCB2YWx1ZXMuXCIsIGlkKVxuICB9XG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPn0gKi9cbiAgY29uc3Qgc25hcHNob3QgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgZW50cmllcykgc25hcHNob3Rba2V5XSA9IGVudHJ5XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoc25hcHNob3QpXG59XG5cbi8qKlxuICogUmVhZHMgb25seSBlbnVtZXJhYmxlIG93biBkYXRhIHByb3BlcnRpZXMgZnJvbSBhbiBvcmRpbmFyeSBvciBudWxsLXByb3RvdHlwZSByZWNvcmQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50IHJlY29yZC5cbiAqIEByZXR1cm5zIHtbc3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWRdW10gfCB1bmRlZmluZWR9IERldGFjaGVkIGVudHJpZXMgd2hlbiB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PSBudWxsIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIC8qKiBAdHlwZSB7W3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXVtdfSAqL1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKHZhbHVlKSkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgIT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSlcblxuICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gdW5kZWZpbmVkIHx8ICFkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgIShcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgfHxcbiAgICAgICAgKGRlc2NyaXB0b3IudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSAhPSBcInN0cmluZ1wiKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgZW50cmllcy5wdXNoKFtrZXksIGRlc2NyaXB0b3IudmFsdWVdKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBmb3IgYW4gb3JkaW5hcnkgc3RyaW5nLWtleWVkIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IE9iamVjdC5wcm90b3R5cGVcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBub3JtYWxpemVkIGRpc2NvdmVyeS1jb25maWd1cmF0aW9uIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEZhaWx1cmUgZGV0YWlsLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIGlkZW50aXR5LlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBpbnZhbGlkVG9vbGNoYWluKG1lc3NhZ2UsIGlkKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiSU5WQUxJRF9UT09MQ0hBSU5cIiwgbGFuZ3VhZ2U6IGlkLCBtZXNzYWdlfSlcbn1cblxuLyoqXG4gKiBEZWVwbHkgZnJlZXplcyBjYW5vbmljYWwgZGVjbGFyYXRpb25zIGFuZCBkaXNjb3ZlcnkgcmVzdWx0cy5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlIC0gVG9vbGNoYWluLW93bmVkIHZhbHVlLlxuICogQHJldHVybnMge1R9IEZyb3plbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGVlcEZyZWV6ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGZvciAoY29uc3QgbmVzdGVkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBkZWVwRnJlZXplKG5lc3RlZClcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh2YWx1ZSlcbn1cbiJdfQ==
|
|
429
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWlucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sY2hhaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQ3hELDJGQUEyRixDQUFDO0lBQzlGLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsZ0VBQWdFLENBQUM7SUFDNUgsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDekUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtC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QUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Y29uc3RhbnRzIGFzIGZzQ29uc3RhbnRzfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQge2FjY2VzcywgcmVhbHBhdGgsIHN0YXR9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtpc0RlbnNlQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7ZXhjZWVkZWRPd25lZERlYWRsaW5lLCBleGVjdXRlRmlsZVdpdGhEZWFkbGluZX0gZnJvbSBcIi4vc3VicHJvY2Vzcy5qc1wiXG5pbXBvcnQge2lzU3VwcG9ydGVkVGltZW91dE1zLCBtYXhpbXVtVGltZW91dE1zfSBmcm9tIFwiLi90aW1lb3V0LmpzXCJcblxuY29uc3QgZGVmYXVsdFRpbWVvdXRNcyA9IDEwXzAwMFxuXG5leHBvcnQgY29uc3QgY2Fub25pY2FsVG9vbGNoYWlucyA9IGRlZXBGcmVlemUoe1xuICBkYXJ0OiBkZWZpbml0aW9uKFwiZGFydFwiLCBcIlNFTUFOVElGT0xEX0RBUlRcIiwgW1wiLS12ZXJzaW9uXCJdLFxuICAgIC9eRGFydCBTREsgdmVyc2lvbjogM1xcLjEzXFwuMyBcXChzdGFibGVcXCkgXFwoVHVlIFNlcCAxIDAxOjA3OjE3IDIwMjYgLTA3MDBcXCkgb24gXCJsaW51eF94NjRcIiQvdSksXG4gIHBocDogZGVmaW5pdGlvbihcInBocFwiLCBcIlNFTUFOVElGT0xEX1BIUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eUEhQIDhcXC4vdSksXG4gIHBocDgyOiBkZWZpbml0aW9uKFwicGhwXCIsIFwiU0VNQU5USUZPTERfUEhQXCIsIFtcIi0tdmVyc2lvblwiXSwgL15QSFAgKD86OFxcLig/OlsyLTldfFsxLTldWzAtOV0rKXwoPzo5fFsxLTldWzAtOV0rKVxcLlswLTldKylcXC4vdSksXG4gIHJ1Ynk6IGRlZmluaXRpb24oXCJydWJ5XCIsIFwiU0VNQU5USUZPTERfUlVCWVwiLCBbXCItLXZlcnNpb25cIl0sIC9ecnVieSAzXFwuL3UpLFxuICBub2RlOiBkZWZpbml0aW9uKFwibm9kZVwiLCBcIlNFTUFOVElGT0xEX05PREVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXnYyNFxcLi91KSxcbiAgdHNjOiBkZWZpbml0aW9uKFwidHNjXCIsIFwiU0VNQU5USUZPTERfVFNDXCIsIFtcIi0tdmVyc2lvblwiXSwgL15WZXJzaW9uIDdcXC4vdSksXG4gIGphdmFjOiBkZWZpbml0aW9uKFwiamF2YWNcIiwgXCJTRU1BTlRJRk9MRF9KQVZBQ1wiLCBbXCItdmVyc2lvblwiXSwgL15qYXZhYyAoPzoxWzctOV18MlswLTldKVxcLi91KSxcbiAgamF2YTogZGVmaW5pdGlvbihcImphdmFcIiwgXCJTRU1BTlRJRk9MRF9KQVZBXCIsIFtcIi12ZXJzaW9uXCJdLCAvXig/Om9wZW5qZGt8amF2YSkgdmVyc2lvbiBcIig/OjFbNy05XXwyWzAtOV0pXFwuL3UpLFxuICBqYXZhMjU6IGRlZmluaXRpb24oXCJqYXZhXCIsIFwiU0VNQU5USUZPTERfSkFWQVwiLCBbXCItdmVyc2lvblwiXSxcbiAgICAvXm9wZW5qZGsgdmVyc2lvbiBcIjI1XFwuMFxcLjRcIiAyMDI2LTA3LTIxXFxuT3BlbkpESyBSdW50aW1lIEVudmlyb25tZW50IFxcKGJ1aWxkIDI1XFwuMFxcLjRcXCs3LTEtKCg/OjI0fDI2KVxcLjA0KS1VYnVudHVcXClcXG5PcGVuSkRLIDY0LUJpdCBTZXJ2ZXIgVk0gXFwoYnVpbGQgMjVcXC4wXFwuNFxcKzctMS1cXDEtVWJ1bnR1LCBtaXhlZCBtb2RlLCBzaGFyaW5nXFwpJC91KSxcbiAga290bGluYzogZGVmaW5pdGlvbihcImtvdGxpbmNcIiwgXCJTRU1BTlRJRk9MRF9LT1RMSU5DXCIsIFtcIi12ZXJzaW9uXCJdLCAvXmluZm86IGtvdGxpbmMtanZtIDJcXC40XFwuMjAgXFwoSlJFIDI1XFwuMFxcLjRcXCs3LTEtKD86MjR8MjYpXFwuMDQtVWJ1bnR1XFwpJC91KSxcbiAgcHl0aG9uOiBkZWZpbml0aW9uKFwicHl0aG9uM1wiLCBcIlNFTUFOVElGT0xEX1BZVEhPTlwiLCBbXCItLXZlcnNpb25cIl0sIC9eUHl0aG9uIDNcXC4vdSksXG4gIGRvdG5ldDogZGVmaW5pdGlvbihcImRvdG5ldFwiLCBcIlNFTUFOVElGT0xEX0RPVE5FVFwiLCBbXCItLXZlcnNpb25cIl0sIC9eMTBcXC4vdSksXG4gIGdvOiBkZWZpbml0aW9uKFwiZ29cIiwgXCJTRU1BTlRJRk9MRF9HT1wiLCBbXCJ2ZXJzaW9uXCJdLCAvXmdvIHZlcnNpb24gZ28xXFwuMjZcXC5cXGQrIGxpbnV4XFwvYW1kNjQkL3UpLFxuICBjbGFuZ3BwOiBkZWZpbml0aW9uKFwiY2xhbmcrK1wiLCBcIlNFTUFOVElGT0xEX0NMQU5HUFBcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXlVidW50dSBjbGFuZyB2ZXJzaW9uIDIxXFwuMVxcLjggW15cXG5dK1xcblRhcmdldDogeDg2XzY0LXBjLWxpbnV4LWdudVxcbi91KSxcbiAgY2xhbmc6IGRlZmluaXRpb24oXCJjbGFuZ1wiLCBcIlNFTUFOVElGT0xEX0NMQU5HXCIsIFtcIi0tdmVyc2lvblwiXSwgL15VYnVudHUgY2xhbmcgdmVyc2lvbiAyMVxcLjFcXC44IFteXFxuXStcXG5UYXJnZXQ6IHg4Nl82NC1wYy1saW51eC1nbnVcXG4vdSksXG4gIHJ1c3RjOiBkZWZpbml0aW9uKFwicnVzdGNcIiwgXCJTRU1BTlRJRk9MRF9SVVNUQ1wiLCBbXCItLXZlcnNpb25cIiwgXCItLXZlcmJvc2VcIl0sIC9ecnVzdGMgMVxcLjk4XFwuMSBcXCg0OGEyMjljZWEgMjAyNi0wOS0wMVxcKVxcbmJpbmFyeTogcnVzdGNcXG5jb21taXQtaGFzaDogNDhhMjI5Y2VhZWZkNDk4NWM1MDk5MGIxNDExNmI2ZDg1NmFmMDk4NVxcbmNvbW1pdC1kYXRlOiAyMDI2LTA5LTAxXFxuaG9zdDogeDg2XzY0LXVua25vd24tbGludXgtZ251XFxucmVsZWFzZTogMVxcLjk4XFwuMVxcbkxMVk0gdmVyc2lvbjogMjJcXC4xXFwuOCQvdSksXG4gIGNhcmdvOiBkZWZpbml0aW9uKFwiY2FyZ29cIiwgXCJTRU1BTlRJRk9MRF9DQVJHT1wiLCBbXCItLXZlcnNpb25cIiwgXCItLXZlcmJvc2VcIl0sIC9eY2FyZ28gMVxcLjk4XFwuMSBcXCg3OTdlOGE5YmMgMjAyNi0wOC0wNVxcKVxcbnJlbGVhc2U6IDFcXC45OFxcLjFcXG5jb21taXQtaGFzaDogNzk3ZThhOWJjYTI3NmMxYzlmOWY3MzhkMmEyMGY0ODRmYTRlZWE5ZFxcbmNvbW1pdC1kYXRlOiAyMDI2LTA4LTA1XFxuaG9zdDogeDg2XzY0LXVua25vd24tbGludXgtZ251XFxuL3UpLFxuICB6aWc6IGRlZmluaXRpb24oXCJ6aWdcIiwgXCJTRU1BTlRJRk9MRF9aSUdcIiwgW1widmVyc2lvblwiXSwgL14wXFwuMTVcXC4yJC91KSxcbiAgc3dpZnRjOiBkZWZpbml0aW9uKFwic3dpZnRjXCIsIFwiU0VNQU5USUZPTERfU1dJRlRDXCIsIFtcIi0tZHJpdmVyLW1vZGU9c3dpZnRjXCIsIFwiLS12ZXJzaW9uXCJdLCAvXlN3aWZ0IHZlcnNpb24gNlxcLjNcXC4zIFxcKHN3aWZ0LTZcXC4zXFwuMy1SRUxFQVNFXFwpXFxuVGFyZ2V0OiB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUkL3UpLFxuICBcIndhc20tdmFsaWRhdGVcIjogZGVmaW5pdGlvbihcIndhc20tdmFsaWRhdGVcIiwgXCJTRU1BTlRJRk9MRF9XQVNNX1ZBTElEQVRFXCIsIFtcIi0tdmVyc2lvblwiXSwgL14xXFwuMFxcLjM2JC91KSxcbiAgY2hyb21pdW06IGRlZmluaXRpb24oXCJjaHJvbWl1bVwiLCBcIlNFTUFOVElGT0xEX0NIUk9NSVVNXCIsIFtcIi0tdmVyc2lvblwiXSwgL15Hb29nbGUgQ2hyb21lIDE1MlxcLjBcXC43OTc3XFwuODIkL3UpXG59KVxuXG4vKipcbiAqIERpc2NvdmVycyBvbmUgcmVwb3NpdG9yeS1kZWNsYXJlZCBjYW5vbmljYWwgdG9vbGNoYWluLlxuICogQHBhcmFtIHtrZXlvZiB0eXBlb2YgY2Fub25pY2FsVG9vbGNoYWluc30gaWQgLSBDYW5vbmljYWwgdG9vbGNoYWluIElELlxuICogQHBhcmFtIHt7ZW52aXJvbm1lbnQ/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Piwgb3ZlcnJpZGU/OiBzdHJpbmcsIHRpbWVvdXRNcz86IG51bWJlcn19IFtvcHRpb25zXSAtIERpc2NvdmVyeSBvcHRpb25zLlxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWluPn0gRXhhY3QgZXhlY3V0YWJsZSBhbmQgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyQ2Fub25pY2FsVG9vbGNoYWluKGlkLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiBpZCAhPSBcInN0cmluZ1wiIHx8IGlkLmxlbmd0aCA9PSAwKSB7XG4gICAgaW52YWxpZFRvb2xjaGFpbihcIkNhbm9uaWNhbCB0b29sY2hhaW4gSUQgbXVzdCBiZSBhIG5vbi1lbXB0eSBwcmltaXRpdmUgc3RyaW5nLlwiLCBcInRvb2xjaGFpblwiKVxuICB9XG4gIGlmICghaXNQbGFpbk9iamVjdChvcHRpb25zKSkgaW52YWxpZFRvb2xjaGFpbihcIkNhbm9uaWNhbCB0b29sY2hhaW4gb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdC5cIiwgaWQpXG4gIGNvbnN0IGRlZmluaXRpb24gPSBPYmplY3QuaGFzT3duKGNhbm9uaWNhbFRvb2xjaGFpbnMsIGlkKVxuICAgID8gY2Fub25pY2FsVG9vbGNoYWluc1svKiogQHR5cGUge2tleW9mIHR5cGVvZiBjYW5vbmljYWxUb29sY2hhaW5zfSAqLyAoaWQpXVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKCFkZWZpbml0aW9uKSBpbnZhbGlkVG9vbGNoYWluKGBVbmtub3duIGNhbm9uaWNhbCB0b29sY2hhaW4gJyR7aWR9Jy5gLCBpZClcbiAgY29uc3QgY29uZmlndXJhdGlvbkVudmlyb25tZW50ID0gb3B0aW9ucy5lbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHNuYXBzaG90RW52aXJvbm1lbnQob3B0aW9ucy5lbnZpcm9ubWVudCwgaWQpXG4gIGNvbnN0IGVudmlyb25tZW50ID0gY29uZmlndXJhdGlvbkVudmlyb25tZW50ID8/IGRlZmF1bHRFbnZpcm9ubWVudCgpXG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBvcHRpb25zLm92ZXJyaWRlID09PSB1bmRlZmluZWRcbiAgICA/IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHByb2Nlc3MuZW52W2RlZmluaXRpb24ub3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlXVxuICAgICAgOiBjb25maWd1cmF0aW9uRW52aXJvbm1lbnRbZGVmaW5pdGlvbi5vdmVycmlkZUVudmlyb25tZW50VmFyaWFibGVdXG4gICAgOiBvcHRpb25zLm92ZXJyaWRlXG5cbiAgcmV0dXJuIGRpc2NvdmVyVG9vbGNoYWluKHtcbiAgICBjYW5vbmljYWxDb21tYW5kOiBkZWZpbml0aW9uLmNhbm9uaWNhbENvbW1hbmQsXG4gICAgZW52aXJvbm1lbnQsXG4gICAgaWQsXG4gICAgb3ZlcnJpZGU6IGNvbmZpZ3VyZWQsXG4gICAgc3VwcG9ydGVkVmVyc2lvbjogZGVmaW5pdGlvbi5zdXBwb3J0ZWRWZXJzaW9uLFxuICAgIHRpbWVvdXRNczogb3B0aW9ucy50aW1lb3V0TXMsXG4gICAgdmVyc2lvbkFyZ3VtZW50czogZGVmaW5pdGlvbi52ZXJzaW9uQXJndW1lbnRzXG4gIH0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYW5kIHZlcnNpb25zIG9uZSBjb25maWd1cmVkIG9yIGNhbm9uaWNhbCBleGVjdXRhYmxlIHdpdGhvdXQgaW52b2tpbmcgYSBzaGVsbC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIERpc2NvdmVyeSByZXF1ZXN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmNhbm9uaWNhbENvbW1hbmQgLSBDYW5vbmljYWwgUEFUSCBjb21tYW5kLlxuICogQHBhcmFtIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gW2lucHV0LmVudmlyb25tZW50XSAtIEV4cGxpY2l0IGRpc2NvdmVyeSBlbnZpcm9ubWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5pZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbaW5wdXQub3ZlcnJpZGVdIC0gQ29uZmlndXJlZCBhYnNvbHV0ZSBleGVjdXRhYmxlIHBhdGguXG4gKiBAcGFyYW0ge1JlZ0V4cH0gW2lucHV0LnN1cHBvcnRlZFZlcnNpb25dIC0gRnVsbCBzZWxlY3RlZC1zdHJlYW0gdmVyc2lvbiBwb2xpY3kuXG4gKiBAcGFyYW0ge251bWJlcn0gW2lucHV0LnRpbWVvdXRNc10gLSBWZXJzaW9uIGNvbW1hbmQgdGltZW91dC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGlucHV0LnZlcnNpb25Bcmd1bWVudHMgLSBFeGFjdCB2ZXJzaW9uIGFyZ3VtZW50IGFycmF5LlxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWluPn0gRGlzY292ZXJlZCB0b29sLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJUb29sY2hhaW4oaW5wdXQpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGlucHV0KSkgaW52YWxpZFRvb2xjaGFpbihcIlRvb2xjaGFpbiBkaXNjb3ZlcnkgcmVxdWlyZXMgYSByZXF1ZXN0IG9iamVjdC5cIiwgXCJ0b29sY2hhaW5cIilcbiAgY29uc3QgdmVyc2lvbkFyZ3VtZW50Q2FuZGlkYXRlID0gaW5wdXQudmVyc2lvbkFyZ3VtZW50c1xuICBjb25zdCB2ZXJzaW9uQXJndW1lbnRzID0gaXNEZW5zZUFycmF5KHZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZSkgPyBbLi4udmVyc2lvbkFyZ3VtZW50Q2FuZGlkYXRlXSA6IHVuZGVmaW5lZFxuICBjb25zdCBjYW5kaWRhdGUgPSB7XG4gICAgY2Fub25pY2FsQ29tbWFuZDogaW5wdXQuY2Fub25pY2FsQ29tbWFuZCxcbiAgICBlbnZpcm9ubWVudDogaW5wdXQuZW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRFbnZpcm9ubWVudCgpIDogaW5wdXQuZW52aXJvbm1lbnQsXG4gICAgaWQ6IGlucHV0LmlkLFxuICAgIG92ZXJyaWRlOiBpbnB1dC5vdmVycmlkZSxcbiAgICBzdXBwb3J0ZWRWZXJzaW9uOiBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLFxuICAgIHRpbWVvdXRNczogaW5wdXQudGltZW91dE1zID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VGltZW91dE1zIDogaW5wdXQudGltZW91dE1zLFxuICAgIHZlcnNpb25Bcmd1bWVudHNcbiAgfVxuXG4gIHZhbGlkYXRlRGlzY292ZXJ5KGNhbmRpZGF0ZSlcbiAgY29uc3QgY2Fub25pY2FsQ29tbWFuZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoY2FuZGlkYXRlLmNhbm9uaWNhbENvbW1hbmQpXG4gIGNvbnN0IGVudmlyb25tZW50ID0gLyoqIEB0eXBlIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gKi8gKGNhbmRpZGF0ZS5lbnZpcm9ubWVudClcbiAgY29uc3QgaWQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNhbmRpZGF0ZS5pZClcbiAgY29uc3Qgb3ZlcnJpZGUgPSAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi8gKGNhbmRpZGF0ZS5vdmVycmlkZSlcbiAgY29uc3Qgc3VwcG9ydGVkVmVyc2lvbiA9IGNhbmRpZGF0ZS5zdXBwb3J0ZWRWZXJzaW9uIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgPyBuZXcgUmVnRXhwKGNhbmRpZGF0ZS5zdXBwb3J0ZWRWZXJzaW9uLnNvdXJjZSwgY2FuZGlkYXRlLnN1cHBvcnRlZFZlcnNpb24uZmxhZ3MpXG4gICAgOiB1bmRlZmluZWRcbiAgY29uc3QgdGltZW91dE1zID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChjYW5kaWRhdGUudGltZW91dE1zKVxuICBjb25zdCB2YWxpZGF0ZWRWZXJzaW9uQXJndW1lbnRzID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKGNhbmRpZGF0ZS52ZXJzaW9uQXJndW1lbnRzKVxuICBjb25zdCBub3JtYWxpemVkRW52aXJvbm1lbnQgPSBkZXRlcm1pbmlzdGljRW52aXJvbm1lbnQoZW52aXJvbm1lbnQpXG4gIGNvbnN0IHtleGVjdXRhYmxlLCBzb3VyY2V9ID0gb3ZlcnJpZGUgPT09IHVuZGVmaW5lZFxuICAgID8gYXdhaXQgcmVzb2x2ZUNhbm9uaWNhbChpZCwgY2Fub25pY2FsQ29tbWFuZCwgbm9ybWFsaXplZEVudmlyb25tZW50LlBBVEggPz8gXCJcIilcbiAgICA6IHtleGVjdXRhYmxlOiBhd2FpdCByZXNvbHZlT3ZlcnJpZGUoaWQsIG92ZXJyaWRlLCBjYW5vbmljYWxDb21tYW5kKSwgc291cmNlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJvdmVycmlkZVwiKX1cbiAgLyoqIEB0eXBlIHt7c3Rkb3V0OiBzdHJpbmcsIHN0ZGVycjogc3RyaW5nfX0gKi9cbiAgbGV0IHJlc3VsdFxuXG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmUoe1xuICAgICAgYXJndW1lbnRzOiB2YWxpZGF0ZWRWZXJzaW9uQXJndW1lbnRzLFxuICAgICAgZW52aXJvbm1lbnQ6IG5vcm1hbGl6ZWRFbnZpcm9ubWVudCxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LFxuICAgICAgdGltZW91dE1zXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBwcm9jZXNzRXJyb3IgPSBwcm9jZXNzRXJyb3JGaWVsZHMoZXJyb3IpXG4gICAgY29uc3QgdGltZWRPdXQgPSBleGNlZWRlZE93bmVkRGVhZGxpbmUoZXJyb3IpXG5cbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIC4uLnByb2Nlc3NFcnJvcixcbiAgICAgIGNhdXNlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICBjb2RlOiB0aW1lZE91dCA/IFwiVE9PTF9WRVJTSU9OX1RJTUVPVVRcIiA6IFwiVE9PTF9WRVJTSU9OX0ZBSUxVUkVcIixcbiAgICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogdGltZWRPdXRcbiAgICAgICAgPyBgVmVyc2lvbiBjb21tYW5kIGZvciAnJHtleGVjdXRhYmxlfScgZXhjZWVkZWQgJHt0aW1lb3V0TXN9bXMuYFxuICAgICAgICA6IGBWZXJzaW9uIGNvbW1hbmQgZm9yICcke2V4ZWN1dGFibGV9JyBmYWlsZWQuYCxcbiAgICAgIHN0ZGVycjogcHJvY2Vzc0Vycm9yLnN0ZGVycixcbiAgICAgIHN0ZG91dDogcHJvY2Vzc0Vycm9yLnN0ZG91dFxuICAgIH0pXG4gIH1cblxuICBjb25zdCB7c3RkZXJyLCBzdGRvdXR9ID0gcmVzdWx0XG4gIGNvbnN0IG5vcm1hbGl6ZWRTdGRvdXQgPSBzdGRvdXQudHJpbSgpXG4gIGNvbnN0IG5vcm1hbGl6ZWRTdGRlcnIgPSBzdGRlcnIudHJpbSgpXG4gIGNvbnN0IHZlcnNpb25PdXRwdXQgPSBub3JtYWxpemVkU3Rkb3V0Lmxlbmd0aCA+IDAgPyBub3JtYWxpemVkU3Rkb3V0IDogbm9ybWFsaXplZFN0ZGVyclxuICBjb25zdCB2ZXJzaW9uID0gdmVyc2lvbk91dHB1dC5zcGxpdCgvXFxyP1xcbi91KVswXSA/PyBcIlwiXG5cbiAgaWYgKHZlcnNpb24ubGVuZ3RoID09IDApIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9WRVJTSU9OX0ZBSUxVUkVcIixcbiAgICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIHJldHVybmVkIG5vIHZlcnNpb24gb3V0cHV0LmAsXG4gICAgICBzdGRlcnIsXG4gICAgICBzdGRvdXRcbiAgICB9KVxuICB9XG4gIGlmIChzdXBwb3J0ZWRWZXJzaW9uICYmICFzdXBwb3J0ZWRWZXJzaW9uLnRlc3QodmVyc2lvbk91dHB1dCkpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9VTlNVUFBPUlRFRF9WRVJTSU9OXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBFeGVjdXRhYmxlICcke2V4ZWN1dGFibGV9JyByZXBvcnRlZCB1bnN1cHBvcnRlZCB2ZXJzaW9uICcke3ZlcnNpb259Jy5gLFxuICAgICAgc3RkZXJyLFxuICAgICAgc3Rkb3V0LFxuICAgICAgdmVyc2lvblxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gZGVlcEZyZWV6ZSh7XG4gICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICBleGVjdXRhYmxlLFxuICAgIGlkLFxuICAgIHNvdXJjZSxcbiAgICB2ZXJzaW9uLFxuICAgIHZlcnNpb25Bcmd1bWVudHM6IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMsXG4gICAgdmVyc2lvbk91dHB1dFxuICB9KVxufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgY2Fub25pY2FsIGltbXV0YWJsZSB0b29sY2hhaW4gZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gY2Fub25pY2FsQ29tbWFuZCAtIFBBVEggY29tbWFuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUgLSBDb25maWd1cmVkIG92ZXJyaWRlIHZhcmlhYmxlLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gdmVyc2lvbkFyZ3VtZW50cyAtIEV4YWN0IHZlcnNpb24gYXJndW1lbnRzLlxuICogQHBhcmFtIHtSZWdFeHB9IHN1cHBvcnRlZFZlcnNpb24gLSBTdXBwb3J0ZWQgdmVyc2lvbiBvdXRwdXQuXG4gKiBAcmV0dXJucyB7e2Nhbm9uaWNhbENvbW1hbmQ6IHN0cmluZywgb3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlOiBzdHJpbmcsIHN1cHBvcnRlZFZlcnNpb246IFJlZ0V4cCwgdmVyc2lvbkFyZ3VtZW50czogc3RyaW5nW119fSBEZWNsYXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmaW5pdGlvbihjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHZlcnNpb25Bcmd1bWVudHMsIHN1cHBvcnRlZFZlcnNpb24pIHtcbiAgcmV0dXJuIHtjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHN1cHBvcnRlZFZlcnNpb24sIHZlcnNpb25Bcmd1bWVudHN9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRvb2wgZGlzY292ZXJ5IGJlZm9yZSBmaWxlc3lzdGVtIG9yIHByb2Nlc3MgYWNjZXNzLlxuICogQHBhcmFtIHt7XG4gKiAgIGNhbm9uaWNhbENvbW1hbmQ6IHVua25vd24sXG4gKiAgIGVudmlyb25tZW50OiB1bmtub3duLFxuICogICBpZDogdW5rbm93bixcbiAqICAgb3ZlcnJpZGU6IHVua25vd24sXG4gKiAgIHN1cHBvcnRlZFZlcnNpb246IHVua25vd24sXG4gKiAgIHRpbWVvdXRNczogdW5rbm93bixcbiAqICAgdmVyc2lvbkFyZ3VtZW50czogdW5rbm93blxuICogfX0gaW5wdXQgLSBDYW5kaWRhdGUgZGlzY292ZXJ5IGZpZWxkcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURpc2NvdmVyeShpbnB1dCkge1xuICBpZiAodHlwZW9mIGlucHV0LmlkICE9IFwic3RyaW5nXCIgfHwgaW5wdXQuaWQubGVuZ3RoID09IDAgfHxcbiAgICB0eXBlb2YgaW5wdXQuY2Fub25pY2FsQ29tbWFuZCAhPSBcInN0cmluZ1wiIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQubGVuZ3RoID09IDAgfHxcbiAgICBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiL1wiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFxcXFwiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFwwXCIpIHx8XG4gICAgIWlzRGVuc2VBcnJheShpbnB1dC52ZXJzaW9uQXJndW1lbnRzKSB8fCAhaW5wdXQudmVyc2lvbkFyZ3VtZW50cy5ldmVyeSh2YWxpZEFyZ3VtZW50KSB8fFxuICAgICFpc0Vudmlyb25tZW50KGlucHV0LmVudmlyb25tZW50KSB8fCAhaXNTdXBwb3J0ZWRUaW1lb3V0TXMoaW5wdXQudGltZW91dE1zKSB8fFxuICAgIChpbnB1dC5vdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgaW5wdXQub3ZlcnJpZGUgIT0gXCJzdHJpbmdcIiB8fCAhcGF0aC5pc0Fic29sdXRlKGlucHV0Lm92ZXJyaWRlKSB8fCBpbnB1dC5vdmVycmlkZS5pbmNsdWRlcyhcIlxcMFwiKSkpIHx8XG4gICAgKGlucHV0LnN1cHBvcnRlZFZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAoIShpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uIGluc3RhbmNlb2YgUmVnRXhwKSB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLmdsb2JhbCB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLnN0aWNreSkpKSB7XG4gICAgaW52YWxpZFRvb2xjaGFpbihgVG9vbGNoYWluIGRpc2NvdmVyeSByZXF1aXJlcyBhIGNhbm9uaWNhbCBiYXNlbmFtZSwgYWJzb2x1dGUgb3ZlcnJpZGUsIGFyZ3VtZW50IGFycmF5LCBlbnZpcm9ubWVudCwgYW5kIHRpbWVvdXQgZnJvbSAxIHRocm91Z2ggJHttYXhpbXVtVGltZW91dE1zfW1zLmAsXG4gICAgICB0eXBlb2YgaW5wdXQuaWQgPT0gXCJzdHJpbmdcIiA/IGlucHV0LmlkIDogXCJ0b29sY2hhaW5cIilcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSB1bmFtYmlndW91cyBjYW5vbmljYWwgY29tbWFuZCBmcm9tIGFuIGV4cGxpY2l0IFBBVEguXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIENhbm9uaWNhbCBjb21tYW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhWYWx1ZSAtIEV4cGxpY2l0IFBBVEguXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7ZXhlY3V0YWJsZTogc3RyaW5nLCBzb3VyY2U6IFwiY2Fub25pY2FsXCJ9Pn0gRXhhY3QgZXhlY3V0YWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNhbm9uaWNhbChpZCwgY29tbWFuZCwgcGF0aFZhbHVlKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBwYXRoVmFsdWUuc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgaWYgKGRpcmVjdG9yeS5sZW5ndGggPT0gMCB8fCAhcGF0aC5pc0Fic29sdXRlKGRpcmVjdG9yeSkpIGNvbnRpbnVlXG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgY29tbWFuZClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGFjdCA9IGF3YWl0IHJlc29sdmVFeGVjdXRhYmxlRmlsZShjYW5kaWRhdGUpXG5cbiAgICAgIGlmIChleGFjdCAhPSB1bmRlZmluZWQpIG1hdGNoZXMuc2V0KGV4YWN0LCBleGFjdClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgUEFUSCBjYW5kaWRhdGUgaXMgYWJzZW50IG9yIG5vbi1leGVjdXRhYmxlOyBkaXNjb3ZlcnkgY29udGludWVzIGRldGVybWluaXN0aWNhbGx5LlxuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLnNpemUgPT0gMCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX05PVF9GT1VORFwiLFxuICAgICAgY29tbWFuZCxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBDYW5vbmljYWwgY29tbWFuZCAnJHtjb21tYW5kfScgd2FzIG5vdCBmb3VuZCBhcyBhbiBleGVjdXRhYmxlIG9uIFBBVEguYFxuICAgIH0pXG4gIH1cbiAgaWYgKG1hdGNoZXMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9BTUJJR1VPVVNcIixcbiAgICAgIGNvbW1hbmQsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiBgQ2Fub25pY2FsIGNvbW1hbmQgJyR7Y29tbWFuZH0nIHJlc29sdmVzIHRvIG11bHRpcGxlIGV4ZWN1dGFibGVzOiAke1suLi5tYXRjaGVzLmtleXMoKV0uam9pbihcIiwgXCIpfS5gXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB7ZXhlY3V0YWJsZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChbLi4ubWF0Y2hlcy5rZXlzKCldWzBdKSwgc291cmNlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJjYW5vbmljYWxcIil9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNvbmZpZ3VyZWQgYWJzb2x1dGUgZXhlY3V0YWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZSAtIEFic29sdXRlIG92ZXJyaWRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBDYW5vbmljYWwgY29tbWFuZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEV4YWN0IGV4ZWN1dGFibGUgcGF0aC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU92ZXJyaWRlKGlkLCBvdmVycmlkZSwgY29tbWFuZCkge1xuICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgY2F1c2VcblxuICB0cnkge1xuICAgIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKG92ZXJyaWRlKVxuXG4gICAgaWYgKGV4YWN0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGV4YWN0XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2F1c2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWRcbiAgfVxuXG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNhdXNlLFxuICAgIGNvZGU6IFwiVE9PTF9OT1RfRk9VTkRcIixcbiAgICBjb21tYW5kLFxuICAgIGV4ZWN1dGFibGU6IG92ZXJyaWRlLFxuICAgIGxhbmd1YWdlOiBpZCxcbiAgICBtZXNzYWdlOiBgQ29uZmlndXJlZCBleGVjdXRhYmxlICcke292ZXJyaWRlfScgaXMgbWlzc2luZyBvciBub3QgZXhlY3V0YWJsZS5gXG4gIH0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNhbmRpZGF0ZSB0byBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjYW5kaWRhdGUgLSBDYW5kaWRhdGUgcGF0aC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59IEV4YWN0IHJlZ3VsYXIgZXhlY3V0YWJsZSwgaWYgdGhlIGZpbGUgdHlwZSBpcyB2YWxpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKGNhbmRpZGF0ZSkge1xuICBjb25zdCBleGFjdCA9IGF3YWl0IHJlYWxwYXRoKGNhbmRpZGF0ZSlcbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhdChleGFjdClcblxuICBpZiAoIXN0YXR1cy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZFxuICBhd2FpdCBhY2Nlc3MoZXhhY3QsIGZzQ29uc3RhbnRzLlhfT0spXG5cbiAgcmV0dXJuIGV4YWN0XG59XG5cbi8qKlxuICogUHJvZHVjZXMgdGhlIG1pbmltYWwgZGV0ZXJtaW5pc3RpYyBwcm9jZXNzIGVudmlyb25tZW50LlxuICogQHBhcmFtIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gZW52aXJvbm1lbnQgLSBFeHBsaWNpdCBpbnB1dHMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IE5vcm1hbGl6ZWQgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmlzdGljRW52aXJvbm1lbnQoZW52aXJvbm1lbnQgPSBkZWZhdWx0RW52aXJvbm1lbnQoKSkge1xuICBjb25zdCBlbnRyaWVzID0gZW52aXJvbm1lbnRFbnRyaWVzKGVudmlyb25tZW50KVxuXG4gIGlmIChlbnRyaWVzID09IHVuZGVmaW5lZCkgaW52YWxpZFRvb2xjaGFpbihcIlByb2Nlc3MgZW52aXJvbm1lbnQgbXVzdCBiZSBhIHBsYWluIG93bi1wcm9wZXJ0eSBkYXRhIHJlY29yZCBvZiBzdHJpbmcgb3IgdW5kZWZpbmVkIHZhbHVlcy5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgIGlmICghL15bQS1aYS16X11bQS1aYS16MC05X10qJC91LnRlc3Qoa2V5KSB8fCBrZXkuaW5jbHVkZXMoXCJcXDBcIikgfHwgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUuaW5jbHVkZXMoXCJcXDBcIikpKSB7XG4gICAgICBpbnZhbGlkVG9vbGNoYWluKFwiUHJvY2VzcyBlbnZpcm9ubWVudCBjb250YWlucyBhbiBpbnZhbGlkIGtleSBvciB2YWx1ZS5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAgIH1cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZFtrZXldID0gdmFsdWVcbiAgfVxuICBub3JtYWxpemVkLkxBTkcgPSBcIkMuVVRGLThcIlxuICBub3JtYWxpemVkLkxDX0FMTCA9IFwiQy5VVEYtOFwiXG4gIG5vcm1hbGl6ZWQuVFogPSBcIlVUQ1wiXG4gIG5vcm1hbGl6ZWQuUEFUSCA/Pz0gXCIvdXNyL2xvY2FsL2JpbjovdXNyL2JpbjovYmluXCJcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShub3JtYWxpemVkKVxufVxuXG4vKipcbiAqIFJldGFpbnMgb25seSBleGVjdXRhYmxlIGxvb2t1cCBmcm9tIHRoZSBhbWJpZW50IGVudmlyb25tZW50LlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBNaW5pbWFsIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRFbnZpcm9ubWVudCgpIHtcbiAgcmV0dXJuIHtQQVRIOiBwcm9jZXNzLmVudi5QQVRIfVxufVxuXG4vKipcbiAqIE5hcnJvd3Mgc3RhYmxlIGZpZWxkcyBmcm9tIGEgdmVyc2lvbiBzdWJwcm9jZXNzIHJlamVjdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBQcm9jZXNzIHJlamVjdGlvbi5cbiAqIEByZXR1cm5zIHt7ZXhpdENvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ319IFN0YWJsZSBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NFcnJvckZpZWxkcyhlcnJvcikge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPSBcIm9iamVjdFwiKSByZXR1cm4ge2V4aXRDb2RlOiB1bmRlZmluZWQsIHNpZ25hbDogdW5kZWZpbmVkLCBzdGRlcnI6IFwiXCIsIHN0ZG91dDogXCJcIn1cbiAgY29uc3QgdmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoZXJyb3IpXG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZTogdHlwZW9mIHZhbHVlLmNvZGUgPT0gXCJudW1iZXJcIiA/IHZhbHVlLmNvZGUgOiB1bmRlZmluZWQsXG4gICAgc2lnbmFsOiB0eXBlb2YgdmFsdWUuc2lnbmFsID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zaWduYWwgOiB1bmRlZmluZWQsXG4gICAgc3RkZXJyOiB0eXBlb2YgdmFsdWUuc3RkZXJyID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRlcnIgOiBcIlwiLFxuICAgIHN0ZG91dDogdHlwZW9mIHZhbHVlLnN0ZG91dCA9PSBcInN0cmluZ1wiID8gdmFsdWUuc3Rkb3V0IDogXCJcIlxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSBzaGVsbC1mcmVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBzdHJpbmd9IFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIHNhZmUgdG8gcGFzcyBkaXJlY3RseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRBcmd1bWVudCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgJiYgIXZhbHVlLmluY2x1ZGVzKFwiXFwwXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIGV4cGxpY2l0IHByb2Nlc3MtZW52aXJvbm1lbnQgdmFsdWVzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gV2hldGhlciBlbnRyaWVzIGFyZSBzdHJpbmdzIG9yIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gaXNFbnZpcm9ubWVudCh2YWx1ZSkge1xuICByZXR1cm4gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKSAhPSB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBEZXRhY2hlcyBhbiBleHBsaWNpdCBlbnZpcm9ubWVudCBiZWZvcmUgY2Fub25pY2FsIG92ZXJyaWRlIGxvb2t1cCBjYW4geWllbGQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50IHJlY29yZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gT3duZWQgZW52aXJvbm1lbnQgZGF0YS5cbiAqL1xuZnVuY3Rpb24gc25hcHNob3RFbnZpcm9ubWVudCh2YWx1ZSwgaWQpIHtcbiAgY29uc3QgZW50cmllcyA9IGVudmlyb25tZW50RW50cmllcyh2YWx1ZSlcblxuICBpZiAoZW50cmllcyA9PSB1bmRlZmluZWQpIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBlbnZpcm9ubWVudCBtdXN0IGJlIGEgcGxhaW4gb3duLXByb3BlcnR5IGRhdGEgcmVjb3JkIG9mIHN0cmluZyBvciB1bmRlZmluZWQgdmFsdWVzLlwiLCBpZClcbiAgfVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD59ICovXG4gIGNvbnN0IHNuYXBzaG90ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIGVudHJpZXMpIHNuYXBzaG90W2tleV0gPSBlbnRyeVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHNuYXBzaG90KVxufVxuXG4vKipcbiAqIFJlYWRzIG9ubHkgZW51bWVyYWJsZSBvd24gZGF0YSBwcm9wZXJ0aWVzIGZyb20gYW4gb3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgcmVjb3JkLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudCByZWNvcmQuXG4gKiBAcmV0dXJucyB7W3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXVtdIHwgdW5kZWZpbmVkfSBEZXRhY2hlZCBlbnRyaWVzIHdoZW4gdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGVudmlyb25tZW50RW50cmllcyh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmFsdWUgPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gICAgaWYgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF1bXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyh2YWx1ZSkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ICE9IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpXG5cbiAgICAgIGlmIChkZXNjcmlwdG9yID09IHVuZGVmaW5lZCB8fCAhZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8ICEoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIHx8XG4gICAgICAgIChkZXNjcmlwdG9yLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgIT0gXCJzdHJpbmdcIikpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGVudHJpZXMucHVzaChba2V5LCBkZXNjcmlwdG9yLnZhbHVlXSlcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZm9yIGFuIG9yZGluYXJ5IHN0cmluZy1rZXllZCBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBPYmplY3QucHJvdG90eXBlXG59XG5cbi8qKlxuICogVGhyb3dzIGEgbm9ybWFsaXplZCBkaXNjb3ZlcnktY29uZmlndXJhdGlvbiBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBGYWlsdXJlIGRldGFpbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFRvb2xjaGFpbihtZXNzYWdlLCBpZCkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIklOVkFMSURfVE9PTENIQUlOXCIsIGxhbmd1YWdlOiBpZCwgbWVzc2FnZX0pXG59XG5cbi8qKlxuICogRGVlcGx5IGZyZWV6ZXMgY2Fub25pY2FsIGRlY2xhcmF0aW9ucyBhbmQgZGlzY292ZXJ5IHJlc3VsdHMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZSAtIFRvb2xjaGFpbi1vd25lZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtUfSBGcm96ZW4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZXBGcmVlemUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgZGVlcEZyZWV6ZShuZXN0ZWQpXG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUodmFsdWUpXG59XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collects semantic binding reads and explicit assignment targets for Zig's compile-error-level binding checks.
|
|
3
|
+
* @param {import("./semantic/types.js").Block} block - Complete function or entry block.
|
|
4
|
+
* @returns {{reads: Set<string>, writes: Set<string>}} Binding usage by exact source name.
|
|
5
|
+
*/
|
|
6
|
+
export declare function collectZigBindingUsage(block: import("./semantic/types.js").Block): {
|
|
7
|
+
reads: Set<string>;
|
|
8
|
+
writes: Set<string>;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=zig-bindings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zig-bindings.d.ts","sourceRoot":"","sources":["../../src/zig-bindings.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAHjC,OAAO,qBAAqB,EAAE,KAGG,GAF/B;IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAC,CAwCrD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* Collects semantic binding reads and explicit assignment targets for Zig's compile-error-level binding checks.
|
|
4
|
+
* @param {import("./semantic/types.js").Block} block - Complete function or entry block.
|
|
5
|
+
* @returns {{reads: Set<string>, writes: Set<string>}} Binding usage by exact source name.
|
|
6
|
+
*/
|
|
7
|
+
export function collectZigBindingUsage(block) {
|
|
8
|
+
const reads = new Set();
|
|
9
|
+
const writes = new Set();
|
|
10
|
+
/**
|
|
11
|
+
* Records every binding read in one expression.
|
|
12
|
+
* @param {import("./semantic/types.js").Expression} expression - Expression to traverse.
|
|
13
|
+
*/
|
|
14
|
+
const expression = (expression) => {
|
|
15
|
+
if (expression.kind == "IdentifierExpression")
|
|
16
|
+
reads.add(expression.name);
|
|
17
|
+
else if (expression.kind == "CallExpression")
|
|
18
|
+
expression.arguments.forEach(argument => expressionVisit(argument));
|
|
19
|
+
else if (expression.kind == "UnaryExpression")
|
|
20
|
+
expressionVisit(expression.operand);
|
|
21
|
+
else if (expression.kind == "BinaryExpression") {
|
|
22
|
+
expressionVisit(expression.left);
|
|
23
|
+
expressionVisit(expression.right);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const expressionVisit = expression;
|
|
27
|
+
/**
|
|
28
|
+
* Records reads and writes throughout one block subtree.
|
|
29
|
+
* @param {import("./semantic/types.js").Block} current - Block to traverse.
|
|
30
|
+
*/
|
|
31
|
+
const visit = (current) => {
|
|
32
|
+
for (const statement of current.statements) {
|
|
33
|
+
if (statement.kind == "LocalDeclaration")
|
|
34
|
+
expressionVisit(statement.initializer);
|
|
35
|
+
else if (statement.kind == "AssignmentStatement") {
|
|
36
|
+
writes.add(statement.target.name);
|
|
37
|
+
expressionVisit(statement.expression);
|
|
38
|
+
}
|
|
39
|
+
else if (statement.kind == "IfStatement") {
|
|
40
|
+
expressionVisit(statement.condition);
|
|
41
|
+
visit(statement.consequent);
|
|
42
|
+
if (statement.alternate)
|
|
43
|
+
visit(statement.alternate);
|
|
44
|
+
}
|
|
45
|
+
else if (statement.kind == "ExpressionStatement" || statement.kind == "PrintStatement")
|
|
46
|
+
expressionVisit(statement.expression);
|
|
47
|
+
else if (statement.kind == "ReturnStatement" && statement.expression)
|
|
48
|
+
expressionVisit(statement.expression);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
visit(block);
|
|
52
|
+
return { reads, writes };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemlnLWJpbmRpbmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ppZy1iaW5kaW5ncy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxLQUFLO0lBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUN4Qjs7O09BR0c7SUFDSCxNQUFNLFVBQVUsR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUFFO1FBQ2hDLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxzQkFBc0I7WUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTthQUNwRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCO1lBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTthQUM1RyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksaUJBQWlCO1lBQUUsZUFBZSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTthQUM3RSxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUMvQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2hDLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkMsQ0FBQztJQUNILENBQUMsQ0FBQTtJQUNELE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQTtJQUNsQzs7O09BR0c7SUFDSCxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ3hCLEtBQUssTUFBTSxTQUFTLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzNDLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxrQkFBa0I7Z0JBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtpQkFDM0UsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLHFCQUFxQixFQUFFLENBQUM7Z0JBQ2pELE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDakMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUN2QyxDQUFDO2lCQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDM0MsZUFBZSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFDcEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFDM0IsSUFBSSxTQUFTLENBQUMsU0FBUztvQkFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3JELENBQUM7aUJBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLHFCQUFxQixJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksZ0JBQWdCO2dCQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUE7aUJBQzFILElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxpQkFBaUIsSUFBSSxTQUFTLENBQUMsVUFBVTtnQkFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzdHLENBQUM7SUFDSCxDQUFDLENBQUE7SUFFRCxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDWixPQUFPLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFBO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBDb2xsZWN0cyBzZW1hbnRpYyBiaW5kaW5nIHJlYWRzIGFuZCBleHBsaWNpdCBhc3NpZ25tZW50IHRhcmdldHMgZm9yIFppZydzIGNvbXBpbGUtZXJyb3ItbGV2ZWwgYmluZGluZyBjaGVja3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gQ29tcGxldGUgZnVuY3Rpb24gb3IgZW50cnkgYmxvY2suXG4gKiBAcmV0dXJucyB7e3JlYWRzOiBTZXQ8c3RyaW5nPiwgd3JpdGVzOiBTZXQ8c3RyaW5nPn19IEJpbmRpbmcgdXNhZ2UgYnkgZXhhY3Qgc291cmNlIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0WmlnQmluZGluZ1VzYWdlKGJsb2NrKSB7XG4gIGNvbnN0IHJlYWRzID0gbmV3IFNldCgpXG4gIGNvbnN0IHdyaXRlcyA9IG5ldyBTZXQoKVxuICAvKipcbiAgICogUmVjb3JkcyBldmVyeSBiaW5kaW5nIHJlYWQgaW4gb25lIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gRXhwcmVzc2lvbiB0byB0cmF2ZXJzZS5cbiAgICovXG4gIGNvbnN0IGV4cHJlc3Npb24gPSAoZXhwcmVzc2lvbikgPT4ge1xuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZWFkcy5hZGQoZXhwcmVzc2lvbi5uYW1lKVxuICAgIGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIGV4cHJlc3Npb24uYXJndW1lbnRzLmZvckVhY2goYXJndW1lbnQgPT4gZXhwcmVzc2lvblZpc2l0KGFyZ3VtZW50KSlcbiAgICBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIikgZXhwcmVzc2lvblZpc2l0KGV4cHJlc3Npb24ub3BlcmFuZClcbiAgICBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIGV4cHJlc3Npb25WaXNpdChleHByZXNzaW9uLmxlZnQpXG4gICAgICBleHByZXNzaW9uVmlzaXQoZXhwcmVzc2lvbi5yaWdodClcbiAgICB9XG4gIH1cbiAgY29uc3QgZXhwcmVzc2lvblZpc2l0ID0gZXhwcmVzc2lvblxuICAvKipcbiAgICogUmVjb3JkcyByZWFkcyBhbmQgd3JpdGVzIHRocm91Z2hvdXQgb25lIGJsb2NrIHN1YnRyZWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gY3VycmVudCAtIEJsb2NrIHRvIHRyYXZlcnNlLlxuICAgKi9cbiAgY29uc3QgdmlzaXQgPSAoY3VycmVudCkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGN1cnJlbnQuc3RhdGVtZW50cykge1xuICAgICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSBleHByZXNzaW9uVmlzaXQoc3RhdGVtZW50LmluaXRpYWxpemVyKVxuICAgICAgZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpIHtcbiAgICAgICAgd3JpdGVzLmFkZChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUpXG4gICAgICAgIGV4cHJlc3Npb25WaXNpdChzdGF0ZW1lbnQuZXhwcmVzc2lvbilcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICAgIGV4cHJlc3Npb25WaXNpdChzdGF0ZW1lbnQuY29uZGl0aW9uKVxuICAgICAgICB2aXNpdChzdGF0ZW1lbnQuY29uc2VxdWVudClcbiAgICAgICAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHZpc2l0KHN0YXRlbWVudC5hbHRlcm5hdGUpXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikgZXhwcmVzc2lvblZpc2l0KHN0YXRlbWVudC5leHByZXNzaW9uKVxuICAgICAgZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIiAmJiBzdGF0ZW1lbnQuZXhwcmVzc2lvbikgZXhwcmVzc2lvblZpc2l0KHN0YXRlbWVudC5leHByZXNzaW9uKVxuICAgIH1cbiAgfVxuXG4gIHZpc2l0KGJsb2NrKVxuICByZXR1cm4ge3JlYWRzLCB3cml0ZXN9XG59XG4iXX0=
|
package/docs/android.md
CHANGED
|
@@ -72,8 +72,8 @@ Every Android SDK payload is a direct immutable official archive verified before
|
|
|
72
72
|
|
|
73
73
|
The Android repository archives above come from Google's official [`repository2-3.xml`](https://dl.google.com/android/repository/repository2-3.xml) and [`sys-img2-3.xml`](https://dl.google.com/android/repository/sys-img/google_apis/sys-img2-3.xml) package metadata; the emulator build and published SHA-256 come from the official [Android Emulator download archive](https://developer.android.com/studio/emulator_archive). `scripts/bootstrap-android.sh` is the only online preparation stage. It verifies immutable archives, installs them directly, registers the archived emulator through a checked-in exact local-package descriptor, verifies their embedded exact revision metadata, creates the named API-35 AVD, and warms the fixed Gradle cache with a disposable project. `scripts/accept-android.sh` generates a fresh project, creates its ephemeral debug key only inside the private acceptance root, and runs lint, JUnit, debug application assembly, and instrumentation assembly with Gradle `--offline` plus pinned UTF-8, English, UTC, heap, no-daemon, no-parallel, no-build-cache settings. Missing tools, package revisions, or cache content fail with `SEMANTIFOLD_ANDROID_INFRASTRUCTURE` rather than skipping.
|
|
74
74
|
|
|
75
|
-
The only declared Gradle library dependencies are exact non-transitive `testImplementation("junit:junit:4.13.2")
|
|
75
|
+
The only declared Gradle library dependencies are exact non-transitive `testImplementation("junit:junit:4.13.2")`, exact non-transitive `testRuntimeOnly("org.hamcrest:hamcrest-core:1.3")`, and `androidTestImplementation(files(semantifoldKotlinStdlib))` from the checksum-pinned Kotlin compiler distribution. Hamcrest Core supplies the `org.hamcrest.SelfDescribing` linkage that JUnit's Gradle runner loads before generated test code; neither unit-test library enters application compilation or runtime. The generated unit test uses only JUnit's `@Test` annotation, compares the platform list directly, and raises a platform `AssertionError`. Kotlin's implicit stdlib dependency is disabled. Compilation reads the pinned distribution's `kotlin-stdlib.jar` directly as a compiler task input, while the explicit `androidTest` file dependency packages that same verified runtime only into the instrumentation APK so generated Kotlin instrumentation is self-contained. Acceptance requires an empty debug runtime dependency graph, excludes only Gradle's exact structural `project :app (*)` self-project entry from the unit-test report, requires exactly JUnit and Hamcrest Core among external unit-test dependencies, rejects every other project dependency form, permits no JUnit, Hamcrest, `kotlin/jvm/internal`, or `kotlin/collections` payload in the application APK, and requires `kotlin.jvm.internal.Intrinsics` in the instrumentation APK. A rejected graph reports only the parser-matched full dependency descriptions, preserving Gradle syntax without exposing the complete build log.
|
|
76
76
|
|
|
77
|
-
Real emulator acceptance runs only in TensorBuzz with `/dev/kvm:/dev/kvm`. It fails before startup unless `/dev/kvm` is usable and `emulator -accel-check` affirms acceleration, exclusively locks fixed `
|
|
77
|
+
Real emulator acceptance runs only in TensorBuzz with `/dev/kvm:/dev/kvm`. It fails before startup unless `/dev/kvm` is usable and `emulator -accel-check` affirms acceleration, exclusively locks the complete fixed port set: emulator console `5580`, its transport `5581`, and the distinct private adb server `5038` outside the emulator port range. It never invokes `adb root` or changes KVM permissions, boots `emulator-5580` with `-accel on -wipe-data -no-snapshot`, installs both APKs, launches the app, and invokes the runner through the explicit `<applicationId>.test` test application ID. Exact UTF-8 output is passed as base64 to platform instrumentation. The test checks the native labelled view, exact text, visibility, class, accessibility importance, absent content description, and activity recreation. CI then stops that emulator, boots a second fresh emulator, reinstalls/relaunches, and repeats. Screenshots/UI XML are always produced; failure records logcat, adb state, emulator command line, and an exact reason, then emits one fail-loud reason header plus labeled final 16 KiB excerpts from available text diagnostics while leaving binary screenshots and full process data unprinted in their capture files.
|
|
78
78
|
|
|
79
79
|
Local environments without KVM do not attempt software emulation. Release signing, physical devices, accounts, Play Console, publication, Compose, fragments/navigation, WebView, platform channels, NDK/JNI, reflection, permissions, services, storage/networking, and background behavior are outside Task 028.
|
package/docs/architecture.md
CHANGED
|
@@ -4,13 +4,13 @@ Semantifold has three explicit layers.
|
|
|
4
4
|
|
|
5
5
|
Task 018's C path follows these layers through the unchanged root-bundled private legacy CST boundary. `src/frontends/c.js` owns all C trees and exhaustive profile validation. `src/backends/native-validation.js` checks native graph/location limits and `c-validation.js` checks C memory limits; `ordered-expressions.js` plans occurrence-specific evaluation without modifying IR; `c.js` emits mapped `program.c`; and `c-runtime.js` supplies the synthetic immutable-slice/arena header. The C frontend reconstructs candidates only from complete CST regions, resolves them with the existing semantic validator, and compares the original whole CST against the re-parsed canonical backend plan before returning a module. This same-language validation keeps target generation free of parser objects. See the [C profile](c.md).
|
|
6
6
|
|
|
7
|
-
1. Frontend adapters in `src/frontends/` invoke mature language parsers and translate only recognized syntax. Babel owns JavaScript and TypeScript parsing, `php-parser` owns PHP, Prism owns Ruby, Lezer owns Java, and qualified Tree-sitter bindings and grammars own Python, C#, Go, C, CPP, Rust, Swift, Kotlin, and
|
|
7
|
+
1. Frontend adapters in `src/frontends/` invoke mature language parsers and translate only recognized syntax. Babel owns JavaScript and TypeScript parsing, `php-parser` owns PHP, Prism owns Ruby, Lezer owns Java, and qualified Tree-sitter bindings and grammars own Python, C#, Go, C, CPP, Rust, Swift, Kotlin, Dart, and Zig. Their AST/CST objects never appear in the public API. Adapters enumerate supported children and reject every other parser node; filtering syntax away is not a normalization strategy. Prism node offsets and comment byte ranges are converted from UTF-8 to JavaScript UTF-16 offsets before semantic location construction and metadata source slicing. Tree-sitter adapters reject lone surrogates, exhaustively traverse named/anonymous/comment/directive/error/missing children, and verify reported boundaries through the shared UTF-8-byte-to-UTF-16 converter. The Go adapter additionally collapses only exact `package main`, optional `fmt`, ordered semantic functions, and a final zero-argument `func main()` into the shared module/entry shape; assignment occurrences, not Go's uniformly mutable `var` syntax, determine semantic local mutability.
|
|
8
8
|
2. `src/semantic/` defines the shared JSDoc-typed discriminated representation and one-based, filename-bearing UTF-16 source locations. `provenance.js` indexes exact source content, deterministic semantic paths/node IDs, resolved symbol IDs, parser-token subranges, and closed source/derived/synthetic origins without exposing parser objects. Task 010's `SemanticProgram` adds dependency-first logical modules, a caller-order multi-source registry, explicit import/export nodes, one selected entry module, and stable module-qualified declaration identities; native filenames, package names, and target paths remain outside semantic resolution. Value types are scalar `integer`/`boolean`/`string` references or recursive acyclic `ListType`, unordered string-keyed `MapType`, insertion-ordered `OrderedMapType`, `OptionalType`, nominal `RecordType`, nominal Task 033 `ReferenceType`, and Task 034 linear `OwnedResourceType`/`OwnedReferenceType`; `void` exists only as a callable return. Task 012 adds invariant unbounded declaration-owned `TypeParameter` values, scoped `TypeVariableReference` leaves, and exact ordered arguments on generic record types. Task 011 adds nominal `ErrorType` only for catch bindings and error constructions, never as an ordinary parameter/local/return value. Task 034 adds compiler-authorized capability/resource/failure/operation declarations, complete resolved `EffectCallExpression` sites, and explicit `OwnedMoveExpression`/`OwnedBorrowExpression` nodes. Every function and reference class/member has a deterministic declaration identity; every list, ordered-map, condition-controlled loop, capability member, and effect site has a deterministic module-local identity. Every direct function, constructor, receiver method, and effect call carries exact resolution facts. Literal and access nodes distinguish scalars, collections, presence/absence, nominal values/references/resources, errors, receivers, and private fields. Unary and binary expressions carry a closed semantic `operation` and explicit result `type`, never a source operator symbol. Every function, constructor, method, entry point, branch, loop, try body, and catch body owns a located `Block` containing ordered `Statement` nodes. Statements additionally include exact `ForEachMapStatement`, strict-Boolean precondition `WhileStatement`, identity-resolved `BreakStatement`/`ContinueStatement`, private receiver-field writes, `RaiseStatement`, and one-handler `TryStatement`; general exception constructs have no semantic node. `lifetime.js` retains distinct normal/return/raise/break/continue ownership states and proves every owner terminal or transferred at every reachable scope exit. Task 033 class identity/private state remains single-module semantics; Task 034's effect/resource nodes stay compiler-authorized and single-module by default, Task 035 extends Task 010 `SemanticProgram` with versioned canonical capability modules and negotiated provider link requirements, and Task 036 adds exact facade-resolution evidence plus compiler-owned source/module roles and a complete selected-facade descriptor.
|
|
9
9
|
3. Source and binary backends in `src/backends/` validate their semantic capabilities before emitting target syntax or bytes. Shared validation owns recursive block shape, reachability and all-path abrupt-completion analysis, recursively complete expressions, exhaustive operation/type signatures, function signatures, lexical binding scopes, mutability, declaration-before-use, strict condition/return/argument/initializer/assignment types, fixed-point propagation of nominal unchecked errors, and Task 034 capability/effect/resource graph integrity. `backends/effects.js` rejects unsupported authority/target/context combinations before writer allocation and plans nested eager effects into statement-local collision-safe temporaries in semantic evaluation order. Dependency-first Task 010 validation carries ordinary inferred error sets across resolved function-import identities; both single-module generation and program mode accept compiler-authorized capability modules, while program mode additionally resolves their canonical standard-library contract references and links negotiated target host provider artifacts before any writer allocation. Target-specific validation adds identifier rules, entry-scaffolding name collisions, numeric/memory/resource bounds, and target string representation. The single-module original five retain one fixed compiler-owned Task 034 probe binding, and program mode materializes the same probe behavior as a tree-shaken provider artifact under a protected native binding. Text emitters write through `SourceWriter`; the Wasm encoder writes through an annotated binary writer so every byte range is semantic or explicitly synthetic. A backend either returns a complete executable program/project/application set or raises `UNSUPPORTED_CAPABILITY`; it never silently drops nodes, exposes a partial artifact, or lets an emitter discover malformed shape through a native error.
|
|
10
10
|
|
|
11
|
-
`src/language-registry.js` is the sole ordered dispatch and discovery source. Its deeply frozen records bind implementations to independent frontend, text-backend, binary-backend, application-backend, and interoperability roles. Public descriptors derive role booleans, semantic feature flags, artifact multiplicity, round-trip support, rich/v3/byte mapping forms, and acceptance stages/toolchains from those records; `generalFunctionsAndCalls` is true for PHP, Ruby, JavaScript, TypeScript, Java, and
|
|
11
|
+
`src/language-registry.js` is the sole ordered dispatch and discovery source. Its deeply frozen records bind implementations to independent frontend, text-backend, binary-backend, application-backend, and interoperability roles. Public descriptors derive role booleans, semantic feature flags, artifact multiplicity, round-trip support, rich/v3/byte mapping forms, and acceptance stages/toolchains from those records; `generalFunctionsAndCalls` is true for PHP, Ruby, JavaScript, TypeScript, Java, Dart, and Zig; every later feature flag remains true only for the original five. `supportedLanguages` is the derived compatibility view containing IDs with both a frontend and text backend. Duplicate IDs, unknown record fields, malformed capabilities, and unordered acceptance stages fail as `INVALID_REGISTRY`.
|
|
12
12
|
|
|
13
|
-
`index.js` is the public boundary. `createCapabilityAuthority(input)` validates, detaches, and freezes explicit Task 034 compilation authority. `parse({language, filename, source, capabilityAuthority?})` resolves only the frontend role; omitted authority retains the legacy empty capability set and explicit `null` is malformed. `parseProgram(...)` composes only the original-five parser adapters over an explicit complete source set, resolves declarations by identity, performs no I/O, and accepts the same optional compiler authority so program modules may carry Task 034 capability declarations and a Task 035 standard-library contract descriptor. `createStdlibContractRegistry`, `listStdlibModules`, and `resolveStdlibModule` own the versioned canonical contract registry; `createStdlibProviderRegistry` and `listStdlibProviders` own the target host provider registry; `negotiateStdlibProviders` computes the transitive capability closure; and Task 036's `createStdlibFacadeRegistry`, `listStdlibFacades`, and `resolveStdlibFacade` expose detached versioned source-language facade definitions. `generate({language, module})` and `generateArtifact(...)` resolve a single-text backend, validate the full module, and preserve the compatibility source/artifact contracts; they intentionally reject the multiple-artifact C#, Go, C, Rust, Dart, and Wasm backends. `generateArtifactSet(...)` remains the additive single-module artifact boundary, while `generateProgramArtifactSet(...)` plans and validates a complete original-five program before any writer allocation. An unknown ID is `UNSUPPORTED_LANGUAGE`; a known ID missing the program cohort is `UNSUPPORTED_ROLE`; `UNSUPPORTED_CAPABILITY` remains a backend-with-role rejection of semantic content or target layout. `src/artifacts.js` owns transactional generated-file validation and detached, deeply frozen JSON metadata snapshots, including JSON object keys without prototype interpretation. `src/binary-mapping.js` owns byte provenance, and `src/mapping.js` owns text lookup, serialization, import/composition, and diagnostic remapping.
|
|
13
|
+
`index.js` is the public boundary. `createCapabilityAuthority(input)` validates, detaches, and freezes explicit Task 034 compilation authority. `parse({language, filename, source, capabilityAuthority?})` resolves only the frontend role; omitted authority retains the legacy empty capability set and explicit `null` is malformed. `parseProgram(...)` composes only the original-five parser adapters over an explicit complete source set, resolves declarations by identity, performs no I/O, and accepts the same optional compiler authority so program modules may carry Task 034 capability declarations and a Task 035 standard-library contract descriptor. `createStdlibContractRegistry`, `listStdlibModules`, and `resolveStdlibModule` own the versioned canonical contract registry; `createStdlibProviderRegistry` and `listStdlibProviders` own the target host provider registry; `negotiateStdlibProviders` computes the transitive capability closure; and Task 036's `createStdlibFacadeRegistry`, `listStdlibFacades`, and `resolveStdlibFacade` expose detached versioned source-language facade definitions. `generate({language, module})` and `generateArtifact(...)` resolve a single-text backend, validate the full module, and preserve the compatibility source/artifact contracts; they intentionally reject the multiple-artifact C#, Go, C, Rust, Dart, Zig, and Wasm backends. `generateArtifactSet(...)` remains the additive single-module artifact boundary, while `generateProgramArtifactSet(...)` plans and validates a complete original-five program before any writer allocation. An unknown ID is `UNSUPPORTED_LANGUAGE`; a known ID missing the program cohort is `UNSUPPORTED_ROLE`; `UNSUPPORTED_CAPABILITY` remains a backend-with-role rejection of semantic content or target layout. `src/artifacts.js` owns transactional generated-file validation and detached, deeply frozen JSON metadata snapshots, including JSON object keys without prototype interpretation. `src/binary-mapping.js` owns byte provenance, and `src/mapping.js` owns text lookup, serialization, import/composition, and diagnostic remapping.
|
|
14
14
|
|
|
15
15
|
The [iOS application target](ios.md) is a target-only spoke on that artifact boundary. `src/backends/ios.js` reuses Task 010 project/source ownership and the Task 022 Tasks 001–004 Swift capability profile, validates the complete graph/configuration/asset layout, then emits captured namespaced Swift plus synthetic SwiftUI, unsigned project, test, asset-catalog, and versioned manifest artifacts. Apple lifecycle/configuration/resources do not enter semantic IR, and generation performs no filesystem access. There is no public project materializer: transactional create-only directory publication is deferred because Node's public filesystem API cannot combine atomic no-replace publication with descriptor-relative no-follow staging and cleanup without a separately authorized native boundary. No best-effort writer replaces that guarantee. Linux semantic/tool/packed-generator proofs are implemented; Apple/Xcode/Simulator proof remains explicitly deferred.
|
|
16
16
|
|
|
@@ -52,7 +52,7 @@ Frontend source capabilities and backend target capabilities are intentionally s
|
|
|
52
52
|
|
|
53
53
|
Binary operands evaluate left to right. `BooleanAnd` and `BooleanOr` are short-circuit operations. Equality accepts only two operands of the same supported scalar type and means scalar value equality. Semantic integers are mathematical integers with one unsigned zero; IEEE-754 signed zero is not a distinct semantic value. Backends map meaning rather than copying syntax: PHP concatenation is `.`, Java string equality is `.equals`, JavaScript/TypeScript/PHP equality is strict, and other operations use their target's matching native construct. Because supported operations cannot otherwise distinguish signed zero, JavaScript and TypeScript canonically stringify observable scalar output when a module contains integer negation or multiplication. Their frontends unwrap that exact parser-native output scaffold during generated-source reparse, retaining the original operation tree without constant folding. Every emitted operation is conservatively parenthesized; generated-source reparsing reconstructs the same semantic tree.
|
|
54
54
|
|
|
55
|
-
A source-valid semantic name can be rejected for a target reserved word, and a safe semantic integer can be rejected by Java's narrower `int` range. Java validates literal-only integer operation trees with exact mathematical integers without folding the IR, rejecting known results outside signed 32-bit `int`. Kotlin rejects known results outside the semantic safe range and routes dynamic arithmetic through private `Math.*Exact` helpers followed by the same bound check. C# performs the same proof against signed 64-bit and emits an exact `checked(...)` wrapper for every integer arithmetic/negate operation while the project also enables overflow checking. Go performs the signed-64-bit proof without folding, but non-literal runtime overflow retains native `int64` wrap behavior and remains outside the portable result guarantee. Dart rejects statically known results outside the semantic safe range and routes dynamic add/subtract/multiply/negate through exact private `BigInt` helpers before conversion to `int`; a private Boolean identity helper prevents analyzer constant-fold warnings without changing short-circuit evaluation. Only
|
|
55
|
+
A source-valid semantic name can be rejected for a target reserved word, and a safe semantic integer can be rejected by Java's narrower `int` range. Java validates literal-only integer operation trees with exact mathematical integers without folding the IR, rejecting known results outside signed 32-bit `int`. Kotlin rejects known results outside the semantic safe range and routes dynamic arithmetic through private `Math.*Exact` helpers followed by the same bound check. C# performs the same proof against signed 64-bit and emits an exact `checked(...)` wrapper for every integer arithmetic/negate operation while the project also enables overflow checking. Go performs the signed-64-bit proof without folding, but non-literal runtime overflow retains native `int64` wrap behavior and remains outside the portable result guarantee. Dart rejects statically known results outside the semantic safe range and routes dynamic add/subtract/multiply/negate through exact private `BigInt` helpers before conversion to `int`; a private Boolean identity helper prevents analyzer constant-fold warnings without changing short-circuit evaluation. Zig proves known expressions fit `i64` and routes every dynamic add/subtract/multiply/negate through exact overflow intrinsics and one status-70 failure boundary shared by Debug, ReleaseSafe, and ReleaseFast. Only each backend's complete canonical support CST authorizes its helper family during generated-source reparse.
|
|
56
56
|
|
|
57
57
|
## Blocks, flow, and bindings
|
|
58
58
|
|
|
@@ -66,7 +66,7 @@ Task007 adds explicit `OptionalType`, presence/absence construction, simple-iden
|
|
|
66
66
|
|
|
67
67
|
## Provenance and generated mappings
|
|
68
68
|
|
|
69
|
-
Frontend offsets remain parser-owned. Babel token positions, php-parser nodes/tokens, Prism byte locations/comment carriers, Lezer syntax nodes, and Tree-sitter Python/C#/Go/C/CPP/Rust/Swift/Kotlin named and anonymous nodes provide exact function, parameter, local, type, assignment, literal, call, branch, error declaration/construction, catch type/binding, message read, and operator ranges. Every Tree-sitter adapter traverses every child, rejects propagated error/missing recovery, and never substitutes source-text parsing after a rejected tree node. Error declarations and catches receive their own symbols; construction/type and catch-binding message-read references resolve through the same deterministic provenance graph. The JavaScript/TypeScript adapter indexes Babel tokens once by start offset, using direct identifier lookup and bounded binary-search token lookup instead of rescanning the full token stream per semantic node. Source normalization converts only coordinates; it never normalizes source content. CRLF and lone CR count as line breaks and parser coordinates become verified UTF-16 offsets.
|
|
69
|
+
Frontend offsets remain parser-owned. Babel token positions, php-parser nodes/tokens, Prism byte locations/comment carriers, Lezer syntax nodes, and Tree-sitter Python/C#/Go/C/CPP/Rust/Swift/Kotlin/Dart/Zig named and anonymous nodes provide exact function, parameter, local, type, assignment, literal, call, branch, error declaration/construction, catch type/binding, message read, and operator ranges. Every Tree-sitter adapter traverses every child, rejects propagated error/missing recovery, and never substitutes source-text parsing after a rejected tree node. Error declarations and catches receive their own symbols; construction/type and catch-binding message-read references resolve through the same deterministic provenance graph. The JavaScript/TypeScript adapter indexes Babel tokens once by start offset, using direct identifier lookup and bounded binary-search token lookup instead of rescanning the full token stream per semantic node. Source normalization converts only coordinates; it never normalizes source content. CRLF and lone CR count as line breaks and parser coordinates become verified UTF-16 offsets.
|
|
70
70
|
|
|
71
71
|
Each semantic node carries a JSON-safe source-provenance association through reorder, insertion, deletion, cloning, and serialization. Generation rebuilds canonical paths and node/symbol identities from current traversal and validates any serialized caller provenance before use; aggregate path/kind coincidence is never used to associate a different node. Shared caller objects receive deterministic occurrence records keyed by current JSON Pointer, so reused parameters, types, expressions, and valid statements do not collapse distinct emitted locations. Malformed caller registries, including empty source filenames, are discarded before canonical source fallback. This permits legacy and multi-source caller IR while preventing duplicate/stale IDs, mismatched source ownership, or out-of-bounds ranges from becoming semantic authority. The source-aware writer makes all output spans explicit, retains every contextual origin range across composition boundaries, and leaves no coarse legacy emitter path. Rich maps are frozen and indexed after validation; generated, original, node, and symbol queries include contextual related provenance without duplicate spans. See [source provenance and mappings](source-maps.md).
|
|
72
72
|
|
|
@@ -89,3 +89,9 @@ Rust/Cargo discovery requires the exact qualified 1.98.1 commits and Linux x86-6
|
|
|
89
89
|
Task023 adds `kotlin` through the root Tree-sitter 0.25.1 boundary and the exact ABI-14 Semantifold packaging fork of the community Kotlin grammar. The adapter consumes every CST edge, accepts only explicit Tasks001-004 Kotlin forms, and recognizes generated checked-arithmetic support only when the complete canonical helper CST is present. Parser trees and helper authority remain frontend-private.
|
|
90
90
|
|
|
91
91
|
The backend emits one mapped `Program.kt` and validates its final source through the registered Kotlin frontend before returning it. `generateArtifactSet()` wraps that entry with detached immutable Kotlin2.4/API2.4/JVM25 compiler and `java -jar Program.jar` metadata; it does not create a Gradle project or expose compiler artifacts. Exact `kotlinc` 2.4.20 and OpenJDK25 discovery and real compilation/execution remain acceptance concerns, never generation effects. See the [Kotlin/JVM profile](kotlin.md).
|
|
92
|
+
|
|
93
|
+
## Zig parser boundary and native project
|
|
94
|
+
|
|
95
|
+
Task031 adds `zig` through a second private compatible Tree-sitter workspace because the qualified grammar requires exact binding 0.22.4 rather than the root 0.25.1 or legacy 0.21.1 bindings. Its nested ordinary `file:` production dependency bundles exact grammar 1.1.2 and exposes only recursively frozen parser-neutral CST snapshots. The adapter validates every child edge, UTF-16 conversion, recovery flag, canonical runtime/helper region, source bound, and depth bound before shared semantic validation.
|
|
96
|
+
|
|
97
|
+
The Zig backend preflights the complete graph and emits synthetic `build.zig` plus mapped `src/main.zig`. A fixed global arena owns all concatenated `[]const u8` slices until the exact entry-shell defer; semantic values never observe ownership or pointer identity. Checked arithmetic and allocation/output failures use explicit status-70 boundaries, so optimizer mode cannot change semantic behavior. Final source reparses through the same private frontend; filesystem materialization, formatting, builds, isolated caches, and Debug/ReleaseSafe/ReleaseFast execution remain acceptance-only effects. See the [Zig profile](zig.md).
|
package/docs/goals.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Semantifold's long-term goal is a language-neutral toolkit for understanding, transforming, generating, and eventually executing programs through a shared high-level semantic representation. The representation should make types, control flow, calls, declarations, diagnostics, and source provenance understandable without exposing a language parser's private tree.
|
|
4
4
|
|
|
5
|
-
The current source tree proves one minimal Tasks 001–004 vertical slice across
|
|
5
|
+
The current source tree proves one minimal Tasks 001–004 vertical slice across fifteen registered source languages: PHP, Ruby, JavaScript, TypeScript, Java, Kotlin/JVM, strictly annotated Python, canonical C#, bounded Go, C17, C++20, Rust edition 2021, Swift, Dart, and Zig. Dart and Zig additionally implement the bounded Task 005 required-function/call profile; the original five retain the delivered Task 013 acceptance gate for the combined Tasks 001–008 profile, Task 009 nominal closed records, Task 010 explicit acyclic multi-source semantic programs, Task 011 exact nominal typed unchecked errors, and Task 012 invariant unbounded function/record type parameters with closed applications and argument-only first-order call inference. Task 014 is delivered through PR #41, Task 032 through PR #42, Task 033 through PR #43, and Task 034 through PR #44. Task 035 is delivered through PR #45 and merge commit `a2aad9d4932bfc6087adc4ff8bca43678c92413c`, with versioned canonical standard-library contracts, target host providers and protected native bindings, capability negotiation, and program-mode provider linking. Task 036 is delivered through PR #46 and merge `9aba48f9d48bcef4fd4c9275aec14bfcc4f0904c`; it adds bounded versioned executable qualification facades and exact parser-backed native identity resolution for the original five. Task 037 adds only the first concrete Ruby-source-to-PHP-target blocking TCP/line-output slice on those foundations. The source tree includes versioned source provenance, deterministic semantic node/symbol identity, range-based generated mappings, Source Map v3 interop, composition, and diagnostic remapping across those bounded profiles. The published `semantifold@0.5.0` release predates Task 031. Neither the source tree nor that release provides a general analyzer, transformation API, interpreter, optimizer, implicit project/package discovery, debugger integration, coverage remapping, or lossless formatter.
|
|
6
6
|
|
|
7
7
|
The long-term product direction includes bounded standard-library portability through [language compatibility stdlib/facades, canonical Semantifold stdlib contracts/capabilities, and target host providers/native bindings](standard-library-portability.md). That direction is incremental and versioned; it does not promise arbitrary standard-library coverage or arbitrary-application translation. The `0.3.0` release has no imports, classes or methods, loops, optional values, typed errors, resources, host APIs, or stdlib portability.
|
|
8
8
|
|
package/docs/language-support.md
CHANGED
|
@@ -20,11 +20,12 @@ The immutable registry is authoritative for both dispatch and discovery:
|
|
|
20
20
|
| `rust` | yes | yes | no | no | no | no | no | no | no | no | no | no | no | no | no | no | multiple | yes | rich + v3 | parse, generate, compile, validate, execute (`rustc`, `cargo`) |
|
|
21
21
|
| `swift` | yes | yes | no | no | no | no | no | no | no | no | no | no | no | no | no | no | single | yes | rich + v3 | parse, generate, compile, execute (`swiftc`) |
|
|
22
22
|
| `dart` | yes | yes | no | no | no | yes | no | no | no | no | no | no | no | no | no | no | multiple | yes | rich + v3 | parse, generate, restore, compile, validate, execute (`dart`) |
|
|
23
|
+
| `zig` | yes | yes | no | no | no | yes | no | no | no | no | no | no | no | no | no | no | multiple | yes | rich + v3 | parse, generate, compile, validate, execute (`zig`) |
|
|
23
24
|
| `wasm` | no | no | yes | yes | no | no | no | no | no | no | no | no | no | no | no | no | multiple | no | rich text + v3 + byte ranges | generate, validate, instantiate, execute (`wasm-validate`, `node`, `chromium`) |
|
|
24
25
|
| `ios` | no | no | no | yes | no | no | no | no | no | no | no | no | no | no | no | no | multiple | no | rich text + v3 + byte ranges | generate (Apple acceptance deferred) |
|
|
25
26
|
| `android` | no | no | no | yes | no | no | no | no | no | no | no | no | no | no | no | no | multiple | no | rich text + v3 + byte ranges | generate, compile, validate, instantiate, execute (`android`, TensorBuzz KVM) |
|
|
26
27
|
|
|
27
|
-
`languageCapabilities` exposes all
|
|
28
|
+
`languageCapabilities` exposes all eighteen records as frozen data, including `features.generalFunctionsAndCalls`, `features.immutableCollections`, `features.optionalValues`, `features.orderedListIteration`, `features.orderedMapIteration`, `features.conditionControlledLoops`, `features.referenceClasses`, `features.effectfulCapabilitiesAndResources`, `features.closedRecords`, `features.typedErrors`, and `features.typeParametersAndGenerics`. A role or semantic feature is not inferred from another role: browser Wasm has binary/application backends without a frontend or text backend, while `ios` and `android` have only application backends. None has a source round trip or general interoperability role; Android retains the Kotlin/JVM Tasks 001–004 function subset while adding resolved Task 010 module linkage in its application shell. `supportedLanguages` is the derived list of fifteen records with both frontend and text generation. C#, Go, C, and Zig return two text artifacts; Rust and Dart return three; Wasm returns one binary and three text artifacts; iOS and Android return deterministic multi-artifact application projects. Their callers use `generateArtifactSet()`; the legacy single-artifact APIs reject unavailable roles with `UNSUPPORTED_ROLE`.
|
|
28
29
|
|
|
29
30
|
## Task 026 iOS application generation
|
|
30
31
|
|
|
@@ -50,7 +51,7 @@ The shared negative corpus covers parser recovery, missing types, truthiness, mi
|
|
|
50
51
|
|
|
51
52
|
## Task 005 general functions and calls
|
|
52
53
|
|
|
53
|
-
PHP, Ruby, JavaScript with JSDoc, TypeScript, Java, and
|
|
54
|
+
PHP, Ruby, JavaScript with JSDoc, TypeScript, Java, Dart, and Zig accept any number of required positional parameters, including zero. The module resolver collects every unique function signature before validating bodies, assigns declarations deterministic `function:N` identities, and binds each direct call to that identity plus its ordered parameter and return types. This permits forward calls, nested calls, direct recursion, and unambiguous mutual recursion without overload or dynamic dispatch. Arity and every positional scalar type must match exactly.
|
|
54
55
|
|
|
55
56
|
Function returns are `integer`, `boolean`, `string`, or `void`. A non-void function has an expression on every reachable return and returns on every reachable path. A void function may fall through or use a bare return, and its call is legal only as an `ExpressionStatement`. Void is never a value: it cannot type a parameter or local, initialize or assign a binding, become an argument or operand, be printed, or be returned as a value. Generation revalidates declaration identities and complete resolved signatures in externally supplied IR. Function names, parameters, return annotations, callees, arguments, and resolution references retain deterministic parser-backed provenance and mappings.
|
|
56
57
|
|
|
@@ -61,6 +62,7 @@ The source profiles remain deliberately exact:
|
|
|
61
62
|
- PHP accepts simple typed by-value required parameters, an explicit scalar or `void` return, and unqualified direct calls. Defaults, variadics, named/unpacked/by-reference arguments, by-reference parameters or returns, methods, dynamic/qualified calls, implicit nullability, and missing types are rejected; Task 007 adds only its exact explicit nullable profile.
|
|
62
63
|
- Java accepts the established private-static semantic method profile with explicit supported parameter and scalar-or-void result types inside `public final class Main`, plus receiver-free direct calls and the exact entry method. Generated zero-parameter signatures named `getClass`, `hashCode`, `clone`, `toString`, `notify`, `notifyAll`, `wait`, or `finalize` conflict with inherited `java.lang.Object` instance methods and are rejected before emission; nonconflicting scalar-parameter overloads of those names remain available. Overload sets, instance/receiver/qualified/static-import ambiguity, varargs, bounded/defaulted/wildcard/raw generics, constructors, throws clauses, and non-static semantic methods are rejected.
|
|
63
64
|
- Dart accepts synchronous top-level functions with exact explicit `int`, `bool`, `String`, or `void` returns, explicitly typed required positional parameters, initialized typed locals, direct calls, and exact `void main()`/`print`. Inference, `var`, inferred `final`, optional/named/default arguments, methods/classes, generics, imports, dynamic/nullability, collections, exceptions, async, and isolates are rejected. Generated Dart alone may contain formatter-added trailing commas and the complete canonical private runtime prefix; neither grants those forms to ordinary source. See [Dart source and target](dart.md).
|
|
65
|
+
- Zig accepts top-level functions with exact explicit `i64`, `bool`, `[]const u8`, or `void` returns, explicitly typed required positional parameters, initialized typed `const`/`var` locals, direct calls, and the exact generated support/`pub fn main()` shell. Inference, optional/default/rest parameters, methods, containers, user slices/pointers/allocators, imports beyond the canonical standard-library support, error unions, `comptime`, generics, reflection, FFI, async, and concurrency are rejected. See [Zig source and target](zig.md).
|
|
64
66
|
|
|
65
67
|
Python, C#, C, C++, Rust, Swift, Kotlin/JVM, Go, and browser Wasm remain on their Task 025 Tasks 001–004 profile. Their registry feature flag is false, their existing exact-two/scalar-return behavior is unchanged, and a Task-005-only arity, void return, or void call statement is a located `UNSUPPORTED_CAPABILITY` before source, bytes, or a partial artifact set is exposed. This boundary does not broaden the future Task 013 aggregate acceptance.
|
|
66
68
|
|
|
@@ -220,6 +222,8 @@ This acceptance remains original-five-only and does not itself expand to the lat
|
|
|
220
222
|
| C++ | exact `std::int64_t`, `bool`, and owned `std::string` | checked scalar print helpers in `int main()` |
|
|
221
223
|
| Rust | exact `i64`, `bool`, owned `String`; typed `let`/`let mut`, canonical safe decimal `i64` literal suffix | exact scalar print helpers in `fn main()` |
|
|
222
224
|
| Swift | exact `Int64`, `Bool`, and `String`; explicitly typed `let`/`var` | direct top-level `print(…)` in `program.swift` |
|
|
225
|
+
| Dart | exact `int`, `bool`, and `String`; explicitly typed `final`/typed mutable locals | exact `void main()` and `print(…)` in `bin/program.dart` |
|
|
226
|
+
| Zig | exact `i64`, `bool`, and immutable UTF-8 `[]const u8`; explicitly typed `const`/`var` | checked scalar output helpers in exact `pub fn main() void` in `src/main.zig` |
|
|
223
227
|
|
|
224
228
|
C uses the unchanged private root-bundled legacy CST boundary and the [complete C17 profile](c.md). It generates deterministic `program.c` plus `semantifold_runtime.h`, checks signed integer arithmetic and arena sizes, and sequences every call and nontrivial expression through exact versioned regions. Caller-authored nested calls with unspecified C order are rejected. Generated regions reparse only after whole-CST comparison verifies types, numbering, uses, order, consumers, prototypes and cleanup. No user pointer, ownership, preprocessing, general FFI or C++ behavior enters semantic IR. Real Clang O0/O2 execution and ASan/UBSan/leak checks are mandatory on the qualified Linux lane.
|
|
225
229
|
|
|
@@ -304,9 +308,9 @@ The two executable compiler-owned Ruby facades compile through ordinary semantic
|
|
|
304
308
|
|
|
305
309
|
Line reads block without a configurable timeout, decode incremental UTF-8, retain LF and CRLF, return the final unterminated line once, and use absence only for clean EOF. Output adds LF only when missing. Connect/read/decode/write/close failures remain typed, and either outcome of the first close attempt makes the resource terminal. TCP servers, TLS, UDP, Unix sockets, nonblocking or async I/O, cancellation, arbitrary encodings/framing, other Ruby APIs/output forms, other source facades, and other target providers remain unsupported. See the [standard-library portability design](standard-library-portability.md) and [dependency-ordered implementation plan](plans/2026-09-05-standard-library-portability.md).
|
|
306
310
|
|
|
307
|
-
All
|
|
311
|
+
All fifteen frontends preserve exact input content and parser-backed semantic token ranges in module provenance. The original-six 36-combination matrix remains byte-characterized; Tasks 017–020, 022–024, and 031 add their own native/managed and original-five crossing coverage. Go's `main.go` has complete range-based rich/v3 mappings; manifest-first `go.mod` has synthetic configuration provenance related to the module root. CPP, Rust, Swift, Kotlin, Dart, and Zig map original occurrences and synthetic target support. Output text uses LF deterministically. Only JavaScript and TypeScript may opt into inline or external `sourceMappingURL` directives; C#, Go, C, CPP, Rust, Swift, Kotlin, Dart, and Zig reject unsupported mapping directive/filename options instead of silently dropping them. Mapping does not imply lossless formatting or support for syntax outside the semantic subset. See [source provenance and mappings](source-maps.md).
|
|
308
312
|
|
|
309
|
-
`UNSUPPORTED_LANGUAGE` is exclusive to unknown or misspelled IDs. `UNSUPPORTED_ROLE` reports a known ID without the requested frontend, text/binary/application backend, artifact, or interoperability role, including C#, Go, C, Rust, and
|
|
313
|
+
`UNSUPPORTED_LANGUAGE` is exclusive to unknown or misspelled IDs. `UNSUPPORTED_ROLE` reports a known ID without the requested frontend, text/binary/application backend, artifact, or interoperability role, including C#, Go, C, Rust, Dart, and Zig through a legacy single-artifact API. `UNSUPPORTED_CAPABILITY` reports a role that exists but cannot represent the requested semantic module or target feature. `UNSUPPORTED_SYNTAX` reports parsed constructs outside the subset with the best parser-provided source location. Missing public annotations use `MISSING_TYPE`; a present unsupported type is `UNSUPPORTED_SYNTAX` at that annotation. Parser failures use `PARSE_ERROR`. Semantic resolution/type failures use `DUPLICATE_BINDING`, `UNRESOLVED_BINDING`, `USE_BEFORE_DECLARATION`, `IMMUTABLE_ASSIGNMENT`, and `TYPE_MISMATCH`; Task 005 additionally uses `VOID_AS_VALUE`, `VOID_RETURN_VALUE`, and `MISSING_RETURN_VALUE`. Task 033 adds `DUPLICATE_CLASS`, `DUPLICATE_PRIVATE_FIELD`, `DUPLICATE_CONSTRUCTOR`, `DUPLICATE_METHOD`, `INCOMPLETE_INITIALIZATION`, `ILLEGAL_PRIVATE_ACCESS`, `UNKNOWN_CLASS`, `INVALID_METHOD_RECEIVER`, `UNKNOWN_METHOD`, `CONSTRUCTOR_ARITY_MISMATCH`, and `METHOD_ARITY_MISMATCH`. Task 034 adds `MISSING_CAPABILITY_AUTHORITY`, `INVALID_CAPABILITY_AUTHORITY`, `UNDECLARED_EFFECT`, `UNDECLARED_FAILURE`, `INVALID_EFFECT_ORDER`, `RESOURCE_TYPE_MISMATCH`, `RESOURCE_MOVE_REQUIRED`, `INVALID_RESOURCE_TRANSFER`, `RESOURCE_ALIAS`, `INVALID_RESOURCE_BORROW`, `BORROW_ESCAPE`, `USE_AFTER_MOVE`, `USE_AFTER_CLOSE`, `RESOURCE_STATE_MISMATCH`, `LEAKED_RESOURCE`, and `FAILURE_ABSENCE_CONFLATION`; a repeated close in the bounded probe uses its declared terminal failure rather than `DOUBLE_CLOSE`. Task 035 adds `STDLIB_CONTRACT_INVALID`, `STDLIB_MODULE_UNKNOWN`, `STDLIB_OPERATION_UNDECLARED`, `STDLIB_VERSION_INCOMPATIBLE`, `STDLIB_VERSION_MALFORMED`, `STDLIB_PROVIDER_INVALID`, `STDLIB_PROVIDER_MISSING`, `STDLIB_PROVIDER_AMBIGUOUS`, `STDLIB_PROVIDER_DEPENDENCY_MISSING`, `STDLIB_PROVIDER_CYCLE`, `STDLIB_LINK_FAILURE`, and `STDLIB_NAME_COLLISION`. Task 036 adds `STDLIB_FACADE_INVALID`, `STDLIB_FACADE_IDENTITY_UNPROVED`, `STDLIB_FACADE_MEMBER_UNSUPPORTED`, `STDLIB_FACADE_VERSION_MALFORMED`, `STDLIB_FACADE_VERSION_INCOMPATIBLE`, `STDLIB_FACADE_DYNAMIC_REFERENCE`, `STDLIB_FACADE_REFLECTION_UNSUPPORTED`, `STDLIB_FACADE_NATIVE_EXTENSION_UNSUPPORTED`, `STDLIB_FACADE_SHADOWED`, `STDLIB_FACADE_REOPENED`, `STDLIB_FACADE_AUTHORITY_FORGED`, `STDLIB_FACADE_NAME_COLLISION`, `STDLIB_FACADE_DECLARATION_MISMATCH`, and `STDLIB_FACADE_DESCRIPTOR_INVALID`; Task 037 additionally uses `STDLIB_PROTECTED_BINDING_ACCESS` for portable attempts to reach canonical operations directly. Resolution failures retain parser locations, while descriptor/link failures are transactional. Flow failures use `NON_BOOLEAN_CONDITION`, `MISSING_RETURN`, `UNREACHABLE_STATEMENT`, `ILLEGAL_RETURN_CONTEXT`, `ILLEGAL_BREAK_CONTEXT`, `ILLEGAL_CONTINUE_CONTEXT`, `INVALID_LOOP_TARGET`, `CROSS_FUNCTION_LOOP_TARGET`, and `UNSUPPORTED_STATEMENT`. Backends validate complete recursive block shape, flow, scalar payloads, binding/type agreement, call resolutions, mutability, loop context, identifiers, target bounds, and fixed artifact contracts before emission. Missing or structurally invalid caller IR reports located `UNSUPPORTED_CAPABILITY` rather than leaking a native error or producing partial source. A non-`Main.java` Java basename, non-`Program.cs` C# filename, non-`main.go` Go filename, non-`program.c` C filename, non-`src/main.rs` Rust filename, non-`bin/program.dart` Dart filename, or non-`src/main.zig` Zig filename uses that same contract. Artifact-set generation requires a non-empty string language/target ID and accepts only the explicit `text`, `binary`, and `application` backend-role strings; malformed IDs or roles report `INVALID_ARTIFACT_SET` without coercing caller input, while an unknown string ID reports `UNSUPPORTED_LANGUAGE` and a valid role absent from a known registry record reports `UNSUPPORTED_ROLE`. Optional registry roles and backend metadata may be omitted with `undefined`; present malformed values, including `null`, report `INVALID_REGISTRY`. Invalid registry, artifact-set, byte-map, discovery, and runner inputs have their own normalized diagnostics rather than leaking native type or subprocess errors.
|
|
310
314
|
|
|
311
315
|
Boxed or coercive types, inferred public types, TypeScript literal/enum/`any`/`unknown`/arbitrary-union types, PHP aliases or implicit nullable declarations, Ruby `boolish`, Java `Boolean`/`char`, universal null values, floating point, decimal, bigint, symbols, regex values, byte strings, and interpolation are unsupported. Division, remainder, exponentiation, bitwise/shift/update/compound operations, Ruby/PHP `and`/`or`, loose equality, ternary/nullish forms, optional/safe navigation, ranges, general casts/assertions, collection/object equality, operator overloading, implicit coercion, and constant folding are also excluded; the sole assertion exception is Task 006's exact TypeScript `Map#get(...)!` wrapper, whose lookup must be independently total. Task 007 supplies only the exact explicit optional model, Task 008 only exact ordered list loops, Task 010 only explicit supplied source projects, Task 011 only the exact nominal unchecked-error model above, Task 012 only the exact unbounded invariant generic profile above, Task 014 only the exact ordered-map pair loop above, Task 032 only the exact strict-Boolean precondition loop above, Task 033 only the exact closed reference-class profile above, and Task 034 only the explicit single-module probe effect/resource profile above. There is no truthiness, implicit-return or general statement-value model, async/generator model, open/inherited/virtual class model, implicit import discovery, post-condition/basic/range loops, arbitrary or ordinary-map iteration, switches, exception behavior beyond Task 011 and declared Task 034 failures, overloads, advanced generic/effect type systems, implicit resource cleanup, unsafe native handles, package-manager resolution, or source-format preservation. The sole value-free expression statements are resolved void function and method calls in the original-five cohort. Ruby type comments remain a bounded RBS-style convention rather than a full signature parser, and single-module Java generation retains the fixed `Main.java` contract.
|
|
312
316
|
|