UNPKG

ng-cw-v12

Version:

Angular UI component library

166 lines 30.9 kB
import { Directive, Input } from '@angular/core'; import * as i0 from "@angular/core"; export class SpinDirective { constructor(el, renderer) { this.el = el; this.renderer = renderer; this.ncType = 'dot'; // 加载样式类型:圆形或点状 this.ncTip = ''; this.ncSize = 'default'; this.ncMaskColor = 'rgba(0, 0, 0, 0.1)'; this.ncTipColor = '#1890ff'; this.ncTrackColor = '#f3f3f3'; // 轨道颜色 this.ncIndicatorColor = '#1890ff'; // 指示器颜色 // 为每个实例生成唯一的动画名称 this.animationName = `ncSpin_${Math.random().toString(36).substr(2, 9)}`; } set ncLoading(value) { setTimeout(() => { if (value) { this.createSpinContainer(); } else { this.removeSpinContainer(); } }); } ngOnInit() { } createSpinContainer() { const elementPosition = this.el.nativeElement.style.position; if (!elementPosition || elementPosition === 'static') { this.renderer.setStyle(this.el.nativeElement, 'position', 'relative'); } // 创建一个div,用于包裹加载指示器和文字 this.spinContainer = this.renderer.createElement('div'); this.renderer.addClass(this.spinContainer, 'spin-container'); this.renderer.setStyle(this.spinContainer, 'position', 'absolute'); this.renderer.setStyle(this.spinContainer, 'inset', '0'); this.renderer.setStyle(this.spinContainer, 'borderRadius', 'inherit'); this.renderer.setStyle(this.spinContainer, 'zIndex', '10001'); this.renderer.setStyle(this.spinContainer, 'background-color', this.ncMaskColor); this.renderer.setStyle(this.spinContainer, 'display', 'flex'); this.renderer.setStyle(this.spinContainer, 'flex-direction', 'column'); this.renderer.setStyle(this.spinContainer, 'justify-content', 'center'); this.renderer.setStyle(this.spinContainer, 'align-items', 'center'); // 根据类型创建不同的加载指示器 if (this.ncType === 'circle') { this.createCircleSpinner(); } else if (this.ncType === 'dot') { this.createDotSpinner(); } // 创建一个div,用于显示文字 const loadingText = this.renderer.createElement('div'); this.renderer.addClass(loadingText, 'spin-text'); this.renderer.setStyle(loadingText, 'color', this.ncTipColor); this.renderer.setStyle(loadingText, 'margin-top', `${this.ncSize === 'small' ? '5px' : this.ncSize === 'default' ? '10px' : '15px'}`); this.renderer.setStyle(loadingText, 'font-size', `${this.ncSize === 'small' ? '12px' : this.ncSize === 'default' ? '16px' : '20px'}`); this.renderer.setStyle(loadingText, 'letter-spacing', `${this.ncSize === 'small' ? '0.5px' : this.ncSize === 'default' ? '1px' : '2px'}`); this.renderer.appendChild(loadingText, this.renderer.createText(this.ncTip)); // 如果存在文字,则添加到容器中 if (this.ncTip) { this.renderer.appendChild(this.spinContainer, loadingText); } // 将容器添加到元素中 this.renderer.appendChild(this.el.nativeElement, this.spinContainer); } createCircleSpinner() { const spinner = this.renderer.createElement('div'); this.renderer.addClass(spinner, 'spin-spinner'); this.renderer.setStyle(spinner, 'border', `${this.ncSize === 'small' ? '2px' : this.ncSize === 'default' ? '4px' : '6px'} solid ${this.ncTrackColor}`); this.renderer.setStyle(spinner, 'border-top', `${this.ncSize === 'small' ? '2px' : this.ncSize === 'default' ? '4px' : '6px'} solid ${this.ncIndicatorColor}`); this.renderer.setStyle(spinner, 'border-radius', '50%'); this.renderer.setStyle(spinner, 'width', `${this.ncSize === 'small' ? '20px' : this.ncSize === 'default' ? '40px' : '60px'}`); this.renderer.setStyle(spinner, 'height', `${this.ncSize === 'small' ? '20px' : this.ncSize === 'default' ? '40px' : '60px'}`); this.renderer.setStyle(spinner, 'animation', `${this.animationName} 1s linear infinite`); const keyframes = ` @keyframes ${this.animationName} { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } `; this.keyframesStyle = this.renderer.createElement('style'); this.renderer.appendChild(this.keyframesStyle, this.renderer.createText(keyframes)); this.renderer.appendChild(this.el.nativeElement, this.keyframesStyle); this.renderer.appendChild(this.spinContainer, spinner); } createDotSpinner() { const dotSize = this.ncSize === 'small' ? 6 : this.ncSize === 'default' ? 10 : 14; const containerSize = this.ncSize === 'small' ? 20 : this.ncSize === 'default' ? 40 : 60; const dotContainer = this.renderer.createElement('div'); this.renderer.addClass(dotContainer, 'dot-spinner-container'); this.renderer.setStyle(dotContainer, 'position', 'relative'); this.renderer.setStyle(dotContainer, 'width', `${containerSize}px`); this.renderer.setStyle(dotContainer, 'height', `${containerSize}px`); this.renderer.setStyle(dotContainer, 'animation', `${this.animationName}_rotate 1.2s infinite linear`); // 创建4个点 for (let i = 0; i < 4; i++) { const dot = this.renderer.createElement('div'); this.renderer.addClass(dot, 'dot-spinner-item'); this.renderer.setStyle(dot, 'position', 'absolute'); this.renderer.setStyle(dot, 'width', `${dotSize}px`); this.renderer.setStyle(dot, 'height', `${dotSize}px`); this.renderer.setStyle(dot, 'background-color', this.ncIndicatorColor); this.renderer.setStyle(dot, 'border-radius', '50%'); this.renderer.setStyle(dot, 'opacity', '0.3'); this.renderer.setStyle(dot, 'animation', `${this.animationName}_move 1s infinite linear alternate`); this.renderer.setStyle(dot, 'animation-delay', `${i * 0.4}s`); // 设置点的位置 const angle = i * 90; // 每个点相差90度 const radian = (angle * Math.PI) / 180; const radius = containerSize / 2 - dotSize / 2; const x = radius * Math.cos(radian); const y = radius * Math.sin(radian); this.renderer.setStyle(dot, 'top', `${containerSize / 2 - dotSize / 2 + y}px`); this.renderer.setStyle(dot, 'left', `${containerSize / 2 - dotSize / 2 + x}px`); this.renderer.appendChild(dotContainer, dot); } const keyframes = ` @keyframes ${this.animationName}_rotate { to { transform: rotate(360deg); } } @keyframes ${this.animationName}_move { to { opacity: 1; } } `; this.keyframesStyle = this.renderer.createElement('style'); this.renderer.appendChild(this.keyframesStyle, this.renderer.createText(keyframes)); this.renderer.appendChild(this.el.nativeElement, this.keyframesStyle); this.renderer.appendChild(this.spinContainer, dotContainer); } removeSpinContainer() { if (this.spinContainer) { this.renderer.removeChild(this.el.nativeElement, this.spinContainer); this.spinContainer = null; } if (this.keyframesStyle) { this.renderer.removeChild(this.el.nativeElement, this.keyframesStyle); this.keyframesStyle = null; } } } SpinDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SpinDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); SpinDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: SpinDirective, selector: "[ncSpin]", inputs: { ncLoading: "ncLoading", ncType: "ncType", ncTip: "ncTip", ncSize: "ncSize", ncMaskColor: "ncMaskColor", ncTipColor: "ncTipColor", ncTrackColor: "ncTrackColor", ncIndicatorColor: "ncIndicatorColor" }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SpinDirective, decorators: [{ type: Directive, args: [{ selector: '[ncSpin]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncLoading: [{ type: Input }], ncType: [{ type: Input }], ncTip: [{ type: Input }], ncSize: [{ type: Input }], ncMaskColor: [{ type: Input }], ncTipColor: [{ type: Input }], ncTrackColor: [{ type: Input }], ncIndicatorColor: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NwaW4vc3Bpbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOztBQUtoRixNQUFNLE9BQU8sYUFBYTtJQXFCekIsWUFBb0IsRUFBYyxFQUFVLFFBQW1CO1FBQTNDLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBWHRELFdBQU0sR0FBcUIsS0FBSyxDQUFDLENBQUMsZUFBZTtRQUNqRCxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ25CLFdBQU0sR0FBa0MsU0FBUyxDQUFDO1FBQ2xELGdCQUFXLEdBQVcsb0JBQW9CLENBQUM7UUFDM0MsZUFBVSxHQUFXLFNBQVMsQ0FBQztRQUMvQixpQkFBWSxHQUFXLFNBQVMsQ0FBQyxDQUFBLE9BQU87UUFDeEMscUJBQWdCLEdBQVcsU0FBUyxDQUFDLENBQUEsUUFBUTtRQU1yRCxpQkFBaUI7UUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFFLENBQUM7SUF2QkQsSUFBYSxTQUFTLENBQUMsS0FBYztRQUNwQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2YsSUFBSSxLQUFLLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDM0I7aUJBQU07Z0JBQ04sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDM0I7UUFDRixDQUFDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFpQkQsUUFBUSxLQUFLLENBQUM7SUFFTixtQkFBbUI7UUFDMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUM3RCxJQUFJLENBQUMsZUFBZSxJQUFJLGVBQWUsS0FBSyxRQUFRLEVBQUU7WUFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVwRSxpQkFBaUI7UUFDakIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRTtZQUM3QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUMzQjthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUU7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDeEI7UUFFRCxpQkFBaUI7UUFDakIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDMUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRTdFLGlCQUFpQjtRQUNqQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQzNEO1FBRUQsWUFBWTtRQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU8sbUJBQW1CO1FBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZKLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUMvSixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzlILElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9ILElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxxQkFBcUIsQ0FBQyxDQUFDO1FBRXpGLE1BQU0sU0FBUyxHQUFHO3lCQUNLLElBQUksQ0FBQyxhQUFhOzs7O1NBSWxDLENBQUM7UUFDUixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFdEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFekYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLEdBQUcsYUFBYSxJQUFJLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLEdBQUcsYUFBYSxJQUFJLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsOEJBQThCLENBQUMsQ0FBQztRQUV2RyxRQUFRO1FBQ1IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLG9DQUFvQyxDQUFDLENBQUM7WUFDcEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFFOUQsU0FBUztZQUNULE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxXQUFXO1lBQ2pDLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDdkMsTUFBTSxNQUFNLEdBQUcsYUFBYSxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXBDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxhQUFhLEdBQUcsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsYUFBYSxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFaEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzdDO1FBRUQsTUFBTSxTQUFTLEdBQUc7Z0JBQ0osSUFBSSxDQUFDLGFBQWE7OztnQkFHbEIsSUFBSSxDQUFDLGFBQWE7OztHQUcvQixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXRFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLG1CQUFtQjtRQUMxQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSyxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUssQ0FBQztTQUM1QjtJQUNGLENBQUM7OzBHQTdKVyxhQUFhOzhGQUFiLGFBQWE7MkZBQWIsYUFBYTtrQkFIekIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsVUFBVTtpQkFDcEI7eUhBRWEsU0FBUztzQkFBckIsS0FBSztnQkFTRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcblx0c2VsZWN0b3I6ICdbbmNTcGluXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNwaW5EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cdEBJbnB1dCgpIHNldCBuY0xvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcclxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRpZiAodmFsdWUpIHtcclxuXHRcdFx0XHR0aGlzLmNyZWF0ZVNwaW5Db250YWluZXIoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnJlbW92ZVNwaW5Db250YWluZXIoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSlcclxuXHR9XHJcblx0QElucHV0KCkgbmNUeXBlOiAnY2lyY2xlJyB8ICdkb3QnID0gJ2RvdCc7IC8vIOWKoOi9veagt+W8j+exu+Wei++8muWchuW9ouaIlueCueeKtlxyXG5cdEBJbnB1dCgpIG5jVGlwOiBzdHJpbmcgPSAnJztcclxuXHRASW5wdXQoKSBuY1NpemU6ICdzbWFsbCcgfCAnZGVmYXVsdCcgfCAnbGFyZ2UnID0gJ2RlZmF1bHQnO1xyXG5cdEBJbnB1dCgpIG5jTWFza0NvbG9yOiBzdHJpbmcgPSAncmdiYSgwLCAwLCAwLCAwLjEpJztcclxuXHRASW5wdXQoKSBuY1RpcENvbG9yOiBzdHJpbmcgPSAnIzE4OTBmZic7XHJcblx0QElucHV0KCkgbmNUcmFja0NvbG9yOiBzdHJpbmcgPSAnI2YzZjNmMyc7Ly8g6L2o6YGT6aKc6ImyXHJcblx0QElucHV0KCkgbmNJbmRpY2F0b3JDb2xvcjogc3RyaW5nID0gJyMxODkwZmYnOy8vIOaMh+ekuuWZqOminOiJslxyXG5cdHByaXZhdGUgc3BpbkNvbnRhaW5lciE6IEhUTUxFbGVtZW50O1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgYW5pbWF0aW9uTmFtZTogc3RyaW5nO1xyXG5cdHByaXZhdGUga2V5ZnJhbWVzU3R5bGUhOiBIVE1MRWxlbWVudDtcclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XHJcblx0XHQvLyDkuLrmr4/kuKrlrp7kvovnlJ/miJDllK/kuIDnmoTliqjnlLvlkI3np7BcclxuXHRcdHRoaXMuYW5pbWF0aW9uTmFtZSA9IGBuY1NwaW5fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDtcclxuXHR9XHJcblxyXG5cdG5nT25Jbml0KCkgeyB9XHJcblxyXG5cdHByaXZhdGUgY3JlYXRlU3BpbkNvbnRhaW5lcigpIHtcclxuXHRcdGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbjtcclxuXHRcdGlmICghZWxlbWVudFBvc2l0aW9uIHx8IGVsZW1lbnRQb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIOWIm+W7uuS4gOS4qmRpdu+8jOeUqOS6juWMheijueWKoOi9veaMh+ekuuWZqOWSjOaWh+Wtl1xyXG5cdFx0dGhpcy5zcGluQ29udGFpbmVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5zcGluQ29udGFpbmVyLCAnc3Bpbi1jb250YWluZXInKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zcGluQ29udGFpbmVyLCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zcGluQ29udGFpbmVyLCAnaW5zZXQnLCAnMCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNwaW5Db250YWluZXIsICdib3JkZXJSYWRpdXMnLCAnaW5oZXJpdCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNwaW5Db250YWluZXIsICd6SW5kZXgnLCAnMTAwMDEnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zcGluQ29udGFpbmVyLCAnYmFja2dyb3VuZC1jb2xvcicsIHRoaXMubmNNYXNrQ29sb3IpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNwaW5Db250YWluZXIsICdkaXNwbGF5JywgJ2ZsZXgnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zcGluQ29udGFpbmVyLCAnZmxleC1kaXJlY3Rpb24nLCAnY29sdW1uJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc3BpbkNvbnRhaW5lciwgJ2p1c3RpZnktY29udGVudCcsICdjZW50ZXInKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zcGluQ29udGFpbmVyLCAnYWxpZ24taXRlbXMnLCAnY2VudGVyJyk7XHJcblxyXG5cdFx0Ly8g5qC55o2u57G75Z6L5Yib5bu65LiN5ZCM55qE5Yqg6L295oyH56S65ZmoXHJcblx0XHRpZiAodGhpcy5uY1R5cGUgPT09ICdjaXJjbGUnKSB7XHJcblx0XHRcdHRoaXMuY3JlYXRlQ2lyY2xlU3Bpbm5lcigpO1xyXG5cdFx0fSBlbHNlIGlmICh0aGlzLm5jVHlwZSA9PT0gJ2RvdCcpIHtcclxuXHRcdFx0dGhpcy5jcmVhdGVEb3RTcGlubmVyKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8g5Yib5bu65LiA5LiqZGl277yM55So5LqO5pi+56S65paH5a2XXHJcblx0XHRjb25zdCBsb2FkaW5nVGV4dCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGxvYWRpbmdUZXh0LCAnc3Bpbi10ZXh0Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGxvYWRpbmdUZXh0LCAnY29sb3InLCB0aGlzLm5jVGlwQ29sb3IpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShsb2FkaW5nVGV4dCwgJ21hcmdpbi10b3AnLCBgJHt0aGlzLm5jU2l6ZSA9PT0gJ3NtYWxsJyA/ICc1cHgnIDogdGhpcy5uY1NpemUgPT09ICdkZWZhdWx0JyA/ICcxMHB4JyA6ICcxNXB4J31gKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobG9hZGluZ1RleHQsICdmb250LXNpemUnLCBgJHt0aGlzLm5jU2l6ZSA9PT0gJ3NtYWxsJyA/ICcxMnB4JyA6IHRoaXMubmNTaXplID09PSAnZGVmYXVsdCcgPyAnMTZweCcgOiAnMjBweCd9YCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGxvYWRpbmdUZXh0LCAnbGV0dGVyLXNwYWNpbmcnLCBgJHt0aGlzLm5jU2l6ZSA9PT0gJ3NtYWxsJyA/ICcwLjVweCcgOiB0aGlzLm5jU2l6ZSA9PT0gJ2RlZmF1bHQnID8gJzFweCcgOiAnMnB4J31gKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQobG9hZGluZ1RleHQsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dCh0aGlzLm5jVGlwKSk7XHJcblxyXG5cdFx0Ly8g5aaC5p6c5a2Y5Zyo5paH5a2X77yM5YiZ5re75Yqg5Yiw5a655Zmo5LitXHJcblx0XHRpZiAodGhpcy5uY1RpcCkge1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuc3BpbkNvbnRhaW5lciwgbG9hZGluZ1RleHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIOWwhuWuueWZqOa3u+WKoOWIsOWFg+e0oOS4rVxyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuc3BpbkNvbnRhaW5lcik7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNyZWF0ZUNpcmNsZVNwaW5uZXIoKSB7XHJcblx0XHRjb25zdCBzcGlubmVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYWRkQ2xhc3Moc3Bpbm5lciwgJ3NwaW4tc3Bpbm5lcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShzcGlubmVyLCAnYm9yZGVyJywgYCR7dGhpcy5uY1NpemUgPT09ICdzbWFsbCcgPyAnMnB4JyA6IHRoaXMubmNTaXplID09PSAnZGVmYXVsdCcgPyAnNHB4JyA6ICc2cHgnfSBzb2xpZCAke3RoaXMubmNUcmFja0NvbG9yfWApO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShzcGlubmVyLCAnYm9yZGVyLXRvcCcsIGAke3RoaXMubmNTaXplID09PSAnc21hbGwnID8gJzJweCcgOiB0aGlzLm5jU2l6ZSA9PT0gJ2RlZmF1bHQnID8gJzRweCcgOiAnNnB4J30gc29saWQgJHt0aGlzLm5jSW5kaWNhdG9yQ29sb3J9YCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHNwaW5uZXIsICdib3JkZXItcmFkaXVzJywgJzUwJScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShzcGlubmVyLCAnd2lkdGgnLCBgJHt0aGlzLm5jU2l6ZSA9PT0gJ3NtYWxsJyA/ICcyMHB4JyA6IHRoaXMubmNTaXplID09PSAnZGVmYXVsdCcgPyAnNDBweCcgOiAnNjBweCd9YCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHNwaW5uZXIsICdoZWlnaHQnLCBgJHt0aGlzLm5jU2l6ZSA9PT0gJ3NtYWxsJyA/ICcyMHB4JyA6IHRoaXMubmNTaXplID09PSAnZGVmYXVsdCcgPyAnNDBweCcgOiAnNjBweCd9YCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHNwaW5uZXIsICdhbmltYXRpb24nLCBgJHt0aGlzLmFuaW1hdGlvbk5hbWV9IDFzIGxpbmVhciBpbmZpbml0ZWApO1xyXG5cclxuXHRcdGNvbnN0IGtleWZyYW1lcyA9IGBcclxuICAgICAgICAgICAgQGtleWZyYW1lcyAke3RoaXMuYW5pbWF0aW9uTmFtZX0ge1xyXG4gICAgICAgICAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxyXG4gICAgICAgICAgICAgICAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIGA7XHJcblx0XHR0aGlzLmtleWZyYW1lc1N0eWxlID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmtleWZyYW1lc1N0eWxlLCB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoa2V5ZnJhbWVzKSk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5rZXlmcmFtZXNTdHlsZSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnNwaW5Db250YWluZXIsIHNwaW5uZXIpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjcmVhdGVEb3RTcGlubmVyKCkge1xyXG5cdFx0Y29uc3QgZG90U2l6ZSA9IHRoaXMubmNTaXplID09PSAnc21hbGwnID8gNiA6IHRoaXMubmNTaXplID09PSAnZGVmYXVsdCcgPyAxMCA6IDE0O1xyXG5cdFx0Y29uc3QgY29udGFpbmVyU2l6ZSA9IHRoaXMubmNTaXplID09PSAnc21hbGwnID8gMjAgOiB0aGlzLm5jU2l6ZSA9PT0gJ2RlZmF1bHQnID8gNDAgOiA2MDtcclxuXHJcblx0XHRjb25zdCBkb3RDb250YWluZXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hZGRDbGFzcyhkb3RDb250YWluZXIsICdkb3Qtc3Bpbm5lci1jb250YWluZXInKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90Q29udGFpbmVyLCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90Q29udGFpbmVyLCAnd2lkdGgnLCBgJHtjb250YWluZXJTaXplfXB4YCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdENvbnRhaW5lciwgJ2hlaWdodCcsIGAke2NvbnRhaW5lclNpemV9cHhgKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90Q29udGFpbmVyLCAnYW5pbWF0aW9uJywgYCR7dGhpcy5hbmltYXRpb25OYW1lfV9yb3RhdGUgMS4ycyBpbmZpbml0ZSBsaW5lYXJgKTtcclxuXHJcblx0XHQvLyDliJvlu7o05Liq54K5XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xyXG5cdFx0XHRjb25zdCBkb3QgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRvdCwgJ2RvdC1zcGlubmVyLWl0ZW0nKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3QsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdCwgJ3dpZHRoJywgYCR7ZG90U2l6ZX1weGApO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdCwgJ2hlaWdodCcsIGAke2RvdFNpemV9cHhgKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3QsICdiYWNrZ3JvdW5kLWNvbG9yJywgdGhpcy5uY0luZGljYXRvckNvbG9yKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3QsICdib3JkZXItcmFkaXVzJywgJzUwJScpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdCwgJ29wYWNpdHknLCAnMC4zJyk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90LCAnYW5pbWF0aW9uJywgYCR7dGhpcy5hbmltYXRpb25OYW1lfV9tb3ZlIDFzIGluZmluaXRlIGxpbmVhciBhbHRlcm5hdGVgKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3QsICdhbmltYXRpb24tZGVsYXknLCBgJHtpICogMC40fXNgKTtcclxuXHJcblx0XHRcdC8vIOiuvue9rueCueeahOS9jee9rlxyXG5cdFx0XHRjb25zdCBhbmdsZSA9IGkgKiA5MDsgLy8g5q+P5Liq54K555u45beuOTDluqZcclxuXHRcdFx0Y29uc3QgcmFkaWFuID0gKGFuZ2xlICogTWF0aC5QSSkgLyAxODA7XHJcblx0XHRcdGNvbnN0IHJhZGl1cyA9IGNvbnRhaW5lclNpemUgLyAyIC0gZG90U2l6ZSAvIDI7XHJcblx0XHRcdGNvbnN0IHggPSByYWRpdXMgKiBNYXRoLmNvcyhyYWRpYW4pO1xyXG5cdFx0XHRjb25zdCB5ID0gcmFkaXVzICogTWF0aC5zaW4ocmFkaWFuKTtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90LCAndG9wJywgYCR7Y29udGFpbmVyU2l6ZSAvIDIgLSBkb3RTaXplIC8gMiArIHl9cHhgKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3QsICdsZWZ0JywgYCR7Y29udGFpbmVyU2l6ZSAvIDIgLSBkb3RTaXplIC8gMiArIHh9cHhgKTtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG90Q29udGFpbmVyLCBkb3QpO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRjb25zdCBrZXlmcmFtZXMgPSBgXHJcblx0XHRcdEBrZXlmcmFtZXMgJHt0aGlzLmFuaW1hdGlvbk5hbWV9X3JvdGF0ZSB7XHJcblx0XHRcdFx0dG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XHJcblx0XHRcdH1cclxuXHRcdFx0QGtleWZyYW1lcyAke3RoaXMuYW5pbWF0aW9uTmFtZX1fbW92ZSB7XHJcblx0XHRcdFx0dG8geyBvcGFjaXR5OiAxOyB9XHJcblx0XHRcdH1cclxuXHRcdGA7XHJcblxyXG5cdFx0dGhpcy5rZXlmcmFtZXNTdHlsZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5rZXlmcmFtZXNTdHlsZSwgdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KGtleWZyYW1lcykpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMua2V5ZnJhbWVzU3R5bGUpO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5zcGluQ29udGFpbmVyLCBkb3RDb250YWluZXIpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSByZW1vdmVTcGluQ29udGFpbmVyKCkge1xyXG5cdFx0aWYgKHRoaXMuc3BpbkNvbnRhaW5lcikge1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5zcGluQ29udGFpbmVyKTtcclxuXHRcdFx0dGhpcy5zcGluQ29udGFpbmVyID0gbnVsbCE7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5rZXlmcmFtZXNTdHlsZSkge1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5rZXlmcmFtZXNTdHlsZSk7XHJcblx0XHRcdHRoaXMua2V5ZnJhbWVzU3R5bGUgPSBudWxsITtcclxuXHRcdH1cclxuXHR9XHJcbn0iXX0=