UNPKG

ng-cw-v12

Version:

Angular UI Component Library

187 lines 22.1 kB
import { Component, Input } from '@angular/core'; import { animate, style, transition, trigger, state } from '@angular/animations'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class NumberCounterComponent { constructor(elementRef) { this.elementRef = elementRef; /** 要显示的数字 */ this.ncValue = 0; /** 每个数字动画持续时间 */ this.ncDuration = 1000; /** 每个数字之间的延迟 */ this.ncDelayMultiple = 0; /** 存在每个数字之间的延迟时,数字方向 */ this.ncDirection = 'left'; /** 每个数字之间的间距 */ this.ncGap = 0; /** 开始前的延迟 */ this.ncDelay = 0; /** 是否在视图可见时才开始动画 */ this._startOnView = false; /** 是否只执行一次动画 */ this._once = false; this.digits = []; this.observer = null; this.timeout = null; } set ncStartOnView(val) { this._startOnView = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncStartOnView() { return this._startOnView; } set ncOnce(val) { this._once = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncOnce() { return this._once; } ngOnChanges(changes) { if (changes['ncValue']) { this.start(); } } ngOnDestroy() { this.clear(); } start() { this.clear(); if (!this.ncStartOnView) { this.processValue(); this.timeout = setTimeout(() => { this.startAnimation(); }, this.ncDelay); } else { this.setupIntersectionObserver(); } } clear() { if (this.observer) { this.observer.disconnect(); } if (this.timeout) { clearTimeout(this.timeout); } } setupIntersectionObserver() { this.observer = new IntersectionObserver((entries) => { if (entries[0].isIntersecting) { this.processValue(); this.timeout = setTimeout(() => { this.startAnimation(); }, this.ncDelay); if (this.ncOnce) { if (this.observer) { this.observer.disconnect(); } } } else if (!this.ncOnce) { this.resetAnimation(); } }, { threshold: 0.1 }); this.observer.observe(this.elementRef.nativeElement); } processValue() { this.digits = []; const stringValue = this.ncValue.toString(); for (let i = 0; i < stringValue.length; i++) { const digit = parseInt(stringValue[i]); // 对于所有数字,都生成0到9的序列,然后再从0到最终数字 let numbers = [ ...Array.from({ length: 10 }, (_, index) => index), ...Array.from({ length: digit + 1 }, (_, index) => index) ]; let delay = 0; if (this.ncDirection === 'left') { delay = (stringValue.length - 1 - i) * this.ncDelayMultiple; } else { delay = i * this.ncDelayMultiple; } this.digits.push({ numbers: numbers, targetPosition: -(numbers.length - 1), state: 'initial', delay: delay }); } } startAnimation() { this.digits.forEach((digit) => { setTimeout(() => { digit.state = 'final'; }, digit.delay); }); } resetAnimation() { if (this.timeout) { clearTimeout(this.timeout); } this.digits.forEach(digit => { digit.state = 'initial'; }); } } NumberCounterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NumberCounterComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); NumberCounterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: NumberCounterComponent, selector: "nc-number-counter", inputs: { ncValue: "ncValue", ncDuration: "ncDuration", ncDelayMultiple: "ncDelayMultiple", ncDirection: "ncDirection", ncGap: "ncGap", ncDelay: "ncDelay", ncStartOnView: "ncStartOnView", ncOnce: "ncOnce" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"number-counter-container\" [ngClass]=\"{'gap-x': ncGap > 0}\" [style.--gap.px]=\"ncGap\">\n <div class=\"digit-wrapper\" *ngFor=\"let digit of digits; let i = index\">\n <div class=\"digits-strip\"\n [@countAnimation]=\"{value: digit.state, params: {duration: ncDuration, delay: digit.delay, finalPosition: digit.targetPosition}}\">\n <div class=\"digit\" *ngFor=\"let num of digit.numbers\">{{num}}</div>\n </div>\n </div>\n</div>", styles: [":host{display:inline-block}.number-counter-container{display:flex;width:-moz-fit-content;width:fit-content}.gap-x>*+*{margin-left:var(--gap)}.digit-wrapper{overflow:hidden;position:relative;height:1em;line-height:1em}.digit-wrapper .digits-strip{width:100%;transform:translateY(0);will-change:transform}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [ trigger('countAnimation', [ state('initial', style({ transform: 'translateY(0)' })), state('final', style({ transform: 'translateY({{finalPosition}}em)' }), { params: { finalPosition: 0 } }), transition('initial => final', [ animate('{{duration}}ms {{delay}}ms cubic-bezier(0.33, 1, 0.68, 1)') ], { params: { duration: 1000, delay: 0 } }) ]) ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NumberCounterComponent, decorators: [{ type: Component, args: [{ selector: 'nc-number-counter', templateUrl: './number-counter.component.html', styleUrls: ['./number-counter.component.less'], animations: [ trigger('countAnimation', [ state('initial', style({ transform: 'translateY(0)' })), state('final', style({ transform: 'translateY({{finalPosition}}em)' }), { params: { finalPosition: 0 } }), transition('initial => final', [ animate('{{duration}}ms {{delay}}ms cubic-bezier(0.33, 1, 0.68, 1)') ], { params: { duration: 1000, delay: 0 } }) ]) ] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { ncValue: [{ type: Input }], ncDuration: [{ type: Input }], ncDelayMultiple: [{ type: Input }], ncDirection: [{ type: Input }], ncGap: [{ type: Input }], ncDelay: [{ type: Input }], ncStartOnView: [{ type: Input }], ncOnce: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLWNvdW50ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9udW1iZXItY291bnRlci9udW1iZXItY291bnRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL251bWJlci1jb3VudGVyL251bWJlci1jb3VudGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFtRCxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7QUEwQmpGLE1BQU0sT0FBTyxzQkFBc0I7SUFvQ2pDLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFuQzFDLGFBQWE7UUFDSixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQzdCLGlCQUFpQjtRQUNSLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFDbkMsZ0JBQWdCO1FBQ1Asb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDckMsd0JBQXdCO1FBQ2YsZ0JBQVcsR0FBb0IsTUFBTSxDQUFDO1FBQy9DLGdCQUFnQjtRQUNQLFVBQUssR0FBVyxDQUFDLENBQUM7UUFDM0IsYUFBYTtRQUNKLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDN0Isb0JBQW9CO1FBQ1osaUJBQVksR0FBWSxLQUFLLENBQUM7UUFRdEMsZ0JBQWdCO1FBQ1IsVUFBSyxHQUFZLEtBQUssQ0FBQztRQVMvQixXQUFNLEdBQWtGLEVBQUUsQ0FBQztRQUNuRixhQUFRLEdBQWdDLElBQUksQ0FBQztRQUM3QyxZQUFPLEdBQVEsSUFBSSxDQUFDO0lBRWtCLENBQUM7SUFyQi9DLElBQ0ksYUFBYSxDQUFDLEdBQXFCO1FBQ3JDLElBQUksQ0FB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Q0FDbkIsU0FBUyxFQUFFLGlDQUFpQzs2QkFDN0MsQ0FBQyxFQUFFO2dDQUNGLE1BQU0sRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUU7NkJBQzdCLENBQUM7NEJBQ0YsVUFBVSxDQUFDLGtCQUFrQixFQUFFO2dDQUM3QixPQUFPLENBQUMsMkRBQTJELENBQUM7NkJBQ3JFLEVBQUU7Z0NBQ0QsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFOzZCQUNyQyxDQUFDO3lCQUNILENBQUM7cUJBQ0g7aUJBQ0Y7aUdBR1UsT0FBTztzQkFBZixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBSUYsYUFBYTtzQkFEaEIsS0FBSztnQkFVRixNQUFNO3NCQURULEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIEVsZW1lbnRSZWYsIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBhbmltYXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciwgc3RhdGUgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuXHJcbmV4cG9ydCB0eXBlIE5jRGlyZWN0aW9uVHlwZSA9ICdsZWZ0JyB8ICdyaWdodCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25jLW51bWJlci1jb3VudGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbnVtYmVyLWNvdW50ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL251bWJlci1jb3VudGVyLmNvbXBvbmVudC5sZXNzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignY291bnRBbmltYXRpb24nLCBbXHJcbiAgICAgIHN0YXRlKCdpbml0aWFsJywgc3R5bGUoe1xyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCknXHJcbiAgICAgIH0pKSxcclxuICAgICAgc3RhdGUoJ2ZpbmFsJywgc3R5bGUoe1xyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoe3tmaW5hbFBvc2l0aW9ufX1lbSknXHJcbiAgICAgIH0pLCB7XHJcbiAgICAgICAgcGFyYW1zOiB7IGZpbmFsUG9zaXRpb246IDAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdHJhbnNpdGlvbignaW5pdGlhbCA9PiBmaW5hbCcsIFtcclxuICAgICAgICBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcyBjdWJpYy1iZXppZXIoMC4zMywgMSwgMC42OCwgMSknKVxyXG4gICAgICBdLCB7XHJcbiAgICAgICAgcGFyYW1zOiB7IGR1cmF0aW9uOiAxMDAwLCBkZWxheTogMCB9XHJcbiAgICAgIH0pXHJcbiAgICBdKVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIE51bWJlckNvdW50ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgLyoqIOimgeaYvuekuueahOaVsOWtlyAqL1xyXG4gIEBJbnB1dCgpIG5jVmFsdWU6IG51bWJlciA9IDA7XHJcbiAgLyoqIOavj+S4quaVsOWtl+WKqOeUu+aMgee7reaXtumXtCAqL1xyXG4gIEBJbnB1dCgpIG5jRHVyYXRpb246IG51bWJlciA9IDEwMDA7XHJcbiAgLyoqIOavj+S4quaVsOWtl+S5i+mXtOeahOW7tui/nyAqL1xyXG4gIEBJbnB1dCgpIG5jRGVsYXlNdWx0aXBsZTogbnVtYmVyID0gMDtcclxuICAvKiog5a2Y5Zyo5q+P5Liq5pWw5a2X5LmL6Ze055qE5bu26L+f5pe277yM5pWw5a2X5pa55ZCRICovXHJcbiAgQElucHV0KCkgbmNEaXJlY3Rpb246IE5jRGlyZWN0aW9uVHlwZSA9ICdsZWZ0JztcclxuICAvKiog5q+P5Liq5pWw5a2X5LmL6Ze055qE6Ze06LedICovXHJcbiAgQElucHV0KCkgbmNHYXA6IG51bWJlciA9IDA7XHJcbiAgLyoqIOW8gOWni+WJjeeahOW7tui/nyAqL1xyXG4gIEBJbnB1dCgpIG5jRGVsYXk6IG51bWJlciA9IDA7XHJcbiAgLyoqIOaYr+WQpuWcqOinhuWbvuWPr+ingeaXtuaJjeW8gOWni+WKqOeUuyAqL1xyXG4gIHByaXZhdGUgX3N0YXJ0T25WaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNTdGFydE9uVmlldyh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3N0YXJ0T25WaWV3ID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNTdGFydE9uVmlldygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zdGFydE9uVmlldztcclxuICB9XHJcbiAgLyoqIOaYr+WQpuWPquaJp+ihjOS4gOasoeWKqOeUuyAqL1xyXG4gIHByaXZhdGUgX29uY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY09uY2UodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9vbmNlID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNPbmNlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX29uY2U7XHJcbiAgfVxyXG5cclxuICBkaWdpdHM6IHsgbnVtYmVyczogbnVtYmVyW10sIHRhcmdldFBvc2l0aW9uOiBudW1iZXIsIHN0YXRlOiBzdHJpbmcsIGRlbGF5OiBudW1iZXIgfVtdID0gW107XHJcbiAgcHJpdmF0ZSBvYnNlcnZlcjogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHRpbWVvdXQ6IGFueSA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWyduY1ZhbHVlJ10pIHtcclxuICAgICAgdGhpcy5zdGFydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gICAgaWYgKCF0aGlzLm5jU3RhcnRPblZpZXcpIHtcclxuICAgICAgdGhpcy5wcm9jZXNzVmFsdWUoKTtcclxuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xyXG4gICAgICB9LCB0aGlzLm5jRGVsYXkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4ge1xyXG4gICAgICBpZiAoZW50cmllc1swXS5pc0ludGVyc2VjdGluZykge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc1ZhbHVlKCk7XHJcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XHJcbiAgICAgICAgfSwgdGhpcy5uY0RlbGF5KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmNPbmNlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5vYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmNPbmNlKSB7XHJcbiAgICAgICAgdGhpcy5yZXNldEFuaW1hdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgICB7IHRocmVzaG9sZDogMC4xIH1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJvY2Vzc1ZhbHVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kaWdpdHMgPSBbXTtcclxuICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gdGhpcy5uY1ZhbHVlLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmdWYWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBkaWdpdCA9IHBhcnNlSW50KHN0cmluZ1ZhbHVlW2ldKTtcclxuXHJcbiAgICAgIC8vIOWvueS6juaJgOacieaVsOWtl++8jOmDveeUn+aIkDDliLA555qE5bqP5YiX77yM54S25ZCO5YaN5LuOMOWIsOacgOe7iOaVsOWtl1xyXG4gICAgICBsZXQgbnVtYmVycyA9IFtcclxuICAgICAgICAuLi5BcnJheS5mcm9tKHsgbGVuZ3RoOiAxMCB9LCAoXywgaW5kZXgpID0+IGluZGV4KSxcclxuICAgICAgICAuLi5BcnJheS5mcm9tKHsgbGVuZ3RoOiBkaWdpdCArIDEgfSwgKF8sIGluZGV4KSA9PiBpbmRleClcclxuICAgICAgXTtcclxuXHJcbiAgICAgIGxldCBkZWxheSA9IDA7XHJcbiAgICAgIGlmICh0aGlzLm5jRGlyZWN0aW9uID09PSAnbGVmdCcpIHtcclxuICAgICAgICBkZWxheSA9IChzdHJpbmdWYWx1ZS5sZW5ndGggLSAxIC0gaSkgKiB0aGlzLm5jRGVsYXlNdWx0aXBsZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkZWxheSA9IGkgKiB0aGlzLm5jRGVsYXlNdWx0aXBsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kaWdpdHMucHVzaCh7XHJcbiAgICAgICAgbnVtYmVyczogbnVtYmVycyxcclxuICAgICAgICB0YXJnZXRQb3NpdGlvbjogLShudW1iZXJzLmxlbmd0aCAtIDEpLFxyXG4gICAgICAgIHN0YXRlOiAnaW5pdGlhbCcsXHJcbiAgICAgICAgZGVsYXk6IGRlbGF5XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydEFuaW1hdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuZGlnaXRzLmZvckVhY2goKGRpZ2l0KSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGRpZ2l0LnN0YXRlID0gJ2ZpbmFsJztcclxuICAgICAgfSwgZGlnaXQuZGVsYXkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0QW5pbWF0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudGltZW91dCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcclxuICAgIH1cclxuICAgIHRoaXMuZGlnaXRzLmZvckVhY2goZGlnaXQgPT4ge1xyXG4gICAgICBkaWdpdC5zdGF0ZSA9ICdpbml0aWFsJztcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibnVtYmVyLWNvdW50ZXItY29udGFpbmVyXCIgW25nQ2xhc3NdPVwieydnYXAteCc6IG5jR2FwID4gMH1cIiBbc3R5bGUuLS1nYXAucHhdPVwibmNHYXBcIj5cbiAgPGRpdiBjbGFzcz1cImRpZ2l0LXdyYXBwZXJcIiAqbmdGb3I9XCJsZXQgZGlnaXQgb2YgZGlnaXRzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgPGRpdiBjbGFzcz1cImRpZ2l0cy1zdHJpcFwiXG4gICAgICBbQGNvdW50QW5pbWF0aW9uXT1cInt2YWx1ZTogZGlnaXQuc3RhdGUsIHBhcmFtczoge2R1cmF0aW9uOiBuY0R1cmF0aW9uLCBkZWxheTogZGlnaXQuZGVsYXksIGZpbmFsUG9zaXRpb246IGRpZ2l0LnRhcmdldFBvc2l0aW9ufX1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkaWdpdFwiICpuZ0Zvcj1cImxldCBudW0gb2YgZGlnaXQubnVtYmVyc1wiPnt7bnVtfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=