UNPKG

@wizco/fenixds-ngx

Version:

Componentes fenix design system para Angular.

164 lines 25.2 kB
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import { CommonModule } from '@angular/common'; import { NavigationEnd, RouterModule } from '@angular/router'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@angular/common"; export class TabsComponent { router; el; /** * @ignore */ navTabs; /** * Variável para definir o tipo de navegação * @param {string} type */ type = 'header'; /** * Elementos divididos igualmente ocupando toda largura * @param {boolean} full */ full = false; /** * Variável para definir o item ativo e monitorar a mudança * @param {string} selected */ selected = ''; /** habilitar reponsivo * @param {Boolean} enabledResponsive */ enabledResponsive = true; /** * Opções de navegação por rotas * @param {NavTabsOptions[]} links */ set setListOptions(links) { if (links.length) { this.links = links.map((item) => { return { ...item, type: item.type || 'link', options: { exact: item.path === '/' ? true : false }, }; }); } } /** * Variável para definir se o componente terá borda ou não * @param {boolean} noBorder */ noBorder = false; autoScroll = true; /** * Evento de click no botão ou link do componente * @param {EventEmitter<void>} handleClick * @returns {void} */ handleClick = new EventEmitter(); /** * @ignore */ links = []; /** * Variavel se é mobile ou não */ isMobile = false; constructor(router, el) { this.router = router; this.el = el; this.router.events.subscribe((event) => { if (event instanceof NavigationEnd) { this.handleActive(100, false); } }); } /** * @ignore */ ngOnChanges(changes) { if (changes['selected']) { console.log('selected', this.selected); this.handleActive(100, false); } } /** * @ignore */ ngAfterViewInit() { this.handleActive(1000, false); } /** * @ignore */ eventSubmit(link = '') { this.handleClick.emit(link); } /** * @ignore */ handleActive(timer = 100, buttonClick = true) { setTimeout(() => { const _elementRef = this.el.nativeElement; const _element = this.navTabs.nativeElement; if (_elementRef && _element) { this.isMobile = _elementRef.clientWidth >= _element.clientWidth; } const allActives = _element.querySelectorAll('button.active'); const _elementChildActive = allActives[allActives.length - 1]; if (!_elementChildActive) { return; } const left = _elementChildActive.getBoundingClientRect().left - _element.getBoundingClientRect().left; const widthbutton = _elementChildActive.getBoundingClientRect().width; _element.style.setProperty('--leftActive', left + 'px'); _element.style.setProperty('--widthActive', widthbutton + 'px'); if (this.autoScroll) { _elementChildActive.scrollIntoView({ block: 'end', behavior: 'smooth' }); } if (buttonClick) { this.handleClick.emit(); } if (this.enabledResponsive && this.autoScroll) { _elementChildActive.scrollIntoView({ block: 'end', behavior: 'smooth', }); } }, timer); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabsComponent, deps: [{ token: i1.Router }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TabsComponent, isStandalone: true, selector: "wco-navtabs", inputs: { type: "type", full: "full", selected: "selected", enabledResponsive: ["enabled-responsive", "enabledResponsive"], setListOptions: ["listOptions", "setListOptions"], noBorder: ["no-border", "noBorder"], autoScroll: "autoScroll" }, outputs: { handleClick: "handleClick" }, viewQueries: [{ propertyName: "navTabs", first: true, predicate: ["navTabs"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "\n <nav \n class=\"wco-navtabs\" \n #navTabs role=\"navigation\"\n [class.no-border]=\"noBorder\" \n [class.navTabs-full]=\"full\"\n [class.navTabs-mobile]=\"!isMobile\"\n>\n <ng-container *ngFor=\"let link of links\">\n <ng-container *ngIf=\"link.type === 'link'\">\n <button \n (click)=\"eventSubmit()\" \n [class.color-to-nav]=\"type === 'nav'\"\n [routerLink]=\"link.path\" routerLinkActive=\"active\" [attr.id]=\"'page-' + link.path\"\n >\n {{ link.name }}\n </button>\n </ng-container>\n <ng-container *ngIf=\"link.type === 'button'\">\n <button \n (click)=\"eventSubmit(link.path)\" \n [class.color-to-nav]=\"type === 'nav'\"\n [class.active]=\"link.path === selected\"\n [attr.id]=\"'page-' + link.path\"\n >\n {{ link.name }}\n </button>\n </ng-container>\n </ng-container>\n <ng-content></ng-content>\n</nav>\n", styles: ["wco-navtabs{width:100%;overflow:auto;display:block}@media screen and (max-width: 600px){wco-navtabs{overflow:auto;white-space:nowrap;max-width:100vw}wco-navtabs::-webkit-scrollbar{display:none}}.wco-navtabs{--leftActive: 50px;--widthActive: 0px;--navtabs-gapLine: var(--wco-spacing-nano);--navtabs-gap: 0;--navtab-color-selected: var(--wco-color-primary-600);--navtabs-underline-height: 3px;display:inline-flex;position:relative;gap:var(--navtabs-gap);height:100%;border-bottom:1px solid var(--wco-color-neutral-100);scroll-behavior:smooth}.wco-navtabs.navTabs-mobile:before{display:none}.wco-navtabs.navTabs-mobile button.active{border-bottom:3px solid var(--wco-color-primary-600)}.wco-navtabs.navTabs-full{display:grid;grid-template-columns:repeat(auto-fit,minmax(30px,1fr))}.wco-navtabs.navTabs-full>button{width:100%}.wco-navtabs.no-border{border-bottom:none!important}@media (max-width: 900px){.wco-navtabs{--navtabs-gapLine: var(--wco-spacing-xxxs);--navtabs-gap: var(--wco-spacing-xxs)}}@media (max-width: 600px){.wco-navtabs{--navtabs-gapLine: var(--wco-spacing-xxs)}}.wco-navtabs:before{content:\"\";width:var(--widthActive);height:var(--navtabs-underline-height);background-color:var(--navtab-color-selected);position:absolute;bottom:0;left:0;transform:translate(var(--leftActive));transition:transform .15s cubic-bezier(.645,.045,.355,1),width .1s linear}.wco-navtabs button{background-color:transparent;border:none;font-size:var(--wco-font-size-md);font-weight:400;min-height:48px;padding:var(--wco-spacing-nano) var(--wco-spacing-xxs) var(--navtabs-gapLine) var(--wco-spacing-xxs);display:flex;width:fit-content;align-items:center;justify-content:center;color:var(--wco-color-neutral-900);letter-spacing:.5px}.wco-navtabs button:hover:not(:disabled){background-color:var(--wco-color-primary-50);color:var(--wco-color-primary-700);cursor:pointer;border-radius:var(--wco-spacing-nano) var(--wco-spacing-nano) 0 0}@media (max-width: 600px){.wco-navtabs button{font-size:var(--wco-font-size-xs);min-height:30px}}.wco-navtabs button:disabled{cursor:not-allowed;color:var(--wco-color-neutral-900)}.wco-navtabs button.color-to-nav{font-weight:700}.wco-navtabs button.active{font-weight:700;letter-spacing:0px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }], encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TabsComponent, decorators: [{ type: Component, args: [{ selector: 'wco-navtabs', standalone: true, imports: [ CommonModule, RouterModule ], encapsulation: ViewEncapsulation.None, template: "\n <nav \n class=\"wco-navtabs\" \n #navTabs role=\"navigation\"\n [class.no-border]=\"noBorder\" \n [class.navTabs-full]=\"full\"\n [class.navTabs-mobile]=\"!isMobile\"\n>\n <ng-container *ngFor=\"let link of links\">\n <ng-container *ngIf=\"link.type === 'link'\">\n <button \n (click)=\"eventSubmit()\" \n [class.color-to-nav]=\"type === 'nav'\"\n [routerLink]=\"link.path\" routerLinkActive=\"active\" [attr.id]=\"'page-' + link.path\"\n >\n {{ link.name }}\n </button>\n </ng-container>\n <ng-container *ngIf=\"link.type === 'button'\">\n <button \n (click)=\"eventSubmit(link.path)\" \n [class.color-to-nav]=\"type === 'nav'\"\n [class.active]=\"link.path === selected\"\n [attr.id]=\"'page-' + link.path\"\n >\n {{ link.name }}\n </button>\n </ng-container>\n </ng-container>\n <ng-content></ng-content>\n</nav>\n", styles: ["wco-navtabs{width:100%;overflow:auto;display:block}@media screen and (max-width: 600px){wco-navtabs{overflow:auto;white-space:nowrap;max-width:100vw}wco-navtabs::-webkit-scrollbar{display:none}}.wco-navtabs{--leftActive: 50px;--widthActive: 0px;--navtabs-gapLine: var(--wco-spacing-nano);--navtabs-gap: 0;--navtab-color-selected: var(--wco-color-primary-600);--navtabs-underline-height: 3px;display:inline-flex;position:relative;gap:var(--navtabs-gap);height:100%;border-bottom:1px solid var(--wco-color-neutral-100);scroll-behavior:smooth}.wco-navtabs.navTabs-mobile:before{display:none}.wco-navtabs.navTabs-mobile button.active{border-bottom:3px solid var(--wco-color-primary-600)}.wco-navtabs.navTabs-full{display:grid;grid-template-columns:repeat(auto-fit,minmax(30px,1fr))}.wco-navtabs.navTabs-full>button{width:100%}.wco-navtabs.no-border{border-bottom:none!important}@media (max-width: 900px){.wco-navtabs{--navtabs-gapLine: var(--wco-spacing-xxxs);--navtabs-gap: var(--wco-spacing-xxs)}}@media (max-width: 600px){.wco-navtabs{--navtabs-gapLine: var(--wco-spacing-xxs)}}.wco-navtabs:before{content:\"\";width:var(--widthActive);height:var(--navtabs-underline-height);background-color:var(--navtab-color-selected);position:absolute;bottom:0;left:0;transform:translate(var(--leftActive));transition:transform .15s cubic-bezier(.645,.045,.355,1),width .1s linear}.wco-navtabs button{background-color:transparent;border:none;font-size:var(--wco-font-size-md);font-weight:400;min-height:48px;padding:var(--wco-spacing-nano) var(--wco-spacing-xxs) var(--navtabs-gapLine) var(--wco-spacing-xxs);display:flex;width:fit-content;align-items:center;justify-content:center;color:var(--wco-color-neutral-900);letter-spacing:.5px}.wco-navtabs button:hover:not(:disabled){background-color:var(--wco-color-primary-50);color:var(--wco-color-primary-700);cursor:pointer;border-radius:var(--wco-spacing-nano) var(--wco-spacing-nano) 0 0}@media (max-width: 600px){.wco-navtabs button{font-size:var(--wco-font-size-xs);min-height:30px}}.wco-navtabs button:disabled{cursor:not-allowed;color:var(--wco-color-neutral-900)}.wco-navtabs button.color-to-nav{font-weight:700}.wco-navtabs button.active{font-weight:700;letter-spacing:0px}\n"] }] }], ctorParameters: () => [{ type: i1.Router }, { type: i0.ElementRef }], propDecorators: { navTabs: [{ type: ViewChild, args: ['navTabs'] }], type: [{ type: Input }], full: [{ type: Input }], selected: [{ type: Input }], enabledResponsive: [{ type: Input, args: ['enabled-responsive'] }], setListOptions: [{ type: Input, args: ['listOptions'] }], noBorder: [{ type: Input, args: ['no-border'] }], autoScroll: [{ type: Input, args: ['autoScroll'] }], handleClick: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tcG9uZW50cy9zcmMvbGliL3RhYnMvdGFicy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tcG9uZW50cy9zcmMvbGliL3RhYnMvdGFicy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBaUIsU0FBUyxFQUFvQixpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFVLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQWN0RSxNQUFNLE9BQU8sYUFBYTtJQWtGTDtJQUNUO0lBbEZWOztNQUVFO0lBRUssT0FBTyxDQUFjO0lBRTVCOzs7TUFHRTtJQUVLLElBQUksR0FBcUIsUUFBUSxDQUFDO0lBRXpDOzs7TUFHRTtJQUVLLElBQUksR0FBWSxLQUFLLENBQUM7SUFFN0I7OztNQUdFO0lBRUssUUFBUSxHQUFHLEVBQUUsQ0FBQTtJQUVwQjs7T0FFRztJQUVJLGlCQUFpQixHQUFZLElBQUksQ0FBQztJQUV6Qzs7O01BR0U7SUFDRixJQUNXLGNBQWMsQ0FBQyxLQUF1QjtRQUMvQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFvQixFQUFFLEVBQUU7Z0JBQzlDLE9BQU87b0JBQ0wsR0FBRyxJQUFJO29CQUNQLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU07b0JBQ3pCLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFB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QUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLENBQUM7WUFDRCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFCLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzlDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQztvQkFDakMsS0FBSyxFQUFFLEtBQUs7b0JBQ1osUUFBUSxFQUFFLFFBQVE7aUJBQ25CLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDWixDQUFDO3dHQTNKVSxhQUFhOzRGQUFiLGFBQWEseWRDaEIxQixzakNBK0JBLG11RUR0QkksWUFBWSwrUEFDWixZQUFZOzs0RkFNSCxhQUFhO2tCQVh6QixTQUFTOytCQUNFLGFBQWEsY0FDWCxJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixZQUFZO3FCQUNiLGlCQUdjLGlCQUFpQixDQUFDLElBQUk7b0dBTzlCLE9BQU87c0JBRGIsU0FBUzt1QkFBQyxTQUFTO2dCQVFiLElBQUk7c0JBRFYsS0FBSztnQkFRQyxJQUFJO3NCQURWLEtBQUs7Z0JBUUMsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLGlCQUFpQjtzQkFEdkIsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBUWhCLGNBQWM7c0JBRHhCLEtBQUs7dUJBQUMsYUFBYTtnQkFtQmIsUUFBUTtzQkFEZCxLQUFLO3VCQUFDLFdBQVc7Z0JBR0csVUFBVTtzQkFBOUIsS0FBSzt1QkFBQyxZQUFZO2dCQVNaLFdBQVc7c0JBRGpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUm91dGVyLCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTmF2VGFic09wdGlvbnMgfSBmcm9tICcuL3RhYnMudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3Y28tbmF2dGFicycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFicy5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFRhYnNDb21wb25lbnQgIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0e1xuICAvKipcbiAgKiBAaWdub3JlXG4gICovXG4gIEBWaWV3Q2hpbGQoJ25hdlRhYnMnKVxuICBwdWJsaWMgbmF2VGFicyE6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIFZhcmnDoXZlbCBwYXJhIGRlZmluaXIgbyB0aXBvIGRlIG5hdmVnYcOnw6NvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0eXBlOiAnaGVhZGVyJyB8ICduYXYnID0gJ2hlYWRlcic7XG5cbiAgLyoqXG4gICAqIEVsZW1lbnRvcyBkaXZpZGlkb3MgaWd1YWxtZW50ZSBvY3VwYW5kbyB0b2RhIGxhcmd1cmFcbiAgICogQHBhcmFtIHtib29sZWFufSBmdWxsXG4gICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmdWxsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFZhcmnDoXZlbCBwYXJhIGRlZmluaXIgbyBpdGVtIGF0aXZvIGUgbW9uaXRvcmFyIGEgbXVkYW7Dp2FcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdGVkXG4gICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWxlY3RlZCA9ICcnXG5cbiAgLyoqIGhhYmlsaXRhciByZXBvbnNpdm9cbiAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkUmVzcG9uc2l2ZVxuICAgKi9cbiAgQElucHV0KCdlbmFibGVkLXJlc3BvbnNpdmUnKVxuICBwdWJsaWMgZW5hYmxlZFJlc3BvbnNpdmU6IEJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAqIE9ww6fDtWVzIGRlIG5hdmVnYcOnw6NvIHBvciByb3Rhc1xuICAqIEBwYXJhbSB7TmF2VGFic09wdGlvbnNbXX0gbGlua3NcbiAgKi9cbiAgQElucHV0KCdsaXN0T3B0aW9ucycpXG4gIHB1YmxpYyBzZXQgc2V0TGlzdE9wdGlvbnMobGlua3M6IE5hdlRhYnNPcHRpb25zW10pIHtcbiAgICBpZiAobGlua3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxpbmtzID0gbGlua3MubWFwKChpdGVtOiBOYXZUYWJzT3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgdHlwZTogaXRlbS50eXBlIHx8ICdsaW5rJyxcbiAgICAgICAgICBvcHRpb25zOiB7IGV4YWN0OiBpdGVtLnBhdGggPT09ICcvJyA/IHRydWUgOiBmYWxzZSB9LFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuXG4gIC8qKlxuICAgKiBWYXJpw6F2ZWwgcGFyYSBkZWZpbmlyIHNlIG8gY29tcG9uZW50ZSB0ZXLDoSBib3JkYSBvdSBuw6NvXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9Cb3JkZXJcbiAgKi9cbiAgQElucHV0KCduby1ib3JkZXInKVxuICBwdWJsaWMgbm9Cb3JkZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoJ2F1dG9TY3JvbGwnKSBhdXRvU2Nyb2xsOiBib29sZWFuID0gdHJ1ZTtcblxuXG4gIC8qKlxuICAgKiBFdmVudG8gZGUgY2xpY2sgbm8gYm90w6NvIG91IGxpbmsgZG8gY29tcG9uZW50ZVxuICAgKiBAcGFyYW0ge0V2ZW50RW1pdHRlcjx2b2lkPn0gaGFuZGxlQ2xpY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgaGFuZGxlQ2xpY2s6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAqL1xuICBwdWJsaWMgbGlua3M6IE5hdlRhYnNPcHRpb25zW10gPSBbXTtcblxuXG4gIC8qKlxuICAgKiBWYXJpYXZlbCBzZSDDqSBtb2JpbGUgb3UgbsOjb1xuICAqL1xuICBwdWJsaWMgaXNNb2JpbGUgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVBY3RpdmUoMTAwLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAqL1xuICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmKGNoYW5nZXNbJ3NlbGVjdGVkJ10pIHsgXG4gICAgICBjb25zb2xlLmxvZygnc2VsZWN0ZWQnLCB0aGlzLnNlbGVjdGVkKVxuICAgICAgdGhpcy5oYW5kbGVBY3RpdmUoMTAwLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgKi9cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZUFjdGl2ZSgxMDAwLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAqL1xuICBwdWJsaWMgZXZlbnRTdWJtaXQobGluazogYW55ID0gJycpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZUNsaWNrLmVtaXQobGluayk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAqL1xuICBwdWJsaWMgaGFuZGxlQWN0aXZlKHRpbWVyID0gMTAwLCBidXR0b25DbGljayA9IHRydWUpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IF9lbGVtZW50UmVmID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgX2VsZW1lbnQ6IEhUTUxFbGVtZW50ID0gdGhpcy5uYXZUYWJzLm5hdGl2ZUVsZW1lbnQ7XG5cblxuICAgICAgaWYoX2VsZW1lbnRSZWYgJiYgX2VsZW1lbnQgKSB7XG4gICAgICAgIHRoaXMuaXNNb2JpbGUgPSBfZWxlbWVudFJlZi5jbGllbnRXaWR0aCA+PSBfZWxlbWVudC5jbGllbnRXaWR0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBhbGxBY3RpdmVzID0gX2VsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uLmFjdGl2ZScpO1xuXG4gICAgICBjb25zdCBfZWxlbWVudENoaWxkQWN0aXZlID0gYWxsQWN0aXZlc1thbGxBY3RpdmVzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAoIV9lbGVtZW50Q2hpbGRBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsZWZ0ID1cbiAgICAgICAgX2VsZW1lbnRDaGlsZEFjdGl2ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gX2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICAgIGNvbnN0IHdpZHRoYnV0dG9uID0gX2VsZW1lbnRDaGlsZEFjdGl2ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgIF9lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWxlZnRBY3RpdmUnLCBsZWZ0ICsgJ3B4Jyk7XG4gICAgICBfZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS13aWR0aEFjdGl2ZScsIHdpZHRoYnV0dG9uICsgJ3B4Jyk7XG4gICAgICBpZih0aGlzLmF1dG9TY3JvbGwpIHtcbiAgICAgICAgX2VsZW1lbnRDaGlsZEFjdGl2ZS5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGJ1dHRvbkNsaWNrKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2xpY2suZW1pdCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5hYmxlZFJlc3BvbnNpdmUgJiYgdGhpcy5hdXRvU2Nyb2xsKSB7XG4gICAgICAgIF9lbGVtZW50Q2hpbGRBY3RpdmUuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgIGJsb2NrOiAnZW5kJyxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHRpbWVyKTtcbiAgfVxufSIsIlxuICAgIDxuYXYgXG4gICAgY2xhc3M9XCJ3Y28tbmF2dGFic1wiIFxuICAgICNuYXZUYWJzIHJvbGU9XCJuYXZpZ2F0aW9uXCJcbiAgICBbY2xhc3Mubm8tYm9yZGVyXT1cIm5vQm9yZGVyXCIgXG4gICAgW2NsYXNzLm5hdlRhYnMtZnVsbF09XCJmdWxsXCJcbiAgICBbY2xhc3MubmF2VGFicy1tb2JpbGVdPVwiIWlzTW9iaWxlXCJcbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsaW5rIG9mIGxpbmtzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaW5rLnR5cGUgPT09ICdsaW5rJ1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXZlbnRTdWJtaXQoKVwiIFxuICAgICAgICAgICAgICAgIFtjbGFzcy5jb2xvci10by1uYXZdPVwidHlwZSA9PT0gJ25hdidcIlxuICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cImxpbmsucGF0aFwiIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmVcIiBbYXR0ci5pZF09XCIncGFnZS0nICsgbGluay5wYXRoXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBsaW5rLm5hbWUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxpbmsudHlwZSA9PT0gJ2J1dHRvbidcIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImV2ZW50U3VibWl0KGxpbmsucGF0aClcIiBcbiAgICAgICAgICAgICAgICBbY2xhc3MuY29sb3ItdG8tbmF2XT1cInR5cGUgPT09ICduYXYnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImxpbmsucGF0aCA9PT0gc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidwYWdlLScgKyBsaW5rLnBhdGhcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGxpbmsubmFtZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvbmF2PlxuIl19