@openremote/or-dashboard-builder 1.2.0-snapshot.20240512162641 → 1.2.0-snapshot.20240819101332

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 (521) hide show
  1. package/dist/umd/003671ee2a876e7614cd94390e2255b3.js +1 -0
  2. package/dist/umd/0078b630bed2938ce03f618c2bcd1363.js +1 -0
  3. package/dist/umd/0144de97a3c256f81447e7e7135780e5.js +1 -0
  4. package/dist/umd/019e34e85139cfc611bf23efa096c980.js +1 -0
  5. package/dist/umd/02174460fe8ff6a6bc19db86543b9600.js +1 -0
  6. package/dist/umd/029ed9161a8d24a9c2ba97124020989d.js +1 -0
  7. package/dist/umd/03452373324e7ceaf58e3830eafd1a28.js +1 -0
  8. package/dist/umd/03980cb12dacd26148c22bb61fce440f.js +1 -0
  9. package/dist/umd/03a5f5b2b97a8fc289399d92fba810d0.js +1 -0
  10. package/dist/umd/03aae8272914723a7bf85b984385032c.js +1 -0
  11. package/dist/umd/03ab996935e5c1a84ac09966ede74fb8.js +1 -0
  12. package/dist/umd/0416c21cfe088739209926632a360e3b.js +1 -0
  13. package/dist/umd/069a0d6b093e73e820f6a60a91fa614b.js +1 -0
  14. package/dist/umd/06d958315fc6cdbb28576b03e43203aa.js +1 -0
  15. package/dist/umd/07397bd479cbc34bc04576b4f15bdf18.js +1 -0
  16. package/dist/umd/07567125b93045706d81f17f7d04e262.js +1 -0
  17. package/dist/umd/078dd0bd08c93b1512e3d1b777591b21.js +1 -0
  18. package/dist/umd/0972f21af3e75388ef55435c0b3b831d.js +1 -0
  19. package/dist/umd/0973bb38b2e3efd2a879fd8e81d50fce.js +1 -0
  20. package/dist/umd/0a1d9862d917663419ac2dd2e8193267.js +1 -0
  21. package/dist/umd/0b06cbc7edf78b6f2810187262e7630b.js +1 -0
  22. package/dist/umd/0bd45b2d490c48c31619072a4fb0eaea.js +1 -0
  23. package/dist/umd/0cd2349b7f4b6f7013e195c8145d2917.js +1 -0
  24. package/dist/umd/0dd9fc97c3dee2275f41cd20ffaea059.js +1 -0
  25. package/dist/umd/0e67325b9a04863301e36c0c37947069.js +1 -0
  26. package/dist/umd/0f147528a6f36ca40c8b3ec796429f58.js +1 -0
  27. package/dist/umd/0f2d1162158745e1093693a3a999932a.js +1 -0
  28. package/dist/umd/0fa30731c46fe8b6a54f9752ad0ed7e0.js +1 -0
  29. package/dist/umd/0fd64c8920c10008be86572dd6830dc1.js +1 -0
  30. package/dist/umd/10132993df2cf9c9423b53a8a44379ab.js +1 -0
  31. package/dist/umd/1034e3807d1bcf55cb564491950237ab.js +1 -0
  32. package/dist/umd/105b17c6442efb97c18ca2aef3976b06.js +1 -0
  33. package/dist/umd/10c464f3f882bfeeefbc0934c2ee9fbe.js +1 -0
  34. package/dist/umd/111d9fdb9864abba36298d1a0807fe6d.js +1 -0
  35. package/dist/umd/1195816afa4a5e8183857be16a04ae6f.js +1 -0
  36. package/dist/umd/119f6c45ea400e3c27e1ce172e4c881d.js +1 -0
  37. package/dist/umd/11e3a2a8fb5bcb9d19298a80cafd3f5a.js +1 -0
  38. package/dist/umd/130340e2c62b9e858f186dab5f491e55.js +1 -0
  39. package/dist/umd/135747176621bcc94e9edd0323a81d3c.js +1 -0
  40. package/dist/umd/1383530217ac0068c844902d24e18e08.js +1 -0
  41. package/dist/umd/13eda3507db9cbfb400f46b9b3ff6553.js +1 -0
  42. package/dist/umd/1495a3d68b15b8622c53f6688b64809f.js +1 -0
  43. package/dist/umd/1533058f0ce13acdaa8d5bdc7d147bef.js +1 -0
  44. package/dist/umd/15f3800d33b854ba476c9daf1b9e0326.js +1 -0
  45. package/dist/umd/16c2e1b50af4ba05edaa03c8c9e9d18c.js +1 -0
  46. package/dist/umd/170487867de05784a96608617bdd544d.js +1 -0
  47. package/dist/umd/1736cea368ae85240f34289307fdf67f.js +1 -0
  48. package/dist/umd/17632e1e19e438f431784dfd77e01773.js +1 -0
  49. package/dist/umd/17dc98279d24649d3ca77cbce8c44e83.js +1 -0
  50. package/dist/umd/1875ecdf54e78b5f07ff1bd944cf794b.js +1 -0
  51. package/dist/umd/191feb6103c36b202bc01ba262916cdf.js +1 -0
  52. package/dist/umd/1b15b9f88acaf59b96e59c6b5f32da12.js +1 -0
  53. package/dist/umd/1c24a68cb472146022d0806ea2505cfb.js +1 -0
  54. package/dist/umd/1c57b3481f295105588972ffa1305521.js +1 -0
  55. package/dist/umd/1cc6fc3772824e2f87f10a9c3fad2dae.js +1 -0
  56. package/dist/umd/1ce14f2cad9f3c122cb5ccfcd485ffb4.js +1 -0
  57. package/dist/umd/1d3796180f854b5d8ab435ab0a1c2c11.js +1 -0
  58. package/dist/umd/1dddd8903e00ce9149ded23fb87f6f34.js +1 -0
  59. package/dist/umd/1e5fe0a75db78dcabbd4f27c2b084e4b.js +1 -0
  60. package/dist/umd/1ed6368e8e20628ad5229329eec28baa.js +1 -0
  61. package/dist/umd/1ff1389501159e4846a5133e3b8992d8.js +1 -0
  62. package/dist/umd/210aec2722e6416a0349a987260e14a3.js +1 -0
  63. package/dist/umd/211511e7b374f57ad31acaf49dbdccb1.js +1 -0
  64. package/dist/umd/2272c6632c52c3e402ab27b8045ab8f1.js +1 -0
  65. package/dist/umd/228ca80abf1ae030cbfe7faaec61913f.js +1 -0
  66. package/dist/umd/2302902e10c4afab56e1b864c96070cb.js +1 -0
  67. package/dist/umd/23602ad4c88f0f19e7a0a12454ebf556.js +1 -0
  68. package/dist/umd/23bb1a9f279e7a732bfd405350aab114.js +1 -0
  69. package/dist/umd/24a3ff38afde257888d755ece9bfd704.js +1 -0
  70. package/dist/umd/24f97ddd76026815674affbc50ad6169.js +1 -0
  71. package/dist/umd/25718a469574ade47e23567d8c543169.js +1 -0
  72. package/dist/umd/25eda4bb98e40a82cfd5b4bf9fbc06ec.js +1 -0
  73. package/dist/umd/262f489eb59166e1215642b60446d123.js +1 -0
  74. package/dist/umd/269732f4c5f6e82ea3246548a9631b47.js +1 -0
  75. package/dist/umd/275d8f4e0550edce2f3b85b3eaa94e54.js +1 -0
  76. package/dist/umd/27730a0bdc6f430cc85049a46a73a029.js +1 -0
  77. package/dist/umd/27846e85433e54a3ec0ab34d62233dc5.js +1 -0
  78. package/dist/umd/283970c76db99e2d0d90f0e7c45494f9.js +1 -0
  79. package/dist/umd/28785bea435918d49b290d27bf660baa.js +1 -0
  80. package/dist/umd/2a8394955e047270a2a965ec67843989.js +1 -0
  81. package/dist/umd/2aa392a501973ebfcea38239a45ed8e7.js +1 -0
  82. package/dist/umd/2ad349208b3a727abb3c9f943865a27c.js +1 -0
  83. package/dist/umd/2b1b8f8b9e8f1e423a69afd121fd7da9.js +1 -0
  84. package/dist/umd/2b5729e073775b8fb827fc8e4725e48a.js +1 -0
  85. package/dist/umd/2c3ad366cda02f17520d3369cae64c2c.js +1 -0
  86. package/dist/umd/2d2a75e3d01a74b93d07db04df8abe5e.js +1 -0
  87. package/dist/umd/2dd82c65030101b60dffccedd8741c6e.js +1 -0
  88. package/dist/umd/2e841e8b77c2a2c00fd71940632bc1e1.js +1 -0
  89. package/dist/umd/2f055ac4066041b9008dd6aebf9df34b.js +1 -0
  90. package/dist/umd/2f25a4dc442bc9aebc58cae30c50c3e2.js +1 -0
  91. package/dist/umd/2f55cddc8eb85b63ee5b4ce0e5488230.js +1 -0
  92. package/dist/umd/2fc0239242a898632ca8aa451cb930c2.js +1 -0
  93. package/dist/umd/2fe2904fc024afaf81732563cb83e547.js +1 -0
  94. package/dist/umd/318dcae1cdcd4733986a93e7a5fab7b8.js +1 -0
  95. package/dist/umd/31c610efb1d25afc90853b52ba4cb089.js +1 -0
  96. package/dist/umd/328cbf598e9711b0a87c19437b02f80d.js +1 -0
  97. package/dist/umd/33b4e371d4983ab56f4db08627119f0b.js +1 -0
  98. package/dist/umd/349237ad9565dc823ce7bcb7527ba7ee.js +1 -0
  99. package/dist/umd/34b8d1c8a81822685f809c49097b81fc.js +1 -0
  100. package/dist/umd/34f99cce131bd7aa65e7a924e2456006.js +1 -0
  101. package/dist/umd/3567d1ea443427e944a6f189a0898819.js +1 -0
  102. package/dist/umd/363d3bac8dcd9a83332c3758185ce080.js +1 -0
  103. package/dist/umd/3645af9e7e929d3abe3255c739e20e84.js +1 -0
  104. package/dist/umd/367def81f25c0a08527f9a4e86e70c56.js +1 -0
  105. package/dist/umd/37172facd8a534a38f378ca2a9c7c11b.js +1 -0
  106. package/dist/umd/37ee3b5201ae2e2dc5dc8b1b20ad900e.js +1 -0
  107. package/dist/umd/3834f2acef5a5debb2a21ad919272307.js +1 -0
  108. package/dist/umd/38b1d18836e38ee7b4deaeba0c35f7b8.js +1 -0
  109. package/dist/umd/39fea85ed7dd99d7c6c9e59b7040523f.js +1 -0
  110. package/dist/umd/3a1227a65a1fc39ca476c295d1a260a4.js +1 -0
  111. package/dist/umd/3a6ca6958d003ae67bb7fefc8713ee93.js +1 -0
  112. package/dist/umd/3ac8c7749734990e2d9f81eeca219886.js +1 -0
  113. package/dist/umd/3b02cca9e95276a74f3ed2bbc7a64ce6.js +1 -0
  114. package/dist/umd/3b190e5159c72fb7e27271956772bcba.js +1 -0
  115. package/dist/umd/3b544bb2c5a4e7b225a4b50235a0fd6d.js +1 -0
  116. package/dist/umd/3b6e7dc98c47eeafd851ca5072db4be6.js +1 -0
  117. package/dist/umd/3bf96f8eb1859e2724a4b769af3b5f1e.js +1 -0
  118. package/dist/umd/3c5b59a666c5d39d9ba9cc054d36a410.js +1 -0
  119. package/dist/umd/3ea020c57c2bbf457a8497df313b2e5c.js +1 -0
  120. package/dist/umd/3eefbe1c009cfd730b2ca6f834367c45.js +1 -0
  121. package/dist/umd/3f896944a97f002f2146e028ff2eac63.js +1 -0
  122. package/dist/umd/414cd2c842fa42bf71e155f870619e00.js +1 -0
  123. package/dist/umd/42c556183279bbdaaed3a8a9f9108f58.js +1 -0
  124. package/dist/umd/42e0ea6351d45d342caab13cb12f9ea4.js +1 -0
  125. package/dist/umd/43139bfbcbce9de597b4985dc1e6a03b.js +1 -0
  126. package/dist/umd/432a5982ba3ddf958381d780e1e9a8e2.js +1 -0
  127. package/dist/umd/432aff60ba31a74d2120031fdc894775.js +1 -0
  128. package/dist/umd/4430c55f023b72fb5e389cee9351b38c.js +1 -0
  129. package/dist/umd/44599d9b6202ebebfcdd073edf3562e3.js +1 -0
  130. package/dist/umd/44efcea2f84e80cc4092a89796afe886.js +1 -0
  131. package/dist/umd/472ba8f81bf8cac86027cb1be4e3b9cd.js +1 -0
  132. package/dist/umd/479ec45a8edfe482fae4298d1e9862d2.js +1 -0
  133. package/dist/umd/47e4cb297b2c3841ef86ce04a7f5584e.js +1 -0
  134. package/dist/umd/47e5776dff3b80ed69ab5947dba33c76.js +1 -0
  135. package/dist/umd/48e9351c5623d4da657ce7d5d0267ea6.js +1 -0
  136. package/dist/umd/492e618a031cfde9c83d699c430de2ac.js +1 -0
  137. package/dist/umd/49582665262ff6179b9f3a98adf7ed5c.js +1 -0
  138. package/dist/umd/4b692785a8a6340a89e6067274a7583c.js +1 -0
  139. package/dist/umd/4bee3a46b8378a7b4ef84492f08abd22.js +1 -0
  140. package/dist/umd/4bf3bc1fbdd26ac698fef1bdf26e3ff4.js +1 -0
  141. package/dist/umd/4bf6763c5956e3bccbf0373068810ded.js +1 -0
  142. package/dist/umd/4c1bdecbedd36a5765de184ac056822a.js +1 -0
  143. package/dist/umd/4d0849c6c9a868c09130600ac68319b3.js +1 -0
  144. package/dist/umd/4d0ebf4c528cee9b0cdd3e076e06570b.js +1 -0
  145. package/dist/umd/4d156ee0485ab4b40b090a3cd7b995a9.js +1 -0
  146. package/dist/umd/4d6d9020e7e5c8d8dee7a5e374355f05.js +1 -0
  147. package/dist/umd/4d8cb7033879cb7fcc7a43798e2bde22.js +1 -0
  148. package/dist/umd/4e389cce6fb8f78845fab249bce43c0b.js +1 -0
  149. package/dist/umd/4ef80ee74467e0297eec3cc03092da01.js +1 -0
  150. package/dist/umd/4f683c6881e9f8740f5516a85b9eb9da.js +1 -0
  151. package/dist/umd/5106411f7468a5ee5b1ee77aed12c0c7.js +1 -0
  152. package/dist/umd/51f903c5ce5284a63196247cffb5ca40.js +1 -0
  153. package/dist/umd/52fd09d1713345d9ee64dc7daea9fd6f.js +1 -0
  154. package/dist/umd/5348f3cfbe5a63954e7d984f197bbddb.js +1 -0
  155. package/dist/umd/5352ecd8e5f1a2637b48e18cc406edb1.js +1 -0
  156. package/dist/umd/5398e3b596fa15df4d84b2aa0464e5c4.js +1 -0
  157. package/dist/umd/53e3600928916423671f3388e2d67844.js +1 -0
  158. package/dist/umd/54560f13b36626237959e93b7771a484.js +1 -0
  159. package/dist/umd/54a10f3bddad1e6da452fee7124fe846.js +1 -0
  160. package/dist/umd/57e14488b13e50ebdb5fdfc7880da683.js +1 -0
  161. package/dist/umd/57f4109bd1f06be4dc2bcb8ff7eaf1e5.js +1 -0
  162. package/dist/umd/582e24f5ba929e358fadfc7be4c18025.js +1 -0
  163. package/dist/umd/58598705e7012f4ca1eb1dd21d3c59a5.js +1 -0
  164. package/dist/umd/5861dfe4f2c7823623e82d0619c5bf06.js +1 -0
  165. package/dist/umd/58aab872dbdb5e1607076e1935130e03.js +1 -0
  166. package/dist/umd/58c35e5c73bbc1664bbd67c570342aa0.js +1 -0
  167. package/dist/umd/58e7f91772635a5c59bacc975735da6c.js +1 -0
  168. package/dist/umd/59cc05504a1c823b6d4796bf6b430822.js +1 -0
  169. package/dist/umd/5a496ae20cc576bef1d35972548207cf.js +1 -0
  170. package/dist/umd/5a741aab715866cb4d9a55e89dfc8420.js +1 -0
  171. package/dist/umd/5b6a626249d0bc43e412fffa6a9ee177.js +1 -0
  172. package/dist/umd/5cab33610b8d9c1aee4db4672811cb5f.js +1 -0
  173. package/dist/umd/5cd4e1282f4409600b942819b7aa4f21.js +1 -0
  174. package/dist/umd/5ce650c06c385f9d15621e54c60457c0.js +1 -0
  175. package/dist/umd/5cebfc2c3495b6294dcb2a99e5174872.js +1 -0
  176. package/dist/umd/5d312b184c1f4565f51247d3c6dbba90.js +1 -0
  177. package/dist/umd/5d3314103b00c8ea165c6f9f6757f794.js +1 -0
  178. package/dist/umd/5df362c9904925cdf574d9506e4be76d.js +1 -0
  179. package/dist/umd/5e55b301888460bd06c8e26d1011e01a.js +1 -0
  180. package/dist/umd/5e8a4f4320a07ae4bb1d8a5cd621d955.js +1 -0
  181. package/dist/umd/5f3ce6efab3c679ec1ad25ab0b3f6b2f.js +1 -0
  182. package/dist/umd/5f5a93ab1249b7cbdb13d9466febd3a0.js +1 -0
  183. package/dist/umd/5fedbf948ed123687f77167fac1faf8b.js +1 -0
  184. package/dist/umd/60190285b6c2243e14184b9e57d48dbb.js +1 -0
  185. package/dist/umd/603e2644074e6512faf427d511d47fe4.js +1 -0
  186. package/dist/umd/60ede8d7ffdf4c05f2ce51b6d8d2be68.js +1 -0
  187. package/dist/umd/6130486ae80b103700a2e1eec0bc5cea.js +1 -0
  188. package/dist/umd/622e27eec5f26148f51ccc30315a3deb.js +1 -0
  189. package/dist/umd/6250c7594cd66ca91184b5beca293e06.js +1 -0
  190. package/dist/umd/62a96977e725e8bc809dc80afe0fedf1.js +1 -0
  191. package/dist/umd/63596b4896732fb322ab0496b4be1e74.js +1 -0
  192. package/dist/umd/6490772da5aecc6cb9e4c625abc74a96.js +1 -0
  193. package/dist/umd/64a5f4d62507d032038dcd76d15188e1.js +1 -0
  194. package/dist/umd/64d6924350bd7706850cdc0dcc76ccf6.js +1 -0
  195. package/dist/umd/65e7cf62ca9df32c18b630f31025a401.js +1 -0
  196. package/dist/umd/663ffb67b9683a2126410325d1a5a152.js +1 -0
  197. package/dist/umd/669c462287be8fa855e0ac003c145b55.js +1 -0
  198. package/dist/umd/678f5201c1917429f334b88078ca4174.js +1 -0
  199. package/dist/umd/6a1c347ab79a93f3ac01b08c8ccfc827.js +1 -0
  200. package/dist/umd/6a851f05f1f4a974e02fe23eac2bad4e.js +1 -0
  201. package/dist/umd/6b4b87a54f673cfbb82be45329441bef.js +1 -0
  202. package/dist/umd/6bed1b724e74e6bc80688f42bc824d70.js +1 -0
  203. package/dist/umd/6c0a75dc5671c3f237a79f6e45b9891c.js +1 -0
  204. package/dist/umd/6c67587c2093ac3a19da9f2196e040b7.js +1 -0
  205. package/dist/umd/6c6d192b6860b4508a14c2d04769a35e.js +1 -0
  206. package/dist/umd/6d0c0aa17d36cb16bafc76d7376b97f7.js +1 -0
  207. package/dist/umd/6d38cef4a006e6cfe54a6117aba7b600.js +1 -0
  208. package/dist/umd/6e40b726d91e9138d9eaef6fd012c740.js +1 -0
  209. package/dist/umd/6faa9e5f2a0122d2333fa450337a09b0.js +1 -0
  210. package/dist/umd/70074e0c785c9a808dea76c7c7d17af3.js +1 -0
  211. package/dist/umd/70286c33cab463fd576766adecd2d5d9.js +1 -0
  212. package/dist/umd/70289d3b9b2b851df3286e20e40410a6.js +1 -0
  213. package/dist/umd/7080d2a1db1608264a6d9d9fbaf2cce8.js +1 -0
  214. package/dist/umd/70efbabef77fb217f904f41dbf7fe8bf.js +1 -0
  215. package/dist/umd/714763ddd9bd466c95df7b042900bb87.js +1 -0
  216. package/dist/umd/7222998c10fabd9c824cf8cf540b3b74.js +1 -0
  217. package/dist/umd/724a16861717b5b4f786d24b56b62614.js +1 -0
  218. package/dist/umd/7259bceba25ac1476fc775122a63d249.js +1 -0
  219. package/dist/umd/725da29f1643c2263a437c08a1454aea.js +1 -0
  220. package/dist/umd/742afd6665dee8dafd43661093bdda9d.js +1 -0
  221. package/dist/umd/755114145e5b97e5571a160a39e716db.js +1 -0
  222. package/dist/umd/757ef1b870d065a77ce3c182a03d93ad.js +1 -0
  223. package/dist/umd/7648d83718f74149cb2db078b19fb7db.js +1 -0
  224. package/dist/umd/764b59bdd3a89e14f88c9d63020551a1.js +1 -0
  225. package/dist/umd/77aaca51c1c32acaf32656d45f4dc017.js +1 -0
  226. package/dist/umd/78632dc7e1875ec8c39416f645e53733.js +1 -0
  227. package/dist/umd/79241f85b016a7332f85bb66667459c2.js +1 -0
  228. package/dist/umd/79455ab9a6cd507f5314141cc965093a.js +1 -0
  229. package/dist/umd/7aa17a5a81c83c0f455941b3b286d5da.js +1 -0
  230. package/dist/umd/7b839a5c1f6d89538928c8a29003bbda.js +1 -0
  231. package/dist/umd/7bc18fc7a7d1323c178aa1846d79fb3c.js +1 -0
  232. package/dist/umd/7d64980faff5b041a461fd0ba3e2f3f5.js +1 -0
  233. package/dist/umd/7e4099fc2d04c7c1cf96892b962ba4ec.js +1 -0
  234. package/dist/umd/7ec97a8161bf26e434d3891f64adb15b.js +1 -0
  235. package/dist/umd/7f45be8b3fab8d742afc26fc48a23d2e.js +1 -0
  236. package/dist/umd/7f79d4bde67c8013b187889b63e25bce.js +1 -0
  237. package/dist/umd/7f9a9efc9ab681fcbf6400e2adb368a9.js +1 -0
  238. package/dist/umd/805cb6232d7a9fa46025d48a43622ecf.js +1 -0
  239. package/dist/umd/80ddbf4f0fdde4ddba57130e61043017.js +1 -0
  240. package/dist/umd/81318a3530fb35d5178eb7a4a13a606f.js +1 -0
  241. package/dist/umd/817edb0c6f9d66f9c0027762edb1d797.js +1 -0
  242. package/dist/umd/827c1cbf746eacfc23ed2037e4d6359d.js +1 -0
  243. package/dist/umd/83387cb17a7680f59240e7b399e3ac2b.js +1 -0
  244. package/dist/umd/839e3594798c1942d3c92f9acfaa5f0b.js +1 -0
  245. package/dist/umd/83bd353f98aa901411c82b8af58d1296.js +1 -0
  246. package/dist/umd/84270e22d4439d15b0d8f392d1338d8e.js +1 -0
  247. package/dist/umd/843c762c24f7fac628d8c62519a7b308.js +1 -0
  248. package/dist/umd/84abf03cc94d264bb38020b4ac5f76e1.js +1 -0
  249. package/dist/umd/84effdea6b72577c780f6621246d2e82.js +1 -0
  250. package/dist/umd/852f0ecd7b17e3bfd700a821ff438f7e.js +1 -0
  251. package/dist/umd/8646c11c7b2b46a2b2becab0d9e549c7.js +1 -0
  252. package/dist/umd/875ae58e8015a6d08dbc9d0c04e24638.js +1 -0
  253. package/dist/umd/879d6bc1ca1dde95a9a98dc7a2ab0d06.js +1 -0
  254. package/dist/umd/87bce6f50196688852142c679227b1b9.js +1 -0
  255. package/dist/umd/880ae94877022f7fb0458ced0825eb4c.js +1 -0
  256. package/dist/umd/88730abfeb4a23e692ac7933882f12eb.js +1 -0
  257. package/dist/umd/88da0e09d486e197aaca5bc3d6350998.js +1 -0
  258. package/dist/umd/88e2feda80ac8cfb28f1dc0ec833b40d.js +1 -0
  259. package/dist/umd/894052ca1f8f35cc1cf7cfb29ef75027.js +1 -0
  260. package/dist/umd/894edcaf39c3c95818e3949d737ed459.js +1 -0
  261. package/dist/umd/8a31266178067a316bb2503147cdb5cb.js +1 -0
  262. package/dist/umd/8a5127228870aafabfff6111d29313d6.js +1 -0
  263. package/dist/umd/8b8336037f074d9dcbd20eab535b803f.js +1 -0
  264. package/dist/umd/8c7616f0adba6a5ac0d2f06ba4ebd696.js +1 -0
  265. package/dist/umd/8d9bb1799d9b98db107e84f10132e17f.js +1 -0
  266. package/dist/umd/8ed58ed9c7e1cb1ae1f2830d29011ffb.js +1 -0
  267. package/dist/umd/8ed5aba33ead1f94e97d5c35a5e93434.js +1 -0
  268. package/dist/umd/8eede17ae9e4d25c3c17b8a8a7fc3c3d.js +1 -0
  269. package/dist/umd/8f9ce72eeabbf31f2d51f4bcfc66d3b0.js +1 -0
  270. package/dist/umd/90812d89181b698975cbb081adcbbcb0.js +1 -0
  271. package/dist/umd/90f3dc3c18d447104b63c156cb7fddb5.js +1 -0
  272. package/dist/umd/91beb08737a1bbf071f351fb0acdbf3c.js +1 -0
  273. package/dist/umd/92f4aab5c66f6269c7054c8fbcb3de13.js +1 -0
  274. package/dist/umd/950a205e91da7e78226dd785fd6d34db.js +1 -0
  275. package/dist/umd/962969a46fefcace3305abd4d6e14a2e.js +1 -0
  276. package/dist/umd/9696a4229fb787eeb25b26f1274b75ee.js +1 -0
  277. package/dist/umd/96b8d8b5efd11741639659c63a485c27.js +1 -0
  278. package/dist/umd/972ea4b6ab9d3baeab6d00057cd5f9d3.js +1 -0
  279. package/dist/umd/9807cf1e443a7440371904b6525f37eb.js +1 -0
  280. package/dist/umd/981bd23edacd811f9e4a583d89b544ee.js +1 -0
  281. package/dist/umd/9827973b533de05b338533a0211d97d9.js +1 -0
  282. package/dist/umd/983fccb9f00748c487e889f6c83aa367.js +1 -0
  283. package/dist/umd/9920e03a65566d728a73c7bf18bc5741.js +1 -0
  284. package/dist/umd/99add2656ccb006ff11de385c4219f41.js +1 -0
  285. package/dist/umd/9b1fd9cf4206cc32e84150c49707d811.js +1 -0
  286. package/dist/umd/9b4733fc7a2fe9aedb0fa242bd49e9f0.js +1 -0
  287. package/dist/umd/9b4de1346c73ba258736f1a3f00fdc14.js +1 -0
  288. package/dist/umd/9b5a6ec07bb0a2daade10189696fc399.js +1 -0
  289. package/dist/umd/9b80d1a12acd18c90e41ca92073122a7.js +1 -0
  290. package/dist/umd/9b9578869f378f8e2afbf85a76c0ac72.js +1 -0
  291. package/dist/umd/9ebb9ac2c9c875649c72722bc585d445.js +1 -0
  292. package/dist/umd/9ed8c3550b5c3c1e878d0692f0338cb7.js +1 -0
  293. package/dist/umd/9fa80a5bc14fe8644697fe0dd7b99431.js +1 -0
  294. package/dist/umd/9fd3f255cfd09016ec7f4896bc51864c.js +1 -0
  295. package/dist/umd/a0e32ba94aa4384823d768802b9486e1.js +1 -0
  296. package/dist/umd/a1c8660c5bcc6b6a43a7fb3c351174d9.js +1 -0
  297. package/dist/umd/a223748cd69094dd12b486353b22f479.js +1 -0
  298. package/dist/umd/a2746fc96d535b19c120d4b87dc86ef1.js +1 -0
  299. package/dist/umd/a2b29b879b9e8606085c0d3776f789ca.js +1 -0
  300. package/dist/umd/a34efdb6282815cdc27d2f83352b59e0.js +1 -0
  301. package/dist/umd/a3dfa410d90c00078f4b015410048f34.js +1 -0
  302. package/dist/umd/a41ce517e26d17d855b7224af9ee433b.js +1 -0
  303. package/dist/umd/a496f663a8cf2dc047e12d8a80d76510.js +1 -0
  304. package/dist/umd/a4bedde07e392f8ebf64341b61f75df2.js +1 -0
  305. package/dist/umd/a4d638b976f02f35740be031f996e088.js +1 -0
  306. package/dist/umd/a4e021a4b5d5d65cc87fee17c1886c3f.js +1 -0
  307. package/dist/umd/a52f9ac0e3d582ed7e488aa1dfc33eda.js +1 -0
  308. package/dist/umd/a533e643002830be2da76c9527265860.js +1 -0
  309. package/dist/umd/a569591af2f834ec4b58f43ab7742186.js +1 -0
  310. package/dist/umd/a678d4dedcc646810a379211797d5294.js +1 -0
  311. package/dist/umd/a6eb87af5cd7ae7e4fcba8ec606ec4ba.js +1 -0
  312. package/dist/umd/a709bba98acec5da3ea6258e245514cb.js +1 -0
  313. package/dist/umd/a9cb92db2399f7ac97ad55fe79fe5c20.js +1 -0
  314. package/dist/umd/a9f61cc92a7407c8ca0a5843b29d7a57.js +1 -0
  315. package/dist/umd/aa0417796df2b0398a45c00f93f37ea4.js +1 -0
  316. package/dist/umd/aa0eee504d52a12d3a30bbd523afcc34.js +1 -0
  317. package/dist/umd/aa5623ec68d23fedb9c9c115c7d99063.js +1 -0
  318. package/dist/umd/ab0128ab12bcb8729032421b40f5f8dd.js +1 -0
  319. package/dist/umd/ab237eed5fd16ab99c06f0d28d465edb.js +1 -0
  320. package/dist/umd/ab720dd0a0fd070ad82c052263f748e2.js +1 -0
  321. package/dist/umd/ac54fd77986affc0a122d325788b34d3.js +1 -0
  322. package/dist/umd/af1635b600efd13f6059eb6ac9deae12.js +1 -0
  323. package/dist/umd/af6fdb556ee3f9065578bb01f81f6216.js +1 -0
  324. package/dist/umd/afba1f28f2baa29eae717d6cb03f5464.js +1 -0
  325. package/dist/umd/b02d982ccb1011197a5a24800b178a0a.js +1 -0
  326. package/dist/umd/b03bc4e99280d8b4dfd1c6cddedfbd76.js +1 -0
  327. package/dist/umd/b10accbff47791a59b8494225af07025.js +1 -0
  328. package/dist/umd/b1170472ae4b50e3b0070eb991e502fe.js +1 -0
  329. package/dist/umd/b1e349371cb9c226905c846706ad8b93.js +1 -0
  330. package/dist/umd/b1f3f77a9279cdb38846ebe13c3438bc.js +1 -0
  331. package/dist/umd/b20cd9acf45420fcacfd923754185663.js +1 -0
  332. package/dist/umd/b24bb117549d04501b98ffb66b427e0f.js +1 -0
  333. package/dist/umd/b275e591896df64fa3202d90ae70c583.js +1 -0
  334. package/dist/umd/b2d62f22463367ca31dfdbc615637c32.js +1 -0
  335. package/dist/umd/b306285dfd802d091e788de0f96b8cb2.js +1 -0
  336. package/dist/umd/b33ef9b4202539d3690251cb8213a034.js +1 -0
  337. package/dist/umd/b3f1431b9e6d9e6632a93c2cd89f945b.js +1 -0
  338. package/dist/umd/b676b876040015b30352b3cda5e243b7.js +1 -0
  339. package/dist/umd/b714a3647ca66ab7685eb0437c9e3a8d.js +1 -0
  340. package/dist/umd/b808fb222140a85b23ebbe0fffa906d9.js +1 -0
  341. package/dist/umd/b881dca9d9a80f61d87374b4bd5a2dd5.js +1 -0
  342. package/dist/umd/b8b6bd460e7da0ba8f3b2218327966ee.js +1 -0
  343. package/dist/umd/b934b22e8f8a8b1ba81dbc2cf058b0cd.js +1 -0
  344. package/dist/umd/b953ce2f19e7291598cd9c05128133c1.js +1 -0
  345. package/dist/umd/b992b348ffb6453e4a02a60e71c5304e.js +1 -0
  346. package/dist/umd/b9bf918956902d11645efb99e2ab5293.js +1 -0
  347. package/dist/umd/ba6b8b3e06cd9d0aee9c69278ee84647.js +1 -0
  348. package/dist/umd/bb1365c0983ce5ad50060b24788b9630.js +1 -0
  349. package/dist/umd/bb1de0986c4fb3ee31c5a413b8f97c94.js +1 -0
  350. package/dist/umd/bb5bab7a675544fe31ddb7f4a77dffb9.js +1 -0
  351. package/dist/umd/bd309bb3f23f2bfbcf914f2e71474ab5.js +1 -0
  352. package/dist/umd/be75b76e74c78535966ec8aaa7d46bec.js +1 -0
  353. package/dist/umd/bf37de323316c6ae5745fc11fd576b1c.js +1 -0
  354. package/dist/umd/c19292ad0187d75dd9580319cbfd5688.js +1 -0
  355. package/dist/umd/c1a1f4ba29aa2d9a0b1a1abe5cfee0c6.js +1 -0
  356. package/dist/umd/c2999cd0bf63072240931010a45c21da.js +1 -0
  357. package/dist/umd/c2f4581864c135dff9056745035d3914.js +1 -0
  358. package/dist/umd/c2fa476995041f9982b89a1c483da2b9.js +1 -0
  359. package/dist/umd/c3832579be376308fa819b04e7b0c66f.js +1 -0
  360. package/dist/umd/c3f345c994392d97785925e790513a9f.js +1 -0
  361. package/dist/umd/c428d0ff296b8b683347a18896d72015.js +1 -0
  362. package/dist/umd/c4e58637b4d14c303e29d3ce4b4a210f.js +1 -0
  363. package/dist/umd/c51840077c684be0e7e13339f85cd4a9.js +1 -0
  364. package/dist/umd/c530988d2b1966fd10a4d99fa3877e1b.js +1 -0
  365. package/dist/umd/c5647f3b9e799d1b9818e80796f8a574.js +1 -0
  366. package/dist/umd/c64d6e1e72024bb5d3d3e9bfc19d183d.js +1 -0
  367. package/dist/umd/c6938ce24c731f9ee703747909cd2aad.js +1 -0
  368. package/dist/umd/c80e89199aef31e48addb2b35ea96365.js +1 -0
  369. package/dist/umd/c8230f96396f0378d032dce2be3dce66.js +1 -0
  370. package/dist/umd/c8acc93023012737a3bf8fb767b66838.js +1 -0
  371. package/dist/umd/c93947dfac92c92c3999d1d51fc5b516.js +1 -0
  372. package/dist/umd/c9568507cc8ea516d091749c7919b744.js +1 -0
  373. package/dist/umd/cb0d121a88477f943960f5ad60602c22.js +1 -0
  374. package/dist/umd/cb4bb785934eeca9b408e892ae6b73b7.js +1 -0
  375. package/dist/umd/cb5746e29527a2fdb9f857a121e086ed.js +1 -0
  376. package/dist/umd/cb652f200fc3dd740b2e7f678a9272ea.js +1 -0
  377. package/dist/umd/cb9910e014b468ada91393696fcad206.js +1 -0
  378. package/dist/umd/cbdbd623038183a8c068dd24ecd90682.js +1 -0
  379. package/dist/umd/cbdc4ca43a8c940a6c3f59a8b6f17df5.js +1 -0
  380. package/dist/umd/cc0de4981277622a9017f137023a6dd5.js +1 -0
  381. package/dist/umd/cc65d108f0e7cfb200de1d0bcf115005.js +1 -0
  382. package/dist/umd/cd9a17f94a922c7c88000b1b3cdd67df.js +1 -0
  383. package/dist/umd/cf188b3f83735389d47bb12fc9f7069a.js +1 -0
  384. package/dist/umd/cf26dd07f19bcb5b7efbf057a6cfeb8f.js +1 -0
  385. package/dist/umd/cf3f6b1c74c72cb5d02870022dbc9f94.js +1 -0
  386. package/dist/umd/cf909ad6e321c2f98750f5c3581556f8.js +1 -0
  387. package/dist/umd/cf9c7cbfc2b609b9ae59daeab82719c4.js +1 -0
  388. package/dist/umd/cfaaa83ec3973688a7946b95b597c228.js +1 -0
  389. package/dist/umd/d0415105402964718010284fcfa8b2ea.js +1 -0
  390. package/dist/umd/d09463c099fb2c44719380623a5c68fb.js +1 -0
  391. package/dist/umd/d1a1ee70e5eed28571ae9c619f33de7c.js +1 -0
  392. package/dist/umd/d1db2c4677dd2ee7a0c690c58798a013.js +1 -0
  393. package/dist/umd/d43ad5f9bad9a042b49b2592c7639c28.js +1 -0
  394. package/dist/umd/d4ad4ca9643d85d3990bfefe29cb3bb0.js +1 -0
  395. package/dist/umd/d4f1a314cb3668f8e17f24bccf0229b6.js +1 -0
  396. package/dist/umd/d4f5981ee5a73d8a6e19112f2ffcb72c.js +1 -0
  397. package/dist/umd/d542dda7308361c34af2afb9b70d755a.js +1 -0
  398. package/dist/umd/d5999827bd3af6b813a871de344b109a.js +1 -0
  399. package/dist/umd/d5a6140d581e5c4eb200259ce372f40b.js +1 -0
  400. package/dist/umd/d5f79987405c2169278f8de37bcc9d05.js +1 -0
  401. package/dist/umd/d7340300249ab98bd9b3f538a767106e.js +1 -0
  402. package/dist/umd/d78d3b050ea95b068380d975fd413fd7.js +1 -0
  403. package/dist/umd/d7d616d4aa8fd3f51d681242853dcde9.js +1 -0
  404. package/dist/umd/d83cda12aee0c87c8b381a1234bf7798.js +1 -0
  405. package/dist/umd/d869a443b727ea4b7cef2de0ff2a6ed8.js +1 -0
  406. package/dist/umd/d8f7ecdd496f3caf14f5afbedfff1937.js +1 -0
  407. package/dist/umd/d9b2daf38414fcbaf89924ad3e10e587.js +1 -0
  408. package/dist/umd/da740c1b29a85b999a6874b59a1baeef.js +1 -0
  409. package/dist/umd/db8ca5cfb6fe4aaef215f116f6991784.js +1 -0
  410. package/dist/umd/dc8240db39815020378555a4d80571c3.js +1 -0
  411. package/dist/umd/dc83a73f0eb89665520bbb6672dfa3cb.js +1 -0
  412. package/dist/umd/dc932cde2fbfca8e2901fb693968b131.js +1 -0
  413. package/dist/umd/ddbc961769cd2ff4d4a7a136168ebf4c.js +1 -0
  414. package/dist/umd/de0fd4fd7c2d7a4887cbc99eed91f797.js +1 -0
  415. package/dist/umd/de73b4d2a9ed4bcb851f9141e303636d.js +1 -0
  416. package/dist/umd/e0adad8a8579bf99f3e22f7c214a5c64.js +1 -0
  417. package/dist/umd/e0c565aadda4787ba4ef4456c0a7ee29.js +1 -0
  418. package/dist/umd/e0fa6a4fe8bff90d50ce812e666957ca.js +1 -0
  419. package/dist/umd/e13fc7d468ab9b5797f2a44412ca2f00.js +1 -0
  420. package/dist/umd/e2b38a8393be2cf23f3894ace3efb1c3.js +1 -0
  421. package/dist/umd/e2fe8f0d4fd950b20b30fabaea96b3f8.js +1 -0
  422. package/dist/umd/e37ac12436bcd0536ec98ae8470a1228.js +1 -0
  423. package/dist/umd/e4917fa7632b01d28e99304d32d989f7.js +1 -0
  424. package/dist/umd/e61779df91186b23e7adf2d1968b2708.js +1 -0
  425. package/dist/umd/e6ad50b520736b595970c9e07029c3f1.js +1 -0
  426. package/dist/umd/e7e1a807af3160b342e0a3550cf8f7c5.js +1 -0
  427. package/dist/umd/e7f37e0f2b6113039c45a326264c4d36.js +1 -0
  428. package/dist/umd/e80d5ee40455d0675f8f2a3688071adf.js +1 -0
  429. package/dist/umd/e874d975c9128dc6eb9a513d088bed9f.js +1 -0
  430. package/dist/umd/e9382a0e67b22188c75e9418de1c9295.js +1 -0
  431. package/dist/umd/e9c8f7e13e00284ce126890bf7ac46fd.js +1 -0
  432. package/dist/umd/ea6edcde22c9fdbb9f7b8d9cf72a062b.js +1 -0
  433. package/dist/umd/eaa55a522fb2cb2f0287711f42344984.js +1 -0
  434. package/dist/umd/eb08efe1d361a9c5e37e1d4c8100212e.js +1 -0
  435. package/dist/umd/eb0b62e1895dcf7491419aa728f00c38.js +1 -0
  436. package/dist/umd/ecdb4966f685f3e44b1f28fae46827a3.js +1 -0
  437. package/dist/umd/ecff3d4bbf59ef41230960af46098e74.js +1 -0
  438. package/dist/umd/ed88b2c21452a7eaea143e54e27a0879.js +1 -0
  439. package/dist/umd/ee41eb1fd1d1c87c45e818b5a8a65cf8.js +1 -0
  440. package/dist/umd/ee5d36473f84db2af26d82efd69a38ec.js +1 -0
  441. package/dist/umd/ef6cac9d9a3156e1c19b46cd181863ed.js +1 -0
  442. package/dist/umd/ef7dedac6423354de55896b34230d548.js +1 -0
  443. package/dist/umd/ef87482c92662e8b69a21f47588474ea.js +1 -0
  444. package/dist/umd/efc14cdf19554635e477781704353ec2.js +1 -0
  445. package/dist/umd/eff4371180dfac54de25ed3a0105d82f.js +1 -0
  446. package/dist/umd/f15362a7feef894b2e7f706252e6c510.js +1 -0
  447. package/dist/umd/f15cbf0d23cba4a313f3f2acfef5370c.js +1 -0
  448. package/dist/umd/f18c12f0446bad25ec3732c621d60f88.js +1 -0
  449. package/dist/umd/f2fb7fcc9bdd849d687150c07a81ffe4.js +1 -0
  450. package/dist/umd/f326f2f263b1498fedbe1d07d7254d10.js +1 -0
  451. package/dist/umd/f4480bd3d93cb0949fc4f3af8eff6531.js +1 -0
  452. package/dist/umd/f5655f072ce70050c78fab024d5028a8.js +1 -0
  453. package/dist/umd/f666b5647087bcfdf6623f8b14d56657.js +1 -0
  454. package/dist/umd/f6d7091e70dee6c74956acfef2464d08.js +1 -0
  455. package/dist/umd/f799992a362826cff3c7d1ce9dc9940c.js +1 -0
  456. package/dist/umd/fa0c561bb37040fc8145e5c70ea64912.js +1 -0
  457. package/dist/umd/fb393a7455b47f3d4fc30cf219d5145c.js +1 -0
  458. package/dist/umd/fb5080213f065f82f0391c551c864434.js +1 -0
  459. package/dist/umd/fd3859a700b456e06c65c0cf6b0af05c.js +1 -0
  460. package/dist/umd/fd5bc50b18c9f46380cbe5ec1ac2127b.js +1 -0
  461. package/dist/umd/fd9645aaf1f70c8abc562be41bee25fc.js +1 -0
  462. package/dist/umd/fd98f0e48b18e1de428edd5174539c2a.js +1 -0
  463. package/dist/umd/fe9499c0a5444f7f42843fa00fb355cb.js +1 -0
  464. package/dist/umd/fec23c6964d6cf25681d1f3e24b076a4.js +1 -0
  465. package/dist/umd/ffd3b83e8b5878f4785591ff54b1dfff.js +1 -0
  466. package/dist/umd/index.js +2806 -0
  467. package/dist/umd/index.js.LICENSE.txt +179 -0
  468. package/dist/umd/index.orbundle.js +5306 -0
  469. package/dist/umd/index.orbundle.js.LICENSE.txt +257 -0
  470. package/lib/index.js +4 -4
  471. package/lib/index.js.map +1 -1
  472. package/lib/or-dashboard-tree.js +7 -2
  473. package/lib/or-dashboard-tree.js.map +1 -1
  474. package/lib/or-dashboard-widgetcontainer.d.ts +4 -2
  475. package/lib/or-dashboard-widgetcontainer.js +2 -2
  476. package/lib/or-dashboard-widgetcontainer.js.map +1 -1
  477. package/lib/service/widget-service.js +1 -1
  478. package/lib/service/widget-service.js.map +1 -1
  479. package/lib/settings/gateway-settings.d.ts +19 -0
  480. package/lib/settings/gateway-settings.js +46 -0
  481. package/lib/settings/gateway-settings.js.map +1 -0
  482. package/lib/settings/gauge-settings.d.ts +0 -1
  483. package/lib/settings/gauge-settings.js +8 -8
  484. package/lib/settings/gauge-settings.js.map +1 -1
  485. package/lib/settings/image-settings.js +1 -1
  486. package/lib/settings/image-settings.js.map +1 -1
  487. package/lib/widgets/gateway-widget.d.ts +84 -0
  488. package/lib/widgets/gateway-widget.js +47 -0
  489. package/lib/widgets/gateway-widget.js.map +1 -0
  490. package/package.json +7 -7
  491. package/src/index.ts +33 -8
  492. package/src/or-dashboard-tree.ts +5 -0
  493. package/src/or-dashboard-widgetcontainer.ts +17 -6
  494. package/src/service/widget-service.ts +7 -1
  495. package/src/settings/gateway-settings.ts +144 -0
  496. package/src/settings/gauge-settings.ts +21 -5
  497. package/src/settings/image-settings.ts +1 -1
  498. package/src/widgets/gateway-widget.ts +386 -0
  499. package/tsconfig.tsbuildinfo +1 -1
  500. package/webpack.config.js +1 -1
  501. package/lib/or-dashboard-settingspanel.d.ts +0 -44
  502. package/lib/or-dashboard-settingspanel.js +0 -216
  503. package/lib/or-dashboard-settingspanel.js.map +0 -1
  504. package/lib/or-dashboard-widget.d.ts +0 -18
  505. package/lib/or-dashboard-widget.js +0 -15
  506. package/lib/or-dashboard-widget.js.map +0 -1
  507. package/lib/widgets/or-base-widget.d.ts +0 -15
  508. package/lib/widgets/or-base-widget.js +0 -1
  509. package/lib/widgets/or-base-widget.js.map +0 -1
  510. package/lib/widgets/or-chart-widget.d.ts +0 -36
  511. package/lib/widgets/or-chart-widget.js +0 -112
  512. package/lib/widgets/or-chart-widget.js.map +0 -1
  513. package/lib/widgets/or-gauge-widget.d.ts +0 -46
  514. package/lib/widgets/or-gauge-widget.js +0 -60
  515. package/lib/widgets/or-gauge-widget.js.map +0 -1
  516. package/lib/widgets/or-kpi-widget.d.ts +0 -44
  517. package/lib/widgets/or-kpi-widget.js +0 -63
  518. package/lib/widgets/or-kpi-widget.js.map +0 -1
  519. package/lib/widgets/or-map-widget.d.ts +0 -49
  520. package/lib/widgets/or-map-widget.js +0 -75
  521. package/lib/widgets/or-map-widget.js.map +0 -1
@@ -0,0 +1,144 @@
1
+ import { customElement } from "lit/decorators.js";
2
+ import {WidgetSettings} from "../util/widget-settings";
3
+ import {TemplateResult, html} from "lit";
4
+ import { InputType, OrInputChangedEvent } from "@openremote/or-mwc-components/or-mwc-input";
5
+ import {i18next} from "@openremote/or-translate";
6
+ import {Asset, AssetQuery, GatewayTunnelInfoType} from "@openremote/model";
7
+ import {GatewayWidgetConfig} from "../widgets/gateway-widget";
8
+ import {Task} from "@lit/task";
9
+ import manager from "@openremote/core";
10
+
11
+ @customElement("gateway-settings")
12
+ export class GatewaySettings extends WidgetSettings {
13
+
14
+ protected GATEWAY_ASSET_TYPES: string[] = ["GatewayAsset"];
15
+ protected GATEWAY_TUNNEL_TYPES: GatewayTunnelInfoType[] = [GatewayTunnelInfoType.HTTPS, GatewayTunnelInfoType.HTTP, GatewayTunnelInfoType.TCP];
16
+
17
+ // Override of widgetConfig with extended type
18
+ protected readonly widgetConfig!: GatewayWidgetConfig;
19
+
20
+ connectedCallback() {
21
+ super.connectedCallback();
22
+ }
23
+
24
+ protected render(): TemplateResult {
25
+ const disabled = !this.widgetConfig.gatewayId;
26
+ return html`
27
+ <div>
28
+ <settings-panel displayName="gatewayTunnels.settings" expanded="${true}">
29
+ <div style="display: flex; flex-direction: column; gap: 8px;">
30
+ <div>
31
+ ${this._fetchAssetsTask.render({
32
+ pending: () => html`
33
+ <or-mwc-input .type="${InputType.SELECT}" compact style="width: 100%;" disabled
34
+ label="${i18next.t('gatewayTunnels.selectAsset')}"
35
+ ></or-mwc-input>
36
+ `,
37
+ complete: (gatewayAssets) => {
38
+ const options: [string, string][] = gatewayAssets.map(a => [a.id, a.name]);
39
+ const selected = gatewayAssets.find(a => a.id === this.widgetConfig.gatewayId);
40
+ const value = selected ? [selected.id, selected.name] as [string, string] : undefined;
41
+ return html`
42
+ <or-mwc-input .type="${InputType.SELECT}" compact style="width: 100%;"
43
+ .options="${options}" .value="${value}"
44
+ label="${i18next.t('gatewayTunnels.selectAsset')}"
45
+ @or-mwc-input-changed="${(ev: OrInputChangedEvent) => this._onAssetSelect(ev)}"
46
+ ></or-mwc-input>
47
+ `;
48
+ },
49
+ error: () => html`
50
+ <or-mwc-input .type="${InputType.TEXT}" compact style="width: 100%;" disabled
51
+ label="${i18next.t('gatewayTunnels.selectAsset')}" .value="${i18next.t('errorOccurred')}"
52
+ ></or-mwc-input>
53
+ `
54
+ })}
55
+ </div>
56
+ <div>
57
+ <or-mwc-input .type="${InputType.SELECT}" compact style="width: 100%;"
58
+ .disabled="${disabled}" .options="${this.GATEWAY_TUNNEL_TYPES}" .value="${this.widgetConfig.type}"
59
+ label="${i18next.t('gatewayTunnels.protocol')}"
60
+ @or-mwc-input-changed="${(ev: OrInputChangedEvent) => this._onTunnelTypeSelect(ev)}"
61
+ ></or-mwc-input>
62
+ </div>
63
+ <div>
64
+ <or-mwc-input .type="${InputType.TEXT}" style="width: 100%;"
65
+ .disabled="${disabled}" .value="${this.widgetConfig.target}"
66
+ label="${i18next.t('gatewayTunnels.target')}"
67
+ @or-mwc-input-changed="${(ev: OrInputChangedEvent) => this._onTunnelTargetSelect(ev)}"
68
+ ></or-mwc-input>
69
+ </div>
70
+ <div>
71
+ <or-mwc-input .type="${InputType.NUMBER}" style="width: 100%;"
72
+ .disabled="${disabled}" .value="${this.widgetConfig.targetPort}"
73
+ label="${i18next.t('gatewayTunnels.targetPort')}"
74
+ @or-mwc-input-changed="${(ev: OrInputChangedEvent) => this._onTunnelTargetPortSelect(ev)}"
75
+ ></or-mwc-input>
76
+ </div>
77
+ </div>
78
+ </settings-panel>
79
+ </div>
80
+ `;
81
+ }
82
+
83
+ protected _onAssetSelect(ev: OrInputChangedEvent): void {
84
+ this.widgetConfig.gatewayId = ev.detail.value;
85
+ this.notifyConfigUpdate();
86
+ }
87
+
88
+ protected _onTunnelTypeSelect(ev: OrInputChangedEvent) {
89
+ this.widgetConfig.type = ev.detail.value;
90
+ this.notifyConfigUpdate();
91
+ }
92
+
93
+ protected _onTunnelTargetSelect(ev: OrInputChangedEvent) {
94
+ this.widgetConfig.target = ev.detail.value;
95
+ this.notifyConfigUpdate();
96
+ }
97
+
98
+ protected _onTunnelTargetPortSelect(ev: OrInputChangedEvent) {
99
+ this.widgetConfig.targetPort = ev.detail.value;
100
+ this.notifyConfigUpdate();
101
+ }
102
+
103
+
104
+ protected _fetchAssetsTask = new Task(this, {
105
+ task: async ([], {signal}) => {
106
+ return await this._fetchAssets(true, signal);
107
+ },
108
+ args: () => []
109
+ });
110
+
111
+ protected async _fetchAssets(requireTunnelSupport = true, signal?: AbortSignal): Promise<Asset[]> {
112
+ const query = {
113
+ realm: {name: manager.displayRealm},
114
+ select: {attributes: ["tunnelingSupported"]},
115
+ types: this.GATEWAY_ASSET_TYPES,
116
+ attributes: requireTunnelSupport ? {
117
+ items: [
118
+ {
119
+ name: {
120
+ predicateType: "string",
121
+ value: "tunnelingSupported"
122
+ },
123
+ value: {
124
+ predicateType: "boolean",
125
+ value: true
126
+ },
127
+ },
128
+ {
129
+ name: {
130
+ predicateType: "string",
131
+ value: "gatewayStatus"
132
+ },
133
+ value: {
134
+ predicateType: "string",
135
+ value: "CONNECTED"
136
+ },
137
+ }
138
+ ]
139
+ } : undefined
140
+ } as AssetQuery;
141
+ return (await manager.rest.api.AssetResource.queryAssets(query)).data;
142
+ }
143
+
144
+ }
@@ -7,7 +7,6 @@ import {AttributesSelectEvent} from "../panels/attributes-panel";
7
7
  import {Attribute} from "@openremote/model";
8
8
  import { InputType, OrInputChangedEvent } from "@openremote/or-mwc-components/or-mwc-input";
9
9
  import {ThresholdChangeEvent} from "../panels/thresholds-panel";
10
- import "../panels/thresholds-panel";
11
10
 
12
11
  @customElement("gauge-settings")
13
12
  export class GaugeSettings extends WidgetSettings {
@@ -72,10 +71,27 @@ export class GaugeSettings extends WidgetSettings {
72
71
 
73
72
  protected onMinMaxValueChange(type: 'min' | 'max', ev: OrInputChangedEvent) {
74
73
  switch (type) {
75
- case "max":
76
- this.widgetConfig.max = ev.detail.value; break;
77
- case "min":
78
- this.widgetConfig.min = ev.detail.value; break;
74
+ case "max": {
75
+ this.widgetConfig.max = ev.detail.value;
76
+
77
+ // Make sure every threshold value is not higher than what is allowed.
78
+ const sortedThresholds = this.widgetConfig.thresholds.sort((x, y) => y[0] - x[0]);
79
+ sortedThresholds.forEach((t, index) => {
80
+ t[0] = Math.max(Math.min(t[0], (ev.detail.value - index - 1)), this.widgetConfig.min);
81
+ });
82
+ break;
83
+ }
84
+ case "min": {
85
+ this.widgetConfig.min = ev.detail.value;
86
+
87
+ // Update the lowest (locked) threshold value to minimum value, and make sure every threshold value is not lower than what is allowed.
88
+ const sortedThresholds = this.widgetConfig.thresholds.sort((x, y) => (x[0] < y[0]) ? -1 : 1);
89
+ sortedThresholds[0][0] = ev.detail.value;
90
+ sortedThresholds.forEach((t, index) => {
91
+ t[0] = Math.min(Math.max(t[0], (ev.detail.value + index)), this.widgetConfig.max);
92
+ })
93
+ break;
94
+ }
79
95
  }
80
96
  this.notifyConfigUpdate();
81
97
  }
@@ -53,7 +53,7 @@ export class ImageSettings extends AssetWidgetSettings {
53
53
  return html`
54
54
  <div>
55
55
  <!-- Attributes selector -->
56
- <settings-panel displayName="'attributes" expanded="${true}">
56
+ <settings-panel displayName="attributes" expanded="${true}">
57
57
  <attributes-panel .attributeRefs="${this.widgetConfig.attributeRefs}" onlyDataAttrs="${false}" multi="${true}"
58
58
  @attribute-select="${(ev: AttributesSelectEvent) => this.onAttributesSelect(ev)}"
59
59
  ></attributes-panel>
@@ -0,0 +1,386 @@
1
+ import {customElement, state} from "lit/decorators.js";
2
+ import {OrWidget, WidgetManifest} from "../util/or-widget";
3
+ import {css, html, PropertyValues, TemplateResult} from "lit";
4
+ import {WidgetSettings} from "../util/widget-settings";
5
+ import {WidgetConfig} from "../util/widget-config";
6
+ import {GatewaySettings} from "../settings/gateway-settings";
7
+ import {InputType, OrInputChangedEvent} from "@openremote/or-mwc-components/or-mwc-input";
8
+ import {GatewayTunnelInfo, GatewayTunnelInfoType} from "@openremote/model";
9
+ import manager from "@openremote/core";
10
+ import {when} from "lit/directives/when.js";
11
+ import {i18next} from "@openremote/or-translate";
12
+ import {showSnackbar} from "@openremote/or-mwc-components/or-mwc-snackbar";
13
+
14
+ const styling = css`
15
+ #gateway-widget-wrapper {
16
+ height: 100%;
17
+ display: flex;
18
+ justify-content: center;
19
+ align-items: center;
20
+ overflow: hidden;
21
+ }
22
+
23
+ #gateway-widget-container {
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: center;
27
+ gap: 8px;
28
+ max-height: 48px;
29
+ flex-wrap: wrap;
30
+ position: relative;
31
+ }
32
+ `
33
+
34
+ export interface GatewayWidgetConfig extends WidgetConfig {
35
+ gatewayId?: string;
36
+ type: GatewayTunnelInfoType;
37
+ target: string;
38
+ targetPort: number;
39
+ }
40
+
41
+ function getDefaultWidgetConfig(): GatewayWidgetConfig {
42
+ return {
43
+ type: GatewayTunnelInfoType.HTTPS,
44
+ target: "localhost",
45
+ targetPort: 443,
46
+ };
47
+ }
48
+
49
+ @customElement("gateway-widget")
50
+ export class GatewayWidget extends OrWidget {
51
+
52
+ protected widgetConfig!: GatewayWidgetConfig;
53
+
54
+ @state()
55
+ protected _loading = true;
56
+
57
+ @state()
58
+ protected _activeTunnel?: GatewayTunnelInfo;
59
+
60
+ protected _startedByUser = false;
61
+
62
+ static getManifest(): WidgetManifest {
63
+ return {
64
+ displayName: "Gateway",
65
+ displayIcon: "lan-connect",
66
+ minColumnWidth: 1,
67
+ minColumnHeight: 1,
68
+ getContentHtml(config: GatewayWidgetConfig): OrWidget {
69
+ return new GatewayWidget(config);
70
+ },
71
+ getSettingsHtml(config: GatewayWidgetConfig): WidgetSettings {
72
+ return new GatewaySettings(config);
73
+ },
74
+ getDefaultConfig(): GatewayWidgetConfig {
75
+ return getDefaultWidgetConfig();
76
+ }
77
+ }
78
+ }
79
+
80
+ refreshContent(force: boolean): void {
81
+ this.widgetConfig = JSON.parse(JSON.stringify(this.widgetConfig)) as GatewayWidgetConfig;
82
+ }
83
+
84
+ static get styles() {
85
+ return [...super.styles, styling];
86
+ }
87
+
88
+ disconnectedCallback() {
89
+ if(this._activeTunnel) {
90
+ if(this._startedByUser) {
91
+ this._stopTunnel(this._activeTunnel).then(() => {
92
+ console.warn("Stopped the active tunnel, as it was created through the widget.")
93
+ });
94
+ } else {
95
+ console.warn("Keeping the active tunnel open, as it is not started through the widget.")
96
+ }
97
+ }
98
+ super.disconnectedCallback();
99
+ }
100
+
101
+ protected firstUpdated(_changedProps: PropertyValues) {
102
+ if(this.widgetConfig) {
103
+
104
+ // Apply a timeout of 500 millis, so the tunnel has time to close upon disconnectedCallback() of a different widget.
105
+ setTimeout(() => {
106
+
107
+ // Check if the tunnel is already active upon widget initialization
108
+ const tunnelInfo = this._getTunnelInfoByConfig(this.widgetConfig);
109
+ this._getActiveTunnel(tunnelInfo).then(info => {
110
+ if(info) {
111
+ console.log("Existing tunnel found!", info);
112
+ this._setActiveTunnel(info, true)
113
+ }
114
+ }).catch(e => {
115
+ console.error(e);
116
+ }).finally(() => {
117
+ this._loading = false;
118
+ });
119
+
120
+ }, 500)
121
+ }
122
+ }
123
+
124
+ protected render(): TemplateResult {
125
+ const disabled = this.getEditMode?.() || !this._isConfigComplete(this.widgetConfig);
126
+ return html`
127
+ <div id="gateway-widget-wrapper">
128
+ <div id="gateway-widget-container">
129
+ ${when(this._loading, () => html`
130
+ <or-loading-indicator></or-loading-indicator>
131
+ `, () => {
132
+ if (this._activeTunnel) {
133
+ return html`
134
+
135
+ <or-mwc-input .type="${InputType.BUTTON}" icon="stop" label="${i18next.t('gatewayTunnels.stop')}" .disabled="${disabled}"
136
+ @or-mwc-input-changed="${(ev: OrInputChangedEvent) => this._onStopTunnelClick(ev)}"
137
+ ></or-mwc-input>
138
+
139
+ ${when(this.widgetConfig.type === GatewayTunnelInfoType.TCP, () => html`
140
+ <or-mwc-input .type="${InputType.BUTTON}" icon="content-copy" label="${i18next.t('gatewayTunnels.copyAddress')}" outlined .disabled="${disabled}"
141
+ @or-mwc-input-changed="${(ev: OrInputChangedEvent) => this._onCopyTunnelAddressClick(ev)}"
142
+ ></or-mwc-input>
143
+ `, () => html`
144
+ <or-mwc-input .type="${InputType.BUTTON}" icon="open-in-new" label="${i18next.t('gatewayTunnels.open')}" outlined .disabled="${disabled}"
145
+ @or-mwc-input-changed="${(ev: OrInputChangedEvent) => this._onTunnelNavigateClick(ev)}"
146
+ ></or-mwc-input>
147
+ `)}
148
+
149
+ `;
150
+ } else {
151
+ return html`
152
+ <or-mwc-input .type="${InputType.BUTTON}" label="${i18next.t('gatewayTunnels.start')}" outlined .disabled="${disabled}"
153
+ @or-mwc-input-changed="${(ev: OrInputChangedEvent) => this._onStartTunnelClick(ev)}"
154
+ ></or-mwc-input>
155
+ `;
156
+ }
157
+ })}
158
+ </div>
159
+ </div>
160
+ `;
161
+ }
162
+
163
+ /**
164
+ * HTML callback function when 'copy address' button is pressed for a TCP tunnel.
165
+ */
166
+ protected _onCopyTunnelAddressClick(ev: OrInputChangedEvent) {
167
+ if (this._isConfigComplete(this.widgetConfig)) {
168
+ const tunnelInfo = this._getTunnelInfoByConfig(this.widgetConfig);
169
+ const address = this._getTunnelAddress(tunnelInfo);
170
+ if(address) {
171
+ navigator.clipboard.writeText(address).finally(() => {
172
+ showSnackbar(undefined, i18next.t('gatewayTunnels.copySuccess'));
173
+ });
174
+ } else {
175
+ console.warn("Could not copy tunnel address as it could not be found.");
176
+ showSnackbar(undefined, i18next.t('errorOccurred'));
177
+ }
178
+ } else {
179
+ console.warn("Could not copy tunnel address as configuration is not complete.");
180
+ showSnackbar(undefined, i18next.t('errorOccurred'));
181
+ }
182
+ }
183
+
184
+ /**
185
+ * HTML callback function when 'start' button is pressed, meant to create / start a new tunnel.
186
+ */
187
+ protected _onStartTunnelClick(ev: OrInputChangedEvent) {
188
+ this._tryStartTunnel(this.widgetConfig);
189
+ }
190
+
191
+ /**
192
+ * HTML callback function when 'stop' button is pressed, meant to destroy the active tunnel.
193
+ */
194
+ protected _onStopTunnelClick(ev: OrInputChangedEvent) {
195
+ this._tryStopTunnel(this.widgetConfig);
196
+ }
197
+
198
+ /**
199
+ * HTML callback function when 'open' button is pressed, meant to start using the tunnel.
200
+ */
201
+ protected _onTunnelNavigateClick(ev: OrInputChangedEvent) {
202
+ if (this._isConfigComplete(this.widgetConfig)) {
203
+ this._navigateToTunnel(this._getTunnelInfoByConfig(this.widgetConfig));
204
+ } else {
205
+ console.warn("Could not navigate to tunnel as configuration is not complete.")
206
+ }
207
+ }
208
+
209
+ /**
210
+ * Internal function to set the active tunnel.
211
+ * Navigates the user to the tunnel after updating. This can be disabled using the {@link silent} parameter.
212
+ */
213
+ protected _setActiveTunnel(tunnelInfo?: GatewayTunnelInfo, silent = false) {
214
+ this._activeTunnel = tunnelInfo;
215
+ if(tunnelInfo && !silent) {
216
+ this._navigateToTunnel(tunnelInfo);
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Function that tries to start the tunnel. It checks the configuration beforehand,
222
+ * and acts as a controller to call the correct functions throughout the starting process.
223
+ */
224
+ protected _tryStartTunnel(widgetConfig: GatewayWidgetConfig): void {
225
+ if (this._isConfigComplete(widgetConfig)) {
226
+
227
+ const tunnelInfo = this._getTunnelInfoByConfig(widgetConfig);
228
+ this._loading = true;
229
+
230
+ this._getActiveTunnel(tunnelInfo).then(activeTunnel => {
231
+
232
+ if (activeTunnel) {
233
+ console.log("Found an active tunnel!", activeTunnel);
234
+ this._setActiveTunnel(activeTunnel);
235
+ this._loading = false;
236
+
237
+ } else {
238
+ this._startTunnel(tunnelInfo).then(newTunnel => {
239
+
240
+ if (newTunnel) {
241
+ console.log("Started a new tunnel!", newTunnel);
242
+ this._setActiveTunnel(newTunnel);
243
+ this._startedByUser = true;
244
+
245
+ } else {
246
+ console.warn("No new tunnel!");
247
+ }
248
+ }).catch(e => {
249
+ console.error(e);
250
+ showSnackbar(undefined, i18next.t("errorOccurred"));
251
+ }).finally(() => {
252
+ this._loading = false;
253
+ });
254
+ }
255
+
256
+ }).catch(e => {
257
+ console.error(e);
258
+ showSnackbar(undefined, i18next.t("errorOccurred"));
259
+ this._loading = false;
260
+ })
261
+ }
262
+ }
263
+
264
+ /**
265
+ * Internal function that starts the tunnel by communicating with the Manager API.
266
+ */
267
+ protected async _startTunnel(info: GatewayTunnelInfo): Promise<GatewayTunnelInfo | undefined> {
268
+ if (!info.realm || !info.gatewayId || !info.target || !info.targetPort) {
269
+ throw new Error("Could not start tunnel, as some provided information was not set.");
270
+ }
271
+ return (await manager.rest.api.GatewayServiceResource.startTunnel(info)).data;
272
+ }
273
+
274
+ /**
275
+ * Internal function that requests the Manager API for the active tunnel based on the {@link GatewayTunnelInfo} parameter.
276
+ * Returns `undefined` if no tunnel could be found on the Manager instance.
277
+ */
278
+ protected async _getActiveTunnel(info: GatewayTunnelInfo): Promise<GatewayTunnelInfo | undefined> {
279
+ if (!info.realm || !info.gatewayId || !info.target || !info.targetPort) {
280
+ throw new Error("Could not get active tunnel, as some provided information was not set.")
281
+ }
282
+ const response = await manager.rest.api.GatewayServiceResource.getActiveTunnelInfo(info.realm, info.gatewayId, info.target, info.targetPort);
283
+ if(response.status === 204) {
284
+ return undefined;
285
+ } else {
286
+ return response.data;
287
+ }
288
+ }
289
+
290
+ /**
291
+ * Function that tries to destroy the currently active tunnel.
292
+ */
293
+ protected _tryStopTunnel(config: GatewayWidgetConfig): void {
294
+ const tunnelInfo = this._getTunnelInfoByConfig(config);
295
+ this._loading = true;
296
+ this._stopTunnel(tunnelInfo)
297
+ .then(() => {
298
+ this._setActiveTunnel(undefined);
299
+ this._startedByUser = false;
300
+ })
301
+ .catch(e => {
302
+ console.warn(e);
303
+ })
304
+ .finally(() => {
305
+ this._loading = false;
306
+ });
307
+ }
308
+
309
+ /**
310
+ * Internal function that requests the Manager API to destroy a tunnel that is in line with the {@link GatewayTunnelInfo} parameter.
311
+ */
312
+ protected async _stopTunnel(info: GatewayTunnelInfo): Promise<void> {
313
+ return (await manager.rest.api.GatewayServiceResource.stopTunnel(info)).data;
314
+ }
315
+
316
+ /**
317
+ * Function that navigates the user to an HTTP web page that interacts with a service through the tunnel.
318
+ * It will open in a new browser tab automatically.
319
+ */
320
+ protected _navigateToTunnel(info: GatewayTunnelInfo): void {
321
+ if (!info.realm || !info.gatewayId || !info.target || !info.targetPort) {
322
+ console.warn("Could not navigate to tunnel, as some provided information was not set.");
323
+ }
324
+ const address = this._getTunnelAddress(info);
325
+ switch (info.type) {
326
+ case GatewayTunnelInfoType.HTTPS:
327
+ case GatewayTunnelInfoType.HTTP:
328
+ window.open(address)?.focus();
329
+ break;
330
+ default:
331
+ console.error("Unknown error when navigating to tunnel.");
332
+ break;
333
+ }
334
+ }
335
+
336
+ /**
337
+ * Internal function to get the tunnel address based on {@link GatewayTunnelInfo}
338
+ */
339
+ protected _getTunnelAddress(info: GatewayTunnelInfo): string | undefined {
340
+ switch (info.type) {
341
+ case GatewayTunnelInfoType.HTTPS:
342
+ case GatewayTunnelInfoType.HTTP:
343
+ return "//" + info.id + "." + window.location.host;
344
+ case GatewayTunnelInfoType.TCP:
345
+ return info.id + "." + window.location.hostname + ":" + info.assignedPort;
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Internal function to check whether the {@link GatewayWidgetConfig} includes the necessary information to control the tunnel.
351
+ * Uses several `undefined` or empty checks. Useful for checking the object before interacting with Manager APIs.
352
+ */
353
+ protected _isConfigComplete(widgetConfig: GatewayWidgetConfig): boolean {
354
+ if (!widgetConfig.gatewayId) {
355
+ console.error("Could not start tunnel, since no gateway asset was configured.");
356
+ return false;
357
+ }
358
+ if (!widgetConfig.type) {
359
+ console.error("Could not start tunnel, since no gateway type / protocol was configured.");
360
+ return false;
361
+ }
362
+ if (!widgetConfig.target) {
363
+ console.error("Could not start tunnel, since no gateway target was configured.");
364
+ return false;
365
+ }
366
+ if (!widgetConfig.targetPort) {
367
+ console.error("Could not start tunnel, since no gateway target port was configured.");
368
+ return false;
369
+ }
370
+ return true;
371
+ }
372
+
373
+ /**
374
+ * Internal function that parses a {@link GatewayWidgetConfig} into a new {@link GatewayTunnelInfo}.
375
+ */
376
+ protected _getTunnelInfoByConfig(config: GatewayWidgetConfig): GatewayTunnelInfo {
377
+ return {
378
+ realm: manager.displayRealm,
379
+ gatewayId: config.gatewayId,
380
+ type: config.type,
381
+ target: config.target,
382
+ targetPort: config.targetPort
383
+ } as GatewayTunnelInfo;
384
+ }
385
+
386
+ }