@elxjs/ui 0.0.201 → 0.0.202

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.
@@ -7,9 +7,7 @@ export class EluxCarouselComponent {
7
7
  constructor(renderer) {
8
8
  this.renderer = renderer;
9
9
  this.itemsPerSlide = 4;
10
- this.removeArrows = false;
11
- this.removeDots = false;
12
- this.autoPlayInterval = null;
10
+ this.title = '';
13
11
  this.previousClickEventEmitter = new EventEmitter();
14
12
  this.nextClickEventEmitter = new EventEmitter();
15
13
  this.dotClickEventEmitter = new EventEmitter();
@@ -44,9 +42,6 @@ export class EluxCarouselComponent {
44
42
  this.setItemWidths();
45
43
  this.updateLimits();
46
44
  this.setupClickPrevention();
47
- if (this.autoPlayInterval) {
48
- this.startAutoPlay();
49
- }
50
45
  this.items.changes.subscribe(() => {
51
46
  this.calculateDimensions();
52
47
  this.setItemWidths();
@@ -58,7 +53,6 @@ export class EluxCarouselComponent {
58
53
  window.addEventListener('resize', () => this.onResize());
59
54
  }
60
55
  ngOnDestroy() {
61
- this.stopAutoPlay();
62
56
  if (this.animationId) {
63
57
  cancelAnimationFrame(this.animationId);
64
58
  }
@@ -78,6 +72,13 @@ export class EluxCarouselComponent {
78
72
  this.maxOffset = 0;
79
73
  this.minOffset = -((totalSteps - 1) * 100);
80
74
  }
75
+ canGoNext() {
76
+ const totalSteps = Math.ceil(this.items.length / this.itemsPerSlide);
77
+ return this.currentStepIndex < totalSteps - 1;
78
+ }
79
+ canGoPrevious() {
80
+ return this.currentStepIndex > 0;
81
+ }
81
82
  onResize() {
82
83
  this.calculateDimensions();
83
84
  this.updateOffset();
@@ -88,20 +89,6 @@ export class EluxCarouselComponent {
88
89
  this.renderer.setStyle(item.nativeElement, 'minWidth', minWidth);
89
90
  });
90
91
  }
91
- startAutoPlay() {
92
- this.stopAutoPlay();
93
- this.autoPlayTimer = setInterval(() => {
94
- if (!this.isDragging) {
95
- this.nextSlide();
96
- }
97
- }, (this.autoPlayInterval || 0) * 1000);
98
- }
99
- stopAutoPlay() {
100
- if (this.autoPlayTimer) {
101
- clearInterval(this.autoPlayTimer);
102
- this.autoPlayTimer = null;
103
- }
104
- }
105
92
  // Mouse events
106
93
  onMouseDown(event) {
107
94
  event.preventDefault();
@@ -220,7 +207,6 @@ export class EluxCarouselComponent {
220
207
  this.lastMoveTime = Date.now();
221
208
  this.lastMoveX = clientX;
222
209
  this.calculateDimensions();
223
- this.stopAutoPlay();
224
210
  // Disable CSS transitions during drag
225
211
  this.renderer.setStyle(this.slidesContainer.nativeElement, 'transition', 'none');
226
212
  }
@@ -244,6 +230,11 @@ export class EluxCarouselComponent {
244
230
  this.lastMoveX = clientX;
245
231
  // Convert pixel movement to percentage
246
232
  const dragPercentage = (totalDeltaX / this.containerWidth) * 100;
233
+ if ((this.currentStepIndex === 0 && dragPercentage > 0) ||
234
+ (!this.canGoNext() && dragPercentage < 0)) {
235
+ this.updateOffset();
236
+ return;
237
+ }
247
238
  // Apply resistance at boundaries
248
239
  let resistedDragPercentage = dragPercentage;
249
240
  const potentialOffset = this.initialOffset + dragPercentage;
@@ -280,13 +271,16 @@ export class EluxCarouselComponent {
280
271
  }, 250);
281
272
  // Re-enable CSS transitions
282
273
  this.renderer.setStyle(this.slidesContainer.nativeElement, 'transition', 'transform 0.4s ease-out');
283
- const finalOffset = this.initialOffset + this.dragOffset;
284
274
  const threshold = 40;
285
275
  const dragDistance = Math.abs(this.currentX - this.startX);
286
276
  // Check for momentum (velocity-based slide change)
287
277
  const momentumThreshold = 0.3;
288
278
  const hasSignificantVelocity = Math.abs(this.velocity) > momentumThreshold;
289
- if (dragDistance > threshold || hasSignificantVelocity) {
279
+ if ((this.currentStepIndex === 0 && (this.dragOffset > 0 || this.velocity > 0)) ||
280
+ (!this.canGoNext() && (this.dragOffset < 0 || this.velocity < 0))) {
281
+ this.updateOffset();
282
+ }
283
+ else if (dragDistance > threshold || hasSignificantVelocity) {
290
284
  if (this.dragOffset > 0 || (hasSignificantVelocity && this.velocity > 0)) {
291
285
  // Dragged right or has positive velocity - go to previous slide
292
286
  this.prevSlide();
@@ -307,10 +301,6 @@ export class EluxCarouselComponent {
307
301
  // Reset drag state
308
302
  this.dragOffset = 0;
309
303
  this.velocity = 0;
310
- // Restart autoplay if it was enabled
311
- if (this.autoPlayInterval) {
312
- setTimeout(() => this.startAutoPlay(), 1000);
313
- }
314
304
  }
315
305
  getStepIndexCount() {
316
306
  const totalSteps = Math.ceil(this.items.length / this.itemsPerSlide);
@@ -333,29 +323,19 @@ export class EluxCarouselComponent {
333
323
  this.dotClickEventEmitter.emit();
334
324
  }
335
325
  prevSlide() {
336
- const totalSteps = Math.ceil(this.items.length / this.itemsPerSlide);
337
- if (this.currentStepIndex > 0) {
338
- this.currentStepIndex--;
339
- this.currentIndex = this.currentStepIndex * this.itemsPerSlide;
340
- }
341
- else {
342
- this.currentStepIndex = totalSteps - 1;
343
- this.currentIndex = Math.min(this.currentStepIndex * this.itemsPerSlide, this.items.length - this.itemsPerSlide);
344
- }
326
+ if (!this.canGoPrevious())
327
+ return;
328
+ this.currentStepIndex--;
329
+ this.currentIndex = this.currentStepIndex * this.itemsPerSlide;
345
330
  this.updateOffset();
346
331
  this.scrollActiveDotIntoView(this.currentStepIndex);
347
332
  this.previousClickEventEmitter.emit();
348
333
  }
349
334
  nextSlide() {
350
- const totalSteps = Math.ceil(this.items.length / this.itemsPerSlide);
351
- if (this.currentStepIndex >= totalSteps - 1) {
352
- this.currentStepIndex = 0;
353
- this.currentIndex = 0;
354
- }
355
- else {
356
- this.currentStepIndex++;
357
- this.currentIndex = Math.min(this.currentStepIndex * this.itemsPerSlide, this.items.length - this.itemsPerSlide);
358
- }
335
+ if (!this.canGoNext())
336
+ return;
337
+ this.currentStepIndex++;
338
+ this.currentIndex = Math.min(this.currentStepIndex * this.itemsPerSlide, this.items.length - this.itemsPerSlide);
359
339
  this.updateOffset();
360
340
  this.scrollActiveDotIntoView(this.currentStepIndex);
361
341
  this.nextClickEventEmitter.emit();
@@ -385,11 +365,11 @@ export class EluxCarouselComponent {
385
365
  });
386
366
  }
387
367
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EluxCarouselComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
388
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: EluxCarouselComponent, isStandalone: true, selector: "lib-elux-carousel", inputs: { itemsPerSlide: "itemsPerSlide", removeArrows: "removeArrows", removeDots: "removeDots", autoPlayInterval: "autoPlayInterval" }, outputs: { previousClickEventEmitter: "previousClickEventEmitter", nextClickEventEmitter: "nextClickEventEmitter", dotClickEventEmitter: "dotClickEventEmitter" }, queries: [{ propertyName: "items", predicate: ["carouselItem"], read: ElementRef }], viewQueries: [{ propertyName: "dotsContainer", first: true, predicate: ["dotsContainer"], descendants: true }, { propertyName: "slidesContainer", first: true, predicate: ["slidesContainer"], descendants: true }], ngImport: i0, template: "<div class=\"c-carousel-container\">\n <div \n class=\"c-carousel-slides\" \n #slidesContainer\n [style.transform]=\"'translateX(' + offset + '%)'\" \n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n (mouseleave)=\"onMouseLeave($event)\"\n (touchstart)=\"onTouchStart($event)\" \n (touchmove)=\"onTouchMove($event)\" \n (touchend)=\"onTouchEnd($event)\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"c-carousel-footer\">\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav prev\" title=\"Slide anterior\" aria-label=\"Slide anterior\" (click)=\"prevSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Left.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n\n <div [hidden]=\"removeDots\" class=\"c-carousel-dots\" #dotsContainer>\n <span\n role=\"button\"\n class=\"dot\"\n *ngFor=\"let index of getStepIndexCount()\"\n (click)=\"goToSlide(index)\"\n (keyup)=\"goToSlide(index)\"\n [class.active]=\"index === getCurrentStepIndex()\"\n [attr.aria-disabled]=\"true\"\n [attr.aria-label]=\"'pagina' + (index + 1)\"\n >\n </span>\n </div>\n\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav next\" title=\"Pr\u00F3ximo slide\" aria-label=\"Pr\u00F3ximo slide\" (click)=\"nextSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Right.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n </div>\n</div>\n", styles: [".display{font-family:Electrolux Sans;font-size:48px;font-weight:700;line-height:56px}.heading-1{font-family:Electrolux Sans;font-size:34px;font-weight:700;line-height:40px}.heading-2{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}@media screen and (max-width: 768px){.display{font-family:Electrolux Sans;font-size:40px;font-weight:700;line-height:46px}.heading-1{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-2{font-family:Electrolux Sans;font-size:24px;font-weight:600;line-height:28px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}}.c-carousel-container{position:relative;width:100%}.c-carousel-slides{display:flex;transition:transform .4s ease-out;touch-action:pan-y;cursor:grab;-webkit-user-select:none;user-select:none;will-change:transform}.c-carousel-slides:active{cursor:grabbing}.c-carousel-item{display:flex;flex-direction:column;text-align:center;align-items:center;justify-content:center;gap:16px;height:150px;margin:6px;border:1px solid #dee7ea;border-radius:2px;cursor:pointer;pointer-events:auto}.c-carousel-item .c-span{font-weight:400;font-size:18px;color:#011e41}.c-carousel-footer{width:min-content;margin:auto;display:flex;align-items:center;justify-content:space-between;padding:16px 0 24px}.c-carousel-footer .c-carousel-nav{background:none;border:none;cursor:pointer;padding:8px;border-radius:50px;background-color:#dfe7ea;transition:all ease-in-out .2s;z-index:2}.c-carousel-footer .c-carousel-nav:hover{transform:scale(1.1)}.c-carousel-footer .c-carousel-nav ::ng-deep span{display:block}.c-carousel-footer .c-carousel-dots{padding:6px;display:flex;text-align:center;border:1px solid #020f2e;border-radius:16px;margin:0 16px;max-width:120px;overflow:hidden;position:relative}@media (max-width: 768px){.c-carousel-footer .c-carousel-dots{margin:0 12px;max-width:100px}}.c-carousel-footer .dot{height:10px;width:10px;margin:0 5px;background-color:#dfe7ea;border-radius:50%;display:inline-block;cursor:pointer;transition:all ease-in-out .2s;flex-shrink:0}.c-carousel-footer .dot:hover,.c-carousel-footer .dot.active{background-color:#011e41}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: EluxIcon, selector: "lib-elux-icon", inputs: ["color", "useSubscription", "icon", "description", "size", "height", "width", "sizeType"] }] }); }
368
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: EluxCarouselComponent, isStandalone: true, selector: "lib-elux-carousel", inputs: { itemsPerSlide: "itemsPerSlide", title: "title" }, outputs: { previousClickEventEmitter: "previousClickEventEmitter", nextClickEventEmitter: "nextClickEventEmitter", dotClickEventEmitter: "dotClickEventEmitter" }, queries: [{ propertyName: "items", predicate: ["carouselItem"], read: ElementRef }], viewQueries: [{ propertyName: "dotsContainer", first: true, predicate: ["dotsContainer"], descendants: true }, { propertyName: "slidesContainer", first: true, predicate: ["slidesContainer"], descendants: true }], ngImport: i0, template: "<div class=\"c-carousel-container\">\n <div *ngIf=\"title\" class=\"c-carousel-header\">\n <div class=\"c-carousel-header-inner\">\n <div class=\"c-carousel-title\">{{ title }}</div>\n <div class=\"c-carousel-controls\">\n <button\n class=\"c-carousel-nav prev\"\n [disabled]=\"!canGoPrevious()\"\n title=\"Slide anterior\"\n aria-label=\"Slide anterior\"\n (click)=\"prevSlide()\"\n >\n <lib-elux-icon [icon]=\"'Chevron_Left.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n\n <button\n class=\"c-carousel-nav next\"\n [disabled]=\"!canGoNext()\"\n title=\"Pr\u00F3ximo slide\"\n aria-label=\"Pr\u00F3ximo slide\"\n (click)=\"nextSlide()\"\n >\n <lib-elux-icon [icon]=\"'Chevron_Right.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n </div>\n </div>\n </div>\n <div \n class=\"c-carousel-slides\" \n #slidesContainer\n [style.transform]=\"'translateX(' + offset + '%)'\" \n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n (mouseleave)=\"onMouseLeave($event)\"\n (touchstart)=\"onTouchStart($event)\" \n (touchmove)=\"onTouchMove($event)\" \n (touchend)=\"onTouchEnd($event)\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"c-carousel-footer\">\n <button *ngIf=\"!title\" class=\"c-carousel-nav prev\" [disabled]=\"!canGoPrevious()\" title=\"Slide anterior\" aria-label=\"Slide anterior\" (click)=\"prevSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Left.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n\n <div class=\"c-carousel-dots\" #dotsContainer>\n <span\n role=\"button\"\n class=\"dot\"\n *ngFor=\"let index of getStepIndexCount()\"\n (click)=\"goToSlide(index)\"\n (keyup)=\"goToSlide(index)\"\n [class.active]=\"index === getCurrentStepIndex()\"\n [attr.aria-disabled]=\"true\"\n [attr.aria-label]=\"'pagina' + (index + 1)\"\n >\n </span>\n </div>\n\n <button *ngIf=\"!title\" class=\"c-carousel-nav next\" [disabled]=\"!canGoNext()\" title=\"Pr\u00F3ximo slide\" aria-label=\"Pr\u00F3ximo slide\" (click)=\"nextSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Right.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n </div>\n</div>\n", styles: [".display{font-family:Electrolux Sans;font-size:48px;font-weight:700;line-height:56px}.heading-1{font-family:Electrolux Sans;font-size:34px;font-weight:700;line-height:40px}.heading-2{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}@media screen and (max-width: 768px){.display{font-family:Electrolux Sans;font-size:40px;font-weight:700;line-height:46px}.heading-1{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-2{font-family:Electrolux Sans;font-size:24px;font-weight:600;line-height:28px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}}.c-carousel-container{position:relative;width:100%}.c-carousel-controls{display:flex;align-items:center;gap:12px}.c-carousel-nav{background:none;border:none;cursor:pointer;width:24px;height:24px;padding:0;border-radius:50%;background-color:#e9ebed;transition:all ease-in-out .2s;z-index:2;display:inline-flex;align-items:center;justify-content:center}.c-carousel-nav:hover:not(:disabled){transform:scale(1.2)}.c-carousel-nav:disabled{opacity:.2;cursor:not-allowed}.c-carousel-nav:disabled:hover{transform:none}.c-carousel-nav ::ng-deep span{display:block}.c-carousel-header{margin-bottom:32px}@media (min-width: 992px){.c-carousel-header{margin-bottom:40px}}.c-carousel-header .c-carousel-header-inner{display:flex;align-items:center;justify-content:space-between;gap:16px}.c-carousel-header .c-carousel-header-inner .c-carousel-title{font-size:20px;font-weight:600;line-height:24px;color:#011e41}@media (min-width: 992px){.c-carousel-header .c-carousel-header-inner .c-carousel-title{font-size:32px;line-height:35px}}.c-carousel-slides{display:flex;transition:transform .4s ease-out;touch-action:pan-y;cursor:grab;-webkit-user-select:none;user-select:none;will-change:transform}.c-carousel-slides:active{cursor:grabbing}.c-carousel-item{display:flex;flex-direction:column;text-align:center;align-items:center;justify-content:center;gap:16px;height:150px;margin:6px;border:1px solid #dee7ea;border-radius:2px;cursor:pointer;pointer-events:auto}.c-carousel-item .c-span{font-weight:400;font-size:18px;color:#011e41}.c-carousel-footer{width:min-content;margin:32px auto;display:flex;align-items:center;justify-content:space-between;padding:0}@media (min-width: 992px){.c-carousel-footer{margin:40px auto}}.c-carousel-footer .c-carousel-dots{padding:6px;display:flex;text-align:center;border-radius:16px;margin:0 16px;max-width:120px;overflow:hidden;position:relative}@media (max-width: 768px){.c-carousel-footer .c-carousel-dots{margin:0 12px;max-width:100px}}.c-carousel-footer .dot{height:10px;width:10px;margin:0 5px;background-color:#dfe7ea;border-radius:50%;display:inline-block;cursor:pointer;transition:all ease-in-out .2s;flex-shrink:0}.c-carousel-footer .dot:hover{background-color:#011e41}.c-carousel-footer .dot.active{background-color:#3d5275}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: EluxIcon, selector: "lib-elux-icon", inputs: ["color", "useSubscription", "icon", "description", "size", "height", "width", "sizeType"] }] }); }
389
369
  }
390
370
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EluxCarouselComponent, decorators: [{
391
371
  type: Component,
392
- args: [{ standalone: true, selector: 'lib-elux-carousel', imports: [CommonModule, EluxIcon], template: "<div class=\"c-carousel-container\">\n <div \n class=\"c-carousel-slides\" \n #slidesContainer\n [style.transform]=\"'translateX(' + offset + '%)'\" \n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n (mouseleave)=\"onMouseLeave($event)\"\n (touchstart)=\"onTouchStart($event)\" \n (touchmove)=\"onTouchMove($event)\" \n (touchend)=\"onTouchEnd($event)\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"c-carousel-footer\">\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav prev\" title=\"Slide anterior\" aria-label=\"Slide anterior\" (click)=\"prevSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Left.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n\n <div [hidden]=\"removeDots\" class=\"c-carousel-dots\" #dotsContainer>\n <span\n role=\"button\"\n class=\"dot\"\n *ngFor=\"let index of getStepIndexCount()\"\n (click)=\"goToSlide(index)\"\n (keyup)=\"goToSlide(index)\"\n [class.active]=\"index === getCurrentStepIndex()\"\n [attr.aria-disabled]=\"true\"\n [attr.aria-label]=\"'pagina' + (index + 1)\"\n >\n </span>\n </div>\n\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav next\" title=\"Pr\u00F3ximo slide\" aria-label=\"Pr\u00F3ximo slide\" (click)=\"nextSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Right.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n </div>\n</div>\n", styles: [".display{font-family:Electrolux Sans;font-size:48px;font-weight:700;line-height:56px}.heading-1{font-family:Electrolux Sans;font-size:34px;font-weight:700;line-height:40px}.heading-2{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}@media screen and (max-width: 768px){.display{font-family:Electrolux Sans;font-size:40px;font-weight:700;line-height:46px}.heading-1{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-2{font-family:Electrolux Sans;font-size:24px;font-weight:600;line-height:28px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}}.c-carousel-container{position:relative;width:100%}.c-carousel-slides{display:flex;transition:transform .4s ease-out;touch-action:pan-y;cursor:grab;-webkit-user-select:none;user-select:none;will-change:transform}.c-carousel-slides:active{cursor:grabbing}.c-carousel-item{display:flex;flex-direction:column;text-align:center;align-items:center;justify-content:center;gap:16px;height:150px;margin:6px;border:1px solid #dee7ea;border-radius:2px;cursor:pointer;pointer-events:auto}.c-carousel-item .c-span{font-weight:400;font-size:18px;color:#011e41}.c-carousel-footer{width:min-content;margin:auto;display:flex;align-items:center;justify-content:space-between;padding:16px 0 24px}.c-carousel-footer .c-carousel-nav{background:none;border:none;cursor:pointer;padding:8px;border-radius:50px;background-color:#dfe7ea;transition:all ease-in-out .2s;z-index:2}.c-carousel-footer .c-carousel-nav:hover{transform:scale(1.1)}.c-carousel-footer .c-carousel-nav ::ng-deep span{display:block}.c-carousel-footer .c-carousel-dots{padding:6px;display:flex;text-align:center;border:1px solid #020f2e;border-radius:16px;margin:0 16px;max-width:120px;overflow:hidden;position:relative}@media (max-width: 768px){.c-carousel-footer .c-carousel-dots{margin:0 12px;max-width:100px}}.c-carousel-footer .dot{height:10px;width:10px;margin:0 5px;background-color:#dfe7ea;border-radius:50%;display:inline-block;cursor:pointer;transition:all ease-in-out .2s;flex-shrink:0}.c-carousel-footer .dot:hover,.c-carousel-footer .dot.active{background-color:#011e41}\n"] }]
372
+ args: [{ standalone: true, selector: 'lib-elux-carousel', imports: [CommonModule, EluxIcon], template: "<div class=\"c-carousel-container\">\n <div *ngIf=\"title\" class=\"c-carousel-header\">\n <div class=\"c-carousel-header-inner\">\n <div class=\"c-carousel-title\">{{ title }}</div>\n <div class=\"c-carousel-controls\">\n <button\n class=\"c-carousel-nav prev\"\n [disabled]=\"!canGoPrevious()\"\n title=\"Slide anterior\"\n aria-label=\"Slide anterior\"\n (click)=\"prevSlide()\"\n >\n <lib-elux-icon [icon]=\"'Chevron_Left.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n\n <button\n class=\"c-carousel-nav next\"\n [disabled]=\"!canGoNext()\"\n title=\"Pr\u00F3ximo slide\"\n aria-label=\"Pr\u00F3ximo slide\"\n (click)=\"nextSlide()\"\n >\n <lib-elux-icon [icon]=\"'Chevron_Right.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n </div>\n </div>\n </div>\n <div \n class=\"c-carousel-slides\" \n #slidesContainer\n [style.transform]=\"'translateX(' + offset + '%)'\" \n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n (mouseleave)=\"onMouseLeave($event)\"\n (touchstart)=\"onTouchStart($event)\" \n (touchmove)=\"onTouchMove($event)\" \n (touchend)=\"onTouchEnd($event)\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"c-carousel-footer\">\n <button *ngIf=\"!title\" class=\"c-carousel-nav prev\" [disabled]=\"!canGoPrevious()\" title=\"Slide anterior\" aria-label=\"Slide anterior\" (click)=\"prevSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Left.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n\n <div class=\"c-carousel-dots\" #dotsContainer>\n <span\n role=\"button\"\n class=\"dot\"\n *ngFor=\"let index of getStepIndexCount()\"\n (click)=\"goToSlide(index)\"\n (keyup)=\"goToSlide(index)\"\n [class.active]=\"index === getCurrentStepIndex()\"\n [attr.aria-disabled]=\"true\"\n [attr.aria-label]=\"'pagina' + (index + 1)\"\n >\n </span>\n </div>\n\n <button *ngIf=\"!title\" class=\"c-carousel-nav next\" [disabled]=\"!canGoNext()\" title=\"Pr\u00F3ximo slide\" aria-label=\"Pr\u00F3ximo slide\" (click)=\"nextSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Right.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n </div>\n</div>\n", styles: [".display{font-family:Electrolux Sans;font-size:48px;font-weight:700;line-height:56px}.heading-1{font-family:Electrolux Sans;font-size:34px;font-weight:700;line-height:40px}.heading-2{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}@media screen and (max-width: 768px){.display{font-family:Electrolux Sans;font-size:40px;font-weight:700;line-height:46px}.heading-1{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-2{font-family:Electrolux Sans;font-size:24px;font-weight:600;line-height:28px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}}.c-carousel-container{position:relative;width:100%}.c-carousel-controls{display:flex;align-items:center;gap:12px}.c-carousel-nav{background:none;border:none;cursor:pointer;width:24px;height:24px;padding:0;border-radius:50%;background-color:#e9ebed;transition:all ease-in-out .2s;z-index:2;display:inline-flex;align-items:center;justify-content:center}.c-carousel-nav:hover:not(:disabled){transform:scale(1.2)}.c-carousel-nav:disabled{opacity:.2;cursor:not-allowed}.c-carousel-nav:disabled:hover{transform:none}.c-carousel-nav ::ng-deep span{display:block}.c-carousel-header{margin-bottom:32px}@media (min-width: 992px){.c-carousel-header{margin-bottom:40px}}.c-carousel-header .c-carousel-header-inner{display:flex;align-items:center;justify-content:space-between;gap:16px}.c-carousel-header .c-carousel-header-inner .c-carousel-title{font-size:20px;font-weight:600;line-height:24px;color:#011e41}@media (min-width: 992px){.c-carousel-header .c-carousel-header-inner .c-carousel-title{font-size:32px;line-height:35px}}.c-carousel-slides{display:flex;transition:transform .4s ease-out;touch-action:pan-y;cursor:grab;-webkit-user-select:none;user-select:none;will-change:transform}.c-carousel-slides:active{cursor:grabbing}.c-carousel-item{display:flex;flex-direction:column;text-align:center;align-items:center;justify-content:center;gap:16px;height:150px;margin:6px;border:1px solid #dee7ea;border-radius:2px;cursor:pointer;pointer-events:auto}.c-carousel-item .c-span{font-weight:400;font-size:18px;color:#011e41}.c-carousel-footer{width:min-content;margin:32px auto;display:flex;align-items:center;justify-content:space-between;padding:0}@media (min-width: 992px){.c-carousel-footer{margin:40px auto}}.c-carousel-footer .c-carousel-dots{padding:6px;display:flex;text-align:center;border-radius:16px;margin:0 16px;max-width:120px;overflow:hidden;position:relative}@media (max-width: 768px){.c-carousel-footer .c-carousel-dots{margin:0 12px;max-width:100px}}.c-carousel-footer .dot{height:10px;width:10px;margin:0 5px;background-color:#dfe7ea;border-radius:50%;display:inline-block;cursor:pointer;transition:all ease-in-out .2s;flex-shrink:0}.c-carousel-footer .dot:hover{background-color:#011e41}.c-carousel-footer .dot.active{background-color:#3d5275}\n"] }]
393
373
  }], ctorParameters: () => [{ type: i0.Renderer2 }], propDecorators: { items: [{
394
374
  type: ContentChildren,
395
375
  args: ['carouselItem', { read: ElementRef }]
@@ -401,11 +381,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
401
381
  args: ['slidesContainer']
402
382
  }], itemsPerSlide: [{
403
383
  type: Input
404
- }], removeArrows: [{
405
- type: Input
406
- }], removeDots: [{
407
- type: Input
408
- }], autoPlayInterval: [{
384
+ }], title: [{
409
385
  type: Input
410
386
  }], previousClickEventEmitter: [{
411
387
  type: Output
@@ -414,4 +390,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
414
390
  }], dotClickEventEmitter: [{
415
391
  type: Output
416
392
  }] } });
417
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdWkvbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY2Fyb3VzZWwvY2Fyb3VzZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdWkvbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY2Fyb3VzZWwvY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBb0IsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQXdCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7QUFjbkMsTUFBTSxPQUFPLHFCQUFxQjtJQTBDaEMsWUFBb0IsUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQXJDOUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBRXRDLDhCQUF5QixHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFDdEQsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNsRCx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBRTNELGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLHFCQUFnQixHQUFHLENBQUMsQ0FBQztRQUNyQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRUgsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsYUFBUSxHQUFHLENBQUMsQ0FB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akMsUUFBUSxFQUFFLFFBQVE7YUFDbkIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQXBjVSxxQkFBcUI7bUdBQXJCLHFCQUFxQix3YUFDUyxVQUFVLGtQQ2pCckQsK2pEQXVDQSx3L0ZEekJZLFlBQVksNEpBQUUsUUFBUTs7NEZBRXJCLHFCQUFxQjtrQkFQakMsU0FBUztpQ0FDSSxJQUFJLFlBQ04sbUJBQW1CLFdBR3BCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQzs4RUFHc0IsS0FBSztzQkFBM0QsZUFBZTt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUN6QixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0ksZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBRW5CLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFSSx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgUmVuZGVyZXIyLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVsdXhJY29uIH0gZnJvbSAnLi4vaWNvbic7XG5cbmV4cG9ydCB0eXBlIFByb2R1Y3RJdGVtID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGltYWdlOiBzdHJpbmc7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdsaWItZWx1eC1jYXJvdXNlbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYXJvdXNlbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Nhcm91c2VsLmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEVsdXhJY29uXSxcbn0pXG5leHBvcnQgY2xhc3MgRWx1eENhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgQENvbnRlbnRDaGlsZHJlbignY2Fyb3VzZWxJdGVtJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGl0ZW1zITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkKCdkb3RzQ29udGFpbmVyJykgZG90c0NvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3NsaWRlc0NvbnRhaW5lcicpIHNsaWRlc0NvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgaXRlbXNQZXJTbGlkZTogbnVtYmVyID0gNDtcbiAgQElucHV0KCkgcmVtb3ZlQXJyb3dzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJlbW92ZURvdHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYXV0b1BsYXlJbnRlcnZhbDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgQE91dHB1dCgpIHByZXZpb3VzQ2xpY2tFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCkgbmV4dENsaWNrRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRvdENsaWNrRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcblxuICBjdXJyZW50SW5kZXggPSAwO1xuICBjdXJyZW50U3RlcEluZGV4ID0gMDtcbiAgb2Zmc2V0ID0gMDtcblxuICBwcml2YXRlIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdGFydFggPSAwO1xuICBwcml2YXRlIGN1cnJlbnRYID0gMDtcbiAgcHJpdmF0ZSBpbml0aWFsT2Zmc2V0ID0gMDtcbiAgcHJpdmF0ZSBkcmFnT2Zmc2V0ID0gMDtcbiAgcHJpdmF0ZSBjb250YWluZXJXaWR0aCA9IDA7XG4gIHByaXZhdGUgaXRlbVdpZHRoID0gMDtcbiAgcHJpdmF0ZSBtYXhPZmZzZXQgPSAwO1xuICBwcml2YXRlIG1pbk9mZnNldCA9IDA7XG4gIHByaXZhdGUgYXV0b1BsYXlUaW1lcjogYW55O1xuICBwcml2YXRlIGFuaW1hdGlvbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2ZWxvY2l0eSA9IDA7XG4gIHByaXZhdGUgbGFzdE1vdmVUaW1lID0gMDtcbiAgcHJpdmF0ZSBsYXN0TW92ZVggPSAwO1xuICBwcml2YXRlIHRvdWNoU3RhcnRUaW1lID0gMDtcbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0WCA9IDA7XG4gIHByaXZhdGUgdG91Y2hTdGFydFkgPSAwO1xuICBwcml2YXRlIGlzVmVydGljYWxTY3JvbGwgPSBmYWxzZTtcbiAgcHJpdmF0ZSB3YXNEcmFnZ2luZyA9IGZhbHNlO1xuICBwcml2YXRlIGNsaWNrc0Rpc2FibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgY2xpY2tMaXN0ZW5lcnM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgZHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtb3VzZURvd25UaW1lID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHt9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuY2FsY3VsYXRlRGltZW5zaW9ucygpO1xuICAgIHRoaXMuc2V0SXRlbVdpZHRocygpO1xuICAgIHRoaXMudXBkYXRlTGltaXRzKCk7XG4gICAgdGhpcy5zZXR1cENsaWNrUHJldmVudGlvbigpO1xuXG4gICAgaWYgKHRoaXMuYXV0b1BsYXlJbnRlcnZhbCkge1xuICAgICAgdGhpcy5zdGFydEF1dG9QbGF5KCk7XG4gICAgfVxuXG4gICAgdGhpcy5pdGVtcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZURpbWVuc2lvbnMoKTtcbiAgICAgIHRoaXMuc2V0SXRlbVdpZHRocygpO1xuICAgICAgdGhpcy51cGRhdGVMaW1pdHMoKTtcbiAgICAgIHRoaXMuZ29Ub0ZpcnN0U2xpZGUoKTtcbiAgICAgIHRoaXMuc2V0dXBDbGlja1ByZXZlbnRpb24oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3Igd2luZG93IHJlc2l6ZSB0byByZWNhbGN1bGF0ZSBkaW1lbnNpb25zXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHRoaXMub25SZXNpemUoKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN0b3BBdXRvUGxheSgpO1xuICAgIGlmICh0aGlzLmFuaW1hdGlvbklkKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbklkKTtcbiAgICB9XG4gICAgLy8gQ2xlYW4gdXAgY2xpY2sgbGlzdGVuZXJzXG4gICAgdGhpcy5jbGlja0xpc3RlbmVycy5mb3JFYWNoKHVubGlzdGVuID0+IHVubGlzdGVuKCkpO1xuICAgIHRoaXMuY2xpY2tMaXN0ZW5lcnMgPSBbXTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5vblJlc2l6ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlRGltZW5zaW9ucygpIHtcbiAgICBpZiAodGhpcy5zbGlkZXNDb250YWluZXIpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSB0aGlzLnNsaWRlc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgdGhpcy5pdGVtV2lkdGggPSB0aGlzLmNvbnRhaW5lcldpZHRoIC8gdGhpcy5pdGVtc1BlclNsaWRlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTGltaXRzKCkge1xuICAgIGNvbnN0IHRvdGFsU3RlcHMgPSBNYXRoLmNlaWwodGhpcy5pdGVtcy5sZW5ndGggLyB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIHRoaXMubWF4T2Zmc2V0ID0gMDtcbiAgICB0aGlzLm1pbk9mZnNldCA9IC0oKHRvdGFsU3RlcHMgLSAxKSAqIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIG9uUmVzaXplKCkge1xuICAgIHRoaXMuY2FsY3VsYXRlRGltZW5zaW9ucygpO1xuICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gIH1cblxuICBwcml2YXRlIHNldEl0ZW1XaWR0aHMoKSB7XG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBtaW5XaWR0aCA9IGBjYWxjKDEwMCUgLyAke3RoaXMuaXRlbXNQZXJTbGlkZX0pYDtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbS5uYXRpdmVFbGVtZW50LCAnbWluV2lkdGgnLCBtaW5XaWR0aCk7XG4gICAgfSk7XG4gIH1cblxuICBzdGFydEF1dG9QbGF5KCkge1xuICAgIHRoaXMuc3RvcEF1dG9QbGF5KCk7XG4gICAgdGhpcy5hdXRvUGxheVRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgdGhpcy5uZXh0U2xpZGUoKTtcbiAgICAgIH1cbiAgICB9LCAodGhpcy5hdXRvUGxheUludGVydmFsIHx8IDApICogMTAwMCk7XG4gIH1cblxuICBzdG9wQXV0b1BsYXkoKSB7XG4gICAgaWYgKHRoaXMuYXV0b1BsYXlUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9QbGF5VGltZXIpO1xuICAgICAgdGhpcy5hdXRvUGxheVRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBNb3VzZSBldmVudHNcbiAgb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubW91c2VEb3duVGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5kcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnREcmFnKGV2ZW50LmNsaWVudFgpO1xuICB9XG5cbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgXG4gICAgICAvLyBNYXJrIHRoYXQgd2UndmUgc3RhcnRlZCBkcmFnZ2luZyBpZiB3ZSd2ZSBtb3ZlZCBtb3JlIHRoYW4gNXB4XG4gICAgICBjb25zdCBkcmFnRGlzdGFuY2UgPSBNYXRoLmFicyh0aGlzLmN1cnJlbnRYIC0gdGhpcy5zdGFydFgpO1xuICAgICAgaWYgKGRyYWdEaXN0YW5jZSA+IDUgJiYgIXRoaXMuZHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgdGhpcy5kcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMud2FzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLnVwZGF0ZURyYWcoZXZlbnQuY2xpZW50WCk7XG4gICAgfVxuICB9XG5cbiAgb25Nb3VzZVVwKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgY29uc3QgbW91c2VVcFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgaG9sZER1cmF0aW9uID0gbW91c2VVcFRpbWUgLSB0aGlzLm1vdXNlRG93blRpbWU7XG4gICAgICBjb25zdCBtb3VzZURpc3RhbmNlID0gTWF0aC5hYnModGhpcy5jdXJyZW50WCAtIHRoaXMuc3RhcnRYKTtcbiAgICAgIFxuICAgICAgLy8gQ29uc2lkZXIgaXQgYSBkcmFnIGlmOlxuICAgICAgLy8gMS4gV2UgbW92ZWQgbW9yZSB0aGFuIDVweCwgT1JcbiAgICAgIC8vIDIuIFdlIGhlbGQgdGhlIG1vdXNlIGRvd24gZm9yIG1vcmUgdGhhbiAyMDBtcyBhbmQgbW92ZWQgYXQgYWxsXG4gICAgICBpZiAobW91c2VEaXN0YW5jZSA+IDUgfHwgKGhvbGREdXJhdGlvbiA+IDIwMCAmJiBtb3VzZURpc3RhbmNlID4gMCkpIHtcbiAgICAgICAgdGhpcy53YXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMuZW5kRHJhZygpO1xuICAgIH1cbiAgfVxuXG4gIG9uTW91c2VMZWF2ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIC8vIElmIG1vdXNlIGxlYXZlcyB3aGlsZSBkcmFnZ2luZywgZGVmaW5pdGVseSBjb25zaWRlciBpdCBhIGRyYWdcbiAgICAgIHRoaXMud2FzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5lbmREcmFnKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVG91Y2ggZXZlbnRzXG4gIG9uVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCkge1xuICAgIHRoaXMudG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMudG91Y2hTdGFydFggPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgdGhpcy50b3VjaFN0YXJ0WSA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICB0aGlzLmlzVmVydGljYWxTY3JvbGwgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0RHJhZyhldmVudC50b3VjaGVzWzBdLmNsaWVudFgpO1xuICB9XG5cbiAgb25Ub3VjaE1vdmUoZXZlbnQ6IFRvdWNoRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGN1cnJlbnRYID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xuICAgIGNvbnN0IGN1cnJlbnRZID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZO1xuICAgIGNvbnN0IGRlbHRhWCA9IE1hdGguYWJzKGN1cnJlbnRYIC0gdGhpcy50b3VjaFN0YXJ0WCk7XG4gICAgY29uc3QgZGVsdGFZID0gTWF0aC5hYnMoY3VycmVudFkgLSB0aGlzLnRvdWNoU3RhcnRZKTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgdmVydGljYWwgc2Nyb2xsXG4gICAgaWYgKGRlbHRhWSA+IGRlbHRhWCAmJiBkZWx0YVkgPiAxMCkge1xuICAgICAgdGhpcy5pc1ZlcnRpY2FsU2Nyb2xsID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNsaWRlc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAndHJhbnNpdGlvbicsICd0cmFuc2Zvcm0gMC40cyBlYXNlLW91dCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBPbmx5IHByZXZlbnQgZGVmYXVsdCBpZiBpdCdzIGEgaG9yaXpvbnRhbCBkcmFnXG4gICAgaWYgKGRlbHRhWCA+IDEwKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy51cGRhdGVEcmFnKGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCk7XG4gICAgfVxuICB9XG5cbiAgb25Ub3VjaEVuZChldmVudDogVG91Y2hFdmVudCkge1xuICAgIGlmICh0aGlzLmlzVmVydGljYWxTY3JvbGwpIHtcbiAgICAgIHRoaXMuaXNWZXJ0aWNhbFNjcm9sbCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCB0b3VjaER1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHRoaXMudG91Y2hTdGFydFRpbWU7XG4gICAgY29uc3QgdG91Y2hEaXN0YW5jZSA9IE1hdGguYWJzKHRoaXMuY3VycmVudFggLSB0aGlzLnN0YXJ0WCk7XG4gICAgXG4gICAgLy8gTWFyayBhcyBkcmFnZ2luZyBpZiBzaWduaWZpY2FudCBtb3ZlbWVudCBvY2N1cnJlZFxuICAgIGlmICh0b3VjaERpc3RhbmNlID4gMTAgfHwgdG91Y2hEdXJhdGlvbiA+IDMwMCkge1xuICAgICAgdGhpcy53YXNEcmFnZ2luZyA9IHRydWU7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIHRoaXMuZW5kRHJhZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBDbGlja1ByZXZlbnRpb24oKSB7XG4gICAgLy8gQ2xlYW4gdXAgZXhpc3RpbmcgbGlzdGVuZXJzXG4gICAgdGhpcy5jbGlja0xpc3RlbmVycy5mb3JFYWNoKHVubGlzdGVuID0+IHVubGlzdGVuKCkpO1xuICAgIHRoaXMuY2xpY2tMaXN0ZW5lcnMgPSBbXTtcblxuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgLy8gT25seSBwcmV2ZW50IGNsaWNrIGV2ZW50cywgbm90IG1vdXNldXAgd2hpY2ggaXMgbmVlZGVkIGZvciBkcmFnIGZ1bmN0aW9uYWxpdHlcbiAgICAgIGNvbnN0IGV2ZW50SGFuZGxlciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjbGljaycgJiYgKHRoaXMud2FzRHJhZ2dpbmcgfHwgdGhpcy5jbGlja3NEaXNhYmxlZCB8fCB0aGlzLmRyYWdTdGFydGVkKSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcblxuICAgICAgLy8gT25seSBsaXN0ZW4gdG8gY2xpY2sgZXZlbnRzIHRvIGF2b2lkIGludGVyZmVyaW5nIHdpdGggZHJhZyBmdW5jdGlvbmFsaXR5XG4gICAgICBpdGVtLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudEhhbmRsZXIsIHRydWUpO1xuICAgICAgXG4gICAgICB0aGlzLmNsaWNrTGlzdGVuZXJzLnB1c2goKCkgPT4ge1xuICAgICAgICBpdGVtLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudEhhbmRsZXIsIHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RHJhZyhjbGllbnRYOiBudW1iZXIpIHtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgIHRoaXMud2FzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRyYWdTdGFydGVkID0gZmFsc2U7XG4gICAgdGhpcy5jbGlja3NEaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRYID0gY2xpZW50WDtcbiAgICB0aGlzLmN1cnJlbnRYID0gY2xpZW50WDtcbiAgICB0aGlzLmluaXRpYWxPZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICB0aGlzLmRyYWdPZmZzZXQgPSAwO1xuICAgIHRoaXMudmVsb2NpdHkgPSAwO1xuICAgIHRoaXMubGFzdE1vdmVUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmxhc3RNb3ZlWCA9IGNsaWVudFg7XG4gICAgXG4gICAgdGhpcy5jYWxjdWxhdGVEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5zdG9wQXV0b1BsYXkoKTtcbiAgICBcbiAgICAvLyBEaXNhYmxlIENTUyB0cmFuc2l0aW9ucyBkdXJpbmcgZHJhZ1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zbGlkZXNDb250YWluZXIubmF0aXZlRWxlbWVudCwgJ3RyYW5zaXRpb24nLCAnbm9uZScpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcmFnKGNsaWVudFg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLmN1cnJlbnRYID0gY2xpZW50WDtcbiAgICBjb25zdCB0b3RhbERlbHRhWCA9IHRoaXMuY3VycmVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBcbiAgICAvLyBNYXJrIGFzIGRyYWdnaW5nIGlmIG1vdmVtZW50IGlzIHNpZ25pZmljYW50XG4gICAgaWYgKE1hdGguYWJzKHRvdGFsRGVsdGFYKSA+IDUpIHtcbiAgICAgIHRoaXMud2FzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5kcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIENhbGN1bGF0ZSB2ZWxvY2l0eSBmb3IgbW9tZW50dW1cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRoaXMubGFzdE1vdmVUaW1lO1xuICAgIGlmICh0aW1lRGVsdGEgPiAwKSB7XG4gICAgICB0aGlzLnZlbG9jaXR5ID0gKGNsaWVudFggLSB0aGlzLmxhc3RNb3ZlWCkgLyB0aW1lRGVsdGE7XG4gICAgfVxuICAgIHRoaXMubGFzdE1vdmVUaW1lID0gbm93O1xuICAgIHRoaXMubGFzdE1vdmVYID0gY2xpZW50WDtcblxuICAgIC8vIENvbnZlcnQgcGl4ZWwgbW92ZW1lbnQgdG8gcGVyY2VudGFnZVxuICAgIGNvbnN0IGRyYWdQZXJjZW50YWdlID0gKHRvdGFsRGVsdGFYIC8gdGhpcy5jb250YWluZXJXaWR0aCkgKiAxMDA7XG4gICAgXG4gICAgLy8gQXBwbHkgcmVzaXN0YW5jZSBhdCBib3VuZGFyaWVzXG4gICAgbGV0IHJlc2lzdGVkRHJhZ1BlcmNlbnRhZ2UgPSBkcmFnUGVyY2VudGFnZTtcbiAgICBjb25zdCBwb3RlbnRpYWxPZmZzZXQgPSB0aGlzLmluaXRpYWxPZmZzZXQgKyBkcmFnUGVyY2VudGFnZTtcbiAgICBcbiAgICBpZiAocG90ZW50aWFsT2Zmc2V0ID4gdGhpcy5tYXhPZmZzZXQpIHtcbiAgICAgIGNvbnN0IG92ZXJEcmFnID0gcG90ZW50aWFsT2Zmc2V0IC0gdGhpcy5tYXhPZmZzZXQ7XG4gICAgICByZXNpc3RlZERyYWdQZXJjZW50YWdlID0gZHJhZ1BlcmNlbnRhZ2UgLSAob3ZlckRyYWcgKiAwLjMpO1xuICAgIH0gZWxzZSBpZiAocG90ZW50aWFsT2Zmc2V0IDwgdGhpcy5taW5PZmZzZXQpIHtcbiAgICAgIGNvbnN0IG92ZXJEcmFnID0gdGhpcy5taW5PZmZzZXQgLSBwb3RlbnRpYWxPZmZzZXQ7XG4gICAgICByZXNpc3RlZERyYWdQZXJjZW50YWdlID0gZHJhZ1BlcmNlbnRhZ2UgKyAob3ZlckRyYWcgKiAwLjMpO1xuICAgIH1cblxuICAgIHRoaXMuZHJhZ09mZnNldCA9IHJlc2lzdGVkRHJhZ1BlcmNlbnRhZ2U7XG4gICAgdGhpcy51cGRhdGVEcmFnUG9zaXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJhZ1Bvc2l0aW9uKCkge1xuICAgIGNvbnN0IG5ld09mZnNldCA9IHRoaXMuaW5pdGlhbE9mZnNldCArIHRoaXMuZHJhZ09mZnNldDtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgdGhpcy5zbGlkZXNDb250YWluZXIubmF0aXZlRWxlbWVudCwgXG4gICAgICAndHJhbnNmb3JtJywgXG4gICAgICBgdHJhbnNsYXRlWCgke25ld09mZnNldH0lKWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmREcmFnKCkge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBcbiAgICAvLyBEaXNhYmxlIGNsaWNrcyB0ZW1wb3JhcmlseSBhZnRlciBhbnkgZHJhZ1xuICAgIGlmICh0aGlzLndhc0RyYWdnaW5nIHx8IHRoaXMuZHJhZ1N0YXJ0ZWQpIHtcbiAgICAgIHRoaXMuY2xpY2tzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xpY2tzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFyIHRoZSB3YXNEcmFnZ2luZyBhbmQgZHJhZ1N0YXJ0ZWQgZmxhZ3MgYWZ0ZXIgYSBzaG9ydGVyIGRlbGF5XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmRyYWdTdGFydGVkID0gZmFsc2U7XG4gICAgfSwgMjUwKTtcbiAgICBcbiAgICAvLyBSZS1lbmFibGUgQ1NTIHRyYW5zaXRpb25zXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNsaWRlc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAndHJhbnNpdGlvbicsICd0cmFuc2Zvcm0gMC40cyBlYXNlLW91dCcpO1xuXG4gICAgY29uc3QgZmluYWxPZmZzZXQgPSB0aGlzLmluaXRpYWxPZmZzZXQgKyB0aGlzLmRyYWdPZmZzZXQ7XG4gICAgY29uc3QgdGhyZXNob2xkID0gNDA7XG4gICAgY29uc3QgZHJhZ0Rpc3RhbmNlID0gTWF0aC5hYnModGhpcy5jdXJyZW50WCAtIHRoaXMuc3RhcnRYKTtcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgbW9tZW50dW0gKHZlbG9jaXR5LWJhc2VkIHNsaWRlIGNoYW5nZSlcbiAgICBjb25zdCBtb21lbnR1bVRocmVzaG9sZCA9IDAuMztcbiAgICBjb25zdCBoYXNTaWduaWZpY2FudFZlbG9jaXR5ID0gTWF0aC5hYnModGhpcy52ZWxvY2l0eSkgPiBtb21lbnR1bVRocmVzaG9sZDtcbiAgICBcbiAgICBpZiAoZHJhZ0Rpc3RhbmNlID4gdGhyZXNob2xkIHx8IGhhc1NpZ25pZmljYW50VmVsb2NpdHkpIHtcbiAgICAgIGlmICh0aGlzLmRyYWdPZmZzZXQgPiAwIHx8IChoYXNTaWduaWZpY2FudFZlbG9jaXR5ICYmIHRoaXMudmVsb2NpdHkgPiAwKSkge1xuICAgICAgICAvLyBEcmFnZ2VkIHJpZ2h0IG9yIGhhcyBwb3NpdGl2ZSB2ZWxvY2l0eSAtIGdvIHRvIHByZXZpb3VzIHNsaWRlXG4gICAgICAgIHRoaXMucHJldlNsaWRlKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZHJhZ09mZnNldCA8IDAgfHwgKGhhc1NpZ25pZmljYW50VmVsb2NpdHkgJiYgdGhpcy52ZWxvY2l0eSA8IDApKSB7XG4gICAgICAgIC8vIERyYWdnZWQgbGVmdCBvciBoYXMgbmVnYXRpdmUgdmVsb2NpdHkgLSBnbyB0byBuZXh0IHNsaWRlXG4gICAgICAgIHRoaXMubmV4dFNsaWRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTbWFsbCBkcmFnLCBzbmFwIGJhY2sgdG8gY3VycmVudCBwb3NpdGlvblxuICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTbWFsbCBkcmFnLCBzbmFwIGJhY2sgdG8gY3VycmVudCBwb3NpdGlvblxuICAgICAgdGhpcy51cGRhdGVPZmZzZXQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBkcmFnIHN0YXRlXG4gICAgdGhpcy5kcmFnT2Zmc2V0ID0gMDtcbiAgICB0aGlzLnZlbG9jaXR5ID0gMDtcbiAgICBcbiAgICAvLyBSZXN0YXJ0IGF1dG9wbGF5IGlmIGl0IHdhcyBlbmFibGVkXG4gICAgaWYgKHRoaXMuYXV0b1BsYXlJbnRlcnZhbCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN0YXJ0QXV0b1BsYXkoKSwgMTAwMCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RlcEluZGV4Q291bnQoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHRvdGFsU3RlcHMgPSBNYXRoLmNlaWwodGhpcy5pdGVtcy5sZW5ndGggLyB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0b3RhbFN0ZXBzIH0sIChfLCBpKSA9PiBpKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRTdGVwSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RlcEluZGV4OyBcbiAgfVxuXG4gIGdvVG9GaXJzdFNsaWRlKCkge1xuICAgIHRoaXMuY3VycmVudEluZGV4ID0gMDtcbiAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXggPSAwO1xuICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gICAgdGhpcy5zY3JvbGxBY3RpdmVEb3RJbnRvVmlldygwKTtcbiAgfVxuXG4gIGdvVG9TbGlkZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50U3RlcEluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSBNYXRoLm1pbihpbmRleCAqIHRoaXMuaXRlbXNQZXJTbGlkZSwgdGhpcy5pdGVtcy5sZW5ndGggLSB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gICAgdGhpcy5zY3JvbGxBY3RpdmVEb3RJbnRvVmlldyhpbmRleCk7XG4gICAgdGhpcy5kb3RDbGlja0V2ZW50RW1pdHRlci5lbWl0KCk7XG4gIH1cblxuICBwcmV2U2xpZGUoKSB7XG4gICAgY29uc3QgdG90YWxTdGVwcyA9IE1hdGguY2VpbCh0aGlzLml0ZW1zLmxlbmd0aCAvIHRoaXMuaXRlbXNQZXJTbGlkZSk7XG4gICAgXG4gICAgaWYgKHRoaXMuY3VycmVudFN0ZXBJbmRleCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleC0tO1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRTdGVwSW5kZXggKiB0aGlzLml0ZW1zUGVyU2xpZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IHRvdGFsU3RlcHMgLSAxO1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBNYXRoLm1pbih0aGlzLmN1cnJlbnRTdGVwSW5kZXggKiB0aGlzLml0ZW1zUGVyU2xpZGUsIHRoaXMuaXRlbXMubGVuZ3RoIC0gdGhpcy5pdGVtc1BlclNsaWRlKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy51cGRhdGVPZmZzZXQoKTtcbiAgICB0aGlzLnNjcm9sbEFjdGl2ZURvdEludG9WaWV3KHRoaXMuY3VycmVudFN0ZXBJbmRleCk7XG4gICAgdGhpcy5wcmV2aW91c0NsaWNrRXZlbnRFbWl0dGVyLmVtaXQoKTtcbiAgfVxuXG4gIG5leHRTbGlkZSgpIHtcbiAgICBjb25zdCB0b3RhbFN0ZXBzID0gTWF0aC5jZWlsKHRoaXMuaXRlbXMubGVuZ3RoIC8gdGhpcy5pdGVtc1BlclNsaWRlKTtcbiAgICBpZiAodGhpcy5jdXJyZW50U3RlcEluZGV4ID49IHRvdGFsU3RlcHMgLSAxKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXggPSAwO1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXgrKztcbiAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gTWF0aC5taW4odGhpcy5jdXJyZW50U3RlcEluZGV4ICogdGhpcy5pdGVtc1BlclNsaWRlLCB0aGlzLml0ZW1zLmxlbmd0aCAtIHRoaXMuaXRlbXNQZXJTbGlkZSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gICAgdGhpcy5zY3JvbGxBY3RpdmVEb3RJbnRvVmlldyh0aGlzLmN1cnJlbnRTdGVwSW5kZXgpO1xuICAgIHRoaXMubmV4dENsaWNrRXZlbnRFbWl0dGVyLmVtaXQoKTtcbiAgfVxuXG4gIHVwZGF0ZU9mZnNldCgpIHtcbiAgICB0aGlzLm9mZnNldCA9IC0xMDAgKiAodGhpcy5jdXJyZW50SW5kZXggLyB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIFxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nICYmIHRoaXMuc2xpZGVzQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLnNsaWRlc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCBcbiAgICAgICAgJ3RyYW5zZm9ybScsIFxuICAgICAgICBgdHJhbnNsYXRlWCgke3RoaXMub2Zmc2V0fSUpYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbEFjdGl2ZURvdEludG9WaWV3KGluZGV4OiBudW1iZXIpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRvdHNDb250YWluZXIgPSB0aGlzLmRvdHNDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWRvdHNDb250YWluZXIpIHJldHVybjtcblxuICAgICAgY29uc3QgZG90cyA9IGRvdHNDb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZG90Jyk7XG4gICAgICBpZiAoIWRvdHMgfHwgIWRvdHNbaW5kZXhdKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGFjdGl2ZURvdCA9IGRvdHNbaW5kZXhdO1xuICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBkb3RzQ29udGFpbmVyLm9mZnNldFdpZHRoO1xuICAgICAgY29uc3QgZG90V2lkdGggPSBhY3RpdmVEb3Qub2Zmc2V0V2lkdGggKyAxMDtcbiAgICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gZG90V2lkdGggKiBpbmRleCAtIGNvbnRhaW5lcldpZHRoIC8gMiArIGRvdFdpZHRoIC8gMjtcblxuICAgICAgZG90c0NvbnRhaW5lci5zY3JvbGxUbyh7XG4gICAgICAgIGxlZnQ6IE1hdGgubWF4KDAsIHNjcm9sbFBvc2l0aW9uKSxcbiAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjLWNhcm91c2VsLWNvbnRhaW5lclwiPlxuICA8ZGl2IFxuICAgIGNsYXNzPVwiYy1jYXJvdXNlbC1zbGlkZXNcIiBcbiAgICAjc2xpZGVzQ29udGFpbmVyXG4gICAgW3N0eWxlLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlWCgnICsgb2Zmc2V0ICsgJyUpJ1wiIFxuICAgIChtb3VzZWRvd24pPVwib25Nb3VzZURvd24oJGV2ZW50KVwiXG4gICAgKG1vdXNlbW92ZSk9XCJvbk1vdXNlTW92ZSgkZXZlbnQpXCJcbiAgICAobW91c2V1cCk9XCJvbk1vdXNlVXAoJGV2ZW50KVwiXG4gICAgKG1vdXNlbGVhdmUpPVwib25Nb3VzZUxlYXZlKCRldmVudClcIlxuICAgICh0b3VjaHN0YXJ0KT1cIm9uVG91Y2hTdGFydCgkZXZlbnQpXCIgXG4gICAgKHRvdWNobW92ZSk9XCJvblRvdWNoTW92ZSgkZXZlbnQpXCIgXG4gICAgKHRvdWNoZW5kKT1cIm9uVG91Y2hFbmQoJGV2ZW50KVwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImMtY2Fyb3VzZWwtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBbaGlkZGVuXT1cInJlbW92ZUFycm93c1wiIGNsYXNzPVwiYy1jYXJvdXNlbC1uYXYgcHJldlwiIHRpdGxlPVwiU2xpZGUgYW50ZXJpb3JcIiBhcmlhLWxhYmVsPVwiU2xpZGUgYW50ZXJpb3JcIiAoY2xpY2spPVwicHJldlNsaWRlKClcIj5cbiAgICAgIDxsaWItZWx1eC1pY29uIFtpY29uXT1cIidDaGV2cm9uX0xlZnQuc3ZnJ1wiIFtzaXplXT1cIicxNidcIiBbc2l6ZVR5cGVdPVwiJ3B4J1wiIFtjb2xvcl09XCInIzAyMEYyRSdcIj48L2xpYi1lbHV4LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2IFtoaWRkZW5dPVwicmVtb3ZlRG90c1wiIGNsYXNzPVwiYy1jYXJvdXNlbC1kb3RzXCIgI2RvdHNDb250YWluZXI+XG4gICAgICA8c3BhblxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJkb3RcIlxuICAgICAgICAqbmdGb3I9XCJsZXQgaW5kZXggb2YgZ2V0U3RlcEluZGV4Q291bnQoKVwiXG4gICAgICAgIChjbGljayk9XCJnb1RvU2xpZGUoaW5kZXgpXCJcbiAgICAgICAgKGtleXVwKT1cImdvVG9TbGlkZShpbmRleClcIlxuICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImluZGV4ID09PSBnZXRDdXJyZW50U3RlcEluZGV4KClcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInRydWVcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwYWdpbmEnICsgKGluZGV4ICsgMSlcIlxuICAgICAgPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGJ1dHRvbiBbaGlkZGVuXT1cInJlbW92ZUFycm93c1wiIGNsYXNzPVwiYy1jYXJvdXNlbC1uYXYgbmV4dFwiIHRpdGxlPVwiUHLDs3hpbW8gc2xpZGVcIiBhcmlhLWxhYmVsPVwiUHLDs3hpbW8gc2xpZGVcIiAoY2xpY2spPVwibmV4dFNsaWRlKClcIj5cbiAgICAgIDxsaWItZWx1eC1pY29uIFtpY29uXT1cIidDaGV2cm9uX1JpZ2h0LnN2ZydcIiBbc2l6ZV09XCInMTYnXCIgW3NpemVUeXBlXT1cIidweCdcIiBbY29sb3JdPVwiJyMwMjBGMkUnXCI+PC9saWItZWx1eC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
393
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdWkvbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY2Fyb3VzZWwvY2Fyb3VzZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdWkvbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY2Fyb3VzZWwvY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBb0IsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQXdCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7QUFjbkMsTUFBTSxPQUFPLHFCQUFxQjtJQXVDaEMsWUFBb0IsUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWxDOUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUVsQiw4QkFBeUIsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBQ3RELDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFDbEQseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUUzRCxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDckIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUVILGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNYLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUNsQixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FB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SUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDakQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDNUMsTUFBTSxjQUFjLEdBQUcsUUFBUSxHQUFHLEtBQUssR0FBRyxjQUFjLEdBQUcsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFFNUUsYUFBYSxDQUFDLFFBQVEsQ0FBQztnQkFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQztnQkFDakMsUUFBUSxFQUFFLFFBQVE7YUFDbkIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQTVhVSxxQkFBcUI7bUdBQXJCLHFCQUFxQiwwVkFDUyxVQUFVLGtQQ2pCckQsOGlGQWlFQSw0c0hEbkRZLFlBQVksZ1FBQUUsUUFBUTs7NEZBRXJCLHFCQUFxQjtrQkFQakMsU0FBUztpQ0FDSSxJQUFJLFlBQ04sbUJBQW1CLFdBR3BCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQzs4RUFHc0IsS0FBSztzQkFBM0QsZUFBZTt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUN6QixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0ksZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBRW5CLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVJLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUXVlcnlMaXN0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRWx1eEljb24gfSBmcm9tICcuLi9pY29uJztcblxuZXhwb3J0IHR5cGUgUHJvZHVjdEl0ZW0gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW1hZ2U6IHN0cmluZztcbn07XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2xpYi1lbHV4LWNhcm91c2VsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Nhcm91c2VsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2Fyb3VzZWwuY29tcG9uZW50LnNjc3MnXSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRWx1eEljb25dLFxufSlcbmV4cG9ydCBjbGFzcyBFbHV4Q2Fyb3VzZWxDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBAQ29udGVudENoaWxkcmVuKCdjYXJvdXNlbEl0ZW0nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgaXRlbXMhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGQoJ2RvdHNDb250YWluZXInKSBkb3RzQ29udGFpbmVyITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2xpZGVzQ29udGFpbmVyJykgc2xpZGVzQ29udGFpbmVyITogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKSBpdGVtc1BlclNsaWRlOiBudW1iZXIgPSA0O1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJyc7XG5cbiAgQE91dHB1dCgpIHByZXZpb3VzQ2xpY2tFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCkgbmV4dENsaWNrRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRvdENsaWNrRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcblxuICBjdXJyZW50SW5kZXggPSAwO1xuICBjdXJyZW50U3RlcEluZGV4ID0gMDtcbiAgb2Zmc2V0ID0gMDtcblxuICBwcml2YXRlIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdGFydFggPSAwO1xuICBwcml2YXRlIGN1cnJlbnRYID0gMDtcbiAgcHJpdmF0ZSBpbml0aWFsT2Zmc2V0ID0gMDtcbiAgcHJpdmF0ZSBkcmFnT2Zmc2V0ID0gMDtcbiAgcHJpdmF0ZSBjb250YWluZXJXaWR0aCA9IDA7XG4gIHByaXZhdGUgaXRlbVdpZHRoID0gMDtcbiAgcHJpdmF0ZSBtYXhPZmZzZXQgPSAwO1xuICBwcml2YXRlIG1pbk9mZnNldCA9IDA7XG4gIHByaXZhdGUgYW5pbWF0aW9uSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZlbG9jaXR5ID0gMDtcbiAgcHJpdmF0ZSBsYXN0TW92ZVRpbWUgPSAwO1xuICBwcml2YXRlIGxhc3RNb3ZlWCA9IDA7XG4gIHByaXZhdGUgdG91Y2hTdGFydFRpbWUgPSAwO1xuICBwcml2YXRlIHRvdWNoU3RhcnRYID0gMDtcbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0WSA9IDA7XG4gIHByaXZhdGUgaXNWZXJ0aWNhbFNjcm9sbCA9IGZhbHNlO1xuICBwcml2YXRlIHdhc0RyYWdnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgY2xpY2tzRGlzYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbGlja0xpc3RlbmVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSBkcmFnU3RhcnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIG1vdXNlRG93blRpbWUgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5jYWxjdWxhdGVEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5zZXRJdGVtV2lkdGhzKCk7XG4gICAgdGhpcy51cGRhdGVMaW1pdHMoKTtcbiAgICB0aGlzLnNldHVwQ2xpY2tQcmV2ZW50aW9uKCk7XG5cbiAgICB0aGlzLml0ZW1zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlRGltZW5zaW9ucygpO1xuICAgICAgdGhpcy5zZXRJdGVtV2lkdGhzKCk7XG4gICAgICB0aGlzLnVwZGF0ZUxpbWl0cygpO1xuICAgICAgdGhpcy5nb1RvRmlyc3RTbGlkZSgpO1xuICAgICAgdGhpcy5zZXR1cENsaWNrUHJldmVudGlvbigpO1xuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciB3aW5kb3cgcmVzaXplIHRvIHJlY2FsY3VsYXRlIGRpbWVuc2lvbnNcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5vblJlc2l6ZSgpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmFuaW1hdGlvbklkKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbklkKTtcbiAgICB9XG4gICAgLy8gQ2xlYW4gdXAgY2xpY2sgbGlzdGVuZXJzXG4gICAgdGhpcy5jbGlja0xpc3RlbmVycy5mb3JFYWNoKHVubGlzdGVuID0+IHVubGlzdGVuKCkpO1xuICAgIHRoaXMuY2xpY2tMaXN0ZW5lcnMgPSBbXTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5vblJlc2l6ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlRGltZW5zaW9ucygpIHtcbiAgICBpZiAodGhpcy5zbGlkZXNDb250YWluZXIpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSB0aGlzLnNsaWRlc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgdGhpcy5pdGVtV2lkdGggPSB0aGlzLmNvbnRhaW5lcldpZHRoIC8gdGhpcy5pdGVtc1BlclNsaWRlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTGltaXRzKCkge1xuICAgIGNvbnN0IHRvdGFsU3RlcHMgPSBNYXRoLmNlaWwodGhpcy5pdGVtcy5sZW5ndGggLyB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIHRoaXMubWF4T2Zmc2V0ID0gMDtcbiAgICB0aGlzLm1pbk9mZnNldCA9IC0oKHRvdGFsU3RlcHMgLSAxKSAqIDEwMCk7XG4gIH1cblxuICBjYW5Hb05leHQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdG90YWxTdGVwcyA9IE1hdGguY2VpbCh0aGlzLml0ZW1zLmxlbmd0aCAvIHRoaXMuaXRlbXNQZXJTbGlkZSk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0ZXBJbmRleCA8IHRvdGFsU3RlcHMgLSAxO1xuICB9XG5cbiAgY2FuR29QcmV2aW91cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RlcEluZGV4ID4gMDtcbiAgfVxuXG4gIHByaXZhdGUgb25SZXNpemUoKSB7XG4gICAgdGhpcy5jYWxjdWxhdGVEaW1lbnNpb25zKCk7XG4gICAgdGhpcy51cGRhdGVPZmZzZXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SXRlbVdpZHRocygpIHtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IG1pbldpZHRoID0gYGNhbGMoMTAwJSAvICR7dGhpcy5pdGVtc1BlclNsaWRlfSlgO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLm5hdGl2ZUVsZW1lbnQsICdtaW5XaWR0aCcsIG1pbldpZHRoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIE1vdXNlIGV2ZW50c1xuICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5tb3VzZURvd25UaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmRyYWdTdGFydGVkID0gZmFsc2U7XG4gICAgdGhpcy5zdGFydERyYWcoZXZlbnQuY2xpZW50WCk7XG4gIH1cblxuICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBcbiAgICAgIC8vIE1hcmsgdGhhdCB3ZSd2ZSBzdGFydGVkIGRyYWdnaW5nIGlmIHdlJ3ZlIG1vdmVkIG1vcmUgdGhhbiA1cHhcbiAgICAgIGNvbnN0IGRyYWdEaXN0YW5jZSA9IE1hdGguYWJzKHRoaXMuY3VycmVudFggLSB0aGlzLnN0YXJ0WCk7XG4gICAgICBpZiAoZHJhZ0Rpc3RhbmNlID4gNSAmJiAhdGhpcy5kcmFnU3RhcnRlZCkge1xuICAgICAgICB0aGlzLmRyYWdTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy53YXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMudXBkYXRlRHJhZyhldmVudC5jbGllbnRYKTtcbiAgICB9XG4gIH1cblxuICBvbk1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCBtb3VzZVVwVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBob2xkRHVyYXRpb24gPSBtb3VzZVVwVGltZSAtIHRoaXMubW91c2VEb3duVGltZTtcbiAgICAgIGNvbnN0IG1vdXNlRGlzdGFuY2UgPSBNYXRoLmFicyh0aGlzLmN1cnJlbnRYIC0gdGhpcy5zdGFydFgpO1xuICAgICAgXG4gICAgICAvLyBDb25zaWRlciBpdCBhIGRyYWcgaWY6XG4gICAgICAvLyAxLiBXZSBtb3ZlZCBtb3JlIHRoYW4gNXB4LCBPUlxuICAgICAgLy8gMi4gV2UgaGVsZCB0aGUgbW91c2UgZG93biBmb3IgbW9yZSB0aGFuIDIwMG1zIGFuZCBtb3ZlZCBhdCBhbGxcbiAgICAgIGlmIChtb3VzZURpc3RhbmNlID4gNSB8fCAoaG9sZER1cmF0aW9uID4gMjAwICYmIG1vdXNlRGlzdGFuY2UgPiAwKSkge1xuICAgICAgICB0aGlzLndhc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5lbmREcmFnKCk7XG4gICAgfVxuICB9XG5cbiAgb25Nb3VzZUxlYXZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgLy8gSWYgbW91c2UgbGVhdmVzIHdoaWxlIGRyYWdnaW5nLCBkZWZpbml0ZWx5IGNvbnNpZGVyIGl0IGEgZHJhZ1xuICAgICAgdGhpcy53YXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLmVuZERyYWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBUb3VjaCBldmVudHNcbiAgb25Ub3VjaFN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KSB7XG4gICAgdGhpcy50b3VjaFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy50b3VjaFN0YXJ0WCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICB0aGlzLnRvdWNoU3RhcnRZID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZO1xuICAgIHRoaXMuaXNWZXJ0aWNhbFNjcm9sbCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnREcmFnKGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCk7XG4gIH1cblxuICBvblRvdWNoTW92ZShldmVudDogVG91Y2hFdmVudCkge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgY3VycmVudFggPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgY29uc3QgY3VycmVudFkgPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgY29uc3QgZGVsdGFYID0gTWF0aC5hYnMoY3VycmVudFggLSB0aGlzLnRvdWNoU3RhcnRYKTtcbiAgICBjb25zdCBkZWx0YVkgPSBNYXRoLmFicyhjdXJyZW50WSAtIHRoaXMudG91Y2hTdGFydFkpO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB2ZXJ0aWNhbCBzY3JvbGxcbiAgICBpZiAoZGVsdGFZID4gZGVsdGFYICYmIGRlbHRhWSA+IDEwKSB7XG4gICAgICB0aGlzLmlzVmVydGljYWxTY3JvbGwgPSB0cnVlO1xuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2xpZGVzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uJywgJ3RyYW5zZm9ybSAwLjRzIGVhc2Utb3V0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIE9ubHkgcHJldmVudCBkZWZhdWx0IGlmIGl0J3MgYSBob3Jpem9udGFsIGRyYWdcbiAgICBpZiAoZGVsdGFYID4gMTApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnVwZGF0ZURyYWcoZXZlbnQudG91Y2hlc1swXS5jbGllbnRYKTtcbiAgICB9XG4gIH1cblxuICBvblRvdWNoRW5kKGV2ZW50OiBUb3VjaEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNWZXJ0aWNhbFNjcm9sbCkge1xuICAgICAgdGhpcy5pc1ZlcnRpY2FsU2Nyb2xsID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHRvdWNoRHVyYXRpb24gPSBEYXRlLm5vdygpIC0gdGhpcy50b3VjaFN0YXJ0VGltZTtcbiAgICBjb25zdCB0b3VjaERpc3RhbmNlID0gTWF0aC5hYnModGhpcy5jdXJyZW50WCAtIHRoaXMuc3RhcnRYKTtcbiAgICBcbiAgICAvLyBNYXJrIGFzIGRyYWdnaW5nIGlmIHNpZ25pZmljYW50IG1vdmVtZW50IG9jY3VycmVkXG4gICAgaWYgKHRvdWNoRGlzdGFuY2UgPiAxMCB8fCB0b3VjaER1cmF0aW9uID4gMzAwKSB7XG4gICAgICB0aGlzLndhc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgdGhpcy5lbmREcmFnKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cENsaWNrUHJldmVudGlvbigpIHtcbiAgICAvLyBDbGVhbiB1cCBleGlzdGluZyBsaXN0ZW5lcnNcbiAgICB0aGlzLmNsaWNrTGlzdGVuZXJzLmZvckVhY2godW5saXN0ZW4gPT4gdW5saXN0ZW4oKSk7XG4gICAgdGhpcy5jbGlja0xpc3RlbmVycyA9IFtdO1xuXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAvLyBPbmx5IHByZXZlbnQgY2xpY2sgZXZlbnRzLCBub3QgbW91c2V1cCB3aGljaCBpcyBuZWVkZWQgZm9yIGRyYWcgZnVuY3Rpb25hbGl0eVxuICAgICAgY29uc3QgZXZlbnRIYW5kbGVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJyAmJiAodGhpcy53YXNEcmFnZ2luZyB8fCB0aGlzLmNsaWNrc0Rpc2FibGVkIHx8IHRoaXMuZHJhZ1N0YXJ0ZWQpKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuXG4gICAgICAvLyBPbmx5IGxpc3RlbiB0byBjbGljayBldmVudHMgdG8gYXZvaWQgaW50ZXJmZXJpbmcgd2l0aCBkcmFnIGZ1bmN0aW9uYWxpdHlcbiAgICAgIGl0ZW0ubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgICBcbiAgICAgIHRoaXMuY2xpY2tMaXN0ZW5lcnMucHVzaCgoKSA9PiB7XG4gICAgICAgIGl0ZW0ubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnREcmFnKGNsaWVudFg6IG51bWJlcikge1xuICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy53YXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNsaWNrc0Rpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5zdGFydFggPSBjbGllbnRYO1xuICAgIHRoaXMuY3VycmVudFggPSBjbGllbnRYO1xuICAgIHRoaXMuaW5pdGlhbE9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICAgIHRoaXMuZHJhZ09mZnNldCA9IDA7XG4gICAgdGhpcy52ZWxvY2l0eSA9IDA7XG4gICAgdGhpcy5sYXN0TW92ZVRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMubGFzdE1vdmVYID0gY2xpZW50WDtcbiAgICBcbiAgICB0aGlzLmNhbGN1bGF0ZURpbWVuc2lvbnMoKTtcbiAgICAvLyBEaXNhYmxlIENTUyB0cmFuc2l0aW9ucyBkdXJpbmcgZHJhZ1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zbGlkZXNDb250YWluZXIubmF0aXZlRWxlbWVudCwgJ3RyYW5zaXRpb24nLCAnbm9uZScpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcmFnKGNsaWVudFg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLmN1cnJlbnRYID0gY2xpZW50WDtcbiAgICBjb25zdCB0b3RhbERlbHRhWCA9IHRoaXMuY3VycmVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBcbiAgICAvLyBNYXJrIGFzIGRyYWdnaW5nIGlmIG1vdmVtZW50IGlzIHNpZ25pZmljYW50XG4gICAgaWYgKE1hdGguYWJzKHRvdGFsRGVsdGFYKSA+IDUpIHtcbiAgICAgIHRoaXMud2FzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5kcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIENhbGN1bGF0ZSB2ZWxvY2l0eSBmb3IgbW9tZW50dW1cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRoaXMubGFzdE1vdmVUaW1lO1xuICAgIGlmICh0aW1lRGVsdGEgPiAwKSB7XG4gICAgICB0aGlzLnZlbG9jaXR5ID0gKGNsaWVudFggLSB0aGlzLmxhc3RNb3ZlWCkgLyB0aW1lRGVsdGE7XG4gICAgfVxuICAgIHRoaXMubGFzdE1vdmVUaW1lID0gbm93O1xuICAgIHRoaXMubGFzdE1vdmVYID0gY2xpZW50WDtcblxuICAgIC8vIENvbnZlcnQgcGl4ZWwgbW92ZW1lbnQgdG8gcGVyY2VudGFnZVxuICAgIGNvbnN0IGRyYWdQZXJjZW50YWdlID0gKHRvdGFsRGVsdGFYIC8gdGhpcy5jb250YWluZXJXaWR0aCkgKiAxMDA7XG5cbiAgICBpZiAoKHRoaXMuY3VycmVudFN0ZXBJbmRleCA9PT0gMCAmJiBkcmFnUGVyY2VudGFnZSA+IDApIHx8XG4gICAgICAgICghdGhpcy5jYW5Hb05leHQoKSAmJiBkcmFnUGVyY2VudGFnZSA8IDApKSB7XG4gICAgICB0aGlzLnVwZGF0ZU9mZnNldCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBBcHBseSByZXNpc3RhbmNlIGF0IGJvdW5kYXJpZXNcbiAgICBsZXQgcmVzaXN0ZWREcmFnUGVyY2VudGFnZSA9IGRyYWdQZXJjZW50YWdlO1xuICAgIGNvbnN0IHBvdGVudGlhbE9mZnNldCA9IHRoaXMuaW5pdGlhbE9mZnNldCArIGRyYWdQZXJjZW50YWdlO1xuICAgIFxuICAgIGlmIChwb3RlbnRpYWxPZmZzZXQgPiB0aGlzLm1heE9mZnNldCkge1xuICAgICAgY29uc3Qgb3ZlckRyYWcgPSBwb3RlbnRpYWxPZmZzZXQgLSB0aGlzLm1heE9mZnNldDtcbiAgICAgIHJlc2lzdGVkRHJhZ1BlcmNlbnRhZ2UgPSBkcmFnUGVyY2VudGFnZSAtIChvdmVyRHJhZyAqIDAuMyk7XG4gICAgfSBlbHNlIGlmIChwb3RlbnRpYWxPZmZzZXQgPCB0aGlzLm1pbk9mZnNldCkge1xuICAgICAgY29uc3Qgb3ZlckRyYWcgPSB0aGlzLm1pbk9mZnNldCAtIHBvdGVudGlhbE9mZnNldDtcbiAgICAgIHJlc2lzdGVkRHJhZ1BlcmNlbnRhZ2UgPSBkcmFnUGVyY2VudGFnZSArIChvdmVyRHJhZyAqIDAuMyk7XG4gICAgfVxuXG4gICAgdGhpcy5kcmFnT2Zmc2V0ID0gcmVzaXN0ZWREcmFnUGVyY2VudGFnZTtcbiAgICB0aGlzLnVwZGF0ZURyYWdQb3NpdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcmFnUG9zaXRpb24oKSB7XG4gICAgY29uc3QgbmV3T2Zmc2V0ID0gdGhpcy5pbml0aWFsT2Zmc2V0ICsgdGhpcy5kcmFnT2Zmc2V0O1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICB0aGlzLnNsaWRlc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCBcbiAgICAgICd0cmFuc2Zvcm0nLCBcbiAgICAgIGB0cmFuc2xhdGVYKCR7bmV3T2Zmc2V0fSUpYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGVuZERyYWcoKSB7XG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHJldHVybjtcblxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIFxuICAgIC8vIERpc2FibGUgY2xpY2tzIHRlbXBvcmFyaWx5IGFmdGVyIGFueSBkcmFnXG4gICAgaWYgKHRoaXMud2FzRHJhZ2dpbmcgfHwgdGhpcy5kcmFnU3RhcnRlZCkge1xuICAgICAgdGhpcy5jbGlja3NEaXNhYmxlZCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jbGlja3NEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfSwgMjAwKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2xlYXIgdGhlIHdhc0RyYWdnaW5nIGFuZCBkcmFnU3RhcnRlZCBmbGFncyBhZnRlciBhIHNob3J0ZXIgZGVsYXlcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2FzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICB9LCAyNTApO1xuICAgIFxuICAgIC8vIFJlLWVuYWJsZSBDU1MgdHJhbnNpdGlvbnNcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2xpZGVzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uJywgJ3RyYW5zZm9ybSAwLjRzIGVhc2Utb3V0Jyk7XG5cbiAgICBjb25zdCB0aHJlc2hvbGQgPSA0MDtcbiAgICBjb25zdCBkcmFnRGlzdGFuY2UgPSBNYXRoLmFicyh0aGlzLmN1cnJlbnRYIC0gdGhpcy5zdGFydFgpO1xuICAgIFxuICAgIC8vIENoZWNrIGZvciBtb21lbnR1bSAodmVsb2NpdHktYmFzZWQgc2xpZGUgY2hhbmdlKVxuICAgIGNvbnN0IG1vbWVudHVtVGhyZXNob2xkID0gMC4zO1xuICAgIGNvbnN0IGhhc1NpZ25pZmljYW50VmVsb2NpdHkgPSBNYXRoLmFicyh0aGlzLnZlbG9jaXR5KSA+IG1vbWVudHVtVGhyZXNob2xkO1xuICAgIFxuICAgIGlmICgodGhpcy5jdXJyZW50U3RlcEluZGV4ID09PSAwICYmICh0aGlzLmRyYWdPZmZzZXQgPiAwIHx8IHRoaXMudmVsb2NpdHkgPiAwKSkgfHxcbiAgICAgICAgKCF0aGlzLmNhbkdvTmV4dCgpICYmICh0aGlzLmRyYWdPZmZzZXQgPCAwIHx8IHRoaXMudmVsb2NpdHkgPCAwKSkpIHtcbiAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gICAgfSBlbHNlIGlmIChkcmFnRGlzdGFuY2UgPiB0aHJlc2hvbGQgfHwgaGFzU2lnbmlmaWNhbnRWZWxvY2l0eSkge1xuICAgICAgaWYgKHRoaXMuZHJhZ09mZnNldCA+IDAgfHwgKGhhc1NpZ25pZmljYW50VmVsb2NpdHkgJiYgdGhpcy52ZWxvY2l0eSA+IDApKSB7XG4gICAgICAgIC8vIERyYWdnZWQgcmlnaHQgb3IgaGFzIHBvc2l0aXZlIHZlbG9jaXR5IC0gZ28gdG8gcHJldmlvdXMgc2xpZGVcbiAgICAgICAgdGhpcy5wcmV2U2xpZGUoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kcmFnT2Zmc2V0IDwgMCB8fCAoaGFzU2lnbmlmaWNhbnRWZWxvY2l0eSAmJiB0aGlzLnZlbG9jaXR5IDwgMCkpIHtcbiAgICAgICAgLy8gRHJhZ2dlZCBsZWZ0IG9yIGhhcyBuZWdhdGl2ZSB2ZWxvY2l0eSAtIGdvIHRvIG5leHQgc2xpZGVcbiAgICAgICAgdGhpcy5uZXh0U2xpZGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNtYWxsIGRyYWcsIHNuYXAgYmFjayB0byBjdXJyZW50IHBvc2l0aW9uXG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNtYWxsIGRyYWcsIHNuYXAgYmFjayB0byBjdXJyZW50IHBvc2l0aW9uXG4gICAgICB0aGlzLnVwZGF0ZU9mZnNldCgpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGRyYWcgc3RhdGVcbiAgICB0aGlzLmRyYWdPZmZzZXQgPSAwO1xuICAgIHRoaXMudmVsb2NpdHkgPSAwO1xuICAgIFxuICB9XG5cbiAgZ2V0U3RlcEluZGV4Q291bnQoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHRvdGFsU3RlcHMgPSBNYXRoLmNlaWwodGhpcy5pdGVtcy5sZW5ndGggLyB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0b3RhbFN0ZXBzIH0sIChfLCBpKSA9PiBpKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRTdGVwSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RlcEluZGV4OyBcbiAgfVxuXG4gIGdvVG9GaXJzdFNsaWRlKCkge1xuICAgIHRoaXMuY3VycmVudEluZGV4ID0gMDtcbiAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXggPSAwO1xuICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gICAgdGhpcy5zY3JvbGxBY3RpdmVEb3RJbnRvVmlldygwKTtcbiAgfVxuXG4gIGdvVG9TbGlkZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50U3RlcEluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSBNYXRoLm1pbihpbmRleCAqIHRoaXMuaXRlbXNQZXJTbGlkZSwgdGhpcy5pdGVtcy5sZW5ndGggLSB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gICAgdGhpcy5zY3JvbGxBY3RpdmVEb3RJbnRvVmlldyhpbmRleCk7XG4gICAgdGhpcy5kb3RDbGlja0V2ZW50RW1pdHRlci5lbWl0KCk7XG4gIH1cblxuICBwcmV2U2xpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmNhbkdvUHJldmlvdXMoKSkgcmV0dXJuO1xuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleC0tO1xuICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5jdXJyZW50U3RlcEluZGV4ICogdGhpcy5pdGVtc1BlclNsaWRlO1xuICAgIFxuICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gICAgdGhpcy5zY3JvbGxBY3RpdmVEb3RJbnRvVmlldyh0aGlzLmN1cnJlbnRTdGVwSW5kZXgpO1xuICAgIHRoaXMucHJldmlvdXNDbGlja0V2ZW50RW1pdHRlci5lbWl0KCk7XG4gIH1cblxuICBuZXh0U2xpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmNhbkdvTmV4dCgpKSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50U3RlcEluZGV4Kys7XG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSBNYXRoLm1pbih0aGlzLmN1cnJlbnRTdGVwSW5kZXggKiB0aGlzLml0ZW1zUGVyU2xpZGUsIHRoaXMuaXRlbXMubGVuZ3RoIC0gdGhpcy5pdGVtc1BlclNsaWRlKTtcbiAgICB0aGlzLnVwZGF0ZU9mZnNldCgpO1xuICAgIHRoaXMuc2Nyb2xsQWN0aXZlRG90SW50b1ZpZXcodGhpcy5jdXJyZW50U3RlcEluZGV4KTtcbiAgICB0aGlzLm5leHRDbGlja0V2ZW50RW1pdHRlci5lbWl0KCk7XG4gIH1cblxuICB1cGRhdGVPZmZzZXQoKSB7XG4gICAgdGhpcy5vZmZzZXQgPSAtMTAwICogKHRoaXMuY3VycmVudEluZGV4IC8gdGhpcy5pdGVtc1BlclNsaWRlKTtcbiAgICBcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZyAmJiB0aGlzLnNsaWRlc0NvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgdGhpcy5zbGlkZXNDb250YWluZXIubmF0aXZlRWxlbWVudCwgXG4gICAgICAgICd0cmFuc2Zvcm0nLCBcbiAgICAgICAgYHRyYW5zbGF0ZVgoJHt0aGlzLm9mZnNldH0lKWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxBY3RpdmVEb3RJbnRvVmlldyhpbmRleDogbnVtYmVyKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBkb3RzQ29udGFpbmVyID0gdGhpcy5kb3RzQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFkb3RzQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRvdHMgPSBkb3RzQ29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2RvdCcpO1xuICAgICAgaWYgKCFkb3RzIHx8ICFkb3RzW2luZGV4XSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhY3RpdmVEb3QgPSBkb3RzW2luZGV4XTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gZG90c0NvbnRhaW5lci5vZmZzZXRXaWR0aDtcbiAgICAgIGNvbnN0IGRvdFdpZHRoID0gYWN0aXZlRG90Lm9mZnNldFdpZHRoICsgMTA7XG4gICAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9IGRvdFdpZHRoICogaW5kZXggLSBjb250YWluZXJXaWR0aCAvIDIgKyBkb3RXaWR0aCAvIDI7XG5cbiAgICAgIGRvdHNDb250YWluZXIuc2Nyb2xsVG8oe1xuICAgICAgICBsZWZ0OiBNYXRoLm1heCgwLCBzY3JvbGxQb3NpdGlvbiksXG4gICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYy1jYXJvdXNlbC1jb250YWluZXJcIj5cbiAgPGRpdiAqbmdJZj1cInRpdGxlXCIgY2xhc3M9XCJjLWNhcm91c2VsLWhlYWRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJjLWNhcm91c2VsLWhlYWRlci1pbm5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImMtY2Fyb3VzZWwtdGl0bGVcIj57eyB0aXRsZSB9fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImMtY2Fyb3VzZWwtY29udHJvbHNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYy1jYXJvdXNlbC1uYXYgcHJldlwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5Hb1ByZXZpb3VzKClcIlxuICAgICAgICAgIHRpdGxlPVwiU2xpZGUgYW50ZXJpb3JcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJTbGlkZSBhbnRlcmlvclwiXG4gICAgICAgICAgKGNsaWNrKT1cInByZXZTbGlkZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsaWItZWx1eC1pY29uIFtpY29uXT1cIidDaGV2cm9uX0xlZnQuc3ZnJ1wiIFtzaXplXT1cIicxNidcIiBbc2l6ZVR5cGVdPVwiJ3B4J1wiIFtjb2xvcl09XCInIzAyMEYyRSdcIj48L2xpYi1lbHV4LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImMtY2Fyb3VzZWwtbmF2IG5leHRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuR29OZXh0KClcIlxuICAgICAgICAgIHRpdGxlPVwiUHLDs3hpbW8gc2xpZGVcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJQcsOzeGltbyBzbGlkZVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm5leHRTbGlkZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsaWItZWx1eC1pY29uIFtpY29uXT1cIidDaGV2cm9uX1JpZ2h0LnN2ZydcIiBbc2l6ZV09XCInMTYnXCIgW3NpemVUeXBlXT1cIidweCdcIiBbY29sb3JdPVwiJyMwMjBGMkUnXCI+PC9saWItZWx1eC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBcbiAgICBjbGFzcz1cImMtY2Fyb3VzZWwtc2xpZGVzXCIgXG4gICAgI3NsaWRlc0NvbnRhaW5lclxuICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZVgoJyArIG9mZnNldCArICclKSdcIiBcbiAgICAobW91c2Vkb3duKT1cIm9uTW91c2VEb3duKCRldmVudClcIlxuICAgIChtb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoJGV2ZW50KVwiXG4gICAgKG1vdXNldXApPVwib25Nb3VzZVVwKCRldmVudClcIlxuICAgIChtb3VzZWxlYXZlKT1cIm9uTW91c2VMZWF2ZSgkZXZlbnQpXCJcbiAgICAodG91Y2hzdGFydCk9XCJvblRvdWNoU3RhcnQoJGV2ZW50KVwiIFxuICAgICh0b3VjaG1vdmUpPVwib25Ub3VjaE1vdmUoJGV2ZW50KVwiIFxuICAgICh0b3VjaGVuZCk9XCJvblRvdWNoRW5kKCRldmVudClcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjLWNhcm91c2VsLWZvb3RlclwiPlxuICAgIDxidXR0b24gKm5nSWY9XCIhdGl0bGVcIiBjbGFzcz1cImMtY2Fyb3VzZWwtbmF2IHByZXZcIiBbZGlzYWJsZWRdPVwiIWNhbkdvUHJldmlvdXMoKVwiIHRpdGxlPVwiU2xpZGUgYW50ZXJpb3JcIiBhcmlhLWxhYmVsPVwiU2xpZGUgYW50ZXJpb3JcIiAoY2xpY2spPVwicHJldlNsaWRlKClcIj5cbiAgICAgIDxsaWItZWx1eC1pY29uIFtpY29uXT1cIidDaGV2cm9uX0xlZnQuc3ZnJ1wiIFtzaXplXT1cIicxNidcIiBbc2l6ZVR5cGVdPVwiJ3B4J1wiIFtjb2xvcl09XCInIzAyMEYyRSdcIj48L2xpYi1lbHV4LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYy1jYXJvdXNlbC1kb3RzXCIgI2RvdHNDb250YWluZXI+XG4gICAgICA8c3BhblxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJkb3RcIlxuICAgICAgICAqbmdGb3I9XCJsZXQgaW5kZXggb2YgZ2V0U3RlcEluZGV4Q291bnQoKVwiXG4gICAgICAgIChjbGljayk9XCJnb1RvU2xpZGUoaW5kZXgpXCJcbiAgICAgICAgKGtleXVwKT1cImdvVG9TbGlkZShpbmRleClcIlxuICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImluZGV4ID09PSBnZXRDdXJyZW50U3RlcEluZGV4KClcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInRydWVcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwYWdpbmEnICsgKGluZGV4ICsgMSlcIlxuICAgICAgPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGJ1dHRvbiAqbmdJZj1cIiF0aXRsZVwiIGNsYXNzPVwiYy1jYXJvdXNlbC1uYXYgbmV4dFwiIFtkaXNhYmxlZF09XCIhY2FuR29OZXh0KClcIiB0aXRsZT1cIlByw7N4aW1vIHNsaWRlXCIgYXJpYS1sYWJlbD1cIlByw7N4aW1vIHNsaWRlXCIgKGNsaWNrKT1cIm5leHRTbGlkZSgpXCI+XG4gICAgICA8bGliLWVsdXgtaWNvbiBbaWNvbl09XCInQ2hldnJvbl9SaWdodC5zdmcnXCIgW3NpemVdPVwiJzE2J1wiIFtzaXplVHlwZV09XCIncHgnXCIgW2NvbG9yXT1cIicjMDIwRjJFJ1wiPjwvbGliLWVsdXgtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==