@updevs/components 1.0.0-alpha.3 → 1.0.0-alpha.30
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 +5 -4
- package/assets/styles/_bootstrap-components.scss +18 -1
- package/assets/styles/_seven-columns.scss +73 -0
- package/assets/styles/_updevs.scss +4 -0
- package/assets/styles/_variables.scss +1 -1
- package/assets/styles/utils/_colors.scss +1 -1
- package/badge/badge-config.model.d.ts +14 -0
- package/badge/badge.component.d.ts +24 -0
- package/badge/badge.config.d.ts +12 -0
- package/badge/public-api.d.ts +3 -0
- package/badge/upd-badge.module.d.ts +8 -0
- package/button/button.component.d.ts +61 -0
- package/button/upd-button.module.d.ts +10 -0
- package/calendar/calendar.component.d.ts +127 -0
- package/calendar/components/calendar-body/calendar-body.component.d.ts +263 -0
- package/calendar/components/calendar-header/calendar-header.component.d.ts +57 -0
- package/calendar/components/calendar-month-view/calendar-month-view.component.d.ts +151 -0
- package/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +10 -0
- package/calendar/components/calendar-year-view/calendar-year-view.component.d.ts +9 -0
- package/calendar/models/calendar-cell.model.d.ts +16 -0
- package/calendar/models/calendar-user-event.model.d.ts +4 -0
- package/calendar/models/date-range.model.d.ts +26 -0
- package/calendar/models/public-api.d.ts +2 -0
- package/calendar/public-api.d.ts +5 -0
- package/calendar/services/calendar-range-strategy.service.d.ts +35 -0
- package/calendar/services/calendar-signals.service.d.ts +24 -0
- package/calendar/services/calendar.service.d.ts +15 -0
- package/calendar/services/public-api.d.ts +1 -0
- package/calendar/tools/events-options.d.ts +12 -0
- package/calendar/tools/keyboard-tools.d.ts +9 -0
- package/calendar/tools/passive-listeners.d.ts +16 -0
- package/calendar/types/calendar-cell-class-function.type.d.ts +3 -0
- package/calendar/types/calendar-cell-css-classes.type.d.ts +3 -0
- package/calendar/types/calendar-view.type.d.ts +1 -0
- package/calendar/types/modifier-key.type.d.ts +1 -0
- package/calendar/types/public-api.d.ts +1 -0
- package/calendar/upd-calendar.module.d.ts +18 -0
- package/card/card.component.d.ts +54 -0
- package/card/directives/card-actions.directive.d.ts +7 -0
- package/card/directives/card-footer.directive.d.ts +7 -0
- package/card/directives/card-header.directive.d.ts +7 -0
- package/card/directives/card-image.directive.d.ts +7 -0
- package/card/upd-card.module.d.ts +14 -0
- package/drag-and-drop/drag-and-drop.component.d.ts +26 -0
- package/drag-and-drop/models/drag-and-drop-column.config.d.ts +8 -0
- package/drag-and-drop/models/drag-and-drop-column.model.d.ts +10 -0
- package/drag-and-drop/models/drag-and-drop-item.d.ts +7 -0
- package/drag-and-drop/models/drag-and-drop-item.model.d.ts +13 -0
- package/drag-and-drop/models/drag-and-drop.config.d.ts +6 -0
- package/drag-and-drop/models/public-api.d.ts +4 -0
- package/drag-and-drop/public-api.d.ts +3 -0
- package/drag-and-drop/upd-drag-and-drop.module.d.ts +9 -0
- package/dropdown/dropdown.component.d.ts +76 -0
- package/dropdown/models/dropdown-action-clicked.model.d.ts +6 -0
- package/dropdown/{src/models/dropdown-item.ts → models/dropdown-item.d.ts} +7 -4
- package/dropdown/{src/models/dropdown-item.type.ts → models/dropdown-item.type.d.ts} +1 -1
- package/dropdown/models/public-api.d.ts +4 -0
- package/dropdown/models/toolbar.type.d.ts +1 -0
- package/dropdown/upd-dropdown.module.d.ts +12 -0
- package/esm2022/badge/badge-config.model.mjs +14 -0
- package/esm2022/badge/badge.component.mjs +50 -0
- package/esm2022/badge/badge.config.mjs +2 -0
- package/esm2022/badge/index.mjs +2 -0
- package/esm2022/badge/public-api.mjs +4 -0
- package/esm2022/badge/upd-badge.module.mjs +24 -0
- package/esm2022/badge/updevs-components-badge.mjs +5 -0
- package/esm2022/button/button.component.mjs +157 -0
- package/esm2022/button/index.mjs +2 -0
- package/esm2022/button/public-api.mjs +3 -0
- package/esm2022/button/upd-button.module.mjs +32 -0
- package/esm2022/button/updevs-components-button.mjs +5 -0
- package/esm2022/calendar/assets/i18n/en.json +16 -0
- package/esm2022/calendar/assets/i18n/pt.json +16 -0
- package/esm2022/calendar/calendar.component.mjs +247 -0
- package/esm2022/calendar/components/calendar-body/calendar-body.component.mjs +515 -0
- package/esm2022/calendar/components/calendar-header/calendar-header.component.mjs +144 -0
- package/esm2022/calendar/components/calendar-month-view/calendar-month-view.component.mjs +423 -0
- package/esm2022/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.mjs +18 -0
- package/esm2022/calendar/components/calendar-year-view/calendar-year-view.component.mjs +17 -0
- package/esm2022/calendar/index.mjs +2 -0
- package/esm2022/calendar/models/calendar-cell.model.mjs +18 -0
- package/esm2022/calendar/models/calendar-user-event.model.mjs +2 -0
- package/esm2022/calendar/models/date-range.model.mjs +18 -0
- package/esm2022/calendar/models/public-api.mjs +3 -0
- package/esm2022/calendar/public-api.mjs +6 -0
- package/esm2022/calendar/services/calendar-range-strategy.service.mjs +99 -0
- package/esm2022/calendar/services/calendar-signals.service.mjs +47 -0
- package/esm2022/calendar/services/calendar.service.mjs +40 -0
- package/esm2022/calendar/services/public-api.mjs +2 -0
- package/esm2022/calendar/tools/events-options.mjs +14 -0
- package/esm2022/calendar/tools/keyboard-tools.mjs +14 -0
- package/esm2022/calendar/tools/passive-listeners.mjs +29 -0
- package/esm2022/calendar/types/calendar-cell-class-function.type.mjs +2 -0
- package/esm2022/calendar/types/calendar-cell-css-classes.type.mjs +2 -0
- package/esm2022/calendar/types/calendar-view.type.mjs +2 -0
- package/esm2022/calendar/types/modifier-key.type.mjs +2 -0
- package/esm2022/calendar/types/public-api.mjs +2 -0
- package/esm2022/calendar/upd-calendar.module.mjs +70 -0
- package/esm2022/calendar/updevs-components-calendar.mjs +5 -0
- package/esm2022/card/card.component.mjs +136 -0
- package/esm2022/card/directives/card-actions.directive.mjs +16 -0
- package/esm2022/card/directives/card-footer.directive.mjs +16 -0
- package/esm2022/card/directives/card-header.directive.mjs +16 -0
- package/esm2022/card/directives/card-image.directive.mjs +16 -0
- package/esm2022/card/directives/public-api.mjs +5 -0
- package/esm2022/card/index.mjs +2 -0
- package/esm2022/card/public-api.mjs +4 -0
- package/esm2022/card/types/card-state.type.mjs +2 -0
- package/esm2022/card/types/card-style.type.mjs +2 -0
- package/esm2022/card/types/hover-effect.type.mjs +2 -0
- package/esm2022/card/types/ribbon-style.type.mjs +2 -0
- package/esm2022/card/types/status-position.type.mjs +2 -0
- package/esm2022/card/upd-card.module.mjs +50 -0
- package/esm2022/card/updevs-components-card.mjs +5 -0
- package/esm2022/drag-and-drop/drag-and-drop.component.mjs +134 -0
- package/esm2022/drag-and-drop/index.mjs +2 -0
- package/esm2022/drag-and-drop/models/drag-and-drop-column.config.mjs +2 -0
- package/esm2022/drag-and-drop/models/drag-and-drop-column.model.mjs +9 -0
- package/esm2022/drag-and-drop/models/drag-and-drop-item.mjs +2 -0
- package/esm2022/drag-and-drop/models/drag-and-drop-item.model.mjs +14 -0
- package/esm2022/drag-and-drop/models/drag-and-drop.config.mjs +2 -0
- package/esm2022/drag-and-drop/models/public-api.mjs +5 -0
- package/esm2022/drag-and-drop/public-api.mjs +4 -0
- package/esm2022/drag-and-drop/upd-drag-and-drop.module.mjs +28 -0
- package/esm2022/drag-and-drop/updevs-components-drag-and-drop.mjs +5 -0
- package/esm2022/dropdown/dropdown.component.mjs +182 -0
- package/esm2022/dropdown/index.mjs +2 -0
- package/esm2022/dropdown/models/dropdown-action-clicked.model.mjs +2 -0
- package/esm2022/dropdown/models/dropdown-item.mjs +2 -0
- package/esm2022/dropdown/models/dropdown-item.type.mjs +2 -0
- package/esm2022/dropdown/models/public-api.mjs +5 -0
- package/esm2022/dropdown/models/toolbar.type.mjs +2 -0
- package/esm2022/dropdown/public-api.mjs +4 -0
- package/esm2022/dropdown/upd-dropdown.module.mjs +40 -0
- package/esm2022/dropdown/updevs-components-dropdown.mjs +5 -0
- package/esm2022/form/assets/i18n/en.json +17 -0
- package/esm2022/form/assets/i18n/pt.json +17 -0
- package/esm2022/form/components/dynamic-field/dynamic-field.component.mjs +127 -0
- package/esm2022/form/form.component.mjs +122 -0
- package/esm2022/form/index.mjs +2 -0
- package/esm2022/form/models/checkbox-field.model.mjs +2 -0
- package/esm2022/form/models/checkbox-group-field.model.mjs +2 -0
- package/esm2022/form/models/dynamic-field.model.mjs +2 -0
- package/esm2022/form/models/enums/dynamic-field.type.mjs +14 -0
- package/esm2022/form/models/enums/public-api.mjs +2 -0
- package/esm2022/form/models/file-upload-field.model.mjs +2 -0
- package/esm2022/form/models/form-config.mjs +2 -0
- package/esm2022/form/models/form-row.model.mjs +2 -0
- package/esm2022/form/models/input-field.model.mjs +2 -0
- package/esm2022/form/models/public-api.mjs +15 -0
- package/esm2022/form/models/radio-field.model.mjs +2 -0
- package/esm2022/form/models/radio-group-field.model.mjs +2 -0
- package/esm2022/form/models/select-field.model.mjs +2 -0
- package/esm2022/form/models/single-select-field.model.mjs +2 -0
- package/esm2022/form/models/textarea-field.model.mjs +2 -0
- package/esm2022/form/models/validator-config.mjs +2 -0
- package/esm2022/form/public-api.mjs +4 -0
- package/esm2022/form/tools/errors-helper.mjs +54 -0
- package/esm2022/form/upd-form.module.mjs +84 -0
- package/esm2022/form/updevs-components-form.mjs +5 -0
- package/esm2022/form-controls/abstractions/base-control.mjs +46 -0
- package/esm2022/form-controls/abstractions/index.mjs +2 -0
- package/esm2022/form-controls/abstractions/public-api.mjs +2 -0
- package/esm2022/form-controls/abstractions/updevs-components-form-controls-abstractions.mjs +5 -0
- package/esm2022/form-controls/checkbox/checkbox.component.mjs +51 -0
- package/esm2022/form-controls/checkbox/index.mjs +2 -0
- package/esm2022/form-controls/checkbox/public-api.mjs +3 -0
- package/esm2022/form-controls/checkbox/upd-checkbox.module.mjs +32 -0
- package/esm2022/form-controls/checkbox/updevs-components-form-controls-checkbox.mjs +5 -0
- package/esm2022/form-controls/date-picker/date-picker.component.mjs +147 -0
- package/esm2022/form-controls/date-picker/index.mjs +2 -0
- package/esm2022/form-controls/date-picker/public-api.mjs +3 -0
- package/esm2022/form-controls/date-picker/upd-date-picker.module.mjs +40 -0
- package/esm2022/form-controls/date-picker/updevs-components-form-controls-date-picker.mjs +5 -0
- package/esm2022/form-controls/file-upload/assets/i18n/en.json +15 -0
- package/esm2022/form-controls/file-upload/assets/i18n/pt.json +15 -0
- package/esm2022/form-controls/file-upload/file-upload-changed.event.mjs +2 -0
- package/esm2022/form-controls/file-upload/file-upload.component.mjs +169 -0
- package/esm2022/form-controls/file-upload/index.mjs +2 -0
- package/esm2022/form-controls/file-upload/public-api.mjs +4 -0
- package/esm2022/form-controls/file-upload/upd-file-upload.module.mjs +48 -0
- package/esm2022/form-controls/file-upload/updevs-components-form-controls-file-upload.mjs +5 -0
- package/esm2022/form-controls/input/directives/input-append.directive.mjs +16 -0
- package/esm2022/form-controls/input/directives/input-prepend.directive.mjs +16 -0
- package/esm2022/form-controls/input/directives/public-api.mjs +3 -0
- package/esm2022/form-controls/input/index.mjs +2 -0
- package/esm2022/form-controls/input/input.component.mjs +185 -0
- package/esm2022/form-controls/input/public-api.mjs +5 -0
- package/esm2022/form-controls/input/types/input.type.mjs +2 -0
- package/esm2022/form-controls/input/types/loader-position.type.mjs +2 -0
- package/esm2022/form-controls/input/types/public-api.mjs +3 -0
- package/esm2022/form-controls/input/upd-input.module.mjs +46 -0
- package/esm2022/form-controls/input/updevs-components-form-controls-input.mjs +5 -0
- package/esm2022/form-controls/radio/index.mjs +2 -0
- package/esm2022/form-controls/radio/public-api.mjs +3 -0
- package/esm2022/form-controls/radio/radio.component.mjs +51 -0
- package/esm2022/form-controls/radio/upd-radio.module.mjs +32 -0
- package/esm2022/form-controls/radio/updevs-components-form-controls-radio.mjs +5 -0
- package/esm2022/form-controls/select/components/multiple/select-multiple.component.mjs +76 -0
- package/esm2022/form-controls/select/components/single/select.component.mjs +72 -0
- package/esm2022/form-controls/select/index.mjs +2 -0
- package/esm2022/form-controls/select/models/abstractions/base-select.component.mjs +215 -0
- package/esm2022/form-controls/select/models/defaults.mjs +8 -0
- package/esm2022/form-controls/select/models/public-api.mjs +3 -0
- package/esm2022/form-controls/select/models/select-item.mjs +2 -0
- package/esm2022/form-controls/select/public-api.mjs +5 -0
- package/esm2022/form-controls/select/upd-select.module.mjs +57 -0
- package/esm2022/form-controls/select/updevs-components-form-controls-select.mjs +5 -0
- package/esm2022/form-controls/textarea/index.mjs +2 -0
- package/esm2022/form-controls/textarea/public-api.mjs +3 -0
- package/esm2022/form-controls/textarea/textarea.component.mjs +44 -0
- package/esm2022/form-controls/textarea/upd-textarea.module.mjs +24 -0
- package/esm2022/form-controls/textarea/updevs-components-form-controls-textarea.mjs +5 -0
- package/esm2022/form-controls/time-picker/index.mjs +2 -0
- package/esm2022/form-controls/time-picker/public-api.mjs +4 -0
- package/esm2022/form-controls/time-picker/time-picker.component.mjs +130 -0
- package/esm2022/form-controls/time-picker/time-selector/time-selector.component.mjs +124 -0
- package/esm2022/form-controls/time-picker/upd-time-picker.module.mjs +61 -0
- package/esm2022/form-controls/time-picker/updevs-components-form-controls-time-picker.mjs +5 -0
- package/esm2022/index.mjs +2 -0
- package/esm2022/layout/abstractions/base-page.component.mjs +23 -0
- package/esm2022/layout/abstractions/base.layout.mjs +31 -0
- package/esm2022/layout/abstractions/public-api.mjs +2 -0
- package/esm2022/layout/assets/i18n/en.json +27 -0
- package/esm2022/layout/assets/i18n/pt.json +27 -0
- package/esm2022/layout/index.mjs +2 -0
- package/esm2022/layout/layouts/blank-layout/blank-layout.component.mjs +22 -0
- package/esm2022/layout/layouts/blank-layout/blank-layout.module.mjs +50 -0
- package/esm2022/layout/layouts/public-api.mjs +5 -0
- package/esm2022/layout/layouts/vertical-sidebar-layout/vertical-sidebar-layout.component.mjs +17 -0
- package/esm2022/layout/layouts/vertical-sidebar-layout/vertical-sidebar-layout.module.mjs +83 -0
- package/esm2022/layout/models/login-page-config.model.mjs +20 -0
- package/esm2022/layout/models/login-page.config.mjs +2 -0
- package/esm2022/layout/models/public-api.mjs +3 -0
- package/esm2022/layout/models/security-layout-config.model.mjs +10 -0
- package/esm2022/layout/models/security-layout.config.mjs +2 -0
- package/esm2022/layout/models/upd-layout-config.model.mjs +24 -0
- package/esm2022/layout/models/upd-layout.config.mjs +2 -0
- package/esm2022/layout/pages/auth-flow/auth-flow-routing.module.mjs +28 -0
- package/esm2022/layout/pages/auth-flow/auth-flow.module.mjs +73 -0
- package/esm2022/layout/pages/auth-flow/logged-out/logged-out.component.mjs +11 -0
- package/esm2022/layout/pages/auth-flow/login/login.component.mjs +110 -0
- package/esm2022/layout/pages/auth-flow/oauth-callback/oauth-callback.component.mjs +11 -0
- package/esm2022/layout/pages/auth-flow/public-api.mjs +6 -0
- package/esm2022/layout/pages/public-api.mjs +2 -0
- package/esm2022/layout/partials/footer/footer-copyright.directive.mjs +13 -0
- package/esm2022/layout/partials/footer/footer.component.mjs +55 -0
- package/esm2022/layout/partials/footer/footer.module.mjs +28 -0
- package/esm2022/layout/partials/footer/public-api.mjs +4 -0
- package/esm2022/layout/partials/header/header-style.type.mjs +2 -0
- package/esm2022/layout/partials/header/header.component.mjs +129 -0
- package/esm2022/layout/partials/header/header.module.mjs +40 -0
- package/esm2022/layout/partials/header/public-api.mjs +4 -0
- package/esm2022/layout/partials/page-header/page-header.component.mjs +15 -0
- package/esm2022/layout/partials/page-header/public-api.mjs +2 -0
- package/esm2022/layout/partials/public-api.mjs +5 -0
- package/esm2022/layout/partials/sidebar/public-api.mjs +2 -0
- package/esm2022/layout/partials/sidebar/sidebar.component.mjs +114 -0
- package/esm2022/layout/public-api.mjs +8 -0
- package/esm2022/layout/services/public-api.mjs +2 -0
- package/esm2022/layout/services/upd-layout-config.service.mjs +21 -0
- package/esm2022/layout/tools/layout.constants.mjs +15 -0
- package/esm2022/layout/upd-layout.module.mjs +47 -0
- package/esm2022/layout/updevs-components-layout.mjs +5 -0
- package/esm2022/lib/index.mjs +2 -0
- package/esm2022/lib/models/public-api.mjs +2 -0
- package/esm2022/lib/models/row-column-size.mjs +2 -0
- package/esm2022/lib/public-api.mjs +5 -0
- package/esm2022/lib/tools/column-size.helper.mjs +12 -0
- package/esm2022/lib/tools/public-api.mjs +2 -0
- package/esm2022/lib/types/component-size.type.mjs +2 -0
- package/esm2022/lib/types/horizontal-vertical.type.mjs +2 -0
- package/esm2022/lib/types/public-api.mjs +4 -0
- package/esm2022/lib/types/validation-status.type.mjs +2 -0
- package/esm2022/lib/upd-components.module.mjs +14 -0
- package/esm2022/link/index.mjs +2 -0
- package/esm2022/link/link.component.mjs +51 -0
- package/esm2022/link/public-api.mjs +4 -0
- package/esm2022/link/target.type.mjs +2 -0
- package/esm2022/link/upd-link.module.mjs +24 -0
- package/esm2022/link/updevs-components-link.mjs +5 -0
- package/esm2022/list/assets/i18n/en.json +9 -0
- package/esm2022/list/assets/i18n/pt.json +9 -0
- package/esm2022/list/index.mjs +2 -0
- package/esm2022/list/list.component.mjs +113 -0
- package/esm2022/list/models/badge-position.type.mjs +2 -0
- package/esm2022/list/models/list-item.mjs +2 -0
- package/esm2022/list/models/list-item.model.mjs +15 -0
- package/esm2022/list/models/public-api.mjs +3 -0
- package/esm2022/list/public-api.mjs +4 -0
- package/esm2022/list/upd-list.module.mjs +44 -0
- package/esm2022/list/updevs-components-list.mjs +5 -0
- package/esm2022/modal/assets/i18n/en.json +17 -0
- package/esm2022/modal/assets/i18n/pt.json +17 -0
- package/esm2022/modal/components/modal-container/modal-container.component.mjs +216 -0
- package/esm2022/modal/index.mjs +2 -0
- package/esm2022/modal/models/base.modal.mjs +14 -0
- package/esm2022/modal/models/modal-config.model.mjs +20 -0
- package/esm2022/modal/models/modal-ref.mjs +2 -0
- package/esm2022/modal/models/modal.config.mjs +2 -0
- package/esm2022/modal/models/public-api.mjs +4 -0
- package/esm2022/modal/public-api.mjs +4 -0
- package/esm2022/modal/services/modal-alert.service.mjs +99 -0
- package/esm2022/modal/services/modal.service.mjs +30 -0
- package/esm2022/modal/services/public-api.mjs +3 -0
- package/esm2022/modal/types/modal-footer-style.type.mjs +2 -0
- package/esm2022/modal/types/modal-size.type.mjs +2 -0
- package/esm2022/modal/upd-modal.module.mjs +90 -0
- package/esm2022/modal/updevs-components-modal.mjs +5 -0
- package/esm2022/paginator/assets/i18n/en.json +15 -0
- package/esm2022/paginator/assets/i18n/pt.json +15 -0
- package/esm2022/paginator/index.mjs +2 -0
- package/esm2022/paginator/paginator.component.mjs +66 -0
- package/esm2022/paginator/public-api.mjs +3 -0
- package/esm2022/paginator/upd-paginator.module.mjs +47 -0
- package/esm2022/paginator/updevs-components-paginator.mjs +5 -0
- package/esm2022/popover/index.mjs +2 -0
- package/esm2022/popover/popover.component.mjs +65 -0
- package/esm2022/popover/popover.directive.mjs +129 -0
- package/esm2022/popover/public-api.mjs +4 -0
- package/esm2022/popover/upd-popover.module.mjs +29 -0
- package/esm2022/popover/updevs-components-popover.mjs +5 -0
- package/esm2022/public-api.mjs +2 -0
- package/esm2022/table/abstractions/base-column.model.mjs +52 -0
- package/esm2022/table/abstractions/base.column.mjs +98 -0
- package/esm2022/table/abstractions/filters-operands.service.mjs +3 -0
- package/esm2022/table/abstractions/public-api.mjs +3 -0
- package/esm2022/table/assets/i18n/en.json +74 -0
- package/esm2022/table/assets/i18n/pt.json +74 -0
- package/esm2022/table/components/columns/boolean-column/boolean-column.component.mjs +26 -0
- package/esm2022/table/components/columns/date-time-column/date-time-column.component.mjs +13 -0
- package/esm2022/table/components/columns/number-column/number-column.component.mjs +13 -0
- package/esm2022/table/components/columns/text-column/text-column.component.mjs +31 -0
- package/esm2022/table/components/columns-manager/columns-manager.component.mjs +36 -0
- package/esm2022/table/components/filter-row/filter-row.component.mjs +114 -0
- package/esm2022/table/components/save-search/save-search.component.mjs +72 -0
- package/esm2022/table/components/search-section/search-section.component.mjs +93 -0
- package/esm2022/table/directives/public-api.mjs +2 -0
- package/esm2022/table/directives/table-column.directive.mjs +51 -0
- package/esm2022/table/index.mjs +2 -0
- package/esm2022/table/models/columns/boolean-column.model.mjs +22 -0
- package/esm2022/table/models/columns/date-time-column.model.mjs +16 -0
- package/esm2022/table/models/columns/guid-column.model.mjs +13 -0
- package/esm2022/table/models/columns/image-column.model.mjs +11 -0
- package/esm2022/table/models/columns/number-column.model.mjs +17 -0
- package/esm2022/table/models/columns/public-api.mjs +7 -0
- package/esm2022/table/models/columns/text-column.model.mjs +11 -0
- package/esm2022/table/models/enums/column-type.enum.mjs +15 -0
- package/esm2022/table/models/enums/public-api.mjs +2 -0
- package/esm2022/table/models/filter-item.model.mjs +2 -0
- package/esm2022/table/models/filter-operand.config.mjs +2 -0
- package/esm2022/table/models/operands-lists/boolean-filter-operands-list.model.mjs +25 -0
- package/esm2022/table/models/operands-lists/date-filter-operands-list.model.mjs +25 -0
- package/esm2022/table/models/operands-lists/date-or-number-operands-list.config.mjs +31 -0
- package/esm2022/table/models/operands-lists/filter-operands-list.config.mjs +31 -0
- package/esm2022/table/models/operands-lists/guid-filter-operands-list.model.mjs +16 -0
- package/esm2022/table/models/operands-lists/number-filter-operands-list.model.mjs +25 -0
- package/esm2022/table/models/operands-lists/string-filter-operands-list.model.mjs +45 -0
- package/esm2022/table/models/public-api.mjs +5 -0
- package/esm2022/table/models/saved-view.model.mjs +2 -0
- package/esm2022/table/models/table-config.model.mjs +21 -0
- package/esm2022/table/models/table.config.mjs +2 -0
- package/esm2022/table/models/upd-table-config.model.mjs +9 -0
- package/esm2022/table/models/upd-table.config.mjs +2 -0
- package/esm2022/table/public-api.mjs +6 -0
- package/esm2022/table/services/default-filters-operands.service.mjs +60 -0
- package/esm2022/table/services/storages/saved-views.storage.mjs +56 -0
- package/esm2022/table/services/stores/filters-operands.store.mjs +19 -0
- package/esm2022/table/services/upd-table-config.service.mjs +18 -0
- package/esm2022/table/table.component.mjs +382 -0
- package/esm2022/table/tools/filters.tools.mjs +48 -0
- package/esm2022/table/tools/table.constants.mjs +15 -0
- package/esm2022/table/upd-table.module.mjs +150 -0
- package/esm2022/table/updevs-components-table.mjs +5 -0
- package/esm2022/updevs-components.mjs +5 -0
- package/fesm2022/updevs-components-badge.mjs +91 -0
- package/fesm2022/updevs-components-badge.mjs.map +1 -0
- package/fesm2022/updevs-components-button.mjs +193 -0
- package/fesm2022/updevs-components-button.mjs.map +1 -0
- package/fesm2022/updevs-components-calendar.mjs +1712 -0
- package/fesm2022/updevs-components-calendar.mjs.map +1 -0
- package/fesm2022/updevs-components-card.mjs +238 -0
- package/fesm2022/updevs-components-card.mjs.map +1 -0
- package/fesm2022/updevs-components-drag-and-drop.mjs +185 -0
- package/fesm2022/updevs-components-drag-and-drop.mjs.map +1 -0
- package/fesm2022/updevs-components-dropdown.mjs +226 -0
- package/fesm2022/updevs-components-dropdown.mjs.map +1 -0
- package/fesm2022/updevs-components-form-controls-abstractions.mjs +53 -0
- package/fesm2022/updevs-components-form-controls-abstractions.mjs.map +1 -0
- package/fesm2022/updevs-components-form-controls-checkbox.mjs +87 -0
- package/fesm2022/updevs-components-form-controls-checkbox.mjs.map +1 -0
- package/fesm2022/updevs-components-form-controls-date-picker.mjs +190 -0
- package/fesm2022/updevs-components-form-controls-date-picker.mjs.map +1 -0
- package/fesm2022/updevs-components-form-controls-file-upload.mjs +264 -0
- package/fesm2022/updevs-components-form-controls-file-upload.mjs.map +1 -0
- package/fesm2022/updevs-components-form-controls-input.mjs +259 -0
- package/fesm2022/updevs-components-form-controls-input.mjs.map +1 -0
- package/fesm2022/updevs-components-form-controls-radio.mjs +87 -0
- package/fesm2022/updevs-components-form-controls-radio.mjs.map +1 -0
- package/fesm2022/updevs-components-form-controls-select.mjs +417 -0
- package/fesm2022/updevs-components-form-controls-select.mjs.map +1 -0
- package/fesm2022/updevs-components-form-controls-textarea.mjs +72 -0
- package/fesm2022/updevs-components-form-controls-textarea.mjs.map +1 -0
- package/fesm2022/updevs-components-form-controls-time-picker.mjs +345 -0
- package/fesm2022/updevs-components-form-controls-time-picker.mjs.map +1 -0
- package/fesm2022/updevs-components-form.mjs +436 -0
- package/fesm2022/updevs-components-form.mjs.map +1 -0
- package/fesm2022/updevs-components-layout.mjs +940 -0
- package/fesm2022/updevs-components-layout.mjs.map +1 -0
- package/fesm2022/updevs-components-link.mjs +79 -0
- package/fesm2022/updevs-components-link.mjs.map +1 -0
- package/fesm2022/updevs-components-list.mjs +206 -0
- package/fesm2022/updevs-components-list.mjs.map +1 -0
- package/fesm2022/updevs-components-modal.mjs +504 -0
- package/fesm2022/updevs-components-modal.mjs.map +1 -0
- package/fesm2022/updevs-components-paginator.mjs +160 -0
- package/fesm2022/updevs-components-paginator.mjs.map +1 -0
- package/fesm2022/updevs-components-popover.mjs +223 -0
- package/fesm2022/updevs-components-popover.mjs.map +1 -0
- package/fesm2022/updevs-components-table.mjs +1709 -0
- package/fesm2022/updevs-components-table.mjs.map +1 -0
- package/fesm2022/updevs-components.mjs +33 -0
- package/fesm2022/updevs-components.mjs.map +1 -0
- package/form/components/dynamic-field/dynamic-field.component.d.ts +55 -0
- package/form/form.component.d.ts +60 -0
- package/form/models/checkbox-field.model.d.ts +4 -0
- package/form/models/checkbox-group-field.model.d.ts +6 -0
- package/form/models/dynamic-field.model.d.ts +28 -0
- package/form/models/enums/dynamic-field.type.d.ts +12 -0
- package/form/models/enums/public-api.d.ts +1 -0
- package/form/models/file-upload-field.model.d.ts +16 -0
- package/form/models/form-config.d.ts +2 -0
- package/form/models/form-row.model.d.ts +10 -0
- package/form/models/input-field.model.d.ts +9 -0
- package/form/models/public-api.d.ts +14 -0
- package/form/models/radio-field.model.d.ts +4 -0
- package/form/models/radio-group-field.model.d.ts +6 -0
- package/form/models/select-field.model.d.ts +28 -0
- package/form/models/single-select-field.model.d.ts +4 -0
- package/form/models/textarea-field.model.d.ts +10 -0
- package/form/models/validator-config.d.ts +5 -0
- package/form/public-api.d.ts +3 -0
- package/form/tools/errors-helper.d.ts +11 -0
- package/form/upd-form.module.d.ts +22 -0
- package/form-controls/abstractions/base-control.d.ts +29 -0
- package/form-controls/abstractions/index.d.ts +2 -0
- package/form-controls/abstractions/public-api.d.ts +2 -0
- package/form-controls/checkbox/checkbox.component.d.ts +19 -0
- package/form-controls/checkbox/{src/public-api.ts → public-api.d.ts} +0 -1
- package/form-controls/checkbox/upd-checkbox.module.d.ts +10 -0
- package/form-controls/date-picker/date-picker.component.d.ts +87 -0
- package/form-controls/date-picker/public-api.d.ts +2 -0
- package/form-controls/date-picker/upd-date-picker.module.d.ts +12 -0
- package/form-controls/file-upload/file-upload-changed.event.d.ts +4 -0
- package/form-controls/file-upload/file-upload.component.d.ts +46 -0
- package/form-controls/file-upload/public-api.d.ts +3 -0
- package/form-controls/file-upload/upd-file-upload.module.d.ts +14 -0
- package/form-controls/input/directives/input-append.directive.d.ts +7 -0
- package/form-controls/input/directives/input-prepend.directive.d.ts +7 -0
- package/form-controls/input/input.component.d.ts +64 -0
- package/form-controls/input/upd-input.module.d.ts +13 -0
- package/form-controls/radio/radio.component.d.ts +17 -0
- package/form-controls/radio/upd-radio.module.d.ts +10 -0
- package/form-controls/select/components/multiple/select-multiple.component.d.ts +25 -0
- package/form-controls/select/components/single/select.component.d.ts +26 -0
- package/form-controls/select/models/abstractions/base-select.component.d.ts +77 -0
- package/form-controls/select/models/defaults.d.ts +8 -0
- package/form-controls/select/{src/models/public-api.ts → models/public-api.d.ts} +1 -0
- package/form-controls/select/{src/models/select-item.ts → models/select-item.d.ts} +0 -1
- package/form-controls/select/upd-select.module.d.ts +16 -0
- package/form-controls/textarea/textarea.component.d.ts +19 -0
- package/form-controls/textarea/upd-textarea.module.d.ts +8 -0
- package/form-controls/time-picker/time-picker.component.d.ts +78 -0
- package/form-controls/time-picker/time-selector/time-selector.component.d.ts +69 -0
- package/form-controls/time-picker/upd-time-picker.module.d.ts +17 -0
- package/index.d.ts +2 -0
- package/layout/abstractions/base-page.component.d.ts +12 -0
- package/layout/abstractions/base.layout.d.ts +15 -0
- package/layout/index.d.ts +1 -0
- package/layout/layouts/blank-layout/blank-layout.component.d.ts +9 -0
- package/layout/layouts/blank-layout/blank-layout.module.d.ts +15 -0
- package/layout/layouts/vertical-sidebar-layout/vertical-sidebar-layout.component.d.ts +6 -0
- package/layout/layouts/vertical-sidebar-layout/vertical-sidebar-layout.module.d.ts +22 -0
- package/layout/models/login-page-config.model.d.ts +46 -0
- package/layout/models/login-page.config.d.ts +44 -0
- package/layout/{src/models/public-api.ts → models/public-api.d.ts} +1 -0
- package/layout/models/security-layout-config.model.d.ts +12 -0
- package/layout/models/security-layout.config.d.ts +10 -0
- package/layout/models/upd-layout-config.model.d.ts +48 -0
- package/layout/{src/models/upd-layout.config.ts → models/upd-layout.config.d.ts} +9 -0
- package/layout/pages/auth-flow/auth-flow-routing.module.d.ts +12 -0
- package/layout/pages/auth-flow/auth-flow.module.d.ts +20 -0
- package/layout/pages/auth-flow/logged-out/logged-out.component.d.ts +5 -0
- package/layout/pages/auth-flow/login/login.component.d.ts +26 -0
- package/layout/pages/auth-flow/oauth-callback/oauth-callback.component.d.ts +5 -0
- package/layout/partials/footer/footer-copyright.directive.d.ts +5 -0
- package/layout/partials/footer/footer.component.d.ts +34 -0
- package/layout/partials/footer/footer.module.d.ts +9 -0
- package/layout/{src/partials/footer/public-api.ts → partials/footer/public-api.d.ts} +1 -0
- package/layout/partials/header/header.component.d.ts +48 -0
- package/layout/partials/header/header.module.d.ts +12 -0
- package/layout/{src/partials/header/public-api.ts → partials/header/public-api.d.ts} +1 -0
- package/layout/partials/page-header/page-header.component.d.ts +7 -0
- package/layout/partials/sidebar/sidebar.component.d.ts +24 -0
- package/layout/services/upd-layout-config.service.d.ts +15 -0
- package/layout/{src/tools/layout.constants.ts → tools/layout.constants.d.ts} +3 -6
- package/layout/upd-layout.module.d.ts +19 -0
- package/lib/index.d.ts +2 -0
- package/lib/models/public-api.d.ts +2 -0
- package/lib/models/row-column-size.d.ts +6 -0
- package/lib/public-api.d.ts +5 -0
- package/lib/tools/column-size.helper.d.ts +6 -0
- package/lib/tools/public-api.d.ts +2 -0
- package/{src/lib/types/component-size.type.ts → lib/types/component-size.type.d.ts} +1 -0
- package/lib/types/horizontal-vertical.type.d.ts +2 -0
- package/lib/types/public-api.d.ts +4 -0
- package/lib/types/validation-status.type.d.ts +2 -0
- package/lib/upd-components.module.d.ts +7 -0
- package/link/index.d.ts +1 -0
- package/link/link.component.d.ts +22 -0
- package/link/upd-link.module.d.ts +8 -0
- package/list/index.d.ts +1 -0
- package/list/list.component.d.ts +46 -0
- package/list/{src/models/list-item.ts → models/list-item.d.ts} +3 -4
- package/list/models/list-item.model.d.ts +25 -0
- package/list/upd-list.module.d.ts +13 -0
- package/modal/components/modal-container/modal-container.component.d.ts +74 -0
- package/modal/index.d.ts +1 -0
- package/modal/models/base.modal.d.ts +8 -0
- package/modal/models/modal-config.model.d.ts +32 -0
- package/modal/models/modal-ref.d.ts +6 -0
- package/modal/models/modal.config.d.ts +30 -0
- package/modal/models/public-api.d.ts +3 -0
- package/modal/public-api.d.ts +3 -0
- package/modal/services/modal-alert.service.d.ts +22 -0
- package/modal/services/modal.service.d.ts +12 -0
- package/modal/services/public-api.d.ts +2 -0
- package/modal/types/modal-footer-style.type.d.ts +1 -0
- package/modal/types/modal-size.type.d.ts +1 -0
- package/modal/upd-modal.module.d.ts +18 -0
- package/package.json +169 -21
- package/paginator/index.d.ts +1 -0
- package/paginator/paginator.component.d.ts +42 -0
- package/paginator/public-api.d.ts +2 -0
- package/paginator/upd-paginator.module.d.ts +14 -0
- package/popover/index.d.ts +1 -0
- package/popover/popover.component.d.ts +22 -0
- package/popover/popover.directive.d.ts +33 -0
- package/popover/upd-popover.module.d.ts +9 -0
- package/public-api.d.ts +2 -0
- package/table/abstractions/base-column.model.d.ts +31 -0
- package/table/abstractions/base.column.d.ts +22 -0
- package/table/abstractions/filters-operands.service.d.ts +8 -0
- package/table/abstractions/public-api.d.ts +2 -0
- package/table/components/columns/boolean-column/boolean-column.component.d.ts +9 -0
- package/table/components/columns/date-time-column/date-time-column.component.d.ts +7 -0
- package/table/components/columns/number-column/number-column.component.d.ts +7 -0
- package/table/components/columns/text-column/text-column.component.d.ts +9 -0
- package/table/components/columns-manager/columns-manager.component.d.ts +15 -0
- package/table/components/filter-row/filter-row.component.d.ts +40 -0
- package/table/components/save-search/save-search.component.d.ts +17 -0
- package/table/components/search-section/search-section.component.d.ts +36 -0
- package/table/directives/public-api.d.ts +1 -0
- package/table/directives/table-column.directive.d.ts +14 -0
- package/table/index.d.ts +1 -0
- package/table/models/columns/boolean-column.model.d.ts +15 -0
- package/table/models/columns/date-time-column.model.d.ts +8 -0
- package/table/models/columns/guid-column.model.d.ts +4 -0
- package/table/models/columns/image-column.model.d.ts +6 -0
- package/table/models/columns/number-column.model.d.ts +8 -0
- package/table/models/columns/public-api.d.ts +6 -0
- package/table/models/columns/text-column.model.d.ts +6 -0
- package/table/models/enums/column-type.enum.d.ts +13 -0
- package/table/models/enums/public-api.d.ts +1 -0
- package/table/models/filter-item.model.d.ts +6 -0
- package/table/models/filter-operand.config.d.ts +9 -0
- package/table/models/operands-lists/boolean-filter-operands-list.model.d.ts +6 -0
- package/table/models/operands-lists/date-filter-operands-list.model.d.ts +6 -0
- package/table/models/operands-lists/date-or-number-operands-list.config.d.ts +5 -0
- package/table/models/operands-lists/filter-operands-list.config.d.ts +5 -0
- package/table/models/operands-lists/guid-filter-operands-list.model.d.ts +6 -0
- package/table/models/operands-lists/number-filter-operands-list.model.d.ts +6 -0
- package/table/models/operands-lists/string-filter-operands-list.model.d.ts +6 -0
- package/table/models/public-api.d.ts +4 -0
- package/table/models/saved-view.model.d.ts +11 -0
- package/table/models/table-config.model.d.ts +24 -0
- package/table/models/table.config.d.ts +22 -0
- package/table/models/upd-table-config.model.d.ts +6 -0
- package/table/models/upd-table.config.d.ts +6 -0
- package/table/public-api.d.ts +5 -0
- package/table/services/default-filters-operands.service.d.ts +17 -0
- package/table/services/storages/saved-views.storage.d.ts +19 -0
- package/table/services/stores/filters-operands.store.d.ts +11 -0
- package/table/services/upd-table-config.service.d.ts +12 -0
- package/table/table.component.d.ts +78 -0
- package/table/tools/filters.tools.d.ts +9 -0
- package/table/tools/table.constants.d.ts +15 -0
- package/table/upd-table.module.d.ts +40 -0
- package/CHANGELOG.md +0 -8
- package/button/ng-package.json +0 -7
- package/button/src/button.component.html +0 -8
- package/button/src/button.component.scss +0 -5
- package/button/src/button.component.spec.ts +0 -23
- package/button/src/button.component.ts +0 -154
- package/button/src/upd-button.module.ts +0 -17
- package/card/ng-package.json +0 -7
- package/card/src/card.component.html +0 -105
- package/card/src/card.component.scss +0 -47
- package/card/src/card.component.spec.ts +0 -23
- package/card/src/card.component.ts +0 -112
- package/card/src/directives/card-actions.directive.spec.ts +0 -8
- package/card/src/directives/card-actions.directive.ts +0 -11
- package/card/src/directives/card-footer.directive.spec.ts +0 -8
- package/card/src/directives/card-footer.directive.ts +0 -11
- package/card/src/directives/card-header.directive.spec.ts +0 -8
- package/card/src/directives/card-header.directive.ts +0 -11
- package/card/src/directives/card-image.directive.spec.ts +0 -8
- package/card/src/directives/card-image.directive.ts +0 -11
- package/card/src/types/public-api.ts +0 -5
- package/card/src/upd-card.module.ts +0 -32
- package/dropdown/ng-package.json +0 -7
- package/dropdown/src/dropdown.component.html +0 -32
- package/dropdown/src/dropdown.component.scss +0 -19
- package/dropdown/src/dropdown.component.spec.ts +0 -23
- package/dropdown/src/dropdown.component.ts +0 -182
- package/dropdown/src/models/public-api.ts +0 -2
- package/dropdown/src/upd-dropdown.module.ts +0 -25
- package/form/ng-package.json +0 -7
- package/form/src/form.module.ts +0 -10
- package/form/src/public-api.ts +0 -1
- package/form-controls/checkbox/ng-package.json +0 -7
- package/form-controls/checkbox/src/checkbox.component.html +0 -7
- package/form-controls/checkbox/src/checkbox.component.scss +0 -0
- package/form-controls/checkbox/src/checkbox.component.spec.ts +0 -23
- package/form-controls/checkbox/src/checkbox.component.ts +0 -48
- package/form-controls/checkbox/src/upd-checkbox.module.ts +0 -19
- package/form-controls/input/ng-package.json +0 -7
- package/form-controls/input/src/directives/input-append.directive.spec.ts +0 -8
- package/form-controls/input/src/directives/input-append.directive.ts +0 -11
- package/form-controls/input/src/directives/input-prepend.directive.spec.ts +0 -8
- package/form-controls/input/src/directives/input-prepend.directive.ts +0 -11
- package/form-controls/input/src/input.component.html +0 -82
- package/form-controls/input/src/input.component.scss +0 -13
- package/form-controls/input/src/input.component.spec.ts +0 -23
- package/form-controls/input/src/input.component.ts +0 -124
- package/form-controls/input/src/upd-input.module.ts +0 -29
- package/form-controls/radio/ng-package.json +0 -7
- package/form-controls/radio/src/radio.component.html +0 -7
- package/form-controls/radio/src/radio.component.scss +0 -0
- package/form-controls/radio/src/radio.component.spec.ts +0 -23
- package/form-controls/radio/src/radio.component.ts +0 -47
- package/form-controls/radio/src/upd-radio.module.ts +0 -17
- package/form-controls/select/ng-package.json +0 -7
- package/form-controls/select/src/components/multiple/select-multiple.component.html +0 -41
- package/form-controls/select/src/components/multiple/select-multiple.component.scss +0 -6
- package/form-controls/select/src/components/multiple/select-multiple.component.spec.ts +0 -21
- package/form-controls/select/src/components/multiple/select-multiple.component.ts +0 -69
- package/form-controls/select/src/components/shared.scss +0 -40
- package/form-controls/select/src/components/single/select.component.html +0 -53
- package/form-controls/select/src/components/single/select.component.scss +0 -3
- package/form-controls/select/src/components/single/select.component.spec.ts +0 -23
- package/form-controls/select/src/components/single/select.component.ts +0 -58
- package/form-controls/select/src/models/abstractions/base-select.component.ts +0 -259
- package/form-controls/select/src/upd-select.module.ts +0 -32
- package/form-controls/textarea/ng-package.json +0 -7
- package/form-controls/textarea/src/textarea.component.html +0 -8
- package/form-controls/textarea/src/textarea.component.scss +0 -0
- package/form-controls/textarea/src/textarea.component.spec.ts +0 -23
- package/form-controls/textarea/src/textarea.component.ts +0 -47
- package/form-controls/textarea/src/upd-textarea.module.ts +0 -17
- package/form-controls/time-picker/ng-package.json +0 -7
- package/form-controls/time-picker/src/time-picker.component.html +0 -17
- package/form-controls/time-picker/src/time-picker.component.scss +0 -10
- package/form-controls/time-picker/src/time-picker.component.spec.ts +0 -21
- package/form-controls/time-picker/src/time-picker.component.ts +0 -110
- package/form-controls/time-picker/src/time-selector/time-selector.component.html +0 -44
- package/form-controls/time-picker/src/time-selector/time-selector.component.scss +0 -47
- package/form-controls/time-picker/src/time-selector/time-selector.component.spec.ts +0 -21
- package/form-controls/time-picker/src/time-selector/time-selector.component.ts +0 -107
- package/form-controls/time-picker/src/upd-time-picker.module.ts +0 -39
- package/layout/ng-package.json +0 -7
- package/layout/src/abstractions/base-page.component.ts +0 -21
- package/layout/src/assets/i18n/en.json +0 -5
- package/layout/src/assets/i18n/pt.json +0 -5
- package/layout/src/layouts/blank-layout/blank-layout.component.html +0 -1
- package/layout/src/layouts/blank-layout/blank-layout.component.scss +0 -0
- package/layout/src/layouts/blank-layout/blank-layout.component.spec.ts +0 -23
- package/layout/src/layouts/blank-layout/blank-layout.component.ts +0 -10
- package/layout/src/layouts/blank-layout/blank-layout.module.ts +0 -17
- package/layout/src/layouts/vertical-sidebar-layout/vertical-sidebar-layout.component.html +0 -14
- package/layout/src/layouts/vertical-sidebar-layout/vertical-sidebar-layout.component.scss +0 -0
- package/layout/src/layouts/vertical-sidebar-layout/vertical-sidebar-layout.component.spec.ts +0 -23
- package/layout/src/layouts/vertical-sidebar-layout/vertical-sidebar-layout.component.ts +0 -31
- package/layout/src/layouts/vertical-sidebar-layout/vertical-sidebar-layout.module.ts +0 -52
- package/layout/src/models/upd-layout-config.model.ts +0 -71
- package/layout/src/pages/auth-flow/auth-flow-routing.module.ts +0 -21
- package/layout/src/pages/auth-flow/auth-flow.module.ts +0 -29
- package/layout/src/pages/auth-flow/logged-out/logged-out.component.html +0 -1
- package/layout/src/pages/auth-flow/logged-out/logged-out.component.scss +0 -0
- package/layout/src/pages/auth-flow/logged-out/logged-out.component.spec.ts +0 -23
- package/layout/src/pages/auth-flow/logged-out/logged-out.component.ts +0 -10
- package/layout/src/pages/auth-flow/login/login.component.html +0 -96
- package/layout/src/pages/auth-flow/login/login.component.scss +0 -0
- package/layout/src/pages/auth-flow/login/login.component.spec.ts +0 -23
- package/layout/src/pages/auth-flow/login/login.component.ts +0 -26
- package/layout/src/pages/auth-flow/oauth-callback/oauth-callback.component.html +0 -1
- package/layout/src/pages/auth-flow/oauth-callback/oauth-callback.component.scss +0 -0
- package/layout/src/pages/auth-flow/oauth-callback/oauth-callback.component.spec.ts +0 -23
- package/layout/src/pages/auth-flow/oauth-callback/oauth-callback.component.ts +0 -10
- package/layout/src/partials/footer/footer-copyright.directive.spec.ts +0 -8
- package/layout/src/partials/footer/footer-copyright.directive.ts +0 -9
- package/layout/src/partials/footer/footer.component.html +0 -30
- package/layout/src/partials/footer/footer.component.scss +0 -0
- package/layout/src/partials/footer/footer.component.spec.ts +0 -23
- package/layout/src/partials/footer/footer.component.ts +0 -73
- package/layout/src/partials/header/header.component.html +0 -163
- package/layout/src/partials/header/header.component.scss +0 -0
- package/layout/src/partials/header/header.component.spec.ts +0 -23
- package/layout/src/partials/header/header.component.ts +0 -86
- package/layout/src/partials/page-header/page-header.component.html +0 -19
- package/layout/src/partials/page-header/page-header.component.scss +0 -0
- package/layout/src/partials/page-header/page-header.component.spec.ts +0 -23
- package/layout/src/partials/page-header/page-header.component.ts +0 -11
- package/layout/src/partials/sidebar/sidebar.component.html +0 -62
- package/layout/src/partials/sidebar/sidebar.component.scss +0 -0
- package/layout/src/partials/sidebar/sidebar.component.spec.ts +0 -23
- package/layout/src/partials/sidebar/sidebar.component.ts +0 -161
- package/layout/src/services/upd-layout-config.service.spec.ts +0 -16
- package/layout/src/services/upd-layout-config.service.ts +0 -20
- package/layout/src/upd-layout.module.ts +0 -34
- package/link/ng-package.json +0 -7
- package/link/src/link.component.html +0 -3
- package/link/src/link.component.scss +0 -3
- package/link/src/link.component.spec.ts +0 -23
- package/link/src/link.component.ts +0 -48
- package/link/src/upd-link.module.ts +0 -17
- package/list/ng-package.json +0 -7
- package/list/src/assets/i18n/en.json +0 -5
- package/list/src/assets/i18n/pt.json +0 -5
- package/list/src/list.component.html +0 -58
- package/list/src/list.component.scss +0 -21
- package/list/src/list.component.spec.ts +0 -23
- package/list/src/list.component.ts +0 -147
- package/list/src/models/list-item.model.ts +0 -35
- package/list/src/upd-list.module.ts +0 -30
- package/ng-package.json +0 -10
- package/popover/ng-package.json +0 -7
- package/popover/src/popover.component.html +0 -20
- package/popover/src/popover.component.scss +0 -8
- package/popover/src/popover.component.spec.ts +0 -23
- package/popover/src/popover.component.ts +0 -53
- package/popover/src/popover.directive.spec.ts +0 -8
- package/popover/src/popover.directive.ts +0 -128
- package/popover/src/upd-popover.module.ts +0 -20
- package/src/lib/public-api.ts +0 -2
- package/src/lib/types/public-api.ts +0 -2
- package/src/lib/types/validation-status.type.ts +0 -1
- package/src/lib/upd-components.module.ts +0 -6
- package/src/public-api.ts +0 -1
- package/tsconfig.lib.json +0 -14
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -14
- /package/{button/src/index.ts → badge/index.d.ts} +0 -0
- /package/{card/src/index.ts → button/index.d.ts} +0 -0
- /package/button/{src/public-api.ts → public-api.d.ts} +0 -0
- /package/{dropdown/src/index.ts → calendar/index.d.ts} +0 -0
- /package/card/{src/directives/public-api.ts → directives/public-api.d.ts} +0 -0
- /package/{form-controls/checkbox/src/index.ts → card/index.d.ts} +0 -0
- /package/card/{src/public-api.ts → public-api.d.ts} +0 -0
- /package/card/{src/types/card-state.type.ts → types/card-state.type.d.ts} +0 -0
- /package/card/{src/types/card-style.type.ts → types/card-style.type.d.ts} +0 -0
- /package/card/{src/types/hover-effect.type.ts → types/hover-effect.type.d.ts} +0 -0
- /package/card/{src/types/ribbon-style.type.ts → types/ribbon-style.type.d.ts} +0 -0
- /package/card/{src/types/status-position.type.ts → types/status-position.type.d.ts} +0 -0
- /package/{form-controls/input/src/index.ts → drag-and-drop/index.d.ts} +0 -0
- /package/{form-controls/radio/src/index.ts → dropdown/index.d.ts} +0 -0
- /package/dropdown/{src/public-api.ts → public-api.d.ts} +0 -0
- /package/{form-controls/time-picker/src → esm2022/form-controls/time-picker}/assets/i18n/en.json +0 -0
- /package/{form-controls/time-picker/src → esm2022/form-controls/time-picker}/assets/i18n/pt.json +0 -0
- /package/{src/lib/index.ts → form/index.d.ts} +0 -0
- /package/form-controls/{select/src/index.ts → checkbox/index.d.ts} +0 -0
- /package/form-controls/{textarea/src/index.ts → date-picker/index.d.ts} +0 -0
- /package/form-controls/{time-picker/src/index.ts → file-upload/index.d.ts} +0 -0
- /package/form-controls/input/{src/directives/public-api.ts → directives/public-api.d.ts} +0 -0
- /package/{form/src/index.ts → form-controls/input/index.d.ts} +0 -0
- /package/form-controls/input/{src/public-api.ts → public-api.d.ts} +0 -0
- /package/form-controls/input/{src/types/input.type.ts → types/input.type.d.ts} +0 -0
- /package/form-controls/input/{src/types/loader-position.type.ts → types/loader-position.type.d.ts} +0 -0
- /package/form-controls/input/{src/types/public-api.ts → types/public-api.d.ts} +0 -0
- /package/{layout/src/index.ts → form-controls/radio/index.d.ts} +0 -0
- /package/form-controls/radio/{src/public-api.ts → public-api.d.ts} +0 -0
- /package/{link/src/index.ts → form-controls/select/index.d.ts} +0 -0
- /package/form-controls/select/{src/public-api.ts → public-api.d.ts} +0 -0
- /package/{list/src/index.ts → form-controls/textarea/index.d.ts} +0 -0
- /package/form-controls/textarea/{src/public-api.ts → public-api.d.ts} +0 -0
- /package/{popover/src/index.ts → form-controls/time-picker/index.d.ts} +0 -0
- /package/form-controls/time-picker/{src/public-api.ts → public-api.d.ts} +0 -0
- /package/layout/{src/abstractions/public-api.ts → abstractions/public-api.d.ts} +0 -0
- /package/layout/{src/layouts/public-api.ts → layouts/public-api.d.ts} +0 -0
- /package/layout/{src/pages/auth-flow/public-api.ts → pages/auth-flow/public-api.d.ts} +0 -0
- /package/layout/{src/pages/public-api.ts → pages/public-api.d.ts} +0 -0
- /package/layout/{src/partials/header/header-style.type.ts → partials/header/header-style.type.d.ts} +0 -0
- /package/layout/{src/partials/page-header/public-api.ts → partials/page-header/public-api.d.ts} +0 -0
- /package/layout/{src/partials/public-api.ts → partials/public-api.d.ts} +0 -0
- /package/layout/{src/partials/sidebar/public-api.ts → partials/sidebar/public-api.d.ts} +0 -0
- /package/layout/{src/public-api.ts → public-api.d.ts} +0 -0
- /package/layout/{src/services/public-api.ts → services/public-api.d.ts} +0 -0
- /package/link/{src/public-api.ts → public-api.d.ts} +0 -0
- /package/link/{src/target.type.ts → target.type.d.ts} +0 -0
- /package/list/{src/models/badge-position.type.ts → models/badge-position.type.d.ts} +0 -0
- /package/list/{src/models/public-api.ts → models/public-api.d.ts} +0 -0
- /package/list/{src/public-api.ts → public-api.d.ts} +0 -0
- /package/popover/{src/public-api.ts → public-api.d.ts} +0 -0
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
import { Component, EventEmitter, Injector, Input, Output, inject, ElementRef, NgZone, afterNextRender } from '@angular/core';
|
|
2
|
+
import { DateService } from '@updevs/sdk/core';
|
|
3
|
+
import { activeCapturingEventOptions, passiveCapturingEventOptions, passiveEventOptions } from '../../tools/events-options';
|
|
4
|
+
import { CalendarSignalsService } from '../../services/calendar-signals.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
let calendarBodyId = 1;
|
|
8
|
+
export class CalendarBodyComponent {
|
|
9
|
+
get startDateLabelId() {
|
|
10
|
+
return `${this.id}-start-date`;
|
|
11
|
+
}
|
|
12
|
+
get endDateLabelId() {
|
|
13
|
+
return `${this.id}-end-date`;
|
|
14
|
+
}
|
|
15
|
+
get colspanClass() {
|
|
16
|
+
return `col-${this.firstRowOffset}`;
|
|
17
|
+
}
|
|
18
|
+
constructor() {
|
|
19
|
+
/**
|
|
20
|
+
* The number of columns in the table.
|
|
21
|
+
*/
|
|
22
|
+
this.numCols = 7;
|
|
23
|
+
/**
|
|
24
|
+
* The cell number of the active cell in the table.
|
|
25
|
+
*/
|
|
26
|
+
this.activeCell = 0;
|
|
27
|
+
/**
|
|
28
|
+
* Whether a range is being selected.
|
|
29
|
+
*/
|
|
30
|
+
this.isRange = false;
|
|
31
|
+
/**
|
|
32
|
+
* The aspect ratio (width / height) to use for the cells in the table. This aspect ratio will be
|
|
33
|
+
* maintained even as the table resizes.
|
|
34
|
+
*/
|
|
35
|
+
this.cellAspectRatio = 1;
|
|
36
|
+
/**
|
|
37
|
+
* Emits when a new value is selected.
|
|
38
|
+
*/
|
|
39
|
+
this.selectedValueChange = new EventEmitter();
|
|
40
|
+
/**
|
|
41
|
+
* Emits when the preview has changed as a result of a user action.
|
|
42
|
+
*/
|
|
43
|
+
this.previewChange = new EventEmitter();
|
|
44
|
+
/**
|
|
45
|
+
* Emits the date at the possible start of a drag event.
|
|
46
|
+
*/
|
|
47
|
+
this.dragStarted = new EventEmitter();
|
|
48
|
+
/**
|
|
49
|
+
* Emits the date at the conclusion of a drag, or null if mouse was not released on a date.
|
|
50
|
+
*/
|
|
51
|
+
this.dragEnded = new EventEmitter();
|
|
52
|
+
this.didDragSinceMouseDown = false;
|
|
53
|
+
this.id = `upd-calendar-body-${calendarBodyId++}`;
|
|
54
|
+
/**
|
|
55
|
+
* Used to focus the active cell after change detection has run.
|
|
56
|
+
*/
|
|
57
|
+
this.focusActiveCellAfterViewChecked = false;
|
|
58
|
+
this.injector = inject(Injector);
|
|
59
|
+
this.elementRef = inject((ElementRef));
|
|
60
|
+
this.ngZone = inject(NgZone);
|
|
61
|
+
this.calendarSignalsService = inject(CalendarSignalsService);
|
|
62
|
+
this.dateService = inject(DateService);
|
|
63
|
+
/**
|
|
64
|
+
* Tracking function for rows based on their identity. Ideally we would use some sort of
|
|
65
|
+
* key on the row, but that would require a breaking change for the `rows` input. We don't
|
|
66
|
+
* use the built-in identity tracking, because it logs warnings.
|
|
67
|
+
*/
|
|
68
|
+
this.trackRow = (row) => row;
|
|
69
|
+
/**
|
|
70
|
+
* Event handler for when the user enters an element
|
|
71
|
+
* inside the calendar body (e.g. by hovering in or focus).
|
|
72
|
+
*/
|
|
73
|
+
this.enterHandler = (event) => {
|
|
74
|
+
if (this.skipNextFocus && event.type === 'focus') {
|
|
75
|
+
this.skipNextFocus = false;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// We only need to hit the zone when we're selecting a range.
|
|
79
|
+
if (!!event.target && this.isRange) {
|
|
80
|
+
const cell = this.getCellFromElement(event.target);
|
|
81
|
+
if (cell) {
|
|
82
|
+
this.ngZone.run(() => this.previewChange.emit({ value: cell.isEnabled ? cell : undefined, event }));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
this.touchmoveHandler = (event) => {
|
|
87
|
+
if (!this.isRange) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const target = this.getActualTouchTarget(event);
|
|
91
|
+
const cell = target ? this.getCellFromElement(target) : undefined;
|
|
92
|
+
if (target !== event.target) {
|
|
93
|
+
this.didDragSinceMouseDown = true;
|
|
94
|
+
}
|
|
95
|
+
// If the initial target of the touch is a date cell, prevent default so
|
|
96
|
+
// that the move is not handled as a scroll.
|
|
97
|
+
if (this.getCellElement(event.target)) {
|
|
98
|
+
event.preventDefault();
|
|
99
|
+
}
|
|
100
|
+
this.ngZone.run(() => this.previewChange.emit({ value: cell?.isEnabled ? cell : undefined, event }));
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Event handler for when the user's pointer leaves an element
|
|
104
|
+
* inside the calendar body (e.g. by hovering out or blurring).
|
|
105
|
+
*/
|
|
106
|
+
this.leaveHandler = (event) => {
|
|
107
|
+
// We only need to hit the zone when we're selecting a range.
|
|
108
|
+
if (this.previewEnd !== undefined && this.isRange) {
|
|
109
|
+
if (event.type !== 'blur') {
|
|
110
|
+
this.didDragSinceMouseDown = true;
|
|
111
|
+
}
|
|
112
|
+
// Only reset the preview end value when leaving cells. This looks better, because
|
|
113
|
+
// we have a gap between the cells and the rows and we don't want to remove the
|
|
114
|
+
// range just for it to show up again when the user moves a few pixels to the side.
|
|
115
|
+
if (event.target &&
|
|
116
|
+
this.getCellFromElement(event.target) &&
|
|
117
|
+
!(event.relatedTarget &&
|
|
118
|
+
this.getCellFromElement(event.relatedTarget))) {
|
|
119
|
+
this.ngZone.run(() => this.previewChange.emit({ value: undefined, event }));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Triggered on mousedown or touchstart on a date cell.
|
|
125
|
+
* Responsible for starting a drag sequence.
|
|
126
|
+
*/
|
|
127
|
+
this.mousedownHandler = (event) => {
|
|
128
|
+
if (!this.isRange) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
this.didDragSinceMouseDown = false;
|
|
132
|
+
// Begin a drag if a cell within the current range was targeted.
|
|
133
|
+
const cell = event.target && this.getCellFromElement(event.target);
|
|
134
|
+
if (!cell || !this.isInRange(cell.compareValue)) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
this.ngZone.run(() => {
|
|
138
|
+
this.dragStarted.emit({
|
|
139
|
+
value: cell.rawValue,
|
|
140
|
+
event
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
/** Triggered on mouseup anywhere. Responsible for ending a drag sequence. */
|
|
145
|
+
this.mouseupHandler = (event) => {
|
|
146
|
+
if (!this.isRange) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const cellElement = this.getCellElement(event.target);
|
|
150
|
+
if (!cellElement) {
|
|
151
|
+
// Mouseup happened outside of datepicker. Cancel drag.
|
|
152
|
+
this.ngZone.run(() => {
|
|
153
|
+
this.dragEnded.emit({ value: undefined, event });
|
|
154
|
+
});
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (cellElement.closest('.upd-calendar-body') !== this.elementRef.nativeElement) {
|
|
158
|
+
// Mouseup happened inside a different month instance.
|
|
159
|
+
// Allow it to handle the event.
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
this.ngZone.run(() => {
|
|
163
|
+
const cell = this.getCellFromElement(cellElement);
|
|
164
|
+
this.dragEnded.emit({ value: cell?.rawValue ?? undefined, event });
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
/** Triggered on touchend anywhere. Respsonsible for ending a drag sequence. */
|
|
168
|
+
this.touchendHandler = (event) => {
|
|
169
|
+
const target = this.getActualTouchTarget(event);
|
|
170
|
+
if (target) {
|
|
171
|
+
this.mouseupHandler({ target });
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
this.ngZone.runOutsideAngular(() => {
|
|
175
|
+
const element = this.elementRef.nativeElement;
|
|
176
|
+
// `touchmove` is active since we need to call `preventDefault`.
|
|
177
|
+
element.addEventListener('touchmove', this.touchmoveHandler, activeCapturingEventOptions);
|
|
178
|
+
element.addEventListener('mouseenter', this.enterHandler, passiveCapturingEventOptions);
|
|
179
|
+
element.addEventListener('focus', this.enterHandler, passiveCapturingEventOptions);
|
|
180
|
+
element.addEventListener('mouseleave', this.leaveHandler, passiveCapturingEventOptions);
|
|
181
|
+
element.addEventListener('blur', this.leaveHandler, passiveCapturingEventOptions);
|
|
182
|
+
element.addEventListener('mousedown', this.mousedownHandler, passiveEventOptions);
|
|
183
|
+
element.addEventListener('touchstart', this.mousedownHandler, passiveEventOptions);
|
|
184
|
+
window.addEventListener('mouseup', this.mouseupHandler);
|
|
185
|
+
window.addEventListener('touchend', this.touchendHandler);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
ngAfterViewChecked() {
|
|
189
|
+
if (this.focusActiveCellAfterViewChecked) {
|
|
190
|
+
this.focusActiveCell();
|
|
191
|
+
this.focusActiveCellAfterViewChecked = false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
ngOnChanges(changes) {
|
|
195
|
+
const columnChanges = changes['numCols'];
|
|
196
|
+
const { rows, numCols } = this;
|
|
197
|
+
if (changes['rows'] || columnChanges) {
|
|
198
|
+
this.firstRowOffset = rows && rows.length && rows[0].length ? numCols - rows[0].length : 0;
|
|
199
|
+
}
|
|
200
|
+
if (changes['cellAspectRatio'] || columnChanges || !this.cellPadding) {
|
|
201
|
+
this.cellPadding = `${(50 * this.cellAspectRatio) / numCols}%`;
|
|
202
|
+
}
|
|
203
|
+
if (columnChanges || !this.cellWidth) {
|
|
204
|
+
this.cellWidth = `${100 / numCols}%`;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
ngOnDestroy() {
|
|
208
|
+
const element = this.elementRef.nativeElement;
|
|
209
|
+
element.removeEventListener('touchmove', this.touchmoveHandler, activeCapturingEventOptions);
|
|
210
|
+
element.removeEventListener('mouseenter', this.enterHandler, passiveCapturingEventOptions);
|
|
211
|
+
element.removeEventListener('focus', this.enterHandler, passiveCapturingEventOptions);
|
|
212
|
+
element.removeEventListener('mouseleave', this.leaveHandler, passiveCapturingEventOptions);
|
|
213
|
+
element.removeEventListener('blur', this.leaveHandler, passiveCapturingEventOptions);
|
|
214
|
+
element.removeEventListener('mousedown', this.mousedownHandler, passiveEventOptions);
|
|
215
|
+
element.removeEventListener('touchstart', this.mousedownHandler, passiveEventOptions);
|
|
216
|
+
window.removeEventListener('mouseup', this.mouseupHandler);
|
|
217
|
+
window.removeEventListener('touchend', this.touchendHandler);
|
|
218
|
+
}
|
|
219
|
+
getIndex(colIndex, rowIndex) {
|
|
220
|
+
return `${colIndex}${rowIndex}`;
|
|
221
|
+
}
|
|
222
|
+
onDateEnter(index) {
|
|
223
|
+
this.hoveredDate = index;
|
|
224
|
+
}
|
|
225
|
+
onDateLeave() {
|
|
226
|
+
this.hoveredDate = undefined;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Called when a cell is clicked.
|
|
230
|
+
* @param cell
|
|
231
|
+
* @param event
|
|
232
|
+
*/
|
|
233
|
+
cellClicked(cell, event) {
|
|
234
|
+
// Ignore "clicks" that are actually canceled drags (eg the user dragged off and then went back to this cell to undo).
|
|
235
|
+
if (this.didDragSinceMouseDown) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
if (cell.isEnabled) {
|
|
239
|
+
this.selectedValueChange.emit({ value: cell.value, event });
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
emitActiveDateChange(cell) {
|
|
243
|
+
if (cell.isEnabled) {
|
|
244
|
+
const month = cell.value;
|
|
245
|
+
const oldActiveDate = this.calendarSignalsService.activeDate();
|
|
246
|
+
const tempDate = this.getDateFromDayOfMonth(oldActiveDate, month);
|
|
247
|
+
if (this.dateService.compare(oldActiveDate, tempDate)) {
|
|
248
|
+
this.calendarSignalsService.activeDate = tempDate;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Returns whether a cell should be marked as selected.
|
|
254
|
+
* @param value
|
|
255
|
+
*/
|
|
256
|
+
isSelected(value) {
|
|
257
|
+
return this.startValue === value || this.endValue === value;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Returns whether a cell is active.
|
|
261
|
+
* @param rowIndex
|
|
262
|
+
* @param colIndex
|
|
263
|
+
*/
|
|
264
|
+
isActiveCell(rowIndex, colIndex) {
|
|
265
|
+
let cellNumber = rowIndex * this.numCols + colIndex;
|
|
266
|
+
// Account for the fact that the first row may not have as many cells.
|
|
267
|
+
if (rowIndex) {
|
|
268
|
+
cellNumber -= this.firstRowOffset;
|
|
269
|
+
}
|
|
270
|
+
return cellNumber === this.activeCell;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Focuses the active cell after the microtask queue is empty.
|
|
274
|
+
*
|
|
275
|
+
* Adding a 0ms setTimeout seems to fix Voiceover losing focus when pressing PageUp/PageDown
|
|
276
|
+
* (issue #24330).
|
|
277
|
+
*
|
|
278
|
+
* Determined a 0ms by gradually increasing duration from 0 and testing two use cases with screen
|
|
279
|
+
* reader enabled:
|
|
280
|
+
*
|
|
281
|
+
* 1. Pressing PageUp/PageDown repeatedly with pausing between each key press.
|
|
282
|
+
* 2. Pressing and holding the PageDown key with repeated keys enabled.
|
|
283
|
+
*
|
|
284
|
+
* Test 1 worked roughly 95-99% of the time with 0ms and got a little bit better as the duration
|
|
285
|
+
* increased. Test 2 got slightly better until the duration was long enough to interfere with
|
|
286
|
+
* repeated keys. If the repeated key speed was faster than the timeout duration, then pressing
|
|
287
|
+
* and holding pagedown caused the entire page to scroll.
|
|
288
|
+
*
|
|
289
|
+
* Since repeated key speed can verify across machines, determined that any duration could
|
|
290
|
+
* potentially interfere with repeated keys. 0ms would be best because it almost entirely
|
|
291
|
+
* eliminates the focus being lost in Voiceover (#24330) without causing unintended side effects.
|
|
292
|
+
* Adding delay also complicates writing tests.
|
|
293
|
+
*/
|
|
294
|
+
focusActiveCell(movePreview = true) {
|
|
295
|
+
afterNextRender(() => {
|
|
296
|
+
setTimeout(() => {
|
|
297
|
+
const activeCell = this.elementRef.nativeElement.querySelector('.upd-calendar-body-active');
|
|
298
|
+
if (!!activeCell) {
|
|
299
|
+
if (!movePreview) {
|
|
300
|
+
this.skipNextFocus = true;
|
|
301
|
+
}
|
|
302
|
+
activeCell.focus();
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}, { injector: this.injector });
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Focuses the active cell after change detection has run and the microtask queue is empty.
|
|
309
|
+
*/
|
|
310
|
+
scheduleFocusActiveCellAfterViewChecked() {
|
|
311
|
+
this.focusActiveCellAfterViewChecked = true;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Gets whether a value is the start of the main range.
|
|
315
|
+
* @param value
|
|
316
|
+
*/
|
|
317
|
+
isRangeStart(value) {
|
|
318
|
+
return this.isStart(value, this.startValue, this.endValue);
|
|
319
|
+
}
|
|
320
|
+
/** Gets whether a value is the end of the main range. */
|
|
321
|
+
isRangeEnd(value) {
|
|
322
|
+
return this.isEnd(value, this.startValue, this.endValue);
|
|
323
|
+
}
|
|
324
|
+
/** Gets whether a value is within the currently-selected range. */
|
|
325
|
+
isInRange(value) {
|
|
326
|
+
return this.isInsideRange(value, this.startValue, this.endValue, this.isRange);
|
|
327
|
+
}
|
|
328
|
+
/** Gets whether a value is the start of the comparison range. */
|
|
329
|
+
isComparisonStart(value) {
|
|
330
|
+
return this.isStart(value, this.comparisonStart, this.comparisonEnd);
|
|
331
|
+
}
|
|
332
|
+
/** Whether the cell is a start bridge cell between the main and comparison ranges. */
|
|
333
|
+
isComparisonBridgeStart(value, rowIndex, colIndex) {
|
|
334
|
+
if (!this.isComparisonStart(value) || this.isRangeStart(value) || !this.isInRange(value)) {
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
let previousCell = this.rows[rowIndex][colIndex - 1];
|
|
338
|
+
if (!previousCell) {
|
|
339
|
+
const previousRow = this.rows[rowIndex - 1];
|
|
340
|
+
previousCell = previousRow && previousRow[previousRow.length - 1];
|
|
341
|
+
}
|
|
342
|
+
return previousCell && !this.isRangeEnd(previousCell.compareValue);
|
|
343
|
+
}
|
|
344
|
+
/** Whether the cell is an end bridge cell between the main and comparison ranges. */
|
|
345
|
+
isComparisonBridgeEnd(value, rowIndex, colIndex) {
|
|
346
|
+
if (!this.isComparisonEnd(value) || this.isRangeEnd(value) || !this.isInRange(value)) {
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
let nextCell = this.rows[rowIndex][colIndex + 1];
|
|
350
|
+
if (!nextCell) {
|
|
351
|
+
const nextRow = this.rows[rowIndex + 1];
|
|
352
|
+
nextCell = nextRow && nextRow[0];
|
|
353
|
+
}
|
|
354
|
+
return nextCell && !this.isRangeStart(nextCell.compareValue);
|
|
355
|
+
}
|
|
356
|
+
/** Gets whether a value is the end of the comparison range. */
|
|
357
|
+
isComparisonEnd(value) {
|
|
358
|
+
return this.isEnd(value, this.comparisonStart, this.comparisonEnd);
|
|
359
|
+
}
|
|
360
|
+
/** Gets whether a value is within the current comparison range. */
|
|
361
|
+
isInComparisonRange(value) {
|
|
362
|
+
return this.isInsideRange(value, this.comparisonStart, this.comparisonEnd, this.isRange);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Gets whether a value is the same as the start and end of the comparison range.
|
|
366
|
+
* For context, the functions that we use to determine whether something is the start/end of
|
|
367
|
+
* a range don't allow for the start and end to be on the same day, because we'd have to use
|
|
368
|
+
* much more specific CSS selectors to style them correctly in all scenarios. This is fine for
|
|
369
|
+
* the regular range, because when it happens, the selected styles take over and still show where
|
|
370
|
+
* the range would've been, however we don't have these selected styles for a comparison range.
|
|
371
|
+
* This function is used to apply a class that serves the same purpose as the one for selected
|
|
372
|
+
* dates, but it only applies in the context of a comparison range.
|
|
373
|
+
*/
|
|
374
|
+
isComparisonIdentical(value) {
|
|
375
|
+
// Note that we don't need to null check the start/end
|
|
376
|
+
// here, because the `value` will always be defined.
|
|
377
|
+
return this.comparisonStart === this.comparisonEnd && value === this.comparisonStart;
|
|
378
|
+
}
|
|
379
|
+
/** Gets whether a value is the start of the preview range. */
|
|
380
|
+
isPreviewStart(value) {
|
|
381
|
+
return this.isStart(value, this.previewStart, this.previewEnd);
|
|
382
|
+
}
|
|
383
|
+
/** Gets whether a value is the end of the preview range. */
|
|
384
|
+
isPreviewEnd(value) {
|
|
385
|
+
return this.isEnd(value, this.previewStart, this.previewEnd);
|
|
386
|
+
}
|
|
387
|
+
/** Gets whether a value is inside the preview range. */
|
|
388
|
+
isInPreview(value) {
|
|
389
|
+
// console.log('is in range', this.isInsideRange(value, this.previewStart, this.previewEnd, this.isRange));
|
|
390
|
+
return this.isInsideRange(value, this.previewStart, this.previewEnd, this.isRange);
|
|
391
|
+
}
|
|
392
|
+
/** Gets ids of aria descriptions for the start and end of a date range. */
|
|
393
|
+
getDescribedby(value) {
|
|
394
|
+
if (!this.isRange) {
|
|
395
|
+
return undefined;
|
|
396
|
+
}
|
|
397
|
+
if (this.startValue === value && this.endValue === value) {
|
|
398
|
+
return `${this.startDateLabelId} ${this.endDateLabelId}`;
|
|
399
|
+
}
|
|
400
|
+
else if (this.startValue === value) {
|
|
401
|
+
return this.startDateLabelId;
|
|
402
|
+
}
|
|
403
|
+
else if (this.endValue === value) {
|
|
404
|
+
return this.endDateLabelId;
|
|
405
|
+
}
|
|
406
|
+
return undefined;
|
|
407
|
+
}
|
|
408
|
+
/** Finds the CalendarCell that corresponds to a DOM node. */
|
|
409
|
+
getCellFromElement(element) {
|
|
410
|
+
const cell = this.getCellElement(element);
|
|
411
|
+
if (!!cell) {
|
|
412
|
+
const row = cell.getAttribute('data-upd-row');
|
|
413
|
+
const col = cell.getAttribute('data-upd-col');
|
|
414
|
+
if (row && col) {
|
|
415
|
+
return this.rows[parseInt(row, 10)][parseInt(col, 10)];
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return undefined;
|
|
419
|
+
}
|
|
420
|
+
/** Checks whether a node is a table cell element. */
|
|
421
|
+
isTableCell(node) {
|
|
422
|
+
return node?.nodeName === 'DIV';
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Gets the date table cell element that is or contains the specified element.
|
|
426
|
+
* Or returns null if element is not part of a date cell.
|
|
427
|
+
*/
|
|
428
|
+
getCellElement(element) {
|
|
429
|
+
let cell;
|
|
430
|
+
if (this.isTableCell(element)) {
|
|
431
|
+
cell = element;
|
|
432
|
+
}
|
|
433
|
+
else if (this.isTableCell(element.parentNode || undefined)) {
|
|
434
|
+
cell = element.parentNode;
|
|
435
|
+
}
|
|
436
|
+
else if (this.isTableCell(element.parentNode?.parentNode || undefined)) {
|
|
437
|
+
cell = element.parentNode.parentNode;
|
|
438
|
+
}
|
|
439
|
+
return cell?.getAttribute('data-upd-row') !== undefined ? cell : undefined;
|
|
440
|
+
}
|
|
441
|
+
/** Checks whether a value is the start of a range. */
|
|
442
|
+
isStart(value, start, end) {
|
|
443
|
+
return end !== undefined && start !== end && value < end && value === start;
|
|
444
|
+
}
|
|
445
|
+
/** Checks whether a value is the end of a range. */
|
|
446
|
+
isEnd(value, start, end) {
|
|
447
|
+
return start !== undefined && start !== end && value >= start && value === end;
|
|
448
|
+
}
|
|
449
|
+
/** Checks whether a value is inside of a range. */
|
|
450
|
+
isInsideRange(value, start, end, rangeEnabled) {
|
|
451
|
+
return (rangeEnabled && start !== undefined && end !== undefined && start !== end && value >= start && value <= end);
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Extracts the element that actually corresponds to a touch event's location
|
|
455
|
+
* (rather than the element that initiated the sequence of touch events).
|
|
456
|
+
*/
|
|
457
|
+
getActualTouchTarget(event) {
|
|
458
|
+
const touchLocation = event.changedTouches[0];
|
|
459
|
+
return document.elementFromPoint(touchLocation.clientX, touchLocation.clientY);
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Takes a day of the month and returns a new date in the same month and year as the currently
|
|
463
|
+
* active date. The returned date will have the same day of the month as the argument date.
|
|
464
|
+
*/
|
|
465
|
+
getDateFromDayOfMonth(activeDate, dayOfMonth) {
|
|
466
|
+
return this.dateService.create(activeDate.getFullYear(), activeDate.getMonth(), dayOfMonth);
|
|
467
|
+
}
|
|
468
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarBodyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
469
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: CalendarBodyComponent, selector: "upd-calendar-body", inputs: { label: "label", rows: "rows", todayValue: "todayValue", startValue: "startValue", endValue: "endValue", labelMinRequiredCells: "labelMinRequiredCells", numCols: "numCols", activeCell: "activeCell", isRange: "isRange", cellAspectRatio: "cellAspectRatio", comparisonStart: "comparisonStart", comparisonEnd: "comparisonEnd", previewStart: "previewStart", previewEnd: "previewEnd", startDateAccessibleName: "startDateAccessibleName", endDateAccessibleName: "endDateAccessibleName" }, outputs: { selectedValueChange: "selectedValueChange", previewChange: "previewChange", dragStarted: "dragStarted", dragEnded: "dragEnded" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"container\">\n <!--\n If there's not enough space in the first row, create a separate label row. We mark this row as\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\n -->\n @if (firstRowOffset < labelMinRequiredCells) {\n <div class=\"row seven-cols\" aria-hidden=\"true\">\n <div class=\"col-7 p-1 d-flex align-items-center\" [style.min-height.px]=\"40\">\n {{ label }}\n </div>\n </div>\n }\n\n <!-- Create the first row separately so we can include a special spacer cell. -->\n @for (row of rows; track trackRow(row); let rowIndex = $index) {\n <div class=\"row seven-cols\">\n <!--\n This cell is purely decorative, but we can't put `aria-hidden` or `role=\"presentation\"` on it,\n because it throws off the week days for the rest of the row on NVDA. The aspect ratio of the\n table cells is maintained by setting the top and bottom padding as a percentage of the width\n (a variant of the trick described here: https://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n -->\n @if (rowIndex === 0 && firstRowOffset) {\n <div [ngClass]=\"colspanClass\" class=\"p-1 d-flex align-items-center\" [style.min-height.px]=\"40\">\n {{ firstRowOffset >= labelMinRequiredCells ? label : '' }}\n </div>\n }\n\n <!--\n Each gridcell in the calendar contains a button, which signals to assistive technology that the\n cell is interactable, as well as the selection state via `aria-pressed`. See #23476 for\n background.\n -->\n @for (item of row; track item.id; let colIndex = $index) {\n <div class=\"col-1 justify-content-center p-1 d-flex align-items-center cursor-pointer\" [attr.data-upd-row]=\"rowIndex\"\n [attr.data-upd-col]=\"colIndex\" [style.min-height.px]=\"40\"\n [class.bg-secondary-lt]=\"hoveredDate === getIndex(rowIndex, colIndex)\" [class.border]=\"isActiveCell(rowIndex, colIndex)\"\n [class.border-secondary]=\"isActiveCell(rowIndex, colIndex)\" [class.bg-azure]=\"isSelected(item.compareValue)\"\n [class.text-azure-fg]=\"isSelected(item.compareValue)\" [tabindex]=\"isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.upd-calendar-body-disabled]=\"!item.isEnabled\" [class.bg-danger]=\"isRangeStart(item.compareValue)\"\n [class.text-danger-fg]=\"isRangeStart(item.compareValue)\" [class.bg-muted]=\"isRangeEnd(item.compareValue)\"\n [class.text-muted-fg]=\"isRangeEnd(item.compareValue)\"\n [class.upd-calendar-body-range-end]=\"isRangeEnd(item.compareValue)\"\n [class.upd-calendar-body-in-range]=\"isInRange(item.compareValue)\"\n [class.upd-calendar-body-comparison-bridge-start]=\"isComparisonBridgeStart(item.compareValue, rowIndex, colIndex)\"\n [class.upd-calendar-body-comparison-bridge-end]=\"isComparisonBridgeEnd(item.compareValue, rowIndex, colIndex)\"\n [class.upd-calendar-body-comparison-start]=\"isComparisonStart(item.compareValue)\"\n [class.upd-calendar-body-comparison-end]=\"isComparisonEnd(item.compareValue)\"\n [class.upd-calendar-body-in-comparison-range]=\"isInComparisonRange(item.compareValue)\"\n [class.rounded-start]=\"isPreviewStart(item.compareValue)\" [class.rounded-end]=\"isPreviewEnd(item.compareValue)\"\n [class.border-top]=\"isInPreview(item.compareValue)\" [class.fw-bold]=\"isInPreview(item.compareValue)\"\n [class.border-bottom]=\"isInPreview(item.compareValue)\" [class.border-secondary-lt]=\"isInPreview(item.compareValue)\"\n [attr.aria-label]=\"item.ariaLabel\" [attr.aria-disabled]=\"!item.isEnabled || undefined\"\n [attr.aria-pressed]=\"isSelected(item.compareValue)\"\n [attr.aria-current]=\"todayValue === item.compareValue ? 'date' : undefined\"\n [attr.aria-describedby]=\"getDescribedby(item.compareValue)\" (click)=\"cellClicked(item, $event)\"\n (focus)=\"emitActiveDateChange(item)\" (mouseenter)=\"onDateEnter(getIndex(rowIndex, colIndex))\"\n (mouseleave)=\"onDateLeave()\">\n <span [class.upd-calendar-body-selected]=\"isSelected(item.compareValue)\"\n [class.upd-calendar-body-comparison-identical]=\"isComparisonIdentical(item.compareValue)\"\n [class.upd-calendar-body-today]=\"todayValue === item.compareValue\">\n {{ item.displayValue }}\n </span>\n </div>\n }\n </div>\n }\n\n <label [id]=\"startDateLabelId\" class=\"upd-calendar-body-hidden-label\">\n {{ startDateAccessibleName }}\n </label>\n <label [id]=\"endDateLabelId\" class=\"upd-calendar-body-hidden-label\">\n {{ endDateAccessibleName }}\n </label>\n</div>\n", styles: ["@media (min-width: 768px){.seven-cols .col-1{width:100%}.seven-cols .col-6{width:85.7142857143%}}@media (min-width: 992px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}@media (min-width: 1200px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
|
|
470
|
+
}
|
|
471
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarBodyComponent, decorators: [{
|
|
472
|
+
type: Component,
|
|
473
|
+
args: [{ selector: 'upd-calendar-body', template: "<div class=\"container\">\n <!--\n If there's not enough space in the first row, create a separate label row. We mark this row as\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\n -->\n @if (firstRowOffset < labelMinRequiredCells) {\n <div class=\"row seven-cols\" aria-hidden=\"true\">\n <div class=\"col-7 p-1 d-flex align-items-center\" [style.min-height.px]=\"40\">\n {{ label }}\n </div>\n </div>\n }\n\n <!-- Create the first row separately so we can include a special spacer cell. -->\n @for (row of rows; track trackRow(row); let rowIndex = $index) {\n <div class=\"row seven-cols\">\n <!--\n This cell is purely decorative, but we can't put `aria-hidden` or `role=\"presentation\"` on it,\n because it throws off the week days for the rest of the row on NVDA. The aspect ratio of the\n table cells is maintained by setting the top and bottom padding as a percentage of the width\n (a variant of the trick described here: https://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n -->\n @if (rowIndex === 0 && firstRowOffset) {\n <div [ngClass]=\"colspanClass\" class=\"p-1 d-flex align-items-center\" [style.min-height.px]=\"40\">\n {{ firstRowOffset >= labelMinRequiredCells ? label : '' }}\n </div>\n }\n\n <!--\n Each gridcell in the calendar contains a button, which signals to assistive technology that the\n cell is interactable, as well as the selection state via `aria-pressed`. See #23476 for\n background.\n -->\n @for (item of row; track item.id; let colIndex = $index) {\n <div class=\"col-1 justify-content-center p-1 d-flex align-items-center cursor-pointer\" [attr.data-upd-row]=\"rowIndex\"\n [attr.data-upd-col]=\"colIndex\" [style.min-height.px]=\"40\"\n [class.bg-secondary-lt]=\"hoveredDate === getIndex(rowIndex, colIndex)\" [class.border]=\"isActiveCell(rowIndex, colIndex)\"\n [class.border-secondary]=\"isActiveCell(rowIndex, colIndex)\" [class.bg-azure]=\"isSelected(item.compareValue)\"\n [class.text-azure-fg]=\"isSelected(item.compareValue)\" [tabindex]=\"isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.upd-calendar-body-disabled]=\"!item.isEnabled\" [class.bg-danger]=\"isRangeStart(item.compareValue)\"\n [class.text-danger-fg]=\"isRangeStart(item.compareValue)\" [class.bg-muted]=\"isRangeEnd(item.compareValue)\"\n [class.text-muted-fg]=\"isRangeEnd(item.compareValue)\"\n [class.upd-calendar-body-range-end]=\"isRangeEnd(item.compareValue)\"\n [class.upd-calendar-body-in-range]=\"isInRange(item.compareValue)\"\n [class.upd-calendar-body-comparison-bridge-start]=\"isComparisonBridgeStart(item.compareValue, rowIndex, colIndex)\"\n [class.upd-calendar-body-comparison-bridge-end]=\"isComparisonBridgeEnd(item.compareValue, rowIndex, colIndex)\"\n [class.upd-calendar-body-comparison-start]=\"isComparisonStart(item.compareValue)\"\n [class.upd-calendar-body-comparison-end]=\"isComparisonEnd(item.compareValue)\"\n [class.upd-calendar-body-in-comparison-range]=\"isInComparisonRange(item.compareValue)\"\n [class.rounded-start]=\"isPreviewStart(item.compareValue)\" [class.rounded-end]=\"isPreviewEnd(item.compareValue)\"\n [class.border-top]=\"isInPreview(item.compareValue)\" [class.fw-bold]=\"isInPreview(item.compareValue)\"\n [class.border-bottom]=\"isInPreview(item.compareValue)\" [class.border-secondary-lt]=\"isInPreview(item.compareValue)\"\n [attr.aria-label]=\"item.ariaLabel\" [attr.aria-disabled]=\"!item.isEnabled || undefined\"\n [attr.aria-pressed]=\"isSelected(item.compareValue)\"\n [attr.aria-current]=\"todayValue === item.compareValue ? 'date' : undefined\"\n [attr.aria-describedby]=\"getDescribedby(item.compareValue)\" (click)=\"cellClicked(item, $event)\"\n (focus)=\"emitActiveDateChange(item)\" (mouseenter)=\"onDateEnter(getIndex(rowIndex, colIndex))\"\n (mouseleave)=\"onDateLeave()\">\n <span [class.upd-calendar-body-selected]=\"isSelected(item.compareValue)\"\n [class.upd-calendar-body-comparison-identical]=\"isComparisonIdentical(item.compareValue)\"\n [class.upd-calendar-body-today]=\"todayValue === item.compareValue\">\n {{ item.displayValue }}\n </span>\n </div>\n }\n </div>\n }\n\n <label [id]=\"startDateLabelId\" class=\"upd-calendar-body-hidden-label\">\n {{ startDateAccessibleName }}\n </label>\n <label [id]=\"endDateLabelId\" class=\"upd-calendar-body-hidden-label\">\n {{ endDateAccessibleName }}\n </label>\n</div>\n", styles: ["@media (min-width: 768px){.seven-cols .col-1{width:100%}.seven-cols .col-6{width:85.7142857143%}}@media (min-width: 992px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}@media (min-width: 1200px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}\n"] }]
|
|
474
|
+
}], ctorParameters: () => [], propDecorators: { label: [{
|
|
475
|
+
type: Input
|
|
476
|
+
}], rows: [{
|
|
477
|
+
type: Input
|
|
478
|
+
}], todayValue: [{
|
|
479
|
+
type: Input
|
|
480
|
+
}], startValue: [{
|
|
481
|
+
type: Input
|
|
482
|
+
}], endValue: [{
|
|
483
|
+
type: Input
|
|
484
|
+
}], labelMinRequiredCells: [{
|
|
485
|
+
type: Input
|
|
486
|
+
}], numCols: [{
|
|
487
|
+
type: Input
|
|
488
|
+
}], activeCell: [{
|
|
489
|
+
type: Input
|
|
490
|
+
}], isRange: [{
|
|
491
|
+
type: Input
|
|
492
|
+
}], cellAspectRatio: [{
|
|
493
|
+
type: Input
|
|
494
|
+
}], comparisonStart: [{
|
|
495
|
+
type: Input
|
|
496
|
+
}], comparisonEnd: [{
|
|
497
|
+
type: Input
|
|
498
|
+
}], previewStart: [{
|
|
499
|
+
type: Input
|
|
500
|
+
}], previewEnd: [{
|
|
501
|
+
type: Input
|
|
502
|
+
}], startDateAccessibleName: [{
|
|
503
|
+
type: Input
|
|
504
|
+
}], endDateAccessibleName: [{
|
|
505
|
+
type: Input
|
|
506
|
+
}], selectedValueChange: [{
|
|
507
|
+
type: Output
|
|
508
|
+
}], previewChange: [{
|
|
509
|
+
type: Output
|
|
510
|
+
}], dragStarted: [{
|
|
511
|
+
type: Output
|
|
512
|
+
}], dragEnded: [{
|
|
513
|
+
type: Output
|
|
514
|
+
}] } });
|
|
515
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvY2FsZW5kYXIvc3JjL2NvbXBvbmVudHMvY2FsZW5kYXItYm9keS9jYWxlbmRhci1ib2R5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci1ib2R5L2NhbGVuZGFyLWJvZHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBRU4sTUFBTSxFQUlOLFVBQVUsRUFDVixNQUFNLEVBQ04sZUFBZSxFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJL0MsT0FBTyxFQUFFLDJCQUEyQixFQUFFLDRCQUE0QixFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7OztBQUVqRixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFPdkIsTUFBTSxPQUFPLHFCQUFxQjtJQXVIOUIsSUFBSSxnQkFBZ0I7UUFDaEIsT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLGFBQWEsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2QsT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBSSxZQUFZO1FBQ1osT0FBTyxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBb0JEO1FBcEhBOztXQUVHO1FBQ00sWUFBTyxHQUFHLENBQUMsQ0FBQztRQUVyQjs7V0FF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U0FBUztzQkFBM0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBpbmplY3QsXG4gICAgT25DaGFuZ2VzLFxuICAgIEFmdGVyVmlld0NoZWNrZWQsXG4gICAgT25EZXN0cm95LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgTmdab25lLFxuICAgIGFmdGVyTmV4dFJlbmRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9wdGlvbmFsVHlwZSB9IGZyb20gJ0B1cGRldnMvc2RrL3R5cGVzJztcbmltcG9ydCB7IERhdGVTZXJ2aWNlIH0gZnJvbSAnQHVwZGV2cy9zZGsvY29yZSc7XG5cbmltcG9ydCB7IENhbGVuZGFyQ2VsbE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLWNlbGwubW9kZWwnO1xuaW1wb3J0IHsgQ2FsZW5kYXJVc2VyRXZlbnRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9jYWxlbmRhci11c2VyLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IGFjdGl2ZUNhcHR1cmluZ0V2ZW50T3B0aW9ucywgcGFzc2l2ZUNhcHR1cmluZ0V2ZW50T3B0aW9ucywgcGFzc2l2ZUV2ZW50T3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xzL2V2ZW50cy1vcHRpb25zJztcbmltcG9ydCB7IENhbGVuZGFyU2lnbmFsc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci1zaWduYWxzLnNlcnZpY2UnO1xuXG5sZXQgY2FsZW5kYXJCb2R5SWQgPSAxO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3VwZC1jYWxlbmRhci1ib2R5JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItYm9keS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2NhbGVuZGFyLWJvZHkuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQm9keUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFiZWwgZm9yIHRoZSB0YWJsZS4gKGUuZy4gXCJKYW4gMjAxN1wiKS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBsYWJlbCE6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBjZWxscyB0byBkaXNwbGF5IGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSByb3dzITogQ2FsZW5kYXJDZWxsTW9kZWxbXVtdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIGluIHRoZSB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRvZGF5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHRvZGF5VmFsdWU/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBTdGFydCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgZGF0ZSByYW5nZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBzdGFydFZhbHVlPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogRW5kIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBkYXRlIHJhbmdlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuZFZhbHVlPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGZyZWUgY2VsbHMgbmVlZGVkIHRvIGZpdCB0aGUgbGFiZWwgaW4gdGhlIGZpcnN0IHJvdy5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBsYWJlbE1pblJlcXVpcmVkQ2VsbHMhOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIG51bUNvbHMgPSA3O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNlbGwgbnVtYmVyIG9mIHRoZSBhY3RpdmUgY2VsbCBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgQElucHV0KCkgYWN0aXZlQ2VsbCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGEgcmFuZ2UgaXMgYmVpbmcgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgQElucHV0KCkgaXNSYW5nZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFzcGVjdCByYXRpbyAod2lkdGggLyBoZWlnaHQpIHRvIHVzZSBmb3IgdGhlIGNlbGxzIGluIHRoZSB0YWJsZS4gVGhpcyBhc3BlY3QgcmF0aW8gd2lsbCBiZVxuICAgICAqIG1haW50YWluZWQgZXZlbiBhcyB0aGUgdGFibGUgcmVzaXplcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBjZWxsQXNwZWN0UmF0aW8gPSAxO1xuXG4gICAgLyoqXG4gICAgICogU3RhcnQgb2YgdGhlIGNvbXBhcmlzb24gcmFuZ2UuXG4gICAgICovXG4gICAgQElucHV0KCkgY29tcGFyaXNvblN0YXJ0PzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogRW5kIG9mIHRoZSBjb21wYXJpc29uIHJhbmdlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNvbXBhcmlzb25FbmQ/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBTdGFydCBvZiB0aGUgcHJldmlldyByYW5nZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwcmV2aWV3U3RhcnQ/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBFbmQgb2YgdGhlIHByZXZpZXcgcmFuZ2UuXG4gICAgICovXG4gICAgQElucHV0KCkgcHJldmlld0VuZD86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEFSSUEgQWNjZXNzaWJsZSBuYW1lIG9mIHRoZSBgPGlucHV0IHVwZFN0YXJ0RGF0ZS8+YFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQVJJQSBBY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIGA8aW5wdXQgdXBkRW5kRGF0ZS8+YFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuZERhdGVBY2Nlc3NpYmxlTmFtZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHdoZW4gYSBuZXcgdmFsdWUgaXMgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyVXNlckV2ZW50TW9kZWw8bnVtYmVyPj4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHdoZW4gdGhlIHByZXZpZXcgaGFzIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgYSB1c2VyIGFjdGlvbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgcHJldmlld0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJVc2VyRXZlbnRNb2RlbDxPcHRpb25hbFR5cGU8Q2FsZW5kYXJDZWxsTW9kZWw+Pj4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHRoZSBkYXRlIGF0IHRoZSBwb3NzaWJsZSBzdGFydCBvZiBhIGRyYWcgZXZlbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGRyYWdTdGFydGVkID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhclVzZXJFdmVudE1vZGVsPERhdGU+PigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgdGhlIGRhdGUgYXQgdGhlIGNvbmNsdXNpb24gb2YgYSBkcmFnLCBvciBudWxsIGlmIG1vdXNlIHdhcyBub3QgcmVsZWFzZWQgb24gYSBkYXRlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBkcmFnRW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyVXNlckV2ZW50TW9kZWw8T3B0aW9uYWxUeXBlPERhdGU+Pj4oKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmxhbmsgY2VsbHMgdG8gcHV0IGF0IHRoZSBiZWdpbm5pbmcgZm9yIHRoZSBmaXJzdCByb3cuXG4gICAgICovXG4gICAgZmlyc3RSb3dPZmZzZXQhOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBQYWRkaW5nIGZvciB0aGUgaW5kaXZpZHVhbCBkYXRlIGNlbGxzLlxuICAgICAqL1xuICAgIGNlbGxQYWRkaW5nITogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2lkdGggb2YgYW4gaW5kaXZpZHVhbCBjZWxsLlxuICAgICAqL1xuICAgIGNlbGxXaWR0aCE6IHN0cmluZztcblxuICAgIGhvdmVyZWREYXRlPzogc3RyaW5nO1xuXG4gICAgZ2V0IHN0YXJ0RGF0ZUxhYmVsSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuaWR9LXN0YXJ0LWRhdGVgO1xuICAgIH1cbiAgICBnZXQgZW5kRGF0ZUxhYmVsSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuaWR9LWVuZC1kYXRlYDtcbiAgICB9XG4gICAgZ2V0IGNvbHNwYW5DbGFzcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYGNvbC0ke3RoaXMuZmlyc3RSb3dPZmZzZXR9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpZERyYWdTaW5jZU1vdXNlRG93biA9IGZhbHNlO1xuICAgIHByaXZhdGUgaWQgPSBgdXBkLWNhbGVuZGFyLWJvZHktJHtjYWxlbmRhckJvZHlJZCsrfWA7XG4gICAgLyoqXG4gICAgICogVXNlZCB0byBza2lwIHRoZSBuZXh0IGZvY3VzIGV2ZW50IHdoZW4gcmVuZGVyaW5nIHRoZSBwcmV2aWV3IHJhbmdlLlxuICAgICAqIFdlIG5lZWQgYSBmbGFnIGxpa2UgdGhpcywgYmVjYXVzZSBzb21lIGJyb3dzZXJzIGZpcmUgZm9jdXMgZXZlbnRzIGFzeW5jaHJvbm91c2x5LlxuICAgICAqL1xuICAgIHByaXZhdGUgc2tpcE5leHRGb2N1cz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVXNlZCB0byBmb2N1cyB0aGUgYWN0aXZlIGNlbGwgYWZ0ZXIgY2hhbmdlIGRldGVjdGlvbiBoYXMgcnVuLlxuICAgICAqL1xuICAgIHByaXZhdGUgZm9jdXNBY3RpdmVDZWxsQWZ0ZXJWaWV3Q2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FsZW5kYXJTaWduYWxzU2VydmljZSA9IGluamVjdChDYWxlbmRhclNpZ25hbHNTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVTZXJ2aWNlID0gaW5qZWN0KERhdGVTZXJ2aWNlKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIGB0b3VjaG1vdmVgIGlzIGFjdGl2ZSBzaW5jZSB3ZSBuZWVkIHRvIGNhbGwgYHByZXZlbnREZWZhdWx0YC5cbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy50b3VjaG1vdmVIYW5kbGVyLCBhY3RpdmVDYXB0dXJpbmdFdmVudE9wdGlvbnMpO1xuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5lbnRlckhhbmRsZXIsIHBhc3NpdmVDYXB0dXJpbmdFdmVudE9wdGlvbnMpO1xuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuZW50ZXJIYW5kbGVyLCBwYXNzaXZlQ2FwdHVyaW5nRXZlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMubGVhdmVIYW5kbGVyLCBwYXNzaXZlQ2FwdHVyaW5nRXZlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMubGVhdmVIYW5kbGVyLCBwYXNzaXZlQ2FwdHVyaW5nRXZlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5tb3VzZWRvd25IYW5kbGVyLCBwYXNzaXZlRXZlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMubW91c2Vkb3duSGFuZGxlciwgcGFzc2l2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2V1cEhhbmRsZXIpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy50b3VjaGVuZEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzQWN0aXZlQ2VsbEFmdGVyVmlld0NoZWNrZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBY3RpdmVDZWxsKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQWN0aXZlQ2VsbEFmdGVyVmlld0NoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29sdW1uQ2hhbmdlcyA9IGNoYW5nZXNbJ251bUNvbHMnXTtcbiAgICAgICAgY29uc3QgeyByb3dzLCBudW1Db2xzIH0gPSB0aGlzO1xuXG4gICAgICAgIGlmIChjaGFuZ2VzWydyb3dzJ10gfHwgY29sdW1uQ2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5maXJzdFJvd09mZnNldCA9IHJvd3MgJiYgcm93cy5sZW5ndGggJiYgcm93c1swXS5sZW5ndGggPyBudW1Db2xzIC0gcm93c1swXS5sZW5ndGggOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXNbJ2NlbGxBc3BlY3RSYXRpbyddIHx8IGNvbHVtbkNoYW5nZXMgfHwgIXRoaXMuY2VsbFBhZGRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuY2VsbFBhZGRpbmcgPSBgJHsoNTAgKiB0aGlzLmNlbGxBc3BlY3RSYXRpbykgLyBudW1Db2xzfSVgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbkNoYW5nZXMgfHwgIXRoaXMuY2VsbFdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLmNlbGxXaWR0aCA9IGAkezEwMCAvIG51bUNvbHN9JWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy50b3VjaG1vdmVIYW5kbGVyLCBhY3RpdmVDYXB0dXJpbmdFdmVudE9wdGlvbnMpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLmVudGVySGFuZGxlciwgcGFzc2l2ZUNhcHR1cmluZ0V2ZW50T3B0aW9ucyk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmVudGVySGFuZGxlciwgcGFzc2l2ZUNhcHR1cmluZ0V2ZW50T3B0aW9ucyk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMubGVhdmVIYW5kbGVyLCBwYXNzaXZlQ2FwdHVyaW5nRXZlbnRPcHRpb25zKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5sZWF2ZUhhbmRsZXIsIHBhc3NpdmVDYXB0dXJpbmdFdmVudE9wdGlvbnMpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubW91c2Vkb3duSGFuZGxlciwgcGFzc2l2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMubW91c2Vkb3duSGFuZGxlciwgcGFzc2l2ZUV2ZW50T3B0aW9ucyk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5tb3VzZXVwSGFuZGxlcik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMudG91Y2hlbmRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBnZXRJbmRleChjb2xJbmRleDogbnVtYmVyLCByb3dJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke2NvbEluZGV4fSR7cm93SW5kZXh9YDtcbiAgICB9XG5cbiAgICBvbkRhdGVFbnRlcihpbmRleDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG92ZXJlZERhdGUgPSBpbmRleDtcbiAgICB9XG5cbiAgICBvbkRhdGVMZWF2ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3ZlcmVkRGF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFja2luZyBmdW5jdGlvbiBmb3Igcm93cyBiYXNlZCBvbiB0aGVpciBpZGVudGl0eS4gSWRlYWxseSB3ZSB3b3VsZCB1c2Ugc29tZSBzb3J0IG9mXG4gICAgICoga2V5IG9uIHRoZSByb3csIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgYSBicmVha2luZyBjaGFuZ2UgZm9yIHRoZSBgcm93c2AgaW5wdXQuIFdlIGRvbid0XG4gICAgICogdXNlIHRoZSBidWlsdC1pbiBpZGVudGl0eSB0cmFja2luZywgYmVjYXVzZSBpdCBsb2dzIHdhcm5pbmdzLlxuICAgICAqL1xuICAgIHRyYWNrUm93ID0gKHJvdzogQ2FsZW5kYXJDZWxsTW9kZWxbXSkgPT4gcm93O1xuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBjZWxsIGlzIGNsaWNrZWQuXG4gICAgICogQHBhcmFtIGNlbGxcbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKi9cbiAgICBjZWxsQ2xpY2tlZChjZWxsOiBDYWxlbmRhckNlbGxNb2RlbCwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gSWdub3JlIFwiY2xpY2tzXCIgdGhhdCBhcmUgYWN0dWFsbHkgY2FuY2VsZWQgZHJhZ3MgKGVnIHRoZSB1c2VyIGRyYWdnZWQgb2ZmIGFuZCB0aGVuIHdlbnQgYmFjayB0byB0aGlzIGNlbGwgdG8gdW5kbykuXG4gICAgICAgIGlmICh0aGlzLmRpZERyYWdTaW5jZU1vdXNlRG93bikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNlbGwuaXNFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVDaGFuZ2UuZW1pdCh7IHZhbHVlOiBjZWxsLnZhbHVlLCBldmVudCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVtaXRBY3RpdmVEYXRlQ2hhbmdlKGNlbGw6IENhbGVuZGFyQ2VsbE1vZGVsKTogdm9pZCB7XG4gICAgICAgIGlmIChjZWxsLmlzRW5hYmxlZCkge1xuICAgICAgICAgICAgY29uc3QgbW9udGggPSBjZWxsLnZhbHVlO1xuICAgICAgICAgICAgY29uc3Qgb2xkQWN0aXZlRGF0ZSA9IHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlKCk7XG4gICAgICAgICAgICBjb25zdCB0ZW1wRGF0ZSA9IHRoaXMuZ2V0RGF0ZUZyb21EYXlPZk1vbnRoKG9sZEFjdGl2ZURhdGUsIG1vbnRoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0ZVNlcnZpY2UuY29tcGFyZShvbGRBY3RpdmVEYXRlLCB0ZW1wRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuYWN0aXZlRGF0ZSA9IHRlbXBEYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIGEgY2VsbCBzaG91bGQgYmUgbWFya2VkIGFzIHNlbGVjdGVkLlxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqL1xuICAgIGlzU2VsZWN0ZWQodmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydFZhbHVlID09PSB2YWx1ZSB8fCB0aGlzLmVuZFZhbHVlID09PSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBjZWxsIGlzIGFjdGl2ZS5cbiAgICAgKiBAcGFyYW0gcm93SW5kZXhcbiAgICAgKiBAcGFyYW0gY29sSW5kZXhcbiAgICAgKi9cbiAgICBpc0FjdGl2ZUNlbGwocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY2VsbE51bWJlciA9IHJvd0luZGV4ICogdGhpcy5udW1Db2xzICsgY29sSW5kZXg7XG5cbiAgICAgICAgLy8gQWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgZmlyc3Qgcm93IG1heSBub3QgaGF2ZSBhcyBtYW55IGNlbGxzLlxuICAgICAgICBpZiAocm93SW5kZXgpIHtcbiAgICAgICAgICAgIGNlbGxOdW1iZXIgLT0gdGhpcy5maXJzdFJvd09mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjZWxsTnVtYmVyID09PSB0aGlzLmFjdGl2ZUNlbGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyB0aGUgYWN0aXZlIGNlbGwgYWZ0ZXIgdGhlIG1pY3JvdGFzayBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgKlxuICAgICAqIEFkZGluZyBhIDBtcyBzZXRUaW1lb3V0IHNlZW1zIHRvIGZpeCBWb2ljZW92ZXIgbG9zaW5nIGZvY3VzIHdoZW4gcHJlc3NpbmcgUGFnZVVwL1BhZ2VEb3duXG4gICAgICogKGlzc3VlICMyNDMzMCkuXG4gICAgICpcbiAgICAgKiBEZXRlcm1pbmVkIGEgMG1zIGJ5IGdyYWR1YWxseSBpbmNyZWFzaW5nIGR1cmF0aW9uIGZyb20gMCBhbmQgdGVzdGluZyB0d28gdXNlIGNhc2VzIHdpdGggc2NyZWVuXG4gICAgICogcmVhZGVyIGVuYWJsZWQ6XG4gICAgICpcbiAgICAgKiAxLiBQcmVzc2luZyBQYWdlVXAvUGFnZURvd24gcmVwZWF0ZWRseSB3aXRoIHBhdXNpbmcgYmV0d2VlbiBlYWNoIGtleSBwcmVzcy5cbiAgICAgKiAyLiBQcmVzc2luZyBhbmQgaG9sZGluZyB0aGUgUGFnZURvd24ga2V5IHdpdGggcmVwZWF0ZWQga2V5cyBlbmFibGVkLlxuICAgICAqXG4gICAgICogVGVzdCAxIHdvcmtlZCByb3VnaGx5IDk1LTk5JSBvZiB0aGUgdGltZSB3aXRoIDBtcyBhbmQgZ290IGEgbGl0dGxlIGJpdCBiZXR0ZXIgYXMgdGhlIGR1cmF0aW9uXG4gICAgICogaW5jcmVhc2VkLiBUZXN0IDIgZ290IHNsaWdodGx5IGJldHRlciB1bnRpbCB0aGUgZHVyYXRpb24gd2FzIGxvbmcgZW5vdWdoIHRvIGludGVyZmVyZSB3aXRoXG4gICAgICogcmVwZWF0ZWQga2V5cy4gSWYgdGhlIHJlcGVhdGVkIGtleSBzcGVlZCB3YXMgZmFzdGVyIHRoYW4gdGhlIHRpbWVvdXQgZHVyYXRpb24sIHRoZW4gcHJlc3NpbmdcbiAgICAgKiBhbmQgaG9sZGluZyBwYWdlZG93biBjYXVzZWQgdGhlIGVudGlyZSBwYWdlIHRvIHNjcm9sbC5cbiAgICAgKlxuICAgICAqIFNpbmNlIHJlcGVhdGVkIGtleSBzcGVlZCBjYW4gdmVyaWZ5IGFjcm9zcyBtYWNoaW5lcywgZGV0ZXJtaW5lZCB0aGF0IGFueSBkdXJhdGlvbiBjb3VsZFxuICAgICAqIHBvdGVudGlhbGx5IGludGVyZmVyZSB3aXRoIHJlcGVhdGVkIGtleXMuIDBtcyB3b3VsZCBiZSBiZXN0IGJlY2F1c2UgaXQgYWxtb3N0IGVudGlyZWx5XG4gICAgICogZWxpbWluYXRlcyB0aGUgZm9jdXMgYmVpbmcgbG9zdCBpbiBWb2ljZW92ZXIgKCMyNDMzMCkgd2l0aG91dCBjYXVzaW5nIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLlxuICAgICAqIEFkZGluZyBkZWxheSBhbHNvIGNvbXBsaWNhdGVzIHdyaXRpbmcgdGVzdHMuXG4gICAgICovXG4gICAgZm9jdXNBY3RpdmVDZWxsKG1vdmVQcmV2aWV3ID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudXBkLWNhbGVuZGFyLWJvZHktYWN0aXZlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhYWN0aXZlQ2VsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3ZlUHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcE5leHRGb2N1cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNlbGwuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvY3VzZXMgdGhlIGFjdGl2ZSBjZWxsIGFmdGVyIGNoYW5nZSBkZXRlY3Rpb24gaGFzIHJ1biBhbmQgdGhlIG1pY3JvdGFzayBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBzY2hlZHVsZUZvY3VzQWN0aXZlQ2VsbEFmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmVDZWxsQWZ0ZXJWaWV3Q2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIGEgdmFsdWUgaXMgdGhlIHN0YXJ0IG9mIHRoZSBtYWluIHJhbmdlLlxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqL1xuICAgIGlzUmFuZ2VTdGFydCh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3RhcnQodmFsdWUsIHRoaXMuc3RhcnRWYWx1ZSwgdGhpcy5lbmRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIEdldHMgd2hldGhlciBhIHZhbHVlIGlzIHRoZSBlbmQgb2YgdGhlIG1haW4gcmFuZ2UuICovXG4gICAgaXNSYW5nZUVuZCh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRW5kKHZhbHVlLCB0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBHZXRzIHdoZXRoZXIgYSB2YWx1ZSBpcyB3aXRoaW4gdGhlIGN1cnJlbnRseS1zZWxlY3RlZCByYW5nZS4gKi9cbiAgICBpc0luUmFuZ2UodmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0luc2lkZVJhbmdlKHZhbHVlLCB0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWUsIHRoaXMuaXNSYW5nZSk7XG4gICAgfVxuXG4gICAgLyoqIEdldHMgd2hldGhlciBhIHZhbHVlIGlzIHRoZSBzdGFydCBvZiB0aGUgY29tcGFyaXNvbiByYW5nZS4gKi9cbiAgICBpc0NvbXBhcmlzb25TdGFydCh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3RhcnQodmFsdWUsIHRoaXMuY29tcGFyaXNvblN0YXJ0LCB0aGlzLmNvbXBhcmlzb25FbmQpO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBjZWxsIGlzIGEgc3RhcnQgYnJpZGdlIGNlbGwgYmV0d2VlbiB0aGUgbWFpbiBhbmQgY29tcGFyaXNvbiByYW5nZXMuICovXG4gICAgaXNDb21wYXJpc29uQnJpZGdlU3RhcnQodmFsdWU6IG51bWJlciwgcm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuaXNDb21wYXJpc29uU3RhcnQodmFsdWUpIHx8IHRoaXMuaXNSYW5nZVN0YXJ0KHZhbHVlKSB8fCAhdGhpcy5pc0luUmFuZ2UodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJldmlvdXNDZWxsOiBDYWxlbmRhckNlbGxNb2RlbCB8IHVuZGVmaW5lZCA9IHRoaXMucm93c1tyb3dJbmRleF1bY29sSW5kZXggLSAxXTtcblxuICAgICAgICBpZiAoIXByZXZpb3VzQ2VsbCkge1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNSb3cgPSB0aGlzLnJvd3Nbcm93SW5kZXggLSAxXTtcbiAgICAgICAgICAgIHByZXZpb3VzQ2VsbCA9IHByZXZpb3VzUm93ICYmIHByZXZpb3VzUm93W3ByZXZpb3VzUm93Lmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXZpb3VzQ2VsbCAmJiAhdGhpcy5pc1JhbmdlRW5kKHByZXZpb3VzQ2VsbC5jb21wYXJlVmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBjZWxsIGlzIGFuIGVuZCBicmlkZ2UgY2VsbCBiZXR3ZWVuIHRoZSBtYWluIGFuZCBjb21wYXJpc29uIHJhbmdlcy4gKi9cbiAgICBpc0NvbXBhcmlzb25CcmlkZ2VFbmQodmFsdWU6IG51bWJlciwgcm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuaXNDb21wYXJpc29uRW5kKHZhbHVlKSB8fCB0aGlzLmlzUmFuZ2VFbmQodmFsdWUpIHx8ICF0aGlzLmlzSW5SYW5nZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuZXh0Q2VsbDogQ2FsZW5kYXJDZWxsTW9kZWwgfCB1bmRlZmluZWQgPSB0aGlzLnJvd3Nbcm93SW5kZXhdW2NvbEluZGV4ICsgMV07XG5cbiAgICAgICAgaWYgKCFuZXh0Q2VsbCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dFJvdyA9IHRoaXMucm93c1tyb3dJbmRleCArIDFdO1xuICAgICAgICAgICAgbmV4dENlbGwgPSBuZXh0Um93ICYmIG5leHRSb3dbMF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dENlbGwgJiYgIXRoaXMuaXNSYW5nZVN0YXJ0KG5leHRDZWxsLmNvbXBhcmVWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIEdldHMgd2hldGhlciBhIHZhbHVlIGlzIHRoZSBlbmQgb2YgdGhlIGNvbXBhcmlzb24gcmFuZ2UuICovXG4gICAgaXNDb21wYXJpc29uRW5kKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNFbmQodmFsdWUsIHRoaXMuY29tcGFyaXNvblN0YXJ0LCB0aGlzLmNvbXBhcmlzb25FbmQpO1xuICAgIH1cblxuICAgIC8qKiBHZXRzIHdoZXRoZXIgYSB2YWx1ZSBpcyB3aXRoaW4gdGhlIGN1cnJlbnQgY29tcGFyaXNvbiByYW5nZS4gKi9cbiAgICBpc0luQ29tcGFyaXNvblJhbmdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnNpZGVSYW5nZSh2YWx1ZSwgdGhpcy5jb21wYXJpc29uU3RhcnQsIHRoaXMuY29tcGFyaXNvbkVuZCwgdGhpcy5pc1JhbmdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHdoZXRoZXIgYSB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgY29tcGFyaXNvbiByYW5nZS5cbiAgICAgKiBGb3IgY29udGV4dCwgdGhlIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSB0byBkZXRlcm1pbmUgd2hldGhlciBzb21ldGhpbmcgaXMgdGhlIHN0YXJ0L2VuZCBvZlxuICAgICAqIGEgcmFuZ2UgZG9uJ3QgYWxsb3cgZm9yIHRoZSBzdGFydCBhbmQgZW5kIHRvIGJlIG9uIHRoZSBzYW1lIGRheSwgYmVjYXVzZSB3ZSdkIGhhdmUgdG8gdXNlXG4gICAgICogbXVjaCBtb3JlIHNwZWNpZmljIENTUyBzZWxlY3RvcnMgdG8gc3R5bGUgdGhlbSBjb3JyZWN0bHkgaW4gYWxsIHNjZW5hcmlvcy4gVGhpcyBpcyBmaW5lIGZvclxuICAgICAqIHRoZSByZWd1bGFyIHJhbmdlLCBiZWNhdXNlIHdoZW4gaXQgaGFwcGVucywgdGhlIHNlbGVjdGVkIHN0eWxlcyB0YWtlIG92ZXIgYW5kIHN0aWxsIHNob3cgd2hlcmVcbiAgICAgKiB0aGUgcmFuZ2Ugd291bGQndmUgYmVlbiwgaG93ZXZlciB3ZSBkb24ndCBoYXZlIHRoZXNlIHNlbGVjdGVkIHN0eWxlcyBmb3IgYSBjb21wYXJpc29uIHJhbmdlLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhcHBseSBhIGNsYXNzIHRoYXQgc2VydmVzIHRoZSBzYW1lIHB1cnBvc2UgYXMgdGhlIG9uZSBmb3Igc2VsZWN0ZWRcbiAgICAgKiBkYXRlcywgYnV0IGl0IG9ubHkgYXBwbGllcyBpbiB0aGUgY29udGV4dCBvZiBhIGNvbXBhcmlzb24gcmFuZ2UuXG4gICAgICovXG4gICAgaXNDb21wYXJpc29uSWRlbnRpY2FsKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gbnVsbCBjaGVjayB0aGUgc3RhcnQvZW5kXG4gICAgICAgIC8vIGhlcmUsIGJlY2F1c2UgdGhlIGB2YWx1ZWAgd2lsbCBhbHdheXMgYmUgZGVmaW5lZC5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyaXNvblN0YXJ0ID09PSB0aGlzLmNvbXBhcmlzb25FbmQgJiYgdmFsdWUgPT09IHRoaXMuY29tcGFyaXNvblN0YXJ0O1xuICAgIH1cblxuICAgIC8qKiBHZXRzIHdoZXRoZXIgYSB2YWx1ZSBpcyB0aGUgc3RhcnQgb2YgdGhlIHByZXZpZXcgcmFuZ2UuICovXG4gICAgaXNQcmV2aWV3U3RhcnQodmFsdWU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1N0YXJ0KHZhbHVlLCB0aGlzLnByZXZpZXdTdGFydCwgdGhpcy5wcmV2aWV3RW5kKTtcbiAgICB9XG5cbiAgICAvKiogR2V0cyB3aGV0aGVyIGEgdmFsdWUgaXMgdGhlIGVuZCBvZiB0aGUgcHJldmlldyByYW5nZS4gKi9cbiAgICBpc1ByZXZpZXdFbmQodmFsdWU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0VuZCh2YWx1ZSwgdGhpcy5wcmV2aWV3U3RhcnQsIHRoaXMucHJldmlld0VuZCk7XG4gICAgfVxuXG4gICAgLyoqIEdldHMgd2hldGhlciBhIHZhbHVlIGlzIGluc2lkZSB0aGUgcHJldmlldyByYW5nZS4gKi9cbiAgICBpc0luUHJldmlldyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdpcyBpbiByYW5nZScsIHRoaXMuaXNJbnNpZGVSYW5nZSh2YWx1ZSwgdGhpcy5wcmV2aWV3U3RhcnQsIHRoaXMucHJldmlld0VuZCwgdGhpcy5pc1JhbmdlKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5zaWRlUmFuZ2UodmFsdWUsIHRoaXMucHJldmlld1N0YXJ0LCB0aGlzLnByZXZpZXdFbmQsIHRoaXMuaXNSYW5nZSk7XG4gICAgfVxuXG4gICAgLyoqIEdldHMgaWRzIG9mIGFyaWEgZGVzY3JpcHRpb25zIGZvciB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhIGRhdGUgcmFuZ2UuICovXG4gICAgZ2V0RGVzY3JpYmVkYnkodmFsdWU6IG51bWJlcik6IE9wdGlvbmFsVHlwZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzUmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGFydFZhbHVlID09PSB2YWx1ZSAmJiB0aGlzLmVuZFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuc3RhcnREYXRlTGFiZWxJZH0gJHt0aGlzLmVuZERhdGVMYWJlbElkfWA7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGFydFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnREYXRlTGFiZWxJZDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVuZFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5kRGF0ZUxhYmVsSWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIHdoZW4gdGhlIHVzZXIgZW50ZXJzIGFuIGVsZW1lbnRcbiAgICAgKiBpbnNpZGUgdGhlIGNhbGVuZGFyIGJvZHkgKGUuZy4gYnkgaG92ZXJpbmcgaW4gb3IgZm9jdXMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZW50ZXJIYW5kbGVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5za2lwTmV4dEZvY3VzICYmIGV2ZW50LnR5cGUgPT09ICdmb2N1cycpIHtcbiAgICAgICAgICAgIHRoaXMuc2tpcE5leHRGb2N1cyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIGhpdCB0aGUgem9uZSB3aGVuIHdlJ3JlIHNlbGVjdGluZyBhIHJhbmdlLlxuICAgICAgICBpZiAoISFldmVudC50YXJnZXQgJiYgdGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5nZXRDZWxsRnJvbUVsZW1lbnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcblxuICAgICAgICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5wcmV2aWV3Q2hhbmdlLmVtaXQoeyB2YWx1ZTogY2VsbC5pc0VuYWJsZWQgPyBjZWxsIDogdW5kZWZpbmVkLCBldmVudCB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB0b3VjaG1vdmVIYW5kbGVyID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc1JhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmdldEFjdHVhbFRvdWNoVGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgY29uc3QgY2VsbCA9IHRhcmdldCA/IHRoaXMuZ2V0Q2VsbEZyb21FbGVtZW50KHRhcmdldCBhcyBIVE1MRWxlbWVudCkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHRhcmdldCAhPT0gZXZlbnQudGFyZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLmRpZERyYWdTaW5jZU1vdXNlRG93biA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgaW5pdGlhbCB0YXJnZXQgb2YgdGhlIHRvdWNoIGlzIGEgZGF0ZSBjZWxsLCBwcmV2ZW50IGRlZmF1bHQgc29cbiAgICAgICAgLy8gdGhhdCB0aGUgbW92ZSBpcyBub3QgaGFuZGxlZCBhcyBhIHNjcm9sbC5cbiAgICAgICAgaWYgKHRoaXMuZ2V0Q2VsbEVsZW1lbnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnByZXZpZXdDaGFuZ2UuZW1pdCh7IHZhbHVlOiBjZWxsPy5pc0VuYWJsZWQgPyBjZWxsIDogdW5kZWZpbmVkLCBldmVudCB9KSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIHdoZW4gdGhlIHVzZXIncyBwb2ludGVyIGxlYXZlcyBhbiBlbGVtZW50XG4gICAgICogaW5zaWRlIHRoZSBjYWxlbmRhciBib2R5IChlLmcuIGJ5IGhvdmVyaW5nIG91dCBvciBibHVycmluZykuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsZWF2ZUhhbmRsZXIgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBoaXQgdGhlIHpvbmUgd2hlbiB3ZSdyZSBzZWxlY3RpbmcgYSByYW5nZS5cbiAgICAgICAgaWYgKHRoaXMucHJldmlld0VuZCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXNSYW5nZSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgIT09ICdibHVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlkRHJhZ1NpbmNlTW91c2VEb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT25seSByZXNldCB0aGUgcHJldmlldyBlbmQgdmFsdWUgd2hlbiBsZWF2aW5nIGNlbGxzLiBUaGlzIGxvb2tzIGJldHRlciwgYmVjYXVzZVxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIGdhcCBiZXR3ZWVuIHRoZSBjZWxscyBhbmQgdGhlIHJvd3MgYW5kIHdlIGRvbid0IHdhbnQgdG8gcmVtb3ZlIHRoZVxuICAgICAgICAgICAgLy8gcmFuZ2UganVzdCBmb3IgaXQgdG8gc2hvdyB1cCBhZ2FpbiB3aGVuIHRoZSB1c2VyIG1vdmVzIGEgZmV3IHBpeGVscyB0byB0aGUgc2lkZS5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBldmVudC50YXJnZXQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmdldENlbGxGcm9tRWxlbWVudChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgKGV2ZW50IGFzIE1vdXNlRXZlbnQpLnJlbGF0ZWRUYXJnZXQgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDZWxsRnJvbUVsZW1lbnQoKGV2ZW50IGFzIE1vdXNlRXZlbnQpLnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMucHJldmlld0NoYW5nZS5lbWl0KHsgdmFsdWU6IHVuZGVmaW5lZCwgZXZlbnQgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBvbiBtb3VzZWRvd24gb3IgdG91Y2hzdGFydCBvbiBhIGRhdGUgY2VsbC5cbiAgICAgKiBSZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgYSBkcmFnIHNlcXVlbmNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgbW91c2Vkb3duSGFuZGxlciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzUmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlkRHJhZ1NpbmNlTW91c2VEb3duID0gZmFsc2U7XG4gICAgICAgIC8vIEJlZ2luIGEgZHJhZyBpZiBhIGNlbGwgd2l0aGluIHRoZSBjdXJyZW50IHJhbmdlIHdhcyB0YXJnZXRlZC5cbiAgICAgICAgY29uc3QgY2VsbCA9IGV2ZW50LnRhcmdldCAmJiB0aGlzLmdldENlbGxGcm9tRWxlbWVudChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuXG4gICAgICAgIGlmICghY2VsbCB8fCAhdGhpcy5pc0luUmFuZ2UoY2VsbC5jb21wYXJlVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnRlZC5lbWl0KHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogY2VsbC5yYXdWYWx1ZSEsXG4gICAgICAgICAgICAgICAgZXZlbnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqIFRyaWdnZXJlZCBvbiBtb3VzZXVwIGFueXdoZXJlLiBSZXNwb25zaWJsZSBmb3IgZW5kaW5nIGEgZHJhZyBzZXF1ZW5jZS4gKi9cbiAgICBwcml2YXRlIG1vdXNldXBIYW5kbGVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNSYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2VsbEVsZW1lbnQgPSB0aGlzLmdldENlbGxFbGVtZW50KGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGlmICghY2VsbEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE1vdXNldXAgaGFwcGVuZWQgb3V0c2lkZSBvZiBkYXRlcGlja2VyLiBDYW5jZWwgZHJhZy5cbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnRW5kZWQuZW1pdCh7IHZhbHVlOiB1bmRlZmluZWQsIGV2ZW50IH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2VsbEVsZW1lbnQuY2xvc2VzdCgnLnVwZC1jYWxlbmRhci1ib2R5JykgIT09IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBNb3VzZXVwIGhhcHBlbmVkIGluc2lkZSBhIGRpZmZlcmVudCBtb250aCBpbnN0YW5jZS5cbiAgICAgICAgICAgIC8vIEFsbG93IGl0IHRvIGhhbmRsZSB0aGUgZXZlbnQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuZ2V0Q2VsbEZyb21FbGVtZW50KGNlbGxFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VuZGVkLmVtaXQoeyB2YWx1ZTogY2VsbD8ucmF3VmFsdWUgPz8gdW5kZWZpbmVkLCBldmVudCB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKiBUcmlnZ2VyZWQgb24gdG91Y2hlbmQgYW55d2hlcmUuIFJlc3Bzb25zaWJsZSBmb3IgZW5kaW5nIGEgZHJhZyBzZXF1ZW5jZS4gKi9cbiAgICBwcml2YXRlIHRvdWNoZW5kSGFuZGxlciA9IChldmVudDogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmdldEFjdHVhbFRvdWNoVGFyZ2V0KGV2ZW50KTtcblxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLm1vdXNldXBIYW5kbGVyKHsgdGFyZ2V0IH0gYXMgdW5rbm93biBhcyBFdmVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIEZpbmRzIHRoZSBDYWxlbmRhckNlbGwgdGhhdCBjb3JyZXNwb25kcyB0byBhIERPTSBub2RlLiAqL1xuICAgIHByaXZhdGUgZ2V0Q2VsbEZyb21FbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogT3B0aW9uYWxUeXBlPENhbGVuZGFyQ2VsbE1vZGVsPiB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmdldENlbGxFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgIGlmICghIWNlbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGNlbGwuZ2V0QXR0cmlidXRlKCdkYXRhLXVwZC1yb3cnKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IGNlbGwuZ2V0QXR0cmlidXRlKCdkYXRhLXVwZC1jb2wnKTtcblxuICAgICAgICAgICAgaWYgKHJvdyAmJiBjb2wpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dzW3BhcnNlSW50KHJvdywgMTApXVtwYXJzZUludChjb2wsIDEwKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSB0YWJsZSBjZWxsIGVsZW1lbnQuICovXG4gICAgcHJpdmF0ZSBpc1RhYmxlQ2VsbChub2RlOiBPcHRpb25hbFR5cGU8Tm9kZT4pOiBub2RlIGlzIEhUTUxUYWJsZUNlbGxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIG5vZGU/Lm5vZGVOYW1lID09PSAnRElWJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkYXRlIHRhYmxlIGNlbGwgZWxlbWVudCB0aGF0IGlzIG9yIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKiBPciByZXR1cm5zIG51bGwgaWYgZWxlbWVudCBpcyBub3QgcGFydCBvZiBhIGRhdGUgY2VsbC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldENlbGxFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogT3B0aW9uYWxUeXBlPEhUTUxFbGVtZW50PiB7XG4gICAgICAgIGxldCBjZWxsOiBPcHRpb25hbFR5cGU8SFRNTEVsZW1lbnQ+O1xuXG4gICAgICAgIGlmICh0aGlzLmlzVGFibGVDZWxsKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBjZWxsID0gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVGFibGVDZWxsKGVsZW1lbnQucGFyZW50Tm9kZSB8fCB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBjZWxsID0gZWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUYWJsZUNlbGwoZWxlbWVudC5wYXJlbnROb2RlPy5wYXJlbnROb2RlIHx8IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIGNlbGwgPSBlbGVtZW50LnBhcmVudE5vZGUhLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2VsbD8uZ2V0QXR0cmlidXRlKCdkYXRhLXVwZC1yb3cnKSAhPT0gdW5kZWZpbmVkID8gY2VsbCA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKiogQ2hlY2tzIHdoZXRoZXIgYSB2YWx1ZSBpcyB0aGUgc3RhcnQgb2YgYSByYW5nZS4gKi9cbiAgICBwcml2YXRlIGlzU3RhcnQodmFsdWU6IG51bWJlciwgc3RhcnQ6IE9wdGlvbmFsVHlwZTxudW1iZXI+LCBlbmQ6IE9wdGlvbmFsVHlwZTxudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBlbmQgIT09IHVuZGVmaW5lZCAmJiBzdGFydCAhPT0gZW5kICYmIHZhbHVlIDwgZW5kICYmIHZhbHVlID09PSBzdGFydDtcbiAgICB9XG5cbiAgICAvKiogQ2hlY2tzIHdoZXRoZXIgYSB2YWx1ZSBpcyB0aGUgZW5kIG9mIGEgcmFuZ2UuICovXG4gICAgcHJpdmF0ZSBpc0VuZCh2YWx1ZTogbnVtYmVyLCBzdGFydDogT3B0aW9uYWxUeXBlPG51bWJlcj4sIGVuZDogT3B0aW9uYWxUeXBlPG51bWJlcj4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICE9PSB1bmRlZmluZWQgJiYgc3RhcnQgIT09IGVuZCAmJiB2YWx1ZSA+PSBzdGFydCAmJiB2YWx1ZSA9PT0gZW5kO1xuICAgIH1cblxuICAgIC8qKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGluc2lkZSBvZiBhIHJhbmdlLiAqL1xuICAgIHByaXZhdGUgaXNJbnNpZGVSYW5nZSh2YWx1ZTogbnVtYmVyLCBzdGFydDogT3B0aW9uYWxUeXBlPG51bWJlcj4sIGVuZDogT3B0aW9uYWxUeXBlPG51bWJlcj4sIHJhbmdlRW5hYmxlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHJhbmdlRW5hYmxlZCAmJiBzdGFydCAhPT0gdW5kZWZpbmVkICYmIGVuZCAhPT0gdW5kZWZpbmVkICYmIHN0YXJ0ICE9PSBlbmQgJiYgdmFsdWUgPj0gc3RhcnQgJiYgdmFsdWUgPD0gZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgZWxlbWVudCB0aGF0IGFjdHVhbGx5IGNvcnJlc3BvbmRzIHRvIGEgdG91Y2ggZXZlbnQncyBsb2NhdGlvblxuICAgICAqIChyYXRoZXIgdGhhbiB0aGUgZWxlbWVudCB0aGF0IGluaXRpYXRlZCB0aGUgc2VxdWVuY2Ugb2YgdG91Y2ggZXZlbnRzKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEFjdHVhbFRvdWNoVGFyZ2V0KGV2ZW50OiBUb3VjaEV2ZW50KTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCB0b3VjaExvY2F0aW9uID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHRvdWNoTG9jYXRpb24uY2xpZW50WCwgdG91Y2hMb2NhdGlvbi5jbGllbnRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIGRheSBvZiB0aGUgbW9udGggYW5kIHJldHVybnMgYSBuZXcgZGF0ZSBpbiB0aGUgc2FtZSBtb250aCBhbmQgeWVhciBhcyB0aGUgY3VycmVudGx5XG4gICAgICogIGFjdGl2ZSBkYXRlLiBUaGUgcmV0dXJuZWQgZGF0ZSB3aWxsIGhhdmUgdGhlIHNhbWUgZGF5IG9mIHRoZSBtb250aCBhcyB0aGUgYXJndW1lbnQgZGF0ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldERhdGVGcm9tRGF5T2ZNb250aChhY3RpdmVEYXRlOiBEYXRlLCBkYXlPZk1vbnRoOiBudW1iZXIpOiBEYXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVNlcnZpY2UuY3JlYXRlKGFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSwgYWN0aXZlRGF0ZS5nZXRNb250aCgpLCBkYXlPZk1vbnRoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgPCEtLVxuICAgICAgSWYgdGhlcmUncyBub3QgZW5vdWdoIHNwYWNlIGluIHRoZSBmaXJzdCByb3csIGNyZWF0ZSBhIHNlcGFyYXRlIGxhYmVsIHJvdy4gV2UgbWFyayB0aGlzIHJvdyBhc1xuICAgICAgYXJpYS1oaWRkZW4gYmVjYXVzZSB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIHJlYWQgb3V0IGFzIG9uZSBvZiB0aGUgd2Vla3MgaW4gdGhlIG1vbnRoLlxuICAgIC0tPlxuICAgIEBpZiAoZmlyc3RSb3dPZmZzZXQgPCBsYWJlbE1pblJlcXVpcmVkQ2VsbHMpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBzZXZlbi1jb2xzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTcgcC0xIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBbc3R5bGUubWluLWhlaWdodC5weF09XCI0MFwiPlxuICAgICAgICAgICAgICAgIHt7IGxhYmVsIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBDcmVhdGUgdGhlIGZpcnN0IHJvdyBzZXBhcmF0ZWx5IHNvIHdlIGNhbiBpbmNsdWRlIGEgc3BlY2lhbCBzcGFjZXIgY2VsbC4gLS0+XG4gICAgQGZvciAocm93IG9mIHJvd3M7IHRyYWNrIHRyYWNrUm93KHJvdyk7IGxldCByb3dJbmRleCA9ICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHNldmVuLWNvbHNcIj5cbiAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgICAgVGhpcyBjZWxsIGlzIHB1cmVseSBkZWNvcmF0aXZlLCBidXQgd2UgY2FuJ3QgcHV0IGBhcmlhLWhpZGRlbmAgb3IgYHJvbGU9XCJwcmVzZW50YXRpb25cImAgb24gaXQsXG4gICAgICAgICAgICAgIGJlY2F1c2UgaXQgdGhyb3dzIG9mZiB0aGUgd2VlayBkYXlzIGZvciB0aGUgcmVzdCBvZiB0aGUgcm93IG9uIE5WREEuIFRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlXG4gICAgICAgICAgICAgIHRhYmxlIGNlbGxzIGlzIG1haW50YWluZWQgYnkgc2V0dGluZyB0aGUgdG9wIGFuZCBib3R0b20gcGFkZGluZyBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHdpZHRoXG4gICAgICAgICAgICAgIChhIHZhcmlhbnQgb2YgdGhlIHRyaWNrIGRlc2NyaWJlZCBoZXJlOiBodHRwczovL3d3dy53M3NjaG9vbHMuY29tL2hvd3RvL2hvd3RvX2Nzc19hc3BlY3RfcmF0aW8uYXNwKS5cbiAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgQGlmIChyb3dJbmRleCA9PT0gMCAmJiBmaXJzdFJvd09mZnNldCkge1xuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiY29sc3BhbkNsYXNzXCIgY2xhc3M9XCJwLTEgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cIjQwXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZpcnN0Um93T2Zmc2V0ID49IGxhYmVsTWluUmVxdWlyZWRDZWxscyA/IGxhYmVsIDogJycgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgICBFYWNoIGdyaWRjZWxsIGluIHRoZSBjYWxlbmRhciBjb250YWlucyBhIGJ1dHRvbiwgd2hpY2ggc2lnbmFscyB0byBhc3Npc3RpdmUgdGVjaG5vbG9neSB0aGF0IHRoZVxuICAgICAgICAgICAgICBjZWxsIGlzIGludGVyYWN0YWJsZSwgYXMgd2VsbCBhcyB0aGUgc2VsZWN0aW9uIHN0YXRlIHZpYSBgYXJpYS1wcmVzc2VkYC4gU2VlICMyMzQ3NiBmb3JcbiAgICAgICAgICAgICAgYmFja2dyb3VuZC5cbiAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgQGZvciAoaXRlbSBvZiByb3c7IHRyYWNrIGl0ZW0uaWQ7IGxldCBjb2xJbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyXCIgW2F0dHIuZGF0YS11cGQtcm93XT1cInJvd0luZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS11cGQtY29sXT1cImNvbEluZGV4XCIgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiNDBcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctc2Vjb25kYXJ5LWx0XT1cImhvdmVyZWREYXRlID09PSBnZXRJbmRleChyb3dJbmRleCwgY29sSW5kZXgpXCIgW2NsYXNzLmJvcmRlcl09XCJpc0FjdGl2ZUNlbGwocm93SW5kZXgsIGNvbEluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItc2Vjb25kYXJ5XT1cImlzQWN0aXZlQ2VsbChyb3dJbmRleCwgY29sSW5kZXgpXCIgW2NsYXNzLmJnLWF6dXJlXT1cImlzU2VsZWN0ZWQoaXRlbS5jb21wYXJlVmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtYXp1cmUtZmddPVwiaXNTZWxlY3RlZChpdGVtLmNvbXBhcmVWYWx1ZSlcIiBbdGFiaW5kZXhdPVwiaXNBY3RpdmVDZWxsKHJvd0luZGV4LCBjb2xJbmRleCkgPyAwIDogLTFcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MudXBkLWNhbGVuZGFyLWJvZHktZGlzYWJsZWRdPVwiIWl0ZW0uaXNFbmFibGVkXCIgW2NsYXNzLmJnLWRhbmdlcl09XCJpc1JhbmdlU3RhcnQoaXRlbS5jb21wYXJlVmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtZGFuZ2VyLWZnXT1cImlzUmFuZ2VTdGFydChpdGVtLmNvbXBhcmVWYWx1ZSlcIiBbY2xhc3MuYmctbXV0ZWRdPVwiaXNSYW5nZUVuZChpdGVtLmNvbXBhcmVWYWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1tdXRlZC1mZ109XCJpc1JhbmdlRW5kKGl0ZW0uY29tcGFyZVZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy51cGQtY2FsZW5kYXItYm9keS1yYW5nZS1lbmRdPVwiaXNSYW5nZUVuZChpdGVtLmNvbXBhcmVWYWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MudXBkLWNhbGVuZGFyLWJvZHktaW4tcmFuZ2VdPVwiaXNJblJhbmdlKGl0ZW0uY29tcGFyZVZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy51cGQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydF09XCJpc0NvbXBhcmlzb25CcmlkZ2VTdGFydChpdGVtLmNvbXBhcmVWYWx1ZSwgcm93SW5kZXgsIGNvbEluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy51cGQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmRdPVwiaXNDb21wYXJpc29uQnJpZGdlRW5kKGl0ZW0uY29tcGFyZVZhbHVlLCByb3dJbmRleCwgY29sSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnVwZC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tc3RhcnRdPVwiaXNDb21wYXJpc29uU3RhcnQoaXRlbS5jb21wYXJlVmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnVwZC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tZW5kXT1cImlzQ29tcGFyaXNvbkVuZChpdGVtLmNvbXBhcmVWYWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MudXBkLWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZV09XCJpc0luQ29tcGFyaXNvblJhbmdlKGl0ZW0uY29tcGFyZVZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5yb3VuZGVkLXN0YXJ0XT1cImlzUHJldmlld1N0YXJ0KGl0ZW0uY29tcGFyZVZhbHVlKVwiIFtjbGFzcy5yb3VuZGVkLWVuZF09XCJpc1ByZXZpZXdFbmQoaXRlbS5jb21wYXJlVmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci10b3BdPVwiaXNJblByZXZpZXcoaXRlbS5jb21wYXJlVmFsdWUpXCIgW2NsYXNzLmZ3LWJvbGRdPVwiaXNJblByZXZpZXcoaXRlbS5jb21wYXJlVmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ib3R0b21dPVwiaXNJblByZXZpZXcoaXRlbS5jb21wYXJlVmFsdWUpXCIgW2NsYXNzLmJvcmRlci1zZWNvbmRhcnktbHRdPVwiaXNJblByZXZpZXcoaXRlbS5jb21wYXJlVmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpdGVtLmFyaWFMYWJlbFwiIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIWl0ZW0uaXNFbmFibGVkIHx8IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJpc1NlbGVjdGVkKGl0ZW0uY29tcGFyZVZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJ0b2RheVZhbHVlID09PSBpdGVtLmNvbXBhcmVWYWx1ZSA/ICdkYXRlJyA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZ2V0RGVzY3JpYmVkYnkoaXRlbS5jb21wYXJlVmFsdWUpXCIgKGNsaWNrKT1cImNlbGxDbGlja2VkKGl0ZW0sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwiZW1pdEFjdGl2ZURhdGVDaGFuZ2UoaXRlbSlcIiAobW91c2VlbnRlcik9XCJvbkRhdGVFbnRlcihnZXRJbmRleChyb3dJbmRleCwgY29sSW5kZXgpKVwiXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uRGF0ZUxlYXZlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzLnVwZC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQoaXRlbS5jb21wYXJlVmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy51cGQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbF09XCJpc0NvbXBhcmlzb25JZGVudGljYWwoaXRlbS5jb21wYXJlVmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy51cGQtY2FsZW5kYXItYm9keS10b2RheV09XCJ0b2RheVZhbHVlID09PSBpdGVtLmNvbXBhcmVWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGlzcGxheVZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPGxhYmVsIFtpZF09XCJzdGFydERhdGVMYWJlbElkXCIgY2xhc3M9XCJ1cGQtY2FsZW5kYXItYm9keS1oaWRkZW4tbGFiZWxcIj5cbiAgICAgICAge3sgc3RhcnREYXRlQWNjZXNzaWJsZU5hbWUgfX1cbiAgICA8L2xhYmVsPlxuICAgIDxsYWJlbCBbaWRdPVwiZW5kRGF0ZUxhYmVsSWRcIiBjbGFzcz1cInVwZC1jYWxlbmRhci1ib2R5LWhpZGRlbi1sYWJlbFwiPlxuICAgICAgICB7eyBlbmREYXRlQWNjZXNzaWJsZU5hbWUgfX1cbiAgICA8L2xhYmVsPlxuPC9kaXY+XG4iXX0=
|