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,16 +1,16 @@
|
|
|
1
|
-
// NG2
|
|
2
|
-
import { NgModule } from '@angular/core';
|
|
3
|
-
import { CommonModule } from '@angular/common';
|
|
4
|
-
// APP
|
|
5
|
-
import { NovoButtonModule } from './../button/Button.module';
|
|
6
|
-
import { NovoModalContainerElement, NovoModalElement, NovoModalNotificationElement } from './Modal';
|
|
7
|
-
export class NovoModalModule {
|
|
8
|
-
}
|
|
9
|
-
NovoModalModule.decorators = [
|
|
10
|
-
{ type: NgModule, args: [{
|
|
11
|
-
imports: [CommonModule, NovoButtonModule],
|
|
12
|
-
declarations: [NovoModalContainerElement, NovoModalElement, NovoModalNotificationElement],
|
|
13
|
-
exports: [NovoModalElement, NovoModalNotificationElement],
|
|
14
|
-
},] }
|
|
15
|
-
];
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
// NG2
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
// APP
|
|
5
|
+
import { NovoButtonModule } from './../button/Button.module';
|
|
6
|
+
import { NovoModalContainerElement, NovoModalElement, NovoModalNotificationElement } from './Modal';
|
|
7
|
+
export class NovoModalModule {
|
|
8
|
+
}
|
|
9
|
+
NovoModalModule.decorators = [
|
|
10
|
+
{ type: NgModule, args: [{
|
|
11
|
+
imports: [CommonModule, NovoButtonModule],
|
|
12
|
+
declarations: [NovoModalContainerElement, NovoModalElement, NovoModalNotificationElement],
|
|
13
|
+
exports: [NovoModalElement, NovoModalNotificationElement],
|
|
14
|
+
},] }
|
|
15
|
+
];
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kYWwubW9kdWxlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3J1bm5lci93b3JrL25vdm8tZWxlbWVudHMvbm92by1lbGVtZW50cy9wcm9qZWN0cy9ub3ZvLWVsZW1lbnRzL3NyYy8iLCJzb3VyY2VzIjpbImVsZW1lbnRzL21vZGFsL01vZGFsLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNO0FBQ04sT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsTUFBTTtBQUNOLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQU9wRyxNQUFNLE9BQU8sZUFBZTs7O1lBTDNCLFFBQVEsU0FBQztnQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7Z0JBQ3pDLFlBQVksRUFBRSxDQUFDLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLDRCQUE0QixDQUFDO2dCQUN6RixPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSw0QkFBNEIsQ0FBQzthQUMxRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIE5HMlxuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG4vLyBBUFBcbmltcG9ydCB7IE5vdm9CdXR0b25Nb2R1bGUgfSBmcm9tICcuLy4uL2J1dHRvbi9CdXR0b24ubW9kdWxlJztcbmltcG9ydCB7IE5vdm9Nb2RhbENvbnRhaW5lckVsZW1lbnQsIE5vdm9Nb2RhbEVsZW1lbnQsIE5vdm9Nb2RhbE5vdGlmaWNhdGlvbkVsZW1lbnQgfSBmcm9tICcuL01vZGFsJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTm92b0J1dHRvbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW05vdm9Nb2RhbENvbnRhaW5lckVsZW1lbnQsIE5vdm9Nb2RhbEVsZW1lbnQsIE5vdm9Nb2RhbE5vdGlmaWNhdGlvbkVsZW1lbnRdLFxuICBleHBvcnRzOiBbTm92b01vZGFsRWxlbWVudCwgTm92b01vZGFsTm90aWZpY2F0aW9uRWxlbWVudF0sXG59KVxuZXhwb3J0IGNsYXNzIE5vdm9Nb2RhbE1vZHVsZSB7IH1cbiJdfQ==
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
// NG2
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
// APP
|
|
4
|
-
import { NovoModalRef, NovoModalParams, NovoModalContainerElement } from './Modal';
|
|
5
|
-
import { ComponentUtils } from './../../utils/component-utils/ComponentUtils';
|
|
6
|
-
export class NovoModalService {
|
|
7
|
-
constructor(componentUtils) {
|
|
8
|
-
this.componentUtils = componentUtils;
|
|
9
|
-
}
|
|
10
|
-
set parentViewContainer(view) {
|
|
11
|
-
this._parentViewContainer = view;
|
|
12
|
-
}
|
|
13
|
-
open(component, scope = {}) {
|
|
14
|
-
if (!this._parentViewContainer) {
|
|
15
|
-
throw new Error('No parent view container specified for the ModalService. Set it inside your main application. \nthis.modalService.parentViewContainer = view (ViewContainerRef)');
|
|
16
|
-
}
|
|
17
|
-
const modal = new NovoModalRef();
|
|
18
|
-
modal.component = component;
|
|
19
|
-
modal.open();
|
|
20
|
-
const providers = [{ provide: NovoModalRef, useValue: modal }, { provide: NovoModalParams, useValue: scope }];
|
|
21
|
-
modal.containerRef = this.componentUtils.append(NovoModalContainerElement, this._parentViewContainer, providers);
|
|
22
|
-
return modal;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
NovoModalService.decorators = [
|
|
26
|
-
{ type: Injectable }
|
|
27
|
-
];
|
|
28
|
-
NovoModalService.ctorParameters = () => [
|
|
29
|
-
{ type: ComponentUtils }
|
|
30
|
-
];
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
// NG2
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
// APP
|
|
4
|
+
import { NovoModalRef, NovoModalParams, NovoModalContainerElement } from './Modal';
|
|
5
|
+
import { ComponentUtils } from './../../utils/component-utils/ComponentUtils';
|
|
6
|
+
export class NovoModalService {
|
|
7
|
+
constructor(componentUtils) {
|
|
8
|
+
this.componentUtils = componentUtils;
|
|
9
|
+
}
|
|
10
|
+
set parentViewContainer(view) {
|
|
11
|
+
this._parentViewContainer = view;
|
|
12
|
+
}
|
|
13
|
+
open(component, scope = {}) {
|
|
14
|
+
if (!this._parentViewContainer) {
|
|
15
|
+
throw new Error('No parent view container specified for the ModalService. Set it inside your main application. \nthis.modalService.parentViewContainer = view (ViewContainerRef)');
|
|
16
|
+
}
|
|
17
|
+
const modal = new NovoModalRef();
|
|
18
|
+
modal.component = component;
|
|
19
|
+
modal.open();
|
|
20
|
+
const providers = [{ provide: NovoModalRef, useValue: modal }, { provide: NovoModalParams, useValue: scope }];
|
|
21
|
+
modal.containerRef = this.componentUtils.append(NovoModalContainerElement, this._parentViewContainer, providers);
|
|
22
|
+
return modal;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
NovoModalService.decorators = [
|
|
26
|
+
{ type: Injectable }
|
|
27
|
+
];
|
|
28
|
+
NovoModalService.ctorParameters = () => [
|
|
29
|
+
{ type: ComponentUtils }
|
|
30
|
+
];
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kYWxTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3J1bm5lci93b3JrL25vdm8tZWxlbWVudHMvbm92by1lbGVtZW50cy9wcm9qZWN0cy9ub3ZvLWVsZW1lbnRzL3NyYy8iLCJzb3VyY2VzIjpbImVsZW1lbnRzL21vZGFsL01vZGFsU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNO0FBQ04sT0FBTyxFQUFFLFVBQVUsRUFBMEMsTUFBTSxlQUFlLENBQUM7QUFDbkYsTUFBTTtBQUNOLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUc5RSxNQUFNLE9BQU8sZ0JBQWdCO0lBRzNCLFlBQW9CLGNBQThCO1FBQTlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUFHLENBQUM7SUFFdEQsSUFBSSxtQkFBbUIsQ0FBQyxJQUFzQjtRQUM1QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLENBQUksU0FBa0IsRUFBRSxLQUFLLEdBQUcsRUFBRTtRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUtBQWlLLENBQUMsQ0FBQztTQUNwTDtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDNUIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWIsTUFBTSxTQUFTLEdBQXFCLENBQUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDaEksS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDakgsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzs7WUF0QkYsVUFBVTs7O1lBRkYsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIi8vIE5HMlxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgVmlld0NvbnRhaW5lclJlZiwgU3RhdGljUHJvdmlkZXIsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbi8vIEFQUFxuaW1wb3J0IHsgTm92b01vZGFsUmVmLCBOb3ZvTW9kYWxQYXJhbXMsIE5vdm9Nb2RhbENvbnRhaW5lckVsZW1lbnQgfSBmcm9tICcuL01vZGFsJztcbmltcG9ydCB7IENvbXBvbmVudFV0aWxzIH0gZnJvbSAnLi8uLi8uLi91dGlscy9jb21wb25lbnQtdXRpbHMvQ29tcG9uZW50VXRpbHMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTm92b01vZGFsU2VydmljZSB7XG4gIF9wYXJlbnRWaWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29tcG9uZW50VXRpbHM6IENvbXBvbmVudFV0aWxzKSB7fVxuXG4gIHNldCBwYXJlbnRWaWV3Q29udGFpbmVyKHZpZXc6IFZpZXdDb250YWluZXJSZWYpIHtcbiAgICB0aGlzLl9wYXJlbnRWaWV3Q29udGFpbmVyID0gdmlldztcbiAgfVxuXG4gIG9wZW48VD4oY29tcG9uZW50OiBUeXBlPFQ+LCBzY29wZSA9IHt9KTogTm92b01vZGFsUmVmIHtcbiAgICBpZiAoIXRoaXMuX3BhcmVudFZpZXdDb250YWluZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcGFyZW50IHZpZXcgY29udGFpbmVyIHNwZWNpZmllZCBmb3IgdGhlIE1vZGFsU2VydmljZS4gU2V0IGl0IGluc2lkZSB5b3VyIG1haW4gYXBwbGljYXRpb24uIFxcbnRoaXMubW9kYWxTZXJ2aWNlLnBhcmVudFZpZXdDb250YWluZXIgPSB2aWV3IChWaWV3Q29udGFpbmVyUmVmKScpO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZGFsID0gbmV3IE5vdm9Nb2RhbFJlZigpO1xuICAgIG1vZGFsLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICBtb2RhbC5vcGVuKCk7XG5cbiAgICBjb25zdCBwcm92aWRlcnM6IFN0YXRpY1Byb3ZpZGVyW10gPSBbeyBwcm92aWRlOiBOb3ZvTW9kYWxSZWYsIHVzZVZhbHVlOiBtb2RhbCB9LCB7IHByb3ZpZGU6IE5vdm9Nb2RhbFBhcmFtcywgdXNlVmFsdWU6IHNjb3BlIH1dO1xuICAgIG1vZGFsLmNvbnRhaW5lclJlZiA9IHRoaXMuY29tcG9uZW50VXRpbHMuYXBwZW5kKE5vdm9Nb2RhbENvbnRhaW5lckVsZW1lbnQsIHRoaXMuX3BhcmVudFZpZXdDb250YWluZXIsIHByb3ZpZGVycyk7XG4gICAgcmV0dXJuIG1vZGFsO1xuICB9XG59XG4iXX0=
|
|
@@ -1,600 +1,600 @@
|
|
|
1
|
-
// NG2
|
|
2
|
-
import { Component, ElementRef, EventEmitter, forwardRef, Input, Output } from '@angular/core';
|
|
3
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
-
// Vendor
|
|
5
|
-
import { ReplaySubject } from 'rxjs';
|
|
6
|
-
import { NovoLabelService } from '../../services/novo-label-service';
|
|
7
|
-
import { Helpers } from '../../utils/Helpers';
|
|
8
|
-
import { KeyCodes } from '../../utils/key-codes/KeyCodes';
|
|
9
|
-
// Value accessor for the component (supports ngModel)
|
|
10
|
-
const CHIPS_VALUE_ACCESSOR = {
|
|
11
|
-
provide: NG_VALUE_ACCESSOR,
|
|
12
|
-
useExisting: forwardRef(() => NovoMultiPickerElement),
|
|
13
|
-
multi: true,
|
|
14
|
-
};
|
|
15
|
-
export class NovoMultiPickerElement {
|
|
16
|
-
constructor(element, labels) {
|
|
17
|
-
this.element = element;
|
|
18
|
-
this.labels = labels;
|
|
19
|
-
this.placeholder = '';
|
|
20
|
-
this.changed = new EventEmitter();
|
|
21
|
-
this.focus = new EventEmitter();
|
|
22
|
-
this.blur = new EventEmitter();
|
|
23
|
-
this.items = [];
|
|
24
|
-
this._items = new ReplaySubject(1);
|
|
25
|
-
this.selected = null;
|
|
26
|
-
this.config = {};
|
|
27
|
-
// private data model
|
|
28
|
-
this._value = {};
|
|
29
|
-
this.notShown = {};
|
|
30
|
-
this.onModelChange = () => { };
|
|
31
|
-
this.onModelTouched = () => { };
|
|
32
|
-
this.chipsCount = 4;
|
|
33
|
-
}
|
|
34
|
-
get value() {
|
|
35
|
-
return this._value;
|
|
36
|
-
}
|
|
37
|
-
set value(selectedItems) {
|
|
38
|
-
if (selectedItems) {
|
|
39
|
-
this.types.forEach((x) => (this._value[x.value] = selectedItems[x.value]));
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
this._value = {};
|
|
43
|
-
this.types.forEach((x) => (this._value[x.value] = []));
|
|
44
|
-
}
|
|
45
|
-
this.changed.emit(selectedItems);
|
|
46
|
-
this.onModelChange(selectedItems);
|
|
47
|
-
}
|
|
48
|
-
ngOnInit() {
|
|
49
|
-
this.selectAllOption = this.source.selectAllOption || false;
|
|
50
|
-
this.chipsCount = this.source.chipsCount || 4;
|
|
51
|
-
this.strictRelationship = this.source.strictRelationship || false;
|
|
52
|
-
this.setupOptions();
|
|
53
|
-
}
|
|
54
|
-
clearValue() {
|
|
55
|
-
this.types.forEach((type) => this.modifyAllOfType(type.value, 'unselect'));
|
|
56
|
-
this.items = [];
|
|
57
|
-
this._items.next(this.items);
|
|
58
|
-
this.setInitialValue(null);
|
|
59
|
-
this.onModelChange(this.value);
|
|
60
|
-
}
|
|
61
|
-
removeFromDisplay(event, item) {
|
|
62
|
-
this.remove(true, item);
|
|
63
|
-
this.modifyAffectedParentsOrChildren(false, item);
|
|
64
|
-
}
|
|
65
|
-
setupOptions() {
|
|
66
|
-
this.options = this.source.options || [];
|
|
67
|
-
this._options = [];
|
|
68
|
-
if (this.options) {
|
|
69
|
-
this.options.forEach((option) => {
|
|
70
|
-
const formattedOption = this.setupOptionsByType(option);
|
|
71
|
-
this._options.push(formattedOption);
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
this.source.options = this._options;
|
|
75
|
-
}
|
|
76
|
-
setupOptionsByType(section) {
|
|
77
|
-
const formattedSection = {
|
|
78
|
-
type: section.type,
|
|
79
|
-
label: section.label || section.type,
|
|
80
|
-
};
|
|
81
|
-
formattedSection.data = section.data.map((item) => {
|
|
82
|
-
return this.formatOption(section, item);
|
|
83
|
-
});
|
|
84
|
-
if (this.selectAllOption) {
|
|
85
|
-
const selectAll = this.createSelectAllOption(section);
|
|
86
|
-
formattedSection.data.splice(0, 0, selectAll);
|
|
87
|
-
}
|
|
88
|
-
formattedSection.originalData = formattedSection.data.slice();
|
|
89
|
-
return formattedSection;
|
|
90
|
-
}
|
|
91
|
-
formatOption(section, item) {
|
|
92
|
-
const obj = {
|
|
93
|
-
value: section.field ? item[section.field] : item.value || item,
|
|
94
|
-
label: section.format ? Helpers.interpolate(section.format, item) : item.label || String(item.value || item),
|
|
95
|
-
type: section.type,
|
|
96
|
-
checked: undefined,
|
|
97
|
-
isParentOf: section.isParentOf,
|
|
98
|
-
isChildOf: section.isChildOf,
|
|
99
|
-
};
|
|
100
|
-
if (obj.isChildOf) {
|
|
101
|
-
obj[section.isChildOf] = item[section.isChildOf];
|
|
102
|
-
}
|
|
103
|
-
return obj;
|
|
104
|
-
}
|
|
105
|
-
createSelectAllOption(section) {
|
|
106
|
-
const selectAll = {
|
|
107
|
-
value: 'ALL',
|
|
108
|
-
label: `All ${section.type}`,
|
|
109
|
-
type: section.type,
|
|
110
|
-
checked: this.model && this.model.length && this.model.indexOf('ALL') !== -1,
|
|
111
|
-
isParentOf: section.isParentOf,
|
|
112
|
-
isChildOf: section.isChildOf,
|
|
113
|
-
};
|
|
114
|
-
if (section.isChildOf) {
|
|
115
|
-
const allParents = section.data.reduce((accum, next) => {
|
|
116
|
-
return accum.concat(next[section.isChildOf]);
|
|
117
|
-
}, []);
|
|
118
|
-
selectAll[section.isChildOf] = allParents;
|
|
119
|
-
}
|
|
120
|
-
return selectAll;
|
|
121
|
-
}
|
|
122
|
-
deselectAll() {
|
|
123
|
-
this.selected = null;
|
|
124
|
-
}
|
|
125
|
-
select(event, item) {
|
|
126
|
-
this.blur.emit(event);
|
|
127
|
-
this.deselectAll();
|
|
128
|
-
this.selected = item;
|
|
129
|
-
}
|
|
130
|
-
onFocus(e) {
|
|
131
|
-
this.element.nativeElement.classList.add('selected');
|
|
132
|
-
this.focus.emit(e);
|
|
133
|
-
}
|
|
134
|
-
clickOption(event) {
|
|
135
|
-
if (event && !(event instanceof Event)) {
|
|
136
|
-
if (event.checked === false) {
|
|
137
|
-
this.remove(null, event);
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
this.add(event);
|
|
141
|
-
}
|
|
142
|
-
this.modifyAffectedParentsOrChildren(event.checked, event);
|
|
143
|
-
// Set focus on the picker
|
|
144
|
-
const input = this.element.nativeElement.querySelector('novo-picker > input');
|
|
145
|
-
if (input) {
|
|
146
|
-
input.focus();
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
add(event) {
|
|
151
|
-
if (event.value === 'ALL') {
|
|
152
|
-
this.modifyAllOfType(event.type, 'select');
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
this.updateDisplayItems(event, 'add');
|
|
156
|
-
this.value[event.type].push(event.value);
|
|
157
|
-
this.updateAllItemState(event.type);
|
|
158
|
-
this.triggerValueUpdate();
|
|
159
|
-
}
|
|
160
|
-
this.updateParentOrChildren(event, 'select');
|
|
161
|
-
this.select(null, event);
|
|
162
|
-
}
|
|
163
|
-
updateAllItemState(type) {
|
|
164
|
-
const allOfType = this.getAllOfType(type);
|
|
165
|
-
const allOfTypeSelected = this.allItemsSelected(allOfType, type);
|
|
166
|
-
if (allOfTypeSelected) {
|
|
167
|
-
this.selectAll(allOfType, type);
|
|
168
|
-
}
|
|
169
|
-
return { allOfType, allOfTypeSelected };
|
|
170
|
-
}
|
|
171
|
-
setIndeterminateState(allOfType, status) {
|
|
172
|
-
if (!this.selectAllOption) {
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
const allItem = allOfType[0];
|
|
176
|
-
allItem.indeterminate = status;
|
|
177
|
-
}
|
|
178
|
-
updateDisplayItems(item, action) {
|
|
179
|
-
const adding = action === 'add';
|
|
180
|
-
if (adding) {
|
|
181
|
-
this.items.push(item);
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
if (this.items.indexOf(item) > -1) {
|
|
185
|
-
this.items.splice(this.items.indexOf(item), 1);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
this.updateDisplayText(this.items);
|
|
189
|
-
this._items.next(this.items);
|
|
190
|
-
}
|
|
191
|
-
updateDisplayText(items) {
|
|
192
|
-
this.notShown = [];
|
|
193
|
-
const notShown = items.slice(this.chipsCount);
|
|
194
|
-
if (notShown.length > 0) {
|
|
195
|
-
this.types.forEach((type) => {
|
|
196
|
-
let count;
|
|
197
|
-
const selectedOfType = notShown.filter((x) => x.type === type.value);
|
|
198
|
-
if (selectedOfType.length === 1 && selectedOfType[0].value === 'ALL') {
|
|
199
|
-
count = this.getAllOfType(type.value).length - 1;
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
count = selectedOfType.length;
|
|
203
|
-
}
|
|
204
|
-
const displayType = count === 1 ? type.singular : type.plural || type.value;
|
|
205
|
-
if (count > 0) {
|
|
206
|
-
this.notShown.push({ type: displayType, count });
|
|
207
|
-
}
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
remove(event, item) {
|
|
212
|
-
let triggeredByEvent;
|
|
213
|
-
if (event) {
|
|
214
|
-
triggeredByEvent = true;
|
|
215
|
-
}
|
|
216
|
-
const itemToRemove = item;
|
|
217
|
-
if (itemToRemove.value === 'ALL') {
|
|
218
|
-
triggeredByEvent = false;
|
|
219
|
-
this.modifyAllOfType(itemToRemove.type, 'unselect');
|
|
220
|
-
}
|
|
221
|
-
else if (this.allOfTypeSelected(itemToRemove.type)) {
|
|
222
|
-
this.handleRemoveItemIfAllSelected(itemToRemove);
|
|
223
|
-
}
|
|
224
|
-
this.removeItem(item, triggeredByEvent);
|
|
225
|
-
}
|
|
226
|
-
removeItem(item, triggeredByEvent) {
|
|
227
|
-
item.checked = false;
|
|
228
|
-
this.deselectAll();
|
|
229
|
-
this.removeValue(item);
|
|
230
|
-
if (item.value !== 'ALL') {
|
|
231
|
-
this.updateParentOrChildren(item, 'unselect');
|
|
232
|
-
}
|
|
233
|
-
if (triggeredByEvent) {
|
|
234
|
-
this.modifyAffectedParentsOrChildren(false, item);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
removeValue(item) {
|
|
238
|
-
const updatedValues = this.value[item.type].filter((x) => x !== item.value);
|
|
239
|
-
this.value[item.type] = updatedValues;
|
|
240
|
-
this.triggerValueUpdate();
|
|
241
|
-
this.updateDisplayItems(item, 'remove');
|
|
242
|
-
}
|
|
243
|
-
onKeyDown(event) {
|
|
244
|
-
if (event.keyCode === KeyCodes.BACKSPACE) {
|
|
245
|
-
if (event.target && event.target.value.length === 0 && this.items.length) {
|
|
246
|
-
if (event) {
|
|
247
|
-
event.stopPropagation();
|
|
248
|
-
event.preventDefault();
|
|
249
|
-
}
|
|
250
|
-
if (this.selected) {
|
|
251
|
-
this.remove(null, this.selected);
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
this.select(event, this.items[this.items.length - 1]);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
allOfTypeSelected(type) {
|
|
260
|
-
return this.items.filter((x) => x.type === type && x.value === 'ALL').length > 0;
|
|
261
|
-
}
|
|
262
|
-
modifyAllOfType(type, action) {
|
|
263
|
-
const selecting = action === 'select';
|
|
264
|
-
const allOfType = this.getAllOfType(type);
|
|
265
|
-
allOfType.forEach((item) => {
|
|
266
|
-
item.checked = selecting;
|
|
267
|
-
item.indeterminate = false;
|
|
268
|
-
});
|
|
269
|
-
if (selecting) {
|
|
270
|
-
this.selectAll(allOfType, type);
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
this.items = [...this.items.filter((x) => x.type !== type)];
|
|
274
|
-
this._items.next(this.items);
|
|
275
|
-
this.value[type] = [];
|
|
276
|
-
}
|
|
277
|
-
if (this.selectAllOption) {
|
|
278
|
-
this.updateAllParentsOrChildren(allOfType[0], action);
|
|
279
|
-
}
|
|
280
|
-
this.triggerValueUpdate();
|
|
281
|
-
}
|
|
282
|
-
triggerValueUpdate() {
|
|
283
|
-
const updatedObject = {};
|
|
284
|
-
this.types.forEach((x) => (updatedObject[x.value] = this.value[x.value]));
|
|
285
|
-
this.value = updatedObject;
|
|
286
|
-
}
|
|
287
|
-
selectAll(allOfType, type) {
|
|
288
|
-
if (!this.selectAllOption) {
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
allOfType[0].checked = true;
|
|
292
|
-
const values = allOfType.map((i) => {
|
|
293
|
-
return i.value;
|
|
294
|
-
});
|
|
295
|
-
// remove 'ALL' value
|
|
296
|
-
values.splice(0, 1);
|
|
297
|
-
this.value[type] = values;
|
|
298
|
-
const updatedItems = this.items.filter((x) => x.type !== type);
|
|
299
|
-
this.items = updatedItems;
|
|
300
|
-
this.updateDisplayItems(allOfType[0], 'add');
|
|
301
|
-
}
|
|
302
|
-
handleRemoveItemIfAllSelected(item) {
|
|
303
|
-
if (!this.selectAllOption) {
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
const type = item.type;
|
|
307
|
-
const allOfType = this.getAllOfType(type);
|
|
308
|
-
const allItem = allOfType[0];
|
|
309
|
-
this.removeItem(allItem);
|
|
310
|
-
allItem.indeterminate = true;
|
|
311
|
-
const selectedItems = allOfType.filter((i) => i.checked === true);
|
|
312
|
-
this.items = [...this.items, ...selectedItems];
|
|
313
|
-
const values = selectedItems.map((i) => {
|
|
314
|
-
return i.value;
|
|
315
|
-
});
|
|
316
|
-
this.value[type] = [...values];
|
|
317
|
-
}
|
|
318
|
-
handleOutsideClick(event) {
|
|
319
|
-
// If the elements doesn't contain the target element, it is an outside click
|
|
320
|
-
if (!this.element.nativeElement.contains(event.target)) {
|
|
321
|
-
this.blur.emit(event);
|
|
322
|
-
this.deselectAll();
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
getAllOfType(type) {
|
|
326
|
-
return this._options.filter((x) => x.type === type)[0].originalData;
|
|
327
|
-
}
|
|
328
|
-
updateParentOrChildren(item, action) {
|
|
329
|
-
if (this.strictRelationship && item.isParentOf) {
|
|
330
|
-
this.updateChildrenValue(item, action);
|
|
331
|
-
}
|
|
332
|
-
else if (item.isChildOf && this.selectAllOption) {
|
|
333
|
-
this.updateParentValue(item, action);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
modifyAffectedParentsOrChildren(selecting, itemChanged) {
|
|
337
|
-
if (!itemChanged.isChildOf && !itemChanged.isParentOf) {
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
const parent = this.types.filter((x) => !!x.isParentOf)[0];
|
|
341
|
-
const parentType = parent.value;
|
|
342
|
-
const allParentType = this.getAllOfType(parentType);
|
|
343
|
-
const childType = allParentType[0].isParentOf;
|
|
344
|
-
const allChildren = this.getAllOfType(childType);
|
|
345
|
-
const allCheckedChildren = allChildren.filter((x) => !!x.checked);
|
|
346
|
-
allParentType.forEach((obj) => {
|
|
347
|
-
if (obj.value === 'ALL') {
|
|
348
|
-
return;
|
|
349
|
-
}
|
|
350
|
-
const selectedChildrenOfParent = allCheckedChildren.filter((x) => {
|
|
351
|
-
return x[parentType].filter((y) => y === obj.value).length > 0;
|
|
352
|
-
});
|
|
353
|
-
if (selecting) {
|
|
354
|
-
if (obj.checked) {
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
obj.indeterminate = selectedChildrenOfParent.length > 0;
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
const allChildrenOfParent = allChildren.filter((x) => {
|
|
361
|
-
return x.value !== 'ALL' && x[parentType].filter((y) => y === obj.value).length > 0;
|
|
362
|
-
});
|
|
363
|
-
if (selectedChildrenOfParent.length > 0) {
|
|
364
|
-
if (obj.checked) {
|
|
365
|
-
if (this.strictRelationship && allChildrenOfParent.length !== selectedChildrenOfParent.length) {
|
|
366
|
-
obj.indeterminate = true;
|
|
367
|
-
obj.checked = false;
|
|
368
|
-
this.removeValue(obj);
|
|
369
|
-
this.addIndividualChildren(selectedChildrenOfParent);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
else {
|
|
373
|
-
obj.indeterminate = true;
|
|
374
|
-
}
|
|
375
|
-
if (this.strictRelationship && itemChanged.type !== parentType) {
|
|
376
|
-
if (obj.checked) {
|
|
377
|
-
obj.checked = false;
|
|
378
|
-
this.removeValue(obj);
|
|
379
|
-
this.addIndividualChildren(selectedChildrenOfParent);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
else {
|
|
384
|
-
obj.indeterminate = false;
|
|
385
|
-
if (allChildrenOfParent.length === 0) {
|
|
386
|
-
// if it has no children and is checked, it should stay checked
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
389
|
-
else if (this.strictRelationship && itemChanged.type !== parentType) {
|
|
390
|
-
this.remove(null, obj);
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
});
|
|
395
|
-
if (this.selectAllOption) {
|
|
396
|
-
this.updateIndeterminateStates(allParentType, allChildren, allCheckedChildren);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
updateAllParentsOrChildren(allItem, action) {
|
|
400
|
-
if (allItem.isParentOf) {
|
|
401
|
-
this.updateAllChildrenValue(allItem, action);
|
|
402
|
-
}
|
|
403
|
-
else if (allItem.isChildOf) {
|
|
404
|
-
this.updateAllParentValue(allItem, action);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
updateAllChildrenValue(item, action) {
|
|
408
|
-
const selecting = action === 'select';
|
|
409
|
-
const childType = item.isParentOf;
|
|
410
|
-
const potentialChildren = this.getAllOfType(childType);
|
|
411
|
-
if (this.selectAllOption && this.allOfTypeSelected(childType) && !selecting) {
|
|
412
|
-
this.remove(null, potentialChildren[0]);
|
|
413
|
-
return;
|
|
414
|
-
}
|
|
415
|
-
potentialChildren.forEach((x) => {
|
|
416
|
-
if (x.value === 'ALL' && !x.checked) {
|
|
417
|
-
if (selecting) {
|
|
418
|
-
x.checked = true;
|
|
419
|
-
}
|
|
420
|
-
x.indeterminate = selecting;
|
|
421
|
-
}
|
|
422
|
-
else {
|
|
423
|
-
if (x.checked && !selecting) {
|
|
424
|
-
this.remove(null, x);
|
|
425
|
-
}
|
|
426
|
-
x.checked = selecting;
|
|
427
|
-
}
|
|
428
|
-
});
|
|
429
|
-
}
|
|
430
|
-
updateAllParentValue(item, action) {
|
|
431
|
-
const selecting = action === 'select';
|
|
432
|
-
const parentType = item.isChildOf;
|
|
433
|
-
const potentialParents = this.getAllOfType(parentType);
|
|
434
|
-
potentialParents.forEach((x) => {
|
|
435
|
-
if (!x.checked) {
|
|
436
|
-
x.indeterminate = selecting;
|
|
437
|
-
}
|
|
438
|
-
});
|
|
439
|
-
}
|
|
440
|
-
updateIndeterminateStates(allParentType, allChildren, allCheckedChildren) {
|
|
441
|
-
const allCheckedOrIndeterminateParents = allParentType.filter((x) => (!!x.checked || !!x.indeterminate) && x.value !== 'ALL');
|
|
442
|
-
const isParentIndeterminate = !!allParentType[0].checked ? false : allCheckedOrIndeterminateParents.length > 0;
|
|
443
|
-
const isChildIndeterminate = !!allChildren[0].checked ? false : allCheckedChildren.length > 0;
|
|
444
|
-
this.setIndeterminateState(allParentType, isParentIndeterminate);
|
|
445
|
-
this.setIndeterminateState(allChildren, isChildIndeterminate);
|
|
446
|
-
}
|
|
447
|
-
updateChildrenValue(parent, action) {
|
|
448
|
-
const selecting = action === 'select';
|
|
449
|
-
const childType = parent.isParentOf;
|
|
450
|
-
const potentialChildren = this.getAllOfType(childType);
|
|
451
|
-
potentialChildren.forEach((x) => {
|
|
452
|
-
if (x.value === 'ALL') {
|
|
453
|
-
return;
|
|
454
|
-
}
|
|
455
|
-
if (x[parent.type].filter((y) => y === parent.value).length > 0) {
|
|
456
|
-
if (x.checked && !selecting) {
|
|
457
|
-
x.checked = false;
|
|
458
|
-
if (this.allOfTypeSelected(childType)) {
|
|
459
|
-
this.handleRemoveItemIfAllSelected(x);
|
|
460
|
-
}
|
|
461
|
-
else {
|
|
462
|
-
this.removeValue(x);
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
x.checked = selecting;
|
|
466
|
-
}
|
|
467
|
-
});
|
|
468
|
-
}
|
|
469
|
-
updateParentValue(child, action) {
|
|
470
|
-
const allParentType = this.getAllOfType(child.isChildOf);
|
|
471
|
-
if (allParentType[0].checked && action !== 'select') {
|
|
472
|
-
this.handleRemoveItemIfAllSelected(allParentType[0]);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
addIndividualChildren(children) {
|
|
476
|
-
let parentAlreadySelected = false;
|
|
477
|
-
children.forEach((x) => {
|
|
478
|
-
if (x.isChildOf) {
|
|
479
|
-
// only add children if their parents are not already selected
|
|
480
|
-
x[x.isChildOf].forEach((parent) => {
|
|
481
|
-
if (this.value[x.isChildOf].filter((p) => p === parent).length > 0) {
|
|
482
|
-
parentAlreadySelected = true;
|
|
483
|
-
}
|
|
484
|
-
});
|
|
485
|
-
}
|
|
486
|
-
if (this.value[x.type].filter((item) => item === x.value).length === 0 && !parentAlreadySelected) {
|
|
487
|
-
this.add(x);
|
|
488
|
-
}
|
|
489
|
-
});
|
|
490
|
-
}
|
|
491
|
-
setInitialValue(model) {
|
|
492
|
-
this.items = [];
|
|
493
|
-
this.value = model || {};
|
|
494
|
-
if (!this.types) {
|
|
495
|
-
return;
|
|
496
|
-
}
|
|
497
|
-
this.types.forEach((typeObj) => {
|
|
498
|
-
const type = typeObj.value;
|
|
499
|
-
if (this.value[type]) {
|
|
500
|
-
let indeterminateIsSet = false;
|
|
501
|
-
const options = this.updateAllItemState(type);
|
|
502
|
-
const optionsByType = options.allOfType;
|
|
503
|
-
const allSelected = options.allOfTypeSelected;
|
|
504
|
-
this.value[type].forEach((item) => {
|
|
505
|
-
if (!allSelected && !indeterminateIsSet) {
|
|
506
|
-
indeterminateIsSet = true;
|
|
507
|
-
this.setIndeterminateState(optionsByType, true);
|
|
508
|
-
}
|
|
509
|
-
const value = optionsByType.filter((x) => x.value === item)[0];
|
|
510
|
-
value.checked = true;
|
|
511
|
-
if (!allSelected) {
|
|
512
|
-
this.updateDisplayItems(value, 'add');
|
|
513
|
-
}
|
|
514
|
-
if (this.strictRelationship && value.isParentOf) {
|
|
515
|
-
this.updateChildrenValue(value, 'select');
|
|
516
|
-
}
|
|
517
|
-
});
|
|
518
|
-
if (typeObj.isChildOf) {
|
|
519
|
-
this.modifyAffectedParentsOrChildren(true, { value: type, isChildOf: true });
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
else {
|
|
523
|
-
this.value[type] = [];
|
|
524
|
-
}
|
|
525
|
-
});
|
|
526
|
-
}
|
|
527
|
-
allItemsSelected(optionsByType, type) {
|
|
528
|
-
return this.value[type].length === optionsByType.length - 1;
|
|
529
|
-
}
|
|
530
|
-
// Set touched on blur
|
|
531
|
-
onTouched(e) {
|
|
532
|
-
this.element.nativeElement.classList.remove('selected');
|
|
533
|
-
this.onModelTouched();
|
|
534
|
-
this.blur.emit(e);
|
|
535
|
-
}
|
|
536
|
-
writeValue(model) {
|
|
537
|
-
this.model = model;
|
|
538
|
-
this.setInitialValue(model);
|
|
539
|
-
}
|
|
540
|
-
registerOnChange(fn) {
|
|
541
|
-
this.onModelChange = fn;
|
|
542
|
-
}
|
|
543
|
-
registerOnTouched(fn) {
|
|
544
|
-
this.onModelTouched = fn;
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
NovoMultiPickerElement.decorators = [
|
|
548
|
-
{ type: Component, args: [{
|
|
549
|
-
selector: 'multi-picker',
|
|
550
|
-
providers: [CHIPS_VALUE_ACCESSOR],
|
|
551
|
-
template: `
|
|
552
|
-
<chip
|
|
553
|
-
*ngFor="let item of (_items | async | slice: 0:chipsCount)"
|
|
554
|
-
[type]="item.type"
|
|
555
|
-
[class.selected]="item == selected"
|
|
556
|
-
(remove)="removeFromDisplay($event, item)"
|
|
557
|
-
(select)="select($event, item)"
|
|
558
|
-
>
|
|
559
|
-
{{ item.label }}
|
|
560
|
-
</chip>
|
|
561
|
-
<div *ngIf="items.length > chipsCount">
|
|
562
|
-
<ul class="summary">
|
|
563
|
-
<li *ngFor="let type of notShown">+ {{ type.count }} {{ labels.more }} {{ type.type }}</li>
|
|
564
|
-
</ul>
|
|
565
|
-
</div>
|
|
566
|
-
<div class="chip-input-container">
|
|
567
|
-
<novo-picker
|
|
568
|
-
clearValueOnSelect="true"
|
|
569
|
-
[config]="source"
|
|
570
|
-
[placeholder]="placeholder"
|
|
571
|
-
(select)="clickOption($event)"
|
|
572
|
-
(keydown)="onKeyDown($event)"
|
|
573
|
-
(focus)="onFocus($event)"
|
|
574
|
-
(blur)="onTouched($event)"
|
|
575
|
-
[overrideElement]="element"
|
|
576
|
-
>
|
|
577
|
-
</novo-picker>
|
|
578
|
-
</div>
|
|
579
|
-
<i class="bhi-search" [class.has-value]="items.length"></i>
|
|
580
|
-
<label class="clear-all" *ngIf="items.length" (click)="clearValue()">{{ labels.clearAll }} <i class="bhi-times"></i></label>
|
|
581
|
-
`,
|
|
582
|
-
host: {
|
|
583
|
-
'[class.with-value]': 'items.length > 0',
|
|
584
|
-
}
|
|
585
|
-
},] }
|
|
586
|
-
];
|
|
587
|
-
NovoMultiPickerElement.ctorParameters = () => [
|
|
588
|
-
{ type: ElementRef },
|
|
589
|
-
{ type: NovoLabelService }
|
|
590
|
-
];
|
|
591
|
-
NovoMultiPickerElement.propDecorators = {
|
|
592
|
-
source: [{ type: Input }],
|
|
593
|
-
placeholder: [{ type: Input }],
|
|
594
|
-
types: [{ type: Input }],
|
|
595
|
-
changed: [{ type: Output }],
|
|
596
|
-
focus: [{ type: Output }],
|
|
597
|
-
blur: [{ type: Output }],
|
|
598
|
-
value: [{ type: Input }]
|
|
599
|
-
};
|
|
600
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlQaWNrZXIuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvY2hhcmxlcy5iYXJuZXMvRG9jdW1lbnRzL2Rldi9ub3ZvLWVsZW1lbnRzL3Byb2plY3RzL25vdm8tZWxlbWVudHMvc3JjLyIsInNvdXJjZXMiOlsiZWxlbWVudHMvbXVsdGktcGlja2VyL011bHRpUGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU07QUFDTixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsU0FBUztBQUNULE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUxRCxzREFBc0Q7QUFDdEQsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsc0JBQXNCLENBQUM7SUFDckQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBOENGLE1BQU0sT0FBTyxzQkFBc0I7SUErQ2pDLFlBQW1CLE9BQW1CLEVBQVMsTUFBd0I7UUFBcEQsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBM0N2RSxnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUl0QixZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFaEQsVUFBSyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTlDLFNBQUksR0FBc0Is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Q25CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQVk7UUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQVk7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7O1lBcm1CRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLFNBQVMsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2dCQUNqQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCVDtnQkFDRCxJQUFJLEVBQUU7b0JBQ0osb0JBQW9CLEVBQUUsa0JBQWtCO2lCQUN6QzthQUNGOzs7WUExRG1CLFVBQVU7WUFJckIsZ0JBQWdCOzs7cUJBd0R0QixLQUFLOzBCQUVMLEtBQUs7b0JBRUwsS0FBSztzQkFFTCxNQUFNO29CQUVOLE1BQU07bUJBRU4sTUFBTTtvQkFPTixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTkcyXHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbi8vIFZlbmRvclxyXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE5vdm9MYWJlbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3ZvLWxhYmVsLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSAnLi4vLi4vdXRpbHMvSGVscGVycyc7XHJcbmltcG9ydCB7IEtleUNvZGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMva2V5LWNvZGVzL0tleUNvZGVzJztcclxuXHJcbi8vIFZhbHVlIGFjY2Vzc29yIGZvciB0aGUgY29tcG9uZW50IChzdXBwb3J0cyBuZ01vZGVsKVxyXG5jb25zdCBDSElQU19WQUxVRV9BQ0NFU1NPUiA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOb3ZvTXVsdGlQaWNrZXJFbGVtZW50KSxcclxuICBtdWx0aTogdHJ1ZSxcclxufTtcclxuXHJcbmludGVyZmFjZSBJdGVtIHtcclxuICB0eXBlO1xyXG4gIGxhYmVsO1xyXG4gIHZhbHVlO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ211bHRpLXBpY2tlcicsXHJcbiAgcHJvdmlkZXJzOiBbQ0hJUFNfVkFMVUVfQUNDRVNTT1JdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8Y2hpcFxyXG4gICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiAoX2l0ZW1zIHwgYXN5bmMgfCBzbGljZTogMDpjaGlwc0NvdW50KVwiXHJcbiAgICAgIFt0eXBlXT1cIml0ZW0udHlwZVwiXHJcbiAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpdGVtID09IHNlbGVjdGVkXCJcclxuICAgICAgKHJlbW92ZSk9XCJyZW1vdmVGcm9tRGlzcGxheSgkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgKHNlbGVjdCk9XCJzZWxlY3QoJGV2ZW50LCBpdGVtKVwiXHJcbiAgICA+XHJcbiAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cclxuICAgIDwvY2hpcD5cclxuICAgIDxkaXYgKm5nSWY9XCJpdGVtcy5sZW5ndGggPiBjaGlwc0NvdW50XCI+XHJcbiAgICAgIDx1bCBjbGFzcz1cInN1bW1hcnlcIj5cclxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHR5cGUgb2Ygbm90U2hvd25cIj4rIHt7IHR5cGUuY291bnQgfX0ge3sgbGFiZWxzLm1vcmUgfX0ge3sgdHlwZS50eXBlIH19PC9saT5cclxuICAgICAgPC91bD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNoaXAtaW5wdXQtY29udGFpbmVyXCI+XHJcbiAgICAgIDxub3ZvLXBpY2tlclxyXG4gICAgICAgIGNsZWFyVmFsdWVPblNlbGVjdD1cInRydWVcIlxyXG4gICAgICAgIFtjb25maWddPVwic291cmNlXCJcclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgIChzZWxlY3QpPVwiY2xpY2tPcHRpb24oJGV2ZW50KVwiXHJcbiAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxyXG4gICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgICAgIChibHVyKT1cIm9uVG91Y2hlZCgkZXZlbnQpXCJcclxuICAgICAgICBbb3ZlcnJpZGVFbGVtZW50XT1cImVsZW1lbnRcIlxyXG4gICAgICA+XHJcbiAgICAgIDwvbm92by1waWNrZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxpIGNsYXNzPVwiYmhpLXNlYXJjaFwiIFtjbGFzcy5oYXMtdmFsdWVdPVwiaXRlbXMubGVuZ3RoXCI+PC9pPlxyXG4gICAgPGxhYmVsIGNsYXNzPVwiY2xlYXItYWxsXCIgKm5nSWY9XCJpdGVtcy5sZW5ndGhcIiAoY2xpY2spPVwiY2xlYXJWYWx1ZSgpXCI+e3sgbGFiZWxzLmNsZWFyQWxsIH19IDxpIGNsYXNzPVwiYmhpLXRpbWVzXCI+PC9pPjwvbGFiZWw+XHJcbiAgYCxcclxuICBob3N0OiB7XHJcbiAgICAnW2NsYXNzLndpdGgtdmFsdWVdJzogJ2l0ZW1zLmxlbmd0aCA+IDAnLFxyXG4gIH0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOb3ZvTXVsdGlQaWNrZXJFbGVtZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKVxyXG4gIHNvdXJjZTogeyBvcHRpb25zOiBbXTsgcmVzdWx0c1RlbXBsYXRlOyBzZWxlY3RBbGxPcHRpb246IGJvb2xlYW47IGNoaXBzQ291bnQ7IHN0cmljdFJlbGF0aW9uc2hpcCB9O1xyXG4gIEBJbnB1dCgpXHJcbiAgcGxhY2Vob2xkZXI6IGFueSA9ICcnO1xyXG4gIEBJbnB1dCgpXHJcbiAgdHlwZXM6IHsgdmFsdWU7IHNpbmd1bGFyOyBwbHVyYWw7IGlzUGFyZW50T2Y7IGlzQ2hpbGRPZiB9W107XHJcbiAgQE91dHB1dCgpXHJcbiAgY2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgZm9jdXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCB2YWx1ZShzZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICBpZiAoc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICB0aGlzLnR5cGVzLmZvckVhY2goKHgpID0+ICh0aGlzLl92YWx1ZVt4LnZhbHVlXSA9IHNlbGVjdGVkSXRlbXNbeC52YWx1ZV0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3ZhbHVlID0ge307XHJcbiAgICAgIHRoaXMudHlwZXMuZm9yRWFjaCgoeCkgPT4gKHRoaXMuX3ZhbHVlW3gudmFsdWVdID0gW10pKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hhbmdlZC5lbWl0KHNlbGVjdGVkSXRlbXMpO1xyXG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHNlbGVjdGVkSXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgaXRlbXM6IEl0ZW1bXSA9IFtdO1xyXG4gIF9pdGVtcyA9IG5ldyBSZXBsYXlTdWJqZWN0PEl0ZW1bXT4oMSk7XHJcbiAgb3B0aW9uczogYW55O1xyXG4gIF9vcHRpb25zOiBhbnk7XHJcbiAgc2VsZWN0ZWQ6IGFueSA9IG51bGw7XHJcbiAgY29uZmlnOiBhbnkgPSB7fTtcclxuICBjaGlwc0NvdW50OiBudW1iZXI7XHJcbiAgc2VsZWN0QWxsT3B0aW9uOiBib29sZWFuO1xyXG4gIHN0cmljdFJlbGF0aW9uc2hpcDogYm9vbGVhbjtcclxuICAvLyBwcml2YXRlIGRhdGEgbW9kZWxcclxuICBfdmFsdWUgPSB7fTtcclxuICBub3RTaG93bjogYW55ID0ge307XHJcbiAgLy8gUGxhY2Vob2xkZXJzIGZvciB0aGUgY2FsbGJhY2tzXHJcbiAgbW9kZWw6IGFueTtcclxuICBvbk1vZGVsQ2hhbmdlOiBGdW5jdGlvbiA9ICgpID0+IHsgfTtcclxuICBvbk1vZGVsVG91Y2hlZDogRnVuY3Rpb24gPSAoKSA9PiB7IH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmLCBwdWJsaWMgbGFiZWxzOiBOb3ZvTGFiZWxTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLmNoaXBzQ291bnQgPSA0O1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNlbGVjdEFsbE9wdGlvbiA9IHRoaXMuc291cmNlLnNlbGVjdEFsbE9wdGlvbiB8fCBmYWxzZTtcclxuICAgIHRoaXMuY2hpcHNDb3VudCA9IHRoaXMuc291cmNlLmNoaXBzQ291bnQgfHwgNDtcclxuICAgIHRoaXMuc3RyaWN0UmVsYXRpb25zaGlwID0gdGhpcy5zb3VyY2Uuc3RyaWN0UmVsYXRpb25zaGlwIHx8IGZhbHNlO1xyXG4gICAgdGhpcy5zZXR1cE9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIGNsZWFyVmFsdWUoKSB7XHJcbiAgICB0aGlzLnR5cGVzLmZvckVhY2goKHR5cGUpID0+IHRoaXMubW9kaWZ5QWxsT2ZUeXBlKHR5cGUudmFsdWUsICd1bnNlbGVjdCcpKTtcclxuICAgIHRoaXMuaXRlbXMgPSBbXTtcclxuICAgIHRoaXMuX2l0ZW1zLm5leHQodGhpcy5pdGVtcyk7XHJcbiAgICB0aGlzLnNldEluaXRpYWxWYWx1ZShudWxsKTtcclxuICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZyb21EaXNwbGF5KGV2ZW50LCBpdGVtKSB7XHJcbiAgICB0aGlzLnJlbW92ZSh0cnVlLCBpdGVtKTtcclxuICAgIHRoaXMubW9kaWZ5QWZmZWN0ZWRQYXJlbnRzT3JDaGlsZHJlbihmYWxzZSwgaXRlbSk7XHJcbiAgfVxyXG5cclxuICBzZXR1cE9wdGlvbnMoKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLnNvdXJjZS5vcHRpb25zIHx8IFtdO1xyXG4gICAgdGhpcy5fb3B0aW9ucyA9IFtdO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucykge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkT3B0aW9uID0gdGhpcy5zZXR1cE9wdGlvbnNCeVR5cGUob3B0aW9uKTtcclxuICAgICAgICB0aGlzLl9vcHRpb25zLnB1c2goZm9ybWF0dGVkT3B0aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNvdXJjZS5vcHRpb25zID0gdGhpcy5fb3B0aW9ucztcclxuICB9XHJcblxyXG4gIHNldHVwT3B0aW9uc0J5VHlwZShzZWN0aW9uKSB7XHJcbiAgICBjb25zdCBmb3JtYXR0ZWRTZWN0aW9uOiBhbnkgPSB7XHJcbiAgICAgIHR5cGU6IHNlY3Rpb24udHlwZSxcclxuICAgICAgbGFiZWw6IHNlY3Rpb24ubGFiZWwgfHwgc2VjdGlvbi50eXBlLFxyXG4gICAgfTtcclxuICAgIGZvcm1hdHRlZFNlY3Rpb24uZGF0YSA9IHNlY3Rpb24uZGF0YS5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0T3B0aW9uKHNlY3Rpb24sIGl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RBbGxPcHRpb24pIHtcclxuICAgICAgY29uc3Qgc2VsZWN0QWxsID0gdGhpcy5jcmVhdGVTZWxlY3RBbGxPcHRpb24oc2VjdGlvbik7XHJcbiAgICAgIGZvcm1hdHRlZFNlY3Rpb24uZGF0YS5zcGxpY2UoMCwgMCwgc2VsZWN0QWxsKTtcclxuICAgIH1cclxuICAgIGZvcm1hdHRlZFNlY3Rpb24ub3JpZ2luYWxEYXRhID0gZm9ybWF0dGVkU2VjdGlvbi5kYXRhLnNsaWNlKCk7XHJcbiAgICByZXR1cm4gZm9ybWF0dGVkU2VjdGlvbjtcclxuICB9XHJcblxyXG4gIGZvcm1hdE9wdGlvbihzZWN0aW9uLCBpdGVtKSB7XHJcbiAgICBjb25zdCBvYmogPSB7XHJcbiAgICAgIHZhbHVlOiBzZWN0aW9uLmZpZWxkID8gaXRlbVtzZWN0aW9uLmZpZWxkXSA6IGl0ZW0udmFsdWUgfHwgaXRlbSxcclxuICAgICAgbGFiZWw6IHNlY3Rpb24uZm9ybWF0ID8gSGVscGVycy5pbnRlcnBvbGF0ZShzZWN0aW9uLmZvcm1hdCwgaXRlbSkgOiBpdGVtLmxhYmVsIHx8IFN0cmluZyhpdGVtLnZhbHVlIHx8IGl0ZW0pLFxyXG4gICAgICB0eXBlOiBzZWN0aW9uLnR5cGUsXHJcbiAgICAgIGNoZWNrZWQ6IHVuZGVmaW5lZCxcclxuICAgICAgaXNQYXJlbnRPZjogc2VjdGlvbi5pc1BhcmVudE9mLFxyXG4gICAgICBpc0NoaWxkT2Y6IHNlY3Rpb24uaXNDaGlsZE9mLFxyXG4gICAgfTtcclxuICAgIGlmIChvYmouaXNDaGlsZE9mKSB7XHJcbiAgICAgIG9ialtzZWN0aW9uLmlzQ2hpbGRPZl0gPSBpdGVtW3NlY3Rpb24uaXNDaGlsZE9mXTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVTZWxlY3RBbGxPcHRpb24oc2VjdGlvbikge1xyXG4gICAgY29uc3Qgc2VsZWN0QWxsID0ge1xyXG4gICAgICB2YWx1ZTogJ0FMTCcsXHJcbiAgICAgIGxhYmVsOiBgQWxsICR7c2VjdGlvbi50eXBlfWAsXHJcbiAgICAgIHR5cGU6IHNlY3Rpb24udHlwZSxcclxuICAgICAgY2hlY2tlZDogdGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsLmxlbmd0aCAmJiB0aGlzLm1vZGVsLmluZGV4T2YoJ0FMTCcpICE9PSAtMSxcclxuICAgICAgaXNQYXJlbnRPZjogc2VjdGlvbi5pc1BhcmVudE9mLFxyXG4gICAgICBpc0NoaWxkT2Y6IHNlY3Rpb24uaXNDaGlsZE9mLFxyXG4gICAgfTtcclxuICAgIGlmIChzZWN0aW9uLmlzQ2hpbGRPZikge1xyXG4gICAgICBjb25zdCBhbGxQYXJlbnRzID0gc2VjdGlvbi5kYXRhLnJlZHVjZSgoYWNjdW0sIG5leHQpID0+IHtcclxuICAgICAgICByZXR1cm4gYWNjdW0uY29uY2F0KG5leHRbc2VjdGlvbi5pc0NoaWxkT2ZdKTtcclxuICAgICAgfSwgW10pO1xyXG4gICAgICBzZWxlY3RBbGxbc2VjdGlvbi5pc0NoaWxkT2ZdID0gYWxsUGFyZW50cztcclxuICAgIH1cclxuICAgIHJldHVybiBzZWxlY3RBbGw7XHJcbiAgfVxyXG5cclxuICBkZXNlbGVjdEFsbCgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0KGV2ZW50LCBpdGVtKSB7XHJcbiAgICB0aGlzLmJsdXIuZW1pdChldmVudCk7XHJcbiAgICB0aGlzLmRlc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkID0gaXRlbTtcclxuICB9XHJcblxyXG4gIG9uRm9jdXMoZSkge1xyXG4gICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcclxuICAgIHRoaXMuZm9jdXMuZW1pdChlKTtcclxuICB9XHJcblxyXG4gIGNsaWNrT3B0aW9uKGV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQgJiYgIShldmVudCBpbnN0YW5jZW9mIEV2ZW50KSkge1xyXG4gICAgICBpZiAoZXZlbnQuY2hlY2tlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZShudWxsLCBldmVudCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGQoZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubW9kaWZ5QWZmZWN0ZWRQYXJlbnRzT3JDaGlsZHJlbihldmVudC5jaGVja2VkLCBldmVudCk7XHJcbiAgICAgIC8vIFNldCBmb2N1cyBvbiB0aGUgcGlja2VyXHJcbiAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcignbm92by1waWNrZXIgPiBpbnB1dCcpO1xyXG4gICAgICBpZiAoaW5wdXQpIHtcclxuICAgICAgICBpbnB1dC5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGQoZXZlbnQpIHtcclxuICAgIGlmIChldmVudC52YWx1ZSA9PT0gJ0FMTCcpIHtcclxuICAgICAgdGhpcy5tb2RpZnlBbGxPZlR5cGUoZXZlbnQudHlwZSwgJ3NlbGVjdCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5SXRlbXMoZXZlbnQsICdhZGQnKTtcclxuICAgICAgdGhpcy52YWx1ZVtldmVudC50eXBlXS5wdXNoKGV2ZW50LnZhbHVlKTtcclxuICAgICAgdGhpcy51cGRhdGVBbGxJdGVtU3RhdGUoZXZlbnQudHlwZSk7XHJcbiAgICAgIHRoaXMudHJpZ2dlclZhbHVlVXBkYXRlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZVBhcmVudE9yQ2hpbGRyZW4oZXZlbnQsICdzZWxlY3QnKTtcclxuICAgIHRoaXMuc2VsZWN0KG51bGwsIGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUFsbEl0ZW1TdGF0ZSh0eXBlKSB7XHJcbiAgICBjb25zdCBhbGxPZlR5cGUgPSB0aGlzLmdldEFsbE9mVHlwZSh0eXBlKTtcclxuICAgIGNvbnN0IGFsbE9mVHlwZVNlbGVjdGVkID0gdGhpcy5hbGxJdGVtc1NlbGVjdGVkKGFsbE9mVHlwZSwgdHlwZSk7XHJcbiAgICBpZiAoYWxsT2ZUeXBlU2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RBbGwoYWxsT2ZUeXBlLCB0eXBlKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IGFsbE9mVHlwZSwgYWxsT2ZUeXBlU2VsZWN0ZWQgfTtcclxuICB9XHJcblxyXG4gIHNldEluZGV0ZXJtaW5hdGVTdGF0ZShhbGxPZlR5cGUsIHN0YXR1cykge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdEFsbE9wdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbGxJdGVtID0gYWxsT2ZUeXBlWzBdO1xyXG4gICAgYWxsSXRlbS5pbmRldGVybWluYXRlID0gc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRGlzcGxheUl0ZW1zKGl0ZW0sIGFjdGlvbikge1xyXG4gICAgY29uc3QgYWRkaW5nID0gYWN0aW9uID09PSAnYWRkJztcclxuICAgIGlmIChhZGRpbmcpIHtcclxuICAgICAgdGhpcy5pdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKSA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UodGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pLCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVEaXNwbGF5VGV4dCh0aGlzLml0ZW1zKTtcclxuICAgIHRoaXMuX2l0ZW1zLm5leHQodGhpcy5pdGVtcyk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVEaXNwbGF5VGV4dChpdGVtcykge1xyXG4gICAgdGhpcy5ub3RTaG93biA9IFtdO1xyXG4gICAgY29uc3Qgbm90U2hvd24gPSBpdGVtcy5zbGljZSh0aGlzLmNoaXBzQ291bnQpO1xyXG4gICAgaWYgKG5vdFNob3duLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy50eXBlcy5mb3JFYWNoKCh0eXBlKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvdW50O1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkT2ZUeXBlID0gbm90U2hvd24uZmlsdGVyKCh4KSA9PiB4LnR5cGUgPT09IHR5cGUudmFsdWUpO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZE9mVHlwZS5sZW5ndGggPT09IDEgJiYgc2VsZWN0ZWRPZlR5cGVbMF0udmFsdWUgPT09ICdBTEwnKSB7XHJcbiAgICAgICAgICBjb3VudCA9IHRoaXMuZ2V0QWxsT2ZUeXBlKHR5cGUudmFsdWUpLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvdW50ID0gc2VsZWN0ZWRPZlR5cGUubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkaXNwbGF5VHlwZSA9IGNvdW50ID09PSAxID8gdHlwZS5zaW5ndWxhciA6IHR5cGUucGx1cmFsIHx8IHR5cGUudmFsdWU7XHJcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5ub3RTaG93bi5wdXNoKHsgdHlwZTogZGlzcGxheVR5cGUsIGNvdW50IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmUoZXZlbnQsIGl0ZW0pIHtcclxuICAgIGxldCB0cmlnZ2VyZWRCeUV2ZW50O1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIHRyaWdnZXJlZEJ5RXZlbnQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaXRlbVRvUmVtb3ZlID0gaXRlbTtcclxuICAgIGlmIChpdGVtVG9SZW1vdmUudmFsdWUgPT09ICdBTEwnKSB7XHJcbiAgICAgIHRyaWdnZXJlZEJ5RXZlbnQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5tb2RpZnlBbGxPZlR5cGUoaXRlbVRvUmVtb3ZlLnR5cGUsICd1bnNlbGVjdCcpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmFsbE9mVHlwZVNlbGVjdGVkKGl0ZW1Ub1JlbW92ZS50eXBlKSkge1xyXG4gICAgICB0aGlzLmhhbmRsZVJlbW92ZUl0ZW1JZkFsbFNlbGVjdGVkKGl0ZW1Ub1JlbW92ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSwgdHJpZ2dlcmVkQnlFdmVudCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVJdGVtKGl0ZW0sIHRyaWdnZXJlZEJ5RXZlbnQ/OiBhbnkpIHtcclxuICAgIGl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5kZXNlbGVjdEFsbCgpO1xyXG4gICAgdGhpcy5yZW1vdmVWYWx1ZShpdGVtKTtcclxuICAgIGlmIChpdGVtLnZhbHVlICE9PSAnQUxMJykge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBhcmVudE9yQ2hpbGRyZW4oaXRlbSwgJ3Vuc2VsZWN0Jyk7XHJcbiAgICB9XHJcbiAgICBpZiAodHJpZ2dlcmVkQnlFdmVudCkge1xyXG4gICAgICB0aGlzLm1vZGlmeUFmZmVjdGVkUGFyZW50c09yQ2hpbGRyZW4oZmFsc2UsIGl0ZW0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVmFsdWUoaXRlbSkge1xyXG4gICAgY29uc3QgdXBkYXRlZFZhbHVlcyA9IHRoaXMudmFsdWVbaXRlbS50eXBlXS5maWx0ZXIoKHgpID0+IHggIT09IGl0ZW0udmFsdWUpO1xyXG4gICAgdGhpcy52YWx1ZVtpdGVtLnR5cGVdID0gdXBkYXRlZFZhbHVlcztcclxuICAgIHRoaXMudHJpZ2dlclZhbHVlVXBkYXRlKCk7XHJcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlJdGVtcyhpdGVtLCAncmVtb3ZlJyk7XHJcbiAgfVxyXG5cclxuICBvbktleURvd24oZXZlbnQpIHtcclxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2Rlcy5CQUNLU1BBQ0UpIHtcclxuICAgICAgaWYgKGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQudmFsdWUubGVuZ3RoID09PSAwICYmIHRoaXMuaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZShudWxsLCB0aGlzLnNlbGVjdGVkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3QoZXZlbnQsIHRoaXMuaXRlbXNbdGhpcy5pdGVtcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhbGxPZlR5cGVTZWxlY3RlZCh0eXBlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5maWx0ZXIoKHgpID0+IHgudHlwZSA9PT0gdHlwZSAmJiB4LnZhbHVlID09PSAnQUxMJykubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIG1vZGlmeUFsbE9mVHlwZSh0eXBlLCBhY3Rpb24pIHtcclxuICAgIGNvbnN0IHNlbGVjdGluZyA9IGFjdGlvbiA9PT0gJ3NlbGVjdCc7XHJcbiAgICBjb25zdCBhbGxPZlR5cGUgPSB0aGlzLmdldEFsbE9mVHlwZSh0eXBlKTtcclxuICAgIGFsbE9mVHlwZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IHNlbGVjdGluZztcclxuICAgICAgaXRlbS5pbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICAgIGlmIChzZWxlY3RpbmcpIHtcclxuICAgICAgdGhpcy5zZWxlY3RBbGwoYWxsT2ZUeXBlLCB0eXBlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXRlbXMgPSBbLi4udGhpcy5pdGVtcy5maWx0ZXIoKHgpID0+IHgudHlwZSAhPT0gdHlwZSldO1xyXG4gICAgICB0aGlzLl9pdGVtcy5uZXh0KHRoaXMuaXRlbXMpO1xyXG4gICAgICB0aGlzLnZhbHVlW3R5cGVdID0gW107XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3RBbGxPcHRpb24pIHtcclxuICAgICAgdGhpcy51cGRhdGVBbGxQYXJlbnRzT3JDaGlsZHJlbihhbGxPZlR5cGVbMF0sIGFjdGlvbik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRyaWdnZXJWYWx1ZVVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgdHJpZ2dlclZhbHVlVXBkYXRlKCkge1xyXG4gICAgY29uc3QgdXBkYXRlZE9iamVjdCA9IHt9O1xyXG4gICAgdGhpcy50eXBlcy5mb3JFYWNoKCh4KSA9PiAodXBkYXRlZE9iamVjdFt4LnZhbHVlXSA9IHRoaXMudmFsdWVbeC52YWx1ZV0pKTtcclxuICAgIHRoaXMudmFsdWUgPSB1cGRhdGVkT2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0QWxsKGFsbE9mVHlwZSwgdHlwZSkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdEFsbE9wdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhbGxPZlR5cGVbMF0uY2hlY2tlZCA9IHRydWU7XHJcbiAgICBjb25zdCB2YWx1ZXMgPSBhbGxPZlR5cGUubWFwKChpKSA9PiB7XHJcbiAgICAgIHJldHVybiBpLnZhbHVlO1xyXG4gICAgfSk7XHJcbiAgICAvLyByZW1vdmUgJ0FMTCcgdmFsdWVcclxuICAgIHZhbHVlcy5zcGxpY2UoMCwgMSk7XHJcbiAgICB0aGlzLnZhbHVlW3R5cGVdID0gdmFsdWVzO1xyXG4gICAgY29uc3QgdXBkYXRlZEl0ZW1zID0gdGhpcy5pdGVtcy5maWx0ZXIoKHgpID0+IHgudHlwZSAhPT0gdHlwZSk7XHJcbiAgICB0aGlzLml0ZW1zID0gdXBkYXRlZEl0ZW1zO1xyXG4gICAgdGhpcy51cGRhdGVEaXNwbGF5SXRlbXMoYWxsT2ZUeXBlWzBdLCAnYWRkJyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVSZW1vdmVJdGVtSWZBbGxTZWxlY3RlZChpdGVtKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0QWxsT3B0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHR5cGUgPSBpdGVtLnR5cGU7XHJcbiAgICBjb25zdCBhbGxPZlR5cGUgPSB0aGlzLmdldEFsbE9mVHlwZSh0eXBlKTtcclxuICAgIGNvbnN0IGFsbEl0ZW0gPSBhbGxPZlR5cGVbMF07XHJcbiAgICB0aGlzLnJlbW92ZUl0ZW0oYWxsSXRlbSk7XHJcbiAgICBhbGxJdGVtLmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGFsbE9mVHlwZS5maWx0ZXIoKGkpID0+IGkuY2hlY2tlZCA9PT0gdHJ1ZSk7XHJcbiAgICB0aGlzLml0ZW1zID0gWy4uLnRoaXMuaXRlbXMsIC4uLnNlbGVjdGVkSXRlbXNdO1xyXG4gICAgY29uc3QgdmFsdWVzID0gc2VsZWN0ZWRJdGVtcy5tYXAoKGkpID0+IHtcclxuICAgICAgcmV0dXJuIGkudmFsdWU7XHJcbiAgICB9KTtcclxuICAgIHRoaXMudmFsdWVbdHlwZV0gPSBbLi4udmFsdWVzXTtcclxuICB9XHJcblxyXG4gIGhhbmRsZU91dHNpZGVDbGljayhldmVudCkge1xyXG4gICAgLy8gSWYgdGhlIGVsZW1lbnRzIGRvZXNuJ3QgY29udGFpbiB0aGUgdGFyZ2V0IGVsZW1lbnQsIGl0IGlzIGFuIG91dHNpZGUgY2xpY2tcclxuICAgIGlmICghdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLmJsdXIuZW1pdChldmVudCk7XHJcbiAgICAgIHRoaXMuZGVzZWxlY3RBbGwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEFsbE9mVHlwZSh0eXBlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucy5maWx0ZXIoKHgpID0+IHgudHlwZSA9PT0gdHlwZSlbMF0ub3JpZ2luYWxEYXRhO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUGFyZW50T3JDaGlsZHJlbihpdGVtLCBhY3Rpb24pIHtcclxuICAgIGlmICh0aGlzLnN0cmljdFJlbGF0aW9uc2hpcCAmJiBpdGVtLmlzUGFyZW50T2YpIHtcclxuICAgICAgdGhpcy51cGRhdGVDaGlsZHJlblZhbHVlKGl0ZW0sIGFjdGlvbik7XHJcbiAgICB9IGVsc2UgaWYgKGl0ZW0uaXNDaGlsZE9mICYmIHRoaXMuc2VsZWN0QWxsT3B0aW9uKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlUGFyZW50VmFsdWUoaXRlbSwgYWN0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vZGlmeUFmZmVjdGVkUGFyZW50c09yQ2hpbGRyZW4oc2VsZWN0aW5nLCBpdGVtQ2hhbmdlZCkge1xyXG4gICAgaWYgKCFpdGVtQ2hhbmdlZC5pc0NoaWxkT2YgJiYgIWl0ZW1DaGFuZ2VkLmlzUGFyZW50T2YpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy50eXBlcy5maWx0ZXIoKHgpID0+ICEheC5pc1BhcmVudE9mKVswXTtcclxuICAgIGNvbnN0IHBhcmVudFR5cGUgPSBwYXJlbnQudmFsdWU7XHJcbiAgICBjb25zdCBhbGxQYXJlbnRUeXBlID0gdGhpcy5nZXRBbGxPZlR5cGUocGFyZW50VHlwZSk7XHJcbiAgICBjb25zdCBjaGlsZFR5cGUgPSBhbGxQYXJlbnRUeXBlWzBdLmlzUGFyZW50T2Y7XHJcbiAgICBjb25zdCBhbGxDaGlsZHJlbiA9IHRoaXMuZ2V0QWxsT2ZUeXBlKGNoaWxkVHlwZSk7XHJcbiAgICBjb25zdCBhbGxDaGVja2VkQ2hpbGRyZW4gPSBhbGxDaGlsZHJlbi5maWx0ZXIoKHgpID0+ICEheC5jaGVja2VkKTtcclxuXHJcbiAgICBhbGxQYXJlbnRUeXBlLmZvckVhY2goKG9iaikgPT4ge1xyXG4gICAgICBpZiAob2JqLnZhbHVlID09PSAnQUxMJykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBzZWxlY3RlZENoaWxkcmVuT2ZQYXJlbnQgPSBhbGxDaGVja2VkQ2hpbGRyZW4uZmlsdGVyKCh4KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHhbcGFyZW50VHlwZV0uZmlsdGVyKCh5KSA9PiB5ID09PSBvYmoudmFsdWUpLmxlbmd0aCA+IDA7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHNlbGVjdGluZykge1xyXG4gICAgICAgIGlmIChvYmouY2hlY2tlZCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvYmouaW5kZXRlcm1pbmF0ZSA9IHNlbGVjdGVkQ2hpbGRyZW5PZlBhcmVudC5sZW5ndGggPiAwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGFsbENoaWxkcmVuT2ZQYXJlbnQgPSBhbGxDaGlsZHJlbi5maWx0ZXIoKHgpID0+IHtcclxuICAgICAgICAgIHJldHVybiB4LnZhbHVlICE9PSAnQUxMJyAmJiB4W3BhcmVudFR5cGVdLmZpbHRlcigoeSkgPT4geSA9PT0gb2JqLnZhbHVlKS5sZW5ndGggPiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZENoaWxkcmVuT2ZQYXJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgaWYgKG9iai5jaGVja2VkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0cmljdFJlbGF0aW9uc2hpcCAmJiBhbGxDaGlsZHJlbk9mUGFyZW50Lmxlbmd0aCAhPT0gc2VsZWN0ZWRDaGlsZHJlbk9mUGFyZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIG9iai5pbmRldGVybWluYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBvYmouY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlVmFsdWUob2JqKTtcclxuICAgICAgICAgICAgICB0aGlzLmFkZEluZGl2aWR1YWxDaGlsZHJlbihzZWxlY3RlZENoaWxkcmVuT2ZQYXJlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvYmouaW5kZXRlcm1pbmF0ZSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5zdHJpY3RSZWxhdGlvbnNoaXAgJiYgaXRlbUNoYW5nZWQudHlwZSAhPT0gcGFyZW50VHlwZSkge1xyXG4gICAgICAgICAgICBpZiAob2JqLmNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICBvYmouY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlVmFsdWUob2JqKTtcclxuICAgICAgICAgICAgICB0aGlzLmFkZEluZGl2aWR1YWxDaGlsZHJlbihzZWxlY3RlZENoaWxkcmVuT2ZQYXJlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG9iai5pbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoYWxsQ2hpbGRyZW5PZlBhcmVudC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgLy8gaWYgaXQgaGFzIG5vIGNoaWxkcmVuIGFuZCBpcyBjaGVja2VkLCBpdCBzaG91bGQgc3RheSBjaGVja2VkXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdHJpY3RSZWxhdGlvbnNoaXAgJiYgaXRlbUNoYW5nZWQudHlwZSAhPT0gcGFyZW50VHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZShudWxsLCBvYmopO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RBbGxPcHRpb24pIHtcclxuICAgICAgdGhpcy51cGRhdGVJbmRldGVybWluYXRlU3RhdGVzKGFsbFBhcmVudFR5cGUsIGFsbENoaWxkcmVuLCBhbGxDaGVja2VkQ2hpbGRyZW4pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQWxsUGFyZW50c09yQ2hpbGRyZW4oYWxsSXRlbSwgYWN0aW9uKSB7XHJcbiAgICBpZiAoYWxsSXRlbS5pc1BhcmVudE9mKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQWxsQ2hpbGRyZW5WYWx1ZShhbGxJdGVtLCBhY3Rpb24pO1xyXG4gICAgfSBlbHNlIGlmIChhbGxJdGVtLmlzQ2hpbGRPZikge1xyXG4gICAgICB0aGlzLnVwZGF0ZUFsbFBhcmVudFZhbHVlKGFsbEl0ZW0sIGFjdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVBbGxDaGlsZHJlblZhbHVlKGl0ZW0sIGFjdGlvbikge1xyXG4gICAgY29uc3Qgc2VsZWN0aW5nID0gYWN0aW9uID09PSAnc2VsZWN0JztcclxuICAgIGNvbnN0IGNoaWxkVHlwZSA9IGl0ZW0uaXNQYXJlbnRPZjtcclxuICAgIGNvbnN0IHBvdGVudGlhbENoaWxkcmVuID0gdGhpcy5nZXRBbGxPZlR5cGUoY2hpbGRUeXBlKTtcclxuICAgIGlmICh0aGlzLnNlbGVjdEFsbE9wdGlvbiAmJiB0aGlzLmFsbE9mVHlwZVNlbGVjdGVkKGNoaWxkVHlwZSkgJiYgIXNlbGVjdGluZykge1xyXG4gICAgICB0aGlzLnJlbW92ZShudWxsLCBwb3RlbnRpYWxDaGlsZHJlblswXSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHBvdGVudGlhbENoaWxkcmVuLmZvckVhY2goKHgpID0+IHtcclxuICAgICAgaWYgKHgudmFsdWUgPT09ICdBTEwnICYmICF4LmNoZWNrZWQpIHtcclxuICAgICAgICBpZiAoc2VsZWN0aW5nKSB7XHJcbiAgICAgICAgICB4LmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB4LmluZGV0ZXJtaW5hdGUgPSBzZWxlY3Rpbmc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHguY2hlY2tlZCAmJiAhc2VsZWN0aW5nKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZShudWxsLCB4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgeC5jaGVja2VkID0gc2VsZWN0aW5nO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUFsbFBhcmVudFZhbHVlKGl0ZW0sIGFjdGlvbikge1xyXG4gICAgY29uc3Qgc2VsZWN0aW5nID0gYWN0aW9uID09PSAnc2VsZWN0JztcclxuICAgIGNvbnN0IHBhcmVudFR5cGUgPSBpdGVtLmlzQ2hpbGRPZjtcclxuICAgIGNvbnN0IHBvdGVudGlhbFBhcmVudHMgPSB0aGlzLmdldEFsbE9mVHlwZShwYXJlbnRUeXBlKTtcclxuICAgIHBvdGVudGlhbFBhcmVudHMuZm9yRWFjaCgoeCkgPT4ge1xyXG4gICAgICBpZiAoIXguY2hlY2tlZCkge1xyXG4gICAgICAgIHguaW5kZXRlcm1pbmF0ZSA9IHNlbGVjdGluZztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVJbmRldGVybWluYXRlU3RhdGVzKGFsbFBhcmVudFR5cGUsIGFsbENoaWxkcmVuLCBhbGxDaGVja2VkQ2hpbGRyZW4pIHtcclxuICAgIGNvbnN0IGFsbENoZWNrZWRPckluZGV0ZXJtaW5hdGVQYXJlbnRzID0gYWxsUGFyZW50VHlwZS5maWx0ZXIoKHgpID0+ICghIXguY2hlY2tlZCB8fCAhIXguaW5kZXRlcm1pbmF0ZSkgJiYgeC52YWx1ZSAhPT0gJ0FMTCcpO1xyXG4gICAgY29uc3QgaXNQYXJlbnRJbmRldGVybWluYXRlID0gISFhbGxQYXJlbnRUeXBlWzBdLmNoZWNrZWQgPyBmYWxzZSA6IGFsbENoZWNrZWRPckluZGV0ZXJtaW5hdGVQYXJlbnRzLmxlbmd0aCA+IDA7XHJcbiAgICBjb25zdCBpc0NoaWxkSW5kZXRlcm1pbmF0ZSA9ICEhYWxsQ2hpbGRyZW5bMF0uY2hlY2tlZCA/IGZhbHNlIDogYWxsQ2hlY2tlZENoaWxkcmVuLmxlbmd0aCA+IDA7XHJcbiAgICB0aGlzLnNldEluZGV0ZXJtaW5hdGVTdGF0ZShhbGxQYXJlbnRUeXBlLCBpc1BhcmVudEluZGV0ZXJtaW5hdGUpO1xyXG4gICAgdGhpcy5zZXRJbmRldGVybWluYXRlU3RhdGUoYWxsQ2hpbGRyZW4sIGlzQ2hpbGRJbmRldGVybWluYXRlKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUNoaWxkcmVuVmFsdWUocGFyZW50LCBhY3Rpb24pIHtcclxuICAgIGNvbnN0IHNlbGVjdGluZyA9IGFjdGlvbiA9PT0gJ3NlbGVjdCc7XHJcbiAgICBjb25zdCBjaGlsZFR5cGUgPSBwYXJlbnQuaXNQYXJlbnRPZjtcclxuICAgIGNvbnN0IHBvdGVudGlhbENoaWxkcmVuID0gdGhpcy5nZXRBbGxPZlR5cGUoY2hpbGRUeXBlKTtcclxuICAgIHBvdGVudGlhbENoaWxkcmVuLmZvckVhY2goKHgpID0+IHtcclxuICAgICAgaWYgKHgudmFsdWUgPT09ICdBTEwnKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh4W3BhcmVudC50eXBlXS5maWx0ZXIoKHkpID0+IHkgPT09IHBhcmVudC52YWx1ZSkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGlmICh4LmNoZWNrZWQgJiYgIXNlbGVjdGluZykge1xyXG4gICAgICAgICAgeC5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAodGhpcy5hbGxPZlR5cGVTZWxlY3RlZChjaGlsZFR5cGUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVtb3ZlSXRlbUlmQWxsU2VsZWN0ZWQoeCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVZhbHVlKHgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB4LmNoZWNrZWQgPSBzZWxlY3Rpbmc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUGFyZW50VmFsdWUoY2hpbGQsIGFjdGlvbikge1xyXG4gICAgY29uc3QgYWxsUGFyZW50VHlwZSA9IHRoaXMuZ2V0QWxsT2ZUeXBlKGNoaWxkLmlzQ2hpbGRPZik7XHJcbiAgICBpZiAoYWxsUGFyZW50VHlwZVswXS5jaGVja2VkICYmIGFjdGlvbiAhPT0gJ3NlbGVjdCcpIHtcclxuICAgICAgdGhpcy5oYW5kbGVSZW1vdmVJdGVtSWZBbGxTZWxlY3RlZChhbGxQYXJlbnRUeXBlWzBdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEluZGl2aWR1YWxDaGlsZHJlbihjaGlsZHJlbikge1xyXG4gICAgbGV0IHBhcmVudEFscmVhZHlTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgY2hpbGRyZW4uZm9yRWFjaCgoeCkgPT4ge1xyXG4gICAgICBpZiAoeC5pc0NoaWxkT2YpIHtcclxuICAgICAgICAvLyBvbmx5IGFkZCBjaGlsZHJlbiBpZiB0aGVpciBwYXJlbnRzIGFyZSBub3QgYWxyZWFkeSBzZWxlY3RlZFxyXG4gICAgICAgIHhbeC5pc0NoaWxkT2ZdLmZvckVhY2goKHBhcmVudCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMudmFsdWVbeC5pc0NoaWxkT2ZdLmZpbHRlcigocCkgPT4gcCA9PT0gcGFyZW50KS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHBhcmVudEFscmVhZHlTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMudmFsdWVbeC50eXBlXS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gPT09IHgudmFsdWUpLmxlbmd0aCA9PT0gMCAmJiAhcGFyZW50QWxyZWFkeVNlbGVjdGVkKSB7XHJcbiAgICAgICAgdGhpcy5hZGQoeCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0SW5pdGlhbFZhbHVlKG1vZGVsKTogdm9pZCB7XHJcbiAgICB0aGlzLml0ZW1zID0gW107XHJcbiAgICB0aGlzLnZhbHVlID0gbW9kZWwgfHwge307XHJcbiAgICBpZiAoIXRoaXMudHlwZXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50eXBlcy5mb3JFYWNoKCh0eXBlT2JqKSA9PiB7XHJcbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlT2JqLnZhbHVlO1xyXG4gICAgICBpZiAodGhpcy52YWx1ZVt0eXBlXSkge1xyXG4gICAgICAgIGxldCBpbmRldGVybWluYXRlSXNTZXQgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy51cGRhdGVBbGxJdGVtU3RhdGUodHlwZSk7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uc0J5VHlwZSA9IG9wdGlvbnMuYWxsT2ZUeXBlO1xyXG4gICAgICAgIGNvbnN0IGFsbFNlbGVjdGVkID0gb3B0aW9ucy5hbGxPZlR5cGVTZWxlY3RlZDtcclxuICAgICAgICB0aGlzLnZhbHVlW3R5cGVdLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGlmICghYWxsU2VsZWN0ZWQgJiYgIWluZGV0ZXJtaW5hdGVJc1NldCkge1xyXG4gICAgICAgICAgICBpbmRldGVybWluYXRlSXNTZXQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNldEluZGV0ZXJtaW5hdGVTdGF0ZShvcHRpb25zQnlUeXBlLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc0J5VHlwZS5maWx0ZXIoKHgpID0+IHgudmFsdWUgPT09IGl0ZW0pWzBdO1xyXG4gICAgICAgICAgdmFsdWUuY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoIWFsbFNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheUl0ZW1zKHZhbHVlLCAnYWRkJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5zdHJpY3RSZWxhdGlvbnNoaXAgJiYgdmFsdWUuaXNQYXJlbnRPZikge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuVmFsdWUodmFsdWUsICdzZWxlY3QnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodHlwZU9iai5pc0NoaWxkT2YpIHtcclxuICAgICAgICAgIHRoaXMubW9kaWZ5QWZmZWN0ZWRQYXJlbnRzT3JDaGlsZHJlbih0cnVlLCB7IHZhbHVlOiB0eXBlLCBpc0NoaWxkT2Y6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudmFsdWVbdHlwZV0gPSBbXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhbGxJdGVtc1NlbGVjdGVkKG9wdGlvbnNCeVR5cGUsIHR5cGUpIHtcclxuICAgIHJldHVybiB0aGlzLnZhbHVlW3R5cGVdLmxlbmd0aCA9PT0gb3B0aW9uc0J5VHlwZS5sZW5ndGggLSAxO1xyXG4gIH1cclxuXHJcbiAgLy8gU2V0IHRvdWNoZWQgb24gYmx1clxyXG4gIG9uVG91Y2hlZChlKSB7XHJcbiAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xyXG4gICAgdGhpcy5vbk1vZGVsVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5ibHVyLmVtaXQoZSk7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKG1vZGVsOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcclxuICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlKG1vZGVsKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uTW9kZWxDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5vbk1vZGVsVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1
|
+
// NG2
|
|
2
|
+
import { Component, ElementRef, EventEmitter, forwardRef, Input, Output } from '@angular/core';
|
|
3
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
// Vendor
|
|
5
|
+
import { ReplaySubject } from 'rxjs';
|
|
6
|
+
import { NovoLabelService } from '../../services/novo-label-service';
|
|
7
|
+
import { Helpers } from '../../utils/Helpers';
|
|
8
|
+
import { KeyCodes } from '../../utils/key-codes/KeyCodes';
|
|
9
|
+
// Value accessor for the component (supports ngModel)
|
|
10
|
+
const CHIPS_VALUE_ACCESSOR = {
|
|
11
|
+
provide: NG_VALUE_ACCESSOR,
|
|
12
|
+
useExisting: forwardRef(() => NovoMultiPickerElement),
|
|
13
|
+
multi: true,
|
|
14
|
+
};
|
|
15
|
+
export class NovoMultiPickerElement {
|
|
16
|
+
constructor(element, labels) {
|
|
17
|
+
this.element = element;
|
|
18
|
+
this.labels = labels;
|
|
19
|
+
this.placeholder = '';
|
|
20
|
+
this.changed = new EventEmitter();
|
|
21
|
+
this.focus = new EventEmitter();
|
|
22
|
+
this.blur = new EventEmitter();
|
|
23
|
+
this.items = [];
|
|
24
|
+
this._items = new ReplaySubject(1);
|
|
25
|
+
this.selected = null;
|
|
26
|
+
this.config = {};
|
|
27
|
+
// private data model
|
|
28
|
+
this._value = {};
|
|
29
|
+
this.notShown = {};
|
|
30
|
+
this.onModelChange = () => { };
|
|
31
|
+
this.onModelTouched = () => { };
|
|
32
|
+
this.chipsCount = 4;
|
|
33
|
+
}
|
|
34
|
+
get value() {
|
|
35
|
+
return this._value;
|
|
36
|
+
}
|
|
37
|
+
set value(selectedItems) {
|
|
38
|
+
if (selectedItems) {
|
|
39
|
+
this.types.forEach((x) => (this._value[x.value] = selectedItems[x.value]));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
this._value = {};
|
|
43
|
+
this.types.forEach((x) => (this._value[x.value] = []));
|
|
44
|
+
}
|
|
45
|
+
this.changed.emit(selectedItems);
|
|
46
|
+
this.onModelChange(selectedItems);
|
|
47
|
+
}
|
|
48
|
+
ngOnInit() {
|
|
49
|
+
this.selectAllOption = this.source.selectAllOption || false;
|
|
50
|
+
this.chipsCount = this.source.chipsCount || 4;
|
|
51
|
+
this.strictRelationship = this.source.strictRelationship || false;
|
|
52
|
+
this.setupOptions();
|
|
53
|
+
}
|
|
54
|
+
clearValue() {
|
|
55
|
+
this.types.forEach((type) => this.modifyAllOfType(type.value, 'unselect'));
|
|
56
|
+
this.items = [];
|
|
57
|
+
this._items.next(this.items);
|
|
58
|
+
this.setInitialValue(null);
|
|
59
|
+
this.onModelChange(this.value);
|
|
60
|
+
}
|
|
61
|
+
removeFromDisplay(event, item) {
|
|
62
|
+
this.remove(true, item);
|
|
63
|
+
this.modifyAffectedParentsOrChildren(false, item);
|
|
64
|
+
}
|
|
65
|
+
setupOptions() {
|
|
66
|
+
this.options = this.source.options || [];
|
|
67
|
+
this._options = [];
|
|
68
|
+
if (this.options) {
|
|
69
|
+
this.options.forEach((option) => {
|
|
70
|
+
const formattedOption = this.setupOptionsByType(option);
|
|
71
|
+
this._options.push(formattedOption);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
this.source.options = this._options;
|
|
75
|
+
}
|
|
76
|
+
setupOptionsByType(section) {
|
|
77
|
+
const formattedSection = {
|
|
78
|
+
type: section.type,
|
|
79
|
+
label: section.label || section.type,
|
|
80
|
+
};
|
|
81
|
+
formattedSection.data = section.data.map((item) => {
|
|
82
|
+
return this.formatOption(section, item);
|
|
83
|
+
});
|
|
84
|
+
if (this.selectAllOption) {
|
|
85
|
+
const selectAll = this.createSelectAllOption(section);
|
|
86
|
+
formattedSection.data.splice(0, 0, selectAll);
|
|
87
|
+
}
|
|
88
|
+
formattedSection.originalData = formattedSection.data.slice();
|
|
89
|
+
return formattedSection;
|
|
90
|
+
}
|
|
91
|
+
formatOption(section, item) {
|
|
92
|
+
const obj = {
|
|
93
|
+
value: section.field ? item[section.field] : item.value || item,
|
|
94
|
+
label: section.format ? Helpers.interpolate(section.format, item) : item.label || String(item.value || item),
|
|
95
|
+
type: section.type,
|
|
96
|
+
checked: undefined,
|
|
97
|
+
isParentOf: section.isParentOf,
|
|
98
|
+
isChildOf: section.isChildOf,
|
|
99
|
+
};
|
|
100
|
+
if (obj.isChildOf) {
|
|
101
|
+
obj[section.isChildOf] = item[section.isChildOf];
|
|
102
|
+
}
|
|
103
|
+
return obj;
|
|
104
|
+
}
|
|
105
|
+
createSelectAllOption(section) {
|
|
106
|
+
const selectAll = {
|
|
107
|
+
value: 'ALL',
|
|
108
|
+
label: `All ${section.type}`,
|
|
109
|
+
type: section.type,
|
|
110
|
+
checked: this.model && this.model.length && this.model.indexOf('ALL') !== -1,
|
|
111
|
+
isParentOf: section.isParentOf,
|
|
112
|
+
isChildOf: section.isChildOf,
|
|
113
|
+
};
|
|
114
|
+
if (section.isChildOf) {
|
|
115
|
+
const allParents = section.data.reduce((accum, next) => {
|
|
116
|
+
return accum.concat(next[section.isChildOf]);
|
|
117
|
+
}, []);
|
|
118
|
+
selectAll[section.isChildOf] = allParents;
|
|
119
|
+
}
|
|
120
|
+
return selectAll;
|
|
121
|
+
}
|
|
122
|
+
deselectAll() {
|
|
123
|
+
this.selected = null;
|
|
124
|
+
}
|
|
125
|
+
select(event, item) {
|
|
126
|
+
this.blur.emit(event);
|
|
127
|
+
this.deselectAll();
|
|
128
|
+
this.selected = item;
|
|
129
|
+
}
|
|
130
|
+
onFocus(e) {
|
|
131
|
+
this.element.nativeElement.classList.add('selected');
|
|
132
|
+
this.focus.emit(e);
|
|
133
|
+
}
|
|
134
|
+
clickOption(event) {
|
|
135
|
+
if (event && !(event instanceof Event)) {
|
|
136
|
+
if (event.checked === false) {
|
|
137
|
+
this.remove(null, event);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
this.add(event);
|
|
141
|
+
}
|
|
142
|
+
this.modifyAffectedParentsOrChildren(event.checked, event);
|
|
143
|
+
// Set focus on the picker
|
|
144
|
+
const input = this.element.nativeElement.querySelector('novo-picker > input');
|
|
145
|
+
if (input) {
|
|
146
|
+
input.focus();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
add(event) {
|
|
151
|
+
if (event.value === 'ALL') {
|
|
152
|
+
this.modifyAllOfType(event.type, 'select');
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
this.updateDisplayItems(event, 'add');
|
|
156
|
+
this.value[event.type].push(event.value);
|
|
157
|
+
this.updateAllItemState(event.type);
|
|
158
|
+
this.triggerValueUpdate();
|
|
159
|
+
}
|
|
160
|
+
this.updateParentOrChildren(event, 'select');
|
|
161
|
+
this.select(null, event);
|
|
162
|
+
}
|
|
163
|
+
updateAllItemState(type) {
|
|
164
|
+
const allOfType = this.getAllOfType(type);
|
|
165
|
+
const allOfTypeSelected = this.allItemsSelected(allOfType, type);
|
|
166
|
+
if (allOfTypeSelected) {
|
|
167
|
+
this.selectAll(allOfType, type);
|
|
168
|
+
}
|
|
169
|
+
return { allOfType, allOfTypeSelected };
|
|
170
|
+
}
|
|
171
|
+
setIndeterminateState(allOfType, status) {
|
|
172
|
+
if (!this.selectAllOption) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const allItem = allOfType[0];
|
|
176
|
+
allItem.indeterminate = status;
|
|
177
|
+
}
|
|
178
|
+
updateDisplayItems(item, action) {
|
|
179
|
+
const adding = action === 'add';
|
|
180
|
+
if (adding) {
|
|
181
|
+
this.items.push(item);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
if (this.items.indexOf(item) > -1) {
|
|
185
|
+
this.items.splice(this.items.indexOf(item), 1);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
this.updateDisplayText(this.items);
|
|
189
|
+
this._items.next(this.items);
|
|
190
|
+
}
|
|
191
|
+
updateDisplayText(items) {
|
|
192
|
+
this.notShown = [];
|
|
193
|
+
const notShown = items.slice(this.chipsCount);
|
|
194
|
+
if (notShown.length > 0) {
|
|
195
|
+
this.types.forEach((type) => {
|
|
196
|
+
let count;
|
|
197
|
+
const selectedOfType = notShown.filter((x) => x.type === type.value);
|
|
198
|
+
if (selectedOfType.length === 1 && selectedOfType[0].value === 'ALL') {
|
|
199
|
+
count = this.getAllOfType(type.value).length - 1;
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
count = selectedOfType.length;
|
|
203
|
+
}
|
|
204
|
+
const displayType = count === 1 ? type.singular : type.plural || type.value;
|
|
205
|
+
if (count > 0) {
|
|
206
|
+
this.notShown.push({ type: displayType, count });
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
remove(event, item) {
|
|
212
|
+
let triggeredByEvent;
|
|
213
|
+
if (event) {
|
|
214
|
+
triggeredByEvent = true;
|
|
215
|
+
}
|
|
216
|
+
const itemToRemove = item;
|
|
217
|
+
if (itemToRemove.value === 'ALL') {
|
|
218
|
+
triggeredByEvent = false;
|
|
219
|
+
this.modifyAllOfType(itemToRemove.type, 'unselect');
|
|
220
|
+
}
|
|
221
|
+
else if (this.allOfTypeSelected(itemToRemove.type)) {
|
|
222
|
+
this.handleRemoveItemIfAllSelected(itemToRemove);
|
|
223
|
+
}
|
|
224
|
+
this.removeItem(item, triggeredByEvent);
|
|
225
|
+
}
|
|
226
|
+
removeItem(item, triggeredByEvent) {
|
|
227
|
+
item.checked = false;
|
|
228
|
+
this.deselectAll();
|
|
229
|
+
this.removeValue(item);
|
|
230
|
+
if (item.value !== 'ALL') {
|
|
231
|
+
this.updateParentOrChildren(item, 'unselect');
|
|
232
|
+
}
|
|
233
|
+
if (triggeredByEvent) {
|
|
234
|
+
this.modifyAffectedParentsOrChildren(false, item);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
removeValue(item) {
|
|
238
|
+
const updatedValues = this.value[item.type].filter((x) => x !== item.value);
|
|
239
|
+
this.value[item.type] = updatedValues;
|
|
240
|
+
this.triggerValueUpdate();
|
|
241
|
+
this.updateDisplayItems(item, 'remove');
|
|
242
|
+
}
|
|
243
|
+
onKeyDown(event) {
|
|
244
|
+
if (event.keyCode === KeyCodes.BACKSPACE) {
|
|
245
|
+
if (event.target && event.target.value.length === 0 && this.items.length) {
|
|
246
|
+
if (event) {
|
|
247
|
+
event.stopPropagation();
|
|
248
|
+
event.preventDefault();
|
|
249
|
+
}
|
|
250
|
+
if (this.selected) {
|
|
251
|
+
this.remove(null, this.selected);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
this.select(event, this.items[this.items.length - 1]);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
allOfTypeSelected(type) {
|
|
260
|
+
return this.items.filter((x) => x.type === type && x.value === 'ALL').length > 0;
|
|
261
|
+
}
|
|
262
|
+
modifyAllOfType(type, action) {
|
|
263
|
+
const selecting = action === 'select';
|
|
264
|
+
const allOfType = this.getAllOfType(type);
|
|
265
|
+
allOfType.forEach((item) => {
|
|
266
|
+
item.checked = selecting;
|
|
267
|
+
item.indeterminate = false;
|
|
268
|
+
});
|
|
269
|
+
if (selecting) {
|
|
270
|
+
this.selectAll(allOfType, type);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
this.items = [...this.items.filter((x) => x.type !== type)];
|
|
274
|
+
this._items.next(this.items);
|
|
275
|
+
this.value[type] = [];
|
|
276
|
+
}
|
|
277
|
+
if (this.selectAllOption) {
|
|
278
|
+
this.updateAllParentsOrChildren(allOfType[0], action);
|
|
279
|
+
}
|
|
280
|
+
this.triggerValueUpdate();
|
|
281
|
+
}
|
|
282
|
+
triggerValueUpdate() {
|
|
283
|
+
const updatedObject = {};
|
|
284
|
+
this.types.forEach((x) => (updatedObject[x.value] = this.value[x.value]));
|
|
285
|
+
this.value = updatedObject;
|
|
286
|
+
}
|
|
287
|
+
selectAll(allOfType, type) {
|
|
288
|
+
if (!this.selectAllOption) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
allOfType[0].checked = true;
|
|
292
|
+
const values = allOfType.map((i) => {
|
|
293
|
+
return i.value;
|
|
294
|
+
});
|
|
295
|
+
// remove 'ALL' value
|
|
296
|
+
values.splice(0, 1);
|
|
297
|
+
this.value[type] = values;
|
|
298
|
+
const updatedItems = this.items.filter((x) => x.type !== type);
|
|
299
|
+
this.items = updatedItems;
|
|
300
|
+
this.updateDisplayItems(allOfType[0], 'add');
|
|
301
|
+
}
|
|
302
|
+
handleRemoveItemIfAllSelected(item) {
|
|
303
|
+
if (!this.selectAllOption) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const type = item.type;
|
|
307
|
+
const allOfType = this.getAllOfType(type);
|
|
308
|
+
const allItem = allOfType[0];
|
|
309
|
+
this.removeItem(allItem);
|
|
310
|
+
allItem.indeterminate = true;
|
|
311
|
+
const selectedItems = allOfType.filter((i) => i.checked === true);
|
|
312
|
+
this.items = [...this.items, ...selectedItems];
|
|
313
|
+
const values = selectedItems.map((i) => {
|
|
314
|
+
return i.value;
|
|
315
|
+
});
|
|
316
|
+
this.value[type] = [...values];
|
|
317
|
+
}
|
|
318
|
+
handleOutsideClick(event) {
|
|
319
|
+
// If the elements doesn't contain the target element, it is an outside click
|
|
320
|
+
if (!this.element.nativeElement.contains(event.target)) {
|
|
321
|
+
this.blur.emit(event);
|
|
322
|
+
this.deselectAll();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
getAllOfType(type) {
|
|
326
|
+
return this._options.filter((x) => x.type === type)[0].originalData;
|
|
327
|
+
}
|
|
328
|
+
updateParentOrChildren(item, action) {
|
|
329
|
+
if (this.strictRelationship && item.isParentOf) {
|
|
330
|
+
this.updateChildrenValue(item, action);
|
|
331
|
+
}
|
|
332
|
+
else if (item.isChildOf && this.selectAllOption) {
|
|
333
|
+
this.updateParentValue(item, action);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
modifyAffectedParentsOrChildren(selecting, itemChanged) {
|
|
337
|
+
if (!itemChanged.isChildOf && !itemChanged.isParentOf) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const parent = this.types.filter((x) => !!x.isParentOf)[0];
|
|
341
|
+
const parentType = parent.value;
|
|
342
|
+
const allParentType = this.getAllOfType(parentType);
|
|
343
|
+
const childType = allParentType[0].isParentOf;
|
|
344
|
+
const allChildren = this.getAllOfType(childType);
|
|
345
|
+
const allCheckedChildren = allChildren.filter((x) => !!x.checked);
|
|
346
|
+
allParentType.forEach((obj) => {
|
|
347
|
+
if (obj.value === 'ALL') {
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
const selectedChildrenOfParent = allCheckedChildren.filter((x) => {
|
|
351
|
+
return x[parentType].filter((y) => y === obj.value).length > 0;
|
|
352
|
+
});
|
|
353
|
+
if (selecting) {
|
|
354
|
+
if (obj.checked) {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
obj.indeterminate = selectedChildrenOfParent.length > 0;
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
const allChildrenOfParent = allChildren.filter((x) => {
|
|
361
|
+
return x.value !== 'ALL' && x[parentType].filter((y) => y === obj.value).length > 0;
|
|
362
|
+
});
|
|
363
|
+
if (selectedChildrenOfParent.length > 0) {
|
|
364
|
+
if (obj.checked) {
|
|
365
|
+
if (this.strictRelationship && allChildrenOfParent.length !== selectedChildrenOfParent.length) {
|
|
366
|
+
obj.indeterminate = true;
|
|
367
|
+
obj.checked = false;
|
|
368
|
+
this.removeValue(obj);
|
|
369
|
+
this.addIndividualChildren(selectedChildrenOfParent);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
obj.indeterminate = true;
|
|
374
|
+
}
|
|
375
|
+
if (this.strictRelationship && itemChanged.type !== parentType) {
|
|
376
|
+
if (obj.checked) {
|
|
377
|
+
obj.checked = false;
|
|
378
|
+
this.removeValue(obj);
|
|
379
|
+
this.addIndividualChildren(selectedChildrenOfParent);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
obj.indeterminate = false;
|
|
385
|
+
if (allChildrenOfParent.length === 0) {
|
|
386
|
+
// if it has no children and is checked, it should stay checked
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
else if (this.strictRelationship && itemChanged.type !== parentType) {
|
|
390
|
+
this.remove(null, obj);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
if (this.selectAllOption) {
|
|
396
|
+
this.updateIndeterminateStates(allParentType, allChildren, allCheckedChildren);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
updateAllParentsOrChildren(allItem, action) {
|
|
400
|
+
if (allItem.isParentOf) {
|
|
401
|
+
this.updateAllChildrenValue(allItem, action);
|
|
402
|
+
}
|
|
403
|
+
else if (allItem.isChildOf) {
|
|
404
|
+
this.updateAllParentValue(allItem, action);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
updateAllChildrenValue(item, action) {
|
|
408
|
+
const selecting = action === 'select';
|
|
409
|
+
const childType = item.isParentOf;
|
|
410
|
+
const potentialChildren = this.getAllOfType(childType);
|
|
411
|
+
if (this.selectAllOption && this.allOfTypeSelected(childType) && !selecting) {
|
|
412
|
+
this.remove(null, potentialChildren[0]);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
potentialChildren.forEach((x) => {
|
|
416
|
+
if (x.value === 'ALL' && !x.checked) {
|
|
417
|
+
if (selecting) {
|
|
418
|
+
x.checked = true;
|
|
419
|
+
}
|
|
420
|
+
x.indeterminate = selecting;
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
if (x.checked && !selecting) {
|
|
424
|
+
this.remove(null, x);
|
|
425
|
+
}
|
|
426
|
+
x.checked = selecting;
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
updateAllParentValue(item, action) {
|
|
431
|
+
const selecting = action === 'select';
|
|
432
|
+
const parentType = item.isChildOf;
|
|
433
|
+
const potentialParents = this.getAllOfType(parentType);
|
|
434
|
+
potentialParents.forEach((x) => {
|
|
435
|
+
if (!x.checked) {
|
|
436
|
+
x.indeterminate = selecting;
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
updateIndeterminateStates(allParentType, allChildren, allCheckedChildren) {
|
|
441
|
+
const allCheckedOrIndeterminateParents = allParentType.filter((x) => (!!x.checked || !!x.indeterminate) && x.value !== 'ALL');
|
|
442
|
+
const isParentIndeterminate = !!allParentType[0].checked ? false : allCheckedOrIndeterminateParents.length > 0;
|
|
443
|
+
const isChildIndeterminate = !!allChildren[0].checked ? false : allCheckedChildren.length > 0;
|
|
444
|
+
this.setIndeterminateState(allParentType, isParentIndeterminate);
|
|
445
|
+
this.setIndeterminateState(allChildren, isChildIndeterminate);
|
|
446
|
+
}
|
|
447
|
+
updateChildrenValue(parent, action) {
|
|
448
|
+
const selecting = action === 'select';
|
|
449
|
+
const childType = parent.isParentOf;
|
|
450
|
+
const potentialChildren = this.getAllOfType(childType);
|
|
451
|
+
potentialChildren.forEach((x) => {
|
|
452
|
+
if (x.value === 'ALL') {
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
if (x[parent.type].filter((y) => y === parent.value).length > 0) {
|
|
456
|
+
if (x.checked && !selecting) {
|
|
457
|
+
x.checked = false;
|
|
458
|
+
if (this.allOfTypeSelected(childType)) {
|
|
459
|
+
this.handleRemoveItemIfAllSelected(x);
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
this.removeValue(x);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
x.checked = selecting;
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
updateParentValue(child, action) {
|
|
470
|
+
const allParentType = this.getAllOfType(child.isChildOf);
|
|
471
|
+
if (allParentType[0].checked && action !== 'select') {
|
|
472
|
+
this.handleRemoveItemIfAllSelected(allParentType[0]);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
addIndividualChildren(children) {
|
|
476
|
+
let parentAlreadySelected = false;
|
|
477
|
+
children.forEach((x) => {
|
|
478
|
+
if (x.isChildOf) {
|
|
479
|
+
// only add children if their parents are not already selected
|
|
480
|
+
x[x.isChildOf].forEach((parent) => {
|
|
481
|
+
if (this.value[x.isChildOf].filter((p) => p === parent).length > 0) {
|
|
482
|
+
parentAlreadySelected = true;
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
if (this.value[x.type].filter((item) => item === x.value).length === 0 && !parentAlreadySelected) {
|
|
487
|
+
this.add(x);
|
|
488
|
+
}
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
setInitialValue(model) {
|
|
492
|
+
this.items = [];
|
|
493
|
+
this.value = model || {};
|
|
494
|
+
if (!this.types) {
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
this.types.forEach((typeObj) => {
|
|
498
|
+
const type = typeObj.value;
|
|
499
|
+
if (this.value[type]) {
|
|
500
|
+
let indeterminateIsSet = false;
|
|
501
|
+
const options = this.updateAllItemState(type);
|
|
502
|
+
const optionsByType = options.allOfType;
|
|
503
|
+
const allSelected = options.allOfTypeSelected;
|
|
504
|
+
this.value[type].forEach((item) => {
|
|
505
|
+
if (!allSelected && !indeterminateIsSet) {
|
|
506
|
+
indeterminateIsSet = true;
|
|
507
|
+
this.setIndeterminateState(optionsByType, true);
|
|
508
|
+
}
|
|
509
|
+
const value = optionsByType.filter((x) => x.value === item)[0];
|
|
510
|
+
value.checked = true;
|
|
511
|
+
if (!allSelected) {
|
|
512
|
+
this.updateDisplayItems(value, 'add');
|
|
513
|
+
}
|
|
514
|
+
if (this.strictRelationship && value.isParentOf) {
|
|
515
|
+
this.updateChildrenValue(value, 'select');
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
if (typeObj.isChildOf) {
|
|
519
|
+
this.modifyAffectedParentsOrChildren(true, { value: type, isChildOf: true });
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
else {
|
|
523
|
+
this.value[type] = [];
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
allItemsSelected(optionsByType, type) {
|
|
528
|
+
return this.value[type].length === optionsByType.length - 1;
|
|
529
|
+
}
|
|
530
|
+
// Set touched on blur
|
|
531
|
+
onTouched(e) {
|
|
532
|
+
this.element.nativeElement.classList.remove('selected');
|
|
533
|
+
this.onModelTouched();
|
|
534
|
+
this.blur.emit(e);
|
|
535
|
+
}
|
|
536
|
+
writeValue(model) {
|
|
537
|
+
this.model = model;
|
|
538
|
+
this.setInitialValue(model);
|
|
539
|
+
}
|
|
540
|
+
registerOnChange(fn) {
|
|
541
|
+
this.onModelChange = fn;
|
|
542
|
+
}
|
|
543
|
+
registerOnTouched(fn) {
|
|
544
|
+
this.onModelTouched = fn;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
NovoMultiPickerElement.decorators = [
|
|
548
|
+
{ type: Component, args: [{
|
|
549
|
+
selector: 'multi-picker',
|
|
550
|
+
providers: [CHIPS_VALUE_ACCESSOR],
|
|
551
|
+
template: `
|
|
552
|
+
<chip
|
|
553
|
+
*ngFor="let item of (_items | async | slice: 0:chipsCount)"
|
|
554
|
+
[type]="item.type"
|
|
555
|
+
[class.selected]="item == selected"
|
|
556
|
+
(remove)="removeFromDisplay($event, item)"
|
|
557
|
+
(select)="select($event, item)"
|
|
558
|
+
>
|
|
559
|
+
{{ item.label }}
|
|
560
|
+
</chip>
|
|
561
|
+
<div *ngIf="items.length > chipsCount">
|
|
562
|
+
<ul class="summary">
|
|
563
|
+
<li *ngFor="let type of notShown">+ {{ type.count }} {{ labels.more }} {{ type.type }}</li>
|
|
564
|
+
</ul>
|
|
565
|
+
</div>
|
|
566
|
+
<div class="chip-input-container">
|
|
567
|
+
<novo-picker
|
|
568
|
+
clearValueOnSelect="true"
|
|
569
|
+
[config]="source"
|
|
570
|
+
[placeholder]="placeholder"
|
|
571
|
+
(select)="clickOption($event)"
|
|
572
|
+
(keydown)="onKeyDown($event)"
|
|
573
|
+
(focus)="onFocus($event)"
|
|
574
|
+
(blur)="onTouched($event)"
|
|
575
|
+
[overrideElement]="element"
|
|
576
|
+
>
|
|
577
|
+
</novo-picker>
|
|
578
|
+
</div>
|
|
579
|
+
<i class="bhi-search" [class.has-value]="items.length"></i>
|
|
580
|
+
<label class="clear-all" *ngIf="items.length" (click)="clearValue()">{{ labels.clearAll }} <i class="bhi-times"></i></label>
|
|
581
|
+
`,
|
|
582
|
+
host: {
|
|
583
|
+
'[class.with-value]': 'items.length > 0',
|
|
584
|
+
}
|
|
585
|
+
},] }
|
|
586
|
+
];
|
|
587
|
+
NovoMultiPickerElement.ctorParameters = () => [
|
|
588
|
+
{ type: ElementRef },
|
|
589
|
+
{ type: NovoLabelService }
|
|
590
|
+
];
|
|
591
|
+
NovoMultiPickerElement.propDecorators = {
|
|
592
|
+
source: [{ type: Input }],
|
|
593
|
+
placeholder: [{ type: Input }],
|
|
594
|
+
types: [{ type: Input }],
|
|
595
|
+
changed: [{ type: Output }],
|
|
596
|
+
focus: [{ type: Output }],
|
|
597
|
+
blur: [{ type: Output }],
|
|
598
|
+
value: [{ type: Input }]
|
|
599
|
+
};
|
|
600
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlQaWNrZXIuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvbm92by1lbGVtZW50cy9ub3ZvLWVsZW1lbnRzL3Byb2plY3RzL25vdm8tZWxlbWVudHMvc3JjLyIsInNvdXJjZXMiOlsiZWxlbWVudHMvbXVsdGktcGlja2VyL011bHRpUGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU07QUFDTixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsU0FBUztBQUNULE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUxRCxzREFBc0Q7QUFDdEQsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsc0JBQXNCLENBQUM7SUFDckQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBOENGLE1BQU0sT0FBTyxzQkFBc0I7SUErQ2pDLFlBQW1CLE9BQW1CLEVBQVMsTUFBd0I7UUFBcEQsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBM0N2RSxnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUl0QixZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFaEQsVUFBSyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTlDLFNBQUksR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQWtCN0MsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUNuQixXQUFNLEdBQUcsSUFBSSxhQUFhLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFHdEMsYUFBUSxHQUFRLElBQUksQ0FBQztRQUNyQixXQUFNLEdBQVEsRUFBRSxDQUFDO1FBSWpCLHFCQUFxQjtRQUNyQixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osYUFBUSxHQUFRLEVBQUUsQ0FBQztRQUduQixrQkFBYSxHQUFhLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQyxtQkFBYyxHQUFhLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUduQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBbkNELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFDSSxLQUFLLENBQUMsYUFBYTtRQUNyQixJQUFJLGFBQWEsRUFBRTtZQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1RTthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN4RDtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQXVCRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUM7UUFDNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLElBQUksS0FBSyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUk7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLCtCQUErQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUM5QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxPQUFPO1FBQ3hCLE1BQU0sZ0JBQWdCLEdBQVE7WUFDNUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJO1NBQ3JDLENBQUM7UUFDRixnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0RCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDL0M7UUFDRCxnQkFBZ0IsQ0FBQyxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSTtRQUN4QixNQUFNLEdBQUcsR0FBRztZQUNWLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUk7WUFDL0QsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7WUFDNUcsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtZQUM5QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7U0FDN0IsQ0FBQztRQUNGLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRTtZQUNqQixHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxPQUFPO1FBQzNCLE1BQU0sU0FBUyxHQUFHO1lBQ2hCLEtBQUssRUFBRSxLQUFLO1lBQ1osS0FBSyxFQUFFLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRTtZQUM1QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVFLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtZQUM5QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7U0FDN0IsQ0FBQztRQUNGLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNyQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDckQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDUCxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztTQUMzQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDO1FBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQUs7UUFDZixJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxFQUFFO1lBQ3RDLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzFCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDakI7WUFDRCxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzRCwwQkFBMEI7WUFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDOUUsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2Y7U0FDRjtJQUNILENBQUM7SUFFRCxHQUFHLENBQUMsS0FBSztRQUNQLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7WUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzVDO2FBQU07WUFDTCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUMzQjtRQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQUk7UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNqQztRQUNELE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQscUJBQXFCLENBQUMsU0FBUyxFQUFFLE1BQU07UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsT0FBTztTQUNSO1FBQ0QsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsTUFBTTtRQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssS0FBSyxDQUFDO1FBQ2hDLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2hEO1NBQ0Y7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBSztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQzFCLElBQUksS0FBSyxDQUFDO2dCQUNWLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO29CQUNwRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztpQkFDbEQ7cUJBQU07b0JBQ0wsS0FBSyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7aUJBQy9CO2dCQUNELE1BQU0sV0FBVyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDNUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO29CQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2lCQUNsRDtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJO1FBQ2hCLElBQUksZ0JBQWdCLENBQUM7UUFDckIsSUFBSSxLQUFLLEVBQUU7WUFDVCxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7U0FDekI7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxZQUFZLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRTtZQUNoQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3JEO2FBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BELElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFJLEVBQUUsZ0JBQXNCO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztTQUMvQztRQUNELElBQUksZ0JBQWdCLEVBQUU7WUFDcEIsSUFBSSxDQUFDLCtCQUErQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsSUFBSTtRQUNkLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDdEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQUs7UUFDYixJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUN4QyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDeEUsSUFBSSxLQUFLLEVBQUU7b0JBQ1QsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7aUJBQ3hCO2dCQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUNsQztxQkFBTTtvQkFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFJO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNO1FBQzFCLE1BQU0sU0FBUyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUM7UUFDdEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2pDO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUN2QjtRQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixJQUFJLENBQUMsMEJBQTBCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUM7SUFDN0IsQ0FBQztJQUVELFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSTtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixPQUFPO1NBQ1I7UUFDRCxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUM1QixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDakMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0gscUJBQXFCO1FBQ3JCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQzFCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1FBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELDZCQUE2QixDQUFDLElBQUk7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsT0FBTztTQUNSO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzdCLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNyQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBSztRQUN0Qiw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDdEUsQ0FBQztJQUVELHNCQUFzQixDQUFDLElBQUksRUFBRSxNQUFNO1FBQ2pDLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDOUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN4QzthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ2pELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQsK0JBQStCLENBQUMsU0FBUyxFQUFFLFdBQVc7UUFDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFO1lBQ3JELE9BQU87U0FDUjtRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDaEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRCxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQzlDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWxFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1QixJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO2dCQUN2QixPQUFPO2FBQ1I7WUFDRCxNQUFNLHdCQUF3QixHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUMvRCxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNqRSxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksU0FBUyxFQUFFO2dCQUNiLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtvQkFDZixPQUFPO2lCQUNSO2dCQUNELEdBQUcsQ0FBQyxhQUFhLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUN6RDtpQkFBTTtnQkFDTCxNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDbkQsT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ3RGLENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksd0JBQXdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDdkMsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO3dCQUNmLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLG1CQUFtQixDQUFDLE1BQU0sS0FBSyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUU7NEJBQzdGLEdBQUcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDOzRCQUN6QixHQUFHLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs0QkFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLHdCQUF3QixDQUFDLENBQUM7eUJBQ3REO3FCQUNGO3lCQUFNO3dCQUNMLEdBQUcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO3FCQUMxQjtvQkFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTt3QkFDOUQsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFOzRCQUNmLEdBQUcsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDOzRCQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN0QixJQUFJLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLENBQUMsQ0FBQzt5QkFDdEQ7cUJBQ0Y7aUJBQ0Y7cUJBQU07b0JBQ0wsR0FBRyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7b0JBQzFCLElBQUksbUJBQW1CLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTt3QkFDcEMsK0RBQStEO3dCQUMvRCxPQUFPO3FCQUNSO3lCQUFNLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO3dCQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztxQkFDeEI7aUJBQ0Y7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUM7U0FDaEY7SUFDSCxDQUFDO0lBRUQsMEJBQTBCLENBQUMsT0FBTyxFQUFFLE1BQU07UUFDeEMsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDOUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDNUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsTUFBTTtRQUNqQyxNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssUUFBUSxDQUFDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDM0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxPQUFPO1NBQ1I7UUFDRCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUM5QixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRTtnQkFDbkMsSUFBSSxTQUFTLEVBQUU7b0JBQ2IsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ2xCO2dCQUNELENBQUMsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ3RCO2dCQUNELENBQUMsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO2FBQ3ZCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsSUFBSSxFQUFFLE1BQU07UUFDL0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxLQUFLLFFBQVEsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRTtnQkFDZCxDQUFDLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQzthQUM3QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHlCQUF5QixDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsa0JBQWtCO1FBQ3RFLE1BQU0sZ0NBQWdDLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDOUgsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQy9HLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM5RixJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTTtRQUNoQyxNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssUUFBUSxDQUFDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDcEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzlCLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7Z0JBQ3JCLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDL0QsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUMzQixDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztvQkFDbEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEVBQUU7d0JBQ3JDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdkM7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDckI7aUJBQ0Y7Z0JBQ0QsQ0FBQyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7YUFDdkI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTTtRQUM3QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRTtZQUNuRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEQ7SUFDSCxDQUFDO0lBRUQscUJBQXFCLENBQUMsUUFBUTtRQUM1QixJQUFJLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNsQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDckIsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFO2dCQUNmLDhEQUE4RDtnQkFDOUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDaEMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUNsRSxxQkFBcUIsR0FBRyxJQUFJLENBQUM7cUJBQzlCO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7Z0JBQ2hHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDYjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFLO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BCLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2dCQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7Z0JBQ3hDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLGtCQUFrQixFQUFFO3dCQUN2QyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7d0JBQzFCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQ2pEO29CQUNELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9ELEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFO3dCQUNoQixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUN2QztvQkFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO3dCQUMvQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO3FCQUMzQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7b0JBQ3JCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUM5RTthQUNGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3ZCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLElBQUk7UUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLFNBQVMsQ0FBQyxDQUFDO1FBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQVk7UUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQVk7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7O1lBcm1CRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLFNBQVMsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2dCQUNqQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCVDtnQkFDRCxJQUFJLEVBQUU7b0JBQ0osb0JBQW9CLEVBQUUsa0JBQWtCO2lCQUN6QzthQUNGOzs7WUExRG1CLFVBQVU7WUFJckIsZ0JBQWdCOzs7cUJBd0R0QixLQUFLOzBCQUVMLEtBQUs7b0JBRUwsS0FBSztzQkFFTCxNQUFNO29CQUVOLE1BQU07bUJBRU4sTUFBTTtvQkFPTixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTkcyXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbi8vIFZlbmRvclxuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTm92b0xhYmVsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vdm8tbGFiZWwtc2VydmljZSc7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSAnLi4vLi4vdXRpbHMvSGVscGVycyc7XG5pbXBvcnQgeyBLZXlDb2RlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2tleS1jb2Rlcy9LZXlDb2Rlcyc7XG5cbi8vIFZhbHVlIGFjY2Vzc29yIGZvciB0aGUgY29tcG9uZW50IChzdXBwb3J0cyBuZ01vZGVsKVxuY29uc3QgQ0hJUFNfVkFMVUVfQUNDRVNTT1IgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOb3ZvTXVsdGlQaWNrZXJFbGVtZW50KSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG5pbnRlcmZhY2UgSXRlbSB7XG4gIHR5cGU7XG4gIGxhYmVsO1xuICB2YWx1ZTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXVsdGktcGlja2VyJyxcbiAgcHJvdmlkZXJzOiBbQ0hJUFNfVkFMVUVfQUNDRVNTT1JdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxjaGlwXG4gICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiAoX2l0ZW1zIHwgYXN5bmMgfCBzbGljZTogMDpjaGlwc0NvdW50KVwiXG4gICAgICBbdHlwZV09XCJpdGVtLnR5cGVcIlxuICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cIml0ZW0gPT0gc2VsZWN0ZWRcIlxuICAgICAgKHJlbW92ZSk9XCJyZW1vdmVGcm9tRGlzcGxheSgkZXZlbnQsIGl0ZW0pXCJcbiAgICAgIChzZWxlY3QpPVwic2VsZWN0KCRldmVudCwgaXRlbSlcIlxuICAgID5cbiAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cbiAgICA8L2NoaXA+XG4gICAgPGRpdiAqbmdJZj1cIml0ZW1zLmxlbmd0aCA+IGNoaXBzQ291bnRcIj5cbiAgICAgIDx1bCBjbGFzcz1cInN1bW1hcnlcIj5cbiAgICAgICAgPGxpICpuZ0Zvcj1cImxldCB0eXBlIG9mIG5vdFNob3duXCI+KyB7eyB0eXBlLmNvdW50IH19IHt7IGxhYmVscy5tb3JlIH19IHt7IHR5cGUudHlwZSB9fTwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjaGlwLWlucHV0LWNvbnRhaW5lclwiPlxuICAgICAgPG5vdm8tcGlja2VyXG4gICAgICAgIGNsZWFyVmFsdWVPblNlbGVjdD1cInRydWVcIlxuICAgICAgICBbY29uZmlnXT1cInNvdXJjZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgIChzZWxlY3QpPVwiY2xpY2tPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgIChibHVyKT1cIm9uVG91Y2hlZCgkZXZlbnQpXCJcbiAgICAgICAgW292ZXJyaWRlRWxlbWVudF09XCJlbGVtZW50XCJcbiAgICAgID5cbiAgICAgIDwvbm92by1waWNrZXI+XG4gICAgPC9kaXY+XG4gICAgPGkgY2xhc3M9XCJiaGktc2VhcmNoXCIgW2NsYXNzLmhhcy12YWx1ZV09XCJpdGVtcy5sZW5ndGhcIj48L2k+XG4gICAgPGxhYmVsIGNsYXNzPVwiY2xlYXItYWxsXCIgKm5nSWY9XCJpdGVtcy5sZW5ndGhcIiAoY2xpY2spPVwiY2xlYXJWYWx1ZSgpXCI+e3sgbGFiZWxzLmNsZWFyQWxsIH19IDxpIGNsYXNzPVwiYmhpLXRpbWVzXCI+PC9pPjwvbGFiZWw+XG4gIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLndpdGgtdmFsdWVdJzogJ2l0ZW1zLmxlbmd0aCA+IDAnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBOb3ZvTXVsdGlQaWNrZXJFbGVtZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgc291cmNlOiB7IG9wdGlvbnM6IFtdOyByZXN1bHRzVGVtcGxhdGU7IHNlbGVjdEFsbE9wdGlvbjogYm9vbGVhbjsgY2hpcHNDb3VudDsgc3RyaWN0UmVsYXRpb25zaGlwIH07XG4gIEBJbnB1dCgpXG4gIHBsYWNlaG9sZGVyOiBhbnkgPSAnJztcbiAgQElucHV0KClcbiAgdHlwZXM6IHsgdmFsdWU7IHNpbmd1bGFyOyBwbHVyYWw7IGlzUGFyZW50T2Y7IGlzQ2hpbGRPZiB9W107XG4gIEBPdXRwdXQoKVxuICBjaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIGZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdmFsdWUoc2VsZWN0ZWRJdGVtcykge1xuICAgIGlmIChzZWxlY3RlZEl0ZW1zKSB7XG4gICAgICB0aGlzLnR5cGVzLmZvckVhY2goKHgpID0+ICh0aGlzLl92YWx1ZVt4LnZhbHVlXSA9IHNlbGVjdGVkSXRlbXNbeC52YWx1ZV0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWUgPSB7fTtcbiAgICAgIHRoaXMudHlwZXMuZm9yRWFjaCgoeCkgPT4gKHRoaXMuX3ZhbHVlW3gudmFsdWVdID0gW10pKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VkLmVtaXQoc2VsZWN0ZWRJdGVtcyk7XG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHNlbGVjdGVkSXRlbXMpO1xuICB9XG5cbiAgaXRlbXM6IEl0ZW1bXSA9IFtdO1xuICBfaXRlbXMgPSBuZXcgUmVwbGF5U3ViamVjdDxJdGVtW10+KDEpO1xuICBvcHRpb25zOiBhbnk7XG4gIF9vcHRpb25zOiBhbnk7XG4gIHNlbGVjdGVkOiBhbnkgPSBudWxsO1xuICBjb25maWc6IGFueSA9IHt9O1xuICBjaGlwc0NvdW50OiBudW1iZXI7XG4gIHNlbGVjdEFsbE9wdGlvbjogYm9vbGVhbjtcbiAgc3RyaWN0UmVsYXRpb25zaGlwOiBib29sZWFuO1xuICAvLyBwcml2YXRlIGRhdGEgbW9kZWxcbiAgX3ZhbHVlID0ge307XG4gIG5vdFNob3duOiBhbnkgPSB7fTtcbiAgLy8gUGxhY2Vob2xkZXJzIGZvciB0aGUgY2FsbGJhY2tzXG4gIG1vZGVsOiBhbnk7XG4gIG9uTW9kZWxDaGFuZ2U6IEZ1bmN0aW9uID0gKCkgPT4geyB9O1xuICBvbk1vZGVsVG91Y2hlZDogRnVuY3Rpb24gPSAoKSA9PiB7IH07XG5cbiAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWYsIHB1YmxpYyBsYWJlbHM6IE5vdm9MYWJlbFNlcnZpY2UpIHtcbiAgICB0aGlzLmNoaXBzQ291bnQgPSA0O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZWxlY3RBbGxPcHRpb24gPSB0aGlzLnNvdXJjZS5zZWxlY3RBbGxPcHRpb24gfHwgZmFsc2U7XG4gICAgdGhpcy5jaGlwc0NvdW50ID0gdGhpcy5zb3VyY2UuY2hpcHNDb3VudCB8fCA0O1xuICAgIHRoaXMuc3RyaWN0UmVsYXRpb25zaGlwID0gdGhpcy5zb3VyY2Uuc3RyaWN0UmVsYXRpb25zaGlwIHx8IGZhbHNlO1xuICAgIHRoaXMuc2V0dXBPcHRpb25zKCk7XG4gIH1cblxuICBjbGVhclZhbHVlKCkge1xuICAgIHRoaXMudHlwZXMuZm9yRWFjaCgodHlwZSkgPT4gdGhpcy5tb2RpZnlBbGxPZlR5cGUodHlwZS52YWx1ZSwgJ3Vuc2VsZWN0JykpO1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB0aGlzLl9pdGVtcy5uZXh0KHRoaXMuaXRlbXMpO1xuICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlKG51bGwpO1xuICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIHJlbW92ZUZyb21EaXNwbGF5KGV2ZW50LCBpdGVtKSB7XG4gICAgdGhpcy5yZW1vdmUodHJ1ZSwgaXRlbSk7XG4gICAgdGhpcy5tb2RpZnlBZmZlY3RlZFBhcmVudHNPckNoaWxkcmVuKGZhbHNlLCBpdGVtKTtcbiAgfVxuXG4gIHNldHVwT3B0aW9ucygpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLnNvdXJjZS5vcHRpb25zIHx8IFtdO1xuICAgIHRoaXMuX29wdGlvbnMgPSBbXTtcbiAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZE9wdGlvbiA9IHRoaXMuc2V0dXBPcHRpb25zQnlUeXBlKG9wdGlvbik7XG4gICAgICAgIHRoaXMuX29wdGlvbnMucHVzaChmb3JtYXR0ZWRPcHRpb24pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc291cmNlLm9wdGlvbnMgPSB0aGlzLl9vcHRpb25zO1xuICB9XG5cbiAgc2V0dXBPcHRpb25zQnlUeXBlKHNlY3Rpb24pIHtcbiAgICBjb25zdCBmb3JtYXR0ZWRTZWN0aW9uOiBhbnkgPSB7XG4gICAgICB0eXBlOiBzZWN0aW9uLnR5cGUsXG4gICAgICBsYWJlbDogc2VjdGlvbi5sYWJlbCB8fCBzZWN0aW9uLnR5cGUsXG4gICAgfTtcbiAgICBmb3JtYXR0ZWRTZWN0aW9uLmRhdGEgPSBzZWN0aW9uLmRhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRPcHRpb24oc2VjdGlvbiwgaXRlbSk7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuc2VsZWN0QWxsT3B0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RBbGwgPSB0aGlzLmNyZWF0ZVNlbGVjdEFsbE9wdGlvbihzZWN0aW9uKTtcbiAgICAgIGZvcm1hdHRlZFNlY3Rpb24uZGF0YS5zcGxpY2UoMCwgMCwgc2VsZWN0QWxsKTtcbiAgICB9XG4gICAgZm9ybWF0dGVkU2VjdGlvbi5vcmlnaW5hbERhdGEgPSBmb3JtYXR0ZWRTZWN0aW9uLmRhdGEuc2xpY2UoKTtcbiAgICByZXR1cm4gZm9ybWF0dGVkU2VjdGlvbjtcbiAgfVxuXG4gIGZvcm1hdE9wdGlvbihzZWN0aW9uLCBpdGVtKSB7XG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgdmFsdWU6IHNlY3Rpb24uZmllbGQgPyBpdGVtW3NlY3Rpb24uZmllbGRdIDogaXRlbS52YWx1ZSB8fCBpdGVtLFxuICAgICAgbGFiZWw6IHNlY3Rpb24uZm9ybWF0ID8gSGVscGVycy5pbnRlcnBvbGF0ZShzZWN0aW9uLmZvcm1hdCwgaXRlbSkgOiBpdGVtLmxhYmVsIHx8IFN0cmluZyhpdGVtLnZhbHVlIHx8IGl0ZW0pLFxuICAgICAgdHlwZTogc2VjdGlvbi50eXBlLFxuICAgICAgY2hlY2tlZDogdW5kZWZpbmVkLFxuICAgICAgaXNQYXJlbnRPZjogc2VjdGlvbi5pc1BhcmVudE9mLFxuICAgICAgaXNDaGlsZE9mOiBzZWN0aW9uLmlzQ2hpbGRPZixcbiAgICB9O1xuICAgIGlmIChvYmouaXNDaGlsZE9mKSB7XG4gICAgICBvYmpbc2VjdGlvbi5pc0NoaWxkT2ZdID0gaXRlbVtzZWN0aW9uLmlzQ2hpbGRPZl07XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBjcmVhdGVTZWxlY3RBbGxPcHRpb24oc2VjdGlvbikge1xuICAgIGNvbnN0IHNlbGVjdEFsbCA9IHtcbiAgICAgIHZhbHVlOiAnQUxMJyxcbiAgICAgIGxhYmVsOiBgQWxsICR7c2VjdGlvbi50eXBlfWAsXG4gICAgICB0eXBlOiBzZWN0aW9uLnR5cGUsXG4gICAgICBjaGVja2VkOiB0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwubGVuZ3RoICYmIHRoaXMubW9kZWwuaW5kZXhPZignQUxMJykgIT09IC0xLFxuICAgICAgaXNQYXJlbnRPZjogc2VjdGlvbi5pc1BhcmVudE9mLFxuICAgICAgaXNDaGlsZE9mOiBzZWN0aW9uLmlzQ2hpbGRPZixcbiAgICB9O1xuICAgIGlmIChzZWN0aW9uLmlzQ2hpbGRPZikge1xuICAgICAgY29uc3QgYWxsUGFyZW50cyA9IHNlY3Rpb24uZGF0YS5yZWR1Y2UoKGFjY3VtLCBuZXh0KSA9PiB7XG4gICAgICAgIHJldHVybiBhY2N1bS5jb25jYXQobmV4dFtzZWN0aW9uLmlzQ2hpbGRPZl0pO1xuICAgICAgfSwgW10pO1xuICAgICAgc2VsZWN0QWxsW3NlY3Rpb24uaXNDaGlsZE9mXSA9IGFsbFBhcmVudHM7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RBbGw7XG4gIH1cblxuICBkZXNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDtcbiAgfVxuXG4gIHNlbGVjdChldmVudCwgaXRlbSkge1xuICAgIHRoaXMuYmx1ci5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLmRlc2VsZWN0QWxsKCk7XG4gICAgdGhpcy5zZWxlY3RlZCA9IGl0ZW07XG4gIH1cblxuICBvbkZvY3VzKGUpIHtcbiAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgIHRoaXMuZm9jdXMuZW1pdChlKTtcbiAgfVxuXG4gIGNsaWNrT3B0aW9uKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ICYmICEoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkpIHtcbiAgICAgIGlmIChldmVudC5jaGVja2VkID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnJlbW92ZShudWxsLCBldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZChldmVudCk7XG4gICAgICB9XG4gICAgICB0aGlzLm1vZGlmeUFmZmVjdGVkUGFyZW50c09yQ2hpbGRyZW4oZXZlbnQuY2hlY2tlZCwgZXZlbnQpO1xuICAgICAgLy8gU2V0IGZvY3VzIG9uIHRoZSBwaWNrZXJcbiAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcignbm92by1waWNrZXIgPiBpbnB1dCcpO1xuICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnZhbHVlID09PSAnQUxMJykge1xuICAgICAgdGhpcy5tb2RpZnlBbGxPZlR5cGUoZXZlbnQudHlwZSwgJ3NlbGVjdCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXlJdGVtcyhldmVudCwgJ2FkZCcpO1xuICAgICAgdGhpcy52YWx1ZVtldmVudC50eXBlXS5wdXNoKGV2ZW50LnZhbHVlKTtcbiAgICAgIHRoaXMudXBkYXRlQWxsSXRlbVN0YXRlKGV2ZW50LnR5cGUpO1xuICAgICAgdGhpcy50cmlnZ2VyVmFsdWVVcGRhdGUoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVQYXJlbnRPckNoaWxkcmVuKGV2ZW50LCAnc2VsZWN0Jyk7XG4gICAgdGhpcy5zZWxlY3QobnVsbCwgZXZlbnQpO1xuICB9XG5cbiAgdXBkYXRlQWxsSXRlbVN0YXRlKHR5cGUpIHtcbiAgICBjb25zdCBhbGxPZlR5cGUgPSB0aGlzLmdldEFsbE9mVHlwZSh0eXBlKTtcbiAgICBjb25zdCBhbGxPZlR5cGVTZWxlY3RlZCA9IHRoaXMuYWxsSXRlbXNTZWxlY3RlZChhbGxPZlR5cGUsIHR5cGUpO1xuICAgIGlmIChhbGxPZlR5cGVTZWxlY3RlZCkge1xuICAgICAgdGhpcy5zZWxlY3RBbGwoYWxsT2ZUeXBlLCB0eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWxsT2ZUeXBlLCBhbGxPZlR5cGVTZWxlY3RlZCB9O1xuICB9XG5cbiAgc2V0SW5kZXRlcm1pbmF0ZVN0YXRlKGFsbE9mVHlwZSwgc3RhdHVzKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdEFsbE9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbGxJdGVtID0gYWxsT2ZUeXBlWzBdO1xuICAgIGFsbEl0ZW0uaW5kZXRlcm1pbmF0ZSA9IHN0YXR1cztcbiAgfVxuXG4gIHVwZGF0ZURpc3BsYXlJdGVtcyhpdGVtLCBhY3Rpb24pIHtcbiAgICBjb25zdCBhZGRpbmcgPSBhY3Rpb24gPT09ICdhZGQnO1xuICAgIGlmIChhZGRpbmcpIHtcbiAgICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKSA+IC0xKSB7XG4gICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKSwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRGlzcGxheVRleHQodGhpcy5pdGVtcyk7XG4gICAgdGhpcy5faXRlbXMubmV4dCh0aGlzLml0ZW1zKTtcbiAgfVxuXG4gIHVwZGF0ZURpc3BsYXlUZXh0KGl0ZW1zKSB7XG4gICAgdGhpcy5ub3RTaG93biA9IFtdO1xuICAgIGNvbnN0IG5vdFNob3duID0gaXRlbXMuc2xpY2UodGhpcy5jaGlwc0NvdW50KTtcbiAgICBpZiAobm90U2hvd24ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50eXBlcy5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICAgIGxldCBjb3VudDtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPZlR5cGUgPSBub3RTaG93bi5maWx0ZXIoKHgpID0+IHgudHlwZSA9PT0gdHlwZS52YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZE9mVHlwZS5sZW5ndGggPT09IDEgJiYgc2VsZWN0ZWRPZlR5cGVbMF0udmFsdWUgPT09ICdBTEwnKSB7XG4gICAgICAgICAgY291bnQgPSB0aGlzLmdldEFsbE9mVHlwZSh0eXBlLnZhbHVlKS5sZW5ndGggLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvdW50ID0gc2VsZWN0ZWRPZlR5cGUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc3BsYXlUeXBlID0gY291bnQgPT09IDEgPyB0eXBlLnNpbmd1bGFyIDogdHlwZS5wbHVyYWwgfHwgdHlwZS52YWx1ZTtcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgIHRoaXMubm90U2hvd24ucHVzaCh7IHR5cGU6IGRpc3BsYXlUeXBlLCBjb3VudCB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlKGV2ZW50LCBpdGVtKSB7XG4gICAgbGV0IHRyaWdnZXJlZEJ5RXZlbnQ7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0cmlnZ2VyZWRCeUV2ZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaXRlbVRvUmVtb3ZlID0gaXRlbTtcbiAgICBpZiAoaXRlbVRvUmVtb3ZlLnZhbHVlID09PSAnQUxMJykge1xuICAgICAgdHJpZ2dlcmVkQnlFdmVudCA9IGZhbHNlO1xuICAgICAgdGhpcy5tb2RpZnlBbGxPZlR5cGUoaXRlbVRvUmVtb3ZlLnR5cGUsICd1bnNlbGVjdCcpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hbGxPZlR5cGVTZWxlY3RlZChpdGVtVG9SZW1vdmUudHlwZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVtb3ZlSXRlbUlmQWxsU2VsZWN0ZWQoaXRlbVRvUmVtb3ZlKTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVJdGVtKGl0ZW0sIHRyaWdnZXJlZEJ5RXZlbnQpO1xuICB9XG5cbiAgcmVtb3ZlSXRlbShpdGVtLCB0cmlnZ2VyZWRCeUV2ZW50PzogYW55KSB7XG4gICAgaXRlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5kZXNlbGVjdEFsbCgpO1xuICAgIHRoaXMucmVtb3ZlVmFsdWUoaXRlbSk7XG4gICAgaWYgKGl0ZW0udmFsdWUgIT09ICdBTEwnKSB7XG4gICAgICB0aGlzLnVwZGF0ZVBhcmVudE9yQ2hpbGRyZW4oaXRlbSwgJ3Vuc2VsZWN0Jyk7XG4gICAgfVxuICAgIGlmICh0cmlnZ2VyZWRCeUV2ZW50KSB7XG4gICAgICB0aGlzLm1vZGlmeUFmZmVjdGVkUGFyZW50c09yQ2hpbGRyZW4oZmFsc2UsIGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVZhbHVlKGl0ZW0pIHtcbiAgICBjb25zdCB1cGRhdGVkVmFsdWVzID0gdGhpcy52YWx1ZVtpdGVtLnR5cGVdLmZpbHRlcigoeCkgPT4geCAhPT0gaXRlbS52YWx1ZSk7XG4gICAgdGhpcy52YWx1ZVtpdGVtLnR5cGVdID0gdXBkYXRlZFZhbHVlcztcbiAgICB0aGlzLnRyaWdnZXJWYWx1ZVVwZGF0ZSgpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheUl0ZW1zKGl0ZW0sICdyZW1vdmUnKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudCkge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2Rlcy5CQUNLU1BBQ0UpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnZhbHVlLmxlbmd0aCA9PT0gMCAmJiB0aGlzLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmUobnVsbCwgdGhpcy5zZWxlY3RlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3QoZXZlbnQsIHRoaXMuaXRlbXNbdGhpcy5pdGVtcy5sZW5ndGggLSAxXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhbGxPZlR5cGVTZWxlY3RlZCh0eXBlKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuZmlsdGVyKCh4KSA9PiB4LnR5cGUgPT09IHR5cGUgJiYgeC52YWx1ZSA9PT0gJ0FMTCcpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBtb2RpZnlBbGxPZlR5cGUodHlwZSwgYWN0aW9uKSB7XG4gICAgY29uc3Qgc2VsZWN0aW5nID0gYWN0aW9uID09PSAnc2VsZWN0JztcbiAgICBjb25zdCBhbGxPZlR5cGUgPSB0aGlzLmdldEFsbE9mVHlwZSh0eXBlKTtcbiAgICBhbGxPZlR5cGUuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaXRlbS5jaGVja2VkID0gc2VsZWN0aW5nO1xuICAgICAgaXRlbS5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgfSk7XG4gICAgaWYgKHNlbGVjdGluZykge1xuICAgICAgdGhpcy5zZWxlY3RBbGwoYWxsT2ZUeXBlLCB0eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pdGVtcyA9IFsuLi50aGlzLml0ZW1zLmZpbHRlcigoeCkgPT4geC50eXBlICE9PSB0eXBlKV07XG4gICAgICB0aGlzLl9pdGVtcy5uZXh0KHRoaXMuaXRlbXMpO1xuICAgICAgdGhpcy52YWx1ZVt0eXBlXSA9IFtdO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RBbGxPcHRpb24pIHtcbiAgICAgIHRoaXMudXBkYXRlQWxsUGFyZW50c09yQ2hpbGRyZW4oYWxsT2ZUeXBlWzBdLCBhY3Rpb24pO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJWYWx1ZVVwZGF0ZSgpO1xuICB9XG5cbiAgdHJpZ2dlclZhbHVlVXBkYXRlKCkge1xuICAgIGNvbnN0IHVwZGF0ZWRPYmplY3QgPSB7fTtcbiAgICB0aGlzLnR5cGVzLmZvckVhY2goKHgpID0+ICh1cGRhdGVkT2JqZWN0W3gudmFsdWVdID0gdGhpcy52YWx1ZVt4LnZhbHVlXSkpO1xuICAgIHRoaXMudmFsdWUgPSB1cGRhdGVkT2JqZWN0O1xuICB9XG5cbiAgc2VsZWN0QWxsKGFsbE9mVHlwZSwgdHlwZSkge1xuICAgIGlmICghdGhpcy5zZWxlY3RBbGxPcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWxsT2ZUeXBlWzBdLmNoZWNrZWQgPSB0cnVlO1xuICAgIGNvbnN0IHZhbHVlcyA9IGFsbE9mVHlwZS5tYXAoKGkpID0+IHtcbiAgICAgIHJldHVybiBpLnZhbHVlO1xuICAgIH0pO1xuICAgIC8vIHJlbW92ZSAnQUxMJyB2YWx1ZVxuICAgIHZhbHVlcy5zcGxpY2UoMCwgMSk7XG4gICAgdGhpcy52YWx1ZVt0eXBlXSA9IHZhbHVlcztcbiAgICBjb25zdCB1cGRhdGVkSXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcigoeCkgPT4geC50eXBlICE9PSB0eXBlKTtcbiAgICB0aGlzLml0ZW1zID0gdXBkYXRlZEl0ZW1zO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheUl0ZW1zKGFsbE9mVHlwZVswXSwgJ2FkZCcpO1xuICB9XG5cbiAgaGFuZGxlUmVtb3ZlSXRlbUlmQWxsU2VsZWN0ZWQoaXRlbSkge1xuICAgIGlmICghdGhpcy5zZWxlY3RBbGxPcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGl0ZW0udHlwZTtcbiAgICBjb25zdCBhbGxPZlR5cGUgPSB0aGlzLmdldEFsbE9mVHlwZSh0eXBlKTtcbiAgICBjb25zdCBhbGxJdGVtID0gYWxsT2ZUeXBlWzBdO1xuICAgIHRoaXMucmVtb3ZlSXRlbShhbGxJdGVtKTtcbiAgICBhbGxJdGVtLmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBhbGxPZlR5cGUuZmlsdGVyKChpKSA9PiBpLmNoZWNrZWQgPT09IHRydWUpO1xuICAgIHRoaXMuaXRlbXMgPSBbLi4udGhpcy5pdGVtcywgLi4uc2VsZWN0ZWRJdGVtc107XG4gICAgY29uc3QgdmFsdWVzID0gc2VsZWN0ZWRJdGVtcy5tYXAoKGkpID0+IHtcbiAgICAgIHJldHVybiBpLnZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMudmFsdWVbdHlwZV0gPSBbLi4udmFsdWVzXTtcbiAgfVxuXG4gIGhhbmRsZU91dHNpZGVDbGljayhldmVudCkge1xuICAgIC8vIElmIHRoZSBlbGVtZW50cyBkb2Vzbid0IGNvbnRhaW4gdGhlIHRhcmdldCBlbGVtZW50LCBpdCBpcyBhbiBvdXRzaWRlIGNsaWNrXG4gICAgaWYgKCF0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmJsdXIuZW1pdChldmVudCk7XG4gICAgICB0aGlzLmRlc2VsZWN0QWxsKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWxsT2ZUeXBlKHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucy5maWx0ZXIoKHgpID0+IHgudHlwZSA9PT0gdHlwZSlbMF0ub3JpZ2luYWxEYXRhO1xuICB9XG5cbiAgdXBkYXRlUGFyZW50T3JDaGlsZHJlbihpdGVtLCBhY3Rpb24pIHtcbiAgICBpZiAodGhpcy5zdHJpY3RSZWxhdGlvbnNoaXAgJiYgaXRlbS5pc1BhcmVudE9mKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuVmFsdWUoaXRlbSwgYWN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uaXNDaGlsZE9mICYmIHRoaXMuc2VsZWN0QWxsT3B0aW9uKSB7XG4gICAgICB0aGlzLnVwZGF0ZVBhcmVudFZhbHVlKGl0ZW0sIGFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgbW9kaWZ5QWZmZWN0ZWRQYXJlbnRzT3JDaGlsZHJlbihzZWxlY3RpbmcsIGl0ZW1DaGFuZ2VkKSB7XG4gICAgaWYgKCFpdGVtQ2hhbmdlZC5pc0NoaWxkT2YgJiYgIWl0ZW1DaGFuZ2VkLmlzUGFyZW50T2YpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy50eXBlcy5maWx0ZXIoKHgpID0+ICEheC5pc1BhcmVudE9mKVswXTtcbiAgICBjb25zdCBwYXJlbnRUeXBlID0gcGFyZW50LnZhbHVlO1xuICAgIGNvbnN0IGFsbFBhcmVudFR5cGUgPSB0aGlzLmdldEFsbE9mVHlwZShwYXJlbnRUeXBlKTtcbiAgICBjb25zdCBjaGlsZFR5cGUgPSBhbGxQYXJlbnRUeXBlWzBdLmlzUGFyZW50T2Y7XG4gICAgY29uc3QgYWxsQ2hpbGRyZW4gPSB0aGlzLmdldEFsbE9mVHlwZShjaGlsZFR5cGUpO1xuICAgIGNvbnN0IGFsbENoZWNrZWRDaGlsZHJlbiA9IGFsbENoaWxkcmVuLmZpbHRlcigoeCkgPT4gISF4LmNoZWNrZWQpO1xuXG4gICAgYWxsUGFyZW50VHlwZS5mb3JFYWNoKChvYmopID0+IHtcbiAgICAgIGlmIChvYmoudmFsdWUgPT09ICdBTEwnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2hpbGRyZW5PZlBhcmVudCA9IGFsbENoZWNrZWRDaGlsZHJlbi5maWx0ZXIoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHhbcGFyZW50VHlwZV0uZmlsdGVyKCh5KSA9PiB5ID09PSBvYmoudmFsdWUpLmxlbmd0aCA+IDA7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHNlbGVjdGluZykge1xuICAgICAgICBpZiAob2JqLmNoZWNrZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb2JqLmluZGV0ZXJtaW5hdGUgPSBzZWxlY3RlZENoaWxkcmVuT2ZQYXJlbnQubGVuZ3RoID4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFsbENoaWxkcmVuT2ZQYXJlbnQgPSBhbGxDaGlsZHJlbi5maWx0ZXIoKHgpID0+IHtcbiAgICAgICAgICByZXR1cm4geC52YWx1ZSAhPT0gJ0FMTCcgJiYgeFtwYXJlbnRUeXBlXS5maWx0ZXIoKHkpID0+IHkgPT09IG9iai52YWx1ZSkubGVuZ3RoID4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzZWxlY3RlZENoaWxkcmVuT2ZQYXJlbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChvYmouY2hlY2tlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RyaWN0UmVsYXRpb25zaGlwICYmIGFsbENoaWxkcmVuT2ZQYXJlbnQubGVuZ3RoICE9PSBzZWxlY3RlZENoaWxkcmVuT2ZQYXJlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIG9iai5pbmRldGVybWluYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgb2JqLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVWYWx1ZShvYmopO1xuICAgICAgICAgICAgICB0aGlzLmFkZEluZGl2aWR1YWxDaGlsZHJlbihzZWxlY3RlZENoaWxkcmVuT2ZQYXJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmouaW5kZXRlcm1pbmF0ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLnN0cmljdFJlbGF0aW9uc2hpcCAmJiBpdGVtQ2hhbmdlZC50eXBlICE9PSBwYXJlbnRUeXBlKSB7XG4gICAgICAgICAgICBpZiAob2JqLmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgb2JqLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVWYWx1ZShvYmopO1xuICAgICAgICAgICAgICB0aGlzLmFkZEluZGl2aWR1YWxDaGlsZHJlbihzZWxlY3RlZENoaWxkcmVuT2ZQYXJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYmouaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgIGlmIChhbGxDaGlsZHJlbk9mUGFyZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gaWYgaXQgaGFzIG5vIGNoaWxkcmVuIGFuZCBpcyBjaGVja2VkLCBpdCBzaG91bGQgc3RheSBjaGVja2VkXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0cmljdFJlbGF0aW9uc2hpcCAmJiBpdGVtQ2hhbmdlZC50eXBlICE9PSBwYXJlbnRUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZShudWxsLCBvYmopO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnNlbGVjdEFsbE9wdGlvbikge1xuICAgICAgdGhpcy51cGRhdGVJbmRldGVybWluYXRlU3RhdGVzKGFsbFBhcmVudFR5cGUsIGFsbENoaWxkcmVuLCBhbGxDaGVja2VkQ2hpbGRyZW4pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUFsbFBhcmVudHNPckNoaWxkcmVuKGFsbEl0ZW0sIGFjdGlvbikge1xuICAgIGlmIChhbGxJdGVtLmlzUGFyZW50T2YpIHtcbiAgICAgIHRoaXMudXBkYXRlQWxsQ2hpbGRyZW5WYWx1ZShhbGxJdGVtLCBhY3Rpb24pO1xuICAgIH0gZWxzZSBpZiAoYWxsSXRlbS5pc0NoaWxkT2YpIHtcbiAgICAgIHRoaXMudXBkYXRlQWxsUGFyZW50VmFsdWUoYWxsSXRlbSwgYWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVBbGxDaGlsZHJlblZhbHVlKGl0ZW0sIGFjdGlvbikge1xuICAgIGNvbnN0IHNlbGVjdGluZyA9IGFjdGlvbiA9PT0gJ3NlbGVjdCc7XG4gICAgY29uc3QgY2hpbGRUeXBlID0gaXRlbS5pc1BhcmVudE9mO1xuICAgIGNvbnN0IHBvdGVudGlhbENoaWxkcmVuID0gdGhpcy5nZXRBbGxPZlR5cGUoY2hpbGRUeXBlKTtcbiAgICBpZiAodGhpcy5zZWxlY3RBbGxPcHRpb24gJiYgdGhpcy5hbGxPZlR5cGVTZWxlY3RlZChjaGlsZFR5cGUpICYmICFzZWxlY3RpbmcpIHtcbiAgICAgIHRoaXMucmVtb3ZlKG51bGwsIHBvdGVudGlhbENoaWxkcmVuWzBdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcG90ZW50aWFsQ2hpbGRyZW4uZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgaWYgKHgudmFsdWUgPT09ICdBTEwnICYmICF4LmNoZWNrZWQpIHtcbiAgICAgICAgaWYgKHNlbGVjdGluZykge1xuICAgICAgICAgIHguY2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgeC5pbmRldGVybWluYXRlID0gc2VsZWN0aW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHguY2hlY2tlZCAmJiAhc2VsZWN0aW5nKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmUobnVsbCwgeCk7XG4gICAgICAgIH1cbiAgICAgICAgeC5jaGVja2VkID0gc2VsZWN0aW5nO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlQWxsUGFyZW50VmFsdWUoaXRlbSwgYWN0aW9uKSB7XG4gICAgY29uc3Qgc2VsZWN0aW5nID0gYWN0aW9uID09PSAnc2VsZWN0JztcbiAgICBjb25zdCBwYXJlbnRUeXBlID0gaXRlbS5pc0NoaWxkT2Y7XG4gICAgY29uc3QgcG90ZW50aWFsUGFyZW50cyA9IHRoaXMuZ2V0QWxsT2ZUeXBlKHBhcmVudFR5cGUpO1xuICAgIHBvdGVudGlhbFBhcmVudHMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgaWYgKCF4LmNoZWNrZWQpIHtcbiAgICAgICAgeC5pbmRldGVybWluYXRlID0gc2VsZWN0aW5nO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlSW5kZXRlcm1pbmF0ZVN0YXRlcyhhbGxQYXJlbnRUeXBlLCBhbGxDaGlsZHJlbiwgYWxsQ2hlY2tlZENoaWxkcmVuKSB7XG4gICAgY29uc3QgYWxsQ2hlY2tlZE9ySW5kZXRlcm1pbmF0ZVBhcmVudHMgPSBhbGxQYXJlbnRUeXBlLmZpbHRlcigoeCkgPT4gKCEheC5jaGVja2VkIHx8ICEheC5pbmRldGVybWluYXRlKSAmJiB4LnZhbHVlICE9PSAnQUxMJyk7XG4gICAgY29uc3QgaXNQYXJlbnRJbmRldGVybWluYXRlID0gISFhbGxQYXJlbnRUeXBlWzBdLmNoZWNrZWQgPyBmYWxzZSA6IGFsbENoZWNrZWRPckluZGV0ZXJtaW5hdGVQYXJlbnRzLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgaXNDaGlsZEluZGV0ZXJtaW5hdGUgPSAhIWFsbENoaWxkcmVuWzBdLmNoZWNrZWQgPyBmYWxzZSA6IGFsbENoZWNrZWRDaGlsZHJlbi5sZW5ndGggPiAwO1xuICAgIHRoaXMuc2V0SW5kZXRlcm1pbmF0ZVN0YXRlKGFsbFBhcmVudFR5cGUsIGlzUGFyZW50SW5kZXRlcm1pbmF0ZSk7XG4gICAgdGhpcy5zZXRJbmRldGVybWluYXRlU3RhdGUoYWxsQ2hpbGRyZW4sIGlzQ2hpbGRJbmRldGVybWluYXRlKTtcbiAgfVxuXG4gIHVwZGF0ZUNoaWxkcmVuVmFsdWUocGFyZW50LCBhY3Rpb24pIHtcbiAgICBjb25zdCBzZWxlY3RpbmcgPSBhY3Rpb24gPT09ICdzZWxlY3QnO1xuICAgIGNvbnN0IGNoaWxkVHlwZSA9IHBhcmVudC5pc1BhcmVudE9mO1xuICAgIGNvbnN0IHBvdGVudGlhbENoaWxkcmVuID0gdGhpcy5nZXRBbGxPZlR5cGUoY2hpbGRUeXBlKTtcbiAgICBwb3RlbnRpYWxDaGlsZHJlbi5mb3JFYWNoKCh4KSA9PiB7XG4gICAgICBpZiAoeC52YWx1ZSA9PT0gJ0FMTCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHhbcGFyZW50LnR5cGVdLmZpbHRlcigoeSkgPT4geSA9PT0gcGFyZW50LnZhbHVlKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICh4LmNoZWNrZWQgJiYgIXNlbGVjdGluZykge1xuICAgICAgICAgIHguY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgIGlmICh0aGlzLmFsbE9mVHlwZVNlbGVjdGVkKGNoaWxkVHlwZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVtb3ZlSXRlbUlmQWxsU2VsZWN0ZWQoeCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVmFsdWUoeCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHguY2hlY2tlZCA9IHNlbGVjdGluZztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVBhcmVudFZhbHVlKGNoaWxkLCBhY3Rpb24pIHtcbiAgICBjb25zdCBhbGxQYXJlbnRUeXBlID0gdGhpcy5nZXRBbGxPZlR5cGUoY2hpbGQuaXNDaGlsZE9mKTtcbiAgICBpZiAoYWxsUGFyZW50VHlwZVswXS5jaGVja2VkICYmIGFjdGlvbiAhPT0gJ3NlbGVjdCcpIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVtb3ZlSXRlbUlmQWxsU2VsZWN0ZWQoYWxsUGFyZW50VHlwZVswXSk7XG4gICAgfVxuICB9XG5cbiAgYWRkSW5kaXZpZHVhbENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gICAgbGV0IHBhcmVudEFscmVhZHlTZWxlY3RlZCA9IGZhbHNlO1xuICAgIGNoaWxkcmVuLmZvckVhY2goKHgpID0+IHtcbiAgICAgIGlmICh4LmlzQ2hpbGRPZikge1xuICAgICAgICAvLyBvbmx5IGFkZCBjaGlsZHJlbiBpZiB0aGVpciBwYXJlbnRzIGFyZSBub3QgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICB4W3guaXNDaGlsZE9mXS5mb3JFYWNoKChwYXJlbnQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy52YWx1ZVt4LmlzQ2hpbGRPZl0uZmlsdGVyKChwKSA9PiBwID09PSBwYXJlbnQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBhcmVudEFscmVhZHlTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnZhbHVlW3gudHlwZV0uZmlsdGVyKChpdGVtKSA9PiBpdGVtID09PSB4LnZhbHVlKS5sZW5ndGggPT09IDAgJiYgIXBhcmVudEFscmVhZHlTZWxlY3RlZCkge1xuICAgICAgICB0aGlzLmFkZCh4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldEluaXRpYWxWYWx1ZShtb2RlbCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB0aGlzLnZhbHVlID0gbW9kZWwgfHwge307XG4gICAgaWYgKCF0aGlzLnR5cGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudHlwZXMuZm9yRWFjaCgodHlwZU9iaikgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IHR5cGVPYmoudmFsdWU7XG4gICAgICBpZiAodGhpcy52YWx1ZVt0eXBlXSkge1xuICAgICAgICBsZXQgaW5kZXRlcm1pbmF0ZUlzU2V0ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnVwZGF0ZUFsbEl0ZW1TdGF0ZSh0eXBlKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0J5VHlwZSA9IG9wdGlvbnMuYWxsT2ZUeXBlO1xuICAgICAgICBjb25zdCBhbGxTZWxlY3RlZCA9IG9wdGlvbnMuYWxsT2ZUeXBlU2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMudmFsdWVbdHlwZV0uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmICghYWxsU2VsZWN0ZWQgJiYgIWluZGV0ZXJtaW5hdGVJc1NldCkge1xuICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZUlzU2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXRlcm1pbmF0ZVN0YXRlKG9wdGlvbnNCeVR5cGUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNCeVR5cGUuZmlsdGVyKCh4KSA9PiB4LnZhbHVlID09PSBpdGVtKVswXTtcbiAgICAgICAgICB2YWx1ZS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoIWFsbFNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlJdGVtcyh2YWx1ZSwgJ2FkZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5zdHJpY3RSZWxhdGlvbnNoaXAgJiYgdmFsdWUuaXNQYXJlbnRPZikge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlblZhbHVlKHZhbHVlLCAnc2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGVPYmouaXNDaGlsZE9mKSB7XG4gICAgICAgICAgdGhpcy5tb2RpZnlBZmZlY3RlZFBhcmVudHNPckNoaWxkcmVuKHRydWUsIHsgdmFsdWU6IHR5cGUsIGlzQ2hpbGRPZjogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZVt0eXBlXSA9IFtdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWxsSXRlbXNTZWxlY3RlZChvcHRpb25zQnlUeXBlLCB0eXBlKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVbdHlwZV0ubGVuZ3RoID09PSBvcHRpb25zQnlUeXBlLmxlbmd0aCAtIDE7XG4gIH1cblxuICAvLyBTZXQgdG91Y2hlZCBvbiBibHVyXG4gIG9uVG91Y2hlZChlKSB7XG4gICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICB0aGlzLm9uTW9kZWxUb3VjaGVkKCk7XG4gICAgdGhpcy5ibHVyLmVtaXQoZSk7XG4gIH1cblxuICB3cml0ZVZhbHVlKG1vZGVsOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5zZXRJbml0aWFsVmFsdWUobW9kZWwpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLm9uTW9kZWxDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMub25Nb2RlbFRvdWNoZWQgPSBmbjtcbiAgfVxufVxuIl19
|