@entake/particle 18.0.5 → 19.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/LICENSE +1 -1
- package/app/{modules → shared/components}/accordion/accordion.component.d.ts +3 -3
- package/app/{modules/date-picker → shared}/components/calendar/calendar.component.d.ts +7 -12
- package/app/{modules → shared/components}/checkbox/checkbox.component.d.ts +5 -7
- package/app/{modules → shared/components}/color-picker/color-picker.component.d.ts +3 -9
- package/app/{modules → shared/components}/date-picker/date-picker.component.d.ts +20 -26
- package/app/{modules/date-picker → shared}/components/date-range-picker/date-range-picker.component.d.ts +10 -11
- package/app/{modules → shared/components}/dialog/dialog.component.d.ts +14 -24
- package/app/{modules → shared/components}/dropdown/dropdown.component.d.ts +12 -14
- package/app/{modules/icons/components → shared/components/icon-select}/icon-select.component.d.ts +14 -17
- package/app/{modules → shared/components}/idle-timeout/idle-timeout.component.d.ts +3 -4
- package/app/{modules → shared/components}/input-mask/input-mask.component.d.ts +6 -7
- package/app/shared/components/layout-full-framing/layout-full-framing.component.d.ts +27 -0
- package/app/shared/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +23 -0
- package/app/{modules/loader/components → shared/components/loader}/loader.component.d.ts +2 -2
- package/app/{modules → shared/components}/multi-select/multi-select.component.d.ts +18 -24
- package/app/{modules → shared/components}/notification/notification.component.d.ts +5 -13
- package/app/{modules → shared/components}/paginator/paginator.component.d.ts +12 -11
- package/app/{modules → shared/components}/popover/popover.component.d.ts +10 -15
- package/app/{modules → shared/components}/profile-pic/profile-pic.component.d.ts +1 -1
- package/app/shared/components/progress-bar/progress-bar.component.d.ts +15 -0
- package/app/{modules → shared/components}/rich-text/rich-text.component.d.ts +11 -12
- package/app/shared/components/scroll-to-top/scroll-to-top.component.d.ts +18 -0
- package/app/shared/components/slideover/slideover.component.d.ts +35 -0
- package/app/{modules → shared/components}/slider/slider.component.d.ts +8 -22
- package/app/{modules → shared/components}/toggle-switch/toggle-switch.component.d.ts +4 -6
- package/app/{modules → shared/components}/week-picker/week-picker.component.d.ts +21 -22
- package/app/{modules/accordion → shared}/directives/accordion-content.directive.d.ts +1 -2
- package/app/{modules/accordion → shared}/directives/accordion-header.directive.d.ts +1 -2
- package/app/{modules/accordion → shared}/directives/accordion-item.directive.d.ts +1 -1
- package/app/{modules/background-carousel → shared/directives}/background-carousel.directive.d.ts +4 -4
- package/app/{modules/keyfilter → shared/directives}/keyfilter.directive.d.ts +1 -7
- package/app/{modules/tooltip → shared/directives}/tooltip.directive.d.ts +3 -9
- package/app/shared/models/carousel-options.model.d.ts +21 -0
- package/app/shared/models/pagination-event.model.d.ts +8 -0
- package/app/shared/models/particle-component-text.model.d.ts +0 -24
- package/app/shared/modules/icons/particle-icons.module.d.ts +7 -0
- package/app/{modules/ordinal-number-pipe → shared/pipes}/ordinal-number.pipe.d.ts +1 -1
- package/app/shared/services/base-data.service.d.ts +2 -2
- package/app/shared/services/dialog.service.d.ts +1 -1
- package/app/{modules/notification → shared}/services/notification.service.d.ts +0 -4
- package/app/{modules/theming → shared}/services/theming.service.d.ts +0 -19
- package/fesm2022/entake-particle.mjs +3871 -5573
- package/fesm2022/entake-particle.mjs.map +1 -1
- package/package.json +16 -25
- package/public_api.d.ts +47 -82
- package/app/modules/accordion/accordion.module.d.ts +0 -11
- package/app/modules/background-carousel/carousel-options.model.d.ts +0 -30
- package/app/modules/background-carousel/particle-background-carousel.module.d.ts +0 -8
- package/app/modules/checkbox/checkbox.module.d.ts +0 -9
- package/app/modules/color-picker/color-picker.module.d.ts +0 -9
- package/app/modules/date-picker/date-picker.module.d.ts +0 -15
- package/app/modules/dialog/dialog.module.d.ts +0 -9
- package/app/modules/dropdown/dropdown.module.d.ts +0 -9
- package/app/modules/endpoint-state/components/endpoint-state.component.d.ts +0 -46
- package/app/modules/endpoint-state/endpoint-state.module.d.ts +0 -8
- package/app/modules/icons/particle-icons.module.d.ts +0 -13
- package/app/modules/idle-timeout/particle-idle-timeout.module.d.ts +0 -9
- package/app/modules/input-mask/input-mask.module.d.ts +0 -8
- package/app/modules/keyfilter/keyfilter.module.d.ts +0 -8
- package/app/modules/layout/components/layout-full-framing/layout-full-framing.component.d.ts +0 -27
- package/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +0 -23
- package/app/modules/layout/layout.module.d.ts +0 -10
- package/app/modules/loader/loader.module.d.ts +0 -8
- package/app/modules/multi-select/multi-select.module.d.ts +0 -8
- package/app/modules/notification/notification.module.d.ts +0 -8
- package/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.d.ts +0 -8
- package/app/modules/paginator/pagination-event.model.d.ts +0 -24
- package/app/modules/paginator/particle-paginator.module.d.ts +0 -13
- package/app/modules/popover/popover.module.d.ts +0 -9
- package/app/modules/profile-pic/particle-profile-pic.module.d.ts +0 -9
- package/app/modules/progress-bar/progress-bar.component.d.ts +0 -16
- package/app/modules/progress-bar/progress-bar.module.d.ts +0 -8
- package/app/modules/push-container/particle-push-container.module.d.ts +0 -9
- package/app/modules/push-container/push-container-state.model.d.ts +0 -7
- package/app/modules/push-container/push-container.component.d.ts +0 -137
- package/app/modules/rich-text/particle-rich-text.module.d.ts +0 -15
- package/app/modules/rich-text/render-rich-text.component.d.ts +0 -6
- package/app/modules/scroll-to-top/particle-scroll-to-top.module.d.ts +0 -8
- package/app/modules/scroll-to-top/scroll-to-top.component.d.ts +0 -19
- package/app/modules/slideover/particle-slideover.module.d.ts +0 -8
- package/app/modules/slideover/slideover.component.d.ts +0 -35
- package/app/modules/slider/slider.module.d.ts +0 -9
- package/app/modules/theming/components/theming.component.d.ts +0 -43
- package/app/modules/theming/theming.module.d.ts +0 -12
- package/app/modules/toggle-switch/toggle-switch.module.d.ts +0 -8
- package/app/modules/tooltip/tooltip.module.d.ts +0 -8
- package/app/modules/week-picker/week-picker.module.d.ts +0 -13
- package/app/shared/enums/endpoint-status.enum.d.ts +0 -9
- package/esm2022/app/modules/accordion/accordion.component.mjs +0 -101
- package/esm2022/app/modules/accordion/accordion.module.mjs +0 -37
- package/esm2022/app/modules/accordion/directives/accordion-content.directive.mjs +0 -17
- package/esm2022/app/modules/accordion/directives/accordion-header.directive.mjs +0 -17
- package/esm2022/app/modules/accordion/directives/accordion-item.directive.mjs +0 -36
- package/esm2022/app/modules/background-carousel/background-carousel.directive.mjs +0 -91
- package/esm2022/app/modules/background-carousel/carousel-options.model.mjs +0 -36
- package/esm2022/app/modules/background-carousel/particle-background-carousel.module.mjs +0 -24
- package/esm2022/app/modules/checkbox/checkbox.component.mjs +0 -108
- package/esm2022/app/modules/checkbox/checkbox.module.mjs +0 -28
- package/esm2022/app/modules/color-picker/color-picker.component.mjs +0 -306
- package/esm2022/app/modules/color-picker/color-picker.module.mjs +0 -19
- package/esm2022/app/modules/date-picker/components/calendar/calendar.component.mjs +0 -496
- package/esm2022/app/modules/date-picker/components/date-range-picker/date-range-picker.component.mjs +0 -250
- package/esm2022/app/modules/date-picker/date-picker.component.mjs +0 -538
- package/esm2022/app/modules/date-picker/date-picker.module.mjs +0 -56
- package/esm2022/app/modules/dialog/dialog.component.mjs +0 -177
- package/esm2022/app/modules/dialog/dialog.module.mjs +0 -28
- package/esm2022/app/modules/dropdown/dropdown.component.mjs +0 -682
- package/esm2022/app/modules/dropdown/dropdown.module.mjs +0 -28
- package/esm2022/app/modules/dropdown/models/dropdown-option-group.model.mjs +0 -2
- package/esm2022/app/modules/dropdown/models/dropdown-option.model.mjs +0 -2
- package/esm2022/app/modules/endpoint-state/components/endpoint-state.component.mjs +0 -75
- package/esm2022/app/modules/endpoint-state/endpoint-state.module.mjs +0 -22
- package/esm2022/app/modules/icons/components/icon-select.component.mjs +0 -376
- package/esm2022/app/modules/icons/models/fontawesome-icons-brands.model.mjs +0 -471
- package/esm2022/app/modules/icons/models/fontawesome-icons-regular.model.mjs +0 -166
- package/esm2022/app/modules/icons/models/fontawesome-icons-solid.model.mjs +0 -1016
- package/esm2022/app/modules/icons/models/particle-icons-brands.model.mjs +0 -24
- package/esm2022/app/modules/icons/models/particle-icons-regular.model.mjs +0 -50
- package/esm2022/app/modules/icons/models/particle-icons-solid.model.mjs +0 -89
- package/esm2022/app/modules/icons/particle-icons.module.mjs +0 -66
- package/esm2022/app/modules/icons/services/icons.service.mjs +0 -82
- package/esm2022/app/modules/idle-timeout/idle-timeout.component.mjs +0 -85
- package/esm2022/app/modules/idle-timeout/idle-timer.mjs +0 -66
- package/esm2022/app/modules/idle-timeout/particle-idle-timeout.module.mjs +0 -28
- package/esm2022/app/modules/input-mask/input-mask.component.mjs +0 -594
- package/esm2022/app/modules/input-mask/input-mask.module.mjs +0 -18
- package/esm2022/app/modules/keyfilter/keyfilter.directive.mjs +0 -174
- package/esm2022/app/modules/keyfilter/keyfilter.module.mjs +0 -18
- package/esm2022/app/modules/layout/components/layout-full-framing/layout-full-framing.component.mjs +0 -81
- package/esm2022/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.mjs +0 -67
- package/esm2022/app/modules/layout/layout.module.mjs +0 -33
- package/esm2022/app/modules/loader/components/loader.component.mjs +0 -30
- package/esm2022/app/modules/loader/loader.module.mjs +0 -24
- package/esm2022/app/modules/multi-select/models/multi-select-option-group.model.mjs +0 -2
- package/esm2022/app/modules/multi-select/models/multi-select-option.model.mjs +0 -2
- package/esm2022/app/modules/multi-select/multi-select.component.mjs +0 -665
- package/esm2022/app/modules/multi-select/multi-select.module.mjs +0 -18
- package/esm2022/app/modules/notification/models/notification.model.mjs +0 -2
- package/esm2022/app/modules/notification/notification.component.mjs +0 -122
- package/esm2022/app/modules/notification/notification.module.mjs +0 -18
- package/esm2022/app/modules/notification/services/notification.service.mjs +0 -84
- package/esm2022/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.mjs +0 -20
- package/esm2022/app/modules/ordinal-number-pipe/ordinal-number.pipe.mjs +0 -49
- package/esm2022/app/modules/paginator/pagination-event.model.mjs +0 -29
- package/esm2022/app/modules/paginator/paginator.component.mjs +0 -207
- package/esm2022/app/modules/paginator/particle-paginator.module.mjs +0 -48
- package/esm2022/app/modules/popover/popover.component.mjs +0 -352
- package/esm2022/app/modules/popover/popover.module.mjs +0 -24
- package/esm2022/app/modules/profile-pic/particle-profile-pic.module.mjs +0 -28
- package/esm2022/app/modules/profile-pic/profile-pic.component.mjs +0 -75
- package/esm2022/app/modules/progress-bar/progress-bar.component.mjs +0 -43
- package/esm2022/app/modules/progress-bar/progress-bar.module.mjs +0 -24
- package/esm2022/app/modules/push-container/particle-push-container.module.mjs +0 -26
- package/esm2022/app/modules/push-container/push-container-state.model.mjs +0 -2
- package/esm2022/app/modules/push-container/push-container.component.mjs +0 -363
- package/esm2022/app/modules/rich-text/particle-rich-text.module.mjs +0 -64
- package/esm2022/app/modules/rich-text/render-rich-text.component.mjs +0 -18
- package/esm2022/app/modules/rich-text/rich-text-capabilities.model.mjs +0 -2
- package/esm2022/app/modules/rich-text/rich-text.component.mjs +0 -209
- package/esm2022/app/modules/scroll-to-top/particle-scroll-to-top.module.mjs +0 -24
- package/esm2022/app/modules/scroll-to-top/scroll-to-top.component.mjs +0 -49
- package/esm2022/app/modules/slideover/particle-slideover.module.mjs +0 -24
- package/esm2022/app/modules/slideover/slideover.component.mjs +0 -115
- package/esm2022/app/modules/slider/slider.component.mjs +0 -243
- package/esm2022/app/modules/slider/slider.module.mjs +0 -26
- package/esm2022/app/modules/theming/components/theming.component.mjs +0 -86
- package/esm2022/app/modules/theming/models/theme.model.mjs +0 -9
- package/esm2022/app/modules/theming/services/theme-change-detection.service.mjs +0 -38
- package/esm2022/app/modules/theming/services/theming.service.mjs +0 -510
- package/esm2022/app/modules/theming/theming.module.mjs +0 -55
- package/esm2022/app/modules/toggle-switch/models/toggle-options.model.mjs +0 -2
- package/esm2022/app/modules/toggle-switch/toggle-switch.component.mjs +0 -107
- package/esm2022/app/modules/toggle-switch/toggle-switch.module.mjs +0 -24
- package/esm2022/app/modules/tooltip/tooltip.directive.mjs +0 -381
- package/esm2022/app/modules/tooltip/tooltip.module.mjs +0 -18
- package/esm2022/app/modules/week-picker/week-picker.component.mjs +0 -511
- package/esm2022/app/modules/week-picker/week-picker.module.mjs +0 -40
- package/esm2022/app/shared/enums/endpoint-status.enum.mjs +0 -11
- package/esm2022/app/shared/interceptors/json.interceptor.mjs +0 -23
- package/esm2022/app/shared/models/auditable.model.mjs +0 -2
- package/esm2022/app/shared/models/data-list.model.mjs +0 -2
- package/esm2022/app/shared/models/id.model.mjs +0 -2
- package/esm2022/app/shared/models/observable-container.mjs +0 -15
- package/esm2022/app/shared/models/particle-component-text.model.mjs +0 -2
- package/esm2022/app/shared/services/base-data.service.mjs +0 -190
- package/esm2022/app/shared/services/dialog.service.mjs +0 -50
- package/esm2022/app/shared/services/local-storage.service.mjs +0 -60
- package/esm2022/entake-particle.mjs +0 -5
- package/esm2022/public_api.mjs +0 -98
- /package/app/{modules/dropdown → shared}/models/dropdown-option-group.model.d.ts +0 -0
- /package/app/{modules/dropdown → shared}/models/dropdown-option.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/fontawesome-icons-brands.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/fontawesome-icons-regular.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/fontawesome-icons-solid.model.d.ts +0 -0
- /package/app/{modules/multi-select → shared}/models/multi-select-option-group.model.d.ts +0 -0
- /package/app/{modules/multi-select → shared}/models/multi-select-option.model.d.ts +0 -0
- /package/app/{modules/notification → shared}/models/notification.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/particle-icons-brands.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/particle-icons-regular.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/models/particle-icons-solid.model.d.ts +0 -0
- /package/app/{modules/rich-text → shared/models}/rich-text-capabilities.model.d.ts +0 -0
- /package/app/{modules/theming → shared}/models/theme.model.d.ts +0 -0
- /package/app/{modules/toggle-switch → shared}/models/toggle-options.model.d.ts +0 -0
- /package/app/{modules/icons → shared}/services/icons.service.d.ts +0 -0
- /package/app/{modules/idle-timeout → shared/services}/idle-timer.d.ts +0 -0
- /package/app/{modules/theming → shared}/services/theme-change-detection.service.d.ts +0 -0
|
@@ -1,511 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
-
import { add, endOfDay, endOfMonth, endOfWeek, getWeek, isEqual, isWithinInterval, setWeek, startOfWeek, sub } from 'date-fns';
|
|
4
|
-
import { BehaviorSubject, combineLatest, map, shareReplay, withLatestFrom, } from 'rxjs';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common";
|
|
7
|
-
import * as i2 from "@angular/forms";
|
|
8
|
-
import * as i3 from "../popover/popover.component";
|
|
9
|
-
import * as i4 from "../tooltip/tooltip.directive";
|
|
10
|
-
/**
|
|
11
|
-
* Component to allow a user to select a week
|
|
12
|
-
*/
|
|
13
|
-
export class WeekPickerComponent {
|
|
14
|
-
changeDetectorRef;
|
|
15
|
-
/**
|
|
16
|
-
* Set the value of the week picker
|
|
17
|
-
* @param value the value to set
|
|
18
|
-
*/
|
|
19
|
-
set value(value) {
|
|
20
|
-
if (value?.start && value?.end) {
|
|
21
|
-
const startWeek = getWeek(value.start);
|
|
22
|
-
const endWeek = getWeek(value.end);
|
|
23
|
-
if (startWeek !== endWeek) {
|
|
24
|
-
throw new Error('Start and end must be part of the same week of the year');
|
|
25
|
-
}
|
|
26
|
-
else if (value.start.getDay() !== 0 || value.end.getDay() !== 6) {
|
|
27
|
-
throw new Error('Start must be the beginning of its week and end must be the end of its week');
|
|
28
|
-
}
|
|
29
|
-
this._internalValue.next(value);
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
this._internalValue.next(null);
|
|
33
|
-
this._selectedMonth.next(this.currentDate.month);
|
|
34
|
-
this._selectedYear.next(this.currentDate.year);
|
|
35
|
-
}
|
|
36
|
-
this._value = value;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Set disabled
|
|
40
|
-
*/
|
|
41
|
-
set disabled(disabled) {
|
|
42
|
-
this._disabled = disabled;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Set the valid date boundary for the week picker
|
|
46
|
-
* @param dateRange
|
|
47
|
-
*/
|
|
48
|
-
set dateRange(dateRange) {
|
|
49
|
-
this.setSelectionInterval(dateRange);
|
|
50
|
-
this.setCurrentDateSelectable();
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Class list to apply to the date range input
|
|
54
|
-
*/
|
|
55
|
-
inputClassList = null;
|
|
56
|
-
/**
|
|
57
|
-
* Class list to apply to the week picker button
|
|
58
|
-
*/
|
|
59
|
-
calendarButtonClassList = '';
|
|
60
|
-
/**
|
|
61
|
-
* The aria label to apply to the date range input
|
|
62
|
-
*/
|
|
63
|
-
ariaLabel = 'Date';
|
|
64
|
-
/**
|
|
65
|
-
* Format for the selected date range in the selection preview. Must
|
|
66
|
-
* be a valid Angular DatePipe format
|
|
67
|
-
*/
|
|
68
|
-
dateFormat = 'MM/dd/y';
|
|
69
|
-
/**
|
|
70
|
-
* Close the picker when a selection is made
|
|
71
|
-
*/
|
|
72
|
-
closeOnSelect = true;
|
|
73
|
-
text = {
|
|
74
|
-
openCalendar: 'open calendar to select week',
|
|
75
|
-
selectWeek: 'Select a week',
|
|
76
|
-
selectYear: 'Select a year',
|
|
77
|
-
selectMonth: 'Select a month',
|
|
78
|
-
january: 'January',
|
|
79
|
-
february: 'February',
|
|
80
|
-
march: 'March',
|
|
81
|
-
april: 'April',
|
|
82
|
-
may: 'May',
|
|
83
|
-
june: 'June',
|
|
84
|
-
july: 'July',
|
|
85
|
-
august: 'August',
|
|
86
|
-
september: 'September',
|
|
87
|
-
october: 'October',
|
|
88
|
-
november: 'November',
|
|
89
|
-
december: 'December',
|
|
90
|
-
sundayAbbr: 'Su',
|
|
91
|
-
mondayAbbr: 'Mo',
|
|
92
|
-
tuesdayAbbr: 'Tu',
|
|
93
|
-
wednesdayAbbr: 'We',
|
|
94
|
-
thursdayAbbr: 'Th',
|
|
95
|
-
fridayAbbr: 'Fr',
|
|
96
|
-
saturdayAbbr: 'Sa',
|
|
97
|
-
selectLastWeek: 'Select last week',
|
|
98
|
-
lastWeek: 'Last Week',
|
|
99
|
-
resetWeekSelection: 'Reset week selection to current week',
|
|
100
|
-
selectNextWeek: 'Select next week',
|
|
101
|
-
nextWeek: 'Next Week'
|
|
102
|
-
};
|
|
103
|
-
/**
|
|
104
|
-
* Event emitted on week select
|
|
105
|
-
*/
|
|
106
|
-
weekSelected = new EventEmitter();
|
|
107
|
-
/**
|
|
108
|
-
* ViewChild of the calendar popover
|
|
109
|
-
*/
|
|
110
|
-
calendarPopover = null;
|
|
111
|
-
/**
|
|
112
|
-
* The current date
|
|
113
|
-
*/
|
|
114
|
-
currentDate;
|
|
115
|
-
/**
|
|
116
|
-
* BehaviorSubject tracking the value of the week picker
|
|
117
|
-
*/
|
|
118
|
-
_internalValue = new BehaviorSubject(null);
|
|
119
|
-
/**
|
|
120
|
-
* BehaviorSubject tracking the selectable date range
|
|
121
|
-
*/
|
|
122
|
-
_validSelectionInterval = new BehaviorSubject(null);
|
|
123
|
-
/**
|
|
124
|
-
* BehaviorSubject tracking the currently selected month
|
|
125
|
-
*/
|
|
126
|
-
_selectedMonth = new BehaviorSubject(0);
|
|
127
|
-
/**
|
|
128
|
-
* BehaviorSubject tracking the currently selected year
|
|
129
|
-
*/
|
|
130
|
-
_selectedYear = new BehaviorSubject(1970);
|
|
131
|
-
/**
|
|
132
|
-
* The selected week of the year of the start of the selection as an Observable
|
|
133
|
-
*/
|
|
134
|
-
selectedWeek$ = this._internalValue.pipe(map(value => {
|
|
135
|
-
return !value?.start ? 0 : getWeek(value.start);
|
|
136
|
-
}), shareReplay());
|
|
137
|
-
/**
|
|
138
|
-
* The year of the start of the selected week as an Observable
|
|
139
|
-
*/
|
|
140
|
-
selectedYear$ = this._internalValue.pipe(map(value => {
|
|
141
|
-
return !value?.start ? 0 : value.start.getFullYear();
|
|
142
|
-
}), shareReplay());
|
|
143
|
-
/**
|
|
144
|
-
* Observable boolean representing if next week (relative to the current selection) is selectable
|
|
145
|
-
*/
|
|
146
|
-
canSelectNextWeek$ = this.selectedWeek$.pipe(withLatestFrom(this._validSelectionInterval, this._selectedYear), map(([selectedWeek, selectionInterval, selectedYear]) => {
|
|
147
|
-
let canSelect = false;
|
|
148
|
-
if (selectedWeek > 0 && selectionInterval) {
|
|
149
|
-
const selectedYearStart = new Date(selectedYear, 0, 1);
|
|
150
|
-
const weekDate = setWeek(selectedYearStart, selectedWeek);
|
|
151
|
-
const nextWeekDate = add(weekDate, { weeks: 1 });
|
|
152
|
-
const nextWeekStartDate = startOfWeek(nextWeekDate);
|
|
153
|
-
const nextWeekEndDate = endOfWeek(nextWeekDate);
|
|
154
|
-
canSelect = isWithinInterval(nextWeekStartDate, selectionInterval) &&
|
|
155
|
-
isWithinInterval(nextWeekEndDate, selectionInterval);
|
|
156
|
-
}
|
|
157
|
-
return canSelect;
|
|
158
|
-
}));
|
|
159
|
-
/**
|
|
160
|
-
* Observable boolean representing if last week (relative to the current selection) is selectable
|
|
161
|
-
*/
|
|
162
|
-
canSelectLastWeek$ = this.selectedWeek$.pipe(withLatestFrom(this._validSelectionInterval, this._selectedYear), map(([selectedWeek, selectionInterval, selectedYear]) => {
|
|
163
|
-
let canSelect = false;
|
|
164
|
-
if (selectedWeek > 0 && selectionInterval) {
|
|
165
|
-
const selectedYearStart = new Date(selectedYear, 0, 1);
|
|
166
|
-
const weekDate = setWeek(selectedYearStart, selectedWeek);
|
|
167
|
-
const lastWeekDate = sub(weekDate, { weeks: 1 });
|
|
168
|
-
const lastWeekStartDate = startOfWeek(lastWeekDate);
|
|
169
|
-
const lastWeekEndDate = endOfWeek(lastWeekDate);
|
|
170
|
-
canSelect = isWithinInterval(lastWeekStartDate, selectionInterval) &&
|
|
171
|
-
isWithinInterval(lastWeekEndDate, selectionInterval);
|
|
172
|
-
}
|
|
173
|
-
return canSelect;
|
|
174
|
-
}));
|
|
175
|
-
/**
|
|
176
|
-
* The range of selectable years as an Observable
|
|
177
|
-
*/
|
|
178
|
-
validYearRange$ = this._validSelectionInterval.pipe(map(selectionInterval => WeekPickerComponent.generateYearRange(selectionInterval?.start?.getFullYear() ?? null, selectionInterval?.end?.getFullYear() ?? null, this.currentDate.year)));
|
|
179
|
-
/**
|
|
180
|
-
* An array of MetaWeeks representing a month as an Observable
|
|
181
|
-
*/
|
|
182
|
-
fullMonth$ = combineLatest([
|
|
183
|
-
this._selectedMonth,
|
|
184
|
-
this._selectedYear,
|
|
185
|
-
this._validSelectionInterval
|
|
186
|
-
]).pipe(map(([month, year, selectionInterval]) => {
|
|
187
|
-
let fullMonth = null;
|
|
188
|
-
if (selectionInterval) {
|
|
189
|
-
fullMonth = WeekPickerComponent.generateMonth(month, year, {
|
|
190
|
-
start: selectionInterval.start,
|
|
191
|
-
end: selectionInterval.end
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
return fullMonth;
|
|
195
|
-
}));
|
|
196
|
-
/**
|
|
197
|
-
* The value of the week picker
|
|
198
|
-
* @private
|
|
199
|
-
*/
|
|
200
|
-
_value = null;
|
|
201
|
-
/**
|
|
202
|
-
* Whether the control is disabled
|
|
203
|
-
* @private
|
|
204
|
-
*/
|
|
205
|
-
_disabled = false;
|
|
206
|
-
/**
|
|
207
|
-
* Generate an Array of numbers representing the span of years between the input
|
|
208
|
-
* @param minYear the start of the range
|
|
209
|
-
* @param maxYear the end of the range
|
|
210
|
-
* @param currentYear the current year
|
|
211
|
-
*/
|
|
212
|
-
static generateYearRange(minYear, maxYear, currentYear) {
|
|
213
|
-
let start, end;
|
|
214
|
-
if (!minYear && maxYear) {
|
|
215
|
-
start = maxYear = 50;
|
|
216
|
-
end = maxYear;
|
|
217
|
-
}
|
|
218
|
-
else if (minYear && !maxYear) {
|
|
219
|
-
start = minYear;
|
|
220
|
-
end = minYear + 50;
|
|
221
|
-
}
|
|
222
|
-
else if (minYear && maxYear) {
|
|
223
|
-
start = minYear;
|
|
224
|
-
end = maxYear;
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
start = currentYear - 100;
|
|
228
|
-
end = currentYear + 50;
|
|
229
|
-
}
|
|
230
|
-
const range = [];
|
|
231
|
-
for (let i = start; i <= end; i++) {
|
|
232
|
-
range.push(i);
|
|
233
|
-
}
|
|
234
|
-
return range;
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Generate a month with week and selectable status metadata
|
|
238
|
-
* @param month the month to generate
|
|
239
|
-
* @param year the year of the month to generate
|
|
240
|
-
* @param selectionInterval the interval representing the
|
|
241
|
-
* minimum to the maximum week of the year
|
|
242
|
-
* @private
|
|
243
|
-
*/
|
|
244
|
-
static generateMonth(month, year, selectionInterval) {
|
|
245
|
-
const metaMonth = [];
|
|
246
|
-
const startOfMonth = new Date(year, month, 1);
|
|
247
|
-
const monthInterval = { start: startOfMonth, end: endOfMonth(startOfMonth) };
|
|
248
|
-
let scrollDate = sub(startOfMonth, { days: startOfMonth.getDay() });
|
|
249
|
-
for (let i = 0; i < 6; i++) {
|
|
250
|
-
const sundayOfWeek = sub(scrollDate, { days: scrollDate.getDay() });
|
|
251
|
-
const saturdayOfWeek = add(scrollDate, { days: 6 - scrollDate.getDay() });
|
|
252
|
-
metaMonth.push({
|
|
253
|
-
week: getWeek(scrollDate),
|
|
254
|
-
year: sundayOfWeek.getFullYear(),
|
|
255
|
-
selectable: (isWithinInterval(sundayOfWeek, monthInterval) ||
|
|
256
|
-
isWithinInterval(saturdayOfWeek, monthInterval)) &&
|
|
257
|
-
isWithinInterval(sundayOfWeek, selectionInterval) &&
|
|
258
|
-
isWithinInterval(saturdayOfWeek, selectionInterval),
|
|
259
|
-
dates: []
|
|
260
|
-
});
|
|
261
|
-
for (let j = 0; j < 7; j++) {
|
|
262
|
-
metaMonth[i].dates.push(scrollDate.getDate());
|
|
263
|
-
scrollDate = add(scrollDate, { days: 1 });
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
return metaMonth;
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Get the input date as a MetaDate
|
|
270
|
-
* @param date the date to transform
|
|
271
|
-
* @param selectable whether or not the date is selectable
|
|
272
|
-
* @private
|
|
273
|
-
*/
|
|
274
|
-
static getMetaDate(date, selectable = false) {
|
|
275
|
-
return {
|
|
276
|
-
day: date.getDay(),
|
|
277
|
-
date: date.getDate(),
|
|
278
|
-
week: getWeek(date),
|
|
279
|
-
month: date.getMonth(),
|
|
280
|
-
year: date.getFullYear(),
|
|
281
|
-
selectable: selectable
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Function to call on change
|
|
286
|
-
*/
|
|
287
|
-
onChange = () => { };
|
|
288
|
-
/**
|
|
289
|
-
* Function to call on touch
|
|
290
|
-
*/
|
|
291
|
-
onTouched = () => { };
|
|
292
|
-
/**
|
|
293
|
-
* Dependency injection site
|
|
294
|
-
* @param changeDetectorRef the Angular ChangeDetectorRef
|
|
295
|
-
*/
|
|
296
|
-
constructor(changeDetectorRef) {
|
|
297
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
298
|
-
this.currentDate = WeekPickerComponent.getMetaDate(new Date(), false);
|
|
299
|
-
}
|
|
300
|
-
/**
|
|
301
|
-
* Get the value of the week picker
|
|
302
|
-
*/
|
|
303
|
-
get value() {
|
|
304
|
-
return this._value;
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Get whether the control is disabled
|
|
308
|
-
*/
|
|
309
|
-
get disabled() {
|
|
310
|
-
return this._disabled;
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Write value
|
|
314
|
-
* @param value the value to write
|
|
315
|
-
*/
|
|
316
|
-
writeValue(value) {
|
|
317
|
-
this.value = value;
|
|
318
|
-
this.changeDetectorRef.markForCheck();
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Register function on change
|
|
322
|
-
* @param fn the function to change
|
|
323
|
-
*/
|
|
324
|
-
registerOnChange(fn) {
|
|
325
|
-
this.onChange = fn;
|
|
326
|
-
}
|
|
327
|
-
/**
|
|
328
|
-
* Register function on touch
|
|
329
|
-
* @param fn the function to register
|
|
330
|
-
*/
|
|
331
|
-
registerOnTouched(fn) {
|
|
332
|
-
this.onTouched = fn;
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* Set disabled state
|
|
336
|
-
* @param isDisabled whether or not the control is disabled
|
|
337
|
-
*/
|
|
338
|
-
setDisabledState(isDisabled) {
|
|
339
|
-
this.disabled = isDisabled;
|
|
340
|
-
this.changeDetectorRef.markForCheck();
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Open the week picker popover
|
|
344
|
-
* @param event the event to pass to the popover
|
|
345
|
-
*/
|
|
346
|
-
openCalendar(event) {
|
|
347
|
-
if (!this.disabled) {
|
|
348
|
-
const selectionInterval = this._validSelectionInterval.getValue();
|
|
349
|
-
if (!selectionInterval) {
|
|
350
|
-
this.setSelectionInterval(null);
|
|
351
|
-
}
|
|
352
|
-
this.setCurrentDateSelectable();
|
|
353
|
-
if (!this.value) {
|
|
354
|
-
this._selectedMonth.next(this.currentDate.month);
|
|
355
|
-
this._selectedYear.next(this.currentDate.year);
|
|
356
|
-
}
|
|
357
|
-
else {
|
|
358
|
-
this._internalValue.next(this.value);
|
|
359
|
-
this._selectedMonth.next(this.value.start.getMonth());
|
|
360
|
-
this._selectedYear.next(this.value.start.getFullYear());
|
|
361
|
-
}
|
|
362
|
-
this.calendarPopover.toggle(event);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* Handle week select
|
|
367
|
-
* @param week the week of the year
|
|
368
|
-
* @param selectable whether or not the week is selectable
|
|
369
|
-
*/
|
|
370
|
-
onWeekSelect(week, selectable) {
|
|
371
|
-
const selectedYear = this._selectedYear.getValue();
|
|
372
|
-
if (selectable) {
|
|
373
|
-
const weekDate = setWeek(new Date(selectedYear, 0, 1), week);
|
|
374
|
-
const weekStart = startOfWeek(weekDate);
|
|
375
|
-
const weekEnd = endOfDay(endOfWeek(weekDate));
|
|
376
|
-
const selectedWeek = { start: weekStart, end: weekEnd };
|
|
377
|
-
this.updateModel(selectedWeek);
|
|
378
|
-
if (this.closeOnSelect) {
|
|
379
|
-
setTimeout(() => this.calendarPopover.close(), 200);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Select next week (relative to the week of the current selection)
|
|
385
|
-
*/
|
|
386
|
-
selectNextWeek() {
|
|
387
|
-
const nextWeekDate = add(this.value.start, { weeks: 1 });
|
|
388
|
-
const nextWeekStart = startOfWeek(nextWeekDate);
|
|
389
|
-
const nextWeekEnd = endOfDay(endOfWeek(nextWeekDate));
|
|
390
|
-
const currentMonth = this.value.start.getMonth();
|
|
391
|
-
const selectedWeek = { start: nextWeekStart, end: nextWeekEnd };
|
|
392
|
-
this.updateModel(selectedWeek);
|
|
393
|
-
if (nextWeekStart.getMonth() !== currentMonth) {
|
|
394
|
-
this._selectedMonth.next(nextWeekStart.getMonth());
|
|
395
|
-
this._selectedYear.next(nextWeekStart.getFullYear());
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
/**
|
|
399
|
-
* Select last week (relative to the week of the current selection)
|
|
400
|
-
*/
|
|
401
|
-
selectLastWeek() {
|
|
402
|
-
const lastWeekDate = sub(this.value.start, { weeks: 1 });
|
|
403
|
-
const lastWeekStart = startOfWeek(lastWeekDate);
|
|
404
|
-
const lastWeekEnd = endOfDay(endOfWeek(lastWeekDate));
|
|
405
|
-
const currentMonth = this.value.end.getMonth();
|
|
406
|
-
const selectedWeek = { start: lastWeekStart, end: lastWeekEnd };
|
|
407
|
-
this.updateModel(selectedWeek);
|
|
408
|
-
if (lastWeekEnd.getMonth() !== currentMonth) {
|
|
409
|
-
this._selectedMonth.next(lastWeekStart.getMonth());
|
|
410
|
-
this._selectedYear.next(lastWeekStart.getFullYear());
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Select the current week
|
|
415
|
-
*/
|
|
416
|
-
selectCurrentWeek() {
|
|
417
|
-
const thisWeekDate = new Date(this.currentDate.year, this.currentDate.month, this.currentDate.date);
|
|
418
|
-
const thisWeekStart = startOfWeek(thisWeekDate);
|
|
419
|
-
const thisWeekEnd = endOfDay(endOfWeek(thisWeekDate));
|
|
420
|
-
this.updateModel({ start: thisWeekStart, end: thisWeekEnd });
|
|
421
|
-
this._selectedMonth.next(this.currentDate.month);
|
|
422
|
-
this._selectedYear.next(this.currentDate.year);
|
|
423
|
-
}
|
|
424
|
-
/**
|
|
425
|
-
* Update model
|
|
426
|
-
* @param value the new value of the model
|
|
427
|
-
* @private
|
|
428
|
-
*/
|
|
429
|
-
updateModel(value) {
|
|
430
|
-
const valueBeforeUpdate = this.value;
|
|
431
|
-
if (!this.disabled) {
|
|
432
|
-
this.value = value;
|
|
433
|
-
if (!isEqual(valueBeforeUpdate.start, this.value.start) &&
|
|
434
|
-
!isEqual(valueBeforeUpdate.end, this.value.end)) {
|
|
435
|
-
this.onChange(this.value);
|
|
436
|
-
this.weekSelected.emit(this.value);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
/**
|
|
441
|
-
* Set the selection interval
|
|
442
|
-
* @param interval the input selection interval
|
|
443
|
-
* @private
|
|
444
|
-
*/
|
|
445
|
-
setSelectionInterval(interval) {
|
|
446
|
-
if (!interval) {
|
|
447
|
-
throw new Error('Start date must be less than end date');
|
|
448
|
-
}
|
|
449
|
-
if (interval?.start > interval?.end) {
|
|
450
|
-
throw new Error('Start date must be less than end date');
|
|
451
|
-
}
|
|
452
|
-
this._validSelectionInterval.next({
|
|
453
|
-
start: interval?.start ?? new Date(this.currentDate.year - 100, 0, 1),
|
|
454
|
-
end: interval?.end ?? new Date(this.currentDate.year + 50, 11, 31)
|
|
455
|
-
});
|
|
456
|
-
}
|
|
457
|
-
/**
|
|
458
|
-
* Set the selectable status of the current date
|
|
459
|
-
* @private
|
|
460
|
-
*/
|
|
461
|
-
setCurrentDateSelectable() {
|
|
462
|
-
const today = new Date();
|
|
463
|
-
const selectionInterval = this._validSelectionInterval.getValue();
|
|
464
|
-
const startOfCurrentWeek = sub(today, { days: this.currentDate.day });
|
|
465
|
-
const endOfCurrentWeek = add(today, { days: 6 - this.currentDate.day });
|
|
466
|
-
this.currentDate.selectable = isWithinInterval(startOfCurrentWeek, selectionInterval) &&
|
|
467
|
-
isWithinInterval(endOfCurrentWeek, selectionInterval);
|
|
468
|
-
}
|
|
469
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: WeekPickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
470
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: WeekPickerComponent, selector: "particle-week-picker", inputs: { value: "value", disabled: "disabled", dateRange: "dateRange", inputClassList: "inputClassList", calendarButtonClassList: "calendarButtonClassList", ariaLabel: "ariaLabel", dateFormat: "dateFormat", closeOnSelect: "closeOnSelect", text: "text" }, outputs: { weekSelected: "weekSelected" }, providers: [
|
|
471
|
-
{
|
|
472
|
-
provide: NG_VALUE_ACCESSOR,
|
|
473
|
-
useExisting: forwardRef(() => WeekPickerComponent),
|
|
474
|
-
multi: true
|
|
475
|
-
}
|
|
476
|
-
], viewQueries: [{ propertyName: "calendarPopover", first: true, predicate: ["calendarPopover"], descendants: true }], ngImport: i0, template: "<div style=\"cursor:default;overflow: hidden;\"\r\n [ngClass]=\"inputClassList ? '' : 'row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir'\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\">\r\n <button (click)=\"openCalendar($event)\"\r\n aria-haspopup=\"dialog\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"ariaLabel + ', ' + text.openCalendar\"\r\n [attr.aria-expanded]=\"calendarPopover.visible\"\r\n [ngClass]=\"inputClassList ? inputClassList : 'clear'\"\r\n type=\"button\"\r\n class=\"access btnset width100 height100 center_center\"\r\n style=\"outline-offset: -2px;\"\r\n >\r\n <div class=\"col size_1 height100 width100 ptl_input_text_size ptl_input_padding v_center\">\r\n <ng-container *ngIf=\"_internalValue | async as internalValue else placeholderTemplate\">\r\n {{internalValue.start | date: dateFormat}} - {{internalValue.end | date: dateFormat}}\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"ent_r2l_txt\">{{text.selectWeek}}...</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"col min_w50 height100 center_center border_left\"\r\n [ngClass]=\"calendarButtonClassList ? calendarButtonClassList : 'bg_overlay ptl_brdr_color'\">\r\n <div class=\"width100 height100 center_center\">\r\n <i class=\"fas fa-calendar-week ptl_input_text_size\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n</div>\r\n\r\n\r\n<!-- week picker input\r\n<div class=\"wwp_container\" style=\"cursor:default;\"\r\n [ngClass]=\"inputClassList\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\">\r\n\r\n <button (click)=\"openCalendar($event)\"\r\n aria-haspopup=\"dialog\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"ariaLabel + ', ' + text.openCalendar\"\r\n [attr.aria-expanded]=\"calendarPopover.visible\"\r\n class=\"access content_color wwp_input\">\r\n <ng-container *ngIf=\"_internalValue | async as internalValue else placeholderTemplate\">\r\n {{internalValue.start | date: dateFormat}} - {{internalValue.end | date: dateFormat}}\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"wwp_placeholder\">{{text.selectWeek}}...</div>\r\n </ng-template>\r\n </button>\r\n <div class=\"wwp_button\" [ngClass]=\"calendarButtonClassList\">\r\n <i class=\"fas fa-calendar-week\"></i>\r\n </div>\r\n</div>\r\n-->\r\n<!-- TODO: instead of offset 1, attach to wwp_container -->\r\n<!-- calendar widget -->\r\n<particle-popover [offset]=\"1\" #calendarPopover>\r\n <!-- month / year select -->\r\n <div class=\"wwp_options\">\r\n <div class=\"content_color pad_5 pad_bot0\">\r\n <div class=\"row space_between\">\r\n <div class=\"col size_1 mar_5\">\r\n <select #yearSelect\r\n [ngModel]=\"_selectedYear | async\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n (change)=\"_selectedYear.next(+yearSelect.value)\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectYear\">\r\n <option *ngFor=\"let year of validYearRange$ | async\"\r\n [value]=\"year\">\r\n {{year}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col size_2 mar_5\">\r\n <select #monthSelect\r\n [ngModel]=\"_selectedMonth | async\"\r\n (change)=\"_selectedMonth.next(+monthSelect.value)\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectMonth\">\r\n <option value=\"0\">{{text.january}}</option>\r\n <option value=\"1\">{{text.february}}</option>\r\n <option value=\"2\">{{text.march}}</option>\r\n <option value=\"3\">{{text.april}}</option>\r\n <option value=\"4\">{{text.may}}</option>\r\n <option value=\"5\">{{text.june}}</option>\r\n <option value=\"6\">{{text.july}}</option>\r\n <option value=\"7\">{{text.august}}</option>\r\n <option value=\"8\">{{text.september}}</option>\r\n <option value=\"9\">{{text.october}}</option>\r\n <option value=\"10\">{{text.november}}</option>\r\n <option value=\"11\">{{text.december}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content_color pad_5\">\r\n <!-- weekdays -->\r\n <div class=\"mar_5 mar_bot10\">\r\n <div class=\"row wrap space_between ptl_input_bg_color ptl_brdr_color border_bottom brad_3 mar_bot5\">\r\n <div class=\"wwp_weekday\">{{text.sundayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.mondayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.tuesdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.wednesdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.thursdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.fridayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.saturdayAbbr}}</div>\r\n </div>\r\n <!-- days -->\r\n <ng-container *ngIf=\"fullMonth$ | async as fullMonth\">\r\n <ng-container *ngFor=\"let week of fullMonth\">\r\n <div class=\"wwp_week\"\r\n [ngClass]=\"{ 'currentWeek': week.week === currentDate.week && week.year === currentDate.year }\">\r\n <button (click)=\"onWeekSelect(week.week, week.selectable)\"\r\n [disabled]=\"!week.selectable\"\r\n [ngClass]=\"((selectedWeek$ | async) === week.week) && ((selectedYear$ | async) === week.year)\r\n ? 'ok_button_color'\r\n : 'bg_overlay_rev brdr hov_bg'\"\r\n class=\"access wwp_week_btn\">\r\n <ng-container *ngFor=\"let date of week.dates\">\r\n <div class=\"wwp_day\">\r\n {{date}}\r\n </div>\r\n </ng-container>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_5\"></div>\r\n <div class=\"row space_between\">\r\n <button *ngIf=\"canSelectLastWeek$ | async else disabledLastWeekButton\"\r\n (click)=\"selectLastWeek()\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.selectLastWeek\">\r\n <i class=\"fas fa-chevron-left mar_right5\"></i><span class=\"text bold\">{{text.lastWeek}}</span>\r\n </button>\r\n <ng-template #disabledLastWeekButton>\r\n <button disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.selectLastWeek\">\r\n <i class=\"fas fa-chevron-left mar_right5\"></i><span class=\"text bold\">{{text.lastWeek}}</span>\r\n </button>\r\n </ng-template>\r\n <ng-container *ngIf=\"currentDate.selectable\">\r\n <button *ngIf=\"((selectedWeek$ | async) === currentDate.week) && ((selectedYear$ | async) === currentDate.year) else selectCurrentWeekButton\"\r\n disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.resetWeekSelection\">\r\n <i class=\"fas fa-undo-alt\"></i>\r\n </button>\r\n <ng-template #selectCurrentWeekButton>\r\n <button (click)=\"selectCurrentWeek()\"\r\n particleTooltip=\"Reset to Current Week\"\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetWeekSelection\">\r\n <i class=\"fas fa-undo-alt\"></i>\r\n </button>\r\n </ng-template>\r\n </ng-container>\r\n <button\r\n *ngIf=\"canSelectNextWeek$ | async else disabledNextWeekButton\"\r\n (click)=\"selectNextWeek()\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.selectNextWeek\">\r\n <span class=\"text bold\">{{text.nextWeek}}</span><i class=\"fas fa-chevron-right mar_left5\"></i>\r\n </button>\r\n <ng-template #disabledNextWeekButton>\r\n <button disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.selectNextWeek\">\r\n <span class=\"text bold\">{{text.nextWeek}}</span><i class=\"fas fa-chevron-right mar_left5\"></i>\r\n </button>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</particle-popover>\r\n", styles: [":host{width:100%}.wwp_container{width:100%;min-width:150px;position:relative}.wwp_container:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.wwp_input{position:absolute;inset:0;padding:inherit;padding-right:2.25em;width:100%;-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;border:none;text-align:left;-webkit-user-select:none;user-select:none;background-color:transparent;color:inherit;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.wwp_input:not([disabled]){cursor:pointer}.wwp_input::-ms-expand{display:none}.wwp_button{position:absolute;height:calc(100% + 2px);width:2.25em;top:0;right:0;z-index:var(--z-frame);border-top-left-radius:0!important;border-bottom-left-radius:0!important;font-size:inherit;margin:-1px;-webkit-user-select:none;user-select:none;pointer-events:none;display:flex;align-items:center;justify-content:center}.wwp_button>svg{transition:all .2s ease}.wwp_container:hover .wwp_button>svg{transform:scale(1.2)}.wwp_placeholder{opacity:.5;display:inline}.wwp_options{border-radius:3px;line-height:1.5;overflow:hidden;font-weight:400;z-index:var(--z-overlay);width:300px;background:#fff0;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.wwp_weekday{font-size:12px;font-weight:900;min-width:30px;height:32px;display:flex;flex:1;align-items:center;justify-content:center;opacity:.8;-webkit-user-select:none;user-select:none}.wwp_week.currentWeek{border-radius:3px;background-color:#8080801a}.wwp_week_btn{display:flex;align-items:center;width:100%;border:none;padding:0;cursor:pointer}.wwp_week_btn:disabled{cursor:default}.wwp_day{font-size:12px;font-weight:400;min-width:14%;height:32px;display:flex;flex:1;border-radius:3px;-webkit-user-select:none;user-select:none;background-color:transparent;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.PopoverComponent, selector: "particle-popover", inputs: ["offset", "width", "height", "classList", "targetOverride", "openDirection", "alignment", "scaleForMobile"], outputs: ["opened", "closed"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[particleTooltip]", inputs: ["particleTooltip", "tooltipPosition", "tooltipDisabled"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
|
|
477
|
-
}
|
|
478
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: WeekPickerComponent, decorators: [{
|
|
479
|
-
type: Component,
|
|
480
|
-
args: [{ selector: 'particle-week-picker', providers: [
|
|
481
|
-
{
|
|
482
|
-
provide: NG_VALUE_ACCESSOR,
|
|
483
|
-
useExisting: forwardRef(() => WeekPickerComponent),
|
|
484
|
-
multi: true
|
|
485
|
-
}
|
|
486
|
-
], template: "<div style=\"cursor:default;overflow: hidden;\"\r\n [ngClass]=\"inputClassList ? '' : 'row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir'\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\">\r\n <button (click)=\"openCalendar($event)\"\r\n aria-haspopup=\"dialog\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"ariaLabel + ', ' + text.openCalendar\"\r\n [attr.aria-expanded]=\"calendarPopover.visible\"\r\n [ngClass]=\"inputClassList ? inputClassList : 'clear'\"\r\n type=\"button\"\r\n class=\"access btnset width100 height100 center_center\"\r\n style=\"outline-offset: -2px;\"\r\n >\r\n <div class=\"col size_1 height100 width100 ptl_input_text_size ptl_input_padding v_center\">\r\n <ng-container *ngIf=\"_internalValue | async as internalValue else placeholderTemplate\">\r\n {{internalValue.start | date: dateFormat}} - {{internalValue.end | date: dateFormat}}\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"ent_r2l_txt\">{{text.selectWeek}}...</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"col min_w50 height100 center_center border_left\"\r\n [ngClass]=\"calendarButtonClassList ? calendarButtonClassList : 'bg_overlay ptl_brdr_color'\">\r\n <div class=\"width100 height100 center_center\">\r\n <i class=\"fas fa-calendar-week ptl_input_text_size\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n</div>\r\n\r\n\r\n<!-- week picker input\r\n<div class=\"wwp_container\" style=\"cursor:default;\"\r\n [ngClass]=\"inputClassList\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\">\r\n\r\n <button (click)=\"openCalendar($event)\"\r\n aria-haspopup=\"dialog\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"ariaLabel + ', ' + text.openCalendar\"\r\n [attr.aria-expanded]=\"calendarPopover.visible\"\r\n class=\"access content_color wwp_input\">\r\n <ng-container *ngIf=\"_internalValue | async as internalValue else placeholderTemplate\">\r\n {{internalValue.start | date: dateFormat}} - {{internalValue.end | date: dateFormat}}\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"wwp_placeholder\">{{text.selectWeek}}...</div>\r\n </ng-template>\r\n </button>\r\n <div class=\"wwp_button\" [ngClass]=\"calendarButtonClassList\">\r\n <i class=\"fas fa-calendar-week\"></i>\r\n </div>\r\n</div>\r\n-->\r\n<!-- TODO: instead of offset 1, attach to wwp_container -->\r\n<!-- calendar widget -->\r\n<particle-popover [offset]=\"1\" #calendarPopover>\r\n <!-- month / year select -->\r\n <div class=\"wwp_options\">\r\n <div class=\"content_color pad_5 pad_bot0\">\r\n <div class=\"row space_between\">\r\n <div class=\"col size_1 mar_5\">\r\n <select #yearSelect\r\n [ngModel]=\"_selectedYear | async\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n (change)=\"_selectedYear.next(+yearSelect.value)\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectYear\">\r\n <option *ngFor=\"let year of validYearRange$ | async\"\r\n [value]=\"year\">\r\n {{year}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col size_2 mar_5\">\r\n <select #monthSelect\r\n [ngModel]=\"_selectedMonth | async\"\r\n (change)=\"_selectedMonth.next(+monthSelect.value)\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectMonth\">\r\n <option value=\"0\">{{text.january}}</option>\r\n <option value=\"1\">{{text.february}}</option>\r\n <option value=\"2\">{{text.march}}</option>\r\n <option value=\"3\">{{text.april}}</option>\r\n <option value=\"4\">{{text.may}}</option>\r\n <option value=\"5\">{{text.june}}</option>\r\n <option value=\"6\">{{text.july}}</option>\r\n <option value=\"7\">{{text.august}}</option>\r\n <option value=\"8\">{{text.september}}</option>\r\n <option value=\"9\">{{text.october}}</option>\r\n <option value=\"10\">{{text.november}}</option>\r\n <option value=\"11\">{{text.december}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content_color pad_5\">\r\n <!-- weekdays -->\r\n <div class=\"mar_5 mar_bot10\">\r\n <div class=\"row wrap space_between ptl_input_bg_color ptl_brdr_color border_bottom brad_3 mar_bot5\">\r\n <div class=\"wwp_weekday\">{{text.sundayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.mondayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.tuesdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.wednesdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.thursdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.fridayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.saturdayAbbr}}</div>\r\n </div>\r\n <!-- days -->\r\n <ng-container *ngIf=\"fullMonth$ | async as fullMonth\">\r\n <ng-container *ngFor=\"let week of fullMonth\">\r\n <div class=\"wwp_week\"\r\n [ngClass]=\"{ 'currentWeek': week.week === currentDate.week && week.year === currentDate.year }\">\r\n <button (click)=\"onWeekSelect(week.week, week.selectable)\"\r\n [disabled]=\"!week.selectable\"\r\n [ngClass]=\"((selectedWeek$ | async) === week.week) && ((selectedYear$ | async) === week.year)\r\n ? 'ok_button_color'\r\n : 'bg_overlay_rev brdr hov_bg'\"\r\n class=\"access wwp_week_btn\">\r\n <ng-container *ngFor=\"let date of week.dates\">\r\n <div class=\"wwp_day\">\r\n {{date}}\r\n </div>\r\n </ng-container>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_5\"></div>\r\n <div class=\"row space_between\">\r\n <button *ngIf=\"canSelectLastWeek$ | async else disabledLastWeekButton\"\r\n (click)=\"selectLastWeek()\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.selectLastWeek\">\r\n <i class=\"fas fa-chevron-left mar_right5\"></i><span class=\"text bold\">{{text.lastWeek}}</span>\r\n </button>\r\n <ng-template #disabledLastWeekButton>\r\n <button disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.selectLastWeek\">\r\n <i class=\"fas fa-chevron-left mar_right5\"></i><span class=\"text bold\">{{text.lastWeek}}</span>\r\n </button>\r\n </ng-template>\r\n <ng-container *ngIf=\"currentDate.selectable\">\r\n <button *ngIf=\"((selectedWeek$ | async) === currentDate.week) && ((selectedYear$ | async) === currentDate.year) else selectCurrentWeekButton\"\r\n disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.resetWeekSelection\">\r\n <i class=\"fas fa-undo-alt\"></i>\r\n </button>\r\n <ng-template #selectCurrentWeekButton>\r\n <button (click)=\"selectCurrentWeek()\"\r\n particleTooltip=\"Reset to Current Week\"\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetWeekSelection\">\r\n <i class=\"fas fa-undo-alt\"></i>\r\n </button>\r\n </ng-template>\r\n </ng-container>\r\n <button\r\n *ngIf=\"canSelectNextWeek$ | async else disabledNextWeekButton\"\r\n (click)=\"selectNextWeek()\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.selectNextWeek\">\r\n <span class=\"text bold\">{{text.nextWeek}}</span><i class=\"fas fa-chevron-right mar_left5\"></i>\r\n </button>\r\n <ng-template #disabledNextWeekButton>\r\n <button disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.selectNextWeek\">\r\n <span class=\"text bold\">{{text.nextWeek}}</span><i class=\"fas fa-chevron-right mar_left5\"></i>\r\n </button>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</particle-popover>\r\n", styles: [":host{width:100%}.wwp_container{width:100%;min-width:150px;position:relative}.wwp_container:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.wwp_input{position:absolute;inset:0;padding:inherit;padding-right:2.25em;width:100%;-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;border:none;text-align:left;-webkit-user-select:none;user-select:none;background-color:transparent;color:inherit;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.wwp_input:not([disabled]){cursor:pointer}.wwp_input::-ms-expand{display:none}.wwp_button{position:absolute;height:calc(100% + 2px);width:2.25em;top:0;right:0;z-index:var(--z-frame);border-top-left-radius:0!important;border-bottom-left-radius:0!important;font-size:inherit;margin:-1px;-webkit-user-select:none;user-select:none;pointer-events:none;display:flex;align-items:center;justify-content:center}.wwp_button>svg{transition:all .2s ease}.wwp_container:hover .wwp_button>svg{transform:scale(1.2)}.wwp_placeholder{opacity:.5;display:inline}.wwp_options{border-radius:3px;line-height:1.5;overflow:hidden;font-weight:400;z-index:var(--z-overlay);width:300px;background:#fff0;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.wwp_weekday{font-size:12px;font-weight:900;min-width:30px;height:32px;display:flex;flex:1;align-items:center;justify-content:center;opacity:.8;-webkit-user-select:none;user-select:none}.wwp_week.currentWeek{border-radius:3px;background-color:#8080801a}.wwp_week_btn{display:flex;align-items:center;width:100%;border:none;padding:0;cursor:pointer}.wwp_week_btn:disabled{cursor:default}.wwp_day{font-size:12px;font-weight:400;min-width:14%;height:32px;display:flex;flex:1;border-radius:3px;-webkit-user-select:none;user-select:none;background-color:transparent;align-items:center;justify-content:center}\n"] }]
|
|
487
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { value: [{
|
|
488
|
-
type: Input
|
|
489
|
-
}], disabled: [{
|
|
490
|
-
type: Input
|
|
491
|
-
}], dateRange: [{
|
|
492
|
-
type: Input
|
|
493
|
-
}], inputClassList: [{
|
|
494
|
-
type: Input
|
|
495
|
-
}], calendarButtonClassList: [{
|
|
496
|
-
type: Input
|
|
497
|
-
}], ariaLabel: [{
|
|
498
|
-
type: Input
|
|
499
|
-
}], dateFormat: [{
|
|
500
|
-
type: Input
|
|
501
|
-
}], closeOnSelect: [{
|
|
502
|
-
type: Input
|
|
503
|
-
}], text: [{
|
|
504
|
-
type: Input
|
|
505
|
-
}], weekSelected: [{
|
|
506
|
-
type: Output
|
|
507
|
-
}], calendarPopover: [{
|
|
508
|
-
type: ViewChild,
|
|
509
|
-
args: ['calendarPopover']
|
|
510
|
-
}] } });
|
|
511
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vlay1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL3dlZWstcGlja2VyL3dlZWstcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy93ZWVrLXBpY2tlci93ZWVrLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxHQUFHLEVBQ0gsUUFBUSxFQUNSLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFdBQVcsRUFDWCxHQUFHLEVBQ0osTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxjQUFjLEdBQUksTUFBTSxNQUFNLENBQUM7Ozs7OztBQW1FdEc7O0dBRUc7QUFhSCxNQUFNLE9BQU8sbUJBQW1CO0lBd1dWO0lBdFdwQjs7O09BR0c7SUFDSCxJQUNJLEtBQUssQ0FBQyxLQUFpQztRQUN6QyxJQUFJLEtBQUssRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQy9CLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVuQyxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLEtB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TixZQUFZO3NCQURYLE1BQU07Z0JBT1AsZUFBZTtzQkFEZCxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge1xyXG4gIGFkZCxcclxuICBlbmRPZkRheSxcclxuICBlbmRPZk1vbnRoLFxyXG4gIGVuZE9mV2VlayxcclxuICBnZXRXZWVrLFxyXG4gIGlzRXF1YWwsXHJcbiAgaXNXaXRoaW5JbnRlcnZhbCxcclxuICBzZXRXZWVrLFxyXG4gIHN0YXJ0T2ZXZWVrLFxyXG4gIHN1YlxyXG59IGZyb20gJ2RhdGUtZm5zJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBtYXAsIHNoYXJlUmVwbGF5LCB3aXRoTGF0ZXN0RnJvbSwgIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFBvcG92ZXJDb21wb25lbnQgfSBmcm9tICcuLi9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtXZWVrUGlja2VyVGV4dH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9wYXJ0aWNsZS1jb21wb25lbnQtdGV4dC5tb2RlbCc7XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIERhdGUgYnJva2VuIGRvd24gYnkgZGF5L2RhdGUvd2Vlay9tb250aC95ZWFyXHJcbiAqIHdpdGggZXh0ZW5kZWQgbWV0YWRhdGFcclxuICovXHJcbmRlY2xhcmUgaW50ZXJmYWNlIE1ldGFEYXRlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRheSBvZiB0aGUgd2VlayAoc3RhcnRpbmcgYXQgMClcclxuICAgKi9cclxuICBkYXk6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRheSBvZiB0aGUgbW9udGggKHN0YXJ0aW5nIGF0IDEpXHJcbiAgICovXHJcbiAgZGF0ZTogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgd2VlayBvZiB0aGUgeWVhclxyXG4gICAqL1xyXG4gIHdlZWs6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG1vbnRoIChzdGFydGluZyBhdCAwKVxyXG4gICAqL1xyXG4gIG1vbnRoOiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdWxsIHllYXJcclxuICAgKi9cclxuICB5ZWFyOiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIGRheSBpcyBzZWxlY3RhYmxlXHJcbiAgICovXHJcbiAgc2VsZWN0YWJsZTogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgYSB3ZWVrIG9mIHRoZSB5ZWFyIHdpdGggbWV0YWRhdGFcclxuICovXHJcbmRlY2xhcmUgaW50ZXJmYWNlIE1ldGFXZWVrIHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHdlZWsgb2YgdGhlIHllYXIgKHN0YXJ0aW5nIGF0IDEpXHJcbiAgICovXHJcbiAgd2VlazogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgeWVhciBvZiB0aGUgd2Vla1xyXG4gICAqL1xyXG4gIHllYXI6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgd2VlayBjYW4gYmUgc2VsZWN0ZWQgaW4gdGhlIHdlZWsgcGlja2VyXHJcbiAgICovXHJcbiAgc2VsZWN0YWJsZTogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG51bWVyaWMgZGF0ZXMgb2YgdGhlIGRheXMgaW4gdGhlIHdlZWtcclxuICAgKi9cclxuICBkYXRlczogQXJyYXk8bnVtYmVyPjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudCB0byBhbGxvdyBhIHVzZXIgdG8gc2VsZWN0IGEgd2Vla1xyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdwYXJ0aWNsZS13ZWVrLXBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3dlZWstcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi93ZWVrLXBpY2tlci5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBXZWVrUGlja2VyQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWVrUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSB3ZWVrIHBpY2tlclxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgdmFsdWUodmFsdWU6IHsgc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSB9KSB7XHJcbiAgICBpZiAodmFsdWU/LnN0YXJ0ICYmIHZhbHVlPy5lbmQpIHtcclxuICAgICAgY29uc3Qgc3RhcnRXZWVrID0gZ2V0V2Vlayh2YWx1ZS5zdGFydCk7XHJcbiAgICAgIGNvbnN0IGVuZFdlZWsgPSBnZXRXZWVrKHZhbHVlLmVuZCk7XHJcblxyXG4gICAgICBpZiAoc3RhcnRXZWVrICE9PSBlbmRXZWVrKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGFydCBhbmQgZW5kIG11c3QgYmUgcGFydCBvZiB0aGUgc2FtZSB3ZWVrIG9mIHRoZSB5ZWFyJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUuc3RhcnQuZ2V0RGF5KCkgIT09IDAgfHwgdmFsdWUuZW5kLmdldERheSgpICE9PSA2KSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGFydCBtdXN0IGJlIHRoZSBiZWdpbm5pbmcgb2YgaXRzIHdlZWsgYW5kIGVuZCBtdXN0IGJlIHRoZSBlbmQgb2YgaXRzIHdlZWsnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5faW50ZXJuYWxWYWx1ZS5uZXh0KHZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2ludGVybmFsVmFsdWUubmV4dChudWxsIGFzIGFueSk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkTW9udGgubmV4dCh0aGlzLmN1cnJlbnREYXRlLm1vbnRoKTtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRZZWFyLm5leHQodGhpcy5jdXJyZW50RGF0ZS55ZWFyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlIGFzIGFueTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGRpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB2YWxpZCBkYXRlIGJvdW5kYXJ5IGZvciB0aGUgd2VlayBwaWNrZXJcclxuICAgKiBAcGFyYW0gZGF0ZVJhbmdlXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgZGF0ZVJhbmdlKGRhdGVSYW5nZTogeyBzdGFydD86IERhdGUsIGVuZD86IERhdGUgfSkge1xyXG4gICAgdGhpcy5zZXRTZWxlY3Rpb25JbnRlcnZhbChkYXRlUmFuZ2UpO1xyXG4gICAgdGhpcy5zZXRDdXJyZW50RGF0ZVNlbGVjdGFibGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsYXNzIGxpc3QgdG8gYXBwbHkgdG8gdGhlIGRhdGUgcmFuZ2UgaW5wdXRcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGlucHV0Q2xhc3NMaXN0ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIENsYXNzIGxpc3QgdG8gYXBwbHkgdG8gdGhlIHdlZWsgcGlja2VyIGJ1dHRvblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgY2FsZW5kYXJCdXR0b25DbGFzc0xpc3QgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGFyaWEgbGFiZWwgdG8gYXBwbHkgdG8gdGhlIGRhdGUgcmFuZ2UgaW5wdXRcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGFyaWFMYWJlbCA9ICdEYXRlJztcclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybWF0IGZvciB0aGUgc2VsZWN0ZWQgZGF0ZSByYW5nZSBpbiB0aGUgc2VsZWN0aW9uIHByZXZpZXcuIE11c3RcclxuICAgKiBiZSBhIHZhbGlkIEFuZ3VsYXIgRGF0ZVBpcGUgZm9ybWF0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBkYXRlRm9ybWF0ID0gJ01NL2RkL3knO1xyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSB0aGUgcGlja2VyIHdoZW4gYSBzZWxlY3Rpb24gaXMgbWFkZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgY2xvc2VPblNlbGVjdCA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdGV4dDogV2Vla1BpY2tlclRleHQgPSB7XHJcbiAgICBvcGVuQ2FsZW5kYXI6ICdvcGVuIGNhbGVuZGFyIHRvIHNlbGVjdCB3ZWVrJyxcclxuICAgIHNlbGVjdFdlZWs6ICdTZWxlY3QgYSB3ZWVrJyxcclxuICAgIHNlbGVjdFllYXI6ICdTZWxlY3QgYSB5ZWFyJyxcclxuICAgIHNlbGVjdE1vbnRoOiAnU2VsZWN0IGEgbW9udGgnLFxyXG4gICAgamFudWFyeTogJ0phbnVhcnknLFxyXG4gICAgZmVicnVhcnk6ICdGZWJydWFyeScsXHJcbiAgICBtYXJjaDogJ01hcmNoJyxcclxuICAgIGFwcmlsOiAnQXByaWwnLFxyXG4gICAgbWF5OiAnTWF5JyxcclxuICAgIGp1bmU6ICdKdW5lJyxcclxuICAgIGp1bHk6ICdKdWx5JyxcclxuICAgIGF1Z3VzdDogJ0F1Z3VzdCcsXHJcbiAgICBzZXB0ZW1iZXI6ICdTZXB0ZW1iZXInLFxyXG4gICAgb2N0b2JlcjogJ09jdG9iZXInLFxyXG4gICAgbm92ZW1iZXI6ICdOb3ZlbWJlcicsXHJcbiAgICBkZWNlbWJlcjogJ0RlY2VtYmVyJyxcclxuICAgIHN1bmRheUFiYnI6ICdTdScsXHJcbiAgICBtb25kYXlBYmJyOiAnTW8nLFxyXG4gICAgdHVlc2RheUFiYnI6ICdUdScsXHJcbiAgICB3ZWRuZXNkYXlBYmJyOiAnV2UnLFxyXG4gICAgdGh1cnNkYXlBYmJyOiAnVGgnLFxyXG4gICAgZnJpZGF5QWJicjogJ0ZyJyxcclxuICAgIHNhdHVyZGF5QWJicjogJ1NhJyxcclxuICAgIHNlbGVjdExhc3RXZWVrOiAnU2VsZWN0IGxhc3Qgd2VlaycsXHJcbiAgICBsYXN0V2VlazogJ0xhc3QgV2VlaycsXHJcbiAgICByZXNldFdlZWtTZWxlY3Rpb246ICdSZXNldCB3ZWVrIHNlbGVjdGlvbiB0byBjdXJyZW50IHdlZWsnLFxyXG4gICAgc2VsZWN0TmV4dFdlZWs6ICdTZWxlY3QgbmV4dCB3ZWVrJyxcclxuICAgIG5leHRXZWVrOiAnTmV4dCBXZWVrJ1xyXG4gIH0gYXMgV2Vla1BpY2tlclRleHQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgb24gd2VlayBzZWxlY3RcclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICB3ZWVrU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSB9PigpO1xyXG5cclxuICAvKipcclxuICAgKiBWaWV3Q2hpbGQgb2YgdGhlIGNhbGVuZGFyIHBvcG92ZXJcclxuICAgKi9cclxuICBAVmlld0NoaWxkKCdjYWxlbmRhclBvcG92ZXInKVxyXG4gIGNhbGVuZGFyUG9wb3ZlcjogUG9wb3ZlckNvbXBvbmVudCA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgY3VycmVudCBkYXRlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgY3VycmVudERhdGU6IE1ldGFEYXRlO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIHZhbHVlIG9mIHRoZSB3ZWVrIHBpY2tlclxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9pbnRlcm5hbFZhbHVlID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IHN0YXJ0OiBEYXRlLCBlbmQ6IERhdGUgfT4obnVsbCBhcyBhbnkpO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIHNlbGVjdGFibGUgZGF0ZSByYW5nZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF92YWxpZFNlbGVjdGlvbkludGVydmFsID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IHN0YXJ0OiBEYXRlLCBlbmQ6IERhdGUgfT4obnVsbCBhcyBhbnkpO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtb250aFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9zZWxlY3RlZE1vbnRoID0gbmV3IEJlaGF2aW9yU3ViamVjdCgwKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQmVoYXZpb3JTdWJqZWN0IHRyYWNraW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgeWVhclxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9zZWxlY3RlZFllYXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDE5NzApO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2VsZWN0ZWQgd2VlayBvZiB0aGUgeWVhciBvZiB0aGUgc3RhcnQgb2YgdGhlIHNlbGVjdGlvbiBhcyBhbiBPYnNlcnZhYmxlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgc2VsZWN0ZWRXZWVrJDogT2JzZXJ2YWJsZTxudW1iZXI+ID0gdGhpcy5faW50ZXJuYWxWYWx1ZS5waXBlKFxyXG4gICAgbWFwKHZhbHVlID0+IHtcclxuICAgICAgcmV0dXJuICF2YWx1ZT8uc3RhcnQgPyAwIDogZ2V0V2Vlayh2YWx1ZS5zdGFydCk7XHJcbiAgICB9KSxcclxuICAgIHNoYXJlUmVwbGF5KClcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgeWVhciBvZiB0aGUgc3RhcnQgb2YgdGhlIHNlbGVjdGVkIHdlZWsgYXMgYW4gT2JzZXJ2YWJsZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHNlbGVjdGVkWWVhciQ6IE9ic2VydmFibGU8bnVtYmVyPiA9IHRoaXMuX2ludGVybmFsVmFsdWUucGlwZShcclxuICAgIG1hcCh2YWx1ZSA9PiB7XHJcbiAgICAgIHJldHVybiAhdmFsdWU/LnN0YXJ0ID8gMCA6IHZhbHVlLnN0YXJ0LmdldEZ1bGxZZWFyKCk7XHJcbiAgICB9KSxcclxuICAgIHNoYXJlUmVwbGF5KClcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIGJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIG5leHQgd2VlayAocmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uKSBpcyBzZWxlY3RhYmxlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgY2FuU2VsZWN0TmV4dFdlZWskOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zZWxlY3RlZFdlZWskLnBpcGUoXHJcbiAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLl92YWxpZFNlbGVjdGlvbkludGVydmFsLCB0aGlzLl9zZWxlY3RlZFllYXIpLFxyXG4gICAgbWFwKChbc2VsZWN0ZWRXZWVrLCBzZWxlY3Rpb25JbnRlcnZhbCwgc2VsZWN0ZWRZZWFyXSkgPT4ge1xyXG4gICAgICBsZXQgY2FuU2VsZWN0ID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAoc2VsZWN0ZWRXZWVrID4gMCAmJiBzZWxlY3Rpb25JbnRlcnZhbCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkWWVhclN0YXJ0ID0gbmV3IERhdGUoc2VsZWN0ZWRZZWFyLCAwLCAxKTtcclxuICAgICAgICBjb25zdCB3ZWVrRGF0ZSA9IHNldFdlZWsoc2VsZWN0ZWRZZWFyU3RhcnQsIHNlbGVjdGVkV2Vlayk7XHJcbiAgICAgICAgY29uc3QgbmV4dFdlZWtEYXRlID0gYWRkKHdlZWtEYXRlLCB7IHdlZWtzOiAxIH0pO1xyXG4gICAgICAgIGNvbnN0IG5leHRXZWVrU3RhcnREYXRlID0gc3RhcnRPZldlZWsobmV4dFdlZWtEYXRlKTtcclxuICAgICAgICBjb25zdCBuZXh0V2Vla0VuZERhdGUgPSBlbmRPZldlZWsobmV4dFdlZWtEYXRlKTtcclxuXHJcbiAgICAgICAgY2FuU2VsZWN0ID0gaXNXaXRoaW5JbnRlcnZhbChuZXh0V2Vla1N0YXJ0RGF0ZSwgc2VsZWN0aW9uSW50ZXJ2YWwpICYmXHJcbiAgICAgICAgICBpc1dpdGhpbkludGVydmFsKG5leHRXZWVrRW5kRGF0ZSwgc2VsZWN0aW9uSW50ZXJ2YWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gY2FuU2VsZWN0O1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIGJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIGxhc3Qgd2VlayAocmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uKSBpcyBzZWxlY3RhYmxlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgY2FuU2VsZWN0TGFzdFdlZWskOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zZWxlY3RlZFdlZWskLnBpcGUoXHJcbiAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLl92YWxpZFNlbGVjdGlvbkludGVydmFsLCB0aGlzLl9zZWxlY3RlZFllYXIpLFxyXG4gICAgbWFwKChbc2VsZWN0ZWRXZWVrLCBzZWxlY3Rpb25JbnRlcnZhbCwgc2VsZWN0ZWRZZWFyXSkgPT4ge1xyXG4gICAgICBsZXQgY2FuU2VsZWN0ID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAoc2VsZWN0ZWRXZWVrID4gMCAmJiBzZWxlY3Rpb25JbnRlcnZhbCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkWWVhclN0YXJ0ID0gbmV3IERhdGUoc2VsZWN0ZWRZZWFyLCAwLCAxKTtcclxuICAgICAgICBjb25zdCB3ZWVrRGF0ZSA9IHNldFdlZWsoc2VsZWN0ZWRZZWFyU3RhcnQsIHNlbGVjdGVkV2Vlayk7XHJcbiAgICAgICAgY29uc3QgbGFzdFdlZWtEYXRlID0gc3ViKHdlZWtEYXRlLCB7IHdlZWtzOiAxIH0pO1xyXG4gICAgICAgIGNvbnN0IGxhc3RXZWVrU3RhcnREYXRlID0gc3RhcnRPZldlZWsobGFzdFdlZWtEYXRlKTtcclxuICAgICAgICBjb25zdCBsYXN0V2Vla0VuZERhdGUgPSBlbmRPZldlZWsobGFzdFdlZWtEYXRlKTtcclxuXHJcbiAgICAgICAgY2FuU2VsZWN0ID0gaXNXaXRoaW5JbnRlcnZhbChsYXN0V2Vla1N0YXJ0RGF0ZSwgc2VsZWN0aW9uSW50ZXJ2YWwpICYmXHJcbiAgICAgICAgICBpc1dpdGhpbkludGVydmFsKGxhc3RXZWVrRW5kRGF0ZSwgc2VsZWN0aW9uSW50ZXJ2YWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gY2FuU2VsZWN0O1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmFuZ2Ugb2Ygc2VsZWN0YWJsZSB5ZWFycyBhcyBhbiBPYnNlcnZhYmxlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgdmFsaWRZZWFyUmFuZ2UkOiBPYnNlcnZhYmxlPEFycmF5PG51bWJlcj4+ID0gdGhpcy5fdmFsaWRTZWxlY3Rpb25JbnRlcnZhbC5waXBlKFxyXG4gICAgbWFwKHNlbGVjdGlvbkludGVydmFsID0+IFdlZWtQaWNrZXJDb21wb25lbnQuZ2VuZXJhdGVZZWFyUmFuZ2UoXHJcbiAgICAgIHNlbGVjdGlvbkludGVydmFsPy5zdGFydD8uZ2V0RnVsbFllYXIoKSA/PyBudWxsLFxyXG4gICAgICBzZWxlY3Rpb25JbnRlcnZhbD8uZW5kPy5nZXRGdWxsWWVhcigpID8/IG51bGwsXHJcbiAgICAgIHRoaXMuY3VycmVudERhdGUueWVhclxyXG4gICAgKSlcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBBbiBhcnJheSBvZiBNZXRhV2Vla3MgcmVwcmVzZW50aW5nIGEgbW9udGggYXMgYW4gT2JzZXJ2YWJsZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGZ1bGxNb250aCQ6IE9ic2VydmFibGU8QXJyYXk8TWV0YVdlZWs+PiA9IGNvbWJpbmVMYXRlc3QoW1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRNb250aCxcclxuICAgIHRoaXMuX3NlbGVjdGVkWWVhcixcclxuICAgIHRoaXMuX3ZhbGlkU2VsZWN0aW9uSW50ZXJ2YWxcclxuICBdKS5waXBlKFxyXG4gICAgbWFwKChbbW9udGgsIHllYXIsIHNlbGVjdGlvbkludGVydmFsXSkgPT4ge1xyXG4gICAgICBsZXQgZnVsbE1vbnRoOiBBcnJheTxNZXRhV2Vlaz4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgICAgIGlmIChzZWxlY3Rpb25JbnRlcnZhbCkge1xyXG4gICAgICAgIGZ1bGxNb250aCA9IFdlZWtQaWNrZXJDb21wb25lbnQuZ2VuZXJhdGVNb250aChcclxuICAgICAgICAgIG1vbnRoLFxyXG4gICAgICAgICAgeWVhcixcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgc3RhcnQ6IHNlbGVjdGlvbkludGVydmFsLnN0YXJ0LFxyXG4gICAgICAgICAgICBlbmQ6IHNlbGVjdGlvbkludGVydmFsLmVuZFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmdWxsTW9udGg7XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgd2VlayBwaWNrZXJcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3ZhbHVlID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgY29udHJvbCBpcyBkaXNhYmxlZFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgYW4gQXJyYXkgb2YgbnVtYmVycyByZXByZXNlbnRpbmcgdGhlIHNwYW4gb2YgeWVhcnMgYmV0d2VlbiB0aGUgaW5wdXRcclxuICAgKiBAcGFyYW0gbWluWWVhciB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlXHJcbiAgICogQHBhcmFtIG1heFllYXIgdGhlIGVuZCBvZiB0aGUgcmFuZ2VcclxuICAgKiBAcGFyYW0gY3VycmVudFllYXIgdGhlIGN1cnJlbnQgeWVhclxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlWWVhclJhbmdlKG1pblllYXI6IG51bWJlciwgbWF4WWVhcjogbnVtYmVyLCBjdXJyZW50WWVhcjogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXI7XHJcbiAgICBpZiAoIW1pblllYXIgJiYgbWF4WWVhcikge1xyXG4gICAgICBzdGFydCA9IG1heFllYXIgPSA1MDtcclxuICAgICAgZW5kID0gbWF4WWVhcjtcclxuICAgIH0gZWxzZSBpZiAobWluWWVhciAmJiAhbWF4WWVhcikge1xyXG4gICAgICBzdGFydCA9IG1pblllYXI7XHJcbiAgICAgIGVuZCA9IG1pblllYXIgKyA1MDtcclxuICAgIH0gZWxzZSBpZiAobWluWWVhciAmJiBtYXhZZWFyKSB7XHJcbiAgICAgIHN0YXJ0ID0gbWluWWVhcjtcclxuICAgICAgZW5kID0gbWF4WWVhcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0YXJ0ID0gY3VycmVudFllYXIgLSAxMDA7XHJcbiAgICAgIGVuZCA9IGN1cnJlbnRZZWFyICsgNTA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmFuZ2U6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xyXG4gICAgICByYW5nZS5wdXNoKGkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByYW5nZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgbW9udGggd2l0aCB3ZWVrIGFuZCBzZWxlY3RhYmxlIHN0YXR1cyBtZXRhZGF0YVxyXG4gICAqIEBwYXJhbSBtb250aCB0aGUgbW9udGggdG8gZ2VuZXJhdGVcclxuICAgKiBAcGFyYW0geWVhciB0aGUgeWVhciBvZiB0aGUgbW9udGggdG8gZ2VuZXJhdGVcclxuICAgKiBAcGFyYW0gc2VsZWN0aW9uSW50ZXJ2YWwgdGhlIGludGVydmFsIHJlcHJlc2VudGluZyB0aGVcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0gdG8gdGhlIG1heGltdW0gd2VlayBvZiB0aGUgeWVhclxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVNb250aChtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIsIHNlbGVjdGlvbkludGVydmFsOiB7IHN0YXJ0OiBEYXRlLCBlbmQ6IERhdGUgfSk6IEFycmF5PE1ldGFXZWVrPiB7XHJcbiAgICBjb25zdCBtZXRhTW9udGg6IEFycmF5PE1ldGFXZWVrPiA9IFtdO1xyXG4gICAgY29uc3Qgc3RhcnRPZk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xyXG4gICAgY29uc3QgbW9udGhJbnRlcnZhbCA9IHsgc3RhcnQ6IHN0YXJ0T2ZNb250aCwgZW5kOiBlbmRPZk1vbnRoKHN0YXJ0T2ZNb250aCkgfTtcclxuICAgIGxldCBzY3JvbGxEYXRlID0gc3ViKHN0YXJ0T2ZNb250aCwgeyBkYXlzOiBzdGFydE9mTW9udGguZ2V0RGF5KCkgfSk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcclxuICAgICAgY29uc3Qgc3VuZGF5T2ZXZWVrID0gc3ViKHNjcm9sbERhdGUsIHsgZGF5czogc2Nyb2xsRGF0ZS5nZXREYXkoKSB9KTtcclxuICAgICAgY29uc3Qgc2F0dXJkYXlPZldlZWsgPSBhZGQoc2Nyb2xsRGF0ZSwgeyBkYXlzOiA2IC0gc2Nyb2xsRGF0ZS5nZXREYXkoKSB9KTtcclxuXHJcbiAgICAgIG1ldGFNb250aC5wdXNoKHtcclxuICAgICAgICB3ZWVrOiBnZXRXZWVrKHNjcm9sbERhdGUpLFxyXG4gICAgICAgIHllYXI6IHN1bmRheU9mV2Vlay5nZXRGdWxsWWVhcigpLFxyXG4gICAgICAgIHNlbGVjdGFibGU6IChpc1dpdGhpbkludGVydmFsKHN1bmRheU9mV2VlaywgbW9udGhJbnRlcnZhbCkgfHxcclxuICAgICAgICAgIGlzV2l0aGluSW50ZXJ2YWwoc2F0dXJkYXlPZldlZWssIG1vbnRoSW50ZXJ2YWwpKSAmJlxyXG4gICAgICAgICAgaXNXaXRoaW5JbnRlcnZhbChzdW5kYXlPZldlZWssIHNlbGVjdGlvbkludGVydmFsKSAmJlxyXG4gICAgICAgICAgaXNXaXRoaW5JbnRlcnZhbChzYXR1cmRheU9mV2Vlaywgc2VsZWN0aW9uSW50ZXJ2YWwpLFxyXG4gICAgICAgIGRhdGVzOiBbXVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNzsgaisrKSB7XHJcbiAgICAgICAgbWV0YU1vbnRoW2ldLmRhdGVzLnB1c2goc2Nyb2xsRGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgICAgIHNjcm9sbERhdGUgPSBhZGQoc2Nyb2xsRGF0ZSwgeyBkYXlzOiAxIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJldHVybiBtZXRhTW9udGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGlucHV0IGRhdGUgYXMgYSBNZXRhRGF0ZVxyXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIHRyYW5zZm9ybVxyXG4gICAqIEBwYXJhbSBzZWxlY3RhYmxlIHdoZXRoZXIgb3Igbm90IHRoZSBkYXRlIGlzIHNlbGVjdGFibGVcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGdldE1ldGFEYXRlKGRhdGU6IERhdGUsIHNlbGVjdGFibGUgPSBmYWxzZSk6IE1ldGFEYXRlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRheTogZGF0ZS5nZXREYXkoKSxcclxuICAgICAgZGF0ZTogZGF0ZS5nZXREYXRlKCksXHJcbiAgICAgIHdlZWs6IGdldFdlZWsoZGF0ZSksXHJcbiAgICAgIG1vbnRoOiBkYXRlLmdldE1vbnRoKCksXHJcbiAgICAgIHllYXI6IGRhdGUuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgc2VsZWN0YWJsZTogc2VsZWN0YWJsZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRvIGNhbGwgb24gY2hhbmdlXHJcbiAgICovXHJcbiAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRvIGNhbGwgb24gdG91Y2hcclxuICAgKi9cclxuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBEZXBlbmRlbmN5IGluamVjdGlvbiBzaXRlXHJcbiAgICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIHRoZSBBbmd1bGFyIENoYW5nZURldGVjdG9yUmVmXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgIHRoaXMuY3VycmVudERhdGUgPSBXZWVrUGlja2VyQ29tcG9uZW50LmdldE1ldGFEYXRlKG5ldyBEYXRlKCksIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHdlZWsgcGlja2VyXHJcbiAgICovXHJcbiAgZ2V0IHZhbHVlKCk6IHsgc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSB9IHtcclxuICAgIHJldHVybiB0aGlzLl92YWx1ZSBhcyBhbnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgd2hldGhlciB0aGUgY29udHJvbCBpcyBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdyaXRlIHZhbHVlXHJcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB3cml0ZVxyXG4gICAqL1xyXG4gIHdyaXRlVmFsdWUodmFsdWU6IHsgc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSB9KTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgZnVuY3Rpb24gb24gY2hhbmdlXHJcbiAgICogQHBhcmFtIGZuIHRoZSBmdW5jdGlvbiB0byBjaGFuZ2VcclxuICAgKi9cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIGZ1bmN0aW9uIG9uIHRvdWNoXHJcbiAgICogQHBhcmFtIGZuIHRoZSBmdW5jdGlvbiB0byByZWdpc3RlclxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgZGlzYWJsZWQgc3RhdGVcclxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZCB3aGV0aGVyIG9yIG5vdCB0aGUgY29udHJvbCBpcyBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiB0aGUgd2VlayBwaWNrZXIgcG9wb3ZlclxyXG4gICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgdG8gcGFzcyB0byB0aGUgcG9wb3ZlclxyXG4gICAqL1xyXG4gIG9wZW5DYWxlbmRhcihldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb25JbnRlcnZhbCA9IHRoaXMuX3ZhbGlkU2VsZWN0aW9uSW50ZXJ2YWwuZ2V0VmFsdWUoKTtcclxuICAgICAgaWYgKCFzZWxlY3Rpb25JbnRlcnZhbCkge1xyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uSW50ZXJ2YWwobnVsbCBhcyBhbnkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNldEN1cnJlbnREYXRlU2VsZWN0YWJsZSgpO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRNb250aC5uZXh0KHRoaXMuY3VycmVudERhdGUubW9udGgpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkWWVhci5uZXh0KHRoaXMuY3VycmVudERhdGUueWVhcik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5faW50ZXJuYWxWYWx1ZS5uZXh0KHRoaXMudmFsdWUpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkTW9udGgubmV4dCh0aGlzLnZhbHVlLnN0YXJ0LmdldE1vbnRoKCkpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkWWVhci5uZXh0KHRoaXMudmFsdWUuc3RhcnQuZ2V0RnVsbFllYXIoKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2FsZW5kYXJQb3BvdmVyLnRvZ2dsZShldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgd2VlayBzZWxlY3RcclxuICAgKiBAcGFyYW0gd2VlayB0aGUgd2VlayBvZiB0aGUgeWVhclxyXG4gICAqIEBwYXJhbSBzZWxlY3RhYmxlIHdoZXRoZXIgb3Igbm90IHRoZSB3ZWVrIGlzIHNlbGVjdGFibGVcclxuICAgKi9cclxuICBvbldlZWtTZWxlY3Qod2VlazogbnVtYmVyLCBzZWxlY3RhYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLl9zZWxlY3RlZFllYXIuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0YWJsZSkge1xyXG4gICAgICBjb25zdCB3ZWVrRGF0ZSA9IHNldFdlZWsobmV3IERhdGUoc2VsZWN0ZWRZZWFyLCAwLCAxKSwgd2Vlayk7XHJcbiAgICAgIGNvbnN0IHdlZWtTdGFydCA9IHN0YXJ0T2ZXZWVrKHdlZWtEYXRlKTtcclxuICAgICAgY29uc3Qgd2Vla0VuZCA9IGVuZE9mRGF5KGVuZE9mV2Vlayh3ZWVrRGF0ZSkpO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZFdlZWsgPSB7IHN0YXJ0OiB3ZWVrU3RhcnQsIGVuZDogd2Vla0VuZCB9O1xyXG5cclxuICAgICAgdGhpcy51cGRhdGVNb2RlbChzZWxlY3RlZFdlZWspO1xyXG5cclxuICAgICAgaWYgKHRoaXMuY2xvc2VPblNlbGVjdCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jYWxlbmRhclBvcG92ZXIuY2xvc2UoKSwgMjAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VsZWN0IG5leHQgd2VlayAocmVsYXRpdmUgdG8gdGhlIHdlZWsgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uKVxyXG4gICAqL1xyXG4gIHNlbGVjdE5leHRXZWVrKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbmV4dFdlZWtEYXRlID0gYWRkKHRoaXMudmFsdWUuc3RhcnQsIHsgd2Vla3M6IDEgfSk7XHJcbiAgICBjb25zdCBuZXh0V2Vla1N0YXJ0ID0gc3RhcnRPZldlZWsobmV4dFdlZWtEYXRlKTtcclxuICAgIGNvbnN0IG5leHRXZWVrRW5kID0gZW5kT2ZEYXkoZW5kT2ZXZWVrKG5leHRXZWVrRGF0ZSkpO1xyXG4gICAgY29uc3QgY3VycmVudE1vbnRoID0gdGhpcy52YWx1ZS5zdGFydC5nZXRNb250aCgpO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRXZWVrID0geyBzdGFydDogbmV4dFdlZWtTdGFydCwgZW5kOiBuZXh0V2Vla0VuZCB9O1xyXG5cclxuICAgIHRoaXMudXBkYXRlTW9kZWwoc2VsZWN0ZWRXZWVrKTtcclxuXHJcbiAgICBpZiAobmV4dFdlZWtTdGFydC5nZXRNb250aCgpICE9PSBjdXJyZW50TW9udGgpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRNb250aC5uZXh0KG5leHRXZWVrU3RhcnQuZ2V0TW9udGgoKSk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkWWVhci5uZXh0KG5leHRXZWVrU3RhcnQuZ2V0RnVsbFllYXIoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZWxlY3QgbGFzdCB3ZWVrIChyZWxhdGl2ZSB0byB0aGUgd2VlayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24pXHJcbiAgICovXHJcbiAgc2VsZWN0TGFzdFdlZWsoKTogdm9pZCB7XHJcbiAgICBjb25zdCBsYXN0V2Vla0RhdGUgPSBzdWIodGhpcy52YWx1ZS5zdGFydCwgeyB3ZWVrczogMSB9KTtcclxuICAgIGNvbnN0IGxhc3RXZWVrU3RhcnQgPSBzdGFydE9mV2VlayhsYXN0V2Vla0RhdGUpO1xyXG4gICAgY29uc3QgbGFzdFdlZWtFbmQgPSBlbmRPZkRheShlbmRPZldlZWsobGFzdFdlZWtEYXRlKSk7XHJcbiAgICBjb25zdCBjdXJyZW50TW9udGggPSB0aGlzLnZhbHVlLmVuZC5nZXRNb250aCgpO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRXZWVrID0geyBzdGFydDogbGFzdFdlZWtTdGFydCwgZW5kOiBsYXN0V2Vla0VuZCB9O1xyXG5cclxuICAgIHRoaXMudXBkYXRlTW9kZWwoc2VsZWN0ZWRXZWVrKTtcclxuXHJcbiAgICBpZiAobGFzdFdlZWtFbmQuZ2V0TW9udGgoKSAhPT0gY3VycmVudE1vbnRoKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkTW9udGgubmV4dChsYXN0V2Vla1N0YXJ0LmdldE1vbnRoKCkpO1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZFllYXIubmV4dChsYXN0V2Vla1N0YXJ0LmdldEZ1bGxZZWFyKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VsZWN0IHRoZSBjdXJyZW50IHdlZWtcclxuICAgKi9cclxuICBzZWxlY3RDdXJyZW50V2VlaygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRoaXNXZWVrRGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudERhdGUueWVhciwgdGhpcy5jdXJyZW50RGF0ZS5tb250aCwgdGhpcy5jdXJyZW50RGF0ZS5kYXRlKTtcclxuICAgIGNvbnN0IHRoaXNXZWVrU3RhcnQgPSBzdGFydE9mV2Vlayh0aGlzV2Vla0RhdGUpO1xyXG4gICAgY29uc3QgdGhpc1dlZWtFbmQgPSBlbmRPZkRheShlbmRPZldlZWsodGhpc1dlZWtEYXRlKSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVNb2RlbCh7IHN0YXJ0OiB0aGlzV2Vla1N0YXJ0LCBlbmQ6IHRoaXNXZWVrRW5kIH0pO1xyXG5cclxuICAgIHRoaXMuX3NlbGVjdGVkTW9udGgubmV4dCh0aGlzLmN1cnJlbnREYXRlLm1vbnRoKTtcclxuICAgIHRoaXMuX3NlbGVjdGVkWWVhci5uZXh0KHRoaXMuY3VycmVudERhdGUueWVhcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgbW9kZWxcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgbW9kZWxcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlTW9kZWwodmFsdWU6IHsgc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSB9KTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZUJlZm9yZVVwZGF0ZSA9IHRoaXMudmFsdWU7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgIGlmICghaXNFcXVhbCh2YWx1ZUJlZm9yZVVwZGF0ZS5zdGFydCwgdGhpcy52YWx1ZS5zdGFydCkgJiZcclxuICAgICAgICAhaXNFcXVhbCh2YWx1ZUJlZm9yZVVwZGF0ZS5lbmQsIHRoaXMudmFsdWUuZW5kKSkge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgdGhpcy53ZWVrU2VsZWN0ZWQuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBzZWxlY3Rpb24gaW50ZXJ2YWxcclxuICAgKiBAcGFyYW0gaW50ZXJ2YWwgdGhlIGlucHV0IHNlbGVjdGlvbiBpbnRlcnZhbFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRTZWxlY3Rpb25JbnRlcnZhbChpbnRlcnZhbDogeyBzdGFydD86IERhdGUsIGVuZD86IERhdGUgfSk6IHZvaWQge1xyXG4gICAgaWYgKCFpbnRlcnZhbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YXJ0IGRhdGUgbXVzdCBiZSBsZXNzIHRoYW4gZW5kIGRhdGUnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoKGludGVydmFsIGFzIGFueSk/LnN0YXJ0ID4gKGludGVydmFsIGFzIGFueSk/LmVuZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YXJ0IGRhdGUgbXVzdCBiZSBsZXNzIHRoYW4gZW5kIGRhdGUnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl92YWxpZFNlbGVjdGlvbkludGVydmFsLm5leHQoe1xyXG4gICAgICBzdGFydDogKGludGVydmFsIGFzIGFueSk/LnN0YXJ0ID8/IG5ldyBEYXRlKHRoaXMuY3VycmVudERhdGUueWVhciAtIDEwMCwgMCwgMSksXHJcbiAgICAgIGVuZDogKGludGVydmFsIGFzIGFueSk/LmVuZCA/PyBuZXcgRGF0ZSh0aGlzLmN1cnJlbnREYXRlLnllYXIgKyA1MCwgMTEsIDMxKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHNlbGVjdGFibGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50IGRhdGVcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0Q3VycmVudERhdGVTZWxlY3RhYmxlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uSW50ZXJ2YWwgPSB0aGlzLl92YWxpZFNlbGVjdGlvbkludGVydmFsLmdldFZhbHVlKCk7XHJcbiAgICBjb25zdCBzdGFydE9mQ3VycmVudFdlZWsgPSBzdWIodG9kYXksIHsgZGF5czogdGhpcy5jdXJyZW50RGF0ZS5kYXkgfSk7XHJcbiAgICBjb25zdCBlbmRPZkN1cnJlbnRXZWVrID0gYWRkKHRvZGF5LCB7IGRheXM6IDYgLSB0aGlzLmN1cnJlbnREYXRlLmRheSB9KTtcclxuXHJcbiAgICB0aGlzLmN1cnJlbnREYXRlLnNlbGVjdGFibGUgPSBpc1dpdGhpbkludGVydmFsKHN0YXJ0T2ZDdXJyZW50V2Vlaywgc2VsZWN0aW9uSW50ZXJ2YWwpICYmXHJcbiAgICAgIGlzV2l0aGluSW50ZXJ2YWwoZW5kT2ZDdXJyZW50V2Vlaywgc2VsZWN0aW9uSW50ZXJ2YWwpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IHN0eWxlPVwiY3Vyc29yOmRlZmF1bHQ7b3ZlcmZsb3c6IGhpZGRlbjtcIlxyXG4gICAgIFtuZ0NsYXNzXT1cImlucHV0Q2xhc3NMaXN0ID8gJycgOiAncm93IHB0bF9pbnB1dCBwdGxfaW5wdXRfaGVpZ2h0IHB0bF9pbnB1dF9iZ19jb2xvciBwdGxfYnJkcl9jb2xvciBwdGxfYnJkcl9zaXplIHB0bF9icmRyX3JhZGl1cyBlbnRfcjJsX2RpcidcIlxyXG4gICAgIFtzdHlsZS5maWx0ZXJdPVwiZGlzYWJsZWQgPyAnYnJpZ2h0bmVzcyguOTUpJyA6ICcnXCI+XHJcbiAgPGJ1dHRvbiAoY2xpY2spPVwib3BlbkNhbGVuZGFyKCRldmVudClcIlxyXG4gICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImRpYWxvZ1wiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwgKyAnLCAnICsgdGV4dC5vcGVuQ2FsZW5kYXJcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJjYWxlbmRhclBvcG92ZXIudmlzaWJsZVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJpbnB1dENsYXNzTGlzdCA/IGlucHV0Q2xhc3NMaXN0IDogJ2NsZWFyJ1wiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0bnNldCB3aWR0aDEwMCBoZWlnaHQxMDAgY2VudGVyX2NlbnRlclwiXHJcbiAgICAgICAgICBzdHlsZT1cIm91dGxpbmUtb2Zmc2V0OiAtMnB4O1wiXHJcbiAgPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbCBzaXplXzEgaGVpZ2h0MTAwIHdpZHRoMTAwIHB0bF9pbnB1dF90ZXh0X3NpemUgcHRsX2lucHV0X3BhZGRpbmcgdl9jZW50ZXJcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9pbnRlcm5hbFZhbHVlIHwgYXN5bmMgYXMgaW50ZXJuYWxWYWx1ZSBlbHNlIHBsYWNlaG9sZGVyVGVtcGxhdGVcIj5cclxuICAgICAgICB7e2ludGVybmFsVmFsdWUuc3RhcnQgfCBkYXRlOiBkYXRlRm9ybWF0fX0gLSB7e2ludGVybmFsVmFsdWUuZW5kIHwgZGF0ZTogZGF0ZUZvcm1hdH19XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyVGVtcGxhdGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImVudF9yMmxfdHh0XCI+e3t0ZXh0LnNlbGVjdFdlZWt9fS4uLjwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sIG1pbl93NTAgaGVpZ2h0MTAwIGNlbnRlcl9jZW50ZXIgYm9yZGVyX2xlZnRcIlxyXG4gICAgICAgICBbbmdDbGFzc109XCJjYWxlbmRhckJ1dHRvbkNsYXNzTGlzdCA/IGNhbGVuZGFyQnV0dG9uQ2xhc3NMaXN0IDogJ2JnX292ZXJsYXkgcHRsX2JyZHJfY29sb3InXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3aWR0aDEwMCBoZWlnaHQxMDAgY2VudGVyX2NlbnRlclwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNhbGVuZGFyLXdlZWsgcHRsX2lucHV0X3RleHRfc2l6ZVwiPjwvaT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcblxyXG5cclxuPCEtLSB3ZWVrIHBpY2tlciBpbnB1dFxyXG48ZGl2IGNsYXNzPVwid3dwX2NvbnRhaW5lclwiIHN0eWxlPVwiY3Vyc29yOmRlZmF1bHQ7XCJcclxuICAgICBbbmdDbGFzc109XCJpbnB1dENsYXNzTGlzdFwiXHJcbiAgICAgW3N0eWxlLmZpbHRlcl09XCJkaXNhYmxlZCA/ICdicmlnaHRuZXNzKC45NSknIDogJydcIj5cclxuXHJcbiAgPGJ1dHRvbiAoY2xpY2spPVwib3BlbkNhbGVuZGFyKCRldmVudClcIlxyXG4gICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImRpYWxvZ1wiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwgKyAnLCAnICsgdGV4dC5vcGVuQ2FsZW5kYXJcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJjYWxlbmRhclBvcG92ZXIudmlzaWJsZVwiXHJcbiAgICAgICAgICBjbGFzcz1cImFjY2VzcyBjb250ZW50X2NvbG9yIHd3cF9pbnB1dFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9pbnRlcm5hbFZhbHVlIHwgYXN5bmMgYXMgaW50ZXJuYWxWYWx1ZSBlbHNlIHBsYWNlaG9sZGVyVGVtcGxhdGVcIj5cclxuICAgICAge3tpbnRlcm5hbFZhbHVlLnN0YXJ0IHwgZGF0ZTogZGF0ZUZvcm1hdH19IC0ge3tpbnRlcm5hbFZhbHVlLmVuZCB8IGRhdGU6IGRhdGVGb3JtYXR9fVxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyVGVtcGxhdGU+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3d3BfcGxhY2Vob2xkZXJcIj57e3RleHQuc2VsZWN0V2Vla319Li4uPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvYnV0dG9uPlxyXG4gIDxkaXYgY2xhc3M9XCJ3d3BfYnV0dG9uXCIgW25nQ2xhc3NdPVwiY2FsZW5kYXJCdXR0b25DbGFzc0xpc3RcIj5cclxuICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNhbGVuZGFyLXdlZWtcIj48L2k+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4tLT5cclxuPCEtLSBUT0RPOiBpbnN0ZWFkIG9mIG9mZnNldCAxLCBhdHRhY2ggdG8gd3dwX2NvbnRhaW5lciAtLT5cclxuPCEtLSBjYWxlbmRhciB3aWRnZXQgLS0+XHJcbjxwYXJ0aWNsZS1wb3BvdmVyIFtvZmZzZXRdPVwiMVwiICNjYWxlbmRhclBvcG92ZXI+XHJcbiAgPCEtLSBtb250aCAvIHllYXIgc2VsZWN0IC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ3d3Bfb3B0aW9uc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnRfY29sb3IgcGFkXzUgcGFkX2JvdDBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBzcGFjZV9iZXR3ZWVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzaXplXzEgbWFyXzVcIj5cclxuICAgICAgICAgIDxzZWxlY3QgI3llYXJTZWxlY3RcclxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiX3NlbGVjdGVkWWVhciB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kaWFsb2ctY2xvc2Utb3ZlcnJpZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiX3NlbGVjdGVkWWVhci5uZXh0KCt5ZWFyU2VsZWN0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGlucHV0IHNtIGNvbnRlbnRfY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VsZWN0WWVhclwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHZhbGlkWWVhclJhbmdlJCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwieWVhclwiPlxyXG4gICAgICAgICAgICAgIHt7eWVhcn19XHJcbiAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzaXplXzIgbWFyXzVcIj5cclxuICAgICAgICAgIDxzZWxlY3QgI21vbnRoU2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIl9zZWxlY3RlZE1vbnRoIHwgYXN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIl9zZWxlY3RlZE1vbnRoLm5leHQoK21vbnRoU2VsZWN0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGlucHV0IHNtIGNvbnRlbnRfY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VsZWN0TW9udGhcIj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjBcIj57e3RleHQuamFudWFyeX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxXCI+e3t0ZXh0LmZlYnJ1YXJ5fX08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjJcIj57e3RleHQubWFyY2h9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiM1wiPnt7dGV4dC5hcHJpbH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI0XCI+e3t0ZXh0Lm1heX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI1XCI+e3t0ZXh0Lmp1bmV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNlwiPnt7dGV4dC5qdWx5fX08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjdcIj57e3RleHQuYXVndXN0fX08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjhcIj57e3RleHQuc2VwdGVtYmVyfX08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjlcIj57e3RleHQub2N0b2Jlcn19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMFwiPnt7dGV4dC5ub3ZlbWJlcn19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMVwiPnt7dGV4dC5kZWNlbWJlcn19PC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50X2NvbG9yIHBhZF81XCI+XHJcbiAgICAgIDwhLS0gd2Vla2RheXMgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNSBtYXJfYm90MTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHdyYXAgc3BhY2VfYmV0d2VlbiBwdGxfaW5wdXRfYmdfY29sb3IgcHRsX2JyZHJfY29sb3IgYm9yZGVyX2JvdHRvbSBicmFkXzMgbWFyX2JvdDVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3d3Bfd2Vla2RheVwiPnt7dGV4dC5zdW5kYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3d3Bfd2Vla2RheVwiPnt7dGV4dC5tb25kYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3d3Bfd2Vla2RheVwiPnt7dGV4dC50dWVzZGF5QWJicn19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid3dwX3dlZWtkYXlcIj57e3RleHQud2VkbmVzZGF5QWJicn19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid3dwX3dlZWtkYXlcIj57e3RleHQudGh1cnNkYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3d3Bfd2Vla2RheVwiPnt7dGV4dC5mcmlkYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3d3Bfd2Vla2RheVwiPnt7dGV4dC5zYXR1cmRheUFiYnJ9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gZGF5cyAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZnVsbE1vbnRoJCB8IGFzeW5jIGFzIGZ1bGxNb250aFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgd2VlayBvZiBmdWxsTW9udGhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInd3cF93ZWVrXCJcclxuICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdjdXJyZW50V2Vlayc6IHdlZWsud2VlayA9PT0gY3VycmVudERhdGUud2VlayAmJiB3ZWVrLnllYXIgPT09IGN1cnJlbnREYXRlLnllYXIgfVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uV2Vla1NlbGVjdCh3ZWVrLndlZWssIHdlZWsuc2VsZWN0YWJsZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF3ZWVrLnNlbGVjdGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKChzZWxlY3RlZFdlZWskIHwgYXN5bmMpID09PSB3ZWVrLndlZWspICYmICgoc2VsZWN0ZWRZZWFyJCB8IGFzeW5jKSA9PT0gd2Vlay55ZWFyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdva19idXR0b25fY29sb3InXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JnX292ZXJsYXlfcmV2IGJyZHIgaG92X2JnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyB3d3Bfd2Vla19idG5cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGUgb2Ygd2Vlay5kYXRlc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3dwX2RheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ZGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmdfb3ZlcmxheSBicmRyIGhyIG1hcl81XCI+PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgc3BhY2VfYmV0d2VlblwiPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJjYW5TZWxlY3RMYXN0V2VlayQgfCBhc3luYyBlbHNlIGRpc2FibGVkTGFzdFdlZWtCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExhc3RXZWVrKClcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuIHNtIGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyXzUgaG92X2JnXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWxlY3RMYXN0V2Vla1wiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IG1hcl9yaWdodDVcIj48L2k+PHNwYW4gY2xhc3M9XCJ0ZXh0IGJvbGRcIj57e3RleHQubGFzdFdlZWt9fTwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc2FibGVkTGFzdFdlZWtCdXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0biBzbSBtYXJfNVwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWxlY3RMYXN0V2Vla1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgbWFyX3JpZ2h0NVwiPjwvaT48c3BhbiBjbGFzcz1cInRleHQgYm9sZFwiPnt7dGV4dC5sYXN0V2Vla319PC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudERhdGUuc2VsZWN0YWJsZVwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIigoc2VsZWN0ZWRXZWVrJCB8IGFzeW5jKSA9PT0gY3VycmVudERhdGUud2VlaykgJiYgKChzZWxlY3RlZFllYXIkIHwgYXN5bmMpID09PSBjdXJyZW50RGF0ZS55ZWFyKSBlbHNlIHNlbGVjdEN1cnJlbnRXZWVrQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWRcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuIHNtIG1hcl81XCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LnJlc2V0V2Vla1NlbGVjdGlvblwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS11bmRvLWFsdFwiPjwvaT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZWxlY3RDdXJyZW50V2Vla0J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2VsZWN0Q3VycmVudFdlZWsoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydGljbGVUb29sdGlwPVwiUmVzZXQgdG8gQ3VycmVudCBXZWVrXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBidG4gc20gYmdfb3ZlcmxheV9yZXYgYnJkciBob3ZfYmcgbWFyXzVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5yZXNldFdlZWtTZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS11bmRvLWFsdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICpuZ0lmPVwiY2FuU2VsZWN0TmV4dFdlZWskIHwgYXN5bmMgZWxzZSBkaXNhYmxlZE5leHRXZWVrQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3ROZXh0V2VlaygpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0biBzbSBiZ19vdmVybGF5X3JldiBicmRyIG1hcl81IGhvdl9iZ1wiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VsZWN0TmV4dFdlZWtcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dCBib2xkXCI+e3t0ZXh0Lm5leHRXZWVrfX08L3NwYW4+PGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCBtYXJfbGVmdDVcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNhYmxlZE5leHRXZWVrQnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBidG4gc20gbWFyXzVcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VsZWN0TmV4dFdlZWtcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0IGJvbGRcIj57e3RleHQubmV4dFdlZWt9fTwvc3Bhbj48aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IG1hcl9sZWZ0NVwiPjwvaT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvcGFydGljbGUtcG9wb3Zlcj5cclxuIl19
|