@sbb-esta/lyne-elements-dev 5.0.0-next.3-dev.1780293128 → 5.0.0-next.3-dev.1780308310

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.
@@ -34,19 +34,17 @@ var p = ":host{display:inline-flex;min-width:var(--sbb-time-input-max-width);max
34
34
  this.styles = [r(p)];
35
35
  }
36
36
  set value(e) {
37
- e = typeof e == "string" ? e.replace(h, "").substring(0, 5) : "", this._tryParseValue(e), !n && !this.matches(":focus") && this.valueAsDate !== null && (e = this._formatTime()), super.value = e;
37
+ e = typeof e == "string" ? e.replace(h, "").substring(0, 5) : "", this._tryParseValue(e), !n && !this.isSelected() && this.valueAsDate !== null && (e = this._formatTime()), super.value = e;
38
38
  }
39
39
  get value() {
40
40
  return super.value ?? "";
41
41
  }
42
42
  set valueAsDate(e) {
43
- if (e instanceof Date && !isNaN(e.valueOf())) {
44
- this._valueAsTime = {
45
- hours: e.getHours(),
46
- minutes: e.getMinutes()
47
- };
48
- let t = this._formatTime();
49
- this.value !== t && (this.value = t);
43
+ let t = this._toTime(e);
44
+ if (!(this.isSelected() && (t === null || this._isSameTime(t, this._parseValue(this.value))))) if (t) {
45
+ this._valueAsTime = t;
46
+ let e = this._formatTime();
47
+ this.value !== e && (this.value = e);
50
48
  } else this._valueAsTime = null, this.value = "";
51
49
  }
52
50
  get valueAsDate() {
@@ -81,6 +79,15 @@ var p = ":host{display:inline-flex;min-width:var(--sbb-time-input-max-width);max
81
79
  minutes: +n[2] || 0
82
80
  } : null;
83
81
  }
82
+ _toTime(e) {
83
+ return e instanceof Date && !isNaN(e.valueOf()) ? {
84
+ hours: e.getHours(),
85
+ minutes: e.getMinutes()
86
+ } : null;
87
+ }
88
+ _isSameTime(e, t) {
89
+ return !!(e == t || e && t && e.hours === t.hours && e.minutes === t.minutes);
90
+ }
84
91
  _updateValueDateFormat() {
85
92
  if (this.valueAsDate) {
86
93
  let e = this._formatTime();
package/time-input.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as e } from "./time-input.component-DTMCclRN.js";
1
+ import { t as e } from "./time-input.component-j2vUlNKx.js";
2
2
  import "./time-input.pure.js";
3
3
  //#region src/elements/time-input.ts
4
4
  e.define();
@@ -1,2 +1,2 @@
1
- import { t as e } from "./time-input.component-DTMCclRN.js";
1
+ import { t as e } from "./time-input.component-j2vUlNKx.js";
2
2
  export { e as SbbTimeInputElement };
@@ -1,302 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { isServer, unsafeCSS } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbElement, SbbFormAssociatedInputMixin, defaultDateAdapter, i18nDateInvalid, i18nDateMax, i18nDateMin, i18nDatePickerPlaceholder, plainDate, plainDateConverter, readConfig } from "./core.js";
5
- //#region src/elements/date-input/date-input.scss?inline
6
- var date_input_default = ":host {\n display: inline-flex;\n min-width: 9.375rem;\n max-width: 100%;\n cursor: text;\n align-items: center;\n font-weight: normal;\n}\n@media (forced-colors: active) {\n :host {\n color: FieldText;\n }\n}\n\n:host(:disabled) {\n cursor: var(--sbb-cursor-default);\n}\n\n:host(:focus) {\n text-overflow: initial !important;\n}\n\n:host(:empty)::after {\n content: attr(placeholder);\n color: var(--sbb-color-5);\n -webkit-text-fill-color: var(--sbb-color-5);\n opacity: 1;\n}\n@media (forced-colors: active) {\n :host(:empty)::after {\n color: GrayText;\n }\n}";
7
- //#endregion
8
- //#region src/elements/date-input/date-input.component.ts
9
- Object.assign(ValidityState.prototype, { get sbbDateFilter() {
10
- return false;
11
- } });
12
- /**
13
- * Custom input for a date.
14
- */
15
- var SbbDateInputElement = (() => {
16
- let _classSuper = SbbFormAssociatedInputMixin(SbbElement);
17
- let _instanceExtraInitializers = [];
18
- let _set_valueAsDate_decorators;
19
- let _min_decorators;
20
- let _min_initializers = [];
21
- let _min_extraInitializers = [];
22
- let _max_decorators;
23
- let _max_initializers = [];
24
- let _max_extraInitializers = [];
25
- let _set_dateFilter_decorators;
26
- let _weekdayStyle_decorators;
27
- let _weekdayStyle_initializers = [];
28
- let _weekdayStyle_extraInitializers = [];
29
- return class SbbDateInputElement extends _classSuper {
30
- static {
31
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
32
- _set_valueAsDate_decorators = [property({ attribute: false })];
33
- _min_decorators = [plainDate(), property({
34
- converter: plainDateConverter,
35
- reflect: true
36
- })];
37
- _max_decorators = [plainDate(), property({
38
- converter: plainDateConverter,
39
- reflect: true
40
- })];
41
- _set_dateFilter_decorators = [property({ attribute: false })];
42
- _weekdayStyle_decorators = [property({ attribute: "weekday-style" })];
43
- __esDecorate(this, null, _set_valueAsDate_decorators, {
44
- kind: "setter",
45
- name: "valueAsDate",
46
- static: false,
47
- private: false,
48
- access: {
49
- has: (obj) => "valueAsDate" in obj,
50
- set: (obj, value) => {
51
- obj.valueAsDate = value;
52
- }
53
- },
54
- metadata: _metadata
55
- }, null, _instanceExtraInitializers);
56
- __esDecorate(this, null, _min_decorators, {
57
- kind: "accessor",
58
- name: "min",
59
- static: false,
60
- private: false,
61
- access: {
62
- has: (obj) => "min" in obj,
63
- get: (obj) => obj.min,
64
- set: (obj, value) => {
65
- obj.min = value;
66
- }
67
- },
68
- metadata: _metadata
69
- }, _min_initializers, _min_extraInitializers);
70
- __esDecorate(this, null, _max_decorators, {
71
- kind: "accessor",
72
- name: "max",
73
- static: false,
74
- private: false,
75
- access: {
76
- has: (obj) => "max" in obj,
77
- get: (obj) => obj.max,
78
- set: (obj, value) => {
79
- obj.max = value;
80
- }
81
- },
82
- metadata: _metadata
83
- }, _max_initializers, _max_extraInitializers);
84
- __esDecorate(this, null, _set_dateFilter_decorators, {
85
- kind: "setter",
86
- name: "dateFilter",
87
- static: false,
88
- private: false,
89
- access: {
90
- has: (obj) => "dateFilter" in obj,
91
- set: (obj, value) => {
92
- obj.dateFilter = value;
93
- }
94
- },
95
- metadata: _metadata
96
- }, null, _instanceExtraInitializers);
97
- __esDecorate(this, null, _weekdayStyle_decorators, {
98
- kind: "accessor",
99
- name: "weekdayStyle",
100
- static: false,
101
- private: false,
102
- access: {
103
- has: (obj) => "weekdayStyle" in obj,
104
- get: (obj) => obj.weekdayStyle,
105
- set: (obj, value) => {
106
- obj.weekdayStyle = value;
107
- }
108
- },
109
- metadata: _metadata
110
- }, _weekdayStyle_initializers, _weekdayStyle_extraInitializers);
111
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
112
- enumerable: true,
113
- configurable: true,
114
- writable: true,
115
- value: _metadata
116
- });
117
- }
118
- static {
119
- this.elementName = "sbb-date-input";
120
- }
121
- static {
122
- this.styles = [unsafeCSS(date_input_default)];
123
- }
124
- /**
125
- * The value of the date input. Reflects the current text value
126
- * of this input.
127
- * The attribute `value` Accepts ISO8601 formatted values, which will be
128
- * formatted according to the current locale.
129
- */
130
- set value(value) {
131
- this._tryParseValue(value);
132
- if (!isServer && !this.matches(":focus") && this.valueAsDate !== null) value = this._formatDate();
133
- super.value = value;
134
- }
135
- get value() {
136
- return super.value ?? "";
137
- }
138
- /** Formats the current input's value as date. */
139
- set valueAsDate(value) {
140
- value = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
141
- if (!value) {
142
- this._valueAsDate = null;
143
- this._valueCache = ["", null];
144
- this.value = "";
145
- } else if (!this._dateAdapter.isDateInstance(this._valueAsDate) || this._dateAdapter.compareDate(this._valueAsDate, value) !== 0) {
146
- this._valueAsDate = this._dateAdapter.createDate(this._dateAdapter.getYear(value), this._dateAdapter.getMonth(value), this._dateAdapter.getDate(value));
147
- const stringValue = this._formatDate();
148
- this._valueCache = [stringValue, this._valueAsDate];
149
- this.value = stringValue;
150
- }
151
- }
152
- get valueAsDate() {
153
- return this._valueAsDate ? this._dateAdapter.clone(this._valueAsDate) : null;
154
- }
155
- #min_accessor_storage;
156
- /**
157
- * The minimum valid date. Accepts a date object or null.
158
- * Accepts an ISO8601 formatted string (e.g. 2024-12-24) as attribute.
159
- */
160
- get min() {
161
- return this.#min_accessor_storage;
162
- }
163
- set min(value) {
164
- this.#min_accessor_storage = value;
165
- }
166
- #max_accessor_storage;
167
- /**
168
- * The maximum valid date. Accepts a date object or null.
169
- * Accepts an ISO8601 formatted string (e.g. 2024-12-24) as attribute.
170
- */
171
- get max() {
172
- return this.#max_accessor_storage;
173
- }
174
- set max(value) {
175
- this.#max_accessor_storage = value;
176
- }
177
- /**
178
- * A function used to filter out dates.
179
- * It is strongly recommended to use min and max dates alongside
180
- * this filter.
181
- */
182
- set dateFilter(value) {
183
- this._dateFilter = value;
184
- }
185
- get dateFilter() {
186
- return this._dateFilter;
187
- }
188
- #weekdayStyle_accessor_storage;
189
- /**
190
- * How to format the displayed date.
191
- * `short`: Two letter abbreviation of the week day (e.g. Fr).
192
- * `none`: The weekday is not displayed.
193
- */
194
- get weekdayStyle() {
195
- return this.#weekdayStyle_accessor_storage;
196
- }
197
- set weekdayStyle(value) {
198
- this.#weekdayStyle_accessor_storage = value;
199
- }
200
- /**
201
- * Gets the associated datepicker, if any.
202
- * The sbb-date-input and the sbb-datepicker are assumed to be in the same parent container.
203
- */
204
- get datepicker() {
205
- return this.parentElement.querySelector("sbb-datepicker");
206
- }
207
- constructor() {
208
- super();
209
- this._valueAsDate = __runInitializers(this, _instanceExtraInitializers);
210
- this.#min_accessor_storage = __runInitializers(this, _min_initializers, null);
211
- this.#max_accessor_storage = (__runInitializers(this, _min_extraInitializers), __runInitializers(this, _max_initializers, null));
212
- this.#weekdayStyle_accessor_storage = (__runInitializers(this, _max_extraInitializers), __runInitializers(this, _weekdayStyle_initializers, "short"));
213
- /**
214
- * Stores the last string and parsed date object value to prevent repeated
215
- * parsing of the string value.
216
- */
217
- this._valueCache = __runInitializers(this, _weekdayStyle_extraInitializers);
218
- this._dateAdapter = readConfig().datetime?.dateAdapter ?? defaultDateAdapter;
219
- this._placeholderMutable = false;
220
- this._dateFilter = () => true;
221
- this.addEventListener?.("change", () => this._updateValueDateFormat(), { capture: true });
222
- }
223
- /**
224
- * Attempts to resolve the associated date input with the given element.
225
- */
226
- static resolveAssociation(host) {
227
- if (host.hasAttribute("input") || host.input) return;
228
- const input = host.closest("sbb-form-field")?.querySelector("sbb-date-input");
229
- if (input) host.input = input;
230
- }
231
- connectedCallback() {
232
- super.connectedCallback();
233
- if (!this.placeholder) {
234
- this._placeholderMutable = true;
235
- this.placeholder = i18nDatePickerPlaceholder[this.language.current];
236
- }
237
- for (const child of Array.from(this.closest("sbb-form-field")?.children ?? [])) {
238
- customElements.upgrade?.(child);
239
- if (child.constructor.sbbDateInputAssociated && !child.hasAttribute("input") && !child.input) child.input = this;
240
- }
241
- }
242
- requestUpdate(name, oldValue, options) {
243
- super.requestUpdate(name, oldValue, options);
244
- if (this.hasUpdated && !name) {
245
- this._updateValueDateFormat();
246
- if (this._placeholderMutable) this.placeholder = i18nDatePickerPlaceholder[this.language.current];
247
- } else if (name === "weekdayStyle") this._updateValueDateFormat();
248
- if (this.isConnected)
249
- /** @internal */
250
- this.dispatchEvent(new Event("ɵchange"));
251
- }
252
- updateFormValue() {
253
- this._tryParseValue();
254
- const formValue = this.valueAsDate !== null ? this._dateAdapter.toIso8601(this.valueAsDate) : null;
255
- this.internals.setFormValue(formValue, this.value);
256
- }
257
- _tryParseValue(value = this.value) {
258
- if (this._valueCache?.[0] !== value) {
259
- this._valueAsDate = this._dateAdapter.parse(value);
260
- this._valueCache = [value, this._valueAsDate];
261
- }
262
- }
263
- _updateValueDateFormat() {
264
- if (this.valueAsDate) {
265
- const formattedDate = this._formatDate();
266
- if (this.value !== formattedDate) super.value = formattedDate;
267
- }
268
- }
269
- _formatDate() {
270
- return this._dateAdapter.format(this.valueAsDate, { weekdayStyle: this.weekdayStyle });
271
- }
272
- shouldValidate(name) {
273
- return super.shouldValidate(name) || [
274
- "valueAsDate",
275
- "min",
276
- "max",
277
- "dateFilter"
278
- ].includes(name);
279
- }
280
- validate() {
281
- super.validate();
282
- if (!this.value) this._removeValidityErrors();
283
- else if (!this._dateAdapter.isValid(this.valueAsDate)) this.setValidityFlag("badInput", i18nDateInvalid[this.language.current]);
284
- else if (this._dateAdapter.isValid(this.min) && this._dateAdapter.compareDate(this.min, this.valueAsDate) > 0) this.setValidityFlag("rangeUnderflow", i18nDateMin(this._dateAdapter.format(this.min, { weekdayStyle: "none" }))[this.language.current]);
285
- else if (this._dateAdapter.isValid(this.max) && this._dateAdapter.compareDate(this.valueAsDate, this.max) > 0) this.setValidityFlag("rangeOverflow", i18nDateMax(this._dateAdapter.format(this.max, { weekdayStyle: "none" }))[this.language.current]);
286
- else if (this.dateFilter && !this.dateFilter(this.valueAsDate)) this.setValidityFlag("sbbDateFilter", i18nDateInvalid[this.language.current]);
287
- else this._removeValidityErrors();
288
- }
289
- _removeValidityErrors() {
290
- [
291
- "badInput",
292
- "rangeUnderflow",
293
- "rangeOverflow",
294
- "sbbDateFilter"
295
- ].forEach((f) => this.removeValidityFlag(f));
296
- }
297
- };
298
- })();
299
- //#endregion
300
- export { SbbDateInputElement as t };
301
-
302
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1pbnB1dC5jb21wb25lbnQtQ3k3bTFvY0wuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2RhdGUtaW5wdXQvZGF0ZS1pbnB1dC5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9kYXRlLWlucHV0L2RhdGUtaW5wdXQuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG5cbiAgLy8gV2l0aCBzYmItZm9ybS1maWVsZFt3aWR0aD1cImNvbGxhcHNlZFwiXSwgdGhlIGRlZmF1bHQgbWluIHdpZHRoIG9mIGFcbiAgLy8gYW4gaW5saW5lIGVsZW1lbnQgaXMgYmFzaWNhbGx5IG5vdGhpbmcgKGV4Y2VwdCBwb3RlbnRpYWxseSB0aGUgcGxhY2Vob2xkZXIpLlxuICAvLyBEdWUgdG8gdGhpcywgd2Ugc2V0IGEgbWluaW11bSB3aWR0aCBvZiB0aGUgZGF0ZSBpbnB1dCBlbGVtZW50LlxuICBtaW4td2lkdGg6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCgxNTApfTtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBjdXJzb3I6IHRleHQ7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG5cbiAgQG1lZGlhIChmb3JjZWQtY29sb3JzOiBhY3RpdmUpIHtcbiAgICBjb2xvcjogRmllbGRUZXh0O1xuICB9XG59XG5cbjpob3N0KDpkaXNhYmxlZCkge1xuICBjdXJzb3I6IHZhcigtLXNiYi1jdXJzb3ItZGVmYXVsdCk7XG59XG5cbjpob3N0KDpmb2N1cykge1xuICB0ZXh0LW92ZXJmbG93OiBpbml0aWFsICFpbXBvcnRhbnQ7XG59XG5cbjpob3N0KDplbXB0eSk6OmFmdGVyIHtcbiAgY29udGVudDogYXR0cihwbGFjZWhvbGRlcik7XG4gIEBpbmNsdWRlIHNiYi5wbGFjZWhvbGRlcjtcbiAgQG1lZGlhIChmb3JjZWQtY29sb3JzOiBhY3RpdmUpIHtcbiAgICBjb2xvcjogR3JheVRleHQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IHR5cGUgQ1NTUmVzdWx0R3JvdXAsIGlzU2VydmVyLCB0eXBlIFByb3BlcnR5RGVjbGFyYXRpb24sIHVuc2FmZUNTUyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHtcbiAgdHlwZSBEYXRlQWRhcHRlcixcbiAgZGVmYXVsdERhdGVBZGFwdGVyLFxuICBpMThuRGF0ZUludmFsaWQsXG4gIGkxOG5EYXRlTWF4LFxuICBpMThuRGF0ZU1pbixcbiAgaTE4bkRhdGVQaWNrZXJQbGFjZWhvbGRlcixcbiAgcGxhaW5EYXRlLFxuICBwbGFpbkRhdGVDb252ZXJ0ZXIsXG4gIHJlYWRDb25maWcsXG4gIFNiYkVsZW1lbnQsXG4gIFNiYkZvcm1Bc3NvY2lhdGVkSW5wdXRNaXhpbixcbn0gZnJvbSAnLi4vY29yZS50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYkRhdGVwaWNrZXJFbGVtZW50IH0gZnJvbSAnLi4vZGF0ZXBpY2tlci5wdXJlLnRzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vZGF0ZS1pbnB1dC5zY3NzP2lubGluZSc7XG5cbi8vIEFzIGRvY3VtZW50ZWQgaW4gZm9ybS1hc3NvY2lhdGVkLW1peGluLnRzLCB3ZSBleHRlbmQgdGhlIHByb3RvdHlwZSBvZlxuLy8gVmFsaWRpdHlTdGF0ZSB3aXRoIGN1c3RvbSBlcnJvciBzdGF0ZXMgZm9yIHRoZSBkYXRlIGlucHV0LlxuT2JqZWN0LmFzc2lnbihWYWxpZGl0eVN0YXRlLnByb3RvdHlwZSwge1xuICBnZXQgc2JiRGF0ZUZpbHRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIGRhdGUgaW5wdXQuXG4gKiBJbXBsZW1lbnRpbmcgY2xhc3NlcyBtdXN0IGFsc28gaGF2ZSBhIHN0YXRpYyBwcm9wZXJ0eSBgc2JiRGF0ZUlucHV0QXNzb2NpYXRlZGAgc2V0IHRvIGB0cnVlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYmJEYXRlSW5wdXRBc3NvY2lhdGVkPFQ+IHtcbiAgaW5wdXQ6IFNiYkRhdGVJbnB1dEVsZW1lbnQ8VD4gfCBudWxsO1xufVxuXG4vKipcbiAqIEN1c3RvbSBpbnB1dCBmb3IgYSBkYXRlLlxuICovXG5leHBvcnQgY2xhc3MgU2JiRGF0ZUlucHV0RWxlbWVudDxUID0gRGF0ZT4gZXh0ZW5kcyBTYmJGb3JtQXNzb2NpYXRlZElucHV0TWl4aW4oU2JiRWxlbWVudCkge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLWRhdGUtaW5wdXQnO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbdW5zYWZlQ1NTKHN0eWxlKV07XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgZGF0ZSBpbnB1dC4gUmVmbGVjdHMgdGhlIGN1cnJlbnQgdGV4dCB2YWx1ZVxuICAgKiBvZiB0aGlzIGlucHV0LlxuICAgKiBUaGUgYXR0cmlidXRlIGB2YWx1ZWAgQWNjZXB0cyBJU084NjAxIGZvcm1hdHRlZCB2YWx1ZXMsIHdoaWNoIHdpbGwgYmVcbiAgICogZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90cnlQYXJzZVZhbHVlKHZhbHVlKTtcbiAgICAvLyBBcyBsb25nIGFzIHRoaXMgZWxlbWVudCBoYXMgZm9jdXMgd2UgZGVsYXkgYXV0b21hdGljYWxseSB1cGRhdGluZ1xuICAgIC8vIHRoZSB2YWx1ZSB3aXRoIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIG9mIHRoZSBwYXJzZWQgZGF0ZS5cbiAgICBpZiAoIWlzU2VydmVyICYmICF0aGlzLm1hdGNoZXMoJzpmb2N1cycpICYmIHRoaXMudmFsdWVBc0RhdGUgIT09IG51bGwpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5fZm9ybWF0RGF0ZSgpO1xuICAgIH1cbiAgICBzdXBlci52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudmFsdWUgPz8gJyc7XG4gIH1cblxuICAvKiogRm9ybWF0cyB0aGUgY3VycmVudCBpbnB1dCdzIHZhbHVlIGFzIGRhdGUuICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIHNldCB2YWx1ZUFzRGF0ZSh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICB2YWx1ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlQXNEYXRlID0gbnVsbDtcbiAgICAgIHRoaXMuX3ZhbHVlQ2FjaGUgPSBbJycsIG51bGxdO1xuICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhdGhpcy5fZGF0ZUFkYXB0ZXIuaXNEYXRlSW5zdGFuY2UodGhpcy5fdmFsdWVBc0RhdGUpIHx8XG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLl92YWx1ZUFzRGF0ZSEsIHZhbHVlISkgIT09IDBcbiAgICApIHtcbiAgICAgIC8vIEFsaWduIHdpdGggdGhlIG5hdGl2ZSBkYXRlIGlucHV0LCBhcyBpdCBjb3BpZXMgdGhlIHZhbHVlIG9mXG4gICAgICAvLyB0aGUgZ2l2ZW4gZGF0ZSB3aXRob3V0IHRoZSB0aW1lIGFuZCBkb2VzIG5vdCByZXRhaW4gdGhlXG4gICAgICAvLyBvcmlnaW5hbCBpbnN0YW5jZS5cbiAgICAgIHRoaXMuX3ZhbHVlQXNEYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih2YWx1ZSksXG4gICAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHZhbHVlKSxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh2YWx1ZSksXG4gICAgICApO1xuICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSB0aGlzLl9mb3JtYXREYXRlKCk7XG4gICAgICB0aGlzLl92YWx1ZUNhY2hlID0gW3N0cmluZ1ZhbHVlLCB0aGlzLl92YWx1ZUFzRGF0ZV07XG4gICAgICB0aGlzLnZhbHVlID0gc3RyaW5nVmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWVBc0RhdGUoKTogVCB8IG51bGwge1xuICAgIC8vIFdlIHNob3VsZCBuZXZlciByZXR1cm4gdGhlIGludGVybmFsIGRhdGUgb2JqZWN0IGRpcmVjdGx5LCBhcyBpdFxuICAgIC8vIGNvdWxkIGJlIG1hbmlwdWxhdGVkIG91dHNpZGUgb2YgdGhpcyBjbGFzcy5cbiAgICByZXR1cm4gdGhpcy5fdmFsdWVBc0RhdGUgPyB0aGlzLl9kYXRlQWRhcHRlci5jbG9uZSh0aGlzLl92YWx1ZUFzRGF0ZSkgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgX3ZhbHVlQXNEYXRlPzogVCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHZhbGlkIGRhdGUuIEFjY2VwdHMgYSBkYXRlIG9iamVjdCBvciBudWxsLlxuICAgKiBBY2NlcHRzIGFuIElTTzg2MDEgZm9ybWF0dGVkIHN0cmluZyAoZS5nLiAyMDI0LTEyLTI0KSBhcyBhdHRyaWJ1dGUuXG4gICAqL1xuICBAcGxhaW5EYXRlKClcbiAgQHByb3BlcnR5KHsgY29udmVydGVyOiBwbGFpbkRhdGVDb252ZXJ0ZXIsIHJlZmxlY3Q6IHRydWUgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1pbjogVCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB2YWxpZCBkYXRlLiBBY2NlcHRzIGEgZGF0ZSBvYmplY3Qgb3IgbnVsbC5cbiAgICogQWNjZXB0cyBhbiBJU084NjAxIGZvcm1hdHRlZCBzdHJpbmcgKGUuZy4gMjAyNC0xMi0yNCkgYXMgYXR0cmlidXRlLlxuICAgKi9cbiAgQHBsYWluRGF0ZSgpXG4gIEBwcm9wZXJ0eSh7IGNvbnZlcnRlcjogcGxhaW5EYXRlQ29udmVydGVyLCByZWZsZWN0OiB0cnVlIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtYXg6IFQgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB1c2VkIHRvIGZpbHRlciBvdXQgZGF0ZXMuXG4gICAqIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHVzZSBtaW4gYW5kIG1heCBkYXRlcyBhbG9uZ3NpZGVcbiAgICogdGhpcyBmaWx0ZXIuXG4gICAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBzZXQgZGF0ZUZpbHRlcih2YWx1ZTogKGRhdGU6IFQgfCBudWxsKSA9PiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGF0ZUZpbHRlciA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgZGF0ZUZpbHRlcigpOiAoZGF0ZTogVCB8IG51bGwpID0+IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRlRmlsdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdyB0byBmb3JtYXQgdGhlIGRpc3BsYXllZCBkYXRlLlxuICAgKiBgc2hvcnRgOiBUd28gbGV0dGVyIGFiYnJldmlhdGlvbiBvZiB0aGUgd2VlayBkYXkgKGUuZy4gRnIpLlxuICAgKiBgbm9uZWA6IFRoZSB3ZWVrZGF5IGlzIG5vdCBkaXNwbGF5ZWQuXG4gICAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd3ZWVrZGF5LXN0eWxlJyB9KVxuICBwdWJsaWMgYWNjZXNzb3Igd2Vla2RheVN0eWxlOiAnc2hvcnQnIHwgJ25vbmUnID0gJ3Nob3J0JztcblxuICAvKipcbiAgICogU3RvcmVzIHRoZSBsYXN0IHN0cmluZyBhbmQgcGFyc2VkIGRhdGUgb2JqZWN0IHZhbHVlIHRvIHByZXZlbnQgcmVwZWF0ZWRcbiAgICogcGFyc2luZyBvZiB0aGUgc3RyaW5nIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsdWVDYWNoZT86IFtzdHJpbmcsIFQgfCBudWxsXTtcbiAgcHJpdmF0ZSBfZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPFQ+ID0gcmVhZENvbmZpZygpLmRhdGV0aW1lPy5kYXRlQWRhcHRlciA/PyBkZWZhdWx0RGF0ZUFkYXB0ZXI7XG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyTXV0YWJsZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBhc3NvY2lhdGVkIGRhdGVwaWNrZXIsIGlmIGFueS5cbiAgICogVGhlIHNiYi1kYXRlLWlucHV0IGFuZCB0aGUgc2JiLWRhdGVwaWNrZXIgYXJlIGFzc3VtZWQgdG8gYmUgaW4gdGhlIHNhbWUgcGFyZW50IGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyBnZXQgZGF0ZXBpY2tlcigpOiBTYmJEYXRlcGlja2VyRWxlbWVudDxUPiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEVsZW1lbnQhLnF1ZXJ5U2VsZWN0b3I8U2JiRGF0ZXBpY2tlckVsZW1lbnQ8VD4+KCdzYmItZGF0ZXBpY2tlcicpO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NoYW5nZScsICgpID0+IHRoaXMuX3VwZGF0ZVZhbHVlRGF0ZUZvcm1hdCgpLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gcmVzb2x2ZSB0aGUgYXNzb2NpYXRlZCBkYXRlIGlucHV0IHdpdGggdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlc29sdmVBc3NvY2lhdGlvbjxUPihob3N0OiBIVE1MRWxlbWVudCAmIFNiYkRhdGVJbnB1dEFzc29jaWF0ZWQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoaG9zdC5oYXNBdHRyaWJ1dGUoJ2lucHV0JykgfHwgaG9zdC5pbnB1dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gaG9zdFxuICAgICAgLmNsb3Nlc3QoJ3NiYi1mb3JtLWZpZWxkJylcbiAgICAgID8ucXVlcnlTZWxlY3RvcjxTYmJEYXRlSW5wdXRFbGVtZW50PFQ+Pignc2JiLWRhdGUtaW5wdXQnKTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGhvc3QuaW5wdXQgPSBpbnB1dDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kYXRlRmlsdGVyOiAoZGF0ZTogVCB8IG51bGwpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGlmICghdGhpcy5wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5fcGxhY2Vob2xkZXJNdXRhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBpMThuRGF0ZVBpY2tlclBsYWNlaG9sZGVyW3RoaXMubGFuZ3VhZ2UuY3VycmVudF07XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuZnJvbSh0aGlzLmNsb3Nlc3QoJ3NiYi1mb3JtLWZpZWxkJyk/LmNoaWxkcmVuID8/IFtdKSkge1xuICAgICAgLy8gRWxlbWVudHMgbXVzdCBiZSB1cGdyYWRlZCBpbiBvcmRlciBmb3IgdGhlIGNvbnN0cnVjdG9yIHRvIGJlIGFjY2Vzc2libGUuXG4gICAgICBjdXN0b21FbGVtZW50cy51cGdyYWRlPy4oY2hpbGQpO1xuICAgICAgaWYgKFxuICAgICAgICAoY2hpbGQuY29uc3RydWN0b3IgYXMgeyBzYmJEYXRlSW5wdXRBc3NvY2lhdGVkPzogYm9vbGVhbiB9KS5zYmJEYXRlSW5wdXRBc3NvY2lhdGVkICYmXG4gICAgICAgICFjaGlsZC5oYXNBdHRyaWJ1dGUoJ2lucHV0JykgJiZcbiAgICAgICAgIShjaGlsZCBhcyBQYXJ0aWFsPFNiYkRhdGVJbnB1dEFzc29jaWF0ZWQ8VD4+KS5pbnB1dFxuICAgICAgKSB7XG4gICAgICAgIChjaGlsZCBhcyBQYXJ0aWFsPFNiYkRhdGVJbnB1dEFzc29jaWF0ZWQ8VD4+KS5pbnB1dCA9IHRoaXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHJlcXVlc3RVcGRhdGUoXG4gICAgbmFtZT86IFByb3BlcnR5S2V5LFxuICAgIG9sZFZhbHVlPzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgKTogdm9pZCB7XG4gICAgc3VwZXIucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgaWYgKHRoaXMuaGFzVXBkYXRlZCAmJiAhbmFtZSkge1xuICAgICAgdGhpcy5fdXBkYXRlVmFsdWVEYXRlRm9ybWF0KCk7XG4gICAgICBpZiAodGhpcy5fcGxhY2Vob2xkZXJNdXRhYmxlKSB7XG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBpMThuRGF0ZVBpY2tlclBsYWNlaG9sZGVyW3RoaXMubGFuZ3VhZ2UuY3VycmVudF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAnd2Vla2RheVN0eWxlJykge1xuICAgICAgdGhpcy5fdXBkYXRlVmFsdWVEYXRlRm9ybWF0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAvLyBVc2VkIHRvIG5vdGlmeSBhc3NvY2lhdGVkIGNvbXBvbmVudHMgdG8gdXBkYXRlIHN0YXRlXG4gICAgICAvKiogQGludGVybmFsICovXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCfJtWNoYW5nZScpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlRm9ybVZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuX3RyeVBhcnNlVmFsdWUoKTtcbiAgICBjb25zdCBmb3JtVmFsdWUgPVxuICAgICAgdGhpcy52YWx1ZUFzRGF0ZSAhPT0gbnVsbCA/IHRoaXMuX2RhdGVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLnZhbHVlQXNEYXRlKSA6IG51bGw7XG4gICAgdGhpcy5pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1WYWx1ZSwgdGhpcy52YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF90cnlQYXJzZVZhbHVlKHZhbHVlID0gdGhpcy52YWx1ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl92YWx1ZUNhY2hlPy5bMF0gIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZUFzRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLnBhcnNlKHZhbHVlKTtcbiAgICAgIHRoaXMuX3ZhbHVlQ2FjaGUgPSBbdmFsdWUsIHRoaXMuX3ZhbHVlQXNEYXRlXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVWYWx1ZURhdGVGb3JtYXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsdWVBc0RhdGUpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLl9mb3JtYXREYXRlKCk7XG4gICAgICBpZiAodGhpcy52YWx1ZSAhPT0gZm9ybWF0dGVkRGF0ZSkge1xuICAgICAgICBzdXBlci52YWx1ZSA9IGZvcm1hdHRlZERhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZm9ybWF0RGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRlQWRhcHRlci5mb3JtYXQodGhpcy52YWx1ZUFzRGF0ZSwgeyB3ZWVrZGF5U3R5bGU6IHRoaXMud2Vla2RheVN0eWxlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNob3VsZFZhbGlkYXRlKG5hbWU6IFByb3BlcnR5S2V5IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN1cGVyLnNob3VsZFZhbGlkYXRlKG5hbWUpIHx8XG4gICAgICBbJ3ZhbHVlQXNEYXRlJywgJ21pbicsICdtYXgnLCAnZGF0ZUZpbHRlciddLmluY2x1ZGVzKG5hbWUgYXMgc3RyaW5nKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgc3VwZXIudmFsaWRhdGUoKTtcbiAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMuX3JlbW92ZVZhbGlkaXR5RXJyb3JzKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5fZGF0ZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnZhbHVlQXNEYXRlKSkge1xuICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoJ2JhZElucHV0JywgaTE4bkRhdGVJbnZhbGlkW3RoaXMubGFuZ3VhZ2UuY3VycmVudF0pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMubWluKSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5taW4sIHRoaXMudmFsdWVBc0RhdGUpID4gMFxuICAgICkge1xuICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoXG4gICAgICAgICdyYW5nZVVuZGVyZmxvdycsXG4gICAgICAgIGkxOG5EYXRlTWluKHRoaXMuX2RhdGVBZGFwdGVyLmZvcm1hdCh0aGlzLm1pbiwgeyB3ZWVrZGF5U3R5bGU6ICdub25lJyB9KSlbXG4gICAgICAgICAgdGhpcy5sYW5ndWFnZS5jdXJyZW50XG4gICAgICAgIF0sXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKHRoaXMubWF4KSAmJlxuICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy52YWx1ZUFzRGF0ZSwgdGhpcy5tYXgpID4gMFxuICAgICkge1xuICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoXG4gICAgICAgICdyYW5nZU92ZXJmbG93JyxcbiAgICAgICAgaTE4bkRhdGVNYXgodGhpcy5fZGF0ZUFkYXB0ZXIuZm9ybWF0KHRoaXMubWF4LCB7IHdlZWtkYXlTdHlsZTogJ25vbmUnIH0pKVtcbiAgICAgICAgICB0aGlzLmxhbmd1YWdlLmN1cnJlbnRcbiAgICAgICAgXSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGVGaWx0ZXIgJiYgIXRoaXMuZGF0ZUZpbHRlcih0aGlzLnZhbHVlQXNEYXRlKSkge1xuICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoJ3NiYkRhdGVGaWx0ZXInLCBpMThuRGF0ZUludmFsaWRbdGhpcy5sYW5ndWFnZS5jdXJyZW50XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlbW92ZVZhbGlkaXR5RXJyb3JzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlVmFsaWRpdHlFcnJvcnMoKTogdm9pZCB7XG4gICAgKFsnYmFkSW5wdXQnLCAncmFuZ2VVbmRlcmZsb3cnLCAncmFuZ2VPdmVyZmxvdycsICdzYmJEYXRlRmlsdGVyJ10gYXMgY29uc3QpLmZvckVhY2goKGYpID0+XG4gICAgICB0aGlzLnJlbW92ZVZhbGlkaXR5RmxhZyhmKSxcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItZGF0ZS1pbnB1dCc6IFNiYkRhdGVJbnB1dEVsZW1lbnQ7XG4gIH1cblxuICBpbnRlcmZhY2UgQ3VzdG9tVmFsaWRpdHlTdGF0ZSB7XG4gICAgc2JiRGF0ZUZpbHRlcjogYm9vbGVh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
@@ -1,187 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { isServer, unsafeCSS } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbElement, SbbFormAssociatedInputMixin, SbbLanguageController, i18nTimeInputChange, i18nTimeInvalid, i18nTimeMax, i18nTimeMaxLength, sbbLiveAnnouncer } from "./core.js";
5
- //#region src/elements/time-input/time-input.scss?inline
6
- var time_input_default = ":host {\n display: inline-flex;\n min-width: var(--sbb-time-input-max-width);\n max-width: var(--sbb-time-input-max-width);\n cursor: text;\n align-items: center;\n font-weight: normal;\n}\n@media (forced-colors: active) {\n :host {\n color: FieldText;\n }\n}\n\n:host(:disabled) {\n cursor: var(--sbb-cursor-default);\n}\n\n:host(:focus) {\n text-overflow: initial !important;\n}\n\n:host(:empty)::after {\n content: attr(placeholder);\n color: var(--sbb-color-5);\n -webkit-text-fill-color: var(--sbb-color-5);\n opacity: 1;\n}\n@media (forced-colors: active) {\n :host(:empty)::after {\n color: GrayText;\n }\n}";
7
- //#endregion
8
- //#region src/elements/time-input/time-input.component.ts
9
- var REGEX_ALLOWED_CHARACTERS = /[0-9.:,\-;_hH]/;
10
- var REGEX_DISALLOWED_CHARACTERS = /[^0-9.:,\-;_hH]/g;
11
- var REGEX_GROUPS_WITHOUT_COLON = /^([0-9]{1,2})([0-9]{2})$/;
12
- var REGEX_GROUPS_WITH_COLON = /^([0-9]{1,2})?[.:,\-;_hH]?([0-9]{1,2})?$/;
13
- /**
14
- * Custom input for a time.
15
- */
16
- var SbbTimeInputElement = (() => {
17
- let _classSuper = SbbFormAssociatedInputMixin(SbbElement);
18
- let _instanceExtraInitializers = [];
19
- let _set_valueAsDate_decorators;
20
- return class SbbTimeInputElement extends _classSuper {
21
- static {
22
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
23
- _set_valueAsDate_decorators = [property({ attribute: false })];
24
- __esDecorate(this, null, _set_valueAsDate_decorators, {
25
- kind: "setter",
26
- name: "valueAsDate",
27
- static: false,
28
- private: false,
29
- access: {
30
- has: (obj) => "valueAsDate" in obj,
31
- set: (obj, value) => {
32
- obj.valueAsDate = value;
33
- }
34
- },
35
- metadata: _metadata
36
- }, null, _instanceExtraInitializers);
37
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
38
- enumerable: true,
39
- configurable: true,
40
- writable: true,
41
- value: _metadata
42
- });
43
- }
44
- static {
45
- this.elementName = "sbb-time-input";
46
- }
47
- static {
48
- this.styles = [unsafeCSS(time_input_default)];
49
- }
50
- /**
51
- * The value of the time input. Reflects the current text value
52
- * of this input.
53
- */
54
- set value(value) {
55
- value = typeof value === "string" ? value.replace(REGEX_DISALLOWED_CHARACTERS, "").substring(0, 5) : "";
56
- this._tryParseValue(value);
57
- if (!isServer && !this.matches(":focus") && this.valueAsDate !== null) value = this._formatTime();
58
- super.value = value;
59
- }
60
- get value() {
61
- return super.value ?? "";
62
- }
63
- /** Formats the current input's value as date. */
64
- set valueAsDate(date) {
65
- if (date instanceof Date && !isNaN(date.valueOf())) {
66
- this._valueAsTime = {
67
- hours: date.getHours(),
68
- minutes: date.getMinutes()
69
- };
70
- const formattedValue = this._formatTime();
71
- if (this.value !== formattedValue) this.value = formattedValue;
72
- } else {
73
- this._valueAsTime = null;
74
- this.value = "";
75
- }
76
- }
77
- get valueAsDate() {
78
- if (this._valueAsTime && this._isTimeValid(this._valueAsTime)) {
79
- const date = /* @__PURE__ */ new Date(0);
80
- date.setHours(this._valueAsTime.hours);
81
- date.setMinutes(this._valueAsTime.minutes);
82
- return date;
83
- } else return null;
84
- }
85
- constructor() {
86
- super();
87
- this._valueAsTime = __runInitializers(this, _instanceExtraInitializers);
88
- this._language = new SbbLanguageController(this);
89
- this.addEventListener?.("change", () => this._updateValueDateFormat(), { capture: true });
90
- this.addEventListener?.("change", () => sbbLiveAnnouncer.announce(i18nTimeInputChange(this.value)[this._language.current]));
91
- this.addEventListener?.("keydown", (event) => this._preventCharInsert(event));
92
- }
93
- connectedCallback() {
94
- super.connectedCallback();
95
- this.inputMode ||= "numeric";
96
- this.placeholder ||= "HH:MM";
97
- }
98
- disconnectedCallback() {
99
- super.disconnectedCallback();
100
- }
101
- updateFormValue() {
102
- this._tryParseValue();
103
- const formValue = this.valueAsDate !== null ? this._formatTime() : null;
104
- this.internals.setFormValue(formValue, this.value);
105
- }
106
- _tryParseValue(value = this.value) {
107
- if (this._valueCache?.[0] !== value) {
108
- this._valueAsTime = this._parseValue(value);
109
- this._valueCache = [value, this._valueAsTime ?? null];
110
- }
111
- }
112
- /** Validate input against the defined RegExps. */
113
- _parseValue(value) {
114
- const trimmedValue = value?.trim();
115
- if (!trimmedValue) return null;
116
- const match = trimmedValue.match(REGEX_GROUPS_WITHOUT_COLON) ?? trimmedValue.match(REGEX_GROUPS_WITH_COLON);
117
- if (match) return {
118
- hours: +match[1] || 0,
119
- minutes: +match[2] || 0
120
- };
121
- return null;
122
- }
123
- _updateValueDateFormat() {
124
- if (this.valueAsDate) {
125
- const formattedDate = this._formatTime();
126
- if (this.value !== formattedDate) super.value = formattedDate;
127
- }
128
- }
129
- _formatTime() {
130
- const value = this.valueAsDate;
131
- if (!value) return "";
132
- return `${String(value.getHours()).padStart(2, "0")}:${String(value.getMinutes()).padStart(2, "0")}`;
133
- }
134
- preparePastedText(text) {
135
- return text.replace(REGEX_DISALLOWED_CHARACTERS, "").substring(0, 5 - (this.textContent?.length ?? 0));
136
- }
137
- shouldValidate(name) {
138
- return super.shouldValidate(name) || [
139
- "valueAsDate",
140
- "min",
141
- "max",
142
- "dateFilter"
143
- ].includes(name);
144
- }
145
- validate() {
146
- super.validate();
147
- if (!this.value) this._removeValidityErrors();
148
- else if (!this._valueAsTime) this.setValidityFlag("badInput", i18nTimeInvalid[this.language.current]);
149
- else if (!this._isTimeValid(this._valueAsTime)) this.setValidityFlag("rangeOverflow", i18nTimeMax[this.language.current]);
150
- else this._removeValidityErrors();
151
- }
152
- _removeValidityErrors() {
153
- ["badInput", "rangeOverflow"].forEach((f) => this.removeValidityFlag(f));
154
- }
155
- /** Checks if values of hours and minutes are possible, to avoid non-existent times. */
156
- _isTimeValid(time) {
157
- return time.hours < 24 && time.minutes < 60;
158
- }
159
- /** Only allow typing numbers and separator keys. */
160
- _preventCharInsert(event) {
161
- if (event.ctrlKey || event.altKey || event.metaKey || [
162
- "Backspace",
163
- "Tab",
164
- "Enter",
165
- "ArrowUp",
166
- "ArrowDown",
167
- "ArrowLeft",
168
- "ArrowRight",
169
- "Home",
170
- "End",
171
- "PageUp",
172
- "PageDown",
173
- "Delete"
174
- ].includes(event.key) || REGEX_ALLOWED_CHARACTERS.test(event.key) && (this.value.length < 5 || this._hasSelection())) return;
175
- event.preventDefault();
176
- if (this.value.length >= 5) sbbLiveAnnouncer.announce(i18nTimeMaxLength[this._language.current]);
177
- }
178
- _hasSelection() {
179
- const range = window.getSelection()?.getRangeAt(0);
180
- return !!range && range.startOffset !== range.endOffset;
181
- }
182
- };
183
- })();
184
- //#endregion
185
- export { SbbTimeInputElement as t };
186
-
187
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1pbnB1dC5jb21wb25lbnQtQ0dQVzNSQ3cuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3RpbWUtaW5wdXQvdGltZS1pbnB1dC5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90aW1lLWlucHV0L3RpbWUtaW5wdXQuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG5cbiAgLy8gV2l0aCBzYmItZm9ybS1maWVsZFt3aWR0aD1cImNvbGxhcHNlZFwiXSwgdGhlIGRlZmF1bHQgbWluIHdpZHRoIG9mIGFcbiAgLy8gYW4gaW5saW5lIGVsZW1lbnQgaXMgYmFzaWNhbGx5IG5vdGhpbmcgKGV4Y2VwdCBwb3RlbnRpYWxseSB0aGUgcGxhY2Vob2xkZXIpLlxuICAvLyBEdWUgdG8gdGhpcywgd2Ugc2V0IGEgbWluaW11bSB3aWR0aCBmb3IgdGhlIHRpbWUgaW5wdXQgZWxlbWVudC5cbiAgLy8gV2UgYWxzbyBjYW5ub3QgdXNlIHdpZHRoLCBhcyB0aGUgZm9ybSBmaWVsZCBvdmVyd3JpdGVzIHRoYXQgcHJvcGVydHkuXG4gIG1pbi13aWR0aDogdmFyKC0tc2JiLXRpbWUtaW5wdXQtbWF4LXdpZHRoKTtcblxuICAvLyBUaGUgdGltZSBpbnB1dCBhbHNvIGhhcyBhIHZlcnkgc3BlY2lmaWMgZGltZW5zaW9uLCBzbyB3ZSBhbHNvIHNldCB0aGUgbWF4aW11bSB3aWR0aC5cbiAgbWF4LXdpZHRoOiB2YXIoLS1zYmItdGltZS1pbnB1dC1tYXgtd2lkdGgpO1xuICBjdXJzb3I6IHRleHQ7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG5cbiAgQG1lZGlhIChmb3JjZWQtY29sb3JzOiBhY3RpdmUpIHtcbiAgICBjb2xvcjogRmllbGRUZXh0O1xuICB9XG59XG5cbjpob3N0KDpkaXNhYmxlZCkge1xuICBjdXJzb3I6IHZhcigtLXNiYi1jdXJzb3ItZGVmYXVsdCk7XG59XG5cbjpob3N0KDpmb2N1cykge1xuICB0ZXh0LW92ZXJmbG93OiBpbml0aWFsICFpbXBvcnRhbnQ7XG59XG5cbjpob3N0KDplbXB0eSk6OmFmdGVyIHtcbiAgY29udGVudDogYXR0cihwbGFjZWhvbGRlcik7XG4gIEBpbmNsdWRlIHNiYi5wbGFjZWhvbGRlcjtcbiAgQG1lZGlhIChmb3JjZWQtY29sb3JzOiBhY3RpdmUpIHtcbiAgICBjb2xvcjogR3JheVRleHQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IHR5cGUgQ1NTUmVzdWx0R3JvdXAsIGlzU2VydmVyLCB1bnNhZmVDU1MgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIGkxOG5UaW1lSW5wdXRDaGFuZ2UsXG4gIGkxOG5UaW1lSW52YWxpZCxcbiAgaTE4blRpbWVNYXgsXG4gIGkxOG5UaW1lTWF4TGVuZ3RoLFxuICBTYmJFbGVtZW50LFxuICBTYmJGb3JtQXNzb2NpYXRlZElucHV0TWl4aW4sXG4gIFNiYkxhbmd1YWdlQ29udHJvbGxlcixcbiAgc2JiTGl2ZUFubm91bmNlcixcbn0gZnJvbSAnLi4vY29yZS50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3RpbWUtaW5wdXQuc2Nzcz9pbmxpbmUnO1xuXG5jb25zdCBSRUdFWF9BTExPV0VEX0NIQVJBQ1RFUlMgPSAvWzAtOS46LFxcLTtfaEhdLztcbmNvbnN0IFJFR0VYX0RJU0FMTE9XRURfQ0hBUkFDVEVSUyA9IC9bXjAtOS46LFxcLTtfaEhdL2c7XG5jb25zdCBSRUdFWF9HUk9VUFNfV0lUSE9VVF9DT0xPTiA9IC9eKFswLTldezEsMn0pKFswLTldezJ9KSQvO1xuY29uc3QgUkVHRVhfR1JPVVBTX1dJVEhfQ09MT04gPSAvXihbMC05XXsxLDJ9KT9bLjosXFwtO19oSF0/KFswLTldezEsMn0pPyQvO1xuXG5pbnRlcmZhY2UgVGltZSB7XG4gIGhvdXJzOiBudW1iZXI7XG4gIG1pbnV0ZXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDdXN0b20gaW5wdXQgZm9yIGEgdGltZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNiYlRpbWVJbnB1dEVsZW1lbnQgZXh0ZW5kcyBTYmJGb3JtQXNzb2NpYXRlZElucHV0TWl4aW4oU2JiRWxlbWVudCkge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXRpbWUtaW5wdXQnO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbdW5zYWZlQ1NTKHN0eWxlKV07XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgdGltZSBpbnB1dC4gUmVmbGVjdHMgdGhlIGN1cnJlbnQgdGV4dCB2YWx1ZVxuICAgKiBvZiB0aGlzIGlucHV0LlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFsdWUgPVxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IHZhbHVlLnJlcGxhY2UoUkVHRVhfRElTQUxMT1dFRF9DSEFSQUNURVJTLCAnJykuc3Vic3RyaW5nKDAsIDUpXG4gICAgICAgIDogJyc7XG4gICAgdGhpcy5fdHJ5UGFyc2VWYWx1ZSh2YWx1ZSk7XG4gICAgLy8gQXMgbG9uZyBhcyB0aGlzIGVsZW1lbnQgaGFzIGZvY3VzIHdlIGRlbGF5IGF1dG9tYXRpY2FsbHkgdXBkYXRpbmdcbiAgICAvLyB0aGUgdmFsdWUgd2l0aCB0aGUgZm9ybWF0dGVkIHN0cmluZyBvZiB0aGUgcGFyc2VkIGRhdGUuXG4gICAgaWYgKCFpc1NlcnZlciAmJiAhdGhpcy5tYXRjaGVzKCc6Zm9jdXMnKSAmJiB0aGlzLnZhbHVlQXNEYXRlICE9PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuX2Zvcm1hdFRpbWUoKTtcbiAgICB9XG4gICAgc3VwZXIudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbHVlID8/ICcnO1xuICB9XG5cbiAgLyoqIEZvcm1hdHMgdGhlIGN1cnJlbnQgaW5wdXQncyB2YWx1ZSBhcyBkYXRlLiAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBzZXQgdmFsdWVBc0RhdGUoZGF0ZTogRGF0ZSB8IG51bGwpIHtcbiAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKGRhdGUudmFsdWVPZigpKSkge1xuICAgICAgdGhpcy5fdmFsdWVBc1RpbWUgPSB7XG4gICAgICAgIGhvdXJzOiBkYXRlLmdldEhvdXJzKCksXG4gICAgICAgIG1pbnV0ZXM6IGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5fZm9ybWF0VGltZSgpO1xuICAgICAgaWYgKHRoaXMudmFsdWUgIT09IGZvcm1hdHRlZFZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVBc1RpbWUgPSBudWxsO1xuICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlQXNEYXRlKCk6IERhdGUgfCBudWxsIHtcbiAgICBpZiAodGhpcy5fdmFsdWVBc1RpbWUgJiYgdGhpcy5faXNUaW1lVmFsaWQodGhpcy5fdmFsdWVBc1RpbWUpKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgICBkYXRlLnNldEhvdXJzKHRoaXMuX3ZhbHVlQXNUaW1lLmhvdXJzKTtcbiAgICAgIGRhdGUuc2V0TWludXRlcyh0aGlzLl92YWx1ZUFzVGltZS5taW51dGVzKTtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWVBc1RpbWU/OiBUaW1lIHwgbnVsbDtcblxuICAvKipcbiAgICogU3RvcmVzIHRoZSBsYXN0IHN0cmluZyBhbmQgcGFyc2VkIGRhdGUgb2JqZWN0IHZhbHVlIHRvIHByZXZlbnQgcmVwZWF0ZWRcbiAgICogcGFyc2luZyBvZiB0aGUgc3RyaW5nIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsdWVDYWNoZT86IFtzdHJpbmcsIFRpbWUgfCBudWxsXTtcblxuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NoYW5nZScsICgpID0+IHRoaXMuX3VwZGF0ZVZhbHVlRGF0ZUZvcm1hdCgpLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NoYW5nZScsICgpID0+XG4gICAgICBzYmJMaXZlQW5ub3VuY2VyLmFubm91bmNlKGkxOG5UaW1lSW5wdXRDaGFuZ2UodGhpcy52YWx1ZSlbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0pLFxuICAgICk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2tleWRvd24nLCAoZXZlbnQpID0+IHRoaXMuX3ByZXZlbnRDaGFySW5zZXJ0KGV2ZW50KSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmlucHV0TW9kZSB8fD0gJ251bWVyaWMnO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgfHw9ICdISDpNTSc7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5fdHJ5UGFyc2VWYWx1ZSgpO1xuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMudmFsdWVBc0RhdGUgIT09IG51bGwgPyB0aGlzLl9mb3JtYXRUaW1lKCkgOiBudWxsO1xuICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtVmFsdWUsIHRoaXMudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJ5UGFyc2VWYWx1ZSh2YWx1ZSA9IHRoaXMudmFsdWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdmFsdWVDYWNoZT8uWzBdICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWVBc1RpbWUgPSB0aGlzLl9wYXJzZVZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMuX3ZhbHVlQ2FjaGUgPSBbdmFsdWUsIHRoaXMuX3ZhbHVlQXNUaW1lID8/IG51bGxdO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBpbnB1dCBhZ2FpbnN0IHRoZSBkZWZpbmVkIFJlZ0V4cHMuICovXG4gIHByaXZhdGUgX3BhcnNlVmFsdWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRpbWUgfCBudWxsIHtcbiAgICBjb25zdCB0cmltbWVkVmFsdWUgPSB2YWx1ZT8udHJpbSgpO1xuICAgIGlmICghdHJpbW1lZFZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IHRoZSBpbnB1dCBpcyAzIG9yIDQgZGlnaXRzOyBzcGxpdCBsaWtlOiBBQj86Q0RcbiAgICBjb25zdCBtYXRjaCA9XG4gICAgICB0cmltbWVkVmFsdWUubWF0Y2goUkVHRVhfR1JPVVBTX1dJVEhPVVRfQ09MT04pID8/IHRyaW1tZWRWYWx1ZS5tYXRjaChSRUdFWF9HUk9VUFNfV0lUSF9DT0xPTik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4geyBob3VyczogK21hdGNoWzFdIHx8IDAsIG1pbnV0ZXM6ICttYXRjaFsyXSB8fCAwIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVWYWx1ZURhdGVGb3JtYXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsdWVBc0RhdGUpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLl9mb3JtYXRUaW1lKCk7XG4gICAgICBpZiAodGhpcy52YWx1ZSAhPT0gZm9ybWF0dGVkRGF0ZSkge1xuICAgICAgICBzdXBlci52YWx1ZSA9IGZvcm1hdHRlZERhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZm9ybWF0VGltZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZUFzRGF0ZTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IGhvdXJzID0gU3RyaW5nKHZhbHVlLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgbWludXRlcyA9IFN0cmluZyh2YWx1ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke2hvdXJzfToke21pbnV0ZXN9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVwYXJlUGFzdGVkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0XG4gICAgICAucmVwbGFjZShSRUdFWF9ESVNBTExPV0VEX0NIQVJBQ1RFUlMsICcnKVxuICAgICAgLnN1YnN0cmluZygwLCA1IC0gKHRoaXMudGV4dENvbnRlbnQ/Lmxlbmd0aCA/PyAwKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2hvdWxkVmFsaWRhdGUobmFtZTogUHJvcGVydHlLZXkgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuc2hvdWxkVmFsaWRhdGUobmFtZSkgfHxcbiAgICAgIFsndmFsdWVBc0RhdGUnLCAnbWluJywgJ21heCcsICdkYXRlRmlsdGVyJ10uaW5jbHVkZXMobmFtZSBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB2YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICBzdXBlci52YWxpZGF0ZSgpO1xuICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5fcmVtb3ZlVmFsaWRpdHlFcnJvcnMoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl92YWx1ZUFzVGltZSkge1xuICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoJ2JhZElucHV0JywgaTE4blRpbWVJbnZhbGlkW3RoaXMubGFuZ3VhZ2UuY3VycmVudF0pO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzVGltZVZhbGlkKHRoaXMuX3ZhbHVlQXNUaW1lKSkge1xuICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoJ3JhbmdlT3ZlcmZsb3cnLCBpMThuVGltZU1heFt0aGlzLmxhbmd1YWdlLmN1cnJlbnRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVtb3ZlVmFsaWRpdHlFcnJvcnMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVWYWxpZGl0eUVycm9ycygpOiB2b2lkIHtcbiAgICAoWydiYWRJbnB1dCcsICdyYW5nZU92ZXJmbG93J10gYXMgY29uc3QpLmZvckVhY2goKGYpID0+IHRoaXMucmVtb3ZlVmFsaWRpdHlGbGFnKGYpKTtcbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgdmFsdWVzIG9mIGhvdXJzIGFuZCBtaW51dGVzIGFyZSBwb3NzaWJsZSwgdG8gYXZvaWQgbm9uLWV4aXN0ZW50IHRpbWVzLiAqL1xuICBwcml2YXRlIF9pc1RpbWVWYWxpZCh0aW1lOiBUaW1lKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRpbWUuaG91cnMgPCAyNCAmJiB0aW1lLm1pbnV0ZXMgPCA2MDtcbiAgfVxuXG4gIC8qKiAgT25seSBhbGxvdyB0eXBpbmcgbnVtYmVycyBhbmQgc2VwYXJhdG9yIGtleXMuICovXG4gIHByaXZhdGUgX3ByZXZlbnRDaGFySW5zZXJ0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgYWx3YXlzQWxsb3dlZCA9IFtcbiAgICAgICdCYWNrc3BhY2UnLFxuICAgICAgJ1RhYicsXG4gICAgICAnRW50ZXInLFxuICAgICAgJ0Fycm93VXAnLFxuICAgICAgJ0Fycm93RG93bicsXG4gICAgICAnQXJyb3dMZWZ0JyxcbiAgICAgICdBcnJvd1JpZ2h0JyxcbiAgICAgICdIb21lJyxcbiAgICAgICdFbmQnLFxuICAgICAgJ1BhZ2VVcCcsXG4gICAgICAnUGFnZURvd24nLFxuICAgICAgJ0RlbGV0ZScsXG4gICAgXTtcblxuICAgIGlmIChcbiAgICAgIGV2ZW50LmN0cmxLZXkgfHxcbiAgICAgIGV2ZW50LmFsdEtleSB8fFxuICAgICAgZXZlbnQubWV0YUtleSB8fFxuICAgICAgYWx3YXlzQWxsb3dlZC5pbmNsdWRlcyhldmVudC5rZXkpIHx8XG4gICAgICAoUkVHRVhfQUxMT1dFRF9DSEFSQUNURVJTLnRlc3QoZXZlbnQua2V5KSAmJiAodGhpcy52YWx1ZS5sZW5ndGggPCA1IHx8IHRoaXMuX2hhc1NlbGVjdGlvbigpKSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLnZhbHVlLmxlbmd0aCA+PSA1KSB7XG4gICAgICBzYmJMaXZlQW5ub3VuY2VyLmFubm91bmNlKGkxOG5UaW1lTWF4TGVuZ3RoW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYXNTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmFuZ2UgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LmdldFJhbmdlQXQoMCk7XG4gICAgcmV0dXJuICEhcmFuZ2UgJiYgcmFuZ2Uuc3RhcnRPZmZzZXQgIT09IHJhbmdlLmVuZE9mZnNldDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXRpbWUtaW5wdXQnOiBTYmJUaW1lSW5wdXRFbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FDZ0JBLElBQU0sMkJBQTJCO0FBQ2pDLElBQU0sOEJBQThCO0FBQ3BDLElBQU0sNkJBQTZCO0FBQ25DLElBQU0sMEJBQTBCOzs7O0lBVW5CLDZCQUFtQjttQkFBUyw0QkFBNEIsVUFBVTs7O2NBQWxFLDRCQUE0QixZQUF1Qzs7O2tDQTBCN0UsU0FBUyxFQUFFLFdBQVcsTUFBSyxDQUFFLENBQUM7R0FDL0IsYUFBQSxNQUFBLE1BQUEsNkJBQUE7SUFBQSxNQUFBO0lBQUEsTUFBQTtJQUFBLFFBQUE7SUFBQSxTQUFBO0lBQUEsUUFBQTtLQUFBLE1BQUEsUUFBQSxpQkFBQTtLQUFBLE1BQUEsS0FBQSxVQUFBO01BQUEsSUFBVyxjQUFXO0tBQUE7SUFBQTtJQUFBLFVBQUE7R0FBQSxHQUFBLE1BQUEsMEJBQUE7Ozs7Ozs7OztHQTFCVSxLQUFBLGNBQXNCO0VBQWlCOztHQUNoRCxLQUFBLFNBQXlCLENBQUMsVUFBVSxrQkFBSyxDQUFDO0VBQUU7Ozs7O0VBTW5FLElBQW9CLE1BQU0sT0FBYTtHQUNyQyxRQUNFLE9BQU8sVUFBVSxXQUNiLE1BQU0sUUFBUSw2QkFBNkIsRUFBRSxFQUFFLFVBQVUsR0FBRyxDQUFDLElBQzdEO0dBQ04sS0FBSyxlQUFlLEtBQUs7R0FHekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLFFBQVEsUUFBUSxLQUFLLEtBQUssZ0JBQWdCLE1BQy9ELFFBQVEsS0FBSyxZ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