@odx/angular 5.7.0 → 5.7.2
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/CHANGELOG.md +12 -0
- package/components/datepicker/lib/datepicker.component.d.ts +1 -0
- package/components/timepicker/README.md +3 -0
- package/components/timepicker/index.d.ts +7 -0
- package/components/timepicker/lib/components/timepicker-option.component.d.ts +28 -0
- package/components/timepicker/lib/directives/timepicker-input-control.directive.d.ts +44 -0
- package/components/timepicker/lib/timepicker.component.d.ts +82 -0
- package/components/timepicker/lib/timepicker.module.d.ts +10 -0
- package/components/timepicker/lib/timepicker.service.d.ts +57 -0
- package/components/timepicker/lib/timepicker.token.d.ts +9 -0
- package/components/timepicker/lib/utils/generate-time-stamps.d.ts +18 -0
- package/components/timepicker/lib/utils/index.d.ts +2 -0
- package/components/timepicker/lib/utils/ngx-mask-helper.d.ts +22 -0
- package/esm2022/components/datepicker/lib/datepicker.component.mjs +4 -3
- package/esm2022/components/timepicker/index.mjs +8 -0
- package/esm2022/components/timepicker/lib/components/timepicker-option.component.mjs +59 -0
- package/esm2022/components/timepicker/lib/directives/timepicker-input-control.directive.mjs +94 -0
- package/esm2022/components/timepicker/lib/timepicker.component.mjs +213 -0
- package/esm2022/components/timepicker/lib/timepicker.module.mjs +20 -0
- package/esm2022/components/timepicker/lib/timepicker.service.mjs +92 -0
- package/esm2022/components/timepicker/lib/timepicker.token.mjs +9 -0
- package/esm2022/components/timepicker/lib/utils/generate-time-stamps.mjs +52 -0
- package/esm2022/components/timepicker/lib/utils/index.mjs +3 -0
- package/esm2022/components/timepicker/lib/utils/ngx-mask-helper.mjs +34 -0
- package/esm2022/components/timepicker/odx-angular-components-timepicker.mjs +5 -0
- package/esm2022/localization/lib/localization.config.mjs +5 -4
- package/esm2022/localization/lib/localization.service.mjs +18 -5
- package/fesm2022/odx-angular-components-datepicker.mjs +3 -2
- package/fesm2022/odx-angular-components-datepicker.mjs.map +1 -1
- package/fesm2022/odx-angular-components-timepicker.mjs +548 -0
- package/fesm2022/odx-angular-components-timepicker.mjs.map +1 -0
- package/fesm2022/odx-angular-localization.mjs +22 -8
- package/fesm2022/odx-angular-localization.mjs.map +1 -1
- package/localization/lib/localization.config.d.ts +2 -0
- package/localization/lib/localization.service.d.ts +5 -1
- package/package.json +7 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
var TimepickerComponent_1;
|
|
2
|
+
import { __decorate, __metadata } from "tslib";
|
|
3
|
+
import { A11yModule, ActiveDescendantKeyManager } from '@angular/cdk/a11y';
|
|
4
|
+
import { ChangeDetectionStrategy, Component, HostListener, Input, QueryList, ViewChild, ViewChildren, ViewEncapsulation, booleanAttribute, forwardRef, inject, numberAttribute, } from '@angular/core';
|
|
5
|
+
import { DisabledController, ReadonlyController } from '@odx/angular';
|
|
6
|
+
import { CustomFormControl } from '@odx/angular/cdk/custom-form-control';
|
|
7
|
+
import { ActionGroupComponent } from '@odx/angular/components/action-group';
|
|
8
|
+
import { ButtonComponent } from '@odx/angular/components/button';
|
|
9
|
+
import { DropdownDirective, DropdownModule } from '@odx/angular/components/dropdown';
|
|
10
|
+
import { IconComponent } from '@odx/angular/components/icon';
|
|
11
|
+
import { CSSComponent } from '@odx/angular/internal';
|
|
12
|
+
import { injectElement, isFunction, trackByIndex, untilDestroyed } from '@odx/angular/utils';
|
|
13
|
+
import { TimepickerOptionComponent } from './components/timepicker-option.component';
|
|
14
|
+
import { TimepickerInputControlDirective } from './directives/timepicker-input-control.directive';
|
|
15
|
+
import { TimepickerService } from './timepicker.service';
|
|
16
|
+
import { TIMEPICKER_CONTROL } from './timepicker.token';
|
|
17
|
+
import { generateTimeStamps } from './utils/generate-time-stamps';
|
|
18
|
+
import * as i0 from "@angular/core";
|
|
19
|
+
import * as i1 from "@angular/common";
|
|
20
|
+
import * as i2 from "@odx/angular";
|
|
21
|
+
import * as i3 from "@odx/angular/components/dropdown";
|
|
22
|
+
/**
|
|
23
|
+
* Represents a time picker component allowing users to select a time from a dropdown list.
|
|
24
|
+
* This component integrates with Angular forms and supports customization for locale, time range, and step intervals.
|
|
25
|
+
*
|
|
26
|
+
* @extends {CustomFormControl<string | null>}
|
|
27
|
+
*/
|
|
28
|
+
export let TimepickerComponent = class TimepickerComponent extends CustomFormControl {
|
|
29
|
+
static { TimepickerComponent_1 = this; }
|
|
30
|
+
/**
|
|
31
|
+
* Controls whether the timepicker should use locale-specific time formats AM/PM.
|
|
32
|
+
* @default false
|
|
33
|
+
*/
|
|
34
|
+
set useLocale(val) {
|
|
35
|
+
if (this.value && this.dateField) {
|
|
36
|
+
const time = this.timepickerService.getLocalizedTimeFormat(this.value, val);
|
|
37
|
+
this.updateValue(time);
|
|
38
|
+
this.dateField.nativeElementValue = time;
|
|
39
|
+
}
|
|
40
|
+
this._useLocale = val;
|
|
41
|
+
}
|
|
42
|
+
get useLocale() {
|
|
43
|
+
return this._useLocale;
|
|
44
|
+
}
|
|
45
|
+
constructor() {
|
|
46
|
+
super(null);
|
|
47
|
+
this.timepickerService = inject(TimepickerService);
|
|
48
|
+
this._useLocale = false;
|
|
49
|
+
this.takeUntilDestroyed = untilDestroyed();
|
|
50
|
+
this.trackByIndex = trackByIndex;
|
|
51
|
+
this.element = injectElement();
|
|
52
|
+
/**
|
|
53
|
+
* Controls the step interval between time options in minutes.
|
|
54
|
+
* @default 30
|
|
55
|
+
*/
|
|
56
|
+
this.step = 30;
|
|
57
|
+
/**
|
|
58
|
+
* Specifies the minimum time value that can be selected ('05:00' or '05:00 AM').
|
|
59
|
+
* @default '00:00'
|
|
60
|
+
*/
|
|
61
|
+
this.min = '00:00';
|
|
62
|
+
/**
|
|
63
|
+
* Specifies the maximum time value that can be selected ('22:00' or '10:00 PM').
|
|
64
|
+
* @default '23:59'
|
|
65
|
+
*/
|
|
66
|
+
this.max = '23:59';
|
|
67
|
+
}
|
|
68
|
+
ngAfterViewInit() {
|
|
69
|
+
this.handleDateFieldChanges();
|
|
70
|
+
this.updateInputValue();
|
|
71
|
+
}
|
|
72
|
+
onOpen() {
|
|
73
|
+
this.keyManager = new ActiveDescendantKeyManager(this.options).withHomeAndEnd();
|
|
74
|
+
this.setActiveOptionBasedOnCurrentValue();
|
|
75
|
+
}
|
|
76
|
+
isTimeOptionSelected(option) {
|
|
77
|
+
return this.value === option.value;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Handles the selection of a time option from the dropdown, updating the input field and closing the dropdown.
|
|
81
|
+
*
|
|
82
|
+
* @param {TimepickerOptionComponent} option - The selected time option component.
|
|
83
|
+
*/
|
|
84
|
+
timeSelected(option) {
|
|
85
|
+
if (!option || option.disabled)
|
|
86
|
+
return;
|
|
87
|
+
const time = this.timepickerService.getLocalizedTimeFormat(option.getLabel(), this.useLocale);
|
|
88
|
+
this.dateField && (this.dateField.nativeElementValue = time);
|
|
89
|
+
this.updateValue(time);
|
|
90
|
+
this.dropdown?.close();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Determines whether the specified time is within the allowed time range.
|
|
94
|
+
*
|
|
95
|
+
* @param {string} time - The time to check, in 'HH:mm' or 'HH:mm AM/PM' format.
|
|
96
|
+
* @returns {boolean} True if the time is within the range; otherwise, false.
|
|
97
|
+
*/
|
|
98
|
+
inTimeRange(time) {
|
|
99
|
+
return this.timepickerService.maxValidation(time, this.max) && this.timepickerService.minValidation(time, this.min);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Generates the list of time options based on the configured step interval and locale settings AM/PM.
|
|
103
|
+
*
|
|
104
|
+
* @returns {string[]} An array of time strings in 'HH:mm' format.
|
|
105
|
+
*/
|
|
106
|
+
get timeStampsList() {
|
|
107
|
+
return generateTimeStamps(this.step, this.useLocale);
|
|
108
|
+
}
|
|
109
|
+
handleControllerEvent(event) {
|
|
110
|
+
if (this.readonlyController?.readonly)
|
|
111
|
+
return;
|
|
112
|
+
this.keyManager?.onKeydown(event);
|
|
113
|
+
const activeOption = this.keyManager?.activeItem;
|
|
114
|
+
activeOption && this.scrollToActiveOption(activeOption, { behavior: 'smooth' });
|
|
115
|
+
if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {
|
|
116
|
+
event.preventDefault();
|
|
117
|
+
event.stopImmediatePropagation();
|
|
118
|
+
this.timeSelected(activeOption);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
handleDateFieldChanges() {
|
|
122
|
+
this.dateField?.valueChange$.pipe(this.takeUntilDestroyed()).subscribe((time) => this.updateValue(time ?? null));
|
|
123
|
+
}
|
|
124
|
+
setActiveOptionBasedOnCurrentValue() {
|
|
125
|
+
const isSelected = this.options.find((option) => option.isSelected);
|
|
126
|
+
if (isSelected) {
|
|
127
|
+
this.activateOption(isSelected);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
this.activateNearestTimeOption();
|
|
131
|
+
}
|
|
132
|
+
activateOption(option) {
|
|
133
|
+
this.keyManager && this.keyManager.setActiveItem(option);
|
|
134
|
+
this.scrollToActiveOption(option);
|
|
135
|
+
}
|
|
136
|
+
activateNearestTimeOption() {
|
|
137
|
+
if (!this.value) {
|
|
138
|
+
const currentDate = new Date();
|
|
139
|
+
const isNearest = this.findNearestTimeOption(currentDate);
|
|
140
|
+
if (isNearest) {
|
|
141
|
+
this.activateOption(isNearest);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
findNearestTimeOption(currentDate) {
|
|
146
|
+
const availableTimeSlots = this.options.filter((option) => !option.disabled);
|
|
147
|
+
const nearestTimeValue = this.timepickerService.findClosestDate(availableTimeSlots.map((option) => option.value), `${currentDate.getHours()}:${currentDate.getMinutes()}`);
|
|
148
|
+
return availableTimeSlots.find((option) => option.value === nearestTimeValue);
|
|
149
|
+
}
|
|
150
|
+
updateInputValue() {
|
|
151
|
+
if (this.value && this.dateField) {
|
|
152
|
+
const time = this.timepickerService.getLocalizedTimeFormat(this.value, this.useLocale);
|
|
153
|
+
this.dateField.nativeElementValue = time;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
scrollToActiveOption(option, _opts = {}) {
|
|
157
|
+
if (isFunction(option.element.nativeElement.scrollIntoView)) {
|
|
158
|
+
option.element.nativeElement.scrollIntoView({ block: 'center', ..._opts });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
162
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.12", type: TimepickerComponent, isStandalone: true, selector: "odx-timepicker", inputs: { useLocale: ["useLocale", "useLocale", booleanAttribute], step: ["step", "step", numberAttribute], min: "min", max: "max" }, host: { listeners: { "click": "handleControllerEvent($event)", "keydown": "handleControllerEvent($event)" }, properties: { "attr.readonly": "readonlyController?.readonly || null" } }, providers: [
|
|
163
|
+
DisabledController.connect(),
|
|
164
|
+
ReadonlyController.connect(),
|
|
165
|
+
{
|
|
166
|
+
provide: TIMEPICKER_CONTROL,
|
|
167
|
+
useExisting: forwardRef(() => TimepickerComponent_1),
|
|
168
|
+
},
|
|
169
|
+
], viewQueries: [{ propertyName: "dropdown", first: true, predicate: DropdownDirective, descendants: true }, { propertyName: "dateField", first: true, predicate: TimepickerInputControlDirective, descendants: true }, { propertyName: "options", predicate: TimepickerOptionComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"odx-timepicker__wrapper\">\n <input [value]=\"value\" odxTimepickerControl type=\"text\" />\n</div>\n\n<odx-action-group class=\"odx-no-margin\">\n <button\n #dropdownTrigger\n class=\"odx-timepicker__trigger\"\n odxButton\n size=\"small\"\n variant=\"ghost\"\n aria-label=\"Select time\"\n [odxDropdown]=\"timeList\"\n [odxDropdownOptions]=\"{ matchReferenceWidth: true, position: 'bottom-start', enableFallback: false }\"\n [odxDropdownTriggerElement]=\"dropdownTrigger.element.nativeElement\"\n [odxDropdownReferenceElement]=\"element.nativeElement\"\n (odxDropdownBeforeClose)=\"onTouched()\"\n (odxDropdownAfterOpen)=\"onOpen()\"\n >\n <odx-icon name=\"chevron-down\"></odx-icon>\n </button>\n</odx-action-group>\n\n<ng-template #timeList>\n <div class=\"odx-timepicker__option-list\" role=\"listbox\">\n <odx-timepicker-option\n [value]=\"time\"\n [disabled]=\"!inTimeRange(time)\"\n *ngFor=\"let time of timeStampsList; trackBy: trackByIndex\"\n (selected)=\"timeSelected($event)\"\n >{{ time }}</odx-timepicker-option\n >\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: A11yModule }, { kind: "component", type: ActionGroupComponent, selector: "odx-action-group", inputs: ["reverse"] }, { kind: "component", type: ButtonComponent, selector: "button[odxButton], a[odxButton]", inputs: ["variant", "size"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.DisabledController, selector: "[disabled]", inputs: ["disabled"] }, { kind: "directive", type: i3.DropdownDirective, selector: "[odxDropdown]", inputs: ["odxDropdown", "odxDropdownDisabled", "odxDropdownShowLoader", "odxDropdownClickOutsideActive", "odxDropdownOptions", "odxDropdownReferenceElement", "odxDropdownTriggerElement", "odxDropdownHost", "odxDropdownOpenTrigger", "odxDropdownCloseTrigger"], outputs: ["odxDropdownBeforeOpen", "odxDropdownAfterOpen", "odxDropdownBeforeClose", "odxDropdownAfterClose"], exportAs: ["odxDropdown"] }, { kind: "component", type: TimepickerOptionComponent, selector: "odx-timepicker-option", outputs: ["selected"] }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }, { kind: "directive", type: TimepickerInputControlDirective, selector: "input[odxTimepickerControl]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
170
|
+
};
|
|
171
|
+
TimepickerComponent = TimepickerComponent_1 = __decorate([
|
|
172
|
+
CSSComponent('timepicker'),
|
|
173
|
+
__metadata("design:paramtypes", [])
|
|
174
|
+
], TimepickerComponent);
|
|
175
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerComponent, decorators: [{
|
|
176
|
+
type: Component,
|
|
177
|
+
args: [{ standalone: true, selector: 'odx-timepicker', providers: [
|
|
178
|
+
DisabledController.connect(),
|
|
179
|
+
ReadonlyController.connect(),
|
|
180
|
+
{
|
|
181
|
+
provide: TIMEPICKER_CONTROL,
|
|
182
|
+
useExisting: forwardRef(() => TimepickerComponent),
|
|
183
|
+
},
|
|
184
|
+
], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [A11yModule, ActionGroupComponent, ButtonComponent, DropdownModule, TimepickerOptionComponent, IconComponent, TimepickerInputControlDirective], host: {
|
|
185
|
+
'[attr.readonly]': 'readonlyController?.readonly || null',
|
|
186
|
+
}, template: "<div class=\"odx-timepicker__wrapper\">\n <input [value]=\"value\" odxTimepickerControl type=\"text\" />\n</div>\n\n<odx-action-group class=\"odx-no-margin\">\n <button\n #dropdownTrigger\n class=\"odx-timepicker__trigger\"\n odxButton\n size=\"small\"\n variant=\"ghost\"\n aria-label=\"Select time\"\n [odxDropdown]=\"timeList\"\n [odxDropdownOptions]=\"{ matchReferenceWidth: true, position: 'bottom-start', enableFallback: false }\"\n [odxDropdownTriggerElement]=\"dropdownTrigger.element.nativeElement\"\n [odxDropdownReferenceElement]=\"element.nativeElement\"\n (odxDropdownBeforeClose)=\"onTouched()\"\n (odxDropdownAfterOpen)=\"onOpen()\"\n >\n <odx-icon name=\"chevron-down\"></odx-icon>\n </button>\n</odx-action-group>\n\n<ng-template #timeList>\n <div class=\"odx-timepicker__option-list\" role=\"listbox\">\n <odx-timepicker-option\n [value]=\"time\"\n [disabled]=\"!inTimeRange(time)\"\n *ngFor=\"let time of timeStampsList; trackBy: trackByIndex\"\n (selected)=\"timeSelected($event)\"\n >{{ time }}</odx-timepicker-option\n >\n </div>\n</ng-template>\n" }]
|
|
187
|
+
}], ctorParameters: function () { return []; }, propDecorators: { dropdown: [{
|
|
188
|
+
type: ViewChild,
|
|
189
|
+
args: [DropdownDirective]
|
|
190
|
+
}], options: [{
|
|
191
|
+
type: ViewChildren,
|
|
192
|
+
args: [TimepickerOptionComponent, { emitDistinctChangesOnly: true }]
|
|
193
|
+
}], useLocale: [{
|
|
194
|
+
type: Input,
|
|
195
|
+
args: [{ transform: booleanAttribute }]
|
|
196
|
+
}], step: [{
|
|
197
|
+
type: Input,
|
|
198
|
+
args: [{ transform: numberAttribute }]
|
|
199
|
+
}], min: [{
|
|
200
|
+
type: Input
|
|
201
|
+
}], max: [{
|
|
202
|
+
type: Input
|
|
203
|
+
}], dateField: [{
|
|
204
|
+
type: ViewChild,
|
|
205
|
+
args: [TimepickerInputControlDirective]
|
|
206
|
+
}], handleControllerEvent: [{
|
|
207
|
+
type: HostListener,
|
|
208
|
+
args: ['click', ['$event']]
|
|
209
|
+
}, {
|
|
210
|
+
type: HostListener,
|
|
211
|
+
args: ['keydown', ['$event']]
|
|
212
|
+
}] } });
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90aW1lcGlja2VyL3NyYy9saWIvdGltZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90aW1lcGlja2VyL3NyYy9saWIvdGltZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE1BQU0sRUFDTixlQUFlLEdBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FB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Q0FBQzs7R0FvQmQsbUJBQW1CLENBK0svQjs0RkEvS1ksbUJBQW1CO2tCQW5CL0IsU0FBUztpQ0FDSSxJQUFJLFlBQ04sZ0JBQWdCLGFBRWY7d0JBQ1Qsa0JBQWtCLENBQUMsT0FBTyxFQUFFO3dCQUM1QixrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7d0JBQzVCOzRCQUNFLE9BQU8sRUFBRSxrQkFBa0I7NEJBQzNCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG9CQUFvQixDQUFDO3lCQUNuRDtxQkFDRixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsVUFBVSxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUseUJBQXlCLEVBQUUsYUFBYSxFQUFFLCtCQUErQixDQUFDLFFBQ2pKO3dCQUNKLGlCQUFpQixFQUFFLHNDQUFzQztxQkFDMUQ7MEVBV2tCLFFBQVE7c0JBRDFCLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUlsQixPQUFPO3NCQURoQixZQUFZO3VCQUFDLHlCQUF5QixFQUFFLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFO2dCQVUvRCxTQUFTO3NCQURuQixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQW1CL0IsSUFBSTtzQkFEVixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFROUIsR0FBRztzQkFEVCxLQUFLO2dCQVFDLEdBQUc7c0JBRFQsS0FBSztnQkFJQyxTQUFTO3NCQURmLFNBQVM7dUJBQUMsK0JBQStCO2dCQXVEaEMscUJBQXFCO3NCQUY5QixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ2hDLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQTExeU1vZHVsZSwgQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBudW1iZXJBdHRyaWJ1dGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGlzYWJsZWRDb250cm9sbGVyLCBSZWFkb25seUNvbnRyb2xsZXIgfSBmcm9tICdAb2R4L2FuZ3VsYXInO1xuaW1wb3J0IHsgQ3VzdG9tRm9ybUNvbnRyb2wgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL2N1c3RvbS1mb3JtLWNvbnRyb2wnO1xuaW1wb3J0IHsgT3B0aW9uQ29udHJvbCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jZGsvb3B0aW9uLWNvbnRyb2wnO1xuaW1wb3J0IHsgQWN0aW9uR3JvdXBDb21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9hY3Rpb24tZ3JvdXAnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCB7IERyb3Bkb3duRGlyZWN0aXZlLCBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL2Ryb3Bkb3duJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IENTU0NvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9pbnRlcm5hbCc7XG5pbXBvcnQgeyBpbmplY3RFbGVtZW50LCBpc0Z1bmN0aW9uLCB0cmFja0J5SW5kZXgsIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG9keC9hbmd1bGFyL3V0aWxzJztcbmltcG9ydCB7IFRpbWVwaWNrZXJPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGltZXBpY2tlci1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFRpbWVwaWNrZXJJbnB1dENvbnRyb2xEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvdGltZXBpY2tlci1pbnB1dC1jb250cm9sLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUaW1lcGlja2VyU2VydmljZSB9IGZyb20gJy4vdGltZXBpY2tlci5zZXJ2aWNlJztcbmltcG9ydCB7IFRJTUVQSUNLRVJfQ09OVFJPTCB9IGZyb20gJy4vdGltZXBpY2tlci50b2tlbic7XG5pbXBvcnQgeyBnZW5lcmF0ZVRpbWVTdGFtcHMgfSBmcm9tICcuL3V0aWxzL2dlbmVyYXRlLXRpbWUtc3RhbXBzJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdGltZSBwaWNrZXIgY29tcG9uZW50IGFsbG93aW5nIHVzZXJzIHRvIHNlbGVjdCBhIHRpbWUgZnJvbSBhIGRyb3Bkb3duIGxpc3QuXG4gKiBUaGlzIGNvbXBvbmVudCBpbnRlZ3JhdGVzIHdpdGggQW5ndWxhciBmb3JtcyBhbmQgc3VwcG9ydHMgY3VzdG9taXphdGlvbiBmb3IgbG9jYWxlLCB0aW1lIHJhbmdlLCBhbmQgc3RlcCBpbnRlcnZhbHMuXG4gKlxuICogQGV4dGVuZHMge0N1c3RvbUZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+fVxuICovXG5AQ1NTQ29tcG9uZW50KCd0aW1lcGlja2VyJylcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ29keC10aW1lcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICd0aW1lcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgRGlzYWJsZWRDb250cm9sbGVyLmNvbm5lY3QoKSxcbiAgICBSZWFkb25seUNvbnRyb2xsZXIuY29ubmVjdCgpLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IFRJTUVQSUNLRVJfQ09OVFJPTCxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRpbWVwaWNrZXJDb21wb25lbnQpLFxuICAgIH0sXG4gIF0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbQTExeU1vZHVsZSwgQWN0aW9uR3JvdXBDb21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudCwgRHJvcGRvd25Nb2R1bGUsIFRpbWVwaWNrZXJPcHRpb25Db21wb25lbnQsIEljb25Db21wb25lbnQsIFRpbWVwaWNrZXJJbnB1dENvbnRyb2xEaXJlY3RpdmVdLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLnJlYWRvbmx5XSc6ICdyZWFkb25seUNvbnRyb2xsZXI/LnJlYWRvbmx5IHx8IG51bGwnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUaW1lcGlja2VyQ29tcG9uZW50IGV4dGVuZHMgQ3VzdG9tRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0aW1lcGlja2VyU2VydmljZSA9IGluamVjdChUaW1lcGlja2VyU2VydmljZSk7XG4gIHByaXZhdGUgX3VzZUxvY2FsZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5TWFuYWdlcj86IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyPE9wdGlvbkNvbnRyb2w8c3RyaW5nPj47XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRha2VVbnRpbERlc3Ryb3llZCA9IHVudGlsRGVzdHJveWVkKCk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja0J5SW5kZXggPSB0cmFja0J5SW5kZXg7XG5cbiAgQFZpZXdDaGlsZChEcm9wZG93bkRpcmVjdGl2ZSlcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRyb3Bkb3duPzogRHJvcGRvd25EaXJlY3RpdmU7XG5cbiAgQFZpZXdDaGlsZHJlbihUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50LCB7IGVtaXREaXN0aW5jdENoYW5nZXNPbmx5OiB0cnVlIH0pXG4gIHByb3RlY3RlZCBvcHRpb25zITogUXVlcnlMaXN0PFRpbWVwaWNrZXJPcHRpb25Db21wb25lbnQ+O1xuXG4gIHB1YmxpYyByZWFkb25seSBlbGVtZW50ID0gaW5qZWN0RWxlbWVudCgpO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSB0aW1lcGlja2VyIHNob3VsZCB1c2UgbG9jYWxlLXNwZWNpZmljIHRpbWUgZm9ybWF0cyBBTS9QTS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgc2V0IHVzZUxvY2FsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLmRhdGVGaWVsZCkge1xuICAgICAgY29uc3QgdGltZSA9IHRoaXMudGltZXBpY2tlclNlcnZpY2UuZ2V0TG9jYWxpemVkVGltZUZvcm1hdCh0aGlzLnZhbHVlLCB2YWwpO1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZSh0aW1lKTtcbiAgICAgIHRoaXMuZGF0ZUZpZWxkLm5hdGl2ZUVsZW1lbnRWYWx1ZSA9IHRpbWU7XG4gICAgfVxuICAgIHRoaXMuX3VzZUxvY2FsZSA9IHZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXNlTG9jYWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91c2VMb2NhbGU7XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbHMgdGhlIHN0ZXAgaW50ZXJ2YWwgYmV0d2VlbiB0aW1lIG9wdGlvbnMgaW4gbWludXRlcy5cbiAgICogQGRlZmF1bHQgMzBcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBzdGVwID0gMzA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbWluaW11bSB0aW1lIHZhbHVlIHRoYXQgY2FuIGJlIHNlbGVjdGVkICgnMDU6MDAnIG9yICcwNTowMCBBTScpLlxuICAgKiBAZGVmYXVsdCAnMDA6MDAnXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbWluID0gJzAwOjAwJztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHRpbWUgdmFsdWUgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgKCcyMjowMCcgb3IgJzEwOjAwIFBNJykuXG4gICAqIEBkZWZhdWx0ICcyMzo1OSdcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtYXggPSAnMjM6NTknO1xuXG4gIEBWaWV3Q2hpbGQoVGltZXBpY2tlcklucHV0Q29udHJvbERpcmVjdGl2ZSlcbiAgcHVibGljIGRhdGVGaWVsZD86IFRpbWVwaWNrZXJJbnB1dENvbnRyb2xEaXJlY3RpdmU7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlRGF0ZUZpZWxkQ2hhbmdlcygpO1xuICAgIHRoaXMudXBkYXRlSW5wdXRWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIG9uT3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLmtleU1hbmFnZXIgPSBuZXcgQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXI8T3B0aW9uQ29udHJvbDxzdHJpbmc+Pih0aGlzLm9wdGlvbnMpLndpdGhIb21lQW5kRW5kKCk7XG4gICAgdGhpcy5zZXRBY3RpdmVPcHRpb25CYXNlZE9uQ3VycmVudFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgaXNUaW1lT3B0aW9uU2VsZWN0ZWQob3B0aW9uOiBUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IG9wdGlvbi52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBzZWxlY3Rpb24gb2YgYSB0aW1lIG9wdGlvbiBmcm9tIHRoZSBkcm9wZG93biwgdXBkYXRpbmcgdGhlIGlucHV0IGZpZWxkIGFuZCBjbG9zaW5nIHRoZSBkcm9wZG93bi5cbiAgICpcbiAgICogQHBhcmFtIHtUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50fSBvcHRpb24gLSBUaGUgc2VsZWN0ZWQgdGltZSBvcHRpb24gY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIHRpbWVTZWxlY3RlZChvcHRpb24/OiBUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50KTogdm9pZCB7XG4gICAgaWYgKCFvcHRpb24gfHwgb3B0aW9uLmRpc2FibGVkKSByZXR1cm47XG4gICAgY29uc3QgdGltZSA9IHRoaXMudGltZXBpY2tlclNlcnZpY2UuZ2V0TG9jYWxpemVkVGltZUZvcm1hdChvcHRpb24uZ2V0TGFiZWwoKSwgdGhpcy51c2VMb2NhbGUpO1xuICAgIHRoaXMuZGF0ZUZpZWxkICYmICh0aGlzLmRhdGVGaWVsZC5uYXRpdmVFbGVtZW50VmFsdWUgPSB0aW1lKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlKHRpbWUpO1xuICAgIHRoaXMuZHJvcGRvd24/LmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGltZSBpcyB3aXRoaW4gdGhlIGFsbG93ZWQgdGltZSByYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWUgLSBUaGUgdGltZSB0byBjaGVjaywgaW4gJ0hIOm1tJyBvciAnSEg6bW0gQU0vUE0nIGZvcm1hdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHRpbWUgaXMgd2l0aGluIHRoZSByYW5nZTsgb3RoZXJ3aXNlLCBmYWxzZS5cbiAgICovXG4gIHB1YmxpYyBpblRpbWVSYW5nZSh0aW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aW1lcGlja2VyU2VydmljZS5tYXhWYWxpZGF0aW9uKHRpbWUsIHRoaXMubWF4KSAmJiB0aGlzLnRpbWVwaWNrZXJTZXJ2aWNlLm1pblZhbGlkYXRpb24odGltZSwgdGhpcy5taW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyB0aGUgbGlzdCBvZiB0aW1lIG9wdGlvbnMgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgc3RlcCBpbnRlcnZhbCBhbmQgbG9jYWxlIHNldHRpbmdzIEFNL1BNLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEFuIGFycmF5IG9mIHRpbWUgc3RyaW5ncyBpbiAnSEg6bW0nIGZvcm1hdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGltZVN0YW1wc0xpc3QoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBnZW5lcmF0ZVRpbWVTdGFtcHModGhpcy5zdGVwLCB0aGlzLnVzZUxvY2FsZSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBwcm90ZWN0ZWQgaGFuZGxlQ29udHJvbGxlckV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMucmVhZG9ubHlDb250cm9sbGVyPy5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgdGhpcy5rZXlNYW5hZ2VyPy5vbktleWRvd24oZXZlbnQpO1xuICAgIGNvbnN0IGFjdGl2ZU9wdGlvbiA9IHRoaXMua2V5TWFuYWdlcj8uYWN0aXZlSXRlbSBhcyBUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50O1xuICAgIGFjdGl2ZU9wdGlvbiAmJiB0aGlzLnNjcm9sbFRvQWN0aXZlT3B0aW9uKGFjdGl2ZU9wdGlvbiwgeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnIHx8IGV2ZW50LmtleSA9PT0gJ1NwYWNlYmFyJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy50aW1lU2VsZWN0ZWQoYWN0aXZlT3B0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlRGF0ZUZpZWxkQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGVGaWVsZD8udmFsdWVDaGFuZ2UkLnBpcGUodGhpcy50YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKCh0aW1lKSA9PiB0aGlzLnVwZGF0ZVZhbHVlKHRpbWUgPz8gbnVsbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBY3RpdmVPcHRpb25CYXNlZE9uQ3VycmVudFZhbHVlKCk6IHZvaWQge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLm9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uaXNTZWxlY3RlZCk7XG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuYWN0aXZhdGVPcHRpb24oaXNTZWxlY3RlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmF0ZU5lYXJlc3RUaW1lT3B0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGFjdGl2YXRlT3B0aW9uKG9wdGlvbjogVGltZXBpY2tlck9wdGlvbkNvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMua2V5TWFuYWdlciAmJiB0aGlzLmtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShvcHRpb24pO1xuICAgIHRoaXMuc2Nyb2xsVG9BY3RpdmVPcHRpb24ob3B0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYWN0aXZhdGVOZWFyZXN0VGltZU9wdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGlzTmVhcmVzdCA9IHRoaXMuZmluZE5lYXJlc3RUaW1lT3B0aW9uKGN1cnJlbnREYXRlKTtcbiAgICAgIGlmIChpc05lYXJlc3QpIHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZU9wdGlvbihpc05lYXJlc3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZE5lYXJlc3RUaW1lT3B0aW9uKGN1cnJlbnREYXRlOiBEYXRlKTogVGltZXBpY2tlck9wdGlvbkNvbXBvbmVudCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYXZhaWxhYmxlVGltZVNsb3RzID0gdGhpcy5vcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmRpc2FibGVkKTtcbiAgICBjb25zdCBuZWFyZXN0VGltZVZhbHVlID0gdGhpcy50aW1lcGlja2VyU2VydmljZS5maW5kQ2xvc2VzdERhdGUoXG4gICAgICBhdmFpbGFibGVUaW1lU2xvdHMubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSkgYXMgc3RyaW5nW10sXG4gICAgICBgJHtjdXJyZW50RGF0ZS5nZXRIb3VycygpfToke2N1cnJlbnREYXRlLmdldE1pbnV0ZXMoKX1gLFxuICAgICk7XG5cbiAgICByZXR1cm4gYXZhaWxhYmxlVGltZVNsb3RzLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBuZWFyZXN0VGltZVZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5wdXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLmRhdGVGaWVsZCkge1xuICAgICAgY29uc3QgdGltZSA9IHRoaXMudGltZXBpY2tlclNlcnZpY2UuZ2V0TG9jYWxpemVkVGltZUZvcm1hdCh0aGlzLnZhbHVlLCB0aGlzLnVzZUxvY2FsZSk7XG4gICAgICB0aGlzLmRhdGVGaWVsZC5uYXRpdmVFbGVtZW50VmFsdWUgPSB0aW1lO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9BY3RpdmVPcHRpb24ob3B0aW9uOiBUaW1lcGlja2VyT3B0aW9uQ29tcG9uZW50LCBfb3B0czogU2Nyb2xsSW50b1ZpZXdPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBpZiAoaXNGdW5jdGlvbihvcHRpb24uZWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KSkge1xuICAgICAgb3B0aW9uLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnY2VudGVyJywgLi4uX29wdHMgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwib2R4LXRpbWVwaWNrZXJfX3dyYXBwZXJcIj5cbiAgPGlucHV0IFt2YWx1ZV09XCJ2YWx1ZVwiIG9keFRpbWVwaWNrZXJDb250cm9sIHR5cGU9XCJ0ZXh0XCIgLz5cbjwvZGl2PlxuXG48b2R4LWFjdGlvbi1ncm91cCBjbGFzcz1cIm9keC1uby1tYXJnaW5cIj5cbiAgPGJ1dHRvblxuICAgICNkcm9wZG93blRyaWdnZXJcbiAgICBjbGFzcz1cIm9keC10aW1lcGlja2VyX190cmlnZ2VyXCJcbiAgICBvZHhCdXR0b25cbiAgICBzaXplPVwic21hbGxcIlxuICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgYXJpYS1sYWJlbD1cIlNlbGVjdCB0aW1lXCJcbiAgICBbb2R4RHJvcGRvd25dPVwidGltZUxpc3RcIlxuICAgIFtvZHhEcm9wZG93bk9wdGlvbnNdPVwieyBtYXRjaFJlZmVyZW5jZVdpZHRoOiB0cnVlLCBwb3NpdGlvbjogJ2JvdHRvbS1zdGFydCcsIGVuYWJsZUZhbGxiYWNrOiBmYWxzZSB9XCJcbiAgICBbb2R4RHJvcGRvd25UcmlnZ2VyRWxlbWVudF09XCJkcm9wZG93blRyaWdnZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50XCJcbiAgICBbb2R4RHJvcGRvd25SZWZlcmVuY2VFbGVtZW50XT1cImVsZW1lbnQubmF0aXZlRWxlbWVudFwiXG4gICAgKG9keERyb3Bkb3duQmVmb3JlQ2xvc2UpPVwib25Ub3VjaGVkKClcIlxuICAgIChvZHhEcm9wZG93bkFmdGVyT3Blbik9XCJvbk9wZW4oKVwiXG4gID5cbiAgICA8b2R4LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiPjwvb2R4LWljb24+XG4gIDwvYnV0dG9uPlxuPC9vZHgtYWN0aW9uLWdyb3VwPlxuXG48bmctdGVtcGxhdGUgI3RpbWVMaXN0PlxuICA8ZGl2IGNsYXNzPVwib2R4LXRpbWVwaWNrZXJfX29wdGlvbi1saXN0XCIgcm9sZT1cImxpc3Rib3hcIj5cbiAgICA8b2R4LXRpbWVwaWNrZXItb3B0aW9uXG4gICAgICBbdmFsdWVdPVwidGltZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWluVGltZVJhbmdlKHRpbWUpXCJcbiAgICAgICpuZ0Zvcj1cImxldCB0aW1lIG9mIHRpbWVTdGFtcHNMaXN0OyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIlxuICAgICAgKHNlbGVjdGVkKT1cInRpbWVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgID57eyB0aW1lIH19PC9vZHgtdGltZXBpY2tlci1vcHRpb25cbiAgICA+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CoreModule } from '@odx/angular';
|
|
3
|
+
import { TimepickerOptionComponent } from './components/timepicker-option.component';
|
|
4
|
+
import { TimepickerInputControlDirective } from './directives/timepicker-input-control.directive';
|
|
5
|
+
import { TimepickerComponent } from './timepicker.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
const modules = [TimepickerComponent, TimepickerInputControlDirective, TimepickerOptionComponent];
|
|
8
|
+
export class TimepickerModule {
|
|
9
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
10
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: TimepickerModule, imports: [TimepickerComponent, TimepickerInputControlDirective, TimepickerOptionComponent], exports: [CoreModule, TimepickerComponent, TimepickerInputControlDirective, TimepickerOptionComponent] }); }
|
|
11
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerModule, imports: [TimepickerComponent, CoreModule] }); }
|
|
12
|
+
}
|
|
13
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerModule, decorators: [{
|
|
14
|
+
type: NgModule,
|
|
15
|
+
args: [{
|
|
16
|
+
imports: modules,
|
|
17
|
+
exports: [CoreModule, ...modules],
|
|
18
|
+
}]
|
|
19
|
+
}] });
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90aW1lcGlja2VyL3NyYy9saWIvdGltZXBpY2tlci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUU3RCxNQUFNLE9BQU8sR0FBRyxDQUFDLG1CQUFtQixFQUFFLCtCQUErQixFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFLbEcsTUFBTSxPQUFPLGdCQUFnQjsrR0FBaEIsZ0JBQWdCO2dIQUFoQixnQkFBZ0IsWUFMWixtQkFBbUIsRUFBRSwrQkFBK0IsRUFBRSx5QkFBeUIsYUFHcEYsVUFBVSxFQUhMLG1CQUFtQixFQUFFLCtCQUErQixFQUFFLHlCQUF5QjtnSEFLbkYsZ0JBQWdCLFlBTFosbUJBQW1CLEVBR3hCLFVBQVU7OzRGQUVULGdCQUFnQjtrQkFKNUIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsT0FBTztvQkFDaEIsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDO2lCQUNsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb3JlTW9kdWxlIH0gZnJvbSAnQG9keC9hbmd1bGFyJztcbmltcG9ydCB7IFRpbWVwaWNrZXJPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGltZXBpY2tlci1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFRpbWVwaWNrZXJJbnB1dENvbnRyb2xEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvdGltZXBpY2tlci1pbnB1dC1jb250cm9sLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUaW1lcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi90aW1lcGlja2VyLmNvbXBvbmVudCc7XG5cbmNvbnN0IG1vZHVsZXMgPSBbVGltZXBpY2tlckNvbXBvbmVudCwgVGltZXBpY2tlcklucHV0Q29udHJvbERpcmVjdGl2ZSwgVGltZXBpY2tlck9wdGlvbkNvbXBvbmVudF07XG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBtb2R1bGVzLFxuICBleHBvcnRzOiBbQ29yZU1vZHVsZSwgLi4ubW9kdWxlc10sXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVwaWNrZXJNb2R1bGUge31cbiJdfQ==
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { WindowRef } from '@odx/angular';
|
|
3
|
+
import { isAfter, isBefore, isEqual } from 'date-fns';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Service to provide utility functions for timepicker components, including validation, placeholder generation, and finding the closest time.
|
|
7
|
+
* It also handles locale-based time formatting.
|
|
8
|
+
*/
|
|
9
|
+
export class TimepickerService {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.windowRef = inject(WindowRef);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generates a placeholder string for time input fields.
|
|
15
|
+
*
|
|
16
|
+
* @param {boolean} apm - Specifies if the placeholder should include AM/PM notation.
|
|
17
|
+
* @returns {string} The placeholder string.
|
|
18
|
+
*/
|
|
19
|
+
getPlaceholder(apm = false) {
|
|
20
|
+
return apm ? '--:-- --' : '--:--';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validates if the given time is less than or equal to a maximum time constraint.
|
|
24
|
+
*
|
|
25
|
+
* @param {string} time - The time to validate.
|
|
26
|
+
* @param {string} max - The maximum allowable time.
|
|
27
|
+
* @returns {boolean} True if the time is valid, false otherwise.
|
|
28
|
+
*/
|
|
29
|
+
maxValidation(time, max) {
|
|
30
|
+
const [targetValue, maxValue] = this.convertToDates([time, max]);
|
|
31
|
+
return isBefore(targetValue, maxValue) || isEqual(targetValue, maxValue);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Validates if the given time is greater than or equal to a minimum time constraint.
|
|
35
|
+
*
|
|
36
|
+
* @param {string} time - The time to validate.
|
|
37
|
+
* @param {string} min - The minimum allowable time.
|
|
38
|
+
* @returns {boolean} True if the time is valid, false otherwise.
|
|
39
|
+
*/
|
|
40
|
+
minValidation(time, min) {
|
|
41
|
+
const [targetValue, minValue] = this.convertToDates([time, min]);
|
|
42
|
+
return isAfter(targetValue, minValue) || isEqual(targetValue, minValue);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Finds the closest time to a target time from a list of times.
|
|
46
|
+
*
|
|
47
|
+
* @param {string[]} timeStamps - The list of times to search through.
|
|
48
|
+
* @param {string} targetTime - The target time to find the closest match for.
|
|
49
|
+
* @returns {string} The closest time to the target.
|
|
50
|
+
*/
|
|
51
|
+
findClosestDate(timeStamps, targetTime) {
|
|
52
|
+
const [target] = this.convertToDates([targetTime]);
|
|
53
|
+
const datesArray = this.convertToDates(timeStamps);
|
|
54
|
+
const closestDate = datesArray.reduce((prev, curr) => {
|
|
55
|
+
return Math.abs(curr.getTime() - target.getTime()) < Math.abs(prev.getTime() - target.getTime()) ? curr : prev;
|
|
56
|
+
});
|
|
57
|
+
return this.getLocalizedTimeFormat(`${closestDate.getHours()}:${closestDate.getMinutes()}`);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Formats a time string to a localized time format.
|
|
61
|
+
*
|
|
62
|
+
* @param {string} time - The time string to format.
|
|
63
|
+
* @param {boolean} hour12 - Specifies if the output should use 12-hour format with AM/PM notation.
|
|
64
|
+
* @returns {string} The formatted time string.
|
|
65
|
+
*/
|
|
66
|
+
getLocalizedTimeFormat(time, hour12 = false) {
|
|
67
|
+
const locale = hour12 ? 'en-US' : 'en-GB';
|
|
68
|
+
const [date] = this.convertToDates([time]);
|
|
69
|
+
return new this.windowRef.nativeWindow.Intl.DateTimeFormat(locale, {
|
|
70
|
+
hour: '2-digit',
|
|
71
|
+
minute: '2-digit',
|
|
72
|
+
hour12,
|
|
73
|
+
}).format(date);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Converts an array of time strings to an array of Date objects.
|
|
77
|
+
*
|
|
78
|
+
* @param {string[]} times - The time strings to convert.
|
|
79
|
+
* @returns {Date[]} An array of Date objects corresponding to the input times.
|
|
80
|
+
* @private
|
|
81
|
+
*/
|
|
82
|
+
convertToDates(times) {
|
|
83
|
+
return times.map((time) => new Date(`${time} 2022-12-19`));
|
|
84
|
+
}
|
|
85
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
86
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerService, providedIn: 'root' }); }
|
|
87
|
+
}
|
|
88
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimepickerService, decorators: [{
|
|
89
|
+
type: Injectable,
|
|
90
|
+
args: [{ providedIn: 'root' }]
|
|
91
|
+
}] });
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvdGltZXBpY2tlci9zcmMvbGliL3RpbWVwaWNrZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUFFdEQ7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQUQ5QjtRQUVtQixjQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBaUZoRDtJQS9FQzs7Ozs7T0FLRztJQUNJLGNBQWMsQ0FBQyxHQUFHLEdBQUcsS0FBSztRQUMvQixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWEsQ0FBQyxJQUFZLEVBQUUsR0FBVztRQUM1QyxNQUFNLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRSxPQUFPLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksYUFBYSxDQUFDLElBQVksRUFBRSxHQUFXO1FBQzVDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxlQUFlLENBQUMsVUFBb0IsRUFBRSxVQUFrQjtRQUM3RCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVuRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ25ELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2pILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksc0JBQXNCLENBQUMsSUFBWSxFQUFFLE1BQU0sR0FBRyxLQUFLO1FBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRTtZQUNqRSxJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU07U0FDUCxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxjQUFjLENBQUMsS0FBZTtRQUNwQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7K0dBakZVLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBREosTUFBTTs7NEZBQ25CLGlCQUFpQjtrQkFEN0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpbmRvd1JlZiB9IGZyb20gJ0BvZHgvYW5ndWxhcic7XG5pbXBvcnQgeyBpc0FmdGVyLCBpc0JlZm9yZSwgaXNFcXVhbCB9IGZyb20gJ2RhdGUtZm5zJztcblxuLyoqXG4gKiBTZXJ2aWNlIHRvIHByb3ZpZGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRpbWVwaWNrZXIgY29tcG9uZW50cywgaW5jbHVkaW5nIHZhbGlkYXRpb24sIHBsYWNlaG9sZGVyIGdlbmVyYXRpb24sIGFuZCBmaW5kaW5nIHRoZSBjbG9zZXN0IHRpbWUuXG4gKiBJdCBhbHNvIGhhbmRsZXMgbG9jYWxlLWJhc2VkIHRpbWUgZm9ybWF0dGluZy5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaW1lcGlja2VyU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVmID0gaW5qZWN0KFdpbmRvd1JlZik7XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHBsYWNlaG9sZGVyIHN0cmluZyBmb3IgdGltZSBpbnB1dCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXBtIC0gU3BlY2lmaWVzIGlmIHRoZSBwbGFjZWhvbGRlciBzaG91bGQgaW5jbHVkZSBBTS9QTSBub3RhdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHBsYWNlaG9sZGVyIHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBnZXRQbGFjZWhvbGRlcihhcG0gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGFwbSA/ICctLTotLSAtLScgOiAnLS06LS0nO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBpZiB0aGUgZ2l2ZW4gdGltZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBtYXhpbXVtIHRpbWUgY29uc3RyYWludC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWUgLSBUaGUgdGltZSB0byB2YWxpZGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1heCAtIFRoZSBtYXhpbXVtIGFsbG93YWJsZSB0aW1lLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdGltZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIG1heFZhbGlkYXRpb24odGltZTogc3RyaW5nLCBtYXg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IFt0YXJnZXRWYWx1ZSwgbWF4VmFsdWVdID0gdGhpcy5jb252ZXJ0VG9EYXRlcyhbdGltZSwgbWF4XSk7XG4gICAgcmV0dXJuIGlzQmVmb3JlKHRhcmdldFZhbHVlLCBtYXhWYWx1ZSkgfHwgaXNFcXVhbCh0YXJnZXRWYWx1ZSwgbWF4VmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBpZiB0aGUgZ2l2ZW4gdGltZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBtaW5pbXVtIHRpbWUgY29uc3RyYWludC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWUgLSBUaGUgdGltZSB0byB2YWxpZGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1pbiAtIFRoZSBtaW5pbXVtIGFsbG93YWJsZSB0aW1lLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdGltZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIG1pblZhbGlkYXRpb24odGltZTogc3RyaW5nLCBtaW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IFt0YXJnZXRWYWx1ZSwgbWluVmFsdWVdID0gdGhpcy5jb252ZXJ0VG9EYXRlcyhbdGltZSwgbWluXSk7XG4gICAgcmV0dXJuIGlzQWZ0ZXIodGFyZ2V0VmFsdWUsIG1pblZhbHVlKSB8fCBpc0VxdWFsKHRhcmdldFZhbHVlLCBtaW5WYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgdGltZSB0byBhIHRhcmdldCB0aW1lIGZyb20gYSBsaXN0IG9mIHRpbWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0aW1lU3RhbXBzIC0gVGhlIGxpc3Qgb2YgdGltZXMgdG8gc2VhcmNoIHRocm91Z2guXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRUaW1lIC0gVGhlIHRhcmdldCB0aW1lIHRvIGZpbmQgdGhlIGNsb3Nlc3QgbWF0Y2ggZm9yLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY2xvc2VzdCB0aW1lIHRvIHRoZSB0YXJnZXQuXG4gICAqL1xuICBwdWJsaWMgZmluZENsb3Nlc3REYXRlKHRpbWVTdGFtcHM6IHN0cmluZ1tdLCB0YXJnZXRUaW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IFt0YXJnZXRdID0gdGhpcy5jb252ZXJ0VG9EYXRlcyhbdGFyZ2V0VGltZV0pO1xuICAgIGNvbnN0IGRhdGVzQXJyYXkgPSB0aGlzLmNvbnZlcnRUb0RhdGVzKHRpbWVTdGFtcHMpO1xuXG4gICAgY29uc3QgY2xvc2VzdERhdGUgPSBkYXRlc0FycmF5LnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKGN1cnIuZ2V0VGltZSgpIC0gdGFyZ2V0LmdldFRpbWUoKSkgPCBNYXRoLmFicyhwcmV2LmdldFRpbWUoKSAtIHRhcmdldC5nZXRUaW1lKCkpID8gY3VyciA6IHByZXY7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6ZWRUaW1lRm9ybWF0KGAke2Nsb3Nlc3REYXRlLmdldEhvdXJzKCl9OiR7Y2xvc2VzdERhdGUuZ2V0TWludXRlcygpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSB0aW1lIHN0cmluZyB0byBhIGxvY2FsaXplZCB0aW1lIGZvcm1hdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWUgLSBUaGUgdGltZSBzdHJpbmcgdG8gZm9ybWF0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhvdXIxMiAtIFNwZWNpZmllcyBpZiB0aGUgb3V0cHV0IHNob3VsZCB1c2UgMTItaG91ciBmb3JtYXQgd2l0aCBBTS9QTSBub3RhdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB0aW1lIHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbGl6ZWRUaW1lRm9ybWF0KHRpbWU6IHN0cmluZywgaG91cjEyID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvY2FsZSA9IGhvdXIxMiA/ICdlbi1VUycgOiAnZW4tR0InO1xuICAgIGNvbnN0IFtkYXRlXSA9IHRoaXMuY29udmVydFRvRGF0ZXMoW3RpbWVdKTtcbiAgICByZXR1cm4gbmV3IHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5JbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwge1xuICAgICAgaG91cjogJzItZGlnaXQnLFxuICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICBob3VyMTIsXG4gICAgfSkuZm9ybWF0KGRhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHRpbWUgc3RyaW5ncyB0byBhbiBhcnJheSBvZiBEYXRlIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRpbWVzIC0gVGhlIHRpbWUgc3RyaW5ncyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7RGF0ZVtdfSBBbiBhcnJheSBvZiBEYXRlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgdGltZXMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRUb0RhdGVzKHRpbWVzOiBzdHJpbmdbXSk6IERhdGVbXSB7XG4gICAgcmV0dXJuIHRpbWVzLm1hcCgodGltZSkgPT4gbmV3IERhdGUoYCR7dGltZX0gMjAyMi0xMi0xOWApKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* An InjectionToken used for injecting an instance of TimepickerComponent.
|
|
4
|
+
* This token facilitates the decoupling of the TimepickerComponent's implementation from its consumption,
|
|
5
|
+
* allowing for more flexible and maintainable code, especially in scenarios requiring custom time picker
|
|
6
|
+
* behavior or appearance.
|
|
7
|
+
*/
|
|
8
|
+
export const TIMEPICKER_CONTROL = new InjectionToken('@odx/angular/components/timepicker::TimepickerComponent');
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL3RpbWVwaWNrZXIvc3JjL2xpYi90aW1lcGlja2VyLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0M7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsQ0FBc0IseURBQXlELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaW1lcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi90aW1lcGlja2VyLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQW4gSW5qZWN0aW9uVG9rZW4gdXNlZCBmb3IgaW5qZWN0aW5nIGFuIGluc3RhbmNlIG9mIFRpbWVwaWNrZXJDb21wb25lbnQuXG4gKiBUaGlzIHRva2VuIGZhY2lsaXRhdGVzIHRoZSBkZWNvdXBsaW5nIG9mIHRoZSBUaW1lcGlja2VyQ29tcG9uZW50J3MgaW1wbGVtZW50YXRpb24gZnJvbSBpdHMgY29uc3VtcHRpb24sXG4gKiBhbGxvd2luZyBmb3IgbW9yZSBmbGV4aWJsZSBhbmQgbWFpbnRhaW5hYmxlIGNvZGUsIGVzcGVjaWFsbHkgaW4gc2NlbmFyaW9zIHJlcXVpcmluZyBjdXN0b20gdGltZSBwaWNrZXJcbiAqIGJlaGF2aW9yIG9yIGFwcGVhcmFuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBUSU1FUElDS0VSX0NPTlRST0wgPSBuZXcgSW5qZWN0aW9uVG9rZW48VGltZXBpY2tlckNvbXBvbmVudD4oJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL3RpbWVwaWNrZXI6OlRpbWVwaWNrZXJDb21wb25lbnQnKTtcbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates an array of time stamps within a 24-hour period based on the specified step interval.
|
|
3
|
+
* The time stamps can be formatted in 24-hour format or 12-hour format with AM/PM based on locale preference.
|
|
4
|
+
*
|
|
5
|
+
* @param {number} step - The interval, in minutes, between each time stamp.
|
|
6
|
+
* @param {boolean} useLocale - Determines if the time stamps should use the 12-hour format with AM/PM (`true`) or the 24-hour format (`false`).
|
|
7
|
+
* @returns {string[]} An array of formatted time stamps as strings.
|
|
8
|
+
* @example
|
|
9
|
+
* // Generate time stamps every 30 minutes using 24-hour format
|
|
10
|
+
* generateTimeStamps(30, false);
|
|
11
|
+
* // Returns ["00:00", "00:30", "01:00", ..., "23:30"]
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // Generate time stamps every 60 minutes using 12-hour format with AM/PM
|
|
15
|
+
* generateTimeStamps(60, true);
|
|
16
|
+
* // Returns ["12:00 AM", "01:00 AM", ..., "11:00 PM"]
|
|
17
|
+
*/
|
|
18
|
+
export function generateTimeStamps(step, useLocale) {
|
|
19
|
+
const roundedStep = Math.round(step);
|
|
20
|
+
return Array.from({ length: Math.ceil(24 * (60 / roundedStep)) }, (_, i) => {
|
|
21
|
+
const hours = Math.floor((i * roundedStep) / 60);
|
|
22
|
+
const minutes = (i * roundedStep) % 60;
|
|
23
|
+
return formatTime(hours, minutes, useLocale);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Formats a given time as a string based on the specified hour, minute, and locale preference.
|
|
28
|
+
* Can format time in either 24-hour format or 12-hour format with AM/PM.
|
|
29
|
+
*
|
|
30
|
+
* @param {number} hours - The hour component of the time.
|
|
31
|
+
* @param {number} minutes - The minute component of the time.
|
|
32
|
+
* @param {boolean} useLocale - Determines if the time should be formatted using the 12-hour format with AM/PM (`true`) or the 24-hour format (`false`).
|
|
33
|
+
* @returns {string} The formatted time as a string.
|
|
34
|
+
* @example
|
|
35
|
+
* // Format time using 24-hour format
|
|
36
|
+
* formatTime(14, 30, false); // "14:30"
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* // Format time using 12-hour format with AM/PM
|
|
40
|
+
* formatTime(14, 30, true); // "2:30 PM"
|
|
41
|
+
*/
|
|
42
|
+
function formatTime(hours, minutes, useLocale) {
|
|
43
|
+
if (useLocale) {
|
|
44
|
+
const period = hours >= 12 ? 'PM' : 'AM';
|
|
45
|
+
const displayHours = hours % 12 === 0 ? 12 : hours % 12;
|
|
46
|
+
return `${displayHours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')} ${period}`;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtdGltZS1zdGFtcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90aW1lcGlja2VyL3NyYy9saWIvdXRpbHMvZ2VuZXJhdGUtdGltZS1zdGFtcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsSUFBWSxFQUFFLFNBQWtCO0lBQ2pFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFckMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QyxPQUFPLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQWEsRUFBRSxPQUFlLEVBQUUsU0FBa0I7SUFDcEUsSUFBSSxTQUFTLEVBQUU7UUFDYixNQUFNLE1BQU0sR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6QyxNQUFNLFlBQVksR0FBRyxLQUFLLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3hELE9BQU8sR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztLQUN2RztTQUFNO1FBQ0wsT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7S0FDdEY7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZXMgYW4gYXJyYXkgb2YgdGltZSBzdGFtcHMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBzdGVwIGludGVydmFsLlxuICogVGhlIHRpbWUgc3RhbXBzIGNhbiBiZSBmb3JtYXR0ZWQgaW4gMjQtaG91ciBmb3JtYXQgb3IgMTItaG91ciBmb3JtYXQgd2l0aCBBTS9QTSBiYXNlZCBvbiBsb2NhbGUgcHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gc3RlcCAtIFRoZSBpbnRlcnZhbCwgaW4gbWludXRlcywgYmV0d2VlbiBlYWNoIHRpbWUgc3RhbXAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHVzZUxvY2FsZSAtIERldGVybWluZXMgaWYgdGhlIHRpbWUgc3RhbXBzIHNob3VsZCB1c2UgdGhlIDEyLWhvdXIgZm9ybWF0IHdpdGggQU0vUE0gKGB0cnVlYCkgb3IgdGhlIDI0LWhvdXIgZm9ybWF0IChgZmFsc2VgKS5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2YgZm9ybWF0dGVkIHRpbWUgc3RhbXBzIGFzIHN0cmluZ3MuXG4gKiBAZXhhbXBsZVxuICogLy8gR2VuZXJhdGUgdGltZSBzdGFtcHMgZXZlcnkgMzAgbWludXRlcyB1c2luZyAyNC1ob3VyIGZvcm1hdFxuICogZ2VuZXJhdGVUaW1lU3RhbXBzKDMwLCBmYWxzZSk7XG4gKiAvLyBSZXR1cm5zIFtcIjAwOjAwXCIsIFwiMDA6MzBcIiwgXCIwMTowMFwiLCAuLi4sIFwiMjM6MzBcIl1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2VuZXJhdGUgdGltZSBzdGFtcHMgZXZlcnkgNjAgbWludXRlcyB1c2luZyAxMi1ob3VyIGZvcm1hdCB3aXRoIEFNL1BNXG4gKiBnZW5lcmF0ZVRpbWVTdGFtcHMoNjAsIHRydWUpO1xuICogLy8gUmV0dXJucyBbXCIxMjowMCBBTVwiLCBcIjAxOjAwIEFNXCIsIC4uLiwgXCIxMTowMCBQTVwiXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUaW1lU3RhbXBzKHN0ZXA6IG51bWJlciwgdXNlTG9jYWxlOiBib29sZWFuKTogc3RyaW5nW10ge1xuICBjb25zdCByb3VuZGVkU3RlcCA9IE1hdGgucm91bmQoc3RlcCk7XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGguY2VpbCgyNCAqICg2MCAvIHJvdW5kZWRTdGVwKSkgfSwgKF8sIGkpID0+IHtcbiAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoKGkgKiByb3VuZGVkU3RlcCkgLyA2MCk7XG4gICAgY29uc3QgbWludXRlcyA9IChpICogcm91bmRlZFN0ZXApICUgNjA7XG4gICAgcmV0dXJuIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHVzZUxvY2FsZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBnaXZlbiB0aW1lIGFzIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgaG91ciwgbWludXRlLCBhbmQgbG9jYWxlIHByZWZlcmVuY2UuXG4gKiBDYW4gZm9ybWF0IHRpbWUgaW4gZWl0aGVyIDI0LWhvdXIgZm9ybWF0IG9yIDEyLWhvdXIgZm9ybWF0IHdpdGggQU0vUE0uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGhvdXJzIC0gVGhlIGhvdXIgY29tcG9uZW50IG9mIHRoZSB0aW1lLlxuICogQHBhcmFtIHtudW1iZXJ9IG1pbnV0ZXMgLSBUaGUgbWludXRlIGNvbXBvbmVudCBvZiB0aGUgdGltZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlTG9jYWxlIC0gRGV0ZXJtaW5lcyBpZiB0aGUgdGltZSBzaG91bGQgYmUgZm9ybWF0dGVkIHVzaW5nIHRoZSAxMi1ob3VyIGZvcm1hdCB3aXRoIEFNL1BNIChgdHJ1ZWApIG9yIHRoZSAyNC1ob3VyIGZvcm1hdCAoYGZhbHNlYCkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHRpbWUgYXMgYSBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICogLy8gRm9ybWF0IHRpbWUgdXNpbmcgMjQtaG91ciBmb3JtYXRcbiAqIGZvcm1hdFRpbWUoMTQsIDMwLCBmYWxzZSk7IC8vIFwiMTQ6MzBcIlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3JtYXQgdGltZSB1c2luZyAxMi1ob3VyIGZvcm1hdCB3aXRoIEFNL1BNXG4gKiBmb3JtYXRUaW1lKDE0LCAzMCwgdHJ1ZSk7IC8vIFwiMjozMCBQTVwiXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFRpbWUoaG91cnM6IG51bWJlciwgbWludXRlczogbnVtYmVyLCB1c2VMb2NhbGU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAodXNlTG9jYWxlKSB7XG4gICAgY29uc3QgcGVyaW9kID0gaG91cnMgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICBjb25zdCBkaXNwbGF5SG91cnMgPSBob3VycyAlIDEyID09PSAwID8gMTIgOiBob3VycyAlIDEyO1xuICAgIHJldHVybiBgJHtkaXNwbGF5SG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke21pbnV0ZXMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfSAke3BlcmlvZH1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bWludXRlcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './generate-time-stamps';
|
|
2
|
+
export * from './ngx-mask-helper';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy90aW1lcGlja2VyL3NyYy9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9nZW5lcmF0ZS10aW1lLXN0YW1wcyc7XG5leHBvcnQgKiBmcm9tICcuL25neC1tYXNrLWhlbHBlcic7XG4iXX0=
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Processes and formats a time input value based on specific rules. It adjusts the input for valid time format,
|
|
3
|
+
* especially focusing on single-digit hour inputs, ensuring minute values start with 0 if the last digit is greater
|
|
4
|
+
* than 5, and appending 'M' to AM/PM indicators.
|
|
5
|
+
*
|
|
6
|
+
* @param {string} value - The current input value of the time field.
|
|
7
|
+
* @param {InputEvent} event - The input event triggered by the user's interaction with the field.
|
|
8
|
+
* @returns {string} The processed and potentially reformatted value.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // Prepend 0 to single-digit hours greater than 1
|
|
12
|
+
* processInputValue("2", { inputType: "insertText" }); // Returns "02"
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Ensure minute values are within valid ranges
|
|
16
|
+
* processInputValue("11:8", { inputType: "insertText" }); // Returns "11:08"
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // Append 'M' to AM/PM indicators
|
|
20
|
+
* processInputValue("2 p", { inputType: "insertText" }); // Returns "2 PM"
|
|
21
|
+
*/
|
|
22
|
+
export function processInputValue(value, event) {
|
|
23
|
+
if (value.length === 1 && Number(value) > 1) {
|
|
24
|
+
value = `0${value}`;
|
|
25
|
+
}
|
|
26
|
+
else if (value.length === 4 && Number(value.at(-1)) > 5) {
|
|
27
|
+
value = `${value.slice(0, -1)}0${value.slice(-1)}`;
|
|
28
|
+
}
|
|
29
|
+
if (/[AaPp]/.test(value) && event.inputType === 'insertText') {
|
|
30
|
+
value = `${value.toUpperCase()}M`;
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hc2staGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvdGltZXBpY2tlci9zcmMvbGliL3V0aWxzL25neC1tYXNrLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBYSxFQUFFLEtBQWlCO0lBQ2hFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUMzQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztLQUNyQjtTQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN6RCxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3BEO0lBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssWUFBWSxFQUFFO1FBQzVELEtBQUssR0FBRyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDO0tBQ25DO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcm9jZXNzZXMgYW5kIGZvcm1hdHMgYSB0aW1lIGlucHV0IHZhbHVlIGJhc2VkIG9uIHNwZWNpZmljIHJ1bGVzLiBJdCBhZGp1c3RzIHRoZSBpbnB1dCBmb3IgdmFsaWQgdGltZSBmb3JtYXQsXG4gKiBlc3BlY2lhbGx5IGZvY3VzaW5nIG9uIHNpbmdsZS1kaWdpdCBob3VyIGlucHV0cywgZW5zdXJpbmcgbWludXRlIHZhbHVlcyBzdGFydCB3aXRoIDAgaWYgdGhlIGxhc3QgZGlnaXQgaXMgZ3JlYXRlclxuICogdGhhbiA1LCBhbmQgYXBwZW5kaW5nICdNJyB0byBBTS9QTSBpbmRpY2F0b3JzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBjdXJyZW50IGlucHV0IHZhbHVlIG9mIHRoZSB0aW1lIGZpZWxkLlxuICogQHBhcmFtIHtJbnB1dEV2ZW50fSBldmVudCAtIFRoZSBpbnB1dCBldmVudCB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIncyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBmaWVsZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwcm9jZXNzZWQgYW5kIHBvdGVudGlhbGx5IHJlZm9ybWF0dGVkIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQcmVwZW5kIDAgdG8gc2luZ2xlLWRpZ2l0IGhvdXJzIGdyZWF0ZXIgdGhhbiAxXG4gKiBwcm9jZXNzSW5wdXRWYWx1ZShcIjJcIiwgeyBpbnB1dFR5cGU6IFwiaW5zZXJ0VGV4dFwiIH0pOyAvLyBSZXR1cm5zIFwiMDJcIlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFbnN1cmUgbWludXRlIHZhbHVlcyBhcmUgd2l0aGluIHZhbGlkIHJhbmdlc1xuICogcHJvY2Vzc0lucHV0VmFsdWUoXCIxMTo4XCIsIHsgaW5wdXRUeXBlOiBcImluc2VydFRleHRcIiB9KTsgLy8gUmV0dXJucyBcIjExOjA4XCJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXBwZW5kICdNJyB0byBBTS9QTSBpbmRpY2F0b3JzXG4gKiBwcm9jZXNzSW5wdXRWYWx1ZShcIjIgcFwiLCB7IGlucHV0VHlwZTogXCJpbnNlcnRUZXh0XCIgfSk7IC8vIFJldHVybnMgXCIyIFBNXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHZhbHVlOiBzdHJpbmcsIGV2ZW50OiBJbnB1dEV2ZW50KTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMSAmJiBOdW1iZXIodmFsdWUpID4gMSkge1xuICAgIHZhbHVlID0gYDAke3ZhbHVlfWA7XG4gIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID09PSA0ICYmIE51bWJlcih2YWx1ZS5hdCgtMSkpID4gNSkge1xuICAgIHZhbHVlID0gYCR7dmFsdWUuc2xpY2UoMCwgLTEpfTAke3ZhbHVlLnNsaWNlKC0xKX1gO1xuICB9XG5cbiAgaWYgKC9bQWFQcF0vLnRlc3QodmFsdWUpICYmIGV2ZW50LmlucHV0VHlwZSA9PT0gJ2luc2VydFRleHQnKSB7XG4gICAgdmFsdWUgPSBgJHt2YWx1ZS50b1VwcGVyQ2FzZSgpfU1gO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2R4LWFuZ3VsYXItY29tcG9uZW50cy10aW1lcGlja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvdGltZXBpY2tlci9zcmMvb2R4LWFuZ3VsYXItY29tcG9uZW50cy10aW1lcGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { APP_INITIALIZER, makeEnvironmentProviders } from '@angular/core';
|
|
2
|
-
import { createConfigTokens } from '@odx/angular/utils';
|
|
2
|
+
import { createConfigTokens, getLanguageCode } from '@odx/angular/utils';
|
|
3
3
|
import { LocalizationService } from './localization.service';
|
|
4
|
-
export const
|
|
4
|
+
export const DEFAULT_AVAILABLE_LOCALES = ['en-US', 'en-GB', 'de-DE', 'es-ES', 'fr-FR', 'fr-CA'];
|
|
5
|
+
export const DEFAULT_AVAILABLE_LANGUAGES = Array.from(new Set(DEFAULT_AVAILABLE_LOCALES.map(getLanguageCode)));
|
|
5
6
|
export const { LocalizationConfig, LocalizationDefaultConfig, injectLocalizationConfig, provideLocalizationConfig } = createConfigTokens('Localization', '@odx/angular/internal/translate', {
|
|
6
7
|
availableLanguages: DEFAULT_AVAILABLE_LANGUAGES,
|
|
7
|
-
availableLocales:
|
|
8
|
+
availableLocales: DEFAULT_AVAILABLE_LOCALES,
|
|
8
9
|
});
|
|
9
10
|
export function provideLocalization(config, ...features) {
|
|
10
11
|
return makeEnvironmentProviders([
|
|
@@ -18,4 +19,4 @@ export function provideLocalization(config, ...features) {
|
|
|
18
19
|
features,
|
|
19
20
|
]);
|
|
20
21
|
}
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9uLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9sb2NhbGl6YXRpb24vc3JjL2xpYi9sb2NhbGl6YXRpb24uY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQXdCLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc3RCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEcsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBUS9HLE1BQU0sQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxrQkFBa0IsQ0FDdEksY0FBYyxFQUNkLGlDQUFpQyxFQUNqQztJQUNFLGtCQUFrQixFQUFFLDJCQUEyQjtJQUMvQyxnQkFBZ0IsRUFBRSx5QkFBeUI7Q0FDdEIsQ0FDeEIsQ0FBQztBQUVGLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUFtQyxFQUFFLEdBQUcsUUFBK0I7SUFDekcsT0FBTyx3QkFBd0IsQ0FBQztRQUM5Qix5QkFBeUIsQ0FBQyxNQUFNLENBQUM7UUFDakM7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsQ0FBQyxtQkFBd0MsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUU7WUFDeEcsSUFBSSxFQUFFLENBQUMsbUJBQW1CLENBQUM7WUFDM0IsS0FBSyxFQUFFLElBQUk7U0FDWjtRQUNELFFBQVE7S0FDVCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVBQX0lOSVRJQUxJWkVSLCBFbnZpcm9ubWVudFByb3ZpZGVycywgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVDb25maWdUb2tlbnMsIGdldExhbmd1YWdlQ29kZSB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBMYW5ndWFnZUxvYWRlckZuLCBMb2NhbGl6YXRpb25GZWF0dXJlIH0gZnJvbSAnLi9tb2RlbHMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BVkFJTEFCTEVfTE9DQUxFUyA9IFsnZW4tVVMnLCAnZW4tR0InLCAnZGUtREUnLCAnZXMtRVMnLCAnZnItRlInLCAnZnItQ0EnXTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0FWQUlMQUJMRV9MQU5HVUFHRVMgPSBBcnJheS5mcm9tKG5ldyBTZXQoREVGQVVMVF9BVkFJTEFCTEVfTE9DQUxFUy5tYXAoZ2V0TGFuZ3VhZ2VDb2RlKSkpO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsaXphdGlvbkNvbmZpZyB7XG4gIGFjdGl2ZUxhbmd1YWdlTG9hZGVyPzogTGFuZ3VhZ2VMb2FkZXJGbjtcbiAgYXZhaWxhYmxlTGFuZ3VhZ2VzOiBzdHJpbmdbXTtcbiAgYXZhaWxhYmxlTG9jYWxlczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCB7IExvY2FsaXphdGlvbkNvbmZpZywgTG9jYWxpemF0aW9uRGVmYXVsdENvbmZpZywgaW5qZWN0TG9jYWxpemF0aW9uQ29uZmlnLCBwcm92aWRlTG9jYWxpemF0aW9uQ29uZmlnIH0gPSBjcmVhdGVDb25maWdUb2tlbnMoXG4gICdMb2NhbGl6YXRpb24nLFxuICAnQG9keC9hbmd1bGFyL2ludGVybmFsL3RyYW5zbGF0ZScsXG4gIHtcbiAgICBhdmFpbGFibGVMYW5ndWFnZXM6IERFRkFVTFRfQVZBSUxBQkxFX0xBTkdVQUdFUyxcbiAgICBhdmFpbGFibGVMb2NhbGVzOiBERUZBVUxUX0FWQUlMQUJMRV9MT0NBTEVTLFxuICB9IGFzIExvY2FsaXphdGlvbkNvbmZpZyxcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlTG9jYWxpemF0aW9uKGNvbmZpZzogUGFydGlhbDxMb2NhbGl6YXRpb25Db25maWc+LCAuLi5mZWF0dXJlczogTG9jYWxpemF0aW9uRmVhdHVyZVtdKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICBwcm92aWRlTG9jYWxpemF0aW9uQ29uZmlnKGNvbmZpZyksXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlRmFjdG9yeTogKGxvY2FsaXphdGlvblNlcnZpY2U6IExvY2FsaXphdGlvblNlcnZpY2UpID0+ICgpID0+IGxvY2FsaXphdGlvblNlcnZpY2UubG9hZEFjdGl2ZUxhbmd1YWdlKCksXG4gICAgICBkZXBzOiBbTG9jYWxpemF0aW9uU2VydmljZV0sXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIGZlYXR1cmVzLFxuICBdKTtcbn1cbiJdfQ==
|