semantifold 0.5.0 → 0.6.0

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