ctt-babylon 0.13.34 → 0.13.36

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 (29) hide show
  1. package/esm2022/lib/components/core/babylon-he-me-svg-text-cta-mot/babylon-he-me-svg-text-cta-mot.component.mjs +104 -0
  2. package/esm2022/lib/components/core/babylon-he-me-svg-text-cta-mot/index.mjs +2 -0
  3. package/esm2022/lib/components/core/babylon-sli-c3-svg-vid-cta/babylon-sli-c3-svg-vid-cta.component.mjs +98 -0
  4. package/esm2022/lib/components/core/babylon-sli-c3-svg-vid-cta/index.mjs +2 -0
  5. package/esm2022/lib/components/core/index.mjs +3 -1
  6. package/esm2022/lib/components/external/core/c2-txt-cta-des/c2-txt-cta-des.component.mjs +3 -3
  7. package/esm2022/lib/components/external/core/c2-txt-img-v2/c2-txt-img-v2.component.mjs +86 -0
  8. package/esm2022/lib/components/external/core/c2-txt-img-v2/c2-txt-img-v2.content.json +29 -0
  9. package/esm2022/lib/components/external/core/c2-txt-img-v2/c2-txt-img-v2.interfaces.mjs +2 -0
  10. package/esm2022/lib/components/external/core/c2-txt-img-v2/index.mjs +2 -0
  11. package/esm2022/lib/components/external/core/index.mjs +2 -1
  12. package/esm2022/lib/components/external/core/lis-c2-txt-img/lis-c2-txt-img.component.mjs +51 -93
  13. package/esm2022/lib/components/external/core/lis-c2-txt-img-svg-c/lis-c2-txt-img-svg-c.component.mjs +3 -3
  14. package/esm2022/lib/components/external/core/sli-c2-txt-img-svg-c/sli-c2-txt-img-svg-c.component.mjs +3 -3
  15. package/esm2022/lib/directives/sliders/swiper-init.directive.mjs +215 -0
  16. package/fesm2022/ctt-babylon.mjs +628 -151
  17. package/fesm2022/ctt-babylon.mjs.map +1 -1
  18. package/lib/components/core/babylon-he-me-svg-text-cta-mot/babylon-he-me-svg-text-cta-mot.component.d.ts +22 -0
  19. package/lib/components/core/babylon-he-me-svg-text-cta-mot/index.d.ts +1 -0
  20. package/lib/components/core/babylon-sli-c3-svg-vid-cta/babylon-sli-c3-svg-vid-cta.component.d.ts +14 -0
  21. package/lib/components/core/babylon-sli-c3-svg-vid-cta/index.d.ts +1 -0
  22. package/lib/components/core/index.d.ts +2 -0
  23. package/lib/components/external/core/c2-txt-img-v2/c2-txt-img-v2.component.d.ts +19 -0
  24. package/lib/components/external/core/c2-txt-img-v2/c2-txt-img-v2.interfaces.d.ts +14 -0
  25. package/lib/components/external/core/c2-txt-img-v2/index.d.ts +1 -0
  26. package/lib/components/external/core/index.d.ts +1 -0
  27. package/lib/components/external/core/lis-c2-txt-img/lis-c2-txt-img.component.d.ts +19 -17
  28. package/lib/directives/sliders/swiper-init.directive.d.ts +14 -0
  29. package/package.json +1 -1
@@ -0,0 +1,215 @@
1
+ import { isPlatformBrowser } from '@angular/common';
2
+ import { Directive, Inject, PLATFORM_ID, } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class SwiperInitDirective {
5
+ constructor(host, platformId) {
6
+ this.host = host;
7
+ this.platformId = platformId;
8
+ this.arrowCleanupFns = [];
9
+ }
10
+ async ngAfterViewInit() {
11
+ if (!isPlatformBrowser(this.platformId)) {
12
+ console.log('[SwiperInitDirective] No es browser, salgo');
13
+ return;
14
+ }
15
+ const parent = this.host.nativeElement;
16
+ const dataset = parent.dataset;
17
+ console.log('[SwiperInitDirective] ngAfterViewInit', {
18
+ parent,
19
+ dataset,
20
+ });
21
+ // Helpers para leer data-*
22
+ const get = (key) => dataset[key];
23
+ const getBool = (key) => get(key) === 'true';
24
+ const getNum = (key, fallback = 0) => {
25
+ const v = Number(get(key));
26
+ return Number.isFinite(v) ? v : fallback;
27
+ };
28
+ const sliderName = get('slider_name');
29
+ if (!sliderName) {
30
+ console.warn('[SwiperInitDirective] Sin data-slider_name en el parent', parent);
31
+ return;
32
+ }
33
+ const sliderSelector = parent.querySelector('.' + sliderName);
34
+ if (!sliderSelector) {
35
+ console.warn('[SwiperInitDirective] No encuentro el contenedor .', sliderName, ' dentro de ', parent);
36
+ return;
37
+ }
38
+ // Swiper ya inicializado → salir
39
+ if (sliderSelector.classList.contains('swiper-initialized')) {
40
+ console.log('[SwiperInitDirective] Swiper ya inicializado en este contenedor, salgo');
41
+ return;
42
+ }
43
+ // ====== LECTURA DE DATA-ATTRIBUTES ======
44
+ const showDots = getBool('slider_showdots');
45
+ const showButtons = getBool('slider_showbtns');
46
+ const fade = getBool('slider_fade');
47
+ const center = getBool('slider_centermode');
48
+ const autoplay = getBool('slider_autoplay');
49
+ const vertical = getBool('slider_vertical');
50
+ const rtl = getBool('slider_rtl');
51
+ const draggable = get('slider_draggable') !== 'false';
52
+ const adaptiveHeight = getBool('slider_adaptive_height');
53
+ const variableWidth = getBool('slider_variable_width');
54
+ const freeMode = getBool('slider_freemode');
55
+ const speed = getNum('slider_speed', 750);
56
+ const infinite = getBool('slides_infinite');
57
+ // contenedores
58
+ const navContainer = parent.querySelector('.js-slider-arrows');
59
+ const dotsContainer = parent.querySelector('.js-slider-dots');
60
+ // ====== SVG FLECHAS ======
61
+ const arrowSVG = `
62
+ <svg width="35" height="70" viewBox="0 0 35 70" fill="none" xmlns="http://www.w3.org/2000/svg">
63
+ <path d="M35 70C30.4037 70 25.8525 69.0947 21.6061 67.3358C17.3597 65.5769 13.5013 62.9988 10.2513 59.7487C7.00121 56.4987 4.42313 52.6403 2.66421 48.3939C0.9053 44.1475 -4.0182e-07 39.5963 0 35C4.0182e-07 30.4037 0.905303 25.8525 2.66422 21.6061C4.42313 17.3597 7.00121 13.5013 10.2513 10.2513C13.5013 7.00121 17.3597 4.42313 21.6061 2.66421C25.8525 0.9053 30.4037 -6.0273e-07 35 0V35V70Z" fill="#D0A67B"/>
64
+ <path d="M16.7368 28.126C16.5683 27.9578 16.2949 27.9577 16.1265 28.126C15.958 28.2944 15.9582 28.5678 16.1265 28.7363L22.6821 35.292L16.1265 41.8477C15.9579 42.0162 15.9579 42.2895 16.1265 42.458C16.295 42.6265 16.5683 42.6265 16.7368 42.458L23.5972 35.5977C23.6816 35.5133 23.7242 35.4026 23.7241 35.292C23.7241 35.1816 23.6814 35.0715 23.5972 34.9873L16.7368 28.126Z" fill="white"/>
65
+ </svg>`.trim();
66
+ if (showButtons && navContainer) {
67
+ if (!navContainer.querySelector('.swiper-button-prev')) {
68
+ const prev = document.createElement('div');
69
+ prev.className = 'swiper-button-prev';
70
+ prev.innerHTML = arrowSVG;
71
+ prev.style.transform = 'rotate(180deg)'; // Prev girada
72
+ navContainer.appendChild(prev);
73
+ }
74
+ if (!navContainer.querySelector('.swiper-button-next')) {
75
+ const next = document.createElement('div');
76
+ next.className = 'swiper-button-next';
77
+ next.innerHTML = arrowSVG;
78
+ navContainer.appendChild(next);
79
+ }
80
+ }
81
+ // ====== BREAKPOINTS ======
82
+ const slides_pc = getNum('slides_pc', 1);
83
+ const slides_laptop = getNum('slides_laptop', slides_pc);
84
+ const slides_tablet = getNum('slides_tablet', slides_laptop);
85
+ const slides_mobile = getNum('slides_mobile', slides_tablet);
86
+ const slides_mobile_small = getNum('slides_mobile_small', slides_mobile);
87
+ const slides_mobile_xsmall = getNum('slides_mobile_xsmall', slides_mobile_small);
88
+ // ====== OPCIONES SWIPER ======
89
+ const swiperOptions = {
90
+ direction: vertical ? 'vertical' : 'horizontal',
91
+ speed,
92
+ loop: infinite,
93
+ centeredSlides: center,
94
+ effect: fade ? 'fade' : 'slide',
95
+ autoplay: autoplay ? { delay: 5000 } : false,
96
+ allowTouchMove: draggable,
97
+ observer: true,
98
+ observeParents: true,
99
+ autoHeight: adaptiveHeight,
100
+ freeMode: freeMode ? { enabled: true, momentum: true } : false,
101
+ slidesPerView: variableWidth ? 'auto' : slides_mobile_xsmall,
102
+ spaceBetween: variableWidth ? 16 : 0,
103
+ navigation: showButtons && navContainer
104
+ ? {
105
+ nextEl: navContainer.querySelector('.swiper-button-next'),
106
+ prevEl: navContainer.querySelector('.swiper-button-prev'),
107
+ }
108
+ : undefined,
109
+ pagination: showDots && dotsContainer
110
+ ? { el: dotsContainer, clickable: true }
111
+ : undefined,
112
+ breakpoints: {
113
+ 540: {
114
+ slidesPerView: variableWidth ? 'auto' : slides_mobile_small,
115
+ freeMode: freeMode ? { enabled: true } : false,
116
+ },
117
+ 768: {
118
+ slidesPerView: variableWidth ? 'auto' : slides_mobile,
119
+ freeMode: freeMode ? { enabled: true } : false,
120
+ },
121
+ 1024: {
122
+ slidesPerView: variableWidth ? 'auto' : slides_tablet,
123
+ freeMode: freeMode ? { enabled: true } : false,
124
+ },
125
+ 1280: {
126
+ slidesPerView: variableWidth ? 'auto' : slides_laptop,
127
+ freeMode: freeMode ? { enabled: true } : false,
128
+ },
129
+ 1366: {
130
+ slidesPerView: variableWidth ? 'auto' : slides_pc,
131
+ freeMode: freeMode ? { enabled: true } : false,
132
+ },
133
+ },
134
+ };
135
+ // ====== INIT SWIPER ======
136
+ if (!Swiper) {
137
+ console.error('[SwiperInitDirective] Swiper global no encontrado (window.Swiper es falsy)');
138
+ return;
139
+ }
140
+ console.log('[SwiperInitDirective] INIT SWIPER', {
141
+ sliderName,
142
+ sliderSelector,
143
+ options: swiperOptions,
144
+ swiperType: typeof Swiper,
145
+ });
146
+ this.swiperInstance = new Swiper(sliderSelector, swiperOptions);
147
+ // Posición flechas tipo --sliderNav__position
148
+ this.initArrowPositioning(parent);
149
+ }
150
+ ngOnDestroy() {
151
+ if (!isPlatformBrowser(this.platformId))
152
+ return;
153
+ if (this.swiperInstance?.destroy) {
154
+ this.swiperInstance.destroy(true, true);
155
+ }
156
+ this.arrowCleanupFns.forEach((fn) => fn());
157
+ this.arrowCleanupFns = [];
158
+ }
159
+ // ======== POSICIÓN DE FLECHAS (equivalente js-slider_fix-arrows) ========
160
+ initArrowPositioning(parent) {
161
+ const sliders = parent.querySelectorAll('.js-slider_fix-arrows');
162
+ if (!sliders.length)
163
+ return;
164
+ sliders.forEach((slider) => {
165
+ const section = slider.closest('.js-active-slider') || parent;
166
+ if (!section)
167
+ return;
168
+ const calcPosition = () => {
169
+ let heightSelector = null;
170
+ const mobileSel = slider.querySelector('.js-slider_fix-arrows-zone.mobile');
171
+ const desktopSel = slider.querySelector('.js-slider_fix-arrows-zone.desktop');
172
+ const genericSel = slider.querySelector('.js-slider_fix-arrows-zone');
173
+ if (mobileSel && window.innerWidth <= 1279) {
174
+ heightSelector = mobileSel;
175
+ }
176
+ else if (desktopSel && window.innerWidth >= 1280) {
177
+ heightSelector = desktopSel;
178
+ }
179
+ else {
180
+ heightSelector = genericSel;
181
+ }
182
+ if (!heightSelector)
183
+ return;
184
+ const relative = heightSelector.closest('.relative');
185
+ if (!relative)
186
+ return;
187
+ const rect = heightSelector.getBoundingClientRect();
188
+ const parentRect = relative.getBoundingClientRect();
189
+ const height = rect.top - parentRect.top + rect.height / 2;
190
+ section.style.setProperty('--sliderNav__position', `${height}px`);
191
+ };
192
+ calcPosition();
193
+ setTimeout(calcPosition, 500);
194
+ const onScroll = () => calcPosition();
195
+ const onResize = () => calcPosition();
196
+ window.addEventListener('scroll', onScroll, { passive: true });
197
+ window.addEventListener('resize', onResize, { passive: true });
198
+ this.arrowCleanupFns.push(() => window.removeEventListener('scroll', onScroll));
199
+ this.arrowCleanupFns.push(() => window.removeEventListener('resize', onResize));
200
+ });
201
+ }
202
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SwiperInitDirective, deps: [{ token: i0.ElementRef }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Directive }); }
203
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: SwiperInitDirective, isStandalone: true, selector: ".js-active-slider,[appSwiperInit]", ngImport: i0 }); }
204
+ }
205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SwiperInitDirective, decorators: [{
206
+ type: Directive,
207
+ args: [{
208
+ selector: '.js-active-slider,[appSwiperInit]',
209
+ standalone: true,
210
+ }]
211
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: undefined, decorators: [{
212
+ type: Inject,
213
+ args: [PLATFORM_ID]
214
+ }] }] });
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpcGVyLWluaXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFieWxvbi9zcmMvbGliL2RpcmVjdGl2ZXMvc2xpZGVycy9zd2lwZXItaW5pdC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUVILFNBQVMsRUFFVCxNQUFNLEVBRU4sV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDOztBQVN2QixNQUFNLE9BQU8sbUJBQW1CO0lBSTVCLFlBQ1ksSUFBNkIsRUFDUixVQUFrQjtRQUR2QyxTQUFJLEdBQUosSUFBSSxDQUF5QjtRQUNSLGVBQVUsR0FBVixVQUFVLENBQVE7UUFKM0Msb0JBQWUsR0FBc0IsRUFBRSxDQUFDO0lBSzdDLENBQUM7SUFFSixLQUFLLENBQUMsZUFBZTtRQUNqQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUMxRCxPQUFPO1NBQ1Y7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBdUIsQ0FBQztRQUUvQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxFQUFFO1lBQ2pELE1BQU07WUFDTixPQUFPO1NBQ1YsQ0FBQyxDQUFDO1FBRUgsMkJBQTJCO1FBQzNCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBVyxFQUFzQixFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBVyxFQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDO1FB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QztZQUUvRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDM0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FDakQsQ0FBQztZQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUMzQixNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUNqRCxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOytHQXRSUSxtQkFBbUIsNENBTWhCLFdBQVc7bUdBTmQsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUovQixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxtQ0FBbUM7b0JBQzdDLFVBQVUsRUFBRSxJQUFJO2lCQUNuQjs7MEJBT1EsTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgUExBVEZPUk1fSUQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vLyBTd2lwZXIgZ2xvYmFsICh2aWVuZSBkZWwgYW5ndWxhci5qc29uIC0+IHNjcmlwdHMpXG5kZWNsYXJlIGNvbnN0IFN3aXBlcjogYW55O1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJy5qcy1hY3RpdmUtc2xpZGVyLFthcHBTd2lwZXJJbml0XScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgU3dpcGVySW5pdERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSBzd2lwZXJJbnN0YW5jZT86IGFueTtcbiAgICBwcml2YXRlIGFycm93Q2xlYW51cEZuczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGhvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IG9iamVjdFxuICAgICkge31cblxuICAgIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1N3aXBlckluaXREaXJlY3RpdmVdIE5vIGVzIGJyb3dzZXIsIHNhbGdvJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgZGF0YXNldCA9IHBhcmVudC5kYXRhc2V0IGFzIERPTVN0cmluZ01hcDtcblxuICAgICAgICBjb25zb2xlLmxvZygnW1N3aXBlckluaXREaXJlY3RpdmVdIG5nQWZ0ZXJWaWV3SW5pdCcsIHtcbiAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgIGRhdGFzZXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhlbHBlcnMgcGFyYSBsZWVyIGRhdGEtKlxuICAgICAgICBjb25zdCBnZXQgPSAoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4gZGF0YXNldFtrZXldO1xuICAgICAgICBjb25zdCBnZXRCb29sID0gKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiBnZXQoa2V5KSA9PT0gJ3RydWUnO1xuICAgICAgICBjb25zdCBnZXROdW0gPSAoa2V5OiBzdHJpbmcsIGZhbGxiYWNrID0gMCk6IG51bWJlciA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ID0gTnVtYmVyKGdldChrZXkpKTtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodikgPyB2IDogZmFsbGJhY2s7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgc2xpZGVyTmFtZSA9IGdldCgnc2xpZGVyX25hbWUnKTtcbiAgICAgICAgaWYgKCFzbGlkZXJOYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgJ1tTd2lwZXJJbml0RGlyZWN0aXZlXSBTaW4gZGF0YS1zbGlkZXJfbmFtZSBlbiBlbCBwYXJlbnQnLFxuICAgICAgICAgICAgICAgIHBhcmVudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNsaWRlclNlbGVjdG9yID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFxuICAgICAgICAgICAgJy4nICsgc2xpZGVyTmFtZVxuICAgICAgICApO1xuICAgICAgICBpZiAoIXNsaWRlclNlbGVjdG9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgJ1tTd2lwZXJJbml0RGlyZWN0aXZlXSBObyBlbmN1ZW50cm8gZWwgY29udGVuZWRvciAuJyxcbiAgICAgICAgICAgICAgICBzbGlkZXJOYW1lLFxuICAgICAgICAgICAgICAgICcgZGVudHJvIGRlICcsXG4gICAgICAgICAgICAgICAgcGFyZW50XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3dpcGVyIHlhIGluaWNpYWxpemFkbyDihpIgc2FsaXJcbiAgICAgICAgaWYgKHNsaWRlclNlbGVjdG9yLmNsYXNzTGlzdC5jb250YWlucygnc3dpcGVyLWluaXRpYWxpemVkJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICdbU3dpcGVySW5pdERpcmVjdGl2ZV0gU3dpcGVyIHlhIGluaWNpYWxpemFkbyBlbiBlc3RlIGNvbnRlbmVkb3IsIHNhbGdvJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09PSBMRUNUVVJBIERFIERBVEEtQVRUUklCVVRFUyA9PT09PT1cbiAgICAgICAgY29uc3Qgc2hvd0RvdHMgPSBnZXRCb29sKCdzbGlkZXJfc2hvd2RvdHMnKTtcbiAgICAgICAgY29uc3Qgc2hvd0J1dHRvbnMgPSBnZXRCb29sKCdzbGlkZXJfc2hvd2J0bnMnKTtcbiAgICAgICAgY29uc3QgZmFkZSA9IGdldEJvb2woJ3NsaWRlcl9mYWRlJyk7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IGdldEJvb2woJ3NsaWRlcl9jZW50ZXJtb2RlJyk7XG4gICAgICAgIGNvbnN0IGF1dG9wbGF5ID0gZ2V0Qm9vbCgnc2xpZGVyX2F1dG9wbGF5Jyk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsID0gZ2V0Qm9vbCgnc2xpZGVyX3ZlcnRpY2FsJyk7XG4gICAgICAgIGNvbnN0IHJ0bCA9IGdldEJvb2woJ3NsaWRlcl9ydGwnKTtcbiAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gZ2V0KCdzbGlkZXJfZHJhZ2dhYmxlJykgIT09ICdmYWxzZSc7XG4gICAgICAgIGNvbnN0IGFkYXB0aXZlSGVpZ2h0ID0gZ2V0Qm9vbCgnc2xpZGVyX2FkYXB0aXZlX2hlaWdodCcpO1xuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlV2lkdGggPSBnZXRCb29sKCdzbGlkZXJfdmFyaWFibGVfd2lkdGgnKTtcbiAgICAgICAgY29uc3QgZnJlZU1vZGUgPSBnZXRCb29sKCdzbGlkZXJfZnJlZW1vZGUnKTtcblxuICAgICAgICBjb25zdCBzcGVlZCA9IGdldE51bSgnc2xpZGVyX3NwZWVkJywgNzUwKTtcbiAgICAgICAgY29uc3QgaW5maW5pdGUgPSBnZXRCb29sKCdzbGlkZXNfaW5maW5pdGUnKTtcblxuICAgICAgICAvLyBjb250ZW5lZG9yZXNcbiAgICAgICAgY29uc3QgbmF2Q29udGFpbmVyID1cbiAgICAgICAgICAgIHBhcmVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmpzLXNsaWRlci1hcnJvd3MnKTtcbiAgICAgICAgY29uc3QgZG90c0NvbnRhaW5lciA9XG4gICAgICAgICAgICBwYXJlbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5qcy1zbGlkZXItZG90cycpO1xuXG4gICAgICAgIC8vID09PT09PSBTVkcgRkxFQ0hBUyA9PT09PT1cbiAgICAgICAgY29uc3QgYXJyb3dTVkcgPSBgXG48c3ZnIHdpZHRoPVwiMzVcIiBoZWlnaHQ9XCI3MFwiIHZpZXdCb3g9XCIwIDAgMzUgNzBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbjxwYXRoIGQ9XCJNMzUgNzBDMzAuNDAzNyA3MCAyNS44NTI1IDY5LjA5NDcgMjEuNjA2MSA2Ny4zMzU4QzE3LjM1OTcgNjUuNTc2OSAxMy41MDEzIDYyLjk5ODggMTAuMjUxMyA1OS43NDg3QzcuMDAxMjEgNTYuNDk4NyA0LjQyMzEzIDUyLjY0MDMgMi42NjQyMSA0OC4zOTM5QzAuOTA1MyA0NC4xNDc1IC00LjAxODJlLTA3IDM5LjU5NjMgMCAzNUM0LjAxODJlLTA3IDMwLjQwMzcgMC45MDUzMDMgMjUuODUyNSAyLjY2NDIyIDIxLjYwNjFDNC40MjMxMyAxNy4zNTk3IDcuMDAxMjEgMTMuNTAxMyAxMC4yNTEzIDEwLjI1MTNDMTMuNTAxMyA3LjAwMTIxIDE3LjM1OTcgNC40MjMxMyAyMS42MDYxIDIuNjY0MjFDMjUuODUyNSAwLjkwNTMgMzAuNDAzNyAtNi4wMjczZS0wNyAzNSAwVjM1VjcwWlwiIGZpbGw9XCIjRDBBNjdCXCIvPlxuPHBhdGggZD1cIk0xNi43MzY4IDI4LjEyNkMxNi41NjgzIDI3Ljk1NzggMTYuMjk0OSAyNy45NTc3IDE2LjEyNjUgMjguMTI2QzE1Ljk1OCAyOC4yOTQ0IDE1Ljk1ODIgMjguNTY3OCAxNi4xMjY1IDI4LjczNjNMMjIuNjgyMSAzNS4yOTJMMTYuMTI2NSA0MS44NDc3QzE1Ljk1NzkgNDIuMDE2MiAxNS45NTc5IDQyLjI4OTUgMTYuMTI2NSA0Mi40NThDMTYuMjk1IDQyLjYyNjUgMTYuNTY4MyA0Mi42MjY1IDE2LjczNjggNDIuNDU4TDIzLjU5NzIgMzUuNTk3N0MyMy42ODE2IDM1LjUxMzMgMjMuNzI0MiAzNS40MDI2IDIzLjcyNDEgMzUuMjkyQzIzLjcyNDEgMzUuMTgxNiAyMy42ODE0IDM1LjA3MTUgMjMuNTk3MiAzNC45ODczTDE2LjczNjggMjguMTI2WlwiIGZpbGw9XCJ3aGl0ZVwiLz5cbjwvc3ZnPmAudHJpbSgpO1xuXG4gICAgICAgIGlmIChzaG93QnV0dG9ucyAmJiBuYXZDb250YWluZXIpIHtcbiAgICAgICAgICAgIGlmICghbmF2Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItYnV0dG9uLXByZXYnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBwcmV2LmNsYXNzTmFtZSA9ICdzd2lwZXItYnV0dG9uLXByZXYnO1xuICAgICAgICAgICAgICAgIHByZXYuaW5uZXJIVE1MID0gYXJyb3dTVkc7XG4gICAgICAgICAgICAgICAgcHJldi5zdHlsZS50cmFuc2Zvcm0gPSAncm90YXRlKDE4MGRlZyknOyAvLyBQcmV2IGdpcmFkYVxuICAgICAgICAgICAgICAgIG5hdkNvbnRhaW5lci5hcHBlbmRDaGlsZChwcmV2KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFuYXZDb250YWluZXIucXVlcnlTZWxlY3RvcignLnN3aXBlci1idXR0b24tbmV4dCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIG5leHQuY2xhc3NOYW1lID0gJ3N3aXBlci1idXR0b24tbmV4dCc7XG4gICAgICAgICAgICAgICAgbmV4dC5pbm5lckhUTUwgPSBhcnJvd1NWRztcbiAgICAgICAgICAgICAgICBuYXZDb250YWluZXIuYXBwZW5kQ2hpbGQobmV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PT0gQlJFQUtQT0lOVFMgPT09PT09XG4gICAgICAgIGNvbnN0IHNsaWRlc19wYyA9IGdldE51bSgnc2xpZGVzX3BjJywgMSk7XG4gICAgICAgIGNvbnN0IHNsaWRlc19sYXB0b3AgPSBnZXROdW0oJ3NsaWRlc19sYXB0b3AnLCBzbGlkZXNfcGMpO1xuICAgICAgICBjb25zdCBzbGlkZXNfdGFibGV0ID0gZ2V0TnVtKCdzbGlkZXNfdGFibGV0Jywgc2xpZGVzX2xhcHRvcCk7XG4gICAgICAgIGNvbnN0IHNsaWRlc19tb2JpbGUgPSBnZXROdW0oJ3NsaWRlc19tb2JpbGUnLCBzbGlkZXNfdGFibGV0KTtcbiAgICAgICAgY29uc3Qgc2xpZGVzX21vYmlsZV9zbWFsbCA9IGdldE51bShcbiAgICAgICAgICAgICdzbGlkZXNfbW9iaWxlX3NtYWxsJyxcbiAgICAgICAgICAgIHNsaWRlc19tb2JpbGVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc2xpZGVzX21vYmlsZV94c21hbGwgPSBnZXROdW0oXG4gICAgICAgICAgICAnc2xpZGVzX21vYmlsZV94c21hbGwnLFxuICAgICAgICAgICAgc2xpZGVzX21vYmlsZV9zbWFsbFxuICAgICAgICApO1xuXG4gICAgICAgIC8vID09PT09PSBPUENJT05FUyBTV0lQRVIgPT09PT09XG4gICAgICAgIGNvbnN0IHN3aXBlck9wdGlvbnM6IGFueSA9IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogdmVydGljYWwgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnLFxuICAgICAgICAgICAgc3BlZWQsXG4gICAgICAgICAgICBsb29wOiBpbmZpbml0ZSxcbiAgICAgICAgICAgIGNlbnRlcmVkU2xpZGVzOiBjZW50ZXIsXG4gICAgICAgICAgICBlZmZlY3Q6IGZhZGUgPyAnZmFkZScgOiAnc2xpZGUnLFxuICAgICAgICAgICAgYXV0b3BsYXk6IGF1dG9wbGF5ID8geyBkZWxheTogNTAwMCB9IDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd1RvdWNoTW92ZTogZHJhZ2dhYmxlLFxuICAgICAgICAgICAgb2JzZXJ2ZXI6IHRydWUsXG4gICAgICAgICAgICBvYnNlcnZlUGFyZW50czogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9IZWlnaHQ6IGFkYXB0aXZlSGVpZ2h0LFxuXG4gICAgICAgICAgICBmcmVlTW9kZTogZnJlZU1vZGUgPyB7IGVuYWJsZWQ6IHRydWUsIG1vbWVudHVtOiB0cnVlIH0gOiBmYWxzZSxcblxuICAgICAgICAgICAgc2xpZGVzUGVyVmlldzogdmFyaWFibGVXaWR0aCA/ICdhdXRvJyA6IHNsaWRlc19tb2JpbGVfeHNtYWxsLFxuICAgICAgICAgICAgc3BhY2VCZXR3ZWVuOiB2YXJpYWJsZVdpZHRoID8gMTYgOiAwLFxuXG4gICAgICAgICAgICBuYXZpZ2F0aW9uOlxuICAgICAgICAgICAgICAgIHNob3dCdXR0b25zICYmIG5hdkNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVsOiBuYXZDb250YWluZXIucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuc3dpcGVyLWJ1dHRvbi1uZXh0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2RWw6IG5hdkNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5zd2lwZXItYnV0dG9uLXByZXYnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcblxuICAgICAgICAgICAgcGFnaW5hdGlvbjpcbiAgICAgICAgICAgICAgICBzaG93RG90cyAmJiBkb3RzQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgID8geyBlbDogZG90c0NvbnRhaW5lciwgY2xpY2thYmxlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG5cbiAgICAgICAgICAgIGJyZWFrcG9pbnRzOiB7XG4gICAgICAgICAgICAgICAgNTQwOiB7XG4gICAgICAgICAgICAgICAgICAgIHNsaWRlc1BlclZpZXc6IHZhcmlhYmxlV2lkdGggPyAnYXV0bycgOiBzbGlkZXNfbW9iaWxlX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBmcmVlTW9kZTogZnJlZU1vZGUgPyB7IGVuYWJsZWQ6IHRydWUgfSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgNzY4OiB7XG4gICAgICAgICAgICAgICAgICAgIHNsaWRlc1BlclZpZXc6IHZhcmlhYmxlV2lkdGggPyAnYXV0bycgOiBzbGlkZXNfbW9iaWxlLFxuICAgICAgICAgICAgICAgICAgICBmcmVlTW9kZTogZnJlZU1vZGUgPyB7IGVuYWJsZWQ6IHRydWUgfSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgMTAyNDoge1xuICAgICAgICAgICAgICAgICAgICBzbGlkZXNQZXJWaWV3OiB2YXJpYWJsZVdpZHRoID8gJ2F1dG8nIDogc2xpZGVzX3RhYmxldCxcbiAgICAgICAgICAgICAgICAgICAgZnJlZU1vZGU6IGZyZWVNb2RlID8geyBlbmFibGVkOiB0cnVlIH0gOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIDEyODA6IHtcbiAgICAgICAgICAgICAgICAgICAgc2xpZGVzUGVyVmlldzogdmFyaWFibGVXaWR0aCA/ICdhdXRvJyA6IHNsaWRlc19sYXB0b3AsXG4gICAgICAgICAgICAgICAgICAgIGZyZWVNb2RlOiBmcmVlTW9kZSA/IHsgZW5hYmxlZDogdHJ1ZSB9IDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAxMzY2OiB7XG4gICAgICAgICAgICAgICAgICAgIHNsaWRlc1BlclZpZXc6IHZhcmlhYmxlV2lkdGggPyAnYXV0bycgOiBzbGlkZXNfcGMsXG4gICAgICAgICAgICAgICAgICAgIGZyZWVNb2RlOiBmcmVlTW9kZSA/IHsgZW5hYmxlZDogdHJ1ZSB9IDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gPT09PT09IElOSVQgU1dJUEVSID09PT09PVxuICAgICAgICBpZiAoIVN3aXBlcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAnW1N3aXBlckluaXREaXJlY3RpdmVdIFN3aXBlciBnbG9iYWwgbm8gZW5jb250cmFkbyAod2luZG93LlN3aXBlciBlcyBmYWxzeSknXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ1tTd2lwZXJJbml0RGlyZWN0aXZlXSBJTklUIFNXSVBFUicsIHtcbiAgICAgICAgICAgIHNsaWRlck5hbWUsXG4gICAgICAgICAgICBzbGlkZXJTZWxlY3RvcixcbiAgICAgICAgICAgIG9wdGlvbnM6IHN3aXBlck9wdGlvbnMsXG4gICAgICAgICAgICBzd2lwZXJUeXBlOiB0eXBlb2YgU3dpcGVyLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN3aXBlckluc3RhbmNlID0gbmV3IFN3aXBlcihzbGlkZXJTZWxlY3Rvciwgc3dpcGVyT3B0aW9ucyk7XG5cbiAgICAgICAgLy8gUG9zaWNpw7NuIGZsZWNoYXMgdGlwbyAtLXNsaWRlck5hdl9fcG9zaXRpb25cbiAgICAgICAgdGhpcy5pbml0QXJyb3dQb3NpdGlvbmluZyhwYXJlbnQpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5zd2lwZXJJbnN0YW5jZT8uZGVzdHJveSkge1xuICAgICAgICAgICAgdGhpcy5zd2lwZXJJbnN0YW5jZS5kZXN0cm95KHRydWUsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcnJvd0NsZWFudXBGbnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICAgICAgICB0aGlzLmFycm93Q2xlYW51cEZucyA9IFtdO1xuICAgIH1cblxuICAgIC8vID09PT09PT09IFBPU0lDScOTTiBERSBGTEVDSEFTIChlcXVpdmFsZW50ZSBqcy1zbGlkZXJfZml4LWFycm93cykgPT09PT09PT1cbiAgICBwcml2YXRlIGluaXRBcnJvd1Bvc2l0aW9uaW5nKHBhcmVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2xpZGVycyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgICcuanMtc2xpZGVyX2ZpeC1hcnJvd3MnXG4gICAgICAgICk7XG4gICAgICAgIGlmICghc2xpZGVycy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICBzbGlkZXJzLmZvckVhY2goKHNsaWRlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9XG4gICAgICAgICAgICAgICAgc2xpZGVyLmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCcuanMtYWN0aXZlLXNsaWRlcicpIHx8IHBhcmVudDtcbiAgICAgICAgICAgIGlmICghc2VjdGlvbikgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBjYWxjUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodFNlbGVjdG9yOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbW9iaWxlU2VsID0gc2xpZGVyLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFxuICAgICAgICAgICAgICAgICAgICAnLmpzLXNsaWRlcl9maXgtYXJyb3dzLXpvbmUubW9iaWxlJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVza3RvcFNlbCA9IHNsaWRlci5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgICAgICAgICAgJy5qcy1zbGlkZXJfZml4LWFycm93cy16b25lLmRlc2t0b3AnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBnZW5lcmljU2VsID0gc2xpZGVyLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFxuICAgICAgICAgICAgICAgICAgICAnLmpzLXNsaWRlcl9maXgtYXJyb3dzLXpvbmUnXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChtb2JpbGVTZWwgJiYgd2luZG93LmlubmVyV2lkdGggPD0gMTI3OSkge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHRTZWxlY3RvciA9IG1vYmlsZVNlbDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2t0b3BTZWwgJiYgd2luZG93LmlubmVyV2lkdGggPj0gMTI4MCkge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHRTZWxlY3RvciA9IGRlc2t0b3BTZWw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0U2VsZWN0b3IgPSBnZW5lcmljU2VsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghaGVpZ2h0U2VsZWN0b3IpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlID1cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0U2VsZWN0b3IuY2xvc2VzdDxIVE1MRWxlbWVudD4oJy5yZWxhdGl2ZScpO1xuICAgICAgICAgICAgICAgIGlmICghcmVsYXRpdmUpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBoZWlnaHRTZWxlY3Rvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRSZWN0ID0gcmVsYXRpdmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gcmVjdC50b3AgLSBwYXJlbnRSZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMjtcblxuICAgICAgICAgICAgICAgIHNlY3Rpb24uc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgICctLXNsaWRlck5hdl9fcG9zaXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBgJHtoZWlnaHR9cHhgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNhbGNQb3NpdGlvbigpO1xuICAgICAgICAgICAgc2V0VGltZW91dChjYWxjUG9zaXRpb24sIDUwMCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9uU2Nyb2xsID0gKCkgPT4gY2FsY1Bvc2l0aW9uKCk7XG4gICAgICAgICAgICBjb25zdCBvblJlc2l6ZSA9ICgpID0+IGNhbGNQb3NpdGlvbigpO1xuXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmFycm93Q2xlYW51cEZucy5wdXNoKCgpID0+XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYXJyb3dDbGVhbnVwRm5zLnB1c2goKCkgPT5cbiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgb25SZXNpemUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=