@rivet-health/design-system 40.44.0 → 40.44.2
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/{esm2020 → esm2022}/lib/accessibility/sr-only/sr-only.component.mjs +4 -4
- package/esm2022/lib/download/download.service.mjs +47 -0
- package/{esm2020 → esm2022}/lib/format/pipes/common.mjs +5 -5
- package/{esm2020 → esm2022}/lib/format/pipes/date.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/days.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/dollars.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/number.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/percentage.pipe.mjs +4 -4
- package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +61 -0
- package/esm2022/lib/format/pipes/small-currency.pipe.mjs +24 -0
- package/esm2022/lib/format/pipes/small-number.pipe.mjs +29 -0
- package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +62 -0
- package/esm2022/lib/format/truncate/truncate.component.mjs +51 -0
- package/esm2022/lib/icon/dom-cache.mjs +32 -0
- package/esm2022/lib/icon/icon.component.mjs +86 -0
- package/{esm2020 → esm2022}/lib/icon/icons.mjs +1 -1
- package/{esm2020 → esm2022}/lib/input/alphabetic-field/alphabetic-field.component.mjs +4 -4
- package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +48 -0
- package/esm2022/lib/input/button/button.component.mjs +139 -0
- package/esm2022/lib/input/button-group/button-group.component.mjs +39 -0
- package/{esm2020 → esm2022}/lib/input/calendar/calendar.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/card-checkbox/card-checkbox.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/checkbox/checkbox.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/currency-field/currency-field.component.mjs +4 -4
- package/esm2022/lib/input/date/date.component.mjs +279 -0
- package/esm2022/lib/input/date-range/date-range.component.mjs +477 -0
- package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +47 -0
- package/{esm2020 → esm2022}/lib/input/filter-dropdown/filter-dropdown.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/input/input-label/input-label.component.mjs +4 -4
- package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +745 -0
- package/esm2022/lib/input/number-field/number-field.component.mjs +125 -0
- package/{esm2020 → esm2022}/lib/input/percentage-field/percentage-field.component.mjs +4 -4
- package/esm2022/lib/input/phone-field/phone-field.component.mjs +74 -0
- package/{esm2020 → esm2022}/lib/input/radio/radio.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/search/search.component.mjs +4 -4
- package/esm2022/lib/input/search-select/search-select.component.mjs +189 -0
- package/esm2022/lib/input/select/select/select.component.mjs +178 -0
- package/{esm2020 → esm2022}/lib/input/select/select-node/select-node.component.mjs +4 -4
- package/esm2022/lib/input/select/state.mjs +882 -0
- package/{esm2020 → esm2022}/lib/input/simple-select/option-group.pipe.mjs +4 -4
- package/esm2022/lib/input/simple-select/simple-select.component.mjs +178 -0
- package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +33 -0
- package/esm2022/lib/input/text-field/text-field.component.mjs +115 -0
- package/{esm2020 → esm2022}/lib/input/textarea-field/textarea-field.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/validation-message/validation-message.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/layout/card/card-actions.component.mjs +4 -4
- package/esm2022/lib/layout/card/card-content.component.mjs +64 -0
- package/esm2022/lib/layout/card/card-header.component.mjs +201 -0
- package/{esm2020 → esm2022}/lib/layout/card/card-link.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/layout/card/card-media.component.mjs +4 -4
- package/esm2022/lib/layout/card/card.component.mjs +291 -0
- package/{esm2020 → esm2022}/lib/layout/setting-row/setting-row.component.mjs +4 -4
- package/esm2022/lib/load/loading/loading.component.mjs +43 -0
- package/{esm2020 → esm2022}/lib/load/loading-cover/loading-cover.component.mjs +4 -4
- package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +243 -0
- package/{esm2020 → esm2022}/lib/navigation/link/link.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/navigation/page-header/page-header.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/tabs/tab/tab.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/tabs/tabs/tabs.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/views/edit-view/edit-view.component.mjs +9 -9
- package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +151 -0
- package/esm2022/lib/navigation/views/state.mjs +456 -0
- package/{esm2020 → esm2022}/lib/navigation/views/view-menu/view-menu.component.mjs +5 -5
- package/esm2022/lib/navigation/views/views/views.component.mjs +90 -0
- package/{esm2020 → esm2022}/lib/notification/badge/badge.component.mjs +4 -4
- package/esm2022/lib/notification/banner/banner-action.component.mjs +48 -0
- package/esm2022/lib/notification/banner/banner.component.mjs +61 -0
- package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +50 -0
- package/esm2022/lib/notification/map-indicator/map-indicators.mjs +15 -0
- package/{esm2020 → esm2022}/lib/notification/notification-badge/notification-badge.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/callout.component.mjs +130 -0
- package/esm2022/lib/overlay/callout/callout.helpers.mjs +113 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/help/help.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +69 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +30 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/tooltip/tooltip.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +138 -0
- package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +47 -0
- package/{esm2020 → esm2022}/lib/overlay/modal/dialog-stack.service.mjs +4 -4
- package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +146 -0
- package/esm2022/lib/overlay/modal/modal.component.mjs +31 -0
- package/{esm2020 → esm2022}/lib/overlay/modal/side-sheet/side-sheet.component.mjs +4 -4
- package/esm2022/lib/overlay/overlay-outlet.component.mjs +98 -0
- package/{esm2020 → esm2022}/lib/overlay/overlay.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/overlay.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/toast/toast-action.component.mjs +4 -4
- package/esm2022/lib/overlay/toast/toast.component.mjs +41 -0
- package/{esm2020 → esm2022}/lib/riv.module.mjs +227 -227
- package/esm2022/lib/size/size.directive.mjs +33 -0
- package/esm2022/lib/table/simple-table/coordinate-helper.mjs +61 -0
- package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +36 -0
- package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +37 -0
- package/{esm2020 → esm2022}/lib/table/simple-table/simple-table-row.component.mjs +4 -4
- package/esm2022/lib/table/simple-table/simple-table.component.mjs +104 -0
- package/esm2022/lib/table/table/clipboard.mjs +182 -0
- package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +116 -0
- package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +383 -0
- package/{esm2020 → esm2022}/lib/table/table/state-helpers/display-helpers.mjs +1 -1
- package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +123 -0
- package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +164 -0
- package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +139 -0
- package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +70 -0
- package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +72 -0
- package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +180 -0
- package/esm2022/lib/table/table/state.mjs +1035 -0
- package/esm2022/lib/table/table/table/table.component.mjs +367 -0
- package/{esm2020 → esm2022}/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +5 -5
- package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +227 -0
- package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +134 -0
- package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +35 -0
- package/{esm2020 → esm2022}/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +6 -6
- package/esm2022/lib/table/table/table-search/table-search.component.mjs +71 -0
- package/{esm2020 → esm2022}/lib/table/table/table-search-columns/table-search-columns.component.mjs +4 -4
- package/esm2022/lib/visibility/visibility.directive.mjs +34 -0
- package/esm2022/lib/visualization/chart/chart-scaling.mjs +380 -0
- package/esm2022/lib/visualization/chart/chart.component.mjs +626 -0
- package/esm2022/lib/visualization/chart/chart.mjs +3768 -0
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-cell.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-header-cell.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-row.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/donut/donut.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/funnel-chart/funnel-chart.component.mjs +5 -5
- package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +33 -0
- package/{esm2020 → esm2022}/lib/visualization/highlight/highlight.component.mjs +4 -4
- package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +20 -0
- package/esm2022/lib/visualization/intervals.mjs +63 -0
- package/{esm2020 → esm2022}/lib/visualization/issue/issue.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/legend-item/legend-item.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/metric/metric.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/mini-pie/mini-pie.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/progress/progress.component.mjs +5 -5
- package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +377 -0
- package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +18 -0
- package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +270 -0
- package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +74 -0
- package/esm2022/lib/visualization/time-series/time-series.component.mjs +374 -0
- package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +15 -0
- package/esm2022/lib/visualization/trend/trend.component.mjs +51 -0
- package/{esm2020 → esm2022}/lib/visualization/zero-state/zero-state.component.mjs +4 -4
- package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs +670 -670
- package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs.map +1 -1
- package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +1 -1
- package/lib/format/truncate/truncate.component.d.ts +1 -1
- package/lib/icon/icon.component.d.ts +1 -1
- package/lib/input/auto-focus/auto-focus.directive.d.ts +1 -1
- package/lib/input/button/button.component.d.ts +1 -1
- package/lib/input/calendar/calendar.component.d.ts +1 -1
- package/lib/input/checkbox/checkbox.component.d.ts +1 -1
- package/lib/input/currency-field/currency-field.component.d.ts +1 -1
- package/lib/input/date/date.component.d.ts +1 -1
- package/lib/input/date-range/date-range.component.d.ts +1 -1
- package/lib/input/filter-chip/filter-chip.component.d.ts +1 -1
- package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +1 -1
- package/lib/input/input-label/input-label.component.d.ts +1 -1
- package/lib/input/mentions-input/mentions-input.component.d.ts +1 -1
- package/lib/input/number-field/number-field.component.d.ts +1 -1
- package/lib/input/percentage-field/percentage-field.component.d.ts +1 -1
- package/lib/input/phone-field/phone-field.component.d.ts +1 -1
- package/lib/input/radio/radio.component.d.ts +1 -1
- package/lib/input/search/search.component.d.ts +1 -1
- package/lib/input/search-select/search-select.component.d.ts +1 -1
- package/lib/input/select/select/select.component.d.ts +1 -1
- package/lib/input/select/select-node/select-node.component.d.ts +1 -1
- package/lib/input/simple-select/simple-select.component.d.ts +1 -1
- package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +1 -1
- package/lib/input/text-field/text-field.component.d.ts +1 -1
- package/lib/input/textarea-field/textarea-field.component.d.ts +1 -1
- package/lib/input/validation-message/validation-message.component.d.ts +1 -1
- package/lib/layout/card/card-actions.component.d.ts +1 -1
- package/lib/layout/card/card-content.component.d.ts +1 -1
- package/lib/layout/card/card-header.component.d.ts +1 -1
- package/lib/layout/card/card-link.component.d.ts +1 -1
- package/lib/layout/card/card-media.component.d.ts +1 -1
- package/lib/layout/card/card.component.d.ts +1 -1
- package/lib/layout/setting-row/setting-row.component.d.ts +1 -1
- package/lib/load/loading/loading.component.d.ts +1 -1
- package/lib/load/loading-cover/loading-cover.component.d.ts +1 -1
- package/lib/navigation/editable-heading/editable-heading.component.d.ts +1 -1
- package/lib/navigation/link/link.component.d.ts +1 -1
- package/lib/navigation/page-header/page-header.component.d.ts +1 -1
- package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +1 -1
- package/lib/navigation/tabs/tab/tab.component.d.ts +1 -1
- package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +1 -1
- package/lib/navigation/views/edit-view/edit-view.component.d.ts +1 -1
- package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +3 -3
- package/lib/navigation/views/view-menu/view-menu.component.d.ts +1 -1
- package/lib/navigation/views/views/views.component.d.ts +1 -1
- package/lib/notification/badge/badge.component.d.ts +1 -1
- package/lib/notification/banner/banner-action.component.d.ts +1 -1
- package/lib/notification/banner/banner.component.d.ts +1 -1
- package/lib/notification/map-indicator/map-indicator.component.d.ts +1 -1
- package/lib/notification/notification-badge/notification-badge.component.d.ts +1 -1
- package/lib/overlay/callout/callout.component.d.ts +1 -1
- package/lib/overlay/callout/help/help.component.d.ts +1 -1
- package/lib/overlay/callout/lock-scroll.directive.d.ts +1 -1
- package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +1 -1
- package/lib/overlay/callout/menu/menu.component.d.ts +1 -1
- package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +1 -1
- package/lib/overlay/callout/tooltip/tooltip.component.d.ts +1 -1
- package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +1 -1
- package/lib/overlay/modal/dialog/dialog.component.d.ts +1 -1
- package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +1 -1
- package/lib/overlay/modal/modal.component.d.ts +1 -1
- package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +1 -1
- package/lib/overlay/toast/toast.component.d.ts +1 -1
- package/lib/table/simple-table/simple-table-header-cell.component.d.ts +1 -1
- package/lib/table/simple-table/simple-table-row.component.d.ts +1 -1
- package/lib/table/table/table/table.component.d.ts +1 -1
- package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +1 -1
- package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +1 -1
- package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +1 -1
- package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +1 -1
- package/lib/table/table/table-search/table-search.component.d.ts +1 -1
- package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +1 -1
- package/lib/visualization/chart/chart.component.d.ts +1 -1
- package/lib/visualization/data-table/data-table-row.component.d.ts +1 -1
- package/lib/visualization/donut/donut.component.d.ts +1 -1
- package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +1 -1
- package/lib/visualization/highlight/highlight.component.d.ts +1 -1
- package/lib/visualization/issue/issue.component.d.ts +1 -1
- package/lib/visualization/legend-item/legend-item.component.d.ts +1 -1
- package/lib/visualization/metric/metric.component.d.ts +1 -1
- package/lib/visualization/mini-pie/mini-pie.component.d.ts +1 -1
- package/lib/visualization/progress/progress.component.d.ts +1 -1
- package/lib/visualization/stacked-column/stacked-column.component.d.ts +3 -3
- package/lib/visualization/stacked-row/stacked-row.component.d.ts +1 -1
- package/lib/visualization/time-series/time-series.component.d.ts +3 -3
- package/lib/visualization/trend/trend.component.d.ts +1 -1
- package/lib/visualization/zero-state/zero-state.component.d.ts +1 -1
- package/package.json +5 -11
- package/esm2020/lib/download/download.service.mjs +0 -47
- package/esm2020/lib/format/pipes/sentence-case.pipe.mjs +0 -61
- package/esm2020/lib/format/pipes/small-currency.pipe.mjs +0 -24
- package/esm2020/lib/format/pipes/small-number.pipe.mjs +0 -29
- package/esm2020/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
- package/esm2020/lib/format/truncate/truncate.component.mjs +0 -51
- package/esm2020/lib/icon/dom-cache.mjs +0 -32
- package/esm2020/lib/icon/icon.component.mjs +0 -86
- package/esm2020/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
- package/esm2020/lib/input/button/button.component.mjs +0 -139
- package/esm2020/lib/input/button-group/button-group.component.mjs +0 -39
- package/esm2020/lib/input/date/date.component.mjs +0 -279
- package/esm2020/lib/input/date-range/date-range.component.mjs +0 -477
- package/esm2020/lib/input/filter-chip/filter-chip.component.mjs +0 -47
- package/esm2020/lib/input/mentions-input/mentions-input.component.mjs +0 -745
- package/esm2020/lib/input/number-field/number-field.component.mjs +0 -125
- package/esm2020/lib/input/phone-field/phone-field.component.mjs +0 -74
- package/esm2020/lib/input/search-select/search-select.component.mjs +0 -189
- package/esm2020/lib/input/select/select/select.component.mjs +0 -178
- package/esm2020/lib/input/select/state.mjs +0 -882
- package/esm2020/lib/input/simple-select/simple-select.component.mjs +0 -178
- package/esm2020/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
- package/esm2020/lib/input/text-field/text-field.component.mjs +0 -115
- package/esm2020/lib/layout/card/card-content.component.mjs +0 -64
- package/esm2020/lib/layout/card/card-header.component.mjs +0 -201
- package/esm2020/lib/layout/card/card.component.mjs +0 -291
- package/esm2020/lib/load/loading/loading.component.mjs +0 -43
- package/esm2020/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
- package/esm2020/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
- package/esm2020/lib/navigation/views/state.mjs +0 -456
- package/esm2020/lib/navigation/views/views/views.component.mjs +0 -90
- package/esm2020/lib/notification/banner/banner-action.component.mjs +0 -48
- package/esm2020/lib/notification/banner/banner.component.mjs +0 -61
- package/esm2020/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
- package/esm2020/lib/notification/map-indicator/map-indicators.mjs +0 -15
- package/esm2020/lib/overlay/callout/callout.component.mjs +0 -130
- package/esm2020/lib/overlay/callout/callout.helpers.mjs +0 -113
- package/esm2020/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
- package/esm2020/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
- package/esm2020/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
- package/esm2020/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
- package/esm2020/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
- package/esm2020/lib/overlay/modal/modal.component.mjs +0 -31
- package/esm2020/lib/overlay/overlay-outlet.component.mjs +0 -98
- package/esm2020/lib/overlay/toast/toast.component.mjs +0 -41
- package/esm2020/lib/size/size.directive.mjs +0 -33
- package/esm2020/lib/table/simple-table/coordinate-helper.mjs +0 -61
- package/esm2020/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
- package/esm2020/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
- package/esm2020/lib/table/simple-table/simple-table.component.mjs +0 -104
- package/esm2020/lib/table/table/clipboard.mjs +0 -182
- package/esm2020/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
- package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +0 -383
- package/esm2020/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
- package/esm2020/lib/table/table/state-helpers/order-helpers.mjs +0 -164
- package/esm2020/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
- package/esm2020/lib/table/table/state-helpers/result-helpers.mjs +0 -70
- package/esm2020/lib/table/table/state-helpers/search-helpers.mjs +0 -72
- package/esm2020/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
- package/esm2020/lib/table/table/state.mjs +0 -1035
- package/esm2020/lib/table/table/table/table.component.mjs +0 -367
- package/esm2020/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
- package/esm2020/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
- package/esm2020/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
- package/esm2020/lib/table/table/table-search/table-search.component.mjs +0 -71
- package/esm2020/lib/visibility/visibility.directive.mjs +0 -34
- package/esm2020/lib/visualization/chart/chart-scaling.mjs +0 -380
- package/esm2020/lib/visualization/chart/chart.component.mjs +0 -626
- package/esm2020/lib/visualization/chart/chart.mjs +0 -3768
- package/esm2020/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
- package/esm2020/lib/visualization/highlight/highlight.helpers.mjs +0 -20
- package/esm2020/lib/visualization/intervals.mjs +0 -63
- package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
- package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
- package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
- package/esm2020/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
- package/esm2020/lib/visualization/time-series/time-series.component.mjs +0 -374
- package/esm2020/lib/visualization/time-series/time-series.helpers.mjs +0 -15
- package/esm2020/lib/visualization/trend/trend.component.mjs +0 -51
- package/fesm2015/rivet-health-design-system.mjs +0 -18370
- package/fesm2015/rivet-health-design-system.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/overlay/callout/select-callout-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/util/local-storage.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/rivet-health-design-system.mjs +0 -0
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, TemplateRef, } from '@angular/core';
|
|
2
|
-
import { scaleLinear } from 'd3-scale';
|
|
3
|
-
import { BehaviorSubject, combineLatest, map, shareReplay, } from 'rxjs';
|
|
4
|
-
import { getKeyOrder, getLegendItems, getRowDisplayInfo, standardizeRowStacks, } from './stacked-row.helpers';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common";
|
|
7
|
-
import * as i2 from "../../overlay/callout/callout.component";
|
|
8
|
-
import * as i3 from "../legend-item/legend-item.component";
|
|
9
|
-
import * as i4 from "../../overlay/overlay.directive";
|
|
10
|
-
import * as i5 from "../../size/size.directive";
|
|
11
|
-
import * as i6 from "../../format/svg-text-truncate/svg-text-truncate.directive";
|
|
12
|
-
import * as i7 from "../zero-state/zero-state.component";
|
|
13
|
-
// TODO: once we upgrade to Angular 16, this component can be cleaned up with
|
|
14
|
-
// signals instead of RxJS.
|
|
15
|
-
// https://www.notion.so/rivet/Resolve-TODOs-after-Angular-upgrade-1f2667eb2a3180b79f6ad92a7e576f08
|
|
16
|
-
export class StackedRowComponent {
|
|
17
|
-
constructor() {
|
|
18
|
-
// This is the list of rows we will display, in the order we will display them.
|
|
19
|
-
this.input$ = new BehaviorSubject([]);
|
|
20
|
-
// Width helps determine the size of the viewbox this graph is displaying in.
|
|
21
|
-
this.width$ = new BehaviorSubject(0);
|
|
22
|
-
// ValueFormatter determines how we style the values in a metric and the x-axis
|
|
23
|
-
this.valueFormatter = v => v.toString();
|
|
24
|
-
this.zeroStateMessage$ = new BehaviorSubject('No data to display.');
|
|
25
|
-
this.stackClicked = new EventEmitter();
|
|
26
|
-
this.chartAndRowHeights$ = this.input$.pipe(map(input => {
|
|
27
|
-
const heightWithoutRows = input.length * this.SECTION_PADDING.BETWEEN_ROW +
|
|
28
|
-
this.SECTION_PADDING.OUTER_TOP_BOTTOM * 2 +
|
|
29
|
-
this.SECTION_HEIGHTS.X_AXIS_LABEL;
|
|
30
|
-
// The combined height of all rows at their min/max
|
|
31
|
-
const minHeight = input.length * this.RECTANGLE_HEIGHTS.MIN_HEIGHT + heightWithoutRows;
|
|
32
|
-
const maxHeight = input.length * this.RECTANGLE_HEIGHTS.MAX_HEIGHT + heightWithoutRows;
|
|
33
|
-
// If the max-sized rows don't need the target size, shrink the chart
|
|
34
|
-
if (maxHeight < this.TARGET_HEIGHT)
|
|
35
|
-
return {
|
|
36
|
-
chartHeight: maxHeight,
|
|
37
|
-
rowHeight: this.RECTANGLE_HEIGHTS.MAX_HEIGHT,
|
|
38
|
-
};
|
|
39
|
-
// If the min-sized rows need more than the target size, grow the chart
|
|
40
|
-
if (minHeight > this.TARGET_HEIGHT)
|
|
41
|
-
return {
|
|
42
|
-
chartHeight: minHeight,
|
|
43
|
-
rowHeight: this.RECTANGLE_HEIGHTS.MIN_HEIGHT,
|
|
44
|
-
};
|
|
45
|
-
// Otherwise shrink the rows to fit the target size
|
|
46
|
-
return {
|
|
47
|
-
chartHeight: this.TARGET_HEIGHT,
|
|
48
|
-
rowHeight: (this.TARGET_HEIGHT - heightWithoutRows) / input.length,
|
|
49
|
-
};
|
|
50
|
-
}));
|
|
51
|
-
/*
|
|
52
|
-
The layout we are shooting for is:
|
|
53
|
-
|
|
54
|
-
| X Axis Labels |
|
|
55
|
-
Row Name | Rectangles | Totals
|
|
56
|
-
*/
|
|
57
|
-
this.TARGET_HEIGHT = 300;
|
|
58
|
-
this.RECTANGLE_HEIGHTS = {
|
|
59
|
-
MIN_HEIGHT: 12,
|
|
60
|
-
MAX_HEIGHT: 42, // Sets the largest size a row can expand to
|
|
61
|
-
};
|
|
62
|
-
this.LABEL_HEIGHT = 8;
|
|
63
|
-
this.SECTION_HEIGHTS = {
|
|
64
|
-
// Space reserved for the x-axis labels
|
|
65
|
-
X_AXIS_LABEL: 14,
|
|
66
|
-
};
|
|
67
|
-
this.SECTION_WIDTHS = {
|
|
68
|
-
// Space reserved for the name at the start of the row
|
|
69
|
-
ROW_NAME: 100,
|
|
70
|
-
// Space reserved for the totals at the end of the row
|
|
71
|
-
ROW_TOTAL_LABEL: 72,
|
|
72
|
-
};
|
|
73
|
-
this.SECTION_PADDING = {
|
|
74
|
-
// Padding between each edge of the viewbox and the content
|
|
75
|
-
OUTER_TOP_BOTTOM: 4,
|
|
76
|
-
OUTER_LEFT_RIGHT: 4,
|
|
77
|
-
// Padding between the bottom of one row and the top of the next row
|
|
78
|
-
BETWEEN_ROW: 4,
|
|
79
|
-
// Space between the row and the top of a rectangle in that row
|
|
80
|
-
RECTANGLE_TO_ROW: 6,
|
|
81
|
-
};
|
|
82
|
-
// The number of X-axis segments to create, with labels at the start of each segment.
|
|
83
|
-
this.X_TICK_COUNT_MAX = 8;
|
|
84
|
-
this.X_TICK_COUNT_MIN = 3;
|
|
85
|
-
this.X_TICK_MAX_WIDTH = 900;
|
|
86
|
-
this.X_TICK_MIN_WIDTH = 400;
|
|
87
|
-
this.drawData$ = combineLatest([
|
|
88
|
-
this.input$,
|
|
89
|
-
this.width$,
|
|
90
|
-
this.chartAndRowHeights$,
|
|
91
|
-
]).pipe(map(([input, width, height]) => {
|
|
92
|
-
return this.getDrawnData(input, width, height.chartHeight, height.rowHeight);
|
|
93
|
-
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
94
|
-
// Lets us know whether to display the zero data state
|
|
95
|
-
this.empty$ = this.input$.pipe(map(input => input.every(stack => stack.data.length === 0)), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
96
|
-
// What rectangle we are currently hovering over
|
|
97
|
-
this.hoveredRectangle$ = new BehaviorSubject(null);
|
|
98
|
-
// What band we are currently hovering over
|
|
99
|
-
this.hoveredBand$ = new BehaviorSubject(null);
|
|
100
|
-
// Create the metric to display based on the currently hovered rectangle
|
|
101
|
-
this.callout$ = combineLatest([this.hoveredBand$, this.drawData$]).pipe(map(([hoveredBand, drawData]) => {
|
|
102
|
-
if (!hoveredBand || !drawData)
|
|
103
|
-
return null;
|
|
104
|
-
const { target } = hoveredBand.event;
|
|
105
|
-
if (!target)
|
|
106
|
-
return null;
|
|
107
|
-
const anchor = target.getBoundingClientRect();
|
|
108
|
-
const metrics = drawData.rects
|
|
109
|
-
.filter(rect => rect.rowName === hoveredBand.rowName)
|
|
110
|
-
.map(rect => ({
|
|
111
|
-
rect,
|
|
112
|
-
label: rect.stackedRowElement.label,
|
|
113
|
-
value: this.valueFormatter(rect.stackedRowElement.value),
|
|
114
|
-
colorToken: rect.stackedRowElement.colorToken,
|
|
115
|
-
}));
|
|
116
|
-
return { anchor, metrics };
|
|
117
|
-
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
118
|
-
}
|
|
119
|
-
set input(v) {
|
|
120
|
-
this.input$.next(v);
|
|
121
|
-
}
|
|
122
|
-
get input() {
|
|
123
|
-
return this.input$.getValue();
|
|
124
|
-
}
|
|
125
|
-
set width(v) {
|
|
126
|
-
this.width$.next(v);
|
|
127
|
-
}
|
|
128
|
-
set zeroStateMessage(v) {
|
|
129
|
-
this.zeroStateMessage$.next(v);
|
|
130
|
-
}
|
|
131
|
-
get zeroStateMessage() {
|
|
132
|
-
return this.zeroStateMessage$.getValue();
|
|
133
|
-
}
|
|
134
|
-
// Zero on the X axis is after the left padding and the row name.
|
|
135
|
-
locationOfXAxisZero() {
|
|
136
|
-
return this.SECTION_PADDING.OUTER_LEFT_RIGHT + this.SECTION_WIDTHS.ROW_NAME;
|
|
137
|
-
}
|
|
138
|
-
// The end of the X axis is right before the row total and the right padding.
|
|
139
|
-
locationOfXAxisEnd(width) {
|
|
140
|
-
const spaceOnRight = this.SECTION_WIDTHS.ROW_TOTAL_LABEL +
|
|
141
|
-
this.SECTION_PADDING.OUTER_LEFT_RIGHT;
|
|
142
|
-
return width - spaceOnRight;
|
|
143
|
-
}
|
|
144
|
-
// The y-index of the x-axis ticks
|
|
145
|
-
locationOfXAxisTick() {
|
|
146
|
-
return (this.SECTION_PADDING.OUTER_TOP_BOTTOM + this.SECTION_HEIGHTS.X_AXIS_LABEL);
|
|
147
|
-
}
|
|
148
|
-
// The y-index of the top of the current row
|
|
149
|
-
getTopOfRow(rowIndex, rowHeight) {
|
|
150
|
-
const spaceAboveRows = this.SECTION_PADDING.OUTER_TOP_BOTTOM + this.SECTION_HEIGHTS.X_AXIS_LABEL;
|
|
151
|
-
const aboveRows = rowIndex * rowHeight;
|
|
152
|
-
const aboveRowPaddings = rowIndex * this.SECTION_PADDING.BETWEEN_ROW;
|
|
153
|
-
const allAboveRows = aboveRows + aboveRowPaddings;
|
|
154
|
-
return spaceAboveRows + allAboveRows;
|
|
155
|
-
}
|
|
156
|
-
// Calculate all the values we need for displaying the graph on screen.
|
|
157
|
-
getDrawnData(rowStacks, width, chartHeight, rowHeight) {
|
|
158
|
-
if (rowStacks.length == 0) {
|
|
159
|
-
return null;
|
|
160
|
-
}
|
|
161
|
-
const viewBox = `0 0 ${width} ${chartHeight}`;
|
|
162
|
-
const keysInOrder = getKeyOrder(rowStacks);
|
|
163
|
-
const standardizedRows = standardizeRowStacks(rowStacks, keysInOrder);
|
|
164
|
-
const rowsForDisplay = standardizedRows.map((stackData, i) => {
|
|
165
|
-
return getRowDisplayInfo(stackData, i);
|
|
166
|
-
});
|
|
167
|
-
// The maximum value of the domain should be the highest total value from the rows.
|
|
168
|
-
const domainMax = Math.max(0, ...rowsForDisplay.map(row => row.rowTotal));
|
|
169
|
-
const xScale = scaleLinear()
|
|
170
|
-
.domain([0, domainMax])
|
|
171
|
-
.range([this.locationOfXAxisZero(), this.locationOfXAxisEnd(width)]);
|
|
172
|
-
// Setup a linear scale for tick count based on width
|
|
173
|
-
const tickScale = scaleLinear()
|
|
174
|
-
.domain([this.X_TICK_MIN_WIDTH, this.X_TICK_MAX_WIDTH])
|
|
175
|
-
.range([this.X_TICK_COUNT_MIN, this.X_TICK_COUNT_MAX])
|
|
176
|
-
.clamp(true); // Ensures the scale does not go beyond the defined range
|
|
177
|
-
const xtickCountAdjusted = Math.round(tickScale(width));
|
|
178
|
-
const xTicks = xScale.ticks(xtickCountAdjusted);
|
|
179
|
-
const rects = this.createRectanglesFromRows(rowsForDisplay, xScale, rowHeight);
|
|
180
|
-
const rowNamesToDraw = this.getRowNamesToDraw(rowsForDisplay, rowHeight);
|
|
181
|
-
const rowTotalsToDraw = this.getRowTotalsToDraw(rowsForDisplay, width, rowHeight);
|
|
182
|
-
const legendItems = getLegendItems(rowsForDisplay, keysInOrder);
|
|
183
|
-
return {
|
|
184
|
-
legendItems: legendItems,
|
|
185
|
-
rowHeight: rowHeight,
|
|
186
|
-
rects: rects,
|
|
187
|
-
rowNames: rowNamesToDraw,
|
|
188
|
-
rowTotals: rowTotalsToDraw,
|
|
189
|
-
viewBox: viewBox,
|
|
190
|
-
xScale: xScale,
|
|
191
|
-
xTicks: xTicks,
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
// Get data for all the rectangles for all the rows
|
|
195
|
-
createRectanglesFromRows(displayRows, xScale, rowHeight) {
|
|
196
|
-
const rectangles = [];
|
|
197
|
-
displayRows.forEach((currentRow, rowIndex) => {
|
|
198
|
-
currentRow.elementsButStacked.forEach((currentElement, _) => {
|
|
199
|
-
const topOfRow = this.getTopOfRow(rowIndex, rowHeight);
|
|
200
|
-
const rectangleWidth = xScale(currentElement.topline) - xScale(currentElement.baseline);
|
|
201
|
-
const rectangleHeight = rowHeight;
|
|
202
|
-
const rectangleX = xScale(currentElement.baseline);
|
|
203
|
-
const rectangleY = topOfRow + this.SECTION_PADDING.RECTANGLE_TO_ROW;
|
|
204
|
-
const fill = `var(${currentElement.colorToken})`;
|
|
205
|
-
rectangles.push({
|
|
206
|
-
x: rectangleX,
|
|
207
|
-
y: rectangleY,
|
|
208
|
-
width: Math.max(rectangleWidth, 0),
|
|
209
|
-
height: rectangleHeight,
|
|
210
|
-
fill: fill,
|
|
211
|
-
striped: currentElement.style === 'striped',
|
|
212
|
-
rowName: currentRow.rowName,
|
|
213
|
-
stackedRowElement: currentElement,
|
|
214
|
-
stackIndex: currentRow.stackIndex,
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
return rectangles;
|
|
219
|
-
}
|
|
220
|
-
// Get data on the row names we are drawing
|
|
221
|
-
getRowNamesToDraw(displayRows, rowHeight) {
|
|
222
|
-
return displayRows.map((row, rowIndex) => {
|
|
223
|
-
const rowLabelX = this.SECTION_PADDING.OUTER_LEFT_RIGHT;
|
|
224
|
-
// The row name looks right if its base is at the base of the associated rectangle
|
|
225
|
-
const rowLabelY = this.getTopOfRow(rowIndex, rowHeight) +
|
|
226
|
-
this.SECTION_PADDING.RECTANGLE_TO_ROW +
|
|
227
|
-
this.LABEL_HEIGHT / 2 +
|
|
228
|
-
rowHeight / 2;
|
|
229
|
-
return {
|
|
230
|
-
label: row.rowName,
|
|
231
|
-
x: rowLabelX,
|
|
232
|
-
y: rowLabelY,
|
|
233
|
-
};
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
// Get data on the row totals we are drawing
|
|
237
|
-
getRowTotalsToDraw(displayRows, width, rowHeight) {
|
|
238
|
-
return displayRows.map((row, rowIndex) => {
|
|
239
|
-
const rowLabelX = width - this.SECTION_PADDING.OUTER_LEFT_RIGHT;
|
|
240
|
-
// The row totals looks right if its base is at the base of the associated rectangle
|
|
241
|
-
const rowLabelY = this.getTopOfRow(rowIndex, rowHeight) +
|
|
242
|
-
this.SECTION_PADDING.RECTANGLE_TO_ROW +
|
|
243
|
-
this.LABEL_HEIGHT / 2 +
|
|
244
|
-
rowHeight / 2;
|
|
245
|
-
return {
|
|
246
|
-
label: this.valueFormatter(row.rowTotal),
|
|
247
|
-
x: rowLabelX,
|
|
248
|
-
y: rowLabelY,
|
|
249
|
-
};
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
StackedRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: StackedRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
254
|
-
StackedRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: StackedRowComponent, selector: "riv-stacked-row", inputs: { input: "input", valueFormatter: "valueFormatter", zeroStateMessage: "zeroStateMessage" }, outputs: { stackClicked: "stackClicked" }, queries: [{ propertyName: "calloutHeaderTemplate", first: true, predicate: TemplateRef, descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g\n *ngFor=\"let rect of draw.rects\"\n (mouseenter)=\"hoveredBand$.next({ rowName: rect.rowName, event: $event })\"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit({ stackIndex: rect.stackIndex });\n hoveredBand$.next(null)\n \"\n >\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.rowName !== rect.rowName\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'bottom-center'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div *ngFor=\"let metric of callout?.metrics\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item [colorToken]=\"metric.colorToken\"></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{padding:var(--size-medium) 0;display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "directive", type: i4.OverlayDirective, selector: "[riv-overlay]" }, { kind: "directive", type: i5.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "directive", type: i6.SVGTextTruncateDirective, selector: "svg text[rivSVGTextTruncate]", inputs: ["text", "width"] }, { kind: "component", type: i7.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
255
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: StackedRowComponent, decorators: [{
|
|
256
|
-
type: Component,
|
|
257
|
-
args: [{ selector: 'riv-stacked-row', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g\n *ngFor=\"let rect of draw.rects\"\n (mouseenter)=\"hoveredBand$.next({ rowName: rect.rowName, event: $event })\"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit({ stackIndex: rect.stackIndex });\n hoveredBand$.next(null)\n \"\n >\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.rowName !== rect.rowName\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'bottom-center'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div *ngFor=\"let metric of callout?.metrics\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item [colorToken]=\"metric.colorToken\"></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{padding:var(--size-medium) 0;display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"] }]
|
|
258
|
-
}], propDecorators: { input: [{
|
|
259
|
-
type: Input
|
|
260
|
-
}], valueFormatter: [{
|
|
261
|
-
type: Input
|
|
262
|
-
}], zeroStateMessage: [{
|
|
263
|
-
type: Input
|
|
264
|
-
}], calloutHeaderTemplate: [{
|
|
265
|
-
type: ContentChild,
|
|
266
|
-
args: [TemplateRef]
|
|
267
|
-
}], stackClicked: [{
|
|
268
|
-
type: Output
|
|
269
|
-
}] } });
|
|
270
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLXJvdy9zdGFja2VkLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtcm93L3N0YWNrZWQtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsZUFBZSxFQUVmLGFBQWEsRUFDYixHQUFHLEVBQ0gsV0FBVyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUtMLFdBQVcsRUFDWCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLG9CQUFvQixHQUNyQixNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7QUFFL0IsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQUMzQixtR0FBbUc7QUFPbkcsTUFBTSxPQUFPLG1CQUFtQjtJQU5oQztRQU9FLCtFQUErRTtRQUM5RCxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQzNDLEVBQUUsQ0FDSCxDQUFDO1FBU0YsNkVBQTZFO1FBQzVELFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUt6RCwrRUFBK0U7UUFFeEUsbUJBQWMsR0FBMEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEQsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQ3RELHFCQUFxQixDQUN0QixDQUFDO1FB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QixFQUM3QixLQUFhLEVBQ2IsU0FBaUI7UUFFakIsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQ2hFLG9GQUFvRjtZQUNwRixNQUFNLFNBQVMsR0FDYixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCO2dCQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUM7Z0JBQ3JCLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFFaEIsT0FBTztnQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUN4QyxDQUFDLEVBQUUsU0FBUztnQkFDWixDQUFDLEVBQUUsU0FBUzthQUNiLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2lIQXRTVSxtQkFBbUI7cUdBQW5CLG1CQUFtQix5UEFrQ2hCLFdBQVcsZ0RDekUzQixtN0hBNklBOzRGRHRHYSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU07OEJBUXBDLEtBQUs7c0JBRGYsS0FBSztnQkFnQkMsY0FBYztzQkFEcEIsS0FBSztnQkFPSyxnQkFBZ0I7c0JBRDFCLEtBQUs7Z0JBU04scUJBQXFCO3NCQURwQixZQUFZO3VCQUFDLFdBQVc7Z0JBTXpCLFlBQVk7c0JBRFgsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbnRlcm5TZXQgfSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQgeyBTY2FsZUxpbmVhciwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTGVnZW5kSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2xlZ2VuZC1pdGVtL2xlZ2VuZC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBSb3dEaXNwbGF5SW5mbyxcbiAgUm93TGFiZWwsXG4gIFJvd1JlY3RhbmdsZSxcbiAgU3RhY2tlZFJvd0RyYXdEYXRhLFxuICBnZXRLZXlPcmRlcixcbiAgZ2V0TGVnZW5kSXRlbXMsXG4gIGdldFJvd0Rpc3BsYXlJbmZvLFxuICBzdGFuZGFyZGl6ZVJvd1N0YWNrcyxcbn0gZnJvbSAnLi9zdGFja2VkLXJvdy5oZWxwZXJzJztcblxuLy8gVE9ETzogb25jZSB3ZSB1cGdyYWRlIHRvIEFuZ3VsYXIgMTYsIHRoaXMgY29tcG9uZW50IGNhbiBiZSBjbGVhbmVkIHVwIHdpdGhcbi8vIHNpZ25hbHMgaW5zdGVhZCBvZiBSeEpTLlxuLy8gaHR0cHM6Ly93d3cubm90aW9uLnNvL3JpdmV0L1Jlc29sdmUtVE9ET3MtYWZ0ZXItQW5ndWxhci11cGdyYWRlLTFmMjY2N2ViMmEzMTgwYjc5ZjZhZDkyYTdlNTc2ZjA4XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtc3RhY2tlZC1yb3cnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RhY2tlZC1yb3cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGFja2VkLXJvdy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTdGFja2VkUm93Q29tcG9uZW50IHtcbiAgLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiByb3dzIHdlIHdpbGwgZGlzcGxheSwgaW4gdGhlIG9yZGVyIHdlIHdpbGwgZGlzcGxheSB0aGVtLlxuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdPihcbiAgICBbXSxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnB1dCh2OiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10pIHtcbiAgICB0aGlzLmlucHV0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXQoKTogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIFdpZHRoIGhlbHBzIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdmlld2JveCB0aGlzIGdyYXBoIGlzIGRpc3BsYXlpbmcgaW4uXG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkdGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgc2V0IHdpZHRoKHY6IG51bWJlcikge1xuICAgIHRoaXMud2lkdGgkLm5leHQodik7XG4gIH1cblxuICAvLyBWYWx1ZUZvcm1hdHRlciBkZXRlcm1pbmVzIGhvdyB3ZSBzdHlsZSB0aGUgdmFsdWVzIGluIGEgbWV0cmljIGFuZCB0aGUgeC1heGlzXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWx1ZUZvcm1hdHRlcjogKHY6IG51bWJlcikgPT4gc3RyaW5nID0gdiA9PiB2LnRvU3RyaW5nKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB6ZXJvU3RhdGVNZXNzYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihcbiAgICAnTm8gZGF0YSB0byBkaXNwbGF5LicsXG4gICk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgemVyb1N0YXRlTWVzc2FnZSh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLnplcm9TdGF0ZU1lc3NhZ2UkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCB6ZXJvU3RhdGVNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuemVyb1N0YXRlTWVzc2FnZSQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpXG4gIGNhbGxvdXRIZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPHtcbiAgICAkaW1wbGljaXQ6IFN0YWNrZWRSb3dDb21wb25lbnQuQ2FsbG91dENvbnRleHQ7XG4gIH0+O1xuXG4gIEBPdXRwdXQoKVxuICBzdGFja0NsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN0YWNrZWRSb3dDb21wb25lbnQuU3RhY2tDbGlja2VkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRBbmRSb3dIZWlnaHRzJCA9IHRoaXMuaW5wdXQkLnBpcGUoXG4gICAgbWFwKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IGhlaWdodFdpdGhvdXRSb3dzID1cbiAgICAgICAgaW5wdXQubGVuZ3RoICogdGhpcy5TRUNUSU9OX1BBRERJTkcuQkVUV0VFTl9ST1cgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NICogMiArXG4gICAgICAgIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTDtcblxuICAgICAgLy8gVGhlIGNvbWJpbmVkIGhlaWdodCBvZiBhbGwgcm93cyBhdCB0aGVpciBtaW4vbWF4XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPVxuICAgICAgICBpbnB1dC5sZW5ndGggKiB0aGlzLlJFQ1RBTkdMRV9IRUlHSFRTLk1JTl9IRUlHSFQgKyBoZWlnaHRXaXRob3V0Um93cztcbiAgICAgIGNvbnN0IG1heEhlaWdodCA9XG4gICAgICAgIGlucHV0Lmxlbmd0aCAqIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUFYX0hFSUdIVCArIGhlaWdodFdpdGhvdXRSb3dzO1xuXG4gICAgICAvLyBJZiB0aGUgbWF4LXNpemVkIHJvd3MgZG9uJ3QgbmVlZCB0aGUgdGFyZ2V0IHNpemUsIHNocmluayB0aGUgY2hhcnRcbiAgICAgIGlmIChtYXhIZWlnaHQgPCB0aGlzLlRBUkdFVF9IRUlHSFQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2hhcnRIZWlnaHQ6IG1heEhlaWdodCxcbiAgICAgICAgICByb3dIZWlnaHQ6IHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUFYX0hFSUdIVCxcbiAgICAgICAgfTtcbiAgICAgIC8vIElmIHRoZSBtaW4tc2l6ZWQgcm93cyBuZWVkIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IHNpemUsIGdyb3cgdGhlIGNoYXJ0XG4gICAgICBpZiAobWluSGVpZ2h0ID4gdGhpcy5UQVJHRVRfSEVJR0hUKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNoYXJ0SGVpZ2h0OiBtaW5IZWlnaHQsXG4gICAgICAgICAgcm93SGVpZ2h0OiB0aGlzLlJFQ1RBTkdMRV9IRUlHSFRTLk1JTl9IRUlHSFQsXG4gICAgICAgIH07XG4gICAgICAvLyBPdGhlcndpc2Ugc2hyaW5rIHRoZSByb3dzIHRvIGZpdCB0aGUgdGFyZ2V0IHNpemVcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYXJ0SGVpZ2h0OiB0aGlzLlRBUkdFVF9IRUlHSFQsXG4gICAgICAgIHJvd0hlaWdodDogKHRoaXMuVEFSR0VUX0hFSUdIVCAtIGhlaWdodFdpdGhvdXRSb3dzKSAvIGlucHV0Lmxlbmd0aCxcbiAgICAgIH07XG4gICAgfSksXG4gICk7XG5cbiAgLypcbiAgICBUaGUgbGF5b3V0IHdlIGFyZSBzaG9vdGluZyBmb3IgaXM6XG5cbiAgICAgICAgICAgICAgfCAgIFggQXhpcyBMYWJlbHMgIHxcbiAgICBSb3cgTmFtZSAgfCAgIFJlY3RhbmdsZXMgICAgIHwgICBUb3RhbHNcbiAgKi9cbiAgcmVhZG9ubHkgVEFSR0VUX0hFSUdIVCA9IDMwMDtcblxuICByZWFkb25seSBSRUNUQU5HTEVfSEVJR0hUUyA9IHtcbiAgICBNSU5fSEVJR0hUOiAxMiwgLy8gU2V0cyB0aGUgc21hbGxlc3Qgc2l6ZSBhIHJvdyBjYW4gc2hyaW5rIHRvXG4gICAgTUFYX0hFSUdIVDogNDIsIC8vIFNldHMgdGhlIGxhcmdlc3Qgc2l6ZSBhIHJvdyBjYW4gZXhwYW5kIHRvXG4gIH07XG5cbiAgcmVhZG9ubHkgTEFCRUxfSEVJR0hUID0gODtcblxuICByZWFkb25seSBTRUNUSU9OX0hFSUdIVFMgPSB7XG4gICAgLy8gU3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSB4LWF4aXMgbGFiZWxzXG4gICAgWF9BWElTX0xBQkVMOiAxNCxcbiAgfTtcblxuICByZWFkb25seSBTRUNUSU9OX1dJRFRIUyA9IHtcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIG5hbWUgYXQgdGhlIHN0YXJ0IG9mIHRoZSByb3dcbiAgICBST1dfTkFNRTogMTAwLFxuICAgIC8vIFNwYWNlIHJlc2VydmVkIGZvciB0aGUgdG90YWxzIGF0IHRoZSBlbmQgb2YgdGhlIHJvd1xuICAgIFJPV19UT1RBTF9MQUJFTDogNzIsXG4gIH07XG5cbiAgcmVhZG9ubHkgU0VDVElPTl9QQURESU5HID0ge1xuICAgIC8vIFBhZGRpbmcgYmV0d2VlbiBlYWNoIGVkZ2Ugb2YgdGhlIHZpZXdib3ggYW5kIHRoZSBjb250ZW50XG4gICAgT1VURVJfVE9QX0JPVFRPTTogNCxcbiAgICBPVVRFUl9MRUZUX1JJR0hUOiA0LFxuICAgIC8vIFBhZGRpbmcgYmV0d2VlbiB0aGUgYm90dG9tIG9mIG9uZSByb3cgYW5kIHRoZSB0b3Agb2YgdGhlIG5leHQgcm93XG4gICAgQkVUV0VFTl9ST1c6IDQsXG4gICAgLy8gU3BhY2UgYmV0d2VlbiB0aGUgcm93IGFuZCB0aGUgdG9wIG9mIGEgcmVjdGFuZ2xlIGluIHRoYXQgcm93XG4gICAgUkVDVEFOR0xFX1RPX1JPVzogNixcbiAgfTtcblxuICAvLyBUaGUgbnVtYmVyIG9mIFgtYXhpcyBzZWdtZW50cyB0byBjcmVhdGUsIHdpdGggbGFiZWxzIGF0IHRoZSBzdGFydCBvZiBlYWNoIHNlZ21lbnQuXG4gIHJlYWRvbmx5IFhfVElDS19DT1VOVF9NQVggPSA4O1xuICByZWFkb25seSBYX1RJQ0tfQ09VTlRfTUlOID0gMztcbiAgcmVhZG9ubHkgWF9USUNLX01BWF9XSURUSCA9IDkwMDtcbiAgcmVhZG9ubHkgWF9USUNLX01JTl9XSURUSCA9IDQwMDtcblxuICAvLyBaZXJvIG9uIHRoZSBYIGF4aXMgaXMgYWZ0ZXIgdGhlIGxlZnQgcGFkZGluZyBhbmQgdGhlIHJvdyBuYW1lLlxuICBsb2NhdGlvbk9mWEF4aXNaZXJvKCkge1xuICAgIHJldHVybiB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9MRUZUX1JJR0hUICsgdGhpcy5TRUNUSU9OX1dJRFRIUy5ST1dfTkFNRTtcbiAgfVxuICAvLyBUaGUgZW5kIG9mIHRoZSBYIGF4aXMgaXMgcmlnaHQgYmVmb3JlIHRoZSByb3cgdG90YWwgYW5kIHRoZSByaWdodCBwYWRkaW5nLlxuICBsb2NhdGlvbk9mWEF4aXNFbmQod2lkdGg6IG51bWJlcikge1xuICAgIGNvbnN0IHNwYWNlT25SaWdodDogbnVtYmVyID1cbiAgICAgIHRoaXMuU0VDVElPTl9XSURUSFMuUk9XX1RPVEFMX0xBQkVMICtcbiAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQ7XG4gICAgcmV0dXJuIHdpZHRoIC0gc3BhY2VPblJpZ2h0O1xuICB9XG4gIC8vIFRoZSB5LWluZGV4IG9mIHRoZSB4LWF4aXMgdGlja3NcbiAgbG9jYXRpb25PZlhBeGlzVGljaygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfVE9QX0JPVFRPTSArIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTFxuICAgICk7XG4gIH1cbiAgLy8gVGhlIHktaW5kZXggb2YgdGhlIHRvcCBvZiB0aGUgY3VycmVudCByb3dcbiAgZ2V0VG9wT2ZSb3cocm93SW5kZXg6IG51bWJlciwgcm93SGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCBzcGFjZUFib3ZlUm93czogbnVtYmVyID1cbiAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX1RPUF9CT1RUT00gKyB0aGlzLlNFQ1RJT05fSEVJR0hUUy5YX0FYSVNfTEFCRUw7XG5cbiAgICBjb25zdCBhYm92ZVJvd3M6IG51bWJlciA9IHJvd0luZGV4ICogcm93SGVpZ2h0O1xuICAgIGNvbnN0IGFib3ZlUm93UGFkZGluZ3M6IG51bWJlciA9XG4gICAgICByb3dJbmRleCAqIHRoaXMuU0VDVElPTl9QQURESU5HLkJFVFdFRU5fUk9XO1xuICAgIGNvbnN0IGFsbEFib3ZlUm93czogbnVtYmVyID0gYWJvdmVSb3dzICsgYWJvdmVSb3dQYWRkaW5ncztcblxuICAgIHJldHVybiBzcGFjZUFib3ZlUm93cyArIGFsbEFib3ZlUm93cztcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSBhbGwgdGhlIHZhbHVlcyB3ZSBuZWVkIGZvciBkaXNwbGF5aW5nIHRoZSBncmFwaCBvbiBzY3JlZW4uXG4gIGdldERyYXduRGF0YShcbiAgICByb3dTdGFja3M6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGNoYXJ0SGVpZ2h0OiBudW1iZXIsXG4gICAgcm93SGVpZ2h0OiBudW1iZXIsXG4gICkge1xuICAgIGlmIChyb3dTdGFja3MubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB2aWV3Qm94ID0gYDAgMCAke3dpZHRofSAke2NoYXJ0SGVpZ2h0fWA7XG5cbiAgICBjb25zdCBrZXlzSW5PcmRlcjogSW50ZXJuU2V0PHN0cmluZz4gPSBnZXRLZXlPcmRlcihyb3dTdGFja3MpO1xuICAgIGNvbnN0IHN0YW5kYXJkaXplZFJvd3M6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSA9XG4gICAgICBzdGFuZGFyZGl6ZVJvd1N0YWNrcyhyb3dTdGFja3MsIGtleXNJbk9yZGVyKTtcbiAgICBjb25zdCByb3dzRm9yRGlzcGxheTogUm93RGlzcGxheUluZm9bXSA9IHN0YW5kYXJkaXplZFJvd3MubWFwKFxuICAgICAgKHN0YWNrRGF0YSwgaSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0Um93RGlzcGxheUluZm8oc3RhY2tEYXRhLCBpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBkb21haW4gc2hvdWxkIGJlIHRoZSBoaWdoZXN0IHRvdGFsIHZhbHVlIGZyb20gdGhlIHJvd3MuXG4gICAgY29uc3QgZG9tYWluTWF4ID0gTWF0aC5tYXgoMCwgLi4ucm93c0ZvckRpc3BsYXkubWFwKHJvdyA9PiByb3cucm93VG90YWwpKTtcbiAgICBjb25zdCB4U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj4gPSBzY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFswLCBkb21haW5NYXhdKVxuICAgICAgLnJhbmdlKFt0aGlzLmxvY2F0aW9uT2ZYQXhpc1plcm8oKSwgdGhpcy5sb2NhdGlvbk9mWEF4aXNFbmQod2lkdGgpXSk7XG5cbiAgICAvLyBTZXR1cCBhIGxpbmVhciBzY2FsZSBmb3IgdGljayBjb3VudCBiYXNlZCBvbiB3aWR0aFxuICAgIGNvbnN0IHRpY2tTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oW3RoaXMuWF9USUNLX01JTl9XSURUSCwgdGhpcy5YX1RJQ0tfTUFYX1dJRFRIXSlcbiAgICAgIC5yYW5nZShbdGhpcy5YX1RJQ0tfQ09VTlRfTUlOLCB0aGlzLlhfVElDS19DT1VOVF9NQVhdKVxuICAgICAgLmNsYW1wKHRydWUpOyAvLyBFbnN1cmVzIHRoZSBzY2FsZSBkb2VzIG5vdCBnbyBiZXlvbmQgdGhlIGRlZmluZWQgcmFuZ2VcblxuICAgIGNvbnN0IHh0aWNrQ291bnRBZGp1c3RlZCA9IE1hdGgucm91bmQodGlja1NjYWxlKHdpZHRoKSk7XG4gICAgY29uc3QgeFRpY2tzID0geFNjYWxlLnRpY2tzKHh0aWNrQ291bnRBZGp1c3RlZCk7XG5cbiAgICBjb25zdCByZWN0czogUm93UmVjdGFuZ2xlW10gPSB0aGlzLmNyZWF0ZVJlY3RhbmdsZXNGcm9tUm93cyhcbiAgICAgIHJvd3NGb3JEaXNwbGF5LFxuICAgICAgeFNjYWxlLFxuICAgICAgcm93SGVpZ2h0LFxuICAgICk7XG5cbiAgICBjb25zdCByb3dOYW1lc1RvRHJhdzogUm93TGFiZWxbXSA9IHRoaXMuZ2V0Um93TmFtZXNUb0RyYXcoXG4gICAgICByb3dzRm9yRGlzcGxheSxcbiAgICAgIHJvd0hlaWdodCxcbiAgICApO1xuICAgIGNvbnN0IHJvd1RvdGFsc1RvRHJhdzogUm93TGFiZWxbXSA9IHRoaXMuZ2V0Um93VG90YWxzVG9EcmF3KFxuICAgICAgcm93c0ZvckRpc3BsYXksXG4gICAgICB3aWR0aCxcbiAgICAgIHJvd0hlaWdodCxcbiAgICApO1xuXG4gICAgY29uc3QgbGVnZW5kSXRlbXMgPSBnZXRMZWdlbmRJdGVtcyhyb3dzRm9yRGlzcGxheSwga2V5c0luT3JkZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZ2VuZEl0ZW1zOiBsZWdlbmRJdGVtcyxcbiAgICAgIHJvd0hlaWdodDogcm93SGVpZ2h0LFxuICAgICAgcmVjdHM6IHJlY3RzLFxuICAgICAgcm93TmFtZXM6IHJvd05hbWVzVG9EcmF3LFxuICAgICAgcm93VG90YWxzOiByb3dUb3RhbHNUb0RyYXcsXG4gICAgICB2aWV3Qm94OiB2aWV3Qm94LFxuICAgICAgeFNjYWxlOiB4U2NhbGUsXG4gICAgICB4VGlja3M6IHhUaWNrcyxcbiAgICB9O1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgZm9yIGFsbCB0aGUgcmVjdGFuZ2xlcyBmb3IgYWxsIHRoZSByb3dzXG4gIGNyZWF0ZVJlY3RhbmdsZXNGcm9tUm93cyhcbiAgICBkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSxcbiAgICB4U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj4sXG4gICAgcm93SGVpZ2h0OiBudW1iZXIsXG4gICk6IFJvd1JlY3RhbmdsZVtdIHtcbiAgICBjb25zdCByZWN0YW5nbGVzOiBSb3dSZWN0YW5nbGVbXSA9IFtdO1xuICAgIGRpc3BsYXlSb3dzLmZvckVhY2goKGN1cnJlbnRSb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICBjdXJyZW50Um93LmVsZW1lbnRzQnV0U3RhY2tlZC5mb3JFYWNoKChjdXJyZW50RWxlbWVudCwgXykgPT4ge1xuICAgICAgICBjb25zdCB0b3BPZlJvdzogbnVtYmVyID0gdGhpcy5nZXRUb3BPZlJvdyhyb3dJbmRleCwgcm93SGVpZ2h0KTtcblxuICAgICAgICBjb25zdCByZWN0YW5nbGVXaWR0aDogbnVtYmVyID1cbiAgICAgICAgICB4U2NhbGUoY3VycmVudEVsZW1lbnQudG9wbGluZSkgLSB4U2NhbGUoY3VycmVudEVsZW1lbnQuYmFzZWxpbmUpO1xuICAgICAgICBjb25zdCByZWN0YW5nbGVIZWlnaHQ6IG51bWJlciA9IHJvd0hlaWdodDtcblxuICAgICAgICBjb25zdCByZWN0YW5nbGVYOiBudW1iZXIgPSB4U2NhbGUoY3VycmVudEVsZW1lbnQuYmFzZWxpbmUpO1xuICAgICAgICBjb25zdCByZWN0YW5nbGVZOiBudW1iZXIgPVxuICAgICAgICAgIHRvcE9mUm93ICsgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVztcblxuICAgICAgICBjb25zdCBmaWxsID0gYHZhcigke2N1cnJlbnRFbGVtZW50LmNvbG9yVG9rZW59KWA7XG5cbiAgICAgICAgcmVjdGFuZ2xlcy5wdXNoKHtcbiAgICAgICAgICB4OiByZWN0YW5nbGVYLFxuICAgICAgICAgIHk6IHJlY3RhbmdsZVksXG4gICAgICAgICAgd2lkdGg6IE1hdGgubWF4KHJlY3RhbmdsZVdpZHRoLCAwKSxcbiAgICAgICAgICBoZWlnaHQ6IHJlY3RhbmdsZUhlaWdodCxcbiAgICAgICAgICBmaWxsOiBmaWxsLFxuICAgICAgICAgIHN0cmlwZWQ6IGN1cnJlbnRFbGVtZW50LnN0eWxlID09PSAnc3RyaXBlZCcsXG4gICAgICAgICAgcm93TmFtZTogY3VycmVudFJvdy5yb3dOYW1lLFxuICAgICAgICAgIHN0YWNrZWRSb3dFbGVtZW50OiBjdXJyZW50RWxlbWVudCxcbiAgICAgICAgICBzdGFja0luZGV4OiBjdXJyZW50Um93LnN0YWNrSW5kZXgsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlY3RhbmdsZXM7XG4gIH1cblxuICAvLyBHZXQgZGF0YSBvbiB0aGUgcm93IG5hbWVzIHdlIGFyZSBkcmF3aW5nXG4gIGdldFJvd05hbWVzVG9EcmF3KFxuICAgIGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdLFxuICAgIHJvd0hlaWdodDogbnVtYmVyLFxuICApOiBSb3dMYWJlbFtdIHtcbiAgICByZXR1cm4gZGlzcGxheVJvd3MubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICBjb25zdCByb3dMYWJlbFggPSB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9MRUZUX1JJR0hUO1xuICAgICAgLy8gVGhlIHJvdyBuYW1lIGxvb2tzIHJpZ2h0IGlmIGl0cyBiYXNlIGlzIGF0IHRoZSBiYXNlIG9mIHRoZSBhc3NvY2lhdGVkIHJlY3RhbmdsZVxuICAgICAgY29uc3Qgcm93TGFiZWxZID1cbiAgICAgICAgdGhpcy5nZXRUb3BPZlJvdyhyb3dJbmRleCwgcm93SGVpZ2h0KSArXG4gICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cgK1xuICAgICAgICB0aGlzLkxBQkVMX0hFSUdIVCAvIDIgK1xuICAgICAgICByb3dIZWlnaHQgLyAyO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogcm93LnJvd05hbWUsXG4gICAgICAgIHg6IHJvd0xhYmVsWCxcbiAgICAgICAgeTogcm93TGFiZWxZLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIG9uIHRoZSByb3cgdG90YWxzIHdlIGFyZSBkcmF3aW5nXG4gIGdldFJvd1RvdGFsc1RvRHJhdyhcbiAgICBkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIHJvd0hlaWdodDogbnVtYmVyLFxuICApOiBSb3dMYWJlbFtdIHtcbiAgICByZXR1cm4gZGlzcGxheVJvd3MubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICBjb25zdCByb3dMYWJlbFggPSB3aWR0aCAtIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQ7XG4gICAgICAvLyBUaGUgcm93IHRvdGFscyBsb29rcyByaWdodCBpZiBpdHMgYmFzZSBpcyBhdCB0aGUgYmFzZSBvZiB0aGUgYXNzb2NpYXRlZCByZWN0YW5nbGVcbiAgICAgIGNvbnN0IHJvd0xhYmVsWSA9XG4gICAgICAgIHRoaXMuZ2V0VG9wT2ZSb3cocm93SW5kZXgsIHJvd0hlaWdodCkgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5SRUNUQU5HTEVfVE9fUk9XICtcbiAgICAgICAgdGhpcy5MQUJFTF9IRUlHSFQgLyAyICtcbiAgICAgICAgcm93SGVpZ2h0IC8gMjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IHRoaXMudmFsdWVGb3JtYXR0ZXIocm93LnJvd1RvdGFsKSxcbiAgICAgICAgeDogcm93TGFiZWxYLFxuICAgICAgICB5OiByb3dMYWJlbFksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZG9ubHkgZHJhd0RhdGEkOiBPYnNlcnZhYmxlPFN0YWNrZWRSb3dEcmF3RGF0YSB8IG51bGw+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5jaGFydEFuZFJvd0hlaWdodHMkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCB3aWR0aCwgaGVpZ2h0XSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RHJhd25EYXRhKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodC5jaGFydEhlaWdodCxcbiAgICAgICAgaGVpZ2h0LnJvd0hlaWdodCxcbiAgICAgICk7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICAvLyBMZXRzIHVzIGtub3cgd2hldGhlciB0byBkaXNwbGF5IHRoZSB6ZXJvIGRhdGEgc3RhdGVcbiAgcmVhZG9ubHkgZW1wdHkkID0gdGhpcy5pbnB1dCQucGlwZShcbiAgICBtYXAoaW5wdXQgPT4gaW5wdXQuZXZlcnkoc3RhY2sgPT4gc3RhY2suZGF0YS5sZW5ndGggPT09IDApKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIC8vIFdoYXQgcmVjdGFuZ2xlIHdlIGFyZSBjdXJyZW50bHkgaG92ZXJpbmcgb3ZlclxuICByZWFkb25seSBob3ZlcmVkUmVjdGFuZ2xlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIHJlY3RhbmdsZTogUm93UmVjdGFuZ2xlO1xuICAgIGV2ZW50OiBNb3VzZUV2ZW50O1xuICB9IHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gV2hhdCBiYW5kIHdlIGFyZSBjdXJyZW50bHkgaG92ZXJpbmcgb3ZlclxuICByZWFkb25seSBob3ZlcmVkQmFuZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICByb3dOYW1lOiBzdHJpbmc7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIH0gfCBudWxsPihudWxsKTtcblxuICAvLyBDcmVhdGUgdGhlIG1ldHJpYyB0byBkaXNwbGF5IGJhc2VkIG9uIHRoZSBjdXJyZW50bHkgaG92ZXJlZCByZWN0YW5nbGVcbiAgcmVhZG9ubHkgY2FsbG91dCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmhvdmVyZWRCYW5kJCwgdGhpcy5kcmF3RGF0YSRdKS5waXBlKFxuICAgIG1hcCgoW2hvdmVyZWRCYW5kLCBkcmF3RGF0YV0pID0+IHtcbiAgICAgIGlmICghaG92ZXJlZEJhbmQgfHwgIWRyYXdEYXRhKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IGhvdmVyZWRCYW5kLmV2ZW50O1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgYW5jaG9yID0gKDxTVkdSZWN0RWxlbWVudD50YXJnZXQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICB0eXBlIE1ldHJpYyA9IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgY29sb3JUb2tlbjogc3RyaW5nIH07XG4gICAgICBjb25zdCBtZXRyaWNzOiBNZXRyaWNbXSA9IGRyYXdEYXRhLnJlY3RzXG4gICAgICAgIC5maWx0ZXIocmVjdCA9PiByZWN0LnJvd05hbWUgPT09IGhvdmVyZWRCYW5kLnJvd05hbWUpXG4gICAgICAgIC5tYXAocmVjdCA9PiAoe1xuICAgICAgICAgIHJlY3QsXG4gICAgICAgICAgbGFiZWw6IHJlY3Quc3RhY2tlZFJvd0VsZW1lbnQubGFiZWwsXG4gICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVGb3JtYXR0ZXIocmVjdC5zdGFja2VkUm93RWxlbWVudC52YWx1ZSksXG4gICAgICAgICAgY29sb3JUb2tlbjogcmVjdC5zdGFja2VkUm93RWxlbWVudC5jb2xvclRva2VuLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiB7IGFuY2hvciwgbWV0cmljcyB9O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU3RhY2tlZFJvd0NvbXBvbmVudCB7XG4gIC8vIEEgc3BlY2lmaWNhbGx5IGNvbG9yZWQgc2VjdGlvbiBvZiBvbmUgcm93LlxuICBleHBvcnQgdHlwZSBSb3dFbGVtZW50ID0ge1xuICAgIGxhYmVsOiBzdHJpbmc7IC8vIExlZ2VuZCBlbGVtZW50IG5hbWVcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICBzdHlsZT86IExlZ2VuZEl0ZW1Db21wb25lbnQuU3R5bGU7XG4gIH07XG4gIC8vIFRoZSBpbnB1dCB0aGF0IGRldGVybWluZXMgb25lIHJvdy5cbiAgZXhwb3J0IHR5cGUgUm93U3RhY2sgPSB7XG4gICAgcm93TmFtZTogc3RyaW5nO1xuICAgIGRhdGE6IFJvd0VsZW1lbnRbXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTdGFja0NsaWNrZWQgPSB7XG4gICAgc3RhY2tJbmRleDogbnVtYmVyO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIENhbGxvdXRDb250ZXh0ID0ge1xuICAgIGFuY2hvcjogRE9NUmVjdDtcbiAgICBtZXRyaWNzOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGNvbG9yVG9rZW46IHN0cmluZyB9W107XG4gIH07XG59XG4iLCI8ZGl2XG4gICpuZ0lmPVwiKGVtcHR5JCB8IGFzeW5jKSA9PT0gZmFsc2U7IGVsc2UgemVyb1N0YXRlXCJcbiAgY2xhc3M9XCJjb250YWluZXJcIlxuICAocml2Q2xpZW50U2l6ZSk9XCJ3aWR0aCA9ICRldmVudC53aWR0aFwiXG4+XG4gIDxzdmdcbiAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAqbmdJZj1cImRyYXdEYXRhJCB8IGFzeW5jOyBsZXQgZHJhd1wiXG4gICAgW2F0dHIudmlld0JveF09XCJkcmF3LnZpZXdCb3hcIlxuICA+XG4gICAgPGRlZnM+XG4gICAgICA8cGF0dGVyblxuICAgICAgICBpZD1cInN0cmlwZXNcIlxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwiZHJhdy5yb3dIZWlnaHRcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiZHJhdy5yb3dIZWlnaHRcIlxuICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICA+XG4gICAgICAgIDxsaW5lXG4gICAgICAgICAgW2F0dHIueDFdPVwiMFwiXG4gICAgICAgICAgW2F0dHIueTFdPVwiMFwiXG4gICAgICAgICAgW2F0dHIueDJdPVwiZHJhdy5yb3dIZWlnaHRcIlxuICAgICAgICAgIFthdHRyLnkyXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgICBzdHJva2U9XCJ2YXIoLS13aGl0ZS0xMDApXCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgPjwvbGluZT5cbiAgICAgIDwvcGF0dGVybj5cbiAgICA8L2RlZnM+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJvd05hbWVUb0RyYXcgb2YgZHJhdy5yb3dOYW1lc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgcml2U1ZHVGV4dFRydW5jYXRlXG4gICAgICAgIFt0ZXh0XT1cInJvd05hbWVUb0RyYXcubGFiZWxcIlxuICAgICAgICBbd2lkdGhdPVwiU0VDVElPTl9XSURUSFMuUk9XX05BTUVcIlxuICAgICAgICBjbGFzcz1cInJvdy10aXRsZVwiXG4gICAgICAgIFthdHRyLnhdPVwicm93TmFtZVRvRHJhdy54XCJcbiAgICAgICAgW2F0dHIueV09XCJyb3dOYW1lVG9EcmF3LnlcIlxuICAgICAgPjwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZHJhdy54VGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGlja1wiXG4gICAgICAgIFthdHRyLnhdPVwiZHJhdy54U2NhbGUodGljaylcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIHdpZHRoPVwiMVwiXG4gICAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgIFthdHRyLnhdPVwiZHJhdy54U2NhbGUodGljaylcIlxuICAgICAgICBbYXR0ci55XT1cImxvY2F0aW9uT2ZYQXhpc1RpY2soKVwiXG4gICAgICAgIGR4PVwiNFwiXG4gICAgICAgIGR5PVwiLTRcIlxuICAgICAgPlxuICAgICAgICB7eyB2YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8Z1xuICAgICAgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZHJhdy5yZWN0c1wiXG4gICAgICAobW91c2VlbnRlcik9XCJob3ZlcmVkQmFuZCQubmV4dCh7IHJvd05hbWU6IHJlY3Qucm93TmFtZSwgZXZlbnQ6ICRldmVudCB9KVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkQmFuZCQubmV4dChudWxsKVwiXG4gICAgICAoY2xpY2spPVwiXG4gICAgICAgIHN0YWNrQ2xpY2tlZC5lbWl0KHsgc3RhY2tJbmRleDogcmVjdC5zdGFja0luZGV4IH0pO1xuICAgICAgICBob3ZlcmVkQmFuZCQubmV4dChudWxsKVxuICAgICAgXCJcbiAgICA+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInJvd1wiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuZmlsbF09XCJyZWN0LmZpbGxcIlxuICAgICAgICBbY2xhc3MuYmx1cnJlZF09XCJcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpICE9PSBudWxsICYmXG4gICAgICAgICAgKGhvdmVyZWRCYW5kJCB8IGFzeW5jKT8ucm93TmFtZSAhPT0gcmVjdC5yb3dOYW1lXG4gICAgICAgIFwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHJlY3RcbiAgICAgICAgKm5nSWY9XCJyZWN0LnN0cmlwZWRcIlxuICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgIGZpbGw9XCJ1cmwoI3N0cmlwZXMpXCJcbiAgICAgID48L3JlY3Q+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCByb3dUb3RhbFRvRHJhdyBvZiBkcmF3LnJvd1RvdGFsc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJyb3ctdG90YWxcIlxuICAgICAgICBbYXR0ci54XT1cInJvd1RvdGFsVG9EcmF3LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJvd1RvdGFsVG9EcmF3LnlcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICA+XG4gICAgICAgIHt7IHJvd1RvdGFsVG9EcmF3LmxhYmVsIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICA8L3N2Zz5cbiAgPGxlZ2VuZCAqbmdJZj1cImRyYXdEYXRhJCB8IGFzeW5jOyBsZXQgZHJhd1wiPlxuICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRyYXcubGVnZW5kSXRlbXNcIlxuICAgICAgW2xhYmVsXT1cIml0ZW0ubGFiZWxcIlxuICAgICAgW2NvbG9yVG9rZW5dPVwiaXRlbS5jb2xvclRva2VuXCJcbiAgICAgIFtzdHlsZV09XCJpdGVtLnN0eWxlID8gaXRlbS5zdHlsZSA6ICdzb2xpZCdcIlxuICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgPC9sZWdlbmQ+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhbGxvdXQkIHwgYXN5bmM7IGxldCBjYWxsb3V0XCI+XG4gIDxyaXYtY2FsbG91dFxuICAgICpyaXYtb3ZlcmxheVxuICAgIFthbmNob3JdPVwiY2FsbG91dD8uYW5jaG9yID8/IG51bGxcIlxuICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2JvdHRvbS1jZW50ZXInXCJcbiAgICBbYWxsb3dlZFBvc2l0aW9uc109XCJbXG4gICAgICAnY2VudGVyLXJpZ2h0JyxcbiAgICAgICdjZW50ZXItbGVmdCcsXG4gICAgICAndG9wLWNlbnRlcicsXG4gICAgICAnYm90dG9tLWNlbnRlcidcbiAgICBdXCJcbiAgICBbdGhlbWVdPVwiJ2xpZ2h0J1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1jb250ZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNhbGxvdXRIZWFkZXJUZW1wbGF0ZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY2FsbG91dCB9XCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1ldHJpYyBvZiBjYWxsb3V0Py5tZXRyaWNzXCIgY2xhc3M9XCJjYWxsb3V0LXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlcmllcy1sYWJlbFwiPlxuICAgICAgICAgIDxyaXYtbGVnZW5kLWl0ZW0gW2NvbG9yVG9rZW5dPVwibWV0cmljLmNvbG9yVG9rZW5cIj48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgICA8c3Bhbj57eyBtZXRyaWMubGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgbWV0cmljLnZhbHVlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvcml2LWNhbGxvdXQ+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICN6ZXJvU3RhdGU+XG4gIDxyaXYtemVyby1zdGF0ZSBbbWVzc2FnZV09XCJ6ZXJvU3RhdGVNZXNzYWdlXCI+PC9yaXYtemVyby1zdGF0ZT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { union } from 'd3-array';
|
|
2
|
-
// Get a ordered+unique list of keys from the row elements
|
|
3
|
-
export function getKeyOrder(rowStacks) {
|
|
4
|
-
const allRowElements = [];
|
|
5
|
-
for (const rowStack of rowStacks) {
|
|
6
|
-
allRowElements.push(...rowStack.data);
|
|
7
|
-
}
|
|
8
|
-
const orderedKeys = union([
|
|
9
|
-
...allRowElements.map(rowElement => rowElement.label),
|
|
10
|
-
]);
|
|
11
|
-
return orderedKeys;
|
|
12
|
-
}
|
|
13
|
-
// Get a list of the legend items we should show
|
|
14
|
-
export function getLegendItems(rowsForDisplay, keysInOrder) {
|
|
15
|
-
const legendItemArray = [];
|
|
16
|
-
for (const rowForDisplay of rowsForDisplay) {
|
|
17
|
-
for (const key of keysInOrder) {
|
|
18
|
-
const elementMatchingKey = rowForDisplay.elementsButStacked.find(element => element.label == key);
|
|
19
|
-
if (elementMatchingKey &&
|
|
20
|
-
elementMatchingKey.value > 0 &&
|
|
21
|
-
!legendItemArray.find(item => item.label == key)) {
|
|
22
|
-
legendItemArray.push({
|
|
23
|
-
label: elementMatchingKey.label,
|
|
24
|
-
colorToken: elementMatchingKey.colorToken,
|
|
25
|
-
style: elementMatchingKey.style,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return legendItemArray;
|
|
31
|
-
}
|
|
32
|
-
// Make sure we have input in a standard format.
|
|
33
|
-
export function standardizeRowStacks(rowStacks, keysInOrder) {
|
|
34
|
-
const standardizedRows = [];
|
|
35
|
-
for (const rowStack of rowStacks) {
|
|
36
|
-
const standardizedData = [];
|
|
37
|
-
for (const key of keysInOrder) {
|
|
38
|
-
const elementMatchingKey = rowStack.data.find(element => element.label == key);
|
|
39
|
-
if (elementMatchingKey) {
|
|
40
|
-
standardizedData.push({
|
|
41
|
-
...elementMatchingKey,
|
|
42
|
-
value: Math.abs(elementMatchingKey.value),
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
standardizedRows.push({
|
|
47
|
-
rowName: rowStack.rowName,
|
|
48
|
-
data: standardizedData,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
return standardizedRows;
|
|
52
|
-
}
|
|
53
|
-
// Stacks the elements and creates the baselines and toplines
|
|
54
|
-
export function getRowDisplayInfo(rowStack, index) {
|
|
55
|
-
const elementsButStacked = [];
|
|
56
|
-
let currentBaseline = 0;
|
|
57
|
-
let currentTopline = 0;
|
|
58
|
-
for (const currentElement of rowStack.data) {
|
|
59
|
-
currentTopline += currentElement.value ?? 0;
|
|
60
|
-
elementsButStacked.push({
|
|
61
|
-
...currentElement,
|
|
62
|
-
baseline: currentBaseline,
|
|
63
|
-
topline: currentTopline,
|
|
64
|
-
});
|
|
65
|
-
currentBaseline = currentTopline;
|
|
66
|
-
}
|
|
67
|
-
return {
|
|
68
|
-
rowName: rowStack.rowName,
|
|
69
|
-
elementsButStacked: elementsButStacked,
|
|
70
|
-
rowTotal: currentTopline,
|
|
71
|
-
stackIndex: index,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3Zpc3VhbGl6YXRpb24vc3RhY2tlZC1yb3cvc3RhY2tlZC1yb3cuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBdUQ1QywwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLFdBQVcsQ0FDekIsU0FBeUM7SUFFekMsTUFBTSxjQUFjLEdBQXFDLEVBQUUsQ0FBQztJQUM1RCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRTtRQUNoQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3ZDO0lBQ0QsTUFBTSxXQUFXLEdBQXNCLEtBQUssQ0FBQztRQUMzQyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO0tBQ3RELENBQUMsQ0FBQztJQUNILE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxnREFBZ0Q7QUFDaEQsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsY0FBZ0MsRUFDaEMsV0FBOEI7SUFNOUIsTUFBTSxlQUFlLEdBQXNDLEVBQUUsQ0FBQztJQUM5RCxLQUFLLE1BQU0sYUFBYSxJQUFJLGNBQWMsRUFBRTtRQUMxQyxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRTtZQUM3QixNQUFNLGtCQUFrQixHQUN0QixhQUFhLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN6RSxJQUNFLGtCQUFrQjtnQkFDbEIsa0JBQWtCLENBQUMsS0FBSyxHQUFHLENBQUM7Z0JBQzVCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQ2hEO2dCQUNBLGVBQWUsQ0FBQyxJQUFJLENBQUM7b0JBQ25CLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxLQUFLO29CQUMvQixVQUFVLEVBQUUsa0JBQWtCLENBQUMsVUFBVTtvQkFDekMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLEtBQUs7aUJBQ2hDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7S0FDRjtJQUNELE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxnREFBZ0Q7QUFDaEQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxTQUF5QyxFQUN6QyxXQUE4QjtJQUU5QixNQUFNLGdCQUFnQixHQUFtQyxFQUFFLENBQUM7SUFDNUQsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUU7UUFDaEMsTUFBTSxnQkFBZ0IsR0FBcUMsRUFBRSxDQUFDO1FBQzlELEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFO1lBQzdCLE1BQU0sa0JBQWtCLEdBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN0RCxJQUFJLGtCQUFrQixFQUFFO2dCQUN0QixnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7b0JBQ3BCLEdBQUcsa0JBQWtCO29CQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7aUJBQzFDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7UUFDRCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7WUFDcEIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1lBQ3pCLElBQUksRUFBRSxnQkFBZ0I7U0FDdkIsQ0FBQyxDQUFDO0tBQ0o7SUFDRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFFRCw2REFBNkQ7QUFDN0QsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixRQUFzQyxFQUN0QyxLQUFhO0lBRWIsTUFBTSxrQkFBa0IsR0FBd0IsRUFBRSxDQUFDO0lBQ25ELElBQUksZUFBZSxHQUFXLENBQUMsQ0FBQztJQUNoQyxJQUFJLGNBQWMsR0FBVyxDQUFDLENBQUM7SUFFL0IsS0FBSyxNQUFNLGNBQWMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFO1FBQzFDLGNBQWMsSUFBSSxjQUFjLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUU1QyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDdEIsR0FBRyxjQUFjO1lBQ2pCLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLE9BQU8sRUFBRSxjQUFjO1NBQ3hCLENBQUMsQ0FBQztRQUVILGVBQWUsR0FBRyxjQUFjLENBQUM7S0FDbEM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1FBQ3pCLGtCQUFrQixFQUFFLGtCQUFrQjtRQUN0QyxRQUFRLEVBQUUsY0FBYztRQUN4QixVQUFVLEVBQUUsS0FBSztLQUNsQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludGVyblNldCwgdW5pb24gfSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQgeyBTY2FsZUxpbmVhciB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7IExlZ2VuZEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9sZWdlbmQtaXRlbS9sZWdlbmQtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3RhY2tlZFJvd0NvbXBvbmVudCB9IGZyb20gJy4vc3RhY2tlZC1yb3cuY29tcG9uZW50JztcblxuLy8gQSByb3cgZWxlbWVudCB3aXRoIGEgYmFzZWxpbmUsIHRvcGxpbmUsIGFuZCBhIHJlZmVyZW5jZSB0byB0aGUgc3RhY2sgaXQgYmVsb25ncyB0b1xudHlwZSBTdGFja2VkUm93RWxlbWVudCA9IFN0YWNrZWRSb3dDb21wb25lbnQuUm93RWxlbWVudCAmIHtcbiAgYmFzZWxpbmU6IG51bWJlcjtcbiAgdG9wbGluZTogbnVtYmVyO1xufTtcblxuLy8gVGhlIGRhdGEgYWJvdXQgYSByZWN0YW5nbGUgd2UgZGlzcGxheSBvbiBzY3JlZW5cbmV4cG9ydCB0eXBlIFJvd1JlY3RhbmdsZSA9IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBmaWxsOiBzdHJpbmc7XG4gIHN0cmlwZWQ6IGJvb2xlYW47XG4gIHJvd05hbWU6IHN0cmluZztcbiAgc3RhY2tlZFJvd0VsZW1lbnQ6IFN0YWNrZWRSb3dFbGVtZW50O1xuICBzdGFja0luZGV4OiBudW1iZXI7XG59O1xuXG4vLyBUaGUgZGF0YSBhYm91dCBhIHJvdyBsYWJlbCB3ZSBkaXNwbGF5IG9uIHNjcmVlblxuZXhwb3J0IHR5cGUgUm93TGFiZWwgPSB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xufTtcblxuLy8gVGhlIGRhdGEgd2UgYXJlIGRpc3BsYXlpbmcgaW4gdGhpcyBjb21wb25lbnRcbmV4cG9ydCB0eXBlIFN0YWNrZWRSb3dEcmF3RGF0YSA9IHtcbiAgbGVnZW5kSXRlbXM6IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICBzdHlsZT86IExlZ2VuZEl0ZW1Db21wb25lbnQuU3R5bGU7XG4gIH1bXTtcbiAgcm93SGVpZ2h0OiBudW1iZXI7XG4gIHJlY3RzOiBSb3dSZWN0YW5nbGVbXTtcbiAgcm93TmFtZXM6IFJvd0xhYmVsW107XG4gIHJvd1RvdGFsczogUm93TGFiZWxbXTtcbiAgdmlld0JveDogc3RyaW5nO1xuICB4U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj47XG4gIHhUaWNrczogbnVtYmVyW107XG59O1xuXG4vLyBFdmVyeXRoaW5nIHRoYXQgZGVzY3JpYmVzIGEgcm93IHdlIHdpbGwgZGlzcGxheVxuZXhwb3J0IHR5cGUgUm93RGlzcGxheUluZm8gPSB7XG4gIHJvd05hbWU6IHN0cmluZztcbiAgZWxlbWVudHNCdXRTdGFja2VkOiBTdGFja2VkUm93RWxlbWVudFtdO1xuICByb3dUb3RhbDogbnVtYmVyO1xuICBzdGFja0luZGV4OiBudW1iZXI7XG59O1xuXG4vLyBHZXQgYSBvcmRlcmVkK3VuaXF1ZSBsaXN0IG9mIGtleXMgZnJvbSB0aGUgcm93IGVsZW1lbnRzXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5T3JkZXIoXG4gIHJvd1N0YWNrczogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdLFxuKTogSW50ZXJuU2V0PHN0cmluZz4ge1xuICBjb25zdCBhbGxSb3dFbGVtZW50czogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dFbGVtZW50W10gPSBbXTtcbiAgZm9yIChjb25zdCByb3dTdGFjayBvZiByb3dTdGFja3MpIHtcbiAgICBhbGxSb3dFbGVtZW50cy5wdXNoKC4uLnJvd1N0YWNrLmRhdGEpO1xuICB9XG4gIGNvbnN0IG9yZGVyZWRLZXlzOiBJbnRlcm5TZXQ8c3RyaW5nPiA9IHVuaW9uKFtcbiAgICAuLi5hbGxSb3dFbGVtZW50cy5tYXAocm93RWxlbWVudCA9PiByb3dFbGVtZW50LmxhYmVsKSxcbiAgXSk7XG4gIHJldHVybiBvcmRlcmVkS2V5cztcbn1cblxuLy8gR2V0IGEgbGlzdCBvZiB0aGUgbGVnZW5kIGl0ZW1zIHdlIHNob3VsZCBzaG93XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGVnZW5kSXRlbXMoXG4gIHJvd3NGb3JEaXNwbGF5OiBSb3dEaXNwbGF5SW5mb1tdLFxuICBrZXlzSW5PcmRlcjogSW50ZXJuU2V0PHN0cmluZz4sXG4pOiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGNvbG9yVG9rZW46IHN0cmluZztcbiAgc3R5bGU/OiBMZWdlbmRJdGVtQ29tcG9uZW50LlN0eWxlO1xufVtdIHtcbiAgY29uc3QgbGVnZW5kSXRlbUFycmF5OiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRMZWdlbmRJdGVtcz4gPSBbXTtcbiAgZm9yIChjb25zdCByb3dGb3JEaXNwbGF5IG9mIHJvd3NGb3JEaXNwbGF5KSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0luT3JkZXIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRNYXRjaGluZ0tleTogU3RhY2tlZFJvd0VsZW1lbnQgfCB1bmRlZmluZWQgPVxuICAgICAgICByb3dGb3JEaXNwbGF5LmVsZW1lbnRzQnV0U3RhY2tlZC5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5sYWJlbCA9PSBrZXkpO1xuICAgICAgaWYgKFxuICAgICAgICBlbGVtZW50TWF0Y2hpbmdLZXkgJiZcbiAgICAgICAgZWxlbWVudE1hdGNoaW5nS2V5LnZhbHVlID4gMCAmJlxuICAgICAgICAhbGVnZW5kSXRlbUFycmF5LmZpbmQoaXRlbSA9PiBpdGVtLmxhYmVsID09IGtleSlcbiAgICAgICkge1xuICAgICAgICBsZWdlbmRJdGVtQXJyYXkucHVzaCh7XG4gICAgICAgICAgbGFiZWw6IGVsZW1lbnRNYXRjaGluZ0tleS5sYWJlbCxcbiAgICAgICAgICBjb2xvclRva2VuOiBlbGVtZW50TWF0Y2hpbmdLZXkuY29sb3JUb2tlbixcbiAgICAgICAgICBzdHlsZTogZWxlbWVudE1hdGNoaW5nS2V5LnN0eWxlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxlZ2VuZEl0ZW1BcnJheTtcbn1cblxuLy8gTWFrZSBzdXJlIHdlIGhhdmUgaW5wdXQgaW4gYSBzdGFuZGFyZCBmb3JtYXQuXG5leHBvcnQgZnVuY3Rpb24gc3RhbmRhcmRpemVSb3dTdGFja3MoXG4gIHJvd1N0YWNrczogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdLFxuICBrZXlzSW5PcmRlcjogSW50ZXJuU2V0PHN0cmluZz4sXG4pOiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10ge1xuICBjb25zdCBzdGFuZGFyZGl6ZWRSb3dzOiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10gPSBbXTtcbiAgZm9yIChjb25zdCByb3dTdGFjayBvZiByb3dTdGFja3MpIHtcbiAgICBjb25zdCBzdGFuZGFyZGl6ZWREYXRhOiBTdGFja2VkUm93Q29tcG9uZW50LlJvd0VsZW1lbnRbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNJbk9yZGVyKSB7XG4gICAgICBjb25zdCBlbGVtZW50TWF0Y2hpbmdLZXk6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93RWxlbWVudCB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHJvd1N0YWNrLmRhdGEuZmluZChlbGVtZW50ID0+IGVsZW1lbnQubGFiZWwgPT0ga2V5KTtcbiAgICAgIGlmIChlbGVtZW50TWF0Y2hpbmdLZXkpIHtcbiAgICAgICAgc3RhbmRhcmRpemVkRGF0YS5wdXNoKHtcbiAgICAgICAgICAuLi5lbGVtZW50TWF0Y2hpbmdLZXksXG4gICAgICAgICAgdmFsdWU6IE1hdGguYWJzKGVsZW1lbnRNYXRjaGluZ0tleS52YWx1ZSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBzdGFuZGFyZGl6ZWRSb3dzLnB1c2goe1xuICAgICAgcm93TmFtZTogcm93U3RhY2sucm93TmFtZSxcbiAgICAgIGRhdGE6IHN0YW5kYXJkaXplZERhdGEsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHN0YW5kYXJkaXplZFJvd3M7XG59XG5cbi8vIFN0YWNrcyB0aGUgZWxlbWVudHMgYW5kIGNyZWF0ZXMgdGhlIGJhc2VsaW5lcyBhbmQgdG9wbGluZXNcbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3dEaXNwbGF5SW5mbyhcbiAgcm93U3RhY2s6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2ssXG4gIGluZGV4OiBudW1iZXIsXG4pOiBSb3dEaXNwbGF5SW5mbyB7XG4gIGNvbnN0IGVsZW1lbnRzQnV0U3RhY2tlZDogU3RhY2tlZFJvd0VsZW1lbnRbXSA9IFtdO1xuICBsZXQgY3VycmVudEJhc2VsaW5lOiBudW1iZXIgPSAwO1xuICBsZXQgY3VycmVudFRvcGxpbmU6IG51bWJlciA9IDA7XG5cbiAgZm9yIChjb25zdCBjdXJyZW50RWxlbWVudCBvZiByb3dTdGFjay5kYXRhKSB7XG4gICAgY3VycmVudFRvcGxpbmUgKz0gY3VycmVudEVsZW1lbnQudmFsdWUgPz8gMDtcblxuICAgIGVsZW1lbnRzQnV0U3RhY2tlZC5wdXNoKHtcbiAgICAgIC4uLmN1cnJlbnRFbGVtZW50LFxuICAgICAgYmFzZWxpbmU6IGN1cnJlbnRCYXNlbGluZSxcbiAgICAgIHRvcGxpbmU6IGN1cnJlbnRUb3BsaW5lLFxuICAgIH0pO1xuXG4gICAgY3VycmVudEJhc2VsaW5lID0gY3VycmVudFRvcGxpbmU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJvd05hbWU6IHJvd1N0YWNrLnJvd05hbWUsXG4gICAgZWxlbWVudHNCdXRTdGFja2VkOiBlbGVtZW50c0J1dFN0YWNrZWQsXG4gICAgcm93VG90YWw6IGN1cnJlbnRUb3BsaW5lLFxuICAgIHN0YWNrSW5kZXg6IGluZGV4LFxuICB9O1xufVxuIl19
|