semantifold 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -7
- package/build/index.d.ts +12 -8
- package/build/index.d.ts.map +1 -1
- package/build/index.js +10 -7
- package/build/src/backends/android.d.ts +49 -0
- package/build/src/backends/android.d.ts.map +1 -0
- package/build/src/backends/android.js +1278 -0
- package/build/src/backends/identifiers.d.ts +6 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +30 -1
- package/build/src/backends/ios.js +2 -2
- package/build/src/backends/kotlin.d.ts +10 -0
- package/build/src/backends/kotlin.d.ts.map +1 -1
- package/build/src/backends/kotlin.js +11 -9
- package/build/src/backends/native-validation.d.ts +2 -2
- package/build/src/backends/native-validation.d.ts.map +1 -1
- package/build/src/backends/native-validation.js +2 -2
- package/build/src/backends/program.d.ts +6 -4
- package/build/src/backends/program.d.ts.map +1 -1
- package/build/src/backends/program.js +5 -4
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +2 -1
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +20 -4
- package/build/src/backends/writer.d.ts +21 -1
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +25 -2
- package/build/src/backends/zig-runtime.d.ts +5 -0
- package/build/src/backends/zig-runtime.d.ts.map +1 -0
- package/build/src/backends/zig-runtime.js +92 -0
- package/build/src/backends/zig-validation.d.ts +9 -0
- package/build/src/backends/zig-validation.d.ts.map +1 -0
- package/build/src/backends/zig-validation.js +73 -0
- package/build/src/backends/zig.d.ts +42 -0
- package/build/src/backends/zig.d.ts.map +1 -0
- package/build/src/backends/zig.js +584 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +2 -1
- package/build/src/frontends/zig-parser.d.ts +31 -0
- package/build/src/frontends/zig-parser.d.ts.map +1 -0
- package/build/src/frontends/zig-parser.js +17 -0
- package/build/src/frontends/zig.d.ts +14 -0
- package/build/src/frontends/zig.d.ts.map +1 -0
- package/build/src/frontends/zig.js +970 -0
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +40 -1
- package/build/src/mapping.js +2 -2
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +184 -4
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +45 -3
- package/build/src/semantic/validate.js +2 -2
- package/build/src/toolchains.d.ts +6 -0
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +2 -1
- package/build/src/zig-bindings.d.ts +10 -0
- package/build/src/zig-bindings.d.ts.map +1 -0
- package/build/src/zig-bindings.js +54 -0
- package/docs/android.md +79 -0
- package/docs/architecture.md +13 -5
- package/docs/goals.md +1 -1
- package/docs/ios.md +1 -1
- package/docs/language-support.md +15 -4
- package/docs/parser-qualification.md +31 -1
- package/docs/source-maps.md +7 -3
- package/docs/specification.md +5 -0
- package/docs/testing.md +40 -3
- package/docs/zig.md +33 -0
- package/index.js +9 -6
- package/node_modules/semantifold-tree-sitter-zig-internal/LICENSE +15 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/README.md +5 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/README.md +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/binding.gyp +29 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/grammar.js +900 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/package.json +57 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/darwin-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/darwin-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/linux-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/linux-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/win32-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/win32-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/folds.scm +23 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/highlights.scm +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/indents.scm +22 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/injections.scm +10 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/grammar.json +6570 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/node-types.json +3178 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/parser.c +169829 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/array.h +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/tree-sitter-zig.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/tree-sitter.json +38 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/README.md +128 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/binding.gyp +80 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/index.js +916 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/package.json +76 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/language.cc +106 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/node.cc +1088 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/parser.cc +306 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/query.cc +397 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/query.h +40 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree.cc +316 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/tree-sitter.d.ts +1042 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1318 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +223 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +297 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +435 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +920 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2165 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +206 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4187 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +130 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1066 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +712 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +83 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1302 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1859 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/package.json +21 -0
- package/node_modules/semantifold-tree-sitter-zig-internal/src/zig.js +134 -0
- package/package.json +11 -6
- package/src/backends/android.js +1374 -0
- package/src/backends/identifiers.js +30 -0
- package/src/backends/ios.js +1 -1
- package/src/backends/kotlin.js +11 -8
- package/src/backends/native-validation.js +1 -1
- package/src/backends/program.js +4 -3
- package/src/backends/scalars.js +1 -0
- package/src/backends/shared.js +22 -3
- package/src/backends/writer.js +27 -2
- package/src/backends/zig-runtime.js +93 -0
- package/src/backends/zig-validation.js +68 -0
- package/src/backends/zig.js +579 -0
- package/src/frontends/scalars.js +1 -0
- package/src/frontends/zig-parser.js +20 -0
- package/src/frontends/zig.js +994 -0
- package/src/language-registry.js +40 -0
- package/src/mapping.js +1 -1
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +47 -2
- package/src/semantic/validate.js +1 -1
- package/src/toolchains.js +1 -0
- package/src/zig-bindings.js +46 -0
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWlucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sY2hhaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQ3hELDJGQUEyRixDQUFDO0lBQzlGLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsZ0VBQWdFLENBQUM7SUFDNUgsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDekUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUM7SUFDdEUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxlQUFlLENBQUM7SUFDekUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSw2QkFBNkIsQ0FBQztJQUM1RixJQUFJLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLGlEQUFpRCxDQUFDO0lBQzdHLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsVUFBVSxDQUFDLEVBQ3pELHVNQUF1TSxDQUFDO0lBQzFNLE9BQU8sRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLHFCQUFxQixFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsMEVBQTBFLENBQUM7SUFDL0ksTUFBTSxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUM7SUFDbEYsTUFBTSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDM0UsRUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSx5Q0FBeUMsQ0FBQztJQUM5RixPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLHVFQUF1RSxDQUFDO0lBQzdJLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsdUVBQXVFLENBQUM7SUFDdkksS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUUsc05BQXNOLENBQUM7SUFDblMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUUsZ0xBQWdMLENBQUM7SUFDN1AsR0FBRyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxhQUFhLENBQUM7SUFDckUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxXQUFXLENBQUMsRUFBRSxzRkFBc0YsQ0FBQztJQUNqTCxlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWUsRUFBRSwyQkFBMkIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQztJQUN2RyxRQUFRLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLG1DQUFtQyxDQUFDO0NBQzdHLENBQUMsQ0FBQTtBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxHQUFHLEVBQUU7SUFDL0QsSUFBSSxPQUFPLEVBQUUsSUFBSSxRQUFRLElBQUksRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1QyxnQkFBZ0IsQ0FBQyw4REFBOEQsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUMvRixDQUFDO0lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7UUFBRSxnQkFBZ0IsQ0FBQyxnREFBZ0QsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNuRyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQztRQUN2RCxDQUFDLENBQUMsbUJBQW1CLEVBQUMsK0NBQWdELENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUViLElBQUksQ0FBQyxVQUFVO1FBQUUsZ0JBQWdCLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzdFLE1BQU0sd0JBQXdCLEdBQUcsT0FBTyxDQUFDLFdBQVcsS0FBSyxTQUFTO1FBQ2hFLENBQUMsQ0FBQyxTQUFTO1FBQ1gsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDaEQsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLElBQUksa0JBQWtCLEVBQUUsQ0FBQTtJQUNwRSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVM7UUFDL0MsQ0FBQyxDQUFDLHdCQUF3QixLQUFLLFNBQVM7WUFDdEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDO1lBQ3JELENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsMkJBQTJCLENBQUM7UUFDcEUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUE7SUFFcEIsT0FBTyxpQkFBaUIsQ0FBQztRQUN2QixnQkFBZ0IsRUFBRSxVQUFVLENBQUMsZ0JBQWdCO1FBQzdDLFdBQVc7UUFDWCxFQUFFO1FBQ0YsUUFBUSxFQUFFLFVBQVU7UUFDcEIsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQjtRQUM3QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQjtLQUM5QyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUFDLEtBQUs7SUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFBRSxnQkFBZ0IsQ0FBQyxnREFBZ0QsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUMxRyxNQUFNLHdCQUF3QixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQTtJQUN2RCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQzNHLE1BQU0sU0FBUyxHQUFHO1FBQ2hCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7UUFDeEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVztRQUN2RixFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDWixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7UUFDeEIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtRQUN4QyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUztRQUM3RSxnQkFBZ0I7S0FDakIsQ0FBQTtJQUVELGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzVCLE1BQU0sZ0JBQWdCLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUMzRSxNQUFNLFdBQVcsR0FBRywyREFBMkQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUN2RyxNQUFNLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMvQyxNQUFNLFFBQVEsR0FBRyxpQ0FBaUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN2RSxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsWUFBWSxNQUFNO1FBQ25FLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7UUFDakYsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNiLE1BQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzdELE1BQU0seUJBQXlCLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN0RixNQUFNLHFCQUFxQixHQUFHLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDLEdBQUcsUUFBUSxLQUFLLFNBQVM7UUFDakQsQ0FBQyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsRUFBRSxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDaEYsQ0FBQyxDQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBQyxDQUFBO0lBQ2xILCtDQUErQztJQUMvQyxJQUFJLE1BQU0sQ0FBQTtJQUVWLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxNQUFNLHVCQUF1QixDQUFDO1lBQ3JDLFNBQVMsRUFBRSx5QkFBeUI7WUFDcEMsV0FBVyxFQUFFLHFCQUFxQjtZQUNsQyxVQUFVO1lBQ1YsU0FBUyxFQUFFLElBQUksR0FBRyxJQUFJO1lBQ3RCLFNBQVM7U0FDVixDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzlDLE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTdDLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQztZQUM5QixHQUFHLFlBQVk7WUFDZixLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ2pELElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxzQkFBc0I7WUFDaEUsT0FBTyxFQUFFLGdCQUFnQjtZQUN6QixVQUFVO1lBQ1YsUUFBUSxFQUFFLEVBQUU7WUFDWixPQUFPLEVBQUUsUUFBUTtnQkFDZixDQUFDLENBQUMsd0JBQXdCLFVBQVUsY0FBYyxTQUFTLEtBQUs7Z0JBQ2hFLENBQUMsQ0FBQyx3QkFBd0IsVUFBVSxXQUFXO1lBQ2pELE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtZQUMzQixNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07U0FDNUIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE1BQU0sRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFBO0lBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3RDLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQTtJQUN2RixNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUV0RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLHFCQUFxQixDQUFDO1lBQzlCLElBQUksRUFBRSxzQkFBc0I7WUFDNUIsT0FBTyxFQUFFLGdCQUFnQjtZQUN6QixVQUFVO1lBQ1YsUUFBUSxFQUFFLEVBQUU7WUFDWixPQUFPLEVBQUUsd0JBQXdCLFVBQVUsK0JBQStCO1lBQzFFLE1BQU07WUFDTixNQUFNO1NBQ1AsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELElBQUksZ0JBQWdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLElBQUkscUJBQXFCLENBQUM7WUFDOUIsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxPQUFPLEVBQUUsZ0JBQWdCO1lBQ3pCLFVBQVU7WUFDVixRQUFRLEVBQUUsRUFBRTtZQUNaLE9BQU8sRUFBRSxlQUFlLFVBQVUsbUNBQW1DLE9BQU8sSUFBSTtZQUNoRixNQUFNO1lBQ04sTUFBTTtZQUNOLE9BQU87U0FDUixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUM7UUFDaEIsT0FBTyxFQUFFLGdCQUFnQjtRQUN6QixVQUFVO1FBQ1YsRUFBRTtRQUNGLE1BQU07UUFDTixPQUFPO1FBQ1AsZ0JBQWdCLEVBQUUseUJBQXlCO1FBQzNDLGFBQWE7S0FDZCxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLDJCQUEyQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtJQUNuRyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsMkJBQTJCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUMsQ0FBQTtBQUM1RixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLO0lBQzlCLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRSxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDO1FBQ3JELE9BQU8sS0FBSyxDQUFDLGdCQUFnQixJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxJQUFJLENBQUM7UUFDL0UsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3RILENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDckYsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUMzRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxLQUFLLENBQUMsUUFBUSxJQUFJLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsWUFBWSxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUosZ0JBQWdCLENBQUMsaUlBQWlJLGdCQUFnQixLQUFLLEVBQ3JLLE9BQU8sS0FBSyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3pELENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUztJQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXpCLEtBQUssTUFBTSxTQUFTLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN4RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFBRSxTQUFRO1FBQ2xFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRS9DLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUE7WUFFcEQsSUFBSSxLQUFLLElBQUksU0FBUztnQkFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNuRCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsdUZBQXVGO1FBQ3pGLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQztZQUM5QixJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLE9BQU87WUFDUCxRQUFRLEVBQUUsRUFBRTtZQUNaLE9BQU8sRUFBRSxzQkFBc0IsT0FBTywyQ0FBMkM7U0FDbEYsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUkscUJBQXFCLENBQUM7WUFDOUIsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixPQUFPO1lBQ1AsUUFBUSxFQUFFLEVBQUU7WUFDWixPQUFPLEVBQUUsc0JBQXNCLE9BQU8sdUNBQXVDLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7U0FDL0csQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBQyxVQUFVLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBQyxDQUFBO0FBQ2pILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxLQUFLLFVBQVUsZUFBZSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTztJQUNsRCxnQ0FBZ0M7SUFDaEMsSUFBSSxLQUFLLENBQUE7SUFFVCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRW5ELElBQUksS0FBSyxJQUFJLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQTtJQUN0QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLEtBQUssR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNwRCxDQUFDO0lBRUQsTUFBTSxJQUFJLHFCQUFxQixDQUFDO1FBQzlCLEtBQUs7UUFDTCxJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLE9BQU87UUFDUCxVQUFVLEVBQUUsUUFBUTtRQUNwQixRQUFRLEVBQUUsRUFBRTtRQUNaLE9BQU8sRUFBRSwwQkFBMEIsUUFBUSxpQ0FBaUM7S0FDN0UsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQUMsU0FBUztJQUM1QyxNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUN2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVoQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFBO0lBQ3RDLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFckMsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLEVBQUU7SUFDekUsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFL0MsSUFBSSxPQUFPLElBQUksU0FBUztRQUFFLGdCQUFnQixDQUFDLDZGQUE2RixFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQ3hKLHFDQUFxQztJQUNyQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRXRDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xILGdCQUFnQixDQUFDLHVEQUF1RCxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQzFGLENBQUM7UUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtJQUNsRCxDQUFDO0lBQ0QsVUFBVSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUE7SUFDM0IsVUFBVSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUE7SUFDN0IsVUFBVSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFDckIsVUFBVSxDQUFDLElBQUksS0FBSyw4QkFBOEIsQ0FBQTtJQUVsRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsa0JBQWtCO0lBQ3pCLE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUMsQ0FBQTtBQUNqQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQUMsS0FBSztJQUMvQixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVE7UUFBRSxPQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQyxDQUFBO0lBQy9HLE1BQU0sS0FBSyxHQUFHLHNDQUFzQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFNUQsT0FBTztRQUNMLFFBQVEsRUFBRSxPQUFPLEtBQUssQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ2hFLE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ2xFLE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzNELE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQzVELENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQUs7SUFDMUIsT0FBTyxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQzFELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQTtBQUMvQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXpDLElBQUksT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLGdCQUFnQixDQUFDLHlHQUF5RyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ2pJLENBQUM7SUFDRCxpREFBaUQ7SUFDakQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVwQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksT0FBTztRQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUE7SUFFekQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ2hDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxLQUFLO0lBQy9CLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUV2RixJQUFJLENBQUM7UUFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTlDLElBQUksU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUk7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUMxRSw2Q0FBNkM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO1FBRWxCLEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pDLElBQUksT0FBTyxHQUFHLElBQUksUUFBUTtnQkFBRSxPQUFPLFNBQVMsQ0FBQTtZQUM1QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBRTlELElBQUksVUFBVSxJQUFJLFNBQVMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUM7Z0JBQy9FLENBQUMsVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksT0FBTyxVQUFVLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQztnQkFBRSxPQUFPLFNBQVMsQ0FBQTtZQUMzRixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUE7QUFDL0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLElBQUkscUJBQXFCLENBQUMsRUFBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO0FBQ3JGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU5RSxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Y29uc3RhbnRzIGFzIGZzQ29uc3RhbnRzfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQge2FjY2VzcywgcmVhbHBhdGgsIHN0YXR9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtpc0RlbnNlQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7ZXhjZWVkZWRPd25lZERlYWRsaW5lLCBleGVjdXRlRmlsZVdpdGhEZWFkbGluZX0gZnJvbSBcIi4vc3VicHJvY2Vzcy5qc1wiXG5pbXBvcnQge2lzU3VwcG9ydGVkVGltZW91dE1zLCBtYXhpbXVtVGltZW91dE1zfSBmcm9tIFwiLi90aW1lb3V0LmpzXCJcblxuY29uc3QgZGVmYXVsdFRpbWVvdXRNcyA9IDEwXzAwMFxuXG5leHBvcnQgY29uc3QgY2Fub25pY2FsVG9vbGNoYWlucyA9IGRlZXBGcmVlemUoe1xuICBkYXJ0OiBkZWZpbml0aW9uKFwiZGFydFwiLCBcIlNFTUFOVElGT0xEX0RBUlRcIiwgW1wiLS12ZXJzaW9uXCJdLFxuICAgIC9eRGFydCBTREsgdmVyc2lvbjogM1xcLjEzXFwuMyBcXChzdGFibGVcXCkgXFwoVHVlIFNlcCAxIDAxOjA3OjE3IDIwMjYgLTA3MDBcXCkgb24gXCJsaW51eF94NjRcIiQvdSksXG4gIHBocDogZGVmaW5pdGlvbihcInBocFwiLCBcIlNFTUFOVElGT0xEX1BIUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eUEhQIDhcXC4vdSksXG4gIHBocDgyOiBkZWZpbml0aW9uKFwicGhwXCIsIFwiU0VNQU5USUZPTERfUEhQXCIsIFtcIi0tdmVyc2lvblwiXSwgL15QSFAgKD86OFxcLig/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
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Android application target
|
|
2
|
+
|
|
3
|
+
Task 028 adds the target-only `android` application backend. It consumes a parsed semantic module or complete Task 010 program and returns an immutable `GeneratedArtifactSet`; it does not parse Android or Kotlin source, add Android nodes to semantic IR, discover source files, or expose a filesystem writer.
|
|
4
|
+
|
|
5
|
+
```js
|
|
6
|
+
const program = parseProgram({entryModule: "main", sources})
|
|
7
|
+
const project = generateProgramArtifactSet({
|
|
8
|
+
language: "android",
|
|
9
|
+
program,
|
|
10
|
+
role: "application"
|
|
11
|
+
})
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Every path is below fixed root `generated/android-app`. The set contains pinned settings/root/app Gradle Kotlin scripts, `gradle.properties`, one allowlisted manifest, mapped per-module semantic Kotlin, a checked scalar/output runtime, one `Activity`, one native XML `TextView`, label/theme resources, paired legacy full-backup and Android 12+ data-extraction exclusion resources, one JUnit unit test, a platform-only instrumentation test, and `semantifold-project.json`. There is no Gradle wrapper JAR or distribution, SDK, Maven archive, APK, key, cache, or binary tool in the returned project.
|
|
15
|
+
|
|
16
|
+
## Application contract
|
|
17
|
+
|
|
18
|
+
Configuration is a closed plain record. Unknown keys and public filesystem controls such as `outputDirectory`, `overwrite`, `sourcePath`, `sdkPath`, or `keystore` fail with `INVALID_APPLICATION_INPUT` or `INVALID_APPLICATION_CONFIGURATION` before source rendering.
|
|
19
|
+
|
|
20
|
+
Defaults are:
|
|
21
|
+
|
|
22
|
+
| Field | Default / accepted baseline |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `applicationId` | `dev.semantifold.generated` |
|
|
25
|
+
| `namespace` | application ID |
|
|
26
|
+
| `packageName` | namespace |
|
|
27
|
+
| `activityClassName` | `MainActivity` |
|
|
28
|
+
| `productName`, `displayName` | `Semantifold` |
|
|
29
|
+
| `minimumSdk`, `targetSdk`, `compileSdk` | `23`, `35`, `35` |
|
|
30
|
+
| `buildToolsVersion` | `35.0.0` |
|
|
31
|
+
| `versionCode`, `versionName` | `1`, `1.0.0` |
|
|
32
|
+
| `orientation`, `theme` | `unspecified`, `system` |
|
|
33
|
+
|
|
34
|
+
Application/package segments are lowercase Java/Kotlin identifiers and cannot be keywords. The activity is an ASCII upper-camel identifier and cannot shadow an unqualified symbol used by the generated Activity, unit test, or instrumentation scaffold. Labels are trimmed Unicode-scalar strings of at most 64 characters. SDK values are the qualified fixed matrix, version code is positive and Android-bounded, and version name is canonical. The permission allowlist is empty.
|
|
35
|
+
|
|
36
|
+
The manifest contains exactly one exported launcher activity and no permissions, services, receivers, providers, deep links, network/storage access, or background work. It keeps `android:allowBackup="false"`, points `android:fullBackupContent` to the owned `@xml/backup_rules` exclusions for API 23–30, and points `android:dataExtractionRules` to the owned `@xml/data_extraction_rules` cloud-backup/device-transfer exclusions for Android 12+. Both resources exclude every supported storage domain. The activity runs the semantic entry afresh and joins captured output with one LF between printed values. The sole native `TextView` has ID `semantifold_output` and is accessibility-important; its visible text is the accessibility-node text, so no redundant `contentDescription` is generated.
|
|
37
|
+
|
|
38
|
+
## Semantic and provenance boundary
|
|
39
|
+
|
|
40
|
+
The Android backend preflights the complete program using the independent Kotlin backend capability profile. It then emits application-owned namespaced Kotlin modules and threads one output sink through resolved calls. The sink is reset for every entry invocation. Kotlin identifiers, literals, operators, calls, functions, parameters, locals, and statements retain rich Task 015 mappings and Source Map v3 projections to all original source identities and filenames. Gradle, Android manifest, resource, activity, lifecycle, and test syntax remains synthetic or configuration-derived.
|
|
41
|
+
|
|
42
|
+
`SemantifoldAndroidProject` version 1 records exact normalized configuration, the ordered owned path set and hashes, excluded build/cache paths, input hashes, field-to-output ranges, semantic source/module/import/entry identities, synthetic scaffolding, and exact toolchain requirements. Caller resources and assets are detached before return. Binary inputs use full-content byte provenance.
|
|
43
|
+
|
|
44
|
+
Resources are opt-in closed records `{path, content, mediaType, sha256}`. Supported resource paths are `raw/<safe-name>` and PNG/WebP density drawables under `drawable-mdpi`, `drawable-hdpi`, `drawable-xhdpi`, `drawable-xxhdpi`, or `drawable-xxxhdpi`. Assets use safe portable relative paths below `app/src/main/assets`. Traversal, absolute/NUL/Unicode-ambiguous paths, unsupported qualifiers/types, checksum mismatches, generated-file conflicts, duplicate Android identifiers in one resource configuration, case-fold collisions, and file/directory-prefix collisions fail before any artifact set is returned.
|
|
45
|
+
|
|
46
|
+
Generation itself is byte-identical and has no filesystem state, so stale files cannot survive inside its returned ownership list. The repository-private acceptance helper writes only to a caller-created empty mode-0700 temporary directory, uses exclusive file creation, verifies every checksum, refuses symlink/non-empty roots, and is not exported or packed. It is not a durable materializer.
|
|
47
|
+
|
|
48
|
+
## Toolchain and offline acceptance
|
|
49
|
+
|
|
50
|
+
The qualified application lane is independent of the generic Kotlin/JVM compiler lane:
|
|
51
|
+
|
|
52
|
+
- Gradle `8.13`, distribution SHA-256 `20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78`
|
|
53
|
+
- Android Gradle Plugin `8.11.1`
|
|
54
|
+
- Kotlin Gradle plugin and command-line compiler `2.2.10`, compiler ZIP SHA-256 `302d1d8e671e5c3207e6ed62ff11fb555462a628e22a1158254dcaaf7e7394bc`
|
|
55
|
+
- Eclipse Temurin JDK `21.0.8+9`, archive SHA-256 `f2dc5418092c43003db8f9005c4a286e1c0104fea96ccdd49e8ebd037cac9219`
|
|
56
|
+
- command-line tools build `11076708`, archive SHA-256 `2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258`
|
|
57
|
+
- platform/target API `35`, Build Tools `35.0.0`
|
|
58
|
+
- emulator `35.6.11` build `13610412` and `system-images;android-35;google_apis;x86_64` revision `9`
|
|
59
|
+
|
|
60
|
+
API 35 and Build Tools 35.0.0 are owner-pinned acceptance boundaries rather than ambient latest-version choices. Generated lint keeps warnings as errors and aborts on findings, while disabling only `MissingApplicationIcon` for the deliberately icon-free baseline, `OldTargetApi` for the conflicting moving-latest-target recommendation, and `GradleDependency` for moving compile-SDK and Build-Tools version advice that conflicts with that pinned matrix.
|
|
61
|
+
|
|
62
|
+
Every Android SDK payload is a direct immutable official archive verified before extraction; no mutable package channel participates:
|
|
63
|
+
|
|
64
|
+
| SDK input | Exact archive | SHA-256 |
|
|
65
|
+
| --- | --- | --- |
|
|
66
|
+
| command-line tools | `commandlinetools-linux-11076708_latest.zip` | `2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258` |
|
|
67
|
+
| platform-tools 37.0.1 | `platform-tools_r37.0.1-linux.zip` | `d230f13842f60f782a8645f9c813f8f845bf36089ea7289f28c48f17979313f1` |
|
|
68
|
+
| Android Platform 35 revision 2 | `platform-35_r02.zip` | `0988cacad01b38a18a47bac14a0695f246bc76c1b06c0eeb8eb0dc825ab0c8e0` |
|
|
69
|
+
| Build Tools 35.0.0 | `build-tools_r35_linux.zip` | `bd3a4966912eb8b30ed0d00b0cda6b6543b949d5ffe00bea54c04c81e1561d88` |
|
|
70
|
+
| Emulator 35.6.11 build 13610412 | `emulator-linux_x64-13610412.zip` | `2fe2b56fe93ce75e1d478a40162131381d911c355efeaedb54dd1e0d0897a5cf` |
|
|
71
|
+
| Google APIs x86_64 API-35 revision 9 | `x86_64-35_r09.zip` | `c67b9ba0ff5bc0eb6d046871bfa228af14d4d47b02f0cdae94f048e511b7566e` |
|
|
72
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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,16 +4,18 @@ 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
|
|
|
17
|
+
The [Android application target](android.md) is a Kotlin/Android spoke on the same boundary. `src/backends/android.js` validates a complete Kotlin-supported semantic module or Task 010 program plus closed Android configuration/resource inputs before writer allocation, then emits mapped namespaced semantic Kotlin and synthetic Gradle/manifest/Activity/native-view/test artifacts under one fixed ownership root. Android lifecycle/UI/build syntax stays outside semantic IR, and generic Kotlin/JVM output is unchanged. Public generation remains in-memory; a repository-private create-only helper materializes only fresh mode-0700 acceptance directories. The actual build is offline, while TensorBuzz alone prepares official caches and runs two clean KVM-accelerated API-35 emulator boots.
|
|
18
|
+
|
|
17
19
|
`src/toolchains.js` resolves configured absolute overrides or one unambiguous canonical PATH executable, runs a bounded version command, and returns its exact real path and captured version. Alongside language compilers/runtimes, browser Wasm defines exact WABT 1.0.36 and Chrome/Chromium 152.0.7977.82 contracts through `SEMANTIFOLD_WASM_VALIDATE` and `SEMANTIFOLD_CHROMIUM`. `src/acceptance.js` validates all artifacts and ordered stages before filesystem mutation, materializes only safe generated paths in a unique temporary directory, invokes exact executable/argument arrays without a shell, fixes `LANG`, `LC_ALL`, and `TZ`, captures output, distinguishes discovery/version/launch/timeout/nonzero failures, records the precise failed stage, and removes the directory. The browser-specific acceptance owner additionally serves a materialized artifact directory on loopback under strict CSP and owns the headless browser process group. No runner performs tool installation or runtime download.
|
|
18
20
|
|
|
19
21
|
## Browser WebAssembly target
|
|
@@ -50,7 +52,7 @@ Frontend source capabilities and backend target capabilities are intentionally s
|
|
|
50
52
|
|
|
51
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.
|
|
52
54
|
|
|
53
|
-
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.
|
|
54
56
|
|
|
55
57
|
## Blocks, flow, and bindings
|
|
56
58
|
|
|
@@ -64,7 +66,7 @@ Task007 adds explicit `OptionalType`, presence/absence construction, simple-iden
|
|
|
64
66
|
|
|
65
67
|
## Provenance and generated mappings
|
|
66
68
|
|
|
67
|
-
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.
|
|
68
70
|
|
|
69
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).
|
|
70
72
|
|
|
@@ -87,3 +89,9 @@ Rust/Cargo discovery requires the exact qualified 1.98.1 commits and Linux x86-6
|
|
|
87
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.
|
|
88
90
|
|
|
89
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/ios.md
CHANGED
|
@@ -36,7 +36,7 @@ const artifactSet = generateProgramArtifactSet({
|
|
|
36
36
|
|
|
37
37
|
`generateArtifactSet` accepts the same application fields for one semantic module and normalizes it to one project module. Both routes validate the entire semantic graph before rendering. The source registry accepts provenance from every registered frontend language, including compatible Dart modules, while the supported semantics remain exactly the Tasks 001–004 Swift subset from Task 022: typed scalar values, typed locals/assignment, the closed scalar operators, nested statement blocks/conditionals, exact two-argument scalar-return functions, resolved calls, and deterministic text output. Task 010 owns project modules, source ownership, imports, exports, and dependency order. iOS adds no parser rule or semantic node for SwiftUI, application lifecycle, capture, configuration, resources, signing, or Apple APIs.
|
|
38
38
|
|
|
39
|
-
Program-shaped application dispatch is limited to program-capable application targets, currently
|
|
39
|
+
Program-shaped application dispatch is limited to program-capable application targets, currently `ios` and `android`. The separate Wasm application backend remains available through the single-module `generateArtifactSet` route and is rejected with `UNSUPPORTED_ROLE` when requested through `generateProgramArtifactSet`; a program object is never passed to that module backend.
|
|
40
40
|
|
|
41
41
|
Unsupported source or caller-supplied IR produces a located `SemantifoldDiagnostic` with `UNSUPPORTED_CAPABILITY` and target `ios`. The backend never embeds Ruby, invokes a Ruby runtime from the app, translates through JavaScript, emulates dynamic Ruby behavior, or discovers sources/packages.
|
|
42
42
|
|