ng-devui
Version:
DevUI components based on Angular
193 lines • 36 kB
JavaScript
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild } from '@angular/core';
import { chunk } from 'lodash-es';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { DatepickerProService } from '../datepicker-pro.service';
import * as i0 from "@angular/core";
import * as i1 from "../datepicker-pro.service";
import * as i2 from "@angular/common";
import * as i3 from "@angular/cdk/scrolling";
export class YearPanelComponent {
get curHoverDate() {
return this.pickerSrv.curHoverDate;
}
set curHoverDate(value) {
this.pickerSrv.curHoverDate = value;
}
get currentDate() {
if (this.isRangeType) {
if (this.pickerSrv.currentActiveInput === 'start') {
return this.pickerSrv.curRangeDate[0];
}
else if (this.pickerSrv.currentActiveInput === 'end') {
return this.pickerSrv.curRangeDate[1];
}
}
else {
return this.pickerSrv.curDate;
}
}
set currentDate(value) {
if (this.isRangeType) {
if (this.pickerSrv.currentActiveInput === 'start') {
this.pickerSrv.curRangeDate[0] = value;
}
else if (this.pickerSrv.currentActiveInput === 'end') {
this.pickerSrv.curRangeDate[1] = value;
}
}
else {
this.pickerSrv.curDate = value;
}
}
constructor(cdr, pickerSrv) {
this.cdr = cdr;
this.pickerSrv = pickerSrv;
this.isRangeType = false;
this.yearList = [];
this.unsubscribe$ = new Subject();
}
ngOnInit() {
this.initYearList();
this.initObservable();
}
initObservable() {
this.pickerSrv.toggleEvent.subscribe((isOpen) => {
if (isOpen) {
setTimeout(() => {
this.goToYear(this.currentDate || new Date());
});
}
});
this.pickerSrv.updateDateValue.pipe(takeUntil(this.unsubscribe$)).subscribe((res) => {
if (res.type === 'range') {
this.pickerSrv.curRangeDate = res.value;
}
else {
this.pickerSrv.curDate = res.value;
}
this.goToYear(this.currentDate || new Date());
});
this.pickerSrv.activeInputChange.pipe(takeUntil(this.unsubscribe$)).subscribe((type) => {
if (type === 'start') {
this.goToYear(this.pickerSrv.curRangeDate[0] || this.pickerSrv.curRangeDate[1] || new Date());
}
else {
this.goToYear(this.pickerSrv.curRangeDate[1] || this.pickerSrv.curRangeDate[0] || new Date());
}
});
}
initYearList() {
const list = new Array(this.pickerSrv.calendarRange[1] - this.pickerSrv.calendarRange[0] + 1).fill(1).map((t, i) => {
return i + this.pickerSrv.calendarRange[0];
});
this.yearList = chunk(list, 3);
}
goToYear(date) {
if (date) {
const index = Math.floor((date.getFullYear() - this.pickerSrv.calendarRange[0]) / 3);
this.scrollListCmp.scrollToIndex(index - 1);
}
this.cdr.detectChanges();
}
isThisYear(yearIndex) {
return yearIndex === new Date().getFullYear();
}
isActiveYear(yearIndex) {
return this.pickerSrv.isYearActive(yearIndex);
}
isStartDate(yearIndex) {
if (!this.isRangeType) {
return false;
}
const date = new Date(yearIndex, 0, 1);
return this.pickerSrv.isStartDate(date);
}
isEndDate(yearIndex) {
if (!this.isRangeType) {
return false;
}
const date = new Date(yearIndex, 0, 1);
return this.pickerSrv.isEndDate(date);
}
isDateAbandon(yearIndex) {
if (!this.isRangeType || !this.pickerSrv.curRangeDate[0] || !this.pickerSrv.curRangeDate[1]) {
return false;
}
const date = new Date(yearIndex, 0, 1);
return this.pickerSrv.isDateAbandon(date);
}
isActiveTypeDate(yearIndex) {
if (!this.isRangeType) {
return false;
}
const date = new Date(yearIndex, 0, 1);
return this.pickerSrv.isActiveInputTypeDate(date);
}
isDateInRange(yearIndex) {
const date = new Date(yearIndex, 0, 1);
return this.pickerSrv.isDateInRange(date);
}
isDateInSelectRange(yearIndex) {
if (!this.isRangeType) {
return false;
}
const date = new Date(yearIndex, 0, 1);
return this.pickerSrv.isDateInSelectRange(date);
}
selectYear(yearIndex) {
if (this.isDisable(yearIndex)) {
return;
}
this.currentDate = new Date(yearIndex, 0, 1);
if (this.isRangeType) {
this.pickerSrv.fixRangeDate();
}
// 非时间模式下选完开始日期跳转到结束日期
if (this.isRangeType) {
if (this.pickerSrv.currentActiveInput === 'start') {
this.pickerSrv.currentActiveInput = 'end';
}
else if (this.pickerSrv.currentActiveInput === 'end' && !this.pickerSrv.curRangeDate[0]) {
this.pickerSrv.currentActiveInput = 'start';
}
else {
this.pickerSrv.closeDropdownEvent.next(false);
}
}
this.pickerSrv.selectedDateChange.next({
type: this.isRangeType ? 'range' : 'single',
value: this.isRangeType ? this.pickerSrv.curRangeDate : this.currentDate,
});
if (this.pickerSrv.closeAfterSelected) {
this.pickerSrv.closeDropdownEvent.next(false);
}
}
isDisable(yearIndex) {
const date = new Date(yearIndex, 0, 1);
return this.pickerSrv.maxDate.getTime() < date.getTime() || this.pickerSrv.minDate.getTime() > date.getTime();
}
setHoverTarget(yearIndex) {
const date = new Date(yearIndex, 0, 1);
if (this.isRangeType && !this.isDisable(yearIndex)) {
this.curHoverDate = date;
}
}
ngOnDestroy() {
this.unsubscribe$.next();
this.unsubscribe$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YearPanelComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DatepickerProService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: YearPanelComponent, selector: "d-year-panel", inputs: { isRangeType: "isRangeType" }, viewQueries: [{ propertyName: "scrollListCmp", first: true, predicate: ["scrollList"], descendants: true }], ngImport: i0, template: "<div class=\"year-list-panel\" (mouseleave)=\"curHoverDate = null\">\n <cdk-virtual-scroll-viewport #scrollList [itemSize]=\"48\" class=\"devui-year-list\" minBufferPx=\"400\" maxBufferPx=\"600\">\n <div class=\"devui-year-list-item\" *cdkVirtualFor=\"let years of yearList; let index = index\">\n <p\n class=\"devui-year-title\"\n [ngClass]=\"{\n 'devui-this-year': isThisYear(year),\n 'devui-active-year': isActiveYear(year),\n 'devui-disabled': isDisable(year),\n 'devui-table-date-inrange': isDateInRange(year),\n 'devui-table-date-start': isStartDate(year),\n 'devui-table-date-end': isEndDate(year),\n 'devui-table-date-abandon-selected': isDateAbandon(year),\n 'devui-table-date-in-selected-range': isDateInSelectRange(year),\n 'devui-table-date-active-type': isActiveTypeDate(year)\n }\"\n (click)=\"selectYear(year)\"\n (mouseenter)=\"setHoverTarget(year)\"\n *ngFor=\"let year of years\"\n >\n {{ year }}\n </p>\n </div>\n </cdk-virtual-scroll-viewport>\n</div>\n", styles: [".year-list-panel{width:204px;height:200px;padding:8px 12px}.year-list-panel .devui-year-list{width:184px;height:186px}.year-list-panel .devui-year-list::-webkit-scrollbar{width:0}.year-list-panel .devui-year-list:hover{overflow-y:overlay}.year-list-panel .devui-year-list:hover::-webkit-scrollbar{width:4px}.year-list-panel .devui-year-list .devui-year-list-item{padding:4px 0;height:48px}.year-list-panel .devui-year-list .devui-year-title{width:60px;height:40px;float:left;font-size:12px;display:block;text-align:center;line-height:40px;cursor:pointer;border-radius:var(--devui-border-radius-feedback, 4px)}.year-list-panel .devui-year-list .devui-year-title:hover:not(.devui-active-year):not(.devui-disabled){background-color:var(--devui-list-item-hover-bg, #f2f2f3)}.year-list-panel .devui-year-list .devui-year-title.devui-this-year{color:var(--devui-brand, #0a59f7)}.year-list-panel .devui-year-list .devui-year-title.devui-active-year{background:var(--devui-list-item-active-bg, #cedefd);color:var(--devui-list-item-active-text, #000000)}.year-list-panel .devui-year-list .devui-year-title.devui-active-year.devui-table-date-abandon-selected{background:var(--devui-primary-disabled, #9dbdfc)}.year-list-panel .devui-year-list .devui-year-title.devui-table-date-inrange:not(.devui-active-year){background-color:var(--devui-list-item-hover-bg, #f2f2f3);border-radius:0}.year-list-panel .devui-year-list .devui-year-title.devui-table-date-start:not(.devui-table-date-end){border-radius:var(--devui-border-radius-feedback, 4px) 0 0 var(--devui-border-radius-feedback, 4px)}.year-list-panel .devui-year-list .devui-year-title.devui-table-date-end:not(.devui-table-date-start){border-radius:0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0}.year-list-panel .devui-year-list .devui-year-title.devui-table-date-in-selected-range:not(.devui-table-date-inrange):not(:hover){background-color:var(--devui-disabled-bg, #f3f3f3);border-radius:0}.year-list-panel .devui-year-list .devui-year-title.devui-table-date-active-type:not(.devui-table-date-abandon-selected){animation:2s ease 0s infinite normal both breath-animation}@keyframes breath-animation{0%{box-shadow:0 0 0 var(--devui-list-item-active-bg, #cedefd)}50%{box-shadow:0 0 8px var(--devui-list-item-active-bg, #cedefd)}to{box-shadow:0 0 0 var(--devui-list-item-active-bg, #cedefd)}}.year-list-panel .devui-year-list .devui-year-title.devui-disabled{border-radius:0;cursor:not-allowed}.year-list-panel .devui-year-list .devui-year-title.devui-disabled:first-of-type{border-radius:var(--devui-border-radius-feedback, 4px) 0 0 var(--devui-border-radius-feedback, 4px)}.year-list-panel .devui-year-list .devui-year-title.devui-disabled:last-of-type{border-radius:0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i3.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YearPanelComponent, decorators: [{
type: Component,
args: [{ selector: 'd-year-panel', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"year-list-panel\" (mouseleave)=\"curHoverDate = null\">\n <cdk-virtual-scroll-viewport #scrollList [itemSize]=\"48\" class=\"devui-year-list\" minBufferPx=\"400\" maxBufferPx=\"600\">\n <div class=\"devui-year-list-item\" *cdkVirtualFor=\"let years of yearList; let index = index\">\n <p\n class=\"devui-year-title\"\n [ngClass]=\"{\n 'devui-this-year': isThisYear(year),\n 'devui-active-year': isActiveYear(year),\n 'devui-disabled': isDisable(year),\n 'devui-table-date-inrange': isDateInRange(year),\n 'devui-table-date-start': isStartDate(year),\n 'devui-table-date-end': isEndDate(year),\n 'devui-table-date-abandon-selected': isDateAbandon(year),\n 'devui-table-date-in-selected-range': isDateInSelectRange(year),\n 'devui-table-date-active-type': isActiveTypeDate(year)\n }\"\n (click)=\"selectYear(year)\"\n (mouseenter)=\"setHoverTarget(year)\"\n *ngFor=\"let year of years\"\n >\n {{ year }}\n </p>\n </div>\n </cdk-virtual-scroll-viewport>\n</div>\n", styles: [".year-list-panel{width:204px;height:200px;padding:8px 12px}.year-list-panel .devui-year-list{width:184px;height:186px}.year-list-panel .devui-year-list::-webkit-scrollbar{width:0}.year-list-panel .devui-year-list:hover{overflow-y:overlay}.year-list-panel .devui-year-list:hover::-webkit-scrollbar{width:4px}.year-list-panel .devui-year-list .devui-year-list-item{padding:4px 0;height:48px}.year-list-panel .devui-year-list .devui-year-title{width:60px;height:40px;float:left;font-size:12px;display:block;text-align:center;line-height:40px;cursor:pointer;border-radius:var(--devui-border-radius-feedback, 4px)}.year-list-panel .devui-year-list .devui-year-title:hover:not(.devui-active-year):not(.devui-disabled){background-color:var(--devui-list-item-hover-bg, #f2f2f3)}.year-list-panel .devui-year-list .devui-year-title.devui-this-year{color:var(--devui-brand, #0a59f7)}.year-list-panel .devui-year-list .devui-year-title.devui-active-year{background:var(--devui-list-item-active-bg, #cedefd);color:var(--devui-list-item-active-text, #000000)}.year-list-panel .devui-year-list .devui-year-title.devui-active-year.devui-table-date-abandon-selected{background:var(--devui-primary-disabled, #9dbdfc)}.year-list-panel .devui-year-list .devui-year-title.devui-table-date-inrange:not(.devui-active-year){background-color:var(--devui-list-item-hover-bg, #f2f2f3);border-radius:0}.year-list-panel .devui-year-list .devui-year-title.devui-table-date-start:not(.devui-table-date-end){border-radius:var(--devui-border-radius-feedback, 4px) 0 0 var(--devui-border-radius-feedback, 4px)}.year-list-panel .devui-year-list .devui-year-title.devui-table-date-end:not(.devui-table-date-start){border-radius:0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0}.year-list-panel .devui-year-list .devui-year-title.devui-table-date-in-selected-range:not(.devui-table-date-inrange):not(:hover){background-color:var(--devui-disabled-bg, #f3f3f3);border-radius:0}.year-list-panel .devui-year-list .devui-year-title.devui-table-date-active-type:not(.devui-table-date-abandon-selected){animation:2s ease 0s infinite normal both breath-animation}@keyframes breath-animation{0%{box-shadow:0 0 0 var(--devui-list-item-active-bg, #cedefd)}50%{box-shadow:0 0 8px var(--devui-list-item-active-bg, #cedefd)}to{box-shadow:0 0 0 var(--devui-list-item-active-bg, #cedefd)}}.year-list-panel .devui-year-list .devui-year-title.devui-disabled{border-radius:0;cursor:not-allowed}.year-list-panel .devui-year-list .devui-year-title.devui-disabled:first-of-type{border-radius:var(--devui-border-radius-feedback, 4px) 0 0 var(--devui-border-radius-feedback, 4px)}.year-list-panel .devui-year-list .devui-year-title.devui-disabled:last-of-type{border-radius:0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0}\n"] }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.DatepickerProService }], propDecorators: { scrollListCmp: [{
type: ViewChild,
args: ['scrollList']
}], isRangeType: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWVhci1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kZXZ1aS9kYXRlcGlja2VyLXByby9saWIveWVhci1wYW5lbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9kZXZ1aS9kYXRlcGlja2VyLXByby9saWIveWVhci1wYW5lbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7O0FBU2pFLE1BQU0sT0FBTyxrQkFBa0I7SUFRN0IsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBSSxZQUFZLENBQUMsS0FBVztRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDbEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLFNB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QUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoSCxDQUFDO0lBRUQsY0FBYyxDQUFDLFNBQWlCO1FBQzlCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDOytHQWhNVSxrQkFBa0I7bUdBQWxCLGtCQUFrQix5TUNkL0Isd21DQXlCQTs7NEZEWGEsa0JBQWtCO2tCQVA5QixTQUFTOytCQUNFLGNBQWMsdUJBR0gsS0FBSyxtQkFDVCx1QkFBdUIsQ0FBQyxNQUFNO3lIQUd0QixhQUFhO3NCQUFyQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ2QsV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY2h1bmsgfSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGF0ZXBpY2tlclByb1NlcnZpY2UgfSBmcm9tICcuLi9kYXRlcGlja2VyLXByby5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZC15ZWFyLXBhbmVsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4veWVhci1wYW5lbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4veWVhci1wYW5lbC5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgWWVhclBhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbExpc3QnKSBzY3JvbGxMaXN0Q21wOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XHJcbiAgQElucHV0KCkgaXNSYW5nZVR5cGUgPSBmYWxzZTtcclxuXHJcbiAgeWVhckxpc3QgPSBbXTtcclxuXHJcbiAgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgZ2V0IGN1ckhvdmVyRGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnBpY2tlclNydi5jdXJIb3ZlckRhdGU7XHJcbiAgfVxyXG5cclxuICBzZXQgY3VySG92ZXJEYXRlKHZhbHVlOiBEYXRlKSB7XHJcbiAgICB0aGlzLnBpY2tlclNydi5jdXJIb3ZlckRhdGUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50RGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLmlzUmFuZ2VUeXBlKSB7XHJcbiAgICAgIGlmICh0aGlzLnBpY2tlclNydi5jdXJyZW50QWN0aXZlSW5wdXQgPT09ICdzdGFydCcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJTcnYuY3VyUmFuZ2VEYXRlWzBdO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyU3J2LmN1cnJlbnRBY3RpdmVJbnB1dCA9PT0gJ2VuZCcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJTcnYuY3VyUmFuZ2VEYXRlWzFdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5waWNrZXJTcnYuY3VyRGF0ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldCBjdXJyZW50RGF0ZSh2YWx1ZTogRGF0ZSkge1xyXG4gICAgaWYgKHRoaXMuaXNSYW5nZVR5cGUpIHtcclxuICAgICAgaWYgKHRoaXMucGlja2VyU3J2LmN1cnJlbnRBY3RpdmVJbnB1dCA9PT0gJ3N0YXJ0Jykge1xyXG4gICAgICAgIHRoaXMucGlja2VyU3J2LmN1clJhbmdlRGF0ZVswXSA9IHZhbHVlO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyU3J2LmN1cnJlbnRBY3RpdmVJbnB1dCA9PT0gJ2VuZCcpIHtcclxuICAgICAgICB0aGlzLnBpY2tlclNydi5jdXJSYW5nZURhdGVbMV0gPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5waWNrZXJTcnYuY3VyRGF0ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHBpY2tlclNydjogRGF0ZXBpY2tlclByb1NlcnZpY2UpIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0WWVhckxpc3QoKTtcclxuICAgIHRoaXMuaW5pdE9ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGluaXRPYnNlcnZhYmxlKCkge1xyXG4gICAgdGhpcy5waWNrZXJTcnYudG9nZ2xlRXZlbnQuc3Vic2NyaWJlKChpc09wZW4pID0+IHtcclxuICAgICAgaWYgKGlzT3Blbikge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5nb1RvWWVhcih0aGlzLmN1cnJlbnREYXRlIHx8IG5ldyBEYXRlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnBpY2tlclNydi51cGRhdGVEYXRlVmFsdWUucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xyXG4gICAgICBpZiAocmVzLnR5cGUgPT09ICdyYW5nZScpIHtcclxuICAgICAgICB0aGlzLnBpY2tlclNydi5jdXJSYW5nZURhdGUgPSByZXMudmFsdWUgYXMgRGF0ZVtdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGlja2VyU3J2LmN1ckRhdGUgPSByZXMudmFsdWUgYXMgRGF0ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdvVG9ZZWFyKHRoaXMuY3VycmVudERhdGUgfHwgbmV3IERhdGUoKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnBpY2tlclNydi5hY3RpdmVJbnB1dENoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgodHlwZSkgPT4ge1xyXG4gICAgICBpZiAodHlwZSA9PT0gJ3N0YXJ0Jykge1xyXG4gICAgICAgIHRoaXMuZ29Ub1llYXIodGhpcy5waWNrZXJTcnYuY3VyUmFuZ2VEYXRlWzBdIHx8IHRoaXMucGlja2VyU3J2LmN1clJhbmdlRGF0ZVsxXSB8fCBuZXcgRGF0ZSgpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmdvVG9ZZWFyKHRoaXMucGlja2VyU3J2LmN1clJhbmdlRGF0ZVsxXSB8fCB0aGlzLnBpY2tlclNydi5jdXJSYW5nZURhdGVbMF0gfHwgbmV3IERhdGUoKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdFllYXJMaXN0KCkge1xyXG4gICAgY29uc3QgbGlzdCA9IG5ldyBBcnJheSh0aGlzLnBpY2tlclNydi5jYWxlbmRhclJhbmdlWzFdIC0gdGhpcy5waWNrZXJTcnYuY2FsZW5kYXJSYW5nZVswXSArIDEpLmZpbGwoMSkubWFwKCh0LCBpKSA9PiB7XHJcbiAgICAgIHJldHVybiBpICsgdGhpcy5waWNrZXJTcnYuY2FsZW5kYXJSYW5nZVswXTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy55ZWFyTGlzdCA9IGNodW5rKGxpc3QsIDMpO1xyXG4gIH1cclxuXHJcbiAgZ29Ub1llYXIoZGF0ZTogRGF0ZSkge1xyXG4gICAgaWYgKGRhdGUpIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBNYXRoLmZsb29yKChkYXRlLmdldEZ1bGxZZWFyKCkgLSB0aGlzLnBpY2tlclNydi5jYWxlbmRhclJhbmdlWzBdKSAvIDMpO1xyXG4gICAgICB0aGlzLnNjcm9sbExpc3RDbXAuc2Nyb2xsVG9JbmRleChpbmRleCAtIDEpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgaXNUaGlzWWVhcih5ZWFySW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHllYXJJbmRleCA9PT0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xyXG4gIH1cclxuXHJcbiAgaXNBY3RpdmVZZWFyKHllYXJJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5waWNrZXJTcnYuaXNZZWFyQWN0aXZlKHllYXJJbmRleCk7XHJcbiAgfVxyXG5cclxuICBpc1N0YXJ0RGF0ZSh5ZWFySW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLmlzUmFuZ2VUeXBlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFySW5kZXgsIDAsIDEpO1xyXG4gICAgcmV0dXJuIHRoaXMucGlja2VyU3J2LmlzU3RhcnREYXRlKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgaXNFbmREYXRlKHllYXJJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuaXNSYW5nZVR5cGUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXJJbmRleCwgMCwgMSk7XHJcbiAgICByZXR1cm4gdGhpcy5waWNrZXJTcnYuaXNFbmREYXRlKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgaXNEYXRlQWJhbmRvbih5ZWFySW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKCF0aGlzLmlzUmFuZ2VUeXBlIHx8ICF0aGlzLnBpY2tlclNydi5jdXJSYW5nZURhdGVbMF0gfHwgIXRoaXMucGlja2VyU3J2LmN1clJhbmdlRGF0ZVsxXSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhckluZGV4LCAwLCAxKTtcclxuICAgIHJldHVybiB0aGlzLnBpY2tlclNydi5pc0RhdGVBYmFuZG9uKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgaXNBY3RpdmVUeXBlRGF0ZSh5ZWFySW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKCF0aGlzLmlzUmFuZ2VUeXBlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhckluZGV4LCAwLCAxKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5waWNrZXJTcnYuaXNBY3RpdmVJbnB1dFR5cGVEYXRlKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgaXNEYXRlSW5SYW5nZSh5ZWFySW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXJJbmRleCwgMCwgMSk7XHJcbiAgICByZXR1cm4gdGhpcy5waWNrZXJTcnYuaXNEYXRlSW5SYW5nZShkYXRlKTtcclxuICB9XHJcblxyXG4gIGlzRGF0ZUluU2VsZWN0UmFuZ2UoeWVhckluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICghdGhpcy5pc1JhbmdlVHlwZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXJJbmRleCwgMCwgMSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucGlja2VyU3J2LmlzRGF0ZUluU2VsZWN0UmFuZ2UoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RZZWFyKHllYXJJbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGUoeWVhckluZGV4KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmN1cnJlbnREYXRlID0gbmV3IERhdGUoeWVhckluZGV4LCAwLCAxKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1JhbmdlVHlwZSkge1xyXG4gICAgICB0aGlzLnBpY2tlclNydi5maXhSYW5nZURhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDpnZ7ml7bpl7TmqKHlvI/kuIvpgInlrozlvIDlp4vml6XmnJ/ot7PovazliLDnu5PmnZ/ml6XmnJ9cclxuICAgIGlmICh0aGlzLmlzUmFuZ2VUeXBlKSB7XHJcbiAgICAgIGlmICh0aGlzLnBpY2tlclNydi5jdXJyZW50QWN0aXZlSW5wdXQgPT09ICdzdGFydCcpIHtcclxuICAgICAgICB0aGlzLnBpY2tlclNydi5jdXJyZW50QWN0aXZlSW5wdXQgPSAnZW5kJztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlclNydi5jdXJyZW50QWN0aXZlSW5wdXQgPT09ICdlbmQnICYmICF0aGlzLnBpY2tlclNydi5jdXJSYW5nZURhdGVbMF0pIHtcclxuICAgICAgICB0aGlzLnBpY2tlclNydi5jdXJyZW50QWN0aXZlSW5wdXQgPSAnc3RhcnQnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGlja2VyU3J2LmNsb3NlRHJvcGRvd25FdmVudC5uZXh0KGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucGlja2VyU3J2LnNlbGVjdGVkRGF0ZUNoYW5nZS5uZXh0KHtcclxuICAgICAgdHlwZTogdGhpcy5pc1JhbmdlVHlwZSA/ICdyYW5nZScgOiAnc2luZ2xlJyxcclxuICAgICAgdmFsdWU6IHRoaXMuaXNSYW5nZVR5cGUgPyB0aGlzLnBpY2tlclNydi5jdXJSYW5nZURhdGUgOiB0aGlzLmN1cnJlbnREYXRlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMucGlja2VyU3J2LmNsb3NlQWZ0ZXJTZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLnBpY2tlclNydi5jbG9zZURyb3Bkb3duRXZlbnQubmV4dChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0Rpc2FibGUoeWVhckluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFySW5kZXgsIDAsIDEpO1xyXG4gICAgcmV0dXJuIHRoaXMucGlja2VyU3J2Lm1heERhdGUuZ2V0VGltZSgpIDwgZGF0ZS5nZXRUaW1lKCkgfHwgdGhpcy5waWNrZXJTcnYubWluRGF0ZS5nZXRUaW1lKCkgPiBkYXRlLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIHNldEhvdmVyVGFyZ2V0KHllYXJJbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhckluZGV4LCAwLCAxKTtcclxuICAgIGlmICh0aGlzLmlzUmFuZ2VUeXBlICYmICF0aGlzLmlzRGlzYWJsZSh5ZWFySW5kZXgpKSB7XHJcbiAgICAgIHRoaXMuY3VySG92ZXJEYXRlID0gZGF0ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xyXG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInllYXItbGlzdC1wYW5lbFwiIChtb3VzZWxlYXZlKT1cImN1ckhvdmVyRGF0ZSA9IG51bGxcIj5cbiAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCAjc2Nyb2xsTGlzdCBbaXRlbVNpemVdPVwiNDhcIiBjbGFzcz1cImRldnVpLXllYXItbGlzdFwiIG1pbkJ1ZmZlclB4PVwiNDAwXCIgbWF4QnVmZmVyUHg9XCI2MDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGV2dWkteWVhci1saXN0LWl0ZW1cIiAqY2RrVmlydHVhbEZvcj1cImxldCB5ZWFycyBvZiB5ZWFyTGlzdDsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgIDxwXG4gICAgICAgIGNsYXNzPVwiZGV2dWkteWVhci10aXRsZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnZGV2dWktdGhpcy15ZWFyJzogaXNUaGlzWWVhcih5ZWFyKSxcbiAgICAgICAgICAnZGV2dWktYWN0aXZlLXllYXInOiBpc0FjdGl2ZVllYXIoeWVhciksXG4gICAgICAgICAgJ2RldnVpLWRpc2FibGVkJzogaXNEaXNhYmxlKHllYXIpLFxuICAgICAgICAgICdkZXZ1aS10YWJsZS1kYXRlLWlucmFuZ2UnOiBpc0RhdGVJblJhbmdlKHllYXIpLFxuICAgICAgICAgICdkZXZ1aS10YWJsZS1kYXRlLXN0YXJ0JzogaXNTdGFydERhdGUoeWVhciksXG4gICAgICAgICAgJ2RldnVpLXRhYmxlLWRhdGUtZW5kJzogaXNFbmREYXRlKHllYXIpLFxuICAgICAgICAgICdkZXZ1aS10YWJsZS1kYXRlLWFiYW5kb24tc2VsZWN0ZWQnOiBpc0RhdGVBYmFuZG9uKHllYXIpLFxuICAgICAgICAgICdkZXZ1aS10YWJsZS1kYXRlLWluLXNlbGVjdGVkLXJhbmdlJzogaXNEYXRlSW5TZWxlY3RSYW5nZSh5ZWFyKSxcbiAgICAgICAgICAnZGV2dWktdGFibGUtZGF0ZS1hY3RpdmUtdHlwZSc6IGlzQWN0aXZlVHlwZURhdGUoeWVhcilcbiAgICAgICAgfVwiXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RZZWFyKHllYXIpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwic2V0SG92ZXJUYXJnZXQoeWVhcilcIlxuICAgICAgICAqbmdGb3I9XCJsZXQgeWVhciBvZiB5ZWFyc1wiXG4gICAgICA+XG4gICAgICAgIHt7IHllYXIgfX1cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG48L2Rpdj5cbiJdfQ==