@igo2/common 1.15.4 → 16.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/common-theme.scss +19 -0
- package/{esm2020 → esm2022}/igo2-common.mjs +4 -4
- package/esm2022/lib/action/action.module.mjs +20 -0
- package/esm2022/lib/action/actionbar/actionbar-item.component.mjs +270 -0
- package/esm2022/lib/action/actionbar/actionbar.component.mjs +389 -0
- package/{esm2020 → esm2022}/lib/action/actionbar/actionbar.module.mjs +57 -57
- package/{esm2020 → esm2022}/lib/action/index.mjs +3 -3
- package/{esm2020 → esm2022}/lib/action/shared/action.enums.mjs +7 -7
- package/{esm2020 → esm2022}/lib/action/shared/action.interfaces.mjs +2 -2
- package/{esm2020 → esm2022}/lib/action/shared/index.mjs +4 -4
- package/{esm2020 → esm2022}/lib/action/shared/store.mjs +8 -8
- package/esm2022/lib/backdrop/backdrop.component.mjs +27 -0
- package/{esm2020 → esm2022}/lib/backdrop/backdrop.module.mjs +25 -25
- package/{esm2020 → esm2022}/lib/backdrop/index.mjs +2 -2
- package/esm2022/lib/badge-icon/badge-icon.directive.mjs +150 -0
- package/{esm2020 → esm2022}/lib/badge-icon/badge-icon.module.mjs +26 -26
- package/{esm2020 → esm2022}/lib/badge-icon/index.mjs +2 -2
- package/esm2022/lib/clickout/clickout.directive.mjs +33 -0
- package/{esm2020 → esm2022}/lib/clickout/clickout.module.mjs +24 -24
- package/{esm2020 → esm2022}/lib/clickout/index.mjs +2 -2
- package/{esm2020 → esm2022}/lib/clone/clone.module.mjs +24 -24
- package/esm2022/lib/clone/clone.pipe.mjs +24 -0
- package/{esm2020 → esm2022}/lib/clone/index.mjs +2 -2
- package/esm2022/lib/collapsible/collapse.directive.mjs +58 -0
- package/esm2022/lib/collapsible/collapsible.component.mjs +54 -0
- package/{esm2020 → esm2022}/lib/collapsible/collapsible.module.mjs +27 -27
- package/{esm2020 → esm2022}/lib/collapsible/index.mjs +3 -3
- package/esm2022/lib/color-picker-form-field/color-picker-form-field.component.mjs +121 -0
- package/esm2022/lib/color-picker-form-field/color-picker-form-field.module.mjs +32 -0
- package/esm2022/lib/color-picker-form-field/index.mjs +2 -0
- package/esm2022/lib/confirm-dialog/confirm-dialog.component.mjs +47 -0
- package/{esm2020 → esm2022}/lib/confirm-dialog/confirm-dialog.module.mjs +29 -29
- package/esm2022/lib/confirm-dialog/confirm-dialog.service.mjs +29 -0
- package/{esm2020 → esm2022}/lib/confirm-dialog/index.mjs +3 -3
- package/esm2022/lib/context-menu/context-menu.directive.mjs +110 -0
- package/{esm2020 → esm2022}/lib/context-menu/context-menu.module.mjs +25 -25
- package/{esm2020 → esm2022}/lib/context-menu/index.mjs +3 -3
- package/esm2022/lib/context-menu/long-press.directive.mjs +67 -0
- package/esm2022/lib/custom-html/custom-html.component.mjs +27 -0
- package/{esm2020 → esm2022}/lib/custom-html/custom-html.module.mjs +47 -47
- package/{esm2020 → esm2022}/lib/custom-html/custom-html.pipe.mjs +20 -18
- package/{esm2020 → esm2022}/lib/custom-html/index.mjs +3 -3
- package/{esm2020 → esm2022}/lib/dom/dom.interfaces.mjs +2 -2
- package/{esm2020 → esm2022}/lib/dom/dom.module.mjs +21 -23
- package/esm2022/lib/dom/dom.service.mjs +35 -0
- package/{esm2020 → esm2022}/lib/dom/index.mjs +3 -3
- package/esm2022/lib/drag-drop/drag-drop.directive.mjs +85 -0
- package/{esm2020 → esm2022}/lib/drag-drop/drag-drop.module.mjs +24 -24
- package/{esm2020 → esm2022}/lib/drag-drop/index.mjs +2 -2
- package/esm2022/lib/dynamic-component/dynamic-component.module.mjs +20 -0
- package/esm2022/lib/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +138 -0
- package/esm2022/lib/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +22 -0
- package/{esm2020 → esm2022}/lib/dynamic-component/index.mjs +3 -3
- package/{esm2020 → esm2022}/lib/dynamic-component/shared/dynamic-component.interfaces.mjs +2 -2
- package/esm2022/lib/dynamic-component/shared/dynamic-component.mjs +183 -0
- package/{esm2020 → esm2022}/lib/dynamic-component/shared/dynamic-component.service.mjs +30 -29
- package/{esm2020 → esm2022}/lib/dynamic-component/shared/index.mjs +4 -4
- package/esm2022/lib/entity/entity-selector/entity-selector.component.mjs +214 -0
- package/esm2022/lib/entity/entity-selector/entity-selector.module.mjs +24 -0
- package/esm2022/lib/entity/entity-table/entity-table-row.directive.mjs +139 -0
- package/esm2022/lib/entity/entity-table/entity-table.component.mjs +1455 -0
- package/esm2022/lib/entity/entity-table/entity-table.module.mjs +96 -0
- package/esm2022/lib/entity/entity-table-paginator/entity-table-paginator.component.mjs +167 -0
- package/esm2022/lib/entity/entity-table-paginator/entity-table-paginator.interface.mjs +2 -0
- package/esm2022/lib/entity/entity-table-paginator/entity-table-paginator.module.mjs +22 -0
- package/{esm2020 → esm2022}/lib/entity/entity.module.mjs +29 -31
- package/{esm2020 → esm2022}/lib/entity/index.mjs +6 -6
- package/{esm2020 → esm2022}/lib/entity/shared/entity.enums.mjs +28 -28
- package/esm2022/lib/entity/shared/entity.interfaces.mjs +2 -0
- package/esm2022/lib/entity/shared/entity.utils.mjs +73 -0
- package/esm2022/lib/entity/shared/index.mjs +11 -0
- package/esm2022/lib/entity/shared/state.mjs +194 -0
- package/esm2022/lib/entity/shared/store-strategy.mjs +73 -0
- package/esm2022/lib/entity/shared/store.mjs +256 -0
- package/esm2022/lib/entity/shared/strategies/filter-custom-function.mjs +80 -0
- package/esm2022/lib/entity/shared/strategies/filter-selection.mjs +81 -0
- package/{esm2020 → esm2022}/lib/entity/shared/strategies/index.mjs +4 -4
- package/esm2022/lib/entity/shared/strategies/strategy.mjs +78 -0
- package/esm2022/lib/entity/shared/transaction.mjs +329 -0
- package/esm2022/lib/entity/shared/view.mjs +330 -0
- package/esm2022/lib/entity/shared/watcher.mjs +135 -0
- package/esm2022/lib/flexible/flexible.component.mjs +153 -0
- package/{esm2020 → esm2022}/lib/flexible/flexible.module.mjs +24 -24
- package/{esm2020 → esm2022}/lib/flexible/flexible.type.mjs +2 -2
- package/{esm2020 → esm2022}/lib/flexible/index.mjs +3 -3
- package/esm2022/lib/form/form/form.component.mjs +125 -0
- package/esm2022/lib/form/form/form.module.mjs +23 -0
- package/esm2022/lib/form/form-field/form-field-select.component.mjs +140 -0
- package/esm2022/lib/form/form-field/form-field-text.component.mjs +113 -0
- package/esm2022/lib/form/form-field/form-field-textarea.component.mjs +114 -0
- package/esm2022/lib/form/form-field/form-field.component.mjs +78 -0
- package/{esm2020 → esm2022}/lib/form/form-field/form-field.module.mjs +74 -74
- package/{esm2020 → esm2022}/lib/form/form-field/index.mjs +5 -5
- package/esm2022/lib/form/form-group/form-group.component.mjs +115 -0
- package/esm2022/lib/form/form-group/form-group.module.mjs +36 -0
- package/esm2022/lib/form/form.module.mjs +27 -0
- package/{esm2020 → esm2022}/lib/form/index.mjs +5 -5
- package/{esm2020 → esm2022}/lib/form/shared/form-field-component.mjs +7 -7
- package/esm2022/lib/form/shared/form-field.service.mjs +29 -0
- package/esm2022/lib/form/shared/form.interfaces.mjs +2 -0
- package/esm2022/lib/form/shared/form.service.mjs +82 -0
- package/esm2022/lib/form/shared/form.utils.mjs +40 -0
- package/{esm2020 → esm2022}/lib/form/shared/index.mjs +6 -6
- package/esm2022/lib/home-button/home-button.component.mjs +30 -0
- package/{esm2020 → esm2022}/lib/home-button/home-button.module.mjs +41 -41
- package/{esm2020 → esm2022}/lib/home-button/index.mjs +2 -2
- package/esm2022/lib/image/image-error.directive.mjs +36 -0
- package/{esm2020 → esm2022}/lib/image/image.module.mjs +25 -25
- package/{esm2020 → esm2022}/lib/image/index.mjs +3 -3
- package/esm2022/lib/image/secure-image.pipe.mjs +65 -0
- package/{esm2020 → esm2022}/lib/interactive-tour/index.mjs +5 -5
- package/esm2022/lib/interactive-tour/interactive-tour.component.mjs +161 -0
- package/esm2022/lib/interactive-tour/interactive-tour.interface.mjs +2 -0
- package/esm2022/lib/interactive-tour/interactive-tour.loader.mjs +49 -0
- package/{esm2020 → esm2022}/lib/interactive-tour/interactive-tour.module.mjs +40 -40
- package/esm2022/lib/interactive-tour/interactive-tour.service.mjs +297 -0
- package/{esm2020 → esm2022}/lib/json-dialog/index.mjs +3 -3
- package/esm2022/lib/json-dialog/json-dialog.component.mjs +114 -0
- package/{esm2020 → esm2022}/lib/json-dialog/json-dialog.module.mjs +29 -29
- package/{esm2020 → esm2022}/lib/json-dialog/json-dialog.service.mjs +26 -24
- package/{esm2020 → esm2022}/lib/keyvalue/index.mjs +2 -2
- package/{esm2020 → esm2022}/lib/keyvalue/keyvalue.module.mjs +24 -24
- package/{esm2020 → esm2022}/lib/keyvalue/keyvalue.pipe.mjs +18 -18
- package/{esm2020 → esm2022}/lib/list/index.mjs +3 -3
- package/esm2022/lib/list/list-item.directive.mjs +167 -0
- package/esm2022/lib/list/list.component.mjs +268 -0
- package/{esm2020 → esm2022}/lib/list/list.module.mjs +29 -29
- package/{esm2020 → esm2022}/lib/panel/index.mjs +2 -2
- package/esm2022/lib/panel/panel.component.mjs +60 -0
- package/{esm2020 → esm2022}/lib/panel/panel.module.mjs +19 -19
- package/{esm2020 → esm2022}/lib/sidenav/index.mjs +2 -2
- package/esm2022/lib/sidenav/sidenav-shim.directive.mjs +59 -0
- package/{esm2020 → esm2022}/lib/sidenav/sidenav.module.mjs +24 -24
- package/{esm2020 → esm2022}/lib/spinner/index.mjs +3 -3
- package/esm2022/lib/spinner/spinner-activity.directive.mjs +55 -0
- package/esm2022/lib/spinner/spinner.component.mjs +38 -0
- package/{esm2020 → esm2022}/lib/spinner/spinner.module.mjs +21 -21
- package/{esm2020 → esm2022}/lib/stop-propagation/index.mjs +3 -3
- package/{esm2020 → esm2022}/lib/stop-propagation/stop-drop-propagation.directive.mjs +22 -22
- package/{esm2020 → esm2022}/lib/stop-propagation/stop-propagation.directive.mjs +21 -21
- package/{esm2020 → esm2022}/lib/stop-propagation/stop-propagation.module.mjs +25 -25
- package/{esm2020 → esm2022}/lib/table/index.mjs +6 -6
- package/{esm2020 → esm2022}/lib/table/table-action-color.enum.mjs +7 -7
- package/esm2022/lib/table/table-database.mjs +28 -0
- package/esm2022/lib/table/table-datasource.mjs +64 -0
- package/esm2022/lib/table/table-model.interface.mjs +2 -0
- package/esm2022/lib/table/table.component.mjs +302 -0
- package/{esm2020 → esm2022}/lib/table/table.module.mjs +67 -67
- package/{esm2020 → esm2022}/lib/tool/index.mjs +3 -3
- package/{esm2020 → esm2022}/lib/tool/shared/index.mjs +6 -6
- package/esm2022/lib/tool/shared/tool-component.mjs +9 -0
- package/esm2022/lib/tool/shared/tool.interface.mjs +2 -0
- package/esm2022/lib/tool/shared/tool.service.mjs +43 -0
- package/{esm2020 → esm2022}/lib/tool/shared/toolbox.enums.mjs +7 -7
- package/esm2022/lib/tool/shared/toolbox.mjs +184 -0
- package/esm2022/lib/tool/tool.module.mjs +26 -0
- package/{esm2020 → esm2022}/lib/tool/toolbox/toolbox.animation.mjs +10 -10
- package/esm2022/lib/tool/toolbox/toolbox.component.mjs +273 -0
- package/esm2022/lib/tool/toolbox/toolbox.module.mjs +24 -0
- package/{esm2020 → esm2022}/lib/widget/index.mjs +3 -3
- package/{esm2020 → esm2022}/lib/widget/shared/index.mjs +4 -4
- package/esm2022/lib/widget/shared/widget.interfaces.mjs +2 -0
- package/{esm2020 → esm2022}/lib/widget/shared/widget.mjs +4 -4
- package/esm2022/lib/widget/shared/widget.service.mjs +22 -0
- package/esm2022/lib/widget/widget-outlet/widget-outlet.component.mjs +124 -0
- package/esm2022/lib/widget/widget-outlet/widget-outlet.module.mjs +23 -0
- package/esm2022/lib/widget/widget.module.mjs +21 -0
- package/{esm2020 → esm2022}/lib/workspace/index.mjs +4 -4
- package/{esm2020 → esm2022}/lib/workspace/shared/index.mjs +4 -4
- package/esm2022/lib/workspace/shared/store.mjs +37 -0
- package/{esm2020 → esm2022}/lib/workspace/shared/workspace.interfaces.mjs +2 -2
- package/esm2022/lib/workspace/shared/workspace.mjs +143 -0
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.component.mjs +58 -0
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +23 -0
- package/esm2022/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +94 -0
- package/esm2022/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +23 -0
- package/esm2022/lib/workspace/workspace.module.mjs +20 -0
- package/esm2022/public_api.mjs +76 -0
- package/{fesm2020 → fesm2022}/igo2-common.mjs +9837 -9345
- package/fesm2022/igo2-common.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/action/action.module.d.ts +8 -8
- package/lib/action/action.theming.scss +5 -0
- package/lib/action/actionbar/actionbar-item.component.d.ts +78 -78
- package/lib/action/actionbar/actionbar-item.theming.scss +32 -0
- package/lib/action/actionbar/actionbar.component.d.ts +147 -146
- package/lib/action/actionbar/actionbar.module.d.ts +20 -20
- package/lib/action/actionbar/actionbar.theming.scss +22 -0
- package/lib/action/index.d.ts +2 -2
- package/lib/action/shared/action.enums.d.ts +5 -5
- package/lib/action/shared/action.interfaces.d.ts +17 -17
- package/lib/action/shared/index.d.ts +3 -3
- package/lib/action/shared/store.d.ts +8 -8
- package/lib/backdrop/backdrop.component.d.ts +9 -9
- package/lib/backdrop/backdrop.module.d.ts +10 -10
- package/lib/backdrop/index.d.ts +1 -1
- package/lib/badge-icon/badge-icon.directive.d.ts +36 -36
- package/lib/badge-icon/badge-icon.module.d.ts +11 -11
- package/lib/badge-icon/index.d.ts +1 -1
- package/lib/clickout/clickout.directive.d.ts +10 -10
- package/lib/clickout/clickout.module.d.ts +9 -9
- package/lib/clickout/index.d.ts +1 -1
- package/lib/clone/clone.module.d.ts +9 -9
- package/lib/clone/clone.pipe.d.ts +7 -7
- package/lib/clone/index.d.ts +1 -1
- package/lib/collapsible/collapse.directive.d.ts +19 -19
- package/lib/collapsible/collapsible.component.d.ts +13 -13
- package/lib/collapsible/collapsible.module.d.ts +12 -12
- package/lib/collapsible/collapsible.theming.scss +22 -0
- package/lib/collapsible/index.d.ts +2 -2
- package/lib/color-picker-form-field/color-picker-form-field.component.d.ts +26 -0
- package/lib/color-picker-form-field/color-picker-form-field.module.d.ts +10 -0
- package/lib/color-picker-form-field/index.d.ts +1 -0
- package/lib/confirm-dialog/confirm-dialog.component.d.ts +9 -9
- package/lib/confirm-dialog/confirm-dialog.module.d.ts +12 -12
- package/lib/confirm-dialog/confirm-dialog.service.d.ts +12 -12
- package/lib/confirm-dialog/index.d.ts +2 -2
- package/lib/context-menu/context-menu.directive.d.ts +21 -21
- package/lib/context-menu/context-menu.module.d.ts +10 -10
- package/lib/context-menu/index.d.ts +2 -2
- package/lib/context-menu/long-press.directive.d.ts +20 -20
- package/lib/custom-html/custom-html.component.d.ts +9 -9
- package/lib/custom-html/custom-html.module.d.ts +16 -16
- package/lib/custom-html/custom-html.pipe.d.ts +10 -10
- package/lib/custom-html/index.d.ts +2 -2
- package/lib/dom/dom.interfaces.d.ts +10 -10
- package/lib/dom/dom.module.d.ts +8 -8
- package/lib/dom/dom.service.d.ts +10 -10
- package/lib/dom/index.d.ts +2 -2
- package/lib/drag-drop/drag-drop.directive.d.ts +14 -14
- package/lib/drag-drop/drag-drop.module.d.ts +9 -9
- package/lib/drag-drop/index.d.ts +1 -1
- package/lib/dynamic-component/dynamic-component.module.d.ts +8 -8
- package/lib/dynamic-component/dynamic-outlet/dynamic-outlet.component.d.ts +70 -70
- package/lib/dynamic-component/dynamic-outlet/dynamic-outlet.module.d.ts +11 -11
- package/lib/dynamic-component/index.d.ts +2 -2
- package/lib/dynamic-component/shared/dynamic-component.d.ts +88 -88
- package/lib/dynamic-component/shared/dynamic-component.interfaces.d.ts +3 -3
- package/lib/dynamic-component/shared/dynamic-component.service.d.ts +18 -18
- package/lib/dynamic-component/shared/index.d.ts +3 -3
- package/lib/entity/entity-selector/entity-selector.component.d.ts +92 -92
- package/lib/entity/entity-selector/entity-selector.module.d.ts +13 -13
- package/lib/entity/entity-selector/entity-selector.theming.scss +21 -0
- package/lib/entity/entity-table/entity-table-row.directive.d.ts +69 -69
- package/lib/entity/entity-table/entity-table.component.d.ts +327 -333
- package/lib/entity/entity-table/entity-table.module.d.ts +29 -29
- package/lib/entity/entity-table/entity-table.theming.scss +34 -0
- package/lib/entity/entity-table-paginator/entity-table-paginator.component.d.ts +49 -49
- package/lib/entity/entity-table-paginator/entity-table-paginator.interface.d.ts +8 -8
- package/lib/entity/entity-table-paginator/entity-table-paginator.module.d.ts +11 -11
- package/lib/entity/entity-table-paginator/entity-table-paginator.theming.scss +21 -0
- package/lib/entity/entity.module.d.ts +10 -10
- package/lib/entity/entity.theming.scss +10 -0
- package/lib/entity/index.d.ts +5 -5
- package/lib/entity/shared/entity.enums.d.ts +23 -23
- package/lib/entity/shared/entity.interfaces.d.ts +95 -114
- package/lib/entity/shared/entity.utils.d.ts +49 -49
- package/lib/entity/shared/index.d.ts +10 -9
- package/lib/entity/shared/state.d.ts +108 -103
- package/lib/entity/shared/store-strategy.d.ts +38 -0
- package/lib/entity/shared/store.d.ts +147 -176
- package/lib/entity/shared/strategies/filter-custom-function.d.ts +51 -51
- package/lib/entity/shared/strategies/filter-selection.d.ts +48 -48
- package/lib/entity/shared/strategies/index.d.ts +3 -3
- package/lib/entity/shared/strategies/strategy.d.ts +56 -56
- package/lib/entity/shared/transaction.d.ts +180 -168
- package/lib/entity/shared/view.d.ts +193 -193
- package/lib/entity/shared/watcher.d.ts +72 -72
- package/lib/flexible/flexible.component.d.ts +41 -41
- package/lib/flexible/flexible.module.d.ts +9 -9
- package/lib/flexible/flexible.type.d.ts +2 -2
- package/lib/flexible/index.d.ts +2 -2
- package/lib/form/form/form.component.d.ts +53 -53
- package/lib/form/form/form.module.d.ts +12 -12
- package/lib/form/form-field/form-field-select.component.d.ts +48 -48
- package/lib/form/form-field/form-field-text.component.d.ts +41 -41
- package/lib/form/form-field/form-field-textarea.component.d.ts +41 -41
- package/lib/form/form-field/form-field.component.d.ts +29 -34
- package/lib/form/form-field/form-field.module.d.ts +21 -21
- package/lib/form/form-field/index.d.ts +4 -4
- package/lib/form/form-group/form-group.component.d.ts +49 -49
- package/lib/form/form-group/form-group.module.d.ts +14 -14
- package/lib/form/form.module.d.ts +13 -13
- package/lib/form/index.d.ts +4 -4
- package/lib/form/shared/form-field-component.d.ts +1 -1
- package/lib/form/shared/form-field.service.d.ts +19 -19
- package/lib/form/shared/form.interfaces.d.ts +61 -57
- package/lib/form/shared/form.service.d.ts +15 -15
- package/lib/form/shared/form.utils.d.ts +11 -11
- package/lib/form/shared/index.d.ts +5 -5
- package/lib/home-button/home-button.component.d.ts +9 -9
- package/lib/home-button/home-button.module.d.ts +15 -15
- package/lib/home-button/home-button.theming.scss +18 -0
- package/lib/home-button/index.d.ts +1 -1
- package/lib/image/image-error.directive.d.ts +11 -11
- package/lib/image/image.module.d.ts +10 -10
- package/lib/image/index.d.ts +2 -2
- package/lib/image/secure-image.pipe.d.ts +13 -13
- package/lib/interactive-tour/index.d.ts +4 -4
- package/lib/interactive-tour/interactive-tour.component.d.ts +30 -30
- package/lib/interactive-tour/interactive-tour.interface.d.ts +32 -32
- package/lib/interactive-tour/interactive-tour.loader.d.ts +18 -18
- package/lib/interactive-tour/interactive-tour.module.d.ts +12 -12
- package/lib/interactive-tour/interactive-tour.service.d.ts +29 -29
- package/lib/interactive-tour/interactive-tour.theming.scss +32 -0
- package/lib/json-dialog/index.d.ts +2 -2
- package/lib/json-dialog/json-dialog.component.d.ts +13 -13
- package/lib/json-dialog/json-dialog.module.d.ts +13 -13
- package/lib/json-dialog/json-dialog.service.d.ts +10 -10
- package/lib/keyvalue/index.d.ts +1 -1
- package/lib/keyvalue/keyvalue.module.d.ts +9 -9
- package/lib/keyvalue/keyvalue.pipe.d.ts +7 -7
- package/lib/list/index.d.ts +2 -2
- package/lib/list/list-item.directive.d.ts +43 -43
- package/lib/list/list.component.d.ts +51 -51
- package/lib/list/list.module.d.ts +14 -14
- package/lib/list/list.theming.scss +40 -0
- package/lib/panel/index.d.ts +1 -1
- package/lib/panel/panel.component.d.ts +10 -10
- package/lib/panel/panel.module.d.ts +8 -8
- package/lib/panel/panel.theming.scss +30 -0
- package/lib/sidenav/index.d.ts +1 -1
- package/lib/sidenav/sidenav-shim.directive.d.ts +20 -20
- package/lib/sidenav/sidenav.module.d.ts +9 -9
- package/lib/spinner/index.d.ts +2 -2
- package/lib/spinner/spinner-activity.directive.d.ts +32 -32
- package/lib/spinner/spinner.component.d.ts +12 -12
- package/lib/spinner/spinner.module.d.ts +10 -10
- package/lib/stop-propagation/index.d.ts +2 -2
- package/lib/stop-propagation/stop-drop-propagation.directive.d.ts +6 -6
- package/lib/stop-propagation/stop-propagation.directive.d.ts +6 -6
- package/lib/stop-propagation/stop-propagation.module.d.ts +10 -10
- package/lib/table/index.d.ts +5 -5
- package/lib/table/table-action-color.enum.d.ts +5 -5
- package/lib/table/table-database.d.ts +10 -10
- package/lib/table/table-datasource.d.ts +18 -17
- package/lib/table/table-model.interface.d.ts +28 -28
- package/lib/table/table.component.d.ts +40 -40
- package/lib/table/table.module.d.ts +20 -20
- package/lib/tool/index.d.ts +2 -2
- package/lib/tool/shared/index.d.ts +5 -5
- package/lib/tool/shared/tool-component.d.ts +2 -2
- package/lib/tool/shared/tool.interface.d.ts +18 -18
- package/lib/tool/shared/tool.service.d.ts +30 -30
- package/lib/tool/shared/toolbox.d.ts +95 -95
- package/lib/tool/shared/toolbox.enums.d.ts +5 -5
- package/lib/tool/tool.module.d.ts +10 -10
- package/lib/tool/tool.theming.scss +5 -0
- package/lib/tool/toolbox/toolbox.animation.d.ts +2 -2
- package/lib/tool/toolbox/toolbox.component.d.ts +128 -127
- package/lib/tool/toolbox/toolbox.module.d.ts +13 -13
- package/lib/tool/toolbox/toolbox.theming.scss +105 -0
- package/lib/widget/index.d.ts +2 -2
- package/lib/widget/shared/index.d.ts +3 -3
- package/lib/widget/shared/widget.d.ts +4 -4
- package/lib/widget/shared/widget.interfaces.d.ts +12 -12
- package/lib/widget/shared/widget.service.d.ts +10 -10
- package/lib/widget/widget-outlet/widget-outlet.component.d.ts +71 -71
- package/lib/widget/widget-outlet/widget-outlet.module.d.ts +12 -12
- package/lib/widget/widget.module.d.ts +8 -8
- package/lib/workspace/index.d.ts +3 -3
- package/lib/workspace/shared/index.d.ts +3 -3
- package/lib/workspace/shared/store.d.ts +20 -20
- package/lib/workspace/shared/workspace.d.ts +108 -108
- package/lib/workspace/shared/workspace.interfaces.d.ts +11 -11
- package/lib/workspace/workspace-selector/workspace-selector.component.d.ts +39 -39
- package/lib/workspace/workspace-selector/workspace-selector.module.d.ts +12 -12
- package/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.d.ts +57 -57
- package/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.module.d.ts +12 -12
- package/lib/workspace/workspace.module.d.ts +9 -9
- package/locale/en.common.json +43 -0
- package/locale/fr.common.json +43 -0
- package/package.json +30 -28
- package/public_api.d.ts +72 -70
- package/style/partial/common-utils.scss +9 -0
- package/style/partial/common.variables.scss +8 -8
- package/style/style.css +204 -0
- package/esm2020/lib/action/action.module.mjs +0 -27
- package/esm2020/lib/action/actionbar/actionbar-item.component.mjs +0 -252
- package/esm2020/lib/action/actionbar/actionbar.component.mjs +0 -370
- package/esm2020/lib/backdrop/backdrop.component.mjs +0 -26
- package/esm2020/lib/badge-icon/badge-icon.directive.mjs +0 -141
- package/esm2020/lib/clickout/clickout.directive.mjs +0 -32
- package/esm2020/lib/clone/clone.pipe.mjs +0 -24
- package/esm2020/lib/collapsible/collapse.directive.mjs +0 -55
- package/esm2020/lib/collapsible/collapsible.component.mjs +0 -57
- package/esm2020/lib/confirm-dialog/confirm-dialog.component.mjs +0 -44
- package/esm2020/lib/confirm-dialog/confirm-dialog.service.mjs +0 -24
- package/esm2020/lib/context-menu/context-menu.directive.mjs +0 -103
- package/esm2020/lib/context-menu/long-press.directive.mjs +0 -67
- package/esm2020/lib/custom-html/custom-html.component.mjs +0 -28
- package/esm2020/lib/dom/dom.service.mjs +0 -30
- package/esm2020/lib/drag-drop/drag-drop.directive.mjs +0 -88
- package/esm2020/lib/dynamic-component/dynamic-component.module.mjs +0 -31
- package/esm2020/lib/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +0 -122
- package/esm2020/lib/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +0 -28
- package/esm2020/lib/dynamic-component/shared/dynamic-component.mjs +0 -174
- package/esm2020/lib/entity/entity-selector/entity-selector.component.mjs +0 -194
- package/esm2020/lib/entity/entity-selector/entity-selector.module.mjs +0 -32
- package/esm2020/lib/entity/entity-table/entity-table-row.directive.mjs +0 -137
- package/esm2020/lib/entity/entity-table/entity-table.component.mjs +0 -1376
- package/esm2020/lib/entity/entity-table/entity-table.module.mjs +0 -102
- package/esm2020/lib/entity/entity-table-paginator/entity-table-paginator.component.mjs +0 -132
- package/esm2020/lib/entity/entity-table-paginator/entity-table-paginator.interface.mjs +0 -2
- package/esm2020/lib/entity/entity-table-paginator/entity-table-paginator.module.mjs +0 -28
- package/esm2020/lib/entity/shared/entity.interfaces.mjs +0 -2
- package/esm2020/lib/entity/shared/entity.utils.mjs +0 -67
- package/esm2020/lib/entity/shared/index.mjs +0 -10
- package/esm2020/lib/entity/shared/state.mjs +0 -191
- package/esm2020/lib/entity/shared/store.mjs +0 -288
- package/esm2020/lib/entity/shared/strategies/filter-custom-function.mjs +0 -79
- package/esm2020/lib/entity/shared/strategies/filter-selection.mjs +0 -84
- package/esm2020/lib/entity/shared/strategies/strategy.mjs +0 -75
- package/esm2020/lib/entity/shared/transaction.mjs +0 -316
- package/esm2020/lib/entity/shared/view.mjs +0 -315
- package/esm2020/lib/entity/shared/watcher.mjs +0 -120
- package/esm2020/lib/flexible/flexible.component.mjs +0 -148
- package/esm2020/lib/form/form/form.component.mjs +0 -117
- package/esm2020/lib/form/form/form.module.mjs +0 -40
- package/esm2020/lib/form/form-field/form-field-select.component.mjs +0 -127
- package/esm2020/lib/form/form-field/form-field-text.component.mjs +0 -104
- package/esm2020/lib/form/form-field/form-field-textarea.component.mjs +0 -105
- package/esm2020/lib/form/form-field/form-field.component.mjs +0 -72
- package/esm2020/lib/form/form-group/form-group.component.mjs +0 -105
- package/esm2020/lib/form/form-group/form-group.module.mjs +0 -40
- package/esm2020/lib/form/form.module.mjs +0 -49
- package/esm2020/lib/form/shared/form-field.service.mjs +0 -29
- package/esm2020/lib/form/shared/form.interfaces.mjs +0 -2
- package/esm2020/lib/form/shared/form.service.mjs +0 -81
- package/esm2020/lib/form/shared/form.utils.mjs +0 -40
- package/esm2020/lib/home-button/home-button.component.mjs +0 -31
- package/esm2020/lib/image/image-error.directive.mjs +0 -35
- package/esm2020/lib/image/secure-image.pipe.mjs +0 -59
- package/esm2020/lib/interactive-tour/interactive-tour.component.mjs +0 -135
- package/esm2020/lib/interactive-tour/interactive-tour.interface.mjs +0 -2
- package/esm2020/lib/interactive-tour/interactive-tour.loader.mjs +0 -44
- package/esm2020/lib/interactive-tour/interactive-tour.service.mjs +0 -285
- package/esm2020/lib/json-dialog/json-dialog.component.mjs +0 -109
- package/esm2020/lib/list/list-item.directive.mjs +0 -165
- package/esm2020/lib/list/list.component.mjs +0 -262
- package/esm2020/lib/panel/panel.component.mjs +0 -59
- package/esm2020/lib/sidenav/sidenav-shim.directive.mjs +0 -55
- package/esm2020/lib/spinner/spinner-activity.directive.mjs +0 -47
- package/esm2020/lib/spinner/spinner.component.mjs +0 -35
- package/esm2020/lib/table/table-database.mjs +0 -28
- package/esm2020/lib/table/table-datasource.mjs +0 -61
- package/esm2020/lib/table/table-model.interface.mjs +0 -2
- package/esm2020/lib/table/table.component.mjs +0 -297
- package/esm2020/lib/tool/shared/tool-component.mjs +0 -9
- package/esm2020/lib/tool/shared/tool.interface.mjs +0 -2
- package/esm2020/lib/tool/shared/tool.service.mjs +0 -43
- package/esm2020/lib/tool/shared/toolbox.mjs +0 -179
- package/esm2020/lib/tool/tool.module.mjs +0 -32
- package/esm2020/lib/tool/toolbox/toolbox.component.mjs +0 -255
- package/esm2020/lib/tool/toolbox/toolbox.module.mjs +0 -36
- package/esm2020/lib/widget/shared/widget.interfaces.mjs +0 -2
- package/esm2020/lib/widget/shared/widget.service.mjs +0 -20
- package/esm2020/lib/widget/widget-outlet/widget-outlet.component.mjs +0 -116
- package/esm2020/lib/widget/widget-outlet/widget-outlet.module.mjs +0 -32
- package/esm2020/lib/widget/widget.module.mjs +0 -32
- package/esm2020/lib/workspace/shared/store.mjs +0 -40
- package/esm2020/lib/workspace/shared/workspace.mjs +0 -117
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.component.mjs +0 -51
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.module.mjs +0 -32
- package/esm2020/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +0 -88
- package/esm2020/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +0 -32
- package/esm2020/lib/workspace/workspace.module.mjs +0 -27
- package/esm2020/public_api.mjs +0 -74
- package/fesm2015/igo2-common.mjs +0 -10329
- package/fesm2015/igo2-common.mjs.map +0 -1
- package/fesm2020/igo2-common.mjs.map +0 -1
- package/style/common.theming.scss +0 -12
- package/style/partial/action.scss +0 -18
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { ReplaySubject } from 'rxjs';
|
|
2
|
+
import { getEntityId } from './entity.utils';
|
|
3
|
+
/**
|
|
4
|
+
* This class is used to track a store's entities state
|
|
5
|
+
*/
|
|
6
|
+
export class EntityStateManager {
|
|
7
|
+
options;
|
|
8
|
+
/**
|
|
9
|
+
* State index
|
|
10
|
+
*/
|
|
11
|
+
index = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* Change emitter
|
|
14
|
+
*/
|
|
15
|
+
change$ = new ReplaySubject(1);
|
|
16
|
+
/**
|
|
17
|
+
* Method to get an entity's id
|
|
18
|
+
*/
|
|
19
|
+
getKey;
|
|
20
|
+
constructor(options = {}) {
|
|
21
|
+
this.options = options;
|
|
22
|
+
this.getKey = options.getKey ? options.getKey : getEntityId;
|
|
23
|
+
this.next();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Clear state
|
|
27
|
+
*/
|
|
28
|
+
clear() {
|
|
29
|
+
if (this.index.size > 0) {
|
|
30
|
+
this.index.clear();
|
|
31
|
+
this.next();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get an entity's state
|
|
36
|
+
* @param entity Entity
|
|
37
|
+
* @returns State
|
|
38
|
+
*/
|
|
39
|
+
get(entity) {
|
|
40
|
+
return (this.index.get(this.getKey(entity)) || {});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Set an entity's state
|
|
44
|
+
* @param entity Entity
|
|
45
|
+
* @param state State
|
|
46
|
+
*/
|
|
47
|
+
set(entity, state) {
|
|
48
|
+
this.setMany([entity], state);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Set many entitie's state
|
|
52
|
+
* @param entitie Entities
|
|
53
|
+
* @param state State
|
|
54
|
+
*/
|
|
55
|
+
setMany(entities, state) {
|
|
56
|
+
entities.forEach((entity) => {
|
|
57
|
+
this.index.set(this.getKey(entity), Object.assign({}, state));
|
|
58
|
+
});
|
|
59
|
+
this.next();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Set state of all entities that already have a state. This is not
|
|
63
|
+
* the same as setting the state of all the store's entities.
|
|
64
|
+
* @param state State
|
|
65
|
+
*/
|
|
66
|
+
setAll(state) {
|
|
67
|
+
Array.from(this.index.keys()).forEach((key) => {
|
|
68
|
+
this.index.set(key, Object.assign({}, state));
|
|
69
|
+
});
|
|
70
|
+
this.next();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Update an entity's state
|
|
74
|
+
* @param entity Entity
|
|
75
|
+
* @param changes State changes
|
|
76
|
+
*/
|
|
77
|
+
update(entity, changes, exclusive = false) {
|
|
78
|
+
this.updateMany([entity], changes, exclusive);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Update many entitie's state
|
|
82
|
+
* @param entitie Entities
|
|
83
|
+
* @param changes State changes
|
|
84
|
+
*/
|
|
85
|
+
updateMany(entities, changes, exclusive = false) {
|
|
86
|
+
if (exclusive === true) {
|
|
87
|
+
return this.updateManyExclusive(entities, changes);
|
|
88
|
+
}
|
|
89
|
+
entities.forEach((entity) => {
|
|
90
|
+
const state = Object.assign({}, this.get(entity), changes);
|
|
91
|
+
this.index.set(this.getKey(entity), state);
|
|
92
|
+
});
|
|
93
|
+
this.next();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Reversee an entity's state
|
|
97
|
+
* @param entity Entity
|
|
98
|
+
* @param keys State keys to reverse
|
|
99
|
+
*/
|
|
100
|
+
reverse(entity, keys) {
|
|
101
|
+
this.reverseMany([entity], keys);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Reverse many entitie's state
|
|
105
|
+
* @param entitie Entities
|
|
106
|
+
* @param keys State keys to reverse
|
|
107
|
+
*/
|
|
108
|
+
reverseMany(entities, keys) {
|
|
109
|
+
entities.forEach((entity) => {
|
|
110
|
+
const currentState = this.get(entity);
|
|
111
|
+
const changes = keys.reduce((acc, key) => {
|
|
112
|
+
acc[key] = currentState[key] || false;
|
|
113
|
+
return acc;
|
|
114
|
+
}, {});
|
|
115
|
+
const reversedChanges = this.reverseChanges(changes);
|
|
116
|
+
const state = Object.assign({}, currentState, reversedChanges);
|
|
117
|
+
this.index.set(this.getKey(entity), state);
|
|
118
|
+
});
|
|
119
|
+
this.next();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Update state of all entities that already have a state. This is not
|
|
123
|
+
* the same as updating the state of all the store's entities.
|
|
124
|
+
* @param changes State
|
|
125
|
+
*/
|
|
126
|
+
updateAll(changes) {
|
|
127
|
+
const allKeys = this.getAllKeys();
|
|
128
|
+
Array.from(allKeys).forEach((key) => {
|
|
129
|
+
const state = Object.assign({}, this.index.get(key), changes);
|
|
130
|
+
this.index.set(key, state);
|
|
131
|
+
});
|
|
132
|
+
this.next();
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* When some state changes are flagged as 'exclusive', reverse
|
|
136
|
+
* the state of all other entities. Changes are reversable when
|
|
137
|
+
* they are boolean.
|
|
138
|
+
* @param entitie Entities
|
|
139
|
+
* @param changes State changes
|
|
140
|
+
*/
|
|
141
|
+
updateManyExclusive(entities, changes) {
|
|
142
|
+
const reverseChanges = this.reverseChanges(changes);
|
|
143
|
+
const keys = entities.map((entity) => this.getKey(entity));
|
|
144
|
+
const allKeys = new Set(keys.concat(Array.from(this.getAllKeys())));
|
|
145
|
+
allKeys.forEach((key) => {
|
|
146
|
+
const state = this.index.get(key) || {};
|
|
147
|
+
if (keys.indexOf(key) >= 0) {
|
|
148
|
+
this.index.set(key, Object.assign({}, state, changes));
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// Update only if the reverse changes would modify
|
|
152
|
+
// a key already present in the current state
|
|
153
|
+
const shouldUpdate = Object.keys(reverseChanges).some((changeKey) => {
|
|
154
|
+
return (state[changeKey] !== undefined &&
|
|
155
|
+
state[changeKey] !== reverseChanges[changeKey]);
|
|
156
|
+
});
|
|
157
|
+
if (shouldUpdate === true) {
|
|
158
|
+
this.index.set(key, Object.assign({}, state, reverseChanges));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
this.next();
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Compute a 'reversed' version of some state changes.
|
|
166
|
+
* Changes are reversable when they are boolean.
|
|
167
|
+
* @param changes State changes
|
|
168
|
+
* @returns Reversed state changes
|
|
169
|
+
*/
|
|
170
|
+
reverseChanges(changes) {
|
|
171
|
+
return Object.entries(changes).reduce((reverseChanges, bunch) => {
|
|
172
|
+
const [changeKey, value] = bunch;
|
|
173
|
+
if (typeof value === typeof true) {
|
|
174
|
+
reverseChanges[changeKey] = !value;
|
|
175
|
+
}
|
|
176
|
+
return reverseChanges;
|
|
177
|
+
}, {});
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Return all the keys in that state and in the store it's bound to, if any.
|
|
181
|
+
* @returns Set of keys
|
|
182
|
+
*/
|
|
183
|
+
getAllKeys() {
|
|
184
|
+
const storeKeys = Array.from(this.options?.index?.keys() ?? []);
|
|
185
|
+
return new Set(Array.from(this.index.keys()).concat(storeKeys));
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Emit 'change' event
|
|
189
|
+
*/
|
|
190
|
+
next() {
|
|
191
|
+
this.change$.next();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2xpYi9lbnRpdHkvc2hhcmVkL3N0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHckMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBTzdDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQW1CVDtJQWZwQjs7T0FFRztJQUNNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBZ0IsQ0FBQztJQUV6Qzs7T0FFRztJQUNNLE9BQU8sR0FBRyxJQUFJLGFBQWEsQ0FBTyxDQUFDLENBQUMsQ0FBQztJQUU5Qzs7T0FFRztJQUNNLE1BQU0sQ0FBbUI7SUFFbEMsWUFBb0IsVUFBd0MsRUFBRTtRQUExQyxZQUFPLEdBQVAsT0FBTyxDQUFtQztRQUM1RCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUU1RCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLE1BQVM7UUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBTSxDQUFDO0lBQzFELENBQUM7SUFFRDs7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QVMsRUFBRSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDakMsSUFBSSxPQUFPLEtBQUssS0FBSyxPQUFPLElBQUksRUFBRTtnQkFDL0IsY0FBeUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQzthQUNoRDtZQUNELE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUMsRUFDRCxFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSyxVQUFVO1FBQ2hCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEUsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxJQUFJO1FBQ1YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEVudGl0eUtleSwgRW50aXR5U3RhdGUgfSBmcm9tICcuL2VudGl0eS5pbnRlcmZhY2VzJztcbmltcG9ydCB7IGdldEVudGl0eUlkIH0gZnJvbSAnLi9lbnRpdHkudXRpbHMnO1xuXG5pbnRlcmZhY2UgRW50aXR5U3RhdGVNYW5hZ2VyT3B0aW9uczxFIGV4dGVuZHMgb2JqZWN0PiB7XG4gIGdldEtleT86IChlbnRpdHk6IG9iamVjdCkgPT4gRW50aXR5S2V5O1xuICBpbmRleD86IE1hcDxFbnRpdHlLZXksIEU+O1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byB0cmFjayBhIHN0b3JlJ3MgZW50aXRpZXMgc3RhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEVudGl0eVN0YXRlTWFuYWdlcjxcbiAgRSBleHRlbmRzIG9iamVjdCxcbiAgUyBleHRlbmRzIEVudGl0eVN0YXRlID0gRW50aXR5U3RhdGVcbj4ge1xuICAvKipcbiAgICogU3RhdGUgaW5kZXhcbiAgICovXG4gIHJlYWRvbmx5IGluZGV4ID0gbmV3IE1hcDxFbnRpdHlLZXksIFM+KCk7XG5cbiAgLyoqXG4gICAqIENoYW5nZSBlbWl0dGVyXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2UkID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBnZXQgYW4gZW50aXR5J3MgaWRcbiAgICovXG4gIHJlYWRvbmx5IGdldEtleTogKEUpID0+IEVudGl0eUtleTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9wdGlvbnM6IEVudGl0eVN0YXRlTWFuYWdlck9wdGlvbnM8RT4gPSB7fSkge1xuICAgIHRoaXMuZ2V0S2V5ID0gb3B0aW9ucy5nZXRLZXkgPyBvcHRpb25zLmdldEtleSA6IGdldEVudGl0eUlkO1xuXG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgc3RhdGVcbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLmluZGV4LnNpemUgPiAwKSB7XG4gICAgICB0aGlzLmluZGV4LmNsZWFyKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGVudGl0eSdzIHN0YXRlXG4gICAqIEBwYXJhbSBlbnRpdHkgRW50aXR5XG4gICAqIEByZXR1cm5zIFN0YXRlXG4gICAqL1xuICBnZXQoZW50aXR5OiBFKTogUyB7XG4gICAgcmV0dXJuICh0aGlzLmluZGV4LmdldCh0aGlzLmdldEtleShlbnRpdHkpKSB8fCB7fSkgYXMgUztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYW4gZW50aXR5J3Mgc3RhdGVcbiAgICogQHBhcmFtIGVudGl0eSBFbnRpdHlcbiAgICogQHBhcmFtIHN0YXRlIFN0YXRlXG4gICAqL1xuICBzZXQoZW50aXR5OiBFLCBzdGF0ZTogUykge1xuICAgIHRoaXMuc2V0TWFueShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtYW55IGVudGl0aWUncyBzdGF0ZVxuICAgKiBAcGFyYW0gZW50aXRpZSBFbnRpdGllc1xuICAgKiBAcGFyYW0gc3RhdGUgU3RhdGVcbiAgICovXG4gIHNldE1hbnkoZW50aXRpZXM6IEVbXSwgc3RhdGU6IFMpIHtcbiAgICBlbnRpdGllcy5mb3JFYWNoKChlbnRpdHk6IEUpID0+IHtcbiAgICAgIHRoaXMuaW5kZXguc2V0KHRoaXMuZ2V0S2V5KGVudGl0eSksIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSk7XG4gICAgfSk7XG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHN0YXRlIG9mIGFsbCBlbnRpdGllcyB0aGF0IGFscmVhZHkgaGF2ZSBhIHN0YXRlLiBUaGlzIGlzIG5vdFxuICAgKiB0aGUgc2FtZSBhcyBzZXR0aW5nIHRoZSBzdGF0ZSBvZiBhbGwgdGhlIHN0b3JlJ3MgZW50aXRpZXMuXG4gICAqIEBwYXJhbSBzdGF0ZSBTdGF0ZVxuICAgKi9cbiAgc2V0QWxsKHN0YXRlOiBTKSB7XG4gICAgQXJyYXkuZnJvbSh0aGlzLmluZGV4LmtleXMoKSkuZm9yRWFjaCgoa2V5OiBFbnRpdHlLZXkpID0+IHtcbiAgICAgIHRoaXMuaW5kZXguc2V0KGtleSwgT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpKTtcbiAgICB9KTtcbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW4gZW50aXR5J3Mgc3RhdGVcbiAgICogQHBhcmFtIGVudGl0eSBFbnRpdHlcbiAgICogQHBhcmFtIGNoYW5nZXMgU3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgdXBkYXRlKGVudGl0eTogRSwgY2hhbmdlczogUGFydGlhbDxTPiwgZXhjbHVzaXZlID0gZmFsc2UpIHtcbiAgICB0aGlzLnVwZGF0ZU1hbnkoW2VudGl0eV0sIGNoYW5nZXMsIGV4Y2x1c2l2ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1hbnkgZW50aXRpZSdzIHN0YXRlXG4gICAqIEBwYXJhbSBlbnRpdGllIEVudGl0aWVzXG4gICAqIEBwYXJhbSBjaGFuZ2VzIFN0YXRlIGNoYW5nZXNcbiAgICovXG4gIHVwZGF0ZU1hbnkoZW50aXRpZXM6IEVbXSwgY2hhbmdlczogUGFydGlhbDxTPiwgZXhjbHVzaXZlID0gZmFsc2UpIHtcbiAgICBpZiAoZXhjbHVzaXZlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVNYW55RXhjbHVzaXZlKGVudGl0aWVzLCBjaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBlbnRpdGllcy5mb3JFYWNoKChlbnRpdHk6IEUpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5nZXQoZW50aXR5KSwgY2hhbmdlcyk7XG4gICAgICB0aGlzLmluZGV4LnNldCh0aGlzLmdldEtleShlbnRpdHkpLCBzdGF0ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV2ZXJzZWUgYW4gZW50aXR5J3Mgc3RhdGVcbiAgICogQHBhcmFtIGVudGl0eSBFbnRpdHlcbiAgICogQHBhcmFtIGtleXMgU3RhdGUga2V5cyB0byByZXZlcnNlXG4gICAqL1xuICByZXZlcnNlKGVudGl0eTogRSwga2V5czogc3RyaW5nW10pIHtcbiAgICB0aGlzLnJldmVyc2VNYW55KFtlbnRpdHldLCBrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnNlIG1hbnkgZW50aXRpZSdzIHN0YXRlXG4gICAqIEBwYXJhbSBlbnRpdGllIEVudGl0aWVzXG4gICAqIEBwYXJhbSBrZXlzIFN0YXRlIGtleXMgdG8gcmV2ZXJzZVxuICAgKi9cbiAgcmV2ZXJzZU1hbnkoZW50aXRpZXM6IEVbXSwga2V5czogc3RyaW5nW10pIHtcbiAgICBlbnRpdGllcy5mb3JFYWNoKChlbnRpdHk6IEUpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuZ2V0KGVudGl0eSk7XG4gICAgICBjb25zdCBjaGFuZ2VzID0ga2V5cy5yZWR1Y2UoXG4gICAgICAgIChhY2M6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGFjY1trZXldID0gY3VycmVudFN0YXRlW2tleV0gfHwgZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgICkgYXMgUGFydGlhbDxTPjtcbiAgICAgIGNvbnN0IHJldmVyc2VkQ2hhbmdlcyA9IHRoaXMucmV2ZXJzZUNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICBjb25zdCBzdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnRTdGF0ZSwgcmV2ZXJzZWRDaGFuZ2VzKTtcbiAgICAgIHRoaXMuaW5kZXguc2V0KHRoaXMuZ2V0S2V5KGVudGl0eSksIHN0YXRlKTtcbiAgICB9KTtcbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgc3RhdGUgb2YgYWxsIGVudGl0aWVzIHRoYXQgYWxyZWFkeSBoYXZlIGEgc3RhdGUuIFRoaXMgaXMgbm90XG4gICAqIHRoZSBzYW1lIGFzIHVwZGF0aW5nIHRoZSBzdGF0ZSBvZiBhbGwgdGhlIHN0b3JlJ3MgZW50aXRpZXMuXG4gICAqIEBwYXJhbSBjaGFuZ2VzIFN0YXRlXG4gICAqL1xuICB1cGRhdGVBbGwoY2hhbmdlczogUGFydGlhbDxTPikge1xuICAgIGNvbnN0IGFsbEtleXMgPSB0aGlzLmdldEFsbEtleXMoKTtcbiAgICBBcnJheS5mcm9tKGFsbEtleXMpLmZvckVhY2goKGtleTogRW50aXR5S2V5KSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuaW5kZXguZ2V0KGtleSksIGNoYW5nZXMpO1xuICAgICAgdGhpcy5pbmRleC5zZXQoa2V5LCBzdGF0ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBzb21lIHN0YXRlIGNoYW5nZXMgYXJlIGZsYWdnZWQgYXMgJ2V4Y2x1c2l2ZScsIHJldmVyc2VcbiAgICogdGhlIHN0YXRlIG9mIGFsbCBvdGhlciBlbnRpdGllcy4gQ2hhbmdlcyBhcmUgcmV2ZXJzYWJsZSB3aGVuXG4gICAqIHRoZXkgYXJlIGJvb2xlYW4uXG4gICAqIEBwYXJhbSBlbnRpdGllIEVudGl0aWVzXG4gICAqIEBwYXJhbSBjaGFuZ2VzIFN0YXRlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlTWFueUV4Y2x1c2l2ZShlbnRpdGllczogRVtdLCBjaGFuZ2VzOiBQYXJ0aWFsPFM+KSB7XG4gICAgY29uc3QgcmV2ZXJzZUNoYW5nZXMgPSB0aGlzLnJldmVyc2VDaGFuZ2VzKGNoYW5nZXMpO1xuXG4gICAgY29uc3Qga2V5cyA9IGVudGl0aWVzLm1hcCgoZW50aXR5OiBFKSA9PiB0aGlzLmdldEtleShlbnRpdHkpKTtcbiAgICBjb25zdCBhbGxLZXlzID0gbmV3IFNldChrZXlzLmNvbmNhdChBcnJheS5mcm9tKHRoaXMuZ2V0QWxsS2V5cygpKSkpO1xuICAgIGFsbEtleXMuZm9yRWFjaCgoa2V5OiBFbnRpdHlLZXkpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5pbmRleC5nZXQoa2V5KSB8fCAoe30gYXMgUyk7XG5cbiAgICAgIGlmIChrZXlzLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICAgIHRoaXMuaW5kZXguc2V0KGtleSwgT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIGNoYW5nZXMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSBvbmx5IGlmIHRoZSByZXZlcnNlIGNoYW5nZXMgd291bGQgbW9kaWZ5XG4gICAgICAgIC8vIGEga2V5IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAgICBjb25zdCBzaG91bGRVcGRhdGUgPSBPYmplY3Qua2V5cyhyZXZlcnNlQ2hhbmdlcykuc29tZShcbiAgICAgICAgICAoY2hhbmdlS2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIHN0YXRlW2NoYW5nZUtleV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICBzdGF0ZVtjaGFuZ2VLZXldICE9PSByZXZlcnNlQ2hhbmdlc1tjaGFuZ2VLZXldXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuaW5kZXguc2V0KGtleSwgT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHJldmVyc2VDaGFuZ2VzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgYSAncmV2ZXJzZWQnIHZlcnNpb24gb2Ygc29tZSBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBDaGFuZ2VzIGFyZSByZXZlcnNhYmxlIHdoZW4gdGhleSBhcmUgYm9vbGVhbi5cbiAgICogQHBhcmFtIGNoYW5nZXMgU3RhdGUgY2hhbmdlc1xuICAgKiBAcmV0dXJucyBSZXZlcnNlZCBzdGF0ZSBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIHJldmVyc2VDaGFuZ2VzKGNoYW5nZXM6IFBhcnRpYWw8Uz4pOiBQYXJ0aWFsPFM+IHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY2hhbmdlcykucmVkdWNlKFxuICAgICAgKHJldmVyc2VDaGFuZ2VzOiBQYXJ0aWFsPFM+LCBidW5jaDogW3N0cmluZywgYW55XSkgPT4ge1xuICAgICAgICBjb25zdCBbY2hhbmdlS2V5LCB2YWx1ZV0gPSBidW5jaDtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gdHlwZW9mIHRydWUpIHtcbiAgICAgICAgICAocmV2ZXJzZUNoYW5nZXMgYXMgb2JqZWN0KVtjaGFuZ2VLZXldID0gIXZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXZlcnNlQ2hhbmdlcztcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFsbCB0aGUga2V5cyBpbiB0aGF0IHN0YXRlIGFuZCBpbiB0aGUgc3RvcmUgaXQncyBib3VuZCB0bywgaWYgYW55LlxuICAgKiBAcmV0dXJucyBTZXQgb2Yga2V5c1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRBbGxLZXlzKCk6IFNldDxFbnRpdHlLZXk+IHtcbiAgICBjb25zdCBzdG9yZUtleXMgPSBBcnJheS5mcm9tKHRoaXMub3B0aW9ucz8uaW5kZXg/LmtleXMoKSA/PyBbXSk7XG4gICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuZnJvbSh0aGlzLmluZGV4LmtleXMoKSkuY29uY2F0KHN0b3JlS2V5cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgJ2NoYW5nZScgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgbmV4dCgpIHtcbiAgICB0aGlzLmNoYW5nZSQubmV4dCgpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { EntityStore } from './store';
|
|
2
|
+
export class EntityStoreWithStrategy extends EntityStore {
|
|
3
|
+
/**
|
|
4
|
+
* Strategies
|
|
5
|
+
*/
|
|
6
|
+
strategies = [];
|
|
7
|
+
constructor(entities, options = {}) {
|
|
8
|
+
super(entities, options);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Add a strategy to this store
|
|
12
|
+
* @param strategy Entity store strategy
|
|
13
|
+
* @returns Entity store
|
|
14
|
+
*/
|
|
15
|
+
addStrategy(strategy, activate = false) {
|
|
16
|
+
const existingStrategy = this.strategies.find((_strategy) => {
|
|
17
|
+
return strategy.constructor === _strategy.constructor;
|
|
18
|
+
});
|
|
19
|
+
if (existingStrategy !== undefined) {
|
|
20
|
+
throw new Error('A strategy of this type already exists on that EntityStore.');
|
|
21
|
+
}
|
|
22
|
+
this.strategies.push(strategy);
|
|
23
|
+
strategy.bindStore(this);
|
|
24
|
+
if (activate === true) {
|
|
25
|
+
strategy.activate();
|
|
26
|
+
}
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Remove a strategy from this store
|
|
31
|
+
* @param strategy Entity store strategy
|
|
32
|
+
* @returns Entity store
|
|
33
|
+
*/
|
|
34
|
+
removeStrategy(strategy) {
|
|
35
|
+
const index = this.strategies.indexOf(strategy);
|
|
36
|
+
if (index >= 0) {
|
|
37
|
+
this.strategies.splice(index, 1);
|
|
38
|
+
strategy.unbindStore(this);
|
|
39
|
+
}
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Return strategies of a given type
|
|
44
|
+
* @param type Entity store strategy class
|
|
45
|
+
* @returns Strategies
|
|
46
|
+
*/
|
|
47
|
+
getStrategyOfType(type) {
|
|
48
|
+
return this.strategies.find((strategy) => {
|
|
49
|
+
return strategy instanceof type;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Activate strategies of a given type
|
|
54
|
+
* @param type Entity store strategy class
|
|
55
|
+
*/
|
|
56
|
+
activateStrategyOfType(type) {
|
|
57
|
+
const strategy = this.getStrategyOfType(type);
|
|
58
|
+
if (strategy !== undefined) {
|
|
59
|
+
strategy.activate();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Deactivate strategies of a given type
|
|
64
|
+
* @param type Entity store strategy class
|
|
65
|
+
*/
|
|
66
|
+
deactivateStrategyOfType(type) {
|
|
67
|
+
const strategy = this.getStrategyOfType(type);
|
|
68
|
+
if (strategy !== undefined) {
|
|
69
|
+
strategy.deactivate();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2xpYi9lbnRpdHkvc2hhcmVkL3N0b3JlLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQXNCLE1BQU0sU0FBUyxDQUFDO0FBRTFELE1BQU0sT0FBTyx1QkFHWCxTQUFRLFdBQWlCO0lBQ3pCOztPQUVHO0lBQ0ssVUFBVSxHQUEwQixFQUFFLENBQUM7SUFFL0MsWUFBWSxRQUFhLEVBQUUsVUFBOEIsRUFBRTtRQUN6RCxLQUFLLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUNULFFBQTZCLEVBQzdCLFdBQW9CLEtBQUs7UUFFekIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDM0MsQ0FBQyxTQUE4QixFQUFFLEVBQUU7WUFDakMsT0FBTyxRQUFRLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDeEQsQ0FBQyxDQUNGLENBQUM7UUFDRixJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtZQUNsQyxNQUFNLElBQUksS0FBSyxDQUNiLDZEQUE2RCxDQUM5RCxDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpCLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtZQUNyQixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDckI7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLFFBQTZCO1FBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLElBQWdDO1FBQ2hELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUE2QixFQUFFLEVBQUU7WUFDNUQsT0FBTyxRQUFRLFlBQVksSUFBSSxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILHNCQUFzQixDQUFDLElBQWdDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDMUIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUF3QixDQUFDLElBQWdDO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDMUIsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5U3RhdGUgfSBmcm9tICcuL2VudGl0eS5pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgRW50aXR5U3RvcmVTdHJhdGVneSB9IGZyb20gJy4vc3RyYXRlZ2llcy9zdHJhdGVneSc7XHJcbmltcG9ydCB7IEVudGl0eVN0b3JlLCBFbnRpdHlTdG9yZU9wdGlvbnMgfSBmcm9tICcuL3N0b3JlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBFbnRpdHlTdG9yZVdpdGhTdHJhdGVneTxcclxuICBFIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0LFxyXG4gIFMgZXh0ZW5kcyBFbnRpdHlTdGF0ZSA9IEVudGl0eVN0YXRlXHJcbj4gZXh0ZW5kcyBFbnRpdHlTdG9yZTxFLCBTPiB7XHJcbiAgLyoqXHJcbiAgICogU3RyYXRlZ2llc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RyYXRlZ2llczogRW50aXR5U3RvcmVTdHJhdGVneVtdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVudGl0aWVzOiBFW10sIG9wdGlvbnM6IEVudGl0eVN0b3JlT3B0aW9ucyA9IHt9KSB7XHJcbiAgICBzdXBlcihlbnRpdGllcywgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgYSBzdHJhdGVneSB0byB0aGlzIHN0b3JlXHJcbiAgICogQHBhcmFtIHN0cmF0ZWd5IEVudGl0eSBzdG9yZSBzdHJhdGVneVxyXG4gICAqIEByZXR1cm5zIEVudGl0eSBzdG9yZVxyXG4gICAqL1xyXG4gIGFkZFN0cmF0ZWd5KFxyXG4gICAgc3RyYXRlZ3k6IEVudGl0eVN0b3JlU3RyYXRlZ3ksXHJcbiAgICBhY3RpdmF0ZTogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKTogRW50aXR5U3RvcmUge1xyXG4gICAgY29uc3QgZXhpc3RpbmdTdHJhdGVneSA9IHRoaXMuc3RyYXRlZ2llcy5maW5kKFxyXG4gICAgICAoX3N0cmF0ZWd5OiBFbnRpdHlTdG9yZVN0cmF0ZWd5KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LmNvbnN0cnVjdG9yID09PSBfc3RyYXRlZ3kuY29uc3RydWN0b3I7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBpZiAoZXhpc3RpbmdTdHJhdGVneSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnQSBzdHJhdGVneSBvZiB0aGlzIHR5cGUgYWxyZWFkeSBleGlzdHMgb24gdGhhdCBFbnRpdHlTdG9yZS4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdHJhdGVnaWVzLnB1c2goc3RyYXRlZ3kpO1xyXG4gICAgc3RyYXRlZ3kuYmluZFN0b3JlKHRoaXMpO1xyXG5cclxuICAgIGlmIChhY3RpdmF0ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICBzdHJhdGVneS5hY3RpdmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGEgc3RyYXRlZ3kgZnJvbSB0aGlzIHN0b3JlXHJcbiAgICogQHBhcmFtIHN0cmF0ZWd5IEVudGl0eSBzdG9yZSBzdHJhdGVneVxyXG4gICAqIEByZXR1cm5zIEVudGl0eSBzdG9yZVxyXG4gICAqL1xyXG4gIHJlbW92ZVN0cmF0ZWd5KHN0cmF0ZWd5OiBFbnRpdHlTdG9yZVN0cmF0ZWd5KTogRW50aXR5U3RvcmUge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnN0cmF0ZWdpZXMuaW5kZXhPZihzdHJhdGVneSk7XHJcbiAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICB0aGlzLnN0cmF0ZWdpZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgc3RyYXRlZ3kudW5iaW5kU3RvcmUodGhpcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBzdHJhdGVnaWVzIG9mIGEgZ2l2ZW4gdHlwZVxyXG4gICAqIEBwYXJhbSB0eXBlIEVudGl0eSBzdG9yZSBzdHJhdGVneSBjbGFzc1xyXG4gICAqIEByZXR1cm5zIFN0cmF0ZWdpZXNcclxuICAgKi9cclxuICBnZXRTdHJhdGVneU9mVHlwZSh0eXBlOiB0eXBlb2YgRW50aXR5U3RvcmVTdHJhdGVneSk6IEVudGl0eVN0b3JlU3RyYXRlZ3kge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RyYXRlZ2llcy5maW5kKChzdHJhdGVneTogRW50aXR5U3RvcmVTdHJhdGVneSkgPT4ge1xyXG4gICAgICByZXR1cm4gc3RyYXRlZ3kgaW5zdGFuY2VvZiB0eXBlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBY3RpdmF0ZSBzdHJhdGVnaWVzIG9mIGEgZ2l2ZW4gdHlwZVxyXG4gICAqIEBwYXJhbSB0eXBlIEVudGl0eSBzdG9yZSBzdHJhdGVneSBjbGFzc1xyXG4gICAqL1xyXG4gIGFjdGl2YXRlU3RyYXRlZ3lPZlR5cGUodHlwZTogdHlwZW9mIEVudGl0eVN0b3JlU3RyYXRlZ3kpIHtcclxuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5nZXRTdHJhdGVneU9mVHlwZSh0eXBlKTtcclxuICAgIGlmIChzdHJhdGVneSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHN0cmF0ZWd5LmFjdGl2YXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWFjdGl2YXRlIHN0cmF0ZWdpZXMgb2YgYSBnaXZlbiB0eXBlXHJcbiAgICogQHBhcmFtIHR5cGUgRW50aXR5IHN0b3JlIHN0cmF0ZWd5IGNsYXNzXHJcbiAgICovXHJcbiAgZGVhY3RpdmF0ZVN0cmF0ZWd5T2ZUeXBlKHR5cGU6IHR5cGVvZiBFbnRpdHlTdG9yZVN0cmF0ZWd5KSB7XHJcbiAgICBjb25zdCBzdHJhdGVneSA9IHRoaXMuZ2V0U3RyYXRlZ3lPZlR5cGUodHlwZSk7XHJcbiAgICBpZiAoc3RyYXRlZ3kgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBzdHJhdGVneS5kZWFjdGl2YXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { BehaviorSubject } from 'rxjs';
|
|
2
|
+
import { EntityStateManager } from './state';
|
|
3
|
+
import { EntityView } from './view';
|
|
4
|
+
import { getEntityId, getEntityProperty } from './entity.utils';
|
|
5
|
+
/**
|
|
6
|
+
* An entity store class holds any number of entities
|
|
7
|
+
* as well as their state. It can be observed, filtered and sorted and
|
|
8
|
+
* provides methods to insert, update or delete entities.
|
|
9
|
+
*/
|
|
10
|
+
export class EntityStore {
|
|
11
|
+
/**
|
|
12
|
+
* Observable of the raw entities
|
|
13
|
+
*/
|
|
14
|
+
entities$ = new BehaviorSubject([]);
|
|
15
|
+
/**
|
|
16
|
+
* Number of entities
|
|
17
|
+
*/
|
|
18
|
+
count$ = new BehaviorSubject(0);
|
|
19
|
+
get count() {
|
|
20
|
+
return this.count$.value;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Whether the store is empty
|
|
24
|
+
*/
|
|
25
|
+
empty$ = new BehaviorSubject(true);
|
|
26
|
+
get empty() {
|
|
27
|
+
return this.empty$.value;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Entity store state
|
|
31
|
+
*/
|
|
32
|
+
state;
|
|
33
|
+
/**
|
|
34
|
+
* View of all the entities
|
|
35
|
+
*/
|
|
36
|
+
view;
|
|
37
|
+
/**
|
|
38
|
+
* View of all the entities and their state
|
|
39
|
+
*/
|
|
40
|
+
stateView;
|
|
41
|
+
/**
|
|
42
|
+
* Method to get an entity's id
|
|
43
|
+
*/
|
|
44
|
+
getKey;
|
|
45
|
+
/**
|
|
46
|
+
* Method to get an entity's named property
|
|
47
|
+
*/
|
|
48
|
+
getProperty;
|
|
49
|
+
/**
|
|
50
|
+
* Store index
|
|
51
|
+
*/
|
|
52
|
+
get index() {
|
|
53
|
+
return this._index;
|
|
54
|
+
}
|
|
55
|
+
_index;
|
|
56
|
+
/**
|
|
57
|
+
* Store index
|
|
58
|
+
*/
|
|
59
|
+
get pristine() {
|
|
60
|
+
return this._pristine;
|
|
61
|
+
}
|
|
62
|
+
_pristine = true;
|
|
63
|
+
constructor(entities, options = {}) {
|
|
64
|
+
this.getKey = options.getKey ? options.getKey : getEntityId;
|
|
65
|
+
this.getProperty = options.getProperty
|
|
66
|
+
? options.getProperty
|
|
67
|
+
: getEntityProperty;
|
|
68
|
+
this.state = this.createStateManager();
|
|
69
|
+
this.view = this.createDataView();
|
|
70
|
+
this.stateView = this.createStateView();
|
|
71
|
+
this.view.lift();
|
|
72
|
+
this.stateView.lift();
|
|
73
|
+
if (entities.length > 0) {
|
|
74
|
+
this.load(entities);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this._index = this.generateIndex(entities);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get an entity from the store by key
|
|
82
|
+
* @param key Key
|
|
83
|
+
* @returns Entity
|
|
84
|
+
*/
|
|
85
|
+
get(key) {
|
|
86
|
+
return this.index.get(key);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get all entities in the store
|
|
90
|
+
* @returns Array of entities
|
|
91
|
+
*/
|
|
92
|
+
all() {
|
|
93
|
+
return this.entities$.value;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Set this store's entities
|
|
97
|
+
* @param entities Entities
|
|
98
|
+
*/
|
|
99
|
+
load(entities, pristine = true) {
|
|
100
|
+
this._index = this.generateIndex(entities);
|
|
101
|
+
this._pristine = pristine;
|
|
102
|
+
this.next();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Clear the store's entities but keep the state and views intact.
|
|
106
|
+
* Views won't return any data but future data will be subject to the
|
|
107
|
+
* current views filter and sort
|
|
108
|
+
*/
|
|
109
|
+
softClear() {
|
|
110
|
+
if (this.index && this.index.size > 0) {
|
|
111
|
+
this.index.clear();
|
|
112
|
+
this._pristine = true;
|
|
113
|
+
this.next();
|
|
114
|
+
}
|
|
115
|
+
else if (this.index) {
|
|
116
|
+
this.updateCount();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Clear the store's entities, state and views
|
|
121
|
+
*/
|
|
122
|
+
clear() {
|
|
123
|
+
this.stateView.clear();
|
|
124
|
+
this.view.clear();
|
|
125
|
+
this.state.clear();
|
|
126
|
+
this.softClear();
|
|
127
|
+
}
|
|
128
|
+
destroy() {
|
|
129
|
+
this.stateView.destroy();
|
|
130
|
+
this.view.destroy();
|
|
131
|
+
this.clear();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Insert an entity into the store
|
|
135
|
+
* @param entity Entity
|
|
136
|
+
*/
|
|
137
|
+
insert(entity) {
|
|
138
|
+
this.insertMany([entity]);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Insert many entities into the store
|
|
142
|
+
* @param entities Entities
|
|
143
|
+
*/
|
|
144
|
+
insertMany(entities) {
|
|
145
|
+
entities.forEach((entity) => this.index.set(this.getKey(entity), entity));
|
|
146
|
+
this._pristine = false;
|
|
147
|
+
this.next();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Update or insert an entity into the store
|
|
151
|
+
* @param entity Entity
|
|
152
|
+
*/
|
|
153
|
+
update(entity) {
|
|
154
|
+
this.updateMany([entity]);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Update or insert many entities into the store
|
|
158
|
+
* @param entities Entities
|
|
159
|
+
*/
|
|
160
|
+
updateMany(entities) {
|
|
161
|
+
entities.forEach((entity) => this.index.set(this.getKey(entity), entity));
|
|
162
|
+
this._pristine = false;
|
|
163
|
+
this.next();
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Delete an entity from the store
|
|
167
|
+
* @param entity Entity
|
|
168
|
+
*/
|
|
169
|
+
delete(entity) {
|
|
170
|
+
this.deleteMany([entity]);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Delete many entities from the store
|
|
174
|
+
* @param entities Entities
|
|
175
|
+
*/
|
|
176
|
+
deleteMany(entities) {
|
|
177
|
+
entities.forEach((entity) => this.index.delete(this.getKey(entity)));
|
|
178
|
+
this._pristine = false;
|
|
179
|
+
this.next();
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Generate a complete index of all the entities
|
|
183
|
+
* @param entities Entities
|
|
184
|
+
* @returns Index
|
|
185
|
+
*/
|
|
186
|
+
generateIndex(entities) {
|
|
187
|
+
const entries = entities.map((entity) => [this.getKey(entity), entity]);
|
|
188
|
+
return new Map(entries);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Push the index's entities into the entities$ observable
|
|
192
|
+
*/
|
|
193
|
+
next() {
|
|
194
|
+
this.entities$.next(Array.from(this.index.values()));
|
|
195
|
+
this.updateCount();
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Update the store's count and empty
|
|
199
|
+
*/
|
|
200
|
+
updateCount() {
|
|
201
|
+
const count = this.index.size;
|
|
202
|
+
const empty = count === 0;
|
|
203
|
+
this.count$.next(count);
|
|
204
|
+
this.empty$.next(empty);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Create the entity state manager
|
|
208
|
+
* @returns EntityStateManager
|
|
209
|
+
*/
|
|
210
|
+
createStateManager() {
|
|
211
|
+
return new EntityStateManager({
|
|
212
|
+
getKey: this.getKey,
|
|
213
|
+
index: this.index
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Create the data view
|
|
218
|
+
* @returns EntityView<E>
|
|
219
|
+
*/
|
|
220
|
+
createDataView() {
|
|
221
|
+
return new EntityView(this.entities$);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Create the state view
|
|
225
|
+
* @returns EntityView<EntityRecord<E>>
|
|
226
|
+
*/
|
|
227
|
+
createStateView() {
|
|
228
|
+
return new EntityView(this.view.all$())
|
|
229
|
+
.join({
|
|
230
|
+
source: this.state.change$,
|
|
231
|
+
reduce: (entity) => {
|
|
232
|
+
const key = this.getKey(entity);
|
|
233
|
+
const state = this.state.get(entity);
|
|
234
|
+
const currentRecord = this.stateView.get(key);
|
|
235
|
+
if (currentRecord !== undefined &&
|
|
236
|
+
currentRecord.entity === entity &&
|
|
237
|
+
this.statesAreTheSame(currentRecord.state, state)) {
|
|
238
|
+
return currentRecord;
|
|
239
|
+
}
|
|
240
|
+
const revision = currentRecord ? currentRecord.revision + 1 : 1;
|
|
241
|
+
const ref = `${key}-${revision}`;
|
|
242
|
+
return { entity, state, revision, ref };
|
|
243
|
+
}
|
|
244
|
+
})
|
|
245
|
+
.createIndex((record) => this.getKey(record.entity));
|
|
246
|
+
}
|
|
247
|
+
statesAreTheSame(currentState, newState) {
|
|
248
|
+
if (currentState === newState) {
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
const currentStateIsEmpty = Object.keys(currentState).length === 0;
|
|
252
|
+
const newStateIsEmpty = Object.keys(newState).length === 0;
|
|
253
|
+
return currentStateIsEmpty && newStateIsEmpty;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2xpYi9lbnRpdHkvc2hhcmVkL3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT2hFOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUl0Qjs7T0FFRztJQUNNLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQztJQUVsRDs7T0FFRztJQUNNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztJQUNqRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUNyRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNNLEtBQUssQ0FBMkI7SUFFekM7O09BRUc7SUFDTSxJQUFJLENBQWdCO0lBRTdCOztPQUVHO0lBQ00sU0FBUyxDQUFvQztJQUV0RDs7T0FFRztJQUNNLE1BQU0sQ0FBbUI7SUFFbEM7O09BRUc7SUFDTSxXQUFXLENBQTJCO0lBRS9DOztPQUVHO0lBQ0gsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDTyxNQUFNLENBQW9CO0lBRWxDOztPQUVH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TUFBTSxLQUFLLENBQUMsQ0FBQztRQUNuRSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7UUFDM0QsT0FBTyxtQkFBbUIsSUFBSSxlQUFlLENBQUM7SUFDaEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBFbnRpdHlTdGF0ZU1hbmFnZXIgfSBmcm9tICcuL3N0YXRlJztcclxuaW1wb3J0IHsgRW50aXR5VmlldyB9IGZyb20gJy4vdmlldyc7XHJcbmltcG9ydCB7IEVudGl0eUtleSwgRW50aXR5U3RhdGUsIEVudGl0eVJlY29yZCB9IGZyb20gJy4vZW50aXR5LmludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBnZXRFbnRpdHlJZCwgZ2V0RW50aXR5UHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS51dGlscyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVN0b3JlT3B0aW9ucyB7XHJcbiAgZ2V0S2V5PzogKGVudGl0eTogb2JqZWN0KSA9PiBFbnRpdHlLZXk7XHJcbiAgZ2V0UHJvcGVydHk/OiAoZW50aXR5OiBvYmplY3QsIHByb3BlcnR5OiBzdHJpbmcpID0+IGFueTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFuIGVudGl0eSBzdG9yZSBjbGFzcyBob2xkcyBhbnkgbnVtYmVyIG9mIGVudGl0aWVzXHJcbiAqIGFzIHdlbGwgYXMgdGhlaXIgc3RhdGUuIEl0IGNhbiBiZSBvYnNlcnZlZCwgZmlsdGVyZWQgYW5kIHNvcnRlZCBhbmRcclxuICogcHJvdmlkZXMgbWV0aG9kcyB0byBpbnNlcnQsIHVwZGF0ZSBvciBkZWxldGUgZW50aXRpZXMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRW50aXR5U3RvcmU8XHJcbiAgRSBleHRlbmRzIG9iamVjdCA9IG9iamVjdCxcclxuICBTIGV4dGVuZHMgRW50aXR5U3RhdGUgPSBFbnRpdHlTdGF0ZVxyXG4+IHtcclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIG9mIHRoZSByYXcgZW50aXRpZXNcclxuICAgKi9cclxuICByZWFkb25seSBlbnRpdGllcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVbXT4oW10pO1xyXG5cclxuICAvKipcclxuICAgKiBOdW1iZXIgb2YgZW50aXRpZXNcclxuICAgKi9cclxuICByZWFkb25seSBjb3VudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XHJcbiAgZ2V0IGNvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jb3VudCQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSBzdG9yZSBpcyBlbXB0eVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGVtcHR5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZW1wdHkkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW50aXR5IHN0b3JlIHN0YXRlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgc3RhdGU6IEVudGl0eVN0YXRlTWFuYWdlcjxFLCBTPjtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlldyBvZiBhbGwgdGhlIGVudGl0aWVzXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgdmlldzogRW50aXR5VmlldzxFPjtcclxuXHJcbiAgLyoqXHJcbiAgICogVmlldyBvZiBhbGwgdGhlIGVudGl0aWVzIGFuZCB0aGVpciBzdGF0ZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHN0YXRlVmlldzogRW50aXR5VmlldzxFLCBFbnRpdHlSZWNvcmQ8RSwgUz4+O1xyXG5cclxuICAvKipcclxuICAgKiBNZXRob2QgdG8gZ2V0IGFuIGVudGl0eSdzIGlkXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgZ2V0S2V5OiAoRSkgPT4gRW50aXR5S2V5O1xyXG5cclxuICAvKipcclxuICAgKiBNZXRob2QgdG8gZ2V0IGFuIGVudGl0eSdzIG5hbWVkIHByb3BlcnR5XHJcbiAgICovXHJcbiAgcmVhZG9ubHkgZ2V0UHJvcGVydHk6IChFLCBwcm9wOiBzdHJpbmcpID0+IGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogU3RvcmUgaW5kZXhcclxuICAgKi9cclxuICBnZXQgaW5kZXgoKTogTWFwPEVudGl0eUtleSwgRT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xyXG4gIH1cclxuICBwcml2YXRlIF9pbmRleDogTWFwPEVudGl0eUtleSwgRT47XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlIGluZGV4XHJcbiAgICovXHJcbiAgZ2V0IHByaXN0aW5lKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByaXN0aW5lO1xyXG4gIH1cclxuICBwcml2YXRlIF9wcmlzdGluZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVudGl0aWVzOiBFW10sIG9wdGlvbnM6IEVudGl0eVN0b3JlT3B0aW9ucyA9IHt9KSB7XHJcbiAgICB0aGlzLmdldEtleSA9IG9wdGlvbnMuZ2V0S2V5ID8gb3B0aW9ucy5nZXRLZXkgOiBnZXRFbnRpdHlJZDtcclxuICAgIHRoaXMuZ2V0UHJvcGVydHkgPSBvcHRpb25zLmdldFByb3BlcnR5XHJcbiAgICAgID8gb3B0aW9ucy5nZXRQcm9wZXJ0eVxyXG4gICAgICA6IGdldEVudGl0eVByb3BlcnR5O1xyXG5cclxuICAgIHRoaXMuc3RhdGUgPSB0aGlzLmNyZWF0ZVN0YXRlTWFuYWdlcigpO1xyXG4gICAgdGhpcy52aWV3ID0gdGhpcy5jcmVhdGVEYXRhVmlldygpO1xyXG4gICAgdGhpcy5zdGF0ZVZpZXcgPSB0aGlzLmNyZWF0ZVN0YXRlVmlldygpO1xyXG5cclxuICAgIHRoaXMudmlldy5saWZ0KCk7XHJcbiAgICB0aGlzLnN0YXRlVmlldy5saWZ0KCk7XHJcblxyXG4gICAgaWYgKGVudGl0aWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5sb2FkKGVudGl0aWVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2luZGV4ID0gdGhpcy5nZW5lcmF0ZUluZGV4KGVudGl0aWVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbiBlbnRpdHkgZnJvbSB0aGUgc3RvcmUgYnkga2V5XHJcbiAgICogQHBhcmFtIGtleSBLZXlcclxuICAgKiBAcmV0dXJucyBFbnRpdHlcclxuICAgKi9cclxuICBnZXQoa2V5OiBFbnRpdHlLZXkpOiBFIHtcclxuICAgIHJldHVybiB0aGlzLmluZGV4LmdldChrZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBlbnRpdGllcyBpbiB0aGUgc3RvcmVcclxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBlbnRpdGllc1xyXG4gICAqL1xyXG4gIGFsbCgpOiBFW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZW50aXRpZXMkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoaXMgc3RvcmUncyBlbnRpdGllc1xyXG4gICAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllc1xyXG4gICAqL1xyXG4gIGxvYWQoZW50aXRpZXM6IEVbXSwgcHJpc3RpbmU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLl9pbmRleCA9IHRoaXMuZ2VuZXJhdGVJbmRleChlbnRpdGllcyk7XHJcbiAgICB0aGlzLl9wcmlzdGluZSA9IHByaXN0aW5lO1xyXG4gICAgdGhpcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgc3RvcmUncyBlbnRpdGllcyBidXQga2VlcCB0aGUgc3RhdGUgYW5kIHZpZXdzIGludGFjdC5cclxuICAgKiBWaWV3cyB3b24ndCByZXR1cm4gYW55IGRhdGEgYnV0IGZ1dHVyZSBkYXRhIHdpbGwgYmUgc3ViamVjdCB0byB0aGVcclxuICAgKiBjdXJyZW50IHZpZXdzIGZpbHRlciBhbmQgc29ydFxyXG4gICAqL1xyXG4gIHNvZnRDbGVhcigpIHtcclxuICAgIGlmICh0aGlzLmluZGV4ICYmIHRoaXMuaW5kZXguc2l6ZSA+IDApIHtcclxuICAgICAgdGhpcy5pbmRleC5jbGVhcigpO1xyXG4gICAgICB0aGlzLl9wcmlzdGluZSA9IHRydWU7XHJcbiAgICAgIHRoaXMubmV4dCgpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmluZGV4KSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ291bnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBzdG9yZSdzIGVudGl0aWVzLCBzdGF0ZSBhbmQgdmlld3NcclxuICAgKi9cclxuICBjbGVhcigpIHtcclxuICAgIHRoaXMuc3RhdGVWaWV3LmNsZWFyKCk7XHJcbiAgICB0aGlzLnZpZXcuY2xlYXIoKTtcclxuICAgIHRoaXMuc3RhdGUuY2xlYXIoKTtcclxuICAgIHRoaXMuc29mdENsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95KCkge1xyXG4gICAgdGhpcy5zdGF0ZVZpZXcuZGVzdHJveSgpO1xyXG4gICAgdGhpcy52aWV3LmRlc3Ryb3koKTtcclxuICAgIHRoaXMuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydCBhbiBlbnRpdHkgaW50byB0aGUgc3RvcmVcclxuICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eVxyXG4gICAqL1xyXG4gIGluc2VydChlbnRpdHk6IEUpIHtcclxuICAgIHRoaXMuaW5zZXJ0TWFueShbZW50aXR5XSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnNlcnQgbWFueSBlbnRpdGllcyBpbnRvIHRoZSBzdG9yZVxyXG4gICAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllc1xyXG4gICAqL1xyXG4gIGluc2VydE1hbnkoZW50aXRpZXM6IEVbXSkge1xyXG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5OiBFKSA9PlxyXG4gICAgICB0aGlzLmluZGV4LnNldCh0aGlzLmdldEtleShlbnRpdHkpLCBlbnRpdHkpXHJcbiAgICApO1xyXG4gICAgdGhpcy5fcHJpc3RpbmUgPSBmYWxzZTtcclxuICAgIHRoaXMubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIG9yIGluc2VydCBhbiBlbnRpdHkgaW50byB0aGUgc3RvcmVcclxuICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eVxyXG4gICAqL1xyXG4gIHVwZGF0ZShlbnRpdHk6IEUpIHtcclxuICAgIHRoaXMudXBkYXRlTWFueShbZW50aXR5XSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgb3IgaW5zZXJ0IG1hbnkgZW50aXRpZXMgaW50byB0aGUgc3RvcmVcclxuICAgKiBAcGFyYW0gZW50aXRpZXMgRW50aXRpZXNcclxuICAgKi9cclxuICB1cGRhdGVNYW55KGVudGl0aWVzOiBFW10pIHtcclxuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eTogRSkgPT5cclxuICAgICAgdGhpcy5pbmRleC5zZXQodGhpcy5nZXRLZXkoZW50aXR5KSwgZW50aXR5KVxyXG4gICAgKTtcclxuICAgIHRoaXMuX3ByaXN0aW5lID0gZmFsc2U7XHJcbiAgICB0aGlzLm5leHQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhbiBlbnRpdHkgZnJvbSB0aGUgc3RvcmVcclxuICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eVxyXG4gICAqL1xyXG4gIGRlbGV0ZShlbnRpdHk6IEUpIHtcclxuICAgIHRoaXMuZGVsZXRlTWFueShbZW50aXR5XSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgbWFueSBlbnRpdGllcyBmcm9tIHRoZSBzdG9yZVxyXG4gICAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllc1xyXG4gICAqL1xyXG4gIGRlbGV0ZU1hbnkoZW50aXRpZXM6IEVbXSkge1xyXG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5OiBFKSA9PiB0aGlzLmluZGV4LmRlbGV0ZSh0aGlzLmdldEtleShlbnRpdHkpKSk7XHJcbiAgICB0aGlzLl9wcmlzdGluZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIGNvbXBsZXRlIGluZGV4IG9mIGFsbCB0aGUgZW50aXRpZXNcclxuICAgKiBAcGFyYW0gZW50aXRpZXMgRW50aXRpZXNcclxuICAgKiBAcmV0dXJucyBJbmRleFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVJbmRleChlbnRpdGllczogRVtdKTogTWFwPEVudGl0eUtleSwgRT4ge1xyXG4gICAgY29uc3QgZW50cmllcyA9IGVudGl0aWVzLm1hcCgoZW50aXR5OiBFKSA9PiBbdGhpcy5nZXRLZXkoZW50aXR5KSwgZW50aXR5XSk7XHJcbiAgICByZXR1cm4gbmV3IE1hcChlbnRyaWVzIGFzIFtFbnRpdHlLZXksIEVdW10pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHVzaCB0aGUgaW5kZXgncyBlbnRpdGllcyBpbnRvIHRoZSBlbnRpdGllcyQgb2JzZXJ2YWJsZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbmV4dCgpIHtcclxuICAgIHRoaXMuZW50aXRpZXMkLm5leHQoQXJyYXkuZnJvbSh0aGlzLmluZGV4LnZhbHVlcygpKSk7XHJcbiAgICB0aGlzLnVwZGF0ZUNvdW50KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIHN0b3JlJ3MgY291bnQgYW5kIGVtcHR5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb3VudCgpIHtcclxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5pbmRleC5zaXplO1xyXG4gICAgY29uc3QgZW1wdHkgPSBjb3VudCA9PT0gMDtcclxuICAgIHRoaXMuY291bnQkLm5leHQoY291bnQpO1xyXG4gICAgdGhpcy5lbXB0eSQubmV4dChlbXB0eSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgdGhlIGVudGl0eSBzdGF0ZSBtYW5hZ2VyXHJcbiAgICogQHJldHVybnMgRW50aXR5U3RhdGVNYW5hZ2VyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVTdGF0ZU1hbmFnZXIoKSB7XHJcbiAgICByZXR1cm4gbmV3IEVudGl0eVN0YXRlTWFuYWdlcjxFLCBTPih7XHJcbiAgICAgIGdldEtleTogdGhpcy5nZXRLZXksXHJcbiAgICAgIGluZGV4OiB0aGlzLmluZGV4XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0aGUgZGF0YSB2aWV3XHJcbiAgICogQHJldHVybnMgRW50aXR5VmlldzxFPlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlRGF0YVZpZXcoKSB7XHJcbiAgICByZXR1cm4gbmV3IEVudGl0eVZpZXc8RT4odGhpcy5lbnRpdGllcyQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRoZSBzdGF0ZSB2aWV3XHJcbiAgICogQHJldHVybnMgRW50aXR5VmlldzxFbnRpdHlSZWNvcmQ8RT4+XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVTdGF0ZVZpZXcoKSB7XHJcbiAgICByZXR1cm4gbmV3IEVudGl0eVZpZXc8RSwgRW50aXR5UmVjb3JkPEUsIFM+Pih0aGlzLnZpZXcuYWxsJCgpKVxyXG4gICAgICAuam9pbih7XHJcbiAgICAgICAgc291cmNlOiB0aGlzLnN0YXRlLmNoYW5nZSQsXHJcbiAgICAgICAgcmVkdWNlOiAoZW50aXR5OiBFKTogRW50aXR5UmVjb3JkPEUsIFM+ID0+IHtcclxuICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KGVudGl0eSk7XHJcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUuZ2V0KGVudGl0eSk7XHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gdGhpcy5zdGF0ZVZpZXcuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjdXJyZW50UmVjb3JkICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgY3VycmVudFJlY29yZC5lbnRpdHkgPT09IGVudGl0eSAmJlxyXG4gICAgICAgICAgICB0aGlzLnN0YXRlc0FyZVRoZVNhbWUoY3VycmVudFJlY29yZC5zdGF0ZSwgc3RhdGUpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSZWNvcmQ7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgcmV2aXNpb24gPSBjdXJyZW50UmVjb3JkID8gY3VycmVudFJlY29yZC5yZXZpc2lvbiArIDEgOiAxO1xyXG4gICAgICAgICAgY29uc3QgcmVmID0gYCR7a2V5fS0ke3JldmlzaW9ufWA7XHJcbiAgICAgICAgICByZXR1cm4geyBlbnRpdHksIHN0YXRlLCByZXZpc2lvbiwgcmVmIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY3JlYXRlSW5kZXgoKHJlY29yZDogRW50aXR5UmVjb3JkPEUsIFM+KSA9PiB0aGlzLmdldEtleShyZWNvcmQuZW50aXR5KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRlc0FyZVRoZVNhbWUoY3VycmVudFN0YXRlOiBTLCBuZXdTdGF0ZTogUyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gbmV3U3RhdGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY3VycmVudFN0YXRlSXNFbXB0eSA9IE9iamVjdC5rZXlzKGN1cnJlbnRTdGF0ZSkubGVuZ3RoID09PSAwO1xyXG4gICAgY29uc3QgbmV3U3RhdGVJc0VtcHR5ID0gT2JqZWN0LmtleXMobmV3U3RhdGUpLmxlbmd0aCA9PT0gMDtcclxuICAgIHJldHVybiBjdXJyZW50U3RhdGVJc0VtcHR5ICYmIG5ld1N0YXRlSXNFbXB0eTtcclxuICB9XHJcbn1cclxuIl19
|