@c8y/ngx-components 1021.13.3 → 1021.21.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.
- package/alarms/alarms-list.component.d.ts +2 -17
- package/alarms/alarms-list.component.d.ts.map +1 -1
- package/alarms/alarms-view.service.d.ts +1 -0
- package/alarms/alarms-view.service.d.ts.map +1 -1
- package/alarms/alarms.model.d.ts +30 -0
- package/alarms/alarms.model.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.model.d.ts +1 -0
- package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.service.d.ts +7 -5
- package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
- package/context-dashboard/dashboard-detail.component.d.ts +4 -7
- package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
- package/context-dashboard/dashboard-detail.service.d.ts +4 -4
- package/context-dashboard/dashboard-detail.service.d.ts.map +1 -1
- package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts +2 -2
- package/context-dashboard/dashboard-settings/dashboard-general-settings.component.d.ts.map +1 -1
- package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts +19 -6
- package/context-dashboard/dashboard-settings/typed-dashboard-settings.component.d.ts.map +1 -1
- package/core/action-bar/action-bar-item.component.d.ts +1 -1
- package/core/action-bar/action-bar-item.component.d.ts.map +1 -1
- package/core/action-bar/action-bar.module.d.ts +6 -6
- package/core/action-bar/action-bar.module.d.ts.map +1 -1
- package/core/bootstrap/bootstrap.component.d.ts +3 -1
- package/core/bootstrap/bootstrap.component.d.ts.map +1 -1
- package/core/common/aggregation/aggregation.model.d.ts +39 -0
- package/core/common/aggregation/aggregation.model.d.ts.map +1 -0
- package/core/common/aggregation/aggregation.service.d.ts +17 -0
- package/core/common/aggregation/aggregation.service.d.ts.map +1 -0
- package/core/common/index.d.ts +4 -0
- package/core/common/index.d.ts.map +1 -1
- package/core/common/inter-app.service.d.ts +48 -0
- package/core/common/inter-app.service.d.ts.map +1 -0
- package/core/common/interval-based-reload.abstract.d.ts +120 -0
- package/core/common/interval-based-reload.abstract.d.ts.map +1 -0
- package/core/dashboard/dashboard.module.d.ts +24 -18
- package/core/dashboard/dashboard.module.d.ts.map +1 -1
- package/core/dashboard/index.d.ts +3 -0
- package/core/dashboard/index.d.ts.map +1 -1
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +31 -0
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts +17 -0
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts +4 -0
- package/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/index.d.ts +8 -0
- package/core/dashboard/widget-auto-refresh-context/index.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts +7 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts +29 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts +15 -0
- package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.d.ts.map +1 -0
- package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts +169 -0
- package/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.d.ts.map +1 -0
- package/core/dashboard/widgets-dashboard.component.d.ts +6 -3
- package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts +2 -2
- package/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context-query.service.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +11 -8
- package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
- package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts +6 -12
- package/core/dashboard/wiget-time-context/widget-time-context.model.d.ts.map +1 -1
- package/core/header/header.module.d.ts +18 -18
- package/core/header/header.module.d.ts.map +1 -1
- package/core/header/title/title.component.d.ts +1 -1
- package/core/header/title/title.component.d.ts.map +1 -1
- package/core/i18n/cached-locale-dictionary.service.d.ts +5 -1
- package/core/i18n/cached-locale-dictionary.service.d.ts.map +1 -1
- package/core/i18n/i18n.module.d.ts +0 -4
- package/core/i18n/i18n.module.d.ts.map +1 -1
- package/core/i18n/index.d.ts +2 -1
- package/core/i18n/index.d.ts.map +1 -1
- package/core/i18n/translation-loader.service.d.ts +50 -0
- package/core/i18n/translation-loader.service.d.ts.map +1 -0
- package/core/i18n/translation-utils.d.ts +14 -0
- package/core/i18n/translation-utils.d.ts.map +1 -0
- package/core/plugins/plugins-resolve.service.d.ts +7 -10
- package/core/plugins/plugins-resolve.service.d.ts.map +1 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts +2 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.d.ts.map +1 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +11 -2
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
- package/datapoint-selector/datapoint-selection.model.d.ts +6 -0
- package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
- package/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +117 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts +90 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +160 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts +89 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.d.ts.map +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts +3 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts +9 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts +56 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts +21 -0
- package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector.component.d.ts +14 -0
- package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -0
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts +232 -0
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -0
- package/datapoints-export-selector/index.d.ts +15 -0
- package/datapoints-export-selector/index.d.ts.map +1 -0
- package/device-list/device-list.module.d.ts +4 -2
- package/device-list/device-list.module.d.ts.map +1 -1
- package/esm2022/alarms/alarms-list.component.mjs +5 -16
- package/esm2022/alarms/alarms-view.service.mjs +2 -1
- package/esm2022/alarms/alarms.model.mjs +1 -1
- package/esm2022/context-dashboard/context-dashboard.component.mjs +4 -4
- package/esm2022/context-dashboard/context-dashboard.model.mjs +1 -1
- package/esm2022/context-dashboard/context-dashboard.service.mjs +47 -21
- package/esm2022/context-dashboard/dashboard-detail.component.mjs +8 -16
- package/esm2022/context-dashboard/dashboard-detail.service.mjs +13 -6
- package/esm2022/context-dashboard/dashboard-settings/dashboard-general-settings.component.mjs +3 -3
- package/esm2022/context-dashboard/dashboard-settings/typed-dashboard-settings.component.mjs +32 -11
- package/esm2022/core/action-bar/action-bar-item.component.mjs +3 -3
- package/esm2022/core/action-bar/action-bar.module.mjs +16 -5
- package/esm2022/core/bootstrap/bootstrap.component.mjs +21 -16
- package/esm2022/core/common/aggregation/aggregation.model.mjs +46 -0
- package/esm2022/core/common/aggregation/aggregation.service.mjs +34 -0
- package/esm2022/core/common/humanize-app-name.model.mjs +2 -2
- package/esm2022/core/common/humanize-app-name.pipe.mjs +2 -2
- package/esm2022/core/common/index.mjs +5 -1
- package/esm2022/core/common/inter-app.service.mjs +76 -0
- package/esm2022/core/common/interval-based-reload.abstract.mjs +110 -0
- package/esm2022/core/countdown-interval/countdown-interval.component.mjs +3 -3
- package/esm2022/core/dashboard/dashboard-child.component.mjs +6 -5
- package/esm2022/core/dashboard/dashboard.module.mjs +18 -1
- package/esm2022/core/dashboard/index.mjs +4 -1
- package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +101 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-select-control.component.mjs +50 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/global-refresh-loading.operator.mjs +7 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/index.mjs +8 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context-icon-bar.component.mjs +18 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +127 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.model.mjs +5 -0
- package/esm2022/core/dashboard/widget-auto-refresh-context/widget-global-auto-refresh.service.mjs +233 -0
- package/esm2022/core/dashboard/widgets-dashboard.component.mjs +35 -30
- package/esm2022/core/dashboard/wiget-time-context/aggregation-picker/aggregation-picker.component.mjs +4 -4
- package/esm2022/core/dashboard/wiget-time-context/realtime-control/realtime-control.component.mjs +2 -2
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +5 -5
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context-query.service.mjs +7 -4
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -37
- package/esm2022/core/dashboard/wiget-time-context/widget-time-context.model.mjs +1 -28
- package/esm2022/core/date-time-picker/date-time-picker.component.mjs +3 -3
- package/esm2022/core/header/header.module.mjs +7 -5
- package/esm2022/core/header/title/title.component.mjs +3 -3
- package/esm2022/core/i18n/cached-locale-dictionary.service.mjs +1 -1
- package/esm2022/core/i18n/i18n.module.mjs +7 -14
- package/esm2022/core/i18n/index.mjs +3 -2
- package/esm2022/core/i18n/translate.parser.mjs +2 -2
- package/esm2022/core/i18n/translation-loader.service.mjs +132 -0
- package/esm2022/core/i18n/translation-utils.mjs +24 -0
- package/esm2022/core/plugins/plugins-resolve.service.mjs +12 -37
- package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form-validation.service.mjs +13 -6
- package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +22 -5
- package/esm2022/datapoint-selector/datapoint-selection-list/datapoint-selection-list.component.mjs +3 -3
- package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
- package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
- package/esm2022/datapoints-export-selector/c8y-ngx-components-datapoints-export-selector.mjs +5 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +407 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.mjs +207 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +467 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.mjs +187 -0
- 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
- 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
- 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
- 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
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.mjs +120 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.mjs +282 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.mjs +76 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.mjs +46 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +42 -0
- package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +43 -0
- package/esm2022/datapoints-export-selector/index.mjs +15 -0
- package/esm2022/device-list/add-smart-group.component.mjs +4 -3
- package/esm2022/device-list/device-list.module.mjs +22 -4
- package/esm2022/map/cluster-map.component.mjs +41 -13
- package/esm2022/map/map-status.component.mjs +6 -5
- package/esm2022/map/map.component.mjs +9 -5
- package/esm2022/map/map.model.mjs +1 -1
- package/esm2022/translation-editor/c8y-ngx-components-translation-editor.mjs +5 -0
- package/esm2022/translation-editor/data/c8y-ngx-components-translation-editor-data.mjs +5 -0
- package/esm2022/translation-editor/data/index.mjs +2 -0
- package/esm2022/translation-editor/data/translation-store.service.mjs +175 -0
- package/esm2022/translation-editor/index.mjs +10 -0
- package/esm2022/translation-editor/lazy/add-translation-modal/add-translation-modal.component.mjs +70 -0
- package/esm2022/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.mjs +5 -0
- package/esm2022/translation-editor/lazy/index.mjs +2 -0
- package/esm2022/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.mjs +53 -0
- package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +124 -0
- package/esm2022/translation-editor/translation-editor-naviagtor-factory.service.mjs +31 -0
- package/esm2022/widgets/cockpit/index.mjs +4 -2
- package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
- package/esm2022/widgets/definitions/alarms/alarm-list/index.mjs +6 -2
- package/esm2022/widgets/definitions/alarms/all-critical-alarms/index.mjs +6 -2
- package/esm2022/widgets/definitions/alarms/recent-alarms/index.mjs +6 -2
- package/esm2022/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +5 -0
- package/esm2022/widgets/definitions/datapoints-table/index.mjs +34 -0
- package/esm2022/widgets/definitions/index.mjs +2 -1
- package/esm2022/widgets/definitions/map/index.mjs +4 -2
- package/esm2022/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.mjs +29 -15
- package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +57 -25
- package/esm2022/widgets/implementations/alarms/alarm-list-widget.model.mjs +2 -1
- package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +19 -21
- package/esm2022/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +5 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +383 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.mjs +124 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.mjs +191 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.mjs +36 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.mjs +45 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +116 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +116 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.mjs +43 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +282 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.mjs +430 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.mjs +75 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +76 -0
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table.service.mjs +52 -0
- package/esm2022/widgets/implementations/datapoints-table/date-range-picker.component.mjs +68 -0
- package/esm2022/widgets/implementations/datapoints-table/index.mjs +10 -0
- package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +19 -11
- package/esm2022/widgets/implementations/map/map-widget.component.mjs +20 -2
- package/esm2022/widgets/implementations/map/map-widget.model.mjs +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +5 -15
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +135 -91
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +37 -13
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +1928 -0
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-device-list.mjs +24 -5
- package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-map.mjs +52 -19
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +181 -0
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +236 -0
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-translation-editor.mjs +46 -0
- package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +3 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +5 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs +5 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-all-critical-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs +5 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-recent-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +41 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +3 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +101 -58
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1967 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +37 -11
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +5080 -4272
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +289 -18
- package/locales/en.po +12 -0
- package/locales/en_US.po +3 -0
- package/locales/es.po +253 -18
- package/locales/fr.po +253 -18
- package/locales/ja_JP.po +282 -18
- package/locales/locales.pot +257 -18
- package/locales/nl.po +253 -18
- package/locales/pl.po +253 -18
- package/locales/pt_BR.po +253 -18
- package/map/cluster-map.component.d.ts +8 -3
- package/map/cluster-map.component.d.ts.map +1 -1
- package/map/map-status.component.d.ts +0 -3
- package/map/map-status.component.d.ts.map +1 -1
- package/map/map.component.d.ts +4 -2
- package/map/map.component.d.ts.map +1 -1
- package/map/map.model.d.ts +2 -1
- package/map/map.model.d.ts.map +1 -1
- package/package.json +1 -1
- package/translation-editor/c8y-ngx-components-translation-editor.d.ts.map +1 -0
- package/translation-editor/data/c8y-ngx-components-translation-editor-data.d.ts.map +1 -0
- package/translation-editor/data/index.d.ts +2 -0
- package/translation-editor/data/index.d.ts.map +1 -0
- package/translation-editor/data/translation-store.service.d.ts +61 -0
- package/translation-editor/data/translation-store.service.d.ts.map +1 -0
- package/translation-editor/index.d.ts +2 -0
- package/translation-editor/index.d.ts.map +1 -0
- package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts +30 -0
- package/translation-editor/lazy/add-translation-modal/add-translation-modal.component.d.ts.map +1 -0
- package/translation-editor/lazy/c8y-ngx-components-translation-editor-lazy.d.ts.map +1 -0
- package/translation-editor/lazy/index.d.ts +2 -0
- package/translation-editor/lazy/index.d.ts.map +1 -0
- package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts +22 -0
- package/translation-editor/lazy/manage-translation-cell-renderer/manage-translation-cell-renderer.component.d.ts.map +1 -0
- package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts +34 -0
- package/translation-editor/lazy/translation-editor/translation-editor.component.d.ts.map +1 -0
- package/translation-editor/translation-editor-naviagtor-factory.service.d.ts +11 -0
- package/translation-editor/translation-editor-naviagtor-factory.service.d.ts.map +1 -0
- package/widgets/cockpit/index.d.ts +13 -0
- package/widgets/cockpit/index.d.ts.map +1 -1
- package/widgets/cockpit-exports/index.d.ts +6 -0
- package/widgets/cockpit-exports/index.d.ts.map +1 -1
- package/widgets/definitions/alarms/alarm-list/index.d.ts +2 -0
- package/widgets/definitions/alarms/alarm-list/index.d.ts.map +1 -1
- package/widgets/definitions/alarms/all-critical-alarms/index.d.ts +2 -0
- package/widgets/definitions/alarms/all-critical-alarms/index.d.ts.map +1 -1
- package/widgets/definitions/alarms/recent-alarms/index.d.ts +2 -0
- package/widgets/definitions/alarms/recent-alarms/index.d.ts.map +1 -1
- package/widgets/definitions/datapoints-table/c8y-ngx-components-widgets-definitions-datapoints-table.d.ts.map +1 -0
- package/widgets/definitions/datapoints-table/index.d.ts +14 -0
- package/widgets/definitions/datapoints-table/index.d.ts.map +1 -0
- package/widgets/definitions/index.d.ts +1 -0
- package/widgets/definitions/index.d.ts.map +1 -1
- package/widgets/definitions/map/index.d.ts +2 -1
- package/widgets/definitions/map/index.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts +5 -9
- package/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts +17 -10
- package/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-list-widget.model.d.ts +5 -1
- package/widgets/implementations/alarms/alarm-list-widget.model.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +5 -11
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/c8y-ngx-components-widgets-implementations-datapoints-table.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +129 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts +56 -0
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.service.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts +88 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/adjust-aggregated-time-range.pipe.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts +19 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/apply-range-class.pipe.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts +26 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/column-title.pipe.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +63 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts +38 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts +13 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/dynamic-column.directive.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +123 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts +196 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.service.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts +41 -0
- package/widgets/implementations/datapoints-table/datapoints-table-view/virtual-scroll-listener.directive.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +175 -0
- package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts +12 -0
- package/widgets/implementations/datapoints-table/datapoints-table.service.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts +34 -0
- package/widgets/implementations/datapoints-table/date-range-picker.component.d.ts.map +1 -0
- package/widgets/implementations/datapoints-table/index.d.ts +10 -0
- package/widgets/implementations/datapoints-table/index.d.ts.map +1 -0
- package/widgets/implementations/map/map-widget-config.component.d.ts +4 -4
- package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/map/map-widget.component.d.ts +8 -3
- package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
- package/widgets/implementations/map/map-widget.model.d.ts +4 -3
- package/widgets/implementations/map/map-widget.model.d.ts.map +1 -1
- package/core/i18n/translate.loader.d.ts +0 -31
- package/core/i18n/translate.loader.d.ts.map +0 -1
- package/esm2022/core/i18n/translate.loader.mjs +0 -71
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { gettext } from '@c8y/ngx-components';
|
|
2
|
+
class CSVDataTransformer {
|
|
3
|
+
transformToMergedFormat(exportData) {
|
|
4
|
+
const timeSeries = new Map();
|
|
5
|
+
const uniqueColumnIdentifiers = new Set();
|
|
6
|
+
exportData.forEach(({ time, device_name, fragment_series, unit, value_min, value_max, source }) => {
|
|
7
|
+
const measurementIdentifier = this.createMeasurementIdentifier(device_name, fragment_series, unit, source);
|
|
8
|
+
if (!timeSeries.has(time)) {
|
|
9
|
+
timeSeries.set(time, {});
|
|
10
|
+
}
|
|
11
|
+
const timeEntry = timeSeries.get(time);
|
|
12
|
+
if (timeEntry) {
|
|
13
|
+
const minKey = this.formatMinKey(measurementIdentifier);
|
|
14
|
+
const maxKey = this.formatMaxKey(measurementIdentifier);
|
|
15
|
+
timeEntry[minKey] = value_min;
|
|
16
|
+
timeEntry[maxKey] = value_max;
|
|
17
|
+
uniqueColumnIdentifiers.add(minKey);
|
|
18
|
+
uniqueColumnIdentifiers.add(maxKey);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
timeSeries,
|
|
23
|
+
uniqueColumnIdentifiers: Array.from(uniqueColumnIdentifiers)
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
createMeasurementIdentifier(deviceName, fragmentSeries, unit, source) {
|
|
27
|
+
return unit
|
|
28
|
+
? `(${source}) ${deviceName} -> ${fragmentSeries} [${unit}]`
|
|
29
|
+
: `(${source}) ${deviceName} -> ${fragmentSeries}`;
|
|
30
|
+
}
|
|
31
|
+
formatMinKey(baseKey) {
|
|
32
|
+
return `${baseKey} (min)`;
|
|
33
|
+
}
|
|
34
|
+
formatMaxKey(baseKey) {
|
|
35
|
+
return `${baseKey} (max)`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
class CSVFileCreator {
|
|
39
|
+
async createFile(content, mimeType) {
|
|
40
|
+
return new Blob([content], { type: mimeType });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
class CSVGenerator {
|
|
44
|
+
static getLabel() {
|
|
45
|
+
return gettext('Comma-separated value');
|
|
46
|
+
}
|
|
47
|
+
static getTitle() {
|
|
48
|
+
return 'CSV';
|
|
49
|
+
}
|
|
50
|
+
static getType() {
|
|
51
|
+
return 'csv';
|
|
52
|
+
}
|
|
53
|
+
static getIcon() {
|
|
54
|
+
return 'table';
|
|
55
|
+
}
|
|
56
|
+
static getFileExtension() {
|
|
57
|
+
return 'csv';
|
|
58
|
+
}
|
|
59
|
+
static getAcceptType() {
|
|
60
|
+
return 'text/csv';
|
|
61
|
+
}
|
|
62
|
+
static getMimeType() {
|
|
63
|
+
return 'text/csv';
|
|
64
|
+
}
|
|
65
|
+
static getZipName() {
|
|
66
|
+
return 'export_csv.zip';
|
|
67
|
+
}
|
|
68
|
+
static async convertToMergedCSV(exportData, mergedExportDetails) {
|
|
69
|
+
const instance = CSVGenerator.getInstance();
|
|
70
|
+
const { timeSeries, uniqueColumnIdentifiers } = instance.dataTransformer.transformToMergedFormat(exportData);
|
|
71
|
+
const rows = [
|
|
72
|
+
instance.createMergedFileHeaderRow(uniqueColumnIdentifiers, mergedExportDetails),
|
|
73
|
+
...instance.createMergedFileDataRows(timeSeries, uniqueColumnIdentifiers)
|
|
74
|
+
];
|
|
75
|
+
const csvContent = rows.map(row => row.join(',')).join('\n');
|
|
76
|
+
return instance.fileCreator.createFile(csvContent, CSVGenerator.getMimeType());
|
|
77
|
+
}
|
|
78
|
+
static getInstance() {
|
|
79
|
+
if (!CSVGenerator.instance) {
|
|
80
|
+
CSVGenerator.instance = new CSVGenerator();
|
|
81
|
+
}
|
|
82
|
+
return CSVGenerator.instance;
|
|
83
|
+
}
|
|
84
|
+
constructor() {
|
|
85
|
+
this.dataTransformer = new CSVDataTransformer();
|
|
86
|
+
this.fileCreator = new CSVFileCreator();
|
|
87
|
+
}
|
|
88
|
+
createMergedFileHeaderRow(uniqueColumnIdentifiers, details) {
|
|
89
|
+
const time = details ? `time => from ${details.dateFrom} to ${details.dateTo}` : 'time';
|
|
90
|
+
return [time, ...uniqueColumnIdentifiers];
|
|
91
|
+
}
|
|
92
|
+
createMergedFileDataRows(timeSeries, uniqueColumnIdentifiers) {
|
|
93
|
+
return Array.from(timeSeries.entries())
|
|
94
|
+
.filter(([time, values]) => this.isValidEntry(time, values))
|
|
95
|
+
.map(([time, values]) => this.createDataRow(time, values, uniqueColumnIdentifiers));
|
|
96
|
+
}
|
|
97
|
+
isValidEntry(time, values) {
|
|
98
|
+
return time !== null && Object.values(values).some(value => value != null);
|
|
99
|
+
}
|
|
100
|
+
createDataRow(time, values, uniqueColumnIdentifiers) {
|
|
101
|
+
const row = [time];
|
|
102
|
+
uniqueColumnIdentifiers.forEach(key => {
|
|
103
|
+
const value = values[key];
|
|
104
|
+
row.push(value?.toString() || '');
|
|
105
|
+
});
|
|
106
|
+
return row;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export const CSVGeneratorAdapter = {
|
|
110
|
+
getLabel: CSVGenerator.getLabel.bind(CSVGenerator),
|
|
111
|
+
getIcon: CSVGenerator.getIcon.bind(CSVGenerator),
|
|
112
|
+
getFileExtension: CSVGenerator.getFileExtension.bind(CSVGenerator),
|
|
113
|
+
getMimeType: CSVGenerator.getMimeType.bind(CSVGenerator),
|
|
114
|
+
generateMerged: CSVGenerator.convertToMergedCSV.bind(CSVGenerator),
|
|
115
|
+
getType: CSVGenerator.getType.bind(CSVGenerator),
|
|
116
|
+
getTitle: CSVGenerator.getTitle.bind(CSVGenerator),
|
|
117
|
+
getZipName: CSVGenerator.getZipName.bind(CSVGenerator),
|
|
118
|
+
getAcceptType: CSVGenerator.getAcceptType.bind(CSVGenerator)
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LWdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLW1vZGFsL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWZpbGUtZXhwb3J0ZXIvZ2VuZXJhdG9ycy9jc3YtZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQWE5QyxNQUFNLGtCQUFrQjtJQUN0Qix1QkFBdUIsQ0FBQyxVQUF3QjtRQUM5QyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztRQUM3RCxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFbEQsVUFBVSxDQUFDLE9BQU8sQ0FDaEIsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7WUFDN0UsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQzVELFdBQVcsRUFDWCxlQUFlLEVBQ2YsSUFBSSxFQUNKLE1BQU0sQ0FDUCxDQUFDO1lBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0IsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUks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LENBQUMsWUFBWSxDQUFDO0NBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBFeHBvcnREYXRhLFxuICBGaWxlR2VuZXJhdG9yLFxuICBJRGF0YVRyYW5zZm9ybWVyLFxuICBNZXJnZWRFeHBvcnREZXRhaWxzLFxuICBUaW1lU2VyaWVzQ29sdW1uRGF0YVxufSBmcm9tICcuLi8uLi8uLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci5tb2RlbCc7XG5cbmludGVyZmFjZSBJQ3N2RmlsZUNyZWF0b3Ige1xuICBjcmVhdGVGaWxlKGNvbnRlbnQ6IHN0cmluZywgbWltZVR5cGU6IHN0cmluZyk6IFByb21pc2U8QmxvYj47XG59XG5cbmNsYXNzIENTVkRhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIElEYXRhVHJhbnNmb3JtZXIge1xuICB0cmFuc2Zvcm1Ub01lcmdlZEZvcm1hdChleHBvcnREYXRhOiBFeHBvcnREYXRhW10pOiBUaW1lU2VyaWVzQ29sdW1uRGF0YSB7XG4gICAgY29uc3QgdGltZVNlcmllcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PigpO1xuICAgIGNvbnN0IHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBleHBvcnREYXRhLmZvckVhY2goXG4gICAgICAoeyB0aW1lLCBkZXZpY2VfbmFtZSwgZnJhZ21lbnRfc2VyaWVzLCB1bml0LCB2YWx1ZV9taW4sIHZhbHVlX21heCwgc291cmNlIH0pID0+IHtcbiAgICAgICAgY29uc3QgbWVhc3VyZW1lbnRJZGVudGlmaWVyID0gdGhpcy5jcmVhdGVNZWFzdXJlbWVudElkZW50aWZpZXIoXG4gICAgICAgICAgZGV2aWNlX25hbWUsXG4gICAgICAgICAgZnJhZ21lbnRfc2VyaWVzLFxuICAgICAgICAgIHVuaXQsXG4gICAgICAgICAgc291cmNlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aW1lU2VyaWVzLmhhcyh0aW1lKSkge1xuICAgICAgICAgIHRpbWVTZXJpZXMuc2V0KHRpbWUsIHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVFbnRyeSA9IHRpbWVTZXJpZXMuZ2V0KHRpbWUpO1xuICAgICAgICBpZiAodGltZUVudHJ5KSB7XG4gICAgICAgICAgY29uc3QgbWluS2V5ID0gdGhpcy5mb3JtYXRNaW5LZXkobWVhc3VyZW1lbnRJZGVudGlmaWVyKTtcbiAgICAgICAgICBjb25zdCBtYXhLZXkgPSB0aGlzLmZvcm1hdE1heEtleShtZWFzdXJlbWVudElkZW50aWZpZXIpO1xuXG4gICAgICAgICAgdGltZUVudHJ5W21pbktleV0gPSB2YWx1ZV9taW47XG4gICAgICAgICAgdGltZUVudHJ5W21heEtleV0gPSB2YWx1ZV9tYXg7XG5cbiAgICAgICAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVycy5hZGQobWluS2V5KTtcbiAgICAgICAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVycy5hZGQobWF4S2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGltZVNlcmllcyxcbiAgICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzOiBBcnJheS5mcm9tKHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVtZW50SWRlbnRpZmllcihcbiAgICBkZXZpY2VOYW1lOiBzdHJpbmcsXG4gICAgZnJhZ21lbnRTZXJpZXM6IHN0cmluZyxcbiAgICB1bml0OiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdW5pdFxuICAgICAgPyBgKCR7c291cmNlfSkgJHtkZXZpY2VOYW1lfSAtPiAke2ZyYWdtZW50U2VyaWVzfSBbJHt1bml0fV1gXG4gICAgICA6IGAoJHtzb3VyY2V9KSAke2RldmljZU5hbWV9IC0+ICR7ZnJhZ21lbnRTZXJpZXN9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TWluS2V5KGJhc2VLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Jhc2VLZXl9IChtaW4pYDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TWF4S2V5KGJhc2VLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Jhc2VLZXl9IChtYXgpYDtcbiAgfVxufVxuXG5jbGFzcyBDU1ZGaWxlQ3JlYXRvciBpbXBsZW1lbnRzIElDc3ZGaWxlQ3JlYXRvciB7XG4gIGFzeW5jIGNyZWF0ZUZpbGUoY29udGVudDogc3RyaW5nLCBtaW1lVHlwZTogc3RyaW5nKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtjb250ZW50XSwgeyB0eXBlOiBtaW1lVHlwZSB9KTtcbiAgfVxufVxuXG5jbGFzcyBDU1ZHZW5lcmF0b3Ige1xuICBzdGF0aWMgZ2V0TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0dGV4dCgnQ29tbWEtc2VwYXJhdGVkIHZhbHVlJyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0VGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0NTVic7XG4gIH1cblxuICBzdGF0aWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY3N2JztcbiAgfVxuXG4gIHN0YXRpYyBnZXRJY29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICd0YWJsZSc7XG4gIH1cblxuICBzdGF0aWMgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY3N2JztcbiAgfVxuXG4gIHN0YXRpYyBnZXRBY2NlcHRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICd0ZXh0L2Nzdic7XG4gIH1cblxuICBzdGF0aWMgZ2V0TWltZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ3RleHQvY3N2JztcbiAgfVxuXG4gIHN0YXRpYyBnZXRaaXBOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdleHBvcnRfY3N2LnppcCc7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY29udmVydFRvTWVyZ2VkQ1NWKFxuICAgIGV4cG9ydERhdGE6IEV4cG9ydERhdGFbXSxcbiAgICBtZXJnZWRFeHBvcnREZXRhaWxzOiBNZXJnZWRFeHBvcnREZXRhaWxzXG4gICk6IFByb21pc2U8QmxvYj4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gQ1NWR2VuZXJhdG9yLmdldEluc3RhbmNlKCk7XG4gICAgY29uc3QgeyB0aW1lU2VyaWVzLCB1bmlxdWVDb2x1bW5JZGVudGlmaWVycyB9ID1cbiAgICAgIGluc3RhbmNlLmRhdGFUcmFuc2Zvcm1lci50cmFuc2Zvcm1Ub01lcmdlZEZvcm1hdChleHBvcnREYXRhKTtcblxuICAgIGNvbnN0IHJvd3MgPSBbXG4gICAgICBpbnN0YW5jZS5jcmVhdGVNZXJnZWRGaWxlSGVhZGVyUm93KHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzLCBtZXJnZWRFeHBvcnREZXRhaWxzKSxcbiAgICAgIC4uLmluc3RhbmNlLmNyZWF0ZU1lcmdlZEZpbGVEYXRhUm93cyh0aW1lU2VyaWVzLCB1bmlxdWVDb2x1bW5JZGVudGlmaWVycylcbiAgICBdO1xuXG4gICAgY29uc3QgY3N2Q29udGVudCA9IHJvd3MubWFwKHJvdyA9PiByb3cuam9pbignLCcpKS5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gaW5zdGFuY2UuZmlsZUNyZWF0b3IuY3JlYXRlRmlsZShjc3ZDb250ZW50LCBDU1ZHZW5lcmF0b3IuZ2V0TWltZVR5cGUoKSk7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENTVkdlbmVyYXRvcjtcblxuICBwcml2YXRlIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBDU1ZHZW5lcmF0b3Ige1xuICAgIGlmICghQ1NWR2VuZXJhdG9yLmluc3RhbmNlKSB7XG4gICAgICBDU1ZHZW5lcmF0b3IuaW5zdGFuY2UgPSBuZXcgQ1NWR2VuZXJhdG9yKCk7XG4gICAgfVxuICAgIHJldHVybiBDU1ZHZW5lcmF0b3IuaW5zdGFuY2U7XG4gIH1cbiAgcHJpdmF0ZSBkYXRhVHJhbnNmb3JtZXI6IElEYXRhVHJhbnNmb3JtZXI7XG4gIHByaXZhdGUgZmlsZUNyZWF0b3I6IElDc3ZGaWxlQ3JlYXRvcjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZGF0YVRyYW5zZm9ybWVyID0gbmV3IENTVkRhdGFUcmFuc2Zvcm1lcigpO1xuICAgIHRoaXMuZmlsZUNyZWF0b3IgPSBuZXcgQ1NWRmlsZUNyZWF0b3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVyZ2VkRmlsZUhlYWRlclJvdyhcbiAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVyczogc3RyaW5nW10sXG4gICAgZGV0YWlscz86IE1lcmdlZEV4cG9ydERldGFpbHNcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRpbWUgPSBkZXRhaWxzID8gYHRpbWUgPT4gZnJvbSAke2RldGFpbHMuZGF0ZUZyb219IHRvICR7ZGV0YWlscy5kYXRlVG99YCA6ICd0aW1lJztcbiAgICByZXR1cm4gW3RpbWUsIC4uLnVuaXF1ZUNvbHVtbklkZW50aWZpZXJzXTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVyZ2VkRmlsZURhdGFSb3dzKFxuICAgIHRpbWVTZXJpZXM6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIG51bWJlcj4+LFxuICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzOiBzdHJpbmdbXVxuICApOiBzdHJpbmdbXVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aW1lU2VyaWVzLmVudHJpZXMoKSlcbiAgICAgIC5maWx0ZXIoKFt0aW1lLCB2YWx1ZXNdKSA9PiB0aGlzLmlzVmFsaWRFbnRyeSh0aW1lLCB2YWx1ZXMpKVxuICAgICAgLm1hcCgoW3RpbWUsIHZhbHVlc10pID0+IHRoaXMuY3JlYXRlRGF0YVJvdyh0aW1lLCB2YWx1ZXMsIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzKSk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRFbnRyeSh0aW1lOiBzdHJpbmcsIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aW1lICE9PSBudWxsICYmIE9iamVjdC52YWx1ZXModmFsdWVzKS5zb21lKHZhbHVlID0+IHZhbHVlICE9IG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhUm93KFxuICAgIHRpbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gICAgdW5pcXVlQ29sdW1uSWRlbnRpZmllcnM6IHN0cmluZ1tdXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByb3cgPSBbdGltZV07XG4gICAgdW5pcXVlQ29sdW1uSWRlbnRpZmllcnMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgIHJvdy5wdXNoKHZhbHVlPy50b1N0cmluZygpIHx8ICcnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcm93O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBDU1ZHZW5lcmF0b3JBZGFwdGVyOiBGaWxlR2VuZXJhdG9yID0ge1xuICBnZXRMYWJlbDogQ1NWR2VuZXJhdG9yLmdldExhYmVsLmJpbmQoQ1NWR2VuZXJhdG9yKSxcbiAgZ2V0SWNvbjogQ1NWR2VuZXJhdG9yLmdldEljb24uYmluZChDU1ZHZW5lcmF0b3IpLFxuICBnZXRGaWxlRXh0ZW5zaW9uOiBDU1ZHZW5lcmF0b3IuZ2V0RmlsZUV4dGVuc2lvbi5iaW5kKENTVkdlbmVyYXRvciksXG4gIGdldE1pbWVUeXBlOiBDU1ZHZW5lcmF0b3IuZ2V0TWltZVR5cGUuYmluZChDU1ZHZW5lcmF0b3IpLFxuICBnZW5lcmF0ZU1lcmdlZDogQ1NWR2VuZXJhdG9yLmNvbnZlcnRUb01lcmdlZENTVi5iaW5kKENTVkdlbmVyYXRvciksXG4gIGdldFR5cGU6IENTVkdlbmVyYXRvci5nZXRUeXBlLmJpbmQoQ1NWR2VuZXJhdG9yKSxcbiAgZ2V0VGl0bGU6IENTVkdlbmVyYXRvci5nZXRUaXRsZS5iaW5kKENTVkdlbmVyYXRvciksXG4gIGdldFppcE5hbWU6IENTVkdlbmVyYXRvci5nZXRaaXBOYW1lLmJpbmQoQ1NWR2VuZXJhdG9yKSxcbiAgZ2V0QWNjZXB0VHlwZTogQ1NWR2VuZXJhdG9yLmdldEFjY2VwdFR5cGUuYmluZChDU1ZHZW5lcmF0b3IpXG59O1xuIl19
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { gettext } from '@c8y/ngx-components';
|
|
2
|
+
import JSZip from 'jszip';
|
|
3
|
+
import { isEmpty, isNil, isNumber } from 'lodash-es';
|
|
4
|
+
import { FILE_COMPRESSION_TYPES_VALUES } from '../../../datapoints-export-selector.model';
|
|
5
|
+
// Utility functions
|
|
6
|
+
class XmlUtils {
|
|
7
|
+
static escapeXml(unsafe) {
|
|
8
|
+
return unsafe.replace(/[<>&'"]/g, c => {
|
|
9
|
+
switch (c) {
|
|
10
|
+
case '<':
|
|
11
|
+
return '<';
|
|
12
|
+
case '>':
|
|
13
|
+
return '>';
|
|
14
|
+
case '&':
|
|
15
|
+
return '&';
|
|
16
|
+
case "'":
|
|
17
|
+
return ''';
|
|
18
|
+
case '"':
|
|
19
|
+
return '"';
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export class ExcelDataTransformer {
|
|
25
|
+
transformToMergedFormat(exportData) {
|
|
26
|
+
const timeSeries = new Map();
|
|
27
|
+
const uniqueColumnIdentifiers = new Set();
|
|
28
|
+
exportData.forEach(({ time, device_name, fragment_series, unit, value_min, value_max, source }) => {
|
|
29
|
+
const measurementIdentifier = this.createMeasurementIdentifier(device_name, fragment_series, unit, source);
|
|
30
|
+
if (!timeSeries.has(time)) {
|
|
31
|
+
timeSeries.set(time, {});
|
|
32
|
+
}
|
|
33
|
+
const timeEntry = timeSeries.get(time);
|
|
34
|
+
if (timeEntry) {
|
|
35
|
+
const minKey = this.formatMinKey(measurementIdentifier);
|
|
36
|
+
const maxKey = this.formatMaxKey(measurementIdentifier);
|
|
37
|
+
timeEntry[minKey] = value_min;
|
|
38
|
+
timeEntry[maxKey] = value_max;
|
|
39
|
+
uniqueColumnIdentifiers.add(minKey);
|
|
40
|
+
uniqueColumnIdentifiers.add(maxKey);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
timeSeries,
|
|
45
|
+
uniqueColumnIdentifiers: Array.from(uniqueColumnIdentifiers)
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
createMeasurementIdentifier(deviceName, fragmentSeries, unit, source) {
|
|
49
|
+
return unit
|
|
50
|
+
? `(${source}) ${deviceName} -> ${fragmentSeries} [${unit}]`
|
|
51
|
+
: `(${source}) ${deviceName} -> ${fragmentSeries}`;
|
|
52
|
+
}
|
|
53
|
+
formatMinKey(baseKey) {
|
|
54
|
+
return `${baseKey} (min)`;
|
|
55
|
+
}
|
|
56
|
+
formatMaxKey(baseKey) {
|
|
57
|
+
return `${baseKey} (max)`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
class ExcelXmlGenerator {
|
|
61
|
+
constructor() {
|
|
62
|
+
this.columnWidths = {
|
|
63
|
+
time: 25,
|
|
64
|
+
source: 10,
|
|
65
|
+
device_name: 20,
|
|
66
|
+
'fragment.series': 20,
|
|
67
|
+
value_min: 15,
|
|
68
|
+
value_max: 15,
|
|
69
|
+
unit: 5
|
|
70
|
+
};
|
|
71
|
+
this.defaultWidth = 30;
|
|
72
|
+
this.RELS_XML = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' +
|
|
73
|
+
'<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">\n' +
|
|
74
|
+
' <Relationship Id="rId1" Target="xl/workbook.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"/>\n' +
|
|
75
|
+
' <Relationship Id="rId2" Target="docProps/app.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"/>\n' +
|
|
76
|
+
' <Relationship Id="rId3" Target="docProps/core.xml" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"/>\n' +
|
|
77
|
+
'</Relationships>';
|
|
78
|
+
this.CONTENT_TYPES_XML = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n' +
|
|
79
|
+
'<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">\n' +
|
|
80
|
+
' <Default ContentType="application/vnd.openxmlformats-package.relationships+xml" Extension="rels"/>\n' +
|
|
81
|
+
' <Default ContentType="application/xml" Extension="xml"/>\n' +
|
|
82
|
+
' <Override ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml" PartName="/docProps/app.xml"/>\n' +
|
|
83
|
+
' <Override ContentType="application/vnd.openxmlformats-package.core-properties+xml" PartName="/docProps/core.xml"/>\n' +
|
|
84
|
+
' <Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" PartName="/xl/sharedStrings.xml"/>\n' +
|
|
85
|
+
' <Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" PartName="/xl/workbook.xml"/>\n' +
|
|
86
|
+
' <Override ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" PartName="/xl/worksheets/sheet1.xml"/>\n' +
|
|
87
|
+
'</Types>';
|
|
88
|
+
this.WORKBOOK_RELS_XML = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' +
|
|
89
|
+
'<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">\n' +
|
|
90
|
+
' <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>\n' +
|
|
91
|
+
' <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>\n' +
|
|
92
|
+
'</Relationships>';
|
|
93
|
+
this.SHARED_STRINGS_XML = '<?xml version="1.0" encoding="UTF-8"?>\n' +
|
|
94
|
+
'<sst count="0" uniqueCount="0" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"/>';
|
|
95
|
+
}
|
|
96
|
+
generateWorkbookXml(sheetName = 'Measurements') {
|
|
97
|
+
return ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' +
|
|
98
|
+
`<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><sheets><sheet name='${sheetName}' r:id="rId3" sheetId="1"/></sheets></workbook>`);
|
|
99
|
+
}
|
|
100
|
+
generateSheetXml(data) {
|
|
101
|
+
const headers = data[0];
|
|
102
|
+
const colsXml = this.generateColsXml(headers);
|
|
103
|
+
const rowsXml = this.generateRowsXml(data);
|
|
104
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
105
|
+
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
|
106
|
+
<cols>${colsXml}</cols>
|
|
107
|
+
<sheetData>${rowsXml}</sheetData>
|
|
108
|
+
</worksheet>`;
|
|
109
|
+
}
|
|
110
|
+
generateAppXml(name) {
|
|
111
|
+
return ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' +
|
|
112
|
+
'<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">\n' +
|
|
113
|
+
` <Application>${name}</Application>\n` +
|
|
114
|
+
' <DocSecurity>0</DocSecurity>\n' +
|
|
115
|
+
' <ScaleCrop>false</ScaleCrop>\n' +
|
|
116
|
+
' <HeadingPairs>\n' +
|
|
117
|
+
' <vt:vector size="2" baseType="variant">\n' +
|
|
118
|
+
' <vt:variant>\n' +
|
|
119
|
+
' <vt:lpstr>Worksheets</vt:lpstr>\n' +
|
|
120
|
+
' </vt:variant>\n' +
|
|
121
|
+
' <vt:variant>\n' +
|
|
122
|
+
' <vt:i4>1</vt:i4>\n' +
|
|
123
|
+
' </vt:variant>\n' +
|
|
124
|
+
' </vt:vector>\n' +
|
|
125
|
+
' </HeadingPairs>\n' +
|
|
126
|
+
' <TitlesOfParts>\n' +
|
|
127
|
+
' <vt:vector size="1" baseType="lpstr">\n' +
|
|
128
|
+
' <vt:lpstr>Sheet1</vt:lpstr>\n' +
|
|
129
|
+
' </vt:vector>\n' +
|
|
130
|
+
' </TitlesOfParts>\n' +
|
|
131
|
+
' <Company></Company>\n' +
|
|
132
|
+
' <LinksUpToDate>false</LinksUpToDate>\n' +
|
|
133
|
+
' <SharedDoc>false</SharedDoc>\n' +
|
|
134
|
+
' <HyperlinksChanged>false</HyperlinksChanged>\n' +
|
|
135
|
+
' <AppVersion>16.0300</AppVersion>\n' +
|
|
136
|
+
'</Properties>');
|
|
137
|
+
}
|
|
138
|
+
generateCoreXml(name) {
|
|
139
|
+
const now = new Date().toISOString();
|
|
140
|
+
return ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n' +
|
|
141
|
+
'<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n' +
|
|
142
|
+
` <dc:creator>${name}</dc:creator>\n` +
|
|
143
|
+
` <cp:lastModifiedBy>${name}</cp:lastModifiedBy>\n` +
|
|
144
|
+
` <dcterms:created xsi:type="dcterms:W3CDTF">${now}</dcterms:created>\n` +
|
|
145
|
+
` <dcterms:modified xsi:type="dcterms:W3CDTF">${now}</dcterms:modified>\n` +
|
|
146
|
+
'</cp:coreProperties>');
|
|
147
|
+
}
|
|
148
|
+
generateColsXml(headers) {
|
|
149
|
+
return headers
|
|
150
|
+
.map((header, index) => {
|
|
151
|
+
const width = this.columnWidths[header] || this.defaultWidth;
|
|
152
|
+
return `<col min="${index + 1}" max="${index + 1}" width="${width}" customWidth="1"/>`;
|
|
153
|
+
})
|
|
154
|
+
.join('');
|
|
155
|
+
}
|
|
156
|
+
generateRowsXml(data) {
|
|
157
|
+
return data
|
|
158
|
+
.map(row => `<row>${row
|
|
159
|
+
.map(cell => {
|
|
160
|
+
if (isNil(cell) || isEmpty(cell)) {
|
|
161
|
+
return `<c t="inlineStr"><is><t></t></is></c>`; // String cell
|
|
162
|
+
}
|
|
163
|
+
else if (isNumber(Number(cell)) && !isNaN(Number(cell))) {
|
|
164
|
+
return `<c t="n"><v>${Number(cell)}</v></c>`; // Number cell
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
return `<c t="inlineStr"><is><t>${XmlUtils.escapeXml(cell)}</t></is></c>`; // String cell
|
|
168
|
+
}
|
|
169
|
+
})
|
|
170
|
+
.join('')}</row>`)
|
|
171
|
+
.join('');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
class ZipFileCreator {
|
|
175
|
+
async createZipFile(contents, compressionType, compressionLevel) {
|
|
176
|
+
const zip = new JSZip();
|
|
177
|
+
const blob = 'blob';
|
|
178
|
+
contents.forEach((content, filename) => {
|
|
179
|
+
zip.file(filename, content);
|
|
180
|
+
});
|
|
181
|
+
const options = { type: blob };
|
|
182
|
+
if (compressionType !== FILE_COMPRESSION_TYPES_VALUES.store) {
|
|
183
|
+
options.compression = compressionType;
|
|
184
|
+
options.compressionOptions = { level: compressionLevel };
|
|
185
|
+
}
|
|
186
|
+
return (await zip.generateAsync(options));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
class ExcelGenerator {
|
|
190
|
+
static getLabel() {
|
|
191
|
+
return gettext('Microsoft Excel');
|
|
192
|
+
}
|
|
193
|
+
static getTitle() {
|
|
194
|
+
return 'Excel';
|
|
195
|
+
}
|
|
196
|
+
static getType() {
|
|
197
|
+
return 'excel';
|
|
198
|
+
}
|
|
199
|
+
static getIcon() {
|
|
200
|
+
return 'excel';
|
|
201
|
+
}
|
|
202
|
+
static getFileExtension() {
|
|
203
|
+
return 'xlsx';
|
|
204
|
+
}
|
|
205
|
+
static getAcceptType() {
|
|
206
|
+
return 'application/vnd.ms-excel';
|
|
207
|
+
}
|
|
208
|
+
static getMimeType() {
|
|
209
|
+
return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
|
|
210
|
+
}
|
|
211
|
+
static getZipName() {
|
|
212
|
+
return 'export_excel.zip';
|
|
213
|
+
}
|
|
214
|
+
static async convertToMergedExcel(exportData, mergedExportDetails) {
|
|
215
|
+
const instance = ExcelGenerator.getInstance();
|
|
216
|
+
const { timeSeries, uniqueColumnIdentifiers } = instance.dataTransformer.transformToMergedFormat(exportData);
|
|
217
|
+
const rows = [
|
|
218
|
+
instance.createMergedFileHeaderRow(uniqueColumnIdentifiers, mergedExportDetails),
|
|
219
|
+
...instance.createMergedFileDataRows(timeSeries, uniqueColumnIdentifiers)
|
|
220
|
+
];
|
|
221
|
+
return instance.createExcelFile(rows, mergedExportDetails);
|
|
222
|
+
}
|
|
223
|
+
static getInstance() {
|
|
224
|
+
if (!ExcelGenerator.instance) {
|
|
225
|
+
ExcelGenerator.instance = new ExcelGenerator();
|
|
226
|
+
}
|
|
227
|
+
return ExcelGenerator.instance;
|
|
228
|
+
}
|
|
229
|
+
constructor() {
|
|
230
|
+
this.dataTransformer = new ExcelDataTransformer();
|
|
231
|
+
this.xmlGenerator = new ExcelXmlGenerator();
|
|
232
|
+
this.fileCreator = new ZipFileCreator();
|
|
233
|
+
}
|
|
234
|
+
async createExcelFile(data, details) {
|
|
235
|
+
const contents = new Map([
|
|
236
|
+
['[Content_Types].xml', this.xmlGenerator.CONTENT_TYPES_XML],
|
|
237
|
+
['_rels/.rels', this.xmlGenerator.RELS_XML],
|
|
238
|
+
[
|
|
239
|
+
'xl/workbook.xml',
|
|
240
|
+
this.xmlGenerator.generateWorkbookXml(details?.aggregation ? details?.aggregation : 'NO AGGREGATION')
|
|
241
|
+
],
|
|
242
|
+
['xl/worksheets/sheet1.xml', this.xmlGenerator.generateSheetXml(data)],
|
|
243
|
+
['xl/sharedStrings.xml', this.xmlGenerator.SHARED_STRINGS_XML],
|
|
244
|
+
['docProps/app.xml', this.xmlGenerator.generateAppXml('Custom Script')],
|
|
245
|
+
['docProps/core.xml', this.xmlGenerator.generateCoreXml('Custom Script')],
|
|
246
|
+
['xl/_rels/workbook.xml.rels', this.xmlGenerator.WORKBOOK_RELS_XML]
|
|
247
|
+
]);
|
|
248
|
+
return this.fileCreator.createZipFile(contents, FILE_COMPRESSION_TYPES_VALUES.deflate, 9);
|
|
249
|
+
}
|
|
250
|
+
createMergedFileHeaderRow(uniqueColumnIdentifiers, details) {
|
|
251
|
+
const time = details ? `time => from ${details.dateFrom} to ${details.dateTo}` : 'time';
|
|
252
|
+
return [time, ...uniqueColumnIdentifiers];
|
|
253
|
+
}
|
|
254
|
+
createMergedFileDataRows(timeSeries, uniqueColumnIdentifiers) {
|
|
255
|
+
return Array.from(timeSeries.entries())
|
|
256
|
+
.filter(([time, values]) => this.isValidEntry(time, values))
|
|
257
|
+
.map(([time, values]) => this.createDataRow(time, values, uniqueColumnIdentifiers));
|
|
258
|
+
}
|
|
259
|
+
isValidEntry(time, values) {
|
|
260
|
+
return (time !== null && Object.values(values).some(value => value !== null && value !== undefined));
|
|
261
|
+
}
|
|
262
|
+
createDataRow(time, values, uniqueColumnIdentifiers) {
|
|
263
|
+
const row = [time];
|
|
264
|
+
uniqueColumnIdentifiers.forEach(key => {
|
|
265
|
+
const value = values[key];
|
|
266
|
+
row.push(value !== undefined && value !== null ? value.toString() : '');
|
|
267
|
+
});
|
|
268
|
+
return row;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
export const ExcelGeneratorAdapter = {
|
|
272
|
+
getLabel: ExcelGenerator.getLabel.bind(ExcelGenerator),
|
|
273
|
+
getIcon: ExcelGenerator.getIcon.bind(ExcelGenerator),
|
|
274
|
+
getFileExtension: ExcelGenerator.getFileExtension.bind(ExcelGenerator),
|
|
275
|
+
getMimeType: ExcelGenerator.getMimeType.bind(ExcelGenerator),
|
|
276
|
+
generateMerged: ExcelGenerator.convertToMergedExcel.bind(ExcelGenerator),
|
|
277
|
+
getType: ExcelGenerator.getType.bind(ExcelGenerator),
|
|
278
|
+
getTitle: ExcelGenerator.getTitle.bind(ExcelGenerator),
|
|
279
|
+
getZipName: ExcelGenerator.getZipName.bind(ExcelGenerator),
|
|
280
|
+
getAcceptType: ExcelGenerator.getAcceptType.bind(ExcelGenerator)
|
|
281
|
+
};
|
|
282
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItbW9kYWwvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci9nZW5lcmF0b3JzL2V4Y2VsLWdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBRUwsNkJBQTZCLEVBTTlCLE1BQU0sMkNBQTJDLENBQUM7QUFxQm5ELG9CQUFvQjtBQUNwQixNQUFNLFFBQVE7SUFDWixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQWM7UUFDN0IsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNwQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNWLEtBQUssR0FBRztvQkFDTixPQUFPLE1BQU0sQ0FBQztnQkFDaEIsS0FBSyxHQUFHO29CQUNOLE9BQU8sTUFBTSxDQUFDO2dCQUNoQixLQUFLLEdBQUc7b0JBQ04sT0FBTyxPQUFPLENBQUM7Z0JBQ2pCLEtBQUssR0FBRztvQkFDTixPQUFPLFFBQVEsQ0FBQztnQkFDbEIsS0FBSyxHQUFHO29CQUNOLE9BQU8sUUFBUSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxvQkFBb0I7SUFDL0IsdUJBQXVCLENBQUMsVUFBd0I7UUFDOUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7UUFDN0QsTUFBTSx1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LE1BQU0scUJBQXFCLEdBQWtCO0lBQ2xELFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDdEQsT0FBTyxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUNwRCxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUN0RSxXQUFXLEVBQUUsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzVELGNBQWMsRUFBRSxjQUFjLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUN4RSxPQUFPLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ3BELFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDdEQsVUFBVSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMxRCxhQUFhLEVBQUUsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0NBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgSlNaaXAgZnJvbSAnanN6aXAnO1xuaW1wb3J0IHsgaXNFbXB0eSwgaXNOaWwsIGlzTnVtYmVyIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIEV4cG9ydERhdGEsXG4gIEZJTEVfQ09NUFJFU1NJT05fVFlQRVNfVkFMVUVTLFxuICBGaWxlQ29tcHJlc3Npb25UeXBlcyxcbiAgRmlsZUdlbmVyYXRvcixcbiAgSURhdGFUcmFuc2Zvcm1lcixcbiAgTWVyZ2VkRXhwb3J0RGV0YWlscyxcbiAgVGltZVNlcmllc0NvbHVtbkRhdGFcbn0gZnJvbSAnLi4vLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IubW9kZWwnO1xuXG5pbnRlcmZhY2UgSVhtbEdlbmVyYXRvciB7XG4gIFJFTFNfWE1MOiBzdHJpbmc7XG4gIENPTlRFTlRfVFlQRVNfWE1MOiBzdHJpbmc7XG4gIFdPUktCT09LX1JFTFNfWE1MOiBzdHJpbmc7XG4gIFNIQVJFRF9TVFJJTkdTX1hNTDogc3RyaW5nO1xuICBnZW5lcmF0ZVdvcmtib29rWG1sKHNoZWV0TmFtZT86IHN0cmluZyk6IHN0cmluZztcbiAgZ2VuZXJhdGVTaGVldFhtbChkYXRhOiBzdHJpbmdbXVtdKTogc3RyaW5nO1xuICBnZW5lcmF0ZUFwcFhtbChuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdlbmVyYXRlQ29yZVhtbChuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJWG1sRmlsZUNyZWF0b3Ige1xuICBjcmVhdGVaaXBGaWxlKFxuICAgIGNvbnRlbnRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICAgIGNvbXByZXNzaW9uVHlwZTogRmlsZUNvbXByZXNzaW9uVHlwZXMsXG4gICAgY29tcHJlc3Npb25MZXZlbDogbnVtYmVyXG4gICk6IFByb21pc2U8QmxvYj47XG59XG5cbi8vIFV0aWxpdHkgZnVuY3Rpb25zXG5jbGFzcyBYbWxVdGlscyB7XG4gIHN0YXRpYyBlc2NhcGVYbWwodW5zYWZlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1bnNhZmUucmVwbGFjZSgvWzw+JidcIl0vZywgYyA9PiB7XG4gICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgcmV0dXJuICcmbHQ7JztcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgcmV0dXJuICcmZ3Q7JztcbiAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgcmV0dXJuICcmYW1wOyc7XG4gICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgcmV0dXJuICcmYXBvczsnO1xuICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgcmV0dXJuICcmcXVvdDsnO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGNlbERhdGFUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIElEYXRhVHJhbnNmb3JtZXIge1xuICB0cmFuc2Zvcm1Ub01lcmdlZEZvcm1hdChleHBvcnREYXRhOiBFeHBvcnREYXRhW10pOiBUaW1lU2VyaWVzQ29sdW1uRGF0YSB7XG4gICAgY29uc3QgdGltZVNlcmllcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PigpO1xuICAgIGNvbnN0IHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBleHBvcnREYXRhLmZvckVhY2goXG4gICAgICAoeyB0aW1lLCBkZXZpY2VfbmFtZSwgZnJhZ21lbnRfc2VyaWVzLCB1bml0LCB2YWx1ZV9taW4sIHZhbHVlX21heCwgc291cmNlIH0pID0+IHtcbiAgICAgICAgY29uc3QgbWVhc3VyZW1lbnRJZGVudGlmaWVyID0gdGhpcy5jcmVhdGVNZWFzdXJlbWVudElkZW50aWZpZXIoXG4gICAgICAgICAgZGV2aWNlX25hbWUsXG4gICAgICAgICAgZnJhZ21lbnRfc2VyaWVzLFxuICAgICAgICAgIHVuaXQsXG4gICAgICAgICAgc291cmNlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aW1lU2VyaWVzLmhhcyh0aW1lKSkge1xuICAgICAgICAgIHRpbWVTZXJpZXMuc2V0KHRpbWUsIHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVFbnRyeSA9IHRpbWVTZXJpZXMuZ2V0KHRpbWUpO1xuICAgICAgICBpZiAodGltZUVudHJ5KSB7XG4gICAgICAgICAgY29uc3QgbWluS2V5ID0gdGhpcy5mb3JtYXRNaW5LZXkobWVhc3VyZW1lbnRJZGVudGlmaWVyKTtcbiAgICAgICAgICBjb25zdCBtYXhLZXkgPSB0aGlzLmZvcm1hdE1heEtleShtZWFzdXJlbWVudElkZW50aWZpZXIpO1xuXG4gICAgICAgICAgdGltZUVudHJ5W21pbktleV0gPSB2YWx1ZV9taW47XG4gICAgICAgICAgdGltZUVudHJ5W21heEtleV0gPSB2YWx1ZV9tYXg7XG5cbiAgICAgICAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVycy5hZGQobWluS2V5KTtcbiAgICAgICAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVycy5hZGQobWF4S2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGltZVNlcmllcyxcbiAgICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzOiBBcnJheS5mcm9tKHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVtZW50SWRlbnRpZmllcihcbiAgICBkZXZpY2VOYW1lOiBzdHJpbmcsXG4gICAgZnJhZ21lbnRTZXJpZXM6IHN0cmluZyxcbiAgICB1bml0OiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdW5pdFxuICAgICAgPyBgKCR7c291cmNlfSkgJHtkZXZpY2VOYW1lfSAtPiAke2ZyYWdtZW50U2VyaWVzfSBbJHt1bml0fV1gXG4gICAgICA6IGAoJHtzb3VyY2V9KSAke2RldmljZU5hbWV9IC0+ICR7ZnJhZ21lbnRTZXJpZXN9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TWluS2V5KGJhc2VLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Jhc2VLZXl9IChtaW4pYDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TWF4S2V5KGJhc2VLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Jhc2VLZXl9IChtYXgpYDtcbiAgfVxufVxuXG5jbGFzcyBFeGNlbFhtbEdlbmVyYXRvciBpbXBsZW1lbnRzIElYbWxHZW5lcmF0b3Ige1xuICBwcml2YXRlIGNvbHVtbldpZHRocyA9IHtcbiAgICB0aW1lOiAyNSxcbiAgICBzb3VyY2U6IDEwLFxuICAgIGRldmljZV9uYW1lOiAyMCxcbiAgICAnZnJhZ21lbnQuc2VyaWVzJzogMjAsXG4gICAgdmFsdWVfbWluOiAxNSxcbiAgICB2YWx1ZV9tYXg6IDE1LFxuICAgIHVuaXQ6IDVcbiAgfTtcbiAgcHJpdmF0ZSBkZWZhdWx0V2lkdGggPSAzMDtcblxuICByZWFkb25seSBSRUxTX1hNTCA9XG4gICAgJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz5cXG4nICtcbiAgICAnPFJlbGF0aW9uc2hpcHMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHNcIj5cXG4nICtcbiAgICAnICA8UmVsYXRpb25zaGlwIElkPVwicklkMVwiIFRhcmdldD1cInhsL3dvcmtib29rLnhtbFwiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL29mZmljZURvY3VtZW50XCIvPlxcbicgK1xuICAgICcgIDxSZWxhdGlvbnNoaXAgSWQ9XCJySWQyXCIgVGFyZ2V0PVwiZG9jUHJvcHMvYXBwLnhtbFwiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2V4dGVuZGVkLXByb3BlcnRpZXNcIi8+XFxuJyArXG4gICAgJyAgPFJlbGF0aW9uc2hpcCBJZD1cInJJZDNcIiBUYXJnZXQ9XCJkb2NQcm9wcy9jb3JlLnhtbFwiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMvbWV0YWRhdGEvY29yZS1wcm9wZXJ0aWVzXCIvPlxcbicgK1xuICAgICc8L1JlbGF0aW9uc2hpcHM+JztcblxuICByZWFkb25seSBDT05URU5UX1RZUEVTX1hNTCA9XG4gICAgJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cIm5vXCI/PlxcbicgK1xuICAgICc8VHlwZXMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L2NvbnRlbnQtdHlwZXNcIj5cXG4nICtcbiAgICAnICA8RGVmYXVsdCBDb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1wYWNrYWdlLnJlbGF0aW9uc2hpcHMreG1sXCIgRXh0ZW5zaW9uPVwicmVsc1wiLz5cXG4nICtcbiAgICAnICA8RGVmYXVsdCBDb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3htbFwiIEV4dGVuc2lvbj1cInhtbFwiLz5cXG4nICtcbiAgICAnICA8T3ZlcnJpZGUgQ29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZXh0ZW5kZWQtcHJvcGVydGllcyt4bWxcIiBQYXJ0TmFtZT1cIi9kb2NQcm9wcy9hcHAueG1sXCIvPlxcbicgK1xuICAgICcgIDxPdmVycmlkZSBDb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1wYWNrYWdlLmNvcmUtcHJvcGVydGllcyt4bWxcIiBQYXJ0TmFtZT1cIi9kb2NQcm9wcy9jb3JlLnhtbFwiLz5cXG4nICtcbiAgICAnICA8T3ZlcnJpZGUgQ29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGFyZWRTdHJpbmdzK3htbFwiIFBhcnROYW1lPVwiL3hsL3NoYXJlZFN0cmluZ3MueG1sXCIvPlxcbicgK1xuICAgICcgIDxPdmVycmlkZSBDb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Lm1haW4reG1sXCIgUGFydE5hbWU9XCIveGwvd29ya2Jvb2sueG1sXCIvPlxcbicgK1xuICAgICcgIDxPdmVycmlkZSBDb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLndvcmtzaGVldCt4bWxcIiBQYXJ0TmFtZT1cIi94bC93b3Jrc2hlZXRzL3NoZWV0MS54bWxcIi8+XFxuJyArXG4gICAgJzwvVHlwZXM+JztcblxuICByZWFkb25seSBXT1JLQk9PS19SRUxTX1hNTCA9XG4gICAgJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz5cXG4nICtcbiAgICAnPFJlbGF0aW9uc2hpcHMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHNcIj5cXG4nICtcbiAgICAnICA8UmVsYXRpb25zaGlwIElkPVwicklkMVwiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3NoYXJlZFN0cmluZ3NcIiBUYXJnZXQ9XCJzaGFyZWRTdHJpbmdzLnhtbFwiLz5cXG4nICtcbiAgICAnICA8UmVsYXRpb25zaGlwIElkPVwicklkM1wiIFR5cGU9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3dvcmtzaGVldFwiIFRhcmdldD1cIndvcmtzaGVldHMvc2hlZXQxLnhtbFwiLz5cXG4nICtcbiAgICAnPC9SZWxhdGlvbnNoaXBzPic7XG5cbiAgcmVhZG9ubHkgU0hBUkVEX1NUUklOR1NfWE1MID1cbiAgICAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XFxuJyArXG4gICAgJzxzc3QgY291bnQ9XCIwXCIgdW5pcXVlQ291bnQ9XCIwXCIgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW5cIi8+JztcblxuICBnZW5lcmF0ZVdvcmtib29rWG1sKHNoZWV0TmFtZSA9ICdNZWFzdXJlbWVudHMnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz5cXG4nICtcbiAgICAgIGA8d29ya2Jvb2sgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW5cIiB4bWxuczpyPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwc1wiPjxzaGVldHM+PHNoZWV0IG5hbWU9JyR7c2hlZXROYW1lfScgcjppZD1cInJJZDNcIiBzaGVldElkPVwiMVwiLz48L3NoZWV0cz48L3dvcmtib29rPmBcbiAgICApO1xuICB9XG5cbiAgZ2VuZXJhdGVTaGVldFhtbChkYXRhOiBzdHJpbmdbXVtdKTogc3RyaW5nIHtcbiAgICBjb25zdCBoZWFkZXJzID0gZGF0YVswXTtcbiAgICBjb25zdCBjb2xzWG1sID0gdGhpcy5nZW5lcmF0ZUNvbHNYbWwoaGVhZGVycyk7XG4gICAgY29uc3Qgcm93c1htbCA9IHRoaXMuZ2VuZXJhdGVSb3dzWG1sKGRhdGEpO1xuXG4gICAgcmV0dXJuIGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIj8+XG4gICAgICA8d29ya3NoZWV0IHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgeG1sbnM6cj1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHNcIj5cbiAgICAgICAgPGNvbHM+JHtjb2xzWG1sfTwvY29scz5cbiAgICAgICAgPHNoZWV0RGF0YT4ke3Jvd3NYbWx9PC9zaGVldERhdGE+XG4gICAgICA8L3dvcmtzaGVldD5gO1xuICB9XG5cbiAgZ2VuZXJhdGVBcHBYbWwobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz5cXG4nICtcbiAgICAgICc8UHJvcGVydGllcyB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2V4dGVuZGVkLXByb3BlcnRpZXNcIiB4bWxuczp2dD1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2RvY1Byb3BzVlR5cGVzXCI+XFxuJyArXG4gICAgICBgICA8QXBwbGljYXRpb24+JHtuYW1lfTwvQXBwbGljYXRpb24+XFxuYCArXG4gICAgICAnICA8RG9jU2VjdXJpdHk+MDwvRG9jU2VjdXJpdHk+XFxuJyArXG4gICAgICAnICA8U2NhbGVDcm9wPmZhbHNlPC9TY2FsZUNyb3A+XFxuJyArXG4gICAgICAnICA8SGVhZGluZ1BhaXJzPlxcbicgK1xuICAgICAgJyAgICA8dnQ6dmVjdG9yIHNpemU9XCIyXCIgYmFzZVR5cGU9XCJ2YXJpYW50XCI+XFxuJyArXG4gICAgICAnICAgICAgPHZ0OnZhcmlhbnQ+XFxuJyArXG4gICAgICAnICAgICAgICA8dnQ6bHBzdHI+V29ya3NoZWV0czwvdnQ6bHBzdHI+XFxuJyArXG4gICAgICAnICAgICAgPC92dDp2YXJpYW50PlxcbicgK1xuICAgICAgJyAgICAgIDx2dDp2YXJpYW50PlxcbicgK1xuICAgICAgJyAgICAgICAgPHZ0Omk0PjE8L3Z0Omk0PlxcbicgK1xuICAgICAgJyAgICAgIDwvdnQ6dmFyaWFudD5cXG4nICtcbiAgICAgICcgICAgPC92dDp2ZWN0b3I+XFxuJyArXG4gICAgICAnICA8L0hlYWRpbmdQYWlycz5cXG4nICtcbiAgICAgICcgIDxUaXRsZXNPZlBhcnRzPlxcbicgK1xuICAgICAgJyAgICA8dnQ6dmVjdG9yIHNpemU9XCIxXCIgYmFzZVR5cGU9XCJscHN0clwiPlxcbicgK1xuICAgICAgJyAgICAgIDx2dDpscHN0cj5TaGVldDE8L3Z0Omxwc3RyPlxcbicgK1xuICAgICAgJyAgICA8L3Z0OnZlY3Rvcj5cXG4nICtcbiAgICAgICcgIDwvVGl0bGVzT2ZQYXJ0cz5cXG4nICtcbiAgICAgICcgIDxDb21wYW55PjwvQ29tcGFueT5cXG4nICtcbiAgICAgICcgIDxMaW5rc1VwVG9EYXRlPmZhbHNlPC9MaW5rc1VwVG9EYXRlPlxcbicgK1xuICAgICAgJyAgPFNoYXJlZERvYz5mYWxzZTwvU2hhcmVkRG9jPlxcbicgK1xuICAgICAgJyAgPEh5cGVybGlua3NDaGFuZ2VkPmZhbHNlPC9IeXBlcmxpbmtzQ2hhbmdlZD5cXG4nICtcbiAgICAgICcgIDxBcHBWZXJzaW9uPjE2LjAzMDA8L0FwcFZlcnNpb24+XFxuJyArXG4gICAgICAnPC9Qcm9wZXJ0aWVzPidcbiAgICApO1xuICB9XG5cbiAgZ2VuZXJhdGVDb3JlWG1sKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIHJldHVybiAoXG4gICAgICAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/PlxcbicgK1xuICAgICAgJzxjcDpjb3JlUHJvcGVydGllcyB4bWxuczpjcD1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvbWV0YWRhdGEvY29yZS1wcm9wZXJ0aWVzXCIgeG1sbnM6ZGM9XCJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL1wiIHhtbG5zOmRjdGVybXM9XCJodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvXCIgeG1sbnM6ZGNtaXR5cGU9XCJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIj5cXG4nICtcbiAgICAgIGAgIDxkYzpjcmVhdG9yPiR7bmFtZX08L2RjOmNyZWF0b3I+XFxuYCArXG4gICAgICBgICA8Y3A6bGFzdE1vZGlmaWVkQnk+JHtuYW1lfTwvY3A6bGFzdE1vZGlmaWVkQnk+XFxuYCArXG4gICAgICBgICA8ZGN0ZXJtczpjcmVhdGVkIHhzaTp0eXBlPVwiZGN0ZXJtczpXM0NEVEZcIj4ke25vd308L2RjdGVybXM6Y3JlYXRlZD5cXG5gICtcbiAgICAgIGAgIDxkY3Rlcm1zOm1vZGlmaWVkIHhzaTp0eXBlPVwiZGN0ZXJtczpXM0NEVEZcIj4ke25vd308L2RjdGVybXM6bW9kaWZpZWQ+XFxuYCArXG4gICAgICAnPC9jcDpjb3JlUHJvcGVydGllcz4nXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVDb2xzWG1sKGhlYWRlcnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaGVhZGVyc1xuICAgICAgLm1hcCgoaGVhZGVyLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuY29sdW1uV2lkdGhzW2hlYWRlcl0gfHwgdGhpcy5kZWZhdWx0V2lkdGg7XG4gICAgICAgIHJldHVybiBgPGNvbCBtaW49XCIke2luZGV4ICsgMX1cIiBtYXg9XCIke2luZGV4ICsgMX1cIiB3aWR0aD1cIiR7d2lkdGh9XCIgY3VzdG9tV2lkdGg9XCIxXCIvPmA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVJvd3NYbWwoZGF0YTogc3RyaW5nW11bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGFcbiAgICAgIC5tYXAoXG4gICAgICAgIHJvdyA9PlxuICAgICAgICAgIGA8cm93PiR7cm93XG4gICAgICAgICAgICAubWFwKGNlbGwgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXNOaWwoY2VsbCkgfHwgaXNFbXB0eShjZWxsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgPGMgdD1cImlubGluZVN0clwiPjxpcz48dD48L3Q+PC9pcz48L2M+YDsgLy8gU3RyaW5nIGNlbGxcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihOdW1iZXIoY2VsbCkpICYmICFpc05hTihOdW1iZXIoY2VsbCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGA8YyB0PVwiblwiPjx2PiR7TnVtYmVyKGNlbGwpfTwvdj48L2M+YDsgLy8gTnVtYmVyIGNlbGxcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYDxjIHQ9XCJpbmxpbmVTdHJcIj48aXM+PHQ+JHtYbWxVdGlscy5lc2NhcGVYbWwoY2VsbCl9PC90PjwvaXM+PC9jPmA7IC8vIFN0cmluZyBjZWxsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignJyl9PC9yb3c+YFxuICAgICAgKVxuICAgICAgLmpvaW4oJycpO1xuICB9XG59XG5cbmNsYXNzIFppcEZpbGVDcmVhdG9yIGltcGxlbWVudHMgSVhtbEZpbGVDcmVhdG9yIHtcbiAgYXN5bmMgY3JlYXRlWmlwRmlsZShcbiAgICBjb250ZW50czogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgICBjb21wcmVzc2lvblR5cGU6IEZpbGVDb21wcmVzc2lvblR5cGVzLFxuICAgIGNvbXByZXNzaW9uTGV2ZWw6IG51bWJlclxuICApOiBQcm9taXNlPEJsb2I+IHtcbiAgICBjb25zdCB6aXAgPSBuZXcgSlNaaXAoKTtcbiAgICBjb25zdCBibG9iID0gJ2Jsb2InO1xuXG4gICAgY29udGVudHMuZm9yRWFjaCgoY29udGVudCwgZmlsZW5hbWUpID0+IHtcbiAgICAgIHppcC5maWxlKGZpbGVuYW1lLCBjb250ZW50KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEpTWmlwLkpTWmlwR2VuZXJhdG9yT3B0aW9ucyA9IHsgdHlwZTogYmxvYiB9O1xuICAgIGlmIChjb21wcmVzc2lvblR5cGUgIT09IEZJTEVfQ09NUFJFU1NJT05fVFlQRVNfVkFMVUVTLnN0b3JlKSB7XG4gICAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gY29tcHJlc3Npb25UeXBlO1xuICAgICAgb3B0aW9ucy5jb21wcmVzc2lvbk9wdGlvbnMgPSB7IGxldmVsOiBjb21wcmVzc2lvbkxldmVsIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIChhd2FpdCB6aXAuZ2VuZXJhdGVBc3luYyhvcHRpb25zKSkgYXMgQmxvYjtcbiAgfVxufVxuXG5jbGFzcyBFeGNlbEdlbmVyYXRvciB7XG4gIHN0YXRpYyBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXR0ZXh0KCdNaWNyb3NvZnQgRXhjZWwnKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnRXhjZWwnO1xuICB9XG5cbiAgc3RhdGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2V4Y2VsJztcbiAgfVxuXG4gIHN0YXRpYyBnZXRJY29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdleGNlbCc7XG4gIH1cblxuICBzdGF0aWMgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAneGxzeCc7XG4gIH1cblxuICBzdGF0aWMgZ2V0QWNjZXB0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJztcbiAgfVxuXG4gIHN0YXRpYyBnZXRNaW1lVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnO1xuICB9XG5cbiAgc3RhdGljIGdldFppcE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2V4cG9ydF9leGNlbC56aXAnO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNvbnZlcnRUb01lcmdlZEV4Y2VsKFxuICAgIGV4cG9ydERhdGE6IEV4cG9ydERhdGFbXSxcbiAgICBtZXJnZWRFeHBvcnREZXRhaWxzOiBNZXJnZWRFeHBvcnREZXRhaWxzXG4gICk6IFByb21pc2U8QmxvYj4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gRXhjZWxHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTtcbiAgICBjb25zdCB7IHRpbWVTZXJpZXMsIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzIH0gPVxuICAgICAgaW5zdGFuY2UuZGF0YVRyYW5zZm9ybWVyLnRyYW5zZm9ybVRvTWVyZ2VkRm9ybWF0KGV4cG9ydERhdGEpO1xuXG4gICAgY29uc3Qgcm93cyA9IFtcbiAgICAgIGluc3RhbmNlLmNyZWF0ZU1lcmdlZEZpbGVIZWFkZXJSb3codW5pcXVlQ29sdW1uSWRlbnRpZmllcnMsIG1lcmdlZEV4cG9ydERldGFpbHMpLFxuICAgICAgLi4uaW5zdGFuY2UuY3JlYXRlTWVyZ2VkRmlsZURhdGFSb3dzKHRpbWVTZXJpZXMsIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzKVxuICAgIF07XG5cbiAgICByZXR1cm4gaW5zdGFuY2UuY3JlYXRlRXhjZWxGaWxlKHJvd3MsIG1lcmdlZEV4cG9ydERldGFpbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRXhjZWxHZW5lcmF0b3Ige1xuICAgIGlmICghRXhjZWxHZW5lcmF0b3IuaW5zdGFuY2UpIHtcbiAgICAgIEV4Y2VsR2VuZXJhdG9yLmluc3RhbmNlID0gbmV3IEV4Y2VsR2VuZXJhdG9yKCk7XG4gICAgfVxuICAgIHJldHVybiBFeGNlbEdlbmVyYXRvci5pbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBFeGNlbEdlbmVyYXRvcjtcbiAgcHJpdmF0ZSBkYXRhVHJhbnNmb3JtZXI6IElEYXRhVHJhbnNmb3JtZXI7XG4gIHByaXZhdGUgeG1sR2VuZXJhdG9yOiBJWG1sR2VuZXJhdG9yO1xuICBwcml2YXRlIGZpbGVDcmVhdG9yOiBJWG1sRmlsZUNyZWF0b3I7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zvcm1lciA9IG5ldyBFeGNlbERhdGFUcmFuc2Zvcm1lcigpO1xuICAgIHRoaXMueG1sR2VuZXJhdG9yID0gbmV3IEV4Y2VsWG1sR2VuZXJhdG9yKCk7XG4gICAgdGhpcy5maWxlQ3JlYXRvciA9IG5ldyBaaXBGaWxlQ3JlYXRvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVFeGNlbEZpbGUoZGF0YTogc3RyaW5nW11bXSwgZGV0YWlscz86IE1lcmdlZEV4cG9ydERldGFpbHMpOiBQcm9taXNlPEJsb2I+IHtcbiAgICBjb25zdCBjb250ZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtcbiAgICAgIFsnW0NvbnRlbnRfVHlwZXNdLnhtbCcsIHRoaXMueG1sR2VuZXJhdG9yLkNPTlRFTlRfVFlQRVNfWE1MXSxcbiAgICAgIFsnX3JlbHMvLnJlbHMnLCB0aGlzLnhtbEdlbmVyYXRvci5SRUxTX1hNTF0sXG4gICAgICBbXG4gICAgICAgICd4bC93b3JrYm9vay54bWwnLFxuICAgICAgICB0aGlzLnhtbEdlbmVyYXRvci5nZW5lcmF0ZVdvcmtib29rWG1sKFxuICAgICAgICAgIGRldGFpbHM/LmFnZ3JlZ2F0aW9uID8gZGV0YWlscz8uYWdncmVnYXRpb24gOiAnTk8gQUdHUkVHQVRJT04nXG4gICAgICAgIClcbiAgICAgIF0sXG4gICAgICBbJ3hsL3dvcmtzaGVldHMvc2hlZXQxLnhtbCcsIHRoaXMueG1sR2VuZXJhdG9yLmdlbmVyYXRlU2hlZXRYbWwoZGF0YSldLFxuICAgICAgWyd4bC9zaGFyZWRTdHJpbmdzLnhtbCcsIHRoaXMueG1sR2VuZXJhdG9yLlNIQVJFRF9TVFJJTkdTX1hNTF0sXG4gICAgICBbJ2RvY1Byb3BzL2FwcC54bWwnLCB0aGlzLnhtbEdlbmVyYXRvci5nZW5lcmF0ZUFwcFhtbCgnQ3VzdG9tIFNjcmlwdCcpXSxcbiAgICAgIFsnZG9jUHJvcHMvY29yZS54bWwnLCB0aGlzLnhtbEdlbmVyYXRvci5nZW5lcmF0ZUNvcmVYbWwoJ0N1c3RvbSBTY3JpcHQnKV0sXG4gICAgICBbJ3hsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzJywgdGhpcy54bWxHZW5lcmF0b3IuV09SS0JPT0tfUkVMU19YTUxdXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcy5maWxlQ3JlYXRvci5jcmVhdGVaaXBGaWxlKGNvbnRlbnRzLCBGSUxFX0NPTVBSRVNTSU9OX1RZUEVTX1ZBTFVFUy5kZWZsYXRlLCA5KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVyZ2VkRmlsZUhlYWRlclJvdyhcbiAgICB1bmlxdWVDb2x1bW5JZGVudGlmaWVyczogc3RyaW5nW10sXG4gICAgZGV0YWlscz86IE1lcmdlZEV4cG9ydERldGFpbHNcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRpbWUgPSBkZXRhaWxzID8gYHRpbWUgPT4gZnJvbSAke2RldGFpbHMuZGF0ZUZyb219IHRvICR7ZGV0YWlscy5kYXRlVG99YCA6ICd0aW1lJztcbiAgICByZXR1cm4gW3RpbWUsIC4uLnVuaXF1ZUNvbHVtbklkZW50aWZpZXJzXTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVyZ2VkRmlsZURhdGFSb3dzKFxuICAgIHRpbWVTZXJpZXM6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIG51bWJlcj4+LFxuICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzOiBzdHJpbmdbXVxuICApOiBzdHJpbmdbXVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aW1lU2VyaWVzLmVudHJpZXMoKSlcbiAgICAgIC5maWx0ZXIoKFt0aW1lLCB2YWx1ZXNdKSA9PiB0aGlzLmlzVmFsaWRFbnRyeSh0aW1lLCB2YWx1ZXMpKVxuICAgICAgLm1hcCgoW3RpbWUsIHZhbHVlc10pID0+IHRoaXMuY3JlYXRlRGF0YVJvdyh0aW1lLCB2YWx1ZXMsIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzKSk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRFbnRyeSh0aW1lOiBzdHJpbmcsIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aW1lICE9PSBudWxsICYmIE9iamVjdC52YWx1ZXModmFsdWVzKS5zb21lKHZhbHVlID0+IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGF0YVJvdyhcbiAgICB0aW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+LFxuICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzOiBzdHJpbmdbXVxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgcm93ID0gW3RpbWVdO1xuICAgIHVuaXF1ZUNvbHVtbklkZW50aWZpZXJzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2tleV07XG4gICAgICByb3cucHVzaCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6ICcnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcm93O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBFeGNlbEdlbmVyYXRvckFkYXB0ZXI6IEZpbGVHZW5lcmF0b3IgPSB7XG4gIGdldExhYmVsOiBFeGNlbEdlbmVyYXRvci5nZXRMYWJlbC5iaW5kKEV4Y2VsR2VuZXJhdG9yKSxcbiAgZ2V0SWNvbjogRXhjZWxHZW5lcmF0b3IuZ2V0SWNvbi5iaW5kKEV4Y2VsR2VuZXJhdG9yKSxcbiAgZ2V0RmlsZUV4dGVuc2lvbjogRXhjZWxHZW5lcmF0b3IuZ2V0RmlsZUV4dGVuc2lvbi5iaW5kKEV4Y2VsR2VuZXJhdG9yKSxcbiAgZ2V0TWltZVR5cGU6IEV4Y2VsR2VuZXJhdG9yLmdldE1pbWVUeXBlLmJpbmQoRXhjZWxHZW5lcmF0b3IpLFxuICBnZW5lcmF0ZU1lcmdlZDogRXhjZWxHZW5lcmF0b3IuY29udmVydFRvTWVyZ2VkRXhjZWwuYmluZChFeGNlbEdlbmVyYXRvciksXG4gIGdldFR5cGU6IEV4Y2VsR2VuZXJhdG9yLmdldFR5cGUuYmluZChFeGNlbEdlbmVyYXRvciksXG4gIGdldFRpdGxlOiBFeGNlbEdlbmVyYXRvci5nZXRUaXRsZS5iaW5kKEV4Y2VsR2VuZXJhdG9yKSxcbiAgZ2V0WmlwTmFtZTogRXhjZWxHZW5lcmF0b3IuZ2V0WmlwTmFtZS5iaW5kKEV4Y2VsR2VuZXJhdG9yKSxcbiAgZ2V0QWNjZXB0VHlwZTogRXhjZWxHZW5lcmF0b3IuZ2V0QWNjZXB0VHlwZS5iaW5kKEV4Y2VsR2VuZXJhdG9yKVxufTtcbiJdfQ==
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class UtilsService {
|
|
4
|
+
transformDataStructure(data) {
|
|
5
|
+
const result = {};
|
|
6
|
+
data.forEach(sourceItem => {
|
|
7
|
+
const { source: sourceId, data: sourceData } = sourceItem;
|
|
8
|
+
result[sourceId] = {};
|
|
9
|
+
sourceData.series.forEach((seriesInfo, index) => {
|
|
10
|
+
const { type, name, unit } = seriesInfo;
|
|
11
|
+
/**
|
|
12
|
+
* Unique key to distinguish between different series from same source,
|
|
13
|
+
* e.g.: c8y_Acceleration.accelerationX, c8y_Acceleration.accelerationY, c8y_Acceleration.accelerationZ
|
|
14
|
+
*/
|
|
15
|
+
const seriesKey = `${type}.${name}`;
|
|
16
|
+
result[sourceId][seriesKey] = {
|
|
17
|
+
values: {},
|
|
18
|
+
seriesDetails: { name, unit, type }
|
|
19
|
+
};
|
|
20
|
+
let hasValues = false;
|
|
21
|
+
Object.entries(sourceData.values).forEach(([timestamp, measurements]) => {
|
|
22
|
+
if (!measurements) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const measurement = measurements[index];
|
|
26
|
+
if (measurement !== null && measurement !== undefined) {
|
|
27
|
+
result[sourceId][seriesKey].values[timestamp] = measurement;
|
|
28
|
+
hasValues = true;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
if (!hasValues) {
|
|
32
|
+
result[sourceId][seriesKey].values = null;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Formats a date range into a specific string format, handling UTC dates correctly.
|
|
40
|
+
*
|
|
41
|
+
* @param fromDate - The start date in ISO format (e.g., "2023-12-04T12:40:00.000Z")
|
|
42
|
+
* @param toDate - The end date in ISO format (e.g., "2023-12-06T23:50:00.000Z")
|
|
43
|
+
* @returns A string representing the date range in the format "ddmmmyyhhmm-ddmmmyyhhmm"
|
|
44
|
+
* where d=day, m=month, y=year, h=hour, m=minute
|
|
45
|
+
*
|
|
46
|
+
* Example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const fromDate = "2023-12-04T12:40:00.000Z";
|
|
49
|
+
* const toDate = "2023-12-06T23:50:00.000Z";
|
|
50
|
+
* const formattedRange = getFormattedDateRange(fromDate, toDate);
|
|
51
|
+
* console.log(formattedRange); // Output: "04dec231240-06dec232350"
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
getFormattedDateRange(fromDate, toDate) {
|
|
55
|
+
const formatDate = (dateString) => {
|
|
56
|
+
const date = new Date(dateString);
|
|
57
|
+
if (isNaN(date.getTime())) {
|
|
58
|
+
throw new Error(`Invalid date string: ${dateString}`);
|
|
59
|
+
}
|
|
60
|
+
const day = date.getUTCDate().toString().padStart(2, '0');
|
|
61
|
+
const month = date.toLocaleString('en', { month: 'short', timeZone: 'UTC' }).toLowerCase();
|
|
62
|
+
const hours = date.getUTCHours().toString().padStart(2, '0');
|
|
63
|
+
const minutes = date.getUTCMinutes().toString().padStart(2, '0');
|
|
64
|
+
const seconds = date.getUTCSeconds().toString().padStart(2, '0');
|
|
65
|
+
return `${day}${month}${hours}${minutes}${seconds}`;
|
|
66
|
+
};
|
|
67
|
+
return `${formatDate(fromDate)}-${formatDate(toDate)}`;
|
|
68
|
+
}
|
|
69
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
70
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UtilsService, providedIn: 'root' }); }
|
|
71
|
+
}
|
|
72
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: UtilsService, decorators: [{
|
|
73
|
+
type: Injectable,
|
|
74
|
+
args: [{ providedIn: 'root' }]
|
|
75
|
+
}] });
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLW1vZGFsL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWZpbGUtZXhwb3J0ZXIvdXRpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQXFDM0MsTUFBTSxPQUFPLFlBQVk7SUFDdkIsc0JBQXNCLENBQUMsSUFBa0I7UUFDdkMsTUFBTSxNQUFNLEdBQW9CLEVBQUUsQ0FBQztRQUVuQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxVQUFVLENBQUM7WUFDMUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUV0QixVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDOUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDO2dCQUN4Qzs7O21CQUdHO2dCQUNILE1BQU0sU0FBUyxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUVwQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUc7b0JBQzVCLE1BQU0sRUFBRSxFQUFFO29CQUNWLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO2lCQUNwQyxDQUFDO2dCQUVGLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRTtvQkFDdEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUNsQixPQUFPO29CQUNULENBQUM7b0JBQ0QsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUV4QyxJQUFJLFdBQVcsS0FBSyxJQUFJLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUN0RCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFdBQVcsQ0FBQzt3QkFDNUQsU0FBUyxHQUFHLElBQUksQ0FBQztvQkFDbkIsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILHFCQUFxQixDQUFDLFFBQWdCLEVBQUUsTUFBYztRQUNwRCxNQUFNLFVBQVUsR0FBRyxDQUFDLFVBQWtCLEVBQVUsRUFBRTtZQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakUsT0FBTyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUN0RCxDQUFDLENBQUM7UUFFRixPQUFPLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ3pELENBQUM7OEdBMUVVLFlBQVk7a0hBQVosWUFBWSxjQURDLE1BQU07OzJGQUNuQixZQUFZO2tCQUR4QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgTWVhc3VyZW1lbnQgPSBudW1iZXIgfCB7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlciB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmllc0luZm8ge1xuICB1bml0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlRGF0YSB7XG4gIHNlcmllczogU2VyaWVzSW5mb1tdO1xuICB2YWx1ZXM6IHtcbiAgICBbdGltZXN0YW1wOiBzdHJpbmddOiAoTWVhc3VyZW1lbnQgfCBudWxsKVtdIHwgdW5kZWZpbmVkO1xuICB9O1xuICB0cnVuY2F0ZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlSXRlbSB7XG4gIHNvdXJjZTogc3RyaW5nIHwgbnVtYmVyO1xuICBkYXRhOiBTb3VyY2VEYXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybWVkU2VyaWVzIHtcbiAgdmFsdWVzOiB7IFt0aW1lc3RhbXA6IHN0cmluZ106IE1lYXN1cmVtZW50IH0gfCBudWxsO1xuICBzZXJpZXNEZXRhaWxzOiBTZXJpZXNJbmZvO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybWVkU291cmNlIHtcbiAgW3Nlcmllc1R5cGU6IHN0cmluZ106IFRyYW5zZm9ybWVkU2VyaWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybWVkRGF0YSB7XG4gIFtzb3VyY2VJZDogc3RyaW5nXTogVHJhbnNmb3JtZWRTb3VyY2U7XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgVXRpbHNTZXJ2aWNlIHtcbiAgdHJhbnNmb3JtRGF0YVN0cnVjdHVyZShkYXRhOiBTb3VyY2VJdGVtW10pOiBUcmFuc2Zvcm1lZERhdGEge1xuICAgIGNvbnN0IHJlc3VsdDogVHJhbnNmb3JtZWREYXRhID0ge307XG5cbiAgICBkYXRhLmZvckVhY2goc291cmNlSXRlbSA9PiB7XG4gICAgICBjb25zdCB7IHNvdXJjZTogc291cmNlSWQsIGRhdGE6IHNvdXJjZURhdGEgfSA9IHNvdXJjZUl0ZW07XG4gICAgICByZXN1bHRbc291cmNlSWRdID0ge307XG5cbiAgICAgIHNvdXJjZURhdGEuc2VyaWVzLmZvckVhY2goKHNlcmllc0luZm8sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgbmFtZSwgdW5pdCB9ID0gc2VyaWVzSW5mbztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVuaXF1ZSBrZXkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQgc2VyaWVzIGZyb20gc2FtZSBzb3VyY2UsXG4gICAgICAgICAqIGUuZy46IGM4eV9BY2NlbGVyYXRpb24uYWNjZWxlcmF0aW9uWCwgYzh5X0FjY2VsZXJhdGlvbi5hY2NlbGVyYXRpb25ZLCBjOHlfQWNjZWxlcmF0aW9uLmFjY2VsZXJhdGlvblpcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHNlcmllc0tleSA9IGAke3R5cGV9LiR7bmFtZX1gO1xuXG4gICAgICAgIHJlc3VsdFtzb3VyY2VJZF1bc2VyaWVzS2V5XSA9IHtcbiAgICAgICAgICB2YWx1ZXM6IHt9LFxuICAgICAgICAgIHNlcmllc0RldGFpbHM6IHsgbmFtZSwgdW5pdCwgdHlwZSB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGhhc1ZhbHVlcyA9IGZhbHNlO1xuICAgICAgICBPYmplY3QuZW50cmllcyhzb3VyY2VEYXRhLnZhbHVlcykuZm9yRWFjaCgoW3RpbWVzdGFtcCwgbWVhc3VyZW1lbnRzXSkgPT4ge1xuICAgICAgICAgIGlmICghbWVhc3VyZW1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG1lYXN1cmVtZW50ID0gbWVhc3VyZW1lbnRzW2luZGV4XTtcblxuICAgICAgICAgIGlmIChtZWFzdXJlbWVudCAhPT0gbnVsbCAmJiBtZWFzdXJlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHRbc291cmNlSWRdW3Nlcmllc0tleV0udmFsdWVzW3RpbWVzdGFtcF0gPSBtZWFzdXJlbWVudDtcbiAgICAgICAgICAgIGhhc1ZhbHVlcyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWhhc1ZhbHVlcykge1xuICAgICAgICAgIHJlc3VsdFtzb3VyY2VJZF1bc2VyaWVzS2V5XS52YWx1ZXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBhIGRhdGUgcmFuZ2UgaW50byBhIHNwZWNpZmljIHN0cmluZyBmb3JtYXQsIGhhbmRsaW5nIFVUQyBkYXRlcyBjb3JyZWN0bHkuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9tRGF0ZSAtIFRoZSBzdGFydCBkYXRlIGluIElTTyBmb3JtYXQgKGUuZy4sIFwiMjAyMy0xMi0wNFQxMjo0MDowMC4wMDBaXCIpXG4gICAqIEBwYXJhbSB0b0RhdGUgLSBUaGUgZW5kIGRhdGUgaW4gSVNPIGZvcm1hdCAoZS5nLiwgXCIyMDIzLTEyLTA2VDIzOjUwOjAwLjAwMFpcIilcbiAgICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRlIHJhbmdlIGluIHRoZSBmb3JtYXQgXCJkZG1tbXl5aGhtbS1kZG1tbXl5aGhtbVwiXG4gICAqICAgICAgICAgIHdoZXJlIGQ9ZGF5LCBtPW1vbnRoLCB5PXllYXIsIGg9aG91ciwgbT1taW51dGVcbiAgICpcbiAgICogRXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGZyb21EYXRlID0gXCIyMDIzLTEyLTA0VDEyOjQwOjAwLjAwMFpcIjtcbiAgICogY29uc3QgdG9EYXRlID0gXCIyMDIzLTEyLTA2VDIzOjUwOjAwLjAwMFpcIjtcbiAgICogY29uc3QgZm9ybWF0dGVkUmFuZ2UgPSBnZXRGb3JtYXR0ZWREYXRlUmFuZ2UoZnJvbURhdGUsIHRvRGF0ZSk7XG4gICAqIGNvbnNvbGUubG9nKGZvcm1hdHRlZFJhbmdlKTsgLy8gT3V0cHV0OiBcIjA0ZGVjMjMxMjQwLTA2ZGVjMjMyMzUwXCJcbiAgICogYGBgXG4gICAqL1xuICBnZXRGb3JtYXR0ZWREYXRlUmFuZ2UoZnJvbURhdGU6IHN0cmluZywgdG9EYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZvcm1hdERhdGUgPSAoZGF0ZVN0cmluZzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRlU3RyaW5nKTtcbiAgICAgIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGUgc3RyaW5nOiAke2RhdGVTdHJpbmd9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXkgPSBkYXRlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBjb25zdCBtb250aCA9IGRhdGUudG9Mb2NhbGVTdHJpbmcoJ2VuJywgeyBtb250aDogJ3Nob3J0JywgdGltZVpvbmU6ICdVVEMnIH0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBjb25zdCBtaW51dGVzID0gZGF0ZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgY29uc3Qgc2Vjb25kcyA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIHJldHVybiBgJHtkYXl9JHttb250aH0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGAke2Zvcm1hdERhdGUoZnJvbURhdGUpfS0ke2Zvcm1hdERhdGUodG9EYXRlKX1gO1xuICB9XG59XG4iXX0=
|