ng-cw-v12
Version:
Angular UI component library
381 lines • 63.9 kB
JavaScript
import { Directive, Input, HostListener } from '@angular/core';
import * as i0 from "@angular/core";
export class ImgPreviewDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
this.ncImgPreview = ''; // 可选的大图URL,如果不提供则使用原图
this.ncMinScale = 0.5; // 最小缩放比例
this.ncMaxScale = 5; // 最大缩放比例
this.ncScaleStep = 0.25; // 缩放步长
/** 滚轮缩放 */
this._wheelScale = false;
this.previewContainer = null;
this.previewImg = null;
this.toolbar = null;
this.isPreviewOpen = false;
// 图片变换状态
this.rotation = 0; // 旋转角度
this.scale = 1; // 缩放比例
// 工具按钮引用
this.zoomInBtn = null;
this.zoomOutBtn = null;
// 事件监听器引用
this.wheelListener = null;
this.keyListener = null;
}
set ncWheelScale(val) {
this._wheelScale = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncWheelScale() {
return this._wheelScale;
}
ngOnInit() {
// 给图片添加预览样式
this.renderer.setStyle(this.el.nativeElement, 'cursor', 'pointer');
this.renderer.setStyle(this.el.nativeElement, 'transition', 'transform 0.2s ease');
}
onImageClick(event) {
event.preventDefault();
event.stopPropagation();
this.openPreview();
}
onMouseEnter() {
this.renderer.setStyle(this.el.nativeElement, 'transform', 'scale(1.05)');
}
onMouseLeave() {
this.renderer.setStyle(this.el.nativeElement, 'transform', 'scale(1)');
}
openPreview() {
if (this.isPreviewOpen)
return;
this.isPreviewOpen = true;
// 重置变换状态
this.rotation = 0;
this.scale = 1;
// 创建预览容器
this.previewContainer = this.renderer.createElement('div');
this.renderer.addClass(this.previewContainer, 'nc-img-preview-overlay');
// 设置遮罩层样式
this.renderer.setStyle(this.previewContainer, 'position', 'fixed');
this.renderer.setStyle(this.previewContainer, 'top', '0');
this.renderer.setStyle(this.previewContainer, 'left', '0');
this.renderer.setStyle(this.previewContainer, 'width', '100vw');
this.renderer.setStyle(this.previewContainer, 'height', '100vh');
this.renderer.setStyle(this.previewContainer, 'background-color', 'rgba(0, 0, 0, 0.45)');
this.renderer.setStyle(this.previewContainer, 'z-index', '9999');
this.renderer.setStyle(this.previewContainer, 'display', 'flex');
this.renderer.setStyle(this.previewContainer, 'justify-content', 'center');
this.renderer.setStyle(this.previewContainer, 'align-items', 'center');
this.renderer.setStyle(this.previewContainer, 'cursor', 'pointer');
this.renderer.setStyle(this.previewContainer, 'opacity', '0');
this.renderer.setStyle(this.previewContainer, 'transition', 'opacity 0.3s ease');
this.renderer.setStyle(this.previewContainer, 'user-select', 'none');
this.renderer.setStyle(this.previewContainer, '-webkit-user-select', 'none');
this.renderer.setStyle(this.previewContainer, '-moz-user-select', 'none');
this.renderer.setStyle(this.previewContainer, '-ms-user-select', 'none');
this.renderer.setStyle(this.previewContainer, 'overflow', 'auto');
// 创建预览图片
this.previewImg = this.renderer.createElement('img');
this.renderer.addClass(this.previewImg, 'nc-img-preview-img');
const imgSrc = this.ncImgPreview || this.el.nativeElement.src;
this.renderer.setAttribute(this.previewImg, 'src', imgSrc);
this.renderer.setStyle(this.previewImg, 'max-width', '100%');
this.renderer.setStyle(this.previewImg, 'max-height', '100%');
this.renderer.setStyle(this.previewImg, 'object-fit', 'contain');
this.renderer.setStyle(this.previewImg, 'border-radius', '8px');
this.renderer.setStyle(this.previewImg, 'box-shadow', '0 4px 20px rgba(0, 0, 0, 0.3)');
this.renderer.setStyle(this.previewImg, 'transform', 'scale(0.8)');
this.renderer.setStyle(this.previewImg, 'transition', 'transform 0.3s ease');
this.renderer.setStyle(this.previewImg, 'cursor', 'default');
this.renderer.setStyle(this.previewImg, 'user-select', 'none');
this.renderer.setStyle(this.previewImg, '-webkit-user-select', 'none');
this.renderer.setStyle(this.previewImg, '-moz-user-select', 'none');
this.renderer.setStyle(this.previewImg, '-ms-user-select', 'none');
this.renderer.setStyle(this.previewImg, '-webkit-user-drag', 'none');
this.renderer.setStyle(this.previewImg, '-khtml-user-drag', 'none');
this.renderer.setStyle(this.previewImg, '-moz-user-drag', 'none');
this.renderer.setStyle(this.previewImg, '-o-user-drag', 'none');
this.renderer.setStyle(this.previewImg, 'user-drag', 'none');
this.renderer.setAttribute(this.previewImg, 'draggable', 'false');
// 创建工具条容器
this.toolbar = this.renderer.createElement('div');
this.renderer.addClass(this.toolbar, 'nc-img-preview-toolbar');
this.renderer.setStyle(this.toolbar, 'position', 'fixed');
this.renderer.setStyle(this.toolbar, 'top', '20px');
this.renderer.setStyle(this.toolbar, 'right', '20px');
this.renderer.setStyle(this.toolbar, 'display', 'flex');
this.renderer.setStyle(this.toolbar, 'gap', '8px');
this.renderer.setStyle(this.toolbar, 'background-color', 'rgba(0, 0, 0, 0.6)');
this.renderer.setStyle(this.toolbar, 'border-radius', '8px');
this.renderer.setStyle(this.toolbar, 'padding', '8px');
this.renderer.setStyle(this.toolbar, 'backdrop-filter', 'blur(10px)');
this.renderer.setStyle(this.toolbar, 'z-index', '10000');
this.renderer.setStyle(this.toolbar, 'user-select', 'none');
this.renderer.setStyle(this.toolbar, '-webkit-user-select', 'none');
this.renderer.setStyle(this.toolbar, '-moz-user-select', 'none');
this.renderer.setStyle(this.toolbar, '-ms-user-select', 'none');
// 创建工具按钮
const rotateLeftBtn = this.createToolButton('↺', '向左旋转');
const rotateRightBtn = this.createToolButton('↻', '向右旋转');
this.zoomInBtn = this.createToolButton('+', '放大');
this.zoomOutBtn = this.createToolButton('−', '缩小');
const closeBtn = this.createToolButton('×', '关闭');
// 添加按钮事件监听器
this.renderer.listen(rotateLeftBtn, 'click', (event) => {
event.preventDefault();
event.stopPropagation();
this.rotateImage(-90);
});
this.renderer.listen(rotateRightBtn, 'click', (event) => {
event.preventDefault();
event.stopPropagation();
this.rotateImage(90);
});
this.renderer.listen(this.zoomInBtn, 'click', (event) => {
event.preventDefault();
event.stopPropagation();
this.scaleImage(this.ncScaleStep);
});
this.renderer.listen(this.zoomOutBtn, 'click', (event) => {
event.preventDefault();
event.stopPropagation();
this.scaleImage(-this.ncScaleStep);
});
this.renderer.listen(closeBtn, 'click', (event) => {
event.preventDefault();
event.stopPropagation();
this.closePreview();
});
// 组装工具条
this.renderer.appendChild(this.toolbar, rotateLeftBtn);
this.renderer.appendChild(this.toolbar, rotateRightBtn);
this.renderer.appendChild(this.toolbar, this.zoomOutBtn);
this.renderer.appendChild(this.toolbar, this.zoomInBtn);
this.renderer.appendChild(this.toolbar, closeBtn);
// 组装预览容器
this.renderer.appendChild(this.previewContainer, this.previewImg);
this.renderer.appendChild(document.body, this.previewContainer);
this.renderer.appendChild(document.body, this.toolbar);
// 添加事件监听器
this.renderer.listen(this.previewContainer, 'click', (event) => {
if (event.target === this.previewContainer) {
this.closePreview();
}
});
// 添加鼠标滚轮事件监听器(如果启用了滚轮缩放)
if (this.ncWheelScale) {
this.wheelListener = this.renderer.listen(this.previewContainer, 'wheel', (event) => {
event.preventDefault();
event.stopPropagation();
// 根据滚轮方向决定缩放方向
// deltaY > 0 表示向下滚动(缩小),deltaY < 0 表示向上滚动(放大)
const delta = event.deltaY > 0 ? -this.ncScaleStep : this.ncScaleStep;
this.scaleImage(delta);
});
}
// 添加键盘事件监听器
this.keyListener = this.renderer.listen('document', 'keydown', (event) => {
if (event.key === 'Escape') {
this.closePreview();
}
});
// 禁止页面滚动和文本选择
this.renderer.setStyle(document.body, 'overflow', 'hidden');
this.renderer.setStyle(document.body, 'user-select', 'none');
this.renderer.setStyle(document.body, '-webkit-user-select', 'none');
this.renderer.setStyle(document.body, '-moz-user-select', 'none');
this.renderer.setStyle(document.body, '-ms-user-select', 'none');
// 动画效果
setTimeout(() => {
if (this.previewContainer && this.previewImg) {
this.renderer.setStyle(this.previewContainer, 'opacity', '1');
this.renderer.setStyle(this.previewImg, 'transform', 'scale(1)');
// 初始化按钮状态
this.updateZoomButtonsState();
}
}, 10);
}
createToolButton(text, title) {
const button = this.renderer.createElement('div');
this.renderer.addClass(button, 'nc-img-preview-toolbar-button');
this.renderer.setStyle(button, 'width', '36px');
this.renderer.setStyle(button, 'height', '36px');
this.renderer.setStyle(button, 'background-color', 'rgba(255, 255, 255, 0.1)');
this.renderer.setStyle(button, 'border-radius', '6px');
this.renderer.setStyle(button, 'display', 'flex');
this.renderer.setStyle(button, 'justify-content', 'center');
this.renderer.setStyle(button, 'align-items', 'center');
this.renderer.setStyle(button, 'cursor', 'pointer');
this.renderer.setStyle(button, 'transition', 'background-color 0.2s ease, transform 0.1s ease');
this.renderer.setStyle(button, 'font-size', '18px');
this.renderer.setStyle(button, 'color', 'white');
this.renderer.setStyle(button, 'font-weight', 'bold');
this.renderer.setStyle(button, 'user-select', 'none');
this.renderer.setAttribute(button, 'title', title);
// 设置按钮内容
const buttonText = this.renderer.createText(text);
this.renderer.appendChild(button, buttonText);
// 添加悬停效果
this.renderer.listen(button, 'mouseenter', () => {
this.renderer.setStyle(button, 'background-color', 'rgba(255, 255, 255, 0.2)');
this.renderer.setStyle(button, 'transform', 'scale(1.1)');
});
this.renderer.listen(button, 'mouseleave', () => {
this.renderer.setStyle(button, 'background-color', 'rgba(255, 255, 255, 0.1)');
this.renderer.setStyle(button, 'transform', 'scale(1)');
});
// 添加点击效果
this.renderer.listen(button, 'mousedown', (event) => {
event.preventDefault();
this.renderer.setStyle(button, 'transform', 'scale(0.95)');
});
this.renderer.listen(button, 'mouseup', (event) => {
event.preventDefault();
this.renderer.setStyle(button, 'transform', 'scale(1.1)');
});
// 阻止文本选择开始
this.renderer.listen(button, 'selectstart', (event) => {
event.preventDefault();
});
// 阻止拖拽开始
this.renderer.listen(button, 'dragstart', (event) => {
event.preventDefault();
});
return button;
}
rotateImage(angle) {
if (!this.previewImg)
return;
this.rotation += angle;
this.updateImageTransform();
}
scaleImage(delta) {
if (!this.previewImg)
return;
const newScale = this.mathAdd(this.scale, delta);
// 确保缩放比例在合理范围内,超出范围时设置为边界值
if (newScale < this.ncMinScale) {
this.scale = this.ncMinScale;
}
else if (newScale > this.ncMaxScale) {
this.scale = this.ncMaxScale;
}
else {
this.scale = newScale;
}
this.updateImageTransform();
this.updateZoomButtonsState();
}
updateImageTransform() {
if (!this.previewImg)
return;
const transform = `scale3d(${this.scale}, ${this.scale}, 1) rotate(${this.rotation}deg)`;
this.renderer.setStyle(this.previewImg, 'transform', transform);
}
updateZoomButtonsState() {
if (!this.zoomInBtn || !this.zoomOutBtn)
return;
const isMinScale = this.scale <= this.ncMinScale;
const isMaxScale = this.scale >= this.ncMaxScale;
// 更新按钮状态
this.setButtonDisabled(this.zoomOutBtn, isMinScale);
this.setButtonDisabled(this.zoomInBtn, isMaxScale);
}
setButtonDisabled(button, disabled) {
if (disabled) {
this.renderer.setStyle(button, 'opacity', '0.4');
this.renderer.setStyle(button, 'pointer-events', 'none');
}
else {
this.renderer.setStyle(button, 'opacity', '1');
this.renderer.setStyle(button, 'pointer-events', 'auto');
}
}
closePreview() {
if (!this.isPreviewOpen || !this.previewContainer)
return;
// 清理事件监听器
if (this.keyListener) {
this.keyListener();
this.keyListener = null;
}
if (this.wheelListener) {
this.wheelListener();
this.wheelListener = null;
}
// 移除工具栏
if (this.toolbar) {
this.renderer.removeChild(document.body, this.toolbar);
this.toolbar = null;
}
// 添加关闭动画
this.renderer.setStyle(this.previewContainer, 'opacity', '0');
if (this.previewImg) {
this.renderer.setStyle(this.previewImg, 'transform', 'scale(0.8)');
}
// 延迟移除元素以完成动画
setTimeout(() => {
if (this.previewContainer) {
this.renderer.removeChild(document.body, this.previewContainer);
this.previewContainer = null;
this.previewImg = null;
this.zoomInBtn = null;
this.zoomOutBtn = null;
}
this.isPreviewOpen = false;
// 恢复页面滚动和文本选择
this.renderer.removeStyle(document.body, 'overflow');
this.renderer.removeStyle(document.body, 'user-select');
this.renderer.removeStyle(document.body, '-webkit-user-select');
this.renderer.removeStyle(document.body, '-moz-user-select');
this.renderer.removeStyle(document.body, '-ms-user-select');
}, 300);
}
mathAdd(value1, value2) {
// 将浮点数转换为字符串
let aStr = value1.toString();
let bStr = value2.toString();
// 找到小数点后的位置
let aDecimals = (aStr.split('.')[1] || '').length;
let bDecimals = (bStr.split('.')[1] || '').length;
// 找到最大的小数位数
let maxDecimals = Math.max(aDecimals, bDecimals);
// 将浮点数转换为整数
let aInt = Math.round(value1 * Math.pow(10, maxDecimals));
let bInt = Math.round(value2 * Math.pow(10, maxDecimals));
// 进行整数加法
let resultInt = aInt + bInt;
// 将结果转换回浮点数
return resultInt / Math.pow(10, maxDecimals);
}
}
ImgPreviewDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ImgPreviewDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
ImgPreviewDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: ImgPreviewDirective, selector: "[ncImgPreview]", inputs: { ncImgPreview: "ncImgPreview", ncMinScale: "ncMinScale", ncMaxScale: "ncMaxScale", ncScaleStep: "ncScaleStep", ncWheelScale: "ncWheelScale" }, host: { listeners: { "click": "onImageClick($event)", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, exportAs: ["ncImgPreview"], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ImgPreviewDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncImgPreview]',
exportAs: 'ncImgPreview'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncImgPreview: [{
type: Input
}], ncMinScale: [{
type: Input
}], ncMaxScale: [{
type: Input
}], ncScaleStep: [{
type: Input
}], ncWheelScale: [{
type: Input
}], onImageClick: [{
type: HostListener,
args: ['click', ['$event']]
}], onMouseEnter: [{
type: HostListener,
args: ['mouseenter']
}], onMouseLeave: [{
type: HostListener,
args: ['mouseleave']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1nLXByZXZpZXcuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9pbWctcHJldmlldy9pbWctcHJldmlldy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFVLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFNOUYsTUFBTSxPQUFPLG1CQUFtQjtJQWdDL0IsWUFBb0IsRUFBYyxFQUFVLFFBQW1CO1FBQTNDLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBL0J0RCxpQkFBWSxHQUFXLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQjtRQUNqRCxlQUFVLEdBQVcsR0FBRyxDQUFDLENBQUMsU0FBUztRQUNuQyxlQUFVLEdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNqQyxnQkFBVyxHQUFXLElBQUksQ0FBQyxDQUFDLE9BQU87UUFDNUMsV0FBVztRQUNILGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBUzdCLHFCQUFnQixHQUF1QixJQUFJLENBQUM7UUFDNUMsZUFBVSxHQUF1QixJQUFJLENBQUM7UUFDdEMsWUFBTyxHQUF1QixJQUFJLENBQUM7UUFDbkMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFOUIsU0FBUztRQUNELGFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPO1FBQ3JCLFVBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPO1FBRTFCLFNBQVM7UUFDRCxjQUFTLEdBQXVCLElBQUksQ0FBQztRQUNyQyxlQUFVLEdBQXVCLElBQUksQ0FBQztRQUU5QyxVQUFVO1FBQ0Ysa0JBQWEsR0FBd0IsSUFBSSxDQUFDO1FBQzFDLGdCQUFXLEdBQXdCLElBQUksQ0FBQztJQUVtQixDQUFDO0lBekJwRSxJQUNJLFlBQVksQ0FBQyxHQUFxQjtRQUNyQyxJQUFJLENBQUMsV0FB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QUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFMUQsU0FBUztRQUNULElBQUksU0FBUyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7UUFFNUIsWUFBWTtRQUNaLE9BQU8sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7O2dIQXBaVyxtQkFBbUI7b0dBQW5CLG1CQUFtQjsyRkFBbkIsbUJBQW1CO2tCQUovQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFFBQVEsRUFBRSxjQUFjO2lCQUN4Qjt5SEFFUyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlGLFlBQVk7c0JBRGYsS0FBSztnQkFrQ04sWUFBWTtzQkFEWCxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFRakMsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFlBQVk7Z0JBTTFCLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIElucHV0LCBPbkluaXQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcblx0c2VsZWN0b3I6ICdbbmNJbWdQcmV2aWV3XScsXHJcblx0ZXhwb3J0QXM6ICduY0ltZ1ByZXZpZXcnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbWdQcmV2aWV3RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHRASW5wdXQoKSBuY0ltZ1ByZXZpZXc6IHN0cmluZyA9ICcnOyAvLyDlj6/pgInnmoTlpKflm75VUkzvvIzlpoLmnpzkuI3mj5DkvpvliJnkvb/nlKjljp/lm75cclxuXHRASW5wdXQoKSBuY01pblNjYWxlOiBudW1iZXIgPSAwLjU7IC8vIOacgOWwj+e8qeaUvuavlOS+i1xyXG5cdEBJbnB1dCgpIG5jTWF4U2NhbGU6IG51bWJlciA9IDU7IC8vIOacgOWkp+e8qeaUvuavlOS+i1xyXG5cdEBJbnB1dCgpIG5jU2NhbGVTdGVwOiBudW1iZXIgPSAwLjI1OyAvLyDnvKnmlL7mraXplb9cclxuXHQvKiog5rua6L2u57yp5pS+ICovXHJcblx0cHJpdmF0ZSBfd2hlZWxTY2FsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdEBJbnB1dCgpXHJcblx0c2V0IG5jV2hlZWxTY2FsZSh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuXHRcdHRoaXMuX3doZWVsU2NhbGUgPSB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBmYWxzZSAmJiB2YWwgIT09ICdmYWxzZSc7XHJcblx0fVxyXG5cdGdldCBuY1doZWVsU2NhbGUoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5fd2hlZWxTY2FsZTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcHJldmlld0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIHByZXZpZXdJbWc6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0cHJpdmF0ZSB0b29sYmFyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cdHByaXZhdGUgaXNQcmV2aWV3T3BlbiA9IGZhbHNlO1xyXG5cclxuXHQvLyDlm77niYflj5jmjaLnirbmgIFcclxuXHRwcml2YXRlIHJvdGF0aW9uID0gMDsgLy8g5peL6L2s6KeS5bqmXHJcblx0cHJpdmF0ZSBzY2FsZSA9IDE7IC8vIOe8qeaUvuavlOS+i1xyXG5cclxuXHQvLyDlt6XlhbfmjInpkq7lvJXnlKhcclxuXHRwcml2YXRlIHpvb21JbkJ0bjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIHpvb21PdXRCdG46IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdC8vIOS6i+S7tuebkeWQrOWZqOW8leeUqFxyXG5cdHByaXZhdGUgd2hlZWxMaXN0ZW5lcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcblx0cHJpdmF0ZSBrZXlMaXN0ZW5lcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikgeyB9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0Ly8g57uZ5Zu+54mH5re75Yqg6aKE6KeI5qC35byPXHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2N1cnNvcicsICdwb2ludGVyJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RyYW5zaXRpb24nLCAndHJhbnNmb3JtIDAuMnMgZWFzZScpO1xyXG5cdH1cclxuXHJcblx0QEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxyXG5cdG9uSW1hZ2VDbGljayhldmVudDogRXZlbnQpIHtcclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdHRoaXMub3BlblByZXZpZXcoKTtcclxuXHR9XHJcblxyXG5cdEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInKVxyXG5cdG9uTW91c2VFbnRlcigpIHtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgJ3NjYWxlKDEuMDUpJyk7XHJcblx0fVxyXG5cclxuXHRASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcclxuXHRvbk1vdXNlTGVhdmUoKSB7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsICdzY2FsZSgxKScpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBvcGVuUHJldmlldygpIHtcclxuXHRcdGlmICh0aGlzLmlzUHJldmlld09wZW4pIHJldHVybjtcclxuXHJcblx0XHR0aGlzLmlzUHJldmlld09wZW4gPSB0cnVlO1xyXG5cclxuXHRcdC8vIOmHjee9ruWPmOaNoueKtuaAgVxyXG5cdFx0dGhpcy5yb3RhdGlvbiA9IDA7XHJcblx0XHR0aGlzLnNjYWxlID0gMTtcclxuXHJcblx0XHQvLyDliJvlu7rpooTop4jlrrnlmahcclxuXHRcdHRoaXMucHJldmlld0NvbnRhaW5lciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ25jLWltZy1wcmV2aWV3LW92ZXJsYXknKTtcclxuXHJcblx0XHQvLyDorr7nva7pga7nvanlsYLmoLflvI9cclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAncG9zaXRpb24nLCAnZml4ZWQnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAndG9wJywgJzAnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnbGVmdCcsICcwJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ3dpZHRoJywgJzEwMHZ3Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ2hlaWdodCcsICcxMDB2aCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ3JnYmEoMCwgMCwgMCwgMC40NSknKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnei1pbmRleCcsICc5OTk5Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ2Rpc3BsYXknLCAnZmxleCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdqdXN0aWZ5LWNvbnRlbnQnLCAnY2VudGVyJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdjdXJzb3InLCAncG9pbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdvcGFjaXR5JywgJzAnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAndHJhbnNpdGlvbicsICdvcGFjaXR5IDAuM3MgZWFzZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICd1c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJy13ZWJraXQtdXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICctbW96LXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnLW1zLXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnb3ZlcmZsb3cnLCAnYXV0bycpO1xyXG5cclxuXHRcdC8vIOWIm+W7uumihOiniOWbvueJh1xyXG5cdFx0dGhpcy5wcmV2aWV3SW1nID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5wcmV2aWV3SW1nLCAnbmMtaW1nLXByZXZpZXctaW1nJyk7XHJcblx0XHRjb25zdCBpbWdTcmMgPSB0aGlzLm5jSW1nUHJldmlldyB8fCB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3JjO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5wcmV2aWV3SW1nLCAnc3JjJywgaW1nU3JjKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnbWF4LXdpZHRoJywgJzEwMCUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnbWF4LWhlaWdodCcsICcxMDAlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJ29iamVjdC1maXQnLCAnY29udGFpbicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICdib3JkZXItcmFkaXVzJywgJzhweCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICdib3gtc2hhZG93JywgJzAgNHB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjMpJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJ3RyYW5zZm9ybScsICdzY2FsZSgwLjgpJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJ3RyYW5zaXRpb24nLCAndHJhbnNmb3JtIDAuM3MgZWFzZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICdjdXJzb3InLCAnZGVmYXVsdCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICd1c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJy13ZWJraXQtdXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICctbW96LXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnLW1zLXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnLXdlYmtpdC11c2VyLWRyYWcnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICcta2h0bWwtdXNlci1kcmFnJywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnLW1vei11c2VyLWRyYWcnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICctby11c2VyLWRyYWcnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICd1c2VyLWRyYWcnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5wcmV2aWV3SW1nLCAnZHJhZ2dhYmxlJywgJ2ZhbHNlJyk7XHJcblxyXG5cdFx0Ly8g5Yib5bu65bel5YW35p2h5a655ZmoXHJcblx0XHR0aGlzLnRvb2xiYXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnRvb2xiYXIsICduYy1pbWctcHJldmlldy10b29sYmFyJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ3Bvc2l0aW9uJywgJ2ZpeGVkJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ3RvcCcsICcyMHB4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ3JpZ2h0JywgJzIwcHgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnZGlzcGxheScsICdmbGV4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ2dhcCcsICc4cHgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnYmFja2dyb3VuZC1jb2xvcicsICdyZ2JhKDAsIDAsIDAsIDAuNiknKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnYm9yZGVyLXJhZGl1cycsICc4cHgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAncGFkZGluZycsICc4cHgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnYmFja2Ryb3AtZmlsdGVyJywgJ2JsdXIoMTBweCknKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnei1pbmRleCcsICcxMDAwMCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRvb2xiYXIsICd1c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJy13ZWJraXQtdXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRvb2xiYXIsICctbW96LXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnLW1zLXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHJcblx0XHQvLyDliJvlu7rlt6XlhbfmjInpkq5cclxuXHRcdGNvbnN0IHJvdGF0ZUxlZnRCdG4gPSB0aGlzLmNyZWF0ZVRvb2xCdXR0b24oJ+KGuicsICflkJHlt6bml4vovawnKTtcclxuXHRcdGNvbnN0IHJvdGF0ZVJpZ2h0QnRuID0gdGhpcy5jcmVhdGVUb29sQnV0dG9uKCfihrsnLCAn5ZCR5Y+z5peL6L2sJyk7XHJcblx0XHR0aGlzLnpvb21JbkJ0biA9IHRoaXMuY3JlYXRlVG9vbEJ1dHRvbignKycsICfmlL7lpKcnKTtcclxuXHRcdHRoaXMuem9vbU91dEJ0biA9IHRoaXMuY3JlYXRlVG9vbEJ1dHRvbign4oiSJywgJ+e8qeWwjycpO1xyXG5cdFx0Y29uc3QgY2xvc2VCdG4gPSB0aGlzLmNyZWF0ZVRvb2xCdXR0b24oJ8OXJywgJ+WFs+mXrScpO1xyXG5cclxuXHRcdC8vIOa3u+WKoOaMiemS