semantifold 0.2.0 → 0.3.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.
Files changed (356) hide show
  1. package/README.md +37 -12
  2. package/build/index.js +2 -2
  3. package/build/src/acceptance.d.ts +10 -0
  4. package/build/src/acceptance.d.ts.map +1 -1
  5. package/build/src/acceptance.js +24 -5
  6. package/build/src/backends/c-runtime.d.ts +3 -0
  7. package/build/src/backends/c-runtime.d.ts.map +1 -0
  8. package/build/src/backends/c-runtime.js +151 -0
  9. package/build/src/backends/c-validation.d.ts +12 -0
  10. package/build/src/backends/c-validation.d.ts.map +1 -0
  11. package/build/src/backends/c-validation.js +85 -0
  12. package/build/src/backends/c.d.ts +31 -0
  13. package/build/src/backends/c.d.ts.map +1 -0
  14. package/build/src/backends/c.js +308 -0
  15. package/build/src/backends/cpp-runtime.d.ts +3 -0
  16. package/build/src/backends/cpp-runtime.d.ts.map +1 -0
  17. package/build/src/backends/cpp-runtime.js +99 -0
  18. package/build/src/backends/cpp-validation.d.ts +9 -0
  19. package/build/src/backends/cpp-validation.d.ts.map +1 -0
  20. package/build/src/backends/cpp-validation.js +74 -0
  21. package/build/src/backends/cpp.d.ts +16 -0
  22. package/build/src/backends/cpp.d.ts.map +1 -0
  23. package/build/src/backends/cpp.js +285 -0
  24. package/build/src/backends/csharp.d.ts +20 -0
  25. package/build/src/backends/csharp.d.ts.map +1 -0
  26. package/build/src/backends/csharp.js +259 -0
  27. package/build/src/backends/go.d.ts +20 -0
  28. package/build/src/backends/go.d.ts.map +1 -0
  29. package/build/src/backends/go.js +374 -0
  30. package/build/src/backends/identifiers.d.ts +12 -0
  31. package/build/src/backends/identifiers.d.ts.map +1 -1
  32. package/build/src/backends/identifiers.js +71 -2
  33. package/build/src/backends/index.d.ts.map +1 -1
  34. package/build/src/backends/index.js +9 -1
  35. package/build/src/backends/native-validation.d.ts +9 -0
  36. package/build/src/backends/native-validation.d.ts.map +1 -0
  37. package/build/src/backends/native-validation.js +59 -0
  38. package/build/src/backends/ordered-expressions.d.ts +74 -0
  39. package/build/src/backends/ordered-expressions.d.ts.map +1 -0
  40. package/build/src/backends/ordered-expressions.js +159 -0
  41. package/build/src/backends/scalars.d.ts.map +1 -1
  42. package/build/src/backends/scalars.js +7 -2
  43. package/build/src/backends/shared.d.ts.map +1 -1
  44. package/build/src/backends/shared.js +59 -14
  45. package/build/src/frontends/c-parser.d.ts +20 -0
  46. package/build/src/frontends/c-parser.d.ts.map +1 -0
  47. package/build/src/frontends/c-parser.js +14 -0
  48. package/build/src/frontends/c.d.ts +220 -0
  49. package/build/src/frontends/c.d.ts.map +1 -0
  50. package/build/src/frontends/c.js +750 -0
  51. package/build/src/frontends/cpp-parser.d.ts +11 -0
  52. package/build/src/frontends/cpp-parser.d.ts.map +1 -0
  53. package/build/src/frontends/cpp-parser.js +15 -0
  54. package/build/src/frontends/cpp.d.ts +227 -0
  55. package/build/src/frontends/cpp.d.ts.map +1 -0
  56. package/build/src/frontends/cpp.js +784 -0
  57. package/build/src/frontends/csharp.d.ts +14 -0
  58. package/build/src/frontends/csharp.d.ts.map +1 -0
  59. package/build/src/frontends/csharp.js +708 -0
  60. package/build/src/frontends/go.d.ts +15 -0
  61. package/build/src/frontends/go.d.ts.map +1 -0
  62. package/build/src/frontends/go.js +712 -0
  63. package/build/src/frontends/scalars.d.ts.map +1 -1
  64. package/build/src/frontends/scalars.js +16 -1
  65. package/build/src/language-registry.d.ts.map +1 -1
  66. package/build/src/language-registry.js +51 -2
  67. package/build/src/mapping.js +2 -2
  68. package/build/src/semantic/provenance.js +3 -3
  69. package/build/src/semantic/types.d.ts +4 -4
  70. package/build/src/semantic/types.d.ts.map +1 -1
  71. package/build/src/semantic/types.js +3 -3
  72. package/build/src/subprocess.d.ts +10 -1
  73. package/build/src/subprocess.d.ts.map +1 -1
  74. package/build/src/subprocess.js +29 -3
  75. package/build/src/toolchains.d.ts +24 -0
  76. package/build/src/toolchains.d.ts.map +1 -1
  77. package/build/src/toolchains.js +6 -2
  78. package/docs/architecture.md +20 -6
  79. package/docs/c.md +60 -0
  80. package/docs/cpp.md +61 -0
  81. package/docs/goals.md +4 -2
  82. package/docs/language-support.md +27 -8
  83. package/docs/parser-qualification.md +153 -4
  84. package/docs/plans/2026-09-05-standard-library-portability.md +46 -0
  85. package/docs/source-maps.md +11 -5
  86. package/docs/standard-library-portability.md +190 -0
  87. package/docs/testing.md +113 -4
  88. package/index.js +1 -1
  89. package/node_modules/node-addon-api/LICENSE.md +9 -0
  90. package/node_modules/node-addon-api/README.md +95 -0
  91. package/node_modules/node-addon-api/common.gypi +21 -0
  92. package/node_modules/node-addon-api/except.gypi +25 -0
  93. package/node_modules/node-addon-api/index.js +14 -0
  94. package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
  95. package/node_modules/node-addon-api/napi-inl.h +7250 -0
  96. package/node_modules/node-addon-api/napi.h +3463 -0
  97. package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
  98. package/node_modules/node-addon-api/node_api.gyp +9 -0
  99. package/node_modules/node-addon-api/noexcept.gypi +26 -0
  100. package/node_modules/node-addon-api/nothing.c +0 -0
  101. package/node_modules/node-addon-api/package-support.json +21 -0
  102. package/node_modules/node-addon-api/package.json +481 -0
  103. package/node_modules/node-addon-api/tools/README.md +73 -0
  104. package/node_modules/node-addon-api/tools/check-napi.js +99 -0
  105. package/node_modules/node-addon-api/tools/clang-format.js +71 -0
  106. package/node_modules/node-addon-api/tools/conversion.js +301 -0
  107. package/node_modules/node-gyp-build/LICENSE +21 -0
  108. package/node_modules/node-gyp-build/README.md +58 -0
  109. package/node_modules/node-gyp-build/SECURITY.md +5 -0
  110. package/node_modules/node-gyp-build/bin.js +84 -0
  111. package/node_modules/node-gyp-build/build-test.js +19 -0
  112. package/node_modules/node-gyp-build/index.js +6 -0
  113. package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
  114. package/node_modules/node-gyp-build/optional.js +7 -0
  115. package/node_modules/node-gyp-build/package.json +43 -0
  116. package/node_modules/semantifold-tree-sitter-legacy-internal/LICENSE +15 -0
  117. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +7 -0
  118. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/LICENSE +21 -0
  119. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/README.md +90 -0
  120. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/binding.gyp +79 -0
  121. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/index.js +895 -0
  122. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/package.json +62 -0
  123. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  124. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  125. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  126. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  127. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
  128. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/binding.cc +35 -0
  129. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
  130. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.h +22 -0
  131. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.cc +106 -0
  132. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.h +17 -0
  133. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.cc +70 -0
  134. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.h +19 -0
  135. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  136. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  137. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.cc +1056 -0
  138. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.h +30 -0
  139. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.cc +298 -0
  140. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.h +35 -0
  141. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.cc +383 -0
  142. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.h +39 -0
  143. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.cc +307 -0
  144. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.h +45 -0
  145. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  146. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  147. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
  148. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
  149. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  150. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  151. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
  152. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  153. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  154. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  155. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
  156. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  157. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  158. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
  159. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
  160. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  161. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
  162. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
  163. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
  164. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
  165. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
  166. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
  167. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
  168. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
  169. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  170. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  171. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
  172. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  173. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
  174. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
  175. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
  176. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  177. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
  178. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  179. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  180. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  181. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  182. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  183. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  184. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  185. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  186. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  187. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  188. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
  189. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
  190. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
  191. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
  192. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
  193. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  194. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/LICENSE +21 -0
  195. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/README.md +18 -0
  196. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/binding.gyp +29 -0
  197. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
  198. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding_test.js +9 -0
  199. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
  200. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.js +11 -0
  201. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/grammar.js +1470 -0
  202. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/package.json +60 -0
  203. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
  204. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
  205. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-arm64/tree-sitter-c.node +0 -0
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-arm64/tree-sitter-c.node +0 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/tags.scm +9 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/grammar.json +9735 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/node-types.json +4614 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/parser.c +119615 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/parser.h +266 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter-c.wasm +0 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter.json +43 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/LICENSE +21 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/README.md +22 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/binding.gyp +30 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding.cc +20 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding_test.js +9 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.d.ts +28 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.js +11 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/grammar.js +1436 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/package.json +61 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-arm64/tree-sitter-cpp.node +0 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-x64/tree-sitter-cpp.node +0 -0
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-arm64/tree-sitter-cpp.node +0 -0
  231. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-x64/tree-sitter-cpp.node +0 -0
  232. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-arm64/tree-sitter-cpp.node +0 -0
  233. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-x64/tree-sitter-cpp.node +0 -0
  234. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/highlights.scm +70 -0
  235. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/injections.scm +3 -0
  236. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/tags.scm +15 -0
  237. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/grammar.json +17084 -0
  238. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/node-types.json +7997 -0
  239. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/parser.c +530368 -0
  240. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/scanner.c +148 -0
  241. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/alloc.h +54 -0
  242. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/array.h +290 -0
  243. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/parser.h +266 -0
  244. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter-cpp.wasm +0 -0
  245. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter.json +55 -0
  246. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +22 -0
  247. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +152 -0
  248. package/node_modules/tree-sitter/LICENSE +21 -0
  249. package/node_modules/tree-sitter/README.md +128 -0
  250. package/node_modules/tree-sitter/binding.gyp +88 -0
  251. package/node_modules/tree-sitter/index.js +950 -0
  252. package/node_modules/tree-sitter/package.json +76 -0
  253. package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  254. package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  255. package/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
  256. package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  257. package/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
  258. package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  259. package/node_modules/tree-sitter/src/addon_data.h +47 -0
  260. package/node_modules/tree-sitter/src/binding.cc +35 -0
  261. package/node_modules/tree-sitter/src/conversions.cc +140 -0
  262. package/node_modules/tree-sitter/src/conversions.h +22 -0
  263. package/node_modules/tree-sitter/src/language.cc +105 -0
  264. package/node_modules/tree-sitter/src/language.h +17 -0
  265. package/node_modules/tree-sitter/src/logger.cc +70 -0
  266. package/node_modules/tree-sitter/src/logger.h +19 -0
  267. package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  268. package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  269. package/node_modules/tree-sitter/src/node.cc +1088 -0
  270. package/node_modules/tree-sitter/src/node.h +30 -0
  271. package/node_modules/tree-sitter/src/parser.cc +332 -0
  272. package/node_modules/tree-sitter/src/parser.h +35 -0
  273. package/node_modules/tree-sitter/src/query.cc +425 -0
  274. package/node_modules/tree-sitter/src/query.h +40 -0
  275. package/node_modules/tree-sitter/src/tree.cc +316 -0
  276. package/node_modules/tree-sitter/src/tree.h +45 -0
  277. package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  278. package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  279. package/node_modules/tree-sitter/tree-sitter.d.ts +1083 -0
  280. package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
  281. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  282. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  283. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
  284. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  285. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  286. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  287. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
  288. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  289. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  290. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
  291. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
  292. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  293. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
  294. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
  295. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
  296. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
  297. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2297 -0
  298. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
  299. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
  300. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +241 -0
  301. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4347 -0
  302. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  303. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  304. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +912 -0
  305. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  306. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
  307. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
  308. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
  309. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  310. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +716 -0
  311. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  312. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
  313. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  314. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  315. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  316. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  317. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  318. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  319. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  320. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  321. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  322. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
  323. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
  324. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +137 -0
  325. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
  326. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1937 -0
  327. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  328. package/package.json +21 -5
  329. package/src/acceptance.js +25 -4
  330. package/src/backends/c-runtime.js +151 -0
  331. package/src/backends/c-validation.js +83 -0
  332. package/src/backends/c.js +308 -0
  333. package/src/backends/cpp-runtime.js +99 -0
  334. package/src/backends/cpp-validation.js +70 -0
  335. package/src/backends/cpp.js +285 -0
  336. package/src/backends/csharp.js +270 -0
  337. package/src/backends/go.js +383 -0
  338. package/src/backends/identifiers.js +72 -1
  339. package/src/backends/index.js +7 -0
  340. package/src/backends/native-validation.js +64 -0
  341. package/src/backends/ordered-expressions.js +161 -0
  342. package/src/backends/scalars.js +7 -1
  343. package/src/backends/shared.js +56 -12
  344. package/src/frontends/c-parser.js +17 -0
  345. package/src/frontends/c.js +780 -0
  346. package/src/frontends/cpp-parser.js +18 -0
  347. package/src/frontends/cpp.js +816 -0
  348. package/src/frontends/csharp.js +759 -0
  349. package/src/frontends/go.js +770 -0
  350. package/src/frontends/scalars.js +15 -0
  351. package/src/language-registry.js +52 -1
  352. package/src/mapping.js +1 -1
  353. package/src/semantic/provenance.js +2 -2
  354. package/src/semantic/types.js +2 -2
  355. package/src/subprocess.js +31 -2
  356. package/src/toolchains.js +5 -1
@@ -0,0 +1,750 @@
1
+ // @ts-check
2
+ import { generateCProgram } from "../backends/c.js";
3
+ import { OrderedExpressionPlanner } from "../backends/ordered-expressions.js";
4
+ import { maximumCSourceLength } from "../backends/c-validation.js";
5
+ import { validateNativeGraph } from "../backends/native-validation.js";
6
+ import { isCIdentifier } from "../backends/identifiers.js";
7
+ import { parseCst } from "./c-parser.js";
8
+ import { missingType, parseFailure, SemantifoldDiagnostic, unsupportedSyntax } from "../diagnostic.js";
9
+ import { createCoordinateIndex, indexedPointAt } from "../semantic/location.js";
10
+ import { withAdaptedOperation } from "../semantic/operators.js";
11
+ import { withParserRanges } from "../semantic/provenance.js";
12
+ import { hasOnlyUnicodeScalars } from "../semantic/scalars.js";
13
+ import { validateParsedModule } from "../semantic/validate.js";
14
+ import { sourceScalarType } from "./scalars.js";
15
+ /** @typedef {import("./c-parser.js").CstNode} CstNode */
16
+ /** @typedef {import("../semantic/types.js").Expression} Expression */
17
+ /** @typedef {import("../semantic/types.js").Statement} Statement */
18
+ const binaryOperations = new Map([
19
+ ["+", "PhpAdd"], ["-", "Subtract"], ["*", "Multiply"], ["==", "JavaEqual"], ["!=", "JavaNotEqual"],
20
+ ["<", "LessThan"], ["<=", "LessThanOrEqual"], [">", "GreaterThan"], [">=", "GreaterThanOrEqual"],
21
+ ["&&", "And"], ["||", "Or"]
22
+ ]);
23
+ const helpers = new Map([
24
+ ["semantifold_integer_add", "PhpAdd"], ["semantifold_integer_subtract", "Subtract"],
25
+ ["semantifold_integer_multiply", "Multiply"], ["semantifold_string_concat", "StringConcat"],
26
+ ["semantifold_string_equal", "StringEqual"], ["semantifold_string_not_equal", "StringNotEqual"]
27
+ ]);
28
+ /** Strict field-and-token consumer for the private frozen C CST. */
29
+ export class CReader {
30
+ /**
31
+ * Owns source content and its coordinate index, never native parser handles.
32
+ * @param {string} filename - Original filename.
33
+ * @param {string} source - Exact original source.
34
+ */
35
+ constructor(filename, source) {
36
+ this.filename = filename;
37
+ this.source = source;
38
+ this.coordinates = createCoordinateIndex(source);
39
+ this.generated = false;
40
+ /** @type {Map<string, Expression> | undefined} */
41
+ this.temporaryExpressions = undefined;
42
+ /** @type {Set<string> | undefined} */
43
+ this.temporaryNames = undefined;
44
+ /** @type {Map<Statement, {node: CstNode, type: string}>} */
45
+ this.printTypes = new Map();
46
+ /** @type {Set<string>} */
47
+ this.declaredFunctions = new Set();
48
+ }
49
+ /**
50
+ * Locates one parser-owned range in UTF-16 coordinates.
51
+ * @param {CstNode} node - Parser node.
52
+ * @returns {import("../semantic/types.js").SourceLocation} Verified location.
53
+ */
54
+ location(node) {
55
+ return { filename: this.filename, start: indexedPointAt(this.coordinates, node.startIndex), end: indexedPointAt(this.coordinates, node.endIndex) };
56
+ }
57
+ /**
58
+ * Reads only the spelling of an already recognized parser node.
59
+ * @param {CstNode} node - Parser node.
60
+ * @returns {string} Exact token spelling.
61
+ */
62
+ text(node) {
63
+ return this.source.slice(node.startIndex, node.endIndex);
64
+ }
65
+ /**
66
+ * Rejects a located source-profile violation.
67
+ * @param {CstNode} node - Rejected node.
68
+ * @param {string} [detail] - Profile violation.
69
+ * @returns {never} Always throws.
70
+ */
71
+ fail(node, detail = node.type) {
72
+ unsupportedSyntax("c", detail, this.location(node));
73
+ }
74
+ /**
75
+ * Traverses all edges before interpreting any source meaning.
76
+ * @param {CstNode} node - Current parser node.
77
+ * @returns {void}
78
+ */
79
+ validateTree(node) {
80
+ for (const { node: child } of node.children)
81
+ this.validateTree(child);
82
+ if (node.error || node.missing || node.hasError) {
83
+ throw new SemantifoldDiagnostic({ code: "PARSE_ERROR", language: "c", location: this.location(node), message: `C parser recovery at '${node.type}'.` });
84
+ }
85
+ if (node.extra && node.type != "comment")
86
+ this.fail(node, "unexpected extra parser child");
87
+ if ((node.type == "comment" || node.type == "string_content") && /\?\?[=/'()!<>-]/u.test(this.text(node))) {
88
+ this.fail(node, "trigraph preprocessing");
89
+ }
90
+ if (node.type == "comment") {
91
+ const text = this.text(node);
92
+ // A terminal CR belongs to ordinary CRLF; content after a bare CR is not a C line comment.
93
+ if (/\\(?:\r\n?|\n)/u.test(text) || text.startsWith("//") && /\r(?!\n|$)/u.test(text)) {
94
+ this.fail(node, "preprocessing-sensitive comment");
95
+ }
96
+ }
97
+ }
98
+ /**
99
+ * Separates harmless comments after every child has been validated.
100
+ * @param {CstNode} node - Parent node.
101
+ * @returns {CstNode[]} Ordered structural children.
102
+ */
103
+ parts(node) {
104
+ return node.children.map(({ node: child }) => child).filter((child) => child.type != "comment");
105
+ }
106
+ /**
107
+ * Requires one exact field rather than searching descendants.
108
+ * @param {CstNode} node - Field owner.
109
+ * @param {string} name - Field name.
110
+ * @returns {CstNode} Sole field child.
111
+ */
112
+ field(node, name) {
113
+ const matches = node.children.filter(({ field }) => field == name);
114
+ if (matches.length != 1)
115
+ return this.fail(node, `expected one '${name}' field`);
116
+ return matches[0].node;
117
+ }
118
+ /**
119
+ * Consumes every structural child, including punctuation.
120
+ * @param {CstNode} node - Shape owner.
121
+ * @param {(CstNode | string)[]} expected - Ordered nodes or token kinds.
122
+ * @returns {void}
123
+ */
124
+ shape(node, expected) {
125
+ const children = this.parts(node);
126
+ if (children.length != expected.length || children.some((child, index) => typeof expected[index] == "string" ? child.type != expected[index] : child !== expected[index]))
127
+ this.fail(node, `${node.type} child shape`);
128
+ }
129
+ /**
130
+ * Requires an ordinary caller identifier outside the protected namespace.
131
+ * @param {CstNode} node - Identifier token.
132
+ * @returns {string} Accepted spelling.
133
+ */
134
+ identifier(node) {
135
+ const name = this.text(node);
136
+ if (node.type != "identifier" || !isCIdentifier(name))
137
+ this.fail(node, "reserved or unsupported identifier");
138
+ return name;
139
+ }
140
+ /**
141
+ * Converts only the canonical scalar type spellings.
142
+ * @param {CstNode} node - Type token.
143
+ * @returns {import("../semantic/types.js").TypeReference} Semantic scalar.
144
+ */
145
+ type(node) {
146
+ if (!["primitive_type", "type_identifier"].includes(node.type))
147
+ this.fail(node, "scalar type shape");
148
+ const type = sourceScalarType("c", this.text(node), this.location(node));
149
+ if (!type)
150
+ return this.fail(node, "unsupported scalar type");
151
+ return type;
152
+ }
153
+ /**
154
+ * Converts a direct function call's exact argument list.
155
+ * @param {CstNode} node - Call node.
156
+ * @returns {{name: CstNode, arguments: CstNode[]}} Parsed call shape.
157
+ */
158
+ call(node) {
159
+ if (node.type != "call_expression")
160
+ return this.fail(node, "direct call required");
161
+ const name = this.field(node, "function");
162
+ const list = this.field(node, "arguments");
163
+ this.shape(node, [name, list]);
164
+ if (name.type != "identifier" || list.type != "argument_list")
165
+ this.fail(node, "direct call shape");
166
+ const parts = this.parts(list);
167
+ const args = parts.slice(1, -1).filter((_part, index) => index % 2 == 0);
168
+ this.shape(list, ["(", ...args.flatMap((arg, index) => index == 0 ? [arg] : [",", arg]), ")"]);
169
+ return { arguments: args, name };
170
+ }
171
+ /**
172
+ * Decodes a parser-backed ordinary C string token as UTF-8 bytes.
173
+ * @param {CstNode} node - String literal.
174
+ * @returns {string} Complete Unicode scalar value.
175
+ */
176
+ string(node) {
177
+ if (node.type != "string_literal")
178
+ return this.fail(node, "ordinary string literal required");
179
+ const parts = this.parts(node);
180
+ if (parts[0]?.type != '"' || parts.at(-1)?.type != '"')
181
+ this.fail(node, "prefixed string literal");
182
+ const bytes = [];
183
+ for (let index = 1; index < parts.length - 1; index++) {
184
+ const child = parts[index];
185
+ const text = this.text(child);
186
+ if (child.type == "string_content") {
187
+ for (const byte of new TextEncoder().encode(text))
188
+ bytes.push(byte);
189
+ }
190
+ else if (child.type == "escape_sequence") {
191
+ const simple = new Map([["a", 7], ["b", 8], ["f", 12], ["n", 10], ["r", 13], ["t", 9], ["v", 11], ["\\", 92], ['"', 34], ["'", 39], ["?", 63]]);
192
+ const value = text.slice(1);
193
+ if (text[0] != "\\")
194
+ this.fail(child, "invalid escape");
195
+ if (simple.has(value))
196
+ bytes.push(/** @type {number} */ (simple.get(value)));
197
+ else if (/^[0-7]{1,3}$/u.test(value) || /^x[0-9a-fA-F]+$/u.test(value)) {
198
+ const next = parts[index + 1];
199
+ // C consumes every adjacent hex digit; the frozen grammar caps each escape node at four.
200
+ if (value.startsWith("x") && next.type == "string_content" && next.startIndex == child.endIndex && /^[0-9a-fA-F]/u.test(this.text(next))) {
201
+ this.fail(child, "hexadecimal escape split by parser boundary");
202
+ }
203
+ const number = Number.parseInt(value[0] == "x" ? value.slice(1) : value, value[0] == "x" ? 16 : 8);
204
+ if (number > 255)
205
+ this.fail(child, "escape outside byte range");
206
+ bytes.push(number);
207
+ }
208
+ else
209
+ this.fail(child, "unsupported escape");
210
+ }
211
+ else
212
+ this.fail(child, "string child");
213
+ }
214
+ try {
215
+ return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(new Uint8Array(bytes));
216
+ }
217
+ catch (error) {
218
+ if (error instanceof TypeError)
219
+ return this.fail(node, "invalid UTF-8 literal bytes");
220
+ throw error;
221
+ }
222
+ }
223
+ /**
224
+ * Converts supported expressions without assuming C argument evaluation order.
225
+ * @param {CstNode} node - Expression node.
226
+ * @param {boolean} [nested] - Whether a semantic call would have unspecified order.
227
+ * @returns {Expression} Semantic expression.
228
+ */
229
+ expression(node, nested = false) {
230
+ const location = this.location(node);
231
+ if (node.type == "parenthesized_expression") {
232
+ const parts = this.parts(node);
233
+ this.shape(node, ["(", parts[1], ")"]);
234
+ return this.expression(parts[1], nested);
235
+ }
236
+ if (node.type == "identifier") {
237
+ const temporary = this.temporaryExpressions?.get(this.text(node));
238
+ if (temporary) {
239
+ this.temporaryExpressions?.delete(this.text(node));
240
+ return temporary;
241
+ }
242
+ return withParserRanges({ kind: "IdentifierExpression", location, name: this.identifier(node) }, { name: location });
243
+ }
244
+ if (node.type == "true" || node.type == "false") {
245
+ if (this.text(node) != node.type)
246
+ this.fail(node, "noncanonical Boolean literal spelling");
247
+ return withParserRanges({ kind: "BooleanLiteral", location, value: node.type == "true" }, { literal: location });
248
+ }
249
+ if (node.type == "number_literal") {
250
+ const spelling = this.text(node);
251
+ if (!/^(?:0|[1-9][0-9]*)$/u.test(spelling) || !Number.isSafeInteger(Number(spelling)))
252
+ this.fail(node, "non-safe or noncanonical integer");
253
+ return withParserRanges({ kind: "IntegerLiteral", location, value: Number(spelling) }, { literal: location });
254
+ }
255
+ if (node.type == "binary_expression") {
256
+ const left = this.field(node, "left");
257
+ const right = this.field(node, "right");
258
+ const operator = this.field(node, "operator");
259
+ const intent = binaryOperations.get(operator.type);
260
+ this.shape(node, [left, operator, right]);
261
+ if (!intent)
262
+ return this.fail(operator, "unsupported binary operator");
263
+ return this.binary(node, intent, this.expression(left, true), this.expression(right, true), operator);
264
+ }
265
+ if (node.type == "unary_expression") {
266
+ const operator = this.field(node, "operator");
267
+ const argument = this.field(node, "argument");
268
+ this.shape(node, [operator, argument]);
269
+ if (!["-", "!"].includes(operator.type))
270
+ this.fail(operator, "unsupported unary operator");
271
+ return this.unary(node, operator.type == "-" ? "Negate" : "Not", this.expression(argument, true), operator);
272
+ }
273
+ if (node.type == "call_expression") {
274
+ const call = this.call(node);
275
+ const name = this.text(call.name);
276
+ if (name == "INT64_C" || name == "SEMANTIFOLD_STRING") {
277
+ if (call.arguments.length != 1)
278
+ this.fail(node, "literal macro arity");
279
+ if (name == "SEMANTIFOLD_STRING")
280
+ return withParserRanges({ kind: "StringLiteral", location, value: this.string(call.arguments[0]) }, { literal: location });
281
+ if (call.arguments[0].type != "number_literal")
282
+ this.fail(node, "integer literal macro operand");
283
+ return withParserRanges({ ...this.expression(call.arguments[0]), location }, { literal: location });
284
+ }
285
+ // Generated operations are separate temporary initializers; only literal macros may nest as calls.
286
+ if (nested)
287
+ this.fail(node, "caller call in unspecified-order expression");
288
+ if (name == "semantifold_integer_negate") {
289
+ if (call.arguments.length != 1)
290
+ this.fail(node, "negation helper arity");
291
+ return this.unary(node, "Negate", this.expression(call.arguments[0], true), call.name);
292
+ }
293
+ const intent = helpers.get(name);
294
+ if (intent) {
295
+ if (call.arguments.length != 2)
296
+ this.fail(node, "scalar helper arity");
297
+ return this.binary(node, intent, this.expression(call.arguments[0], true), this.expression(call.arguments[1], true), call.name);
298
+ }
299
+ if (call.arguments.length != 2)
300
+ this.fail(node, "semantic call arity");
301
+ const callee = this.identifier(call.name);
302
+ if (!this.generated && !this.declaredFunctions.has(callee))
303
+ this.fail(call.name, "implicit function declaration");
304
+ return withParserRanges({ kind: "CallExpression", location, callee,
305
+ arguments: call.arguments.map((argument) => this.expression(argument, true)) }, { callee: this.location(call.name) });
306
+ }
307
+ return this.fail(node);
308
+ }
309
+ /**
310
+ * Records parser intent before shared type resolution.
311
+ * @param {CstNode} node - Owning expression.
312
+ * @param {string} intent - Adapted operation.
313
+ * @param {Expression} left - Left operand.
314
+ * @param {Expression} right - Right operand.
315
+ * @param {CstNode} operator - Operator token.
316
+ * @returns {Expression} Pending binary expression.
317
+ */
318
+ binary(node, intent, left, right, operator) {
319
+ return /** @type {Expression} */ (withAdaptedOperation(withParserRanges({ kind: "BinaryExpression", location: this.location(node), left, right }, { operator: this.location(operator) }), /** @type {import("../semantic/operators.js").AdaptedOperation} */ (intent)));
320
+ }
321
+ /**
322
+ * Records parser intent for a unary operation.
323
+ * @param {CstNode} node - Owning expression.
324
+ * @param {"Negate" | "Not"} intent - Adapted operation.
325
+ * @param {Expression} operand - Operand.
326
+ * @param {CstNode} operator - Operator token.
327
+ * @returns {Expression} Pending unary expression.
328
+ */
329
+ unary(node, intent, operand, operator) {
330
+ return /** @type {Expression} */ (withAdaptedOperation(withParserRanges({ kind: "UnaryExpression", location: this.location(node), operand }, { operator: this.location(operator) }), intent));
331
+ }
332
+ /**
333
+ * Converts one initialized declaration or executable statement.
334
+ * @param {CstNode} node - Statement node.
335
+ * @returns {Statement} Semantic statement.
336
+ */
337
+ statement(node) {
338
+ const location = this.location(node);
339
+ if (node.type == "declaration") {
340
+ const typeNode = node.children.find(({ field }) => field == "type")?.node;
341
+ if (!typeNode)
342
+ return missingType("c", "local", location);
343
+ const declarator = this.field(node, "declarator");
344
+ const parts = this.parts(node);
345
+ const immutable = parts[0].type == "type_qualifier";
346
+ this.shape(node, [...(immutable ? [parts[0]] : []), typeNode, declarator, ";"]);
347
+ if (immutable && this.text(parts[0]) != "const")
348
+ this.fail(parts[0], "local qualifier");
349
+ if (declarator.type != "init_declarator")
350
+ this.fail(declarator, "initialized simple local required");
351
+ const name = this.field(declarator, "declarator");
352
+ const value = this.field(declarator, "value");
353
+ this.shape(declarator, [name, "=", value]);
354
+ return withParserRanges({ kind: "LocalDeclaration", location, name: this.identifier(name), type: this.type(typeNode), mutable: !immutable,
355
+ initializer: this.expression(value) }, { name: this.location(name), operator: this.location(this.parts(declarator)[1]) });
356
+ }
357
+ if (node.type == "return_statement") {
358
+ const parts = this.parts(node);
359
+ this.shape(node, ["return", parts[1], ";"]);
360
+ return { kind: "ReturnStatement", location, expression: this.expression(parts[1]) };
361
+ }
362
+ if (node.type == "if_statement") {
363
+ const condition = this.field(node, "condition");
364
+ const consequence = this.field(node, "consequence");
365
+ const alternative = node.children.find(({ field }) => field == "alternative")?.node;
366
+ this.shape(node, ["if", condition, consequence, ...(alternative ? [alternative] : [])]);
367
+ const statement = { kind: /** @type {const} */ ("IfStatement"), location, condition: this.expression(condition), consequent: this.block(consequence) };
368
+ if (!alternative)
369
+ return statement;
370
+ const branch = this.parts(alternative)[1];
371
+ this.shape(alternative, ["else", branch]);
372
+ return { ...statement, alternate: branch.type == "if_statement"
373
+ ? { kind: "Block", location: this.location(branch), statements: [this.statement(branch)] } : this.block(branch) };
374
+ }
375
+ if (node.type == "expression_statement") {
376
+ const expression = this.parts(node)[0];
377
+ this.shape(node, [expression, ";"]);
378
+ if (expression.type == "assignment_expression") {
379
+ const left = this.field(expression, "left");
380
+ const right = this.field(expression, "right");
381
+ const operator = this.field(expression, "operator");
382
+ this.shape(expression, [left, "=", right]);
383
+ const target = withParserRanges({ kind: /** @type {const} */ ("IdentifierExpression"), name: this.identifier(left), location: this.location(left) }, { name: this.location(left) });
384
+ return withParserRanges({ kind: "AssignmentStatement", location, target, expression: this.expression(right) }, { operator: this.location(operator) });
385
+ }
386
+ const call = this.call(expression);
387
+ if (!/^semantifold_print_(?:integer|boolean|string)$/u.test(this.text(call.name)) || call.arguments.length != 1)
388
+ this.fail(node, "print scaffold");
389
+ const value = this.expression(call.arguments[0]);
390
+ const statement = { kind: /** @type {const} */ ("PrintStatement"), location, expression: value };
391
+ this.printTypes.set(statement, { node: call.name, type: this.text(call.name).slice("semantifold_print_".length) });
392
+ return statement;
393
+ }
394
+ return this.fail(node);
395
+ }
396
+ /**
397
+ * Converts one lexical braced block in source order.
398
+ * @param {CstNode} node - Block node.
399
+ * @returns {import("../semantic/types.js").Block} Semantic block.
400
+ */
401
+ block(node) {
402
+ if (node.type != "compound_statement")
403
+ this.fail(node, "braced block required");
404
+ const parts = this.parts(node);
405
+ this.shape(node, ["{", ...parts.slice(1, -1), "}"]);
406
+ return { kind: "Block", location: this.location(node), statements: this.generated
407
+ ? this.generatedStatements(node.children.map(({ node: child }) => child).slice(1, -1))
408
+ : parts.slice(1, -1).map((child) => this.statement(child)) };
409
+ }
410
+ /**
411
+ * Converts one file-local semantic function.
412
+ * @param {CstNode} node - Function definition.
413
+ * @returns {import("../semantic/types.js").FunctionDeclaration} Semantic function.
414
+ */
415
+ function(node) {
416
+ const type = this.field(node, "type");
417
+ const declarator = this.field(node, "declarator");
418
+ const body = this.field(node, "body");
419
+ this.shape(node, ["storage_class_specifier", type, declarator, body]);
420
+ if (this.text(this.parts(node)[0]) != "static" || declarator.type != "function_declarator")
421
+ this.fail(node, "file-local function required");
422
+ const name = this.field(declarator, "declarator");
423
+ const parameters = this.field(declarator, "parameters");
424
+ this.shape(declarator, [name, parameters]);
425
+ const parts = this.parts(parameters);
426
+ this.shape(parameters, ["(", "parameter_declaration", ",", "parameter_declaration", ")"]);
427
+ const converted = [parts[1], parts[3]].map((parameter) => {
428
+ const typeNode = this.field(parameter, "type");
429
+ const nameNode = this.field(parameter, "declarator");
430
+ this.shape(parameter, [typeNode, nameNode]);
431
+ return withParserRanges({ kind: /** @type {const} */ ("Parameter"), location: this.location(parameter), name: this.identifier(nameNode), type: this.type(typeNode) }, { name: this.location(nameNode) });
432
+ });
433
+ this.declaredFunctions.add(this.identifier(name));
434
+ return withParserRanges({ kind: "FunctionDeclaration", location: this.location(node), name: this.identifier(name), parameters: converted,
435
+ returnType: this.type(type), body: this.block(body) }, { name: this.location(name) });
436
+ }
437
+ /**
438
+ * Removes only the exact main cleanup and status scaffolding.
439
+ * @param {CstNode} node - Entry definition.
440
+ * @returns {import("../semantic/types.js").EntryPoint} Semantic entry.
441
+ */
442
+ main(node) {
443
+ const type = this.field(node, "type");
444
+ const declarator = this.field(node, "declarator");
445
+ const body = this.field(node, "body");
446
+ this.shape(node, [type, declarator, body]);
447
+ const name = this.field(declarator, "declarator");
448
+ const parameters = this.field(declarator, "parameters");
449
+ this.shape(declarator, [name, parameters]);
450
+ if (this.text(type) != "int" || this.text(name) != "main")
451
+ this.fail(node, "main signature");
452
+ this.shape(parameters, ["(", "parameter_declaration", ")"]);
453
+ const voidParameter = this.parts(parameters)[1];
454
+ this.shape(voidParameter, ["primitive_type"]);
455
+ if (this.text(this.parts(voidParameter)[0]) != "void")
456
+ this.fail(voidParameter, "main parameters");
457
+ const parts = this.parts(body);
458
+ const cleanup = parts.at(-3);
459
+ const status = parts.at(-2);
460
+ if (!cleanup || !status || body.type != "compound_statement")
461
+ this.fail(body, "main cleanup");
462
+ this.shape(body, ["{", ...parts.slice(1, -1), "}"]);
463
+ this.shape(cleanup, ["call_expression", ";"]);
464
+ const call = this.call(this.parts(cleanup)[0]);
465
+ if (this.text(call.name) != "semantifold_cleanup" || call.arguments.length != 0)
466
+ this.fail(cleanup, "entry cleanup");
467
+ this.shape(status, ["return", "number_literal", ";"]);
468
+ if (this.text(this.parts(status)[1]) != "0")
469
+ this.fail(status, "entry status");
470
+ return { kind: "EntryPoint", location: this.location(node), body: { kind: "Block", location: this.location(body),
471
+ statements: this.generated ? this.generatedStatements(body.children.map(({ node: child }) => child).filter((child) => child.startIndex > body.startIndex && child.endIndex <= cleanup.startIndex))
472
+ : parts.slice(1, -3).map((child) => this.statement(child)) } };
473
+ }
474
+ /**
475
+ * Converts one complete translation unit after exhaustive recovery rejection.
476
+ * @param {CstNode} root - Frozen translation unit.
477
+ * @returns {import("../semantic/types.js").SemanticModule} Validated semantic module.
478
+ */
479
+ module(root) {
480
+ this.validateTree(root);
481
+ this.generated = root.children.some(({ node }) => node.type == "comment" && this.text(node) == "/* semantifold:program:c:v1 */");
482
+ if (!this.generated)
483
+ this.rejectScaffoldComments(root);
484
+ if (root.type != "translation_unit")
485
+ this.fail(root, "translation unit required");
486
+ const parts = this.parts(root);
487
+ const definitions = parts.slice(1).filter((node) => !this.generated || node.type != "declaration");
488
+ if (parts.length < 3 || parts[0].type != "preproc_include" || definitions.some((node) => node.type != "function_definition"))
489
+ this.fail(root, "translation unit members");
490
+ const include = parts[0];
491
+ const header = this.field(include, "path");
492
+ this.shape(include, ["#include", header]);
493
+ if (header.type != "string_literal" || this.text(header) != '"semantifold_runtime.h"')
494
+ this.fail(include, "support header include");
495
+ if (definitions.length < 2)
496
+ this.fail(root, "semantic function and main required");
497
+ const module = { kind: /** @type {const} */ ("Module"), location: this.location(root), functions: definitions.slice(0, -1).map((node) => this.function(node)),
498
+ entryPoint: this.main(definitions[definitions.length - 1]) };
499
+ if (this.generated)
500
+ validateNativeGraph(module);
501
+ const validated = validateParsedModule(module, "c");
502
+ this.validatePrintTypes(validated);
503
+ if (this.generated) {
504
+ const canonical = generateCProgram({ module: validated }).artifacts[0].content;
505
+ if (typeof canonical != "string")
506
+ throw new Error("C backend returned a nontext entry artifact.");
507
+ this.compareTree(root, parseCst(canonical).root, new CReader(this.filename, canonical));
508
+ }
509
+ return validated;
510
+ }
511
+ /**
512
+ * Checks native print helper selection after semantic scalar resolution.
513
+ * @param {import("../semantic/types.js").SemanticModule} module - Resolved module.
514
+ * @returns {void}
515
+ */
516
+ validatePrintTypes(module) {
517
+ const planner = new OrderedExpressionPlanner(module);
518
+ /**
519
+ * Checks one lexical block with its visible scalar bindings.
520
+ * @param {import("../semantic/types.js").Block} block - Semantic block.
521
+ * @param {Map<string, import("../semantic/types.js").SemanticTypeName>} inherited - Visible bindings.
522
+ * @returns {void}
523
+ */
524
+ const visit = (block, inherited) => {
525
+ const bindings = new Map(inherited);
526
+ for (const statement of block.statements) {
527
+ if (statement.kind == "LocalDeclaration")
528
+ bindings.set(statement.name, statement.type.name);
529
+ if (statement.kind == "PrintStatement") {
530
+ const expected = this.printTypes.get(statement);
531
+ if (!expected)
532
+ throw new Error("C print statement lost its parser helper identity.");
533
+ if (planner.type(statement.expression, bindings) != expected.type)
534
+ this.fail(expected.node, "print helper scalar mismatch");
535
+ }
536
+ if (statement.kind == "IfStatement") {
537
+ visit(statement.consequent, bindings);
538
+ if (statement.alternate)
539
+ visit(statement.alternate, bindings);
540
+ }
541
+ }
542
+ };
543
+ for (const declaration of module.functions)
544
+ visit(declaration.body, new Map(declaration.parameters.map((parameter) => [parameter.name, parameter.type.name])));
545
+ visit(module.entryPoint.body, new Map());
546
+ }
547
+ /**
548
+ * Rejects profile-looking comments outside a complete canonical generated program.
549
+ * @param {CstNode} node - Current node.
550
+ * @returns {void}
551
+ */
552
+ rejectScaffoldComments(node) {
553
+ if (node.type == "comment" && /semantifold:|@semantifold/u.test(this.text(node)))
554
+ this.fail(node, "unrecognized scaffold comment");
555
+ for (const { node: child } of node.children)
556
+ this.rejectScaffoldComments(child);
557
+ }
558
+ /**
559
+ * Retains every scaffold comment and structural edge, ignoring only ordinary comments.
560
+ * @param {CstNode} node - CST parent.
561
+ * @returns {CstNode[]} Complete significant child list.
562
+ */
563
+ significant(node) {
564
+ return node.children.map(({ node: child }) => child).filter((child) => child.type != "comment" || /semantifold:|@semantifold/u.test(this.text(child)));
565
+ }
566
+ /**
567
+ * Verifies every token, field, type, use, ordering edge and consumer against the canonical plan.
568
+ * This checks the original CST; it never recovers meaning from generated source text.
569
+ * @param {CstNode} actual - Original tree node.
570
+ * @param {CstNode} expected - Canonical tree node for the reconstructed semantics.
571
+ * @param {CReader} canonical - Canonical token reader.
572
+ * @returns {void}
573
+ */
574
+ compareTree(actual, expected, canonical) {
575
+ if (actual.type != expected.type || actual.named != expected.named || actual.extra != expected.extra)
576
+ this.fail(actual, "generated scaffold node shape");
577
+ const left = this.significant(actual);
578
+ const right = canonical.significant(expected);
579
+ if (left.length != right.length)
580
+ this.fail(actual, "generated scaffold child count");
581
+ if (!left.length && this.text(actual) != canonical.text(expected))
582
+ this.fail(actual, "generated scaffold token, type, order or consumer");
583
+ left.forEach((child, index) => {
584
+ if (actual.children.find((edge) => edge.node === child)?.field != expected.children.find((edge) => edge.node === right[index])?.field)
585
+ this.fail(child, "generated scaffold field");
586
+ this.compareTree(child, right[index], canonical);
587
+ });
588
+ }
589
+ /**
590
+ * Recognizes the shape of an inert generated unused-binding cast; canonical comparison checks its exact target and placement.
591
+ * @param {CstNode} node - Candidate statement.
592
+ * @returns {boolean} Whether this is a discard-shaped candidate.
593
+ */
594
+ discard(node) {
595
+ return node.type == "expression_statement" && this.parts(node)[0]?.type == "cast_expression";
596
+ }
597
+ /**
598
+ * Reconstructs paired statement regions before mandatory whole-CST canonical verification.
599
+ * @param {CstNode[]} children - Ordered block children without braces or main cleanup.
600
+ * @returns {Statement[]} Candidate semantic statements.
601
+ */
602
+ generatedStatements(children) {
603
+ const nodes = children.filter((node) => node.type != "comment" || /semantifold:|@semantifold/u.test(this.text(node)));
604
+ /** @type {Statement[]} */
605
+ const statements = [];
606
+ let cursor = 0;
607
+ while (cursor < nodes.length && this.discard(nodes[cursor]))
608
+ cursor++;
609
+ while (cursor < nodes.length) {
610
+ const begin = nodes[cursor++];
611
+ const match = begin.type == "comment" && /^\/\* semantifold:ordered-expression:c:v1 begin ([0-9]{6}) ([0-9a-f]{64}) \*\/$/u.exec(this.text(begin));
612
+ if (!match)
613
+ this.fail(begin, "complete ordered statement region required");
614
+ const outer = this.temporaryExpressions;
615
+ const outerNames = this.temporaryNames;
616
+ this.temporaryExpressions = new Map();
617
+ this.temporaryNames = new Set();
618
+ while (cursor < nodes.length && this.temporaryDeclaration(nodes[cursor]))
619
+ cursor = this.readTemporary(nodes, cursor);
620
+ const consumer = nodes[cursor++];
621
+ if (!consumer)
622
+ this.fail(begin, "missing ordered consumer");
623
+ const statement = this.statement(consumer);
624
+ if (this.temporaryExpressions.size != 0)
625
+ this.fail(consumer, "unconsumed ordered temporary");
626
+ if (statement.kind == "LocalDeclaration" && nodes[cursor] && this.discard(nodes[cursor]))
627
+ cursor++;
628
+ const end = nodes[cursor++];
629
+ if (!end || end.type != "comment" || this.text(end) != `/* semantifold:ordered-expression:c:v1 end ${match[1]} ${match[2]} */`)
630
+ this.fail(end ?? begin, "ordered marker pair");
631
+ this.temporaryExpressions = outer;
632
+ this.temporaryNames = outerNames;
633
+ statements.push(statement);
634
+ }
635
+ return statements;
636
+ }
637
+ /**
638
+ * Identifies only a declaration at the current region level, without descendant searching.
639
+ * @param {CstNode} node - Candidate node.
640
+ * @returns {boolean} Whether the direct initialized name uses the reserved prefix.
641
+ */
642
+ temporaryDeclaration(node) {
643
+ if (node.type != "declaration")
644
+ return false;
645
+ const declarator = node.children.find(({ field }) => field == "declarator")?.node;
646
+ const name = declarator?.children.find(({ field }) => field == "declarator")?.node;
647
+ return name?.type == "identifier" && this.text(name).startsWith("semantifold_ordered_");
648
+ }
649
+ /**
650
+ * Expands one candidate temporary, including its conditional RHS, retaining original operation tokens.
651
+ * @param {CstNode[]} nodes - Current lexical sequence.
652
+ * @param {number} cursor - Declaration position.
653
+ * @returns {number} Next unconsumed position.
654
+ */
655
+ readTemporary(nodes, cursor) {
656
+ const node = nodes[cursor++];
657
+ const declarator = this.field(node, "declarator");
658
+ const nameNode = this.field(declarator, "declarator");
659
+ const name = this.text(nameNode);
660
+ const type = this.field(node, "type");
661
+ const value = this.field(declarator, "value");
662
+ this.shape(node, [type, declarator, ";"]);
663
+ this.shape(declarator, [nameNode, "=", value]);
664
+ this.type(type);
665
+ if (!/^semantifold_ordered_[0-9]{6}$/u.test(name) || this.temporaryNames?.has(name))
666
+ this.fail(nameNode, "ordered temporary declaration");
667
+ this.temporaryNames?.add(name);
668
+ let expression = this.expression(value);
669
+ const branch = nodes[cursor];
670
+ if (branch?.type == "if_statement" && ["identifier", "true", "false"].includes(value.type)) {
671
+ const condition = this.field(branch, "condition");
672
+ const body = this.field(branch, "consequence");
673
+ this.shape(branch, ["if", condition, body]);
674
+ this.shape(condition, ["(", this.parts(condition)[1], ")"]);
675
+ const test = this.parts(condition)[1];
676
+ const isOr = test.type == "unary_expression";
677
+ const target = isOr ? this.field(test, "argument") : test;
678
+ if (target.type != "identifier" || this.text(target) != name)
679
+ this.fail(target, "short-circuit temporary test");
680
+ if (isOr)
681
+ this.shape(test, ["!", target]);
682
+ if (body.type != "compound_statement")
683
+ this.fail(body, "short-circuit block");
684
+ const inside = this.significant(body).slice(1, -1);
685
+ let offset = 0;
686
+ while (offset < inside.length && this.temporaryDeclaration(inside[offset]))
687
+ offset = this.readTemporary(inside, offset);
688
+ if (offset != inside.length - 1)
689
+ this.fail(body, "short-circuit final write");
690
+ const assignment = inside[offset];
691
+ this.shape(assignment, ["assignment_expression", ";"]);
692
+ const assigned = this.parts(assignment)[0];
693
+ const left = this.field(assigned, "left");
694
+ const right = this.field(assigned, "right");
695
+ this.shape(assigned, [left, "=", right]);
696
+ if (left.type != "identifier" || this.text(left) != name)
697
+ this.fail(left, "short-circuit result write");
698
+ this.shape(right, ["(", "binary_expression", ")"]);
699
+ const binary = this.parts(right)[1];
700
+ const repeated = this.field(binary, "left");
701
+ const operand = this.field(binary, "right");
702
+ const operator = this.field(binary, "operator");
703
+ this.shape(binary, [repeated, isOr ? "||" : "&&", operand]);
704
+ if (repeated.type != "identifier" || this.text(repeated) != name)
705
+ this.fail(repeated, "short-circuit consumed value");
706
+ expression = this.binary(node, isOr ? "Or" : "And", expression, this.expression(operand), operator);
707
+ cursor++;
708
+ }
709
+ this.temporaryExpressions?.set(name, expression);
710
+ return cursor;
711
+ }
712
+ }
713
+ /**
714
+ * Parses only the frozen legacy CST, with no source-text recovery path.
715
+ * @param {{filename: string, source: string}} input - Exact caller source.
716
+ * @returns {import("../semantic/types.js").SemanticModule} Parsed C semantics.
717
+ */
718
+ export function parseC({ filename, source }) {
719
+ if (!hasOnlyUnicodeScalars(source)) {
720
+ const coordinates = createCoordinateIndex(source);
721
+ const offset = source.search(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u);
722
+ throw new SemantifoldDiagnostic({ code: "PARSE_ERROR", language: "c", message: "C source contains a lone UTF-16 surrogate.",
723
+ location: { filename, start: indexedPointAt(coordinates, offset), end: indexedPointAt(coordinates, offset + 1) } });
724
+ }
725
+ if (source.length > maximumCSourceLength) {
726
+ const coordinates = createCoordinateIndex(source);
727
+ return unsupportedSyntax("c", "source exceeds the frozen C parser's 32767 UTF-16 input limit", {
728
+ filename, start: indexedPointAt(coordinates, 0), end: indexedPointAt(coordinates, source.length)
729
+ });
730
+ }
731
+ let snapshot;
732
+ try {
733
+ snapshot = parseCst(source);
734
+ }
735
+ catch (error) {
736
+ return parseFailure("c", error);
737
+ }
738
+ const reader = new CReader(filename, source);
739
+ try {
740
+ return reader.module(snapshot.root);
741
+ }
742
+ catch (error) {
743
+ if (reader.generated && error instanceof SemantifoldDiagnostic && error.language == "c" &&
744
+ error.code != "PARSE_ERROR" && error.code != "UNSUPPORTED_SYNTAX") {
745
+ return unsupportedSyntax("c", `invalid generated ordered scaffold: ${error.code}`, error.location ?? reader.location(snapshot.root));
746
+ }
747
+ throw error;
748
+ }
749
+ }
750
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udGVuZHMvYy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDakQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sb0NBQW9DLENBQUE7QUFDM0UsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDaEUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sa0NBQWtDLENBQUE7QUFDcEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQ3hELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFDdEMsT0FBTyxFQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUNwRyxPQUFPLEVBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDN0UsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDN0QsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFDMUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDNUQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDNUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBRTdDLHlEQUF5RDtBQUN6RCxzRUFBc0U7QUFDdEUsb0VBQW9FO0FBRXBFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0IsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxD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QUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLENBQUMsQ0FBQTtZQUMxSSxPQUFPLGdCQUFnQixDQUFDLEVBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFDLEVBQUUsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUMzRyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDckMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7WUFDN0MsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUVsRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUN6QyxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLDZCQUE2QixDQUFDLENBQUE7WUFDdEUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFD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Q0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBRTVDLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksS0FBSyxZQUFZLHFCQUFxQixJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksR0FBRztZQUNyRixLQUFLLENBQUMsSUFBSSxJQUFJLGFBQWEsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDcEUsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsdUNBQXVDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDdEksQ0FBQztRQUNELE1BQU0sS0FBSyxDQUFBO0lBQ2IsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtnZW5lcmF0ZUNQcm9ncmFtfSBmcm9tIFwiLi4vYmFja2VuZHMvYy5qc1wiXG5pbXBvcnQge09yZGVyZWRFeHByZXNzaW9uUGxhbm5lcn0gZnJvbSBcIi4uL2JhY2tlbmRzL29yZGVyZWQtZXhwcmVzc2lvbnMuanNcIlxuaW1wb3J0IHttYXhpbXVtQ1NvdXJjZUxlbmd0aH0gZnJvbSBcIi4uL2JhY2tlbmRzL2MtdmFsaWRhdGlvbi5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlTmF0aXZlR3JhcGh9IGZyb20gXCIuLi9iYWNrZW5kcy9uYXRpdmUtdmFsaWRhdGlvbi5qc1wiXG5pbXBvcnQge2lzQ0lkZW50aWZpZXJ9IGZyb20gXCIuLi9iYWNrZW5kcy9pZGVudGlmaWVycy5qc1wiXG5pbXBvcnQge3BhcnNlQ3N0fSBmcm9tIFwiLi9jLXBhcnNlci5qc1wiXG5pbXBvcnQge21pc3NpbmdUeXBlLCBwYXJzZUZhaWx1cmUsIFNlbWFudGlmb2xkRGlhZ25vc3RpYywgdW5zdXBwb3J0ZWRTeW50YXh9IGZyb20gXCIuLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7Y3JlYXRlQ29vcmRpbmF0ZUluZGV4LCBpbmRleGVkUG9pbnRBdH0gZnJvbSBcIi4uL3NlbWFudGljL2xvY2F0aW9uLmpzXCJcbmltcG9ydCB7d2l0aEFkYXB0ZWRPcGVyYXRpb259IGZyb20gXCIuLi9zZW1hbnRpYy9vcGVyYXRvcnMuanNcIlxuaW1wb3J0IHt3aXRoUGFyc2VyUmFuZ2VzfSBmcm9tIFwiLi4vc2VtYW50aWMvcHJvdmVuYW5jZS5qc1wiXG5pbXBvcnQge2hhc09ubHlVbmljb2RlU2NhbGFyc30gZnJvbSBcIi4uL3NlbWFudGljL3NjYWxhcnMuanNcIlxuaW1wb3J0IHt2YWxpZGF0ZVBhcnNlZE1vZHVsZX0gZnJvbSBcIi4uL3NlbWFudGljL3ZhbGlkYXRlLmpzXCJcbmltcG9ydCB7c291cmNlU2NhbGFyVHlwZX0gZnJvbSBcIi4vc2NhbGFycy5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9jLXBhcnNlci5qc1wiKS5Dc3ROb2RlfSBDc3ROb2RlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IEV4cHJlc3Npb24gKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RhdGVtZW50fSBTdGF0ZW1lbnQgKi9cblxuY29uc3QgYmluYXJ5T3BlcmF0aW9ucyA9IG5ldyBNYXAoW1xuICBbXCIrXCIsIFwiUGhwQWRkXCJdLCBbXCItXCIsIFwiU3VidHJhY3RcIl0sIFtcIipcIiwgXCJNdWx0aXBseVwiXSwgW1wiPT1cIiwgXCJKYXZhRXF1YWxcIl0sIFtcIiE9XCIsIFwiSmF2YU5vdEVxdWFsXCJdLFxuICBbXCI8XCIsIFwiTGVzc1RoYW5cIl0sIFtcIjw9XCIsIFwiTGVzc1RoYW5PckVxdWFsXCJdLCBbXCI+XCIsIFwiR3JlYXRlclRoYW5cIl0sIFtcIj49XCIsIFwiR3JlYXRlclRoYW5PckVxdWFsXCJdLFxuICBbXCImJlwiLCBcIkFuZFwiXSwgW1wifHxcIiwgXCJPclwiXVxuXSlcbmNvbnN0IGhlbHBlcnMgPSBuZXcgTWFwKFtcbiAgW1wic2VtYW50aWZvbGRfaW50ZWdlcl9hZGRcIiwgXCJQaHBBZGRcIl0sIFtcInNlbWFudGlmb2xkX2ludGVnZXJfc3VidHJhY3RcIiwgXCJTdWJ0cmFjdFwiXSxcbiAgW1wic2VtYW50aWZvbGRfaW50ZWdlcl9tdWx0aXBseVwiLCBcIk11bHRpcGx5XCJdLCBbXCJzZW1hbnRpZm9sZF9zdHJpbmdfY29uY2F0XCIsIFwiU3RyaW5nQ29uY2F0XCJdLFxuICBbXCJzZW1hbnRpZm9sZF9zdHJpbmdfZXF1YWxcIiwgXCJTdHJpbmdFcXVhbFwiXSwgW1wic2VtYW50aWZvbGRfc3RyaW5nX25vdF9lcXVhbFwiLCBcIlN0cmluZ05vdEVxdWFsXCJdXG5dKVxuXG4vKiogU3RyaWN0IGZpZWxkLWFuZC10b2tlbiBjb25zdW1lciBmb3IgdGhlIHByaXZhdGUgZnJvemVuIEMgQ1NULiAqL1xuZXhwb3J0IGNsYXNzIENSZWFkZXIge1xuICAvKipcbiAgICogT3ducyBzb3VyY2UgY29udGVudCBhbmQgaXRzIGNvb3JkaW5hdGUgaW5kZXgsIG5ldmVyIG5hdGl2ZSBwYXJzZXIgaGFuZGxlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYWwgZmlsZW5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBFeGFjdCBvcmlnaW5hbCBzb3VyY2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmaWxlbmFtZSwgc291cmNlKSB7XG4gICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2VcbiAgICB0aGlzLmNvb3JkaW5hdGVzID0gY3JlYXRlQ29vcmRpbmF0ZUluZGV4KHNvdXJjZSlcbiAgICB0aGlzLmdlbmVyYXRlZCA9IGZhbHNlXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBFeHByZXNzaW9uPiB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLnRlbXBvcmFyeUV4cHJlc3Npb25zID0gdW5kZWZpbmVkXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLnRlbXBvcmFyeU5hbWVzID0gdW5kZWZpbmVkXG4gICAgLyoqIEB0eXBlIHtNYXA8U3RhdGVtZW50LCB7bm9kZTogQ3N0Tm9kZSwgdHlwZTogc3RyaW5nfT59ICovXG4gICAgdGhpcy5wcmludFR5cGVzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICB0aGlzLmRlY2xhcmVkRnVuY3Rpb25zID0gbmV3IFNldCgpXG4gIH1cblxuICAvKipcbiAgICogTG9jYXRlcyBvbmUgcGFyc2VyLW93bmVkIHJhbmdlIGluIFVURi0xNiBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gUGFyc2VyIG5vZGUuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gVmVyaWZpZWQgbG9jYXRpb24uXG4gICAqL1xuICBsb2NhdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIHtmaWxlbmFtZTogdGhpcy5maWxlbmFtZSwgc3RhcnQ6IGluZGV4ZWRQb2ludEF0KHRoaXMuY29vcmRpbmF0ZXMsIG5vZGUuc3RhcnRJbmRleCksIGVuZDogaW5kZXhlZFBvaW50QXQodGhpcy5jb29yZGluYXRlcywgbm9kZS5lbmRJbmRleCl9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgb25seSB0aGUgc3BlbGxpbmcgb2YgYW4gYWxyZWFkeSByZWNvZ25pemVkIHBhcnNlciBub2RlLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBQYXJzZXIgbm9kZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gRXhhY3QgdG9rZW4gc3BlbGxpbmcuXG4gICAqL1xuICB0ZXh0KG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc2xpY2Uobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlamVjdHMgYSBsb2NhdGVkIHNvdXJjZS1wcm9maWxlIHZpb2xhdGlvbi5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gUmVqZWN0ZWQgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXRhaWxdIC0gUHJvZmlsZSB2aW9sYXRpb24uXG4gICAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAgICovXG4gIGZhaWwobm9kZSwgZGV0YWlsID0gbm9kZS50eXBlKSB7XG4gICAgdW5zdXBwb3J0ZWRTeW50YXgoXCJjXCIsIGRldGFpbCwgdGhpcy5sb2NhdGlvbihub2RlKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZXMgYWxsIGVkZ2VzIGJlZm9yZSBpbnRlcnByZXRpbmcgYW55IHNvdXJjZSBtZWFuaW5nLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBDdXJyZW50IHBhcnNlciBub2RlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHZhbGlkYXRlVHJlZShub2RlKSB7XG4gICAgZm9yIChjb25zdCB7bm9kZTogY2hpbGR9IG9mIG5vZGUuY2hpbGRyZW4pIHRoaXMudmFsaWRhdGVUcmVlKGNoaWxkKVxuICAgIGlmIChub2RlLmVycm9yIHx8IG5vZGUubWlzc2luZyB8fCBub2RlLmhhc0Vycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIlBBUlNFX0VSUk9SXCIsIGxhbmd1YWdlOiBcImNcIiwgbG9jYXRpb246IHRoaXMubG9jYXRpb24obm9kZSksIG1lc3NhZ2U6IGBDIHBhcnNlciByZWNvdmVyeSBhdCAnJHtub2RlLnR5cGV9Jy5gfSlcbiAgICB9XG4gICAgaWYgKG5vZGUuZXh0cmEgJiYgbm9kZS50eXBlICE9IFwiY29tbWVudFwiKSB0aGlzLmZhaWwobm9kZSwgXCJ1bmV4cGVjdGVkIGV4dHJhIHBhcnNlciBjaGlsZFwiKVxuICAgIGlmICgobm9kZS50eXBlID09IFwiY29tbWVudFwiIHx8IG5vZGUudHlwZSA9PSBcInN0cmluZ19jb250ZW50XCIpICYmIC9cXD9cXD9bPS8nKCkhPD4tXS91LnRlc3QodGhpcy50ZXh0KG5vZGUpKSkge1xuICAgICAgdGhpcy5mYWlsKG5vZGUsIFwidHJpZ3JhcGggcHJlcHJvY2Vzc2luZ1wiKVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwiY29tbWVudFwiKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0KG5vZGUpXG5cbiAgICAgIC8vIEEgdGVybWluYWwgQ1IgYmVsb25ncyB0byBvcmRpbmFyeSBDUkxGOyBjb250ZW50IGFmdGVyIGEgYmFyZSBDUiBpcyBub3QgYSBDIGxpbmUgY29tbWVudC5cbiAgICAgIGlmICgvXFxcXCg/Olxcclxcbj98XFxuKS91LnRlc3QodGV4dCkgfHwgdGV4dC5zdGFydHNXaXRoKFwiLy9cIikgJiYgL1xccig/IVxcbnwkKS91LnRlc3QodGV4dCkpIHtcbiAgICAgICAgdGhpcy5mYWlsKG5vZGUsIFwicHJlcHJvY2Vzc2luZy1zZW5zaXRpdmUgY29tbWVudFwiKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXBhcmF0ZXMgaGFybWxlc3MgY29tbWVudHMgYWZ0ZXIgZXZlcnkgY2hpbGQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBQYXJlbnQgbm9kZS5cbiAgICogQHJldHVybnMge0NzdE5vZGVbXX0gT3JkZXJlZCBzdHJ1Y3R1cmFsIGNoaWxkcmVuLlxuICAgKi9cbiAgcGFydHMobm9kZSkge1xuICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcCgoe25vZGU6IGNoaWxkfSkgPT4gY2hpbGQpLmZpbHRlcigoY2hpbGQpID0+IGNoaWxkLnR5cGUgIT0gXCJjb21tZW50XCIpXG4gIH1cblxuICAvKipcbiAgICogUmVxdWlyZXMgb25lIGV4YWN0IGZpZWxkIHJhdGhlciB0aGFuIHNlYXJjaGluZyBkZXNjZW5kYW50cy5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gRmllbGQgb3duZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gRmllbGQgbmFtZS5cbiAgICogQHJldHVybnMge0NzdE5vZGV9IFNvbGUgZmllbGQgY2hpbGQuXG4gICAqL1xuICBmaWVsZChub2RlLCBuYW1lKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IG5vZGUuY2hpbGRyZW4uZmlsdGVyKCh7ZmllbGR9KSA9PiBmaWVsZCA9PSBuYW1lKVxuXG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoICE9IDEpIHJldHVybiB0aGlzLmZhaWwobm9kZSwgYGV4cGVjdGVkIG9uZSAnJHtuYW1lfScgZmllbGRgKVxuICAgIHJldHVybiBtYXRjaGVzWzBdLm5vZGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lcyBldmVyeSBzdHJ1Y3R1cmFsIGNoaWxkLCBpbmNsdWRpbmcgcHVuY3R1YXRpb24uXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIFNoYXBlIG93bmVyLlxuICAgKiBAcGFyYW0geyhDc3ROb2RlIHwgc3RyaW5nKVtdfSBleHBlY3RlZCAtIE9yZGVyZWQgbm9kZXMgb3IgdG9rZW4ga2luZHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2hhcGUobm9kZSwgZXhwZWN0ZWQpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMucGFydHMobm9kZSlcblxuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggIT0gZXhwZWN0ZWQubGVuZ3RoIHx8IGNoaWxkcmVuLnNvbWUoKGNoaWxkLCBpbmRleCkgPT5cbiAgICAgIHR5cGVvZiBleHBlY3RlZFtpbmRleF0gPT0gXCJzdHJpbmdcIiA/IGNoaWxkLnR5cGUgIT0gZXhwZWN0ZWRbaW5kZXhdIDogY2hpbGQgIT09IGV4cGVjdGVkW2luZGV4XSkpIHRoaXMuZmFpbChub2RlLCBgJHtub2RlLnR5cGV9IGNoaWxkIHNoYXBlYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1aXJlcyBhbiBvcmRpbmFyeSBjYWxsZXIgaWRlbnRpZmllciBvdXRzaWRlIHRoZSBwcm90ZWN0ZWQgbmFtZXNwYWNlLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBJZGVudGlmaWVyIHRva2VuLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBBY2NlcHRlZCBzcGVsbGluZy5cbiAgICovXG4gIGlkZW50aWZpZXIobm9kZSkge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnRleHQobm9kZSlcblxuICAgIGlmIChub2RlLnR5cGUgIT0gXCJpZGVudGlmaWVyXCIgfHwgIWlzQ0lkZW50aWZpZXIobmFtZSkpIHRoaXMuZmFpbChub2RlLCBcInJlc2VydmVkIG9yIHVuc3VwcG9ydGVkIGlkZW50aWZpZXJcIilcbiAgICByZXR1cm4gbmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIG9ubHkgdGhlIGNhbm9uaWNhbCBzY2FsYXIgdHlwZSBzcGVsbGluZ3MuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIFR5cGUgdG9rZW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUmVmZXJlbmNlfSBTZW1hbnRpYyBzY2FsYXIuXG4gICAqL1xuICB0eXBlKG5vZGUpIHtcbiAgICBpZiAoIVtcInByaW1pdGl2ZV90eXBlXCIsIFwidHlwZV9pZGVudGlmaWVyXCJdLmluY2x1ZGVzKG5vZGUudHlwZSkpIHRoaXMuZmFpbChub2RlLCBcInNjYWxhciB0eXBlIHNoYXBlXCIpXG4gICAgY29uc3QgdHlwZSA9IHNvdXJjZVNjYWxhclR5cGUoXCJjXCIsIHRoaXMudGV4dChub2RlKSwgdGhpcy5sb2NhdGlvbihub2RlKSlcblxuICAgIGlmICghdHlwZSkgcmV0dXJuIHRoaXMuZmFpbChub2RlLCBcInVuc3VwcG9ydGVkIHNjYWxhciB0eXBlXCIpXG4gICAgcmV0dXJuIHR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGRpcmVjdCBmdW5jdGlvbiBjYWxsJ3MgZXhhY3QgYXJndW1lbnQgbGlzdC5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gQ2FsbCBub2RlLlxuICAgKiBAcmV0dXJucyB7e25hbWU6IENzdE5vZGUsIGFyZ3VtZW50czogQ3N0Tm9kZVtdfX0gUGFyc2VkIGNhbGwgc2hhcGUuXG4gICAqL1xuICBjYWxsKG5vZGUpIHtcbiAgICBpZiAobm9kZS50eXBlICE9IFwiY2FsbF9leHByZXNzaW9uXCIpIHJldHVybiB0aGlzLmZhaWwobm9kZSwgXCJkaXJlY3QgY2FsbCByZXF1aXJlZFwiKVxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmZpZWxkKG5vZGUsIFwiZnVuY3Rpb25cIilcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5maWVsZChub2RlLCBcImFyZ3VtZW50c1wiKVxuXG4gICAgdGhpcy5zaGFwZShub2RlLCBbbmFtZSwgbGlzdF0pXG4gICAgaWYgKG5hbWUudHlwZSAhPSBcImlkZW50aWZpZXJcIiB8fCBsaXN0LnR5cGUgIT0gXCJhcmd1bWVudF9saXN0XCIpIHRoaXMuZmFpbChub2RlLCBcImRpcmVjdCBjYWxsIHNoYXBlXCIpXG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKGxpc3QpXG4gICAgY29uc3QgYXJncyA9IHBhcnRzLnNsaWNlKDEsIC0xKS5maWx0ZXIoKF9wYXJ0LCBpbmRleCkgPT4gaW5kZXggJSAyID09IDApXG5cbiAgICB0aGlzLnNoYXBlKGxpc3QsIFtcIihcIiwgLi4uYXJncy5mbGF0TWFwKChhcmcsIGluZGV4KSA9PiBpbmRleCA9PSAwID8gW2FyZ10gOiBbXCIsXCIsIGFyZ10pLCBcIilcIl0pXG4gICAgcmV0dXJuIHthcmd1bWVudHM6IGFyZ3MsIG5hbWV9XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBhIHBhcnNlci1iYWNrZWQgb3JkaW5hcnkgQyBzdHJpbmcgdG9rZW4gYXMgVVRGLTggYnl0ZXMuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIFN0cmluZyBsaXRlcmFsLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDb21wbGV0ZSBVbmljb2RlIHNjYWxhciB2YWx1ZS5cbiAgICovXG4gIHN0cmluZyhub2RlKSB7XG4gICAgaWYgKG5vZGUudHlwZSAhPSBcInN0cmluZ19saXRlcmFsXCIpIHJldHVybiB0aGlzLmZhaWwobm9kZSwgXCJvcmRpbmFyeSBzdHJpbmcgbGl0ZXJhbCByZXF1aXJlZFwiKVxuICAgIGNvbnN0IHBhcnRzID0gdGhpcy5wYXJ0cyhub2RlKVxuXG4gICAgaWYgKHBhcnRzWzBdPy50eXBlICE9ICdcIicgfHwgcGFydHMuYXQoLTEpPy50eXBlICE9ICdcIicpIHRoaXMuZmFpbChub2RlLCBcInByZWZpeGVkIHN0cmluZyBsaXRlcmFsXCIpXG4gICAgY29uc3QgYnl0ZXMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHBhcnRzLmxlbmd0aCAtIDE7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gcGFydHNbaW5kZXhdXG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0KGNoaWxkKVxuXG4gICAgICBpZiAoY2hpbGQudHlwZSA9PSBcInN0cmluZ19jb250ZW50XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBieXRlIG9mIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KSkgYnl0ZXMucHVzaChieXRlKVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoY2hpbGQudHlwZSA9PSBcImVzY2FwZV9zZXF1ZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IHNpbXBsZSA9IG5ldyBNYXAoW1tcImFcIiwgN10sIFtcImJcIiwgOF0sIFtcImZcIiwgMTJdLCBbXCJuXCIsIDEwXSwgW1wiclwiLCAxM10sIFtcInRcIiwgOV0sIFtcInZcIiwgMTFdLCBbXCJcXFxcXCIsIDkyXSwgWydcIicsIDM0XSwgW1wiJ1wiLCAzOV0sIFtcIj9cIiwgNjNdXSlcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0LnNsaWNlKDEpXG5cbiAgICAgICAgaWYgKHRleHRbMF0gIT0gXCJcXFxcXCIpIHRoaXMuZmFpbChjaGlsZCwgXCJpbnZhbGlkIGVzY2FwZVwiKVxuICAgICAgICBpZiAoc2ltcGxlLmhhcyh2YWx1ZSkpIGJ5dGVzLnB1c2goLyoqIEB0eXBlIHtudW1iZXJ9ICovIChzaW1wbGUuZ2V0KHZhbHVlKSkpXG4gICAgICAgIGVsc2UgaWYgKC9eWzAtN117MSwzfSQvdS50ZXN0KHZhbHVlKSB8fCAvXnhbMC05YS1mQS1GXSskL3UudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gcGFydHNbaW5kZXggKyAxXVxuXG4gICAgICAgICAgLy8gQyBjb25zdW1lcyBldmVyeSBhZGphY2VudCBoZXggZGlnaXQ7IHRoZSBmcm96ZW4gZ3JhbW1hciBjYXBzIGVhY2ggZXNjYXBlIG5vZGUgYXQgZm91ci5cbiAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcInhcIikgJiYgbmV4dC50eXBlID09IFwic3RyaW5nX2NvbnRlbnRcIiAmJiBuZXh0LnN0YXJ0SW5kZXggPT0gY2hpbGQuZW5kSW5kZXggJiYgL15bMC05YS1mQS1GXS91LnRlc3QodGhpcy50ZXh0KG5leHQpKSkge1xuICAgICAgICAgICAgdGhpcy5mYWlsKGNoaWxkLCBcImhleGFkZWNpbWFsIGVzY2FwZSBzcGxpdCBieSBwYXJzZXIgYm91bmRhcnlcIilcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbnVtYmVyID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlWzBdID09IFwieFwiID8gdmFsdWUuc2xpY2UoMSkgOiB2YWx1ZSwgdmFsdWVbMF0gPT0gXCJ4XCIgPyAxNiA6IDgpXG5cbiAgICAgICAgICBpZiAobnVtYmVyID4gMjU1KSB0aGlzLmZhaWwoY2hpbGQsIFwiZXNjYXBlIG91dHNpZGUgYnl0ZSByYW5nZVwiKVxuICAgICAgICAgIGJ5dGVzLnB1c2gobnVtYmVyKVxuICAgICAgICB9IGVsc2UgdGhpcy5mYWlsKGNoaWxkLCBcInVuc3VwcG9ydGVkIGVzY2FwZVwiKVxuICAgICAgfSBlbHNlIHRoaXMuZmFpbChjaGlsZCwgXCJzdHJpbmcgY2hpbGRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiLCB7ZmF0YWw6IHRydWUsIGlnbm9yZUJPTTogdHJ1ZX0pLmRlY29kZShuZXcgVWludDhBcnJheShieXRlcykpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcikgcmV0dXJuIHRoaXMuZmFpbChub2RlLCBcImludmFsaWQgVVRGLTggbGl0ZXJhbCBieXRlc1wiKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgc3VwcG9ydGVkIGV4cHJlc3Npb25zIHdpdGhvdXQgYXNzdW1pbmcgQyBhcmd1bWVudCBldmFsdWF0aW9uIG9yZGVyLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBFeHByZXNzaW9uIG5vZGUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW25lc3RlZF0gLSBXaGV0aGVyIGEgc2VtYW50aWMgY2FsbCB3b3VsZCBoYXZlIHVuc3BlY2lmaWVkIG9yZGVyLlxuICAgKiBAcmV0dXJucyB7RXhwcmVzc2lvbn0gU2VtYW50aWMgZXhwcmVzc2lvbi5cbiAgICovXG4gIGV4cHJlc3Npb24obm9kZSwgbmVzdGVkID0gZmFsc2UpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMubG9jYXRpb24obm9kZSlcblxuICAgIGlmIChub2RlLnR5cGUgPT0gXCJwYXJlbnRoZXNpemVkX2V4cHJlc3Npb25cIikge1xuICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKG5vZGUpXG5cbiAgICAgIHRoaXMuc2hhcGUobm9kZSwgW1wiKFwiLCBwYXJ0c1sxXSwgXCIpXCJdKVxuICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbihwYXJ0c1sxXSwgbmVzdGVkKVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwiaWRlbnRpZmllclwiKSB7XG4gICAgICBjb25zdCB0ZW1wb3JhcnkgPSB0aGlzLnRlbXBvcmFyeUV4cHJlc3Npb25zPy5nZXQodGhpcy50ZXh0KG5vZGUpKVxuXG4gICAgICBpZiAodGVtcG9yYXJ5KSB7XG4gICAgICAgIHRoaXMudGVtcG9yYXJ5RXhwcmVzc2lvbnM/LmRlbGV0ZSh0aGlzLnRleHQobm9kZSkpXG4gICAgICAgIHJldHVybiB0ZW1wb3JhcnlcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIsIGxvY2F0aW9uLCBuYW1lOiB0aGlzLmlkZW50aWZpZXIobm9kZSl9LCB7bmFtZTogbG9jYXRpb259KVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwidHJ1ZVwiIHx8IG5vZGUudHlwZSA9PSBcImZhbHNlXCIpIHtcbiAgICAgIGlmICh0aGlzLnRleHQobm9kZSkgIT0gbm9kZS50eXBlKSB0aGlzLmZhaWwobm9kZSwgXCJub25jYW5vbmljYWwgQm9vbGVhbiBsaXRlcmFsIHNwZWxsaW5nXCIpXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogXCJCb29sZWFuTGl0ZXJhbFwiLCBsb2NhdGlvbiwgdmFsdWU6IG5vZGUudHlwZSA9PSBcInRydWVcIn0sIHtsaXRlcmFsOiBsb2NhdGlvbn0pXG4gICAgfVxuICAgIGlmIChub2RlLnR5cGUgPT0gXCJudW1iZXJfbGl0ZXJhbFwiKSB7XG4gICAgICBjb25zdCBzcGVsbGluZyA9IHRoaXMudGV4dChub2RlKVxuXG4gICAgICBpZiAoIS9eKD86MHxbMS05XVswLTldKikkL3UudGVzdChzcGVsbGluZykgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKE51bWJlcihzcGVsbGluZykpKSB0aGlzLmZhaWwobm9kZSwgXCJub24tc2FmZSBvciBub25jYW5vbmljYWwgaW50ZWdlclwiKVxuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IFwiSW50ZWdlckxpdGVyYWxcIiwgbG9jYXRpb24sIHZhbHVlOiBOdW1iZXIoc3BlbGxpbmcpfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgICB9XG4gICAgaWYgKG5vZGUudHlwZSA9PSBcImJpbmFyeV9leHByZXNzaW9uXCIpIHtcbiAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLmZpZWxkKG5vZGUsIFwibGVmdFwiKVxuICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLmZpZWxkKG5vZGUsIFwicmlnaHRcIilcbiAgICAgIGNvbnN0IG9wZXJhdG9yID0gdGhpcy5maWVsZChub2RlLCBcIm9wZXJhdG9yXCIpXG4gICAgICBjb25zdCBpbnRlbnQgPSBiaW5hcnlPcGVyYXRpb25zLmdldChvcGVyYXRvci50eXBlKVxuXG4gICAgICB0aGlzLnNoYXBlKG5vZGUsIFtsZWZ0LCBvcGVyYXRvciwgcmlnaHRdKVxuICAgICAgaWYgKCFpbnRlbnQpIHJldHVybiB0aGlzLmZhaWwob3BlcmF0b3IsIFwidW5zdXBwb3J0ZWQgYmluYXJ5IG9wZXJhdG9yXCIpXG4gICAgICByZXR1cm4gdGhpcy5iaW5hcnkobm9kZSwgaW50ZW50LCB0aGlzLmV4cHJlc3Npb24obGVmdCwgdHJ1ZSksIHRoaXMuZXhwcmVzc2lvbihyaWdodCwgdHJ1ZSksIG9wZXJhdG9yKVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwidW5hcnlfZXhwcmVzc2lvblwiKSB7XG4gICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuZmllbGQobm9kZSwgXCJvcGVyYXRvclwiKVxuICAgICAgY29uc3QgYXJndW1lbnQgPSB0aGlzLmZpZWxkKG5vZGUsIFwiYXJndW1lbnRcIilcblxuICAgICAgdGhpcy5zaGFwZShub2RlLCBbb3BlcmF0b3IsIGFyZ3VtZW50XSlcbiAgICAgIGlmICghW1wiLVwiLCBcIiFcIl0uaW5jbHVkZXMob3BlcmF0b3IudHlwZSkpIHRoaXMuZmFpbChvcGVyYXRvciwgXCJ1bnN1cHBvcnRlZCB1bmFyeSBvcGVyYXRvclwiKVxuICAgICAgcmV0dXJuIHRoaXMudW5hcnkobm9kZSwgb3BlcmF0b3IudHlwZSA9PSBcIi1cIiA/IFwiTmVnYXRlXCIgOiBcIk5vdFwiLCB0aGlzLmV4cHJlc3Npb24oYXJndW1lbnQsIHRydWUpLCBvcGVyYXRvcilcbiAgICB9XG4gICAgaWYgKG5vZGUudHlwZSA9PSBcImNhbGxfZXhwcmVzc2lvblwiKSB7XG4gICAgICBjb25zdCBjYWxsID0gdGhpcy5jYWxsKG5vZGUpXG4gICAgICBjb25zdCBuYW1lID0gdGhpcy50ZXh0KGNhbGwubmFtZSlcblxuICAgICAgaWYgKG5hbWUgPT0gXCJJTlQ2NF9DXCIgfHwgbmFtZSA9PSBcIlNFTUFOVElGT0xEX1NUUklOR1wiKSB7XG4gICAgICAgIGlmIChjYWxsLmFyZ3VtZW50cy5sZW5ndGggIT0gMSkgdGhpcy5mYWlsKG5vZGUsIFwibGl0ZXJhbCBtYWNybyBhcml0eVwiKVxuICAgICAgICBpZiAobmFtZSA9PSBcIlNFTUFOVElGT0xEX1NUUklOR1wiKSByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogXCJTdHJpbmdMaXRlcmFsXCIsIGxvY2F0aW9uLCB2YWx1ZTogdGhpcy5zdHJpbmcoY2FsbC5hcmd1bWVudHNbMF0pfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgICAgICAgaWYgKGNhbGwuYXJndW1lbnRzWzBdLnR5cGUgIT0gXCJudW1iZXJfbGl0ZXJhbFwiKSB0aGlzLmZhaWwobm9kZSwgXCJpbnRlZ2VyIGxpdGVyYWwgbWFjcm8gb3BlcmFuZFwiKVxuICAgICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7Li4udGhpcy5leHByZXNzaW9uKGNhbGwuYXJndW1lbnRzWzBdKSwgbG9jYXRpb259LCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICAgICAgfVxuICAgICAgLy8gR2VuZXJhdGVkIG9wZXJhdGlvbnMgYXJlIHNlcGFyYXRlIHRlbXBvcmFyeSBpbml0aWFsaXplcnM7IG9ubHkgbGl0ZXJhbCBtYWNyb3MgbWF5IG5lc3QgYXMgY2FsbHMuXG4gICAgICBpZiAobmVzdGVkKSB0aGlzLmZhaWwobm9kZSwgXCJjYWxsZXIgY2FsbCBpbiB1bnNwZWNpZmllZC1vcmRlciBleHByZXNzaW9uXCIpXG4gICAgICBpZiAobmFtZSA9PSBcInNlbWFudGlmb2xkX2ludGVnZXJfbmVnYXRlXCIpIHtcbiAgICAgICAgaWYgKGNhbGwuYXJndW1lbnRzLmxlbmd0aCAhPSAxKSB0aGlzLmZhaWwobm9kZSwgXCJuZWdhdGlvbiBoZWxwZXIgYXJpdHlcIilcbiAgICAgICAgcmV0dXJuIHRoaXMudW5hcnkobm9kZSwgXCJOZWdhdGVcIiwgdGhpcy5leHByZXNzaW9uKGNhbGwuYXJndW1lbnRzWzBdLCB0cnVlKSwgY2FsbC5uYW1lKVxuICAgICAgfVxuICAgICAgY29uc3QgaW50ZW50ID0gaGVscGVycy5nZXQobmFtZSlcblxuICAgICAgaWYgKGludGVudCkge1xuICAgICAgICBpZiAoY2FsbC5hcmd1bWVudHMubGVuZ3RoICE9IDIpIHRoaXMuZmFpbChub2RlLCBcInNjYWxhciBoZWxwZXIgYXJpdHlcIilcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluYXJ5KG5vZGUsIGludGVudCwgdGhpcy5leHByZXNzaW9uKGNhbGwuYXJndW1lbnRzWzBdLCB0cnVlKSwgdGhpcy5leHByZXNzaW9uKGNhbGwuYXJndW1lbnRzWzFdLCB0cnVlKSwgY2FsbC5uYW1lKVxuICAgICAgfVxuICAgICAgaWYgKGNhbGwuYXJndW1lbnRzLmxlbmd0aCAhPSAyKSB0aGlzLmZhaWwobm9kZSwgXCJzZW1hbnRpYyBjYWxsIGFyaXR5XCIpXG4gICAgICBjb25zdCBjYWxsZWUgPSB0aGlzLmlkZW50aWZpZXIoY2FsbC5uYW1lKVxuXG4gICAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkICYmICF0aGlzLmRlY2xhcmVkRnVuY3Rpb25zLmhhcyhjYWxsZWUpKSB0aGlzLmZhaWwoY2FsbC5uYW1lLCBcImltcGxpY2l0IGZ1bmN0aW9uIGRlY2xhcmF0aW9uXCIpXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogXCJDYWxsRXhwcmVzc2lvblwiLCBsb2NhdGlvbiwgY2FsbGVlLFxuICAgICAgICBhcmd1bWVudHM6IGNhbGwuYXJndW1lbnRzLm1hcCgoYXJndW1lbnQpID0+IHRoaXMuZXhwcmVzc2lvbihhcmd1bWVudCwgdHJ1ZSkpfSwge2NhbGxlZTogdGhpcy5sb2NhdGlvbihjYWxsLm5hbWUpfSlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmFpbChub2RlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgcGFyc2VyIGludGVudCBiZWZvcmUgc2hhcmVkIHR5cGUgcmVzb2x1dGlvbi5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gT3duaW5nIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBBZGFwdGVkIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtFeHByZXNzaW9ufSBsZWZ0IC0gTGVmdCBvcGVyYW5kLlxuICAgKiBAcGFyYW0ge0V4cHJlc3Npb259IHJpZ2h0IC0gUmlnaHQgb3BlcmFuZC5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBvcGVyYXRvciAtIE9wZXJhdG9yIHRva2VuLlxuICAgKiBAcmV0dXJucyB7RXhwcmVzc2lvbn0gUGVuZGluZyBiaW5hcnkgZXhwcmVzc2lvbi5cbiAgICovXG4gIGJpbmFyeShub2RlLCBpbnRlbnQsIGxlZnQsIHJpZ2h0LCBvcGVyYXRvcikge1xuICAgIHJldHVybiAvKiogQHR5cGUge0V4cHJlc3Npb259ICovICh3aXRoQWRhcHRlZE9wZXJhdGlvbih3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiBcIkJpbmFyeUV4cHJlc3Npb25cIiwgbG9jYXRpb246IHRoaXMubG9jYXRpb24obm9kZSksIGxlZnQsIHJpZ2h0fSxcbiAgICAgIHtvcGVyYXRvcjogdGhpcy5sb2NhdGlvbihvcGVyYXRvcil9KSwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy9vcGVyYXRvcnMuanNcIikuQWRhcHRlZE9wZXJhdGlvbn0gKi8gKGludGVudCkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgcGFyc2VyIGludGVudCBmb3IgYSB1bmFyeSBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIE93bmluZyBleHByZXNzaW9uLlxuICAgKiBAcGFyYW0ge1wiTmVnYXRlXCIgfCBcIk5vdFwifSBpbnRlbnQgLSBBZGFwdGVkIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtFeHByZXNzaW9ufSBvcGVyYW5kIC0gT3BlcmFuZC5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBvcGVyYXRvciAtIE9wZXJhdG9yIHRva2VuLlxuICAgKiBAcmV0dXJucyB7RXhwcmVzc2lvbn0gUGVuZGluZyB1bmFyeSBleHByZXNzaW9uLlxuICAgKi9cbiAgdW5hcnkobm9kZSwgaW50ZW50LCBvcGVyYW5kLCBvcGVyYXRvcikge1xuICAgIHJldHVybiAvKiogQHR5cGUge0V4cHJlc3Npb259ICovICh3aXRoQWRhcHRlZE9wZXJhdGlvbih3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiBcIlVuYXJ5RXhwcmVzc2lvblwiLCBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbihub2RlKSwgb3BlcmFuZH0sXG4gICAgICB7b3BlcmF0b3I6IHRoaXMubG9jYXRpb24ob3BlcmF0b3IpfSksIGludGVudCkpXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgb25lIGluaXRpYWxpemVkIGRlY2xhcmF0aW9uIG9yIGV4ZWN1dGFibGUgc3RhdGVtZW50LlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBTdGF0ZW1lbnQgbm9kZS5cbiAgICogQHJldHVybnMge1N0YXRlbWVudH0gU2VtYW50aWMgc3RhdGVtZW50LlxuICAgKi9cbiAgc3RhdGVtZW50KG5vZGUpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMubG9jYXRpb24obm9kZSlcblxuICAgIGlmIChub2RlLnR5cGUgPT0gXCJkZWNsYXJhdGlvblwiKSB7XG4gICAgICBjb25zdCB0eXBlTm9kZSA9IG5vZGUuY2hpbGRyZW4uZmluZCgoe2ZpZWxkfSkgPT4gZmllbGQgPT0gXCJ0eXBlXCIpPy5ub2RlXG5cbiAgICAgIGlmICghdHlwZU5vZGUpIHJldHVybiBtaXNzaW5nVHlwZShcImNcIiwgXCJsb2NhbFwiLCBsb2NhdGlvbilcbiAgICAgIGNvbnN0IGRlY2xhcmF0b3IgPSB0aGlzLmZpZWxkKG5vZGUsIFwiZGVjbGFyYXRvclwiKVxuICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKG5vZGUpXG4gICAgICBjb25zdCBpbW11dGFibGUgPSBwYXJ0c1swXS50eXBlID09IFwidHlwZV9xdWFsaWZpZXJcIlxuXG4gICAgICB0aGlzLnNoYXBlKG5vZGUsIFsuLi4oaW1tdXRhYmxlID8gW3BhcnRzWzBdXSA6IFtdKSwgdHlwZU5vZGUsIGRlY2xhcmF0b3IsIFwiO1wiXSlcbiAgICAgIGlmIChpbW11dGFibGUgJiYgdGhpcy50ZXh0KHBhcnRzWzBdKSAhPSBcImNvbnN0XCIpIHRoaXMuZmFpbChwYXJ0c1swXSwgXCJsb2NhbCBxdWFsaWZpZXJcIilcbiAgICAgIGlmIChkZWNsYXJhdG9yLnR5cGUgIT0gXCJpbml0X2RlY2xhcmF0b3JcIikgdGhpcy5mYWlsKGRlY2xhcmF0b3IsIFwiaW5pdGlhbGl6ZWQgc2ltcGxlIGxvY2FsIHJlcXVpcmVkXCIpXG4gICAgICBjb25zdCBuYW1lID0gdGhpcy5maWVsZChkZWNsYXJhdG9yLCBcImRlY2xhcmF0b3JcIilcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWVsZChkZWNsYXJhdG9yLCBcInZhbHVlXCIpXG5cbiAgICAgIHRoaXMuc2hhcGUoZGVjbGFyYXRvciwgW25hbWUsIFwiPVwiLCB2YWx1ZV0pXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogXCJMb2NhbERlY2xhcmF0aW9uXCIsIGxvY2F0aW9uLCBuYW1lOiB0aGlzLmlkZW50aWZpZXIobmFtZSksIHR5cGU6IHRoaXMudHlwZSh0eXBlTm9kZSksIG11dGFibGU6ICFpbW11dGFibGUsXG4gICAgICAgIGluaXRpYWxpemVyOiB0aGlzLmV4cHJlc3Npb24odmFsdWUpfSwge25hbWU6IHRoaXMubG9jYXRpb24obmFtZSksIG9wZXJhdG9yOiB0aGlzLmxvY2F0aW9uKHRoaXMucGFydHMoZGVjbGFyYXRvcilbMV0pfSlcbiAgICB9XG4gICAgaWYgKG5vZGUudHlwZSA9PSBcInJldHVybl9zdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKG5vZGUpXG5cbiAgICAgIHRoaXMuc2hhcGUobm9kZSwgW1wicmV0dXJuXCIsIHBhcnRzWzFdLCBcIjtcIl0pXG4gICAgICByZXR1cm4ge2tpbmQ6IFwiUmV0dXJuU3RhdGVtZW50XCIsIGxvY2F0aW9uLCBleHByZXNzaW9uOiB0aGlzLmV4cHJlc3Npb24ocGFydHNbMV0pfVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwiaWZfc3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuZmllbGQobm9kZSwgXCJjb25kaXRpb25cIilcbiAgICAgIGNvbnN0IGNvbnNlcXVlbmNlID0gdGhpcy5maWVsZChub2RlLCBcImNvbnNlcXVlbmNlXCIpXG4gICAgICBjb25zdCBhbHRlcm5hdGl2ZSA9IG5vZGUuY2hpbGRyZW4uZmluZCgoe2ZpZWxkfSkgPT4gZmllbGQgPT0gXCJhbHRlcm5hdGl2ZVwiKT8ubm9kZVxuXG4gICAgICB0aGlzLnNoYXBlKG5vZGUsIFtcImlmXCIsIGNvbmRpdGlvbiwgY29uc2VxdWVuY2UsIC4uLihhbHRlcm5hdGl2ZSA/IFthbHRlcm5hdGl2ZV0gOiBbXSldKVxuICAgICAgY29uc3Qgc3RhdGVtZW50ID0ge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIklmU3RhdGVtZW50XCIpLCBsb2NhdGlvbiwgY29uZGl0aW9uOiB0aGlzLmV4cHJlc3Npb24oY29uZGl0aW9uKSwgY29uc2VxdWVudDogdGhpcy5ibG9jayhjb25zZXF1ZW5jZSl9XG5cbiAgICAgIGlmICghYWx0ZXJuYXRpdmUpIHJldHVybiBzdGF0ZW1lbnRcbiAgICAgIGNvbnN0IGJyYW5jaCA9IHRoaXMucGFydHMoYWx0ZXJuYXRpdmUpWzFdXG5cbiAgICAgIHRoaXMuc2hhcGUoYWx0ZXJuYXRpdmUsIFtcImVsc2VcIiwgYnJhbmNoXSlcbiAgICAgIHJldHVybiB7Li4uc3RhdGVtZW50LCBhbHRlcm5hdGU6IGJyYW5jaC50eXBlID09IFwiaWZfc3RhdGVtZW50XCJcbiAgICAgICAgPyB7a2luZDogXCJCbG9ja1wiLCBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbihicmFuY2gpLCBzdGF0ZW1lbnRzOiBbdGhpcy5zdGF0ZW1lbnQoYnJhbmNoKV19IDogdGhpcy5ibG9jayhicmFuY2gpfVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwiZXhwcmVzc2lvbl9zdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMucGFydHMobm9kZSlbMF1cblxuICAgICAgdGhpcy5zaGFwZShub2RlLCBbZXhwcmVzc2lvbiwgXCI7XCJdKVxuICAgICAgaWYgKGV4cHJlc3Npb24udHlwZSA9PSBcImFzc2lnbm1lbnRfZXhwcmVzc2lvblwiKSB7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLmZpZWxkKGV4cHJlc3Npb24sIFwibGVmdFwiKVxuICAgICAgICBjb25zdCByaWdodCA9IHRoaXMuZmllbGQoZXhwcmVzc2lvbiwgXCJyaWdodFwiKVxuICAgICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuZmllbGQoZXhwcmVzc2lvbiwgXCJvcGVyYXRvclwiKVxuXG4gICAgICAgIHRoaXMuc2hhcGUoZXhwcmVzc2lvbiwgW2xlZnQsIFwiPVwiLCByaWdodF0pXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpLCBuYW1lOiB0aGlzLmlkZW50aWZpZXIobGVmdCksIGxvY2F0aW9uOiB0aGlzLmxvY2F0aW9uKGxlZnQpfSwge25hbWU6IHRoaXMubG9jYXRpb24obGVmdCl9KVxuXG4gICAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiwgbG9jYXRpb24sIHRhcmdldCwgZXhwcmVzc2lvbjogdGhpcy5leHByZXNzaW9uKHJpZ2h0KX0sIHtvcGVyYXRvcjogdGhpcy5sb2NhdGlvbihvcGVyYXRvcil9KVxuICAgICAgfVxuICAgICAgY29uc3QgY2FsbCA9IHRoaXMuY2FsbChleHByZXNzaW9uKVxuXG4gICAgICBpZiAoIS9ec2VtYW50aWZvbGRfcHJpbnRfKD86aW50ZWdlcnxib29sZWFufHN0cmluZykkL3UudGVzdCh0aGlzLnRleHQoY2FsbC5uYW1lKSkgfHwgY2FsbC5hcmd1bWVudHMubGVuZ3RoICE9IDEpIHRoaXMuZmFpbChub2RlLCBcInByaW50IHNjYWZmb2xkXCIpXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXhwcmVzc2lvbihjYWxsLmFyZ3VtZW50c1swXSlcblxuICAgICAgY29uc3Qgc3RhdGVtZW50ID0ge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlByaW50U3RhdGVtZW50XCIpLCBsb2NhdGlvbiwgZXhwcmVzc2lvbjogdmFsdWV9XG5cbiAgICAgIHRoaXMucHJpbnRUeXBlcy5zZXQoc3RhdGVtZW50LCB7bm9kZTogY2FsbC5uYW1lLCB0eXBlOiB0aGlzLnRleHQoY2FsbC5uYW1lKS5zbGljZShcInNlbWFudGlmb2xkX3ByaW50X1wiLmxlbmd0aCl9KVxuICAgICAgcmV0dXJuIHN0YXRlbWVudFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mYWlsKG5vZGUpXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgb25lIGxleGljYWwgYnJhY2VkIGJsb2NrIGluIHNvdXJjZSBvcmRlci5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gQmxvY2sgbm9kZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBTZW1hbnRpYyBibG9jay5cbiAgICovXG4gIGJsb2NrKG5vZGUpIHtcbiAgICBpZiAobm9kZS50eXBlICE9IFwiY29tcG91bmRfc3RhdGVtZW50XCIpIHRoaXMuZmFpbChub2RlLCBcImJyYWNlZCBibG9jayByZXF1aXJlZFwiKVxuICAgIGNvbnN0IHBhcnRzID0gdGhpcy5wYXJ0cyhub2RlKVxuXG4gICAgdGhpcy5zaGFwZShub2RlLCBbXCJ7XCIsIC4uLnBhcnRzLnNsaWNlKDEsIC0xKSwgXCJ9XCJdKVxuICAgIHJldHVybiB7a2luZDogXCJCbG9ja1wiLCBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbihub2RlKSwgc3RhdGVtZW50czogdGhpcy5nZW5lcmF0ZWRcbiAgICAgID8gdGhpcy5nZW5lcmF0ZWRTdGF0ZW1lbnRzKG5vZGUuY2hpbGRyZW4ubWFwKCh7bm9kZTogY2hpbGR9KSA9PiBjaGlsZCkuc2xpY2UoMSwgLTEpKVxuICAgICAgOiBwYXJ0cy5zbGljZSgxLCAtMSkubWFwKChjaGlsZCkgPT4gdGhpcy5zdGF0ZW1lbnQoY2hpbGQpKX1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBvbmUgZmlsZS1sb2NhbCBzZW1hbnRpYyBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gRnVuY3Rpb24gZGVmaW5pdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb259IFNlbWFudGljIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24obm9kZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpZWxkKG5vZGUsIFwidHlwZVwiKVxuICAgIGNvbnN0IGRlY2xhcmF0b3IgPSB0aGlzLmZpZWxkKG5vZGUsIFwiZGVjbGFyYXRvclwiKVxuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmZpZWxkKG5vZGUsIFwiYm9keVwiKVxuXG4gICAgdGhpcy5zaGFwZShub2RlLCBbXCJzdG9yYWdlX2NsYXNzX3NwZWNpZmllclwiLCB0eXBlLCBkZWNsYXJhdG9yLCBib2R5XSlcbiAgICBpZiAodGhpcy50ZXh0KHRoaXMucGFydHMobm9kZSlbMF0pICE9IFwic3RhdGljXCIgfHwgZGVjbGFyYXRvci50eXBlICE9IFwiZnVuY3Rpb25fZGVjbGFyYXRvclwiKSB0aGlzLmZhaWwobm9kZSwgXCJmaWxlLWxvY2FsIGZ1bmN0aW9uIHJlcXVpcmVkXCIpXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZmllbGQoZGVjbGFyYXRvciwgXCJkZWNsYXJhdG9yXCIpXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZmllbGQoZGVjbGFyYXRvciwgXCJwYXJhbWV0ZXJzXCIpXG5cbiAgICB0aGlzLnNoYXBlKGRlY2xhcmF0b3IsIFtuYW1lLCBwYXJhbWV0ZXJzXSlcbiAgICBjb25zdCBwYXJ0cyA9IHRoaXMucGFydHMocGFyYW1ldGVycylcblxuICAgIHRoaXMuc2hhcGUocGFyYW1ldGVycywgW1wiKFwiLCBcInBhcmFtZXRlcl9kZWNsYXJhdGlvblwiLCBcIixcIiwgXCJwYXJhbWV0ZXJfZGVjbGFyYXRpb25cIiwgXCIpXCJdKVxuICAgIGNvbnN0IGNvbnZlcnRlZCA9IFtwYXJ0c1sxXSwgcGFydHNbM11dLm1hcCgocGFyYW1ldGVyKSA9PiB7XG4gICAgICBjb25zdCB0eXBlTm9kZSA9IHRoaXMuZmllbGQocGFyYW1ldGVyLCBcInR5cGVcIilcbiAgICAgIGNvbnN0IG5hbWVOb2RlID0gdGhpcy5maWVsZChwYXJhbWV0ZXIsIFwiZGVjbGFyYXRvclwiKVxuXG4gICAgICB0aGlzLnNoYXBlKHBhcmFtZXRlciwgW3R5cGVOb2RlLCBuYW1lTm9kZV0pXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUGFyYW1ldGVyXCIpLCBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbihwYXJhbWV0ZXIpLCBuYW1lOiB0aGlzLmlkZW50aWZpZXIobmFtZU5vZGUpLCB0eXBlOiB0aGlzLnR5cGUodHlwZU5vZGUpfSwge25hbWU6IHRoaXMubG9jYXRpb24obmFtZU5vZGUpfSlcbiAgICB9KVxuXG4gICAgdGhpcy5kZWNsYXJlZEZ1bmN0aW9ucy5hZGQodGhpcy5pZGVudGlmaWVyKG5hbWUpKVxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiwgbG9jYXRpb246IHRoaXMubG9jYXRpb24obm9kZSksIG5hbWU6IHRoaXMuaWRlbnRpZmllcihuYW1lKSwgcGFyYW1ldGVyczogY29udmVydGVkLFxuICAgICAgcmV0dXJuVHlwZTogdGhpcy50eXBlKHR5cGUpLCBib2R5OiB0aGlzLmJsb2NrKGJvZHkpfSwge25hbWU6IHRoaXMubG9jYXRpb24obmFtZSl9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgb25seSB0aGUgZXhhY3QgbWFpbiBjbGVhbnVwIGFuZCBzdGF0dXMgc2NhZmZvbGRpbmcuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIEVudHJ5IGRlZmluaXRpb24uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FbnRyeVBvaW50fSBTZW1hbnRpYyBlbnRyeS5cbiAgICovXG4gIG1haW4obm9kZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpZWxkKG5vZGUsIFwidHlwZVwiKVxuICAgIGNvbnN0IGRlY2xhcmF0b3IgPSB0aGlzLmZpZWxkKG5vZGUsIFwiZGVjbGFyYXRvclwiKVxuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmZpZWxkKG5vZGUsIFwiYm9keVwiKVxuXG4gICAgdGhpcy5zaGFwZShub2RlLCBbdHlwZSwgZGVjbGFyYXRvciwgYm9keV0pXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZmllbGQoZGVjbGFyYXRvciwgXCJkZWNsYXJhdG9yXCIpXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZmllbGQoZGVjbGFyYXRvciwgXCJwYXJhbWV0ZXJzXCIpXG5cbiAgICB0aGlzLnNoYXBlKGRlY2xhcmF0b3IsIFtuYW1lLCBwYXJhbWV0ZXJzXSlcbiAgICBpZiAodGhpcy50ZXh0KHR5cGUpICE9IFwiaW50XCIgfHwgdGhpcy50ZXh0KG5hbWUpICE9IFwibWFpblwiKSB0aGlzLmZhaWwobm9kZSwgXCJtYWluIHNpZ25hdHVyZVwiKVxuICAgIHRoaXMuc2hhcGUocGFyYW1ldGVycywgW1wiKFwiLCBcInBhcmFtZXRlcl9kZWNsYXJhdGlvblwiLCBcIilcIl0pXG4gICAgY29uc3Qgdm9pZFBhcmFtZXRlciA9IHRoaXMucGFydHMocGFyYW1ldGVycylbMV1cblxuICAgIHRoaXMuc2hhcGUodm9pZFBhcmFtZXRlciwgW1wicHJpbWl0aXZlX3R5cGVcIl0pXG4gICAgaWYgKHRoaXMudGV4dCh0aGlzLnBhcnRzKHZvaWRQYXJhbWV0ZXIpWzBdKSAhPSBcInZvaWRcIikgdGhpcy5mYWlsKHZvaWRQYXJhbWV0ZXIsIFwibWFpbiBwYXJhbWV0ZXJzXCIpXG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKGJvZHkpXG4gICAgY29uc3QgY2xlYW51cCA9IHBhcnRzLmF0KC0zKVxuICAgIGNvbnN0IHN0YXR1cyA9IHBhcnRzLmF0KC0yKVxuXG4gICAgaWYgKCFjbGVhbnVwIHx8ICFzdGF0dXMgfHwgYm9keS50eXBlICE9IFwiY29tcG91bmRfc3RhdGVtZW50XCIpIHRoaXMuZmFpbChib2R5LCBcIm1haW4gY2xlYW51cFwiKVxuICAgIHRoaXMuc2hhcGUoYm9keSwgW1wie1wiLCAuLi5wYXJ0cy5zbGljZSgxLCAtMSksIFwifVwiXSlcbiAgICB0aGlzLnNoYXBlKGNsZWFudXAsIFtcImNhbGxfZXhwcmVzc2lvblwiLCBcIjtcIl0pXG4gICAgY29uc3QgY2FsbCA9IHRoaXMuY2FsbCh0aGlzLnBhcnRzKGNsZWFudXApWzBdKVxuXG4gICAgaWYgKHRoaXMudGV4dChjYWxsLm5hbWUpICE9IFwic2VtYW50aWZvbGRfY2xlYW51cFwiIHx8IGNhbGwuYXJndW1lbnRzLmxlbmd0aCAhPSAwKSB0aGlzLmZhaWwoY2xlYW51cCwgXCJlbnRyeSBjbGVhbnVwXCIpXG4gICAgdGhpcy5zaGFwZShzdGF0dXMsIFtcInJldHVyblwiLCBcIm51bWJlcl9saXRlcmFsXCIsIFwiO1wiXSlcbiAgICBpZiAodGhpcy50ZXh0KHRoaXMucGFydHMoc3RhdHVzKVsxXSkgIT0gXCIwXCIpIHRoaXMuZmFpbChzdGF0dXMsIFwiZW50cnkgc3RhdHVzXCIpXG4gICAgcmV0dXJuIHtraW5kOiBcIkVudHJ5UG9pbnRcIiwgbG9jYXRpb246IHRoaXMubG9jYXRpb24obm9kZSksIGJvZHk6IHtraW5kOiBcIkJsb2NrXCIsIGxvY2F0aW9uOiB0aGlzLmxvY2F0aW9uKGJvZHkpLFxuICAgICAgc3RhdGVtZW50czogdGhpcy5nZW5lcmF0ZWQgPyB0aGlzLmdlbmVyYXRlZFN0YXRlbWVudHMoYm9keS5jaGlsZHJlbi5tYXAoKHtub2RlOiBjaGlsZH0pID0+IGNoaWxkKS5maWx0ZXIoKGNoaWxkKSA9PlxuICAgICAgICBjaGlsZC5zdGFydEluZGV4ID4gYm9keS5zdGFydEluZGV4ICYmIGNoaWxkLmVuZEluZGV4IDw9IGNsZWFudXAuc3RhcnRJbmRleCkpXG4gICAgICAgIDogcGFydHMuc2xpY2UoMSwgLTMpLm1hcCgoY2hpbGQpID0+IHRoaXMuc3RhdGVtZW50KGNoaWxkKSl9fVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIG9uZSBjb21wbGV0ZSB0cmFuc2xhdGlvbiB1bml0IGFmdGVyIGV4aGF1c3RpdmUgcmVjb3ZlcnkgcmVqZWN0aW9uLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IHJvb3QgLSBGcm96ZW4gdHJhbnNsYXRpb24gdW5pdC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBWYWxpZGF0ZWQgc2VtYW50aWMgbW9kdWxlLlxuICAgKi9cbiAgbW9kdWxlKHJvb3QpIHtcbiAgICB0aGlzLnZhbGlkYXRlVHJlZShyb290KVxuICAgIHRoaXMuZ2VuZXJhdGVkID0gcm9vdC5jaGlsZHJlbi5zb21lKCh7bm9kZX0pID0+IG5vZGUudHlwZSA9PSBcImNvbW1lbnRcIiAmJiB0aGlzLnRleHQobm9kZSkgPT0gXCIvKiBzZW1hbnRpZm9sZDpwcm9ncmFtOmM6djEgKi9cIilcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkKSB0aGlzLnJlamVjdFNjYWZmb2xkQ29tbWVudHMocm9vdClcbiAgICBpZiAocm9vdC50eXBlICE9IFwidHJhbnNsYXRpb25fdW5pdFwiKSB0aGlzLmZhaWwocm9vdCwgXCJ0cmFuc2xhdGlvbiB1bml0IHJlcXVpcmVkXCIpXG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKHJvb3QpXG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSBwYXJ0cy5zbGljZSgxKS5maWx0ZXIoKG5vZGUpID0+ICF0aGlzLmdlbmVyYXRlZCB8fCBub2RlLnR5cGUgIT0gXCJkZWNsYXJhdGlvblwiKVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDMgfHwgcGFydHNbMF0udHlwZSAhPSBcInByZXByb2NfaW5jbHVkZVwiIHx8IGRlZmluaXRpb25zLnNvbWUoKG5vZGUpID0+IG5vZGUudHlwZSAhPSBcImZ1bmN0aW9uX2RlZmluaXRpb25cIikpIHRoaXMuZmFpbChyb290LCBcInRyYW5zbGF0aW9uIHVuaXQgbWVtYmVyc1wiKVxuICAgIGNvbnN0IGluY2x1ZGUgPSBwYXJ0c1swXVxuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZmllbGQoaW5jbHVkZSwgXCJwYXRoXCIpXG5cbiAgICB0aGlzLnNoYXBlKGluY2x1ZGUsIFtcIiNpbmNsdWRlXCIsIGhlYWRlcl0pXG4gICAgaWYgKGhlYWRlci50eXBlICE9IFwic3RyaW5nX2xpdGVyYWxcIiB8fCB0aGlzLnRleHQoaGVhZGVyKSAhPSAnXCJzZW1hbnRpZm9sZF9ydW50aW1lLmhcIicpIHRoaXMuZmFpbChpbmNsdWRlLCBcInN1cHBvcnQgaGVhZGVyIGluY2x1ZGVcIilcbiAgICBpZiAoZGVmaW5pdGlvbnMubGVuZ3RoIDwgMikgdGhpcy5mYWlsKHJvb3QsIFwic2VtYW50aWMgZnVuY3Rpb24gYW5kIG1haW4gcmVxdWlyZWRcIilcbiAgICBjb25zdCBtb2R1bGUgPSB7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTW9kdWxlXCIpLCBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbihyb290KSwgZnVuY3Rpb25zOiBkZWZpbml0aW9ucy5zbGljZSgwLCAtMSkubWFwKChub2RlKSA9PiB0aGlzLmZ1bmN0aW9uKG5vZGUpKSxcbiAgICAgIGVudHJ5UG9pbnQ6IHRoaXMubWFpbihkZWZpbml0aW9uc1tkZWZpbml0aW9ucy5sZW5ndGggLSAxXSl9XG5cbiAgICBpZiAodGhpcy5nZW5lcmF0ZWQpIHZhbGlkYXRlTmF0aXZlR3JhcGgobW9kdWxlKVxuICAgIGNvbnN0IHZhbGlkYXRlZCA9IHZhbGlkYXRlUGFyc2VkTW9kdWxlKG1vZHVsZSwgXCJjXCIpXG5cbiAgICB0aGlzLnZhbGlkYXRlUHJpbnRUeXBlcyh2YWxpZGF0ZWQpXG4gICAgaWYgKHRoaXMuZ2VuZXJhdGVkKSB7XG4gICAgICBjb25zdCBjYW5vbmljYWwgPSBnZW5lcmF0ZUNQcm9ncmFtKHttb2R1bGU6IHZhbGlkYXRlZH0pLmFydGlmYWN0c1swXS5jb250ZW50XG5cbiAgICAgIGlmICh0eXBlb2YgY2Fub25pY2FsICE9IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIkMgYmFja2VuZCByZXR1cm5lZCBhIG5vbnRleHQgZW50cnkgYXJ0aWZhY3QuXCIpXG4gICAgICB0aGlzLmNvbXBhcmVUcmVlKHJvb3QsIHBhcnNlQ3N0KGNhbm9uaWNhbCkucm9vdCwgbmV3IENSZWFkZXIodGhpcy5maWxlbmFtZSwgY2Fub25pY2FsKSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRlZFxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBuYXRpdmUgcHJpbnQgaGVscGVyIHNlbGVjdGlvbiBhZnRlciBzZW1hbnRpYyBzY2FsYXIgcmVzb2x1dGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gUmVzb2x2ZWQgbW9kdWxlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHZhbGlkYXRlUHJpbnRUeXBlcyhtb2R1bGUpIHtcbiAgICBjb25zdCBwbGFubmVyID0gbmV3IE9yZGVyZWRFeHByZXNzaW9uUGxhbm5lcihtb2R1bGUpXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIG9uZSBsZXhpY2FsIGJsb2NrIHdpdGggaXRzIHZpc2libGUgc2NhbGFyIGJpbmRpbmdzLlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gU2VtYW50aWMgYmxvY2suXG4gICAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lPn0gaW5oZXJpdGVkIC0gVmlzaWJsZSBiaW5kaW5ncy5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBjb25zdCB2aXNpdCA9IChibG9jaywgaW5oZXJpdGVkKSA9PiB7XG4gICAgICBjb25zdCBiaW5kaW5ncyA9IG5ldyBNYXAoaW5oZXJpdGVkKVxuXG4gICAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIikgYmluZGluZ3Muc2V0KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQudHlwZS5uYW1lKVxuICAgICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSB0aGlzLnByaW50VHlwZXMuZ2V0KHN0YXRlbWVudClcblxuICAgICAgICAgIGlmICghZXhwZWN0ZWQpIHRocm93IG5ldyBFcnJvcihcIkMgcHJpbnQgc3RhdGVtZW50IGxvc3QgaXRzIHBhcnNlciBoZWxwZXIgaWRlbnRpdHkuXCIpXG4gICAgICAgICAgaWYgKHBsYW5uZXIudHlwZShzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYmluZGluZ3MpICE9IGV4cGVjdGVkLnR5cGUpIHRoaXMuZmFpbChleHBlY3RlZC5ub2RlLCBcInByaW50IGhlbHBlciBzY2FsYXIgbWlzbWF0Y2hcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICAgICAgdmlzaXQoc3RhdGVtZW50LmNvbnNlcXVlbnQsIGJpbmRpbmdzKVxuICAgICAgICAgIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB2aXNpdChzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBiaW5kaW5ncylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmZ1bmN0aW9ucykgdmlzaXQoZGVjbGFyYXRpb24uYm9keSwgbmV3IE1hcChkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlci50eXBlLm5hbWVdKSkpXG4gICAgdmlzaXQobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgbmV3IE1hcCgpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlamVjdHMgcHJvZmlsZS1sb29raW5nIGNvbW1lbnRzIG91dHNpZGUgYSBjb21wbGV0ZSBjYW5vbmljYWwgZ2VuZXJhdGVkIHByb2dyYW0uXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIEN1cnJlbnQgbm9kZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWplY3RTY2FmZm9sZENvbW1lbnRzKG5vZGUpIHtcbiAgICBpZiAobm9kZS50eXBlID09IFwiY29tbWVudFwiICYmIC9zZW1hbnRpZm9sZDp8QHNlbWFudGlmb2xkL3UudGVzdCh0aGlzLnRleHQobm9kZSkpKSB0aGlzLmZhaWwobm9kZSwgXCJ1bnJlY29nbml6ZWQgc2NhZmZvbGQgY29tbWVudFwiKVxuICAgIGZvciAoY29uc3Qge25vZGU6IGNoaWxkfSBvZiBub2RlLmNoaWxkcmVuKSB0aGlzLnJlamVjdFNjYWZmb2xkQ29tbWVudHMoY2hpbGQpXG4gIH1cblxuICAvKipcbiAgICogUmV0YWlucyBldmVyeSBzY2FmZm9sZCBjb21tZW50IGFuZCBzdHJ1Y3R1cmFsIGVkZ2UsIGlnbm9yaW5nIG9ubHkgb3JkaW5hcnkgY29tbWVudHMuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIENTVCBwYXJlbnQuXG4gICAqIEByZXR1cm5zIHtDc3ROb2RlW119IENvbXBsZXRlIHNpZ25pZmljYW50IGNoaWxkIGxpc3QuXG4gICAqL1xuICBzaWduaWZpY2FudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ubWFwKCh7bm9kZTogY2hpbGR9KSA9PiBjaGlsZCkuZmlsdGVyKChjaGlsZCkgPT5cbiAgICAgIGNoaWxkLnR5cGUgIT0gXCJjb21tZW50XCIgfHwgL3NlbWFudGlmb2xkOnxAc2VtYW50aWZvbGQvdS50ZXN0KHRoaXMudGV4dChjaGlsZCkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGV2ZXJ5IHRva2VuLCBmaWVsZCwgdHlwZSwgdXNlLCBvcmRlcmluZyBlZGdlIGFuZCBjb25zdW1lciBhZ2FpbnN0IHRoZSBjYW5vbmljYWwgcGxhbi5cbiAgICogVGhpcyBjaGVja3MgdGhlIG9yaWdpbmFsIENTVDsgaXQgbmV2ZXIgcmVjb3ZlcnMgbWVhbmluZyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgdGV4dC5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBhY3R1YWwgLSBPcmlnaW5hbCB0cmVlIG5vZGUuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gZXhwZWN0ZWQgLSBDYW5vbmljYWwgdHJlZSBub2RlIGZvciB0aGUgcmVjb25zdHJ1Y3RlZCBzZW1hbnRpY3MuXG4gICAqIEBwYXJhbSB7Q1JlYWRlcn0gY2Fub25pY2FsIC0gQ2Fub25pY2FsIHRva2VuIHJlYWRlci5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjb21wYXJlVHJlZShhY3R1YWwsIGV4cGVjdGVkLCBjYW5vbmljYWwpIHtcbiAgICBpZiAoYWN0dWFsLnR5cGUgIT0gZXhwZWN0ZWQudHlwZSB8fCBhY3R1YWwubmFtZWQgIT0gZXhwZWN0ZWQubmFtZWQgfHwgYWN0dWFsLmV4dHJhICE9IGV4cGVjdGVkLmV4dHJhKSB0aGlzLmZhaWwoYWN0dWFsLCBcImdlbmVyYXRlZCBzY2FmZm9sZCBub2RlIHNoYXBlXCIpXG4gICAgY29uc3QgbGVmdCA9IHRoaXMuc2lnbmlmaWNhbnQoYWN0dWFsKVxuICAgIGNvbnN0IHJpZ2h0ID0gY2Fub25pY2FsLnNpZ25pZmljYW50KGV4cGVjdGVkKVxuXG4gICAgaWYgKGxlZnQubGVuZ3RoICE9IHJpZ2h0Lmxlbmd0aCkgdGhpcy5mYWlsKGFjdHVhbCwgXCJnZW5lcmF0ZWQgc2NhZmZvbGQgY2hpbGQgY291bnRcIilcbiAgICBpZiAoIWxlZnQubGVuZ3RoICYmIHRoaXMudGV4dChhY3R1YWwpICE9IGNhbm9uaWNhbC50ZXh0KGV4cGVjdGVkKSkgdGhpcy5mYWlsKGFjdHVhbCwgXCJnZW5lcmF0ZWQgc2NhZmZvbGQgdG9rZW4sIHR5cGUsIG9yZGVyIG9yIGNvbnN1bWVyXCIpXG4gICAgbGVmdC5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChhY3R1YWwuY2hpbGRyZW4uZmluZCgoZWRnZSkgPT4gZWRnZS5ub2RlID09PSBjaGlsZCk/LmZpZWxkICE9IGV4cGVjdGVkLmNoaWxkcmVuLmZpbmQoKGVkZ2UpID0+IGVkZ2Uubm9kZSA9PT0gcmlnaHRbaW5kZXhdKT8uZmllbGQpIHRoaXMuZmFpbChjaGlsZCwgXCJnZW5lcmF0ZWQgc2NhZmZvbGQgZmllbGRcIilcbiAgICAgIHRoaXMuY29tcGFyZVRyZWUoY2hpbGQsIHJpZ2h0W2luZGV4XSwgY2Fub25pY2FsKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVjb2duaXplcyB0aGUgc2hhcGUgb2YgYW4gaW5lcnQgZ2VuZXJhdGVkIHVudXNlZC1iaW5kaW5nIGNhc3Q7IGNhbm9uaWNhbCBjb21wYXJpc29uIGNoZWNrcyBpdHMgZXhhY3QgdGFyZ2V0IGFuZCBwbGFjZW1lbnQuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIENhbmRpZGF0ZSBzdGF0ZW1lbnQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoaXMgaXMgYSBkaXNjYXJkLXNoYXBlZCBjYW5kaWRhdGUuXG4gICAqL1xuICBkaXNjYXJkKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09IFwiZXhwcmVzc2lvbl9zdGF0ZW1lbnRcIiAmJiB0aGlzLnBhcnRzKG5vZGUpWzBdPy50eXBlID09IFwiY2FzdF9leHByZXNzaW9uXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbnN0cnVjdHMgcGFpcmVkIHN0YXRlbWVudCByZWdpb25zIGJlZm9yZSBtYW5kYXRvcnkgd2hvbGUtQ1NUIGNhbm9uaWNhbCB2ZXJpZmljYXRpb24uXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZVtdfSBjaGlsZHJlbiAtIE9yZGVyZWQgYmxvY2sgY2hpbGRyZW4gd2l0aG91dCBicmFjZXMgb3IgbWFpbiBjbGVhbnVwLlxuICAgKiBAcmV0dXJucyB7U3RhdGVtZW50W119IENhbmRpZGF0ZSBzZW1hbnRpYyBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgZ2VuZXJhdGVkU3RhdGVtZW50cyhjaGlsZHJlbikge1xuICAgIGNvbnN0IG5vZGVzID0gY2hpbGRyZW4uZmlsdGVyKChub2RlKSA9PiBub2RlLnR5cGUgIT0gXCJjb21tZW50XCIgfHwgL3NlbWFudGlmb2xkOnxAc2VtYW50aWZvbGQvdS50ZXN0KHRoaXMudGV4dChub2RlKSkpXG4gICAgLyoqIEB0eXBlIHtTdGF0ZW1lbnRbXX0gKi9cbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gW11cbiAgICBsZXQgY3Vyc29yID0gMFxuXG4gICAgd2hpbGUgKGN1cnNvciA8IG5vZGVzLmxlbmd0aCAmJiB0aGlzLmRpc2NhcmQobm9kZXNbY3Vyc29yXSkpIGN1cnNvcisrXG4gICAgd2hpbGUgKGN1cnNvciA8IG5vZGVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgYmVnaW4gPSBub2Rlc1tjdXJzb3IrK11cbiAgICAgIGNvbnN0IG1hdGNoID0gYmVnaW4udHlwZSA9PSBcImNvbW1lbnRcIiAmJiAvXlxcL1xcKiBzZW1hbnRpZm9sZDpvcmRlcmVkLWV4cHJlc3Npb246Yzp2MSBiZWdpbiAoWzAtOV17Nn0pIChbMC05YS1mXXs2NH0pIFxcKlxcLyQvdS5leGVjKHRoaXMudGV4dChiZWdpbikpXG5cbiAgICAgIGlmICghbWF0Y2gpIHRoaXMuZmFpbChiZWdpbiwgXCJjb21wbGV0ZSBvcmRlcmVkIHN0YXRlbWVudCByZWdpb24gcmVxdWlyZWRcIilcbiAgICAgIGNvbnN0IG91dGVyID0gdGhpcy50ZW1wb3JhcnlFeHByZXNzaW9uc1xuICAgICAgY29uc3Qgb3V0ZXJOYW1lcyA9IHRoaXMudGVtcG9yYXJ5TmFtZXNcblxuICAgICAgdGhpcy50ZW1wb3JhcnlFeHByZXNzaW9ucyA9IG5ldyBNYXAoKVxuICAgICAgdGhpcy50ZW1wb3JhcnlOYW1lcyA9IG5ldyBTZXQoKVxuICAgICAgd2hpbGUgKGN1cnNvciA8IG5vZGVzLmxlbmd0aCAmJiB0aGlzLnRlbXBvcmFyeURlY2xhcmF0aW9uKG5vZGVzW2N1cnNvcl0pKSBjdXJzb3IgPSB0aGlzLnJlYWRUZW1wb3Jhcnkobm9kZXMsIGN1cnNvcilcbiAgICAgIGNvbnN0IGNvbnN1bWVyID0gbm9kZXNbY3Vyc29yKytdXG5cbiAgICAgIGlmICghY29uc3VtZXIpIHRoaXMuZmFpbChiZWdpbiwgXCJtaXNzaW5nIG9yZGVyZWQgY29uc3VtZXJcIilcbiAgICAgIGNvbnN0IHN0YXRlbWVudCA9IHRoaXMuc3RhdGVtZW50KGNvbnN1bWVyKVxuXG4gICAgICBpZiAodGhpcy50ZW1wb3JhcnlFeHByZXNzaW9ucy5zaXplICE9IDApIHRoaXMuZmFpbChjb25zdW1lciwgXCJ1bmNvbnN1bWVkIG9yZGVyZWQgdGVtcG9yYXJ5XCIpXG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIgJiYgbm9kZXNbY3Vyc29yXSAmJiB0aGlzLmRpc2NhcmQobm9kZXNbY3Vyc29yXSkpIGN1cnNvcisrXG4gICAgICBjb25zdCBlbmQgPSBub2Rlc1tjdXJzb3IrK11cblxuICAgICAgaWYgKCFlbmQgfHwgZW5kLnR5cGUgIT0gXCJjb21tZW50XCIgfHwgdGhpcy50ZXh0KGVuZCkgIT0gYC8qIHNlbWFudGlmb2xkOm9yZGVyZWQtZXhwcmVzc2lvbjpjOnYxIGVuZCAke21hdGNoWzFdfSAke21hdGNoWzJdfSAqL2ApIHRoaXMuZmFpbChlbmQgPz8gYmVnaW4sIFwib3JkZXJlZCBtYXJrZXIgcGFpclwiKVxuICAgICAgdGhpcy50ZW1wb3JhcnlFeHByZXNzaW9ucyA9IG91dGVyXG4gICAgICB0aGlzLnRlbXBvcmFyeU5hbWVzID0gb3V0ZXJOYW1lc1xuICAgICAgc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudClcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVzIG9ubHkgYSBkZWNsYXJhdGlvbiBhdCB0aGUgY3VycmVudCByZWdpb24gbGV2ZWwsIHdpdGhvdXQgZGVzY2VuZGFudCBzZWFyY2hpbmcuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIENhbmRpZGF0ZSBub2RlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGlyZWN0IGluaXRpYWxpemVkIG5hbWUgdXNlcyB0aGUgcmVzZXJ2ZWQgcHJlZml4LlxuICAgKi9cbiAgdGVtcG9yYXJ5RGVjbGFyYXRpb24obm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgIT0gXCJkZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2VcbiAgICBjb25zdCBkZWNsYXJhdG9yID0gbm9kZS5jaGlsZHJlbi5maW5kKCh7ZmllbGR9KSA9PiBmaWVsZCA9PSBcImRlY2xhcmF0b3JcIik/Lm5vZGVcbiAgICBjb25zdCBuYW1lID0gZGVjbGFyYXRvcj8uY2hpbGRyZW4uZmluZCgoe2ZpZWxkfSkgPT4gZmllbGQgPT0gXCJkZWNsYXJhdG9yXCIpPy5ub2RlXG5cbiAgICByZXR1cm4gbmFtZT8udHlwZSA9PSBcImlkZW50aWZpZXJcIiAmJiB0aGlzLnRleHQobmFtZSkuc3RhcnRzV2l0aChcInNlbWFudGlmb2xkX29yZGVyZWRfXCIpXG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kcyBvbmUgY2FuZGlkYXRlIHRlbXBvcmFyeSwgaW5jbHVkaW5nIGl0cyBjb25kaXRpb25hbCBSSFMsIHJldGFpbmluZyBvcmlnaW5hbCBvcGVyYXRpb24gdG9rZW5zLlxuICAgKiBAcGFyYW0ge0NzdE5vZGVbXX0gbm9kZXMgLSBDdXJyZW50IGxleGljYWwgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJzb3IgLSBEZWNsYXJhdGlvbiBwb3NpdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gTmV4dCB1bmNvbnN1bWVkIHBvc2l0aW9uLlxuICAgKi9cbiAgcmVhZFRlbXBvcmFyeShub2RlcywgY3Vyc29yKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW2N1cnNvcisrXVxuICAgIGNvbnN0IGRlY2xhcmF0b3IgPSB0aGlzLmZpZWxkKG5vZGUsIFwiZGVjbGFyYXRvclwiKVxuICAgIGNvbnN0IG5hbWVOb2RlID0gdGhpcy5maWVsZChkZWNsYXJhdG9yLCBcImRlY2xhcmF0b3JcIilcbiAgICBjb25zdCBuYW1lID0gdGhpcy50ZXh0KG5hbWVOb2RlKVxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpZWxkKG5vZGUsIFwidHlwZVwiKVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWVsZChkZWNsYXJhdG9yLCBcInZhbHVlXCIpXG5cbiAgICB0aGlzLnNoYXBlKG5vZGUsIFt0eXBlLCBkZWNsYXJhdG9yLCBcIjtcIl0pXG4gICAgdGhpcy5zaGFwZShkZWNsYXJhdG9yLCBbbmFtZU5vZGUsIFwiPVwiLCB2YWx1ZV0pXG4gICAgdGhpcy50eXBlKHR5cGUpXG4gICAgaWYgKCEvXnNlbWFudGlmb2xkX29yZGVyZWRfWzAtOV17Nn0kL3UudGVzdChuYW1lKSB8fCB0aGlzLnRlbXBvcmFyeU5hbWVzPy5oYXMobmFtZSkpIHRoaXMuZmFpbChuYW1lTm9kZSwgXCJvcmRlcmVkIHRlbXBvcmFyeSBkZWNsYXJhdGlvblwiKVxuICAgIHRoaXMudGVtcG9yYXJ5TmFtZXM/LmFkZChuYW1lKVxuICAgIGxldCBleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uKHZhbHVlKVxuICAgIGNvbnN0IGJyYW5jaCA9IG5vZGVzW2N1cnNvcl1cblxuICAgIGlmIChicmFuY2g/LnR5cGUgPT0gXCJpZl9zdGF0ZW1lbnRcIiAmJiBbXCJpZGVudGlmaWVyXCIsIFwidHJ1ZVwiLCBcImZhbHNlXCJdLmluY2x1ZGVzKHZhbHVlLnR5cGUpKSB7XG4gICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLmZpZWxkKGJyYW5jaCwgXCJjb25kaXRpb25cIilcbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmZpZWxkKGJyYW5jaCwgXCJjb25zZXF1ZW5jZVwiKVxuXG4gICAgICB0aGlzLnNoYXBlKGJyYW5jaCwgW1wiaWZcIiwgY29uZGl0aW9uLCBib2R5XSlcbiAgICAgIHRoaXMuc2hhcGUoY29uZGl0aW9uLCBbXCIoXCIsIHRoaXMucGFydHMoY29uZGl0aW9uKVsxXSwgXCIpXCJdKVxuICAgICAgY29uc3QgdGVzdCA9IHRoaXMucGFydHMoY29uZGl0aW9uKVsxXVxuICAgICAgY29uc3QgaXNPciA9IHRlc3QudHlwZSA9PSBcInVuYXJ5X2V4cHJlc3Npb25cIlxuICAgICAgY29uc3QgdGFyZ2V0ID0gaXNPciA/IHRoaXMuZmllbGQodGVzdCwgXCJhcmd1bWVudFwiKSA6IHRlc3RcblxuICAgICAgaWYgKHRhcmdldC50eXBlICE9IFwiaWRlbnRpZmllclwiIHx8IHRoaXMudGV4dCh0YXJnZXQpICE9IG5hbWUpIHRoaXMuZmFpbCh0YXJnZXQsIFwic2hvcnQtY2lyY3VpdCB0ZW1wb3JhcnkgdGVzdFwiKVxuICAgICAgaWYgKGlzT3IpIHRoaXMuc2hhcGUodGVzdCwgW1wiIVwiLCB0YXJnZXRdKVxuICAgICAgaWYgKGJvZHkudHlwZSAhPSBcImNvbXBvdW5kX3N0YXRlbWVudFwiKSB0aGlzLmZhaWwoYm9keSwgXCJzaG9ydC1jaXJjdWl0IGJsb2NrXCIpXG4gICAgICBjb25zdCBpbnNpZGUgPSB0aGlzLnNpZ25pZmljYW50KGJvZHkpLnNsaWNlKDEsIC0xKVxuICAgICAgbGV0IG9mZnNldCA9IDBcblxuICAgICAgd2hpbGUgKG9mZnNldCA8IGluc2lkZS5sZW5ndGggJiYgdGhpcy50ZW1wb3JhcnlEZWNsYXJhdGlvbihpbnNpZGVbb2Zmc2V0XSkpIG9mZnNldCA9IHRoaXMucmVhZFRlbXBvcmFyeShpbnNpZGUsIG9mZnNldClcbiAgICAgIGlmIChvZmZzZXQgIT0gaW5zaWRlLmxlbmd0aCAtIDEpIHRoaXMuZmFpbChib2R5LCBcInNob3J0LWNpcmN1aXQgZmluYWwgd3JpdGVcIilcbiAgICAgIGNvbnN0IGFzc2lnbm1lbnQgPSBpbnNpZGVbb2Zmc2V0XVxuXG4gICAgICB0aGlzLnNoYXBlKGFzc2lnbm1lbnQsIFtcImFzc2lnbm1lbnRfZXhwcmVzc2lvblwiLCBcIjtcIl0pXG4gICAgICBjb25zdCBhc3NpZ25lZCA9IHRoaXMucGFydHMoYXNzaWdubWVudClbMF1cbiAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLmZpZWxkKGFzc2lnbmVkLCBcImxlZnRcIilcbiAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5maWVsZChhc3NpZ25lZCwgXCJyaWdodFwiKVxuXG4gICAgICB0aGlzLnNoYXBlKGFzc2lnbmVkLCBbbGVmdCwgXCI9XCIsIHJpZ2h0XSlcbiAgICAgIGlmIChsZWZ0LnR5cGUgIT0gXCJpZGVudGlmaWVyXCIgfHwgdGhpcy50ZXh0KGxlZnQpICE9IG5hbWUpIHRoaXMuZmFpbChsZWZ0LCBcInNob3J0LWNpcmN1aXQgcmVzdWx0IHdyaXRlXCIpXG4gICAgICB0aGlzLnNoYXBlKHJpZ2h0LCBbXCIoXCIsIFwiYmluYXJ5X2V4cHJlc3Npb25cIiwgXCIpXCJdKVxuICAgICAgY29uc3QgYmluYXJ5ID0gdGhpcy5wYXJ0cyhyaWdodClbMV1cbiAgICAgIGNvbnN0IHJlcGVhdGVkID0gdGhpcy5maWVsZChiaW5hcnksIFwibGVmdFwiKVxuICAgICAgY29uc3Qgb3BlcmFuZCA9IHRoaXMuZmllbGQoYmluYXJ5LCBcInJpZ2h0XCIpXG4gICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuZmllbGQoYmluYXJ5LCBcIm9wZXJhdG9yXCIpXG5cbiAgICAgIHRoaXMuc2hhcGUoYmluYXJ5LCBbcmVwZWF0ZWQsIGlzT3IgPyBcInx8XCIgOiBcIiYmXCIsIG9wZXJhbmRdKVxuICAgICAgaWYgKHJlcGVhdGVkLnR5cGUgIT0gXCJpZGVudGlmaWVyXCIgfHwgdGhpcy50ZXh0KHJlcGVhdGVkKSAhPSBuYW1lKSB0aGlzLmZhaWwocmVwZWF0ZWQsIFwic2hvcnQtY2lyY3VpdCBjb25zdW1lZCB2YWx1ZVwiKVxuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMuYmluYXJ5KG5vZGUsIGlzT3IgPyBcIk9yXCIgOiBcIkFuZFwiLCBleHByZXNzaW9uLCB0aGlzLmV4cHJlc3Npb24ob3BlcmFuZCksIG9wZXJhdG9yKVxuICAgICAgY3Vyc29yKytcbiAgICB9XG4gICAgdGhpcy50ZW1wb3JhcnlFeHByZXNzaW9ucz8uc2V0KG5hbWUsIGV4cHJlc3Npb24pXG4gICAgcmV0dXJuIGN1cnNvclxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIG9ubHkgdGhlIGZyb3plbiBsZWdhY3kgQ1NULCB3aXRoIG5vIHNvdXJjZS10ZXh0IHJlY292ZXJ5IHBhdGguXG4gKiBAcGFyYW0ge3tmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZ319IGlucHV0IC0gRXhhY3QgY2FsbGVyIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gUGFyc2VkIEMgc2VtYW50aWNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDKHtmaWxlbmFtZSwgc291cmNlfSkge1xuICBpZiAoIWhhc09ubHlVbmljb2RlU2NhbGFycyhzb3VyY2UpKSB7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBjcmVhdGVDb29yZGluYXRlSW5kZXgoc291cmNlKVxuICAgIGNvbnN0IG9mZnNldCA9IHNvdXJjZS5zZWFyY2goL1tcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/PCFbXFx1RDgwMC1cXHVEQkZGXSlbXFx1REMwMC1cXHVERkZGXS91KVxuXG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJQQVJTRV9FUlJPUlwiLCBsYW5ndWFnZTogXCJjXCIsIG1lc3NhZ2U6IFwiQyBzb3VyY2UgY29udGFpbnMgYSBsb25lIFVURi0xNiBzdXJyb2dhdGUuXCIsXG4gICAgICBsb2NhdGlvbjoge2ZpbGVuYW1lLCBzdGFydDogaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIG9mZnNldCksIGVuZDogaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIG9mZnNldCArIDEpfX0pXG4gIH1cbiAgaWYgKHNvdXJjZS5sZW5ndGggPiBtYXhpbXVtQ1NvdXJjZUxlbmd0aCkge1xuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gY3JlYXRlQ29vcmRpbmF0ZUluZGV4KHNvdXJjZSlcblxuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImNcIiwgXCJzb3VyY2UgZXhjZWVkcyB0aGUgZnJvemVuIEMgcGFyc2VyJ3MgMzI3NjcgVVRGLTE2IGlucHV0IGxpbWl0XCIsIHtcbiAgICAgIGZpbGVuYW1lLCBzdGFydDogaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIDApLCBlbmQ6IGluZGV4ZWRQb2ludEF0KGNvb3JkaW5hdGVzLCBzb3VyY2UubGVuZ3RoKVxuICAgIH0pXG4gIH1cbiAgbGV0IHNuYXBzaG90XG5cbiAgdHJ5IHtcbiAgICBzbmFwc2hvdCA9IHBhcnNlQ3N0KHNvdXJjZSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gcGFyc2VGYWlsdXJlKFwiY1wiLCBlcnJvcilcbiAgfVxuICBjb25zdCByZWFkZXIgPSBuZXcgQ1JlYWRlcihmaWxlbmFtZSwgc291cmNlKVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlYWRlci5tb2R1bGUoc25hcHNob3Qucm9vdClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAocmVhZGVyLmdlbmVyYXRlZCAmJiBlcnJvciBpbnN0YW5jZW9mIFNlbWFudGlmb2xkRGlhZ25vc3RpYyAmJiBlcnJvci5sYW5ndWFnZSA9PSBcImNcIiAmJlxuICAgICAgZXJyb3IuY29kZSAhPSBcIlBBUlNFX0VSUk9SXCIgJiYgZXJyb3IuY29kZSAhPSBcIlVOU1VQUE9SVEVEX1NZTlRBWFwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJjXCIsIGBpbnZhbGlkIGdlbmVyYXRlZCBvcmRlcmVkIHNjYWZmb2xkOiAke2Vycm9yLmNvZGV9YCwgZXJyb3IubG9jYXRpb24gPz8gcmVhZGVyLmxvY2F0aW9uKHNuYXBzaG90LnJvb3QpKVxuICAgIH1cbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG4iXX0=