@dereekb/dbx-form 9.25.15 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_index.scss +1 -0
- package/calendar/lib/calendar.module.d.ts +1 -1
- package/calendar/lib/calendar.schedule.selection.cell.component.d.ts +1 -1
- package/calendar/lib/calendar.schedule.selection.component.d.ts +4 -4
- package/calendar/lib/calendar.schedule.selection.d.ts +1 -1
- package/calendar/lib/calendar.schedule.selection.days.component.d.ts +1 -1
- package/calendar/lib/calendar.schedule.selection.days.form.component.d.ts +2 -2
- package/calendar/lib/calendar.schedule.selection.dialog.button.component.d.ts +1 -6
- package/calendar/lib/calendar.schedule.selection.dialog.component.d.ts +1 -11
- package/calendar/lib/calendar.schedule.selection.popover.button.component.d.ts +2 -2
- package/calendar/lib/calendar.schedule.selection.popover.component.d.ts +1 -1
- package/calendar/lib/calendar.schedule.selection.popover.content.component.d.ts +1 -1
- package/calendar/lib/calendar.schedule.selection.range.component.d.ts +1 -1
- package/calendar/lib/calendar.schedule.selection.store.d.ts +4 -32
- package/calendar/lib/calendar.schedule.selection.store.provide.d.ts +1 -1
- package/calendar/lib/calendar.schedule.selection.toggle.button.component.d.ts +1 -1
- package/calendar/lib/field/schedule/calendar.schedule.field.component.d.ts +2 -8
- package/esm2022/calendar/lib/calendar.module.mjs +155 -0
- package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.cell.component.mjs +10 -10
- package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.component.mjs +6 -6
- package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.days.component.mjs +6 -6
- package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.days.form.component.mjs +6 -6
- package/esm2022/calendar/lib/calendar.schedule.selection.dialog.button.component.mjs +36 -0
- package/esm2022/calendar/lib/calendar.schedule.selection.dialog.component.mjs +56 -0
- package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.mjs +1 -1
- package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.popover.button.component.mjs +6 -6
- package/esm2022/calendar/lib/calendar.schedule.selection.popover.component.mjs +38 -0
- package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.popover.content.component.mjs +6 -6
- package/esm2022/calendar/lib/calendar.schedule.selection.range.component.mjs +188 -0
- package/esm2022/calendar/lib/calendar.schedule.selection.store.mjs +785 -0
- package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.store.provide.mjs +7 -7
- package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.toggle.button.component.mjs +6 -6
- package/esm2022/calendar/lib/field/schedule/calendar.schedule.field.component.mjs +158 -0
- package/esm2022/calendar/lib/field/schedule/calendar.schedule.field.mjs +28 -0
- package/esm2022/calendar/lib/field/schedule/calendar.schedule.module.mjs +58 -0
- package/{esm2020 → esm2022}/lib/form/action/form.action.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/form/action/form.action.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/form/action/transition/form.action.transition.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/form/action/transition/form.action.transition.safety.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/form/form.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/form/io/form.changes.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/form/io/form.input.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/form/io/form.io.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/form/io/form.loading.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/form.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/formly/field/checklist/checklist.item.field.component.mjs +9 -9
- package/{esm2020 → esm2022}/lib/formly/field/checklist/checklist.item.field.content.default.component.mjs +6 -6
- package/esm2022/lib/formly/field/checklist/checklist.item.field.module.mjs +67 -0
- package/{esm2020 → esm2022}/lib/formly/field/component/component.field.component.mjs +6 -6
- package/esm2022/lib/formly/field/component/component.field.module.mjs +32 -0
- package/esm2022/lib/formly/field/field.mjs +97 -0
- package/{esm2020 → esm2022}/lib/formly/field/form.field.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/formly/field/selection/list/list.field.component.mjs +4 -4
- package/esm2022/lib/formly/field/selection/list/list.field.module.mjs +76 -0
- package/esm2022/lib/formly/field/selection/pickable/pickable.chip.field.component.mjs +33 -0
- package/{esm2020 → esm2022}/lib/formly/field/selection/pickable/pickable.field.directive.mjs +4 -4
- package/esm2022/lib/formly/field/selection/pickable/pickable.field.module.mjs +93 -0
- package/esm2022/lib/formly/field/selection/pickable/pickable.list.field.component.mjs +116 -0
- package/{esm2020 → esm2022}/lib/formly/field/selection/pickable/pickable.mjs +1 -1
- package/esm2022/lib/formly/field/selection/searchable/searchable.chip.field.component.mjs +68 -0
- package/esm2022/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.mjs +95 -0
- package/esm2022/lib/formly/field/selection/searchable/searchable.field.directive.mjs +278 -0
- package/esm2022/lib/formly/field/selection/searchable/searchable.field.module.mjs +91 -0
- package/{esm2020 → esm2022}/lib/formly/field/selection/searchable/searchable.text.field.component.mjs +4 -4
- package/esm2022/lib/formly/field/selection/selection.field.mjs +39 -0
- package/{esm2020 → esm2022}/lib/formly/field/selection/selection.mjs +1 -1
- package/{esm2020 → esm2022}/lib/formly/field/selection/selection.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/formly/field/selection/sourceselect/sourceselect.field.component.mjs +4 -4
- package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.module.mjs +93 -0
- package/{esm2020 → esm2022}/lib/formly/field/texteditor/texteditor.field.component.mjs +6 -6
- package/esm2022/lib/formly/field/texteditor/texteditor.field.module.mjs +51 -0
- package/{esm2020 → esm2022}/lib/formly/field/value/array/array.field.component.mjs +8 -8
- package/esm2022/lib/formly/field/value/array/array.field.module.mjs +62 -0
- package/esm2022/lib/formly/field/value/boolean/boolean.field.mjs +47 -0
- package/{esm2020 → esm2022}/lib/formly/field/value/boolean/boolean.field.module.mjs +5 -5
- package/esm2022/lib/formly/field/value/date/date.field.module.mjs +96 -0
- package/esm2022/lib/formly/field/value/date/datetime.field.component.mjs +488 -0
- package/esm2022/lib/formly/field/value/date/datetime.field.mjs +141 -0
- package/{esm2020 → esm2022}/lib/formly/field/value/date/datetime.field.service.mjs +9 -9
- package/esm2022/lib/formly/field/value/date/fixeddaterange.field.component.mjs +506 -0
- package/{esm2020 → esm2022}/lib/formly/field/value/number/number.field.module.mjs +5 -5
- package/esm2022/lib/formly/field/value/phone/phone.field.component.mjs +100 -0
- package/esm2022/lib/formly/field/value/phone/phone.field.module.mjs +66 -0
- package/{esm2020 → esm2022}/lib/formly/field/value/text/text.field.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/formly/field/value/value.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/formly/field/wrapper/autotouch.wrapper.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/formly/field/wrapper/expandable.wrapper.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/formly/field/wrapper/expandable.wrapper.delegate.mjs +4 -4
- package/{esm2020 → esm2022}/lib/formly/field/wrapper/flex.wrapper.component.mjs +6 -6
- package/esm2022/lib/formly/field/wrapper/form.wrapper.module.mjs +86 -0
- package/{esm2020 → esm2022}/lib/formly/field/wrapper/info.wrapper.component.mjs +7 -7
- package/esm2022/lib/formly/field/wrapper/section.wrapper.component.mjs +27 -0
- package/{esm2020 → esm2022}/lib/formly/field/wrapper/style.wrapper.component.mjs +7 -7
- package/esm2022/lib/formly/field/wrapper/subsection.wrapper.component.mjs +27 -0
- package/{esm2020 → esm2022}/lib/formly/field/wrapper/toggle.wrapper.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/formly/field/wrapper/working.wrapper.component.mjs +6 -6
- package/esm2022/lib/formly/field/wrapper/wrapper.mjs +73 -0
- package/{esm2020 → esm2022}/lib/formly/form/form.form.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/formly/form/search.form.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/formly/formly.context.directive.mjs +4 -4
- package/esm2022/lib/formly/formly.context.mjs +100 -0
- package/{esm2020 → esm2022}/lib/formly/formly.directive.mjs +16 -16
- package/{esm2020 → esm2022}/lib/formly/formly.form.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/formly/formly.module.mjs +16 -16
- package/{esm2020 → esm2022}/lib/layout/form.layout.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/layout/form.spacer.component.mjs +6 -6
- package/{esm2020 → esm2022}/mapbox/lib/field/latlng/latlng.field.component.mjs +10 -10
- package/{esm2020 → esm2022}/mapbox/lib/field/latlng/latlng.field.marker.component.mjs +6 -6
- package/esm2022/mapbox/lib/field/latlng/latlng.field.mjs +35 -0
- package/esm2022/mapbox/lib/field/latlng/latlng.module.mjs +59 -0
- package/{mapbox/esm2020 → esm2022/mapbox}/lib/field/zoom/zoom.field.component.mjs +10 -10
- package/esm2022/mapbox/lib/field/zoom/zoom.field.mjs +23 -0
- package/esm2022/mapbox/lib/field/zoom/zoom.module.mjs +57 -0
- package/{mapbox/esm2020 → esm2022/mapbox}/lib/mapbox.module.mjs +5 -5
- package/{fesm2020 → fesm2022}/dereekb-dbx-form-calendar.mjs +188 -228
- package/fesm2022/dereekb-dbx-form-calendar.mjs.map +1 -0
- package/{mapbox/fesm2020 → fesm2022}/dereekb-dbx-form-mapbox.mjs +76 -76
- package/fesm2022/dereekb-dbx-form-mapbox.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/dereekb-dbx-form.mjs +820 -831
- package/fesm2022/dereekb-dbx-form.mjs.map +1 -0
- package/lib/extension/_extension.scss +11 -6
- package/lib/extension/calendar/_calendar.scss +7 -5
- package/lib/form/_form.scss +3 -2
- package/lib/form/action/form.action.directive.d.ts +2 -2
- package/lib/form/action/transition/form.action.transition.safety.directive.d.ts +1 -1
- package/lib/form/form.angular.util.d.ts +1 -1
- package/lib/form/form.d.ts +1 -1
- package/lib/form/io/form.changes.directive.d.ts +1 -1
- package/lib/form/io/form.input.directive.d.ts +2 -2
- package/lib/form/io/form.loading.directive.d.ts +1 -1
- package/lib/formly/_formly.scss +7 -9
- package/lib/formly/field/_field.scss +7 -7
- package/lib/formly/field/checklist/_checklist.scss +3 -2
- package/lib/formly/field/checklist/checklist.field.d.ts +4 -4
- package/lib/formly/field/checklist/checklist.item.d.ts +1 -1
- package/lib/formly/field/checklist/checklist.item.field.component.d.ts +2 -2
- package/lib/formly/field/checklist/checklist.item.field.content.default.component.d.ts +4 -4
- package/lib/formly/field/checklist/checklist.item.field.d.ts +1 -1
- package/lib/formly/field/component/_component.scss +3 -2
- package/lib/formly/field/component/component.field.component.d.ts +2 -2
- package/lib/formly/field/component/component.field.d.ts +1 -1
- package/lib/formly/field/field.d.ts +5 -11
- package/lib/formly/field/selection/_selection.scss +5 -5
- package/lib/formly/field/selection/list/_list.scss +3 -2
- package/lib/formly/field/selection/list/list.field.component.d.ts +1 -1
- package/lib/formly/field/selection/pickable/_pickable.scss +3 -9
- package/lib/formly/field/selection/pickable/pickable.chip.field.component.d.ts +1 -1
- package/lib/formly/field/selection/pickable/pickable.d.ts +6 -22
- package/lib/formly/field/selection/pickable/pickable.field.directive.d.ts +3 -3
- package/lib/formly/field/selection/pickable/pickable.list.field.component.d.ts +4 -4
- package/lib/formly/field/selection/pickable/pickable.util.d.ts +2 -2
- package/lib/formly/field/selection/searchable/_searchable.scss +5 -5
- package/lib/formly/field/selection/searchable/searchable.chip.field.component.d.ts +1 -1
- package/lib/formly/field/selection/searchable/searchable.d.ts +4 -4
- package/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.d.ts +3 -3
- package/lib/formly/field/selection/searchable/searchable.field.d.ts +1 -1
- package/lib/formly/field/selection/searchable/searchable.field.directive.d.ts +1 -1
- package/lib/formly/field/selection/searchable/searchable.text.field.component.d.ts +1 -1
- package/lib/formly/field/selection/selection.d.ts +1 -5
- package/lib/formly/field/selection/selection.field.d.ts +1 -1
- package/lib/formly/field/selection/sourceselect/_sourceselect.scss +6 -15
- package/lib/formly/field/selection/sourceselect/sourceselect.d.ts +6 -6
- package/lib/formly/field/selection/sourceselect/sourceselect.field.component.d.ts +1 -1
- package/lib/formly/field/selection/sourceselect/sourceselect.field.module.d.ts +1 -1
- package/lib/formly/field/texteditor/_texteditor.scss +3 -2
- package/lib/formly/field/texteditor/texteditor.field.component.d.ts +2 -2
- package/lib/formly/field/value/_value.scss +10 -6
- package/lib/formly/field/value/array/_array.scss +7 -2
- package/lib/formly/field/value/array/array.field.component.d.ts +2 -2
- package/lib/formly/field/value/boolean/_boolean.scss +5 -4
- package/lib/formly/field/value/date/_date.scss +20 -37
- package/lib/formly/field/value/date/date.field.module.d.ts +1 -1
- package/lib/formly/field/value/date/datetime.field.component.d.ts +3 -13
- package/lib/formly/field/value/date/datetime.field.d.ts +5 -5
- package/lib/formly/field/value/date/fixeddaterange.field.component.d.ts +7 -7
- package/lib/formly/field/value/hidden.field.d.ts +1 -1
- package/lib/formly/field/value/number/_number.scss +35 -0
- package/lib/formly/field/value/number/number.field.d.ts +3 -3
- package/lib/formly/field/value/phone/_phone.scss +4 -3
- package/lib/formly/field/value/phone/phone.field.component.d.ts +1 -1
- package/lib/formly/field/value/phone/phone.field.module.d.ts +1 -1
- package/lib/formly/field/value/text/_text.scss +3 -2
- package/lib/formly/field/value/text/text.additional.field.d.ts +3 -3
- package/lib/formly/field/value/text/text.field.d.ts +2 -2
- package/lib/formly/field/wrapper/_wrapper.scss +5 -4
- package/lib/formly/field/wrapper/autotouch.wrapper.component.d.ts +1 -1
- package/lib/formly/field/wrapper/expandable.wrapper.component.d.ts +2 -2
- package/lib/formly/field/wrapper/expandable.wrapper.delegate.d.ts +1 -1
- package/lib/formly/field/wrapper/flex.wrapper.component.d.ts +1 -1
- package/lib/formly/field/wrapper/form.wrapper.module.d.ts +1 -1
- package/lib/formly/field/wrapper/info.wrapper.component.d.ts +1 -1
- package/lib/formly/field/wrapper/section.wrapper.component.d.ts +2 -2
- package/lib/formly/field/wrapper/style.wrapper.component.d.ts +2 -2
- package/lib/formly/field/wrapper/subsection.wrapper.component.d.ts +2 -2
- package/lib/formly/field/wrapper/toggle.wrapper.component.d.ts +1 -1
- package/lib/formly/field/wrapper/working.wrapper.component.d.ts +2 -2
- package/lib/formly/field/wrapper/wrapper.d.ts +1 -1
- package/lib/formly/form/_form.scss +17 -4
- package/lib/formly/form/search.form.component.d.ts +1 -1
- package/lib/formly/formly.context.directive.d.ts +1 -1
- package/lib/formly/formly.directive.d.ts +4 -4
- package/lib/formly/formly.form.component.d.ts +1 -1
- package/lib/formly/template/login.d.ts +1 -1
- package/lib/formly/template/timezone.d.ts +1 -1
- package/lib/layout/_layout.scss +3 -2
- package/lib/layout/form.spacer.component.d.ts +1 -1
- package/lib/style/_all-typography.scss +11 -3
- package/lib/style/_core.scss +1 -2
- package/lib/style/_mixin.scss +10 -0
- package/lib/style/_theming.scss +1 -1
- package/lib/validator/available.d.ts +1 -1
- package/mapbox/{esm2020 → esm2022}/lib/field/latlng/latlng.field.component.mjs +10 -10
- package/mapbox/{esm2020 → esm2022}/lib/field/latlng/latlng.field.marker.component.mjs +6 -6
- package/mapbox/esm2022/lib/field/latlng/latlng.field.mjs +35 -0
- package/mapbox/esm2022/lib/field/latlng/latlng.module.mjs +59 -0
- package/{esm2020/mapbox → mapbox/esm2022}/lib/field/zoom/zoom.field.component.mjs +10 -10
- package/mapbox/esm2022/lib/field/zoom/zoom.field.mjs +23 -0
- package/mapbox/esm2022/lib/field/zoom/zoom.module.mjs +57 -0
- package/{esm2020/mapbox → mapbox/esm2022}/lib/mapbox.module.mjs +5 -5
- package/{fesm2020 → mapbox/fesm2022}/dereekb-dbx-form-mapbox.mjs +76 -76
- package/mapbox/fesm2022/dereekb-dbx-form-mapbox.mjs.map +1 -0
- package/mapbox/lib/field/latlng/latlng.field.component.d.ts +1 -1
- package/mapbox/lib/field/latlng/latlng.field.marker.component.d.ts +1 -1
- package/mapbox/lib/field/zoom/zoom.field.component.d.ts +1 -1
- package/mapbox/package.json +10 -28
- package/package.json +31 -31
- package/esm2020/calendar/lib/calendar.module.mjs +0 -155
- package/esm2020/calendar/lib/calendar.schedule.selection.dialog.button.component.mjs +0 -38
- package/esm2020/calendar/lib/calendar.schedule.selection.dialog.component.mjs +0 -65
- package/esm2020/calendar/lib/calendar.schedule.selection.popover.component.mjs +0 -37
- package/esm2020/calendar/lib/calendar.schedule.selection.range.component.mjs +0 -188
- package/esm2020/calendar/lib/calendar.schedule.selection.store.mjs +0 -814
- package/esm2020/calendar/lib/field/schedule/calendar.schedule.field.component.mjs +0 -158
- package/esm2020/calendar/lib/field/schedule/calendar.schedule.field.mjs +0 -29
- package/esm2020/calendar/lib/field/schedule/calendar.schedule.module.mjs +0 -58
- package/esm2020/lib/formly/field/checklist/checklist.item.field.module.mjs +0 -67
- package/esm2020/lib/formly/field/component/component.field.module.mjs +0 -32
- package/esm2020/lib/formly/field/field.mjs +0 -103
- package/esm2020/lib/formly/field/selection/list/list.field.module.mjs +0 -76
- package/esm2020/lib/formly/field/selection/pickable/pickable.chip.field.component.mjs +0 -33
- package/esm2020/lib/formly/field/selection/pickable/pickable.field.module.mjs +0 -93
- package/esm2020/lib/formly/field/selection/pickable/pickable.list.field.component.mjs +0 -116
- package/esm2020/lib/formly/field/selection/searchable/searchable.chip.field.component.mjs +0 -68
- package/esm2020/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.mjs +0 -95
- package/esm2020/lib/formly/field/selection/searchable/searchable.field.directive.mjs +0 -278
- package/esm2020/lib/formly/field/selection/searchable/searchable.field.module.mjs +0 -91
- package/esm2020/lib/formly/field/selection/selection.field.mjs +0 -39
- package/esm2020/lib/formly/field/selection/sourceselect/sourceselect.field.module.mjs +0 -93
- package/esm2020/lib/formly/field/texteditor/texteditor.field.module.mjs +0 -51
- package/esm2020/lib/formly/field/value/array/array.field.module.mjs +0 -62
- package/esm2020/lib/formly/field/value/boolean/boolean.field.mjs +0 -47
- package/esm2020/lib/formly/field/value/date/date.field.module.mjs +0 -96
- package/esm2020/lib/formly/field/value/date/datetime.field.component.mjs +0 -488
- package/esm2020/lib/formly/field/value/date/datetime.field.mjs +0 -143
- package/esm2020/lib/formly/field/value/date/fixeddaterange.field.component.mjs +0 -506
- package/esm2020/lib/formly/field/value/phone/phone.field.component.mjs +0 -100
- package/esm2020/lib/formly/field/value/phone/phone.field.module.mjs +0 -66
- package/esm2020/lib/formly/field/wrapper/form.wrapper.module.mjs +0 -86
- package/esm2020/lib/formly/field/wrapper/section.wrapper.component.mjs +0 -26
- package/esm2020/lib/formly/field/wrapper/subsection.wrapper.component.mjs +0 -26
- package/esm2020/lib/formly/field/wrapper/wrapper.mjs +0 -78
- package/esm2020/lib/formly/formly.context.mjs +0 -100
- package/esm2020/mapbox/lib/field/latlng/latlng.field.mjs +0 -35
- package/esm2020/mapbox/lib/field/latlng/latlng.module.mjs +0 -59
- package/esm2020/mapbox/lib/field/zoom/zoom.field.mjs +0 -23
- package/esm2020/mapbox/lib/field/zoom/zoom.module.mjs +0 -57
- package/fesm2015/dereekb-dbx-form-calendar.mjs +0 -1955
- package/fesm2015/dereekb-dbx-form-calendar.mjs.map +0 -1
- package/fesm2015/dereekb-dbx-form-mapbox.mjs +0 -585
- package/fesm2015/dereekb-dbx-form-mapbox.mjs.map +0 -1
- package/fesm2015/dereekb-dbx-form.mjs +0 -6205
- package/fesm2015/dereekb-dbx-form.mjs.map +0 -1
- package/fesm2020/dereekb-dbx-form-calendar.mjs.map +0 -1
- package/fesm2020/dereekb-dbx-form-mapbox.mjs.map +0 -1
- package/fesm2020/dereekb-dbx-form.mjs.map +0 -1
- package/mapbox/esm2020/lib/field/latlng/latlng.field.mjs +0 -35
- package/mapbox/esm2020/lib/field/latlng/latlng.module.mjs +0 -59
- package/mapbox/esm2020/lib/field/zoom/zoom.field.mjs +0 -23
- package/mapbox/esm2020/lib/field/zoom/zoom.module.mjs +0 -57
- package/mapbox/fesm2015/dereekb-dbx-form-mapbox.mjs +0 -585
- package/mapbox/fesm2015/dereekb-dbx-form-mapbox.mjs.map +0 -1
- package/mapbox/fesm2020/dereekb-dbx-form-mapbox.mjs.map +0 -1
- /package/{esm2020 → esm2022}/calendar/dereekb-dbx-form-calendar.mjs +0 -0
- /package/{esm2020 → esm2022}/calendar/index.mjs +0 -0
- /package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.form.mjs +0 -0
- /package/{esm2020 → esm2022}/calendar/lib/field/index.mjs +0 -0
- /package/{esm2020 → esm2022}/calendar/lib/field/schedule/index.mjs +0 -0
- /package/{esm2020 → esm2022}/calendar/lib/index.mjs +0 -0
- /package/{esm2020 → esm2022}/dereekb-dbx-form.mjs +0 -0
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/form/action/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/form/action/transition/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/form/form.angular.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/form/form.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/form/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/form/io/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/config/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/config/validation.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/checklist/checklist.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/checklist/checklist.item.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/checklist/checklist.item.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/checklist/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/component/component.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/component/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/list/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/list/list.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/pickable/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/pickable/pickable.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/pickable/pickable.util.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/searchable/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/searchable/searchable.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/searchable/searchable.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/searchable/text.chip.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/sourceselect/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/sourceselect/sourceselect.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/selection/sourceselect/sourceselect.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/texteditor/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/texteditor/texteditor.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/array/array.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/array/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/boolean/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/date/date.value.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/date/datetime.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/date/datetime.preset.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/date/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/hidden.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/number/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/number/number.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/phone/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/phone/phone.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/text/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/text/text.additional.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/text/text.address.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/value/text/text.field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/field/wrapper/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/form/form.form.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/form/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/template/available.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/template/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/template/login.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/formly/template/timezone.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/layout/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/validator/available.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/validator/boolean.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/validator/email.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/validator/field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/validator/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/validator/number.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/validator/phone.mjs +0 -0
- /package/{esm2020 → esm2022}/mapbox/dereekb-dbx-form-mapbox.mjs +0 -0
- /package/{esm2020 → esm2022}/mapbox/index.mjs +0 -0
- /package/{esm2020 → esm2022}/mapbox/lib/field/index.mjs +0 -0
- /package/{esm2020 → esm2022}/mapbox/lib/field/latlng/index.mjs +0 -0
- /package/{esm2020 → esm2022}/mapbox/lib/field/zoom/index.mjs +0 -0
- /package/mapbox/{esm2020 → esm2022}/dereekb-dbx-form-mapbox.mjs +0 -0
- /package/mapbox/{esm2020 → esm2022}/index.mjs +0 -0
- /package/mapbox/{esm2020 → esm2022}/lib/field/index.mjs +0 -0
- /package/mapbox/{esm2020 → esm2022}/lib/field/latlng/index.mjs +0 -0
- /package/mapbox/{esm2020 → esm2022}/lib/field/zoom/index.mjs +0 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { asArray, filterMaybeValues, isISO8601DayStringStart, mapIdentityFunction } from '@dereekb/util';
|
|
2
|
+
import { dateFromLogicalDate, DateTimeMinuteInstance, guessCurrentTimezone, readableTimeStringToDate, toLocalReadableTimeString, utcDayForDate, safeToJsDate, findMinDate, findMaxDate, dateTimeMinuteDecisionFunction, isSameDateHoursAndMinutes, getTimezoneAbbreviation, isSameDateDay, dateTimezoneUtcNormal, toJsDayDate, isSameDate } from '@dereekb/date';
|
|
3
|
+
import { switchMap, shareReplay, map, startWith, tap, first, distinctUntilChanged, debounceTime, throttleTime, BehaviorSubject, combineLatest, Subject, merge, interval, of, combineLatestWith, filter } from 'rxjs';
|
|
4
|
+
import { ChangeDetectorRef, Component } from '@angular/core';
|
|
5
|
+
import { FormControl, Validators } from '@angular/forms';
|
|
6
|
+
import { FieldType } from '@ngx-formly/material';
|
|
7
|
+
import { addMinutes, startOfDay, addDays } from 'date-fns';
|
|
8
|
+
import { asObservableFromGetter, filterMaybe, skipFirstMaybe, SubscriptionObject, switchMapMaybeDefault, switchMapMaybeObs } from '@dereekb/rxjs';
|
|
9
|
+
import { dateTimePreset } from './datetime';
|
|
10
|
+
import { DbxDateTimeFieldMenuPresetsService } from './datetime.field.service';
|
|
11
|
+
import { DbxDateTimeValueMode, dbxDateTimeInputValueParseFactory, dbxDateTimeIsSameDateTimeFieldValue, dbxDateTimeOutputValueFactory } from './date.value';
|
|
12
|
+
import { streamValueFromControl } from '../../../../form/form.angular.util';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "./datetime.field.service";
|
|
15
|
+
import * as i2 from "@angular/common";
|
|
16
|
+
import * as i3 from "@angular/forms";
|
|
17
|
+
import * as i4 from "@angular/material/input";
|
|
18
|
+
import * as i5 from "@angular/material/form-field";
|
|
19
|
+
import * as i6 from "@angular/material/divider";
|
|
20
|
+
import * as i7 from "@dereekb/dbx-web";
|
|
21
|
+
import * as i8 from "@angular/material/button";
|
|
22
|
+
import * as i9 from "@angular/material/datepicker";
|
|
23
|
+
import * as i10 from "@angular/material/menu";
|
|
24
|
+
import * as i11 from "@angular/material/icon";
|
|
25
|
+
import * as i12 from "@ngbracket/ngx-layout/flex";
|
|
26
|
+
import * as i13 from "@ngbracket/ngx-layout/extended";
|
|
27
|
+
import * as i14 from "@dereekb/dbx-core";
|
|
28
|
+
export var DbxDateTimeFieldTimeMode;
|
|
29
|
+
(function (DbxDateTimeFieldTimeMode) {
|
|
30
|
+
/**
|
|
31
|
+
* Time is required.
|
|
32
|
+
*/
|
|
33
|
+
DbxDateTimeFieldTimeMode["REQUIRED"] = "required";
|
|
34
|
+
/**
|
|
35
|
+
* Time is optional.
|
|
36
|
+
*/
|
|
37
|
+
DbxDateTimeFieldTimeMode["OPTIONAL"] = "optional";
|
|
38
|
+
/**
|
|
39
|
+
* Time is permenantly off.
|
|
40
|
+
*/
|
|
41
|
+
DbxDateTimeFieldTimeMode["NONE"] = "none";
|
|
42
|
+
})(DbxDateTimeFieldTimeMode || (DbxDateTimeFieldTimeMode = {}));
|
|
43
|
+
export function isDbxDateTimeFieldTimeDateConfig(input) {
|
|
44
|
+
return input != null && typeof input === 'object' && typeof input.path === 'string';
|
|
45
|
+
}
|
|
46
|
+
export function syncConfigValueObs(parseConfigsObs, type) {
|
|
47
|
+
return parseConfigsObs.pipe(switchMap((x) => {
|
|
48
|
+
const config = x.find((y) => y.syncType === type);
|
|
49
|
+
let result;
|
|
50
|
+
if (config) {
|
|
51
|
+
const { control } = config;
|
|
52
|
+
result = control.valueChanges.pipe(startWith(control.value), map((x) => safeToJsDate(x) ?? null));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
result = of(null);
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}), distinctUntilChanged(), shareReplay(1));
|
|
59
|
+
}
|
|
60
|
+
const TIME_OUTPUT_THROTTLE_TIME = 10;
|
|
61
|
+
export class DbxDateTimeFieldComponent extends FieldType {
|
|
62
|
+
get dateLabel() {
|
|
63
|
+
return this.props.dateLabel ?? 'Date';
|
|
64
|
+
}
|
|
65
|
+
get timeLabel() {
|
|
66
|
+
return this.props.timeLabel ?? 'Time';
|
|
67
|
+
}
|
|
68
|
+
get allDayLabel() {
|
|
69
|
+
return this.props.allDayLabel ?? 'All Day';
|
|
70
|
+
}
|
|
71
|
+
get atTimeLabel() {
|
|
72
|
+
return this.props.atTimeLabel ?? 'At';
|
|
73
|
+
}
|
|
74
|
+
get dateOnly() {
|
|
75
|
+
return this.timeMode === DbxDateTimeFieldTimeMode.NONE;
|
|
76
|
+
}
|
|
77
|
+
get dateTimeField() {
|
|
78
|
+
return this.field.props;
|
|
79
|
+
}
|
|
80
|
+
get timeOnly() {
|
|
81
|
+
return this.dateTimeField.timeOnly;
|
|
82
|
+
}
|
|
83
|
+
get showDateInput() {
|
|
84
|
+
return !this.timeOnly;
|
|
85
|
+
}
|
|
86
|
+
get valueMode() {
|
|
87
|
+
return this.field.props.valueMode ?? DbxDateTimeValueMode.DATE;
|
|
88
|
+
}
|
|
89
|
+
get timeMode() {
|
|
90
|
+
const dateValuesOnly = this.valueMode === DbxDateTimeValueMode.DAY_STRING;
|
|
91
|
+
if (dateValuesOnly) {
|
|
92
|
+
return DbxDateTimeFieldTimeMode.NONE;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
return this.timeOnly ? DbxDateTimeFieldTimeMode.REQUIRED : this.dateTimeField.timeMode ?? DbxDateTimeFieldTimeMode.REQUIRED;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
get description() {
|
|
99
|
+
return this.field.props.description;
|
|
100
|
+
}
|
|
101
|
+
get hideDateHint() {
|
|
102
|
+
return this.field.props.hideDateHint ?? false;
|
|
103
|
+
}
|
|
104
|
+
get hideDatePicker() {
|
|
105
|
+
return this.field.props.hideDatePicker ?? false;
|
|
106
|
+
}
|
|
107
|
+
get timezone() {
|
|
108
|
+
return this.field.props.timezone;
|
|
109
|
+
}
|
|
110
|
+
get timeDate() {
|
|
111
|
+
return this.field.props.timeDate;
|
|
112
|
+
}
|
|
113
|
+
get showTimezone() {
|
|
114
|
+
return this.field.props.showTimezone ?? true;
|
|
115
|
+
}
|
|
116
|
+
get presets() {
|
|
117
|
+
return this.field.props.presets;
|
|
118
|
+
}
|
|
119
|
+
constructor(cdRef, dbxDateTimeFieldConfigService) {
|
|
120
|
+
super();
|
|
121
|
+
this.cdRef = cdRef;
|
|
122
|
+
this.dbxDateTimeFieldConfigService = dbxDateTimeFieldConfigService;
|
|
123
|
+
this._sub = new SubscriptionObject();
|
|
124
|
+
this._valueSub = new SubscriptionObject();
|
|
125
|
+
this._config = new BehaviorSubject(undefined);
|
|
126
|
+
this._syncConfigObs = new BehaviorSubject(undefined);
|
|
127
|
+
this._defaultTimezone = new BehaviorSubject(undefined);
|
|
128
|
+
this._timeDate = new BehaviorSubject(undefined);
|
|
129
|
+
this._presets = new BehaviorSubject(of([]));
|
|
130
|
+
this._fullDayControlObs = new BehaviorSubject(undefined);
|
|
131
|
+
this.fullDayControl$ = this._fullDayControlObs.pipe(filterMaybe());
|
|
132
|
+
this._offset = new BehaviorSubject(0);
|
|
133
|
+
this._formControlObs = new BehaviorSubject(undefined);
|
|
134
|
+
this.formControl$ = this._formControlObs.pipe(filterMaybe());
|
|
135
|
+
this._updateTime = new Subject();
|
|
136
|
+
this.timezone$ = this._defaultTimezone.pipe(switchMapMaybeDefault(), distinctUntilChanged()).pipe(map((defaultTimezone) => {
|
|
137
|
+
return defaultTimezone ?? guessCurrentTimezone();
|
|
138
|
+
}), distinctUntilChanged(), shareReplay(1));
|
|
139
|
+
this.timezoneInstance$ = this.timezone$.pipe(map((timezone) => (timezone ? dateTimezoneUtcNormal({ timezone }) : undefined)), shareReplay(1));
|
|
140
|
+
this.timeDate$ = this._timeDate.pipe(switchMapMaybeDefault(), switchMap((x) => {
|
|
141
|
+
let obs;
|
|
142
|
+
if (x) {
|
|
143
|
+
// if the string is not a date string, then treat it as a path
|
|
144
|
+
if ((typeof x === 'string' && !isISO8601DayStringStart(x)) || isDbxDateTimeFieldTimeDateConfig(x)) {
|
|
145
|
+
const { path, mapValue } = typeof x === 'string' ? { path: x } : x;
|
|
146
|
+
obs =
|
|
147
|
+
streamValueFromControl(this.form, path)?.pipe(map(mapValue ?? mapIdentityFunction()), map((x) => (x ? toJsDayDate(x) : undefined))) ?? of(undefined);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
obs = of(toJsDayDate(x));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
obs = of(undefined);
|
|
155
|
+
}
|
|
156
|
+
return obs;
|
|
157
|
+
}), distinctUntilChanged(isSameDateDay), shareReplay(1));
|
|
158
|
+
this.valueInSystemTimezone$ = this.formControl$.pipe(map((control) => control.valueChanges.pipe(startWith(control.value), shareReplay(1))), combineLatestWith(this.timezoneInstance$), switchMap(([x, timezoneInstance]) => {
|
|
159
|
+
return x.pipe(map(dbxDateTimeInputValueParseFactory(this.valueMode, timezoneInstance)));
|
|
160
|
+
}), throttleTime(20, undefined, { leading: false, trailing: true }), // throttle incoming values and timezone changes
|
|
161
|
+
distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
|
|
162
|
+
/**
|
|
163
|
+
* Used to trigger/display visual updates (specifically on timeDistance, etc.).
|
|
164
|
+
*/
|
|
165
|
+
this.displayValue$ = interval(10 * 1000).pipe(startWith(0), map(() => new Date().getMinutes()), distinctUntilChanged(), tap(() => this.cdRef.markForCheck()), switchMap(() => this.valueInSystemTimezone$), shareReplay(1));
|
|
166
|
+
this.timeString$ = this.valueInSystemTimezone$.pipe(map((x) => (x ? toLocalReadableTimeString(x) : '')), distinctUntilChanged(), shareReplay(1));
|
|
167
|
+
this.dateInputCtrl = new FormControl(new Date(), {
|
|
168
|
+
validators: []
|
|
169
|
+
});
|
|
170
|
+
this.timeInputCtrl = new FormControl('', {
|
|
171
|
+
validators: [Validators.pattern(/^(now)$|^([0-9]|(0[0-9])|(1[0-9])|(2[0-3]))(:)?([0-5][0-9])?(\s)?([apAP][Mm])?(\\s)*$/)]
|
|
172
|
+
});
|
|
173
|
+
this.fullDay$ = this.fullDayControl$.pipe(switchMap((control) => control.valueChanges.pipe(startWith(control.value))), distinctUntilChanged(), shareReplay(1));
|
|
174
|
+
this.showTimeInput$ = this.fullDay$.pipe(map((x) => !x && this.timeMode !== DbxDateTimeFieldTimeMode.NONE));
|
|
175
|
+
this.showAddTime$ = this.showTimeInput$.pipe(map((x) => !x && this.timeMode === DbxDateTimeFieldTimeMode.OPTIONAL), shareReplay(1));
|
|
176
|
+
this.date$ = this.dateInputCtrl.valueChanges.pipe(startWith(this.dateInputCtrl.value), filterMaybe(), shareReplay(1));
|
|
177
|
+
this.timezoneAbbreviation$ = combineLatest([this.date$, this.timezone$, this.timeDate$]).pipe(map(([date, timezone, timeDate]) => getTimezoneAbbreviation(timezone, timeDate ?? date)), distinctUntilChanged(), shareReplay(1));
|
|
178
|
+
this.dateValue$ = merge(this.date$, this.valueInSystemTimezone$.pipe(skipFirstMaybe())).pipe(map((x) => (x ? startOfDay(x) : null)), distinctUntilChanged(isSameDateDay), shareReplay(1));
|
|
179
|
+
this.timeInput$ = this._updateTime.pipe(debounceTime(5), map(() => this.timeInputCtrl.value || ''), distinctUntilChanged());
|
|
180
|
+
this.syncConfigObs$ = this._syncConfigObs.pipe(switchMapMaybeDefault(), shareReplay(1));
|
|
181
|
+
this.parsedSyncConfigs$ = this.syncConfigObs$.pipe(map((x) => {
|
|
182
|
+
let parsed;
|
|
183
|
+
if (x) {
|
|
184
|
+
parsed = filterMaybeValues(asArray(x).map((y) => {
|
|
185
|
+
const control = this.form.get(y.syncWith);
|
|
186
|
+
if (control) {
|
|
187
|
+
return {
|
|
188
|
+
control,
|
|
189
|
+
...y
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
}));
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
parsed = [];
|
|
199
|
+
}
|
|
200
|
+
return parsed;
|
|
201
|
+
}), shareReplay(1));
|
|
202
|
+
this.syncConfigBeforeValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'before');
|
|
203
|
+
this.syncConfigAfterValue$ = syncConfigValueObs(this.parsedSyncConfigs$, 'after');
|
|
204
|
+
// TODO: Get min/max using the DateTimePickerConfiguration too
|
|
205
|
+
this.dateInputMin$ = this.syncConfigBeforeValue$;
|
|
206
|
+
this.dateInputMax$ = this.syncConfigAfterValue$;
|
|
207
|
+
this.rawDateTime$ = combineLatest([this.dateValue$, this.timeInput$.pipe(startWith(null)), this.fullDay$, this.timeDate$]).pipe(map(([date, timeString, fullDay, timeDate]) => {
|
|
208
|
+
let result;
|
|
209
|
+
if (!date || this.timeOnly) {
|
|
210
|
+
date = timeDate ?? new Date(); // use the time date, or default to the current day
|
|
211
|
+
}
|
|
212
|
+
if (date) {
|
|
213
|
+
if (fullDay) {
|
|
214
|
+
if (this.dateTimeField.fullDayInUTC) {
|
|
215
|
+
result = utcDayForDate(date);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
result = startOfDay(date);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else if (timeString) {
|
|
222
|
+
result =
|
|
223
|
+
readableTimeStringToDate(timeString, {
|
|
224
|
+
date,
|
|
225
|
+
useSystemTimezone: true
|
|
226
|
+
}) ?? date;
|
|
227
|
+
}
|
|
228
|
+
else if (!this.timeOnly) {
|
|
229
|
+
result = date;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
}), distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
|
|
234
|
+
this.config$ = combineLatest([this._config.pipe(switchMapMaybeDefault()), this.dateInputMin$, this.dateInputMax$]).pipe(map(([x, dateInputMin, dateInputMax]) => {
|
|
235
|
+
let result = x;
|
|
236
|
+
if (dateInputMin != null || dateInputMax != null) {
|
|
237
|
+
const { min: limitMin, max: limitMax } = x?.limits ?? {};
|
|
238
|
+
const min = findMinDate([dateInputMin, dateFromLogicalDate(limitMin)]);
|
|
239
|
+
const max = findMaxDate([dateInputMax, dateFromLogicalDate(limitMax)]);
|
|
240
|
+
result = {
|
|
241
|
+
...x,
|
|
242
|
+
limits: {
|
|
243
|
+
...x?.limits,
|
|
244
|
+
min,
|
|
245
|
+
max
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
return result;
|
|
250
|
+
}), distinctUntilChanged(), shareReplay(1));
|
|
251
|
+
this.pickerFilter$ = this.config$.pipe(distinctUntilChanged(), map((x) => {
|
|
252
|
+
if (x) {
|
|
253
|
+
const filter = dateTimeMinuteDecisionFunction(x);
|
|
254
|
+
return (x) => (x != null ? filter(x) : true);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
return () => true;
|
|
258
|
+
}
|
|
259
|
+
}), shareReplay(1));
|
|
260
|
+
this.defaultPickerFilter = () => true;
|
|
261
|
+
this.timeOutput$ = combineLatest([this.rawDateTime$, this._offset, this.config$]).pipe(throttleTime(TIME_OUTPUT_THROTTLE_TIME, undefined, { leading: false, trailing: true }), distinctUntilChanged((current, next) => current[0] === next[0] && next[1] === 0), tap(([, stepsOffset]) => (stepsOffset ? this._offset.next(0) : 0)), map(([date, stepsOffset, config]) => {
|
|
262
|
+
if (date != null) {
|
|
263
|
+
const instance = new DateTimeMinuteInstance({
|
|
264
|
+
date,
|
|
265
|
+
...config,
|
|
266
|
+
roundDownToMinute: true
|
|
267
|
+
});
|
|
268
|
+
date = instance.clamp(date);
|
|
269
|
+
const minutes = stepsOffset * 5;
|
|
270
|
+
date = addMinutes(date, minutes);
|
|
271
|
+
}
|
|
272
|
+
return date;
|
|
273
|
+
}), distinctUntilChanged(isSameDateHoursAndMinutes), shareReplay(1));
|
|
274
|
+
this.presets$ = this._presets.pipe(switchMapMaybeObs(), map((x) => x.map(dateTimePreset)), shareReplay(1));
|
|
275
|
+
}
|
|
276
|
+
ngOnInit() {
|
|
277
|
+
this._formControlObs.next(this.formControl);
|
|
278
|
+
const inputPickerConfig = this.dateTimeField.pickerConfig;
|
|
279
|
+
this._config.next(inputPickerConfig ? asObservableFromGetter(inputPickerConfig) : undefined);
|
|
280
|
+
this._syncConfigObs.next(this.dateTimeField.getSyncFieldsObs?.());
|
|
281
|
+
this._sub.subscription = this.valueInSystemTimezone$
|
|
282
|
+
.pipe(combineLatestWith(this.timezoneInstance$.pipe(map((timezoneInstance) => dbxDateTimeOutputValueFactory(this.valueMode, timezoneInstance)))), throttleTime(TIME_OUTPUT_THROTTLE_TIME, undefined, { leading: false, trailing: true }), switchMap(([currentValue, valueFactory]) => {
|
|
283
|
+
return this.timeOutput$.pipe(throttleTime(TIME_OUTPUT_THROTTLE_TIME * 2, undefined, { leading: false, trailing: true }), skipFirstMaybe(), distinctUntilChanged(isSameDateHoursAndMinutes), map((x) => valueFactory(x)), filter((x) => !dbxDateTimeIsSameDateTimeFieldValue(x, currentValue)));
|
|
284
|
+
}))
|
|
285
|
+
.subscribe((value) => {
|
|
286
|
+
this.formControl.setValue(value);
|
|
287
|
+
this.formControl.markAsDirty();
|
|
288
|
+
this.formControl.markAsTouched();
|
|
289
|
+
});
|
|
290
|
+
let hasSetMidnightFromInput = false;
|
|
291
|
+
/*
|
|
292
|
+
this._valueSub.subscription = this.timeString$.subscribe((x) => {
|
|
293
|
+
this.setTime(x);
|
|
294
|
+
});
|
|
295
|
+
*/
|
|
296
|
+
this._valueSub.subscription = this.valueInSystemTimezone$
|
|
297
|
+
.pipe(map((x) => (x ? isSameDate(x, startOfDay(x)) : false)), distinctUntilChanged(), switchMap((isInputValueAtMidnight) => {
|
|
298
|
+
hasSetMidnightFromInput = false;
|
|
299
|
+
return this.timeString$.pipe(
|
|
300
|
+
// skip(1),
|
|
301
|
+
map((timeString) => [timeString, isInputValueAtMidnight]));
|
|
302
|
+
}))
|
|
303
|
+
.subscribe(([x, isInputValueAtMidnight]) => {
|
|
304
|
+
// Skip events where the timeInput value is cleared, unless the input value is at midnight and we've already processed it being at midnight
|
|
305
|
+
if (!this.timeInputCtrl.value && x === '12:00AM' && (!isInputValueAtMidnight || (isInputValueAtMidnight && hasSetMidnightFromInput))) {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
// update the has set flag
|
|
309
|
+
if (x === '12:00AM' && isInputValueAtMidnight) {
|
|
310
|
+
hasSetMidnightFromInput = true;
|
|
311
|
+
}
|
|
312
|
+
this.setTime(x);
|
|
313
|
+
});
|
|
314
|
+
// Set default timezone if provided.
|
|
315
|
+
if (this.timezone && !this.dateTimeField.fullDayInUTC) {
|
|
316
|
+
this._defaultTimezone.next(asObservableFromGetter(this.timezone));
|
|
317
|
+
}
|
|
318
|
+
this._timeDate.next(asObservableFromGetter(this.timeDate));
|
|
319
|
+
// Watch for disabled changes so we can propogate them properly.
|
|
320
|
+
this.formControl.registerOnDisabledChange((disabled) => {
|
|
321
|
+
if (disabled) {
|
|
322
|
+
this.dateInputCtrl.disable({ emitEvent: false });
|
|
323
|
+
this.timeInputCtrl.disable({ emitEvent: false });
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
this.dateInputCtrl.enable({ emitEvent: false });
|
|
327
|
+
this.timeInputCtrl.enable({ emitEvent: false });
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
const isFullDayField = this.dateTimeField.fullDayFieldName;
|
|
331
|
+
let fullDayFieldCtrl;
|
|
332
|
+
if (isFullDayField) {
|
|
333
|
+
fullDayFieldCtrl = this.form.get(isFullDayField);
|
|
334
|
+
}
|
|
335
|
+
if (!fullDayFieldCtrl) {
|
|
336
|
+
const isFullDay = this.timeMode === DbxDateTimeFieldTimeMode.NONE;
|
|
337
|
+
this._fullDayInputCtrl = new FormControl(isFullDay);
|
|
338
|
+
// Set the control in the form too if the name is defined.
|
|
339
|
+
if (isFullDayField) {
|
|
340
|
+
this.form.addControl(isFullDayField, this._fullDayInputCtrl);
|
|
341
|
+
}
|
|
342
|
+
fullDayFieldCtrl = this._fullDayInputCtrl;
|
|
343
|
+
}
|
|
344
|
+
this._fullDayControlObs.next(fullDayFieldCtrl);
|
|
345
|
+
switch (this.timeMode) {
|
|
346
|
+
case DbxDateTimeFieldTimeMode.OPTIONAL:
|
|
347
|
+
break;
|
|
348
|
+
case DbxDateTimeFieldTimeMode.NONE:
|
|
349
|
+
this.removeTime();
|
|
350
|
+
break;
|
|
351
|
+
case DbxDateTimeFieldTimeMode.REQUIRED:
|
|
352
|
+
this.addTime();
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
if (this.presets != null) {
|
|
356
|
+
this._presets.next(asObservableFromGetter(this.presets));
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
this._presets.next(this.dbxDateTimeFieldConfigService.configurations$);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
ngOnDestroy() {
|
|
363
|
+
super.ngOnDestroy();
|
|
364
|
+
this._sub.destroy();
|
|
365
|
+
this._valueSub.destroy();
|
|
366
|
+
this._config.complete();
|
|
367
|
+
this._defaultTimezone.complete();
|
|
368
|
+
this._timeDate.complete();
|
|
369
|
+
this._presets.complete();
|
|
370
|
+
this._fullDayControlObs.complete();
|
|
371
|
+
this._offset.complete();
|
|
372
|
+
this._formControlObs.complete();
|
|
373
|
+
this._updateTime.complete();
|
|
374
|
+
this._syncConfigObs.complete();
|
|
375
|
+
}
|
|
376
|
+
selectPreset(preset) {
|
|
377
|
+
const value = preset.value();
|
|
378
|
+
if (value.logicalDate) {
|
|
379
|
+
this.setLogicalTime(value.logicalDate);
|
|
380
|
+
}
|
|
381
|
+
else if (value.timeString) {
|
|
382
|
+
this.setTime(value.timeString);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
datePicked(event) {
|
|
386
|
+
const date = event.value;
|
|
387
|
+
if (date) {
|
|
388
|
+
this.setDateInputValue(date);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
setLogicalTime(time) {
|
|
392
|
+
const date = dateFromLogicalDate(time);
|
|
393
|
+
if (date) {
|
|
394
|
+
this.setTimeFromDate(date);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
setDateInputValue(date) {
|
|
398
|
+
this.dateInputCtrl.setValue(date);
|
|
399
|
+
this._updateTime.next();
|
|
400
|
+
}
|
|
401
|
+
setTimeFromDate(timeDate) {
|
|
402
|
+
const timeString = toLocalReadableTimeString(timeDate);
|
|
403
|
+
this.setTime(timeString);
|
|
404
|
+
}
|
|
405
|
+
setTime(time) {
|
|
406
|
+
if (this.timeInputCtrl.value !== time) {
|
|
407
|
+
this.timeInputCtrl.setValue(time);
|
|
408
|
+
this._offset.next(0);
|
|
409
|
+
this._updateTime.next();
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
keydownOnDateInput(event) {
|
|
413
|
+
let direction = 0;
|
|
414
|
+
switch (event.key?.toLowerCase()) {
|
|
415
|
+
case 'arrowup':
|
|
416
|
+
direction = 1;
|
|
417
|
+
break;
|
|
418
|
+
case 'arrowdown':
|
|
419
|
+
direction = -1;
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
let offset = 1;
|
|
423
|
+
if (event.ctrlKey && event.shiftKey) {
|
|
424
|
+
offset = 365;
|
|
425
|
+
}
|
|
426
|
+
else if (event.ctrlKey) {
|
|
427
|
+
offset = 30;
|
|
428
|
+
}
|
|
429
|
+
else if (event.shiftKey) {
|
|
430
|
+
offset = 7;
|
|
431
|
+
}
|
|
432
|
+
if (direction !== 0) {
|
|
433
|
+
this.date$.pipe(first()).subscribe((date) => {
|
|
434
|
+
const newDate = addDays(date, offset * direction);
|
|
435
|
+
this.setDateInputValue(newDate);
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
keydownOnTimeInput(event) {
|
|
440
|
+
let direction = 0;
|
|
441
|
+
switch (event.key?.toLowerCase()) {
|
|
442
|
+
case 'arrowup':
|
|
443
|
+
direction = 1;
|
|
444
|
+
break;
|
|
445
|
+
case 'arrowdown':
|
|
446
|
+
direction = -1;
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
let offset = 1;
|
|
450
|
+
if (event.altKey && event.shiftKey) {
|
|
451
|
+
offset = 300;
|
|
452
|
+
}
|
|
453
|
+
else if (event.altKey) {
|
|
454
|
+
offset = 60;
|
|
455
|
+
}
|
|
456
|
+
else if (event.shiftKey) {
|
|
457
|
+
offset = 5;
|
|
458
|
+
}
|
|
459
|
+
if (direction !== 0) {
|
|
460
|
+
this._offset.next(this._offset.value + offset * direction);
|
|
461
|
+
this._updateTime.next();
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
focusTime() {
|
|
465
|
+
// do nothing
|
|
466
|
+
}
|
|
467
|
+
focusOutTime() {
|
|
468
|
+
this._updateTime.next();
|
|
469
|
+
}
|
|
470
|
+
addTime() {
|
|
471
|
+
this.setFullDay(false);
|
|
472
|
+
}
|
|
473
|
+
removeTime() {
|
|
474
|
+
this.setFullDay(true);
|
|
475
|
+
}
|
|
476
|
+
setFullDay(fullDay) {
|
|
477
|
+
this.fullDayControl$.pipe(first()).subscribe((x) => {
|
|
478
|
+
x.setValue(fullDay);
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxDateTimeFieldComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DbxDateTimeFieldMenuPresetsService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
482
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DbxDateTimeFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n <!-- Additional spacing -->\n <dbx-button-spacer *ngIf=\"!dateOnly\"></dbx-button-spacer>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"showDateInput ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\" [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"mat-datepicker-button-highlight dbx-button-spacer\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput matInput [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"mat-datepicker-button-highlight dbx-button-spacer\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i7.DbxButtonSpacerDirective, selector: "dbx-button-spacer,[dbxButtonSpacer]" }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i9.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i9.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i12.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i12.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i12.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i13.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i14.DateDistancePipe, name: "dateDistance" }, { kind: "pipe", type: i14.TimeDistancePipe, name: "timeDistance" }, { kind: "pipe", type: i14.GetValuePipe, name: "getValue" }] }); }
|
|
483
|
+
}
|
|
484
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxDateTimeFieldComponent, decorators: [{
|
|
485
|
+
type: Component,
|
|
486
|
+
args: [{ template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n <!-- Additional spacing -->\n <dbx-button-spacer *ngIf=\"!dateOnly\"></dbx-button-spacer>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"showDateInput ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\" [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"mat-datepicker-button-highlight dbx-button-spacer\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput matInput [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"mat-datepicker-button-highlight dbx-button-spacer\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n" }]
|
|
487
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DbxDateTimeFieldMenuPresetsService }]; } });
|
|
488
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vc3JjL2xpYi9mb3JtbHkvZmllbGQvdmFsdWUvZGF0ZS9kYXRldGltZS5maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2RhdGV0aW1lLmZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBOEQsT0FBTyxFQUFFLGlCQUFpQixFQUFnRix1QkFBdUIsRUFBZSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoUSxPQUFPLEVBQUUsbUJBQW1CLEVBQXdCLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSw4QkFBOEIsRUFBRSx5QkFBeUIsRUFBRSx1QkFBdUIsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQWlDLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdFosT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pPLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFVBQVUsRUFB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WUFDbEMsTUFBTSxHQUFHLEdBQUcsQ0FBQztTQUNkO2FBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ3ZCLE1BQU0sR0FBRyxFQUFFLENBQUM7U0FDYjthQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUN6QixNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ1o7UUFFRCxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLGFBQWE7SUFDZixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQWdCO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDakQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBNWxCVSx5QkFBeUI7bUdBQXpCLHlCQUF5QiwyRUNsTXRDLDZpSUErRUE7OzRGRG1IYSx5QkFBeUI7a0JBSHJDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXliZSwgUmVhZGFibGVUaW1lU3RyaW5nLCBBcnJheU9yVmFsdWUsIElTTzg2MDFEYXRlU3RyaW5nLCBhc0FycmF5LCBmaWx0ZXJNYXliZVZhbHVlcywgRGVjaXNpb25GdW5jdGlvbiwgTWlsbGlzZWNvbmRzLCBUaW1lem9uZVN0cmluZywgTG9naWNhbERhdGUsIERhdGVPckRheVN0cmluZywgaXNJU084NjAxRGF5U3RyaW5nU3RhcnQsIE1hcEZ1bmN0aW9uLCBtYXBJZGVudGl0eUZ1bmN0aW9uIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBkYXRlRnJvbUxvZ2ljYWxEYXRlLCBEYXRlVGltZU1pbnV0ZUNvbmZpZywgRGF0ZVRpbWVNaW51dGVJbnN0YW5jZSwgZ3Vlc3NDdXJyZW50VGltZXpvbmUsIHJlYWRhYmxlVGltZVN0cmluZ1RvRGF0ZSwgdG9Mb2NhbFJlYWRhYmxlVGltZVN0cmluZywgdXRjRGF5Rm9yRGF0ZSwgc2FmZVRvSnNEYXRlLCBmaW5kTWluRGF0ZSwgZmluZE1heERhdGUsIGRhdGVUaW1lTWludXRlRGVjaXNpb25GdW5jdGlvbiwgaXNTYW1lRGF0ZUhvdXJzQW5kTWludXRlcywgZ2V0VGltZXpvbmVBYmJyZXZpYXRpb24sIGlzU2FtZURhdGVEYXksIGRhdGVUaW1lem9uZVV0Y05vcm1hbCwgRGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2UsIHRvSnNEYXlEYXRlLCBpc1NhbWVEYXRlIH0gZnJvbSAnQGRlcmVla2IvZGF0ZSc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHNoYXJlUmVwbGF5LCBtYXAsIHN0YXJ0V2l0aCwgdGFwLCBmaXJzdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGRlYm91bmNlVGltZSwgdGhyb3R0bGVUaW1lLCBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIFN1YmplY3QsIG1lcmdlLCBpbnRlcnZhbCwgb2YsIGNvbWJpbmVMYXRlc3RXaXRoLCBmaWx0ZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBGaWVsZFR5cGVDb25maWcsIEZvcm1seUZpZWxkUHJvcHMgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBhZGRNaW51dGVzLCBzdGFydE9mRGF5LCBhZGREYXlzIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgYXNPYnNlcnZhYmxlRnJvbUdldHRlciwgZmlsdGVyTWF5YmUsIE9ic2VydmFibGVPclZhbHVlR2V0dGVyLCBza2lwRmlyc3RNYXliZSwgU3Vic2NyaXB0aW9uT2JqZWN0LCBzd2l0Y2hNYXBNYXliZURlZmF1bHQsIHN3aXRjaE1hcE1heWJlT2JzIH0gZnJvbSAnQGRlcmVla2Ivcnhqcyc7XG5pbXBvcnQgeyBEYXRlVGltZVByZXNldCwgRGF0ZVRpbWVQcmVzZXRDb25maWd1cmF0aW9uLCBkYXRlVGltZVByZXNldCB9IGZyb20gJy4vZGF0ZXRpbWUnO1xuaW1wb3J0IHsgRGJ4RGF0ZVRpbWVGaWVsZE1lbnVQcmVzZXRzU2VydmljZSB9IGZyb20gJy4vZGF0ZXRpbWUuZmllbGQuc2VydmljZSc7XG5pbXBvcnQgeyBEYnhEYXRlVGltZVZhbHVlTW9kZSwgZGJ4RGF0ZVRpbWVJbnB1dFZhbHVlUGFyc2VGYWN0b3J5LCBkYnhEYXRlVGltZUlzU2FtZURhdGVUaW1lRmllbGRWYWx1ZSwgZGJ4RGF0ZVRpbWVPdXRwdXRWYWx1ZUZhY3RvcnkgfSBmcm9tICcuL2RhdGUudmFsdWUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2xQYXRoLCBzdHJlYW1WYWx1ZUZyb21Db250cm9sIH0gZnJvbSAnLi4vLi4vLi4vLi4vZm9ybS9mb3JtLmFuZ3VsYXIudXRpbCc7XG5cbmV4cG9ydCBlbnVtIERieERhdGVUaW1lRmllbGRUaW1lTW9kZSB7XG4gIC8qKlxuICAgKiBUaW1lIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgUkVRVUlSRUQgPSAncmVxdWlyZWQnLFxuICAvKipcbiAgICogVGltZSBpcyBvcHRpb25hbC5cbiAgICovXG4gIE9QVElPTkFMID0gJ29wdGlvbmFsJyxcbiAgLyoqXG4gICAqIFRpbWUgaXMgcGVybWVuYW50bHkgb2ZmLlxuICAgKi9cbiAgTk9ORSA9ICdub25lJ1xufVxuXG5leHBvcnQgdHlwZSBEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24gPSBPbWl0PERhdGVUaW1lTWludXRlQ29uZmlnLCAnZGF0ZSc+O1xuXG5leHBvcnQgdHlwZSBEYnhEYXRlVGltZUZpZWxkU3luY1R5cGUgPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFN5bmNGaWVsZCB7XG4gIC8qKlxuICAgKiBGaWVsZCBrZXkvcGF0aCB0byBzeW5jIHdpdGgvYWdhaW5zdC5cbiAgICovXG4gIHN5bmNXaXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb3cgdG8gc3luYyBhZ2FpbnN0IHRoZSBvdGhlciBmaWVsZC5cbiAgICovXG4gIHN5bmNUeXBlOiBEYnhEYXRlVGltZUZpZWxkU3luY1R5cGU7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHRpbWUgZGF0ZSBmaWVsZCB0aGF0IGhhcyBhIHJlZmVyZW5jZSBhbmQgb3B0aW9uYWwgbWFwIGZ1bmN0aW9uIHRvIG1hcCB0aGUgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnPEkgPSB1bmtub3duPiB7XG4gIHJlYWRvbmx5IHBhdGg6IEZvcm1Db250cm9sUGF0aDtcbiAgcmVhZG9ubHkgbWFwVmFsdWU/OiBNYXBGdW5jdGlvbjxJLCBNYXliZTxEYXRlT3JEYXlTdHJpbmc+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnKGlucHV0OiB1bmtub3duKTogaW5wdXQgaXMgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnIHtcbiAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKGlucHV0IGFzIERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZykucGF0aCA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFByb3BzIGV4dGVuZHMgRm9ybWx5RmllbGRQcm9wcyB7XG4gIC8qKlxuICAgKiBDdXN0b20gZGF0ZSBsYWJlbC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gRGF0ZVxuICAgKi9cbiAgZGF0ZUxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gdGltZSBsYWJlbC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gVGltZVxuICAgKi9cbiAgdGltZUxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMYWJlbCB0byB1c2UgZm9yIHRoZSBkYXRlIGhpbnQgZm9yIFwiQWxsIERheVwiLiBEZWZhdWx0cyB0byBcIkFsbCBEYXlcIi5cbiAgICovXG4gIGFsbERheUxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMYWJlbCB0byB1c2UgZm9yIHRoZSBkYXRlIGhpbnQgZm9yIFwiQXRcIi4gRGVmYXVsdHMgdG8gXCJBdFwiLlxuICAgKi9cbiAgYXRUaW1lTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG1vZGUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIERBVEVcbiAgICovXG4gIHZhbHVlTW9kZT86IERieERhdGVUaW1lVmFsdWVNb2RlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZGF0ZSBpcyBoaWRkZW4sIGFuZCBhdXRvbWF0aWNhbGx5IHVzZXMgdG9kYXkvaW5wdXQgZGF0ZS5cbiAgICovXG4gIHRpbWVPbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHRpbWUgY2FuIGJlIGFkZGVkL3JlbW92ZWQgb3B0aW9uYWxseS5cbiAgICpcbiAgICogVGhpcyBpcyBpZ25vcmVkIGlmIHRpbWVPbmx5IGlzIHNwZWNpZmllZC5cbiAgICovXG4gIHRpbWVNb2RlPzogRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlO1xuXG4gIC8qKlxuICAgKiBPdGhlciBmb3JtIGNvbnRyb2wgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyB3aGV0aGVyIG9yIG5vdCBpdCBpcyBhIGZ1bGwgZGF5LlxuICAgKlxuICAgKiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpZiB0aW1lIGlzIG9wdGlvbmFsLlxuICAgKlxuICAgKiBXaGVuIHRpbWUgaXMgb2ZmLCB0aGUgZmllbGQgaXMgc2V0IHRvIHRydWUuXG4gICAqL1xuICBmdWxsRGF5RmllbGROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBwYXNzIHRoZSBkYXRlIHZhbHVlIGFzIGEgVVRDIGRhdGUsIG9yIGEgZGF0ZSBpbiB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIGZ1bGxEYXlJblVUQz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IG90IGhpZGUgdGhlIGRhdGUgaGludCBpbmZvIGNvbnRlbnQuXG4gICAqXG4gICAqIEZhbHNlIGJ5IGRlZmF1bHRcbiAgICovXG4gIGhpZGVEYXRlSGludD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGhpZGUgdGhlIGRhdGUvY2FsZW5kYXIgcGlja2VyLlxuICAgKi9cbiAgaGlkZURhdGVQaWNrZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHBpY2tlckNvbmZpZz86IE9ic2VydmFibGVPclZhbHVlR2V0dGVyPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj47XG5cbiAgLyoqXG4gICAqIFVzZWQgZm9yIHN5bmNpbmcgd2l0aCBvbmUgb3IgbW9yZSBmaWVsZHMgd2l0aCBhIERhdGUgdmFsdWUuXG4gICAqL1xuICBnZXRTeW5jRmllbGRzT2JzPzogKCkgPT4gT2JzZXJ2YWJsZTxBcnJheU9yVmFsdWU8RGJ4RGF0ZVRpbWVGaWVsZFN5bmNGaWVsZD4+O1xuXG4gIC8qKlxuICAgKiAoT3B0aW9uYWwpIFRoZSBpbnB1dCB0aW1lem9uZSB0byBkZWZhdWx0IHRvLlxuICAgKlxuICAgKiBJZ25vcmVkIGlmIGZ1bGxEYXlJblVUQyBpcyB0cnVlLlxuICAgKi9cbiAgdGltZXpvbmU/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxNYXliZTxUaW1lem9uZVN0cmluZz4+PjtcblxuICAvKipcbiAgICogKE9wdGlvbmFsKSBUaGUgZGF0ZSB0byBhcHBseSB0aGUgdGltZSB0by5cbiAgICpcbiAgICogVGhlIHRpbWV6b25lIGFiYnJ2aWF0aW9uIHdpbGwgYWxzbyB1c2UgdGhpcyBkYXRlIHdoZW4gdXNpbmcgdGhlIHRpbWUtb25seSBtb2RlLlxuICAgKi9cbiAgdGltZURhdGU/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxNYXliZTxEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcgfCBGb3JtQ29udHJvbFBhdGggfCBEYXRlT3JEYXlTdHJpbmc+Pj47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgdGhlIHRpbWV6b25lLiBUcnVlIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBzaG93VGltZXpvbmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcHJlc2V0cyB0byBzaG93IGluIHRoZSBkcm9wZG93bi5cbiAgICovXG4gIHByZXNldHM/OiBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxEYXRlVGltZVByZXNldENvbmZpZ3VyYXRpb25bXT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RGF0ZVRpbWVGaWVsZFN5bmNQYXJzZWRGaWVsZCBleHRlbmRzIFBpY2s8RGJ4RGF0ZVRpbWVGaWVsZFN5bmNGaWVsZCwgJ3N5bmNUeXBlJz4ge1xuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w8TWF5YmU8RGF0ZSB8IElTTzg2MDFEYXRlU3RyaW5nPj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzeW5jQ29uZmlnVmFsdWVPYnMocGFyc2VDb25maWdzT2JzOiBPYnNlcnZhYmxlPERieERhdGVUaW1lRmllbGRTeW5jUGFyc2VkRmllbGRbXT4sIHR5cGU6IERieERhdGVUaW1lRmllbGRTeW5jVHlwZSk6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+IHtcbiAgcmV0dXJuIHBhcnNlQ29uZmlnc09icy5waXBlKFxuICAgIHN3aXRjaE1hcCgoeCkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnID0geC5maW5kKCh5KSA9PiB5LnN5bmNUeXBlID09PSB0eXBlKTtcbiAgICAgIGxldCByZXN1bHQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+O1xuXG4gICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHsgY29udHJvbCB9ID0gY29uZmlnO1xuICAgICAgICByZXN1bHQgPSBjb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChjb250cm9sLnZhbHVlKSxcbiAgICAgICAgICBtYXAoKHgpID0+IHNhZmVUb0pzRGF0ZSh4KSA/PyBudWxsKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gb2YobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xufVxuXG5jb25zdCBUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FOiBNaWxsaXNlY29uZHMgPSAxMDtcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnZGF0ZXRpbWUuZmllbGQuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIERieERhdGVUaW1lRmllbGRDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGU8RmllbGRUeXBlQ29uZmlnPERieERhdGVUaW1lRmllbGRQcm9wcz4+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9zdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX3ZhbHVlU3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuXG4gIHByaXZhdGUgX2NvbmZpZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfc3luY0NvbmZpZ09icyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxBcnJheU9yVmFsdWU8RGJ4RGF0ZVRpbWVGaWVsZFN5bmNGaWVsZD4+Pj4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIF9kZWZhdWx0VGltZXpvbmUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+Pj4+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgX3RpbWVEYXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPE1heWJlPERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZyB8IEZvcm1Db250cm9sUGF0aCB8IERhdGVPckRheVN0cmluZz4+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfcHJlc2V0cyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8T2JzZXJ2YWJsZTxEYXRlVGltZVByZXNldENvbmZpZ3VyYXRpb25bXT4+KG9mKFtdKSk7XG5cbiAgcHJpdmF0ZSBfZnVsbERheUlucHV0Q3RybD86IEZvcm1Db250cm9sO1xuICBwcml2YXRlIF9mdWxsRGF5Q29udHJvbE9icyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8QWJzdHJhY3RDb250cm9sPGJvb2xlYW4+Pj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZnVsbERheUNvbnRyb2wkID0gdGhpcy5fZnVsbERheUNvbnRyb2xPYnMucGlwZShmaWx0ZXJNYXliZSgpKTtcblxuICBwcml2YXRlIF9vZmZzZXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgX2Zvcm1Db250cm9sT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxBYnN0cmFjdENvbnRyb2w8TWF5YmU8RGF0ZT4+Pj4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZm9ybUNvbnRyb2wkID0gdGhpcy5fZm9ybUNvbnRyb2xPYnMucGlwZShmaWx0ZXJNYXliZSgpKTtcblxuICBwcml2YXRlIF91cGRhdGVUaW1lID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICByZWFkb25seSB0aW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuX2RlZmF1bHRUaW1lem9uZS5waXBlKHN3aXRjaE1hcE1heWJlRGVmYXVsdCgpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5waXBlKFxuICAgIG1hcCgoZGVmYXVsdFRpbWV6b25lKSA9PiB7XG4gICAgICByZXR1cm4gZGVmYXVsdFRpbWV6b25lID8/IGd1ZXNzQ3VycmVudFRpbWV6b25lKCk7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWV6b25lSW5zdGFuY2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlPj4gPSB0aGlzLnRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgodGltZXpvbmUpID0+ICh0aW1lem9uZSA/IGRhdGVUaW1lem9uZVV0Y05vcm1hbCh7IHRpbWV6b25lIH0pIDogdW5kZWZpbmVkKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSB0aW1lRGF0ZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gdGhpcy5fdGltZURhdGUucGlwZShcbiAgICBzd2l0Y2hNYXBNYXliZURlZmF1bHQoKSxcbiAgICBzd2l0Y2hNYXAoKHgpID0+IHtcbiAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+O1xuXG4gICAgICBpZiAoeCkge1xuICAgICAgICAvLyBpZiB0aGUgc3RyaW5nIGlzIG5vdCBhIGRhdGUgc3RyaW5nLCB0aGVuIHRyZWF0IGl0IGFzIGEgcGF0aFxuXG4gICAgICAgIGlmICgodHlwZW9mIHggPT09ICdzdHJpbmcnICYmICFpc0lTTzg2MDFEYXlTdHJpbmdTdGFydCh4KSkgfHwgaXNEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcoeCkpIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGgsIG1hcFZhbHVlIH06IERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZyA9IHR5cGVvZiB4ID09PSAnc3RyaW5nJyA/IHsgcGF0aDogeCB9IDogeDtcbiAgICAgICAgICBvYnMgPVxuICAgICAgICAgICAgc3RyZWFtVmFsdWVGcm9tQ29udHJvbDxEYXRlT3JEYXlTdHJpbmc+KHRoaXMuZm9ybSwgcGF0aCk/LnBpcGUoXG4gICAgICAgICAgICAgIG1hcChtYXBWYWx1ZSA/PyBtYXBJZGVudGl0eUZ1bmN0aW9uKCkpLFxuICAgICAgICAgICAgICBtYXAoKHgpID0+ICh4ID8gdG9Kc0RheURhdGUoeCkgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgKSA/PyBvZih1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9icyA9IG9mKHRvSnNEYXlEYXRlKHgpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzID0gb2YodW5kZWZpbmVkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icztcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHZhbHVlSW5TeXN0ZW1UaW1lem9uZSQgPSB0aGlzLmZvcm1Db250cm9sJC5waXBlKFxuICAgIG1hcCgoY29udHJvbCkgPT4gY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGg8TWF5YmU8RGF0ZT4+KGNvbnRyb2wudmFsdWUpLCBzaGFyZVJlcGxheSgxKSkpLFxuICAgIGNvbWJpbmVMYXRlc3RXaXRoKHRoaXMudGltZXpvbmVJbnN0YW5jZSQpLFxuICAgIHN3aXRjaE1hcCgoW3gsIHRpbWV6b25lSW5zdGFuY2VdKSA9PiB7XG4gICAgICByZXR1cm4geC5waXBlKG1hcChkYnhEYXRlVGltZUlucHV0VmFsdWVQYXJzZUZhY3RvcnkodGhpcy52YWx1ZU1vZGUsIHRpbWV6b25lSW5zdGFuY2UpKSk7XG4gICAgfSksXG4gICAgdGhyb3R0bGVUaW1lKDIwLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLCAvLyB0aHJvdHRsZSBpbmNvbWluZyB2YWx1ZXMgYW5kIHRpbWV6b25lIGNoYW5nZXNcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlSG91cnNBbmRNaW51dGVzKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHRyaWdnZXIvZGlzcGxheSB2aXN1YWwgdXBkYXRlcyAoc3BlY2lmaWNhbGx5IG9uIHRpbWVEaXN0YW5jZSwgZXRjLikuXG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5VmFsdWUkID0gaW50ZXJ2YWwoMTAgKiAxMDAwKS5waXBlKFxuICAgIHN0YXJ0V2l0aCgwKSxcbiAgICBtYXAoKCkgPT4gbmV3IERhdGUoKS5nZXRNaW51dGVzKCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgdGFwKCgpID0+IHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCkpLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdGltZVN0cmluZyQ6IE9ic2VydmFibGU8UmVhZGFibGVUaW1lU3RyaW5nIHwgJyc+ID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IHRvTG9jYWxSZWFkYWJsZVRpbWVTdHJpbmcoeCkgOiAnJykpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlSW5wdXRDdHJsID0gbmV3IEZvcm1Db250cm9sKG5ldyBEYXRlKCksIHtcbiAgICB2YWxpZGF0b3JzOiBbXVxuICB9KTtcblxuICByZWFkb25seSB0aW1lSW5wdXRDdHJsID0gbmV3IEZvcm1Db250cm9sKCcnLCB7XG4gICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucGF0dGVybigvXihub3cpJHxeKFswLTldfCgwWzAtOV0pfCgxWzAtOV0pfCgyWzAtM10pKSg6KT8oWzAtNV1bMC05XSk/KFxccyk/KFthcEFQXVtNbV0pPyhcXFxccykqJC8pXVxuICB9KTtcblxuICBnZXQgZGF0ZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZGF0ZUxhYmVsID8/ICdEYXRlJztcbiAgfVxuXG4gIGdldCB0aW1lTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy50aW1lTGFiZWwgPz8gJ1RpbWUnO1xuICB9XG5cbiAgZ2V0IGFsbERheUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYWxsRGF5TGFiZWwgPz8gJ0FsbCBEYXknO1xuICB9XG5cbiAgZ2V0IGF0VGltZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYXRUaW1lTGFiZWwgPz8gJ0F0JztcbiAgfVxuXG4gIGdldCBkYXRlT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aW1lTW9kZSA9PT0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkU7XG4gIH1cblxuICBnZXQgZGF0ZVRpbWVGaWVsZCgpOiBEYnhEYXRlVGltZUZpZWxkUHJvcHMge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzO1xuICB9XG5cbiAgZ2V0IHRpbWVPbmx5KCk6IE1heWJlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZpZWxkLnRpbWVPbmx5O1xuICB9XG5cbiAgZ2V0IHNob3dEYXRlSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnRpbWVPbmx5O1xuICB9XG5cbiAgZ2V0IHZhbHVlTW9kZSgpOiBEYnhEYXRlVGltZVZhbHVlTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMudmFsdWVNb2RlID8/IERieERhdGVUaW1lVmFsdWVNb2RlLkRBVEU7XG4gIH1cblxuICBnZXQgdGltZU1vZGUoKTogRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlIHtcbiAgICBjb25zdCBkYXRlVmFsdWVzT25seSA9IHRoaXMudmFsdWVNb2RlID09PSBEYnhEYXRlVGltZVZhbHVlTW9kZS5EQVlfU1RSSU5HO1xuXG4gICAgaWYgKGRhdGVWYWx1ZXNPbmx5KSB7XG4gICAgICByZXR1cm4gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWVPbmx5ID8gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVEIDogdGhpcy5kYXRlVGltZUZpZWxkLnRpbWVNb2RlID8/IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRDtcbiAgICB9XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogTWF5YmU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuZGVzY3JpcHRpb247XG4gIH1cblxuICBnZXQgaGlkZURhdGVIaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLmhpZGVEYXRlSGludCA/PyBmYWxzZTtcbiAgfVxuXG4gIGdldCBoaWRlRGF0ZVBpY2tlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5oaWRlRGF0ZVBpY2tlciA/PyBmYWxzZTtcbiAgfVxuXG4gIGdldCB0aW1lem9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy50aW1lem9uZTtcbiAgfVxuXG4gIGdldCB0aW1lRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy50aW1lRGF0ZTtcbiAgfVxuXG4gIGdldCBzaG93VGltZXpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuc2hvd1RpbWV6b25lID8/IHRydWU7XG4gIH1cblxuICBnZXQgcHJlc2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5wcmVzZXRzO1xuICB9XG5cbiAgcmVhZG9ubHkgZnVsbERheSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmZ1bGxEYXlDb250cm9sJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoY29udHJvbCkgPT4gY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgoY29udHJvbC52YWx1ZSkpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd1RpbWVJbnB1dCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmZ1bGxEYXkkLnBpcGUobWFwKCh4KSA9PiAheCAmJiB0aGlzLnRpbWVNb2RlICE9PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORSkpO1xuXG4gIHJlYWRvbmx5IHNob3dBZGRUaW1lJCA9IHRoaXMuc2hvd1RpbWVJbnB1dCQucGlwZShcbiAgICBtYXAoKHgpID0+ICF4ICYmIHRoaXMudGltZU1vZGUgPT09IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5PUFRJT05BTCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlJCA9IHRoaXMuZGF0ZUlucHV0Q3RybC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5kYXRlSW5wdXRDdHJsLnZhbHVlKSwgZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHRpbWV6b25lQWJicmV2aWF0aW9uJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF0ZSQsIHRoaXMudGltZXpvbmUkLCB0aGlzLnRpbWVEYXRlJF0pLnBpcGUoXG4gICAgbWFwKChbZGF0ZSwgdGltZXpvbmUsIHRpbWVEYXRlXSkgPT4gZ2V0VGltZXpvbmVBYmJyZXZpYXRpb24odGltZXpvbmUsIHRpbWVEYXRlID8/IGRhdGUpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZVZhbHVlJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlPj4gPSBtZXJnZSh0aGlzLmRhdGUkLCB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSQucGlwZShza2lwRmlyc3RNYXliZSgpKSkucGlwZShcbiAgICBtYXAoKHg6IE1heWJlPERhdGU+KSA9PiAoeCA/IHN0YXJ0T2ZEYXkoeCkgOiBudWxsKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQ8TWF5YmU8RGF0ZT4+KGlzU2FtZURhdGVEYXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdGltZUlucHV0JDogT2JzZXJ2YWJsZTxSZWFkYWJsZVRpbWVTdHJpbmc+ID0gdGhpcy5fdXBkYXRlVGltZS5waXBlKFxuICAgIGRlYm91bmNlVGltZSg1KSxcbiAgICBtYXAoKCkgPT4gdGhpcy50aW1lSW5wdXRDdHJsLnZhbHVlIHx8ICcnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG5cbiAgcmVhZG9ubHkgc3luY0NvbmZpZ09icyQgPSB0aGlzLl9zeW5jQ29uZmlnT2JzLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBwYXJzZWRTeW5jQ29uZmlncyQ6IE9ic2VydmFibGU8RGJ4RGF0ZVRpbWVGaWVsZFN5bmNQYXJzZWRGaWVsZFtdPiA9IHRoaXMuc3luY0NvbmZpZ09icyQucGlwZShcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGxldCBwYXJzZWQ6IERieERhdGVUaW1lRmllbGRTeW5jUGFyc2VkRmllbGRbXTtcblxuICAgICAgaWYgKHgpIHtcbiAgICAgICAgcGFyc2VkID0gZmlsdGVyTWF5YmVWYWx1ZXMoXG4gICAgICAgICAgYXNBcnJheSh4KS5tYXAoKHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KHkuc3luY1dpdGgpO1xuXG4gICAgICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wsXG4gICAgICAgICAgICAgICAgLi4ueVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkID0gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzeW5jQ29uZmlnQmVmb3JlVmFsdWUkOiBPYnNlcnZhYmxlPERhdGUgfCBudWxsPiA9IHN5bmNDb25maWdWYWx1ZU9icyh0aGlzLnBhcnNlZFN5bmNDb25maWdzJCwgJ2JlZm9yZScpO1xuICByZWFkb25seSBzeW5jQ29uZmlnQWZ0ZXJWYWx1ZSQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+ID0gc3luY0NvbmZpZ1ZhbHVlT2JzKHRoaXMucGFyc2VkU3luY0NvbmZpZ3MkLCAnYWZ0ZXInKTtcblxuICAvLyBUT0RPOiBHZXQgbWluL21heCB1c2luZyB0aGUgRGF0ZVRpbWVQaWNrZXJDb25maWd1cmF0aW9uIHRvb1xuXG4gIHJlYWRvbmx5IGRhdGVJbnB1dE1pbiQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+ID0gdGhpcy5zeW5jQ29uZmlnQmVmb3JlVmFsdWUkO1xuICByZWFkb25seSBkYXRlSW5wdXRNYXgkOiBPYnNlcnZhYmxlPERhdGUgfCBudWxsPiA9IHRoaXMuc3luY0NvbmZpZ0FmdGVyVmFsdWUkO1xuXG4gIHJlYWRvbmx5IHJhd0RhdGVUaW1lJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlPj4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRhdGVWYWx1ZSQsIHRoaXMudGltZUlucHV0JC5waXBlKHN0YXJ0V2l0aChudWxsKSksIHRoaXMuZnVsbERheSQsIHRoaXMudGltZURhdGUkXSkucGlwZShcbiAgICBtYXAoKFtkYXRlLCB0aW1lU3RyaW5nLCBmdWxsRGF5LCB0aW1lRGF0ZV0pID0+IHtcbiAgICAgIGxldCByZXN1bHQ6IE1heWJlPERhdGU+O1xuXG4gICAgICBpZiAoIWRhdGUgfHwgdGhpcy50aW1lT25seSkge1xuICAgICAgICBkYXRlID0gdGltZURhdGUgPz8gbmV3IERhdGUoKTsgLy8gdXNlIHRoZSB0aW1lIGRhdGUsIG9yIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgZGF5XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgIGlmIChmdWxsRGF5KSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGF0ZVRpbWVGaWVsZC5mdWxsRGF5SW5VVEMpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHV0Y0RheUZvckRhdGUoZGF0ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHN0YXJ0T2ZEYXkoZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRpbWVTdHJpbmcpIHtcbiAgICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgcmVhZGFibGVUaW1lU3RyaW5nVG9EYXRlKHRpbWVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgdXNlU3lzdGVtVGltZXpvbmU6IHRydWVcbiAgICAgICAgICAgIH0pID8/IGRhdGU7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudGltZU9ubHkpIHtcbiAgICAgICAgICByZXN1bHQgPSBkYXRlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZUhvdXJzQW5kTWludXRlcyksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjb25maWckID0gY29tYmluZUxhdGVzdChbdGhpcy5fY29uZmlnLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCkpLCB0aGlzLmRhdGVJbnB1dE1pbiQsIHRoaXMuZGF0ZUlucHV0TWF4JF0pLnBpcGUoXG4gICAgbWFwKChbeCwgZGF0ZUlucHV0TWluLCBkYXRlSW5wdXRNYXhdKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0OiBNYXliZTxEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24+ID0geDtcblxuICAgICAgaWYgKGRhdGVJbnB1dE1pbiAhPSBudWxsIHx8IGRhdGVJbnB1dE1heCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHsgbWluOiBsaW1pdE1pbiwgbWF4OiBsaW1pdE1heCB9ID0geD8ubGltaXRzID8/IHt9O1xuICAgICAgICBjb25zdCBtaW4gPSBmaW5kTWluRGF0ZShbZGF0ZUlucHV0TWluLCBkYXRlRnJvbUxvZ2ljYWxEYXRlKGxpbWl0TWluKV0pO1xuICAgICAgICBjb25zdCBtYXggPSBmaW5kTWF4RGF0ZShbZGF0ZUlucHV0TWF4LCBkYXRlRnJvbUxvZ2ljYWxEYXRlKGxpbWl0TWF4KV0pO1xuXG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAuLi54LFxuICAgICAgICAgIGxpbWl0czoge1xuICAgICAgICAgICAgLi4ueD8ubGltaXRzLFxuICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgbWF4XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBwaWNrZXJGaWx0ZXIkOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZSB8IG51bGw+PiA9IHRoaXMuY29uZmlnJC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgbWFwKCh4KSA9PiB7XG4gICAgICBpZiAoeCkge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBkYXRlVGltZU1pbnV0ZURlY2lzaW9uRnVuY3Rpb24oeCk7XG4gICAgICAgIHJldHVybiAoeDogRGF0ZSB8IG51bGwpID0+ICh4ICE9IG51bGwgPyBmaWx0ZXIoeCkgOiB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdFBpY2tlckZpbHRlcjogRGVjaXNpb25GdW5jdGlvbjxEYXRlIHwgbnVsbD4gPSAoKSA9PiB0cnVlO1xuXG4gIHJlYWRvbmx5IHRpbWVPdXRwdXQkOiBPYnNlcnZhYmxlPE1heWJlPERhdGU+PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMucmF3RGF0ZVRpbWUkLCB0aGlzLl9vZmZzZXQsIHRoaXMuY29uZmlnJF0pLnBpcGUoXG4gICAgdGhyb3R0bGVUaW1lKFRJTUVfT1VUUFVUX1RIUk9UVExFX1RJTUUsIHVuZGVmaW5lZCwgeyBsZWFkaW5nOiBmYWxzZSwgdHJhaWxpbmc6IHRydWUgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGN1cnJlbnQsIG5leHQpID0+IGN1cnJlbnRbMF0gPT09IG5leHRbMF0gJiYgbmV4dFsxXSA9PT0gMCksXG4gICAgdGFwKChbLCBzdGVwc09mZnNldF0pID0+IChzdGVwc09mZnNldCA/IHRoaXMuX29mZnNldC5uZXh0KDApIDogMCkpLFxuICAgIG1hcCgoW2RhdGUsIHN0ZXBzT2Zmc2V0LCBjb25maWddKSA9PiB7XG4gICAgICBpZiAoZGF0ZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERhdGVUaW1lTWludXRlSW5zdGFuY2Uoe1xuICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIHJvdW5kRG93blRvTWludXRlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRhdGUgPSBpbnN0YW5jZS5jbGFtcChkYXRlKTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IHN0ZXBzT2Zmc2V0ICogNTtcbiAgICAgICAgZGF0ZSA9IGFkZE1pbnV0ZXMoZGF0ZSwgbWludXRlcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVIb3Vyc0FuZE1pbnV0ZXMpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgcHJlc2V0cyQ6IE9ic2VydmFibGU8RGF0ZVRpbWVQcmVzZXRbXT4gPSB0aGlzLl9wcmVzZXRzLnBpcGUoXG4gICAgc3dpdGNoTWFwTWF5YmVPYnMoKSxcbiAgICBtYXAoKHg6IERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdKSA9PiB4Lm1hcChkYXRlVGltZVByZXNldCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgcmVhZG9ubHkgZGJ4RGF0ZVRpbWVGaWVsZENvbmZpZ1NlcnZpY2U6IERieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMubmV4dCh0aGlzLmZvcm1Db250cm9sKTtcblxuICAgIGNvbnN0IGlucHV0UGlja2VyQ29uZmlnID0gdGhpcy5kYXRlVGltZUZpZWxkLnBpY2tlckNvbmZpZztcbiAgICB0aGlzLl9jb25maWcubmV4dChpbnB1dFBpY2tlckNvbmZpZyA/IGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIoaW5wdXRQaWNrZXJDb25maWcpIDogdW5kZWZpbmVkKTtcbiAgICB0aGlzLl9zeW5jQ29uZmlnT2JzLm5leHQodGhpcy5kYXRlVGltZUZpZWxkLmdldFN5bmNGaWVsZHNPYnM/LigpKTtcblxuICAgIHRoaXMuX3N1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLnRpbWV6b25lSW5zdGFuY2UkLnBpcGUobWFwKCh0aW1lem9uZUluc3RhbmNlKSA9PiBkYnhEYXRlVGltZU91dHB1dFZhbHVlRmFjdG9yeSh0aGlzLnZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZSkpKSksXG4gICAgICAgIHRocm90dGxlVGltZShUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICBzd2l0Y2hNYXAoKFtjdXJyZW50VmFsdWUsIHZhbHVlRmFjdG9yeV0pID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50aW1lT3V0cHV0JC5waXBlKFxuICAgICAgICAgICAgdGhyb3R0bGVUaW1lKFRJTUVfT1VUUFVUX1RIUk9UVExFX1RJTUUgKiAyLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICAgICAgc2tpcEZpcnN0TWF5YmUoKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVIb3Vyc0FuZE1pbnV0ZXMpLFxuICAgICAgICAgICAgbWFwKCh4KSA9PiB2YWx1ZUZhY3RvcnkoeCkpLFxuICAgICAgICAgICAgZmlsdGVyKCh4KSA9PiAhZGJ4RGF0ZVRpbWVJc1NhbWVEYXRlVGltZUZpZWxkVmFsdWUoeCwgY3VycmVudFZhbHVlKSlcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB9KTtcblxuICAgIGxldCBoYXNTZXRNaWRuaWdodEZyb21JbnB1dCA9IGZhbHNlO1xuXG4gICAgLypcbiAgICB0aGlzLl92YWx1ZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnRpbWVTdHJpbmckLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgdGhpcy5zZXRUaW1lKHgpO1xuICAgIH0pO1xuICAgICovXG5cbiAgICB0aGlzLl92YWx1ZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHgpID0+ICh4ID8gaXNTYW1lRGF0ZSh4LCBzdGFydE9mRGF5KHgpKSA6IGZhbHNlKSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHN3aXRjaE1hcCgoaXNJbnB1dFZhbHVlQXRNaWRuaWdodCkgPT4ge1xuICAgICAgICAgIGhhc1NldE1pZG5pZ2h0RnJvbUlucHV0ID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudGltZVN0cmluZyQucGlwZShcbiAgICAgICAgICAgIC8vIHNraXAoMSksXG4gICAgICAgICAgICBtYXAoKHRpbWVTdHJpbmcpID0+IFt0aW1lU3RyaW5nLCBpc0lucHV0VmFsdWVBdE1pZG5pZ2h0XSBhcyBbc3RyaW5nLCBib29sZWFuXSlcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW3gsIGlzSW5wdXRWYWx1ZUF0TWlkbmlnaHRdKSA9PiB7XG4gICAgICAgIC8vIFNraXAgZXZlbnRzIHdoZXJlIHRoZSB0aW1lSW5wdXQgdmFsdWUgaXMgY2xlYXJlZCwgdW5sZXNzIHRoZSBpbnB1dCB2YWx1ZSBpcyBhdCBtaWRuaWdodCBhbmQgd2UndmUgYWxyZWFkeSBwcm9jZXNzZWQgaXQgYmVpbmcgYXQgbWlkbmlnaHRcbiAgICAgICAgaWYgKCF0aGlzLnRpbWVJbnB1dEN0cmwudmFsdWUgJiYgeCA9PT0gJzEyOjAwQU0nICYmICghaXNJbnB1dFZhbHVlQXRNaWRuaWdodCB8fCAoaXNJbnB1dFZhbHVlQXRNaWRuaWdodCAmJiBoYXNTZXRNaWRuaWdodEZyb21JbnB1dCkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBoYXMgc2V0IGZsYWdcbiAgICAgICAgaWYgKHggPT09ICcxMjowMEFNJyAmJiBpc0lucHV0VmFsdWVBdE1pZG5pZ2h0KSB7XG4gICAgICAgICAgaGFzU2V0TWlkbmlnaHRGcm9tSW5wdXQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRUaW1lKHgpO1xuICAgICAgfSk7XG5cbiAgICAvLyBTZXQgZGVmYXVsdCB0aW1lem9uZSBpZiBwcm92aWRlZC5cbiAgICBpZiAodGhpcy50aW1lem9uZSAmJiAhdGhpcy5kYXRlVGltZUZpZWxkLmZ1bGxEYXlJblVUQykge1xuICAgICAgdGhpcy5fZGVmYXVsdFRpbWV6b25lLm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLnRpbWV6b25lKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdGltZURhdGUubmV4dChhc09ic2VydmFibGVGcm9tR2V0dGVyKHRoaXMudGltZURhdGUpKTtcblxuICAgIC8vIFdhdGNoIGZvciBkaXNhYmxlZCBjaGFuZ2VzIHNvIHdlIGNhbiBwcm9wb2dhdGUgdGhlbSBwcm9wZXJseS5cbiAgICB0aGlzLmZvcm1Db250cm9sLnJlZ2lzdGVyT25EaXNhYmxlZENoYW5nZSgoZGlzYWJsZWQpID0+IHtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmRhdGVJbnB1dEN0cmwuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMudGltZUlucHV0Q3RybC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGF0ZUlucHV0Q3RybC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLnRpbWVJbnB1dEN0cmwuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGlzRnVsbERheUZpZWxkID0gdGhpcy5kYXRlVGltZUZpZWxkLmZ1bGxEYXlGaWVsZE5hbWU7XG4gICAgbGV0IGZ1bGxEYXlGaWVsZEN0cmw6IE1heWJlPEFic3RyYWN0Q29udHJvbD47XG5cbiAgICBpZiAoaXNGdWxsRGF5RmllbGQpIHtcbiAgICAgIGZ1bGxEYXlGaWVsZEN0cmwgPSB0aGlzLmZvcm0uZ2V0KGlzRnVsbERheUZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoIWZ1bGxEYXlGaWVsZEN0cmwpIHtcbiAgICAgIGNvbnN0IGlzRnVsbERheSA9IHRoaXMudGltZU1vZGUgPT09IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5OT05FO1xuICAgICAgdGhpcy5fZnVsbERheUlucHV0Q3RybCA9IG5ldyBGb3JtQ29udHJvbChpc0Z1bGxEYXkpO1xuXG4gICAgICAvLyBTZXQgdGhlIGNvbnRyb2wgaW4gdGhlIGZvcm0gdG9vIGlmIHRoZSBuYW1lIGlzIGRlZmluZWQuXG4gICAgICBpZiAoaXNGdWxsRGF5RmllbGQpIHtcbiAgICAgICAgKHRoaXMuZm9ybSBhcyBGb3JtR3JvdXApLmFkZENvbnRyb2woaXNGdWxsRGF5RmllbGQsIHRoaXMuX2Z1bGxEYXlJbnB1dEN0cmwpO1xuICAgICAgfVxuXG4gICAgICBmdWxsRGF5RmllbGRDdHJsID0gdGhpcy5fZnVsbERheUlucHV0Q3RybDtcbiAgICB9XG5cbiAgICB0aGlzLl9mdWxsRGF5Q29udHJvbE9icy5uZXh0KGZ1bGxEYXlGaWVsZEN0cmwpO1xuXG4gICAgc3dpdGNoICh0aGlzLnRpbWVNb2RlKSB7XG4gICAgICBjYXNlIERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5PUFRJT05BTDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5OT05FOlxuICAgICAgICB0aGlzLnJlbW92ZVRpbWUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRDpcbiAgICAgICAgdGhpcy5hZGRUaW1lKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByZXNldHMgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fcHJlc2V0cy5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy5wcmVzZXRzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ByZXNldHMubmV4dCh0aGlzLmRieERhdGVUaW1lRmllbGRDb25maWdTZXJ2aWNlLmNvbmZpZ3VyYXRpb25zJCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB0aGlzLl9zdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX3ZhbHVlU3ViLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9jb25maWcuY29tcGxldGUoKTtcbiAgICB0aGlzLl9kZWZhdWx0VGltZXpvbmUuY29tcGxldGUoKTtcbiAgICB0aGlzLl90aW1lRGF0ZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3ByZXNldHMuY29tcGxldGUoKTtcbiAgICB0aGlzLl9mdWxsRGF5Q29udHJvbE9icy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX29mZnNldC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2Zvcm1Db250cm9sT2JzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fdXBkYXRlVGltZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3N5bmNDb25maWdPYnMuY29tcGxldGUoKTtcbiAgfVxuXG4gIHNlbGVjdFByZXNldChwcmVzZXQ6IERhdGVUaW1lUHJlc2V0KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSBwcmVzZXQudmFsdWUoKTtcblxuICAgIGlmICh2YWx1ZS5sb2dpY2FsRGF0ZSkge1xuICAgICAgdGhpcy5zZXRMb2dpY2FsVGltZSh2YWx1ZS5sb2dpY2FsRGF0ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50aW1lU3RyaW5nKSB7XG4gICAgICB0aGlzLnNldFRpbWUodmFsdWUudGltZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgZGF0ZVBpY2tlZChldmVudDogTWF0RGF0ZXBpY2tlcklucHV0RXZlbnQ8RGF0ZT4pOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlID0gZXZlbnQudmFsdWU7XG5cbiAgICBpZiAoZGF0ZSkge1xuICAgICAgdGhpcy5zZXREYXRlSW5wdXRWYWx1ZShkYXRlKTtcbiAgICB9XG4gIH1cblxuICBzZXRMb2dpY2FsVGltZSh0aW1lOiBMb2dpY2FsRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGUgPSBkYXRlRnJvbUxvZ2ljYWxEYXRlKHRpbWUpO1xuXG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIHRoaXMuc2V0VGltZUZyb21EYXRlKGRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHNldERhdGVJbnB1dFZhbHVlKGRhdGU6IERhdGUpIHtcbiAgICB0aGlzLmRhdGVJbnB1dEN0cmwuc2V0VmFsdWUoZGF0ZSk7XG4gICAgdGhpcy5fdXBkYXRlVGltZS5uZXh0KCk7XG4gIH1cblxuICBzZXRUaW1lRnJvbURhdGUodGltZURhdGU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lU3RyaW5nID0gdG9Mb2NhbFJlYWRhYmxlVGltZVN0cmluZyh0aW1lRGF0ZSk7XG4gICAgdGhpcy5zZXRUaW1lKHRpbWVTdHJpbmcpO1xuICB9XG5cbiAgc2V0VGltZSh0aW1lOiBSZWFkYWJsZVRpbWVTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lSW5wdXRDdHJsLnZhbHVlICE9PSB0aW1lKSB7XG4gICAgICB0aGlzLnRpbWVJbnB1dEN0cmwuc2V0VmFsdWUodGltZSk7XG4gICAgICB0aGlzLl9vZmZzZXQubmV4dCgwKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpbWUubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGtleWRvd25PbkRhdGVJbnB1dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGxldCBkaXJlY3Rpb24gPSAwO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXk/LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICBkaXJlY3Rpb24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Fycm93ZG93bic6XG4gICAgICAgIGRpcmVjdGlvbiA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBsZXQgb2Zmc2V0ID0gMTtcblxuICAgIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSAzNjU7XG4gICAgfSBlbHNlIGlmIChldmVudC5jdHJsS2V5KSB7XG4gICAgICBvZmZzZXQgPSAzMDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSA3O1xuICAgIH1cblxuICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgIHRoaXMuZGF0ZSQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKGRhdGUpID0+IHtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IGFkZERheXMoZGF0ZSwgb2Zmc2V0ICogZGlyZWN0aW9uKTtcbiAgICAgICAgdGhpcy5zZXREYXRlSW5wdXRWYWx1ZShuZXdEYXRlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGtleWRvd25PblRpbWVJbnB1dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGxldCBkaXJlY3Rpb24gPSAwO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXk/LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICBkaXJlY3Rpb24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Fycm93ZG93bic6XG4gICAgICAgIGRpcmVjdGlvbiA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBsZXQgb2Zmc2V0ID0gMTtcblxuICAgIGlmIChldmVudC5hbHRLZXkgJiYgZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIG9mZnNldCA9IDMwMDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgb2Zmc2V0ID0gNjA7XG4gICAgfSBlbHNlIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgb2Zmc2V0ID0gNTtcbiAgICB9XG5cbiAgICBpZiAoZGlyZWN0aW9uICE9PSAwKSB7XG4gICAgICB0aGlzLl9vZmZzZXQubmV4dCh0aGlzLl9vZmZzZXQudmFsdWUgKyBvZmZzZXQgKiBkaXJlY3Rpb24pO1xuICAgICAgdGhpcy5fdXBkYXRlVGltZS5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNUaW1lKCk6IHZvaWQge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGZvY3VzT3V0VGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVUaW1lLm5leHQoKTtcbiAgfVxuXG4gIGFkZFRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRGdWxsRGF5KGZhbHNlKTtcbiAgfVxuXG4gIHJlbW92ZVRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRGdWxsRGF5KHRydWUpO1xuICB9XG5cbiAgc2V0RnVsbERheShmdWxsRGF5OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5mdWxsRGF5Q29udHJvbCQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHguc2V0VmFsdWUoZnVsbERheSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkYngtZGF0ZXRpbWUtZmllbGRcIiBmeExheW91dD1cInJvdyB3cmFwXCIgZnhMYXlvdXQueHM9XCJjb2x1bW4gd3JhcFwiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1ldmVubHkgc3RyZXRjaFwiPlxuICA8IS0tIERhdGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93XCIgZnhGbGV4Lmx0LXNtPVwiMTAwXCIgW2Z4RmxleF09XCJkYXRlT25seSA/ICcxMDAnIDogJzUwJ1wiICpuZ0lmPVwic2hvd0RhdGVJbnB1dFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlSW5wdXRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gQWRkaXRpb25hbCBzcGFjaW5nIC0tPlxuICAgIDxkYngtYnV0dG9uLXNwYWNlciAqbmdJZj1cIiFkYXRlT25seVwiPjwvZGJ4LWJ1dHRvbi1zcGFjZXI+XG4gIDwvZGl2PlxuICA8IS0tIFRpbWUgLS0+XG4gIDxkaXYgY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93XCIgZnhGbGV4Lmx0LXNtPVwiMTAwXCIgW2Z4RmxleF09XCJzaG93RGF0ZUlucHV0ID8gJzUwJyA6ICcxMDAnXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dUaW1lSW5wdXQkIHwgYXN5bmNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0aW1lTWVudUFuZElucHV0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0FkZFRpbWUkIHwgYXN5bmNcIiBjbGFzcz1cImFkZC10aW1lLWJ1dHRvbi13cmFwcGVyXCI+XG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJtYXQtZGF0ZXBpY2tlci1idXR0b24taGlnaGxpZ2h0IGRieC1idXR0b24tc3BhY2VyIGFkZC10aW1lLWJ1dHRvblwiIG5nQ2xhc3MubHQtc209XCJhZGQtdGltZS1idXR0b24tZnVsbFwiIChjbGljayk9XCJhZGRUaW1lKClcIj5cbiAgICAgICAgPG1hdC1pY29uPnRpbWVyPC9tYXQtaWNvbj5cbiAgICAgICAgQWRkIFRpbWVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIiFoaWRlRGF0ZUhpbnRcIiBjbGFzcz1cImRieC1kYXRldGltZS1yb3cgZGJ4LWRhdGV0aW1lLWhpbnQtcm93XCIgZnhGbGV4PVwiMTAwXCI+XG4gICAgPGRpdiBjbGFzcz1cImRieC1oaW50XCIgW25nU3dpdGNoXT1cImZ1bGxEYXkkIHwgYXN5bmNcIj5cbiAgICAgIDxzbWFsbCAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiPlxuICAgICAgICA8YiBjbGFzcz1cImRieC1va1wiPnt7IGFsbERheUxhYmVsIH19PC9iPlxuICAgICAgICB7eyBkaXNwbGF5VmFsdWUkIHwgYXN5bmMgfCBkYXRlOiAnZnVsbERhdGUnIH19IHt7IHRpbWV6b25lQWJicmV2aWF0aW9uJCB8IGFzeW5jIH19ICh7eyBkaXNwbGF5VmFsdWUkIHwgYXN5bmMgfCBkYXRlRGlzdGFuY2UgfX0pXG4gICAgICA8L3NtYWxsPlxuICAgICAgPHNtYWxsICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheVZhbHVlJCB8IGFzeW5jXCI+XG4gICAgICAgICAgPGIgY2xhc3M9XCJkYngtb2tcIj57eyBhdFRpbWVMYWJlbCB9fTwvYj5cbiAgICAgICAgICB7eyBkaXNwbGF5VmFsdWUkIHwgYXN5bmMgfCBkYXRlOiAnbWVkaXVtJyB9fSB7eyB0aW1lem9uZUFiYnJldmlhdGlvbiQgfCBhc3luYyB9fSAoe3sgZGlzcGxheVZhbHVlJCB8IGFzeW5jIHwgdGltZURpc3RhbmNlIH19KVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvc21hbGw+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gRGF0ZSBJbnB1dCBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjZGF0ZUlucHV0VGVtcGxhdGU+XG4gIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRieC1kYXRldGltZS1yb3ctZmllbGRcIj5cbiAgICA8bWF0LWxhYmVsPnt7IGRhdGVMYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCAjZGF0ZUlucHV0IG1hdElucHV0IFttaW5dPVwiZGF0ZUlucHV0TWluJCB8IGFzeW5jXCIgW21heF09XCJkYXRlSW5wdXRNYXgkIHwgYXN5bmNcIiBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIiBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCIocGlja2VyRmlsdGVyJCB8IGFzeW5jKSB8fCBkZWZhdWx0UGlja2VyRmlsdGVyXCIgKGRhdGVDaGFuZ2UpPVwiZGF0ZVBpY2tlZCgkZXZlbnQpXCIgW3ZhbHVlXT1cImRhdGVWYWx1ZSQgfCBhc3luY1wiIChrZXlkb3duKT1cImtleWRvd25PbkRhdGVJbnB1dCgkZXZlbnQpXCIgLz5cbiAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuICAgIDxidXR0b24gbWF0UHJlZml4IGNsYXNzPVwibWF0LWRhdGVwaWNrZXItYnV0dG9uLWhpZ2hsaWdodCBkYngtYnV0dG9uLXNwYWNlclwiICpuZ0lmPVwiIWhpZGVEYXRlUGlja2VyXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJwaWNrZXIub3BlbigpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICA8bWF0LWljb24+Y2FsZW5kYXJfdG9kYXk8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxzcGFuIG1hdFRleHRTdWZmaXggKm5nSWY9XCIhKHNob3dUaW1lSW5wdXQkIHwgYXN5bmMpXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGltZXpvbmVTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvc3Bhbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gVGltZSBNZW51L0lucHV0IFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICN0aW1lTWVudUFuZElucHV0VGVtcGxhdGU+XG4gIDxtYXQtbWVudSAjdGltZW1lbnU9XCJtYXRNZW51XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRpbWVNb2RlID09PSAnb3B0aW9uYWwnXCI+XG4gICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInJlbW92ZVRpbWUoKVwiPlxuICAgICAgICA8c3Bhbj5SZW1vdmUgVGltZTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJlc2V0IG9mIHByZXNldHMkIHwgYXN5bmNcIj5cbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic2VsZWN0UHJlc2V0KHByZXNldClcIj57eyBwcmVzZXQubGFiZWwgfCBnZXRWYWx1ZSB9fTwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L21hdC1tZW51PlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93LWZpZWxkXCI+XG4gICAgPG1hdC1sYWJlbD57eyB0aW1lTGFiZWwgfX08L21hdC1sYWJlbD5cbiAgICA8aW5wdXQgI3RpbWVJbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidGltZUlucHV0Q3RybFwiIChmb2N1cyk9XCJmb2N1c1RpbWUoKVwiIChmb2N1c291dCk9XCJmb2N1c091dFRpbWUoKVwiIChrZXlkb3duKT1cImtleWRvd25PblRpbWVJbnB1dCgkZXZlbnQpXCIgLz5cbiAgICA8YnV0dG9uIG1hdFByZWZpeCBjbGFzcz1cIm1hdC1kYXRlcGlja2VyLWJ1dHRvbi1oaWdobGlnaHQgZGJ4LWJ1dHRvbi1zcGFjZXJcIiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInRpbWVtZW51XCIgYXJpYS1sYWJlbD1cIm9wZW5zIHRoZSB0aW1lIG1lbnVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgIDxtYXQtaWNvbj50aW1lcjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPHNwYW4gbWF0VGV4dFN1ZmZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0aW1lem9uZVN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9zcGFuPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBUaW1lem9uZSBTdWZmaXggLS0+XG48bmctdGVtcGxhdGUgI3RpbWV6b25lU3VmZml4VGVtcGxhdGU+XG4gIDxzcGFuICpuZ0lmPVwic2hvd1RpbWV6b25lXCIgY2xhc3M9XCJkYngtZGF0ZXRpbWUtdGltZXpvbmUgZGJ4LWZhaW50XCI+e3sgdGltZXpvbmVBYmJyZXZpYXRpb24kIHwgYXN5bmMgfX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuIl19
|