ng-cw-v12
Version:
Angular UI Component Library
117 lines • 22.1 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./local.service";
import * as i2 from "@angular/common";
export class TimelineComponent {
constructor(ls) {
this.ls = ls;
/** 时间轴数据 */
this.ncDate = []; //['2022-03-01', '2022-06-11', '2023-04-10', '2023-12-22', '2024-02-27', '2024-05-11']
/** 方向 */
this.ncMode = 'horizontal';
/** 当前选中index,可双向绑定 */
this.ncSelected = -1;
/** 主轴线颜色 */
this.ncAxisColor = '#969696';
/** 时间轴项颜色 */
this.ncItemColor = '#969696';
/** 时间轴项悬停颜色 */
this.ncItemHoverColor = '#ffbc02';
/** 时间轴项选中颜色 */
this.ncItemSelectedColor = '#ff3918';
/** 刻度颜色 */
this.ncScaleColor = '#969696';
/** 刻度文字颜色 */
this.ncScaleTextColor = '#8e8e8e';
/** 选中项改变事件 */
this.ncSelectedChange = new EventEmitter();
/** 点击事件 */
this.ncClick = new EventEmitter();
this.scaleArr = [];
this.dateObjectArr = [];
this.scaleObjectArr = [];
}
ngOnChanges(changes) {
if (changes['ncDate']) {
this.init();
}
}
init() {
//时间值
this.dateObjectArr = this.setLeftValue(this.ncDate);
//刻度值
this.scaleArr = [this.ncDate[0], this.ncDate[this.ncDate.length - 1]]; //['2022-03-01', '2024-05-11']
this.scaleArr = this.scaleArr.map(date => new Date(date));
let minYear = Math.min(...this.scaleArr.map(date => date.getFullYear())); //2022
let maxYear = Math.max(...this.scaleArr.map(date => date.getFullYear())); //2024
//插入year-01-01,'2023-01-01', '2024-01-01'
for (let year = minYear + 1; year <= maxYear; year++) {
let newYearDate = new Date(`${year}-01-01`);
this.scaleArr.push(newYearDate);
}
//排序
this.scaleArr.sort((a, b) => a - b);
//转化为字符串
this.scaleArr = this.scaleArr.map(date => this.ls.formatDate('yyyy-MM-dd', date)); //['2022-03-01','2023-01-01', '2024-01-01', '2024-05-11']
//获取left值
this.scaleObjectArr = this.setLeftValue(this.scaleArr);
//截取年份
for (let item of this.scaleObjectArr) {
item.date = item.date.substring(0, 4);
}
//删除用于计算的首尾值
this.scaleObjectArr.splice(0, 1);
this.scaleObjectArr.splice(this.scaleObjectArr.length - 1, 1);
}
//获取定位left值
setLeftValue(arr) {
let all = this.ls.getRangeDate(new Date(arr[0]), new Date(arr[arr.length - 1])).length;
let leftArr = [];
for (let i = 0; i < arr.length; i++) {
let value = i == 0 ? 0 : this.ls.getRangeDate(new Date(arr[0]), new Date(arr[i])).length;
leftArr.push({
date: arr[i],
left: this.ls.retainPercentDecimal(value / all, 2)
});
}
return leftArr;
}
itemClick(date, index) {
this.ncClick.emit({ date, index });
this.ncSelected = index;
this.ncSelectedChange.emit(this.ncSelected);
}
}
TimelineComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TimelineComponent, deps: [{ token: i1.LocalService }], target: i0.ɵɵFactoryTarget.Component });
TimelineComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: TimelineComponent, selector: "nc-timeline", inputs: { ncDate: "ncDate", ncMode: "ncMode", ncSelected: "ncSelected", ncAxisColor: "ncAxisColor", ncItemColor: "ncItemColor", ncItemHoverColor: "ncItemHoverColor", ncItemSelectedColor: "ncItemSelectedColor", ncScaleColor: "ncScaleColor", ncScaleTextColor: "ncScaleTextColor" }, outputs: { ncSelectedChange: "ncSelectedChange", ncClick: "ncClick" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"timeline-container-horizontal\" *ngIf=\"ncMode == 'horizontal'\" style=\"--item-hover-color: {{ncItemHoverColor}}\">\r\n <div class=\"timeline\" [ngStyle]=\"{'border-bottom-color': ncAxisColor}\">\r\n <div class=\"timeline-item\" [class.timeline-item-selected]=\"ncSelected == i\"\r\n *ngFor=\"let item of dateObjectArr;let i = index;\" (click)=\"itemClick(ncDate[i], i)\"\r\n [ngStyle]=\"{'left': i == 0 ? '0' : 'calc(' + item.left + '%' + ' - 2px)', 'background-color': ncSelected == i ? ncItemSelectedColor : ncItemColor}\" [title]=\"ncDate[i]\">\r\n </div>\r\n <div class=\"scale\" *ngFor=\"let item of scaleObjectArr;let i = index;\"\r\n [ngStyle]=\"{'left': 'calc(' + item.left + '%' + ' - 2px)', 'background-color': ncScaleColor}\">\r\n </div>\r\n <div class=\"scale-value\" *ngFor=\"let item of scaleObjectArr;let i = index;\"\r\n [ngStyle]=\"{'left': 'calc(' + item.left + '%' + ' - 16px)', 'color': ncScaleTextColor}\">\r\n {{item.date}}\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"timeline-container-vertical\" *ngIf=\"ncMode == 'vertical'\" style=\"--item-hover-color: {{ncItemHoverColor}}\">\r\n <div class=\"timeline\" [ngStyle]=\"{'border-left-color': ncAxisColor}\">\r\n <div class=\"timeline-item\" [class.timeline-item-selected]=\"ncSelected == i\"\r\n *ngFor=\"let item of dateObjectArr;let i = index;\" (click)=\"itemClick(ncDate[i], i)\"\r\n [ngStyle]=\"{'top': i == 0 ? '0' : 'calc(' + item.left + '%' + ' - 2px)', 'background-color': ncSelected == i ? ncItemSelectedColor : ncItemColor}\" [title]=\"ncDate[i]\">\r\n </div>\r\n <div class=\"scale\" *ngFor=\"let item of scaleObjectArr;let i = index;\"\r\n [ngStyle]=\"{'top': 'calc(' + item.left + '%' + ' - 2px)', 'background-color': ncScaleColor}\">\r\n </div>\r\n <div class=\"scale-value\" *ngFor=\"let item of scaleObjectArr;let i = index;\"\r\n [ngStyle]=\"{'top': 'calc(' + item.left + '%' + ' - 12px)', 'color': ncScaleTextColor}\">\r\n {{item.date}}\r\n </div>\r\n </div>\r\n</div>", styles: [".timeline-container-horizontal{width:100%;height:100%;padding:20px}.timeline-container-horizontal .timeline{width:100%;height:100%;border-bottom:2px solid;display:flex;position:relative}.timeline-container-horizontal .timeline .timeline-item{position:absolute;bottom:0;width:2px;height:100%;cursor:pointer}.timeline-container-horizontal .timeline .timeline-item:hover{background-color:var(--item-hover-color)!important}.timeline-container-horizontal .timeline .scale{position:absolute;bottom:-6px;width:2px;height:6px}.timeline-container-horizontal .timeline .scale-value{position:absolute;bottom:-24px}.timeline-container-vertical{width:100%;height:100%;padding:20px 20px 20px 40px}.timeline-container-vertical .timeline{width:100%;height:100%;border-left:2px solid;display:flex;position:relative}.timeline-container-vertical .timeline .timeline-item{position:absolute;left:0;height:2px;width:100%;cursor:pointer}.timeline-container-vertical .timeline .timeline-item:hover{background-color:var(--item-hover-color)!important}.timeline-container-vertical .timeline .scale{position:absolute;left:-6px;height:2px;width:6px}.timeline-container-vertical .timeline .scale-value{position:absolute;left:-38px}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TimelineComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-timeline',
templateUrl: './timeline.component.html',
styleUrls: ['./timeline.component.less']
}]
}], ctorParameters: function () { return [{ type: i1.LocalService }]; }, propDecorators: { ncDate: [{
type: Input
}], ncMode: [{
type: Input
}], ncSelected: [{
type: Input
}], ncAxisColor: [{
type: Input
}], ncItemColor: [{
type: Input
}], ncItemHoverColor: [{
type: Input
}], ncItemSelectedColor: [{
type: Input
}], ncScaleColor: [{
type: Input
}], ncScaleTextColor: [{
type: Input
}], ncSelectedChange: [{
type: Output
}], ncClick: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy90aW1lbGluZS90aW1lbGluZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3RpbWVsaW5lL3RpbWVsaW5lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDOzs7O0FBVWpHLE1BQU0sT0FBTyxpQkFBaUI7SUE0QjVCLFlBQW9CLEVBQWdCO1FBQWhCLE9BQUUsR0FBRixFQUFFLENBQWM7UUEzQnBDLFlBQVk7UUFDSCxXQUFNLEdBQVUsRUFBRSxDQUFDLENBQUEsc0ZBQXNGO1FBQ2xILFNBQVM7UUFDQSxXQUFNLEdBQWUsWUFBWSxDQUFDO1FBQzNDLHNCQUFzQjtRQUNiLGVBQVUsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUNqQyxZQUFZO1FBQ0gsZ0JBQVcsR0FBVyxTQUFTLENBQUM7UUFDekMsYUFBYTtRQUNKLGdCQUFXLEdBQVcsU0FBUyxDQUFDO1FBQ3pDLGVBQWU7UUFDTixxQkFBZ0IsR0FBVyxTQUFTLENBQUM7UUFDOUMsZUFBZTtRQUNOLHdCQUFtQixHQUFXLFNBQVMsQ0FBQztRQUNqRCxXQUFXO1FBQ0YsaUJBQVksR0FBVyxTQUFTLENBQUM7UUFDMUMsYUFBYTtRQUNKLHFCQUFnQixHQUFXLFNBQVMsQ0FBQztRQUM5QyxjQUFjO1FBQ0oscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRCxXQUFXO1FBQ0QsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFdkMsYUFBUSxHQUFlLEVBQUUsQ0FBQztRQUMxQixrQkFBYSxHQUFlLEVBQUUsQ0FBQztRQUMvQixtQkFBYyxHQUFlLEVBQUUsQ0FBQztJQUVR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QUFDO2lCQUN6QzttR0FHVSxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUksZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUVHLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExvY2FsU2VydmljZSB9IGZyb20gJy4vbG9jYWwuc2VydmljZSc7XHJcblxyXG5leHBvcnQgdHlwZSBOY01vZGVUeXBlID0gJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmMtdGltZWxpbmUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90aW1lbGluZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGltZWxpbmUuY29tcG9uZW50Lmxlc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGltZWxpbmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIC8qKiDml7bpl7TovbTmlbDmja4gKi9cclxuICBASW5wdXQoKSBuY0RhdGU6IGFueVtdID0gW107Ly9bJzIwMjItMDMtMDEnLCAnMjAyMi0wNi0xMScsICcyMDIzLTA0LTEwJywgJzIwMjMtMTItMjInLCAnMjAyNC0wMi0yNycsICcyMDI0LTA1LTExJ11cclxuICAvKiog5pa55ZCRICovXHJcbiAgQElucHV0KCkgbmNNb2RlOiBOY01vZGVUeXBlID0gJ2hvcml6b250YWwnO1xyXG4gIC8qKiDlvZPliY3pgInkuK1pbmRleO+8jOWPr+WPjOWQkee7keWumiAqL1xyXG4gIEBJbnB1dCgpIG5jU2VsZWN0ZWQ6IG51bWJlciA9IC0xO1xyXG4gIC8qKiDkuLvovbTnur/popzoibIgKi9cclxuICBASW5wdXQoKSBuY0F4aXNDb2xvcjogc3RyaW5nID0gJyM5Njk2OTYnO1xyXG4gIC8qKiDml7bpl7TovbTpobnpopzoibIgKi9cclxuICBASW5wdXQoKSBuY0l0ZW1Db2xvcjogc3RyaW5nID0gJyM5Njk2OTYnO1xyXG4gIC8qKiDml7bpl7TovbTpobnmgqzlgZzpopzoibIgKi9cclxuICBASW5wdXQoKSBuY0l0ZW1Ib3ZlckNvbG9yOiBzdHJpbmcgPSAnI2ZmYmMwMic7XHJcbiAgLyoqIOaXtumXtOi9tOmhuemAieS4reminOiJsiAqL1xyXG4gIEBJbnB1dCgpIG5jSXRlbVNlbGVjdGVkQ29sb3I6IHN0cmluZyA9ICcjZmYzOTE4JztcclxuICAvKiog5Yi75bqm6aKc6ImyICovXHJcbiAgQElucHV0KCkgbmNTY2FsZUNvbG9yOiBzdHJpbmcgPSAnIzk2OTY5Nic7XHJcbiAgLyoqIOWIu+W6puaWh+Wtl+minOiJsiAqL1xyXG4gIEBJbnB1dCgpIG5jU2NhbGVUZXh0Q29sb3I6IHN0cmluZyA9ICcjOGU4ZThlJztcclxuICAvKiog6YCJ5Lit6aG55pS55Y+Y5LqL5Lu2ICovXHJcbiAgQE91dHB1dCgpIG5jU2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgLyoqIOeCueWHu+S6i+S7tiAqL1xyXG4gIEBPdXRwdXQoKSBuY0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBzY2FsZUFycjogQXJyYXk8YW55PiA9IFtdO1xyXG4gIGRhdGVPYmplY3RBcnI6IEFycmF5PGFueT4gPSBbXTtcclxuICBzY2FsZU9iamVjdEFycjogQXJyYXk8YW55PiA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxzOiBMb2NhbFNlcnZpY2UpIHsgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snbmNEYXRlJ10pIHtcclxuICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0KCkge1xyXG4gICAgLy/ml7bpl7TlgLxcclxuICAgIHRoaXMuZGF0ZU9iamVjdEFyciA9IHRoaXMuc2V0TGVmdFZhbHVlKHRoaXMubmNEYXRlKTtcclxuXHJcbiAgICAvL+WIu+W6puWAvFxyXG4gICAgdGhpcy5zY2FsZUFyciA9IFt0aGlzLm5jRGF0ZVswXSwgdGhpcy5uY0RhdGVbdGhpcy5uY0RhdGUubGVuZ3RoIC0gMV1dOy8vWycyMDIyLTAzLTAxJywgJzIwMjQtMDUtMTEnXVxyXG4gICAgdGhpcy5zY2FsZUFyciA9IHRoaXMuc2NhbGVBcnIubWFwKGRhdGUgPT4gbmV3IERhdGUoZGF0ZSkpO1xyXG4gICAgbGV0IG1pblllYXIgPSBNYXRoLm1pbiguLi50aGlzLnNjYWxlQXJyLm1hcChkYXRlID0+IGRhdGUuZ2V0RnVsbFllYXIoKSkpOy8vMjAyMlxyXG4gICAgbGV0IG1heFllYXIgPSBNYXRoLm1heCguLi50aGlzLnNjYWxlQXJyLm1hcChkYXRlID0+IGRhdGUuZ2V0RnVsbFllYXIoKSkpOy8vMjAyNFxyXG4gICAgLy/mj5LlhaV5ZWFyLTAxLTAx77yMJzIwMjMtMDEtMDEnLCAnMjAyNC0wMS0wMSdcclxuICAgIGZvciAobGV0IHllYXIgPSBtaW5ZZWFyICsgMTsgeWVhciA8PSBtYXhZZWFyOyB5ZWFyKyspIHtcclxuICAgICAgbGV0IG5ld1llYXJEYXRlID0gbmV3IERhdGUoYCR7eWVhcn0tMDEtMDFgKTtcclxuICAgICAgdGhpcy5zY2FsZUFyci5wdXNoKG5ld1llYXJEYXRlKTtcclxuICAgIH1cclxuICAgIC8v5o6S5bqPXHJcbiAgICB0aGlzLnNjYWxlQXJyLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcclxuICAgIC8v6L2s5YyW5Li65a2X56ym5LiyXHJcbiAgICB0aGlzLnNjYWxlQXJyID0gdGhpcy5zY2FsZUFyci5tYXAoZGF0ZSA9PiB0aGlzLmxzLmZvcm1hdERhdGUoJ3l5eXktTU0tZGQnLCBkYXRlKSk7Ly9bJzIwMjItMDMtMDEnLCcyMDIzLTAxLTAxJywgJzIwMjQtMDEtMDEnLCAnMjAyNC0wNS0xMSddXHJcbiAgICAvL+iOt+WPlmxlZnTlgLxcclxuICAgIHRoaXMuc2NhbGVPYmplY3RBcnIgPSB0aGlzLnNldExlZnRWYWx1ZSh0aGlzLnNjYWxlQXJyKTtcclxuICAgIC8v5oiq5Y+W5bm05Lu9XHJcbiAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuc2NhbGVPYmplY3RBcnIpIHtcclxuICAgICAgaXRlbS5kYXRlID0gaXRlbS5kYXRlLnN1YnN0cmluZygwLCA0KTtcclxuICAgIH1cclxuICAgIC8v5Yig6Zmk55So5LqO6K6h566X55qE6aaW5bC+5YC8XHJcbiAgICB0aGlzLnNjYWxlT2JqZWN0QXJyLnNwbGljZSgwLCAxKTtcclxuICAgIHRoaXMuc2NhbGVPYmplY3RBcnIuc3BsaWNlKHRoaXMuc2NhbGVPYmplY3RBcnIubGVuZ3RoIC0gMSwgMSk7XHJcbiAgfVxyXG5cclxuICAvL+iOt+WPluWumuS9jWxlZnTlgLxcclxuICBzZXRMZWZ0VmFsdWUoYXJyOiBBcnJheTxhbnk+KSB7XHJcbiAgICBsZXQgYWxsID0gdGhpcy5scy5nZXRSYW5nZURhdGUobmV3IERhdGUoYXJyWzBdKSwgbmV3IERhdGUoYXJyW2Fyci5sZW5ndGggLSAxXSkpLmxlbmd0aDtcclxuICAgIGxldCBsZWZ0QXJyOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdmFsdWUgPSBpID09IDAgPyAwIDogdGhpcy5scy5nZXRSYW5nZURhdGUobmV3IERhdGUoYXJyWzBdKSwgbmV3IERhdGUoYXJyW2ldKSkubGVuZ3RoO1xyXG4gICAgICBsZWZ0QXJyLnB1c2goe1xyXG4gICAgICAgIGRhdGU6IGFycltpXSxcclxuICAgICAgICBsZWZ0OiB0aGlzLmxzLnJldGFpblBlcmNlbnREZWNpbWFsKHZhbHVlIC8gYWxsLCAyKVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBsZWZ0QXJyO1xyXG4gIH1cclxuXHJcbiAgaXRlbUNsaWNrKGRhdGU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5uY0NsaWNrLmVtaXQoeyBkYXRlLCBpbmRleCB9KTtcclxuICAgIHRoaXMubmNTZWxlY3RlZCA9IGluZGV4O1xyXG4gICAgdGhpcy5uY1NlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5uY1NlbGVjdGVkKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInRpbWVsaW5lLWNvbnRhaW5lci1ob3Jpem9udGFsXCIgKm5nSWY9XCJuY01vZGUgPT0gJ2hvcml6b250YWwnXCIgc3R5bGU9XCItLWl0ZW0taG92ZXItY29sb3I6IHt7bmNJdGVtSG92ZXJDb2xvcn19XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGltZWxpbmVcIiBbbmdTdHlsZV09XCJ7J2JvcmRlci1ib3R0b20tY29sb3InOiBuY0F4aXNDb2xvcn1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZWxpbmUtaXRlbVwiIFtjbGFzcy50aW1lbGluZS1pdGVtLXNlbGVjdGVkXT1cIm5jU2VsZWN0ZWQgPT0gaVwiXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGVPYmplY3RBcnI7bGV0IGkgPSBpbmRleDtcIiAoY2xpY2spPVwiaXRlbUNsaWNrKG5jRGF0ZVtpXSwgaSlcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2xlZnQnOiBpID09IDAgPyAnMCcgOiAnY2FsYygnICsgaXRlbS5sZWZ0ICsgJyUnICsgJyAtIDJweCknLCAnYmFja2dyb3VuZC1jb2xvcic6IG5jU2VsZWN0ZWQgPT0gaSA/IG5jSXRlbVNlbGVjdGVkQ29sb3IgOiBuY0l0ZW1Db2xvcn1cIiBbdGl0bGVdPVwibmNEYXRlW2ldXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNjYWxlXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2NhbGVPYmplY3RBcnI7bGV0IGkgPSBpbmRleDtcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2xlZnQnOiAnY2FsYygnICsgaXRlbS5sZWZ0ICsgJyUnICsgJyAtIDJweCknLCAnYmFja2dyb3VuZC1jb2xvcic6IG5jU2NhbGVDb2xvcn1cIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2NhbGUtdmFsdWVcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzY2FsZU9iamVjdEFycjtsZXQgaSA9IGluZGV4O1wiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnbGVmdCc6ICdjYWxjKCcgKyBpdGVtLmxlZnQgKyAnJScgKyAnIC0gMTZweCknLCAnY29sb3InOiBuY1NjYWxlVGV4dENvbG9yfVwiPlxyXG4gICAgICAgICAgICB7e2l0ZW0uZGF0ZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwidGltZWxpbmUtY29udGFpbmVyLXZlcnRpY2FsXCIgKm5nSWY9XCJuY01vZGUgPT0gJ3ZlcnRpY2FsJ1wiIHN0eWxlPVwiLS1pdGVtLWhvdmVyLWNvbG9yOiB7e25jSXRlbUhvdmVyQ29sb3J9fVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lXCIgW25nU3R5bGVdPVwieydib3JkZXItbGVmdC1jb2xvcic6IG5jQXhpc0NvbG9yfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lbGluZS1pdGVtXCIgW2NsYXNzLnRpbWVsaW5lLWl0ZW0tc2VsZWN0ZWRdPVwibmNTZWxlY3RlZCA9PSBpXCJcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0ZU9iamVjdEFycjtsZXQgaSA9IGluZGV4O1wiIChjbGljayk9XCJpdGVtQ2xpY2sobmNEYXRlW2ldLCBpKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsndG9wJzogaSA9PSAwID8gJzAnIDogJ2NhbGMoJyArIGl0ZW0ubGVmdCArICclJyArICcgLSAycHgpJywgJ2JhY2tncm91bmQtY29sb3InOiBuY1NlbGVjdGVkID09IGkgPyBuY0l0ZW1TZWxlY3RlZENvbG9yIDogbmNJdGVtQ29sb3J9XCIgW3RpdGxlXT1cIm5jRGF0ZVtpXVwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzY2FsZVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNjYWxlT2JqZWN0QXJyO2xldCBpID0gaW5kZXg7XCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyd0b3AnOiAnY2FsYygnICsgaXRlbS5sZWZ0ICsgJyUnICsgJyAtIDJweCknLCAnYmFja2dyb3VuZC1jb2xvcic6IG5jU2NhbGVDb2xvcn1cIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2NhbGUtdmFsdWVcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzY2FsZU9iamVjdEFycjtsZXQgaSA9IGluZGV4O1wiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsndG9wJzogJ2NhbGMoJyArIGl0ZW0ubGVmdCArICclJyArICcgLSAxMnB4KScsICdjb2xvcic6IG5jU2NhbGVUZXh0Q29sb3J9XCI+XHJcbiAgICAgICAgICAgIHt7aXRlbS5kYXRlfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=