@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
|
@@ -0,0 +1,882 @@
|
|
|
1
|
+
import Fuse from 'fuse.js';
|
|
2
|
+
import { defaultsDeep, flattenDeep, isNumber, sortBy } from 'lodash';
|
|
3
|
+
import { connectable, map, merge, ReplaySubject, scan, startWith, Subject, } from 'rxjs';
|
|
4
|
+
import { NumberPipe } from '../../format/pipes/number.pipe';
|
|
5
|
+
export var RivSelect;
|
|
6
|
+
(function (RivSelect) {
|
|
7
|
+
/////////////
|
|
8
|
+
// Options //
|
|
9
|
+
/////////////
|
|
10
|
+
/**
|
|
11
|
+
* The OptionSet class provides Set-like functionality, but uniqueness is
|
|
12
|
+
* determined by the option's ID rather than the object reference.
|
|
13
|
+
*/
|
|
14
|
+
class OptionSet extends Set {
|
|
15
|
+
constructor(values) {
|
|
16
|
+
super();
|
|
17
|
+
// Parallel id → option map so has()/add()/delete() are O(1) instead of
|
|
18
|
+
// spreading the Set and linear-scanning it. Rebuilding an O(N²) lookup
|
|
19
|
+
// for a 16k-option selection was the primary cause of the multi-minute
|
|
20
|
+
// freeze that surfaced RVT-25383's tree-select scale problem.
|
|
21
|
+
this.byId = new Map();
|
|
22
|
+
if (values) {
|
|
23
|
+
for (const value of values) {
|
|
24
|
+
this.add(value);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
has(option) {
|
|
29
|
+
return this.byId.has(option.id);
|
|
30
|
+
}
|
|
31
|
+
add(option) {
|
|
32
|
+
const existing = this.byId.get(option.id);
|
|
33
|
+
if (existing === option) {
|
|
34
|
+
// Same object reference — nothing to update. Ancestor re-adds
|
|
35
|
+
// during a selection snapshot hit this path repeatedly, so keeping
|
|
36
|
+
// it O(1) is what prevents the tree-select N² blow-up seen in
|
|
37
|
+
// RVT-25470.
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
if (existing !== undefined) {
|
|
41
|
+
// Different reference, same id — swap the stored ref while
|
|
42
|
+
// preserving Set insertion order. The rebuild is O(N), but this
|
|
43
|
+
// path is rare in practice (the hot ancestor-snapshot loop takes
|
|
44
|
+
// the identity fast-path above).
|
|
45
|
+
const items = [...this].map(o => (o.id === option.id ? option : o));
|
|
46
|
+
this.byId.set(option.id, option);
|
|
47
|
+
super.clear();
|
|
48
|
+
for (const item of items)
|
|
49
|
+
super.add(item);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this.byId.set(option.id, option);
|
|
53
|
+
super.add(option);
|
|
54
|
+
}
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
delete(option) {
|
|
58
|
+
const existing = this.byId.get(option.id);
|
|
59
|
+
if (existing) {
|
|
60
|
+
this.byId.delete(option.id);
|
|
61
|
+
super.delete(existing);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
clear() {
|
|
69
|
+
this.byId.clear();
|
|
70
|
+
super.clear();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
RivSelect.OptionSet = OptionSet;
|
|
74
|
+
const MIN_OPTIONS_FOR_CONTROLS = 5;
|
|
75
|
+
const DEFAULT_DISPLAY_LIMIT = 100;
|
|
76
|
+
function createManager(source, options) {
|
|
77
|
+
const defaultState = {
|
|
78
|
+
query: {
|
|
79
|
+
search: '',
|
|
80
|
+
order: 'title',
|
|
81
|
+
},
|
|
82
|
+
load: {
|
|
83
|
+
loading: false,
|
|
84
|
+
error: null,
|
|
85
|
+
},
|
|
86
|
+
sourceOptionGroups: [],
|
|
87
|
+
originalOptionGroups: [],
|
|
88
|
+
selection: {
|
|
89
|
+
selected: new OptionSet(),
|
|
90
|
+
},
|
|
91
|
+
display: {
|
|
92
|
+
placeholder: 'Select',
|
|
93
|
+
open: false,
|
|
94
|
+
expandedOptions: new Set(),
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
const defaultedInitialState = defaultsDeep({}, options?.initialState, defaultState);
|
|
98
|
+
const actions = new Subject();
|
|
99
|
+
const internalActions = new Subject();
|
|
100
|
+
const coreStateWithSelectionSnapshot = merge(actions, internalActions).pipe(scan(([state, snapshot], action) => {
|
|
101
|
+
const newState = sideEffects(reduce(state, action, options), action, source, internalActions);
|
|
102
|
+
const newSelectionSnapshot = (action.type === 'openChange' && action.open) ||
|
|
103
|
+
(action.type === 'loadComplete' &&
|
|
104
|
+
(newState.display.open || options?.inline))
|
|
105
|
+
? createSelectionSnapshotWithAncestors(newState)
|
|
106
|
+
: snapshot;
|
|
107
|
+
return [newState, newSelectionSnapshot];
|
|
108
|
+
}, [defaultedInitialState, new OptionSet()]), startWith([
|
|
109
|
+
defaultedInitialState,
|
|
110
|
+
new OptionSet(),
|
|
111
|
+
]));
|
|
112
|
+
const state = connectable(coreStateWithSelectionSnapshot.pipe(map(([s, selectionAtOpen]) => {
|
|
113
|
+
const allOptionGroups = s.sourceOptionGroups.map(optionGroup => {
|
|
114
|
+
return {
|
|
115
|
+
...optionGroup,
|
|
116
|
+
options: optionGroup.options.map(option => augmentOptionToFullOption(s, option, options)),
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
const topLevelOptions = getTopLevelOptions(allOptionGroups);
|
|
120
|
+
const sortedOptionGroups = options?.sortSelectedToTop ?? options?.allowMultiSelect
|
|
121
|
+
? sortOptionsByPreviouslySelectedState(allOptionGroups, selectionAtOpen)
|
|
122
|
+
: allOptionGroups;
|
|
123
|
+
const displayLimit = options?.displayLimit ?? DEFAULT_DISPLAY_LIMIT;
|
|
124
|
+
const displayLimitedOptionGroups = applyDisplayLimit(sortedOptionGroups, displayLimit);
|
|
125
|
+
const fullOptionGroups = applySelectedOptionLimit(s, displayLimitedOptionGroups, topLevelOptions, options);
|
|
126
|
+
return {
|
|
127
|
+
...s,
|
|
128
|
+
query: {
|
|
129
|
+
...s.query,
|
|
130
|
+
showSearch: !!s.query.search ||
|
|
131
|
+
(!!options?.allowSearch &&
|
|
132
|
+
countAllOptions(allOptionGroups) >
|
|
133
|
+
MIN_OPTIONS_FOR_CONTROLS) ||
|
|
134
|
+
countAllOptions(allOptionGroups) > displayLimit,
|
|
135
|
+
searchPlaceholder: options?.searchPlaceholder ?? 'Search',
|
|
136
|
+
showOrder: !!options?.allowOrder &&
|
|
137
|
+
!s.query.search &&
|
|
138
|
+
countAllOptions(allOptionGroups) > MIN_OPTIONS_FOR_CONTROLS,
|
|
139
|
+
},
|
|
140
|
+
fullOptionGroups,
|
|
141
|
+
selection: {
|
|
142
|
+
...s.selection,
|
|
143
|
+
allowMultiSelect: !!options?.allowMultiSelect,
|
|
144
|
+
allowSelectAll: !!options?.allowSelectAll &&
|
|
145
|
+
options?.selectedOptionLimit == undefined,
|
|
146
|
+
visibleSelectionState: getParentMultiSelectionState(topLevelOptions),
|
|
147
|
+
},
|
|
148
|
+
display: {
|
|
149
|
+
...s.display,
|
|
150
|
+
formattedSelectedOptions: getFormattedOptionsForDisplay(s, topLevelOptions, options),
|
|
151
|
+
zeroStateMessage: getZeroStateMessage(s),
|
|
152
|
+
dividers: !!options?.dividers,
|
|
153
|
+
inline: !!options?.inline,
|
|
154
|
+
maxHeight: options?.maxHeight ?? null,
|
|
155
|
+
maxWidth: options?.maxWidth ?? null,
|
|
156
|
+
minHeight: options?.minHeight ?? null,
|
|
157
|
+
minWidth: options?.minWidth ?? null,
|
|
158
|
+
displayLimitMessage: getDisplayLimitMessage(countVisibleOptions(fullOptionGroups, !!s.query.search), countVisibleOptions(allOptionGroups, !!s.query.search), s.query),
|
|
159
|
+
showSingleSelected: !!options?.showSingleSelected,
|
|
160
|
+
pillCount: getPillCountForDisplay(s, topLevelOptions, options),
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
})), {
|
|
164
|
+
connector: () => new ReplaySubject(1),
|
|
165
|
+
resetOnDisconnect: false,
|
|
166
|
+
});
|
|
167
|
+
state.connect();
|
|
168
|
+
// Load the options immediately for selects that are displayed inline.
|
|
169
|
+
if (options?.inline)
|
|
170
|
+
actions.next({ type: 'load' });
|
|
171
|
+
return { actions, state };
|
|
172
|
+
}
|
|
173
|
+
RivSelect.createManager = createManager;
|
|
174
|
+
function createInMemoryManager(fetchDataset, options) {
|
|
175
|
+
let data;
|
|
176
|
+
let fuse;
|
|
177
|
+
let exactMatch = false;
|
|
178
|
+
let parents;
|
|
179
|
+
let children;
|
|
180
|
+
const source = async (query, mostRecentAction) => {
|
|
181
|
+
/*
|
|
182
|
+
Re-fetch the options on the load action, and rebuild the state
|
|
183
|
+
derived from the option data.
|
|
184
|
+
*/
|
|
185
|
+
if (mostRecentAction.type === 'load' ||
|
|
186
|
+
mostRecentAction.type === 'openChange') {
|
|
187
|
+
data = await fetchDataset();
|
|
188
|
+
const topLevelOptions = getTopLevelOptions(data);
|
|
189
|
+
fuse = new Fuse(flattenOptions(topLevelOptions, false), {
|
|
190
|
+
threshold: 0.2,
|
|
191
|
+
keys: ['title'],
|
|
192
|
+
includeScore: true,
|
|
193
|
+
includeMatches: true,
|
|
194
|
+
...options?.fuseOptions,
|
|
195
|
+
});
|
|
196
|
+
exactMatch = options?.fuseOptions?.threshold == 0;
|
|
197
|
+
[parents, children] = getRelationshipMaps(topLevelOptions);
|
|
198
|
+
}
|
|
199
|
+
// Leading/trailing whitespace shouldn't affect fuzzy matching (Fuse
|
|
200
|
+
// scores the pattern's length against the text's, so a stray space
|
|
201
|
+
// changes results in surprising ways); a search string of only
|
|
202
|
+
// whitespace is treated the same as no search.
|
|
203
|
+
const search = query.search.trim();
|
|
204
|
+
/*
|
|
205
|
+
If the user is not searching options, return the full set of options
|
|
206
|
+
sorted appropriately.
|
|
207
|
+
*/
|
|
208
|
+
if (!search) {
|
|
209
|
+
/*
|
|
210
|
+
The `source` order property allows for opting out of automatic
|
|
211
|
+
sorting, returning the data in its natural input order.
|
|
212
|
+
*/
|
|
213
|
+
if (query.order === 'source')
|
|
214
|
+
return data;
|
|
215
|
+
/*
|
|
216
|
+
Sort the options by title and subtitle.
|
|
217
|
+
*/
|
|
218
|
+
if (query.order === 'title') {
|
|
219
|
+
function sortByTitle(options) {
|
|
220
|
+
return sortBy(options, [
|
|
221
|
+
(o) => o.title.toLowerCase(),
|
|
222
|
+
(o) => o.subtitle?.toLowerCase() ?? '',
|
|
223
|
+
]).map(option => ({
|
|
224
|
+
...option,
|
|
225
|
+
children: option.children?.length
|
|
226
|
+
? sortByTitle(option.children)
|
|
227
|
+
: undefined,
|
|
228
|
+
}));
|
|
229
|
+
}
|
|
230
|
+
return data.map(group => ({
|
|
231
|
+
...group,
|
|
232
|
+
options: sortByTitle(group.options),
|
|
233
|
+
}));
|
|
234
|
+
}
|
|
235
|
+
/*
|
|
236
|
+
Sort the options by count, then by title, then by subtitle.
|
|
237
|
+
*/
|
|
238
|
+
if (query.order === 'count') {
|
|
239
|
+
function sortByCount(options) {
|
|
240
|
+
return sortBy(options, [
|
|
241
|
+
(o) => (isNumber(o.count) ? -o.count : Infinity),
|
|
242
|
+
(o) => o.title.toLowerCase(),
|
|
243
|
+
(o) => o.subtitle?.toLowerCase() ?? '',
|
|
244
|
+
]).map(option => ({
|
|
245
|
+
...option,
|
|
246
|
+
children: option.children?.length
|
|
247
|
+
? sortByCount(option.children)
|
|
248
|
+
: undefined,
|
|
249
|
+
}));
|
|
250
|
+
}
|
|
251
|
+
return data.map(group => ({
|
|
252
|
+
...group,
|
|
253
|
+
options: sortByCount(group.options),
|
|
254
|
+
}));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/*
|
|
258
|
+
Execute the search with fuse. Once we have the search match data,
|
|
259
|
+
rebuild just as much of the tree as is needed to render the search
|
|
260
|
+
results. Specifically, any match will need all of its ancestors (so
|
|
261
|
+
that matched leaf nodes are shown nested under their ancestors) and all
|
|
262
|
+
of its children (because a matching parent means that all of its
|
|
263
|
+
descendants match too, per the design specification), whether they
|
|
264
|
+
themselves matched or not.
|
|
265
|
+
*/
|
|
266
|
+
const matchedOptions = fuse.search(search);
|
|
267
|
+
const matchedIds = new Set(matchedOptions.map(result => result.item.id));
|
|
268
|
+
const matchAncestors = new Set();
|
|
269
|
+
function collectAncestors(ids) {
|
|
270
|
+
for (const id of ids) {
|
|
271
|
+
const parentId = parents.get(id);
|
|
272
|
+
if (parentId) {
|
|
273
|
+
matchAncestors.add(parentId);
|
|
274
|
+
collectAncestors([parentId]);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
collectAncestors([...matchedIds]);
|
|
279
|
+
const matchDescendants = new Set();
|
|
280
|
+
function collectDescendants(ids) {
|
|
281
|
+
for (const id of ids) {
|
|
282
|
+
const childrenIds = children.get(id);
|
|
283
|
+
if (childrenIds) {
|
|
284
|
+
for (const child of childrenIds) {
|
|
285
|
+
matchDescendants.add(child);
|
|
286
|
+
}
|
|
287
|
+
collectDescendants(childrenIds);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
collectDescendants([...matchedIds]);
|
|
292
|
+
/*
|
|
293
|
+
Next, we'll combine all the matched IDs with their direct ancestors and
|
|
294
|
+
descandants, and filter the original data set down to just these
|
|
295
|
+
options.
|
|
296
|
+
*/
|
|
297
|
+
const filteredIds = new Set([
|
|
298
|
+
...matchedIds,
|
|
299
|
+
...matchAncestors,
|
|
300
|
+
...matchDescendants,
|
|
301
|
+
]);
|
|
302
|
+
function filterOptions(options) {
|
|
303
|
+
const filteredOptions = [];
|
|
304
|
+
for (const option of options) {
|
|
305
|
+
if (filteredIds.has(option.id)) {
|
|
306
|
+
filteredOptions.push({
|
|
307
|
+
...option,
|
|
308
|
+
children: option.children?.length
|
|
309
|
+
? filterOptions(option.children)
|
|
310
|
+
: undefined,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return filteredOptions;
|
|
315
|
+
}
|
|
316
|
+
const filteredOptions = filterOptions(getTopLevelOptions(data));
|
|
317
|
+
/*
|
|
318
|
+
At this point, we have an array of distinct trees (top-level options),
|
|
319
|
+
filtered down to only the options matching the search query. Note that
|
|
320
|
+
we don't care about section headers when searching since results should
|
|
321
|
+
be ordered by relevance. To calculate the order of these trees, we'll
|
|
322
|
+
take the total match scores for options found in the tree, divided by
|
|
323
|
+
the count of matches in the tree (the best average match score).
|
|
324
|
+
*/
|
|
325
|
+
const scoreMap = new Map(matchedOptions.map(result => [result.item.id, result.score ?? 0]));
|
|
326
|
+
const ordered = sortBy(filteredOptions, (option) => {
|
|
327
|
+
function calculateScore(option) {
|
|
328
|
+
return ((scoreMap.get(option.id) ?? 0) +
|
|
329
|
+
(option.children ?? []).reduce((score, child) => score + calculateScore(child), 0));
|
|
330
|
+
}
|
|
331
|
+
function calculateCount(option) {
|
|
332
|
+
return (1 +
|
|
333
|
+
(option.children ?? []).reduce((count, child) => count + calculateCount(child), 0));
|
|
334
|
+
}
|
|
335
|
+
const totalScore = calculateScore(option);
|
|
336
|
+
const totalCount = calculateCount(option);
|
|
337
|
+
return totalScore / totalCount;
|
|
338
|
+
});
|
|
339
|
+
const highlightMap = new Map(matchedOptions.map(result => {
|
|
340
|
+
const highlights = {};
|
|
341
|
+
for (const match of result.matches ?? []) {
|
|
342
|
+
// filter out inexact matches
|
|
343
|
+
if (exactMatch && match.value != null) {
|
|
344
|
+
match.indices = match.indices.filter(isFuseMatchExact(match, search));
|
|
345
|
+
}
|
|
346
|
+
if (match.key === 'title') {
|
|
347
|
+
highlights.titleHighlightIndices = [...match.indices];
|
|
348
|
+
}
|
|
349
|
+
if (match.key === 'subtitle') {
|
|
350
|
+
highlights.subtitleHighlightIndices = [...match.indices];
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return [result.item.id, highlights];
|
|
354
|
+
}));
|
|
355
|
+
function addHighlightsToOption(options) {
|
|
356
|
+
return options.map(option => ({
|
|
357
|
+
...option,
|
|
358
|
+
...highlightMap.get(option.id),
|
|
359
|
+
...(option.children?.length
|
|
360
|
+
? { children: addHighlightsToOption(option.children) }
|
|
361
|
+
: null),
|
|
362
|
+
}));
|
|
363
|
+
}
|
|
364
|
+
return {
|
|
365
|
+
data: [{ options: addHighlightsToOption(ordered) }],
|
|
366
|
+
originalData: data,
|
|
367
|
+
};
|
|
368
|
+
};
|
|
369
|
+
return createManager(source, options);
|
|
370
|
+
}
|
|
371
|
+
RivSelect.createInMemoryManager = createInMemoryManager;
|
|
372
|
+
function isFuseMatchExact(match, search) {
|
|
373
|
+
return matchedIndices => {
|
|
374
|
+
const matchedValue = match
|
|
375
|
+
.value.slice(matchedIndices[0], matchedIndices[1] + 1)
|
|
376
|
+
.toLowerCase();
|
|
377
|
+
// fuse is weird with it's matches. For a text of "planning" and a search string of "plan"
|
|
378
|
+
// the matched value will be "plann" with the extra 'n' because of its fuzzy matching.
|
|
379
|
+
// so just make sure the matched value at least starts with the search string.
|
|
380
|
+
// it's extra weird because for a text of "analytics" and a search string of "nalytics",
|
|
381
|
+
// the matched value will be "analytics". So we just need to make sure the the matched value
|
|
382
|
+
// includes the search string because there might be extra stuff on the front or the end.
|
|
383
|
+
return matchedValue.includes(search.toLowerCase());
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
RivSelect.isFuseMatchExact = isFuseMatchExact;
|
|
387
|
+
//////////////////////////////////
|
|
388
|
+
// State reducer (with helpers) //
|
|
389
|
+
//////////////////////////////////
|
|
390
|
+
function createSelectionSnapshotWithAncestors(state) {
|
|
391
|
+
const snapshot = new OptionSet(state.selection.selected);
|
|
392
|
+
const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
|
|
393
|
+
const [parents] = getRelationshipMaps(topLevelOptions);
|
|
394
|
+
// Sibling leaves share ancestors, so once we've walked up through a
|
|
395
|
+
// given parent id we can stop — anything above it has already been
|
|
396
|
+
// added by a previous iteration. Without this short-circuit the loop
|
|
397
|
+
// re-runs findOption (which is a full tree walk) once per shared
|
|
398
|
+
// ancestor edge, which was the #2 hotspot behind OptionSet.add in
|
|
399
|
+
// RVT-25470's profile.
|
|
400
|
+
const visited = new Set();
|
|
401
|
+
for (const selectedOption of state.selection.selected) {
|
|
402
|
+
let parentId = parents.get(selectedOption.id);
|
|
403
|
+
while (parentId !== undefined && !visited.has(parentId)) {
|
|
404
|
+
visited.add(parentId);
|
|
405
|
+
const parentOption = findOption(topLevelOptions, parentId);
|
|
406
|
+
if (parentOption) {
|
|
407
|
+
snapshot.add(parentOption);
|
|
408
|
+
}
|
|
409
|
+
parentId = parents.get(parentId);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return snapshot;
|
|
413
|
+
}
|
|
414
|
+
function getDisplayLimitMessage(displayedOptionCount, totalOptionCount, query) {
|
|
415
|
+
if (displayedOptionCount === totalOptionCount)
|
|
416
|
+
return null;
|
|
417
|
+
const rivNumber = new NumberPipe();
|
|
418
|
+
const displayed = rivNumber.transform(displayedOptionCount);
|
|
419
|
+
const total = rivNumber.transform(totalOptionCount);
|
|
420
|
+
const start = `Showing ${displayed} of ${total} options`;
|
|
421
|
+
return query.search ? `${start} matching "${query.search}"` : start;
|
|
422
|
+
}
|
|
423
|
+
function countVisibleOptions(optionGroups, leafOnly) {
|
|
424
|
+
function count(options) {
|
|
425
|
+
return options.reduce((acc, option) => {
|
|
426
|
+
if (option.expanded && option.children?.length) {
|
|
427
|
+
return acc + (leafOnly ? 0 : 1) + count(option.children);
|
|
428
|
+
}
|
|
429
|
+
return acc + 1;
|
|
430
|
+
}, 0);
|
|
431
|
+
}
|
|
432
|
+
return optionGroups.reduce((total, group) => total + count(group.options), 0);
|
|
433
|
+
}
|
|
434
|
+
function countAllOptions(optionGroups) {
|
|
435
|
+
function count(options) {
|
|
436
|
+
return options.reduce((acc, option) => {
|
|
437
|
+
if (option.children?.length) {
|
|
438
|
+
return acc + 1 + count(option.children);
|
|
439
|
+
}
|
|
440
|
+
return acc + 1;
|
|
441
|
+
}, 0);
|
|
442
|
+
}
|
|
443
|
+
return optionGroups.reduce((total, group) => total + count(group.options), 0);
|
|
444
|
+
}
|
|
445
|
+
function applyDisplayLimit(optionGroups, displayLimit) {
|
|
446
|
+
function filterWithLimit(options, remaining) {
|
|
447
|
+
let left = remaining;
|
|
448
|
+
const visibleOptions = [];
|
|
449
|
+
for (const option of options) {
|
|
450
|
+
if (left <= 0)
|
|
451
|
+
break;
|
|
452
|
+
if (option.expanded && option.children?.length) {
|
|
453
|
+
const [childOptions, childRemaining] = filterWithLimit(option.children, left - 1);
|
|
454
|
+
visibleOptions.push({
|
|
455
|
+
...option,
|
|
456
|
+
children: childOptions,
|
|
457
|
+
});
|
|
458
|
+
left = childRemaining;
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
visibleOptions.push(option);
|
|
462
|
+
left--;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return [visibleOptions, left];
|
|
466
|
+
}
|
|
467
|
+
const startingValue = [[], displayLimit];
|
|
468
|
+
const [resolvedGroups] = optionGroups.reduce(([groups, remaining], group) => {
|
|
469
|
+
const [options, leftAfter] = filterWithLimit(group.options, remaining);
|
|
470
|
+
if (options.length) {
|
|
471
|
+
return [[...groups, { ...group, options }], leftAfter];
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
return [groups, remaining];
|
|
475
|
+
}
|
|
476
|
+
}, startingValue);
|
|
477
|
+
return resolvedGroups;
|
|
478
|
+
}
|
|
479
|
+
/*
|
|
480
|
+
Sort options so that previously selected options (from prior sessions)
|
|
481
|
+
appear at the top of their peer/sibling lists.
|
|
482
|
+
*/
|
|
483
|
+
function sortOptionsByPreviouslySelectedState(optionGroups, selectionAtOpen) {
|
|
484
|
+
function sortOptions(options) {
|
|
485
|
+
return sortBy(options, option => !selectionAtOpen.has(option)).map(option => {
|
|
486
|
+
if (option.children) {
|
|
487
|
+
return {
|
|
488
|
+
...option,
|
|
489
|
+
children: sortOptions(option.children),
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
else
|
|
493
|
+
return option;
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
return optionGroups.map(group => ({
|
|
497
|
+
...group,
|
|
498
|
+
options: sortOptions(group.options),
|
|
499
|
+
}));
|
|
500
|
+
}
|
|
501
|
+
/*
|
|
502
|
+
If we are restricting how many options are selected to a specific limit,
|
|
503
|
+
when we are at that limit, disable all options not currently selected.
|
|
504
|
+
*/
|
|
505
|
+
function applySelectedOptionLimit(state, optionGroups, topLevelOptions, options) {
|
|
506
|
+
if (options?.selectedOptionLimit === undefined) {
|
|
507
|
+
return optionGroups;
|
|
508
|
+
}
|
|
509
|
+
// When useTopLevelOptionsForDisplay is true and search is active, count
|
|
510
|
+
// selected top-level options from the original (unfiltered) data to ensure
|
|
511
|
+
// already-selected options that don't match the search are still counted.
|
|
512
|
+
const useOriginalForCounting = options?.useTopLevelOptionsForDisplay &&
|
|
513
|
+
state.query.search &&
|
|
514
|
+
state.originalOptionGroups.length > 0;
|
|
515
|
+
const topOptionsForCounting = useOriginalForCounting
|
|
516
|
+
? getTopLevelOptions(state.originalOptionGroups).map(option => augmentOptionToFullOption(state, option, options))
|
|
517
|
+
: topLevelOptions;
|
|
518
|
+
const selectedOrIndeterminateTopOptions = topOptionsForCounting.filter(option => option.selected != false);
|
|
519
|
+
const numSelectedOptions = options?.useTopLevelOptionsForDisplay
|
|
520
|
+
? selectedOrIndeterminateTopOptions.length
|
|
521
|
+
: state.selection.selected.size;
|
|
522
|
+
const selectedOptionLimit = options.selectedOptionLimit;
|
|
523
|
+
// If we have less items selected than the limit, business as usual.
|
|
524
|
+
if (numSelectedOptions < selectedOptionLimit) {
|
|
525
|
+
return optionGroups;
|
|
526
|
+
}
|
|
527
|
+
// If we have equal items selected to the limit (or more), prevent users from selecting more options.
|
|
528
|
+
function disableUnselectedItems(currentOptions, optionsAreChildrenOfSelectedGroup) {
|
|
529
|
+
const updatedItems = [];
|
|
530
|
+
for (const option of currentOptions) {
|
|
531
|
+
const isDisabledOrUnselected = !!option.disabled || (option.selectable && option.selected == false);
|
|
532
|
+
const isCurrentOptionSelected = option.selectable && option.selected != false;
|
|
533
|
+
const isCurrentOrParentOptionSelected = isCurrentOptionSelected || optionsAreChildrenOfSelectedGroup;
|
|
534
|
+
const forceEnabledBasedOnParent = !!options?.useTopLevelOptionsForDisplay &&
|
|
535
|
+
optionsAreChildrenOfSelectedGroup;
|
|
536
|
+
const markDisabled = isDisabledOrUnselected && !forceEnabledBasedOnParent;
|
|
537
|
+
if (option.children?.length) {
|
|
538
|
+
const childOptions = disableUnselectedItems(option.children, isCurrentOrParentOptionSelected);
|
|
539
|
+
updatedItems.push({
|
|
540
|
+
...option,
|
|
541
|
+
disabled: !!markDisabled,
|
|
542
|
+
children: childOptions,
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
else {
|
|
546
|
+
updatedItems.push({
|
|
547
|
+
...option,
|
|
548
|
+
disabled: !!markDisabled,
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
return updatedItems;
|
|
553
|
+
}
|
|
554
|
+
const groupsAfterLimit = [];
|
|
555
|
+
for (const currentGroup of optionGroups) {
|
|
556
|
+
groupsAfterLimit.push({
|
|
557
|
+
...currentGroup,
|
|
558
|
+
options: disableUnselectedItems(currentGroup.options, false),
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
return groupsAfterLimit;
|
|
562
|
+
}
|
|
563
|
+
function getRelationshipMaps(options) {
|
|
564
|
+
const parents = new Map();
|
|
565
|
+
function buildParentsMap(options, parent) {
|
|
566
|
+
for (const option of options) {
|
|
567
|
+
if (parent) {
|
|
568
|
+
parents.set(option.id, parent.id);
|
|
569
|
+
}
|
|
570
|
+
if (option.children?.length) {
|
|
571
|
+
buildParentsMap(option.children, option);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
buildParentsMap(options);
|
|
576
|
+
const children = new Map();
|
|
577
|
+
function buildChildrenMap(options) {
|
|
578
|
+
for (const option of options) {
|
|
579
|
+
if (option.children?.length) {
|
|
580
|
+
children.set(option.id, option.children.map(({ id }) => id));
|
|
581
|
+
buildChildrenMap(option.children);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
buildChildrenMap(options);
|
|
586
|
+
return [parents, children];
|
|
587
|
+
}
|
|
588
|
+
function getTopLevelOptions(optionGroups) {
|
|
589
|
+
return optionGroups.reduce((options, group) => [...options, ...group.options], []);
|
|
590
|
+
}
|
|
591
|
+
function getParentMultiSelectionState(children) {
|
|
592
|
+
if (children.every(child => child.selected === true))
|
|
593
|
+
return true;
|
|
594
|
+
if (children.every(child => child.selected === false))
|
|
595
|
+
return false;
|
|
596
|
+
return 'indeterminate';
|
|
597
|
+
}
|
|
598
|
+
function augmentOptionToFullOption(state, option, managerOptions) {
|
|
599
|
+
if (option.children?.length) {
|
|
600
|
+
const augmentedChildren = option.children.map(child => augmentOptionToFullOption(state, child, managerOptions));
|
|
601
|
+
const selectableWhenSearching = managerOptions?.allowSelectNonLeafDuringSearch ?? false;
|
|
602
|
+
// When allowSelectNonLeafDuringSearch is enabled and search is active,
|
|
603
|
+
// calculate selection state from ALL original children, not just the
|
|
604
|
+
// filtered ones visible in search results.
|
|
605
|
+
const useOriginalForSelectionState = managerOptions?.allowSelectNonLeafDuringSearch &&
|
|
606
|
+
state.query.search &&
|
|
607
|
+
state.originalOptionGroups.length > 0;
|
|
608
|
+
let selected;
|
|
609
|
+
if (useOriginalForSelectionState) {
|
|
610
|
+
const originalOption = findOption(getTopLevelOptions(state.originalOptionGroups), option.id);
|
|
611
|
+
if (originalOption) {
|
|
612
|
+
const allLeaves = flattenOptions([originalOption], true);
|
|
613
|
+
const selectedCount = allLeaves.filter(leaf => state.selection.selected.has(leaf)).length;
|
|
614
|
+
if (selectedCount === 0) {
|
|
615
|
+
selected = false;
|
|
616
|
+
}
|
|
617
|
+
else if (selectedCount === allLeaves.length) {
|
|
618
|
+
selected = true;
|
|
619
|
+
}
|
|
620
|
+
else {
|
|
621
|
+
selected = 'indeterminate';
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
else {
|
|
625
|
+
selected = getParentMultiSelectionState(augmentedChildren);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
else {
|
|
629
|
+
selected = getParentMultiSelectionState(augmentedChildren);
|
|
630
|
+
}
|
|
631
|
+
return {
|
|
632
|
+
...option,
|
|
633
|
+
children: augmentedChildren,
|
|
634
|
+
selected,
|
|
635
|
+
expanded: state.query.search
|
|
636
|
+
? true
|
|
637
|
+
: state.display.expandedOptions.has(option.id),
|
|
638
|
+
selectable: !state.query.search || selectableWhenSearching,
|
|
639
|
+
expandable: !state.query.search,
|
|
640
|
+
};
|
|
641
|
+
}
|
|
642
|
+
return {
|
|
643
|
+
...option,
|
|
644
|
+
children: undefined,
|
|
645
|
+
selected: state.selection.selected.has(option),
|
|
646
|
+
expanded: false,
|
|
647
|
+
selectable: true,
|
|
648
|
+
expandable: false,
|
|
649
|
+
};
|
|
650
|
+
}
|
|
651
|
+
function getFormattedOptionsForDisplay(state, topLevelOptions, options) {
|
|
652
|
+
// If we have a custom display function, use it
|
|
653
|
+
if (options?.getCustomOptionDisplay) {
|
|
654
|
+
return options.getCustomOptionDisplay([...state.selection.selected]);
|
|
655
|
+
}
|
|
656
|
+
if (options?.useTopLevelOptionsForDisplay) {
|
|
657
|
+
return getTopLevelFormattedOptionsForDisplay(topLevelOptions);
|
|
658
|
+
}
|
|
659
|
+
// Otherwise, use the default display for options - titles separated by commas.
|
|
660
|
+
return [...state.selection.selected].map(({ title }) => title).join(', ');
|
|
661
|
+
}
|
|
662
|
+
function getTopLevelFormattedOptionsForDisplay(topLevelOptions) {
|
|
663
|
+
if (!topLevelOptions || topLevelOptions.length == 0) {
|
|
664
|
+
return '';
|
|
665
|
+
}
|
|
666
|
+
const selectedOrIndeterminateTopOptions = topLevelOptions.filter(option => option.selected != false);
|
|
667
|
+
return selectedOrIndeterminateTopOptions
|
|
668
|
+
.map(({ title }) => title)
|
|
669
|
+
.join(', ');
|
|
670
|
+
}
|
|
671
|
+
function getPillCountForDisplay(state, topLevelOptions, options) {
|
|
672
|
+
if (options?.useTopLevelOptionsForDisplay) {
|
|
673
|
+
const selectedOrIndeterminateTopOptions = topLevelOptions.filter(option => option.selected != false);
|
|
674
|
+
return selectedOrIndeterminateTopOptions.length;
|
|
675
|
+
}
|
|
676
|
+
return state.selection.selected.size;
|
|
677
|
+
}
|
|
678
|
+
function getZeroStateMessage(state) {
|
|
679
|
+
if (state.sourceOptionGroups.every(group => group.options.length === 0)) {
|
|
680
|
+
if (state.query.search)
|
|
681
|
+
return 'No results found.';
|
|
682
|
+
return 'No options.';
|
|
683
|
+
}
|
|
684
|
+
return null;
|
|
685
|
+
}
|
|
686
|
+
function findOption(options, id) {
|
|
687
|
+
for (const option of options) {
|
|
688
|
+
if (option.id === id)
|
|
689
|
+
return option;
|
|
690
|
+
if (option.children?.length) {
|
|
691
|
+
const child = findOption(option.children, id);
|
|
692
|
+
if (child)
|
|
693
|
+
return child;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
return null;
|
|
697
|
+
}
|
|
698
|
+
function flattenOptions(options, leafOnly) {
|
|
699
|
+
return flattenDeep(options.map(option => {
|
|
700
|
+
if (option.children?.length) {
|
|
701
|
+
const descendants = option.children.map(child => flattenOptions([child], leafOnly));
|
|
702
|
+
return leafOnly ? descendants : [option, ...descendants];
|
|
703
|
+
}
|
|
704
|
+
else {
|
|
705
|
+
return [option];
|
|
706
|
+
}
|
|
707
|
+
}));
|
|
708
|
+
}
|
|
709
|
+
function toggleSelected(state, id, managerOptions) {
|
|
710
|
+
const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
|
|
711
|
+
const option = findOption(topLevelOptions, id);
|
|
712
|
+
if (!option)
|
|
713
|
+
return state;
|
|
714
|
+
const newSelection = new OptionSet(state.selection.selected);
|
|
715
|
+
const newValue = !(augmentOptionToFullOption(state, option, managerOptions).selected === true);
|
|
716
|
+
// When allowSelectNonLeafDuringSearch is enabled and search is active,
|
|
717
|
+
// use the original (unfiltered) data to get all children, not just
|
|
718
|
+
// those visible in the filtered search results.
|
|
719
|
+
const useOriginalData = managerOptions?.allowSelectNonLeafDuringSearch &&
|
|
720
|
+
state.query.search &&
|
|
721
|
+
state.originalOptionGroups.length > 0;
|
|
722
|
+
const optionForLeaves = useOriginalData
|
|
723
|
+
? findOption(getTopLevelOptions(state.originalOptionGroups), id) ?? option
|
|
724
|
+
: option;
|
|
725
|
+
const leaves = flattenOptions([optionForLeaves], true);
|
|
726
|
+
for (const leaf of leaves) {
|
|
727
|
+
if (newValue) {
|
|
728
|
+
newSelection.add(leaf);
|
|
729
|
+
}
|
|
730
|
+
else {
|
|
731
|
+
newSelection.delete(leaf);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
return {
|
|
735
|
+
...state,
|
|
736
|
+
selection: {
|
|
737
|
+
selected: newSelection,
|
|
738
|
+
},
|
|
739
|
+
};
|
|
740
|
+
}
|
|
741
|
+
function setSelectedOption(state, id) {
|
|
742
|
+
const topLevelOptions = getTopLevelOptions(state.sourceOptionGroups);
|
|
743
|
+
const option = findOption(topLevelOptions, id);
|
|
744
|
+
if (!option)
|
|
745
|
+
return state;
|
|
746
|
+
const newSelection = new OptionSet();
|
|
747
|
+
newSelection.add(option);
|
|
748
|
+
return {
|
|
749
|
+
...state,
|
|
750
|
+
selection: {
|
|
751
|
+
selected: newSelection,
|
|
752
|
+
},
|
|
753
|
+
};
|
|
754
|
+
}
|
|
755
|
+
function toggleVisibleSelected(state) {
|
|
756
|
+
const leaves = flattenOptions(getTopLevelOptions(state.sourceOptionGroups), true);
|
|
757
|
+
const isAllSelected = leaves.every(leaf => state.selection.selected.has(leaf));
|
|
758
|
+
const newSelection = new OptionSet(state.selection.selected);
|
|
759
|
+
for (const leaf of leaves) {
|
|
760
|
+
if (isAllSelected)
|
|
761
|
+
newSelection.delete(leaf);
|
|
762
|
+
else
|
|
763
|
+
newSelection.add(leaf);
|
|
764
|
+
}
|
|
765
|
+
return {
|
|
766
|
+
...state,
|
|
767
|
+
selection: {
|
|
768
|
+
...state.selection,
|
|
769
|
+
selected: newSelection,
|
|
770
|
+
},
|
|
771
|
+
};
|
|
772
|
+
}
|
|
773
|
+
function toggleOptionExpanded(state, id) {
|
|
774
|
+
const newValue = !state.display.expandedOptions.has(id);
|
|
775
|
+
const newExpandedOptions = new Set(state.display.expandedOptions);
|
|
776
|
+
if (newValue)
|
|
777
|
+
newExpandedOptions.add(id);
|
|
778
|
+
else
|
|
779
|
+
newExpandedOptions.delete(id);
|
|
780
|
+
return {
|
|
781
|
+
...state,
|
|
782
|
+
display: {
|
|
783
|
+
...state.display,
|
|
784
|
+
expandedOptions: newExpandedOptions,
|
|
785
|
+
},
|
|
786
|
+
};
|
|
787
|
+
}
|
|
788
|
+
function sideEffects(state, action, source, internalActions) {
|
|
789
|
+
if (action.type === 'load' ||
|
|
790
|
+
action.type === 'searchChange' ||
|
|
791
|
+
action.type === 'orderChange' ||
|
|
792
|
+
(action.type === 'openChange' && action.open)) {
|
|
793
|
+
source(state.query, action)
|
|
794
|
+
.then(result => {
|
|
795
|
+
const data = Array.isArray(result) ? result : result.data;
|
|
796
|
+
const originalData = Array.isArray(result)
|
|
797
|
+
? undefined
|
|
798
|
+
: result.originalData;
|
|
799
|
+
internalActions.next({ type: 'loadComplete', data, originalData });
|
|
800
|
+
})
|
|
801
|
+
.catch(error => {
|
|
802
|
+
// eslint-disable-next-line no-console
|
|
803
|
+
console.error(error);
|
|
804
|
+
internalActions.next({ type: 'loadError', error });
|
|
805
|
+
});
|
|
806
|
+
return {
|
|
807
|
+
...state,
|
|
808
|
+
load: {
|
|
809
|
+
loading: true,
|
|
810
|
+
error: null,
|
|
811
|
+
},
|
|
812
|
+
};
|
|
813
|
+
}
|
|
814
|
+
return state;
|
|
815
|
+
}
|
|
816
|
+
function reduce(state, action, managerOptions) {
|
|
817
|
+
switch (action.type) {
|
|
818
|
+
case 'load':
|
|
819
|
+
return state;
|
|
820
|
+
case 'loadComplete':
|
|
821
|
+
return {
|
|
822
|
+
...state,
|
|
823
|
+
load: {
|
|
824
|
+
loading: false,
|
|
825
|
+
error: null,
|
|
826
|
+
},
|
|
827
|
+
sourceOptionGroups: action.data,
|
|
828
|
+
originalOptionGroups: action.originalData ?? [],
|
|
829
|
+
};
|
|
830
|
+
case 'loadError':
|
|
831
|
+
return {
|
|
832
|
+
...state,
|
|
833
|
+
load: {
|
|
834
|
+
loading: false,
|
|
835
|
+
error: action.error,
|
|
836
|
+
},
|
|
837
|
+
};
|
|
838
|
+
case 'openChange':
|
|
839
|
+
return {
|
|
840
|
+
...state,
|
|
841
|
+
query: {
|
|
842
|
+
...state.query,
|
|
843
|
+
search: '',
|
|
844
|
+
},
|
|
845
|
+
display: {
|
|
846
|
+
...state.display,
|
|
847
|
+
open: action.open,
|
|
848
|
+
},
|
|
849
|
+
};
|
|
850
|
+
case 'searchChange':
|
|
851
|
+
return {
|
|
852
|
+
...state,
|
|
853
|
+
query: {
|
|
854
|
+
...state.query,
|
|
855
|
+
search: action.payload,
|
|
856
|
+
},
|
|
857
|
+
};
|
|
858
|
+
case 'orderChange':
|
|
859
|
+
return {
|
|
860
|
+
...state,
|
|
861
|
+
query: {
|
|
862
|
+
...state.query,
|
|
863
|
+
order: action.payload,
|
|
864
|
+
},
|
|
865
|
+
};
|
|
866
|
+
case 'selectionChange':
|
|
867
|
+
return {
|
|
868
|
+
...state,
|
|
869
|
+
selection: action.payload,
|
|
870
|
+
};
|
|
871
|
+
case 'toggleOptionSelected':
|
|
872
|
+
return toggleSelected(state, action.id, managerOptions);
|
|
873
|
+
case 'setSelectedOption':
|
|
874
|
+
return setSelectedOption(state, action.id);
|
|
875
|
+
case 'visibleSelectedChange':
|
|
876
|
+
return toggleVisibleSelected(state);
|
|
877
|
+
case 'toggleOptionExpanded':
|
|
878
|
+
return toggleOptionExpanded(state, action.id);
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
})(RivSelect || (RivSelect = {}));
|
|
882
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9pbnB1dC9zZWxlY3Qvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUtOLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckUsT0FBTyxFQUNMLFdBQVcsRUFFWCxHQUFHLEVBQ0gsS0FBSyxFQUVMLGFBQWEsRUFDYixJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUc1RCxNQUFNLEtBQVcsU0FBUyxDQXk4Q3pCO0FBejhDRCxXQUFpQixTQUFTO0lBQ3hCLGFBQWE7SUFDYixhQUFhO0lBQ2IsYUFBYTtJQXVHYjs7O09BR0c7SUFDSCxNQUFhLFNBQWdDLFNBQVEsR0FBb0I7UUFPdkUsWUFBWSxNQUF5QztZQUNuRCxLQUFLLEVBQUUsQ0FBQztZQVBWLHVFQUF1RTtZQUN2RSx1RUFBdUU7WUFDdkUsdUVBQXVFO1lBQ3ZFLDhEQUE4RDtZQUM3QyxTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7WUFJMUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFUSxHQUFHLENBQUMsTUFBdUM7WUFDbEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVRLEdBQUcsQ0FBQyxNQUF1QjtZQUNsQyxN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QUFTLFFBeThDekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRnVzZSwge1xuICBGdXNlUmVzdWx0LFxuICBGdXNlUmVzdWx0TWF0Y2gsXG4gIElGdXNlT3B0aW9ucyxcbiAgUmFuZ2VUdXBsZSxcbn0gZnJvbSAnZnVzZS5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0c0RlZXAsIGZsYXR0ZW5EZWVwLCBpc051bWJlciwgc29ydEJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIGNvbm5lY3RhYmxlLFxuICBDb25uZWN0YWJsZSxcbiAgbWFwLFxuICBtZXJnZSxcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgc2NhbixcbiAgc3RhcnRXaXRoLFxuICBTdWJqZWN0LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERlZXBQYXJ0aWFsIH0gZnJvbSAndXRpbGl0eS10eXBlcyc7XG5pbXBvcnQgeyBOdW1iZXJQaXBlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL251bWJlci5waXBlJztcbmltcG9ydCB7IEhpZ2hsaWdodENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3Zpc3VhbGl6YXRpb24vaGlnaGxpZ2h0L2hpZ2hsaWdodC5jb21wb25lbnQnO1xuXG5leHBvcnQgbmFtZXNwYWNlIFJpdlNlbGVjdCB7XG4gIC8vLy8vLy8vLy8vLy9cbiAgLy8gT3B0aW9ucyAvL1xuICAvLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgC0tLS0tLS0tLS0tLS0tLS0tLS3ilIDilIDilIDilJBcbiAgICog4pSCIEJhc2VPcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCXG4gICAqIOKUgiBUaGUgY29yZSBkYXRhIHJlcXVpcmVkIGZvciBlYWNoIG9wdGlvbiAgICDilIJcbiAgICog4pSCIChzdWNoIGFzIGlkIGFuZCB0aXRsZSkuICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAtLS0tLS0tLS0tLS0tLS0tLS0t4pSA4pSA4pSkXG4gICAqIOKUgiBPcHRpb24gKEJhc2VPcHRpb24gKyBjaGlsZHJlbikgICAgICAgICAgICDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgUHJvdmlkZXMgcmVjdXJzaXZlIHR5cGUgc2FmZXR5IHRvIHRoZSAgICAg4pSCXG4gICAqIOKUgiB0eXBlIHNhZmV0eSB0byB0aGUgQmFzZU9wdGlvbi4gICAgICAgICAgICDilIJcbiAgICog4pSU4pSALS0tLS0tLS0tLS0tLS0tLS0t4pSsLS0tLS0tLeKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgKiAgICAgICAgICAgICAgICAgICAgIHxcbiAgICog4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pa84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUgiBTb3VyY2VPcHRpb24gKE9wdGlvbiArIHNlYXJjaCBoaWdobGlnaHRzKSDilIJcbiAgICog4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilIIgQWRkcyBzZWFyY2ggaGlnaGxpZ2h0cyB0byB0aGUgT3B0aW9uIGFuZCAg4pSCXG4gICAqIOKUgiBpcyB0aGUgcmV0dXJuIHR5cGUgZm9yIHRoZSBvcHRpb24gU291cmNlICDilIJcbiAgICog4pSCIChkYXRhIGZldGNoZXIpIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICogICAgICAgICAgICAgICAgICAgICB8XG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilIIgRnVsbE9wdGlvbiAoU291cmNlT3B0aW9uICsgVUkgc3RhdGUpICAgICAg4pSCXG4gICAqIOKUgiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIJcbiAgICog4pSCIEF1Z21lbnRzIHRoZSBTb3VyY2VPcHRpb24gd2l0aCBhbGwgb2YgdGhlIOKUglxuICAgKiDilIIgVUkgaW5mb3JtYXRpb24gZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgICAg4pSCXG4gICAqIOKUgiBzdGF0ZSwgc3VjaCBhcyBzZWxlY3Rpb24gc3RhdHVzLCB3aGV0aGVyICDilIJcbiAgICog4pSCIG9yIG5vdCB0aGUgbm9kZSBpcyBleHBhbmRlZCwgZXRjLiAgICAgICAgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSB1c2FnZXMgb2YgT21pdDwuLi4+IGluIHRoaXMgc2VjdGlvbiBhcmUgbm90IHJlcXVpcmVkLCBidXRcbiAgICogZG8gaGVscCBpbi1lZGl0b3IgdHlwZSBoaW50cyB0byBiZSBtb3JlIGNsZWFyIGFuZCBkaXJlY3QuXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIEJhc2VPcHRpb24gPSB7XG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcjtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHN1YnRpdGxlPzogc3RyaW5nO1xuICAgIGhlbHA/OiBzdHJpbmc7XG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAgIGRpc2FibGVkRXhwbGFuYXRpb24/OiBzdHJpbmc7XG4gIH07XG4gIGV4cG9ydCB0eXBlIE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbiA9IEJhc2VPcHRpb24+ID0gTyAmIHtcbiAgICBjaGlsZHJlbj86IE9wdGlvbjxPPltdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZU9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBPbWl0PFxuICAgIE9wdGlvbjxPPixcbiAgICAnY2hpbGRyZW4nXG4gID4gJiB7XG4gICAgdGl0bGVIaWdobGlnaHRJbmRpY2VzPzogSGlnaGxpZ2h0Q29tcG9uZW50LkhpZ2hsaWdodEluZGljZXNbXTtcbiAgICBzdWJ0aXRsZUhpZ2hsaWdodEluZGljZXM/OiBIaWdobGlnaHRDb21wb25lbnQuSGlnaGxpZ2h0SW5kaWNlc1tdO1xuICAgIGNoaWxkcmVuPzogU291cmNlT3B0aW9uPE8+W107XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgTXVsdGlTZWxlY3Rpb25TdGF0ZSA9IGJvb2xlYW4gfCAnaW5kZXRlcm1pbmF0ZSc7XG5cbiAgZXhwb3J0IHR5cGUgRnVsbE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBPbWl0PFxuICAgIFNvdXJjZU9wdGlvbjxPPixcbiAgICAnY2hpbGRyZW4nXG4gID4gJiB7XG4gICAgc2VsZWN0ZWQ6IE11bHRpU2VsZWN0aW9uU3RhdGU7XG4gICAgZXhwYW5kZWQ6IGJvb2xlYW47XG4gICAgc2VsZWN0YWJsZTogYm9vbGVhbjtcbiAgICBleHBhbmRhYmxlOiBib29sZWFuO1xuICAgIGNoaWxkcmVuPzogRnVsbE9wdGlvbjxPPltdO1xuICB9O1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gT3B0aW9uIGdyb3VwcyAvL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gT3B0aW9uR3JvdXAsIFNvdXJjZU9wdGlvbkdyb3VwLCBhbmRcbiAgICogRnVsbE9wdGlvbkdyb3VwIGlzIGFuYWxvZ291cyB0byB0aGUgb3B0aW9uIHR5cGVzIGFib3ZlLlxuICAgKlxuICAgKiBBcyB3aXRoIGJlZm9yZSwgdGhlIHVzZSBvZiBPbWl0PC4uLj4gaXMgbm90IHJlcXVpcmVkIGJ1dCBoZWxwZnVsLlxuICAgKi9cblxuICBleHBvcnQgdHlwZSBPcHRpb25Hcm91cDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgaGVhZGVyPzogc3RyaW5nO1xuICAgIC8qKiBJbmZvIGljb24gKyB0b29sdGlwIHNob3duIGJlc2lkZSB0aGUgaGVhZGVyLiBOby1vcCB3aXRob3V0IGEgaGVhZGVyLiAqL1xuICAgIGhlbHA/OiBzdHJpbmc7XG4gICAgb3B0aW9uczogT3B0aW9uPE8+W107XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgU291cmNlT3B0aW9uR3JvdXA8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBPcHRpb25Hcm91cDxPPixcbiAgICAnb3B0aW9ucydcbiAgPiAmIHtcbiAgICBvcHRpb25zOiBTb3VyY2VPcHRpb248Tz5bXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsT3B0aW9uR3JvdXA8TyBleHRlbmRzIEJhc2VPcHRpb24+ID0gT21pdDxcbiAgICBTb3VyY2VPcHRpb25Hcm91cDxPPixcbiAgICAnb3B0aW9ucydcbiAgPiAmIHtcbiAgICBvcHRpb25zOiBGdWxsT3B0aW9uPE8+W107XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBPcHRpb25TZXQgY2xhc3MgcHJvdmlkZXMgU2V0LWxpa2UgZnVuY3Rpb25hbGl0eSwgYnV0IHVuaXF1ZW5lc3MgaXNcbiAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW9uJ3MgSUQgcmF0aGVyIHRoYW4gdGhlIG9iamVjdCByZWZlcmVuY2UuXG4gICAqL1xuICBleHBvcnQgY2xhc3MgT3B0aW9uU2V0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiBleHRlbmRzIFNldDxTb3VyY2VPcHRpb248Tz4+IHtcbiAgICAvLyBQYXJhbGxlbCBpZCDihpIgb3B0aW9uIG1hcCBzbyBoYXMoKS9hZGQoKS9kZWxldGUoKSBhcmUgTygxKSBpbnN0ZWFkIG9mXG4gICAgLy8gc3ByZWFkaW5nIHRoZSBTZXQgYW5kIGxpbmVhci1zY2FubmluZyBpdC4gUmVidWlsZGluZyBhbiBPKE7CsikgbG9va3VwXG4gICAgLy8gZm9yIGEgMTZrLW9wdGlvbiBzZWxlY3Rpb24gd2FzIHRoZSBwcmltYXJ5IGNhdXNlIG9mIHRoZSBtdWx0aS1taW51dGVcbiAgICAvLyBmcmVlemUgdGhhdCBzdXJmYWNlZCBSVlQtMjUzODMncyB0cmVlLXNlbGVjdCBzY2FsZSBwcm9ibGVtLlxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnlJZCA9IG5ldyBNYXA8T1snaWQnXSwgU291cmNlT3B0aW9uPE8+PigpO1xuXG4gICAgY29uc3RydWN0b3IodmFsdWVzPzogSXRlcmFibGU8U291cmNlT3B0aW9uPE8+PiB8IG51bGwpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgdGhpcy5hZGQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgaGFzKG9wdGlvbjogU291cmNlT3B0aW9uPE8+IHwgRnVsbE9wdGlvbjxPPikge1xuICAgICAgcmV0dXJuIHRoaXMuYnlJZC5oYXMob3B0aW9uLmlkKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBhZGQob3B0aW9uOiBTb3VyY2VPcHRpb248Tz4pIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5ieUlkLmdldChvcHRpb24uaWQpO1xuICAgICAgaWYgKGV4aXN0aW5nID09PSBvcHRpb24pIHtcbiAgICAgICAgLy8gU2FtZSBvYmplY3QgcmVmZXJlbmNlIOKAlCBub3RoaW5nIHRvIHVwZGF0ZS4gQW5jZXN0b3IgcmUtYWRkc1xuICAgICAgICAvLyBkdXJpbmcgYSBzZWxlY3Rpb24gc25hcHNob3QgaGl0IHRoaXMgcGF0aCByZXBlYXRlZGx5LCBzbyBrZWVwaW5nXG4gICAgICAgIC8vIGl0IE8oMSkgaXMgd2hhdCBwcmV2ZW50cyB0aGUgdHJlZS1zZWxlY3QgTsKyIGJsb3ctdXAgc2VlbiBpblxuICAgICAgICAvLyBSVlQtMjU0NzAuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gRGlmZmVyZW50IHJlZmVyZW5jZSwgc2FtZSBpZCDigJQgc3dhcCB0aGUgc3RvcmVkIHJlZiB3aGlsZVxuICAgICAgICAvLyBwcmVzZXJ2aW5nIFNldCBpbnNlcnRpb24gb3JkZXIuIFRoZSByZWJ1aWxkIGlzIE8oTiksIGJ1dCB0aGlzXG4gICAgICAgIC8vIHBhdGggaXMgcmFyZSBpbiBwcmFjdGljZSAodGhlIGhvdCBhbmNlc3Rvci1zbmFwc2hvdCBsb29wIHRha2VzXG4gICAgICAgIC8vIHRoZSBpZGVudGl0eSBmYXN0LXBhdGggYWJvdmUpLlxuICAgICAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzXS5tYXAobyA9PiAoby5pZCA9PT0gb3B0aW9uLmlkID8gb3B0aW9uIDogbykpO1xuICAgICAgICB0aGlzLmJ5SWQuc2V0KG9wdGlvbi5pZCwgb3B0aW9uKTtcbiAgICAgICAgc3VwZXIuY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSBzdXBlci5hZGQoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ5SWQuc2V0KG9wdGlvbi5pZCwgb3B0aW9uKTtcbiAgICAgICAgc3VwZXIuYWRkKG9wdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkZWxldGUob3B0aW9uOiBTb3VyY2VPcHRpb248Tz4pIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5ieUlkLmdldChvcHRpb24uaWQpO1xuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIHRoaXMuYnlJZC5kZWxldGUob3B0aW9uLmlkKTtcbiAgICAgICAgc3VwZXIuZGVsZXRlKGV4aXN0aW5nKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY2xlYXIoKSB7XG4gICAgICB0aGlzLmJ5SWQuY2xlYXIoKTtcbiAgICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8vLy8vLy8vLy9cbiAgLy8gU3RhdGUgLy9cbiAgLy8vLy8vLy8vLy9cblxuICAvKipcbiAgICogVGhlIENvcmVTdGF0ZSBwcm92aWRlcyBhbGwgb2YgdGhlIGZvdW5kYXRpb25hbCBwaWVjZXMgb2Ygc3RhdGUgcmVxdWlyZWRcbiAgICogZm9yIGEgd29ya2luZyBjb21wb25lbnQuIEZ1bGxTdGF0ZSBpcyBhIHB1cmUgZGVyaXZhdGlvbiBvZiBDb3JlU3RhdGUgcGx1c1xuICAgKiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zLCBhbmQgcHJvdmlkZXMgY29udmVuaWVuY2VzIGZvciByZW5kZXJpbmcgdGhlXG4gICAqIGNvbXBvbmVudHMuIEFjdGlvbnMgYW5kIHRoZSBjb3JlIHN0YXRlIGFyZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgdG9cbiAgICogcHJvZHVjZSBuZXcgQ29yZVN0YXRlcyAod2hpY2ggYXJlIHRoZW4gdXNlZCB0byBjYWxjdWxhdGUgbmV3IEZ1bGxTdGF0ZXMpLlxuICAgKlxuICAgKiDilIzilIDilIDilIDilIDilIDilIDilJBcbiAgICog4pSCICBVSSAg4peE4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUlOKUgOKUgOKUrOKUgOKUgOKUgOKUmCAgICAgICAg4pSCXG4gICAqICAgIOKUgiAgICAgICAgICAgIOKUglxuICAgKiDilIzilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilJAgICDilIJcbiAgICog4pSCICBBY3Rpb25zICDilIIgICDilIJcbiAgICog4pSU4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSCXG4gICAqICAgIOKUgiAgICAgICAgICAgIOKUglxuICAgKiDilIzilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilJBcbiAgICog4pSCICBTdGF0ZSByZWR1Y2VyICDilIJcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIE9yZGVyQnkgPSAndGl0bGUnIHwgJ2NvdW50JyB8ICdzb3VyY2UnO1xuXG4gIGNvbnN0IE1JTl9PUFRJT05TX0ZPUl9DT05UUk9MUyA9IDU7XG5cbiAgY29uc3QgREVGQVVMVF9ESVNQTEFZX0xJTUlUID0gMTAwO1xuXG4gIGV4cG9ydCB0eXBlIENvcmVTdGF0ZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgcXVlcnk6IHtcbiAgICAgIHNlYXJjaDogc3RyaW5nO1xuICAgICAgb3JkZXI6IE9yZGVyQnk7XG4gICAgfTtcbiAgICBsb2FkOiB7XG4gICAgICBsb2FkaW5nOiBib29sZWFuO1xuICAgICAgZXJyb3I6IHVua25vd24gfCBudWxsO1xuICAgIH07XG4gICAgc291cmNlT3B0aW9uR3JvdXBzOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdO1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyB0aGUgdW5maWx0ZXJlZCBvcmlnaW5hbCBvcHRpb24gZ3JvdXBzIHdoZW4gc2VhcmNoIGZpbHRlcmluZyBpcyBhY3RpdmUuXG4gICAgICogVXNlZCBieSBgYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoYCB0byBzZWxlY3QgYWxsIGNoaWxkcmVuIG9mIGEgcGFyZW50LFxuICAgICAqIGluY2x1ZGluZyB0aG9zZSBub3QgdmlzaWJsZSBpbiB0aGUgZmlsdGVyZWQgc2VhcmNoIHJlc3VsdHMuXG4gICAgICovXG4gICAgb3JpZ2luYWxPcHRpb25Hcm91cHM6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICBzZWxlY3RlZDogT3B0aW9uU2V0PE8+O1xuICAgIH07XG4gICAgZGlzcGxheToge1xuICAgICAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICAgIG9wZW46IGJvb2xlYW47XG4gICAgICBleHBhbmRlZE9wdGlvbnM6IFNldDxPWydpZCddPjtcbiAgICB9O1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxTdGF0ZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSBDb3JlU3RhdGU8Tz4gJiB7XG4gICAgcXVlcnk6IHtcbiAgICAgIHNob3dTZWFyY2g6IGJvb2xlYW47XG4gICAgICBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgICAgc2hvd09yZGVyOiBib29sZWFuO1xuICAgIH07XG4gICAgZnVsbE9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W107XG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICBhbGxvd011bHRpU2VsZWN0OiBib29sZWFuO1xuICAgICAgYWxsb3dTZWxlY3RBbGw6IGJvb2xlYW47XG4gICAgICB2aXNpYmxlU2VsZWN0aW9uU3RhdGU6IE11bHRpU2VsZWN0aW9uU3RhdGU7XG4gICAgfTtcbiAgICBkaXNwbGF5OiB7XG4gICAgICBmb3JtYXR0ZWRTZWxlY3RlZE9wdGlvbnM6IHN0cmluZztcbiAgICAgIHplcm9TdGF0ZU1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgICBkaXZpZGVyczogYm9vbGVhbjtcbiAgICAgIGlubGluZTogYm9vbGVhbjtcbiAgICAgIG1heEhlaWdodDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1heFdpZHRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgbWluSGVpZ2h0OiBzdHJpbmcgfCBudWxsO1xuICAgICAgbWluV2lkdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICBkaXNwbGF5TGltaXRNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgICAgc2hvd1NpbmdsZVNlbGVjdGVkOiBib29sZWFuO1xuICAgICAgcGlsbENvdW50OiBudW1iZXI7XG4gICAgfTtcbiAgfTtcblxuICAvLy8vLy8vLy8vLy8vXG4gIC8vIEFjdGlvbnMgLy9cbiAgLy8vLy8vLy8vLy8vL1xuXG4gIGV4cG9ydCB0eXBlIEFjdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIHwgeyB0eXBlOiAnbG9hZCcgfVxuICAgIHwgeyB0eXBlOiAnb3BlbkNoYW5nZSc7IG9wZW46IGJvb2xlYW4gfVxuICAgIHwgeyB0eXBlOiAnc2VhcmNoQ2hhbmdlJzsgcGF5bG9hZDogc3RyaW5nIH1cbiAgICB8IHsgdHlwZTogJ29yZGVyQ2hhbmdlJzsgcGF5bG9hZDogT3JkZXJCeSB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZWxlY3Rpb25DaGFuZ2UnO1xuICAgICAgICBwYXlsb2FkOiBDb3JlU3RhdGU8Tz5bJ3NlbGVjdGlvbiddO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndG9nZ2xlT3B0aW9uU2VsZWN0ZWQnO1xuICAgICAgICBpZDogT1snaWQnXTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3NldFNlbGVjdGVkT3B0aW9uJztcbiAgICAgICAgaWQ6IE9bJ2lkJ107XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICd2aXNpYmxlU2VsZWN0ZWRDaGFuZ2UnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndG9nZ2xlT3B0aW9uRXhwYW5kZWQnO1xuICAgICAgICBpZDogT1snaWQnXTtcbiAgICAgIH07XG5cbiAgdHlwZSBJbnRlcm5hbEFjdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnbG9hZENvbXBsZXRlJztcbiAgICAgICAgZGF0YTogU291cmNlT3B0aW9uR3JvdXA8Tz5bXTtcbiAgICAgICAgLyoqIE9yaWdpbmFsIHVuZmlsdGVyZWQgZGF0YSwgcHJvdmlkZWQgd2hlbiBzZWFyY2ggaXMgYWN0aXZlICovXG4gICAgICAgIG9yaWdpbmFsRGF0YT86IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICB9XG4gICAgfCB7IHR5cGU6ICdsb2FkRXJyb3InOyBlcnJvcjogdW5rbm93biB9O1xuXG4gIC8vLy8vLy8vLy8vL1xuICAvLyBTb3VyY2UgLy9cbiAgLy8vLy8vLy8vLy8vXG5cbiAgLyoqXG4gICAqIFRoZSBTb3VyY2UncyBqb2IgaXMgdG8gZmV0Y2ggb3B0aW9ucyAoYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUpIHdoaWNoXG4gICAqIHRoZW4gYmxlbmQgd2l0aCB0aGUgb3RoZXIgcGllY2VzIG9mIHN0YXRlIHRvIHByb2R1Y2UgdGhlIEZ1bGxTdGF0ZS5cbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgU291cmNlUmVzdWx0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9XG4gICAgfCBTb3VyY2VPcHRpb25Hcm91cDxPPltdXG4gICAgfCB7XG4gICAgICAgIGRhdGE6IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcmlnaW5hbCB1bmZpbHRlcmVkIGRhdGEsIHByb3ZpZGVkIHdoZW4gc2VhcmNoIGZpbHRlcmluZyBpcyBhY3RpdmUuXG4gICAgICAgICAqIFVzZWQgYnkgYGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaGAgdG8gc2VsZWN0IGFsbCBjaGlsZHJlbiBvZlxuICAgICAgICAgKiBhIHBhcmVudCwgaW5jbHVkaW5nIHRob3NlIG5vdCB2aXNpYmxlIGluIHRoZSBmaWx0ZXJlZCBzZWFyY2ggcmVzdWx0cy5cbiAgICAgICAgICovXG4gICAgICAgIG9yaWdpbmFsRGF0YT86IFNvdXJjZU9wdGlvbkdyb3VwPE8+W107XG4gICAgICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSAoXG4gICAgcXVlcnk6IENvcmVTdGF0ZTxPPlsncXVlcnknXSxcbiAgICBtb3N0UmVjZW50QWN0aW9uOiBBY3Rpb248Tz4sXG4gICkgPT4gUHJvbWlzZTxTb3VyY2VSZXN1bHQ8Tz4+O1xuXG4gIC8vLy8vLy8vLy8vLy9cbiAgLy8gTWFuYWdlciAvL1xuICAvLy8vLy8vLy8vLy8vXG5cbiAgZXhwb3J0IHR5cGUgTWFuYWdlcjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPSB7XG4gICAgYWN0aW9uczogU3ViamVjdDxBY3Rpb248Tz4+O1xuICAgIHN0YXRlOiBDb25uZWN0YWJsZTxGdWxsU3RhdGU8Tz4+O1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXJPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPiA9IHtcbiAgICBpbml0aWFsU3RhdGU/OiBEZWVwUGFydGlhbDxDb3JlU3RhdGU8Tz4+O1xuICAgIGFsbG93TXVsdGlTZWxlY3Q/OiBib29sZWFuO1xuICAgIGFsbG93U2VhcmNoPzogYm9vbGVhbjtcbiAgICBhbGxvd1NlbGVjdEFsbD86IGJvb2xlYW47XG4gICAgYWxsb3dPcmRlcj86IGJvb2xlYW47XG4gICAgc2VhcmNoUGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgZGl2aWRlcnM/OiBib29sZWFuO1xuICAgIGlubGluZT86IGJvb2xlYW47XG4gICAgbWF4SGVpZ2h0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBtYXhXaWR0aD86IHN0cmluZyB8IG51bGw7XG4gICAgbWluSGVpZ2h0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBtaW5XaWR0aD86IHN0cmluZyB8IG51bGw7XG4gICAgZGlzcGxheUxpbWl0PzogbnVtYmVyO1xuICAgIHNlbGVjdGVkT3B0aW9uTGltaXQ/OiBudW1iZXI7XG4gICAgc2hvd1NpbmdsZVNlbGVjdGVkPzogYm9vbGVhbjtcbiAgICB1c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5PzogYm9vbGVhbjtcbiAgICBnZXRDdXN0b21PcHRpb25EaXNwbGF5PzogKHNlbGVjdGVkT3B0aW9uczogU291cmNlT3B0aW9uPE8+W10pID0+IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIG5vbi1sZWFmIG5vZGVzIChwYXJlbnRzKSByZW1haW4gc2VsZWN0YWJsZSBkdXJpbmcgc2VhcmNoLFxuICAgICAqIGFuZCBzZWxlY3RpbmcgdGhlbSB3aWxsIHNlbGVjdC9kZXNlbGVjdCBBTEwgY2hpbGRyZW4gZnJvbSB0aGUgb3JpZ2luYWxcbiAgICAgKiBkYXRhc2V0LCBub3QganVzdCB0aGUgdmlzaWJsZSBmaWx0ZXJlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogRGVmYXVsdDogZmFsc2UgKGN1cnJlbnQgYmVoYXZpb3IgLSBwYXJlbnRzIGFyZSBub3Qgc2VsZWN0YWJsZSBkdXJpbmcgc2VhcmNoKVxuICAgICAqL1xuICAgIGFsbG93U2VsZWN0Tm9uTGVhZkR1cmluZ1NlYXJjaD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBvcHRpb25zIHRoYXQgd2VyZSBzZWxlY3RlZCB3aGVuIHRoZSBzZWxlY3Qgd2FzIG9wZW5lZCBhcmVcbiAgICAgKiBzb3J0ZWQgdG8gdGhlIHRvcCBvZiB0aGVpciBzaWJsaW5nIGxpc3RzLiBTZXQgdG8gZmFsc2UgdG8gcHJlc2VydmUgdGhlXG4gICAgICogbmF0dXJhbCAob3IgY2hvc2VuIE9yZGVyQnkpIG9yZGVyIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0OiB0aGUgdmFsdWUgb2YgYWxsb3dNdWx0aVNlbGVjdFxuICAgICAqL1xuICAgIHNvcnRTZWxlY3RlZFRvVG9wPzogYm9vbGVhbjtcbiAgfTtcblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTWFuYWdlcjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc291cmNlOiBTb3VyY2U8Tz4sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBNYW5hZ2VyPE8+IHtcbiAgICBjb25zdCBkZWZhdWx0U3RhdGU6IENvcmVTdGF0ZTxPPiA9IHtcbiAgICAgIHF1ZXJ5OiB7XG4gICAgICAgIHNlYXJjaDogJycsXG4gICAgICAgIG9yZGVyOiAndGl0bGUnLFxuICAgICAgfSxcbiAgICAgIGxvYWQ6IHtcbiAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfSxcbiAgICAgIHNvdXJjZU9wdGlvbkdyb3VwczogW10sXG4gICAgICBvcmlnaW5hbE9wdGlvbkdyb3VwczogW10sXG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgc2VsZWN0ZWQ6IG5ldyBPcHRpb25TZXQoKSxcbiAgICAgIH0sXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICAgICAgb3BlbjogZmFsc2UsXG4gICAgICAgIGV4cGFuZGVkT3B0aW9uczogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGRlZmF1bHRlZEluaXRpYWxTdGF0ZTogQ29yZVN0YXRlPE8+ID0gZGVmYXVsdHNEZWVwKFxuICAgICAge30sXG4gICAgICBvcHRpb25zPy5pbml0aWFsU3RhdGUsXG4gICAgICBkZWZhdWx0U3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IGFjdGlvbnM6IFN1YmplY3Q8QWN0aW9uPE8+PiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgY29uc3QgaW50ZXJuYWxBY3Rpb25zOiBTdWJqZWN0PEludGVybmFsQWN0aW9uPE8+PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBjb25zdCBjb3JlU3RhdGVXaXRoU2VsZWN0aW9uU25hcHNob3Q6IE9ic2VydmFibGU8XG4gICAgICBbQ29yZVN0YXRlPE8+LCBPcHRpb25TZXQ8Tz5dXG4gICAgPiA9IG1lcmdlKGFjdGlvbnMsIGludGVybmFsQWN0aW9ucykucGlwZShcbiAgICAgIHNjYW48QWN0aW9uPE8+IHwgSW50ZXJuYWxBY3Rpb248Tz4sIFtDb3JlU3RhdGU8Tz4sIE9wdGlvblNldDxPPl0+KFxuICAgICAgICAoW3N0YXRlLCBzbmFwc2hvdF0sIGFjdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld1N0YXRlID0gc2lkZUVmZmVjdHMoXG4gICAgICAgICAgICByZWR1Y2Uoc3RhdGUsIGFjdGlvbiwgb3B0aW9ucyksXG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBpbnRlcm5hbEFjdGlvbnMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvblNuYXBzaG90ID1cbiAgICAgICAgICAgIChhY3Rpb24udHlwZSA9PT0gJ29wZW5DaGFuZ2UnICYmIGFjdGlvbi5vcGVuKSB8fFxuICAgICAgICAgICAgKGFjdGlvbi50eXBlID09PSAnbG9hZENvbXBsZXRlJyAmJlxuICAgICAgICAgICAgICAobmV3U3RhdGUuZGlzcGxheS5vcGVuIHx8IG9wdGlvbnM/LmlubGluZSkpXG4gICAgICAgICAgICAgID8gY3JlYXRlU2VsZWN0aW9uU25hcHNob3RXaXRoQW5jZXN0b3JzKG5ld1N0YXRlKVxuICAgICAgICAgICAgICA6IHNuYXBzaG90O1xuXG4gICAgICAgICAgcmV0dXJuIFtuZXdTdGF0ZSwgbmV3U2VsZWN0aW9uU25hcHNob3RdO1xuICAgICAgICB9LFxuICAgICAgICBbZGVmYXVsdGVkSW5pdGlhbFN0YXRlLCBuZXcgT3B0aW9uU2V0PE8+KCldLFxuICAgICAgKSxcbiAgICAgIHN0YXJ0V2l0aDxbQ29yZVN0YXRlPE8+LCBPcHRpb25TZXQ8Tz5dPihbXG4gICAgICAgIGRlZmF1bHRlZEluaXRpYWxTdGF0ZSxcbiAgICAgICAgbmV3IE9wdGlvblNldDxPPigpLFxuICAgICAgXSksXG4gICAgKTtcblxuICAgIGNvbnN0IHN0YXRlOiBDb25uZWN0YWJsZTxGdWxsU3RhdGU8Tz4+ID0gY29ubmVjdGFibGUoXG4gICAgICBjb3JlU3RhdGVXaXRoU2VsZWN0aW9uU25hcHNob3QucGlwZShcbiAgICAgICAgbWFwKChbcywgc2VsZWN0aW9uQXRPcGVuXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFsbE9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10gPVxuICAgICAgICAgICAgcy5zb3VyY2VPcHRpb25Hcm91cHMubWFwKG9wdGlvbkdyb3VwID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25Hcm91cCxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25Hcm91cC5vcHRpb25zLm1hcChvcHRpb24gPT5cbiAgICAgICAgICAgICAgICAgIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb24ocywgb3B0aW9uLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoYWxsT3B0aW9uR3JvdXBzKTtcblxuICAgICAgICAgIGNvbnN0IHNvcnRlZE9wdGlvbkdyb3VwcyA9XG4gICAgICAgICAgICBvcHRpb25zPy5zb3J0U2VsZWN0ZWRUb1RvcCA/PyBvcHRpb25zPy5hbGxvd011bHRpU2VsZWN0XG4gICAgICAgICAgICAgID8gc29ydE9wdGlvbnNCeVByZXZpb3VzbHlTZWxlY3RlZFN0YXRlKFxuICAgICAgICAgICAgICAgICAgYWxsT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQXRPcGVuLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBhbGxPcHRpb25Hcm91cHM7XG5cbiAgICAgICAgICBjb25zdCBkaXNwbGF5TGltaXQgPSBvcHRpb25zPy5kaXNwbGF5TGltaXQgPz8gREVGQVVMVF9ESVNQTEFZX0xJTUlUO1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXlMaW1pdGVkT3B0aW9uR3JvdXBzID0gYXBwbHlEaXNwbGF5TGltaXQoXG4gICAgICAgICAgICBzb3J0ZWRPcHRpb25Hcm91cHMsXG4gICAgICAgICAgICBkaXNwbGF5TGltaXQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBmdWxsT3B0aW9uR3JvdXBzID0gYXBwbHlTZWxlY3RlZE9wdGlvbkxpbWl0KFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIGRpc3BsYXlMaW1pdGVkT3B0aW9uR3JvdXBzLFxuICAgICAgICAgICAgdG9wTGV2ZWxPcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnMsXG4gICAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgICAuLi5zLnF1ZXJ5LFxuICAgICAgICAgICAgICBzaG93U2VhcmNoOlxuICAgICAgICAgICAgICAgICEhcy5xdWVyeS5zZWFyY2ggfHxcbiAgICAgICAgICAgICAgICAoISFvcHRpb25zPy5hbGxvd1NlYXJjaCAmJlxuICAgICAgICAgICAgICAgICAgY291bnRBbGxPcHRpb25zKGFsbE9wdGlvbkdyb3VwcykgPlxuICAgICAgICAgICAgICAgICAgICBNSU5fT1BUSU9OU19GT1JfQ09OVFJPTFMpIHx8XG4gICAgICAgICAgICAgICAgY291bnRBbGxPcHRpb25zKGFsbE9wdGlvbkdyb3VwcykgPiBkaXNwbGF5TGltaXQsXG4gICAgICAgICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyOiBvcHRpb25zPy5zZWFyY2hQbGFjZWhvbGRlciA/PyAnU2VhcmNoJyxcbiAgICAgICAgICAgICAgc2hvd09yZGVyOlxuICAgICAgICAgICAgICAgICEhb3B0aW9ucz8uYWxsb3dPcmRlciAmJlxuICAgICAgICAgICAgICAgICFzLnF1ZXJ5LnNlYXJjaCAmJlxuICAgICAgICAgICAgICAgIGNvdW50QWxsT3B0aW9ucyhhbGxPcHRpb25Hcm91cHMpID4gTUlOX09QVElPTlNfRk9SX0NPTlRST0xTLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bGxPcHRpb25Hcm91cHMsXG4gICAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgICAgLi4ucy5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgIGFsbG93TXVsdGlTZWxlY3Q6ICEhb3B0aW9ucz8uYWxsb3dNdWx0aVNlbGVjdCxcbiAgICAgICAgICAgICAgYWxsb3dTZWxlY3RBbGw6XG4gICAgICAgICAgICAgICAgISFvcHRpb25zPy5hbGxvd1NlbGVjdEFsbCAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnM/LnNlbGVjdGVkT3B0aW9uTGltaXQgPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB2aXNpYmxlU2VsZWN0aW9uU3RhdGU6XG4gICAgICAgICAgICAgICAgZ2V0UGFyZW50TXVsdGlTZWxlY3Rpb25TdGF0ZSh0b3BMZXZlbE9wdGlvbnMpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgICAgICAgLi4ucy5kaXNwbGF5LFxuICAgICAgICAgICAgICBmb3JtYXR0ZWRTZWxlY3RlZE9wdGlvbnM6IGdldEZvcm1hdHRlZE9wdGlvbnNGb3JEaXNwbGF5KFxuICAgICAgICAgICAgICAgIHMsXG4gICAgICAgICAgICAgICAgdG9wTGV2ZWxPcHRpb25zLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHplcm9TdGF0ZU1lc3NhZ2U6IGdldFplcm9TdGF0ZU1lc3NhZ2UocyksXG4gICAgICAgICAgICAgIGRpdmlkZXJzOiAhIW9wdGlvbnM/LmRpdmlkZXJzLFxuICAgICAgICAgICAgICBpbmxpbmU6ICEhb3B0aW9ucz8uaW5saW5lLFxuICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG9wdGlvbnM/Lm1heEhlaWdodCA/PyBudWxsLFxuICAgICAgICAgICAgICBtYXhXaWR0aDogb3B0aW9ucz8ubWF4V2lkdGggPz8gbnVsbCxcbiAgICAgICAgICAgICAgbWluSGVpZ2h0OiBvcHRpb25zPy5taW5IZWlnaHQgPz8gbnVsbCxcbiAgICAgICAgICAgICAgbWluV2lkdGg6IG9wdGlvbnM/Lm1pbldpZHRoID8/IG51bGwsXG4gICAgICAgICAgICAgIGRpc3BsYXlMaW1pdE1lc3NhZ2U6IGdldERpc3BsYXlMaW1pdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgY291bnRWaXNpYmxlT3B0aW9ucyhmdWxsT3B0aW9uR3JvdXBzLCAhIXMucXVlcnkuc2VhcmNoKSxcbiAgICAgICAgICAgICAgICBjb3VudFZpc2libGVPcHRpb25zKGFsbE9wdGlvbkdyb3VwcywgISFzLnF1ZXJ5LnNlYXJjaCksXG4gICAgICAgICAgICAgICAgcy5xdWVyeSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc2hvd1NpbmdsZVNlbGVjdGVkOiAhIW9wdGlvbnM/LnNob3dTaW5nbGVTZWxlY3RlZCxcbiAgICAgICAgICAgICAgcGlsbENvdW50OiBnZXRQaWxsQ291bnRGb3JEaXNwbGF5KHMsIHRvcExldmVsT3B0aW9ucywgb3B0aW9ucyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIHtcbiAgICAgICAgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSxcbiAgICAgICAgcmVzZXRPbkRpc2Nvbm5lY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuICAgIHN0YXRlLmNvbm5lY3QoKTtcblxuICAgIC8vIExvYWQgdGhlIG9wdGlvbnMgaW1tZWRpYXRlbHkgZm9yIHNlbGVjdHMgdGhhdCBhcmUgZGlzcGxheWVkIGlubGluZS5cbiAgICBpZiAob3B0aW9ucz8uaW5saW5lKSBhY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZCcgfSk7XG5cbiAgICByZXR1cm4geyBhY3Rpb25zLCBzdGF0ZSB9O1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgSW5NZW1vcnlNYW5hZ2VyT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4gPVxuICAgIE1hbmFnZXJPcHRpb25zPE8+ICYge1xuICAgICAgZnVzZU9wdGlvbnM/OiBJRnVzZU9wdGlvbnM8Tz47XG4gICAgfTtcblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5NZW1vcnlNYW5hZ2VyPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBmZXRjaERhdGFzZXQ6ICgpID0+IFByb21pc2U8T3B0aW9uR3JvdXA8Tz5bXT4gfCBPcHRpb25Hcm91cDxPPltdLFxuICAgIG9wdGlvbnM/OiBJbk1lbW9yeU1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBNYW5hZ2VyPE8+IHtcbiAgICBsZXQgZGF0YTogT3B0aW9uR3JvdXA8Tz5bXTtcbiAgICBsZXQgZnVzZTogRnVzZTxPPjtcbiAgICBsZXQgZXhhY3RNYXRjaDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGxldCBwYXJlbnRzOiBNYXA8T1snaWQnXSwgT1snaWQnXT47XG4gICAgbGV0IGNoaWxkcmVuOiBNYXA8T1snaWQnXSwgT1snaWQnXVtdPjtcblxuICAgIGNvbnN0IHNvdXJjZTogU291cmNlPE8+ID0gYXN5bmMgKHF1ZXJ5LCBtb3N0UmVjZW50QWN0aW9uKSA9PiB7XG4gICAgICAvKlxuICAgICAgICBSZS1mZXRjaCB0aGUgb3B0aW9ucyBvbiB0aGUgbG9hZCBhY3Rpb24sIGFuZCByZWJ1aWxkIHRoZSBzdGF0ZVxuICAgICAgICBkZXJpdmVkIGZyb20gdGhlIG9wdGlvbiBkYXRhLlxuICAgICAgKi9cbiAgICAgIGlmIChcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnbG9hZCcgfHxcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnb3BlbkNoYW5nZSdcbiAgICAgICkge1xuICAgICAgICBkYXRhID0gYXdhaXQgZmV0Y2hEYXRhc2V0KCk7XG4gICAgICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhkYXRhKTtcblxuICAgICAgICBmdXNlID0gbmV3IEZ1c2UoZmxhdHRlbk9wdGlvbnModG9wTGV2ZWxPcHRpb25zLCBmYWxzZSksIHtcbiAgICAgICAgICB0aHJlc2hvbGQ6IDAuMixcbiAgICAgICAgICBrZXlzOiBbJ3RpdGxlJ10sXG4gICAgICAgICAgaW5jbHVkZVNjb3JlOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVNYXRjaGVzOiB0cnVlLFxuICAgICAgICAgIC4uLm9wdGlvbnM/LmZ1c2VPcHRpb25zLFxuICAgICAgICB9KTtcblxuICAgICAgICBleGFjdE1hdGNoID0gb3B0aW9ucz8uZnVzZU9wdGlvbnM/LnRocmVzaG9sZCA9PSAwO1xuICAgICAgICBbcGFyZW50cywgY2hpbGRyZW5dID0gZ2V0UmVsYXRpb25zaGlwTWFwcyh0b3BMZXZlbE9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2Ugc2hvdWxkbid0IGFmZmVjdCBmdXp6eSBtYXRjaGluZyAoRnVzZVxuICAgICAgLy8gc2NvcmVzIHRoZSBwYXR0ZXJuJ3MgbGVuZ3RoIGFnYWluc3QgdGhlIHRleHQncywgc28gYSBzdHJheSBzcGFjZVxuICAgICAgLy8gY2hhbmdlcyByZXN1bHRzIGluIHN1cnByaXNpbmcgd2F5cyk7IGEgc2VhcmNoIHN0cmluZyBvZiBvbmx5XG4gICAgICAvLyB3aGl0ZXNwYWNlIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgbm8gc2VhcmNoLlxuICAgICAgY29uc3Qgc2VhcmNoID0gcXVlcnkuc2VhcmNoLnRyaW0oKTtcblxuICAgICAgLypcbiAgICAgICAgSWYgdGhlIHVzZXIgaXMgbm90IHNlYXJjaGluZyBvcHRpb25zLCByZXR1cm4gdGhlIGZ1bGwgc2V0IG9mIG9wdGlvbnNcbiAgICAgICAgc29ydGVkIGFwcHJvcHJpYXRlbHkuXG4gICAgICAqL1xuICAgICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgICAgLypcbiAgICAgICAgICBUaGUgYHNvdXJjZWAgb3JkZXIgcHJvcGVydHkgYWxsb3dzIGZvciBvcHRpbmcgb3V0IG9mIGF1dG9tYXRpY1xuICAgICAgICAgIHNvcnRpbmcsIHJldHVybmluZyB0aGUgZGF0YSBpbiBpdHMgbmF0dXJhbCBpbnB1dCBvcmRlci5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHF1ZXJ5Lm9yZGVyID09PSAnc291cmNlJykgcmV0dXJuIGRhdGE7XG5cbiAgICAgICAgLypcbiAgICAgICAgICBTb3J0IHRoZSBvcHRpb25zIGJ5IHRpdGxlIGFuZCBzdWJ0aXRsZS5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHF1ZXJ5Lm9yZGVyID09PSAndGl0bGUnKSB7XG4gICAgICAgICAgZnVuY3Rpb24gc29ydEJ5VGl0bGUob3B0aW9uczogT3B0aW9uPE8+W10pOiBPcHRpb248Tz5bXSB7XG4gICAgICAgICAgICByZXR1cm4gc29ydEJ5KG9wdGlvbnMsIFtcbiAgICAgICAgICAgICAgKG86IE9wdGlvbjxPPikgPT4gby50aXRsZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiBvLnN1YnRpdGxlPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxuICAgICAgICAgICAgXSkubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aFxuICAgICAgICAgICAgICAgID8gc29ydEJ5VGl0bGUob3B0aW9uLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkYXRhLm1hcChncm91cCA9PiAoe1xuICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICBvcHRpb25zOiBzb3J0QnlUaXRsZShncm91cC5vcHRpb25zKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgIFNvcnQgdGhlIG9wdGlvbnMgYnkgY291bnQsIHRoZW4gYnkgdGl0bGUsIHRoZW4gYnkgc3VidGl0bGUuXG4gICAgICAgICovXG4gICAgICAgIGlmIChxdWVyeS5vcmRlciA9PT0gJ2NvdW50Jykge1xuICAgICAgICAgIGZ1bmN0aW9uIHNvcnRCeUNvdW50KG9wdGlvbnM6IE9wdGlvbjxPPltdKTogT3B0aW9uPE8+W10ge1xuICAgICAgICAgICAgcmV0dXJuIHNvcnRCeShvcHRpb25zLCBbXG4gICAgICAgICAgICAgIChvOiBPcHRpb248Tz4pID0+IChpc051bWJlcihvLmNvdW50KSA/IC1vLmNvdW50IDogSW5maW5pdHkpLFxuICAgICAgICAgICAgICAobzogT3B0aW9uPE8+KSA9PiBvLnRpdGxlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgIChvOiBPcHRpb248Tz4pID0+IG8uc3VidGl0bGU/LnRvTG93ZXJDYXNlKCkgPz8gJycsXG4gICAgICAgICAgICBdKS5tYXAob3B0aW9uID0+ICh7XG4gICAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBzb3J0QnlDb3VudChvcHRpb24uY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRhdGEubWFwKGdyb3VwID0+ICh7XG4gICAgICAgICAgICAuLi5ncm91cCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHNvcnRCeUNvdW50KGdyb3VwLm9wdGlvbnMpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICBFeGVjdXRlIHRoZSBzZWFyY2ggd2l0aCBmdXNlLiBPbmNlIHdlIGhhdmUgdGhlIHNlYXJjaCBtYXRjaCBkYXRhLFxuICAgICAgICByZWJ1aWxkIGp1c3QgYXMgbXVjaCBvZiB0aGUgdHJlZSBhcyBpcyBuZWVkZWQgdG8gcmVuZGVyIHRoZSBzZWFyY2hcbiAgICAgICAgcmVzdWx0cy4gU3BlY2lmaWNhbGx5LCBhbnkgbWF0Y2ggd2lsbCBuZWVkIGFsbCBvZiBpdHMgYW5jZXN0b3JzIChzb1xuICAgICAgICB0aGF0IG1hdGNoZWQgbGVhZiBub2RlcyBhcmUgc2hvd24gbmVzdGVkIHVuZGVyIHRoZWlyIGFuY2VzdG9ycykgYW5kIGFsbFxuICAgICAgICBvZiBpdHMgY2hpbGRyZW4gKGJlY2F1c2UgYSBtYXRjaGluZyBwYXJlbnQgbWVhbnMgdGhhdCBhbGwgb2YgaXRzXG4gICAgICAgIGRlc2NlbmRhbnRzIG1hdGNoIHRvbywgcGVyIHRoZSBkZXNpZ24gc3BlY2lmaWNhdGlvbiksIHdoZXRoZXIgdGhleVxuICAgICAgICB0aGVtc2VsdmVzIG1hdGNoZWQgb3Igbm90LlxuICAgICAgKi9cbiAgICAgIGNvbnN0IG1hdGNoZWRPcHRpb25zOiBGdXNlUmVzdWx0PE8+W10gPSBmdXNlLnNlYXJjaChzZWFyY2gpO1xuICAgICAgY29uc3QgbWF0Y2hlZElkczogU2V0PE9bJ2lkJ10+ID0gbmV3IFNldChcbiAgICAgICAgbWF0Y2hlZE9wdGlvbnMubWFwKHJlc3VsdCA9PiByZXN1bHQuaXRlbS5pZCksXG4gICAgICApO1xuXG4gICAgICBjb25zdCBtYXRjaEFuY2VzdG9yczogU2V0PE9bJ2lkJ10+ID0gbmV3IFNldCgpO1xuICAgICAgZnVuY3Rpb24gY29sbGVjdEFuY2VzdG9ycyhpZHM6IE9bJ2lkJ11bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gcGFyZW50cy5nZXQoaWQpO1xuICAgICAgICAgIGlmIChwYXJlbnRJZCkge1xuICAgICAgICAgICAgbWF0Y2hBbmNlc3RvcnMuYWRkKHBhcmVudElkKTtcbiAgICAgICAgICAgIGNvbGxlY3RBbmNlc3RvcnMoW3BhcmVudElkXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2xsZWN0QW5jZXN0b3JzKFsuLi5tYXRjaGVkSWRzXSk7XG5cbiAgICAgIGNvbnN0IG1hdGNoRGVzY2VuZGFudHM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoKTtcbiAgICAgIGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50cyhpZHM6IE9bJ2lkJ11bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuSWRzID0gY2hpbGRyZW4uZ2V0KGlkKTtcbiAgICAgICAgICBpZiAoY2hpbGRyZW5JZHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW5JZHMpIHtcbiAgICAgICAgICAgICAgbWF0Y2hEZXNjZW5kYW50cy5hZGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sbGVjdERlc2NlbmRhbnRzKGNoaWxkcmVuSWRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbGxlY3REZXNjZW5kYW50cyhbLi4ubWF0Y2hlZElkc10pO1xuXG4gICAgICAvKlxuICAgICAgICBOZXh0LCB3ZSdsbCBjb21iaW5lIGFsbCB0aGUgbWF0Y2hlZCBJRHMgd2l0aCB0aGVpciBkaXJlY3QgYW5jZXN0b3JzIGFuZFxuICAgICAgICBkZXNjYW5kYW50cywgYW5kIGZpbHRlciB0aGUgb3JpZ2luYWwgZGF0YSBzZXQgZG93biB0byBqdXN0IHRoZXNlXG4gICAgICAgIG9wdGlvbnMuXG4gICAgICAqL1xuICAgICAgY29uc3QgZmlsdGVyZWRJZHM6IFNldDxPWydpZCddPiA9IG5ldyBTZXQoW1xuICAgICAgICAuLi5tYXRjaGVkSWRzLFxuICAgICAgICAuLi5tYXRjaEFuY2VzdG9ycyxcbiAgICAgICAgLi4ubWF0Y2hEZXNjZW5kYW50cyxcbiAgICAgIF0pO1xuXG4gICAgICBmdW5jdGlvbiBmaWx0ZXJPcHRpb25zKG9wdGlvbnM6IE9wdGlvbjxPPltdKTogT3B0aW9uPE8+W10ge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnM6IE9wdGlvbjxPPltdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoZmlsdGVyZWRJZHMuaGFzKG9wdGlvbi5pZCkpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogb3B0aW9uLmNoaWxkcmVuPy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGZpbHRlck9wdGlvbnMob3B0aW9uLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZE9wdGlvbnM7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJPcHRpb25zKGdldFRvcExldmVsT3B0aW9ucyhkYXRhKSk7XG5cbiAgICAgIC8qXG4gICAgICAgIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYW4gYXJyYXkgb2YgZGlzdGluY3QgdHJlZXMgKHRvcC1sZXZlbCBvcHRpb25zKSxcbiAgICAgICAgZmlsdGVyZWQgZG93biB0byBvbmx5IHRoZSBvcHRpb25zIG1hdGNoaW5nIHRoZSBzZWFyY2ggcXVlcnkuIE5vdGUgdGhhdFxuICAgICAgICB3ZSBkb24ndCBjYXJlIGFib3V0IHNlY3Rpb24gaGVhZGVycyB3aGVuIHNlYXJjaGluZyBzaW5jZSByZXN1bHRzIHNob3VsZFxuICAgICAgICBiZSBvcmRlcmVkIGJ5IHJlbGV2YW5jZS4gVG8gY2FsY3VsYXRlIHRoZSBvcmRlciBvZiB0aGVzZSB0cmVlcywgd2UnbGxcbiAgICAgICAgdGFrZSB0aGUgdG90YWwgbWF0Y2ggc2NvcmVzIGZvciBvcHRpb25zIGZvdW5kIGluIHRoZSB0cmVlLCBkaXZpZGVkIGJ5XG4gICAgICAgIHRoZSBjb3VudCBvZiBtYXRjaGVzIGluIHRoZSB0cmVlICh0aGUgYmVzdCBhdmVyYWdlIG1hdGNoIHNjb3JlKS5cbiAgICAgICovXG5cbiAgICAgIGNvbnN0IHNjb3JlTWFwOiBNYXA8T1snaWQnXSwgbnVtYmVyPiA9IG5ldyBNYXAoXG4gICAgICAgIG1hdGNoZWRPcHRpb25zLm1hcChyZXN1bHQgPT4gW3Jlc3VsdC5pdGVtLmlkLCByZXN1bHQuc2NvcmUgPz8gMF0pLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9yZGVyZWQgPSBzb3J0QnkoZmlsdGVyZWRPcHRpb25zLCAob3B0aW9uOiBPcHRpb248Tz4pOiBudW1iZXIgPT4ge1xuICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGVTY29yZShvcHRpb246IE9wdGlvbjxPPik6IG51bWJlciB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChzY29yZU1hcC5nZXQob3B0aW9uLmlkKSA/PyAwKSArXG4gICAgICAgICAgICAob3B0aW9uLmNoaWxkcmVuID8/IFtdKS5yZWR1Y2UoXG4gICAgICAgICAgICAgIChzY29yZSwgY2hpbGQpID0+IHNjb3JlICsgY2FsY3VsYXRlU2NvcmUoY2hpbGQpLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlQ291bnQob3B0aW9uOiBPcHRpb248Tz4pOiBudW1iZXIge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAxICtcbiAgICAgICAgICAgIChvcHRpb24uY2hpbGRyZW4gPz8gW10pLnJlZHVjZShcbiAgICAgICAgICAgICAgKGNvdW50LCBjaGlsZCkgPT4gY291bnQgKyBjYWxjdWxhdGVDb3VudChjaGlsZCksXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbFNjb3JlID0gY2FsY3VsYXRlU2NvcmUob3B0aW9uKTtcbiAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IGNhbGN1bGF0ZUNvdW50KG9wdGlvbik7XG4gICAgICAgIHJldHVybiB0b3RhbFNjb3JlIC8gdG90YWxDb3VudDtcbiAgICAgIH0pO1xuXG4gICAgICAvKlxuICAgICAgICBGaW5hbGx5LCB3ZSdsbCBhZGQgaGlnaGxpZ2h0IGluZGljZXMgdG8gdGhlIG1hdGNoZXMgc28gdGhhdCB0aGV5IGNhbiBiZVxuICAgICAgICBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAgICAqL1xuXG4gICAgICB0eXBlIEhpZ2hsaWdodHMgPSB7XG4gICAgICAgIHRpdGxlSGlnaGxpZ2h0SW5kaWNlcz86IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgICAgIHN1YnRpdGxlSGlnaGxpZ2h0SW5kaWNlcz86IEhpZ2hsaWdodENvbXBvbmVudC5IaWdobGlnaHRJbmRpY2VzW107XG4gICAgICB9O1xuICAgICAgY29uc3QgaGlnaGxpZ2h0TWFwOiBNYXA8T1snaWQnXSwgSGlnaGxpZ2h0cz4gPSBuZXcgTWFwKFxuICAgICAgICBtYXRjaGVkT3B0aW9ucy5tYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICBjb25zdCBoaWdobGlnaHRzOiBIaWdobGlnaHRzID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiByZXN1bHQubWF0Y2hlcyA/PyBbXSkge1xuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBpbmV4YWN0IG1hdGNoZXNcbiAgICAgICAgICAgIGlmIChleGFjdE1hdGNoICYmIG1hdGNoLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgbWF0Y2guaW5kaWNlcyA9IG1hdGNoLmluZGljZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGlzRnVzZU1hdGNoRXhhY3QobWF0Y2gsIHNlYXJjaCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2gua2V5ID09PSAndGl0bGUnKSB7XG4gICAgICAgICAgICAgIGhpZ2hsaWdodHMudGl0bGVIaWdobGlnaHRJbmRpY2VzID0gWy4uLm1hdGNoLmluZGljZXNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoLmtleSA9PT0gJ3N1YnRpdGxlJykge1xuICAgICAgICAgICAgICBoaWdobGlnaHRzLnN1YnRpdGxlSGlnaGxpZ2h0SW5kaWNlcyA9IFsuLi5tYXRjaC5pbmRpY2VzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtyZXN1bHQuaXRlbS5pZCwgaGlnaGxpZ2h0c107XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGZ1bmN0aW9uIGFkZEhpZ2hsaWdodHNUb09wdGlvbihvcHRpb25zOiBPcHRpb248Tz5bXSk6IFNvdXJjZU9wdGlvbjxPPltdIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAuLi5oaWdobGlnaHRNYXAuZ2V0KG9wdGlvbi5pZCksXG4gICAgICAgICAgLi4uKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgICAgICA/IHsgY2hpbGRyZW46IGFkZEhpZ2hsaWdodHNUb09wdGlvbihvcHRpb24uY2hpbGRyZW4pIH1cbiAgICAgICAgICAgIDogbnVsbCksXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogW3sgb3B0aW9uczogYWRkSGlnaGxpZ2h0c1RvT3B0aW9uKG9yZGVyZWQpIH1dLFxuICAgICAgICBvcmlnaW5hbERhdGE6IGRhdGEsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gY3JlYXRlTWFuYWdlcihzb3VyY2UsIG9wdGlvbnMpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzRnVzZU1hdGNoRXhhY3QoXG4gICAgbWF0Y2g6IEZ1c2VSZXN1bHRNYXRjaCxcbiAgICBzZWFyY2g6IHN0cmluZyxcbiAgKTogKFxuICAgIHZhbHVlOiBSYW5nZVR1cGxlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgYXJyYXk6IHJlYWRvbmx5IFJhbmdlVHVwbGVbXSxcbiAgKSA9PiBib29sZWFuIHtcbiAgICByZXR1cm4gbWF0Y2hlZEluZGljZXMgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZFZhbHVlID0gbWF0Y2hcbiAgICAgICAgLnZhbHVlIS5zbGljZShtYXRjaGVkSW5kaWNlc1swXSwgbWF0Y2hlZEluZGljZXNbMV0gKyAxKVxuICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIC8vIGZ1c2UgaXMgd2VpcmQgd2l0aCBpdCdzIG1hdGNoZXMuIEZvciBhIHRleHQgb2YgXCJwbGFubmluZ1wiIGFuZCBhIHNlYXJjaCBzdHJpbmcgb2YgXCJwbGFuXCJcbiAgICAgIC8vIHRoZSBtYXRjaGVkIHZhbHVlIHdpbGwgYmUgXCJwbGFublwiIHdpdGggdGhlIGV4dHJhICduJyBiZWNhdXNlIG9mIGl0cyBmdXp6eSBtYXRjaGluZy5cbiAgICAgIC8vIHNvIGp1c3QgbWFrZSBzdXJlIHRoZSBtYXRjaGVkIHZhbHVlIGF0IGxlYXN0IHN0YXJ0cyB3aXRoIHRoZSBzZWFyY2ggc3RyaW5nLlxuICAgICAgLy8gaXQncyBleHRyYSB3ZWlyZCBiZWNhdXNlIGZvciBhIHRleHQgb2YgXCJhbmFseXRpY3NcIiBhbmQgYSBzZWFyY2ggc3RyaW5nIG9mIFwibmFseXRpY3NcIixcbiAgICAgIC8vIHRoZSBtYXRjaGVkIHZhbHVlIHdpbGwgYmUgXCJhbmFseXRpY3NcIi4gU28gd2UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgdGhlIG1hdGNoZWQgdmFsdWVcbiAgICAgIC8vIGluY2x1ZGVzIHRoZSBzZWFyY2ggc3RyaW5nIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgZXh0cmEgc3R1ZmYgb24gdGhlIGZyb250IG9yIHRoZSBlbmQuXG4gICAgICByZXR1cm4gbWF0Y2hlZFZhbHVlLmluY2x1ZGVzKHNlYXJjaC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9O1xuICB9XG5cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBTdGF0ZSByZWR1Y2VyICh3aXRoIGhlbHBlcnMpIC8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICBmdW5jdGlvbiBjcmVhdGVTZWxlY3Rpb25TbmFwc2hvdFdpdGhBbmNlc3RvcnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICk6IE9wdGlvblNldDxPPiB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBuZXcgT3B0aW9uU2V0KHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gICAgY29uc3QgdG9wTGV2ZWxPcHRpb25zID0gZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLnNvdXJjZU9wdGlvbkdyb3Vwcyk7XG4gICAgY29uc3QgW3BhcmVudHNdID0gZ2V0UmVsYXRpb25zaGlwTWFwcyh0b3BMZXZlbE9wdGlvbnMpO1xuXG4gICAgLy8gU2libGluZyBsZWF2ZXMgc2hhcmUgYW5jZXN0b3JzLCBzbyBvbmNlIHdlJ3ZlIHdhbGtlZCB1cCB0aHJvdWdoIGFcbiAgICAvLyBnaXZlbiBwYXJlbnQgaWQgd2UgY2FuIHN0b3Ag4oCUIGFueXRoaW5nIGFib3ZlIGl0IGhhcyBhbHJlYWR5IGJlZW5cbiAgICAvLyBhZGRlZCBieSBhIHByZXZpb3VzIGl0ZXJhdGlvbi4gV2l0aG91dCB0aGlzIHNob3J0LWNpcmN1aXQgdGhlIGxvb3BcbiAgICAvLyByZS1ydW5zIGZpbmRPcHRpb24gKHdoaWNoIGlzIGEgZnVsbCB0cmVlIHdhbGspIG9uY2UgcGVyIHNoYXJlZFxuICAgIC8vIGFuY2VzdG9yIGVkZ2UsIHdoaWNoIHdhcyB0aGUgIzIgaG90c3BvdCBiZWhpbmQgT3B0aW9uU2V0LmFkZCBpblxuICAgIC8vIFJWVC0yNTQ3MCdzIHByb2ZpbGUuXG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8T1snaWQnXT4oKTtcbiAgICBmb3IgKGNvbnN0IHNlbGVjdGVkT3B0aW9uIG9mIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCkge1xuICAgICAgbGV0IHBhcmVudElkID0gcGFyZW50cy5nZXQoc2VsZWN0ZWRPcHRpb24uaWQpO1xuICAgICAgd2hpbGUgKHBhcmVudElkICE9PSB1bmRlZmluZWQgJiYgIXZpc2l0ZWQuaGFzKHBhcmVudElkKSkge1xuICAgICAgICB2aXNpdGVkLmFkZChwYXJlbnRJZCk7XG4gICAgICAgIGNvbnN0IHBhcmVudE9wdGlvbiA9IGZpbmRPcHRpb24odG9wTGV2ZWxPcHRpb25zLCBwYXJlbnRJZCk7XG4gICAgICAgIGlmIChwYXJlbnRPcHRpb24pIHtcbiAgICAgICAgICBzbmFwc2hvdC5hZGQocGFyZW50T3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRJZCA9IHBhcmVudHMuZ2V0KHBhcmVudElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXNwbGF5TGltaXRNZXNzYWdlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBkaXNwbGF5ZWRPcHRpb25Db3VudDogbnVtYmVyLFxuICAgIHRvdGFsT3B0aW9uQ291bnQ6IG51bWJlcixcbiAgICBxdWVyeTogQ29yZVN0YXRlPE8+WydxdWVyeSddLFxuICApOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoZGlzcGxheWVkT3B0aW9uQ291bnQgPT09IHRvdGFsT3B0aW9uQ291bnQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJpdk51bWJlciA9IG5ldyBOdW1iZXJQaXBlKCk7XG4gICAgY29uc3QgZGlzcGxheWVkID0gcml2TnVtYmVyLnRyYW5zZm9ybShkaXNwbGF5ZWRPcHRpb25Db3VudCk7XG4gICAgY29uc3QgdG90YWwgPSByaXZOdW1iZXIudHJhbnNmb3JtKHRvdGFsT3B0aW9uQ291bnQpO1xuICAgIGNvbnN0IHN0YXJ0ID0gYFNob3dpbmcgJHtkaXNwbGF5ZWR9IG9mICR7dG90YWx9IG9wdGlvbnNgO1xuICAgIHJldHVybiBxdWVyeS5zZWFyY2ggPyBgJHtzdGFydH0gbWF0Y2hpbmcgXCIke3F1ZXJ5LnNlYXJjaH1cImAgOiBzdGFydDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvdW50VmlzaWJsZU9wdGlvbnM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICAgbGVhZk9ubHk6IGJvb2xlYW4sXG4gICk6IG51bWJlciB7XG4gICAgZnVuY3Rpb24gY291bnQob3B0aW9uczogRnVsbE9wdGlvbjxPPltdKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnJlZHVjZSgoYWNjLCBvcHRpb24pID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5leHBhbmRlZCAmJiBvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBhY2MgKyAobGVhZk9ubHkgPyAwIDogMSkgKyBjb3VudChvcHRpb24uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2MgKyAxO1xuICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5yZWR1Y2UoXG4gICAgICAodG90YWwsIGdyb3VwKSA9PiB0b3RhbCArIGNvdW50KGdyb3VwLm9wdGlvbnMpLFxuICAgICAgMCxcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gY291bnRBbGxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICApOiBudW1iZXIge1xuICAgIGZ1bmN0aW9uIGNvdW50KG9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSk6IG51bWJlciB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5yZWR1Y2UoKGFjYywgb3B0aW9uKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb24uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBhY2MgKyAxICsgY291bnQob3B0aW9uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjICsgMTtcbiAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25Hcm91cHMucmVkdWNlKFxuICAgICAgKHRvdGFsLCBncm91cCkgPT4gdG90YWwgKyBjb3VudChncm91cC5vcHRpb25zKSxcbiAgICAgIDAsXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5RGlzcGxheUxpbWl0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIGRpc3BsYXlMaW1pdDogbnVtYmVyLFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgdHlwZSBEaXNwbGF5TGltaXRPcHRpb25zID0gW0Z1bGxPcHRpb248Tz5bXSwgbnVtYmVyXTtcbiAgICBmdW5jdGlvbiBmaWx0ZXJXaXRoTGltaXQoXG4gICAgICBvcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgICByZW1haW5pbmc6IG51bWJlcixcbiAgICApOiBEaXNwbGF5TGltaXRPcHRpb25zIHtcbiAgICAgIGxldCBsZWZ0ID0gcmVtYWluaW5nO1xuICAgICAgY29uc3QgdmlzaWJsZU9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICBpZiAobGVmdCA8PSAwKSBicmVhaztcblxuICAgICAgICBpZiAob3B0aW9uLmV4cGFuZGVkICYmIG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgW2NoaWxkT3B0aW9ucywgY2hpbGRSZW1haW5pbmddID0gZmlsdGVyV2l0aExpbWl0KFxuICAgICAgICAgICAgb3B0aW9uLmNoaWxkcmVuLFxuICAgICAgICAgICAgbGVmdCAtIDEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZE9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGVmdCA9IGNoaWxkUmVtYWluaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpc2libGVPcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgICAgICAgICBsZWZ0LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbdmlzaWJsZU9wdGlvbnMsIGxlZnRdO1xuICAgIH1cblxuICAgIHR5cGUgRGlzcGxheUxpbWl0R3JvdXBzID0gW0Z1bGxPcHRpb25Hcm91cDxPPltdLCBudW1iZXJdO1xuICAgIGNvbnN0IHN0YXJ0aW5nVmFsdWU6IERpc3BsYXlMaW1pdEdyb3VwcyA9IFtbXSwgZGlzcGxheUxpbWl0XTtcbiAgICBjb25zdCBbcmVzb2x2ZWRHcm91cHNdID0gb3B0aW9uR3JvdXBzLnJlZHVjZTxEaXNwbGF5TGltaXRHcm91cHM+KFxuICAgICAgKFtncm91cHMsIHJlbWFpbmluZ10sIGdyb3VwKSA9PiB7XG4gICAgICAgIGNvbnN0IFtvcHRpb25zLCBsZWZ0QWZ0ZXJdID0gZmlsdGVyV2l0aExpbWl0KGdyb3VwLm9wdGlvbnMsIHJlbWFpbmluZyk7XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBbWy4uLmdyb3VwcywgeyAuLi5ncm91cCwgb3B0aW9ucyB9XSwgbGVmdEFmdGVyXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW2dyb3VwcywgcmVtYWluaW5nXTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHN0YXJ0aW5nVmFsdWUsXG4gICAgKTtcblxuICAgIHJldHVybiByZXNvbHZlZEdyb3VwcztcbiAgfVxuXG4gIC8qXG4gICAgU29ydCBvcHRpb25zIHNvIHRoYXQgcHJldmlvdXNseSBzZWxlY3RlZCBvcHRpb25zIChmcm9tIHByaW9yIHNlc3Npb25zKVxuICAgIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZWlyIHBlZXIvc2libGluZyBsaXN0cy5cbiAgKi9cbiAgZnVuY3Rpb24gc29ydE9wdGlvbnNCeVByZXZpb3VzbHlTZWxlY3RlZFN0YXRlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICAgIHNlbGVjdGlvbkF0T3BlbjogT3B0aW9uU2V0PE8+LFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgZnVuY3Rpb24gc29ydE9wdGlvbnMob3B0aW9uczogRnVsbE9wdGlvbjxPPltdKTogRnVsbE9wdGlvbjxPPltdIHtcbiAgICAgIHJldHVybiBzb3J0Qnkob3B0aW9ucywgb3B0aW9uID0+ICFzZWxlY3Rpb25BdE9wZW4uaGFzKG9wdGlvbikpLm1hcChcbiAgICAgICAgb3B0aW9uID0+IHtcbiAgICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBzb3J0T3B0aW9ucyhvcHRpb24uY2hpbGRyZW4pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgcmV0dXJuIG9wdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5tYXAoZ3JvdXAgPT4gKHtcbiAgICAgIC4uLmdyb3VwLFxuICAgICAgb3B0aW9uczogc29ydE9wdGlvbnMoZ3JvdXAub3B0aW9ucyksXG4gICAgfSkpO1xuICB9XG5cbiAgLypcbiAgICBJZiB3ZSBhcmUgcmVzdHJpY3RpbmcgaG93IG1hbnkgb3B0aW9ucyBhcmUgc2VsZWN0ZWQgdG8gYSBzcGVjaWZpYyBsaW1pdCxcbiAgICAgIHdoZW4gd2UgYXJlIGF0IHRoYXQgbGltaXQsIGRpc2FibGUgYWxsIG9wdGlvbnMgbm90IGN1cnJlbnRseSBzZWxlY3RlZC5cbiAgKi9cbiAgZnVuY3Rpb24gYXBwbHlTZWxlY3RlZE9wdGlvbkxpbWl0PE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIG9wdGlvbkdyb3VwczogRnVsbE9wdGlvbkdyb3VwPE8+W10sXG4gICAgdG9wTGV2ZWxPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSB7XG4gICAgaWYgKG9wdGlvbnM/LnNlbGVjdGVkT3B0aW9uTGltaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG9wdGlvbkdyb3VwcztcbiAgICB9XG5cbiAgICAvLyBXaGVuIHVzZVRvcExldmVsT3B0aW9uc0ZvckRpc3BsYXkgaXMgdHJ1ZSBhbmQgc2VhcmNoIGlzIGFjdGl2ZSwgY291bnRcbiAgICAvLyBzZWxlY3RlZCB0b3AtbGV2ZWwgb3B0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCAodW5maWx0ZXJlZCkgZGF0YSB0byBlbnN1cmVcbiAgICAvLyBhbHJlYWR5LXNlbGVjdGVkIG9wdGlvbnMgdGhhdCBkb24ndCBtYXRjaCB0aGUgc2VhcmNoIGFyZSBzdGlsbCBjb3VudGVkLlxuICAgIGNvbnN0IHVzZU9yaWdpbmFsRm9yQ291bnRpbmcgPVxuICAgICAgb3B0aW9ucz8udXNlVG9wTGV2ZWxPcHRpb25zRm9yRGlzcGxheSAmJlxuICAgICAgc3RhdGUucXVlcnkuc2VhcmNoICYmXG4gICAgICBzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3Vwcy5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgdG9wT3B0aW9uc0ZvckNvdW50aW5nID0gdXNlT3JpZ2luYWxGb3JDb3VudGluZ1xuICAgICAgPyBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMpLm1hcChvcHRpb24gPT5cbiAgICAgICAgICBhdWdtZW50T3B0aW9uVG9GdWxsT3B0aW9uKHN0YXRlLCBvcHRpb24sIG9wdGlvbnMpLFxuICAgICAgICApXG4gICAgICA6IHRvcExldmVsT3B0aW9ucztcblxuICAgIGNvbnN0IHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9ucyA9IHRvcE9wdGlvbnNGb3JDb3VudGluZy5maWx0ZXIoXG4gICAgICBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlLFxuICAgICk7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWRPcHRpb25zOiBudW1iZXIgPSBvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5XG4gICAgICA/IHNlbGVjdGVkT3JJbmRldGVybWluYXRlVG9wT3B0aW9ucy5sZW5ndGhcbiAgICAgIDogc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLnNpemU7XG5cbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbkxpbWl0OiBudW1iZXIgPSBvcHRpb25zLnNlbGVjdGVkT3B0aW9uTGltaXQ7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGxlc3MgaXRlbXMgc2VsZWN0ZWQgdGhhbiB0aGUgbGltaXQsIGJ1c2luZXNzIGFzIHVzdWFsLlxuICAgIGlmIChudW1TZWxlY3RlZE9wdGlvbnMgPCBzZWxlY3RlZE9wdGlvbkxpbWl0KSB7XG4gICAgICByZXR1cm4gb3B0aW9uR3JvdXBzO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZXF1YWwgaXRlbXMgc2VsZWN0ZWQgdG8gdGhlIGxpbWl0IChvciBtb3JlKSwgcHJldmVudCB1c2VycyBmcm9tIHNlbGVjdGluZyBtb3JlIG9wdGlvbnMuXG4gICAgZnVuY3Rpb24gZGlzYWJsZVVuc2VsZWN0ZWRJdGVtcyhcbiAgICAgIGN1cnJlbnRPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgICBvcHRpb25zQXJlQ2hpbGRyZW5PZlNlbGVjdGVkR3JvdXA6IGJvb2xlYW4sXG4gICAgKTogRnVsbE9wdGlvbjxPPltdIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtczogRnVsbE9wdGlvbjxPPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBjdXJyZW50T3B0aW9ucykge1xuICAgICAgICBjb25zdCBpc0Rpc2FibGVkT3JVbnNlbGVjdGVkOiBib29sZWFuID1cbiAgICAgICAgICAhIW9wdGlvbi5kaXNhYmxlZCB8fCAob3B0aW9uLnNlbGVjdGFibGUgJiYgb3B0aW9uLnNlbGVjdGVkID09IGZhbHNlKTtcblxuICAgICAgICBjb25zdCBpc0N1cnJlbnRPcHRpb25TZWxlY3RlZDogYm9vbGVhbiA9XG4gICAgICAgICAgb3B0aW9uLnNlbGVjdGFibGUgJiYgb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlO1xuICAgICAgICBjb25zdCBpc0N1cnJlbnRPclBhcmVudE9wdGlvblNlbGVjdGVkOiBib29sZWFuID1cbiAgICAgICAgICBpc0N1cnJlbnRPcHRpb25TZWxlY3RlZCB8fCBvcHRpb25zQXJlQ2hpbGRyZW5PZlNlbGVjdGVkR3JvdXA7XG5cbiAgICAgICAgY29uc3QgZm9yY2VFbmFibGVkQmFzZWRPblBhcmVudDogYm9vbGVhbiA9XG4gICAgICAgICAgISFvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5ICYmXG4gICAgICAgICAgb3B0aW9uc0FyZUNoaWxkcmVuT2ZTZWxlY3RlZEdyb3VwO1xuICAgICAgICBjb25zdCBtYXJrRGlzYWJsZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgIGlzRGlzYWJsZWRPclVuc2VsZWN0ZWQgJiYgIWZvcmNlRW5hYmxlZEJhc2VkT25QYXJlbnQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGRPcHRpb25zID0gZGlzYWJsZVVuc2VsZWN0ZWRJdGVtcyhcbiAgICAgICAgICAgIG9wdGlvbi5jaGlsZHJlbixcbiAgICAgICAgICAgIGlzQ3VycmVudE9yUGFyZW50T3B0aW9uU2VsZWN0ZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVkSXRlbXMucHVzaCh7XG4gICAgICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgICAgICBkaXNhYmxlZDogISFtYXJrRGlzYWJsZWQsXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRPcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVwZGF0ZWRJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbixcbiAgICAgICAgICAgIGRpc2FibGVkOiAhIW1hcmtEaXNhYmxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZWRJdGVtcztcbiAgICB9XG5cbiAgICBjb25zdCBncm91cHNBZnRlckxpbWl0OiBGdWxsT3B0aW9uR3JvdXA8Tz5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY3VycmVudEdyb3VwIG9mIG9wdGlvbkdyb3Vwcykge1xuICAgICAgZ3JvdXBzQWZ0ZXJMaW1pdC5wdXNoKHtcbiAgICAgICAgLi4uY3VycmVudEdyb3VwLFxuICAgICAgICBvcHRpb25zOiBkaXNhYmxlVW5zZWxlY3RlZEl0ZW1zKGN1cnJlbnRHcm91cC5vcHRpb25zLCBmYWxzZSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JvdXBzQWZ0ZXJMaW1pdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJlbGF0aW9uc2hpcE1hcHM8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIG9wdGlvbnM6IE9wdGlvbjxPPltdLFxuICApOiBbTWFwPE9bJ2lkJ10sIE9bJ2lkJ10+LCBNYXA8T1snaWQnXSwgT1snaWQnXVtdPl0ge1xuICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgTWFwKCk7XG4gICAgZnVuY3Rpb24gYnVpbGRQYXJlbnRzTWFwKG9wdGlvbnM6IE9wdGlvbjxPPltdLCBwYXJlbnQ/OiBPcHRpb248Tz4pOiB2b2lkIHtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgIHBhcmVudHMuc2V0KG9wdGlvbi5pZCwgcGFyZW50LmlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICBidWlsZFBhcmVudHNNYXAob3B0aW9uLmNoaWxkcmVuLCBvcHRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGJ1aWxkUGFyZW50c01hcChvcHRpb25zKTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgIGZ1bmN0aW9uIGJ1aWxkQ2hpbGRyZW5NYXAob3B0aW9uczogT3B0aW9uPE8+W10pOiB2b2lkIHtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY2hpbGRyZW4uc2V0KFxuICAgICAgICAgICAgb3B0aW9uLmlkLFxuICAgICAgICAgICAgb3B0aW9uLmNoaWxkcmVuLm1hcCgoeyBpZCB9KSA9PiBpZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBidWlsZENoaWxkcmVuTWFwKG9wdGlvbi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYnVpbGRDaGlsZHJlbk1hcChvcHRpb25zKTtcblxuICAgIHJldHVybiBbcGFyZW50cywgY2hpbGRyZW5dO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IEZ1bGxPcHRpb25Hcm91cDxPPltdLFxuICApOiBGdWxsT3B0aW9uPE8+W107XG4gIGZ1bmN0aW9uIGdldFRvcExldmVsT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uR3JvdXBzOiBTb3VyY2VPcHRpb25Hcm91cDxPPltdLFxuICApOiBTb3VyY2VPcHRpb248Tz5bXTtcbiAgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxPcHRpb25zPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25Hcm91cHM6IE9wdGlvbkdyb3VwPE8+W10sXG4gICk6IE9wdGlvbjxPPltdO1xuICBmdW5jdGlvbiBnZXRUb3BMZXZlbE9wdGlvbnM8XG4gICAgTyBleHRlbmRzIEJhc2VPcHRpb24sXG4gICAgRyBleHRlbmRzIHsgb3B0aW9uczogcmVhZG9ubHkgVFtdIH0sXG4gICAgVCA9IEcgZXh0ZW5kcyBGdWxsT3B0aW9uR3JvdXA8Tz5cbiAgICAgID8gRnVsbE9wdGlvbjxPPlxuICAgICAgOiBHIGV4dGVuZHMgU291cmNlT3B0aW9uR3JvdXA8Tz5cbiAgICAgID8gU291cmNlT3B0aW9uPE8+XG4gICAgICA6IE9wdGlvbjxPPixcbiAgPihvcHRpb25Hcm91cHM6IEdbXSk6IFRbXSB7XG4gICAgcmV0dXJuIG9wdGlvbkdyb3Vwcy5yZWR1Y2U8VFtdPihcbiAgICAgIChvcHRpb25zLCBncm91cCkgPT4gWy4uLm9wdGlvbnMsIC4uLmdyb3VwLm9wdGlvbnNdLFxuICAgICAgW10sXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGU8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIGNoaWxkcmVuOiBGdWxsT3B0aW9uPE8+W10sXG4gICk6IE11bHRpU2VsZWN0aW9uU3RhdGUge1xuICAgIGlmIChjaGlsZHJlbi5ldmVyeShjaGlsZCA9PiBjaGlsZC5zZWxlY3RlZCA9PT0gdHJ1ZSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChjaGlsZHJlbi5ldmVyeShjaGlsZCA9PiBjaGlsZC5zZWxlY3RlZCA9PT0gZmFsc2UpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICdpbmRldGVybWluYXRlJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb248TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgb3B0aW9uOiBTb3VyY2VPcHRpb248Tz4sXG4gICAgbWFuYWdlck9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogRnVsbE9wdGlvbjxPPiB7XG4gICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhdWdtZW50ZWRDaGlsZHJlbiA9IG9wdGlvbi5jaGlsZHJlbi5tYXAoY2hpbGQgPT5cbiAgICAgICAgYXVnbWVudE9wdGlvblRvRnVsbE9wdGlvbihzdGF0ZSwgY2hpbGQsIG1hbmFnZXJPcHRpb25zKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZWxlY3RhYmxlV2hlblNlYXJjaGluZyA9XG4gICAgICAgIG1hbmFnZXJPcHRpb25zPy5hbGxvd1NlbGVjdE5vbkxlYWZEdXJpbmdTZWFyY2ggPz8gZmFsc2U7XG5cbiAgICAgIC8vIFdoZW4gYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoIGlzIGVuYWJsZWQgYW5kIHNlYXJjaCBpcyBhY3RpdmUsXG4gICAgICAvLyBjYWxjdWxhdGUgc2VsZWN0aW9uIHN0YXRlIGZyb20gQUxMIG9yaWdpbmFsIGNoaWxkcmVuLCBub3QganVzdCB0aGVcbiAgICAgIC8vIGZpbHRlcmVkIG9uZXMgdmlzaWJsZSBpbiBzZWFyY2ggcmVzdWx0cy5cbiAgICAgIGNvbnN0IHVzZU9yaWdpbmFsRm9yU2VsZWN0aW9uU3RhdGUgPVxuICAgICAgICBtYW5hZ2VyT3B0aW9ucz8uYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoICYmXG4gICAgICAgIHN0YXRlLnF1ZXJ5LnNlYXJjaCAmJlxuICAgICAgICBzdGF0ZS5vcmlnaW5hbE9wdGlvbkdyb3Vwcy5sZW5ndGggPiAwO1xuXG4gICAgICBsZXQgc2VsZWN0ZWQ6IE11bHRpU2VsZWN0aW9uU3RhdGU7XG4gICAgICBpZiAodXNlT3JpZ2luYWxGb3JTZWxlY3Rpb25TdGF0ZSkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE9wdGlvbiA9IGZpbmRPcHRpb24oXG4gICAgICAgICAgZ2V0VG9wTGV2ZWxPcHRpb25zKHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzKSxcbiAgICAgICAgICBvcHRpb24uaWQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcmlnaW5hbE9wdGlvbikge1xuICAgICAgICAgIGNvbnN0IGFsbExlYXZlcyA9IGZsYXR0ZW5PcHRpb25zKFtvcmlnaW5hbE9wdGlvbl0sIHRydWUpO1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSBhbGxMZWF2ZXMuZmlsdGVyKGxlYWYgPT5cbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5oYXMobGVhZiksXG4gICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZENvdW50ID09PSBhbGxMZWF2ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gJ2luZGV0ZXJtaW5hdGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RlZCA9IGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGUoYXVnbWVudGVkQ2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZCA9IGdldFBhcmVudE11bHRpU2VsZWN0aW9uU3RhdGUoYXVnbWVudGVkQ2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgIGNoaWxkcmVuOiBhdWdtZW50ZWRDaGlsZHJlbixcbiAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgIGV4cGFuZGVkOiBzdGF0ZS5xdWVyeS5zZWFyY2hcbiAgICAgICAgICA/IHRydWVcbiAgICAgICAgICA6IHN0YXRlLmRpc3BsYXkuZXhwYW5kZWRPcHRpb25zLmhhcyhvcHRpb24uaWQpLFxuICAgICAgICBzZWxlY3RhYmxlOiAhc3RhdGUucXVlcnkuc2VhcmNoIHx8IHNlbGVjdGFibGVXaGVuU2VhcmNoaW5nLFxuICAgICAgICBleHBhbmRhYmxlOiAhc3RhdGUucXVlcnkuc2VhcmNoLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbixcbiAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZDogc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLmhhcyhvcHRpb24pLFxuICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgIGV4cGFuZGFibGU6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRPcHRpb25zRm9yRGlzcGxheTxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICB0b3BMZXZlbE9wdGlvbnM6IEZ1bGxPcHRpb248Tz5bXSxcbiAgICBvcHRpb25zPzogTWFuYWdlck9wdGlvbnM8Tz4sXG4gICk6IHN0cmluZyB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhIGN1c3RvbSBkaXNwbGF5IGZ1bmN0aW9uLCB1c2UgaXRcbiAgICBpZiAob3B0aW9ucz8uZ2V0Q3VzdG9tT3B0aW9uRGlzcGxheSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0Q3VzdG9tT3B0aW9uRGlzcGxheShbLi4uc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkXSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5KSB7XG4gICAgICByZXR1cm4gZ2V0VG9wTGV2ZWxGb3JtYXR0ZWRPcHRpb25zRm9yRGlzcGxheSh0b3BMZXZlbE9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgZGVmYXVsdCBkaXNwbGF5IGZvciBvcHRpb25zIC0gdGl0bGVzIHNlcGFyYXRlZCBieSBjb21tYXMuXG4gICAgcmV0dXJuIFsuLi5zdGF0ZS5zZWxlY3Rpb24uc2VsZWN0ZWRdLm1hcCgoeyB0aXRsZSB9KSA9PiB0aXRsZSkuam9pbignLCAnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRvcExldmVsRm9ybWF0dGVkT3B0aW9uc0ZvckRpc3BsYXk8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHRvcExldmVsT3B0aW9uczogRnVsbE9wdGlvbjxPPltdLFxuICApOiBzdHJpbmcge1xuICAgIGlmICghdG9wTGV2ZWxPcHRpb25zIHx8IHRvcExldmVsT3B0aW9ucy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMgPSB0b3BMZXZlbE9wdGlvbnMuZmlsdGVyKFxuICAgICAgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCAhPSBmYWxzZSxcbiAgICApO1xuICAgIHJldHVybiBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnNcbiAgICAgIC5tYXAoKHsgdGl0bGUgfSkgPT4gdGl0bGUpXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBpbGxDb3VudEZvckRpc3BsYXk8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgdG9wTGV2ZWxPcHRpb25zOiBGdWxsT3B0aW9uPE8+W10sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBudW1iZXIge1xuICAgIGlmIChvcHRpb25zPy51c2VUb3BMZXZlbE9wdGlvbnNGb3JEaXNwbGF5KSB7XG4gICAgICBjb25zdCBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMgPSB0b3BMZXZlbE9wdGlvbnMuZmlsdGVyKFxuICAgICAgICBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkICE9IGZhbHNlLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzZWxlY3RlZE9ySW5kZXRlcm1pbmF0ZVRvcE9wdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkLnNpemU7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRaZXJvU3RhdGVNZXNzYWdlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICApOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzLmV2ZXJ5KGdyb3VwID0+IGdyb3VwLm9wdGlvbnMubGVuZ3RoID09PSAwKSkge1xuICAgICAgaWYgKHN0YXRlLnF1ZXJ5LnNlYXJjaCkgcmV0dXJuICdObyByZXN1bHRzIGZvdW5kLic7XG4gICAgICByZXR1cm4gJ05vIG9wdGlvbnMuJztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kT3B0aW9uPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBvcHRpb25zOiBTb3VyY2VPcHRpb248Tz5bXSxcbiAgICBpZDogT1snaWQnXSxcbiAgKTogU291cmNlT3B0aW9uPE8+IHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbi5pZCA9PT0gaWQpIHJldHVybiBvcHRpb247XG4gICAgICBpZiAob3B0aW9uLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBmaW5kT3B0aW9uKG9wdGlvbi5jaGlsZHJlbiwgaWQpO1xuICAgICAgICBpZiAoY2hpbGQpIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBmbGF0dGVuT3B0aW9uczxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgb3B0aW9uczogT3B0aW9uPE8+W10sXG4gICAgbGVhZk9ubHk6IGJvb2xlYW4sXG4gICk6IE9bXSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5EZWVwKFxuICAgICAgb3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSBvcHRpb24uY2hpbGRyZW4ubWFwKGNoaWxkID0+XG4gICAgICAgICAgICBmbGF0dGVuT3B0aW9ucyhbY2hpbGRdLCBsZWFmT25seSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gbGVhZk9ubHkgPyBkZXNjZW5kYW50cyA6IFtvcHRpb24sIC4uLmRlc2NlbmRhbnRzXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW29wdGlvbl07XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiB0b2dnbGVTZWxlY3RlZDxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBpZDogT1snaWQnXSxcbiAgICBtYW5hZ2VyT3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPE8+LFxuICApOiBDb3JlU3RhdGU8Tz4ge1xuICAgIGNvbnN0IHRvcExldmVsT3B0aW9ucyA9IGdldFRvcExldmVsT3B0aW9ucyhzdGF0ZS5zb3VyY2VPcHRpb25Hcm91cHMpO1xuICAgIGNvbnN0IG9wdGlvbiA9IGZpbmRPcHRpb24odG9wTGV2ZWxPcHRpb25zLCBpZCk7XG4gICAgaWYgKCFvcHRpb24pIHJldHVybiBzdGF0ZTtcblxuICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IG5ldyBPcHRpb25TZXQoc3RhdGUuc2VsZWN0aW9uLnNlbGVjdGVkKTtcblxuICAgIGNvbnN0IG5ld1ZhbHVlID0gIShcbiAgICAgIGF1Z21lbnRPcHRpb25Ub0Z1bGxPcHRpb24oc3RhdGUsIG9wdGlvbiwgbWFuYWdlck9wdGlvbnMpLnNlbGVjdGVkID09PSB0cnVlXG4gICAgKTtcblxuICAgIC8vIFdoZW4gYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoIGlzIGVuYWJsZWQgYW5kIHNlYXJjaCBpcyBhY3RpdmUsXG4gICAgLy8gdXNlIHRoZSBvcmlnaW5hbCAodW5maWx0ZXJlZCkgZGF0YSB0byBnZXQgYWxsIGNoaWxkcmVuLCBub3QganVzdFxuICAgIC8vIHRob3NlIHZpc2libGUgaW4gdGhlIGZpbHRlcmVkIHNlYXJjaCByZXN1bHRzLlxuICAgIGNvbnN0IHVzZU9yaWdpbmFsRGF0YSA9XG4gICAgICBtYW5hZ2VyT3B0aW9ucz8uYWxsb3dTZWxlY3ROb25MZWFmRHVyaW5nU2VhcmNoICYmXG4gICAgICBzdGF0ZS5xdWVyeS5zZWFyY2ggJiZcbiAgICAgIHN0YXRlLm9yaWdpbmFsT3B0aW9uR3JvdXBzLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBvcHRpb25Gb3JMZWF2ZXMgPSB1c2VPcmlnaW5hbERhdGFcbiAgICAgID8gZmluZE9wdGlvbihnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUub3JpZ2luYWxPcHRpb25Hcm91cHMpLCBpZCkgPz8gb3B0aW9uXG4gICAgICA6IG9wdGlvbjtcblxuICAgIGNvbnN0IGxlYXZlcyA9IGZsYXR0ZW5PcHRpb25zKFtvcHRpb25Gb3JMZWF2ZXNdLCB0cnVlKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgbGVhdmVzKSB7XG4gICAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgICAgbmV3U2VsZWN0aW9uLmFkZChsZWFmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NlbGVjdGlvbi5kZWxldGUobGVhZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIHNlbGVjdGVkOiBuZXdTZWxlY3Rpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzZXRTZWxlY3RlZE9wdGlvbjxPIGV4dGVuZHMgQmFzZU9wdGlvbj4oXG4gICAgc3RhdGU6IENvcmVTdGF0ZTxPPixcbiAgICBpZDogT1snaWQnXSxcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBjb25zdCB0b3BMZXZlbE9wdGlvbnMgPSBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzKTtcbiAgICBjb25zdCBvcHRpb24gPSBmaW5kT3B0aW9uKHRvcExldmVsT3B0aW9ucywgaWQpO1xuICAgIGlmICghb3B0aW9uKSByZXR1cm4gc3RhdGU7XG5cbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgT3B0aW9uU2V0PE8+KCk7XG4gICAgbmV3U2VsZWN0aW9uLmFkZChvcHRpb24pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIHNlbGVjdGVkOiBuZXdTZWxlY3Rpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0b2dnbGVWaXNpYmxlU2VsZWN0ZWQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgY29uc3QgbGVhdmVzID0gZmxhdHRlbk9wdGlvbnMoXG4gICAgICBnZXRUb3BMZXZlbE9wdGlvbnMoc3RhdGUuc291cmNlT3B0aW9uR3JvdXBzKSxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgICBjb25zdCBpc0FsbFNlbGVjdGVkID0gbGVhdmVzLmV2ZXJ5KGxlYWYgPT5cbiAgICAgIHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZC5oYXMobGVhZiksXG4gICAgKTtcbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgT3B0aW9uU2V0KHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG5cbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgbGVhdmVzKSB7XG4gICAgICBpZiAoaXNBbGxTZWxlY3RlZCkgbmV3U2VsZWN0aW9uLmRlbGV0ZShsZWFmKTtcbiAgICAgIGVsc2UgbmV3U2VsZWN0aW9uLmFkZChsZWFmKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgLi4uc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZDogbmV3U2VsZWN0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlT3B0aW9uRXhwYW5kZWQ8TyBleHRlbmRzIEJhc2VPcHRpb24+KFxuICAgIHN0YXRlOiBDb3JlU3RhdGU8Tz4sXG4gICAgaWQ6IE9bJ2lkJ10sXG4gICk6IENvcmVTdGF0ZTxPPiB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSAhc3RhdGUuZGlzcGxheS5leHBhbmRlZE9wdGlvbnMuaGFzKGlkKTtcbiAgICBjb25zdCBuZXdFeHBhbmRlZE9wdGlvbnMgPSBuZXcgU2V0KHN0YXRlLmRpc3BsYXkuZXhwYW5kZWRPcHRpb25zKTtcbiAgICBpZiAobmV3VmFsdWUpIG5ld0V4cGFuZGVkT3B0aW9ucy5hZGQoaWQpO1xuICAgIGVsc2UgbmV3RXhwYW5kZWRPcHRpb25zLmRlbGV0ZShpZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBleHBhbmRlZE9wdGlvbnM6IG5ld0V4cGFuZGVkT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNpZGVFZmZlY3RzPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGFjdGlvbjogQWN0aW9uPE8+IHwgSW50ZXJuYWxBY3Rpb248Tz4sXG4gICAgc291cmNlOiBTb3VyY2U8Tz4sXG4gICAgaW50ZXJuYWxBY3Rpb25zOiBTdWJqZWN0PEludGVybmFsQWN0aW9uPE8+PixcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBpZiAoXG4gICAgICBhY3Rpb24udHlwZSA9PT0gJ2xvYWQnIHx8XG4gICAgICBhY3Rpb24udHlwZSA9PT0gJ3NlYXJjaENoYW5nZScgfHxcbiAgICAgIGFjdGlvbi50eXBlID09PSAnb3JkZXJDaGFuZ2UnIHx8XG4gICAgICAoYWN0aW9uLnR5cGUgPT09ICdvcGVuQ2hhbmdlJyAmJiBhY3Rpb24ub3BlbilcbiAgICApIHtcbiAgICAgIHNvdXJjZShzdGF0ZS5xdWVyeSwgYWN0aW9uKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiByZXN1bHQuZGF0YTtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGEgPSBBcnJheS5pc0FycmF5KHJlc3VsdClcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IHJlc3VsdC5vcmlnaW5hbERhdGE7XG4gICAgICAgICAgaW50ZXJuYWxBY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZENvbXBsZXRlJywgZGF0YSwgb3JpZ2luYWxEYXRhIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgaW50ZXJuYWxBY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZEVycm9yJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVkdWNlPE8gZXh0ZW5kcyBCYXNlT3B0aW9uPihcbiAgICBzdGF0ZTogQ29yZVN0YXRlPE8+LFxuICAgIGFjdGlvbjogQWN0aW9uPE8+IHwgSW50ZXJuYWxBY3Rpb248Tz4sXG4gICAgbWFuYWdlck9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxPPixcbiAgKTogQ29yZVN0YXRlPE8+IHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlICdsb2FkJzpcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgY2FzZSAnbG9hZENvbXBsZXRlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBsb2FkOiB7XG4gICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc291cmNlT3B0aW9uR3JvdXBzOiBhY3Rpb24uZGF0YSxcbiAgICAgICAgICBvcmlnaW5hbE9wdGlvbkdyb3VwczogYWN0aW9uLm9yaWdpbmFsRGF0YSA/PyBbXSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ2xvYWRFcnJvcic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgbG9hZDoge1xuICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogYWN0aW9uLmVycm9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdvcGVuQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBzZWFyY2g6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGlzcGxheToge1xuICAgICAgICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgICAgICAgIG9wZW46IGFjdGlvbi5vcGVuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICBjYXNlICdzZWFyY2hDaGFuZ2UnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHNlYXJjaDogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ29yZGVyQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBvcmRlcjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3NlbGVjdGlvbkNoYW5nZSc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgc2VsZWN0aW9uOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3RvZ2dsZU9wdGlvblNlbGVjdGVkJzpcbiAgICAgICAgcmV0dXJuIHRvZ2dsZVNlbGVjdGVkKHN0YXRlLCBhY3Rpb24uaWQsIG1hbmFnZXJPcHRpb25zKTtcbiAgICAgIGNhc2UgJ3NldFNlbGVjdGVkT3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHNldFNlbGVjdGVkT3B0aW9uKHN0YXRlLCBhY3Rpb24uaWQpO1xuICAgICAgY2FzZSAndmlzaWJsZVNlbGVjdGVkQ2hhbmdlJzpcbiAgICAgICAgcmV0dXJuIHRvZ2dsZVZpc2libGVTZWxlY3RlZChzdGF0ZSk7XG4gICAgICBjYXNlICd0b2dnbGVPcHRpb25FeHBhbmRlZCc6XG4gICAgICAgIHJldHVybiB0b2dnbGVPcHRpb25FeHBhbmRlZChzdGF0ZSwgYWN0aW9uLmlkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|