@ardium-ui/ui 1.0.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/README.md +25 -0
- package/esm2022/ardium-ui-ui.mjs +5 -0
- package/esm2022/lib/_internal/boolean-component.mjs +108 -0
- package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +12 -0
- package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +18 -0
- package/esm2022/lib/_internal/disablable-component.mjs +44 -0
- package/esm2022/lib/_internal/focusable-component.mjs +91 -0
- package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +436 -0
- package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +349 -0
- package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +155 -0
- package/esm2022/lib/_internal/models/pagination.model.mjs +124 -0
- package/esm2022/lib/_internal/ngmodel-component.mjs +42 -0
- package/esm2022/lib/_internal/queue.mjs +59 -0
- package/esm2022/lib/_internal/selectable-list-component.mjs +304 -0
- package/esm2022/lib/badge/badge.directive.mjs +123 -0
- package/esm2022/lib/badge/badge.module.mjs +18 -0
- package/esm2022/lib/badge/badge.types.mjs +16 -0
- package/esm2022/lib/buttons/_button-base.mjs +45 -0
- package/esm2022/lib/buttons/button/button.component.mjs +49 -0
- package/esm2022/lib/buttons/button/button.module.mjs +18 -0
- package/esm2022/lib/buttons/fab/fab.component.mjs +40 -0
- package/esm2022/lib/buttons/fab/fab.module.mjs +18 -0
- package/esm2022/lib/buttons/general-button.types.mjs +55 -0
- package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +37 -0
- package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +18 -0
- package/esm2022/lib/calendar/calendar.component.mjs +982 -0
- package/esm2022/lib/calendar/calendar.directives.mjs +107 -0
- package/esm2022/lib/calendar/calendar.helpers.mjs +47 -0
- package/esm2022/lib/calendar/calendar.module.mjs +21 -0
- package/esm2022/lib/calendar/calendar.types.mjs +11 -0
- package/esm2022/lib/card/card.children.mjs +97 -0
- package/esm2022/lib/card/card.component.mjs +40 -0
- package/esm2022/lib/card/card.module.mjs +59 -0
- package/esm2022/lib/card/card.types.mjs +9 -0
- package/esm2022/lib/checkbox/checkbox.component.mjs +73 -0
- package/esm2022/lib/checkbox/checkbox.module.mjs +18 -0
- package/esm2022/lib/checkbox/checkbox.types.mjs +6 -0
- package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +139 -0
- package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +19 -0
- package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +7 -0
- package/esm2022/lib/chip/chip.component.mjs +55 -0
- package/esm2022/lib/chip/chip.module.mjs +21 -0
- package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +80 -0
- package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +77 -0
- package/esm2022/lib/color/color-display/color-display.component.mjs +48 -0
- package/esm2022/lib/color/color-display/color-display.module.mjs +18 -0
- package/esm2022/lib/color/color-display/color-display.types.mjs +9 -0
- package/esm2022/lib/color/color-picker/color-picker.component.mjs +484 -0
- package/esm2022/lib/color/color-picker/color-picker.directives.mjs +55 -0
- package/esm2022/lib/color/color-picker/color-picker.module.mjs +43 -0
- package/esm2022/lib/color/color-picker/color-picker.types.mjs +11 -0
- package/esm2022/lib/dialog/dialog.component.mjs +167 -0
- package/esm2022/lib/dialog/dialog.directives.mjs +14 -0
- package/esm2022/lib/dialog/dialog.module.mjs +21 -0
- package/esm2022/lib/dialog/dialog.types.mjs +6 -0
- package/esm2022/lib/divider/divider.component.mjs +26 -0
- package/esm2022/lib/divider/divider.module.mjs +18 -0
- package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +130 -0
- package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +18 -0
- package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +10 -0
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +82 -0
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +42 -0
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +58 -0
- package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +153 -0
- package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +73 -0
- package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +21 -0
- package/esm2022/lib/file-inputs/file-input-base.mjs +187 -0
- package/esm2022/lib/file-inputs/file-input-types.mjs +2 -0
- package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +74 -0
- package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +25 -0
- package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +19 -0
- package/esm2022/lib/icon/icon.component.mjs +85 -0
- package/esm2022/lib/icon/icon.module.mjs +19 -0
- package/esm2022/lib/icon/icon.pipe.mjs +18 -0
- package/esm2022/lib/inputs/color-input/color-input.component.mjs +421 -0
- package/esm2022/lib/inputs/color-input/color-input.directives.mjs +101 -0
- package/esm2022/lib/inputs/color-input/color-input.module.mjs +85 -0
- package/esm2022/lib/inputs/color-input/color-input.types.mjs +2 -0
- package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +218 -0
- package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +217 -0
- package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +18 -0
- package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +15 -0
- package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +8 -0
- package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +234 -0
- package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +36 -0
- package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +21 -0
- package/esm2022/lib/inputs/hex-input.model.mjs +106 -0
- package/esm2022/lib/inputs/input/input.component.mjs +344 -0
- package/esm2022/lib/inputs/input/input.directives.mjs +58 -0
- package/esm2022/lib/inputs/input/input.module.mjs +47 -0
- package/esm2022/lib/inputs/input-transformers.mjs +66 -0
- package/esm2022/lib/inputs/input-types.mjs +6 -0
- package/esm2022/lib/inputs/input-utils.mjs +205 -0
- package/esm2022/lib/inputs/number-input/number-input.component.mjs +289 -0
- package/esm2022/lib/inputs/number-input/number-input.directives.mjs +14 -0
- package/esm2022/lib/inputs/number-input/number-input.module.mjs +21 -0
- package/esm2022/lib/inputs/password-input/password-input.component.mjs +222 -0
- package/esm2022/lib/inputs/password-input/password-input.directives.mjs +49 -0
- package/esm2022/lib/inputs/password-input/password-input.module.mjs +41 -0
- package/esm2022/lib/inputs/password-input/password-input.types.mjs +2 -0
- package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +219 -0
- package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +36 -0
- package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +37 -0
- package/esm2022/lib/kbd/kbd.component.mjs +42 -0
- package/esm2022/lib/kbd/kbd.module.mjs +19 -0
- package/esm2022/lib/kbd/kbd.pipe.mjs +17 -0
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +55 -0
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +19 -0
- package/esm2022/lib/modal/modal.component.mjs +120 -0
- package/esm2022/lib/modal/modal.module.mjs +21 -0
- package/esm2022/lib/option/option.component.mjs +77 -0
- package/esm2022/lib/option/option.module.mjs +18 -0
- package/esm2022/lib/progress-bar/progress-bar.component.mjs +95 -0
- package/esm2022/lib/progress-bar/progress-bar.directive.mjs +14 -0
- package/esm2022/lib/progress-bar/progress-bar.module.mjs +19 -0
- package/esm2022/lib/progress-bar/progress-bar.types.mjs +19 -0
- package/esm2022/lib/progress-circle/progress-circle.component.mjs +94 -0
- package/esm2022/lib/progress-circle/progress-circle.directive.mjs +14 -0
- package/esm2022/lib/progress-circle/progress-circle.module.mjs +19 -0
- package/esm2022/lib/progress-circle/progress-circle.types.mjs +10 -0
- package/esm2022/lib/radio/radio/radio.component.mjs +53 -0
- package/esm2022/lib/radio/radio-group.component.mjs +207 -0
- package/esm2022/lib/radio/radio.module.mjs +19 -0
- package/esm2022/lib/search-functions.mjs +64 -0
- package/esm2022/lib/segment/segment.component.mjs +168 -0
- package/esm2022/lib/segment/segment.directives.mjs +14 -0
- package/esm2022/lib/segment/segment.module.mjs +19 -0
- package/esm2022/lib/segment/segment.types.mjs +12 -0
- package/esm2022/lib/select/select.component.mjs +1160 -0
- package/esm2022/lib/select/select.directive.mjs +171 -0
- package/esm2022/lib/select/select.module.mjs +112 -0
- package/esm2022/lib/select/select.types.mjs +2 -0
- package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +46 -0
- package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +18 -0
- package/esm2022/lib/slider/abstract-slider.mjs +330 -0
- package/esm2022/lib/slider/range-slider/range-slider.component.mjs +143 -0
- package/esm2022/lib/slider/range-slider/range-slider.module.mjs +18 -0
- package/esm2022/lib/slider/slider.component.mjs +93 -0
- package/esm2022/lib/slider/slider.directive.mjs +16 -0
- package/esm2022/lib/slider/slider.module.mjs +20 -0
- package/esm2022/lib/slider/slider.types.mjs +10 -0
- package/esm2022/lib/snackbar/index.mjs +5 -0
- package/esm2022/lib/snackbar/snackbar-ref.mjs +51 -0
- package/esm2022/lib/snackbar/snackbar.component.mjs +48 -0
- package/esm2022/lib/snackbar/snackbar.service.mjs +227 -0
- package/esm2022/lib/snackbar/snackbar.token.mjs +20 -0
- package/esm2022/lib/snackbar/snackbar.types.mjs +25 -0
- package/esm2022/lib/spinner/spinner.component.mjs +22 -0
- package/esm2022/lib/spinner/spinner.module.mjs +18 -0
- package/esm2022/lib/star/star-button/star-button.component.mjs +53 -0
- package/esm2022/lib/star/star-button/star-button.module.mjs +19 -0
- package/esm2022/lib/star/star-display/star-display.component.mjs +66 -0
- package/esm2022/lib/star/star-display/star-display.module.mjs +19 -0
- package/esm2022/lib/star/star-input/star-input.component.mjs +221 -0
- package/esm2022/lib/star/star-input/star-input.module.mjs +19 -0
- package/esm2022/lib/star/star.component.mjs +28 -0
- package/esm2022/lib/star/star.module.mjs +18 -0
- package/esm2022/lib/star/star.types.mjs +23 -0
- package/esm2022/lib/statebox/statebox.component.mjs +158 -0
- package/esm2022/lib/statebox/statebox.module.mjs +18 -0
- package/esm2022/lib/statebox/statebox.types.mjs +2 -0
- package/esm2022/lib/table/table-item-storage.mjs +560 -0
- package/esm2022/lib/table/table.component.mjs +468 -0
- package/esm2022/lib/table/table.directives.mjs +64 -0
- package/esm2022/lib/table/table.module.mjs +46 -0
- package/esm2022/lib/table/table.types.mjs +30 -0
- package/esm2022/lib/table/utils.mjs +18 -0
- package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +64 -0
- package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +19 -0
- package/esm2022/lib/table-pagination/table-pagination.component.mjs +172 -0
- package/esm2022/lib/table-pagination/table-pagination.module.mjs +21 -0
- package/esm2022/lib/table-pagination/table-pagination.types.mjs +7 -0
- package/esm2022/lib/types/alignment.types.mjs +10 -0
- package/esm2022/lib/types/colors.types.mjs +43 -0
- package/esm2022/lib/types/item-storage.types.mjs +6 -0
- package/esm2022/lib/types/theming.types.mjs +48 -0
- package/esm2022/lib/types/utility.types.mjs +5 -0
- package/esm2022/public-api.mjs +194 -0
- package/fesm2022/ardium-ui-ui.mjs +14316 -0
- package/fesm2022/ardium-ui-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/_internal/boolean-component.d.ts +50 -0
- package/lib/_internal/clear-button/clear-button.component.d.ts +6 -0
- package/lib/_internal/clear-button/clear-button.module.d.ts +8 -0
- package/lib/_internal/disablable-component.d.ts +11 -0
- package/lib/_internal/focusable-component.d.ts +52 -0
- package/lib/_internal/item-storages/dropdown-item-storage.d.ts +87 -0
- package/lib/_internal/item-storages/simple-item-storage.d.ts +159 -0
- package/lib/_internal/item-storages/simplest-item-storage.d.ts +70 -0
- package/lib/_internal/models/pagination.model.d.ts +53 -0
- package/lib/_internal/ngmodel-component.d.ts +42 -0
- package/lib/_internal/queue.d.ts +21 -0
- package/lib/_internal/selectable-list-component.d.ts +71 -0
- package/lib/badge/badge.directive.d.ts +31 -0
- package/lib/badge/badge.module.d.ts +8 -0
- package/lib/badge/badge.types.d.ts +17 -0
- package/lib/buttons/_button-base.d.ts +18 -0
- package/lib/buttons/button/button.component.d.ts +15 -0
- package/lib/buttons/button/button.module.d.ts +8 -0
- package/lib/buttons/fab/fab.component.d.ts +12 -0
- package/lib/buttons/fab/fab.module.d.ts +8 -0
- package/lib/buttons/general-button.types.d.ts +57 -0
- package/lib/buttons/icon-button/icon-button.component.d.ts +13 -0
- package/lib/buttons/icon-button/icon-button.module.d.ts +8 -0
- package/lib/calendar/calendar.component.d.ts +155 -0
- package/lib/calendar/calendar.directives.d.ts +51 -0
- package/lib/calendar/calendar.helpers.d.ts +15 -0
- package/lib/calendar/calendar.module.d.ts +11 -0
- package/lib/calendar/calendar.types.d.ts +80 -0
- package/lib/card/card.children.d.ts +43 -0
- package/lib/card/card.component.d.ts +13 -0
- package/lib/card/card.module.d.ts +9 -0
- package/lib/card/card.types.d.ts +10 -0
- package/lib/checkbox/checkbox.component.d.ts +21 -0
- package/lib/checkbox/checkbox.module.d.ts +8 -0
- package/lib/checkbox/checkbox.types.d.ts +6 -0
- package/lib/checkbox-list/checkbox-list.component.d.ts +50 -0
- package/lib/checkbox-list/checkbox-list.module.d.ts +9 -0
- package/lib/checkbox-list/checkbox-list.types.d.ts +7 -0
- package/lib/chip/chip.component.d.ts +18 -0
- package/lib/chip/chip.module.d.ts +11 -0
- package/lib/chip/deletable-chip/deletable-chip.component.d.ts +24 -0
- package/lib/chip/selectable-chip/selectable-chip.component.d.ts +24 -0
- package/lib/color/color-display/color-display.component.d.ts +17 -0
- package/lib/color/color-display/color-display.module.d.ts +8 -0
- package/lib/color/color-display/color-display.types.d.ts +9 -0
- package/lib/color/color-picker/color-picker.component.d.ts +125 -0
- package/lib/color/color-picker/color-picker.directives.d.ts +27 -0
- package/lib/color/color-picker/color-picker.module.d.ts +13 -0
- package/lib/color/color-picker/color-picker.types.d.ts +21 -0
- package/lib/dialog/dialog.component.d.ts +44 -0
- package/lib/dialog/dialog.directives.d.ts +9 -0
- package/lib/dialog/dialog.module.d.ts +11 -0
- package/lib/dialog/dialog.types.d.ts +28 -0
- package/lib/divider/divider.component.d.ts +8 -0
- package/lib/divider/divider.module.d.ts +8 -0
- package/lib/dropdown-panel/dropdown-panel.component.d.ts +37 -0
- package/lib/dropdown-panel/dropdown-panel.module.d.ts +8 -0
- package/lib/dropdown-panel/dropdown-panel.types.d.ts +12 -0
- package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +22 -0
- package/lib/file-inputs/file-drop-area/file-drop-area.directives.d.ts +21 -0
- package/lib/file-inputs/file-drop-area/file-drop-area.module.d.ts +12 -0
- package/lib/file-inputs/file-input/file-input.component.d.ts +41 -0
- package/lib/file-inputs/file-input/file-input.directives.d.ts +39 -0
- package/lib/file-inputs/file-input/file-input.module.d.ts +11 -0
- package/lib/file-inputs/file-input-base.d.ts +43 -0
- package/lib/file-inputs/file-input-types.d.ts +10 -0
- package/lib/form-field-frame/form-field-frame.component.d.ts +32 -0
- package/lib/form-field-frame/form-field-frame.directives.d.ts +14 -0
- package/lib/form-field-frame/form-field-frame.module.d.ts +9 -0
- package/lib/icon/icon.component.d.ts +32 -0
- package/lib/icon/icon.module.d.ts +9 -0
- package/lib/icon/icon.pipe.d.ts +7 -0
- package/lib/inputs/color-input/color-input.component.d.ts +147 -0
- package/lib/inputs/color-input/color-input.directives.d.ts +52 -0
- package/lib/inputs/color-input/color-input.module.d.ts +16 -0
- package/lib/inputs/color-input/color-input.types.d.ts +5 -0
- package/lib/inputs/digit-input/digit-input.component.d.ts +50 -0
- package/lib/inputs/digit-input/digit-input.model.d.ts +26 -0
- package/lib/inputs/digit-input/digit-input.module.d.ts +8 -0
- package/lib/inputs/digit-input/digit-input.types.d.ts +27 -0
- package/lib/inputs/digit-input/digit-input.utils.d.ts +17 -0
- package/lib/inputs/hex-input/hex-input.component.d.ts +60 -0
- package/lib/inputs/hex-input/hex-input.directives.d.ts +20 -0
- package/lib/inputs/hex-input/hex-input.module.d.ts +11 -0
- package/lib/inputs/hex-input.model.d.ts +27 -0
- package/lib/inputs/input/input.component.d.ts +79 -0
- package/lib/inputs/input/input.directives.d.ts +33 -0
- package/lib/inputs/input/input.module.d.ts +13 -0
- package/lib/inputs/input-transformers.d.ts +24 -0
- package/lib/inputs/input-types.d.ts +6 -0
- package/lib/inputs/input-utils.d.ts +58 -0
- package/lib/inputs/number-input/number-input.component.d.ts +70 -0
- package/lib/inputs/number-input/number-input.directives.d.ts +8 -0
- package/lib/inputs/number-input/number-input.module.d.ts +11 -0
- package/lib/inputs/password-input/password-input.component.d.ts +54 -0
- package/lib/inputs/password-input/password-input.directives.d.ts +27 -0
- package/lib/inputs/password-input/password-input.module.d.ts +11 -0
- package/lib/inputs/password-input/password-input.types.d.ts +3 -0
- package/lib/inputs/simple-input/simple-input.component.d.ts +58 -0
- package/lib/inputs/simple-input/simple-input.directives.d.ts +20 -0
- package/lib/inputs/simple-input/simple-input.module.d.ts +11 -0
- package/lib/kbd/kbd.component.d.ts +15 -0
- package/lib/kbd/kbd.module.d.ts +9 -0
- package/lib/kbd/kbd.pipe.d.ts +7 -0
- package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +18 -0
- package/lib/kbd-shortcut/kbd-shortcut.module.d.ts +9 -0
- package/lib/modal/modal.component.d.ts +36 -0
- package/lib/modal/modal.module.d.ts +11 -0
- package/lib/option/option.component.d.ts +29 -0
- package/lib/option/option.module.d.ts +8 -0
- package/lib/progress-bar/progress-bar.component.d.ts +26 -0
- package/lib/progress-bar/progress-bar.directive.d.ts +9 -0
- package/lib/progress-bar/progress-bar.module.d.ts +9 -0
- package/lib/progress-bar/progress-bar.types.d.ts +26 -0
- package/lib/progress-circle/progress-circle.component.d.ts +28 -0
- package/lib/progress-circle/progress-circle.directive.d.ts +9 -0
- package/lib/progress-circle/progress-circle.module.d.ts +9 -0
- package/lib/progress-circle/progress-circle.types.d.ts +17 -0
- package/lib/radio/radio/radio.component.d.ts +23 -0
- package/lib/radio/radio-group.component.d.ts +43 -0
- package/lib/radio/radio.module.d.ts +9 -0
- package/lib/search-functions.d.ts +10 -0
- package/lib/segment/segment.component.d.ts +48 -0
- package/lib/segment/segment.directives.d.ts +9 -0
- package/lib/segment/segment.module.d.ts +9 -0
- package/lib/segment/segment.types.d.ts +16 -0
- package/lib/select/select.component.d.ts +255 -0
- package/lib/select/select.directive.d.ts +94 -0
- package/lib/select/select.module.d.ts +14 -0
- package/lib/select/select.types.d.ts +109 -0
- package/lib/slide-toggle/slide-toggle.component.d.ts +14 -0
- package/lib/slide-toggle/slide-toggle.module.d.ts +8 -0
- package/lib/slider/abstract-slider.d.ts +88 -0
- package/lib/slider/range-slider/range-slider.component.d.ts +29 -0
- package/lib/slider/range-slider/range-slider.module.d.ts +8 -0
- package/lib/slider/slider.component.d.ts +18 -0
- package/lib/slider/slider.directive.d.ts +9 -0
- package/lib/slider/slider.module.d.ts +10 -0
- package/lib/slider/slider.types.d.ts +28 -0
- package/lib/snackbar/index.d.ts +4 -0
- package/lib/snackbar/snackbar-ref.d.ts +37 -0
- package/lib/snackbar/snackbar.component.d.ts +16 -0
- package/lib/snackbar/snackbar.service.d.ts +31 -0
- package/lib/snackbar/snackbar.token.d.ts +5 -0
- package/lib/snackbar/snackbar.types.d.ts +48 -0
- package/lib/spinner/spinner.component.d.ts +8 -0
- package/lib/spinner/spinner.module.d.ts +8 -0
- package/lib/star/star-button/star-button.component.d.ts +16 -0
- package/lib/star/star-button/star-button.module.d.ts +9 -0
- package/lib/star/star-display/star-display.component.d.ts +16 -0
- package/lib/star/star-display/star-display.module.d.ts +9 -0
- package/lib/star/star-input/star-input.component.d.ts +51 -0
- package/lib/star/star-input/star-input.module.d.ts +9 -0
- package/lib/star/star.component.d.ts +10 -0
- package/lib/star/star.module.d.ts +8 -0
- package/lib/star/star.types.d.ts +30 -0
- package/lib/statebox/statebox.component.d.ts +31 -0
- package/lib/statebox/statebox.module.d.ts +8 -0
- package/lib/statebox/statebox.types.d.ts +22 -0
- package/lib/table/table-item-storage.d.ts +266 -0
- package/lib/table/table.component.d.ts +127 -0
- package/lib/table/table.directives.d.ts +35 -0
- package/lib/table/table.module.d.ts +12 -0
- package/lib/table/table.types.d.ts +83 -0
- package/lib/table/utils.d.ts +4 -0
- package/lib/table-from-csv/table-from-csv.component.d.ts +16 -0
- package/lib/table-from-csv/table-from-csv.module.d.ts +9 -0
- package/lib/table-pagination/table-pagination.component.d.ts +48 -0
- package/lib/table-pagination/table-pagination.module.d.ts +11 -0
- package/lib/table-pagination/table-pagination.types.d.ts +9 -0
- package/lib/types/alignment.types.d.ts +11 -0
- package/lib/types/colors.types.d.ts +71 -0
- package/lib/types/item-storage.types.d.ts +98 -0
- package/lib/types/theming.types.d.ts +61 -0
- package/lib/types/utility.types.d.ts +11 -0
- package/package.json +36 -0
- package/prebuilt-themes/default/badge.css +208 -0
- package/prebuilt-themes/default/badge.css.map +1 -0
- package/prebuilt-themes/default/buttons/button.css +290 -0
- package/prebuilt-themes/default/buttons/button.css.map +1 -0
- package/prebuilt-themes/default/buttons/fab.css +307 -0
- package/prebuilt-themes/default/buttons/fab.css.map +1 -0
- package/prebuilt-themes/default/buttons/icon-button.css +288 -0
- package/prebuilt-themes/default/buttons/icon-button.css.map +1 -0
- package/prebuilt-themes/default/calendar.css +293 -0
- package/prebuilt-themes/default/calendar.css.map +1 -0
- package/prebuilt-themes/default/card.css +122 -0
- package/prebuilt-themes/default/card.css.map +1 -0
- package/prebuilt-themes/default/checkbox-list.css +65 -0
- package/prebuilt-themes/default/checkbox-list.css.map +1 -0
- package/prebuilt-themes/default/checkbox.css +365 -0
- package/prebuilt-themes/default/checkbox.css.map +1 -0
- package/prebuilt-themes/default/chips.css +367 -0
- package/prebuilt-themes/default/chips.css.map +1 -0
- package/prebuilt-themes/default/color-display.css +29 -0
- package/prebuilt-themes/default/color-display.css.map +1 -0
- package/prebuilt-themes/default/color-picker.css +106 -0
- package/prebuilt-themes/default/color-picker.css.map +1 -0
- package/prebuilt-themes/default/core.css +84 -0
- package/prebuilt-themes/default/core.css.map +1 -0
- package/prebuilt-themes/default/dialog.css +18 -0
- package/prebuilt-themes/default/dialog.css.map +1 -0
- package/prebuilt-themes/default/divider.css +11 -0
- package/prebuilt-themes/default/divider.css.map +1 -0
- package/prebuilt-themes/default/dropdown-panel.css +37 -0
- package/prebuilt-themes/default/dropdown-panel.css.map +1 -0
- package/prebuilt-themes/default/file-drop-area.css +279 -0
- package/prebuilt-themes/default/file-drop-area.css.map +1 -0
- package/prebuilt-themes/default/form-field-frame.css +84 -0
- package/prebuilt-themes/default/form-field-frame.css.map +1 -0
- package/prebuilt-themes/default/inputs/color-input.css +139 -0
- package/prebuilt-themes/default/inputs/color-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/digit-input.css +45 -0
- package/prebuilt-themes/default/inputs/digit-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/file-input.css +169 -0
- package/prebuilt-themes/default/inputs/file-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/hex-input.css +119 -0
- package/prebuilt-themes/default/inputs/hex-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/input.css +139 -0
- package/prebuilt-themes/default/inputs/input.css.map +1 -0
- package/prebuilt-themes/default/inputs/number-input.css +150 -0
- package/prebuilt-themes/default/inputs/number-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/password-input.css +73 -0
- package/prebuilt-themes/default/inputs/password-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/search-bar.css +114 -0
- package/prebuilt-themes/default/inputs/search-bar.css.map +1 -0
- package/prebuilt-themes/default/inputs/simple-input.css +114 -0
- package/prebuilt-themes/default/inputs/simple-input.css.map +1 -0
- package/prebuilt-themes/default/kbd-shortcut.css +12 -0
- package/prebuilt-themes/default/kbd-shortcut.css.map +1 -0
- package/prebuilt-themes/default/kbd.css +17 -0
- package/prebuilt-themes/default/kbd.css.map +1 -0
- package/prebuilt-themes/default/modal.css +73 -0
- package/prebuilt-themes/default/modal.css.map +1 -0
- package/prebuilt-themes/default/progress-bar.css +267 -0
- package/prebuilt-themes/default/progress-bar.css.map +1 -0
- package/prebuilt-themes/default/progress-circle.css +167 -0
- package/prebuilt-themes/default/progress-circle.css.map +1 -0
- package/prebuilt-themes/default/radio.css +226 -0
- package/prebuilt-themes/default/radio.css.map +1 -0
- package/prebuilt-themes/default/segment.css +391 -0
- package/prebuilt-themes/default/segment.css.map +1 -0
- package/prebuilt-themes/default/select.css +275 -0
- package/prebuilt-themes/default/select.css.map +1 -0
- package/prebuilt-themes/default/slide-toggle.css +264 -0
- package/prebuilt-themes/default/slide-toggle.css.map +1 -0
- package/prebuilt-themes/default/slider.css +354 -0
- package/prebuilt-themes/default/slider.css.map +1 -0
- package/prebuilt-themes/default/snackbar.css +183 -0
- package/prebuilt-themes/default/snackbar.css.map +1 -0
- package/prebuilt-themes/default/spinner.css +151 -0
- package/prebuilt-themes/default/spinner.css.map +1 -0
- package/prebuilt-themes/default/stars.css +291 -0
- package/prebuilt-themes/default/stars.css.map +1 -0
- package/prebuilt-themes/default/statebox.css +235 -0
- package/prebuilt-themes/default/statebox.css.map +1 -0
- package/prebuilt-themes/default/table-pagination.css +48 -0
- package/prebuilt-themes/default/table-pagination.css.map +1 -0
- package/prebuilt-themes/default/table.css +418 -0
- package/prebuilt-themes/default/table.css.map +1 -0
- package/public-api.d.ts +145 -0
- package/themes/_variables.scss +121 -0
- package/themes/default/_clear-button.scss +73 -0
- package/themes/default/_coloring.scss +137 -0
- package/themes/default/_dropdown-arrow.scss +12 -0
- package/themes/default/_mixins.scss +70 -0
- package/themes/default/badge.scss +94 -0
- package/themes/default/buttons/_button-mixins.scss +144 -0
- package/themes/default/buttons/button.scss +62 -0
- package/themes/default/buttons/fab.scss +72 -0
- package/themes/default/buttons/icon-button.scss +59 -0
- package/themes/default/calendar.scss +182 -0
- package/themes/default/card.scss +126 -0
- package/themes/default/checkbox-list.scss +83 -0
- package/themes/default/checkbox.scss +109 -0
- package/themes/default/chips.scss +206 -0
- package/themes/default/color-display.scss +41 -0
- package/themes/default/color-picker.scss +111 -0
- package/themes/default/core.scss +96 -0
- package/themes/default/dialog.scss +16 -0
- package/themes/default/divider.scss +13 -0
- package/themes/default/dropdown-panel.scss +45 -0
- package/themes/default/file-drop-area.scss +162 -0
- package/themes/default/form-field-frame.scss +78 -0
- package/themes/default/inputs/_shared.scss +46 -0
- package/themes/default/inputs/color-input.scss +46 -0
- package/themes/default/inputs/digit-input.scss +56 -0
- package/themes/default/inputs/file-input.scss +78 -0
- package/themes/default/inputs/hex-input.scss +27 -0
- package/themes/default/inputs/input.scss +52 -0
- package/themes/default/inputs/number-input.scss +121 -0
- package/themes/default/inputs/password-input.scss +43 -0
- package/themes/default/inputs/search-bar.scss +19 -0
- package/themes/default/inputs/simple-input.scss +19 -0
- package/themes/default/kbd-shortcut.scss +13 -0
- package/themes/default/kbd.scss +20 -0
- package/themes/default/modal.scss +93 -0
- package/themes/default/progress-bar.scss +166 -0
- package/themes/default/progress-circle.scss +56 -0
- package/themes/default/radio.scss +112 -0
- package/themes/default/segment.scss +339 -0
- package/themes/default/select.scss +253 -0
- package/themes/default/slide-toggle.scss +151 -0
- package/themes/default/slider.scss +224 -0
- package/themes/default/snackbar.scss +60 -0
- package/themes/default/spinner.scss +21 -0
- package/themes/default/stars.scss +122 -0
- package/themes/default/statebox.scss +109 -0
- package/themes/default/table-pagination.scss +56 -0
- package/themes/default/table.scss +403 -0
|
@@ -0,0 +1,1160 @@
|
|
|
1
|
+
import { OverlayConfig } from '@angular/cdk/overlay';
|
|
2
|
+
import { TemplatePortal } from '@angular/cdk/portal';
|
|
3
|
+
import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, TemplateRef, ViewChild, ViewEncapsulation, forwardRef, } from '@angular/core';
|
|
4
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
5
|
+
import { coerceArrayProperty, coerceBooleanProperty, coerceNumberProperty } from '@ardium-ui/devkit';
|
|
6
|
+
import { Subject, merge, startWith, takeUntil } from 'rxjs';
|
|
7
|
+
import { isAnyString, isArray, isFunction } from 'simple-bool';
|
|
8
|
+
import { ItemStorage } from '../_internal/item-storages/dropdown-item-storage';
|
|
9
|
+
import { _NgModelComponentBase } from '../_internal/ngmodel-component';
|
|
10
|
+
import { ArdiumDropdownPanelComponent } from '../dropdown-panel/dropdown-panel.component';
|
|
11
|
+
import { DropdownPanelAppearance, DropdownPanelVariant } from '../dropdown-panel/dropdown-panel.types';
|
|
12
|
+
import { ArdiumOptionComponent } from '../option/option.component';
|
|
13
|
+
import { searchFunctions } from '../search-functions';
|
|
14
|
+
import { ArdPanelPosition } from '../types/item-storage.types';
|
|
15
|
+
import { FormElementAppearance } from '../types/theming.types';
|
|
16
|
+
import { FormElementVariant } from './../types/theming.types';
|
|
17
|
+
import { ArdAddCustomTemplateDirective, ArdDropdownFooterTemplateDirective, ArdDropdownHeaderTemplateDirective, ArdItemDisplayLimitTemplateDirective, ArdItemLimitReachedTemplateDirective, ArdLoadingPlaceholderTemplateDirective, ArdLoadingSpinnerTemplateDirective, ArdNoItemsFoundTemplateDirective, ArdOptgroupTemplateDirective, ArdOptionTemplateDirective, ArdSelectPlaceholderTemplateDirective, ArdSelectPrefixTemplateDirective, ArdSelectSuffixTemplateDirective, ArdValueTemplateDirective, } from './select.directive';
|
|
18
|
+
import * as i0 from "@angular/core";
|
|
19
|
+
import * as i1 from "@angular/cdk/overlay";
|
|
20
|
+
import * as i2 from "@angular/common";
|
|
21
|
+
import * as i3 from "../form-field-frame/form-field-frame.component";
|
|
22
|
+
import * as i4 from "../dropdown-panel/dropdown-panel.component";
|
|
23
|
+
import * as i5 from "../chip/deletable-chip/deletable-chip.component";
|
|
24
|
+
import * as i6 from "@ardium-ui/devkit";
|
|
25
|
+
import * as i7 from "../_internal/clear-button/clear-button.component";
|
|
26
|
+
export class ArdiumSelectComponent extends _NgModelComponentBase {
|
|
27
|
+
get itemsAlreadyGrouped() {
|
|
28
|
+
return this._itemsAlreadyGrouped;
|
|
29
|
+
}
|
|
30
|
+
set itemsAlreadyGrouped(v) {
|
|
31
|
+
this._itemsAlreadyGrouped = coerceBooleanProperty(v);
|
|
32
|
+
}
|
|
33
|
+
get invertDisabled() {
|
|
34
|
+
return this._invertDisabled;
|
|
35
|
+
}
|
|
36
|
+
set invertDisabled(v) {
|
|
37
|
+
this._invertDisabled = coerceBooleanProperty(v);
|
|
38
|
+
}
|
|
39
|
+
get noGroupActions() {
|
|
40
|
+
return this._noGroupActions;
|
|
41
|
+
}
|
|
42
|
+
set noGroupActions(v) {
|
|
43
|
+
this._noGroupActions = coerceBooleanProperty(v);
|
|
44
|
+
}
|
|
45
|
+
get autoHighlightFirst() {
|
|
46
|
+
return this._autoHighlightFirst;
|
|
47
|
+
}
|
|
48
|
+
set autoHighlightFirst(v) {
|
|
49
|
+
this._autoHighlightFirst = coerceBooleanProperty(v);
|
|
50
|
+
}
|
|
51
|
+
get autoFocus() {
|
|
52
|
+
return this._autoFocus;
|
|
53
|
+
}
|
|
54
|
+
set autoFocus(v) {
|
|
55
|
+
this._autoFocus = coerceBooleanProperty(v);
|
|
56
|
+
}
|
|
57
|
+
get keepOpen() {
|
|
58
|
+
return this._keepOpen;
|
|
59
|
+
}
|
|
60
|
+
set keepOpen(v) {
|
|
61
|
+
this._keepOpen = coerceBooleanProperty(v);
|
|
62
|
+
}
|
|
63
|
+
get hideSelected() {
|
|
64
|
+
return this._hideSelected;
|
|
65
|
+
}
|
|
66
|
+
set hideSelected(v) {
|
|
67
|
+
this._hideSelected = coerceBooleanProperty(v);
|
|
68
|
+
}
|
|
69
|
+
get noBackspaceClear() {
|
|
70
|
+
return this._clearOnBackspace;
|
|
71
|
+
}
|
|
72
|
+
set noBackspaceClear(v) {
|
|
73
|
+
this._clearOnBackspace = coerceBooleanProperty(v);
|
|
74
|
+
}
|
|
75
|
+
get sortMultipleValues() {
|
|
76
|
+
return this._sortMultipleValues;
|
|
77
|
+
}
|
|
78
|
+
set sortMultipleValues(v) {
|
|
79
|
+
this._sortMultipleValues = coerceBooleanProperty(v);
|
|
80
|
+
}
|
|
81
|
+
get searchCaseSensitive() {
|
|
82
|
+
return this._searchCaseSensitive;
|
|
83
|
+
}
|
|
84
|
+
set searchCaseSensitive(v) {
|
|
85
|
+
this._searchCaseSensitive = coerceBooleanProperty(v);
|
|
86
|
+
}
|
|
87
|
+
get keepSearchAfterSelect() {
|
|
88
|
+
return this._keepSearchAfterSelect;
|
|
89
|
+
}
|
|
90
|
+
set keepSearchAfterSelect(v) {
|
|
91
|
+
this._keepSearchAfterSelect = coerceBooleanProperty(v);
|
|
92
|
+
}
|
|
93
|
+
get maxSelectedItems() {
|
|
94
|
+
return this._maxSelectedItems;
|
|
95
|
+
}
|
|
96
|
+
set maxSelectedItems(v) {
|
|
97
|
+
this._maxSelectedItems = coerceNumberProperty(v, undefined);
|
|
98
|
+
}
|
|
99
|
+
get itemDisplayLimit() {
|
|
100
|
+
return this._itemDisplayLimit;
|
|
101
|
+
}
|
|
102
|
+
set itemDisplayLimit(v) {
|
|
103
|
+
this._itemDisplayLimit = coerceNumberProperty(v, Infinity);
|
|
104
|
+
}
|
|
105
|
+
get searchFn() {
|
|
106
|
+
return this._searchFn;
|
|
107
|
+
}
|
|
108
|
+
set searchFn(fn) {
|
|
109
|
+
if (fn !== undefined && fn !== null && !isFunction(fn)) {
|
|
110
|
+
throw Error('`searchFn` must be a function.');
|
|
111
|
+
}
|
|
112
|
+
this._searchFn = fn;
|
|
113
|
+
}
|
|
114
|
+
get compareWith() {
|
|
115
|
+
return this._compareWith;
|
|
116
|
+
}
|
|
117
|
+
set compareWith(fn) {
|
|
118
|
+
if (fn !== undefined && fn !== null && !isFunction(fn)) {
|
|
119
|
+
throw Error('`compareWith` must be a function.');
|
|
120
|
+
}
|
|
121
|
+
this._compareWith = fn;
|
|
122
|
+
}
|
|
123
|
+
get compact() {
|
|
124
|
+
return this._compact;
|
|
125
|
+
}
|
|
126
|
+
set compact(v) {
|
|
127
|
+
this._compact = coerceBooleanProperty(v);
|
|
128
|
+
}
|
|
129
|
+
get ngClasses() {
|
|
130
|
+
return [
|
|
131
|
+
//appearance, variant handled in ard-form-field-frame component
|
|
132
|
+
this.compact ? 'ard-compact' : '',
|
|
133
|
+
this.multiselectable ? 'ard-multiselect' : 'ard-singleselect',
|
|
134
|
+
this.clearable ? 'ard-clearable' : '',
|
|
135
|
+
this.searchable ? 'ard-searchable' : '',
|
|
136
|
+
this.filtered ? 'ard-filtered' : '',
|
|
137
|
+
this.touched ? 'ard-touched' : '',
|
|
138
|
+
this.isDropdownOpen ? 'ard-dropdown-open' : '',
|
|
139
|
+
this._searchBarFocused ? 'ard-select-focused' : '',
|
|
140
|
+
this._searchBarFocused ? 'ard-select-focused' : '',
|
|
141
|
+
].join(' ');
|
|
142
|
+
}
|
|
143
|
+
set dropdowonAppearance(v) {
|
|
144
|
+
this._dropdownAppearance = v;
|
|
145
|
+
}
|
|
146
|
+
get dropdownAppearance() {
|
|
147
|
+
if (this._dropdownAppearance)
|
|
148
|
+
return this._dropdownAppearance;
|
|
149
|
+
if (this.appearance == FormElementAppearance.Outlined)
|
|
150
|
+
return DropdownPanelAppearance.Outlined;
|
|
151
|
+
return DropdownPanelAppearance.Raised;
|
|
152
|
+
}
|
|
153
|
+
set dropdowonVariant(v) {
|
|
154
|
+
this._dropdownVariant = v;
|
|
155
|
+
}
|
|
156
|
+
get dropdownVariant() {
|
|
157
|
+
if (this._dropdownVariant)
|
|
158
|
+
return this._dropdownVariant;
|
|
159
|
+
if (this.variant == FormElementVariant.Pill)
|
|
160
|
+
return DropdownPanelVariant.Rounded;
|
|
161
|
+
return this.variant;
|
|
162
|
+
}
|
|
163
|
+
//! items setter/getter
|
|
164
|
+
get items() {
|
|
165
|
+
return this._items;
|
|
166
|
+
}
|
|
167
|
+
set items(value) {
|
|
168
|
+
this.isItemsInputUsed = true;
|
|
169
|
+
if (value === null) {
|
|
170
|
+
value = [];
|
|
171
|
+
this.isItemsInputUsed = false;
|
|
172
|
+
}
|
|
173
|
+
else if (isAnyString(value)) {
|
|
174
|
+
value = coerceArrayProperty(value);
|
|
175
|
+
}
|
|
176
|
+
let printErrors = this.itemStorage.setItems(value);
|
|
177
|
+
if (printErrors) {
|
|
178
|
+
this._printPrimitiveWarnings();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
_setItemsFromComponents() {
|
|
182
|
+
const handleOptionChange = () => {
|
|
183
|
+
const changedOrDestroyed = merge(this.optionComponents.changes, this._destroy$);
|
|
184
|
+
merge(...this.optionComponents.map(option => option.stateChange$))
|
|
185
|
+
.pipe(takeUntil(changedOrDestroyed))
|
|
186
|
+
.subscribe(option => {
|
|
187
|
+
setTimeout(() => {
|
|
188
|
+
const item = this.itemStorage.findItemByValue(option.oldValue ?? option.value);
|
|
189
|
+
if (item) {
|
|
190
|
+
item.disabled = option.disabled;
|
|
191
|
+
item.label = option.label || item.label;
|
|
192
|
+
item.value = option.value;
|
|
193
|
+
item.itemData.disabled = option.disabled;
|
|
194
|
+
item.itemData.label = option.label || item.label;
|
|
195
|
+
item.itemData.value = option.value;
|
|
196
|
+
}
|
|
197
|
+
this.detectChanges();
|
|
198
|
+
}, 0);
|
|
199
|
+
});
|
|
200
|
+
};
|
|
201
|
+
this.optionComponents.changes
|
|
202
|
+
.pipe(startWith(this.optionComponents), takeUntil(this._destroy$))
|
|
203
|
+
.subscribe((options) => {
|
|
204
|
+
if (options.length == 0)
|
|
205
|
+
return;
|
|
206
|
+
setTimeout(() => {
|
|
207
|
+
this.items = options.map(option => ({
|
|
208
|
+
value: option.value,
|
|
209
|
+
label: option.label,
|
|
210
|
+
disabled: option.disabled,
|
|
211
|
+
}));
|
|
212
|
+
handleOptionChange();
|
|
213
|
+
this.detectChanges();
|
|
214
|
+
}, 0);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
get multiselectable() {
|
|
218
|
+
return this._multiselectable;
|
|
219
|
+
}
|
|
220
|
+
set multiselectable(v) {
|
|
221
|
+
this._multiselectable = coerceBooleanProperty(v);
|
|
222
|
+
}
|
|
223
|
+
get singleselectable() {
|
|
224
|
+
return !this._multiselectable;
|
|
225
|
+
}
|
|
226
|
+
get clearable() {
|
|
227
|
+
return this._clearable;
|
|
228
|
+
}
|
|
229
|
+
set clearable(v) {
|
|
230
|
+
this._clearable = coerceBooleanProperty(v);
|
|
231
|
+
}
|
|
232
|
+
get searchable() {
|
|
233
|
+
return this._searchable;
|
|
234
|
+
}
|
|
235
|
+
set searchable(v) {
|
|
236
|
+
this._searchable = coerceBooleanProperty(v);
|
|
237
|
+
}
|
|
238
|
+
get filtered() {
|
|
239
|
+
return this._searchable && this.searchTerm != '';
|
|
240
|
+
}
|
|
241
|
+
get touched() {
|
|
242
|
+
return this._touched;
|
|
243
|
+
}
|
|
244
|
+
set touched(state) {
|
|
245
|
+
this._touched = state;
|
|
246
|
+
}
|
|
247
|
+
get addCustom() {
|
|
248
|
+
return this._addCustom;
|
|
249
|
+
}
|
|
250
|
+
set addCustom(v) {
|
|
251
|
+
if (isFunction(v)) {
|
|
252
|
+
this._addCustom = v;
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
//coerce the value into a boolean
|
|
256
|
+
//if "true", use the default function. Otherwise, just set to "false".
|
|
257
|
+
this._addCustom = coerceBooleanProperty(v) && this._defaultAddCustomFn;
|
|
258
|
+
}
|
|
259
|
+
get shouldShowAddCustom() {
|
|
260
|
+
return this.addCustom != false && this.searchTerm.length > 0 && this.itemStorage.isNoItemsFound;
|
|
261
|
+
}
|
|
262
|
+
async addCustomOption(value) {
|
|
263
|
+
if (!this.addCustom)
|
|
264
|
+
return;
|
|
265
|
+
const newOptionObj = await this.itemStorage.addCustomOption(value, this.addCustom);
|
|
266
|
+
this.selectItem(newOptionObj);
|
|
267
|
+
}
|
|
268
|
+
//! control value accessor
|
|
269
|
+
//override the writeValue and setDisabledState defined in _NgModelComponent
|
|
270
|
+
setDisabledState(state) {
|
|
271
|
+
this._disabled = state;
|
|
272
|
+
this._cd.markForCheck();
|
|
273
|
+
}
|
|
274
|
+
writeValue(ngModel) {
|
|
275
|
+
this.itemStorage.handleWriteValue(ngModel);
|
|
276
|
+
this._cd.markForCheck();
|
|
277
|
+
}
|
|
278
|
+
//* change & touch event emitters
|
|
279
|
+
_emitChange() {
|
|
280
|
+
let value = this.itemStorage.value;
|
|
281
|
+
this._onChangeRegistered?.(value);
|
|
282
|
+
this.changeEvent.emit(value);
|
|
283
|
+
this.valueChange.emit(value);
|
|
284
|
+
}
|
|
285
|
+
_onTouched() {
|
|
286
|
+
this.touched = true;
|
|
287
|
+
this._onTouchedRegistered?.();
|
|
288
|
+
}
|
|
289
|
+
//! value input & output
|
|
290
|
+
set value(newValue) {
|
|
291
|
+
//if is a string, coerce it into array of strings
|
|
292
|
+
if (isAnyString(newValue))
|
|
293
|
+
newValue = coerceArrayProperty(newValue);
|
|
294
|
+
//if it is not a string and not an array, just put it in an array
|
|
295
|
+
else if (!isArray(newValue))
|
|
296
|
+
newValue = [newValue];
|
|
297
|
+
this.writeValue(newValue);
|
|
298
|
+
}
|
|
299
|
+
get value() {
|
|
300
|
+
return this.itemStorage.value;
|
|
301
|
+
}
|
|
302
|
+
//! context providers
|
|
303
|
+
getValueContext(item) {
|
|
304
|
+
const $this = this;
|
|
305
|
+
return {
|
|
306
|
+
$implicit: item,
|
|
307
|
+
item,
|
|
308
|
+
itemData: item.itemData,
|
|
309
|
+
unselect() {
|
|
310
|
+
$this.unselectItem(item);
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
getStatsContext() {
|
|
315
|
+
return {
|
|
316
|
+
totalItems: this.totalItems,
|
|
317
|
+
foundItems: this.foundItems,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
getSearchContext() {
|
|
321
|
+
return {
|
|
322
|
+
$implicit: this.searchTerm,
|
|
323
|
+
searchTerm: this.searchTerm,
|
|
324
|
+
totalItems: this.totalItems,
|
|
325
|
+
foundItems: this.foundItems,
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
getPlaceholderContext() {
|
|
329
|
+
const placeholder = this.placeholderForCurrentContext;
|
|
330
|
+
return {
|
|
331
|
+
placeholder,
|
|
332
|
+
$implicit: placeholder,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
getCustomOptionContext() {
|
|
336
|
+
return {
|
|
337
|
+
$implicit: this.searchTerm,
|
|
338
|
+
searchTerm: this.searchTerm,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
getGroupContext(group) {
|
|
342
|
+
return {
|
|
343
|
+
$implicit: group,
|
|
344
|
+
group,
|
|
345
|
+
selectedChildren: group.children.filter(v => v.selected).length,
|
|
346
|
+
totalChildren: group.children.length,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
getOptionContext(item) {
|
|
350
|
+
return {
|
|
351
|
+
$implicit: item,
|
|
352
|
+
item,
|
|
353
|
+
itemData: item.itemData,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
getItemLimitContext() {
|
|
357
|
+
return {
|
|
358
|
+
totalItems: this.totalItems,
|
|
359
|
+
selectedItems: this.itemStorage.selectedItems.length,
|
|
360
|
+
itemLimit: this.maxSelectedItems,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
getItemDisplayLimitContext() {
|
|
364
|
+
let selectedItems = this.itemStorage.selectedItems.length;
|
|
365
|
+
return {
|
|
366
|
+
totalItems: this.totalItems,
|
|
367
|
+
selectedItems,
|
|
368
|
+
itemLimit: this.maxSelectedItems,
|
|
369
|
+
overflowCount: selectedItems - (this.itemDisplayLimit ?? 0),
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
constructor(_elementRef, _cd, overlay, viewContainerRef, scrollStrategyOpts) {
|
|
373
|
+
super();
|
|
374
|
+
this._cd = _cd;
|
|
375
|
+
this.overlay = overlay;
|
|
376
|
+
this.viewContainerRef = viewContainerRef;
|
|
377
|
+
this.scrollStrategyOpts = scrollStrategyOpts;
|
|
378
|
+
//! public constants
|
|
379
|
+
this.itemStorage = new ItemStorage(this);
|
|
380
|
+
this.DEFAULTS = {
|
|
381
|
+
valueFrom: 'value',
|
|
382
|
+
labelFrom: 'label',
|
|
383
|
+
disabledFrom: 'disabled',
|
|
384
|
+
groupLabelFrom: 'group',
|
|
385
|
+
groupDisabledFrom: 'disabled',
|
|
386
|
+
childrenFrom: 'children',
|
|
387
|
+
searchFn: searchFunctions.byLabel,
|
|
388
|
+
clearButtonTitle: 'Clear',
|
|
389
|
+
noItemsFoundText: 'No items found.',
|
|
390
|
+
loadingPlaceholderText: 'Loading...',
|
|
391
|
+
};
|
|
392
|
+
//! privates
|
|
393
|
+
this._items = [];
|
|
394
|
+
this._isMouseBeingUsed = false;
|
|
395
|
+
this._searchBarFocused = false;
|
|
396
|
+
this._destroy$ = new Subject();
|
|
397
|
+
//! publics
|
|
398
|
+
this.searchTerm = '';
|
|
399
|
+
this.isItemsInputUsed = false;
|
|
400
|
+
//! settings
|
|
401
|
+
this.placeholder = 'Select item';
|
|
402
|
+
this.searchPlaceholder = 'Search...';
|
|
403
|
+
this.dropdownPosition = ArdPanelPosition.Auto;
|
|
404
|
+
this.clearButtonTitle = this.DEFAULTS.clearButtonTitle;
|
|
405
|
+
//! template-related settings
|
|
406
|
+
this.noItemsFoundText = this.DEFAULTS.noItemsFoundText;
|
|
407
|
+
this.loadingPlaceholderText = this.DEFAULTS.loadingPlaceholderText;
|
|
408
|
+
//! other inputs
|
|
409
|
+
this.isLoading = false;
|
|
410
|
+
this.inputAttrs = {};
|
|
411
|
+
this.htmlId = crypto.randomUUID();
|
|
412
|
+
//! boolean settings
|
|
413
|
+
this._itemsAlreadyGrouped = false;
|
|
414
|
+
//should the value that the "disabledFrom" path lead to be inverted?
|
|
415
|
+
//useful when the property is e.g. "active", which is the oposite of "disabled"
|
|
416
|
+
this._invertDisabled = false;
|
|
417
|
+
this._noGroupActions = false;
|
|
418
|
+
this._autoHighlightFirst = true;
|
|
419
|
+
this._autoFocus = false;
|
|
420
|
+
this._keepOpen = false;
|
|
421
|
+
this._hideSelected = false;
|
|
422
|
+
this._clearOnBackspace = false;
|
|
423
|
+
this._sortMultipleValues = false;
|
|
424
|
+
this._searchCaseSensitive = false;
|
|
425
|
+
this._keepSearchAfterSelect = false;
|
|
426
|
+
//! number inputs
|
|
427
|
+
this._maxSelectedItems = undefined;
|
|
428
|
+
this._itemDisplayLimit = Infinity;
|
|
429
|
+
//! function inputs
|
|
430
|
+
this._searchFn = this.DEFAULTS.searchFn;
|
|
431
|
+
//! appearance
|
|
432
|
+
this.appearance = FormElementAppearance.Outlined;
|
|
433
|
+
this.variant = FormElementVariant.Rounded;
|
|
434
|
+
this._compact = false;
|
|
435
|
+
this._dropdownAppearance = undefined;
|
|
436
|
+
this._dropdownVariant = undefined;
|
|
437
|
+
//! class-based inputs
|
|
438
|
+
this.groupItems = false; //default value may be changed to "true" in ngOnChanges if this.groupBy is defined or this.itemsAlreadyGrouped is set to "true"
|
|
439
|
+
//! attribute and/or class setters/getters
|
|
440
|
+
this._multiselectable = false;
|
|
441
|
+
this._clearable = true;
|
|
442
|
+
this._searchable = false;
|
|
443
|
+
this._touched = false;
|
|
444
|
+
//! custom options
|
|
445
|
+
this._defaultAddCustomFn = (value) => value;
|
|
446
|
+
this._addCustom = false;
|
|
447
|
+
this.valueChange = new EventEmitter();
|
|
448
|
+
//! output events
|
|
449
|
+
this.changeEvent = new EventEmitter();
|
|
450
|
+
this.addEvent = new EventEmitter();
|
|
451
|
+
this.failedToAddEvent = new EventEmitter();
|
|
452
|
+
this.removeEvent = new EventEmitter();
|
|
453
|
+
this.clearEvent = new EventEmitter();
|
|
454
|
+
this.openEvent = new EventEmitter();
|
|
455
|
+
this.closeEvent = new EventEmitter();
|
|
456
|
+
this.scrollEvent = new EventEmitter();
|
|
457
|
+
this.scrollToEndEvent = new EventEmitter();
|
|
458
|
+
this.searchEvent = new EventEmitter();
|
|
459
|
+
this.isDropdownOpenChange = new EventEmitter();
|
|
460
|
+
//! click handlers
|
|
461
|
+
this._isClickedWithin = false;
|
|
462
|
+
this.element = _elementRef.nativeElement;
|
|
463
|
+
}
|
|
464
|
+
_createOverlay() {
|
|
465
|
+
const strategy = this.overlay
|
|
466
|
+
.position()
|
|
467
|
+
.flexibleConnectedTo(this.dropdownHost)
|
|
468
|
+
.withPositions([
|
|
469
|
+
{
|
|
470
|
+
originX: 'start',
|
|
471
|
+
originY: 'bottom',
|
|
472
|
+
overlayX: 'start',
|
|
473
|
+
overlayY: 'top',
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
originX: 'start',
|
|
477
|
+
originY: 'top',
|
|
478
|
+
overlayX: 'start',
|
|
479
|
+
overlayY: 'bottom',
|
|
480
|
+
},
|
|
481
|
+
]);
|
|
482
|
+
const config = new OverlayConfig({
|
|
483
|
+
positionStrategy: strategy,
|
|
484
|
+
scrollStrategy: this.scrollStrategyOpts.block(),
|
|
485
|
+
hasBackdrop: false,
|
|
486
|
+
});
|
|
487
|
+
this.dropdownOverlay = this.overlay.create(config);
|
|
488
|
+
const portal = new TemplatePortal(this.dropdownTemplate, this.viewContainerRef);
|
|
489
|
+
this.dropdownOverlay.attach(portal);
|
|
490
|
+
this.setOverlaySize();
|
|
491
|
+
}
|
|
492
|
+
_destroyOverlay() {
|
|
493
|
+
if (!this.dropdownOverlay)
|
|
494
|
+
return;
|
|
495
|
+
this.dropdownOverlay.dispose();
|
|
496
|
+
delete this.dropdownOverlay;
|
|
497
|
+
}
|
|
498
|
+
setOverlaySize() {
|
|
499
|
+
if (!this.dropdownOverlay)
|
|
500
|
+
return;
|
|
501
|
+
const rect = this.dropdownHost.nativeElement.getBoundingClientRect();
|
|
502
|
+
this.dropdownOverlay.updateSize({ width: rect.width });
|
|
503
|
+
}
|
|
504
|
+
onWindowResize() {
|
|
505
|
+
this.setOverlaySize();
|
|
506
|
+
}
|
|
507
|
+
//! hooks
|
|
508
|
+
ngOnInit() {
|
|
509
|
+
this._setSearchInputAttributes();
|
|
510
|
+
}
|
|
511
|
+
ngOnDestroy() {
|
|
512
|
+
this._destroy$.next();
|
|
513
|
+
this._destroy$.complete();
|
|
514
|
+
}
|
|
515
|
+
ngAfterViewInit() {
|
|
516
|
+
if (this.autoFocus) {
|
|
517
|
+
this.focus();
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
ngAfterContentInit() {
|
|
521
|
+
if (!this.isItemsInputUsed) {
|
|
522
|
+
this._setItemsFromComponents();
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
ngOnChanges(changes) {
|
|
526
|
+
//fire items load handler when loading is set to false
|
|
527
|
+
if (changes['loading']) {
|
|
528
|
+
if (changes['loading'].currentValue == false) {
|
|
529
|
+
this._onItemsLoad();
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
//set groupItems to true by default if groupLabelFrom or itemsAlreadyGrouped is set to true as the first change
|
|
533
|
+
if ((changes['groupLabelFrom']?.firstChange || changes['itemsAlreadyGrouped']?.firstChange) && !changes['groupItems']) {
|
|
534
|
+
this.groupItems = true;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
_onItemsLoad() {
|
|
538
|
+
if (!this._searchBarFocused)
|
|
539
|
+
return;
|
|
540
|
+
this.open();
|
|
541
|
+
}
|
|
542
|
+
_printPrimitiveWarnings() {
|
|
543
|
+
function makeWarning(str) {
|
|
544
|
+
console.warn(`Skipped using [${str}] property bound to <ard-select>, as some provided items are of primitive type`);
|
|
545
|
+
}
|
|
546
|
+
if (this.valueFrom) {
|
|
547
|
+
makeWarning('valueFrom');
|
|
548
|
+
}
|
|
549
|
+
if (this.labelFrom) {
|
|
550
|
+
makeWarning('labelFrom');
|
|
551
|
+
}
|
|
552
|
+
if (this.disabledFrom) {
|
|
553
|
+
makeWarning('disabledFrom');
|
|
554
|
+
}
|
|
555
|
+
if (this.groupLabelFrom) {
|
|
556
|
+
makeWarning('groupLabelFrom');
|
|
557
|
+
}
|
|
558
|
+
if (this.groupDisabledFrom) {
|
|
559
|
+
makeWarning('groupDisabledFrom');
|
|
560
|
+
}
|
|
561
|
+
if (this.childrenFrom) {
|
|
562
|
+
makeWarning('childrenFrom');
|
|
563
|
+
}
|
|
564
|
+
if (this.invertDisabled) {
|
|
565
|
+
makeWarning('invertDisabled');
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
//! getters
|
|
569
|
+
get firstHighlightedItem() {
|
|
570
|
+
return this.itemStorage.highlightedItems?.first();
|
|
571
|
+
}
|
|
572
|
+
get shouldDisplayPlaceholder() {
|
|
573
|
+
return !this.itemStorage.isAnyItemSelected && !this.searchTerm;
|
|
574
|
+
}
|
|
575
|
+
get shouldDisplayValue() {
|
|
576
|
+
return this.itemStorage.isAnyItemSelected && (!this.searchTerm || this.multiselectable);
|
|
577
|
+
}
|
|
578
|
+
get shouldShowClearButton() {
|
|
579
|
+
return this._clearable && !this._disabled && (this.itemStorage.isAnyItemSelected || this.searchTerm != '');
|
|
580
|
+
}
|
|
581
|
+
get itemsToDisplay() {
|
|
582
|
+
return this.itemStorage.groups.values();
|
|
583
|
+
}
|
|
584
|
+
get shouldShowNoItemsFound() {
|
|
585
|
+
return this.itemStorage.isNoItemsFound && !this.isLoading && !this.shouldShowAddCustom;
|
|
586
|
+
}
|
|
587
|
+
get totalItems() {
|
|
588
|
+
return this.itemStorage.items.length;
|
|
589
|
+
}
|
|
590
|
+
get foundItems() {
|
|
591
|
+
if (!this.searchable)
|
|
592
|
+
return undefined;
|
|
593
|
+
return this.itemStorage.filteredItems.length;
|
|
594
|
+
}
|
|
595
|
+
get shouldShowItemDisplayLimit() {
|
|
596
|
+
return this.multiselectable && this.itemDisplayLimit != Infinity && this.itemStorage.selectedItems.length > this.itemDisplayLimit;
|
|
597
|
+
}
|
|
598
|
+
get isInputElementReadonly() {
|
|
599
|
+
return !this.addCustom && (!this.searchable || this.itemStorage.isItemLimitReached);
|
|
600
|
+
}
|
|
601
|
+
isValueWithinDisplayLimit(i) {
|
|
602
|
+
return !this.multiselectable || this.itemDisplayLimit == Infinity || i < this.itemDisplayLimit;
|
|
603
|
+
}
|
|
604
|
+
get placeholderForCurrentContext() {
|
|
605
|
+
if (this.searchPlaceholder && this.searchable && (this._searchBarFocused || this._isClickedWithin))
|
|
606
|
+
return this.searchPlaceholder;
|
|
607
|
+
return this.placeholder;
|
|
608
|
+
}
|
|
609
|
+
//! search input event handlers
|
|
610
|
+
filter(filterTerm, suppressSearchEvent = false) {
|
|
611
|
+
this.searchTerm = filterTerm;
|
|
612
|
+
let matching = this.itemStorage.filter(filterTerm);
|
|
613
|
+
if (!suppressSearchEvent)
|
|
614
|
+
this.searchEvent.emit({ search: filterTerm, matching });
|
|
615
|
+
this.open();
|
|
616
|
+
}
|
|
617
|
+
onSearchInputFocus(event) {
|
|
618
|
+
this._searchBarFocused = true;
|
|
619
|
+
}
|
|
620
|
+
onSearchInputBlur(event) {
|
|
621
|
+
if (!this._searchBarFocused)
|
|
622
|
+
return;
|
|
623
|
+
this._onTouched();
|
|
624
|
+
this._searchBarFocused = false;
|
|
625
|
+
}
|
|
626
|
+
//! item selection handlers
|
|
627
|
+
toggleItem(item) {
|
|
628
|
+
if (item.selected) {
|
|
629
|
+
this.unselectItem(item);
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
this.selectItem(item);
|
|
633
|
+
}
|
|
634
|
+
selectItem(...items) {
|
|
635
|
+
let [selected, unselected, failedToSelect] = this.itemStorage.selectItem(...items);
|
|
636
|
+
if (unselected.length > 0)
|
|
637
|
+
this.removeEvent.emit(unselected);
|
|
638
|
+
if (failedToSelect.length > 0) {
|
|
639
|
+
this.failedToAddEvent.emit(failedToSelect);
|
|
640
|
+
}
|
|
641
|
+
if (selected.length > 0) {
|
|
642
|
+
this.addEvent.emit(selected);
|
|
643
|
+
this._emitChange();
|
|
644
|
+
this.focus();
|
|
645
|
+
if (!this.keepSearchAfterSelect)
|
|
646
|
+
this._clearSearch(true);
|
|
647
|
+
if (!this.keepOpen || this.itemStorage.isNoItemsToSelect) {
|
|
648
|
+
this.close();
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
unselectItem(...items) {
|
|
653
|
+
let unselected = this.itemStorage.unselectItem(...items);
|
|
654
|
+
this.removeEvent.emit(unselected);
|
|
655
|
+
this._emitChange();
|
|
656
|
+
if (!this.keepSearchAfterSelect)
|
|
657
|
+
this._clearSearch();
|
|
658
|
+
this.focus();
|
|
659
|
+
if (!this.keepOpen || this.itemStorage.isNoItemsToSelect) {
|
|
660
|
+
this.close();
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
_clearAllItems() {
|
|
664
|
+
let cleared = this.itemStorage.clearAllSelected(true);
|
|
665
|
+
this.focus();
|
|
666
|
+
this.clearEvent.emit();
|
|
667
|
+
this.removeEvent.emit(cleared);
|
|
668
|
+
this._emitChange();
|
|
669
|
+
}
|
|
670
|
+
_clearLastItem() {
|
|
671
|
+
let clearedValue = this.itemStorage.clearLastSelected().value;
|
|
672
|
+
this.focus();
|
|
673
|
+
this.removeEvent.emit([clearedValue]);
|
|
674
|
+
this._emitChange();
|
|
675
|
+
}
|
|
676
|
+
//! highligh-related
|
|
677
|
+
onMouseMove() {
|
|
678
|
+
this._isMouseBeingUsed = true;
|
|
679
|
+
}
|
|
680
|
+
onGroupMouseover(group) {
|
|
681
|
+
if (!this.multiselectable || this.noGroupActions)
|
|
682
|
+
return;
|
|
683
|
+
this.itemStorage.highlightGroup(group);
|
|
684
|
+
}
|
|
685
|
+
onItemMouseOver(event) {
|
|
686
|
+
event.stopPropagation();
|
|
687
|
+
}
|
|
688
|
+
onItemMouseEnter(option, event) {
|
|
689
|
+
if (!this._isMouseBeingUsed)
|
|
690
|
+
return;
|
|
691
|
+
this.itemStorage.highlightSingleItem(option);
|
|
692
|
+
event.stopPropagation();
|
|
693
|
+
}
|
|
694
|
+
onItemMouseLeave(option, event) {
|
|
695
|
+
if (!this._isMouseBeingUsed)
|
|
696
|
+
return;
|
|
697
|
+
this.itemStorage.unhighlightItem(option);
|
|
698
|
+
event.stopPropagation();
|
|
699
|
+
}
|
|
700
|
+
onItemClick(option, event) {
|
|
701
|
+
event.stopPropagation();
|
|
702
|
+
if (this.clearable)
|
|
703
|
+
this.toggleItem(option);
|
|
704
|
+
else
|
|
705
|
+
this.selectItem(option);
|
|
706
|
+
this._isClickedWithin = true;
|
|
707
|
+
}
|
|
708
|
+
onGroupClick(group) {
|
|
709
|
+
if (!this.multiselectable || this.noGroupActions)
|
|
710
|
+
return;
|
|
711
|
+
if (group.children.every(o => o.selected)) {
|
|
712
|
+
this.unselectItem(...group.children);
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
715
|
+
this.selectItem(...group.children);
|
|
716
|
+
this._isClickedWithin = true;
|
|
717
|
+
}
|
|
718
|
+
handleClearButtonClick(event) {
|
|
719
|
+
event.stopPropagation();
|
|
720
|
+
if (this.searchTerm) {
|
|
721
|
+
this._clearSearch();
|
|
722
|
+
return;
|
|
723
|
+
}
|
|
724
|
+
this._clearAllItems();
|
|
725
|
+
}
|
|
726
|
+
handleDropdownArrowClick(event) {
|
|
727
|
+
event.stopPropagation();
|
|
728
|
+
this._isClickedWithin = true;
|
|
729
|
+
this.toggle();
|
|
730
|
+
}
|
|
731
|
+
handleOutsideClick(event) {
|
|
732
|
+
if (!this.isDropdownOpen)
|
|
733
|
+
return;
|
|
734
|
+
const target = event.target;
|
|
735
|
+
if (this.element.contains(target))
|
|
736
|
+
return;
|
|
737
|
+
this.close();
|
|
738
|
+
}
|
|
739
|
+
handleAnywhereClick(event) {
|
|
740
|
+
const target = event.target;
|
|
741
|
+
if (target.tagName != 'INPUT') {
|
|
742
|
+
event.preventDefault();
|
|
743
|
+
}
|
|
744
|
+
this._isClickedWithin = true;
|
|
745
|
+
if (!this._searchBarFocused) {
|
|
746
|
+
this.focus();
|
|
747
|
+
}
|
|
748
|
+
if (this._searchable) {
|
|
749
|
+
this.open();
|
|
750
|
+
}
|
|
751
|
+
else {
|
|
752
|
+
this.toggle();
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
onMouseup() {
|
|
756
|
+
this._isClickedWithin = false;
|
|
757
|
+
}
|
|
758
|
+
//! dropdown state handlers
|
|
759
|
+
toggle() {
|
|
760
|
+
if (this.isDropdownOpen) {
|
|
761
|
+
this.close();
|
|
762
|
+
return;
|
|
763
|
+
}
|
|
764
|
+
this.open();
|
|
765
|
+
}
|
|
766
|
+
open() {
|
|
767
|
+
if (this.disabled || this.isDropdownOpen)
|
|
768
|
+
return;
|
|
769
|
+
this.isDropdownOpen = true;
|
|
770
|
+
if (this.autoHighlightFirst)
|
|
771
|
+
this.itemStorage.highlightFirstItem();
|
|
772
|
+
this._createOverlay();
|
|
773
|
+
this.focus();
|
|
774
|
+
this.openEvent.emit();
|
|
775
|
+
this.isDropdownOpenChange.emit(this.isDropdownOpen);
|
|
776
|
+
this.detectChanges();
|
|
777
|
+
}
|
|
778
|
+
close() {
|
|
779
|
+
if (!this.isDropdownOpen)
|
|
780
|
+
return;
|
|
781
|
+
this.isDropdownOpen = false;
|
|
782
|
+
this._destroyOverlay();
|
|
783
|
+
this._onTouched();
|
|
784
|
+
this.closeEvent.emit();
|
|
785
|
+
this.isDropdownOpenChange.emit(this.isDropdownOpen);
|
|
786
|
+
this._cd.markForCheck();
|
|
787
|
+
}
|
|
788
|
+
//! ChangeDetectorRef
|
|
789
|
+
detectChanges() {
|
|
790
|
+
if (!this._cd.destroyed) {
|
|
791
|
+
this._cd.detectChanges();
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
//! search
|
|
795
|
+
_clearSearch(suppressSearchEvent = false) {
|
|
796
|
+
this._setSearch('', suppressSearchEvent);
|
|
797
|
+
}
|
|
798
|
+
_setSearch(searchTerm, suppressSearchEvent = false) {
|
|
799
|
+
this.searchTerm = searchTerm;
|
|
800
|
+
this.filter(searchTerm, suppressSearchEvent);
|
|
801
|
+
}
|
|
802
|
+
_setSearchInputAttributes() {
|
|
803
|
+
const input = this.searchInput.nativeElement;
|
|
804
|
+
const attributes = {
|
|
805
|
+
type: 'text',
|
|
806
|
+
autocorrect: 'off',
|
|
807
|
+
autocapitalize: 'off',
|
|
808
|
+
autocomplete: 'off',
|
|
809
|
+
...this.inputAttrs,
|
|
810
|
+
};
|
|
811
|
+
for (const key of Object.keys(attributes)) {
|
|
812
|
+
input.setAttribute(key, attributes[key]);
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
//! key press handlers
|
|
816
|
+
onKeyPress(event) {
|
|
817
|
+
switch (event.code) {
|
|
818
|
+
case 'Enter': {
|
|
819
|
+
this._onEnterPress(event);
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
case 'Space': {
|
|
823
|
+
this._onSpacePress(event);
|
|
824
|
+
return;
|
|
825
|
+
}
|
|
826
|
+
case 'ArrowDown': {
|
|
827
|
+
this._onArrowDownPress(event);
|
|
828
|
+
return;
|
|
829
|
+
}
|
|
830
|
+
case 'ArrowUp': {
|
|
831
|
+
this._onArrowUpPress(event);
|
|
832
|
+
return;
|
|
833
|
+
}
|
|
834
|
+
case 'Home': {
|
|
835
|
+
this._onHomePress(event);
|
|
836
|
+
return;
|
|
837
|
+
}
|
|
838
|
+
case 'End': {
|
|
839
|
+
this._onEndPress(event);
|
|
840
|
+
return;
|
|
841
|
+
}
|
|
842
|
+
case 'Backspace':
|
|
843
|
+
case 'Delete': {
|
|
844
|
+
this._onBackspaceOrDeletePress(event);
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
case 'KeyA': {
|
|
848
|
+
if (event.ctrlKey) {
|
|
849
|
+
this._onCtrlAPress(event);
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
async _onEnterPress(event) {
|
|
856
|
+
event.preventDefault();
|
|
857
|
+
let shouldClose = true;
|
|
858
|
+
//select the currently highlighted option
|
|
859
|
+
if (this.isDropdownOpen && this.firstHighlightedItem) {
|
|
860
|
+
if (this.clearable && this.itemStorage.highlightedItems.every(item => item.selected)) {
|
|
861
|
+
this.unselectItem(...this.itemStorage.highlightedItems);
|
|
862
|
+
}
|
|
863
|
+
else {
|
|
864
|
+
this.selectItem(...this.itemStorage.highlightedItems);
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
//add a custom option
|
|
868
|
+
else if (this.isDropdownOpen && this.shouldShowAddCustom) {
|
|
869
|
+
await this.addCustomOption(this.searchTerm);
|
|
870
|
+
}
|
|
871
|
+
//in case of no action, open the dropdown (or keep it open)
|
|
872
|
+
else
|
|
873
|
+
shouldClose = false;
|
|
874
|
+
if (!this.keepOpen && shouldClose) {
|
|
875
|
+
this.itemStorage.clearAllHighlights();
|
|
876
|
+
this.close();
|
|
877
|
+
}
|
|
878
|
+
else {
|
|
879
|
+
this.open();
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
_onSpacePress(event) {
|
|
883
|
+
if (this.isDropdownOpen)
|
|
884
|
+
return;
|
|
885
|
+
event.preventDefault();
|
|
886
|
+
this.open();
|
|
887
|
+
}
|
|
888
|
+
_onArrowDownPress(event) {
|
|
889
|
+
event.preventDefault();
|
|
890
|
+
this.open();
|
|
891
|
+
this._isMouseBeingUsed = false;
|
|
892
|
+
const recentlyHighlighted = this.itemStorage.highlightNextItem(+1, event.shiftKey);
|
|
893
|
+
if (recentlyHighlighted) {
|
|
894
|
+
this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
|
|
895
|
+
}
|
|
896
|
+
this.dropdownPanel.scrollToRecentlyHighlighted('bottom');
|
|
897
|
+
}
|
|
898
|
+
_onArrowUpPress(event) {
|
|
899
|
+
if (!this.isDropdownOpen)
|
|
900
|
+
return;
|
|
901
|
+
event.preventDefault();
|
|
902
|
+
this._isMouseBeingUsed = false;
|
|
903
|
+
const recentlyHighlighted = this.itemStorage.highlightNextItem(-1, event.shiftKey);
|
|
904
|
+
if (recentlyHighlighted) {
|
|
905
|
+
this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
|
|
906
|
+
}
|
|
907
|
+
this.dropdownPanel.scrollToRecentlyHighlighted('top');
|
|
908
|
+
}
|
|
909
|
+
_onHomePress(event) {
|
|
910
|
+
if (!this.isDropdownOpen || (this.searchInput.nativeElement.selectionEnd != 0 && this.searchInput.nativeElement.selectionStart != 0))
|
|
911
|
+
return;
|
|
912
|
+
event.preventDefault();
|
|
913
|
+
this._isMouseBeingUsed = false;
|
|
914
|
+
const recentlyHighlighted = this.itemStorage.highlightFirstItem();
|
|
915
|
+
if (!recentlyHighlighted)
|
|
916
|
+
return;
|
|
917
|
+
this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
|
|
918
|
+
this.dropdownPanel.scrollToRecentlyHighlighted('top');
|
|
919
|
+
}
|
|
920
|
+
_onEndPress(event) {
|
|
921
|
+
if (!this.isDropdownOpen ||
|
|
922
|
+
(this.searchInput.nativeElement.selectionEnd != this.searchTerm.length && this.searchInput.nativeElement.selectionStart != this.searchTerm.length))
|
|
923
|
+
return;
|
|
924
|
+
event.preventDefault();
|
|
925
|
+
this._isMouseBeingUsed = false;
|
|
926
|
+
const recentlyHighlighted = this.itemStorage.highlightLastItem();
|
|
927
|
+
if (!recentlyHighlighted)
|
|
928
|
+
return;
|
|
929
|
+
this.itemStorage.setRecentlyHighlighted(recentlyHighlighted);
|
|
930
|
+
this.dropdownPanel.scrollToRecentlyHighlighted('bottom');
|
|
931
|
+
}
|
|
932
|
+
_onBackspaceOrDeletePress(event) {
|
|
933
|
+
if (this.searchTerm || !this._clearable || this.noBackspaceClear || !this.itemStorage.isAnyItemSelected)
|
|
934
|
+
return;
|
|
935
|
+
event.preventDefault();
|
|
936
|
+
if (this.multiselectable && this.itemStorage.selectedItems.length > 1) {
|
|
937
|
+
this._clearLastItem();
|
|
938
|
+
return;
|
|
939
|
+
}
|
|
940
|
+
this._clearAllItems();
|
|
941
|
+
}
|
|
942
|
+
_onCtrlAPress(event) {
|
|
943
|
+
this.itemStorage.highlightAllItems();
|
|
944
|
+
}
|
|
945
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i1.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
946
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: ArdiumSelectComponent, selector: "ard-select", inputs: { valueFrom: "valueFrom", labelFrom: "labelFrom", disabledFrom: "disabledFrom", groupLabelFrom: "groupLabelFrom", groupDisabledFrom: "groupDisabledFrom", childrenFrom: "childrenFrom", placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", dropdownPosition: "dropdownPosition", clearButtonTitle: "clearButtonTitle", noItemsFoundText: "noItemsFoundText", loadingPlaceholderText: "loadingPlaceholderText", searchInputId: "searchInputId", isLoading: "isLoading", inputAttrs: "inputAttrs", htmlId: "htmlId", itemsAlreadyGrouped: "itemsAlreadyGrouped", invertDisabled: "invertDisabled", noGroupActions: "noGroupActions", autoHighlightFirst: "autoHighlightFirst", autoFocus: "autoFocus", keepOpen: "keepOpen", hideSelected: "hideSelected", noBackspaceClear: "noBackspaceClear", sortMultipleValues: "sortMultipleValues", searchCaseSensitive: "searchCaseSensitive", keepSearchAfterSelect: "keepSearchAfterSelect", maxSelectedItems: "maxSelectedItems", itemDisplayLimit: "itemDisplayLimit", searchFn: "searchFn", compareWith: "compareWith", appearance: "appearance", variant: "variant", compact: "compact", dropdowonAppearance: "dropdowonAppearance", dropdowonVariant: "dropdowonVariant", groupItems: "groupItems", items: "items", multiselectable: "multiselectable", clearable: "clearable", searchable: "searchable", addCustom: "addCustom", value: "value", isDropdownOpen: ["isOpen", "isDropdownOpen"] }, outputs: { valueChange: "valueChange", changeEvent: "change", addEvent: "add", failedToAddEvent: "failedToAdd", removeEvent: "remove", clearEvent: "clear", openEvent: "open", closeEvent: "close", scrollEvent: "scroll", scrollToEndEvent: "scrollToEnd", searchEvent: "search", isDropdownOpenChange: "isOpenChange" }, host: { listeners: { "window:resize": "onWindowResize()", "mouseup": "onMouseup()", "keydown": "onKeyPress($event)" }, properties: { "class.ard-group-items": "this.groupItems", "attr.multiple": "this.multiselectable" } }, providers: [
|
|
947
|
+
{
|
|
948
|
+
provide: NG_VALUE_ACCESSOR,
|
|
949
|
+
useExisting: forwardRef(() => ArdiumSelectComponent),
|
|
950
|
+
multi: true,
|
|
951
|
+
},
|
|
952
|
+
], queries: [{ propertyName: "optionTemplate", first: true, predicate: ArdOptionTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "optgroupTemplate", first: true, predicate: ArdOptgroupTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "valueTemplate", first: true, predicate: ArdValueTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "placeholderTemplate", first: true, predicate: ArdSelectPlaceholderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "loadingSpinnerTemplate", first: true, predicate: ArdLoadingSpinnerTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "loadingPlaceholderTemplate", first: true, predicate: ArdLoadingPlaceholderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "dropdownHeaderTemplate", first: true, predicate: ArdDropdownHeaderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "dropdownFooterTemplate", first: true, predicate: ArdDropdownFooterTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "noItemsFoundTemplate", first: true, predicate: ArdNoItemsFoundTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "addCustomTemplate", first: true, predicate: ArdAddCustomTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "itemLimitReachedTemplate", first: true, predicate: ArdItemLimitReachedTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "itemDisplayLimitTemplate", first: true, predicate: ArdItemDisplayLimitTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "prefixTemplate", first: true, predicate: ArdSelectPrefixTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "suffixTemplate", first: true, predicate: ArdSelectSuffixTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "optionComponents", predicate: ArdiumOptionComponent }], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, static: true }, { propertyName: "dropdownPanel", first: true, predicate: i0.forwardRef(() => ArdiumDropdownPanelComponent), descendants: true }, { propertyName: "dropdownHost", first: true, predicate: ["dropdownHost"], descendants: true, read: ElementRef }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true, read: TemplateRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ard-form-field-frame\r\n [appearance]=\"appearance\"\r\n [variant]=\"variant\"\r\n [compact]=\"compact\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate\"\r\n [suffixTemplate]=\"suffixTemplate\"\r\n>\r\n <div class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected\"\r\n [ngClass]=\"ngClasses\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n <ng-container *ngIf=\"shouldDisplayPlaceholder\">\r\n <ng-template #defaultPlaceholderTemplate let-plhldr>\r\n <div class=\"ard-placeholder\">{{ plhldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldDisplayValue\">\r\n <div class=\"ard-select-value\"\r\n *ngFor=\"let item of itemStorage.selectedItems; let i = index\"\r\n [class.ard-value-disabled]=\"item.disabled\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit(i) ? true : null\"\r\n >\r\n <ng-template *ngIf=\"isValueWithinDisplayLimit(i)\"\r\n [ngTemplateOutlet]=\"valueTemplate || (multiselectable ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n ></ng-template>\r\n </div>\r\n\r\n <ng-template #defaultValueTemplate let-item>\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ng-template>\r\n <ng-template #defaultMultiValueTemplate let-item let-unselect=\"unselect\">\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ard-deletable-chip>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemStorage.isAnyItemSelected && shouldShowItemDisplayLimit\">\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n ></ng-template>\r\n\r\n <ng-template #defaultItemDisplayLimitTemplate let-count=\"overflowCount\">\r\n <div>{{count}} more...</div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n \r\n <div class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-owns]=\"isDropdownOpen ? htmlId : null\"\r\n >\r\n <input #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId\"\r\n [attr.tabindex]=\"tabIndex\"\r\n [readonly]=\"isInputElementReadonly\"\r\n [disabled]=\"disabled\"\r\n [value]=\"searchTerm\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isDropdownOpen ? htmlId : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur($event)\"\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ard-_clear-button *ngIf=\"shouldShowClearButton\"\r\n [title]=\"clearButtonTitle\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n ></ard-_clear-button>\r\n\r\n <div class=\"ard-dropdown-arrow-wrapper\"\r\n role=\"button\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate\"\r\n [footerTemplate]=\"dropdownFooterTemplate\"\r\n [appearance]=\"dropdownAppearance\"\r\n [variant]=\"dropdownVariant\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm\"\r\n [panelId]=\"htmlId\"\r\n [compact]=\"compact\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n <ng-container *ngIf=\"!shouldShowNoItemsFound\">\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n *ngFor=\"let group of itemStorage.groups\"\r\n [class.ard-group-disabled]=\"group.disabled\"\r\n [class.ard-group-selected]=\"group.selected\"\r\n [class.ard-group-highlighted]=\"group.highlighted\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n <ng-container *ngIf=\"group.label !== '' && group.label !== undefined\">\r\n <ng-template #defaultOptgroupTemplate>\r\n <span class=\"ard-optgroup-label\" [ardInnerHTML]=\"group.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <div class=\"ard-optgroup-children\">\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n *ngFor=\"let option of group.children\"\r\n [class.ard-option-disabled]=\"option.disabled\"\r\n [class.ard-option-selected]=\"option.selected\"\r\n [class.ard-option-highlighted]=\"option.highlighted\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently\"\r\n [attr.aria-selected]=\"option.selected\"\r\n [attr.id]=\"htmlId + '-' + option.index\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template #defaultOptionTemplate>\r\n <span [ardInnerHTML]=\"option.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowNoItemsFound\">\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{noItemsFoundText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"noItemsFoundTemplate || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowAddCustom\">\r\n <ng-template #defaultAddCustomTemplate let-searchTerm>\r\n <div class=\"ard-option ard-option-highlighted ard-add-custom\" (click)=\"addCustomOption(searchTerm)\">\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{searchTerm}}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"addCustomTemplate || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{loadingPlaceholderText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingPlaceholderTemplate || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n </ard-dropdown-panel>\r\n</ng-template>", styles: ["@import\"@angular/cdk/overlay-prebuilt.css\";.ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-value[hidden]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.ArdiumFormFieldFrameComponent, selector: "ard-form-field-frame", inputs: ["isFocused", "appearance", "variant", "compact", "prefixTemplate", "suffixTemplate"] }, { kind: "component", type: i4.ArdiumDropdownPanelComponent, selector: "ard-dropdown-panel", inputs: ["panelId", "headerTemplate", "footerTemplate", "filterValue", "appearance", "variant", "compact", "isOpen"], outputs: ["scroll", "scrollToEnd"] }, { kind: "component", type: i5.ArdiumDeletableChipComponent, selector: "ard-deletable-chip", inputs: ["deleteButtonTitle", "contentAlignment", "appearance", "variant", "color", "compact", "wrapperClasses"], outputs: ["delete"] }, { kind: "directive", type: i6.ClickOutsideDirective, selector: "[ardClickOutside]", outputs: ["ardClickOutside"] }, { kind: "component", type: i7._ClearButtonComponent, selector: "ard-_clear-button" }, { kind: "directive", type: i6.ArdiumInnerHTMLDirective, selector: "[ardInnerHTML]", inputs: ["ardInnerHTML", "ardEscapeInnerHTML"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
953
|
+
}
|
|
954
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumSelectComponent, decorators: [{
|
|
955
|
+
type: Component,
|
|
956
|
+
args: [{ selector: 'ard-select', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
957
|
+
{
|
|
958
|
+
provide: NG_VALUE_ACCESSOR,
|
|
959
|
+
useExisting: forwardRef(() => ArdiumSelectComponent),
|
|
960
|
+
multi: true,
|
|
961
|
+
},
|
|
962
|
+
], template: "<ard-form-field-frame\r\n [appearance]=\"appearance\"\r\n [variant]=\"variant\"\r\n [compact]=\"compact\"\r\n [isFocused]=\"isFocused\"\r\n [prefixTemplate]=\"prefixTemplate\"\r\n [suffixTemplate]=\"suffixTemplate\"\r\n>\r\n <div class=\"ard-select\"\r\n #dropdownHost\r\n (click)=\"handleAnywhereClick($event)\"\r\n [class.ard-has-value]=\"itemStorage.isAnyItemSelected\"\r\n [ngClass]=\"ngClasses\"\r\n >\r\n <div class=\"ard-select-value-container\">\r\n <ng-container *ngIf=\"shouldDisplayPlaceholder\">\r\n <ng-template #defaultPlaceholderTemplate let-plhldr>\r\n <div class=\"ard-placeholder\">{{ plhldr }}</div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"placeholderTemplate || defaultPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getPlaceholderContext()\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldDisplayValue\">\r\n <div class=\"ard-select-value\"\r\n *ngFor=\"let item of itemStorage.selectedItems; let i = index\"\r\n [class.ard-value-disabled]=\"item.disabled\"\r\n [attr.hidden]=\"!isValueWithinDisplayLimit(i) ? true : null\"\r\n >\r\n <ng-template *ngIf=\"isValueWithinDisplayLimit(i)\"\r\n [ngTemplateOutlet]=\"valueTemplate || (multiselectable ? defaultMultiValueTemplate : defaultValueTemplate)\"\r\n [ngTemplateOutletContext]=\"getValueContext(item)\"\r\n ></ng-template>\r\n </div>\r\n\r\n <ng-template #defaultValueTemplate let-item>\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ng-template>\r\n <ng-template #defaultMultiValueTemplate let-item let-unselect=\"unselect\">\r\n <ard-deletable-chip\r\n (delete)=\"unselect(item)\"\r\n [variant]=\"variant\"\r\n compact\r\n appearance=\"outlined-strong\"\r\n >\r\n <div [ardInnerHTML]=\"item.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></div>\r\n </ard-deletable-chip>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemStorage.isAnyItemSelected && shouldShowItemDisplayLimit\">\r\n <div class=\"ard-overflow-indicator\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"itemDisplayLimitTemplate || defaultItemDisplayLimitTemplate\"\r\n [ngTemplateOutletContext]=\"getItemDisplayLimitContext()\"\r\n ></ng-template>\r\n\r\n <ng-template #defaultItemDisplayLimitTemplate let-count=\"overflowCount\">\r\n <div>{{count}} more...</div>\r\n </ng-template>\r\n </div>\r\n </ng-container>\r\n \r\n <div class=\"ard-search-input\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-owns]=\"isDropdownOpen ? htmlId : null\"\r\n >\r\n <input #searchInput\r\n #focusableElement\r\n type=\"text\"\r\n [attr.id]=\"searchInputId\"\r\n [attr.tabindex]=\"tabIndex\"\r\n [readonly]=\"isInputElementReadonly\"\r\n [disabled]=\"disabled\"\r\n [value]=\"searchTerm\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-controls]=\"isDropdownOpen ? htmlId : null\"\r\n (input)=\"filter(searchInput.value)\"\r\n (change)=\"$event.stopPropagation()\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onSearchInputFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onSearchInputBlur($event)\"\r\n >\r\n </div>\r\n </div>\r\n\r\n <div class=\"ard-select-controls\">\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-simple-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ard-_clear-button *ngIf=\"shouldShowClearButton\"\r\n [title]=\"clearButtonTitle\"\r\n (click)=\"handleClearButtonClick($event)\"\r\n ></ard-_clear-button>\r\n\r\n <div class=\"ard-dropdown-arrow-wrapper\"\r\n role=\"button\"\r\n (click)=\"handleDropdownArrowClick($event)\"\r\n >\r\n <span class=\"ard-dropdown-arrow\"></span>\r\n <div class=\"ard-hitbox\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ard-form-field-frame>\r\n\r\n\r\n<ng-template #dropdownTemplate>\r\n <ard-dropdown-panel\r\n class=\"ard-dropdown-panel ard-select-dropdown-panel\"\r\n role=\"listbox\"\r\n aria-label=\"Options list\"\r\n [headerTemplate]=\"dropdownHeaderTemplate\"\r\n [footerTemplate]=\"dropdownFooterTemplate\"\r\n [appearance]=\"dropdownAppearance\"\r\n [variant]=\"dropdownVariant\"\r\n [isOpen]=\"true\"\r\n [filterValue]=\"searchTerm\"\r\n [panelId]=\"htmlId\"\r\n [compact]=\"compact\"\r\n (ardClickOutside)=\"handleOutsideClick($event)\"\r\n (mousemove)=\"onMouseMove()\"\r\n (scroll)=\"scrollEvent.emit($event)\"\r\n (scrollToEnd)=\"scrollToEndEvent.emit($event)\"\r\n >\r\n <ng-container *ngIf=\"!shouldShowNoItemsFound\">\r\n <div\r\n class=\"ard-optgroup\"\r\n role=\"group\"\r\n *ngFor=\"let group of itemStorage.groups\"\r\n [class.ard-group-disabled]=\"group.disabled\"\r\n [class.ard-group-selected]=\"group.selected\"\r\n [class.ard-group-highlighted]=\"group.highlighted\"\r\n (mouseover)=\"onGroupMouseover(group)\"\r\n (click)=\"onGroupClick(group)\"\r\n >\r\n <ng-container *ngIf=\"group.label !== '' && group.label !== undefined\">\r\n <ng-template #defaultOptgroupTemplate>\r\n <span class=\"ard-optgroup-label\" [ardInnerHTML]=\"group.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optgroupTemplate || defaultOptgroupTemplate\"\r\n [ngTemplateOutletContext]=\"getGroupContext(group)\"\r\n ></ng-template>\r\n </ng-container>\r\n\r\n <div class=\"ard-optgroup-children\">\r\n <div\r\n class=\"ard-option\"\r\n role=\"option\"\r\n *ngFor=\"let option of group.children\"\r\n [class.ard-option-disabled]=\"option.disabled\"\r\n [class.ard-option-selected]=\"option.selected\"\r\n [class.ard-option-highlighted]=\"option.highlighted\"\r\n [class.ard-option-highlighted-recent]=\"option.highlighted_recently\"\r\n [attr.aria-selected]=\"option.selected\"\r\n [attr.id]=\"htmlId + '-' + option.index\"\r\n (click)=\"onItemClick(option, $event)\"\r\n (mouseover)=\"onItemMouseOver($event)\"\r\n (mouseenter)=\"onItemMouseEnter(option, $event)\"\r\n (mouseleave)=\"onItemMouseLeave(option, $event)\"\r\n >\r\n <div class=\"ard-option-label\">\r\n <ng-template #defaultOptionTemplate>\r\n <span [ardInnerHTML]=\"option.label\" [ardEscapeInnerHTML]=\"isItemsInputUsed\"></span>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"optionTemplate || defaultOptionTemplate\"\r\n [ngTemplateOutletContext]=\"getOptionContext(option)\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowNoItemsFound\">\r\n <ng-template #defaultNoItemsFoundTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{noItemsFoundText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"noItemsFoundTemplate || defaultNoItemsFoundTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"shouldShowAddCustom\">\r\n <ng-template #defaultAddCustomTemplate let-searchTerm>\r\n <div class=\"ard-option ard-option-highlighted ard-add-custom\" (click)=\"addCustomOption(searchTerm)\">\r\n <span class=\"ard-add-custom-label\">Add option</span>\r\n <span class=\"ard-add-custom-value\">\"{{searchTerm}}\"</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"addCustomTemplate || defaultAddCustomTemplate\"\r\n [ngTemplateOutletContext]=\"getCustomOptionContext()\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingPlaceholderTemplate>\r\n <div class=\"ard-option ard-option-disabled\">{{loadingPlaceholderText}}</div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingPlaceholderTemplate || defaultLoadingPlaceholderTemplate\"\r\n [ngTemplateOutletContext]=\"getSearchContext()\">\r\n </ng-template>\r\n </ng-container>\r\n </ard-dropdown-panel>\r\n</ng-template>", styles: ["@import\"@angular/cdk/overlay-prebuilt.css\";.ard-select .ard-select-container{display:flex;cursor:pointer}.ard-select .ard-placeholder,.ard-select .ard-value,.ard-select .ard-dropdown-arrow-wrapper,.ard-select .ard-clear-btn-wrapper{-webkit-user-select:none;user-select:none}.ard-select .ard-clear-btn,.ard-select .ard-dropdown-arrow{border:none;background:transparent;padding:0;box-sizing:content-box}.ard-select .ard-option-disabled{pointer-events:none}.ard-select .ard-value[hidden]{display:none}.ard-select .ard-searchable .ard-select-value-container{cursor:text}.ard-select .ard-dropdown-arrow-wrapper{position:relative}.ard-select .ard-dropdown-arrow-wrapper .ard-hitbox{position:absolute;left:-4px;right:-4px;aspect-ratio:1}.ard-select-dropdown-panel .ard-optgroup,.ard-select-dropdown-panel .ard-option{-webkit-user-select:none;user-select:none}\n"] }]
|
|
963
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i1.ScrollStrategyOptions }], propDecorators: { valueFrom: [{
|
|
964
|
+
type: Input
|
|
965
|
+
}], labelFrom: [{
|
|
966
|
+
type: Input
|
|
967
|
+
}], disabledFrom: [{
|
|
968
|
+
type: Input
|
|
969
|
+
}], groupLabelFrom: [{
|
|
970
|
+
type: Input
|
|
971
|
+
}], groupDisabledFrom: [{
|
|
972
|
+
type: Input
|
|
973
|
+
}], childrenFrom: [{
|
|
974
|
+
type: Input
|
|
975
|
+
}], placeholder: [{
|
|
976
|
+
type: Input
|
|
977
|
+
}], searchPlaceholder: [{
|
|
978
|
+
type: Input
|
|
979
|
+
}], dropdownPosition: [{
|
|
980
|
+
type: Input
|
|
981
|
+
}], clearButtonTitle: [{
|
|
982
|
+
type: Input
|
|
983
|
+
}], noItemsFoundText: [{
|
|
984
|
+
type: Input
|
|
985
|
+
}], loadingPlaceholderText: [{
|
|
986
|
+
type: Input
|
|
987
|
+
}], searchInputId: [{
|
|
988
|
+
type: Input
|
|
989
|
+
}], isLoading: [{
|
|
990
|
+
type: Input
|
|
991
|
+
}], inputAttrs: [{
|
|
992
|
+
type: Input
|
|
993
|
+
}], htmlId: [{
|
|
994
|
+
type: Input
|
|
995
|
+
}], itemsAlreadyGrouped: [{
|
|
996
|
+
type: Input
|
|
997
|
+
}], invertDisabled: [{
|
|
998
|
+
type: Input
|
|
999
|
+
}], noGroupActions: [{
|
|
1000
|
+
type: Input
|
|
1001
|
+
}], autoHighlightFirst: [{
|
|
1002
|
+
type: Input
|
|
1003
|
+
}], autoFocus: [{
|
|
1004
|
+
type: Input
|
|
1005
|
+
}], keepOpen: [{
|
|
1006
|
+
type: Input
|
|
1007
|
+
}], hideSelected: [{
|
|
1008
|
+
type: Input
|
|
1009
|
+
}], noBackspaceClear: [{
|
|
1010
|
+
type: Input
|
|
1011
|
+
}], sortMultipleValues: [{
|
|
1012
|
+
type: Input
|
|
1013
|
+
}], searchCaseSensitive: [{
|
|
1014
|
+
type: Input
|
|
1015
|
+
}], keepSearchAfterSelect: [{
|
|
1016
|
+
type: Input
|
|
1017
|
+
}], maxSelectedItems: [{
|
|
1018
|
+
type: Input
|
|
1019
|
+
}], itemDisplayLimit: [{
|
|
1020
|
+
type: Input
|
|
1021
|
+
}], searchFn: [{
|
|
1022
|
+
type: Input
|
|
1023
|
+
}], compareWith: [{
|
|
1024
|
+
type: Input
|
|
1025
|
+
}], appearance: [{
|
|
1026
|
+
type: Input
|
|
1027
|
+
}], variant: [{
|
|
1028
|
+
type: Input
|
|
1029
|
+
}], compact: [{
|
|
1030
|
+
type: Input
|
|
1031
|
+
}], dropdowonAppearance: [{
|
|
1032
|
+
type: Input
|
|
1033
|
+
}], dropdowonVariant: [{
|
|
1034
|
+
type: Input
|
|
1035
|
+
}], groupItems: [{
|
|
1036
|
+
type: Input
|
|
1037
|
+
}, {
|
|
1038
|
+
type: HostBinding,
|
|
1039
|
+
args: ['class.ard-group-items']
|
|
1040
|
+
}], items: [{
|
|
1041
|
+
type: Input
|
|
1042
|
+
}], optionComponents: [{
|
|
1043
|
+
type: ContentChildren,
|
|
1044
|
+
args: [ArdiumOptionComponent]
|
|
1045
|
+
}], multiselectable: [{
|
|
1046
|
+
type: Input
|
|
1047
|
+
}, {
|
|
1048
|
+
type: HostBinding,
|
|
1049
|
+
args: ['attr.multiple']
|
|
1050
|
+
}], clearable: [{
|
|
1051
|
+
type: Input
|
|
1052
|
+
}], searchable: [{
|
|
1053
|
+
type: Input
|
|
1054
|
+
}], addCustom: [{
|
|
1055
|
+
type: Input
|
|
1056
|
+
}], value: [{
|
|
1057
|
+
type: Input
|
|
1058
|
+
}], valueChange: [{
|
|
1059
|
+
type: Output
|
|
1060
|
+
}], changeEvent: [{
|
|
1061
|
+
type: Output,
|
|
1062
|
+
args: ['change']
|
|
1063
|
+
}], addEvent: [{
|
|
1064
|
+
type: Output,
|
|
1065
|
+
args: ['add']
|
|
1066
|
+
}], failedToAddEvent: [{
|
|
1067
|
+
type: Output,
|
|
1068
|
+
args: ['failedToAdd']
|
|
1069
|
+
}], removeEvent: [{
|
|
1070
|
+
type: Output,
|
|
1071
|
+
args: ['remove']
|
|
1072
|
+
}], clearEvent: [{
|
|
1073
|
+
type: Output,
|
|
1074
|
+
args: ['clear']
|
|
1075
|
+
}], openEvent: [{
|
|
1076
|
+
type: Output,
|
|
1077
|
+
args: ['open']
|
|
1078
|
+
}], closeEvent: [{
|
|
1079
|
+
type: Output,
|
|
1080
|
+
args: ['close']
|
|
1081
|
+
}], scrollEvent: [{
|
|
1082
|
+
type: Output,
|
|
1083
|
+
args: ['scroll']
|
|
1084
|
+
}], scrollToEndEvent: [{
|
|
1085
|
+
type: Output,
|
|
1086
|
+
args: ['scrollToEnd']
|
|
1087
|
+
}], searchEvent: [{
|
|
1088
|
+
type: Output,
|
|
1089
|
+
args: ['search']
|
|
1090
|
+
}], isDropdownOpen: [{
|
|
1091
|
+
type: Input,
|
|
1092
|
+
args: ['isOpen']
|
|
1093
|
+
}], isDropdownOpenChange: [{
|
|
1094
|
+
type: Output,
|
|
1095
|
+
args: ['isOpenChange']
|
|
1096
|
+
}], searchInput: [{
|
|
1097
|
+
type: ViewChild,
|
|
1098
|
+
args: ['searchInput', { static: true }]
|
|
1099
|
+
}], dropdownPanel: [{
|
|
1100
|
+
type: ViewChild,
|
|
1101
|
+
args: [forwardRef(() => ArdiumDropdownPanelComponent)]
|
|
1102
|
+
}], optionTemplate: [{
|
|
1103
|
+
type: ContentChild,
|
|
1104
|
+
args: [ArdOptionTemplateDirective, { read: TemplateRef }]
|
|
1105
|
+
}], optgroupTemplate: [{
|
|
1106
|
+
type: ContentChild,
|
|
1107
|
+
args: [ArdOptgroupTemplateDirective, { read: TemplateRef }]
|
|
1108
|
+
}], valueTemplate: [{
|
|
1109
|
+
type: ContentChild,
|
|
1110
|
+
args: [ArdValueTemplateDirective, { read: TemplateRef }]
|
|
1111
|
+
}], placeholderTemplate: [{
|
|
1112
|
+
type: ContentChild,
|
|
1113
|
+
args: [ArdSelectPlaceholderTemplateDirective, { read: TemplateRef }]
|
|
1114
|
+
}], loadingSpinnerTemplate: [{
|
|
1115
|
+
type: ContentChild,
|
|
1116
|
+
args: [ArdLoadingSpinnerTemplateDirective, { read: TemplateRef }]
|
|
1117
|
+
}], loadingPlaceholderTemplate: [{
|
|
1118
|
+
type: ContentChild,
|
|
1119
|
+
args: [ArdLoadingPlaceholderTemplateDirective, { read: TemplateRef }]
|
|
1120
|
+
}], dropdownHeaderTemplate: [{
|
|
1121
|
+
type: ContentChild,
|
|
1122
|
+
args: [ArdDropdownHeaderTemplateDirective, { read: TemplateRef }]
|
|
1123
|
+
}], dropdownFooterTemplate: [{
|
|
1124
|
+
type: ContentChild,
|
|
1125
|
+
args: [ArdDropdownFooterTemplateDirective, { read: TemplateRef }]
|
|
1126
|
+
}], noItemsFoundTemplate: [{
|
|
1127
|
+
type: ContentChild,
|
|
1128
|
+
args: [ArdNoItemsFoundTemplateDirective, { read: TemplateRef }]
|
|
1129
|
+
}], addCustomTemplate: [{
|
|
1130
|
+
type: ContentChild,
|
|
1131
|
+
args: [ArdAddCustomTemplateDirective, { read: TemplateRef }]
|
|
1132
|
+
}], itemLimitReachedTemplate: [{
|
|
1133
|
+
type: ContentChild,
|
|
1134
|
+
args: [ArdItemLimitReachedTemplateDirective, { read: TemplateRef }]
|
|
1135
|
+
}], itemDisplayLimitTemplate: [{
|
|
1136
|
+
type: ContentChild,
|
|
1137
|
+
args: [ArdItemDisplayLimitTemplateDirective, { read: TemplateRef }]
|
|
1138
|
+
}], prefixTemplate: [{
|
|
1139
|
+
type: ContentChild,
|
|
1140
|
+
args: [ArdSelectPrefixTemplateDirective, { read: TemplateRef }]
|
|
1141
|
+
}], suffixTemplate: [{
|
|
1142
|
+
type: ContentChild,
|
|
1143
|
+
args: [ArdSelectSuffixTemplateDirective, { read: TemplateRef }]
|
|
1144
|
+
}], dropdownHost: [{
|
|
1145
|
+
type: ViewChild,
|
|
1146
|
+
args: ['dropdownHost', { read: ElementRef }]
|
|
1147
|
+
}], dropdownTemplate: [{
|
|
1148
|
+
type: ViewChild,
|
|
1149
|
+
args: ['dropdownTemplate', { read: TemplateRef }]
|
|
1150
|
+
}], onWindowResize: [{
|
|
1151
|
+
type: HostListener,
|
|
1152
|
+
args: ['window:resize']
|
|
1153
|
+
}], onMouseup: [{
|
|
1154
|
+
type: HostListener,
|
|
1155
|
+
args: ['mouseup']
|
|
1156
|
+
}], onKeyPress: [{
|
|
1157
|
+
type: HostListener,
|
|
1158
|
+
args: ['keydown', ['$event']]
|
|
1159
|
+
}] } });
|
|
1160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFXLGFBQWEsRUFBcUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUdILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFHTixXQUFXLEVBQ1gsU0FBUyxFQUVULGlCQUFpQixFQUNqQixVQUFVLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMxRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsb0JBQW9C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YztzQkFEYixZQUFZO3VCQUFDLGVBQWU7Z0JBdVE3QixTQUFTO3NCQURSLFlBQVk7dUJBQUMsU0FBUztnQkFvRXZCLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmLCBTY3JvbGxTdHJhdGVneU9wdGlvbnMgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBmb3J3YXJkUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGNvZXJjZUFycmF5UHJvcGVydHksIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYXJkaXVtLXVpL2RldmtpdCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBtZXJnZSwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzQW55U3RyaW5nLCBpc0FycmF5LCBpc0Z1bmN0aW9uIH0gZnJvbSAnc2ltcGxlLWJvb2wnO1xuaW1wb3J0IHsgSXRlbVN0b3JhZ2UgfSBmcm9tICcuLi9faW50ZXJuYWwvaXRlbS1zdG9yYWdlcy9kcm9wZG93bi1pdGVtLXN0b3JhZ2UnO1xuaW1wb3J0IHsgX05nTW9kZWxDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vX2ludGVybmFsL25nbW9kZWwtY29tcG9uZW50JztcbmltcG9ydCB7IEFyZGl1bURyb3Bkb3duUGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi9kcm9wZG93bi1wYW5lbC9kcm9wZG93bi1wYW5lbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJvcGRvd25QYW5lbEFwcGVhcmFuY2UsIERyb3Bkb3duUGFuZWxWYXJpYW50IH0gZnJvbSAnLi4vZHJvcGRvd24tcGFuZWwvZHJvcGRvd24tcGFuZWwudHlwZXMnO1xuaW1wb3J0IHsgQXJkaXVtT3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vb3B0aW9uL29wdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgc2VhcmNoRnVuY3Rpb25zIH0gZnJvbSAnLi4vc2VhcmNoLWZ1bmN0aW9ucyc7XG5pbXBvcnQgeyBBcmRPcHRpb24sIEFyZE9wdGlvbkdyb3VwLCBBcmRQYW5lbFBvc2l0aW9uLCBDb21wYXJlV2l0aEZuLCBHcm91cEJ5Rm4sIE9wdGlvbkNvbnRleHQsIFNlYXJjaEZuIH0gZnJvbSAnLi4vdHlwZXMvaXRlbS1zdG9yYWdlLnR5cGVzJztcbmltcG9ydCB7IEZvcm1FbGVtZW50QXBwZWFyYW5jZSB9IGZyb20gJy4uL3R5cGVzL3RoZW1pbmcudHlwZXMnO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnRWYXJpYW50IH0gZnJvbSAnLi8uLi90eXBlcy90aGVtaW5nLnR5cGVzJztcbmltcG9ydCB7XG4gICAgQXJkQWRkQ3VzdG9tVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkRHJvcGRvd25Gb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBBcmREcm9wZG93bkhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIEFyZEl0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBBcmRJdGVtTGltaXRSZWFjaGVkVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkTG9hZGluZ1BsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkTG9hZGluZ1NwaW5uZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBBcmROb0l0ZW1zRm91bmRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBBcmRPcHRncm91cFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIEFyZE9wdGlvblRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIEFyZFNlbGVjdFBsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkU2VsZWN0UHJlZml4VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkU2VsZWN0U3VmZml4VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkVmFsdWVUZW1wbGF0ZURpcmVjdGl2ZSxcbn0gZnJvbSAnLi9zZWxlY3QuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gICAgQWRkQ3VzdG9tRm4sXG4gICAgQ3VzdG9tT3B0aW9uQ29udGV4dCxcbiAgICBHcm91cENvbnRleHQsXG4gICAgSXRlbURpc3BsYXlMaW1pdENvbnRleHQsXG4gICAgSXRlbUxpbWl0Q29udGV4dCxcbiAgICBQbGFjZWhvbGRlckNvbnRleHQsXG4gICAgU2VhcmNoQ29udGV4dCxcbiAgICBTdGF0c0NvbnRleHQsXG4gICAgVmFsdWVDb250ZXh0LFxufSBmcm9tICcuL3NlbGVjdC50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXJkLXNlbGVjdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBcmRpdW1TZWxlY3RDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQXJkaXVtU2VsZWN0Q29tcG9uZW50XG4gICAgZXh0ZW5kcyBfTmdNb2RlbENvbXBvbmVudEJhc2VcbiAgICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG57XG4gICAgLy8hIHB1YmxpYyBjb25zdGFudHNcbiAgICByZWFkb25seSBpdGVtU3RvcmFnZSA9IG5ldyBJdGVtU3RvcmFnZSh0aGlzKTtcbiAgICByZWFkb25seSBlbGVtZW50ITogSFRNTEVsZW1lbnQ7XG4gICAgcmVhZG9ubHkgREVGQVVMVFMgPSB7XG4gICAgICAgIHZhbHVlRnJvbTogJ3ZhbHVlJyxcbiAgICAgICAgbGFiZWxGcm9tOiAnbGFiZWwnLFxuICAgICAgICBkaXNhYmxlZEZyb206ICdkaXNhYmxlZCcsXG4gICAgICAgIGdyb3VwTGFiZWxGcm9tOiAnZ3JvdXAnLFxuICAgICAgICBncm91cERpc2FibGVkRnJvbTogJ2Rpc2FibGVkJyxcbiAgICAgICAgY2hpbGRyZW5Gcm9tOiAnY2hpbGRyZW4nLFxuICAgICAgICBzZWFyY2hGbjogc2VhcmNoRnVuY3Rpb25zLmJ5TGFiZWwsXG4gICAgICAgIGNsZWFyQnV0dG9uVGl0bGU6ICdDbGVhcicsXG4gICAgICAgIG5vSXRlbXNGb3VuZFRleHQ6ICdObyBpdGVtcyBmb3VuZC4nLFxuICAgICAgICBsb2FkaW5nUGxhY2Vob2xkZXJUZXh0OiAnTG9hZGluZy4uLicsXG4gICAgfTtcblxuICAgIC8vISBwcml2YXRlc1xuICAgIHByaXZhdGUgX2l0ZW1zOiBhbnlbXSB8IG51bGwgPSBbXTtcbiAgICBwcml2YXRlIF9pc01vdXNlQmVpbmdVc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc2VhcmNoQmFyRm9jdXNlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8vISBwdWJsaWNzXG4gICAgcHVibGljIHNlYXJjaFRlcm06IHN0cmluZyA9ICcnO1xuICAgIGlzSXRlbXNJbnB1dFVzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vISBiaW5kaW5nLXJlbGF0ZWQgaW5wdXRzXG4gICAgLy92YWx1ZS9sYWJlbC9kaXNhYmxlZC9ncm91cC9wcmUtZ3JvdXBlZCBjaGlsZHJlbiBwYXRoc1xuICAgIEBJbnB1dCgpIHZhbHVlRnJvbT86IHN0cmluZztcbiAgICBASW5wdXQoKSBsYWJlbEZyb20/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGlzYWJsZWRGcm9tPzogc3RyaW5nO1xuICAgIC8vISBncm91cC1yZWxhdGVkIGlucHV0c1xuICAgIEBJbnB1dCgpIGdyb3VwTGFiZWxGcm9tPzogc3RyaW5nIHwgR3JvdXBCeUZuO1xuICAgIEBJbnB1dCgpIGdyb3VwRGlzYWJsZWRGcm9tPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGNoaWxkcmVuRnJvbT86IHN0cmluZztcbiAgICAvLyEgc2V0dGluZ3NcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlbGVjdCBpdGVtJztcbiAgICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaC4uLic7XG4gICAgQElucHV0KCkgZHJvcGRvd25Qb3NpdGlvbjogQXJkUGFuZWxQb3NpdGlvbiA9IEFyZFBhbmVsUG9zaXRpb24uQXV0bztcbiAgICBASW5wdXQoKSBjbGVhckJ1dHRvblRpdGxlOiBzdHJpbmcgPSB0aGlzLkRFRkFVTFRTLmNsZWFyQnV0dG9uVGl0bGU7XG4gICAgLy8hIHRlbXBsYXRlLXJlbGF0ZWQgc2V0dGluZ3NcbiAgICBASW5wdXQoKSBub0l0ZW1zRm91bmRUZXh0OiBzdHJpbmcgPSB0aGlzLkRFRkFVTFRTLm5vSXRlbXNGb3VuZFRleHQ7XG4gICAgQElucHV0KCkgbG9hZGluZ1BsYWNlaG9sZGVyVGV4dDogc3RyaW5nID0gdGhpcy5ERUZBVUxUUy5sb2FkaW5nUGxhY2Vob2xkZXJUZXh0O1xuICAgIC8vISBzZWFyY2gtcmVsYXRlZCBvcHRpb25zXG4gICAgQElucHV0KCkgc2VhcmNoSW5wdXRJZD86IHN0cmluZztcbiAgICAvLyEgb3RoZXIgaW5wdXRzXG4gICAgQElucHV0KCkgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgaW5wdXRBdHRyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIEBJbnB1dCgpIGh0bWxJZDogc3RyaW5nID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcblxuICAgIC8vISBib29sZWFuIHNldHRpbmdzXG4gICAgcHJpdmF0ZSBfaXRlbXNBbHJlYWR5R3JvdXBlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGl0ZW1zQWxyZWFkeUdyb3VwZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc0FscmVhZHlHcm91cGVkO1xuICAgIH1cbiAgICBzZXQgaXRlbXNBbHJlYWR5R3JvdXBlZCh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5faXRlbXNBbHJlYWR5R3JvdXBlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgICB9XG5cbiAgICAvL3Nob3VsZCB0aGUgdmFsdWUgdGhhdCB0aGUgXCJkaXNhYmxlZEZyb21cIiBwYXRoIGxlYWQgdG8gYmUgaW52ZXJ0ZWQ/XG4gICAgLy91c2VmdWwgd2hlbiB0aGUgcHJvcGVydHkgaXMgZS5nLiBcImFjdGl2ZVwiLCB3aGljaCBpcyB0aGUgb3Bvc2l0ZSBvZiBcImRpc2FibGVkXCJcbiAgICBwcml2YXRlIF9pbnZlcnREaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGludmVydERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52ZXJ0RGlzYWJsZWQ7XG4gICAgfVxuICAgIHNldCBpbnZlcnREaXNhYmxlZCh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5faW52ZXJ0RGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbm9Hcm91cEFjdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIGdldCBub0dyb3VwQWN0aW9ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vR3JvdXBBY3Rpb25zO1xuICAgIH1cbiAgICBzZXQgbm9Hcm91cEFjdGlvbnModjogYW55KSB7XG4gICAgICAgIHRoaXMuX25vR3JvdXBBY3Rpb25zID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2F1dG9IaWdobGlnaHRGaXJzdDogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KClcbiAgICBnZXQgYXV0b0hpZ2hsaWdodEZpcnN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b0hpZ2hsaWdodEZpcnN0O1xuICAgIH1cbiAgICBzZXQgYXV0b0hpZ2hsaWdodEZpcnN0KHY6IGFueSkge1xuICAgICAgICB0aGlzLl9hdXRvSGlnaGxpZ2h0Rmlyc3QgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXV0b0ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KClcbiAgICBnZXQgYXV0b0ZvY3VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b0ZvY3VzO1xuICAgIH1cbiAgICBzZXQgYXV0b0ZvY3VzKHY6IGFueSkge1xuICAgICAgICB0aGlzLl9hdXRvRm9jdXMgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfa2VlcE9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIGdldCBrZWVwT3BlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2tlZXBPcGVuO1xuICAgIH1cbiAgICBzZXQga2VlcE9wZW4odjogYW55KSB7XG4gICAgICAgIHRoaXMuX2tlZXBPcGVuID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hpZGVTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGhpZGVTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVTZWxlY3RlZDtcbiAgICB9XG4gICAgc2V0IGhpZGVTZWxlY3RlZCh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5faGlkZVNlbGVjdGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NsZWFyT25CYWNrc3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIGdldCBub0JhY2tzcGFjZUNsZWFyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xlYXJPbkJhY2tzcGFjZTtcbiAgICB9XG4gICAgc2V0IG5vQmFja3NwYWNlQ2xlYXIodjogYW55KSB7XG4gICAgICAgIHRoaXMuX2NsZWFyT25CYWNrc3BhY2UgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc29ydE11bHRpcGxlVmFsdWVzOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KClcbiAgICBnZXQgc29ydE11bHRpcGxlVmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydE11bHRpcGxlVmFsdWVzO1xuICAgIH1cbiAgICBzZXQgc29ydE11bHRpcGxlVmFsdWVzKHY6IGFueSkge1xuICAgICAgICB0aGlzLl9zb3J0TXVsdGlwbGVWYWx1ZXMgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2VhcmNoQ2FzZVNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlYXJjaENhc2VTZW5zaXRpdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hDYXNlU2Vuc2l0aXZlO1xuICAgIH1cbiAgICBzZXQgc2VhcmNoQ2FzZVNlbnNpdGl2ZSh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoQ2FzZVNlbnNpdGl2ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9rZWVwU2VhcmNoQWZ0ZXJTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIGdldCBrZWVwU2VhcmNoQWZ0ZXJTZWxlY3QoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9rZWVwU2VhcmNoQWZ0ZXJTZWxlY3Q7XG4gICAgfVxuICAgIHNldCBrZWVwU2VhcmNoQWZ0ZXJTZWxlY3QodjogYW55KSB7XG4gICAgICAgIHRoaXMuX2tlZXBTZWFyY2hBZnRlclNlbGVjdCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgICB9XG5cbiAgICAvLyEgbnVtYmVyIGlucHV0c1xuICAgIHByaXZhdGUgX21heFNlbGVjdGVkSXRlbXM6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBASW5wdXQoKVxuICAgIGdldCBtYXhTZWxlY3RlZEl0ZW1zKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhTZWxlY3RlZEl0ZW1zO1xuICAgIH1cbiAgICBzZXQgbWF4U2VsZWN0ZWRJdGVtcyh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fbWF4U2VsZWN0ZWRJdGVtcyA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXRlbURpc3BsYXlMaW1pdDogbnVtYmVyID0gSW5maW5pdHk7XG4gICAgQElucHV0KClcbiAgICBnZXQgaXRlbURpc3BsYXlMaW1pdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbURpc3BsYXlMaW1pdDtcbiAgICB9XG4gICAgc2V0IGl0ZW1EaXNwbGF5TGltaXQodjogYW55KSB7XG4gICAgICAgIHRoaXMuX2l0ZW1EaXNwbGF5TGltaXQgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCBJbmZpbml0eSk7XG4gICAgfVxuXG4gICAgLy8hIGZ1bmN0aW9uIGlucHV0c1xuICAgIHByaXZhdGUgX3NlYXJjaEZuOiBTZWFyY2hGbiA9IHRoaXMuREVGQVVMVFMuc2VhcmNoRm47XG4gICAgQElucHV0KClcbiAgICBnZXQgc2VhcmNoRm4oKTogU2VhcmNoRm4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoRm47XG4gICAgfVxuICAgIHNldCBzZWFyY2hGbihmbjogU2VhcmNoRm4pIHtcbiAgICAgICAgaWYgKGZuICE9PSB1bmRlZmluZWQgJiYgZm4gIT09IG51bGwgJiYgIWlzRnVuY3Rpb24oZm4pKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignYHNlYXJjaEZuYCBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VhcmNoRm4gPSBmbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBfY29tcGFyZVdpdGg/OiBDb21wYXJlV2l0aEZuO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGNvbXBhcmVXaXRoKCk6IENvbXBhcmVXaXRoRm4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29tcGFyZVdpdGg7XG4gICAgfVxuICAgIHNldCBjb21wYXJlV2l0aChmbjogQ29tcGFyZVdpdGhGbiB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZm4gIT09IHVuZGVmaW5lZCAmJiBmbiAhPT0gbnVsbCAmJiAhaXNGdW5jdGlvbihmbikpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdgY29tcGFyZVdpdGhgIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb21wYXJlV2l0aCA9IGZuO1xuICAgIH1cblxuICAgIC8vISBhcHBlYXJhbmNlXG4gICAgQElucHV0KCkgYXBwZWFyYW5jZTogRm9ybUVsZW1lbnRBcHBlYXJhbmNlID0gRm9ybUVsZW1lbnRBcHBlYXJhbmNlLk91dGxpbmVkO1xuICAgIEBJbnB1dCgpIHZhcmlhbnQ6IEZvcm1FbGVtZW50VmFyaWFudCA9IEZvcm1FbGVtZW50VmFyaWFudC5Sb3VuZGVkO1xuXG4gICAgcHJpdmF0ZSBfY29tcGFjdDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGNvbXBhY3QoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wYWN0O1xuICAgIH1cbiAgICBzZXQgY29tcGFjdCh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fY29tcGFjdCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgICB9XG5cbiAgICBnZXQgbmdDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAvL2FwcGVhcmFuY2UsIHZhcmlhbnQgaGFuZGxlZCBpbiBhcmQtZm9ybS1maWVsZC1mcmFtZSBjb21wb25lbnRcbiAgICAgICAgICAgIHRoaXMuY29tcGFjdCA/ICdhcmQtY29tcGFjdCcgOiAnJyxcbiAgICAgICAgICAgIHRoaXMubXVsdGlzZWxlY3RhYmxlID8gJ2FyZC1tdWx0aXNlbGVjdCcgOiAnYXJkLXNpbmdsZXNlbGVjdCcsXG4gICAgICAgICAgICB0aGlzLmNsZWFyYWJsZSA/ICdhcmQtY2xlYXJhYmxlJyA6ICcnLFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hhYmxlID8gJ2FyZC1zZWFyY2hhYmxlJyA6ICcnLFxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZCA/ICdhcmQtZmlsdGVyZWQnIDogJycsXG4gICAgICAgICAgICB0aGlzLnRvdWNoZWQgPyAnYXJkLXRvdWNoZWQnIDogJycsXG4gICAgICAgICAgICB0aGlzLmlzRHJvcGRvd25PcGVuID8gJ2FyZC1kcm9wZG93bi1vcGVuJyA6ICcnLFxuICAgICAgICAgICAgdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCA/ICdhcmQtc2VsZWN0LWZvY3VzZWQnIDogJycsXG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hCYXJGb2N1c2VkID8gJ2FyZC1zZWxlY3QtZm9jdXNlZCcgOiAnJyxcbiAgICAgICAgXS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZHJvcGRvd25BcHBlYXJhbmNlPzogRHJvcGRvd25QYW5lbEFwcGVhcmFuY2UgPSB1bmRlZmluZWQ7XG4gICAgQElucHV0KClcbiAgICBzZXQgZHJvcGRvd29uQXBwZWFyYW5jZSh2OiBEcm9wZG93blBhbmVsQXBwZWFyYW5jZSkge1xuICAgICAgICB0aGlzLl9kcm9wZG93bkFwcGVhcmFuY2UgPSB2O1xuICAgIH1cbiAgICBnZXQgZHJvcGRvd25BcHBlYXJhbmNlKCk6IERyb3Bkb3duUGFuZWxBcHBlYXJhbmNlIHtcbiAgICAgICAgaWYgKHRoaXMuX2Ryb3Bkb3duQXBwZWFyYW5jZSkgcmV0dXJuIHRoaXMuX2Ryb3Bkb3duQXBwZWFyYW5jZTtcbiAgICAgICAgaWYgKHRoaXMuYXBwZWFyYW5jZSA9PSBGb3JtRWxlbWVudEFwcGVhcmFuY2UuT3V0bGluZWQpIHJldHVybiBEcm9wZG93blBhbmVsQXBwZWFyYW5jZS5PdXRsaW5lZDtcbiAgICAgICAgcmV0dXJuIERyb3Bkb3duUGFuZWxBcHBlYXJhbmNlLlJhaXNlZDtcbiAgICB9XG4gICAgcHJpdmF0ZSBfZHJvcGRvd25WYXJpYW50PzogRHJvcGRvd25QYW5lbFZhcmlhbnQgPSB1bmRlZmluZWQ7XG4gICAgQElucHV0KClcbiAgICBzZXQgZHJvcGRvd29uVmFyaWFudCh2OiBEcm9wZG93blBhbmVsVmFyaWFudCkge1xuICAgICAgICB0aGlzLl9kcm9wZG93blZhcmlhbnQgPSB2O1xuICAgIH1cbiAgICBnZXQgZHJvcGRvd25WYXJpYW50KCk6IERyb3Bkb3duUGFuZWxWYXJpYW50IHtcbiAgICAgICAgaWYgKHRoaXMuX2Ryb3Bkb3duVmFyaWFudCkgcmV0dXJuIHRoaXMuX2Ryb3Bkb3duVmFyaWFudDtcbiAgICAgICAgaWYgKHRoaXMudmFyaWFudCA9PSBGb3JtRWxlbWVudFZhcmlhbnQuUGlsbCkgcmV0dXJuIERyb3Bkb3duUGFuZWxWYXJpYW50LlJvdW5kZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLnZhcmlhbnQ7XG4gICAgfVxuXG4gICAgLy8hIGNsYXNzLWJhc2VkIGlucHV0c1xuICAgIEBJbnB1dCgpIEBIb3N0QmluZGluZygnY2xhc3MuYXJkLWdyb3VwLWl0ZW1zJykgZ3JvdXBJdGVtczogYm9vbGVhbiA9IGZhbHNlOyAvL2RlZmF1bHQgdmFsdWUgbWF5IGJlIGNoYW5nZWQgdG8gXCJ0cnVlXCIgaW4gbmdPbkNoYW5nZXMgaWYgdGhpcy5ncm91cEJ5IGlzIGRlZmluZWQgb3IgdGhpcy5pdGVtc0FscmVhZHlHcm91cGVkIGlzIHNldCB0byBcInRydWVcIlxuXG4gICAgLy8hIGl0ZW1zIHNldHRlci9nZXR0ZXJcbiAgICBASW5wdXQoKVxuICAgIGdldCBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICAgIH1cbiAgICBzZXQgaXRlbXModmFsdWU6IHN0cmluZyB8IGFueVtdIHwgbnVsbCkge1xuICAgICAgICB0aGlzLmlzSXRlbXNJbnB1dFVzZWQgPSB0cnVlO1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgICAgICB0aGlzLmlzSXRlbXNJbnB1dFVzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FueVN0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29lcmNlQXJyYXlQcm9wZXJ0eSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByaW50RXJyb3JzID0gdGhpcy5pdGVtU3RvcmFnZS5zZXRJdGVtcyh2YWx1ZSk7XG4gICAgICAgIGlmIChwcmludEVycm9ycykge1xuICAgICAgICAgICAgdGhpcy5fcHJpbnRQcmltaXRpdmVXYXJuaW5ncygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQENvbnRlbnRDaGlsZHJlbihBcmRpdW1PcHRpb25Db21wb25lbnQpXG4gICAgb3B0aW9uQ29tcG9uZW50cyE6IFF1ZXJ5TGlzdDxBcmRpdW1PcHRpb25Db21wb25lbnQ+O1xuXG4gICAgcHJpdmF0ZSBfc2V0SXRlbXNGcm9tQ29tcG9uZW50cygpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlT3B0aW9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlZE9yRGVzdHJveWVkID0gbWVyZ2UodGhpcy5vcHRpb25Db21wb25lbnRzLmNoYW5nZXMsIHRoaXMuX2Rlc3Ryb3kkKTtcbiAgICAgICAgICAgIG1lcmdlKC4uLnRoaXMub3B0aW9uQ29tcG9uZW50cy5tYXAob3B0aW9uID0+IG9wdGlvbi5zdGF0ZUNoYW5nZSQpKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbChjaGFuZ2VkT3JEZXN0cm95ZWQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUob3B0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtU3RvcmFnZS5maW5kSXRlbUJ5VmFsdWUob3B0aW9uLm9sZFZhbHVlID8/IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZGlzYWJsZWQgPSBvcHRpb24uZGlzYWJsZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5sYWJlbCA9IG9wdGlvbi5sYWJlbCB8fCBpdGVtLmxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5pdGVtRGF0YS5kaXNhYmxlZCA9IG9wdGlvbi5kaXNhYmxlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLml0ZW1EYXRhLmxhYmVsID0gb3B0aW9uLmxhYmVsIHx8IGl0ZW0ubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5pdGVtRGF0YS52YWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vcHRpb25Db21wb25lbnRzLmNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHN0YXJ0V2l0aCh0aGlzLm9wdGlvbkNvbXBvbmVudHMpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgob3B0aW9uczogUXVlcnlMaXN0PEFyZGl1bU9wdGlvbkNvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zID0gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHRpb24uZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3B0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8hIGF0dHJpYnV0ZSBhbmQvb3IgY2xhc3Mgc2V0dGVycy9nZXR0ZXJzXG4gICAgcHJpdmF0ZSBfbXVsdGlzZWxlY3RhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIubXVsdGlwbGUnKVxuICAgIGdldCBtdWx0aXNlbGVjdGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tdWx0aXNlbGVjdGFibGU7XG4gICAgfVxuICAgIHNldCBtdWx0aXNlbGVjdGFibGUodjogYW55KSB7XG4gICAgICAgIHRoaXMuX211bHRpc2VsZWN0YWJsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgICB9XG4gICAgZ2V0IHNpbmdsZXNlbGVjdGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fbXVsdGlzZWxlY3RhYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NsZWFyYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KClcbiAgICBnZXQgY2xlYXJhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xlYXJhYmxlO1xuICAgIH1cbiAgICBzZXQgY2xlYXJhYmxlKHY6IGFueSkge1xuICAgICAgICB0aGlzLl9jbGVhcmFibGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2VhcmNoYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlYXJjaGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hhYmxlO1xuICAgIH1cbiAgICBzZXQgc2VhcmNoYWJsZSh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoYWJsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgICB9XG5cbiAgICBnZXQgZmlsdGVyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hhYmxlICYmIHRoaXMuc2VhcmNoVGVybSAhPSAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIF90b3VjaGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgZ2V0IHRvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3VjaGVkO1xuICAgIH1cbiAgICBwcml2YXRlIHNldCB0b3VjaGVkKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3RvdWNoZWQgPSBzdGF0ZTtcbiAgICB9XG5cbiAgICAvLyEgY3VzdG9tIG9wdGlvbnNcbiAgICBwcml2YXRlIF9kZWZhdWx0QWRkQ3VzdG9tRm46IEFkZEN1c3RvbUZuPGFueT4gPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWU7XG4gICAgcHJpdmF0ZSBfYWRkQ3VzdG9tOiBmYWxzZSB8IEFkZEN1c3RvbUZuPGFueT4gfCBBZGRDdXN0b21GbjxQcm9taXNlPGFueT4+ID0gZmFsc2U7XG4gICAgQElucHV0KClcbiAgICBnZXQgYWRkQ3VzdG9tKCk6IGZhbHNlIHwgQWRkQ3VzdG9tRm48YW55PiB8IEFkZEN1c3RvbUZuPFByb21pc2U8YW55Pj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ3VzdG9tO1xuICAgIH1cbiAgICBzZXQgYWRkQ3VzdG9tKHY6IHN0cmluZyB8IGJvb2xlYW4gfCBBZGRDdXN0b21Gbjxhbnk+IHwgQWRkQ3VzdG9tRm48UHJvbWlzZTxhbnk+Pikge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2KSkge1xuICAgICAgICAgICAgdGhpcy5fYWRkQ3VzdG9tID0gdjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvL2NvZXJjZSB0aGUgdmFsdWUgaW50byBhIGJvb2xlYW5cbiAgICAgICAgLy9pZiBcInRydWVcIiwgdXNlIHRoZSBkZWZhdWx0IGZ1bmN0aW9uLiBPdGhlcndpc2UsIGp1c3Qgc2V0IHRvIFwiZmFsc2VcIi5cbiAgICAgICAgdGhpcy5fYWRkQ3VzdG9tID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpICYmIHRoaXMuX2RlZmF1bHRBZGRDdXN0b21GbjtcbiAgICB9XG5cbiAgICBnZXQgc2hvdWxkU2hvd0FkZEN1c3RvbSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkQ3VzdG9tICE9IGZhbHNlICYmIHRoaXMuc2VhcmNoVGVybS5sZW5ndGggPiAwICYmIHRoaXMuaXRlbVN0b3JhZ2UuaXNOb0l0ZW1zRm91bmQ7XG4gICAgfVxuXG4gICAgYXN5bmMgYWRkQ3VzdG9tT3B0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFkZEN1c3RvbSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5ld09wdGlvbk9iaiA9IGF3YWl0IHRoaXMuaXRlbVN0b3JhZ2UuYWRkQ3VzdG9tT3B0aW9uKHZhbHVlLCB0aGlzLmFkZEN1c3RvbSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG5ld09wdGlvbk9iaik7XG4gICAgfVxuXG4gICAgLy8hIGNvbnRyb2wgdmFsdWUgYWNjZXNzb3JcbiAgICAvL292ZXJyaWRlIHRoZSB3cml0ZVZhbHVlIGFuZCBzZXREaXNhYmxlZFN0YXRlIGRlZmluZWQgaW4gX05nTW9kZWxDb21wb25lbnRcbiAgICBvdmVycmlkZSBzZXREaXNhYmxlZFN0YXRlKHN0YXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gc3RhdGU7XG4gICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICB3cml0ZVZhbHVlKG5nTW9kZWw6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXRlbVN0b3JhZ2UuaGFuZGxlV3JpdGVWYWx1ZShuZ01vZGVsKTtcbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIC8vKiBjaGFuZ2UgJiB0b3VjaCBldmVudCBlbWl0dGVyc1xuICAgIHByb3RlY3RlZCBfZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5pdGVtU3RvcmFnZS52YWx1ZTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VSZWdpc3RlcmVkPy4odmFsdWUpO1xuICAgICAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodmFsdWUpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIH1cbiAgICBwcml2YXRlIF9vblRvdWNoZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZFJlZ2lzdGVyZWQ/LigpO1xuICAgIH1cblxuICAgIC8vISB2YWx1ZSBpbnB1dCAmIG91dHB1dFxuICAgIEBJbnB1dCgpXG4gICAgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgICAgLy9pZiBpcyBhIHN0cmluZywgY29lcmNlIGl0IGludG8gYXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgICBpZiAoaXNBbnlTdHJpbmcobmV3VmFsdWUpKSBuZXdWYWx1ZSA9IGNvZXJjZUFycmF5UHJvcGVydHkobmV3VmFsdWUpO1xuICAgICAgICAvL2lmIGl0IGlzIG5vdCBhIHN0cmluZyBhbmQgbm90IGFuIGFycmF5LCBqdXN0IHB1dCBpdCBpbiBhbiBhcnJheVxuICAgICAgICBlbHNlIGlmICghaXNBcnJheShuZXdWYWx1ZSkpIG5ld1ZhbHVlID0gW25ld1ZhbHVlXTtcblxuICAgICAgICB0aGlzLndyaXRlVmFsdWUobmV3VmFsdWUpO1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtU3RvcmFnZS52YWx1ZTtcbiAgICB9XG4gICAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAgIC8vISBvdXRwdXQgZXZlbnRzXG4gICAgQE91dHB1dCgnY2hhbmdlJykgY2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICAgIEBPdXRwdXQoJ2FkZCcpIGFkZEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcbiAgICBAT3V0cHV0KCdmYWlsZWRUb0FkZCcpIGZhaWxlZFRvQWRkRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICAgIEBPdXRwdXQoJ3JlbW92ZScpIHJlbW92ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcbiAgICBAT3V0cHV0KCdjbGVhcicpIGNsZWFyRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG4gICAgQE91dHB1dCgnb3BlbicpIG9wZW5FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgICBAT3V0cHV0KCdjbG9zZScpIGNsb3NlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG4gICAgQE91dHB1dCgnc2Nyb2xsJykgc2Nyb2xsRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgZW5kOiBudW1iZXI7XG4gICAgfT4oKTtcbiAgICBAT3V0cHV0KCdzY3JvbGxUb0VuZCcpIHNjcm9sbFRvRW5kRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgnc2VhcmNoJykgc2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICAgICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgICAgIG1hdGNoaW5nOiBhbnlbXTtcbiAgICB9PigpO1xuXG4gICAgQElucHV0KCdpc09wZW4nKVxuICAgIGlzRHJvcGRvd25PcGVuITogYm9vbGVhbjtcbiAgICBAT3V0cHV0KCdpc09wZW5DaGFuZ2UnKSBpc0Ryb3Bkb3duT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8vISB2aWV3IGNoaWxkcmVuXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoSW5wdXQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHNlYXJjaElucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkKGZvcndhcmRSZWYoKCkgPT4gQXJkaXVtRHJvcGRvd25QYW5lbENvbXBvbmVudCkpXG4gICAgZHJvcGRvd25QYW5lbCE6IEFyZGl1bURyb3Bkb3duUGFuZWxDb21wb25lbnQ7XG5cbiAgICAvLyEgdGVtcGxhdGVzXG4gICAgQENvbnRlbnRDaGlsZChBcmRPcHRpb25UZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIG9wdGlvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBAQ29udGVudENoaWxkKEFyZE9wdGdyb3VwVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBvcHRncm91cFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBAQ29udGVudENoaWxkKEFyZFZhbHVlVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICB2YWx1ZVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBAQ29udGVudENoaWxkKEFyZFNlbGVjdFBsYWNlaG9sZGVyVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwbGFjZWhvbGRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBAQ29udGVudENoaWxkKEFyZExvYWRpbmdTcGlubmVyVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBsb2FkaW5nU3Bpbm5lclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBAQ29udGVudENoaWxkKEFyZExvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgbG9hZGluZ1BsYWNlaG9sZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBDb250ZW50Q2hpbGQoQXJkRHJvcGRvd25IZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIGRyb3Bkb3duSGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBDb250ZW50Q2hpbGQoQXJkRHJvcGRvd25Gb290ZXJUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIGRyb3Bkb3duRm9vdGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBDb250ZW50Q2hpbGQoQXJkTm9JdGVtc0ZvdW5kVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBub0l0ZW1zRm91bmRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQENvbnRlbnRDaGlsZChBcmRBZGRDdXN0b21UZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIGFkZEN1c3RvbVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBAQ29udGVudENoaWxkKEFyZEl0ZW1MaW1pdFJlYWNoZWRUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIGl0ZW1MaW1pdFJlYWNoZWRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQENvbnRlbnRDaGlsZChBcmRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBpdGVtRGlzcGxheUxpbWl0VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQENvbnRlbnRDaGlsZChBcmRTZWxlY3RQcmVmaXhUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHByZWZpeFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBAQ29udGVudENoaWxkKEFyZFNlbGVjdFN1ZmZpeFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgc3VmZml4VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLy8hIGNvbnRleHQgcHJvdmlkZXJzXG4gICAgZ2V0VmFsdWVDb250ZXh0KGl0ZW06IEFyZE9wdGlvbik6IFZhbHVlQ29udGV4dCB7XG4gICAgICAgIGNvbnN0ICR0aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogaXRlbSxcbiAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICBpdGVtRGF0YTogaXRlbS5pdGVtRGF0YSxcbiAgICAgICAgICAgIHVuc2VsZWN0KCkge1xuICAgICAgICAgICAgICAgICR0aGlzLnVuc2VsZWN0SXRlbShpdGVtKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldFN0YXRzQ29udGV4dCgpOiBTdGF0c0NvbnRleHQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG90YWxJdGVtczogdGhpcy50b3RhbEl0ZW1zLFxuICAgICAgICAgICAgZm91bmRJdGVtczogdGhpcy5mb3VuZEl0ZW1zLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRTZWFyY2hDb250ZXh0KCk6IFNlYXJjaENvbnRleHQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLnNlYXJjaFRlcm0sXG4gICAgICAgICAgICBzZWFyY2hUZXJtOiB0aGlzLnNlYXJjaFRlcm0sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zOiB0aGlzLnRvdGFsSXRlbXMsXG4gICAgICAgICAgICBmb3VuZEl0ZW1zOiB0aGlzLmZvdW5kSXRlbXMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldFBsYWNlaG9sZGVyQ29udGV4dCgpOiBQbGFjZWhvbGRlckNvbnRleHQge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXJGb3JDdXJyZW50Q29udGV4dDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgJGltcGxpY2l0OiBwbGFjZWhvbGRlcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0Q3VzdG9tT3B0aW9uQ29udGV4dCgpOiBDdXN0b21PcHRpb25Db250ZXh0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogdGhpcy5zZWFyY2hUZXJtLFxuICAgICAgICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXJtLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRHcm91cENvbnRleHQoZ3JvdXA6IEFyZE9wdGlvbkdyb3VwKTogR3JvdXBDb250ZXh0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogZ3JvdXAsXG4gICAgICAgICAgICBncm91cCxcbiAgICAgICAgICAgIHNlbGVjdGVkQ2hpbGRyZW46IGdyb3VwLmNoaWxkcmVuLmZpbHRlcih2ID0+IHYuc2VsZWN0ZWQpLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsQ2hpbGRyZW46IGdyb3VwLmNoaWxkcmVuLmxlbmd0aCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0T3B0aW9uQ29udGV4dChpdGVtOiBBcmRPcHRpb24pOiBPcHRpb25Db250ZXh0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogaXRlbSxcbiAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICBpdGVtRGF0YTogaXRlbS5pdGVtRGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0SXRlbUxpbWl0Q29udGV4dCgpOiBJdGVtTGltaXRDb250ZXh0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvdGFsSXRlbXM6IHRoaXMudG90YWxJdGVtcyxcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXM6IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcy5sZW5ndGgsXG4gICAgICAgICAgICBpdGVtTGltaXQ6IHRoaXMubWF4U2VsZWN0ZWRJdGVtcyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0SXRlbURpc3BsYXlMaW1pdENvbnRleHQoKTogSXRlbURpc3BsYXlMaW1pdENvbnRleHQge1xuICAgICAgICBsZXQgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zOiB0aGlzLnRvdGFsSXRlbXMsXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLFxuICAgICAgICAgICAgaXRlbUxpbWl0OiB0aGlzLm1heFNlbGVjdGVkSXRlbXMsXG4gICAgICAgICAgICBvdmVyZmxvd0NvdW50OiBzZWxlY3RlZEl0ZW1zIC0gKHRoaXMuaXRlbURpc3BsYXlMaW1pdCA/PyAwKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICAgICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcml2YXRlIHNjcm9sbFN0cmF0ZWd5T3B0czogU2Nyb2xsU3RyYXRlZ3lPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IF9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8hIGRyb3Bkb3duIG92ZXJsYXlcbiAgICBAVmlld0NoaWxkKCdkcm9wZG93bkhvc3QnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBkcm9wZG93bkhvc3QhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkKCdkcm9wZG93blRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIGRyb3Bkb3duVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgcHJpdmF0ZSBkcm9wZG93bk92ZXJsYXk/OiBPdmVybGF5UmVmO1xuXG4gICAgcHJpdmF0ZSBfY3JlYXRlT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlcbiAgICAgICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLmRyb3Bkb3duSG9zdClcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5zY3JvbGxTdHJhdGVneU9wdHMuYmxvY2soKSxcbiAgICAgICAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kcm9wZG93bk92ZXJsYXkgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKGNvbmZpZyk7XG5cbiAgICAgICAgY29uc3QgcG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMuZHJvcGRvd25UZW1wbGF0ZSwgdGhpcy52aWV3Q29udGFpbmVyUmVmKTtcbiAgICAgICAgdGhpcy5kcm9wZG93bk92ZXJsYXkuYXR0YWNoKHBvcnRhbCk7XG4gICAgICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfZGVzdHJveU92ZXJsYXkoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kcm9wZG93bk92ZXJsYXkpIHJldHVybjtcblxuICAgICAgICB0aGlzLmRyb3Bkb3duT3ZlcmxheS5kaXNwb3NlKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRyb3Bkb3duT3ZlcmxheTtcbiAgICB9XG5cbiAgICBzZXRPdmVybGF5U2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duT3ZlcmxheSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyb3Bkb3duSG9zdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLmRyb3Bkb3duT3ZlcmxheS51cGRhdGVTaXplKHsgd2lkdGg6IHJlY3Qud2lkdGggfSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gICAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0T3ZlcmxheVNpemUoKTtcbiAgICB9XG5cbiAgICAvLyEgaG9va3NcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2V0U2VhcmNoSW5wdXRBdHRyaWJ1dGVzKCk7XG4gICAgfVxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNJdGVtc0lucHV0VXNlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2V0SXRlbXNGcm9tQ29tcG9uZW50cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgLy9maXJlIGl0ZW1zIGxvYWQgaGFuZGxlciB3aGVuIGxvYWRpbmcgaXMgc2V0IHRvIGZhbHNlXG4gICAgICAgIGlmIChjaGFuZ2VzWydsb2FkaW5nJ10pIHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzWydsb2FkaW5nJ10uY3VycmVudFZhbHVlID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25JdGVtc0xvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL3NldCBncm91cEl0ZW1zIHRvIHRydWUgYnkgZGVmYXVsdCBpZiBncm91cExhYmVsRnJvbSBvciBpdGVtc0FscmVhZHlHcm91cGVkIGlzIHNldCB0byB0cnVlIGFzIHRoZSBmaXJzdCBjaGFuZ2VcbiAgICAgICAgaWYgKChjaGFuZ2VzWydncm91cExhYmVsRnJvbSddPy5maXJzdENoYW5nZSB8fCBjaGFuZ2VzWydpdGVtc0FscmVhZHlHcm91cGVkJ10/LmZpcnN0Q2hhbmdlKSAmJiAhY2hhbmdlc1snZ3JvdXBJdGVtcyddKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwSXRlbXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX29uSXRlbXNMb2FkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NlYXJjaEJhckZvY3VzZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICAgIHByaXZhdGUgX3ByaW50UHJpbWl0aXZlV2FybmluZ3MoKSB7XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VXYXJuaW5nKHN0cjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXNpbmcgWyR7c3RyfV0gcHJvcGVydHkgYm91bmQgdG8gPGFyZC1zZWxlY3Q+LCBhcyBzb21lIHByb3ZpZGVkIGl0ZW1zIGFyZSBvZiBwcmltaXRpdmUgdHlwZWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnZhbHVlRnJvbSkge1xuICAgICAgICAgICAgbWFrZVdhcm5pbmcoJ3ZhbHVlRnJvbScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxhYmVsRnJvbSkge1xuICAgICAgICAgICAgbWFrZVdhcm5pbmcoJ2xhYmVsRnJvbScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkRnJvbSkge1xuICAgICAgICAgICAgbWFrZVdhcm5pbmcoJ2Rpc2FibGVkRnJvbScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdyb3VwTGFiZWxGcm9tKSB7XG4gICAgICAgICAgICBtYWtlV2FybmluZygnZ3JvdXBMYWJlbEZyb20nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncm91cERpc2FibGVkRnJvbSkge1xuICAgICAgICAgICAgbWFrZVdhcm5pbmcoJ2dyb3VwRGlzYWJsZWRGcm9tJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5Gcm9tKSB7XG4gICAgICAgICAgICBtYWtlV2FybmluZygnY2hpbGRyZW5Gcm9tJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW52ZXJ0RGlzYWJsZWQpIHtcbiAgICAgICAgICAgIG1ha2VXYXJuaW5nKCdpbnZlcnREaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8hIGdldHRlcnNcbiAgICBnZXQgZmlyc3RIaWdobGlnaHRlZEl0ZW0oKTogQXJkT3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcz8uZmlyc3QoKTtcbiAgICB9XG4gICAgZ2V0IHNob3VsZERpc3BsYXlQbGFjZWhvbGRlcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkICYmICF0aGlzLnNlYXJjaFRlcm07XG4gICAgfVxuICAgIGdldCBzaG91bGREaXNwbGF5VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkICYmICghdGhpcy5zZWFyY2hUZXJtIHx8IHRoaXMubXVsdGlzZWxlY3RhYmxlKTtcbiAgICB9XG4gICAgZ2V0IHNob3VsZFNob3dDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsZWFyYWJsZSAmJiAhdGhpcy5fZGlzYWJsZWQgJiYgKHRoaXMuaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWQgfHwgdGhpcy5zZWFyY2hUZXJtICE9ICcnKTtcbiAgICB9XG4gICAgZ2V0IGl0ZW1zVG9EaXNwbGF5KCk6IEl0ZXJhYmxlSXRlcmF0b3I8QXJkT3B0aW9uR3JvdXA+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVN0b3JhZ2UuZ3JvdXBzLnZhbHVlcygpO1xuICAgIH1cbiAgICBnZXQgc2hvdWxkU2hvd05vSXRlbXNGb3VuZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVN0b3JhZ2UuaXNOb0l0ZW1zRm91bmQgJiYgIXRoaXMuaXNMb2FkaW5nICYmICF0aGlzLnNob3VsZFNob3dBZGRDdXN0b207XG4gICAgfVxuICAgIGdldCB0b3RhbEl0ZW1zKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1TdG9yYWdlLml0ZW1zLmxlbmd0aDtcbiAgICB9XG4gICAgZ2V0IGZvdW5kSXRlbXMoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlYXJjaGFibGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1TdG9yYWdlLmZpbHRlcmVkSXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgICBnZXQgc2hvdWxkU2hvd0l0ZW1EaXNwbGF5TGltaXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpc2VsZWN0YWJsZSAmJiB0aGlzLml0ZW1EaXNwbGF5TGltaXQgIT0gSW5maW5pdHkgJiYgdGhpcy5pdGVtU3RvcmFnZS5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IHRoaXMuaXRlbURpc3BsYXlMaW1pdDtcbiAgICB9XG4gICAgZ2V0IGlzSW5wdXRFbGVtZW50UmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hZGRDdXN0b20gJiYgKCF0aGlzLnNlYXJjaGFibGUgfHwgdGhpcy5pdGVtU3RvcmFnZS5pc0l0ZW1MaW1pdFJlYWNoZWQpO1xuICAgIH1cbiAgICBpc1ZhbHVlV2l0aGluRGlzcGxheUxpbWl0KGk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMubXVsdGlzZWxlY3RhYmxlIHx8IHRoaXMuaXRlbURpc3BsYXlMaW1pdCA9PSBJbmZpbml0eSB8fCBpIDwgdGhpcy5pdGVtRGlzcGxheUxpbWl0O1xuICAgIH1cbiAgICBnZXQgcGxhY2Vob2xkZXJGb3JDdXJyZW50Q29udGV4dCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zZWFyY2hQbGFjZWhvbGRlciAmJiB0aGlzLnNlYXJjaGFibGUgJiYgKHRoaXMuX3NlYXJjaEJhckZvY3VzZWQgfHwgdGhpcy5faXNDbGlja2VkV2l0aGluKSkgcmV0dXJuIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXI7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8vISBzZWFyY2ggaW5wdXQgZXZlbnQgaGFuZGxlcnNcbiAgICBmaWx0ZXIoZmlsdGVyVGVybTogc3RyaW5nLCBzdXBwcmVzc1NlYXJjaEV2ZW50OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXJtID0gZmlsdGVyVGVybTtcbiAgICAgICAgbGV0IG1hdGNoaW5nID0gdGhpcy5pdGVtU3RvcmFnZS5maWx0ZXIoZmlsdGVyVGVybSk7XG4gICAgICAgIGlmICghc3VwcHJlc3NTZWFyY2hFdmVudCkgdGhpcy5zZWFyY2hFdmVudC5lbWl0KHsgc2VhcmNoOiBmaWx0ZXJUZXJtLCBtYXRjaGluZyB9KTtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICAgIG9uU2VhcmNoSW5wdXRGb2N1cyhldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWFyY2hCYXJGb2N1c2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgb25TZWFyY2hJbnB1dEJsdXIoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZWFyY2hCYXJGb2N1c2VkKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG5cbiAgICAgICAgdGhpcy5fc2VhcmNoQmFyRm9jdXNlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyEgaXRlbSBzZWxlY3Rpb24gaGFuZGxlcnNcbiAgICB0b2dnbGVJdGVtKGl0ZW06IEFyZE9wdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoaXRlbS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy51bnNlbGVjdEl0ZW0oaXRlbSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGl0ZW0pO1xuICAgIH1cbiAgICBzZWxlY3RJdGVtKC4uLml0ZW1zOiBBcmRPcHRpb25bXSk6IHZvaWQge1xuICAgICAgICBsZXQgW3NlbGVjdGVkLCB1bnNlbGVjdGVkLCBmYWlsZWRUb1NlbGVjdF0gPSB0aGlzLml0ZW1TdG9yYWdlLnNlbGVjdEl0ZW0oLi4uaXRlbXMpO1xuXG4gICAgICAgIGlmICh1bnNlbGVjdGVkLmxlbmd0aCA+IDApIHRoaXMucmVtb3ZlRXZlbnQuZW1pdCh1bnNlbGVjdGVkKTtcblxuICAgICAgICBpZiAoZmFpbGVkVG9TZWxlY3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mYWlsZWRUb0FkZEV2ZW50LmVtaXQoZmFpbGVkVG9TZWxlY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQuZW1pdChzZWxlY3RlZCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG5cbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5rZWVwU2VhcmNoQWZ0ZXJTZWxlY3QpIHRoaXMuX2NsZWFyU2VhcmNoKHRydWUpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMua2VlcE9wZW4gfHwgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNUb1NlbGVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB1bnNlbGVjdEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogdm9pZCB7XG4gICAgICAgIGxldCB1bnNlbGVjdGVkID0gdGhpcy5pdGVtU3RvcmFnZS51bnNlbGVjdEl0ZW0oLi4uaXRlbXMpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnQuZW1pdCh1bnNlbGVjdGVkKTtcbiAgICAgICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICAgICAgICBpZiAoIXRoaXMua2VlcFNlYXJjaEFmdGVyU2VsZWN0KSB0aGlzLl9jbGVhclNlYXJjaCgpO1xuXG4gICAgICAgIHRoaXMuZm9jdXMoKTtcblxuICAgICAgICBpZiAoIXRoaXMua2VlcE9wZW4gfHwgdGhpcy5pdGVtU3RvcmFnZS5pc05vSXRlbXNUb1NlbGVjdCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX2NsZWFyQWxsSXRlbXMoKTogdm9pZCB7XG4gICAgICAgIGxldCBjbGVhcmVkID0gdGhpcy5pdGVtU3RvcmFnZS5jbGVhckFsbFNlbGVjdGVkKHRydWUpO1xuXG4gICAgICAgIHRoaXMuZm9jdXMoKTtcblxuICAgICAgICB0aGlzLmNsZWFyRXZlbnQuZW1pdCgpO1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50LmVtaXQoY2xlYXJlZCk7XG4gICAgICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfY2xlYXJMYXN0SXRlbSgpOiB2b2lkIHtcbiAgICAgICAgbGV0IGNsZWFyZWRWYWx1ZSA9IHRoaXMuaXRlbVN0b3JhZ2UuY2xlYXJMYXN0U2VsZWN0ZWQoKS52YWx1ZTtcblxuICAgICAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudC5lbWl0KFtjbGVhcmVkVmFsdWVdKTtcbiAgICAgICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgICAvLyEgaGlnaGxpZ2gtcmVsYXRlZFxuICAgIG9uTW91c2VNb3ZlKCkge1xuICAgICAgICB0aGlzLl9pc01vdXNlQmVpbmdVc2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgb25Hcm91cE1vdXNlb3Zlcihncm91cDogQXJkT3B0aW9uR3JvdXApOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0YWJsZSB8fCB0aGlzLm5vR3JvdXBBY3Rpb25zKSByZXR1cm47XG4gICAgICAgIHRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0R3JvdXAoZ3JvdXApO1xuICAgIH1cbiAgICBvbkl0ZW1Nb3VzZU92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIG9uSXRlbU1vdXNlRW50ZXIob3B0aW9uOiBBcmRPcHRpb24sIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5faXNNb3VzZUJlaW5nVXNlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodFNpbmdsZUl0ZW0ob3B0aW9uKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIG9uSXRlbU1vdXNlTGVhdmUob3B0aW9uOiBBcmRPcHRpb24sIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5faXNNb3VzZUJlaW5nVXNlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLml0ZW1TdG9yYWdlLnVuaGlnaGxpZ2h0SXRlbShvcHRpb24pO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgLy8hIGNsaWNrIGhhbmRsZXJzXG4gICAgcHJpdmF0ZSBfaXNDbGlja2VkV2l0aGluOiBib29sZWFuID0gZmFsc2U7XG4gICAgb25JdGVtQ2xpY2sob3B0aW9uOiBBcmRPcHRpb24sIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5jbGVhcmFibGUpIHRoaXMudG9nZ2xlSXRlbShvcHRpb24pO1xuICAgICAgICBlbHNlIHRoaXMuc2VsZWN0SXRlbShvcHRpb24pO1xuXG4gICAgICAgIHRoaXMuX2lzQ2xpY2tlZFdpdGhpbiA9IHRydWU7XG4gICAgfVxuICAgIG9uR3JvdXBDbGljayhncm91cDogQXJkT3B0aW9uR3JvdXApOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0YWJsZSB8fCB0aGlzLm5vR3JvdXBBY3Rpb25zKSByZXR1cm47XG4gICAgICAgIGlmIChncm91cC5jaGlsZHJlbi5ldmVyeShvID0+IG8uc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICB0aGlzLnVuc2VsZWN0SXRlbSguLi5ncm91cC5jaGlsZHJlbik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKC4uLmdyb3VwLmNoaWxkcmVuKTtcblxuICAgICAgICB0aGlzLl9pc0NsaWNrZWRXaXRoaW4gPSB0cnVlO1xuICAgIH1cbiAgICBoYW5kbGVDbGVhckJ1dHRvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5zZWFyY2hUZXJtKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGVhclNlYXJjaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsZWFyQWxsSXRlbXMoKTtcbiAgICB9XG4gICAgaGFuZGxlRHJvcGRvd25BcnJvd0NsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHRoaXMuX2lzQ2xpY2tlZFdpdGhpbiA9IHRydWU7XG5cbiAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICB9XG4gICAgaGFuZGxlT3V0c2lkZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0Ryb3Bkb3duT3BlbikgcmV0dXJuO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gICAgaGFuZGxlQW55d2hlcmVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXQudGFnTmFtZSAhPSAnSU5QVVQnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faXNDbGlja2VkV2l0aGluID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuX3NlYXJjaEJhckZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zZWFyY2hhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcpXG4gICAgb25Nb3VzZXVwKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc0NsaWNrZWRXaXRoaW4gPSBmYWxzZTtcbiAgICB9XG4gICAgLy8hIGRyb3Bkb3duIHN0YXRlIGhhbmRsZXJzXG4gICAgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duT3Blbikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgICBvcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzRHJvcGRvd25PcGVuKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmF1dG9IaWdobGlnaHRGaXJzdCkgdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRGaXJzdEl0ZW0oKTtcblxuICAgICAgICB0aGlzLl9jcmVhdGVPdmVybGF5KCk7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcblxuICAgICAgICB0aGlzLm9wZW5FdmVudC5lbWl0KCk7XG4gICAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW5DaGFuZ2UuZW1pdCh0aGlzLmlzRHJvcGRvd25PcGVuKTtcbiAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNEcm9wZG93bk9wZW4pIHJldHVybjtcblxuICAgICAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fZGVzdHJveU92ZXJsYXkoKTtcblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5jbG9zZUV2ZW50LmVtaXQoKTtcbiAgICAgICAgdGhpcy5pc0Ryb3Bkb3duT3BlbkNoYW5nZS5lbWl0KHRoaXMuaXNEcm9wZG93bk9wZW4pO1xuICAgICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgLy8hIENoYW5nZURldGVjdG9yUmVmXG4gICAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCEoPGFueT50aGlzLl9jZCkuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8hIHNlYXJjaFxuICAgIHByaXZhdGUgX2NsZWFyU2VhcmNoKHN1cHByZXNzU2VhcmNoRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZXRTZWFyY2goJycsIHN1cHByZXNzU2VhcmNoRXZlbnQpO1xuICAgIH1cbiAgICBwcml2YXRlIF9zZXRTZWFyY2goc2VhcmNoVGVybTogc3RyaW5nLCBzdXBwcmVzc1NlYXJjaEV2ZW50OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXJtID0gc2VhcmNoVGVybTtcbiAgICAgICAgdGhpcy5maWx0ZXIoc2VhcmNoVGVybSwgc3VwcHJlc3NTZWFyY2hFdmVudCk7XG4gICAgfVxuICAgIHByaXZhdGUgX3NldFNlYXJjaElucHV0QXR0cmlidXRlcygpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICBhdXRvY29ycmVjdDogJ29mZicsXG4gICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZTogJ29mZicsXG4gICAgICAgICAgICBhdXRvY29tcGxldGU6ICdvZmYnLFxuICAgICAgICAgICAgLi4udGhpcy5pbnB1dEF0dHJzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpKSB7XG4gICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8hIGtleSBwcmVzcyBoYW5kbGVyc1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIG9uS2V5UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVudGVyUHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1NwYWNlJzoge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uU3BhY2VQcmVzcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzoge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQXJyb3dEb3duUHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25BcnJvd1VwUHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ0hvbWUnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Ib21lUHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ0VuZCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVuZFByZXNzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdCYWNrc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnRGVsZXRlJzoge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQmFja3NwYWNlT3JEZWxldGVQcmVzcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnS2V5QSc6IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkN0cmxBUHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgX29uRW50ZXJQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBsZXQgc2hvdWxkQ2xvc2UgPSB0cnVlO1xuXG4gICAgICAgIC8vc2VsZWN0IHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgb3B0aW9uXG4gICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd25PcGVuICYmIHRoaXMuZmlyc3RIaWdobGlnaHRlZEl0ZW0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyYWJsZSAmJiB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodGVkSXRlbXMuZXZlcnkoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3RJdGVtKC4uLnRoaXMuaXRlbVN0b3JhZ2UuaGlnaGxpZ2h0ZWRJdGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbSguLi50aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodGVkSXRlbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vYWRkIGEgY3VzdG9tIG9wdGlvblxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzRHJvcGRvd25PcGVuICYmIHRoaXMuc2hvdWxkU2hvd0FkZEN1c3RvbSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRDdXN0b21PcHRpb24odGhpcy5zZWFyY2hUZXJtKTtcbiAgICAgICAgfVxuICAgICAgICAvL2luIGNhc2Ugb2Ygbm8gYWN0aW9uLCBvcGVuIHRoZSBkcm9wZG93biAob3Iga2VlcCBpdCBvcGVuKVxuICAgICAgICBlbHNlIHNob3VsZENsb3NlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCF0aGlzLmtlZXBPcGVuICYmIHNob3VsZENsb3NlKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1TdG9yYWdlLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBfb25TcGFjZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd25PcGVuKSByZXR1cm47XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICAgIHByaXZhdGUgX29uQXJyb3dEb3duUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG5cbiAgICAgICAgdGhpcy5faXNNb3VzZUJlaW5nVXNlZCA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodE5leHRJdGVtKCsxLCBldmVudC5zaGlmdEtleSk7XG4gICAgICAgIGlmIChyZWNlbnRseUhpZ2hsaWdodGVkKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1TdG9yYWdlLnNldFJlY2VudGx5SGlnaGxpZ2h0ZWQocmVjZW50bHlIaWdobGlnaHRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRyb3Bkb3duUGFuZWwuc2Nyb2xsVG9SZWNlbnRseUhpZ2hsaWdodGVkKCdib3R0b20nKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfb25BcnJvd1VwUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRHJvcGRvd25PcGVuKSByZXR1cm47XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy5faXNNb3VzZUJlaW5nVXNlZCA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodE5leHRJdGVtKC0xLCBldmVudC5zaGlmdEtleSk7XG4gICAgICAgIGlmIChyZWNlbnRseUhpZ2hsaWdodGVkKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1TdG9yYWdlLnNldFJlY2VudGx5SGlnaGxpZ2h0ZWQocmVjZW50bHlIaWdobGlnaHRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRyb3Bkb3duUGFuZWwuc2Nyb2xsVG9SZWNlbnRseUhpZ2hsaWdodGVkKCd0b3AnKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfb25Ib21lUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRHJvcGRvd25PcGVuIHx8ICh0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kICE9IDAgJiYgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0ICE9IDApKSByZXR1cm47XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy5faXNNb3VzZUJlaW5nVXNlZCA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xuICAgICAgICBpZiAoIXJlY2VudGx5SGlnaGxpZ2h0ZWQpIHJldHVybjtcblxuICAgICAgICB0aGlzLml0ZW1TdG9yYWdlLnNldFJlY2VudGx5SGlnaGxpZ2h0ZWQocmVjZW50bHlIaWdobGlnaHRlZCk7XG4gICAgICAgIHRoaXMuZHJvcGRvd25QYW5lbC5zY3JvbGxUb1JlY2VudGx5SGlnaGxpZ2h0ZWQoJ3RvcCcpO1xuICAgIH1cbiAgICBwcml2YXRlIF9vbkVuZFByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLmlzRHJvcGRvd25PcGVuIHx8XG4gICAgICAgICAgICAodGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCAhPSB0aGlzLnNlYXJjaFRlcm0ubGVuZ3RoICYmIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCAhPSB0aGlzLnNlYXJjaFRlcm0ubGVuZ3RoKVxuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy5faXNNb3VzZUJlaW5nVXNlZCA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJlY2VudGx5SGlnaGxpZ2h0ZWQgPSB0aGlzLml0ZW1TdG9yYWdlLmhpZ2hsaWdodExhc3RJdGVtKCk7XG4gICAgICAgIGlmICghcmVjZW50bHlIaWdobGlnaHRlZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaXRlbVN0b3JhZ2Uuc2V0UmVjZW50bHlIaWdobGlnaHRlZChyZWNlbnRseUhpZ2hsaWdodGVkKTtcbiAgICAgICAgdGhpcy5kcm9wZG93blBhbmVsLnNjcm9sbFRvUmVjZW50bHlIaWdobGlnaHRlZCgnYm90dG9tJyk7XG4gICAgfVxuICAgIHByaXZhdGUgX29uQmFja3NwYWNlT3JEZWxldGVQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWFyY2hUZXJtIHx8ICF0aGlzLl9jbGVhcmFibGUgfHwgdGhpcy5ub0JhY2tzcGFjZUNsZWFyIHx8ICF0aGlzLml0ZW1TdG9yYWdlLmlzQW55SXRlbVNlbGVjdGVkKSByZXR1cm47XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3RhYmxlICYmIHRoaXMuaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGVhckxhc3RJdGVtKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2xlYXJBbGxJdGVtcygpO1xuICAgIH1cbiAgICBwcml2YXRlIF9vbkN0cmxBUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pdGVtU3RvcmFnZS5oaWdobGlnaHRBbGxJdGVtcygpO1xuICAgIH1cbn1cbiIsIjxhcmQtZm9ybS1maWVsZC1mcmFtZVxyXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXHJcbiAgICBbdmFyaWFudF09XCJ2YXJpYW50XCJcclxuICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxyXG4gICAgW2lzRm9jdXNlZF09XCJpc0ZvY3VzZWRcIlxyXG4gICAgW3ByZWZpeFRlbXBsYXRlXT1cInByZWZpeFRlbXBsYXRlXCJcclxuICAgIFtzdWZmaXhUZW1wbGF0ZV09XCJzdWZmaXhUZW1wbGF0ZVwiXHJcbj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtc2VsZWN0XCJcclxuICAgICAgICAjZHJvcGRvd25Ib3N0XHJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZUFueXdoZXJlQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgW2NsYXNzLmFyZC1oYXMtdmFsdWVdPVwiaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWRcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIm5nQ2xhc3Nlc1wiXHJcbiAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1zZWxlY3QtdmFsdWUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGREaXNwbGF5UGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGUgbGV0LXBsaGxkcj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXBsYWNlaG9sZGVyXCI+e3sgcGxobGRyIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBsYWNlaG9sZGVyVGVtcGxhdGUgfHwgZGVmYXVsdFBsYWNlaG9sZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRQbGFjZWhvbGRlckNvbnRleHQoKVwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvdWxkRGlzcGxheVZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXNlbGVjdC12YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbVN0b3JhZ2Uuc2VsZWN0ZWRJdGVtczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC12YWx1ZS1kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5oaWRkZW5dPVwiIWlzVmFsdWVXaXRoaW5EaXNwbGF5TGltaXQoaSkgPyB0cnVlIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNWYWx1ZVdpdGhpbkRpc3BsYXlMaW1pdChpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInZhbHVlVGVtcGxhdGUgfHwgKG11bHRpc2VsZWN0YWJsZSA/IGRlZmF1bHRNdWx0aVZhbHVlVGVtcGxhdGUgOiAgZGVmYXVsdFZhbHVlVGVtcGxhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFZhbHVlQ29udGV4dChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRWYWx1ZVRlbXBsYXRlIGxldC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2FyZElubmVySFRNTF09XCJpdGVtLmxhYmVsXCIgW2FyZEVzY2FwZUlubmVySFRNTF09XCJpc0l0ZW1zSW5wdXRVc2VkXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TXVsdGlWYWx1ZVRlbXBsYXRlIGxldC1pdGVtIGxldC11bnNlbGVjdD1cInVuc2VsZWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1kZWxldGFibGUtY2hpcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGVsZXRlKT1cInVuc2VsZWN0KGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhcmlhbnRdPVwidmFyaWFudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVkLXN0cm9uZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFthcmRJbm5lckhUTUxdPVwiaXRlbS5sYWJlbFwiIFthcmRFc2NhcGVJbm5lckhUTUxdPVwiaXNJdGVtc0lucHV0VXNlZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWRlbGV0YWJsZS1jaGlwPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVN0b3JhZ2UuaXNBbnlJdGVtU2VsZWN0ZWQgJiYgc2hvdWxkU2hvd0l0ZW1EaXNwbGF5TGltaXRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtb3ZlcmZsb3ctaW5kaWNhdG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1EaXNwbGF5TGltaXRUZW1wbGF0ZSB8fCBkZWZhdWx0SXRlbURpc3BsYXlMaW1pdFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEl0ZW1EaXNwbGF5TGltaXRDb250ZXh0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJdGVtRGlzcGxheUxpbWl0VGVtcGxhdGUgbGV0LWNvdW50PVwib3ZlcmZsb3dDb3VudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7Y291bnR9fSBtb3JlLi4uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtc2VhcmNoLWlucHV0XCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXHJcbiAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRHJvcGRvd25PcGVuXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtb3duc109XCJpc0Ryb3Bkb3duT3BlbiA/IGh0bWxJZCA6IG51bGxcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgI3NlYXJjaElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgI2ZvY3VzYWJsZUVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwic2VhcmNoSW5wdXRJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJpc0lucHV0RWxlbWVudFJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXJtXCJcclxuICAgICAgICAgICAgICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiaXNEcm9wZG93bk9wZW4gPyBodG1sSWQgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiZmlsdGVyKHNlYXJjaElucHV0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvblNlYXJjaElucHV0Rm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uU2VhcmNoSW5wdXRCbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1zZWxlY3QtY29udHJvbHNcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TG9hZGluZ1NwaW5uZXJUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLXNpbXBsZS1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsb2FkaW5nU3Bpbm5lclRlbXBsYXRlIHx8IGRlZmF1bHRMb2FkaW5nU3Bpbm5lclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxhcmQtX2NsZWFyLWJ1dHRvbiAqbmdJZj1cInNob3VsZFNob3dDbGVhckJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiY2xlYXJCdXR0b25UaXRsZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xlYXJCdXR0b25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgPjwvYXJkLV9jbGVhci1idXR0b24+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93LXdyYXBwZXJcIlxyXG4gICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRHJvcGRvd25BcnJvd0NsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyZC1kcm9wZG93bi1hcnJvd1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtaGl0Ym94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvYXJkLWZvcm0tZmllbGQtZnJhbWU+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICNkcm9wZG93blRlbXBsYXRlPlxyXG4gICAgPGFyZC1kcm9wZG93bi1wYW5lbFxyXG4gICAgICAgIGNsYXNzPVwiYXJkLWRyb3Bkb3duLXBhbmVsIGFyZC1zZWxlY3QtZHJvcGRvd24tcGFuZWxcIlxyXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwiT3B0aW9ucyBsaXN0XCJcclxuICAgICAgICBbaGVhZGVyVGVtcGxhdGVdPVwiZHJvcGRvd25IZWFkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgW2Zvb3RlclRlbXBsYXRlXT1cImRyb3Bkb3duRm9vdGVyVGVtcGxhdGVcIlxyXG4gICAgICAgIFthcHBlYXJhbmNlXT1cImRyb3Bkb3duQXBwZWFyYW5jZVwiXHJcbiAgICAgICAgW3ZhcmlhbnRdPVwiZHJvcGRvd25WYXJpYW50XCJcclxuICAgICAgICBbaXNPcGVuXT1cInRydWVcIlxyXG4gICAgICAgIFtmaWx0ZXJWYWx1ZV09XCJzZWFyY2hUZXJtXCJcclxuICAgICAgICBbcGFuZWxJZF09XCJodG1sSWRcIlxyXG4gICAgICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxyXG4gICAgICAgIChhcmRDbGlja091dHNpZGUpPVwiaGFuZGxlT3V0c2lkZUNsaWNrKCRldmVudClcIlxyXG4gICAgICAgIChtb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoKVwiXHJcbiAgICAgICAgKHNjcm9sbCk9XCJzY3JvbGxFdmVudC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChzY3JvbGxUb0VuZCk9XCJzY3JvbGxUb0VuZEV2ZW50LmVtaXQoJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzaG91bGRTaG93Tm9JdGVtc0ZvdW5kXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLW9wdGdyb3VwXCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgaXRlbVN0b3JhZ2UuZ3JvdXBzXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtZ3JvdXAtZGlzYWJsZWRdPVwiZ3JvdXAuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1ncm91cC1zZWxlY3RlZF09XCJncm91cC5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWdyb3VwLWhpZ2hsaWdodGVkXT1cImdyb3VwLmhpZ2hsaWdodGVkXCJcclxuICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25Hcm91cE1vdXNlb3Zlcihncm91cClcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uR3JvdXBDbGljayhncm91cClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXAubGFiZWwgIT09ICcnICYmIGdyb3VwLmxhYmVsICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRPcHRncm91cFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyZC1vcHRncm91cC1sYWJlbFwiIFthcmRJbm5lckhUTUxdPVwiZ3JvdXAubGFiZWxcIiBbYXJkRXNjYXBlSW5uZXJIVE1MXT1cImlzSXRlbXNJbnB1dFVzZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGdyb3VwVGVtcGxhdGUgfHwgZGVmYXVsdE9wdGdyb3VwVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0R3JvdXBDb250ZXh0KGdyb3VwKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGdyb3VwLWNoaWxkcmVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC1vcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBncm91cC5jaGlsZHJlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWRpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLXNlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWhpZ2hsaWdodGVkXT1cIm9wdGlvbi5oaWdobGlnaHRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtb3B0aW9uLWhpZ2hsaWdodGVkLXJlY2VudF09XCJvcHRpb24uaGlnaGxpZ2h0ZWRfcmVjZW50bHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIm9wdGlvbi5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImh0bWxJZCArICctJyArIG9wdGlvbi5pbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkl0ZW1DbGljayhvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cIm9uSXRlbU1vdXNlT3ZlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25JdGVtTW91c2VFbnRlcihvcHRpb24sICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkl0ZW1Nb3VzZUxlYXZlKG9wdGlvbiwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGlvbi1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0T3B0aW9uVGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2FyZElubmVySFRNTF09XCJvcHRpb24ubGFiZWxcIiBbYXJkRXNjYXBlSW5uZXJIVE1MXT1cImlzSXRlbXNJbnB1dFVzZWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvblRlbXBsYXRlIHx8IGRlZmF1bHRPcHRpb25UZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldE9wdGlvbkNvbnRleHQob3B0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93Tm9JdGVtc0ZvdW5kXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE5vSXRlbXNGb3VuZFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1vcHRpb24gYXJkLW9wdGlvbi1kaXNhYmxlZFwiPnt7bm9JdGVtc0ZvdW5kVGV4dH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9JdGVtc0ZvdW5kVGVtcGxhdGUgfHwgZGVmYXVsdE5vSXRlbXNGb3VuZFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRTZWFyY2hDb250ZXh0KClcIj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3VsZFNob3dBZGRDdXN0b21cIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0QWRkQ3VzdG9tVGVtcGxhdGUgbGV0LXNlYXJjaFRlcm0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLW9wdGlvbiBhcmQtb3B0aW9uLWhpZ2hsaWdodGVkIGFyZC1hZGQtY3VzdG9tXCIgKGNsaWNrKT1cImFkZEN1c3RvbU9wdGlvbihzZWFyY2hUZXJtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWFkZC1jdXN0b20tbGFiZWxcIj5BZGQgb3B0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJkLWFkZC1jdXN0b20tdmFsdWVcIj5cInt7c2VhcmNoVGVybX19XCI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhZGRDdXN0b21UZW1wbGF0ZSB8fCBkZWZhdWx0QWRkQ3VzdG9tVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEN1c3RvbU9wdGlvbkNvbnRleHQoKVwiPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1vcHRpb24gYXJkLW9wdGlvbi1kaXNhYmxlZFwiPnt7bG9hZGluZ1BsYWNlaG9sZGVyVGV4dH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9hZGluZ1BsYWNlaG9sZGVyVGVtcGxhdGUgfHwgZGVmYXVsdExvYWRpbmdQbGFjZWhvbGRlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRTZWFyY2hDb250ZXh0KClcIj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvYXJkLWRyb3Bkb3duLXBhbmVsPlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|