UNPKG

ng-cw-v12

Version:

Angular UI Component Library

385 lines 63.9 kB
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;
        /** 大图URL */
        this.ncImgPreview = '';
        /** 最小缩放比例 */
        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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1nLXByZXZpZXcuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9pbWctcHJldmlldy9pbWctcHJldmlldy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFVLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFNOUYsTUFBTSxPQUFPLG1CQUFtQjtJQW9DL0IsWUFBb0IsRUFBYyxFQUFVLFFBQW1CO1FBQTNDLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBbkMvRCxZQUFZO1FBQ0gsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDbkMsYUFBYTtRQUNKLGVBQVUsR0FBVyxHQUFHLENBQUM7UUFDbEMsYUFBYTtRQUNKLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDaEMsV0FBVztRQUNGLGdCQUFXLEdBQVcsSUFBSSxDQUFDO1FBQ3BDLFdBQVc7UUFDSCxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQVM3QixxQkFBZ0IsR0FBdUIsSUFBSSxDQUFDO1FBQzVDLGVBQVUsR0FBdUIsSUFBSSxDQUFDO1FBQ3RDLFlBQU8sR0FBdUIsSUFBSSxDQUFDO1FBQ25DLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRTlCLFNBQVM7UUFDRCxhQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTztRQUNyQixVQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTztRQUUxQixTQUFTO1FBQ0QsY0FBUyxHQUF1QixJQUFJLENBQUM7UUFDckMsZUFBVSxHQUF1QixJQUFJLENBQUM7UUFFOUMsVUFBVTtRQUNGLGtCQUFhLEdBQXdCLElBQUksQ0FBQztRQUMxQyxnQkFBVyxHQUF3QixJQUFJLENBQUM7SUFFbUIsQ0FBQztJQXpCcEUsSUFDSSxZQUFZLENBQUMsR0FBcUI7UUFDckMsSUFBSSxDQUFDLFdBQVcs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RyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRTFELFNBQVM7UUFDVCxJQUFJLFNBQVMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRTVCLFlBQVk7UUFDWixPQUFPLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM5QyxDQUFDOztnSEF4WlcsbUJBQW1CO29HQUFuQixtQkFBbUI7MkZBQW5CLG1CQUFtQjtrQkFKL0IsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixRQUFRLEVBQUUsY0FBYztpQkFDeEI7eUhBR1MsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFJRixZQUFZO3NCQURmLEtBQUs7Z0JBa0NOLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUWpDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZO2dCQU0xQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBJbnB1dCwgT25Jbml0LCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG5cdHNlbGVjdG9yOiAnW25jSW1nUHJldmlld10nLFxyXG5cdGV4cG9ydEFzOiAnbmNJbWdQcmV2aWV3J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgSW1nUHJldmlld0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblx0LyoqIOWkp+WbvlVSTCAqL1xyXG5cdEBJbnB1dCgpIG5jSW1nUHJldmlldzogc3RyaW5nID0gJyc7XHJcblx0LyoqIOacgOWwj+e8qeaUvuavlOS+iyAqL1xyXG5cdEBJbnB1dCgpIG5jTWluU2NhbGU6IG51bWJlciA9IDAuNTtcclxuXHQvKiog5pyA5aSn57yp5pS+5q+U5L6LICovXHJcblx0QElucHV0KCkgbmNNYXhTY2FsZTogbnVtYmVyID0gNTtcclxuXHQvKiog57yp5pS+5q2l6ZW/ICovXHJcblx0QElucHV0KCkgbmNTY2FsZVN0ZXA6IG51bWJlciA9IDAuMjU7XHJcblx0LyoqIOa7mui9rue8qeaUviAqL1xyXG5cdHByaXZhdGUgX3doZWVsU2NhbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRASW5wdXQoKVxyXG5cdHNldCBuY1doZWVsU2NhbGUodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcblx0XHR0aGlzLl93aGVlbFNjYWxlID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG5cdH1cclxuXHRnZXQgbmNXaGVlbFNjYWxlKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3doZWVsU2NhbGU7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHByZXZpZXdDb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0cHJpdmF0ZSBwcmV2aWV3SW1nOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cdHByaXZhdGUgdG9vbGJhcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIGlzUHJldmlld09wZW4gPSBmYWxzZTtcclxuXHJcblx0Ly8g5Zu+54mH5Y+Y5o2i54q25oCBXHJcblx0cHJpdmF0ZSByb3RhdGlvbiA9IDA7IC8vIOaXi+i9rOinkuW6plxyXG5cdHByaXZhdGUgc2NhbGUgPSAxOyAvLyDnvKnmlL7mr5TkvotcclxuXHJcblx0Ly8g5bel5YW35oyJ6ZKu5byV55SoXHJcblx0cHJpdmF0ZSB6b29tSW5CdG46IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0cHJpdmF0ZSB6b29tT3V0QnRuOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuXHQvLyDkuovku7bnm5HlkKzlmajlvJXnlKhcclxuXHRwcml2YXRlIHdoZWVsTGlzdGVuZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cdHByaXZhdGUga2V5TGlzdGVuZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHsgfVxyXG5cclxuXHRuZ09uSW5pdCgpIHtcclxuXHRcdC8vIOe7meWbvueJh+a3u+WKoOmihOiniOagt+W8j1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdjdXJzb3InLCAncG9pbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uJywgJ3RyYW5zZm9ybSAwLjJzIGVhc2UnKTtcclxuXHR9XHJcblxyXG5cdEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcclxuXHRvbkltYWdlQ2xpY2soZXZlbnQ6IEV2ZW50KSB7XHJcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHR0aGlzLm9wZW5QcmV2aWV3KCk7XHJcblx0fVxyXG5cclxuXHRASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJylcclxuXHRvbk1vdXNlRW50ZXIoKSB7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsICdzY2FsZSgxLjA1KScpO1xyXG5cdH1cclxuXHJcblx0QEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXHJcblx0b25Nb3VzZUxlYXZlKCkge1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2Zvcm0nLCAnc2NhbGUoMSknKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgb3BlblByZXZpZXcoKSB7XHJcblx0XHRpZiAodGhpcy5pc1ByZXZpZXdPcGVuKSByZXR1cm47XHJcblxyXG5cdFx0dGhpcy5pc1ByZXZpZXdPcGVuID0gdHJ1ZTtcclxuXHJcblx0XHQvLyDph43nva7lj5jmjaLnirbmgIFcclxuXHRcdHRoaXMucm90YXRpb24gPSAwO1xyXG5cdFx0dGhpcy5zY2FsZSA9IDE7XHJcblxyXG5cdFx0Ly8g5Yib5bu66aKE6KeI5a655ZmoXHJcblx0XHR0aGlzLnByZXZpZXdDb250YWluZXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnByZXZpZXdDb250YWluZXIsICduYy1pbWctcHJldmlldy1vdmVybGF5Jyk7XHJcblxyXG5cdFx0Ly8g6K6+572u6YGu572p5bGC5qC35byPXHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ3Bvc2l0aW9uJywgJ2ZpeGVkJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ3RvcCcsICcwJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ2xlZnQnLCAnMCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICd3aWR0aCcsICcxMDB2dycpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdoZWlnaHQnLCAnMTAwdmgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnYmFja2dyb3VuZC1jb2xvcicsICdyZ2JhKDAsIDAsIDAsIDAuNDUpJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ3otaW5kZXgnLCAnOTk5OScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdkaXNwbGF5JywgJ2ZsZXgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdhbGlnbi1pdGVtcycsICdjZW50ZXInKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnY3Vyc29yJywgJ3BvaW50ZXInKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnb3BhY2l0eScsICcwJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ3RyYW5zaXRpb24nLCAnb3BhY2l0eSAwLjNzIGVhc2UnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAndXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICctd2Via2l0LXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnLW1vei11c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJy1tcy11c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ292ZXJmbG93JywgJ2F1dG8nKTtcclxuXHJcblx0XHQvLyDliJvlu7rpooTop4jlm77niYdcclxuXHRcdHRoaXMucHJldmlld0ltZyA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMucHJldmlld0ltZywgJ25jLWltZy1wcmV2aWV3LWltZycpO1xyXG5cdFx0Y29uc3QgaW1nU3JjID0gdGhpcy5uY0ltZ1ByZXZpZXcgfHwgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNyYztcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMucHJldmlld0ltZywgJ3NyYycsIGltZ1NyYyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJ21heC13aWR0aCcsICcxMDAlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJ21heC1oZWlnaHQnLCAnMTAwJScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICdvYmplY3QtZml0JywgJ2NvbnRhaW4nKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnYm9yZGVyLXJhZGl1cycsICc4cHgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnYm94LXNoYWRvdycsICcwIDRweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4zKScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICd0cmFuc2Zvcm0nLCAnc2NhbGUoMC44KScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICd0cmFuc2l0aW9uJywgJ3RyYW5zZm9ybSAwLjNzIGVhc2UnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnY3Vyc29yJywgJ2RlZmF1bHQnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAndXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICctd2Via2l0LXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnLW1vei11c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJy1tcy11c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJy13ZWJraXQtdXNlci1kcmFnJywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnLWtodG1sLXVzZXItZHJhZycsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJy1tb3otdXNlci1kcmFnJywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAnLW8tdXNlci1kcmFnJywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAndXNlci1kcmFnJywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMucHJldmlld0ltZywgJ2RyYWdnYWJsZScsICdmYWxzZScpO1xyXG5cclxuXHRcdC8vIOWIm+W7uuW3peWFt+adoeWuueWZqFxyXG5cdFx0dGhpcy50b29sYmFyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy50b29sYmFyLCAnbmMtaW1nLXByZXZpZXctdG9vbGJhcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRvb2xiYXIsICdwb3NpdGlvbicsICdmaXhlZCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRvb2xiYXIsICd0b3AnLCAnMjBweCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRvb2xiYXIsICdyaWdodCcsICcyMHB4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ2Rpc3BsYXknLCAnZmxleCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRvb2xiYXIsICdnYXAnLCAnOHB4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ2JhY2tncm91bmQtY29sb3InLCAncmdiYSgwLCAwLCAwLCAwLjYpJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ2JvcmRlci1yYWRpdXMnLCAnOHB4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ3BhZGRpbmcnLCAnOHB4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ2JhY2tkcm9wLWZpbHRlcicsICdibHVyKDEwcHgpJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJ3otaW5kZXgnLCAnMTAwMDAnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAndXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRvb2xiYXIsICctd2Via2l0LXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50b29sYmFyLCAnLW1vei11c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudG9vbGJhciwgJy1tcy11c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblxyXG5cdFx0Ly8g5Yib5bu65bel5YW35oyJ6ZKuXHJcblx0XHRjb25zdCByb3RhdGVMZWZ0QnRuID0gdGhpcy5jcmVhdGVUb29sQnV0dG9uKCfihronLCAn5ZCR5bem5peL6L2sJyk7XHJcblx0XHRjb25zdCByb3RhdGVSaWdodEJ0biA9IHRoaXMuY3JlYXRlVG9vbEJ1dHRvbign4oa7JywgJ+WQkeWPs+aXi+i9rCcpO1xyXG5cdFx0dGhpcy56b29tSW5CdG4gPSB0aGlzLmNyZWF0ZVRvb2xCdXR0b24oJysnLCAn5pS+5aSnJyk7XHJcblx0XHR0aGlzLnpvb21PdXRCdG4gPSB0aGlzLmNyZWF0ZVRvb2xCdXR0b24oJ+KIkicsICfnvKnlsI8nKTtcclxuXHRcdGNvbnN0IGNsb3NlQnRuID0gdGhpcy5jcmVhdGVUb29sQnV0dG9uKCfDlycsICflhbPpl60nKTtcclxuXHJcblx0XHQvLyDmt7vliqDmjInpkq7kuovku7bnm5HlkKzlmahcclxuXHRcdHRoaXMucmVuZGVyZXIubGlzdGVuKHJvdGF0ZUxlZnRCdG4sICdjbGljaycsIChldmVudCkgPT4ge1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0dGhpcy5yb3RhdGVJbWFnZSgtOTApO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlci5saXN0ZW4ocm90YXRlUmlnaHRCdG4sICdjbGljaycsIChldmVudCkgPT4ge1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0dGhpcy5yb3RhdGVJbWFnZSg5MCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLnpvb21JbkJ0biwgJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHR0aGlzLnNjYWxlSW1hZ2UodGhpcy5uY1NjYWxlU3RlcCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLnpvb21PdXRCdG4sICdjbGljaycsIChldmVudCkgPT4ge1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0dGhpcy5zY2FsZUltYWdlKC10aGlzLm5jU2NhbGVTdGVwKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyZXIubGlzdGVuKGNsb3NlQnRuLCAnY2xpY2snLCAoZXZlbnQpID0+IHtcclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdHRoaXMuY2xvc2VQcmV2aWV3KCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyDnu4Too4Xlt6XlhbfmnaFcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy50b29sYmFyLCByb3RhdGVMZWZ0QnRuKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy50b29sYmFyLCByb3RhdGVSaWdodEJ0bik7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMudG9vbGJhciwgdGhpcy56b29tT3V0QnRuKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy50b29sYmFyLCB0aGlzLnpvb21JbkJ0bik7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMudG9vbGJhciwgY2xvc2VCdG4pO1xyXG5cclxuXHRcdC8vIOe7hOijhemihOiniOWuueWZqFxyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnByZXZpZXdDb250YWluZXIsIHRoaXMucHJldmlld0ltZyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmJvZHksIHRoaXMucHJldmlld0NvbnRhaW5lcik7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmJvZHksIHRoaXMudG9vbGJhcik7XHJcblxyXG5cdFx0Ly8g5re75Yqg5LqL5Lu255uR5ZCs5ZmoXHJcblx0XHR0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLnByZXZpZXdDb250YWluZXIsICdjbGljaycsIChldmVudCkgPT4ge1xyXG5cdFx0XHRpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnByZXZpZXdDb250YWluZXIpIHtcclxuXHRcdFx0XHR0aGlzLmNsb3NlUHJldmlldygpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyDmt7vliqDpvKDmoIfmu5rova7kuovku7bnm5HlkKzlmajvvIjlpoLmnpzlkK/nlKjkuobmu5rova7nvKnmlL7vvIlcclxuXHRcdGlmICh0aGlzLm5jV2hlZWxTY2FsZSkge1xyXG5cdFx0XHR0aGlzLndoZWVsTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLnByZXZpZXdDb250YWluZXIsICd3aGVlbCcsIChldmVudDogV2hlZWxFdmVudCkgPT4ge1xyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG5cdFx0XHRcdC8vIOagueaNrua7mui9ruaWueWQkeWGs+Wumue8qeaUvuaWueWQkVxyXG5cdFx0XHRcdC8vIGRlbHRhWSA+IDAg6KGo56S65ZCR5LiL5rua5Yqo77yI57yp5bCP77yJ77yMZGVsdGFZIDwgMCDooajnpLrlkJHkuIrmu5rliqjvvIjmlL7lpKfvvIlcclxuXHRcdFx0XHRjb25zdCBkZWx0YSA9IGV2ZW50LmRlbHRhWSA+IDAgPyAtdGhpcy5uY1NjYWxlU3RlcCA6IHRoaXMubmNTY2FsZVN0ZXA7XHJcblx0XHRcdFx0dGhpcy5zY2FsZUltYWdlKGRlbHRhKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8g5re75Yqg6ZSu55uY5LqL5Lu255uR5ZCs5ZmoXHJcblx0XHR0aGlzLmtleUxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2tleWRvd24nLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuXHRcdFx0aWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcclxuXHRcdFx0XHR0aGlzLmNsb3NlUHJldmlldygpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyDnpoHmraLpobXpnaLmu5rliqjlkozmlofmnKzpgInmi6lcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG9jdW1lbnQuYm9keSwgJ292ZXJmbG93JywgJ2hpZGRlbicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb2N1bWVudC5ib2R5LCAndXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb2N1bWVudC5ib2R5LCAnLXdlYmtpdC11c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvY3VtZW50LmJvZHksICctbW96LXVzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG9jdW1lbnQuYm9keSwgJy1tcy11c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblxyXG5cdFx0Ly8g5Yqo55S75pWI5p6cXHJcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0aWYgKHRoaXMucHJldmlld0NvbnRhaW5lciAmJiB0aGlzLnByZXZpZXdJbWcpIHtcclxuXHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ29wYWNpdHknLCAnMScpO1xyXG5cdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAndHJhbnNmb3JtJywgJ3NjYWxlKDEpJyk7XHJcblx0XHRcdFx0Ly8g5Yid5aeL5YyW5oyJ6ZKu54q25oCBXHJcblx0XHRcdFx0dGhpcy51cGRhdGVab29tQnV0dG9uc1N0YXRlKCk7XHJcblx0XHRcdH1cclxuXHRcdH0sIDEwKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY3JlYXRlVG9vbEJ1dHRvbih0ZXh0OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XHJcblx0XHRjb25zdCBidXR0b24gPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hZGRDbGFzcyhidXR0b24sICduYy1pbWctcHJldmlldy10b29sYmFyLWJ1dHRvbicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICd3aWR0aCcsICczNnB4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ2hlaWdodCcsICczNnB4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ2JhY2tncm91bmQtY29sb3InLCAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ2JvcmRlci1yYWRpdXMnLCAnNnB4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ2Rpc3BsYXknLCAnZmxleCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdqdXN0aWZ5LWNvbnRlbnQnLCAnY2VudGVyJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdjdXJzb3InLCAncG9pbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICd0cmFuc2l0aW9uJywgJ2JhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlLCB0cmFuc2Zvcm0gMC4xcyBlYXNlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ2ZvbnQtc2l6ZScsICcxOHB4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ2NvbG9yJywgJ3doaXRlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoYnV0dG9uLCAndXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnV0dG9uLCAndGl0bGUnLCB0aXRsZSk7XHJcblxyXG5cdFx0Ly8g6K6+572u5oyJ6ZKu5YaF5a65XHJcblx0XHRjb25zdCBidXR0b25UZXh0ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KHRleHQpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChidXR0b24sIGJ1dHRvblRleHQpO1xyXG5cclxuXHRcdC8vIOa3u+WKoOaCrOWBnOaViOaenFxyXG5cdFx0dGhpcy5yZW5kZXJlci5saXN0ZW4oYnV0dG9uLCAnbW91c2VlbnRlcicsICgpID0+IHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdiYWNrZ3JvdW5kLWNvbG9yJywgJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKScpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ3RyYW5zZm9ybScsICdzY2FsZSgxLjEpJyk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlcmVyLmxpc3RlbihidXR0b24sICdtb3VzZWxlYXZlJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ2JhY2tncm91bmQtY29sb3InLCAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpJyk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoYnV0dG9uLCAndHJhbnNmb3JtJywgJ3NjYWxlKDEpJyk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyDmt7vliqDngrnlh7vmlYjmnpxcclxuXHRcdHRoaXMucmVuZGVyZXIubGlzdGVuKGJ1dHRvbiwgJ21vdXNlZG93bicsIChldmVudCkgPT4ge1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ3RyYW5zZm9ybScsICdzY2FsZSgwLjk1KScpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlci5saXN0ZW4oYnV0dG9uLCAnbW91c2V1cCcsIChldmVudCkgPT4ge1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ3RyYW5zZm9ybScsICdzY2FsZSgxLjEpJyk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyDpmLvmraLmlofmnKzpgInmi6nlvIDlp4tcclxuXHRcdHRoaXMucmVuZGVyZXIubGlzdGVuKGJ1dHRvbiwgJ3NlbGVjdHN0YXJ0JywgKGV2ZW50KSA9PiB7XHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyDpmLvmraLmi5bmi73lvIDlp4tcclxuXHRcdHRoaXMucmVuZGVyZXIubGlzdGVuKGJ1dHRvbiwgJ2RyYWdzdGFydCcsIChldmVudCkgPT4ge1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmV0dXJuIGJ1dHRvbjtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcm90YXRlSW1hZ2UoYW5nbGU6IG51bWJlcikge1xyXG5cdFx0aWYgKCF0aGlzLnByZXZpZXdJbWcpIHJldHVybjtcclxuXHJcblx0XHR0aGlzLnJvdGF0aW9uICs9IGFuZ2xlO1xyXG5cdFx0dGhpcy51cGRhdGVJbWFnZVRyYW5zZm9ybSgpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzY2FsZUltYWdlKGRlbHRhOiBudW1iZXIpIHtcclxuXHRcdGlmICghdGhpcy5wcmV2aWV3SW1nKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgbmV3U2NhbGUgPSB0aGlzLm1hdGhBZGQodGhpcy5zY2FsZSwgZGVsdGEpO1xyXG5cclxuXHRcdC8vIOehruS/nee8qeaUvuavlOS+i+WcqOWQiOeQhuiMg+WbtOWGhe+8jOi2heWHuuiMg+WbtOaXtuiuvue9ruS4uui+ueeVjOWAvFxyXG5cdFx0aWYgKG5ld1NjYWxlIDwgdGhpcy5uY01pblNjYWxlKSB7XHJcblx0XHRcdHRoaXMuc2NhbGUgPSB0aGlzLm5jTWluU2NhbGU7XHJcblx0XHR9IGVsc2UgaWYgKG5ld1NjYWxlID4gdGhpcy5uY01heFNjYWxlKSB7XHJcblx0XHRcdHRoaXMuc2NhbGUgPSB0aGlzLm5jTWF4U2NhbGU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnNjYWxlID0gbmV3U2NhbGU7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy51cGRhdGVJbWFnZVRyYW5zZm9ybSgpO1xyXG5cdFx0dGhpcy51cGRhdGVab29tQnV0dG9uc1N0YXRlKCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHVwZGF0ZUltYWdlVHJhbnNmb3JtKCkge1xyXG5cdFx0aWYgKCF0aGlzLnByZXZpZXdJbWcpIHJldHVybjtcclxuXHJcblx0XHRjb25zdCB0cmFuc2Zvcm0gPSBgc2NhbGUzZCgke3RoaXMuc2NhbGV9LCAke3RoaXMuc2NhbGV9LCAxKSByb3RhdGUoJHt0aGlzLnJvdGF0aW9ufWRlZylgO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICd0cmFuc2Zvcm0nLCB0cmFuc2Zvcm0pO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSB1cGRhdGVab29tQnV0dG9uc1N0YXRlKCkge1xyXG5cdFx0aWYgKCF0aGlzLnpvb21JbkJ0biB8fCAhdGhpcy56b29tT3V0QnRuKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgaXNNaW5TY2FsZSA9IHRoaXMuc2NhbGUgPD0gdGhpcy5uY01pblNjYWxlO1xyXG5cdFx0Y29uc3QgaXNNYXhTY2FsZSA9IHRoaXMuc2NhbGUgPj0gdGhpcy5uY01heFNjYWxlO1xyXG5cclxuXHRcdC8vIOabtOaWsOaMiemSrueKtuaAgVxyXG5cdFx0dGhpcy5zZXRCdXR0b25EaXNhYmxlZCh0aGlzLnpvb21PdXRCdG4sIGlzTWluU2NhbGUpO1xyXG5cdFx0dGhpcy5zZXRCdXR0b25EaXNhYmxlZCh0aGlzLnpvb21JbkJ0biwgaXNNYXhTY2FsZSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHNldEJ1dHRvbkRpc2FibGVkKGJ1dHRvbjogSFRNTEVsZW1lbnQsIGRpc2FibGVkOiBib29sZWFuKSB7XHJcblx0XHRpZiAoZGlzYWJsZWQpIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdvcGFjaXR5JywgJzAuNCcpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoYnV0dG9uLCAnb3BhY2l0eScsICcxJyk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoYnV0dG9uLCAncG9pbnRlci1ldmVudHMnLCAnYXV0bycpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjbG9zZVByZXZpZXcoKSB7XHJcblx0XHRpZiAoIXRoaXMuaXNQcmV2aWV3T3BlbiB8fCAhdGhpcy5wcmV2aWV3Q29udGFpbmVyKSByZXR1cm47XHJcblxyXG5cdFx0Ly8g5riF55CG5LqL5Lu255uR5ZCs5ZmoXHJcblx0XHRpZiAodGhpcy5rZXlMaXN0ZW5lcikge1xyXG5cdFx0XHR0aGlzLmtleUxpc3RlbmVyKCk7XHJcblx0XHRcdHRoaXMua2V5TGlzdGVuZXIgPSBudWxsO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMud2hlZWxMaXN0ZW5lcikge1xyXG5cdFx0XHR0aGlzLndoZWVsTGlzdGVuZXIoKTtcclxuXHRcdFx0dGhpcy53aGVlbExpc3RlbmVyID0gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDnp7vpmaTlt6XlhbfmoI9cclxuXHRcdGlmICh0aGlzLnRvb2xiYXIpIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChkb2N1bWVudC5ib2R5LCB0aGlzLnRvb2xiYXIpO1xyXG5cdFx0XHR0aGlzLnRvb2xiYXIgPSBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIOa3u+WKoOWFs+mXreWKqOeUu1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdvcGFjaXR5JywgJzAnKTtcclxuXHRcdGlmICh0aGlzLnByZXZpZXdJbWcpIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdJbWcsICd0cmFuc2Zvcm0nLCAnc2NhbGUoMC44KScpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIOW7tui/n+enu+mZpOWFg+e0oOS7peWujOaIkOWKqOeUu1xyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLnByZXZpZXdDb250YWluZXIpIHtcclxuXHRcdFx0XHR0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIHRoaXMucHJldmlld0NvbnRhaW5lcik7XHJcblx0XHRcdFx0dGhpcy5wcmV2aWV3Q29udGFpbmVyID0gbnVsbDtcclxuXHRcdFx0XHR0aGlzLnByZXZpZXdJbWcgPSBudWxsO1xyXG5cdFx0XHRcdHRoaXMuem9vbUluQnRuID0gbnVsbDtcclxuXHRcdFx0XHR0aGlzLnpvb21PdXRCdG4gPSBudWxsO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmlzUHJldmlld09wZW4gPSBmYWxzZTtcclxuXHJcblx0XHRcdC8vIOaBouWkjemhtemdoua7muWKqOWSjOaWh+acrOmAieaLqVxyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKGRvY3VtZW50LmJvZHksICdvdmVyZmxvdycpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKGRvY3VtZW50LmJvZHksICd1c2VyLXNlbGVjdCcpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKGRvY3VtZW50LmJvZHksICctd2Via2l0LXVzZXItc2VsZWN0Jyk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUoZG9jdW1lbnQuYm9keSwgJy1tb3otdXNlci1zZWxlY3QnKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZShkb2N1bWVudC5ib2R5LCAnLW1zLXVzZXItc2VsZWN0Jyk7XHJcblx0XHR9LCAzMDApO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBtYXRoQWRkKHZhbHVlMTogbnVtYmVyLCB2YWx1ZTI6IG51bWJlcik6IG51bWJlciB7XHJcblx0XHQvLyDlsIbmta7ngrnmlbDovazmjaLkuLrlrZfnrKbkuLJcclxuXHRcdGxldCBhU3RyID0gdmFsdWUxLnRvU3RyaW5nKCk7XHJcblx0XHRsZXQgYlN0ciA9IHZhbHVlMi50b1N0cmluZygpO1xyXG5cclxuXHRcdC8vIOaJvuWIsOWwj+aVsOeCueWQjueahOS9jee9rlxyXG5cdFx0bGV0IGFEZWNpbWFscyA9IChhU3RyLnNwbGl0KCcuJylbMV0gfHwgJycpLmxlbmd0aDtcclxuXHRcdGxldCBiRGVjaW1hbHMgPSAoYlN0ci5zcGxpdCgnLicpWzFdIHx8ICcnKS5sZW5ndGg7XHJcblxyXG5cdFx0Ly8g5om+5Yiw5pyA5aSn55qE5bCP5pWw5L2N5pWwXHJcblx0XHRsZXQgbWF4RGVjaW1hbHMgPSBNYXRoLm1heChhRGVjaW1hbHMsIGJEZWNpbWFscyk7XHJcblxyXG5cdFx0Ly8g5bCG5rWu54K55pWw6L2s5o2i5Li65pW05pWwXHJcblx0XHRsZXQgYUludCA9IE1hdGgucm91bmQodmFsdWUxICogTWF0aC5wb3coMTAsIG1heERlY2ltYWxzKSk7XHJcblx0XHRsZXQgYkludCA9IE1hdGgucm91bmQodmFsdWUyICogTWF0aC5wb3coMTAsIG1heERlY2ltYWxzKSk7XHJcblxyXG5cdFx0Ly8g6L+b6KGM5pW05pWw5Yqg5rOVXHJcblx0XHRsZXQgcmVzdWx0SW50ID0gYUludCArIGJJbnQ7XHJcblxyXG5cdFx0Ly8g5bCG57uT5p6c6L2s5o2i5Zue5rWu54K55pWwXHJcblx0XHRyZXR1cm4gcmVzdWx0SW50IC8gTWF0aC5wb3coMTAsIG1heERlY2ltYWxzKTtcclxuXHR9XHJcbn0iXX0=