@sbb-esta/lyne-elements-dev 4.9.0-dev.1775022187 → 4.9.0-dev.1775028444

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.
Files changed (35) hide show
  1. package/core/styles/core.scss +9 -0
  2. package/core.css +22 -0
  3. package/custom-elements.json +616 -616
  4. package/development/step-label.component-D3wrRPQ7.js +265 -0
  5. package/development/step.component-ewujsOVD.js +212 -0
  6. package/development/stepper/step/step.component.js +1 -1
  7. package/development/stepper/step-label/step-label.component.d.ts.map +1 -1
  8. package/development/stepper/step-label/step-label.component.js +1 -1
  9. package/development/stepper/step-label.js +1 -1
  10. package/development/stepper/step.js +1 -1
  11. package/development/stepper/stepper/stepper.component.d.ts.map +1 -1
  12. package/development/stepper/stepper/stepper.component.js +1 -1
  13. package/development/stepper/stepper.js +1 -1
  14. package/development/stepper.component-BJC_4cep.js +497 -0
  15. package/development/stepper.js +3 -3
  16. package/development/stepper.pure.js +3 -3
  17. package/off-brand-theme.css +22 -0
  18. package/package.json +2 -2
  19. package/safety-theme.css +22 -0
  20. package/standard-theme.css +22 -0
  21. package/step-label.component-Cu_Hck4P.js +80 -0
  22. package/{step.component-CbfVfpi6.js → step.component-DY61vAFB.js} +1 -1
  23. package/stepper/step/step.component.js +1 -1
  24. package/stepper/step-label/step-label.component.js +1 -1
  25. package/stepper/step-label.js +1 -1
  26. package/stepper/step.js +1 -1
  27. package/stepper/stepper/stepper.component.js +1 -1
  28. package/stepper/stepper.js +1 -1
  29. package/{stepper.component-CrMknCZm.js → stepper.component-83cngpic.js} +6 -8
  30. package/stepper.js +3 -3
  31. package/stepper.pure.js +3 -3
  32. package/development/step-label.component-C_obpSzp.js +0 -298
  33. package/development/step.component-DsXAckYS.js +0 -220
  34. package/development/stepper.component-yAkgcauE.js +0 -508
  35. package/step-label.component-BYaPBTcl.js +0 -82
@@ -1,508 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { css, html } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbElement } from "./core/base-elements.js";
5
- import { forceType } from "./core/decorators.js";
6
- import { isLean } from "./core/dom.js";
7
- import { boxSizingStyles } from "./core/styles.js";
8
- import { getNextElementIndex, isArrowKeyPressed } from "./core/a11y.js";
9
- import { IntersectionController } from "@lit-labs/observers/intersection-controller.js";
10
- import { SbbMediaMatcherController, SbbMediaQueryBreakpointLargeAndAbove, SbbMediaQueryBreakpointSmallAndAbove, SbbMediaQueryBreakpointUltraAndAbove, SbbMediaQueryBreakpointZeroAndAbove } from "./core/controllers/media-matchers-controller.js";
11
- //#region src/elements/stepper/stepper/stepper.scss?lit&inline
12
- var stepper_default = css`:host {
13
- --sbb-stepper-orientation: row;
14
- --sbb-stepper-border-width: var(--sbb-border-width-1x);
15
- --sbb-stepper-marker-size: 0;
16
- --sbb-stepper-marker-width: var(--sbb-border-width-3x);
17
- --sbb-stepper-animation-duration: var(
18
- --sbb-disable-animation-duration,
19
- var(--sbb-animation-duration-6x)
20
- );
21
- --sbb-stepper-marker-color: var(--sbb-color-3);
22
- display: block;
23
- position: relative;
24
- counter-reset: step-label;
25
- }
26
- @media (forced-colors: active) {
27
- :host {
28
- --sbb-stepper-marker-color: ButtonText;
29
- }
30
- }
31
-
32
- :host(:is(:state(disable-animation),[state--disable-animation])) {
33
- --sbb-disable-animation-duration: 0s;
34
- }
35
-
36
- :host([orientation=vertical]) {
37
- --sbb-stepper-orientation: column;
38
- }
39
-
40
- .sbb-stepper {
41
- width: 100%;
42
- }
43
-
44
- .sbb-stepper__labels {
45
- display: flex;
46
- flex-direction: var(--sbb-stepper-orientation);
47
- position: relative;
48
- justify-content: start;
49
- margin-block-end: var(--sbb-spacing-responsive-m);
50
- }
51
- .sbb-stepper__labels::before {
52
- content: "";
53
- position: absolute;
54
- inset-inline-start: calc(var(--sbb-stepper-border-width) * -1);
55
- background-color: var(--sbb-stepper-marker-color);
56
- }
57
- :host([orientation=horizontal]) .sbb-stepper__labels {
58
- gap: var(--sbb-spacing-responsive-m);
59
- padding-block-end: var(--sbb-spacing-fixed-4x);
60
- border-block-end: var(--sbb-stepper-border-width) solid var(--sbb-border-color-4-inverted);
61
- }
62
- :host([orientation=horizontal]) .sbb-stepper__labels::before {
63
- inset-block-end: calc(var(--sbb-stepper-border-width) * -1);
64
- height: var(--sbb-stepper-marker-width);
65
- width: var(--sbb-stepper-marker-size);
66
- transition: width var(--sbb-stepper-animation-duration) var(--sbb-animation-easing);
67
- }
68
- :host([orientation=vertical]) .sbb-stepper__labels {
69
- padding-inline-start: var(--sbb-spacing-fixed-4x);
70
- border-inline-start: var(--sbb-stepper-border-width) solid var(--sbb-border-color-4-inverted);
71
- }
72
- :host([orientation=vertical]) .sbb-stepper__labels::before {
73
- inset-block-start: 0;
74
- width: var(--sbb-stepper-marker-width);
75
- height: var(--sbb-stepper-marker-size);
76
- transition: height var(--sbb-stepper-animation-duration) var(--sbb-animation-easing);
77
- }
78
-
79
- .sbb-stepper__steps {
80
- position: relative;
81
- }
82
- :host([orientation=horizontal]) .sbb-stepper__steps {
83
- height: var(--sbb-stepper-content-height);
84
- transition: height var(--sbb-stepper-animation-duration) var(--sbb-animation-easing);
85
- }
86
-
87
- ::slotted(sbb-step-label)::before {
88
- content: counter(step-label);
89
- counter-increment: step-label;
90
- }`;
91
- //#endregion
92
- //#region src/elements/stepper/stepper/stepper.component.ts
93
- var DEBOUNCE_TIME = 150;
94
- var breakpointMap = {
95
- zero: SbbMediaQueryBreakpointZeroAndAbove,
96
- small: SbbMediaQueryBreakpointSmallAndAbove,
97
- large: SbbMediaQueryBreakpointLargeAndAbove,
98
- ultra: SbbMediaQueryBreakpointUltraAndAbove
99
- };
100
- var SbbStepChangeEvent = class extends Event {
101
- constructor(selectedIndex, previousIndex, selectedStep, previousStep) {
102
- super("stepchange", {
103
- bubbles: true,
104
- composed: true
105
- });
106
- this.selectedIndex = selectedIndex;
107
- this.previousIndex = previousIndex;
108
- this.selectedStep = selectedStep;
109
- this.previousStep = previousStep;
110
- }
111
- };
112
- /**
113
- * Provides a structured, step-by-step workflow for user interactions.
114
- * @slot - Provide a `sbb-expansion-panel-header` and a `sbb-expansion-panel-content` to the stepper.
115
- * @slot step-label - Use this slot to provide an `sbb-step-label`.
116
- * @slot step - Use this slot to provide an `sbb-step`.
117
- * @event {SbbStepChangeEvent} stepchange - Emits whenever a step was changed.
118
- */
119
- var SbbStepperElement = (() => {
120
- let _classSuper = SbbElement;
121
- let _instanceExtraInitializers = [];
122
- let _linear_decorators;
123
- let _linear_initializers = [];
124
- let _linear_extraInitializers = [];
125
- let _set_horizontalFrom_decorators;
126
- let _orientation_decorators;
127
- let _orientation_initializers = [];
128
- let _orientation_extraInitializers = [];
129
- let _size_decorators;
130
- let _size_initializers = [];
131
- let _size_extraInitializers = [];
132
- let _set_selected_decorators;
133
- let _set_selectedIndex_decorators;
134
- return class SbbStepperElement extends _classSuper {
135
- static {
136
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
137
- _linear_decorators = [forceType(), property({ type: Boolean })];
138
- _set_horizontalFrom_decorators = [property({
139
- attribute: "horizontal-from",
140
- reflect: true
141
- })];
142
- _orientation_decorators = [property({ reflect: true })];
143
- _size_decorators = [property({ reflect: true })];
144
- _set_selected_decorators = [property({ attribute: false })];
145
- _set_selectedIndex_decorators = [property({
146
- attribute: "selected-index",
147
- type: Number
148
- })];
149
- __esDecorate(this, null, _linear_decorators, {
150
- kind: "accessor",
151
- name: "linear",
152
- static: false,
153
- private: false,
154
- access: {
155
- has: (obj) => "linear" in obj,
156
- get: (obj) => obj.linear,
157
- set: (obj, value) => {
158
- obj.linear = value;
159
- }
160
- },
161
- metadata: _metadata
162
- }, _linear_initializers, _linear_extraInitializers);
163
- __esDecorate(this, null, _set_horizontalFrom_decorators, {
164
- kind: "setter",
165
- name: "horizontalFrom",
166
- static: false,
167
- private: false,
168
- access: {
169
- has: (obj) => "horizontalFrom" in obj,
170
- set: (obj, value) => {
171
- obj.horizontalFrom = value;
172
- }
173
- },
174
- metadata: _metadata
175
- }, null, _instanceExtraInitializers);
176
- __esDecorate(this, null, _orientation_decorators, {
177
- kind: "accessor",
178
- name: "orientation",
179
- static: false,
180
- private: false,
181
- access: {
182
- has: (obj) => "orientation" in obj,
183
- get: (obj) => obj.orientation,
184
- set: (obj, value) => {
185
- obj.orientation = value;
186
- }
187
- },
188
- metadata: _metadata
189
- }, _orientation_initializers, _orientation_extraInitializers);
190
- __esDecorate(this, null, _size_decorators, {
191
- kind: "accessor",
192
- name: "size",
193
- static: false,
194
- private: false,
195
- access: {
196
- has: (obj) => "size" in obj,
197
- get: (obj) => obj.size,
198
- set: (obj, value) => {
199
- obj.size = value;
200
- }
201
- },
202
- metadata: _metadata
203
- }, _size_initializers, _size_extraInitializers);
204
- __esDecorate(this, null, _set_selected_decorators, {
205
- kind: "setter",
206
- name: "selected",
207
- static: false,
208
- private: false,
209
- access: {
210
- has: (obj) => "selected" in obj,
211
- set: (obj, value) => {
212
- obj.selected = value;
213
- }
214
- },
215
- metadata: _metadata
216
- }, null, _instanceExtraInitializers);
217
- __esDecorate(this, null, _set_selectedIndex_decorators, {
218
- kind: "setter",
219
- name: "selectedIndex",
220
- static: false,
221
- private: false,
222
- access: {
223
- has: (obj) => "selectedIndex" in obj,
224
- set: (obj, value) => {
225
- obj.selectedIndex = value;
226
- }
227
- },
228
- metadata: _metadata
229
- }, null, _instanceExtraInitializers);
230
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
231
- enumerable: true,
232
- configurable: true,
233
- writable: true,
234
- value: _metadata
235
- });
236
- }
237
- static {
238
- this.elementName = "sbb-stepper";
239
- }
240
- static {
241
- this.styles = [boxSizingStyles, stepper_default];
242
- }
243
- static {
244
- this.events = { stepchange: "stepchange" };
245
- }
246
- #linear_accessor_storage;
247
- /** If set to true, only the current and previous labels can be clicked and selected. */
248
- get linear() {
249
- return this.#linear_accessor_storage;
250
- }
251
- set linear(value) {
252
- this.#linear_accessor_storage = value;
253
- }
254
- /** Overrides the behavior of `orientation` property. */
255
- set horizontalFrom(value) {
256
- this._horizontalFrom = value && breakpointMap[value] ? value : null;
257
- if (this._horizontalFrom && this._loaded) this._checkOrientation();
258
- }
259
- get horizontalFrom() {
260
- return this._horizontalFrom;
261
- }
262
- #orientation_accessor_storage;
263
- /** Steps orientation, either horizontal or vertical. */
264
- get orientation() {
265
- return this.#orientation_accessor_storage;
266
- }
267
- set orientation(value) {
268
- this.#orientation_accessor_storage = value;
269
- }
270
- #size_accessor_storage;
271
- /**
272
- * Size variant, either s or m.
273
- * @default 'm' / 's' (lean)
274
- */
275
- get size() {
276
- return this.#size_accessor_storage;
277
- }
278
- set size(value) {
279
- this.#size_accessor_storage = value;
280
- }
281
- /** The currently selected step. */
282
- set selected(step) {
283
- if (this._loaded) this._select(step);
284
- this._requestedSelected = step;
285
- }
286
- get selected() {
287
- return this.querySelector?.("sbb-step:is(:state(selected),[state--selected])") ?? null;
288
- }
289
- /** The currently selected step index. */
290
- set selectedIndex(index) {
291
- if (this._loaded && index !== null) this._select(this.steps[index]);
292
- this._requestedSelectedIndex = index;
293
- }
294
- get selectedIndex() {
295
- return this.selected ? this.steps.indexOf(this.selected) : null;
296
- }
297
- /** The steps of the stepper. */
298
- get steps() {
299
- const steps = [];
300
- this.querySelectorAll?.("sbb-step").forEach((step) => {
301
- customElements.upgrade(step);
302
- steps.push(step);
303
- });
304
- return steps;
305
- }
306
- get _enabledSteps() {
307
- return this.steps.filter((s) => {
308
- if (s.label) {
309
- customElements.upgrade(s.label);
310
- return !s.label.disabled;
311
- }
312
- return false;
313
- });
314
- }
315
- constructor() {
316
- super();
317
- /**
318
- * If the sbb-stepper is used in a sbb-dialog, the marker on the selected element will not appear,
319
- * because the calculations are done when the dialog is closed, so the marker has a width of 0;
320
- * the same happens for the stepper height.
321
- * We need to recalculate it when the element becomes visible.
322
- */
323
- this._observer = (__runInitializers(this, _instanceExtraInitializers), new IntersectionController(this, {
324
- target: null,
325
- callback: (entries) => {
326
- entries.forEach((e) => {
327
- if (e.intersectionRatio > 0) {
328
- this._setStepperHeight(this.selected);
329
- this._setMarkerSize();
330
- }
331
- });
332
- }
333
- }));
334
- this.#linear_accessor_storage = __runInitializers(this, _linear_initializers, false);
335
- this._horizontalFrom = (__runInitializers(this, _linear_extraInitializers), null);
336
- this.#orientation_accessor_storage = __runInitializers(this, _orientation_initializers, "horizontal");
337
- this.#size_accessor_storage = (__runInitializers(this, _orientation_extraInitializers), __runInitializers(this, _size_initializers, isLean() ? "s" : "m"));
338
- this._requestedSelected = (__runInitializers(this, _size_extraInitializers), null);
339
- this._requestedSelectedIndex = null;
340
- this._loaded = false;
341
- this._resizeObserverTimeout = null;
342
- this._mediaMatcher = new SbbMediaMatcherController(this, {});
343
- this._onStepperResize = () => {
344
- this._checkOrientation();
345
- this._setStepperHeight(this.selected);
346
- clearTimeout(this._resizeObserverTimeout);
347
- this.internals.states.add("disable-animation");
348
- this._resizeObserverTimeout = setTimeout(() => this.internals.states.delete("disable-animation"), DEBOUNCE_TIME);
349
- };
350
- this.addEventListener?.("keydown", (e) => this._handleKeyDown(e));
351
- this.addEventListener?.("resizechange", (e) => this._onSelectedStepResize(e));
352
- }
353
- /** Selects the next step. */
354
- next() {
355
- if (this.selectedIndex !== null) this._select(this.steps[this.selectedIndex + 1]);
356
- }
357
- /** Selects the previous step. */
358
- previous() {
359
- if (this.selectedIndex !== null) this._select(this.steps[this.selectedIndex - 1]);
360
- }
361
- /** Resets the form in which the stepper is nested or every form of each step, if any. */
362
- reset() {
363
- const closestForm = this.closest("form");
364
- if (closestForm) closestForm.reset();
365
- else this.querySelectorAll("form").forEach((form) => form.reset());
366
- this.selectedIndex = 0;
367
- if (document.activeElement?.closest("sbb-stepper") === this) this.selected?.label?.focus();
368
- }
369
- _isSelectable(step) {
370
- if (step) {
371
- customElements.upgrade(step);
372
- if (step.label) {
373
- customElements.upgrade(step.label);
374
- if (!this.linear && step.label.disabled) return false;
375
- }
376
- return true;
377
- } else return false;
378
- }
379
- _select(step) {
380
- if (!this._isSelectable(step) || step === this.selected) return;
381
- const currentIndex = this.selectedIndex;
382
- const currentStep = this.selected;
383
- const validatePayload = {
384
- currentIndex,
385
- currentStep,
386
- nextIndex: this.selectedIndex !== null ? this.selectedIndex + 1 : null,
387
- nextStep: this.selectedIndex !== null ? this.steps[this.selectedIndex + 1] : null
388
- };
389
- if (this.selected && !this.selected.validate(validatePayload)) return;
390
- this.selected?.deselect();
391
- step.select();
392
- /** @internal only to provide double entry in docs. It is a public event! */
393
- this.dispatchEvent(new SbbStepChangeEvent(this.selectedIndex, currentIndex, this.selected, currentStep));
394
- this._setMarkerSize();
395
- this._setStepperHeight(step);
396
- this._configureLinearMode();
397
- if (document.activeElement?.closest("sbb-stepper") === this) this.selected?.label?.focus();
398
- }
399
- _setMarkerSize() {
400
- if (!this._loaded || !this.selected || this.selectedIndex === void 0 || !this.selected.label) return;
401
- const offset = this.orientation === "horizontal" ? this.selected.label.offsetLeft + this.selected.label.offsetWidth : this._calculateLabelOffsetTop();
402
- this.style.setProperty("--sbb-stepper-marker-size", `${offset}px`);
403
- }
404
- /**
405
- * Sets the stepper height based on the height of the provided step.
406
- */
407
- _setStepperHeight(step) {
408
- if (step && step.shadowRoot) {
409
- const innerElement = step.shadowRoot.querySelector(".sbb-step");
410
- if (innerElement) this.style?.setProperty("--sbb-stepper-content-height", `${innerElement.offsetHeight}px`);
411
- }
412
- }
413
- _calculateLabelOffsetTop() {
414
- if (this.selectedIndex === null) return;
415
- let offset = 0;
416
- for (const step of this.steps) {
417
- if (step === this.selected) break;
418
- offset = step.label.offsetHeight + offset;
419
- }
420
- return offset + this.selected.label.offsetHeight + parseFloat(getComputedStyle(this).getPropertyValue("--sbb-spacing-fixed-6x")) * 16 * this.selectedIndex;
421
- }
422
- _onSelectedStepResize(e) {
423
- this._setStepperHeight(e.target);
424
- }
425
- _configure() {
426
- this.steps.forEach((step, i, array) => {
427
- step.configure(this._loaded);
428
- step.label?.configure(i + 1, array.length, this._loaded);
429
- });
430
- this._select(this.selected || this._enabledSteps[0]);
431
- }
432
- _updateLabels() {
433
- this.steps.forEach((step) => {
434
- step.slot = this.orientation === "horizontal" ? "step" : "step-label";
435
- });
436
- }
437
- _checkOrientation() {
438
- if (this.horizontalFrom) {
439
- this.orientation = this._mediaMatcher.matches(breakpointMap[this.horizontalFrom]) ? "horizontal" : "vertical";
440
- this._updateLabels();
441
- }
442
- setTimeout(() => this._setMarkerSize(), 0);
443
- }
444
- _configureLinearMode() {
445
- this.steps.forEach((step, index) => {
446
- if (!step.label) return;
447
- customElements.upgrade(step.label);
448
- step.label.disable(this.linear && index > this.selectedIndex || !this.linear && step.label.matches(":is(:state(user-disabled),[state--user-disabled])"));
449
- });
450
- }
451
- connectedCallback() {
452
- super.connectedCallback();
453
- window.addEventListener("resize", this._onStepperResize, { passive: true });
454
- this.toggleState("disable-animation", !this._loaded);
455
- }
456
- disconnectedCallback() {
457
- super.disconnectedCallback();
458
- window.removeEventListener("resize", this._onStepperResize);
459
- }
460
- firstUpdated(changedProperties) {
461
- super.firstUpdated(changedProperties);
462
- this.updateComplete.then(() => {
463
- this._loaded = true;
464
- this._configure();
465
- if (this._requestedSelected && this.steps.indexOf(this._requestedSelected) !== -1) this.selectedIndex = this.steps.indexOf(this._requestedSelected);
466
- else if (this._requestedSelectedIndex) this.selectedIndex = this._requestedSelectedIndex;
467
- else this.selectedIndex = 0;
468
- this._observer.observe(this);
469
- this._checkOrientation();
470
- setTimeout(() => this.internals.states.delete("disable-animation"), DEBOUNCE_TIME);
471
- });
472
- }
473
- willUpdate(changedProperties) {
474
- super.willUpdate(changedProperties);
475
- if (changedProperties.has("orientation") && !this.horizontalFrom) {
476
- this._updateLabels();
477
- this._setMarkerSize();
478
- }
479
- if (changedProperties.has("linear") && this._loaded) this._configureLinearMode();
480
- if (changedProperties.has("size")) this._setMarkerSize();
481
- }
482
- _handleKeyDown(evt) {
483
- const enabledSteps = this._enabledSteps;
484
- if (!enabledSteps || evt.target !== this && evt.target.parentElement !== this) return;
485
- if (isArrowKeyPressed(evt)) {
486
- const nextIndex = getNextElementIndex(evt, enabledSteps.indexOf(this.selected), enabledSteps.length);
487
- this._select(enabledSteps[nextIndex]);
488
- evt.preventDefault();
489
- }
490
- }
491
- render() {
492
- return html`
493
- <div class="sbb-stepper">
494
- <div class="sbb-stepper__labels" role="tablist">
495
- <slot name="step-label" @slotchange=${this._configure}></slot>
496
- </div>
497
- <div class="sbb-stepper__steps">
498
- <slot name="step" @slotchange=${this._configure}></slot>
499
- </div>
500
- </div>
501
- `;
502
- }
503
- };
504
- })();
505
- //#endregion
506
- export { SbbStepperElement as n, SbbStepChangeEvent as t };
507
-
508
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5jb21wb25lbnQteUFrZ2NhdUUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3N0ZXBwZXIvc3RlcHBlci9zdGVwcGVyLnNjc3M/bGl0JmlubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9zdGVwcGVyL3N0ZXBwZXIvc3RlcHBlci5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAtLXNiYi1zdGVwcGVyLW9yaWVudGF0aW9uOiByb3c7XG4gIC0tc2JiLXN0ZXBwZXItYm9yZGVyLXdpZHRoOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTF4KTtcbiAgLS1zYmItc3RlcHBlci1tYXJrZXItc2l6ZTogMDtcbiAgLS1zYmItc3RlcHBlci1tYXJrZXItd2lkdGg6IHZhcigtLXNiYi1ib3JkZXItd2lkdGgtM3gpO1xuICAtLXNiYi1zdGVwcGVyLWFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKFxuICAgIC0tc2JiLWRpc2FibGUtYW5pbWF0aW9uLWR1cmF0aW9uLFxuICAgIHZhcigtLXNiYi1hbmltYXRpb24tZHVyYXRpb24tNngpXG4gICk7XG4gIC0tc2JiLXN0ZXBwZXItbWFya2VyLWNvbG9yOiB2YXIoLS1zYmItY29sb3ItMyk7XG5cbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgY291bnRlci1yZXNldDogc3RlcC1sYWJlbDtcblxuICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgLS1zYmItc3RlcHBlci1tYXJrZXItY29sb3I6IEJ1dHRvblRleHQ7XG4gIH1cbn1cblxuOmhvc3QoOnN0YXRlKGRpc2FibGUtYW5pbWF0aW9uKSkge1xuICBAaW5jbHVkZSBzYmIuZGlzYWJsZS1hbmltYXRpb247XG59XG5cbjpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkge1xuICAtLXNiYi1zdGVwcGVyLW9yaWVudGF0aW9uOiBjb2x1bW47XG59XG5cbi5zYmItc3RlcHBlciB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uc2JiLXN0ZXBwZXJfX2xhYmVscyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiB2YXIoLS1zYmItc3RlcHBlci1vcmllbnRhdGlvbik7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAganVzdGlmeS1jb250ZW50OiBzdGFydDtcbiAgbWFyZ2luLWJsb2NrLWVuZDogdmFyKC0tc2JiLXNwYWNpbmctcmVzcG9uc2l2ZS1tKTtcblxuICAmOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldC1pbmxpbmUtc3RhcnQ6IGNhbGModmFyKC0tc2JiLXN0ZXBwZXItYm9yZGVyLXdpZHRoKSAqIC0xKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zYmItc3RlcHBlci1tYXJrZXItY29sb3IpO1xuICB9XG5cbiAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pICYge1xuICAgIGdhcDogdmFyKC0tc2JiLXNwYWNpbmctcmVzcG9uc2l2ZS1tKTtcbiAgICBwYWRkaW5nLWJsb2NrLWVuZDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtNHgpO1xuICAgIGJvcmRlci1ibG9jay1lbmQ6IHZhcigtLXNiYi1zdGVwcGVyLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tc2JiLWJvcmRlci1jb2xvci00LWludmVydGVkKTtcblxuICAgICY6OmJlZm9yZSB7XG4gICAgICBpbnNldC1ibG9jay1lbmQ6IGNhbGModmFyKC0tc2JiLXN0ZXBwZXItYm9yZGVyLXdpZHRoKSAqIC0xKTtcbiAgICAgIGhlaWdodDogdmFyKC0tc2JiLXN0ZXBwZXItbWFya2VyLXdpZHRoKTtcbiAgICAgIHdpZHRoOiB2YXIoLS1zYmItc3RlcHBlci1tYXJrZXItc2l6ZSk7XG4gICAgICB0cmFuc2l0aW9uOiB3aWR0aCB2YXIoLS1zYmItc3RlcHBlci1hbmltYXRpb24tZHVyYXRpb24pIHZhcigtLXNiYi1hbmltYXRpb24tZWFzaW5nKTtcbiAgICB9XG4gIH1cblxuICA6aG9zdChbb3JpZW50YXRpb249J3ZlcnRpY2FsJ10pICYge1xuICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC00eCk7XG4gICAgYm9yZGVyLWlubGluZS1zdGFydDogdmFyKC0tc2JiLXN0ZXBwZXItYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1zYmItYm9yZGVyLWNvbG9yLTQtaW52ZXJ0ZWQpO1xuXG4gICAgJjo6YmVmb3JlIHtcbiAgICAgIGluc2V0LWJsb2NrLXN0YXJ0OiAwO1xuICAgICAgd2lkdGg6IHZhcigtLXNiYi1zdGVwcGVyLW1hcmtlci13aWR0aCk7XG4gICAgICBoZWlnaHQ6IHZhcigtLXNiYi1zdGVwcGVyLW1hcmtlci1zaXplKTtcbiAgICAgIHRyYW5zaXRpb246IGhlaWdodCB2YXIoLS1zYmItc3RlcHBlci1hbmltYXRpb24tZHVyYXRpb24pIHZhcigtLXNiYi1hbmltYXRpb24tZWFzaW5nKTtcbiAgICB9XG4gIH1cbn1cblxuLnNiYi1zdGVwcGVyX19zdGVwcyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgJiB7XG4gICAgaGVpZ2h0OiB2YXIoLS1zYmItc3RlcHBlci1jb250ZW50LWhlaWdodCk7XG4gICAgdHJhbnNpdGlvbjogaGVpZ2h0IHZhcigtLXNiYi1zdGVwcGVyLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tc2JiLWFuaW1hdGlvbi1lYXNpbmcpO1xuICB9XG59XG5cbjo6c2xvdHRlZChzYmItc3RlcC1sYWJlbCk6OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IGNvdW50ZXIoc3RlcC1sYWJlbCk7XG4gIGNvdW50ZXItaW5jcmVtZW50OiBzdGVwLWxhYmVsO1xufVxuIiwiaW1wb3J0IHsgSW50ZXJzZWN0aW9uQ29udHJvbGxlciB9IGZyb20gJ0BsaXQtbGFicy9vYnNlcnZlcnMvaW50ZXJzZWN0aW9uLWNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHsgdHlwZSBDU1NSZXN1bHRHcm91cCwgaHRtbCwgdHlwZSBQcm9wZXJ0eVZhbHVlcywgdHlwZSBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgZ2V0TmV4dEVsZW1lbnRJbmRleCwgaXNBcnJvd0tleVByZXNzZWQgfSBmcm9tICcuLi8uLi9jb3JlL2ExMXkudHMnO1xuaW1wb3J0IHsgU2JiRWxlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvYmFzZS1lbGVtZW50cy50cyc7XG5pbXBvcnQge1xuICBTYmJNZWRpYU1hdGNoZXJDb250cm9sbGVyLFxuICBTYmJNZWRpYVF1ZXJ5QnJlYWtwb2ludExhcmdlQW5kQWJvdmUsXG4gIFNiYk1lZGlhUXVlcnlCcmVha3BvaW50U21hbGxBbmRBYm92ZSxcbiAgU2JiTWVkaWFRdWVyeUJyZWFrcG9pbnRVbHRyYUFuZEFib3ZlLFxuICBTYmJNZWRpYVF1ZXJ5QnJlYWtwb2ludFplcm9BbmRBYm92ZSxcbn0gZnJvbSAnLi4vLi4vY29yZS9jb250cm9sbGVycy9tZWRpYS1tYXRjaGVycy1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IGZvcmNlVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvZGVjb3JhdG9ycy50cyc7XG5pbXBvcnQgeyBpc0xlYW4gfSBmcm9tICcuLi8uLi9jb3JlL2RvbS50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYkhvcml6b250YWxGcm9tLCBTYmJPcmllbnRhdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvaW50ZXJmYWNlcy50cyc7XG5pbXBvcnQgeyBib3hTaXppbmdTdHlsZXMgfSBmcm9tICcuLi8uLi9jb3JlL3N0eWxlcy50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYlN0ZXBFbGVtZW50LCBTYmJTdGVwVmFsaWRhdGVFdmVudERldGFpbHMgfSBmcm9tICcuLi9zdGVwL3N0ZXAuY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vc3RlcHBlci5zY3NzP2xpdCZpbmxpbmUnO1xuXG5jb25zdCBERUJPVU5DRV9USU1FID0gMTUwO1xuXG5jb25zdCBicmVha3BvaW50TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICB6ZXJvOiBTYmJNZWRpYVF1ZXJ5QnJlYWtwb2ludFplcm9BbmRBYm92ZSxcbiAgc21hbGw6IFNiYk1lZGlhUXVlcnlCcmVha3BvaW50U21hbGxBbmRBYm92ZSxcbiAgbGFyZ2U6IFNiYk1lZGlhUXVlcnlCcmVha3BvaW50TGFyZ2VBbmRBYm92ZSxcbiAgdWx0cmE6IFNiYk1lZGlhUXVlcnlCcmVha3BvaW50VWx0cmFBbmRBYm92ZSxcbn07XG5cbmV4cG9ydCBjbGFzcyBTYmJTdGVwQ2hhbmdlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIC8qKiBUaGUgaW5kZXggb2YgdGhlIG5ld2x5IHNlbGVjdGVkIHN0ZXAuICovXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZEluZGV4OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKiBUaGUgaW5kZXggb2YgdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgc3RlcC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHByZXZpb3VzSW5kZXg6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqIFRoZSBuZXdseSBzZWxlY3RlZCBzdGVwIGVsZW1lbnQuICovXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZFN0ZXA6IFNiYlN0ZXBFbGVtZW50IHwgbnVsbDtcblxuICAvKiogVGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgc3RlcCBlbGVtZW50LiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJldmlvdXNTdGVwOiBTYmJTdGVwRWxlbWVudCB8IG51bGw7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNlbGVjdGVkSW5kZXg6IG51bWJlciB8IG51bGwsXG4gICAgcHJldmlvdXNJbmRleDogbnVtYmVyIHwgbnVsbCxcbiAgICBzZWxlY3RlZFN0ZXA6IFNiYlN0ZXBFbGVtZW50IHwgbnVsbCxcbiAgICBwcmV2aW91c1N0ZXA6IFNiYlN0ZXBFbGVtZW50IHwgbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIoJ3N0ZXBjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUsIGNvbXBvc2VkOiB0cnVlIH0pO1xuICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgdGhpcy5wcmV2aW91c0luZGV4ID0gcHJldmlvdXNJbmRleDtcbiAgICB0aGlzLnNlbGVjdGVkU3RlcCA9IHNlbGVjdGVkU3RlcDtcbiAgICB0aGlzLnByZXZpb3VzU3RlcCA9IHByZXZpb3VzU3RlcDtcbiAgfVxufVxuLyoqXG4gKiBQcm92aWRlcyBhIHN0cnVjdHVyZWQsIHN0ZXAtYnktc3RlcCB3b3JrZmxvdyBmb3IgdXNlciBpbnRlcmFjdGlvbnMuXG4gKiBAc2xvdCAtIFByb3ZpZGUgYSBgc2JiLWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJgIGFuZCBhIGBzYmItZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRgIHRvIHRoZSBzdGVwcGVyLlxuICogQHNsb3Qgc3RlcC1sYWJlbCAtIFVzZSB0aGlzIHNsb3QgdG8gcHJvdmlkZSBhbiBgc2JiLXN0ZXAtbGFiZWxgLlxuICogQHNsb3Qgc3RlcCAtIFVzZSB0aGlzIHNsb3QgdG8gcHJvdmlkZSBhbiBgc2JiLXN0ZXBgLlxuICogQGV2ZW50IHtTYmJTdGVwQ2hhbmdlRXZlbnR9IHN0ZXBjaGFuZ2UgLSBFbWl0cyB3aGVuZXZlciBhIHN0ZXAgd2FzIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTYmJTdGVwcGVyRWxlbWVudCBleHRlbmRzIFNiYkVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXN0ZXBwZXInO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbYm94U2l6aW5nU3R5bGVzLCBzdHlsZV07XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHN0ZXBjaGFuZ2U6ICdzdGVwY2hhbmdlJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKipcbiAgICogSWYgdGhlIHNiYi1zdGVwcGVyIGlzIHVzZWQgaW4gYSBzYmItZGlhbG9nLCB0aGUgbWFya2VyIG9uIHRoZSBzZWxlY3RlZCBlbGVtZW50IHdpbGwgbm90IGFwcGVhcixcbiAgICogYmVjYXVzZSB0aGUgY2FsY3VsYXRpb25zIGFyZSBkb25lIHdoZW4gdGhlIGRpYWxvZyBpcyBjbG9zZWQsIHNvIHRoZSBtYXJrZXIgaGFzIGEgd2lkdGggb2YgMDtcbiAgICogdGhlIHNhbWUgaGFwcGVucyBmb3IgdGhlIHN0ZXBwZXIgaGVpZ2h0LlxuICAgKiBXZSBuZWVkIHRvIHJlY2FsY3VsYXRlIGl0IHdoZW4gdGhlIGVsZW1lbnQgYmVjb21lcyB2aXNpYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBfb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uQ29udHJvbGxlcih0aGlzLCB7XG4gICAgdGFyZ2V0OiBudWxsLFxuICAgIGNhbGxiYWNrOiAoZW50cmllcykgPT4ge1xuICAgICAgZW50cmllcy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgIGlmIChlLmludGVyc2VjdGlvblJhdGlvID4gMCkge1xuICAgICAgICAgIHRoaXMuX3NldFN0ZXBwZXJIZWlnaHQodGhpcy5zZWxlY3RlZCk7XG4gICAgICAgICAgdGhpcy5fc2V0TWFya2VyU2l6ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogSWYgc2V0IHRvIHRydWUsIG9ubHkgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIGxhYmVscyBjYW4gYmUgY2xpY2tlZCBhbmQgc2VsZWN0ZWQuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBsaW5lYXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogT3ZlcnJpZGVzIHRoZSBiZWhhdmlvciBvZiBgb3JpZW50YXRpb25gIHByb3BlcnR5LiAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdob3Jpem9udGFsLWZyb20nLCByZWZsZWN0OiB0cnVlIH0pXG4gIHB1YmxpYyBzZXQgaG9yaXpvbnRhbEZyb20odmFsdWU6IFNiYkhvcml6b250YWxGcm9tIHwgbnVsbCkge1xuICAgIHRoaXMuX2hvcml6b250YWxGcm9tID0gdmFsdWUgJiYgYnJlYWtwb2ludE1hcFt2YWx1ZV0gPyB2YWx1ZSA6IG51bGw7XG4gICAgaWYgKHRoaXMuX2hvcml6b250YWxGcm9tICYmIHRoaXMuX2xvYWRlZCkge1xuICAgICAgdGhpcy5fY2hlY2tPcmllbnRhdGlvbigpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGhvcml6b250YWxGcm9tKCk6IFNiYkhvcml6b250YWxGcm9tIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2hvcml6b250YWxGcm9tO1xuICB9XG4gIHByaXZhdGUgX2hvcml6b250YWxGcm9tOiBTYmJIb3Jpem9udGFsRnJvbSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBTdGVwcyBvcmllbnRhdGlvbiwgZWl0aGVyIGhvcml6b250YWwgb3IgdmVydGljYWwuICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUgfSlcbiAgcHVibGljIGFjY2Vzc29yIG9yaWVudGF0aW9uOiBTYmJPcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJztcblxuICAvKipcbiAgICogU2l6ZSB2YXJpYW50LCBlaXRoZXIgcyBvciBtLlxuICAgKiBAZGVmYXVsdCAnbScgLyAncycgKGxlYW4pXG4gICAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pIHB1YmxpYyBhY2Nlc3NvciBzaXplOiAncycgfCAnbScgPSBpc0xlYW4oKSA/ICdzJyA6ICdtJztcblxuICAvKiogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzdGVwLiAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWQoc3RlcDogU2JiU3RlcEVsZW1lbnQgfCBudWxsKSB7XG4gICAgaWYgKHRoaXMuX2xvYWRlZCkge1xuICAgICAgdGhpcy5fc2VsZWN0KHN0ZXApO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0ZWRTZWxlY3RlZCA9IHN0ZXA7XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZCgpOiBTYmJTdGVwRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3I/LjxTYmJTdGVwRWxlbWVudD4oJ3NiYi1zdGVwOnN0YXRlKHNlbGVjdGVkKScpID8/IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBfcmVxdWVzdGVkU2VsZWN0ZWQ6IFNiYlN0ZXBFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3RlcCBpbmRleC4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VsZWN0ZWQtaW5kZXgnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIHNldCBzZWxlY3RlZEluZGV4KGluZGV4OiBudW1iZXIgfCBudWxsKSB7XG4gICAgaWYgKHRoaXMuX2xvYWRlZCAmJiBpbmRleCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fc2VsZWN0KHRoaXMuc3RlcHNbaW5kZXhdKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdGVkU2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICB9XG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRJbmRleCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZCA/IHRoaXMuc3RlcHMuaW5kZXhPZih0aGlzLnNlbGVjdGVkKSA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBfcmVxdWVzdGVkU2VsZWN0ZWRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRoZSBzdGVwcyBvZiB0aGUgc3RlcHBlci4gKi9cbiAgcHVibGljIGdldCBzdGVwcygpOiBTYmJTdGVwRWxlbWVudFtdIHtcbiAgICBjb25zdCBzdGVwczogU2JiU3RlcEVsZW1lbnRbXSA9IFtdO1xuICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbD8uKCdzYmItc3RlcCcpLmZvckVhY2goKHN0ZXApID0+IHtcbiAgICAgIGN1c3RvbUVsZW1lbnRzLnVwZ3JhZGUoc3RlcCk7XG4gICAgICBzdGVwcy5wdXNoKHN0ZXApO1xuICAgIH0pO1xuICAgIHJldHVybiBzdGVwcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9lbmFibGVkU3RlcHMoKTogU2JiU3RlcEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcHMuZmlsdGVyKChzKSA9PiB7XG4gICAgICBpZiAocy5sYWJlbCkge1xuICAgICAgICBjdXN0b21FbGVtZW50cy51cGdyYWRlKHMubGFiZWwpO1xuICAgICAgICByZXR1cm4gIXMubGFiZWwuZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9sb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcmVzaXplT2JzZXJ2ZXJUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9tZWRpYU1hdGNoZXIgPSBuZXcgU2JiTWVkaWFNYXRjaGVyQ29udHJvbGxlcih0aGlzLCB7fSk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5faGFuZGxlS2V5RG93bihlKSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ3Jlc2l6ZWNoYW5nZScsIChlOiBFdmVudCkgPT4gdGhpcy5fb25TZWxlY3RlZFN0ZXBSZXNpemUoZSkpO1xuICB9XG5cbiAgLyoqIFNlbGVjdHMgdGhlIG5leHQgc3RlcC4gKi9cbiAgcHVibGljIG5leHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fc2VsZWN0KHRoaXMuc3RlcHNbdGhpcy5zZWxlY3RlZEluZGV4ICsgMV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWxlY3RzIHRoZSBwcmV2aW91cyBzdGVwLiAqL1xuICBwdWJsaWMgcHJldmlvdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fc2VsZWN0KHRoaXMuc3RlcHNbdGhpcy5zZWxlY3RlZEluZGV4IC0gMV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXNldHMgdGhlIGZvcm0gaW4gd2hpY2ggdGhlIHN0ZXBwZXIgaXMgbmVzdGVkIG9yIGV2ZXJ5IGZvcm0gb2YgZWFjaCBzdGVwLCBpZiBhbnkuICovXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICBjb25zdCBjbG9zZXN0Rm9ybSA9IHRoaXMuY2xvc2VzdCgnZm9ybScpO1xuICAgIGlmIChjbG9zZXN0Rm9ybSkge1xuICAgICAgY2xvc2VzdEZvcm0ucmVzZXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdmb3JtJykuZm9yRWFjaCgoZm9ybSkgPT4gZm9ybS5yZXNldCgpKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAvLyBJbiBjYXNlIHRoZSBmb2N1cyBpcyBjdXJyZW50bHkgaW5zaWRlIHRoZSBzdGVwcGVyLCB3ZSByZXNldCB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0L3NlbGVjdGVkIHN0ZXAgbGFiZWwuXG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmNsb3Nlc3QoJ3NiYi1zdGVwcGVyJykgPT09IHRoaXMpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQ/LmxhYmVsPy5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzU2VsZWN0YWJsZShzdGVwOiBTYmJTdGVwRWxlbWVudCB8IG51bGwpOiBzdGVwIGlzIFNiYlN0ZXBFbGVtZW50IHtcbiAgICBpZiAoc3RlcCkge1xuICAgICAgY3VzdG9tRWxlbWVudHMudXBncmFkZShzdGVwKTtcbiAgICAgIGlmIChzdGVwLmxhYmVsKSB7XG4gICAgICAgIGN1c3RvbUVsZW1lbnRzLnVwZ3JhZGUoc3RlcC5sYWJlbCk7XG4gICAgICAgIGlmICghdGhpcy5saW5lYXIgJiYgc3RlcC5sYWJlbC5kaXNhYmxlZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3Qoc3RlcDogU2JiU3RlcEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc1NlbGVjdGFibGUoc3RlcCkgfHwgc3RlcCA9PT0gdGhpcy5zZWxlY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLnNlbGVjdGVkSW5kZXg7XG4gICAgY29uc3QgY3VycmVudFN0ZXAgPSB0aGlzLnNlbGVjdGVkO1xuICAgIGNvbnN0IHZhbGlkYXRlUGF5bG9hZDogU2JiU3RlcFZhbGlkYXRlRXZlbnREZXRhaWxzID0ge1xuICAgICAgY3VycmVudEluZGV4LFxuICAgICAgY3VycmVudFN0ZXAsXG4gICAgICBuZXh0SW5kZXg6IHRoaXMuc2VsZWN0ZWRJbmRleCAhPT0gbnVsbCA/IHRoaXMuc2VsZWN0ZWRJbmRleCArIDEgOiBudWxsLFxuICAgICAgbmV4dFN0ZXA6IHRoaXMuc2VsZWN0ZWRJbmRleCAhPT0gbnVsbCA/IHRoaXMuc3RlcHNbdGhpcy5zZWxlY3RlZEluZGV4ICsgMV0gOiBudWxsLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZCAmJiAhdGhpcy5zZWxlY3RlZC52YWxpZGF0ZSh2YWxpZGF0ZVBheWxvYWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc2VsZWN0ZWQ7XG4gICAgY3VycmVudD8uZGVzZWxlY3QoKTtcbiAgICBzdGVwLnNlbGVjdCgpO1xuXG4gICAgLyoqIEBpbnRlcm5hbCBvbmx5IHRvIHByb3ZpZGUgZG91YmxlIGVudHJ5IGluIGRvY3MuIEl0IGlzIGEgcHVibGljIGV2ZW50ISAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBTYmJTdGVwQ2hhbmdlRXZlbnQodGhpcy5zZWxlY3RlZEluZGV4LCBjdXJyZW50SW5kZXgsIHRoaXMuc2VsZWN0ZWQsIGN1cnJlbnRTdGVwKSxcbiAgICApO1xuXG4gICAgdGhpcy5fc2V0TWFya2VyU2l6ZSgpO1xuICAgIHRoaXMuX3NldFN0ZXBwZXJIZWlnaHQoc3RlcCk7XG4gICAgdGhpcy5fY29uZmlndXJlTGluZWFyTW9kZSgpO1xuICAgIC8vIEluIGNhc2UgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBpbnNpZGUgdGhlIHN0ZXBwZXIsIHdlIGZvY3VzIHRoZSBzZWxlY3RlZCBzdGVwIGxhYmVsLlxuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5jbG9zZXN0KCdzYmItc3RlcHBlcicpID09PSB0aGlzKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkPy5sYWJlbD8uZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRNYXJrZXJTaXplKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICF0aGlzLl9sb2FkZWQgfHxcbiAgICAgICF0aGlzLnNlbGVjdGVkIHx8XG4gICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIXRoaXMuc2VsZWN0ZWQubGFiZWxcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID1cbiAgICAgIHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICA/IHRoaXMuc2VsZWN0ZWQubGFiZWwub2Zmc2V0TGVmdCArIHRoaXMuc2VsZWN0ZWQubGFiZWwub2Zmc2V0V2lkdGhcbiAgICAgICAgOiB0aGlzLl9jYWxjdWxhdGVMYWJlbE9mZnNldFRvcCgpO1xuXG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zYmItc3RlcHBlci1tYXJrZXItc2l6ZScsIGAke29mZnNldH1weGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0ZXBwZXIgaGVpZ2h0IGJhc2VkIG9uIHRoZSBoZWlnaHQgb2YgdGhlIHByb3ZpZGVkIHN0ZXAuXG4gICAqL1xuICBwcml2YXRlIF9zZXRTdGVwcGVySGVpZ2h0KHN0ZXA6IFNiYlN0ZXBFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChzdGVwICYmIHN0ZXAuc2hhZG93Um9vdCkge1xuICAgICAgY29uc3QgaW5uZXJFbGVtZW50OiBTYmJTdGVwRWxlbWVudCB8IG51bGwgPSBzdGVwLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLnNiYi1zdGVwJyk7XG4gICAgICBpZiAoaW5uZXJFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zdGVwcGVyLWNvbnRlbnQtaGVpZ2h0JywgYCR7aW5uZXJFbGVtZW50Lm9mZnNldEhlaWdodH1weGApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZUxhYmVsT2Zmc2V0VG9wKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGhpcy5zdGVwcykge1xuICAgICAgaWYgKHN0ZXAgPT09IHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBvZmZzZXQgPSBzdGVwLmxhYmVsIS5vZmZzZXRIZWlnaHQgKyBvZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBvZmZzZXQgK1xuICAgICAgdGhpcy5zZWxlY3RlZCEubGFiZWwhLm9mZnNldEhlaWdodCEgK1xuICAgICAgcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHRoaXMpLmdldFByb3BlcnR5VmFsdWUoJy0tc2JiLXNwYWNpbmctZml4ZWQtNngnKSkgKlxuICAgICAgICAxNiAqXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9vblNlbGVjdGVkU3RlcFJlc2l6ZShlOiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3NldFN0ZXBwZXJIZWlnaHQoZS50YXJnZXQgYXMgU2JiU3RlcEVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlndXJlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RlcHMuZm9yRWFjaCgoc3RlcCwgaSwgYXJyYXkpID0+IHtcbiAgICAgIHN0ZXAuY29uZmlndXJlKHRoaXMuX2xvYWRlZCk7XG4gICAgICBzdGVwLmxhYmVsPy5jb25maWd1cmUoaSArIDEsIGFycmF5Lmxlbmd0aCwgdGhpcy5fbG9hZGVkKTtcbiAgICB9KTtcbiAgICB0aGlzLl9zZWxlY3QodGhpcy5zZWxlY3RlZCB8fCB0aGlzLl9lbmFibGVkU3RlcHNbMF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlTGFiZWxzKCk6IHZvaWQge1xuICAgIHRoaXMuc3RlcHMuZm9yRWFjaCgoc3RlcCkgPT4ge1xuICAgICAgc3RlcC5zbG90ID0gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gJ3N0ZXAnIDogJ3N0ZXAtbGFiZWwnO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tPcmllbnRhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ob3Jpem9udGFsRnJvbSkge1xuICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IHRoaXMuX21lZGlhTWF0Y2hlci5tYXRjaGVzKGJyZWFrcG9pbnRNYXBbdGhpcy5ob3Jpem9udGFsRnJvbV0pXG4gICAgICAgID8gJ2hvcml6b250YWwnXG4gICAgICAgIDogJ3ZlcnRpY2FsJztcbiAgICAgIHRoaXMuX3VwZGF0ZUxhYmVscygpO1xuICAgIH1cbiAgICAvLyBUaGUgdGltZW91dCBpcyBuZWVkZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG1hcmtlciB0YWtlcyB0aGUgY29ycmVjdCBzdGVwLWxhYmVsIHNpemUuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9zZXRNYXJrZXJTaXplKCksIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25TdGVwcGVyUmVzaXplID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2NoZWNrT3JpZW50YXRpb24oKTtcbiAgICB0aGlzLl9zZXRTdGVwcGVySGVpZ2h0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXNpemVPYnNlcnZlclRpbWVvdXQhKTtcbiAgICB0aGlzLmludGVybmFscy5zdGF0ZXMuYWRkKCdkaXNhYmxlLWFuaW1hdGlvbicpO1xuXG4gICAgLy8gRGlzYWJsZSB0aGUgYW5pbWF0aW9uIHdoZW4gcmVzaXppbmcgdG8gYXZvaWQgc3RyYW5nZSB0cmFuc2l0aW9uIGVmZmVjdHMuXG4gICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXJUaW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICgpID0+IHRoaXMuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ2Rpc2FibGUtYW5pbWF0aW9uJyksXG4gICAgICBERUJPVU5DRV9USU1FLFxuICAgICk7XG4gIH07XG5cbiAgcHJpdmF0ZSBfY29uZmlndXJlTGluZWFyTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0ZXBzLmZvckVhY2goKHN0ZXAsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIXN0ZXAubGFiZWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3VzdG9tRWxlbWVudHMudXBncmFkZShzdGVwLmxhYmVsKTtcblxuICAgICAgc3RlcC5sYWJlbC5kaXNhYmxlKFxuICAgICAgICAodGhpcy5saW5lYXIgJiYgaW5kZXggPiB0aGlzLnNlbGVjdGVkSW5kZXghKSB8fFxuICAgICAgICAgICghdGhpcy5saW5lYXIgJiYgc3RlcC5sYWJlbC5tYXRjaGVzKCc6c3RhdGUodXNlci1kaXNhYmxlZCknKSksXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uU3RlcHBlclJlc2l6ZSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnRvZ2dsZVN0YXRlKCdkaXNhYmxlLWFuaW1hdGlvbicsICF0aGlzLl9sb2FkZWQpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uU3RlcHBlclJlc2l6ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICB0aGlzLl9jb25maWd1cmUoKTtcblxuICAgICAgaWYgKHRoaXMuX3JlcXVlc3RlZFNlbGVjdGVkICYmIHRoaXMuc3RlcHMuaW5kZXhPZih0aGlzLl9yZXF1ZXN0ZWRTZWxlY3RlZCkgIT09IC0xKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMuc3RlcHMuaW5kZXhPZih0aGlzLl9yZXF1ZXN0ZWRTZWxlY3RlZCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3JlcXVlc3RlZFNlbGVjdGVkSW5kZXgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5fcmVxdWVzdGVkU2VsZWN0ZWRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUodGhpcyk7XG4gICAgICB0aGlzLl9jaGVja09yaWVudGF0aW9uKCk7XG4gICAgICAvLyBSZW1vdmUgZGlzYWJsZS1hbmltYXRpb24gc3RhdGUgYWZ0ZXIgY29tcG9uZW50IGluaXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnZGlzYWJsZS1hbmltYXRpb24nKSwgREVCT1VOQ0VfVElNRSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdvcmllbnRhdGlvbicpICYmICF0aGlzLmhvcml6b250YWxGcm9tKSB7XG4gICAgICB0aGlzLl91cGRhdGVMYWJlbHMoKTtcbiAgICAgIHRoaXMuX3NldE1hcmtlclNpemUoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbGluZWFyJykgJiYgdGhpcy5fbG9hZGVkKSB7XG4gICAgICB0aGlzLl9jb25maWd1cmVMaW5lYXJNb2RlKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2l6ZScpKSB7XG4gICAgICB0aGlzLl9zZXRNYXJrZXJTaXplKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlS2V5RG93bihldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbmFibGVkU3RlcHM6IFNiYlN0ZXBFbGVtZW50W10gPSB0aGlzLl9lbmFibGVkU3RlcHM7XG5cbiAgICBpZiAoXG4gICAgICAhZW5hYmxlZFN0ZXBzIHx8XG4gICAgICAvLyBkb24ndCB0cmFwIG5lc3RlZCBoYW5kbGluZ1xuICAgICAgKChldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSAhPT0gdGhpcyAmJiAoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkucGFyZW50RWxlbWVudCAhPT0gdGhpcylcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJvd0tleVByZXNzZWQoZXZ0KSkge1xuICAgICAgY29uc3QgY3VycmVudDogbnVtYmVyID0gZW5hYmxlZFN0ZXBzLmluZGV4T2YodGhpcy5zZWxlY3RlZCEpO1xuICAgICAgY29uc3QgbmV4dEluZGV4OiBudW1iZXIgPSBnZXROZXh0RWxlbWVudEluZGV4KGV2dCwgY3VycmVudCwgZW5hYmxlZFN0ZXBzLmxlbmd0aCk7XG4gICAgICB0aGlzLl9zZWxlY3QoZW5hYmxlZFN0ZXBzW25leHRJbmRleF0pO1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXN0ZXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zdGVwcGVyX19sYWJlbHNcIiByb2xlPVwidGFibGlzdFwiPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJzdGVwLWxhYmVsXCIgQHNsb3RjaGFuZ2U9JHt0aGlzLl9jb25maWd1cmV9Pjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3RlcHBlcl9fc3RlcHNcIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwic3RlcFwiIEBzbG90Y2hhbmdlPSR7dGhpcy5fY29uZmlndXJlfT48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXN0ZXBwZXInOiBTYmJTdGVwcGVyRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3FCQSxJQUFNLGdCQUFnQjtBQUV0QixJQUFNLGdCQUF3QztDQUM1QyxNQUFNO0NBQ04sT0FBTztDQUNQLE9BQU87Q0FDUCxPQUFPO0NBQ1I7QUFFRCxJQUFhLHFCQUFiLGNBQXdDLE1BQUs7Q0FhM0MsWUFDRSxlQUNBLGVBQ0EsY0FDQSxjQUFtQztBQUVuQyxRQUFNLGNBQWM7R0FBRSxTQUFTO0dBQU0sVUFBVTtHQUFNLENBQUM7QUFDdEQsT0FBSyxnQkFBZ0I7QUFDckIsT0FBSyxnQkFBZ0I7QUFDckIsT0FBSyxlQUFlO0FBQ3BCLE9BQUssZUFBZTs7Ozs7Ozs7OztJQVVYLDJCQUFpQjttQkFBUzs7Ozs7Ozs7Ozs7Ozs7Y0FBMUIsMEJBQTBCLFlBQVU7Ozt5QkEwQjlDLFdBQVcsRUFDWCxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUMsQ0FBQTtxQ0FJM0IsU0FBUztJQUFFLFdB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
@@ -1,82 +0,0 @@
1
- import { css as e, html as t } from "lit";
2
- import { SbbButtonBaseElement as n } from "./core/base-elements.js";
3
- import { SbbDisabledMixin as r, appendAriaElements as i, removeAriaElements as a } from "./core/mixins.js";
4
- import { boxSizingStyles as o } from "./core/styles.js";
5
- import { SbbPropertyWatcherController as s } from "./core/controllers.js";
6
- import { SbbIconNameMixin as c } from "./icon.js";
7
- //#region src/elements/stepper/step-label/step-label.scss?lit&inline
8
- var l = e`:host{--sbb-step-label-color: var(--sbb-color-4);--sbb-step-label-animation-duration: var( --sbb-disable-animation-duration, var(--sbb-animation-duration-2x) );--sbb-step-label-prefix-size: var(--sbb-size-element-xxs);--sbb-step-label-prefix-border-style: solid;--sbb-step-label-prefix-border-color: var(--sbb-border-color-4-inverted);--sbb-step-label-prefix-background-color: var(--sbb-background-color-1);--sbb-step-label-gap: var(--sbb-spacing-fixed-4x);position:relative;min-width:0;max-width:fit-content}:host:before{--sbb-text-font-size: var(--sbb-text-font-size-xxs);font-family:var(--sbb-typo-font-family);font-weight:400;line-height:var(--sbb-typo-line-height-text);letter-spacing:var(--sbb-typo-letter-spacing-text);font-size:var(--sbb-text-font-size);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);cursor:var(--sbb-step-label-cursor);color:var(--sbb-step-label-color);inset-block-start:calc(var(--sbb-text-font-size-l) * var(--sbb-typo-line-height-text) / 2 + var(--sbb-border-width-1x) / 2);inset-inline-start:calc(var(--sbb-step-label-prefix-size) / 2);line-height:1;z-index:1;transform:translate(-50%,calc(-50% + var(--sbb-step-label-translate-y-content-hover, 0rem)));transition:transform var(--sbb-step-label-animation-duration) var(--sbb-animation-easing)}@media(forced-colors:active){:host{--sbb-step-label-color: ButtonText;--sbb-step-label-prefix-border-color: ButtonText}}:host(:is(:state(selected),[state--selected])){--sbb-text-font-size: var(--sbb-text-font-size-xxs);font-family:var(--sbb-typo-font-family);font-weight:400;line-height:var(--sbb-typo-line-height-text);letter-spacing:var(--sbb-typo-letter-spacing-text);font-size:var(--sbb-text-font-size);font-weight:700;--sbb-step-label-color: var(--sbb-color-3)}@media(forced-colors:active){:host(:is(:state(selected),[state--selected])){--sbb-step-label-color: Highlight !important}}:host(:is(:state(size-s),[state--size-s])){--sbb-step-label-gap: var(--sbb-spacing-fixed-3x);--sbb-step-label-prefix-size: var(--sbb-size-element-xxxs)}:host(:is(:state(size-s),[state--size-s])):before{inset-block-start:calc(var(--sbb-text-font-size-m) * var(--sbb-typo-line-height-text) / 2 + var(--sbb-border-width-1x) / 2)}:host(:disabled){--sbb-step-label-color: var(--sbb-color-granite);--sbb-step-label-color: light-dark(var(--sbb-color-granite), var(--sbb-color-graphite));--sbb-step-label-prefix-border-style: dashed}@media(forced-colors:active){:host(:disabled){--sbb-step-label-color: GrayText !important}}@media(any-hover:hover){:host(:hover:not(:disabled)){--sbb-step-label-cursor: var(--sbb-cursor-pointer);--sbb-step-label-prefix-background-color: var(--sbb-background-color-3);--sbb-step-label-translate-y-content-hover: -.0625rem;--sbb-step-label-prefix-size-grow-hover: calc(var(--sbb-border-width-2x) * -1)}}:host(:focus-visible){outline-offset:var(--sbb-focus-outline-offset);outline:var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);border-radius:var(--sbb-border-radius-1x)}:host(:is(:state(orientation-vertical),[state--orientation-vertical])){transition:margin var(--sbb-stepper-animation-duration) var(--sbb-animation-easing)}:host(:is(:state(orientation-vertical),[state--orientation-vertical]):not(:first-of-type)){margin-block-start:var(--sbb-spacing-fixed-6x)}:host(:is(:state(selected),[state--selected]):is(:state(orientation-vertical),[state--orientation-vertical])){margin-block-end:var(--sbb-spacing-fixed-8x)}.sbb-step-label{--sbb-text-font-size: var(--sbb-text-font-size-l);font-family:var(--sbb-typo-font-family);font-weight:400;line-height:var(--sbb-typo-line-height-text);letter-spacing:var(--sbb-typo-letter-spacing-text);font-size:var(--sbb-text-font-size);font-weight:700;cursor:var(--sbb-step-label-cursor);position:relative;display:flex;gap:var(--sbb-step-label-gap);color:var(--sbb-step-label-color)}:host(:is(:state(size-s),[state--size-s])) .sbb-step-label{--sbb-text-font-size: var(--sbb-text-font-size-m);font-family:var(--sbb-typo-font-family);font-weight:400;line-height:var(--sbb-typo-line-height-text);letter-spacing:var(--sbb-typo-letter-spacing-text);font-size:var(--sbb-text-font-size);font-weight:700}.sbb-step-label__prefix{position:relative;display:flex;flex-shrink:0;align-items:center;justify-content:center;width:var(--sbb-step-label-prefix-size);height:var(--sbb-step-label-prefix-size);inset-block-start:calc(1em * var(--sbb-typo-line-height-text) / 2 + var(--sbb-border-width-1x) / 2 - var(--sbb-step-label-prefix-size) / 2)}.sbb-step-label__prefix:before{content:"";position:absolute;inset:calc(var(--sbb-step-label-prefix-size-grow-hover, 0rem));border-radius:var(--sbb-border-radius-infinity);border:var(--sbb-border-width-1x) var(--sbb-step-label-prefix-border-style) var(--sbb-step-label-prefix-border-color);background-color:var(--sbb-step-label-prefix-background-color);transition-duration:var(--sbb-step-label-animation-duration);transition-timing-function:var(--sbb-animation-easing);transition-property:background-color,inset}:host(:is(:state(orientation-horizontal),[state--orientation-horizontal])) .sbb-step-label__text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}::slotted(sbb-icon),sbb-icon{z-index:1;background-color:var(--sbb-step-label-prefix-background-color);border-radius:var(--sbb-border-radius-infinity);transform:translateY(var(--sbb-step-label-translate-y-content-hover, 0rem));transition-duration:var(--sbb-step-label-animation-duration);transition-timing-function:var(--sbb-animation-easing);transition-property:background-color,transform}`, u = 0, d = class extends c(r(n)) {
9
- static {
10
- this.elementName = "sbb-step-label";
11
- }
12
- static {
13
- this.role = "tab";
14
- }
15
- static {
16
- this.styles = [o, l];
17
- }
18
- get step() {
19
- return this._step;
20
- }
21
- get stepper() {
22
- return this.closest("sbb-stepper");
23
- }
24
- set disabled(e) {
25
- super.disabled = e, this.toggleState("user-disabled", e);
26
- }
27
- get disabled() {
28
- return super.disabled;
29
- }
30
- constructor() {
31
- super(), this._step = null, this.addEventListener?.("click", () => {
32
- let e = this.stepper;
33
- e && this.step && this._isNotDeactivatedByLinearMode(this.step) && (e.selected = this.step);
34
- }), this.addController(new s(this, () => this.stepper, {
35
- orientation: (e) => {
36
- this._previousOrientation && this.internals.states.delete(`orientation-${this._previousOrientation}`), this._previousOrientation = e.orientation, this._previousOrientation && this.internals.states.add(`orientation-${this._previousOrientation}`);
37
- },
38
- size: (e) => {
39
- this._previousSize && this.internals.states.delete(`size-${this._previousSize}`), this._previousSize = e.size, this._previousSize && this.internals.states.add(`size-${this._previousSize}`);
40
- }
41
- }));
42
- }
43
- _isNotDeactivatedByLinearMode(e) {
44
- let t = this.stepper;
45
- if (t?.linear && t.selectedIndex !== null) {
46
- let n = t.steps.indexOf(e);
47
- return n < t.selectedIndex || n === t.selectedIndex + 1;
48
- }
49
- return !0;
50
- }
51
- connectedCallback() {
52
- super.connectedCallback(), this.id ||= `sbb-step-label-${u++}`, this.slot ||= "step-label", this.internals.ariaSelected = "false", this.tabIndex = -1, this._assignStep();
53
- }
54
- select() {
55
- this.tabIndex = 0, this.internals.ariaSelected = "true", this.internals.states.add("selected");
56
- }
57
- deselect() {
58
- this.tabIndex = -1, this.internals.ariaSelected = "false", this.internals.states.delete("selected");
59
- }
60
- configure(e, t, n) {
61
- n && this._assignStep(), this.internals.ariaPosInSet = `${e}`, this.internals.ariaSetSize = `${t}`;
62
- }
63
- _assignStep() {
64
- let e = this.nextElementSibling;
65
- for (; e && e.localName !== "sbb-step";) e = e.nextElementSibling;
66
- let t = e;
67
- this.internals.ariaControlsElements = a(this.internals.ariaControlsElements, this._step), this._step = t instanceof Element ? t : null, this.internals.ariaControlsElements = i(this.internals.ariaControlsElements, this._step);
68
- }
69
- disable(e) {
70
- super.disabled = e;
71
- }
72
- render() {
73
- return t`
74
- <div class="sbb-step-label">
75
- <span class="sbb-step-label__prefix">${this.renderIconSlot()}</span>
76
- <span class="sbb-step-label__text"><slot></slot></span>
77
- </div>
78
- `;
79
- }
80
- };
81
- //#endregion
82
- export { d as t };