UNPKG

ng-cw-v12

Version:

Angular UI component library

381 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;
        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+WKoOaMiemSruS6i+S7tuebkeWQrOWZqFxyXG5cdFx0dGhpcy5yZW5kZXJlci5saXN0ZW4ocm90YXRlTGVmdEJ0biwgJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHR0aGlzLnJvdGF0ZUltYWdlKC05MCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlcmVyLmxpc3Rlbihyb3RhdGVSaWdodEJ0biwgJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHR0aGlzLnJvdGF0ZUltYWdlKDkwKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuem9vbUluQnRuLCAnY2xpY2snLCAoZXZlbnQpID0+IHtcclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdHRoaXMuc2NhbGVJbWFnZSh0aGlzLm5jU2NhbGVTdGVwKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuem9vbU91dEJ0biwgJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHR0aGlzLnNjYWxlSW1hZ2UoLXRoaXMubmNTY2FsZVN0ZXApO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlci5saXN0ZW4oY2xvc2VCdG4sICdjbGljaycsIChldmVudCkgPT4ge1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0dGhpcy5jbG9zZVByZXZpZXcoKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIOe7hOijheW3peWFt+adoVxyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnRvb2xiYXIsIHJvdGF0ZUxlZnRCdG4pO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnRvb2xiYXIsIHJvdGF0ZVJpZ2h0QnRuKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy50b29sYmFyLCB0aGlzLnpvb21PdXRCdG4pO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnRvb2xiYXIsIHRoaXMuem9vbUluQnRuKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy50b29sYmFyLCBjbG9zZUJ0bik7XHJcblxyXG5cdFx0Ly8g57uE6KOF6aKE6KeI5a655ZmoXHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMucHJldmlld0NvbnRhaW5lciwgdGhpcy5wcmV2aWV3SW1nKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgdGhpcy5wcmV2aWV3Q29udGFpbmVyKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgdGhpcy50b29sYmFyKTtcclxuXHJcblx0XHQvLyDmt7vliqDkuovku7bnm5HlkKzlmahcclxuXHRcdHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcblx0XHRcdGlmIChldmVudC50YXJnZXQgPT09IHRoaXMucHJldmlld0NvbnRhaW5lcikge1xyXG5cdFx0XHRcdHRoaXMuY2xvc2VQcmV2aWV3KCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIOa3u+WKoOm8oOagh+a7mui9ruS6i+S7tuebkeWQrOWZqO+8iOWmguaenOWQr+eUqOS6hua7mui9rue8qeaUvu+8iVxyXG5cdFx0aWYgKHRoaXMubmNXaGVlbFNjYWxlKSB7XHJcblx0XHRcdHRoaXMud2hlZWxMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMucHJldmlld0NvbnRhaW5lciwgJ3doZWVsJywgKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHQvLyDmoLnmja7mu5rova7mlrnlkJHlhrPlrprnvKnmlL7mlrnlkJFcclxuXHRcdFx0XHQvLyBkZWx0YVkgPiAwIOihqOekuuWQkeS4i+a7muWKqO+8iOe8qeWwj++8ie+8jGRlbHRhWSA8IDAg6KGo56S65ZCR5LiK5rua5Yqo77yI5pS+5aSn77yJXHJcblx0XHRcdFx0Y29uc3QgZGVsdGEgPSBldmVudC5kZWx0YVkgPiAwID8gLXRoaXMubmNTY2FsZVN0ZXAgOiB0aGlzLm5jU2NhbGVTdGVwO1xyXG5cdFx0XHRcdHRoaXMuc2NhbGVJbWFnZShkZWx0YSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIOa3u+WKoOmUruebmOS6i+S7tuebkeWQrOWZqFxyXG5cdFx0dGhpcy5rZXlMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICdrZXlkb3duJywgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcblx0XHRcdGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XHJcblx0XHRcdFx0dGhpcy5jbG9zZVByZXZpZXcoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8g56aB5q2i6aG16Z2i5rua5Yqo5ZKM5paH5pys6YCJ5oupXHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvY3VtZW50LmJvZHksICdvdmVyZmxvdycsICdoaWRkZW4nKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG9jdW1lbnQuYm9keSwgJ3VzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG9jdW1lbnQuYm9keSwgJy13ZWJraXQtdXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb2N1bWVudC5ib2R5LCAnLW1vei11c2VyLXNlbGVjdCcsICdub25lJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvY3VtZW50LmJvZHksICctbXMtdXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG5cclxuXHRcdC8vIOWKqOeUu+aViOaenFxyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLnByZXZpZXdDb250YWluZXIgJiYgdGhpcy5wcmV2aWV3SW1nKSB7XHJcblx0XHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdDb250YWluZXIsICdvcGFjaXR5JywgJzEnKTtcclxuXHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0ltZywgJ3RyYW5zZm9ybScsICdzY2FsZSgxKScpO1xyXG5cdFx0XHRcdC8vIOWIneWni+WMluaMiemSrueKtuaAgVxyXG5cdFx0XHRcdHRoaXMudXBkYXRlWm9vbUJ1dHRvbnNTdGF0ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAxMCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNyZWF0ZVRvb2xCdXR0b24odGV4dDogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xyXG5cdFx0Y29uc3QgYnV0dG9uID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnV0dG9uLCAnbmMtaW1nLXByZXZpZXctdG9vbGJhci1idXR0b24nKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoYnV0dG9uLCAnd2lkdGgnLCAnMzZweCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdoZWlnaHQnLCAnMzZweCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdiYWNrZ3JvdW5kLWNvbG9yJywgJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdib3JkZXItcmFkaXVzJywgJzZweCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdkaXNwbGF5JywgJ2ZsZXgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoYnV0dG9uLCAnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdhbGlnbi1pdGVtcycsICdjZW50ZXInKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoYnV0dG9uLCAnY3Vyc29yJywgJ3BvaW50ZXInKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoYnV0dG9uLCAndHJhbnNpdGlvbicsICdiYWNrZ3JvdW5kLWNvbG9yIDAuMnMgZWFzZSwgdHJhbnNmb3JtIDAuMXMgZWFzZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdmb250LXNpemUnLCAnMThweCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdjb2xvcicsICd3aGl0ZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdmb250LXdlaWdodCcsICdib2xkJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ3VzZXItc2VsZWN0JywgJ25vbmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGJ1dHRvbiwgJ3RpdGxlJywgdGl0bGUpO1xyXG5cclxuXHRcdC8vIOiuvue9ruaMiemSruWGheWuuVxyXG5cdFx0Y29uc3QgYnV0dG9uVGV4dCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dCh0ZXh0KTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoYnV0dG9uLCBidXR0b25UZXh0KTtcclxuXHJcblx0XHQvLyDmt7vliqDmgqzlgZzmlYjmnpxcclxuXHRcdHRoaXMucmVuZGVyZXIubGlzdGVuKGJ1dHRvbiwgJ21vdXNlZW50ZXInLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoYnV0dG9uLCAnYmFja2dyb3VuZC1jb2xvcicsICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiknKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICd0cmFuc2Zvcm0nLCAnc2NhbGUoMS4xKScpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlci5saXN0ZW4oYnV0dG9uLCAnbW91c2VsZWF2ZScsICgpID0+IHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdiYWNrZ3JvdW5kLWNvbG9yJywgJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKScpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ3RyYW5zZm9ybScsICdzY2FsZSgxKScpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8g5re75Yqg54K55Ye75pWI5p6cXHJcblx0XHR0aGlzLnJlbmRlcmVyLmxpc3RlbihidXR0b24sICdtb3VzZWRvd24nLCAoZXZlbnQpID0+IHtcclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICd0cmFuc2Zvcm0nLCAnc2NhbGUoMC45NSknKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyZXIubGlzdGVuKGJ1dHRvbiwgJ21vdXNldXAnLCAoZXZlbnQpID0+IHtcclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICd0cmFuc2Zvcm0nLCAnc2NhbGUoMS4xKScpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8g6Zi75q2i5paH5pys6YCJ5oup5byA5aeLXHJcblx0XHR0aGlzLnJlbmRlcmVyLmxpc3RlbihidXR0b24sICdzZWxlY3RzdGFydCcsIChldmVudCkgPT4ge1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8g6Zi75q2i5ouW5ou95byA5aeLXHJcblx0XHR0aGlzLnJlbmRlcmVyLmxpc3RlbihidXR0b24sICdkcmFnc3RhcnQnLCAoZXZlbnQpID0+IHtcclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHJldHVybiBidXR0b247XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHJvdGF0ZUltYWdlKGFuZ2xlOiBudW1iZXIpIHtcclxuXHRcdGlmICghdGhpcy5wcmV2aWV3SW1nKSByZXR1cm47XHJcblxyXG5cdFx0dGhpcy5yb3RhdGlvbiArPSBhbmdsZTtcclxuXHRcdHRoaXMudXBkYXRlSW1hZ2VUcmFuc2Zvcm0oKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc2NhbGVJbWFnZShkZWx0YTogbnVtYmVyKSB7XHJcblx0XHRpZiAoIXRoaXMucHJldmlld0ltZykgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IG5ld1NjYWxlID0gdGhpcy5tYXRoQWRkKHRoaXMuc2NhbGUsIGRlbHRhKTtcclxuXHJcblx0XHQvLyDnoa7kv53nvKnmlL7mr5TkvovlnKjlkIjnkIbojIPlm7TlhoXvvIzotoXlh7rojIPlm7Tml7borr7nva7kuLrovrnnlYzlgLxcclxuXHRcdGlmIChuZXdTY2FsZSA8IHRoaXMubmNNaW5TY2FsZSkge1xyXG5cdFx0XHR0aGlzLnNjYWxlID0gdGhpcy5uY01pblNjYWxlO1xyXG5cdFx0fSBlbHNlIGlmIChuZXdTY2FsZSA+IHRoaXMubmNNYXhTY2FsZSkge1xyXG5cdFx0XHR0aGlzLnNjYWxlID0gdGhpcy5uY01heFNjYWxlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zY2FsZSA9IG5ld1NjYWxlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudXBkYXRlSW1hZ2VUcmFuc2Zvcm0oKTtcclxuXHRcdHRoaXMudXBkYXRlWm9vbUJ1dHRvbnNTdGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSB1cGRhdGVJbWFnZVRyYW5zZm9ybSgpIHtcclxuXHRcdGlmICghdGhpcy5wcmV2aWV3SW1nKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgdHJhbnNmb3JtID0gYHNjYWxlM2QoJHt0aGlzLnNjYWxlfSwgJHt0aGlzLnNjYWxlfSwgMSkgcm90YXRlKCR7dGhpcy5yb3RhdGlvbn1kZWcpYDtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAndHJhbnNmb3JtJywgdHJhbnNmb3JtKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdXBkYXRlWm9vbUJ1dHRvbnNTdGF0ZSgpIHtcclxuXHRcdGlmICghdGhpcy56b29tSW5CdG4gfHwgIXRoaXMuem9vbU91dEJ0bikgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGlzTWluU2NhbGUgPSB0aGlzLnNjYWxlIDw9IHRoaXMubmNNaW5TY2FsZTtcclxuXHRcdGNvbnN0IGlzTWF4U2NhbGUgPSB0aGlzLnNjYWxlID49IHRoaXMubmNNYXhTY2FsZTtcclxuXHJcblx0XHQvLyDmm7TmlrDmjInpkq7nirbmgIFcclxuXHRcdHRoaXMuc2V0QnV0dG9uRGlzYWJsZWQodGhpcy56b29tT3V0QnRuLCBpc01pblNjYWxlKTtcclxuXHRcdHRoaXMuc2V0QnV0dG9uRGlzYWJsZWQodGhpcy56b29tSW5CdG4sIGlzTWF4U2NhbGUpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzZXRCdXR0b25EaXNhYmxlZChidXR0b246IEhUTUxFbGVtZW50LCBkaXNhYmxlZDogYm9vbGVhbikge1xyXG5cdFx0aWYgKGRpc2FibGVkKSB7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoYnV0dG9uLCAnb3BhY2l0eScsICcwLjQnKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShidXR0b24sICdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ29wYWNpdHknLCAnMScpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJ1dHRvbiwgJ3BvaW50ZXItZXZlbnRzJywgJ2F1dG8nKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2xvc2VQcmV2aWV3KCkge1xyXG5cdFx0aWYgKCF0aGlzLmlzUHJldmlld09wZW4gfHwgIXRoaXMucHJldmlld0NvbnRhaW5lcikgcmV0dXJuO1xyXG5cclxuXHRcdC8vIOa4heeQhuS6i+S7tuebkeWQrOWZqFxyXG5cdFx0aWYgKHRoaXMua2V5TGlzdGVuZXIpIHtcclxuXHRcdFx0dGhpcy5rZXlMaXN0ZW5lcigpO1xyXG5cdFx0XHR0aGlzLmtleUxpc3RlbmVyID0gbnVsbDtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLndoZWVsTGlzdGVuZXIpIHtcclxuXHRcdFx0dGhpcy53aGVlbExpc3RlbmVyKCk7XHJcblx0XHRcdHRoaXMud2hlZWxMaXN0ZW5lciA9IG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8g56e76Zmk5bel5YW35qCPXHJcblx0XHRpZiAodGhpcy50b29sYmFyKSB7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuYm9keSwgdGhpcy50b29sYmFyKTtcclxuXHRcdFx0dGhpcy50b29sYmFyID0gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDmt7vliqDlhbPpl63liqjnlLtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3Q29udGFpbmVyLCAnb3BhY2l0eScsICcwJyk7XHJcblx0XHRpZiAodGhpcy5wcmV2aWV3SW1nKSB7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3SW1nLCAndHJhbnNmb3JtJywgJ3NjYWxlKDAuOCknKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDlu7bov5/np7vpmaTlhYPntKDku6XlrozmiJDliqjnlLtcclxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRpZiAodGhpcy5wcmV2aWV3Q29udGFpbmVyKSB7XHJcblx0XHRcdFx0dGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChkb2N1bWVudC5ib2R5LCB0aGlzLnByZXZpZXdDb250YWluZXIpO1xyXG5cdFx0XHRcdHRoaXMucHJldmlld0NvbnRhaW5lciA9IG51bGw7XHJcblx0XHRcdFx0dGhpcy5wcmV2aWV3SW1nID0gbnVsbDtcclxuXHRcdFx0XHR0aGlzLnpvb21JbkJ0biA9IG51bGw7XHJcblx0XHRcdFx0dGhpcy56b29tT3V0QnRuID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5pc1ByZXZpZXdPcGVuID0gZmFsc2U7XHJcblxyXG5cdFx0XHQvLyDmgaLlpI3pobXpnaLmu5rliqjlkozmlofmnKzpgInmi6lcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZShkb2N1bWVudC5ib2R5LCAnb3ZlcmZsb3cnKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZShkb2N1bWVudC5ib2R5LCAndXNlci1zZWxlY3QnKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZShkb2N1bWVudC5ib2R5LCAnLXdlYmtpdC11c2VyLXNlbGVjdCcpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKGRvY3VtZW50LmJvZHksICctbW96LXVzZXItc2VsZWN0Jyk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUoZG9jdW1lbnQuYm9keSwgJy1tcy11c2VyLXNlbGVjdCcpO1xyXG5cdFx0fSwgMzAwKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgbWF0aEFkZCh2YWx1ZTE6IG51bWJlciwgdmFsdWUyOiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0Ly8g5bCG5rWu54K55pWw6L2s5o2i5Li65a2X56ym5LiyXHJcblx0XHRsZXQgYVN0ciA9IHZhbHVlMS50b1N0cmluZygpO1xyXG5cdFx0bGV0IGJTdHIgPSB2YWx1ZTIudG9TdHJpbmcoKTtcclxuXHJcblx0XHQvLyDmib7liLDlsI/mlbDngrnlkI7nmoTkvY3nva5cclxuXHRcdGxldCBhRGVjaW1hbHMgPSAoYVN0ci5zcGxpdCgnLicpWzFdIHx8ICcnKS5sZW5ndGg7XHJcblx0XHRsZXQgYkRlY2ltYWxzID0gKGJTdHIuc3BsaXQoJy4nKVsxXSB8fCAnJykubGVuZ3RoO1xyXG5cclxuXHRcdC8vIOaJvuWIsOacgOWkp+eahOWwj+aVsOS9jeaVsFxyXG5cdFx0bGV0IG1heERlY2ltYWxzID0gTWF0aC5tYXgoYURlY2ltYWxzLCBiRGVjaW1hbHMpO1xyXG5cclxuXHRcdC8vIOWwhua1rueCueaVsOi9rOaNouS4uuaVtOaVsFxyXG5cdFx0bGV0IGFJbnQgPSBNYXRoLnJvdW5kKHZhbHVlMSAqIE1hdGgucG93KDEwLCBtYXhEZWNpbWFscykpO1xyXG5cdFx0bGV0IGJJbnQgPSBNYXRoLnJvdW5kKHZhbHVlMiAqIE1hdGgucG93KDEwLCBtYXhEZWNpbWFscykpO1xyXG5cclxuXHRcdC8vIOi/m+ihjOaVtOaVsOWKoOazlVxyXG5cdFx0bGV0IHJlc3VsdEludCA9IGFJbnQgKyBiSW50O1xyXG5cclxuXHRcdC8vIOWwhue7k+aenOi9rOaNouWbnua1rueCueaVsFxyXG5cdFx0cmV0dXJuIHJlc3VsdEludCAvIE1hdGgucG93KDEwLCBtYXhEZWNpbWFscyk7XHJcblx0fVxyXG59Il19