@ardium-ui/ui 4.4.1 → 5.0.0-alpha.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/fesm2022/ardium-ui-ui.mjs +2525 -2413
- package/fesm2022/ardium-ui-ui.mjs.map +1 -1
- package/lib/_internal/boolean-component.d.ts +1 -1
- package/lib/_internal/disablable-component.d.ts +1 -1
- package/lib/_internal/focusable-component.d.ts +1 -1
- package/lib/_internal/form-field-component.d.ts +1 -1
- package/lib/_internal/ngmodel-component.d.ts +2 -2
- package/lib/_internal/selectable-list-component.d.ts +1 -1
- package/lib/_internal/utils/date.utils.d.ts +3 -0
- package/lib/buttons/_button-base.d.ts +1 -1
- package/lib/calendar/calendar.component.d.ts +8 -2
- package/lib/file-inputs/file-input-base.d.ts +7 -3
- package/lib/form-field/form-field-base.d.ts +1 -1
- package/lib/inputs/_simple-input-base.d.ts +3 -3
- package/lib/inputs/autocomplete-input/autocomplete-input.component.d.ts +66 -0
- package/lib/inputs/autocomplete-input/autocomplete-input.defaults.d.ts +15 -0
- package/lib/inputs/autocomplete-input/autocomplete-input.directives.d.ts +33 -0
- package/lib/inputs/autocomplete-input/autocomplete-input.module.d.ts +13 -0
- package/lib/inputs/autocomplete-input/index.d.ts +3 -0
- package/lib/inputs/date-input/date-input.component.d.ts +5 -2
- package/lib/inputs/input/index.d.ts +2 -1
- package/lib/inputs/input/input.component.d.ts +3 -56
- package/lib/inputs/input/input.defaults.d.ts +1 -10
- package/lib/inputs/input/input.directives.d.ts +0 -13
- package/lib/inputs/input/input.module.d.ts +3 -5
- package/lib/inputs/input-utils.d.ts +8 -8
- package/lib/inputs/number-input/number-input.component.d.ts +1 -0
- package/lib/option/option.component.d.ts +1 -1
- package/lib/slider/abstract-slider.d.ts +1 -1
- package/package.json +1 -3
- package/prebuilt-themes/default/inputs/{simple-input.css → autocomplete-input.css} +40 -15
- package/prebuilt-themes/default/inputs/autocomplete-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/file-input.css +9 -4
- package/prebuilt-themes/default/inputs/file-input.css.map +1 -1
- package/prebuilt-themes/default/inputs/input.css +0 -25
- package/prebuilt-themes/default/inputs/input.css.map +1 -1
- package/public-api.d.ts +1 -1
- package/themes/default/inputs/autocomplete-input.scss +46 -0
- package/themes/default/inputs/file-input.scss +10 -2
- package/themes/default/inputs/input.scss +0 -34
- package/esm2022/ardium-ui-ui.mjs +0 -5
- package/esm2022/lib/_internal/boolean-component.mjs +0 -95
- package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +0 -15
- package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +0 -18
- package/esm2022/lib/_internal/disablable-component.mjs +0 -51
- package/esm2022/lib/_internal/focusable-component.mjs +0 -85
- package/esm2022/lib/_internal/form-field-component.mjs +0 -33
- package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +0 -453
- package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +0 -370
- package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +0 -157
- package/esm2022/lib/_internal/models/pagination.model.mjs +0 -90
- package/esm2022/lib/_internal/models/queue.mjs +0 -59
- package/esm2022/lib/_internal/ngmodel-component.mjs +0 -99
- package/esm2022/lib/_internal/public-api.mjs +0 -2
- package/esm2022/lib/_internal/selectable-list-component.mjs +0 -271
- package/esm2022/lib/badge/badge.defaults.mjs +0 -20
- package/esm2022/lib/badge/badge.directive.mjs +0 -97
- package/esm2022/lib/badge/badge.module.mjs +0 -18
- package/esm2022/lib/badge/badge.types.mjs +0 -16
- package/esm2022/lib/badge/index.mjs +0 -5
- package/esm2022/lib/buttons/_button-base.defaults.mjs +0 -17
- package/esm2022/lib/buttons/_button-base.mjs +0 -26
- package/esm2022/lib/buttons/button/button.component.mjs +0 -38
- package/esm2022/lib/buttons/button/button.defaults.mjs +0 -17
- package/esm2022/lib/buttons/button/button.module.mjs +0 -18
- package/esm2022/lib/buttons/button/index.mjs +0 -4
- package/esm2022/lib/buttons/fab/fab.component.mjs +0 -33
- package/esm2022/lib/buttons/fab/fab.defaults.mjs +0 -17
- package/esm2022/lib/buttons/fab/fab.module.mjs +0 -18
- package/esm2022/lib/buttons/fab/index.mjs +0 -4
- package/esm2022/lib/buttons/general-button.types.mjs +0 -55
- package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +0 -39
- package/esm2022/lib/buttons/icon-button/icon-button.defaults.mjs +0 -9
- package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +0 -18
- package/esm2022/lib/buttons/icon-button/index.mjs +0 -4
- package/esm2022/lib/calendar/calendar.component.mjs +0 -466
- package/esm2022/lib/calendar/calendar.defaults.mjs +0 -26
- package/esm2022/lib/calendar/calendar.directives.mjs +0 -107
- package/esm2022/lib/calendar/calendar.internal-directives.mjs +0 -22
- package/esm2022/lib/calendar/calendar.internal-types.mjs +0 -2
- package/esm2022/lib/calendar/calendar.module.mjs +0 -71
- package/esm2022/lib/calendar/calendar.types.mjs +0 -6
- package/esm2022/lib/calendar/index.mjs +0 -6
- package/esm2022/lib/calendar/views/days-view/days-view.component.mjs +0 -282
- package/esm2022/lib/calendar/views/days-view/days-view.helpers.mjs +0 -65
- package/esm2022/lib/calendar/views/months-view/months-view.component.mjs +0 -245
- package/esm2022/lib/calendar/views/months-view/months-view.helpers.mjs +0 -22
- package/esm2022/lib/calendar/views/years-view/years-view.component.mjs +0 -244
- package/esm2022/lib/calendar/views/years-view/years-view.helpers.mjs +0 -14
- package/esm2022/lib/card/card.children.mjs +0 -96
- package/esm2022/lib/card/card.component.mjs +0 -38
- package/esm2022/lib/card/card.defaults.mjs +0 -17
- package/esm2022/lib/card/card.module.mjs +0 -59
- package/esm2022/lib/card/card.types.mjs +0 -9
- package/esm2022/lib/card/index.mjs +0 -6
- package/esm2022/lib/checkbox/checkbox.component.mjs +0 -68
- package/esm2022/lib/checkbox/checkbox.defaults.mjs +0 -17
- package/esm2022/lib/checkbox/checkbox.directives.mjs +0 -14
- package/esm2022/lib/checkbox/checkbox.internal-directives.mjs +0 -15
- package/esm2022/lib/checkbox/checkbox.module.mjs +0 -20
- package/esm2022/lib/checkbox/checkbox.types.mjs +0 -6
- package/esm2022/lib/checkbox/index.mjs +0 -6
- package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +0 -116
- package/esm2022/lib/checkbox-list/checkbox-list.defaults.mjs +0 -25
- package/esm2022/lib/checkbox-list/checkbox-list.directives.mjs +0 -14
- package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +0 -21
- package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +0 -7
- package/esm2022/lib/checkbox-list/index.mjs +0 -6
- package/esm2022/lib/chip/chip.component.mjs +0 -36
- package/esm2022/lib/chip/chip.defaults.mjs +0 -20
- package/esm2022/lib/chip/chip.module.mjs +0 -21
- package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +0 -53
- package/esm2022/lib/chip/deletable-chip/deletable-chip.defaults.mjs +0 -17
- package/esm2022/lib/chip/index.mjs +0 -8
- package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +0 -53
- package/esm2022/lib/chip/selectable-chip/selectable-chip.defaults.mjs +0 -18
- package/esm2022/lib/dialog/dialog.component.mjs +0 -109
- package/esm2022/lib/dialog/dialog.defaults.mjs +0 -26
- package/esm2022/lib/dialog/dialog.directives.mjs +0 -25
- package/esm2022/lib/dialog/dialog.module.mjs +0 -21
- package/esm2022/lib/dialog/dialog.types.mjs +0 -10
- package/esm2022/lib/dialog/index.mjs +0 -6
- package/esm2022/lib/divider/divider.component.mjs +0 -19
- package/esm2022/lib/divider/divider.defaults.mjs +0 -13
- package/esm2022/lib/divider/divider.module.mjs +0 -18
- package/esm2022/lib/divider/index.mjs +0 -4
- package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +0 -112
- package/esm2022/lib/dropdown-panel/dropdown-panel.defaults.mjs +0 -17
- package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +0 -18
- package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +0 -10
- package/esm2022/lib/dropdown-panel/index.mjs +0 -5
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +0 -70
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.defaults.mjs +0 -18
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +0 -42
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +0 -52
- package/esm2022/lib/file-inputs/file-drop-area/index.mjs +0 -5
- package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +0 -120
- package/esm2022/lib/file-inputs/file-input/file-input.defaults.mjs +0 -23
- package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +0 -86
- package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +0 -55
- package/esm2022/lib/file-inputs/file-input/index.mjs +0 -5
- package/esm2022/lib/file-inputs/file-input-base.defaults.mjs +0 -8
- package/esm2022/lib/file-inputs/file-input-base.mjs +0 -333
- package/esm2022/lib/file-inputs/file-input-types.mjs +0 -8
- package/esm2022/lib/form-field/error/error.component.mjs +0 -17
- package/esm2022/lib/form-field/error/error.directive.mjs +0 -17
- package/esm2022/lib/form-field/form-field-base.mjs +0 -53
- package/esm2022/lib/form-field/form-field-child.token.mjs +0 -3
- package/esm2022/lib/form-field/form-field-native-inputs.mjs +0 -80
- package/esm2022/lib/form-field/form-field.component.mjs +0 -12
- package/esm2022/lib/form-field/form-field.defaults.mjs +0 -17
- package/esm2022/lib/form-field/form-field.module.mjs +0 -49
- package/esm2022/lib/form-field/hint/hint.component.mjs +0 -17
- package/esm2022/lib/form-field/hint/hint.directive.mjs +0 -30
- package/esm2022/lib/form-field/horizontal-form-field.component.mjs +0 -12
- package/esm2022/lib/form-field/index.mjs +0 -10
- package/esm2022/lib/form-field/label/label.component.mjs +0 -27
- package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +0 -58
- package/esm2022/lib/form-field-frame/form-field-frame.defaults.mjs +0 -18
- package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +0 -25
- package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +0 -19
- package/esm2022/lib/form-field-frame/index.mjs +0 -5
- package/esm2022/lib/icon/icon.component.mjs +0 -52
- package/esm2022/lib/icon/icon.defaults.mjs +0 -17
- package/esm2022/lib/icon/icon.module.mjs +0 -19
- package/esm2022/lib/icon/icon.pipe.mjs +0 -18
- package/esm2022/lib/icon/index.mjs +0 -5
- package/esm2022/lib/inputs/_simple-input-base.mjs +0 -153
- package/esm2022/lib/inputs/date-input/date-input.component.mjs +0 -375
- package/esm2022/lib/inputs/date-input/date-input.defaults.mjs +0 -38
- package/esm2022/lib/inputs/date-input/date-input.directive.mjs +0 -163
- package/esm2022/lib/inputs/date-input/date-input.module.mjs +0 -108
- package/esm2022/lib/inputs/date-input/date-input.serializers.mjs +0 -49
- package/esm2022/lib/inputs/date-input/date-input.types.mjs +0 -5
- package/esm2022/lib/inputs/date-input/index.mjs +0 -6
- package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +0 -265
- package/esm2022/lib/inputs/digit-input/digit-input.defaults.mjs +0 -24
- package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +0 -267
- package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +0 -19
- package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +0 -15
- package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +0 -8
- package/esm2022/lib/inputs/digit-input/index.mjs +0 -5
- package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +0 -180
- package/esm2022/lib/inputs/hex-input/hex-input.defaults.mjs +0 -26
- package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +0 -36
- package/esm2022/lib/inputs/hex-input/hex-input.model.mjs +0 -97
- package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +0 -37
- package/esm2022/lib/inputs/hex-input/index.mjs +0 -5
- package/esm2022/lib/inputs/input/index.mjs +0 -4
- package/esm2022/lib/inputs/input/input.component.mjs +0 -278
- package/esm2022/lib/inputs/input/input.defaults.mjs +0 -21
- package/esm2022/lib/inputs/input/input.directives.mjs +0 -58
- package/esm2022/lib/inputs/input/input.module.mjs +0 -61
- package/esm2022/lib/inputs/input-transformers.mjs +0 -66
- package/esm2022/lib/inputs/input-types.mjs +0 -6
- package/esm2022/lib/inputs/input-utils.mjs +0 -186
- package/esm2022/lib/inputs/number-input/index.mjs +0 -5
- package/esm2022/lib/inputs/number-input/number-input.component.mjs +0 -245
- package/esm2022/lib/inputs/number-input/number-input.defaults.mjs +0 -27
- package/esm2022/lib/inputs/number-input/number-input.directives.mjs +0 -14
- package/esm2022/lib/inputs/number-input/number-input.module.mjs +0 -21
- package/esm2022/lib/inputs/password-input/index.mjs +0 -6
- package/esm2022/lib/inputs/password-input/password-input.component.mjs +0 -167
- package/esm2022/lib/inputs/password-input/password-input.defaults.mjs +0 -24
- package/esm2022/lib/inputs/password-input/password-input.directives.mjs +0 -49
- package/esm2022/lib/inputs/password-input/password-input.module.mjs +0 -41
- package/esm2022/lib/inputs/password-input/password-input.types.mjs +0 -2
- package/esm2022/lib/inputs/simple-input/index.mjs +0 -5
- package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +0 -50
- package/esm2022/lib/inputs/simple-input/simple-input.defaults.mjs +0 -25
- package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +0 -36
- package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +0 -37
- package/esm2022/lib/kbd/index.mjs +0 -6
- package/esm2022/lib/kbd/kbd.component.mjs +0 -30
- package/esm2022/lib/kbd/kbd.defaults.mjs +0 -15
- package/esm2022/lib/kbd/kbd.directive.mjs +0 -33
- package/esm2022/lib/kbd/kbd.module.mjs +0 -20
- package/esm2022/lib/kbd/kbd.pipe.mjs +0 -21
- package/esm2022/lib/kbd-shortcut/index.mjs +0 -4
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +0 -36
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.defaults.mjs +0 -8
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +0 -19
- package/esm2022/lib/modal/index.mjs +0 -5
- package/esm2022/lib/modal/modal.component.mjs +0 -95
- package/esm2022/lib/modal/modal.defaults.mjs +0 -20
- package/esm2022/lib/modal/modal.directives.mjs +0 -14
- package/esm2022/lib/modal/modal.module.mjs +0 -22
- package/esm2022/lib/option/index.mjs +0 -3
- package/esm2022/lib/option/option.component.mjs +0 -55
- package/esm2022/lib/option/option.module.mjs +0 -18
- package/esm2022/lib/progress-bar/index.mjs +0 -6
- package/esm2022/lib/progress-bar/progress-bar.component.mjs +0 -58
- package/esm2022/lib/progress-bar/progress-bar.defaults.mjs +0 -21
- package/esm2022/lib/progress-bar/progress-bar.directive.mjs +0 -14
- package/esm2022/lib/progress-bar/progress-bar.module.mjs +0 -19
- package/esm2022/lib/progress-bar/progress-bar.types.mjs +0 -19
- package/esm2022/lib/progress-circle/index.mjs +0 -6
- package/esm2022/lib/progress-circle/progress-circle.component.mjs +0 -45
- package/esm2022/lib/progress-circle/progress-circle.defaults.mjs +0 -21
- package/esm2022/lib/progress-circle/progress-circle.directive.mjs +0 -14
- package/esm2022/lib/progress-circle/progress-circle.module.mjs +0 -19
- package/esm2022/lib/progress-circle/progress-circle.types.mjs +0 -10
- package/esm2022/lib/radio/index.mjs +0 -5
- package/esm2022/lib/radio/radio/radio.component.mjs +0 -119
- package/esm2022/lib/radio/radio/radio.defaults.mjs +0 -16
- package/esm2022/lib/radio/radio-group.component.mjs +0 -203
- package/esm2022/lib/radio/radio.module.mjs +0 -19
- package/esm2022/lib/search-functions.mjs +0 -64
- package/esm2022/lib/segment/index.mjs +0 -6
- package/esm2022/lib/segment/segment.component.mjs +0 -125
- package/esm2022/lib/segment/segment.defaults.mjs +0 -26
- package/esm2022/lib/segment/segment.directives.mjs +0 -14
- package/esm2022/lib/segment/segment.module.mjs +0 -19
- package/esm2022/lib/segment/segment.types.mjs +0 -13
- package/esm2022/lib/select/index.mjs +0 -6
- package/esm2022/lib/select/select.component.mjs +0 -836
- package/esm2022/lib/select/select.defaults.mjs +0 -53
- package/esm2022/lib/select/select.directive.mjs +0 -171
- package/esm2022/lib/select/select.module.mjs +0 -112
- package/esm2022/lib/select/select.types.mjs +0 -2
- package/esm2022/lib/slide-toggle/index.mjs +0 -5
- package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +0 -43
- package/esm2022/lib/slide-toggle/slide-toggle.defaults.mjs +0 -21
- package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +0 -18
- package/esm2022/lib/slide-toggle/slide-toggle.types.mjs +0 -5
- package/esm2022/lib/slider/abstract-slider.mjs +0 -251
- package/esm2022/lib/slider/index.mjs +0 -8
- package/esm2022/lib/slider/range-slider/range-slider.component.mjs +0 -151
- package/esm2022/lib/slider/range-slider/range-slider.module.mjs +0 -18
- package/esm2022/lib/slider/slider.component.mjs +0 -100
- package/esm2022/lib/slider/slider.defaults.mjs +0 -14
- package/esm2022/lib/slider/slider.directive.mjs +0 -16
- package/esm2022/lib/slider/slider.module.mjs +0 -20
- package/esm2022/lib/slider/slider.types.mjs +0 -10
- package/esm2022/lib/snackbar/index.mjs +0 -5
- package/esm2022/lib/snackbar/snackbar-ref.mjs +0 -51
- package/esm2022/lib/snackbar/snackbar.component.mjs +0 -48
- package/esm2022/lib/snackbar/snackbar.service.mjs +0 -224
- package/esm2022/lib/snackbar/snackbar.token.mjs +0 -26
- package/esm2022/lib/snackbar/snackbar.types.mjs +0 -25
- package/esm2022/lib/spinner/index.mjs +0 -4
- package/esm2022/lib/spinner/spinner.component.mjs +0 -19
- package/esm2022/lib/spinner/spinner.defaults.mjs +0 -14
- package/esm2022/lib/spinner/spinner.module.mjs +0 -18
- package/esm2022/lib/star/index.mjs +0 -6
- package/esm2022/lib/star/rating-display/index.mjs +0 -6
- package/esm2022/lib/star/rating-display/rating-display.component.mjs +0 -71
- package/esm2022/lib/star/rating-display/rating-display.defaults.mjs +0 -16
- package/esm2022/lib/star/rating-display/rating-display.directives.mjs +0 -16
- package/esm2022/lib/star/rating-display/rating-display.module.mjs +0 -20
- package/esm2022/lib/star/rating-display/rating-display.types.mjs +0 -2
- package/esm2022/lib/star/rating-input/index.mjs +0 -6
- package/esm2022/lib/star/rating-input/rating-input.component.mjs +0 -191
- package/esm2022/lib/star/rating-input/rating-input.defaults.mjs +0 -17
- package/esm2022/lib/star/rating-input/rating-input.directives.mjs +0 -16
- package/esm2022/lib/star/rating-input/rating-input.module.mjs +0 -20
- package/esm2022/lib/star/rating-input/rating-input.types.mjs +0 -2
- package/esm2022/lib/star/star-button/index.mjs +0 -6
- package/esm2022/lib/star/star-button/star-button.component.mjs +0 -55
- package/esm2022/lib/star/star-button/star-button.defaults.mjs +0 -18
- package/esm2022/lib/star/star-button/star-button.directives.mjs +0 -16
- package/esm2022/lib/star/star-button/star-button.module.mjs +0 -20
- package/esm2022/lib/star/star-button/star-button.types.mjs +0 -2
- package/esm2022/lib/star/star.component.mjs +0 -36
- package/esm2022/lib/star/star.defaults.mjs +0 -15
- package/esm2022/lib/star/star.directives.mjs +0 -16
- package/esm2022/lib/star/star.module.mjs +0 -20
- package/esm2022/lib/star/star.types.mjs +0 -23
- package/esm2022/lib/statebox/index.mjs +0 -4
- package/esm2022/lib/statebox/statebox.component.mjs +0 -114
- package/esm2022/lib/statebox/statebox.defaults.mjs +0 -20
- package/esm2022/lib/statebox/statebox.module.mjs +0 -18
- package/esm2022/lib/statebox/statebox.types.mjs +0 -2
- package/esm2022/lib/tabber/index.mjs +0 -6
- package/esm2022/lib/tabber/tab/tab.component.mjs +0 -44
- package/esm2022/lib/tabber/tab/tab.defaults.mjs +0 -13
- package/esm2022/lib/tabber/tabber.component.mjs +0 -90
- package/esm2022/lib/tabber/tabber.defaults.mjs +0 -19
- package/esm2022/lib/tabber/tabber.module.mjs +0 -19
- package/esm2022/lib/table/index.mjs +0 -6
- package/esm2022/lib/table/table-item-storage.mjs +0 -564
- package/esm2022/lib/table/table.component.mjs +0 -367
- package/esm2022/lib/table/table.defaults.mjs +0 -53
- package/esm2022/lib/table/table.directives.mjs +0 -62
- package/esm2022/lib/table/table.module.mjs +0 -47
- package/esm2022/lib/table/table.types.mjs +0 -30
- package/esm2022/lib/table/utils.mjs +0 -18
- package/esm2022/lib/table-from-csv/index.mjs +0 -4
- package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +0 -120
- package/esm2022/lib/table-from-csv/table-from-csv.defaults.mjs +0 -15
- package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +0 -19
- package/esm2022/lib/table-pagination/index.mjs +0 -5
- package/esm2022/lib/table-pagination/table-pagination.component.mjs +0 -108
- package/esm2022/lib/table-pagination/table-pagination.defaults.mjs +0 -25
- package/esm2022/lib/table-pagination/table-pagination.module.mjs +0 -21
- package/esm2022/lib/table-pagination/table-pagination.types.mjs +0 -7
- package/esm2022/lib/text-list/index.mjs +0 -4
- package/esm2022/lib/text-list/text-list.component.mjs +0 -18
- package/esm2022/lib/text-list/text-list.module.mjs +0 -19
- package/esm2022/lib/text-list/text-list.pipe.mjs +0 -16
- package/esm2022/lib/types/alignment.types.mjs +0 -10
- package/esm2022/lib/types/button.types.mjs +0 -6
- package/esm2022/lib/types/colors.types.mjs +0 -43
- package/esm2022/lib/types/item-storage.types.mjs +0 -6
- package/esm2022/lib/types/theming.types.mjs +0 -48
- package/esm2022/lib/types/utility.types.mjs +0 -5
- package/esm2022/public-api.mjs +0 -74
- package/lib/inputs/simple-input/index.d.ts +0 -4
- package/lib/inputs/simple-input/simple-input.component.d.ts +0 -13
- package/lib/inputs/simple-input/simple-input.defaults.d.ts +0 -6
- package/lib/inputs/simple-input/simple-input.directives.d.ts +0 -20
- package/lib/inputs/simple-input/simple-input.module.d.ts +0 -11
- package/prebuilt-themes/default/inputs/simple-input.css.map +0 -1
- package/themes/default/inputs/simple-input.scss +0 -12
|
@@ -1,564 +0,0 @@
|
|
|
1
|
-
import { computed, signal } from '@angular/core';
|
|
2
|
-
import { resolvePath } from 'resolve-object-path';
|
|
3
|
-
import { evaluate, isDefined, isNull } from 'simple-bool';
|
|
4
|
-
import { SortType, TablePaginationStrategy } from './table.types';
|
|
5
|
-
import { areAllDataColumns, isTableSubheader, merge2dArrays } from './utils';
|
|
6
|
-
export class ArdTableRow {
|
|
7
|
-
constructor(itemData, index, data, dataColumns, disabled, bold, isEmpty = false) {
|
|
8
|
-
this._itemData = signal(undefined);
|
|
9
|
-
this.itemData = this._itemData.asReadonly();
|
|
10
|
-
this._index = signal(-1);
|
|
11
|
-
this.index = this._index.asReadonly();
|
|
12
|
-
this._isEmpty = signal(false);
|
|
13
|
-
this.isEmpty = this._isEmpty.asReadonly();
|
|
14
|
-
this._data = signal([]);
|
|
15
|
-
this.data = this._data.asReadonly();
|
|
16
|
-
this._dataColumns = signal([]);
|
|
17
|
-
this.dataColumns = this._dataColumns.asReadonly();
|
|
18
|
-
this._class = signal('');
|
|
19
|
-
this.class = this._class.asReadonly();
|
|
20
|
-
this.disabled = signal(false);
|
|
21
|
-
this.bold = signal(false);
|
|
22
|
-
this.selected = signal(false);
|
|
23
|
-
this.highlighted = signal(false);
|
|
24
|
-
this._itemData.set(itemData);
|
|
25
|
-
this._index.set(index);
|
|
26
|
-
this._data.set(data);
|
|
27
|
-
this._dataColumns.set(dataColumns);
|
|
28
|
-
this.disabled.set(disabled);
|
|
29
|
-
this.bold.set(bold);
|
|
30
|
-
this._isEmpty.set(isEmpty);
|
|
31
|
-
}
|
|
32
|
-
static newEmptyCell(index) {
|
|
33
|
-
return new ArdTableRow(null, index, [], [], false, false, true);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
export class HeaderCell {
|
|
37
|
-
constructor(cell, colspan = 1, rowspan = 1) {
|
|
38
|
-
this.cell = signal(undefined);
|
|
39
|
-
this.colspan = signal(1);
|
|
40
|
-
this.rowspan = signal(1);
|
|
41
|
-
this.cell.set(cell);
|
|
42
|
-
this.colspan.set(colspan);
|
|
43
|
-
this.rowspan.set(rowspan);
|
|
44
|
-
}
|
|
45
|
-
get width() {
|
|
46
|
-
const cell = this.cell();
|
|
47
|
-
if (isTableSubheader(cell))
|
|
48
|
-
return null;
|
|
49
|
-
return this._getWidth(cell.width);
|
|
50
|
-
}
|
|
51
|
-
get minWidth() {
|
|
52
|
-
const cell = this.cell();
|
|
53
|
-
if (isTableSubheader(cell))
|
|
54
|
-
return null;
|
|
55
|
-
return this._getWidth(cell.minWidth);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Thransforms a numeric width into a CSS string if needed. Pure function.
|
|
59
|
-
* @param width the width to be converted.
|
|
60
|
-
* @returns The width expressed as a CSS-compatible string or null.
|
|
61
|
-
*/
|
|
62
|
-
_getWidth(width) {
|
|
63
|
-
if (!width)
|
|
64
|
-
return null;
|
|
65
|
-
if (typeof width === 'number')
|
|
66
|
-
return `${width}px`;
|
|
67
|
-
return width;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
export class TableItemStorage {
|
|
71
|
-
constructor(_ardParentComp) {
|
|
72
|
-
this._ardParentComp = _ardParentComp;
|
|
73
|
-
this._items = signal([]);
|
|
74
|
-
this._sortedItems = signal([]);
|
|
75
|
-
this._dataColumns = signal([]);
|
|
76
|
-
this._headerCells = signal([]);
|
|
77
|
-
/**
|
|
78
|
-
* Gets all items.
|
|
79
|
-
*/
|
|
80
|
-
this.items = this._items.asReadonly();
|
|
81
|
-
this.sortedItems = this._sortedItems.asReadonly();
|
|
82
|
-
/**
|
|
83
|
-
* Gets items based on the current pagination state.
|
|
84
|
-
*/
|
|
85
|
-
this.paginatedItems = computed(() => {
|
|
86
|
-
if (!this._ardParentComp.paginated() || this._ardParentComp.paginationStrategy() === TablePaginationStrategy.Noop) {
|
|
87
|
-
return this.sortedItems();
|
|
88
|
-
}
|
|
89
|
-
const page = this._ardParentComp.page();
|
|
90
|
-
const IPP = this._ardParentComp.itemsPerPage();
|
|
91
|
-
const itemsStart = (page - 1) * IPP;
|
|
92
|
-
const itemsEnd = page * IPP;
|
|
93
|
-
return this.sortedItems().slice(itemsStart, itemsEnd);
|
|
94
|
-
});
|
|
95
|
-
/**
|
|
96
|
-
* Gets all currently selected items.
|
|
97
|
-
*/
|
|
98
|
-
this.selectedItems = computed(() => this.items().filter(item => item.selected()));
|
|
99
|
-
/**
|
|
100
|
-
* Gets all currently highlighted items.
|
|
101
|
-
*/
|
|
102
|
-
this.highlightedItems = computed(() => this.items().filter(item => item.highlighted()));
|
|
103
|
-
/**
|
|
104
|
-
* Gets all highlightable items. An item is considered highlightable if it is **not** disabled.
|
|
105
|
-
*/
|
|
106
|
-
this.highlightableItems = computed(() => this._items().filter(item => !item.disabled()));
|
|
107
|
-
/**
|
|
108
|
-
* Gets the values of the currently selected items.
|
|
109
|
-
*/
|
|
110
|
-
this.value = computed(() => this._itemsToValue(this.selectedItems()));
|
|
111
|
-
/**
|
|
112
|
-
* Returns true if at least one item is highlighted, otherwise false.
|
|
113
|
-
*/
|
|
114
|
-
this.isAnyItemHighlighted = computed(() => this.highlightedItems().length > 0);
|
|
115
|
-
/**
|
|
116
|
-
* Checks if any item in the table is selected.
|
|
117
|
-
* @returns A boolean value indicating if any item is selected.
|
|
118
|
-
*/
|
|
119
|
-
this.isAnyItemSelected = computed(() => this.selectedItems().length > 0);
|
|
120
|
-
/**
|
|
121
|
-
* Checks if all items in the table are selected.
|
|
122
|
-
* @returns A boolean value indicating if all items are selected.
|
|
123
|
-
*/
|
|
124
|
-
this.areAllSelected = computed(() => this.selectedItems().length === this._items().filter(item => !item.disabled()).length);
|
|
125
|
-
/**
|
|
126
|
-
* Returns true if the parent component defines the limit of concurrently selectable items and the amount of currently selected items matches that limit. Otherwise returns false.
|
|
127
|
-
*
|
|
128
|
-
* **TLDR**: true if `maxSelectedItems` is defined and the number of selected items matches that value.
|
|
129
|
-
*/
|
|
130
|
-
this.isItemLimitReached = computed(() => {
|
|
131
|
-
const max = this._ardParentComp.maxSelectedItems();
|
|
132
|
-
if (!isDefined(max)) {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
return max <= this.selectedItems().length;
|
|
136
|
-
});
|
|
137
|
-
/**
|
|
138
|
-
* Gets the header cells of the table.
|
|
139
|
-
* @returns a 2D array of header cells.
|
|
140
|
-
*/
|
|
141
|
-
this.headerCells = this._headerCells.asReadonly();
|
|
142
|
-
/**
|
|
143
|
-
* Checks if the table has defined columns.
|
|
144
|
-
* @returns a boolean value indicating if the table has defined columns.
|
|
145
|
-
*/
|
|
146
|
-
this.hasDefinedColumns = computed(() => this._dataColumns().length > 0);
|
|
147
|
-
//! sorting
|
|
148
|
-
this._currentSortColumn = null;
|
|
149
|
-
this._currentSortType = null;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Maps an array of items into their values.
|
|
153
|
-
* @param items The items to convert to value.
|
|
154
|
-
* @returns An array of item values.
|
|
155
|
-
*/
|
|
156
|
-
_itemsToValue(items) {
|
|
157
|
-
return items.map(item => item.itemData());
|
|
158
|
-
}
|
|
159
|
-
//! setting columns
|
|
160
|
-
/**
|
|
161
|
-
* Sets the columns of the table.
|
|
162
|
-
* @param cols an array of table data columns or table subheaders.
|
|
163
|
-
*/
|
|
164
|
-
setColumns(cols) {
|
|
165
|
-
const maxNestingLevel = this._getHeaderMaxNesting(cols);
|
|
166
|
-
const headerCells = this._mapColumnsToArray(cols, maxNestingLevel, 0);
|
|
167
|
-
this._headerCells.set(this._filterHeaderCells(headerCells));
|
|
168
|
-
this._dataColumns.set(this._extractDataSources(cols));
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Filters out null values from the header cells array. Pure function.
|
|
172
|
-
* @param cells a 2D array of header cells or null values.
|
|
173
|
-
* @returns a 2D array of header cells without null values and empty arrays.
|
|
174
|
-
*/
|
|
175
|
-
_filterHeaderCells(cells) {
|
|
176
|
-
for (let i = 0; i < cells.length; i++) {
|
|
177
|
-
cells[i] = cells[i].filter(v => v !== null);
|
|
178
|
-
}
|
|
179
|
-
return cells.filter(row => row.length);
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Extracts the data sources from the columns array. Pure function.
|
|
183
|
-
* @param cols an array of table data columns or table subheaders.
|
|
184
|
-
* @returns an array of table data columns.
|
|
185
|
-
*/
|
|
186
|
-
_extractDataSources(cols) {
|
|
187
|
-
const dataColumns = [];
|
|
188
|
-
for (const col of cols) {
|
|
189
|
-
if (!isTableSubheader(col)) {
|
|
190
|
-
dataColumns.push(col);
|
|
191
|
-
continue;
|
|
192
|
-
}
|
|
193
|
-
dataColumns.push(...this._extractDataSources(col.children));
|
|
194
|
-
}
|
|
195
|
-
return dataColumns;
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Gets the maximum nesting level of the columns array. Pure function.
|
|
199
|
-
* @param cols an array of table data columns or table subheaders.
|
|
200
|
-
* @returns the maximum nesting level as a number.
|
|
201
|
-
*/
|
|
202
|
-
_getHeaderMaxNesting(cols) {
|
|
203
|
-
if (areAllDataColumns(cols))
|
|
204
|
-
return 1;
|
|
205
|
-
let max = 1;
|
|
206
|
-
for (const col of cols.filter(v => isTableSubheader(v))) {
|
|
207
|
-
const height = 1 + this._getHeaderMaxNesting(col.children);
|
|
208
|
-
if (height > max)
|
|
209
|
-
max = height;
|
|
210
|
-
}
|
|
211
|
-
return max;
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Maps the columns tree to a 2D array of header cells or null values. Pure function.
|
|
215
|
-
* @param cols an array of table data columns or table subheaders.
|
|
216
|
-
* @param maxNesting the maximum nesting level of the columns array.
|
|
217
|
-
* @param currentNesting the current nesting level of the columns array.
|
|
218
|
-
* @returns a 2D array of header cells or null values.
|
|
219
|
-
*/
|
|
220
|
-
_mapColumnsToArray(cols, maxNesting, currentNesting) {
|
|
221
|
-
if (areAllDataColumns(cols)) {
|
|
222
|
-
return [cols.map(col => new HeaderCell(col, 1, maxNesting - currentNesting))];
|
|
223
|
-
}
|
|
224
|
-
const headerCells = [[]];
|
|
225
|
-
for (const col of cols) {
|
|
226
|
-
if (!isTableSubheader(col)) {
|
|
227
|
-
headerCells[0].push(new HeaderCell(col, 1, maxNesting - currentNesting));
|
|
228
|
-
continue;
|
|
229
|
-
}
|
|
230
|
-
const childCells = [[], ...this._mapColumnsToArray(col.children, maxNesting, currentNesting + 1)];
|
|
231
|
-
const height = childCells.length - 1;
|
|
232
|
-
const width = childCells[1].length;
|
|
233
|
-
for (let i = 0; i < height; i++) {
|
|
234
|
-
headerCells.push([null]);
|
|
235
|
-
}
|
|
236
|
-
headerCells[0].push(new HeaderCell(col, width, 1));
|
|
237
|
-
for (let i = 0; i < width - 1; i++) {
|
|
238
|
-
headerCells[0].push(null);
|
|
239
|
-
}
|
|
240
|
-
merge2dArrays(headerCells, childCells);
|
|
241
|
-
}
|
|
242
|
-
return headerCells;
|
|
243
|
-
}
|
|
244
|
-
//! setting items
|
|
245
|
-
/**
|
|
246
|
-
* Sets the component's items. Takes into account the values defined by the parent component for `rowDisabledFrom`, `rowBoldFrom`, and `rowHighlightedFrom`.
|
|
247
|
-
* @param items An array of items to be set as the component's items.
|
|
248
|
-
*/
|
|
249
|
-
setItems(items) {
|
|
250
|
-
if (!this.hasDefinedColumns())
|
|
251
|
-
return;
|
|
252
|
-
const mappedItems = items.map((item, i) => this._setItemsMapFn(item, i));
|
|
253
|
-
this._items.set(mappedItems);
|
|
254
|
-
this._sortedItems.set(mappedItems);
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Maps raw item data to an {@link ArdTableRow} object.
|
|
258
|
-
*
|
|
259
|
-
* @param {any} rawItemData - The raw data of the item.
|
|
260
|
-
* @param {number} index - The index of the item.
|
|
261
|
-
* @returns {ArdTableRow} Returns an ArdTableRow object with mapped properties.
|
|
262
|
-
* @private
|
|
263
|
-
*/
|
|
264
|
-
_setItemsMapFn(rawItemData, index) {
|
|
265
|
-
//get data
|
|
266
|
-
const [data, dataColumns] = this._getRowData(rawItemData, index);
|
|
267
|
-
//get bold
|
|
268
|
-
const rowBoldFromPath = this._ardParentComp.rowBoldFrom();
|
|
269
|
-
let bold = resolvePath(rawItemData, rowBoldFromPath);
|
|
270
|
-
if (this._ardParentComp.invertRowBold()) {
|
|
271
|
-
bold = !bold;
|
|
272
|
-
}
|
|
273
|
-
//get disabled
|
|
274
|
-
const disabledPath = this._ardParentComp.rowDisabledFrom();
|
|
275
|
-
let disabled = evaluate(resolvePath(rawItemData, disabledPath));
|
|
276
|
-
if (this._ardParentComp.invertRowDisabled()) {
|
|
277
|
-
disabled = !disabled;
|
|
278
|
-
}
|
|
279
|
-
return new ArdTableRow(rawItemData, index, data, dataColumns, disabled, bold);
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Retrieves data for a row based on data columns configuration.
|
|
283
|
-
*
|
|
284
|
-
* @param {any} rawItemData - The raw data of the item.
|
|
285
|
-
* @param {number} index - The index of the item.
|
|
286
|
-
* @returns {any[]} Returns an array containing the row data.
|
|
287
|
-
* @private
|
|
288
|
-
*/
|
|
289
|
-
_getRowData(rawItemData, index) {
|
|
290
|
-
const data = [];
|
|
291
|
-
const _cols = this._dataColumns();
|
|
292
|
-
for (let i = 0; i < _cols.length; i++) {
|
|
293
|
-
const dataColumn = _cols[i];
|
|
294
|
-
const sourcePath = dataColumn.dataSource;
|
|
295
|
-
if (typeof sourcePath === 'string') {
|
|
296
|
-
if (this._ardParentComp.treatDataSourceAsString()) {
|
|
297
|
-
data.push(rawItemData[sourcePath]);
|
|
298
|
-
continue;
|
|
299
|
-
}
|
|
300
|
-
data.push(resolvePath(rawItemData, sourcePath));
|
|
301
|
-
continue;
|
|
302
|
-
}
|
|
303
|
-
if (sourcePath.type === 'autocount') {
|
|
304
|
-
data.push(index + 1);
|
|
305
|
-
continue;
|
|
306
|
-
}
|
|
307
|
-
if (sourcePath.type === 'checkbox') {
|
|
308
|
-
data.push({ _ardCheckbox: true, index });
|
|
309
|
-
continue;
|
|
310
|
-
}
|
|
311
|
-
const sourceString = typeof sourcePath === 'object' ? JSON.stringify(sourcePath) : sourcePath;
|
|
312
|
-
throw new Error(`ARD-FT5052: Unexpected data source "${sourceString}" at index ${i}.`);
|
|
313
|
-
}
|
|
314
|
-
return [data, this._dataColumns()];
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Writes a new value to the item storage. Selects the correct items based on the provided values, warning the user if the value is not found.
|
|
318
|
-
* @param indexes The value of the ngModel to set.
|
|
319
|
-
*/
|
|
320
|
-
writeValue(indexes) {
|
|
321
|
-
this._forceUnselectAll();
|
|
322
|
-
this.selectItem(...indexes);
|
|
323
|
-
}
|
|
324
|
-
//! selecting items
|
|
325
|
-
/**
|
|
326
|
-
* Checks if an item with the given index is selected.
|
|
327
|
-
*
|
|
328
|
-
* @param {number} index The index of the item to check.
|
|
329
|
-
* @returns {boolean} _true_ if the item is selected, otherwise _false_.
|
|
330
|
-
*/
|
|
331
|
-
isItemSelected(index) {
|
|
332
|
-
return this.selectedItems().some(item => item.index() === index);
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* Selects all items.
|
|
336
|
-
*
|
|
337
|
-
* Accounts for the limit of concurrently selected items defined by the parent component.
|
|
338
|
-
* @returns a tuple containing two arrays:
|
|
339
|
-
* * An array of items selected.
|
|
340
|
-
* * An array of items failed to select.
|
|
341
|
-
*/
|
|
342
|
-
selectAll() {
|
|
343
|
-
return this.selectItem(...this._items().map(v => v.index()));
|
|
344
|
-
}
|
|
345
|
-
/**
|
|
346
|
-
* Unselects all selected items.
|
|
347
|
-
*
|
|
348
|
-
* If the parent component requires at least one value to be selected at all times, the first selected items is left selected.
|
|
349
|
-
* @returns An array of items cleared, mapped to only their values.
|
|
350
|
-
*/
|
|
351
|
-
unselectAll() {
|
|
352
|
-
const selected = this.selectedItems();
|
|
353
|
-
for (const item of selected) {
|
|
354
|
-
item.selected.set(false);
|
|
355
|
-
}
|
|
356
|
-
return this._itemsToValue(selected);
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* Unselects all selected items, no matter what the component settings are.
|
|
360
|
-
* @returns An array of items cleared, mapped to only their values.
|
|
361
|
-
*/
|
|
362
|
-
_forceUnselectAll() {
|
|
363
|
-
const selected = this.selectedItems();
|
|
364
|
-
for (const item of selected) {
|
|
365
|
-
item.selected.set(false);
|
|
366
|
-
}
|
|
367
|
-
return this._itemsToValue(selected);
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* Selects one or multiple items.
|
|
371
|
-
*
|
|
372
|
-
* Accounts for the limit of concurrently selected items defined by the parent component.
|
|
373
|
-
*
|
|
374
|
-
* @param indexes A rest operator array of item indexes to be selected.
|
|
375
|
-
* @returns a tuple containing two arrays:
|
|
376
|
-
* - An array of items selected.
|
|
377
|
-
* - An array of items failed to select.
|
|
378
|
-
*/
|
|
379
|
-
selectItem(...indexes) {
|
|
380
|
-
const itemsToBeSelected = this._items().filter(item => !item.disabled() && indexes.includes(item.index()));
|
|
381
|
-
if (this.isItemLimitReached()) {
|
|
382
|
-
return [[], this._itemsToValue(itemsToBeSelected)];
|
|
383
|
-
}
|
|
384
|
-
let itemsSelectedCount = 0;
|
|
385
|
-
const itemsSelected = [];
|
|
386
|
-
let itemsLeftUntilLimit = (this._ardParentComp.maxSelectedItems() ?? Infinity) - this.selectedItems().length;
|
|
387
|
-
for (const item of itemsToBeSelected) {
|
|
388
|
-
itemsSelectedCount++;
|
|
389
|
-
if (item.selected())
|
|
390
|
-
continue;
|
|
391
|
-
if (itemsLeftUntilLimit <= 0) {
|
|
392
|
-
break;
|
|
393
|
-
}
|
|
394
|
-
itemsLeftUntilLimit--;
|
|
395
|
-
item.selected.set(true);
|
|
396
|
-
itemsSelected.push(item);
|
|
397
|
-
}
|
|
398
|
-
const itemsFailedToSelect = itemsToBeSelected.slice(itemsSelectedCount - 1);
|
|
399
|
-
return [this._itemsToValue(itemsSelected), this._itemsToValue(itemsFailedToSelect)];
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Unselects one or multiple items.
|
|
403
|
-
* @param items A rest operator array of item indexes to be unselected.
|
|
404
|
-
* @returns An array of items unselected, mapped to only their values.
|
|
405
|
-
*/
|
|
406
|
-
unselectItem(...indexes) {
|
|
407
|
-
const itemsToBeUnselected = this._items().filter(item => indexes.includes(item.index()));
|
|
408
|
-
for (const item of itemsToBeUnselected) {
|
|
409
|
-
item.selected.set(false);
|
|
410
|
-
}
|
|
411
|
-
return this._itemsToValue(itemsToBeUnselected);
|
|
412
|
-
}
|
|
413
|
-
//! highlighting items
|
|
414
|
-
/**
|
|
415
|
-
* Unhighlights all currently highlighted items.
|
|
416
|
-
*/
|
|
417
|
-
unhighlightAll() {
|
|
418
|
-
const highlighted = this.highlightedItems();
|
|
419
|
-
for (const item of highlighted) {
|
|
420
|
-
item.highlighted.set(false);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
|
-
* Highlights the given item, while unhighlighting all other items. Does nothing when the item is disabled.
|
|
425
|
-
* @param item The index of the item to be highlighted.
|
|
426
|
-
* @returns The highlighted item.
|
|
427
|
-
*/
|
|
428
|
-
highlightSingleItem(index) {
|
|
429
|
-
this.unhighlightAll();
|
|
430
|
-
return this.highlightItem(index);
|
|
431
|
-
}
|
|
432
|
-
/**
|
|
433
|
-
* Highlights all given items.
|
|
434
|
-
* @param items A rest operator array of item indexes to be highlighted.
|
|
435
|
-
* @returns The last highlighted item.
|
|
436
|
-
*/
|
|
437
|
-
highlightItem(...indexes) {
|
|
438
|
-
const items = this._items().filter(item => indexes.includes(item.index()));
|
|
439
|
-
for (const item of items) {
|
|
440
|
-
item.highlighted.set(true);
|
|
441
|
-
}
|
|
442
|
-
return items.last();
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* Unhighlights all given items.
|
|
446
|
-
* @param items A rest operator array of item indexes to be unhighlighted.
|
|
447
|
-
*/
|
|
448
|
-
unhighlightItem(...indexes) {
|
|
449
|
-
const items = this._items().filter(item => indexes.includes(item.index()));
|
|
450
|
-
for (const item of items) {
|
|
451
|
-
if (!item || !item.highlighted())
|
|
452
|
-
return;
|
|
453
|
-
item.highlighted.set(false);
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
/**
|
|
457
|
-
* Highlights the first item out of all items.
|
|
458
|
-
* @returns The highlighted item.
|
|
459
|
-
*/
|
|
460
|
-
highlightFirstItem() {
|
|
461
|
-
this.unhighlightAll();
|
|
462
|
-
const itemToHighlight = this.highlightableItems().first().index();
|
|
463
|
-
return this.highlightItem(itemToHighlight);
|
|
464
|
-
}
|
|
465
|
-
/**
|
|
466
|
-
* Highlights the last item out of all items.
|
|
467
|
-
* @returns The highlighted item.
|
|
468
|
-
*/
|
|
469
|
-
highlightLastItem() {
|
|
470
|
-
this.unhighlightAll();
|
|
471
|
-
const itemToHighlight = this.highlightableItems().last().index();
|
|
472
|
-
return this.highlightItem(itemToHighlight);
|
|
473
|
-
}
|
|
474
|
-
/**
|
|
475
|
-
* Highlights all non-disabled items.
|
|
476
|
-
*/
|
|
477
|
-
highlightAllItems() {
|
|
478
|
-
const itemsToHighlight = this.highlightableItems().map(v => v.index());
|
|
479
|
-
this.highlightItem(...itemsToHighlight);
|
|
480
|
-
}
|
|
481
|
-
/**
|
|
482
|
-
* Highlights the next non-disabled item defined by the offset amount.
|
|
483
|
-
*
|
|
484
|
-
* If `hasShift` is set to true, all originally highlighted items are kept. Otherwise, all original items are unselected.
|
|
485
|
-
* @param offset The amount of items to offset the highlight by.
|
|
486
|
-
* @param hasShift Whether the user has the shift key pressed.
|
|
487
|
-
* @returns The item highlighted.
|
|
488
|
-
*/
|
|
489
|
-
highlightNextItem(offset, hasShift) {
|
|
490
|
-
if (!this.isAnyItemHighlighted()) {
|
|
491
|
-
return this.highlightFirstItem();
|
|
492
|
-
}
|
|
493
|
-
const currentItem = this.highlightedItems().last();
|
|
494
|
-
const itemsWithoutDisabled = this._items().filter(item => !item.disabled() && (!this.isItemLimitReached() || item.selected()));
|
|
495
|
-
const currentIndexInItems = itemsWithoutDisabled.findIndex(item => item.index() === currentItem.index());
|
|
496
|
-
let nextItemIndex = currentIndexInItems + offset;
|
|
497
|
-
if (nextItemIndex >= itemsWithoutDisabled.length) {
|
|
498
|
-
nextItemIndex -= itemsWithoutDisabled.length;
|
|
499
|
-
}
|
|
500
|
-
if (nextItemIndex < 0) {
|
|
501
|
-
nextItemIndex += itemsWithoutDisabled.length;
|
|
502
|
-
}
|
|
503
|
-
const itemToHighlight = itemsWithoutDisabled[nextItemIndex];
|
|
504
|
-
if (hasShift) {
|
|
505
|
-
if (itemToHighlight.highlighted()) {
|
|
506
|
-
this.unhighlightItem(nextItemIndex);
|
|
507
|
-
}
|
|
508
|
-
return this.highlightItem(nextItemIndex);
|
|
509
|
-
}
|
|
510
|
-
return this.highlightSingleItem(nextItemIndex);
|
|
511
|
-
}
|
|
512
|
-
toggleCurrentSortColumn(column) {
|
|
513
|
-
if (this._currentSortColumn === column) {
|
|
514
|
-
if (this._currentSortType === SortType.Ascending) {
|
|
515
|
-
this._currentSortType = SortType.Descending;
|
|
516
|
-
}
|
|
517
|
-
else {
|
|
518
|
-
this._currentSortType = SortType.Ascending;
|
|
519
|
-
}
|
|
520
|
-
this._generateSortedRows(true);
|
|
521
|
-
return;
|
|
522
|
-
}
|
|
523
|
-
this._currentSortColumn = column;
|
|
524
|
-
this._currentSortType = SortType.Ascending;
|
|
525
|
-
this._generateSortedRows();
|
|
526
|
-
}
|
|
527
|
-
resetSort() {
|
|
528
|
-
this._currentSortColumn = null;
|
|
529
|
-
this._currentSortType = null;
|
|
530
|
-
this._sortedItems.set([...this.items()]);
|
|
531
|
-
}
|
|
532
|
-
getColumnSortType(column) {
|
|
533
|
-
if (this._currentSortColumn === column) {
|
|
534
|
-
return this._currentSortType;
|
|
535
|
-
}
|
|
536
|
-
return null;
|
|
537
|
-
}
|
|
538
|
-
_generateSortedRows(justReverse) {
|
|
539
|
-
if (justReverse) {
|
|
540
|
-
this._sortedItems.update(v => [...v.reverse()]);
|
|
541
|
-
return;
|
|
542
|
-
}
|
|
543
|
-
const sortColumnIndex = this._currentSortColumn;
|
|
544
|
-
if (isNull(sortColumnIndex) || !this._currentSortType) {
|
|
545
|
-
this._sortedItems.set(this.items());
|
|
546
|
-
return;
|
|
547
|
-
}
|
|
548
|
-
const sortColumn = this._dataColumns()[sortColumnIndex];
|
|
549
|
-
if (!sortColumn) {
|
|
550
|
-
throw new Error(`ARD-IS5059: Encountered an issue in <ard-table>: could not find the column with index ${sortColumnIndex}. This is most likely an Ardium UI bug, please report it to the creators.`);
|
|
551
|
-
}
|
|
552
|
-
const direction = this._currentSortType === SortType.Ascending ? 1 : -1;
|
|
553
|
-
const sortFn = sortColumn.sortFn ??
|
|
554
|
-
((a, b) => {
|
|
555
|
-
if (a > b)
|
|
556
|
-
return direction;
|
|
557
|
-
if (a < b)
|
|
558
|
-
return -1 * direction;
|
|
559
|
-
return 0;
|
|
560
|
-
});
|
|
561
|
-
this._sortedItems.set([...this.items()].sort((a, b) => sortFn(a.data()[sortColumnIndex], b.data()[sortColumnIndex])));
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaXRlbS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS1pdGVtLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUxRCxPQUFPLEVBQUUsUUFBUSxFQUFtQix1QkFBdUIsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU3RSxNQUFNLE9BQU8sV0FBVztJQXdCdEIsWUFDRSxRQUFhLEVBQ2IsS0FBYSxFQUNiLElBQVcsRUFDWCxXQUE4QixFQUM5QixRQUFpQixFQUNqQixJQUFhLEVBQ2IsT0FBTyxHQUFHLEtBQUs7UUE5QkEsY0FBUyxHQUFHLE1BQU0sQ0FBTSxTQUFTLENBQUMsQ0FBQztRQUMzQyxhQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUvQixXQUFNLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsVUFBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFekIsYUFBUSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUMxQyxZQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUU3QixVQUFLLEdBQUcsTUFBTSxDQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLFNBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxD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QUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztnQkFDakMsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4SCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaWduYWwsIGNvbXB1dGVkLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgcmVzb2x2ZVBhdGggfSBmcm9tICdyZXNvbHZlLW9iamVjdC1wYXRoJztcclxuaW1wb3J0IHsgZXZhbHVhdGUsIGlzRGVmaW5lZCwgaXNOdWxsIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xyXG5pbXBvcnQgeyBOdWxsYWJsZSB9IGZyb20gJy4uL3R5cGVzL3V0aWxpdHkudHlwZXMnO1xyXG5pbXBvcnQgeyBTb3J0VHlwZSwgVGFibGVEYXRhQ29sdW1uLCBUYWJsZVBhZ2luYXRpb25TdHJhdGVneSwgVGFibGVTdWJoZWFkZXIgfSBmcm9tICcuL3RhYmxlLnR5cGVzJztcclxuaW1wb3J0IHsgYXJlQWxsRGF0YUNvbHVtbnMsIGlzVGFibGVTdWJoZWFkZXIsIG1lcmdlMmRBcnJheXMgfSBmcm9tICcuL3V0aWxzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBBcmRUYWJsZVJvdyB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfaXRlbURhdGEgPSBzaWduYWw8YW55Pih1bmRlZmluZWQpO1xyXG4gIHJlYWRvbmx5IGl0ZW1EYXRhID0gdGhpcy5faXRlbURhdGEuYXNSZWFkb25seSgpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9pbmRleCA9IHNpZ25hbDxudW1iZXI+KC0xKTtcclxuICByZWFkb25seSBpbmRleCA9IHRoaXMuX2luZGV4LmFzUmVhZG9ubHkoKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfaXNFbXB0eSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcbiAgcmVhZG9ubHkgaXNFbXB0eSA9IHRoaXMuX2lzRW1wdHkuYXNSZWFkb25seSgpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9kYXRhID0gc2lnbmFsPGFueVtdPihbXSk7XHJcbiAgcmVhZG9ubHkgZGF0YSA9IHRoaXMuX2RhdGEuYXNSZWFkb25seSgpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9kYXRhQ29sdW1ucyA9IHNpZ25hbDxUYWJsZURhdGFDb2x1bW5bXT4oW10pO1xyXG4gIHJlYWRvbmx5IGRhdGFDb2x1bW5zID0gdGhpcy5fZGF0YUNvbHVtbnMuYXNSZWFkb25seSgpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9jbGFzcyA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcclxuICByZWFkb25seSBjbGFzcyA9IHRoaXMuX2NsYXNzLmFzUmVhZG9ubHkoKTtcclxuXHJcbiAgcmVhZG9ubHkgZGlzYWJsZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHJlYWRvbmx5IGJvbGQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHJlYWRvbmx5IHNlbGVjdGVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICByZWFkb25seSBoaWdobGlnaHRlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgaXRlbURhdGE6IGFueSxcclxuICAgIGluZGV4OiBudW1iZXIsXHJcbiAgICBkYXRhOiBhbnlbXSxcclxuICAgIGRhdGFDb2x1bW5zOiBUYWJsZURhdGFDb2x1bW5bXSxcclxuICAgIGRpc2FibGVkOiBib29sZWFuLFxyXG4gICAgYm9sZDogYm9vbGVhbixcclxuICAgIGlzRW1wdHkgPSBmYWxzZVxyXG4gICkge1xyXG4gICAgdGhpcy5faXRlbURhdGEuc2V0KGl0ZW1EYXRhKTtcclxuICAgIHRoaXMuX2luZGV4LnNldChpbmRleCk7XHJcbiAgICB0aGlzLl9kYXRhLnNldChkYXRhKTtcclxuICAgIHRoaXMuX2RhdGFDb2x1bW5zLnNldChkYXRhQ29sdW1ucyk7XHJcbiAgICB0aGlzLmRpc2FibGVkLnNldChkaXNhYmxlZCk7XHJcbiAgICB0aGlzLmJvbGQuc2V0KGJvbGQpO1xyXG4gICAgdGhpcy5faXNFbXB0eS5zZXQoaXNFbXB0eSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBuZXdFbXB0eUNlbGwoaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIG5ldyBBcmRUYWJsZVJvdyhudWxsLCBpbmRleCwgW10sIFtdLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlSXRlbVN0b3JhZ2VIb3N0IHtcclxuICByZWFkb25seSByb3dEaXNhYmxlZEZyb206IFNpZ25hbDxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IHJvd0JvbGRGcm9tOiBTaWduYWw8c3RyaW5nPjtcclxuICByZWFkb25seSBpbnZlcnRSb3dEaXNhYmxlZDogU2lnbmFsPGJvb2xlYW4+O1xyXG4gIHJlYWRvbmx5IGludmVydFJvd0JvbGQ6IFNpZ25hbDxib29sZWFuPjtcclxuICByZWFkb25seSBkYXRhOiBTaWduYWw8TnVsbGFibGU8YW55Pj5bXTtcclxuICByZWFkb25seSBtYXhTZWxlY3RlZEl0ZW1zOiBTaWduYWw8TnVsbGFibGU8bnVtYmVyPj47XHJcbiAgcmVhZG9ubHkgdHJlYXREYXRhU291cmNlQXNTdHJpbmc6IFNpZ25hbDxib29sZWFuPjtcclxuXHJcbiAgcmVhZG9ubHkgcGFnaW5hdGVkOiBTaWduYWw8Ym9vbGVhbj47XHJcbiAgcmVhZG9ubHkgcGFnaW5hdGlvblN0cmF0ZWd5OiBTaWduYWw8VGFibGVQYWdpbmF0aW9uU3RyYXRlZ3k+O1xyXG4gIHJlYWRvbmx5IGl0ZW1zUGVyUGFnZTogU2lnbmFsPG51bWJlcj47XHJcbiAgcmVhZG9ubHkgcGFnZTogU2lnbmFsPG51bWJlcj47XHJcbn1cclxuZXhwb3J0IGNsYXNzIEhlYWRlckNlbGwge1xyXG4gIHJlYWRvbmx5IGNlbGwgPSBzaWduYWw8VGFibGVEYXRhQ29sdW1uIHwgVGFibGVTdWJoZWFkZXI+KHVuZGVmaW5lZCBhcyBhbnkpO1xyXG4gIHJlYWRvbmx5IGNvbHNwYW4gPSBzaWduYWw8bnVtYmVyPigxKTtcclxuICByZWFkb25seSByb3dzcGFuID0gc2lnbmFsPG51bWJlcj4oMSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNlbGw6IFRhYmxlRGF0YUNvbHVtbiB8IFRhYmxlU3ViaGVhZGVyLCBjb2xzcGFuID0gMSwgcm93c3BhbiA9IDEpIHtcclxuICAgIHRoaXMuY2VsbC5zZXQoY2VsbCk7XHJcbiAgICB0aGlzLmNvbHNwYW4uc2V0KGNvbHNwYW4pO1xyXG4gICAgdGhpcy5yb3dzcGFuLnNldChyb3dzcGFuKTtcclxuICB9XHJcblxyXG4gIGdldCB3aWR0aCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IGNlbGwgPSB0aGlzLmNlbGwoKTtcclxuICAgIGlmIChpc1RhYmxlU3ViaGVhZGVyKGNlbGwpKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLl9nZXRXaWR0aChjZWxsLndpZHRoKTtcclxuICB9XHJcbiAgZ2V0IG1pbldpZHRoKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgY2VsbCA9IHRoaXMuY2VsbCgpO1xyXG4gICAgaWYgKGlzVGFibGVTdWJoZWFkZXIoY2VsbCkpIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldFdpZHRoKGNlbGwubWluV2lkdGgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUaHJhbnNmb3JtcyBhIG51bWVyaWMgd2lkdGggaW50byBhIENTUyBzdHJpbmcgaWYgbmVlZGVkLiBQdXJlIGZ1bmN0aW9uLlxyXG4gICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggdG8gYmUgY29udmVydGVkLlxyXG4gICAqIEByZXR1cm5zIFRoZSB3aWR0aCBleHByZXNzZWQgYXMgYSBDU1MtY29tcGF0aWJsZSBzdHJpbmcgb3IgbnVsbC5cclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRXaWR0aCh3aWR0aDogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIXdpZHRoKSByZXR1cm4gbnVsbDtcclxuICAgIGlmICh0eXBlb2Ygd2lkdGggPT09ICdudW1iZXInKSByZXR1cm4gYCR7d2lkdGh9cHhgO1xyXG4gICAgcmV0dXJuIHdpZHRoO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlSXRlbVN0b3JhZ2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2l0ZW1zID0gc2lnbmFsPEFyZFRhYmxlUm93W10+KFtdKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9zb3J0ZWRJdGVtcyA9IHNpZ25hbDxBcmRUYWJsZVJvd1tdPihbXSk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGFDb2x1bW5zID0gc2lnbmFsPFRhYmxlRGF0YUNvbHVtbltdPihbXSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGVyQ2VsbHMgPSBzaWduYWw8SGVhZGVyQ2VsbFtdW10+KFtdKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfYXJkUGFyZW50Q29tcDogVGFibGVJdGVtU3RvcmFnZUhvc3QpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgYWxsIGl0ZW1zLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGl0ZW1zID0gdGhpcy5faXRlbXMuYXNSZWFkb25seSgpO1xyXG4gIHJlYWRvbmx5IHNvcnRlZEl0ZW1zID0gdGhpcy5fc29ydGVkSXRlbXMuYXNSZWFkb25seSgpO1xyXG4gIC8qKlxyXG4gICAqIEdldHMgaXRlbXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgcGFnaW5hdGlvbiBzdGF0ZS5cclxuICAgKi9cclxuICByZWFkb25seSBwYWdpbmF0ZWRJdGVtcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGlmICghdGhpcy5fYXJkUGFyZW50Q29tcC5wYWdpbmF0ZWQoKSB8fCB0aGlzLl9hcmRQYXJlbnRDb21wLnBhZ2luYXRpb25TdHJhdGVneSgpID09PSBUYWJsZVBhZ2luYXRpb25TdHJhdGVneS5Ob29wKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNvcnRlZEl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYWdlID0gdGhpcy5fYXJkUGFyZW50Q29tcC5wYWdlKCk7XHJcbiAgICBjb25zdCBJUFAgPSB0aGlzLl9hcmRQYXJlbnRDb21wLml0ZW1zUGVyUGFnZSgpO1xyXG4gICAgY29uc3QgaXRlbXNTdGFydCA9IChwYWdlIC0gMSkgKiBJUFA7XHJcbiAgICBjb25zdCBpdGVtc0VuZCA9IHBhZ2UgKiBJUFA7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWRJdGVtcygpLnNsaWNlKGl0ZW1zU3RhcnQsIGl0ZW1zRW5kKTtcclxuICB9KTtcclxuICAvKipcclxuICAgKiBHZXRzIGFsbCBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMuXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgc2VsZWN0ZWRJdGVtcyA9IGNvbXB1dGVkPEFyZFRhYmxlUm93W10+KCgpID0+IHRoaXMuaXRlbXMoKS5maWx0ZXIoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKCkpKTtcclxuICAvKipcclxuICAgKiBHZXRzIGFsbCBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgaXRlbXMuXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgaGlnaGxpZ2h0ZWRJdGVtcyA9IGNvbXB1dGVkPEFyZFRhYmxlUm93W10+KCgpID0+IHRoaXMuaXRlbXMoKS5maWx0ZXIoaXRlbSA9PiBpdGVtLmhpZ2hsaWdodGVkKCkpKTtcclxuICAvKipcclxuICAgKiBHZXRzIGFsbCBoaWdobGlnaHRhYmxlIGl0ZW1zLiBBbiBpdGVtIGlzIGNvbnNpZGVyZWQgaGlnaGxpZ2h0YWJsZSBpZiBpdCBpcyAqKm5vdCoqIGRpc2FibGVkLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGhpZ2hsaWdodGFibGVJdGVtcyA9IGNvbXB1dGVkPEFyZFRhYmxlUm93W10+KCgpID0+IHRoaXMuX2l0ZW1zKCkuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQoKSkpO1xyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIHZhbHVlcyBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW1zLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHZhbHVlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5faXRlbXNUb1ZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcygpKSk7XHJcbiAgLyoqXHJcbiAgICogTWFwcyBhbiBhcnJheSBvZiBpdGVtcyBpbnRvIHRoZWlyIHZhbHVlcy5cclxuICAgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIHRvIGNvbnZlcnQgdG8gdmFsdWUuXHJcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgaXRlbSB2YWx1ZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfaXRlbXNUb1ZhbHVlKGl0ZW1zOiBBcmRUYWJsZVJvd1tdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIGl0ZW1zLm1hcChpdGVtID0+IGl0ZW0uaXRlbURhdGEoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIGl0ZW0gaXMgaGlnaGxpZ2h0ZWQsIG90aGVyd2lzZSBmYWxzZS5cclxuICAgKi9cclxuICByZWFkb25seSBpc0FueUl0ZW1IaWdobGlnaHRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGlnaGxpZ2h0ZWRJdGVtcygpLmxlbmd0aCA+IDApO1xyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBhbnkgaXRlbSBpbiB0aGUgdGFibGUgaXMgc2VsZWN0ZWQuXHJcbiAgICogQHJldHVybnMgQSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgYW55IGl0ZW0gaXMgc2VsZWN0ZWQuXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgaXNBbnlJdGVtU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlbGVjdGVkSXRlbXMoKS5sZW5ndGggPiAwKTtcclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgYWxsIGl0ZW1zIGluIHRoZSB0YWJsZSBhcmUgc2VsZWN0ZWQuXHJcbiAgICogQHJldHVybnMgQSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgYWxsIGl0ZW1zIGFyZSBzZWxlY3RlZC5cclxuICAgKi9cclxuICByZWFkb25seSBhcmVBbGxTZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0ZWRJdGVtcygpLmxlbmd0aCA9PT0gdGhpcy5faXRlbXMoKS5maWx0ZXIoaXRlbSA9PiAhaXRlbS5kaXNhYmxlZCgpKS5sZW5ndGgpO1xyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyZW50IGNvbXBvbmVudCBkZWZpbmVzIHRoZSBsaW1pdCBvZiBjb25jdXJyZW50bHkgc2VsZWN0YWJsZSBpdGVtcyBhbmQgdGhlIGFtb3VudCBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMgbWF0Y2hlcyB0aGF0IGxpbWl0LiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cclxuICAgKlxyXG4gICAqICoqVExEUioqOiB0cnVlIGlmIGBtYXhTZWxlY3RlZEl0ZW1zYCBpcyBkZWZpbmVkIGFuZCB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGl0ZW1zIG1hdGNoZXMgdGhhdCB2YWx1ZS5cclxuICAgKi9cclxuICByZWFkb25seSBpc0l0ZW1MaW1pdFJlYWNoZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBtYXggPSB0aGlzLl9hcmRQYXJlbnRDb21wLm1heFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGlmICghaXNEZWZpbmVkKG1heCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1heCA8PSB0aGlzLnNlbGVjdGVkSXRlbXMoKS5sZW5ndGg7XHJcbiAgfSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGhlYWRlciBjZWxscyBvZiB0aGUgdGFibGUuXHJcbiAgICogQHJldHVybnMgYSAyRCBhcnJheSBvZiBoZWFkZXIgY2VsbHMuXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgaGVhZGVyQ2VsbHMgPSB0aGlzLl9oZWFkZXJDZWxscy5hc1JlYWRvbmx5KCk7XHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIHRoZSB0YWJsZSBoYXMgZGVmaW5lZCBjb2x1bW5zLlxyXG4gICAqIEByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSB0YWJsZSBoYXMgZGVmaW5lZCBjb2x1bW5zLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGhhc0RlZmluZWRDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZGF0YUNvbHVtbnMoKS5sZW5ndGggPiAwKTtcclxuXHJcbiAgLy8hIHNldHRpbmcgY29sdW1uc1xyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGNvbHVtbnMgb2YgdGhlIHRhYmxlLlxyXG4gICAqIEBwYXJhbSBjb2xzIGFuIGFycmF5IG9mIHRhYmxlIGRhdGEgY29sdW1ucyBvciB0YWJsZSBzdWJoZWFkZXJzLlxyXG4gICAqL1xyXG4gIHNldENvbHVtbnMoY29sczogKFRhYmxlRGF0YUNvbHVtbiB8IFRhYmxlU3ViaGVhZGVyKVtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBtYXhOZXN0aW5nTGV2ZWwgPSB0aGlzLl9nZXRIZWFkZXJNYXhOZXN0aW5nKGNvbHMpO1xyXG4gICAgY29uc3QgaGVhZGVyQ2VsbHMgPSB0aGlzLl9tYXBDb2x1bW5zVG9BcnJheShjb2xzLCBtYXhOZXN0aW5nTGV2ZWwsIDApO1xyXG4gICAgdGhpcy5faGVhZGVyQ2VsbHMuc2V0KHRoaXMuX2ZpbHRlckhlYWRlckNlbGxzKGhlYWRlckNlbGxzKSk7XHJcbiAgICB0aGlzLl9kYXRhQ29sdW1ucy5zZXQodGhpcy5fZXh0cmFjdERhdGFTb3VyY2VzKGNvbHMpKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRmlsdGVycyBvdXQgbnVsbCB2YWx1ZXMgZnJvbSB0aGUgaGVhZGVyIGNlbGxzIGFycmF5LiBQdXJlIGZ1bmN0aW9uLlxyXG4gICAqIEBwYXJhbSBjZWxscyBhIDJEIGFycmF5IG9mIGhlYWRlciBjZWxscyBvciBudWxsIHZhbHVlcy5cclxuICAgKiBAcmV0dXJucyBhIDJEIGFycmF5IG9mIGhlYWRlciBjZWxscyB3aXRob3V0IG51bGwgdmFsdWVzIGFuZCBlbXB0eSBhcnJheXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZmlsdGVySGVhZGVyQ2VsbHMoY2VsbHM6IChIZWFkZXJDZWxsIHwgbnVsbClbXVtdKTogSGVhZGVyQ2VsbFtdW10ge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjZWxsc1tpXSA9IGNlbGxzW2ldLmZpbHRlcih2ID0+IHYgIT09IG51bGwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNlbGxzLmZpbHRlcihyb3cgPT4gcm93Lmxlbmd0aCkgYXMgSGVhZGVyQ2VsbFtdW107XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEV4dHJhY3RzIHRoZSBkYXRhIHNvdXJjZXMgZnJvbSB0aGUgY29sdW1ucyBhcnJheS4gUHVyZSBmdW5jdGlvbi5cclxuICAgKiBAcGFyYW0gY29scyBhbiBhcnJheSBvZiB0YWJsZSBkYXRhIGNvbHVtbnMgb3IgdGFibGUgc3ViaGVhZGVycy5cclxuICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiB0YWJsZSBkYXRhIGNvbHVtbnMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdERhdGFTb3VyY2VzKGNvbHM6IChUYWJsZURhdGFDb2x1bW4gfCBUYWJsZVN1YmhlYWRlcilbXSk6IFRhYmxlRGF0YUNvbHVtbltdIHtcclxuICAgIGNvbnN0IGRhdGFDb2x1bW5zOiBUYWJsZURhdGFDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHMpIHtcclxuICAgICAgaWYgKCFpc1RhYmxlU3ViaGVhZGVyKGNvbCkpIHtcclxuICAgICAgICBkYXRhQ29sdW1ucy5wdXNoKGNvbCk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgZGF0YUNvbHVtbnMucHVzaCguLi50aGlzLl9leHRyYWN0RGF0YVNvdXJjZXMoY29sLmNoaWxkcmVuKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGFDb2x1bW5zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBtYXhpbXVtIG5lc3RpbmcgbGV2ZWwgb2YgdGhlIGNvbHVtbnMgYXJyYXkuIFB1cmUgZnVuY3Rpb24uXHJcbiAgICogQHBhcmFtIGNvbHMgYW4gYXJyYXkgb2YgdGFibGUgZGF0YSBjb2x1bW5zIG9yIHRhYmxlIHN1YmhlYWRlcnMuXHJcbiAgICogQHJldHVybnMgdGhlIG1heGltdW0gbmVzdGluZyBsZXZlbCBhcyBhIG51bWJlci5cclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRIZWFkZXJNYXhOZXN0aW5nKGNvbHM6IChUYWJsZURhdGFDb2x1bW4gfCBUYWJsZVN1YmhlYWRlcilbXSk6IG51bWJlciB7XHJcbiAgICBpZiAoYXJlQWxsRGF0YUNvbHVtbnMoY29scykpIHJldHVybiAxO1xyXG4gICAgbGV0IG1heCA9IDE7XHJcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2xzLmZpbHRlcih2ID0+IGlzVGFibGVTdWJoZWFkZXIodikpIGFzIFRhYmxlU3ViaGVhZGVyW10pIHtcclxuICAgICAgY29uc3QgaGVpZ2h0ID0gMSArIHRoaXMuX2dldEhlYWRlck1heE5lc3RpbmcoY29sLmNoaWxkcmVuKTtcclxuICAgICAgaWYgKGhlaWdodCA+IG1heCkgbWF4ID0gaGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1heDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTWFwcyB0aGUgY29sdW1ucyB0cmVlIHRvIGEgMkQgYXJyYXkgb2YgaGVhZGVyIGNlbGxzIG9yIG51bGwgdmFsdWVzLiBQdXJlIGZ1bmN0aW9uLlxyXG4gICAqIEBwYXJhbSBjb2xzIGFuIGFycmF5IG9mIHRhYmxlIGRhdGEgY29sdW1ucyBvciB0YWJsZSBzdWJoZWFkZXJzLlxyXG4gICAqIEBwYXJhbSBtYXhOZXN0aW5nIHRoZSBtYXhpbXVtIG5lc3RpbmcgbGV2ZWwgb2YgdGhlIGNvbHVtbnMgYXJyYXkuXHJcbiAgICogQHBhcmFtIGN1cnJlbnROZXN0aW5nIHRoZSBjdXJyZW50IG5lc3RpbmcgbGV2ZWwgb2YgdGhlIGNvbHVtbnMgYXJyYXkuXHJcbiAgICogQHJldHVybnMgYSAyRCBhcnJheSBvZiBoZWFkZXIgY2VsbHMgb3IgbnVsbCB2YWx1ZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfbWFwQ29sdW1uc1RvQXJyYXkoXHJcbiAgICBjb2xzOiAoVGFibGVEYXRhQ29sdW1uIHwgVGFibGVTdWJoZWFkZXIpW10sXHJcbiAgICBtYXhOZXN0aW5nOiBudW1iZXIsXHJcbiAgICBjdXJyZW50TmVzdGluZzogbnVtYmVyXHJcbiAgKTogKEhlYWRlckNlbGwgfCBudWxsKVtdW10ge1xyXG4gICAgaWYgKGFyZUFsbERhdGFDb2x1bW5zKGNvbHMpKSB7XHJcbiAgICAgIHJldHVybiBbY29scy5tYXAoY29sID0+IG5ldyBIZWFkZXJDZWxsKGNvbCwgMSwgbWF4TmVzdGluZyAtIGN1cnJlbnROZXN0aW5nKSldO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaGVhZGVyQ2VsbHM6IChIZWFkZXJDZWxsIHwgbnVsbClbXVtdID0gW1tdXTtcclxuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHMpIHtcclxuICAgICAgaWYgKCFpc1RhYmxlU3ViaGVhZGVyKGNvbCkpIHtcclxuICAgICAgICBoZWFkZXJDZWxsc1swXS5wdXNoKG5ldyBIZWFkZXJDZWxsKGNvbCwgMSwgbWF4TmVzdGluZyAtIGN1cnJlbnROZXN0aW5nKSk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY2hpbGRDZWxsczogKEhlYWRlckNlbGwgfCBudWxsKVtdW10gPSBbW10sIC4uLnRoaXMuX21hcENvbHVtbnNUb0FycmF5KGNvbC5jaGlsZHJlbiwgbWF4TmVzdGluZywgY3VycmVudE5lc3RpbmcgKyAxKV07XHJcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNoaWxkQ2VsbHMubGVuZ3RoIC0gMTtcclxuICAgICAgY29uc3Qgd2lkdGggPSBjaGlsZENlbGxzWzFdLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1xyXG4gICAgICAgIGhlYWRlckNlbGxzLnB1c2goW251bGxdKTtcclxuICAgICAgfVxyXG4gICAgICBoZWFkZXJDZWxsc1swXS5wdXNoKG5ldyBIZWFkZXJDZWxsKGNvbCwgd2lkdGgsIDEpKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aCAtIDE7IGkrKykge1xyXG4gICAgICAgIGhlYWRlckNlbGxzWzBdLnB1c2gobnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgbWVyZ2UyZEFycmF5cyhoZWFkZXJDZWxscywgY2hpbGRDZWxscyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaGVhZGVyQ2VsbHM7XHJcbiAgfVxyXG5cclxuICAvLyEgc2V0dGluZyBpdGVtc1xyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGNvbXBvbmVudCdzIGl0ZW1zLiBUYWtlcyBpbnRvIGFjY291bnQgdGhlIHZhbHVlcyBkZWZpbmVkIGJ5IHRoZSBwYXJlbnQgY29tcG9uZW50IGZvciBgcm93RGlzYWJsZWRGcm9tYCwgYHJvd0JvbGRGcm9tYCwgYW5kIGByb3dIaWdobGlnaHRlZEZyb21gLlxyXG4gICAqIEBwYXJhbSBpdGVtcyBBbiBhcnJheSBvZiBpdGVtcyB0byBiZSBzZXQgYXMgdGhlIGNvbXBvbmVudCdzIGl0ZW1zLlxyXG4gICAqL1xyXG4gIHNldEl0ZW1zKGl0ZW1zOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmhhc0RlZmluZWRDb2x1bW5zKCkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBtYXBwZWRJdGVtcyA9IGl0ZW1zLm1hcCgoaXRlbSwgaSkgPT4gdGhpcy5fc2V0SXRlbXNNYXBGbihpdGVtLCBpKSk7XHJcbiAgICB0aGlzLl9pdGVtcy5zZXQobWFwcGVkSXRlbXMpO1xyXG4gICAgdGhpcy5fc29ydGVkSXRlbXMuc2V0KG1hcHBlZEl0ZW1zKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTWFwcyByYXcgaXRlbSBkYXRhIHRvIGFuIHtAbGluayBBcmRUYWJsZVJvd30gb2JqZWN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnl9IHJhd0l0ZW1EYXRhIC0gVGhlIHJhdyBkYXRhIG9mIHRoZSBpdGVtLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbS5cclxuICAgKiBAcmV0dXJucyB7QXJkVGFibGVSb3d9IFJldHVybnMgYW4gQXJkVGFibGVSb3cgb2JqZWN0IHdpdGggbWFwcGVkIHByb3BlcnRpZXMuXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9zZXRJdGVtc01hcEZuKHJhd0l0ZW1EYXRhOiBhbnksIGluZGV4OiBudW1iZXIpOiBBcmRUYWJsZVJvdyB7XHJcbiAgICAvL2dldCBkYXRhXHJcbiAgICBjb25zdCBbZGF0YSwgZGF0YUNvbHVtbnNdID0gdGhpcy5fZ2V0Um93RGF0YShyYXdJdGVtRGF0YSwgaW5kZXgpO1xyXG5cclxuICAgIC8vZ2V0IGJvbGRcclxuICAgIGNvbnN0IHJvd0JvbGRGcm9tUGF0aCA9IHRoaXMuX2FyZFBhcmVudENvbXAucm93Qm9sZEZyb20oKTtcclxuICAgIGxldCBib2xkID0gcmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIHJvd0JvbGRGcm9tUGF0aCk7XHJcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5pbnZlcnRSb3dCb2xkKCkpIHtcclxuICAgICAgYm9sZCA9ICFib2xkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vZ2V0IGRpc2FibGVkXHJcbiAgICBjb25zdCBkaXNhYmxlZFBhdGggPSB0aGlzLl9hcmRQYXJlbnRDb21wLnJvd0Rpc2FibGVkRnJvbSgpO1xyXG4gICAgbGV0IGRpc2FibGVkID0gZXZhbHVhdGUocmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIGRpc2FibGVkUGF0aCkpO1xyXG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaW52ZXJ0Um93RGlzYWJsZWQoKSkge1xyXG4gICAgICBkaXNhYmxlZCA9ICFkaXNhYmxlZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IEFyZFRhYmxlUm93KHJhd0l0ZW1EYXRhLCBpbmRleCwgZGF0YSwgZGF0YUNvbHVtbnMsIGRpc2FibGVkLCBib2xkKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIGRhdGEgZm9yIGEgcm93IGJhc2VkIG9uIGRhdGEgY29sdW1ucyBjb25maWd1cmF0aW9uLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnl9IHJhd0l0ZW1EYXRhIC0gVGhlIHJhdyBkYXRhIG9mIHRoZSBpdGVtLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbS5cclxuICAgKiBAcmV0dXJucyB7YW55W119IFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcm93IGRhdGEuXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRSb3dEYXRhKHJhd0l0ZW1EYXRhOiBhbnksIGluZGV4OiBudW1iZXIpOiBbYW55W10sIFRhYmxlRGF0YUNvbHVtbltdXSB7XHJcbiAgICBjb25zdCBkYXRhOiBhbnlbXSA9IFtdO1xyXG4gICAgY29uc3QgX2NvbHMgPSB0aGlzLl9kYXRhQ29sdW1ucygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBfY29scy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBkYXRhQ29sdW1uID0gX2NvbHNbaV07XHJcbiAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBkYXRhQ29sdW1uLmRhdGFTb3VyY2U7XHJcblxyXG4gICAgICBpZiAodHlwZW9mIHNvdXJjZVBhdGggPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAudHJlYXREYXRhU291cmNlQXNTdHJpbmcoKSkge1xyXG4gICAgICAgICAgZGF0YS5wdXNoKHJhd0l0ZW1EYXRhW3NvdXJjZVBhdGhdKTtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhLnB1c2gocmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIHNvdXJjZVBhdGgpKTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc291cmNlUGF0aC50eXBlID09PSAnYXV0b2NvdW50Jykge1xyXG4gICAgICAgIGRhdGEucHVzaChpbmRleCArIDEpO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzb3VyY2VQYXRoLnR5cGUgPT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICBkYXRhLnB1c2goeyBfYXJkQ2hlY2tib3g6IHRydWUsIGluZGV4IH0pO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNvdXJjZVN0cmluZyA9IHR5cGVvZiBzb3VyY2VQYXRoID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KHNvdXJjZVBhdGgpIDogc291cmNlUGF0aDtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBUkQtRlQ1MDUyOiBVbmV4cGVjdGVkIGRhdGEgc291cmNlIFwiJHtzb3VyY2VTdHJpbmd9XCIgYXQgaW5kZXggJHtpfS5gKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbZGF0YSwgdGhpcy5fZGF0YUNvbHVtbnMoKV07XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFdyaXRlcyBhIG5ldyB2YWx1ZSB0byB0aGUgaXRlbSBzdG9yYWdlLiBTZWxlY3RzIHRoZSBjb3JyZWN0IGl0ZW1zIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB2YWx1ZXMsIHdhcm5pbmcgdGhlIHVzZXIgaWYgdGhlIHZhbHVlIGlzIG5vdCBmb3VuZC5cclxuICAgKiBAcGFyYW0gaW5kZXhlcyBUaGUgdmFsdWUgb2YgdGhlIG5nTW9kZWwgdG8gc2V0LlxyXG4gICAqL1xyXG4gIHdyaXRlVmFsdWUoaW5kZXhlczogbnVtYmVyW10pOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZvcmNlVW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuc2VsZWN0SXRlbSguLi5pbmRleGVzKTtcclxuICB9XHJcblxyXG4gIC8vISBzZWxlY3RpbmcgaXRlbXNcclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgYW4gaXRlbSB3aXRoIHRoZSBnaXZlbiBpbmRleCBpcyBzZWxlY3RlZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gY2hlY2suXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59IF90cnVlXyBpZiB0aGUgaXRlbSBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIF9mYWxzZV8uXHJcbiAgICovXHJcbiAgaXNJdGVtU2VsZWN0ZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcygpLnNvbWUoaXRlbSA9PiBpdGVtLmluZGV4KCkgPT09IGluZGV4KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2VsZWN0cyBhbGwgaXRlbXMuXHJcbiAgICpcclxuICAgKiBBY2NvdW50cyBmb3IgdGhlIGxpbWl0IG9mIGNvbmN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcyBkZWZpbmVkIGJ5IHRoZSBwYXJlbnQgY29tcG9uZW50LlxyXG4gICAqIEByZXR1cm5zIGEgdHVwbGUgY29udGFpbmluZyB0d28gYXJyYXlzOlxyXG4gICAqICogQW4gYXJyYXkgb2YgaXRlbXMgc2VsZWN0ZWQuXHJcbiAgICogKiBBbiBhcnJheSBvZiBpdGVtcyBmYWlsZWQgdG8gc2VsZWN0LlxyXG4gICAqL1xyXG4gIHNlbGVjdEFsbCgpOiBbYW55W10sIGFueVtdXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RJdGVtKC4uLnRoaXMuX2l0ZW1zKCkubWFwKHYgPT4gdi5pbmRleCgpKSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVuc2VsZWN0cyBhbGwgc2VsZWN0ZWQgaXRlbXMuXHJcbiAgICpcclxuICAgKiBJZiB0aGUgcGFyZW50IGNvbXBvbmVudCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWUgdG8gYmUgc2VsZWN0ZWQgYXQgYWxsIHRpbWVzLCB0aGUgZmlyc3Qgc2VsZWN0ZWQgaXRlbXMgaXMgbGVmdCBzZWxlY3RlZC5cclxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBpdGVtcyBjbGVhcmVkLCBtYXBwZWQgdG8gb25seSB0aGVpciB2YWx1ZXMuXHJcbiAgICovXHJcbiAgdW5zZWxlY3RBbGwoKTogYW55W10ge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBzZWxlY3RlZCkge1xyXG4gICAgICBpdGVtLnNlbGVjdGVkLnNldChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zVG9WYWx1ZShzZWxlY3RlZCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVuc2VsZWN0cyBhbGwgc2VsZWN0ZWQgaXRlbXMsIG5vIG1hdHRlciB3aGF0IHRoZSBjb21wb25lbnQgc2V0dGluZ3MgYXJlLlxyXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGl0ZW1zIGNsZWFyZWQsIG1hcHBlZCB0byBvbmx5IHRoZWlyIHZhbHVlcy5cclxuICAgKi9cclxuICBwcml2YXRlIF9mb3JjZVVuc2VsZWN0QWxsKCk6IGFueVtdIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc2VsZWN0ZWQpIHtcclxuICAgICAgaXRlbS5zZWxlY3RlZC5zZXQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9pdGVtc1RvVmFsdWUoc2VsZWN0ZWQpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZWxlY3RzIG9uZSBvciBtdWx0aXBsZSBpdGVtcy5cclxuICAgKlxyXG4gICAqIEFjY291bnRzIGZvciB0aGUgbGltaXQgb2YgY29uY3VycmVudGx5IHNlbGVjdGVkIGl0ZW1zIGRlZmluZWQgYnkgdGhlIHBhcmVudCBjb21wb25lbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaW5kZXhlcyBBIHJlc3Qgb3BlcmF0b3IgYXJyYXkgb2YgaXRlbSBpbmRleGVzIHRvIGJlIHNlbGVjdGVkLlxyXG4gICAqIEByZXR1cm5zIGEgdHVwbGUgY29udGFpbmluZyB0d28gYXJyYXlzOlxyXG4gICAqIC0gQW4gYXJyYXkgb2YgaXRlbXMgc2VsZWN0ZWQuXHJcbiAgICogLSBBbiBhcnJheSBvZiBpdGVtcyBmYWlsZWQgdG8gc2VsZWN0LlxyXG4gICAqL1xyXG4gIHNlbGVjdEl0ZW0oLi4uaW5kZXhlczogbnVtYmVyW10pOiBbYW55W10sIGFueVtdXSB7XHJcbiAgICBjb25zdCBpdGVtc1RvQmVTZWxlY3RlZCA9IHRoaXMuX2l0ZW1zKCkuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQoKSAmJiBpbmRleGVzLmluY2x1ZGVzKGl0ZW0uaW5kZXgoKSkpO1xyXG4gICAgaWYgKHRoaXMuaXNJdGVtTGltaXRSZWFjaGVkKCkpIHtcclxuICAgICAgcmV0dXJuIFtbXSwgdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zVG9CZVNlbGVjdGVkKV07XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGl0ZW1zU2VsZWN0ZWRDb3VudCA9IDA7XHJcbiAgICBjb25zdCBpdGVtc1NlbGVjdGVkID0gW107XHJcbiAgICBsZXQgaXRlbXNMZWZ0VW50aWxMaW1pdCA9ICh0aGlzLl9hcmRQYXJlbnRDb21wLm1heFNlbGVjdGVkSXRlbXMoKSA/PyBJbmZpbml0eSkgLSB0aGlzLnNlbGVjdGVkSXRlbXMoKS5sZW5ndGg7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXNUb0JlU2VsZWN0ZWQpIHtcclxuICAgICAgaXRlbXNTZWxlY3RlZENvdW50Kys7XHJcbiAgICAgIGlmIChpdGVtLnNlbGVjdGVkKCkpIGNvbnRpbnVlO1xyXG4gICAgICBpZiAoaXRlbXNMZWZ0VW50aWxMaW1pdCA8PSAwKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaXRlbXNMZWZ0VW50aWxMaW1pdC0tO1xyXG4gICAgICBpdGVtLnNlbGVjdGVkLnNldCh0cnVlKTtcclxuICAgICAgaXRlbXNTZWxlY3RlZC5wdXNoKGl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1zRmFpbGVkVG9TZWxlY3QgPSBpdGVtc1RvQmVTZWxlY3RlZC5zbGljZShpdGVtc1NlbGVjdGVkQ291bnQgLSAxKTtcclxuICAgIHJldHVybiBbdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zU2VsZWN0ZWQpLCB0aGlzLl9pdGVtc1RvVmFsdWUoaXRlbXNGYWlsZWRUb1NlbGVjdCldO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVbnNlbGVjdHMgb25lIG9yIG11bHRpcGxlIGl0ZW1zLlxyXG4gICAqIEBwYXJhbSBpdGVtcyBBIHJlc3Qgb3BlcmF0b3IgYXJyYXkgb2YgaXRlbSBpbmRleGVzIHRvIGJlIHVuc2VsZWN0ZWQuXHJcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgaXRlbXMgdW5zZWxlY3RlZCwgbWFwcGVkIHRvIG9ubHkgdGhlaXIgdmFsdWVzLlxyXG4gICAqL1xyXG4gIHVuc2VsZWN0SXRlbSguLi5pbmRleGVzOiBudW1iZXJbXSk6IGFueVtdIHtcclxuICAgIGNvbnN0IGl0ZW1zVG9CZVVuc2VsZWN0ZWQgPSB0aGlzLl9pdGVtcygpLmZpbHRlcihpdGVtID0+IGluZGV4ZXMuaW5jbHVkZXMoaXRlbS5pbmRleCgpKSk7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXNUb0JlVW5zZWxlY3RlZCkge1xyXG4gICAgICBpdGVtLnNlbGVjdGVkLnNldChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtc1RvQmVVbnNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIC8vISBoaWdobGlnaHRpbmcgaXRlbXNcclxuICAvKipcclxuICAgKiBVbmhpZ2hsaWdodHMgYWxsIGN1cnJlbnRseSBoaWdobGlnaHRlZCBpdGVtcy5cclxuICAgKi9cclxuICB1bmhpZ2hsaWdodEFsbCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGhpZ2hsaWdodGVkID0gdGhpcy5oaWdobGlnaHRlZEl0ZW1zKCk7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaGlnaGxpZ2h0ZWQpIHtcclxuICAgICAgaXRlbS5oaWdobGlnaHRlZC5zZXQoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBIaWdobGlnaHRzIHRoZSBnaXZlbiBpdGVtLCB3aGlsZSB1bmhpZ2hsaWdodGluZyBhbGwgb3RoZXIgaXRlbXMuIERvZXMgbm90aGluZyB3aGVuIHRoZSBpdGVtIGlzIGRpc2FibGVkLlxyXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBiZSBoaWdobGlnaHRlZC5cclxuICAgKiBAcmV0dXJucyBUaGUgaGlnaGxpZ2h0ZWQgaXRlbS5cclxuICAgKi9cclxuICBoaWdobGlnaHRTaW5nbGVJdGVtKGluZGV4OiBudW1iZXIpOiBBcmRUYWJsZVJvdyB8IG51bGwge1xyXG4gICAgdGhpcy51bmhpZ2hsaWdodEFsbCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SXRlbShpbmRleCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEhpZ2hsaWdodHMgYWxsIGdpdmVuIGl0ZW1zLlxyXG4gICAqIEBwYXJhbSBpdGVtcyBBIHJlc3Qgb3BlcmF0b3IgYXJyYXkgb2YgaXRlbSBpbmRleGVzIHRvIGJlIGhpZ2hsaWdodGVkLlxyXG4gICAqIEByZXR1cm5zIFRoZSBsYXN0IGhpZ2hsaWdodGVkIGl0ZW0uXHJcbiAgICovXHJcbiAgaGlnaGxpZ2h0SXRlbSguLi5pbmRleGVzOiBudW1iZXJbXSk6IEFyZFRhYmxlUm93IHtcclxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5faXRlbXMoKS5maWx0ZXIoaXRlbSA9PiBpbmRleGVzLmluY2x1ZGVzKGl0ZW0uaW5kZXgoKSkpO1xyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgIGl0ZW0uaGlnaGxpZ2h0ZWQuc2V0KHRydWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGl0ZW1zLmxhc3QoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVW5oaWdobGlnaHRzIGFsbCBnaXZlbiBpdGVtcy5cclxuICAgKiBAcGFyYW0gaXRlbXMgQSByZXN0IG9wZXJhdG9yIGFycmF5IG9mIGl0ZW0gaW5kZXhlcyB0byBiZSB1bmhpZ2hsaWdodGVkLlxyXG4gICAqL1xyXG4gIHVuaGlnaGxpZ2h0SXRlbSguLi5pbmRleGVzOiBudW1iZXJbXSk6IHZvaWQge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9pdGVtcygpLmZpbHRlcihpdGVtID0+IGluZGV4ZXMuaW5jbHVkZXMoaXRlbS5pbmRleCgpKSk7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKCFpdGVtIHx8ICFpdGVtLmhpZ2hsaWdodGVkKCkpIHJldHVybjtcclxuXHJcbiAgICAgIGl0ZW0uaGlnaGxpZ2h0ZWQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogSGlnaGxpZ2h0cyB0aGUgZmlyc3QgaXRlbSBvdXQgb2YgYWxsIGl0ZW1zLlxyXG4gICAqIEByZXR1cm5zIFRoZSBoaWdobGlnaHRlZCBpdGVtLlxyXG4gICAqL1xyXG4gIGhpZ2hsaWdodEZpcnN0SXRlbSgpOiBBcmRUYWJsZVJvdyB8IG51bGwge1xyXG4gICAgdGhpcy51bmhpZ2hsaWdodEFsbCgpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Ub0hpZ2hsaWdodCA9IHRoaXMuaGlnaGxpZ2h0YWJsZUl0ZW1zKCkuZmlyc3QoKS5pbmRleCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SXRlbShpdGVtVG9IaWdobGlnaHQpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBIaWdobGlnaHRzIHRoZSBsYXN0IGl0ZW0gb3V0IG9mIGFsbCBpdGVtcy5cclxuICAgKiBAcmV0dXJucyBUaGUgaGlnaGxpZ2h0ZWQgaXRlbS5cclxuICAgKi9cclxuICBoaWdobGlnaHRMYXN0SXRlbSgpOiBBcmRUYWJsZVJvdyB8IG51bGwge1xyXG4gICAgdGhpcy51bmhpZ2hsaWdodEFsbCgpO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1Ub0hpZ2hsaWdodCA9IHRoaXMuaGlnaGxpZ2h0YWJsZUl0ZW1zKCkubGFzdCgpLmluZGV4KCk7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRJdGVtKGl0ZW1Ub0hpZ2hsaWdodCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEhpZ2hsaWdodHMgYWxsIG5vbi1kaXNhYmxlZCBpdGVtcy5cclxuICAgKi9cclxuICBoaWdobGlnaHRBbGxJdGVtcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGl0ZW1zVG9IaWdobGlnaHQgPSB0aGlzLmhpZ2hsaWdodGFibGVJdGVtcygpLm1hcCh2ID0+IHYuaW5kZXgoKSk7XHJcbiAgICB0aGlzLmhpZ2hsaWdodEl0ZW0oLi4uaXRlbXNUb0hpZ2hsaWdodCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEhpZ2hsaWdodHMgdGhlIG5leHQgbm9uLWRpc2FibGVkIGl0ZW0gZGVmaW5lZCBieSB0aGUgb2Zmc2V0IGFtb3VudC5cclxuICAgKlxyXG4gICAqIElmIGBoYXNTaGlmdGAgaXMgc2V0IHRvIHRydWUsIGFsbCBvcmlnaW5hbGx5IGhpZ2hsaWdodGVkIGl0ZW1zIGFyZSBrZXB0LiBPdGhlcndpc2UsIGFsbCBvcmlnaW5hbCBpdGVtcyBhcmUgdW5zZWxlY3RlZC5cclxuICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbW91bnQgb2YgaXRlbXMgdG8gb2Zmc2V0IHRoZSBoaWdobGlnaHQgYnkuXHJcbiAgICogQHBhcmFtIGhhc1NoaWZ0IFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZSBzaGlmdCBrZXkgcHJlc3NlZC5cclxuICAgKiBAcmV0dXJucyBUaGUgaXRlbSBoaWdobGlnaHRlZC5cclxuICAgKi9cclxuICBoaWdobGlnaHROZXh0SXRlbShvZmZzZXQ6IG51bWJlciwgaGFzU2hpZnQ/OiBib29sZWFuKTogQXJkVGFibGVSb3cgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5pc0FueUl0ZW1IaWdobGlnaHRlZCgpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSB0aGlzLmhpZ2hsaWdodGVkSXRlbXMoKS5sYXN0KCk7XHJcbiAgICBjb25zdCBpdGVtc1dpdGhvdXREaXNhYmxlZCA9IHRoaXMuX2l0ZW1zKCkuZmlsdGVyKFxyXG4gICAgICBpdGVtID0+ICFpdGVtLmRpc2FibGVkKCkgJiYgKCF0aGlzLmlzSXRlbUxpbWl0UmVhY2hlZCgpIHx8IGl0ZW0uc2VsZWN0ZWQoKSlcclxuICAgICk7XHJcbiAgICBjb25zdCBjdXJyZW50SW5kZXhJbkl0ZW1zID0gaXRlbXNXaXRob3V0RGlzYWJsZWQuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pbmRleCgpID09PSBjdXJyZW50SXRlbS5pbmRleCgpKTtcclxuXHJcbiAgICBsZXQgbmV4dEl0ZW1JbmRleCA9IGN1cnJlbnRJbmRleEluSXRlbXMgKyBvZmZzZXQ7XHJcbiAgICBpZiAobmV4dEl0ZW1JbmRleCA+PSBpdGVtc1dpdGhvdXREaXNhYmxlZC5sZW5ndGgpIHtcclxuICAgICAgbmV4dEl0ZW1JbmRleCAtPSBpdGVtc1dpdGhvdXREaXNhYmxlZC5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBpZiAobmV4dEl0ZW1JbmRleCA8IDApIHtcclxuICAgICAgbmV4dEl0ZW1JbmRleCArPSBpdGVtc1dpdGhvdXREaXNhYmxlZC5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtVG9IaWdobGlnaHQgPSBpdGVtc1dpdGhvdXREaXNhYmxlZFtuZXh0SXRlbUluZGV4XTtcclxuXHJcbiAgICBpZiAoaGFzU2hpZnQpIHtcclxuICAgICAgaWYgKGl0ZW1Ub0hpZ2hsaWdodC5oaWdobGlnaHRlZCgpKSB7XHJcbiAgICAgICAgdGhpcy51bmhpZ2hsaWdodEl0ZW0obmV4dEl0ZW1JbmRleCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0SXRlbShuZXh0SXRlbUluZGV4KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodFNpbmdsZUl0ZW0obmV4dEl0ZW1JbmRleCk7XHJcbiAgfVxyXG5cclxuICAvLyEgc29ydGluZ1xyXG4gIHByaXZhdGUgX2N1cnJlbnRTb3J0Q29sdW1uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9jdXJyZW50U29ydFR5cGU6IFNvcnRUeXBlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHRvZ2dsZUN1cnJlbnRTb3J0Q29sdW1uKGNvbHVtbjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fY3VycmVudFNvcnRDb2x1bW4gPT09IGNvbHVtbikge1xyXG4gICAgICBpZiAodGhpcy5fY3VycmVudFNvcnRUeXBlID09PSBTb3J0VHlwZS5Bc2NlbmRpbmcpIHtcclxuICAgICAgICB0aGlzLl9jdXJyZW50U29ydFR5cGUgPSBTb3J0VHlwZS5EZXNjZW5kaW5nO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRTb3J0VHlwZSA9IFNvcnRUeXBlLkFzY2VuZGluZztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9nZW5lcmF0ZVNvcnRlZFJvd3ModHJ1ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX2N1cnJlbnRTb3J0Q29sdW1uID0gY29sdW1uO1xyXG4gICAgdGhpcy5fY3VycmVudFNvcnRUeXBlID0gU29ydFR5cGUuQXNjZW5kaW5nO1xyXG4gICAgdGhpcy5fZ2VuZXJhdGVTb3J0ZWRSb3dzKCk7XHJcbiAgfVxyXG4gIHJlc2V0U29ydCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJlbnRTb3J0Q29sdW1uID0gbnVsbDtcclxuICAgIHRoaXMuX2N1cnJlbnRTb3J0VHlwZSA9IG51bGw7XHJcbiAgICB0aGlzLl9zb3J0ZWRJdGVtcy5zZXQoWy4uLnRoaXMuaXRlbXMoKV0pO1xyXG4gIH1cclxuICBnZXRDb2x1bW5Tb3J0VHlwZShjb2x1bW46IG51bWJlcik6IFNvcnRUeXBlIHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5fY3VycmVudFNvcnRDb2x1bW4gPT09IGNvbHVtbikge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudFNvcnRUeXBlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2dlbmVyYXRlU29ydGVkUm93cyhqdXN0UmV2ZXJzZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChqdXN0UmV2ZXJzZSkge1xyXG4gICAgICB0aGlzLl9zb3J0ZWRJdGVtcy51cGRhdGUodiA9PiBbLi4udi5yZXZlcnNlKCldKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc29ydENvbHVtbkluZGV4ID0gdGhpcy5fY3VycmVudFNvcnRDb2x1bW47XHJcbiAgICBpZiAoaXNOdWxsKHNvcnRDb2x1bW5JbmRleCkgfHwgIXRoaXMuX2N1cnJlbnRTb3J0VHlwZSkge1xyXG4gICAgICB0aGlzLl9zb3J0ZWRJdGVtcy5zZXQodGhpcy5pdGVtcygpKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc29ydENvbHVtbiA9IHRoaXMuX2RhdGFDb2x1bW5zKClbc29ydENvbHVtbkluZGV4XTtcclxuICAgIGlmICghc29ydENvbHVtbikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgYEFSRC1JUzUwNTk6IEVuY291bnRlcmVkIGFuIGlzc3VlIGluIDxhcmQtdGFibGU+OiBjb3VsZCBub3QgZmluZCB0aGUgY29sdW1uIHdpdGggaW5kZXggJHtzb3J0Q29sdW1uSW5kZXh9LiBUaGlzIGlzIG1vc3QgbGlrZWx5IGFuIEFyZGl1bSBVSSBidWcsIHBsZWFzZSByZXBvcnQgaXQgdG8gdGhlIGNyZWF0b3JzLmBcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLl9jdXJyZW50U29ydFR5cGUgPT09IFNvcnRUeXBlLkFzY2VuZGluZyA/IDEgOiAtMTtcclxuICAgIGNvbnN0IHNvcnRGbiA9XHJcbiAgICAgIHNvcnRDb2x1bW4uc29ydEZuID8/XHJcbiAgICAgICgoYSwgYikgPT4ge1xyXG4gICAgICAgIGlmIChhID4gYikgcmV0dXJuIGRpcmVjdGlvbjtcclxuICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMSAqIGRpcmVjdGlvbjtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5fc29ydGVkSXRlbXMuc2V0KFsuLi50aGlzLml0ZW1zKCldLnNvcnQoKGEsIGIpID0+IHNvcnRGbihhLmRhdGEoKVtzb3J0Q29sdW1uSW5kZXhdLCBiLmRhdGEoKVtzb3J0Q29sdW1uSW5kZXhdKSkpO1xyXG4gIH1cclxufVxyXG4iXX0=
|