ng-cw-v12
Version:
Angular UI Component Library
169 lines • 19.8 kB
JavaScript
import { Injectable } from '@angular/core';
import { fromEvent } from 'rxjs';
import * as i0 from "@angular/core";
export class NcMouseTooltipService {
constructor(rendererFactory, ngZone) {
this.rendererFactory = rendererFactory;
this.ngZone = ngZone;
this.tooltipElement = null;
this.offset = { x: 12, y: 12 };
this.mouseMoveSubscription = null;
this.mousePosition = { x: 0, y: 0 };
this.defaultStyles = {
'position': 'fixed',
'padding': '8px 12px',
'background': 'rgba(0, 0, 0, 0.8)',
'color': 'white',
'border-radius': '4px',
'font-size': '14px',
'z-index': '10001',
'pointer-events': 'none',
'transition': 'none'
};
this.renderer = this.rendererFactory.createRenderer(null, null);
}
/**
* 初始化服务
*/
init() {
if (this.mouseMoveSubscription) {
this.mouseMoveSubscription.unsubscribe();
this.mouseMoveSubscription = null;
}
this.ngZone.runOutsideAngular(() => {
this.mouseMoveSubscription = fromEvent(document, 'mousemove')
.subscribe((event) => {
// 更新鼠标位置
this.mousePosition = { x: event.clientX, y: event.clientY };
// 更新位置
if (this.tooltipElement) {
this.updatePosition();
}
});
});
}
/**
* 显示tooltip
* @param content tooltip内容
* @param options 可选配置,包括x、y偏移量和样式
*/
show(content, options) {
if ((options === null || options === void 0 ? void 0 : options.offsetX) !== undefined) {
this.offset.x = options.offsetX;
}
else {
this.offset.x = 12;
}
if ((options === null || options === void 0 ? void 0 : options.offsetY) !== undefined) {
this.offset.y = options.offsetY;
}
else {
this.offset.y = 12;
}
if (!this.tooltipElement) {
this.createTooltipElement(options === null || options === void 0 ? void 0 : options.styles);
}
else {
if (options === null || options === void 0 ? void 0 : options.styles) {
this.updateStyles(options.styles);
}
else {
this.updateStyles(this.defaultStyles);
}
}
if (this.tooltipElement) {
this.renderer.setProperty(this.tooltipElement, 'innerHTML', content);
this.updatePosition();
}
}
/**
* 隐藏tooltip
*/
hide() {
if (this.tooltipElement) {
document.body.removeChild(this.tooltipElement);
this.tooltipElement = null;
}
}
/**
* 销毁
*/
destroy() {
this.hide();
if (this.mouseMoveSubscription) {
this.mouseMoveSubscription.unsubscribe();
this.mouseMoveSubscription = null;
}
}
/**
* 创建tooltip元素
* @param customStyles 自定义样式
*/
createTooltipElement(customStyles) {
if (this.tooltipElement) {
return;
}
this.tooltipElement = this.renderer.createElement('div');
this.renderer.addClass(this.tooltipElement, 'nc-mouse-tooltip');
// 应用默认样式
this.updateStyles(this.defaultStyles);
// 应用自定义样式(如果提供)
if (customStyles) {
this.updateStyles(customStyles);
}
this.renderer.appendChild(document.body, this.tooltipElement);
}
/**
* 更新tooltip位置
*/
updatePosition() {
if (!this.tooltipElement) {
return;
}
const tooltipRect = this.tooltipElement.getBoundingClientRect();
const viewportWidth = window.innerWidth;
const viewportHeight = window.innerHeight;
// 计算初始位置(鼠标右下方)
let left = this.mousePosition.x + this.offset.x;
let top = this.mousePosition.y + this.offset.y;
// 检查右边界
if (left + tooltipRect.width > viewportWidth) {
// 如果超出右边界,将tooltip放在鼠标左侧
left = this.mousePosition.x - tooltipRect.width - this.offset.x;
}
// 检查下边界
if (top + tooltipRect.height > viewportHeight) {
// 如果超出下边界,将tooltip放在鼠标上方
top = this.mousePosition.y - tooltipRect.height - this.offset.y;
}
// 检查左边界
if (left < 0) {
left = this.offset.x;
}
// 检查上边界
if (top < 0) {
top = this.offset.y;
}
// 设置位置
this.renderer.setStyle(this.tooltipElement, 'left', `${left}px`);
this.renderer.setStyle(this.tooltipElement, 'top', `${top}px`);
}
/**
* 更新tooltip样式
* @param customStyles 自定义样式
*/
updateStyles(customStyles) {
if (!this.tooltipElement) {
return;
}
Object.entries(customStyles).forEach(([property, value]) => {
this.renderer.setStyle(this.tooltipElement, property, value);
});
}
}
NcMouseTooltipService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NcMouseTooltipService, deps: [{ token: i0.RendererFactory2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
NcMouseTooltipService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NcMouseTooltipService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NcMouseTooltipService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i0.RendererFactory2 }, { type: i0.NgZone }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW91c2UtdG9vbHRpcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9tb3VzZS10b29sdGlwLXNlcnZpY2UvbW91c2UtdG9vbHRpcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQXVDLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQVMvQyxNQUFNLE9BQU8scUJBQXFCO0lBa0JoQyxZQUNVLGVBQWlDLEVBQ2pDLE1BQWM7UUFEZCxvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUFDakMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQW5CaEIsbUJBQWMsR0FBdUIsSUFBSSxDQUFDO1FBRTFDLFdBQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzFCLDBCQUFxQixHQUF3QixJQUFJLENBQUM7UUFDbEQsa0JBQWEsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQThCO1lBQ2pELFVBQVUsRUFBRSxPQUFPO1lBQ25CLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLFlBQVksRUFBRSxvQkFBb0I7WUFDbEMsT0FBTyxFQUFFLE9BQU87WUFDaEIsZUFBZSxFQUFFLEtBQUs7WUFDdEIsV0FBVyxFQUFFLE1BQU07WUFDbkIsU0FBUyxFQUFFLE9BQU87WUFDbEIsZ0JBQWdCLEVBQUUsTUFBTTtZQUN4QixZQUFZLEVBQUUsTUFBTTtTQUNyQixDQUFDO1FBTUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksSUFBSTtRQUNULElB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cUI7MkZBQXJCLHFCQUFxQjtrQkFEakMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFJlbmRlcmVyMiwgUmVuZGVyZXJGYWN0b3J5MiwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5jTW91c2VUb29sdGlwT3B0aW9ucyB7XHJcbiAgb2Zmc2V0WD86IG51bWJlcjtcclxuICBvZmZzZXRZPzogbnVtYmVyO1xyXG4gIHN0eWxlcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5jTW91c2VUb29sdGlwU2VydmljZSB7XHJcbiAgcHJpdmF0ZSB0b29sdGlwRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjI7XHJcbiAgcHJpdmF0ZSBvZmZzZXQgPSB7IHg6IDEyLCB5OiAxMiB9O1xyXG4gIHByaXZhdGUgbW91c2VNb3ZlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIG1vdXNlUG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfTtcclxuICBwcml2YXRlIGRlZmF1bHRTdHlsZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgICAncG9zaXRpb24nOiAnZml4ZWQnLFxyXG4gICAgJ3BhZGRpbmcnOiAnOHB4IDEycHgnLFxyXG4gICAgJ2JhY2tncm91bmQnOiAncmdiYSgwLCAwLCAwLCAwLjgpJyxcclxuICAgICdjb2xvcic6ICd3aGl0ZScsXHJcbiAgICAnYm9yZGVyLXJhZGl1cyc6ICc0cHgnLFxyXG4gICAgJ2ZvbnQtc2l6ZSc6ICcxNHB4JyxcclxuICAgICd6LWluZGV4JzogJzEwMDAxJyxcclxuICAgICdwb2ludGVyLWV2ZW50cyc6ICdub25lJyxcclxuICAgICd0cmFuc2l0aW9uJzogJ25vbmUnXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5MixcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcclxuICApIHtcclxuICAgIHRoaXMucmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOWIneWni+WMluacjeWKoVxyXG4gICAqL1xyXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubW91c2VNb3ZlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMubW91c2VNb3ZlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMubW91c2VNb3ZlU3Vic2NyaXB0aW9uID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgIHRoaXMubW91c2VNb3ZlU3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2Vtb3ZlJylcclxuICAgICAgICAuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgLy8g5pu05paw6byg5qCH5L2N572uXHJcbiAgICAgICAgICB0aGlzLm1vdXNlUG9zaXRpb24gPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfTtcclxuXHJcbiAgICAgICAgICAvLyDmm7TmlrDkvY3nva5cclxuICAgICAgICAgIGlmICh0aGlzLnRvb2x0aXBFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5pi+56S6dG9vbHRpcFxyXG4gICAqIEBwYXJhbSBjb250ZW50IHRvb2x0aXDlhoXlrrlcclxuICAgKiBAcGFyYW0gb3B0aW9ucyDlj6/pgInphY3nva7vvIzljIXmi6x444CBeeWBj+enu+mHj+WSjOagt+W8j1xyXG4gICAqL1xyXG4gIHB1YmxpYyBzaG93KGNvbnRlbnQ6IHN0cmluZywgb3B0aW9ucz86IE5jTW91c2VUb29sdGlwT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgaWYgKG9wdGlvbnM/Lm9mZnNldFggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLm9mZnNldC54ID0gb3B0aW9ucy5vZmZzZXRYO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vZmZzZXQueCA9IDEyO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zPy5vZmZzZXRZICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5vZmZzZXQueSA9IG9wdGlvbnMub2Zmc2V0WTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub2Zmc2V0LnkgPSAxMjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMudG9vbHRpcEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5jcmVhdGVUb29sdGlwRWxlbWVudChvcHRpb25zPy5zdHlsZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKG9wdGlvbnM/LnN0eWxlcykge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKG9wdGlvbnMuc3R5bGVzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyh0aGlzLmRlZmF1bHRTdHlsZXMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudG9vbHRpcEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLnRvb2x0aXBFbGVtZW50LCAnaW5uZXJIVE1MJywgY29udGVudCk7XHJcbiAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOmakOiXj3Rvb2x0aXBcclxuICAgKi9cclxuICBwdWJsaWMgaGlkZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnRvb2x0aXBFbGVtZW50KSB7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy50b29sdGlwRWxlbWVudCk7XHJcbiAgICAgIHRoaXMudG9vbHRpcEVsZW1lbnQgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog6ZSA5q+BXHJcbiAgICovXHJcbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpZGUoKTtcclxuICAgIGlmICh0aGlzLm1vdXNlTW92ZVN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLm1vdXNlTW92ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICB0aGlzLm1vdXNlTW92ZVN1YnNjcmlwdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDliJvlu7p0b29sdGlw5YWD57SgXHJcbiAgICogQHBhcmFtIGN1c3RvbVN0eWxlcyDoh6rlrprkuYnmoLflvI9cclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZVRvb2x0aXBFbGVtZW50KGN1c3RvbVN0eWxlcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnRvb2x0aXBFbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRvb2x0aXBFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy50b29sdGlwRWxlbWVudCwgJ25jLW1vdXNlLXRvb2x0aXAnKTtcclxuXHJcbiAgICAvLyDlupTnlKjpu5jorqTmoLflvI9cclxuICAgIHRoaXMudXBkYXRlU3R5bGVzKHRoaXMuZGVmYXVsdFN0eWxlcyk7XHJcblxyXG4gICAgLy8g5bqU55So6Ieq5a6a5LmJ5qC35byP77yI5aaC5p6c5o+Q5L6b77yJXHJcbiAgICBpZiAoY3VzdG9tU3R5bGVzKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlU3R5bGVzKGN1c3RvbVN0eWxlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCB0aGlzLnRvb2x0aXBFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOabtOaWsHRvb2x0aXDkvY3nva5cclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZVBvc2l0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnRvb2x0aXBFbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRoaXMudG9vbHRpcEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcbiAgICAvLyDorqHnrpfliJ3lp4vkvY3nva7vvIjpvKDmoIflj7PkuIvmlrnvvIlcclxuICAgIGxldCBsZWZ0ID0gdGhpcy5tb3VzZVBvc2l0aW9uLnggKyB0aGlzLm9mZnNldC54O1xyXG4gICAgbGV0IHRvcCA9IHRoaXMubW91c2VQb3NpdGlvbi55ICsgdGhpcy5vZmZzZXQueTtcclxuXHJcbiAgICAvLyDmo4Dmn6Xlj7PovrnnlYxcclxuICAgIGlmIChsZWZ0ICsgdG9vbHRpcFJlY3Qud2lkdGggPiB2aWV3cG9ydFdpZHRoKSB7XHJcbiAgICAgIC8vIOWmguaenOi2heWHuuWPs+i+ueeVjO+8jOWwhnRvb2x0aXDmlL7lnKjpvKDmoIflt6bkvqdcclxuICAgICAgbGVmdCA9IHRoaXMubW91c2VQb3NpdGlvbi54IC0gdG9vbHRpcFJlY3Qud2lkdGggLSB0aGlzLm9mZnNldC54O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOajgOafpeS4i+i+ueeVjFxyXG4gICAgaWYgKHRvcCArIHRvb2x0aXBSZWN0LmhlaWdodCA+IHZpZXdwb3J0SGVpZ2h0KSB7XHJcbiAgICAgIC8vIOWmguaenOi2heWHuuS4i+i+ueeVjO+8jOWwhnRvb2x0aXDmlL7lnKjpvKDmoIfkuIrmlrlcclxuICAgICAgdG9wID0gdGhpcy5tb3VzZVBvc2l0aW9uLnkgLSB0b29sdGlwUmVjdC5oZWlnaHQgLSB0aGlzLm9mZnNldC55O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOajgOafpeW3pui+ueeVjFxyXG4gICAgaWYgKGxlZnQgPCAwKSB7XHJcbiAgICAgIGxlZnQgPSB0aGlzLm9mZnNldC54O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOajgOafpeS4iui+ueeVjFxyXG4gICAgaWYgKHRvcCA8IDApIHtcclxuICAgICAgdG9wID0gdGhpcy5vZmZzZXQueTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDorr7nva7kvY3nva5cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sdGlwRWxlbWVudCwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbHRpcEVsZW1lbnQsICd0b3AnLCBgJHt0b3B9cHhgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOabtOaWsHRvb2x0aXDmoLflvI9cclxuICAgKiBAcGFyYW0gY3VzdG9tU3R5bGVzIOiHquWumuS5ieagt+W8j1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlU3R5bGVzKGN1c3RvbVN0eWxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnRvb2x0aXBFbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBPYmplY3QuZW50cmllcyhjdXN0b21TdHlsZXMpLmZvckVhY2goKFtwcm9wZXJ0eSwgdmFsdWVdKSA9PiB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sdGlwRWxlbWVudCwgcHJvcGVydHksIHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuIl19