@c8y/ngx-components 1021.13.3 → 1021.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/alarms/alarm-details.component.d.ts +1 -3
  2. package/alarms/alarm-details.component.d.ts.map +1 -1
  3. package/alarms/alarm-info.component.d.ts +9 -14
  4. package/alarms/alarm-info.component.d.ts.map +1 -1
  5. package/alarms/alarms-list.component.d.ts +2 -17
  6. package/alarms/alarms-list.component.d.ts.map +1 -1
  7. package/alarms/alarms-view.service.d.ts +1 -0
  8. package/alarms/alarms-view.service.d.ts.map +1 -1
  9. package/alarms/alarms.component.d.ts.map +1 -1
  10. package/alarms/alarms.helper.d.ts +5 -0
  11. package/alarms/alarms.helper.d.ts.map +1 -0
  12. package/alarms/alarms.model.d.ts +30 -0
  13. package/alarms/alarms.model.d.ts.map +1 -1
  14. package/alarms/alarms.module.d.ts.map +1 -1
  15. package/alarms/cockpit/index.d.ts.map +1 -1
  16. package/alarms/devicemanagement/index.d.ts.map +1 -1
  17. package/alarms/index.d.ts +5 -4
  18. package/alarms/index.d.ts.map +1 -1
  19. package/context-dashboard/context-dashboard.model.d.ts +1 -0
  20. package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
  21. package/context-dashboard/context-dashboard.service.d.ts +7 -5
  22. package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
  23. package/context-dashboard/dashboard-detail.component.d.ts +4 -7
  24. package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
  25. package/context-dashboard/dashboard-detail.service.d.ts +4 -4
  26. package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
  27. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts +2 -2
  28. package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
  29. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts +19 -6
  30. package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
  31. package/core/action-bar/action-bar-item.component.d.ts +1 -1
  32. package/core/action-bar/action-bar-item.component.d.ts.map +1 -1
  33. package/core/action-bar/action-bar.module.d.ts +6 -6
  34. package/core/action-bar/action-bar.module.d.ts.map +1 -1
  35. package/core/bootstrap/bootstrap.component.d.ts +3 -1
  36. package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
  37. package/core/common/aggregation/aggregation.model.d.ts +39 -0
  38. package/core/common/aggregation/aggregation.model.d.ts.map +1 -0
  39. package/core/common/aggregation/aggregation.service.d.ts +17 -0
  40. package/core/common/aggregation/aggregation.service.d.ts.map +1 -0
  41. package/core/common/index.d.ts +4 -0
  42. package/core/common/index.d.ts.map +1 -1
  43. package/core/common/inter-app.service.d.ts +48 -0
  44. package/core/common/inter-app.service.d.ts.map +1 -0
  45. package/core/common/interval-based-reload.abstract.d.ts +120 -0
  46. package/core/common/interval-based-reload.abstract.d.ts.map +1 -0
  47. package/core/dashboard/dashboard.module.d.ts +24 -18
  48. package/core/dashboard/dashboard.module.d.ts.map +1 -1
  49. package/core/dashboard/index.d.ts +3 -0
  50. package/core/dashboard/index.d.ts.map +1 -1
  51. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +31 -0
  52. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -0
  53. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts +17 -0
  54. package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts.map +1 -0
  55. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts +4 -0
  56. package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts.map +1 -0
  57. package/core/dashboard/widget-auto-refresh-context/index.d.ts +8 -0
  58. package/core/dashboard/widget-auto-refresh-context/index.d.ts.map +1 -0
  59. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts +7 -0
  60. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts.map +1 -0
  61. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +29 -0
  62. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -0
  63. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts +15 -0
  64. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts.map +1 -0
  65. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts +169 -0
  66. package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts.map +1 -0
  67. package/core/dashboard/widgets-dashboard.component.d.ts +6 -3
  68. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  69. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +2 -2
  70. package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
  71. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts +1 -1
  72. package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts.map +1 -1
  73. package/core/dashboard/wiget-time-context/widget-time-context-query.service.d.ts.map +1 -1
  74. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +11 -8
  75. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  76. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +6 -12
  77. package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
  78. package/core/header/header.module.d.ts +18 -18
  79. package/core/header/header.module.d.ts.map +1 -1
  80. package/core/header/title/title.component.d.ts +1 -1
  81. package/core/header/title/title.component.d.ts.map +1 -1
  82. package/core/i18n/cached-locale-dictionary.service.d.ts +5 -1
  83. package/core/i18n/cached-locale-dictionary.service.d.ts.map +1 -1
  84. package/core/i18n/i18n.module.d.ts +0 -4
  85. package/core/i18n/i18n.module.d.ts.map +1 -1
  86. package/core/i18n/index.d.ts +2 -1
  87. package/core/i18n/index.d.ts.map +1 -1
  88. package/core/i18n/translation-loader.service.d.ts +50 -0
  89. package/core/i18n/translation-loader.service.d.ts.map +1 -0
  90. package/core/i18n/translation-utils.d.ts +14 -0
  91. package/core/i18n/translation-utils.d.ts.map +1 -0
  92. package/core/plugins/plugins-resolve.service.d.ts +7 -10
  93. package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
  94. package/core/router/context-route.component.d.ts +8 -3
  95. package/core/router/context-route.component.d.ts.map +1 -1
  96. package/core/router/context-route.service.d.ts +29 -3
  97. package/core/router/context-route.service.d.ts.map +1 -1
  98. package/core/router/router-tabs.resolver.d.ts +4 -1
  99. package/core/router/router-tabs.resolver.d.ts.map +1 -1
  100. package/core/router/router.model.d.ts +40 -3
  101. package/core/router/router.model.d.ts.map +1 -1
  102. package/core/router/router.module.d.ts +2 -1
  103. package/core/router/router.module.d.ts.map +1 -1
  104. package/core/router/router.service.d.ts +5 -4
  105. package/core/router/router.service.d.ts.map +1 -1
  106. package/core/router/scoped-context-route.service.d.ts +57 -0
  107. package/core/router/scoped-context-route.service.d.ts.map +1 -0
  108. package/core/router/view-context.service.d.ts +8 -18
  109. package/core/router/view-context.service.d.ts.map +1 -1
  110. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts +2 -1
  111. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
  112. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +11 -2
  113. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
  114. package/datapoint-selector/datapoint-selection.model.d.ts +6 -0
  115. package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
  116. package/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.d.ts.map +1 -0
  117. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +117 -0
  118. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -0
  119. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts +90 -0
  120. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts.map +1 -0
  121. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +160 -0
  122. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -0
  123. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts +89 -0
  124. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -0
  125. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts +11 -0
  126. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.d.ts.map +1 -0
  127. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts +27 -0
  128. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.d.ts.map +1 -0
  129. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts +12 -0
  130. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.d.ts.map +1 -0
  131. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts +22 -0
  132. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.d.ts.map +1 -0
  133. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts +3 -0
  134. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts.map +1 -0
  135. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts +9 -0
  136. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts.map +1 -0
  137. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts +56 -0
  138. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts.map +1 -0
  139. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts +21 -0
  140. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -0
  141. package/datapoints-export-selector/datapoints-export-selector.component.d.ts +14 -0
  142. package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -0
  143. package/datapoints-export-selector/datapoints-export-selector.model.d.ts +232 -0
  144. package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -0
  145. package/datapoints-export-selector/index.d.ts +15 -0
  146. package/datapoints-export-selector/index.d.ts.map +1 -0
  147. package/device-list/device-list.module.d.ts +4 -2
  148. package/device-list/device-list.module.d.ts.map +1 -1
  149. package/esm2022/alarms/alarm-details.component.mjs +7 -9
  150. package/esm2022/alarms/alarm-info.component.mjs +23 -33
  151. package/esm2022/alarms/alarms-list.component.mjs +5 -16
  152. package/esm2022/alarms/alarms-view.service.mjs +3 -2
  153. package/esm2022/alarms/alarms.component.mjs +10 -3
  154. package/esm2022/alarms/alarms.helper.mjs +32 -0
  155. package/esm2022/alarms/alarms.model.mjs +1 -1
  156. package/esm2022/alarms/alarms.module.mjs +5 -5
  157. package/esm2022/alarms/cockpit/index.mjs +13 -17
  158. package/esm2022/alarms/devicemanagement/index.mjs +15 -18
  159. package/esm2022/alarms/index.mjs +6 -5
  160. package/esm2022/context-dashboard/context-dashboard.component.mjs +4 -4
  161. package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
  162. package/esm2022/context-dashboard/context-dashboard.service.mjs +47 -21
  163. package/esm2022/context-dashboard/dashboard-detail.component.mjs +8 -16
  164. package/esm2022/context-dashboard/dashboard-detail.service.mjs +13 -6
  165. package/esm2022/context-dashboard/dashboard-settings/dashboard-general-settings.component.mjs +3 -3
  166. package/esm2022/context-dashboard/dashboard-settings/typed-dashboard-settings.component.mjs +32 -11
  167. package/esm2022/core/action-bar/action-bar-item.component.mjs +3 -3
  168. package/esm2022/core/action-bar/action-bar.module.mjs +16 -5
  169. package/esm2022/core/bootstrap/bootstrap.component.mjs +21 -16
  170. package/esm2022/core/common/aggregation/aggregation.model.mjs +46 -0
  171. package/esm2022/core/common/aggregation/aggregation.service.mjs +34 -0
  172. package/esm2022/core/common/humanize-app-name.model.mjs +2 -2
  173. package/esm2022/core/common/humanize-app-name.pipe.mjs +2 -2
  174. package/esm2022/core/common/index.mjs +5 -1
  175. package/esm2022/core/common/inter-app.service.mjs +76 -0
  176. package/esm2022/core/common/interval-based-reload.abstract.mjs +110 -0
  177. package/esm2022/core/countdown-interval/countdown-interval.component.mjs +3 -3
  178. package/esm2022/core/dashboard/dashboard-child.component.mjs +6 -5
  179. package/esm2022/core/dashboard/dashboard.module.mjs +18 -1
  180. package/esm2022/core/dashboard/index.mjs +4 -1
  181. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +101 -0
  182. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.mjs +50 -0
  183. package/esm2022/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.mjs +7 -0
  184. package/esm2022/core/dashboard/widget-auto-refresh-context/index.mjs +8 -0
  185. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.mjs +18 -0
  186. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +127 -0
  187. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.mjs +5 -0
  188. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.mjs +233 -0
  189. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +35 -30
  190. package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +4 -4
  191. package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +2 -2
  192. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +5 -5
  193. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-query.service.mjs +7 -4
  194. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -37
  195. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -28
  196. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +3 -3
  197. package/esm2022/core/header/header.module.mjs +7 -5
  198. package/esm2022/core/header/title/title.component.mjs +3 -3
  199. package/esm2022/core/i18n/cached-locale-dictionary.service.mjs +1 -1
  200. package/esm2022/core/i18n/i18n.module.mjs +7 -14
  201. package/esm2022/core/i18n/index.mjs +3 -2
  202. package/esm2022/core/i18n/translate.parser.mjs +2 -2
  203. package/esm2022/core/i18n/translation-loader.service.mjs +132 -0
  204. package/esm2022/core/i18n/translation-utils.mjs +24 -0
  205. package/esm2022/core/plugins/plugins-resolve.service.mjs +12 -37
  206. package/esm2022/core/router/context-route.component.mjs +23 -13
  207. package/esm2022/core/router/context-route.service.mjs +37 -5
  208. package/esm2022/core/router/router-tabs.resolver.mjs +46 -15
  209. package/esm2022/core/router/router.model.mjs +6 -1
  210. package/esm2022/core/router/router.module.mjs +20 -13
  211. package/esm2022/core/router/router.service.mjs +24 -10
  212. package/esm2022/core/router/scoped-context-route.service.mjs +152 -0
  213. package/esm2022/core/router/view-context.service.mjs +59 -16
  214. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.mjs +13 -6
  215. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +22 -5
  216. package/esm2022/datapoint-selector/datapoint-selection-list/datapoint-selection-list.component.mjs +3 -3
  217. package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
  218. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
  219. package/esm2022/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.mjs +5 -0
  220. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +407 -0
  221. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.mjs +207 -0
  222. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +467 -0
  223. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.mjs +187 -0
  224. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.mjs +27 -0
  225. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.mjs +41 -0
  226. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.mjs +23 -0
  227. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.mjs +42 -0
  228. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.mjs +120 -0
  229. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.mjs +282 -0
  230. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.mjs +76 -0
  231. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.mjs +46 -0
  232. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +42 -0
  233. package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +43 -0
  234. package/esm2022/datapoints-export-selector/index.mjs +15 -0
  235. package/esm2022/device-list/add-smart-group.component.mjs +4 -3
  236. package/esm2022/device-list/device-list.module.mjs +22 -4
  237. package/esm2022/map/cluster-map.component.mjs +41 -13
  238. package/esm2022/map/map-status.component.mjs +6 -5
  239. package/esm2022/map/map.component.mjs +9 -5
  240. package/esm2022/map/map.model.mjs +1 -1
  241. package/esm2022/translation-editor/c8y-ngx-components-translation-editor.mjs +5 -0
  242. package/esm2022/translation-editor/data/c8y-ngx-components-translation-editor-data.mjs +5 -0
  243. package/esm2022/translation-editor/data/index.mjs +2 -0
  244. package/esm2022/translation-editor/data/translation-store.service.mjs +175 -0
  245. package/esm2022/translation-editor/index.mjs +10 -0
  246. package/esm2022/translation-editor/lazy/add-translation-modal/add-translation-modal.component.mjs +70 -0
  247. package/esm2022/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.mjs +5 -0
  248. package/esm2022/translation-editor/lazy/index.mjs +2 -0
  249. package/esm2022/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.mjs +53 -0
  250. package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +124 -0
  251. package/esm2022/translation-editor/translation-editor-naviagtor-factory.service.mjs +31 -0
  252. package/esm2022/widgets/cockpit/index.mjs +4 -2
  253. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  254. package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +6 -2
  255. package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +6 -2
  256. package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +6 -2
  257. package/esm2022/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -0
  258. package/esm2022/widgets/definitions/datapoints-table/index.mjs +34 -0
  259. package/esm2022/widgets/definitions/index.mjs +2 -1
  260. package/esm2022/widgets/definitions/map/index.mjs +4 -2
  261. package/esm2022/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.mjs +29 -15
  262. package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +57 -25
  263. package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +2 -1
  264. package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +19 -21
  265. package/esm2022/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +5 -0
  266. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +383 -0
  267. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.mjs +124 -0
  268. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.mjs +191 -0
  269. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.mjs +36 -0
  270. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.mjs +45 -0
  271. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +116 -0
  272. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +116 -0
  273. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.mjs +43 -0
  274. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +282 -0
  275. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.mjs +430 -0
  276. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.mjs +75 -0
  277. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +76 -0
  278. package/esm2022/widgets/implementations/datapoints-table/datapoints-table.service.mjs +52 -0
  279. package/esm2022/widgets/implementations/datapoints-table/date-range-picker.component.mjs +68 -0
  280. package/esm2022/widgets/implementations/datapoints-table/index.mjs +10 -0
  281. package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +19 -11
  282. package/esm2022/widgets/implementations/map/map-widget.component.mjs +20 -2
  283. package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
  284. package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs +12 -16
  285. package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs.map +1 -1
  286. package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs +14 -17
  287. package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs.map +1 -1
  288. package/fesm2022/c8y-ngx-components-alarms.mjs +203 -185
  289. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  290. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +135 -91
  291. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  292. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +37 -13
  293. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  294. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +1928 -0
  295. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -0
  296. package/fesm2022/c8y-ngx-components-device-list.mjs +24 -5
  297. package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
  298. package/fesm2022/c8y-ngx-components-map.mjs +52 -19
  299. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  300. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +181 -0
  301. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -0
  302. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +236 -0
  303. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -0
  304. package/fesm2022/c8y-ngx-components-translation-editor.mjs +46 -0
  305. package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -0
  306. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  307. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  308. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +3 -1
  309. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
  310. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +5 -1
  311. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
  312. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +5 -1
  313. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
  314. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +5 -1
  315. package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
  316. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +41 -0
  317. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -0
  318. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +3 -1
  319. package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
  320. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
  321. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  322. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +101 -58
  323. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  324. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1967 -0
  325. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -0
  326. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +37 -11
  327. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  328. package/fesm2022/c8y-ngx-components.mjs +5476 -4396
  329. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  330. package/locales/de.po +289 -18
  331. package/locales/en.po +12 -0
  332. package/locales/en_US.po +3 -0
  333. package/locales/es.po +253 -18
  334. package/locales/fr.po +253 -18
  335. package/locales/ja_JP.po +282 -18
  336. package/locales/locales.pot +257 -18
  337. package/locales/nl.po +253 -18
  338. package/locales/pl.po +253 -18
  339. package/locales/pt_BR.po +253 -18
  340. package/map/cluster-map.component.d.ts +8 -3
  341. package/map/cluster-map.component.d.ts.map +1 -1
  342. package/map/map-status.component.d.ts +0 -3
  343. package/map/map-status.component.d.ts.map +1 -1
  344. package/map/map.component.d.ts +4 -2
  345. package/map/map.component.d.ts.map +1 -1
  346. package/map/map.model.d.ts +2 -1
  347. package/map/map.model.d.ts.map +1 -1
  348. package/package.json +1 -1
  349. package/translation-editor/c8y-ngx-components-translation-editor.d.ts.map +1 -0
  350. package/translation-editor/data/c8y-ngx-components-translation-editor-data.d.ts.map +1 -0
  351. package/translation-editor/data/index.d.ts +2 -0
  352. package/translation-editor/data/index.d.ts.map +1 -0
  353. package/translation-editor/data/translation-store.service.d.ts +61 -0
  354. package/translation-editor/data/translation-store.service.d.ts.map +1 -0
  355. package/translation-editor/index.d.ts +2 -0
  356. package/translation-editor/index.d.ts.map +1 -0
  357. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts +30 -0
  358. package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts.map +1 -0
  359. package/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.d.ts.map +1 -0
  360. package/translation-editor/lazy/index.d.ts +2 -0
  361. package/translation-editor/lazy/index.d.ts.map +1 -0
  362. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts +22 -0
  363. package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts.map +1 -0
  364. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts +34 -0
  365. package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -0
  366. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts +11 -0
  367. package/translation-editor/translation-editor-naviagtor-factory.service.d.ts.map +1 -0
  368. package/widgets/cockpit/index.d.ts +13 -0
  369. package/widgets/cockpit/index.d.ts.map +1 -1
  370. package/widgets/cockpit-exports/index.d.ts +6 -0
  371. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  372. package/widgets/definitions/alarms/alarm-list/index.d.ts +2 -0
  373. package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
  374. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +2 -0
  375. package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
  376. package/widgets/definitions/alarms/recent-alarms/index.d.ts +2 -0
  377. package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
  378. package/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.d.ts.map +1 -0
  379. package/widgets/definitions/datapoints-table/index.d.ts +14 -0
  380. package/widgets/definitions/datapoints-table/index.d.ts.map +1 -0
  381. package/widgets/definitions/index.d.ts +1 -0
  382. package/widgets/definitions/index.d.ts.map +1 -1
  383. package/widgets/definitions/map/index.d.ts +2 -1
  384. package/widgets/definitions/map/index.d.ts.map +1 -1
  385. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts +5 -9
  386. package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
  387. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts +17 -10
  388. package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
  389. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +5 -1
  390. package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
  391. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +5 -11
  392. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  393. package/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.d.ts.map +1 -0
  394. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +129 -0
  395. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -0
  396. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts +56 -0
  397. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts.map +1 -0
  398. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts +88 -0
  399. package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts.map +1 -0
  400. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts +19 -0
  401. package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts.map +1 -0
  402. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts +26 -0
  403. package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts.map +1 -0
  404. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +63 -0
  405. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -0
  406. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts +38 -0
  407. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts.map +1 -0
  408. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts +13 -0
  409. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts.map +1 -0
  410. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +123 -0
  411. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -0
  412. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts +196 -0
  413. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts.map +1 -0
  414. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts +41 -0
  415. package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts.map +1 -0
  416. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +175 -0
  417. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -0
  418. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts +12 -0
  419. package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts.map +1 -0
  420. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts +34 -0
  421. package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -0
  422. package/widgets/implementations/datapoints-table/index.d.ts +10 -0
  423. package/widgets/implementations/datapoints-table/index.d.ts.map +1 -0
  424. package/widgets/implementations/map/map-widget-config.component.d.ts +4 -4
  425. package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
  426. package/widgets/implementations/map/map-widget.component.d.ts +8 -3
  427. package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
  428. package/widgets/implementations/map/map-widget.model.d.ts +4 -3
  429. package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
  430. package/core/i18n/translate.loader.d.ts +0 -31
  431. package/core/i18n/translate.loader.d.ts.map +0 -1
  432. package/esm2022/core/i18n/translate.loader.mjs +0 -71
@@ -0,0 +1,76 @@
1
+ import { gettext } from '@c8y/ngx-components';
2
+ import { TIME_RANGE_INTERVAL_UNITS_VALUES } from '@c8y/ngx-components/datapoints-export-selector';
3
+ export const DEFAULT_COUNTDOWN_VALUE = 30_000;
4
+ export const DATE_SELECTION_VALUES = {
5
+ // Will be uncommented in MTM-61920
6
+ // dashboard_context: 'dashboard_context',
7
+ config: 'config',
8
+ view_and_config: 'view_and_config'
9
+ };
10
+ export const DATE_SELECTION_VALUES_ARR = [
11
+ // Will be uncommented in MTM-61920
12
+ // DATE_SELECTION_VALUES.dashboard_context,
13
+ DATE_SELECTION_VALUES.config,
14
+ DATE_SELECTION_VALUES.view_and_config
15
+ ];
16
+ export const DATE_SELECTION_LABELS = {
17
+ config: gettext('Widget configuration'),
18
+ view_and_config: gettext('Widget and widget configuration'),
19
+ dashboard_context: gettext('Dashboard time range')
20
+ };
21
+ export const REFRESH_INTERVAL_VALUES_ARR = [5_000, 10_000, 15_000, 30_000, 60_000];
22
+ export const RENDER_TYPES_LABELS = {
23
+ min: gettext('Minimum'),
24
+ max: gettext('Maximum'),
25
+ area: gettext('Area')
26
+ };
27
+ export const INTERVAL_VALUES_ARR = [
28
+ TIME_RANGE_INTERVAL_UNITS_VALUES.minutes,
29
+ TIME_RANGE_INTERVAL_UNITS_VALUES.hours,
30
+ TIME_RANGE_INTERVAL_UNITS_VALUES.days,
31
+ TIME_RANGE_INTERVAL_UNITS_VALUES.weeks,
32
+ TIME_RANGE_INTERVAL_UNITS_VALUES.months,
33
+ TIME_RANGE_INTERVAL_UNITS_VALUES.custom
34
+ ];
35
+ export const TIME_RANGE_INTERVAL_LABELS = {
36
+ minutes: gettext('Last minute'),
37
+ hours: gettext('Last hour'),
38
+ days: gettext('Last day'),
39
+ weeks: gettext('Last week'),
40
+ months: gettext('Last month'),
41
+ custom: gettext('Custom')
42
+ };
43
+ export const DURATION_OPTIONS = [
44
+ {
45
+ id: TIME_RANGE_INTERVAL_UNITS_VALUES.minutes,
46
+ label: TIME_RANGE_INTERVAL_LABELS.minutes,
47
+ unit: TIME_RANGE_INTERVAL_UNITS_VALUES.minutes,
48
+ amount: 1
49
+ },
50
+ {
51
+ id: TIME_RANGE_INTERVAL_UNITS_VALUES.hours,
52
+ label: TIME_RANGE_INTERVAL_LABELS.hours,
53
+ unit: TIME_RANGE_INTERVAL_UNITS_VALUES.hours,
54
+ amount: 1
55
+ },
56
+ {
57
+ id: TIME_RANGE_INTERVAL_UNITS_VALUES.days,
58
+ label: TIME_RANGE_INTERVAL_LABELS.days,
59
+ unit: TIME_RANGE_INTERVAL_UNITS_VALUES.days,
60
+ amount: 1
61
+ },
62
+ {
63
+ id: TIME_RANGE_INTERVAL_UNITS_VALUES.weeks,
64
+ label: TIME_RANGE_INTERVAL_LABELS.weeks,
65
+ unit: TIME_RANGE_INTERVAL_UNITS_VALUES.weeks,
66
+ amount: 1
67
+ },
68
+ {
69
+ id: TIME_RANGE_INTERVAL_UNITS_VALUES.months,
70
+ label: TIME_RANGE_INTERVAL_LABELS.months,
71
+ unit: TIME_RANGE_INTERVAL_UNITS_VALUES.months,
72
+ amount: 1
73
+ },
74
+ { id: TIME_RANGE_INTERVAL_UNITS_VALUES.custom, label: TIME_RANGE_INTERVAL_LABELS.custom }
75
+ ];
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy10YWJsZS13aWRnZXQubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2RhdGFwb2ludHMtdGFibGUtd2lkZ2V0Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBcUIsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakUsT0FBTyxFQUdMLGdDQUFnQyxFQUdqQyxNQUFNLGdEQUFnRCxDQUFDO0FBRXhELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQztBQWtDOUMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUc7SUFDbkMsbUNBQW1DO0lBQ25DLDBDQUEwQztJQUMxQyxNQUFNLEVBQUUsUUFBUTtJQUNoQixlQUFlLEVBQUUsaUJBQWlCO0NBQzFCLENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRztJQUN2QyxtQ0FBbUM7SUFDbkMsMkNBQTJDO0lBQzNDLHFCQUFxQixDQUFDLE1BQU07SUFDNUIscUJBQXFCLENBQUMsZUFBZTtDQUM3QixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUc7SUFDbkMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBMkI7SUFDakUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBc0M7SUFDaEcsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLHNCQUFzQixDQUEyQjtDQUNwRSxDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFFbkYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQWM7SUFDcEMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQWM7SUFDcEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQVc7Q0FDdkIsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLGdDQUFnQyxDQUFDLE9BQU87SUFDeEMsZ0NBQWdDLENBQUMsS0FBSztJQUN0QyxnQ0FBZ0MsQ0FBQyxJQUFJO0lBQ3JDLGdDQUFnQyxDQUFDLEtBQUs7SUFDdEMsZ0NBQWdDLENBQUMsTUFBTTtJQUN2QyxnQ0FBZ0MsQ0FBQyxNQUFNO0NBQy9CLENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUN4QyxPQUFPLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBa0I7SUFDaEQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQWdCO0lBQzFDLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFlO0lBQ3ZDLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFnQjtJQUMxQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBaUI7SUFDN0MsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQWE7Q0FDN0IsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCO1FBQ0UsRUFBRSxFQUFFLGdDQUFnQyxDQUFDLE9BQU87UUFDNUMsS0FBSyxFQUFFLDBCQUEwQixDQUFDLE9BQU87UUFDekMsSUFBSSxFQUFFLGdDQUFnQyxDQUFDLE9BQU87UUFDOUMsTUFBTSxFQUFFLENBQUM7S0FDVjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGdDQUFnQyxDQUFDLEtBQUs7UUFDMUMsS0FBSyxFQUFFLDBCQUEwQixDQUFDLEtBQUs7UUFDdkMsSUFBSSxFQUFFLGdDQUFnQyxDQUFDLEtBQUs7UUFDNUMsTUFBTSxFQUFFLENBQUM7S0FDVjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGdDQUFnQyxDQUFDLElBQUk7UUFDekMsS0FBSyxFQUFFLDBCQUEwQixDQUFDLElBQUk7UUFDdEMsSUFBSSxFQUFFLGdDQUFnQyxDQUFDLElBQUk7UUFDM0MsTUFBTSxFQUFFLENBQUM7S0FDVjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGdDQUFnQyxDQUFDLEtBQUs7UUFDMUMsS0FBSyxFQUFFLDBCQUEwQixDQUFDLEtBQUs7UUFDdkMsSUFBSSxFQUFFLGdDQUFnQyxDQUFDLEtBQUs7UUFDNUMsTUFBTSxFQUFFLENBQUM7S0FDVjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGdDQUFnQyxDQUFDLE1BQU07UUFDM0MsS0FBSyxFQUFFLDBCQUEwQixDQUFDLE1BQU07UUFDeEMsSUFBSSxFQUFFLGdDQUFnQyxDQUFDLE1BQU07UUFDN0MsTUFBTSxFQUFFLENBQUM7S0FDVjtJQUNELEVBQUUsRUFBRSxFQUFFLGdDQUFnQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsMEJBQTBCLENBQUMsTUFBTSxFQUFFO0NBQzFGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRmV0Y2hSZXNwb25zZSwgSVNlcmllcyB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFnZ3JlZ2F0aW9uT3B0aW9uLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBLUElEZXRhaWxzIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnQtc2VsZWN0b3InO1xuaW1wb3J0IHtcbiAgTWluTWF4VmFsdWVzLFxuICBTb3VyY2VJZCxcbiAgVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMsXG4gIFRpbWVSYW5nZUludGVydmFsLFxuICBUaW1lU3RhbXBcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvcic7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPVU5URE9XTl9WQUxVRSA9IDMwXzAwMDtcblxuZXhwb3J0IHR5cGUgRGF0YXBvaW50VGFibGVNYXBLZXkgPSBgJHtUaW1lU3RhbXB9XyR7RGV2aWNlTmFtZX1gO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWFwcGluZyB3aGVyZSB0aGUga2V5IGlzIGEgZGF0YXBvaW50IGlkZW50aWZpZXIgY29udGFpbmluZyB0aGUgZGF0ZSBhbmQgZGV2aWNlIG5hbWUsIGFuZCB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgb2YgZGF0YSBwb2ludCB0YWJsZSBpdGVtcyBvciBudWxsLlxuICovXG5leHBvcnQgdHlwZSBEYXRhUG9pbnRzVGFibGVNYXAgPSBNYXA8RGF0YXBvaW50VGFibGVNYXBLZXksIChEYXRhcG9pbnRUYWJsZUl0ZW0gfCBudWxsKVtdPjtcblxudHlwZSBEZXZpY2VOYW1lID0gc3RyaW5nO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtYXAgb2YgZGF0YXBvaW50cyBzZXJpZXMgZGF0YS5cbiAqIFRoZSBrZXkgb2YgdGhlIG1hcCBpcyBhIHNvdXJjZSwgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgZGF0YSBmb3IgcmVxdWVzdGVkIHNlcmllcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGF0YXBvaW50c1Nlcmllc0RhdGFNYXAgPSBNYXA8U291cmNlSWQsIElTZXJpZXM+O1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoaWNoIHZhbHVlcyB3aWxsIGJlIGRpc3BsYXllZCBhcyB2YWx1ZXMgZm9yIGRhdGFwb2ludHMuXG4gKiBlLmcuIGlmIHVzZXIgY2hvc2UgJ21pbicsIG9ubHkgdGhlIG1pbmltdW0gdmFsdWVzIHdpbGwgYmUgZGlzcGxheWVkLlxuICovXG5leHBvcnQgdHlwZSBSZW5kZXJUeXBlID0ga2V5b2YgdHlwZW9mIFJFTkRFUl9UWVBFU19MQUJFTFM7XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gb2JqZWN0IHdoZXJlIGtleSBpcyBhIHRpbWVzdGFtcCBhbmQgdmFsdWUgaXMgYW4gYXJyYXlcbiAqIHdoZXJlIGZpcnN0IHJlY29yZCBjb250YWlucyBtaW4gYW5kIG1heCB2YWx1ZXMgZm9yIGEgY29ycmVzcG9uZGluZyB0aW1lc3RhbXAuXG4gKi9cbmV4cG9ydCB0eXBlIE1lYXN1cmVtZW50UmFuZ2VzID0ge1xuICBba2V5OiBUaW1lU3RhbXBdOiBBcnJheTxNaW5NYXhWYWx1ZXM+O1xufTtcbi8qKlxuICogUmVwcmVzZW50cyBhIHZhbHVlIG9iamVjdCB3aGVyZSBrZXkgaXMgYW4gb2JqZWN0IHdpdGggbWluIGFuZCBtYXggcHJvcGVydGllcyB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqL1xuZXhwb3J0IHR5cGUgVmFsdWUgPSB7XG4gIFtrZXkgaW4ga2V5b2YgTWluTWF4VmFsdWVzXTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNvbnN0IERBVEVfU0VMRUNUSU9OX1ZBTFVFUyA9IHtcbiAgLy8gV2lsbCBiZSB1bmNvbW1lbnRlZCBpbiBNVE0tNjE5MjBcbiAgLy8gZGFzaGJvYXJkX2NvbnRleHQ6ICdkYXNoYm9hcmRfY29udGV4dCcsXG4gIGNvbmZpZzogJ2NvbmZpZycsXG4gIHZpZXdfYW5kX2NvbmZpZzogJ3ZpZXdfYW5kX2NvbmZpZydcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBEQVRFX1NFTEVDVElPTl9WQUxVRVNfQVJSID0gW1xuICAvLyBXaWxsIGJlIHVuY29tbWVudGVkIGluIE1UTS02MTkyMFxuICAvLyBEQVRFX1NFTEVDVElPTl9WQUxVRVMuZGFzaGJvYXJkX2NvbnRleHQsXG4gIERBVEVfU0VMRUNUSU9OX1ZBTFVFUy5jb25maWcsXG4gIERBVEVfU0VMRUNUSU9OX1ZBTFVFUy52aWV3X2FuZF9jb25maWdcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBEQVRFX1NFTEVDVElPTl9MQUJFTFMgPSB7XG4gIGNvbmZpZzogZ2V0dGV4dCgnV2lkZ2V0IGNvbmZpZ3VyYXRpb24nKSBhcyAnV2lkZ2V0IGNvbmZpZ3VyYXRpb24nLFxuICB2aWV3X2FuZF9jb25maWc6IGdldHRleHQoJ1dpZGdldCBhbmQgd2lkZ2V0IGNvbmZpZ3VyYXRpb24nKSBhcyAnV2lkZ2V0IGFuZCB3aWRnZXQgY29uZmlndXJhdGlvbicsXG4gIGRhc2hib2FyZF9jb250ZXh0OiBnZXR0ZXh0KCdEYXNoYm9hcmQgdGltZSByYW5nZScpIGFzICdEYXNoYm9hcmQgdGltZSByYW5nZSdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSRUZSRVNIX0lOVEVSVkFMX1ZBTFVFU19BUlIgPSBbNV8wMDAsIDEwXzAwMCwgMTVfMDAwLCAzMF8wMDAsIDYwXzAwMF07XG5cbmV4cG9ydCBjb25zdCBSRU5ERVJfVFlQRVNfTEFCRUxTID0ge1xuICBtaW46IGdldHRleHQoJ01pbmltdW0nKSBhcyAnTWluaW11bScsXG4gIG1heDogZ2V0dGV4dCgnTWF4aW11bScpIGFzICdNYXhpbXVtJyxcbiAgYXJlYTogZ2V0dGV4dCgnQXJlYScpIGFzICdBcmVhJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IElOVEVSVkFMX1ZBTFVFU19BUlIgPSBbXG4gIFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLm1pbnV0ZXMsXG4gIFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLmhvdXJzLFxuICBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy5kYXlzLFxuICBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy53ZWVrcyxcbiAgVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMubW9udGhzLFxuICBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy5jdXN0b21cbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBUSU1FX1JBTkdFX0lOVEVSVkFMX0xBQkVMUyA9IHtcbiAgbWludXRlczogZ2V0dGV4dCgnTGFzdCBtaW51dGUnKSBhcyAnTGFzdCBtaW51dGUnLFxuICBob3VyczogZ2V0dGV4dCgnTGFzdCBob3VyJykgYXMgJ0xhc3QgaG91cicsXG4gIGRheXM6IGdldHRleHQoJ0xhc3QgZGF5JykgYXMgJ0xhc3QgZGF5JyxcbiAgd2Vla3M6IGdldHRleHQoJ0xhc3Qgd2VlaycpIGFzICdMYXN0IHdlZWsnLFxuICBtb250aHM6IGdldHRleHQoJ0xhc3QgbW9udGgnKSBhcyAnTGFzdCBtb250aCcsXG4gIGN1c3RvbTogZ2V0dGV4dCgnQ3VzdG9tJykgYXMgJ0N1c3RvbSdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBEVVJBVElPTl9PUFRJT05TID0gW1xuICB7XG4gICAgaWQ6IFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLm1pbnV0ZXMsXG4gICAgbGFiZWw6IFRJTUVfUkFOR0VfSU5URVJWQUxfTEFCRUxTLm1pbnV0ZXMsXG4gICAgdW5pdDogVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMubWludXRlcyxcbiAgICBhbW91bnQ6IDFcbiAgfSxcbiAge1xuICAgIGlkOiBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy5ob3VycyxcbiAgICBsYWJlbDogVElNRV9SQU5HRV9JTlRFUlZBTF9MQUJFTFMuaG91cnMsXG4gICAgdW5pdDogVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMuaG91cnMsXG4gICAgYW1vdW50OiAxXG4gIH0sXG4gIHtcbiAgICBpZDogVElNRV9SQU5HRV9JTlRFUlZBTF9VTklUU19WQUxVRVMuZGF5cyxcbiAgICBsYWJlbDogVElNRV9SQU5HRV9JTlRFUlZBTF9MQUJFTFMuZGF5cyxcbiAgICB1bml0OiBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy5kYXlzLFxuICAgIGFtb3VudDogMVxuICB9LFxuICB7XG4gICAgaWQ6IFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLndlZWtzLFxuICAgIGxhYmVsOiBUSU1FX1JBTkdFX0lOVEVSVkFMX0xBQkVMUy53ZWVrcyxcbiAgICB1bml0OiBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy53ZWVrcyxcbiAgICBhbW91bnQ6IDFcbiAgfSxcbiAge1xuICAgIGlkOiBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy5tb250aHMsXG4gICAgbGFiZWw6IFRJTUVfUkFOR0VfSU5URVJWQUxfTEFCRUxTLm1vbnRocyxcbiAgICB1bml0OiBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy5tb250aHMsXG4gICAgYW1vdW50OiAxXG4gIH0sXG4gIHsgaWQ6IFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLmN1c3RvbSwgbGFiZWw6IFRJTUVfUkFOR0VfSU5URVJWQUxfTEFCRUxTLmN1c3RvbSB9XG5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbG9yUmFuZ2VCb3VuZGFyaWVzIHtcbiAgeWVsbG93UmFuZ2VNaW46IG51bWJlcjtcbiAgeWVsbG93UmFuZ2VNYXg6IG51bWJlcjtcbiAgcmVkUmFuZ2VNaW46IG51bWJlcjtcbiAgcmVkUmFuZ2VNYXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhcG9pbnRXaXRoVmFsdWVzIGV4dGVuZHMgS1BJRGV0YWlscyB7XG4gIHNlcmllc1VuaXQ/OiBzdHJpbmc7XG4gIHZhbHVlczogTWVhc3VyZW1lbnRSYW5nZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHVyYXRpb24ge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB1bml0Pzogc3RyaW5nO1xuICBhbW91bnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVDb2x1bW5IZWFkZXIge1xuICBkZXZpY2VOYW1lOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHJlbmRlclR5cGU6IHN0cmluZztcbiAgdW5pdDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVSYW5nZSB7XG4gIGRhdGVGcm9tOiBzdHJpbmc7XG4gIGRhdGVUbzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFwb2ludHNUYWJsZUNvbmZpZyB7XG4gIGFnZ3JlZ2F0aW9uPzogQWdncmVnYXRpb25PcHRpb247XG4gIGNvbnRleHQ/OiBudW1iZXI7XG4gIGRhdGFwb2ludHM6IEtQSURldGFpbHNbXTtcbiAgLyoqXG4gICAqIEFycmF5IHRoYXQgY29udGFpbnMgZ2xvYmFsIHRpbWUgY29udGV4dCBkYXRlRnJvbSBhbmQgZGF0ZVRvLlxuICAgKi9cbiAgZGF0ZT86IHN0cmluZ1tdO1xuICBkYXRlRnJvbTogc3RyaW5nO1xuICBkYXRlVG86IHN0cmluZztcbiAgZGVjaW1hbFBsYWNlcz86IG51bWJlcjtcbiAgZGlzcGxheURhdGVTZWxlY3Rpb246IGJvb2xlYW47XG4gIGRpc3BsYXlTZXR0aW5nczoge1xuICAgIGdsb2JhbFRpbWVDb250ZXh0OiBib29sZWFuO1xuICAgIGdsb2JhbFJlYWx0aW1lQ29udGV4dDogYm9vbGVhbjtcbiAgICBnbG9iYWxBZ2dyZWdhdGlvbkNvbnRleHQ6IGJvb2xlYW47XG4gIH07XG4gIGludGVydmFsOiBUaW1lUmFuZ2VJbnRlcnZhbDtcbiAgaXNBdXRvUmVmcmVzaEVuYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWx0aW1lOiBib29sZWFuO1xuICByZWZyZXNoSW50ZXJ2YWw/OiBudW1iZXI7XG4gIHNlbGVjdGVkOiBvYmplY3Q7XG4gIHdpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YXBvaW50VGFibGVJdGVtIHtcbiAgZGF0ZUFuZFRpbWU6IHN0cmluZztcbiAgZGV2aWNlTmFtZTogc3RyaW5nO1xuICBmcmFnbWVudDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICByZWRSYW5nZU1heD86IG51bWJlcjtcbiAgcmVkUmFuZ2VNaW4/OiBudW1iZXI7XG4gIHJlbmRlclR5cGU6IHN0cmluZztcbiAgc2VyaWVzOiBzdHJpbmc7XG4gIHZhbHVlOiBWYWx1ZTtcbiAgeWVsbG93UmFuZ2VNYXg/OiBudW1iZXI7XG4gIHllbGxvd1JhbmdlTWluPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwZWREYXRhcG9pbnRUYWJsZUl0ZW0ge1xuICBkYXRlQW5kVGltZTogc3RyaW5nO1xuICBkZXZpY2VOYW1lOiBzdHJpbmc7XG4gIHJvd0l0ZW1zOiAoe1xuICAgIGZyYWdtZW50OiBzdHJpbmc7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICByZWRSYW5nZU1heD86IG51bWJlcjtcbiAgICByZWRSYW5nZU1pbj86IG51bWJlcjtcbiAgICByZW5kZXJUeXBlOiBzdHJpbmc7XG4gICAgc2VyaWVzOiBzdHJpbmc7XG4gICAgdmFsdWU6IFZhbHVlO1xuICAgIHllbGxvd1JhbmdlTWF4PzogbnVtYmVyO1xuICAgIHllbGxvd1JhbmdlTWluPzogbnVtYmVyO1xuICB9IHwgbnVsbClbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJpZXNEYXRhV2l0aFJlc3BvbnNlIHtcbiAgc291cmNlOiBTb3VyY2VJZDtcbiAgZGF0YTogSVNlcmllcztcbiAgcmVzOiBJRmV0Y2hSZXNwb25zZTtcbn1cbiJdfQ==
@@ -0,0 +1,52 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { TIME_RANGE_INTERVAL_UNITS_VALUES } from '@c8y/ngx-components/datapoints-export-selector';
3
+ import { DatapointsTableViewService } from './datapoints-table-view/datapoints-table-view.service';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./datapoints-table-view/datapoints-table-view.service";
6
+ export class DatapointsTableService {
7
+ constructor(datapointsTableViewService) {
8
+ this.datapointsTableViewService = datapointsTableViewService;
9
+ }
10
+ calculateDateRange(interval) {
11
+ const now = new Date();
12
+ const nowString = now.toISOString();
13
+ let dateFrom;
14
+ switch (interval) {
15
+ case TIME_RANGE_INTERVAL_UNITS_VALUES.minutes:
16
+ dateFrom = this.datapointsTableViewService.adjustDate(nowString, -1, true);
17
+ break;
18
+ case TIME_RANGE_INTERVAL_UNITS_VALUES.hours:
19
+ const minutesInAnHourNegative = -60;
20
+ dateFrom = this.datapointsTableViewService.adjustDate(nowString, minutesInAnHourNegative, true);
21
+ break;
22
+ case TIME_RANGE_INTERVAL_UNITS_VALUES.days:
23
+ const minutesInADayNegative = -24 * 60;
24
+ dateFrom = this.datapointsTableViewService.adjustDate(nowString, minutesInADayNegative, true);
25
+ break;
26
+ case TIME_RANGE_INTERVAL_UNITS_VALUES.weeks:
27
+ const minutesInAWeekNegative = -7 * 24 * 60;
28
+ dateFrom = this.datapointsTableViewService.adjustDate(nowString, minutesInAWeekNegative, true);
29
+ break;
30
+ case TIME_RANGE_INTERVAL_UNITS_VALUES.months:
31
+ const oneMonthAgo = new Date(now);
32
+ oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1);
33
+ dateFrom = this.datapointsTableViewService.adjustDate(oneMonthAgo.toISOString(), 0, true);
34
+ break;
35
+ default:
36
+ throw new Error('Invalid time interval');
37
+ }
38
+ return {
39
+ dateFrom: dateFrom,
40
+ dateTo: this.datapointsTableViewService.adjustDate(nowString, 0, true)
41
+ };
42
+ }
43
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableService, deps: [{ token: i1.DatapointsTableViewService }], target: i0.ɵɵFactoryTarget.Injectable }); }
44
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableService, providedIn: 'root' }); }
45
+ }
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsTableService, decorators: [{
47
+ type: Injectable,
48
+ args: [{
49
+ providedIn: 'root'
50
+ }]
51
+ }], ctorParameters: () => [{ type: i1.DatapointsTableViewService }] });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy10YWJsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsZ0NBQWdDLEVBRWpDLE1BQU0sZ0RBQWdELENBQUM7QUFDeEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdURBQXVELENBQUM7OztBQU1uRyxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQW9CLDBCQUFzRDtRQUF0RCwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO0lBQUcsQ0FBQztJQUU5RSxrQkFBa0IsQ0FBQyxRQUEyQjtRQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQyxJQUFJLFFBQWdCLENBQUM7UUFFckIsUUFBUSxRQUFRLEVBQUUsQ0FBQztZQUNqQixLQUFLLGdDQUFnQyxDQUFDLE9BQU87Z0JBQzNDLFFBQVEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDM0UsTUFBTTtZQUNSLEtBQUssZ0NBQWdDLENBQUMsS0FBSztnQkFDekMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsUUFBUSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLENBQ25ELFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsSUFBSSxDQUNMLENBQUM7Z0JBQ0YsTUFBTTtZQUNSLEtBQUssZ0NBQWdDLENBQUMsSUFBSTtnQkFDeEMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZDLFFBQVEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUNuRCxTQUFTLEVBQ1QscUJBQXFCLEVBQ3JCLElBQUksQ0FDTCxDQUFDO2dCQUNGLE1BQU07WUFDUixLQUFLLGdDQUFnQyxDQUFDLEtBQUs7Z0JBQ3pDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDNUMsUUFBUSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLENBQ25ELFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsSUFBSSxDQUNMLENBQUM7Z0JBQ0YsTUFBTTtZQUNSLEtBQUssZ0NBQWdDLENBQUMsTUFBTTtnQkFDMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxRQUFRLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMxRixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLFFBQVE7WUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUM7U0FDdkUsQ0FBQztJQUNKLENBQUM7OEdBbERVLHNCQUFzQjtrSEFBdEIsc0JBQXNCLGNBRnJCLE1BQU07OzJGQUVQLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUyxcbiAgVGltZVJhbmdlSW50ZXJ2YWxcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvcic7XG5pbXBvcnQgeyBEYXRhcG9pbnRzVGFibGVWaWV3U2VydmljZSB9IGZyb20gJy4vZGF0YXBvaW50cy10YWJsZS12aWV3L2RhdGFwb2ludHMtdGFibGUtdmlldy5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4vZGF0YXBvaW50cy10YWJsZS13aWRnZXQubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzVGFibGVTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhcG9pbnRzVGFibGVWaWV3U2VydmljZTogRGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2UpIHt9XG5cbiAgY2FsY3VsYXRlRGF0ZVJhbmdlKGludGVydmFsOiBUaW1lUmFuZ2VJbnRlcnZhbCk6IERhdGVSYW5nZSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBub3dTdHJpbmcgPSBub3cudG9JU09TdHJpbmcoKTtcblxuICAgIGxldCBkYXRlRnJvbTogc3RyaW5nO1xuXG4gICAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgICAgY2FzZSBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy5taW51dGVzOlxuICAgICAgICBkYXRlRnJvbSA9IHRoaXMuZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2UuYWRqdXN0RGF0ZShub3dTdHJpbmcsIC0xLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLmhvdXJzOlxuICAgICAgICBjb25zdCBtaW51dGVzSW5BbkhvdXJOZWdhdGl2ZSA9IC02MDtcbiAgICAgICAgZGF0ZUZyb20gPSB0aGlzLmRhdGFwb2ludHNUYWJsZVZpZXdTZXJ2aWNlLmFkanVzdERhdGUoXG4gICAgICAgICAgbm93U3RyaW5nLFxuICAgICAgICAgIG1pbnV0ZXNJbkFuSG91ck5lZ2F0aXZlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLmRheXM6XG4gICAgICAgIGNvbnN0IG1pbnV0ZXNJbkFEYXlOZWdhdGl2ZSA9IC0yNCAqIDYwO1xuICAgICAgICBkYXRlRnJvbSA9IHRoaXMuZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2UuYWRqdXN0RGF0ZShcbiAgICAgICAgICBub3dTdHJpbmcsXG4gICAgICAgICAgbWludXRlc0luQURheU5lZ2F0aXZlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRJTUVfUkFOR0VfSU5URVJWQUxfVU5JVFNfVkFMVUVTLndlZWtzOlxuICAgICAgICBjb25zdCBtaW51dGVzSW5BV2Vla05lZ2F0aXZlID0gLTcgKiAyNCAqIDYwO1xuICAgICAgICBkYXRlRnJvbSA9IHRoaXMuZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2UuYWRqdXN0RGF0ZShcbiAgICAgICAgICBub3dTdHJpbmcsXG4gICAgICAgICAgbWludXRlc0luQVdlZWtOZWdhdGl2ZSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUSU1FX1JBTkdFX0lOVEVSVkFMX1VOSVRTX1ZBTFVFUy5tb250aHM6XG4gICAgICAgIGNvbnN0IG9uZU1vbnRoQWdvID0gbmV3IERhdGUobm93KTtcbiAgICAgICAgb25lTW9udGhBZ28uc2V0TW9udGgob25lTW9udGhBZ28uZ2V0TW9udGgoKSAtIDEpO1xuICAgICAgICBkYXRlRnJvbSA9IHRoaXMuZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2UuYWRqdXN0RGF0ZShvbmVNb250aEFnby50b0lTT1N0cmluZygpLCAwLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGltZSBpbnRlcnZhbCcpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkYXRlRnJvbTogZGF0ZUZyb20sXG4gICAgICBkYXRlVG86IHRoaXMuZGF0YXBvaW50c1RhYmxlVmlld1NlcnZpY2UuYWRqdXN0RGF0ZShub3dTdHJpbmcsIDAsIHRydWUpXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,68 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output } from '@angular/core';
3
+ import { ControlContainer, ReactiveFormsModule } from '@angular/forms';
4
+ import { CoreModule, gettext } from '@c8y/ngx-components';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@c8y/ngx-components";
7
+ import * as i2 from "@angular/common";
8
+ import * as i3 from "@angular/forms";
9
+ export class DateRangePickerComponent {
10
+ constructor() {
11
+ /**
12
+ * If set to true, the component will be reactive and will emit the updatedDate on every change.
13
+ * Otherwise, the component will use a non emitting variant of a template.
14
+ */
15
+ this.isEmittingDateChange = false;
16
+ /**
17
+ * Determines the display of from and to date picker labels.
18
+ */
19
+ this.showLabel = true;
20
+ this.updatedDate = new EventEmitter();
21
+ this.DATE_FROM = 'dateFrom';
22
+ this.DATE_TO = 'dateTo';
23
+ this.FROM_DATE = gettext('From`date`');
24
+ this.HAS_ERROR = 'has-error';
25
+ this.INVALID_DATE_TIME = 'invalidDateTime';
26
+ this.THIS_DATE_IS_INVALID = gettext('This date is invalid.');
27
+ this.THIS_DATE_IS_AFTER_THE_LAST_ALLOWED_DATE = gettext('This date is after the latest allowed date.');
28
+ this.THIS_DATE_IS_BEFORE_THE_EARLIEST_ALLOWED_DATE = gettext('This date is before the earliest allowed date.');
29
+ this.TO_DATE = gettext('To`date`');
30
+ this.parentContainer = inject(ControlContainer);
31
+ }
32
+ onDateFromChange(dateFrom) {
33
+ this.updatedDate.emit({
34
+ dateFrom
35
+ });
36
+ }
37
+ onDateToChange(dateTo) {
38
+ this.updatedDate.emit({
39
+ dateTo
40
+ });
41
+ }
42
+ get parentFormGroup() {
43
+ return this.parentContainer.control;
44
+ }
45
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DateRangePickerComponent, isStandalone: true, selector: "c8y-date-range-picker", inputs: { isEmittingDateChange: "isEmittingDateChange", showLabel: "showLabel" }, outputs: { updatedDate: "updatedDate" }, ngImport: i0, template: "<div class=\"d-flex gap-8 a-i-center flex-wrap\">\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"FROM_DATE | translate\"\n [for]=\"DATE_FROM\"\n >\n {{ FROM_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_FROM\"\n [maxDate]=\"parentFormGroup?.value.dateTo\"\n [placeholder]=\"FROM_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateFrom\"\n [ngClass]=\"parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateFromChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages\n class=\"text-nowrap\"\n [show]=\"parentFormGroup?.controls.dateFrom.errors\"\n >\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"THIS_DATE_IS_AFTER_THE_LAST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"TO_DATE | translate\"\n [for]=\"DATE_TO\"\n >\n {{ TO_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_TO\"\n [minDate]=\"parentFormGroup?.value.dateFrom\"\n [placeholder]=\"TO_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateTo\"\n [ngClass]=\"parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateToChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"parentFormGroup?.controls.dateTo.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"THIS_DATE_IS_BEFORE_THE_EARLIEST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i1.DateTimePickerComponent, selector: "c8y-date-time-picker", inputs: ["minDate", "maxDate", "placeholder", "dateInputFormat", "adaptivePosition", "size", "dateType", "config"], outputs: ["onDateSelected"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }], viewProviders: [
47
+ {
48
+ provide: ControlContainer,
49
+ useFactory: () => inject(ControlContainer, { skipSelf: true })
50
+ }
51
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
52
+ }
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DateRangePickerComponent, decorators: [{
54
+ type: Component,
55
+ args: [{ selector: 'c8y-date-range-picker', standalone: true, imports: [CoreModule, CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, viewProviders: [
56
+ {
57
+ provide: ControlContainer,
58
+ useFactory: () => inject(ControlContainer, { skipSelf: true })
59
+ }
60
+ ], template: "<div class=\"d-flex gap-8 a-i-center flex-wrap\">\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"FROM_DATE | translate\"\n [for]=\"DATE_FROM\"\n >\n {{ FROM_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_FROM\"\n [maxDate]=\"parentFormGroup?.value.dateTo\"\n [placeholder]=\"FROM_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateFrom\"\n [ngClass]=\"parentFormGroup?.controls.dateFrom.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateFromChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages\n class=\"text-nowrap\"\n [show]=\"parentFormGroup?.controls.dateFrom.errors\"\n >\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"THIS_DATE_IS_AFTER_THE_LAST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n <c8y-form-group\n [ngClass]=\"[\n parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : '',\n isEmittingDateChange ? 'd-flex a-i-center gap-4 m-b-0' : ''\n ]\"\n >\n <ng-container *ngIf=\"showLabel\">\n <label\n [title]=\"TO_DATE | translate\"\n [for]=\"DATE_TO\"\n >\n {{ TO_DATE | translate }}\n </label>\n </ng-container>\n <c8y-date-time-picker\n id=\"DATE_TO\"\n [minDate]=\"parentFormGroup?.value.dateFrom\"\n [placeholder]=\"TO_DATE | translate\"\n [formControl]=\"parentFormGroup?.controls.dateTo\"\n [ngClass]=\"parentFormGroup?.controls.dateTo.errors ? HAS_ERROR : ''\"\n (ngModelChange)=\"onDateToChange($event)\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"parentFormGroup?.controls.dateTo.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"THIS_DATE_IS_BEFORE_THE_EARLIEST_ALLOWED_DATE | translate\"\n ></c8y-message>\n <c8y-message\n name=\"INVALID_DATE_TIME\"\n [text]=\"THIS_DATE_IS_INVALID | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n</div>\n" }]
61
+ }], propDecorators: { isEmittingDateChange: [{
62
+ type: Input
63
+ }], showLabel: [{
64
+ type: Input
65
+ }], updatedDate: [{
66
+ type: Output
67
+ }] } });
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFhLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFlMUQsTUFBTSxPQUFPLHdCQUF3QjtJQWJyQztRQWNFOzs7V0FHRztRQUNNLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUN0Qzs7V0FFRztRQUNNLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDaEIsZ0JBQVcsR0FHaEIsSUFBSSxZQUFZLEVBR2pCLENBQUM7UUFFSSxjQUFTLEdBQUcsVUFBVSxDQUFDO1FBQ3ZCLFlBQU8sR0FBRyxRQUFRLENBQUM7UUFDbkIsY0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsQyxjQUFTLEdBQUcsV0FBVyxDQUFDO1FBQ3hCLHNCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQ3RDLHlCQUFvQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3hELDZDQUF3QyxHQUFHLE9BQU8sQ0FDekQsNkNBQTZDLENBQzlDLENBQUM7UUFDTyxrREFBNkMsR0FBRyxPQUFPLENBQzlELGdEQUFnRCxDQUNqRCxDQUFDO1FBQ08sWUFBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQixvQkFBZSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBaUJwRDtJQWZDLGdCQUFnQixDQUFDLFFBQWdCO1FBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ3BCLFFBQVE7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsTUFBTTtTQUNQLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQW9CLENBQUM7SUFDbkQsQ0FBQzs4R0EvQ1Usd0JBQXdCO2tHQUF4Qix3QkFBd0IsNE1DekJyQyxxM0VBdUVBLDJDRHZEWSxVQUFVLGtxQ0FBRSxZQUFZLDhCQUFFLG1CQUFtQixvQkFFeEM7WUFDYjtnQkFDRSxPQUFPLEVBQUUsZ0JBQWdCO2dCQUN6QixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2FBQy9EO1NBQ0Y7OzJGQUVVLHdCQUF3QjtrQkFicEMsU0FBUzsrQkFDRSx1QkFBdUIsY0FFckIsSUFBSSxXQUNQLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxtQkFDdkMsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEM7d0JBQ2I7NEJBQ0UsT0FBTyxFQUFFLGdCQUFnQjs0QkFDekIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzt5QkFDL0Q7cUJBQ0Y7OEJBT1Esb0JBQW9CO3NCQUE1QixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvcmVNb2R1bGUsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWRhdGUtcmFuZ2UtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvcmVNb2R1bGUsIENvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB2aWV3UHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lcixcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IGluamVjdChDb250cm9sQ29udGFpbmVyLCB7IHNraXBTZWxmOiB0cnVlIH0pXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGNvbXBvbmVudCB3aWxsIGJlIHJlYWN0aXZlIGFuZCB3aWxsIGVtaXQgdGhlIHVwZGF0ZWREYXRlIG9uIGV2ZXJ5IGNoYW5nZS5cbiAgICogT3RoZXJ3aXNlLCB0aGUgY29tcG9uZW50IHdpbGwgdXNlIGEgbm9uIGVtaXR0aW5nIHZhcmlhbnQgb2YgYSB0ZW1wbGF0ZS5cbiAgICovXG4gIEBJbnB1dCgpIGlzRW1pdHRpbmdEYXRlQ2hhbmdlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBkaXNwbGF5IG9mIGZyb20gYW5kIHRvIGRhdGUgcGlja2VyIGxhYmVscy5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dMYWJlbCA9IHRydWU7XG4gIEBPdXRwdXQoKSB1cGRhdGVkRGF0ZTogRXZlbnRFbWl0dGVyPHtcbiAgICBkYXRlRnJvbT86IHN0cmluZyB8IG51bGw7XG4gICAgZGF0ZVRvPzogc3RyaW5nIHwgbnVsbDtcbiAgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBkYXRlRnJvbT86IHN0cmluZyB8IG51bGw7XG4gICAgZGF0ZVRvPzogc3RyaW5nIHwgbnVsbDtcbiAgfT4oKTtcblxuICByZWFkb25seSBEQVRFX0ZST00gPSAnZGF0ZUZyb20nO1xuICByZWFkb25seSBEQVRFX1RPID0gJ2RhdGVUbyc7XG4gIHJlYWRvbmx5IEZST01fREFURSA9IGdldHRleHQoJ0Zyb21gZGF0ZWAnKTtcbiAgcmVhZG9ubHkgSEFTX0VSUk9SID0gJ2hhcy1lcnJvcic7XG4gIHJlYWRvbmx5IElOVkFMSURfREFURV9USU1FID0gJ2ludmFsaWREYXRlVGltZSc7XG4gIHJlYWRvbmx5IFRISVNfREFURV9JU19JTlZBTElEID0gZ2V0dGV4dCgnVGhpcyBkYXRlIGlzIGludmFsaWQuJyk7XG4gIHJlYWRvbmx5IFRISVNfREFURV9JU19BRlRFUl9USEVfTEFTVF9BTExPV0VEX0RBVEUgPSBnZXR0ZXh0KFxuICAgICdUaGlzIGRhdGUgaXMgYWZ0ZXIgdGhlIGxhdGVzdCBhbGxvd2VkIGRhdGUuJ1xuICApO1xuICByZWFkb25seSBUSElTX0RBVEVfSVNfQkVGT1JFX1RIRV9FQVJMSUVTVF9BTExPV0VEX0RBVEUgPSBnZXR0ZXh0KFxuICAgICdUaGlzIGRhdGUgaXMgYmVmb3JlIHRoZSBlYXJsaWVzdCBhbGxvd2VkIGRhdGUuJ1xuICApO1xuICByZWFkb25seSBUT19EQVRFID0gZ2V0dGV4dCgnVG9gZGF0ZWAnKTtcbiAgcHJpdmF0ZSBwYXJlbnRDb250YWluZXIgPSBpbmplY3QoQ29udHJvbENvbnRhaW5lcik7XG5cbiAgb25EYXRlRnJvbUNoYW5nZShkYXRlRnJvbTogc3RyaW5nKSB7XG4gICAgdGhpcy51cGRhdGVkRGF0ZS5lbWl0KHtcbiAgICAgIGRhdGVGcm9tXG4gICAgfSk7XG4gIH1cblxuICBvbkRhdGVUb0NoYW5nZShkYXRlVG86IHN0cmluZykge1xuICAgIHRoaXMudXBkYXRlZERhdGUuZW1pdCh7XG4gICAgICBkYXRlVG9cbiAgICB9KTtcbiAgfVxuXG4gIGdldCBwYXJlbnRGb3JtR3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q29udGFpbmVyLmNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC04IGEtaS1jZW50ZXIgZmxleC13cmFwXCI+XG4gIDxjOHktZm9ybS1ncm91cFxuICAgIFtuZ0NsYXNzXT1cIltcbiAgICAgIHBhcmVudEZvcm1Hcm91cD8uY29udHJvbHMuZGF0ZUZyb20uZXJyb3JzID8gSEFTX0VSUk9SIDogJycsXG4gICAgICBpc0VtaXR0aW5nRGF0ZUNoYW5nZSA/ICdkLWZsZXggYS1pLWNlbnRlciBnYXAtNCBtLWItMCcgOiAnJ1xuICAgIF1cIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dMYWJlbFwiPlxuICAgICAgPGxhYmVsXG4gICAgICAgIFt0aXRsZV09XCJGUk9NX0RBVEUgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbZm9yXT1cIkRBVEVfRlJPTVwiXG4gICAgICA+XG4gICAgICAgIHt7IEZST01fREFURSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9sYWJlbD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8Yzh5LWRhdGUtdGltZS1waWNrZXJcbiAgICAgIGlkPVwiREFURV9GUk9NXCJcbiAgICAgIFttYXhEYXRlXT1cInBhcmVudEZvcm1Hcm91cD8udmFsdWUuZGF0ZVRvXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJGUk9NX0RBVEUgfCB0cmFuc2xhdGVcIlxuICAgICAgW2Zvcm1Db250cm9sXT1cInBhcmVudEZvcm1Hcm91cD8uY29udHJvbHMuZGF0ZUZyb21cIlxuICAgICAgW25nQ2xhc3NdPVwicGFyZW50Rm9ybUdyb3VwPy5jb250cm9scy5kYXRlRnJvbS5lcnJvcnMgPyBIQVNfRVJST1IgOiAnJ1wiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkRhdGVGcm9tQ2hhbmdlKCRldmVudClcIlxuICAgID48L2M4eS1kYXRlLXRpbWUtcGlja2VyPlxuICAgIDxjOHktbWVzc2FnZXNcbiAgICAgIGNsYXNzPVwidGV4dC1ub3dyYXBcIlxuICAgICAgW3Nob3ddPVwicGFyZW50Rm9ybUdyb3VwPy5jb250cm9scy5kYXRlRnJvbS5lcnJvcnNcIlxuICAgID5cbiAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICBuYW1lPVwiZGF0ZUFmdGVyUmFuZ2VNYXhcIlxuICAgICAgICBbdGV4dF09XCJUSElTX0RBVEVfSVNfQUZURVJfVEhFX0xBU1RfQUxMT1dFRF9EQVRFIHwgdHJhbnNsYXRlXCJcbiAgICAgID48L2M4eS1tZXNzYWdlPlxuICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgIG5hbWU9XCJJTlZBTElEX0RBVEVfVElNRVwiXG4gICAgICAgIFt0ZXh0XT1cIlRISVNfREFURV9JU19JTlZBTElEIHwgdHJhbnNsYXRlXCJcbiAgICAgID48L2M4eS1tZXNzYWdlPlxuICAgIDwvYzh5LW1lc3NhZ2VzPlxuICA8L2M4eS1mb3JtLWdyb3VwPlxuICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICBbbmdDbGFzc109XCJbXG4gICAgICBwYXJlbnRGb3JtR3JvdXA/LmNvbnRyb2xzLmRhdGVUby5lcnJvcnMgPyBIQVNfRVJST1IgOiAnJyxcbiAgICAgIGlzRW1pdHRpbmdEYXRlQ2hhbmdlID8gJ2QtZmxleCBhLWktY2VudGVyIGdhcC00IG0tYi0wJyA6ICcnXG4gICAgXVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0xhYmVsXCI+XG4gICAgICA8bGFiZWxcbiAgICAgICAgW3RpdGxlXT1cIlRPX0RBVEUgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbZm9yXT1cIkRBVEVfVE9cIlxuICAgICAgPlxuICAgICAgICB7eyBUT19EQVRFIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2xhYmVsPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxjOHktZGF0ZS10aW1lLXBpY2tlclxuICAgICAgaWQ9XCJEQVRFX1RPXCJcbiAgICAgIFttaW5EYXRlXT1cInBhcmVudEZvcm1Hcm91cD8udmFsdWUuZGF0ZUZyb21cIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIlRPX0RBVEUgfCB0cmFuc2xhdGVcIlxuICAgICAgW2Zvcm1Db250cm9sXT1cInBhcmVudEZvcm1Hcm91cD8uY29udHJvbHMuZGF0ZVRvXCJcbiAgICAgIFtuZ0NsYXNzXT1cInBhcmVudEZvcm1Hcm91cD8uY29udHJvbHMuZGF0ZVRvLmVycm9ycyA/IEhBU19FUlJPUiA6ICcnXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGF0ZVRvQ2hhbmdlKCRldmVudClcIlxuICAgID48L2M4eS1kYXRlLXRpbWUtcGlja2VyPlxuICAgIDxjOHktbWVzc2FnZXMgW3Nob3ddPVwicGFyZW50Rm9ybUdyb3VwPy5jb250cm9scy5kYXRlVG8uZXJyb3JzXCI+XG4gICAgICA8Yzh5LW1lc3NhZ2VcbiAgICAgICAgbmFtZT1cImRhdGVCZWZvcmVSYW5nZU1pblwiXG4gICAgICAgIFt0ZXh0XT1cIlRISVNfREFURV9JU19CRUZPUkVfVEhFX0VBUkxJRVNUX0FMTE9XRURfREFURSB8IHRyYW5zbGF0ZVwiXG4gICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICBuYW1lPVwiSU5WQUxJRF9EQVRFX1RJTUVcIlxuICAgICAgICBbdGV4dF09XCJUSElTX0RBVEVfSVNfSU5WQUxJRCB8IHRyYW5zbGF0ZVwiXG4gICAgICA+PC9jOHktbWVzc2FnZT5cbiAgICA8L2M4eS1tZXNzYWdlcz5cbiAgPC9jOHktZm9ybS1ncm91cD5cbjwvZGl2PlxuIl19
@@ -0,0 +1,10 @@
1
+ export * from './datapoints-table-config/datapoints-table-config.component';
2
+ export * from './datapoints-table-view/adjust-aggregated-time-range.pipe';
3
+ export * from './datapoints-table-view/apply-range-class.pipe';
4
+ export * from './datapoints-table-view/datapoints-reload/datapoints-reload.component';
5
+ export * from './datapoints-table-view/datapoints-table-view.component';
6
+ export * from './datapoints-table-view/datapoints-table-view.service';
7
+ export * from './datapoints-table-view/datapoints-table/datapoints-table.component';
8
+ export * from './datapoints-table-view/virtual-scroll-listener.directive';
9
+ export * from './datapoints-table-widget.model';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9kYXRhcG9pbnRzLXRhYmxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNkRBQTZELENBQUM7QUFDNUUsY0FBYywyREFBMkQsQ0FBQztBQUMxRSxjQUFjLGdEQUFnRCxDQUFDO0FBQy9ELGNBQWMsdUVBQXVFLENBQUM7QUFDdEYsY0FBYyx5REFBeUQsQ0FBQztBQUN4RSxjQUFjLHVEQUF1RCxDQUFDO0FBQ3RFLGNBQWMscUVBQXFFLENBQUM7QUFDcEYsY0FBYywyREFBMkQsQ0FBQztBQUMxRSxjQUFjLGlDQUFpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kYXRhcG9pbnRzLXRhYmxlLWNvbmZpZy9kYXRhcG9pbnRzLXRhYmxlLWNvbmZpZy5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvYWRqdXN0LWFnZ3JlZ2F0ZWQtdGltZS1yYW5nZS5waXBlJztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YXBvaW50cy10YWJsZS12aWV3L2FwcGx5LXJhbmdlLWNsYXNzLnBpcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy1yZWxvYWQvZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YXBvaW50cy10YWJsZS12aWV3L2RhdGFwb2ludHMtdGFibGUtdmlldy5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy10YWJsZS12aWV3LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2RhdGFwb2ludHMtdGFibGUtdmlldy92aXJ0dWFsLXNjcm9sbC1saXN0ZW5lci5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhcG9pbnRzLXRhYmxlLXdpZGdldC5tb2RlbCc7XG4iXX0=
@@ -29,7 +29,7 @@ export class MapWidgetConfigComponent {
29
29
  };
30
30
  this.canAutoCenter = true;
31
31
  this.isPositionedDevice = false;
32
- this.refreshOptions = 'none';
32
+ this.refreshOption = 'none';
33
33
  this.destroyed$ = new Subject();
34
34
  // JS precision for floating point number is 15 for 64-bit and because of this provided to leaflet are recalculated
35
35
  // to values almost-like provided (e.g. 0 is recalculated to 1.46e-14; for 180 it's 180.00000000000003).
@@ -119,9 +119,13 @@ export class MapWidgetConfigComponent {
119
119
  ];
120
120
  this.changeCenter();
121
121
  }
122
- updateRefreshOptions() {
123
- this.formConfig.realtime = this.refreshOptions === 'realtime';
124
- if (this.refreshOptions === 'interval') {
122
+ updateRefreshOption() {
123
+ this.formConfig.realtime = this.refreshOption === 'realtime';
124
+ this.config.widgetInstanceGlobalAutoRefreshContext =
125
+ this.refreshOption === 'dashboard-auto-refresh-context';
126
+ this.formConfig.widgetInstanceGlobalAutoRefreshContext =
127
+ this.refreshOption === 'dashboard-auto-refresh-context';
128
+ if (this.refreshOption === 'interval') {
125
129
  this.formConfig.refreshInterval ??= 5000;
126
130
  }
127
131
  else {
@@ -131,7 +135,7 @@ export class MapWidgetConfigComponent {
131
135
  this.formConfig.follow = false;
132
136
  }
133
137
  this.config.widgetInstanceGlobalTimeContext =
134
- this.refreshOptions === 'dashboard-realtime-context';
138
+ this.refreshOption === 'dashboard-realtime-context';
135
139
  if (this.config.widgetInstanceGlobalTimeContext) {
136
140
  this.formConfig.realtime = null;
137
141
  }
@@ -144,15 +148,15 @@ export class MapWidgetConfigComponent {
144
148
  async updateAsset() {
145
149
  this.canAutoCenter = this.mapService.hasPosition(this.config.device);
146
150
  this.isPositionedDevice = this.mapService.isPositionedDevice(this.config.device);
147
- this.refreshOptions = this.getRefreshOptions();
148
- this.updateRefreshOptions();
151
+ this.refreshOption = this.getRefreshOption();
152
+ this.updateRefreshOption();
149
153
  const { data, paging } = await this.mapService.getAllPositionMOs(this.config.device);
150
154
  this.assets = data;
151
155
  if (paging.totalPages > 1) {
152
156
  this.alertService.danger(gettext('It might be possible that assets are not shown in the preview, as the current selection has more than 500 assets and the preview only supports a maximum of 500 assets.'));
153
157
  }
154
158
  }
155
- getRefreshOptions() {
159
+ getRefreshOption() {
156
160
  let option = 'none';
157
161
  if (this.formConfig.realtime) {
158
162
  option = 'realtime';
@@ -163,6 +167,10 @@ export class MapWidgetConfigComponent {
163
167
  else if (this.config.widgetInstanceGlobalTimeContext) {
164
168
  option = 'dashboard-realtime-context';
165
169
  }
170
+ else if (this.config.widgetInstanceGlobalAutoRefreshContext ||
171
+ this.formConfig.widgetInstanceGlobalAutoRefreshContext) {
172
+ option = 'dashboard-auto-refresh-context';
173
+ }
166
174
  const isNotAllowedOption = (!this.isPositionedDevice && option === 'dashboard-realtime-context') ||
167
175
  (!this.isPositionedDevice && option === 'realtime') ||
168
176
  (this.isPositionedDevice && option === 'interval');
@@ -180,7 +188,7 @@ export class MapWidgetConfigComponent {
180
188
  this.previewMap.addMarkerToMap(this.centerIcon);
181
189
  }
182
190
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: MapWidgetConfigComponent, deps: [{ token: i1.MapService }, { token: i2.AlertService }, { token: i3.TranslateService }, { token: MAP_DEFAULT_CONFIG }], target: i0.ɵɵFactoryTarget.Component }); }
183
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: MapWidgetConfigComponent, isStandalone: true, selector: "c8y-map-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMap", first: true, predicate: MapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"row p-t-16\"\n *ngIf=\"formConfig\"\n>\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"2\"\n max=\"18\"\n step=\"1\"\n />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n min=\"-180\"\n max=\"180\"\n required\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div\n class=\"input-group-btn\"\n *ngIf=\"canAutoCenter\"\n >\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n </div>\n </div>\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-6\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n id=\"selectExample\"\n name=\"refreshSelection\"\n [(ngModel)]=\"refreshOptions\"\n (change)=\"updateRefreshOptions()\"\n >\n <option\n [title]=\"'Only refreshing on interaction' | translate\"\n value=\"none\"\n translate\n >\n No automatic refresh\n </option>\n <option\n [title]=\"'Refreshing after the given interval and on interaction' | translate\"\n value=\"interval\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use refresh interval\n </option>\n <option\n [title]=\"'Live updating on each position change' | translate\"\n value=\"realtime\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Realtime\n </option>\n <option\n [title]=\"'Bind widget to dashboard realtime context' | translate\"\n value=\"dashboard-realtime-context\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Dashboard realtime context\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n class=\"label-bottom\"\n name=\"refreshInterval\"\n #intervalRange\n *ngIf=\"refreshOptions === 'interval'\"\n [(ngModel)]=\"formConfig.refreshInterval\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n [translateParams]=\"{ intervalInSeconds: intervalRange.value * 0.001 }\"\n translate\n ngNonBindable\n >\n {{ intervalInSeconds }} s\n </span>\n </div>\n </ng-template>\n <input\n type=\"range\"\n min=\"5000\"\n max=\"100000\"\n step=\"1000\"\n />\n </c8y-range>\n </div>\n <label\n class=\"c8y-switch c8y-switch--inline\"\n *ngIf=\"refreshOptions === 'realtime' || refreshOptions === 'dashboard-realtime-context'\"\n >\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div\n class=\"p-t-16 p-b-16\"\n style=\"width: 100%; height: 240px\"\n>\n <c8y-map\n *ngIf=\"config.mapConfig\"\n [assets]=\"assets\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n</div>\n", dependencies: [{ kind: "ngmodule", type: NgCommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgFormsModule }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i5.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i2.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.RangeDirective, selector: "input[type=\"range\"]" }, { kind: "component", type: i2.RangeComponent, selector: "c8y-range", inputs: ["valueDisplayMode"] }, { kind: "ngmodule", type: IconSelectorModule }, { kind: "component", type: i6.IconSelectorWrapperComponent, selector: "c8y-icon-selector-wrapper", inputs: ["canRemoveIcon", "selectedIcon", "iconSize"], outputs: ["onSelect"] }, { kind: "ngmodule", type: MapModule }, { kind: "component", type: i1.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
191
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: MapWidgetConfigComponent, isStandalone: true, selector: "c8y-map-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMap", first: true, predicate: MapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"row p-t-16\"\n *ngIf=\"formConfig\"\n>\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"2\"\n max=\"18\"\n step=\"1\"\n />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div\n class=\"input-group-btn\"\n *ngIf=\"canAutoCenter\"\n >\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n </div>\n </div>\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-6\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n id=\"selectExample\"\n name=\"refreshSelection\"\n [(ngModel)]=\"refreshOption\"\n (change)=\"updateRefreshOption()\"\n >\n <option\n [title]=\"'Only refreshing on interaction' | translate\"\n value=\"none\"\n translate\n >\n No automatic refresh\n </option>\n <option\n [title]=\"'Refreshing after the given interval and on interaction' | translate\"\n value=\"interval\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use refresh interval\n </option>\n <option\n [title]=\"\n 'Refreshing after the given interval and on interaction, synchronized globally'\n | translate\n \"\n value=\"dashboard-auto-refresh-context\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use global refresh interval\n </option>\n <option\n [title]=\"'Live updating on each position change' | translate\"\n value=\"realtime\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Realtime\n </option>\n <option\n [title]=\"'Bind widget to dashboard realtime context' | translate\"\n value=\"dashboard-realtime-context\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Dashboard realtime context\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n class=\"label-bottom\"\n name=\"refreshInterval\"\n #intervalRange\n *ngIf=\"refreshOption === 'interval'\"\n [(ngModel)]=\"formConfig.refreshInterval\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n [translateParams]=\"{ intervalInSeconds: intervalRange.value * 0.001 }\"\n translate\n ngNonBindable\n >\n {{ intervalInSeconds }} s\n </span>\n </div>\n </ng-template>\n <input\n type=\"range\"\n min=\"5000\"\n max=\"100000\"\n step=\"1000\"\n />\n </c8y-range>\n </div>\n <label\n class=\"c8y-switch c8y-switch--inline\"\n *ngIf=\"refreshOption === 'realtime' || refreshOption === 'dashboard-realtime-context'\"\n >\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div\n class=\"p-t-16 p-b-16\"\n style=\"width: 100%; height: 240px\"\n>\n <c8y-map\n *ngIf=\"config.mapConfig\"\n [assets]=\"assets\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n</div>\n", dependencies: [{ kind: "ngmodule", type: NgCommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgFormsModule }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i5.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i2.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.RangeDirective, selector: "input[type=\"range\"]" }, { kind: "component", type: i2.RangeComponent, selector: "c8y-range", inputs: ["valueDisplayMode"] }, { kind: "ngmodule", type: IconSelectorModule }, { kind: "component", type: i6.IconSelectorWrapperComponent, selector: "c8y-icon-selector-wrapper", inputs: ["canRemoveIcon", "selectedIcon", "iconSize"], outputs: ["onSelect"] }, { kind: "ngmodule", type: MapModule }, { kind: "component", type: i1.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
184
192
  }
185
193
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: MapWidgetConfigComponent, decorators: [{
186
194
  type: Component,
@@ -193,7 +201,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
193
201
  MapModule,
194
202
  AssetLinkPipe,
195
203
  TooltipModule
196
- ], template: "<div\n class=\"row p-t-16\"\n *ngIf=\"formConfig\"\n>\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"2\"\n max=\"18\"\n step=\"1\"\n />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n min=\"-180\"\n max=\"180\"\n required\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div\n class=\"input-group-btn\"\n *ngIf=\"canAutoCenter\"\n >\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n </div>\n </div>\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-6\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n id=\"selectExample\"\n name=\"refreshSelection\"\n [(ngModel)]=\"refreshOptions\"\n (change)=\"updateRefreshOptions()\"\n >\n <option\n [title]=\"'Only refreshing on interaction' | translate\"\n value=\"none\"\n translate\n >\n No automatic refresh\n </option>\n <option\n [title]=\"'Refreshing after the given interval and on interaction' | translate\"\n value=\"interval\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use refresh interval\n </option>\n <option\n [title]=\"'Live updating on each position change' | translate\"\n value=\"realtime\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Realtime\n </option>\n <option\n [title]=\"'Bind widget to dashboard realtime context' | translate\"\n value=\"dashboard-realtime-context\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Dashboard realtime context\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n class=\"label-bottom\"\n name=\"refreshInterval\"\n #intervalRange\n *ngIf=\"refreshOptions === 'interval'\"\n [(ngModel)]=\"formConfig.refreshInterval\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n [translateParams]=\"{ intervalInSeconds: intervalRange.value * 0.001 }\"\n translate\n ngNonBindable\n >\n {{ intervalInSeconds }} s\n </span>\n </div>\n </ng-template>\n <input\n type=\"range\"\n min=\"5000\"\n max=\"100000\"\n step=\"1000\"\n />\n </c8y-range>\n </div>\n <label\n class=\"c8y-switch c8y-switch--inline\"\n *ngIf=\"refreshOptions === 'realtime' || refreshOptions === 'dashboard-realtime-context'\"\n >\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div\n class=\"p-t-16 p-b-16\"\n style=\"width: 100%; height: 240px\"\n>\n <c8y-map\n *ngIf=\"config.mapConfig\"\n [assets]=\"assets\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n</div>\n" }]
204
+ ], template: "<div\n class=\"row p-t-16\"\n *ngIf=\"formConfig\"\n>\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"2\"\n max=\"18\"\n step=\"1\"\n />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div\n class=\"input-group-btn\"\n *ngIf=\"canAutoCenter\"\n >\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n </div>\n </div>\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-6\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n id=\"selectExample\"\n name=\"refreshSelection\"\n [(ngModel)]=\"refreshOption\"\n (change)=\"updateRefreshOption()\"\n >\n <option\n [title]=\"'Only refreshing on interaction' | translate\"\n value=\"none\"\n translate\n >\n No automatic refresh\n </option>\n <option\n [title]=\"'Refreshing after the given interval and on interaction' | translate\"\n value=\"interval\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use refresh interval\n </option>\n <option\n [title]=\"\n 'Refreshing after the given interval and on interaction, synchronized globally'\n | translate\n \"\n value=\"dashboard-auto-refresh-context\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use global refresh interval\n </option>\n <option\n [title]=\"'Live updating on each position change' | translate\"\n value=\"realtime\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Realtime\n </option>\n <option\n [title]=\"'Bind widget to dashboard realtime context' | translate\"\n value=\"dashboard-realtime-context\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Dashboard realtime context\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n class=\"label-bottom\"\n name=\"refreshInterval\"\n #intervalRange\n *ngIf=\"refreshOption === 'interval'\"\n [(ngModel)]=\"formConfig.refreshInterval\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n [translateParams]=\"{ intervalInSeconds: intervalRange.value * 0.001 }\"\n translate\n ngNonBindable\n >\n {{ intervalInSeconds }} s\n </span>\n </div>\n </ng-template>\n <input\n type=\"range\"\n min=\"5000\"\n max=\"100000\"\n step=\"1000\"\n />\n </c8y-range>\n </div>\n <label\n class=\"c8y-switch c8y-switch--inline\"\n *ngIf=\"refreshOption === 'realtime' || refreshOption === 'dashboard-realtime-context'\"\n >\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div\n class=\"p-t-16 p-b-16\"\n style=\"width: 100%; height: 240px\"\n>\n <c8y-map\n *ngIf=\"config.mapConfig\"\n [assets]=\"assets\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n</div>\n" }]
197
205
  }], ctorParameters: () => [{ type: i1.MapService }, { type: i2.AlertService }, { type: i3.TranslateService }, { type: i8.Observable, decorators: [{
198
206
  type: Inject,
199
207
  args: [MAP_DEFAULT_CONFIG]
@@ -203,4 +211,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
203
211
  type: ViewChild,
204
212
  args: [MapComponent]
205
213
  }] } });
206
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXdpZGdldC1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvbWFwL21hcC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL21hcC9tYXAtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBS0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLElBQUksY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsSUFBSSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IsWUFBWSxFQUNaLFdBQVcsRUFDWCxPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUVYLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7OztBQWtCdEQsTUFBTSxPQUFP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RCxJQUFJO1NBQ0wsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7OEdBbk1VLHdCQUF3Qix3R0EyQnpCLGtCQUFrQjtrR0EzQmpCLHdCQUF3QiwySkFvQnhCLFlBQVkscUVDekV6Qiw4aU9BMk5BLDJDRGhMSSxjQUFjLGtJQUNkLGFBQWEsKzZEQUNiLFlBQVkseVJBQ1osV0FBVyw0eEJBQ1gsa0JBQWtCLGlOQUNsQixTQUFTLG9RQUVULGFBQWEsdWpCQVZBLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOzsyRkFheEQsd0JBQXdCO2tCQWhCcEMsU0FBUzsrQkFDRSx1QkFBdUIsaUJBRWxCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLGNBQ3ZELElBQUksV0FDUDt3QkFDUCxjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGtCQUFrQjt3QkFDbEIsU0FBUzt3QkFDVCxhQUFhO3dCQUNiLGFBQWE7cUJBQ2Q7OzBCQTZCRSxNQUFNOzJCQUFDLGtCQUFrQjt5Q0ExQm5CLE1BQU07c0JBQWQsS0FBSztnQkFvQk4sVUFBVTtzQkFEVCxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSBhcyBOZ0NvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSBhcyBOZ0Zvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBBc3NldExpbmtQaXBlLFxuICBDb21tb25Nb2R1bGUsXG4gIEZvcm1zTW9kdWxlLFxuICBnZXR0ZXh0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXBEZWZhdWx0Q29uZmlnIH0gZnJvbSAnQGM4eS9vcHRpb25zJztcbmltcG9ydCB7XG4gIENsdXN0ZXJNYXBDb25maWcsXG4gIE1BUF9ERUZBVUxUX0NPTkZJRyxcbiAgTWFwQ29tcG9uZW50LFxuICBNYXBNb2R1bGUsXG4gIE1hcFNlcnZpY2UsXG4gIFBvc2l0aW9uTWFuYWdlZE9iamVjdFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgdHlwZSBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWFwV2lkZ2V0Q29uZmlnLCBSZWZyZXNoT3B0aW9ucyB9IGZyb20gJy4vbWFwLXdpZGdldC5tb2RlbCc7XG5pbXBvcnQgeyBJY29uU2VsZWN0b3JNb2R1bGUgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2ljb24tc2VsZWN0b3InO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvdG9vbHRpcCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1tYXAtd2lkZ2V0LWNvbmZpZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXAtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCcsXG4gIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfV0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBOZ0NvbW1vbk1vZHVsZSxcbiAgICBOZ0Zvcm1zTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBJY29uU2VsZWN0b3JNb2R1bGUsXG4gICAgTWFwTW9kdWxlLFxuICAgIEFzc2V0TGlua1BpcGUsXG4gICAgVG9vbHRpcE1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE1hcFdpZGdldENvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBjb25maWc6IE1hcFdpZGdldENvbmZpZyA9IHtcbiAgICBtYXBDb25maWc6IHVuZGVmaW5lZFxuICB9O1xuXG4gIGZvcm1Db25maWc6IENsdXN0ZXJNYXBDb25maWc7XG5cbiAgY2FuQXV0b0NlbnRlciA9IHRydWU7XG4gIGlzUG9zaXRpb25lZERldmljZSA9IGZhbHNlO1xuICBhc3NldHM6IFBvc2l0aW9uTWFuYWdlZE9iamVjdFtdO1xuICByZWZyZXNoT3B0aW9uczogUmVmcmVzaE9wdGlvbnMgPSAnbm9uZSc7XG5cbiAgcHJpdmF0ZSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBsZWFmbGV0OiB0eXBlb2YgTDtcbiAgcHJpdmF0ZSBjZW50ZXJJY29uOiBMLk1hcmtlcjtcbiAgLy8gSlMgcHJlY2lzaW9uIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXIgaXMgMTUgZm9yIDY0LWJpdCBhbmQgYmVjYXVzZSBvZiB0aGlzIHByb3ZpZGVkIHRvIGxlYWZsZXQgYXJlIHJlY2FsY3VsYXRlZFxuICAvLyB0byB2YWx1ZXMgYWxtb3N0LWxpa2UgcHJvdmlkZWQgKGUuZy4gMCBpcyByZWNhbGN1bGF0ZWQgdG8gMS40NmUtMTQ7IGZvciAxODAgaXQncyAxODAuMDAwMDAwMDAwMDAwMDMpLlxuICAvLyBUbyBlbnN1cmUgcHJvdmlkZWQgdmFsdWUgaGFzIG5vIGZsb2F0aW5nIHBvaW50IGVycm9yLCBudW1iZXIgbmVlZHMgdG8gYmUgcm91bmRlZCB0byBmaXhlZCBwb2ludCAxMy5cbiAgcHJpdmF0ZSByZWFkb25seSBGSVhFRF9QT0lOVF9ESUdJVFMgPSAxMztcblxuICBAVmlld0NoaWxkKE1hcENvbXBvbmVudClcbiAgcHJldmlld01hcDogTWFwQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbWFwU2VydmljZTogTWFwU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBASW5qZWN0KE1BUF9ERUZBVUxUX0NPTkZJRykgcHJpdmF0ZSBkZWZhdWx0TWFwQ29uZmlnOiBPYnNlcnZhYmxlPE1hcERlZmF1bHRDb25maWc+XG4gICkge31cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kZWZhdWx0TWFwQ29uZmlnLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpLnN1YnNjcmliZShkZWZhdWx0Q29uZmlnID0+IHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZyA9IHtcbiAgICAgICAgem9vbUxldmVsOiBkZWZhdWx0Q29uZmlnLnpvb21MZXZlbCxcbiAgICAgICAgY2VudGVyOiBkZWZhdWx0Q29uZmlnLmNlbnRlclxuICAgICAgfTtcbiAgICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGluaXRGb3JtKCkge1xuICAgIGlmICghdGhpcy5jb25maWcubWFwQ29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZy5tYXBDb25maWcgPSB0aGlzLmZvcm1Db25maWc7XG4gICAgfVxuICAgIHRoaXMuZm9ybUNvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuZm9ybUNvbmZpZyxcbiAgICAgIC4uLnRoaXMuY29uZmlnLm1hcENvbmZpZyxcbiAgICAgIGRpc2FibGVQYW46IGZhbHNlXG4gICAgfTtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZUFzc2V0KCk7XG4gIH1cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKFxuICAgICAgY2hhbmdlcy5jb25maWcuY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzLmNvbmZpZy5wcmV2aW91c1ZhbHVlICYmXG4gICAgICAhY2hhbmdlcy5jb25maWcuZmlyc3RDaGFuZ2VcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlQXNzZXQoKTtcbiAgICB9XG4gIH1cblxuICBwcmV2aWV3TWFwSW5pdChsZWFmbGV0OiB0eXBlb2YgTCk6IHZvaWQge1xuICAgIHRoaXMubGVhZmxldCA9IGxlYWZsZXQ7XG4gICAgdGhpcy5hZGRDZW50ZXJJY29uKHRoaXMuZm9ybUNvbmZpZy5jZW50ZXJbMF0sIHRoaXMuZm9ybUNvbmZpZy5jZW50ZXJbMV0pO1xuICB9XG5cbiAgb25CZWZvcmVTYXZlKCkge1xuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHRoaXMuZm9ybUNvbmZpZztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHpvb21MZXZlbENoYW5nZWQoKSB7XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5jb25maWcubWFwQ29uZmlnLFxuICAgICAgem9vbUxldmVsOiB0aGlzLmZvcm1Db25maWcuem9vbUxldmVsXG4gICAgfTtcbiAgfVxuXG4gIGNoYW5nZUNlbnRlcigpIHtcbiAgICBpZiAodGhpcy5jZW50ZXJJY29uKSB7XG4gICAgICB0aGlzLmNlbnRlckljb24ucmVtb3ZlKCk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHsgLi4udGhpcy5mb3JtQ29uZmlnLCBjZW50ZXI6IFsuLi50aGlzLmZvcm1Db25maWcuY2VudGVyXSB9O1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbih0aGlzLmZvcm1Db25maWcuY2VudGVyWzBdLCB0aGlzLmZvcm1Db25maWcuY2VudGVyWzFdKTtcbiAgfVxuXG4gIGNoYW5nZUNlbnRlck9uRW50ZXJLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuY2hhbmdlQ2VudGVyKCk7XG4gIH1cblxuICBvblByZXZpZXdab29tU3RhcnQoKSB7XG4gICAgdGhpcy5jZW50ZXJJY29uLnJlbW92ZSgpO1xuICB9XG5cbiAgb25QcmV2aWV3Wm9vbUVuZChldmVudDogTC5MZWFmbGV0RXZlbnQpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuem9vbUxldmVsID0gTWF0aC5mbG9vcihldmVudC50YXJnZXQuZ2V0Wm9vbSgpKTtcbiAgfVxuXG4gIG9uUHJldmlld01hcE1vdmUoZXZlbnQ6IEwuTGVhZmxldEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuY2VudGVySWNvbikge1xuICAgICAgdGhpcy5jZW50ZXJJY29uLnJlbW92ZSgpO1xuICAgIH1cbiAgICBjb25zdCB7IGxhdCwgbG5nIH0gPSBldmVudC50YXJnZXQuZ2V0Q2VudGVyKCk7XG4gICAgY29uc3QgZml4ZWRMYXQgPSArbGF0LnRvRml4ZWQodGhpcy5GSVhFRF9QT0lOVF9ESUdJVFMpO1xuICAgIGNvbnN0IGZpeGVkTG5nID0gK2xuZy50b0ZpeGVkKHRoaXMuRklYRURfUE9JTlRfRElHSVRTKTtcbiAgICB0aGlzLmFkZENlbnRlckljb24oZml4ZWRMYXQsIGZpeGVkTG5nKTtcbiAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW2ZpeGVkTGF0LCBmaXhlZExuZ107XG4gIH1cblxuICB1c2VPd25Qb3NpdGlvbigpIHtcbiAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCh7IGNvb3JkcyB9KSA9PiB7XG4gICAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW2Nvb3Jkcy5sYXRpdHVkZSwgY29vcmRzLmxvbmdpdHVkZV07XG4gICAgICB0aGlzLmNoYW5nZUNlbnRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgY2VudGVyVG9Bc3NldCgpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW1xuICAgICAgdGhpcy5jb25maWcuZGV2aWNlLmM4eV9Qb3NpdGlvbi5sYXQsXG4gICAgICB0aGlzLmNvbmZpZy5kZXZpY2UuYzh5X1Bvc2l0aW9uLmxuZ1xuICAgIF07XG4gICAgdGhpcy5jaGFuZ2VDZW50ZXIoKTtcbiAgfVxuXG4gIHVwZGF0ZVJlZnJlc2hPcHRpb25zKCkge1xuICAgIHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSA9IHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdyZWFsdGltZSc7XG4gICAgaWYgKHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwgPz89IDUwMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSkge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvbGxvdyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0ID1cbiAgICAgIHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCc7XG4gICAgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0SWNvbihpY29uOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuaWNvbiA9IGljb247XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnLmljb24gPSBpY29uO1xuICAgIHRoaXMucHJldmlld01hcC5yZWZyZXNoTWFya2VycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBc3NldCgpIHtcbiAgICB0aGlzLmNhbkF1dG9DZW50ZXIgPSB0aGlzLm1hcFNlcnZpY2UuaGFzUG9zaXRpb24odGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLmlzUG9zaXRpb25lZERldmljZSA9IHRoaXMubWFwU2VydmljZS5pc1Bvc2l0aW9uZWREZXZpY2UodGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLnJlZnJlc2hPcHRpb25zID0gdGhpcy5nZXRSZWZyZXNoT3B0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlUmVmcmVzaE9wdGlvbnMoKTtcblxuICAgIGNvbnN0IHsgZGF0YSwgcGFnaW5nIH0gPSBhd2FpdCB0aGlzLm1hcFNlcnZpY2UuZ2V0QWxsUG9zaXRpb25NT3ModGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLmFzc2V0cyA9IGRhdGE7XG4gICAgaWYgKHBhZ2luZy50b3RhbFBhZ2VzID4gMSkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZGFuZ2VyKFxuICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICdJdCBtaWdodCBiZSBwb3NzaWJsZSB0aGF0IGFzc2V0cyBhcmUgbm90IHNob3duIGluIHRoZSBwcmV2aWV3LCBhcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaGFzIG1vcmUgdGhhbiA1MDAgYXNzZXRzIGFuZCB0aGUgcHJldmlldyBvbmx5IHN1cHBvcnRzIGEgbWF4aW11bSBvZiA1MDAgYXNzZXRzLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFJlZnJlc2hPcHRpb25zKCk6IFJlZnJlc2hPcHRpb25zIHtcbiAgICBsZXQgb3B0aW9uOiBSZWZyZXNoT3B0aW9ucyA9ICdub25lJztcbiAgICBpZiAodGhpcy5mb3JtQ29uZmlnLnJlYWx0aW1lKSB7XG4gICAgICBvcHRpb24gPSAncmVhbHRpbWUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbCkge1xuICAgICAgb3B0aW9uID0gJ2ludGVydmFsJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIG9wdGlvbiA9ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCc7XG4gICAgfVxuICAgIGNvbnN0IGlzTm90QWxsb3dlZE9wdGlvbiA9XG4gICAgICAoIXRoaXMuaXNQb3NpdGlvbmVkRGV2aWNlICYmIG9wdGlvbiA9PT0gJ2Rhc2hib2FyZC1yZWFsdGltZS1jb250ZXh0JykgfHxcbiAgICAgICghdGhpcy5pc1Bvc2l0aW9uZWREZXZpY2UgJiYgb3B0aW9uID09PSAncmVhbHRpbWUnKSB8fFxuICAgICAgKHRoaXMuaXNQb3NpdGlvbmVkRGV2aWNlICYmIG9wdGlvbiA9PT0gJ2ludGVydmFsJyk7XG4gICAgb3B0aW9uID0gaXNOb3RBbGxvd2VkT3B0aW9uID8gJ25vbmUnIDogb3B0aW9uO1xuICAgIHJldHVybiBvcHRpb247XG4gIH1cblxuICBwcml2YXRlIGFkZENlbnRlckljb24obGF0OiBudW1iZXIsIGxuZzogbnVtYmVyKSB7XG4gICAgY29uc3QgdGl0bGVUZXh0ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnTWFwIGNlbnRlcicpKTtcbiAgICBjb25zdCBpY29uID0gdGhpcy5sZWFmbGV0LmRpdkljb24oe1xuICAgICAgaHRtbDogYDxpIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmVcIiBjbGFzcz1cImM4eS1tYXAtbWFya2VyLWljb24gdGV4dC1tdXRlZCBkbHQtYzh5LWljb24tdGFyZ2V0IGljb24tMnhcIiB0aXRsZT1cIiR7dGl0bGVUZXh0fVwiIC8+YFxuICAgIH0pO1xuICAgIHRoaXMuY2VudGVySWNvbiA9IHRoaXMubGVhZmxldC5tYXJrZXIoW2xhdCwgbG5nXSwge1xuICAgICAgaWNvblxuICAgIH0pO1xuICAgIHRoaXMucHJldmlld01hcC5hZGRNYXJrZXJUb01hcCh0aGlzLmNlbnRlckljb24pO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwicm93IHAtdC0xNlwiXG4gICpuZ0lmPVwiZm9ybUNvbmZpZ1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJjb2wteHMtMlwiPlxuICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cIm0tYi0wIHRleHQtY2VudGVyIGZvcm0tZ3JvdXAtc21cIj5cbiAgICAgIDxsYWJlbCB0cmFuc2xhdGU+TWFya2VyIGljb248L2xhYmVsPlxuICAgICAgPGM4eS1pY29uLXNlbGVjdG9yLXdyYXBwZXJcbiAgICAgICAgW2NhblJlbW92ZUljb25dPVwidHJ1ZVwiXG4gICAgICAgIFtzZWxlY3RlZEljb25dPVwiZm9ybUNvbmZpZy5pY29uXCJcbiAgICAgICAgKG9uU2VsZWN0KT1cInNlbGVjdEljb24oJGV2ZW50KVwiXG4gICAgICA+PC9jOHktaWNvbi1zZWxlY3Rvci13cmFwcGVyPlxuICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEwXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyB0aWdodC1ncmlkIHNlcGFyYXRvci1ib3R0b21cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5ab29tIGxldmVsPC9sYWJlbD5cbiAgICAgICAgICA8Yzh5LXJhbmdlXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsLWJvdHRvbVwiXG4gICAgICAgICAgICBuYW1lPVwiem9vbUxldmVsXCJcbiAgICAgICAgICAgICNyYW5nZVxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLnpvb21MZXZlbFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInpvb21MZXZlbENoYW5nZWQoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgIG1pbj1cIjJcIlxuICAgICAgICAgICAgICBtYXg9XCIxOFwiXG4gICAgICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9jOHktcmFuZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLThcIj5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwiZm9ybS1ncm91cC1zbSBtLWItOFwiPlxuICAgICAgICAgIDxsYWJlbCB0cmFuc2xhdGU+Q2VudGVyIGJvdW5kPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc21cIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2xhdC5gbGF0aXR1ZGVgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJjZW50ZXJMYXRcIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLmNlbnRlclswXVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlQ2VudGVyKClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjaGFuZ2VDZW50ZXJPbkVudGVyS2V5KCRldmVudClcIlxuICAgICAgICAgICAgICBtaW49XCItOTBcIlxuICAgICAgICAgICAgICBtYXg9XCI5MFwiXG4gICAgICAgICAgICAgIHN0ZXA9XCIwLjFcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2xuZy5gbG9uZ2l0dWRlYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICBuYW1lPVwiY2VudGVyTG5nXCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIG1pbj1cIi0xODBcIlxuICAgICAgICAgICAgICBtYXg9XCIxODBcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuY2VudGVyWzFdXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VDZW50ZXIoKVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNoYW5nZUNlbnRlck9uRW50ZXJLZXkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIG1pbj1cIi0xODBcIlxuICAgICAgICAgICAgICBtYXg9XCIxODBcIlxuICAgICAgICAgICAgICBzdGVwPVwiMC4xXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVXNlIHlvdXIgbG9jYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInVXNlIHlvdXIgbG9jYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ1c2VPd25Qb3NpdGlvbigpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tMTRcIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImxvY2F0aW9uLWFycm93XCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY2FuQXV0b0NlbnRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVXNlIHNlbGVjdGVkIGFzc2V0IGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1VzZSBzZWxlY3RlZCBhc3NldCBsb2NhdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNlbnRlclRvQXNzZXQoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLTE0XCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJsb2NhdGlvblwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Yzh5LW1lc3NhZ2VzXG4gICAgICAgICAgICBbaGVscE1lc3NhZ2VdPVwiJ0RyYWcgdGhlIG1hcCB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID48L2M4eS1tZXNzYWdlcz5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInJvdyB0aWdodC1ncmlkIHAtdC04IGQtZmxleCBhLWktY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTZcIj5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwibS1iLTAgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZWZyZXNoIG9wdGlvbnNgb3B0aW9ucyBmb3IgcmVmcmVzaGluZyBhIHZpZXdgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIGlkPVwic2VsZWN0RXhhbXBsZVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJyZWZyZXNoU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZWZyZXNoT3B0aW9uc1wiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlUmVmcmVzaE9wdGlvbnMoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ09ubHkgcmVmcmVzaGluZyBvbiBpbnRlcmFjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHZhbHVlPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBObyBhdXRvbWF0aWMgcmVmcmVzaFxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInUmVmcmVzaGluZyBhZnRlciB0aGUgZ2l2ZW4gaW50ZXJ2YWwgYW5kIG9uIGludGVyYWN0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQb3NpdGlvbmVkRGV2aWNlXCJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIFVzZSByZWZyZXNoIGludGVydmFsXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidMaXZlIHVwZGF0aW5nIG9uIGVhY2ggcG9zaXRpb24gY2hhbmdlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJyZWFsdGltZVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc1Bvc2l0aW9uZWREZXZpY2VcIlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgUmVhbHRpbWVcbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0JpbmQgd2lkZ2V0IHRvIGRhc2hib2FyZCByZWFsdGltZSBjb250ZXh0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc1Bvc2l0aW9uZWREZXZpY2VcIlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgRGFzaGJvYXJkIHJlYWx0aW1lIGNvbnRleHRcbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy04XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0tZ3JvdXAtc20gbS1iLTBcIj5cbiAgICAgICAgICA8Yzh5LXJhbmdlXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsLWJvdHRvbVwiXG4gICAgICAgICAgICBuYW1lPVwicmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAgICNpbnRlcnZhbFJhbmdlXG4gICAgICAgICAgICAqbmdJZj1cInJlZnJlc2hPcHRpb25zID09PSAnaW50ZXJ2YWwnXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybUNvbmZpZy5yZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYzh5UmFuZ2VWYWx1ZT5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGludGVydmFsSW5TZWNvbmRzOiBpbnRlcnZhbFJhbmdlLnZhbHVlICogMC4wMDEgfVwiXG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBpbnRlcnZhbEluU2Vjb25kcyB9fSBzXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgbWluPVwiNTAwMFwiXG4gICAgICAgICAgICAgIG1heD1cIjEwMDAwMFwiXG4gICAgICAgICAgICAgIHN0ZXA9XCIxMDAwXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9jOHktcmFuZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cImM4eS1zd2l0Y2ggYzh5LXN3aXRjaC0taW5saW5lXCJcbiAgICAgICAgICAqbmdJZj1cInJlZnJlc2hPcHRpb25zID09PSAncmVhbHRpbWUnIHx8IHJlZnJlc2hPcHRpb25zID09PSAnZGFzaGJvYXJkLXJlYWx0aW1lLWNvbnRleHQnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbmFtZT1cImZvbGxvd1wiXG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLmZvbGxvd1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC0xMlwiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBGb2xsb3cgc2VsZWN0ZWRcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdlxuICBjbGFzcz1cInAtdC0xNiBwLWItMTZcIlxuICBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDI0MHB4XCJcbj5cbiAgPGM4eS1tYXBcbiAgICAqbmdJZj1cImNvbmZpZy5tYXBDb25maWdcIlxuICAgIFthc3NldHNdPVwiYXNzZXRzXCJcbiAgICBbY29uZmlnXT1cImNvbmZpZy5tYXBDb25maWdcIlxuICAgIChvbk1vdmUpPVwib25QcmV2aWV3TWFwTW92ZSgkZXZlbnQpXCJcbiAgICAob25ab29tU3RhcnQpPVwib25QcmV2aWV3Wm9vbVN0YXJ0KClcIlxuICAgIChvblpvb21FbmQpPVwib25QcmV2aWV3Wm9vbUVuZCgkZXZlbnQpXCJcbiAgICAob25Jbml0KT1cInByZXZpZXdNYXBJbml0KCRldmVudClcIlxuICA+PC9jOHktbWFwPlxuPC9kaXY+XG4iXX0=
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXdpZGdldC1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvbWFwL21hcC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL21hcC9tYXAtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBS0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLElBQUksY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsSUFBSSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IsWUFBWSxFQUNaLFdBQVcsRUFDWCxPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUVYLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7OztBQWtCdEQsTUFBTSxPQUFP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cnQge1xuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSBhcyBOZ0NvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSBhcyBOZ0Zvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBBc3NldExpbmtQaXBlLFxuICBDb21tb25Nb2R1bGUsXG4gIEZvcm1zTW9kdWxlLFxuICBnZXR0ZXh0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXBEZWZhdWx0Q29uZmlnIH0gZnJvbSAnQGM4eS9vcHRpb25zJztcbmltcG9ydCB7XG4gIENsdXN0ZXJNYXBDb25maWcsXG4gIE1BUF9ERUZBVUxUX0NPTkZJRyxcbiAgTWFwQ29tcG9uZW50LFxuICBNYXBNb2R1bGUsXG4gIE1hcFNlcnZpY2UsXG4gIFBvc2l0aW9uTWFuYWdlZE9iamVjdFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgdHlwZSBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWFwV2lkZ2V0Q29uZmlnLCBNYXBSZWZyZXNoT3B0aW9uIH0gZnJvbSAnLi9tYXAtd2lkZ2V0Lm1vZGVsJztcbmltcG9ydCB7IEljb25TZWxlY3Rvck1vZHVsZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvaWNvbi1zZWxlY3Rvcic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC90b29sdGlwJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LW1hcC13aWRnZXQtY29uZmlnJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hcC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nQ29tbW9uTW9kdWxlLFxuICAgIE5nRm9ybXNNb2R1bGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEljb25TZWxlY3Rvck1vZHVsZSxcbiAgICBNYXBNb2R1bGUsXG4gICAgQXNzZXRMaW5rUGlwZSxcbiAgICBUb29sdGlwTW9kdWxlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTWFwV2lkZ2V0Q29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZzogTWFwV2lkZ2V0Q29uZmlnID0ge1xuICAgIG1hcENvbmZpZzogdW5kZWZpbmVkXG4gIH07XG5cbiAgZm9ybUNvbmZpZzogQ2x1c3Rlck1hcENvbmZpZztcblxuICBjYW5BdXRvQ2VudGVyID0gdHJ1ZTtcbiAgaXNQb3NpdGlvbmVkRGV2aWNlID0gZmFsc2U7XG4gIGFzc2V0czogUG9zaXRpb25NYW5hZ2VkT2JqZWN0W107XG4gIHJlZnJlc2hPcHRpb246IE1hcFJlZnJlc2hPcHRpb24gPSAnbm9uZSc7XG5cbiAgcHJpdmF0ZSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBsZWFmbGV0OiB0eXBlb2YgTDtcbiAgcHJpdmF0ZSBjZW50ZXJJY29uOiBMLk1hcmtlcjtcbiAgLy8gSlMgcHJlY2lzaW9uIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXIgaXMgMTUgZm9yIDY0LWJpdCBhbmQgYmVjYXVzZSBvZiB0aGlzIHByb3ZpZGVkIHRvIGxlYWZsZXQgYXJlIHJlY2FsY3VsYXRlZFxuICAvLyB0byB2YWx1ZXMgYWxtb3N0LWxpa2UgcHJvdmlkZWQgKGUuZy4gMCBpcyByZWNhbGN1bGF0ZWQgdG8gMS40NmUtMTQ7IGZvciAxODAgaXQncyAxODAuMDAwMDAwMDAwMDAwMDMpLlxuICAvLyBUbyBlbnN1cmUgcHJvdmlkZWQgdmFsdWUgaGFzIG5vIGZsb2F0aW5nIHBvaW50IGVycm9yLCBudW1iZXIgbmVlZHMgdG8gYmUgcm91bmRlZCB0byBmaXhlZCBwb2ludCAxMy5cbiAgcHJpdmF0ZSByZWFkb25seSBGSVhFRF9QT0lOVF9ESUdJVFMgPSAxMztcblxuICBAVmlld0NoaWxkKE1hcENvbXBvbmVudClcbiAgcHJldmlld01hcDogTWFwQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbWFwU2VydmljZTogTWFwU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBASW5qZWN0KE1BUF9ERUZBVUxUX0NPTkZJRykgcHJpdmF0ZSBkZWZhdWx0TWFwQ29uZmlnOiBPYnNlcnZhYmxlPE1hcERlZmF1bHRDb25maWc+XG4gICkge31cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kZWZhdWx0TWFwQ29uZmlnLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpLnN1YnNjcmliZShkZWZhdWx0Q29uZmlnID0+IHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZyA9IHtcbiAgICAgICAgem9vbUxldmVsOiBkZWZhdWx0Q29uZmlnLnpvb21MZXZlbCxcbiAgICAgICAgY2VudGVyOiBkZWZhdWx0Q29uZmlnLmNlbnRlclxuICAgICAgfTtcbiAgICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGluaXRGb3JtKCkge1xuICAgIGlmICghdGhpcy5jb25maWcubWFwQ29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZy5tYXBDb25maWcgPSB0aGlzLmZvcm1Db25maWc7XG4gICAgfVxuICAgIHRoaXMuZm9ybUNvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuZm9ybUNvbmZpZyxcbiAgICAgIC4uLnRoaXMuY29uZmlnLm1hcENvbmZpZyxcbiAgICAgIGRpc2FibGVQYW46IGZhbHNlXG4gICAgfTtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZUFzc2V0KCk7XG4gIH1cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKFxuICAgICAgY2hhbmdlcy5jb25maWcuY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzLmNvbmZpZy5wcmV2aW91c1ZhbHVlICYmXG4gICAgICAhY2hhbmdlcy5jb25maWcuZmlyc3RDaGFuZ2VcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlQXNzZXQoKTtcbiAgICB9XG4gIH1cblxuICBwcmV2aWV3TWFwSW5pdChsZWFmbGV0OiB0eXBlb2YgTCk6IHZvaWQge1xuICAgIHRoaXMubGVhZmxldCA9IGxlYWZsZXQ7XG4gICAgdGhpcy5hZGRDZW50ZXJJY29uKHRoaXMuZm9ybUNvbmZpZy5jZW50ZXJbMF0sIHRoaXMuZm9ybUNvbmZpZy5jZW50ZXJbMV0pO1xuICB9XG5cbiAgb25CZWZvcmVTYXZlKCkge1xuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHRoaXMuZm9ybUNvbmZpZztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHpvb21MZXZlbENoYW5nZWQoKSB7XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5jb25maWcubWFwQ29uZmlnLFxuICAgICAgem9vbUxldmVsOiB0aGlzLmZvcm1Db25maWcuem9vbUxldmVsXG4gICAgfTtcbiAgfVxuXG4gIGNoYW5nZUNlbnRlcigpIHtcbiAgICBpZiAodGhpcy5jZW50ZXJJY29uKSB7XG4gICAgICB0aGlzLmNlbnRlckljb24ucmVtb3ZlKCk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHsgLi4udGhpcy5mb3JtQ29uZmlnLCBjZW50ZXI6IFsuLi50aGlzLmZvcm1Db25maWcuY2VudGVyXSB9O1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbih0aGlzLmZvcm1Db25maWcuY2VudGVyWzBdLCB0aGlzLmZvcm1Db25maWcuY2VudGVyWzFdKTtcbiAgfVxuXG4gIGNoYW5nZUNlbnRlck9uRW50ZXJLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuY2hhbmdlQ2VudGVyKCk7XG4gIH1cblxuICBvblByZXZpZXdab29tU3RhcnQoKSB7XG4gICAgdGhpcy5jZW50ZXJJY29uLnJlbW92ZSgpO1xuICB9XG5cbiAgb25QcmV2aWV3Wm9vbUVuZChldmVudDogTC5MZWFmbGV0RXZlbnQpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuem9vbUxldmVsID0gTWF0aC5mbG9vcihldmVudC50YXJnZXQuZ2V0Wm9vbSgpKTtcbiAgfVxuXG4gIG9uUHJldmlld01hcE1vdmUoZXZlbnQ6IEwuTGVhZmxldEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuY2VudGVySWNvbikge1xuICAgICAgdGhpcy5jZW50ZXJJY29uLnJlbW92ZSgpO1xuICAgIH1cbiAgICBjb25zdCB7IGxhdCwgbG5nIH0gPSBldmVudC50YXJnZXQuZ2V0Q2VudGVyKCk7XG4gICAgY29uc3QgZml4ZWRMYXQgPSArbGF0LnRvRml4ZWQodGhpcy5GSVhFRF9QT0lOVF9ESUdJVFMpO1xuICAgIGNvbnN0IGZpeGVkTG5nID0gK2xuZy50b0ZpeGVkKHRoaXMuRklYRURfUE9JTlRfRElHSVRTKTtcbiAgICB0aGlzLmFkZENlbnRlckljb24oZml4ZWRMYXQsIGZpeGVkTG5nKTtcbiAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW2ZpeGVkTGF0LCBmaXhlZExuZ107XG4gIH1cblxuICB1c2VPd25Qb3NpdGlvbigpIHtcbiAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCh7IGNvb3JkcyB9KSA9PiB7XG4gICAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW2Nvb3Jkcy5sYXRpdHVkZSwgY29vcmRzLmxvbmdpdHVkZV07XG4gICAgICB0aGlzLmNoYW5nZUNlbnRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgY2VudGVyVG9Bc3NldCgpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW1xuICAgICAgdGhpcy5jb25maWcuZGV2aWNlLmM4eV9Qb3NpdGlvbi5sYXQsXG4gICAgICB0aGlzLmNvbmZpZy5kZXZpY2UuYzh5X1Bvc2l0aW9uLmxuZ1xuICAgIF07XG4gICAgdGhpcy5jaGFuZ2VDZW50ZXIoKTtcbiAgfVxuXG4gIHVwZGF0ZVJlZnJlc2hPcHRpb24oKSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnLnJlYWx0aW1lID0gdGhpcy5yZWZyZXNoT3B0aW9uID09PSAncmVhbHRpbWUnO1xuICAgIHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0ID1cbiAgICAgIHRoaXMucmVmcmVzaE9wdGlvbiA9PT0gJ2Rhc2hib2FyZC1hdXRvLXJlZnJlc2gtY29udGV4dCc7XG4gICAgdGhpcy5mb3JtQ29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0ID1cbiAgICAgIHRoaXMucmVmcmVzaE9wdGlvbiA9PT0gJ2Rhc2hib2FyZC1hdXRvLXJlZnJlc2gtY29udGV4dCc7XG4gICAgaWYgKHRoaXMucmVmcmVzaE9wdGlvbiA9PT0gJ2ludGVydmFsJykge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbCA/Pz0gNTAwMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICAgIGlmICghdGhpcy5mb3JtQ29uZmlnLnJlYWx0aW1lKSB7XG4gICAgICB0aGlzLmZvcm1Db25maWcuZm9sbG93ID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQgPVxuICAgICAgdGhpcy5yZWZyZXNoT3B0aW9uID09PSAnZGFzaGJvYXJkLXJlYWx0aW1lLWNvbnRleHQnO1xuICAgIGlmICh0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0KSB7XG4gICAgICB0aGlzLmZvcm1Db25maWcucmVhbHRpbWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEljb24oaWNvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnLmljb24gPSBpY29uO1xuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZy5pY29uID0gaWNvbjtcbiAgICB0aGlzLnByZXZpZXdNYXAucmVmcmVzaE1hcmtlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlQXNzZXQoKSB7XG4gICAgdGhpcy5jYW5BdXRvQ2VudGVyID0gdGhpcy5tYXBTZXJ2aWNlLmhhc1Bvc2l0aW9uKHRoaXMuY29uZmlnLmRldmljZSk7XG4gICAgdGhpcy5pc1Bvc2l0aW9uZWREZXZpY2UgPSB0aGlzLm1hcFNlcnZpY2UuaXNQb3NpdGlvbmVkRGV2aWNlKHRoaXMuY29uZmlnLmRldmljZSk7XG4gICAgdGhpcy5yZWZyZXNoT3B0aW9uID0gdGhpcy5nZXRSZWZyZXNoT3B0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVSZWZyZXNoT3B0aW9uKCk7XG5cbiAgICBjb25zdCB7IGRhdGEsIHBhZ2luZyB9ID0gYXdhaXQgdGhpcy5tYXBTZXJ2aWNlLmdldEFsbFBvc2l0aW9uTU9zKHRoaXMuY29uZmlnLmRldmljZSk7XG4gICAgdGhpcy5hc3NldHMgPSBkYXRhO1xuICAgIGlmIChwYWdpbmcudG90YWxQYWdlcyA+IDEpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmRhbmdlcihcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICAnSXQgbWlnaHQgYmUgcG9zc2libGUgdGhhdCBhc3NldHMgYXJlIG5vdCBzaG93biBpbiB0aGUgcHJldmlldywgYXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGhhcyBtb3JlIHRoYW4gNTAwIGFzc2V0cyBhbmQgdGhlIHByZXZpZXcgb25seSBzdXBwb3J0cyBhIG1heGltdW0gb2YgNTAwIGFzc2V0cy4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWZyZXNoT3B0aW9uKCk6IE1hcFJlZnJlc2hPcHRpb24ge1xuICAgIGxldCBvcHRpb246IE1hcFJlZnJlc2hPcHRpb24gPSAnbm9uZSc7XG4gICAgaWYgKHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSkge1xuICAgICAgb3B0aW9uID0gJ3JlYWx0aW1lJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybUNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwpIHtcbiAgICAgIG9wdGlvbiA9ICdpbnRlcnZhbCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0KSB7XG4gICAgICBvcHRpb24gPSAnZGFzaGJvYXJkLXJlYWx0aW1lLWNvbnRleHQnO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbEF1dG9SZWZyZXNoQ29udGV4dCB8fFxuICAgICAgdGhpcy5mb3JtQ29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0XG4gICAgKSB7XG4gICAgICBvcHRpb24gPSAnZGFzaGJvYXJkLWF1dG8tcmVmcmVzaC1jb250ZXh0JztcbiAgICB9XG4gICAgY29uc3QgaXNOb3RBbGxvd2VkT3B0aW9uID1cbiAgICAgICghdGhpcy5pc1Bvc2l0aW9uZWREZXZpY2UgJiYgb3B0aW9uID09PSAnZGFzaGJvYXJkLXJlYWx0aW1lLWNvbnRleHQnKSB8fFxuICAgICAgKCF0aGlzLmlzUG9zaXRpb25lZERldmljZSAmJiBvcHRpb24gPT09ICdyZWFsdGltZScpIHx8XG4gICAgICAodGhpcy5pc1Bvc2l0aW9uZWREZXZpY2UgJiYgb3B0aW9uID09PSAnaW50ZXJ2YWwnKTtcbiAgICBvcHRpb24gPSBpc05vdEFsbG93ZWRPcHRpb24gPyAnbm9uZScgOiBvcHRpb247XG4gICAgcmV0dXJuIG9wdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ2VudGVySWNvbihsYXQ6IG51bWJlciwgbG5nOiBudW1iZXIpIHtcbiAgICBjb25zdCB0aXRsZVRleHQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdNYXAgY2VudGVyJykpO1xuICAgIGNvbnN0IGljb24gPSB0aGlzLmxlYWZsZXQuZGl2SWNvbih7XG4gICAgICBodG1sOiBgPGkgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZVwiIGNsYXNzPVwiYzh5LW1hcC1tYXJrZXItaWNvbiB0ZXh0LW11dGVkIGRsdC1jOHktaWNvbi10YXJnZXQgaWNvbi0yeFwiIHRpdGxlPVwiJHt0aXRsZVRleHR9XCIgLz5gXG4gICAgfSk7XG4gICAgdGhpcy5jZW50ZXJJY29uID0gdGhpcy5sZWFmbGV0Lm1hcmtlcihbbGF0LCBsbmddLCB7XG4gICAgICBpY29uXG4gICAgfSk7XG4gICAgdGhpcy5wcmV2aWV3TWFwLmFkZE1hcmtlclRvTWFwKHRoaXMuY2VudGVySWNvbik7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJyb3cgcC10LTE2XCJcbiAgKm5nSWY9XCJmb3JtQ29uZmlnXCJcbj5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0yXCI+XG4gICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwibS1iLTAgdGV4dC1jZW50ZXIgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5NYXJrZXIgaWNvbjwvbGFiZWw+XG4gICAgICA8Yzh5LWljb24tc2VsZWN0b3Itd3JhcHBlclxuICAgICAgICBbY2FuUmVtb3ZlSWNvbl09XCJ0cnVlXCJcbiAgICAgICAgW3NlbGVjdGVkSWNvbl09XCJmb3JtQ29uZmlnLmljb25cIlxuICAgICAgICAob25TZWxlY3QpPVwic2VsZWN0SWNvbigkZXZlbnQpXCJcbiAgICAgID48L2M4eS1pY29uLXNlbGVjdG9yLXdyYXBwZXI+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wteHMtMTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93IHRpZ2h0LWdyaWQgc2VwYXJhdG9yLWJvdHRvbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0tZ3JvdXAtc21cIj5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPlpvb20gbGV2ZWw8L2xhYmVsPlxuICAgICAgICAgIDxjOHktcmFuZ2VcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWwtYm90dG9tXCJcbiAgICAgICAgICAgIG5hbWU9XCJ6b29tTGV2ZWxcIlxuICAgICAgICAgICAgI3JhbmdlXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuem9vbUxldmVsXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiem9vbUxldmVsQ2hhbmdlZCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgbWluPVwiMlwiXG4gICAgICAgICAgICAgIG1heD1cIjE4XCJcbiAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2M4eS1yYW5nZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtOFwiPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJmb3JtLWdyb3VwLXNtIG0tYi04XCI+XG4gICAgICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5DZW50ZXIgYm91bmQ8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnbGF0LmBsYXRpdHVkZWAnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgbmFtZT1cImNlbnRlckxhdFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuY2VudGVyWzBdXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VDZW50ZXIoKVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNoYW5nZUNlbnRlck9uRW50ZXJLZXkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIG1pbj1cIi05MFwiXG4gICAgICAgICAgICAgIG1heD1cIjkwXCJcbiAgICAgICAgICAgICAgc3RlcD1cIjAuMVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnbG5nLmBsb25naXR1ZGVgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJjZW50ZXJMbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgbWluPVwiLTE4MFwiXG4gICAgICAgICAgICAgIG1heD1cIjE4MFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybUNvbmZpZy5jZW50ZXJbMV1cIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUNlbnRlcigpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2hhbmdlQ2VudGVyT25FbnRlcktleSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgbWluPVwiLTE4MFwiXG4gICAgICAgICAgICAgIG1heD1cIjE4MFwiXG4gICAgICAgICAgICAgIHN0ZXA9XCIwLjFcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVc2UgeW91ciBsb2NhdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidVc2UgeW91ciBsb2NhdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVzZU93blBvc2l0aW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi0xNFwiXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwibG9jYXRpb24tYXJyb3dcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjYW5BdXRvQ2VudGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVc2Ugc2VsZWN0ZWQgYXNzZXQgbG9jYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInVXNlIHNlbGVjdGVkIGFzc2V0IGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2VudGVyVG9Bc3NldCgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tMTRcIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImxvY2F0aW9uXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxjOHktbWVzc2FnZXNcbiAgICAgICAgICAgIFtoZWxwTWVzc2FnZV09XCInRHJhZyB0aGUgbWFwIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgPjwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwicm93IHRpZ2h0LWdyaWQgcC10LTggZC1mbGV4IGEtaS1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNlwiPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJtLWItMCBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlZnJlc2ggb3B0aW9uc2BvcHRpb25zIGZvciByZWZyZXNoaW5nIGEgdmlld2AnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RFeGFtcGxlXCJcbiAgICAgICAgICAgICAgbmFtZT1cInJlZnJlc2hTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlZnJlc2hPcHRpb25cIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVJlZnJlc2hPcHRpb24oKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ09ubHkgcmVmcmVzaGluZyBvbiBpbnRlcmFjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHZhbHVlPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBObyBhdXRvbWF0aWMgcmVmcmVzaFxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInUmVmcmVzaGluZyBhZnRlciB0aGUgZ2l2ZW4gaW50ZXJ2YWwgYW5kIG9uIGludGVyYWN0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQb3NpdGlvbmVkRGV2aWNlXCJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIFVzZSByZWZyZXNoIGludGVydmFsXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgJ1JlZnJlc2hpbmcgYWZ0ZXIgdGhlIGdpdmVuIGludGVydmFsIGFuZCBvbiBpbnRlcmFjdGlvbiwgc3luY2hyb25pemVkIGdsb2JhbGx5J1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJkYXNoYm9hcmQtYXV0by1yZWZyZXNoLWNvbnRleHRcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzUG9zaXRpb25lZERldmljZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBVc2UgZ2xvYmFsIHJlZnJlc2ggaW50ZXJ2YWxcbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0xpdmUgdXBkYXRpbmcgb24gZWFjaCBwb3NpdGlvbiBjaGFuZ2UnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cInJlYWx0aW1lXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzUG9zaXRpb25lZERldmljZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBSZWFsdGltZVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQmluZCB3aWRnZXQgdG8gZGFzaGJvYXJkIHJlYWx0aW1lIGNvbnRleHQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cImRhc2hib2FyZC1yZWFsdGltZS1jb250ZXh0XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzUG9zaXRpb25lZERldmljZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBEYXNoYm9hcmQgcmVhbHRpbWUgY29udGV4dFxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLThcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgZm9ybS1ncm91cC1zbSBtLWItMFwiPlxuICAgICAgICAgIDxjOHktcmFuZ2VcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWwtYm90dG9tXCJcbiAgICAgICAgICAgIG5hbWU9XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgICAgI2ludGVydmFsUmFuZ2VcbiAgICAgICAgICAgICpuZ0lmPVwicmVmcmVzaE9wdGlvbiA9PT0gJ2ludGVydmFsJ1wiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcucmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2M4eVJhbmdlVmFsdWU+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBpbnRlcnZhbEluU2Vjb25kczogaW50ZXJ2YWxSYW5nZS52YWx1ZSAqIDAuMDAxIH1cIlxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgaW50ZXJ2YWxJblNlY29uZHMgfX0gc1xuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgIG1pbj1cIjUwMDBcIlxuICAgICAgICAgICAgICBtYXg9XCIxMDAwMDBcIlxuICAgICAgICAgICAgICBzdGVwPVwiMTAwMFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LXJhbmdlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgY2xhc3M9XCJjOHktc3dpdGNoIGM4eS1zd2l0Y2gtLWlubGluZVwiXG4gICAgICAgICAgKm5nSWY9XCJyZWZyZXNoT3B0aW9uID09PSAncmVhbHRpbWUnIHx8IHJlZnJlc2hPcHRpb24gPT09ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBuYW1lPVwiZm9sbG93XCJcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuZm9sbG93XCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTEyXCJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIEZvbGxvdyBzZWxlY3RlZFxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2XG4gIGNsYXNzPVwicC10LTE2IHAtYi0xNlwiXG4gIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMjQwcHhcIlxuPlxuICA8Yzh5LW1hcFxuICAgICpuZ0lmPVwiY29uZmlnLm1hcENvbmZpZ1wiXG4gICAgW2Fzc2V0c109XCJhc3NldHNcIlxuICAgIFtjb25maWddPVwiY29uZmlnLm1hcENvbmZpZ1wiXG4gICAgKG9uTW92ZSk9XCJvblByZXZpZXdNYXBNb3ZlKCRldmVudClcIlxuICAgIChvblpvb21TdGFydCk9XCJvblByZXZpZXdab29tU3RhcnQoKVwiXG4gICAgKG9uWm9vbUVuZCk9XCJvblByZXZpZXdab29tRW5kKCRldmVudClcIlxuICAgIChvbkluaXQpPVwicHJldmlld01hcEluaXQoJGV2ZW50KVwiXG4gID48L2M4eS1tYXA+XG48L2Rpdj5cbiJdfQ==