@sbb-esta/lyne-elements-dev 5.0.0-next.3-dev.1779188320 → 5.0.0-next.3-dev.1779200097

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 (162) hide show
  1. package/autocomplete/autocomplete-base-element.js +2 -2
  2. package/autocomplete/autocomplete.component.js +1 -1
  3. package/{autocomplete-base-element-DRGjFF9_.js → autocomplete-base-element-6leI6UF4.js} +24 -14
  4. package/autocomplete.js +4 -4
  5. package/autocomplete.pure.js +3 -3
  6. package/calendar/calendar/calendar.component.js +2 -2
  7. package/{calendar.component-oS_T4s4k.js → calendar.component-BK4w5GWV.js} +35 -29
  8. package/calendar.js +4 -4
  9. package/calendar.pure.js +3 -3
  10. package/carousel/carousel/carousel.component.js +1 -1
  11. package/carousel/carousel-item/carousel-item.component.js +2 -2
  12. package/carousel/carousel-list/carousel-list.component.js +1 -1
  13. package/{carousel-item.component-DyZAdXL_.js → carousel-item.component-B6WmZPkW.js} +12 -2
  14. package/{carousel-list.component-Ai0uJWB7.js → carousel-list.component-CnZehdy6.js} +6 -13
  15. package/{carousel.component-9oMMOyWo.js → carousel.component-ZrkGeJgZ.js} +1 -1
  16. package/carousel.js +5 -5
  17. package/carousel.pure.js +4 -4
  18. package/chip/chip-group/chip-group.component.js +1 -1
  19. package/{chip-group.component-DJORKUef.js → chip-group.component-BIP7c2G0.js} +2 -7
  20. package/chip.js +1 -1
  21. package/chip.pure.js +1 -1
  22. package/core/overlay/overlay-outside-pointer-event-listener.js +1 -1
  23. package/custom-elements.json +3886 -3393
  24. package/datepicker/datepicker/datepicker.component.js +1 -1
  25. package/development/autocomplete/autocomplete-base-element.d.ts +6 -3
  26. package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  27. package/development/autocomplete/autocomplete-base-element.js +2 -2
  28. package/development/autocomplete/autocomplete.component.js +1 -1
  29. package/development/autocomplete-base-element-qnPoRLvM.js +695 -0
  30. package/development/autocomplete.js +2 -2
  31. package/development/autocomplete.pure.js +2 -2
  32. package/development/calendar/calendar/calendar.component.d.ts +8 -0
  33. package/development/calendar/calendar/calendar.component.d.ts.map +1 -1
  34. package/development/calendar/calendar/calendar.component.js +2 -2
  35. package/development/calendar.component-BKWvdgzO.js +1461 -0
  36. package/development/calendar.js +2 -2
  37. package/development/calendar.pure.js +2 -2
  38. package/development/carousel/carousel/carousel.component.js +1 -1
  39. package/development/carousel/carousel-item/carousel-item.component.d.ts +8 -6
  40. package/development/carousel/carousel-item/carousel-item.component.d.ts.map +1 -1
  41. package/development/carousel/carousel-item/carousel-item.component.js +2 -2
  42. package/development/carousel/carousel-list/carousel-list.component.d.ts.map +1 -1
  43. package/development/carousel/carousel-list/carousel-list.component.js +1 -1
  44. package/development/{carousel-item.component-B_0wdIAu.js → carousel-item.component-nuo7jAt3.js} +16 -4
  45. package/development/carousel-list.component-B8PUREwS.js +126 -0
  46. package/development/carousel.component-D_KIJ9Bb.js +139 -0
  47. package/development/carousel.js +4 -4
  48. package/development/carousel.pure.js +4 -4
  49. package/development/chip/chip-group/chip-group.component.d.ts +1 -23
  50. package/development/chip/chip-group/chip-group.component.d.ts.map +1 -1
  51. package/development/chip/chip-group/chip-group.component.js +1 -1
  52. package/development/chip-group.component-CVizDsAz.js +395 -0
  53. package/development/chip.js +1 -1
  54. package/development/chip.pure.js +1 -1
  55. package/development/core/overlay/overlay-outside-pointer-event-listener.d.ts +1 -1
  56. package/development/core/overlay/overlay-outside-pointer-event-listener.d.ts.map +1 -1
  57. package/development/core/overlay/overlay-outside-pointer-event-listener.js +2 -2
  58. package/development/core.d.ts +0 -1
  59. package/development/core.d.ts.map +1 -1
  60. package/development/datepicker/datepicker/datepicker.component.d.ts +1 -1
  61. package/development/datepicker/datepicker/datepicker.component.d.ts.map +1 -1
  62. package/development/datepicker/datepicker/datepicker.component.js +3 -3
  63. package/development/dialog/dialog/dialog.component.d.ts +2 -3
  64. package/development/dialog/dialog/dialog.component.d.ts.map +1 -1
  65. package/development/dialog/dialog/dialog.component.js +1 -1
  66. package/development/{dialog.component-AItB8ixG.js → dialog.component-D8B2dVck.js} +4 -7
  67. package/development/dialog.js +1 -1
  68. package/development/dialog.pure.js +1 -1
  69. package/development/file-selector/common/file-selector-common.d.ts +5 -0
  70. package/development/file-selector/common/file-selector-common.d.ts.map +1 -1
  71. package/development/file-selector/common/file-selector-common.js +2 -2
  72. package/development/{file-selector-common-CGL95Rnw.js → file-selector-common-mZ5UYxOF.js} +17 -8
  73. package/development/file-selector.js +2 -2
  74. package/development/file-selector.pure.js +2 -2
  75. package/development/form-field/form-field/form-field.component.d.ts +1 -1
  76. package/development/form-field/form-field/form-field.component.d.ts.map +1 -1
  77. package/development/form-field.component-CPWBCHer.js +1 -1
  78. package/development/overlay/overlay-base-element.d.ts +4 -4
  79. package/development/overlay/overlay-base-element.d.ts.map +1 -1
  80. package/development/overlay/overlay-base-element.js +3 -9
  81. package/development/overlay/overlay.component.d.ts +3 -3
  82. package/development/overlay/overlay.component.d.ts.map +1 -1
  83. package/development/overlay/overlay.component.js +1 -1
  84. package/development/{overlay.component-rFmitc_r.js → overlay.component-YSCuGeme.js} +4 -7
  85. package/development/overlay.js +1 -1
  86. package/development/overlay.pure.js +1 -1
  87. package/development/paginator/common/paginator-common.d.ts +11 -6
  88. package/development/paginator/common/paginator-common.d.ts.map +1 -1
  89. package/development/paginator/common/paginator-common.js +2 -2
  90. package/development/paginator-common-B7iba0wQ.js +432 -0
  91. package/development/paginator.js +2 -2
  92. package/development/paginator.pure.js +2 -2
  93. package/development/popover/popover.component.d.ts +7 -0
  94. package/development/popover/popover.component.d.ts.map +1 -1
  95. package/development/popover/popover.component.js +2 -2
  96. package/development/popover.component-CKUZbWbV.js +578 -0
  97. package/development/popover.js +2 -2
  98. package/development/popover.pure.js +2 -2
  99. package/development/{step.component-CcjtUFyR.js → step.component-B_YHm1tz.js} +32 -10
  100. package/development/stepper/step/step.component.d.ts +14 -1
  101. package/development/stepper/step/step.component.d.ts.map +1 -1
  102. package/development/stepper/step/step.component.js +2 -2
  103. package/development/stepper/stepper/stepper.component.d.ts +9 -5
  104. package/development/stepper/stepper/stepper.component.d.ts.map +1 -1
  105. package/development/stepper/stepper/stepper.component.js +1 -1
  106. package/development/stepper.component-BeqeUIRN.js +443 -0
  107. package/development/stepper.js +3 -3
  108. package/development/stepper.pure.js +3 -3
  109. package/development/tab-group.component-CGMBihsQ.js +297 -0
  110. package/development/{tab-label.component-CNX8bsJL.js → tab-label.component-CQOLO2t7.js} +11 -13
  111. package/development/tabs/tab-group/tab-group.component.d.ts +15 -8
  112. package/development/tabs/tab-group/tab-group.component.d.ts.map +1 -1
  113. package/development/tabs/tab-group/tab-group.component.js +2 -2
  114. package/development/tabs/tab-label/tab-label.component.d.ts.map +1 -1
  115. package/development/tabs/tab-label/tab-label.component.js +1 -1
  116. package/development/tabs.js +3 -3
  117. package/development/tabs.pure.js +3 -3
  118. package/dialog/dialog/dialog.component.js +1 -1
  119. package/{dialog.component-4O3__zyd.js → dialog.component-CsBryhM-.js} +3 -6
  120. package/dialog.js +1 -1
  121. package/dialog.pure.js +1 -1
  122. package/file-selector/common/file-selector-common.js +2 -2
  123. package/{file-selector-common-BE780nIa.js → file-selector-common-VNwWFEmM.js} +26 -19
  124. package/file-selector.js +5 -5
  125. package/file-selector.pure.js +4 -4
  126. package/overlay/overlay-base-element.js +2 -8
  127. package/overlay/overlay.component.js +1 -1
  128. package/{overlay.component-C80XN61v.js → overlay.component-myJflfLY.js} +3 -6
  129. package/overlay.js +1 -1
  130. package/overlay.pure.js +1 -1
  131. package/package.json +2 -2
  132. package/paginator/common/paginator-common.js +2 -2
  133. package/{paginator-common-uoCIcl4X.js → paginator-common-BWewgXga.js} +42 -24
  134. package/paginator.js +5 -5
  135. package/paginator.pure.js +4 -4
  136. package/popover/popover.component.js +2 -2
  137. package/{popover.component-DJruKzY-.js → popover.component-Dm_86bPY.js} +19 -7
  138. package/popover.js +3 -3
  139. package/popover.pure.js +2 -2
  140. package/{step.component-BY6_2Wh2.js → step.component-tJh-Pb_E.js} +23 -8
  141. package/stepper/step/step.component.js +2 -2
  142. package/stepper/stepper/stepper.component.js +1 -1
  143. package/{stepper.component-lh0YSbT1.js → stepper.component-BCl77LVa.js} +20 -3
  144. package/stepper.js +4 -4
  145. package/stepper.pure.js +3 -3
  146. package/{tab-group.component-t4eeCNf-.js → tab-group.component-CDhggNpe.js} +27 -2
  147. package/{tab-label.component-DvvSohaG.js → tab-label.component-BuF2qt1T.js} +23 -22
  148. package/tabs/tab-group/tab-group.component.js +2 -2
  149. package/tabs/tab-label/tab-label.component.js +1 -1
  150. package/tabs.js +7 -7
  151. package/tabs.pure.js +6 -6
  152. package/development/autocomplete-base-element-DQiZ6hhk.js +0 -683
  153. package/development/calendar.component-CjlcDyS5.js +0 -1450
  154. package/development/carousel-list.component-DpDh5tqB.js +0 -133
  155. package/development/carousel.component-ClWvnZ8s.js +0 -139
  156. package/development/chip-group.component-Sgmi-kSy.js +0 -403
  157. package/development/core/interfaces/overlay-close-details.d.ts +0 -6
  158. package/development/core/interfaces/overlay-close-details.d.ts.map +0 -1
  159. package/development/paginator-common-BCeNUko_.js +0 -410
  160. package/development/popover.component-BmTfHMFw.js +0 -564
  161. package/development/stepper.component-80S-oXrH.js +0 -422
  162. package/development/tab-group.component-D4fvd6Uu.js +0 -265
@@ -1,422 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { html, unsafeCSS } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbElement, SbbMediaMatcherController, SbbMediaQueryBreakpointLargeAndAbove, SbbMediaQueryBreakpointSmallAndAbove, SbbMediaQueryBreakpointUltraAndAbove, SbbMediaQueryBreakpointZeroAndAbove, forceType, getNextElementIndex, isArrowKeyPressed } from "./core.js";
5
- import { IntersectionController } from "@lit-labs/observers/intersection-controller.js";
6
- //#region src/elements/stepper/stepper/stepper.scss?inline
7
- var stepper_default = ":host {\n --sbb-stepper-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n display: block;\n position: relative;\n counter-reset: step-label;\n}\n@media (forced-colors: active) {\n :host {\n --sbb-stepper-marker-color: ButtonText;\n }\n}\n\n:host(:is(:state(disable-animation),[state--disable-animation])) {\n --sbb-disable-animation-duration: 0s;\n}\n\n:host([orientation=vertical]) {\n --sbb-stepper-orientation: column;\n}\n\n.sbb-stepper__labels {\n display: flex;\n flex-direction: var(--sbb-stepper-orientation);\n position: relative;\n justify-content: start;\n margin-block-end: var(--sbb-spacing-responsive-m);\n}\n.sbb-stepper__labels::before {\n content: \"\";\n position: absolute;\n inset-inline-start: calc(var(--sbb-stepper-border-width) * -1);\n background-color: var(--sbb-stepper-marker-color);\n}\n:host([orientation=horizontal]) .sbb-stepper__labels {\n gap: var(--sbb-spacing-responsive-m);\n padding-block-end: var(--sbb-spacing-fixed-4x);\n border-block-end: var(--sbb-stepper-border-width) solid var(--sbb-border-color-4-inverted);\n}\n:host([orientation=horizontal]) .sbb-stepper__labels::before {\n inset-block-end: calc(var(--sbb-stepper-border-width) * -1);\n height: var(--sbb-stepper-marker-width);\n width: var(--sbb-stepper-marker-size, 0);\n transition: width var(--sbb-stepper-animation-duration) var(--sbb-animation-easing);\n}\n:host([orientation=vertical]) .sbb-stepper__labels {\n padding-inline-start: var(--sbb-spacing-fixed-4x);\n border-inline-start: var(--sbb-stepper-border-width) solid var(--sbb-border-color-4-inverted);\n}\n:host([orientation=vertical]) .sbb-stepper__labels::before {\n inset-block-start: 0;\n width: var(--sbb-stepper-marker-width);\n height: var(--sbb-stepper-marker-size, 0);\n transition: height var(--sbb-stepper-animation-duration) var(--sbb-animation-easing);\n}\n\n.sbb-stepper__steps {\n position: relative;\n}\n:host([orientation=horizontal]) .sbb-stepper__steps {\n height: var(--sbb-stepper-content-height);\n transition: height var(--sbb-stepper-animation-duration) var(--sbb-animation-easing);\n}\n\n::slotted(sbb-step-label)::before {\n content: counter(step-label);\n counter-increment: step-label;\n}";
8
- //#endregion
9
- //#region src/elements/stepper/stepper/stepper.component.ts
10
- var DEBOUNCE_TIME = 150;
11
- var breakpointMap = {
12
- zero: SbbMediaQueryBreakpointZeroAndAbove,
13
- small: SbbMediaQueryBreakpointSmallAndAbove,
14
- large: SbbMediaQueryBreakpointLargeAndAbove,
15
- ultra: SbbMediaQueryBreakpointUltraAndAbove
16
- };
17
- var SbbStepChangeEvent = class extends Event {
18
- constructor(selectedIndex, previousIndex, selectedStep, previousStep) {
19
- super("stepchange", {
20
- bubbles: true,
21
- composed: true
22
- });
23
- this.selectedIndex = selectedIndex;
24
- this.previousIndex = previousIndex;
25
- this.selectedStep = selectedStep;
26
- this.previousStep = previousStep;
27
- }
28
- };
29
- /**
30
- * Provides a structured, step-by-step workflow for user interactions.
31
- * @slot - Provide a `sbb-expansion-panel-header` and a `sbb-expansion-panel-content` to the stepper.
32
- * @slot step-label - Use this slot to provide an `sbb-step-label`.
33
- * @slot step - Use this slot to provide an `sbb-step`.
34
- * @event {SbbStepChangeEvent} stepchange - Emits whenever a step was changed.
35
- */
36
- var SbbStepperElement = (() => {
37
- let _classSuper = SbbElement;
38
- let _instanceExtraInitializers = [];
39
- let _linear_decorators;
40
- let _linear_initializers = [];
41
- let _linear_extraInitializers = [];
42
- let _set_horizontalFrom_decorators;
43
- let _orientation_decorators;
44
- let _orientation_initializers = [];
45
- let _orientation_extraInitializers = [];
46
- let _size_decorators;
47
- let _size_initializers = [];
48
- let _size_extraInitializers = [];
49
- let _set_selected_decorators;
50
- let _set_selectedIndex_decorators;
51
- return class SbbStepperElement extends _classSuper {
52
- static {
53
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
54
- _linear_decorators = [forceType(), property({ type: Boolean })];
55
- _set_horizontalFrom_decorators = [property({
56
- attribute: "horizontal-from",
57
- reflect: true
58
- })];
59
- _orientation_decorators = [property({ reflect: true })];
60
- _size_decorators = [property({ reflect: true })];
61
- _set_selected_decorators = [property({ attribute: false })];
62
- _set_selectedIndex_decorators = [property({
63
- attribute: "selected-index",
64
- type: Number
65
- })];
66
- __esDecorate(this, null, _linear_decorators, {
67
- kind: "accessor",
68
- name: "linear",
69
- static: false,
70
- private: false,
71
- access: {
72
- has: (obj) => "linear" in obj,
73
- get: (obj) => obj.linear,
74
- set: (obj, value) => {
75
- obj.linear = value;
76
- }
77
- },
78
- metadata: _metadata
79
- }, _linear_initializers, _linear_extraInitializers);
80
- __esDecorate(this, null, _set_horizontalFrom_decorators, {
81
- kind: "setter",
82
- name: "horizontalFrom",
83
- static: false,
84
- private: false,
85
- access: {
86
- has: (obj) => "horizontalFrom" in obj,
87
- set: (obj, value) => {
88
- obj.horizontalFrom = value;
89
- }
90
- },
91
- metadata: _metadata
92
- }, null, _instanceExtraInitializers);
93
- __esDecorate(this, null, _orientation_decorators, {
94
- kind: "accessor",
95
- name: "orientation",
96
- static: false,
97
- private: false,
98
- access: {
99
- has: (obj) => "orientation" in obj,
100
- get: (obj) => obj.orientation,
101
- set: (obj, value) => {
102
- obj.orientation = value;
103
- }
104
- },
105
- metadata: _metadata
106
- }, _orientation_initializers, _orientation_extraInitializers);
107
- __esDecorate(this, null, _size_decorators, {
108
- kind: "accessor",
109
- name: "size",
110
- static: false,
111
- private: false,
112
- access: {
113
- has: (obj) => "size" in obj,
114
- get: (obj) => obj.size,
115
- set: (obj, value) => {
116
- obj.size = value;
117
- }
118
- },
119
- metadata: _metadata
120
- }, _size_initializers, _size_extraInitializers);
121
- __esDecorate(this, null, _set_selected_decorators, {
122
- kind: "setter",
123
- name: "selected",
124
- static: false,
125
- private: false,
126
- access: {
127
- has: (obj) => "selected" in obj,
128
- set: (obj, value) => {
129
- obj.selected = value;
130
- }
131
- },
132
- metadata: _metadata
133
- }, null, _instanceExtraInitializers);
134
- __esDecorate(this, null, _set_selectedIndex_decorators, {
135
- kind: "setter",
136
- name: "selectedIndex",
137
- static: false,
138
- private: false,
139
- access: {
140
- has: (obj) => "selectedIndex" in obj,
141
- set: (obj, value) => {
142
- obj.selectedIndex = value;
143
- }
144
- },
145
- metadata: _metadata
146
- }, null, _instanceExtraInitializers);
147
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
148
- enumerable: true,
149
- configurable: true,
150
- writable: true,
151
- value: _metadata
152
- });
153
- }
154
- static {
155
- this.elementName = "sbb-stepper";
156
- }
157
- static {
158
- this.styles = [unsafeCSS(stepper_default)];
159
- }
160
- static {
161
- this.events = { stepchange: "stepchange" };
162
- }
163
- #linear_accessor_storage;
164
- /** If set to true, only the current and previous labels can be clicked and selected. */
165
- get linear() {
166
- return this.#linear_accessor_storage;
167
- }
168
- set linear(value) {
169
- this.#linear_accessor_storage = value;
170
- }
171
- /** Overrides the behavior of `orientation` property. */
172
- set horizontalFrom(value) {
173
- this._horizontalFrom = value && breakpointMap[value] ? value : null;
174
- if (this._horizontalFrom && this._loaded) this._checkOrientation();
175
- }
176
- get horizontalFrom() {
177
- return this._horizontalFrom;
178
- }
179
- #orientation_accessor_storage;
180
- /** Steps orientation, either horizontal or vertical. */
181
- get orientation() {
182
- return this.#orientation_accessor_storage;
183
- }
184
- set orientation(value) {
185
- this.#orientation_accessor_storage = value;
186
- }
187
- #size_accessor_storage;
188
- /**
189
- * Size variant, either s (lean theme default) or m (standard theme default).
190
- */
191
- get size() {
192
- return this.#size_accessor_storage;
193
- }
194
- set size(value) {
195
- this.#size_accessor_storage = value;
196
- }
197
- /** The currently selected step. */
198
- set selected(step) {
199
- if (this._loaded) this._select(step);
200
- this._requestedSelected = step;
201
- }
202
- get selected() {
203
- return this.querySelector?.("sbb-step:is(:state(selected),[state--selected])") ?? null;
204
- }
205
- /** The currently selected step index. */
206
- set selectedIndex(index) {
207
- if (this._loaded && index !== null) this._select(this.steps[index]);
208
- this._requestedSelectedIndex = index;
209
- }
210
- get selectedIndex() {
211
- return this.selected ? this.steps.indexOf(this.selected) : null;
212
- }
213
- /** The steps of the stepper. */
214
- get steps() {
215
- const steps = [];
216
- this.querySelectorAll?.("sbb-step").forEach((step) => {
217
- customElements.upgrade(step);
218
- steps.push(step);
219
- });
220
- return steps;
221
- }
222
- get _enabledSteps() {
223
- return this.steps.filter((s) => {
224
- if (s.label) {
225
- customElements.upgrade(s.label);
226
- return !s.label.disabled;
227
- }
228
- return false;
229
- });
230
- }
231
- constructor() {
232
- super();
233
- /**
234
- * If the sbb-stepper is used in a sbb-dialog, the marker on the selected element will not appear,
235
- * because the calculations are done when the dialog is closed, so the marker has a width of 0;
236
- * the same happens for the stepper height.
237
- * We need to recalculate it when the element becomes visible.
238
- */
239
- this._observer = (__runInitializers(this, _instanceExtraInitializers), new IntersectionController(this, {
240
- target: null,
241
- callback: (entries) => {
242
- entries.forEach((e) => {
243
- if (e.intersectionRatio > 0) {
244
- this._setStepperHeight(this.selected);
245
- this._setMarkerSize();
246
- }
247
- });
248
- }
249
- }));
250
- this.#linear_accessor_storage = __runInitializers(this, _linear_initializers, false);
251
- this._horizontalFrom = (__runInitializers(this, _linear_extraInitializers), null);
252
- this.#orientation_accessor_storage = __runInitializers(this, _orientation_initializers, "horizontal");
253
- this.#size_accessor_storage = (__runInitializers(this, _orientation_extraInitializers), __runInitializers(this, _size_initializers, null));
254
- this._requestedSelected = (__runInitializers(this, _size_extraInitializers), null);
255
- this._requestedSelectedIndex = null;
256
- this._loaded = false;
257
- this._resizeObserverTimeout = null;
258
- this._mediaMatcher = new SbbMediaMatcherController(this, {});
259
- this._onStepperResize = () => {
260
- this._checkOrientation();
261
- this._setStepperHeight(this.selected);
262
- clearTimeout(this._resizeObserverTimeout);
263
- this.internals.states.add("disable-animation");
264
- this._resizeObserverTimeout = setTimeout(() => this.internals.states.delete("disable-animation"), DEBOUNCE_TIME);
265
- };
266
- this.addEventListener?.("keydown", (e) => this._handleKeyDown(e));
267
- this.addEventListener?.("resizechange", (e) => this._onSelectedStepResize(e));
268
- }
269
- /** Selects the next step. */
270
- next() {
271
- if (this.selectedIndex !== null) this._select(this.steps[this.selectedIndex + 1]);
272
- }
273
- /** Selects the previous step. */
274
- previous() {
275
- if (this.selectedIndex !== null) this._select(this.steps[this.selectedIndex - 1]);
276
- }
277
- /** Resets the form in which the stepper is nested or every form of each step, if any. */
278
- reset() {
279
- const closestForm = this.closest("form");
280
- if (closestForm) closestForm.reset();
281
- else this.querySelectorAll("form").forEach((form) => form.reset());
282
- this.selectedIndex = 0;
283
- if (document.activeElement?.closest("sbb-stepper") === this) this.selected?.label?.focus();
284
- }
285
- _isSelectable(step) {
286
- if (step) {
287
- customElements.upgrade(step);
288
- if (step.label) {
289
- customElements.upgrade(step.label);
290
- if (!this.linear && step.label.disabled) return false;
291
- }
292
- return true;
293
- } else return false;
294
- }
295
- _select(step) {
296
- if (!this._isSelectable(step) || step === this.selected) return;
297
- const currentIndex = this.selectedIndex;
298
- const currentStep = this.selected;
299
- const validatePayload = {
300
- currentIndex,
301
- currentStep,
302
- nextIndex: this.selectedIndex !== null ? this.selectedIndex + 1 : null,
303
- nextStep: this.selectedIndex !== null ? this.steps[this.selectedIndex + 1] : null
304
- };
305
- if (this.selected && !this.selected.validate(validatePayload)) return;
306
- this.selected?.deselect();
307
- step.select();
308
- /** @internal only to provide double entry in docs. It is a public event! */
309
- this.dispatchEvent(new SbbStepChangeEvent(this.selectedIndex, currentIndex, this.selected, currentStep));
310
- this._setMarkerSize();
311
- this._setStepperHeight(step);
312
- this._configureLinearMode();
313
- if (document.activeElement?.closest("sbb-stepper") === this) this.selected?.label?.focus();
314
- }
315
- _setMarkerSize() {
316
- if (!this._loaded || !this.selected || this.selectedIndex === void 0 || !this.selected.label) return;
317
- const offset = this.orientation === "horizontal" ? this.selected.label.offsetLeft + this.selected.label.offsetWidth : this._calculateLabelOffsetTop();
318
- this.style.setProperty("--sbb-stepper-marker-size", `${offset}px`);
319
- }
320
- /**
321
- * Sets the stepper height based on the height of the provided step.
322
- */
323
- _setStepperHeight(step) {
324
- if (step && step.shadowRoot) {
325
- const innerElement = step.shadowRoot.querySelector(".sbb-step");
326
- if (innerElement) this.style?.setProperty("--sbb-stepper-content-height", `${innerElement.offsetHeight}px`);
327
- }
328
- }
329
- _calculateLabelOffsetTop() {
330
- if (this.selectedIndex === null) return;
331
- let offset = 0;
332
- for (const step of this.steps) {
333
- if (step === this.selected) break;
334
- offset = step.label.offsetHeight + offset;
335
- }
336
- return offset + this.selected.label.offsetHeight + parseFloat(getComputedStyle(this).getPropertyValue("--sbb-spacing-fixed-6x")) * 16 * this.selectedIndex;
337
- }
338
- _onSelectedStepResize(e) {
339
- this._setStepperHeight(e.target);
340
- }
341
- _configure() {
342
- this.steps.forEach((step, i, array) => {
343
- step.configure(this._loaded);
344
- step.label?.configure(i + 1, array.length, this._loaded);
345
- });
346
- this._select(this.selected || this._enabledSteps[0]);
347
- }
348
- _updateLabels() {
349
- this.steps.forEach((step) => {
350
- step.slot = this.orientation === "horizontal" ? "step" : "step-label";
351
- });
352
- }
353
- _checkOrientation() {
354
- if (this.horizontalFrom) {
355
- this.orientation = this._mediaMatcher.matches(breakpointMap[this.horizontalFrom]) ? "horizontal" : "vertical";
356
- this._updateLabels();
357
- }
358
- setTimeout(() => this._setMarkerSize(), 0);
359
- }
360
- _configureLinearMode() {
361
- this.steps.forEach((step, index) => {
362
- if (!step.label) return;
363
- customElements.upgrade(step.label);
364
- step.label.disable(this.linear && index > this.selectedIndex || !this.linear && step.label.matches(":is(:state(user-disabled),[state--user-disabled])"));
365
- });
366
- }
367
- connectedCallback() {
368
- super.connectedCallback();
369
- window.addEventListener("resize", this._onStepperResize, { passive: true });
370
- this.toggleState("disable-animation", !this._loaded);
371
- }
372
- disconnectedCallback() {
373
- super.disconnectedCallback();
374
- window.removeEventListener("resize", this._onStepperResize);
375
- }
376
- firstUpdated(changedProperties) {
377
- super.firstUpdated(changedProperties);
378
- this.updateComplete.then(() => {
379
- this._loaded = true;
380
- this._configure();
381
- if (this._requestedSelected && this.steps.indexOf(this._requestedSelected) !== -1) this.selectedIndex = this.steps.indexOf(this._requestedSelected);
382
- else if (this._requestedSelectedIndex) this.selectedIndex = this._requestedSelectedIndex;
383
- else this.selectedIndex = 0;
384
- this._observer.observe(this);
385
- this._checkOrientation();
386
- setTimeout(() => this.internals.states.delete("disable-animation"), DEBOUNCE_TIME);
387
- });
388
- }
389
- willUpdate(changedProperties) {
390
- super.willUpdate(changedProperties);
391
- if (changedProperties.has("orientation") && !this.horizontalFrom) {
392
- this._updateLabels();
393
- this._setMarkerSize();
394
- }
395
- if (changedProperties.has("linear") && this._loaded) this._configureLinearMode();
396
- if (changedProperties.has("size")) this._setMarkerSize();
397
- }
398
- _handleKeyDown(evt) {
399
- const enabledSteps = this._enabledSteps;
400
- if (!enabledSteps || evt.target !== this && evt.target.parentElement !== this) return;
401
- if (isArrowKeyPressed(evt)) {
402
- const nextIndex = getNextElementIndex(evt, enabledSteps.indexOf(this.selected), enabledSteps.length);
403
- this._select(enabledSteps[nextIndex]);
404
- evt.preventDefault();
405
- }
406
- }
407
- render() {
408
- return html`
409
- <div class="sbb-stepper__labels" role="tablist">
410
- <slot name="step-label" @slotchange=${this._configure}></slot>
411
- </div>
412
- <div class="sbb-stepper__steps">
413
- <slot name="step" @slotchange=${this._configure}></slot>
414
- </div>
415
- `;
416
- }
417
- };
418
- })();
419
- //#endregion
420
- export { SbbStepperElement as n, SbbStepChangeEvent as t };
421
-
422
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5jb21wb25lbnQtODBTLW9YckguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3N0ZXBwZXIvc3RlcHBlci9zdGVwcGVyLnNjc3M/aW5saW5lIiwiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3N0ZXBwZXIvc3RlcHBlci9zdGVwcGVyLmNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlICcuLi8uLi9jb3JlL3N0eWxlcycgYXMgc2JiO1xuXG46aG9zdCB7XG4gIC0tc2JiLXN0ZXBwZXItYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoXG4gICAgLS1zYmItZGlzYWJsZS1hbmltYXRpb24tZHVyYXRpb24sXG4gICAgdmFyKC0tc2JiLWFuaW1hdGlvbi1kdXJhdGlvbi02eClcbiAgKTtcblxuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBjb3VudGVyLXJlc2V0OiBzdGVwLWxhYmVsO1xuXG4gIEBpbmNsdWRlIHNiYi5pZi1mb3JjZWQtY29sb3JzIHtcbiAgICAtLXNiYi1zdGVwcGVyLW1hcmtlci1jb2xvcjogQnV0dG9uVGV4dDtcbiAgfVxufVxuXG46aG9zdCg6c3RhdGUoZGlzYWJsZS1hbmltYXRpb24pKSB7XG4gIEBpbmNsdWRlIHNiYi5kaXNhYmxlLWFuaW1hdGlvbjtcbn1cblxuOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSB7XG4gIC0tc2JiLXN0ZXBwZXItb3JpZW50YXRpb246IGNvbHVtbjtcbn1cblxuLnNiYi1zdGVwcGVyX19sYWJlbHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogdmFyKC0tc2JiLXN0ZXBwZXItb3JpZW50YXRpb24pO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG4gIG1hcmdpbi1ibG9jay1lbmQ6IHZhcigtLXNiYi1zcGFjaW5nLXJlc3BvbnNpdmUtbSk7XG5cbiAgJjo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgaW5zZXQtaW5saW5lLXN0YXJ0OiBjYWxjKHZhcigtLXNiYi1zdGVwcGVyLWJvcmRlci13aWR0aCkgKiAtMSk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLXN0ZXBwZXItbWFya2VyLWNvbG9yKTtcbiAgfVxuXG4gIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSAmIHtcbiAgICBnYXA6IHZhcigtLXNiYi1zcGFjaW5nLXJlc3BvbnNpdmUtbSk7XG4gICAgcGFkZGluZy1ibG9jay1lbmQ6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTR4KTtcbiAgICBib3JkZXItYmxvY2stZW5kOiB2YXIoLS1zYmItc3RlcHBlci1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLXNiYi1ib3JkZXItY29sb3ItNC1pbnZlcnRlZCk7XG5cbiAgICAmOjpiZWZvcmUge1xuICAgICAgaW5zZXQtYmxvY2stZW5kOiBjYWxjKHZhcigtLXNiYi1zdGVwcGVyLWJvcmRlci13aWR0aCkgKiAtMSk7XG4gICAgICBoZWlnaHQ6IHZhcigtLXNiYi1zdGVwcGVyLW1hcmtlci13aWR0aCk7XG4gICAgICB3aWR0aDogdmFyKC0tc2JiLXN0ZXBwZXItbWFya2VyLXNpemUsIDApO1xuICAgICAgdHJhbnNpdGlvbjogd2lkdGggdmFyKC0tc2JiLXN0ZXBwZXItYW5pbWF0aW9uLWR1cmF0aW9uKSB2YXIoLS1zYmItYW5pbWF0aW9uLWVhc2luZyk7XG4gICAgfVxuICB9XG5cbiAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSAmIHtcbiAgICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtNHgpO1xuICAgIGJvcmRlci1pbmxpbmUtc3RhcnQ6IHZhcigtLXNiYi1zdGVwcGVyLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tc2JiLWJvcmRlci1jb2xvci00LWludmVydGVkKTtcblxuICAgICY6OmJlZm9yZSB7XG4gICAgICBpbnNldC1ibG9jay1zdGFydDogMDtcbiAgICAgIHdpZHRoOiB2YXIoLS1zYmItc3RlcHBlci1tYXJrZXItd2lkdGgpO1xuICAgICAgaGVpZ2h0OiB2YXIoLS1zYmItc3RlcHBlci1tYXJrZXItc2l6ZSwgMCk7XG4gICAgICB0cmFuc2l0aW9uOiBoZWlnaHQgdmFyKC0tc2JiLXN0ZXBwZXItYW5pbWF0aW9uLWR1cmF0aW9uKSB2YXIoLS1zYmItYW5pbWF0aW9uLWVhc2luZyk7XG4gICAgfVxuICB9XG59XG5cbi5zYmItc3RlcHBlcl9fc3RlcHMge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pICYge1xuICAgIGhlaWdodDogdmFyKC0tc2JiLXN0ZXBwZXItY29udGVudC1oZWlnaHQpO1xuICAgIHRyYW5zaXRpb246IGhlaWdodCB2YXIoLS1zYmItc3RlcHBlci1hbmltYXRpb24tZHVyYXRpb24pIHZhcigtLXNiYi1hbmltYXRpb24tZWFzaW5nKTtcbiAgfVxufVxuXG46OnNsb3R0ZWQoc2JiLXN0ZXAtbGFiZWwpOjpiZWZvcmUge1xuICBjb250ZW50OiBjb3VudGVyKHN0ZXAtbGFiZWwpO1xuICBjb3VudGVyLWluY3JlbWVudDogc3RlcC1sYWJlbDtcbn1cbiIsImltcG9ydCB7IEludGVyc2VjdGlvbkNvbnRyb2xsZXIgfSBmcm9tICdAbGl0LWxhYnMvb2JzZXJ2ZXJzL2ludGVyc2VjdGlvbi1jb250cm9sbGVyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQ1NTUmVzdWx0R3JvdXAsXG4gIGh0bWwsXG4gIHR5cGUgUHJvcGVydHlWYWx1ZXMsXG4gIHR5cGUgVGVtcGxhdGVSZXN1bHQsXG4gIHVuc2FmZUNTUyxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFNiYkhvcml6b250YWxGcm9tIH0gZnJvbSAnLi4vLi4vY29yZS50cyc7XG5pbXBvcnQge1xuICBmb3JjZVR5cGUsXG4gIGdldE5leHRFbGVtZW50SW5kZXgsXG4gIGlzQXJyb3dLZXlQcmVzc2VkLFxuICBTYmJFbGVtZW50LFxuICBTYmJNZWRpYU1hdGNoZXJDb250cm9sbGVyLFxuICBTYmJNZWRpYVF1ZXJ5QnJlYWtwb2ludExhcmdlQW5kQWJvdmUsXG4gIFNiYk1lZGlhUXVlcnlCcmVha3BvaW50U21hbGxBbmRBYm92ZSxcbiAgU2JiTWVkaWFRdWVyeUJyZWFrcG9pbnRVbHRyYUFuZEFib3ZlLFxuICBTYmJNZWRpYVF1ZXJ5QnJlYWtwb2ludFplcm9BbmRBYm92ZSxcbn0gZnJvbSAnLi4vLi4vY29yZS50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYlN0ZXBFbGVtZW50LCBTYmJTdGVwVmFsaWRhdGVFdmVudERldGFpbHMgfSBmcm9tICcuLi9zdGVwL3N0ZXAuY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vc3RlcHBlci5zY3NzP2lubGluZSc7XG5cbmNvbnN0IERFQk9VTkNFX1RJTUUgPSAxNTA7XG5cbmNvbnN0IGJyZWFrcG9pbnRNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIHplcm86IFNiYk1lZGlhUXVlcnlCcmVha3BvaW50WmVyb0FuZEFib3ZlLFxuICBzbWFsbDogU2JiTWVkaWFRdWVyeUJyZWFrcG9pbnRTbWFsbEFuZEFib3ZlLFxuICBsYXJnZTogU2JiTWVkaWFRdWVyeUJyZWFrcG9pbnRMYXJnZUFuZEFib3ZlLFxuICB1bHRyYTogU2JiTWVkaWFRdWVyeUJyZWFrcG9pbnRVbHRyYUFuZEFib3ZlLFxufTtcblxuZXhwb3J0IGNsYXNzIFNiYlN0ZXBDaGFuZ2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgLyoqIFRoZSBpbmRleCBvZiB0aGUgbmV3bHkgc2VsZWN0ZWQgc3RlcC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGVkSW5kZXg6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqIFRoZSBpbmRleCBvZiB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBzdGVwLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJldmlvdXNJbmRleDogbnVtYmVyIHwgbnVsbDtcblxuICAvKiogVGhlIG5ld2x5IHNlbGVjdGVkIHN0ZXAgZWxlbWVudC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGVkU3RlcDogU2JiU3RlcEVsZW1lbnQgfCBudWxsO1xuXG4gIC8qKiBUaGUgcHJldmlvdXNseSBzZWxlY3RlZCBzdGVwIGVsZW1lbnQuICovXG4gIHB1YmxpYyByZWFkb25seSBwcmV2aW91c1N0ZXA6IFNiYlN0ZXBFbGVtZW50IHwgbnVsbDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2VsZWN0ZWRJbmRleDogbnVtYmVyIHwgbnVsbCxcbiAgICBwcmV2aW91c0luZGV4OiBudW1iZXIgfCBudWxsLFxuICAgIHNlbGVjdGVkU3RlcDogU2JiU3RlcEVsZW1lbnQgfCBudWxsLFxuICAgIHByZXZpb3VzU3RlcDogU2JiU3RlcEVsZW1lbnQgfCBudWxsLFxuICApIHtcbiAgICBzdXBlcignc3RlcGNoYW5nZScsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRJbmRleDtcbiAgICB0aGlzLnByZXZpb3VzSW5kZXggPSBwcmV2aW91c0luZGV4O1xuICAgIHRoaXMuc2VsZWN0ZWRTdGVwID0gc2VsZWN0ZWRTdGVwO1xuICAgIHRoaXMucHJldmlvdXNTdGVwID0gcHJldmlvdXNTdGVwO1xuICB9XG59XG4vKipcbiAqIFByb3ZpZGVzIGEgc3RydWN0dXJlZCwgc3RlcC1ieS1zdGVwIHdvcmtmbG93IGZvciB1c2VyIGludGVyYWN0aW9ucy5cbiAqIEBzbG90IC0gUHJvdmlkZSBhIGBzYmItZXhwYW5zaW9uLXBhbmVsLWhlYWRlcmAgYW5kIGEgYHNiYi1leHBhbnNpb24tcGFuZWwtY29udGVudGAgdG8gdGhlIHN0ZXBwZXIuXG4gKiBAc2xvdCBzdGVwLWxhYmVsIC0gVXNlIHRoaXMgc2xvdCB0byBwcm92aWRlIGFuIGBzYmItc3RlcC1sYWJlbGAuXG4gKiBAc2xvdCBzdGVwIC0gVXNlIHRoaXMgc2xvdCB0byBwcm92aWRlIGFuIGBzYmItc3RlcGAuXG4gKiBAZXZlbnQge1NiYlN0ZXBDaGFuZ2VFdmVudH0gc3RlcGNoYW5nZSAtIEVtaXRzIHdoZW5ldmVyIGEgc3RlcCB3YXMgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNiYlN0ZXBwZXJFbGVtZW50IGV4dGVuZHMgU2JiRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZWxlbWVudE5hbWU6IHN0cmluZyA9ICdzYmItc3RlcHBlcic7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IFt1bnNhZmVDU1Moc3R5bGUpXTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBldmVudHMgPSB7XG4gICAgc3RlcGNoYW5nZTogJ3N0ZXBjaGFuZ2UnLFxuICB9IGFzIGNvbnN0O1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgc2JiLXN0ZXBwZXIgaXMgdXNlZCBpbiBhIHNiYi1kaWFsb2csIHRoZSBtYXJrZXIgb24gdGhlIHNlbGVjdGVkIGVsZW1lbnQgd2lsbCBub3QgYXBwZWFyLFxuICAgKiBiZWNhdXNlIHRoZSBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgd2hlbiB0aGUgZGlhbG9nIGlzIGNsb3NlZCwgc28gdGhlIG1hcmtlciBoYXMgYSB3aWR0aCBvZiAwO1xuICAgKiB0aGUgc2FtZSBoYXBwZW5zIGZvciB0aGUgc3RlcHBlciBoZWlnaHQuXG4gICAqIFdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgaXQgd2hlbiB0aGUgZWxlbWVudCBiZWNvbWVzIHZpc2libGUuXG4gICAqL1xuICBwcml2YXRlIF9vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25Db250cm9sbGVyKHRoaXMsIHtcbiAgICB0YXJnZXQ6IG51bGwsXG4gICAgY2FsbGJhY2s6IChlbnRyaWVzKSA9PiB7XG4gICAgICBlbnRyaWVzLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgaWYgKGUuaW50ZXJzZWN0aW9uUmF0aW8gPiAwKSB7XG4gICAgICAgICAgdGhpcy5fc2V0U3RlcHBlckhlaWdodCh0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgICB0aGlzLl9zZXRNYXJrZXJTaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBJZiBzZXQgdG8gdHJ1ZSwgb25seSB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgbGFiZWxzIGNhbiBiZSBjbGlja2VkIGFuZCBzZWxlY3RlZC4gKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIGxpbmVhcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBPdmVycmlkZXMgdGhlIGJlaGF2aW9yIG9mIGBvcmllbnRhdGlvbmAgcHJvcGVydHkuICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hvcml6b250YWwtZnJvbScsIHJlZmxlY3Q6IHRydWUgfSlcbiAgcHVibGljIHNldCBob3Jpem9udGFsRnJvbSh2YWx1ZTogU2JiSG9yaXpvbnRhbEZyb20gfCBudWxsKSB7XG4gICAgdGhpcy5faG9yaXpvbnRhbEZyb20gPSB2YWx1ZSAmJiBicmVha3BvaW50TWFwW3ZhbHVlXSA/IHZhbHVlIDogbnVsbDtcbiAgICBpZiAodGhpcy5faG9yaXpvbnRhbEZyb20gJiYgdGhpcy5fbG9hZGVkKSB7XG4gICAgICB0aGlzLl9jaGVja09yaWVudGF0aW9uKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaG9yaXpvbnRhbEZyb20oKTogU2JiSG9yaXpvbnRhbEZyb20gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faG9yaXpvbnRhbEZyb207XG4gIH1cbiAgcHJpdmF0ZSBfaG9yaXpvbnRhbEZyb206IFNiYkhvcml6b250YWxGcm9tIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFN0ZXBzIG9yaWVudGF0aW9uLCBlaXRoZXIgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbC4gKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igb3JpZW50YXRpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcgPSAnaG9yaXpvbnRhbCc7XG5cbiAgLyoqXG4gICAqIFNpemUgdmFyaWFudCwgZWl0aGVyIHMgKGxlYW4gdGhlbWUgZGVmYXVsdCkgb3IgbSAoc3RhbmRhcmQgdGhlbWUgZGVmYXVsdCkuXG4gICAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pIHB1YmxpYyBhY2Nlc3NvciBzaXplOiAncycgfCAnbScgfCBudWxsID0gbnVsbDtcblxuICAvKiogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzdGVwLiAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWQoc3RlcDogU2JiU3RlcEVsZW1lbnQgfCBudWxsKSB7XG4gICAgaWYgKHRoaXMuX2xvYWRlZCkge1xuICAgICAgdGhpcy5fc2VsZWN0KHN0ZXApO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0ZWRTZWxlY3RlZCA9IHN0ZXA7XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZCgpOiBTYmJTdGVwRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3I/LjxTYmJTdGVwRWxlbWVudD4oJ3NiYi1zdGVwOnN0YXRlKHNlbGVjdGVkKScpID8/IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBfcmVxdWVzdGVkU2VsZWN0ZWQ6IFNiYlN0ZXBFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3RlcCBpbmRleC4gKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VsZWN0ZWQtaW5kZXgnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIHNldCBzZWxlY3RlZEluZGV4KGluZGV4OiBudW1iZXIgfCBudWxsKSB7XG4gICAgaWYgKHRoaXMuX2xvYWRlZCAmJiBpbmRleCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fc2VsZWN0KHRoaXMuc3RlcHNbaW5kZXhdKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdGVkU2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICB9XG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRJbmRleCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZCA/IHRoaXMuc3RlcHMuaW5kZXhPZih0aGlzLnNlbGVjdGVkKSA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBfcmVxdWVzdGVkU2VsZWN0ZWRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRoZSBzdGVwcyBvZiB0aGUgc3RlcHBlci4gKi9cbiAgcHVibGljIGdldCBzdGVwcygpOiBTYmJTdGVwRWxlbWVudFtdIHtcbiAgICBjb25zdCBzdGVwczogU2JiU3RlcEVsZW1lbnRbXSA9IFtdO1xuICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbD8uKCdzYmItc3RlcCcpLmZvckVhY2goKHN0ZXApID0+IHtcbiAgICAgIGN1c3RvbUVsZW1lbnRzLnVwZ3JhZGUoc3RlcCk7XG4gICAgICBzdGVwcy5wdXNoKHN0ZXApO1xuICAgIH0pO1xuICAgIHJldHVybiBzdGVwcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9lbmFibGVkU3RlcHMoKTogU2JiU3RlcEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcHMuZmlsdGVyKChzKSA9PiB7XG4gICAgICBpZiAocy5sYWJlbCkge1xuICAgICAgICBjdXN0b21FbGVtZW50cy51cGdyYWRlKHMubGFiZWwpO1xuICAgICAgICByZXR1cm4gIXMubGFiZWwuZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9sb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcmVzaXplT2JzZXJ2ZXJUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9tZWRpYU1hdGNoZXIgPSBuZXcgU2JiTWVkaWFNYXRjaGVyQ29udHJvbGxlcih0aGlzLCB7fSk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5faGFuZGxlS2V5RG93bihlKSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ3Jlc2l6ZWNoYW5nZScsIChlOiBFdmVudCkgPT4gdGhpcy5fb25TZWxlY3RlZFN0ZXBSZXNpemUoZSkpO1xuICB9XG5cbiAgLyoqIFNlbGVjdHMgdGhlIG5leHQgc3RlcC4gKi9cbiAgcHVibGljIG5leHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fc2VsZWN0KHRoaXMuc3RlcHNbdGhpcy5zZWxlY3RlZEluZGV4ICsgMV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZWxlY3RzIHRoZSBwcmV2aW91cyBzdGVwLiAqL1xuICBwdWJsaWMgcHJldmlvdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fc2VsZWN0KHRoaXMuc3RlcHNbdGhpcy5zZWxlY3RlZEluZGV4IC0gMV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXNldHMgdGhlIGZvcm0gaW4gd2hpY2ggdGhlIHN0ZXBwZXIgaXMgbmVzdGVkIG9yIGV2ZXJ5IGZvcm0gb2YgZWFjaCBzdGVwLCBpZiBhbnkuICovXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICBjb25zdCBjbG9zZXN0Rm9ybSA9IHRoaXMuY2xvc2VzdCgnZm9ybScpO1xuICAgIGlmIChjbG9zZXN0Rm9ybSkge1xuICAgICAgY2xvc2VzdEZvcm0ucmVzZXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdmb3JtJykuZm9yRWFjaCgoZm9ybSkgPT4gZm9ybS5yZXNldCgpKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAvLyBJbiBjYXNlIHRoZSBmb2N1cyBpcyBjdXJyZW50bHkgaW5zaWRlIHRoZSBzdGVwcGVyLCB3ZSByZXNldCB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0L3NlbGVjdGVkIHN0ZXAgbGFiZWwuXG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmNsb3Nlc3QoJ3NiYi1zdGVwcGVyJykgPT09IHRoaXMpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQ/LmxhYmVsPy5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzU2VsZWN0YWJsZShzdGVwOiBTYmJTdGVwRWxlbWVudCB8IG51bGwpOiBzdGVwIGlzIFNiYlN0ZXBFbGVtZW50IHtcbiAgICBpZiAoc3RlcCkge1xuICAgICAgY3VzdG9tRWxlbWVudHMudXBncmFkZShzdGVwKTtcbiAgICAgIGlmIChzdGVwLmxhYmVsKSB7XG4gICAgICAgIGN1c3RvbUVsZW1lbnRzLnVwZ3JhZGUoc3RlcC5sYWJlbCk7XG4gICAgICAgIGlmICghdGhpcy5saW5lYXIgJiYgc3RlcC5sYWJlbC5kaXNhYmxlZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3Qoc3RlcDogU2JiU3RlcEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc1NlbGVjdGFibGUoc3RlcCkgfHwgc3RlcCA9PT0gdGhpcy5zZWxlY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLnNlbGVjdGVkSW5kZXg7XG4gICAgY29uc3QgY3VycmVudFN0ZXAgPSB0aGlzLnNlbGVjdGVkO1xuICAgIGNvbnN0IHZhbGlkYXRlUGF5bG9hZDogU2JiU3RlcFZhbGlkYXRlRXZlbnREZXRhaWxzID0ge1xuICAgICAgY3VycmVudEluZGV4LFxuICAgICAgY3VycmVudFN0ZXAsXG4gICAgICBuZXh0SW5kZXg6IHRoaXMuc2VsZWN0ZWRJbmRleCAhPT0gbnVsbCA/IHRoaXMuc2VsZWN0ZWRJbmRleCArIDEgOiBudWxsLFxuICAgICAgbmV4dFN0ZXA6IHRoaXMuc2VsZWN0ZWRJbmRleCAhPT0gbnVsbCA/IHRoaXMuc3RlcHNbdGhpcy5zZWxlY3RlZEluZGV4ICsgMV0gOiBudWxsLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZCAmJiAhdGhpcy5zZWxlY3RlZC52YWxpZGF0ZSh2YWxpZGF0ZVBheWxvYWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc2VsZWN0ZWQ7XG4gICAgY3VycmVudD8uZGVzZWxlY3QoKTtcbiAgICBzdGVwLnNlbGVjdCgpO1xuXG4gICAgLyoqIEBpbnRlcm5hbCBvbmx5IHRvIHByb3ZpZGUgZG91YmxlIGVudHJ5IGluIGRvY3MuIEl0IGlzIGEgcHVibGljIGV2ZW50ISAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBTYmJTdGVwQ2hhbmdlRXZlbnQodGhpcy5zZWxlY3RlZEluZGV4LCBjdXJyZW50SW5kZXgsIHRoaXMuc2VsZWN0ZWQsIGN1cnJlbnRTdGVwKSxcbiAgICApO1xuXG4gICAgdGhpcy5fc2V0TWFya2VyU2l6ZSgpO1xuICAgIHRoaXMuX3NldFN0ZXBwZXJIZWlnaHQoc3RlcCk7XG4gICAgdGhpcy5fY29uZmlndXJlTGluZWFyTW9kZSgpO1xuICAgIC8vIEluIGNhc2UgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBpbnNpZGUgdGhlIHN0ZXBwZXIsIHdlIGZvY3VzIHRoZSBzZWxlY3RlZCBzdGVwIGxhYmVsLlxuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5jbG9zZXN0KCdzYmItc3RlcHBlcicpID09PSB0aGlzKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkPy5sYWJlbD8uZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRNYXJrZXJTaXplKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICF0aGlzLl9sb2FkZWQgfHxcbiAgICAgICF0aGlzLnNlbGVjdGVkIHx8XG4gICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIXRoaXMuc2VsZWN0ZWQubGFiZWxcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID1cbiAgICAgIHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJ1xuICAgICAgICA/IHRoaXMuc2VsZWN0ZWQubGFiZWwub2Zmc2V0TGVmdCArIHRoaXMuc2VsZWN0ZWQubGFiZWwub2Zmc2V0V2lkdGhcbiAgICAgICAgOiB0aGlzLl9jYWxjdWxhdGVMYWJlbE9mZnNldFRvcCgpO1xuXG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zYmItc3RlcHBlci1tYXJrZXItc2l6ZScsIGAke29mZnNldH1weGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0ZXBwZXIgaGVpZ2h0IGJhc2VkIG9uIHRoZSBoZWlnaHQgb2YgdGhlIHByb3ZpZGVkIHN0ZXAuXG4gICAqL1xuICBwcml2YXRlIF9zZXRTdGVwcGVySGVpZ2h0KHN0ZXA6IFNiYlN0ZXBFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChzdGVwICYmIHN0ZXAuc2hhZG93Um9vdCkge1xuICAgICAgY29uc3QgaW5uZXJFbGVtZW50OiBTYmJTdGVwRWxlbWVudCB8IG51bGwgPSBzdGVwLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLnNiYi1zdGVwJyk7XG4gICAgICBpZiAoaW5uZXJFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zdGVwcGVyLWNvbnRlbnQtaGVpZ2h0JywgYCR7aW5uZXJFbGVtZW50Lm9mZnNldEhlaWdodH1weGApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZUxhYmVsT2Zmc2V0VG9wKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGhpcy5zdGVwcykge1xuICAgICAgaWYgKHN0ZXAgPT09IHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBvZmZzZXQgPSBzdGVwLmxhYmVsIS5vZmZzZXRIZWlnaHQgKyBvZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBvZmZzZXQgK1xuICAgICAgdGhpcy5zZWxlY3RlZCEubGFiZWwhLm9mZnNldEhlaWdodCEgK1xuICAgICAgcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHRoaXMpLmdldFByb3BlcnR5VmFsdWUoJy0tc2JiLXNwYWNpbmctZml4ZWQtNngnKSkgKlxuICAgICAgICAxNiAqXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9vblNlbGVjdGVkU3RlcFJlc2l6ZShlOiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3NldFN0ZXBwZXJIZWlnaHQoZS50YXJnZXQgYXMgU2JiU3RlcEVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlndXJlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RlcHMuZm9yRWFjaCgoc3RlcCwgaSwgYXJyYXkpID0+IHtcbiAgICAgIHN0ZXAuY29uZmlndXJlKHRoaXMuX2xvYWRlZCk7XG4gICAgICBzdGVwLmxhYmVsPy5jb25maWd1cmUoaSArIDEsIGFycmF5Lmxlbmd0aCwgdGhpcy5fbG9hZGVkKTtcbiAgICB9KTtcbiAgICB0aGlzLl9zZWxlY3QodGhpcy5zZWxlY3RlZCB8fCB0aGlzLl9lbmFibGVkU3RlcHNbMF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlTGFiZWxzKCk6IHZvaWQge1xuICAgIHRoaXMuc3RlcHMuZm9yRWFjaCgoc3RlcCkgPT4ge1xuICAgICAgc3RlcC5zbG90ID0gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gJ3N0ZXAnIDogJ3N0ZXAtbGFiZWwnO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tPcmllbnRhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ob3Jpem9udGFsRnJvbSkge1xuICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IHRoaXMuX21lZGlhTWF0Y2hlci5tYXRjaGVzKGJyZWFrcG9pbnRNYXBbdGhpcy5ob3Jpem9udGFsRnJvbV0pXG4gICAgICAgID8gJ2hvcml6b250YWwnXG4gICAgICAgIDogJ3ZlcnRpY2FsJztcbiAgICAgIHRoaXMuX3VwZGF0ZUxhYmVscygpO1xuICAgIH1cbiAgICAvLyBUaGUgdGltZW91dCBpcyBuZWVkZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG1hcmtlciB0YWtlcyB0aGUgY29ycmVjdCBzdGVwLWxhYmVsIHNpemUuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9zZXRNYXJrZXJTaXplKCksIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25TdGVwcGVyUmVzaXplID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2NoZWNrT3JpZW50YXRpb24oKTtcbiAgICB0aGlzLl9zZXRTdGVwcGVySGVpZ2h0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXNpemVPYnNlcnZlclRpbWVvdXQhKTtcbiAgICB0aGlzLmludGVybmFscy5zdGF0ZXMuYWRkKCdkaXNhYmxlLWFuaW1hdGlvbicpO1xuXG4gICAgLy8gRGlzYWJsZSB0aGUgYW5pbWF0aW9uIHdoZW4gcmVzaXppbmcgdG8gYXZvaWQgc3RyYW5nZSB0cmFuc2l0aW9uIGVmZmVjdHMuXG4gICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXJUaW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICgpID0+IHRoaXMuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ2Rpc2FibGUtYW5pbWF0aW9uJyksXG4gICAgICBERUJPVU5DRV9USU1FLFxuICAgICk7XG4gIH07XG5cbiAgcHJpdmF0ZSBfY29uZmlndXJlTGluZWFyTW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0ZXBzLmZvckVhY2goKHN0ZXAsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIXN0ZXAubGFiZWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3VzdG9tRWxlbWVudHMudXBncmFkZShzdGVwLmxhYmVsKTtcblxuICAgICAgc3RlcC5sYWJlbC5kaXNhYmxlKFxuICAgICAgICAodGhpcy5saW5lYXIgJiYgaW5kZXggPiB0aGlzLnNlbGVjdGVkSW5kZXghKSB8fFxuICAgICAgICAgICghdGhpcy5saW5lYXIgJiYgc3RlcC5sYWJlbC5tYXRjaGVzKCc6c3RhdGUodXNlci1kaXNhYmxlZCknKSksXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uU3RlcHBlclJlc2l6ZSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnRvZ2dsZVN0YXRlKCdkaXNhYmxlLWFuaW1hdGlvbicsICF0aGlzLl9sb2FkZWQpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uU3RlcHBlclJlc2l6ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICB0aGlzLl9jb25maWd1cmUoKTtcblxuICAgICAgaWYgKHRoaXMuX3JlcXVlc3RlZFNlbGVjdGVkICYmIHRoaXMuc3RlcHMuaW5kZXhPZih0aGlzLl9yZXF1ZXN0ZWRTZWxlY3RlZCkgIT09IC0xKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMuc3RlcHMuaW5kZXhPZih0aGlzLl9yZXF1ZXN0ZWRTZWxlY3RlZCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3JlcXVlc3RlZFNlbGVjdGVkSW5kZXgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5fcmVxdWVzdGVkU2VsZWN0ZWRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUodGhpcyk7XG4gICAgICB0aGlzLl9jaGVja09yaWVudGF0aW9uKCk7XG4gICAgICAvLyBSZW1vdmUgZGlzYWJsZS1hbmltYXRpb24gc3RhdGUgYWZ0ZXIgY29tcG9uZW50IGluaXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnZGlzYWJsZS1hbmltYXRpb24nKSwgREVCT1VOQ0VfVElNRSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdvcmllbnRhdGlvbicpICYmICF0aGlzLmhvcml6b250YWxGcm9tKSB7XG4gICAgICB0aGlzLl91cGRhdGVMYWJlbHMoKTtcbiAgICAgIHRoaXMuX3NldE1hcmtlclNpemUoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbGluZWFyJykgJiYgdGhpcy5fbG9hZGVkKSB7XG4gICAgICB0aGlzLl9jb25maWd1cmVMaW5lYXJNb2RlKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2l6ZScpKSB7XG4gICAgICB0aGlzLl9zZXRNYXJrZXJTaXplKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlS2V5RG93bihldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbmFibGVkU3RlcHM6IFNiYlN0ZXBFbGVtZW50W10gPSB0aGlzLl9lbmFibGVkU3RlcHM7XG5cbiAgICBpZiAoXG4gICAgICAhZW5hYmxlZFN0ZXBzIHx8XG4gICAgICAvLyBkb24ndCB0cmFwIG5lc3RlZCBoYW5kbGluZ1xuICAgICAgKChldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSAhPT0gdGhpcyAmJiAoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkucGFyZW50RWxlbWVudCAhPT0gdGhpcylcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJvd0tleVByZXNzZWQoZXZ0KSkge1xuICAgICAgY29uc3QgY3VycmVudDogbnVtYmVyID0gZW5hYmxlZFN0ZXBzLmluZGV4T2YodGhpcy5zZWxlY3RlZCEpO1xuICAgICAgY29uc3QgbmV4dEluZGV4OiBudW1iZXIgPSBnZXROZXh0RWxlbWVudEluZGV4KGV2dCwgY3VycmVudCwgZW5hYmxlZFN0ZXBzLmxlbmd0aCk7XG4gICAgICB0aGlzLl9zZWxlY3QoZW5hYmxlZFN0ZXBzW25leHRJbmRleF0pO1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXN0ZXBwZXJfX2xhYmVsc1wiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJzdGVwLWxhYmVsXCIgQHNsb3RjaGFuZ2U9JHt0aGlzLl9jb25maWd1cmV9Pjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zdGVwcGVyX19zdGVwc1wiPlxuICAgICAgICA8c2xvdCBuYW1lPVwic3RlcFwiIEBzbG90Y2hhbmdlPSR7dGhpcy5fY29uZmlndXJlfT48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItc3RlcHBlcic6IFNiYlN0ZXBwZXJFbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQzBCQSxJQUFNLGdCQUFnQjtBQUV0QixJQUFNLGdCQUF3QztDQUM1QyxNQUFNO0NBQ04sT0FBTztDQUNQLE9BQU87Q0FDUCxPQUFPOztBQUdULElBQWEscUJBQWIsY0FBd0MsTUFBSztDQWEzQyxZQUNFLGVBQ0EsZUFDQSxjQUNBLGNBQW1DO0VBRW5DLE1BQU0s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