@kosdev-code/kos-dispense-sdk 3.0.27 → 3.0.29

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 (190) hide show
  1. package/.kos.json +7 -0
  2. package/{dispense-registration-manager-Dtb31fcI.cjs → dispense-registration-manager-CfWgJqfq.cjs} +590 -172
  3. package/dispense-registration-manager-CfWgJqfq.cjs.map +1 -0
  4. package/{dispense-registration-manager-Da9CW_cN.js → dispense-registration-manager-DtN0T_JG.js} +623 -205
  5. package/dispense-registration-manager-DtN0T_JG.js.map +1 -0
  6. package/{extension-utils-Cfhe358W.cjs → extension-utils-BWYG2dYG.cjs} +2 -2
  7. package/extension-utils-BWYG2dYG.cjs.map +1 -0
  8. package/{extension-utils-D_dnBLH6.js → extension-utils-BoXtjU5_.js} +2 -2
  9. package/extension-utils-BoXtjU5_.js.map +1 -0
  10. package/index.cjs +7 -5
  11. package/index.cjs.map +1 -1
  12. package/index.js +67 -65
  13. package/index.js.map +1 -1
  14. package/models/models/assembly/assembly-model.d.ts +8 -0
  15. package/models/models/assembly/assembly-model.d.ts.map +1 -1
  16. package/models/models/assembly/assembly-registration.d.ts +2 -0
  17. package/models/models/assembly/assembly-registration.d.ts.map +1 -1
  18. package/models/models/assembly/board-utils.d.ts.map +1 -1
  19. package/models/models/assembly/nozzle-utils.d.ts.map +1 -1
  20. package/models/models/assembly/pump-utils.d.ts.map +1 -1
  21. package/models/models/assembly/services/assembly-services.d.ts.map +1 -1
  22. package/models/models/assembly/types/index.d.ts +6 -0
  23. package/models/models/availability/availability-model.d.ts +2 -0
  24. package/models/models/availability/availability-model.d.ts.map +1 -1
  25. package/models/models/availability/types/index.d.ts +4 -0
  26. package/models/models/board/board-container-model.d.ts +8 -0
  27. package/models/models/board/board-container-model.d.ts.map +1 -1
  28. package/models/models/board/board-container-registration.d.ts +2 -0
  29. package/models/models/board/board-container-registration.d.ts.map +1 -1
  30. package/models/models/board/board-registration.d.ts +2 -0
  31. package/models/models/board/board-registration.d.ts.map +1 -1
  32. package/models/models/board/types/index.d.ts +12 -0
  33. package/models/models/cui-kit-state/cui-kit-state-model.d.ts +133 -0
  34. package/models/models/cui-kit-state/cui-kit-state-model.d.ts.map +1 -0
  35. package/models/models/cui-kit-state/index.d.ts +4 -0
  36. package/models/models/cui-kit-state/index.d.ts.map +1 -0
  37. package/models/models/cui-kit-state/types/index.d.ts +82 -0
  38. package/models/models/device-assembly/device-assembly-model.d.ts +4 -0
  39. package/models/models/device-assembly/device-assembly-model.d.ts.map +1 -1
  40. package/models/models/device-assembly/device-assembly-registration.d.ts +2 -0
  41. package/models/models/device-assembly/device-assembly-registration.d.ts.map +1 -1
  42. package/models/models/device-assembly/types/index.d.ts +4 -0
  43. package/models/models/generic-pour/generic-pour-model.d.ts +16 -0
  44. package/models/models/generic-pour/generic-pour-model.d.ts.map +1 -1
  45. package/models/models/generic-pour/generic-pour-registration.d.ts +2 -0
  46. package/models/models/generic-pour/generic-pour-registration.d.ts.map +1 -1
  47. package/models/models/generic-pour/types/index.d.ts +4 -0
  48. package/models/models/holder/holder-model.d.ts +6 -0
  49. package/models/models/holder/holder-model.d.ts.map +1 -1
  50. package/models/models/holder/services/holder-services.d.ts.map +1 -1
  51. package/models/models/holder/types/index.d.ts +6 -0
  52. package/models/models/holder-container/holder-container-model.d.ts +2 -0
  53. package/models/models/holder-container/holder-container-model.d.ts.map +1 -1
  54. package/models/models/holder-container/types/index.d.ts +14 -0
  55. package/models/models/index.d.ts +1 -0
  56. package/models/models/index.d.ts.map +1 -1
  57. package/models/models/ingredient/ingredient-model.d.ts +2 -0
  58. package/models/models/ingredient/ingredient-model.d.ts.map +1 -1
  59. package/models/models/ingredient/types/index.d.ts +4 -1
  60. package/models/models/ingredient-container/ingredient-container-model.d.ts +2 -0
  61. package/models/models/ingredient-container/ingredient-container-model.d.ts.map +1 -1
  62. package/models/models/ingredient-container/types/index.d.ts +6 -0
  63. package/models/models/nozzle/nozzle-model.d.ts +4 -2
  64. package/models/models/nozzle/nozzle-model.d.ts.map +1 -1
  65. package/models/models/nozzle/types/index.d.ts +6 -0
  66. package/models/models/pump/pump-model.d.ts +2 -0
  67. package/models/models/pump/pump-model.d.ts.map +1 -1
  68. package/models/models/pump/types/index.d.ts +6 -0
  69. package/models/models/pump-container/pump-container-model.d.ts +6 -0
  70. package/models/models/pump-container/pump-container-model.d.ts.map +1 -1
  71. package/models/models/pump-container/types/index.d.ts +6 -0
  72. package/models/utils/dispense-registration-manager.d.ts +29 -4
  73. package/models/utils/dispense-registration-manager.d.ts.map +1 -1
  74. package/models/utils/extension-utils.d.ts +22 -0
  75. package/models/utils/extension-utils.d.ts.map +1 -1
  76. package/models/utils/pour-context.d.ts +8 -0
  77. package/models/utils/pour-context.d.ts.map +1 -0
  78. package/models/utils/service.d.ts +1 -1
  79. package/models/utils/services/dispense/1.6.5/service.d.ts +1 -1
  80. package/models/utils/services/dispense/1.8.1/service.d.ts +1 -1
  81. package/models/utils/services/dispense/daily/service.d.ts +1 -1
  82. package/models.cjs +4 -2
  83. package/models.cjs.map +1 -1
  84. package/models.js +17 -15
  85. package/package.json +2 -2
  86. package/{pump-provider-uNNMh9uh.cjs → pump-provider-B4WR3LiY.cjs} +402 -443
  87. package/pump-provider-B4WR3LiY.cjs.map +1 -0
  88. package/{pump-provider-BQmCKz7S.js → pump-provider-CPUsLke5.js} +448 -489
  89. package/pump-provider-CPUsLke5.js.map +1 -0
  90. package/ui/contexts/assembly/assembly-provider.d.ts +8 -0
  91. package/ui/contexts/assembly/assembly-provider.d.ts.map +1 -1
  92. package/ui/contexts/availability/availability-provider.d.ts +8 -0
  93. package/ui/contexts/availability/availability-provider.d.ts.map +1 -1
  94. package/ui/contexts/board/board-provider.d.ts +8 -0
  95. package/ui/contexts/board/board-provider.d.ts.map +1 -1
  96. package/ui/contexts/board-container/board-container-provider.d.ts +8 -0
  97. package/ui/contexts/board-container/board-container-provider.d.ts.map +1 -1
  98. package/ui/contexts/cui-kit/cui-kit.d.ts +16 -1
  99. package/ui/contexts/cui-kit/cui-kit.d.ts.map +1 -1
  100. package/ui/contexts/device-assembly/device-assembly-provider.d.ts +8 -0
  101. package/ui/contexts/device-assembly/device-assembly-provider.d.ts.map +1 -1
  102. package/ui/contexts/holder/holder-provider.d.ts +8 -0
  103. package/ui/contexts/holder/holder-provider.d.ts.map +1 -1
  104. package/ui/contexts/holder-container/holder-container-provider.d.ts +8 -0
  105. package/ui/contexts/holder-container/holder-container-provider.d.ts.map +1 -1
  106. package/ui/contexts/ingredient/ingredient-provider.d.ts +8 -0
  107. package/ui/contexts/ingredient/ingredient-provider.d.ts.map +1 -1
  108. package/ui/contexts/ingredient-container/ingredient-container-provider.d.ts +8 -0
  109. package/ui/contexts/ingredient-container/ingredient-container-provider.d.ts.map +1 -1
  110. package/ui/contexts/nozzle/nozzle-provider.d.ts +8 -0
  111. package/ui/contexts/nozzle/nozzle-provider.d.ts.map +1 -1
  112. package/ui/contexts/pump/pump-provider.d.ts +8 -0
  113. package/ui/contexts/pump/pump-provider.d.ts.map +1 -1
  114. package/ui/hooks/assembly/use-assembly.d.ts +4 -0
  115. package/ui/hooks/assembly/use-assembly.d.ts.map +1 -1
  116. package/ui/hooks/assembly/with-assembly.d.ts +4 -0
  117. package/ui/hooks/assembly/with-assembly.d.ts.map +1 -1
  118. package/ui/hooks/availability/use-availability.d.ts +4 -0
  119. package/ui/hooks/availability/use-availability.d.ts.map +1 -1
  120. package/ui/hooks/board/use-board.d.ts +4 -0
  121. package/ui/hooks/board/use-board.d.ts.map +1 -1
  122. package/ui/hooks/board/with-board.d.ts +4 -0
  123. package/ui/hooks/board/with-board.d.ts.map +1 -1
  124. package/ui/hooks/board-container/use-board-container.d.ts +4 -0
  125. package/ui/hooks/board-container/use-board-container.d.ts.map +1 -1
  126. package/ui/hooks/board-container/with-board-container.d.ts +4 -0
  127. package/ui/hooks/board-container/with-board-container.d.ts.map +1 -1
  128. package/ui/hooks/cui-kit/use-ambient-attract-timers.d.ts.map +1 -1
  129. package/ui/hooks/cui-kit/use-brands.d.ts.map +1 -1
  130. package/ui/hooks/cui-kit/use-cui-kit.d.ts +50 -5
  131. package/ui/hooks/cui-kit/use-cui-kit.d.ts.map +1 -1
  132. package/ui/hooks/cui-kit/use-default-cui-kit-lifecycle.d.ts.map +1 -1
  133. package/ui/hooks/cui-kit/use-dispense-timers.d.ts.map +1 -1
  134. package/ui/hooks/device-assembly/use-device-assembly.d.ts +4 -0
  135. package/ui/hooks/device-assembly/use-device-assembly.d.ts.map +1 -1
  136. package/ui/hooks/device-assembly/with-device-assembly.d.ts +4 -0
  137. package/ui/hooks/device-assembly/with-device-assembly.d.ts.map +1 -1
  138. package/ui/hooks/generic-pour/use-generic-pour.d.ts +4 -0
  139. package/ui/hooks/generic-pour/use-generic-pour.d.ts.map +1 -1
  140. package/ui/hooks/generic-pour/with-generic-pour.d.ts +4 -0
  141. package/ui/hooks/generic-pour/with-generic-pour.d.ts.map +1 -1
  142. package/ui/hooks/holder/use-holder.d.ts +4 -0
  143. package/ui/hooks/holder/use-holder.d.ts.map +1 -1
  144. package/ui/hooks/holder/with-holder.d.ts +4 -0
  145. package/ui/hooks/holder/with-holder.d.ts.map +1 -1
  146. package/ui/hooks/holder-container/use-holder-container.d.ts +4 -0
  147. package/ui/hooks/holder-container/use-holder-container.d.ts.map +1 -1
  148. package/ui/hooks/holder-container/with-holder-container.d.ts +4 -0
  149. package/ui/hooks/holder-container/with-holder-container.d.ts.map +1 -1
  150. package/ui/hooks/ingredient/use-ingredient-pour.d.ts +7 -1
  151. package/ui/hooks/ingredient/use-ingredient-pour.d.ts.map +1 -1
  152. package/ui/hooks/ingredient/use-ingredient.d.ts +4 -0
  153. package/ui/hooks/ingredient/use-ingredient.d.ts.map +1 -1
  154. package/ui/hooks/ingredient/with-ingredient.d.ts +4 -0
  155. package/ui/hooks/ingredient/with-ingredient.d.ts.map +1 -1
  156. package/ui/hooks/ingredient-container/use-ingredient-container.d.ts +4 -0
  157. package/ui/hooks/ingredient-container/use-ingredient-container.d.ts.map +1 -1
  158. package/ui/hooks/ingredient-container/with-ingredient-container.d.ts +4 -0
  159. package/ui/hooks/ingredient-container/with-ingredient-container.d.ts.map +1 -1
  160. package/ui/hooks/nozzle/use-nozzle.d.ts +4 -0
  161. package/ui/hooks/nozzle/use-nozzle.d.ts.map +1 -1
  162. package/ui/hooks/nozzle/with-nozzle.d.ts +4 -0
  163. package/ui/hooks/nozzle/with-nozzle.d.ts.map +1 -1
  164. package/ui/hooks/nozzle-pour/use-nozzle-pour.d.ts +7 -1
  165. package/ui/hooks/nozzle-pour/use-nozzle-pour.d.ts.map +1 -1
  166. package/ui/hooks/pour/use-pour.d.ts.map +1 -1
  167. package/ui/hooks/utils/pour-strategy/hold-to-pour-intent-strategy.d.ts +4 -0
  168. package/ui/hooks/utils/pour-strategy/hold-to-pour-intent-strategy.d.ts.map +1 -1
  169. package/ui/hooks/utils/pour-strategy/hold-to-pour-strategy.d.ts +4 -0
  170. package/ui/hooks/utils/pour-strategy/hold-to-pour-strategy.d.ts.map +1 -1
  171. package/ui/hooks/utils/pour-strategy/pour-strategy.d.ts +10 -0
  172. package/ui/hooks/utils/pour-strategy/pour-strategy.d.ts.map +1 -1
  173. package/ui/hooks/utils/pour-strategy/tap-or-hold-to-pour-intent-strategy.d.ts +4 -0
  174. package/ui/hooks/utils/pour-strategy/tap-or-hold-to-pour-intent-strategy.d.ts.map +1 -1
  175. package/ui/hooks/utils/pour-strategy/tap-to-pour-intent-strategy.d.ts +4 -0
  176. package/ui/hooks/utils/pour-strategy/tap-to-pour-intent-strategy.d.ts.map +1 -1
  177. package/ui/hooks/utils/pour-strategy/tap-to-pour-strategy.d.ts +4 -0
  178. package/ui/hooks/utils/pour-strategy/tap-to-pour-strategy.d.ts.map +1 -1
  179. package/ui/utils/pour-context.d.ts +1 -7
  180. package/ui/utils/pour-context.d.ts.map +1 -1
  181. package/ui.cjs +3 -2
  182. package/ui.cjs.map +1 -1
  183. package/ui.js +49 -48
  184. package/ui.js.map +1 -1
  185. package/dispense-registration-manager-Da9CW_cN.js.map +0 -1
  186. package/dispense-registration-manager-Dtb31fcI.cjs.map +0 -1
  187. package/extension-utils-Cfhe358W.cjs.map +0 -1
  188. package/extension-utils-D_dnBLH6.js.map +0 -1
  189. package/pump-provider-BQmCKz7S.js.map +0 -1
  190. package/pump-provider-uNNMh9uh.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"dispense-registration-manager-Da9CW_cN.js","sources":["../../../packages/kos-dispense-sdk/src/models/constants/constants.ts","../../../packages/kos-dispense-sdk/src/models/models/ingredient/ingredient-model.ts","../../../packages/kos-dispense-sdk/src/models/models/ingredient/services/ingredient-services.ts","../../../packages/kos-dispense-sdk/src/models/models/ingredient-container/ingredient-container-model.ts","../../../packages/kos-dispense-sdk/src/models/models/holder/services/holder-services.ts","../../../packages/kos-dispense-sdk/src/models/models/holder/services/assignment-services.ts","../../../packages/kos-dispense-sdk/src/models/models/holder/holder-model.ts","../../../packages/kos-dispense-sdk/src/models/models/assembly/holder-utils.ts","../../../packages/kos-dispense-sdk/src/models/models/assembly/services/assembly-services.ts","../../../packages/kos-dispense-sdk/src/models/models/board/board-container-model.ts","../../../packages/kos-dispense-sdk/src/models/models/board/utils/board-trouble-data-mapper.ts","../../../packages/kos-dispense-sdk/src/models/models/pump-container/pump-container-model.ts","../../../packages/kos-dispense-sdk/src/models/models/pump/utils/pump-trouble-resolver.ts","../../../packages/kos-dispense-sdk/src/models/models/board/utils/board-trouble-resolver.ts","../../../packages/kos-dispense-sdk/src/models/models/board/board-model.ts","../../../packages/kos-dispense-sdk/src/models/models/board/board-registration.ts","../../../packages/kos-dispense-sdk/src/models/models/board/board-container-registration.ts","../../../packages/kos-dispense-sdk/src/models/models/holder-container/holder-container-model.ts","../../../packages/kos-dispense-sdk/src/models/models/assembly/board-utils.ts","../../../packages/kos-dispense-sdk/src/models/models/types/pouring.ts","../../../packages/kos-dispense-sdk/src/models/models/pump/services/pump-services.ts","../../../packages/kos-dispense-sdk/src/models/models/pump/pump-model.ts","../../../packages/kos-dispense-sdk/src/models/models/assembly/pump-utils.ts","../../../packages/kos-dispense-sdk/src/models/models/assembly/assembly-model.ts","../../../packages/kos-dispense-sdk/src/models/models/assembly/assembly-registration.ts","../../../packages/kos-dispense-sdk/src/models/models/availability/availability-model.ts","../../../packages/kos-dispense-sdk/src/models/models/nozzle/services/nozzle-services.ts","../../../packages/kos-dispense-sdk/src/models/models/nozzle/nozzle-model.ts","../../../packages/kos-dispense-sdk/src/models/models/device-assembly/device-assembly-model.ts","../../../packages/kos-dispense-sdk/src/models/models/device-assembly/device-assembly-registration.ts","../../../packages/kos-dispense-sdk/src/models/models/generic-pour/services/generic-pour-services.ts","../../../packages/kos-dispense-sdk/src/models/models/generic-pour/generic-pour-model.ts","../../../packages/kos-dispense-sdk/src/models/models/generic-pour/generic-pour-registration.ts","../../../packages/kos-dispense-sdk/src/models/utils/registration.ts","../../../packages/kos-dispense-sdk/src/models/utils/dispense-registration-manager.ts"],"sourcesContent":["/**\n * Extension point exposed by the KOS Dispense SDK models\n * */\nexport enum ExtensionType {\n /**\n * Loads data that is passed as context to the {@link IngredientMapper}. Register with\n * {@link DispenseExtensionManager.registerIngredientLoader}.\n */\n IngredientLoader = \"kos.ingredient.loader\",\n\n /**\n * Maps ingredient service data into the `data` property of the {@link IngredientModel}, for properties the\n * base model does not carry. Register with {@link DispenseExtensionManager.registerIngredientDataMapper}.\n */\n IngredientMapper = \"kos.ingredient.mapper\",\n\n IngredientIndex = \"kos.ingredient.index\",\n /**\n * Maps the type property of the ingredient into the {@link IngredientModel}\n * */\n IngredientTypeMapper = \"kos.ingredient.type.mapper\",\n\n /**\n * Maps the type property of the holder into the {@link HolderModel}\n * */\n HolderTypeMapper = \"kos.holder.type.mapper\",\n\n HolderMapper = \"kos.holder.mapper\",\n\n HolderIndex = \"kos.holder.index\",\n /**\n * Maps the ingredientId property of the holder into the {@link HolderModel}.\n * If not provided, the ingredientId will assume that the value is mapped from the\n * ingredientId property of the service response.\n * */\n HolderIngredientMapper = \"kos.holder.ingredient.mapper\",\n\n /**\n * Maps availability service data into the `data` property of the {@link AvailabilityModel}. Register with\n * {@link DispenseExtensionManager.registerAvailabilityDataMapper}.\n */\n AvailabilityMapper = \"kos.availability.mapper\",\n\n /**\n * Loads data that is passed as context to the {@link AvailabilityMapper}, such as UI-specific brandset data.\n * Register with {@link DispenseExtensionManager.registerAvailabilityLoader}.\n */\n AvailabilityLoader = \"kos.availability.loader\",\n\n /**\n * Maps the abstract {@link SelectedPourable} data into a format that is specific to the nozzle.\n * */\n SelectedPourableMapper = \"kos.selected.pourable.mapper\",\n\n /**\n * Maps additional assembly response properties into the {@link AssemblyModel}, for backends that extend the\n * base assembly. Register with {@link DispenseExtensionManager.registerAssemblyDataMapper}.\n */\n AssemblyMapper = \"kos.assembly.mapper\",\n BoardMapper = \"kos.board.mapper\",\n BoardIndex = \"kos.board.index\",\n PumpIndex = \"kos.pump.index\",\n AssemblyFeatureFlags = \"kos.assembly.feature.flags\",\n}\n\nexport enum DispenseModelType {\n Nozzle = \"nozzle-model\",\n Availability = \"availability-model\",\n Holder = \"holder-model\",\n HolderContainer = \"holder-container-model\",\n IngredientContainer = \"ingredient-container-model\",\n Ingredient = \"ingredient-model\",\n Pump = \"pump-model\",\n PumpContainer = \"pump-container-model\",\n}\n","import {\n Kos,\n KosModelRegistrationBean,\n isKosModel,\n kosModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport type { IngredientModel, IngredientOptions } from \"./types\";\n\nconst MODEL_TYPE = \"ingredient-model\";\n\n/**\n * @kosService dispense.ingredient\n * @kosApiLevel 2\n */\n@kosModel(MODEL_TYPE)\nclass IngredientModelImpl<AdditionalData extends object = any>\n implements IngredientModel\n{\n id: string;\n ingredientId: string;\n name: string;\n type: string;\n data: AdditionalData;\n\n constructor(\n modelId: string,\n {\n name,\n type,\n data,\n ingredientId,\n ...rest\n }: IngredientOptions<AdditionalData>\n ) {\n this.id = modelId;\n this.ingredientId = ingredientId;\n this.name = name;\n this.type = type;\n this.data = data;\n Object.assign(this, rest);\n }\n\n updateModel({\n name,\n type,\n data,\n ingredientId,\n ...rest\n }: IngredientOptions<AdditionalData>): void {\n this.name = name;\n this.type = type;\n this.ingredientId = ingredientId;\n this.data = data;\n Object.assign(this, rest);\n }\n\n // -------------------LIFECYCLE----------------------------\n\n // -------------------ENTITY----------------------------\n}\n\n/**\n * Registration bean for {@link IngredientModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: curried factory, `Ingredient.factory(id)(options)`. Returns the existing model when the id is already in use and ignores the options.\n * - `predicate`: type guard that narrows an `IKosDataModel` to `IngredientModel`.\n * - `registration`: registry entry that can be spread into an `IKosRegistry[\"models\"]` map.\n *\n * Ingredient is not a singleton: each id has its own instance. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: Ingredient.type, id: \"ingredientId\" })\n * private ingredient!: IngredientModel;\n * ```\n */\nexport const Ingredient: Readonly<\n KosModelRegistrationBean<IngredientModel, IngredientOptions>\n> = {\n registration: {\n [MODEL_TYPE]: {\n class: IngredientModelImpl,\n singleton: false,\n },\n },\n type: MODEL_TYPE,\n predicate: isKosModel(MODEL_TYPE),\n factory: Kos.Factory.create<IngredientModel, IngredientOptions>(MODEL_TYPE),\n};\n","import { ServiceFactory, resolveServiceUrl } from \"@kosdev-code/kos-ui-sdk\";\nconst { URL } = resolveServiceUrl(\"INGREDIENT_SERVICE\");\nconst { getOne } = ServiceFactory.build({\n basePath: `${URL}/api/ext/dispense/ingredients`,\n});\n\nexport interface BrandsetResponse {\n brandSet: IngredientResponse[];\n}\n/**\n * Base ingredient response returned by the service. Most likely this will be augmented by the {@link IngredientMapper} extension point\n * to allow for additional properties to be added to the ingredient data.\n * */\nexport interface IngredientResponse {\n /** The ingredient id */\n id: string;\n\n /**\n * The raw ingredient without considering the source. This will only be different in cases where there are asymetrical nozzles with\n * discrete ingredient sources.\n */\n ingredientId: string;\n\n /** The ingredient name */\n name: string;\n\n /**\n * The ingredient type as defined by the java application. This can be any value and is generally used\n * to classify ingredients into groups. For example, the ingredient type may be used to identify ingredients that are\n * used for flavor shots.\n */\n type: string;\n}\n/**\n * @category Service\n * Retrieves the initial Ingredient data.\n */\nexport const getIngredients = async () => {\n const response = await getOne<BrandsetResponse>({\n urlOverride: `${URL}/api/ext/dispense/ingredients`,\n });\n return response;\n};\n","import type {\n IKosModelContainer,\n KosContext,\n SingletonKosModelRegistrationBean,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport {\n Kos,\n KosExtensionUtils,\n KosLog,\n KosModelContainer,\n isKosModel,\n kosChild,\n kosModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { ExtensionType } from \"../../constants\";\nimport { Ingredient, IngredientModel, IngredientOptions } from \"../ingredient\";\nimport { getIngredients } from \"../ingredient/services\";\nimport type {\n IngredientContainerModel,\n IngredientContainerOptions,\n} from \"./types\";\n\nconst MODEL_TYPE = \"ingredient-container-model\";\n\nconst log = KosLog.createLogger({ name: \"ingredient-container-model\" });\n\n/**\n * @kosService dispense.ingredient\n * @kosApiLevel 2\n */\n@kosModel(MODEL_TYPE)\nclass IngredientContainerModelImpl<AdditionalData extends object = any>\n implements IngredientContainerModel<AdditionalData>\n{\n id: string;\n @kosChild ingredients: IKosModelContainer<IngredientModel<AdditionalData>>;\n constructor(modelId: string, options: IngredientContainerOptions) {\n this.id = modelId;\n\n // Extension Point: kos.ingredient.index\n this.ingredients = new KosModelContainer<IngredientModel<AdditionalData>>({\n indexMap: {\n ingredientType: \"type\",\n },\n extensionId: ExtensionType.IngredientIndex,\n parentId: modelId,\n });\n if (options) {\n // Assign options properties here.\n }\n }\n\n updateModel(): void {\n // Update model properties here.\n }\n\n // -------------------LIFECYCLE----------------------------\n\n getIngredientsByType(type: string): IngredientModel[] {\n return this.ingredients.getIndexByKey(\"ingredientType\", type);\n }\n\n async load(context?: KosContext): Promise<void> {\n log.debug(`loading ingredient container ${this.id}`);\n const allIngredients = await getIngredients();\n if (allIngredients?.status !== 200) {\n throw new Error(\"Failed to load ingredients\");\n }\n\n const ingredientContext = await KosExtensionUtils.executeLoaderExtension({\n context,\n extension: ExtensionType.IngredientLoader,\n });\n\n const ingredientData = allIngredients?.data ?? {};\n for (const key of Object.keys(ingredientData)) {\n for (const ingredientData of allIngredients?.data?.[key] || []) {\n const data: AdditionalData =\n await KosExtensionUtils.executeDataMapperExtension({\n extension: ExtensionType.IngredientMapper,\n data: ingredientData,\n contextData: ingredientContext,\n });\n\n const type = await KosExtensionUtils.executePropertyMapperExtension({\n extension: ExtensionType.IngredientTypeMapper,\n data: ingredientData,\n contextData: ingredientContext,\n });\n\n const ingredientOptions: IngredientOptions = {\n ...ingredientData,\n type: type || ingredientData.type,\n ...data,\n data,\n };\n const ingredient = Ingredient.factory(ingredientData.id)(\n ingredientOptions\n );\n this.ingredients.addModel(ingredient);\n }\n }\n //load all the ingredient models\n }\n\n // -------------------ENTITY----------------------------\n}\n\n/**\n * Registration bean for {@link IngredientContainerModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: `IngredientContainer.factory(options)` returns the single instance, creating it on the first call.\n * - `predicate`: type guard that narrows an `IKosDataModel` to `IngredientContainerModel`.\n * - `registration`: registry entry that can be spread into an `IKosRegistry[\"models\"]` map.\n *\n * IngredientContainer is a singleton. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: IngredientContainer.type })\n * private ingredientContainer!: IngredientContainerModel;\n * ```\n */\nexport const IngredientContainer: SingletonKosModelRegistrationBean<\n IngredientContainerModel,\n IngredientContainerOptions\n> = {\n registration: {\n [MODEL_TYPE]: {\n class: IngredientContainerModelImpl,\n singleton: true,\n },\n },\n type: MODEL_TYPE,\n predicate: isKosModel(MODEL_TYPE),\n factory: Kos.Singleton.create<\n IngredientContainerModel,\n IngredientContainerOptions\n >(MODEL_TYPE),\n};\n","import {\n KosLog,\n ServiceFactory,\n resolveServiceUrl,\n} from \"@kosdev-code/kos-ui-sdk\";\nconst { URL } = resolveServiceUrl(\"HOLDER_SERVICE\");\nconst { getAll, postModel, deleteModel } = ServiceFactory.build({\n basePath: `${URL}/api/kos/holders`,\n});\n\nconst log = KosLog.createLogger({\n name: \"holder-service\",\n group: \"Services\",\n});\n\nexport interface Pump {\n inserted: boolean;\n beveragePour: boolean;\n ingredientPour: boolean;\n type: string;\n category: string;\n ingredientId: string;\n holderPath: string;\n boardPath: string;\n nozzlePath: string;\n name: string;\n path: string;\n}\nexport interface HolderResponse {\n path: string;\n name: string;\n ingType: string;\n ingSource: string;\n}\n/**\n * @category Service\n * Retrieves the initial Holder data.\n */\nexport const getHolders = async () => {\n const response = await getAll<HolderResponse>({});\n return response;\n};\n\nexport const assignHolderIngredient = async (\n holderPath: string,\n ingredientId: string\n) => {\n if (!holderPath || !ingredientId) {\n throw new Error(\"Missing holderPath or ingredientId\");\n }\n\n const response = await postModel({\n model: { holderPath, ingredientId },\n urlOverride: `${URL}/api/ext/dispense/assignments`,\n });\n\n return response;\n};\n\nexport const unassignHolderIngredient = async (holderPath: string) => {\n if (!holderPath) {\n throw new Error(\"Missing holderPath\");\n }\n\n const response = await deleteModel({\n id: holderPath,\n urlOverride: `${URL}/api/ext/dispense/assignments/${holderPath}`,\n });\n\n return response;\n};\n\nexport const replaceLine = async (holderPath: string) => {\n if (!holderPath) throw new Error(\"Missing holderPath\");\n\n log.debug(\n `sending POST request to /api/ext/dispense/pumpEvents/replaceLine/${holderPath}`\n );\n\n const response = await postModel({\n model: {},\n urlOverride: `${URL}/api/ext/dispense/pumpEvents/replaceLine/${holderPath}`,\n });\n\n return response;\n};\n","import {\n FetchError,\n ServiceFactory,\n resolveServiceUrl,\n} from \"@kosdev-code/kos-ui-sdk\";\nconst { URL } = resolveServiceUrl(\"ASSIGNMENT_SERVICE\");\nconst { getAll, postModel, deleteModel } = ServiceFactory.build({\n destinationAddress: \"\",\n basePath: `${URL}/api/ext/dispense/assignments`,\n});\n// test\nconst useFos = window.kosUseFos;\n\nexport interface Assignment {\n ingredientId: string;\n holderPath: string;\n containerId?: string;\n fuelGauge?: number;\n}\n\nexport interface AssignmentFactoryJson {\n stickerId: string;\n stickerCode: string;\n}\n/**\n * @category Service\n * Retrieves the initial dispenser data.\n */\nexport const getAssignments = async () => {\n const response = await getAll<Assignment>({ fos: useFos });\n return response;\n};\nexport type AssignmentErrorType =\n | \"errIdLen\"\n | \"errCodeLen\"\n | \"errIdFormat\"\n | \"errCodeFormat\"\n | \"errVerify\"\n | \"errBadJson\"\n | \"unknownError\";\ntype AssignmentResponse = [\n AssignmentErrorType | undefined,\n Assignment | undefined\n];\nexport const sendRfidOverride = async (\n holderPath: string,\n overrides: any\n): Promise<AssignmentResponse> => {\n const factoryJson = JSON.stringify(overrides);\n const url = `${URL}/api/ext/dispense/assignments`;\n try {\n const response = await postModel({\n model: { holderPath, factoryJson },\n urlOverride: url,\n });\n if (response?.status === 200 && response?.data?.error) {\n return [response.data.error || \"unknownError\", response.data];\n }\n\n return [undefined, response?.data];\n } catch (error) {\n if (error instanceof FetchError) {\n return [\n error.payload?.data?.error || \"unknownError\",\n error.payload?.data,\n ];\n }\n }\n return [\"unknownError\", undefined];\n};\n\nexport const addAssignment = async (assignment: Assignment) => {\n const url = useFos\n ? `${URL}/api/ingredients/assignments/${assignment.holderPath}`\n : `${URL}/api/ext/dispense/assignments`;\n const response = await postModel({\n model: { ...assignment, fuelGauge: 680 },\n fos: useFos,\n urlOverride: url,\n });\n return response;\n};\n\nexport const deleteAssignment = async (id: string) => {\n const response = await deleteModel({ id, fos: useFos });\n return response;\n};\n","/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\nimport type {\n IKosModelContainer,\n KosContextLogger,\n KosCreationContext,\n KosModelRegistrationBean,\n TroubleAware,\n TroubleModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport {\n EXTENSION_TROUBLE_DATA_MAPPER,\n EXTENSION_TROUBLE_MAPPER,\n ExtensionManager,\n Kos,\n KosLog,\n KosModelContainer,\n getKosModelSync,\n isKosModel,\n kosAction,\n kosChild,\n kosDependency,\n kosModel,\n kosTroubleAware,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { DispenseModelType } from \"../../constants\";\nimport { type IngredientModel } from \"../ingredient\";\nimport {\n IngredientContainer,\n type IngredientContainerModel,\n} from \"../ingredient-container\";\nimport { type PumpModel } from \"../pump\";\nimport type { PumpTroubleData } from \"../pump/utils/pump-trouble-resolver\";\nimport type { IntentAwareProps } from \"../types\";\nimport type { HolderSlice } from \"../types/assembly\";\nimport {\n assignHolderIngredient,\n replaceLine,\n sendRfidOverride,\n unassignHolderIngredient,\n type AssignmentErrorType,\n} from \"./services\";\nimport type { HolderModel, HolderOptions } from \"./types\";\n\nconst MODEL_TYPE = DispenseModelType.Holder;\n\nconst log = KosLog.createLogger({ name: \"holder-model\" });\n\nexport interface HolderTroubleData {\n holderPaths: string[];\n holderNames: string[];\n}\n\nexport interface ContainerTroubleData {\n ingredients: string[];\n unknonwnIngredientId?: string;\n}\nExtensionManager[EXTENSION_TROUBLE_MAPPER].register(\n \"holder\",\n async (trouble: TroubleModel<HolderTroubleData>) => {\n const result: string[] = [];\n result.push(...trouble.data.holderPaths);\n return result;\n }\n);\n\nExtensionManager[EXTENSION_TROUBLE_DATA_MAPPER].register(\n \"pump\",\n async (trouble: TroubleModel<PumpTroubleData>) => {\n // If the trouble is related to a container, we don't need to map the data\n\n if (trouble.data.pumpPath) {\n const { model: pumpModel } = getKosModelSync<PumpModel>(\n trouble.data.pumpPath\n );\n\n if (pumpModel) {\n const ingredientModel = pumpModel.ingredientId\n ? getKosModelSync<IngredientModel>(pumpModel.ingredientId).model\n : undefined;\n return {\n ingredientId: pumpModel.ingredientId,\n ingredientName:\n ingredientModel?.displayName ?? (ingredientModel?.name || \"\"),\n childPumpName: pumpModel.name,\n };\n }\n }\n return {};\n }\n);\n\nExtensionManager[EXTENSION_TROUBLE_DATA_MAPPER].register(\n \"holder\",\n async (trouble: TroubleModel<HolderTroubleData>) => {\n if (trouble.data.holderNames.length > 0) {\n const holderName = trouble.data.holderNames[0];\n return {\n holderName: holderName || \"\",\n };\n }\n return {};\n }\n);\n\nExtensionManager[EXTENSION_TROUBLE_DATA_MAPPER].register(\n \"container\",\n async (trouble: TroubleModel<ContainerTroubleData>) => {\n if (trouble.data.ingredients.length > 0) {\n const ingredientId = trouble.data.ingredients[0];\n const { model } = getKosModelSync<IngredientModel>(ingredientId);\n return {\n ingredientName: model?.displayName ?? (model?.name || \"\"),\n ingredients: trouble.data.ingredients ? trouble.data.ingredients : [],\n unknonwnIngredientId: trouble.data.unknonwnIngredientId ?? \"\",\n };\n }\n return {};\n }\n);\n\nclass AssignmentError extends Error {\n type: AssignmentErrorType;\n constructor(type: AssignmentErrorType, message: string) {\n super(message);\n this.name = \"AssignmentError\";\n this.type = type;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface, @typescript-eslint/no-unused-vars\ninterface HolderModelImpl<AdditionalData extends object = any>\n extends TroubleAware {}\n/**\n * @kosService dispense.holder\n * @kosApiLevel 2\n */\n@kosModel(MODEL_TYPE)\n@kosTroubleAware()\nclass HolderModelImpl<AdditionalData extends object = any>\n implements HolderModel<AdditionalData>\n{\n id: string;\n path: string;\n name: string;\n ingredientId?: string;\n ingredientType?: string;\n ingredientSource?: string;\n group: string;\n slice: HolderSlice;\n logger: KosContextLogger;\n data: AdditionalData;\n enjoyByDate?: Date;\n attributes: Record<string, any>;\n @kosChild pumps: IKosModelContainer<PumpModel>;\n @kosDependency({ modelType: IngredientContainer.type })\n ingredientContainer!: IngredientContainerModel;\n\n constructor(\n modelId: string,\n {\n path,\n name,\n ingredientSource,\n ingredientId,\n ingredientType,\n slice,\n group,\n data,\n enjoyByDate,\n attributes,\n }: HolderOptions,\n context: KosCreationContext\n ) {\n this.id = modelId;\n this.path = path;\n this.name = name;\n this.ingredientType = ingredientType;\n this.ingredientSource = ingredientSource;\n this.ingredientId = ingredientId;\n this.group = group;\n this.slice = slice;\n this.enjoyByDate = enjoyByDate;\n this.data = data;\n this.pumps = new KosModelContainer<PumpModel>({\n parentId: modelId,\n sortKey: \"path\",\n });\n this.attributes = attributes || {};\n this.logger = context.logger;\n }\n\n updateModel({\n path,\n name,\n ingredientSource,\n ingredientId,\n ingredientType,\n group,\n slice,\n enjoyByDate,\n data,\n }: HolderOptions<AdditionalData>): void {\n // Update model properties here.\n\n this.path = path;\n this.name = name;\n this.ingredientId = ingredientId;\n this.ingredientType = ingredientType;\n this.ingredientSource = ingredientSource;\n this.enjoyByDate = enjoyByDate;\n this.slice = slice;\n this.group = group;\n this.data = data;\n }\n\n get hasEnjoyByDate() {\n return !!this.enjoyByDate && !this.unassigned;\n }\n get hasEnjoyByWarning() {\n return this.troublesByType[\"EnjoyByTrouble\"]?.length > 0;\n }\n\n get nozzlePaths() {\n return this.pumps.data.map((pump) => pump.nozzlePath);\n }\n\n async cancelPour() {\n await Promise.all(\n this.pumps.data\n .filter((pump) => pump.isPouring)\n .map((pump) => pump.cancelPour())\n );\n }\n\n get canPour() {\n return !this.shouldDefer && this.pumps.data.every((pump) => pump.canPour);\n }\n\n get isPouring() {\n const _isPouring = this.pumps.data.some((pump) => pump.isPouring);\n this.logger.debug(`isPouring: ${!!_isPouring}`);\n return _isPouring;\n }\n\n async performIntent(props: IntentAwareProps) {\n const intent = typeof props === \"string\" ? props : props.intent;\n const pumpPath = typeof props === \"string\" ? undefined : props.pumpPath;\n const pump = pumpPath ? this.pumps.getModel(pumpPath) : this.pumps.data[0];\n return pump?.performIntent({ intent });\n }\n\n get pourState() {\n const state = this.pumps.data.reduce((resolvedState, pump) => {\n if (pump.pouringState) {\n return pump.pouringState;\n }\n return resolvedState;\n }, \"\");\n return state;\n }\n get nozzlePath() {\n return this.pumps.data[0]?.nozzlePath;\n }\n\n get pumpPaths() {\n return this.pumps.data.map((pump) => pump.id);\n }\n\n get sortedPumps() {\n return this.pumps.data.sort((a, b) => {\n if (a.virtual && !b.virtual) {\n return -1;\n }\n\n if (!a.virtual && b.virtual) {\n return 1;\n }\n\n return a.name.localeCompare(b.name);\n });\n }\n\n get ingredient(): IngredientModel | undefined {\n if (!this.ingredientId) {\n return undefined;\n }\n const ingredient = this.ingredientContainer?.ingredients.getModel(\n this.ingredientId\n );\n return ingredient;\n }\n get ingredientName(): string {\n if (this.ingredient) {\n return this.ingredient.displayName ?? this.ingredient.name;\n } else if (this.ingredientId) {\n // If the ingredient is not found in the container, it is likely that the ingredient\n return \"unknown\";\n } else {\n return \"\";\n }\n }\n\n get previousIngredient(): IngredientModel | undefined {\n if (!this.prevIngredientId) {\n return undefined;\n }\n const ingredient = this.ingredientContainer?.ingredients.getModel(\n this.prevIngredientId\n );\n return ingredient;\n }\n\n get previousIngredientName(): string {\n if (this.previousIngredient) {\n return (\n this.previousIngredient.displayName ?? this.previousIngredient.name\n );\n } else if (this.prevIngredientId) {\n // If the ingredient is not found in the container, it is likely that the ingredient\n return \"unknown\";\n } else {\n return \"\";\n }\n }\n\n get prevIngredientId() {\n return this.pumps.data?.[0]?.prevIngredientId;\n }\n\n get unassigned() {\n return (\n (!this.ingredientId || this.ingredientId === \"0\") &&\n (!this.prevIngredientId || this.prevIngredientId === \"0\")\n );\n }\n\n get removed() {\n return (\n (!this.ingredientId || this.ingredientId === \"0\") &&\n this.prevIngredientId !== undefined &&\n this.prevIngredientId !== \"0\"\n );\n }\n\n get maxVolume() {\n return this.slice.maxVolMl ?? 0;\n }\n\n get remainingVolume() {\n return this.slice.currentVolMl ?? 0;\n }\n\n get hasMaxVolume() {\n return this.slice.maxVolMl !== undefined;\n }\n\n get hasRemainingVolume() {\n return this.slice.currentVolMl !== undefined;\n }\n\n get fillPercent() {\n return this.remainingVolume <= 0\n ? 0\n : Math.floor(((this.remainingVolume || 1) / (this.maxVolume || 1)) * 100);\n }\n\n get hasFuelGuage() {\n return this.hasMaxVolume && this.hasRemainingVolume;\n }\n\n updateIngredient(ingredientId?: string) {\n if (this.ingredientId === ingredientId) {\n return;\n }\n kosAction(() => {\n this.ingredientId = ingredientId;\n });\n }\n\n async resolveIntentVolume(intent: string) {\n const pump = this.pumps.data[0];\n if (!pump) {\n return { volume: -1 };\n }\n return pump.resolveIntentVolume(intent);\n }\n\n async overrideRfidCode<T extends Record<string, any>>(overrides: T) {\n if (!overrides) {\n throw new Error(\"Invalid override\");\n }\n try {\n const [error, result] = await sendRfidOverride(this.path, overrides);\n if (error) {\n throw new AssignmentError(\n error,\n `Failed to perform rfid override on holder ${this.id}`\n );\n }\n\n kosAction(() => {\n this.ingredientId = result?.ingredientId;\n });\n return result;\n } catch (e) {\n log.error(`Failed to perform rfid override on holder ${this.id}`, e);\n throw e;\n }\n }\n async assignIngredient(ingredientId?: string) {\n try {\n if (ingredientId) {\n await assignHolderIngredient(this.path, ingredientId);\n } else {\n await unassignHolderIngredient(this.path);\n }\n kosAction(() => {\n this.ingredientId = ingredientId;\n });\n } catch (e) {\n log.error(`Failed to perform assign ingredient to holder ${this.id}`, e);\n throw e;\n }\n }\n\n /**\n * @kosApiLevel 3\n */\n get shouldDefer() {\n return this.troubles.some((trouble) => trouble.shouldDefer);\n }\n async replaceLine() {\n await replaceLine(this.path);\n\n return;\n }\n\n // -------------------LIFECYCLE----------------------------\n\n // ----------------------------------\n // UNCOMMENT FOR TESTING FUEL GAUGE\n // ----------------------------------\n\n // async load() {\n // const random = Math.max(1000, Math.floor(Math.random() * 5000));\n // this.slice.maxVolMl = 1000;\n // setInterval(() => {\n // kosAction(() => {\n // if (this.remainingVolume < -100) {\n // this.slice.maxVolMl = 1000;\n // this.slice.currentVolMl = this.maxVolume;\n // } else {\n // this.slice.currentVolMl = this.remainingVolume - 50;\n // }\n // });\n // }, random);\n // }\n\n // -------------------ENTITY----------------------------\n}\n\n/**\n * Registration bean for {@link HolderModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: curried factory, `Holder.factory(id)(options)`. Returns the existing model when the id is already in use and ignores the options.\n * - `predicate`: type guard that narrows an `IKosDataModel` to `HolderModel`.\n * - `registration`: registry entry that can be spread into an `IKosRegistry[\"models\"]` map.\n *\n * Holder is not a singleton: each id has its own instance. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: Holder.type, id: \"holderId\" })\n * private holder!: HolderModel;\n * ```\n */\nexport const Holder: Readonly<\n KosModelRegistrationBean<HolderModel, HolderOptions>\n> = {\n registration: {\n [MODEL_TYPE]: {\n class: HolderModelImpl,\n singleton: false,\n },\n },\n type: MODEL_TYPE,\n predicate: isKosModel(MODEL_TYPE),\n factory: Kos.Factory.create<HolderModel, HolderOptions>(MODEL_TYPE),\n};\n","import { ExtensionManager, KosExtensionUtils } from \"@kosdev-code/kos-ui-sdk\";\nimport { ExtensionType } from \"../../constants\";\nimport { Holder } from \"../holder/holder-model\";\nimport { HolderModel, HolderOptions } from \"../holder/types\";\nimport type { AssemblyHolder } from \"../types/assembly\";\n\nexport const mapAssemblyHolderToModel = async <\n AssemblyHolderResponseExt extends object = any,\n HolderExt extends object = any\n>(\n group: string,\n holderData: AssemblyHolder<AssemblyHolderResponseExt>\n) => {\n const _ingredientId = ExtensionManager.propertyMapper.executeMapper(\n ExtensionType.HolderIngredientMapper,\n holderData\n );\n const type =\n ExtensionManager.propertyMapper.executeMapper(\n ExtensionType.HolderTypeMapper,\n holderData\n ) || holderData.ingType;\n\n const holderExtData = await KosExtensionUtils.executeDataMapperExtension<\n AssemblyHolder<AssemblyHolderResponseExt>,\n HolderExt\n >({\n extension: ExtensionType.HolderMapper,\n data: holderData,\n contextData: {},\n });\n\n const {\n name,\n path,\n ingredientId,\n ingType,\n ingSource,\n slice,\n attributes,\n ...rest\n } = holderData;\n\n const extData = { ...rest, ...holderExtData };\n const sliceData = slice || { pos: 0 };\n\n const holderOptions: HolderOptions<HolderExt> = {\n name: name,\n path: path,\n ingredientId: _ingredientId || ingredientId,\n ingredientType: type || ingType,\n ingredientSource: ingSource,\n enjoyByDate: holderData.container?.enjoyByDate\n ? new Date(holderData.container.enjoyByDate)\n : undefined,\n slice: sliceData,\n group,\n attributes,\n data: extData,\n };\n const holder = Holder.factory(holderData.path)(holderOptions);\n\n return holder as HolderModel<HolderExt>;\n};\n","import {\n KosLog,\n ServiceFactory,\n resolveServiceUrl,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport type { AssemblyResponse } from \"../../types/assembly\";\nconst { URL } = resolveServiceUrl(\"ASSEMBLY_SERVICE\");\nconst { getOne } = ServiceFactory.build({\n basePath: `${URL}/api/kos/device/assemblies`,\n});\n\nconst log = KosLog.createLogger({\n name: \"assembly-service\",\n group: \"Services\",\n});\n\n/**\n * @category Service\n * Retrieves the initial assembly data.\n */\nexport const getAssembly = async () => {\n log.debug(\"sending GET for assembly\");\n const response = await getOne<AssemblyResponse<{}>>({});\n return response;\n};\n","/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\nimport type {\n IKosDataModel,\n IKosModelContainer,\n KosContextLogger,\n KosCreationContext,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport {\n DependencyLifecycle,\n KosModelContainer,\n kosChild,\n kosModel,\n kosTopicHandler,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { ExtensionType } from \"../../constants\";\nimport type { BoardContainerOptions, BoardModel } from \"./types\";\nimport { type BoardLinkEvent } from \"./types/services\";\n\nexport const MODEL_TYPE = \"board-container-model\";\nexport const TOPIC_BOARD_LINKED = \"/kos/hardware/board/linked\";\nexport const TOPIC_BOARD_UNLINKED = \"/kos/hardware/board/unlinked\";\n\n/**\n * @kosService dispense.board\n * @kosApiLevel 16\n */\n@kosModel(MODEL_TYPE)\nexport class BoardContainerModel implements IKosDataModel {\n id: string;\n private logger: KosContextLogger;\n @kosChild private models: IKosModelContainer<BoardModel>;\n constructor(\n modelId: string,\n options: BoardContainerOptions,\n context: KosCreationContext\n ) {\n this.id = modelId;\n this.logger = context.logger;\n this.models = new KosModelContainer<BoardModel>({\n parentId: modelId,\n extensionId: ExtensionType.BoardIndex,\n });\n if (options) {\n // Assign options properties here.\n }\n }\n\n get boardList() {\n return this.models.data;\n }\n\n updateModel(): void {\n // Update model properties here.\n }\n\n addModel(model: BoardModel) {\n this.models.addModel(model);\n }\n\n removeModel(id: string) {\n this.models.removeModel(id);\n }\n\n updateBoard(boardLinkEvent: BoardLinkEvent) {\n const boardId = boardLinkEvent.path;\n const board = this.models.getModel(boardId);\n if (!board) {\n this.logger.warn(`board ${boardId} not found`);\n return;\n }\n board.updateModel(boardLinkEvent);\n }\n\n // -------------------SUBSCRIPTIONS----------------------------\n\n @kosTopicHandler({\n lifecycle: DependencyLifecycle.INIT,\n topic: TOPIC_BOARD_LINKED,\n websocket: true,\n })\n handleBoardLinkEvent(boardLinkEvent: BoardLinkEvent) {\n this.logger.debug(`handling ${TOPIC_BOARD_LINKED} event ${boardLinkEvent}`);\n\n if (boardLinkEvent) {\n this.updateBoard(boardLinkEvent);\n } else {\n this.logger.debug(`- boardLinkEvent is undefined`);\n }\n }\n\n @kosTopicHandler({\n lifecycle: DependencyLifecycle.INIT,\n topic: TOPIC_BOARD_UNLINKED,\n websocket: true,\n })\n handleBoardUnlinkEvent(boardLinkEvent: BoardLinkEvent) {\n this.logger.debug(\n `handling ${TOPIC_BOARD_UNLINKED} event ${boardLinkEvent}`\n );\n\n if (boardLinkEvent) {\n this.updateBoard(boardLinkEvent);\n } else {\n this.logger.debug(`- boardLinkEvent is undefined`);\n }\n }\n}\n\nexport interface BoardContainerModel {}\n","import type { TroubleModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { getKosModelSync } from \"@kosdev-code/kos-ui-sdk\";\nimport { BoardModel } from \"../types\";\nimport type { BoardTroubleData } from \"./board-trouble-resolver\";\n\nexport const boardTroubleDataMapper = async (\n trouble: TroubleModel<BoardTroubleData>\n) => {\n const boardPath = trouble.data.boardPath;\n const { model } = getKosModelSync<BoardModel>(boardPath);\n return {\n boardName: model?.name || \"\",\n };\n};\n","import type {\n IKosModelContainer,\n SingletonKosModelRegistrationBean,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport {\n Kos,\n KosModelContainer,\n isKosModel,\n kosChild,\n kosModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { PumpModel } from \"../pump/types\";\nimport type { PumpContainerModel, PumpContainerOptions } from \"./types\";\n\nimport { DispenseModelType, ExtensionType } from \"../../constants\";\n\nconst MODEL_TYPE = DispenseModelType.PumpContainer;\n\n// const log = KosLog.createLogger({ name: \"holder-container-model\" });\n\nexport enum PumpIndex {\n byBoard = \"byBoard\",\n byType = \"byType\",\n byNozzle = \"byNozzle\",\n}\n/**\n * @kosService dispense.pump\n * @kosApiLevel 2\n */\n@kosModel(MODEL_TYPE)\nclass PumpContainerModelImpl implements PumpContainerModel {\n id: string;\n @kosChild private pumps: IKosModelContainer<PumpModel>;\n\n constructor(modelId: string, options: PumpContainerOptions) {\n this.id = modelId;\n this.pumps = new KosModelContainer<PumpModel>({\n indexMap: {\n byNozzle: (pump) => pump.nozzlePaths,\n byBoard: (pump) => pump.boardPath,\n byType: \"type\",\n },\n parentId: modelId,\n extensionId: ExtensionType.PumpIndex,\n });\n if (options) {\n // Assign options properties here.\n }\n }\n\n /**\n * The collection of pump models.\n */\n get pumpModels() {\n return this.pumps.data;\n }\n\n /**\n * The collection of pump paths.\n */\n get pumpPaths() {\n return this.pumpModels.map((pump) => pump.path);\n }\n\n addModel(model: PumpModel) {\n this.pumps.addModel(model);\n }\n removeModel(id: string) {\n this.pumps.removeModel(id);\n }\n\n getModel(id: string) {\n return this.pumps.getModel(id);\n }\n\n get models() {\n return this.pumps;\n }\n get data() {\n return this.pumps.data;\n }\n\n updateModel(): void {\n // Update model properties here.\n }\n\n // -------------------LIFECYCLE----------------------------\n\n async load(): Promise<void> {}\n\n // -------------------ENTITY----------------------------\n}\n\n/**\n * Registration bean for {@link PumpContainerModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: `PumpContainer.factory(options)` returns the single instance, creating it on the first call.\n * - `predicate`: type guard that narrows an `IKosDataModel` to `PumpContainerModel`.\n * - `registration`: registry entry that can be spread into an `IKosRegistry[\"models\"]` map.\n *\n * PumpContainer is a singleton. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: PumpContainer.type })\n * private pumpContainer!: PumpContainerModel;\n * ```\n */\nexport const PumpContainer: SingletonKosModelRegistrationBean<\n PumpContainerModel,\n PumpContainerOptions\n> = {\n registration: {\n [MODEL_TYPE]: {\n class: PumpContainerModelImpl,\n singleton: true,\n },\n },\n type: MODEL_TYPE,\n predicate: isKosModel(MODEL_TYPE),\n factory: Kos.Singleton.create<PumpContainerModel, PumpContainerOptions>(\n MODEL_TYPE\n ),\n};\n","import type { TroubleModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { getKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport type { PumpModel } from \"../types\";\n\nexport interface PumpTroubleData {\n pumpPath: string;\n}\n\nexport const getPumpRelatedPaths = async (pumpPath: string) => {\n const result: string[] = [];\n const { model } = await getKosModel<PumpModel>(pumpPath);\n if (model) {\n result.push(model.boardPath);\n result.push(model.nozzlePath);\n result.push(model.holderPath);\n }\n return result;\n};\n\nexport const pumpTroubleResolver = async (\n trouble: TroubleModel<PumpTroubleData>\n) => {\n const result: string[] = [];\n const pumpPath = trouble.data.pumpPath;\n result.push(pumpPath);\n const relatedPaths = await getPumpRelatedPaths(pumpPath);\n return [...result, ...relatedPaths];\n};\n","import { getKosModel, type TroubleModel } from \"@kosdev-code/kos-ui-sdk\";\nimport {\n PumpContainer,\n PumpContainerModel,\n PumpIndex,\n} from \"../../pump-container\";\nimport { getPumpRelatedPaths } from \"../../pump/utils/pump-trouble-resolver\";\n\nexport interface BoardTroubleData {\n boardPath: string;\n}\n\nexport const boardTroubleResolver = async (\n trouble: TroubleModel<BoardTroubleData>\n) => {\n const result: string[] = [];\n const boardPath = trouble.data.boardPath;\n result.push(trouble.data.boardPath);\n const pumpContainer = await getKosModel<PumpContainerModel>(\n PumpContainer.type\n );\n if (pumpContainer?.model) {\n const boardPumps = pumpContainer.model.models.getIndexByKey(\n PumpIndex.byBoard,\n boardPath\n );\n // iterate over pumps and use the async pump trouble resolve to find all the pump and holder paths\n const pumpPromises = boardPumps.map((pump) =>\n getPumpRelatedPaths(pump.path)\n );\n const pumpResults = await Promise.allSettled(pumpPromises);\n pumpResults.forEach((r) => {\n if (r.status === \"fulfilled\") {\n (r.value as string[]).forEach((path) => result.push(path));\n }\n });\n }\n\n return Array.from(new Set(result));\n};\n","import type {\n IKosDataModel,\n KosContextLogger,\n KosCreationContext,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport {\n EXTENSION_TROUBLE_DATA_MAPPER,\n EXTENSION_TROUBLE_MAPPER,\n ExtensionManager,\n kosModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport type { BoardModel, BoardOptions } from \"./types\";\nimport { boardTroubleDataMapper } from \"./utils/board-trouble-data-mapper\";\nimport { boardTroubleResolver } from \"./utils/board-trouble-resolver\";\n\nexport const MODEL_TYPE = \"board-model\";\nconst mapOptionsToModel = <AdditionalData extends object = {}>(\n options: BoardOptions,\n model: BoardModel<AdditionalData>\n) => {\n const { type, name, path, linked, instanceId, link, ...rest } = options;\n model.type = type;\n model.name = name;\n model.path = path;\n model.linked = linked;\n model.link = Object.freeze(link);\n model.instanceId = instanceId;\n Object.assign(model, rest);\n};\n\nExtensionManager[EXTENSION_TROUBLE_MAPPER].register(\n \"board\",\n boardTroubleResolver\n);\n\nExtensionManager[EXTENSION_TROUBLE_DATA_MAPPER].register(\n \"board\",\n boardTroubleDataMapper\n);\n/**\n * @kosService dispense.board\n * @kosApiLevel 2\n */\n@kosModel(MODEL_TYPE)\nexport class BoardModelImpl<AdditionalData extends object = {}>\n implements IKosDataModel, BoardModel<AdditionalData>\n{\n id: string;\n type!: string;\n name!: string;\n path!: string;\n linked!: boolean;\n instanceId?: string;\n private logger: KosContextLogger;\n constructor(\n modelId: string,\n options: BoardOptions,\n context: KosCreationContext\n ) {\n this.id = modelId;\n\n this.logger = context.logger;\n mapOptionsToModel(options, this);\n }\n\n updateModel(options: BoardOptions): void {\n mapOptionsToModel(options, this);\n }\n\n // -------------------LIFECYCLE----------------------------\n\n async init(): Promise<void> {\n this.logger.debug(`initializing board ${this.id}`);\n }\n\n async load(): Promise<void> {\n this.logger.debug(`loading board ${this.id}`);\n }\n}\n","import type { KosModelRegistrationBean } from \"@kosdev-code/kos-ui-sdk\";\nimport { Kos, isKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { BoardModelImpl, MODEL_TYPE } from \"./board-model\";\nimport type { BoardModel, BoardOptions } from \"./types\";\n\n/**\n * Registration bean for {@link BoardModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: curried factory, `Board.factory(id)(options)`. Returns the existing model when the id is already in use and ignores the options.\n * - `predicate`: type guard that narrows an `IKosDataModel` to `BoardModel`.\n * - `registration`: registry entry that can be spread into an `IKosRegistry[\"models\"]` map.\n *\n * Board is not a singleton: each id has its own instance. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: Board.type, id: \"boardId\" })\n * private board!: BoardModel;\n * ```\n */\nexport const Board: Readonly<\n KosModelRegistrationBean<BoardModel, BoardOptions>\n> = {\n registration: {\n [MODEL_TYPE]: {\n class: BoardModelImpl,\n singleton: false,\n },\n },\n type: MODEL_TYPE,\n predicate: isKosModel(MODEL_TYPE),\n factory: Kos.Factory.create<BoardModel, BoardOptions>(MODEL_TYPE),\n};\n","import type { SingletonKosModelRegistrationBean } from \"@kosdev-code/kos-ui-sdk\";\nimport { Kos, isKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { BoardContainerModel, MODEL_TYPE } from \"./board-container-model\";\nimport { Board } from \"./board-registration\";\nimport type { BoardContainerOptions } from \"./types\";\n\n/**\n * Registration bean for {@link BoardContainerModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: `BoardContainer.factory(options)` returns the single instance, creating it on the first call.\n * - `predicate`: type guard that narrows an `IKosDataModel` to `BoardContainerModel`.\n * - `registration`: registry entry that can be spread into an `IKosRegistry[\"models\"]` map.\n *\n * BoardContainer is a singleton. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: BoardContainer.type })\n * private boardContainer!: BoardContainerModel;\n * ```\n */\nexport const BoardContainer: Readonly<\n SingletonKosModelRegistrationBean<BoardContainerModel, BoardContainerOptions>\n> = {\n registration: {\n [MODEL_TYPE]: {\n class: BoardContainerModel,\n singleton: true,\n },\n ...Board.registration,\n },\n type: MODEL_TYPE,\n predicate: isKosModel(MODEL_TYPE),\n factory: Kos.Singleton.create<BoardContainerModel, BoardContainerOptions>(\n MODEL_TYPE\n ),\n};\n","import type {\n IKosModelContainer,\n KosContextLogger,\n KosCreationContext,\n SingletonKosModelRegistrationBean,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport {\n Kos,\n KosLog,\n KosModelContainer,\n isKosModel,\n kosAction,\n kosChild,\n kosModel,\n kosTopicHandler,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport type { HolderModel } from \"../holder/types\";\nimport type {\n HolderContainerModel,\n HolderContainerOptions,\n HolderPathAware,\n InsertionEvent,\n} from \"./types\";\n\nimport { DispenseModelType, ExtensionType } from \"../../constants\";\n\nconst MODEL_TYPE = DispenseModelType.HolderContainer;\nconst TOPIC_INSERT_START = \"/kos/insertion/insert/start\";\nconst TOPIC_INSERT_COMPLETE = \"/kos/insertion/insert/complete\";\nconst TOPIC_INSERT_UPDATE = \"/kos/insertion/insert/update\";\nconst TOPIC_REMOVE = \"/kos/insertion/remove\";\nconst TOPIC_REPLACE_LINE = \"/kos/pumpEvent/replaceLine\";\nconst TOPIC_HOLDER_CHANGED = \"/kos/handle/*\";\n\n// const log = KosLog.createLogger({ name: \"holder-container-model\" });\n\n/**\n * @kosService dispense.holder\n * @kosApiLevel 2\n */\n@kosModel(MODEL_TYPE)\nclass HolderContainerModelImpl implements HolderContainerModel {\n id: string;\n @kosChild holders: IKosModelContainer<HolderModel>;\n\n private logger: KosContextLogger;\n constructor(\n modelId: string,\n _options: HolderContainerOptions,\n context: KosCreationContext\n ) {\n this.id = modelId;\n this.holders = new KosModelContainer<HolderModel>({\n indexMap: {\n nozzle: (holder) => holder.nozzlePaths,\n group: \"group\",\n },\n parentId: modelId,\n extensionId: ExtensionType.HolderIndex,\n });\n this.logger = context.logger;\n }\n\n updateModel(): void {\n // Update model properties here.\n }\n\n // -------------------LIFECYCLE----------------------------\n\n @kosTopicHandler({\n topic: TOPIC_HOLDER_CHANGED,\n websocket: true,\n condition: (event: HolderPathAware, model: HolderContainerModel) =>\n model.holders.getModel(event.path) !== undefined,\n })\n handleHolderEvents(event: HolderPathAware) {\n KosLog.ifDebug(() =>\n this.logger.debug(\"Received holder change event\", JSON.stringify(event))\n );\n const holder = this.holders.getModel(event.path);\n\n if (holder) {\n this.logger.info(\n `Received change event for holder ${holder.path}. Updating fuel gauge data.`\n );\n holder.slice.currentVolMl = event.slice?.currentVolMl;\n holder.slice.maxVolMl = event.slice?.maxVolMl;\n if (event?.container?.enjoyByDate) {\n holder.enjoyByDate = new Date(event.container.enjoyByDate);\n } else {\n holder.enjoyByDate = undefined;\n }\n }\n }\n @kosTopicHandler({\n topic: [\n TOPIC_INSERT_START,\n TOPIC_INSERT_COMPLETE,\n TOPIC_INSERT_UPDATE,\n TOPIC_REMOVE,\n TOPIC_REPLACE_LINE,\n ],\n websocket: true,\n })\n handleInsertion(data: InsertionEvent[]) {\n KosLog.ifDebug(() =>\n this.logger.debug(\"Received insertion event\", JSON.stringify(data))\n );\n const wrappedData = Array.isArray(data) ? data : [data];\n wrappedData.forEach((event) => {\n kosAction(() => {\n const ingredientId = event.ingredientId;\n const holder = this.holders.getModel(event.path);\n if (holder) {\n this.logger.info(\n `Received insertion event for holder ${holder.path}`\n );\n holder.updateIngredient(ingredientId);\n\n // update fuel gauge data\n holder.slice.currentVolMl = event.slice?.currentVolMl;\n holder.slice.maxVolMl = event.slice?.maxVolMl;\n if (event?.container?.enjoyByDate) {\n holder.enjoyByDate = new Date(event.container.enjoyByDate);\n } else {\n holder.enjoyByDate = undefined;\n }\n\n event.pumps.forEach((pump) => {\n kosAction(() => {\n const pumpModel = holder.pumps.getModel(pump.path);\n if (pumpModel) {\n pumpModel.ingredientId = pump.ingredientId;\n pumpModel.inserted = pump.inserted;\n pumpModel.prevIngredientId = pump.prevIngredientId;\n }\n });\n });\n }\n });\n });\n }\n\n // -------------------ENTITY----------------------------\n}\n\n/**\n * Registration bean for {@link HolderContainerModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: `HolderContainer.factory(options)` returns the single instance, creating it on the first call.\n * - `predicate`: type guard that narrows an `IKosDataModel` to `HolderContainerModel`.\n * - `registration`: registry entry that can be spread into an `IKosRegistry[\"models\"]` map.\n *\n * HolderContainer is a singleton. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: HolderContainer.type })\n * private holderContainer!: HolderContainerModel;\n * ```\n */\nexport const HolderContainer: SingletonKosModelRegistrationBean<\n HolderContainerModel,\n HolderContainerOptions\n> = {\n registration: {\n [MODEL_TYPE]: {\n class: HolderContainerModelImpl,\n singleton: true,\n },\n },\n type: MODEL_TYPE,\n predicate: isKosModel(MODEL_TYPE),\n factory: Kos.Singleton.create<HolderContainerModel, HolderContainerOptions>(\n MODEL_TYPE\n ),\n};\n","import { KosExtensionUtils, KosLog } from \"@kosdev-code/kos-ui-sdk\";\nimport { ExtensionType } from \"../../constants\";\nimport { Board, type BoardContainerModel, type BoardOptions } from \"../board\";\nimport type { AssemblyBoard } from \"../types/assembly\";\n\nconst Logger = KosLog.createLogger({ name: \"board-utils\" });\nexport const mapAssemblyBoardToModel = async <\n AssemblyBoardResponseExt extends object = any,\n BoardExt extends object = any\n>(\n board: AssemblyBoard<AssemblyBoardResponseExt>\n) => {\n const boardExtData = await KosExtensionUtils.executeDataMapperExtension<\n AssemblyBoard<AssemblyBoardResponseExt>,\n BoardExt\n >({\n extension: ExtensionType.BoardMapper,\n data: board,\n contextData: {},\n });\n const { type, name, path, linked, instanceId, ...rest } = board;\n const extData = { ...rest, ...boardExtData };\n const options: BoardOptions<BoardExt> = {\n type: type,\n name: name,\n path: path,\n linked: linked,\n instanceId: instanceId,\n ...extData,\n };\n\n const boardModel = Board.factory(board.path)(options);\n\n boardModel.updateModel(options);\n\n return boardModel;\n};\n\nexport const assemblyBoardMap =\n (boardContainer: BoardContainerModel) => async (board: AssemblyBoard) => {\n Logger.debug(`adding board ${board.name}`);\n const boardModel = await mapAssemblyBoardToModel(board);\n boardContainer.addModel(boardModel);\n };\n","export enum PourState {\n IDLE = \"IDLE\",\n POURING = \"POURING\",\n POUR_STARTING = \"POUR_STARTING\",\n POUR_CANCELING = \"POUR_CANCELING\",\n}\n","import {\n FutureManager,\n FutureResponse,\n KosServiceResponse,\n ServiceFactory,\n resolveServiceUrl,\n} from \"@kosdev-code/kos-ui-sdk\";\nconst { URL } = resolveServiceUrl(\"PUMP_SERVICE\");\nconst { postModel, getOne } = ServiceFactory.build({\n basePath: `${URL}/api/kos/holders`,\n});\n\nexport interface PumpResponse {\n inserted: boolean;\n beveragePour: boolean;\n ingredientPour: boolean;\n type: string;\n ingredientId: string;\n holderPath: string;\n boardPath: string;\n nozzlePath: string;\n name: string;\n path: string;\n category: string;\n}\n\ninterface IntentRequest {\n intent: string;\n pumpId: string;\n tracker: string;\n}\n\ninterface IntentVolumeResponse {\n volume: number;\n}\n\nexport const sendIntent = async ({\n intent,\n pumpId,\n tracker,\n}: IntentRequest) => {\n const url = `${URL}/api/ext/dispense/nozzle/nozzle/pipeline/ingredient/pour/${pumpId}/${intent}`;\n const response: KosServiceResponse<FutureResponse> | undefined =\n await postModel({ model: {}, urlOverride: url, tracker });\n if (response?.data) {\n FutureManager.initiateFuture(response.data);\n }\n return response;\n};\n\nexport const getIntentVolume = async (pumpId: string, intent: string) => {\n const url = `${URL}/api/ext/dispense/nozzle/nozzle/pipeline/ingredient/intent/${pumpId}/${intent}/volume`;\n const response: KosServiceResponse<IntentVolumeResponse> | undefined =\n await getOne({ urlOverride: url });\n if (!response?.data) {\n return { volume: -1 };\n }\n return response.data;\n};\n","/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\nimport type {\n FutureAwareContainer,\n FutureContainer,\n IFutureModel,\n KosModelRegistrationBean,\n TroubleAware,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport {\n EXTENSION_TROUBLE_MAPPER,\n ExtensionManager,\n FutureHandler,\n Kos,\n KosLog,\n isKosModel,\n kosAction,\n kosFuture,\n kosModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport type { PumpModel, PumpOptions } from \"./types\";\n\nimport { DispenseModelType } from \"../../constants\";\n\nimport type { IntentAwareProps } from \"../types/intent\";\nimport { PourState } from \"../types/pouring\";\nimport { getIntentVolume, sendIntent } from \"./services/pump-services\";\nimport { pumpTroubleResolver } from \"./utils/pump-trouble-resolver\";\n\nconst MODEL_TYPE = DispenseModelType.Pump;\n\nExtensionManager[EXTENSION_TROUBLE_MAPPER].register(\n \"pump\",\n pumpTroubleResolver\n);\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface, @typescript-eslint/no-unused-vars\ninterface PumpModelImpl<AdditionalData extends object = any>\n extends TroubleAware {}\n/**\n * @kosService dispense.pump\n * @kosApiLevel 2\n */\n@kosModel(MODEL_TYPE)\nclass PumpModelImpl<AdditionalData extends object = any>\n implements PumpModel<AdditionalData>, FutureContainer\n{\n id: string;\n inserted: boolean;\n type: string;\n virtual?: boolean;\n ingredientId?: string;\n holderPath: string;\n boardPath: string;\n nozzlePath: string;\n childPump: boolean;\n name: string;\n path: string;\n prevIngredientId?: string;\n /**\n * @kosApiLevel 12\n */\n state?: { name: string; path: string };\n\n futureHandler: FutureAwareContainer;\n currentState: PourState = PourState.IDLE;\n constructor(modelId: string, options: PumpOptions<AdditionalData>) {\n this.id = modelId;\n const {\n inserted,\n holderPath,\n boardPath,\n nozzlePath,\n name,\n path,\n childPump,\n virtual,\n prevIngredientId,\n state,\n ...rest\n } = options;\n this.inserted = inserted;\n\n this.type = options.type;\n this.ingredientId = options.ingredientId;\n this.holderPath = holderPath;\n this.boardPath = boardPath;\n this.nozzlePath = nozzlePath;\n this.name = name;\n this.path = path;\n this.childPump = !!childPump;\n this.virtual = !!virtual;\n this.prevIngredientId = prevIngredientId;\n this.state = state;\n Object.assign(this, rest);\n this.futureHandler = new FutureHandler(this);\n }\n\n updateModel(options: PumpOptions<AdditionalData>): void {\n const {\n inserted,\n holderPath,\n boardPath,\n nozzlePath,\n childPump,\n name,\n path,\n ...rest\n } = options;\n this.inserted = inserted;\n this.type = options.type;\n this.ingredientId = options.ingredientId;\n this.holderPath = holderPath;\n this.boardPath = boardPath;\n this.nozzlePath = nozzlePath;\n\n // once set to true, childPump cannot be set to false\n this.childPump = this.childPump ? this.childPump : !!childPump;\n this.name = name;\n this.path = path;\n this.prevIngredientId = options.prevIngredientId;\n Object.assign(this, rest);\n }\n\n // -------------------LIFECYCLE----------------------------\n\n get pouringState() {\n return this.future?.endState || \"\";\n }\n get isPouring() {\n return (\n !!(this.future && !this.future?.endState) ||\n this.currentState === PourState.POUR_STARTING ||\n this.currentState === PourState.POURING\n );\n }\n\n get canPour() {\n return !!this.ingredientId && !this.isPouring;\n }\n\n onFutureUpdate(future: IFutureModel) {\n if (future.endState) {\n kosAction(() => {\n this.currentState = PourState.IDLE;\n });\n }\n }\n\n async cancelPour() {\n if (\n this.currentState === PourState.POURING ||\n this.currentState === PourState.POUR_STARTING\n ) {\n this.currentState = PourState.POUR_CANCELING;\n await this.future?.cancelFuture();\n kosAction(() => {\n this.currentState = PourState.IDLE;\n });\n } else {\n KosLog.warn(`Cannot cancel pour in state ${this.currentState}`);\n }\n }\n\n get future() {\n return this.futureHandler.future;\n }\n\n async resolveIntentVolume(intent: string) {\n return await getIntentVolume(this.path, intent);\n }\n\n @kosFuture()\n async performIntent(props: IntentAwareProps, tracker?: string) {\n const intent = typeof props === \"string\" ? props : props.intent;\n if (!intent) {\n throw new Error(\"No intent provided\");\n }\n\n try {\n if (this.currentState === PourState.IDLE) {\n this.currentState = PourState.POUR_STARTING;\n if (!tracker) {\n throw new Error(\"No tracker provided\");\n }\n\n const result = await sendIntent({\n tracker,\n intent,\n pumpId: this.path,\n });\n if (this.currentState === PourState.POUR_STARTING) {\n kosAction(() => {\n this.currentState = PourState.POURING;\n });\n }\n return result?.data;\n } else {\n throw new Error(`Cannot pour in state ${this.currentState}`);\n }\n } catch (e) {\n KosLog.error(e);\n this.currentState = PourState.IDLE;\n throw e;\n }\n }\n\n // -------------------ENTITY----------------------------\n}\n\n/**\n * Registration bean for {@link PumpModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: curried factory, `Pump.factory(id)(options)`. Returns the existing model when the id is already in use and ignores the options.\n * - `predicate`: type guard that narrows an `IKosDataModel` to `PumpModel`.\n * - `registration`: registry entry that can be spread into an `IKosRegistry[\"models\"]` map.\n *\n * Pump is not a singleton: each id has its own instance. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: Pump.type, id: \"pumpId\" })\n * private pump!: PumpModel;\n * ```\n */\nexport const Pump: Readonly<KosModelRegistrationBean<PumpModel, PumpOptions>> =\n {\n registration: {\n [MODEL_TYPE]: {\n class: PumpModelImpl,\n singleton: false,\n },\n },\n type: MODEL_TYPE,\n predicate: isKosModel(MODEL_TYPE),\n factory: Kos.Factory.create<PumpModel, PumpOptions>(MODEL_TYPE),\n };\n","import { KosLog } from \"@kosdev-code/kos-ui-sdk\";\nimport type { HolderContainerModel } from \"../holder-container\";\nimport { Pump, type PumpOptions } from \"../pump\";\nimport type { PumpContainerModel } from \"../pump-container\";\nimport type { AssemblyNozzle, AssemblyPump } from \"../types/assembly\";\nconst Logger = KosLog.createLogger({ name: \"pump-utils\" });\nexport const mapAssemblyPumpToModel = (\n nozzlePath: string,\n pump: AssemblyPump\n) => {\n const virtual = (pump.pumps ?? []).length > 1;\n const options: PumpOptions = {\n boardPath: pump.boardPath,\n holderPath: pump.holderPath,\n ingredientId: pump.ingredientId,\n childPump: !!pump.childPump,\n virtual,\n inserted: pump.inserted,\n name: pump.name,\n path: pump.path,\n type: pump.type,\n nozzlePath,\n prevIngredientId: pump.prevIngredientId,\n state: pump.state,\n };\n const pumpModel = Pump.factory(pump.path)(options);\n\n pumpModel.updateModel(options);\n\n return pumpModel;\n};\n\nexport const assemblyPumpMap =\n (pumpContainer: PumpContainerModel) =>\n (holderContainer: HolderContainerModel) =>\n (nozzle: AssemblyNozzle) =>\n (assemblyPump: AssemblyPump) => {\n try {\n Logger.debug(`adding pump ${assemblyPump.name}`);\n const pump = mapAssemblyPumpToModel(nozzle.path, assemblyPump);\n pumpContainer.addModel(pump);\n const holderPath = pump.holderPath;\n const holder = holderContainer.holders.getModel(holderPath);\n holder?.pumps.addModel(pump);\n if (!holder?.nozzlePaths.includes(nozzle.path)) {\n holder?.nozzlePaths.push(nozzle.path);\n }\n\n assemblyPump?.pumps?.forEach((subPump) => {\n const subHolderPath = pump.holderPath;\n const subPumpData = {\n ...subPump,\n childPump: true,\n holderPath: subHolderPath,\n ingredientId: pump.ingredientId,\n };\n assemblyPumpMap(pumpContainer)(holderContainer)(nozzle)(subPumpData);\n });\n } catch (error) {\n Logger.error(`Error mapping assembly pump: ${error}`);\n throw error;\n }\n };\n","import type {\n IKosModelLogger,\n KosContext,\n KosContextLogger,\n KosCreationContext,\n TroubleContainerModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport {\n ChildModels,\n EXTENSION_FEATURE_FLAG_RESOLVER,\n ExtensionManager,\n KosExtensionUtils,\n KosFeatureFlags,\n isKosDataModel,\n kosChild,\n kosDependency,\n kosModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { mapAssemblyHolderToModel } from \"./holder-utils\";\nimport { getAssembly } from \"./services\";\nimport type { AssemblyModel, AssemblyOptions } from \"./types\";\n\nimport { ExtensionType } from \"../../constants\";\nimport {\n BoardContainer,\n type BoardContainerModel,\n type BoardModel,\n} from \"../board\";\nimport { type HolderModel } from \"../holder\";\nimport {\n HolderContainer,\n type HolderContainerModel,\n} from \"../holder-container\";\nimport type { PumpModel } from \"../pump\";\nimport { PumpContainer, type PumpContainerModel } from \"../pump-container\";\nimport type { AssemblyResponse } from \"../types/assembly\";\nimport { assemblyBoardMap } from \"./board-utils\";\nimport { assemblyPumpMap } from \"./pump-utils\";\n\nexport const MODEL_TYPE = \"assembly-model\";\nexport const CONTEXT_ASSEMBLY_DATA = \"assembly-data\";\nexport const CONTEXT_ASSEMBLY_RAW_DATA = \"assembly-raw-data\";\n/**\n * @kosService dispense.assembly\n * @kosApiLevel 2\n */\n@kosModel(MODEL_TYPE)\nexport class AssemblyModelImpl<\n AssemblyExt extends object = any,\n HolderExt extends object = any\n> implements AssemblyModel<AssemblyExt>, IKosModelLogger\n{\n id: string;\n private _nozzlePaths = new Set<string>();\n @kosDependency({\n modelType: \"trouble-container-model\",\n })\n private troubleContainer!: TroubleContainerModel;\n\n @kosChild private holderContainer: HolderContainerModel;\n @kosChild private boardContainer: BoardContainerModel;\n @kosChild private pumpContainer: PumpContainerModel;\n logger: KosContextLogger;\n constructor(\n modelId: string,\n _options: AssemblyOptions,\n context: KosCreationContext\n ) {\n this.id = modelId;\n this.holderContainer = HolderContainer.factory({});\n this.boardContainer = BoardContainer.factory({});\n this.pumpContainer = PumpContainer.factory({});\n this.logger = context.logger;\n }\n\n updateModel(_options: AssemblyOptions): void {\n // Update model properties here.\n }\n\n get allHolders(): HolderModel<HolderExt>[] {\n return this.holderContainer.holders.data;\n }\n\n get holderGroups(): string[] {\n return this.holderContainer.holders.getIndexKeys(\"group\");\n }\n\n get nozzlePaths(): string[] {\n return Array.from(this._nozzlePaths);\n }\n getHoldersByGroup(group: string): HolderModel<HolderExt>[] {\n return this.holderContainer.holders.getIndexByKey(\"group\", group);\n }\n\n getHoldersByNozzle(nozzlePath: string): HolderModel<HolderExt>[] {\n return this.holderContainer.holders.getIndexByKey(\"nozzle\", nozzlePath);\n }\n\n /**\n * Returns a map of the pumps associated with each nozzle\n *\n * Can be used in conjunction with the nozzlePaths to get the pumps associated with each nozzle\n * @returns Record<string, PumpModel[]>\n */\n get pumpsByNozzle(): Record<string, PumpModel<any>[]> {\n return this.pumpContainer.models.idx.byNozzle;\n }\n\n /**\n * Returns a list of all fo the pumps paths across the entire assembly.\n */\n get pumpPaths(): string[] {\n return this.pumpContainer.models.data.map((pump) => pump.path);\n }\n\n get boards(): BoardModel<any>[] {\n return this.boardContainer.boardList;\n }\n\n // -------------------LIFECYCLE----------------------------\n\n async init(): Promise<void> {\n this.logger.debug(`initializing assembly ${this.id}`);\n }\n\n async ready() {\n this.troubleContainer?.troubles.increment();\n ExtensionManager[EXTENSION_FEATURE_FLAG_RESOLVER].execute(\n ExtensionType.AssemblyFeatureFlags,\n this\n );\n }\n\n async load(context: KosContext): Promise<void> {\n this.logger.debug(`loading assembly ${this.id}`);\n\n const result = await getAssembly();\n if (result?.status === 200) {\n const data = await KosExtensionUtils.executeDataMapperExtension<\n AssemblyResponse<{}>,\n AssemblyExt\n >({\n extension: ExtensionType.AssemblyMapper,\n data: result.data,\n contextData: {},\n });\n\n context.set(CONTEXT_ASSEMBLY_DATA, data);\n // assign any additional data to the model\n // data is the result of the extension mapper\n Object.assign(this, data);\n\n // add any child models to the model\n // register them as child models so that they participate in the Assembly model lifecycle\n Object.entries(data).forEach(([key, value]) => {\n if (isKosDataModel(value)) {\n this.logger.debug(`adding child model ${key} from extension data`);\n this[ChildModels][key] = true;\n }\n });\n\n context.set(CONTEXT_ASSEMBLY_RAW_DATA, result.data);\n // iterate through all of the assemblies and add the boards, holders, pumps and nozzles\n for await (const assembly of result.data.assemblies) {\n const {\n boards = [],\n holders: assemblyHolders = {},\n nozzles = [],\n core: _core,\n name,\n path: _path,\n ...rest\n } = assembly;\n\n this.logger.debug(`adding assembly ${name}`);\n\n this.logger.warn(`Assembly rest keys: ${Object.keys(rest).join(\", \")}`);\n Object.keys(rest).forEach((key) => {\n this.logger.warn(`Enabling feature flag: ${key}`);\n KosFeatureFlags.enableFeature(key);\n context.set(`assembly-feature-${key}`, rest[key]);\n if (rest[key][\"state\"]?.[\"path\"] !== undefined) {\n const statePath = rest[key][\"state\"][\"path\"];\n this.logger.warn(`Feature flag ${key} state path: ${statePath}`);\n context.set(`assembly-state-path-${key}`, statePath);\n }\n });\n // add the boards to the assembly model in the board container\n\n for await (const board of boards) {\n this.logger.debug(`adding board ${board.name}`);\n const mapper = assemblyBoardMap(this.boardContainer);\n await mapper(board);\n }\n\n // add the holders to the assembly model in the holder container\n for await (const [group, holders] of Object.entries(\n assemblyHolders ?? {}\n )) {\n for await (const holder of holders) {\n this.logger.debug(`adding holder ${holder.name}`);\n const holderModel = await mapAssemblyHolderToModel(group, holder);\n this.holderContainer.holders.addModel(holderModel);\n }\n }\n\n // add the pumps to the assembly model\n const nozzlePumpMap = assemblyPumpMap(this.pumpContainer)(\n this.holderContainer\n );\n nozzles.forEach((nozzle) => {\n this._nozzlePaths.add(nozzle.path);\n const pumpMap = nozzlePumpMap(nozzle);\n nozzle.pumps.forEach(pumpMap);\n });\n }\n }\n }\n}\n","import type { SingletonKosModelRegistrationBean } from \"@kosdev-code/kos-ui-sdk\";\nimport { Kos, isKosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { AssemblyModelImpl, MODEL_TYPE } from \"./assembly-model\";\nimport type { AssemblyModel, AssemblyOptions } from \"./types\";\n\n/**\n * Registration bean for {@link AssemblyModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: `Assembly.factory(options)` returns the single instance, creating it on the first call.\n * - `predicate`: type guard that narrows an `IKosDataModel` to `AssemblyModel`.\n * - `registration`: registry entry that can be spread into an `IKosRegistry[\"models\"]` map.\n *\n * Assembly is a singleton. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: Assembly.type })\n * private assembly!: AssemblyModel;\n * ```\n */\nexport const Assembly: Readonly<\n SingletonKosModelRegistrationBean<AssemblyModel, AssemblyOptions>\n> = {\n registration: {\n [MODEL_TYPE]: {\n class: AssemblyModelImpl,\n singleton: true,\n },\n },\n type: MODEL_TYPE,\n predicate: isKosModel(MODEL_TYPE),\n factory: Kos.Singleton.create<AssemblyModel, AssemblyOptions>(MODEL_TYPE),\n};\n","import {\n Kos,\n isKosModel,\n kosModel,\n kosParentAware,\n type KosContextLogger,\n type KosCreationContext,\n type KosModelRegistrationBean,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { DispenseModelType } from \"../../constants\";\nimport type { AvailabilityModel, AvailabilityOptions } from \"./types\";\n\nconst MODEL_TYPE = DispenseModelType.Availability;\n@kosParentAware()\n/**\n * @kosService dispense.availability\n * @kosApiLevel 1\n */\n@kosModel(MODEL_TYPE)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nclass AvailabilityModelImpl<\n T extends object = any,\n P extends Record<string, any> = Record<string, any>\n> implements AvailabilityModel\n{\n id: string;\n data!: T;\n properties!: P;\n available!: boolean;\n visible!: boolean;\n groupId!: string;\n rawId!: string;\n altId!: string;\n type!: string;\n note?: string;\n taggedIds: string[];\n parentId?: string;\n logger: KosContextLogger;\n constructor(\n modelId: string,\n options: AvailabilityOptions<T, P>,\n context: KosCreationContext\n ) {\n this.id = modelId;\n this.taggedIds = options.taggedIds || [];\n this.logger = context.logger;\n this.available = options.available;\n this.visible = options.visible;\n this.groupId = options.groupId;\n this.rawId = options.rawId;\n this.altId = options.altId;\n this.type = options.type;\n this.parentId = options.kosParentId;\n this.data = options.data;\n this.note = options.note;\n this.properties = options.properties || ({} as P);\n }\n\n updateModel(options: AvailabilityOptions): void {\n this.taggedIds = options.taggedIds || [];\n this.available = options.available;\n this.visible = options.visible;\n this.groupId = options.groupId;\n this.rawId = options.rawId;\n this.altId = options.altId;\n this.type = options.type;\n this.data = options.data;\n }\n\n updateAvailability(available: boolean): void {\n this.available = available;\n }\n\n // -------------------LIFECYCLE----------------------------\n\n // -------------------ENTITY----------------------------\n}\n\n/**\n * Registration bean for {@link AvailabilityModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: curried factory, `Availability.factory(id)(options)`. Returns the existing model when the id is already in use and ignores the options.\n * - `predicate`: type guard that narrows an `IKosDataModel` to `AvailabilityModel`.\n * - `registration`: registry entry that can be spread into an `IKosRegistry[\"models\"]` map.\n *\n * Availability is not a singleton: each id has its own instance. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: Availability.type, id: \"availabilityId\" })\n * private availability!: AvailabilityModel;\n * ```\n *\n * @param predicate Type guard that narrows an `IKosDataModel` to `AvailabilityModel`.\n */\nexport const Availability: Readonly<\n KosModelRegistrationBean<AvailabilityModel, AvailabilityOptions>\n> = {\n registration: {\n [MODEL_TYPE]: {\n class: AvailabilityModelImpl,\n\n singleton: false,\n },\n },\n\n type: MODEL_TYPE,\n predicate: isKosModel(MODEL_TYPE),\n\n factory: Kos.Factory.create<AvailabilityModel, AvailabilityOptions>(\n MODEL_TYPE\n ),\n};\n","import {\n FutureManager,\n ServiceFactory,\n resolveServiceUrl,\n} from \"@kosdev-code/kos-ui-sdk\";\nconst { URL } = resolveServiceUrl(\"NOZZLE_SERVICE\");\nconst { postModel, deleteModel, getOne } = ServiceFactory.build({\n basePath: `${URL}/api/nozzle`,\n});\n\n/**\n * An individual availability node for a nozzle.\n * */\nexport interface BeverageResponse<\n Properties extends Record<string, any> = Record<string, any>\n> {\n /**\n * Is the node available for based on the beverage graph.\n * */\n available: boolean;\n /**\n * an alternate id for the node. Typically used in cases where there are multiple nozzles where\n * the same beverage could be available. This id will represent the common id for the beverage without\n * the nozzle specific id.\n * */\n altId: string;\n /**\n * Is the item visible. This is typically used to hide items that are not available.\n * */\n visible: boolean;\n\n /**\n * The id of the availability node.\n * */\n id: string;\n\n type: string;\n taggedIds?: string[];\n note?: string;\n properties?: Properties;\n}\n\n/**\n * The response from the availability endpoint.\n * */\nexport interface AvailabilityResponse {\n /**\n * Indicates if the availability requires a full calculation of the availability nodes or just a\n * delta calculation.\n * */\n rebuild: boolean;\n\n /**\n * The availability groups for the nozzle.\n * */\n groups: {\n /**\n * the built-in beverages group\n * */\n beverages: BeverageResponse[];\n /**\n * the built-in flavors group\n * */\n flavors: BeverageResponse[];\n\n /**\n * the built-in brands group\n * */\n brands: BeverageResponse[];\n\n /**\n * Additional named groups that are defined by the dispenser.\n * */\n [k: string]: BeverageResponse[];\n };\n}\n\n/**\n *\n * Initiates a pour for the specified nozzle.\n *\n * Uses the KOS endpoint [POST] `${URL}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/pour/selected/maxVolume`\n *\n * @param nozzleId - the nozzle id to pour from.\n * @param tracker - the tracker to use for the pour. It will be returned in the future to allow consumers\n * to track the pour.\n * @category Service\n * @see {@link FutureManager.initiateFuture}\n * @returns - the service response. Its data is the future that tracks the pour, which is registered with the {@link FutureManager}.\n **/\nexport const pourPourable = async (nozzleId: string, tracker: string) => {\n const response = await postModel<any>({\n model: {},\n urlOverride: `${URL}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/pour/selected/maxVolume`,\n ordered: true,\n tracker,\n });\n if (response?.data) {\n FutureManager.initiateFuture(response.data);\n }\n return response;\n};\n\n/**\n *\n * Initiates a fixed named pour for the specified nozzle.\n *\n * Typically used for a named cup size, where the name determines the volume of the pour.\n *\n * Uses the KOS endpoint [POST] `${URL}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/fixed/${name}`\n *\n * @param name - name of the fixed pour volume.\n * @param nozzleId - the nozzle id to pour from.\n * @param tracker - the tracker to use for the pour. It will be returned in the future to allow consumers\n * to track the pour.\n * @category Service\n * @see {@link FutureManager.initiateFuture}\n * @returns - the service response. Its data is the future that tracks the pour, which is registered with the {@link FutureManager}.\n **/\nexport const pourNamedPourable = async (\n name: string,\n nozzleId: string,\n tracker: string\n) => {\n const response = await postModel<any>({\n model: {},\n urlOverride: `${URL}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/fixed/${name}`,\n ordered: true,\n tracker,\n });\n if (response?.data) {\n FutureManager.initiateFuture(response.data);\n }\n return response;\n};\n\n/**\n * Retrieves the availability nodes for a specified nozzle.\n *\n * Uses the KOS endpoint [GET] `${URL}${urlPrefix}/pipeline/beverage/availability`\n *\n * @param urlPrefix - the nozzle's URL prefix (the `urlPrefix` of the {@link NozzleModel}).\n * @returns - the availability nodes for the specified nozzle.\n * @category Service\n */\nexport const getAvailability = async (urlPrefix: string) => {\n const response = await getOne<AvailabilityResponse>({\n urlOverride: `${URL}${urlPrefix}/pipeline/beverage/availability`,\n });\n return response;\n};\n\n/**\n * Invokes the endpoint to select a pourable for the specified nozzle.\n *\n * Uses the KOS endpoint [POST] `${URL}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/select`\n *\n * @param nozzleId - the nozzle id to select a pourable for.\n * @param payload - the payload to send to the endpoint. The shape of the payload is determined by the\n * {@link ExtensionType.SelectedPourableMapper} extension.\n * @category Service\n * @see {@link ExtensionType.SelectedPourableMapper}\n * @returns - an empty response.\n *\n * @example\n * ```typescript\n * // the default payload when no SelectedPourableMapper is registered\n * await NozzleServices.selectPourable(\"nozzle-1\", { bevId: \"beverage-1\" });\n * ```\n * */\nexport const selectPourable = async (nozzleId: string, payload: object) => {\n const response = await postModel({\n model: payload,\n urlOverride: `${URL}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/select`,\n });\n return response;\n};\n\n/**\n * Invokes the endpoint to clear the selected pourable for the specified nozzle.\n * Uses the KOS endpoint [DELETE] `${URL}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/select`\n *\n * @param nozzleId - the nozzle id to clear the selected pourable for.\n * @category Service\n * @returns - an empty response.\n * */\nexport const clearPourable = async (nozzleId: string) => {\n const response = await deleteModel({\n id: nozzleId,\n urlOverride: `${URL}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/select`,\n });\n\n return response;\n};\n","/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\nimport {\n DependencyLifecycle,\n EventBus,\n ExtensionManager,\n Kos,\n KosContextManager,\n KosModelContainer,\n MultipleFutureHandler,\n arraysEqual,\n createPropKey,\n destroyKosModel,\n getAllKosCompanionModels,\n isKosModel,\n kosAction,\n kosChild,\n kosFuture,\n kosLoggerAware,\n kosModel,\n kosStateEntry,\n kosStateExit,\n kosStateGuard,\n kosStateMachine,\n kosTopicHandler,\n type FutureAwareContainer,\n type FutureContainer,\n type IFutureModel,\n type IKosDataModel,\n type IKosModelContainer,\n type IKosModelLogger,\n type KosContext,\n type KosLoggerAware,\n type KosModelRegistrationBean,\n type KosStateMachineAware,\n type PublicModelInterface,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { DispenseModelType, ExtensionType } from \"../../constants\";\nimport {\n Availability,\n type AvailabilityModel,\n type AvailabilityOptions,\n} from \"../availability\";\n\nimport { PourState } from \"../types/pouring\";\nimport {\n clearPourable,\n getAvailability,\n pourNamedPourable,\n pourPourable,\n selectPourable,\n type AvailabilityResponse,\n} from \"./services\";\nimport type {\n NozzleOptions,\n PourAware,\n PourCancelEvent,\n PourProgressEvent,\n PourStartEvent,\n PourStrategyAware,\n SelectedPourable,\n} from \"./types\";\n\nconst MODEL_TYPE = DispenseModelType.Nozzle;\n\nconst PROP_BEVERAGE_TOPIC_PREFIX = createPropKey<NozzleModel>(\n \"beverageTopicPrefix\"\n);\n\nconst isPourAware = (model: any): model is PourAware =>\n model.onPourStart !== undefined &&\n model.onPourCancel !== undefined &&\n model.onPourProgress !== undefined;\n\nexport const TOPIC_NOZZLE_POUR_STARTED = \"/kos/nozzle/pour/started\";\nexport const TOPIC_NOZZLE_POUR_PROGRESS = \"/kos/nozzle/pour/progress\";\nexport const TOPIC_NOZZLE_POUR_CANCEL = \"/kos/nozzle/pour/cancel\";\n\n// ============================================================================\n// FSM Type Definitions\n// ============================================================================\n\ntype PourEvent =\n | \"START_POUR\"\n | \"POUR_ACTIVE\"\n | \"CANCEL_POUR\"\n | \"POUR_CANCELED\"\n | \"POUR_COMPLETED\";\n\n// ============================================================================\n// Model Interface with FSM Support\n// ============================================================================\n\ninterface NozzleModelImpl\n extends IKosModelLogger,\n IKosDataModel,\n FutureContainer,\n KosLoggerAware,\n KosStateMachineAware<PourState, PourEvent> {}\n\n/**\n * Nozzle model -- manages nozzle state and pour operations.\n *\n * @kosService dispense.nozzle\n * @kosApiLevel 2\n */\n@kosModel({ modelTypeId: MODEL_TYPE, singleton: false })\n@kosLoggerAware()\n@kosStateMachine<PourState, PourEvent>(\n {\n initial: PourState.IDLE,\n initializeAt: DependencyLifecycle.READY,\n states: {\n [PourState.IDLE]: {\n on: {\n START_POUR: PourState.POUR_STARTING,\n },\n },\n [PourState.POUR_STARTING]: {\n on: {\n POUR_ACTIVE: PourState.POURING,\n CANCEL_POUR: PourState.POUR_CANCELING,\n POUR_COMPLETED: PourState.IDLE,\n },\n },\n [PourState.POURING]: {\n on: {\n CANCEL_POUR: PourState.POUR_CANCELING,\n POUR_COMPLETED: PourState.IDLE,\n },\n },\n [PourState.POUR_CANCELING]: {\n on: {\n POUR_CANCELED: PourState.IDLE,\n },\n },\n },\n },\n {\n trackHistory: false,\n throwOnInvalid: false, // Gracefully ignore invalid state calls (expected runtime scenarios)\n }\n)\nclass NozzleModelImpl implements PourStrategyAware {\n /** the unique identifier for this nozzle.*/\n id: string;\n path: string;\n name: string;\n private _selectedBeverage?: AvailabilityModel;\n private _selectedBrand?: AvailabilityModel;\n private _additionalItems?: AvailabilityModel[];\n @kosChild private _availabilityItems: IKosModelContainer<AvailabilityModel>;\n futureHandler: FutureAwareContainer;\n\n beverageTopicPrefix: string;\n topicPrefix: string;\n urlPrefix: string;\n\n /**\n * The availability nodes that can be dispensed from this nozzle.\n * This is a subset of the availability for the entire dispenser\n * and is determined by the nodes associated with a nozzle.\n */\n get beverages() {\n return this._availabilityItems.getIndexByKey(\"byGroup\", \"beverages\");\n }\n\n /**\n * The availability nodes that have been grouped into the \"brands\" group.\n *\n */\n get brands() {\n return this._availabilityItems.getIndexByKey(\"byGroup\", \"brands\");\n }\n\n get visibleBrands() {\n return this.brands.filter((brand) => brand.visible);\n }\n\n get visibleBeverages() {\n return this.beverages.filter((beverage) => beverage.visible);\n }\n\n /**\n * A derived value that indicates if the nozzle is currently pouring a beverage.\n * @readonly\n */\n get isPouring() {\n return (\n !!(\n this.futureHandler.getFuture() &&\n !this.futureHandler.getFuture()?.endState\n ) ||\n this.currentState === PourState.POUR_STARTING ||\n this.currentState === PourState.POURING ||\n this.currentState === PourState.POUR_CANCELING\n );\n }\n\n /**\n * A derived value that indicates if the nozzle is currently available to pour a beverage.\n *\n * This will generally be determined by whether there is a currently selected pourable AND\n * the nozzle is not currently pouring.\n *\n * The value is observable and will change when the selected pourable changes or the nozzle\n * starts or stops pouring.\n * @readonly\n * */\n get canPour() {\n return (\n !!this._selectedBeverage &&\n this._selectedBeverage.available &&\n this.currentState === PourState.IDLE\n );\n }\n\n /**\n * The selected pourable for this nozzle. Its shape is determined by the results of the\n * {@link ExtensionType.SelectedPourableMapper} extension.\n * @readonly\n *\n * */\n get selectedPourable() {\n return {\n beverage: this._selectedBeverage,\n additional: this._additionalItems,\n };\n }\n\n get future() {\n return this.futureHandler.getFuture();\n }\n\n get pourProgress() {\n return this.future?.progress ?? 0;\n }\n\n constructor(modelId: string, options: NozzleOptions) {\n this.id = modelId;\n this.path = options.path;\n this.name = options.name;\n this.beverageTopicPrefix = options.beverageTopicPrefix;\n this.topicPrefix = options.topicPrefix;\n this.urlPrefix = options.urlPrefix;\n this._selectedBeverage = undefined;\n this._selectedBrand = undefined;\n this._additionalItems = [];\n this.futureHandler = new MultipleFutureHandler(this);\n this._availabilityItems = new KosModelContainer<AvailabilityModel>({\n indexMap: {\n byGroup: \"groupId\",\n byParent: \"parentId\",\n },\n parentId: modelId,\n });\n }\n\n updateModel(): void {\n // Update model properties here.\n }\n\n // -------------------LIFECYCLE----------------------------\n\n setSelectedBrand(brand?: AvailabilityModel, _context?: Record<string, any>) {\n if (_context) {\n this.logger.debug(`context is currenty being ignored when setting brand`);\n }\n\n this._selectedBrand = brand;\n this._selectedBeverage = undefined;\n }\n\n get selectedBrand() {\n return this._selectedBrand;\n }\n /**\n * Set the values used to determine the selected pourable for this nozzle.\n *\n * @param pourable The pourable to set.\n * @param pourable.beverage The beverage selected.\n * @param pourable.additional The additional items such as flavors or other items that could be incorporated\n * into the pourable.\n * */\n async setSelectedPourable(\n { beverage, additional, context }: SelectedPourable,\n forceUpdate = false\n ): Promise<void> {\n if (!beverage) {\n const response = await clearPourable(this.name);\n if (response?.status !== 200) {\n throw new Error(\"Failed to clear pourable\");\n }\n this._selectedBeverage = undefined;\n return;\n }\n if (\n !forceUpdate &&\n beverage === this._selectedBeverage &&\n arraysEqual(this._additionalItems, additional)\n ) {\n this.logger.info(\"No change in selected pourable\");\n return;\n }\n this._selectedBeverage = beverage;\n this._additionalItems = additional;\n\n let selectedPayload: any;\n try {\n selectedPayload = await ExtensionManager.dataMapper.executeMapper(\n ExtensionType.SelectedPourableMapper,\n {\n beverage,\n additional,\n context,\n }\n );\n } catch (e) {\n this.logger.error(\n `Error executing SelectedPourableMapper, falling back to default payload. Error: ${e}`\n );\n selectedPayload = undefined;\n }\n\n const defaultPayload = {\n bevId: beverage.rawId,\n };\n if (!selectedPayload || Object.keys(selectedPayload).length === 0) {\n this.logger.info(\n `No selected pourable mapper defined, using the default payload ${defaultPayload}`\n );\n selectedPayload = defaultPayload;\n }\n const payload = selectedPayload ?? defaultPayload;\n\n const response = await selectPourable(this.name, payload);\n if (response?.status !== 200) {\n throw new Error(\"Failed to select pourable\");\n }\n }\n\n /**\n * Utility method that will return the availability nodes that belong to the specified\n * group as defined in the dispenser beverage graph. For example, a dispenser\n * implementation may group availability nodes by Brand, Beverage, or Flavors\n *\n * @param groupId The group to filter by.\n * @returns The availability nodes that are available to be dispensed from this nozzle\n * and are in the specified group.\n * */\n getGroupAvailabilityItems<D extends object = any>(groupId: string) {\n return this._availabilityItems.getIndexByKey(\n \"byGroup\",\n groupId\n ) as AvailabilityModel<D>[];\n }\n\n /**\n * Utility method that will return the availability nodes that are tagged with the specified parent id.\n *\n * This is useful when brandsets use the taggedIds property to associate nodes with a parent node. For example,\n * when organizing a brandset into brands and beverages, the brand nodes will be tagged with the beverage nodes.\n *\n * @param parentId - The parent id to filter by.\n * @returns the availability nodes that are tagged with the specified parent id.\n */\n getAvailabilityByParent<D extends object = any>(parentId: string) {\n return this._availabilityItems.getIndexByKey(\n \"byParent\",\n parentId\n ) as AvailabilityModel<D>[];\n }\n\n // ============================================================================\n // FSM Entry/Exit Handlers\n // ============================================================================\n\n /**\n * @kosApiLevel 12\n */\n @kosStateEntry(PourState.POURING)\n handlePouringStart(): void {\n this.logger.info(\"Pour started\");\n\n // Notify companion models\n getAllKosCompanionModels(this).forEach((model) => {\n if (isPourAware(model)) {\n model.onPourStart?.();\n }\n });\n }\n\n /**\n * @kosApiLevel 12\n */\n @kosStateExit(PourState.POURING)\n handlePouringEnd(): void {\n this.logger.info(\"Pour ended\");\n }\n\n /**\n * @kosApiLevel 12\n */\n @kosStateEntry(PourState.POUR_CANCELING)\n handleCancelStart(): void {\n this.logger.info(\"Pour canceling\");\n }\n\n /**\n * @kosApiLevel 12\n */\n @kosStateExit(PourState.POUR_CANCELING)\n handleCanceled(): void {\n this.logger.info(\"Pour canceled\");\n\n // Notify companion models\n getAllKosCompanionModels(this).forEach((model) => {\n if (isPourAware(model)) {\n model.onPourCancel?.();\n }\n });\n\n // Publish cancel event\n const evt: PourCancelEvent = {\n nozzleId: this.id,\n };\n EventBus.publish(TOPIC_NOZZLE_POUR_CANCEL, evt);\n }\n\n // ============================================================================\n // Future Lifecycle Handler\n // ============================================================================\n\n onFutureUpdate(future: IFutureModel<any>) {\n const companions = getAllKosCompanionModels(this);\n companions.forEach((model) => {\n if (isPourAware(model)) {\n model.onPourProgress(future);\n }\n });\n\n const evt: PourProgressEvent = {\n nozzleId: this.id,\n progress: future.progress,\n status: future.status,\n clientData: future.clientData,\n futureId: future.futureId,\n remainingTimeMs: future.remainingTimeMs,\n endState: future.endState,\n reason: future.reason,\n timeRemaining: future.timeRemaining,\n };\n EventBus.publish(TOPIC_NOZZLE_POUR_PROGRESS, evt);\n if (future.endState) {\n kosAction(() => {\n // Transition to completed state\n if (this.currentState === PourState.POURING) {\n this.transition(\"POUR_COMPLETED\");\n }\n });\n }\n }\n\n // ============================================================================\n // State-Guarded Actions\n // ============================================================================\n\n /**\n * An action that will initiate a pour for this nozzle.\n *\n * The invocation of this action will result in a Future being returned that will\n * provide the status of the pour and return any errors that may occur.\n *\n * @see {@link kosFuture}\n * */\n @kosFuture()\n @kosStateGuard({ allowedStates: [PourState.IDLE] }) // Inherits throwOnInvalid: false from class\n public async pour(tracker?: string) {\n try {\n this.transition(\"START_POUR\");\n\n if (!tracker) {\n throw new Error(\"No tracker provided\");\n }\n\n const result = await pourPourable(this.name, tracker);\n this.transition(\"POUR_ACTIVE\");\n\n // Publish pour started event\n const evt: PourStartEvent = {\n nozzleId: this.id,\n type: \"free\",\n };\n EventBus.publish(TOPIC_NOZZLE_POUR_STARTED, evt);\n\n // If the pour was successful or immediately ended, handle completion\n if (result?.data?.endState) {\n this.transition(\"POUR_COMPLETED\");\n }\n\n return result as unknown as Promise<void>;\n } catch (e) {\n this.logger.error(e);\n // On error, transition back to IDLE via POUR_COMPLETED\n if (this.currentState !== PourState.IDLE) {\n this.transition(\"POUR_COMPLETED\");\n }\n throw e;\n }\n }\n\n /**\n * An action that will initiate a fixed volume pour for this nozzle using the\n * specified pourable volume name.\n *\n * The invocation of this action will result in a Future being returned that will\n * provide the status of the pour and return any errors that may occur.\n *\n * @see {@link kosFuture}\n * */\n @kosFuture()\n @kosStateGuard({ allowedStates: [PourState.IDLE] }) // Inherits throwOnInvalid: false from class\n public async fixedPour(name: string, tracker?: string) {\n try {\n this.transition(\"START_POUR\");\n\n if (!tracker) {\n throw new Error(\"No tracker provided\");\n }\n\n const result = await pourNamedPourable(name, this.name, tracker);\n this.transition(\"POUR_ACTIVE\");\n\n // Publish pour started event\n const evt: PourStartEvent = {\n nozzleId: this.id,\n type: \"fixed\",\n };\n EventBus.publish(TOPIC_NOZZLE_POUR_STARTED, evt);\n\n // If the pour was successful or immediately ended, handle completion\n if (result?.data?.endState) {\n this.transition(\"POUR_COMPLETED\");\n }\n\n return result as unknown as Promise<void>;\n } catch (e) {\n this.logger.error(e);\n // On error, transition back to IDLE via POUR_COMPLETED\n if (this.currentState !== PourState.IDLE) {\n this.transition(\"POUR_COMPLETED\");\n }\n throw e;\n }\n }\n\n /**\n * An action that will cancel a pour for this nozzle.\n * */\n @kosStateGuard({\n allowedStates: [PourState.POUR_STARTING, PourState.POURING],\n }) // Inherits throwOnInvalid: false - silently ignore if already idle\n public async cancelPour() {\n this.transition(\"CANCEL_POUR\");\n await this.futureHandler.getFuture()?.cancelFuture();\n this.transition(\"POUR_CANCELED\");\n }\n\n private updateGroupMembers() {\n this._availabilityItems.data.forEach((item) => {\n const taggedIds = item.taggedIds || [];\n taggedIds.forEach((taggedId) => {\n const childItem = this._availabilityItems.data.find(\n (beverage) => beverage.rawId === taggedId\n );\n if (childItem && childItem.parentId !== item.id) {\n childItem.parentId = item.id;\n this._availabilityItems.updateModel(childItem);\n }\n });\n });\n }\n\n async reload(): Promise<void> {\n this.logger.info(`reloading nozzle ${this.id}`);\n\n const availability = await getAvailability(this.urlPrefix);\n if (availability?.status !== 200 || !availability?.data) {\n this.logger.error(\"Failed to load nozzle availability\");\n return;\n }\n const update = availability?.data;\n if (update) {\n await this.updateAvailability(update);\n }\n }\n\n /** @internal */\n async load(context?: KosContext): Promise<void> {\n this.logger.debug(`loading nozzle ${this.id}`);\n\n const availability = await getAvailability(this.urlPrefix);\n if (availability?.status !== 200) {\n throw new Error(\"Failed to load nozzle availability\");\n }\n\n const beverageContext = await ExtensionManager.loader.executeLoader(\n ExtensionType.AvailabilityLoader,\n {}\n );\n\n context?.set(ExtensionType.AvailabilityLoader, beverageContext);\n context?.set(Nozzle.type, this);\n for (const group of Object.keys(availability.data?.groups) || []) {\n for (const beverageData of availability.data?.groups[group] || []) {\n const extensionData = await ExtensionManager.dataMapper.executeMapper(\n ExtensionType.AvailabilityMapper,\n { ...beverageData, groupId: group },\n beverageContext\n );\n const beverageOptions: AvailabilityOptions = {\n ...beverageData,\n note: beverageData.note ?? undefined,\n kosParentId: this.id,\n rawId: beverageData.id,\n groupId: group,\n data: extensionData,\n properties: beverageData.properties || {},\n };\n const beverage = Availability.factory(\n `${this.id}-${group}-${beverageData.id}`\n )(beverageOptions);\n this._availabilityItems.addModel(beverage);\n }\n }\n\n this.updateGroupMembers();\n }\n\n @kosTopicHandler({\n topic: `${PROP_BEVERAGE_TOPIC_PREFIX}/availability`,\n websocket: true,\n })\n async updateAvailability(update: AvailabilityResponse) {\n const context = KosContextManager.getContext(this.id);\n const beverageContext =\n context?.get(ExtensionType.AvailabilityLoader) || {};\n if (update.rebuild) {\n this.logger.info(\n `Received rebuild update for nozzle ${this.path}, rebuilding entire availability set`\n );\n for (const group of Object.keys(update?.groups) || []) {\n const deletedBeverages = this._availabilityItems\n .getIndexByKey(\"group\", group)\n .filter(\n (beverage) =>\n !update.groups[group].find(\n (b) => `${this.id}-${group}-${b.id}` === beverage.id\n )\n );\n\n deletedBeverages.forEach((beverage) => {\n this.logger.info(\n `Removing beverage ${beverage.id} from nozzle ${this.path} due to rebuild update`\n );\n this._availabilityItems.removeModel(beverage.id);\n destroyKosModel(beverage);\n });\n\n // add any new beverages\n for (const beverageData of update?.groups[group] || []) {\n const extensionData = await ExtensionManager.dataMapper.executeMapper(\n ExtensionType.AvailabilityMapper,\n { ...beverageData, groupId: group },\n beverageContext\n );\n const beverageOptions: AvailabilityOptions = {\n ...beverageData,\n note: beverageData.note ?? undefined,\n kosParentId: this.id,\n groupId: group,\n rawId: beverageData.id,\n data: extensionData,\n taggedIds: beverageData.taggedIds,\n properties: beverageData.properties || {},\n };\n const existing = this._availabilityItems.getModel(\n `${this.id}-${group}-${beverageData.id}`\n );\n if (existing) {\n if (existing.available !== beverageOptions.available) {\n this.logger.info(\n `Updating availability of beverage ${existing.id} in nozzle ${this.path} to ${beverageOptions.available}`\n );\n }\n existing.updateModel(beverageOptions);\n } else {\n this.logger.info(\n `Adding beverage ${beverageData.id} to nozzle ${this.path}`\n );\n const beverage = Availability.factory(\n `${this.id}-${group}-${beverageData.id}`\n )(beverageOptions);\n this._availabilityItems.addModel(beverage);\n }\n }\n }\n } else {\n this.logger.info(\n `Received delta update for nozzle ${this.path}, updating availability nodes`\n );\n for (const group of Object.keys(update?.groups) || []) {\n for (const beverageData of update?.groups[group] || []) {\n const extensionData = await ExtensionManager.dataMapper.executeMapper(\n ExtensionType.AvailabilityMapper,\n { ...beverageData, groupId: group },\n beverageContext\n );\n const beverageOptions: AvailabilityOptions = {\n ...beverageData,\n note: beverageData.note ?? undefined,\n kosParentId: this.id,\n groupId: group,\n rawId: beverageData.id,\n data: extensionData,\n type: beverageData.type,\n taggedIds: beverageData.taggedIds,\n properties: beverageData.properties || {},\n };\n const existing = this._availabilityItems.getModel(\n `${this.id}-${group}-${beverageData.id}`\n );\n if (existing) {\n if (existing.available !== beverageOptions.available) {\n this.logger.info(\n `Updating availability of beverage ${existing.id} in nozzle ${this.path} to ${beverageOptions.available}`\n );\n }\n existing.updateModel(beverageOptions);\n }\n }\n }\n }\n this.updateGroupMembers();\n }\n\n // -------------------ENTITY----------------------------\n}\n\n/**\n *\n * The NozzleModel provides the availability of pourables that are\n * associated with the nozzle.\n *\n * Its primary purpose is to provide a mechanism for selecting from available pourables and initiating a pour.\n *\n * It is possible for a dispenser to have multiple asymmetrical nozzles. For example, a dispenser may have\n * a nozzle that is used for dispensing a syrups and flavors and another that is just dispensing water.\n *\n * The NozzleModel is a {@link IKosDataModel} and is registered with the model registry using the {@link Nozzle} type.\n *\n *\n * @see {@link NozzleServices.getAvailability} - The availability service will retrieve the availability for the nozzle.\n *\n * ## Lifecycle\n *\n * ### Load\n *\n * During the `load` phase of the model lifecycle, the set of Availability nodes will be retrieved for the nozzle. The nodes will be indexed based on\n * the defined `groupId` for the node. The `groupId` is defined in the dispenser beverage graph and is used to group availability nodes.\n *\n * #### Extension Points\n *\n * The `load` lifecycle hook will first call into the {@link ExtensionType.AvailabilityLoader} extension point in order to establish the context\n * that will be used to populate the availability nodes.\n *\n * The `load` lifecycle hook will then call into the {@link ExtensionType.AvailabilityMapper} for each Availability node that is retrieved.\n * The extension point will be called the the Availability context data and the {@link NozzleServices.BeverageResponse} for the availability node.\n *\n *\n *\n * @see {@link Nozzle}\n *\n *\n *\n *\n * @category Model\n * @interface\n *\n\n */\nexport type NozzleModel = PublicModelInterface<NozzleModelImpl>;\n\n/**\n * Registration bean for {@link NozzleModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: curried factory, `Nozzle.factory(id)(options)`. Returns the existing model when the id is already in use and ignores the options.\n * - `predicate`: type guard that narrows an `IKosDataModel` to `NozzleModel`.\n * - `registration`: registry entry that can be spread into an `IKosRegistry[\"models\"]` map.\n *\n * Nozzle is not a singleton: each id has its own instance. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: Nozzle.type, id: \"nozzleId\" })\n * private nozzle!: NozzleModel;\n * ```\n *\n * @category KOS Model Registration\n */\nexport const Nozzle: Readonly<\n KosModelRegistrationBean<NozzleModel, NozzleOptions>\n> = {\n registration: {\n [MODEL_TYPE]: {\n class: NozzleModelImpl,\n singleton: false,\n },\n },\n type: MODEL_TYPE,\n predicate: isKosModel(MODEL_TYPE),\n factory: Kos.Factory.create<NozzleModel, NozzleOptions>(MODEL_TYPE),\n};\n","import type {\n IKosDataModel,\n IKosIdentifiable,\n IKosModelContainer,\n KosContextLogger,\n KosCreationContext,\n PublicModelInterface,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { KosModelContainer, kosChild, kosModel } from \"@kosdev-code/kos-ui-sdk\";\nimport { getAssembly } from \"../assembly/services\";\nimport { Nozzle, type NozzleModel } from \"../nozzle\";\nimport type { DeviceAssemblyOptions } from \"./types\";\n\nexport const MODEL_TYPE = \"device-assembly-model\";\n\nexport type DeviceAssemblyModel = PublicModelInterface<DeviceAssemblyModelImpl>;\n\n/**\n * @kosService dispense.device-assembly\n * @kosApiLevel 2\n */\n@kosModel(MODEL_TYPE)\nexport class DeviceAssemblyModelImpl\n implements IKosDataModel, IKosIdentifiable\n{\n id: string;\n @kosChild private deviceNozzles: IKosModelContainer<NozzleModel>;\n private logger: KosContextLogger;\n constructor(\n modelId: string,\n _options: DeviceAssemblyOptions,\n context: KosCreationContext\n ) {\n this.id = modelId;\n this.logger = context.logger;\n this.deviceNozzles = new KosModelContainer();\n }\n\n // -------------------LIFECYCLE----------------------------\n\n async init(): Promise<void> {\n this.logger.debug(`initializing device-assembly ${this.id}`);\n }\n\n getNozzle(path: string): NozzleModel | undefined {\n return this.deviceNozzles.getModel(path);\n }\n\n get nozzlePaths(): string[] {\n return this.deviceNozzles.data.map((nozzle) => nozzle.path);\n }\n\n async load(): Promise<void> {\n this.logger.debug(`loading device-assembly ${this.id}`);\n const result = await getAssembly();\n if (result?.status === 200) {\n const nozzles = result.data.assemblies\n .map((assembly) => assembly.nozzles ?? [])\n .flat();\n nozzles.forEach((nozzleData) => {\n const nozzleId = nozzleData.path;\n const beverageTopicPrefix =\n nozzleData.pipelines.find((pipeline) => pipeline.name === \"beverage\")\n ?.topicPrefix || \"\";\n\n const nozzle = Nozzle.factory(nozzleId)({\n path: nozzleData.path,\n name: nozzleData.name,\n urlPrefix: nozzleData.urlPrefix,\n topicPrefix: nozzleData.topicPrefix,\n beverageTopicPrefix: beverageTopicPrefix,\n });\n this.deviceNozzles.addModel(nozzle);\n });\n }\n }\n}\n","import { SingletonKosModelRegistrationFactory } from \"@kosdev-code/kos-ui-sdk\";\nimport type { DeviceAssemblyModel } from \"./device-assembly-model\";\nimport { DeviceAssemblyModelImpl, MODEL_TYPE } from \"./device-assembly-model\";\nimport type { DeviceAssemblyOptions } from \"./types\";\n\n/**\n * Registration bean for {@link DeviceAssemblyModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: `DeviceAssembly.factory(options)` returns the single instance, creating it on the first call.\n * - `guard`: type guard that narrows an `IKosDataModel` to `DeviceAssemblyModel`.\n * - `instance()`: reads the model, or builds it from options.\n * - `register()`: registers the model, and any related models, with the model registry.\n *\n * DeviceAssembly is a singleton. `KosModelRegistry.dispense.models()` registers it.\n *\n * @example\n * ```typescript\n * @kosDependency({ modelType: DeviceAssembly.type })\n * private deviceAssembly!: DeviceAssemblyModel;\n * ```\n */\nexport const DeviceAssembly = new SingletonKosModelRegistrationFactory<\n DeviceAssemblyModel,\n DeviceAssemblyOptions\n>({\n class: DeviceAssemblyModelImpl,\n type: MODEL_TYPE,\n});\n","import {\n FutureManager,\n ServiceFactory,\n resolveServiceUrl,\n} from \"@kosdev-code/kos-ui-sdk\";\nconst { URL } = resolveServiceUrl(\"GENERIC_POUR_SERVICE\");\nconst { postModel } = ServiceFactory.build({\n basePath: `${URL}/api/nozzle`,\n});\n\n/**\n *\n * Initiates a pour for a pour target on a given path.\n *\n\n *\n * @param path - the API path to pour from, this will be passed in from the model\n * @param tracker - the tracker to use for the pour. It will be returned in the future to allow consumers\n * to track the pour\n * @category Service\n *\n * @see {@link FutureManager.initiateFuture}\n * @returns - a Future that encapsulates the pour including its status and progress.\n **/\nexport const pourOnTarget = async (path: string, tracker: string) => {\n const response = await postModel<any>({\n model: {},\n urlOverride: `${URL}${path}`,\n ordered: true,\n tracker,\n });\n if (response?.data) {\n FutureManager.initiateFuture(response.data);\n }\n return response;\n};\n","/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\nimport {\n DependencyLifecycle,\n EventBus,\n FutureContainer,\n FutureEndState,\n FutureHandler,\n IFutureModel,\n IKosDataModel,\n ObservableData,\n PublicModelInterface,\n getAllKosCompanionModels,\n kosAction,\n kosFuture,\n kosFutureAware,\n kosLoggerAware,\n kosModel,\n kosStateEntry,\n kosStateExit,\n kosStateGuard,\n kosStateMachine,\n type KosData,\n type KosFutureAwareFull,\n type KosLoggerAware,\n type KosStateMachineAware,\n} from \"@kosdev-code/kos-ui-sdk\";\n\nimport type { PourAware, PourStrategyAware } from \"../nozzle/types\";\nimport { PourState } from \"../types\";\nimport { pourOnTarget } from \"./services\";\nimport type { GenericPourOptions } from \"./types\";\n\nexport const MODEL_TYPE = \"generic-pour-model\";\n\nexport type GenericPourModel = PublicModelInterface<GenericPourModelImpl>;\n\nexport const TOPIC_GENERIC_POUR_STARTED = \"/kos/generic/pour/started\";\nexport const TOPIC_GENERIC_POUR_PROGRESS = \"/kos/generic/pour/progress\";\nexport const TOPIC_GENERIC_POUR_CANCEL = \"/kos/generic/pour/cancel\";\n\n// ============================================================================\n// FSM Type Definitions\n// ============================================================================\n\ntype PourEvent =\n | \"START_POUR\"\n | \"POUR_ACTIVE\"\n | \"CANCEL_POUR\"\n | \"POUR_CANCELED\"\n | \"POUR_COMPLETED\";\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\ninterface BasePourEvent {\n pourTarget: string;\n}\n\ninterface PourStartEvent extends BasePourEvent {\n type: string;\n}\n\ntype PourCancelEvent = BasePourEvent;\n\ninterface PourProgressEvent<T extends Record<string, any> = Record<string, any>>\n extends BasePourEvent {\n remainingTimeMs: number;\n endState?: FutureEndState;\n reason?: string;\n clientData?: T;\n futureId: string;\n status: string;\n timeRemaining: string;\n progress: number;\n}\n\nconst isPourAware = (model: any): model is PourAware =>\n model.onPourStart !== undefined &&\n model.onPourCancel !== undefined &&\n model.onPourProgress !== undefined;\n\n// ============================================================================\n// Model Interface with FSM Support\n// ============================================================================\n\nexport interface GenericPourModelImpl\n extends KosLoggerAware,\n KosFutureAwareFull<any>,\n KosStateMachineAware<PourState, PourEvent> {}\n\n/**\n * @kosService dispense.generic-pour\n * @kosApiLevel 4\n */\n@kosModel(MODEL_TYPE)\n@kosLoggerAware()\n@kosFutureAware()\n@kosStateMachine<PourState, PourEvent>(\n {\n initial: PourState.IDLE,\n initializeAt: DependencyLifecycle.READY,\n states: {\n [PourState.IDLE]: {\n on: {\n START_POUR: PourState.POUR_STARTING,\n },\n },\n [PourState.POUR_STARTING]: {\n on: {\n POUR_ACTIVE: PourState.POURING,\n CANCEL_POUR: PourState.POUR_CANCELING,\n POUR_COMPLETED: PourState.IDLE,\n },\n },\n [PourState.POURING]: {\n on: {\n CANCEL_POUR: PourState.POUR_CANCELING,\n POUR_COMPLETED: PourState.IDLE,\n },\n },\n [PourState.POUR_CANCELING]: {\n on: {\n POUR_CANCELED: PourState.IDLE,\n },\n },\n },\n },\n {\n trackHistory: false,\n throwOnInvalid: false, // Gracefully ignore invalid state calls (expected runtime scenarios)\n }\n)\nexport class GenericPourModelImpl\n implements IKosDataModel, PourStrategyAware, FutureContainer\n{\n id: string;\n /**\n * @kosApiLevel 5\n */\n servicePathFactory: (\n selectedId: string,\n context?: KosData<Record<string, any>>\n ) => string;\n pourType: string;\n\n /**\n * @kosApiLevel 5\n */\n selectedId?: string;\n private state: KosData<Record<string, any>>;\n\n constructor(modelId: string, options: GenericPourOptions) {\n this.id = modelId;\n\n this.futureHandler = new FutureHandler(this);\n this.servicePathFactory = options.servicePathFactory;\n this.pourType = options.pourType || \"free\";\n this.selectedId = options.selectedId;\n this.state = ObservableData(options.initialData || {});\n }\n\n get servicePath() {\n if (!this.selectedId) {\n return \"\";\n }\n return this.servicePathFactory(this.selectedId, this.state);\n }\n\n /**\n * @kosApiLevel 12\n */\n updateContextData(key: string, value: any) {\n this.state[key] = value;\n }\n\n /**\n * @kosApiLevel 12\n */\n removeContextData(key: string) {\n delete this.state[key];\n }\n\n /**\n * @kosApiLevel 12\n */\n clearContextData() {\n this.state = ObservableData();\n }\n\n /**\n * @kosApiLevel 14\n */\n updateModel(options: GenericPourOptions): void {\n if (options.pourType) {\n this.pourType = options.pourType;\n }\n if (options.initialData) {\n this.state.setValues(options.initialData);\n }\n }\n\n // ============================================================================\n // FSM Entry/Exit Handlers\n // ============================================================================\n\n /**\n * @kosApiLevel 12\n */\n @kosStateEntry(PourState.POURING)\n handlePouringStart(): void {\n this.logger.info(\"Pour started\");\n\n // Notify companion models\n getAllKosCompanionModels(this).forEach((model) => {\n if (isPourAware(model)) {\n model.onPourStart?.();\n }\n });\n\n // Publish event\n const evt: PourStartEvent = {\n pourTarget: this.id,\n type: this.pourType,\n };\n EventBus.publish(TOPIC_GENERIC_POUR_STARTED, evt);\n }\n\n /**\n * @kosApiLevel 12\n */\n @kosStateExit(PourState.POURING)\n handlePouringEnd(): void {\n this.logger.info(\"Pour ended\");\n }\n\n /**\n * @kosApiLevel 12\n */\n @kosStateEntry(PourState.POUR_CANCELING)\n handleCancelStart(): void {\n this.logger.info(\"Pour canceling\");\n }\n\n /**\n * @kosApiLevel 12\n */\n @kosStateExit(PourState.POUR_CANCELING)\n handleCanceled(): void {\n this.logger.info(\"Pour canceled\");\n\n // Notify companion models\n getAllKosCompanionModels(this).forEach((model) => {\n if (isPourAware(model)) {\n model.onPourCancel?.();\n }\n });\n\n // Publish cancel event\n const evt: PourCancelEvent = {\n pourTarget: this.id,\n };\n EventBus.publish(TOPIC_GENERIC_POUR_CANCEL, evt);\n }\n\n // ============================================================================\n // State-Guarded Actions\n // ============================================================================\n\n /**\n * An action that will initiate a pour for this nozzle.\n *\n * The invocation of this action will result in a Future being returned that will\n * provide the status of the pour and return any errors that may occur.\n *\n * @see {@link kosFuture}\n * */\n @kosFuture()\n @kosStateGuard({ allowedStates: [PourState.IDLE] }) // Inherits throwOnInvalid: false from class\n public async pour(tracker?: string) {\n try {\n this.transition(\"START_POUR\");\n\n if (!tracker) {\n throw new Error(\"No tracker provided\");\n }\n\n const result = await pourOnTarget(this.servicePath, tracker);\n this.transition(\"POUR_ACTIVE\");\n\n // If the pour was successful or immediately ended, handle completion\n if (result?.data?.endState) {\n this.transition(\"POUR_COMPLETED\");\n }\n\n return result as unknown as Promise<void>;\n } catch (e) {\n this.logger.error(e);\n // On error, transition back to IDLE via POUR_COMPLETED\n if (this.currentState !== PourState.IDLE) {\n this.transition(\"POUR_COMPLETED\");\n }\n throw e;\n }\n }\n\n @kosStateGuard({\n allowedStates: [PourState.POUR_STARTING, PourState.POURING],\n }) // Inherits throwOnInvalid: false - silently ignore if already idle\n public async cancelPour() {\n this.transition(\"CANCEL_POUR\");\n await this.futureHandler.getFuture()?.cancelFuture();\n this.transition(\"POUR_CANCELED\");\n }\n\n // ============================================================================\n // Computed Properties\n // ============================================================================\n\n /**\n * A derived value that indicates if the nozzle is currently pouring a beverage.\n * @readonly\n */\n get isPouring() {\n return (\n !!(this.future && !this.future?.endState) ||\n this.currentState === PourState.POUR_STARTING ||\n this.currentState === PourState.POURING ||\n this.currentState === PourState.POUR_CANCELING\n );\n }\n\n /**\n * A derived value that indicates if the pour target is currently available to pour a beverage.\n *\n * Generally this means that the pour target is currently idle and not in the process of pouring,\n * initiating a pour, or canceling a pour.\n * The value is observable and will change when the selected pourable changes or the pour target\n * starts or stops pouring.\n * @readonly\n */\n get canPour() {\n return this.currentState === PourState.IDLE;\n }\n\n get pourProgress() {\n return this.progress ?? 0;\n }\n\n // ============================================================================\n // Future Lifecycle Handler\n // ============================================================================\n\n onFutureUpdate(future: IFutureModel<any>) {\n getAllKosCompanionModels(this).forEach((model) => {\n if (isPourAware(model)) {\n model.onPourProgress(future);\n }\n });\n\n const evt: PourProgressEvent = {\n pourTarget: this.id,\n progress: future.progress,\n status: future.status,\n clientData: future.clientData,\n futureId: future.futureId,\n remainingTimeMs: future.remainingTimeMs,\n endState: future.endState,\n reason: future.reason,\n timeRemaining: future.timeRemaining,\n };\n EventBus.publish(TOPIC_GENERIC_POUR_PROGRESS, evt);\n\n if (future.endState) {\n kosAction(() => {\n // Transition to completed state\n if (this.currentState === PourState.POURING) {\n this.transition(\"POUR_COMPLETED\");\n }\n });\n }\n }\n}\n","import { KosModelRegistrationFactory } from \"@kosdev-code/kos-ui-sdk\";\nimport type { GenericPourOptions } from \"./types\";\nimport { GenericPourModelImpl, MODEL_TYPE } from \"./generic-pour-model\";\nimport type { GenericPourModel } from \"./generic-pour-model\";\n\n/**\n * Registration bean for {@link GenericPourModel}.\n *\n * - `type`: the model type, used by the model registry and in `@kosDependency` declarations.\n * - `factory`: curried factory, `GenericPour.factory(id)(options)`. Returns the existing model when the id is already in use and ignores the options.\n * - `guard`: type guard that narrows an `IKosDataModel` to `GenericPourModel`.\n * - `instance(id)`: reads the model, or builds it from options.\n * - `register()`: registers the model, and any related models, with the model registry.\n *\n * GenericPour is not a singleton: each id has its own instance.\n *\n * @example\n * ```typescript\n * import { KosModelRegistry } from \"@kosdev-code/kos-dispense-sdk\";\n *\n * KosModelRegistry.dispense.models().model(GenericPour);\n * ```\n */\nexport const GenericPour = new KosModelRegistrationFactory<\n GenericPourModel,\n GenericPourOptions\n>({\n class: GenericPourModelImpl,\n type: MODEL_TYPE,\n});\n","import type { IKosRegistry } from \"@kosdev-code/kos-ui-sdk\";\nimport { Assembly } from \"../models/assembly\";\nimport { Availability } from \"../models/availability\";\nimport { BoardContainer } from \"../models/board\";\nimport { Holder } from \"../models/holder\";\nimport { HolderContainer } from \"../models/holder-container\";\nimport { Ingredient } from \"../models/ingredient\";\nimport { IngredientContainer } from \"../models/ingredient-container\";\nimport { Nozzle } from \"../models/nozzle\";\nimport { Pump } from \"../models/pump\";\nimport { PumpContainer } from \"../models/pump-container\";\n\nexport const kosModels: IKosRegistry[\"models\"] = {\n ...IngredientContainer.registration,\n ...Ingredient.registration,\n ...HolderContainer.registration,\n ...Holder.registration,\n ...Nozzle.registration,\n ...Pump.registration,\n ...PumpContainer.registration,\n ...Availability.registration,\n ...Assembly.registration,\n ...BoardContainer.registration,\n} as IKosRegistry[\"models\"];\n","import {\n KosModelRegistry as CoreKosModelRegistration,\n EXTENSION_TROUBLE_DATA_MAPPER,\n ExtensionManager,\n RegistrationManager,\n getKosModelSync,\n registerCoreModels,\n registerLegacyModel,\n type RegistrationResult,\n type TroubleModel,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { Assembly } from \"../models/assembly/assembly-registration\";\nimport type { AssemblyModel } from \"../models/assembly/types\";\nimport type { BoardModel } from \"../models/board/types\";\nimport { DeviceAssembly } from \"../models/device-assembly\";\nimport { kosModels } from \"./registration\";\n\nexport const registerDispenseModels =\n <R>(root: R) =>\n () => {\n registerCoreModels(root)();\n DeviceAssembly.register();\n Object.keys(kosModels).forEach((key) => {\n const model = kosModels[key];\n registerLegacyModel(root)(key, model);\n });\n\n ExtensionManager[EXTENSION_TROUBLE_DATA_MAPPER].register(\n \"FirmwareUpdateInProgressTrouble\",\n async (trouble: TroubleModel) => {\n // If the trouble is related to a container, we don't need to map the data\n\n if (trouble.data?.deviceId) {\n const { model: assemblyModel } = getKosModelSync<AssemblyModel>(\n Assembly.type\n );\n\n if (assemblyModel) {\n const boardModel = assemblyModel.boards.find(\n (b) => b.id === trouble.data.deviceId\n )\n ? getKosModelSync<BoardModel>(trouble.data.deviceId).model\n : undefined;\n return {\n devices: boardModel ? boardModel.name : \"\",\n };\n }\n }\n return {};\n }\n );\n return {\n preload: RegistrationManager.model.preloadModel(root),\n model: RegistrationManager.model.register(root),\n companion: RegistrationManager.companion.register(root),\n legacy: RegistrationManager.model.registerLegacyModel(root),\n };\n };\n\nexport type DispenseKosModelRegistration<R> =\n typeof CoreKosModelRegistration & {\n dispense: { models: () => RegistrationResult<R> };\n preload: ReturnType<typeof RegistrationManager.model.preloadModel>;\n model: ReturnType<typeof RegistrationManager.model.register>;\n companion: ReturnType<typeof RegistrationManager.companion.register>;\n };\n\nconst _KosModelRegistry = {\n ...CoreKosModelRegistration,\n};\n\n(_KosModelRegistry as any).dispense = {\n models: registerDispenseModels(_KosModelRegistry),\n};\n(_KosModelRegistry as any).preload =\n RegistrationManager.model.preloadModel(_KosModelRegistry);\n(_KosModelRegistry as any).model =\n RegistrationManager.model.register(_KosModelRegistry);\n(_KosModelRegistry as any).companion =\n RegistrationManager.companion.register(_KosModelRegistry);\n(_KosModelRegistry as any).legacy =\n RegistrationManager.model.registerLegacyModel(_KosModelRegistry);\n\ntype KosModelRegistryType = DispenseKosModelRegistration<\n typeof _KosModelRegistry\n>;\n\nconst KosModelRegistry: KosModelRegistryType = _KosModelRegistry as any;\n\nexport { KosModelRegistry };\n"],"names":["ExtensionType","DispenseModelType","MODEL_TYPE","__decorateClass","URL","getOne","log","ingredientData","getAll","postModel","deleteModel","PumpIndex","Logger","PourState","isPourAware","response","CoreKosModelRegistration"],"mappings":";;AAGO,IAAK,kCAAAA,mBAAL;AAKLA,iBAAA,kBAAA,IAAmB;AAMnBA,iBAAA,kBAAA,IAAmB;AAEnBA,iBAAA,iBAAA,IAAkB;AAIlBA,iBAAA,sBAAA,IAAuB;AAKvBA,iBAAA,kBAAA,IAAmB;AAEnBA,iBAAA,cAAA,IAAe;AAEfA,iBAAA,aAAA,IAAc;AAMdA,iBAAA,wBAAA,IAAyB;AAMzBA,iBAAA,oBAAA,IAAqB;AAMrBA,iBAAA,oBAAA,IAAqB;AAKrBA,iBAAA,wBAAA,IAAyB;AAMzBA,iBAAA,gBAAA,IAAiB;AACjBA,iBAAA,aAAA,IAAc;AACdA,iBAAA,YAAA,IAAa;AACbA,iBAAA,WAAA,IAAY;AACZA,iBAAA,sBAAA,IAAuB;AA3Db,SAAAA;AAAA,GAAA,iBAAA,CAAA,CAAA;AA8DL,IAAK,sCAAAC,uBAAL;AACLA,qBAAA,QAAA,IAAS;AACTA,qBAAA,cAAA,IAAe;AACfA,qBAAA,QAAA,IAAS;AACTA,qBAAA,iBAAA,IAAkB;AAClBA,qBAAA,qBAAA,IAAsB;AACtBA,qBAAA,YAAA,IAAa;AACbA,qBAAA,MAAA,IAAO;AACPA,qBAAA,eAAA,IAAgB;AARN,SAAAA;AAAA,GAAA,qBAAA,CAAA,CAAA;;;;;;;;;ACzDZ,MAAMC,eAAa;AAOnB,IAAM,sBAAN,MAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACE,SACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,GAEL;AACA,SAAK,KAAK;AACV,SAAK,eAAe;AACpB,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,WAAO,OAAO,MAAM,IAAI;AAAA,EAC1B;AAAA,EAEA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,GACuC;AAC1C,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,eAAe;AACpB,SAAK,OAAO;AACZ,WAAO,OAAO,MAAM,IAAI;AAAA,EAC1B;AAAA;AAAA;AAKF;AA5CM,sBAANC,kBAAA;AAAA,EADC,SAASD,YAAU;AAAA,GACd,mBAAA;AA8DC,MAAM,aAET;AAAA,EACF,cAAc;AAAA,IACZ,CAACA,YAAU,GAAG;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,MAAMA;AAAAA,EACN,WAAW,WAAWA,YAAU;AAAA,EAChC,SAAS,IAAI,QAAQ,OAA2CA,YAAU;AAC5E;ACxFA,MAAM,OAAEE,MAAA,IAAQ,kBAAkB,oBAAoB;AACtD,MAAM,UAAEC,SAAA,IAAW,eAAe,MAAM;AAAA,EACtC,UAAU,GAAGD,KAAG;AAClB,CAAC;AAiCM,MAAM,iBAAiB,YAAY;AACxC,QAAM,WAAW,MAAMC,SAAyB;AAAA,IAC9C,aAAa,GAAGD,KAAG;AAAA,EAAA,CACpB;AACD,SAAO;AACT;;;;;;;;;;;ACpBA,MAAMF,eAAa;AAEnB,MAAMI,QAAM,OAAO,aAAa,EAAE,MAAM,8BAA8B;AAOtE,IAAM,+BAAN,MAEA;AAAA,EACE;AAAA,EACU;AAAA,EACV,YAAY,SAAiB,SAAqC;AAChE,SAAK,KAAK;AAGV,SAAK,cAAc,IAAI,kBAAmD;AAAA,MACxE,UAAU;AAAA,QACR,gBAAgB;AAAA,MAAA;AAAA,MAElB,aAAa,cAAc;AAAA,MAC3B,UAAU;AAAA,IAAA,CACX;AAAA,EAIH;AAAA,EAEA,cAAoB;AAAA,EAEpB;AAAA;AAAA,EAIA,qBAAqB,MAAiC;AACpD,WAAO,KAAK,YAAY,cAAc,kBAAkB,IAAI;AAAA,EAC9D;AAAA,EAEA,MAAM,KAAK,SAAqC;AAC9CA,UAAI,MAAM,gCAAgC,KAAK,EAAE,EAAE;AACnD,UAAM,iBAAiB,MAAM,eAAA;AAC7B,QAAI,gBAAgB,WAAW,KAAK;AAClC,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,UAAM,oBAAoB,MAAM,kBAAkB,uBAAuB;AAAA,MACvE;AAAA,MACA,WAAW,cAAc;AAAA,IAAA,CAC1B;AAED,UAAM,iBAAiB,gBAAgB,QAAQ,CAAA;AAC/C,eAAW,OAAO,OAAO,KAAK,cAAc,GAAG;AAC7C,iBAAWC,mBAAkB,gBAAgB,OAAO,GAAG,KAAK,CAAA,GAAI;AAC9D,cAAM,OACJ,MAAM,kBAAkB,2BAA2B;AAAA,UACjD,WAAW,cAAc;AAAA,UACzB,MAAMA;AAAAA,UACN,aAAa;AAAA,QAAA,CACd;AAEH,cAAM,OAAO,MAAM,kBAAkB,+BAA+B;AAAA,UAClE,WAAW,cAAc;AAAA,UACzB,MAAMA;AAAAA,UACN,aAAa;AAAA,QAAA,CACd;AAED,cAAM,oBAAuC;AAAA,UAC3C,GAAGA;AAAAA,UACH,MAAM,QAAQA,gBAAe;AAAA,UAC7B,GAAG;AAAA,UACH;AAAA,QAAA;AAEF,cAAM,aAAa,WAAW,QAAQA,gBAAe,EAAE;AAAA,UACrD;AAAA,QAAA;AAEF,aAAK,YAAY,SAAS,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,EAEF;AAAA;AAGF;AAvEYJ,kBAAA;AAAA,EAAT;AAAA,GAJG,6BAIM,WAAA,eAAA,CAAA;AAJN,+BAANA,kBAAA;AAAA,EADC,SAASD,YAAU;AAAA,GACd,4BAAA;AA6FC,MAAM,sBAGT;AAAA,EACF,cAAc;AAAA,IACZ,CAACA,YAAU,GAAG;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,MAAMA;AAAAA,EACN,WAAW,WAAWA,YAAU;AAAA,EAChC,SAAS,IAAI,UAAU,OAGrBA,YAAU;AACd;ACvIA,MAAM,OAAEE,MAAA,IAAQ,kBAAkB,gBAAgB;AAClD,MAAM,EAAA,QAAEI,UAAA,WAAQC,aAAA,aAAWC,cAAA,IAAgB,eAAe,MAAM;AAAA,EAC9D,UAAU,GAAGN,KAAG;AAClB,CAAC;AAED,MAAME,QAAM,OAAO,aAAa;AAAA,EAC9B,MAAM;AAAA,EACN,OAAO;AACT,CAAC;AAyBM,MAAM,aAAa,YAAY;AACpC,QAAM,WAAW,MAAME,SAAuB,EAAE;AAChD,SAAO;AACT;AAEO,MAAM,yBAAyB,OACpC,YACA,iBACG;AACH,MAAI,CAAC,cAAc,CAAC,cAAc;AAChC,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,WAAW,MAAMC,YAAU;AAAA,IAC/B,OAAO,EAAE,YAAY,aAAA;AAAA,IACrB,aAAa,GAAGL,KAAG;AAAA,EAAA,CACpB;AAED,SAAO;AACT;AAEO,MAAM,2BAA2B,OAAO,eAAuB;AACpE,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACtC;AAEA,QAAM,WAAW,MAAMM,cAAY;AAAA,IACjC,IAAI;AAAA,IACJ,aAAa,GAAGN,KAAG,iCAAiC,UAAU;AAAA,EAAA,CAC/D;AAED,SAAO;AACT;AAEO,MAAM,cAAc,OAAO,eAAuB;AACvD,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,oBAAoB;AAErDE,QAAI;AAAA,IACF,oEAAoE,UAAU;AAAA,EAAA;AAGhF,QAAM,WAAW,MAAMG,YAAU;AAAA,IAC/B,OAAO,CAAA;AAAA,IACP,aAAa,GAAGL,KAAG,4CAA4C,UAAU;AAAA,EAAA,CAC1E;AAED,SAAO;AACT;AChFA,MAAM,OAAEA,MAAA,IAAQ,kBAAkB,oBAAoB;AACtD,MAAM,EAAE,QAAA,WAAQK,aAAA,aAAWC,cAAA,IAAgB,eAAe,MAAM;AAAA,EAC9D,oBAAoB;AAAA,EACpB,UAAU,GAAGN,KAAG;AAClB,CAAC;AAED,MAAM,SAAS,OAAO;AAiBf,MAAM,iBAAiB,YAAY;AACxC,QAAM,WAAW,MAAM,OAAmB,EAAE,KAAK,QAAQ;AACzD,SAAO;AACT;AAaO,MAAM,mBAAmB,OAC9B,YACA,cACgC;AAChC,QAAM,cAAc,KAAK,UAAU,SAAS;AAC5C,QAAM,MAAM,GAAGA,KAAG;AAClB,MAAI;AACF,UAAM,WAAW,MAAMK,YAAU;AAAA,MAC/B,OAAO,EAAE,YAAY,YAAA;AAAA,MACrB,aAAa;AAAA,IAAA,CACd;AACD,QAAI,UAAU,WAAW,OAAO,UAAU,MAAM,OAAO;AACrD,aAAO,CAAC,SAAS,KAAK,SAAS,gBAAgB,SAAS,IAAI;AAAA,IAC9D;AAEA,WAAO,CAAC,QAAW,UAAU,IAAI;AAAA,EACnC,SAAS,OAAO;AACd,QAAI,iBAAiB,YAAY;AAC/B,aAAO;AAAA,QACL,MAAM,SAAS,MAAM,SAAS;AAAA,QAC9B,MAAM,SAAS;AAAA,MAAA;AAAA,IAEnB;AAAA,EACF;AACA,SAAO,CAAC,gBAAgB,MAAS;AACnC;AAEO,MAAM,gBAAgB,OAAO,eAA2B;AAC7D,QAAM,MAAM,SACR,GAAGL,KAAG,gCAAgC,WAAW,UAAU,KAC3D,GAAGA,KAAG;AACV,QAAM,WAAW,MAAMK,YAAU;AAAA,IAC/B,OAAO,EAAE,GAAG,YAAY,WAAW,IAAA;AAAA,IACnC,KAAK;AAAA,IACL,aAAa;AAAA,EAAA,CACd;AACD,SAAO;AACT;AAEO,MAAM,mBAAmB,OAAO,OAAe;AACpD,QAAM,WAAW,MAAMC,cAAY,EAAE,IAAI,KAAK,QAAQ;AACtD,SAAO;AACT;;;;;;;;;;;AC3CA,MAAMR,eAAa,kBAAkB;AAErC,MAAMI,QAAM,OAAO,aAAa,EAAE,MAAM,gBAAgB;AAWxD,iBAAiB,wBAAwB,EAAE;AAAA,EACzC;AAAA,EACA,OAAO,YAA6C;AAClD,UAAM,SAAmB,CAAA;AACzB,WAAO,KAAK,GAAG,QAAQ,KAAK,WAAW;AACvC,WAAO;AAAA,EACT;AACF;AAEA,iBAAiB,6BAA6B,EAAE;AAAA,EAC9C;AAAA,EACA,OAAO,YAA2C;AAGhD,QAAI,QAAQ,KAAK,UAAU;AACzB,YAAM,EAAE,OAAO,UAAA,IAAc;AAAA,QAC3B,QAAQ,KAAK;AAAA,MAAA;AAGf,UAAI,WAAW;AACb,cAAM,kBAAkB,UAAU,eAC9B,gBAAiC,UAAU,YAAY,EAAE,QACzD;AACJ,eAAO;AAAA,UACL,cAAc,UAAU;AAAA,UACxB,gBACE,iBAAiB,gBAAgB,iBAAiB,QAAQ;AAAA,UAC5D,eAAe,UAAU;AAAA,QAAA;AAAA,MAE7B;AAAA,IACF;AACA,WAAO,CAAA;AAAA,EACT;AACF;AAEA,iBAAiB,6BAA6B,EAAE;AAAA,EAC9C;AAAA,EACA,OAAO,YAA6C;AAClD,QAAI,QAAQ,KAAK,YAAY,SAAS,GAAG;AACvC,YAAM,aAAa,QAAQ,KAAK,YAAY,CAAC;AAC7C,aAAO;AAAA,QACL,YAAY,cAAc;AAAA,MAAA;AAAA,IAE9B;AACA,WAAO,CAAA;AAAA,EACT;AACF;AAEA,iBAAiB,6BAA6B,EAAE;AAAA,EAC9C;AAAA,EACA,OAAO,YAAgD;AACrD,QAAI,QAAQ,KAAK,YAAY,SAAS,GAAG;AACvC,YAAM,eAAe,QAAQ,KAAK,YAAY,CAAC;AAC/C,YAAM,EAAE,MAAA,IAAU,gBAAiC,YAAY;AAC/D,aAAO;AAAA,QACL,gBAAgB,OAAO,gBAAgB,OAAO,QAAQ;AAAA,QACtD,aAAa,QAAQ,KAAK,cAAc,QAAQ,KAAK,cAAc,CAAA;AAAA,QACnE,sBAAsB,QAAQ,KAAK,wBAAwB;AAAA,MAAA;AAAA,IAE/D;AACA,WAAO,CAAA;AAAA,EACT;AACF;AAEA,MAAM,wBAAwB,MAAM;AAAA,EAClC;AAAA,EACA,YAAY,MAA2B,SAAiB;AACtD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAWA,IAAM,kBAAN,MAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACU;AAAA,EAEV;AAAA,EAEA,YACE,SACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAEF,SACA;AACA,SAAK,KAAK;AACV,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,iBAAiB;AACtB,SAAK,mBAAmB;AACxB,SAAK,eAAe;AACpB,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,cAAc;AACnB,SAAK,OAAO;AACZ,SAAK,QAAQ,IAAI,kBAA6B;AAAA,MAC5C,UAAU;AAAA,MACV,SAAS;AAAA,IAAA,CACV;AACD,SAAK,aAAa,cAAc,CAAA;AAChC,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACsC;AAGtC,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,eAAe;AACpB,SAAK,iBAAiB;AACtB,SAAK,mBAAmB;AACxB,SAAK,cAAc;AACnB,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,IAAI,iBAAiB;AACnB,WAAO,CAAC,CAAC,KAAK,eAAe,CAAC,KAAK;AAAA,EACrC;AAAA,EACA,IAAI,oBAAoB;AACtB,WAAO,KAAK,eAAe,gBAAgB,GAAG,SAAS;AAAA,EACzD;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,KAAK,UAAU;AAAA,EACtD;AAAA,EAEA,MAAM,aAAa;AACjB,UAAM,QAAQ;AAAA,MACZ,KAAK,MAAM,KACR,OAAO,CAAC,SAAS,KAAK,SAAS,EAC/B,IAAI,CAAC,SAAS,KAAK,YAAY;AAAA,IAAA;AAAA,EAEtC;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,CAAC,KAAK,eAAe,KAAK,MAAM,KAAK,MAAM,CAAC,SAAS,KAAK,OAAO;AAAA,EAC1E;AAAA,EAEA,IAAI,YAAY;AACd,UAAM,aAAa,KAAK,MAAM,KAAK,KAAK,CAAC,SAAS,KAAK,SAAS;AAChE,SAAK,OAAO,MAAM,cAAc,CAAC,CAAC,UAAU,EAAE;AAC9C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,OAAyB;AAC3C,UAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,MAAM;AACzD,UAAM,WAAW,OAAO,UAAU,WAAW,SAAY,MAAM;AAC/D,UAAM,OAAO,WAAW,KAAK,MAAM,SAAS,QAAQ,IAAI,KAAK,MAAM,KAAK,CAAC;AACzE,WAAO,MAAM,cAAc,EAAE,QAAQ;AAAA,EACvC;AAAA,EAEA,IAAI,YAAY;AACd,UAAM,QAAQ,KAAK,MAAM,KAAK,OAAO,CAAC,eAAe,SAAS;AAC5D,UAAI,KAAK,cAAc;AACrB,eAAO,KAAK;AAAA,MACd;AACA,aAAO;AAAA,IACT,GAAG,EAAE;AACL,WAAO;AAAA,EACT;AAAA,EACA,IAAI,aAAa;AACf,WAAO,KAAK,MAAM,KAAK,CAAC,GAAG;AAAA,EAC7B;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,EAC9C;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,MAAM,KAAK,KAAK,CAAC,GAAG,MAAM;AACpC,UAAI,EAAE,WAAW,CAAC,EAAE,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,EAAE,WAAW,EAAE,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,aAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,aAA0C;AAC5C,QAAI,CAAC,KAAK,cAAc;AACtB,aAAO;AAAA,IACT;AACA,UAAM,aAAa,KAAK,qBAAqB,YAAY;AAAA,MACvD,KAAK;AAAA,IAAA;AAEP,WAAO;AAAA,EACT;AAAA,EACA,IAAI,iBAAyB;AAC3B,QAAI,KAAK,YAAY;AACnB,aAAO,KAAK,WAAW,eAAe,KAAK,WAAW;AAAA,IACxD,WAAW,KAAK,cAAc;AAE5B,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,IAAI,qBAAkD;AACpD,QAAI,CAAC,KAAK,kBAAkB;AAC1B,aAAO;AAAA,IACT;AACA,UAAM,aAAa,KAAK,qBAAqB,YAAY;AAAA,MACvD,KAAK;AAAA,IAAA;AAEP,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,yBAAiC;AACnC,QAAI,KAAK,oBAAoB;AAC3B,aACE,KAAK,mBAAmB,eAAe,KAAK,mBAAmB;AAAA,IAEnE,WAAW,KAAK,kBAAkB;AAEhC,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,IAAI,mBAAmB;AACrB,WAAO,KAAK,MAAM,OAAO,CAAC,GAAG;AAAA,EAC/B;AAAA,EAEA,IAAI,aAAa;AACf,YACG,CAAC,KAAK,gBAAgB,KAAK,iBAAiB,SAC5C,CAAC,KAAK,oBAAoB,KAAK,qBAAqB;AAAA,EAEzD;AAAA,EAEA,IAAI,UAAU;AACZ,YACG,CAAC,KAAK,gBAAgB,KAAK,iBAAiB,QAC7C,KAAK,qBAAqB,UAC1B,KAAK,qBAAqB;AAAA,EAE9B;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,MAAM,YAAY;AAAA,EAChC;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,KAAK,MAAM,gBAAgB;AAAA,EACpC;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,MAAM,aAAa;AAAA,EACjC;AAAA,EAEA,IAAI,qBAAqB;AACvB,WAAO,KAAK,MAAM,iBAAiB;AAAA,EACrC;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,mBAAmB,IAC3B,IACA,KAAK,OAAQ,KAAK,mBAAmB,MAAM,KAAK,aAAa,KAAM,GAAG;AAAA,EAC5E;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,gBAAgB,KAAK;AAAA,EACnC;AAAA,EAEA,iBAAiB,cAAuB;AACtC,QAAI,KAAK,iBAAiB,cAAc;AACtC;AAAA,IACF;AACA,cAAU,MAAM;AACd,WAAK,eAAe;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBAAoB,QAAgB;AACxC,UAAM,OAAO,KAAK,MAAM,KAAK,CAAC;AAC9B,QAAI,CAAC,MAAM;AACT,aAAO,EAAE,QAAQ,GAAA;AAAA,IACnB;AACA,WAAO,KAAK,oBAAoB,MAAM;AAAA,EACxC;AAAA,EAEA,MAAM,iBAAgD,WAAc;AAClE,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AACA,QAAI;AACF,YAAM,CAAC,OAAO,MAAM,IAAI,MAAM,iBAAiB,KAAK,MAAM,SAAS;AACnE,UAAI,OAAO;AACT,cAAM,IAAI;AAAA,UACR;AAAA,UACA,6CAA6C,KAAK,EAAE;AAAA,QAAA;AAAA,MAExD;AAEA,gBAAU,MAAM;AACd,aAAK,eAAe,QAAQ;AAAA,MAC9B,CAAC;AACD,aAAO;AAAA,IACT,SAAS,GAAG;AACVA,YAAI,MAAM,6CAA6C,KAAK,EAAE,IAAI,CAAC;AACnE,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,iBAAiB,cAAuB;AAC5C,QAAI;AACF,UAAI,cAAc;AAChB,cAAM,uBAAuB,KAAK,MAAM,YAAY;AAAA,MACtD,OAAO;AACL,cAAM,yBAAyB,KAAK,IAAI;AAAA,MAC1C;AACA,gBAAU,MAAM;AACd,aAAK,eAAe;AAAA,MACtB,CAAC;AAAA,IACH,SAAS,GAAG;AACVA,YAAI,MAAM,iDAAiD,KAAK,EAAE,IAAI,CAAC;AACvE,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAc;AAChB,WAAO,KAAK,SAAS,KAAK,CAAC,YAAY,QAAQ,WAAW;AAAA,EAC5D;AAAA,EACA,MAAM,cAAc;AAClB,UAAM,YAAY,KAAK,IAAI;AAE3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBF;AAlTYH,kBAAA;AAAA,EAAT;AAAA,GAfG,gBAeM,WAAA,SAAA,CAAA;AAEVA,kBAAA;AAAA,EADC,cAAc,EAAE,WAAW,oBAAoB,MAAM;AAAA,GAhBlD,gBAiBJ,WAAA,uBAAA,CAAA;AAjBI,kBAANA,kBAAA;AAAA,EAFC,SAASD,YAAU;AAAA,EACnB,gBAAA;AAAgB,GACX,eAAA;AAmVC,MAAM,SAET;AAAA,EACF,cAAc;AAAA,IACZ,CAACA,YAAU,GAAG;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,MAAMA;AAAAA,EACN,WAAW,WAAWA,YAAU;AAAA,EAChC,SAAS,IAAI,QAAQ,OAAmCA,YAAU;AACpE;ACneO,MAAM,2BAA2B,OAItC,OACA,eACG;AACH,QAAM,gBAAgB,iBAAiB,eAAe;AAAA,IACpD,cAAc;AAAA,IACd;AAAA,EAAA;AAEF,QAAM,OACJ,iBAAiB,eAAe;AAAA,IAC9B,cAAc;AAAA,IACd;AAAA,EAAA,KACG,WAAW;AAElB,QAAM,gBAAgB,MAAM,kBAAkB,2BAG5C;AAAA,IACA,WAAW,cAAc;AAAA,IACzB,MAAM;AAAA,IACN,aAAa,CAAA;AAAA,EAAC,CACf;AAED,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,IACD;AAEJ,QAAM,UAAU,EAAE,GAAG,MAAM,GAAG,cAAA;AAC9B,QAAM,YAAY,SAAS,EAAE,KAAK,EAAA;AAElC,QAAM,gBAA0C;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,cAAc,iBAAiB;AAAA,IAC/B,gBAAgB,QAAQ;AAAA,IACxB,kBAAkB;AAAA,IAClB,aAAa,WAAW,WAAW,cAC/B,IAAI,KAAK,WAAW,UAAU,WAAW,IACzC;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EAAA;AAER,QAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,EAAE,aAAa;AAE5D,SAAO;AACT;ACzDA,MAAM,OAAEE,MAAA,IAAQ,kBAAkB,kBAAkB;AACpD,MAAM,UAAEC,SAAA,IAAW,eAAe,MAAM;AAAA,EACtC,UAAU,GAAGD,KAAG;AAClB,CAAC;AAED,MAAM,MAAM,OAAO,aAAa;AAAA,EAC9B,MAAM;AAAA,EACN,OAAO;AACT,CAAC;AAMM,MAAM,cAAc,YAAY;AACrC,MAAI,MAAM,0BAA0B;AACpC,QAAM,WAAW,MAAMC,SAA6B,EAAE;AACtD,SAAO;AACT;;;;;;;;;;;ACNO,MAAMH,eAAa;AACnB,MAAM,qBAAqB;AAC3B,MAAM,uBAAuB;AAO7B,IAAM,sBAAN,MAAmD;AAAA,EACxD;AAAA,EACQ;AAAA,EACU;AAAA,EAClB,YACE,SACA,SACA,SACA;AACA,SAAK,KAAK;AACV,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,IAAI,kBAA8B;AAAA,MAC9C,UAAU;AAAA,MACV,aAAa,cAAc;AAAA,IAAA,CAC5B;AAAA,EAIH;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,cAAoB;AAAA,EAEpB;AAAA,EAEA,SAAS,OAAmB;AAC1B,SAAK,OAAO,SAAS,KAAK;AAAA,EAC5B;AAAA,EAEA,YAAY,IAAY;AACtB,SAAK,OAAO,YAAY,EAAE;AAAA,EAC5B;AAAA,EAEA,YAAY,gBAAgC;AAC1C,UAAM,UAAU,eAAe;AAC/B,UAAM,QAAQ,KAAK,OAAO,SAAS,OAAO;AAC1C,QAAI,CAAC,OAAO;AACV,WAAK,OAAO,KAAK,SAAS,OAAO,YAAY;AAC7C;AAAA,IACF;AACA,UAAM,YAAY,cAAc;AAAA,EAClC;AAAA,EASA,qBAAqB,gBAAgC;AACnD,SAAK,OAAO,MAAM,YAAY,kBAAkB,UAAU,cAAc,EAAE;AAE1E,QAAI,gBAAgB;AAClB,WAAK,YAAY,cAAc;AAAA,IACjC,OAAO;AACL,WAAK,OAAO,MAAM,+BAA+B;AAAA,IACnD;AAAA,EACF;AAAA,EAOA,uBAAuB,gBAAgC;AACrD,SAAK,OAAO;AAAA,MACV,YAAY,oBAAoB,UAAU,cAAc;AAAA,IAAA;AAG1D,QAAI,gBAAgB;AAClB,WAAK,YAAY,cAAc;AAAA,IACjC,OAAO;AACL,WAAK,OAAO,MAAM,+BAA+B;AAAA,IACnD;AAAA,EACF;AACF;AA5EoBC,kBAAA;AAAA,EAAjB;AAAA,GAHU,oBAGO,WAAA,UAAA,CAAA;AAkDlBA,kBAAA;AAAA,EALC,gBAAgB;AAAA,IACf,WAAW,oBAAoB;AAAA,IAC/B,OAAO;AAAA,IACP,WAAW;AAAA,EAAA,CACZ;AAAA,GApDU,oBAqDX,WAAA,wBAAA,CAAA;AAeAA,kBAAA;AAAA,EALC,gBAAgB;AAAA,IACf,WAAW,oBAAoB;AAAA,IAC/B,OAAO;AAAA,IACP,WAAW;AAAA,EAAA,CACZ;AAAA,GAnEU,oBAoEX,WAAA,0BAAA,CAAA;AApEW,sBAANA,kBAAA;AAAA,EADN,SAASD,YAAU;AAAA,GACP,mBAAA;ACtBN,MAAM,yBAAyB,OACpC,YACG;AACH,QAAM,YAAY,QAAQ,KAAK;AAC/B,QAAM,EAAE,MAAA,IAAU,gBAA4B,SAAS;AACvD,SAAO;AAAA,IACL,WAAW,OAAO,QAAQ;AAAA,EAAA;AAE9B;;;;;;;;;;;ACGA,MAAMA,eAAa,kBAAkB;AAI9B,IAAK,8BAAAS,eAAL;AACLA,aAAA,SAAA,IAAU;AACVA,aAAA,QAAA,IAAS;AACTA,aAAA,UAAA,IAAW;AAHD,SAAAA;AAAA,GAAA,aAAA,CAAA,CAAA;AAUZ,IAAM,yBAAN,MAA2D;AAAA,EACzD;AAAA,EACkB;AAAA,EAElB,YAAY,SAAiB,SAA+B;AAC1D,SAAK,KAAK;AACV,SAAK,QAAQ,IAAI,kBAA6B;AAAA,MAC5C,UAAU;AAAA,QACR,UAAU,CAAC,SAAS,KAAK;AAAA,QACzB,SAAS,CAAC,SAAS,KAAK;AAAA,QACxB,QAAQ;AAAA,MAAA;AAAA,MAEV,UAAU;AAAA,MACV,aAAa,cAAc;AAAA,IAAA,CAC5B;AAAA,EAIH;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAa;AACf,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,EAChD;AAAA,EAEA,SAAS,OAAkB;AACzB,SAAK,MAAM,SAAS,KAAK;AAAA,EAC3B;AAAA,EACA,YAAY,IAAY;AACtB,SAAK,MAAM,YAAY,EAAE;AAAA,EAC3B;AAAA,EAEA,SAAS,IAAY;AACnB,WAAO,KAAK,MAAM,SAAS,EAAE;AAAA,EAC/B;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,OAAO;AACT,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,cAAoB;AAAA,EAEpB;AAAA;AAAA,EAIA,MAAM,OAAsB;AAAA,EAAC;AAAA;AAG/B;AA3DoBR,kBAAA;AAAA,EAAjB;AAAA,GAFG,uBAEc,WAAA,SAAA,CAAA;AAFd,yBAANA,kBAAA;AAAA,EADC,SAASD,YAAU;AAAA,GACd,sBAAA;AA+EC,MAAM,gBAGT;AAAA,EACF,cAAc;AAAA,IACZ,CAACA,YAAU,GAAG;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,MAAMA;AAAAA,EACN,WAAW,WAAWA,YAAU;AAAA,EAChC,SAAS,IAAI,UAAU;AAAA,IACrBA;AAAAA,EAAA;AAEJ;ACpHO,MAAM,sBAAsB,OAAO,aAAqB;AAC7D,QAAM,SAAmB,CAAA;AACzB,QAAM,EAAE,MAAA,IAAU,MAAM,YAAuB,QAAQ;AACvD,MAAI,OAAO;AACT,WAAO,KAAK,MAAM,SAAS;AAC3B,WAAO,KAAK,MAAM,UAAU;AAC5B,WAAO,KAAK,MAAM,UAAU;AAAA,EAC9B;AACA,SAAO;AACT;AAEO,MAAM,sBAAsB,OACjC,YACG;AACH,QAAM,SAAmB,CAAA;AACzB,QAAM,WAAW,QAAQ,KAAK;AAC9B,SAAO,KAAK,QAAQ;AACpB,QAAM,eAAe,MAAM,oBAAoB,QAAQ;AACvD,SAAO,CAAC,GAAG,QAAQ,GAAG,YAAY;AACpC;ACfO,MAAM,uBAAuB,OAClC,YACG;AACH,QAAM,SAAmB,CAAA;AACzB,QAAM,YAAY,QAAQ,KAAK;AAC/B,SAAO,KAAK,QAAQ,KAAK,SAAS;AAClC,QAAM,gBAAgB,MAAM;AAAA,IAC1B,cAAc;AAAA,EAAA;AAEhB,MAAI,eAAe,OAAO;AACxB,UAAM,aAAa,cAAc,MAAM,OAAO;AAAA,MAC5C,UAAU;AAAA,MACV;AAAA,IAAA;AAGF,UAAM,eAAe,WAAW;AAAA,MAAI,CAAC,SACnC,oBAAoB,KAAK,IAAI;AAAA,IAAA;AAE/B,UAAM,cAAc,MAAM,QAAQ,WAAW,YAAY;AACzD,gBAAY,QAAQ,CAAC,MAAM;AACzB,UAAI,EAAE,WAAW,aAAa;AAC3B,UAAE,MAAmB,QAAQ,CAAC,SAAS,OAAO,KAAK,IAAI,CAAC;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AACnC;;;;;;;;;ACxBO,MAAMA,eAAa;AAC1B,MAAM,oBAAoB,CACxB,SACA,UACG;AACH,QAAM,EAAE,MAAM,MAAM,MAAM,QAAQ,YAAY,MAAM,GAAG,KAAA,IAAS;AAChE,QAAM,OAAO;AACb,QAAM,OAAO;AACb,QAAM,OAAO;AACb,QAAM,SAAS;AACf,QAAM,OAAO,OAAO,OAAO,IAAI;AAC/B,QAAM,aAAa;AACnB,SAAO,OAAO,OAAO,IAAI;AAC3B;AAEA,iBAAiB,wBAAwB,EAAE;AAAA,EACzC;AAAA,EACA;AACF;AAEA,iBAAiB,6BAA6B,EAAE;AAAA,EAC9C;AAAA,EACA;AACF;AAMO,IAAM,iBAAN,MAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACR,YACE,SACA,SACA,SACA;AACA,SAAK,KAAK;AAEV,SAAK,SAAS,QAAQ;AACtB,sBAAkB,SAAS,IAAI;AAAA,EACjC;AAAA,EAEA,YAAY,SAA6B;AACvC,sBAAkB,SAAS,IAAI;AAAA,EACjC;AAAA;AAAA,EAIA,MAAM,OAAsB;AAC1B,SAAK,OAAO,MAAM,sBAAsB,KAAK,EAAE,EAAE;AAAA,EACnD;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,OAAO,MAAM,iBAAiB,KAAK,EAAE,EAAE;AAAA,EAC9C;AACF;AAlCa,iBAANC,kBAAA;AAAA,EADN,SAASD,YAAU;AAAA,GACP,cAAA;ACvBN,MAAM,QAET;AAAA,EACF,cAAc;AAAA,IACZ,CAACA,YAAU,GAAG;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,MAAMA;AAAAA,EACN,WAAW,WAAWA,YAAU;AAAA,EAChC,SAAS,IAAI,QAAQ,OAAiCA,YAAU;AAClE;ACXO,MAAM,iBAET;AAAA,EACF,cAAc;AAAA,IACZ,CAACA,YAAU,GAAG;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,IAEb,GAAG,MAAM;AAAA,EAAA;AAAA,EAEX,MAAMA;AAAAA,EACN,WAAW,WAAWA,YAAU;AAAA,EAChC,SAAS,IAAI,UAAU;AAAA,IACrBA;AAAAA,EAAA;AAEJ;;;;;;;;;;;ACXA,MAAMA,eAAa,kBAAkB;AACrC,MAAM,qBAAqB;AAC3B,MAAM,wBAAwB;AAC9B,MAAM,sBAAsB;AAC5B,MAAM,eAAe;AACrB,MAAM,qBAAqB;AAC3B,MAAM,uBAAuB;AAS7B,IAAM,2BAAN,MAA+D;AAAA,EAC7D;AAAA,EACU;AAAA,EAEF;AAAA,EACR,YACE,SACA,UACA,SACA;AACA,SAAK,KAAK;AACV,SAAK,UAAU,IAAI,kBAA+B;AAAA,MAChD,UAAU;AAAA,QACR,QAAQ,CAAC,WAAW,OAAO;AAAA,QAC3B,OAAO;AAAA,MAAA;AAAA,MAET,UAAU;AAAA,MACV,aAAa,cAAc;AAAA,IAAA,CAC5B;AACD,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,cAAoB;AAAA,EAEpB;AAAA,EAUA,mBAAmB,OAAwB;AACzC,WAAO;AAAA,MAAQ,MACb,KAAK,OAAO,MAAM,gCAAgC,KAAK,UAAU,KAAK,CAAC;AAAA,IAAA;AAEzE,UAAM,SAAS,KAAK,QAAQ,SAAS,MAAM,IAAI;AAE/C,QAAI,QAAQ;AACV,WAAK,OAAO;AAAA,QACV,oCAAoC,OAAO,IAAI;AAAA,MAAA;AAEjD,aAAO,MAAM,eAAe,MAAM,OAAO;AACzC,aAAO,MAAM,WAAW,MAAM,OAAO;AACrC,UAAI,OAAO,WAAW,aAAa;AACjC,eAAO,cAAc,IAAI,KAAK,MAAM,UAAU,WAAW;AAAA,MAC3D,OAAO;AACL,eAAO,cAAc;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAWA,gBAAgB,MAAwB;AACtC,WAAO;AAAA,MAAQ,MACb,KAAK,OAAO,MAAM,4BAA4B,KAAK,UAAU,IAAI,CAAC;AAAA,IAAA;AAEpE,UAAM,cAAc,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACtD,gBAAY,QAAQ,CAAC,UAAU;AAC7B,gBAAU,MAAM;AACd,cAAM,eAAe,MAAM;AAC3B,cAAM,SAAS,KAAK,QAAQ,SAAS,MAAM,IAAI;AAC/C,YAAI,QAAQ;AACV,eAAK,OAAO;AAAA,YACV,uCAAuC,OAAO,IAAI;AAAA,UAAA;AAEpD,iBAAO,iBAAiB,YAAY;AAGpC,iBAAO,MAAM,eAAe,MAAM,OAAO;AACzC,iBAAO,MAAM,WAAW,MAAM,OAAO;AACrC,cAAI,OAAO,WAAW,aAAa;AACjC,mBAAO,cAAc,IAAI,KAAK,MAAM,UAAU,WAAW;AAAA,UAC3D,OAAO;AACL,mBAAO,cAAc;AAAA,UACvB;AAEA,gBAAM,MAAM,QAAQ,CAAC,SAAS;AAC5B,sBAAU,MAAM;AACd,oBAAM,YAAY,OAAO,MAAM,SAAS,KAAK,IAAI;AACjD,kBAAI,WAAW;AACb,0BAAU,eAAe,KAAK;AAC9B,0BAAU,WAAW,KAAK;AAC1B,0BAAU,mBAAmB,KAAK;AAAA,cACpC;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAGF;AArGYC,kBAAA;AAAA,EAAT;AAAA,GAFG,yBAEM,WAAA,WAAA,CAAA;AAgCVA,kBAAA;AAAA,EANC,gBAAgB;AAAA,IACf,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW,CAAC,OAAwB,UAClC,MAAM,QAAQ,SAAS,MAAM,IAAI,MAAM;AAAA,EAAA,CAC1C;AAAA,GAjCG,yBAkCJ,WAAA,sBAAA,CAAA;AA6BAA,kBAAA;AAAA,EAVC,gBAAgB;AAAA,IACf,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,WAAW;AAAA,EAAA,CACZ;AAAA,GA9DG,yBA+DJ,WAAA,mBAAA,CAAA;AA/DI,2BAANA,kBAAA;AAAA,EADC,SAASD,YAAU;AAAA,GACd,wBAAA;AAyHC,MAAM,kBAGT;AAAA,EACF,cAAc;AAAA,IACZ,CAACA,YAAU,GAAG;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,MAAMA;AAAAA,EACN,WAAW,WAAWA,YAAU;AAAA,EAChC,SAAS,IAAI,UAAU;AAAA,IACrBA;AAAAA,EAAA;AAEJ;AC5KA,MAAMU,WAAS,OAAO,aAAa,EAAE,MAAM,eAAe;AACnD,MAAM,0BAA0B,OAIrC,UACG;AACH,QAAM,eAAe,MAAM,kBAAkB,2BAG3C;AAAA,IACA,WAAW,cAAc;AAAA,IACzB,MAAM;AAAA,IACN,aAAa,CAAA;AAAA,EAAC,CACf;AACD,QAAM,EAAE,MAAM,MAAM,MAAM,QAAQ,YAAY,GAAG,SAAS;AAC1D,QAAM,UAAU,EAAE,GAAG,MAAM,GAAG,aAAA;AAC9B,QAAM,UAAkC;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA;AAGL,QAAM,aAAa,MAAM,QAAQ,MAAM,IAAI,EAAE,OAAO;AAEpD,aAAW,YAAY,OAAO;AAE9B,SAAO;AACT;AAEO,MAAM,mBACX,CAAC,mBAAwC,OAAO,UAAyB;AACvEA,WAAO,MAAM,gBAAgB,MAAM,IAAI,EAAE;AACzC,QAAM,aAAa,MAAM,wBAAwB,KAAK;AACtD,iBAAe,SAAS,UAAU;AACpC;AC3CK,IAAK,8BAAAC,eAAL;AACLA,aAAA,MAAA,IAAO;AACPA,aAAA,SAAA,IAAU;AACVA,aAAA,eAAA,IAAgB;AAChBA,aAAA,gBAAA,IAAiB;AAJP,SAAAA;AAAA,GAAA,aAAA,CAAA,CAAA;ACOZ,MAAM,OAAET,MAAA,IAAQ,kBAAkB,cAAc;AAChD,MAAM,EAAA,WAAEK,aAAA,QAAWJ,aAAW,eAAe,MAAM;AAAA,EACjD,UAAU,GAAGD,KAAG;AAClB,CAAC;AA0BM,MAAM,aAAa,OAAO;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,QAAM,MAAM,GAAGA,KAAG,4DAA4D,MAAM,IAAI,MAAM;AAC9F,QAAM,WACJ,MAAMK,YAAU,EAAE,OAAO,CAAA,GAAI,aAAa,KAAK,SAAS;AAC1D,MAAI,UAAU,MAAM;AAClB,kBAAc,eAAe,SAAS,IAAI;AAAA,EAC5C;AACA,SAAO;AACT;AAEO,MAAM,kBAAkB,OAAO,QAAgB,WAAmB;AACvE,QAAM,MAAM,GAAGL,KAAG,8DAA8D,MAAM,IAAI,MAAM;AAChG,QAAM,WACJ,MAAMC,SAAO,EAAE,aAAa,KAAK;AACnC,MAAI,CAAC,UAAU,MAAM;AACnB,WAAO,EAAE,QAAQ,GAAA;AAAA,EACnB;AACA,SAAO,SAAS;AAClB;;;;;;;;;;;AC9BA,MAAMH,eAAa,kBAAkB;AAErC,iBAAiB,wBAAwB,EAAE;AAAA,EACzC;AAAA,EACA;AACF;AAUA,IAAM,gBAAN,MAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,EAEA;AAAA,EACA,eAA0B,UAAU;AAAA,EACpC,YAAY,SAAiB,SAAsC;AACjE,SAAK,KAAK;AACV,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IAAA,IACD;AACJ,SAAK,WAAW;AAEhB,SAAK,OAAO,QAAQ;AACpB,SAAK,eAAe,QAAQ;AAC5B,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,SAAK,aAAa;AAClB,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,YAAY,CAAC,CAAC;AACnB,SAAK,UAAU,CAAC,CAAC;AACjB,SAAK,mBAAmB;AACxB,SAAK,QAAQ;AACb,WAAO,OAAO,MAAM,IAAI;AACxB,SAAK,gBAAgB,IAAI,cAAc,IAAI;AAAA,EAC7C;AAAA,EAEA,YAAY,SAA4C;AACtD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IAAA,IACD;AACJ,SAAK,WAAW;AAChB,SAAK,OAAO,QAAQ;AACpB,SAAK,eAAe,QAAQ;AAC5B,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,SAAK,aAAa;AAGlB,SAAK,YAAY,KAAK,YAAY,KAAK,YAAY,CAAC,CAAC;AACrD,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,mBAAmB,QAAQ;AAChC,WAAO,OAAO,MAAM,IAAI;AAAA,EAC1B;AAAA;AAAA,EAIA,IAAI,eAAe;AACjB,WAAO,KAAK,QAAQ,YAAY;AAAA,EAClC;AAAA,EACA,IAAI,YAAY;AACd,WACE,CAAC,EAAE,KAAK,UAAU,CAAC,KAAK,QAAQ,aAChC,KAAK,iBAAiB,UAAU,iBAChC,KAAK,iBAAiB,UAAU;AAAA,EAEpC;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,CAAC,CAAC,KAAK,gBAAgB,CAAC,KAAK;AAAA,EACtC;AAAA,EAEA,eAAe,QAAsB;AACnC,QAAI,OAAO,UAAU;AACnB,gBAAU,MAAM;AACd,aAAK,eAAe,UAAU;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,aAAa;AACjB,QACE,KAAK,iBAAiB,UAAU,WAChC,KAAK,iBAAiB,UAAU,eAChC;AACA,WAAK,eAAe,UAAU;AAC9B,YAAM,KAAK,QAAQ,aAAA;AACnB,gBAAU,MAAM;AACd,aAAK,eAAe,UAAU;AAAA,MAChC,CAAC;AAAA,IACH,OAAO;AACL,aAAO,KAAK,+BAA+B,KAAK,YAAY,EAAE;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAEA,MAAM,oBAAoB,QAAgB;AACxC,WAAO,MAAM,gBAAgB,KAAK,MAAM,MAAM;AAAA,EAChD;AAAA,EAGA,MAAM,cAAc,OAAyB,SAAkB;AAC7D,UAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,MAAM;AACzD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AAEA,QAAI;AACF,UAAI,KAAK,iBAAiB,UAAU,MAAM;AACxC,aAAK,eAAe,UAAU;AAC9B,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI,MAAM,qBAAqB;AAAA,QACvC;AAEA,cAAM,SAAS,MAAM,WAAW;AAAA,UAC9B;AAAA,UACA;AAAA,UACA,QAAQ,KAAK;AAAA,QAAA,CACd;AACD,YAAI,KAAK,iBAAiB,UAAU,eAAe;AACjD,oBAAU,MAAM;AACd,iBAAK,eAAe,UAAU;AAAA,UAChC,CAAC;AAAA,QACH;AACA,eAAO,QAAQ;AAAA,MACjB,OAAO;AACL,cAAM,IAAI,MAAM,wBAAwB,KAAK,YAAY,EAAE;AAAA,MAC7D;AAAA,IACF,SAAS,GAAG;AACV,aAAO,MAAM,CAAC;AACd,WAAK,eAAe,UAAU;AAC9B,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAGF;AAnCQC,kBAAA;AAAA,EADL,UAAA;AAAU,GAhIP,cAiIE,WAAA,iBAAA,CAAA;AAjIF,gBAANA,kBAAA;AAAA,EADC,SAASD,YAAU;AAAA,GACd,aAAA;AAsLC,MAAM,OACX;AAAA,EACE,cAAc;AAAA,IACZ,CAACA,YAAU,GAAG;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,MAAMA;AAAAA,EACN,WAAW,WAAWA,YAAU;AAAA,EAChC,SAAS,IAAI,QAAQ,OAA+BA,YAAU;AAChE;ACvOF,MAAM,SAAS,OAAO,aAAa,EAAE,MAAM,cAAc;AAClD,MAAM,yBAAyB,CACpC,YACA,SACG;AACH,QAAM,WAAW,KAAK,SAAS,CAAA,GAAI,SAAS;AAC5C,QAAM,UAAuB;AAAA,IAC3B,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,IACjB,cAAc,KAAK;AAAA,IACnB,WAAW,CAAC,CAAC,KAAK;AAAA,IAClB;AAAA,IACA,UAAU,KAAK;AAAA,IACf,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX;AAAA,IACA,kBAAkB,KAAK;AAAA,IACvB,OAAO,KAAK;AAAA,EAAA;AAEd,QAAM,YAAY,KAAK,QAAQ,KAAK,IAAI,EAAE,OAAO;AAEjD,YAAU,YAAY,OAAO;AAE7B,SAAO;AACT;AAEO,MAAM,kBACX,CAAC,kBACD,CAAC,oBACD,CAAC,WACD,CAAC,iBAA+B;AAC9B,MAAI;AACF,WAAO,MAAM,eAAe,aAAa,IAAI,EAAE;AAC/C,UAAM,OAAO,uBAAuB,OAAO,MAAM,YAAY;AAC7D,kBAAc,SAAS,IAAI;AAC3B,UAAM,aAAa,KAAK;AACxB,UAAM,SAAS,gBAAgB,QAAQ,SAAS,UAAU;AAC1D,YAAQ,MAAM,SAAS,IAAI;AAC3B,QAAI,CAAC,QAAQ,YAAY,SAAS,OAAO,IAAI,GAAG;AAC9C,cAAQ,YAAY,KAAK,OAAO,IAAI;AAAA,IACtC;AAEA,kBAAc,OAAO,QAAQ,CAAC,YAAY;AACxC,YAAM,gBAAgB,KAAK;AAC3B,YAAM,cAAc;AAAA,QAClB,GAAG;AAAA,QACH,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,cAAc,KAAK;AAAA,MAAA;AAErB,sBAAgB,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW;AAAA,IACrE,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,MAAM,gCAAgC,KAAK,EAAE;AACpD,UAAM;AAAA,EACR;AACF;;;;;;;;;;;ACvBK,MAAMA,eAAa;AACnB,MAAM,wBAAwB;AAC9B,MAAM,4BAA4B;AAMlC,IAAM,oBAAN,MAIP;AAAA,EACE;AAAA,EACQ,mCAAmB,IAAA;AAAA,EAInB;AAAA,EAEU;AAAA,EACA;AAAA,EACA;AAAA,EAClB;AAAA,EACA,YACE,SACA,UACA,SACA;AACA,SAAK,KAAK;AACV,SAAK,kBAAkB,gBAAgB,QAAQ,CAAA,CAAE;AACjD,SAAK,iBAAiB,eAAe,QAAQ,CAAA,CAAE;AAC/C,SAAK,gBAAgB,cAAc,QAAQ,CAAA,CAAE;AAC7C,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,YAAY,UAAiC;AAAA,EAE7C;AAAA,EAEA,IAAI,aAAuC;AACzC,WAAO,KAAK,gBAAgB,QAAQ;AAAA,EACtC;AAAA,EAEA,IAAI,eAAyB;AAC3B,WAAO,KAAK,gBAAgB,QAAQ,aAAa,OAAO;AAAA,EAC1D;AAAA,EAEA,IAAI,cAAwB;AAC1B,WAAO,MAAM,KAAK,KAAK,YAAY;AAAA,EACrC;AAAA,EACA,kBAAkB,OAAyC;AACzD,WAAO,KAAK,gBAAgB,QAAQ,cAAc,SAAS,KAAK;AAAA,EAClE;AAAA,EAEA,mBAAmB,YAA8C;AAC/D,WAAO,KAAK,gBAAgB,QAAQ,cAAc,UAAU,UAAU;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,gBAAkD;AACpD,WAAO,KAAK,cAAc,OAAO,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAsB;AACxB,WAAO,KAAK,cAAc,OAAO,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,EAC/D;AAAA,EAEA,IAAI,SAA4B;AAC9B,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA;AAAA,EAIA,MAAM,OAAsB;AAC1B,SAAK,OAAO,MAAM,yBAAyB,KAAK,EAAE,EAAE;AAAA,EACtD;AAAA,EAEA,MAAM,QAAQ;AACZ,SAAK,kBAAkB,SAAS,UAAA;AAChC,qBAAiB,+BAA+B,EAAE;AAAA,MAChD,cAAc;AAAA,MACd;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,KAAK,SAAoC;AAC7C,SAAK,OAAO,MAAM,oBAAoB,KAAK,EAAE,EAAE;AAE/C,UAAM,SAAS,MAAM,YAAA;AACrB,QAAI,QAAQ,WAAW,KAAK;AAC1B,YAAM,OAAO,MAAM,kBAAkB,2BAGnC;AAAA,QACA,WAAW,cAAc;AAAA,QACzB,MAAM,OAAO;AAAA,QACb,aAAa,CAAA;AAAA,MAAC,CACf;AAED,cAAQ,IAAI,uBAAuB,IAAI;AAGvC,aAAO,OAAO,MAAM,IAAI;AAIxB,aAAO,QAAQ,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC7C,YAAI,eAAe,KAAK,GAAG;AACzB,eAAK,OAAO,MAAM,sBAAsB,GAAG,sBAAsB;AACjE,eAAK,WAAW,EAAE,GAAG,IAAI;AAAA,QAC3B;AAAA,MACF,CAAC;AAED,cAAQ,IAAI,2BAA2B,OAAO,IAAI;AAElD,uBAAiB,YAAY,OAAO,KAAK,YAAY;AACnD,cAAM;AAAA,UACJ,SAAS,CAAA;AAAA,UACT,SAAS,kBAAkB,CAAA;AAAA,UAC3B,UAAU,CAAA;AAAA,UACV,MAAM;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN,GAAG;AAAA,QAAA,IACD;AAEJ,aAAK,OAAO,MAAM,mBAAmB,IAAI,EAAE;AAE3C,aAAK,OAAO,KAAK,uBAAuB,OAAO,KAAK,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AACtE,eAAO,KAAK,IAAI,EAAE,QAAQ,CAAC,QAAQ;AACjC,eAAK,OAAO,KAAK,0BAA0B,GAAG,EAAE;AAChD,0BAAgB,cAAc,GAAG;AACjC,kBAAQ,IAAI,oBAAoB,GAAG,IAAI,KAAK,GAAG,CAAC;AAChD,cAAI,KAAK,GAAG,EAAE,OAAO,IAAI,MAAM,MAAM,QAAW;AAC9C,kBAAM,YAAY,KAAK,GAAG,EAAE,OAAO,EAAE,MAAM;AAC3C,iBAAK,OAAO,KAAK,gBAAgB,GAAG,gBAAgB,SAAS,EAAE;AAC/D,oBAAQ,IAAI,uBAAuB,GAAG,IAAI,SAAS;AAAA,UACrD;AAAA,QACF,CAAC;AAGD,yBAAiB,SAAS,QAAQ;AAChC,eAAK,OAAO,MAAM,gBAAgB,MAAM,IAAI,EAAE;AAC9C,gBAAM,SAAS,iBAAiB,KAAK,cAAc;AACnD,gBAAM,OAAO,KAAK;AAAA,QACpB;AAGA,yBAAiB,CAAC,OAAO,OAAO,KAAK,OAAO;AAAA,UAC1C,mBAAmB,CAAA;AAAA,QAAC,GACnB;AACD,2BAAiB,UAAU,SAAS;AAClC,iBAAK,OAAO,MAAM,iBAAiB,OAAO,IAAI,EAAE;AAChD,kBAAM,cAAc,MAAM,yBAAyB,OAAO,MAAM;AAChE,iBAAK,gBAAgB,QAAQ,SAAS,WAAW;AAAA,UACnD;AAAA,QACF;AAGA,cAAM,gBAAgB,gBAAgB,KAAK,aAAa;AAAA,UACtD,KAAK;AAAA,QAAA;AAEP,gBAAQ,QAAQ,CAAC,WAAW;AAC1B,eAAK,aAAa,IAAI,OAAO,IAAI;AACjC,gBAAM,UAAU,cAAc,MAAM;AACpC,iBAAO,MAAM,QAAQ,OAAO;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAjKUC,kBAAA;AAAA,EAHP,cAAc;AAAA,IACb,WAAW;AAAA,EAAA,CACZ;AAAA,GATU,kBAUH,WAAA,oBAAA,CAAA;AAEUA,kBAAA;AAAA,EAAjB;AAAA,GAZU,kBAYO,WAAA,mBAAA,CAAA;AACAA,kBAAA;AAAA,EAAjB;AAAA,GAbU,kBAaO,WAAA,kBAAA,CAAA;AACAA,kBAAA;AAAA,EAAjB;AAAA,GAdU,kBAcO,WAAA,iBAAA,CAAA;AAdP,oBAANA,kBAAA;AAAA,EADN,SAASD,YAAU;AAAA,GACP,iBAAA;AC1BN,MAAM,WAET;AAAA,EACF,cAAc;AAAA,IACZ,CAACA,YAAU,GAAG;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,MAAMA;AAAAA,EACN,WAAW,WAAWA,YAAU;AAAA,EAChC,SAAS,IAAI,UAAU,OAAuCA,YAAU;AAC1E;;;;;;;;;ACrBA,MAAMA,eAAa,kBAAkB;AAQrC,IAAM,wBAAN,MAIA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YACE,SACA,SACA,SACA;AACA,SAAK,KAAK;AACV,SAAK,YAAY,QAAQ,aAAa,CAAA;AACtC,SAAK,SAAS,QAAQ;AACtB,SAAK,YAAY,QAAQ;AACzB,SAAK,UAAU,QAAQ;AACvB,SAAK,UAAU,QAAQ;AACvB,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,QAAQ;AACrB,SAAK,OAAO,QAAQ;AACpB,SAAK,WAAW,QAAQ;AACxB,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,QAAQ;AACpB,SAAK,aAAa,QAAQ,cAAe,CAAA;AAAA,EAC3C;AAAA,EAEA,YAAY,SAAoC;AAC9C,SAAK,YAAY,QAAQ,aAAa,CAAA;AACtC,SAAK,YAAY,QAAQ;AACzB,SAAK,UAAU,QAAQ;AACvB,SAAK,UAAU,QAAQ;AACvB,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,QAAQ;AACrB,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,QAAQ;AAAA,EACtB;AAAA,EAEA,mBAAmB,WAA0B;AAC3C,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAKF;AAxDM,wBAANC,kBAAA;AAAA,EAPC,eAAA;AAAA,EAKA,SAASD,YAAU;AAAA,GAEd,qBAAA;AA4EC,MAAM,eAET;AAAA,EACF,cAAc;AAAA,IACZ,CAACA,YAAU,GAAG;AAAA,MACZ,OAAO;AAAA,MAEP,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAGF,MAAMA;AAAAA,EACN,WAAW,WAAWA,YAAU;AAAA,EAEhC,SAAS,IAAI,QAAQ;AAAA,IACnBA;AAAAA,EAAA;AAEJ;AC5GA,MAAM,OAAEE,MAAA,IAAQ,kBAAkB,gBAAgB;AAClD,MAAM,EAAA,WAAEK,aAAW,aAAa,OAAA,IAAW,eAAe,MAAM;AAAA,EAC9D,UAAU,GAAGL,KAAG;AAClB,CAAC;AAkFM,MAAM,eAAe,OAAO,UAAkB,YAAoB;AACvE,QAAM,WAAW,MAAMK,YAAe;AAAA,IACpC,OAAO,CAAA;AAAA,IACP,aAAa,GAAGL,KAAG,4BAA4B,QAAQ;AAAA,IACvD,SAAS;AAAA,IACT;AAAA,EAAA,CACD;AACD,MAAI,UAAU,MAAM;AAClB,kBAAc,eAAe,SAAS,IAAI;AAAA,EAC5C;AACA,SAAO;AACT;AAkBO,MAAM,oBAAoB,OAC/B,MACA,UACA,YACG;AACH,QAAM,WAAW,MAAMK,YAAe;AAAA,IACpC,OAAO,CAAA;AAAA,IACP,aAAa,GAAGL,KAAG,4BAA4B,QAAQ,4BAA4B,IAAI;AAAA,IACvF,SAAS;AAAA,IACT;AAAA,EAAA,CACD;AACD,MAAI,UAAU,MAAM;AAClB,kBAAc,eAAe,SAAS,IAAI;AAAA,EAC5C;AACA,SAAO;AACT;AAWO,MAAM,kBAAkB,OAAO,cAAsB;AAC1D,QAAM,WAAW,MAAM,OAA6B;AAAA,IAClD,aAAa,GAAGA,KAAG,GAAG,SAAS;AAAA,EAAA,CAChC;AACD,SAAO;AACT;AAoBO,MAAM,iBAAiB,OAAO,UAAkB,YAAoB;AACzE,QAAM,WAAW,MAAMK,YAAU;AAAA,IAC/B,OAAO;AAAA,IACP,aAAa,GAAGL,KAAG,4BAA4B,QAAQ;AAAA,EAAA,CACxD;AACD,SAAO;AACT;AAUO,MAAM,gBAAgB,OAAO,aAAqB;AACvD,QAAM,WAAW,MAAM,YAAY;AAAA,IACjC,IAAI;AAAA,IACJ,aAAa,GAAGA,KAAG,4BAA4B,QAAQ;AAAA,EAAA,CACxD;AAED,SAAO;AACT;;;;;;;;;;;ACnIA,MAAMF,eAAa,kBAAkB;AAErC,MAAM,6BAA6B;AAAA,EACjC;AACF;AAEA,MAAMY,gBAAc,CAAC,UACnB,MAAM,gBAAgB,UACtB,MAAM,iBAAiB,UACvB,MAAM,mBAAmB;AAEpB,MAAM,4BAA4B;AAClC,MAAM,6BAA6B;AACnC,MAAM,2BAA2B;AAmExC,IAAM,kBAAN,MAAmD;AAAA;AAAA,EAEjD;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACU;AAAA,EAClB;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,YAAY;AACd,WAAO,KAAK,mBAAmB,cAAc,WAAW,WAAW;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAS;AACX,WAAO,KAAK,mBAAmB,cAAc,WAAW,QAAQ;AAAA,EAClE;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAK,OAAO,OAAO,CAAC,UAAU,MAAM,OAAO;AAAA,EACpD;AAAA,EAEA,IAAI,mBAAmB;AACrB,WAAO,KAAK,UAAU,OAAO,CAAC,aAAa,SAAS,OAAO;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,YAAY;AACd,WACE,CAAC,EACC,KAAK,cAAc,eACnB,CAAC,KAAK,cAAc,UAAA,GAAa,aAEnC,KAAK,iBAAiB,UAAU,iBAChC,KAAK,iBAAiB,UAAU,WAChC,KAAK,iBAAiB,UAAU;AAAA,EAEpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAAI,UAAU;AACZ,WACE,CAAC,CAAC,KAAK,qBACP,KAAK,kBAAkB,aACvB,KAAK,iBAAiB,UAAU;AAAA,EAEpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,mBAAmB;AACrB,WAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,IAAA;AAAA,EAErB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,cAAc,UAAA;AAAA,EAC5B;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,QAAQ,YAAY;AAAA,EAClC;AAAA,EAEA,YAAY,SAAiB,SAAwB;AACnD,SAAK,KAAK;AACV,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,QAAQ;AACpB,SAAK,sBAAsB,QAAQ;AACnC,SAAK,cAAc,QAAQ;AAC3B,SAAK,YAAY,QAAQ;AACzB,SAAK,oBAAoB;AACzB,SAAK,iBAAiB;AACtB,SAAK,mBAAmB,CAAA;AACxB,SAAK,gBAAgB,IAAI,sBAAsB,IAAI;AACnD,SAAK,qBAAqB,IAAI,kBAAqC;AAAA,MACjE,UAAU;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,MAAA;AAAA,MAEZ,UAAU;AAAA,IAAA,CACX;AAAA,EACH;AAAA,EAEA,cAAoB;AAAA,EAEpB;AAAA;AAAA,EAIA,iBAAiB,OAA2B,UAAgC;AAC1E,QAAI,UAAU;AACZ,WAAK,OAAO,MAAM,sDAAsD;AAAA,IAC1E;AAEA,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBACJ,EAAE,UAAU,YAAY,QAAA,GACxB,cAAc,OACC;AACf,QAAI,CAAC,UAAU;AACb,YAAMC,YAAW,MAAM,cAAc,KAAK,IAAI;AAC9C,UAAIA,WAAU,WAAW,KAAK;AAC5B,cAAM,IAAI,MAAM,0BAA0B;AAAA,MAC5C;AACA,WAAK,oBAAoB;AACzB;AAAA,IACF;AACA,QACE,CAAC,eACD,aAAa,KAAK,qBAClB,YAAY,KAAK,kBAAkB,UAAU,GAC7C;AACA,WAAK,OAAO,KAAK,gCAAgC;AACjD;AAAA,IACF;AACA,SAAK,oBAAoB;AACzB,SAAK,mBAAmB;AAExB,QAAI;AACJ,QAAI;AACF,wBAAkB,MAAM,iBAAiB,WAAW;AAAA,QAClD,cAAc;AAAA,QACd;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,IAEJ,SAAS,GAAG;AACV,WAAK,OAAO;AAAA,QACV,mFAAmF,CAAC;AAAA,MAAA;AAEtF,wBAAkB;AAAA,IACpB;AAEA,UAAM,iBAAiB;AAAA,MACrB,OAAO,SAAS;AAAA,IAAA;AAElB,QAAI,CAAC,mBAAmB,OAAO,KAAK,eAAe,EAAE,WAAW,GAAG;AACjE,WAAK,OAAO;AAAA,QACV,kEAAkE,cAAc;AAAA,MAAA;AAElF,wBAAkB;AAAA,IACpB;AACA,UAAM,UAAU,mBAAmB;AAEnC,UAAM,WAAW,MAAM,eAAe,KAAK,MAAM,OAAO;AACxD,QAAI,UAAU,WAAW,KAAK;AAC5B,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,0BAAkD,SAAiB;AACjE,WAAO,KAAK,mBAAmB;AAAA,MAC7B;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,wBAAgD,UAAkB;AAChE,WAAO,KAAK,mBAAmB;AAAA,MAC7B;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAUA,qBAA2B;AACzB,SAAK,OAAO,KAAK,cAAc;AAG/B,6BAAyB,IAAI,EAAE,QAAQ,CAAC,UAAU;AAChD,UAAID,cAAY,KAAK,GAAG;AACtB,cAAM,cAAA;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAMA,mBAAyB;AACvB,SAAK,OAAO,KAAK,YAAY;AAAA,EAC/B;AAAA,EAMA,oBAA0B;AACxB,SAAK,OAAO,KAAK,gBAAgB;AAAA,EACnC;AAAA,EAMA,iBAAuB;AACrB,SAAK,OAAO,KAAK,eAAe;AAGhC,6BAAyB,IAAI,EAAE,QAAQ,CAAC,UAAU;AAChD,UAAIA,cAAY,KAAK,GAAG;AACtB,cAAM,eAAA;AAAA,MACR;AAAA,IACF,CAAC;AAGD,UAAM,MAAuB;AAAA,MAC3B,UAAU,KAAK;AAAA,IAAA;AAEjB,aAAS,QAAQ,0BAA0B,GAAG;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,QAA2B;AACxC,UAAM,aAAa,yBAAyB,IAAI;AAChD,eAAW,QAAQ,CAAC,UAAU;AAC5B,UAAIA,cAAY,KAAK,GAAG;AACtB,cAAM,eAAe,MAAM;AAAA,MAC7B;AAAA,IACF,CAAC;AAED,UAAM,MAAyB;AAAA,MAC7B,UAAU,KAAK;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,UAAU,OAAO;AAAA,MACjB,iBAAiB,OAAO;AAAA,MACxB,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,eAAe,OAAO;AAAA,IAAA;AAExB,aAAS,QAAQ,4BAA4B,GAAG;AAChD,QAAI,OAAO,UAAU;AACnB,gBAAU,MAAM;AAEd,YAAI,KAAK,iBAAiB,UAAU,SAAS;AAC3C,eAAK,WAAW,gBAAgB;AAAA,QAClC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAgBA,MAAa,KAAK,SAAkB;AAClC,QAAI;AACF,WAAK,WAAW,YAAY;AAE5B,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACvC;AAEA,YAAM,SAAS,MAAM,aAAa,KAAK,MAAM,OAAO;AACpD,WAAK,WAAW,aAAa;AAG7B,YAAM,MAAsB;AAAA,QAC1B,UAAU,KAAK;AAAA,QACf,MAAM;AAAA,MAAA;AAER,eAAS,QAAQ,2BAA2B,GAAG;AAG/C,UAAI,QAAQ,MAAM,UAAU;AAC1B,aAAK,WAAW,gBAAgB;AAAA,MAClC;AAEA,aAAO;AAAA,IACT,SAAS,GAAG;AACV,WAAK,OAAO,MAAM,CAAC;AAEnB,UAAI,KAAK,iBAAiB,UAAU,MAAM;AACxC,aAAK,WAAW,gBAAgB;AAAA,MAClC;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAaA,MAAa,UAAU,MAAc,SAAkB;AACrD,QAAI;AACF,WAAK,WAAW,YAAY;AAE5B,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACvC;AAEA,YAAM,SAAS,MAAM,kBAAkB,MAAM,KAAK,MAAM,OAAO;AAC/D,WAAK,WAAW,aAAa;AAG7B,YAAM,MAAsB;AAAA,QAC1B,UAAU,KAAK;AAAA,QACf,MAAM;AAAA,MAAA;AAER,eAAS,QAAQ,2BAA2B,GAAG;AAG/C,UAAI,QAAQ,MAAM,UAAU;AAC1B,aAAK,WAAW,gBAAgB;AAAA,MAClC;AAEA,aAAO;AAAA,IACT,SAAS,GAAG;AACV,WAAK,OAAO,MAAM,CAAC;AAEnB,UAAI,KAAK,iBAAiB,UAAU,MAAM;AACxC,aAAK,WAAW,gBAAgB;AAAA,MAClC;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAQA,MAAa,aAAa;AACxB,SAAK,WAAW,aAAa;AAC7B,UAAM,KAAK,cAAc,UAAA,GAAa,aAAA;AACtC,SAAK,WAAW,eAAe;AAAA,EACjC;AAAA,EAEQ,qBAAqB;AAC3B,SAAK,mBAAmB,KAAK,QAAQ,CAAC,SAAS;AAC7C,YAAM,YAAY,KAAK,aAAa,CAAA;AACpC,gBAAU,QAAQ,CAAC,aAAa;AAC9B,cAAM,YAAY,KAAK,mBAAmB,KAAK;AAAA,UAC7C,CAAC,aAAa,SAAS,UAAU;AAAA,QAAA;AAEnC,YAAI,aAAa,UAAU,aAAa,KAAK,IAAI;AAC/C,oBAAU,WAAW,KAAK;AAC1B,eAAK,mBAAmB,YAAY,SAAS;AAAA,QAC/C;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAwB;AAC5B,SAAK,OAAO,KAAK,oBAAoB,KAAK,EAAE,EAAE;AAE9C,UAAM,eAAe,MAAM,gBAAgB,KAAK,SAAS;AACzD,QAAI,cAAc,WAAW,OAAO,CAAC,cAAc,MAAM;AACvD,WAAK,OAAO,MAAM,oCAAoC;AACtD;AAAA,IACF;AACA,UAAM,SAAS,cAAc;AAC7B,QAAI,QAAQ;AACV,YAAM,KAAK,mBAAmB,MAAM;AAAA,IACtC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAK,SAAqC;AAC9C,SAAK,OAAO,MAAM,kBAAkB,KAAK,EAAE,EAAE;AAE7C,UAAM,eAAe,MAAM,gBAAgB,KAAK,SAAS;AACzD,QAAI,cAAc,WAAW,KAAK;AAChC,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,UAAM,kBAAkB,MAAM,iBAAiB,OAAO;AAAA,MACpD,cAAc;AAAA,MACd,CAAA;AAAA,IAAC;AAGH,aAAS,IAAI,cAAc,oBAAoB,eAAe;AAC9D,aAAS,IAAI,OAAO,MAAM,IAAI;AAC9B,eAAW,SAAS,OAAO,KAAK,aAAa,MAAM,MAAM,KAAK,IAAI;AAChE,iBAAW,gBAAgB,aAAa,MAAM,OAAO,KAAK,KAAK,IAAI;AACjE,cAAM,gBAAgB,MAAM,iBAAiB,WAAW;AAAA,UACtD,cAAc;AAAA,UACd,EAAE,GAAG,cAAc,SAAS,MAAA;AAAA,UAC5B;AAAA,QAAA;AAEF,cAAM,kBAAuC;AAAA,UAC3C,GAAG;AAAA,UACH,MAAM,aAAa,QAAQ;AAAA,UAC3B,aAAa,KAAK;AAAA,UAClB,OAAO,aAAa;AAAA,UACpB,SAAS;AAAA,UACT,MAAM;AAAA,UACN,YAAY,aAAa,cAAc,CAAA;AAAA,QAAC;AAE1C,cAAM,WAAW,aAAa;AAAA,UAC5B,GAAG,KAAK,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,QAAA,EACtC,eAAe;AACjB,aAAK,mBAAmB,SAAS,QAAQ;AAAA,MAC3C;AAAA,IACF;AAEA,SAAK,mBAAA;AAAA,EACP;AAAA,EAMA,MAAM,mBAAmB,QAA8B;AACrD,UAAM,UAAU,kBAAkB,WAAW,KAAK,EAAE;AACpD,UAAM,kBACJ,SAAS,IAAI,cAAc,kBAAkB,KAAK,CAAA;AACpD,QAAI,OAAO,SAAS;AAClB,WAAK,OAAO;AAAA,QACV,sCAAsC,KAAK,IAAI;AAAA,MAAA;AAEjD,iBAAW,SAAS,OAAO,KAAK,QAAQ,MAAM,KAAK,IAAI;AACrD,cAAM,mBAAmB,KAAK,mBAC3B,cAAc,SAAS,KAAK,EAC5B;AAAA,UACC,CAAC,aACC,CAAC,OAAO,OAAO,KAAK,EAAE;AAAA,YACpB,CAAC,MAAM,GAAG,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,OAAO,SAAS;AAAA,UAAA;AAAA,QACpD;AAGN,yBAAiB,QAAQ,CAAC,aAAa;AACrC,eAAK,OAAO;AAAA,YACV,qBAAqB,SAAS,EAAE,gBAAgB,KAAK,IAAI;AAAA,UAAA;AAE3D,eAAK,mBAAmB,YAAY,SAAS,EAAE;AAC/C,0BAAgB,QAAQ;AAAA,QAC1B,CAAC;AAGD,mBAAW,gBAAgB,QAAQ,OAAO,KAAK,KAAK,CAAA,GAAI;AACtD,gBAAM,gBAAgB,MAAM,iBAAiB,WAAW;AAAA,YACtD,cAAc;AAAA,YACd,EAAE,GAAG,cAAc,SAAS,MAAA;AAAA,YAC5B;AAAA,UAAA;AAEF,gBAAM,kBAAuC;AAAA,YAC3C,GAAG;AAAA,YACH,MAAM,aAAa,QAAQ;AAAA,YAC3B,aAAa,KAAK;AAAA,YAClB,SAAS;AAAA,YACT,OAAO,aAAa;AAAA,YACpB,MAAM;AAAA,YACN,WAAW,aAAa;AAAA,YACxB,YAAY,aAAa,cAAc,CAAA;AAAA,UAAC;AAE1C,gBAAM,WAAW,KAAK,mBAAmB;AAAA,YACvC,GAAG,KAAK,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,UAAA;AAExC,cAAI,UAAU;AACZ,gBAAI,SAAS,cAAc,gBAAgB,WAAW;AACpD,mBAAK,OAAO;AAAA,gBACV,qCAAqC,SAAS,EAAE,cAAc,KAAK,IAAI,OAAO,gBAAgB,SAAS;AAAA,cAAA;AAAA,YAE3G;AACA,qBAAS,YAAY,eAAe;AAAA,UACtC,OAAO;AACL,iBAAK,OAAO;AAAA,cACV,mBAAmB,aAAa,EAAE,cAAc,KAAK,IAAI;AAAA,YAAA;AAE3D,kBAAM,WAAW,aAAa;AAAA,cAC5B,GAAG,KAAK,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,YAAA,EACtC,eAAe;AACjB,iBAAK,mBAAmB,SAAS,QAAQ;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,OAAO;AAAA,QACV,oCAAoC,KAAK,IAAI;AAAA,MAAA;AAE/C,iBAAW,SAAS,OAAO,KAAK,QAAQ,MAAM,KAAK,IAAI;AACrD,mBAAW,gBAAgB,QAAQ,OAAO,KAAK,KAAK,CAAA,GAAI;AACtD,gBAAM,gBAAgB,MAAM,iBAAiB,WAAW;AAAA,YACtD,cAAc;AAAA,YACd,EAAE,GAAG,cAAc,SAAS,MAAA;AAAA,YAC5B;AAAA,UAAA;AAEF,gBAAM,kBAAuC;AAAA,YAC3C,GAAG;AAAA,YACH,MAAM,aAAa,QAAQ;AAAA,YAC3B,aAAa,KAAK;AAAA,YAClB,SAAS;AAAA,YACT,OAAO,aAAa;AAAA,YACpB,MAAM;AAAA,YACN,MAAM,aAAa;AAAA,YACnB,WAAW,aAAa;AAAA,YACxB,YAAY,aAAa,cAAc,CAAA;AAAA,UAAC;AAE1C,gBAAM,WAAW,KAAK,mBAAmB;AAAA,YACvC,GAAG,KAAK,EAAE,IAAI,KAAK,IAAI,aAAa,EAAE;AAAA,UAAA;AAExC,cAAI,UAAU;AACZ,gBAAI,SAAS,cAAc,gBAAgB,WAAW;AACpD,mBAAK,OAAO;AAAA,gBACV,qCAAqC,SAAS,EAAE,cAAc,KAAK,IAAI,OAAO,gBAAgB,SAAS;AAAA,cAAA;AAAA,YAE3G;AACA,qBAAS,YAAY,eAAe;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,SAAK,mBAAA;AAAA,EACP;AAAA;AAGF;AAplBoBX,kBAAA;AAAA,EAAjB;AAAA,GARG,gBAQc,WAAA,sBAAA,CAAA;AAsOlBA,kBAAA;AAAA,EADC,cAAc,UAAU,OAAO;AAAA,GA7O5B,gBA8OJ,WAAA,sBAAA,CAAA;AAeAA,kBAAA;AAAA,EADC,aAAa,UAAU,OAAO;AAAA,GA5P3B,gBA6PJ,WAAA,oBAAA,CAAA;AAQAA,kBAAA;AAAA,EADC,cAAc,UAAU,cAAc;AAAA,GApQnC,gBAqQJ,WAAA,qBAAA,CAAA;AAQAA,kBAAA;AAAA,EADC,aAAa,UAAU,cAAc;AAAA,GA5QlC,gBA6QJ,WAAA,kBAAA,CAAA;AAiEaA,kBAAA;AAAA,EAFZ,UAAA;AAAA,EACA,cAAc,EAAE,eAAe,CAAC,UAAU,IAAI,GAAG;AAAA,GA7U9C,gBA8US,WAAA,QAAA,CAAA;AA6CAA,kBAAA;AAAA,EAFZ,UAAA;AAAA,EACA,cAAc,EAAE,eAAe,CAAC,UAAU,IAAI,GAAG;AAAA,GA1X9C,gBA2XS,WAAA,aAAA,CAAA;AAwCAA,kBAAA;AAAA,EAHZ,cAAc;AAAA,IACb,eAAe,CAAC,UAAU,eAAe,UAAU,OAAO;AAAA,EAAA,CAC3D;AAAA,GAlaG,gBAmaS,WAAA,cAAA,CAAA;AAiFPA,kBAAA;AAAA,EAJL,gBAAgB;AAAA,IACf,OAAO,GAAG,0BAA0B;AAAA,IACpC,WAAW;AAAA,EAAA,CACZ;AAAA,GAnfG,gBAofE,WAAA,sBAAA,CAAA;AApfF,kBAANA,kBAAA;AAAA,EArCC,SAAS,EAAE,aAAaD,cAAY,WAAW,OAAO;AAAA,EACtD,eAAA;AAAA,EACA;AAAA,IACC;AAAA,MACE,SAAS,UAAU;AAAA,MACnB,cAAc,oBAAoB;AAAA,MAClC,QAAQ;AAAA,QACN,CAAC,UAAU,IAAI,GAAG;AAAA,UAChB,IAAI;AAAA,YACF,YAAY,UAAU;AAAA,UAAA;AAAA,QACxB;AAAA,QAEF,CAAC,UAAU,aAAa,GAAG;AAAA,UACzB,IAAI;AAAA,YACF,aAAa,UAAU;AAAA,YACvB,aAAa,UAAU;AAAA,YACvB,gBAAgB,UAAU;AAAA,UAAA;AAAA,QAC5B;AAAA,QAEF,CAAC,UAAU,OAAO,GAAG;AAAA,UACnB,IAAI;AAAA,YACF,aAAa,UAAU;AAAA,YACvB,gBAAgB,UAAU;AAAA,UAAA;AAAA,QAC5B;AAAA,QAEF,CAAC,UAAU,cAAc,GAAG;AAAA,UAC1B,IAAI;AAAA,YACF,eAAe,UAAU;AAAA,UAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IAEF;AAAA,MACE,cAAc;AAAA,MACd,gBAAgB;AAAA;AAAA,IAAA;AAAA,EAClB;AACF,GACM,eAAA;AA4pBC,MAAM,SAET;AAAA,EACF,cAAc;AAAA,IACZ,CAACA,YAAU,GAAG;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,IAAA;AAAA,EACb;AAAA,EAEF,MAAMA;AAAAA,EACN,WAAW,WAAWA,YAAU;AAAA,EAChC,SAAS,IAAI,QAAQ,OAAmCA,YAAU;AACpE;;;;;;;;;;;ACzyBO,MAAMA,eAAa;AASnB,IAAM,0BAAN,MAEP;AAAA,EACE;AAAA,EACkB;AAAA,EACV;AAAA,EACR,YACE,SACA,UACA,SACA;AACA,SAAK,KAAK;AACV,SAAK,SAAS,QAAQ;AACtB,SAAK,gBAAgB,IAAI,kBAAA;AAAA,EAC3B;AAAA;AAAA,EAIA,MAAM,OAAsB;AAC1B,SAAK,OAAO,MAAM,gCAAgC,KAAK,EAAE,EAAE;AAAA,EAC7D;AAAA,EAEA,UAAU,MAAuC;AAC/C,WAAO,KAAK,cAAc,SAAS,IAAI;AAAA,EACzC;AAAA,EAEA,IAAI,cAAwB;AAC1B,WAAO,KAAK,cAAc,KAAK,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,EAC5D;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,OAAO,MAAM,2BAA2B,KAAK,EAAE,EAAE;AACtD,UAAM,SAAS,MAAM,YAAA;AACrB,QAAI,QAAQ,WAAW,KAAK;AAC1B,YAAM,UAAU,OAAO,KAAK,WACzB,IAAI,CAAC,aAAa,SAAS,WAAW,CAAA,CAAE,EACxC,KAAA;AACH,cAAQ,QAAQ,CAAC,eAAe;AAC9B,cAAM,WAAW,WAAW;AAC5B,cAAM,sBACJ,WAAW,UAAU,KAAK,CAAC,aAAa,SAAS,SAAS,UAAU,GAChE,eAAe;AAErB,cAAM,SAAS,OAAO,QAAQ,QAAQ,EAAE;AAAA,UACtC,MAAM,WAAW;AAAA,UACjB,MAAM,WAAW;AAAA,UACjB,WAAW,WAAW;AAAA,UACtB,aAAa,WAAW;AAAA,UACxB;AAAA,QAAA,CACD;AACD,aAAK,cAAc,SAAS,MAAM;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAlDoBC,kBAAA;AAAA,EAAjB;AAAA,GAJU,wBAIO,WAAA,iBAAA,CAAA;AAJP,0BAANA,kBAAA;AAAA,EADN,SAASD,YAAU;AAAA,GACP,uBAAA;ACAN,MAAM,iBAAiB,IAAI,qCAGhC;AAAA,EACA,OAAO;AAAA,EACP,MAAMA;AACR,CAAC;ACvBD,MAAM,EAAE,IAAA,IAAQ,kBAAkB,sBAAsB;AACxD,MAAM,EAAE,UAAA,IAAc,eAAe,MAAM;AAAA,EACzC,UAAU,GAAG,GAAG;AAClB,CAAC;AAgBM,MAAM,eAAe,OAAO,MAAc,YAAoB;AACnE,QAAM,WAAW,MAAM,UAAe;AAAA,IACpC,OAAO,CAAA;AAAA,IACP,aAAa,GAAG,GAAG,GAAG,IAAI;AAAA,IAC1B,SAAS;AAAA,IACT;AAAA,EAAA,CACD;AACD,MAAI,UAAU,MAAM;AAClB,kBAAc,eAAe,SAAS,IAAI;AAAA,EAC5C;AACA,SAAO;AACT;;;;;;;;;;;ACHO,MAAM,aAAa;AAInB,MAAM,6BAA6B;AACnC,MAAM,8BAA8B;AACpC,MAAM,4BAA4B;AAuCzC,MAAM,cAAc,CAAC,UACnB,MAAM,gBAAgB,UACtB,MAAM,iBAAiB,UACvB,MAAM,mBAAmB;AAqDpB,IAAM,uBAAN,MAEP;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,EACQ;AAAA,EAER,YAAY,SAAiB,SAA6B;AACxD,SAAK,KAAK;AAEV,SAAK,gBAAgB,IAAI,cAAc,IAAI;AAC3C,SAAK,qBAAqB,QAAQ;AAClC,SAAK,WAAW,QAAQ,YAAY;AACpC,SAAK,aAAa,QAAQ;AAC1B,SAAK,QAAQ,eAAe,QAAQ,eAAe,CAAA,CAAE;AAAA,EACvD;AAAA,EAEA,IAAI,cAAc;AAChB,QAAI,CAAC,KAAK,YAAY;AACpB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,mBAAmB,KAAK,YAAY,KAAK,KAAK;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,KAAa,OAAY;AACzC,SAAK,MAAM,GAAG,IAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,KAAa;AAC7B,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB;AACjB,SAAK,QAAQ,eAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAmC;AAC7C,QAAI,QAAQ,UAAU;AACpB,WAAK,WAAW,QAAQ;AAAA,IAC1B;AACA,QAAI,QAAQ,aAAa;AACvB,WAAK,MAAM,UAAU,QAAQ,WAAW;AAAA,IAC1C;AAAA,EACF;AAAA,EAUA,qBAA2B;AACzB,SAAK,OAAO,KAAK,cAAc;AAG/B,6BAAyB,IAAI,EAAE,QAAQ,CAAC,UAAU;AAChD,UAAI,YAAY,KAAK,GAAG;AACtB,cAAM,cAAA;AAAA,MACR;AAAA,IACF,CAAC;AAGD,UAAM,MAAsB;AAAA,MAC1B,YAAY,KAAK;AAAA,MACjB,MAAM,KAAK;AAAA,IAAA;AAEb,aAAS,QAAQ,4BAA4B,GAAG;AAAA,EAClD;AAAA,EAMA,mBAAyB;AACvB,SAAK,OAAO,KAAK,YAAY;AAAA,EAC/B;AAAA,EAMA,oBAA0B;AACxB,SAAK,OAAO,KAAK,gBAAgB;AAAA,EACnC;AAAA,EAMA,iBAAuB;AACrB,SAAK,OAAO,KAAK,eAAe;AAGhC,6BAAyB,IAAI,EAAE,QAAQ,CAAC,UAAU;AAChD,UAAI,YAAY,KAAK,GAAG;AACtB,cAAM,eAAA;AAAA,MACR;AAAA,IACF,CAAC;AAGD,UAAM,MAAuB;AAAA,MAC3B,YAAY,KAAK;AAAA,IAAA;AAEnB,aAAS,QAAQ,2BAA2B,GAAG;AAAA,EACjD;AAAA;AAAA,EAgBA,MAAa,KAAK,SAAkB;AAClC,QAAI;AACF,WAAK,WAAW,YAAY;AAE5B,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACvC;AAEA,YAAM,SAAS,MAAM,aAAa,KAAK,aAAa,OAAO;AAC3D,WAAK,WAAW,aAAa;AAG7B,UAAI,QAAQ,MAAM,UAAU;AAC1B,aAAK,WAAW,gBAAgB;AAAA,MAClC;AAEA,aAAO;AAAA,IACT,SAAS,GAAG;AACV,WAAK,OAAO,MAAM,CAAC;AAEnB,UAAI,KAAK,iBAAiB,UAAU,MAAM;AACxC,aAAK,WAAW,gBAAgB;AAAA,MAClC;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAKA,MAAa,aAAa;AACxB,SAAK,WAAW,aAAa;AAC7B,UAAM,KAAK,cAAc,UAAA,GAAa,aAAA;AACtC,SAAK,WAAW,eAAe;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAI,YAAY;AACd,WACE,CAAC,EAAE,KAAK,UAAU,CAAC,KAAK,QAAQ,aAChC,KAAK,iBAAiB,UAAU,iBAChC,KAAK,iBAAiB,UAAU,WAChC,KAAK,iBAAiB,UAAU;AAAA,EAEpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAI,UAAU;AACZ,WAAO,KAAK,iBAAiB,UAAU;AAAA,EACzC;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,QAA2B;AACxC,6BAAyB,IAAI,EAAE,QAAQ,CAAC,UAAU;AAChD,UAAI,YAAY,KAAK,GAAG;AACtB,cAAM,eAAe,MAAM;AAAA,MAC7B;AAAA,IACF,CAAC;AAED,UAAM,MAAyB;AAAA,MAC7B,YAAY,KAAK;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,UAAU,OAAO;AAAA,MACjB,iBAAiB,OAAO;AAAA,MACxB,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,eAAe,OAAO;AAAA,IAAA;AAExB,aAAS,QAAQ,6BAA6B,GAAG;AAEjD,QAAI,OAAO,UAAU;AACnB,gBAAU,MAAM;AAEd,YAAI,KAAK,iBAAiB,UAAU,SAAS;AAC3C,eAAK,WAAW,gBAAgB;AAAA,QAClC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AA5KE,gBAAA;AAAA,EADC,cAAc,UAAU,OAAO;AAAA,GA5ErB,qBA6EX,WAAA,sBAAA,CAAA;AAsBA,gBAAA;AAAA,EADC,aAAa,UAAU,OAAO;AAAA,GAlGpB,qBAmGX,WAAA,oBAAA,CAAA;AAQA,gBAAA;AAAA,EADC,cAAc,UAAU,cAAc;AAAA,GA1G5B,qBA2GX,WAAA,qBAAA,CAAA;AAQA,gBAAA;AAAA,EADC,aAAa,UAAU,cAAc;AAAA,GAlH3B,qBAmHX,WAAA,kBAAA,CAAA;AA+Ba,gBAAA;AAAA,EAFZ,UAAA;AAAA,EACA,cAAc,EAAE,eAAe,CAAC,UAAU,IAAI,GAAG;AAAA,GAjJvC,qBAkJE,WAAA,QAAA,CAAA;AA8BA,gBAAA;AAAA,EAHZ,cAAc;AAAA,IACb,eAAe,CAAC,UAAU,eAAe,UAAU,OAAO;AAAA,EAAA,CAC3D;AAAA,GA/KU,qBAgLE,WAAA,cAAA,CAAA;AAhLF,uBAAN,gBAAA;AAAA,EAtCN,SAAS,UAAU;AAAA,EACnB,eAAA;AAAA,EACA,eAAA;AAAA,EACA;AAAA,IACC;AAAA,MACE,SAAS,UAAU;AAAA,MACnB,cAAc,oBAAoB;AAAA,MAClC,QAAQ;AAAA,QACN,CAAC,UAAU,IAAI,GAAG;AAAA,UAChB,IAAI;AAAA,YACF,YAAY,UAAU;AAAA,UAAA;AAAA,QACxB;AAAA,QAEF,CAAC,UAAU,aAAa,GAAG;AAAA,UACzB,IAAI;AAAA,YACF,aAAa,UAAU;AAAA,YACvB,aAAa,UAAU;AAAA,YACvB,gBAAgB,UAAU;AAAA,UAAA;AAAA,QAC5B;AAAA,QAEF,CAAC,UAAU,OAAO,GAAG;AAAA,UACnB,IAAI;AAAA,YACF,aAAa,UAAU;AAAA,YACvB,gBAAgB,UAAU;AAAA,UAAA;AAAA,QAC5B;AAAA,QAEF,CAAC,UAAU,cAAc,GAAG;AAAA,UAC1B,IAAI;AAAA,YACF,eAAe,UAAU;AAAA,UAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IAEF;AAAA,MACE,cAAc;AAAA,MACd,gBAAgB;AAAA;AAAA,IAAA;AAAA,EAClB;AACF,GACa,oBAAA;AC9GN,MAAM,cAAc,IAAI,4BAG7B;AAAA,EACA,OAAO;AAAA,EACP,MAAM;AACR,CAAC;ACjBM,MAAM,YAAoC;AAAA,EAC/C,GAAG,oBAAoB;AAAA,EACvB,GAAG,WAAW;AAAA,EACd,GAAG,gBAAgB;AAAA,EACnB,GAAG,OAAO;AAAA,EACV,GAAG,OAAO;AAAA,EACV,GAAG,KAAK;AAAA,EACR,GAAG,cAAc;AAAA,EACjB,GAAG,aAAa;AAAA,EAChB,GAAG,SAAS;AAAA,EACZ,GAAG,eAAe;AACpB;ACNO,MAAM,yBACX,CAAI,SACJ,MAAM;AACJ,qBAAmB,IAAI,EAAA;AACvB,iBAAe,SAAA;AACf,SAAO,KAAK,SAAS,EAAE,QAAQ,CAAC,QAAQ;AACtC,UAAM,QAAQ,UAAU,GAAG;AAC3B,wBAAoB,IAAI,EAAE,KAAK,KAAK;AAAA,EACtC,CAAC;AAED,mBAAiB,6BAA6B,EAAE;AAAA,IAC9C;AAAA,IACA,OAAO,YAA0B;AAG/B,UAAI,QAAQ,MAAM,UAAU;AAC1B,cAAM,EAAE,OAAO,cAAA,IAAkB;AAAA,UAC/B,SAAS;AAAA,QAAA;AAGX,YAAI,eAAe;AACjB,gBAAM,aAAa,cAAc,OAAO;AAAA,YACtC,CAAC,MAAM,EAAE,OAAO,QAAQ,KAAK;AAAA,UAAA,IAE3B,gBAA4B,QAAQ,KAAK,QAAQ,EAAE,QACnD;AACJ,iBAAO;AAAA,YACL,SAAS,aAAa,WAAW,OAAO;AAAA,UAAA;AAAA,QAE5C;AAAA,MACF;AACA,aAAO,CAAA;AAAA,IACT;AAAA,EAAA;AAEF,SAAO;AAAA,IACL,SAAS,oBAAoB,MAAM,aAAa,IAAI;AAAA,IACpD,OAAO,oBAAoB,MAAM,SAAS,IAAI;AAAA,IAC9C,WAAW,oBAAoB,UAAU,SAAS,IAAI;AAAA,IACtD,QAAQ,oBAAoB,MAAM,oBAAoB,IAAI;AAAA,EAAA;AAE9D;AAUF,MAAM,oBAAoB;AAAA,EACxB,GAAGc;AACL;AAEC,kBAA0B,WAAW;AAAA,EACpC,QAAQ,uBAAuB,iBAAiB;AAClD;AACC,kBAA0B,UACzB,oBAAoB,MAAM,aAAa,iBAAiB;AACzD,kBAA0B,QACzB,oBAAoB,MAAM,SAAS,iBAAiB;AACrD,kBAA0B,YACzB,oBAAoB,UAAU,SAAS,iBAAiB;AACzD,kBAA0B,SACzB,oBAAoB,MAAM,oBAAoB,iBAAiB;AAMjE,MAAM,mBAAyC;"}