ng-cw-v12
Version:
Angular UI component library
139 lines • 20.8 kB
JavaScript
import { Directive, Input, Output, EventEmitter } from '@angular/core';
import * as i0 from "@angular/core";
export class ShineBorderDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
this.ncBorderWidth = 1; // 边框宽度 单位px
this.ncDuration = 14000; // 动画时长,ms
this.ncStopTime = 0; // 停止动画时间,ms,0表示不停止
this.ncShineColor = ["#A07CFE", "#FE8FB5", "#FFBE7B"]; // 光效颜色,可以是单色或颜色数组
this.ncEnabled = true; // 是否启用动画
this.ncEnabledChange = new EventEmitter(); // 双向绑定输出事件
this.isInitialized = false;
// 为每个实例生成唯一的动画名称
this.animationName = `ncShineBorder_${Math.random().toString(36).substring(2, 11)}`;
}
ngOnInit() {
this.createShineBorderContainer();
this.isInitialized = true;
if (this.ncEnabled) {
this.startAnimation();
}
}
ngOnChanges(changes) {
if (this.isInitialized && changes['ncEnabled']) {
if (this.ncEnabled) {
this.startAnimation();
}
else {
this.stopAnimation();
}
}
}
ngOnDestroy() {
if (this.stopTimer) {
clearTimeout(this.stopTimer);
}
}
createShineBorderContainer() {
// 创建shine边框元素
this.shineElement = this.renderer.createElement('div');
this.renderer.addClass(this.shineElement, 'shine-border');
// 确保宿主元素具有相对定位
const elementPosition = this.el.nativeElement.style.position;
if (!elementPosition || elementPosition === 'static') {
this.renderer.setStyle(this.el.nativeElement, 'position', 'relative');
}
// 获取shine颜色
const shineColors = Array.isArray(this.ncShineColor)
? this.ncShineColor.join(',')
: this.ncShineColor;
// 设置shine边框样式
this.renderer.setStyle(this.shineElement, 'position', 'absolute');
this.renderer.setStyle(this.shineElement, 'inset', '0');
this.renderer.setStyle(this.shineElement, 'width', '100%');
this.renderer.setStyle(this.shineElement, 'height', '100%');
this.renderer.setStyle(this.shineElement, 'borderRadius', 'inherit');
this.renderer.setStyle(this.shineElement, 'pointerEvents', 'none');
this.renderer.setStyle(this.shineElement, 'backgroundImage', `radial-gradient(transparent,transparent, ${shineColors},transparent,transparent)`);
this.renderer.setStyle(this.shineElement, 'backgroundSize', '300% 300%');
this.renderer.setStyle(this.shineElement, 'padding', `${this.ncBorderWidth}px`);
// 设置mask属性
this.renderer.setStyle(this.shineElement, 'mask', 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)');
this.renderer.setStyle(this.shineElement, '-webkit-mask', 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)');
this.renderer.setStyle(this.shineElement, '-webkit-mask-composite', 'xor');
this.renderer.setStyle(this.shineElement, 'mask-composite', 'exclude');
this.renderer.setStyle(this.shineElement, 'will-change', 'background-position');
// 初始状态下隐藏边框
this.renderer.setStyle(this.shineElement, 'display', 'none');
// 添加关键帧动画样式
this.styleElement = this.renderer.createElement('style');
const keyframes = `
${this.animationName} {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
`;
this.renderer.appendChild(this.styleElement, this.renderer.createText(keyframes));
this.renderer.appendChild(this.el.nativeElement, this.styleElement);
// 将shine元素添加到宿主元素中
this.renderer.appendChild(this.el.nativeElement, this.shineElement);
}
startAnimation() {
if (!this.shineElement)
return;
// 启动动画时显示边框
this.renderer.setStyle(this.shineElement, 'display', 'block');
// 启动shine动画
this.renderer.setStyle(this.shineElement, 'animation', `${this.animationName} ${this.ncDuration}ms ease-in-out infinite`);
// 如果设置了停止时间,则在指定时间后标记需要停止
if (this.ncStopTime > 0) {
this.stopTimer = setTimeout(() => {
this.stopAnimation();
// 当因为 ncStopTime 停止动画时,更新 ncEnabled 值并发出事件
this.ncEnabled = false;
this.ncEnabledChange.emit(false);
}, this.ncStopTime);
}
}
stopAnimation() {
if (!this.shineElement)
return;
if (this.stopTimer) {
clearTimeout(this.stopTimer);
this.stopTimer = null;
}
this.renderer.setStyle(this.shineElement, 'animation', 'none');
// 停止动画时隐藏边框
this.renderer.setStyle(this.shineElement, 'display', 'none');
}
}
ShineBorderDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ShineBorderDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
ShineBorderDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: ShineBorderDirective, selector: "[ncShineBorder]", inputs: { ncBorderWidth: "ncBorderWidth", ncDuration: "ncDuration", ncStopTime: "ncStopTime", ncShineColor: "ncShineColor", ncEnabled: "ncEnabled" }, outputs: { ncEnabledChange: "ncEnabledChange" }, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ShineBorderDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncShineBorder]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncBorderWidth: [{
type: Input
}], ncDuration: [{
type: Input
}], ncStopTime: [{
type: Input
}], ncShineColor: [{
type: Input
}], ncEnabled: [{
type: Input
}], ncEnabledChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpbmUtYm9yZGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc2hpbmUtYm9yZGVyL3NoaW5lLWJvcmRlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDOztBQUszSSxNQUFNLE9BQU8sb0JBQW9CO0lBYy9CLFlBQW9CLEVBQWMsRUFBVSxRQUFtQjtRQUEzQyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWJ0RCxrQkFBYSxHQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVk7UUFDdkMsZUFBVSxHQUFXLEtBQUssQ0FBQyxDQUFDLFVBQVU7UUFDdEMsZUFBVSxHQUFXLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtRQUMzQyxpQkFBWSxHQUFzQixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxrQkFBa0I7UUFDdkYsY0FBUyxHQUFZLElBQUksQ0FBQyxDQUFDLFNBQVM7UUFDbkMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDLENBQUMsV0FBVztRQU01RCxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUc1QixpQkFBaUI7UUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxpQkFBaUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDdEYsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIs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O2tCQUhoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7aUJBQzVCO3lIQUVVLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbmNTaGluZUJvcmRlcl0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaGluZUJvcmRlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIG5jQm9yZGVyV2lkdGg6IG51bWJlciA9IDE7IC8vIOi+ueahhuWuveW6piDljZXkvY1weFxyXG4gIEBJbnB1dCgpIG5jRHVyYXRpb246IG51bWJlciA9IDE0MDAwOyAvLyDliqjnlLvml7bplb/vvIxtc1xyXG4gIEBJbnB1dCgpIG5jU3RvcFRpbWU6IG51bWJlciA9IDA7IC8vIOWBnOatouWKqOeUu+aXtumXtO+8jG1z77yMMOihqOekuuS4jeWBnOatolxyXG4gIEBJbnB1dCgpIG5jU2hpbmVDb2xvcjogc3RyaW5nIHwgc3RyaW5nW10gPSBbXCIjQTA3Q0ZFXCIsIFwiI0ZFOEZCNVwiLCBcIiNGRkJFN0JcIl07IC8vIOWFieaViOminOiJsu+8jOWPr+S7peaYr+WNleiJsuaIluminOiJsuaVsOe7hFxyXG4gIEBJbnB1dCgpIG5jRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7IC8vIOaYr+WQpuWQr+eUqOWKqOeUu1xyXG4gIEBPdXRwdXQoKSBuY0VuYWJsZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7IC8vIOWPjOWQkee7keWumui+k+WHuuS6i+S7tlxyXG5cclxuICBwcml2YXRlIHNoaW5lRWxlbWVudCE6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYW5pbWF0aW9uTmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgc3RvcFRpbWVyOiBhbnk7XHJcbiAgcHJpdmF0ZSBzdHlsZUVsZW1lbnQhOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XHJcbiAgICAvLyDkuLrmr4/kuKrlrp7kvovnlJ/miJDllK/kuIDnmoTliqjnlLvlkI3np7BcclxuICAgIHRoaXMuYW5pbWF0aW9uTmFtZSA9IGBuY1NoaW5lQm9yZGVyXyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDExKX1gO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZVNoaW5lQm9yZGVyQ29udGFpbmVyKCk7XHJcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMubmNFbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgY2hhbmdlc1snbmNFbmFibGVkJ10pIHtcclxuICAgICAgaWYgKHRoaXMubmNFbmFibGVkKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnN0b3BUaW1lcikge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zdG9wVGltZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTaGluZUJvcmRlckNvbnRhaW5lcigpIHtcclxuICAgIC8vIOWIm+W7unNoaW5l6L655qGG5YWD57SgXHJcbiAgICB0aGlzLnNoaW5lRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuc2hpbmVFbGVtZW50LCAnc2hpbmUtYm9yZGVyJyk7XHJcblxyXG4gICAgLy8g56Gu5L+d5a6/5Li75YWD57Sg5YW35pyJ55u45a+55a6a5L2NXHJcbiAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb247XHJcbiAgICBpZiAoIWVsZW1lbnRQb3NpdGlvbiB8fCBlbGVtZW50UG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDojrflj5ZzaGluZeminOiJslxyXG4gICAgY29uc3Qgc2hpbmVDb2xvcnMgPSBBcnJheS5pc0FycmF5KHRoaXMubmNTaGluZUNvbG9yKSBcclxuICAgICAgPyB0aGlzLm5jU2hpbmVDb2xvci5qb2luKCcsJykgXHJcbiAgICAgIDogdGhpcy5uY1NoaW5lQ29sb3I7XHJcblxyXG4gICAgLy8g6K6+572uc2hpbmXovrnmoYbmoLflvI9cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ2luc2V0JywgJzAnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICd3aWR0aCcsICcxMDAlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2hpbmVFbGVtZW50LCAnaGVpZ2h0JywgJzEwMCUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICdib3JkZXJSYWRpdXMnLCAnaW5oZXJpdCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ3BvaW50ZXJFdmVudHMnLCAnbm9uZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ2JhY2tncm91bmRJbWFnZScsIFxyXG4gICAgICBgcmFkaWFsLWdyYWRpZW50KHRyYW5zcGFyZW50LHRyYW5zcGFyZW50LCAke3NoaW5lQ29sb3JzfSx0cmFuc3BhcmVudCx0cmFuc3BhcmVudClgKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICdiYWNrZ3JvdW5kU2l6ZScsICczMDAlIDMwMCUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICdwYWRkaW5nJywgYCR7dGhpcy5uY0JvcmRlcldpZHRofXB4YCk7XHJcbiAgICBcclxuICAgIC8vIOiuvue9rm1hc2vlsZ7mgKdcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICdtYXNrJywgXHJcbiAgICAgICdsaW5lYXItZ3JhZGllbnQoI2ZmZiAwIDApIGNvbnRlbnQtYm94LCBsaW5lYXItZ3JhZGllbnQoI2ZmZiAwIDApJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2hpbmVFbGVtZW50LCAnLXdlYmtpdC1tYXNrJywgXHJcbiAgICAgICdsaW5lYXItZ3JhZGllbnQoI2ZmZiAwIDApIGNvbnRlbnQtYm94LCBsaW5lYXItZ3JhZGllbnQoI2ZmZiAwIDApJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2hpbmVFbGVtZW50LCAnLXdlYmtpdC1tYXNrLWNvbXBvc2l0ZScsICd4b3InKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICdtYXNrLWNvbXBvc2l0ZScsICdleGNsdWRlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2hpbmVFbGVtZW50LCAnd2lsbC1jaGFuZ2UnLCAnYmFja2dyb3VuZC1wb3NpdGlvbicpO1xyXG5cclxuICAgIC8vIOWIneWni+eKtuaAgeS4i+makOiXj+i+ueahhlxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cclxuICAgIC8vIOa3u+WKoOWFs+mUruW4p+WKqOeUu+agt+W8j1xyXG4gICAgdGhpcy5zdHlsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcbiAgICBjb25zdCBrZXlmcmFtZXMgPSBgXHJcbiAgICAgIEBrZXlmcmFtZXMgJHt0aGlzLmFuaW1hdGlvbk5hbWV9IHtcclxuICAgICAgICAwJSB7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwJSA1MCU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDUwJSB7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMDAlIDUwJTtcclxuICAgICAgICB9XHJcbiAgICAgICAgMTAwJSB7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwJSA1MCU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBgO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCwgdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KGtleWZyYW1lcykpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuc3R5bGVFbGVtZW50KTtcclxuXHJcbiAgICAvLyDlsIZzaGluZeWFg+e0oOa3u+WKoOWIsOWuv+S4u+WFg+e0oOS4rVxyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuc2hpbmVFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnRBbmltYXRpb24oKSB7XHJcbiAgICBpZiAoIXRoaXMuc2hpbmVFbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8g5ZCv5Yqo5Yqo55S75pe25pi+56S66L655qGGXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2hpbmVFbGVtZW50LCAnZGlzcGxheScsICdibG9jaycpO1xyXG4gICAgXHJcbiAgICAvLyDlkK/liqhzaGluZeWKqOeUu1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ2FuaW1hdGlvbicsXHJcbiAgICAgIGAke3RoaXMuYW5pbWF0aW9uTmFtZX0gJHt0aGlzLm5jRHVyYXRpb259bXMgZWFzZS1pbi1vdXQgaW5maW5pdGVgKTtcclxuXHJcbiAgICAvLyDlpoLmnpzorr7nva7kuoblgZzmraLml7bpl7TvvIzliJnlnKjmjIflrprml7bpl7TlkI7moIforrDpnIDopoHlgZzmraJcclxuICAgIGlmICh0aGlzLm5jU3RvcFRpbWUgPiAwKSB7XHJcbiAgICAgIHRoaXMuc3RvcFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7XHJcbiAgICAgICAgLy8g5b2T5Zug5Li6IG5jU3RvcFRpbWUg5YGc5q2i5Yqo55S75pe277yM5pu05pawIG5jRW5hYmxlZCDlgLzlubblj5Hlh7rkuovku7ZcclxuICAgICAgICB0aGlzLm5jRW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubmNFbmFibGVkQ2hhbmdlLmVtaXQoZmFsc2UpO1xyXG4gICAgICB9LCB0aGlzLm5jU3RvcFRpbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdG9wQW5pbWF0aW9uKCkge1xyXG4gICAgaWYgKCF0aGlzLnNoaW5lRWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLnN0b3BUaW1lcikge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zdG9wVGltZXIpO1xyXG4gICAgICB0aGlzLnN0b3BUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNoaW5lRWxlbWVudCwgJ2FuaW1hdGlvbicsICdub25lJyk7XHJcbiAgICAvLyDlgZzmraLliqjnlLvml7bpmpDol4/ovrnmoYZcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zaGluZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKTtcclxuICB9XHJcbn0iXX0=