ngx-edge-slider 1.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +24 -104
  2. package/esm2022/lib/component/simple-slider.component.mjs +192 -0
  3. package/esm2022/lib/engine/slider-engine.service.mjs +286 -0
  4. package/esm2022/lib/models/slider-config.model.mjs +12 -0
  5. package/esm2022/lib/models/slider-state.model.mjs +17 -0
  6. package/esm2022/lib/ngx-edge-slider.module.mjs +16 -0
  7. package/esm2022/lib/plugins/autoplay.plugin.mjs +47 -0
  8. package/esm2022/lib/plugins/draggable/draggable.plugin.mjs +47 -0
  9. package/esm2022/lib/plugins/navigation/navigation.plugin.mjs +85 -0
  10. package/esm2022/lib/plugins/pagination/pagination.plugin.mjs +50 -0
  11. package/esm2022/lib/plugins/slider-plugin.mjs +2 -0
  12. package/esm2022/lib/plugins/thumbs/thumbs-scroll.plugin.mjs +38 -0
  13. package/esm2022/lib/safe-url.pipe.mjs +19 -0
  14. package/esm2022/lib/store/slider-store.service.mjs +34 -0
  15. package/esm2022/ngx-edge-slider.mjs +5 -0
  16. package/esm2022/public-api.mjs +9 -0
  17. package/fesm2022/ngx-edge-slider.mjs +814 -0
  18. package/fesm2022/ngx-edge-slider.mjs.map +1 -0
  19. package/index.d.ts +5 -0
  20. package/lib/component/simple-slider.component.d.ts +50 -0
  21. package/lib/engine/slider-engine.service.d.ts +52 -0
  22. package/lib/models/slider-config.model.d.ts +35 -0
  23. package/lib/models/slider-state.model.d.ts +22 -0
  24. package/lib/ngx-edge-slider.module.d.ts +7 -0
  25. package/lib/plugins/autoplay.plugin.d.ts +18 -0
  26. package/lib/plugins/draggable/draggable.plugin.d.ts +17 -0
  27. package/lib/plugins/navigation/navigation.plugin.d.ts +21 -0
  28. package/lib/plugins/pagination/pagination.plugin.d.ts +22 -0
  29. package/lib/plugins/slider-plugin.d.ts +11 -0
  30. package/lib/plugins/thumbs/thumbs-scroll.plugin.d.ts +15 -0
  31. package/lib/safe-url.pipe.d.ts +10 -0
  32. package/lib/store/slider-store.service.d.ts +11 -0
  33. package/ngx-edge-slider-2.0.0.tgz +0 -0
  34. package/package.json +19 -18
  35. package/public-api.d.ts +5 -0
  36. package/ngx-edge-slider-workspace/.editorconfig +0 -16
  37. package/ngx-edge-slider-workspace/.vscode/extensions.json +0 -4
  38. package/ngx-edge-slider-workspace/.vscode/launch.json +0 -20
  39. package/ngx-edge-slider-workspace/.vscode/tasks.json +0 -42
  40. package/ngx-edge-slider-workspace/README.md +0 -104
  41. package/ngx-edge-slider-workspace/angular.json +0 -140
  42. package/ngx-edge-slider-workspace/package-lock.json +0 -13339
  43. package/ngx-edge-slider-workspace/package.json +0 -39
  44. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/README.md +0 -24
  45. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/ng-package.json +0 -7
  46. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/package.json +0 -12
  47. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/assets/icons/arrow-black.svg +0 -3
  48. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/assets/icons/arrow-gray.svg +0 -3
  49. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.component.html +0 -78
  50. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.component.scss +0 -344
  51. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.component.ts +0 -610
  52. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.interface.ts +0 -34
  53. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.module.ts +0 -18
  54. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.service.ts +0 -9
  55. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/public-api.ts +0 -7
  56. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/tsconfig.lib.json +0 -14
  57. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/tsconfig.lib.prod.json +0 -10
  58. package/ngx-edge-slider-workspace/projects/ngx-edge-slider/tsconfig.spec.json +0 -14
  59. package/ngx-edge-slider-workspace/projects/test-app/src/app/app.component.html +0 -11
  60. package/ngx-edge-slider-workspace/projects/test-app/src/app/app.component.scss +0 -0
  61. package/ngx-edge-slider-workspace/projects/test-app/src/app/app.component.spec.ts +0 -27
  62. package/ngx-edge-slider-workspace/projects/test-app/src/app/app.component.ts +0 -57
  63. package/ngx-edge-slider-workspace/projects/test-app/src/app/app.module.ts +0 -18
  64. package/ngx-edge-slider-workspace/projects/test-app/src/assets/.gitkeep +0 -0
  65. package/ngx-edge-slider-workspace/projects/test-app/src/assets/slide2_desktop_1950x.webp +0 -0
  66. package/ngx-edge-slider-workspace/projects/test-app/src/favicon.ico +0 -0
  67. package/ngx-edge-slider-workspace/projects/test-app/src/index.html +0 -13
  68. package/ngx-edge-slider-workspace/projects/test-app/src/main.ts +0 -7
  69. package/ngx-edge-slider-workspace/projects/test-app/src/styles.scss +0 -1
  70. package/ngx-edge-slider-workspace/projects/test-app/tsconfig.app.json +0 -14
  71. package/ngx-edge-slider-workspace/projects/test-app/tsconfig.spec.json +0 -14
  72. package/ngx-edge-slider-workspace/tsconfig.json +0 -39
package/README.md CHANGED
@@ -1,104 +1,24 @@
1
- Edge Slider is a flexible and customizable slider component for Angular applications. It offers an intuitive interface to manage slides with various configurable options, enabling smooth transitions, autoplay, and responsive design. This component is ideal for creating interactive image galleries, product carousels, content sliders, and more.
2
-
3
- Features:
4
- Customizable Slide Configurations: Easily control slide behavior, width, autoplay, loop, and more.
5
- Draggable: Allow users to manually drag slides for an interactive experience.
6
- Autoplay: Set an automatic slideshow with configurable delay time.
7
- Slide Navigation & Pagination: Enable navigation arrows and pagination with customizable positions.
8
- Responsive Design: Configure different breakpoints for mobile, tablet, and desktop to ensure your slider works well across devices.
9
- Vertical/Horizontal Mode: Support for both vertical and horizontal slides, with smooth transitions.
10
- Customizable Title: Add and position titles for each slide.
11
- Flexible Navigation: Easily enable navigation buttons with hover effect support.
12
- Configurable Breakpoints: Tailor slide behavior and appearance at different screen sizes for optimal performance on all devices.
13
- SlideConfig Object:
14
- title: Optional title for each slide.
15
- titlePosition: Customize the position of the slide title.
16
- draggable: Enable or disable draggable functionality.
17
- slides: The array of slides to be displayed.
18
- slidesToSlide: Number of slides to move when navigating.
19
- slideChangeDelay: Time delay (in milliseconds) between slide transitions.
20
- slidesPerView: Number of slides visible at a time.
21
- slideWidth: Optional custom width for each slide.
22
- changeToClickedSlide: Automatically change to the clicked slide.
23
- autoPlay: Enable automatic slide transitions.
24
- delay: Delay in milliseconds between slides when autoplay is enabled.
25
- loop: Number of times the slides will loop. Set to 0 for infinite looping.
26
- vertical: If set to true, the slider will display slides vertically.
27
- navEnabled: Enable navigation arrows.
28
- navPosition: Position of the navigation arrows.
29
- navHoverable: If true, navigation arrows will be visible only on hover.
30
- paginationEnabled: Enable pagination dots.
31
- paginationPosition: Position of the pagination dots.
32
- breakpoints: Define slide configuration based on breakpoints for responsive behavior (mobile, tablet, desktop).
33
- Responsive Support:
34
- Configure the slider's behavior for different screen sizes using breakpoints. The library allows customization for:
35
-
36
- Mobile (mobile): Custom slide configuration for mobile devices.
37
- Tablet (tablet): Tailored configuration for tablet-sized screens.
38
- Desktop (desktop): Adjustments for desktop layouts.
39
- Usage Example:
40
- To use the Edge Slider in your Angular 17+ application, follow the steps below:
41
-
42
- Import the Module: First, import the EdgeSliderModule into your AppModule or the module where you want to use the slider.
43
- typescript
44
- Copy code
45
- import { EdgeSliderModule } from '@your-username/edge-slider';
46
-
47
- @NgModule({
48
- imports: [EdgeSliderModule],
49
- // other configurations...
50
- })
51
- export class AppModule { }
52
- Component HTML: You can use the lib-ngx-edge-slider component in your template. Here's how to initialize it in your Angular component.
53
-
54
- <!-- Initialize EdgeSlider component in your template -->
55
- <lib-ngx-edge-slider *ngIf="sliderConfig.slides?.length"
56
- [config]="sliderConfig"
57
- id="EdgeSlider"
58
- [slideTemplate]="EdgeSliderTemplate"
59
- (onSlideChange)="onSlideChange($event)">
60
- </lib-ngx-edge-slider>
61
-
62
- <!-- Define the template for the slides -->
63
- <ng-template #EdgeSliderTemplate let-slide="slide" let-index="currentSlide">
64
- <!-- Template rendering logic here -->
65
- <!-- 'slide' is our entity, and its properties can be accessed, like slide.id, slide.image -->
66
- <img [src]="slide.image" alt="Slide image">
67
- </ng-template>
68
-
69
- Component TypeScript: In your component's .ts file, define the sliderConfig with the desired slide settings, and create an onSlideChange handler for capturing slide change events.
70
- typescript
71
-
72
- import { Component } from '@angular/core';
73
- import { SlideConfig } from '@your-username/edge-slider'; // Import your library
74
-
75
- @Component({
76
- selector: 'app-your-component',
77
- templateUrl: './your-component.component.html',
78
- styleUrls: ['./your-component.component.css'],
79
- })
80
- export class YourComponent {
81
- // Define the slider configuration
82
- sliderConfig: SlideConfig = new SlideConfig({
83
- slides: [
84
- { id: 1, image: 'path_to_image_1.jpg' },
85
- { id: 2, image: 'path_to_image_2.jpg' },
86
- { id: 3, image: 'path_to_image_3.jpg' },
87
- ],
88
- autoPlay: true,
89
- delay: 3000, // Set autoplay delay
90
- loop: 0, // Infinite loop
91
- slidesToSlide: 1,
92
- slidesPerView: 1,
93
- navEnabled: true, // Enable navigation
94
- paginationEnabled: true, // Enable pagination dots
95
- });
96
-
97
- // Handle slide change event
98
- onSlideChange(event: any): void {
99
- console.log('Slide changed to: ', event);
100
- }
101
- }
102
-
103
- Summary
104
- This package provides an easy-to-integrate, flexible Angular component for building interactive and responsive sliders. With options for autoplay, navigation, pagination, and breakpoints, it adapts to various use cases, making it a powerful tool for displaying image galleries, content carousels, and more.
1
+ # NgxEdgeSlider
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project ngx-edge-slider` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ngx-edge-slider`.
8
+ > Note: Don't forget to add `--project ngx-edge-slider` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build ngx-edge-slider` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build ngx-edge-slider`, go to the dist folder `cd dist/ngx-edge-slider` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test ngx-edge-slider` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,192 @@
1
+ import { Component, ChangeDetectionStrategy, Input, EventEmitter, Output, ViewChild, } from "@angular/core";
2
+ import { Subject, takeUntil } from "rxjs";
3
+ import { SliderEngine } from "../engine/slider-engine.service";
4
+ import { SliderStore } from "../store/slider-store.service";
5
+ import { SliderAutoplayPlugin } from "../plugins/autoplay.plugin";
6
+ import { SliderDraggablePlugin } from "../plugins/draggable/draggable.plugin";
7
+ import { SliderNavigationPlugin } from "../plugins/navigation/navigation.plugin";
8
+ import { SliderPaginationPlugin } from "../plugins/pagination/pagination.plugin";
9
+ import { SliderThumbsScrollPlugin } from "../plugins/thumbs/thumbs-scroll.plugin";
10
+ import { CommonModule } from "@angular/common";
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "../engine/slider-engine.service";
13
+ import * as i2 from "../store/slider-store.service";
14
+ import * as i3 from "../plugins/draggable/draggable.plugin";
15
+ import * as i4 from "../plugins/pagination/pagination.plugin";
16
+ import * as i5 from "../plugins/navigation/navigation.plugin";
17
+ import * as i6 from "../plugins/autoplay.plugin";
18
+ import * as i7 from "../plugins/thumbs/thumbs-scroll.plugin";
19
+ import * as i8 from "@angular/common";
20
+ export class SimpleSliderComponent {
21
+ engine;
22
+ store;
23
+ draggable;
24
+ pagination;
25
+ navigation;
26
+ autoplay;
27
+ thumbs;
28
+ config;
29
+ slideTemplate;
30
+ navigationTemplate;
31
+ paginationTemplate;
32
+ slideChange = new EventEmitter();
33
+ isDraggingPointer = false;
34
+ dragStartX = 0;
35
+ dragStartY = 0;
36
+ lastIndex = -1;
37
+ lastSlidesRef = null;
38
+ destroy$ = new Subject();
39
+ state$;
40
+ sliderHost;
41
+ constructor(engine, store, draggable, pagination, navigation, autoplay, thumbs) {
42
+ this.engine = engine;
43
+ this.store = store;
44
+ this.draggable = draggable;
45
+ this.pagination = pagination;
46
+ this.navigation = navigation;
47
+ this.autoplay = autoplay;
48
+ this.thumbs = thumbs;
49
+ }
50
+ ngOnInit() {
51
+ this.state$ = this.store.view$;
52
+ this.state$.pipe(takeUntil(this.destroy$)).subscribe((state) => {
53
+ if (state.currentSlide !== this.lastIndex) {
54
+ this.lastIndex = state.currentSlide;
55
+ this.slideChange.emit(state.currentSlide);
56
+ }
57
+ });
58
+ this.lastSlidesRef = this.config?.slides ?? null;
59
+ this.engine.init({ ...this.config, plugins: this.config.plugins });
60
+ }
61
+ ngAfterViewInit() {
62
+ if (this.sliderHost?.nativeElement) {
63
+ this.engine.attachContainer(this.sliderHost.nativeElement);
64
+ }
65
+ }
66
+ ngOnChanges(changes) {
67
+ if (!changes["config"] || !this.config)
68
+ return;
69
+ const newSlidesRef = this.config.slides ?? null;
70
+ if (newSlidesRef !== this.lastSlidesRef) {
71
+ this.lastSlidesRef = newSlidesRef;
72
+ this.engine.destroy();
73
+ this.resolvePlugins(this.config);
74
+ }
75
+ }
76
+ ngOnDestroy() {
77
+ this.destroySlider();
78
+ }
79
+ goTo(index) {
80
+ this.engine.selectSlide(index); // add this line
81
+ //this.slideChange.emit(index);
82
+ }
83
+ destroySlider() {
84
+ this.destroy$.next();
85
+ this.destroy$.complete();
86
+ this.engine.destroy();
87
+ } // destroys plugins and clears store
88
+ onNext() {
89
+ this.engine.next();
90
+ }
91
+ onPrevious() {
92
+ this.engine.previous();
93
+ }
94
+ selectSlide(index) {
95
+ this.engine.selectSlide(index);
96
+ }
97
+ // Handle Pointers
98
+ onPointerDown(event) {
99
+ this.dragStartX = event.clientX;
100
+ this.dragStartY = event.clientY;
101
+ this.isDraggingPointer = false;
102
+ // Do not capture yet; wait until movement exceeds threshold
103
+ this.engine.handleDragStart(event);
104
+ }
105
+ onPointerMove(event) {
106
+ const dx = Math.abs(event.clientX - this.dragStartX);
107
+ const dy = Math.abs(event.clientY - this.dragStartY);
108
+ if (!this.isDraggingPointer && (dx > 5 || dy > 5)) {
109
+ this.isDraggingPointer = true;
110
+ // Now start capturing pointer so dragging works outside the slider bounds
111
+ event.currentTarget.setPointerCapture(event.pointerId);
112
+ }
113
+ if (this.isDraggingPointer) {
114
+ this.engine.handleDragMove(event);
115
+ }
116
+ }
117
+ onPointerUp(event) {
118
+ if (!event)
119
+ return;
120
+ if (!this.isDraggingPointer) {
121
+ const target = event.target;
122
+ // Only select the slide if click is not on an interactive child
123
+ const slideEl = target.closest(".slide");
124
+ if (slideEl && !target.closest("button, video, a")) {
125
+ const indexAttr = slideEl.getAttribute("data-index");
126
+ const index = indexAttr ? parseInt(indexAttr, 10) : null;
127
+ if (index !== null)
128
+ this.engine.selectSlide(index);
129
+ }
130
+ }
131
+ this.engine.handleDragEnd();
132
+ this.isDraggingPointer = false;
133
+ // Release pointer capture if it was captured
134
+ try {
135
+ event.currentTarget.releasePointerCapture(event.pointerId);
136
+ }
137
+ catch { }
138
+ }
139
+ resolvePlugins(config) {
140
+ const runtimePlugins = [];
141
+ const cfg = config.plugins;
142
+ if (cfg?.draggable)
143
+ runtimePlugins.push(this.draggable);
144
+ if (cfg?.pagination)
145
+ runtimePlugins.push(this.pagination);
146
+ if (cfg?.navigation)
147
+ runtimePlugins.push(this.navigation);
148
+ if (cfg?.autoplay) {
149
+ this.autoplay.setConfig(cfg.autoplay);
150
+ runtimePlugins.push(this.autoplay);
151
+ }
152
+ if (cfg?.thumbs)
153
+ runtimePlugins.push(this.thumbs);
154
+ this.engine.init({ ...config, plugins: undefined }, runtimePlugins);
155
+ }
156
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SimpleSliderComponent, deps: [{ token: i1.SliderEngine }, { token: i2.SliderStore }, { token: i3.SliderDraggablePlugin }, { token: i4.SliderPaginationPlugin }, { token: i5.SliderNavigationPlugin }, { token: i6.SliderAutoplayPlugin }, { token: i7.SliderThumbsScrollPlugin }], target: i0.ɵɵFactoryTarget.Component });
157
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: SimpleSliderComponent, isStandalone: true, selector: "app-simple-slider", inputs: { config: "config", slideTemplate: "slideTemplate", navigationTemplate: "navigationTemplate", paginationTemplate: "paginationTemplate" }, outputs: { slideChange: "slideChange" }, providers: [
158
+ SliderEngine,
159
+ SliderStore,
160
+ SliderDraggablePlugin,
161
+ SliderPaginationPlugin,
162
+ SliderNavigationPlugin,
163
+ SliderAutoplayPlugin,
164
+ SliderThumbsScrollPlugin,
165
+ ], viewQueries: [{ propertyName: "sliderHost", first: true, predicate: ["sliderHost"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"state$ | async as state\">\r\n <div\r\n class=\"slider\"\r\n #sliderHost\r\n [class.slider-vertical]=\"state.vertical\"\r\n [class.slider-draggable]=\"state.isDragging\"\r\n [class.slider--main]=\"!config.isThumbs\"\r\n [class.slider--thumbs]=\"config.isThumbs\"\r\n *ngIf=\"state.visibleSlides?.length > 0 && state.isVisible\"\r\n (pointerdown)=\"onPointerDown($event)\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerup)=\"onPointerUp($event)\"\r\n (pointercancel)=\"onPointerUp($event)\">\r\n <div\r\n class=\"slider__wrapper\"\r\n [ngStyle]=\"{\r\n transform: state.translate,\r\n transition: state.transition,\r\n display: 'flex',\r\n 'flex-direction': state.vertical ? 'column' : 'row',\r\n 'justify-content': state.visibleSlides?.length < state.slidesPerView ? 'center' : 'flex-start',\r\n gap: (state.slidesPerView > 1 ? state.gap || 0 : 0) + 'px',\r\n }\">\r\n <div\r\n *ngFor=\"let slide of state.visibleSlides; let i = index\"\r\n class=\"slide\"\r\n [attr.data-index]=\"i\"\r\n [class.slide--current]=\"state.selectedSlide === i\"\r\n [style.flex]=\"\r\n !config.isThumbs\r\n ? '0 0 calc(' +\r\n 100 / state.slidesPerView +\r\n '% - ' +\r\n ((state.gap || 0) * (state.slidesPerView - 1)) / state.slidesPerView +\r\n 'px)'\r\n : '0 0 ' + thumbSize + 'px'\r\n \"\r\n [style.width]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n [style.height]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n (click)=\"engine.selectSlide(i)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"slideTemplate ? slideTemplate : defaultSlideTemplate; context: { slide: slide, index: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
166
+ }
167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SimpleSliderComponent, decorators: [{
168
+ type: Component,
169
+ args: [{ selector: "app-simple-slider", changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], providers: [
170
+ SliderEngine,
171
+ SliderStore,
172
+ SliderDraggablePlugin,
173
+ SliderPaginationPlugin,
174
+ SliderNavigationPlugin,
175
+ SliderAutoplayPlugin,
176
+ SliderThumbsScrollPlugin,
177
+ ], template: "<ng-container *ngIf=\"state$ | async as state\">\r\n <div\r\n class=\"slider\"\r\n #sliderHost\r\n [class.slider-vertical]=\"state.vertical\"\r\n [class.slider-draggable]=\"state.isDragging\"\r\n [class.slider--main]=\"!config.isThumbs\"\r\n [class.slider--thumbs]=\"config.isThumbs\"\r\n *ngIf=\"state.visibleSlides?.length > 0 && state.isVisible\"\r\n (pointerdown)=\"onPointerDown($event)\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerup)=\"onPointerUp($event)\"\r\n (pointercancel)=\"onPointerUp($event)\">\r\n <div\r\n class=\"slider__wrapper\"\r\n [ngStyle]=\"{\r\n transform: state.translate,\r\n transition: state.transition,\r\n display: 'flex',\r\n 'flex-direction': state.vertical ? 'column' : 'row',\r\n 'justify-content': state.visibleSlides?.length < state.slidesPerView ? 'center' : 'flex-start',\r\n gap: (state.slidesPerView > 1 ? state.gap || 0 : 0) + 'px',\r\n }\">\r\n <div\r\n *ngFor=\"let slide of state.visibleSlides; let i = index\"\r\n class=\"slide\"\r\n [attr.data-index]=\"i\"\r\n [class.slide--current]=\"state.selectedSlide === i\"\r\n [style.flex]=\"\r\n !config.isThumbs\r\n ? '0 0 calc(' +\r\n 100 / state.slidesPerView +\r\n '% - ' +\r\n ((state.gap || 0) * (state.slidesPerView - 1)) / state.slidesPerView +\r\n 'px)'\r\n : '0 0 ' + thumbSize + 'px'\r\n \"\r\n [style.width]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n [style.height]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n (click)=\"engine.selectSlide(i)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"slideTemplate ? slideTemplate : defaultSlideTemplate; context: { slide: slide, index: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n" }]
178
+ }], ctorParameters: () => [{ type: i1.SliderEngine }, { type: i2.SliderStore }, { type: i3.SliderDraggablePlugin }, { type: i4.SliderPaginationPlugin }, { type: i5.SliderNavigationPlugin }, { type: i6.SliderAutoplayPlugin }, { type: i7.SliderThumbsScrollPlugin }], propDecorators: { config: [{
179
+ type: Input
180
+ }], slideTemplate: [{
181
+ type: Input
182
+ }], navigationTemplate: [{
183
+ type: Input
184
+ }], paginationTemplate: [{
185
+ type: Input
186
+ }], slideChange: [{
187
+ type: Output
188
+ }], sliderHost: [{
189
+ type: ViewChild,
190
+ args: ["sliderHost", { static: false }]
191
+ }] } });
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXNsaWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRnZS1zbGlkZXIvc3JjL2xpYi9jb21wb25lbnQvc2ltcGxlLXNsaWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRnZS1zbGlkZXIvc3JjL2xpYi9jb21wb25lbnQvc2ltcGxlLXNsaWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixFQUd2QixLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFJTixTQUFTLEdBR1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUVsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7QUFrQi9DLE1BQU0sT0FBTyxxQkFBcUI7SUFrQnRCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBdkJELE1BQU0sQ0FBZTtJQUNyQixhQUFhLENBQW9CO0lBQ2pDLGtCQUFrQixDQUFvQjtJQUN0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SUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLGFBQ1o7d0JBQ1QsWUFBWTt3QkFDWixXQUFXO3dCQUNYLHFCQUFxQjt3QkFDckIsc0JBQXNCO3dCQUN0QixzQkFBc0I7d0JBQ3RCLG9CQUFvQjt3QkFDcEIsd0JBQXdCO3FCQUN6QjttU0FHUSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBVXFDLFVBQVU7c0JBQXJELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIE9uSW5pdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBJbnB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBBZnRlclZpZXdJbml0LFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNsaWRlclZpZXdTdGF0ZSB9IGZyb20gXCIuLi9tb2RlbHMvc2xpZGVyLXN0YXRlLm1vZGVsXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFNsaWRlckNvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvc2xpZGVyLWNvbmZpZy5tb2RlbFwiO1xyXG5pbXBvcnQgeyBTbGlkZXJFbmdpbmUgfSBmcm9tIFwiLi4vZW5naW5lL3NsaWRlci1lbmdpbmUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlkZXJTdG9yZSB9IGZyb20gXCIuLi9zdG9yZS9zbGlkZXItc3RvcmUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlkZXJBdXRvcGxheVBsdWdpbiB9IGZyb20gXCIuLi9wbHVnaW5zL2F1dG9wbGF5LnBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJEcmFnZ2FibGVQbHVnaW4gfSBmcm9tIFwiLi4vcGx1Z2lucy9kcmFnZ2FibGUvZHJhZ2dhYmxlLnBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJOYXZpZ2F0aW9uUGx1Z2luIH0gZnJvbSBcIi4uL3BsdWdpbnMvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLnBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJQYWdpbmF0aW9uUGx1Z2luIH0gZnJvbSBcIi4uL3BsdWdpbnMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLnBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJUaHVtYnNTY3JvbGxQbHVnaW4gfSBmcm9tIFwiLi4vcGx1Z2lucy90aHVtYnMvdGh1bWJzLXNjcm9sbC5wbHVnaW5cIjtcclxuaW1wb3J0IHsgU2xpZGVyUGx1Z2luIH0gZnJvbSBcIi4uL3BsdWdpbnMvc2xpZGVyLXBsdWdpblwiO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtc2ltcGxlLXNsaWRlclwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vc2ltcGxlLXNsaWRlci5jb21wb25lbnQuaHRtbFwiLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICBTbGlkZXJFbmdpbmUsXHJcbiAgICBTbGlkZXJTdG9yZSxcclxuICAgIFNsaWRlckRyYWdnYWJsZVBsdWdpbixcclxuICAgIFNsaWRlclBhZ2luYXRpb25QbHVnaW4sXHJcbiAgICBTbGlkZXJOYXZpZ2F0aW9uUGx1Z2luLFxyXG4gICAgU2xpZGVyQXV0b3BsYXlQbHVnaW4sXHJcbiAgICBTbGlkZXJUaHVtYnNTY3JvbGxQbHVnaW4sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpbXBsZVNsaWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGNvbmZpZzogU2xpZGVyQ29uZmlnO1xyXG4gIEBJbnB1dCgpIHNsaWRlVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIG5hdmlnYXRpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgcGFnaW5hdGlvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAT3V0cHV0KCkgc2xpZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nUG9pbnRlciA9IGZhbHNlO1xyXG4gIHByaXZhdGUgZHJhZ1N0YXJ0WCA9IDA7XHJcbiAgcHJpdmF0ZSBkcmFnU3RhcnRZID0gMDtcclxuICBwcml2YXRlIGxhc3RJbmRleCA9IC0xO1xyXG4gIHByaXZhdGUgbGFzdFNsaWRlc1JlZjogYW55W10gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgc3RhdGUkOiBPYnNlcnZhYmxlPFNsaWRlclZpZXdTdGF0ZT47XHJcbiAgQFZpZXdDaGlsZChcInNsaWRlckhvc3RcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHNsaWRlckhvc3Q/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVuZ2luZTogU2xpZGVyRW5naW5lLFxyXG4gICAgcHJpdmF0ZSBzdG9yZTogU2xpZGVyU3RvcmUsXHJcbiAgICBwcml2YXRlIGRyYWdnYWJsZTogU2xpZGVyRHJhZ2dhYmxlUGx1Z2luLFxyXG4gICAgcHJpdmF0ZSBwYWdpbmF0aW9uOiBTbGlkZXJQYWdpbmF0aW9uUGx1Z2luLFxyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uOiBTbGlkZXJOYXZpZ2F0aW9uUGx1Z2luLFxyXG4gICAgcHJpdmF0ZSBhdXRvcGxheTogU2xpZGVyQXV0b3BsYXlQbHVnaW4sXHJcbiAgICBwcml2YXRlIHRodW1iczogU2xpZGVyVGh1bWJzU2Nyb2xsUGx1Z2luLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnN0YXRlJCA9IHRoaXMuc3RvcmUudmlldyQ7XHJcblxyXG4gICAgdGhpcy5zdGF0ZSQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcclxuICAgICAgaWYgKHN0YXRlLmN1cnJlbnRTbGlkZSAhPT0gdGhpcy5sYXN0SW5kZXgpIHtcclxuICAgICAgICB0aGlzLmxhc3RJbmRleCA9IHN0YXRlLmN1cnJlbnRTbGlkZTtcclxuICAgICAgICB0aGlzLnNsaWRlQ2hhbmdlLmVtaXQoc3RhdGUuY3VycmVudFNsaWRlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmxhc3RTbGlkZXNSZWYgPSB0aGlzLmNvbmZpZz8uc2xpZGVzID8/IG51bGw7XHJcbiAgICB0aGlzLmVuZ2luZS5pbml0KHsgLi4udGhpcy5jb25maWcsIHBsdWdpbnM6IHRoaXMuY29uZmlnLnBsdWdpbnMgfSk7XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnNsaWRlckhvc3Q/Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5lbmdpbmUuYXR0YWNoQ29udGFpbmVyKHRoaXMuc2xpZGVySG9zdC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICghY2hhbmdlc1tcImNvbmZpZ1wiXSB8fCAhdGhpcy5jb25maWcpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBuZXdTbGlkZXNSZWYgPSB0aGlzLmNvbmZpZy5zbGlkZXMgPz8gbnVsbDtcclxuXHJcbiAgICBpZiAobmV3U2xpZGVzUmVmICE9PSB0aGlzLmxhc3RTbGlkZXNSZWYpIHtcclxuICAgICAgdGhpcy5sYXN0U2xpZGVzUmVmID0gbmV3U2xpZGVzUmVmO1xyXG4gICAgICB0aGlzLmVuZ2luZS5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMucmVzb2x2ZVBsdWdpbnModGhpcy5jb25maWcpO1xyXG4gICAgfVxyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZGVzdHJveVNsaWRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdvVG8oaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5lbmdpbmUuc2VsZWN0U2xpZGUoaW5kZXgpOyAvLyBhZGQgdGhpcyBsaW5lXHJcbiAgICAvL3RoaXMuc2xpZGVDaGFuZ2UuZW1pdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95U2xpZGVyKCkge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLmVuZ2luZS5kZXN0cm95KCk7XHJcbiAgfSAvLyBkZXN0cm95cyBwbHVnaW5zIGFuZCBjbGVhcnMgc3RvcmVcclxuXHJcbiAgb25OZXh0KCkge1xyXG4gICAgdGhpcy5lbmdpbmUubmV4dCgpO1xyXG4gIH1cclxuICBvblByZXZpb3VzKCkge1xyXG4gICAgdGhpcy5lbmdpbmUucHJldmlvdXMoKTtcclxuICB9XHJcbiAgc2VsZWN0U2xpZGUoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5lbmdpbmUuc2VsZWN0U2xpZGUoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZGxlIFBvaW50ZXJzXHJcblxyXG4gIG9uUG9pbnRlckRvd24oZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgdGhpcy5kcmFnU3RhcnRYID0gZXZlbnQuY2xpZW50WDtcclxuICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XHJcbiAgICB0aGlzLmlzRHJhZ2dpbmdQb2ludGVyID0gZmFsc2U7XHJcblxyXG4gICAgLy8gRG8gbm90IGNhcHR1cmUgeWV0OyB3YWl0IHVudGlsIG1vdmVtZW50IGV4Y2VlZHMgdGhyZXNob2xkXHJcbiAgICB0aGlzLmVuZ2luZS5oYW5kbGVEcmFnU3RhcnQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Qb2ludGVyTW92ZShldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICBjb25zdCBkeCA9IE1hdGguYWJzKGV2ZW50LmNsaWVudFggLSB0aGlzLmRyYWdTdGFydFgpO1xyXG4gICAgY29uc3QgZHkgPSBNYXRoLmFicyhldmVudC5jbGllbnRZIC0gdGhpcy5kcmFnU3RhcnRZKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ1BvaW50ZXIgJiYgKGR4ID4gNSB8fCBkeSA+IDUpKSB7XHJcbiAgICAgIHRoaXMuaXNEcmFnZ2luZ1BvaW50ZXIgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gTm93IHN0YXJ0IGNhcHR1cmluZyBwb2ludGVyIHNvIGRyYWdnaW5nIHdvcmtzIG91dHNpZGUgdGhlIHNsaWRlciBib3VuZHNcclxuICAgICAgKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZ1BvaW50ZXIpIHtcclxuICAgICAgdGhpcy5lbmdpbmUuaGFuZGxlRHJhZ01vdmUoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Qb2ludGVyVXAoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgaWYgKCFldmVudCkgcmV0dXJuO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nUG9pbnRlcikge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAvLyBPbmx5IHNlbGVjdCB0aGUgc2xpZGUgaWYgY2xpY2sgaXMgbm90IG9uIGFuIGludGVyYWN0aXZlIGNoaWxkXHJcbiAgICAgIGNvbnN0IHNsaWRlRWwgPSB0YXJnZXQuY2xvc2VzdChcIi5zbGlkZVwiKTtcclxuICAgICAgaWYgKHNsaWRlRWwgJiYgIXRhcmdldC5jbG9zZXN0KFwiYnV0dG9uLCB2aWRlbywgYVwiKSkge1xyXG4gICAgICAgIGNvbnN0IGluZGV4QXR0ciA9IHNsaWRlRWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1pbmRleFwiKTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4QXR0ciA/IHBhcnNlSW50KGluZGV4QXR0ciwgMTApIDogbnVsbDtcclxuICAgICAgICBpZiAoaW5kZXggIT09IG51bGwpIHRoaXMuZW5naW5lLnNlbGVjdFNsaWRlKGluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW5naW5lLmhhbmRsZURyYWdFbmQoKTtcclxuICAgIHRoaXMuaXNEcmFnZ2luZ1BvaW50ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBSZWxlYXNlIHBvaW50ZXIgY2FwdHVyZSBpZiBpdCB3YXMgY2FwdHVyZWRcclxuICAgIHRyeSB7XHJcbiAgICAgIChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcclxuICAgIH0gY2F0Y2gge31cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzb2x2ZVBsdWdpbnMoY29uZmlnOiBTbGlkZXJDb25maWcpIHtcclxuICAgIGNvbnN0IHJ1bnRpbWVQbHVnaW5zOiBTbGlkZXJQbHVnaW5bXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0IGNmZyA9IGNvbmZpZy5wbHVnaW5zO1xyXG5cclxuICAgIGlmIChjZmc/LmRyYWdnYWJsZSkgcnVudGltZVBsdWdpbnMucHVzaCh0aGlzLmRyYWdnYWJsZSk7XHJcbiAgICBpZiAoY2ZnPy5wYWdpbmF0aW9uKSBydW50aW1lUGx1Z2lucy5wdXNoKHRoaXMucGFnaW5hdGlvbik7XHJcbiAgICBpZiAoY2ZnPy5uYXZpZ2F0aW9uKSBydW50aW1lUGx1Z2lucy5wdXNoKHRoaXMubmF2aWdhdGlvbik7XHJcblxyXG4gICAgaWYgKGNmZz8uYXV0b3BsYXkpIHtcclxuICAgICAgdGhpcy5hdXRvcGxheS5zZXRDb25maWcoY2ZnLmF1dG9wbGF5KTtcclxuICAgICAgcnVudGltZVBsdWdpbnMucHVzaCh0aGlzLmF1dG9wbGF5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2ZnPy50aHVtYnMpIHJ1bnRpbWVQbHVnaW5zLnB1c2godGhpcy50aHVtYnMpO1xyXG5cclxuICAgIHRoaXMuZW5naW5lLmluaXQoeyAuLi5jb25maWcsIHBsdWdpbnM6IHVuZGVmaW5lZCB9LCBydW50aW1lUGx1Z2lucyk7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJzdGF0ZSQgfCBhc3luYyBhcyBzdGF0ZVwiPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwic2xpZGVyXCJcclxuICAgICNzbGlkZXJIb3N0XHJcbiAgICBbY2xhc3Muc2xpZGVyLXZlcnRpY2FsXT1cInN0YXRlLnZlcnRpY2FsXCJcclxuICAgIFtjbGFzcy5zbGlkZXItZHJhZ2dhYmxlXT1cInN0YXRlLmlzRHJhZ2dpbmdcIlxyXG4gICAgW2NsYXNzLnNsaWRlci0tbWFpbl09XCIhY29uZmlnLmlzVGh1bWJzXCJcclxuICAgIFtjbGFzcy5zbGlkZXItLXRodW1ic109XCJjb25maWcuaXNUaHVtYnNcIlxyXG4gICAgKm5nSWY9XCJzdGF0ZS52aXNpYmxlU2xpZGVzPy5sZW5ndGggPiAwICYmIHN0YXRlLmlzVmlzaWJsZVwiXHJcbiAgICAocG9pbnRlcmRvd24pPVwib25Qb2ludGVyRG93bigkZXZlbnQpXCJcclxuICAgIChwb2ludGVybW92ZSk9XCJvblBvaW50ZXJNb3ZlKCRldmVudClcIlxyXG4gICAgKHBvaW50ZXJ1cCk9XCJvblBvaW50ZXJVcCgkZXZlbnQpXCJcclxuICAgIChwb2ludGVyY2FuY2VsKT1cIm9uUG9pbnRlclVwKCRldmVudClcIj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJzbGlkZXJfX3dyYXBwZXJcIlxyXG4gICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgdHJhbnNmb3JtOiBzdGF0ZS50cmFuc2xhdGUsXHJcbiAgICAgICAgdHJhbnNpdGlvbjogc3RhdGUudHJhbnNpdGlvbixcclxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXHJcbiAgICAgICAgJ2ZsZXgtZGlyZWN0aW9uJzogc3RhdGUudmVydGljYWwgPyAnY29sdW1uJyA6ICdyb3cnLFxyXG4gICAgICAgICdqdXN0aWZ5LWNvbnRlbnQnOiBzdGF0ZS52aXNpYmxlU2xpZGVzPy5sZW5ndGggPCBzdGF0ZS5zbGlkZXNQZXJWaWV3ID8gJ2NlbnRlcicgOiAnZmxleC1zdGFydCcsXHJcbiAgICAgICAgZ2FwOiAoc3RhdGUuc2xpZGVzUGVyVmlldyA+IDEgPyBzdGF0ZS5nYXAgfHwgMCA6IDApICsgJ3B4JyxcclxuICAgICAgfVwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nRm9yPVwibGV0IHNsaWRlIG9mIHN0YXRlLnZpc2libGVTbGlkZXM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgIGNsYXNzPVwic2xpZGVcIlxyXG4gICAgICAgIFthdHRyLmRhdGEtaW5kZXhdPVwiaVwiXHJcbiAgICAgICAgW2NsYXNzLnNsaWRlLS1jdXJyZW50XT1cInN0YXRlLnNlbGVjdGVkU2xpZGUgPT09IGlcIlxyXG4gICAgICAgIFtzdHlsZS5mbGV4XT1cIlxyXG4gICAgICAgICAgIWNvbmZpZy5pc1RodW1ic1xyXG4gICAgICAgICAgICA/ICcwIDAgY2FsYygnICtcclxuICAgICAgICAgICAgICAxMDAgLyBzdGF0ZS5zbGlkZXNQZXJWaWV3ICtcclxuICAgICAgICAgICAgICAnJSAtICcgK1xyXG4gICAgICAgICAgICAgICgoc3RhdGUuZ2FwIHx8IDApICogKHN0YXRlLnNsaWRlc1BlclZpZXcgLSAxKSkgLyBzdGF0ZS5zbGlkZXNQZXJWaWV3ICtcclxuICAgICAgICAgICAgICAncHgpJ1xyXG4gICAgICAgICAgICA6ICcwIDAgJyArIHRodW1iU2l6ZSArICdweCdcclxuICAgICAgICBcIlxyXG4gICAgICAgIFtzdHlsZS53aWR0aF09XCJjb25maWcuaXNUaHVtYnMgPyB0aHVtYlNpemUgKyAncHgnIDogbnVsbFwiXHJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCJjb25maWcuaXNUaHVtYnMgPyB0aHVtYlNpemUgKyAncHgnIDogbnVsbFwiXHJcbiAgICAgICAgKGNsaWNrKT1cImVuZ2luZS5zZWxlY3RTbGlkZShpKVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwic2xpZGVUZW1wbGF0ZSA/IHNsaWRlVGVtcGxhdGUgOiBkZWZhdWx0U2xpZGVUZW1wbGF0ZTsgY29udGV4dDogeyBzbGlkZTogc2xpZGUsIGluZGV4OiBpIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcbiJdfQ==