UNPKG

ng-devui

Version:

DevUI components based on Angular

130 lines 24.7 kB
import { ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Input, Output, QueryList, TemplateRef, ViewChild, ViewChildren, } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "ng-devui/popover"; import * as i3 from "./tag.component"; export class TagsComponent { constructor(cdr) { this.cdr = cdr; /** * 【必选】记录输入的标签 */ this.tags = []; /** * 【可选】使用的属性名 */ this.displayProperty = ''; /** * @deprecated */ this.deletable = false; this.mode = 'default'; this.size = 'md'; this.titleProperty = ''; this.hideBeyondTags = false; /** * tag被删除后触发 */ this.tagDelete = new EventEmitter(); this.checkedChange = new EventEmitter(); /** * 多标签超出显示相关数据 */ this.showTags = []; this.beyondTags = []; this.showMore = false; this.MORE_TAG_WIDTH = 30; this.TAG_MARGIN = 4; } ngOnInit() { this.maxShowNumber = 0; // TODO: 使用cloneDeep导致category-search卡顿,lodash-es报Illegal invocation非法调用错误,需调查原因,暂用循环方式替代深拷贝 if (this.hideBeyondTags) { this.tags.forEach((item) => this.showTags.push(typeof item === 'object' ? { ...item } : item)); } } ngAfterViewInit() { if (this.hideBeyondTags) { this.calculateHideTagsStatus(); } } ngOnChanges(changes) { if (this.hideBeyondTags && changes.tags && !changes.tags.firstChange) { this.maxShowNumber = 0; this.showTags = [...this.tags]; this.calculateHideTagsStatus(); } } calculateHideTagsStatus() { this.cdr.detectChanges(); let curWidth = 0; const viewChildrenArr = this.viewChildren.toArray(); // 通过suffix添加ng-content至tags末尾,判断总宽度时不计算该部分,使得百分比宽度场景tags后可添加内容 const suffixWidth = this.suffixElement?.nativeElement.offsetWidth || 0; this.tagsFatherWidth = this.tagsElement.nativeElement.getBoundingClientRect().width - suffixWidth; for (let i = 0; i < viewChildrenArr.length; i++) { if (curWidth + viewChildrenArr[i].nativeElement.offsetWidth + this.TAG_MARGIN < this.tagsFatherWidth - this.MORE_TAG_WIDTH) { curWidth += viewChildrenArr[i].nativeElement.offsetWidth; curWidth += this.TAG_MARGIN; this.maxShowNumber = i + 1; } else { break; } } if (this.maxShowNumber !== this.tags.length) { this.showMore = true; this.beyondTags = this.showTags.slice(this.maxShowNumber); this.showTags.splice(this.maxShowNumber); this.cdr.detectChanges(); } else { this.showMore = false; } } removeTag($event, tag, index) { this.tagDelete.emit({ tag: tag, index: index, event: $event }); } tagChecked($event, tag, index) { this.checkedChange.emit({ tag: tag, index: index, checked: $event }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TagsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TagsComponent, selector: "d-tags", inputs: { tags: "tags", displayProperty: "displayProperty", deletable: "deletable", mode: "mode", size: "size", titleProperty: "titleProperty", hideBeyondTags: "hideBeyondTags", beforeDelete: "beforeDelete" }, outputs: { tagDelete: "tagDelete", checkedChange: "checkedChange" }, queries: [{ propertyName: "customViewTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "suffixElement", first: true, predicate: ["suffixElement"], descendants: true }, { propertyName: "tagsElement", first: true, predicate: ["tagsElement"], descendants: true }, { propertyName: "viewChildren", predicate: ["tagElement"], descendants: true, read: ElementRef }], exportAs: ["Tags"], usesOnChanges: true, ngImport: i0, template: "<div class=\"devui-tags\" #tagsElement>\r\n <d-tag\r\n #tagElement\r\n *ngFor=\"let tag of hideBeyondTags ? showTags : tags; let index = index\"\r\n [tag]=\"displayProperty ? tag[displayProperty] : tag\"\r\n [mode]=\"mode\"\r\n [size]=\"size\"\r\n [deletable]=\"deletable\"\r\n [checked]=\"tag['checked']\"\r\n [labelStyle]=\"tag['labelStyle']\"\r\n [customColor]=\"tag['customColor']\"\r\n [titleContent]=\"titleProperty ? tag[titleProperty] : displayProperty ? tag[displayProperty] : tag\"\r\n [customViewTemplate]=\"customViewTemplate\"\r\n [beforeDelete]=\"beforeDelete\"\r\n (tagDelete)=\"removeTag($event, tag, index)\"\r\n (checkedChange)=\"tagChecked($event, tag, index)\"\r\n >\r\n </d-tag>\r\n <d-tag\r\n class=\"show-more-tag\"\r\n *ngIf=\"hideBeyondTags && showMore\"\r\n dPopover\r\n [content]=\"beyondTagsTpl\"\r\n [controlled]=\"true\"\r\n [trigger]=\"'hover'\"\r\n [tag]=\"'+ ' + beyondTags.length\"\r\n [mode]=\"'checkable'\"\r\n [size]=\"size\"\r\n [popoverStyle]=\"{ backgroundColor: 'var(--devui-base-bg)' }\"\r\n ></d-tag>\r\n <div #suffixElement class=\"devui-tags-suffix\">\r\n <ng-content select=\"[suffix]\"></ng-content>\r\n </div>\r\n</div>\r\n\r\n<ng-template #beyondTagsTpl>\r\n <div class=\"beyond-tags-wrapper\">\r\n <d-tag\r\n class=\"beyond-tag-style\"\r\n *ngFor=\"let tag of beyondTags; let index = index\"\r\n [tag]=\"displayProperty ? tag[displayProperty] : tag\"\r\n [mode]=\"mode\"\r\n [size]=\"size\"\r\n [deletable]=\"deletable\"\r\n [checked]=\"tag['checked']\"\r\n [labelStyle]=\"tag['labelStyle']\"\r\n [customColor]=\"tag['customColor']\"\r\n [titleContent]=\"titleProperty ? tag[titleProperty] : displayProperty ? tag[displayProperty] : tag\"\r\n [customViewTemplate]=\"customViewTemplate\"\r\n [beforeDelete]=\"beforeDelete\"\r\n (tagDelete)=\"removeTag($event, tag, index)\"\r\n (checkedChange)=\"tagChecked($event, tag, index)\"\r\n >\r\n </d-tag>\r\n </div>\r\n</ng-template>\r\n", styles: [".devui-tags{overflow:hidden;word-wrap:break-word;height:100%;line-height:24px}.devui-tags-suffix{width:min-content;display:none}.devui-tags-suffix:not(:empty){display:inline-block}.beyond-tags-wrapper{max-width:300px;margin-top:8px;max-height:300px;overflow:auto}.beyond-tags-wrapper .beyond-tag-style{margin-bottom:8px}.beyond-tags-wrapper d-tag:not(:last-of-type){margin-right:8px}d-tag:not(:last-of-type){margin-right:4px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.PopoverDirective, selector: "[dPopover]", inputs: ["content", "controlled", "position", "showAnimation", "showAnimate", "scrollElement", "autoHideCoefficient", "appendToBody", "zIndex", "popType", "popMaxWidth", "trigger", "hoverToContent", "hoverDelayTime", "popoverStyle", "mouseEnterDelay", "mouseLeaveDelay", "visible"], exportAs: ["dPopover"] }, { kind: "component", type: i3.TagComponent, selector: "d-tag", inputs: ["tag", "labelStyle", "customColor", "deletable", "titleContent", "mode", "size", "checked", "maxWidth", "customViewTemplate", "beforeDelete"], outputs: ["tagDelete", "checkedChange"], exportAs: ["Tag"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TagsComponent, decorators: [{ type: Component, args: [{ selector: 'd-tags', exportAs: 'Tags', preserveWhitespaces: false, template: "<div class=\"devui-tags\" #tagsElement>\r\n <d-tag\r\n #tagElement\r\n *ngFor=\"let tag of hideBeyondTags ? showTags : tags; let index = index\"\r\n [tag]=\"displayProperty ? tag[displayProperty] : tag\"\r\n [mode]=\"mode\"\r\n [size]=\"size\"\r\n [deletable]=\"deletable\"\r\n [checked]=\"tag['checked']\"\r\n [labelStyle]=\"tag['labelStyle']\"\r\n [customColor]=\"tag['customColor']\"\r\n [titleContent]=\"titleProperty ? tag[titleProperty] : displayProperty ? tag[displayProperty] : tag\"\r\n [customViewTemplate]=\"customViewTemplate\"\r\n [beforeDelete]=\"beforeDelete\"\r\n (tagDelete)=\"removeTag($event, tag, index)\"\r\n (checkedChange)=\"tagChecked($event, tag, index)\"\r\n >\r\n </d-tag>\r\n <d-tag\r\n class=\"show-more-tag\"\r\n *ngIf=\"hideBeyondTags && showMore\"\r\n dPopover\r\n [content]=\"beyondTagsTpl\"\r\n [controlled]=\"true\"\r\n [trigger]=\"'hover'\"\r\n [tag]=\"'+ ' + beyondTags.length\"\r\n [mode]=\"'checkable'\"\r\n [size]=\"size\"\r\n [popoverStyle]=\"{ backgroundColor: 'var(--devui-base-bg)' }\"\r\n ></d-tag>\r\n <div #suffixElement class=\"devui-tags-suffix\">\r\n <ng-content select=\"[suffix]\"></ng-content>\r\n </div>\r\n</div>\r\n\r\n<ng-template #beyondTagsTpl>\r\n <div class=\"beyond-tags-wrapper\">\r\n <d-tag\r\n class=\"beyond-tag-style\"\r\n *ngFor=\"let tag of beyondTags; let index = index\"\r\n [tag]=\"displayProperty ? tag[displayProperty] : tag\"\r\n [mode]=\"mode\"\r\n [size]=\"size\"\r\n [deletable]=\"deletable\"\r\n [checked]=\"tag['checked']\"\r\n [labelStyle]=\"tag['labelStyle']\"\r\n [customColor]=\"tag['customColor']\"\r\n [titleContent]=\"titleProperty ? tag[titleProperty] : displayProperty ? tag[displayProperty] : tag\"\r\n [customViewTemplate]=\"customViewTemplate\"\r\n [beforeDelete]=\"beforeDelete\"\r\n (tagDelete)=\"removeTag($event, tag, index)\"\r\n (checkedChange)=\"tagChecked($event, tag, index)\"\r\n >\r\n </d-tag>\r\n </div>\r\n</ng-template>\r\n", styles: [".devui-tags{overflow:hidden;word-wrap:break-word;height:100%;line-height:24px}.devui-tags-suffix{width:min-content;display:none}.devui-tags-suffix:not(:empty){display:inline-block}.beyond-tags-wrapper{max-width:300px;margin-top:8px;max-height:300px;overflow:auto}.beyond-tags-wrapper .beyond-tag-style{margin-bottom:8px}.beyond-tags-wrapper d-tag:not(:last-of-type){margin-right:8px}d-tag:not(:last-of-type){margin-right:4px}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { tags: [{ type: Input }], displayProperty: [{ type: Input }], deletable: [{ type: Input }], mode: [{ type: Input }], size: [{ type: Input }], titleProperty: [{ type: Input }], hideBeyondTags: [{ type: Input }], beforeDelete: [{ type: Input }], customViewTemplate: [{ type: ContentChild, args: [TemplateRef] }], suffixElement: [{ type: ViewChild, args: ['suffixElement'] }], tagsElement: [{ type: ViewChild, args: ['tagsElement'] }], viewChildren: [{ type: ViewChildren, args: ['tagElement', { read: ElementRef }] }], tagDelete: [{ type: Output }], checkedChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS90YWdzL3RhZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvdGFncy90YWdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUVULFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDOzs7OztBQVd2QixNQUFNLE9BQU8sYUFBYTtJQXlDeEIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF4QzFDOztXQUVHO1FBQ00sU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNuQjs7V0FFRztRQUNNLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBRTlCOztXQUVHO1FBQ00sY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixTQUFJLEdBQWEsU0FBUyxDQUFDO1FBQzNCLFNBQUksR0FBYSxJQUFJLENBQUM7UUFDdEIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFNaEM7O1dBRUc7UUFDTyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVwQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFbEQ7O1dBRUc7UUFDSCxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLGVBQVUsR0FBRyxDQUFDLENBQUM7SUFFOEIsQ0FBQztJQUU5QyxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdkIsNEZBQTRG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LEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLO1FBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7K0dBbEdVLGFBQWE7bUdBQWIsYUFBYSxxWEFtQlYsV0FBVyx3VEFHVyxVQUFVLHNFQ2pEaEQsOGlFQXdEQTs7NEZEN0JhLGFBQWE7a0JBUHpCLFNBQVM7K0JBQ0UsUUFBUSxZQUdSLE1BQU0sdUJBQ0ssS0FBSztzRkFNakIsSUFBSTtzQkFBWixLQUFLO2dCQUlHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBS0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNxQixrQkFBa0I7c0JBQTVDLFlBQVk7dUJBQUMsV0FBVztnQkFDRyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0EsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUMwQixZQUFZO3NCQUE3RCxZQUFZO3VCQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSXRDLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSVRhZ01vZGUsIElUYWdTaXplIH0gZnJvbSAnLi90YWcuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZC10YWdzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGFncy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFncy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGV4cG9ydEFzOiAnVGFncycsXHJcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xyXG4gIC8qKlxyXG4gICAqIOOAkOW/hemAieOAkeiusOW9lei+k+WFpeeahOagh+etvlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRhZ3MgPSBbXTtcclxuICAvKipcclxuICAgKiDjgJDlj6/pgInjgJHkvb/nlKjnmoTlsZ7mgKflkI1cclxuICAgKi9cclxuICBASW5wdXQoKSBkaXNwbGF5UHJvcGVydHkgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWRcclxuICAgKi9cclxuICBASW5wdXQoKSBkZWxldGFibGUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBtb2RlOiBJVGFnTW9kZSA9ICdkZWZhdWx0JztcclxuICBASW5wdXQoKSBzaXplOiBJVGFnU2l6ZSA9ICdtZCc7XHJcbiAgQElucHV0KCkgdGl0bGVQcm9wZXJ0eSA9ICcnO1xyXG4gIEBJbnB1dCgpIGhpZGVCZXlvbmRUYWdzID0gZmFsc2U7XHJcbiAgQElucHV0KCkgYmVmb3JlRGVsZXRlOiAoKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZikgY3VzdG9tVmlld1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3N1ZmZpeEVsZW1lbnQnKSBzdWZmaXhFbGVtZW50OiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3RhZ3NFbGVtZW50JykgdGFnc0VsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZHJlbigndGFnRWxlbWVudCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSB2aWV3Q2hpbGRyZW4hOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XHJcbiAgLyoqXHJcbiAgICogdGFn6KKr5Yig6Zmk5ZCO6Kem5Y+RXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIHRhZ0RlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgY2hlY2tlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAvKipcclxuICAgKiDlpJrmoIfnrb7otoXlh7rmmL7npLrnm7jlhbPmlbDmja5cclxuICAgKi9cclxuICBzaG93VGFncyA9IFtdO1xyXG4gIGJleW9uZFRhZ3MgPSBbXTtcclxuICBzaG93TW9yZSA9IGZhbHNlO1xyXG4gIG1heFNob3dOdW1iZXI6IG51bWJlcjtcclxuICB0YWdzRmF0aGVyV2lkdGg6IG51bWJlcjtcclxuICBNT1JFX1RBR19XSURUSCA9IDMwO1xyXG4gIFRBR19NQVJHSU4gPSA0O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5tYXhTaG93TnVtYmVyID0gMDtcclxuICAgIC8vIFRPRE86IOS9v+eUqGNsb25lRGVlcOWvvOiHtGNhdGVnb3J5LXNlYXJjaOWNoemhv++8jGxvZGFzaC1lc+aKpUlsbGVnYWwgaW52b2NhdGlvbumdnuazleiwg+eUqOmUmeivr++8jOmcgOiwg+afpeWOn+WboO+8jOaagueUqOW+queOr+aWueW8j+abv+S7o+a3seaLt+i0nVxyXG4gICAgaWYgKHRoaXMuaGlkZUJleW9uZFRhZ3MpIHtcclxuICAgICAgdGhpcy50YWdzLmZvckVhY2goKGl0ZW0pID0+IHRoaXMuc2hvd1RhZ3MucHVzaCh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgPyB7IC4uLml0ZW0gfSA6IGl0ZW0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmhpZGVCZXlvbmRUYWdzKSB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlSGlkZVRhZ3NTdGF0dXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLmhpZGVCZXlvbmRUYWdzICYmIGNoYW5nZXMudGFncyAmJiAhY2hhbmdlcy50YWdzLmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIHRoaXMubWF4U2hvd051bWJlciA9IDA7XHJcbiAgICAgIHRoaXMuc2hvd1RhZ3MgPSBbLi4udGhpcy50YWdzXTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVIaWRlVGFnc1N0YXR1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlSGlkZVRhZ3NTdGF0dXMoKSB7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICBsZXQgY3VyV2lkdGggPSAwO1xyXG4gICAgY29uc3Qgdmlld0NoaWxkcmVuQXJyID0gdGhpcy52aWV3Q2hpbGRyZW4udG9BcnJheSgpO1xyXG4gICAgLy8g6YCa6L+Hc3VmZml45re75YqgbmctY29udGVudOiHs3RhZ3PmnKvlsL7vvIzliKTmlq3mgLvlrr3luqbml7bkuI3orqHnrpfor6Xpg6jliIbvvIzkvb/lvpfnmb7liIbmr5Tlrr3luqblnLrmma90YWdz5ZCO5Y+v5re75Yqg5YaF5a65XHJcbiAgICBjb25zdCBzdWZmaXhXaWR0aCA9IHRoaXMuc3VmZml4RWxlbWVudD8ubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCB8fCAwO1xyXG4gICAgdGhpcy50YWdzRmF0aGVyV2lkdGggPSB0aGlzLnRhZ3NFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBzdWZmaXhXaWR0aDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZXdDaGlsZHJlbkFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoY3VyV2lkdGggKyB2aWV3Q2hpbGRyZW5BcnJbaV0ubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArIHRoaXMuVEFHX01BUkdJTiA8IHRoaXMudGFnc0ZhdGhlcldpZHRoIC0gdGhpcy5NT1JFX1RBR19XSURUSCkge1xyXG4gICAgICAgIGN1cldpZHRoICs9IHZpZXdDaGlsZHJlbkFycltpXS5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGN1cldpZHRoICs9IHRoaXMuVEFHX01BUkdJTjtcclxuICAgICAgICB0aGlzLm1heFNob3dOdW1iZXIgPSBpICsgMTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubWF4U2hvd051bWJlciAhPT0gdGhpcy50YWdzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNob3dNb3JlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5iZXlvbmRUYWdzID0gdGhpcy5zaG93VGFncy5zbGljZSh0aGlzLm1heFNob3dOdW1iZXIpO1xyXG4gICAgICB0aGlzLnNob3dUYWdzLnNwbGljZSh0aGlzLm1heFNob3dOdW1iZXIpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3dNb3JlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVUYWcoJGV2ZW50LCB0YWcsIGluZGV4KSB7XHJcbiAgICB0aGlzLnRhZ0RlbGV0ZS5lbWl0KHsgdGFnOiB0YWcsIGluZGV4OiBpbmRleCwgZXZlbnQ6ICRldmVudCB9KTtcclxuICB9XHJcblxyXG4gIHRhZ0NoZWNrZWQoJGV2ZW50LCB0YWcsIGluZGV4KSB7XHJcbiAgICB0aGlzLmNoZWNrZWRDaGFuZ2UuZW1pdCh7IHRhZzogdGFnLCBpbmRleDogaW5kZXgsIGNoZWNrZWQ6ICRldmVudCB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRldnVpLXRhZ3NcIiAjdGFnc0VsZW1lbnQ+XHJcbiAgPGQtdGFnXHJcbiAgICAjdGFnRWxlbWVudFxyXG4gICAgKm5nRm9yPVwibGV0IHRhZyBvZiBoaWRlQmV5b25kVGFncyA/IHNob3dUYWdzIDogdGFnczsgbGV0IGluZGV4ID0gaW5kZXhcIlxyXG4gICAgW3RhZ109XCJkaXNwbGF5UHJvcGVydHkgPyB0YWdbZGlzcGxheVByb3BlcnR5XSA6IHRhZ1wiXHJcbiAgICBbbW9kZV09XCJtb2RlXCJcclxuICAgIFtzaXplXT1cInNpemVcIlxyXG4gICAgW2RlbGV0YWJsZV09XCJkZWxldGFibGVcIlxyXG4gICAgW2NoZWNrZWRdPVwidGFnWydjaGVja2VkJ11cIlxyXG4gICAgW2xhYmVsU3R5bGVdPVwidGFnWydsYWJlbFN0eWxlJ11cIlxyXG4gICAgW2N1c3RvbUNvbG9yXT1cInRhZ1snY3VzdG9tQ29sb3InXVwiXHJcbiAgICBbdGl0bGVDb250ZW50XT1cInRpdGxlUHJvcGVydHkgPyB0YWdbdGl0bGVQcm9wZXJ0eV0gOiBkaXNwbGF5UHJvcGVydHkgPyB0YWdbZGlzcGxheVByb3BlcnR5XSA6IHRhZ1wiXHJcbiAgICBbY3VzdG9tVmlld1RlbXBsYXRlXT1cImN1c3RvbVZpZXdUZW1wbGF0ZVwiXHJcbiAgICBbYmVmb3JlRGVsZXRlXT1cImJlZm9yZURlbGV0ZVwiXHJcbiAgICAodGFnRGVsZXRlKT1cInJlbW92ZVRhZygkZXZlbnQsIHRhZywgaW5kZXgpXCJcclxuICAgIChjaGVja2VkQ2hhbmdlKT1cInRhZ0NoZWNrZWQoJGV2ZW50LCB0YWcsIGluZGV4KVwiXHJcbiAgPlxyXG4gIDwvZC10YWc+XHJcbiAgPGQtdGFnXHJcbiAgICBjbGFzcz1cInNob3ctbW9yZS10YWdcIlxyXG4gICAgKm5nSWY9XCJoaWRlQmV5b25kVGFncyAmJiBzaG93TW9yZVwiXHJcbiAgICBkUG9wb3ZlclxyXG4gICAgW2NvbnRlbnRdPVwiYmV5b25kVGFnc1RwbFwiXHJcbiAgICBbY29udHJvbGxlZF09XCJ0cnVlXCJcclxuICAgIFt0cmlnZ2VyXT1cIidob3ZlcidcIlxyXG4gICAgW3RhZ109XCInKyAnICsgYmV5b25kVGFncy5sZW5ndGhcIlxyXG4gICAgW21vZGVdPVwiJ2NoZWNrYWJsZSdcIlxyXG4gICAgW3NpemVdPVwic2l6ZVwiXHJcbiAgICBbcG9wb3ZlclN0eWxlXT1cInsgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZGV2dWktYmFzZS1iZyknIH1cIlxyXG4gID48L2QtdGFnPlxyXG4gIDxkaXYgI3N1ZmZpeEVsZW1lbnQgY2xhc3M9XCJkZXZ1aS10YWdzLXN1ZmZpeFwiPlxyXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3N1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNiZXlvbmRUYWdzVHBsPlxyXG4gIDxkaXYgY2xhc3M9XCJiZXlvbmQtdGFncy13cmFwcGVyXCI+XHJcbiAgICA8ZC10YWdcclxuICAgICAgY2xhc3M9XCJiZXlvbmQtdGFnLXN0eWxlXCJcclxuICAgICAgKm5nRm9yPVwibGV0IHRhZyBvZiBiZXlvbmRUYWdzOyBsZXQgaW5kZXggPSBpbmRleFwiXHJcbiAgICAgIFt0YWddPVwiZGlzcGxheVByb3BlcnR5ID8gdGFnW2Rpc3BsYXlQcm9wZXJ0eV0gOiB0YWdcIlxyXG4gICAgICBbbW9kZV09XCJtb2RlXCJcclxuICAgICAgW3NpemVdPVwic2l6ZVwiXHJcbiAgICAgIFtkZWxldGFibGVdPVwiZGVsZXRhYmxlXCJcclxuICAgICAgW2NoZWNrZWRdPVwidGFnWydjaGVja2VkJ11cIlxyXG4gICAgICBbbGFiZWxTdHlsZV09XCJ0YWdbJ2xhYmVsU3R5bGUnXVwiXHJcbiAgICAgIFtjdXN0b21Db2xvcl09XCJ0YWdbJ2N1c3RvbUNvbG9yJ11cIlxyXG4gICAgICBbdGl0bGVDb250ZW50XT1cInRpdGxlUHJvcGVydHkgPyB0YWdbdGl0bGVQcm9wZXJ0eV0gOiBkaXNwbGF5UHJvcGVydHkgPyB0YWdbZGlzcGxheVByb3BlcnR5XSA6IHRhZ1wiXHJcbiAgICAgIFtjdXN0b21WaWV3VGVtcGxhdGVdPVwiY3VzdG9tVmlld1RlbXBsYXRlXCJcclxuICAgICAgW2JlZm9yZURlbGV0ZV09XCJiZWZvcmVEZWxldGVcIlxyXG4gICAgICAodGFnRGVsZXRlKT1cInJlbW92ZVRhZygkZXZlbnQsIHRhZywgaW5kZXgpXCJcclxuICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwidGFnQ2hlY2tlZCgkZXZlbnQsIHRhZywgaW5kZXgpXCJcclxuICAgID5cclxuICAgIDwvZC10YWc+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==