novo-elements 5.1.1 → 5.2.3
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 +7 -7
- package/bundles/novo-elements.umd.js +42693 -42665
- package/bundles/novo-elements.umd.js.map +1 -1
- package/bundles/novo-elements.umd.min.js +2 -2
- package/bundles/novo-elements.umd.min.js.map +1 -1
- package/elements/ace-editor/AceEditor.d.ts +37 -37
- package/elements/ace-editor/AceEditor.module.d.ts +2 -2
- package/elements/ace-editor/AceEditor.scss +5 -0
- package/elements/button/Button.d.ts +9 -9
- package/elements/button/Button.module.d.ts +2 -2
- package/elements/button/Button.scss +397 -0
- package/elements/calendar/Calendar.module.d.ts +2 -2
- package/elements/calendar/common/CalendarDateChange.d.ts +25 -25
- package/elements/calendar/common/CalendarDateChange.scss +23 -0
- package/elements/calendar/common/EventTypeLegend.d.ts +7 -7
- package/elements/calendar/day/CalendarAllDayEvent.d.ts +7 -7
- package/elements/calendar/day/CalendarDayEvent.d.ts +8 -8
- package/elements/calendar/day/CalendarDayView.d.ts +148 -148
- package/elements/calendar/day/CalendarDayView.scss +97 -0
- package/elements/calendar/day/CalendarHourSegment.d.ts +7 -7
- package/elements/calendar/month/CalendarMonthDay.d.ts +14 -14
- package/elements/calendar/month/CalendarMonthHeader.d.ts +14 -14
- package/elements/calendar/month/CalendarMonthView.d.ts +110 -110
- package/elements/calendar/month/CalendarMonthView.scss +169 -0
- package/elements/calendar/pipe/DayOfMonth.pipe.d.ts +6 -6
- package/elements/calendar/pipe/EndOfWeekDisplayPipe.pipe.d.ts +6 -6
- package/elements/calendar/pipe/Hours.pipe.d.ts +6 -6
- package/elements/calendar/pipe/Month.pipe.d.ts +6 -6
- package/elements/calendar/pipe/MonthDay.pipe.d.ts +6 -6
- package/elements/calendar/pipe/Weekday.pipe.d.ts +6 -6
- package/elements/calendar/pipe/Year.pipe.d.ts +6 -6
- package/elements/calendar/week/CalendarWeekEvent.d.ts +8 -8
- package/elements/calendar/week/CalendarWeekHeader.d.ts +14 -14
- package/elements/calendar/week/CalendarWeekView.d.ts +156 -156
- package/elements/calendar/week/CalendarWeekView.scss +86 -0
- package/elements/card/Card.d.ts +28 -28
- package/elements/card/Card.module.d.ts +2 -2
- package/elements/card/Card.scss +104 -0
- package/elements/category-dropdown/CategoryDropdown.d.ts +29 -29
- package/elements/category-dropdown/CategoryDropdown.module.d.ts +2 -2
- package/elements/category-dropdown/CategoryDropdown.scss +157 -0
- package/elements/chips/Chips.d.ts +78 -78
- package/elements/chips/Chips.module.d.ts +2 -2
- package/elements/chips/Chips.scss +373 -0
- package/elements/chips/RowChips.d.ts +12 -12
- package/elements/ckeditor/CKEditor.d.ts +44 -44
- package/elements/ckeditor/CKEditor.module.d.ts +2 -2
- package/elements/ckeditor/CKEditor.scss +37 -0
- package/elements/common/common.module.d.ts +2 -2
- package/elements/common/novo-template/novo-template.directive.d.ts +8 -8
- package/elements/data-table/ListInteractionTypes.d.ts +10 -10
- package/elements/data-table/cell-headers/data-table-checkbox-header-cell.component.d.ts +15 -15
- package/elements/data-table/cell-headers/data-table-expand-header-cell.component.d.ts +13 -13
- package/elements/data-table/cell-headers/data-table-header-cell.component.d.ts +81 -81
- package/elements/data-table/cell-headers/data-table-header-cell.directive.d.ts +11 -11
- package/elements/data-table/cells/data-table-cell.component.d.ts +17 -17
- package/elements/data-table/cells/data-table-checkbox-cell.component.d.ts +17 -17
- package/elements/data-table/cells/data-table-expand-cell.component.d.ts +16 -16
- package/elements/data-table/data-table-clear-button.component.d.ts +15 -15
- package/elements/data-table/data-table-expand.directive.d.ts +18 -18
- package/elements/data-table/data-table.component.d.ts +99 -99
- package/elements/data-table/data-table.component.scss +753 -0
- package/elements/data-table/data-table.module.d.ts +2 -2
- package/elements/data-table/data-table.pipes.d.ts +37 -37
- package/elements/data-table/data-table.source.d.ts +22 -22
- package/elements/data-table/interfaces.d.ts +128 -128
- package/elements/data-table/pagination/data-table-pagination.component.d.ts +52 -52
- package/elements/data-table/rows/data-table-header-row.component.d.ts +6 -6
- package/elements/data-table/rows/data-table-row.component.d.ts +7 -7
- package/elements/data-table/services/data-table-filter-utils.d.ts +3 -3
- package/elements/data-table/services/remote-data-table.service.d.ts +8 -8
- package/elements/data-table/services/static-data-table.service.d.ts +12 -12
- package/elements/data-table/sort-filter/sort-filter.directive.d.ts +8 -8
- package/elements/data-table/state/data-table-state.service.d.ts +32 -32
- package/elements/date-picker/DatePicker.d.ts +79 -79
- package/elements/date-picker/DatePicker.module.d.ts +2 -2
- package/elements/date-picker/DatePicker.scss +414 -0
- package/elements/date-picker/DatePickerInput.d.ts +66 -66
- package/elements/date-time-picker/DateTimePicker.d.ts +45 -45
- package/elements/date-time-picker/DateTimePicker.module.d.ts +2 -2
- package/elements/date-time-picker/DateTimePickerInput.d.ts +46 -46
- package/elements/date-time-picker/_DateTimePicker.scss +93 -0
- package/elements/dragula/Dragula.d.ts +13 -13
- package/elements/dragula/Dragula.module.d.ts +2 -2
- package/elements/dragula/Dragula.scss +18 -0
- package/elements/dragula/DragulaService.d.ts +23 -23
- package/elements/dropdown/Dropdown.d.ts +55 -55
- package/elements/dropdown/Dropdown.module.d.ts +2 -2
- package/elements/dropdown/Dropdown.scss +94 -0
- package/elements/expansion/_expansion-theme.scss +50 -0
- package/elements/expansion/accordion.d.ts +21 -21
- package/elements/expansion/expansion-animations.d.ts +9 -9
- package/elements/expansion/expansion-panel-content.d.ts +9 -9
- package/elements/expansion/expansion-panel-header.d.ts +45 -45
- package/elements/expansion/expansion-panel-header.scss +58 -0
- package/elements/expansion/expansion-panel.d.ts +54 -54
- package/elements/expansion/expansion-panel.scss +68 -0
- package/elements/expansion/expansion.module.d.ts +2 -2
- package/elements/form/Control.d.ts +107 -107
- package/elements/form/ControlGroup.d.ts +89 -83
- package/elements/form/ControlGroup.scss +147 -0
- package/elements/form/ControlTemplates.d.ts +9 -9
- package/elements/form/DynamicForm.d.ts +46 -46
- package/elements/form/FieldInteractionApi.d.ts +160 -160
- package/elements/form/FieldInteractionApiTypes.d.ts +29 -29
- package/elements/form/FieldInteractionModals.d.ts +16 -16
- package/elements/form/Form.d.ts +21 -21
- package/elements/form/Form.module.d.ts +2 -2
- package/elements/form/Form.scss +857 -0
- package/elements/form/FormControls.d.ts +22 -22
- package/elements/form/FormInterfaces.d.ts +36 -36
- package/elements/form/FormValidators.d.ts +22 -22
- package/elements/form/NovoFormControl.d.ts +100 -100
- package/elements/form/NovoFormGroup.d.ts +17 -17
- package/elements/form/controls/BaseControl.d.ts +106 -106
- package/elements/form/controls/ControlFactory.d.ts +4 -4
- package/elements/form/controls/ace-editor/AceEditorControl.d.ts +5 -5
- package/elements/form/controls/address/AddressControl.d.ts +5 -5
- package/elements/form/controls/check-list/CheckListControl.d.ts +5 -5
- package/elements/form/controls/checkbox/CheckboxControl.d.ts +5 -5
- package/elements/form/controls/custom/CustomControl.d.ts +5 -5
- package/elements/form/controls/date/DateControl.d.ts +5 -5
- package/elements/form/controls/date-time/DateTimeControl.d.ts +5 -5
- package/elements/form/controls/editor/EditorControl.d.ts +6 -6
- package/elements/form/controls/file/FileControl.d.ts +5 -5
- package/elements/form/controls/grouped/GroupedControl.d.ts +6 -6
- package/elements/form/controls/index.d.ts +19 -19
- package/elements/form/controls/native-select/NativeSelectControl.d.ts +6 -6
- package/elements/form/controls/picker/PickerControl.d.ts +9 -9
- package/elements/form/controls/quick-note/QuickNoteControl.d.ts +6 -6
- package/elements/form/controls/radio/RadioControl.d.ts +6 -6
- package/elements/form/controls/read-only/ReadOnlyControl.d.ts +5 -5
- package/elements/form/controls/select/SelectControl.d.ts +6 -6
- package/elements/form/controls/text-area/TextAreaControl.d.ts +5 -5
- package/elements/form/controls/textbox/TextBoxControl.d.ts +9 -9
- package/elements/form/controls/tiles/TilesControl.d.ts +6 -6
- package/elements/form/controls/time/TimeControl.d.ts +5 -5
- package/elements/form/extras/FormExtras.module.d.ts +2 -2
- package/elements/form/extras/address/Address.d.ts +65 -65
- package/elements/form/extras/address/Address.scss +152 -0
- package/elements/form/extras/checkbox/CheckList.d.ts +20 -20
- package/elements/form/extras/checkbox/Checkbox.d.ts +24 -24
- package/elements/form/extras/checkbox/Checkbox.scss +87 -0
- package/elements/form/extras/file/FileInput.d.ts +72 -72
- package/elements/form/extras/file/FileInput.scss +118 -0
- package/elements/form/extras/file/extras/file/File.d.ts +22 -22
- package/elements/header/Header.d.ts +22 -22
- package/elements/header/Header.module.d.ts +2 -2
- package/elements/header/Header.scss +96 -0
- package/elements/icon/Icon.d.ts +18 -18
- package/elements/icon/Icon.module.d.ts +2 -2
- package/elements/icon/Icon.scss +82 -0
- package/elements/list/List.d.ts +31 -31
- package/elements/list/List.module.d.ts +2 -2
- package/elements/list/List.scss +134 -0
- package/elements/loading/Loading.d.ts +26 -26
- package/elements/loading/Loading.module.d.ts +2 -2
- package/elements/loading/Loading.scss +56 -0
- package/elements/loading/NovoSpinner.scss +172 -0
- package/elements/modal/Modal.d.ts +45 -45
- package/elements/modal/Modal.module.d.ts +2 -2
- package/elements/modal/Modal.scss +207 -0
- package/elements/modal/ModalService.d.ts +10 -10
- package/elements/multi-picker/MultiPicker.d.ts +107 -107
- package/elements/multi-picker/MultiPicker.module.d.ts +2 -2
- package/elements/multi-picker/_MultiPicker.scss +74 -0
- package/elements/overlay/Overlay.d.ts +57 -57
- package/elements/overlay/Overlay.module.d.ts +2 -2
- package/elements/picker/Picker.d.ts +69 -69
- package/elements/picker/Picker.module.d.ts +2 -2
- package/elements/picker/Picker.scss +438 -0
- package/elements/picker/extras/base-picker-results/BasePickerResults.d.ts +91 -91
- package/elements/picker/extras/checklist-picker-results/ChecklistPickerResults.d.ts +21 -21
- package/elements/picker/extras/distributionlist-picker-results/DistributionListPickerResults.d.ts +13 -13
- package/elements/picker/extras/entity-picker-results/EntityPickerResults.d.ts +29 -29
- package/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.d.ts +42 -42
- package/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.scss +136 -0
- package/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.d.ts +43 -43
- package/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.scss +156 -0
- package/elements/picker/extras/picker-results/PickerResults.d.ts +11 -11
- package/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.d.ts +21 -21
- package/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.scss +65 -0
- package/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.d.ts +13 -13
- package/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.scss +0 -0
- package/elements/places/places.component.d.ts +71 -71
- package/elements/places/places.component.scss +26 -0
- package/elements/places/places.module.d.ts +2 -2
- package/elements/places/places.service.d.ts +22 -22
- package/elements/popover/PopOver.d.ts +30 -30
- package/elements/popover/PopOver.module.d.ts +2 -2
- package/elements/popover/PopOver.scss +179 -0
- package/elements/popover/PopOverContent.d.ts +45 -45
- package/elements/quick-note/QuickNote.d.ts +139 -139
- package/elements/quick-note/QuickNote.module.d.ts +2 -2
- package/elements/quick-note/QuickNote.scss +52 -0
- package/elements/quick-note/extras/quick-note-results/QuickNoteResults.d.ts +30 -30
- package/elements/radio/Radio.d.ts +26 -26
- package/elements/radio/Radio.module.d.ts +2 -2
- package/elements/radio/Radio.scss +94 -0
- package/elements/search/SearchBox.d.ts +59 -59
- package/elements/search/SearchBox.module.d.ts +2 -2
- package/elements/search/SearchBox.scss +67 -0
- package/elements/select/Select.d.ts +62 -62
- package/elements/select/Select.module.d.ts +2 -2
- package/elements/select/Select.scss +226 -0
- package/elements/simple-table/activity-table-renderers.d.ts +4 -4
- package/elements/simple-table/cell-header.d.ts +62 -62
- package/elements/simple-table/cell.d.ts +73 -73
- package/elements/simple-table/interfaces.d.ts +81 -81
- package/elements/simple-table/pagination.d.ts +37 -37
- package/elements/simple-table/row.d.ts +20 -20
- package/elements/simple-table/simple-table.module.d.ts +2 -2
- package/elements/simple-table/sort.d.ts +20 -20
- package/elements/simple-table/state.d.ts +22 -22
- package/elements/simple-table/table-source.d.ts +62 -62
- package/elements/simple-table/table.d.ts +59 -59
- package/elements/simple-table/table.scss +344 -0
- package/elements/slider/Slider.d.ts +18 -18
- package/elements/slider/Slider.module.d.ts +2 -2
- package/elements/slider/Slider.scss +89 -0
- package/elements/stepper/step-header.component.d.ts +45 -45
- package/elements/stepper/step-header.component.scss +78 -0
- package/elements/stepper/step-label.component.d.ts +5 -5
- package/elements/stepper/step-status.component.d.ts +6 -6
- package/elements/stepper/stepper.animations.d.ts +6 -6
- package/elements/stepper/stepper.component.d.ts +39 -39
- package/elements/stepper/stepper.component.scss +200 -0
- package/elements/stepper/stepper.module.d.ts +2 -2
- package/elements/switch/Switch.d.ts +19 -19
- package/elements/switch/Switch.module.d.ts +2 -2
- package/elements/switch/Switch.scss +143 -0
- package/elements/tabbed-group-picker/TabbedGroupPicker.d.ts +122 -122
- package/elements/tabbed-group-picker/TabbedGroupPicker.module.d.ts +2 -2
- package/elements/tabbed-group-picker/TabbedGroupPicker.scss +186 -0
- package/elements/table/Table.d.ts +184 -184
- package/elements/table/Table.module.d.ts +2 -2
- package/elements/table/Table.scss +585 -0
- package/elements/table/extras/TableExtras.module.d.ts +2 -2
- package/elements/table/extras/base-renderer/BaseRenderer.d.ts +5 -5
- package/elements/table/extras/date-cell/DateCell.d.ts +8 -8
- package/elements/table/extras/dropdown-cell/DropdownCell.d.ts +17 -17
- package/elements/table/extras/dropdown-cell/DropdownCell.scss +58 -0
- package/elements/table/extras/keep-filter-focus/KeepFilterFocus.d.ts +6 -6
- package/elements/table/extras/pagination/Pagination.d.ts +39 -39
- package/elements/table/extras/pagination/Pagination.scss +62 -0
- package/elements/table/extras/percentage-cell/PercentageCell.d.ts +3 -3
- package/elements/table/extras/row-details/RowDetails.d.ts +12 -12
- package/elements/table/extras/table-actions/TableActions.d.ts +2 -2
- package/elements/table/extras/table-cell/TableCell.d.ts +18 -18
- package/elements/table/extras/table-filter/TableFilter.d.ts +13 -13
- package/elements/table/extras/table-footer/TableFooter.d.ts +2 -2
- package/elements/table/extras/table-header/TableHeader.d.ts +2 -2
- package/elements/table/extras/th-orderable/ThOrderable.d.ts +30 -30
- package/elements/table/extras/th-sortable/ThSortable.d.ts +7 -7
- package/elements/tabs/Tabs.d.ts +49 -49
- package/elements/tabs/Tabs.module.d.ts +2 -2
- package/elements/tabs/Tabs.scss +287 -0
- package/elements/tiles/Tiles.d.ts +30 -30
- package/elements/tiles/Tiles.module.d.ts +2 -2
- package/elements/tiles/Tiles.scss +68 -0
- package/elements/time-picker/TimePicker.d.ts +38 -38
- package/elements/time-picker/TimePicker.module.d.ts +2 -2
- package/elements/time-picker/TimePicker.scss +388 -0
- package/elements/time-picker/TimePickerInput.d.ts +52 -52
- package/elements/tip-well/TipWell.d.ts +23 -23
- package/elements/tip-well/TipWell.module.d.ts +2 -2
- package/elements/tip-well/TipWell.scss +31 -0
- package/elements/toast/Toast.d.ts +28 -28
- package/elements/toast/Toast.module.d.ts +2 -2
- package/elements/toast/Toast.scss +413 -0
- package/elements/toast/ToastService.d.ts +40 -40
- package/elements/tooltip/Tooltip.component.d.ts +12 -11
- package/elements/tooltip/Tooltip.directive.d.ts +35 -34
- package/elements/tooltip/Tooltip.module.d.ts +2 -2
- package/elements/tooltip/Tooltip.scss +216 -0
- package/elements/unless/Unless.d.ts +12 -12
- package/elements/unless/Unless.module.d.ts +2 -2
- package/elements/value/EntityList.d.ts +13 -13
- package/elements/value/Render.d.ts +66 -66
- package/elements/value/Value.d.ts +40 -40
- package/elements/value/Value.module.d.ts +2 -2
- package/elements/value/Value.scss +57 -0
- package/elements/value/Values.scss +57 -0
- package/esm2015/elements/ace-editor/AceEditor.js +126 -126
- package/esm2015/elements/ace-editor/AceEditor.module.js +15 -15
- package/esm2015/elements/button/Button.js +74 -74
- package/esm2015/elements/button/Button.module.js +15 -15
- package/esm2015/elements/calendar/Calendar.module.js +81 -81
- package/esm2015/elements/calendar/common/CalendarDateChange.js +60 -60
- package/esm2015/elements/calendar/common/EventTypeLegend.js +32 -32
- package/esm2015/elements/calendar/day/CalendarAllDayEvent.js +40 -40
- package/esm2015/elements/calendar/day/CalendarDayEvent.js +41 -41
- package/esm2015/elements/calendar/day/CalendarDayView.js +302 -302
- package/esm2015/elements/calendar/day/CalendarHourSegment.js +34 -34
- package/esm2015/elements/calendar/month/CalendarMonthDay.js +87 -87
- package/esm2015/elements/calendar/month/CalendarMonthHeader.js +55 -55
- package/esm2015/elements/calendar/month/CalendarMonthView.js +171 -171
- package/esm2015/elements/calendar/pipe/DayOfMonth.pipe.js +16 -16
- package/esm2015/elements/calendar/pipe/EndOfWeekDisplayPipe.pipe.js +19 -19
- package/esm2015/elements/calendar/pipe/Hours.pipe.js +16 -16
- package/esm2015/elements/calendar/pipe/Month.pipe.js +16 -16
- package/esm2015/elements/calendar/pipe/MonthDay.pipe.js +16 -16
- package/esm2015/elements/calendar/pipe/Weekday.pipe.js +16 -16
- package/esm2015/elements/calendar/pipe/Year.pipe.js +16 -16
- package/esm2015/elements/calendar/week/CalendarWeekEvent.js +38 -38
- package/esm2015/elements/calendar/week/CalendarWeekHeader.js +46 -46
- package/esm2015/elements/calendar/week/CalendarWeekView.js +311 -311
- package/esm2015/elements/card/Card.js +104 -104
- package/esm2015/elements/card/Card.module.js +18 -18
- package/esm2015/elements/category-dropdown/CategoryDropdown.js +159 -159
- package/esm2015/elements/category-dropdown/CategoryDropdown.module.js +17 -17
- package/esm2015/elements/chips/Chips.js +356 -356
- package/esm2015/elements/chips/Chips.module.js +18 -18
- package/esm2015/elements/chips/RowChips.js +86 -86
- package/esm2015/elements/ckeditor/CKEditor.js +237 -237
- package/esm2015/elements/ckeditor/CKEditor.module.js +16 -16
- package/esm2015/elements/common/common.module.js +13 -13
- package/esm2015/elements/common/novo-template/novo-template.directive.js +22 -22
- package/esm2015/elements/data-table/ListInteractionTypes.js +1 -1
- package/esm2015/elements/data-table/cell-headers/data-table-checkbox-header-cell.component.js +73 -73
- package/esm2015/elements/data-table/cell-headers/data-table-expand-header-cell.component.js +47 -47
- package/esm2015/elements/data-table/cell-headers/data-table-header-cell.component.js +501 -501
- package/esm2015/elements/data-table/cell-headers/data-table-header-cell.directive.js +35 -35
- package/esm2015/elements/data-table/cells/data-table-cell.component.js +62 -62
- package/esm2015/elements/data-table/cells/data-table-checkbox-cell.component.js +65 -65
- package/esm2015/elements/data-table/cells/data-table-expand-cell.component.js +52 -52
- package/esm2015/elements/data-table/data-table-clear-button.component.js +54 -54
- package/esm2015/elements/data-table/data-table-expand.directive.js +57 -57
- package/esm2015/elements/data-table/data-table.component.js +665 -665
- package/esm2015/elements/data-table/data-table.module.js +87 -87
- package/esm2015/elements/data-table/data-table.pipes.js +150 -150
- package/esm2015/elements/data-table/data-table.source.js +62 -62
- package/esm2015/elements/data-table/interfaces.js +1 -1
- package/esm2015/elements/data-table/pagination/data-table-pagination.component.js +249 -249
- package/esm2015/elements/data-table/rows/data-table-header-row.component.js +23 -23
- package/esm2015/elements/data-table/rows/data-table-row.component.js +23 -23
- package/esm2015/elements/data-table/services/data-table-filter-utils.js +35 -35
- package/esm2015/elements/data-table/services/remote-data-table.service.js +3 -3
- package/esm2015/elements/data-table/services/static-data-table.service.js +48 -48
- package/esm2015/elements/data-table/sort-filter/sort-filter.directive.js +57 -57
- package/esm2015/elements/data-table/state/data-table-state.service.js +116 -116
- package/esm2015/elements/date-picker/DatePicker.js +493 -493
- package/esm2015/elements/date-picker/DatePicker.module.js +20 -20
- package/esm2015/elements/date-picker/DatePickerInput.js +255 -255
- package/esm2015/elements/date-time-picker/DateTimePicker.js +195 -195
- package/esm2015/elements/date-time-picker/DateTimePicker.module.js +22 -22
- package/esm2015/elements/date-time-picker/DateTimePickerInput.js +151 -151
- package/esm2015/elements/dragula/Dragula.js +66 -66
- package/esm2015/elements/dragula/Dragula.module.js +13 -13
- package/esm2015/elements/dragula/DragulaService.js +117 -117
- package/esm2015/elements/dropdown/Dropdown.js +284 -284
- package/esm2015/elements/dropdown/Dropdown.module.js +15 -15
- package/esm2015/elements/expansion/accordion.js +42 -42
- package/esm2015/elements/expansion/expansion-animations.js +33 -33
- package/esm2015/elements/expansion/expansion-panel-content.js +19 -19
- package/esm2015/elements/expansion/expansion-panel-header.js +131 -131
- package/esm2015/elements/expansion/expansion-panel.js +141 -141
- package/esm2015/elements/expansion/expansion.module.js +34 -34
- package/esm2015/elements/form/Control.js +645 -645
- package/esm2015/elements/form/ControlGroup.js +264 -247
- package/esm2015/elements/form/ControlTemplates.js +162 -161
- package/esm2015/elements/form/DynamicForm.js +221 -221
- package/esm2015/elements/form/FieldInteractionApi.js +680 -680
- package/esm2015/elements/form/FieldInteractionApiTypes.js +1 -1
- package/esm2015/elements/form/FieldInteractionModals.js +63 -63
- package/esm2015/elements/form/Form.js +93 -93
- package/esm2015/elements/form/Form.module.js +86 -86
- package/esm2015/elements/form/FormControls.js +23 -23
- package/esm2015/elements/form/FormInterfaces.js +1 -1
- package/esm2015/elements/form/FormValidators.js +115 -115
- package/esm2015/elements/form/NovoFormControl.js +154 -154
- package/esm2015/elements/form/NovoFormGroup.js +32 -32
- package/esm2015/elements/form/controls/BaseControl.js +101 -101
- package/esm2015/elements/form/controls/ControlFactory.js +47 -47
- package/esm2015/elements/form/controls/ace-editor/AceEditorControl.js +9 -9
- package/esm2015/elements/form/controls/address/AddressControl.js +11 -11
- package/esm2015/elements/form/controls/check-list/CheckListControl.js +10 -10
- package/esm2015/elements/form/controls/checkbox/CheckboxControl.js +9 -9
- package/esm2015/elements/form/controls/custom/CustomControl.js +10 -10
- package/esm2015/elements/form/controls/date/DateControl.js +9 -9
- package/esm2015/elements/form/controls/date-time/DateTimeControl.js +9 -9
- package/esm2015/elements/form/controls/editor/EditorControl.js +10 -10
- package/esm2015/elements/form/controls/file/FileControl.js +12 -12
- package/esm2015/elements/form/controls/grouped/GroupedControl.js +7 -7
- package/esm2015/elements/form/controls/index.js +20 -20
- package/esm2015/elements/form/controls/native-select/NativeSelectControl.js +11 -11
- package/esm2015/elements/form/controls/picker/PickerControl.js +17 -17
- package/esm2015/elements/form/controls/quick-note/QuickNoteControl.js +11 -11
- package/esm2015/elements/form/controls/radio/RadioControl.js +11 -11
- package/esm2015/elements/form/controls/read-only/ReadOnlyControl.js +10 -10
- package/esm2015/elements/form/controls/select/SelectControl.js +12 -12
- package/esm2015/elements/form/controls/text-area/TextAreaControl.js +9 -9
- package/esm2015/elements/form/controls/textbox/TextBoxControl.js +44 -44
- package/esm2015/elements/form/controls/tiles/TilesControl.js +11 -11
- package/esm2015/elements/form/controls/time/TimeControl.js +9 -9
- package/esm2015/elements/form/extras/FormExtras.module.js +36 -36
- package/esm2015/elements/form/extras/address/Address.js +512 -512
- package/esm2015/elements/form/extras/checkbox/CheckList.js +107 -107
- package/esm2015/elements/form/extras/checkbox/Checkbox.js +80 -80
- package/esm2015/elements/form/extras/file/FileInput.js +320 -320
- package/esm2015/elements/form/extras/file/extras/file/File.js +40 -40
- package/esm2015/elements/header/Header.js +96 -96
- package/esm2015/elements/header/Header.module.js +14 -14
- package/esm2015/elements/icon/Icon.js +53 -53
- package/esm2015/elements/icon/Icon.module.js +11 -11
- package/esm2015/elements/list/List.js +132 -132
- package/esm2015/elements/list/List.module.js +33 -33
- package/esm2015/elements/loading/Loading.js +174 -174
- package/esm2015/elements/loading/Loading.module.js +15 -15
- package/esm2015/elements/modal/Modal.js +138 -138
- package/esm2015/elements/modal/Modal.module.js +16 -16
- package/esm2015/elements/modal/ModalService.js +31 -31
- package/esm2015/elements/multi-picker/MultiPicker.js +600 -600
- package/esm2015/elements/multi-picker/MultiPicker.module.js +18 -18
- package/esm2015/elements/overlay/Overlay.js +238 -238
- package/esm2015/elements/overlay/Overlay.module.js +18 -18
- package/esm2015/elements/picker/Picker.js +343 -343
- package/esm2015/elements/picker/Picker.module.js +50 -50
- package/esm2015/elements/picker/extras/base-picker-results/BasePickerResults.js +353 -353
- package/esm2015/elements/picker/extras/checklist-picker-results/ChecklistPickerResults.js +127 -127
- package/esm2015/elements/picker/extras/distributionlist-picker-results/DistributionListPickerResults.js +63 -63
- package/esm2015/elements/picker/extras/entity-picker-results/EntityPickerResults.js +221 -221
- package/esm2015/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.js +264 -264
- package/esm2015/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.js +193 -193
- package/esm2015/elements/picker/extras/picker-results/PickerResults.js +60 -60
- package/esm2015/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.js +79 -79
- package/esm2015/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.js +79 -79
- package/esm2015/elements/places/places.component.js +369 -369
- package/esm2015/elements/places/places.module.js +18 -18
- package/esm2015/elements/places/places.service.js +248 -248
- package/esm2015/elements/popover/PopOver.js +144 -144
- package/esm2015/elements/popover/PopOver.module.js +14 -14
- package/esm2015/elements/popover/PopOverContent.js +198 -198
- package/esm2015/elements/quick-note/QuickNote.js +572 -572
- package/esm2015/elements/quick-note/QuickNote.module.js +19 -19
- package/esm2015/elements/quick-note/extras/quick-note-results/QuickNoteResults.js +138 -138
- package/esm2015/elements/radio/Radio.js +89 -89
- package/esm2015/elements/radio/Radio.module.js +16 -16
- package/esm2015/elements/search/SearchBox.js +193 -193
- package/esm2015/elements/search/SearchBox.module.js +19 -19
- package/esm2015/elements/select/Select.js +363 -358
- package/esm2015/elements/select/Select.module.js +19 -18
- package/esm2015/elements/simple-table/activity-table-renderers.js +16 -16
- package/esm2015/elements/simple-table/cell-header.js +278 -278
- package/esm2015/elements/simple-table/cell.js +291 -291
- package/esm2015/elements/simple-table/interfaces.js +1 -1
- package/esm2015/elements/simple-table/pagination.js +175 -175
- package/esm2015/elements/simple-table/row.js +66 -66
- package/esm2015/elements/simple-table/simple-table.module.js +92 -92
- package/esm2015/elements/simple-table/sort.js +87 -87
- package/esm2015/elements/simple-table/state.js +38 -38
- package/esm2015/elements/simple-table/table-source.js +70 -70
- package/esm2015/elements/simple-table/table.js +238 -238
- package/esm2015/elements/slider/Slider.js +81 -81
- package/esm2015/elements/slider/Slider.module.js +16 -16
- package/esm2015/elements/stepper/step-header.component.js +90 -90
- package/esm2015/elements/stepper/step-label.component.js +16 -16
- package/esm2015/elements/stepper/step-status.component.js +26 -26
- package/esm2015/elements/stepper/stepper.animations.js +19 -19
- package/esm2015/elements/stepper/stepper.component.js +139 -139
- package/esm2015/elements/stepper/stepper.module.js +21 -21
- package/esm2015/elements/switch/Switch.js +88 -88
- package/esm2015/elements/switch/Switch.module.js +16 -16
- package/esm2015/elements/tabbed-group-picker/TabbedGroupPicker.js +261 -261
- package/esm2015/elements/tabbed-group-picker/TabbedGroupPicker.module.js +33 -33
- package/esm2015/elements/table/Table.js +940 -940
- package/esm2015/elements/table/Table.module.js +40 -40
- package/esm2015/elements/table/extras/TableExtras.module.js +59 -59
- package/esm2015/elements/table/extras/base-renderer/BaseRenderer.js +8 -8
- package/esm2015/elements/table/extras/date-cell/DateCell.js +31 -31
- package/esm2015/elements/table/extras/dropdown-cell/DropdownCell.js +44 -44
- package/esm2015/elements/table/extras/keep-filter-focus/KeepFilterFocus.js +19 -19
- package/esm2015/elements/table/extras/pagination/Pagination.js +125 -125
- package/esm2015/elements/table/extras/percentage-cell/PercentageCell.js +15 -15
- package/esm2015/elements/table/extras/row-details/RowDetails.js +44 -44
- package/esm2015/elements/table/extras/table-actions/TableActions.js +11 -11
- package/esm2015/elements/table/extras/table-cell/TableCell.js +82 -82
- package/esm2015/elements/table/extras/table-filter/TableFilter.js +59 -59
- package/esm2015/elements/table/extras/table-footer/TableFooter.js +11 -11
- package/esm2015/elements/table/extras/table-header/TableHeader.js +11 -11
- package/esm2015/elements/table/extras/th-orderable/ThOrderable.js +125 -125
- package/esm2015/elements/table/extras/th-sortable/ThSortable.js +37 -37
- package/esm2015/elements/tabs/Tabs.js +253 -253
- package/esm2015/elements/tabs/Tabs.module.js +31 -31
- package/esm2015/elements/tiles/Tiles.js +154 -154
- package/esm2015/elements/tiles/Tiles.module.js +16 -16
- package/esm2015/elements/time-picker/TimePicker.js +201 -201
- package/esm2015/elements/time-picker/TimePicker.module.js +21 -21
- package/esm2015/elements/time-picker/TimePickerInput.js +202 -202
- package/esm2015/elements/tip-well/TipWell.js +94 -94
- package/esm2015/elements/tip-well/TipWell.module.js +16 -16
- package/esm2015/elements/toast/Toast.js +111 -111
- package/esm2015/elements/toast/Toast.module.js +15 -15
- package/esm2015/elements/toast/ToastService.js +92 -92
- package/esm2015/elements/tooltip/Tooltip.component.js +37 -34
- package/esm2015/elements/tooltip/Tooltip.directive.js +189 -187
- package/esm2015/elements/tooltip/Tooltip.module.js +16 -16
- package/esm2015/elements/unless/Unless.js +56 -56
- package/esm2015/elements/unless/Unless.module.js +15 -15
- package/esm2015/elements/value/EntityList.js +84 -84
- package/esm2015/elements/value/Render.js +415 -415
- package/esm2015/elements/value/Value.js +160 -160
- package/esm2015/elements/value/Value.module.js +17 -17
- package/esm2015/index.js +221 -221
- package/esm2015/novo-elements.js +25 -25
- package/esm2015/novo-elements.module.js +128 -128
- package/esm2015/novo-elements.providers.js +50 -50
- package/esm2015/pipes/Pipes.module.js +15 -15
- package/esm2015/pipes/decode-uri/DecodeURI.js +18 -18
- package/esm2015/pipes/group-by/GroupBy.js +24 -24
- package/esm2015/pipes/plural/Plural.js +349 -349
- package/esm2015/services/data-provider/ArrayCollection.js +301 -301
- package/esm2015/services/data-provider/Collection.js +1 -1
- package/esm2015/services/data-provider/CollectionEvent.js +21 -21
- package/esm2015/services/data-provider/PagedArrayCollection.js +78 -78
- package/esm2015/services/data-provider/PagedCollection.js +1 -1
- package/esm2015/services/date-format/DateFormat.js +189 -189
- package/esm2015/services/global/global.service.js +18 -18
- package/esm2015/services/novo-label-service.js +279 -279
- package/esm2015/services/options/OptionsService.js +26 -26
- package/esm2015/services/security/Security.js +67 -67
- package/esm2015/services/storage/storage.service.js +16 -16
- package/esm2015/services/template/NovoTemplateService.js +33 -33
- package/esm2015/utils/Helpers.js +395 -395
- package/esm2015/utils/app-bridge/AppBridge.js +710 -710
- package/esm2015/utils/calendar-utils/CalendarUtils.js +321 -321
- package/esm2015/utils/component-utils/ComponentUtils.js +20 -20
- package/esm2015/utils/countries/Countries.js +17538 -17538
- package/esm2015/utils/deferred/Deferred.js +14 -14
- package/esm2015/utils/form-utils/FormUtils.js +793 -788
- package/esm2015/utils/key-codes/KeyCodes.js +95 -95
- package/esm2015/utils/notifier/notifier.util.js +10 -10
- package/esm2015/utils/outside-click/OutsideClick.js +60 -60
- package/fesm2015/novo-elements.js +43328 -43295
- package/fesm2015/novo-elements.js.map +1 -1
- package/index.d.ts +225 -225
- package/novo-elements.d.ts +24 -24
- package/novo-elements.metadata.json +1 -1
- package/novo-elements.module.d.ts +2 -2
- package/novo-elements.providers.d.ts +5 -5
- package/novo-elements.scss +110 -0
- package/package.json +1 -1
- package/pipes/Pipes.module.d.ts +2 -2
- package/pipes/decode-uri/DecodeURI.d.ts +4 -4
- package/pipes/group-by/GroupBy.d.ts +4 -4
- package/pipes/plural/Plural.d.ts +4 -4
- package/services/data-provider/ArrayCollection.d.ts +178 -178
- package/services/data-provider/Collection.d.ts +93 -93
- package/services/data-provider/CollectionEvent.d.ts +17 -17
- package/services/data-provider/PagedArrayCollection.d.ts +18 -18
- package/services/data-provider/PagedCollection.d.ts +15 -15
- package/services/date-format/DateFormat.d.ts +13 -13
- package/services/global/global.service.d.ts +11 -11
- package/services/novo-label-service.d.ts +142 -142
- package/services/options/OptionsService.d.ts +9 -9
- package/services/security/Security.d.ts +19 -19
- package/services/storage/storage.service.d.ts +5 -5
- package/services/template/NovoTemplateService.d.ts +7 -7
- package/styles/content/typography.scss +200 -0
- package/styles/global/cdk.scss +106 -0
- package/styles/global/flex-grid.scss +156 -0
- package/styles/global/functions.scss +174 -0
- package/styles/global/include-media.scss +578 -0
- package/styles/global/layout.scss +3 -0
- package/styles/global/reset.scss +451 -0
- package/styles/global/variables.scss +324 -0
- package/utils/Helpers.d.ts +68 -68
- package/utils/app-bridge/AppBridge.d.ts +178 -178
- package/utils/calendar-utils/CalendarUtils.d.ts +150 -150
- package/utils/component-utils/ComponentUtils.d.ts +6 -6
- package/utils/countries/Countries.d.ts +51 -51
- package/utils/deferred/Deferred.d.ts +4 -4
- package/utils/form-utils/FormUtils.d.ts +77 -77
- package/utils/key-codes/KeyCodes.d.ts +93 -93
- package/utils/notifier/notifier.util.d.ts +1 -1
- package/utils/outside-click/OutsideClick.d.ts +24 -24
|
@@ -1,321 +1,321 @@
|
|
|
1
|
-
import * as dateFns from 'date-fns';
|
|
2
|
-
const WEEKEND_DAY_NUMBERS = [0, 6];
|
|
3
|
-
const DAYS_IN_WEEK = 7;
|
|
4
|
-
const HOURS_IN_DAY = 24;
|
|
5
|
-
const MINUTES_IN_HOUR = 60;
|
|
6
|
-
export var CalendarEventResponse;
|
|
7
|
-
(function (CalendarEventResponse) {
|
|
8
|
-
CalendarEventResponse[CalendarEventResponse["Maybe"] = 0] = "Maybe";
|
|
9
|
-
CalendarEventResponse[CalendarEventResponse["Accepted"] = 1] = "Accepted";
|
|
10
|
-
CalendarEventResponse[CalendarEventResponse["Rejected"] = 2] = "Rejected";
|
|
11
|
-
})(CalendarEventResponse || (CalendarEventResponse = {}));
|
|
12
|
-
function getExcludedDays({ startDate, days, excluded }) {
|
|
13
|
-
if (excluded.length < 1) {
|
|
14
|
-
return 0;
|
|
15
|
-
}
|
|
16
|
-
let day = startDate.getDay();
|
|
17
|
-
let reduce = 0;
|
|
18
|
-
for (let i = 0; i < days; i++) {
|
|
19
|
-
if (day === DAYS_IN_WEEK) {
|
|
20
|
-
day = 0;
|
|
21
|
-
}
|
|
22
|
-
if (excluded.some((e) => e === day)) {
|
|
23
|
-
reduce++;
|
|
24
|
-
}
|
|
25
|
-
day++;
|
|
26
|
-
}
|
|
27
|
-
return reduce;
|
|
28
|
-
}
|
|
29
|
-
function getWeekViewEventSpan({ event, offset, startOfWeek, excluded, }) {
|
|
30
|
-
const begin = event.start < startOfWeek ? startOfWeek : event.start;
|
|
31
|
-
let span = 1;
|
|
32
|
-
if (event.end) {
|
|
33
|
-
span = dateFns.differenceInDays(dateFns.addMinutes(dateFns.endOfDay(event.end), 1), dateFns.startOfDay(begin));
|
|
34
|
-
}
|
|
35
|
-
const totalLength = offset + span;
|
|
36
|
-
if (totalLength > DAYS_IN_WEEK) {
|
|
37
|
-
span = DAYS_IN_WEEK - offset;
|
|
38
|
-
}
|
|
39
|
-
return span - getExcludedDays({ startDate: begin, days: span, excluded });
|
|
40
|
-
}
|
|
41
|
-
export function getWeekViewEventOffset({ event, startOfWeek, excluded = [], }) {
|
|
42
|
-
if (event.start < startOfWeek) {
|
|
43
|
-
return 0;
|
|
44
|
-
}
|
|
45
|
-
const distance = dateFns.differenceInDays(event.start, startOfWeek);
|
|
46
|
-
return distance - getExcludedDays({ startDate: startOfWeek, days: distance, excluded });
|
|
47
|
-
}
|
|
48
|
-
function isEventIsPeriod({ event, periodStart, periodEnd }) {
|
|
49
|
-
const eventStart = event.start;
|
|
50
|
-
const eventEnd = event.end || event.start;
|
|
51
|
-
if (eventStart > periodStart && eventStart < periodEnd) {
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
if (eventEnd > periodStart && eventEnd < periodEnd) {
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
if (eventStart < periodStart && eventEnd > periodEnd) {
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
if (dateFns.isSameSecond(eventStart, periodStart) || dateFns.isSameSecond(eventStart, periodEnd)) {
|
|
61
|
-
return true;
|
|
62
|
-
}
|
|
63
|
-
if (dateFns.isSameSecond(eventEnd, periodStart) || dateFns.isSameSecond(eventEnd, periodEnd)) {
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
function getEventsInPeriod({ events, periodStart, periodEnd }) {
|
|
69
|
-
return events.filter((event) => isEventIsPeriod({ event, periodStart, periodEnd }));
|
|
70
|
-
}
|
|
71
|
-
function getEventsInTimeRange(events, dayStart, dayEnd) {
|
|
72
|
-
return events.filter((event) => {
|
|
73
|
-
const eventStart = event.start;
|
|
74
|
-
const eventEnd = event.end || eventStart;
|
|
75
|
-
const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(eventStart), dayStart.hour), dayStart.minute);
|
|
76
|
-
const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(eventStart), dayEnd.hour), dayEnd.minute);
|
|
77
|
-
return dateFns.isAfter(eventEnd, startOfView) && dateFns.isBefore(eventStart, endOfView);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
function getWeekDay({ date }) {
|
|
81
|
-
const today = dateFns.startOfDay(new Date());
|
|
82
|
-
return {
|
|
83
|
-
date,
|
|
84
|
-
isPast: date < today,
|
|
85
|
-
isToday: dateFns.isSameDay(date, today),
|
|
86
|
-
isFuture: date > today,
|
|
87
|
-
isWeekend: WEEKEND_DAY_NUMBERS.indexOf(dateFns.getDay(date)) > -1,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
export function getWeekViewHeader({ viewDate, weekStartsOn, excluded = [], }) {
|
|
91
|
-
const start = dateFns.startOfWeek(viewDate, { weekStartsOn });
|
|
92
|
-
const days = [];
|
|
93
|
-
for (let i = 0; i < DAYS_IN_WEEK; i++) {
|
|
94
|
-
const date = dateFns.addDays(start, i);
|
|
95
|
-
if (!excluded.some((e) => date.getDay() === e)) {
|
|
96
|
-
days.push(getWeekDay({ date }));
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return days;
|
|
100
|
-
}
|
|
101
|
-
export function getWeekView({ events = [], viewDate, weekStartsOn, excluded = [], hourSegments, segmentHeight, dayStart, dayEnd, }) {
|
|
102
|
-
if (!events) {
|
|
103
|
-
events = [];
|
|
104
|
-
}
|
|
105
|
-
const startOfViewWeek = dateFns.startOfWeek(viewDate, { weekStartsOn });
|
|
106
|
-
const endOfViewWeek = dateFns.endOfWeek(viewDate, { weekStartsOn });
|
|
107
|
-
const maxRange = DAYS_IN_WEEK - excluded.length;
|
|
108
|
-
const eventsMapped = getEventsInTimeRange(getEventsInPeriod({ events, periodStart: startOfViewWeek, periodEnd: endOfViewWeek }), dayStart, dayEnd)
|
|
109
|
-
.map((event) => {
|
|
110
|
-
const offset = getWeekViewEventOffset({ event, startOfWeek: startOfViewWeek, excluded });
|
|
111
|
-
const span = 1; // getWeekViewEventSpan({ event, offset, startOfWeek: startOfViewWeek, excluded });
|
|
112
|
-
return { event, offset, span };
|
|
113
|
-
})
|
|
114
|
-
.filter((e) => e.offset < maxRange)
|
|
115
|
-
.filter((e) => e.span > 0)
|
|
116
|
-
.map((entry) => ({
|
|
117
|
-
event: entry.event,
|
|
118
|
-
offset: entry.offset,
|
|
119
|
-
span: entry.span,
|
|
120
|
-
startsBeforeWeek: entry.event.start < startOfViewWeek,
|
|
121
|
-
endsAfterWeek: (entry.event.end || entry.event.start) > endOfViewWeek,
|
|
122
|
-
top: 0,
|
|
123
|
-
}))
|
|
124
|
-
.sort((itemA, itemB) => {
|
|
125
|
-
const startSecondsDiff = dateFns.differenceInSeconds(itemA.event.start, itemB.event.start);
|
|
126
|
-
if (startSecondsDiff === 0) {
|
|
127
|
-
return dateFns.differenceInSeconds(itemB.event.end || itemB.event.start, itemA.event.end || itemA.event.start);
|
|
128
|
-
}
|
|
129
|
-
return startSecondsDiff;
|
|
130
|
-
})
|
|
131
|
-
.map((entry) => {
|
|
132
|
-
const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(entry.event.start), dayStart.hour), dayStart.minute);
|
|
133
|
-
const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(entry.event.start)), dayEnd.hour), dayEnd.minute);
|
|
134
|
-
const eventStart = entry.event.start;
|
|
135
|
-
const eventEnd = entry.event.end || eventStart;
|
|
136
|
-
const hourHeightModifier = (hourSegments * segmentHeight) / MINUTES_IN_HOUR;
|
|
137
|
-
if (eventStart > startOfView) {
|
|
138
|
-
entry.top += dateFns.differenceInMinutes(eventStart, startOfView);
|
|
139
|
-
}
|
|
140
|
-
entry.top *= hourHeightModifier;
|
|
141
|
-
const startsBeforeDay = eventStart < startOfView;
|
|
142
|
-
const endsAfterDay = eventEnd > endOfView;
|
|
143
|
-
const startDate = startsBeforeDay ? startOfView : eventStart;
|
|
144
|
-
const endDate = endsAfterDay ? endOfView : eventEnd;
|
|
145
|
-
let height = dateFns.differenceInMinutes(endDate, startDate);
|
|
146
|
-
if (!entry.event.end) {
|
|
147
|
-
height = segmentHeight;
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
height *= hourHeightModifier;
|
|
151
|
-
}
|
|
152
|
-
entry.height = height;
|
|
153
|
-
return entry;
|
|
154
|
-
});
|
|
155
|
-
const eventRows = [];
|
|
156
|
-
const allocatedEvents = [];
|
|
157
|
-
eventsMapped.forEach((event, index) => {
|
|
158
|
-
if (allocatedEvents.indexOf(event) === -1) {
|
|
159
|
-
allocatedEvents.push(event);
|
|
160
|
-
const otherRowEvents = eventsMapped.slice(index + 1).filter((nextEvent) => {
|
|
161
|
-
return nextEvent.top === event.top && nextEvent.offset === event.offset;
|
|
162
|
-
});
|
|
163
|
-
if (otherRowEvents.length > 0) {
|
|
164
|
-
const totalEventsForRow = otherRowEvents.length + 1;
|
|
165
|
-
event.span = 1 / totalEventsForRow;
|
|
166
|
-
let nextOffset = event.span + event.offset;
|
|
167
|
-
otherRowEvents.forEach((nextEvent) => {
|
|
168
|
-
nextEvent.offset = nextOffset;
|
|
169
|
-
nextEvent.span = event.span;
|
|
170
|
-
nextOffset = nextEvent.span + nextEvent.offset;
|
|
171
|
-
});
|
|
172
|
-
allocatedEvents.push(...otherRowEvents);
|
|
173
|
-
}
|
|
174
|
-
eventRows.push({
|
|
175
|
-
row: [event, ...otherRowEvents],
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
return eventRows;
|
|
180
|
-
}
|
|
181
|
-
export function getMonthView({ events = [], viewDate, weekStartsOn, excluded = [], }) {
|
|
182
|
-
if (!events) {
|
|
183
|
-
events = [];
|
|
184
|
-
}
|
|
185
|
-
const start = dateFns.startOfWeek(dateFns.startOfMonth(viewDate), { weekStartsOn });
|
|
186
|
-
const end = dateFns.endOfWeek(dateFns.endOfMonth(viewDate), { weekStartsOn });
|
|
187
|
-
const eventsInMonth = getEventsInPeriod({
|
|
188
|
-
events,
|
|
189
|
-
periodStart: start,
|
|
190
|
-
periodEnd: end,
|
|
191
|
-
});
|
|
192
|
-
const days = [];
|
|
193
|
-
for (let i = 0; i < dateFns.differenceInDays(end, start) + 1; i++) {
|
|
194
|
-
const date = dateFns.addDays(start, i);
|
|
195
|
-
if (!excluded.some((e) => date.getDay() === e)) {
|
|
196
|
-
const day = getWeekDay({ date });
|
|
197
|
-
const calEvents = getEventsInPeriod({
|
|
198
|
-
events: eventsInMonth,
|
|
199
|
-
periodStart: dateFns.startOfDay(date),
|
|
200
|
-
periodEnd: dateFns.endOfDay(date),
|
|
201
|
-
});
|
|
202
|
-
day.inMonth = dateFns.isSameMonth(date, viewDate);
|
|
203
|
-
day.events = calEvents;
|
|
204
|
-
day.badgeTotal = calEvents.length;
|
|
205
|
-
days.push(day);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
const totalDaysVisibleInWeek = DAYS_IN_WEEK - excluded.length;
|
|
209
|
-
const rows = Math.floor(days.length / totalDaysVisibleInWeek);
|
|
210
|
-
const rowOffsets = [];
|
|
211
|
-
for (let i = 0; i < rows; i++) {
|
|
212
|
-
rowOffsets.push(i * totalDaysVisibleInWeek);
|
|
213
|
-
}
|
|
214
|
-
return {
|
|
215
|
-
rowOffsets,
|
|
216
|
-
totalDaysVisibleInWeek,
|
|
217
|
-
days,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
export function getDayView({ events = [], viewDate, hourSegments, dayStart, dayEnd, eventWidth, segmentHeight }) {
|
|
221
|
-
if (!events) {
|
|
222
|
-
events = [];
|
|
223
|
-
}
|
|
224
|
-
const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(viewDate), dayStart.hour), dayStart.minute);
|
|
225
|
-
const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(viewDate)), dayEnd.hour), dayEnd.minute);
|
|
226
|
-
const previousDayEvents = [];
|
|
227
|
-
const dayViewEvents = getEventsInTimeRange(getEventsInPeriod({
|
|
228
|
-
events: events.filter((event) => !event.allDay),
|
|
229
|
-
periodStart: startOfView,
|
|
230
|
-
periodEnd: endOfView,
|
|
231
|
-
}), dayStart, dayEnd)
|
|
232
|
-
.sort((eventA, eventB) => {
|
|
233
|
-
return eventA.start.valueOf() - eventB.start.valueOf();
|
|
234
|
-
})
|
|
235
|
-
.map((event) => {
|
|
236
|
-
const eventStart = event.start;
|
|
237
|
-
const eventEnd = event.end || eventStart;
|
|
238
|
-
const startsBeforeDay = eventStart < startOfView;
|
|
239
|
-
const endsAfterDay = eventEnd > endOfView;
|
|
240
|
-
const hourHeightModifier = (hourSegments * segmentHeight) / MINUTES_IN_HOUR;
|
|
241
|
-
let top = 0;
|
|
242
|
-
if (eventStart > startOfView) {
|
|
243
|
-
top += dateFns.differenceInMinutes(eventStart, startOfView);
|
|
244
|
-
}
|
|
245
|
-
top *= hourHeightModifier;
|
|
246
|
-
const startDate = startsBeforeDay ? startOfView : eventStart;
|
|
247
|
-
const endDate = endsAfterDay ? endOfView : eventEnd;
|
|
248
|
-
let height = dateFns.differenceInMinutes(endDate, startDate);
|
|
249
|
-
if (!event.end) {
|
|
250
|
-
height = segmentHeight;
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
height *= hourHeightModifier;
|
|
254
|
-
}
|
|
255
|
-
const bottom = top + height;
|
|
256
|
-
const overlappingPreviousEvents = previousDayEvents.filter((previousEvent) => {
|
|
257
|
-
const previousEventTop = previousEvent.top;
|
|
258
|
-
const previousEventBottom = previousEvent.top + previousEvent.height;
|
|
259
|
-
if (top < previousEventBottom && previousEventBottom < bottom) {
|
|
260
|
-
return true;
|
|
261
|
-
}
|
|
262
|
-
else if (previousEventTop <= top && bottom <= previousEventBottom) {
|
|
263
|
-
return true;
|
|
264
|
-
}
|
|
265
|
-
return false;
|
|
266
|
-
});
|
|
267
|
-
let left = 0;
|
|
268
|
-
while (overlappingPreviousEvents.some((previousEvent) => previousEvent.left === left)) {
|
|
269
|
-
left += eventWidth;
|
|
270
|
-
}
|
|
271
|
-
const dayEvent = {
|
|
272
|
-
event,
|
|
273
|
-
height,
|
|
274
|
-
width: eventWidth,
|
|
275
|
-
top,
|
|
276
|
-
left,
|
|
277
|
-
startsBeforeDay,
|
|
278
|
-
endsAfterDay,
|
|
279
|
-
};
|
|
280
|
-
if (height > 0) {
|
|
281
|
-
previousDayEvents.push(dayEvent);
|
|
282
|
-
}
|
|
283
|
-
return dayEvent;
|
|
284
|
-
})
|
|
285
|
-
.filter((dayEvent) => dayEvent.height > 0);
|
|
286
|
-
const width = Math.max(...dayViewEvents.map((event) => event.left + event.width));
|
|
287
|
-
const allDayEvents = getEventsInPeriod({
|
|
288
|
-
events: events.filter((event) => event.allDay),
|
|
289
|
-
periodStart: dateFns.startOfDay(startOfView),
|
|
290
|
-
periodEnd: dateFns.endOfDay(endOfView),
|
|
291
|
-
});
|
|
292
|
-
return {
|
|
293
|
-
events: dayViewEvents,
|
|
294
|
-
width,
|
|
295
|
-
allDayEvents,
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
export function getDayViewHourGrid({ viewDate, hourSegments, dayStart, dayEnd, }) {
|
|
299
|
-
const hours = [];
|
|
300
|
-
const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(viewDate), dayStart.hour), dayStart.minute);
|
|
301
|
-
const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(viewDate)), dayEnd.hour), dayEnd.minute);
|
|
302
|
-
const segmentDuration = MINUTES_IN_HOUR / hourSegments;
|
|
303
|
-
const startOfViewDay = dateFns.startOfDay(viewDate);
|
|
304
|
-
for (let i = 0; i < HOURS_IN_DAY; i++) {
|
|
305
|
-
const segments = [];
|
|
306
|
-
for (let j = 0; j < hourSegments; j++) {
|
|
307
|
-
const date = dateFns.addMinutes(dateFns.addHours(startOfViewDay, i), j * segmentDuration);
|
|
308
|
-
if (date >= startOfView && date < endOfView) {
|
|
309
|
-
segments.push({
|
|
310
|
-
date,
|
|
311
|
-
isStart: j === 0,
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
if (segments.length > 0) {
|
|
316
|
-
hours.push({ segments });
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
return hours;
|
|
320
|
-
}
|
|
321
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FsZW5kYXJVdGlscy5qcyIsInNvdXJjZVJvb3QiOiJDOi9Vc2Vycy9jaGFybGVzLmJhcm5lcy9Eb2N1bWVudHMvZGV2L25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJ1dGlscy9jYWxlbmRhci11dGlscy9DYWxlbmRhclV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBRXBDLE1BQU0sbUJBQW1CLEdBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0MsTUFBTSxZQUFZLEdBQVcsQ0FBQyxDQUFDO0FBQy9CLE1BQU0sWUFBWSxHQUFXLEVBQUUsQ0FBQztBQUNoQyxNQUFNLGVBQWUsR0FBVyxFQUFFLENBQUM7QUFFbkMsTUFBTSxDQUFOLElBQVkscUJBSVg7QUFKRCxXQUFZLHFCQUFxQjtJQUMvQixtRUFBSyxDQUFBO0lBQ0wseUVBQVEsQ0FBQTtJQUNSLHlFQUFRLENBQUE7QUFDVixDQUFDLEVBSlcscUJBQXFCLEtBQXJCLHFCQUFxQixRQUloQztBQWdJRCxTQUFTLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUF5RDtJQUMzRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7SUFDRCxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckMsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDO0lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsSUFBSSxHQUFHLEtBQUssWUFBWSxFQUFFO1lBQ3hCLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDVDtRQUNELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFB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QztvQkFDWixJQUFJO29CQUNKLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQztpQkFDakIsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtRQUNELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDMUI7S0FDRjtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGRhdGVGbnMgZnJvbSAnZGF0ZS1mbnMnO1xyXG5cclxuY29uc3QgV0VFS0VORF9EQVlfTlVNQkVSUzogbnVtYmVyW10gPSBbMCwgNl07XHJcbmNvbnN0IERBWVNfSU5fV0VFSzogbnVtYmVyID0gNztcclxuY29uc3QgSE9VUlNfSU5fREFZOiBudW1iZXIgPSAyNDtcclxuY29uc3QgTUlOVVRFU19JTl9IT1VSOiBudW1iZXIgPSA2MDtcclxuXHJcbmV4cG9ydCBlbnVtIENhbGVuZGFyRXZlbnRSZXNwb25zZSB7XHJcbiAgTWF5YmUsXHJcbiAgQWNjZXB0ZWQsXHJcbiAgUmVqZWN0ZWQsXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJFdmVudFRpbWVzQ2hhbmdlZEV2ZW50IHtcclxuICBldmVudDogQ2FsZW5kYXJFdmVudDtcclxuICBuZXdTdGFydDogRGF0ZTtcclxuICBuZXdFbmQ/OiBEYXRlO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFdlZWtEYXkge1xyXG4gIGRhdGU6IERhdGU7XHJcbiAgaXNQYXN0OiBib29sZWFuO1xyXG4gIGlzVG9kYXk6IGJvb2xlYW47XHJcbiAgaXNGdXR1cmU6IGJvb2xlYW47XHJcbiAgaXNXZWVrZW5kOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50Q29sb3Ige1xyXG4gIHByaW1hcnk6IHN0cmluZztcclxuICBzZWNvbmRhcnk6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFdmVudEFjdGlvbiB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBjc3NDbGFzcz86IHN0cmluZztcclxuICBvbkNsaWNrKHsgZXZlbnQgfTogeyBldmVudDogQ2FsZW5kYXJFdmVudCB9KTogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyRXZlbnQge1xyXG4gIGlkPzogbnVtYmVyO1xyXG4gIHN0YXJ0OiBEYXRlO1xyXG4gIGVuZD86IERhdGU7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICBjb2xvcjogRXZlbnRDb2xvcjtcclxuICB0eXBlPzogc3RyaW5nO1xyXG4gIHJlc3BvbnNlPzogQ2FsZW5kYXJFdmVudFJlc3BvbnNlO1xyXG4gIGFjdGlvbnM/OiBFdmVudEFjdGlvbltdO1xyXG4gIGFsbERheT86IGJvb2xlYW47XHJcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XHJcbiAgcmVzaXphYmxlPzoge1xyXG4gICAgYmVmb3JlU3RhcnQ/OiBib29sZWFuO1xyXG4gICAgYWZ0ZXJFbmQ/OiBib29sZWFuO1xyXG4gIH07XHJcbiAgZHJhZ2dhYmxlPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBXZWVrVmlld0V2ZW50IHtcclxuICBldmVudDogQ2FsZW5kYXJFdmVudDtcclxuICBvZmZzZXQ6IG51bWJlcjtcclxuICBzcGFuOiBudW1iZXI7XHJcbiAgc3RhcnRzQmVmb3JlV2VlazogYm9vbGVhbjtcclxuICBlbmRzQWZ0ZXJXZWVrOiBib29sZWFuO1xyXG4gIHRvcD86IG51bWJlcjtcclxuICBoZWlnaHQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgV2Vla1ZpZXdFdmVudFJvdyB7XHJcbiAgcm93OiBXZWVrVmlld0V2ZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTW9udGhWaWV3RGF5IGV4dGVuZHMgV2Vla0RheSB7XHJcbiAgaW5Nb250aDogYm9vbGVhbjtcclxuICBldmVudHM6IENhbGVuZGFyRXZlbnRbXTtcclxuICBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XHJcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XHJcbiAgYmFkZ2VUb3RhbDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1vbnRoVmlldyB7XHJcbiAgcm93T2Zmc2V0czogbnVtYmVyW107XHJcbiAgZGF5czogTW9udGhWaWV3RGF5W107XHJcbiAgdG90YWxEYXlzVmlzaWJsZUluV2VlazogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERheVZpZXdFdmVudCB7XHJcbiAgZXZlbnQ6IENhbGVuZGFyRXZlbnQ7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbiAgd2lkdGg6IG51bWJlcjtcclxuICB0b3A6IG51bWJlcjtcclxuICBsZWZ0OiBudW1iZXI7XHJcbiAgc3RhcnRzQmVmb3JlRGF5OiBib29sZWFuO1xyXG4gIGVuZHNBZnRlckRheTogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXlWaWV3IHtcclxuICBldmVudHM6IERheVZpZXdFdmVudFtdO1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgYWxsRGF5RXZlbnRzOiBDYWxlbmRhckV2ZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF5Vmlld0hvdXJTZWdtZW50IHtcclxuICBpc1N0YXJ0OiBib29sZWFuO1xyXG4gIGRhdGU6IERhdGU7XHJcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF5Vmlld0hvdXIge1xyXG4gIHNlZ21lbnRzOiBEYXlWaWV3SG91clNlZ21lbnRbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJc0V2ZW50SW5QZXJpb2RBcmdzIHtcclxuICBldmVudDogQ2FsZW5kYXJFdmVudDtcclxuICBwZXJpb2RTdGFydDogRGF0ZTtcclxuICBwZXJpb2RFbmQ6IERhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR2V0RXZlbnRzSW5QZXJpb2RBcmdzIHtcclxuICBldmVudHM6IENhbGVuZGFyRXZlbnRbXTtcclxuICBwZXJpb2RTdGFydDogRGF0ZTtcclxuICBwZXJpb2RFbmQ6IERhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR2V0RGF5Vmlld0FyZ3Mge1xyXG4gIGV2ZW50cz86IENhbGVuZGFyRXZlbnRbXTtcclxuICB2aWV3RGF0ZTogRGF0ZTtcclxuICBob3VyU2VnbWVudHM6IG51bWJlcjtcclxuICBkYXlTdGFydDoge1xyXG4gICAgaG91cjogbnVtYmVyO1xyXG4gICAgbWludXRlOiBudW1iZXI7XHJcbiAgfTtcclxuICBkYXlFbmQ6IHtcclxuICAgIGhvdXI6IG51bWJlcjtcclxuICAgIG1pbnV0ZTogbnVtYmVyO1xyXG4gIH07XHJcbiAgZXZlbnRXaWR0aDogbnVtYmVyO1xyXG4gIHNlZ21lbnRIZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RXhjbHVkZWREYXlzKHsgc3RhcnREYXRlLCBkYXlzLCBleGNsdWRlZCB9OiB7IHN0YXJ0RGF0ZTogRGF0ZTsgZGF5czogbnVtYmVyOyBleGNsdWRlZDogbnVtYmVyW10gfSk6IG51bWJlciB7XHJcbiAgaWYgKGV4Y2x1ZGVkLmxlbmd0aCA8IDEpIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuICBsZXQgZGF5OiBudW1iZXIgPSBzdGFydERhdGUuZ2V0RGF5KCk7XHJcbiAgbGV0IHJlZHVjZTogbnVtYmVyID0gMDtcclxuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGF5czsgaSsrKSB7XHJcbiAgICBpZiAoZGF5ID09PSBEQVlTX0lOX1dFRUspIHtcclxuICAgICAgZGF5ID0gMDtcclxuICAgIH1cclxuICAgIGlmIChleGNsdWRlZC5zb21lKChlKSA9PiBlID09PSBkYXkpKSB7XHJcbiAgICAgIHJlZHVjZSsrO1xyXG4gICAgfVxyXG4gICAgZGF5Kys7XHJcbiAgfVxyXG4gIHJldHVybiByZWR1Y2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFdlZWtWaWV3RXZlbnRTcGFuKHtcclxuICBldmVudCxcclxuICBvZmZzZXQsXHJcbiAgc3RhcnRPZldlZWssXHJcbiAgZXhjbHVkZWQsXHJcbn06IHtcclxuICBldmVudDogQ2FsZW5kYXJFdmVudDtcclxuICBvZmZzZXQ6IG51bWJlcjtcclxuICBzdGFydE9mV2VlazogRGF0ZTtcclxuICBleGNsdWRlZDogbnVtYmVyW107XHJcbn0pOiBudW1iZXIge1xyXG4gIGNvbnN0IGJlZ2luOiBEYXRlID0gZXZlbnQuc3RhcnQgPCBzdGFydE9mV2VlayA/IHN0YXJ0T2ZXZWVrIDogZXZlbnQuc3RhcnQ7XHJcbiAgbGV0IHNwYW46IG51bWJlciA9IDE7XHJcbiAgaWYgKGV2ZW50LmVuZCkge1xyXG4gICAgc3BhbiA9IGRhdGVGbnMuZGlmZmVyZW5jZUluRGF5cyhkYXRlRm5zLmFkZE1pbnV0ZXMoZGF0ZUZucy5lbmRPZkRheShldmVudC5lbmQpLCAxKSwgZGF0ZUZucy5zdGFydE9mRGF5KGJlZ2luKSk7XHJcbiAgfVxyXG4gIGNvbnN0IHRvdGFsTGVuZ3RoOiBudW1iZXIgPSBvZmZzZXQgKyBzcGFuO1xyXG4gIGlmICh0b3RhbExlbmd0aCA+IERBWVNfSU5fV0VFSykge1xyXG4gICAgc3BhbiA9IERBWVNfSU5fV0VFSyAtIG9mZnNldDtcclxuICB9XHJcbiAgcmV0dXJuIHNwYW4gLSBnZXRFeGNsdWRlZERheXMoeyBzdGFydERhdGU6IGJlZ2luLCBkYXlzOiBzcGFuLCBleGNsdWRlZCB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtWaWV3RXZlbnRPZmZzZXQoe1xyXG4gIGV2ZW50LFxyXG4gIHN0YXJ0T2ZXZWVrLFxyXG4gIGV4Y2x1ZGVkID0gW10sXHJcbn06IHtcclxuICBldmVudDogQ2FsZW5kYXJFdmVudDtcclxuICBzdGFydE9mV2VlazogRGF0ZTtcclxuICBleGNsdWRlZD86IG51bWJlcltdO1xyXG59KTogbnVtYmVyIHtcclxuICBpZiAoZXZlbnQuc3RhcnQgPCBzdGFydE9mV2Vlaykge1xyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG4gIGNvbnN0IGRpc3RhbmNlOiBudW1iZXIgPSBkYXRlRm5zLmRpZmZlcmVuY2VJbkRheXMoZXZlbnQuc3RhcnQsIHN0YXJ0T2ZXZWVrKTtcclxuICByZXR1cm4gZGlzdGFuY2UgLSBnZXRFeGNsdWRlZERheXMoeyBzdGFydERhdGU6IHN0YXJ0T2ZXZWVrLCBkYXlzOiBkaXN0YW5jZSwgZXhjbHVkZWQgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRXZlbnRJc1BlcmlvZCh7IGV2ZW50LCBwZXJpb2RTdGFydCwgcGVyaW9kRW5kIH06IElzRXZlbnRJblBlcmlvZEFyZ3MpOiBib29sZWFuIHtcclxuICBjb25zdCBldmVudFN0YXJ0OiBEYXRlID0gZXZlbnQuc3RhcnQ7XHJcbiAgY29uc3QgZXZlbnRFbmQ6IERhdGUgPSBldmVudC5lbmQgfHwgZXZlbnQuc3RhcnQ7XHJcblxyXG4gIGlmIChldmVudFN0YXJ0ID4gcGVyaW9kU3RhcnQgJiYgZXZlbnRTdGFydCA8IHBlcmlvZEVuZCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBpZiAoZXZlbnRFbmQgPiBwZXJpb2RTdGFydCAmJiBldmVudEVuZCA8IHBlcmlvZEVuZCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBpZiAoZXZlbnRTdGFydCA8IHBlcmlvZFN0YXJ0ICYmIGV2ZW50RW5kID4gcGVyaW9kRW5kKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGlmIChkYXRlRm5zLmlzU2FtZVNlY29uZChldmVudFN0YXJ0LCBwZXJpb2RTdGFydCkgfHwgZGF0ZUZucy5pc1NhbWVTZWNvbmQoZXZlbnRTdGFydCwgcGVyaW9kRW5kKSkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBpZiAoZGF0ZUZucy5pc1NhbWVTZWNvbmQoZXZlbnRFbmQsIHBlcmlvZFN0YXJ0KSB8fCBkYXRlRm5zLmlzU2FtZVNlY29uZChldmVudEVuZCwgcGVyaW9kRW5kKSkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEV2ZW50c0luUGVyaW9kKHsgZXZlbnRzLCBwZXJpb2RTdGFydCwgcGVyaW9kRW5kIH06IEdldEV2ZW50c0luUGVyaW9kQXJncyk6IENhbGVuZGFyRXZlbnRbXSB7XHJcbiAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBpc0V2ZW50SXNQZXJpb2QoeyBldmVudCwgcGVyaW9kU3RhcnQsIHBlcmlvZEVuZCB9KSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEV2ZW50c0luVGltZVJhbmdlKGV2ZW50czogQ2FsZW5kYXJFdmVudFtdLCBkYXlTdGFydDogYW55LCBkYXlFbmQ6IGFueSkge1xyXG4gIHJldHVybiBldmVudHMuZmlsdGVyKChldmVudCkgPT4ge1xyXG4gICAgY29uc3QgZXZlbnRTdGFydDogRGF0ZSA9IGV2ZW50LnN0YXJ0O1xyXG4gICAgY29uc3QgZXZlbnRFbmQ6IERhdGUgPSBldmVudC5lbmQgfHwgZXZlbnRTdGFydDtcclxuXHJcbiAgICBjb25zdCBzdGFydE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhkYXRlRm5zLnNldEhvdXJzKGRhdGVGbnMuc3RhcnRPZkRheShldmVudFN0YXJ0KSwgZGF5U3RhcnQuaG91ciksIGRheVN0YXJ0Lm1pbnV0ZSk7XHJcbiAgICBjb25zdCBlbmRPZlZpZXc6IERhdGUgPSBkYXRlRm5zLnNldE1pbnV0ZXMoZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZNaW51dGUoZXZlbnRTdGFydCksIGRheUVuZC5ob3VyKSwgZGF5RW5kLm1pbnV0ZSk7XHJcblxyXG4gICAgcmV0dXJuIGRhdGVGbnMuaXNBZnRlcihldmVudEVuZCwgc3RhcnRPZlZpZXcpICYmIGRhdGVGbnMuaXNCZWZvcmUoZXZlbnRTdGFydCwgZW5kT2ZWaWV3KTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0V2Vla0RheSh7IGRhdGUgfTogeyBkYXRlOiBEYXRlIH0pOiBXZWVrRGF5IHtcclxuICBjb25zdCB0b2RheTogRGF0ZSA9IGRhdGVGbnMuc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICByZXR1cm4ge1xyXG4gICAgZGF0ZSxcclxuICAgIGlzUGFzdDogZGF0ZSA8IHRvZGF5LFxyXG4gICAgaXNUb2RheTogZGF0ZUZucy5pc1NhbWVEYXkoZGF0ZSwgdG9kYXkpLFxyXG4gICAgaXNGdXR1cmU6IGRhdGUgPiB0b2RheSxcclxuICAgIGlzV2Vla2VuZDogV0VFS0VORF9EQVlfTlVNQkVSUy5pbmRleE9mKGRhdGVGbnMuZ2V0RGF5KGRhdGUpKSA+IC0xLFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWVrVmlld0hlYWRlcih7XHJcbiAgdmlld0RhdGUsXHJcbiAgd2Vla1N0YXJ0c09uLFxyXG4gIGV4Y2x1ZGVkID0gW10sXHJcbn06IHtcclxuICB2aWV3RGF0ZTogRGF0ZTtcclxuICB3ZWVrU3RhcnRzT246IG51bWJlcjtcclxuICBleGNsdWRlZD86IG51bWJlcltdO1xyXG59KTogV2Vla0RheVtdIHtcclxuICBjb25zdCBzdGFydDogRGF0ZSA9IGRhdGVGbnMuc3RhcnRPZldlZWsodmlld0RhdGUsIHsgd2Vla1N0YXJ0c09uIH0pO1xyXG4gIGNvbnN0IGRheXM6IFdlZWtEYXlbXSA9IFtdO1xyXG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBEQVlTX0lOX1dFRUs7IGkrKykge1xyXG4gICAgY29uc3QgZGF0ZTogRGF0ZSA9IGRhdGVGbnMuYWRkRGF5cyhzdGFydCwgaSk7XHJcbiAgICBpZiAoIWV4Y2x1ZGVkLnNvbWUoKGUpID0+IGRhdGUuZ2V0RGF5KCkgPT09IGUpKSB7XHJcbiAgICAgIGRheXMucHVzaChnZXRXZWVrRGF5KHsgZGF0ZSB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGF5cztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtWaWV3KHtcclxuICBldmVudHMgPSBbXSxcclxuICB2aWV3RGF0ZSxcclxuICB3ZWVrU3RhcnRzT24sXHJcbiAgZXhjbHVkZWQgPSBbXSxcclxuICBob3VyU2VnbWVudHMsXHJcbiAgc2VnbWVudEhlaWdodCxcclxuICBkYXlTdGFydCxcclxuICBkYXlFbmQsXHJcbn06IHtcclxuICBldmVudHM/OiBDYWxlbmRhckV2ZW50W107XHJcbiAgdmlld0RhdGU6IERhdGU7XHJcbiAgd2Vla1N0YXJ0c09uOiBudW1iZXI7XHJcbiAgZXhjbHVkZWQ/OiBudW1iZXJbXTtcclxuICBob3VyU2VnbWVudHM6IG51bWJlcjtcclxuICBzZWdtZW50SGVpZ2h0OiBudW1iZXI7XHJcbiAgZGF5U3RhcnQ6IGFueTtcclxuICBkYXlFbmQ6IGFueTtcclxufSk6IFdlZWtWaWV3RXZlbnRSb3dbXSB7XHJcbiAgaWYgKCFldmVudHMpIHtcclxuICAgIGV2ZW50cyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc3RhcnRPZlZpZXdXZWVrOiBEYXRlID0gZGF0ZUZucy5zdGFydE9mV2Vlayh2aWV3RGF0ZSwgeyB3ZWVrU3RhcnRzT24gfSk7XHJcbiAgY29uc3QgZW5kT2ZWaWV3V2VlazogRGF0ZSA9IGRhdGVGbnMuZW5kT2ZXZWVrKHZpZXdEYXRlLCB7IHdlZWtTdGFydHNPbiB9KTtcclxuICBjb25zdCBtYXhSYW5nZTogbnVtYmVyID0gREFZU19JTl9XRUVLIC0gZXhjbHVkZWQubGVuZ3RoO1xyXG5cclxuICBjb25zdCBldmVudHNNYXBwZWQ6IFdlZWtWaWV3RXZlbnRbXSA9IGdldEV2ZW50c0luVGltZVJhbmdlKFxyXG4gICAgZ2V0RXZlbnRzSW5QZXJpb2QoeyBldmVudHMsIHBlcmlvZFN0YXJ0OiBzdGFydE9mVmlld1dlZWssIHBlcmlvZEVuZDogZW5kT2ZWaWV3V2VlayB9KSxcclxuICAgIGRheVN0YXJ0LFxyXG4gICAgZGF5RW5kLFxyXG4gIClcclxuICAgIC5tYXAoKGV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IG9mZnNldDogbnVtYmVyID0gZ2V0V2Vla1ZpZXdFdmVudE9mZnNldCh7IGV2ZW50LCBzdGFydE9mV2Vlazogc3RhcnRPZlZpZXdXZWVrLCBleGNsdWRlZCB9KTtcclxuICAgICAgY29uc3Qgc3BhbjogbnVtYmVyID0gMTsgLy8gZ2V0V2Vla1ZpZXdFdmVudFNwYW4oeyBldmVudCwgb2Zmc2V0LCBzdGFydE9mV2Vlazogc3RhcnRPZlZpZXdXZWVrLCBleGNsdWRlZCB9KTtcclxuICAgICAgcmV0dXJuIHsgZXZlbnQsIG9mZnNldCwgc3BhbiB9O1xyXG4gICAgfSlcclxuICAgIC5maWx0ZXIoKGUpID0+IGUub2Zmc2V0IDwgbWF4UmFuZ2UpXHJcbiAgICAuZmlsdGVyKChlKSA9PiBlLnNwYW4gPiAwKVxyXG4gICAgLm1hcCgoZW50cnkpID0+ICh7XHJcbiAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCxcclxuICAgICAgb2Zmc2V0OiBlbnRyeS5vZmZzZXQsXHJcbiAgICAgIHNwYW46IGVudHJ5LnNwYW4sXHJcbiAgICAgIHN0YXJ0c0JlZm9yZVdlZWs6IGVudHJ5LmV2ZW50LnN0YXJ0IDwgc3RhcnRPZlZpZXdXZWVrLFxyXG4gICAgICBlbmRzQWZ0ZXJXZWVrOiAoZW50cnkuZXZlbnQuZW5kIHx8IGVudHJ5LmV2ZW50LnN0YXJ0KSA+IGVuZE9mVmlld1dlZWssXHJcbiAgICAgIHRvcDogMCxcclxuICAgIH0pKVxyXG4gICAgLnNvcnQoXHJcbiAgICAgIChpdGVtQSwgaXRlbUIpOiBudW1iZXIgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0U2Vjb25kc0RpZmY6IG51bWJlciA9IGRhdGVGbnMuZGlmZmVyZW5jZUluU2Vjb25kcyhpdGVtQS5ldmVudC5zdGFydCwgaXRlbUIuZXZlbnQuc3RhcnQpO1xyXG4gICAgICAgIGlmIChzdGFydFNlY29uZHNEaWZmID09PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gZGF0ZUZucy5kaWZmZXJlbmNlSW5TZWNvbmRzKGl0ZW1CLmV2ZW50LmVuZCB8fCBpdGVtQi5ldmVudC5zdGFydCwgaXRlbUEuZXZlbnQuZW5kIHx8IGl0ZW1BLmV2ZW50LnN0YXJ0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0YXJ0U2Vjb25kc0RpZmY7XHJcbiAgICAgIH0sXHJcbiAgICApXHJcbiAgICAubWFwKChlbnRyeTogV2Vla1ZpZXdFdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBzdGFydE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhkYXRlRm5zLnNldEhvdXJzKGRhdGVGbnMuc3RhcnRPZkRheShlbnRyeS5ldmVudC5zdGFydCksIGRheVN0YXJ0LmhvdXIpLCBkYXlTdGFydC5taW51dGUpO1xyXG4gICAgICBjb25zdCBlbmRPZlZpZXc6IERhdGUgPSBkYXRlRm5zLnNldE1pbnV0ZXMoXHJcbiAgICAgICAgZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZNaW51dGUoZGF0ZUZucy5lbmRPZkRheShlbnRyeS5ldmVudC5zdGFydCkpLCBkYXlFbmQuaG91ciksXHJcbiAgICAgICAgZGF5RW5kLm1pbnV0ZSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IGV2ZW50U3RhcnQ6IERhdGUgPSBlbnRyeS5ldmVudC5zdGFydDtcclxuICAgICAgY29uc3QgZXZlbnRFbmQ6IERhdGUgPSBlbnRyeS5ldmVudC5lbmQgfHwgZXZlbnRTdGFydDtcclxuXHJcbiAgICAgIGNvbnN0IGhvdXJIZWlnaHRNb2RpZmllcjogbnVtYmVyID0gKGhvdXJTZWdtZW50cyAqIHNlZ21lbnRIZWlnaHQpIC8gTUlOVVRFU19JTl9IT1VSO1xyXG5cclxuICAgICAgaWYgKGV2ZW50U3RhcnQgPiBzdGFydE9mVmlldykge1xyXG4gICAgICAgIGVudHJ5LnRvcCArPSBkYXRlRm5zLmRpZmZlcmVuY2VJbk1pbnV0ZXMoZXZlbnRTdGFydCwgc3RhcnRPZlZpZXcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBlbnRyeS50b3AgKj0gaG91ckhlaWdodE1vZGlmaWVyO1xyXG5cclxuICAgICAgY29uc3Qgc3RhcnRzQmVmb3JlRGF5OiBib29sZWFuID0gZXZlbnRTdGFydCA8IHN0YXJ0T2ZWaWV3O1xyXG4gICAgICBjb25zdCBlbmRzQWZ0ZXJEYXk6IGJvb2xlYW4gPSBldmVudEVuZCA+IGVuZE9mVmlldztcclxuXHJcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZTogRGF0ZSA9IHN0YXJ0c0JlZm9yZURheSA/IHN0YXJ0T2ZWaWV3IDogZXZlbnRTdGFydDtcclxuICAgICAgY29uc3QgZW5kRGF0ZTogRGF0ZSA9IGVuZHNBZnRlckRheSA/IGVuZE9mVmlldyA6IGV2ZW50RW5kO1xyXG5cclxuICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGVuZERhdGUsIHN0YXJ0RGF0ZSk7XHJcblxyXG4gICAgICBpZiAoIWVudHJ5LmV2ZW50LmVuZCkge1xyXG4gICAgICAgIGhlaWdodCA9IHNlZ21lbnRIZWlnaHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaGVpZ2h0ICo9IGhvdXJIZWlnaHRNb2RpZmllcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgZW50cnkuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgcmV0dXJuIGVudHJ5O1xyXG4gICAgfSk7XHJcblxyXG4gIGNvbnN0IGV2ZW50Um93czogV2Vla1ZpZXdFdmVudFJvd1tdID0gW107XHJcbiAgY29uc3QgYWxsb2NhdGVkRXZlbnRzOiBXZWVrVmlld0V2ZW50W10gPSBbXTtcclxuXHJcbiAgZXZlbnRzTWFwcGVkLmZvckVhY2goKGV2ZW50OiBXZWVrVmlld0V2ZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICBpZiAoYWxsb2NhdGVkRXZlbnRzLmluZGV4T2YoZXZlbnQpID09PSAtMSkge1xyXG4gICAgICBhbGxvY2F0ZWRFdmVudHMucHVzaChldmVudCk7XHJcblxyXG4gICAgICBjb25zdCBvdGhlclJvd0V2ZW50czogV2Vla1ZpZXdFdmVudFtdID0gZXZlbnRzTWFwcGVkLnNsaWNlKGluZGV4ICsgMSkuZmlsdGVyKChuZXh0RXZlbnQpID0+IHtcclxuICAgICAgICByZXR1cm4gbmV4dEV2ZW50LnRvcCA9PT0gZXZlbnQudG9wICYmIG5leHRFdmVudC5vZmZzZXQgPT09IGV2ZW50Lm9mZnNldDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAob3RoZXJSb3dFdmVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHRvdGFsRXZlbnRzRm9yUm93ID0gb3RoZXJSb3dFdmVudHMubGVuZ3RoICsgMTtcclxuXHJcbiAgICAgICAgZXZlbnQuc3BhbiA9IDEgLyB0b3RhbEV2ZW50c0ZvclJvdztcclxuXHJcbiAgICAgICAgbGV0IG5leHRPZmZzZXQgPSBldmVudC5zcGFuICsgZXZlbnQub2Zmc2V0O1xyXG5cclxuICAgICAgICBvdGhlclJvd0V2ZW50cy5mb3JFYWNoKChuZXh0RXZlbnQ6IFdlZWtWaWV3RXZlbnQpID0+IHtcclxuICAgICAgICAgIG5leHRFdmVudC5vZmZzZXQgPSBuZXh0T2Zmc2V0O1xyXG4gICAgICAgICAgbmV4dEV2ZW50LnNwYW4gPSBldmVudC5zcGFuO1xyXG4gICAgICAgICAgbmV4dE9mZnNldCA9IG5leHRFdmVudC5zcGFuICsgbmV4dEV2ZW50Lm9mZnNldDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYWxsb2NhdGVkRXZlbnRzLnB1c2goLi4ub3RoZXJSb3dFdmVudHMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBldmVudFJvd3MucHVzaCh7XHJcbiAgICAgICAgcm93OiBbZXZlbnQsIC4uLm90aGVyUm93RXZlbnRzXSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBldmVudFJvd3M7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRNb250aFZpZXcoe1xyXG4gIGV2ZW50cyA9IFtdLFxyXG4gIHZpZXdEYXRlLFxyXG4gIHdlZWtTdGFydHNPbixcclxuICBleGNsdWRlZCA9IFtdLFxyXG59OiB7XHJcbiAgZXZlbnRzPzogQ2FsZW5kYXJFdmVudFtdO1xyXG4gIHZpZXdEYXRlOiBEYXRlO1xyXG4gIHdlZWtTdGFydHNPbjogbnVtYmVyO1xyXG4gIGV4Y2x1ZGVkPzogbnVtYmVyW107XHJcbn0pOiBNb250aFZpZXcge1xyXG4gIGlmICghZXZlbnRzKSB7XHJcbiAgICBldmVudHMgPSBbXTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHN0YXJ0OiBEYXRlID0gZGF0ZUZucy5zdGFydE9mV2VlayhkYXRlRm5zLnN0YXJ0T2ZNb250aCh2aWV3RGF0ZSksIHsgd2Vla1N0YXJ0c09uIH0pO1xyXG4gIGNvbnN0IGVuZDogRGF0ZSA9IGRhdGVGbnMuZW5kT2ZXZWVrKGRhdGVGbnMuZW5kT2ZNb250aCh2aWV3RGF0ZSksIHsgd2Vla1N0YXJ0c09uIH0pO1xyXG4gIGNvbnN0IGV2ZW50c0luTW9udGg6IENhbGVuZGFyRXZlbnRbXSA9IGdldEV2ZW50c0luUGVyaW9kKHtcclxuICAgIGV2ZW50cyxcclxuICAgIHBlcmlvZFN0YXJ0OiBzdGFydCxcclxuICAgIHBlcmlvZEVuZDogZW5kLFxyXG4gIH0pO1xyXG4gIGNvbnN0IGRheXM6IE1vbnRoVmlld0RheVtdID0gW107XHJcbiAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRhdGVGbnMuZGlmZmVyZW5jZUluRGF5cyhlbmQsIHN0YXJ0KSArIDE7IGkrKykge1xyXG4gICAgY29uc3QgZGF0ZTogRGF0ZSA9IGRhdGVGbnMuYWRkRGF5cyhzdGFydCwgaSk7XHJcbiAgICBpZiAoIWV4Y2x1ZGVkLnNvbWUoKGUpID0+IGRhdGUuZ2V0RGF5KCkgPT09IGUpKSB7XHJcbiAgICAgIGNvbnN0IGRheTogTW9udGhWaWV3RGF5ID0gZ2V0V2Vla0RheSh7IGRhdGUgfSkgYXMgTW9udGhWaWV3RGF5O1xyXG4gICAgICBjb25zdCBjYWxFdmVudHM6IENhbGVuZGFyRXZlbnRbXSA9IGdldEV2ZW50c0luUGVyaW9kKHtcclxuICAgICAgICBldmVudHM6IGV2ZW50c0luTW9udGgsXHJcbiAgICAgICAgcGVyaW9kU3RhcnQ6IGRhdGVGbnMuc3RhcnRPZkRheShkYXRlKSxcclxuICAgICAgICBwZXJpb2RFbmQ6IGRhdGVGbnMuZW5kT2ZEYXkoZGF0ZSksXHJcbiAgICAgIH0pO1xyXG4gICAgICBkYXkuaW5Nb250aCA9IGRhdGVGbnMuaXNTYW1lTW9udGgoZGF0ZSwgdmlld0RhdGUpO1xyXG4gICAgICBkYXkuZXZlbnRzID0gY2FsRXZlbnRzO1xyXG4gICAgICBkYXkuYmFkZ2VUb3RhbCA9IGNhbEV2ZW50cy5sZW5ndGg7XHJcbiAgICAgIGRheXMucHVzaChkYXkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgdG90YWxEYXlzVmlzaWJsZUluV2VlazogbnVtYmVyID0gREFZU19JTl9XRUVLIC0gZXhjbHVkZWQubGVuZ3RoO1xyXG4gIGNvbnN0IHJvd3M6IG51bWJlciA9IE1hdGguZmxvb3IoZGF5cy5sZW5ndGggLyB0b3RhbERheXNWaXNpYmxlSW5XZWVrKTtcclxuICBjb25zdCByb3dPZmZzZXRzOiBudW1iZXJbXSA9IFtdO1xyXG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzOyBpKyspIHtcclxuICAgIHJvd09mZnNldHMucHVzaChpICogdG90YWxEYXlzVmlzaWJsZUluV2Vlayk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgcm93T2Zmc2V0cyxcclxuICAgIHRvdGFsRGF5c1Zpc2libGVJbldlZWssXHJcbiAgICBkYXlzLFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREYXlWaWV3KHsgZXZlbnRzID0gW10sIHZpZXdEYXRlLCBob3VyU2VnbWVudHMsIGRheVN0YXJ0LCBkYXlFbmQsIGV2ZW50V2lkdGgsIHNlZ21lbnRIZWlnaHQgfTogR2V0RGF5Vmlld0FyZ3MpOiBEYXlWaWV3IHtcclxuICBpZiAoIWV2ZW50cykge1xyXG4gICAgZXZlbnRzID0gW107XHJcbiAgfVxyXG5cclxuICBjb25zdCBzdGFydE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhkYXRlRm5zLnNldEhvdXJzKGRhdGVGbnMuc3RhcnRPZkRheSh2aWV3RGF0ZSksIGRheVN0YXJ0LmhvdXIpLCBkYXlTdGFydC5taW51dGUpO1xyXG4gIGNvbnN0IGVuZE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhcclxuICAgIGRhdGVGbnMuc2V0SG91cnMoZGF0ZUZucy5zdGFydE9mTWludXRlKGRhdGVGbnMuZW5kT2ZEYXkodmlld0RhdGUpKSwgZGF5RW5kLmhvdXIpLFxyXG4gICAgZGF5RW5kLm1pbnV0ZSxcclxuICApO1xyXG4gIGNvbnN0IHByZXZpb3VzRGF5RXZlbnRzOiBEYXlWaWV3RXZlbnRbXSA9IFtdO1xyXG5cclxuICBjb25zdCBkYXlWaWV3RXZlbnRzOiBEYXlWaWV3RXZlbnRbXSA9IGdldEV2ZW50c0luVGltZVJhbmdlKFxyXG4gICAgZ2V0RXZlbnRzSW5QZXJpb2Qoe1xyXG4gICAgICBldmVudHM6IGV2ZW50cy5maWx0ZXIoKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiAhZXZlbnQuYWxsRGF5KSxcclxuICAgICAgcGVyaW9kU3RhcnQ6IHN0YXJ0T2ZWaWV3LFxyXG4gICAgICBwZXJpb2RFbmQ6IGVuZE9mVmlldyxcclxuICAgIH0pLFxyXG4gICAgZGF5U3RhcnQsXHJcbiAgICBkYXlFbmQsXHJcbiAgKVxyXG4gICAgLnNvcnQoKGV2ZW50QTogQ2FsZW5kYXJFdmVudCwgZXZlbnRCOiBDYWxlbmRhckV2ZW50KSA9PiB7XHJcbiAgICAgIHJldHVybiBldmVudEEuc3RhcnQudmFsdWVPZigpIC0gZXZlbnRCLnN0YXJ0LnZhbHVlT2YoKTtcclxuICAgIH0pXHJcbiAgICAubWFwKChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBldmVudFN0YXJ0OiBEYXRlID0gZXZlbnQuc3RhcnQ7XHJcbiAgICAgIGNvbnN0IGV2ZW50RW5kOiBEYXRlID0gZXZlbnQuZW5kIHx8IGV2ZW50U3RhcnQ7XHJcbiAgICAgIGNvbnN0IHN0YXJ0c0JlZm9yZURheTogYm9vbGVhbiA9IGV2ZW50U3RhcnQgPCBzdGFydE9mVmlldztcclxuICAgICAgY29uc3QgZW5kc0FmdGVyRGF5OiBib29sZWFuID0gZXZlbnRFbmQgPiBlbmRPZlZpZXc7XHJcbiAgICAgIGNvbnN0IGhvdXJIZWlnaHRNb2RpZmllcjogbnVtYmVyID0gKGhvdXJTZWdtZW50cyAqIHNlZ21lbnRIZWlnaHQpIC8gTUlOVVRFU19JTl9IT1VSO1xyXG5cclxuICAgICAgbGV0IHRvcDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIGlmIChldmVudFN0YXJ0ID4gc3RhcnRPZlZpZXcpIHtcclxuICAgICAgICB0b3AgKz0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGV2ZW50U3RhcnQsIHN0YXJ0T2ZWaWV3KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdG9wICo9IGhvdXJIZWlnaHRNb2RpZmllcjtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZTogRGF0ZSA9IHN0YXJ0c0JlZm9yZURheSA/IHN0YXJ0T2ZWaWV3IDogZXZlbnRTdGFydDtcclxuICAgICAgY29uc3QgZW5kRGF0ZTogRGF0ZSA9IGVuZHNBZnRlckRheSA/IGVuZE9mVmlldyA6IGV2ZW50RW5kO1xyXG5cclxuICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGVuZERhdGUsIHN0YXJ0RGF0ZSk7XHJcblxyXG4gICAgICBpZiAoIWV2ZW50LmVuZCkge1xyXG4gICAgICAgIGhlaWdodCA9IHNlZ21lbnRIZWlnaHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaGVpZ2h0ICo9IGhvdXJIZWlnaHRNb2RpZmllcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYm90dG9tOiBudW1iZXIgPSB0b3AgKyBoZWlnaHQ7XHJcblxyXG4gICAgICBjb25zdCBvdmVybGFwcGluZ1ByZXZpb3VzRXZlbnRzOiBEYXlWaWV3RXZlbnRbXSA9IHByZXZpb3VzRGF5RXZlbnRzLmZpbHRlcigocHJldmlvdXNFdmVudDogRGF5Vmlld0V2ZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNFdmVudFRvcDogbnVtYmVyID0gcHJldmlvdXNFdmVudC50b3A7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNFdmVudEJvdHRvbTogbnVtYmVyID0gcHJldmlvdXNFdmVudC50b3AgKyBwcmV2aW91c0V2ZW50LmhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHRvcCA8IHByZXZpb3VzRXZlbnRCb3R0b20gJiYgcHJldmlvdXNFdmVudEJvdHRvbSA8IGJvdHRvbSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c0V2ZW50VG9wIDw9IHRvcCAmJiBib3R0b20gPD0gcHJldmlvdXNFdmVudEJvdHRvbSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbGV0IGxlZnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICB3aGlsZSAob3ZlcmxhcHBpbmdQcmV2aW91c0V2ZW50cy5zb21lKChwcmV2aW91c0V2ZW50KSA9PiBwcmV2aW91c0V2ZW50LmxlZnQgPT09IGxlZnQpKSB7XHJcbiAgICAgICAgbGVmdCArPSBldmVudFdpZHRoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkYXlFdmVudDogRGF5Vmlld0V2ZW50ID0ge1xyXG4gICAgICAgIGV2ZW50LFxyXG4gICAgICAgIGhlaWdodCxcclxuICAgICAgICB3aWR0aDogZXZlbnRXaWR0aCxcclxuICAgICAgICB0b3AsXHJcbiAgICAgICAgbGVmdCxcclxuICAgICAgICBzdGFydHNCZWZvcmVEYXksXHJcbiAgICAgICAgZW5kc0FmdGVyRGF5LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKGhlaWdodCA+IDApIHtcclxuICAgICAgICBwcmV2aW91c0RheUV2ZW50cy5wdXNoKGRheUV2ZW50KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGRheUV2ZW50O1xyXG4gICAgfSlcclxuICAgIC5maWx0ZXIoKGRheUV2ZW50OiBEYXlWaWV3RXZlbnQpID0+IGRheUV2ZW50LmhlaWdodCA+IDApO1xyXG5cclxuICBjb25zdCB3aWR0aDogbnVtYmVyID0gTWF0aC5tYXgoLi4uZGF5Vmlld0V2ZW50cy5tYXAoKGV2ZW50OiBEYXlWaWV3RXZlbnQpID0+IGV2ZW50LmxlZnQgKyBldmVudC53aWR0aCkpO1xyXG4gIGNvbnN0IGFsbERheUV2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gZ2V0RXZlbnRzSW5QZXJpb2Qoe1xyXG4gICAgZXZlbnRzOiBldmVudHMuZmlsdGVyKChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gZXZlbnQuYWxsRGF5KSxcclxuICAgIHBlcmlvZFN0YXJ0OiBkYXRlRm5zLnN0YXJ0T2ZEYXkoc3RhcnRPZlZpZXcpLFxyXG4gICAgcGVyaW9kRW5kOiBkYXRlRm5zLmVuZE9mRGF5KGVuZE9mVmlldyksXHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBldmVudHM6IGRheVZpZXdFdmVudHMsXHJcbiAgICB3aWR0aCxcclxuICAgIGFsbERheUV2ZW50cyxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF5Vmlld0hvdXJHcmlkKHtcclxuICB2aWV3RGF0ZSxcclxuICBob3VyU2VnbWVudHMsXHJcbiAgZGF5U3RhcnQsXHJcbiAgZGF5RW5kLFxyXG59OiB7XHJcbiAgdmlld0RhdGU6IERhdGU7XHJcbiAgaG91clNlZ21lbnRzOiBudW1iZXI7XHJcbiAgZGF5U3RhcnQ6IGFueTtcclxuICBkYXlFbmQ6IGFueTtcclxufSk6IERheVZpZXdIb3VyW10ge1xyXG4gIGNvbnN0IGhvdXJzOiBEYXlWaWV3SG91cltdID0gW107XHJcblxyXG4gIGNvbnN0IHN0YXJ0T2ZWaWV3OiBEYXRlID0gZGF0ZUZucy5zZXRNaW51dGVzKGRhdGVGbnMuc2V0SG91cnMoZGF0ZUZucy5zdGFydE9mRGF5KHZpZXdEYXRlKSwgZGF5U3RhcnQuaG91ciksIGRheVN0YXJ0Lm1pbnV0ZSk7XHJcbiAgY29uc3QgZW5kT2ZWaWV3OiBEYXRlID0gZGF0ZUZucy5zZXRNaW51dGVzKFxyXG4gICAgZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZNaW51dGUoZGF0ZUZucy5lbmRPZkRheSh2aWV3RGF0ZSkpLCBkYXlFbmQuaG91ciksXHJcbiAgICBkYXlFbmQubWludXRlLFxyXG4gICk7XHJcbiAgY29uc3Qgc2VnbWVudER1cmF0aW9uOiBudW1iZXIgPSBNSU5VVEVTX0lOX0hPVVIgLyBob3VyU2VnbWVudHM7XHJcbiAgY29uc3Qgc3RhcnRPZlZpZXdEYXk6IERhdGUgPSBkYXRlRm5zLnN0YXJ0T2ZEYXkodmlld0RhdGUpO1xyXG5cclxuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgSE9VUlNfSU5fREFZOyBpKyspIHtcclxuICAgIGNvbnN0IHNlZ21lbnRzOiBEYXlWaWV3SG91clNlZ21lbnRbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGhvdXJTZWdtZW50czsgaisrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBkYXRlRm5zLmFkZE1pbnV0ZXMoZGF0ZUZucy5hZGRIb3VycyhzdGFydE9mVmlld0RheSwgaSksIGogKiBzZWdtZW50RHVyYXRpb24pO1xyXG4gICAgICBpZiAoZGF0ZSA+PSBzdGFydE9mVmlldyAmJiBkYXRlIDwgZW5kT2ZWaWV3KSB7XHJcbiAgICAgICAgc2VnbWVudHMucHVzaCh7XHJcbiAgICAgICAgICBkYXRlLFxyXG4gICAgICAgICAgaXNTdGFydDogaiA9PT0gMCxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgaG91cnMucHVzaCh7IHNlZ21lbnRzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGhvdXJzO1xyXG59XHJcbiJdfQ==
|
|
1
|
+
import * as dateFns from 'date-fns';
|
|
2
|
+
const WEEKEND_DAY_NUMBERS = [0, 6];
|
|
3
|
+
const DAYS_IN_WEEK = 7;
|
|
4
|
+
const HOURS_IN_DAY = 24;
|
|
5
|
+
const MINUTES_IN_HOUR = 60;
|
|
6
|
+
export var CalendarEventResponse;
|
|
7
|
+
(function (CalendarEventResponse) {
|
|
8
|
+
CalendarEventResponse[CalendarEventResponse["Maybe"] = 0] = "Maybe";
|
|
9
|
+
CalendarEventResponse[CalendarEventResponse["Accepted"] = 1] = "Accepted";
|
|
10
|
+
CalendarEventResponse[CalendarEventResponse["Rejected"] = 2] = "Rejected";
|
|
11
|
+
})(CalendarEventResponse || (CalendarEventResponse = {}));
|
|
12
|
+
function getExcludedDays({ startDate, days, excluded }) {
|
|
13
|
+
if (excluded.length < 1) {
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
let day = startDate.getDay();
|
|
17
|
+
let reduce = 0;
|
|
18
|
+
for (let i = 0; i < days; i++) {
|
|
19
|
+
if (day === DAYS_IN_WEEK) {
|
|
20
|
+
day = 0;
|
|
21
|
+
}
|
|
22
|
+
if (excluded.some((e) => e === day)) {
|
|
23
|
+
reduce++;
|
|
24
|
+
}
|
|
25
|
+
day++;
|
|
26
|
+
}
|
|
27
|
+
return reduce;
|
|
28
|
+
}
|
|
29
|
+
function getWeekViewEventSpan({ event, offset, startOfWeek, excluded, }) {
|
|
30
|
+
const begin = event.start < startOfWeek ? startOfWeek : event.start;
|
|
31
|
+
let span = 1;
|
|
32
|
+
if (event.end) {
|
|
33
|
+
span = dateFns.differenceInDays(dateFns.addMinutes(dateFns.endOfDay(event.end), 1), dateFns.startOfDay(begin));
|
|
34
|
+
}
|
|
35
|
+
const totalLength = offset + span;
|
|
36
|
+
if (totalLength > DAYS_IN_WEEK) {
|
|
37
|
+
span = DAYS_IN_WEEK - offset;
|
|
38
|
+
}
|
|
39
|
+
return span - getExcludedDays({ startDate: begin, days: span, excluded });
|
|
40
|
+
}
|
|
41
|
+
export function getWeekViewEventOffset({ event, startOfWeek, excluded = [], }) {
|
|
42
|
+
if (event.start < startOfWeek) {
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
const distance = dateFns.differenceInDays(event.start, startOfWeek);
|
|
46
|
+
return distance - getExcludedDays({ startDate: startOfWeek, days: distance, excluded });
|
|
47
|
+
}
|
|
48
|
+
function isEventIsPeriod({ event, periodStart, periodEnd }) {
|
|
49
|
+
const eventStart = event.start;
|
|
50
|
+
const eventEnd = event.end || event.start;
|
|
51
|
+
if (eventStart > periodStart && eventStart < periodEnd) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
if (eventEnd > periodStart && eventEnd < periodEnd) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
if (eventStart < periodStart && eventEnd > periodEnd) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
if (dateFns.isSameSecond(eventStart, periodStart) || dateFns.isSameSecond(eventStart, periodEnd)) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
if (dateFns.isSameSecond(eventEnd, periodStart) || dateFns.isSameSecond(eventEnd, periodEnd)) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
function getEventsInPeriod({ events, periodStart, periodEnd }) {
|
|
69
|
+
return events.filter((event) => isEventIsPeriod({ event, periodStart, periodEnd }));
|
|
70
|
+
}
|
|
71
|
+
function getEventsInTimeRange(events, dayStart, dayEnd) {
|
|
72
|
+
return events.filter((event) => {
|
|
73
|
+
const eventStart = event.start;
|
|
74
|
+
const eventEnd = event.end || eventStart;
|
|
75
|
+
const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(eventStart), dayStart.hour), dayStart.minute);
|
|
76
|
+
const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(eventStart), dayEnd.hour), dayEnd.minute);
|
|
77
|
+
return dateFns.isAfter(eventEnd, startOfView) && dateFns.isBefore(eventStart, endOfView);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function getWeekDay({ date }) {
|
|
81
|
+
const today = dateFns.startOfDay(new Date());
|
|
82
|
+
return {
|
|
83
|
+
date,
|
|
84
|
+
isPast: date < today,
|
|
85
|
+
isToday: dateFns.isSameDay(date, today),
|
|
86
|
+
isFuture: date > today,
|
|
87
|
+
isWeekend: WEEKEND_DAY_NUMBERS.indexOf(dateFns.getDay(date)) > -1,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export function getWeekViewHeader({ viewDate, weekStartsOn, excluded = [], }) {
|
|
91
|
+
const start = dateFns.startOfWeek(viewDate, { weekStartsOn });
|
|
92
|
+
const days = [];
|
|
93
|
+
for (let i = 0; i < DAYS_IN_WEEK; i++) {
|
|
94
|
+
const date = dateFns.addDays(start, i);
|
|
95
|
+
if (!excluded.some((e) => date.getDay() === e)) {
|
|
96
|
+
days.push(getWeekDay({ date }));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return days;
|
|
100
|
+
}
|
|
101
|
+
export function getWeekView({ events = [], viewDate, weekStartsOn, excluded = [], hourSegments, segmentHeight, dayStart, dayEnd, }) {
|
|
102
|
+
if (!events) {
|
|
103
|
+
events = [];
|
|
104
|
+
}
|
|
105
|
+
const startOfViewWeek = dateFns.startOfWeek(viewDate, { weekStartsOn });
|
|
106
|
+
const endOfViewWeek = dateFns.endOfWeek(viewDate, { weekStartsOn });
|
|
107
|
+
const maxRange = DAYS_IN_WEEK - excluded.length;
|
|
108
|
+
const eventsMapped = getEventsInTimeRange(getEventsInPeriod({ events, periodStart: startOfViewWeek, periodEnd: endOfViewWeek }), dayStart, dayEnd)
|
|
109
|
+
.map((event) => {
|
|
110
|
+
const offset = getWeekViewEventOffset({ event, startOfWeek: startOfViewWeek, excluded });
|
|
111
|
+
const span = 1; // getWeekViewEventSpan({ event, offset, startOfWeek: startOfViewWeek, excluded });
|
|
112
|
+
return { event, offset, span };
|
|
113
|
+
})
|
|
114
|
+
.filter((e) => e.offset < maxRange)
|
|
115
|
+
.filter((e) => e.span > 0)
|
|
116
|
+
.map((entry) => ({
|
|
117
|
+
event: entry.event,
|
|
118
|
+
offset: entry.offset,
|
|
119
|
+
span: entry.span,
|
|
120
|
+
startsBeforeWeek: entry.event.start < startOfViewWeek,
|
|
121
|
+
endsAfterWeek: (entry.event.end || entry.event.start) > endOfViewWeek,
|
|
122
|
+
top: 0,
|
|
123
|
+
}))
|
|
124
|
+
.sort((itemA, itemB) => {
|
|
125
|
+
const startSecondsDiff = dateFns.differenceInSeconds(itemA.event.start, itemB.event.start);
|
|
126
|
+
if (startSecondsDiff === 0) {
|
|
127
|
+
return dateFns.differenceInSeconds(itemB.event.end || itemB.event.start, itemA.event.end || itemA.event.start);
|
|
128
|
+
}
|
|
129
|
+
return startSecondsDiff;
|
|
130
|
+
})
|
|
131
|
+
.map((entry) => {
|
|
132
|
+
const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(entry.event.start), dayStart.hour), dayStart.minute);
|
|
133
|
+
const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(entry.event.start)), dayEnd.hour), dayEnd.minute);
|
|
134
|
+
const eventStart = entry.event.start;
|
|
135
|
+
const eventEnd = entry.event.end || eventStart;
|
|
136
|
+
const hourHeightModifier = (hourSegments * segmentHeight) / MINUTES_IN_HOUR;
|
|
137
|
+
if (eventStart > startOfView) {
|
|
138
|
+
entry.top += dateFns.differenceInMinutes(eventStart, startOfView);
|
|
139
|
+
}
|
|
140
|
+
entry.top *= hourHeightModifier;
|
|
141
|
+
const startsBeforeDay = eventStart < startOfView;
|
|
142
|
+
const endsAfterDay = eventEnd > endOfView;
|
|
143
|
+
const startDate = startsBeforeDay ? startOfView : eventStart;
|
|
144
|
+
const endDate = endsAfterDay ? endOfView : eventEnd;
|
|
145
|
+
let height = dateFns.differenceInMinutes(endDate, startDate);
|
|
146
|
+
if (!entry.event.end) {
|
|
147
|
+
height = segmentHeight;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
height *= hourHeightModifier;
|
|
151
|
+
}
|
|
152
|
+
entry.height = height;
|
|
153
|
+
return entry;
|
|
154
|
+
});
|
|
155
|
+
const eventRows = [];
|
|
156
|
+
const allocatedEvents = [];
|
|
157
|
+
eventsMapped.forEach((event, index) => {
|
|
158
|
+
if (allocatedEvents.indexOf(event) === -1) {
|
|
159
|
+
allocatedEvents.push(event);
|
|
160
|
+
const otherRowEvents = eventsMapped.slice(index + 1).filter((nextEvent) => {
|
|
161
|
+
return nextEvent.top === event.top && nextEvent.offset === event.offset;
|
|
162
|
+
});
|
|
163
|
+
if (otherRowEvents.length > 0) {
|
|
164
|
+
const totalEventsForRow = otherRowEvents.length + 1;
|
|
165
|
+
event.span = 1 / totalEventsForRow;
|
|
166
|
+
let nextOffset = event.span + event.offset;
|
|
167
|
+
otherRowEvents.forEach((nextEvent) => {
|
|
168
|
+
nextEvent.offset = nextOffset;
|
|
169
|
+
nextEvent.span = event.span;
|
|
170
|
+
nextOffset = nextEvent.span + nextEvent.offset;
|
|
171
|
+
});
|
|
172
|
+
allocatedEvents.push(...otherRowEvents);
|
|
173
|
+
}
|
|
174
|
+
eventRows.push({
|
|
175
|
+
row: [event, ...otherRowEvents],
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
return eventRows;
|
|
180
|
+
}
|
|
181
|
+
export function getMonthView({ events = [], viewDate, weekStartsOn, excluded = [], }) {
|
|
182
|
+
if (!events) {
|
|
183
|
+
events = [];
|
|
184
|
+
}
|
|
185
|
+
const start = dateFns.startOfWeek(dateFns.startOfMonth(viewDate), { weekStartsOn });
|
|
186
|
+
const end = dateFns.endOfWeek(dateFns.endOfMonth(viewDate), { weekStartsOn });
|
|
187
|
+
const eventsInMonth = getEventsInPeriod({
|
|
188
|
+
events,
|
|
189
|
+
periodStart: start,
|
|
190
|
+
periodEnd: end,
|
|
191
|
+
});
|
|
192
|
+
const days = [];
|
|
193
|
+
for (let i = 0; i < dateFns.differenceInDays(end, start) + 1; i++) {
|
|
194
|
+
const date = dateFns.addDays(start, i);
|
|
195
|
+
if (!excluded.some((e) => date.getDay() === e)) {
|
|
196
|
+
const day = getWeekDay({ date });
|
|
197
|
+
const calEvents = getEventsInPeriod({
|
|
198
|
+
events: eventsInMonth,
|
|
199
|
+
periodStart: dateFns.startOfDay(date),
|
|
200
|
+
periodEnd: dateFns.endOfDay(date),
|
|
201
|
+
});
|
|
202
|
+
day.inMonth = dateFns.isSameMonth(date, viewDate);
|
|
203
|
+
day.events = calEvents;
|
|
204
|
+
day.badgeTotal = calEvents.length;
|
|
205
|
+
days.push(day);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const totalDaysVisibleInWeek = DAYS_IN_WEEK - excluded.length;
|
|
209
|
+
const rows = Math.floor(days.length / totalDaysVisibleInWeek);
|
|
210
|
+
const rowOffsets = [];
|
|
211
|
+
for (let i = 0; i < rows; i++) {
|
|
212
|
+
rowOffsets.push(i * totalDaysVisibleInWeek);
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
rowOffsets,
|
|
216
|
+
totalDaysVisibleInWeek,
|
|
217
|
+
days,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
export function getDayView({ events = [], viewDate, hourSegments, dayStart, dayEnd, eventWidth, segmentHeight }) {
|
|
221
|
+
if (!events) {
|
|
222
|
+
events = [];
|
|
223
|
+
}
|
|
224
|
+
const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(viewDate), dayStart.hour), dayStart.minute);
|
|
225
|
+
const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(viewDate)), dayEnd.hour), dayEnd.minute);
|
|
226
|
+
const previousDayEvents = [];
|
|
227
|
+
const dayViewEvents = getEventsInTimeRange(getEventsInPeriod({
|
|
228
|
+
events: events.filter((event) => !event.allDay),
|
|
229
|
+
periodStart: startOfView,
|
|
230
|
+
periodEnd: endOfView,
|
|
231
|
+
}), dayStart, dayEnd)
|
|
232
|
+
.sort((eventA, eventB) => {
|
|
233
|
+
return eventA.start.valueOf() - eventB.start.valueOf();
|
|
234
|
+
})
|
|
235
|
+
.map((event) => {
|
|
236
|
+
const eventStart = event.start;
|
|
237
|
+
const eventEnd = event.end || eventStart;
|
|
238
|
+
const startsBeforeDay = eventStart < startOfView;
|
|
239
|
+
const endsAfterDay = eventEnd > endOfView;
|
|
240
|
+
const hourHeightModifier = (hourSegments * segmentHeight) / MINUTES_IN_HOUR;
|
|
241
|
+
let top = 0;
|
|
242
|
+
if (eventStart > startOfView) {
|
|
243
|
+
top += dateFns.differenceInMinutes(eventStart, startOfView);
|
|
244
|
+
}
|
|
245
|
+
top *= hourHeightModifier;
|
|
246
|
+
const startDate = startsBeforeDay ? startOfView : eventStart;
|
|
247
|
+
const endDate = endsAfterDay ? endOfView : eventEnd;
|
|
248
|
+
let height = dateFns.differenceInMinutes(endDate, startDate);
|
|
249
|
+
if (!event.end) {
|
|
250
|
+
height = segmentHeight;
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
height *= hourHeightModifier;
|
|
254
|
+
}
|
|
255
|
+
const bottom = top + height;
|
|
256
|
+
const overlappingPreviousEvents = previousDayEvents.filter((previousEvent) => {
|
|
257
|
+
const previousEventTop = previousEvent.top;
|
|
258
|
+
const previousEventBottom = previousEvent.top + previousEvent.height;
|
|
259
|
+
if (top < previousEventBottom && previousEventBottom < bottom) {
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
else if (previousEventTop <= top && bottom <= previousEventBottom) {
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
return false;
|
|
266
|
+
});
|
|
267
|
+
let left = 0;
|
|
268
|
+
while (overlappingPreviousEvents.some((previousEvent) => previousEvent.left === left)) {
|
|
269
|
+
left += eventWidth;
|
|
270
|
+
}
|
|
271
|
+
const dayEvent = {
|
|
272
|
+
event,
|
|
273
|
+
height,
|
|
274
|
+
width: eventWidth,
|
|
275
|
+
top,
|
|
276
|
+
left,
|
|
277
|
+
startsBeforeDay,
|
|
278
|
+
endsAfterDay,
|
|
279
|
+
};
|
|
280
|
+
if (height > 0) {
|
|
281
|
+
previousDayEvents.push(dayEvent);
|
|
282
|
+
}
|
|
283
|
+
return dayEvent;
|
|
284
|
+
})
|
|
285
|
+
.filter((dayEvent) => dayEvent.height > 0);
|
|
286
|
+
const width = Math.max(...dayViewEvents.map((event) => event.left + event.width));
|
|
287
|
+
const allDayEvents = getEventsInPeriod({
|
|
288
|
+
events: events.filter((event) => event.allDay),
|
|
289
|
+
periodStart: dateFns.startOfDay(startOfView),
|
|
290
|
+
periodEnd: dateFns.endOfDay(endOfView),
|
|
291
|
+
});
|
|
292
|
+
return {
|
|
293
|
+
events: dayViewEvents,
|
|
294
|
+
width,
|
|
295
|
+
allDayEvents,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
export function getDayViewHourGrid({ viewDate, hourSegments, dayStart, dayEnd, }) {
|
|
299
|
+
const hours = [];
|
|
300
|
+
const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(viewDate), dayStart.hour), dayStart.minute);
|
|
301
|
+
const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(viewDate)), dayEnd.hour), dayEnd.minute);
|
|
302
|
+
const segmentDuration = MINUTES_IN_HOUR / hourSegments;
|
|
303
|
+
const startOfViewDay = dateFns.startOfDay(viewDate);
|
|
304
|
+
for (let i = 0; i < HOURS_IN_DAY; i++) {
|
|
305
|
+
const segments = [];
|
|
306
|
+
for (let j = 0; j < hourSegments; j++) {
|
|
307
|
+
const date = dateFns.addMinutes(dateFns.addHours(startOfViewDay, i), j * segmentDuration);
|
|
308
|
+
if (date >= startOfView && date < endOfView) {
|
|
309
|
+
segments.push({
|
|
310
|
+
date,
|
|
311
|
+
isStart: j === 0,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (segments.length > 0) {
|
|
316
|
+
hours.push({ segments });
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return hours;
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FsZW5kYXJVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9ub3ZvLWVsZW1lbnRzL25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJ1dGlscy9jYWxlbmRhci11dGlscy9DYWxlbmRhclV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBRXBDLE1BQU0sbUJBQW1CLEdBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0MsTUFBTSxZQUFZLEdBQVcsQ0FBQyxDQUFDO0FBQy9CLE1BQU0sWUFBWSxHQUFXLEVBQUUsQ0FBQztBQUNoQyxNQUFNLGVBQWUsR0FBVyxFQUFFLENBQUM7QUFFbkMsTUFBTSxDQUFOLElBQVkscUJBSVg7QUFKRCxXQUFZLHFCQUFxQjtJQUMvQixtRUFBSyxDQUFBO0lBQ0wseUVBQVEsQ0FBQTtJQUNSLHlFQUFRLENBQUE7QUFDVixDQUFDLEVBSlcscUJBQXFCLEtBQXJCLHFCQUFxQixRQUloQztBQWdJRCxTQUFTLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUF5RDtJQUMzRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7SUFDRCxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckMsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDO0lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsSUFBSSxHQUFHLEtBQUssWUFBWSxFQUFFO1lBQ3hCLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDVDtRQUNELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFF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WixJQUFJO29CQUNKLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQztpQkFDakIsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtRQUNELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDMUI7S0FDRjtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGRhdGVGbnMgZnJvbSAnZGF0ZS1mbnMnO1xuXG5jb25zdCBXRUVLRU5EX0RBWV9OVU1CRVJTOiBudW1iZXJbXSA9IFswLCA2XTtcbmNvbnN0IERBWVNfSU5fV0VFSzogbnVtYmVyID0gNztcbmNvbnN0IEhPVVJTX0lOX0RBWTogbnVtYmVyID0gMjQ7XG5jb25zdCBNSU5VVEVTX0lOX0hPVVI6IG51bWJlciA9IDYwO1xuXG5leHBvcnQgZW51bSBDYWxlbmRhckV2ZW50UmVzcG9uc2Uge1xuICBNYXliZSxcbiAgQWNjZXB0ZWQsXG4gIFJlamVjdGVkLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyRXZlbnRUaW1lc0NoYW5nZWRFdmVudCB7XG4gIGV2ZW50OiBDYWxlbmRhckV2ZW50O1xuICBuZXdTdGFydDogRGF0ZTtcbiAgbmV3RW5kPzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWVrRGF5IHtcbiAgZGF0ZTogRGF0ZTtcbiAgaXNQYXN0OiBib29sZWFuO1xuICBpc1RvZGF5OiBib29sZWFuO1xuICBpc0Z1dHVyZTogYm9vbGVhbjtcbiAgaXNXZWVrZW5kOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50Q29sb3Ige1xuICBwcmltYXJ5OiBzdHJpbmc7XG4gIHNlY29uZGFyeTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50QWN0aW9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XG4gIG9uQ2xpY2soeyBldmVudCB9OiB7IGV2ZW50OiBDYWxlbmRhckV2ZW50IH0pOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJFdmVudCB7XG4gIGlkPzogbnVtYmVyO1xuICBzdGFydDogRGF0ZTtcbiAgZW5kPzogRGF0ZTtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNvbG9yOiBFdmVudENvbG9yO1xuICB0eXBlPzogc3RyaW5nO1xuICByZXNwb25zZT86IENhbGVuZGFyRXZlbnRSZXNwb25zZTtcbiAgYWN0aW9ucz86IEV2ZW50QWN0aW9uW107XG4gIGFsbERheT86IGJvb2xlYW47XG4gIGNzc0NsYXNzPzogc3RyaW5nO1xuICByZXNpemFibGU/OiB7XG4gICAgYmVmb3JlU3RhcnQ/OiBib29sZWFuO1xuICAgIGFmdGVyRW5kPzogYm9vbGVhbjtcbiAgfTtcbiAgZHJhZ2dhYmxlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWVrVmlld0V2ZW50IHtcbiAgZXZlbnQ6IENhbGVuZGFyRXZlbnQ7XG4gIG9mZnNldDogbnVtYmVyO1xuICBzcGFuOiBudW1iZXI7XG4gIHN0YXJ0c0JlZm9yZVdlZWs6IGJvb2xlYW47XG4gIGVuZHNBZnRlcldlZWs6IGJvb2xlYW47XG4gIHRvcD86IG51bWJlcjtcbiAgaGVpZ2h0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlZWtWaWV3RXZlbnRSb3cge1xuICByb3c6IFdlZWtWaWV3RXZlbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb250aFZpZXdEYXkgZXh0ZW5kcyBXZWVrRGF5IHtcbiAgaW5Nb250aDogYm9vbGVhbjtcbiAgZXZlbnRzOiBDYWxlbmRhckV2ZW50W107XG4gIGJhY2tncm91bmRDb2xvcj86IHN0cmluZztcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XG4gIGJhZGdlVG90YWw6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb250aFZpZXcge1xuICByb3dPZmZzZXRzOiBudW1iZXJbXTtcbiAgZGF5czogTW9udGhWaWV3RGF5W107XG4gIHRvdGFsRGF5c1Zpc2libGVJbldlZWs6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXlWaWV3RXZlbnQge1xuICBldmVudDogQ2FsZW5kYXJFdmVudDtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIHRvcDogbnVtYmVyO1xuICBsZWZ0OiBudW1iZXI7XG4gIHN0YXJ0c0JlZm9yZURheTogYm9vbGVhbjtcbiAgZW5kc0FmdGVyRGF5OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERheVZpZXcge1xuICBldmVudHM6IERheVZpZXdFdmVudFtdO1xuICB3aWR0aDogbnVtYmVyO1xuICBhbGxEYXlFdmVudHM6IENhbGVuZGFyRXZlbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXlWaWV3SG91clNlZ21lbnQge1xuICBpc1N0YXJ0OiBib29sZWFuO1xuICBkYXRlOiBEYXRlO1xuICBjc3NDbGFzcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXlWaWV3SG91ciB7XG4gIHNlZ21lbnRzOiBEYXlWaWV3SG91clNlZ21lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJc0V2ZW50SW5QZXJpb2RBcmdzIHtcbiAgZXZlbnQ6IENhbGVuZGFyRXZlbnQ7XG4gIHBlcmlvZFN0YXJ0OiBEYXRlO1xuICBwZXJpb2RFbmQ6IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RXZlbnRzSW5QZXJpb2RBcmdzIHtcbiAgZXZlbnRzOiBDYWxlbmRhckV2ZW50W107XG4gIHBlcmlvZFN0YXJ0OiBEYXRlO1xuICBwZXJpb2RFbmQ6IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RGF5Vmlld0FyZ3Mge1xuICBldmVudHM/OiBDYWxlbmRhckV2ZW50W107XG4gIHZpZXdEYXRlOiBEYXRlO1xuICBob3VyU2VnbWVudHM6IG51bWJlcjtcbiAgZGF5U3RhcnQ6IHtcbiAgICBob3VyOiBudW1iZXI7XG4gICAgbWludXRlOiBudW1iZXI7XG4gIH07XG4gIGRheUVuZDoge1xuICAgIGhvdXI6IG51bWJlcjtcbiAgICBtaW51dGU6IG51bWJlcjtcbiAgfTtcbiAgZXZlbnRXaWR0aDogbnVtYmVyO1xuICBzZWdtZW50SGVpZ2h0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGdldEV4Y2x1ZGVkRGF5cyh7IHN0YXJ0RGF0ZSwgZGF5cywgZXhjbHVkZWQgfTogeyBzdGFydERhdGU6IERhdGU7IGRheXM6IG51bWJlcjsgZXhjbHVkZWQ6IG51bWJlcltdIH0pOiBudW1iZXIge1xuICBpZiAoZXhjbHVkZWQubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGxldCBkYXk6IG51bWJlciA9IHN0YXJ0RGF0ZS5nZXREYXkoKTtcbiAgbGV0IHJlZHVjZTogbnVtYmVyID0gMDtcbiAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRheXM7IGkrKykge1xuICAgIGlmIChkYXkgPT09IERBWVNfSU5fV0VFSykge1xuICAgICAgZGF5ID0gMDtcbiAgICB9XG4gICAgaWYgKGV4Y2x1ZGVkLnNvbWUoKGUpID0+IGUgPT09IGRheSkpIHtcbiAgICAgIHJlZHVjZSsrO1xuICAgIH1cbiAgICBkYXkrKztcbiAgfVxuICByZXR1cm4gcmVkdWNlO1xufVxuXG5mdW5jdGlvbiBnZXRXZWVrVmlld0V2ZW50U3Bhbih7XG4gIGV2ZW50LFxuICBvZmZzZXQsXG4gIHN0YXJ0T2ZXZWVrLFxuICBleGNsdWRlZCxcbn06IHtcbiAgZXZlbnQ6IENhbGVuZGFyRXZlbnQ7XG4gIG9mZnNldDogbnVtYmVyO1xuICBzdGFydE9mV2VlazogRGF0ZTtcbiAgZXhjbHVkZWQ6IG51bWJlcltdO1xufSk6IG51bWJlciB7XG4gIGNvbnN0IGJlZ2luOiBEYXRlID0gZXZlbnQuc3RhcnQgPCBzdGFydE9mV2VlayA/IHN0YXJ0T2ZXZWVrIDogZXZlbnQuc3RhcnQ7XG4gIGxldCBzcGFuOiBudW1iZXIgPSAxO1xuICBpZiAoZXZlbnQuZW5kKSB7XG4gICAgc3BhbiA9IGRhdGVGbnMuZGlmZmVyZW5jZUluRGF5cyhkYXRlRm5zLmFkZE1pbnV0ZXMoZGF0ZUZucy5lbmRPZkRheShldmVudC5lbmQpLCAxKSwgZGF0ZUZucy5zdGFydE9mRGF5KGJlZ2luKSk7XG4gIH1cbiAgY29uc3QgdG90YWxMZW5ndGg6IG51bWJlciA9IG9mZnNldCArIHNwYW47XG4gIGlmICh0b3RhbExlbmd0aCA+IERBWVNfSU5fV0VFSykge1xuICAgIHNwYW4gPSBEQVlTX0lOX1dFRUsgLSBvZmZzZXQ7XG4gIH1cbiAgcmV0dXJuIHNwYW4gLSBnZXRFeGNsdWRlZERheXMoeyBzdGFydERhdGU6IGJlZ2luLCBkYXlzOiBzcGFuLCBleGNsdWRlZCB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtWaWV3RXZlbnRPZmZzZXQoe1xuICBldmVudCxcbiAgc3RhcnRPZldlZWssXG4gIGV4Y2x1ZGVkID0gW10sXG59OiB7XG4gIGV2ZW50OiBDYWxlbmRhckV2ZW50O1xuICBzdGFydE9mV2VlazogRGF0ZTtcbiAgZXhjbHVkZWQ/OiBudW1iZXJbXTtcbn0pOiBudW1iZXIge1xuICBpZiAoZXZlbnQuc3RhcnQgPCBzdGFydE9mV2Vlaykge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGRpc3RhbmNlOiBudW1iZXIgPSBkYXRlRm5zLmRpZmZlcmVuY2VJbkRheXMoZXZlbnQuc3RhcnQsIHN0YXJ0T2ZXZWVrKTtcbiAgcmV0dXJuIGRpc3RhbmNlIC0gZ2V0RXhjbHVkZWREYXlzKHsgc3RhcnREYXRlOiBzdGFydE9mV2VlaywgZGF5czogZGlzdGFuY2UsIGV4Y2x1ZGVkIH0pO1xufVxuXG5mdW5jdGlvbiBpc0V2ZW50SXNQZXJpb2QoeyBldmVudCwgcGVyaW9kU3RhcnQsIHBlcmlvZEVuZCB9OiBJc0V2ZW50SW5QZXJpb2RBcmdzKTogYm9vbGVhbiB7XG4gIGNvbnN0IGV2ZW50U3RhcnQ6IERhdGUgPSBldmVudC5zdGFydDtcbiAgY29uc3QgZXZlbnRFbmQ6IERhdGUgPSBldmVudC5lbmQgfHwgZXZlbnQuc3RhcnQ7XG5cbiAgaWYgKGV2ZW50U3RhcnQgPiBwZXJpb2RTdGFydCAmJiBldmVudFN0YXJ0IDwgcGVyaW9kRW5kKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZXZlbnRFbmQgPiBwZXJpb2RTdGFydCAmJiBldmVudEVuZCA8IHBlcmlvZEVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGV2ZW50U3RhcnQgPCBwZXJpb2RTdGFydCAmJiBldmVudEVuZCA+IHBlcmlvZEVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRhdGVGbnMuaXNTYW1lU2Vjb25kKGV2ZW50U3RhcnQsIHBlcmlvZFN0YXJ0KSB8fCBkYXRlRm5zLmlzU2FtZVNlY29uZChldmVudFN0YXJ0LCBwZXJpb2RFbmQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZGF0ZUZucy5pc1NhbWVTZWNvbmQoZXZlbnRFbmQsIHBlcmlvZFN0YXJ0KSB8fCBkYXRlRm5zLmlzU2FtZVNlY29uZChldmVudEVuZCwgcGVyaW9kRW5kKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudHNJblBlcmlvZCh7IGV2ZW50cywgcGVyaW9kU3RhcnQsIHBlcmlvZEVuZCB9OiBHZXRFdmVudHNJblBlcmlvZEFyZ3MpOiBDYWxlbmRhckV2ZW50W10ge1xuICByZXR1cm4gZXZlbnRzLmZpbHRlcigoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IGlzRXZlbnRJc1BlcmlvZCh7IGV2ZW50LCBwZXJpb2RTdGFydCwgcGVyaW9kRW5kIH0pKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRzSW5UaW1lUmFuZ2UoZXZlbnRzOiBDYWxlbmRhckV2ZW50W10sIGRheVN0YXJ0OiBhbnksIGRheUVuZDogYW55KSB7XG4gIHJldHVybiBldmVudHMuZmlsdGVyKChldmVudCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50U3RhcnQ6IERhdGUgPSBldmVudC5zdGFydDtcbiAgICBjb25zdCBldmVudEVuZDogRGF0ZSA9IGV2ZW50LmVuZCB8fCBldmVudFN0YXJ0O1xuXG4gICAgY29uc3Qgc3RhcnRPZlZpZXc6IERhdGUgPSBkYXRlRm5zLnNldE1pbnV0ZXMoZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZEYXkoZXZlbnRTdGFydCksIGRheVN0YXJ0LmhvdXIpLCBkYXlTdGFydC5taW51dGUpO1xuICAgIGNvbnN0IGVuZE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhkYXRlRm5zLnNldEhvdXJzKGRhdGVGbnMuc3RhcnRPZk1pbnV0ZShldmVudFN0YXJ0KSwgZGF5RW5kLmhvdXIpLCBkYXlFbmQubWludXRlKTtcblxuICAgIHJldHVybiBkYXRlRm5zLmlzQWZ0ZXIoZXZlbnRFbmQsIHN0YXJ0T2ZWaWV3KSAmJiBkYXRlRm5zLmlzQmVmb3JlKGV2ZW50U3RhcnQsIGVuZE9mVmlldyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXZWVrRGF5KHsgZGF0ZSB9OiB7IGRhdGU6IERhdGUgfSk6IFdlZWtEYXkge1xuICBjb25zdCB0b2RheTogRGF0ZSA9IGRhdGVGbnMuc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcbiAgcmV0dXJuIHtcbiAgICBkYXRlLFxuICAgIGlzUGFzdDogZGF0ZSA8IHRvZGF5LFxuICAgIGlzVG9kYXk6IGRhdGVGbnMuaXNTYW1lRGF5KGRhdGUsIHRvZGF5KSxcbiAgICBpc0Z1dHVyZTogZGF0ZSA+IHRvZGF5LFxuICAgIGlzV2Vla2VuZDogV0VFS0VORF9EQVlfTlVNQkVSUy5pbmRleE9mKGRhdGVGbnMuZ2V0RGF5KGRhdGUpKSA+IC0xLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2Vla1ZpZXdIZWFkZXIoe1xuICB2aWV3RGF0ZSxcbiAgd2Vla1N0YXJ0c09uLFxuICBleGNsdWRlZCA9IFtdLFxufToge1xuICB2aWV3RGF0ZTogRGF0ZTtcbiAgd2Vla1N0YXJ0c09uOiBudW1iZXI7XG4gIGV4Y2x1ZGVkPzogbnVtYmVyW107XG59KTogV2Vla0RheVtdIHtcbiAgY29uc3Qgc3RhcnQ6IERhdGUgPSBkYXRlRm5zLnN0YXJ0T2ZXZWVrKHZpZXdEYXRlLCB7IHdlZWtTdGFydHNPbiB9KTtcbiAgY29uc3QgZGF5czogV2Vla0RheVtdID0gW107XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBEQVlTX0lOX1dFRUs7IGkrKykge1xuICAgIGNvbnN0IGRhdGU6IERhdGUgPSBkYXRlRm5zLmFkZERheXMoc3RhcnQsIGkpO1xuICAgIGlmICghZXhjbHVkZWQuc29tZSgoZSkgPT4gZGF0ZS5nZXREYXkoKSA9PT0gZSkpIHtcbiAgICAgIGRheXMucHVzaChnZXRXZWVrRGF5KHsgZGF0ZSB9KSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRheXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWVrVmlldyh7XG4gIGV2ZW50cyA9IFtdLFxuICB2aWV3RGF0ZSxcbiAgd2Vla1N0YXJ0c09uLFxuICBleGNsdWRlZCA9IFtdLFxuICBob3VyU2VnbWVudHMsXG4gIHNlZ21lbnRIZWlnaHQsXG4gIGRheVN0YXJ0LFxuICBkYXlFbmQsXG59OiB7XG4gIGV2ZW50cz86IENhbGVuZGFyRXZlbnRbXTtcbiAgdmlld0RhdGU6IERhdGU7XG4gIHdlZWtTdGFydHNPbjogbnVtYmVyO1xuICBleGNsdWRlZD86IG51bWJlcltdO1xuICBob3VyU2VnbWVudHM6IG51bWJlcjtcbiAgc2VnbWVudEhlaWdodDogbnVtYmVyO1xuICBkYXlTdGFydDogYW55O1xuICBkYXlFbmQ6IGFueTtcbn0pOiBXZWVrVmlld0V2ZW50Um93W10ge1xuICBpZiAoIWV2ZW50cykge1xuICAgIGV2ZW50cyA9IFtdO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRPZlZpZXdXZWVrOiBEYXRlID0gZGF0ZUZucy5zdGFydE9mV2Vlayh2aWV3RGF0ZSwgeyB3ZWVrU3RhcnRzT24gfSk7XG4gIGNvbnN0IGVuZE9mVmlld1dlZWs6IERhdGUgPSBkYXRlRm5zLmVuZE9mV2Vlayh2aWV3RGF0ZSwgeyB3ZWVrU3RhcnRzT24gfSk7XG4gIGNvbnN0IG1heFJhbmdlOiBudW1iZXIgPSBEQVlTX0lOX1dFRUsgLSBleGNsdWRlZC5sZW5ndGg7XG5cbiAgY29uc3QgZXZlbnRzTWFwcGVkOiBXZWVrVmlld0V2ZW50W10gPSBnZXRFdmVudHNJblRpbWVSYW5nZShcbiAgICBnZXRFdmVudHNJblBlcmlvZCh7IGV2ZW50cywgcGVyaW9kU3RhcnQ6IHN0YXJ0T2ZWaWV3V2VlaywgcGVyaW9kRW5kOiBlbmRPZlZpZXdXZWVrIH0pLFxuICAgIGRheVN0YXJ0LFxuICAgIGRheUVuZCxcbiAgKVxuICAgIC5tYXAoKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQ6IG51bWJlciA9IGdldFdlZWtWaWV3RXZlbnRPZmZzZXQoeyBldmVudCwgc3RhcnRPZldlZWs6IHN0YXJ0T2ZWaWV3V2VlaywgZXhjbHVkZWQgfSk7XG4gICAgICBjb25zdCBzcGFuOiBudW1iZXIgPSAxOyAvLyBnZXRXZWVrVmlld0V2ZW50U3Bhbih7IGV2ZW50LCBvZmZzZXQsIHN0YXJ0T2ZXZWVrOiBzdGFydE9mVmlld1dlZWssIGV4Y2x1ZGVkIH0pO1xuICAgICAgcmV0dXJuIHsgZXZlbnQsIG9mZnNldCwgc3BhbiB9O1xuICAgIH0pXG4gICAgLmZpbHRlcigoZSkgPT4gZS5vZmZzZXQgPCBtYXhSYW5nZSlcbiAgICAuZmlsdGVyKChlKSA9PiBlLnNwYW4gPiAwKVxuICAgIC5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LFxuICAgICAgb2Zmc2V0OiBlbnRyeS5vZmZzZXQsXG4gICAgICBzcGFuOiBlbnRyeS5zcGFuLFxuICAgICAgc3RhcnRzQmVmb3JlV2VlazogZW50cnkuZXZlbnQuc3RhcnQgPCBzdGFydE9mVmlld1dlZWssXG4gICAgICBlbmRzQWZ0ZXJXZWVrOiAoZW50cnkuZXZlbnQuZW5kIHx8IGVudHJ5LmV2ZW50LnN0YXJ0KSA+IGVuZE9mVmlld1dlZWssXG4gICAgICB0b3A6IDAsXG4gICAgfSkpXG4gICAgLnNvcnQoXG4gICAgICAoaXRlbUEsIGl0ZW1CKTogbnVtYmVyID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRTZWNvbmRzRGlmZjogbnVtYmVyID0gZGF0ZUZucy5kaWZmZXJlbmNlSW5TZWNvbmRzKGl0ZW1BLmV2ZW50LnN0YXJ0LCBpdGVtQi5ldmVudC5zdGFydCk7XG4gICAgICAgIGlmIChzdGFydFNlY29uZHNEaWZmID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGVGbnMuZGlmZmVyZW5jZUluU2Vjb25kcyhpdGVtQi5ldmVudC5lbmQgfHwgaXRlbUIuZXZlbnQuc3RhcnQsIGl0ZW1BLmV2ZW50LmVuZCB8fCBpdGVtQS5ldmVudC5zdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXJ0U2Vjb25kc0RpZmY7XG4gICAgICB9LFxuICAgIClcbiAgICAubWFwKChlbnRyeTogV2Vla1ZpZXdFdmVudCkgPT4ge1xuICAgICAgY29uc3Qgc3RhcnRPZlZpZXc6IERhdGUgPSBkYXRlRm5zLnNldE1pbnV0ZXMoZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZEYXkoZW50cnkuZXZlbnQuc3RhcnQpLCBkYXlTdGFydC5ob3VyKSwgZGF5U3RhcnQubWludXRlKTtcbiAgICAgIGNvbnN0IGVuZE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhcbiAgICAgICAgZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZNaW51dGUoZGF0ZUZucy5lbmRPZkRheShlbnRyeS5ldmVudC5zdGFydCkpLCBkYXlFbmQuaG91ciksXG4gICAgICAgIGRheUVuZC5taW51dGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBldmVudFN0YXJ0OiBEYXRlID0gZW50cnkuZXZlbnQuc3RhcnQ7XG4gICAgICBjb25zdCBldmVudEVuZDogRGF0ZSA9IGVudHJ5LmV2ZW50LmVuZCB8fCBldmVudFN0YXJ0O1xuXG4gICAgICBjb25zdCBob3VySGVpZ2h0TW9kaWZpZXI6IG51bWJlciA9IChob3VyU2VnbWVudHMgKiBzZWdtZW50SGVpZ2h0KSAvIE1JTlVURVNfSU5fSE9VUjtcblxuICAgICAgaWYgKGV2ZW50U3RhcnQgPiBzdGFydE9mVmlldykge1xuICAgICAgICBlbnRyeS50b3AgKz0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGV2ZW50U3RhcnQsIHN0YXJ0T2ZWaWV3KTtcbiAgICAgIH1cblxuICAgICAgZW50cnkudG9wICo9IGhvdXJIZWlnaHRNb2RpZmllcjtcblxuICAgICAgY29uc3Qgc3RhcnRzQmVmb3JlRGF5OiBib29sZWFuID0gZXZlbnRTdGFydCA8IHN0YXJ0T2ZWaWV3O1xuICAgICAgY29uc3QgZW5kc0FmdGVyRGF5OiBib29sZWFuID0gZXZlbnRFbmQgPiBlbmRPZlZpZXc7XG5cbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZTogRGF0ZSA9IHN0YXJ0c0JlZm9yZURheSA/IHN0YXJ0T2ZWaWV3IDogZXZlbnRTdGFydDtcbiAgICAgIGNvbnN0IGVuZERhdGU6IERhdGUgPSBlbmRzQWZ0ZXJEYXkgPyBlbmRPZlZpZXcgOiBldmVudEVuZDtcblxuICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGVuZERhdGUsIHN0YXJ0RGF0ZSk7XG5cbiAgICAgIGlmICghZW50cnkuZXZlbnQuZW5kKSB7XG4gICAgICAgIGhlaWdodCA9IHNlZ21lbnRIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWlnaHQgKj0gaG91ckhlaWdodE1vZGlmaWVyO1xuICAgICAgfVxuXG4gICAgICBlbnRyeS5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9KTtcblxuICBjb25zdCBldmVudFJvd3M6IFdlZWtWaWV3RXZlbnRSb3dbXSA9IFtdO1xuICBjb25zdCBhbGxvY2F0ZWRFdmVudHM6IFdlZWtWaWV3RXZlbnRbXSA9IFtdO1xuXG4gIGV2ZW50c01hcHBlZC5mb3JFYWNoKChldmVudDogV2Vla1ZpZXdFdmVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGlmIChhbGxvY2F0ZWRFdmVudHMuaW5kZXhPZihldmVudCkgPT09IC0xKSB7XG4gICAgICBhbGxvY2F0ZWRFdmVudHMucHVzaChldmVudCk7XG5cbiAgICAgIGNvbnN0IG90aGVyUm93RXZlbnRzOiBXZWVrVmlld0V2ZW50W10gPSBldmVudHNNYXBwZWQuc2xpY2UoaW5kZXggKyAxKS5maWx0ZXIoKG5leHRFdmVudCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV4dEV2ZW50LnRvcCA9PT0gZXZlbnQudG9wICYmIG5leHRFdmVudC5vZmZzZXQgPT09IGV2ZW50Lm9mZnNldDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3RoZXJSb3dFdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b3RhbEV2ZW50c0ZvclJvdyA9IG90aGVyUm93RXZlbnRzLmxlbmd0aCArIDE7XG5cbiAgICAgICAgZXZlbnQuc3BhbiA9IDEgLyB0b3RhbEV2ZW50c0ZvclJvdztcblxuICAgICAgICBsZXQgbmV4dE9mZnNldCA9IGV2ZW50LnNwYW4gKyBldmVudC5vZmZzZXQ7XG5cbiAgICAgICAgb3RoZXJSb3dFdmVudHMuZm9yRWFjaCgobmV4dEV2ZW50OiBXZWVrVmlld0V2ZW50KSA9PiB7XG4gICAgICAgICAgbmV4dEV2ZW50Lm9mZnNldCA9IG5leHRPZmZzZXQ7XG4gICAgICAgICAgbmV4dEV2ZW50LnNwYW4gPSBldmVudC5zcGFuO1xuICAgICAgICAgIG5leHRPZmZzZXQgPSBuZXh0RXZlbnQuc3BhbiArIG5leHRFdmVudC5vZmZzZXQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFsbG9jYXRlZEV2ZW50cy5wdXNoKC4uLm90aGVyUm93RXZlbnRzKTtcbiAgICAgIH1cblxuICAgICAgZXZlbnRSb3dzLnB1c2goe1xuICAgICAgICByb3c6IFtldmVudCwgLi4ub3RoZXJSb3dFdmVudHNdLFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZXZlbnRSb3dzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9udGhWaWV3KHtcbiAgZXZlbnRzID0gW10sXG4gIHZpZXdEYXRlLFxuICB3ZWVrU3RhcnRzT24sXG4gIGV4Y2x1ZGVkID0gW10sXG59OiB7XG4gIGV2ZW50cz86IENhbGVuZGFyRXZlbnRbXTtcbiAgdmlld0RhdGU6IERhdGU7XG4gIHdlZWtTdGFydHNPbjogbnVtYmVyO1xuICBleGNsdWRlZD86IG51bWJlcltdO1xufSk6IE1vbnRoVmlldyB7XG4gIGlmICghZXZlbnRzKSB7XG4gICAgZXZlbnRzID0gW107XG4gIH1cblxuICBjb25zdCBzdGFydDogRGF0ZSA9IGRhdGVGbnMuc3RhcnRPZldlZWsoZGF0ZUZucy5zdGFydE9mTW9udGgodmlld0RhdGUpLCB7IHdlZWtTdGFydHNPbiB9KTtcbiAgY29uc3QgZW5kOiBEYXRlID0gZGF0ZUZucy5lbmRPZldlZWsoZGF0ZUZucy5lbmRPZk1vbnRoKHZpZXdEYXRlKSwgeyB3ZWVrU3RhcnRzT24gfSk7XG4gIGNvbnN0IGV2ZW50c0luTW9udGg6IENhbGVuZGFyRXZlbnRbXSA9IGdldEV2ZW50c0luUGVyaW9kKHtcbiAgICBldmVudHMsXG4gICAgcGVyaW9kU3RhcnQ6IHN0YXJ0LFxuICAgIHBlcmlvZEVuZDogZW5kLFxuICB9KTtcbiAgY29uc3QgZGF5czogTW9udGhWaWV3RGF5W10gPSBbXTtcbiAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRhdGVGbnMuZGlmZmVyZW5jZUluRGF5cyhlbmQsIHN0YXJ0KSArIDE7IGkrKykge1xuICAgIGNvbnN0IGRhdGU6IERhdGUgPSBkYXRlRm5zLmFkZERheXMoc3RhcnQsIGkpO1xuICAgIGlmICghZXhjbHVkZWQuc29tZSgoZSkgPT4gZGF0ZS5nZXREYXkoKSA9PT0gZSkpIHtcbiAgICAgIGNvbnN0IGRheTogTW9udGhWaWV3RGF5ID0gZ2V0V2Vla0RheSh7IGRhdGUgfSkgYXMgTW9udGhWaWV3RGF5O1xuICAgICAgY29uc3QgY2FsRXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBnZXRFdmVudHNJblBlcmlvZCh7XG4gICAgICAgIGV2ZW50czogZXZlbnRzSW5Nb250aCxcbiAgICAgICAgcGVyaW9kU3RhcnQ6IGRhdGVGbnMuc3RhcnRPZkRheShkYXRlKSxcbiAgICAgICAgcGVyaW9kRW5kOiBkYXRlRm5zLmVuZE9mRGF5KGRhdGUpLFxuICAgICAgfSk7XG4gICAgICBkYXkuaW5Nb250aCA9IGRhdGVGbnMuaXNTYW1lTW9udGgoZGF0ZSwgdmlld0RhdGUpO1xuICAgICAgZGF5LmV2ZW50cyA9IGNhbEV2ZW50cztcbiAgICAgIGRheS5iYWRnZVRvdGFsID0gY2FsRXZlbnRzLmxlbmd0aDtcbiAgICAgIGRheXMucHVzaChkYXkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRvdGFsRGF5c1Zpc2libGVJbldlZWs6IG51bWJlciA9IERBWVNfSU5fV0VFSyAtIGV4Y2x1ZGVkLmxlbmd0aDtcbiAgY29uc3Qgcm93czogbnVtYmVyID0gTWF0aC5mbG9vcihkYXlzLmxlbmd0aCAvIHRvdGFsRGF5c1Zpc2libGVJbldlZWspO1xuICBjb25zdCByb3dPZmZzZXRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgcm93T2Zmc2V0cy5wdXNoKGkgKiB0b3RhbERheXNWaXNpYmxlSW5XZWVrKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcm93T2Zmc2V0cyxcbiAgICB0b3RhbERheXNWaXNpYmxlSW5XZWVrLFxuICAgIGRheXMsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXlWaWV3KHsgZXZlbnRzID0gW10sIHZpZXdEYXRlLCBob3VyU2VnbWVudHMsIGRheVN0YXJ0LCBkYXlFbmQsIGV2ZW50V2lkdGgsIHNlZ21lbnRIZWlnaHQgfTogR2V0RGF5Vmlld0FyZ3MpOiBEYXlWaWV3IHtcbiAgaWYgKCFldmVudHMpIHtcbiAgICBldmVudHMgPSBbXTtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0T2ZWaWV3OiBEYXRlID0gZGF0ZUZucy5zZXRNaW51dGVzKGRhdGVGbnMuc2V0SG91cnMoZGF0ZUZucy5zdGFydE9mRGF5KHZpZXdEYXRlKSwgZGF5U3RhcnQuaG91ciksIGRheVN0YXJ0Lm1pbnV0ZSk7XG4gIGNvbnN0IGVuZE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhcbiAgICBkYXRlRm5zLnNldEhvdXJzKGRhdGVGbnMuc3RhcnRPZk1pbnV0ZShkYXRlRm5zLmVuZE9mRGF5KHZpZXdEYXRlKSksIGRheUVuZC5ob3VyKSxcbiAgICBkYXlFbmQubWludXRlLFxuICApO1xuICBjb25zdCBwcmV2aW91c0RheUV2ZW50czogRGF5Vmlld0V2ZW50W10gPSBbXTtcblxuICBjb25zdCBkYXlWaWV3RXZlbnRzOiBEYXlWaWV3RXZlbnRbXSA9IGdldEV2ZW50c0luVGltZVJhbmdlKFxuICAgIGdldEV2ZW50c0luUGVyaW9kKHtcbiAgICAgIGV2ZW50czogZXZlbnRzLmZpbHRlcigoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+ICFldmVudC5hbGxEYXkpLFxuICAgICAgcGVyaW9kU3RhcnQ6IHN0YXJ0T2ZWaWV3LFxuICAgICAgcGVyaW9kRW5kOiBlbmRPZlZpZXcsXG4gICAgfSksXG4gICAgZGF5U3RhcnQsXG4gICAgZGF5RW5kLFxuICApXG4gICAgLnNvcnQoKGV2ZW50QTogQ2FsZW5kYXJFdmVudCwgZXZlbnRCOiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgICByZXR1cm4gZXZlbnRBLnN0YXJ0LnZhbHVlT2YoKSAtIGV2ZW50Qi5zdGFydC52YWx1ZU9mKCk7XG4gICAgfSlcbiAgICAubWFwKChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRTdGFydDogRGF0ZSA9IGV2ZW50LnN0YXJ0O1xuICAgICAgY29uc3QgZXZlbnRFbmQ6IERhdGUgPSBldmVudC5lbmQgfHwgZXZlbnRTdGFydDtcbiAgICAgIGNvbnN0IHN0YXJ0c0JlZm9yZURheTogYm9vbGVhbiA9IGV2ZW50U3RhcnQgPCBzdGFydE9mVmlldztcbiAgICAgIGNvbnN0IGVuZHNBZnRlckRheTogYm9vbGVhbiA9IGV2ZW50RW5kID4gZW5kT2ZWaWV3O1xuICAgICAgY29uc3QgaG91ckhlaWdodE1vZGlmaWVyOiBudW1iZXIgPSAoaG91clNlZ21lbnRzICogc2VnbWVudEhlaWdodCkgLyBNSU5VVEVTX0lOX0hPVVI7XG5cbiAgICAgIGxldCB0b3A6IG51bWJlciA9IDA7XG5cbiAgICAgIGlmIChldmVudFN0YXJ0ID4gc3RhcnRPZlZpZXcpIHtcbiAgICAgICAgdG9wICs9IGRhdGVGbnMuZGlmZmVyZW5jZUluTWludXRlcyhldmVudFN0YXJ0LCBzdGFydE9mVmlldyk7XG4gICAgICB9XG5cbiAgICAgIHRvcCAqPSBob3VySGVpZ2h0TW9kaWZpZXI7XG5cbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZTogRGF0ZSA9IHN0YXJ0c0JlZm9yZURheSA/IHN0YXJ0T2ZWaWV3IDogZXZlbnRTdGFydDtcbiAgICAgIGNvbnN0IGVuZERhdGU6IERhdGUgPSBlbmRzQWZ0ZXJEYXkgPyBlbmRPZlZpZXcgOiBldmVudEVuZDtcblxuICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGVuZERhdGUsIHN0YXJ0RGF0ZSk7XG5cbiAgICAgIGlmICghZXZlbnQuZW5kKSB7XG4gICAgICAgIGhlaWdodCA9IHNlZ21lbnRIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWlnaHQgKj0gaG91ckhlaWdodE1vZGlmaWVyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBib3R0b206IG51bWJlciA9IHRvcCArIGhlaWdodDtcblxuICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdQcmV2aW91c0V2ZW50czogRGF5Vmlld0V2ZW50W10gPSBwcmV2aW91c0RheUV2ZW50cy5maWx0ZXIoKHByZXZpb3VzRXZlbnQ6IERheVZpZXdFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aW91c0V2ZW50VG9wOiBudW1iZXIgPSBwcmV2aW91c0V2ZW50LnRvcDtcbiAgICAgICAgY29uc3QgcHJldmlvdXNFdmVudEJvdHRvbTogbnVtYmVyID0gcHJldmlvdXNFdmVudC50b3AgKyBwcmV2aW91c0V2ZW50LmhlaWdodDtcblxuICAgICAgICBpZiAodG9wIDwgcHJldmlvdXNFdmVudEJvdHRvbSAmJiBwcmV2aW91c0V2ZW50Qm90dG9tIDwgYm90dG9tKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNFdmVudFRvcCA8PSB0b3AgJiYgYm90dG9tIDw9IHByZXZpb3VzRXZlbnRCb3R0b20pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgbGVmdDogbnVtYmVyID0gMDtcblxuICAgICAgd2hpbGUgKG92ZXJsYXBwaW5nUHJldmlvdXNFdmVudHMuc29tZSgocHJldmlvdXNFdmVudCkgPT4gcHJldmlvdXNFdmVudC5sZWZ0ID09PSBsZWZ0KSkge1xuICAgICAgICBsZWZ0ICs9IGV2ZW50V2lkdGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRheUV2ZW50OiBEYXlWaWV3RXZlbnQgPSB7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHdpZHRoOiBldmVudFdpZHRoLFxuICAgICAgICB0b3AsXG4gICAgICAgIGxlZnQsXG4gICAgICAgIHN0YXJ0c0JlZm9yZURheSxcbiAgICAgICAgZW5kc0FmdGVyRGF5LFxuICAgICAgfTtcblxuICAgICAgaWYgKGhlaWdodCA+IDApIHtcbiAgICAgICAgcHJldmlvdXNEYXlFdmVudHMucHVzaChkYXlFdmVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXlFdmVudDtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGRheUV2ZW50OiBEYXlWaWV3RXZlbnQpID0+IGRheUV2ZW50LmhlaWdodCA+IDApO1xuXG4gIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBNYXRoLm1heCguLi5kYXlWaWV3RXZlbnRzLm1hcCgoZXZlbnQ6IERheVZpZXdFdmVudCkgPT4gZXZlbnQubGVmdCArIGV2ZW50LndpZHRoKSk7XG4gIGNvbnN0IGFsbERheUV2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gZ2V0RXZlbnRzSW5QZXJpb2Qoe1xuICAgIGV2ZW50czogZXZlbnRzLmZpbHRlcigoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IGV2ZW50LmFsbERheSksXG4gICAgcGVyaW9kU3RhcnQ6IGRhdGVGbnMuc3RhcnRPZkRheShzdGFydE9mVmlldyksXG4gICAgcGVyaW9kRW5kOiBkYXRlRm5zLmVuZE9mRGF5KGVuZE9mVmlldyksXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZXZlbnRzOiBkYXlWaWV3RXZlbnRzLFxuICAgIHdpZHRoLFxuICAgIGFsbERheUV2ZW50cyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERheVZpZXdIb3VyR3JpZCh7XG4gIHZpZXdEYXRlLFxuICBob3VyU2VnbWVudHMsXG4gIGRheVN0YXJ0LFxuICBkYXlFbmQsXG59OiB7XG4gIHZpZXdEYXRlOiBEYXRlO1xuICBob3VyU2VnbWVudHM6IG51bWJlcjtcbiAgZGF5U3RhcnQ6IGFueTtcbiAgZGF5RW5kOiBhbnk7XG59KTogRGF5Vmlld0hvdXJbXSB7XG4gIGNvbnN0IGhvdXJzOiBEYXlWaWV3SG91cltdID0gW107XG5cbiAgY29uc3Qgc3RhcnRPZlZpZXc6IERhdGUgPSBkYXRlRm5zLnNldE1pbnV0ZXMoZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZEYXkodmlld0RhdGUpLCBkYXlTdGFydC5ob3VyKSwgZGF5U3RhcnQubWludXRlKTtcbiAgY29uc3QgZW5kT2ZWaWV3OiBEYXRlID0gZGF0ZUZucy5zZXRNaW51dGVzKFxuICAgIGRhdGVGbnMuc2V0SG91cnMoZGF0ZUZucy5zdGFydE9mTWludXRlKGRhdGVGbnMuZW5kT2ZEYXkodmlld0RhdGUpKSwgZGF5RW5kLmhvdXIpLFxuICAgIGRheUVuZC5taW51dGUsXG4gICk7XG4gIGNvbnN0IHNlZ21lbnREdXJhdGlvbjogbnVtYmVyID0gTUlOVVRFU19JTl9IT1VSIC8gaG91clNlZ21lbnRzO1xuICBjb25zdCBzdGFydE9mVmlld0RheTogRGF0ZSA9IGRhdGVGbnMuc3RhcnRPZkRheSh2aWV3RGF0ZSk7XG5cbiAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IEhPVVJTX0lOX0RBWTsgaSsrKSB7XG4gICAgY29uc3Qgc2VnbWVudHM6IERheVZpZXdIb3VyU2VnbWVudFtdID0gW107XG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGhvdXJTZWdtZW50czsgaisrKSB7XG4gICAgICBjb25zdCBkYXRlOiBEYXRlID0gZGF0ZUZucy5hZGRNaW51dGVzKGRhdGVGbnMuYWRkSG91cnMoc3RhcnRPZlZpZXdEYXksIGkpLCBqICogc2VnbWVudER1cmF0aW9uKTtcbiAgICAgIGlmIChkYXRlID49IHN0YXJ0T2ZWaWV3ICYmIGRhdGUgPCBlbmRPZlZpZXcpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgICAgZGF0ZSxcbiAgICAgICAgICBpc1N0YXJ0OiBqID09PSAwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGhvdXJzLnB1c2goeyBzZWdtZW50cyB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaG91cnM7XG59XG4iXX0=
|