UNPKG

ngx-pluto

Version:
428 lines 45.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewEncapsulation, Input, ViewChild, Output, EventEmitter, ElementRef } from "@angular/core"; import * as moment_ from 'moment'; /** @type {?} */ const moment = moment_; import { NpDatePickerHeader } from "./date-picker-header"; import { NpDatePickerService } from "../date-picker.service"; import { TIME_FORMAT, DATE_FORMAT } from "../date-picker-const"; import { NpDatePickerFooter } from "./date-picker-footer"; import { NpTimePickerPanel } from "./time-picker-panel"; import { trigger, transition, style, animate } from "@angular/animations"; /** * Date picker popup组件 */ export class NpDatePickerPopup { /** * @param {?} datePickerService * @param {?} elementRef */ constructor(datePickerService, elementRef) { this.datePickerService = datePickerService; this.elementRef = elementRef; this.datePickerType = 'date-picker'; this.isShowTime = false; this.date = null; this.onDayClicked = new EventEmitter(); this.onDayMouseover = new EventEmitter(); this.onMonthClicked = new EventEmitter(); this.onYearClicked = new EventEmitter(); this.onTimeClicked = new EventEmitter(); this.onConfirmClicked = new EventEmitter(); this.onItemLabelClicked = new EventEmitter(); this.footerItems = []; this.selectedDate = null; this.isShowDaysPanel = true; this.isShowMonthsPanel = false; this.isShowYearsPanel = false; this.days = []; this.months = []; this.years = []; this.preDay = null; } /** * @return {?} */ ngOnInit() { this.initMoment(); if (this.datePickerType === 'date-picker') { this.showPanel('days'); } else if (this.datePickerType === 'month-picker') { this.showPanel('months'); } else if (this.datePickerType === 'year-picker') { this.showPanel('years'); } else if (this.datePickerType === 'datetime-picker') { this.showPanel('days'); } this.buildPanel(); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { /** @type {?} */ const date = (/** @type {?} */ (changes['date'].currentValue)); this.selectedDate = date ? date.clone() : null; } /** * @param {?} time * @return {?} */ onTimeLabelClicked(time) { this.time = time; this.onTimeClicked.emit(this.time); } /** * @param {?} time * @return {?} */ onConfirmButtonClicked(time) { this.time = time; this.onConfirmClicked.emit(this.time); } /** * @param {?} item * @return {?} */ onFooterItemLabelClicked(item) { this.onItemLabelClicked.emit(item); } /** * @param {?} day * @return {?} */ onDayLabelClicked(day) { if (day.isWeekDayMin) { return; } if (this.isShowTime) { day.date = moment(day.date.format(DATE_FORMAT) + ' ' + (this.time ? this.time : moment().format(TIME_FORMAT))); } this.showPanel('days'); this.buildPanel(day.date, day.date); this.initTimePicker(day.date); this.onDayClicked.emit(day); } /** * @param {?} day * @return {?} */ onDayLabelMouseover(day) { if (this.preDay && this.preDay.date && day.date && this.preDay.date.format(DATE_FORMAT) !== day.date.format(DATE_FORMAT)) { this.onDayMouseover.emit(day); } this.preDay = Object.assign({}, day); } /** * @param {?} month * @return {?} */ onMonthLabelClicked(month) { if (this.datePickerType === 'date-picker' || this.datePickerType === 'datetime-picker' || this.datePickerType === 'date-range-picker') { this.showPanel('days'); this.buildPanel(month.date, this.selectedDate); return; } if (this.datePickerType === 'month-picker') { this.onMonthClicked.emit(month); return; } } /** * @param {?} year * @return {?} */ onYearLabelClicked(year) { if (this.datePickerType === 'date-picker' || this.datePickerType === 'datetime-picker' || this.datePickerType === 'date-range-picker') { this.showPanel('days'); this.buildPanel(year.date, this.selectedDate); return; } if (this.datePickerType === 'month-picker') { this.showPanel('months'); this.buildPanel(year.date, this.selectedDate); return; } if (this.datePickerType === 'year-picker') { this.onYearClicked.emit(year); return; } } /** * @param {?} data * @return {?} */ onYearInHeaderClicked(data) { this.years = this.datePickerService.buildYearsPanel(data.date, data.year, this.selectedDate); this.showPanel('years'); } /** * @return {?} */ onMonthInHeaderClicked() { this.months = this.datePickerService.buildMonthsPanel(this.date, this.selectedDate); this.showPanel('months'); } /** * @param {?} data * @return {?} */ onArrowClicked(data) { switch (data.arrowType) { case 'double-pre': if (this.isShowDaysPanel || this.isShowMonthsPanel) { this.date = this.date.add(-1, 'year').clone(); } else if (this.isShowYearsPanel) { this.date = this.date.add(-10, 'year').clone(); } break; case 'pre': if (this.isShowDaysPanel) { this.date = this.date.add(-1, 'month').clone(); } break; case 'next': if (this.isShowDaysPanel) { this.date = this.date.add(1, 'month').clone(); } break; case 'double-next': if (this.isShowDaysPanel || this.isShowMonthsPanel) { this.date = this.date.add(1, 'year').clone(); } else if (this.isShowYearsPanel) { this.date = this.date.add(10, 'year').clone(); } break; default: break; } this.buildPanel(); } /** * @param {?=} date * @param {?=} selectedDate * @return {?} */ buildPanel(date = this.date, selectedDate = null) { this.date = date && date.isValid() ? date.clone() : moment(); this.selectedDate = selectedDate ? selectedDate.clone() : this.selectedDate; if (this.isShowDaysPanel) { this.days = this.datePickerService.buildDaysPanel(this.date, this.selectedDate); this.nowDay = moment(); return; } if (this.isShowMonthsPanel) { this.months = this.datePickerService.buildMonthsPanel(this.date, this.selectedDate); return; } if (this.isShowYearsPanel) { this.years = this.datePickerService.buildYearsPanel(this.date, this.date.format('YYYY'), this.selectedDate); return; } } /** * @param {?} hoverDate * @param {?=} dates * @return {?} */ buildPanelForRangePicker(hoverDate, dates = []) { if (this.isShowDaysPanel) { this.days = this.datePickerService.buildDaysPanelForRangePicker(this.date, this.selectedDate, hoverDate, dates); this.nowDay = moment(); } } /** * @private * @return {?} */ initMoment() { if (this.date && this.date.isValid()) { this.selectedDate = this.date.clone(); this.initTimePicker(this.selectedDate); } else { this.selectedDate = null; this.date = moment(); } } /** * @private * @param {?} date * @return {?} */ initTimePicker(date) { if (this.datePickerType === 'datetime-picker') { this.time = date.format(TIME_FORMAT); if (this.timePickerPanel) { this.timePickerPanel.scrollTo(this.time); } else { setTimeout((/** * @return {?} */ () => { this.timePickerPanel.scrollTo(this.time); }), 0); } } } /** * @private * @param {?} type * @return {?} */ showPanel(type) { switch (type) { case 'days': this.isShowDaysPanel = true; this.isShowMonthsPanel = false; this.isShowYearsPanel = false; if (this.datePickerHeader) { this.datePickerHeader.isYearLabelRanged = false; this.datePickerHeader.isShowMonthLabel = true; this.datePickerHeader.isShowPreBtn = true; } break; case 'months': this.isShowDaysPanel = false; this.isShowMonthsPanel = true; this.isShowYearsPanel = false; if (this.datePickerHeader) { this.datePickerHeader.isYearLabelRanged = false; this.datePickerHeader.isShowMonthLabel = false; this.datePickerHeader.isShowPreBtn = false; } break; case 'years': this.isShowDaysPanel = false; this.isShowMonthsPanel = false; this.isShowYearsPanel = true; if (this.datePickerHeader) { this.datePickerHeader.isYearLabelRanged = true; this.datePickerHeader.isShowMonthLabel = false; this.datePickerHeader.isShowPreBtn = false; } break; default: this.isShowDaysPanel = true; this.isShowMonthsPanel = false; this.isShowYearsPanel = false; break; } } } NpDatePickerPopup.decorators = [ { type: Component, args: [{ selector: `np-date-picker-popup`, template: "<div @date-picker-animations class=\"np-date-picker-popup-wrapper flex-wrap row-flex\">\r\n <div class=\"date-wrapper flex-wrap col-flex\">\r\n <np-date-picker-header #datePickerHeader [date]=\"date\" (onYearClicked)=\"onYearInHeaderClicked($event)\"\r\n (onMonthClicked)=\"onMonthInHeaderClicked()\" (onArrowClicked)=\"onArrowClicked($event)\">\r\n </np-date-picker-header>\r\n <div class=\"date-picker-body\">\r\n <!-- \u65E5\u671F\u9762\u677F -->\r\n <ng-container *ngIf=\"isShowDaysPanel\">\r\n <div class=\"days-panel flex-wrap row-flex wrap\">\r\n <span #dayLabel class=\"day flex-wrap col-flex\" [ngClass]=\"{\r\n 'now-day': nowDay.format('YYYYMMDD') === (day.date && day.date.format('YYYYMMDD')), \r\n 'selected-day': day.isSelected, \r\n 'non-available-day': !day.available && !day.isWeekDayMin,\r\n 'within-hover': day.hoverDateType === 'within-hover' && day.available,\r\n 'within-selected': day.hoverDateType === 'within-selected' && day.available,\r\n 'within-selected-hover': day.hoverDateType === 'within-selected-hover' && day.available\r\n }\" *ngFor=\"let day of days\" (click)=\"onDayLabelClicked(day)\"\r\n (mouseover)=\"onDayLabelMouseover(day)\">{{ day.value }}</span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- \u6708\u4EFD\u9762\u677F -->\r\n <ng-container *ngIf=\"isShowMonthsPanel\">\r\n <div class=\"months-panel flex-wrap row-flex wrap\">\r\n <span class=\"month flex-wrap col-flex\" [ngClass]=\"{'selected-month': month.isSelected}\"\r\n *ngFor=\"let month of months\" (click)=\"onMonthLabelClicked(month)\">{{ month.value }}</span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- \u5E74\u4EFD\u9762\u677F -->\r\n <ng-container *ngIf=\"isShowYearsPanel\">\r\n <div class=\"years-panel flex-wrap row-flex wrap\">\r\n <span class=\"year flex-wrap col-flex\"\r\n [ngClass]=\"{'selected-year': year.isSelected, 'non-available-year': !year.available}\"\r\n *ngFor=\"let year of years\" (click)=\"onYearLabelClicked(year)\">{{ year.value }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <np-date-picker-footer\r\n *ngIf=\"datePickerType === 'date-picker' || datePickerType === 'datetime-picker' || datePickerType === 'date-range-picker'\"\r\n [datePickerType]=\"datePickerType\" [footerItems]=\"footerItems\"\r\n (onItemLabelClicked)=\"onFooterItemLabelClicked($event)\">\r\n </np-date-picker-footer>\r\n </div>\r\n <np-time-picker-panel #timePickerPanel *ngIf=\"isShowTime\" [time]=\"time\" [confirmButtonText]=\"confirmButtonText\"\r\n (onTimeClicked)=\"onTimeLabelClicked($event)\" (onConfirmClicked)=\"onConfirmButtonClicked($event)\">\r\n </np-time-picker-panel>\r\n</div>\r\n", encapsulation: ViewEncapsulation.None, animations: [trigger('date-picker-animations', [ transition(':enter', [ style({ opacity: 0 }), animate(300, style({ opacity: 1 })), ]), transition(':leave', [ animate(300, style({ opacity: 0 })), ]), ])], styles: [".np-date-picker-popup-wrapper .date-wrapper{width:280px}.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .days-panel{justify-content:center;align-items:center;padding:10px 0}.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .days-panel>.day{justify-content:center;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:26px;height:24px;line-height:24px;margin:3px 5px;box-sizing:border-box}.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .months-panel,.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .years-panel{justify-content:center;align-items:center;padding:10px 0}.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .months-panel>.month,.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .months-panel>.year,.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .years-panel>.month,.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .years-panel>.year{justify-content:center;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:60px;height:24px;line-height:66px;margin:22px 14px}"] }] } ]; /** @nocollapse */ NpDatePickerPopup.ctorParameters = () => [ { type: NpDatePickerService }, { type: ElementRef } ]; NpDatePickerPopup.propDecorators = { date: [{ type: Input }], onDayClicked: [{ type: Output }], onDayMouseover: [{ type: Output }], onMonthClicked: [{ type: Output }], onYearClicked: [{ type: Output }], onTimeClicked: [{ type: Output }], onConfirmClicked: [{ type: Output }], onItemLabelClicked: [{ type: Output }], footerItems: [{ type: Input }], confirmButtonText: [{ type: Input }], datePickerHeader: [{ type: ViewChild, args: ['datePickerHeader',] }], datePickerFooter: [{ type: ViewChild, args: ['datePickerFooter',] }], timePickerPanel: [{ type: ViewChild, args: ['timePickerPanel',] }], dayLabel: [{ type: ViewChild, args: ['dayLabel',] }] }; if (false) { /** @type {?} */ NpDatePickerPopup.prototype.datePickerType; /** @type {?} */ NpDatePickerPopup.prototype.isShowTime; /** @type {?} */ NpDatePickerPopup.prototype.date; /** @type {?} */ NpDatePickerPopup.prototype.onDayClicked; /** @type {?} */ NpDatePickerPopup.prototype.onDayMouseover; /** @type {?} */ NpDatePickerPopup.prototype.onMonthClicked; /** @type {?} */ NpDatePickerPopup.prototype.onYearClicked; /** @type {?} */ NpDatePickerPopup.prototype.onTimeClicked; /** @type {?} */ NpDatePickerPopup.prototype.onConfirmClicked; /** @type {?} */ NpDatePickerPopup.prototype.onItemLabelClicked; /** @type {?} */ NpDatePickerPopup.prototype.footerItems; /** @type {?} */ NpDatePickerPopup.prototype.confirmButtonText; /** @type {?} */ NpDatePickerPopup.prototype.datePickerHeader; /** @type {?} */ NpDatePickerPopup.prototype.datePickerFooter; /** @type {?} */ NpDatePickerPopup.prototype.timePickerPanel; /** @type {?} */ NpDatePickerPopup.prototype.dayLabel; /** @type {?} */ NpDatePickerPopup.prototype.selectedDate; /** @type {?} */ NpDatePickerPopup.prototype.isShowDaysPanel; /** @type {?} */ NpDatePickerPopup.prototype.isShowMonthsPanel; /** @type {?} */ NpDatePickerPopup.prototype.isShowYearsPanel; /** @type {?} */ NpDatePickerPopup.prototype.days; /** @type {?} */ NpDatePickerPopup.prototype.months; /** @type {?} */ NpDatePickerPopup.prototype.years; /** @type {?} */ NpDatePickerPopup.prototype.nowDay; /** * 传入到时间面板的当前时间,格式为‘HH:mm:ss’ * @type {?} */ NpDatePickerPopup.prototype.time; /** * @type {?} * @private */ NpDatePickerPopup.prototype.preDay; /** * @type {?} * @private */ NpDatePickerPopup.prototype.datePickerService; /** @type {?} */ NpDatePickerPopup.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXItcG9wdXAuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZGF0ZS1waWNrZXIvY29tcG9uZW50cy9kYXRlLXBpY2tlci1wb3B1cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBaUIsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SSxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQzs7TUFBTyxNQUFNLEdBQUcsT0FBTztBQUN6RCxPQUFPLEVBQWEsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQXdDLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbkcsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRSxPQUFPLEVBQXdCLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBcUIxRSxNQUFNLE9BQU8saUJBQWlCOzs7OztJQWlDNUIsWUFBb0IsaUJBQXNDLEVBQ2pELFVBQXNCO1FBRFgsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFxQjtRQUNqRCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBakMvQixtQkFBYyxHQUFtQixhQUFhLENBQUM7UUFDL0MsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUVuQixTQUFJLEdBQW1CLElBQUksQ0FBQztRQUUzQixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBQ25ELG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFDckQsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBQy9DLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUM3QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDM0MscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM5Qyx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUMvRCxnQkFBVyxHQUEyQixFQUFFLENBQUM7UUFRbEQsaUJBQVksR0FBbUIsSUFBSSxDQUFDO1FBQ3BDLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ2hDLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFFbEMsU0FBSSxHQUEyQixFQUFFLENBQUM7UUFDbEMsV0FBTSxHQUFxQixFQUFFLENBQUM7UUFDOUIsVUFBSyxHQUFvQixFQUFFLENBQUM7UUF5RHBCLFdBQU0sR0FBb0IsSUFBSSxDQUFDO0lBbkRKLENBQUM7Ozs7SUFFcEMsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssYUFBYSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDeEI7YUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssY0FBYyxFQUFFO1lBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDMUI7YUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssYUFBYSxFQUFFO1lBQ2hELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekI7YUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssaUJBQWlCLEVBQUU7WUFDcEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4QjtRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFzQjs7Y0FDMUIsSUFBSSxHQUFtQixtQkFBQSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFrQjtRQUMzRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakQsQ0FBQzs7Ozs7SUFFRCxrQkFBa0IsQ0FBQyxJQUFZO1FBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDOzs7OztJQUVELHNCQUFzQixDQUFDLElBQVk7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQzs7Ozs7SUFFRCx3QkFBd0IsQ0FBQyxJQUEwQjtRQUNqRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Ozs7O0lBRUQsaUJBQWlCLENBQUMsR0FBb0I7UUFDcEMsSUFBSSxHQUFHLENBQUMsWUFBWSxFQUFFO1lBQ3BCLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixHQUFHLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hIO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Ozs7O0lBR0QsbUJBQW1CLENBQUMsR0FBb0I7UUFFdEMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3hILElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO1FBRUQsSUFBSSxDQUFDLE1BQU0scUJBQVEsR0FBRyxDQUFFLENBQUM7SUFDM0IsQ0FBQzs7Ozs7SUFFRCxtQkFBbUIsQ0FBQyxLQUFnQjtRQUNsQyxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssYUFBYSxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssaUJBQWlCLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxtQkFBbUIsRUFBRTtZQUNySSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDL0MsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLGNBQWMsRUFBRTtZQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxPQUFPO1NBQ1I7SUFDSCxDQUFDOzs7OztJQUVELGtCQUFrQixDQUFDLElBQWM7UUFDL0IsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLGFBQWEsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLGlCQUFpQixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssbUJBQW1CLEVBQUU7WUFDckksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzlDLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxjQUFjLEVBQUU7WUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzlDLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxhQUFhLEVBQUU7WUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsT0FBTztTQUNSO0lBQ0gsQ0FBQzs7Ozs7SUFFRCxxQkFBcUIsQ0FBQyxJQUFtRTtRQUN2RixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLENBQUM7Ozs7SUFFRCxzQkFBc0I7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQixDQUFDOzs7OztJQUVELGNBQWMsQ0FBQyxJQUFvRDtRQUNqRSxRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDdEIsS0FBSyxZQUFZO2dCQUNmLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7b0JBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQy9DO3FCQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO29CQUNoQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUNoRDtnQkFFRCxNQUFNO1lBQ1IsS0FBSyxLQUFLO2dCQUNSLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDeEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDaEQ7Z0JBRUQsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7b0JBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUMvQztnQkFFRCxNQUFNO1lBQ1IsS0FBSyxhQUFhO2dCQUNoQixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO29CQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDOUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUMvQztnQkFFRCxNQUFNO1lBRVI7Z0JBQ0UsTUFBTTtTQUNUO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7Ozs7OztJQUVNLFVBQVUsQ0FBQyxPQUF1QixJQUFJLENBQUMsSUFBSSxFQUFFLGVBQStCLElBQUk7UUFDckYsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7UUFFNUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVoRixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3BGLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM1RyxPQUFPO1NBQ1I7SUFDSCxDQUFDOzs7Ozs7SUFFTSx3QkFBd0IsQ0FBQyxTQUF5QixFQUFFLFFBQStCLEVBQUU7UUFFMUYsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEgsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7Ozs7O0lBRU8sVUFBVTtRQUNoQixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDOzs7Ozs7SUFFTyxjQUFjLENBQUMsSUFBb0I7UUFDekMsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLGlCQUFpQixFQUFFO1lBQzdDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxQztpQkFBTTtnQkFDTCxVQUFVOzs7Z0JBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0MsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ1A7U0FFRjtJQUNILENBQUM7Ozs7OztJQUVPLFNBQVMsQ0FBQyxJQUFpQztRQUNqRCxRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssTUFBTTtnQkFDVCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztnQkFDL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztnQkFDOUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7b0JBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7b0JBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2lCQUMzQztnQkFDRCxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2dCQUM5QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztvQkFDaEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztvQkFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7aUJBQzVDO2dCQUNELE1BQU07WUFDUixLQUFLLE9BQU87Z0JBQ1YsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7Z0JBQzdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO29CQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO29CQUMvQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO29CQUMvQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztpQkFDNUM7Z0JBQ0QsTUFBTTtZQUNSO2dCQUNFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2dCQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2dCQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QixNQUFNO1NBQ1Q7SUFDSCxDQUFDOzs7WUEzUkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLGsxRkFBcUM7Z0JBRXJDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2dCQUNyQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUU7d0JBQzdDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7NEJBQ25CLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs0QkFDckIsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzt5QkFDcEMsQ0FBQzt3QkFDRixVQUFVLENBQUMsUUFBUSxFQUFFOzRCQUNuQixPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3lCQUNwQyxDQUFDO3FCQUNILENBQUMsQ0FBQzs7YUFDSjs7OztZQXhCOEMsbUJBQW1CO1lBSG9DLFVBQVU7OzttQkFpQzdHLEtBQUs7MkJBRUwsTUFBTTs2QkFDTixNQUFNOzZCQUNOLE1BQU07NEJBQ04sTUFBTTs0QkFDTixNQUFNOytCQUNOLE1BQU07aUNBQ04sTUFBTTswQkFDTixLQUFLO2dDQUNMLEtBQUs7K0JBRUwsU0FBUyxTQUFDLGtCQUFrQjsrQkFDNUIsU0FBUyxTQUFDLGtCQUFrQjs4QkFDNUIsU0FBUyxTQUFDLGlCQUFpQjt1QkFDM0IsU0FBUyxTQUFDLFVBQVU7Ozs7SUFsQnJCLDJDQUErQzs7SUFDL0MsdUNBQTRCOztJQUU1QixpQ0FBcUM7O0lBRXJDLHlDQUE2RDs7SUFDN0QsMkNBQStEOztJQUMvRCwyQ0FBeUQ7O0lBQ3pELDBDQUF1RDs7SUFDdkQsMENBQXFEOztJQUNyRCw2Q0FBd0Q7O0lBQ3hELCtDQUF3RTs7SUFDeEUsd0NBQWtEOztJQUNsRCw4Q0FBbUM7O0lBRW5DLDZDQUFvRTs7SUFDcEUsNkNBQW9FOztJQUNwRSw0Q0FBaUU7O0lBQ2pFLHFDQUF5RDs7SUFFekQseUNBQW9DOztJQUNwQyw0Q0FBZ0M7O0lBQ2hDLDhDQUFtQzs7SUFDbkMsNkNBQWtDOztJQUVsQyxpQ0FBa0M7O0lBQ2xDLG1DQUE4Qjs7SUFDOUIsa0NBQTRCOztJQUM1QixtQ0FBdUI7Ozs7O0lBRXZCLGlDQUFhOzs7OztJQXNEYixtQ0FBdUM7Ozs7O0lBcEQzQiw4Q0FBOEM7O0lBQ3hELHVDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7IGNvbnN0IG1vbWVudCA9IG1vbWVudF9cclxuaW1wb3J0IHsgQXJyb3dUeXBlLCBOcERhdGVQaWNrZXJIZWFkZXIgfSBmcm9tIFwiLi9kYXRlLXBpY2tlci1oZWFkZXJcIjtcclxuaW1wb3J0IHsgRGF5RGF0YVBlck1vbnRoLCBNb250aERhdGEsIFllYXJEYXRhLCBOcERhdGVQaWNrZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL2RhdGUtcGlja2VyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTm90aWZ5U2VydmljZSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvc2VydmljZXMvbm90aWZ5LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVElNRV9GT1JNQVQsIERBVEVfRk9STUFUIH0gZnJvbSBcIi4uL2RhdGUtcGlja2VyLWNvbnN0XCI7XHJcbmltcG9ydCB7IERhdGVQaWNrZXJGb290ZXJJdGVtLCBOcERhdGVQaWNrZXJGb290ZXIgfSBmcm9tIFwiLi9kYXRlLXBpY2tlci1mb290ZXJcIjtcclxuaW1wb3J0IHsgTnBUaW1lUGlja2VyUGFuZWwgfSBmcm9tIFwiLi90aW1lLXBpY2tlci1wYW5lbFwiO1xyXG5pbXBvcnQgeyB0cmlnZ2VyLCB0cmFuc2l0aW9uLCBzdHlsZSwgYW5pbWF0ZSB9IGZyb20gXCJAYW5ndWxhci9hbmltYXRpb25zXCI7XHJcblxyXG4vKipcclxuICogRGF0ZSBwaWNrZXIgcG9wdXDnu4Tku7ZcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAtZGF0ZS1waWNrZXItcG9wdXBgLFxyXG4gIHRlbXBsYXRlVXJsOiAnZGF0ZS1waWNrZXItcG9wdXAuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2RhdGUtcGlja2VyLXBvcHVwLnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIGFuaW1hdGlvbnM6IFt0cmlnZ2VyKCdkYXRlLXBpY2tlci1hbmltYXRpb25zJywgW1xyXG4gICAgdHJhbnNpdGlvbignOmVudGVyJywgW1xyXG4gICAgICBzdHlsZSh7IG9wYWNpdHk6IDAgfSksXHJcbiAgICAgIGFuaW1hdGUoMzAwLCBzdHlsZSh7IG9wYWNpdHk6IDEgfSkpLFxyXG4gICAgXSksXHJcbiAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXHJcbiAgICAgIGFuaW1hdGUoMzAwLCBzdHlsZSh7IG9wYWNpdHk6IDAgfSkpLFxyXG4gICAgXSksXHJcbiAgXSldXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTnBEYXRlUGlja2VyUG9wdXAgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGRhdGVQaWNrZXJUeXBlOiBEYXRlUGlja2VyVHlwZSA9ICdkYXRlLXBpY2tlcic7XHJcbiAgaXNTaG93VGltZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBkYXRlOiBtb21lbnRfLk1vbWVudCA9IG51bGw7XHJcblxyXG4gIEBPdXRwdXQoKSBvbkRheUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERheURhdGFQZXJNb250aD4oKTtcclxuICBAT3V0cHV0KCkgb25EYXlNb3VzZW92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPERheURhdGFQZXJNb250aD4oKTtcclxuICBAT3V0cHV0KCkgb25Nb250aENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vbnRoRGF0YT4oKTtcclxuICBAT3V0cHV0KCkgb25ZZWFyQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8WWVhckRhdGE+KCk7XHJcbiAgQE91dHB1dCgpIG9uVGltZUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgb25Db25maXJtQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSBvbkl0ZW1MYWJlbENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVQaWNrZXJGb290ZXJJdGVtPigpO1xyXG4gIEBJbnB1dCgpIGZvb3Rlckl0ZW1zOiBEYXRlUGlja2VyRm9vdGVySXRlbVtdID0gW107XHJcbiAgQElucHV0KCkgY29uZmlybUJ1dHRvblRleHQ6IHN0cmluZztcclxuXHJcbiAgQFZpZXdDaGlsZCgnZGF0ZVBpY2tlckhlYWRlcicpIGRhdGVQaWNrZXJIZWFkZXI6IE5wRGF0ZVBpY2tlckhlYWRlcjtcclxuICBAVmlld0NoaWxkKCdkYXRlUGlja2VyRm9vdGVyJykgZGF0ZVBpY2tlckZvb3RlcjogTnBEYXRlUGlja2VyRm9vdGVyO1xyXG4gIEBWaWV3Q2hpbGQoJ3RpbWVQaWNrZXJQYW5lbCcpIHRpbWVQaWNrZXJQYW5lbDogTnBUaW1lUGlja2VyUGFuZWw7XHJcbiAgQFZpZXdDaGlsZCgnZGF5TGFiZWwnKSBkYXlMYWJlbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIHNlbGVjdGVkRGF0ZTogbW9tZW50Xy5Nb21lbnQgPSBudWxsO1xyXG4gIGlzU2hvd0RheXNQYW5lbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNTaG93TW9udGhzUGFuZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1Nob3dZZWFyc1BhbmVsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGRheXM6IEFycmF5PERheURhdGFQZXJNb250aD4gPSBbXTtcclxuICBtb250aHM6IEFycmF5PE1vbnRoRGF0YT4gPSBbXTtcclxuICB5ZWFyczogQXJyYXk8WWVhckRhdGE+ID0gW107XHJcbiAgbm93RGF5OiBtb21lbnRfLk1vbWVudDtcclxuICAvKirkvKDlhaXliLDml7bpl7TpnaLmnb/nmoTlvZPliY3ml7bpl7TvvIzmoLzlvI/kuLrigJhISDptbTpzc+KAmSAqL1xyXG4gIHRpbWU6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRlUGlja2VyU2VydmljZTogTnBEYXRlUGlja2VyU2VydmljZSxcclxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmluaXRNb21lbnQoKTtcclxuICAgIGlmICh0aGlzLmRhdGVQaWNrZXJUeXBlID09PSAnZGF0ZS1waWNrZXInKSB7XHJcbiAgICAgIHRoaXMuc2hvd1BhbmVsKCdkYXlzJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0ZVBpY2tlclR5cGUgPT09ICdtb250aC1waWNrZXInKSB7XHJcbiAgICAgIHRoaXMuc2hvd1BhbmVsKCdtb250aHMnKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ3llYXItcGlja2VyJykge1xyXG4gICAgICB0aGlzLnNob3dQYW5lbCgneWVhcnMnKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ2RhdGV0aW1lLXBpY2tlcicpIHtcclxuICAgICAgdGhpcy5zaG93UGFuZWwoJ2RheXMnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJ1aWxkUGFuZWwoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGNvbnN0IGRhdGU6IG1vbWVudF8uTW9tZW50ID0gY2hhbmdlc1snZGF0ZSddLmN1cnJlbnRWYWx1ZSBhcyBtb21lbnRfLk1vbWVudDtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF0ZSA/IGRhdGUuY2xvbmUoKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBvblRpbWVMYWJlbENsaWNrZWQodGltZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRpbWUgPSB0aW1lO1xyXG4gICAgdGhpcy5vblRpbWVDbGlja2VkLmVtaXQodGhpcy50aW1lKTtcclxuICB9XHJcblxyXG4gIG9uQ29uZmlybUJ1dHRvbkNsaWNrZWQodGltZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRpbWUgPSB0aW1lO1xyXG4gICAgdGhpcy5vbkNvbmZpcm1DbGlja2VkLmVtaXQodGhpcy50aW1lKTtcclxuICB9XHJcblxyXG4gIG9uRm9vdGVySXRlbUxhYmVsQ2xpY2tlZChpdGVtOiBEYXRlUGlja2VyRm9vdGVySXRlbSkge1xyXG4gICAgdGhpcy5vbkl0ZW1MYWJlbENsaWNrZWQuZW1pdChpdGVtKTtcclxuICB9XHJcblxyXG4gIG9uRGF5TGFiZWxDbGlja2VkKGRheTogRGF5RGF0YVBlck1vbnRoKSB7XHJcbiAgICBpZiAoZGF5LmlzV2Vla0RheU1pbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTaG93VGltZSkge1xyXG4gICAgICBkYXkuZGF0ZSA9IG1vbWVudChkYXkuZGF0ZS5mb3JtYXQoREFURV9GT1JNQVQpICsgJyAnICsgKHRoaXMudGltZSA/IHRoaXMudGltZSA6IG1vbWVudCgpLmZvcm1hdChUSU1FX0ZPUk1BVCkpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNob3dQYW5lbCgnZGF5cycpO1xyXG4gICAgdGhpcy5idWlsZFBhbmVsKGRheS5kYXRlLCBkYXkuZGF0ZSk7XHJcbiAgICB0aGlzLmluaXRUaW1lUGlja2VyKGRheS5kYXRlKTtcclxuICAgIHRoaXMub25EYXlDbGlja2VkLmVtaXQoZGF5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlRGF5OiBEYXlEYXRhUGVyTW9udGggPSBudWxsO1xyXG4gIG9uRGF5TGFiZWxNb3VzZW92ZXIoZGF5OiBEYXlEYXRhUGVyTW9udGgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5wcmVEYXkgJiYgdGhpcy5wcmVEYXkuZGF0ZSAmJiBkYXkuZGF0ZSAmJiB0aGlzLnByZURheS5kYXRlLmZvcm1hdChEQVRFX0ZPUk1BVCkgIT09IGRheS5kYXRlLmZvcm1hdChEQVRFX0ZPUk1BVCkpIHtcclxuICAgICAgdGhpcy5vbkRheU1vdXNlb3Zlci5lbWl0KGRheSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcmVEYXkgPSB7IC4uLmRheSB9O1xyXG4gIH1cclxuXHJcbiAgb25Nb250aExhYmVsQ2xpY2tlZChtb250aDogTW9udGhEYXRhKSB7XHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ2RhdGUtcGlja2VyJyB8fCB0aGlzLmRhdGVQaWNrZXJUeXBlID09PSAnZGF0ZXRpbWUtcGlja2VyJyB8fCB0aGlzLmRhdGVQaWNrZXJUeXBlID09PSAnZGF0ZS1yYW5nZS1waWNrZXInKSB7XHJcbiAgICAgIHRoaXMuc2hvd1BhbmVsKCdkYXlzJyk7XHJcbiAgICAgIHRoaXMuYnVpbGRQYW5lbChtb250aC5kYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ21vbnRoLXBpY2tlcicpIHtcclxuICAgICAgdGhpcy5vbk1vbnRoQ2xpY2tlZC5lbWl0KG1vbnRoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25ZZWFyTGFiZWxDbGlja2VkKHllYXI6IFllYXJEYXRhKSB7XHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ2RhdGUtcGlja2VyJyB8fCB0aGlzLmRhdGVQaWNrZXJUeXBlID09PSAnZGF0ZXRpbWUtcGlja2VyJyB8fCB0aGlzLmRhdGVQaWNrZXJUeXBlID09PSAnZGF0ZS1yYW5nZS1waWNrZXInKSB7XHJcbiAgICAgIHRoaXMuc2hvd1BhbmVsKCdkYXlzJyk7XHJcbiAgICAgIHRoaXMuYnVpbGRQYW5lbCh5ZWFyLmRhdGUsIHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGVQaWNrZXJUeXBlID09PSAnbW9udGgtcGlja2VyJykge1xyXG4gICAgICB0aGlzLnNob3dQYW5lbCgnbW9udGhzJyk7XHJcbiAgICAgIHRoaXMuYnVpbGRQYW5lbCh5ZWFyLmRhdGUsIHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGVQaWNrZXJUeXBlID09PSAneWVhci1waWNrZXInKSB7XHJcbiAgICAgIHRoaXMub25ZZWFyQ2xpY2tlZC5lbWl0KHllYXIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblllYXJJbkhlYWRlckNsaWNrZWQoZGF0YTogeyBkYXRlOiBtb21lbnRfLk1vbWVudCwgeWVhcjogc3RyaW5nLCByYW5nZXM6IEFycmF5PG51bWJlcj4gfSkge1xyXG4gICAgdGhpcy55ZWFycyA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuYnVpbGRZZWFyc1BhbmVsKGRhdGEuZGF0ZSwgZGF0YS55ZWFyLCB0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICB0aGlzLnNob3dQYW5lbCgneWVhcnMnKTtcclxuICB9XHJcblxyXG4gIG9uTW9udGhJbkhlYWRlckNsaWNrZWQoKSB7XHJcbiAgICB0aGlzLm1vbnRocyA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuYnVpbGRNb250aHNQYW5lbCh0aGlzLmRhdGUsIHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgIHRoaXMuc2hvd1BhbmVsKCdtb250aHMnKTtcclxuICB9XHJcblxyXG4gIG9uQXJyb3dDbGlja2VkKGRhdGE6IHsgYXJyb3dUeXBlOiBBcnJvd1R5cGUsIGRhdGU6IG1vbWVudF8uTW9tZW50IH0pIHtcclxuICAgIHN3aXRjaCAoZGF0YS5hcnJvd1R5cGUpIHtcclxuICAgICAgY2FzZSAnZG91YmxlLXByZSc6XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93RGF5c1BhbmVsIHx8IHRoaXMuaXNTaG93TW9udGhzUGFuZWwpIHtcclxuICAgICAgICAgIHRoaXMuZGF0ZSA9IHRoaXMuZGF0ZS5hZGQoLTEsICd5ZWFyJykuY2xvbmUoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNTaG93WWVhcnNQYW5lbCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRlID0gdGhpcy5kYXRlLmFkZCgtMTAsICd5ZWFyJykuY2xvbmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdwcmUnOlxyXG4gICAgICAgIGlmICh0aGlzLmlzU2hvd0RheXNQYW5lbCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRlID0gdGhpcy5kYXRlLmFkZCgtMSwgJ21vbnRoJykuY2xvbmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICduZXh0JzpcclxuICAgICAgICBpZiAodGhpcy5pc1Nob3dEYXlzUGFuZWwpIHtcclxuICAgICAgICAgIHRoaXMuZGF0ZSA9IHRoaXMuZGF0ZS5hZGQoMSwgJ21vbnRoJykuY2xvbmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkb3VibGUtbmV4dCc6XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93RGF5c1BhbmVsIHx8IHRoaXMuaXNTaG93TW9udGhzUGFuZWwpIHtcclxuICAgICAgICAgIHRoaXMuZGF0ZSA9IHRoaXMuZGF0ZS5hZGQoMSwgJ3llYXInKS5jbG9uZSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Nob3dZZWFyc1BhbmVsKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGUgPSB0aGlzLmRhdGUuYWRkKDEwLCAneWVhcicpLmNsb25lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5idWlsZFBhbmVsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYnVpbGRQYW5lbChkYXRlOiBtb21lbnRfLk1vbWVudCA9IHRoaXMuZGF0ZSwgc2VsZWN0ZWREYXRlOiBtb21lbnRfLk1vbWVudCA9IG51bGwpIHtcclxuICAgIHRoaXMuZGF0ZSA9IGRhdGUgJiYgZGF0ZS5pc1ZhbGlkKCkgPyBkYXRlLmNsb25lKCkgOiBtb21lbnQoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gc2VsZWN0ZWREYXRlID8gc2VsZWN0ZWREYXRlLmNsb25lKCkgOiB0aGlzLnNlbGVjdGVkRGF0ZTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1Nob3dEYXlzUGFuZWwpIHtcclxuICAgICAgdGhpcy5kYXlzID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5idWlsZERheXNQYW5lbCh0aGlzLmRhdGUsIHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuXHJcbiAgICAgIHRoaXMubm93RGF5ID0gbW9tZW50KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc1Nob3dNb250aHNQYW5lbCkge1xyXG4gICAgICB0aGlzLm1vbnRocyA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuYnVpbGRNb250aHNQYW5lbCh0aGlzLmRhdGUsIHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzU2hvd1llYXJzUGFuZWwpIHtcclxuICAgICAgdGhpcy55ZWFycyA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuYnVpbGRZZWFyc1BhbmVsKHRoaXMuZGF0ZSwgdGhpcy5kYXRlLmZvcm1hdCgnWVlZWScpLCB0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBidWlsZFBhbmVsRm9yUmFuZ2VQaWNrZXIoaG92ZXJEYXRlOiBtb21lbnRfLk1vbWVudCwgZGF0ZXM6IEFycmF5PG1vbWVudF8uTW9tZW50PiA9IFtdKSB7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTaG93RGF5c1BhbmVsKSB7XHJcbiAgICAgIHRoaXMuZGF5cyA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuYnVpbGREYXlzUGFuZWxGb3JSYW5nZVBpY2tlcih0aGlzLmRhdGUsIHRoaXMuc2VsZWN0ZWREYXRlLCBob3ZlckRhdGUsIGRhdGVzKTtcclxuICAgICAgdGhpcy5ub3dEYXkgPSBtb21lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdE1vbWVudCgpIHtcclxuICAgIGlmICh0aGlzLmRhdGUgJiYgdGhpcy5kYXRlLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHRoaXMuZGF0ZS5jbG9uZSgpO1xyXG4gICAgICB0aGlzLmluaXRUaW1lUGlja2VyKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcclxuICAgICAgdGhpcy5kYXRlID0gbW9tZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRUaW1lUGlja2VyKGRhdGU6IG1vbWVudF8uTW9tZW50KSB7XHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ2RhdGV0aW1lLXBpY2tlcicpIHtcclxuICAgICAgdGhpcy50aW1lID0gZGF0ZS5mb3JtYXQoVElNRV9GT1JNQVQpO1xyXG4gICAgICBpZiAodGhpcy50aW1lUGlja2VyUGFuZWwpIHtcclxuICAgICAgICB0aGlzLnRpbWVQaWNrZXJQYW5lbC5zY3JvbGxUbyh0aGlzLnRpbWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50aW1lUGlja2VyUGFuZWwuc2Nyb2xsVG8odGhpcy50aW1lKTtcclxuICAgICAgICB9LCAwKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvd1BhbmVsKHR5cGU6ICdkYXlzJyB8ICdtb250aHMnIHwgJ3llYXJzJykge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2RheXMnOlxyXG4gICAgICAgIHRoaXMuaXNTaG93RGF5c1BhbmVsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzU2hvd01vbnRoc1BhbmVsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1Nob3dZZWFyc1BhbmVsID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0ZVBpY2tlckhlYWRlcikge1xyXG4gICAgICAgICAgdGhpcy5kYXRlUGlja2VySGVhZGVyLmlzWWVhckxhYmVsUmFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJIZWFkZXIuaXNTaG93TW9udGhMYWJlbCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJIZWFkZXIuaXNTaG93UHJlQnRuID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ21vbnRocyc6XHJcbiAgICAgICAgdGhpcy5pc1Nob3dEYXlzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzU2hvd01vbnRoc1BhbmVsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzU2hvd1llYXJzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5kYXRlUGlja2VySGVhZGVyKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJIZWFkZXIuaXNZZWFyTGFiZWxSYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZGF0ZVBpY2tlckhlYWRlci5pc1Nob3dNb250aExhYmVsID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJIZWFkZXIuaXNTaG93UHJlQnRuID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICd5ZWFycyc6XHJcbiAgICAgICAgdGhpcy5pc1Nob3dEYXlzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzU2hvd01vbnRoc1BhbmVsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1Nob3dZZWFyc1BhbmVsID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5kYXRlUGlja2VySGVhZGVyKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJIZWFkZXIuaXNZZWFyTGFiZWxSYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5kYXRlUGlja2VySGVhZGVyLmlzU2hvd01vbnRoTGFiZWwgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZGF0ZVBpY2tlckhlYWRlci5pc1Nob3dQcmVCdG4gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy5pc1Nob3dEYXlzUGFuZWwgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNTaG93TW9udGhzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzU2hvd1llYXJzUGFuZWwgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIERhdGVQaWNrZXJUeXBlID0gJ2RhdGUtcGlja2VyJyB8ICdkYXRldGltZS1waWNrZXInIHwgJ3llYXItcGlja2VyJyB8ICdtb250aC1waWNrZXInIHwgJ2RhdGUtcmFuZ2UtcGlja2VyJzsiXX0=