@libs-ui/components-scroll-overlay 0.2.356-4 → 0.2.356-41

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.
@@ -1,82 +1,106 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
1
  import { DestroyRef, Directive, ElementRef, Renderer2, computed, effect, inject, input, output, signal, untracked } from '@angular/core';
3
2
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
3
  import { checkMouseOverInContainer, getDragEventByElement } from '@libs-ui/utils';
5
4
  import { Subscription, fromEvent, interval, switchMap, takeUntil, tap } from 'rxjs';
6
5
  import * as i0 from "@angular/core";
6
+ const STYLE_TAG_ID = 'libs-ui-scroll-overlay-style-tag';
7
+ const SCROLL_BOTTOM_TOLERANCE = 3;
8
+ const MIN_THUMB_SIZE = 20;
9
+ const MOUSE_UP_RESET_DELAY = 250;
10
+ const DEFAULT_SCROLLBAR_HOVER_COLOR = '#CDD0D640';
11
+ const DEFAULT_SCROLL_THUMB_COLOR = '#CDD0D6';
12
+ const DEFAULT_SCROLL_THUMB_HOVER_COLOR = '#9CA2AD';
13
+ /**
14
+ * CSS chia sẻ cho mọi instance. Màu/padding lấy qua CSS variables để mỗi
15
+ * directive instance có thể custom độc lập mà không phải re-write style tag.
16
+ */
17
+ const STYLE_CONTENT = `
18
+ .libs-ui-scroll-overlay-container .scrollbar-track {
19
+ background-color: var(--libs-ui-sb-track-color, transparent);
20
+ }
21
+ .libs-ui-scroll-overlay-container .scrollbar-track:hover {
22
+ background-color: var(--libs-ui-sb-track-hover-color, ${DEFAULT_SCROLLBAR_HOVER_COLOR});
23
+ }
24
+ .libs-ui-scroll-overlay-container .scrollbar-track-X {
25
+ width: 100%;
26
+ position: absolute;
27
+ bottom: 0;
28
+ left: 0;
29
+ visibility: hidden;
30
+ cursor: pointer;
31
+ opacity: 0;
32
+ z-index: 1;
33
+ transition: opacity 0.3s ease, visibility 0.3s ease;
34
+ }
35
+ .libs-ui-scroll-overlay-container .scrollbar-track-Y {
36
+ height: 100%;
37
+ position: absolute;
38
+ top: 0;
39
+ right: 0;
40
+ visibility: hidden;
41
+ cursor: pointer;
42
+ opacity: 0;
43
+ z-index: 1;
44
+ transition: opacity 0.3s ease, visibility 0.3s ease;
45
+ }
46
+ .libs-ui-scroll-overlay-container .scrollbar-thumb {
47
+ background-color: var(--libs-ui-sb-thumb-color, ${DEFAULT_SCROLL_THUMB_COLOR});
48
+ }
49
+ .libs-ui-scroll-overlay-container .scrollbar-thumb:hover {
50
+ background-color: var(--libs-ui-sb-thumb-hover-color, ${DEFAULT_SCROLL_THUMB_HOVER_COLOR});
51
+ }
52
+ .libs-ui-scroll-overlay-container .scrollbar-thumb-X {
53
+ height: calc(100% - var(--libs-ui-sb-padding-double, 4px));
54
+ bottom: var(--libs-ui-sb-padding, 2px);
55
+ border-radius: 4px;
56
+ cursor: grabbing;
57
+ transition: background-color 0.3s;
58
+ position: absolute;
59
+ }
60
+ .libs-ui-scroll-overlay-container .scrollbar-thumb-Y {
61
+ width: calc(100% - var(--libs-ui-sb-padding-double, 4px));
62
+ right: var(--libs-ui-sb-padding, 2px);
63
+ border-radius: 4px;
64
+ cursor: grabbing;
65
+ transition: background-color 0.3s;
66
+ position: absolute;
67
+ }
68
+ .libs-ui-scroll-overlay-container .libs-ui-scroll-overlay-element::-webkit-scrollbar {
69
+ width: 0 !important;
70
+ height: 0 !important;
71
+ }
72
+ `;
73
+ const ensureStyleTag = () => {
74
+ if (document.getElementById(STYLE_TAG_ID)) {
75
+ return;
76
+ }
77
+ const styleEl = document.createElement('style');
78
+ styleEl.id = STYLE_TAG_ID;
79
+ styleEl.textContent = STYLE_CONTENT;
80
+ document.head.append(styleEl);
81
+ };
7
82
  export class LibsUiComponentsScrollOverlayDirective {
8
83
  // #region PROPERTY
9
- styles = computed(() => `
10
- .scrollbar-track{
11
- background-color:${this.scrollbarColor()};
12
- }
13
- .scrollbar-track:hover{
14
- background-color:${this.scrollbarHoverColor()};
15
- }
16
- .scrollbar-track-X {
17
- width:100%;
18
- position: absolute;
19
- bottom: 0;
20
- left: 0;
21
- visibility: hidden;
22
- cursor: pointer;
23
- opacity: 0;
24
- z-index: 1;
25
- transition: opacity 0.3s ease, visibility 0.3s ease;
26
- }
27
-
28
- .scrollbar-track-Y {
29
- height:100%;
30
- position: absolute;
31
- top: 0;
32
- right: 0;
33
- visibility: hidden;
34
- cursor: pointer;
35
- opacity: 0;
36
- z-index: 1;
37
- transition: opacity 0.3s ease, visibility 0.3s ease;
38
- }
39
-
40
- .scrollbar-thumb{
41
- background-color:${this.scrollThumbColor()};
42
- }
43
- .scrollbar-thumb:hover{
44
- background-color:${this.scrollThumbHoverColor()};
45
- }
46
-
47
- .scrollbar-thumb-X {
48
- height: calc(100% - ${this.scrollbarPadding() * 2}px);
49
- bottom: ${this.scrollbarPadding()}px;
50
- border-radius: 4px;
51
- cursor: grabbing;
52
- transition: background-color 0.3s;
53
- position: absolute;
54
- }
55
-
56
- .scrollbar-thumb-Y {
57
- width: calc(100% - ${this.scrollbarPadding() * 2}px);
58
- right: ${this.scrollbarPadding()}px;
59
- border-radius: 4px;
60
- cursor: grabbing;
61
- transition: background-color 0.3s;
62
- position: absolute;
63
- }
64
-
65
- .lib-ui-scroll-overlay-container .lib-ui-scroll-overlay-element::-webkit-scrollbar {
66
- width: 0 !important;
67
- height: 0 !important;
68
- }
69
- `, {});
70
84
  isScrollThumb = signal(false);
71
85
  keepDisplayThumb = signal(false);
72
86
  subsX = new Subscription();
73
87
  subsY = new Subscription();
74
- scrollbarWidth = computed(() => this.options()?.scrollbarWidth ?? 10); // Chiều rộng thanh cuộn
75
- scrollbarPadding = computed(() => this.options()?.scrollbarPadding ?? 2); // Chiều rộng thanh cuộn
88
+ /** Timer reset isScrollThumb sau drag end phải clear khi destroy để tránh set signal trên instance đã teardown. */
89
+ mouseUpTimer;
90
+ /** rAF throttle cho scroll handler — gom multiple scroll events về 1 lần update DOM mỗi frame. */
91
+ scrollRafX;
92
+ scrollRafY;
93
+ /** Cache dimensions — skip DOM write nếu kích thước không đổi giữa 2 lần poll. */
94
+ lastContentWidth = 0;
95
+ lastContentHeight = 0;
96
+ lastContainerWidth = 0;
97
+ lastContainerHeight = 0;
98
+ scrollbarWidth = computed(() => this.options()?.scrollbarWidth ?? 10);
99
+ scrollbarPadding = computed(() => this.options()?.scrollbarPadding ?? 2);
76
100
  scrollbarColor = computed(() => this.options()?.scrollbarColor ?? '');
77
- scrollbarHoverColor = computed(() => this.options()?.scrollbarColor ?? '#CDD0D640');
78
- scrollThumbColor = computed(() => this.options()?.scrollThumbColor ?? '#CDD0D6');
79
- scrollThumbHoverColor = computed(() => this.options()?.scrollThumbHoverColor ?? '#9CA2AD');
101
+ scrollbarHoverColor = computed(() => this.options()?.scrollbarHoverColor ?? DEFAULT_SCROLLBAR_HOVER_COLOR);
102
+ scrollThumbColor = computed(() => this.options()?.scrollThumbColor ?? DEFAULT_SCROLL_THUMB_COLOR);
103
+ scrollThumbHoverColor = computed(() => this.options()?.scrollThumbHoverColor ?? DEFAULT_SCROLL_THUMB_HOVER_COLOR);
80
104
  divContainer = document.createElement('div');
81
105
  trackX = document.createElement('div');
82
106
  thumbX = document.createElement('div');
@@ -86,7 +110,7 @@ export class LibsUiComponentsScrollOverlayDirective {
86
110
  debugMode = input(false);
87
111
  ignoreInit = input(false);
88
112
  classContainer = input('', { transform: (value) => value ?? '' });
89
- options = input(Object.assign({}));
113
+ options = input({});
90
114
  elementCheckScrollX = input();
91
115
  elementCheckScrollY = input();
92
116
  elementScroll = input();
@@ -101,58 +125,88 @@ export class LibsUiComponentsScrollOverlayDirective {
101
125
  render2 = inject(Renderer2);
102
126
  destroyRef = inject(DestroyRef);
103
127
  constructor() {
128
+ // Setup scrollbars khi options/classContainer đổi.
104
129
  effect(() => {
105
130
  if (this.ignoreInit()) {
106
131
  return;
107
132
  }
108
133
  const options = this.options();
109
- this.divContainer.className = '';
110
- this.classContainer()
111
- ?.split(' ')
112
- .forEach((className) => {
113
- if (!className) {
114
- return;
115
- }
116
- this.divContainer.classList.add(className);
117
- });
134
+ const classContainer = this.classContainer();
118
135
  untracked(() => {
136
+ this.syncContainerExtraClasses(classContainer);
119
137
  this.Element.classList.toggle('overflow-hidden', options?.scrollX === 'hidden' && options?.scrollY === 'hidden');
120
138
  if (options?.scrollX !== 'hidden') {
121
139
  this.subsX.unsubscribe();
140
+ this.subsX = new Subscription();
122
141
  this.trackX.className = '';
123
142
  this.thumbX.className = '';
124
143
  this.trackX.style.height = `${this.scrollbarWidth()}px`;
125
144
  this.createScrollbar('X', this.trackX, this.thumbX);
126
- this.bindEventsScrollBar('X', this.trackX);
127
- this.handlerDragAndDropThumb('X');
128
- this.handlerClickTrack('X');
145
+ this.bindEventsScrollBar('X', this.trackX, this.subsX);
146
+ this.handlerDragAndDropThumb('X', this.subsX);
147
+ this.handlerClickTrack('X', this.subsX);
129
148
  }
130
149
  if (options?.scrollY !== 'hidden') {
150
+ this.subsY.unsubscribe();
151
+ this.subsY = new Subscription();
131
152
  this.trackY.className = '';
132
153
  this.thumbY.className = '';
133
154
  this.trackY.style.width = `${this.scrollbarWidth()}px`;
134
- this.subsY.unsubscribe();
135
155
  this.createScrollbar('Y', this.trackY, this.thumbY);
136
- this.bindEventsScrollBar('Y', this.trackY);
137
- this.handlerDragAndDropThumb('Y');
138
- this.handlerClickTrack('Y');
156
+ this.bindEventsScrollBar('Y', this.trackY, this.subsY);
157
+ this.handlerDragAndDropThumb('Y', this.subsY);
158
+ this.handlerClickTrack('Y', this.subsY);
139
159
  }
140
160
  });
141
161
  });
162
+ // Sync CSS variables per-instance — không đụng style tag chia sẻ giữa các instance.
163
+ effect(() => {
164
+ const sbColor = this.scrollbarColor();
165
+ const sbHover = this.scrollbarHoverColor();
166
+ const thColor = this.scrollThumbColor();
167
+ const thHover = this.scrollThumbHoverColor();
168
+ const padding = this.scrollbarPadding();
169
+ untracked(() => {
170
+ const divStyle = this.divContainer.style;
171
+ divStyle.setProperty('--libs-ui-sb-track-color', sbColor);
172
+ divStyle.setProperty('--libs-ui-sb-track-hover-color', sbHover);
173
+ divStyle.setProperty('--libs-ui-sb-thumb-color', thColor);
174
+ divStyle.setProperty('--libs-ui-sb-thumb-hover-color', thHover);
175
+ divStyle.setProperty('--libs-ui-sb-padding', `${padding}px`);
176
+ divStyle.setProperty('--libs-ui-sb-padding-double', `${padding * 2}px`);
177
+ });
178
+ });
179
+ // Window resize → re-measure thumb size cho cả 2 trục.
180
+ fromEvent(window, 'resize')
181
+ .pipe(takeUntilDestroyed(this.destroyRef))
182
+ .subscribe(() => {
183
+ this.updateScrollbarSize('X');
184
+ this.updateScrollbarSize('Y');
185
+ });
186
+ this.destroyRef.onDestroy(() => {
187
+ clearTimeout(this.mouseUpTimer);
188
+ if (this.scrollRafX)
189
+ cancelAnimationFrame(this.scrollRafX);
190
+ if (this.scrollRafY)
191
+ cancelAnimationFrame(this.scrollRafY);
192
+ this.divContainer.remove();
193
+ this.subsX.unsubscribe();
194
+ this.subsY.unsubscribe();
195
+ });
142
196
  }
143
197
  // #region FUNCTIONS
144
198
  get Element() {
145
199
  return this.elementScroll() || this.element.nativeElement;
146
200
  }
201
+ /** Thêm các class consumer truyền qua [classContainer] mà không xóa class hệ thống đã set. */
202
+ syncContainerExtraClasses(classStr) {
203
+ classStr
204
+ .split(' ')
205
+ .filter(Boolean)
206
+ .forEach((className) => this.divContainer.classList.add(className));
207
+ }
147
208
  createScrollbar(scrollDirection, trackEl, thumbEl) {
148
- const idStyleTag = '#id-style-tag-custom-scroll-overlay';
149
- const styleElCustomScrollOverlay = document.getElementById(idStyleTag);
150
- if (!styleElCustomScrollOverlay) {
151
- const styleEl = document.createElement('style');
152
- styleEl.setAttribute('id', idStyleTag);
153
- styleEl.innerHTML = this.styles();
154
- document.head.append(styleEl);
155
- }
209
+ ensureStyleTag();
156
210
  const stylesProperty = {
157
211
  'box-sizing': 'border-box',
158
212
  'scrollbar-width': 'none',
@@ -161,18 +215,16 @@ export class LibsUiComponentsScrollOverlayDirective {
161
215
  'overflow-x': `${this.options()?.scrollX || 'scroll'}`,
162
216
  'overflow-y': `${this.options()?.scrollY || 'scroll'}`,
163
217
  };
164
- Object.keys(stylesProperty).forEach((key) => {
165
- this.render2.setStyle(this.Element, key, stylesProperty[key], 1);
166
- });
167
- trackEl.classList.add(`scrollbar-track`);
218
+ Object.keys(stylesProperty).forEach((key) => this.render2.setStyle(this.Element, key, stylesProperty[key], 1));
219
+ trackEl.classList.add('scrollbar-track');
168
220
  trackEl.classList.add(`scrollbar-track-${scrollDirection}`);
169
- thumbEl.classList.add(`scrollbar-thumb`);
221
+ thumbEl.classList.add('scrollbar-thumb');
170
222
  thumbEl.classList.add(`scrollbar-thumb-${scrollDirection}`);
171
223
  trackEl.appendChild(thumbEl);
172
224
  if (this.Element.className) {
173
225
  this.Element.className.split(' ').forEach((className) => {
174
226
  if (className &&
175
- (['w-full', 'w-screen', 'h-full', 'h-screen', 'shrink-0'].includes(className) || className.includes('min-h-') || className.includes('min-w-') || /^(!?)(h|w)-\[[0-9]+px\]$/.test(className)) &&
227
+ (['w-full', 'w-screen', 'h-full', 'h-screen', 'shrink-0'].includes(className) || className.includes('min-h-') || className.includes('min-w-') || /^(!?)[hw]-\[\d+px\]$/.test(className)) &&
176
228
  !this.divContainer.classList.contains(className)) {
177
229
  this.divContainer.classList.add(className);
178
230
  }
@@ -183,12 +235,12 @@ export class LibsUiComponentsScrollOverlayDirective {
183
235
  if (!this.Element.className.includes('min-w-')) {
184
236
  this.divContainer.classList.add('min-w-0');
185
237
  }
186
- if (!this.Element.className.includes('lib-ui-scroll-overlay-element')) {
187
- this.Element.classList.add('lib-ui-scroll-overlay-element');
238
+ if (!this.Element.className.includes('libs-ui-scroll-overlay-element')) {
239
+ this.Element.classList.add('libs-ui-scroll-overlay-element');
188
240
  }
189
241
  }
190
- if (!this.divContainer.classList.contains('lib-ui-scroll-overlay-container')) {
191
- this.divContainer.classList.add('lib-ui-scroll-overlay-container');
242
+ if (!this.divContainer.classList.contains('libs-ui-scroll-overlay-container')) {
243
+ this.divContainer.classList.add('libs-ui-scroll-overlay-container');
192
244
  }
193
245
  this.divContainer.appendChild(trackEl);
194
246
  if (!this.divContainer.style.position) {
@@ -198,11 +250,11 @@ export class LibsUiComponentsScrollOverlayDirective {
198
250
  this.divContainer.append(this.Element);
199
251
  this.updateScrollbarSize(scrollDirection);
200
252
  }
201
- bindEventsScrollBar(scrollDirection, trackEl) {
253
+ bindEventsScrollBar(scrollDirection, trackEl, subs) {
202
254
  let scrollLeft = this.Element.scrollLeft;
203
255
  let scrollTop = this.Element.scrollTop;
204
- const subs = fromEvent(this.Element, 'scroll')
205
- .pipe(tap((event) => {
256
+ subs.add(fromEvent(this.Element, 'scroll')
257
+ .pipe(tap((event) => this.scheduleScrollHandle(scrollDirection, () => {
206
258
  const target = this.Element;
207
259
  this.outScroll.emit(event);
208
260
  if (scrollDirection === 'X') {
@@ -223,26 +275,26 @@ export class LibsUiComponentsScrollOverlayDirective {
223
275
  scrollTop = target.scrollTop;
224
276
  this.outScrollY.emit(event);
225
277
  if (target.scrollTop === 0) {
226
- return this.outScrollTop.emit(event);
278
+ this.outScrollTop.emit(event);
279
+ return;
227
280
  }
228
- if (target.scrollHeight <= target.scrollTop + target.offsetHeight + 3) {
229
- return this.outScrollBottom.emit(event);
281
+ if (target.scrollHeight <= target.scrollTop + target.offsetHeight + SCROLL_BOTTOM_TOLERANCE) {
282
+ this.outScrollBottom.emit(event);
230
283
  }
231
- }), takeUntilDestroyed(this.destroyRef))
232
- .subscribe();
233
- subs.add(fromEvent(document, 'resize')
234
- .pipe(tap(this.updateScrollbarSize.bind(this, scrollDirection)), takeUntilDestroyed(this.destroyRef))
284
+ })), takeUntilDestroyed(this.destroyRef))
235
285
  .subscribe());
236
286
  const mouseLeave = fromEvent(this.divContainer, 'mouseleave');
237
- const mouseenter = fromEvent(this.divContainer, 'mouseenter');
238
- subs.add(mouseenter
287
+ const mouseEnter = fromEvent(this.divContainer, 'mouseenter');
288
+ subs.add(mouseEnter
239
289
  .pipe(tap(() => {
240
290
  if ((scrollDirection === 'X' && !this.options()?.scrollXOpacity0) || (scrollDirection === 'Y' && !this.options()?.scrollYOpacity0)) {
241
291
  trackEl.style.visibility = 'visible';
242
292
  trackEl.style.opacity = '1';
243
293
  }
244
294
  this.updateScrollbarSize(scrollDirection);
245
- }), switchMap(() => interval(1000).pipe(takeUntil(mouseLeave))), tap(this.updateScrollbarSize.bind(this, scrollDirection)), takeUntilDestroyed(this.destroyRef))
295
+ }), switchMap(() => interval(1000).pipe(takeUntil(mouseLeave))), tap(() => {
296
+ this.updateScrollbarSize(scrollDirection);
297
+ }), takeUntilDestroyed(this.destroyRef))
246
298
  .subscribe());
247
299
  subs.add(mouseLeave
248
300
  .pipe(tap(() => {
@@ -253,20 +305,31 @@ export class LibsUiComponentsScrollOverlayDirective {
253
305
  trackEl.style.opacity = '0';
254
306
  }), takeUntilDestroyed(this.destroyRef))
255
307
  .subscribe());
308
+ }
309
+ /** Throttle scroll handler theo frame — gom nhiều scroll event vào 1 lần update DOM. */
310
+ scheduleScrollHandle(scrollDirection, handle) {
256
311
  if (scrollDirection === 'X') {
257
- this.subsX = subs;
312
+ if (this.scrollRafX)
313
+ return;
314
+ this.scrollRafX = requestAnimationFrame(() => {
315
+ this.scrollRafX = undefined;
316
+ handle();
317
+ });
258
318
  return;
259
319
  }
260
- if (scrollDirection === 'Y') {
261
- this.subsY = subs;
320
+ if (this.scrollRafY)
262
321
  return;
263
- }
322
+ this.scrollRafY = requestAnimationFrame(() => {
323
+ this.scrollRafY = undefined;
324
+ handle();
325
+ });
264
326
  }
265
- handlerClickTrack(scrollDirection) {
327
+ handlerClickTrack(scrollDirection, subs) {
266
328
  const elementTrack = scrollDirection === 'X' ? this.trackX : this.trackY;
267
329
  const elementThumb = scrollDirection === 'X' ? this.thumbX : this.thumbY;
268
- const subs = scrollDirection === 'X' ? this.subsX : this.subsY;
269
- subs.add(fromEvent(elementTrack, 'click').subscribe((e) => {
330
+ subs.add(fromEvent(elementTrack, 'click')
331
+ .pipe(takeUntilDestroyed(this.destroyRef))
332
+ .subscribe((e) => {
270
333
  if (this.isScrollThumb()) {
271
334
  return;
272
335
  }
@@ -281,10 +344,9 @@ export class LibsUiComponentsScrollOverlayDirective {
281
344
  this.updateScrollPositionByUserAction(scrollDirection, e, 'smooth', -1 * elementThumb.getBoundingClientRect().height);
282
345
  }));
283
346
  }
284
- handlerDragAndDropThumb(scrollDirection) {
347
+ handlerDragAndDropThumb(scrollDirection, subs) {
285
348
  const elementTrack = scrollDirection === 'X' ? this.trackX : this.trackY;
286
349
  const elementThumb = scrollDirection === 'X' ? this.thumbX : this.thumbY;
287
- const subs = scrollDirection === 'X' ? this.subsX : this.subsY;
288
350
  let lengthThumbToPointClick = 0;
289
351
  subs.add(getDragEventByElement({
290
352
  elementMouseDown: elementThumb,
@@ -304,9 +366,10 @@ export class LibsUiComponentsScrollOverlayDirective {
304
366
  elementTrack.style.visibility = 'hidden';
305
367
  elementTrack.style.opacity = '0';
306
368
  }
307
- setTimeout(() => {
369
+ clearTimeout(this.mouseUpTimer);
370
+ this.mouseUpTimer = setTimeout(() => {
308
371
  this.isScrollThumb.set(false);
309
- }, 250);
372
+ }, MOUSE_UP_RESET_DELAY);
310
373
  },
311
374
  destroyRef: this.destroyRef,
312
375
  }).subscribe((mouseEvent) => {
@@ -333,45 +396,48 @@ export class LibsUiComponentsScrollOverlayDirective {
333
396
  if (scrollDirection === 'X') {
334
397
  const containerWidth = this.Element.offsetWidth;
335
398
  const contentWidth = (this.elementCheckScrollX() || this.Element).scrollWidth;
399
+ if (containerWidth === this.lastContainerWidth && contentWidth === this.lastContentWidth)
400
+ return;
401
+ this.lastContainerWidth = containerWidth;
402
+ this.lastContentWidth = contentWidth;
336
403
  const thumbWidth = (containerWidth / contentWidth) * containerWidth;
337
- this.thumbX.style.width = `${Math.max(20, thumbWidth)}px`;
338
- this.trackX.style.display = 'none';
339
- if (contentWidth > containerWidth) {
340
- this.trackX.style.display = 'block';
341
- }
404
+ this.thumbX.style.width = `${Math.max(MIN_THUMB_SIZE, thumbWidth)}px`;
405
+ this.trackX.style.display = contentWidth > containerWidth ? 'block' : 'none';
342
406
  this.updateScrollbarPosition(scrollDirection);
343
407
  return;
344
408
  }
345
409
  const containerHeight = this.Element.offsetHeight;
346
410
  const contentHeight = (this.elementCheckScrollY() || this.Element).scrollHeight;
411
+ if (containerHeight === this.lastContainerHeight && contentHeight === this.lastContentHeight)
412
+ return;
413
+ this.lastContainerHeight = containerHeight;
414
+ this.lastContentHeight = contentHeight;
347
415
  const thumbHeight = (containerHeight / contentHeight) * containerHeight;
348
- this.thumbY.style.height = `${Math.max(20, thumbHeight)}px`;
349
- this.trackY.style.display = 'none';
350
- if (contentHeight > containerHeight) {
351
- this.trackY.style.display = 'block';
352
- }
416
+ this.thumbY.style.height = `${Math.max(MIN_THUMB_SIZE, thumbHeight)}px`;
417
+ this.trackY.style.display = contentHeight > containerHeight ? 'block' : 'none';
353
418
  this.updateScrollbarPosition('Y');
354
419
  }
355
420
  updateScrollbarPosition(scrollDirection) {
356
421
  if (scrollDirection === 'X') {
357
422
  const containerWidth = this.Element.offsetWidth;
358
423
  const contentWidth = (this.elementCheckScrollX() || this.Element).scrollWidth;
359
- const scrollLeft = this.Element.scrollLeft;
360
- const thumbPosition = (scrollLeft / (contentWidth - containerWidth)) * (containerWidth - this.thumbX.offsetWidth);
424
+ const denominatorScroll = contentWidth - containerWidth;
425
+ if (denominatorScroll <= 0)
426
+ return;
427
+ const denominatorThumb = containerWidth - this.thumbX.offsetWidth;
428
+ const thumbPosition = (this.Element.scrollLeft / denominatorScroll) * denominatorThumb;
361
429
  this.thumbX.style.left = `${thumbPosition}px`;
362
430
  return;
363
431
  }
364
432
  const containerHeight = this.Element.offsetHeight;
365
433
  const contentHeight = (this.elementCheckScrollY() || this.Element).scrollHeight;
366
- const scrollTop = this.Element.scrollTop;
367
- const thumbPosition = (scrollTop / (contentHeight - containerHeight)) * (containerHeight - this.thumbY.offsetHeight);
434
+ const denominatorScroll = contentHeight - containerHeight;
435
+ if (denominatorScroll <= 0)
436
+ return;
437
+ const denominatorThumb = containerHeight - this.thumbY.offsetHeight;
438
+ const thumbPosition = (this.Element.scrollTop / denominatorScroll) * denominatorThumb;
368
439
  this.thumbY.style.top = `${thumbPosition}px`;
369
440
  }
370
- ngOnDestroy() {
371
- this.divContainer.remove();
372
- this.subsX.unsubscribe();
373
- this.subsY.unsubscribe();
374
- }
375
441
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsScrollOverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
376
442
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: LibsUiComponentsScrollOverlayDirective, isStandalone: true, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: { debugMode: { classPropertyName: "debugMode", publicName: "debugMode", isSignal: true, isRequired: false, transformFunction: null }, ignoreInit: { classPropertyName: "ignoreInit", publicName: "ignoreInit", isSignal: true, isRequired: false, transformFunction: null }, classContainer: { classPropertyName: "classContainer", publicName: "classContainer", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, elementCheckScrollX: { classPropertyName: "elementCheckScrollX", publicName: "elementCheckScrollX", isSignal: true, isRequired: false, transformFunction: null }, elementCheckScrollY: { classPropertyName: "elementCheckScrollY", publicName: "elementCheckScrollY", isSignal: true, isRequired: false, transformFunction: null }, elementScroll: { classPropertyName: "elementScroll", publicName: "elementScroll", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outScroll: "outScroll", outScrollX: "outScrollX", outScrollY: "outScrollY", outScrollTop: "outScrollTop", outScrollBottom: "outScrollBottom" }, ngImport: i0 });
377
443
  }
@@ -383,4 +449,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
383
449
  standalone: true,
384
450
  }]
385
451
  }], ctorParameters: () => [] });
386
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLW92ZXJsYXkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3Njcm9sbC1vdmVybGF5L3NyYy9zY3JvbGwtb3ZlcmxheS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBYSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BKLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFPcEYsTUFBTSxPQUFPLHNDQUFzQztJQUNqRCxtQkFBbUI7SUFDRixNQUFNLEdBQUcsUUFBUSxDQUNoQyxHQUFHLEVBQUUsQ0FBQzs7NEJBRWtCLElBQUksQ0FBQyxjQUFjLEVBQUU7OzsyQkFHdEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkJBMkIxQixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7OzsyQkFHdkIsSUFBSSxDQUFDLHFCQUFxQixFQUFFOzs7OzhCQUl6QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDO2tCQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Ozs7Ozs7OzZCQVFaLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUM7aUJBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTs7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RCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0EzYlUsc0NBQXNDOzRGQUF0QyxzQ0FBc0M7OzRGQUF0QyxzQ0FBc0M7a0JBTGxELFNBQVM7bUJBQUM7b0JBQ1QsOERBQThEO29CQUM5RCxRQUFRLEVBQUUsMENBQTBDO29CQUNwRCxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBEZXN0cm95UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgUmVuZGVyZXIyLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyLCBnZXREcmFnRXZlbnRCeUVsZW1lbnQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZyb21FdmVudCwgaW50ZXJ2YWwsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElTY3JvbGxPdmVybGF5T3B0aW9ucywgVFlQRV9TQ1JPTExfRElSRUNUSU9OIH0gZnJvbSAnLi9zY3JvbGwuaW50ZXJmYWNlJztcbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSByZWFkb25seSBzdHlsZXMgPSBjb21wdXRlZChcbiAgICAoKSA9PiBgXG4gICAgICAuc2Nyb2xsYmFyLXRyYWNre1xuICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjoke3RoaXMuc2Nyb2xsYmFyQ29sb3IoKX07XG4gICAgICB9XG4gICAgICAuc2Nyb2xsYmFyLXRyYWNrOmhvdmVye1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiR7dGhpcy5zY3JvbGxiYXJIb3ZlckNvbG9yKCl9O1xuICAgICAgfVxuICAgICAgLnNjcm9sbGJhci10cmFjay1YIHtcbiAgICAgICAgd2lkdGg6MTAwJTtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZSwgdmlzaWJpbGl0eSAwLjNzIGVhc2U7XG4gICAgICB9XG5cbiAgICAgIC5zY3JvbGxiYXItdHJhY2stWSB7XG4gICAgICAgIGhlaWdodDoxMDAlO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZSwgdmlzaWJpbGl0eSAwLjNzIGVhc2U7XG4gICAgICB9XG5cbiAgICAgIC5zY3JvbGxiYXItdGh1bWJ7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6JHt0aGlzLnNjcm9sbFRodW1iQ29sb3IoKX07XG4gICAgICB9XG4gICAgICAuc2Nyb2xsYmFyLXRodW1iOmhvdmVye1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiR7dGhpcy5zY3JvbGxUaHVtYkhvdmVyQ29sb3IoKX07XG4gICAgICB9XG5cbiAgICAgIC5zY3JvbGxiYXItdGh1bWItWCB7XG4gICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gJHt0aGlzLnNjcm9sbGJhclBhZGRpbmcoKSAqIDJ9cHgpO1xuICAgICAgICBib3R0b206ICR7dGhpcy5zY3JvbGxiYXJQYWRkaW5nKCl9cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgY3Vyc29yOiBncmFiYmluZztcbiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB9XG5cbiAgICAgIC5zY3JvbGxiYXItdGh1bWItWSB7XG4gICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAke3RoaXMuc2Nyb2xsYmFyUGFkZGluZygpICogMn1weCk7XG4gICAgICAgIHJpZ2h0OiAke3RoaXMuc2Nyb2xsYmFyUGFkZGluZygpfXB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGN1cnNvcjogZ3JhYmJpbmc7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgfVxuXG4gICAgICAubGliLXVpLXNjcm9sbC1vdmVybGF5LWNvbnRhaW5lciAubGliLXVpLXNjcm9sbC1vdmVybGF5LWVsZW1lbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICAgICAgd2lkdGg6IDAgIWltcG9ydGFudDtcbiAgICAgICAgaGVpZ2h0OiAwICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gIGAsXG4gICAge31cbiAgKTtcbiAgcHJpdmF0ZSBpc1Njcm9sbFRodW1iID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBrZWVwRGlzcGxheVRodW1iID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzdWJzWCA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBzdWJzWSA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBzY3JvbGxiYXJXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3B0aW9ucygpPy5zY3JvbGxiYXJXaWR0aCA/PyAxMCk7IC8vIENoaeG7gXUgcuG7mW5nIHRoYW5oIGN14buZblxuICBwcml2YXRlIHNjcm9sbGJhclBhZGRpbmcgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsYmFyUGFkZGluZyA/PyAyKTsgLy8gQ2hp4buBdSBy4buZbmcgdGhhbmggY3Xhu5luXG4gIHByaXZhdGUgc2Nyb2xsYmFyQ29sb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsYmFyQ29sb3IgPz8gJycpO1xuICBwcml2YXRlIHNjcm9sbGJhckhvdmVyQ29sb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsYmFyQ29sb3IgPz8gJyNDREQwRDY0MCcpO1xuICBwcml2YXRlIHNjcm9sbFRodW1iQ29sb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsVGh1bWJDb2xvciA/PyAnI0NERDBENicpO1xuICBwcml2YXRlIHNjcm9sbFRodW1iSG92ZXJDb2xvciA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3B0aW9ucygpPy5zY3JvbGxUaHVtYkhvdmVyQ29sb3IgPz8gJyM5Q0EyQUQnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXZDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFja1g6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGh1bWJYOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWNrWTogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0aHVtYlk6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSBkZWJ1Z01vZGUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGlnbm9yZUluaXQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGNsYXNzQ29udGFpbmVyID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgb3B0aW9ucyA9IGlucHV0PElTY3JvbGxPdmVybGF5T3B0aW9ucyB8IHVuZGVmaW5lZD4oT2JqZWN0LmFzc2lnbih7fSkpO1xuICByZWFkb25seSBlbGVtZW50Q2hlY2tTY3JvbGxYID0gaW5wdXQ8SFRNTEVsZW1lbnQ+KCk7XG4gIHJlYWRvbmx5IGVsZW1lbnRDaGVja1Njcm9sbFkgPSBpbnB1dDxIVE1MRWxlbWVudD4oKTtcbiAgcmVhZG9ubHkgZWxlbWVudFNjcm9sbCA9IGlucHV0PEhUTUxFbGVtZW50PigpO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dFNjcm9sbCA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U2Nyb2xsWCA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U2Nyb2xsWSA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U2Nyb2xsVG9wID0gb3V0cHV0PEV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxCb3R0b20gPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgLy8gI3JlZ2lvbiBJTkpFQ1RcbiAgcHJpdmF0ZSBlbGVtZW50ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlbmRlcjIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pZ25vcmVJbml0KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgdGhpcy5kaXZDb250YWluZXIuY2xhc3NOYW1lID0gJyc7XG4gICAgICB0aGlzLmNsYXNzQ29udGFpbmVyKClcbiAgICAgICAgPy5zcGxpdCgnICcpXG4gICAgICAgIC5mb3JFYWNoKChjbGFzc05hbWUpID0+IHtcbiAgICAgICAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRpdkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLkVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnb3ZlcmZsb3ctaGlkZGVuJywgb3B0aW9ucz8uc2Nyb2xsWCA9PT0gJ2hpZGRlbicgJiYgb3B0aW9ucz8uc2Nyb2xsWSA9PT0gJ2hpZGRlbicpO1xuICAgICAgICBpZiAob3B0aW9ucz8uc2Nyb2xsWCAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICB0aGlzLnN1YnNYLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy50cmFja1guY2xhc3NOYW1lID0gJyc7XG4gICAgICAgICAgdGhpcy50aHVtYlguY2xhc3NOYW1lID0gJyc7XG4gICAgICAgICAgdGhpcy50cmFja1guc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5zY3JvbGxiYXJXaWR0aCgpfXB4YDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNjcm9sbGJhcignWCcsIHRoaXMudHJhY2tYLCB0aGlzLnRodW1iWCk7XG4gICAgICAgICAgdGhpcy5iaW5kRXZlbnRzU2Nyb2xsQmFyKCdYJywgdGhpcy50cmFja1gpO1xuXG4gICAgICAgICAgdGhpcy5oYW5kbGVyRHJhZ0FuZERyb3BUaHVtYignWCcpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlckNsaWNrVHJhY2soJ1gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zY3JvbGxZICE9PSAnaGlkZGVuJykge1xuICAgICAgICAgIHRoaXMudHJhY2tZLmNsYXNzTmFtZSA9ICcnO1xuICAgICAgICAgIHRoaXMudGh1bWJZLmNsYXNzTmFtZSA9ICcnO1xuICAgICAgICAgIHRoaXMudHJhY2tZLnN0eWxlLndpZHRoID0gYCR7dGhpcy5zY3JvbGxiYXJXaWR0aCgpfXB4YDtcbiAgICAgICAgICB0aGlzLnN1YnNZLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5jcmVhdGVTY3JvbGxiYXIoJ1knLCB0aGlzLnRyYWNrWSwgdGhpcy50aHVtYlkpO1xuICAgICAgICAgIHRoaXMuYmluZEV2ZW50c1Njcm9sbEJhcignWScsIHRoaXMudHJhY2tZKTtcblxuICAgICAgICAgIHRoaXMuaGFuZGxlckRyYWdBbmREcm9wVGh1bWIoJ1knKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJDbGlja1RyYWNrKCdZJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBGVU5DVElPTlNcbiAgcHJpdmF0ZSBnZXQgRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFNjcm9sbCgpIHx8IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTY3JvbGxiYXIoc2Nyb2xsRGlyZWN0aW9uOiBUWVBFX1NDUk9MTF9ESVJFQ1RJT04sIHRyYWNrRWw6IEhUTUxFbGVtZW50LCB0aHVtYkVsOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGlkU3R5bGVUYWcgPSAnI2lkLXN0eWxlLXRhZy1jdXN0b20tc2Nyb2xsLW92ZXJsYXknO1xuICAgIGNvbnN0IHN0eWxlRWxDdXN0b21TY3JvbGxPdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRTdHlsZVRhZyk7XG5cbiAgICBpZiAoIXN0eWxlRWxDdXN0b21TY3JvbGxPdmVybGF5KSB7XG4gICAgICBjb25zdCBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlRWwuc2V0QXR0cmlidXRlKCdpZCcsIGlkU3R5bGVUYWcpO1xuICAgICAgc3R5bGVFbC5pbm5lckhUTUwgPSB0aGlzLnN0eWxlcygpO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoc3R5bGVFbCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVzUHJvcGVydHkgPSB7XG4gICAgICAnYm94LXNpemluZyc6ICdib3JkZXItYm94JyxcbiAgICAgICdzY3JvbGxiYXItd2lkdGgnOiAnbm9uZScsXG4gICAgICAnc2Nyb2xsYmFyLWNvbG9yJzogdGhpcy5vcHRpb25zKCk/Lmlnbm9yZVRyYW5zcGFyZW50U2Nyb2xsQmFyQ29sb3JEZWZhdWx0ID8gJ2F1dG8nIDogJ3RyYW5zcGFyZW50IHRyYW5zcGFyZW50JyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICdvdmVyZmxvdy14JzogYCR7dGhpcy5vcHRpb25zKCk/LnNjcm9sbFggfHwgJ3Njcm9sbCd9YCxcbiAgICAgICdvdmVyZmxvdy15JzogYCR7dGhpcy5vcHRpb25zKCk/LnNjcm9sbFkgfHwgJ3Njcm9sbCd9YCxcbiAgICB9IGFzIGFueTtcblxuICAgIE9iamVjdC5rZXlzKHN0eWxlc1Byb3BlcnR5KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRoaXMucmVuZGVyMi5zZXRTdHlsZSh0aGlzLkVsZW1lbnQsIGtleSwgc3R5bGVzUHJvcGVydHlba2V5XSwgMSk7XG4gICAgfSk7XG5cbiAgICB0cmFja0VsLmNsYXNzTGlzdC5hZGQoYHNjcm9sbGJhci10cmFja2ApO1xuICAgIHRyYWNrRWwuY2xhc3NMaXN0LmFkZChgc2Nyb2xsYmFyLXRyYWNrLSR7c2Nyb2xsRGlyZWN0aW9ufWApO1xuXG4gICAgdGh1bWJFbC5jbGFzc0xpc3QuYWRkKGBzY3JvbGxiYXItdGh1bWJgKTtcbiAgICB0aHVtYkVsLmNsYXNzTGlzdC5hZGQoYHNjcm9sbGJhci10aHVtYi0ke3Njcm9sbERpcmVjdGlvbn1gKTtcbiAgICB0cmFja0VsLmFwcGVuZENoaWxkKHRodW1iRWwpO1xuICAgIGlmICh0aGlzLkVsZW1lbnQuY2xhc3NOYW1lKSB7XG4gICAgICB0aGlzLkVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNsYXNzTmFtZSAmJlxuICAgICAgICAgIChbJ3ctZnVsbCcsICd3LXNjcmVlbicsICdoLWZ1bGwnLCAnaC1zY3JlZW4nLCAnc2hyaW5rLTAnXS5pbmNsdWRlcyhjbGFzc05hbWUpIHx8IGNsYXNzTmFtZS5pbmNsdWRlcygnbWluLWgtJykgfHwgY2xhc3NOYW1lLmluY2x1ZGVzKCdtaW4tdy0nKSB8fCAvXighPykoaHx3KS1cXFtbMC05XStweFxcXSQvLnRlc3QoY2xhc3NOYW1lKSkgJiZcbiAgICAgICAgICAhdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghdGhpcy5FbGVtZW50LmNsYXNzTmFtZS5pbmNsdWRlcygnbWluLWgtJykpIHtcbiAgICAgICAgdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWluLWgtMCcpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLkVsZW1lbnQuY2xhc3NOYW1lLmluY2x1ZGVzKCdtaW4tdy0nKSkge1xuICAgICAgICB0aGlzLmRpdkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtaW4tdy0wJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuRWxlbWVudC5jbGFzc05hbWUuaW5jbHVkZXMoJ2xpYi11aS1zY3JvbGwtb3ZlcmxheS1lbGVtZW50JykpIHtcbiAgICAgICAgdGhpcy5FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpYi11aS1zY3JvbGwtb3ZlcmxheS1lbGVtZW50Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWItdWktc2Nyb2xsLW92ZXJsYXktY29udGFpbmVyJykpIHtcbiAgICAgIHRoaXMuZGl2Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2xpYi11aS1zY3JvbGwtb3ZlcmxheS1jb250YWluZXInKTtcbiAgICB9XG4gICAgdGhpcy5kaXZDb250YWluZXIuYXBwZW5kQ2hpbGQodHJhY2tFbCk7XG5cbiAgICBpZiAoIXRoaXMuZGl2Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uKSB7XG4gICAgICB0aGlzLkVsZW1lbnQucGFyZW50RWxlbWVudD8uaW5zZXJ0QmVmb3JlKHRoaXMuZGl2Q29udGFpbmVyLCB0aGlzLkVsZW1lbnQpO1xuICAgICAgdGhpcy5kaXZDb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIH1cbiAgICB0aGlzLmRpdkNvbnRhaW5lci5hcHBlbmQodGhpcy5FbGVtZW50KTtcbiAgICB0aGlzLnVwZGF0ZVNjcm9sbGJhclNpemUoc2Nyb2xsRGlyZWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYmluZEV2ZW50c1Njcm9sbEJhcihzY3JvbGxEaXJlY3Rpb246IFRZUEVfU0NST0xMX0RJUkVDVElPTiwgdHJhY2tFbDogSFRNTEVsZW1lbnQpIHtcbiAgICBsZXQgc2Nyb2xsTGVmdCA9IHRoaXMuRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIGxldCBzY3JvbGxUb3AgPSB0aGlzLkVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHN1YnM6IFN1YnNjcmlwdGlvbiA9IGZyb21FdmVudDxFdmVudD4odGhpcy5FbGVtZW50LCAnc2Nyb2xsJylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5FbGVtZW50O1xuXG4gICAgICAgICAgdGhpcy5vdXRTY3JvbGwuZW1pdChldmVudCk7XG4gICAgICAgICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LnNjcm9sbExlZnQgJiYgdGFyZ2V0LnNjcm9sbExlZnQgKyB0YXJnZXQub2Zmc2V0V2lkdGggPj0gdGFyZ2V0LnNjcm9sbFdpZHRoKSB7XG4gICAgICAgICAgICAgIHRhcmdldC5zY3JvbGxMZWZ0ID0gdGFyZ2V0LnNjcm9sbFdpZHRoIC0gdGFyZ2V0Lm9mZnNldFdpZHRoIC0gKHRhcmdldC5vZmZzZXRXaWR0aCAtIHRhcmdldC5jbGllbnRXaWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsTGVmdCkge1xuICAgICAgICAgICAgICB0aGlzLm91dFNjcm9sbFguZW1pdChldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY3JvbGxMZWZ0ID0gdGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbGJhclBvc2l0aW9uKHNjcm9sbERpcmVjdGlvbik7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGFyZ2V0LnNjcm9sbFRvcCA9PT0gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsYmFyUG9zaXRpb24oc2Nyb2xsRGlyZWN0aW9uKTtcbiAgICAgICAgICBzY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsVG9wO1xuICAgICAgICAgIHRoaXMub3V0U2Nyb2xsWS5lbWl0KGV2ZW50KTtcblxuICAgICAgICAgIGlmICh0YXJnZXQuc2Nyb2xsVG9wID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRTY3JvbGxUb3AuZW1pdChldmVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRhcmdldC5zY3JvbGxIZWlnaHQgPD0gdGFyZ2V0LnNjcm9sbFRvcCArIHRhcmdldC5vZmZzZXRIZWlnaHQgKyAzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRTY3JvbGxCb3R0b20uZW1pdChldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHN1YnMuYWRkKFxuICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAncmVzaXplJylcbiAgICAgICAgLnBpcGUodGFwKHRoaXMudXBkYXRlU2Nyb2xsYmFyU2l6ZS5iaW5kKHRoaXMsIHNjcm9sbERpcmVjdGlvbikpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcblxuICAgIGNvbnN0IG1vdXNlTGVhdmUgPSBmcm9tRXZlbnQodGhpcy5kaXZDb250YWluZXIsICdtb3VzZWxlYXZlJyk7XG4gICAgY29uc3QgbW91c2VlbnRlciA9IGZyb21FdmVudCh0aGlzLmRpdkNvbnRhaW5lciwgJ21vdXNlZW50ZXInKTtcblxuICAgIHN1YnMuYWRkKFxuICAgICAgbW91c2VlbnRlclxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJyAmJiAhdGhpcy5vcHRpb25zKCk/LnNjcm9sbFhPcGFjaXR5MCkgfHwgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1knICYmICF0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsWU9wYWNpdHkwKSkge1xuICAgICAgICAgICAgICB0cmFja0VsLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgICAgICAgIHRyYWNrRWwuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsYmFyU2l6ZShzY3JvbGxEaXJlY3Rpb24pO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiBpbnRlcnZhbCgxMDAwKS5waXBlKHRha2VVbnRpbChtb3VzZUxlYXZlKSkpLFxuICAgICAgICAgIHRhcCh0aGlzLnVwZGF0ZVNjcm9sbGJhclNpemUuYmluZCh0aGlzLCBzY3JvbGxEaXJlY3Rpb24pKSxcbiAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgICBzdWJzLmFkZChcbiAgICAgIG1vdXNlTGVhdmVcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmtlZXBEaXNwbGF5VGh1bWIoKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFja0VsLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIHRyYWNrRWwuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcpIHtcbiAgICAgIHRoaXMuc3Vic1ggPSBzdWJzO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1knKSB7XG4gICAgICB0aGlzLnN1YnNZID0gc3VicztcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tUcmFjayhzY3JvbGxEaXJlY3Rpb246IFRZUEVfU0NST0xMX0RJUkVDVElPTikge1xuICAgIGNvbnN0IGVsZW1lbnRUcmFjayA9IHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnID8gdGhpcy50cmFja1ggOiB0aGlzLnRyYWNrWTtcbiAgICBjb25zdCBlbGVtZW50VGh1bWIgPSBzY3JvbGxEaXJlY3Rpb24gPT09ICdYJyA/IHRoaXMudGh1bWJYIDogdGhpcy50aHVtYlk7XG4gICAgY29uc3Qgc3VicyA9IHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnID8gdGhpcy5zdWJzWCA6IHRoaXMuc3Vic1k7XG5cbiAgICBzdWJzLmFkZChcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50PihlbGVtZW50VHJhY2ssICdjbGljaycpLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Njcm9sbFRodW1iKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJyAmJiBlLmNsaWVudFggPCBlbGVtZW50VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCkgfHwgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1knICYmIGUuY2xpZW50WSA8IGVsZW1lbnRUaHVtYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxQb3NpdGlvbkJ5VXNlckFjdGlvbihzY3JvbGxEaXJlY3Rpb24sIGUsICdzbW9vdGgnLCAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFBvc2l0aW9uQnlVc2VyQWN0aW9uKHNjcm9sbERpcmVjdGlvbiwgZSwgJ3Ntb290aCcsIC0xICogZWxlbWVudFRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxQb3NpdGlvbkJ5VXNlckFjdGlvbihzY3JvbGxEaXJlY3Rpb24sIGUsICdzbW9vdGgnLCAtMSAqIGVsZW1lbnRUaHVtYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEcmFnQW5kRHJvcFRodW1iKHNjcm9sbERpcmVjdGlvbjogVFlQRV9TQ1JPTExfRElSRUNUSU9OKSB7XG4gICAgY29uc3QgZWxlbWVudFRyYWNrID0gc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcgPyB0aGlzLnRyYWNrWCA6IHRoaXMudHJhY2tZO1xuICAgIGNvbnN0IGVsZW1lbnRUaHVtYiA9IHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnID8gdGhpcy50aHVtYlggOiB0aGlzLnRodW1iWTtcbiAgICBjb25zdCBzdWJzID0gc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcgPyB0aGlzLnN1YnNYIDogdGhpcy5zdWJzWTtcbiAgICBsZXQgbGVuZ3RoVGh1bWJUb1BvaW50Q2xpY2sgPSAwO1xuXG4gICAgc3Vicy5hZGQoXG4gICAgICBnZXREcmFnRXZlbnRCeUVsZW1lbnQoe1xuICAgICAgICBlbGVtZW50TW91c2VEb3duOiBlbGVtZW50VGh1bWIsXG4gICAgICAgIGZ1bmN0aW9uTW91c2VEb3duOiAobW91c2VFdmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTY3JvbGxUaHVtYi5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5rZWVwRGlzcGxheVRodW1iLnNldCh0cnVlKTtcbiAgICAgICAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcpIHtcbiAgICAgICAgICAgIGxlbmd0aFRodW1iVG9Qb2ludENsaWNrID0gZWxlbWVudFRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBtb3VzZUV2ZW50LmNsaWVudFg7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbmd0aFRodW1iVG9Qb2ludENsaWNrID0gZWxlbWVudFRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIG1vdXNlRXZlbnQuY2xpZW50WTtcbiAgICAgICAgfSxcbiAgICAgICAgZnVuY3Rpb25Nb3VzZVVwOiAobW91c2VFdmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMua2VlcERpc3BsYXlUaHVtYi5zZXQoZmFsc2UpO1xuICAgICAgICAgIGxlbmd0aFRodW1iVG9Qb2ludENsaWNrID0gMDtcbiAgICAgICAgICBpZiAoIWNoZWNrTW91c2VPdmVySW5Db250YWluZXIobW91c2VFdmVudCwgdGhpcy5FbGVtZW50KSkge1xuICAgICAgICAgICAgZWxlbWVudFRyYWNrLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIGVsZW1lbnRUcmFjay5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxUaHVtYi5zZXQoZmFsc2UpO1xuICAgICAgICAgIH0sIDI1MCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc3Ryb3lSZWY6IHRoaXMuZGVzdHJveVJlZixcbiAgICAgIH0pLnN1YnNjcmliZSgobW91c2VFdmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFBvc2l0aW9uQnlVc2VyQWN0aW9uKHNjcm9sbERpcmVjdGlvbiwgbW91c2VFdmVudCwgJ2F1dG8nLCBsZW5ndGhUaHVtYlRvUG9pbnRDbGljayk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNjcm9sbFBvc2l0aW9uQnlVc2VyQWN0aW9uKHNjcm9sbERpcmVjdGlvbjogVFlQRV9TQ1JPTExfRElSRUNUSU9OLCBlOiBNb3VzZUV2ZW50LCBiZWhhdmlvcjogJ2F1dG8nIHwgJ3Ntb290aCcsIGxlbmd0aFRodW1iVG9Qb2ludENsaWNrID0gMCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnKSB7XG4gICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9ICh0aGlzLmVsZW1lbnRDaGVja1Njcm9sbFgoKSB8fCB0aGlzLkVsZW1lbnQpLnNjcm9sbFdpZHRoO1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IGUuY2xpZW50WCAtIHRoaXMuRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgbGVuZ3RoVGh1bWJUb1BvaW50Q2xpY2s7XG4gICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gKHRodW1iUG9zaXRpb24gLyAoY29udGFpbmVyV2lkdGggLSB0aGlzLnRodW1iWC5vZmZzZXRXaWR0aCkpICogKGNvbnRlbnRXaWR0aCAtIGNvbnRhaW5lcldpZHRoKTtcblxuICAgICAgdGhpcy5FbGVtZW50LnNjcm9sbCh7IGxlZnQ6IHNjcm9sbExlZnQsIGJlaGF2aW9yIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB0aGlzLkVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSAodGhpcy5lbGVtZW50Q2hlY2tTY3JvbGxZKCkgfHwgdGhpcy5FbGVtZW50KS5zY3JvbGxIZWlnaHQ7XG4gICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IGUuY2xpZW50WSAtIHRoaXMuRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBsZW5ndGhUaHVtYlRvUG9pbnRDbGljaztcbiAgICBjb25zdCBzY3JvbGxUb3AgPSAodGh1bWJQb3NpdGlvbiAvIChjb250YWluZXJIZWlnaHQgLSB0aGlzLnRodW1iWS5vZmZzZXRIZWlnaHQpKSAqIChjb250ZW50SGVpZ2h0IC0gY29udGFpbmVySGVpZ2h0KTtcblxuICAgIHRoaXMuRWxlbWVudC5zY3JvbGwoeyB0b3A6IHNjcm9sbFRvcCwgYmVoYXZpb3IgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNjcm9sbGJhclNpemUoc2Nyb2xsRGlyZWN0aW9uOiBUWVBFX1NDUk9MTF9ESVJFQ1RJT04pIHtcbiAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5FbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgY29uc3QgY29udGVudFdpZHRoID0gKHRoaXMuZWxlbWVudENoZWNrU2Nyb2xsWCgpIHx8IHRoaXMuRWxlbWVudCkuc2Nyb2xsV2lkdGg7XG4gICAgICBjb25zdCB0aHVtYldpZHRoID0gKGNvbnRhaW5lcldpZHRoIC8gY29udGVudFdpZHRoKSAqIGNvbnRhaW5lcldpZHRoO1xuXG4gICAgICB0aGlzLnRodW1iWC5zdHlsZS53aWR0aCA9IGAke01hdGgubWF4KDIwLCB0aHVtYldpZHRoKX1weGA7XG4gICAgICB0aGlzLnRyYWNrWC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgaWYgKGNvbnRlbnRXaWR0aCA+IGNvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgIHRoaXMudHJhY2tYLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVTY3JvbGxiYXJQb3NpdGlvbihzY3JvbGxEaXJlY3Rpb24pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gdGhpcy5FbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gKHRoaXMuZWxlbWVudENoZWNrU2Nyb2xsWSgpIHx8IHRoaXMuRWxlbWVudCkuc2Nyb2xsSGVpZ2h0O1xuICAgIGNvbnN0IHRodW1iSGVpZ2h0ID0gKGNvbnRhaW5lckhlaWdodCAvIGNvbnRlbnRIZWlnaHQpICogY29udGFpbmVySGVpZ2h0O1xuXG4gICAgdGhpcy50aHVtYlkuc3R5bGUuaGVpZ2h0ID0gYCR7TWF0aC5tYXgoMjAsIHRodW1iSGVpZ2h0KX1weGA7XG4gICAgdGhpcy50cmFja1kuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAoY29udGVudEhlaWdodCA+IGNvbnRhaW5lckhlaWdodCkge1xuICAgICAgdGhpcy50cmFja1kuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTY3JvbGxiYXJQb3NpdGlvbignWScpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTY3JvbGxiYXJQb3NpdGlvbihzY3JvbGxEaXJlY3Rpb246IFRZUEVfU0NST0xMX0RJUkVDVElPTikge1xuICAgIGlmIChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJykge1xuICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLkVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICBjb25zdCBjb250ZW50V2lkdGggPSAodGhpcy5lbGVtZW50Q2hlY2tTY3JvbGxYKCkgfHwgdGhpcy5FbGVtZW50KS5zY3JvbGxXaWR0aDtcbiAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSB0aGlzLkVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSAoc2Nyb2xsTGVmdCAvIChjb250ZW50V2lkdGggLSBjb250YWluZXJXaWR0aCkpICogKGNvbnRhaW5lcldpZHRoIC0gdGhpcy50aHVtYlgub2Zmc2V0V2lkdGgpO1xuXG4gICAgICB0aGlzLnRodW1iWC5zdHlsZS5sZWZ0ID0gYCR7dGh1bWJQb3NpdGlvbn1weGA7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gdGhpcy5FbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gKHRoaXMuZWxlbWVudENoZWNrU2Nyb2xsWSgpIHx8IHRoaXMuRWxlbWVudCkuc2Nyb2xsSGVpZ2h0O1xuICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMuRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IChzY3JvbGxUb3AgLyAoY29udGVudEhlaWdodCAtIGNvbnRhaW5lckhlaWdodCkpICogKGNvbnRhaW5lckhlaWdodCAtIHRoaXMudGh1bWJZLm9mZnNldEhlaWdodCk7XG5cbiAgICB0aGlzLnRodW1iWS5zdHlsZS50b3AgPSBgJHt0aHVtYlBvc2l0aW9ufXB4YDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGl2Q29udGFpbmVyLnJlbW92ZSgpO1xuICAgIHRoaXMuc3Vic1gudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnN1YnNZLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==
452
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLW92ZXJsYXkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3Njcm9sbC1vdmVybGF5L3NyYy9zY3JvbGwtb3ZlcmxheS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekksT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUdwRixNQUFNLFlBQVksR0FBRyxrQ0FBa0MsQ0FBQztBQUN4RCxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFDakMsTUFBTSw2QkFBNkIsR0FBRyxXQUFXLENBQUM7QUFDbEQsTUFBTSwwQkFBMEIsR0FBRyxTQUFTLENBQUM7QUFDN0MsTUFBTSxnQ0FBZ0MsR0FBRyxTQUFTLENBQUM7QUFFbkQ7OztHQUdHO0FBQ0gsTUFBTSxhQUFhLEdBQUc7Ozs7OzREQUtzQyw2QkFBNkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0RBeUJuQywwQkFBMEI7Ozs0REFHcEIsZ0NBQWdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0IzRixDQUFDO0FBRUYsTUFBTSxjQUFj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QUFpQixHQUFHLGFBQWEsR0FBRyxlQUFlLENBQUM7UUFDMUQsSUFBSSxpQkFBaUIsSUFBSSxDQUFDO1lBQUUsT0FBTztRQUNuQyxNQUFNLGdCQUFnQixHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUNwRSxNQUFNLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsZ0JBQWdCLENBQUM7UUFDdEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsYUFBYSxJQUFJLENBQUM7SUFDL0MsQ0FBQzt3R0FyWlUsc0NBQXNDOzRGQUF0QyxzQ0FBc0M7OzRGQUF0QyxzQ0FBc0M7a0JBTGxELFNBQVM7bUJBQUM7b0JBQ1QsOERBQThEO29CQUM5RCxRQUFRLEVBQUUsMENBQTBDO29CQUNwRCxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXN0cm95UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lciwgZ2V0RHJhZ0V2ZW50QnlFbGVtZW50IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBmcm9tRXZlbnQsIGludGVydmFsLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJU2Nyb2xsT3ZlcmxheU9wdGlvbnMsIFRZUEVfU0NST0xMX0RJUkVDVElPTiB9IGZyb20gJy4vc2Nyb2xsLmludGVyZmFjZSc7XG5cbmNvbnN0IFNUWUxFX1RBR19JRCA9ICdsaWJzLXVpLXNjcm9sbC1vdmVybGF5LXN0eWxlLXRhZyc7XG5jb25zdCBTQ1JPTExfQk9UVE9NX1RPTEVSQU5DRSA9IDM7XG5jb25zdCBNSU5fVEhVTUJfU0laRSA9IDIwO1xuY29uc3QgTU9VU0VfVVBfUkVTRVRfREVMQVkgPSAyNTA7XG5jb25zdCBERUZBVUxUX1NDUk9MTEJBUl9IT1ZFUl9DT0xPUiA9ICcjQ0REMEQ2NDAnO1xuY29uc3QgREVGQVVMVF9TQ1JPTExfVEhVTUJfQ09MT1IgPSAnI0NERDBENic7XG5jb25zdCBERUZBVUxUX1NDUk9MTF9USFVNQl9IT1ZFUl9DT0xPUiA9ICcjOUNBMkFEJztcblxuLyoqXG4gKiBDU1MgY2hpYSBz4bq7IGNobyBt4buNaSBpbnN0YW5jZS4gTcOgdS9wYWRkaW5nIGzhuqV5IHF1YSBDU1MgdmFyaWFibGVzIMSR4buDIG3hu5dpXG4gKiBkaXJlY3RpdmUgaW5zdGFuY2UgY8OzIHRo4buDIGN1c3RvbSDEkeG7mWMgbOG6rXAgbcOgIGtow7RuZyBwaOG6o2kgcmUtd3JpdGUgc3R5bGUgdGFnLlxuICovXG5jb25zdCBTVFlMRV9DT05URU5UID0gYFxuICAubGlicy11aS1zY3JvbGwtb3ZlcmxheS1jb250YWluZXIgLnNjcm9sbGJhci10cmFjayB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlicy11aS1zYi10cmFjay1jb2xvciwgdHJhbnNwYXJlbnQpO1xuICB9XG4gIC5saWJzLXVpLXNjcm9sbC1vdmVybGF5LWNvbnRhaW5lciAuc2Nyb2xsYmFyLXRyYWNrOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saWJzLXVpLXNiLXRyYWNrLWhvdmVyLWNvbG9yLCAke0RFRkFVTFRfU0NST0xMQkFSX0hPVkVSX0NPTE9SfSk7XG4gIH1cbiAgLmxpYnMtdWktc2Nyb2xsLW92ZXJsYXktY29udGFpbmVyIC5zY3JvbGxiYXItdHJhY2stWCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgb3BhY2l0eTogMDtcbiAgICB6LWluZGV4OiAxO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlLCB2aXNpYmlsaXR5IDAuM3MgZWFzZTtcbiAgfVxuICAubGlicy11aS1zY3JvbGwtb3ZlcmxheS1jb250YWluZXIgLnNjcm9sbGJhci10cmFjay1ZIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgei1pbmRleDogMTtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZSwgdmlzaWJpbGl0eSAwLjNzIGVhc2U7XG4gIH1cbiAgLmxpYnMtdWktc2Nyb2xsLW92ZXJsYXktY29udGFpbmVyIC5zY3JvbGxiYXItdGh1bWIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpYnMtdWktc2ItdGh1bWItY29sb3IsICR7REVGQVVMVF9TQ1JPTExfVEhVTUJfQ09MT1J9KTtcbiAgfVxuICAubGlicy11aS1zY3JvbGwtb3ZlcmxheS1jb250YWluZXIgLnNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlicy11aS1zYi10aHVtYi1ob3Zlci1jb2xvciwgJHtERUZBVUxUX1NDUk9MTF9USFVNQl9IT1ZFUl9DT0xPUn0pO1xuICB9XG4gIC5saWJzLXVpLXNjcm9sbC1vdmVybGF5LWNvbnRhaW5lciAuc2Nyb2xsYmFyLXRodW1iLVgge1xuICAgIGhlaWdodDogY2FsYygxMDAlIC0gdmFyKC0tbGlicy11aS1zYi1wYWRkaW5nLWRvdWJsZSwgNHB4KSk7XG4gICAgYm90dG9tOiB2YXIoLS1saWJzLXVpLXNiLXBhZGRpbmcsIDJweCk7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGN1cnNvcjogZ3JhYmJpbmc7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgfVxuICAubGlicy11aS1zY3JvbGwtb3ZlcmxheS1jb250YWluZXIgLnNjcm9sbGJhci10aHVtYi1ZIHtcbiAgICB3aWR0aDogY2FsYygxMDAlIC0gdmFyKC0tbGlicy11aS1zYi1wYWRkaW5nLWRvdWJsZSwgNHB4KSk7XG4gICAgcmlnaHQ6IHZhcigtLWxpYnMtdWktc2ItcGFkZGluZywgMnB4KTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgY3Vyc29yOiBncmFiYmluZztcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3M7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICB9XG4gIC5saWJzLXVpLXNjcm9sbC1vdmVybGF5LWNvbnRhaW5lciAubGlicy11aS1zY3JvbGwtb3ZlcmxheS1lbGVtZW50Ojotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgd2lkdGg6IDAgIWltcG9ydGFudDtcbiAgICBoZWlnaHQ6IDAgIWltcG9ydGFudDtcbiAgfVxuYDtcblxuY29uc3QgZW5zdXJlU3R5bGVUYWcgPSAoKSA9PiB7XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChTVFlMRV9UQUdfSUQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZUVsLmlkID0gU1RZTEVfVEFHX0lEO1xuICBzdHlsZUVsLnRleHRDb250ZW50ID0gU1RZTEVfQ09OVEVOVDtcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoc3R5bGVFbCk7XG59O1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTY3JvbGxUaHVtYiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkga2VlcERpc3BsYXlUaHVtYiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgc3Vic1ggPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgc3Vic1kgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBUaW1lciByZXNldCBpc1Njcm9sbFRodW1iIHNhdSBkcmFnIGVuZCDigJQgcGjhuqNpIGNsZWFyIGtoaSBkZXN0cm95IMSR4buDIHRyw6FuaCBzZXQgc2lnbmFsIHRyw6puIGluc3RhbmNlIMSRw6MgdGVhcmRvd24uICovXG4gIHByaXZhdGUgbW91c2VVcFRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIC8qKiByQUYgdGhyb3R0bGUgY2hvIHNjcm9sbCBoYW5kbGVyIOKAlCBnb20gbXVsdGlwbGUgc2Nyb2xsIGV2ZW50cyB24buBIDEgbOG6p24gdXBkYXRlIERPTSBt4buXaSBmcmFtZS4gKi9cbiAgcHJpdmF0ZSBzY3JvbGxSYWZYPzogbnVtYmVyO1xuICBwcml2YXRlIHNjcm9sbFJhZlk/OiBudW1iZXI7XG4gIC8qKiBDYWNoZSBkaW1lbnNpb25zIOKAlCBza2lwIERPTSB3cml0ZSBu4bq/dSBrw61jaCB0aMaw4bubYyBraMO0bmcgxJHhu5VpIGdp4buvYSAyIGzhuqduIHBvbGwuICovXG4gIHByaXZhdGUgbGFzdENvbnRlbnRXaWR0aCA9IDA7XG4gIHByaXZhdGUgbGFzdENvbnRlbnRIZWlnaHQgPSAwO1xuICBwcml2YXRlIGxhc3RDb250YWluZXJXaWR0aCA9IDA7XG4gIHByaXZhdGUgbGFzdENvbnRhaW5lckhlaWdodCA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGxiYXJXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3B0aW9ucygpPy5zY3JvbGxiYXJXaWR0aCA/PyAxMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Nyb2xsYmFyUGFkZGluZyA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3B0aW9ucygpPy5zY3JvbGxiYXJQYWRkaW5nID8/IDIpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcm9sbGJhckNvbG9yID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCk/LnNjcm9sbGJhckNvbG9yID8/ICcnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGxiYXJIb3ZlckNvbG9yID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCk/LnNjcm9sbGJhckhvdmVyQ29sb3IgPz8gREVGQVVMVF9TQ1JPTExCQVJfSE9WRVJfQ09MT1IpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcm9sbFRodW1iQ29sb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsVGh1bWJDb2xvciA/PyBERUZBVUxUX1NDUk9MTF9USFVNQl9DT0xPUik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Nyb2xsVGh1bWJIb3ZlckNvbG9yID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCk/LnNjcm9sbFRodW1iSG92ZXJDb2xvciA/PyBERUZBVUxUX1NDUk9MTF9USFVNQl9IT1ZFUl9DT0xPUik7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkaXZDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFja1g6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGh1bWJYOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWNrWTogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0aHVtYlk6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSBkZWJ1Z01vZGUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGlnbm9yZUluaXQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGNsYXNzQ29udGFpbmVyID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgb3B0aW9ucyA9IGlucHV0PElTY3JvbGxPdmVybGF5T3B0aW9ucyB8IHVuZGVmaW5lZD4oe30pO1xuICByZWFkb25seSBlbGVtZW50Q2hlY2tTY3JvbGxYID0gaW5wdXQ8SFRNTEVsZW1lbnQ+KCk7XG4gIHJlYWRvbmx5IGVsZW1lbnRDaGVja1Njcm9sbFkgPSBpbnB1dDxIVE1MRWxlbWVudD4oKTtcbiAgcmVhZG9ubHkgZWxlbWVudFNjcm9sbCA9IGlucHV0PEhUTUxFbGVtZW50PigpO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dFNjcm9sbCA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U2Nyb2xsWCA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U2Nyb2xsWSA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U2Nyb2xsVG9wID0gb3V0cHV0PEV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxCb3R0b20gPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgLy8gI3JlZ2lvbiBJTkpFQ1RcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcjIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFNldHVwIHNjcm9sbGJhcnMga2hpIG9wdGlvbnMvY2xhc3NDb250YWluZXIgxJHhu5VpLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pZ25vcmVJbml0KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgY29uc3QgY2xhc3NDb250YWluZXIgPSB0aGlzLmNsYXNzQ29udGFpbmVyKCk7XG5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3luY0NvbnRhaW5lckV4dHJhQ2xhc3NlcyhjbGFzc0NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCdvdmVyZmxvdy1oaWRkZW4nLCBvcHRpb25zPy5zY3JvbGxYID09PSAnaGlkZGVuJyAmJiBvcHRpb25zPy5zY3JvbGxZID09PSAnaGlkZGVuJyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnNjcm9sbFggIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgdGhpcy5zdWJzWC51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMuc3Vic1ggPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgdGhpcy50cmFja1guY2xhc3NOYW1lID0gJyc7XG4gICAgICAgICAgdGhpcy50aHVtYlguY2xhc3NOYW1lID0gJyc7XG4gICAgICAgICAgdGhpcy50cmFja1guc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5zY3JvbGxiYXJXaWR0aCgpfXB4YDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNjcm9sbGJhcignWCcsIHRoaXMudHJhY2tYLCB0aGlzLnRodW1iWCk7XG4gICAgICAgICAgdGhpcy5iaW5kRXZlbnRzU2Nyb2xsQmFyKCdYJywgdGhpcy50cmFja1gsIHRoaXMuc3Vic1gpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlckRyYWdBbmREcm9wVGh1bWIoJ1gnLCB0aGlzLnN1YnNYKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJDbGlja1RyYWNrKCdYJywgdGhpcy5zdWJzWCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc2Nyb2xsWSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICB0aGlzLnN1YnNZLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5zdWJzWSA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICB0aGlzLnRyYWNrWS5jbGFzc05hbWUgPSAnJztcbiAgICAgICAgICB0aGlzLnRodW1iWS5jbGFzc05hbWUgPSAnJztcbiAgICAgICAgICB0aGlzLnRyYWNrWS5zdHlsZS53aWR0aCA9IGAke3RoaXMuc2Nyb2xsYmFyV2lkdGgoKX1weGA7XG4gICAgICAgICAgdGhpcy5jcmVhdGVTY3JvbGxiYXIoJ1knLCB0aGlzLnRyYWNrWSwgdGhpcy50aHVtYlkpO1xuICAgICAgICAgIHRoaXMuYmluZEV2ZW50c1Njcm9sbEJhcignWScsIHRoaXMudHJhY2tZLCB0aGlzLnN1YnNZKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJEcmFnQW5kRHJvcFRodW1iKCdZJywgdGhpcy5zdWJzWSk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVyQ2xpY2tUcmFjaygnWScsIHRoaXMuc3Vic1kpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFN5bmMgQ1NTIHZhcmlhYmxlcyBwZXItaW5zdGFuY2Ug4oCUIGtow7RuZyDEkeG7pW5nIHN0eWxlIHRhZyBjaGlhIHPhursgZ2nhu69hIGPDoWMgaW5zdGFuY2UuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHNiQ29sb3IgPSB0aGlzLnNjcm9sbGJhckNvbG9yKCk7XG4gICAgICBjb25zdCBzYkhvdmVyID0gdGhpcy5zY3JvbGxiYXJIb3ZlckNvbG9yKCk7XG4gICAgICBjb25zdCB0aENvbG9yID0gdGhpcy5zY3JvbGxUaHVtYkNvbG9yKCk7XG4gICAgICBjb25zdCB0aEhvdmVyID0gdGhpcy5zY3JvbGxUaHVtYkhvdmVyQ29sb3IoKTtcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLnNjcm9sbGJhclBhZGRpbmcoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpdlN0eWxlID0gdGhpcy5kaXZDb250YWluZXIuc3R5bGU7XG4gICAgICAgIGRpdlN0eWxlLnNldFByb3BlcnR5KCctLWxpYnMtdWktc2ItdHJhY2stY29sb3InLCBzYkNvbG9yKTtcbiAgICAgICAgZGl2U3R5bGUuc2V0UHJvcGVydHkoJy0tbGlicy11aS1zYi10cmFjay1ob3Zlci1jb2xvcicsIHNiSG92ZXIpO1xuICAgICAgICBkaXZTdHlsZS5zZXRQcm9wZXJ0eSgnLS1saWJzLXVpLXNiLXRodW1iLWNvbG9yJywgdGhDb2xvcik7XG4gICAgICAgIGRpdlN0eWxlLnNldFByb3BlcnR5KCctLWxpYnMtdWktc2ItdGh1bWItaG92ZXItY29sb3InLCB0aEhvdmVyKTtcbiAgICAgICAgZGl2U3R5bGUuc2V0UHJvcGVydHkoJy0tbGlicy11aS1zYi1wYWRkaW5nJywgYCR7cGFkZGluZ31weGApO1xuICAgICAgICBkaXZTdHlsZS5zZXRQcm9wZXJ0eSgnLS1saWJzLXVpLXNiLXBhZGRpbmctZG91YmxlJywgYCR7cGFkZGluZyAqIDJ9cHhgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gV2luZG93IHJlc2l6ZSDihpIgcmUtbWVhc3VyZSB0aHVtYiBzaXplIGNobyBj4bqjIDIgdHLhu6VjLlxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxiYXJTaXplKCdYJyk7XG4gICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsYmFyU2l6ZSgnWScpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1vdXNlVXBUaW1lcik7XG4gICAgICBpZiAodGhpcy5zY3JvbGxSYWZYKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjcm9sbFJhZlgpO1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsUmFmWSkgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5zY3JvbGxSYWZZKTtcbiAgICAgIHRoaXMuZGl2Q29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdWJzWC51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5zdWJzWS51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBGVU5DVElPTlNcbiAgcHJpdmF0ZSBnZXQgRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFNjcm9sbCgpIHx8IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgLyoqIFRow6ptIGPDoWMgY2xhc3MgY29uc3VtZXIgdHJ1eeG7gW4gcXVhIFtjbGFzc0NvbnRhaW5lcl0gbcOgIGtow7RuZyB4w7NhIGNsYXNzIGjhu4cgdGjhu5FuZyDEkcOjIHNldC4gKi9cbiAgcHJpdmF0ZSBzeW5jQ29udGFpbmVyRXh0cmFDbGFzc2VzKGNsYXNzU3RyOiBzdHJpbmcpIHtcbiAgICBjbGFzc1N0clxuICAgICAgLnNwbGl0KCcgJylcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5mb3JFYWNoKChjbGFzc05hbWUpID0+IHRoaXMuZGl2Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNjcm9sbGJhcihzY3JvbGxEaXJlY3Rpb246IFRZUEVfU0NST0xMX0RJUkVDVElPTiwgdHJhY2tFbDogSFRNTEVsZW1lbnQsIHRodW1iRWw6IEhUTUxFbGVtZW50KSB7XG4gICAgZW5zdXJlU3R5bGVUYWcoKTtcblxuICAgIGNvbnN0IHN0eWxlc1Byb3BlcnR5ID0ge1xuICAgICAgJ2JveC1zaXppbmcnOiAnYm9yZGVyLWJveCcsXG4gICAgICAnc2Nyb2xsYmFyLXdpZHRoJzogJ25vbmUnLFxuICAgICAgJ3Njcm9sbGJhci1jb2xvcic6IHRoaXMub3B0aW9ucygpPy5pZ25vcmVUcmFuc3BhcmVudFNjcm9sbEJhckNvbG9yRGVmYXVsdCA/ICdhdXRvJyA6ICd0cmFuc3BhcmVudCB0cmFuc3BhcmVudCcsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAnb3ZlcmZsb3cteCc6IGAke3RoaXMub3B0aW9ucygpPy5zY3JvbGxYIHx8ICdzY3JvbGwnfWAsXG4gICAgICAnb3ZlcmZsb3cteSc6IGAke3RoaXMub3B0aW9ucygpPy5zY3JvbGxZIHx8ICdzY3JvbGwnfWAsXG4gICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIE9iamVjdC5rZXlzKHN0eWxlc1Byb3BlcnR5KS5mb3JFYWNoKChrZXkpID0+IHRoaXMucmVuZGVyMi5zZXRTdHlsZSh0aGlzLkVsZW1lbnQsIGtleSwgc3R5bGVzUHJvcGVydHlba2V5XSwgMSkpO1xuXG4gICAgdHJhY2tFbC5jbGFzc0xpc3QuYWRkKCdzY3JvbGxiYXItdHJhY2snKTtcbiAgICB0cmFja0VsLmNsYXNzTGlzdC5hZGQoYHNjcm9sbGJhci10cmFjay0ke3Njcm9sbERpcmVjdGlvbn1gKTtcbiAgICB0aHVtYkVsLmNsYXNzTGlzdC5hZGQoJ3Njcm9sbGJhci10aHVtYicpO1xuICAgIHRodW1iRWwuY2xhc3NMaXN0LmFkZChgc2Nyb2xsYmFyLXRodW1iLSR7c2Nyb2xsRGlyZWN0aW9ufWApO1xuICAgIHRyYWNrRWwuYXBwZW5kQ2hpbGQodGh1bWJFbCk7XG5cbiAgICBpZiAodGhpcy5FbGVtZW50LmNsYXNzTmFtZSkge1xuICAgICAgdGhpcy5FbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjbGFzc05hbWUgJiZcbiAgICAgICAgICAoWyd3LWZ1bGwnLCAndy1zY3JlZW4nLCAnaC1mdWxsJywgJ2gtc2NyZWVuJywgJ3Nocmluay0wJ10uaW5jbHVkZXMoY2xhc3NOYW1lKSB8fCBjbGFzc05hbWUuaW5jbHVkZXMoJ21pbi1oLScpIHx8IGNsYXNzTmFtZS5pbmNsdWRlcygnbWluLXctJykgfHwgL14oIT8pW2h3XS1cXFtcXGQrcHhcXF0kLy50ZXN0KGNsYXNzTmFtZSkpICYmXG4gICAgICAgICAgIXRoaXMuZGl2Q29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuZGl2Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIXRoaXMuRWxlbWVudC5jbGFzc05hbWUuaW5jbHVkZXMoJ21pbi1oLScpKSB7XG4gICAgICAgIHRoaXMuZGl2Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21pbi1oLTAnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5FbGVtZW50LmNsYXNzTmFtZS5pbmNsdWRlcygnbWluLXctJykpIHtcbiAgICAgICAgdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWluLXctMCcpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLkVsZW1lbnQuY2xhc3NOYW1lLmluY2x1ZGVzKCdsaWJzLXVpLXNjcm9sbC1vdmVybGF5LWVsZW1lbnQnKSkge1xuICAgICAgICB0aGlzLkVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1zY3JvbGwtb3ZlcmxheS1lbGVtZW50Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLXNjcm9sbC1vdmVybGF5LWNvbnRhaW5lcicpKSB7XG4gICAgICB0aGlzLmRpdkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLXNjcm9sbC1vdmVybGF5LWNvbnRhaW5lcicpO1xuICAgIH1cbiAgICB0aGlzLmRpdkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0cmFja0VsKTtcblxuICAgIGlmICghdGhpcy5kaXZDb250YWluZXIuc3R5bGUucG9zaXRpb24pIHtcbiAgICAgIHRoaXMuRWxlbWVudC5wYXJlbnRFbGVtZW50Py5pbnNlcnRCZWZvcmUodGhpcy5kaXZDb250YWluZXIsIHRoaXMuRWxlbWVudCk7XG4gICAgICB0aGlzLmRpdkNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgfVxuICAgIHRoaXMuZGl2Q29udGFpbmVyLmFwcGVuZCh0aGlzLkVsZW1lbnQpO1xuICAgIHRoaXMudXBkYXRlU2Nyb2xsYmFyU2l6ZShzY3JvbGxEaXJlY3Rpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kRXZlbnRzU2Nyb2xsQmFyKHNjcm9sbERpcmVjdGlvbjogVFlQRV9TQ1JPTExfRElSRUNUSU9OLCB0cmFja0VsOiBIVE1MRWxlbWVudCwgc3ViczogU3Vic2NyaXB0aW9uKSB7XG4gICAgbGV0IHNjcm9sbExlZnQgPSB0aGlzLkVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICBsZXQgc2Nyb2xsVG9wID0gdGhpcy5FbGVtZW50LnNjcm9sbFRvcDtcbiAgICBzdWJzLmFkZChcbiAgICAgIGZyb21FdmVudDxFdmVudD4odGhpcy5FbGVtZW50LCAnc2Nyb2xsJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChldmVudCkgPT5cbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTY3JvbGxIYW5kbGUoc2Nyb2xsRGlyZWN0aW9uLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuRWxlbWVudDtcbiAgICAgICAgICAgICAgdGhpcy5vdXRTY3JvbGwuZW1pdChldmVudCk7XG4gICAgICAgICAgICAgIGlmIChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJykge1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuc2Nyb2xsTGVmdCAmJiB0YXJnZXQuc2Nyb2xsTGVmdCArIHRhcmdldC5vZmZzZXRXaWR0aCA+PSB0YXJnZXQuc2Nyb2xsV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldC5zY3JvbGxMZWZ0ID0gdGFyZ2V0LnNjcm9sbFdpZHRoIC0gdGFyZ2V0Lm9mZnNldFdpZHRoIC0gKHRhcmdldC5vZmZzZXRXaWR0aCAtIHRhcmdldC5jbGllbnRXaWR0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsTGVmdCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5vdXRTY3JvbGxYLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0ID0gdGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxiYXJQb3NpdGlvbihzY3JvbGxEaXJlY3Rpb24pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGFyZ2V0LnNjcm9sbFRvcCA9PT0gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsYmFyUG9zaXRpb24oc2Nyb2xsRGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgdGhpcy5vdXRTY3JvbGxZLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgICBpZiAodGFyZ2V0LnNjcm9sbFRvcCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3V0U2Nyb2xsVG9wLmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGFyZ2V0LnNjcm9sbEhlaWdodCA8PSB0YXJnZXQuc2Nyb2xsVG9wICsgdGFyZ2V0Lm9mZnNldEhlaWdodCArIFNDUk9MTF9CT1RUT01fVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdXRTY3JvbGxCb3R0b20uZW1pdChldmVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgICBjb25zdCBtb3VzZUxlYXZlID0gZnJvbUV2ZW50KHRoaXMuZGl2Q29udGFpbmVyLCAnbW91c2VsZWF2ZScpO1xuICAgIGNvbnN0IG1vdXNlRW50ZXIgPSBmcm9tRXZlbnQodGhpcy5kaXZDb250YWluZXIsICdtb3VzZWVudGVyJyk7XG4gICAgc3Vicy5hZGQoXG4gICAgICBtb3VzZUVudGVyXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnICYmICF0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsWE9wYWNpdHkwKSB8fCAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWScgJiYgIXRoaXMub3B0aW9ucygpPy5zY3JvbGxZT3BhY2l0eTApKSB7XG4gICAgICAgICAgICAgIHRyYWNrRWwuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgICAgICAgdHJhY2tFbC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxiYXJTaXplKHNjcm9sbERpcmVjdGlvbik7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IGludGVydmFsKDEwMDApLnBpcGUodGFrZVVudGlsKG1vdXNlTGVhdmUpKSksXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsYmFyU2l6ZShzY3JvbGxEaXJlY3Rpb24pO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcblxuICAgIHN1YnMuYWRkKFxuICAgICAgbW91c2VMZWF2ZVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMua2VlcERpc3BsYXlUaHVtYigpKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNrRWwuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgdHJhY2tFbC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBUaHJvdHRsZSBzY3JvbGwgaGFuZGxlciB0aGVvIGZyYW1lIOKAlCBnb20gbmhp4buBdSBzY3JvbGwgZXZlbnQgdsOgbyAxIGzhuqduIHVwZGF0ZSBET00uICovXG4gIHByaXZhdGUgc2NoZWR1bGVTY3JvbGxIYW5kbGUoc2Nyb2xsRGlyZWN0aW9uOiBUWVBFX1NDUk9MTF9ESVJFQ1RJT04sIGhhbmRsZTogKCkgPT4gdm9pZCkge1xuICAgIGlmIChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJykge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsUmFmWCkgcmV0dXJuO1xuICAgICAgdGhpcy5zY3JvbGxSYWZYID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5zY3JvbGxSYWZYID0gdW5kZWZpbmVkO1xuICAgICAgICBoYW5kbGUoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zY3JvbGxSYWZZKSByZXR1cm47XG4gICAgdGhpcy5zY3JvbGxSYWZZID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuc2Nyb2xsUmFmWSA9IHVuZGVmaW5lZDtcbiAgICAgIGhhbmRsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja1RyYWNrKHNjcm9sbERpcmVjdGlvbjogVFlQRV9TQ1JPTExfRElSRUNUSU9OLCBzdWJzOiBTdWJzY3JpcHRpb24pIHtcbiAgICBjb25zdCBlbGVtZW50VHJhY2sgPSBzY3JvbGxEaXJlY3Rpb24gPT09ICdYJyA/IHRoaXMudHJhY2tYIDogdGhpcy50cmFja1k7XG4gICAgY29uc3QgZWxlbWVudFRodW1iID0gc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcgPyB0aGlzLnRodW1iWCA6IHRoaXMudGh1bWJZO1xuXG4gICAgc3Vicy5hZGQoXG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZWxlbWVudFRyYWNrLCAnY2xpY2snKVxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsVGh1bWIoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnICYmIGUuY2xpZW50WCA8IGVsZW1lbnRUaHVtYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KSB8fCAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWScgJiYgZS5jbGllbnRZIDwgZWxlbWVudFRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsUG9zaXRpb25CeVVzZXJBY3Rpb24oc2Nyb2xsRGlyZWN0aW9uLCBlLCAnc21vb3RoJywgMCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxQb3NpdGlvbkJ5VXNlckFjdGlvbihzY3JvbGxEaXJlY3Rpb24sIGUsICdzbW9vdGgnLCAtMSAqIGVsZW1lbnRUaHVtYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsUG9zaXRpb25CeVVzZXJBY3Rpb24oc2Nyb2xsRGlyZWN0aW9uLCBlLCAnc21vb3RoJywgLTEgKiBlbGVtZW50VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEcmFnQW5kRHJvcFRodW1iKHNjcm9sbERpcmVjdGlvbjogVFlQRV9TQ1JPTExfRElSRUNUSU9OLCBzdWJzOiBTdWJzY3JpcHRpb24pIHtcbiAgICBjb25zdCBlbGVtZW50VHJhY2sgPSBzY3JvbGxEaXJlY3Rpb24gPT09ICdYJyA/IHRoaXMudHJhY2tYIDogdGhpcy50cmFja1k7XG4gICAgY29uc3QgZWxlbWVudFRodW1iID0gc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcgPyB0aGlzLnRodW1iWCA6IHRoaXMudGh1bWJZO1xuICAgIGxldCBsZW5ndGhUaHVtYlRvUG9pbnRDbGljayA9IDA7XG5cbiAgICBzdWJzLmFkZChcbiAgICAgIGdldERyYWdFdmVudEJ5RWxlbWVudCh7XG4gICAgICAgIGVsZW1lbnRNb3VzZURvd246IGVsZW1lbnRUaHVtYixcbiAgICAgICAgZnVuY3Rpb25Nb3VzZURvd246IChtb3VzZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1Njcm9sbFRodW1iLnNldCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmtlZXBEaXNwbGF5VGh1bWIuc2V0KHRydWUpO1xuICAgICAgICAgIGlmIChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJykge1xuICAgICAgICAgICAgbGVuZ3RoVGh1bWJUb1BvaW50Q2xpY2sgPSBlbGVtZW50VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIG1vdXNlRXZlbnQuY2xpZW50WDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuZ3RoVGh1bWJUb1BvaW50Q2xpY2sgPSBlbGVtZW50VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gbW91c2VFdmVudC5jbGllbnRZO1xuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbk1vdXNlVXA6IChtb3VzZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5rZWVwRGlzcGxheVRodW1iLnNldChmYWxzZSk7XG4gICAgICAgICAgbGVuZ3RoVGh1bWJUb1BvaW50Q2xpY2sgPSAwO1xuICAgICAgICAgIGlmICghY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihtb3VzZUV2ZW50LCB0aGlzLkVsZW1lbnQpKSB7XG4gICAgICAgICAgICBlbGVtZW50VHJhY2suc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgZWxlbWVudFRyYWNrLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1vdXNlVXBUaW1lcik7XG4gICAgICAgICAgdGhpcy5tb3VzZVVwVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxUaHVtYi5zZXQoZmFsc2UpO1xuICAgICAgICAgIH0sIE1PVVNFX1VQX1JFU0VUX0RFTEFZKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzdHJveVJlZjogdGhpcy5kZXN0cm95UmVmLFxuICAgICAgfSkuc3Vic2NyaWJlKChtb3VzZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsUG9zaXRpb25CeVVzZXJBY3Rpb24oc2Nyb2xsRGlyZWN0aW9uLCBtb3VzZUV2ZW50LCAnYXV0bycsIGxlbmd0aFRodW1iVG9Qb2ludENsaWNrKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2Nyb2xsUG9zaXRpb25CeVVzZXJBY3Rpb24oc2Nyb2xsRGlyZWN0aW9uOiBUWVBFX1NDUk9MTF9ESVJFQ1RJT04sIGU6IE1vdXNlRXZlbnQsIGJlaGF2aW9yOiAnYXV0bycgfCAnc21vb3RoJywgbGVuZ3RoVGh1bWJUb1BvaW50Q2xpY2sgPSAwKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5FbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgY29uc3QgY29udGVudFdpZHRoID0gKHRoaXMuZWxlbWVudENoZWNrU2Nyb2xsWCgpIHx8IHRoaXMuRWxlbWVudCkuc2Nyb2xsV2lkdGg7XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gZS5jbGllbnRYIC0gdGhpcy5FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyBsZW5ndGhUaHVtYlRvUG9pbnRDbGljaztcbiAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSAodGh1bWJQb3NpdGlvbiAvIChjb250YWluZXJXaWR0aCAtIHRoaXMudGh1bWJYLm9mZnNldFdpZHRoKSkgKiAoY29udGVudFdpZHRoIC0gY29udGFpbmVyV2lkdGgpO1xuICAgICAgdGhpcy5FbGVtZW50LnNjcm9sbCh7IGxlZnQ6IHNjcm9sbExlZnQsIGJlaGF2aW9yIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB0aGlzLkVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSAodGhpcy5lbGVtZW50Q2hlY2tTY3JvbGxZKCkgfHwgdGhpcy5FbGVtZW50KS5zY3JvbGxIZWlnaHQ7XG4gICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IGUuY2xpZW50WSAtIHRoaXMuRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBsZW5ndGhUaHVtYlRvUG9pbnRDbGljaztcbiAgICBjb25zdCBzY3JvbGxUb3AgPSAodGh1bWJQb3NpdGlvbiAvIChjb250YWluZXJIZWlnaHQgLSB0aGlzLnRodW1iWS5vZmZzZXRIZWlnaHQpKSAqIChjb250ZW50SGVpZ2h0IC0gY29udGFpbmVySGVpZ2h0KTtcbiAgICB0aGlzLkVsZW1lbnQuc2Nyb2xsKHsgdG9wOiBzY3JvbGxUb3AsIGJlaGF2aW9yIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTY3JvbGxiYXJTaXplKHNjcm9sbERpcmVjdGlvbjogVFlQRV9TQ1JPTExfRElSRUNUSU9OKSB7XG4gICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnKSB7XG4gICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9ICh0aGlzLmVsZW1lbnRDaGVja1Njcm9sbFgoKSB8fCB0aGlzLkVsZW1lbnQpLnNjcm9sbFdpZHRoO1xuICAgICAgaWYgKGNvbnRhaW5lcldpZHRoID09PSB0aGlzLmxhc3RDb250YWluZXJXaWR0aCAmJiBjb250ZW50V2lkdGggPT09IHRoaXMubGFzdENvbnRlbnRXaWR0aCkgcmV0dXJuO1xuICAgICAgdGhpcy5sYXN0Q29udGFpbmVyV2lkdGggPSBjb250YWluZXJXaWR0aDtcbiAgICAgIHRoaXMubGFzdENvbnRlbnRXaWR0aCA9IGNvbnRlbnRXaWR0aDtcbiAgICAgIGNvbnN0IHRodW1iV2lkdGggPSAoY29udGFpbmVyV2lkdGggLyBjb250ZW50V2lkdGgpICogY29udGFpbmVyV2lkdGg7XG4gICAgICB0aGlzLnRodW1iWC5zdHlsZS53aWR0aCA9IGAke01hdGgubWF4KE1JTl9USFVNQl9TSVpFLCB0aHVtYldpZHRoKX1weGA7XG4gICAgICB0aGlzLnRyYWNrWC5zdHlsZS5kaXNwbGF5ID0gY29udGVudFdpZHRoID4gY29udGFpbmVyV2lkdGggPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgdGhpcy51cGRhdGVTY3JvbGxiYXJQb3NpdGlvbihzY3JvbGxEaXJlY3Rpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB0aGlzLkVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSAodGhpcy5lbGVtZW50Q2hlY2tTY3JvbGxZKCkgfHwgdGhpcy5FbGVtZW50KS5zY3JvbGxIZWlnaHQ7XG4gICAgaWYgKGNvbnRhaW5lckhlaWdodCA9PT0gdGhpcy5sYXN0Q29udGFpbmVySGVpZ2h0ICYmIGNvbnRlbnRIZWlnaHQgPT09IHRoaXMubGFzdENvbnRlbnRIZWlnaHQpIHJldHVybjtcbiAgICB0aGlzLmxhc3RDb250YWluZXJIZWlnaHQgPSBjb250YWluZXJIZWlnaHQ7XG4gICAgdGhpcy5sYXN0Q29udGVudEhlaWdodCA9IGNvbnRlbnRIZWlnaHQ7XG4gICAgY29uc3QgdGh1bWJIZWlnaHQgPSAoY29udGFpbmVySGVpZ2h0IC8gY29udGVudEhlaWdodCkgKiBjb250YWluZXJIZWlnaHQ7XG4gICAgdGhpcy50aHVtYlkuc3R5bGUuaGVpZ2h0ID0gYCR7TWF0aC5tYXgoTUlOX1RIVU1CX1NJWkUsIHRodW1iSGVpZ2h0KX1weGA7XG4gICAgdGhpcy50cmFja1kuc3R5bGUuZGlzcGxheSA9IGNvbnRlbnRIZWlnaHQgPiBjb250YWluZXJIZWlnaHQgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIHRoaXMudXBkYXRlU2Nyb2xsYmFyUG9zaXRpb24oJ1knKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2Nyb2xsYmFyUG9zaXRpb24oc2Nyb2xsRGlyZWN0aW9uOiBUWVBFX1NDUk9MTF9ESVJFQ1RJT04pIHtcbiAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5FbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgY29uc3QgY29udGVudFdpZHRoID0gKHRoaXMuZWxlbWVudENoZWNrU2Nyb2xsWCgpIHx8IHRoaXMuRWxlbWVudCkuc2Nyb2xsV2lkdGg7XG4gICAgICBjb25zdCBkZW5vbWluYXRvclNjcm9sbCA9IGNvbnRlbnRXaWR0aCAtIGNvbnRhaW5lcldpZHRoO1xuICAgICAgaWYgKGRlbm9taW5hdG9yU2Nyb2xsIDw9IDApIHJldHVybjtcbiAgICAgIGNvbnN0IGRlbm9taW5hdG9yVGh1bWIgPSBjb250YWluZXJXaWR0aCAtIHRoaXMudGh1bWJYLm9mZnNldFdpZHRoO1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9ICh0aGlzLkVsZW1lbnQuc2Nyb2xsTGVmdCAvIGRlbm9taW5hdG9yU2Nyb2xsKSAqIGRlbm9taW5hdG9yVGh1bWI7XG4gICAgICB0aGlzLnRodW1iWC5zdHlsZS5sZWZ0ID0gYCR7dGh1bWJQb3NpdGlvbn1weGA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHRoaXMuRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3QgY29udGVudEhlaWdodCA9ICh0aGlzLmVsZW1lbnRDaGVja1Njcm9sbFkoKSB8fCB0aGlzLkVsZW1lbnQpLnNjcm9sbEhlaWdodDtcbiAgICBjb25zdCBkZW5vbWluYXRvclNjcm9sbCA9IGNvbnRlbnRIZWlnaHQgLSBjb250YWluZXJIZWlnaHQ7XG4gICAgaWYgKGRlbm9taW5hdG9yU2Nyb2xsIDw9IDApIHJldHVybjtcbiAgICBjb25zdCBkZW5vbWluYXRvclRodW1iID0gY29udGFpbmVySGVpZ2h0IC0gdGhpcy50aHVtYlkub2Zmc2V0SGVpZ2h0O1xuICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSAodGhpcy5FbGVtZW50LnNjcm9sbFRvcCAvIGRlbm9taW5hdG9yU2Nyb2xsKSAqIGRlbm9taW5hdG9yVGh1bWI7XG4gICAgdGhpcy50aHVtYlkuc3R5bGUudG9wID0gYCR7dGh1bWJQb3NpdGlvbn1weGA7XG4gIH1cbn1cbiJdfQ==