semantifold 0.3.0 → 0.4.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 (297) hide show
  1. package/README.md +58 -15
  2. package/build/index.d.ts +48 -2
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +57 -8
  5. package/build/src/artifact-path.d.ts +23 -1
  6. package/build/src/artifact-path.d.ts.map +1 -1
  7. package/build/src/artifact-path.js +45 -3
  8. package/build/src/artifacts.d.ts.map +1 -1
  9. package/build/src/artifacts.js +66 -1
  10. package/build/src/backends/c-validation.d.ts.map +1 -1
  11. package/build/src/backends/c-validation.js +7 -3
  12. package/build/src/backends/cpp-validation.d.ts.map +1 -1
  13. package/build/src/backends/cpp-validation.js +7 -3
  14. package/build/src/backends/csharp.js +7 -1
  15. package/build/src/backends/dart-runtime.d.ts +2 -0
  16. package/build/src/backends/dart-runtime.d.ts.map +1 -0
  17. package/build/src/backends/dart-runtime.js +41 -0
  18. package/build/src/backends/dart.d.ts +20 -0
  19. package/build/src/backends/dart.d.ts.map +1 -0
  20. package/build/src/backends/dart.js +321 -0
  21. package/build/src/backends/effects.d.ts +60 -0
  22. package/build/src/backends/effects.d.ts.map +1 -0
  23. package/build/src/backends/effects.js +746 -0
  24. package/build/src/backends/go.js +18 -4
  25. package/build/src/backends/identifiers.d.ts +36 -4
  26. package/build/src/backends/identifiers.d.ts.map +1 -1
  27. package/build/src/backends/identifiers.js +154 -10
  28. package/build/src/backends/index.d.ts.map +1 -1
  29. package/build/src/backends/index.js +27 -4
  30. package/build/src/backends/ios.d.ts +68 -0
  31. package/build/src/backends/ios.d.ts.map +1 -0
  32. package/build/src/backends/ios.js +1503 -0
  33. package/build/src/backends/java.d.ts.map +1 -1
  34. package/build/src/backends/java.js +429 -36
  35. package/build/src/backends/javascript.d.ts +6 -0
  36. package/build/src/backends/javascript.d.ts.map +1 -1
  37. package/build/src/backends/javascript.js +380 -24
  38. package/build/src/backends/kotlin-runtime.d.ts +3 -0
  39. package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
  40. package/build/src/backends/kotlin-runtime.js +29 -0
  41. package/build/src/backends/kotlin.d.ts +23 -0
  42. package/build/src/backends/kotlin.d.ts.map +1 -0
  43. package/build/src/backends/kotlin.js +136 -0
  44. package/build/src/backends/native-validation.d.ts +2 -2
  45. package/build/src/backends/native-validation.d.ts.map +1 -1
  46. package/build/src/backends/native-validation.js +2 -2
  47. package/build/src/backends/ordered-expressions.d.ts.map +1 -1
  48. package/build/src/backends/ordered-expressions.js +39 -7
  49. package/build/src/backends/php-stdlib-support.d.ts +19 -0
  50. package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
  51. package/build/src/backends/php-stdlib-support.js +227 -0
  52. package/build/src/backends/php.d.ts.map +1 -1
  53. package/build/src/backends/php.js +448 -33
  54. package/build/src/backends/program.d.ts +81 -0
  55. package/build/src/backends/program.d.ts.map +1 -0
  56. package/build/src/backends/program.js +1308 -0
  57. package/build/src/backends/python.js +7 -1
  58. package/build/src/backends/ruby.d.ts.map +1 -1
  59. package/build/src/backends/ruby.js +310 -24
  60. package/build/src/backends/rust-runtime.d.ts +7 -0
  61. package/build/src/backends/rust-runtime.d.ts.map +1 -0
  62. package/build/src/backends/rust-runtime.js +32 -0
  63. package/build/src/backends/rust-validation.d.ts +9 -0
  64. package/build/src/backends/rust-validation.d.ts.map +1 -0
  65. package/build/src/backends/rust-validation.js +78 -0
  66. package/build/src/backends/rust.d.ts +24 -0
  67. package/build/src/backends/rust.d.ts.map +1 -0
  68. package/build/src/backends/rust.js +344 -0
  69. package/build/src/backends/scalars.d.ts +14 -6
  70. package/build/src/backends/scalars.d.ts.map +1 -1
  71. package/build/src/backends/scalars.js +167 -17
  72. package/build/src/backends/shared.d.ts +23 -4
  73. package/build/src/backends/shared.d.ts.map +1 -1
  74. package/build/src/backends/shared.js +2158 -62
  75. package/build/src/backends/stdlib-support.d.ts +14 -0
  76. package/build/src/backends/stdlib-support.d.ts.map +1 -0
  77. package/build/src/backends/stdlib-support.js +237 -0
  78. package/build/src/backends/swift-runtime.d.ts +3 -0
  79. package/build/src/backends/swift-runtime.d.ts.map +1 -0
  80. package/build/src/backends/swift-runtime.js +14 -0
  81. package/build/src/backends/swift.d.ts +8 -0
  82. package/build/src/backends/swift.d.ts.map +1 -0
  83. package/build/src/backends/swift.js +127 -0
  84. package/build/src/backends/typescript.d.ts.map +1 -1
  85. package/build/src/backends/typescript.js +344 -24
  86. package/build/src/backends/wasm.d.ts +43 -0
  87. package/build/src/backends/wasm.d.ts.map +1 -0
  88. package/build/src/backends/wasm.js +2164 -0
  89. package/build/src/backends/writer.d.ts +235 -4
  90. package/build/src/backends/writer.d.ts.map +1 -1
  91. package/build/src/backends/writer.js +468 -3
  92. package/build/src/diagnostic.d.ts +4 -3
  93. package/build/src/diagnostic.d.ts.map +1 -1
  94. package/build/src/diagnostic.js +5 -3
  95. package/build/src/frontends/c.d.ts.map +1 -1
  96. package/build/src/frontends/c.js +5 -3
  97. package/build/src/frontends/cpp.d.ts.map +1 -1
  98. package/build/src/frontends/cpp.js +5 -3
  99. package/build/src/frontends/csharp.d.ts.map +1 -1
  100. package/build/src/frontends/csharp.js +7 -3
  101. package/build/src/frontends/dart.d.ts +10 -0
  102. package/build/src/frontends/dart.d.ts.map +1 -0
  103. package/build/src/frontends/dart.js +913 -0
  104. package/build/src/frontends/index.d.ts +3 -1
  105. package/build/src/frontends/index.d.ts.map +1 -1
  106. package/build/src/frontends/index.js +15 -5
  107. package/build/src/frontends/java.d.ts +110 -1
  108. package/build/src/frontends/java.d.ts.map +1 -1
  109. package/build/src/frontends/java.js +1725 -70
  110. package/build/src/frontends/javascript-typescript.d.ts +69 -1
  111. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  112. package/build/src/frontends/javascript-typescript.js +1825 -93
  113. package/build/src/frontends/kotlin.d.ts +10 -0
  114. package/build/src/frontends/kotlin.d.ts.map +1 -0
  115. package/build/src/frontends/kotlin.js +685 -0
  116. package/build/src/frontends/php.d.ts +118 -1
  117. package/build/src/frontends/php.d.ts.map +1 -1
  118. package/build/src/frontends/php.js +1583 -76
  119. package/build/src/frontends/program.d.ts +74 -0
  120. package/build/src/frontends/program.d.ts.map +1 -0
  121. package/build/src/frontends/program.js +989 -0
  122. package/build/src/frontends/ruby.d.ts +68 -1
  123. package/build/src/frontends/ruby.d.ts.map +1 -1
  124. package/build/src/frontends/ruby.js +1446 -101
  125. package/build/src/frontends/rust-parser.d.ts +11 -0
  126. package/build/src/frontends/rust-parser.d.ts.map +1 -0
  127. package/build/src/frontends/rust-parser.js +15 -0
  128. package/build/src/frontends/rust.d.ts +14 -0
  129. package/build/src/frontends/rust.d.ts.map +1 -0
  130. package/build/src/frontends/rust.js +715 -0
  131. package/build/src/frontends/scalars.d.ts +10 -0
  132. package/build/src/frontends/scalars.d.ts.map +1 -1
  133. package/build/src/frontends/scalars.js +28 -2
  134. package/build/src/frontends/swift.d.ts +10 -0
  135. package/build/src/frontends/swift.d.ts.map +1 -0
  136. package/build/src/frontends/swift.js +860 -0
  137. package/build/src/frontends/types.d.ts +186 -0
  138. package/build/src/frontends/types.d.ts.map +1 -0
  139. package/build/src/frontends/types.js +634 -0
  140. package/build/src/language-registry.d.ts +46 -4
  141. package/build/src/language-registry.d.ts.map +1 -1
  142. package/build/src/language-registry.js +167 -13
  143. package/build/src/mapping.d.ts +2 -2
  144. package/build/src/mapping.d.ts.map +1 -1
  145. package/build/src/mapping.js +31 -10
  146. package/build/src/semantic/capabilities.d.ts +66 -0
  147. package/build/src/semantic/capabilities.d.ts.map +1 -0
  148. package/build/src/semantic/capabilities.js +649 -0
  149. package/build/src/semantic/effects.d.ts +26 -0
  150. package/build/src/semantic/effects.d.ts.map +1 -0
  151. package/build/src/semantic/effects.js +764 -0
  152. package/build/src/semantic/generics.d.ts +23 -0
  153. package/build/src/semantic/generics.d.ts.map +1 -0
  154. package/build/src/semantic/generics.js +61 -0
  155. package/build/src/semantic/lifetime.d.ts +37 -0
  156. package/build/src/semantic/lifetime.d.ts.map +1 -0
  157. package/build/src/semantic/lifetime.js +527 -0
  158. package/build/src/semantic/provenance.d.ts +9 -2
  159. package/build/src/semantic/provenance.d.ts.map +1 -1
  160. package/build/src/semantic/provenance.js +462 -20
  161. package/build/src/semantic/scalars.d.ts +11 -0
  162. package/build/src/semantic/scalars.d.ts.map +1 -1
  163. package/build/src/semantic/scalars.js +16 -1
  164. package/build/src/semantic/stdlib.d.ts +254 -0
  165. package/build/src/semantic/stdlib.d.ts.map +1 -0
  166. package/build/src/semantic/stdlib.js +880 -0
  167. package/build/src/semantic/types.d.ts +2952 -202
  168. package/build/src/semantic/types.d.ts.map +1 -1
  169. package/build/src/semantic/types.js +688 -15
  170. package/build/src/semantic/validate.d.ts +85 -5
  171. package/build/src/semantic/validate.d.ts.map +1 -1
  172. package/build/src/semantic/validate.js +2576 -98
  173. package/build/src/stdlib-facades.d.ts +304 -0
  174. package/build/src/stdlib-facades.d.ts.map +1 -0
  175. package/build/src/stdlib-facades.js +1167 -0
  176. package/build/src/stdlib-negotiation.d.ts +69 -0
  177. package/build/src/stdlib-negotiation.d.ts.map +1 -0
  178. package/build/src/stdlib-negotiation.js +403 -0
  179. package/build/src/stdlib-providers.d.ts +72 -0
  180. package/build/src/stdlib-providers.d.ts.map +1 -0
  181. package/build/src/stdlib-providers.js +339 -0
  182. package/build/src/toolchains.d.ts +55 -1
  183. package/build/src/toolchains.d.ts.map +1 -1
  184. package/build/src/toolchains.js +15 -4
  185. package/docs/architecture.md +45 -13
  186. package/docs/dart.md +60 -0
  187. package/docs/goals.md +3 -3
  188. package/docs/ios.md +121 -0
  189. package/docs/kotlin.md +42 -0
  190. package/docs/language-support.md +231 -26
  191. package/docs/multi-file-modules.md +52 -0
  192. package/docs/parser-qualification.md +121 -8
  193. package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
  194. package/docs/rust.md +88 -0
  195. package/docs/source-maps.md +15 -7
  196. package/docs/standard-library-portability.md +39 -8
  197. package/docs/swift.md +44 -0
  198. package/docs/testing.md +366 -4
  199. package/docs/webassembly.md +52 -0
  200. package/index.js +63 -8
  201. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
  202. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
  203. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
  204. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
  205. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
  231. package/package.json +5 -2
  232. package/src/artifact-path.js +47 -2
  233. package/src/artifacts.js +67 -0
  234. package/src/backends/c-validation.js +6 -1
  235. package/src/backends/cpp-validation.js +6 -1
  236. package/src/backends/csharp.js +3 -0
  237. package/src/backends/dart-runtime.js +41 -0
  238. package/src/backends/dart.js +326 -0
  239. package/src/backends/effects.js +705 -0
  240. package/src/backends/go.js +14 -2
  241. package/src/backends/identifiers.js +160 -9
  242. package/src/backends/index.js +27 -2
  243. package/src/backends/ios.js +1612 -0
  244. package/src/backends/java.js +454 -36
  245. package/src/backends/javascript.js +389 -23
  246. package/src/backends/kotlin-runtime.js +29 -0
  247. package/src/backends/kotlin.js +141 -0
  248. package/src/backends/native-validation.js +1 -1
  249. package/src/backends/ordered-expressions.js +40 -6
  250. package/src/backends/php-stdlib-support.js +239 -0
  251. package/src/backends/php.js +469 -32
  252. package/src/backends/program.js +1407 -0
  253. package/src/backends/python.js +3 -0
  254. package/src/backends/ruby.js +326 -23
  255. package/src/backends/rust-runtime.js +34 -0
  256. package/src/backends/rust-validation.js +75 -0
  257. package/src/backends/rust.js +335 -0
  258. package/src/backends/scalars.js +141 -16
  259. package/src/backends/shared.js +2304 -124
  260. package/src/backends/stdlib-support.js +234 -0
  261. package/src/backends/swift-runtime.js +14 -0
  262. package/src/backends/swift.js +132 -0
  263. package/src/backends/typescript.js +349 -23
  264. package/src/backends/wasm.js +2208 -0
  265. package/src/backends/writer.js +520 -2
  266. package/src/diagnostic.js +4 -2
  267. package/src/frontends/c.js +4 -2
  268. package/src/frontends/cpp.js +4 -2
  269. package/src/frontends/csharp.js +4 -2
  270. package/src/frontends/dart.js +963 -0
  271. package/src/frontends/index.js +14 -4
  272. package/src/frontends/java.js +1977 -69
  273. package/src/frontends/javascript-typescript.js +2046 -102
  274. package/src/frontends/kotlin.js +713 -0
  275. package/src/frontends/php.js +1725 -79
  276. package/src/frontends/program.js +1062 -0
  277. package/src/frontends/ruby.js +1624 -98
  278. package/src/frontends/rust-parser.js +18 -0
  279. package/src/frontends/rust.js +714 -0
  280. package/src/frontends/scalars.js +31 -1
  281. package/src/frontends/swift.js +893 -0
  282. package/src/frontends/types.js +750 -0
  283. package/src/language-registry.js +172 -12
  284. package/src/mapping.js +33 -9
  285. package/src/semantic/capabilities.js +671 -0
  286. package/src/semantic/effects.js +737 -0
  287. package/src/semantic/generics.js +58 -0
  288. package/src/semantic/lifetime.js +517 -0
  289. package/src/semantic/provenance.js +412 -19
  290. package/src/semantic/scalars.js +17 -0
  291. package/src/semantic/stdlib.js +921 -0
  292. package/src/semantic/types.js +765 -14
  293. package/src/semantic/validate.js +2934 -209
  294. package/src/stdlib-facades.js +1211 -0
  295. package/src/stdlib-negotiation.js +446 -0
  296. package/src/stdlib-providers.js +377 -0
  297. package/src/toolchains.js +16 -3
@@ -2,16 +2,26 @@
2
2
  import { isDenseArray } from "./array.js";
3
3
  import { SemantifoldDiagnostic, unsupportedRole } from "./diagnostic.js";
4
4
  import { generateJava } from "./backends/java.js";
5
+ import { generateKotlin } from "./backends/kotlin.js";
5
6
  import { generateCSharpProject } from "./backends/csharp.js";
6
7
  import { generateGoModule } from "./backends/go.js";
8
+ import { generateRustProject } from "./backends/rust.js";
9
+ import { generateSwift } from "./backends/swift.js";
10
+ import { generateDartPackage } from "./backends/dart.js";
7
11
  import { generateJavaScript } from "./backends/javascript.js";
8
12
  import { generatePhp } from "./backends/php.js";
9
13
  import { generatePython } from "./backends/python.js";
10
14
  import { generateRuby } from "./backends/ruby.js";
11
15
  import { generateTypeScript } from "./backends/typescript.js";
16
+ import { generateBrowserWasm } from "./backends/wasm.js";
17
+ import { generateIosApplication } from "./backends/ios.js";
12
18
  import { parseJava } from "./frontends/java.js";
19
+ import { parseKotlin } from "./frontends/kotlin.js";
13
20
  import { parseCSharp } from "./frontends/csharp.js";
14
21
  import { parseGo } from "./frontends/go.js";
22
+ import { parseRust } from "./frontends/rust.js";
23
+ import { parseSwift } from "./frontends/swift.js";
24
+ import { parseDart } from "./frontends/dart.js";
15
25
  import { parseCpp } from "./frontends/cpp.js";
16
26
  import { generateCpp } from "./backends/cpp.js";
17
27
  import { parseC } from "./frontends/c.js";
@@ -25,20 +35,33 @@ const acceptanceStageOrder = ["parse", "generate", "restore", "compile", "link",
25
35
  const acceptanceStages = new Map(acceptanceStageOrder.map((stage, index) => [stage, index]));
26
36
  const registryKeys = new Set([
27
37
  "acceptance", "applicationBackend", "artifactMultiplicity", "binaryBackend", "defaultFilename", "frontend", "id",
28
- "interoperability", "mapping", "mediaType", "roundTrip", "textBackend"
38
+ "features", "interoperability", "mapping", "mediaType", "provider", "roundTrip", "textBackend"
29
39
  ]);
30
40
  /** @typedef {"frontend" | "textBackend" | "binaryBackend" | "applicationBackend" | "interoperability"} RegistryRole */
31
- /** @typedef {(input: {filename: string, source: string}) => import("./semantic/types.js").SemanticModule} Frontend */
32
41
  /** @typedef {(...values: unknown[]) => unknown} RegistryImplementation */
42
+ /**
43
+ * @typedef FrontendInput
44
+ * @property {readonly import("./semantic/types.js").EffectCapabilityDeclaration[]} [capabilities] - Compiler-authorized declarations.
45
+ * @property {string} filename - Source filename.
46
+ * @property {string} source - Source text.
47
+ * @property {{isEntry: boolean, functions: Map<string, import("./semantic/types.js").FunctionDeclaration>, records: Map<string, import("./semantic/types.js").RecordDeclaration>, errors?: Map<string, import("./semantic/types.js").ErrorDeclaration>, valueRecords?: Map<string, import("./semantic/types.js").RecordDeclaration>}} [program] - Program conversion context.
48
+ */
49
+ /**
50
+ * @callback Frontend
51
+ * @param {FrontendInput} input - Frontend request.
52
+ * @returns {import("./semantic/types.js").SemanticModule} Semantic module.
53
+ */
33
54
  /**
34
55
  * @typedef LanguageRegistryRecord
35
56
  * @property {string} id - Stable identity.
36
57
  * @property {{stages: import("./semantic/types.js").AcceptanceStage[], toolchains: string[]}} acceptance - Acceptance declaration.
37
58
  * @property {"single" | "multiple"} artifactMultiplicity - Artifact multiplicity.
59
+ * @property {import("./semantic/types.js").LanguageFeatureCapabilities} features - Semantic feature capabilities.
38
60
  * @property {import("./semantic/types.js").LanguageMappingCapabilities} mapping - Mapping capabilities.
39
61
  * @property {boolean} roundTrip - Round-trip declaration.
40
62
  * @property {string} [defaultFilename] - Default backend filename.
41
63
  * @property {string} [mediaType] - Default backend media type.
64
+ * @property {boolean} [provider] - Target host stdlib provider/native-binding role.
42
65
  * @property {RegistryImplementation} [frontend] - Frontend adapter.
43
66
  * @property {RegistryImplementation} [textBackend] - Text backend.
44
67
  * @property {RegistryImplementation} [binaryBackend] - Binary backend.
@@ -76,6 +99,9 @@ export function createLanguageRegistry(candidateRecords) {
76
99
  invalidRegistry(`Duplicate registry ID '${id}'.`, id);
77
100
  if (Object.keys(candidate).some((key) => !registryKeys.has(key)))
78
101
  invalidRegistry(`Registry record '${id}' has unknown fields.`, id);
102
+ if (candidate.provider !== undefined && typeof candidate.provider != "boolean") {
103
+ invalidRegistry(`Registry record '${id}' declares an invalid provider role.`, id);
104
+ }
79
105
  for (const role of registryRoles) {
80
106
  if (candidate[role] !== undefined && typeof candidate[role] != "function") {
81
107
  invalidRegistry(`Registry role '${role}' for '${id}' must be a function when present.`, id);
@@ -87,6 +113,47 @@ export function createLanguageRegistry(candidateRecords) {
87
113
  }
88
114
  if (typeof candidate.roundTrip != "boolean")
89
115
  invalidRegistry(`Registry record '${id}' requires a Boolean round-trip declaration.`, id);
116
+ const featuresCandidate = candidate.features ?? {
117
+ closedRecords: false,
118
+ conditionControlledLoops: false,
119
+ effectfulCapabilitiesAndResources: false,
120
+ generalFunctionsAndCalls: false,
121
+ immutableCollections: false,
122
+ optionalValues: false,
123
+ orderedListIteration: false,
124
+ orderedMapIteration: false,
125
+ referenceClasses: false,
126
+ typedErrors: false,
127
+ typeParametersAndGenerics: false
128
+ };
129
+ if (!isPlainObject(featuresCandidate) ||
130
+ Object.keys(featuresCandidate).sort().join(",") != "closedRecords,conditionControlledLoops,effectfulCapabilitiesAndResources,generalFunctionsAndCalls,immutableCollections,optionalValues,orderedListIteration,orderedMapIteration,referenceClasses,typeParametersAndGenerics,typedErrors" ||
131
+ typeof featuresCandidate.closedRecords != "boolean" ||
132
+ typeof featuresCandidate.conditionControlledLoops != "boolean" ||
133
+ typeof featuresCandidate.effectfulCapabilitiesAndResources != "boolean" ||
134
+ typeof featuresCandidate.generalFunctionsAndCalls != "boolean" ||
135
+ typeof featuresCandidate.immutableCollections != "boolean" ||
136
+ typeof featuresCandidate.optionalValues != "boolean" ||
137
+ typeof featuresCandidate.orderedListIteration != "boolean" ||
138
+ typeof featuresCandidate.orderedMapIteration != "boolean" ||
139
+ typeof featuresCandidate.referenceClasses != "boolean" ||
140
+ typeof featuresCandidate.typedErrors != "boolean" ||
141
+ typeof featuresCandidate.typeParametersAndGenerics != "boolean") {
142
+ invalidRegistry(`Registry record '${id}' has an invalid feature declaration.`, id);
143
+ }
144
+ const features = deepFreeze(/** @type {import("./semantic/types.js").LanguageFeatureCapabilities} */ ({
145
+ closedRecords: featuresCandidate.closedRecords,
146
+ conditionControlledLoops: featuresCandidate.conditionControlledLoops,
147
+ effectfulCapabilitiesAndResources: featuresCandidate.effectfulCapabilitiesAndResources,
148
+ generalFunctionsAndCalls: featuresCandidate.generalFunctionsAndCalls,
149
+ immutableCollections: featuresCandidate.immutableCollections,
150
+ optionalValues: featuresCandidate.optionalValues,
151
+ orderedListIteration: featuresCandidate.orderedListIteration,
152
+ orderedMapIteration: featuresCandidate.orderedMapIteration,
153
+ referenceClasses: featuresCandidate.referenceClasses,
154
+ typedErrors: featuresCandidate.typedErrors,
155
+ typeParametersAndGenerics: featuresCandidate.typeParametersAndGenerics
156
+ }));
90
157
  const mappingCandidate = candidate.mapping;
91
158
  if (!isPlainObject(mappingCandidate))
92
159
  invalidRegistry(`Registry record '${id}' has an invalid mapping declaration.`, id);
@@ -138,7 +205,7 @@ export function createLanguageRegistry(candidateRecords) {
138
205
  const hasBinaryBackend = typeof candidate.binaryBackend == "function";
139
206
  const hasApplicationBackend = typeof candidate.applicationBackend == "function";
140
207
  const hasBackend = hasTextBackend || hasBinaryBackend || hasApplicationBackend;
141
- if ((mapping.richText || mapping.sourceMapV3) && !hasTextBackend ||
208
+ if ((mapping.richText || mapping.sourceMapV3 || mapping.binaryRanges) && !hasBackend ||
142
209
  mapping.sourceMapV3 && !mapping.richText ||
143
210
  mapping.binaryRanges && !hasBinaryBackend && !hasApplicationBackend) {
144
211
  invalidRegistry(`Registry record '${id}' declares mapping support without its required backend role.`, id);
@@ -149,11 +216,12 @@ export function createLanguageRegistry(candidateRecords) {
149
216
  if (stages.includes("parse") && !hasFrontend || stages.includes("generate") && !hasBackend) {
150
217
  invalidRegistry(`Registry record '${id}' declares an acceptance stage without its required role.`, id);
151
218
  }
152
- if ((hasBackend || candidate.defaultFilename !== undefined) &&
219
+ const hasDefaultedBackend = hasTextBackend || hasBinaryBackend;
220
+ if ((hasDefaultedBackend || candidate.defaultFilename !== undefined) &&
153
221
  (typeof candidate.defaultFilename != "string" || candidate.defaultFilename.length == 0)) {
154
222
  invalidRegistry(`Registry backend '${id}' requires a default filename.`, id);
155
223
  }
156
- if ((hasBackend || candidate.mediaType !== undefined) &&
224
+ if ((hasDefaultedBackend || candidate.mediaType !== undefined) &&
157
225
  (typeof candidate.mediaType != "string" || candidate.mediaType.length == 0)) {
158
226
  invalidRegistry(`Registry backend '${id}' requires a media type.`, id);
159
227
  }
@@ -164,11 +232,13 @@ export function createLanguageRegistry(candidateRecords) {
164
232
  const record = deepFreeze(/** @type {LanguageRegistryRecord} */ ({
165
233
  acceptance,
166
234
  artifactMultiplicity,
235
+ features,
167
236
  id,
168
237
  mapping,
169
238
  roundTrip: candidate.roundTrip,
170
239
  ...(typeof candidate.defaultFilename == "string" ? { defaultFilename: candidate.defaultFilename } : {}),
171
240
  ...(typeof candidate.mediaType == "string" ? { mediaType: candidate.mediaType } : {}),
241
+ ...(typeof candidate.provider == "boolean" ? { provider: candidate.provider } : {}),
172
242
  ...(typeof candidate.frontend == "function" ? { frontend: candidate.frontend } : {}),
173
243
  ...(typeof candidate.textBackend == "function" ? { textBackend: candidate.textBackend } : {}),
174
244
  ...(typeof candidate.binaryBackend == "function" ? { binaryBackend: candidate.binaryBackend } : {}),
@@ -178,6 +248,7 @@ export function createLanguageRegistry(candidateRecords) {
178
248
  const descriptor = deepFreeze(/** @type {import("./semantic/types.js").LanguageCapabilities} */ ({
179
249
  acceptance,
180
250
  artifactMultiplicity,
251
+ features,
181
252
  id,
182
253
  mapping,
183
254
  roles: {
@@ -185,6 +256,7 @@ export function createLanguageRegistry(candidateRecords) {
185
256
  binaryBackend: typeof candidate.binaryBackend == "function",
186
257
  frontend: typeof candidate.frontend == "function",
187
258
  interoperability: typeof candidate.interoperability == "function",
259
+ provider: candidate.provider === true,
188
260
  textBackend: typeof candidate.textBackend == "function"
189
261
  },
190
262
  roundTrip: candidate.roundTrip
@@ -220,27 +292,32 @@ export function createLanguageRegistry(candidateRecords) {
220
292
  * PHP registry frontend wrapper.
221
293
  * @type {Frontend}
222
294
  */
223
- const phpFrontend = ({ filename, source }) => parsePhp({ filename, source });
295
+ const phpFrontend = ({ capabilities, filename, program, source }) => parsePhp({ capabilities, filename, program, source });
224
296
  /**
225
297
  * Ruby registry frontend wrapper.
226
298
  * @type {Frontend}
227
299
  */
228
- const rubyFrontend = ({ filename, source }) => parseRuby({ filename, source });
300
+ const rubyFrontend = ({ capabilities, filename, program, source }) => parseRuby({ capabilities, filename, program, source });
229
301
  /**
230
302
  * JavaScript registry frontend wrapper.
231
303
  * @type {Frontend}
232
304
  */
233
- const javaScriptFrontend = ({ filename, source }) => parseJavaScriptTypeScript({ filename, language: "javascript", source });
305
+ const javaScriptFrontend = ({ capabilities, filename, program, source }) => parseJavaScriptTypeScript({ capabilities, filename, language: "javascript", program, source });
234
306
  /**
235
307
  * TypeScript registry frontend wrapper.
236
308
  * @type {Frontend}
237
309
  */
238
- const typeScriptFrontend = ({ filename, source }) => parseJavaScriptTypeScript({ filename, language: "typescript", source });
310
+ const typeScriptFrontend = ({ capabilities, filename, program, source }) => parseJavaScriptTypeScript({ capabilities, filename, language: "typescript", program, source });
239
311
  /**
240
312
  * Java registry frontend wrapper.
241
313
  * @type {Frontend}
242
314
  */
243
- const javaFrontend = ({ filename, source }) => parseJava({ filename, source });
315
+ const javaFrontend = ({ capabilities, filename, program, source }) => parseJava({ capabilities, filename, program, source });
316
+ /**
317
+ * Kotlin registry frontend wrapper.
318
+ * @type {Frontend}
319
+ */
320
+ const kotlinFrontend = ({ filename, source }) => parseKotlin({ filename, source });
244
321
  /**
245
322
  * Python registry frontend wrapper.
246
323
  * @type {Frontend}
@@ -256,9 +333,14 @@ const csharpFrontend = ({ filename, source }) => parseCSharp({ filename, source
256
333
  * @type {Frontend}
257
334
  */
258
335
  const goFrontend = ({ filename, source }) => parseGo({ filename, source });
336
+ /**
337
+ * Dart registry frontend wrapper.
338
+ * @type {Frontend}
339
+ */
340
+ const dartFrontend = ({ filename, source }) => parseDart({ filename, source });
259
341
  const records = [
260
342
  language({
261
- acceptance: { stages: ["parse", "generate", "execute"], toolchains: ["php"] },
343
+ acceptance: { stages: ["parse", "generate", "execute"], toolchains: ["php82"] },
262
344
  defaultFilename: "program.php",
263
345
  frontend: phpFrontend,
264
346
  id: "php",
@@ -297,6 +379,14 @@ const records = [
297
379
  mediaType: "text/x-java-source",
298
380
  textBackend: generateJava
299
381
  }),
382
+ language({
383
+ acceptance: { stages: ["parse", "generate", "compile", "execute"], toolchains: ["kotlinc", "java25"] },
384
+ defaultFilename: "Program.kt",
385
+ frontend: kotlinFrontend,
386
+ id: "kotlin",
387
+ mediaType: "text/x-kotlin",
388
+ textBackend: generateKotlin
389
+ }),
300
390
  language({
301
391
  acceptance: { stages: ["parse", "generate", "compile", "execute"], toolchains: ["python"] },
302
392
  defaultFilename: "program.py",
@@ -335,7 +425,57 @@ const records = [
335
425
  language({
336
426
  acceptance: { stages: ["parse", "generate", "compile", "link", "execute"], toolchains: ["clangpp"] },
337
427
  defaultFilename: "program.cpp", frontend: parseCpp, id: "cpp", mediaType: "text/x-c++src", textBackend: generateCpp
338
- })
428
+ }),
429
+ language({
430
+ acceptance: { stages: ["parse", "generate", "compile", "validate", "execute"], toolchains: ["rustc", "cargo"] },
431
+ artifactMultiplicity: "multiple",
432
+ defaultFilename: "src/main.rs", frontend: parseRust, id: "rust", mediaType: "text/x-rust", textBackend: generateRustProject
433
+ }),
434
+ language({ acceptance: { stages: ["parse", "generate", "compile", "execute"], toolchains: ["swiftc"] },
435
+ defaultFilename: "program.swift", frontend: parseSwift, id: "swift", mediaType: "text/x-swift", textBackend: generateSwift }),
436
+ language({
437
+ acceptance: { stages: ["parse", "generate", "restore", "compile", "validate", "execute"], toolchains: ["dart"] },
438
+ artifactMultiplicity: "multiple",
439
+ defaultFilename: "bin/program.dart",
440
+ features: {
441
+ closedRecords: false,
442
+ conditionControlledLoops: false,
443
+ effectfulCapabilitiesAndResources: false,
444
+ generalFunctionsAndCalls: true,
445
+ immutableCollections: false,
446
+ optionalValues: false,
447
+ orderedListIteration: false,
448
+ orderedMapIteration: false,
449
+ referenceClasses: false,
450
+ typedErrors: false,
451
+ typeParametersAndGenerics: false
452
+ },
453
+ frontend: dartFrontend,
454
+ id: "dart",
455
+ mediaType: "text/x-dart",
456
+ textBackend: generateDartPackage
457
+ }),
458
+ {
459
+ acceptance: { stages: ["generate", "validate", "instantiate", "execute"], toolchains: ["wasm-validate", "node", "chromium"] },
460
+ applicationBackend: generateBrowserWasm,
461
+ artifactMultiplicity: "multiple",
462
+ binaryBackend: generateBrowserWasm,
463
+ defaultFilename: "program.wasm",
464
+ features: { closedRecords: false, conditionControlledLoops: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
465
+ id: "wasm",
466
+ mapping: { binaryRanges: true, richText: true, sourceMapV3: true },
467
+ mediaType: "application/wasm",
468
+ roundTrip: false
469
+ },
470
+ {
471
+ acceptance: { stages: ["generate"], toolchains: [] },
472
+ applicationBackend: generateIosApplication,
473
+ artifactMultiplicity: "multiple",
474
+ features: { closedRecords: false, conditionControlledLoops: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
475
+ id: "ios",
476
+ mapping: { binaryRanges: true, richText: true, sourceMapV3: true },
477
+ roundTrip: false
478
+ }
339
479
  ];
340
480
  export const languageRegistry = createLanguageRegistry(records);
341
481
  export const languageCapabilities = languageRegistry.descriptors;
@@ -351,7 +491,21 @@ export const supportedLanguages = Object.freeze(languageCapabilities
351
491
  function language(values) {
352
492
  return {
353
493
  artifactMultiplicity: "single",
494
+ features: {
495
+ closedRecords: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
496
+ conditionControlledLoops: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
497
+ effectfulCapabilitiesAndResources: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
498
+ generalFunctionsAndCalls: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
499
+ immutableCollections: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
500
+ optionalValues: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
501
+ orderedListIteration: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
502
+ orderedMapIteration: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
503
+ referenceClasses: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
504
+ typedErrors: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
505
+ typeParametersAndGenerics: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id))
506
+ },
354
507
  mapping: { binaryRanges: false, richText: true, sourceMapV3: true },
508
+ provider: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
355
509
  roundTrip: true,
356
510
  ...values
357
511
  };
@@ -418,4 +572,4 @@ function deepFreeze(value) {
418
572
  deepFreeze(nested);
419
573
  return Object.freeze(value);
420
574
  }
421
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2UtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFuZ3VhZ2UtcmVnaXN0cnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGVBQWUsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMvQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQTtBQUMxRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUMzRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDN0MsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFBO0FBQ25ELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMvQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUMzRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUE7QUFDN0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFBO0FBQ2pELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDM0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQzdDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNoRCxPQUFPLEVB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dGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtpc0RlbnNlQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljLCB1bnN1cHBvcnRlZFJvbGV9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUphdmF9IGZyb20gXCIuL2JhY2tlbmRzL2phdmEuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUNTaGFycFByb2plY3R9IGZyb20gXCIuL2JhY2tlbmRzL2NzaGFycC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlR29Nb2R1bGV9IGZyb20gXCIuL2JhY2tlbmRzL2dvLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVKYXZhU2NyaXB0fSBmcm9tIFwiLi9iYWNrZW5kcy9qYXZhc2NyaXB0LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVQaHB9IGZyb20gXCIuL2JhY2tlbmRzL3BocC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlUHl0aG9ufSBmcm9tIFwiLi9iYWNrZW5kcy9weXRob24uanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVJ1Ynl9IGZyb20gXCIuL2JhY2tlbmRzL3J1YnkuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVR5cGVTY3JpcHR9IGZyb20gXCIuL2JhY2tlbmRzL3R5cGVzY3JpcHQuanNcIlxuaW1wb3J0IHtwYXJzZUphdmF9IGZyb20gXCIuL2Zyb250ZW5kcy9qYXZhLmpzXCJcbmltcG9ydCB7cGFyc2VDU2hhcnB9IGZyb20gXCIuL2Zyb250ZW5kcy9jc2hhcnAuanNcIlxuaW1wb3J0IHtwYXJzZUdvfSBmcm9tIFwiLi9mcm9udGVuZHMvZ28uanNcIlxuaW1wb3J0IHtwYXJzZUNwcH0gZnJvbSBcIi4vZnJvbnRlbmRzL2NwcC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlQ3BwfSBmcm9tIFwiLi9iYWNrZW5kcy9jcHAuanNcIlxuaW1wb3J0IHtwYXJzZUN9IGZyb20gXCIuL2Zyb250ZW5kcy9jLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVDUHJvZ3JhbX0gZnJvbSBcIi4vYmFja2VuZHMvYy5qc1wiXG5pbXBvcnQge3BhcnNlSmF2YVNjcmlwdFR5cGVTY3JpcHR9IGZyb20gXCIuL2Zyb250ZW5kcy9qYXZhc2NyaXB0LXR5cGVzY3JpcHQuanNcIlxuaW1wb3J0IHtwYXJzZVBocH0gZnJvbSBcIi4vZnJvbnRlbmRzL3BocC5qc1wiXG5pbXBvcnQge3BhcnNlUHl0aG9ufSBmcm9tIFwiLi9mcm9udGVuZHMvcHl0aG9uLmpzXCJcbmltcG9ydCB7cGFyc2VSdWJ5fSBmcm9tIFwiLi9mcm9udGVuZHMvcnVieS5qc1wiXG5cbmNvbnN0IHJlZ2lzdHJ5Um9sZXMgPSBPYmplY3QuZnJlZXplKFtcImZyb250ZW5kXCIsIFwidGV4dEJhY2tlbmRcIiwgXCJiaW5hcnlCYWNrZW5kXCIsIFwiYXBwbGljYXRpb25CYWNrZW5kXCIsIFwiaW50ZXJvcGVyYWJpbGl0eVwiXSlcbmNvbnN0IGFjY2VwdGFuY2VTdGFnZU9yZGVyID0gW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcInJlc3RvcmVcIiwgXCJjb21waWxlXCIsIFwibGlua1wiLCBcInZhbGlkYXRlXCIsIFwiaW5zdGFudGlhdGVcIiwgXCJleGVjdXRlXCJdXG5jb25zdCBhY2NlcHRhbmNlU3RhZ2VzID0gbmV3IE1hcChhY2NlcHRhbmNlU3RhZ2VPcmRlci5tYXAoKHN0YWdlLCBpbmRleCkgPT4gW3N0YWdlLCBpbmRleF0pKVxuY29uc3QgcmVnaXN0cnlLZXlzID0gbmV3IFNldChbXG4gIFwiYWNjZXB0YW5jZVwiLCBcImFwcGxpY2F0aW9uQmFja2VuZFwiLCBcImFydGlmYWN0TXVsdGlwbGljaXR5XCIsIFwiYmluYXJ5QmFja2VuZFwiLCBcImRlZmF1bHRGaWxlbmFtZVwiLCBcImZyb250ZW5kXCIsIFwiaWRcIixcbiAgXCJpbnRlcm9wZXJhYmlsaXR5XCIsIFwibWFwcGluZ1wiLCBcIm1lZGlhVHlwZVwiLCBcInJvdW5kVHJpcFwiLCBcInRleHRCYWNrZW5kXCJcbl0pXG5cbi8qKiBAdHlwZWRlZiB7XCJmcm9udGVuZFwiIHwgXCJ0ZXh0QmFja2VuZFwiIHwgXCJiaW5hcnlCYWNrZW5kXCIgfCBcImFwcGxpY2F0aW9uQmFja2VuZFwiIHwgXCJpbnRlcm9wZXJhYmlsaXR5XCJ9IFJlZ2lzdHJ5Um9sZSAqL1xuLyoqIEB0eXBlZGVmIHsoaW5wdXQ6IHtmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZ30pID0+IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IEZyb250ZW5kICovXG4vKiogQHR5cGVkZWYgeyguLi52YWx1ZXM6IHVua25vd25bXSkgPT4gdW5rbm93bn0gUmVnaXN0cnlJbXBsZW1lbnRhdGlvbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlUmVnaXN0cnlSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7e3N0YWdlczogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2VbXSwgdG9vbGNoYWluczogc3RyaW5nW119fSBhY2NlcHRhbmNlIC0gQWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7XCJzaW5nbGVcIiB8IFwibXVsdGlwbGVcIn0gYXJ0aWZhY3RNdWx0aXBsaWNpdHkgLSBBcnRpZmFjdCBtdWx0aXBsaWNpdHkuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VNYXBwaW5nQ2FwYWJpbGl0aWVzfSBtYXBwaW5nIC0gTWFwcGluZyBjYXBhYmlsaXRpZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJvdW5kVHJpcCAtIFJvdW5kLXRyaXAgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RlZmF1bHRGaWxlbmFtZV0gLSBEZWZhdWx0IGJhY2tlbmQgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21lZGlhVHlwZV0gLSBEZWZhdWx0IGJhY2tlbmQgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gW2Zyb250ZW5kXSAtIEZyb250ZW5kIGFkYXB0ZXIuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFt0ZXh0QmFja2VuZF0gLSBUZXh0IGJhY2tlbmQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFtiaW5hcnlCYWNrZW5kXSAtIEJpbmFyeSBiYWNrZW5kLlxuICogQHByb3BlcnR5IHtSZWdpc3RyeUltcGxlbWVudGF0aW9ufSBbYXBwbGljYXRpb25CYWNrZW5kXSAtIEFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFtpbnRlcm9wZXJhYmlsaXR5XSAtIEludGVyb3BlcmFiaWxpdHkgYnJpZGdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VSZWdpc3RyeVxuICogQHByb3BlcnR5IHtyZWFkb25seSBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlQ2FwYWJpbGl0aWVzW119IGRlc2NyaXB0b3JzIC0gUHVibGljIGRlc2NyaXB0b3JzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gaWRzIC0gUmVnaXN0ZXJlZCBJRHMgaW4gc3RhYmxlIG9yZGVyLlxuICogQHByb3BlcnR5IHsoaWQ6IHN0cmluZykgPT4gUmVhZG9ubHk8TGFuZ3VhZ2VSZWdpc3RyeVJlY29yZD59IHJlY29yZCAtIEV4YWN0IHJlY29yZCBsb29rdXAuXG4gKiBAcHJvcGVydHkgeyhpZDogc3RyaW5nLCByb2xlOiBSZWdpc3RyeVJvbGUsIGxvY2F0aW9uPzogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gUmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gcmVzb2x2ZSAtIFJvbGUgbG9va3VwLlxuICovXG5cbi8qKlxuICogQ29uc3RydWN0cyBhbiBpbW11dGFibGUgcm9sZSByZWdpc3RyeSBmcm9tIG9yZGVyZWQgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlUmVjb3JkcyAtIE9yZGVyZWQgbGFuZ3VhZ2UgcmVjb3Jkcy5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxMYW5ndWFnZVJlZ2lzdHJ5Pn0gUmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVJlZ2lzdHJ5KGNhbmRpZGF0ZVJlY29yZHMpIHtcbiAgaWYgKCFpc0RlbnNlQXJyYXkoY2FuZGlkYXRlUmVjb3JkcykpIGludmFsaWRSZWdpc3RyeShcIlJlZ2lzdHJ5IHJlY29yZHMgbXVzdCBiZSBhbiBvcmRlcmVkIGRlbnNlIGFycmF5LlwiKVxuXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgUmVhZG9ubHk8TGFuZ3VhZ2VSZWdpc3RyeVJlY29yZD4+fSAqL1xuICBjb25zdCByZWNvcmRzQnlJZCA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VDYXBhYmlsaXRpZXNbXX0gKi9cbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBbXVxuXG4gIGZvciAobGV0IHJlY29yZEluZGV4ID0gMDsgcmVjb3JkSW5kZXggPCBjYW5kaWRhdGVSZWNvcmRzLmxlbmd0aDsgcmVjb3JkSW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZVJlY29yZHNbcmVjb3JkSW5kZXhdXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoY2FuZGlkYXRlKSkgaW52YWxpZFJlZ2lzdHJ5KFwiRXZlcnkgcmVnaXN0cnkgcmVjb3JkIG11c3QgYmUgYSBwbGFpbiBvYmplY3QuXCIpXG4gICAgY29uc3QgaWQgPSBjYW5kaWRhdGUuaWRcblxuICAgIGlmICh0eXBlb2YgaWQgIT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT0gMCB8fCAhL15bYS16XVthLXowLTktXSokL3UudGVzdChpZCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShcIkV2ZXJ5IHJlZ2lzdHJ5IHJlY29yZCByZXF1aXJlcyBhIHN0YWJsZSBsb3dlcmNhc2UgSUQuXCIsIHR5cGVvZiBpZCA9PSBcInN0cmluZ1wiID8gaWQgOiB1bmRlZmluZWQpXG4gICAgfVxuICAgIGlmIChyZWNvcmRzQnlJZC5oYXMoaWQpKSBpbnZhbGlkUmVnaXN0cnkoYER1cGxpY2F0ZSByZWdpc3RyeSBJRCAnJHtpZH0nLmAsIGlkKVxuICAgIGlmIChPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvbWUoKGtleSkgPT4gIXJlZ2lzdHJ5S2V5cy5oYXMoa2V5KSkpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIHVua25vd24gZmllbGRzLmAsIGlkKVxuXG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJlZ2lzdHJ5Um9sZXMpIHtcbiAgICAgIGlmIChjYW5kaWRhdGVbcm9sZV0gIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgY2FuZGlkYXRlW3JvbGVdICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJvbGUgJyR7cm9sZX0nIGZvciAnJHtpZH0nIG11c3QgYmUgYSBmdW5jdGlvbiB3aGVuIHByZXNlbnQuYCwgaWQpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFydGlmYWN0TXVsdGlwbGljaXR5ID0gY2FuZGlkYXRlLmFydGlmYWN0TXVsdGlwbGljaXR5XG5cbiAgICBpZiAoYXJ0aWZhY3RNdWx0aXBsaWNpdHkgIT0gXCJzaW5nbGVcIiAmJiBhcnRpZmFjdE11bHRpcGxpY2l0eSAhPSBcIm11bHRpcGxlXCIpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgYXJ0aWZhY3QgbXVsdGlwbGljaXR5LmAsIGlkKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZS5yb3VuZFRyaXAgIT0gXCJib29sZWFuXCIpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgcmVxdWlyZXMgYSBCb29sZWFuIHJvdW5kLXRyaXAgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgY29uc3QgbWFwcGluZ0NhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5tYXBwaW5nXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QobWFwcGluZ0NhbmRpZGF0ZSkpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgbWFwcGluZyBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICBjb25zdCBtYXBwaW5nU25hcHNob3QgPSB7XG4gICAgICBiaW5hcnlSYW5nZXM6IG1hcHBpbmdDYW5kaWRhdGUuYmluYXJ5UmFuZ2VzLFxuICAgICAgcmljaFRleHQ6IG1hcHBpbmdDYW5kaWRhdGUucmljaFRleHQsXG4gICAgICBzb3VyY2VNYXBWMzogbWFwcGluZ0NhbmRpZGF0ZS5zb3VyY2VNYXBWM1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWFwcGluZ1NuYXBzaG90LnJpY2hUZXh0ICE9IFwiYm9vbGVhblwiIHx8IHR5cGVvZiBtYXBwaW5nU25hcHNob3Quc291cmNlTWFwVjMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBtYXBwaW5nU25hcHNob3QuYmluYXJ5UmFuZ2VzICE9IFwiYm9vbGVhblwiKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBhbiBpbnZhbGlkIG1hcHBpbmcgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSBkZWVwRnJlZXplKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXN9ICovIChtYXBwaW5nU25hcHNob3QpKVxuICAgIGNvbnN0IGFjY2VwdGFuY2VDYW5kaWRhdGUgPSBjYW5kaWRhdGUuYWNjZXB0YW5jZVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjY2VwdGFuY2VDYW5kaWRhdGUpIHx8ICFpc0RlbnNlQXJyYXkoYWNjZXB0YW5jZUNhbmRpZGF0ZS5zdGFnZXMpIHx8XG4gICAgICAhaXNEZW5zZUFycmF5KGFjY2VwdGFuY2VDYW5kaWRhdGUudG9vbGNoYWlucykpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgYWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICB9XG4gICAgLyoqIEB0eXBlIHt1bmtub3duW119ICovXG4gICAgY29uc3Qgc3RhZ2VTbmFwc2hvdCA9IFtdXG4gICAgLyoqIEB0eXBlIHt1bmtub3duW119ICovXG4gICAgY29uc3QgdG9vbGNoYWluU25hcHNob3QgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFjY2VwdGFuY2VDYW5kaWRhdGUuc3RhZ2VzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RhZ2VTbmFwc2hvdC5wdXNoKGFjY2VwdGFuY2VDYW5kaWRhdGUuc3RhZ2VzW2luZGV4XSlcbiAgICB9XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFjY2VwdGFuY2VDYW5kaWRhdGUudG9vbGNoYWlucy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHRvb2xjaGFpblNuYXBzaG90LnB1c2goYWNjZXB0YW5jZUNhbmRpZGF0ZS50b29sY2hhaW5zW2luZGV4XSlcbiAgICB9XG4gICAgaWYgKCFzdGFnZVNuYXBzaG90LmV2ZXJ5KChzdGFnZSkgPT4gdHlwZW9mIHN0YWdlID09IFwic3RyaW5nXCIgJiYgYWNjZXB0YW5jZVN0YWdlcy5oYXMoc3RhZ2UpKSB8fFxuICAgICAgIXRvb2xjaGFpblNuYXBzaG90LmV2ZXJ5KCh0b29sY2hhaW4pID0+IHR5cGVvZiB0b29sY2hhaW4gPT0gXCJzdHJpbmdcIiAmJiB0b29sY2hhaW4ubGVuZ3RoID4gMCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgYWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICB9XG4gICAgY29uc3Qgc3RhZ2VzID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VTdGFnZVtdfSAqLyAoc3RhZ2VTbmFwc2hvdClcbiAgICBjb25zdCB0b29sY2hhaW5zID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKHRvb2xjaGFpblNuYXBzaG90KVxuICAgIGxldCBwcmV2aW91c1N0YWdlID0gLTFcbiAgICBjb25zdCBkZWNsYXJlZFN0YWdlcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBzdGFnZSBvZiBzdGFnZXMpIHtcbiAgICAgIGNvbnN0IHN0YWdlSW5kZXggPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGFjY2VwdGFuY2VTdGFnZXMuZ2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc3RhZ2UpKSlcblxuICAgICAgaWYgKGRlY2xhcmVkU3RhZ2VzLmhhcyhzdGFnZSkgfHwgc3RhZ2VJbmRleCA8IHByZXZpb3VzU3RhZ2UpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIHVub3JkZXJlZCBvciBkdXBsaWNhdGUgYWNjZXB0YW5jZSBzdGFnZXMuYCwgaWQpXG4gICAgICBkZWNsYXJlZFN0YWdlcy5hZGQoc3RhZ2UpXG4gICAgICBwcmV2aW91c1N0YWdlID0gc3RhZ2VJbmRleFxuICAgIH1cbiAgICBpZiAobmV3IFNldCh0b29sY2hhaW5zKS5zaXplICE9IHRvb2xjaGFpbnMubGVuZ3RoKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBkdXBsaWNhdGUgYWNjZXB0YW5jZSB0b29sY2hhaW5zLmAsIGlkKVxuICAgIH1cblxuICAgIGNvbnN0IGhhc0Zyb250ZW5kID0gdHlwZW9mIGNhbmRpZGF0ZS5mcm9udGVuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNUZXh0QmFja2VuZCA9IHR5cGVvZiBjYW5kaWRhdGUudGV4dEJhY2tlbmQgPT0gXCJmdW5jdGlvblwiXG4gICAgY29uc3QgaGFzQmluYXJ5QmFja2VuZCA9IHR5cGVvZiBjYW5kaWRhdGUuYmluYXJ5QmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNBcHBsaWNhdGlvbkJhY2tlbmQgPSB0eXBlb2YgY2FuZGlkYXRlLmFwcGxpY2F0aW9uQmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNCYWNrZW5kID0gaGFzVGV4dEJhY2tlbmQgfHwgaGFzQmluYXJ5QmFja2VuZCB8fCBoYXNBcHBsaWNhdGlvbkJhY2tlbmRcblxuICAgIGlmICgobWFwcGluZy5yaWNoVGV4dCB8fCBtYXBwaW5nLnNvdXJjZU1hcFYzKSAmJiAhaGFzVGV4dEJhY2tlbmQgfHxcbiAgICAgIG1hcHBpbmcuc291cmNlTWFwVjMgJiYgIW1hcHBpbmcucmljaFRleHQgfHxcbiAgICAgIG1hcHBpbmcuYmluYXJ5UmFuZ2VzICYmICFoYXNCaW5hcnlCYWNrZW5kICYmICFoYXNBcHBsaWNhdGlvbkJhY2tlbmQpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGVjbGFyZXMgbWFwcGluZyBzdXBwb3J0IHdpdGhvdXQgaXRzIHJlcXVpcmVkIGJhY2tlbmQgcm9sZS5gLCBpZClcbiAgICB9XG4gICAgaWYgKGNhbmRpZGF0ZS5yb3VuZFRyaXAgJiYgKCFoYXNGcm9udGVuZCB8fCAhaGFzQmFja2VuZCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGVjbGFyZXMgcm91bmQtdHJpcCBzdXBwb3J0IHdpdGhvdXQgZnJvbnRlbmQgYW5kIGJhY2tlbmQgcm9sZXMuYCwgaWQpXG4gICAgfVxuICAgIGlmIChzdGFnZXMuaW5jbHVkZXMoXCJwYXJzZVwiKSAmJiAhaGFzRnJvbnRlbmQgfHwgc3RhZ2VzLmluY2x1ZGVzKFwiZ2VuZXJhdGVcIikgJiYgIWhhc0JhY2tlbmQpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGVjbGFyZXMgYW4gYWNjZXB0YW5jZSBzdGFnZSB3aXRob3V0IGl0cyByZXF1aXJlZCByb2xlLmAsIGlkKVxuICAgIH1cblxuICAgIGlmICgoaGFzQmFja2VuZCB8fCBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAodHlwZW9mIGNhbmRpZGF0ZS5kZWZhdWx0RmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lLmxlbmd0aCA9PSAwKSkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSBiYWNrZW5kICcke2lkfScgcmVxdWlyZXMgYSBkZWZhdWx0IGZpbGVuYW1lLmAsIGlkKVxuICAgIH1cbiAgICBpZiAoKGhhc0JhY2tlbmQgfHwgY2FuZGlkYXRlLm1lZGlhVHlwZSAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgKHR5cGVvZiBjYW5kaWRhdGUubWVkaWFUeXBlICE9IFwic3RyaW5nXCIgfHwgY2FuZGlkYXRlLm1lZGlhVHlwZS5sZW5ndGggPT0gMCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgYmFja2VuZCAnJHtpZH0nIHJlcXVpcmVzIGEgbWVkaWEgdHlwZS5gLCBpZClcbiAgICB9XG5cbiAgICBjb25zdCBhY2NlcHRhbmNlID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VBY2NlcHRhbmNlQ2FwYWJpbGl0aWVzfSAqLyAoe1xuICAgICAgc3RhZ2VzLFxuICAgICAgdG9vbGNoYWluc1xuICAgIH0pKVxuICAgIGNvbnN0IHJlY29yZCA9IGRlZXBGcmVlemUoLyoqIEB0eXBlIHtMYW5ndWFnZVJlZ2lzdHJ5UmVjb3JkfSAqLyAoe1xuICAgICAgYWNjZXB0YW5jZSxcbiAgICAgIGFydGlmYWN0TXVsdGlwbGljaXR5LFxuICAgICAgaWQsXG4gICAgICBtYXBwaW5nLFxuICAgICAgcm91bmRUcmlwOiBjYW5kaWRhdGUucm91bmRUcmlwLFxuICAgICAgLi4uKHR5cGVvZiBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lID09IFwic3RyaW5nXCIgPyB7ZGVmYXVsdEZpbGVuYW1lOiBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lfSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY2FuZGlkYXRlLm1lZGlhVHlwZSA9PSBcInN0cmluZ1wiID8ge21lZGlhVHlwZTogY2FuZGlkYXRlLm1lZGlhVHlwZX0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5mcm9udGVuZCA9PSBcImZ1bmN0aW9uXCIgPyB7ZnJvbnRlbmQ6IGNhbmRpZGF0ZS5mcm9udGVuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS50ZXh0QmFja2VuZCA9PSBcImZ1bmN0aW9uXCIgPyB7dGV4dEJhY2tlbmQ6IGNhbmRpZGF0ZS50ZXh0QmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5iaW5hcnlCYWNrZW5kID09IFwiZnVuY3Rpb25cIiA/IHtiaW5hcnlCYWNrZW5kOiBjYW5kaWRhdGUuYmluYXJ5QmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5hcHBsaWNhdGlvbkJhY2tlbmQgPT0gXCJmdW5jdGlvblwiID8ge2FwcGxpY2F0aW9uQmFja2VuZDogY2FuZGlkYXRlLmFwcGxpY2F0aW9uQmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5pbnRlcm9wZXJhYmlsaXR5ID09IFwiZnVuY3Rpb25cIiA/IHtpbnRlcm9wZXJhYmlsaXR5OiBjYW5kaWRhdGUuaW50ZXJvcGVyYWJpbGl0eX0gOiB7fSlcbiAgICB9KSlcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VDYXBhYmlsaXRpZXN9ICovICh7XG4gICAgICBhY2NlcHRhbmNlLFxuICAgICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHksXG4gICAgICBpZCxcbiAgICAgIG1hcHBpbmcsXG4gICAgICByb2xlczoge1xuICAgICAgICBhcHBsaWNhdGlvbkJhY2tlbmQ6IHR5cGVvZiBjYW5kaWRhdGUuYXBwbGljYXRpb25CYWNrZW5kID09IFwiZnVuY3Rpb25cIixcbiAgICAgICAgYmluYXJ5QmFja2VuZDogdHlwZW9mIGNhbmRpZGF0ZS5iaW5hcnlCYWNrZW5kID09IFwiZnVuY3Rpb25cIixcbiAgICAgICAgZnJvbnRlbmQ6IHR5cGVvZiBjYW5kaWRhdGUuZnJvbnRlbmQgPT0gXCJmdW5jdGlvblwiLFxuICAgICAgICBpbnRlcm9wZXJhYmlsaXR5OiB0eXBlb2YgY2FuZGlkYXRlLmludGVyb3BlcmFiaWxpdHkgPT0gXCJmdW5jdGlvblwiLFxuICAgICAgICB0ZXh0QmFja2VuZDogdHlwZW9mIGNhbmRpZGF0ZS50ZXh0QmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICAgIH0sXG4gICAgICByb3VuZFRyaXA6IGNhbmRpZGF0ZS5yb3VuZFRyaXBcbiAgICB9KSlcblxuICAgIHJlY29yZHNCeUlkLnNldChpZCwgcmVjb3JkKVxuICAgIGRlc2NyaXB0b3JzLnB1c2goZGVzY3JpcHRvcilcbiAgfVxuXG4gIGNvbnN0IGZyb3plbkRlc2NyaXB0b3JzID0gZGVlcEZyZWV6ZShkZXNjcmlwdG9ycylcbiAgY29uc3QgaWRzID0gT2JqZWN0LmZyZWV6ZShmcm96ZW5EZXNjcmlwdG9ycy5tYXAoKHtpZH0pID0+IGlkKSlcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgZGVzY3JpcHRvcnM6IGZyb3plbkRlc2NyaXB0b3JzLFxuICAgIGlkcyxcbiAgICByZWNvcmQoaWQpIHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNCeUlkLmdldChpZClcblxuICAgICAgaWYgKCFyZWNvcmQpIHVuc3VwcG9ydGVkTGFuZ3VhZ2UoaWQpXG5cbiAgICAgIHJldHVybiByZWNvcmRcbiAgICB9LFxuICAgIHJlc29sdmUoaWQsIHJvbGUsIGxvY2F0aW9uKSB7XG4gICAgICBpZiAoIXJlZ2lzdHJ5Um9sZXMuaW5jbHVkZXMocm9sZSkpIGludmFsaWRSZWdpc3RyeShgVW5rbm93biByZWdpc3RyeSByb2xlICcke3JvbGV9Jy5gLCBpZClcbiAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNCeUlkLmdldChpZClcblxuICAgICAgaWYgKCFyZWNvcmQpIHVuc3VwcG9ydGVkTGFuZ3VhZ2UoaWQsIGxvY2F0aW9uLCByb2xlKVxuICAgICAgY29uc3QgaW1wbGVtZW50YXRpb24gPSByZWNvcmRbcm9sZV1cblxuICAgICAgaWYgKHR5cGVvZiBpbXBsZW1lbnRhdGlvbiAhPSBcImZ1bmN0aW9uXCIpIHVuc3VwcG9ydGVkUm9sZShpZCwgcHVibGljUm9sZU5hbWUocm9sZSksIGxvY2F0aW9uKVxuXG4gICAgICByZXR1cm4gaW1wbGVtZW50YXRpb25cbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogUEhQIHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IHBocEZyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VQaHAoe2ZpbGVuYW1lLCBzb3VyY2V9KVxuXG4vKipcbiAqIFJ1YnkgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgcnVieUZyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VSdWJ5KHtmaWxlbmFtZSwgc291cmNlfSlcblxuLyoqXG4gKiBKYXZhU2NyaXB0IHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IGphdmFTY3JpcHRGcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlSmF2YVNjcmlwdFR5cGVTY3JpcHQoe2ZpbGVuYW1lLCBsYW5ndWFnZTogXCJqYXZhc2NyaXB0XCIsIHNvdXJjZX0pXG5cbi8qKlxuICogVHlwZVNjcmlwdCByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCB0eXBlU2NyaXB0RnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZUphdmFTY3JpcHRUeXBlU2NyaXB0KHtmaWxlbmFtZSwgbGFuZ3VhZ2U6IFwidHlwZXNjcmlwdFwiLCBzb3VyY2V9KVxuXG4vKipcbiAqIEphdmEgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgamF2YUZyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VKYXZhKHtmaWxlbmFtZSwgc291cmNlfSlcblxuLyoqXG4gKiBQeXRob24gcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgcHl0aG9uRnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZVB5dGhvbih7ZmlsZW5hbWUsIHNvdXJjZX0pXG5cbi8qKlxuICogQyMgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgY3NoYXJwRnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZUNTaGFycCh7ZmlsZW5hbWUsIHNvdXJjZX0pXG5cbi8qKlxuICogR28gcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgZ29Gcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlR28oe2ZpbGVuYW1lLCBzb3VyY2V9KVxuXG5jb25zdCByZWNvcmRzID0gW1xuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInBocFwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0ucGhwXCIsXG4gICAgZnJvbnRlbmQ6IHBocEZyb250ZW5kLFxuICAgIGlkOiBcInBocFwiLFxuICAgIG1lZGlhVHlwZTogXCJhcHBsaWNhdGlvbi94LWh0dHBkLXBocFwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVBocFxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJydWJ5XCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5yYlwiLFxuICAgIGZyb250ZW5kOiBydWJ5RnJvbnRlbmQsXG4gICAgaWQ6IFwicnVieVwiLFxuICAgIG1lZGlhVHlwZTogXCJ0ZXh0L3gtcnVieVwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVJ1YnlcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wibm9kZVwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0uanNcIixcbiAgICBmcm9udGVuZDogamF2YVNjcmlwdEZyb250ZW5kLFxuICAgIGlkOiBcImphdmFzY3JpcHRcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC9qYXZhc2NyaXB0XCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlSmF2YVNjcmlwdFxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1widHNjXCIsIFwibm9kZVwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0udHNcIixcbiAgICBmcm9udGVuZDogdHlwZVNjcmlwdEZyb250ZW5kLFxuICAgIGlkOiBcInR5cGVzY3JpcHRcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC90eXBlc2NyaXB0XCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlVHlwZVNjcmlwdFxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiamF2YWNcIiwgXCJqYXZhXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwiTWFpbi5qYXZhXCIsXG4gICAgZnJvbnRlbmQ6IGphdmFGcm9udGVuZCxcbiAgICBpZDogXCJqYXZhXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1qYXZhLXNvdXJjZVwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZUphdmFcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInB5dGhvblwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0ucHlcIixcbiAgICBmcm9udGVuZDogcHl0aG9uRnJvbnRlbmQsXG4gICAgaWQ6IFwicHl0aG9uXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1weXRob25cIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVQeXRob25cbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwicmVzdG9yZVwiLCBcImNvbXBpbGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJkb3RuZXRcIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcIlByb2dyYW0uY3NcIixcbiAgICBmcm9udGVuZDogY3NoYXJwRnJvbnRlbmQsXG4gICAgaWQ6IFwiY3NoYXJwXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1jc2hhcnBcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVDU2hhcnBQcm9qZWN0XG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImdvXCJdfSxcbiAgICBhcnRpZmFjdE11bHRpcGxpY2l0eTogXCJtdWx0aXBsZVwiLFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJtYWluLmdvXCIsXG4gICAgZnJvbnRlbmQ6IGdvRnJvbnRlbmQsXG4gICAgaWQ6IFwiZ29cIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWdvXCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlR29Nb2R1bGVcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImxpbmtcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJjbGFuZ1wiXX0sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5jXCIsXG4gICAgZnJvbnRlbmQ6IHBhcnNlQyxcbiAgICBpZDogXCJjXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1jXCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlQ1Byb2dyYW1cbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImxpbmtcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJjbGFuZ3BwXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5jcHBcIiwgZnJvbnRlbmQ6IHBhcnNlQ3BwLCBpZDogXCJjcHBcIiwgbWVkaWFUeXBlOiBcInRleHQveC1jKytzcmNcIiwgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlQ3BwXG4gIH0pXG5dXG5cbmV4cG9ydCBjb25zdCBsYW5ndWFnZVJlZ2lzdHJ5ID0gY3JlYXRlTGFuZ3VhZ2VSZWdpc3RyeShyZWNvcmRzKVxuZXhwb3J0IGNvbnN0IGxhbmd1YWdlQ2FwYWJpbGl0aWVzID0gbGFuZ3VhZ2VSZWdpc3RyeS5kZXNjcmlwdG9yc1xuLyoqIEB0eXBlIHtyZWFkb25seSBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2VbXX0gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRMYW5ndWFnZXMgPSBPYmplY3QuZnJlZXplKGxhbmd1YWdlQ2FwYWJpbGl0aWVzXG4gIC5maWx0ZXIoKHtyb2xlc30pID0+IHJvbGVzLmZyb250ZW5kICYmIHJvbGVzLnRleHRCYWNrZW5kKVxuICAubWFwKCh7aWR9KSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGlkKSkpXG5cbi8qKlxuICogU3VwcGxpZXMgY29tbW9uIG9yaWdpbmFsLWZpdmUgY2FwYWJpbGl0eSBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSB2YWx1ZXMgLSBMYW5ndWFnZS1zcGVjaWZpYyByZWNvcmQgZmllbGRzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBDb21wbGV0ZSByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIGxhbmd1YWdlKHZhbHVlcykge1xuICByZXR1cm4ge1xuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcInNpbmdsZVwiLFxuICAgIG1hcHBpbmc6IHtiaW5hcnlSYW5nZXM6IGZhbHNlLCByaWNoVGV4dDogdHJ1ZSwgc291cmNlTWFwVjM6IHRydWV9LFxuICAgIHJvdW5kVHJpcDogdHJ1ZSxcbiAgICAuLi52YWx1ZXNcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdHMgYW4gaW50ZXJuYWwgcmVnaXN0cnkga2V5IGZvciBhIHB1YmxpYyByb2xlIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIEludGVybmFsIHJvbGUga2V5LlxuICogQHJldHVybnMge3N0cmluZ30gUHVibGljIHJvbGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcHVibGljUm9sZU5hbWUocm9sZSkge1xuICBpZiAocm9sZSA9PSBcInRleHRCYWNrZW5kXCIpIHJldHVybiBcInRleHQgYmFja2VuZFwiXG4gIGlmIChyb2xlID09IFwiYmluYXJ5QmFja2VuZFwiKSByZXR1cm4gXCJiaW5hcnkgYmFja2VuZFwiXG4gIGlmIChyb2xlID09IFwiYXBwbGljYXRpb25CYWNrZW5kXCIpIHJldHVybiBcImFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmRcIlxuXG4gIHJldHVybiByb2xlXG59XG5cbi8qKlxuICogVGhyb3dzIGFuIHVua25vd24tbGFuZ3VhZ2UgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFVua25vd24gaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWR9IFtsb2NhdGlvbl0gLSBSZWxhdGVkIGxvY2F0aW9uLlxuICogQHBhcmFtIHtSZWdpc3RyeVJvbGUgfCB1bmRlZmluZWR9IFtyb2xlXSAtIFJlcXVlc3RlZCByb2xlLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiB1bnN1cHBvcnRlZExhbmd1YWdlKGlkLCBsb2NhdGlvbiwgcm9sZSkge1xuICBjb25zdCBtZXNzYWdlID0gcm9sZSA9PSBcImZyb250ZW5kXCIgPyBcIk5vIGZyb250ZW5kIGFkYXB0ZXIgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBsYW5ndWFnZS5cIiA6XG4gICAgcm9sZSA9PSBcInRleHRCYWNrZW5kXCIgPyBcIk5vIHNvdXJjZSBiYWNrZW5kIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbGFuZ3VhZ2UuXCIgOlxuICAgICAgXCJObyBsYW5ndWFnZSBvciB0YXJnZXQgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBJRC5cIlxuXG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNvZGU6IFwiVU5TVVBQT1JURURfTEFOR1VBR0VcIixcbiAgICBsYW5ndWFnZTogaWQsXG4gICAgbG9jYXRpb24sXG4gICAgbWVzc2FnZVxuICB9KVxufVxuXG4vKipcbiAqIFRocm93cyBhIG5vcm1hbGl6ZWQgcmVnaXN0cnktc2hhcGUgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRmFpbHVyZSBkZXRhaWwuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2lkXSAtIENhbmRpZGF0ZSByZWdpc3RyeSBJRC5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFJlZ2lzdHJ5KG1lc3NhZ2UsIGlkID0gXCJyZWdpc3RyeVwiKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiSU5WQUxJRF9SRUdJU1RSWVwiLCBsYW5ndWFnZTogaWQsIG1lc3NhZ2V9KVxufVxuXG4vKipcbiAqIENoZWNrcyBmb3IgYW4gb3JkaW5hcnkgc3RyaW5nLWtleWVkIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IE9iamVjdC5wcm90b3R5cGVcbn1cblxuLyoqXG4gKiBEZWVwbHkgZnJlZXplcyByZWdpc3RyeSByZWNvcmRzIGFuZCBwdWJsaWMgZGVzY3JpcHRvcnMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZSAtIFJlZ2lzdHJ5LW93bmVkIHZhbHVlLlxuICogQHJldHVybnMge1R9IEZyb3plbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGVlcEZyZWV6ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGZvciAoY29uc3QgbmVzdGVkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBkZWVwRnJlZXplKG5lc3RlZClcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh2YWx1ZSlcbn1cbiJdfQ==
575
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2UtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFuZ3VhZ2UtcmVnaXN0cnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGVBQWUsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMvQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDbkQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDakQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ2pELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQ3RELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzNELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUM3QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDbkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQy9DLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzNELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQ3RELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3hELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUM3QyxP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RSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRixvQkFBb0IsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRyxtQkFBbUIsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUYseUJBQXlCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDM0c7UUFDRCxPQUFPLEVBQUUsRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBQztRQUNqRSxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekYsU0FBUyxFQUFFLElBQUk7UUFDZixHQUFHLE1BQU07S0FDVixDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxJQUFJO0lBQzFCLElBQUksSUFBSSxJQUFJLGFBQWE7UUFBRSxPQUFPLGNBQWMsQ0FBQTtJQUNoRCxJQUFJLElBQUksSUFBSSxlQUFlO1FBQUUsT0FBTyxnQkFBZ0IsQ0FBQTtJQUNwRCxJQUFJLElBQUksSUFBSSxvQkFBb0I7UUFBRSxPQUFPLDhCQUE4QixDQUFBO0lBRXZFLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsbUJBQW1CLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJO0lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDM0YsSUFBSSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsb0RBQW9ELENBQUMsQ0FBQztZQUM1RSxrREFBa0QsQ0FBQTtJQUV0RCxNQUFNLElBQUkscUJBQXFCLENBQUM7UUFDOUIsSUFBSSxFQUFFLHNCQUFzQjtRQUM1QixRQUFRLEVBQUUsRUFBRTtRQUNaLFFBQVE7UUFDUixPQUFPO0tBQ1IsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxVQUFVO0lBQy9DLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxFQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7QUFDcEYsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFLO0lBQzFCLE9BQU8sT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQTtBQUMvSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxLQUFLO0lBQ3ZCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFOUUsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUU3RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWMsIHVuc3VwcG9ydGVkUm9sZX0gZnJvbSBcIi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2dlbmVyYXRlSmF2YX0gZnJvbSBcIi4vYmFja2VuZHMvamF2YS5qc1wiXG5pbXBvcnQge2dlbmVyYXRlS290bGlufSBmcm9tIFwiLi9iYWNrZW5kcy9rb3RsaW4uanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUNTaGFycFByb2plY3R9IGZyb20gXCIuL2JhY2tlbmRzL2NzaGFycC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlR29Nb2R1bGV9IGZyb20gXCIuL2JhY2tlbmRzL2dvLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVSdXN0UHJvamVjdH0gZnJvbSBcIi4vYmFja2VuZHMvcnVzdC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlU3dpZnR9IGZyb20gXCIuL2JhY2tlbmRzL3N3aWZ0LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVEYXJ0UGFja2FnZX0gZnJvbSBcIi4vYmFja2VuZHMvZGFydC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlSmF2YVNjcmlwdH0gZnJvbSBcIi4vYmFja2VuZHMvamF2YXNjcmlwdC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlUGhwfSBmcm9tIFwiLi9iYWNrZW5kcy9waHAuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVB5dGhvbn0gZnJvbSBcIi4vYmFja2VuZHMvcHl0aG9uLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVSdWJ5fSBmcm9tIFwiLi9iYWNrZW5kcy9ydWJ5LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVUeXBlU2NyaXB0fSBmcm9tIFwiLi9iYWNrZW5kcy90eXBlc2NyaXB0LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVCcm93c2VyV2FzbX0gZnJvbSBcIi4vYmFja2VuZHMvd2FzbS5qc1wiXG5pbXBvcnQge2dlbmVyYXRlSW9zQXBwbGljYXRpb259IGZyb20gXCIuL2JhY2tlbmRzL2lvcy5qc1wiXG5pbXBvcnQge3BhcnNlSmF2YX0gZnJvbSBcIi4vZnJvbnRlbmRzL2phdmEuanNcIlxuaW1wb3J0IHtwYXJzZUtvdGxpbn0gZnJvbSBcIi4vZnJvbnRlbmRzL2tvdGxpbi5qc1wiXG5pbXBvcnQge3BhcnNlQ1NoYXJwfSBmcm9tIFwiLi9mcm9udGVuZHMvY3NoYXJwLmpzXCJcbmltcG9ydCB7cGFyc2VHb30gZnJvbSBcIi4vZnJvbnRlbmRzL2dvLmpzXCJcbmltcG9ydCB7cGFyc2VSdXN0fSBmcm9tIFwiLi9mcm9udGVuZHMvcnVzdC5qc1wiXG5pbXBvcnQge3BhcnNlU3dpZnR9IGZyb20gXCIuL2Zyb250ZW5kcy9zd2lmdC5qc1wiXG5pbXBvcnQge3BhcnNlRGFydH0gZnJvbSBcIi4vZnJvbnRlbmRzL2RhcnQuanNcIlxuaW1wb3J0IHtwYXJzZUNwcH0gZnJvbSBcIi4vZnJvbnRlbmRzL2NwcC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlQ3BwfSBmcm9tIFwiLi9iYWNrZW5kcy9jcHAuanNcIlxuaW1wb3J0IHtwYXJzZUN9IGZyb20gXCIuL2Zyb250ZW5kcy9jLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVDUHJvZ3JhbX0gZnJvbSBcIi4vYmFja2VuZHMvYy5qc1wiXG5pbXBvcnQge3BhcnNlSmF2YVNjcmlwdFR5cGVTY3JpcHR9IGZyb20gXCIuL2Zyb250ZW5kcy9qYXZhc2NyaXB0LXR5cGVzY3JpcHQuanNcIlxuaW1wb3J0IHtwYXJzZVBocH0gZnJvbSBcIi4vZnJvbnRlbmRzL3BocC5qc1wiXG5pbXBvcnQge3BhcnNlUHl0aG9ufSBmcm9tIFwiLi9mcm9udGVuZHMvcHl0aG9uLmpzXCJcbmltcG9ydCB7cGFyc2VSdWJ5fSBmcm9tIFwiLi9mcm9udGVuZHMvcnVieS5qc1wiXG5cbmNvbnN0IHJlZ2lzdHJ5Um9sZXMgPSBPYmplY3QuZnJlZXplKFtcImZyb250ZW5kXCIsIFwidGV4dEJhY2tlbmRcIiwgXCJiaW5hcnlCYWNrZW5kXCIsIFwiYXBwbGljYXRpb25CYWNrZW5kXCIsIFwiaW50ZXJvcGVyYWJpbGl0eVwiXSlcbmNvbnN0IGFjY2VwdGFuY2VTdGFnZU9yZGVyID0gW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcInJlc3RvcmVcIiwgXCJjb21waWxlXCIsIFwibGlua1wiLCBcInZhbGlkYXRlXCIsIFwiaW5zdGFudGlhdGVcIiwgXCJleGVjdXRlXCJdXG5jb25zdCBhY2NlcHRhbmNlU3RhZ2VzID0gbmV3IE1hcChhY2NlcHRhbmNlU3RhZ2VPcmRlci5tYXAoKHN0YWdlLCBpbmRleCkgPT4gW3N0YWdlLCBpbmRleF0pKVxuY29uc3QgcmVnaXN0cnlLZXlzID0gbmV3IFNldChbXG4gIFwiYWNjZXB0YW5jZVwiLCBcImFwcGxpY2F0aW9uQmFja2VuZFwiLCBcImFydGlmYWN0TXVsdGlwbGljaXR5XCIsIFwiYmluYXJ5QmFja2VuZFwiLCBcImRlZmF1bHRGaWxlbmFtZVwiLCBcImZyb250ZW5kXCIsIFwiaWRcIixcbiAgXCJmZWF0dXJlc1wiLCBcImludGVyb3BlcmFiaWxpdHlcIiwgXCJtYXBwaW5nXCIsIFwibWVkaWFUeXBlXCIsIFwicHJvdmlkZXJcIiwgXCJyb3VuZFRyaXBcIiwgXCJ0ZXh0QmFja2VuZFwiXG5dKVxuXG4vKiogQHR5cGVkZWYge1wiZnJvbnRlbmRcIiB8IFwidGV4dEJhY2tlbmRcIiB8IFwiYmluYXJ5QmFja2VuZFwiIHwgXCJhcHBsaWNhdGlvbkJhY2tlbmRcIiB8IFwiaW50ZXJvcGVyYWJpbGl0eVwifSBSZWdpc3RyeVJvbGUgKi9cbi8qKiBAdHlwZWRlZiB7KC4uLnZhbHVlczogdW5rbm93bltdKSA9PiB1bmtub3dufSBSZWdpc3RyeUltcGxlbWVudGF0aW9uICovXG5cbi8qKlxuICogQHR5cGVkZWYgRnJvbnRlbmRJbnB1dFxuICogQHByb3BlcnR5IHtyZWFkb25seSBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfSBbY2FwYWJpbGl0aWVzXSAtIENvbXBpbGVyLWF1dGhvcml6ZWQgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZSAtIFNvdXJjZSB0ZXh0LlxuICogQHByb3BlcnR5IHt7aXNFbnRyeTogYm9vbGVhbiwgZnVuY3Rpb25zOiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+LCByZWNvcmRzOiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPiwgZXJyb3JzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPiwgdmFsdWVSZWNvcmRzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59fSBbcHJvZ3JhbV0gLSBQcm9ncmFtIGNvbnZlcnNpb24gY29udGV4dC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBGcm9udGVuZFxuICogQHBhcmFtIHtGcm9udGVuZElucHV0fSBpbnB1dCAtIEZyb250ZW5kIHJlcXVlc3QuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gU2VtYW50aWMgbW9kdWxlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VSZWdpc3RyeVJlY29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gU3RhYmxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHt7c3RhZ2VzOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VTdGFnZVtdLCB0b29sY2hhaW5zOiBzdHJpbmdbXX19IGFjY2VwdGFuY2UgLSBBY2NlcHRhbmNlIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtcInNpbmdsZVwiIHwgXCJtdWx0aXBsZVwifSBhcnRpZmFjdE11bHRpcGxpY2l0eSAtIEFydGlmYWN0IG11bHRpcGxpY2l0eS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZUZlYXR1cmVDYXBhYmlsaXRpZXN9IGZlYXR1cmVzIC0gU2VtYW50aWMgZmVhdHVyZSBjYXBhYmlsaXRpZXMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VNYXBwaW5nQ2FwYWJpbGl0aWVzfSBtYXBwaW5nIC0gTWFwcGluZyBjYXBhYmlsaXRpZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJvdW5kVHJpcCAtIFJvdW5kLXRyaXAgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RlZmF1bHRGaWxlbmFtZV0gLSBEZWZhdWx0IGJhY2tlbmQgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21lZGlhVHlwZV0gLSBEZWZhdWx0IGJhY2tlbmQgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Byb3ZpZGVyXSAtIFRhcmdldCBob3N0IHN0ZGxpYiBwcm92aWRlci9uYXRpdmUtYmluZGluZyByb2xlLlxuICogQHByb3BlcnR5IHtSZWdpc3RyeUltcGxlbWVudGF0aW9ufSBbZnJvbnRlbmRdIC0gRnJvbnRlbmQgYWRhcHRlci5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gW3RleHRCYWNrZW5kXSAtIFRleHQgYmFja2VuZC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gW2JpbmFyeUJhY2tlbmRdIC0gQmluYXJ5IGJhY2tlbmQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFthcHBsaWNhdGlvbkJhY2tlbmRdIC0gQXBwbGljYXRpb24tYXJ0aWZhY3QgYmFja2VuZC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gW2ludGVyb3BlcmFiaWxpdHldIC0gSW50ZXJvcGVyYWJpbGl0eSBicmlkZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZVJlZ2lzdHJ5XG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VDYXBhYmlsaXRpZXNbXX0gZGVzY3JpcHRvcnMgLSBQdWJsaWMgZGVzY3JpcHRvcnMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBpZHMgLSBSZWdpc3RlcmVkIElEcyBpbiBzdGFibGUgb3JkZXIuXG4gKiBAcHJvcGVydHkgeyhpZDogc3RyaW5nKSA9PiBSZWFkb25seTxMYW5ndWFnZVJlZ2lzdHJ5UmVjb3JkPn0gcmVjb3JkIC0gRXhhY3QgcmVjb3JkIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7KGlkOiBzdHJpbmcsIHJvbGU6IFJlZ2lzdHJ5Um9sZSwgbG9jYXRpb24/OiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uKSA9PiBSZWdpc3RyeUltcGxlbWVudGF0aW9ufSByZXNvbHZlIC0gUm9sZSBsb29rdXAuXG4gKi9cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGFuIGltbXV0YWJsZSByb2xlIHJlZ2lzdHJ5IGZyb20gb3JkZXJlZCByZWNvcmRzLlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVSZWNvcmRzIC0gT3JkZXJlZCBsYW5ndWFnZSByZWNvcmRzLlxuICogQHJldHVybnMge1JlYWRvbmx5PExhbmd1YWdlUmVnaXN0cnk+fSBSZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxhbmd1YWdlUmVnaXN0cnkoY2FuZGlkYXRlUmVjb3Jkcykge1xuICBpZiAoIWlzRGVuc2VBcnJheShjYW5kaWRhdGVSZWNvcmRzKSkgaW52YWxpZFJlZ2lzdHJ5KFwiUmVnaXN0cnkgcmVjb3JkcyBtdXN0IGJlIGFuIG9yZGVyZWQgZGVuc2UgYXJyYXkuXCIpXG5cbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBSZWFkb25seTxMYW5ndWFnZVJlZ2lzdHJ5UmVjb3JkPj59ICovXG4gIGNvbnN0IHJlY29yZHNCeUlkID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZUNhcGFiaWxpdGllc1tdfSAqL1xuICBjb25zdCBkZXNjcmlwdG9ycyA9IFtdXG5cbiAgZm9yIChsZXQgcmVjb3JkSW5kZXggPSAwOyByZWNvcmRJbmRleCA8IGNhbmRpZGF0ZVJlY29yZHMubGVuZ3RoOyByZWNvcmRJbmRleCArPSAxKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gY2FuZGlkYXRlUmVjb3Jkc1tyZWNvcmRJbmRleF1cblxuICAgIGlmICghaXNQbGFpbk9iamVjdChjYW5kaWRhdGUpKSBpbnZhbGlkUmVnaXN0cnkoXCJFdmVyeSByZWdpc3RyeSByZWNvcmQgbXVzdCBiZSBhIHBsYWluIG9iamVjdC5cIilcbiAgICBjb25zdCBpZCA9IGNhbmRpZGF0ZS5pZFxuXG4gICAgaWYgKHR5cGVvZiBpZCAhPSBcInN0cmluZ1wiIHx8IGlkLmxlbmd0aCA9PSAwIHx8ICEvXlthLXpdW2EtejAtOS1dKiQvdS50ZXN0KGlkKSkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KFwiRXZlcnkgcmVnaXN0cnkgcmVjb3JkIHJlcXVpcmVzIGEgc3RhYmxlIGxvd2VyY2FzZSBJRC5cIiwgdHlwZW9mIGlkID09IFwic3RyaW5nXCIgPyBpZCA6IHVuZGVmaW5lZClcbiAgICB9XG4gICAgaWYgKHJlY29yZHNCeUlkLmhhcyhpZCkpIGludmFsaWRSZWdpc3RyeShgRHVwbGljYXRlIHJlZ2lzdHJ5IElEICcke2lkfScuYCwgaWQpXG4gICAgaWYgKE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29tZSgoa2V5KSA9PiAhcmVnaXN0cnlLZXlzLmhhcyhrZXkpKSkgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBoYXMgdW5rbm93biBmaWVsZHMuYCwgaWQpXG4gICAgaWYgKGNhbmRpZGF0ZS5wcm92aWRlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBjYW5kaWRhdGUucHJvdmlkZXIgIT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGVjbGFyZXMgYW4gaW52YWxpZCBwcm92aWRlciByb2xlLmAsIGlkKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgcm9sZSBvZiByZWdpc3RyeVJvbGVzKSB7XG4gICAgICBpZiAoY2FuZGlkYXRlW3JvbGVdICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGNhbmRpZGF0ZVtyb2xlXSAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByb2xlICcke3JvbGV9JyBmb3IgJyR7aWR9JyBtdXN0IGJlIGEgZnVuY3Rpb24gd2hlbiBwcmVzZW50LmAsIGlkKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhcnRpZmFjdE11bHRpcGxpY2l0eSA9IGNhbmRpZGF0ZS5hcnRpZmFjdE11bHRpcGxpY2l0eVxuXG4gICAgaWYgKGFydGlmYWN0TXVsdGlwbGljaXR5ICE9IFwic2luZ2xlXCIgJiYgYXJ0aWZhY3RNdWx0aXBsaWNpdHkgIT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBhbiBpbnZhbGlkIGFydGlmYWN0IG11bHRpcGxpY2l0eS5gLCBpZClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjYW5kaWRhdGUucm91bmRUcmlwICE9IFwiYm9vbGVhblwiKSBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIHJlcXVpcmVzIGEgQm9vbGVhbiByb3VuZC10cmlwIGRlY2xhcmF0aW9uLmAsIGlkKVxuICAgIGNvbnN0IGZlYXR1cmVzQ2FuZGlkYXRlID0gY2FuZGlkYXRlLmZlYXR1cmVzID8/IHtcbiAgICAgIGNsb3NlZFJlY29yZHM6IGZhbHNlLFxuICAgICAgY29uZGl0aW9uQ29udHJvbGxlZExvb3BzOiBmYWxzZSxcbiAgICAgIGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlczogZmFsc2UsXG4gICAgICBnZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHM6IGZhbHNlLFxuICAgICAgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IGZhbHNlLFxuICAgICAgb3B0aW9uYWxWYWx1ZXM6IGZhbHNlLFxuICAgICAgb3JkZXJlZExpc3RJdGVyYXRpb246IGZhbHNlLFxuICAgICAgb3JkZXJlZE1hcEl0ZXJhdGlvbjogZmFsc2UsXG4gICAgICByZWZlcmVuY2VDbGFzc2VzOiBmYWxzZSxcbiAgICAgIHR5cGVkRXJyb3JzOiBmYWxzZSxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGZlYXR1cmVzQ2FuZGlkYXRlKSB8fFxuICAgICAgT2JqZWN0LmtleXMoZmVhdHVyZXNDYW5kaWRhdGUpLnNvcnQoKS5qb2luKFwiLFwiKSAhPSBcImNsb3NlZFJlY29yZHMsY29uZGl0aW9uQ29udHJvbGxlZExvb3BzLGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlcyxnZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHMsaW1tdXRhYmxlQ29sbGVjdGlvbnMsb3B0aW9uYWxWYWx1ZXMsb3JkZXJlZExpc3RJdGVyYXRpb24sb3JkZXJlZE1hcEl0ZXJhdGlvbixyZWZlcmVuY2VDbGFzc2VzLHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3MsdHlwZWRFcnJvcnNcIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLmNsb3NlZFJlY29yZHMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5jb25kaXRpb25Db250cm9sbGVkTG9vcHMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5lZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5nZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5pbW11dGFibGVDb2xsZWN0aW9ucyAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLm9wdGlvbmFsVmFsdWVzICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUub3JkZXJlZExpc3RJdGVyYXRpb24gIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5vcmRlcmVkTWFwSXRlcmF0aW9uICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUucmVmZXJlbmNlQ2xhc3NlcyAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLnR5cGVkRXJyb3JzICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUudHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljcyAhPSBcImJvb2xlYW5cIikge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBoYXMgYW4gaW52YWxpZCBmZWF0dXJlIGRlY2xhcmF0aW9uLmAsIGlkKVxuICAgIH1cbiAgICBjb25zdCBmZWF0dXJlcyA9IGRlZXBGcmVlemUoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlRmVhdHVyZUNhcGFiaWxpdGllc30gKi8gKHtcbiAgICAgIGNsb3NlZFJlY29yZHM6IGZlYXR1cmVzQ2FuZGlkYXRlLmNsb3NlZFJlY29yZHMsXG4gICAgICBjb25kaXRpb25Db250cm9sbGVkTG9vcHM6IGZlYXR1cmVzQ2FuZGlkYXRlLmNvbmRpdGlvbkNvbnRyb2xsZWRMb29wcyxcbiAgICAgIGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlczogZmVhdHVyZXNDYW5kaWRhdGUuZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzLFxuICAgICAgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiBmZWF0dXJlc0NhbmRpZGF0ZS5nZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHMsXG4gICAgICBpbW11dGFibGVDb2xsZWN0aW9uczogZmVhdHVyZXNDYW5kaWRhdGUuaW1tdXRhYmxlQ29sbGVjdGlvbnMsXG4gICAgICBvcHRpb25hbFZhbHVlczogZmVhdHVyZXNDYW5kaWRhdGUub3B0aW9uYWxWYWx1ZXMsXG4gICAgICBvcmRlcmVkTGlzdEl0ZXJhdGlvbjogZmVhdHVyZXNDYW5kaWRhdGUub3JkZXJlZExpc3RJdGVyYXRpb24sXG4gICAgICBvcmRlcmVkTWFwSXRlcmF0aW9uOiBmZWF0dXJlc0NhbmRpZGF0ZS5vcmRlcmVkTWFwSXRlcmF0aW9uLFxuICAgICAgcmVmZXJlbmNlQ2xhc3NlczogZmVhdHVyZXNDYW5kaWRhdGUucmVmZXJlbmNlQ2xhc3NlcyxcbiAgICAgIHR5cGVkRXJyb3JzOiBmZWF0dXJlc0NhbmRpZGF0ZS50eXBlZEVycm9ycyxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IGZlYXR1cmVzQ2FuZGlkYXRlLnR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3NcbiAgICB9KSlcbiAgICBjb25zdCBtYXBwaW5nQ2FuZGlkYXRlID0gY2FuZGlkYXRlLm1hcHBpbmdcblxuICAgIGlmICghaXNQbGFpbk9iamVjdChtYXBwaW5nQ2FuZGlkYXRlKSkgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBoYXMgYW4gaW52YWxpZCBtYXBwaW5nIGRlY2xhcmF0aW9uLmAsIGlkKVxuICAgIGNvbnN0IG1hcHBpbmdTbmFwc2hvdCA9IHtcbiAgICAgIGJpbmFyeVJhbmdlczogbWFwcGluZ0NhbmRpZGF0ZS5iaW5hcnlSYW5nZXMsXG4gICAgICByaWNoVGV4dDogbWFwcGluZ0NhbmRpZGF0ZS5yaWNoVGV4dCxcbiAgICAgIHNvdXJjZU1hcFYzOiBtYXBwaW5nQ2FuZGlkYXRlLnNvdXJjZU1hcFYzXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtYXBwaW5nU25hcHNob3QucmljaFRleHQgIT0gXCJib29sZWFuXCIgfHwgdHlwZW9mIG1hcHBpbmdTbmFwc2hvdC5zb3VyY2VNYXBWMyAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIG1hcHBpbmdTbmFwc2hvdC5iaW5hcnlSYW5nZXMgIT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgbWFwcGluZyBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICB9XG4gICAgY29uc3QgbWFwcGluZyA9IGRlZXBGcmVlemUoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlTWFwcGluZ0NhcGFiaWxpdGllc30gKi8gKG1hcHBpbmdTbmFwc2hvdCkpXG4gICAgY29uc3QgYWNjZXB0YW5jZUNhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5hY2NlcHRhbmNlXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYWNjZXB0YW5jZUNhbmRpZGF0ZSkgfHwgIWlzRGVuc2VBcnJheShhY2NlcHRhbmNlQ2FuZGlkYXRlLnN0YWdlcykgfHxcbiAgICAgICFpc0RlbnNlQXJyYXkoYWNjZXB0YW5jZUNhbmRpZGF0ZS50b29sY2hhaW5zKSkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBoYXMgYW4gaW52YWxpZCBhY2NlcHRhbmNlIGRlY2xhcmF0aW9uLmAsIGlkKVxuICAgIH1cbiAgICAvKiogQHR5cGUge3Vua25vd25bXX0gKi9cbiAgICBjb25zdCBzdGFnZVNuYXBzaG90ID0gW11cbiAgICAvKiogQHR5cGUge3Vua25vd25bXX0gKi9cbiAgICBjb25zdCB0b29sY2hhaW5TbmFwc2hvdCA9IFtdXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYWNjZXB0YW5jZUNhbmRpZGF0ZS5zdGFnZXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBzdGFnZVNuYXBzaG90LnB1c2goYWNjZXB0YW5jZUNhbmRpZGF0ZS5zdGFnZXNbaW5kZXhdKVxuICAgIH1cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYWNjZXB0YW5jZUNhbmRpZGF0ZS50b29sY2hhaW5zLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgdG9vbGNoYWluU25hcHNob3QucHVzaChhY2NlcHRhbmNlQ2FuZGlkYXRlLnRvb2xjaGFpbnNbaW5kZXhdKVxuICAgIH1cbiAgICBpZiAoIXN0YWdlU25hcHNob3QuZXZlcnkoKHN0YWdlKSA9PiB0eXBlb2Ygc3RhZ2UgPT0gXCJzdHJpbmdcIiAmJiBhY2NlcHRhbmNlU3RhZ2VzLmhhcyhzdGFnZSkpIHx8XG4gICAgICAhdG9vbGNoYWluU25hcHNob3QuZXZlcnkoKHRvb2xjaGFpbikgPT4gdHlwZW9mIHRvb2xjaGFpbiA9PSBcInN0cmluZ1wiICYmIHRvb2xjaGFpbi5sZW5ndGggPiAwKSkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBoYXMgYW4gaW52YWxpZCBhY2NlcHRhbmNlIGRlY2xhcmF0aW9uLmAsIGlkKVxuICAgIH1cbiAgICBjb25zdCBzdGFnZXMgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVN0YWdlW119ICovIChzdGFnZVNuYXBzaG90KVxuICAgIGNvbnN0IHRvb2xjaGFpbnMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAodG9vbGNoYWluU25hcHNob3QpXG4gICAgbGV0IHByZXZpb3VzU3RhZ2UgPSAtMVxuICAgIGNvbnN0IGRlY2xhcmVkU3RhZ2VzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcykge1xuICAgICAgY29uc3Qgc3RhZ2VJbmRleCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoYWNjZXB0YW5jZVN0YWdlcy5nZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzdGFnZSkpKVxuXG4gICAgICBpZiAoZGVjbGFyZWRTdGFnZXMuaGFzKHN0YWdlKSB8fCBzdGFnZUluZGV4IDwgcHJldmlvdXNTdGFnZSkgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBoYXMgdW5vcmRlcmVkIG9yIGR1cGxpY2F0ZSBhY2NlcHRhbmNlIHN0YWdlcy5gLCBpZClcbiAgICAgIGRlY2xhcmVkU3RhZ2VzLmFkZChzdGFnZSlcbiAgICAgIHByZXZpb3VzU3RhZ2UgPSBzdGFnZUluZGV4XG4gICAgfVxuICAgIGlmIChuZXcgU2V0KHRvb2xjaGFpbnMpLnNpemUgIT0gdG9vbGNoYWlucy5sZW5ndGgpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGR1cGxpY2F0ZSBhY2NlcHRhbmNlIHRvb2xjaGFpbnMuYCwgaWQpXG4gICAgfVxuXG4gICAgY29uc3QgaGFzRnJvbnRlbmQgPSB0eXBlb2YgY2FuZGlkYXRlLmZyb250ZW5kID09IFwiZnVuY3Rpb25cIlxuICAgIGNvbnN0IGhhc1RleHRCYWNrZW5kID0gdHlwZW9mIGNhbmRpZGF0ZS50ZXh0QmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNCaW5hcnlCYWNrZW5kID0gdHlwZW9mIGNhbmRpZGF0ZS5iaW5hcnlCYWNrZW5kID09IFwiZnVuY3Rpb25cIlxuICAgIGNvbnN0IGhhc0FwcGxpY2F0aW9uQmFja2VuZCA9IHR5cGVvZiBjYW5kaWRhdGUuYXBwbGljYXRpb25CYWNrZW5kID09IFwiZnVuY3Rpb25cIlxuICAgIGNvbnN0IGhhc0JhY2tlbmQgPSBoYXNUZXh0QmFja2VuZCB8fCBoYXNCaW5hcnlCYWNrZW5kIHx8IGhhc0FwcGxpY2F0aW9uQmFja2VuZFxuXG4gICAgaWYgKChtYXBwaW5nLnJpY2hUZXh0IHx8IG1hcHBpbmcuc291cmNlTWFwVjMgfHwgbWFwcGluZy5iaW5hcnlSYW5nZXMpICYmICFoYXNCYWNrZW5kIHx8XG4gICAgICBtYXBwaW5nLnNvdXJjZU1hcFYzICYmICFtYXBwaW5nLnJpY2hUZXh0IHx8XG4gICAgICBtYXBwaW5nLmJpbmFyeVJhbmdlcyAmJiAhaGFzQmluYXJ5QmFja2VuZCAmJiAhaGFzQXBwbGljYXRpb25CYWNrZW5kKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGRlY2xhcmVzIG1hcHBpbmcgc3VwcG9ydCB3aXRob3V0IGl0cyByZXF1aXJlZCBiYWNrZW5kIHJvbGUuYCwgaWQpXG4gICAgfVxuICAgIGlmIChjYW5kaWRhdGUucm91bmRUcmlwICYmICghaGFzRnJvbnRlbmQgfHwgIWhhc0JhY2tlbmQpKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGRlY2xhcmVzIHJvdW5kLXRyaXAgc3VwcG9ydCB3aXRob3V0IGZyb250ZW5kIGFuZCBiYWNrZW5kIHJvbGVzLmAsIGlkKVxuICAgIH1cbiAgICBpZiAoc3RhZ2VzLmluY2x1ZGVzKFwicGFyc2VcIikgJiYgIWhhc0Zyb250ZW5kIHx8IHN0YWdlcy5pbmNsdWRlcyhcImdlbmVyYXRlXCIpICYmICFoYXNCYWNrZW5kKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGRlY2xhcmVzIGFuIGFjY2VwdGFuY2Ugc3RhZ2Ugd2l0aG91dCBpdHMgcmVxdWlyZWQgcm9sZS5gLCBpZClcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEZWZhdWx0ZWRCYWNrZW5kID0gaGFzVGV4dEJhY2tlbmQgfHwgaGFzQmluYXJ5QmFja2VuZFxuXG4gICAgaWYgKChoYXNEZWZhdWx0ZWRCYWNrZW5kIHx8IGNhbmRpZGF0ZS5kZWZhdWx0RmlsZW5hbWUgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICh0eXBlb2YgY2FuZGlkYXRlLmRlZmF1bHRGaWxlbmFtZSAhPSBcInN0cmluZ1wiIHx8IGNhbmRpZGF0ZS5kZWZhdWx0RmlsZW5hbWUubGVuZ3RoID09IDApKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IGJhY2tlbmQgJyR7aWR9JyByZXF1aXJlcyBhIGRlZmF1bHQgZmlsZW5hbWUuYCwgaWQpXG4gICAgfVxuICAgIGlmICgoaGFzRGVmYXVsdGVkQmFja2VuZCB8fCBjYW5kaWRhdGUubWVkaWFUeXBlICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAodHlwZW9mIGNhbmRpZGF0ZS5tZWRpYVR5cGUgIT0gXCJzdHJpbmdcIiB8fCBjYW5kaWRhdGUubWVkaWFUeXBlLmxlbmd0aCA9PSAwKSkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSBiYWNrZW5kICcke2lkfScgcmVxdWlyZXMgYSBtZWRpYSB0eXBlLmAsIGlkKVxuICAgIH1cblxuICAgIGNvbnN0IGFjY2VwdGFuY2UgPSBkZWVwRnJlZXplKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXN9ICovICh7XG4gICAgICBzdGFnZXMsXG4gICAgICB0b29sY2hhaW5zXG4gICAgfSkpXG4gICAgY29uc3QgcmVjb3JkID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge0xhbmd1YWdlUmVnaXN0cnlSZWNvcmR9ICovICh7XG4gICAgICBhY2NlcHRhbmNlLFxuICAgICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHksXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGlkLFxuICAgICAgbWFwcGluZyxcbiAgICAgIHJvdW5kVHJpcDogY2FuZGlkYXRlLnJvdW5kVHJpcCxcbiAgICAgIC4uLih0eXBlb2YgY2FuZGlkYXRlLmRlZmF1bHRGaWxlbmFtZSA9PSBcInN0cmluZ1wiID8ge2RlZmF1bHRGaWxlbmFtZTogY2FuZGlkYXRlLmRlZmF1bHRGaWxlbmFtZX0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5tZWRpYVR5cGUgPT0gXCJzdHJpbmdcIiA/IHttZWRpYVR5cGU6IGNhbmRpZGF0ZS5tZWRpYVR5cGV9IDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjYW5kaWRhdGUucHJvdmlkZXIgPT0gXCJib29sZWFuXCIgPyB7cHJvdmlkZXI6IGNhbmRpZGF0ZS5wcm92aWRlcn0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5mcm9udGVuZCA9PSBcImZ1bmN0aW9uXCIgPyB7ZnJvbnRlbmQ6IGNhbmRpZGF0ZS5mcm9udGVuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS50ZXh0QmFja2VuZCA9PSBcImZ1bmN0aW9uXCIgPyB7dGV4dEJhY2tlbmQ6IGNhbmRpZGF0ZS50ZXh0QmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5iaW5hcnlCYWNrZW5kID09IFwiZnVuY3Rpb25cIiA/IHtiaW5hcnlCYWNrZW5kOiBjYW5kaWRhdGUuYmluYXJ5QmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5hcHBsaWNhdGlvbkJhY2tlbmQgPT0gXCJmdW5jdGlvblwiID8ge2FwcGxpY2F0aW9uQmFja2VuZDogY2FuZGlkYXRlLmFwcGxpY2F0aW9uQmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5pbnRlcm9wZXJhYmlsaXR5ID09IFwiZnVuY3Rpb25cIiA/IHtpbnRlcm9wZXJhYmlsaXR5OiBjYW5kaWRhdGUuaW50ZXJvcGVyYWJpbGl0eX0gOiB7fSlcbiAgICB9KSlcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VDYXBhYmlsaXRpZXN9ICovICh7XG4gICAgICBhY2NlcHRhbmNlLFxuICAgICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHksXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGlkLFxuICAgICAgbWFwcGluZyxcbiAgICAgIHJvbGVzOiB7XG4gICAgICAgIGFwcGxpY2F0aW9uQmFja2VuZDogdHlwZW9mIGNhbmRpZGF0ZS5hcHBsaWNhdGlvbkJhY2tlbmQgPT0gXCJmdW5jdGlvblwiLFxuICAgICAgICBiaW5hcnlCYWNrZW5kOiB0eXBlb2YgY2FuZGlkYXRlLmJpbmFyeUJhY2tlbmQgPT0gXCJmdW5jdGlvblwiLFxuICAgICAgICBmcm9udGVuZDogdHlwZW9mIGNhbmRpZGF0ZS5mcm9udGVuZCA9PSBcImZ1bmN0aW9uXCIsXG4gICAgICAgIGludGVyb3BlcmFiaWxpdHk6IHR5cGVvZiBjYW5kaWRhdGUuaW50ZXJvcGVyYWJpbGl0eSA9PSBcImZ1bmN0aW9uXCIsXG4gICAgICAgIHByb3ZpZGVyOiBjYW5kaWRhdGUucHJvdmlkZXIgPT09IHRydWUsXG4gICAgICAgIHRleHRCYWNrZW5kOiB0eXBlb2YgY2FuZGlkYXRlLnRleHRCYWNrZW5kID09IFwiZnVuY3Rpb25cIlxuICAgICAgfSxcbiAgICAgIHJvdW5kVHJpcDogY2FuZGlkYXRlLnJvdW5kVHJpcFxuICAgIH0pKVxuXG4gICAgcmVjb3Jkc0J5SWQuc2V0KGlkLCByZWNvcmQpXG4gICAgZGVzY3JpcHRvcnMucHVzaChkZXNjcmlwdG9yKVxuICB9XG5cbiAgY29uc3QgZnJvemVuRGVzY3JpcHRvcnMgPSBkZWVwRnJlZXplKGRlc2NyaXB0b3JzKVxuICBjb25zdCBpZHMgPSBPYmplY3QuZnJlZXplKGZyb3plbkRlc2NyaXB0b3JzLm1hcCgoe2lkfSkgPT4gaWQpKVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBkZXNjcmlwdG9yczogZnJvemVuRGVzY3JpcHRvcnMsXG4gICAgaWRzLFxuICAgIHJlY29yZChpZCkge1xuICAgICAgY29uc3QgcmVjb3JkID0gcmVjb3Jkc0J5SWQuZ2V0KGlkKVxuXG4gICAgICBpZiAoIXJlY29yZCkgdW5zdXBwb3J0ZWRMYW5ndWFnZShpZClcblxuICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH0sXG4gICAgcmVzb2x2ZShpZCwgcm9sZSwgbG9jYXRpb24pIHtcbiAgICAgIGlmICghcmVnaXN0cnlSb2xlcy5pbmNsdWRlcyhyb2xlKSkgaW52YWxpZFJlZ2lzdHJ5KGBVbmtub3duIHJlZ2lzdHJ5IHJvbGUgJyR7cm9sZX0nLmAsIGlkKVxuICAgICAgY29uc3QgcmVjb3JkID0gcmVjb3Jkc0J5SWQuZ2V0KGlkKVxuXG4gICAgICBpZiAoIXJlY29yZCkgdW5zdXBwb3J0ZWRMYW5ndWFnZShpZCwgbG9jYXRpb24sIHJvbGUpXG4gICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbiA9IHJlY29yZFtyb2xlXVxuXG4gICAgICBpZiAodHlwZW9mIGltcGxlbWVudGF0aW9uICE9IFwiZnVuY3Rpb25cIikgdW5zdXBwb3J0ZWRSb2xlKGlkLCBwdWJsaWNSb2xlTmFtZShyb2xlKSwgbG9jYXRpb24pXG5cbiAgICAgIHJldHVybiBpbXBsZW1lbnRhdGlvblxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBQSFAgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgcGhwRnJvbnRlbmQgPSAoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pID0+IHBhcnNlUGhwKHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBwcm9ncmFtLCBzb3VyY2V9KVxuXG4vKipcbiAqIFJ1YnkgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgcnVieUZyb250ZW5kID0gKHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBwcm9ncmFtLCBzb3VyY2V9KSA9PiBwYXJzZVJ1Ynkoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pXG5cbi8qKlxuICogSmF2YVNjcmlwdCByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBqYXZhU2NyaXB0RnJvbnRlbmQgPSAoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pID0+IHBhcnNlSmF2YVNjcmlwdFR5cGVTY3JpcHQoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIGxhbmd1YWdlOiBcImphdmFzY3JpcHRcIiwgcHJvZ3JhbSwgc291cmNlfSlcblxuLyoqXG4gKiBUeXBlU2NyaXB0IHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IHR5cGVTY3JpcHRGcm9udGVuZCA9ICh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgcHJvZ3JhbSwgc291cmNlfSkgPT4gcGFyc2VKYXZhU2NyaXB0VHlwZVNjcmlwdCh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgbGFuZ3VhZ2U6IFwidHlwZXNjcmlwdFwiLCBwcm9ncmFtLCBzb3VyY2V9KVxuXG4vKipcbiAqIEphdmEgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgamF2YUZyb250ZW5kID0gKHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBwcm9ncmFtLCBzb3VyY2V9KSA9PiBwYXJzZUphdmEoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pXG5cbi8qKlxuICogS290bGluIHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IGtvdGxpbkZyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VLb3RsaW4oe2ZpbGVuYW1lLCBzb3VyY2V9KVxuXG4vKipcbiAqIFB5dGhvbiByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBweXRob25Gcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlUHl0aG9uKHtmaWxlbmFtZSwgc291cmNlfSlcblxuLyoqXG4gKiBDIyByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBjc2hhcnBGcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlQ1NoYXJwKHtmaWxlbmFtZSwgc291cmNlfSlcblxuLyoqXG4gKiBHbyByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBnb0Zyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VHbyh7ZmlsZW5hbWUsIHNvdXJjZX0pXG5cbi8qKlxuICogRGFydCByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBkYXJ0RnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZURhcnQoe2ZpbGVuYW1lLCBzb3VyY2V9KVxuXG5jb25zdCByZWNvcmRzID0gW1xuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInBocDgyXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5waHBcIixcbiAgICBmcm9udGVuZDogcGhwRnJvbnRlbmQsXG4gICAgaWQ6IFwicGhwXCIsXG4gICAgbWVkaWFUeXBlOiBcImFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwXCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlUGhwXG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInJ1YnlcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLnJiXCIsXG4gICAgZnJvbnRlbmQ6IHJ1YnlGcm9udGVuZCxcbiAgICBpZDogXCJydWJ5XCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1ydWJ5XCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlUnVieVxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJub2RlXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5qc1wiLFxuICAgIGZyb250ZW5kOiBqYXZhU2NyaXB0RnJvbnRlbmQsXG4gICAgaWQ6IFwiamF2YXNjcmlwdFwiLFxuICAgIG1lZGlhVHlwZTogXCJ0ZXh0L2phdmFzY3JpcHRcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVKYXZhU2NyaXB0XG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJ0c2NcIiwgXCJub2RlXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS50c1wiLFxuICAgIGZyb250ZW5kOiB0eXBlU2NyaXB0RnJvbnRlbmQsXG4gICAgaWQ6IFwidHlwZXNjcmlwdFwiLFxuICAgIG1lZGlhVHlwZTogXCJ0ZXh0L3R5cGVzY3JpcHRcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVUeXBlU2NyaXB0XG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJqYXZhY1wiLCBcImphdmFcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJNYWluLmphdmFcIixcbiAgICBmcm9udGVuZDogamF2YUZyb250ZW5kLFxuICAgIGlkOiBcImphdmFcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWphdmEtc291cmNlXCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlSmF2YVxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wia290bGluY1wiLCBcImphdmEyNVwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcIlByb2dyYW0ua3RcIixcbiAgICBmcm9udGVuZDoga290bGluRnJvbnRlbmQsXG4gICAgaWQ6IFwia290bGluXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1rb3RsaW5cIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVLb3RsaW5cbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInB5dGhvblwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0ucHlcIixcbiAgICBmcm9udGVuZDogcHl0aG9uRnJvbnRlbmQsXG4gICAgaWQ6IFwicHl0aG9uXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1weXRob25cIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVQeXRob25cbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwicmVzdG9yZVwiLCBcImNvbXBpbGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJkb3RuZXRcIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcIlByb2dyYW0uY3NcIixcbiAgICBmcm9udGVuZDogY3NoYXJwRnJvbnRlbmQsXG4gICAgaWQ6IFwiY3NoYXJwXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1jc2hhcnBcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVDU2hhcnBQcm9qZWN0XG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImdvXCJdfSxcbiAgICBhcnRpZmFjdE11bHRpcGxpY2l0eTogXCJtdWx0aXBsZVwiLFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJtYWluLmdvXCIsXG4gICAgZnJvbnRlbmQ6IGdvRnJvbnRlbmQsXG4gICAgaWQ6IFwiZ29cIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWdvXCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlR29Nb2R1bGVcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImxpbmtcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJjbGFuZ1wiXX0sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5jXCIsXG4gICAgZnJvbnRlbmQ6IHBhcnNlQyxcbiAgICBpZDogXCJjXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1jXCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlQ1Byb2dyYW1cbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImxpbmtcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJjbGFuZ3BwXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5jcHBcIiwgZnJvbnRlbmQ6IHBhcnNlQ3BwLCBpZDogXCJjcHBcIiwgbWVkaWFUeXBlOiBcInRleHQveC1jKytzcmNcIiwgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlQ3BwXG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInJ1c3RjXCIsIFwiY2FyZ29cIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInNyYy9tYWluLnJzXCIsIGZyb250ZW5kOiBwYXJzZVJ1c3QsIGlkOiBcInJ1c3RcIiwgbWVkaWFUeXBlOiBcInRleHQveC1ydXN0XCIsIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVJ1c3RQcm9qZWN0XG4gIH0pLFxuICBsYW5ndWFnZSh7YWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJzd2lmdGNcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLnN3aWZ0XCIsIGZyb250ZW5kOiBwYXJzZVN3aWZ0LCBpZDogXCJzd2lmdFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LXN3aWZ0XCIsIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVN3aWZ0fSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwicmVzdG9yZVwiLCBcImNvbXBpbGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImRhcnRcIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcImJpbi9wcm9ncmFtLmRhcnRcIixcbiAgICBmZWF0dXJlczoge1xuICAgICAgY2xvc2VkUmVjb3JkczogZmFsc2UsXG4gICAgICBjb25kaXRpb25Db250cm9sbGVkTG9vcHM6IGZhbHNlLFxuICAgICAgZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzOiBmYWxzZSxcbiAgICAgIGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxsczogdHJ1ZSxcbiAgICAgIGltbXV0YWJsZUNvbGxlY3Rpb25zOiBmYWxzZSxcbiAgICAgIG9wdGlvbmFsVmFsdWVzOiBmYWxzZSxcbiAgICAgIG9yZGVyZWRMaXN0SXRlcmF0aW9uOiBmYWxzZSxcbiAgICAgIG9yZGVyZWRNYXBJdGVyYXRpb246IGZhbHNlLFxuICAgICAgcmVmZXJlbmNlQ2xhc3NlczogZmFsc2UsXG4gICAgICB0eXBlZEVycm9yczogZmFsc2UsXG4gICAgICB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBmYWxzZVxuICAgIH0sXG4gICAgZnJvbnRlbmQ6IGRhcnRGcm9udGVuZCxcbiAgICBpZDogXCJkYXJ0XCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1kYXJ0XCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlRGFydFBhY2thZ2VcbiAgfSksXG4gIHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJnZW5lcmF0ZVwiLCBcInZhbGlkYXRlXCIsIFwiaW5zdGFudGlhdGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJ3YXNtLXZhbGlkYXRlXCIsIFwibm9kZVwiLCBcImNocm9taXVtXCJdfSxcbiAgICBhcHBsaWNhdGlvbkJhY2tlbmQ6IGdlbmVyYXRlQnJvd3Nlcldhc20sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBiaW5hcnlCYWNrZW5kOiBnZW5lcmF0ZUJyb3dzZXJXYXNtLFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLndhc21cIixcbiAgICBmZWF0dXJlczoge2Nsb3NlZFJlY29yZHM6IGZhbHNlLCBjb25kaXRpb25Db250cm9sbGVkTG9vcHM6IGZhbHNlLCBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IGZhbHNlLCBnZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHM6IGZhbHNlLCBpbW11dGFibGVDb2xsZWN0aW9uczogZmFsc2UsIG9wdGlvbmFsVmFsdWVzOiBmYWxzZSwgb3JkZXJlZExpc3RJdGVyYXRpb246IGZhbHNlLCBvcmRlcmVkTWFwSXRlcmF0aW9uOiBmYWxzZSwgcmVmZXJlbmNlQ2xhc3NlczogZmFsc2UsIHR5cGVkRXJyb3JzOiBmYWxzZSwgdHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljczogZmFsc2V9LFxuICAgIGlkOiBcIndhc21cIixcbiAgICBtYXBwaW5nOiB7YmluYXJ5UmFuZ2VzOiB0cnVlLCByaWNoVGV4dDogdHJ1ZSwgc291cmNlTWFwVjM6IHRydWV9LFxuICAgIG1lZGlhVHlwZTogXCJhcHBsaWNhdGlvbi93YXNtXCIsXG4gICAgcm91bmRUcmlwOiBmYWxzZVxuICB9LFxuICB7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wiZ2VuZXJhdGVcIl0sIHRvb2xjaGFpbnM6IFtdfSxcbiAgICBhcHBsaWNhdGlvbkJhY2tlbmQ6IGdlbmVyYXRlSW9zQXBwbGljYXRpb24sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBmZWF0dXJlczoge2Nsb3NlZFJlY29yZHM6IGZhbHNlLCBjb25kaXRpb25Db250cm9sbGVkTG9vcHM6IGZhbHNlLCBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IGZhbHNlLCBnZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHM6IGZhbHNlLCBpbW11dGFibGVDb2xsZWN0aW9uczogZmFsc2UsIG9wdGlvbmFsVmFsdWVzOiBmYWxzZSwgb3JkZXJlZExpc3RJdGVyYXRpb246IGZhbHNlLCBvcmRlcmVkTWFwSXRlcmF0aW9uOiBmYWxzZSwgcmVmZXJlbmNlQ2xhc3NlczogZmFsc2UsIHR5cGVkRXJyb3JzOiBmYWxzZSwgdHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljczogZmFsc2V9LFxuICAgIGlkOiBcImlvc1wiLFxuICAgIG1hcHBpbmc6IHtiaW5hcnlSYW5nZXM6IHRydWUsIHJpY2hUZXh0OiB0cnVlLCBzb3VyY2VNYXBWMzogdHJ1ZX0sXG4gICAgcm91bmRUcmlwOiBmYWxzZVxuICB9XG5dXG5cbmV4cG9ydCBjb25zdCBsYW5ndWFnZVJlZ2lzdHJ5ID0gY3JlYXRlTGFuZ3VhZ2VSZWdpc3RyeShyZWNvcmRzKVxuZXhwb3J0IGNvbnN0IGxhbmd1YWdlQ2FwYWJpbGl0aWVzID0gbGFuZ3VhZ2VSZWdpc3RyeS5kZXNjcmlwdG9yc1xuLyoqIEB0eXBlIHtyZWFkb25seSBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2VbXX0gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRMYW5ndWFnZXMgPSBPYmplY3QuZnJlZXplKGxhbmd1YWdlQ2FwYWJpbGl0aWVzXG4gIC5maWx0ZXIoKHtyb2xlc30pID0+IHJvbGVzLmZyb250ZW5kICYmIHJvbGVzLnRleHRCYWNrZW5kKVxuICAubWFwKCh7aWR9KSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGlkKSkpXG5cbi8qKlxuICogU3VwcGxpZXMgY29tbW9uIG9yaWdpbmFsLWZpdmUgY2FwYWJpbGl0eSBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSB2YWx1ZXMgLSBMYW5ndWFnZS1zcGVjaWZpYyByZWNvcmQgZmllbGRzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBDb21wbGV0ZSByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIGxhbmd1YWdlKHZhbHVlcykge1xuICByZXR1cm4ge1xuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcInNpbmdsZVwiLFxuICAgIGZlYXR1cmVzOiB7XG4gICAgICBjbG9zZWRSZWNvcmRzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgICAgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIGltbXV0YWJsZUNvbGxlY3Rpb25zOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIG9wdGlvbmFsVmFsdWVzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIG9yZGVyZWRMaXN0SXRlcmF0aW9uOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIG9yZGVyZWRNYXBJdGVyYXRpb246IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgICAgcmVmZXJlbmNlQ2xhc3NlczogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICB0eXBlZEVycm9yczogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKVxuICAgIH0sXG4gICAgbWFwcGluZzoge2JpbmFyeVJhbmdlczogZmFsc2UsIHJpY2hUZXh0OiB0cnVlLCBzb3VyY2VNYXBWMzogdHJ1ZX0sXG4gICAgcHJvdmlkZXI6IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgIHJvdW5kVHJpcDogdHJ1ZSxcbiAgICAuLi52YWx1ZXNcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdHMgYW4gaW50ZXJuYWwgcmVnaXN0cnkga2V5IGZvciBhIHB1YmxpYyByb2xlIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIEludGVybmFsIHJvbGUga2V5LlxuICogQHJldHVybnMge3N0cmluZ30gUHVibGljIHJvbGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcHVibGljUm9sZU5hbWUocm9sZSkge1xuICBpZiAocm9sZSA9PSBcInRleHRCYWNrZW5kXCIpIHJldHVybiBcInRleHQgYmFja2VuZFwiXG4gIGlmIChyb2xlID09IFwiYmluYXJ5QmFja2VuZFwiKSByZXR1cm4gXCJiaW5hcnkgYmFja2VuZFwiXG4gIGlmIChyb2xlID09IFwiYXBwbGljYXRpb25CYWNrZW5kXCIpIHJldHVybiBcImFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmRcIlxuXG4gIHJldHVybiByb2xlXG59XG5cbi8qKlxuICogVGhyb3dzIGFuIHVua25vd24tbGFuZ3VhZ2UgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFVua25vd24gaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWR9IFtsb2NhdGlvbl0gLSBSZWxhdGVkIGxvY2F0aW9uLlxuICogQHBhcmFtIHtSZWdpc3RyeVJvbGUgfCB1bmRlZmluZWR9IFtyb2xlXSAtIFJlcXVlc3RlZCByb2xlLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiB1bnN1cHBvcnRlZExhbmd1YWdlKGlkLCBsb2NhdGlvbiwgcm9sZSkge1xuICBjb25zdCBtZXNzYWdlID0gcm9sZSA9PSBcImZyb250ZW5kXCIgPyBcIk5vIGZyb250ZW5kIGFkYXB0ZXIgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBsYW5ndWFnZS5cIiA6XG4gICAgcm9sZSA9PSBcInRleHRCYWNrZW5kXCIgPyBcIk5vIHNvdXJjZSBiYWNrZW5kIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbGFuZ3VhZ2UuXCIgOlxuICAgICAgXCJObyBsYW5ndWFnZSBvciB0YXJnZXQgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBJRC5cIlxuXG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNvZGU6IFwiVU5TVVBQT1JURURfTEFOR1VBR0VcIixcbiAgICBsYW5ndWFnZTogaWQsXG4gICAgbG9jYXRpb24sXG4gICAgbWVzc2FnZVxuICB9KVxufVxuXG4vKipcbiAqIFRocm93cyBhIG5vcm1hbGl6ZWQgcmVnaXN0cnktc2hhcGUgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRmFpbHVyZSBkZXRhaWwuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2lkXSAtIENhbmRpZGF0ZSByZWdpc3RyeSBJRC5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFJlZ2lzdHJ5KG1lc3NhZ2UsIGlkID0gXCJyZWdpc3RyeVwiKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiSU5WQUxJRF9SRUdJU1RSWVwiLCBsYW5ndWFnZTogaWQsIG1lc3NhZ2V9KVxufVxuXG4vKipcbiAqIENoZWNrcyBmb3IgYW4gb3JkaW5hcnkgc3RyaW5nLWtleWVkIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IE9iamVjdC5wcm90b3R5cGVcbn1cblxuLyoqXG4gKiBEZWVwbHkgZnJlZXplcyByZWdpc3RyeSByZWNvcmRzIGFuZCBwdWJsaWMgZGVzY3JpcHRvcnMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZSAtIFJlZ2lzdHJ5LW93bmVkIHZhbHVlLlxuICogQHJldHVybnMge1R9IEZyb3plbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGVlcEZyZWV6ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGZvciAoY29uc3QgbmVzdGVkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBkZWVwRnJlZXplKG5lc3RlZClcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh2YWx1ZSlcbn1cbiJdfQ==
@@ -97,14 +97,14 @@ export declare function composeSourceMaps(outer: import("@jridgewell/trace-mappi
97
97
  * @param {object} generated - Generated program.
98
98
  * @param {string} generated.content - Exact generated content.
99
99
  * @param {string} generated.filename - Generated filename.
100
- * @param {import("./semantic/types.js").SemanticLanguage} generated.language - Generated language.
100
+ * @param {import("./semantic/types.js").GeneratedTextLanguage} generated.language - Generated text language.
101
101
  * @param {{filename: string, content: string, language?: import("./semantic/types.js").SemanticLanguage}[]} [generated.sources] - Exact source content overrides.
102
102
  * @returns {import("./semantic/types.js").SemantifoldMapping} Imported rich map.
103
103
  */
104
104
  export declare function mappingFromSourceMap(sourceMap: import("@jridgewell/trace-mapping").SourceMapInput, { content, filename, language, sources: provided }: {
105
105
  content: string;
106
106
  filename: string;
107
- language: import("./semantic/types.js").SemanticLanguage;
107
+ language: import("./semantic/types.js").GeneratedTextLanguage;
108
108
  sources?: {
109
109
  filename: string;
110
110
  content: string;
@@ -1 +1 @@
1
- {"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../../src/mapping.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../../src/mapping.js"],"names":[],"mappings":"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"}