UNPKG

ng-cw-v12

Version:

Angular UI component library

247 lines (246 loc) 36.1 kB
import { Directive, Input } from '@angular/core'; import * as i0 from "@angular/core"; export class RibbonDirective { constructor(el, renderer) { this.el = el; this.renderer = renderer; this.ncContent = ''; this.ncContentColor = '#fff'; this.ncSize = 0.3; // 修改为百分比值,默认为容器宽高较小值的30% this.ncRibbonColor = '#ff6547'; this.ncPosition = 'top-left'; // 生成唯一ID this.uniqueId = `ribbon_${Math.random().toString(36).substr(2, 9)}`; } ngOnInit() { this.createRibbonContainer(); } createRibbonContainer() { const elementPosition = this.el.nativeElement.style.position; if (!elementPosition || elementPosition === 'static') { this.renderer.setStyle(this.el.nativeElement, 'position', 'relative'); } // 创建丝带容器 this.ribbonContainer = this.renderer.createElement('div'); this.renderer.addClass(this.ribbonContainer, this.uniqueId); this.renderer.setStyle(this.ribbonContainer, 'position', 'absolute'); this.renderer.setStyle(this.ribbonContainer, 'overflow', 'hidden'); this.renderer.setStyle(this.ribbonContainer, 'display', 'flex'); this.renderer.setStyle(this.ribbonContainer, 'justify-content', 'center'); this.renderer.setStyle(this.ribbonContainer, 'align-items', 'center'); // 添加到DOM this.renderer.appendChild(this.el.nativeElement, this.ribbonContainer); // 初始渲染 this.updateRibbonSize(); // 使用MutationObserver监听父容器尺寸变化 this.observeParentSize(); } updateRibbonSize() { // 获取父容器的尺寸 const parentWidth = this.el.nativeElement.offsetWidth; const parentHeight = this.el.nativeElement.offsetHeight; // 如果父容器尺寸为0,延迟重试 if (parentWidth === 0 || parentHeight === 0) { setTimeout(() => this.updateRibbonSize(), 100); return; } this.ribbonSize = Math.min(parentWidth, parentHeight) * this.ncSize; // 更新丝带容器尺寸 this.renderer.setStyle(this.ribbonContainer, 'width', `${this.ribbonSize}px`); this.renderer.setStyle(this.ribbonContainer, 'height', `${this.ribbonSize}px`); // 更新位置 const offset = -(this.ribbonSize * 0.06); switch (this.ncPosition) { case 'top-right': this.renderer.setStyle(this.ribbonContainer, 'top', `${offset}px`); this.renderer.setStyle(this.ribbonContainer, 'right', `${offset}px`); break; case 'bottom-left': this.renderer.setStyle(this.ribbonContainer, 'bottom', `${offset}px`); this.renderer.setStyle(this.ribbonContainer, 'left', `${offset}px`); break; case 'bottom-right': this.renderer.setStyle(this.ribbonContainer, 'bottom', `${offset}px`); this.renderer.setStyle(this.ribbonContainer, 'right', `${offset}px`); break; default: //top-left this.renderer.setStyle(this.ribbonContainer, 'top', `${offset}px`); this.renderer.setStyle(this.ribbonContainer, 'left', `${offset}px`); break; } // 更新CSS样式 this.updateRibbonStyles(); } updateRibbonStyles() { // 根据输入的颜色计算渐变色 const mainColor = this.ncRibbonColor; const lighterColor = this.adjustColor(this.ncRibbonColor, 45); const darkerColor = this.adjustColor(this.ncRibbonColor, -10); const cssText = ` .${this.uniqueId}::before { content: '${this.ncContent}'; position: absolute; width: 150%; height: ${this.ribbonSize * 0.3}px; background: linear-gradient(45deg, ${mainColor} 0%, ${lighterColor} 51%, ${darkerColor} 100%); transform: rotate(${this.getRotationDegree()}) translateY(${-this.ribbonSize * 0.16}px) ${this.getTextRotation()}; display: flex; align-items: center; justify-content: center; color: ${this.ncContentColor}; font-weight: 600; font-size: ${Math.ceil(this.ribbonSize * 0.18)}px; letter-spacing: 0.1em; box-shadow: ${this.getRibbonShadow()}; } .${this.uniqueId}::after { content: ''; position: absolute; width: ${this.ribbonSize * 0.1}px; height: ${this.ribbonSize * 0.1}px; z-index: -1; ${this.getShadowPosition()} background: linear-gradient(45deg, ${mainColor} 0%, ${lighterColor} 51%, ${mainColor} 100%); } `; // 移除旧样式(如果存在) const oldStyle = document.querySelector(`style[data-ribbon-id="${this.uniqueId}"]`); if (oldStyle) { oldStyle.remove(); } // 添加新样式 const styleElement = this.renderer.createElement('style'); this.renderer.setAttribute(styleElement, 'data-ribbon-id', this.uniqueId); this.renderer.appendChild(styleElement, this.renderer.createText(cssText)); this.renderer.appendChild(document.head, styleElement); } // 添加颜色调整方法 adjustColor(color, percent) { // 确保颜色值格式统一,移除可能存在的 # 号 const hex = color.replace(/^#/, ''); // 验证颜色值格式(6位或8位) if (!/^[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$/.test(hex)) { console.warn('Invalid color format. Using default color.'); return '#ff6547'; } // 分离颜色值和透明度 const colorHex = hex.slice(0, 6); const alpha = hex.length === 8 ? hex.slice(6, 8) : ''; const r = parseInt(colorHex.substring(0, 2), 16); const g = parseInt(colorHex.substring(2, 4), 16); const b = parseInt(colorHex.substring(4, 6), 16); const adjustValue = (value) => { const newValue = value + (value * percent / 100); return Math.min(255, Math.max(0, Math.round(newValue))); }; const nr = adjustValue(r); const ng = adjustValue(g); const nb = adjustValue(b); // 如果原始颜色包含透明度,则在结果中也包含透明度 return `#${nr.toString(16).padStart(2, '0')}${ng.toString(16).padStart(2, '0')}${nb.toString(16).padStart(2, '0')}${alpha}`; } // 添加获取旋转角度的方法 getRotationDegree() { switch (this.ncPosition) { case 'top-right': return '45deg'; case 'bottom-left': return '-135deg'; case 'bottom-right': return '135deg'; default: // top-left return '-45deg'; } } // 添加获取文字旋转的方法 getTextRotation() { switch (this.ncPosition) { case 'bottom-left': case 'bottom-right': return 'rotate(180deg)'; default: return ''; } } // 添加获取丝带阴影的方法 getRibbonShadow() { switch (this.ncPosition) { case 'bottom-left': case 'bottom-right': return `0 -${this.ribbonSize * 0.05}px ${this.ribbonSize * 0.1}px rgba(0, 0, 0, 0.23)`; default: return `0 ${this.ribbonSize * 0.05}px ${this.ribbonSize * 0.1}px rgba(0, 0, 0, 0.23)`; } } // 添加获取阴影位置的方法 getShadowPosition() { const shadowSize = this.ribbonSize * 0.9 + 'px'; const shadowColor = this.adjustColor(this.ncRibbonColor, -20); switch (this.ncPosition) { case 'top-right': return `bottom: 0; right: 0; box-shadow: -${shadowSize} -${shadowSize} ${shadowColor};`; case 'bottom-left': return `top: 0; left: 0; box-shadow: ${shadowSize} ${shadowSize} ${shadowColor};`; case 'bottom-right': return `top: 0; right: 0; box-shadow: -${shadowSize} ${shadowSize} ${shadowColor};`; default: // top-left return `bottom: 0; left: 0; box-shadow: ${shadowSize} -${shadowSize} ${shadowColor};`; } } // 监听父容器尺寸变化 observeParentSize() { // 使用ResizeObserver监听尺寸变化(现代浏览器支持) if (typeof ResizeObserver !== 'undefined') { const resizeObserver = new ResizeObserver(() => { this.updateRibbonSize(); }); resizeObserver.observe(this.el.nativeElement); } else { // 降级方案:使用MutationObserver监听DOM变化 const observer = new MutationObserver(() => { this.updateRibbonSize(); }); observer.observe(this.el.nativeElement, { childList: true, subtree: true, attributes: true }); // 额外的安全措施:定期检查尺寸变化 let lastWidth = this.el.nativeElement.offsetWidth; let lastHeight = this.el.nativeElement.offsetHeight; const checkSizeInterval = setInterval(() => { const currentWidth = this.el.nativeElement.offsetWidth; const currentHeight = this.el.nativeElement.offsetHeight; if (currentWidth !== lastWidth || currentHeight !== lastHeight) { lastWidth = currentWidth; lastHeight = currentHeight; this.updateRibbonSize(); } }, 500); // 组件销毁时清除定时器 this.el.nativeElement.addEventListener('DOMNodeRemoved', () => { clearInterval(checkSizeInterval); }); } } } RibbonDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RibbonDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); RibbonDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: RibbonDirective, selector: "[ncRibbon]", inputs: { ncContent: "ncContent", ncContentColor: "ncContentColor", ncSize: "ncSize", ncRibbonColor: "ncRibbonColor", ncPosition: "ncPosition" }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RibbonDirective, decorators: [{ type: Directive, args: [{ selector: '[ncRibbon]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncContent: [{ type: Input }], ncContentColor: [{ type: Input }], ncSize: [{ type: Input }], ncRibbonColor: [{ type: Input }], ncPosition: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmliYm9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvcmliYm9uL3JpYmJvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOztBQUtoRixNQUFNLE9BQU8sZUFBZTtJQVUzQixZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFUdEQsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixtQkFBYyxHQUFXLE1BQU0sQ0FBQztRQUNoQyxXQUFNLEdBQVcsR0FBRyxDQUFDLENBQUMseUJBQXlCO1FBQy9DLGtCQUFhLEdBQVcsU0FBUyxDQUFDO1FBQ2xDLGVBQVUsR0FBOEQsVUFBVSxDQUFDO1FBTTNGLFNBQVM7UUFDVCxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDckUsQ0FBQztJQUVELFFBQVE7UUFDUCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8scUJBQXFCO1FBQzVCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDN0QsSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlLEtBQUssUUFBUSxFQUFFO1lBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUN0RTtRQUVELFNBQVM7UUFDVCxJQUFJLENBQUMsZUFB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QUFlO2tCQUgzQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxZQUFZO2lCQUN0Qjt5SEFFUyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuXHRzZWxlY3RvcjogJ1tuY1JpYmJvbl0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSaWJib25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cdEBJbnB1dCgpIG5jQ29udGVudDogc3RyaW5nID0gJyc7XHJcblx0QElucHV0KCkgbmNDb250ZW50Q29sb3I6IHN0cmluZyA9ICcjZmZmJztcclxuXHRASW5wdXQoKSBuY1NpemU6IG51bWJlciA9IDAuMzsgLy8g5L+u5pS55Li655m+5YiG5q+U5YC877yM6buY6K6k5Li65a655Zmo5a696auY6L6D5bCP5YC855qEMzAlXHJcblx0QElucHV0KCkgbmNSaWJib25Db2xvcjogc3RyaW5nID0gJyNmZjY1NDcnO1xyXG5cdEBJbnB1dCgpIG5jUG9zaXRpb246ICd0b3AtbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICdib3R0b20tbGVmdCcgfCAnYm90dG9tLXJpZ2h0JyA9ICd0b3AtbGVmdCc7XHJcblx0cHJpdmF0ZSByaWJib25Db250YWluZXIhOiBIVE1MRWxlbWVudDtcclxuXHRwcml2YXRlIHJpYmJvblNpemUhOiBudW1iZXI7XHJcblx0cHJpdmF0ZSB1bmlxdWVJZDogc3RyaW5nO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuXHRcdC8vIOeUn+aIkOWUr+S4gElEXHJcblx0XHR0aGlzLnVuaXF1ZUlkID0gYHJpYmJvbl8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gO1xyXG5cdH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLmNyZWF0ZVJpYmJvbkNvbnRhaW5lcigpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjcmVhdGVSaWJib25Db250YWluZXIoKSB7XHJcblx0XHRjb25zdCBlbGVtZW50UG9zaXRpb24gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb247XHJcblx0XHRpZiAoIWVsZW1lbnRQb3NpdGlvbiB8fCBlbGVtZW50UG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDliJvlu7rkuJ3luKblrrnlmahcclxuXHRcdHRoaXMucmliYm9uQ29udGFpbmVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5yaWJib25Db250YWluZXIsIHRoaXMudW5pcXVlSWQpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnZGlzcGxheScsICdmbGV4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpO1xyXG5cdFx0XHJcblx0XHQvLyDmt7vliqDliLBET01cclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLnJpYmJvbkNvbnRhaW5lcik7XHJcblx0XHRcclxuXHRcdC8vIOWIneWni+a4suafk1xyXG5cdFx0dGhpcy51cGRhdGVSaWJib25TaXplKCk7XHJcblx0XHRcclxuXHRcdC8vIOS9v+eUqE11dGF0aW9uT2JzZXJ2ZXLnm5HlkKzniLblrrnlmajlsLrlr7jlj5jljJZcclxuXHRcdHRoaXMub2JzZXJ2ZVBhcmVudFNpemUoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdXBkYXRlUmliYm9uU2l6ZSgpIHtcclxuXHRcdC8vIOiOt+WPlueItuWuueWZqOeahOWwuuWvuFxyXG5cdFx0Y29uc3QgcGFyZW50V2lkdGggPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcblx0XHRjb25zdCBwYXJlbnRIZWlnaHQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG5cdFx0XHJcblx0XHQvLyDlpoLmnpzniLblrrnlmajlsLrlr7jkuLow77yM5bu26L+f6YeN6K+VXHJcblx0XHRpZiAocGFyZW50V2lkdGggPT09IDAgfHwgcGFyZW50SGVpZ2h0ID09PSAwKSB7XHJcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVSaWJib25TaXplKCksIDEwMCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0dGhpcy5yaWJib25TaXplID0gTWF0aC5taW4ocGFyZW50V2lkdGgsIHBhcmVudEhlaWdodCkgKiB0aGlzLm5jU2l6ZTtcclxuXHRcdFxyXG5cdFx0Ly8g5pu05paw5Lid5bim5a655Zmo5bC65a+4XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnd2lkdGgnLCBgJHt0aGlzLnJpYmJvblNpemV9cHhgKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICdoZWlnaHQnLCBgJHt0aGlzLnJpYmJvblNpemV9cHhgKTtcclxuXHRcdFxyXG5cdFx0Ly8g5pu05paw5L2N572uXHJcblx0XHRjb25zdCBvZmZzZXQgPSAtKHRoaXMucmliYm9uU2l6ZSAqIDAuMDYpO1xyXG5cdFx0c3dpdGNoICh0aGlzLm5jUG9zaXRpb24pIHtcclxuXHRcdFx0Y2FzZSAndG9wLXJpZ2h0JzpcclxuXHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAndG9wJywgYCR7b2Zmc2V0fXB4YCk7XHJcblx0XHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ3JpZ2h0JywgYCR7b2Zmc2V0fXB4YCk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ2JvdHRvbS1sZWZ0JzpcclxuXHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnYm90dG9tJywgYCR7b2Zmc2V0fXB4YCk7XHJcblx0XHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ2xlZnQnLCBgJHtvZmZzZXR9cHhgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnYm90dG9tLXJpZ2h0JzpcclxuXHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnYm90dG9tJywgYCR7b2Zmc2V0fXB4YCk7XHJcblx0XHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ3JpZ2h0JywgYCR7b2Zmc2V0fXB4YCk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6IC8vdG9wLWxlZnRcclxuXHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAndG9wJywgYCR7b2Zmc2V0fXB4YCk7XHJcblx0XHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ2xlZnQnLCBgJHtvZmZzZXR9cHhgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Ly8g5pu05pawQ1NT5qC35byPXHJcblx0XHR0aGlzLnVwZGF0ZVJpYmJvblN0eWxlcygpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSB1cGRhdGVSaWJib25TdHlsZXMoKSB7XHJcblx0XHQvLyDmoLnmja7ovpPlhaXnmoTpopzoibLorqHnrpfmuJDlj5joibJcclxuXHRcdGNvbnN0IG1haW5Db2xvciA9IHRoaXMubmNSaWJib25Db2xvcjtcclxuXHRcdGNvbnN0IGxpZ2h0ZXJDb2xvciA9IHRoaXMuYWRqdXN0Q29sb3IodGhpcy5uY1JpYmJvbkNvbG9yLCA0NSk7XHJcblx0XHRjb25zdCBkYXJrZXJDb2xvciA9IHRoaXMuYWRqdXN0Q29sb3IodGhpcy5uY1JpYmJvbkNvbG9yLCAtMTApO1xyXG5cdFx0XHJcblx0XHRjb25zdCBjc3NUZXh0ID0gYFxyXG5cdFx0XHQuJHt0aGlzLnVuaXF1ZUlkfTo6YmVmb3JlIHtcclxuXHRcdFx0XHRjb250ZW50OiAnJHt0aGlzLm5jQ29udGVudH0nO1xyXG5cdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuXHRcdFx0XHR3aWR0aDogMTUwJTtcclxuXHRcdFx0XHRoZWlnaHQ6ICR7dGhpcy5yaWJib25TaXplICogMC4zfXB4O1xyXG5cdFx0XHRcdGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgJHttYWluQ29sb3J9IDAlLCAke2xpZ2h0ZXJDb2xvcn0gNTElLCAke2RhcmtlckNvbG9yfSAxMDAlKTtcclxuXHRcdFx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgke3RoaXMuZ2V0Um90YXRpb25EZWdyZWUoKX0pIHRyYW5zbGF0ZVkoJHstdGhpcy5yaWJib25TaXplICogMC4xNn1weCkgJHt0aGlzLmdldFRleHRSb3RhdGlvbigpfTtcclxuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcblx0XHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcblx0XHRcdFx0Y29sb3I6ICR7dGhpcy5uY0NvbnRlbnRDb2xvcn07XHJcblx0XHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcclxuXHRcdFx0XHRmb250LXNpemU6ICR7TWF0aC5jZWlsKHRoaXMucmliYm9uU2l6ZSAqIDAuMTgpfXB4O1xyXG5cdFx0XHRcdGxldHRlci1zcGFjaW5nOiAwLjFlbTtcclxuXHRcdFx0XHRib3gtc2hhZG93OiAke3RoaXMuZ2V0UmliYm9uU2hhZG93KCl9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQuJHt0aGlzLnVuaXF1ZUlkfTo6YWZ0ZXIge1xyXG5cdFx0XHRcdGNvbnRlbnQ6ICcnO1xyXG5cdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuXHRcdFx0XHR3aWR0aDogJHt0aGlzLnJpYmJvblNpemUgKiAwLjF9cHg7XHJcblx0XHRcdFx0aGVpZ2h0OiAke3RoaXMucmliYm9uU2l6ZSAqIDAuMX1weDtcclxuXHRcdFx0XHR6LWluZGV4OiAtMTtcclxuXHRcdFx0XHQke3RoaXMuZ2V0U2hhZG93UG9zaXRpb24oKX1cclxuXHRcdFx0XHRiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsICR7bWFpbkNvbG9yfSAwJSwgJHtsaWdodGVyQ29sb3J9IDUxJSwgJHttYWluQ29sb3J9IDEwMCUpO1xyXG5cdFx0XHR9XHJcblx0XHRgO1xyXG5cdFx0XHJcblx0XHQvLyDnp7vpmaTml6fmoLflvI/vvIjlpoLmnpzlrZjlnKjvvIlcclxuXHRcdGNvbnN0IG9sZFN0eWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc3R5bGVbZGF0YS1yaWJib24taWQ9XCIke3RoaXMudW5pcXVlSWR9XCJdYCk7XHJcblx0XHRpZiAob2xkU3R5bGUpIHtcclxuXHRcdFx0b2xkU3R5bGUucmVtb3ZlKCk7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIOa3u+WKoOaWsOagt+W8j1xyXG5cdFx0Y29uc3Qgc3R5bGVFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoc3R5bGVFbGVtZW50LCAnZGF0YS1yaWJib24taWQnLCB0aGlzLnVuaXF1ZUlkKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50LCB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoY3NzVGV4dCkpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5oZWFkLCBzdHlsZUVsZW1lbnQpO1xyXG5cdH1cclxuXHJcblx0Ly8g5re75Yqg6aKc6Imy6LCD5pW05pa55rOVXHJcblx0cHJpdmF0ZSBhZGp1c3RDb2xvcihjb2xvcjogc3RyaW5nLCBwZXJjZW50OiBudW1iZXIpOiBzdHJpbmcge1xyXG5cdFx0Ly8g56Gu5L+d6aKc6Imy5YC85qC85byP57uf5LiA77yM56e76Zmk5Y+v6IO95a2Y5Zyo55qEICMg5Y+3XHJcblx0XHRjb25zdCBoZXggPSBjb2xvci5yZXBsYWNlKC9eIy8sICcnKTtcclxuXHJcblx0XHQvLyDpqozor4HpopzoibLlgLzmoLzlvI/vvIg25L2N5oiWOOS9je+8iVxyXG5cdFx0aWYgKCEvXlswLTlBLUZhLWZdezZ9KFswLTlBLUZhLWZdezJ9KT8kLy50ZXN0KGhleCkpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdJbnZhbGlkIGNvbG9yIGZvcm1hdC4gVXNpbmcgZGVmYXVsdCBjb2xvci4nKTtcclxuXHRcdFx0cmV0dXJuICcjZmY2NTQ3JztcclxuXHRcdH1cclxuXHJcblx0XHQvLyDliIbnprvpopzoibLlgLzlkozpgI/mmI7luqZcclxuXHRcdGNvbnN0IGNvbG9ySGV4ID0gaGV4LnNsaWNlKDAsIDYpO1xyXG5cdFx0Y29uc3QgYWxwaGEgPSBoZXgubGVuZ3RoID09PSA4ID8gaGV4LnNsaWNlKDYsIDgpIDogJyc7XHJcblxyXG5cdFx0Y29uc3QgciA9IHBhcnNlSW50KGNvbG9ySGV4LnN1YnN0cmluZygwLCAyKSwgMTYpO1xyXG5cdFx0Y29uc3QgZyA9IHBhcnNlSW50KGNvbG9ySGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xyXG5cdFx0Y29uc3QgYiA9IHBhcnNlSW50KGNvbG9ySGV4LnN1YnN0cmluZyg0LCA2KSwgMTYpO1xyXG5cclxuXHRcdGNvbnN0IGFkanVzdFZhbHVlID0gKHZhbHVlOiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG5cdFx0XHRjb25zdCBuZXdWYWx1ZSA9IHZhbHVlICsgKHZhbHVlICogcGVyY2VudCAvIDEwMCk7XHJcblx0XHRcdHJldHVybiBNYXRoLm1pbigyNTUsIE1hdGgubWF4KDAsIE1hdGgucm91bmQobmV3VmFsdWUpKSk7XHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IG5yID0gYWRqdXN0VmFsdWUocik7XHJcblx0XHRjb25zdCBuZyA9IGFkanVzdFZhbHVlKGcpO1xyXG5cdFx0Y29uc3QgbmIgPSBhZGp1c3RWYWx1ZShiKTtcclxuXHJcblx0XHQvLyDlpoLmnpzljp/lp4vpopzoibLljIXlkKvpgI/mmI7luqbvvIzliJnlnKjnu5PmnpzkuK3kuZ/ljIXlkKvpgI/mmI7luqZcclxuXHRcdHJldHVybiBgIyR7bnIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtuZy50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke25iLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7YWxwaGF9YDtcclxuXHR9XHJcblxyXG5cdC8vIOa3u+WKoOiOt+WPluaXi+i9rOinkuW6pueahOaWueazlVxyXG5cdHByaXZhdGUgZ2V0Um90YXRpb25EZWdyZWUoKTogc3RyaW5nIHtcclxuXHRcdHN3aXRjaCAodGhpcy5uY1Bvc2l0aW9uKSB7XHJcblx0XHRcdGNhc2UgJ3RvcC1yaWdodCc6XHJcblx0XHRcdFx0cmV0dXJuICc0NWRlZyc7XHJcblx0XHRcdGNhc2UgJ2JvdHRvbS1sZWZ0JzpcclxuXHRcdFx0XHRyZXR1cm4gJy0xMzVkZWcnO1xyXG5cdFx0XHRjYXNlICdib3R0b20tcmlnaHQnOlxyXG5cdFx0XHRcdHJldHVybiAnMTM1ZGVnJztcclxuXHRcdFx0ZGVmYXVsdDogLy8gdG9wLWxlZnRcclxuXHRcdFx0XHRyZXR1cm4gJy00NWRlZyc7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyDmt7vliqDojrflj5bmloflrZfml4vovaznmoTmlrnms5VcclxuXHRwcml2YXRlIGdldFRleHRSb3RhdGlvbigpOiBzdHJpbmcge1xyXG5cdFx0c3dpdGNoICh0aGlzLm5jUG9zaXRpb24pIHtcclxuXHRcdFx0Y2FzZSAnYm90dG9tLWxlZnQnOlxyXG5cdFx0XHRjYXNlICdib3R0b20tcmlnaHQnOlxyXG5cdFx0XHRcdHJldHVybiAncm90YXRlKDE4MGRlZyknO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHJldHVybiAnJztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIOa3u+WKoOiOt+WPluS4neW4pumYtOW9seeahOaWueazlVxyXG5cdHByaXZhdGUgZ2V0UmliYm9uU2hhZG93KCk6IHN0cmluZyB7XHJcblx0XHRzd2l0Y2ggKHRoaXMubmNQb3NpdGlvbikge1xyXG5cdFx0XHRjYXNlICdib3R0b20tbGVmdCc6XHJcblx0XHRcdGNhc2UgJ2JvdHRvbS1yaWdodCc6XHJcblx0XHRcdFx0cmV0dXJuIGAwIC0ke3RoaXMucmliYm9uU2l6ZSAqIDAuMDV9cHggJHt0aGlzLnJpYmJvblNpemUgKiAwLjF9cHggcmdiYSgwLCAwLCAwLCAwLjIzKWA7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0cmV0dXJuIGAwICR7dGhpcy5yaWJib25TaXplICogMC4wNX1weCAke3RoaXMucmliYm9uU2l6ZSAqIDAuMX1weCByZ2JhKDAsIDAsIDAsIDAuMjMpYDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIOa3u+WKoOiOt+WPlumYtOW9seS9jee9rueahOaWueazlVxyXG5cdHByaXZhdGUgZ2V0U2hhZG93UG9zaXRpb24oKTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IHNoYWRvd1NpemUgPSB0aGlzLnJpYmJvblNpemUgKiAwLjkgKyAncHgnO1xyXG5cdFx0Y29uc3Qgc2hhZG93Q29sb3IgPSB0aGlzLmFkanVzdENvbG9yKHRoaXMubmNSaWJib25Db2xvciwgLTIwKTtcclxuXHJcblx0XHRzd2l0Y2ggKHRoaXMubmNQb3NpdGlvbikge1xyXG5cdFx0XHRjYXNlICd0b3AtcmlnaHQnOlxyXG5cdFx0XHRcdHJldHVybiBgYm90dG9tOiAwOyByaWdodDogMDsgYm94LXNoYWRvdzogLSR7c2hhZG93U2l6ZX0gLSR7c2hhZG93U2l6ZX0gJHtzaGFkb3dDb2xvcn07YDtcclxuXHRcdFx0Y2FzZSAnYm90dG9tLWxlZnQnOlxyXG5cdFx0XHRcdHJldHVybiBgdG9wOiAwOyBsZWZ0OiAwOyBib3gtc2hhZG93OiAke3NoYWRvd1NpemV9ICR7c2hhZG93U2l6ZX0gJHtzaGFkb3dDb2xvcn07YDtcclxuXHRcdFx0Y2FzZSAnYm90dG9tLXJpZ2h0JzpcclxuXHRcdFx0XHRyZXR1cm4gYHRvcDogMDsgcmlnaHQ6IDA7IGJveC1zaGFkb3c6IC0ke3NoYWRvd1NpemV9ICR7c2hhZG93U2l6ZX0gJHtzaGFkb3dDb2xvcn07YDtcclxuXHRcdFx0ZGVmYXVsdDogLy8gdG9wLWxlZnRcclxuXHRcdFx0XHRyZXR1cm4gYGJvdHRvbTogMDsgbGVmdDogMDsgYm94LXNoYWRvdzogJHtzaGFkb3dTaXplfSAtJHtzaGFkb3dTaXplfSAke3NoYWRvd0NvbG9yfTtgO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8g55uR5ZCs54i25a655Zmo5bC65a+45Y+Y5YyWXHJcblx0cHJpdmF0ZSBvYnNlcnZlUGFyZW50U2l6ZSgpIHtcclxuXHRcdC8vIOS9v+eUqFJlc2l6ZU9ic2VydmVy55uR5ZCs5bC65a+45Y+Y5YyW77yI546w5Luj5rWP6KeI5Zmo5pSv5oyB77yJXHJcblx0XHRpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy51cGRhdGVSaWJib25TaXplKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRyZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyDpmY3nuqfmlrnmoYjvvJrkvb/nlKhNdXRhdGlvbk9ic2VydmVy55uR5ZCsRE9N5Y+Y5YyWXHJcblx0XHRcdGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMudXBkYXRlUmliYm9uU2l6ZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0b2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHtcclxuXHRcdFx0XHRjaGlsZExpc3Q6IHRydWUsXHJcblx0XHRcdFx0c3VidHJlZTogdHJ1ZSxcclxuXHRcdFx0XHRhdHRyaWJ1dGVzOiB0cnVlXHJcblx0XHRcdH0pO1xyXG5cdFx0XHRcclxuXHRcdFx0Ly8g6aKd5aSW55qE5a6J5YWo5o6q5pa977ya5a6a5pyf5qOA5p+l5bC65a+45Y+Y5YyWXHJcblx0XHRcdGxldCBsYXN0V2lkdGggPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcblx0XHRcdGxldCBsYXN0SGVpZ2h0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuXHRcdFx0XHJcblx0XHRcdGNvbnN0IGNoZWNrU2l6ZUludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRXaWR0aCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuXHRcdFx0XHRjb25zdCBjdXJyZW50SGVpZ2h0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRpZiAoY3VycmVudFdpZHRoICE9PSBsYXN0V2lkdGggfHwgY3VycmVudEhlaWdodCAhPT0gbGFzdEhlaWdodCkge1xyXG5cdFx0XHRcdFx0bGFzdFdpZHRoID0gY3VycmVudFdpZHRoO1xyXG5cdFx0XHRcdFx0bGFzdEhlaWdodCA9IGN1cnJlbnRIZWlnaHQ7XHJcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZVJpYmJvblNpemUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sIDUwMCk7XHJcblx0XHRcdFxyXG5cdFx0XHQvLyDnu4Tku7bplIDmr4Hml7bmuIXpmaTlrprml7blmahcclxuXHRcdFx0dGhpcy5lbC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVSZW1vdmVkJywgKCkgPT4ge1xyXG5cdFx0XHRcdGNsZWFySW50ZXJ2YWwoY2hlY2tTaXplSW50ZXJ2YWwpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcbn0iXX0=