@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,467 @@
|
|
|
1
|
+
import { KeyValuePipe } from '@angular/common';
|
|
2
|
+
import { Component, EventEmitter, Inject, InjectionToken, Input, Output } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
5
|
+
import { AGGREGATION_VALUES, CoreModule } from '@c8y/ngx-components';
|
|
6
|
+
import saveAs from 'file-saver';
|
|
7
|
+
import { debounceTime, merge, Subject, takeUntil } from 'rxjs';
|
|
8
|
+
import { EXPORT_MODE_VALUES, SERIES_DATA_MERGED_FILE_NAME } from '../../datapoints-export-selector.model';
|
|
9
|
+
import { DataFetchingService } from './data-fetching.service';
|
|
10
|
+
import { DataProcessingService } from './data-processing.service';
|
|
11
|
+
import { DatapointsExportSelectorFileExporterService } from './datapoints-export-selector-file-exporter.service';
|
|
12
|
+
import { DataPointsExportSelectorPreviewComponent } from './datapoints-export-selector-preview/datapoints-export-selector-preview.component';
|
|
13
|
+
import { DataPointsExportSelectorDataScopeComponent } from './datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component';
|
|
14
|
+
import { DataPointsExportSelectorFileTypesComponent } from './datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component';
|
|
15
|
+
import { DataPointsExportSelectorTimeRangeComponent } from './datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component';
|
|
16
|
+
import { CSVGeneratorAdapter } from './generators/csv-generator';
|
|
17
|
+
import { ExcelGeneratorAdapter } from './generators/excel-generator';
|
|
18
|
+
import * as i0 from "@angular/core";
|
|
19
|
+
import * as i1 from "./data-processing.service";
|
|
20
|
+
import * as i2 from "./data-fetching.service";
|
|
21
|
+
import * as i3 from "./datapoints-export-selector-file-exporter.service";
|
|
22
|
+
import * as i4 from "@angular/forms";
|
|
23
|
+
import * as i5 from "@c8y/ngx-components";
|
|
24
|
+
import * as i6 from "@angular/common";
|
|
25
|
+
export const FILE_GENERATORS = new InjectionToken('FILE_GENERATORS', {
|
|
26
|
+
providedIn: 'root',
|
|
27
|
+
factory: () => [ExcelGeneratorAdapter, CSVGeneratorAdapter]
|
|
28
|
+
});
|
|
29
|
+
export const dateRangeValidator = (control) => {
|
|
30
|
+
const dateFrom = control.get('dateFrom');
|
|
31
|
+
const dateTo = control.get('dateTo');
|
|
32
|
+
if (!dateFrom || !dateTo) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const dateFromValue = dateFrom.value;
|
|
36
|
+
const dateToValue = dateTo.value;
|
|
37
|
+
if (dateFromValue && dateToValue) {
|
|
38
|
+
if (new Date(dateFromValue) > new Date(dateToValue)) {
|
|
39
|
+
dateFrom.setErrors({ dateAfterRangeMax: true });
|
|
40
|
+
dateTo.setErrors({ dateBeforeRangeMin: true });
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
dateFrom.setErrors(null);
|
|
44
|
+
dateTo.setErrors(null);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
};
|
|
49
|
+
export class DatapointsExportSelectorFileExporterComponent {
|
|
50
|
+
constructor(datapointsExportModalService, datapointsExportSelectorService, datapointsExportSelectorFileExporterService, formBuilder, generators) {
|
|
51
|
+
this.datapointsExportModalService = datapointsExportModalService;
|
|
52
|
+
this.datapointsExportSelectorService = datapointsExportSelectorService;
|
|
53
|
+
this.datapointsExportSelectorFileExporterService = datapointsExportSelectorFileExporterService;
|
|
54
|
+
this.formBuilder = formBuilder;
|
|
55
|
+
this.generators = generators;
|
|
56
|
+
this.onDownloadButtonStateChange = new EventEmitter();
|
|
57
|
+
/**
|
|
58
|
+
* Represents aggregation selector options that are disabled.
|
|
59
|
+
* This state is determined based on the current date range.
|
|
60
|
+
*/
|
|
61
|
+
this.disabledAggregationOptions = {};
|
|
62
|
+
/**
|
|
63
|
+
* Contains all datapoints that number of records exceeds a threshold, where data for these datapoints will be processed by the backend.
|
|
64
|
+
* Applies only to measurement API which can return processed CSV, Excel or XML data.
|
|
65
|
+
*/
|
|
66
|
+
this.datapointsExceedingBrowserDownloadLimit = [];
|
|
67
|
+
/**
|
|
68
|
+
* Indicates whether any of DataToExport objects timeValueMap property is not undefined (series data)
|
|
69
|
+
* or dataPointToExport is not undefined at all (measurement data).
|
|
70
|
+
*/
|
|
71
|
+
this.hasFetchedDataAnyValuesToExport = false;
|
|
72
|
+
this.hasPermissionToReadAnyMeasurements = false;
|
|
73
|
+
this.isPreviewLoading = true;
|
|
74
|
+
/**
|
|
75
|
+
* Indicates whether the full or compact type of export is selected.
|
|
76
|
+
* Full type of export is based on measurement API data.
|
|
77
|
+
* Compact type of export is based on series API data.
|
|
78
|
+
*/
|
|
79
|
+
this.isFullTypeOfExport = false;
|
|
80
|
+
/**
|
|
81
|
+
* Indicates whether the aggregation value was changed programmatically.
|
|
82
|
+
* It prevents a case where fetching may be triggered twice when export type is changed.
|
|
83
|
+
* Both options alone can trigger fetching data.
|
|
84
|
+
*/
|
|
85
|
+
this.isAggregationChangedProgrammatically = false;
|
|
86
|
+
/**
|
|
87
|
+
* Indicates whether any of the export file types (CSV, Excel) are checked.
|
|
88
|
+
*/
|
|
89
|
+
this.isAnyOfExportFileTypeChecked = false;
|
|
90
|
+
this.dateFromSubject = new Subject();
|
|
91
|
+
this.dateToSubject = new Subject();
|
|
92
|
+
this.destroy$ = new Subject();
|
|
93
|
+
this.dynamicFilesTypeMetadata = {};
|
|
94
|
+
this.setFilesType(this.generators);
|
|
95
|
+
this.dateFromSubject
|
|
96
|
+
.pipe(debounceTime(300), takeUntilDestroyed())
|
|
97
|
+
.subscribe(async (updatedDate) => {
|
|
98
|
+
await this.updateDateAndFetchData('dateFrom', updatedDate);
|
|
99
|
+
});
|
|
100
|
+
this.dateToSubject
|
|
101
|
+
.pipe(debounceTime(300), takeUntilDestroyed())
|
|
102
|
+
.subscribe(async (updatedDate) => {
|
|
103
|
+
await this.updateDateAndFetchData('dateTo', updatedDate);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
setFilesType(generators) {
|
|
107
|
+
generators.forEach(g => {
|
|
108
|
+
this.dynamicFilesTypeMetadata[g.getType()] = {
|
|
109
|
+
label: g.getLabel(),
|
|
110
|
+
icon: g.getIcon(),
|
|
111
|
+
title: g.getTitle(),
|
|
112
|
+
extension: g.getFileExtension(),
|
|
113
|
+
zipName: g.getZipName(),
|
|
114
|
+
type: g.getType()
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async ngOnInit() {
|
|
119
|
+
const sourcesPermittedToRead = await this.datapointsExportSelectorService.getSourcesWithPermissionsToRead(this.exportConfig.datapointDetails);
|
|
120
|
+
if (sourcesPermittedToRead.length === 0) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (sourcesPermittedToRead.length !== this.exportConfig.datapointDetails.length) {
|
|
124
|
+
this.exportConfig.datapointDetails = this.exportConfig.datapointDetails.filter(dataPoint => sourcesPermittedToRead.includes(String(dataPoint.source)));
|
|
125
|
+
}
|
|
126
|
+
this.hasPermissionToReadAnyMeasurements = true;
|
|
127
|
+
this.storeInitialChangeableConfig();
|
|
128
|
+
this.fileTypeSelectionState = this.getInitialSelection(this.dynamicFilesTypeMetadata, [0]);
|
|
129
|
+
this.formGroup = this.createForm();
|
|
130
|
+
this.dataToExport = await this.datapointsExportSelectorService.fetchAndPrepareDataToExport(this.exportConfig, this.isFullTypeOfExport);
|
|
131
|
+
this.handleDateSelectorChanges();
|
|
132
|
+
this.determineShowingPreviewOrEmptyState();
|
|
133
|
+
this.handleExportModeChanges();
|
|
134
|
+
this.handleFileTypeSelectionChanges();
|
|
135
|
+
this.handleFormValidationChanges();
|
|
136
|
+
this.updateFileTypeControl();
|
|
137
|
+
this.updateDisabledAggregationOptionsState();
|
|
138
|
+
}
|
|
139
|
+
ngOnDestroy() {
|
|
140
|
+
this.destroy$.next();
|
|
141
|
+
this.destroy$.complete();
|
|
142
|
+
this.loadInitialChangeableConfig();
|
|
143
|
+
}
|
|
144
|
+
async exportAndDownload() {
|
|
145
|
+
const fileExports = Object.entries(this.dynamicFilesTypeMetadata).map(([_, value]) => ({
|
|
146
|
+
fileType: value.type,
|
|
147
|
+
zipName: value.zipName
|
|
148
|
+
}));
|
|
149
|
+
const selectedFileExports = this.getOnlySelectedFileExports(fileExports);
|
|
150
|
+
await Promise.all(selectedFileExports.map(async ({ fileType, zipName }) => {
|
|
151
|
+
const blob = await this.exportFile(fileType);
|
|
152
|
+
await this.downloadFile(blob, fileType, zipName);
|
|
153
|
+
}));
|
|
154
|
+
this.datapointsExportSelectorFileExporterService.cleanupCachedData();
|
|
155
|
+
}
|
|
156
|
+
getOnlySelectedFileExports(fileExports) {
|
|
157
|
+
return fileExports.filter(f => this.fileTypeSelectionState[f.fileType] === true);
|
|
158
|
+
}
|
|
159
|
+
async exportFile(fileType) {
|
|
160
|
+
return this.isFullTypeOfExport
|
|
161
|
+
? await this.exportMeasurementFile(fileType)
|
|
162
|
+
: await this.exportSeriesFile(fileType);
|
|
163
|
+
}
|
|
164
|
+
async downloadFile(blob, fileType, measurementsZipFileName) {
|
|
165
|
+
this.datapointsExceedingBrowserDownloadLimit =
|
|
166
|
+
this.datapointsExceedingBrowserDownloadLimit.filter(datapoint => !this.dataPointsExceedingOneMillionLimit.includes(datapoint));
|
|
167
|
+
const shouldShowAlert = this.datapointsExceedingBrowserDownloadLimit.length > 0;
|
|
168
|
+
// Handles a case where all files are sent by email.
|
|
169
|
+
if (!blob && shouldShowAlert) {
|
|
170
|
+
this.datapointsExportSelectorService.showSendViaEmailInfoAlert(fileType, this.datapointsExceedingBrowserDownloadLimit);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (blob) {
|
|
174
|
+
// Handles the case where some of the files are sent by email.
|
|
175
|
+
if (shouldShowAlert) {
|
|
176
|
+
this.datapointsExportSelectorService.showSendViaEmailInfoAlert(fileType, this.datapointsExceedingBrowserDownloadLimit);
|
|
177
|
+
}
|
|
178
|
+
this.isFullTypeOfExport
|
|
179
|
+
? saveAs(blob, measurementsZipFileName)
|
|
180
|
+
: saveAs(blob, blob[SERIES_DATA_MERGED_FILE_NAME]);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Exports a measurement file of the specified type.
|
|
185
|
+
*
|
|
186
|
+
* Measurements API does provide a way to fetch a preprocessed CSV/Excel file.
|
|
187
|
+
*
|
|
188
|
+
* At this point a backed file needs to be fetched.
|
|
189
|
+
* Measurement data used for a preview contains just 5 first records
|
|
190
|
+
* and it's not fetched with CSV/Excel headers.
|
|
191
|
+
*
|
|
192
|
+
* @param fileType - The type of file to export.
|
|
193
|
+
* @returns A Promise that resolves to a Blob representing the exported file or null when no data to export or it's sent via email.
|
|
194
|
+
*/
|
|
195
|
+
async exportMeasurementFile(fileType) {
|
|
196
|
+
const { acceptType, extension } = this.datapointsExportModalService.fileTypesConfigs[fileType];
|
|
197
|
+
const updatedExportConfig = this.excludeDatapointsThatExceedsApiLimit(this.exportConfig);
|
|
198
|
+
const dataToExport = await this.datapointsExportSelectorService.fetchMeasurementDataFilesAndPairWithSourceDetails(acceptType, updatedExportConfig);
|
|
199
|
+
const isAllUndefined = dataToExport.every(data => data === undefined);
|
|
200
|
+
if (isAllUndefined) {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
return this.datapointsExportSelectorFileExporterService.getMeasurementExportedDataBlob(extension, dataToExport);
|
|
204
|
+
}
|
|
205
|
+
excludeDatapointsThatExceedsApiLimit(exportConfig) {
|
|
206
|
+
const skippedDatapointsSource = this.dataPointsExceedingOneMillionLimit.map(datapoint => datapoint.datapointDetail.source.toString());
|
|
207
|
+
const filteredDatapoints = exportConfig.datapointDetails.filter(datapoint => !skippedDatapointsSource.includes(String(datapoint.source)));
|
|
208
|
+
exportConfig.datapointDetails = filteredDatapoints;
|
|
209
|
+
return exportConfig;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Exports the series data to a file of the specified type.
|
|
213
|
+
*
|
|
214
|
+
* Series API does not provide a way to fetch a preprocessed CSV/Excel file.
|
|
215
|
+
*
|
|
216
|
+
* Series data used for exporting a file is already fetched for a preview
|
|
217
|
+
* and can be reused for exporting.
|
|
218
|
+
*
|
|
219
|
+
* @param fileType - The type of file to export (e.g., CSV, Excel).
|
|
220
|
+
* @returns A Promise that resolves to a Blob representing the exported file.
|
|
221
|
+
*/
|
|
222
|
+
async exportSeriesFile(fileType) {
|
|
223
|
+
const mergedExportDetails = {
|
|
224
|
+
aggregation: this.exportConfig.aggregation,
|
|
225
|
+
dateFrom: this.exportConfig.dateFrom,
|
|
226
|
+
dateTo: this.exportConfig.dateTo
|
|
227
|
+
};
|
|
228
|
+
return this.datapointsExportSelectorFileExporterService.getSeriesExportedDataBlob(fileType, this.dataToExport, mergedExportDetails);
|
|
229
|
+
}
|
|
230
|
+
async onAggregationChange(aggregation) {
|
|
231
|
+
this.exportConfig.aggregation = aggregation;
|
|
232
|
+
if (!this.isAggregationChangedProgrammatically) {
|
|
233
|
+
await this.updateExportConfigAndFetchData();
|
|
234
|
+
this.updateDownloadButtonState();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
onDateFromChange(updatedDate) {
|
|
238
|
+
this.dateFromSubject.next(updatedDate);
|
|
239
|
+
}
|
|
240
|
+
onDateToChange(updatedDate) {
|
|
241
|
+
this.dateToSubject.next(updatedDate);
|
|
242
|
+
}
|
|
243
|
+
async updateDateAndFetchData(dateType, updatedDate) {
|
|
244
|
+
this.exportConfig[dateType] = updatedDate;
|
|
245
|
+
await this.updateExportConfigAndFetchData();
|
|
246
|
+
if (this.isFullTypeOfExport) {
|
|
247
|
+
await this.determineIfMeasurementResponseWillBeProcessedByBackend();
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
this.updateDownloadButtonState();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async onExportTypeChange(exportType) {
|
|
254
|
+
if (exportType === EXPORT_MODE_VALUES.full) {
|
|
255
|
+
this.isAggregationChangedProgrammatically = true;
|
|
256
|
+
this.formGroup.controls.aggregation.setValue(AGGREGATION_VALUES.none);
|
|
257
|
+
this.isAggregationChangedProgrammatically = false;
|
|
258
|
+
this.isFullTypeOfExport = true;
|
|
259
|
+
await this.updateExportConfigAndFetchData();
|
|
260
|
+
await this.determineIfMeasurementResponseWillBeProcessedByBackend();
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
this.resetFullExportRelatedProperties();
|
|
264
|
+
this.isFullTypeOfExport = false;
|
|
265
|
+
await this.updateExportConfigAndFetchData();
|
|
266
|
+
this.updateDisabledAggregationOptionsState();
|
|
267
|
+
this.updateDownloadButtonState();
|
|
268
|
+
}
|
|
269
|
+
updateDisabledAggregationOptionsState() {
|
|
270
|
+
this.disabledAggregationOptions =
|
|
271
|
+
this.datapointsExportSelectorFileExporterService.updateDisabledStateOfAggregationOptionEntries(this.formGroup.controls.dateFrom.value, this.formGroup.controls.dateTo.value, this.disabledAggregationOptions);
|
|
272
|
+
}
|
|
273
|
+
createForm() {
|
|
274
|
+
return this.formBuilder.group({
|
|
275
|
+
dateFrom: new FormControl(this.exportConfig.dateFrom),
|
|
276
|
+
dateTo: new FormControl(this.exportConfig.dateTo),
|
|
277
|
+
aggregation: new FormControl(this.exportConfig.aggregation ? this.exportConfig.aggregation : AGGREGATION_VALUES.none),
|
|
278
|
+
exportMode: new FormControl(EXPORT_MODE_VALUES.compact),
|
|
279
|
+
fileTypes: this.formBuilder.group(this.generators.reduce((a, c) => {
|
|
280
|
+
a[c.getType()] = false;
|
|
281
|
+
return a;
|
|
282
|
+
}, {}))
|
|
283
|
+
}, {
|
|
284
|
+
validators: [dateRangeValidator]
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
preparePreview() {
|
|
288
|
+
this.isPreviewLoading = true;
|
|
289
|
+
this.previewTableData =
|
|
290
|
+
this.datapointsExportModalService.transformToExportFileStructureForPreview(this.dataToExport);
|
|
291
|
+
this.isPreviewLoading = false;
|
|
292
|
+
}
|
|
293
|
+
handleDateSelectorChanges() {
|
|
294
|
+
const aggregationControl = this.formGroup.controls.aggregation;
|
|
295
|
+
const dateFromSelector = this.formGroup.controls.dateFrom;
|
|
296
|
+
const dateToSelector = this.formGroup.controls.dateTo;
|
|
297
|
+
const updateAggregationOptions = () => {
|
|
298
|
+
if (!this.isFullTypeOfExport) {
|
|
299
|
+
this.updateDisabledAggregationOptionsState();
|
|
300
|
+
const firstAvailableAggregationValue = this.datapointsExportSelectorFileExporterService.setToFirstAvailableAggregationOptionIfCurrentIsDisabled(aggregationControl.value, this.disabledAggregationOptions);
|
|
301
|
+
if (firstAvailableAggregationValue) {
|
|
302
|
+
aggregationControl.setValue(firstAvailableAggregationValue);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
merge(dateFromSelector.valueChanges, dateToSelector.valueChanges)
|
|
307
|
+
.pipe(takeUntil(this.destroy$))
|
|
308
|
+
.subscribe(updateAggregationOptions);
|
|
309
|
+
}
|
|
310
|
+
handleExportModeChanges() {
|
|
311
|
+
const aggregationControl = this.formGroup.controls.aggregation;
|
|
312
|
+
this.formGroup.controls.exportMode.valueChanges
|
|
313
|
+
.pipe(takeUntil(this.destroy$))
|
|
314
|
+
.subscribe(exportModeValue => {
|
|
315
|
+
if (exportModeValue.toString() === EXPORT_MODE_VALUES.full) {
|
|
316
|
+
aggregationControl.disable();
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
aggregationControl.enable();
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
handleFileTypeSelectionChanges() {
|
|
324
|
+
this.formGroup.controls.fileTypes.valueChanges
|
|
325
|
+
.pipe(takeUntil(this.destroy$))
|
|
326
|
+
.subscribe(fileTypesSelectionState => {
|
|
327
|
+
this.updateFileTypeSelectionState(fileTypesSelectionState);
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
updateFileTypeSelectionState(checkboxesState) {
|
|
331
|
+
this.isAnyOfExportFileTypeChecked = Object.values(checkboxesState).some(value => value === true);
|
|
332
|
+
this.fileTypeSelectionState = checkboxesState;
|
|
333
|
+
this.updateDownloadButtonState();
|
|
334
|
+
}
|
|
335
|
+
handleFormValidationChanges() {
|
|
336
|
+
this.formGroup.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {
|
|
337
|
+
this.updateDownloadButtonState();
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
updateFileTypeControl() {
|
|
341
|
+
const fileTypesControl = this.formGroup.controls.fileTypes;
|
|
342
|
+
if (fileTypesControl) {
|
|
343
|
+
const currentValue = fileTypesControl.value || {};
|
|
344
|
+
const updatedValue = { ...currentValue };
|
|
345
|
+
Object.entries(this.fileTypeSelectionState).forEach(([fileType, isSelected]) => {
|
|
346
|
+
if (fileType in currentValue) {
|
|
347
|
+
updatedValue[fileType] = isSelected;
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
fileTypesControl.patchValue(updatedValue);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
determineShowingPreviewOrEmptyState() {
|
|
354
|
+
const hasDataToShow = this.dataToExport.some(dataToExportItem => this.isFullTypeOfExport
|
|
355
|
+
? !!dataToExportItem
|
|
356
|
+
: dataToExportItem.timeValueMap && Object.keys(dataToExportItem.timeValueMap).length > 0);
|
|
357
|
+
this.hasFetchedDataAnyValuesToExport = hasDataToShow;
|
|
358
|
+
if (hasDataToShow) {
|
|
359
|
+
this.preparePreview();
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
this.isPreviewLoading = false;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
async determineIfMeasurementResponseWillBeProcessedByBackend() {
|
|
366
|
+
this.isPreviewLoading = true;
|
|
367
|
+
this.datapointsExceedingBrowserDownloadLimit =
|
|
368
|
+
await this.datapointsExportSelectorService.getDatapointsExceedingLimit(this.exportConfig);
|
|
369
|
+
const { browserDownloadableCount, emailDeliverableCount, nonRetrievableCount } = this.calculateDatapointCounts();
|
|
370
|
+
this.hasNoExportableData =
|
|
371
|
+
browserDownloadableCount === 0 && emailDeliverableCount === 0 && nonRetrievableCount > 0;
|
|
372
|
+
if (this.datapointsExceedingBrowserDownloadLimit.length > 0 && !this.hasNoExportableData) {
|
|
373
|
+
this.limitExceededMessage = this.datapointsExportSelectorService.getLimitExceededMessage(this.hasNoExportableData, emailDeliverableCount, browserDownloadableCount, nonRetrievableCount, this.exportConfig.datapointDetails.length);
|
|
374
|
+
}
|
|
375
|
+
if (this.datapointsExceedingBrowserDownloadLimit.length > 0 && this.hasNoExportableData) {
|
|
376
|
+
this.limitExceededMessage = this.datapointsExportSelectorService.getLimitExceededMessage(this.hasNoExportableData);
|
|
377
|
+
}
|
|
378
|
+
this.updateDownloadButtonState();
|
|
379
|
+
this.isPreviewLoading = false;
|
|
380
|
+
}
|
|
381
|
+
calculateDatapointCounts() {
|
|
382
|
+
const RECORD_API_LIMIT = 1_000_000;
|
|
383
|
+
this.dataPointsExceedingOneMillionLimit = this.datapointsExceedingBrowserDownloadLimit.filter(datapointsExceedingBrowserDownloadLimit => datapointsExceedingBrowserDownloadLimit.totalElements > RECORD_API_LIMIT);
|
|
384
|
+
const nonRetrievableCount = this.dataPointsExceedingOneMillionLimit.length;
|
|
385
|
+
const emailDeliverableCount = this.datapointsExceedingBrowserDownloadLimit.length - nonRetrievableCount;
|
|
386
|
+
const browserDownloadableCount = this.exportConfig.datapointDetails.length - emailDeliverableCount - nonRetrievableCount;
|
|
387
|
+
return {
|
|
388
|
+
browserDownloadableCount,
|
|
389
|
+
emailDeliverableCount,
|
|
390
|
+
nonRetrievableCount
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
storeInitialChangeableConfig() {
|
|
394
|
+
this.initialDateFrom = this.exportConfig.dateFrom;
|
|
395
|
+
this.initialDateTo = this.exportConfig.dateTo;
|
|
396
|
+
this.initialDatapointDetails = this.exportConfig.datapointDetails;
|
|
397
|
+
if (!this.isFullTypeOfExport) {
|
|
398
|
+
this.initialAggregation = this.exportConfig.aggregation;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
loadInitialChangeableConfig() {
|
|
402
|
+
this.exportConfig.dateFrom = this.initialDateFrom;
|
|
403
|
+
this.exportConfig.dateTo = this.initialDateTo;
|
|
404
|
+
this.exportConfig.datapointDetails = this.initialDatapointDetails;
|
|
405
|
+
if (!this.isFullTypeOfExport) {
|
|
406
|
+
this.exportConfig.aggregation = this.initialAggregation;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
async updateExportConfigAndFetchData() {
|
|
410
|
+
if (this.formGroup.invalid) {
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
this.isPreviewLoading = true;
|
|
414
|
+
this.onDownloadButtonStateChange.emit(false);
|
|
415
|
+
this.dataToExport = await this.datapointsExportSelectorService.fetchAndPrepareDataToExport(this.exportConfig, this.isFullTypeOfExport);
|
|
416
|
+
this.determineShowingPreviewOrEmptyState();
|
|
417
|
+
}
|
|
418
|
+
updateDownloadButtonState() {
|
|
419
|
+
const canEnableDownloadButton = this.hasFetchedDataAnyValuesToExport &&
|
|
420
|
+
!this.formGroup.invalid &&
|
|
421
|
+
this.isAnyOfExportFileTypeChecked &&
|
|
422
|
+
!this.hasNoExportableData;
|
|
423
|
+
this.onDownloadButtonStateChange.emit(canEnableDownloadButton);
|
|
424
|
+
}
|
|
425
|
+
resetFullExportRelatedProperties() {
|
|
426
|
+
this.hasNoExportableData = false;
|
|
427
|
+
this.datapointsExceedingBrowserDownloadLimit = [];
|
|
428
|
+
}
|
|
429
|
+
getInitialSelection(fileType, selectByDefault) {
|
|
430
|
+
const keys = Object.keys(fileType);
|
|
431
|
+
if (keys.length === 0) {
|
|
432
|
+
return {};
|
|
433
|
+
}
|
|
434
|
+
const initialSelection = keys.reduce((acc, key) => {
|
|
435
|
+
acc[key] = false;
|
|
436
|
+
return acc;
|
|
437
|
+
}, {});
|
|
438
|
+
selectByDefault.forEach(index => {
|
|
439
|
+
if (index >= 0 && index < keys.length) {
|
|
440
|
+
initialSelection[keys[index]] = true;
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
return initialSelection;
|
|
444
|
+
}
|
|
445
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsExportSelectorFileExporterComponent, deps: [{ token: i1.DataProcessingService }, { token: i2.DataFetchingService }, { token: i3.DatapointsExportSelectorFileExporterService }, { token: i4.FormBuilder }, { token: FILE_GENERATORS }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
446
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DatapointsExportSelectorFileExporterComponent, isStandalone: true, selector: "c8y-datapoints-export-selector-file-exporter", inputs: { exportConfig: "exportConfig" }, outputs: { onDownloadButtonStateChange: "onDownloadButtonStateChange" }, ngImport: i0, template: "<div class=\"p-b-16\">\n <ng-container *ngIf=\"hasPermissionToReadAnyMeasurements; else hasNoRoleToReadAnyMeasurements\">\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Configure export' | translate }}\n </p>\n </div>\n <div\n class=\"p-t-24 p-r-16 p-l-16 gap-8 p-b-16 flex-wrap\"\n [ngClass]=\"{ 'separator-bottom': isFullTypeOfExport }\"\n >\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-time-range\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [formGroup]=\"formGroup\"\n (onDateFromChange)=\"onDateFromChange($event)\"\n (onDateToChange)=\"onDateToChange($event)\"\n ></c8y-datapoints-export-selector-time-range>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-data-scope\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [disabledAggregationOptions]=\"disabledAggregationOptions\"\n [formGroup]=\"formGroup\"\n (onAggregationChange)=\"onAggregationChange($event)\"\n (onExportTypeChange)=\"onExportTypeChange($event)\"\n ></c8y-datapoints-export-selector-data-scope>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-file-types\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [dynamicFilesTypeMetadata]=\"dynamicFilesTypeMetadata\"\n [formGroup]=\"formGroup\"\n ></c8y-datapoints-export-selector-file-types>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"!isFullTypeOfExport && !hasFetchedDataAnyValuesToExport && !isPreviewLoading\"\n >\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 separator-bottom d-flex\">\n <div\n class=\"alert alert-warning center-block\"\n role=\"alert\"\n data-cy=\"file-exporter--no-data-available\"\n translate\n >\n No data available.\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"datapointsExceedingBrowserDownloadLimit.length > 0\">\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 separator-bottom d-flex\">\n <div\n [class]=\"\n hasNoExportableData\n ? 'alert alert-warning center-block'\n : 'alert alert-info center-block'\n \"\n role=\"alert\"\n [innerHTML]=\"limitExceededMessage\"\n ></div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isFullTypeOfExport\">\n <c8y-datapoints-export-selector-preview\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [hasFetchedDataAnyValuesToExport]=\"hasFetchedDataAnyValuesToExport\"\n [isPreviewLoading]=\"isPreviewLoading\"\n [previewTableData]=\"previewTableData\"\n ></c8y-datapoints-export-selector-preview>\n </ng-container>\n </ng-container>\n <ng-template #hasNoRoleToReadAnyMeasurements>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div\n class=\"alert alert-info center-block\"\n role=\"alert\"\n translate\n >\n <p>To export data, you must meet at least one of these criteria:</p>\n <ul>\n <li>\n Have\n <b>READ permission for \"Measurements\" permission type</b>\n (either as a global role or for the specific source)\n </li>\n <li>\n Be the\n <b>owner of the source</b>\n you want to export data from\n </li>\n </ul>\n <p>Don't meet these requirements? Contact your system administrator for assistance.</p>\n </div>\n </div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DataPointsExportSelectorDataScopeComponent, selector: "c8y-datapoints-export-selector-data-scope", inputs: ["disabledAggregationOptions", "formGroup"], outputs: ["onAggregationChange", "onExportTypeChange"] }, { kind: "component", type: DataPointsExportSelectorFileTypesComponent, selector: "c8y-datapoints-export-selector-file-types", inputs: ["dynamicFilesTypeMetadata", "formGroup"] }, { kind: "component", type: DataPointsExportSelectorPreviewComponent, selector: "c8y-datapoints-export-selector-preview", inputs: ["hasFetchedDataAnyValuesToExport", "isPreviewLoading", "previewTableData"] }, { kind: "component", type: DataPointsExportSelectorTimeRangeComponent, selector: "c8y-datapoints-export-selector-time-range", inputs: ["formGroup"], outputs: ["onDateFromChange", "onDateToChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
|
|
447
|
+
}
|
|
448
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DatapointsExportSelectorFileExporterComponent, decorators: [{
|
|
449
|
+
type: Component,
|
|
450
|
+
args: [{ selector: 'c8y-datapoints-export-selector-file-exporter', standalone: true, imports: [
|
|
451
|
+
CoreModule,
|
|
452
|
+
DataPointsExportSelectorDataScopeComponent,
|
|
453
|
+
DataPointsExportSelectorFileTypesComponent,
|
|
454
|
+
DataPointsExportSelectorPreviewComponent,
|
|
455
|
+
DataPointsExportSelectorTimeRangeComponent,
|
|
456
|
+
KeyValuePipe,
|
|
457
|
+
ReactiveFormsModule
|
|
458
|
+
], template: "<div class=\"p-b-16\">\n <ng-container *ngIf=\"hasPermissionToReadAnyMeasurements; else hasNoRoleToReadAnyMeasurements\">\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Configure export' | translate }}\n </p>\n </div>\n <div\n class=\"p-t-24 p-r-16 p-l-16 gap-8 p-b-16 flex-wrap\"\n [ngClass]=\"{ 'separator-bottom': isFullTypeOfExport }\"\n >\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-time-range\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [formGroup]=\"formGroup\"\n (onDateFromChange)=\"onDateFromChange($event)\"\n (onDateToChange)=\"onDateToChange($event)\"\n ></c8y-datapoints-export-selector-time-range>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-data-scope\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [disabledAggregationOptions]=\"disabledAggregationOptions\"\n [formGroup]=\"formGroup\"\n (onAggregationChange)=\"onAggregationChange($event)\"\n (onExportTypeChange)=\"onExportTypeChange($event)\"\n ></c8y-datapoints-export-selector-data-scope>\n </div>\n <div class=\"col-md-4\">\n <c8y-datapoints-export-selector-file-types\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [dynamicFilesTypeMetadata]=\"dynamicFilesTypeMetadata\"\n [formGroup]=\"formGroup\"\n ></c8y-datapoints-export-selector-file-types>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"!isFullTypeOfExport && !hasFetchedDataAnyValuesToExport && !isPreviewLoading\"\n >\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 separator-bottom d-flex\">\n <div\n class=\"alert alert-warning center-block\"\n role=\"alert\"\n data-cy=\"file-exporter--no-data-available\"\n translate\n >\n No data available.\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"datapointsExceedingBrowserDownloadLimit.length > 0\">\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 separator-bottom d-flex\">\n <div\n [class]=\"\n hasNoExportableData\n ? 'alert alert-warning center-block'\n : 'alert alert-info center-block'\n \"\n role=\"alert\"\n [innerHTML]=\"limitExceededMessage\"\n ></div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isFullTypeOfExport\">\n <c8y-datapoints-export-selector-preview\n *ngIf=\"this.hasPermissionToReadAnyMeasurements\"\n [hasFetchedDataAnyValuesToExport]=\"hasFetchedDataAnyValuesToExport\"\n [isPreviewLoading]=\"isPreviewLoading\"\n [previewTableData]=\"previewTableData\"\n ></c8y-datapoints-export-selector-preview>\n </ng-container>\n </ng-container>\n <ng-template #hasNoRoleToReadAnyMeasurements>\n <div class=\"p-t-24 p-r-16 p-l-16 p-b-16 d-flex\">\n <div\n class=\"alert alert-info center-block\"\n role=\"alert\"\n translate\n >\n <p>To export data, you must meet at least one of these criteria:</p>\n <ul>\n <li>\n Have\n <b>READ permission for \"Measurements\" permission type</b>\n (either as a global role or for the specific source)\n </li>\n <li>\n Be the\n <b>owner of the source</b>\n you want to export data from\n </li>\n </ul>\n <p>Don't meet these requirements? Contact your system administrator for assistance.</p>\n </div>\n </div>\n </ng-template>\n</div>\n" }]
|
|
459
|
+
}], ctorParameters: () => [{ type: i1.DataProcessingService }, { type: i2.DataFetchingService }, { type: i3.DatapointsExportSelectorFileExporterService }, { type: i4.FormBuilder }, { type: undefined, decorators: [{
|
|
460
|
+
type: Inject,
|
|
461
|
+
args: [FILE_GENERATORS]
|
|
462
|
+
}] }], propDecorators: { exportConfig: [{
|
|
463
|
+
type: Input
|
|
464
|
+
}], onDownloadButtonStateChange: [{
|
|
465
|
+
type: Output
|
|
466
|
+
}] } });
|
|
467
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1tb2RhbC9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLWZpbGUtZXhwb3J0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItbW9kYWwvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUNkLEtBQUssRUFHTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUVMLFdBQVcsRUFDWCxXQUFXLEVBQ1gsbUJBQW1CLEVBR3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUdsQixVQUFVLEVBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLE1BQU0sTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBTUwsa0JBQWtCLEVB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Q29udGVudCI6WyJpbXBvcnQgeyBLZXlWYWx1ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQnVpbGRlcixcbiAgRm9ybUNvbnRyb2wsXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvckZuXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEFHR1JFR0FUSU9OX1ZBTFVFUyxcbiAgQWdncmVnYXRpb25PcHRpb24sXG4gIEFnZ3JlZ2F0aW9uT3B0aW9uU3RhdHVzLFxuICBDb3JlTW9kdWxlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHNhdmVBcyBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWVyZ2UsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRGF0YXBvaW50Q291bnRzLFxuICBEYXRhcG9pbnREZXRhaWxzLFxuICBEYXRhcG9pbnRzRXhjZWVkaW5nTGltaXQsXG4gIERhdGFUb0V4cG9ydCxcbiAgRGF0YVRvRXhwb3J0V2l0aEJhY2tlbmRDcmVhdGVkRmlsZSxcbiAgRVhQT1JUX01PREVfVkFMVUVTLFxuICBFeHBvcnRDb25maWcsXG4gIEV4cG9ydERhdGEsXG4gIEZpbGVFeHBvcnRDb25maWcsXG4gIEZpbGVHZW5lcmF0b3IsXG4gIEZpbGVUeXBlTWV0YWRhdGEsXG4gIE1lcmdlZEV4cG9ydERldGFpbHMsXG4gIFNFUklFU19EQVRBX01FUkdFRF9GSUxFX05BTUVcbn0gZnJvbSAnLi4vLi4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3IubW9kZWwnO1xuaW1wb3J0IHsgRGF0YUZldGNoaW5nU2VydmljZSB9IGZyb20gJy4vZGF0YS1mZXRjaGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGFQcm9jZXNzaW5nU2VydmljZSB9IGZyb20gJy4vZGF0YS1wcm9jZXNzaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZUV4cG9ydGVyU2VydmljZSB9IGZyb20gJy4vZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlci5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGFQb2ludHNFeHBvcnRTZWxlY3RvclByZXZpZXdDb21wb25lbnQgfSBmcm9tICcuL2RhdGFwb2ludHMtZXhwb3J0LXNlbGVjdG9yLXByZXZpZXcvZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItcHJldmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yRGF0YVNjb3BlQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZGF0YS1zY29wZS9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZGF0YS1zY29wZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZVR5cGVzQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZmlsZS10eXBlcy9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItZmlsZS10eXBlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yVGltZVJhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItdGltZS1yYW5nZS9kYXRhcG9pbnRzLWV4cG9ydHMtc2VsZWN0b3ItdGltZS1yYW5nZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ1NWR2VuZXJhdG9yQWRhcHRlciB9IGZyb20gJy4vZ2VuZXJhdG9ycy9jc3YtZ2VuZXJhdG9yJztcbmltcG9ydCB7IEV4Y2VsR2VuZXJhdG9yQWRhcHRlciB9IGZyb20gJy4vZ2VuZXJhdG9ycy9leGNlbC1nZW5lcmF0b3InO1xuXG5leHBvcnQgY29uc3QgRklMRV9HRU5FUkFUT1JTID0gbmV3IEluamVjdGlvblRva2VuPEZpbGVHZW5lcmF0b3JbXT4oJ0ZJTEVfR0VORVJBVE9SUycsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBbRXhjZWxHZW5lcmF0b3JBZGFwdGVyLCBDU1ZHZW5lcmF0b3JBZGFwdGVyXVxufSk7XG5cbmV4cG9ydCBjb25zdCBkYXRlUmFuZ2VWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKFxuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbik6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgY29uc3QgZGF0ZUZyb20gPSBjb250cm9sLmdldCgnZGF0ZUZyb20nKTtcbiAgY29uc3QgZGF0ZVRvID0gY29udHJvbC5nZXQoJ2RhdGVUbycpO1xuXG4gIGlmICghZGF0ZUZyb20gfHwgIWRhdGVUbykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZUZyb21WYWx1ZSA9IGRhdGVGcm9tLnZhbHVlO1xuICBjb25zdCBkYXRlVG9WYWx1ZSA9IGRhdGVUby52YWx1ZTtcbiAgaWYgKGRhdGVGcm9tVmFsdWUgJiYgZGF0ZVRvVmFsdWUpIHtcbiAgICBpZiAobmV3IERhdGUoZGF0ZUZyb21WYWx1ZSkgPiBuZXcgRGF0ZShkYXRlVG9WYWx1ZSkpIHtcbiAgICAgIGRhdGVGcm9tLnNldEVycm9ycyh7IGRhdGVBZnRlclJhbmdlTWF4OiB0cnVlIH0pO1xuICAgICAgZGF0ZVRvLnNldEVycm9ycyh7IGRhdGVCZWZvcmVSYW5nZU1pbjogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZUZyb20uc2V0RXJyb3JzKG51bGwpO1xuICAgICAgZGF0ZVRvLnNldEVycm9ycyhudWxsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS1leHBvcnRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLWV4cG9ydGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvcmVNb2R1bGUsXG4gICAgRGF0YVBvaW50c0V4cG9ydFNlbGVjdG9yRGF0YVNjb3BlQ29tcG9uZW50LFxuICAgIERhdGFQb2ludHNFeHBvcnRTZWxlY3RvckZpbGVUeXBlc0NvbXBvbmVudCxcbiAgICBEYXRhUG9pbnRzRXhwb3J0U2VsZWN0b3JQcmV2aWV3Q29tcG9uZW50LFxuICAgIERhdGFQb2ludHNFeHBvcnRTZWxlY3RvclRpbWVSYW5nZUNvbXBvbmVudCxcbiAgICBLZXlWYWx1ZVBpcGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgZXhwb3J0Q29uZmlnOiBFeHBvcnRDb25maWc7XG4gIEBPdXRwdXQoKSBvbkRvd25sb2FkQnV0dG9uU3RhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhZ2dyZWdhdGlvbiBzZWxlY3RvciBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkLlxuICAgKiBUaGlzIHN0YXRlIGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgZGF0ZSByYW5nZS5cbiAgICovXG4gIGRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zOiBBZ2dyZWdhdGlvbk9wdGlvblN0YXR1cyA9IHt9O1xuXG4gIGZvcm1Hcm91cDogUmV0dXJuVHlwZTxEYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJDb21wb25lbnRbJ2NyZWF0ZUZvcm0nXT47XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGFsbCBkYXRhcG9pbnRzIHRoYXQgbnVtYmVyIG9mIHJlY29yZHMgZXhjZWVkcyBhIHRocmVzaG9sZCwgd2hlcmUgZGF0YSBmb3IgdGhlc2UgZGF0YXBvaW50cyB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgYmFja2VuZC5cbiAgICogQXBwbGllcyBvbmx5IHRvIG1lYXN1cmVtZW50IEFQSSB3aGljaCBjYW4gcmV0dXJuIHByb2Nlc3NlZCBDU1YsIEV4Y2VsIG9yIFhNTCBkYXRhLlxuICAgKi9cbiAgZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0OiBEYXRhcG9pbnRzRXhjZWVkaW5nTGltaXRbXSA9IFtdO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW55IG9mIERhdGFUb0V4cG9ydCBvYmplY3RzIHRpbWVWYWx1ZU1hcCBwcm9wZXJ0eSBpcyBub3QgdW5kZWZpbmVkIChzZXJpZXMgZGF0YSlcbiAgICogb3IgZGF0YVBvaW50VG9FeHBvcnQgaXMgbm90IHVuZGVmaW5lZCBhdCBhbGwgKG1lYXN1cmVtZW50IGRhdGEpLlxuICAgKi9cblxuICBoYXNGZXRjaGVkRGF0YUFueVZhbHVlc1RvRXhwb3J0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGVyZSBpcyBubyBleHBvcnRhYmxlIGRhdGEgYmVjYXVzZSB0aGUgZGF0ZSByYW5nZSBvZiBhbGwgc2VsZWN0ZWQgZGF0YXBvaW50cyBleGNlZWRzIDEsMDAwLDAwMCByZWNvcmRzLlxuICAgKi9cbiAgaGFzTm9FeHBvcnRhYmxlRGF0YTogYm9vbGVhbjtcblxuICBoYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzID0gZmFsc2U7XG5cbiAgaXNQcmV2aWV3TG9hZGluZyA9IHRydWU7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVsbCBvciBjb21wYWN0IHR5cGUgb2YgZXhwb3J0IGlzIHNlbGVjdGVkLlxuICAgKiBGdWxsIHR5cGUgb2YgZXhwb3J0IGlzIGJhc2VkIG9uIG1lYXN1cmVtZW50IEFQSSBkYXRhLlxuICAgKiBDb21wYWN0IHR5cGUgb2YgZXhwb3J0IGlzIGJhc2VkIG9uIHNlcmllcyBBUEkgZGF0YS5cbiAgICovXG4gIGlzRnVsbFR5cGVPZkV4cG9ydCA9IGZhbHNlO1xuXG4gIHByZXZpZXdUYWJsZURhdGE6IEV4cG9ydERhdGFbXTtcblxuICBsaW1pdEV4Y2VlZGVkTWVzc2FnZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250YWlucyBwcm9jZXNzZWQgZGF0YSB0aGF0IGlzIHByZXBhcmVkIHRvIGJlIGV4cG9ydGVkIGlmIHNlcmllcyBkYXRhIHdhcyBmZXRjaGVkXG4gICAqIG9yIHNob3duIGluIHRoZSBwcmV2aWV3IHRhYmxlIGluIGNhc2Ugb2YgbWVhc3VyZW1lbnRzIGRhdGEuXG4gICAqL1xuICBwcml2YXRlIGRhdGFUb0V4cG9ydDogRGF0YVRvRXhwb3J0W107XG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgZGF0YXBvaW50cyB0aGF0IHNlbGVjdGVkIGRhdGUgcmFuZ2UgZXhjZWVkcyBBUEkgbGltaXQgb2YgMV8wMDBfMDAwIHJlY29yZHMuXG4gICAqL1xuICBwcml2YXRlIGRhdGFQb2ludHNFeGNlZWRpbmdPbmVNaWxsaW9uTGltaXQ6IERhdGFwb2ludHNFeGNlZWRpbmdMaW1pdFtdO1xuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgZmlsZSB0eXBlIHNlbGVjdGlvbiBjaGVja2JveGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWxlVHlwZVNlbGVjdGlvblN0YXRlOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgLyoqXG4gICAqIEhvbGQgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGFnZ3JlZ2F0aW9uIGZyb20gdGhlIGV4cG9ydCBjb25maWcuXG4gICAqIFZhbHVlIHdpbGwgYmUgbG9hZGVkIG9uIGNvbXBvbmVudCBkZXN0cm95LlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsQWdncmVnYXRpb246IEFnZ3JlZ2F0aW9uT3B0aW9uO1xuICAvKipcbiAgICogSG9sZCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgZGF0ZUZyb20gZnJvbSB0aGUgZXhwb3J0IGNvbmZpZy5cbiAgICogVmFsdWUgd2lsbCBiZSBsb2FkZWQgb24gY29tcG9uZW50IGRlc3Ryb3kuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxEYXRlRnJvbTogc3RyaW5nO1xuICAvKipcbiAgICogSG9sZCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgZGF0ZVRvIGZyb20gdGhlIGV4cG9ydCBjb25maWcuXG4gICAqIFZhbHVlIHdpbGwgYmUgbG9hZGVkIG9uIGNvbXBvbmVudCBkZXN0cm95LlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsRGF0ZVRvOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb2xkIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBkYXRhcG9pbnREZXRhaWxzIGZyb20gdGhlIGV4cG9ydCBjb25maWcuXG4gICAqIFNvbWUgbG9naWMgbWF5IGZpbHRlciBvdXQgZGF0YXBvaW50cyBpbiBkYXRhcG9pbnREZXRhaWxzIGFycmF5LCB0aGF0IGV4Y2VlZHMgMV8wMDBfMDAwIGxpbWl0IGZvciBtZWFzdXJlbWVudHMgQVBJLFxuICAgKiBidXQgZnVsbCBsaXN0IGlzIHN0aWxsIG5lZWRlZCB3aGVuIGNvbXBvbmVudCBpcyByZW9wZW5lZC5cbiAgICogVmFsdWUgd2lsbCBiZSBsb2FkZWQgb24gY29tcG9uZW50IGRlc3Ryb3kuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxEYXRhcG9pbnREZXRhaWxzOiBEYXRhcG9pbnREZXRhaWxzW107XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWdncmVnYXRpb24gdmFsdWUgd2FzIGNoYW5nZWQgcHJvZ3JhbW1hdGljYWxseS5cbiAgICogSXQgcHJldmVudHMgYSBjYXNlIHdoZXJlIGZldGNoaW5nIG1heSBiZSB0cmlnZ2VyZWQgdHdpY2Ugd2hlbiBleHBvcnQgdHlwZSBpcyBjaGFuZ2VkLlxuICAgKiBCb3RoIG9wdGlvbnMgYWxvbmUgY2FuIHRyaWdnZXIgZmV0Y2hpbmcgZGF0YS5cbiAgICovXG4gIHByaXZhdGUgaXNBZ2dyZWdhdGlvbkNoYW5nZWRQcm9ncmFtbWF0aWNhbGx5ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbnkgb2YgdGhlIGV4cG9ydCBmaWxlIHR5cGVzIChDU1YsIEV4Y2VsKSBhcmUgY2hlY2tlZC5cbiAgICovXG4gIHByaXZhdGUgaXNBbnlPZkV4cG9ydEZpbGVUeXBlQ2hlY2tlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZGF0ZUZyb21TdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBwcml2YXRlIGRhdGVUb1N1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGR5bmFtaWNGaWxlc1R5cGVNZXRhZGF0YTogeyBba2V5OiBzdHJpbmddOiBGaWxlVHlwZU1ldGFkYXRhIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRhdGFwb2ludHNFeHBvcnRNb2RhbFNlcnZpY2U6IERhdGFQcm9jZXNzaW5nU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2U6IERhdGFGZXRjaGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlOiBEYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JGaWxlRXhwb3J0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIEBJbmplY3QoRklMRV9HRU5FUkFUT1JTKSBwcml2YXRlIGdlbmVyYXRvcnM6IEZpbGVHZW5lcmF0b3JbXVxuICApIHtcbiAgICB0aGlzLnNldEZpbGVzVHlwZSh0aGlzLmdlbmVyYXRvcnMpO1xuXG4gICAgdGhpcy5kYXRlRnJvbVN1YmplY3RcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgzMDApLCB0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKHVwZGF0ZWREYXRlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVEYXRlQW5kRmV0Y2hEYXRhKCdkYXRlRnJvbScsIHVwZGF0ZWREYXRlKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5kYXRlVG9TdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jICh1cGRhdGVkRGF0ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRGF0ZUFuZEZldGNoRGF0YSgnZGF0ZVRvJywgdXBkYXRlZERhdGUpO1xuICAgICAgfSk7XG4gIH1cblxuICBzZXRGaWxlc1R5cGUoZ2VuZXJhdG9yczogRmlsZUdlbmVyYXRvcltdKSB7XG4gICAgZ2VuZXJhdG9ycy5mb3JFYWNoKGcgPT4ge1xuICAgICAgdGhpcy5keW5hbWljRmlsZXNUeXBlTWV0YWRhdGFbZy5nZXRUeXBlKCldID0ge1xuICAgICAgICBsYWJlbDogZy5nZXRMYWJlbCgpLFxuICAgICAgICBpY29uOiBnLmdldEljb24oKSxcbiAgICAgICAgdGl0bGU6IGcuZ2V0VGl0bGUoKSxcbiAgICAgICAgZXh0ZW5zaW9uOiBnLmdldEZpbGVFeHRlbnNpb24oKSxcbiAgICAgICAgemlwTmFtZTogZy5nZXRaaXBOYW1lKCksXG4gICAgICAgIHR5cGU6IGcuZ2V0VHlwZSgpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlc1Blcm1pdHRlZFRvUmVhZDogc3RyaW5nW10gPVxuICAgICAgYXdhaXQgdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JTZXJ2aWNlLmdldFNvdXJjZXNXaXRoUGVybWlzc2lvbnNUb1JlYWQoXG4gICAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHNcbiAgICAgICk7XG5cbiAgICBpZiAoc291cmNlc1Blcm1pdHRlZFRvUmVhZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlc1Blcm1pdHRlZFRvUmVhZC5sZW5ndGggIT09IHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzID0gdGhpcy5leHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscy5maWx0ZXIoZGF0YVBvaW50ID0+XG4gICAgICAgIHNvdXJjZXNQZXJtaXR0ZWRUb1JlYWQuaW5jbHVkZXMoU3RyaW5nKGRhdGFQb2ludC5zb3VyY2UpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmhhc1Blcm1pc3Npb25Ub1JlYWRBbnlNZWFzdXJlbWVudHMgPSB0cnVlO1xuXG4gICAgdGhpcy5zdG9yZUluaXRpYWxDaGFuZ2VhYmxlQ29uZmlnKCk7XG5cbiAgICB0aGlzLmZpbGVUeXBlU2VsZWN0aW9uU3RhdGUgPSB0aGlzLmdldEluaXRpYWxTZWxlY3Rpb24odGhpcy5keW5hbWljRmlsZXNUeXBlTWV0YWRhdGEsIFswXSk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuY3JlYXRlRm9ybSgpO1xuICAgIHRoaXMuZGF0YVRvRXhwb3J0ID0gYXdhaXQgdGhpcy5kYXRhcG9pbnRzRXhwb3J0U2VsZWN0b3JTZXJ2aWNlLmZldGNoQW5kUHJlcGFyZURhdGFUb0V4cG9ydChcbiAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLFxuICAgICAgdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnRcbiAgICApO1xuXG4gICAgdGhpcy5oYW5kbGVEYXRlU2VsZWN0b3JDaGFuZ2VzKCk7XG4gICAgdGhpcy5kZXRlcm1pbmVTaG93aW5nUHJldmlld09yRW1wdHlTdGF0ZSgpO1xuICAgIHRoaXMuaGFuZGxlRXhwb3J0TW9kZUNoYW5nZXMoKTtcbiAgICB0aGlzLmhhbmRsZUZpbGVUeXBlU2VsZWN0aW9uQ2hhbmdlcygpO1xuICAgIHRoaXMuaGFuZGxlRm9ybVZhbGlkYXRpb25DaGFuZ2VzKCk7XG5cbiAgICB0aGlzLnVwZGF0ZUZpbGVUeXBlQ29udHJvbCgpO1xuXG4gICAgdGhpcy51cGRhdGVEaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9uc1N0YXRlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5sb2FkSW5pdGlhbENoYW5nZWFibGVDb25maWcoKTtcbiAgfVxuXG4gIGFzeW5jIGV4cG9ydEFuZERvd25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGVFeHBvcnRzOiBGaWxlRXhwb3J0Q29uZmlnW10gPSBPYmplY3QuZW50cmllcyh0aGlzLmR5bmFtaWNGaWxlc1R5cGVNZXRhZGF0YSkubWFwKFxuICAgICAgKFtfLCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGZpbGVUeXBlOiB2YWx1ZS50eXBlIGFzIHN0cmluZyxcbiAgICAgICAgemlwTmFtZTogdmFsdWUuemlwTmFtZVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRGaWxlRXhwb3J0cyA9IHRoaXMuZ2V0T25seVNlbGVjdGVkRmlsZUV4cG9ydHMoZmlsZUV4cG9ydHMpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzZWxlY3RlZEZpbGVFeHBvcnRzLm1hcChhc3luYyAoeyBmaWxlVHlwZSwgemlwTmFtZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCB0aGlzLmV4cG9ydEZpbGUoZmlsZVR5cGUpO1xuICAgICAgICBhd2FpdCB0aGlzLmRvd25sb2FkRmlsZShibG9iLCBmaWxlVHlwZSwgemlwTmFtZSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlclNlcnZpY2UuY2xlYW51cENhY2hlZERhdGEoKTtcbiAgfVxuXG4gIGdldE9ubHlTZWxlY3RlZEZpbGVFeHBvcnRzKGZpbGVFeHBvcnRzOiBGaWxlRXhwb3J0Q29uZmlnW10pOiBGaWxlRXhwb3J0Q29uZmlnW10ge1xuICAgIHJldHVybiBmaWxlRXhwb3J0cy5maWx0ZXIoZiA9PiB0aGlzLmZpbGVUeXBlU2VsZWN0aW9uU3RhdGVbZi5maWxlVHlwZV0gPT09IHRydWUpO1xuICB9XG5cbiAgYXN5bmMgZXhwb3J0RmlsZShmaWxlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxCbG9iIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydFxuICAgICAgPyBhd2FpdCB0aGlzLmV4cG9ydE1lYXN1cmVtZW50RmlsZShmaWxlVHlwZSlcbiAgICAgIDogYXdhaXQgdGhpcy5leHBvcnRTZXJpZXNGaWxlKGZpbGVUeXBlKTtcbiAgfVxuXG4gIGFzeW5jIGRvd25sb2FkRmlsZShcbiAgICBibG9iOiBCbG9iIHwgbnVsbCxcbiAgICBmaWxlVHlwZTogc3RyaW5nLFxuICAgIG1lYXN1cmVtZW50c1ppcEZpbGVOYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQgPVxuICAgICAgdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQuZmlsdGVyKFxuICAgICAgICBkYXRhcG9pbnQgPT4gIXRoaXMuZGF0YVBvaW50c0V4Y2VlZGluZ09uZU1pbGxpb25MaW1pdC5pbmNsdWRlcyhkYXRhcG9pbnQpXG4gICAgICApO1xuXG4gICAgY29uc3Qgc2hvdWxkU2hvd0FsZXJ0ID0gdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQubGVuZ3RoID4gMDtcblxuICAgIC8vIEhhbmRsZXMgYSBjYXNlIHdoZXJlIGFsbCBmaWxlcyBhcmUgc2VudCBieSBlbWFpbC5cbiAgICBpZiAoIWJsb2IgJiYgc2hvdWxkU2hvd0FsZXJ0KSB7XG4gICAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2Uuc2hvd1NlbmRWaWFFbWFpbEluZm9BbGVydChcbiAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgIHRoaXMuZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChibG9iKSB7XG4gICAgICAvLyBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHNvbWUgb2YgdGhlIGZpbGVzIGFyZSBzZW50IGJ5IGVtYWlsLlxuICAgICAgaWYgKHNob3VsZFNob3dBbGVydCkge1xuICAgICAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2Uuc2hvd1NlbmRWaWFFbWFpbEluZm9BbGVydChcbiAgICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgICB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydFxuICAgICAgICA/IHNhdmVBcyhibG9iLCBtZWFzdXJlbWVudHNaaXBGaWxlTmFtZSlcbiAgICAgICAgOiBzYXZlQXMoYmxvYiwgYmxvYltTRVJJRVNfREFUQV9NRVJHRURfRklMRV9OQU1FXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgYSBtZWFzdXJlbWVudCBmaWxlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICpcbiAgICogTWVhc3VyZW1lbnRzIEFQSSBkb2VzIHByb3ZpZGUgYSB3YXkgdG8gZmV0Y2ggYSBwcmVwcm9jZXNzZWQgQ1NWL0V4Y2VsIGZpbGUuXG4gICAqXG4gICAqIEF0IHRoaXMgcG9pbnQgYSBiYWNrZWQgZmlsZSBuZWVkcyB0byBiZSBmZXRjaGVkLlxuICAgKiBNZWFzdXJlbWVudCBkYXRhIHVzZWQgZm9yIGEgcHJldmlldyBjb250YWlucyBqdXN0IDUgZmlyc3QgcmVjb3Jkc1xuICAgKiBhbmQgaXQncyBub3QgZmV0Y2hlZCB3aXRoIENTVi9FeGNlbCBoZWFkZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZVR5cGUgLSBUaGUgdHlwZSBvZiBmaWxlIHRvIGV4cG9ydC5cbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBCbG9iIHJlcHJlc2VudGluZyB0aGUgZXhwb3J0ZWQgZmlsZSBvciBudWxsIHdoZW4gbm8gZGF0YSB0byBleHBvcnQgb3IgaXQncyBzZW50IHZpYSBlbWFpbC5cbiAgICovXG4gIGFzeW5jIGV4cG9ydE1lYXN1cmVtZW50RmlsZShmaWxlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxCbG9iPiB8IG51bGwge1xuICAgIGNvbnN0IHsgYWNjZXB0VHlwZSwgZXh0ZW5zaW9uIH0gPSB0aGlzLmRhdGFwb2ludHNFeHBvcnRNb2RhbFNlcnZpY2UuZmlsZVR5cGVzQ29uZmlnc1tmaWxlVHlwZV07XG5cbiAgICBjb25zdCB1cGRhdGVkRXhwb3J0Q29uZmlnOiBFeHBvcnRDb25maWcgPSB0aGlzLmV4Y2x1ZGVEYXRhcG9pbnRzVGhhdEV4Y2VlZHNBcGlMaW1pdChcbiAgICAgIHRoaXMuZXhwb3J0Q29uZmlnXG4gICAgKTtcblxuICAgIGNvbnN0IGRhdGFUb0V4cG9ydDogRGF0YVRvRXhwb3J0V2l0aEJhY2tlbmRDcmVhdGVkRmlsZVtdID1cbiAgICAgIGF3YWl0IHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yU2VydmljZS5mZXRjaE1lYXN1cmVtZW50RGF0YUZpbGVzQW5kUGFpcldpdGhTb3VyY2VEZXRhaWxzKFxuICAgICAgICBhY2NlcHRUeXBlLFxuICAgICAgICB1cGRhdGVkRXhwb3J0Q29uZmlnXG4gICAgICApO1xuXG4gICAgY29uc3QgaXNBbGxVbmRlZmluZWQgPSBkYXRhVG9FeHBvcnQuZXZlcnkoZGF0YSA9PiBkYXRhID09PSB1bmRlZmluZWQpO1xuICAgIGlmIChpc0FsbFVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yRmlsZUV4cG9ydGVyU2VydmljZS5nZXRNZWFzdXJlbWVudEV4cG9ydGVkRGF0YUJsb2IoXG4gICAgICBleHRlbnNpb24sXG4gICAgICBkYXRhVG9FeHBvcnRcbiAgICApO1xuICB9XG5cbiAgZXhjbHVkZURhdGFwb2ludHNUaGF0RXhjZWVkc0FwaUxpbWl0KGV4cG9ydENvbmZpZzogRXhwb3J0Q29uZmlnKTogRXhwb3J0Q29uZmlnIHtcbiAgICBjb25zdCBza2lwcGVkRGF0YXBvaW50c1NvdXJjZTogc3RyaW5nW10gPSB0aGlzLmRhdGFQb2ludHNFeGNlZWRpbmdPbmVNaWxsaW9uTGltaXQubWFwKFxuICAgICAgZGF0YXBvaW50ID0+IGRhdGFwb2ludC5kYXRhcG9pbnREZXRhaWwuc291cmNlLnRvU3RyaW5nKClcbiAgICApO1xuXG4gICAgY29uc3QgZmlsdGVyZWREYXRhcG9pbnRzOiBEYXRhcG9pbnREZXRhaWxzW10gPSBleHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscy5maWx0ZXIoXG4gICAgICBkYXRhcG9pbnQgPT4gIXNraXBwZWREYXRhcG9pbnRzU291cmNlLmluY2x1ZGVzKFN0cmluZyhkYXRhcG9pbnQuc291cmNlKSlcbiAgICApO1xuXG4gICAgZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMgPSBmaWx0ZXJlZERhdGFwb2ludHM7XG4gICAgcmV0dXJuIGV4cG9ydENvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBzZXJpZXMgZGF0YSB0byBhIGZpbGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgKlxuICAgKiBTZXJpZXMgQVBJIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gZmV0Y2ggYSBwcmVwcm9jZXNzZWQgQ1NWL0V4Y2VsIGZpbGUuXG4gICAqXG4gICAqIFNlcmllcyBkYXRhIHVzZWQgZm9yIGV4cG9ydGluZyBhIGZpbGUgaXMgYWxyZWFkeSBmZXRjaGVkIGZvciBhIHByZXZpZXdcbiAgICogYW5kIGNhbiBiZSByZXVzZWQgZm9yIGV4cG9ydGluZy5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVUeXBlIC0gVGhlIHR5cGUgb2YgZmlsZSB0byBleHBvcnQgKGUuZy4sIENTViwgRXhjZWwpLlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIEJsb2IgcmVwcmVzZW50aW5nIHRoZSBleHBvcnRlZCBmaWxlLlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0U2VyaWVzRmlsZShmaWxlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxCbG9iPiB7XG4gICAgY29uc3QgbWVyZ2VkRXhwb3J0RGV0YWlsczogTWVyZ2VkRXhwb3J0RGV0YWlscyA9IHtcbiAgICAgIGFnZ3JlZ2F0aW9uOiB0aGlzLmV4cG9ydENvbmZpZy5hZ2dyZWdhdGlvbixcbiAgICAgIGRhdGVGcm9tOiB0aGlzLmV4cG9ydENvbmZpZy5kYXRlRnJvbSxcbiAgICAgIGRhdGVUbzogdGhpcy5leHBvcnRDb25maWcuZGF0ZVRvXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlclNlcnZpY2UuZ2V0U2VyaWVzRXhwb3J0ZWREYXRhQmxvYihcbiAgICAgIGZpbGVUeXBlLFxuICAgICAgdGhpcy5kYXRhVG9FeHBvcnQsXG4gICAgICBtZXJnZWRFeHBvcnREZXRhaWxzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG9uQWdncmVnYXRpb25DaGFuZ2UoYWdncmVnYXRpb246IEFnZ3JlZ2F0aW9uT3B0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5leHBvcnRDb25maWcuYWdncmVnYXRpb24gPSBhZ2dyZWdhdGlvbjtcbiAgICBpZiAoIXRoaXMuaXNBZ2dyZWdhdGlvbkNoYW5nZWRQcm9ncmFtbWF0aWNhbGx5KSB7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZUV4cG9ydENvbmZpZ0FuZEZldGNoRGF0YSgpO1xuICAgICAgdGhpcy51cGRhdGVEb3dubG9hZEJ1dHRvblN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgb25EYXRlRnJvbUNoYW5nZSh1cGRhdGVkRGF0ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlRnJvbVN1YmplY3QubmV4dCh1cGRhdGVkRGF0ZSk7XG4gIH1cblxuICBvbkRhdGVUb0NoYW5nZSh1cGRhdGVkRGF0ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlVG9TdWJqZWN0Lm5leHQodXBkYXRlZERhdGUpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRGF0ZUFuZEZldGNoRGF0YShcbiAgICBkYXRlVHlwZTogJ2RhdGVGcm9tJyB8ICdkYXRlVG8nLFxuICAgIHVwZGF0ZWREYXRlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5leHBvcnRDb25maWdbZGF0ZVR5cGVdID0gdXBkYXRlZERhdGU7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVFeHBvcnRDb25maWdBbmRGZXRjaERhdGEoKTtcblxuICAgIGlmICh0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydCkge1xuICAgICAgYXdhaXQgdGhpcy5kZXRlcm1pbmVJZk1lYXN1cmVtZW50UmVzcG9uc2VXaWxsQmVQcm9jZXNzZWRCeUJhY2tlbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVEb3dubG9hZEJ1dHRvblN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25FeHBvcnRUeXBlQ2hhbmdlKGV4cG9ydFR5cGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChleHBvcnRUeXBlID09PSBFWFBPUlRfTU9ERV9WQUxVRVMuZnVsbCkge1xuICAgICAgdGhpcy5pc0FnZ3JlZ2F0aW9uQ2hhbmdlZFByb2dyYW1tYXRpY2FsbHkgPSB0cnVlO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuYWdncmVnYXRpb24uc2V0VmFsdWUoQUdHUkVHQVRJT05fVkFMVUVTLm5vbmUpO1xuICAgICAgdGhpcy5pc0FnZ3JlZ2F0aW9uQ2hhbmdlZFByb2dyYW1tYXRpY2FsbHkgPSBmYWxzZTtcblxuICAgICAgdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnQgPSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVFeHBvcnRDb25maWdBbmRGZXRjaERhdGEoKTtcbiAgICAgIGF3YWl0IHRoaXMuZGV0ZXJtaW5lSWZNZWFzdXJlbWVudFJlc3BvbnNlV2lsbEJlUHJvY2Vzc2VkQnlCYWNrZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldEZ1bGxFeHBvcnRSZWxhdGVkUHJvcGVydGllcygpO1xuICAgIHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0ID0gZmFsc2U7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVFeHBvcnRDb25maWdBbmRGZXRjaERhdGEoKTtcblxuICAgIHRoaXMudXBkYXRlRGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnNTdGF0ZSgpO1xuXG4gICAgdGhpcy51cGRhdGVEb3dubG9hZEJ1dHRvblN0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURpc2FibGVkQWdncmVnYXRpb25PcHRpb25zU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucyA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlclNlcnZpY2UudXBkYXRlRGlzYWJsZWRTdGF0ZU9mQWdncmVnYXRpb25PcHRpb25FbnRyaWVzKFxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS52YWx1ZSxcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZVRvLnZhbHVlLFxuICAgICAgICB0aGlzLmRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKFxuICAgICAge1xuICAgICAgICBkYXRlRnJvbTogbmV3IEZvcm1Db250cm9sKHRoaXMuZXhwb3J0Q29uZmlnLmRhdGVGcm9tKSxcbiAgICAgICAgZGF0ZVRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5leHBvcnRDb25maWcuZGF0ZVRvKSxcbiAgICAgICAgYWdncmVnYXRpb246IG5ldyBGb3JtQ29udHJvbChcbiAgICAgICAgICB0aGlzLmV4cG9ydENvbmZpZy5hZ2dyZWdhdGlvbiA/IHRoaXMuZXhwb3J0Q29uZmlnLmFnZ3JlZ2F0aW9uIDogQUdHUkVHQVRJT05fVkFMVUVTLm5vbmVcbiAgICAgICAgKSxcbiAgICAgICAgZXhwb3J0TW9kZTogbmV3IEZvcm1Db250cm9sKEVYUE9SVF9NT0RFX1ZBTFVFUy5jb21wYWN0KSxcbiAgICAgICAgZmlsZVR5cGVzOiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKFxuICAgICAgICAgIHRoaXMuZ2VuZXJhdG9ycy5yZWR1Y2UoKGEsIGMpID0+IHtcbiAgICAgICAgICAgIGFbYy5nZXRUeXBlKCldID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgICB9LCB7fSlcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdG9yczogW2RhdGVSYW5nZVZhbGlkYXRvcl1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlUHJldmlldygpOiB2b2lkIHtcbiAgICB0aGlzLmlzUHJldmlld0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMucHJldmlld1RhYmxlRGF0YSA9XG4gICAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRNb2RhbFNlcnZpY2UudHJhbnNmb3JtVG9FeHBvcnRGaWxlU3RydWN0dXJlRm9yUHJldmlldyh0aGlzLmRhdGFUb0V4cG9ydCk7XG4gICAgdGhpcy5pc1ByZXZpZXdMb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURhdGVTZWxlY3RvckNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3QgYWdncmVnYXRpb25Db250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuYWdncmVnYXRpb247XG4gICAgY29uc3QgZGF0ZUZyb21TZWxlY3RvciA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVGcm9tO1xuICAgIGNvbnN0IGRhdGVUb1NlbGVjdG9yID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZVRvO1xuXG4gICAgY29uc3QgdXBkYXRlQWdncmVnYXRpb25PcHRpb25zID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydCkge1xuICAgICAgICB0aGlzLnVwZGF0ZURpc2FibGVkQWdncmVnYXRpb25PcHRpb25zU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBmaXJzdEF2YWlsYWJsZUFnZ3JlZ2F0aW9uVmFsdWU6IEFnZ3JlZ2F0aW9uT3B0aW9uID1cbiAgICAgICAgICB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvckZpbGVFeHBvcnRlclNlcnZpY2Uuc2V0VG9GaXJzdEF2YWlsYWJsZUFnZ3JlZ2F0aW9uT3B0aW9uSWZDdXJyZW50SXNEaXNhYmxlZChcbiAgICAgICAgICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC52YWx1ZSxcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbk9wdGlvbnNcbiAgICAgICAgICApO1xuXG4gICAgICAgIGlmIChmaXJzdEF2YWlsYWJsZUFnZ3JlZ2F0aW9uVmFsdWUpIHtcbiAgICAgICAgICBhZ2dyZWdhdGlvbkNvbnRyb2wuc2V0VmFsdWUoZmlyc3RBdmFpbGFibGVBZ2dyZWdhdGlvblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBtZXJnZShkYXRlRnJvbVNlbGVjdG9yLnZhbHVlQ2hhbmdlcywgZGF0ZVRvU2VsZWN0b3IudmFsdWVDaGFuZ2VzKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSh1cGRhdGVBZ2dyZWdhdGlvbk9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFeHBvcnRNb2RlQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCBhZ2dyZWdhdGlvbkNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5hZ2dyZWdhdGlvbjtcblxuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmV4cG9ydE1vZGUudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKGV4cG9ydE1vZGVWYWx1ZSA9PiB7XG4gICAgICAgIGlmIChleHBvcnRNb2RlVmFsdWUudG9TdHJpbmcoKSA9PT0gRVhQT1JUX01PREVfVkFMVUVTLmZ1bGwpIHtcbiAgICAgICAgICBhZ2dyZWdhdGlvbkNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFnZ3JlZ2F0aW9uQ29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZpbGVUeXBlU2VsZWN0aW9uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5maWxlVHlwZXMudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKGZpbGVUeXBlc1NlbGVjdGlvblN0YXRlID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVGaWxlVHlwZVNlbGVjdGlvblN0YXRlKGZpbGVUeXBlc1NlbGVjdGlvblN0YXRlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWxlVHlwZVNlbGVjdGlvblN0YXRlKGNoZWNrYm94ZXNTdGF0ZTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICB0aGlzLmlzQW55T2ZFeHBvcnRGaWxlVHlwZUNoZWNrZWQgPSBPYmplY3QudmFsdWVzKGNoZWNrYm94ZXNTdGF0ZSkuc29tZShcbiAgICAgIHZhbHVlID0+IHZhbHVlID09PSB0cnVlXG4gICAgKTtcbiAgICB0aGlzLmZpbGVUeXBlU2VsZWN0aW9uU3RhdGUgPSBjaGVja2JveGVzU3RhdGU7XG4gICAgdGhpcy51cGRhdGVEb3dubG9hZEJ1dHRvblN0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZvcm1WYWxpZGF0aW9uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5zdGF0dXNDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVEb3dubG9hZEJ1dHRvblN0YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbGVUeXBlQ29udHJvbCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlVHlwZXNDb250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZmlsZVR5cGVzO1xuICAgIGlmIChmaWxlVHlwZXNDb250cm9sKSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBmaWxlVHlwZXNDb250cm9sLnZhbHVlIHx8IHt9O1xuICAgICAgY29uc3QgdXBkYXRlZFZhbHVlID0geyAuLi5jdXJyZW50VmFsdWUgfTtcblxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5maWxlVHlwZVNlbGVjdGlvblN0YXRlKS5mb3JFYWNoKChbZmlsZVR5cGUsIGlzU2VsZWN0ZWRdKSA9PiB7XG4gICAgICAgIGlmIChmaWxlVHlwZSBpbiBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICB1cGRhdGVkVmFsdWVbZmlsZVR5cGVdID0gaXNTZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZpbGVUeXBlc0NvbnRyb2wucGF0Y2hWYWx1ZSh1cGRhdGVkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGV0ZXJtaW5lU2hvd2luZ1ByZXZpZXdPckVtcHR5U3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzRGF0YVRvU2hvdyA9IHRoaXMuZGF0YVRvRXhwb3J0LnNvbWUoZGF0YVRvRXhwb3J0SXRlbSA9PlxuICAgICAgdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnRcbiAgICAgICAgPyAhIWRhdGFUb0V4cG9ydEl0ZW1cbiAgICAgICAgOiBkYXRhVG9FeHBvcnRJdGVtLnRpbWVWYWx1ZU1hcCAmJiBPYmplY3Qua2V5cyhkYXRhVG9FeHBvcnRJdGVtLnRpbWVWYWx1ZU1hcCkubGVuZ3RoID4gMFxuICAgICk7XG5cbiAgICB0aGlzLmhhc0ZldGNoZWREYXRhQW55VmFsdWVzVG9FeHBvcnQgPSBoYXNEYXRhVG9TaG93O1xuXG4gICAgaWYgKGhhc0RhdGFUb1Nob3cpIHtcbiAgICAgIHRoaXMucHJlcGFyZVByZXZpZXcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc1ByZXZpZXdMb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZXRlcm1pbmVJZk1lYXN1cmVtZW50UmVzcG9uc2VXaWxsQmVQcm9jZXNzZWRCeUJhY2tlbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc1ByZXZpZXdMb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0ID1cbiAgICAgIGF3YWl0IHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yU2VydmljZS5nZXREYXRhcG9pbnRzRXhjZWVkaW5nTGltaXQodGhpcy5leHBvcnRDb25maWcpO1xuXG4gICAgY29uc3QgeyBicm93c2VyRG93bmxvYWRhYmxlQ291bnQsIGVtYWlsRGVsaXZlcmFibGVDb3VudCwgbm9uUmV0cmlldmFibGVDb3VudCB9ID1cbiAgICAgIHRoaXMuY2FsY3VsYXRlRGF0YXBvaW50Q291bnRzKCk7XG5cbiAgICB0aGlzLmhhc05vRXhwb3J0YWJsZURhdGEgPVxuICAgICAgYnJvd3NlckRvd25sb2FkYWJsZUNvdW50ID09PSAwICYmIGVtYWlsRGVsaXZlcmFibGVDb3VudCA9PT0gMCAmJiBub25SZXRyaWV2YWJsZUNvdW50ID4gMDtcblxuICAgIGlmICh0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5sZW5ndGggPiAwICYmICF0aGlzLmhhc05vRXhwb3J0YWJsZURhdGEpIHtcbiAgICAgIHRoaXMubGltaXRFeGNlZWRlZE1lc3NhZ2UgPSB0aGlzLmRhdGFwb2ludHNFeHBvcnRTZWxlY3RvclNlcnZpY2UuZ2V0TGltaXRFeGNlZWRlZE1lc3NhZ2UoXG4gICAgICAgIHRoaXMuaGFzTm9FeHBvcnRhYmxlRGF0YSxcbiAgICAgICAgZW1haWxEZWxpdmVyYWJsZUNvdW50LFxuICAgICAgICBicm93c2VyRG93bmxvYWRhYmxlQ291bnQsXG4gICAgICAgIG5vblJldHJpZXZhYmxlQ291bnQsXG4gICAgICAgIHRoaXMuZXhwb3J0Q29uZmlnLmRhdGFwb2ludERldGFpbHMubGVuZ3RoXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5sZW5ndGggPiAwICYmIHRoaXMuaGFzTm9FeHBvcnRhYmxlRGF0YSkge1xuICAgICAgdGhpcy5saW1pdEV4Y2VlZGVkTWVzc2FnZSA9IHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yU2VydmljZS5nZXRMaW1pdEV4Y2VlZGVkTWVzc2FnZShcbiAgICAgICAgdGhpcy5oYXNOb0V4cG9ydGFibGVEYXRhXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpO1xuXG4gICAgdGhpcy5pc1ByZXZpZXdMb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZURhdGFwb2ludENvdW50cygpOiBEYXRhcG9pbnRDb3VudHMge1xuICAgIGNvbnN0IFJFQ09SRF9BUElfTElNSVQgPSAxXzAwMF8wMDA7XG5cbiAgICB0aGlzLmRhdGFQb2ludHNFeGNlZWRpbmdPbmVNaWxsaW9uTGltaXQgPSB0aGlzLmRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5maWx0ZXIoXG4gICAgICBkYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQgPT5cbiAgICAgICAgZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0LnRvdGFsRWxlbWVudHMgPiBSRUNPUkRfQVBJX0xJTUlUXG4gICAgKTtcblxuICAgIGNvbnN0IG5vblJldHJpZXZhYmxlQ291bnQgPSB0aGlzLmRhdGFQb2ludHNFeGNlZWRpbmdPbmVNaWxsaW9uTGltaXQubGVuZ3RoO1xuXG4gICAgY29uc3QgZW1haWxEZWxpdmVyYWJsZUNvdW50ID1cbiAgICAgIHRoaXMuZGF0YXBvaW50c0V4Y2VlZGluZ0Jyb3dzZXJEb3dubG9hZExpbWl0Lmxlbmd0aCAtIG5vblJldHJpZXZhYmxlQ291bnQ7XG5cbiAgICBjb25zdCBicm93c2VyRG93bmxvYWRhYmxlQ291bnQgPVxuICAgICAgdGhpcy5leHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscy5sZW5ndGggLSBlbWFpbERlbGl2ZXJhYmxlQ291bnQgLSBub25SZXRyaWV2YWJsZUNvdW50O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJyb3dzZXJEb3dubG9hZGFibGVDb3VudCxcbiAgICAgIGVtYWlsRGVsaXZlcmFibGVDb3VudCxcbiAgICAgIG5vblJldHJpZXZhYmxlQ291bnRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9yZUluaXRpYWxDaGFuZ2VhYmxlQ29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbERhdGVGcm9tID0gdGhpcy5leHBvcnRDb25maWcuZGF0ZUZyb207XG4gICAgdGhpcy5pbml0aWFsRGF0ZVRvID0gdGhpcy5leHBvcnRDb25maWcuZGF0ZVRvO1xuICAgIHRoaXMuaW5pdGlhbERhdGFwb2ludERldGFpbHMgPSB0aGlzLmV4cG9ydENvbmZpZy5kYXRhcG9pbnREZXRhaWxzO1xuICAgIGlmICghdGhpcy5pc0Z1bGxUeXBlT2ZFeHBvcnQpIHtcbiAgICAgIHRoaXMuaW5pdGlhbEFnZ3JlZ2F0aW9uID0gdGhpcy5leHBvcnRDb25maWcuYWdncmVnYXRpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkSW5pdGlhbENoYW5nZWFibGVDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5leHBvcnRDb25maWcuZGF0ZUZyb20gPSB0aGlzLmluaXRpYWxEYXRlRnJvbTtcbiAgICB0aGlzLmV4cG9ydENvbmZpZy5kYXRlVG8gPSB0aGlzLmluaXRpYWxEYXRlVG87XG4gICAgdGhpcy5leHBvcnRDb25maWcuZGF0YXBvaW50RGV0YWlscyA9IHRoaXMuaW5pdGlhbERhdGFwb2ludERldGFpbHM7XG4gICAgaWYgKCF0aGlzLmlzRnVsbFR5cGVPZkV4cG9ydCkge1xuICAgICAgdGhpcy5leHBvcnRDb25maWcuYWdncmVnYXRpb24gPSB0aGlzLmluaXRpYWxBZ2dyZWdhdGlvbjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUV4cG9ydENvbmZpZ0FuZEZldGNoRGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAuaW52YWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcmV2aWV3TG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLm9uRG93bmxvYWRCdXR0b25TdGF0ZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB0aGlzLmRhdGFUb0V4cG9ydCA9IGF3YWl0IHRoaXMuZGF0YXBvaW50c0V4cG9ydFNlbGVjdG9yU2VydmljZS5mZXRjaEFuZFByZXBhcmVEYXRhVG9FeHBvcnQoXG4gICAgICB0aGlzLmV4cG9ydENvbmZpZyxcbiAgICAgIHRoaXMuaXNGdWxsVHlwZU9mRXhwb3J0XG4gICAgKTtcblxuICAgIHRoaXMuZGV0ZXJtaW5lU2hvd2luZ1ByZXZpZXdPckVtcHR5U3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRG93bmxvYWRCdXR0b25TdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjYW5FbmFibGVEb3dubG9hZEJ1dHRvbiA9XG4gICAgICB0aGlzLmhhc0ZldGNoZWREYXRhQW55VmFsdWVzVG9FeHBvcnQgJiZcbiAgICAgICF0aGlzLmZvcm1Hcm91cC5pbnZhbGlkICYmXG4gICAgICB0aGlzLmlzQW55T2ZFeHBvcnRGaWxlVHlwZUNoZWNrZWQgJiZcbiAgICAgICF0aGlzLmhhc05vRXhwb3J0YWJsZURhdGE7XG5cbiAgICB0aGlzLm9uRG93bmxvYWRCdXR0b25TdGF0ZUNoYW5nZS5lbWl0KGNhbkVuYWJsZURvd25sb2FkQnV0dG9uKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGdWxsRXhwb3J0UmVsYXRlZFByb3BlcnRpZXMoKTogdm9pZCB7XG4gICAgdGhpcy5oYXNOb0V4cG9ydGFibGVEYXRhID0gZmFsc2U7XG4gICAgdGhpcy5kYXRhcG9pbnRzRXhjZWVkaW5nQnJvd3NlckRvd25sb2FkTGltaXQgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5pdGlhbFNlbGVjdGlvbihcbiAgICBmaWxlVHlwZTogeyBba2V5OiBzdHJpbmddOiBGaWxlVHlwZU1ldGFkYXRhIH0sXG4gICAgc2VsZWN0QnlEZWZhdWx0OiBudW1iZXJbXVxuICApIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmlsZVR5cGUpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTZWxlY3Rpb24gPSBrZXlzLnJlZHVjZTx7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfT4oKGFjYywga2V5KSA9PiB7XG4gICAgICBhY2Nba2V5XSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBzZWxlY3RCeURlZmF1bHQuZm9yRWFjaChpbmRleCA9PiB7XG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGtleXMubGVuZ3RoKSB7XG4gICAgICAgIGluaXRpYWxTZWxlY3Rpb25ba2V5c1tpbmRleF1dID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpbml0aWFsU2VsZWN0aW9uO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicC1iLTE2XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNQZXJtaXNzaW9uVG9SZWFkQW55TWVhc3VyZW1lbnRzOyBlbHNlIGhhc05vUm9sZVRvUmVhZEFueU1lYXN1cmVtZW50c1wiPlxuICAgIDxkaXYgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyIHNlcGFyYXRvci1ib3R0b20gc3RpY2t5LXRvcCBiZy1jb21wb25lbnRcIj5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1tZWRpdW0gdGV4dC0xNlwiPlxuICAgICAgICB7eyAnQ29uZmlndXJlIGV4cG9ydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInAtdC0yNCBwLXItMTYgcC1sLTE2IGdhcC04IHAtYi0xNiBmbGV4LXdyYXBcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnc2VwYXJhdG9yLWJvdHRvbSc6IGlzRnVsbFR5cGVPZkV4cG9ydCB9XCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgIDxjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItdGltZS1yYW5nZVxuICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLmhhc1Blcm1pc3Npb25Ub1JlYWRBbnlNZWFzdXJlbWVudHNcIlxuICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICAgICAgICAgICAgKG9uRGF0ZUZyb21DaGFuZ2UpPVwib25EYXRlRnJvbUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkRhdGVUb0NoYW5nZSk9XCJvbkRhdGVUb0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9jOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItdGltZS1yYW5nZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgIDxjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZGF0YS1zY29wZVxuICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLmhhc1Blcm1pc3Npb25Ub1JlYWRBbnlNZWFzdXJlbWVudHNcIlxuICAgICAgICAgICAgW2Rpc2FibGVkQWdncmVnYXRpb25PcHRpb25zXT1cImRpc2FibGVkQWdncmVnYXRpb25PcHRpb25zXCJcbiAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgICAgICAgICAgIChvbkFnZ3JlZ2F0aW9uQ2hhbmdlKT1cIm9uQWdncmVnYXRpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25FeHBvcnRUeXBlQ2hhbmdlKT1cIm9uRXhwb3J0VHlwZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9jOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZGF0YS1zY29wZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgIDxjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItZmlsZS10eXBlc1xuICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLmhhc1Blcm1pc3Npb25Ub1JlYWRBbnlNZWFzdXJlbWVudHNcIlxuICAgICAgICAgICAgW2R5bmFtaWNGaWxlc1R5cGVNZXRhZGF0YV09XCJkeW5hbWljRmlsZXNUeXBlTWV0YWRhdGFcIlxuICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICAgICAgICAgID48L2M4eS1kYXRhcG9pbnRzLWV4cG9ydC1zZWxlY3Rvci1maWxlLXR5cGVzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0lmPVwiIWlzRnVsbFR5cGVPZkV4cG9ydCAmJiAhaGFzRmV0Y2hlZERhdGFBbnlWYWx1ZXNUb0V4cG9ydCAmJiAhaXNQcmV2aWV3TG9hZGluZ1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInAtdC0yNCBwLXItMTYgcC1sLTE2IHAtYi0xNiBzZXBhcmF0b3ItYm90dG9tIGQtZmxleFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nIGNlbnRlci1ibG9ja1wiXG4gICAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgICBkYXRhLWN5PVwiZmlsZS1leHBvcnRlci0tbm8tZGF0YS1hdmFpbGFibGVcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgTm8gZGF0YSBhdmFpbGFibGUuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFwb2ludHNFeGNlZWRpbmdCcm93c2VyRG93bmxvYWRMaW1pdC5sZW5ndGggPiAwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTI0IHAtci0xNiBwLWwtMTYgcC1iLTE2IHNlcGFyYXRvci1ib3R0b20gZC1mbGV4XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICBoYXNOb0V4cG9ydGFibGVEYXRhXG4gICAgICAgICAgICAgID8gJ2FsZXJ0IGFsZXJ0LXdhcm5pbmcgY2VudGVyLWJsb2NrJ1xuICAgICAgICAgICAgICA6ICdhbGVydCBhbGVydC1pbmZvIGNlbnRlci1ibG9jaydcbiAgICAgICAgICBcIlxuICAgICAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJsaW1pdEV4Y2VlZGVkTWVzc2FnZVwiXG4gICAgICAgID48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0Z1bGxUeXBlT2ZFeHBvcnRcIj5cbiAgICAgIDxjOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItcHJldmlld1xuICAgICAgICAqbmdJZj1cInRoaXMuaGFzUGVybWlzc2lvblRvUmVhZEFueU1lYXN1cmVtZW50c1wiXG4gICAgICAgIFtoYXNGZXRjaGVkRGF0YUFueVZhbHVlc1RvRXhwb3J0XT1cImhhc0ZldGNoZWREYXRhQW55VmFsdWVzVG9FeHBvcnRcIlxuICAgICAgICBbaXNQcmV2aWV3TG9hZGluZ109XCJpc1ByZXZpZXdMb2FkaW5nXCJcbiAgICAgICAgW3ByZXZpZXdUYWJsZURhdGFdPVwicHJldmlld1RhYmxlRGF0YVwiXG4gICAgICA+PC9jOHktZGF0YXBvaW50cy1leHBvcnQtc2VsZWN0b3ItcHJldmlldz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy10ZW1wbGF0ZSAjaGFzTm9Sb2xlVG9SZWFkQW55TWVhc3VyZW1lbnRzPlxuICAgIDxkaXYgY2xhc3M9XCJwLXQtMjQgcC1yLTE2IHAtbC0xNiBwLWItMTYgZC1mbGV4XCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBjZW50ZXItYmxvY2tcIlxuICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgPHA+VG8gZXhwb3J0IGRhdGEsIHlvdSBtdXN0IG1lZXQgYXQgbGVhc3Qgb25lIG9mIHRoZXNlIGNyaXRlcmlhOjwvcD5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIEhhdmVcbiAgICAgICAgICAgIDxiPlJFQUQgcGVybWlzc2lvbiBmb3IgXCJNZWFzdXJlbWVudHNcIiBwZXJtaXNzaW9uIHR5cGU8L2I+XG4gICAgICAgICAgICAoZWl0aGVyIGFzIGEgZ2xvYmFsIHJvbGUgb3IgZm9yIHRoZSBzcGVjaWZpYyBzb3VyY2UpXG4gICAgICAgICAgPC9saT5cbiAgICAgICAgICA8bGk+XG4gICAgICAgICAgICBCZSB0aGVcbiAgICAgICAgICAgIDxiPm93bmVyIG9mIHRoZSBzb3VyY2U8L2I+XG4gICAgICAgICAgICB5b3Ugd2FudCB0byBleHBvcnQgZGF0YSBmcm9tXG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgICAgPHA+RG9uJ3QgbWVldCB0aGVzZSByZXF1aXJlbWVudHM/IENvbnRhY3QgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBmb3IgYXNzaXN0YW5jZS48L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19
|