@scion/components 18.1.0 → 18.1.1

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.
@@ -8,11 +8,12 @@
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  */
10
10
  import { DOCUMENT } from '@angular/common';
11
- import { ChangeDetectionStrategy, Component, HostBinding, Inject, Input, NgZone, ViewChild } from '@angular/core';
12
- import { fromEvent, merge, of, Subject, timer } from 'rxjs';
11
+ import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, HostBinding, inject, input, NgZone, untracked, viewChild } from '@angular/core';
12
+ import { fromEvent, merge, mergeWith, of, timer } from 'rxjs';
13
13
  import { debounceTime, first, map, startWith, switchMap, takeUntil, takeWhile, withLatestFrom } from 'rxjs/operators';
14
14
  import { fromMutation$, fromResize$ } from '@scion/toolkit/observable';
15
- import { filterArray, subscribeInside } from '@scion/toolkit/operators';
15
+ import { filterArray, subscribeIn } from '@scion/toolkit/operators';
16
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
16
17
  import * as i0 from "@angular/core";
17
18
  /**
18
19
  * Renders a vertical or horizontal scrollbar.
@@ -50,52 +51,36 @@ export class SciScrollbarComponent {
50
51
  */
51
52
  static { this.VIEWPORT_RESIZE_DEBOUNCE_TIME = 50; }
52
53
  get vertical() {
53
- return this.direction === 'vscroll';
54
+ return this._vertical();
54
55
  }
55
56
  get horizontal() {
56
- return this.direction === 'hscroll';
57
+ return !this._vertical();
57
58
  }
58
59
  get scrolling() {
59
60
  return this._lastDragPosition !== null;
60
61
  }
61
- /**
62
- * The viewport to provide scrollbars for.
63
- */
64
- set setViewport(viewport) {
65
- this._viewport = viewport;
66
- this._viewportChange$.next();
67
- }
68
- constructor(_host, _document, _zone) {
69
- this._host = _host;
70
- this._document = _document;
71
- this._zone = _zone;
72
- this._destroy$ = new Subject();
73
- this._viewportChange$ = new Subject();
62
+ constructor() {
63
+ this._host = inject((ElementRef)).nativeElement;
64
+ this._document = inject(DOCUMENT);
65
+ this._zone = inject(NgZone);
66
+ this._destroyRef = inject(DestroyRef);
74
67
  this._lastDragPosition = null;
75
68
  this._overflow = false;
76
69
  this._thumbSizeFr = 0;
77
70
  this._thumbPositionFr = 0;
71
+ this._thumbElement = viewChild.required('thumb_handle');
72
+ this._vertical = computed(() => this.direction() === 'vscroll');
78
73
  /**
79
74
  * Specifies the direction of the scrollbar.
80
75
  *
81
76
  * By default, if not specified, renders a vertical scrollbar.
82
77
  */
83
- this.direction = 'vscroll';
84
- this._viewportChange$
85
- .pipe(switchMap(() => {
86
- if (!this._viewport) {
87
- return of(undefined);
88
- }
89
- return merge(this.viewportScrollChange$(), this.viewportDimensionChange$({ debounceTime: SciScrollbarComponent.VIEWPORT_RESIZE_DEBOUNCE_TIME }), this.viewportClientDimensionChange$({ debounceTime: SciScrollbarComponent.VIEWPORT_RESIZE_DEBOUNCE_TIME }));
90
- }), subscribeInside(continueFn => this._zone.runOutsideAngular(continueFn)), takeUntil(this._destroy$))
91
- .subscribe(() => {
92
- if (this._viewport) {
93
- this.renderScrollPosition();
94
- }
95
- else {
96
- this.unsetScrollPosition();
97
- }
98
- });
78
+ this.direction = input('vscroll');
79
+ /**
80
+ * The viewport to provide scrollbars for.
81
+ */
82
+ this.viewport = input.required();
83
+ this.installScrollPositionRenderer();
99
84
  }
100
85
  /**
101
86
  * Computes the scroll position and updates CSS variables to render the scroll position in the UI.
@@ -115,7 +100,7 @@ export class SciScrollbarComponent {
115
100
  }
116
101
  if (overflow !== this._overflow) {
117
102
  this._overflow = overflow;
118
- overflow ? this._host.nativeElement.classList.add('overflow') : this._host.nativeElement.classList.remove('overflow');
103
+ overflow ? this._host.classList.add('overflow') : this._host.classList.remove('overflow');
119
104
  }
120
105
  }
121
106
  /**
@@ -128,14 +113,12 @@ export class SciScrollbarComponent {
128
113
  this._overflow = false;
129
114
  this.setCssVariable('--ɵsci-scrollbar-thumb-position-fr', 0);
130
115
  this.setCssVariable('--ɵsci-scrollbar-thumb-size-fr', 0);
131
- this._host.nativeElement.classList.remove('overflow');
116
+ this._host.classList.remove('overflow');
132
117
  }
133
- /* @docs-private */
134
118
  onTouchStart(event) {
135
119
  event.preventDefault();
136
120
  this._lastDragPosition = this.vertical ? event.touches[0].screenY : event.touches[0].screenX;
137
121
  }
138
- /* @docs-private */
139
122
  onTouchMove(event) {
140
123
  event.preventDefault();
141
124
  const newDragPositionPx = this.vertical ? event.touches[0].screenY : event.touches[0].screenX;
@@ -144,12 +127,10 @@ export class SciScrollbarComponent {
144
127
  this._lastDragPosition = newDragPositionPx;
145
128
  this.moveViewportClient(viewportPanPx);
146
129
  }
147
- /* @docs-private */
148
130
  onTouchEnd(event) {
149
131
  event.preventDefault();
150
132
  this._lastDragPosition = null;
151
133
  }
152
- /* @docs-private */
153
134
  onMouseDown(mousedownEvent) {
154
135
  if (mousedownEvent.button !== 0) {
155
136
  return;
@@ -157,32 +138,49 @@ export class SciScrollbarComponent {
157
138
  mousedownEvent.preventDefault();
158
139
  this._lastDragPosition = this.vertical ? mousedownEvent.screenY : mousedownEvent.screenX;
159
140
  // Listen for 'mousemove' events
160
- this._zone.runOutsideAngular(() => {
161
- const mousemoveListener = merge(fromEvent(this._document, 'mousemove'), fromEvent(this._document, 'sci-mousemove'))
162
- .pipe(takeUntil(this._destroy$))
163
- .subscribe(mousemoveEvent => {
164
- mousemoveEvent.preventDefault();
165
- const newDragPositionPx = this.vertical ? mousemoveEvent.screenY : mousemoveEvent.screenX;
166
- const scrollbarPanPx = newDragPositionPx - this._lastDragPosition;
167
- const viewportPanPx = this.toViewportPanPx(scrollbarPanPx);
168
- this._lastDragPosition = newDragPositionPx;
169
- this.moveViewportClient(viewportPanPx);
170
- });
171
- // Listen for 'mouseup' events; use 'capture phase' and 'stop propagation' to not close overlays
172
- merge(fromEvent(this._document, 'mouseup', { capture: true }), fromEvent(this._document, 'sci-mouseup'))
173
- .pipe(first(), takeUntil(this._destroy$))
174
- .subscribe(mouseupEvent => {
175
- mouseupEvent.stopPropagation();
176
- mousemoveListener.unsubscribe();
177
- this._lastDragPosition = null;
178
- });
141
+ const mousemoveListener = merge(fromEvent(this._document, 'mousemove'), fromEvent(this._document, 'sci-mousemove'))
142
+ .pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), takeUntilDestroyed(this._destroyRef))
143
+ .subscribe(mousemoveEvent => {
144
+ NgZone.assertNotInAngularZone();
145
+ mousemoveEvent.preventDefault();
146
+ const newDragPositionPx = this.vertical ? mousemoveEvent.screenY : mousemoveEvent.screenX;
147
+ const scrollbarPanPx = newDragPositionPx - this._lastDragPosition;
148
+ const viewportPanPx = this.toViewportPanPx(scrollbarPanPx);
149
+ this._lastDragPosition = newDragPositionPx;
150
+ this.moveViewportClient(viewportPanPx);
151
+ });
152
+ // Listen for 'mouseup' events; use 'capture phase' and 'stop propagation' to not close overlays
153
+ merge(fromEvent(this._document, 'mouseup', { capture: true }), fromEvent(this._document, 'sci-mouseup'))
154
+ .pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), first(), takeUntilDestroyed(this._destroyRef))
155
+ .subscribe(mouseupEvent => {
156
+ NgZone.assertNotInAngularZone();
157
+ mouseupEvent.stopPropagation();
158
+ mousemoveListener.unsubscribe();
159
+ this._lastDragPosition = null;
179
160
  });
180
161
  }
181
- /* @docs-private */
182
162
  onScrollTrackMouseDown(event, direction) {
183
163
  const signum = (direction === 'up' ? -1 : +1);
184
164
  this.scrollWhileMouseDown(this.toViewportPanPx(signum * this.thumbSize), event);
185
165
  }
166
+ /**
167
+ * Renders the current scroll position when the viewport is scrolled.
168
+ */
169
+ installScrollPositionRenderer() {
170
+ effect(onCleanup => {
171
+ const viewport = this.viewport();
172
+ untracked(() => {
173
+ if (!viewport) {
174
+ this.unsetScrollPosition();
175
+ return;
176
+ }
177
+ const subscription = viewportScroll$(viewport)
178
+ .pipe(mergeWith(viewportSize$(viewport, { debounceTime: SciScrollbarComponent.VIEWPORT_RESIZE_DEBOUNCE_TIME })), mergeWith(viewportClientSize$(viewport, { debounceTime: SciScrollbarComponent.VIEWPORT_RESIZE_DEBOUNCE_TIME })), subscribeIn(fn => this._zone.runOutsideAngular(fn)))
179
+ .subscribe(() => this.renderScrollPosition());
180
+ onCleanup(() => subscription.unsubscribe());
181
+ });
182
+ });
183
+ }
186
184
  /**
187
185
  * Projects the given scrollbar scroll pixels into viewport scroll pixels.
188
186
  */
@@ -196,10 +194,10 @@ export class SciScrollbarComponent {
196
194
  */
197
195
  moveViewportClient(viewportPanPx) {
198
196
  if (this.vertical) {
199
- this._viewport.scrollTop += viewportPanPx;
197
+ this.viewport().scrollTop += viewportPanPx;
200
198
  }
201
199
  else {
202
- this._viewport.scrollLeft += viewportPanPx;
200
+ this.viewport().scrollLeft += viewportPanPx;
203
201
  }
204
202
  }
205
203
  /**
@@ -231,81 +229,32 @@ export class SciScrollbarComponent {
231
229
  this.moveViewportClient(viewportScrollPx);
232
230
  });
233
231
  }
234
- /**
235
- * Emits whenever the viewport scrolls.
236
- */
237
- viewportScrollChange$() {
238
- return fromEvent(this._viewport, 'scroll', { passive: true }).pipe(map(() => undefined));
239
- }
240
- /**
241
- * Emits on subscription, and then each time the size of the viewport changes.
242
- */
243
- viewportDimensionChange$(options) {
244
- return fromResize$(this._viewport)
245
- .pipe(
246
- // Debouncing is particularly important in the context of Angular animations, since they continuously
247
- // trigger resize events. Debouncing prevents the scrollbar from flickering, for example, when the user
248
- // expands a panel that contains a viewport.
249
- debounceTime(options.debounceTime), map(() => undefined));
250
- }
251
- /**
252
- * Emits on subscription, and then each time the size or style property of the viewport client changes.
253
- */
254
- viewportClientDimensionChange$(options) {
255
- return this.children$(this._viewport)
256
- .pipe(switchMap(children => merge(...children.map(child => merge(fromResize$(child),
257
- // Observe style mutations since some transformations change the scroll position without necessarily triggering a dimension change,
258
- // e.g., `scale` or `translate` used by some virtual scroll implementations
259
- fromMutation$(child, { subtree: false, childList: false, attributeFilter: ['style'] }))))),
260
- // Debouncing is particularly important in the context of Angular animations, since they continuously
261
- // trigger resize events. Debouncing prevents the scrollbar from flickering, for example, when the user
262
- // expands a panel that contains a viewport.
263
- debounceTime(options.debounceTime), map(() => undefined));
264
- }
265
- /**
266
- * Emits the children of the passed element, and then each time child elements are added or removed.
267
- */
268
- children$(element) {
269
- return fromMutation$(element, { subtree: false, childList: true })
270
- .pipe(startWith(undefined), map(() => Array.from(element.children)), filterArray((child) => child instanceof HTMLElement));
271
- }
272
232
  setCssVariable(key, value) {
273
- this._host.nativeElement.style.setProperty(key, value);
233
+ this._host.style.setProperty(key, value);
274
234
  }
275
235
  get viewportSize() {
276
- return this._viewport ? (this.vertical ? this._viewport.clientHeight : this._viewport.clientWidth) : 0;
236
+ return this.viewport() ? (this.vertical ? this.viewport().clientHeight : this.viewport().clientWidth) : 0;
277
237
  }
278
238
  get viewportClientSize() {
279
- return this._viewport ? (this.vertical ? this._viewport.scrollHeight : this._viewport.scrollWidth) : 0;
239
+ return this.viewport() ? (this.vertical ? this.viewport().scrollHeight : this.viewport().scrollWidth) : 0;
280
240
  }
281
241
  get scrollPosition() {
282
- return this._viewport ? (this.vertical ? this._viewport.scrollTop : this._viewport.scrollLeft) : 0;
242
+ return this.viewport() ? (this.vertical ? this.viewport().scrollTop : this.viewport().scrollLeft) : 0;
283
243
  }
284
244
  get thumbSize() {
285
- const thumbElement = this.thumbElement.nativeElement;
245
+ const thumbElement = this._thumbElement().nativeElement;
286
246
  return this.vertical ? thumbElement.clientHeight : thumbElement.clientWidth;
287
247
  }
288
248
  get trackSize() {
289
- const trackElement = this._host.nativeElement;
290
- return this.vertical ? trackElement.clientHeight : trackElement.clientWidth;
291
- }
292
- /* @docs-private */
293
- ngOnDestroy() {
294
- this._destroy$.next();
249
+ return this.vertical ? this._host.clientHeight : this._host.clientWidth;
295
250
  }
296
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciScrollbarComponent, deps: [{ token: i0.ElementRef }, { token: DOCUMENT }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
297
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: SciScrollbarComponent, isStandalone: true, selector: "sci-scrollbar", inputs: { direction: "direction", setViewport: ["viewport", "setViewport"] }, host: { properties: { "class.vertical": "this.vertical", "class.horizontal": "this.horizontal", "class.scrolling": "this.scrolling" } }, viewQueries: [{ propertyName: "thumbElement", first: true, predicate: ["thumb_handle"], descendants: true, static: true }], ngImport: i0, template: "<!-- scrolltrack to move the viewport client upwards (paging) -->\n<div class=\"scrolltrack-start\" (mousedown)=\"onScrollTrackMouseDown($event, 'up')\"></div>\n\n<!-- scrollthumb -->\n<div #thumb_handle\n class=\"thumb-handle\"\n [class.vertical]=\"vertical\"\n [class.horizontal]=\"horizontal\"\n (mousedown)=\"onMouseDown($event)\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n (touchcancel)=\"onTouchEnd($event)\">\n <div class=\"thumb\"\n [class.vertical]=\"vertical\"\n [class.horizontal]=\"horizontal\">\n </div>\n</div>\n\n<!-- scrolltrack to move the viewport client downwards (paging) -->\n<div class=\"scrolltrack-end\" (mousedown)=\"onScrollTrackMouseDown($event, 'down')\"></div>\n", styles: ["@charset \"UTF-8\";:host{display:flex;border:2px solid transparent;box-sizing:border-box;--\\275sci-scrollbar-thumb-position-fr: 0;--\\275sci-scrollbar-thumb-size-fr: 0}:host.vertical{flex-direction:column}:host.horizontal{flex-direction:row}:host>div.scrolltrack-start{flex-grow:var(--\\275sci-scrollbar-thumb-position-fr)}:host>div.thumb-handle{flex-basis:20px;display:flex;flex-grow:var(--\\275sci-scrollbar-thumb-size-fr);align-items:center}:host>div.thumb-handle.vertical{flex-direction:column}:host>div.thumb-handle.horizontal{flex-direction:row}:host>div.thumb-handle>div.thumb{flex:auto;border-radius:4px;background-color:var(--sci-scrollbar-color);opacity:.4;transition-duration:125ms;transition-property:width,height;transition-timing-function:ease-out}:host>div.thumb-handle>div.thumb.vertical{width:60%}:host>div.thumb-handle>div.thumb.horizontal{height:60%}:host>div.scrolltrack-end{flex-grow:calc(1 - (var(--\\275sci-scrollbar-thumb-position-fr) + var(--\\275sci-scrollbar-thumb-size-fr)))}:host-context:not(.overflow){display:none}:host-context:hover>div.thumb-handle>div.thumb,:host-context(.scrolling)>div.thumb-handle>div.thumb{background-color:var(--sci-scrollbar-color);opacity:.75}:host-context:hover>div.thumb-handle>div.thumb.vertical,:host-context(.scrolling)>div.thumb-handle>div.thumb.vertical{width:100%}:host-context:hover>div.thumb-handle>div.thumb.horizontal,:host-context(.scrolling)>div.thumb-handle>div.thumb.horizontal{height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
251
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciScrollbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
252
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.0.1", type: SciScrollbarComponent, isStandalone: true, selector: "sci-scrollbar", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, viewport: { classPropertyName: "viewport", publicName: "viewport", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "class.vertical": "this.vertical", "class.horizontal": "this.horizontal", "class.scrolling": "this.scrolling" } }, viewQueries: [{ propertyName: "_thumbElement", first: true, predicate: ["thumb_handle"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- scrolltrack to move the viewport client upwards (paging) -->\n<div class=\"scrolltrack-start\" (mousedown)=\"onScrollTrackMouseDown($event, 'up')\"></div>\n\n<!-- scrollthumb -->\n<div #thumb_handle\n class=\"thumb-handle\"\n [class.vertical]=\"vertical\"\n [class.horizontal]=\"horizontal\"\n (mousedown)=\"onMouseDown($event)\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n (touchcancel)=\"onTouchEnd($event)\">\n <div class=\"thumb\"\n [class.vertical]=\"vertical\"\n [class.horizontal]=\"horizontal\">\n </div>\n</div>\n\n<!-- scrolltrack to move the viewport client downwards (paging) -->\n<div class=\"scrolltrack-end\" (mousedown)=\"onScrollTrackMouseDown($event, 'down')\"></div>\n", styles: ["@charset \"UTF-8\";:host{display:flex;border:2px solid transparent;box-sizing:border-box;--\\275sci-scrollbar-thumb-position-fr: 0;--\\275sci-scrollbar-thumb-size-fr: 0}:host.vertical{flex-direction:column}:host.horizontal{flex-direction:row}:host>div.scrolltrack-start{flex-grow:var(--\\275sci-scrollbar-thumb-position-fr)}:host>div.thumb-handle{flex-basis:20px;display:flex;flex-grow:var(--\\275sci-scrollbar-thumb-size-fr);align-items:center}:host>div.thumb-handle.vertical{flex-direction:column}:host>div.thumb-handle.horizontal{flex-direction:row}:host>div.thumb-handle>div.thumb{flex:auto;border-radius:4px;background-color:var(--sci-scrollbar-color);opacity:.4;transition-duration:125ms;transition-property:width,height;transition-timing-function:ease-out}:host>div.thumb-handle>div.thumb.vertical{width:60%}:host>div.thumb-handle>div.thumb.horizontal{height:60%}:host>div.scrolltrack-end{flex-grow:calc(1 - (var(--\\275sci-scrollbar-thumb-position-fr) + var(--\\275sci-scrollbar-thumb-size-fr)))}:host-context:not(.overflow){display:none}:host-context:hover>div.thumb-handle>div.thumb,:host-context(.scrolling)>div.thumb-handle>div.thumb{background-color:var(--sci-scrollbar-color);opacity:.75}:host-context:hover>div.thumb-handle>div.thumb.vertical,:host-context(.scrolling)>div.thumb-handle>div.thumb.vertical{width:100%}:host-context:hover>div.thumb-handle>div.thumb.horizontal,:host-context(.scrolling)>div.thumb-handle>div.thumb.horizontal{height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
298
253
  }
299
254
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: SciScrollbarComponent, decorators: [{
300
255
  type: Component,
301
256
  args: [{ selector: 'sci-scrollbar', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<!-- scrolltrack to move the viewport client upwards (paging) -->\n<div class=\"scrolltrack-start\" (mousedown)=\"onScrollTrackMouseDown($event, 'up')\"></div>\n\n<!-- scrollthumb -->\n<div #thumb_handle\n class=\"thumb-handle\"\n [class.vertical]=\"vertical\"\n [class.horizontal]=\"horizontal\"\n (mousedown)=\"onMouseDown($event)\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n (touchcancel)=\"onTouchEnd($event)\">\n <div class=\"thumb\"\n [class.vertical]=\"vertical\"\n [class.horizontal]=\"horizontal\">\n </div>\n</div>\n\n<!-- scrolltrack to move the viewport client downwards (paging) -->\n<div class=\"scrolltrack-end\" (mousedown)=\"onScrollTrackMouseDown($event, 'down')\"></div>\n", styles: ["@charset \"UTF-8\";:host{display:flex;border:2px solid transparent;box-sizing:border-box;--\\275sci-scrollbar-thumb-position-fr: 0;--\\275sci-scrollbar-thumb-size-fr: 0}:host.vertical{flex-direction:column}:host.horizontal{flex-direction:row}:host>div.scrolltrack-start{flex-grow:var(--\\275sci-scrollbar-thumb-position-fr)}:host>div.thumb-handle{flex-basis:20px;display:flex;flex-grow:var(--\\275sci-scrollbar-thumb-size-fr);align-items:center}:host>div.thumb-handle.vertical{flex-direction:column}:host>div.thumb-handle.horizontal{flex-direction:row}:host>div.thumb-handle>div.thumb{flex:auto;border-radius:4px;background-color:var(--sci-scrollbar-color);opacity:.4;transition-duration:125ms;transition-property:width,height;transition-timing-function:ease-out}:host>div.thumb-handle>div.thumb.vertical{width:60%}:host>div.thumb-handle>div.thumb.horizontal{height:60%}:host>div.scrolltrack-end{flex-grow:calc(1 - (var(--\\275sci-scrollbar-thumb-position-fr) + var(--\\275sci-scrollbar-thumb-size-fr)))}:host-context:not(.overflow){display:none}:host-context:hover>div.thumb-handle>div.thumb,:host-context(.scrolling)>div.thumb-handle>div.thumb{background-color:var(--sci-scrollbar-color);opacity:.75}:host-context:hover>div.thumb-handle>div.thumb.vertical,:host-context(.scrolling)>div.thumb-handle>div.thumb.vertical{width:100%}:host-context:hover>div.thumb-handle>div.thumb.horizontal,:host-context(.scrolling)>div.thumb-handle>div.thumb.horizontal{height:100%}\n"] }]
302
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: Document, decorators: [{
303
- type: Inject,
304
- args: [DOCUMENT]
305
- }] }, { type: i0.NgZone }], propDecorators: { thumbElement: [{
306
- type: ViewChild,
307
- args: ['thumb_handle', { static: true }]
308
- }], vertical: [{
257
+ }], ctorParameters: () => [], propDecorators: { vertical: [{
309
258
  type: HostBinding,
310
259
  args: ['class.vertical']
311
260
  }], horizontal: [{
@@ -314,10 +263,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImpor
314
263
  }], scrolling: [{
315
264
  type: HostBinding,
316
265
  args: ['class.scrolling']
317
- }], direction: [{
318
- type: Input
319
- }], setViewport: [{
320
- type: Input,
321
- args: [{ alias: 'viewport', required: true }]
322
266
  }] } });
323
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL2NvbXBvbmVudHMvdmlld3BvcnQvc3JjL3Njcm9sbGJhci9zY3JvbGxiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vY29tcG9uZW50cy92aWV3cG9ydC9zcmMvc2Nyb2xsYmFyL3Njcm9sbGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFjLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBYSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkksT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwSCxPQUFPLEVBQUMsYUFBYSxFQUFFLFdBQVcsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxXQUFXLEVBQUUsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7O0FBRXRFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQVFILE1BQU0sT0FBTyxxQkFBcUI7SUFFaEM7Ozs7Ozs7O09BUUc7YUFDb0Isa0NBQTZCLEdBQUcsRUFBRSxBQUFMLENBQU07SUFlMUQsSUFDVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxT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QztJQUM5RSxDQUFDO0lBRUQsSUFBWSxTQUFTO1FBQ25CLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQztJQUM5RSxDQUFDO0lBRUQsbUJBQW1CO0lBQ1osV0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7OEdBblVVLHFCQUFxQiw0Q0EyRFosUUFBUTtrR0EzRGpCLHFCQUFxQiw0WkNoRGxDLDR5QkFxQkE7OzJGRDJCYSxxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0UsZUFBZSxtQkFHUix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUk7OzBCQTZESCxNQUFNOzJCQUFDLFFBQVE7OERBbkNyQixZQUFZO3NCQURsQixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBSTlCLFFBQVE7c0JBRGxCLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQU1sQixVQUFVO3NCQURwQixXQUFXO3VCQUFDLGtCQUFrQjtnQkFNcEIsU0FBUztzQkFEbkIsV0FBVzt1QkFBQyxpQkFBaUI7Z0JBV3ZCLFNBQVM7c0JBRGYsS0FBSztnQkFPSyxXQUFXO3NCQURyQixLQUFLO3VCQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIEluamVjdCwgSW5wdXQsIE5nWm9uZSwgT25EZXN0cm95LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtmcm9tRXZlbnQsIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgdGltZXJ9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpcnN0LCBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRha2VXaGlsZSwgd2l0aExhdGVzdEZyb219IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7ZnJvbU11dGF0aW9uJCwgZnJvbVJlc2l6ZSR9IGZyb20gJ0BzY2lvbi90b29sa2l0L29ic2VydmFibGUnO1xuaW1wb3J0IHtmaWx0ZXJBcnJheSwgc3Vic2NyaWJlSW5zaWRlfSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIFJlbmRlcnMgYSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIHNjcm9sbGJhci5cbiAqXG4gKiBUaGUgc2Nyb2xsYmFyIGZlYXR1cmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25hbGl0eTpcbiAqIC0gYWxsb3dzIHRvIG1vdmUgdGhlIHRodW1iIGJ5IG1vdXNlIG9yIHRvdWNoXG4gKiAtIGVubGFyZ2VzIHRoZSB0aHVtYiBpZiB0aGUgbW91c2UgcG9pbnRlciBpcyBuZWFyIHRoZSB0aHVtYlxuICogLSBhbGxvd3MgcGFnaW5nIG9uIG1vdXNlZG93biBvbiB0aGUgc2Nyb2xsIHRyYWNrXG4gKlxuICogIyMjIFN0eWxpbmc6XG4gKlxuICogVG8gY3VzdG9taXplIHRoZSBkZWZhdWx0IGxvb2sgb2YgU0NJT04gY29tcG9uZW50cyBvciBzdXBwb3J0IGRpZmZlcmVudCB0aGVtZXMsIGNvbmZpZ3VyZSB0aGUgYEBzY2lvbi9jb21wb25lbnRzYCBTQ1NTIG1vZHVsZSBpbiBgc3R5bGVzLnNjc3NgLlxuICogVG8gc3R5bGUgYSBzcGVjaWZpYyBgc2NpLXNjcm9sbGJhcmAgY29tcG9uZW50LCB0aGUgZm9sbG93aW5nIENTUyB2YXJpYWJsZXMgY2FuIGJlIHNldCBkaXJlY3RseSBvbiB0aGUgY29tcG9uZW50LlxuICpcbiAqIC0gc2NpLXNjcm9sbGJhci1jb2xvcjogICAgU2V0cyB0aGUgY29sb3Igb2YgdGhlIHNjcm9sbGJhci5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGNzc1xuICpcbiAqIHNjaS1zY3JvbGxiYXIge1xuICogICAtLXNjaS1zY3JvbGxiYXItY29sb3I6IGJsdWU7XG4gKiB9XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2NpLXNjcm9sbGJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zY3JvbGxiYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY3JvbGxiYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFNjaVNjcm9sbGJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgZm9yIGRlYm91bmNpbmcgdmlld3BvcnQgcmVzaXplIGV2ZW50cyB0aGF0IHRyaWdnZXIgdGhlIHNjcm9sbCBwb3NpdGlvbiBjb21wdXRhdGlvbi5cbiAgICpcbiAgICogRGVib3VuY2luZyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGluIHRoZSBjb250ZXh0IG9mIEFuZ3VsYXIgYW5pbWF0aW9ucywgc2luY2UgdGhleSBjb250aW51b3VzbHlcbiAgICogdHJpZ2dlciByZXNpemUgZXZlbnRzLiBEZWJvdW5jaW5nIHByZXZlbnRzIHRoZSBzY3JvbGxiYXIgZnJvbSBmbGlja2VyaW5nLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgdXNlclxuICAgKiBleHBhbmRzIGEgcGFuZWwgdGhhdCBjb250YWlucyBhIHZpZXdwb3J0LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVklFV1BPUlRfUkVTSVpFX0RFQk9VTkNFX1RJTUUgPSA1MDtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX3ZpZXdwb3J0ITogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3ZpZXdwb3J0Q2hhbmdlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2xhc3REcmFnUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX292ZXJmbG93ID0gZmFsc2U7XG4gIHByaXZhdGUgX3RodW1iU2l6ZUZyID0gMDtcbiAgcHJpdmF0ZSBfdGh1bWJQb3NpdGlvbkZyID0gMDtcblxuICAvKiBAZG9jcy1wcml2YXRlICovXG4gIEBWaWV3Q2hpbGQoJ3RodW1iX2hhbmRsZScsIHtzdGF0aWM6IHRydWV9KVxuICBwdWJsaWMgdGh1bWJFbGVtZW50ITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy52ZXJ0aWNhbCcpXG4gIHB1YmxpYyBnZXQgdmVydGljYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlyZWN0aW9uID09PSAndnNjcm9sbCc7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhvcml6b250YWwnKVxuICBwdWJsaWMgZ2V0IGhvcml6b250YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlyZWN0aW9uID09PSAnaHNjcm9sbCc7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNjcm9sbGluZycpXG4gIHB1YmxpYyBnZXQgc2Nyb2xsaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzY3JvbGxiYXIuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGlmIG5vdCBzcGVjaWZpZWQsIHJlbmRlcnMgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGlyZWN0aW9uOiAndnNjcm9sbCcgfCAnaHNjcm9sbCcgPSAndnNjcm9sbCc7XG5cbiAgLyoqXG4gICAqIFRoZSB2aWV3cG9ydCB0byBwcm92aWRlIHNjcm9sbGJhcnMgZm9yLlxuICAgKi9cbiAgQElucHV0KHthbGlhczogJ3ZpZXdwb3J0JywgcmVxdWlyZWQ6IHRydWV9KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgcHVibGljIHNldCBzZXRWaWV3cG9ydCh2aWV3cG9ydDogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl92aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIHRoaXMuX3ZpZXdwb3J0Q2hhbmdlJC5uZXh0KCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9ob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgICAgICAgICAgICBwcml2YXRlIF96b25lOiBOZ1pvbmUpIHtcbiAgICB0aGlzLl92aWV3cG9ydENoYW5nZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5fdmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0U2Nyb2xsQ2hhbmdlJCgpLFxuICAgICAgICAgICAgdGhpcy52aWV3cG9ydERpbWVuc2lvbkNoYW5nZSQoe2RlYm91bmNlVGltZTogU2NpU2Nyb2xsYmFyQ29tcG9uZW50LlZJRVdQT1JUX1JFU0laRV9ERUJPVU5DRV9USU1FfSksXG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0Q2xpZW50RGltZW5zaW9uQ2hhbmdlJCh7ZGVib3VuY2VUaW1lOiBTY2lTY3JvbGxiYXJDb21wb25lbnQuVklFV1BPUlRfUkVTSVpFX0RFQk9VTkNFX1RJTUV9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICAgc3Vic2NyaWJlSW5zaWRlKGNvbnRpbnVlRm4gPT4gdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcihjb250aW51ZUZuKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3ZpZXdwb3J0KSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJTY3JvbGxQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMudW5zZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGFuZCB1cGRhdGVzIENTUyB2YXJpYWJsZXMgdG8gcmVuZGVyIHRoZSBzY3JvbGwgcG9zaXRpb24gaW4gdGhlIFVJLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJTY3JvbGxQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpO1xuICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IHRoaXMudmlld3BvcnRTaXplO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2xpZW50U2l6ZSA9IHRoaXMudmlld3BvcnRDbGllbnRTaXplO1xuICAgIGNvbnN0IHRodW1iUG9zaXRpb25GciA9IHRoaXMuc2Nyb2xsUG9zaXRpb24gLyB2aWV3cG9ydENsaWVudFNpemU7XG4gICAgY29uc3QgdGh1bWJTaXplRnIgPSB2aWV3cG9ydFNpemUgLyB2aWV3cG9ydENsaWVudFNpemU7XG4gICAgY29uc3Qgb3ZlcmZsb3cgPSB2aWV3cG9ydENsaWVudFNpemUgPiB2aWV3cG9ydFNpemU7XG5cbiAgICBpZiAodGh1bWJQb3NpdGlvbkZyICE9PSB0aGlzLl90aHVtYlBvc2l0aW9uRnIgfHwgdGh1bWJTaXplRnIgIT09IHRoaXMuX3RodW1iU2l6ZUZyKSB7XG4gICAgICB0aGlzLl90aHVtYlBvc2l0aW9uRnIgPSB0aHVtYlBvc2l0aW9uRnI7XG4gICAgICB0aGlzLl90aHVtYlNpemVGciA9IHRodW1iU2l6ZUZyO1xuICAgICAgdGhpcy5zZXRDc3NWYXJpYWJsZSgnLS3JtXNjaS1zY3JvbGxiYXItdGh1bWItcG9zaXRpb24tZnInLCB0aHVtYlBvc2l0aW9uRnIpO1xuICAgICAgdGhpcy5zZXRDc3NWYXJpYWJsZSgnLS3JtXNjaS1zY3JvbGxiYXItdGh1bWItc2l6ZS1mcicsIHRodW1iU2l6ZUZyKTtcbiAgICB9XG5cbiAgICBpZiAob3ZlcmZsb3cgIT09IHRoaXMuX292ZXJmbG93KSB7XG4gICAgICB0aGlzLl9vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgb3ZlcmZsb3cgPyB0aGlzLl9ob3N0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnb3ZlcmZsb3cnKSA6IHRoaXMuX2hvc3QubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvdmVyZmxvdycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgQ1NTIHZhcmlhYmxlcyB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHNjcm9sbCBwb3NpdGlvbiBpbiB0aGUgVUkuXG4gICAqL1xuICBwcml2YXRlIHVuc2V0U2Nyb2xsUG9zaXRpb24oKTogdm9pZCB7XG4gICAgTmdab25lLmFzc2VydE5vdEluQW5ndWxhclpvbmUoKTtcbiAgICB0aGlzLl90aHVtYlBvc2l0aW9uRnIgPSAwO1xuICAgIHRoaXMuX3RodW1iU2l6ZUZyID0gMDtcbiAgICB0aGlzLl9vdmVyZmxvdyA9IGZhbHNlO1xuICAgIHRoaXMuc2V0Q3NzVmFyaWFibGUoJy0tybVzY2ktc2Nyb2xsYmFyLXRodW1iLXBvc2l0aW9uLWZyJywgMCk7XG4gICAgdGhpcy5zZXRDc3NWYXJpYWJsZSgnLS3JtXNjaS1zY3JvbGxiYXItdGh1bWItc2l6ZS1mcicsIDApO1xuICAgIHRoaXMuX2hvc3QubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvdmVyZmxvdycpO1xuICB9XG5cbiAgLyogQGRvY3MtcHJpdmF0ZSAqL1xuICBwdWJsaWMgb25Ub3VjaFN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uID0gdGhpcy52ZXJ0aWNhbCA/IGV2ZW50LnRvdWNoZXNbMF0uc2NyZWVuWSA6IGV2ZW50LnRvdWNoZXNbMF0uc2NyZWVuWDtcbiAgfVxuXG4gIC8qIEBkb2NzLXByaXZhdGUgKi9cbiAgcHVibGljIG9uVG91Y2hNb3ZlKGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IG5ld0RyYWdQb3NpdGlvblB4ID0gdGhpcy52ZXJ0aWNhbCA/IGV2ZW50LnRvdWNoZXNbMF0uc2NyZWVuWSA6IGV2ZW50LnRvdWNoZXNbMF0uc2NyZWVuWDtcbiAgICBjb25zdCBzY3JvbGxiYXJQYW5QeCA9IG5ld0RyYWdQb3NpdGlvblB4IC0gdGhpcy5fbGFzdERyYWdQb3NpdGlvbiE7XG4gICAgY29uc3Qgdmlld3BvcnRQYW5QeCA9IHRoaXMudG9WaWV3cG9ydFBhblB4KHNjcm9sbGJhclBhblB4KTtcbiAgICB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uID0gbmV3RHJhZ1Bvc2l0aW9uUHg7XG4gICAgdGhpcy5tb3ZlVmlld3BvcnRDbGllbnQodmlld3BvcnRQYW5QeCk7XG4gIH1cblxuICAvKiBAZG9jcy1wcml2YXRlICovXG4gIHB1YmxpYyBvblRvdWNoRW5kKGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uID0gbnVsbDtcbiAgfVxuXG4gIC8qIEBkb2NzLXByaXZhdGUgKi9cbiAgcHVibGljIG9uTW91c2VEb3duKG1vdXNlZG93bkV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKG1vdXNlZG93bkV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1vdXNlZG93bkV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5fbGFzdERyYWdQb3NpdGlvbiA9IHRoaXMudmVydGljYWwgPyBtb3VzZWRvd25FdmVudC5zY3JlZW5ZIDogbW91c2Vkb3duRXZlbnQuc2NyZWVuWDtcblxuICAgIC8vIExpc3RlbiBmb3IgJ21vdXNlbW92ZScgZXZlbnRzXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBtb3VzZW1vdmVMaXN0ZW5lciA9IG1lcmdlKGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLl9kb2N1bWVudCwgJ21vdXNlbW92ZScpLCBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5fZG9jdW1lbnQsICdzY2ktbW91c2Vtb3ZlJykpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUobW91c2Vtb3ZlRXZlbnQgPT4ge1xuICAgICAgICAgIG1vdXNlbW92ZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICBjb25zdCBuZXdEcmFnUG9zaXRpb25QeCA9IHRoaXMudmVydGljYWwgPyBtb3VzZW1vdmVFdmVudC5zY3JlZW5ZIDogbW91c2Vtb3ZlRXZlbnQuc2NyZWVuWDtcbiAgICAgICAgICBjb25zdCBzY3JvbGxiYXJQYW5QeCA9IG5ld0RyYWdQb3NpdGlvblB4IC0gdGhpcy5fbGFzdERyYWdQb3NpdGlvbiE7XG4gICAgICAgICAgY29uc3Qgdmlld3BvcnRQYW5QeCA9IHRoaXMudG9WaWV3cG9ydFBhblB4KHNjcm9sbGJhclBhblB4KTtcbiAgICAgICAgICB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uID0gbmV3RHJhZ1Bvc2l0aW9uUHg7XG4gICAgICAgICAgdGhpcy5tb3ZlVmlld3BvcnRDbGllbnQodmlld3BvcnRQYW5QeCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yICdtb3VzZXVwJyBldmVudHM7IHVzZSAnY2FwdHVyZSBwaGFzZScgYW5kICdzdG9wIHByb3BhZ2F0aW9uJyB0byBub3QgY2xvc2Ugb3ZlcmxheXNcbiAgICAgIG1lcmdlKGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLl9kb2N1bWVudCwgJ21vdXNldXAnLCB7Y2FwdHVyZTogdHJ1ZX0pLCBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5fZG9jdW1lbnQsICdzY2ktbW91c2V1cCcpKVxuICAgICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKG1vdXNldXBFdmVudCA9PiB7XG4gICAgICAgICAgbW91c2V1cEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIG1vdXNlbW92ZUxpc3RlbmVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5fbGFzdERyYWdQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyogQGRvY3MtcHJpdmF0ZSAqL1xuICBwdWJsaWMgb25TY3JvbGxUcmFja01vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nKTogdm9pZCB7XG4gICAgY29uc3Qgc2lnbnVtID0gKGRpcmVjdGlvbiA9PT0gJ3VwJyA/IC0xIDogKzEpO1xuICAgIHRoaXMuc2Nyb2xsV2hpbGVNb3VzZURvd24odGhpcy50b1ZpZXdwb3J0UGFuUHgoc2lnbnVtICogdGhpcy50aHVtYlNpemUpLCBldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdHMgdGhlIGdpdmVuIHNjcm9sbGJhciBzY3JvbGwgcGl4ZWxzIGludG8gdmlld3BvcnQgc2Nyb2xsIHBpeGVscy5cbiAgICovXG4gIHByaXZhdGUgdG9WaWV3cG9ydFBhblB4KHNjcm9sbGJhclBhblB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjcm9sbFJhbmdlUHggPSB0aGlzLnRyYWNrU2l6ZSAtIHRoaXMudGh1bWJTaXplO1xuICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsYmFyUGFuUHggLyBzY3JvbGxSYW5nZVB4O1xuICAgIHJldHVybiBzY3JvbGxSYXRpbyAqICh0aGlzLnZpZXdwb3J0Q2xpZW50U2l6ZSAtIHRoaXMudmlld3BvcnRTaXplKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgdmlld3BvcnQgY2xpZW50IGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVycyBvZiBwaXhlbHMuXG4gICAqL1xuICBwcml2YXRlIG1vdmVWaWV3cG9ydENsaWVudCh2aWV3cG9ydFBhblB4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52ZXJ0aWNhbCkge1xuICAgICAgdGhpcy5fdmlld3BvcnQuc2Nyb2xsVG9wICs9IHZpZXdwb3J0UGFuUHg7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5fdmlld3BvcnQuc2Nyb2xsTGVmdCArPSB2aWV3cG9ydFBhblB4O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGNvbnRlbnQgb3ZlcmZsb3dzLlxuICAgKi9cbiAgcHVibGljIGdldCBvdmVyZmxvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmZsb3c7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyBjb250aW51b3VzbHkgd2hpbGUgaG9sZGluZyB0aGUgbW91c2UgcHJlc3NlZCwgb3IgdW50aWwgdGhlIG1vdXNlIGxlYXZlcyB0aGUgc2Nyb2xsdHJhY2suXG4gICAqL1xuICBwcml2YXRlIHNjcm9sbFdoaWxlTW91c2VEb3duKHZpZXdwb3J0U2Nyb2xsUHg6IG51bWJlciwgbW91c2Vkb3duRXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBUaGUgYEV2ZW50VGFyZ2V0YCB0eXBlIG9mIGBFdmVudC50YXJnZXRgIGlzIG5vdCB5ZXQgY29tcGF0aWJsZSB3aXRoIGBGcm9tRXZlbnRUYXJnZXRgIHVzZWQgaW4gYGZyb21FdmVudGAuXG4gICAgLy8gVGhpcyB3aWxsIGJlIGZpeGVkIGluIHJ4anMgdmVyc2lvbiA3LjAuMC4gUmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0aXZlWC9yeGpzL2NvbW1pdC81ZjAyMmQ3ODQ1NzA2ODQ2MzJlNmZkNWFlMjQ3ZmMyNTllZTM0YzRiXG4gICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICBjb25zdCBzY3JvbGxUcmFja0VsZW1lbnQgPSBtb3VzZWRvd25FdmVudC50YXJnZXQgYXMgRWxlbWVudDtcblxuICAgIC8vIHNjcm9sbCBjb250aW51b3VzbHkgZXZlcnkgNTBtcyBhZnRlciBhbiBpbml0aWFsIGRlbGF5IG9mIDI1MG1zXG4gICAgdGltZXIoMjUwLCA1MClcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBjb250aW51ZSBjaGFpbiB3aXRoIGxhdGVzdCBtb3VzZSBldmVudFxuICAgICAgICB3aXRoTGF0ZXN0RnJvbShtZXJnZShvZihtb3VzZWRvd25FdmVudCksIGZyb21FdmVudDxNb3VzZUV2ZW50PihzY3JvbGxUcmFja0VsZW1lbnQsICdtb3VzZW1vdmUnKSksICh0aWNrLCBldmVudCkgPT4gZXZlbnQpLFxuICAgICAgICAvLyBzdGFydCBpbW1lZGlhdGVseVxuICAgICAgICBzdGFydFdpdGgobW91c2Vkb3duRXZlbnQpLFxuICAgICAgICAvLyBzdG9wIHNjcm9sbGluZyBpZiB0aGUgdGh1bWIgaGl0cyB0aGUgbW91c2UgcG9pbnRlciBwb3NpdGlvblxuICAgICAgICB0YWtlV2hpbGUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiBzY3JvbGxUcmFja0VsZW1lbnQgPT09IHRoaXMuX2RvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSkpLFxuICAgICAgICBkZWJvdW5jZVRpbWUoMTApLFxuICAgICAgICAvLyBzdG9wIHNjcm9sbGluZyBvbiBtb3VzZW91dCBvciBtb3VzZXVwXG4gICAgICAgIHRha2VVbnRpbChtZXJnZShmcm9tRXZlbnQoc2Nyb2xsVHJhY2tFbGVtZW50LCAnbW91c2VvdXQnKSwgZnJvbUV2ZW50KHNjcm9sbFRyYWNrRWxlbWVudCwgJ21vdXNldXAnKSkpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubW92ZVZpZXdwb3J0Q2xpZW50KHZpZXdwb3J0U2Nyb2xsUHgpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgd2hlbmV2ZXIgdGhlIHZpZXdwb3J0IHNjcm9sbHMuXG4gICAqL1xuICBwcml2YXRlIHZpZXdwb3J0U2Nyb2xsQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbUV2ZW50KHRoaXMuX3ZpZXdwb3J0LCAnc2Nyb2xsJywge3Bhc3NpdmU6IHRydWV9KS5waXBlKG1hcCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbiBzdWJzY3JpcHRpb24sIGFuZCB0aGVuIGVhY2ggdGltZSB0aGUgc2l6ZSBvZiB0aGUgdmlld3BvcnQgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgdmlld3BvcnREaW1lbnNpb25DaGFuZ2UkKG9wdGlvbnM6IHtkZWJvdW5jZVRpbWU6IG51bWJlcn0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVJlc2l6ZSQodGhpcy5fdmlld3BvcnQpXG4gICAgICAucGlwZShcbiAgICAgICAgLy8gRGVib3VuY2luZyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGluIHRoZSBjb250ZXh0IG9mIEFuZ3VsYXIgYW5pbWF0aW9ucywgc2luY2UgdGhleSBjb250aW51b3VzbHlcbiAgICAgICAgLy8gdHJpZ2dlciByZXNpemUgZXZlbnRzLiBEZWJvdW5jaW5nIHByZXZlbnRzIHRoZSBzY3JvbGxiYXIgZnJvbSBmbGlja2VyaW5nLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgdXNlclxuICAgICAgICAvLyBleHBhbmRzIGEgcGFuZWwgdGhhdCBjb250YWlucyBhIHZpZXdwb3J0LlxuICAgICAgICBkZWJvdW5jZVRpbWUob3B0aW9ucy5kZWJvdW5jZVRpbWUpLFxuICAgICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgb24gc3Vic2NyaXB0aW9uLCBhbmQgdGhlbiBlYWNoIHRpbWUgdGhlIHNpemUgb3Igc3R5bGUgcHJvcGVydHkgb2YgdGhlIHZpZXdwb3J0IGNsaWVudCBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSB2aWV3cG9ydENsaWVudERpbWVuc2lvbkNoYW5nZSQob3B0aW9uczoge2RlYm91bmNlVGltZTogbnVtYmVyfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuJCh0aGlzLl92aWV3cG9ydClcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoY2hpbGRyZW4gPT4gbWVyZ2UoLi4uY2hpbGRyZW4ubWFwKGNoaWxkID0+IG1lcmdlKFxuICAgICAgICAgIGZyb21SZXNpemUkKGNoaWxkKSxcbiAgICAgICAgICAvLyBPYnNlcnZlIHN0eWxlIG11dGF0aW9ucyBzaW5jZSBzb21lIHRyYW5zZm9ybWF0aW9ucyBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiB3aXRob3V0IG5lY2Vzc2FyaWx5IHRyaWdnZXJpbmcgYSBkaW1lbnNpb24gY2hhbmdlLFxuICAgICAgICAgIC8vIGUuZy4sIGBzY2FsZWAgb3IgYHRyYW5zbGF0ZWAgdXNlZCBieSBzb21lIHZpcnR1YWwgc2Nyb2xsIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgIGZyb21NdXRhdGlvbiQoY2hpbGQsIHtzdWJ0cmVlOiBmYWxzZSwgY2hpbGRMaXN0OiBmYWxzZSwgYXR0cmlidXRlRmlsdGVyOiBbJ3N0eWxlJ119KSksXG4gICAgICAgICkpKSxcbiAgICAgICAgLy8gRGVib3VuY2luZyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGluIHRoZSBjb250ZXh0IG9mIEFuZ3VsYXIgYW5pbWF0aW9ucywgc2luY2UgdGhleSBjb250aW51b3VzbHlcbiAgICAgICAgLy8gdHJpZ2dlciByZXNpemUgZXZlbnRzLiBEZWJvdW5jaW5nIHByZXZlbnRzIHRoZSBzY3JvbGxiYXIgZnJvbSBmbGlja2VyaW5nLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgdXNlclxuICAgICAgICAvLyBleHBhbmRzIGEgcGFuZWwgdGhhdCBjb250YWlucyBhIHZpZXdwb3J0LlxuICAgICAgICBkZWJvdW5jZVRpbWUob3B0aW9ucy5kZWJvdW5jZVRpbWUpLFxuICAgICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIGNoaWxkcmVuIG9mIHRoZSBwYXNzZWQgZWxlbWVudCwgYW5kIHRoZW4gZWFjaCB0aW1lIGNoaWxkIGVsZW1lbnRzIGFyZSBhZGRlZCBvciByZW1vdmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGlsZHJlbiQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBPYnNlcnZhYmxlPEhUTUxFbGVtZW50W10+IHtcbiAgICByZXR1cm4gZnJvbU11dGF0aW9uJChlbGVtZW50LCB7c3VidHJlZTogZmFsc2UsIGNoaWxkTGlzdDogdHJ1ZX0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHVuZGVmaW5lZCBhcyB2b2lkKSxcbiAgICAgICAgbWFwKCgpID0+IEFycmF5LmZyb20oZWxlbWVudC5jaGlsZHJlbikpLFxuICAgICAgICBmaWx0ZXJBcnJheSgoY2hpbGQ6IEVsZW1lbnQpOiBjaGlsZCBpcyBIVE1MRWxlbWVudCA9PiBjaGlsZCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldENzc1ZhcmlhYmxlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5faG9zdC5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdmlld3BvcnRTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0ID8gKHRoaXMudmVydGljYWwgPyB0aGlzLl92aWV3cG9ydC5jbGllbnRIZWlnaHQgOiB0aGlzLl92aWV3cG9ydC5jbGllbnRXaWR0aCkgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdmlld3BvcnRDbGllbnRTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0ID8gKHRoaXMudmVydGljYWwgPyB0aGlzLl92aWV3cG9ydC5zY3JvbGxIZWlnaHQgOiB0aGlzLl92aWV3cG9ydC5zY3JvbGxXaWR0aCkgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgc2Nyb2xsUG9zaXRpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld3BvcnQgPyAodGhpcy52ZXJ0aWNhbCA/IHRoaXMuX3ZpZXdwb3J0LnNjcm9sbFRvcCA6IHRoaXMuX3ZpZXdwb3J0LnNjcm9sbExlZnQpIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHRodW1iU2l6ZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IHRodW1iRWxlbWVudCA9IHRoaXMudGh1bWJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuIHRoaXMudmVydGljYWwgPyB0aHVtYkVsZW1lbnQuY2xpZW50SGVpZ2h0IDogdGh1bWJFbGVtZW50LmNsaWVudFdpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdHJhY2tTaXplKCk6IG51bWJlciB7XG4gICAgY29uc3QgdHJhY2tFbGVtZW50ID0gdGhpcy5faG9zdC5uYXRpdmVFbGVtZW50O1xuICAgIHJldHVybiB0aGlzLnZlcnRpY2FsID8gdHJhY2tFbGVtZW50LmNsaWVudEhlaWdodCA6IHRyYWNrRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgfVxuXG4gIC8qIEBkb2NzLXByaXZhdGUgKi9cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgfVxufVxuIiwiPCEtLSBzY3JvbGx0cmFjayB0byBtb3ZlIHRoZSB2aWV3cG9ydCBjbGllbnQgdXB3YXJkcyAocGFnaW5nKSAtLT5cbjxkaXYgY2xhc3M9XCJzY3JvbGx0cmFjay1zdGFydFwiIChtb3VzZWRvd24pPVwib25TY3JvbGxUcmFja01vdXNlRG93bigkZXZlbnQsICd1cCcpXCI+PC9kaXY+XG5cbjwhLS0gc2Nyb2xsdGh1bWIgLS0+XG48ZGl2ICN0aHVtYl9oYW5kbGVcbiAgICAgY2xhc3M9XCJ0aHVtYi1oYW5kbGVcIlxuICAgICBbY2xhc3MudmVydGljYWxdPVwidmVydGljYWxcIlxuICAgICBbY2xhc3MuaG9yaXpvbnRhbF09XCJob3Jpem9udGFsXCJcbiAgICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAgKHRvdWNoc3RhcnQpPVwib25Ub3VjaFN0YXJ0KCRldmVudClcIlxuICAgICAodG91Y2htb3ZlKT1cIm9uVG91Y2hNb3ZlKCRldmVudClcIlxuICAgICAodG91Y2hlbmQpPVwib25Ub3VjaEVuZCgkZXZlbnQpXCJcbiAgICAgKHRvdWNoY2FuY2VsKT1cIm9uVG91Y2hFbmQoJGV2ZW50KVwiPlxuICA8ZGl2IGNsYXNzPVwidGh1bWJcIlxuICAgICAgIFtjbGFzcy52ZXJ0aWNhbF09XCJ2ZXJ0aWNhbFwiXG4gICAgICAgW2NsYXNzLmhvcml6b250YWxdPVwiaG9yaXpvbnRhbFwiPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIHNjcm9sbHRyYWNrIHRvIG1vdmUgdGhlIHZpZXdwb3J0IGNsaWVudCBkb3dud2FyZHMgKHBhZ2luZykgLS0+XG48ZGl2IGNsYXNzPVwic2Nyb2xsdHJhY2stZW5kXCIgKG1vdXNlZG93bik9XCJvblNjcm9sbFRyYWNrTW91c2VEb3duKCRldmVudCwgJ2Rvd24nKVwiPjwvZGl2PlxuIl19
267
+ /**
268
+ * Emits whenever the viewport scrolls.
269
+ */
270
+ function viewportScroll$(viewport) {
271
+ return fromEvent(viewport, 'scroll', { passive: true }).pipe(map(() => undefined));
272
+ }
273
+ /**
274
+ * Emits on subscription, and then each time the size of the viewport changes.
275
+ */
276
+ function viewportSize$(viewport, options) {
277
+ return fromResize$(viewport)
278
+ .pipe(
279
+ // Debouncing is particularly important in the context of Angular animations, since they continuously
280
+ // trigger resize events. Debouncing prevents the scrollbar from flickering, for example, when the user
281
+ // expands a panel that contains a viewport.
282
+ debounceTime(options.debounceTime), map(() => undefined));
283
+ }
284
+ /**
285
+ * Emits on subscription, and then each time the size or style property of the viewport client changes.
286
+ */
287
+ function viewportClientSize$(viewport, options) {
288
+ return children$(viewport)
289
+ .pipe(switchMap(children => merge(...children.map(child => merge(fromResize$(child),
290
+ // Observe style mutations since some transformations change the scroll position without necessarily triggering a dimension change,
291
+ // e.g., `scale` or `translate` used by some virtual scroll implementations
292
+ fromMutation$(child, { subtree: false, childList: false, attributeFilter: ['style'] }))))),
293
+ // Debouncing is particularly important in the context of Angular animations, since they continuously
294
+ // trigger resize events. Debouncing prevents the scrollbar from flickering, for example, when the user
295
+ // expands a panel that contains a viewport.
296
+ debounceTime(options.debounceTime), map(() => undefined));
297
+ }
298
+ /**
299
+ * Emits the children of the passed element, and then each time child elements are added or removed.
300
+ */
301
+ function children$(element) {
302
+ return fromMutation$(element, { subtree: false, childList: true })
303
+ .pipe(startWith(undefined), map(() => Array.from(element.children)), filterArray((child) => child instanceof HTMLElement));
304
+ }
305
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL2NvbXBvbmVudHMvdmlld3BvcnQvc3JjL3Njcm9sbGJhci9zY3JvbGxiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vY29tcG9uZW50cy92aWV3cG9ydC9zcmMvc2Nyb2xsYmFyL3Njcm9sbGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNySyxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQWMsRUFBRSxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN4RSxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BILE9BQU8sRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7QUFFOUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBUUgsTUFBTSxPQUFPLHFCQUFxQjtJQUVo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USxDQUFDO1NBQ3ZCLElBQUksQ0FDSCxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUN4RCxXQUFXLENBQUMsS0FBSyxDQUFDO0lBQ2xCLG1JQUFtSTtJQUNuSSwyRUFBMkU7SUFDM0UsYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FDdEYsQ0FBQyxDQUFDO0lBQ0gscUdBQXFHO0lBQ3JHLHVHQUF1RztJQUN2Ryw0Q0FBNEM7SUFDNUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFDbEMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUNyQixDQUFDO0FBQ04sQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxTQUFTLENBQUMsT0FBb0I7SUFDckMsT0FBTyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUM7U0FDN0QsSUFBSSxDQUNILFNBQVMsQ0FBQyxTQUFpQixDQUFDLEVBQzVCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUN2QyxXQUFXLENBQUMsQ0FBQyxLQUFjLEVBQXdCLEVBQUUsQ0FBQyxLQUFLLFlBQVksV0FBVyxDQUFDLENBQ3BGLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIERlc3Ryb3lSZWYsIGVmZmVjdCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIGluamVjdCwgaW5wdXQsIE5nWm9uZSwgdW50cmFja2VkLCB2aWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtmcm9tRXZlbnQsIG1lcmdlLCBtZXJnZVdpdGgsIE9ic2VydmFibGUsIG9mLCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZmlyc3QsIG1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFrZVdoaWxlLCB3aXRoTGF0ZXN0RnJvbX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtmcm9tTXV0YXRpb24kLCBmcm9tUmVzaXplJH0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb2JzZXJ2YWJsZSc7XG5pbXBvcnQge2ZpbHRlckFycmF5LCBzdWJzY3JpYmVJbn0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbi8qKlxuICogUmVuZGVycyBhIHZlcnRpY2FsIG9yIGhvcml6b250YWwgc2Nyb2xsYmFyLlxuICpcbiAqIFRoZSBzY3JvbGxiYXIgZmVhdHVyZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbmFsaXR5OlxuICogLSBhbGxvd3MgdG8gbW92ZSB0aGUgdGh1bWIgYnkgbW91c2Ugb3IgdG91Y2hcbiAqIC0gZW5sYXJnZXMgdGhlIHRodW1iIGlmIHRoZSBtb3VzZSBwb2ludGVyIGlzIG5lYXIgdGhlIHRodW1iXG4gKiAtIGFsbG93cyBwYWdpbmcgb24gbW91c2Vkb3duIG9uIHRoZSBzY3JvbGwgdHJhY2tcbiAqXG4gKiAjIyMgU3R5bGluZzpcbiAqXG4gKiBUbyBjdXN0b21pemUgdGhlIGRlZmF1bHQgbG9vayBvZiBTQ0lPTiBjb21wb25lbnRzIG9yIHN1cHBvcnQgZGlmZmVyZW50IHRoZW1lcywgY29uZmlndXJlIHRoZSBgQHNjaW9uL2NvbXBvbmVudHNgIFNDU1MgbW9kdWxlIGluIGBzdHlsZXMuc2Nzc2AuXG4gKiBUbyBzdHlsZSBhIHNwZWNpZmljIGBzY2ktc2Nyb2xsYmFyYCBjb21wb25lbnQsIHRoZSBmb2xsb3dpbmcgQ1NTIHZhcmlhYmxlcyBjYW4gYmUgc2V0IGRpcmVjdGx5IG9uIHRoZSBjb21wb25lbnQuXG4gKlxuICogLSBzY2ktc2Nyb2xsYmFyLWNvbG9yOiAgICBTZXRzIHRoZSBjb2xvciBvZiB0aGUgc2Nyb2xsYmFyLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgY3NzXG4gKlxuICogc2NpLXNjcm9sbGJhciB7XG4gKiAgIC0tc2NpLXNjcm9sbGJhci1jb2xvcjogYmx1ZTtcbiAqIH1cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzY2ktc2Nyb2xsYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Njcm9sbGJhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9zY3JvbGxiYXIuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgU2NpU2Nyb2xsYmFyQ29tcG9uZW50IHtcblxuICAvKipcbiAgICogVGltZW91dCBmb3IgZGVib3VuY2luZyB2aWV3cG9ydCByZXNpemUgZXZlbnRzIHRoYXQgdHJpZ2dlciB0aGUgc2Nyb2xsIHBvc2l0aW9uIGNvbXB1dGF0aW9uLlxuICAgKlxuICAgKiBEZWJvdW5jaW5nIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgaW4gdGhlIGNvbnRleHQgb2YgQW5ndWxhciBhbmltYXRpb25zLCBzaW5jZSB0aGV5IGNvbnRpbnVvdXNseVxuICAgKiB0cmlnZ2VyIHJlc2l6ZSBldmVudHMuIERlYm91bmNpbmcgcHJldmVudHMgdGhlIHNjcm9sbGJhciBmcm9tIGZsaWNrZXJpbmcsIGZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyXG4gICAqIGV4cGFuZHMgYSBwYW5lbCB0aGF0IGNvbnRhaW5zIGEgdmlld3BvcnQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWSUVXUE9SVF9SRVNJWkVfREVCT1VOQ0VfVElNRSA9IDUwO1xuXG4gIHByaXZhdGUgX2hvc3QgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pLm5hdGl2ZUVsZW1lbnQ7XG4gIHByaXZhdGUgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgX2xhc3REcmFnUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9vdmVyZmxvdyA9IGZhbHNlO1xuICBwcml2YXRlIF90aHVtYlNpemVGciA9IDA7XG4gIHByaXZhdGUgX3RodW1iUG9zaXRpb25GciA9IDA7XG5cbiAgcHJpdmF0ZSBfdGh1bWJFbGVtZW50ID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PigndGh1bWJfaGFuZGxlJyk7XG4gIHByaXZhdGUgX3ZlcnRpY2FsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kaXJlY3Rpb24oKSA9PT0gJ3ZzY3JvbGwnKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnZlcnRpY2FsJylcbiAgcHVibGljIGdldCB2ZXJ0aWNhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmVydGljYWwoKTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaG9yaXpvbnRhbCcpXG4gIHB1YmxpYyBnZXQgaG9yaXpvbnRhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX3ZlcnRpY2FsKCk7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNjcm9sbGluZycpXG4gIHB1YmxpYyBnZXQgc2Nyb2xsaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzY3JvbGxiYXIuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGlmIG5vdCBzcGVjaWZpZWQsIHJlbmRlcnMgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIuXG4gICAqL1xuICBwdWJsaWMgZGlyZWN0aW9uID0gaW5wdXQ8J3ZzY3JvbGwnIHwgJ2hzY3JvbGwnPigndnNjcm9sbCcpO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgdG8gcHJvdmlkZSBzY3JvbGxiYXJzIGZvci5cbiAgICovXG4gIHB1YmxpYyB2aWV3cG9ydCA9IGlucHV0LnJlcXVpcmVkPEhUTUxFbGVtZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5zdGFsbFNjcm9sbFBvc2l0aW9uUmVuZGVyZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGFuZCB1cGRhdGVzIENTUyB2YXJpYWJsZXMgdG8gcmVuZGVyIHRoZSBzY3JvbGwgcG9zaXRpb24gaW4gdGhlIFVJLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJTY3JvbGxQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpO1xuICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IHRoaXMudmlld3BvcnRTaXplO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2xpZW50U2l6ZSA9IHRoaXMudmlld3BvcnRDbGllbnRTaXplO1xuICAgIGNvbnN0IHRodW1iUG9zaXRpb25GciA9IHRoaXMuc2Nyb2xsUG9zaXRpb24gLyB2aWV3cG9ydENsaWVudFNpemU7XG4gICAgY29uc3QgdGh1bWJTaXplRnIgPSB2aWV3cG9ydFNpemUgLyB2aWV3cG9ydENsaWVudFNpemU7XG4gICAgY29uc3Qgb3ZlcmZsb3cgPSB2aWV3cG9ydENsaWVudFNpemUgPiB2aWV3cG9ydFNpemU7XG5cbiAgICBpZiAodGh1bWJQb3NpdGlvbkZyICE9PSB0aGlzLl90aHVtYlBvc2l0aW9uRnIgfHwgdGh1bWJTaXplRnIgIT09IHRoaXMuX3RodW1iU2l6ZUZyKSB7XG4gICAgICB0aGlzLl90aHVtYlBvc2l0aW9uRnIgPSB0aHVtYlBvc2l0aW9uRnI7XG4gICAgICB0aGlzLl90aHVtYlNpemVGciA9IHRodW1iU2l6ZUZyO1xuICAgICAgdGhpcy5zZXRDc3NWYXJpYWJsZSgnLS3JtXNjaS1zY3JvbGxiYXItdGh1bWItcG9zaXRpb24tZnInLCB0aHVtYlBvc2l0aW9uRnIpO1xuICAgICAgdGhpcy5zZXRDc3NWYXJpYWJsZSgnLS3JtXNjaS1zY3JvbGxiYXItdGh1bWItc2l6ZS1mcicsIHRodW1iU2l6ZUZyKTtcbiAgICB9XG5cbiAgICBpZiAob3ZlcmZsb3cgIT09IHRoaXMuX292ZXJmbG93KSB7XG4gICAgICB0aGlzLl9vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgb3ZlcmZsb3cgPyB0aGlzLl9ob3N0LmNsYXNzTGlzdC5hZGQoJ292ZXJmbG93JykgOiB0aGlzLl9ob3N0LmNsYXNzTGlzdC5yZW1vdmUoJ292ZXJmbG93Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBDU1MgdmFyaWFibGVzIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGluIHRoZSBVSS5cbiAgICovXG4gIHByaXZhdGUgdW5zZXRTY3JvbGxQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpO1xuICAgIHRoaXMuX3RodW1iUG9zaXRpb25GciA9IDA7XG4gICAgdGhpcy5fdGh1bWJTaXplRnIgPSAwO1xuICAgIHRoaXMuX292ZXJmbG93ID0gZmFsc2U7XG4gICAgdGhpcy5zZXRDc3NWYXJpYWJsZSgnLS3JtXNjaS1zY3JvbGxiYXItdGh1bWItcG9zaXRpb24tZnInLCAwKTtcbiAgICB0aGlzLnNldENzc1ZhcmlhYmxlKCctLcm1c2NpLXNjcm9sbGJhci10aHVtYi1zaXplLWZyJywgMCk7XG4gICAgdGhpcy5faG9zdC5jbGFzc0xpc3QucmVtb3ZlKCdvdmVyZmxvdycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5fbGFzdERyYWdQb3NpdGlvbiA9IHRoaXMudmVydGljYWwgPyBldmVudC50b3VjaGVzWzBdLnNjcmVlblkgOiBldmVudC50b3VjaGVzWzBdLnNjcmVlblg7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Ub3VjaE1vdmUoZXZlbnQ6IFRvdWNoRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgbmV3RHJhZ1Bvc2l0aW9uUHggPSB0aGlzLnZlcnRpY2FsID8gZXZlbnQudG91Y2hlc1swXS5zY3JlZW5ZIDogZXZlbnQudG91Y2hlc1swXS5zY3JlZW5YO1xuICAgIGNvbnN0IHNjcm9sbGJhclBhblB4ID0gbmV3RHJhZ1Bvc2l0aW9uUHggLSB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uITtcbiAgICBjb25zdCB2aWV3cG9ydFBhblB4ID0gdGhpcy50b1ZpZXdwb3J0UGFuUHgoc2Nyb2xsYmFyUGFuUHgpO1xuICAgIHRoaXMuX2xhc3REcmFnUG9zaXRpb24gPSBuZXdEcmFnUG9zaXRpb25QeDtcbiAgICB0aGlzLm1vdmVWaWV3cG9ydENsaWVudCh2aWV3cG9ydFBhblB4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblRvdWNoRW5kKGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uID0gbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1vdXNlRG93bihtb3VzZWRvd25FdmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChtb3VzZWRvd25FdmVudC5idXR0b24gIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtb3VzZWRvd25FdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuX2xhc3REcmFnUG9zaXRpb24gPSB0aGlzLnZlcnRpY2FsID8gbW91c2Vkb3duRXZlbnQuc2NyZWVuWSA6IG1vdXNlZG93bkV2ZW50LnNjcmVlblg7XG5cbiAgICAvLyBMaXN0ZW4gZm9yICdtb3VzZW1vdmUnIGV2ZW50c1xuICAgIGNvbnN0IG1vdXNlbW92ZUxpc3RlbmVyID0gbWVyZ2UoZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuX2RvY3VtZW50LCAnbW91c2Vtb3ZlJyksIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLl9kb2N1bWVudCwgJ3NjaS1tb3VzZW1vdmUnKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzdWJzY3JpYmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUobW91c2Vtb3ZlRXZlbnQgPT4ge1xuICAgICAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpO1xuICAgICAgICBtb3VzZW1vdmVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBuZXdEcmFnUG9zaXRpb25QeCA9IHRoaXMudmVydGljYWwgPyBtb3VzZW1vdmVFdmVudC5zY3JlZW5ZIDogbW91c2Vtb3ZlRXZlbnQuc2NyZWVuWDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsYmFyUGFuUHggPSBuZXdEcmFnUG9zaXRpb25QeCAtIHRoaXMuX2xhc3REcmFnUG9zaXRpb24hO1xuICAgICAgICBjb25zdCB2aWV3cG9ydFBhblB4ID0gdGhpcy50b1ZpZXdwb3J0UGFuUHgoc2Nyb2xsYmFyUGFuUHgpO1xuICAgICAgICB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uID0gbmV3RHJhZ1Bvc2l0aW9uUHg7XG4gICAgICAgIHRoaXMubW92ZVZpZXdwb3J0Q2xpZW50KHZpZXdwb3J0UGFuUHgpO1xuICAgICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yICdtb3VzZXVwJyBldmVudHM7IHVzZSAnY2FwdHVyZSBwaGFzZScgYW5kICdzdG9wIHByb3BhZ2F0aW9uJyB0byBub3QgY2xvc2Ugb3ZlcmxheXNcbiAgICBtZXJnZShmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5fZG9jdW1lbnQsICdtb3VzZXVwJywge2NhcHR1cmU6IHRydWV9KSwgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuX2RvY3VtZW50LCAnc2NpLW1vdXNldXAnKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzdWJzY3JpYmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSksXG4gICAgICAgIGZpcnN0KCksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUobW91c2V1cEV2ZW50ID0+IHtcbiAgICAgICAgTmdab25lLmFzc2VydE5vdEluQW5ndWxhclpvbmUoKTtcbiAgICAgICAgbW91c2V1cEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBtb3VzZW1vdmVMaXN0ZW5lci51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9sYXN0RHJhZ1Bvc2l0aW9uID0gbnVsbDtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU2Nyb2xsVHJhY2tNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIGNvbnN0IHNpZ251bSA9IChkaXJlY3Rpb24gPT09ICd1cCcgPyAtMSA6ICsxKTtcbiAgICB0aGlzLnNjcm9sbFdoaWxlTW91c2VEb3duKHRoaXMudG9WaWV3cG9ydFBhblB4KHNpZ251bSAqIHRoaXMudGh1bWJTaXplKSwgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIHdoZW4gdGhlIHZpZXdwb3J0IGlzIHNjcm9sbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2Nyb2xsUG9zaXRpb25SZW5kZXJlcigpOiB2b2lkIHtcbiAgICBlZmZlY3Qob25DbGVhbnVwID0+IHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydCgpO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoIXZpZXdwb3J0KSB7XG4gICAgICAgICAgdGhpcy51bnNldFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdmlld3BvcnRTY3JvbGwkKHZpZXdwb3J0KVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgbWVyZ2VXaXRoKHZpZXdwb3J0U2l6ZSQodmlld3BvcnQsIHtkZWJvdW5jZVRpbWU6IFNjaVNjcm9sbGJhckNvbXBvbmVudC5WSUVXUE9SVF9SRVNJWkVfREVCT1VOQ0VfVElNRX0pKSxcbiAgICAgICAgICAgIG1lcmdlV2l0aCh2aWV3cG9ydENsaWVudFNpemUkKHZpZXdwb3J0LCB7ZGVib3VuY2VUaW1lOiBTY2lTY3JvbGxiYXJDb21wb25lbnQuVklFV1BPUlRfUkVTSVpFX0RFQk9VTkNFX1RJTUV9KSksXG4gICAgICAgICAgICBzdWJzY3JpYmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZW5kZXJTY3JvbGxQb3NpdGlvbigpKTtcbiAgICAgICAgb25DbGVhbnVwKCgpID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3RzIHRoZSBnaXZlbiBzY3JvbGxiYXIgc2Nyb2xsIHBpeGVscyBpbnRvIHZpZXdwb3J0IHNjcm9sbCBwaXhlbHMuXG4gICAqL1xuICBwcml2YXRlIHRvVmlld3BvcnRQYW5QeChzY3JvbGxiYXJQYW5QeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzY3JvbGxSYW5nZVB4ID0gdGhpcy50cmFja1NpemUgLSB0aGlzLnRodW1iU2l6ZTtcbiAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbGJhclBhblB4IC8gc2Nyb2xsUmFuZ2VQeDtcbiAgICByZXR1cm4gc2Nyb2xsUmF0aW8gKiAodGhpcy52aWV3cG9ydENsaWVudFNpemUgLSB0aGlzLnZpZXdwb3J0U2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdGhlIHZpZXdwb3J0IGNsaWVudCBieSB0aGUgc3BlY2lmaWVkIG51bWJlcnMgb2YgcGl4ZWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBtb3ZlVmlld3BvcnRDbGllbnQodmlld3BvcnRQYW5QeDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmVydGljYWwpIHtcbiAgICAgIHRoaXMudmlld3BvcnQoKS5zY3JvbGxUb3AgKz0gdmlld3BvcnRQYW5QeDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnZpZXdwb3J0KCkuc2Nyb2xsTGVmdCArPSB2aWV3cG9ydFBhblB4O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGNvbnRlbnQgb3ZlcmZsb3dzLlxuICAgKi9cbiAgcHVibGljIGdldCBvdmVyZmxvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmZsb3c7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyBjb250aW51b3VzbHkgd2hpbGUgaG9sZGluZyB0aGUgbW91c2UgcHJlc3NlZCwgb3IgdW50aWwgdGhlIG1vdXNlIGxlYXZlcyB0aGUgc2Nyb2xsdHJhY2suXG4gICAqL1xuICBwcml2YXRlIHNjcm9sbFdoaWxlTW91c2VEb3duKHZpZXdwb3J0U2Nyb2xsUHg6IG51bWJlciwgbW91c2Vkb3duRXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBUaGUgYEV2ZW50VGFyZ2V0YCB0eXBlIG9mIGBFdmVudC50YXJnZXRgIGlzIG5vdCB5ZXQgY29tcGF0aWJsZSB3aXRoIGBGcm9tRXZlbnRUYXJnZXRgIHVzZWQgaW4gYGZyb21FdmVudGAuXG4gICAgLy8gVGhpcyB3aWxsIGJlIGZpeGVkIGluIHJ4anMgdmVyc2lvbiA3LjAuMC4gUmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0aXZlWC9yeGpzL2NvbW1pdC81ZjAyMmQ3ODQ1NzA2ODQ2MzJlNmZkNWFlMjQ3ZmMyNTllZTM0YzRiXG4gICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICBjb25zdCBzY3JvbGxUcmFja0VsZW1lbnQgPSBtb3VzZWRvd25FdmVudC50YXJnZXQgYXMgRWxlbWVudDtcblxuICAgIC8vIHNjcm9sbCBjb250aW51b3VzbHkgZXZlcnkgNTBtcyBhZnRlciBhbiBpbml0aWFsIGRlbGF5IG9mIDI1MG1zXG4gICAgdGltZXIoMjUwLCA1MClcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBjb250aW51ZSBjaGFpbiB3aXRoIGxhdGVzdCBtb3VzZSBldmVudFxuICAgICAgICB3aXRoTGF0ZXN0RnJvbShtZXJnZShvZihtb3VzZWRvd25FdmVudCksIGZyb21FdmVudDxNb3VzZUV2ZW50PihzY3JvbGxUcmFja0VsZW1lbnQsICdtb3VzZW1vdmUnKSksICh0aWNrLCBldmVudCkgPT4gZXZlbnQpLFxuICAgICAgICAvLyBzdGFydCBpbW1lZGlhdGVseVxuICAgICAgICBzdGFydFdpdGgobW91c2Vkb3duRXZlbnQpLFxuICAgICAgICAvLyBzdG9wIHNjcm9sbGluZyBpZiB0aGUgdGh1bWIgaGl0cyB0aGUgbW91c2UgcG9pbnRlciBwb3NpdGlvblxuICAgICAgICB0YWtlV2hpbGUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiBzY3JvbGxUcmFja0VsZW1lbnQgPT09IHRoaXMuX2RvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSkpLFxuICAgICAgICBkZWJvdW5jZVRpbWUoMTApLFxuICAgICAgICAvLyBzdG9wIHNjcm9sbGluZyBvbiBtb3VzZW91dCBvciBtb3VzZXVwXG4gICAgICAgIHRha2VVbnRpbChtZXJnZShmcm9tRXZlbnQoc2Nyb2xsVHJhY2tFbGVtZW50LCAnbW91c2VvdXQnKSwgZnJvbUV2ZW50KHNjcm9sbFRyYWNrRWxlbWVudCwgJ21vdXNldXAnKSkpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubW92ZVZpZXdwb3J0Q2xpZW50KHZpZXdwb3J0U2Nyb2xsUHgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldENzc1ZhcmlhYmxlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5faG9zdC5zdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHZpZXdwb3J0U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0KCkgPyAodGhpcy52ZXJ0aWNhbCA/IHRoaXMudmlld3BvcnQoKS5jbGllbnRIZWlnaHQgOiB0aGlzLnZpZXdwb3J0KCkuY2xpZW50V2lkdGgpIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHZpZXdwb3J0Q2xpZW50U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0KCkgPyAodGhpcy52ZXJ0aWNhbCA/IHRoaXMudmlld3BvcnQoKS5zY3JvbGxIZWlnaHQgOiB0aGlzLnZpZXdwb3J0KCkuc2Nyb2xsV2lkdGgpIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHNjcm9sbFBvc2l0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudmlld3BvcnQoKSA/ICh0aGlzLnZlcnRpY2FsID8gdGhpcy52aWV3cG9ydCgpLnNjcm9sbFRvcCA6IHRoaXMudmlld3BvcnQoKS5zY3JvbGxMZWZ0KSA6IDA7XG4gIH1cblxuICBwcml2YXRlIGdldCB0aHVtYlNpemUoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aHVtYkVsZW1lbnQgPSB0aGlzLl90aHVtYkVsZW1lbnQoKS5uYXRpdmVFbGVtZW50O1xuICAgIHJldHVybiB0aGlzLnZlcnRpY2FsID8gdGh1bWJFbGVtZW50LmNsaWVudEhlaWdodCA6IHRodW1iRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHRyYWNrU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZlcnRpY2FsID8gdGhpcy5faG9zdC5jbGllbnRIZWlnaHQgOiB0aGlzLl9ob3N0LmNsaWVudFdpZHRoO1xuICB9XG59XG5cbi8qKlxuICogRW1pdHMgd2hlbmV2ZXIgdGhlIHZpZXdwb3J0IHNjcm9sbHMuXG4gKi9cbmZ1bmN0aW9uIHZpZXdwb3J0U2Nyb2xsJCh2aWV3cG9ydDogSFRNTEVsZW1lbnQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgcmV0dXJuIGZyb21FdmVudCh2aWV3cG9ydCwgJ3Njcm9sbCcsIHtwYXNzaXZlOiB0cnVlfSkucGlwZShtYXAoKCkgPT4gdW5kZWZpbmVkKSk7XG59XG5cbi8qKlxuICogRW1pdHMgb24gc3Vic2NyaXB0aW9uLCBhbmQgdGhlbiBlYWNoIHRpbWUgdGhlIHNpemUgb2YgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gKi9cbmZ1bmN0aW9uIHZpZXdwb3J0U2l6ZSQodmlld3BvcnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zOiB7ZGVib3VuY2VUaW1lOiBudW1iZXJ9KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIHJldHVybiBmcm9tUmVzaXplJCh2aWV3cG9ydClcbiAgICAucGlwZShcbiAgICAgIC8vIERlYm91bmNpbmcgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBpbiB0aGUgY29udGV4dCBvZiBBbmd1bGFyIGFuaW1hdGlvbnMsIHNpbmNlIHRoZXkgY29udGludW91c2x5XG4gICAgICAvLyB0cmlnZ2VyIHJlc2l6ZSBldmVudHMuIERlYm91bmNpbmcgcHJldmVudHMgdGhlIHNjcm9sbGJhciBmcm9tIGZsaWNrZXJpbmcsIGZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyXG4gICAgICAvLyBleHBhbmRzIGEgcGFuZWwgdGhhdCBjb250YWlucyBhIHZpZXdwb3J0LlxuICAgICAgZGVib3VuY2VUaW1lKG9wdGlvbnMuZGVib3VuY2VUaW1lKSxcbiAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICk7XG59XG5cbi8qKlxuICogRW1pdHMgb24gc3Vic2NyaXB0aW9uLCBhbmQgdGhlbiBlYWNoIHRpbWUgdGhlIHNpemUgb3Igc3R5bGUgcHJvcGVydHkgb2YgdGhlIHZpZXdwb3J0IGNsaWVudCBjaGFuZ2VzLlxuICovXG5mdW5jdGlvbiB2aWV3cG9ydENsaWVudFNpemUkKHZpZXdwb3J0OiBIVE1MRWxlbWVudCwgb3B0aW9uczoge2RlYm91bmNlVGltZTogbnVtYmVyfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICByZXR1cm4gY2hpbGRyZW4kKHZpZXdwb3J0KVxuICAgIC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGNoaWxkcmVuID0+IG1lcmdlKC4uLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBtZXJnZShcbiAgICAgICAgZnJvbVJlc2l6ZSQoY2hpbGQpLFxuICAgICAgICAvLyBPYnNlcnZlIHN0eWxlIG11dGF0aW9ucyBzaW5jZSBzb21lIHRyYW5zZm9ybWF0aW9ucyBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiB3aXRob3V0IG5lY2Vzc2FyaWx5IHRyaWdnZXJpbmcgYSBkaW1lbnNpb24gY2hhbmdlLFxuICAgICAgICAvLyBlLmcuLCBgc2NhbGVgIG9yIGB0cmFuc2xhdGVgIHVzZWQgYnkgc29tZSB2aXJ0dWFsIHNjcm9sbCBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgZnJvbU11dGF0aW9uJChjaGlsZCwge3N1YnRyZWU6IGZhbHNlLCBjaGlsZExpc3Q6IGZhbHNlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnc3R5bGUnXX0pKSxcbiAgICAgICkpKSxcbiAgICAgIC8vIERlYm91bmNpbmcgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBpbiB0aGUgY29udGV4dCBvZiBBbmd1bGFyIGFuaW1hdGlvbnMsIHNpbmNlIHRoZXkgY29udGludW91c2x5XG4gICAgICAvLyB0cmlnZ2VyIHJlc2l6ZSBldmVudHMuIERlYm91bmNpbmcgcHJldmVudHMgdGhlIHNjcm9sbGJhciBmcm9tIGZsaWNrZXJpbmcsIGZvciBleGFtcGxlLCB3aGVuIHRoZSB1c2VyXG4gICAgICAvLyBleHBhbmRzIGEgcGFuZWwgdGhhdCBjb250YWlucyBhIHZpZXdwb3J0LlxuICAgICAgZGVib3VuY2VUaW1lKG9wdGlvbnMuZGVib3VuY2VUaW1lKSxcbiAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICk7XG59XG5cbi8qKlxuICogRW1pdHMgdGhlIGNoaWxkcmVuIG9mIHRoZSBwYXNzZWQgZWxlbWVudCwgYW5kIHRoZW4gZWFjaCB0aW1lIGNoaWxkIGVsZW1lbnRzIGFyZSBhZGRlZCBvciByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBjaGlsZHJlbiQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBPYnNlcnZhYmxlPEhUTUxFbGVtZW50W10+IHtcbiAgcmV0dXJuIGZyb21NdXRhdGlvbiQoZWxlbWVudCwge3N1YnRyZWU6IGZhbHNlLCBjaGlsZExpc3Q6IHRydWV9KVxuICAgIC5waXBlKFxuICAgICAgc3RhcnRXaXRoKHVuZGVmaW5lZCBhcyB2b2lkKSxcbiAgICAgIG1hcCgoKSA9PiBBcnJheS5mcm9tKGVsZW1lbnQuY2hpbGRyZW4pKSxcbiAgICAgIGZpbHRlckFycmF5KChjaGlsZDogRWxlbWVudCk6IGNoaWxkIGlzIEhUTUxFbGVtZW50ID0+IGNoaWxkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpLFxuICAgICk7XG59XG4iLCI8IS0tIHNjcm9sbHRyYWNrIHRvIG1vdmUgdGhlIHZpZXdwb3J0IGNsaWVudCB1cHdhcmRzIChwYWdpbmcpIC0tPlxuPGRpdiBjbGFzcz1cInNjcm9sbHRyYWNrLXN0YXJ0XCIgKG1vdXNlZG93bik9XCJvblNjcm9sbFRyYWNrTW91c2VEb3duKCRldmVudCwgJ3VwJylcIj48L2Rpdj5cblxuPCEtLSBzY3JvbGx0aHVtYiAtLT5cbjxkaXYgI3RodW1iX2hhbmRsZVxuICAgICBjbGFzcz1cInRodW1iLWhhbmRsZVwiXG4gICAgIFtjbGFzcy52ZXJ0aWNhbF09XCJ2ZXJ0aWNhbFwiXG4gICAgIFtjbGFzcy5ob3Jpem9udGFsXT1cImhvcml6b250YWxcIlxuICAgICAobW91c2Vkb3duKT1cIm9uTW91c2VEb3duKCRldmVudClcIlxuICAgICAodG91Y2hzdGFydCk9XCJvblRvdWNoU3RhcnQoJGV2ZW50KVwiXG4gICAgICh0b3VjaG1vdmUpPVwib25Ub3VjaE1vdmUoJGV2ZW50KVwiXG4gICAgICh0b3VjaGVuZCk9XCJvblRvdWNoRW5kKCRldmVudClcIlxuICAgICAodG91Y2hjYW5jZWwpPVwib25Ub3VjaEVuZCgkZXZlbnQpXCI+XG4gIDxkaXYgY2xhc3M9XCJ0aHVtYlwiXG4gICAgICAgW2NsYXNzLnZlcnRpY2FsXT1cInZlcnRpY2FsXCJcbiAgICAgICBbY2xhc3MuaG9yaXpvbnRhbF09XCJob3Jpem9udGFsXCI+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gc2Nyb2xsdHJhY2sgdG8gbW92ZSB0aGUgdmlld3BvcnQgY2xpZW50IGRvd253YXJkcyAocGFnaW5nKSAtLT5cbjxkaXYgY2xhc3M9XCJzY3JvbGx0cmFjay1lbmRcIiAobW91c2Vkb3duKT1cIm9uU2Nyb2xsVHJhY2tNb3VzZURvd24oJGV2ZW50LCAnZG93bicpXCI+PC9kaXY+XG4iXX0=