homebridge 2.0.0-beta.34 → 2.0.0-beta.36

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 (284) hide show
  1. package/dist/api.d.ts +74 -32
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +48 -46
  4. package/dist/api.js.map +1 -1
  5. package/dist/api.spec.d.ts +2 -0
  6. package/dist/api.spec.d.ts.map +1 -0
  7. package/dist/api.spec.js +413 -0
  8. package/dist/api.spec.js.map +1 -0
  9. package/dist/childBridgeFork.d.ts +1 -18
  10. package/dist/childBridgeFork.d.ts.map +1 -1
  11. package/dist/childBridgeFork.js +21 -258
  12. package/dist/childBridgeFork.js.map +1 -1
  13. package/dist/externalPortService.d.ts +2 -9
  14. package/dist/externalPortService.d.ts.map +1 -1
  15. package/dist/externalPortService.js +20 -40
  16. package/dist/externalPortService.js.map +1 -1
  17. package/dist/index.d.ts +10 -10
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -3
  20. package/dist/index.js.map +1 -1
  21. package/dist/logger.spec.d.ts +2 -0
  22. package/dist/logger.spec.d.ts.map +1 -0
  23. package/dist/logger.spec.js +95 -0
  24. package/dist/logger.spec.js.map +1 -0
  25. package/dist/matter/ChildBridgeMatterManager.d.ts +96 -0
  26. package/dist/matter/ChildBridgeMatterManager.d.ts.map +1 -0
  27. package/dist/matter/ChildBridgeMatterManager.js +397 -0
  28. package/dist/matter/ChildBridgeMatterManager.js.map +1 -0
  29. package/dist/matter/ExternalMatterAccessoryPublisher.d.ts +48 -0
  30. package/dist/matter/ExternalMatterAccessoryPublisher.d.ts.map +1 -0
  31. package/dist/matter/ExternalMatterAccessoryPublisher.js +73 -0
  32. package/dist/matter/ExternalMatterAccessoryPublisher.js.map +1 -0
  33. package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts +2 -0
  34. package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts.map +1 -0
  35. package/dist/matter/ExternalMatterAccessoryPublisher.spec.js +293 -0
  36. package/dist/matter/ExternalMatterAccessoryPublisher.spec.js.map +1 -0
  37. package/dist/matter/{matterServer.d.ts → MatterAPIImpl.d.ts} +203 -367
  38. package/dist/matter/MatterAPIImpl.d.ts.map +1 -0
  39. package/dist/matter/MatterAPIImpl.js +305 -0
  40. package/dist/matter/MatterAPIImpl.js.map +1 -0
  41. package/dist/matter/MatterBridgeManager.d.ts +91 -0
  42. package/dist/matter/MatterBridgeManager.d.ts.map +1 -0
  43. package/dist/matter/MatterBridgeManager.js +426 -0
  44. package/dist/matter/MatterBridgeManager.js.map +1 -0
  45. package/dist/matter/MatterConfigCollector.d.ts +26 -0
  46. package/dist/matter/MatterConfigCollector.d.ts.map +1 -0
  47. package/dist/matter/MatterConfigCollector.js +78 -0
  48. package/dist/matter/MatterConfigCollector.js.map +1 -0
  49. package/dist/matter/{matterAccessoryCache.d.ts → accessoryCache.d.ts} +12 -3
  50. package/dist/matter/accessoryCache.d.ts.map +1 -0
  51. package/dist/matter/{matterAccessoryCache.js → accessoryCache.js} +32 -10
  52. package/dist/matter/accessoryCache.js.map +1 -0
  53. package/dist/matter/accessoryCache.spec.d.ts +2 -0
  54. package/dist/matter/accessoryCache.spec.d.ts.map +1 -0
  55. package/dist/matter/accessoryCache.spec.js +452 -0
  56. package/dist/matter/accessoryCache.spec.js.map +1 -0
  57. package/dist/matter/behaviors/BehaviorRegistry.d.ts +65 -0
  58. package/dist/matter/behaviors/BehaviorRegistry.d.ts.map +1 -0
  59. package/dist/matter/behaviors/BehaviorRegistry.js +139 -0
  60. package/dist/matter/behaviors/BehaviorRegistry.js.map +1 -0
  61. package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts +2 -0
  62. package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts.map +1 -0
  63. package/dist/matter/behaviors/BehaviorRegistry.spec.js +307 -0
  64. package/dist/matter/behaviors/BehaviorRegistry.spec.js.map +1 -0
  65. package/dist/matter/behaviors/ColorControlBehavior.d.ts +64 -0
  66. package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -0
  67. package/dist/matter/behaviors/ColorControlBehavior.js +160 -0
  68. package/dist/matter/behaviors/ColorControlBehavior.js.map +1 -0
  69. package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts +2 -0
  70. package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts.map +1 -0
  71. package/dist/matter/behaviors/ColorControlBehavior.spec.js +29 -0
  72. package/dist/matter/behaviors/ColorControlBehavior.spec.js.map +1 -0
  73. package/dist/matter/behaviors/DoorLockBehavior.d.ts +21 -0
  74. package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -0
  75. package/dist/matter/behaviors/DoorLockBehavior.js +49 -0
  76. package/dist/matter/behaviors/DoorLockBehavior.js.map +1 -0
  77. package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts +2 -0
  78. package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts.map +1 -0
  79. package/dist/matter/behaviors/DoorLockBehavior.spec.js +108 -0
  80. package/dist/matter/behaviors/DoorLockBehavior.spec.js.map +1 -0
  81. package/dist/matter/behaviors/FanControlBehavior.d.ts +20 -0
  82. package/dist/matter/behaviors/FanControlBehavior.d.ts.map +1 -0
  83. package/dist/matter/behaviors/FanControlBehavior.js +45 -0
  84. package/dist/matter/behaviors/FanControlBehavior.js.map +1 -0
  85. package/dist/matter/behaviors/FanControlBehavior.spec.d.ts +2 -0
  86. package/dist/matter/behaviors/FanControlBehavior.spec.d.ts.map +1 -0
  87. package/dist/matter/behaviors/FanControlBehavior.spec.js +23 -0
  88. package/dist/matter/behaviors/FanControlBehavior.spec.js.map +1 -0
  89. package/dist/matter/behaviors/IdentifyBehavior.d.ts +21 -0
  90. package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -0
  91. package/dist/matter/behaviors/IdentifyBehavior.js +27 -0
  92. package/dist/matter/behaviors/IdentifyBehavior.js.map +1 -0
  93. package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts +2 -0
  94. package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts.map +1 -0
  95. package/dist/matter/behaviors/IdentifyBehavior.spec.js +64 -0
  96. package/dist/matter/behaviors/IdentifyBehavior.spec.js.map +1 -0
  97. package/dist/matter/behaviors/LevelControlBehavior.d.ts +34 -0
  98. package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -0
  99. package/dist/matter/behaviors/LevelControlBehavior.js +75 -0
  100. package/dist/matter/behaviors/LevelControlBehavior.js.map +1 -0
  101. package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts +2 -0
  102. package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts.map +1 -0
  103. package/dist/matter/behaviors/LevelControlBehavior.spec.js +140 -0
  104. package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +1 -0
  105. package/dist/matter/behaviors/OnOffBehavior.d.ts +28 -0
  106. package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -0
  107. package/dist/matter/behaviors/OnOffBehavior.js +63 -0
  108. package/dist/matter/behaviors/OnOffBehavior.js.map +1 -0
  109. package/dist/matter/behaviors/OnOffBehavior.spec.d.ts +2 -0
  110. package/dist/matter/behaviors/OnOffBehavior.spec.d.ts.map +1 -0
  111. package/dist/matter/behaviors/OnOffBehavior.spec.js +116 -0
  112. package/dist/matter/behaviors/OnOffBehavior.spec.js.map +1 -0
  113. package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts +19 -0
  114. package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts.map +1 -0
  115. package/dist/matter/behaviors/RvcCleanModeBehavior.js +27 -0
  116. package/dist/matter/behaviors/RvcCleanModeBehavior.js.map +1 -0
  117. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts +2 -0
  118. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts.map +1 -0
  119. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js +56 -0
  120. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +1 -0
  121. package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +23 -0
  122. package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -0
  123. package/dist/matter/behaviors/RvcOperationalStateBehavior.js +49 -0
  124. package/dist/matter/behaviors/RvcOperationalStateBehavior.js.map +1 -0
  125. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts +2 -0
  126. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts.map +1 -0
  127. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js +55 -0
  128. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js.map +1 -0
  129. package/dist/matter/behaviors/RvcRunModeBehavior.d.ts +19 -0
  130. package/dist/matter/behaviors/RvcRunModeBehavior.d.ts.map +1 -0
  131. package/dist/matter/behaviors/RvcRunModeBehavior.js +27 -0
  132. package/dist/matter/behaviors/RvcRunModeBehavior.js.map +1 -0
  133. package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts +2 -0
  134. package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts.map +1 -0
  135. package/dist/matter/behaviors/RvcRunModeBehavior.spec.js +56 -0
  136. package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +1 -0
  137. package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +22 -0
  138. package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -0
  139. package/dist/matter/behaviors/ServiceAreaBehavior.js +35 -0
  140. package/dist/matter/behaviors/ServiceAreaBehavior.js.map +1 -0
  141. package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts +2 -0
  142. package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts.map +1 -0
  143. package/dist/matter/behaviors/ServiceAreaBehavior.spec.js +52 -0
  144. package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +1 -0
  145. package/dist/matter/behaviors/ThermostatBehavior.d.ts +23 -0
  146. package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -0
  147. package/dist/matter/behaviors/ThermostatBehavior.js +79 -0
  148. package/dist/matter/behaviors/ThermostatBehavior.js.map +1 -0
  149. package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts +2 -0
  150. package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts.map +1 -0
  151. package/dist/matter/behaviors/ThermostatBehavior.spec.js +23 -0
  152. package/dist/matter/behaviors/ThermostatBehavior.spec.js.map +1 -0
  153. package/dist/matter/behaviors/WindowCoveringBehavior.d.ts +32 -0
  154. package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -0
  155. package/dist/matter/behaviors/WindowCoveringBehavior.js +106 -0
  156. package/dist/matter/behaviors/WindowCoveringBehavior.js.map +1 -0
  157. package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts +2 -0
  158. package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts.map +1 -0
  159. package/dist/matter/behaviors/WindowCoveringBehavior.spec.js +27 -0
  160. package/dist/matter/behaviors/WindowCoveringBehavior.spec.js.map +1 -0
  161. package/dist/matter/behaviors/index.d.ts +20 -0
  162. package/dist/matter/behaviors/index.d.ts.map +1 -0
  163. package/dist/matter/behaviors/index.js +21 -0
  164. package/dist/matter/behaviors/index.js.map +1 -0
  165. package/dist/matter/{matterConfigValidator.d.ts → configValidator.d.ts} +1 -1
  166. package/dist/matter/configValidator.d.ts.map +1 -0
  167. package/dist/matter/{matterConfigValidator.js → configValidator.js} +1 -1
  168. package/dist/matter/configValidator.js.map +1 -0
  169. package/dist/matter/configValidator.spec.d.ts +2 -0
  170. package/dist/matter/configValidator.spec.d.ts.map +1 -0
  171. package/dist/matter/configValidator.spec.js +390 -0
  172. package/dist/matter/configValidator.spec.js.map +1 -0
  173. package/dist/matter/errorHandler.d.ts +33 -0
  174. package/dist/matter/errorHandler.d.ts.map +1 -0
  175. package/dist/matter/errorHandler.js +113 -0
  176. package/dist/matter/errorHandler.js.map +1 -0
  177. package/dist/matter/errorHandler.spec.d.ts +2 -0
  178. package/dist/matter/errorHandler.spec.d.ts.map +1 -0
  179. package/dist/matter/errorHandler.spec.js +159 -0
  180. package/dist/matter/errorHandler.spec.js.map +1 -0
  181. package/dist/matter/index.d.ts +7 -4
  182. package/dist/matter/index.d.ts.map +1 -1
  183. package/dist/matter/index.js +7 -4
  184. package/dist/matter/index.js.map +1 -1
  185. package/dist/matter/{matterLogFormatter.d.ts → logFormatter.d.ts} +1 -1
  186. package/dist/matter/logFormatter.d.ts.map +1 -0
  187. package/dist/matter/{matterLogFormatter.js → logFormatter.js} +33 -6
  188. package/dist/matter/logFormatter.js.map +1 -0
  189. package/dist/matter/logFormatter.spec.d.ts +2 -0
  190. package/dist/matter/logFormatter.spec.d.ts.map +1 -0
  191. package/dist/matter/logFormatter.spec.js +284 -0
  192. package/dist/matter/logFormatter.spec.js.map +1 -0
  193. package/dist/matter/server.d.ts +350 -0
  194. package/dist/matter/server.d.ts.map +1 -0
  195. package/dist/matter/{matterServer.js → server.js} +533 -352
  196. package/dist/matter/server.js.map +1 -0
  197. package/dist/matter/{matterServerHelpers.d.ts → serverHelpers.d.ts} +2 -2
  198. package/dist/matter/serverHelpers.d.ts.map +1 -0
  199. package/dist/matter/{matterServerHelpers.js → serverHelpers.js} +11 -8
  200. package/dist/matter/serverHelpers.js.map +1 -0
  201. package/dist/matter/serverHelpers.spec.d.ts +2 -0
  202. package/dist/matter/serverHelpers.spec.d.ts.map +1 -0
  203. package/dist/matter/serverHelpers.spec.js +521 -0
  204. package/dist/matter/serverHelpers.spec.js.map +1 -0
  205. package/dist/matter/{matterSharedTypes.d.ts → sharedTypes.d.ts} +4 -10
  206. package/dist/matter/sharedTypes.d.ts.map +1 -0
  207. package/dist/matter/{matterSharedTypes.js → sharedTypes.js} +4 -10
  208. package/dist/matter/sharedTypes.js.map +1 -0
  209. package/dist/matter/{matterStorage.d.ts → storage.d.ts} +9 -2
  210. package/dist/matter/storage.d.ts.map +1 -0
  211. package/dist/matter/{matterStorage.js → storage.js} +14 -5
  212. package/dist/matter/{matterStorage.js.map → storage.js.map} +1 -1
  213. package/dist/matter/storage.spec.d.ts +2 -0
  214. package/dist/matter/storage.spec.d.ts.map +1 -0
  215. package/dist/matter/storage.spec.js +570 -0
  216. package/dist/matter/storage.spec.js.map +1 -0
  217. package/dist/matter/typeHelpers.d.ts +45 -0
  218. package/dist/matter/typeHelpers.d.ts.map +1 -0
  219. package/dist/matter/typeHelpers.js +57 -0
  220. package/dist/matter/typeHelpers.js.map +1 -0
  221. package/dist/matter/typeHelpers.spec.d.ts +2 -0
  222. package/dist/matter/typeHelpers.spec.d.ts.map +1 -0
  223. package/dist/matter/typeHelpers.spec.js +127 -0
  224. package/dist/matter/typeHelpers.spec.js.map +1 -0
  225. package/dist/matter/{matterTypes.d.ts → types.d.ts} +2 -2
  226. package/dist/matter/types.d.ts.map +1 -0
  227. package/dist/matter/{matterTypes.js → types.js} +1 -2
  228. package/dist/matter/types.js.map +1 -0
  229. package/dist/platformAccessory.spec.d.ts +2 -0
  230. package/dist/platformAccessory.spec.d.ts.map +1 -0
  231. package/dist/platformAccessory.spec.js +126 -0
  232. package/dist/platformAccessory.spec.js.map +1 -0
  233. package/dist/pluginManager.spec.d.ts +2 -0
  234. package/dist/pluginManager.spec.d.ts.map +1 -0
  235. package/dist/pluginManager.spec.js +43 -0
  236. package/dist/pluginManager.spec.js.map +1 -0
  237. package/dist/server.d.ts +4 -13
  238. package/dist/server.d.ts.map +1 -1
  239. package/dist/server.js +45 -333
  240. package/dist/server.js.map +1 -1
  241. package/dist/server.spec.d.ts +2 -0
  242. package/dist/server.spec.d.ts.map +1 -0
  243. package/dist/server.spec.js +57 -0
  244. package/dist/server.spec.js.map +1 -0
  245. package/dist/user.spec.d.ts +2 -0
  246. package/dist/user.spec.d.ts.map +1 -0
  247. package/dist/user.spec.js +31 -0
  248. package/dist/user.spec.js.map +1 -0
  249. package/dist/util/mac.spec.d.ts +2 -0
  250. package/dist/util/mac.spec.d.ts.map +1 -0
  251. package/dist/util/mac.spec.js +36 -0
  252. package/dist/util/mac.spec.js.map +1 -0
  253. package/dist/version.spec.d.ts +2 -0
  254. package/dist/version.spec.d.ts.map +1 -0
  255. package/dist/version.spec.js +20 -0
  256. package/dist/version.spec.js.map +1 -0
  257. package/package.json +4 -4
  258. package/dist/matter/matterAccessoryCache.d.ts.map +0 -1
  259. package/dist/matter/matterAccessoryCache.js.map +0 -1
  260. package/dist/matter/matterBehaviors.d.ts +0 -194
  261. package/dist/matter/matterBehaviors.d.ts.map +0 -1
  262. package/dist/matter/matterBehaviors.js +0 -665
  263. package/dist/matter/matterBehaviors.js.map +0 -1
  264. package/dist/matter/matterConfigValidator.d.ts.map +0 -1
  265. package/dist/matter/matterConfigValidator.js.map +0 -1
  266. package/dist/matter/matterErrorHandler.d.ts +0 -106
  267. package/dist/matter/matterErrorHandler.d.ts.map +0 -1
  268. package/dist/matter/matterErrorHandler.js +0 -495
  269. package/dist/matter/matterErrorHandler.js.map +0 -1
  270. package/dist/matter/matterLogFormatter.d.ts.map +0 -1
  271. package/dist/matter/matterLogFormatter.js.map +0 -1
  272. package/dist/matter/matterNetworkMonitor.d.ts +0 -68
  273. package/dist/matter/matterNetworkMonitor.d.ts.map +0 -1
  274. package/dist/matter/matterNetworkMonitor.js +0 -249
  275. package/dist/matter/matterNetworkMonitor.js.map +0 -1
  276. package/dist/matter/matterServer.d.ts.map +0 -1
  277. package/dist/matter/matterServer.js.map +0 -1
  278. package/dist/matter/matterServerHelpers.d.ts.map +0 -1
  279. package/dist/matter/matterServerHelpers.js.map +0 -1
  280. package/dist/matter/matterSharedTypes.d.ts.map +0 -1
  281. package/dist/matter/matterSharedTypes.js.map +0 -1
  282. package/dist/matter/matterStorage.d.ts.map +0 -1
  283. package/dist/matter/matterTypes.d.ts.map +0 -1
  284. package/dist/matter/matterTypes.js.map +0 -1
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Behavior Registry
3
+ *
4
+ * Manages handler registration and accessory state without global mutable state.
5
+ * This replaces the global Maps in matterBehaviors.ts.
6
+ */
7
+ import { Logger } from '../../logger.js';
8
+ const log = Logger.withPrefix('Matter/Behaviors');
9
+ /**
10
+ * Registry for behavior handlers and accessory state
11
+ * Replaces global state with a proper class instance
12
+ */
13
+ export class BehaviorRegistry {
14
+ // Handler storage: endpointId -> clusterName -> commandName -> handler
15
+ handlers = new Map();
16
+ // Part endpoint mapping: endpointId -> { parentUuid, partId }
17
+ partEndpoints = new Map();
18
+ // Reference to accessories map (not owned by registry)
19
+ accessoriesMap;
20
+ constructor(accessoriesMap) {
21
+ this.accessoriesMap = accessoriesMap;
22
+ }
23
+ /**
24
+ * Register a command handler for an endpoint
25
+ */
26
+ registerHandler(endpointId, clusterName, commandName, handler) {
27
+ if (!this.handlers.has(endpointId)) {
28
+ this.handlers.set(endpointId, new Map());
29
+ }
30
+ const endpointHandlers = this.handlers.get(endpointId);
31
+ if (!endpointHandlers.has(clusterName)) {
32
+ endpointHandlers.set(clusterName, new Map());
33
+ }
34
+ const clusterHandlers = endpointHandlers.get(clusterName);
35
+ clusterHandlers.set(commandName, handler);
36
+ log.debug(`Registered handler: ${endpointId}.${clusterName}.${commandName}`);
37
+ }
38
+ /**
39
+ * Get a registered handler
40
+ */
41
+ getHandler(endpointId, clusterName, commandName) {
42
+ return this.handlers.get(endpointId)?.get(clusterName)?.get(commandName);
43
+ }
44
+ /**
45
+ * Execute a handler if it exists
46
+ */
47
+ async executeHandler(endpointId, clusterName, commandName, ...args) {
48
+ const handler = this.getHandler(endpointId, clusterName, commandName);
49
+ if (!handler) {
50
+ return false;
51
+ }
52
+ try {
53
+ await handler(...args);
54
+ return true;
55
+ }
56
+ catch (error) {
57
+ log.error(`Handler error for ${endpointId}.${clusterName}.${commandName}:`, error);
58
+ throw error;
59
+ }
60
+ }
61
+ /**
62
+ * Register a part endpoint mapping
63
+ */
64
+ registerPartEndpoint(endpointId, parentUuid, partId) {
65
+ this.partEndpoints.set(endpointId, { parentUuid, partId });
66
+ log.debug(`Registered part endpoint: ${endpointId} -> ${parentUuid}.${partId}`);
67
+ }
68
+ /**
69
+ * Get part endpoint info
70
+ */
71
+ getPartEndpointInfo(endpointId) {
72
+ return this.partEndpoints.get(endpointId);
73
+ }
74
+ /**
75
+ * Sync cluster state to cache
76
+ * Updates the accessory's cached cluster state when values change
77
+ */
78
+ syncStateToCache(endpointId, clusterName, attributes) {
79
+ // Check if this is a part endpoint
80
+ const partInfo = this.partEndpoints.get(endpointId);
81
+ if (partInfo) {
82
+ // Update part cluster state
83
+ const accessory = this.accessoriesMap.get(partInfo.parentUuid);
84
+ if (!accessory?._parts) {
85
+ return;
86
+ }
87
+ const part = accessory._parts.find(p => p.id === partInfo.partId);
88
+ if (!part?.clusters) {
89
+ return;
90
+ }
91
+ if (!part.clusters[clusterName]) {
92
+ part.clusters[clusterName] = {};
93
+ }
94
+ part.clusters[clusterName] = {
95
+ ...part.clusters[clusterName],
96
+ ...attributes,
97
+ };
98
+ log.debug(`Synced ${clusterName} state to cache for part ${partInfo.partId}:`, attributes);
99
+ }
100
+ else {
101
+ // Update main accessory cluster state
102
+ const accessory = this.accessoriesMap.get(endpointId);
103
+ if (!accessory?.clusters) {
104
+ return;
105
+ }
106
+ if (!accessory.clusters[clusterName]) {
107
+ accessory.clusters[clusterName] = {};
108
+ }
109
+ accessory.clusters[clusterName] = {
110
+ ...accessory.clusters[clusterName],
111
+ ...attributes,
112
+ };
113
+ log.debug(`Synced ${clusterName} state to cache for ${endpointId}:`, attributes);
114
+ }
115
+ }
116
+ /**
117
+ * Clear all handlers (for cleanup)
118
+ */
119
+ clear() {
120
+ this.handlers.clear();
121
+ this.partEndpoints.clear();
122
+ }
123
+ /**
124
+ * Get statistics
125
+ */
126
+ getStats() {
127
+ let handlerCount = 0;
128
+ for (const endpointHandlers of this.handlers.values()) {
129
+ for (const clusterHandlers of endpointHandlers.values()) {
130
+ handlerCount += clusterHandlers.size;
131
+ }
132
+ }
133
+ return {
134
+ handlerCount,
135
+ partCount: this.partEndpoints.size,
136
+ };
137
+ }
138
+ }
139
+ //# sourceMappingURL=BehaviorRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BehaviorRegistry.js","sourceRoot":"","sources":["../../../src/matter/behaviors/BehaviorRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=BehaviorRegistry.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BehaviorRegistry.spec.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/BehaviorRegistry.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,307 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { BehaviorRegistry } from './BehaviorRegistry.js';
3
+ describe('behaviorRegistry', () => {
4
+ let registry;
5
+ let accessoriesMap;
6
+ let consoleDebugSpy;
7
+ let consoleErrorSpy;
8
+ beforeEach(() => {
9
+ accessoriesMap = new Map();
10
+ registry = new BehaviorRegistry(accessoriesMap);
11
+ consoleDebugSpy = vi.spyOn(console, 'debug').mockImplementation(() => { });
12
+ consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
13
+ });
14
+ afterEach(() => {
15
+ consoleDebugSpy.mockRestore();
16
+ consoleErrorSpy.mockRestore();
17
+ });
18
+ describe('constructor', () => {
19
+ it('should create a new registry with provided accessories map', () => {
20
+ expect(registry).toBeInstanceOf(BehaviorRegistry);
21
+ });
22
+ it('should initialize with empty state', () => {
23
+ const stats = registry.getStats();
24
+ expect(stats.handlerCount).toBe(0);
25
+ expect(stats.partCount).toBe(0);
26
+ });
27
+ });
28
+ describe('registerHandler', () => {
29
+ it('should register a handler', () => {
30
+ const handler = vi.fn();
31
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', handler);
32
+ expect(registry.getHandler('endpoint1', 'onOff', 'toggle')).toBe(handler);
33
+ });
34
+ it('should register multiple handlers for same endpoint', () => {
35
+ const handler1 = vi.fn();
36
+ const handler2 = vi.fn();
37
+ registry.registerHandler('endpoint1', 'onOff', 'on', handler1);
38
+ registry.registerHandler('endpoint1', 'onOff', 'off', handler2);
39
+ expect(registry.getHandler('endpoint1', 'onOff', 'on')).toBe(handler1);
40
+ expect(registry.getHandler('endpoint1', 'onOff', 'off')).toBe(handler2);
41
+ });
42
+ it('should register handlers for multiple clusters', () => {
43
+ const handler1 = vi.fn();
44
+ const handler2 = vi.fn();
45
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', handler1);
46
+ registry.registerHandler('endpoint1', 'levelControl', 'moveToLevel', handler2);
47
+ expect(registry.getHandler('endpoint1', 'onOff', 'toggle')).toBe(handler1);
48
+ expect(registry.getHandler('endpoint1', 'levelControl', 'moveToLevel')).toBe(handler2);
49
+ });
50
+ it('should register handlers for multiple endpoints', () => {
51
+ const handler1 = vi.fn();
52
+ const handler2 = vi.fn();
53
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', handler1);
54
+ registry.registerHandler('endpoint2', 'onOff', 'toggle', handler2);
55
+ expect(registry.getHandler('endpoint1', 'onOff', 'toggle')).toBe(handler1);
56
+ expect(registry.getHandler('endpoint2', 'onOff', 'toggle')).toBe(handler2);
57
+ });
58
+ it('should overwrite existing handler when registered again', () => {
59
+ const handler1 = vi.fn();
60
+ const handler2 = vi.fn();
61
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', handler1);
62
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', handler2);
63
+ expect(registry.getHandler('endpoint1', 'onOff', 'toggle')).toBe(handler2);
64
+ });
65
+ it('should not throw when registering a handler', () => {
66
+ const handler = vi.fn();
67
+ // Should not throw
68
+ expect(() => registry.registerHandler('endpoint1', 'onOff', 'toggle', handler)).not.toThrow();
69
+ });
70
+ });
71
+ describe('getHandler', () => {
72
+ it('should return undefined for non-existent endpoint', () => {
73
+ expect(registry.getHandler('nonexistent', 'onOff', 'toggle')).toBeUndefined();
74
+ });
75
+ it('should return undefined for non-existent cluster', () => {
76
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', vi.fn());
77
+ expect(registry.getHandler('endpoint1', 'nonexistent', 'toggle')).toBeUndefined();
78
+ });
79
+ it('should return undefined for non-existent command', () => {
80
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', vi.fn());
81
+ expect(registry.getHandler('endpoint1', 'onOff', 'nonexistent')).toBeUndefined();
82
+ });
83
+ it('should return registered handler', () => {
84
+ const handler = vi.fn();
85
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', handler);
86
+ expect(registry.getHandler('endpoint1', 'onOff', 'toggle')).toBe(handler);
87
+ });
88
+ });
89
+ describe('executeHandler', () => {
90
+ it('should execute handler with provided arguments', async () => {
91
+ const handler = vi.fn();
92
+ registry.registerHandler('endpoint1', 'onOff', 'moveToLevel', handler);
93
+ const result = await registry.executeHandler('endpoint1', 'onOff', 'moveToLevel', 100, 200);
94
+ expect(handler).toHaveBeenCalledWith(100, 200);
95
+ expect(result).toBe(true);
96
+ });
97
+ it('should execute async handler', async () => {
98
+ const handler = vi.fn(async () => {
99
+ await new Promise(resolve => setTimeout(resolve, 10));
100
+ });
101
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', handler);
102
+ const result = await registry.executeHandler('endpoint1', 'onOff', 'toggle');
103
+ expect(handler).toHaveBeenCalled();
104
+ expect(result).toBe(true);
105
+ });
106
+ it('should return false when handler does not exist', async () => {
107
+ const result = await registry.executeHandler('nonexistent', 'onOff', 'toggle');
108
+ expect(result).toBe(false);
109
+ });
110
+ it('should log and rethrow errors from handlers', async () => {
111
+ const error = new Error('Handler failed');
112
+ const handler = vi.fn(() => {
113
+ throw error;
114
+ });
115
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', handler);
116
+ await expect(registry.executeHandler('endpoint1', 'onOff', 'toggle')).rejects.toThrow('Handler failed');
117
+ // Error should be logged (with timestamps/prefixes added by Logger)
118
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Handler error'));
119
+ });
120
+ it('should handle async handler errors', async () => {
121
+ const error = new Error('Async handler failed');
122
+ const handler = vi.fn(async () => {
123
+ throw error;
124
+ });
125
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', handler);
126
+ await expect(registry.executeHandler('endpoint1', 'onOff', 'toggle')).rejects.toThrow('Async handler failed');
127
+ expect(consoleErrorSpy).toHaveBeenCalled();
128
+ });
129
+ });
130
+ describe('registerPartEndpoint', () => {
131
+ it('should register part endpoint mapping', () => {
132
+ registry.registerPartEndpoint('part-endpoint-1', 'parent-uuid', 'part1');
133
+ expect(registry.getPartEndpointInfo('part-endpoint-1')).toEqual({
134
+ parentUuid: 'parent-uuid',
135
+ partId: 'part1',
136
+ });
137
+ });
138
+ it('should register multiple part endpoints', () => {
139
+ registry.registerPartEndpoint('part-endpoint-1', 'parent-uuid', 'part1');
140
+ registry.registerPartEndpoint('part-endpoint-2', 'parent-uuid', 'part2');
141
+ expect(registry.getPartEndpointInfo('part-endpoint-1')).toEqual({
142
+ parentUuid: 'parent-uuid',
143
+ partId: 'part1',
144
+ });
145
+ expect(registry.getPartEndpointInfo('part-endpoint-2')).toEqual({
146
+ parentUuid: 'parent-uuid',
147
+ partId: 'part2',
148
+ });
149
+ });
150
+ });
151
+ describe('getPartEndpointInfo', () => {
152
+ it('should return undefined for non-existent part endpoint', () => {
153
+ expect(registry.getPartEndpointInfo('nonexistent')).toBeUndefined();
154
+ });
155
+ it('should return part endpoint info', () => {
156
+ registry.registerPartEndpoint('part-endpoint-1', 'parent-uuid', 'part1');
157
+ expect(registry.getPartEndpointInfo('part-endpoint-1')).toEqual({
158
+ parentUuid: 'parent-uuid',
159
+ partId: 'part1',
160
+ });
161
+ });
162
+ });
163
+ describe('syncStateToCache', () => {
164
+ it('should sync state to main accessory cluster', () => {
165
+ const accessory = {
166
+ uuid: 'accessory-uuid',
167
+ displayName: 'Test Accessory',
168
+ clusters: {
169
+ onOff: { onOff: false },
170
+ },
171
+ };
172
+ accessoriesMap.set('accessory-uuid', accessory);
173
+ registry.syncStateToCache('accessory-uuid', 'onOff', { onOff: true });
174
+ expect(accessory.clusters.onOff).toEqual({ onOff: true });
175
+ });
176
+ it('should create cluster if it does not exist on main accessory', () => {
177
+ const accessory = {
178
+ uuid: 'accessory-uuid',
179
+ displayName: 'Test Accessory',
180
+ clusters: {},
181
+ };
182
+ accessoriesMap.set('accessory-uuid', accessory);
183
+ registry.syncStateToCache('accessory-uuid', 'onOff', { onOff: true });
184
+ expect(accessory.clusters.onOff).toEqual({ onOff: true });
185
+ });
186
+ it('should merge attributes with existing cluster state', () => {
187
+ const accessory = {
188
+ uuid: 'accessory-uuid',
189
+ displayName: 'Test Accessory',
190
+ clusters: {
191
+ levelControl: { currentLevel: 100 },
192
+ },
193
+ };
194
+ accessoriesMap.set('accessory-uuid', accessory);
195
+ registry.syncStateToCache('accessory-uuid', 'levelControl', { minLevel: 0, maxLevel: 254 });
196
+ expect(accessory.clusters.levelControl).toEqual({
197
+ currentLevel: 100,
198
+ minLevel: 0,
199
+ maxLevel: 254,
200
+ });
201
+ });
202
+ it('should sync state to part accessory cluster', () => {
203
+ const accessory = {
204
+ uuid: 'parent-uuid',
205
+ displayName: 'Test Device',
206
+ clusters: {},
207
+ _parts: [
208
+ {
209
+ id: 'part1',
210
+ clusters: {
211
+ onOff: { onOff: false },
212
+ },
213
+ },
214
+ ],
215
+ };
216
+ accessoriesMap.set('parent-uuid', accessory);
217
+ registry.registerPartEndpoint('part-endpoint-1', 'parent-uuid', 'part1');
218
+ registry.syncStateToCache('part-endpoint-1', 'onOff', { onOff: true });
219
+ expect(accessory._parts[0].clusters.onOff).toEqual({ onOff: true });
220
+ });
221
+ it('should create cluster if it does not exist on part', () => {
222
+ const accessory = {
223
+ uuid: 'parent-uuid',
224
+ displayName: 'Test Device',
225
+ clusters: {},
226
+ _parts: [
227
+ {
228
+ id: 'part1',
229
+ clusters: {},
230
+ },
231
+ ],
232
+ };
233
+ accessoriesMap.set('parent-uuid', accessory);
234
+ registry.registerPartEndpoint('part-endpoint-1', 'parent-uuid', 'part1');
235
+ registry.syncStateToCache('part-endpoint-1', 'onOff', { onOff: true });
236
+ expect(accessory._parts[0].clusters.onOff).toEqual({ onOff: true });
237
+ });
238
+ it('should handle non-existent accessory gracefully', () => {
239
+ registry.syncStateToCache('nonexistent', 'onOff', { onOff: true });
240
+ // Should not throw, just silently fail
241
+ expect(consoleDebugSpy).not.toHaveBeenCalled();
242
+ });
243
+ it('should handle accessory without clusters gracefully', () => {
244
+ const accessory = {
245
+ uuid: 'accessory-uuid',
246
+ displayName: 'Test Accessory',
247
+ };
248
+ accessoriesMap.set('accessory-uuid', accessory);
249
+ registry.syncStateToCache('accessory-uuid', 'onOff', { onOff: true });
250
+ // Should not throw, just silently fail
251
+ expect(consoleDebugSpy).not.toHaveBeenCalled();
252
+ });
253
+ it('should handle part accessory without _parts gracefully', () => {
254
+ const accessory = {
255
+ uuid: 'parent-uuid',
256
+ displayName: 'Test Device',
257
+ clusters: {},
258
+ };
259
+ accessoriesMap.set('parent-uuid', accessory);
260
+ registry.registerPartEndpoint('part-endpoint-1', 'parent-uuid', 'part1');
261
+ registry.syncStateToCache('part-endpoint-1', 'onOff', { onOff: true });
262
+ // Should not throw, just silently fail
263
+ expect(consoleDebugSpy).not.toHaveBeenCalled();
264
+ });
265
+ });
266
+ describe('clear', () => {
267
+ it('should clear all handlers and part endpoints', () => {
268
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', vi.fn());
269
+ registry.registerPartEndpoint('part-endpoint-1', 'parent-uuid', 'part1');
270
+ registry.clear();
271
+ expect(registry.getHandler('endpoint1', 'onOff', 'toggle')).toBeUndefined();
272
+ expect(registry.getPartEndpointInfo('part-endpoint-1')).toBeUndefined();
273
+ expect(registry.getStats().handlerCount).toBe(0);
274
+ expect(registry.getStats().partCount).toBe(0);
275
+ });
276
+ });
277
+ describe('getStats', () => {
278
+ it('should return zero counts for empty registry', () => {
279
+ const stats = registry.getStats();
280
+ expect(stats.handlerCount).toBe(0);
281
+ expect(stats.partCount).toBe(0);
282
+ });
283
+ it('should count registered handlers', () => {
284
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', vi.fn());
285
+ registry.registerHandler('endpoint1', 'onOff', 'on', vi.fn());
286
+ registry.registerHandler('endpoint1', 'levelControl', 'moveToLevel', vi.fn());
287
+ registry.registerHandler('endpoint2', 'onOff', 'toggle', vi.fn());
288
+ const stats = registry.getStats();
289
+ expect(stats.handlerCount).toBe(4);
290
+ });
291
+ it('should count registered part endpoints', () => {
292
+ registry.registerPartEndpoint('part1', 'parent', 'part1');
293
+ registry.registerPartEndpoint('part2', 'parent', 'part2');
294
+ const stats = registry.getStats();
295
+ expect(stats.partCount).toBe(2);
296
+ });
297
+ it('should count both handlers and part endpoints', () => {
298
+ registry.registerHandler('endpoint1', 'onOff', 'toggle', vi.fn());
299
+ registry.registerHandler('endpoint2', 'levelControl', 'moveToLevel', vi.fn());
300
+ registry.registerPartEndpoint('part1', 'parent', 'part1');
301
+ const stats = registry.getStats();
302
+ expect(stats.handlerCount).toBe(2);
303
+ expect(stats.partCount).toBe(1);
304
+ });
305
+ });
306
+ });
307
+ //# sourceMappingURL=BehaviorRegistry.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BehaviorRegistry.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/BehaviorRegistry.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * ColorControl Cluster Behavior
3
+ *
4
+ * Handles color control commands for RGB lights and color temperature lights
5
+ */
6
+ import type { MaybePromise } from '@matter/main';
7
+ import type { ColorControl } from '@matter/main/clusters';
8
+ import type { BehaviorRegistry } from './BehaviorRegistry.js';
9
+ import { ColorControlServer } from '@matter/main/behaviors/color-control';
10
+ /**
11
+ * Custom ColorControl Server that calls plugin handlers
12
+ *
13
+ * ColorControl handles color changes for lights (hue, saturation, XY color, color temperature).
14
+ * Plugin developers can override these *Logic methods to handle color changes in their hardware.
15
+ *
16
+ * Features (Xy, ColorTemperature, HueSaturation) are added by the device type, not this behavior.
17
+ * This ensures each device only gets the features it needs.
18
+ */
19
+ export declare class HomebridgeColorControlServer extends ColorControlServer {
20
+ private static registry;
21
+ /**
22
+ * Set the behavior registry (called once during server initialization)
23
+ */
24
+ static setRegistry(registry: BehaviorRegistry): void;
25
+ /**
26
+ * Called when color temperature is changed
27
+ * @param colorTemperatureMireds - Target color temperature in mireds (micro reciprocal degrees)
28
+ * @param transitionTime - Transition time in seconds (0 = as fast as possible)
29
+ */
30
+ moveToColorTemperatureLogic(colorTemperatureMireds: number, transitionTime: number): MaybePromise;
31
+ /**
32
+ * Called when hue and saturation are changed together
33
+ * @param hue - Target hue value (0-254 for normal hue, 0-65535 for enhanced hue)
34
+ * @param saturation - Target saturation value (0-254)
35
+ * @param transitionTime - Transition time in seconds (0 = as fast as possible)
36
+ */
37
+ moveToHueAndSaturationLogic(hue: number, saturation: number, transitionTime: number): MaybePromise;
38
+ /**
39
+ * Called when XY color coordinates are changed
40
+ * @param targetX - Target X value (0-65535 representing 0.0-1.0 in CIE color space)
41
+ * @param targetY - Target Y value (0-65535 representing 0.0-1.0 in CIE color space)
42
+ * @param transitionTime - Transition time in seconds (0 = as fast as possible)
43
+ */
44
+ moveToColorLogic(targetX: number, targetY: number, transitionTime: number): MaybePromise;
45
+ /**
46
+ * Called when hue is changed individually
47
+ * @param targetHue - Target hue value
48
+ * @param direction - Direction to move (shortest, longest, up, down)
49
+ * @param transitionTime - Transition time in seconds
50
+ * @param isEnhancedHue - Whether this is enhanced hue (16-bit) or normal hue (8-bit)
51
+ */
52
+ moveToHueLogic(targetHue: number, direction: ColorControl.Direction, transitionTime: number, isEnhancedHue?: boolean): MaybePromise;
53
+ /**
54
+ * Called when saturation is changed individually
55
+ * @param targetSaturation - Target saturation value (0-254)
56
+ * @param transitionTime - Transition time in seconds
57
+ */
58
+ moveToSaturationLogic(targetSaturation: number, transitionTime: number): MaybePromise;
59
+ /**
60
+ * Called when all color movement should be stopped
61
+ */
62
+ stopAllColorMovement(): MaybePromise;
63
+ }
64
+ //# sourceMappingURL=ColorControlBehavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorControlBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/ColorControlBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAEzE;;;;;;;;GAQG;AACH,qBAAa,4BAA6B,SAAQ,kBAAkB;IAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIpD;;;;OAIG;IACM,2BAA2B,CAAC,sBAAsB,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,YAAY;IA2B1G;;;;;OAKG;IACM,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,YAAY;IA8B3G;;;;;OAKG;IACM,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,YAAY;IA8BjG;;;;;;OAMG;IACM,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,UAAQ,GAAG,YAAY;IA6B1I;;;;OAIG;IACM,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,YAAY;IA2B9F;;OAEG;IACM,oBAAoB,IAAI,YAAY;CAe9C"}