UNPKG

@asadi/angular-date-components

Version:

`Angular Date Components` is a comprehensive angular library of date-related components designed to meet the needs of applications that require localization based on various calendar systems. While the package currently includes two powerful components (S

210 lines 36.2 kB
import { Component } from '@angular/core'; import { ADCCommonService, ADCStaticValues, FlatEventBuilder, TableSelection } from '@asadi/angular-date-components/core'; import { AdcResourceSchedulerBase } from '../adc-resource-scheduler-base/adc-resource-scheduler-base'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@asadi/angular-date-components/core"; export class ADCWeekViewComponent extends AdcResourceSchedulerBase { constructor() { super(); this.week = 0; this.year = 0; this.daysOfWeek = ADCStaticValues.getDaysOfWeek(); this.title = ''; this.dateSplitter = this.dateFormatter.DateSplitter; this.resources = []; this.events = []; this.rows = []; this.startOfWeek = ''; this.endOfWeek = ''; this.weekends = []; this.holidays = []; this.commonService = new ADCCommonService(this.dateAdapter, this.labels); this.today = this.dateAdapter.today(); this.selectionManager = new TableSelection(this.dateFilter); this.eventBuilder = new FlatEventBuilder(); } ngOnInit() { super.init(); this.selectionManager.cellSelectionStream.subscribe(event => this.onDateRangeSelect(event.start, event.end)); this.eventBuilder.eventSelectionStream.subscribe(e => { this.onEventClick(e.event, e.dom, e.jsEvent); }); } dateFilter(cell1, cell2) { return cell1.rowValue == cell2.rowValue && cell2.columnValue >= cell1.columnValue; } initViewHanlder() { if (this.startOf == null) { this.todayButtonHandler(); } else { this.week = this.dateAdapter.getWeekOf(this.startOf); this.year = this.dateAdapter.getYearOf(this.startOf); this.calculateCurrentDate(); } } todayButtonHandler() { this.week = this.dateAdapter.getCurrentWeek(); this.year = this.dateAdapter.getCurrentYear(); this.calculateCurrentDate(); } previousButtonHandler() { this.week--; if (this.week < 1) { this.year--; this.week = this.dateAdapter.getWeeksOfYear(this.year) - 1; } this.calculateCurrentDate(); } nextButtonHandler() { this.week++; const weeksOfYear = this.dateAdapter.getWeeksOfYear(this.year); if (this.week >= weeksOfYear) { this.year++; this.week = 1; } this.calculateCurrentDate(); } calculateCurrentDate() { const start = this.dateAdapter.getDateOfDay(this.year, this.week, 0); const end = this.dateAdapter.getDateOfDay(this.year, this.week, 6); this.startOfWeek = this.dateAdapter.transformDate(+start.split(this.dateSplitter)[0], +start.split(this.dateSplitter)[1], +start.split(this.dateSplitter)[2]); this.endOfWeek = this.dateAdapter.transformDate(+end.split(this.dateSplitter)[0], +end.split(this.dateSplitter)[1], +end.split(this.dateSplitter)[2]); this.title = `${this.labels?.week || "Week"} ${this.week} ${this.labels?.year || "Year"} ${this.year}`; this.dateChangesHandler(); super.dateRangeChange({ startDate: this.startOfWeek, endDate: this.endOfWeek }); } eventChangesHandler(events) { const tableEvents = []; this.events = events; const viewEvents = this.tools.resourceScheduler.getEventsBetweenDateRange(this.startOfWeek, this.endOfWeek, this.events); viewEvents.forEach((e) => { const rowIndex = this.rows.findIndex((r) => r.value == e.resourceId); if (rowIndex == -1) return; const row = this.rows[rowIndex]; const startColumnIndex = row.columns.findIndex((c) => { return this.tools.dateTime.dateOnly(c.value) == this.tools.dateTime.dateOnly(e.startDate); }); const endColumnIndex = row.columns.findIndex((c) => { return this.tools.dateTime.dateOnly(c.value) == this.tools.dateTime.dateOnly(e.endDate); }); const startTime = +this.tools.dateTime.hourOrDefault(e.startTime, '00'); const endTime = +this.tools.dateTime.hourOrDefault(e.endTime, '24'); const cellEvent = { columnStart: startColumnIndex != -1 ? startColumnIndex : null, columnEnd: endColumnIndex != -1 ? endColumnIndex : null, data: e, rowStart: rowIndex, rowEnd: rowIndex, offsetX: startTime / 24, fractionX: e.allDay == true ? 1 : (endTime / 24), overlapTolerance: this.options.eventOverlapTolerance / 24 }; tableEvents.push(cellEvent); }); this.eventBuilder.data = tableEvents; } resourceChangesHandler(resources) { this.resources = resources; this.dateChangesHandler(); } dateChangesHandler() { this.rows = this.getRowIntialValue(); if (this.resources.length == 0) return; this.resources.forEach((resource, rowIndex) => { const row = { classList: '', label: resource.title, prefix: '', suffix: '', value: resource.id.toString(), verticalAlign: 'center', horizontalAlign: 'center', columns: [] }; this.daysOfWeek.forEach((day, dayIndex) => { const date = this.getDate(dayIndex); const column = { label: '', classList: '', prefix: '', suffix: '', value: date.transformedDate.split('T')[0], verticalAlign: 'center', horizontalAlign: 'center', selectable: true, }; row.columns.push(column); }); this.rows.push(row); }); } holidaysChangesHandler(holidays) { this.holidays = holidays; this.dateChangesHandler(); } weekendChangesHandler(weekends) { this.weekends = weekends; this.dateChangesHandler(); } onDateRangeSelect(start, end) { const e = { endDate: end.columnValue.toString(), endTime: '00:00', startDate: start.columnValue.toString(), startTime: '00:00', resourceId: start.rowValue }; super.dateRangeSelect(e); } onEventClick(event, dom, jsEvent) { const resourceSchedulerEvent = this.events.filter(item => item.id == event.data.id)[0]; super.eventClick({ dom: dom, jsEvent: jsEvent, event: resourceSchedulerEvent }); } getDate(dayOfWeek) { const date = this.dateAdapter.getDateOfDay(this.year, this.week, dayOfWeek); const changedDate = this.dateAdapter.transformDate(+date.split(this.dateSplitter)[0], +date.split(this.dateSplitter)[1], +date.split(this.dateSplitter)[2]); return { date: date, transformedDate: changedDate }; } ngOnDestroy() { super.destory(); } getRowIntialValue() { const row = { verticalAlign: 'center', horizontalAlign: 'center', classList: '', columns: [], label: '', prefix: '', suffix: '', value: '' }; this.daysOfWeek.forEach((day, dayIndex) => { const date = this.getDate(dayIndex); const dIndex = this.commonService.getDayIndex(dayIndex); const column = { label: this.labels?.daysOfWeek[dIndex] || day, classList: ''.concat(date.transformedDate.split('T')[0] == this.today ? ' today ' : ' ', this.weekends.includes(dayIndex) || this.holidays.includes(date.transformedDate.split('T')[0]) ? ' holiday ' : ' '), prefix: '', suffix: date.date.split(this.dateSplitter)[1] + this.dateSplitter + date.date.split(this.dateSplitter)[2], value: dayIndex.toString(), verticalAlign: 'center', horizontalAlign: 'center', selectable: false, }; row.columns.push(column); }); return [row]; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ADCWeekViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: ADCWeekViewComponent, selector: "adc-week-view", usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"resources.length != 0\">\r\n <adc-table\r\n [rows]=\"rows\"\r\n [title]=\"title\" \r\n [selectionManager]=\"selectionManager\"\r\n [eventBuilder]=\"eventBuilder\"\r\n (viewReady)=\"markViewAsReady()\"\r\n ></adc-table>\r\n</ng-container>", styles: [".w-full{width:100%}.table-layout-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.h-12{height:3rem}.text-center{text-align:center}.events{height:100%;width:100%;overflow:visible;padding:0;margin:0}.h-1152{height:1152px}.over-flow-hidden{overflow:hidden}table{border-spacing:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ADCTableComponent, selector: "adc-table", inputs: ["rows", "showRowDetails", "title", "titleClass", "eventBuilder", "selectionManager"], outputs: ["viewReady"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ADCWeekViewComponent, decorators: [{ type: Component, args: [{ selector: 'adc-week-view', template: "<ng-container *ngIf=\"resources.length != 0\">\r\n <adc-table\r\n [rows]=\"rows\"\r\n [title]=\"title\" \r\n [selectionManager]=\"selectionManager\"\r\n [eventBuilder]=\"eventBuilder\"\r\n (viewReady)=\"markViewAsReady()\"\r\n ></adc-table>\r\n</ng-container>", styles: [".w-full{width:100%}.table-layout-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.h-12{height:3rem}.text-center{text-align:center}.events{height:100%;width:100%;overflow:visible;padding:0;margin:0}.h-1152{height:1152px}.over-flow-hidden{overflow:hidden}table{border-spacing:0}\n"] }] }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRjLXdlZWstdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc2FkaS9hbmd1bGFyLWRhdGUtY29tcG9uZW50cy9yZXNvdXJjZS1zY2hlZHVsZXIvc3JjL2NvbXBvbmVudHMvYWRjLXdlZWstdmlldy9hZGMtd2Vlay12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FzYWRpL2FuZ3VsYXItZGF0ZS1jb21wb25lbnRzL3Jlc291cmNlLXNjaGVkdWxlci9zcmMvY29tcG9uZW50cy9hZGMtd2Vlay12aWV3L2FkYy13ZWVrLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFpRixlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFek0sT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNERBQTRELENBQUM7Ozs7QUFPdEcsTUFBTSxPQUFPLG9CQUFxQixTQUFRLHdCQUF3QjtJQTJCaEU7UUFHRSxLQUFLLEVBQUUsQ0FBQztRQTVCVixTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ2pCLFNBQUksR0FBVyxDQUFDLENBQUM7UUFFVCxlQUFVLEdBQWEsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRS9ELFVBQUssR0FBVyxFQUFFLENBQUM7UUFFbkIsaUJBQVksR0FBb0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7UUFFaEUsY0FBUyxHQUFvQyxFQUFFLENBQUM7UUFDaEQsV0FBTSxHQUFpQyxFQUFFLENBQUM7UUFFMUMsU0FBSSxHQUFtQixFQUFFLENBQUM7UUFFbEIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsY0FBUyxHQUFX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QixDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLENBQUM7OEdBM1JVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLDRFQ1ZqQyw2UkFRZTs7MkZERUYsb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFEQ0NvbW1vblNlcnZpY2UsIEFEQ0RhdGVTcGxpdHRlciwgQURDSVRhYmxlQ2VsbCwgQURDSVRhYmxlQ29sdW1uLCBBRENJVGFibGVFdmVudCwgQURDSVRhYmxlUm93LCBBRENTdGF0aWNWYWx1ZXMsIEZsYXRFdmVudEJ1aWxkZXIsIFRhYmxlU2VsZWN0aW9uIH0gZnJvbSAnQGFzYWRpL2FuZ3VsYXItZGF0ZS1jb21wb25lbnRzL2NvcmUnO1xyXG5pbXBvcnQgeyBBRENJUmVzb3VyY2VTY2hlZHVsZXJFdmVudCwgQURDSVJlc291cmNlU2NoZWR1bGVyUmVzb3VyY2UsIEFEQ0lSZXNvdXJjZVNjaGVkdWxlclRhYmxlRXZlbnQgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlLmdsb2JhbFwiO1xyXG5pbXBvcnQgeyBBZGNSZXNvdXJjZVNjaGVkdWxlckJhc2UgfSBmcm9tICcuLi9hZGMtcmVzb3VyY2Utc2NoZWR1bGVyLWJhc2UvYWRjLXJlc291cmNlLXNjaGVkdWxlci1iYXNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYWRjLXdlZWstdmlldycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkYy13ZWVrLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FkYy13ZWVrLXZpZXcuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBRENXZWVrVmlld0NvbXBvbmVudCBleHRlbmRzIEFkY1Jlc291cmNlU2NoZWR1bGVyQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95e1xyXG5cclxuICB3ZWVrOiBudW1iZXIgPSAwO1xyXG4gIHllYXI6IG51bWJlciA9IDA7XHJcblxyXG4gIHByaXZhdGUgZGF5c09mV2Vlazogc3RyaW5nW10gPSBBRENTdGF0aWNWYWx1ZXMuZ2V0RGF5c09mV2VlaygpO1xyXG5cclxuICB0aXRsZTogc3RyaW5nID0gJyc7XHJcbiAgXHJcbiAgZGF0ZVNwbGl0dGVyOiBBRENEYXRlU3BsaXR0ZXIgPSB0aGlzLmRhdGVGb3JtYXR0ZXIuRGF0ZVNwbGl0dGVyO1xyXG5cclxuICByZXNvdXJjZXM6IEFEQ0lSZXNvdXJjZVNjaGVkdWxlclJlc291cmNlW10gPSBbXTtcclxuICBldmVudHM6IEFEQ0lSZXNvdXJjZVNjaGVkdWxlckV2ZW50W10gPSBbXTtcclxuXHJcbiAgcm93czogQURDSVRhYmxlUm93W10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBzdGFydE9mV2Vlazogc3RyaW5nID0gJyc7XHJcbiAgcHJpdmF0ZSBlbmRPZldlZWs6IHN0cmluZyA9ICcnO1xyXG5cclxuICB3ZWVrZW5kczogbnVtYmVyW10gPSBbXTtcclxuICBob2xpZGF5czogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgcmVhZG9ubHkgY29tbW9uU2VydmljZSA9IG5ldyBBRENDb21tb25TZXJ2aWNlKHRoaXMuZGF0ZUFkYXB0ZXIsIHRoaXMubGFiZWxzKTtcclxuICByZWFkb25seSB0b2RheTogc3RyaW5nID0gdGhpcy5kYXRlQWRhcHRlci50b2RheSgpO1xyXG4gIHJlYWRvbmx5IHNlbGVjdGlvbk1hbmFnZXIgPSBuZXcgVGFibGVTZWxlY3Rpb24odGhpcy5kYXRlRmlsdGVyKTtcclxuICByZWFkb25seSBldmVudEJ1aWxkZXIgPSBuZXcgRmxhdEV2ZW50QnVpbGRlcigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICApXHJcbiAge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQgXHJcbiAge1xyXG4gICAgc3VwZXIuaW5pdCgpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uTWFuYWdlci5jZWxsU2VsZWN0aW9uU3RyZWFtLnN1YnNjcmliZShldmVudCA9PiB0aGlzLm9uRGF0ZVJhbmdlU2VsZWN0KGV2ZW50LnN0YXJ0LCBldmVudC5lbmQpKTtcclxuXHJcbiAgICB0aGlzLmV2ZW50QnVpbGRlci5ldmVudFNlbGVjdGlvblN0cmVhbS5zdWJzY3JpYmUoZSA9PiB7XHJcbiAgICAgIHRoaXMub25FdmVudENsaWNrKGUuZXZlbnQsIGUuZG9tLCBlLmpzRXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkYXRlRmlsdGVyKGNlbGwxOiBBRENJVGFibGVDZWxsLCBjZWxsMjogQURDSVRhYmxlQ2VsbCk6IGJvb2xlYW5cclxuICB7XHJcbiAgICByZXR1cm4gY2VsbDEucm93VmFsdWUgPT0gY2VsbDIucm93VmFsdWUgJiYgY2VsbDIuY29sdW1uVmFsdWUgPj0gY2VsbDEuY29sdW1uVmFsdWU7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBpbml0Vmlld0hhbmxkZXIoKTogdm9pZCBcclxuICB7XHJcbiAgICBpZih0aGlzLnN0YXJ0T2YgPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgdGhpcy50b2RheUJ1dHRvbkhhbmRsZXIoKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgdGhpcy53ZWVrID0gdGhpcy5kYXRlQWRhcHRlci5nZXRXZWVrT2YodGhpcy5zdGFydE9mKTtcclxuICAgICAgdGhpcy55ZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyT2YodGhpcy5zdGFydE9mKTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVDdXJyZW50RGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgdG9kYXlCdXR0b25IYW5kbGVyKCk6IHZvaWRcclxuICB7XHJcbiAgICB0aGlzLndlZWsgPSB0aGlzLmRhdGVBZGFwdGVyLmdldEN1cnJlbnRXZWVrKCk7XHJcbiAgICB0aGlzLnllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldEN1cnJlbnRZZWFyKCk7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZUN1cnJlbnREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBwcmV2aW91c0J1dHRvbkhhbmRsZXIoKTogdm9pZFxyXG4gIHtcclxuICAgIHRoaXMud2Vlay0tO1xyXG5cclxuICAgIGlmKHRoaXMud2VlayA8IDEpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMueWVhci0tO1xyXG4gICAgICB0aGlzLndlZWsgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFdlZWtzT2ZZZWFyKHRoaXMueWVhcikgLSAxO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYWxjdWxhdGVDdXJyZW50RGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmV4dEJ1dHRvbkhhbmRsZXIoKTogdm9pZFxyXG4gIHtcclxuICAgIHRoaXMud2VlaysrO1xyXG4gICAgY29uc3Qgd2Vla3NPZlllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFdlZWtzT2ZZZWFyKHRoaXMueWVhcik7XHJcblxyXG4gICAgaWYodGhpcy53ZWVrID49IHdlZWtzT2ZZZWFyKVxyXG4gICAge1xyXG4gICAgICB0aGlzLnllYXIrKztcclxuICAgICAgdGhpcy53ZWVrID0gMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbGN1bGF0ZUN1cnJlbnREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVDdXJyZW50RGF0ZSgpOiB2b2lkXHJcbiAge1xyXG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGVPZkRheSh0aGlzLnllYXIsIHRoaXMud2VlaywgMCk7XHJcbiAgICBjb25zdCBlbmQgPSB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGVPZkRheSh0aGlzLnllYXIsIHRoaXMud2VlaywgNik7XHJcblxyXG4gICAgdGhpcy5zdGFydE9mV2VlayA9IHRoaXMuZGF0ZUFkYXB0ZXIudHJhbnNmb3JtRGF0ZSgrc3RhcnQuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpWzBdLCArc3RhcnQuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpWzFdLCArc3RhcnQuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpWzJdKTtcclxuICAgIHRoaXMuZW5kT2ZXZWVrID0gdGhpcy5kYXRlQWRhcHRlci50cmFuc2Zvcm1EYXRlKCtlbmQuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpWzBdLCArZW5kLnNwbGl0KHRoaXMuZGF0ZVNwbGl0dGVyKVsxXSwgK2VuZC5zcGxpdCh0aGlzLmRhdGVTcGxpdHRlcilbMl0pO1xyXG5cclxuICAgIHRoaXMudGl0bGUgPSBgJHt0aGlzLmxhYmVscz8ud2VlayB8fCBcIldlZWtcIn0gJHt0aGlzLndlZWt9ICR7dGhpcy5sYWJlbHM/LnllYXIgfHwgXCJZZWFyXCJ9ICR7dGhpcy55ZWFyfWA7XHJcblxyXG4gICAgdGhpcy5kYXRlQ2hhbmdlc0hhbmRsZXIoKTtcclxuICAgIHN1cGVyLmRhdGVSYW5nZUNoYW5nZSh7c3RhcnREYXRlOiB0aGlzLnN0YXJ0T2ZXZWVrLCBlbmREYXRlOiB0aGlzLmVuZE9mV2Vla30pO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgZXZlbnRDaGFuZ2VzSGFuZGxlcihldmVudHM6IEFEQ0lSZXNvdXJjZVNjaGVkdWxlckV2ZW50W10pOiB2b2lkXHJcbiAge1xyXG4gICAgY29uc3QgdGFibGVFdmVudHM6IEFEQ0lUYWJsZUV2ZW50W10gPSBbXTtcclxuXHJcbiAgICB0aGlzLmV2ZW50cyA9IGV2ZW50cztcclxuXHJcbiAgICBjb25zdCB2aWV3RXZlbnRzID0gdGhpcy50b29scy5yZXNvdXJjZVNjaGVkdWxlci5nZXRFdmVudHNCZXR3ZWVuRGF0ZVJhbmdlKHRoaXMuc3RhcnRPZldlZWssIHRoaXMuZW5kT2ZXZWVrLCB0aGlzLmV2ZW50cyk7XHJcblxyXG4gICAgdmlld0V2ZW50cy5mb3JFYWNoKChlOiBBRENJUmVzb3VyY2VTY2hlZHVsZXJFdmVudCkgPT4ge1xyXG5cclxuICAgICAgY29uc3Qgcm93SW5kZXggPSB0aGlzLnJvd3MuZmluZEluZGV4KChyOiBBRENJVGFibGVSb3cpID0+IHIudmFsdWUgPT0gZS5yZXNvdXJjZUlkKTtcclxuXHJcbiAgICAgIGlmKHJvd0luZGV4ID09IC0xKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCByb3cgPSB0aGlzLnJvd3Nbcm93SW5kZXhdO1xyXG5cclxuICAgICAgY29uc3Qgc3RhcnRDb2x1bW5JbmRleCA9IHJvdy5jb2x1bW5zLmZpbmRJbmRleCgoYzogQURDSVRhYmxlQ29sdW1uKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9vbHMuZGF0ZVRpbWUuZGF0ZU9ubHkoYy52YWx1ZSkgPT0gdGhpcy50b29scy5kYXRlVGltZS5kYXRlT25seShlLnN0YXJ0RGF0ZSlcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBlbmRDb2x1bW5JbmRleCA9IHJvdy5jb2x1bW5zLmZpbmRJbmRleCgoYzogQURDSVRhYmxlQ29sdW1uKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9vbHMuZGF0ZVRpbWUuZGF0ZU9ubHkoYy52YWx1ZSkgPT0gdGhpcy50b29scy5kYXRlVGltZS5kYXRlT25seShlLmVuZERhdGUpXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gK3RoaXMudG9vbHMuZGF0ZVRpbWUuaG91ck9yRGVmYXVsdChlLnN0YXJ0VGltZSwgJzAwJyk7XHJcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSArdGhpcy50b29scy5kYXRlVGltZS5ob3VyT3JEZWZhdWx0KGUuZW5kVGltZSwgJzI0Jyk7XHJcblxyXG4gICAgICBjb25zdCBjZWxsRXZlbnQ6IEFEQ0lUYWJsZUV2ZW50ID0ge1xyXG4gICAgICAgIGNvbHVtblN0YXJ0OiBzdGFydENvbHVtbkluZGV4ICE9IC0xID8gc3RhcnRDb2x1bW5JbmRleCA6IG51bGwsXHJcbiAgICAgICAgY29sdW1uRW5kOiBlbmRDb2x1bW5JbmRleCAhPSAtMSA/IGVuZENvbHVtbkluZGV4IDogbnVsbCxcclxuICAgICAgICBkYXRhOiBlLFxyXG4gICAgICAgIHJvd1N0YXJ0OiByb3dJbmRleCxcclxuICAgICAgICByb3dFbmQ6IHJvd0luZGV4LFxyXG4gICAgICAgIG9mZnNldFg6IHN0YXJ0VGltZSAvIDI0LFxyXG4gICAgICAgIGZyYWN0aW9uWDogZS5hbGxEYXkgPT0gdHJ1ZSA/IDEgOiAoZW5kVGltZSAvIDI0KSxcclxuICAgICAgICBvdmVybGFwVG9sZXJhbmNlOiB0aGlzLm9wdGlvbnMuZXZlbnRPdmVybGFwVG9sZXJhbmNlIC8gMjRcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRhYmxlRXZlbnRzLnB1c2goY2VsbEV2ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZXZlbnRCdWlsZGVyLmRhdGEgPSB0YWJsZUV2ZW50cztcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHJlc291cmNlQ2hhbmdlc0hhbmRsZXIocmVzb3VyY2VzOiBBRENJUmVzb3VyY2VTY2hlZHVsZXJSZXNvdXJjZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc291cmNlcyA9IHJlc291cmNlcztcclxuICAgIHRoaXMuZGF0ZUNoYW5nZXNIYW5kbGVyKCk7XHJcbiAgfVxyXG5cclxuICBkYXRlQ2hhbmdlc0hhbmRsZXIoKTogdm9pZFxyXG4gIHtcclxuICAgIHRoaXMucm93cyA9IHRoaXMuZ2V0Um93SW50aWFsVmFsdWUoKTtcclxuICAgIFxyXG4gICAgaWYodGhpcy5yZXNvdXJjZXMubGVuZ3RoID09IDApIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnJlc291cmNlcy5mb3JFYWNoKChyZXNvdXJjZTogQURDSVJlc291cmNlU2NoZWR1bGVyUmVzb3VyY2UsIHJvd0luZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3Qgcm93OiBBRENJVGFibGVSb3cgPVxyXG4gICAgICB7XHJcbiAgICAgICAgY2xhc3NMaXN0OiAnJyxcclxuICAgICAgICBsYWJlbDogcmVzb3VyY2UudGl0bGUsXHJcbiAgICAgICAgcHJlZml4OiAnJyxcclxuICAgICAgICBzdWZmaXg6ICcnLFxyXG4gICAgICAgIHZhbHVlOiByZXNvdXJjZS5pZC50b1N0cmluZygpLFxyXG4gICAgICAgIHZlcnRpY2FsQWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgIGhvcml6b250YWxBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgY29sdW1uczogW11cclxuICAgICAgfVxyXG4gIFxyXG4gICAgICB0aGlzLmRheXNPZldlZWsuZm9yRWFjaCgoZGF5OiBzdHJpbmcsIGRheUluZGV4OiBudW1iZXIpID0+IHtcclxuICBcclxuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5nZXREYXRlKGRheUluZGV4KTtcclxuICBcclxuICAgICAgICBjb25zdCBjb2x1bW46IEFEQ0lUYWJsZUNvbHVtbiA9IFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICcnLFxyXG4gICAgICAgICAgICAgIGNsYXNzTGlzdDogJycsXHJcbiAgICAgICAgICAgICAgcHJlZml4OiAnJyxcclxuICAgICAgICAgICAgICBzdWZmaXg6ICcnLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBkYXRlLnRyYW5zZm9ybWVkRGF0ZS5zcGxpdCgnVCcpWzBdLFxyXG4gICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIHJvdy5jb2x1bW5zLnB1c2goY29sdW1uKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnJvd3MucHVzaChyb3cpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBob2xpZGF5c0NoYW5nZXNIYW5kbGVyKGhvbGlkYXlzOiBzdHJpbmdbXSk6IHZvaWQgXHJcbiAge1xyXG4gICAgdGhpcy5ob2xpZGF5cyA9IGhvbGlkYXlzO1xyXG4gICAgdGhpcy5kYXRlQ2hhbmdlc0hhbmRsZXIoKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHdlZWtlbmRDaGFuZ2VzSGFuZGxlcih3ZWVrZW5kczogbnVtYmVyW10pOiB2b2lkIFxyXG4gIHtcclxuICAgIHRoaXMud2Vla2VuZHMgPSB3ZWVrZW5kcztcclxuICAgIHRoaXMuZGF0ZUNoYW5nZXNIYW5kbGVyKCk7XHJcbiAgfVxyXG5cclxuICBvbkRhdGVSYW5nZVNlbGVjdChzdGFydDogQURDSVRhYmxlQ2VsbCwgZW5kOiBBRENJVGFibGVDZWxsKTogdm9pZFxyXG4gIHtcclxuICAgIGNvbnN0IGU6IEFEQ0lSZXNvdXJjZVNjaGVkdWxlclRhYmxlRXZlbnQgPSBcclxuICAgIHtcclxuICAgICAgZW5kRGF0ZTogZW5kLmNvbHVtblZhbHVlLnRvU3RyaW5nKCksXHJcbiAgICAgIGVuZFRpbWU6ICcwMDowMCcsXHJcbiAgICAgIHN0YXJ0RGF0ZTogc3RhcnQuY29sdW1uVmFsdWUudG9TdHJpbmcoKSxcclxuICAgICAgc3RhcnRUaW1lOiAnMDA6MDAnLFxyXG4gICAgICByZXNvdXJjZUlkOiBzdGFydC5yb3dWYWx1ZVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdXBlci5kYXRlUmFuZ2VTZWxlY3QoZSk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBvbkV2ZW50Q2xpY2soZXZlbnQ6IEFEQ0lUYWJsZUV2ZW50LCBkb206IEhUTUxFbGVtZW50LCBqc0V2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCBcclxuICB7XHJcbiAgICBjb25zdCByZXNvdXJjZVNjaGVkdWxlckV2ZW50OiBBRENJUmVzb3VyY2VTY2hlZHVsZXJFdmVudCA9IHRoaXMuZXZlbnRzLmZpbHRlcihpdGVtID0+IGl0ZW0uaWQgPT0gZXZlbnQuZGF0YS5pZClbMF07XHJcblxyXG4gICAgc3VwZXIuZXZlbnRDbGljayh7ZG9tOiBkb20sIGpzRXZlbnQ6IGpzRXZlbnQsIGV2ZW50OiByZXNvdXJjZVNjaGVkdWxlckV2ZW50fSk7XHJcbiAgfVxyXG5cclxuICBnZXREYXRlKGRheU9mV2VlazogbnVtYmVyKToge2RhdGU6IHN0cmluZywgdHJhbnNmb3JtZWREYXRlOiBzdHJpbmd9XHJcbiAge1xyXG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZU9mRGF5KHRoaXMueWVhciwgdGhpcy53ZWVrLCBkYXlPZldlZWspO1xyXG4gICAgY29uc3QgY2hhbmdlZERhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnRyYW5zZm9ybURhdGUoK2RhdGUuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpWzBdLCArZGF0ZS5zcGxpdCh0aGlzLmRhdGVTcGxpdHRlcilbMV0gLCArZGF0ZS5zcGxpdCh0aGlzLmRhdGVTcGxpdHRlcilbMl0pO1xyXG4gICAgcmV0dXJuIHtkYXRlOiBkYXRlLCB0cmFuc2Zvcm1lZERhdGU6IGNoYW5nZWREYXRlfTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQgXHJcbiAge1xyXG4gICAgc3VwZXIuZGVzdG9yeSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSb3dJbnRpYWxWYWx1ZSgpOiBBRENJVGFibGVSb3dbXVxyXG4gIHtcclxuICAgIGNvbnN0IHJvdzogQURDSVRhYmxlUm93ID0ge1xyXG4gICAgICB2ZXJ0aWNhbEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgaG9yaXpvbnRhbEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgY2xhc3NMaXN0OiAnJyxcclxuICAgICAgY29sdW1uczogW10sXHJcbiAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgcHJlZml4OiAnJyxcclxuICAgICAgc3VmZml4OiAnJyxcclxuICAgICAgdmFsdWU6ICcnXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZGF5c09mV2Vlay5mb3JFYWNoKChkYXk6IHN0cmluZywgZGF5SW5kZXg6IG51bWJlcikgPT4ge1xyXG5cclxuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZ2V0RGF0ZShkYXlJbmRleCk7XHJcbiAgICAgIGNvbnN0IGRJbmRleCA9IHRoaXMuY29tbW9uU2VydmljZS5nZXREYXlJbmRleChkYXlJbmRleCk7XHJcblxyXG4gICAgICBjb25zdCBjb2x1bW46IEFEQ0lUYWJsZUNvbHVtbiA9IFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBsYWJlbDogdGhpcy5sYWJlbHM/LmRheXNPZldlZWtbZEluZGV4XSB8fCBkYXksXHJcbiAgICAgICAgICAgIGNsYXNzTGlzdDogJycuY29uY2F0KFxyXG4gICAgICAgICAgICAgIGRhdGUudHJhbnNmb3JtZWREYXRlLnNwbGl0KCdUJylbMF0gPT0gdGhpcy50b2RheSA/ICcgdG9kYXkgJyA6ICcgJyxcclxuICAgICAgICAgICAgICB0aGlzLndlZWtlbmRzLmluY2x1ZGVzKGRheUluZGV4KSB8fCB0aGlzLmhvbGlkYXlzLmluY2x1ZGVzKGRhdGUudHJhbnNmb3JtZWREYXRlLnNwbGl0KCdUJylbMF0pID8gJyBob2xpZGF5ICcgOiAnICdcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBwcmVmaXg6ICcnLFxyXG4gICAgICAgICAgICBzdWZmaXg6IGRhdGUuZGF0ZS5zcGxpdCh0aGlzLmRhdGVTcGxpdHRlcilbMV0gKyB0aGlzLmRhdGVTcGxpdHRlciArIGRhdGUuZGF0ZS5zcGxpdCh0aGlzLmRhdGVTcGxpdHRlcilbMl0sXHJcbiAgICAgICAgICAgIHZhbHVlOiBkYXlJbmRleC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICByb3cuY29sdW1ucy5wdXNoKGNvbHVtbik7XHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiBbcm93XTtcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlc291cmNlcy5sZW5ndGggIT0gMFwiPlxyXG4gICAgPGFkYy10YWJsZVxyXG4gICAgW3Jvd3NdPVwicm93c1wiXHJcbiAgICBbdGl0bGVdPVwidGl0bGVcIiAgICBcclxuICAgIFtzZWxlY3Rpb25NYW5hZ2VyXT1cInNlbGVjdGlvbk1hbmFnZXJcIlxyXG4gICAgW2V2ZW50QnVpbGRlcl09XCJldmVudEJ1aWxkZXJcIlxyXG4gICAgKHZpZXdSZWFkeSk9XCJtYXJrVmlld0FzUmVhZHkoKVwiXHJcbiAgICA+PC9hZGMtdGFibGU+XHJcbjwvbmctY29udGFpbmVyPiJdfQ==