ngx-slice-kit
Version:
[](https://badge.fury.io/js/ngx-slice-kit)
180 lines • 29.1 kB
JavaScript
import { Component, Input, ViewChild } from '@angular/core';
import { BehaviorSubject, fromEvent, Subscription } from 'rxjs';
import { delay, throttleTime } from 'rxjs/operators';
import { slideInAnimation } from '../../core/animations/slide-in';
import * as i0 from "@angular/core";
import * as i1 from "../../core/theme/theme.service";
export class TabsGroupComponent {
constructor(themeService, cdRef) {
this.themeService = themeService;
this.cdRef = cdRef;
this.activeTabStyle = 'border';
this.animation = false;
this.subscription = new Subscription();
this.tabGroup = [];
this.allTabsWidth = 0;
this.arrowWidth = 40;
this.containerPosition$ = new BehaviorSubject(null);
this.slideMeasure = {
width: 0,
left: 0
};
}
selectTab(selectedTab = null, index = null) {
setTimeout(() => {
this.curTab = this.containerElement.querySelector(`.sdk-tab-container__tab--active`);
this.curTabClientRect = this.curTab.getBoundingClientRect();
// if current element not fully visible
if (this.isArrows) {
if ((this.curTabClientRect.left - this.arrowWidth) < this.containerRect.left) {
const visiblePart = this.curTabClientRect.right - this.arrowWidth - this.containerRect.left;
const hiddenPart = this.curTabClientRect.width - visiblePart;
const additionalPadding = 40;
this.scrollLeft(hiddenPart + additionalPadding);
}
if ((this.curTabClientRect.right + this.arrowWidth) > this.containerRect.right) {
const visiblePart = this.containerRect.right - this.arrowWidth - this.curTabClientRect.left;
const hiddenPart = this.curTabClientRect.width - visiblePart;
const additionalPadding = 40;
this.scrollRight(hiddenPart + additionalPadding);
}
}
this.setUnderlineMeasure();
});
}
scrollRight(step = null) {
let x = parseInt(this.tabsWrapperElement.style.left, 10) || 0;
const defaultStep = this.containerRect.width / 100 * 30;
let scrollStep = defaultStep;
this.tabsScrollRect = this.tabsWrapperElement.getBoundingClientRect();
if (this.tabsScrollRect.right - scrollStep < this.containerRect.right + this.arrowWidth) {
scrollStep = (this.tabsScrollRect.right - this.containerRect.right) + this.arrowWidth;
}
else {
scrollStep = step ? step : defaultStep;
}
x -= scrollStep;
this.moveContainer(x);
}
scrollLeft(step = null) {
let x = parseInt(this.tabsWrapperElement.style.left, 10) || 0;
const defaultStep = this.containerRect.width / 100 * 30;
let scrollStep = defaultStep;
this.tabsScrollRect = this.tabsWrapperElement.getBoundingClientRect();
if (this.tabsScrollRect.left + scrollStep > this.containerRect.left + this.arrowWidth) {
x = 0;
}
else {
scrollStep = step ? step : defaultStep;
x += scrollStep;
}
this.moveContainer(x);
}
moveContainer(x) {
let newX = x;
if (Math.abs(x) + this.containerWidth - (this.arrowLeftElement.offsetWidth * 2) > this.allTabsWidth) {
newX = this.containerWidth - (this.arrowLeftElement.offsetWidth * 2) - this.allTabsWidth;
}
this.tabsWrapperElement.style.left = newX + 'px';
this.containerPosition$.next(true);
}
setUnderlineMeasure() {
this.curTabClientRect = this.curTab.getBoundingClientRect();
this.slideMeasure.width = `${this.curTabClientRect.width}px`;
this.slideMeasure.left = `${this.curTab.offsetLeft}px`;
}
setSizes() {
this.containerRect = this.containerElement.getBoundingClientRect();
this.containerWidth = this.containerRect.width;
this.tabsWrapperWidth = this.containerWidth - (this.isArrows ? (this.arrowWidth * 2) : 0);
}
setTabSizes() {
this.allTabsWidth = 0;
this.tabsViewElements.forEach(tab => {
const tabWidth = tab.offsetWidth;
this.allTabsWidth += tabWidth;
if (tabWidth > this.tabsWrapperWidth) {
tab.classList.add('sdk-tab-container__tab--oversize');
}
});
this.tabsScrollRect = this.tabsWrapperElement.getBoundingClientRect();
}
changeRects() {
this.tabsScrollRect = this.tabsWrapperElement.getBoundingClientRect();
this.curTabClientRect = this.curTab.getBoundingClientRect();
}
setSubscriptions() {
this.subscription = this.containerPosition$.pipe(delay(400)).subscribe(() => this.changeRects());
const subResize = fromEvent(window, 'resize')
.subscribe(() => {
this.setSizes();
this.isArrows = this.allTabsWidth > this.containerWidth;
if (!this.isArrows) {
const x = Math.abs(parseFloat(this.tabsWrapperElement.style.left)) || 0;
this.tabsWrapperElement.style.left = '0px';
if (x !== 0) {
this.slideMeasure.left = `${parseFloat(this.slideMeasure.left) + x}px`;
}
}
});
const subRightArrow = fromEvent(this.arrowRightElement, 'click')
.pipe(throttleTime(500))
.subscribe(() => {
this.scrollRight();
});
const subLeftArrow = fromEvent(this.arrowLeftElement, 'click')
.pipe(throttleTime(500))
.subscribe(() => {
this.scrollLeft();
});
this.subscription.add(subResize);
this.subscription.add(subRightArrow);
this.subscription.add(subLeftArrow);
}
ngOnInit() {
this.containerElement = this.containerElement.nativeElement || this.containerElement;
this.tabsWrapperElement = this.tabsWrapperElement.nativeElement || this.tabsWrapperElement;
this.arrowLeftElement = this.arrowLeftElement.nativeElement || this.arrowLeftElement;
this.arrowRightElement = this.arrowRightElement.nativeElement || this.arrowRightElement;
this.setSizes();
this.setSubscriptions();
}
ngAfterViewInit() {
this.tabsViewElements = Array.from(this.tabsWrapperElement.children);
this.setTabSizes();
this.isArrows = this.allTabsWidth > this.containerWidth;
}
ngAfterViewChecked() {
this.cdRef.detectChanges();
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
TabsGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TabsGroupComponent, deps: [{ token: i1.ThemeService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
TabsGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: TabsGroupComponent, selector: "ng-component", inputs: { activeTabStyle: "activeTabStyle", animation: "animation" }, viewQueries: [{ propertyName: "containerElement", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "tabsWrapperElement", first: true, predicate: ["tabs"], descendants: true, static: true }, { propertyName: "arrowLeftElement", first: true, predicate: ["arrowLeft"], descendants: true, static: true }, { propertyName: "arrowRightElement", first: true, predicate: ["arrowRight"], descendants: true, static: true }], ngImport: i0, template: '', isInline: true, styles: [""], animations: [
slideInAnimation
] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TabsGroupComponent, decorators: [{
type: Component,
args: [{ template: '', animations: [
slideInAnimation
] }]
}], ctorParameters: function () { return [{ type: i1.ThemeService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { activeTabStyle: [{
type: Input
}], animation: [{
type: Input
}], containerElement: [{
type: ViewChild,
args: ['container', { static: true }]
}], tabsWrapperElement: [{
type: ViewChild,
args: ['tabs', { static: true }]
}], arrowLeftElement: [{
type: ViewChild,
args: ['arrowLeft', { static: true }]
}], arrowRightElement: [{
type: ViewChild,
args: ['arrowRight', { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1zbGljZS1raXQvc3JjL2xpYi9uYXZpZ2F0aW9uL3RhYnMtZ3JvdXAvdGFicy1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlILFNBQVMsRUFDVCxLQUFLLEVBR0wsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7QUFTbEUsTUFBTSxPQUFPLGtCQUFrQjtJQWdDM0IsWUFDVyxZQUEwQixFQUN2QixLQUF3QjtRQUQzQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN2QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQS9CdEIsbUJBQWMsR0FBVyxRQUFRLENBQUM7UUFDbEMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQU9wQyxpQkFBWSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBSWhELGFBQVEsR0FBVSxFQUFFLENBQUM7UUFHckIsaUJBQVksR0FBVyxDQUFDLENBQUM7UUFDekIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQU14Qix1QkFBa0IsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQyxpQkFBWSxHQUE4QjtZQUM3QyxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksRUFBRSxDQUFDO1NBQ1YsQ0FBQztJQU1GLENBQUM7SUFHTSxTQUFTLENBQUMsV0FBVyxHQUFHLElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSTtRQUM3QyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFB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QUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzVELENBQUM7SUFFTSxrQkFBa0I7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRU0sV0FBVztRQUNkLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEMsQ0FBQzs7K0dBN0xRLGtCQUFrQjttR0FBbEIsa0JBQWtCLGdrQkFOakIsRUFBRSw0Q0FFQTtRQUNSLGdCQUFnQjtLQUNuQjsyRkFFUSxrQkFBa0I7a0JBUDlCLFNBQVM7K0JBQ0ksRUFBRSxjQUVBO3dCQUNSLGdCQUFnQjtxQkFDbkI7bUlBS2UsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUV5QyxnQkFBZ0I7c0JBQTlELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDSSxrQkFBa0I7c0JBQTNELFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDYyxnQkFBZ0I7c0JBQTlELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDVSxpQkFBaUI7c0JBQWhFLFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksIE9uSW5pdCxcbiAgICBRdWVyeUxpc3QsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tRXZlbnQsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS90aGVtZS90aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7IGRlbGF5LCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBzbGlkZUluQW5pbWF0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9hbmltYXRpb25zL3NsaWRlLWluJztcblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGU6ICcnLFxuICAgIHN0eWxlVXJsczogWycuL3RhYnMtZ3JvdXAuY29tcG9uZW50LnNjc3MnXSxcbiAgICBhbmltYXRpb25zOiBbXG4gICAgICAgIHNsaWRlSW5BbmltYXRpb25cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFRhYnNHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95IHtcbiAgICBwdWJsaWMgdGFiczogUXVlcnlMaXN0PGFueT47XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgYWN0aXZlVGFiU3R5bGU6IHN0cmluZyA9ICdib3JkZXInO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhbmltYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHtzdGF0aWM6IHRydWV9KSBwdWJsaWMgY29udGFpbmVyRWxlbWVudDtcbiAgICBAVmlld0NoaWxkKCd0YWJzJywge3N0YXRpYzogdHJ1ZX0pIHB1YmxpYyB0YWJzV3JhcHBlckVsZW1lbnQ7XG4gICAgQFZpZXdDaGlsZCgnYXJyb3dMZWZ0Jywge3N0YXRpYzogdHJ1ZX0pIHB1YmxpYyBhcnJvd0xlZnRFbGVtZW50O1xuICAgIEBWaWV3Q2hpbGQoJ2Fycm93UmlnaHQnLCB7c3RhdGljOiB0cnVlfSkgcHVibGljIGFycm93UmlnaHRFbGVtZW50O1xuXG4gICAgcHVibGljIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgcHVibGljIHRhYnNWaWV3RWxlbWVudHM6IEhUTUxFbGVtZW50W107XG4gICAgcHVibGljIGN1clRhYjogSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIHRhYkdyb3VwOiBhbnlbXSA9IFtdO1xuICAgIHB1YmxpYyBjb250YWluZXJXaWR0aDogbnVtYmVyO1xuICAgIHB1YmxpYyB0YWJzV3JhcHBlcldpZHRoOiBudW1iZXI7XG4gICAgcHVibGljIGFsbFRhYnNXaWR0aDogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgYXJyb3dXaWR0aDogbnVtYmVyID0gNDA7XG4gICAgcHVibGljIGlzQXJyb3dzOiBib29sZWFuO1xuICAgIHB1YmxpYyB0YWJzU2Nyb2xsUmVjdDogQ2xpZW50UmVjdDtcbiAgICBwdWJsaWMgY3VyVGFiQ2xpZW50UmVjdDogQ2xpZW50UmVjdDtcbiAgICBwdWJsaWMgY29udGFpbmVyUmVjdDogQ2xpZW50UmVjdDtcblxuICAgIHB1YmxpYyBjb250YWluZXJQb3NpdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXG4gICAgcHVibGljIHNsaWRlTWVhc3VyZTogeyB3aWR0aDogYW55LCBsZWZ0OiBhbnkgfSA9IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGxlZnQ6IDBcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyB0aGVtZVNlcnZpY2U6IFRoZW1lU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICkge1xuICAgIH1cblxuXG4gICAgcHVibGljIHNlbGVjdFRhYihzZWxlY3RlZFRhYiA9IG51bGwsIGluZGV4ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VyVGFiID0gdGhpcy5jb250YWluZXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC5zZGstdGFiLWNvbnRhaW5lcl9fdGFiLS1hY3RpdmVgKTtcbiAgICAgICAgICAgIHRoaXMuY3VyVGFiQ2xpZW50UmVjdCA9IHRoaXMuY3VyVGFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAvLyBpZiBjdXJyZW50IGVsZW1lbnQgbm90IGZ1bGx5IHZpc2libGVcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQXJyb3dzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLmN1clRhYkNsaWVudFJlY3QubGVmdCAtIHRoaXMuYXJyb3dXaWR0aCkgPCB0aGlzLmNvbnRhaW5lclJlY3QubGVmdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXNpYmxlUGFydCA9IHRoaXMuY3VyVGFiQ2xpZW50UmVjdC5yaWdodCAtIHRoaXMuYXJyb3dXaWR0aCAtIHRoaXMuY29udGFpbmVyUmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRkZW5QYXJ0ID0gdGhpcy5jdXJUYWJDbGllbnRSZWN0LndpZHRoIC0gdmlzaWJsZVBhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxQYWRkaW5nID0gNDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsTGVmdChoaWRkZW5QYXJ0ICsgYWRkaXRpb25hbFBhZGRpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMuY3VyVGFiQ2xpZW50UmVjdC5yaWdodCArIHRoaXMuYXJyb3dXaWR0aCkgPiB0aGlzLmNvbnRhaW5lclJlY3QucmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlzaWJsZVBhcnQgPSB0aGlzLmNvbnRhaW5lclJlY3QucmlnaHQgLSB0aGlzLmFycm93V2lkdGggLSB0aGlzLmN1clRhYkNsaWVudFJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkZGVuUGFydCA9IHRoaXMuY3VyVGFiQ2xpZW50UmVjdC53aWR0aCAtIHZpc2libGVQYXJ0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUGFkZGluZyA9IDQwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFJpZ2h0KGhpZGRlblBhcnQgKyBhZGRpdGlvbmFsUGFkZGluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRVbmRlcmxpbmVNZWFzdXJlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzY3JvbGxSaWdodChzdGVwID0gbnVsbCk6IHZvaWQge1xuICAgICAgICBsZXQgeDogbnVtYmVyID0gcGFyc2VJbnQodGhpcy50YWJzV3JhcHBlckVsZW1lbnQuc3R5bGUubGVmdCwgMTApIHx8IDA7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRTdGVwID0gdGhpcy5jb250YWluZXJSZWN0LndpZHRoIC8gMTAwICogMzA7XG4gICAgICAgIGxldCBzY3JvbGxTdGVwID0gZGVmYXVsdFN0ZXA7XG4gICAgICAgIHRoaXMudGFic1Njcm9sbFJlY3QgPSB0aGlzLnRhYnNXcmFwcGVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBpZiAodGhpcy50YWJzU2Nyb2xsUmVjdC5yaWdodCAtIHNjcm9sbFN0ZXAgPCB0aGlzLmNvbnRhaW5lclJlY3QucmlnaHQgKyB0aGlzLmFycm93V2lkdGgpIHtcbiAgICAgICAgICAgIHNjcm9sbFN0ZXAgPSAodGhpcy50YWJzU2Nyb2xsUmVjdC5yaWdodCAtIHRoaXMuY29udGFpbmVyUmVjdC5yaWdodCkgKyB0aGlzLmFycm93V2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY3JvbGxTdGVwID0gc3RlcCA/IHN0ZXAgOiBkZWZhdWx0U3RlcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHggLT0gc2Nyb2xsU3RlcDtcblxuICAgICAgICB0aGlzLm1vdmVDb250YWluZXIoeCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNjcm9sbExlZnQoc3RlcCA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgbGV0IHg6IG51bWJlciA9IHBhcnNlSW50KHRoaXMudGFic1dyYXBwZXJFbGVtZW50LnN0eWxlLmxlZnQsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCBkZWZhdWx0U3RlcCA9IHRoaXMuY29udGFpbmVyUmVjdC53aWR0aCAvIDEwMCAqIDMwO1xuICAgICAgICBsZXQgc2Nyb2xsU3RlcCA9IGRlZmF1bHRTdGVwO1xuICAgICAgICB0aGlzLnRhYnNTY3JvbGxSZWN0ID0gdGhpcy50YWJzV3JhcHBlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGFic1Njcm9sbFJlY3QubGVmdCArIHNjcm9sbFN0ZXAgPiB0aGlzLmNvbnRhaW5lclJlY3QubGVmdCArIHRoaXMuYXJyb3dXaWR0aCkge1xuICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY3JvbGxTdGVwID0gc3RlcCA/IHN0ZXAgOiBkZWZhdWx0U3RlcDtcbiAgICAgICAgICAgIHggKz0gc2Nyb2xsU3RlcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW92ZUNvbnRhaW5lcih4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW92ZUNvbnRhaW5lcih4KTogdm9pZCB7XG4gICAgICAgIGxldCBuZXdYOiBudW1iZXIgPSB4O1xuICAgICAgICBpZiAoTWF0aC5hYnMoeCkgKyB0aGlzLmNvbnRhaW5lcldpZHRoIC0gKHRoaXMuYXJyb3dMZWZ0RWxlbWVudC5vZmZzZXRXaWR0aCAqIDIpID4gdGhpcy5hbGxUYWJzV2lkdGgpIHtcbiAgICAgICAgICAgIG5ld1ggPSB0aGlzLmNvbnRhaW5lcldpZHRoIC0gKHRoaXMuYXJyb3dMZWZ0RWxlbWVudC5vZmZzZXRXaWR0aCAqIDIpIC0gdGhpcy5hbGxUYWJzV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJzV3JhcHBlckVsZW1lbnQuc3R5bGUubGVmdCA9IG5ld1ggKyAncHgnO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclBvc2l0aW9uJC5uZXh0KHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRVbmRlcmxpbmVNZWFzdXJlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1clRhYkNsaWVudFJlY3QgPSB0aGlzLmN1clRhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5zbGlkZU1lYXN1cmUud2lkdGggPSBgJHt0aGlzLmN1clRhYkNsaWVudFJlY3Qud2lkdGh9cHhgO1xuICAgICAgICB0aGlzLnNsaWRlTWVhc3VyZS5sZWZ0ID0gYCR7dGhpcy5jdXJUYWIub2Zmc2V0TGVmdH1weGA7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFNpemVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSB0aGlzLmNvbnRhaW5lclJlY3Qud2lkdGg7XG4gICAgICAgIHRoaXMudGFic1dyYXBwZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyV2lkdGggLSAodGhpcy5pc0Fycm93cyA/ICh0aGlzLmFycm93V2lkdGggKiAyKSA6IDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUYWJTaXplcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hbGxUYWJzV2lkdGggPSAwO1xuICAgICAgICB0aGlzLnRhYnNWaWV3RWxlbWVudHMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFiV2lkdGggPSB0YWIub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICB0aGlzLmFsbFRhYnNXaWR0aCArPSB0YWJXaWR0aDtcbiAgICAgICAgICAgIGlmICh0YWJXaWR0aCA+IHRoaXMudGFic1dyYXBwZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIHRhYi5jbGFzc0xpc3QuYWRkKCdzZGstdGFiLWNvbnRhaW5lcl9fdGFiLS1vdmVyc2l6ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRhYnNTY3JvbGxSZWN0ID0gdGhpcy50YWJzV3JhcHBlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZVJlY3RzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhYnNTY3JvbGxSZWN0ID0gdGhpcy50YWJzV3JhcHBlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY3VyVGFiQ2xpZW50UmVjdCA9IHRoaXMuY3VyVGFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY29udGFpbmVyUG9zaXRpb24kLnBpcGUoZGVsYXkoNDAwKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hhbmdlUmVjdHMoKSk7XG5cbiAgICAgICAgY29uc3Qgc3ViUmVzaXplID0gZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNpemVzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Fycm93cyA9IHRoaXMuYWxsVGFic1dpZHRoID4gdGhpcy5jb250YWluZXJXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNBcnJvd3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IE1hdGguYWJzKHBhcnNlRmxvYXQodGhpcy50YWJzV3JhcHBlckVsZW1lbnQuc3R5bGUubGVmdCkpIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFic1dyYXBwZXJFbGVtZW50LnN0eWxlLmxlZnQgPSAnMHB4JztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVNZWFzdXJlLmxlZnQgPSBgJHtwYXJzZUZsb2F0KHRoaXMuc2xpZGVNZWFzdXJlLmxlZnQpICsgeH1weGA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzdWJSaWdodEFycm93ID0gZnJvbUV2ZW50KHRoaXMuYXJyb3dSaWdodEVsZW1lbnQsICdjbGljaycpXG4gICAgICAgICAgICAucGlwZSh0aHJvdHRsZVRpbWUoNTAwKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsUmlnaHQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzdWJMZWZ0QXJyb3cgPSBmcm9tRXZlbnQodGhpcy5hcnJvd0xlZnRFbGVtZW50LCAnY2xpY2snKVxuICAgICAgICAgICAgLnBpcGUodGhyb3R0bGVUaW1lKDUwMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbExlZnQoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChzdWJSZXNpemUpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoc3ViUmlnaHRBcnJvdyk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChzdWJMZWZ0QXJyb3cpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJFbGVtZW50ID0gdGhpcy5jb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5jb250YWluZXJFbGVtZW50O1xuICAgICAgICB0aGlzLnRhYnNXcmFwcGVyRWxlbWVudCA9IHRoaXMudGFic1dyYXBwZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy50YWJzV3JhcHBlckVsZW1lbnQ7XG4gICAgICAgIHRoaXMuYXJyb3dMZWZ0RWxlbWVudCA9IHRoaXMuYXJyb3dMZWZ0RWxlbWVudC5uYXRpdmVFbGVtZW50IHx8IHRoaXMuYXJyb3dMZWZ0RWxlbWVudDtcbiAgICAgICAgdGhpcy5hcnJvd1JpZ2h0RWxlbWVudCA9IHRoaXMuYXJyb3dSaWdodEVsZW1lbnQubmF0aXZlRWxlbWVudCB8fCB0aGlzLmFycm93UmlnaHRFbGVtZW50O1xuICAgICAgICB0aGlzLnNldFNpemVzKCk7XG4gICAgICAgIHRoaXMuc2V0U3Vic2NyaXB0aW9ucygpO1xuICAgIH1cblxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YWJzVmlld0VsZW1lbnRzID0gQXJyYXkuZnJvbSh0aGlzLnRhYnNXcmFwcGVyRWxlbWVudC5jaGlsZHJlbik7XG4gICAgICAgIHRoaXMuc2V0VGFiU2l6ZXMoKTtcbiAgICAgICAgdGhpcy5pc0Fycm93cyA9IHRoaXMuYWxsVGFic1dpZHRoID4gdGhpcy5jb250YWluZXJXaWR0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxufVxuIl19