ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
319 lines (318 loc) • 29.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: inner-popup.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Alibaba.com All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { CandyDate } from 'ng-zorro-antd/core/time';
import { PREFIX_CLASS } from './util';
export class InnerPopupComponent {
constructor() {
this.panelModeChange = new EventEmitter();
// TODO: name is not proper
this.headerChange = new EventEmitter(); // Emitted when user changed the header's value
// Emitted when user changed the header's value
this.selectDate = new EventEmitter(); // Emitted when the date is selected by click the date panel
// Emitted when the date is selected by click the date panel
this.selectTime = new EventEmitter();
this.dayHover = new EventEmitter(); // Emitted when hover on a day by mouse enter
// Emitted when hover on a day by mouse enter
this.prefixCls = PREFIX_CLASS;
}
/**
* Hide "next" arrow in left panel,
* hide "prev" arrow in right panel
* @param {?} direction
* @param {?} panelMode
* @return {?}
*/
enablePrevNext(direction, panelMode) {
if (!this.showTimePicker &&
panelMode === this.endPanelMode &&
((this.partType === 'left' && direction === 'next') || (this.partType === 'right' && direction === 'prev'))) {
return false;
}
return true;
}
/**
* @param {?} date
* @return {?}
*/
onSelectTime(date) {
this.selectTime.emit(new CandyDate(date));
}
// The value real changed to outside
/**
* @param {?} date
* @return {?}
*/
onSelectDate(date) {
/** @type {?} */
const value = date instanceof CandyDate ? date : new CandyDate(date);
/** @type {?} */
const timeValue = this.timeOptions && this.timeOptions.nzDefaultOpenValue;
// Display timeValue when value is null
if (!this.value && timeValue) {
value.setHms(timeValue.getHours(), timeValue.getMinutes(), timeValue.getSeconds());
}
this.selectDate.emit(value);
}
/**
* @param {?} value
* @return {?}
*/
onChooseMonth(value) {
this.activeDate = this.activeDate.setMonth(value.getMonth());
if (this.endPanelMode === 'month') {
this.value = value;
this.selectDate.emit(value);
}
else {
this.headerChange.emit(value);
this.panelModeChange.emit(this.endPanelMode);
}
}
/**
* @param {?} value
* @return {?}
*/
onChooseYear(value) {
this.activeDate = this.activeDate.setYear(value.getYear());
if (this.endPanelMode === 'year') {
this.value = value;
this.selectDate.emit(value);
}
else {
this.headerChange.emit(value);
this.panelModeChange.emit(this.endPanelMode);
}
}
/**
* @param {?} value
* @return {?}
*/
onChooseDecade(value) {
this.activeDate = this.activeDate.setYear(value.getYear());
if (this.endPanelMode === 'decade') {
this.value = value;
this.selectDate.emit(value);
}
else {
this.headerChange.emit(value);
this.panelModeChange.emit('year');
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.activeDate && !changes.activeDate.currentValue) {
this.activeDate = new CandyDate();
}
// New Antd vesion has merged 'date' ant 'time' to one panel,
// So there is not 'time' panel
if (changes.panelMode && changes.panelMode.currentValue === 'time') {
this.panelMode = 'date';
}
}
}
InnerPopupComponent.decorators = [
{ type: Component, args: [{
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
// tslint:disable-next-line:component-selector
selector: 'inner-popup',
exportAs: 'innerPopup',
template: `
<div [class.ant-picker-datetime-panel]="showTimePicker">
<div class="{{ prefixCls }}-{{ panelMode }}-panel">
<ng-container [ngSwitch]="panelMode">
<ng-container *ngSwitchCase="'decade'">
<decade-header
[(value)]="activeDate"
[locale]="locale"
[showSuperPreBtn]="enablePrevNext('prev', 'decade')"
[showSuperNextBtn]="enablePrevNext('next', 'decade')"
[showNextBtn]="false"
[showPreBtn]="false"
(panelModeChange)="panelModeChange.emit($event)"
(valueChange)="headerChange.emit($event)"
>
</decade-header>
<div class="{{ prefixCls }}-body">
<decade-table
[showWeek]="showWeek"
[activeDate]="activeDate"
[value]="value"
(valueChange)="onChooseDecade($event)"
[disabledDate]="disabledDate"
[cellRender]="dateRender"
></decade-table>
</div>
</ng-container>
<ng-container *ngSwitchCase="'year'">
<year-header
[(value)]="activeDate"
[locale]="locale"
[showSuperPreBtn]="enablePrevNext('prev', 'year')"
[showSuperNextBtn]="enablePrevNext('next', 'year')"
[showNextBtn]="false"
[showPreBtn]="false"
(panelModeChange)="panelModeChange.emit($event)"
(valueChange)="headerChange.emit($event)"
>
</year-header>
<div class="{{ prefixCls }}-body">
<year-table
[showWeek]="showWeek"
[activeDate]="activeDate"
[value]="value"
(valueChange)="onChooseYear($event)"
[disabledDate]="disabledDate"
[cellRender]="dateRender"
></year-table>
</div>
</ng-container>
<ng-container *ngSwitchCase="'month'">
<month-header
[(value)]="activeDate"
[locale]="locale"
[showNextBtn]="false"
[showPreBtn]="false"
(panelModeChange)="panelModeChange.emit($event)"
(valueChange)="headerChange.emit($event)"
>
</month-header>
<div class="{{ prefixCls }}-body">
<month-table
[showWeek]="showWeek"
[value]="value"
[activeDate]="activeDate"
[disabledDate]="disabledDate"
[cellRender]="dateRender"
(dayHover)="dayHover.emit($event)"
(valueChange)="onChooseMonth($event)"
></month-table>
</div>
</ng-container>
<ng-container *ngSwitchDefault>
<date-header
[(value)]="activeDate"
[locale]="locale"
[showSuperPreBtn]="enablePrevNext('prev', 'date')"
[showSuperNextBtn]="enablePrevNext('next', 'date')"
[showPreBtn]="enablePrevNext('prev', 'date')"
[showNextBtn]="enablePrevNext('next', 'date')"
(panelModeChange)="panelModeChange.emit($event)"
(valueChange)="headerChange.emit($event)"
>
</date-header>
<div class="{{ prefixCls }}-body">
<date-table
[locale]="locale"
[showWeek]="showWeek"
[value]="value"
[activeDate]="activeDate"
(valueChange)="onSelectDate($event)"
[disabledDate]="disabledDate"
[cellRender]="dateRender"
[selectedValue]="selectedValue"
[hoverValue]="hoverValue"
(dayHover)="dayHover.emit($event)"
></date-table>
</div>
</ng-container>
</ng-container>
</div>
<ng-container *ngIf="showTimePicker && timeOptions">
<nz-time-picker-panel
[nzInDatePicker]="true"
[ngModel]="value?.nativeDate"
(ngModelChange)="onSelectTime($event)"
[format]="timeOptions.nzFormat"
[nzHourStep]="timeOptions.nzHourStep"
[nzMinuteStep]="timeOptions.nzMinuteStep"
[nzSecondStep]="timeOptions.nzSecondStep"
[nzDisabledHours]="timeOptions.nzDisabledHours"
[nzDisabledMinutes]="timeOptions.nzDisabledMinutes"
[nzDisabledSeconds]="timeOptions.nzDisabledSeconds"
[nzHideDisabledOptions]="timeOptions.nzHideDisabledOptions"
[nzDefaultOpenValue]="timeOptions.nzDefaultOpenValue"
[nzUse12Hours]="timeOptions.nzUse12Hours"
[nzAddOn]="timeOptions.nzAddOn"
></nz-time-picker-panel>
<!-- use [opened] to trigger time panel \`initPosition()\` -->
</ng-container>
</div>
`
}] }
];
InnerPopupComponent.propDecorators = {
activeDate: [{ type: Input }],
endPanelMode: [{ type: Input }],
panelMode: [{ type: Input }],
showWeek: [{ type: Input }],
locale: [{ type: Input }],
showTimePicker: [{ type: Input }],
timeOptions: [{ type: Input }],
disabledDate: [{ type: Input }],
dateRender: [{ type: Input }],
selectedValue: [{ type: Input }],
hoverValue: [{ type: Input }],
value: [{ type: Input }],
partType: [{ type: Input }],
panelModeChange: [{ type: Output }],
headerChange: [{ type: Output }],
selectDate: [{ type: Output }],
selectTime: [{ type: Output }],
dayHover: [{ type: Output }]
};
if (false) {
/** @type {?} */
InnerPopupComponent.prototype.activeDate;
/** @type {?} */
InnerPopupComponent.prototype.endPanelMode;
/** @type {?} */
InnerPopupComponent.prototype.panelMode;
/** @type {?} */
InnerPopupComponent.prototype.showWeek;
/** @type {?} */
InnerPopupComponent.prototype.locale;
/** @type {?} */
InnerPopupComponent.prototype.showTimePicker;
/** @type {?} */
InnerPopupComponent.prototype.timeOptions;
/** @type {?} */
InnerPopupComponent.prototype.disabledDate;
/** @type {?} */
InnerPopupComponent.prototype.dateRender;
/** @type {?} */
InnerPopupComponent.prototype.selectedValue;
/** @type {?} */
InnerPopupComponent.prototype.hoverValue;
/** @type {?} */
InnerPopupComponent.prototype.value;
/** @type {?} */
InnerPopupComponent.prototype.partType;
/** @type {?} */
InnerPopupComponent.prototype.panelModeChange;
/** @type {?} */
InnerPopupComponent.prototype.headerChange;
/** @type {?} */
InnerPopupComponent.prototype.selectDate;
/** @type {?} */
InnerPopupComponent.prototype.selectTime;
/** @type {?} */
InnerPopupComponent.prototype.dayHover;
/** @type {?} */
InnerPopupComponent.prototype.prefixCls;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5uZXItcG9wdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC9kYXRlLXBpY2tlci8iLCJzb3VyY2VzIjpbImlubmVyLXBvcHVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFRQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFHTixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXBELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFvSXRDLE1BQU0sT0FBTyxtQkFBbUI7SUFsSWhDO1FBaUpxQixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7O1FBR2hELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQyxDQUFDLCtDQUErQzs7UUFDN0YsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUMsQ0FBQyw0REFBNEQ7O1FBQ3hHLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBQzNDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDLENBQUMsNkNBQTZDOztRQUUxRyxjQUFTLEdBQVcsWUFBWSxDQUFDO0lBK0VuQyxDQUFDOzs7Ozs7OztJQXZFQyxjQUFjLENBQUMsU0FBMEIsRUFBRSxTQUFvQjtRQUM3RCxJQUNFLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFDcEIsU0FBUyxLQUFLLElBQUksQ0FBQyxZQUFZO1lBQy9CLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLE1BQU0sSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsRUFDM0c7WUFDQSxPQUFPLEtBQUssQ0FBQztT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SUFFNUQsd0NBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENhbmR5RGF0ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90aW1lJztcbmltcG9ydCB7IEZ1bmN0aW9uUHJvcCB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBOekNhbGVuZGFySTE4bkludGVyZmFjZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaTE4bic7XG5pbXBvcnQgeyBEaXNhYmxlZERhdGVGbiwgUGFuZWxNb2RlLCBSYW5nZVBhcnRUeXBlLCBTdXBwb3J0VGltZU9wdGlvbnMgfSBmcm9tICcuL3N0YW5kYXJkLXR5cGVzJztcbmltcG9ydCB7IFBSRUZJWF9DTEFTUyB9IGZyb20gJy4vdXRpbCc7XG5cbkBDb21wb25lbnQoe1xuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2lubmVyLXBvcHVwJyxcbiAgZXhwb3J0QXM6ICdpbm5lclBvcHVwJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzcy5hbnQtcGlja2VyLWRhdGV0aW1lLXBhbmVsXT1cInNob3dUaW1lUGlja2VyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LXt7IHBhbmVsTW9kZSB9fS1wYW5lbFwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJwYW5lbE1vZGVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGVjYWRlJ1wiPlxuICAgICAgICAgICAgPGRlY2FkZS1oZWFkZXJcbiAgICAgICAgICAgICAgWyh2YWx1ZSldPVwiYWN0aXZlRGF0ZVwiXG4gICAgICAgICAgICAgIFtsb2NhbGVdPVwibG9jYWxlXCJcbiAgICAgICAgICAgICAgW3Nob3dTdXBlclByZUJ0bl09XCJlbmFibGVQcmV2TmV4dCgncHJldicsICdkZWNhZGUnKVwiXG4gICAgICAgICAgICAgIFtzaG93U3VwZXJOZXh0QnRuXT1cImVuYWJsZVByZXZOZXh0KCduZXh0JywgJ2RlY2FkZScpXCJcbiAgICAgICAgICAgICAgW3Nob3dOZXh0QnRuXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3Nob3dQcmVCdG5dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAocGFuZWxNb2RlQ2hhbmdlKT1cInBhbmVsTW9kZUNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGVhZGVyQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2RlY2FkZS1oZWFkZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LWJvZHlcIj5cbiAgICAgICAgICAgICAgPGRlY2FkZS10YWJsZVxuICAgICAgICAgICAgICAgIFtzaG93V2Vla109XCJzaG93V2Vla1wiXG4gICAgICAgICAgICAgICAgW2FjdGl2ZURhdGVdPVwiYWN0aXZlRGF0ZVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaG9vc2VEZWNhZGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkRGF0ZV09XCJkaXNhYmxlZERhdGVcIlxuICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyXT1cImRhdGVSZW5kZXJcIlxuICAgICAgICAgICAgICA+PC9kZWNhZGUtdGFibGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIneWVhcidcIj5cbiAgICAgICAgICAgIDx5ZWFyLWhlYWRlclxuICAgICAgICAgICAgICBbKHZhbHVlKV09XCJhY3RpdmVEYXRlXCJcbiAgICAgICAgICAgICAgW2xvY2FsZV09XCJsb2NhbGVcIlxuICAgICAgICAgICAgICBbc2hvd1N1cGVyUHJlQnRuXT1cImVuYWJsZVByZXZOZXh0KCdwcmV2JywgJ3llYXInKVwiXG4gICAgICAgICAgICAgIFtzaG93U3VwZXJOZXh0QnRuXT1cImVuYWJsZVByZXZOZXh0KCduZXh0JywgJ3llYXInKVwiXG4gICAgICAgICAgICAgIFtzaG93TmV4dEJ0bl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtzaG93UHJlQnRuXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKHBhbmVsTW9kZUNoYW5nZSk9XCJwYW5lbE1vZGVDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImhlYWRlckNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC95ZWFyLWhlYWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7eyBwcmVmaXhDbHMgfX0tYm9keVwiPlxuICAgICAgICAgICAgICA8eWVhci10YWJsZVxuICAgICAgICAgICAgICAgIFtzaG93V2Vla109XCJzaG93V2Vla1wiXG4gICAgICAgICAgICAgICAgW2FjdGl2ZURhdGVdPVwiYWN0aXZlRGF0ZVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaG9vc2VZZWFyKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZERhdGVdPVwiZGlzYWJsZWREYXRlXCJcbiAgICAgICAgICAgICAgICBbY2VsbFJlbmRlcl09XCJkYXRlUmVuZGVyXCJcbiAgICAgICAgICAgICAgPjwveWVhci10YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtb250aCdcIj5cbiAgICAgICAgICAgIDxtb250aC1oZWFkZXJcbiAgICAgICAgICAgICAgWyh2YWx1ZSldPVwiYWN0aXZlRGF0ZVwiXG4gICAgICAgICAgICAgIFtsb2NhbGVdPVwibG9jYWxlXCJcbiAgICAgICAgICAgICAgW3Nob3dOZXh0QnRuXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3Nob3dQcmVCdG5dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAocGFuZWxNb2RlQ2hhbmdlKT1cInBhbmVsTW9kZUNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGVhZGVyQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L21vbnRoLWhlYWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7eyBwcmVmaXhDbHMgfX0tYm9keVwiPlxuICAgICAgICAgICAgICA8bW9udGgtdGFibGVcbiAgICAgICAgICAgICAgICBbc2hvd1dlZWtdPVwic2hvd1dlZWtcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2FjdGl2ZURhdGVdPVwiYWN0aXZlRGF0ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkRGF0ZV09XCJkaXNhYmxlZERhdGVcIlxuICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyXT1cImRhdGVSZW5kZXJcIlxuICAgICAgICAgICAgICAgIChkYXlIb3Zlcik9XCJkYXlIb3Zlci5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNob29zZU1vbnRoKCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9tb250aC10YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgPGRhdGUtaGVhZGVyXG4gICAgICAgICAgICAgIFsodmFsdWUpXT1cImFjdGl2ZURhdGVcIlxuICAgICAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgICAgIFtzaG93U3VwZXJQcmVCdG5dPVwiZW5hYmxlUHJldk5leHQoJ3ByZXYnLCAnZGF0ZScpXCJcbiAgICAgICAgICAgICAgW3Nob3dTdXBlck5leHRCdG5dPVwiZW5hYmxlUHJldk5leHQoJ25leHQnLCAnZGF0ZScpXCJcbiAgICAgICAgICAgICAgW3Nob3dQcmVCdG5dPVwiZW5hYmxlUHJldk5leHQoJ3ByZXYnLCAnZGF0ZScpXCJcbiAgICAgICAgICAgICAgW3Nob3dOZXh0QnRuXT1cImVuYWJsZVByZXZOZXh0KCduZXh0JywgJ2RhdGUnKVwiXG4gICAgICAgICAgICAgIChwYW5lbE1vZGVDaGFuZ2UpPVwicGFuZWxNb2RlQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoZWFkZXJDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGF0ZS1oZWFkZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LWJvZHlcIj5cbiAgICAgICAgICAgICAgPGRhdGUtdGFibGVcbiAgICAgICAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dXZWVrXT1cInNob3dXZWVrXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgIFthY3RpdmVEYXRlXT1cImFjdGl2ZURhdGVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNlbGVjdERhdGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkRGF0ZV09XCJkaXNhYmxlZERhdGVcIlxuICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyXT1cImRhdGVSZW5kZXJcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlXT1cInNlbGVjdGVkVmFsdWVcIlxuICAgICAgICAgICAgICAgIFtob3ZlclZhbHVlXT1cImhvdmVyVmFsdWVcIlxuICAgICAgICAgICAgICAgIChkYXlIb3Zlcik9XCJkYXlIb3Zlci5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9kYXRlLXRhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1RpbWVQaWNrZXIgJiYgdGltZU9wdGlvbnNcIj5cbiAgICAgICAgPG56LXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgICAgW256SW5EYXRlUGlja2VyXT1cInRydWVcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cInZhbHVlPy5uYXRpdmVEYXRlXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlbGVjdFRpbWUoJGV2ZW50KVwiXG4gICAgICAgICAgW2Zvcm1hdF09XCJ0aW1lT3B0aW9ucy5uekZvcm1hdFwiXG4gICAgICAgICAgW256SG91clN0ZXBdPVwidGltZU9wdGlvbnMubnpIb3VyU3RlcFwiXG4gICAgICAgICAgW256TWludXRlU3RlcF09XCJ0aW1lT3B0aW9ucy5uek1pbnV0ZVN0ZXBcIlxuICAgICAgICAgIFtuelNlY29uZFN0ZXBdPVwidGltZU9wdGlvbnMubnpTZWNvbmRTdGVwXCJcbiAgICAgICAgICBbbnpEaXNhYmxlZEhvdXJzXT1cInRpbWVPcHRpb25zLm56RGlzYWJsZWRIb3Vyc1wiXG4gICAgICAgICAgW256RGlzYWJsZWRNaW51dGVzXT1cInRpbWVPcHRpb25zLm56RGlzYWJsZWRNaW51dGVzXCJcbiAgICAgICAgICBbbnpEaXNhYmxlZFNlY29uZHNdPVwidGltZU9wdGlvbnMubnpEaXNhYmxlZFNlY29uZHNcIlxuICAgICAgICAgIFtuekhpZGVEaXNhYmxlZE9wdGlvbnNdPVwidGltZU9wdGlvbnMubnpIaWRlRGlzYWJsZWRPcHRpb25zXCJcbiAgICAgICAgICBbbnpEZWZhdWx0T3BlblZhbHVlXT1cInRpbWVPcHRpb25zLm56RGVmYXVsdE9wZW5WYWx1ZVwiXG4gICAgICAgICAgW256VXNlMTJIb3Vyc109XCJ0aW1lT3B0aW9ucy5uelVzZTEySG91cnNcIlxuICAgICAgICAgIFtuekFkZE9uXT1cInRpbWVPcHRpb25zLm56QWRkT25cIlxuICAgICAgICA+PC9uei10aW1lLXBpY2tlci1wYW5lbD5cbiAgICAgICAgPCEtLSB1c2UgW29wZW5lZF0gdG8gdHJpZ2dlciB0aW1lIHBhbmVsIFxcYGluaXRQb3NpdGlvbigpXFxgIC0tPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgSW5uZXJQb3B1cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGFjdGl2ZURhdGU6IENhbmR5RGF0ZTtcbiAgQElucHV0KCkgZW5kUGFuZWxNb2RlOiBQYW5lbE1vZGU7XG4gIEBJbnB1dCgpIHBhbmVsTW9kZTogUGFuZWxNb2RlO1xuICBASW5wdXQoKSBzaG93V2VlazogYm9vbGVhbjtcbiAgQElucHV0KCkgbG9jYWxlOiBOekNhbGVuZGFySTE4bkludGVyZmFjZTtcbiAgQElucHV0KCkgc2hvd1RpbWVQaWNrZXI6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHRpbWVPcHRpb25zOiBTdXBwb3J0VGltZU9wdGlvbnM7XG4gIEBJbnB1dCgpIGRpc2FibGVkRGF0ZTogRGlzYWJsZWREYXRlRm47XG4gIEBJbnB1dCgpIGRhdGVSZW5kZXI6IEZ1bmN0aW9uUHJvcDxUZW1wbGF0ZVJlZjxEYXRlPiB8IHN0cmluZz47XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmFsdWU6IENhbmR5RGF0ZVtdOyAvLyBSYW5nZSBPTkxZXG4gIEBJbnB1dCgpIGhvdmVyVmFsdWU6IENhbmR5RGF0ZVtdOyAvLyBSYW5nZSBPTkxZXG4gIEBJbnB1dCgpIHZhbHVlOiBDYW5keURhdGU7XG4gIEBJbnB1dCgpIHBhcnRUeXBlOiBSYW5nZVBhcnRUeXBlO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBwYW5lbE1vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFBhbmVsTW9kZT4oKTtcblxuICAvLyBUT0RPOiBuYW1lIGlzIG5vdCBwcm9wZXJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGhlYWRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FuZHlEYXRlPigpOyAvLyBFbWl0dGVkIHdoZW4gdXNlciBjaGFuZ2VkIHRoZSBoZWFkZXIncyB2YWx1ZVxuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0RGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FuZHlEYXRlPigpOyAvLyBFbWl0dGVkIHdoZW4gdGhlIGRhdGUgaXMgc2VsZWN0ZWQgYnkgY2xpY2sgdGhlIGRhdGUgcGFuZWxcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdFRpbWUgPSBuZXcgRXZlbnRFbWl0dGVyPENhbmR5RGF0ZT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRheUhvdmVyID0gbmV3IEV2ZW50RW1pdHRlcjxDYW5keURhdGU+KCk7IC8vIEVtaXR0ZWQgd2hlbiBob3ZlciBvbiBhIGRheSBieSBtb3VzZSBlbnRlclxuXG4gIHByZWZpeENsczogc3RyaW5nID0gUFJFRklYX0NMQVNTO1xuXG4gIC8qKlxuICAgKiBIaWRlIFwibmV4dFwiIGFycm93IGluIGxlZnQgcGFuZWwsXG4gICAqIGhpZGUgXCJwcmV2XCIgYXJyb3cgaW4gcmlnaHQgcGFuZWxcbiAgICogQHBhcmFtIGRpcmVjdGlvblxuICAgKiBAcGFyYW0gcGFuZWxNb2RlXG4gICAqL1xuICBlbmFibGVQcmV2TmV4dChkaXJlY3Rpb246ICdwcmV2JyB8ICduZXh0JywgcGFuZWxNb2RlOiBQYW5lbE1vZGUpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5zaG93VGltZVBpY2tlciAmJlxuICAgICAgcGFuZWxNb2RlID09PSB0aGlzLmVuZFBhbmVsTW9kZSAmJlxuICAgICAgKCh0aGlzLnBhcnRUeXBlID09PSAnbGVmdCcgJiYgZGlyZWN0aW9uID09PSAnbmV4dCcpIHx8ICh0aGlzLnBhcnRUeXBlID09PSAncmlnaHQnICYmIGRpcmVjdGlvbiA9PT0gJ3ByZXYnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvblNlbGVjdFRpbWUoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0VGltZS5lbWl0KG5ldyBDYW5keURhdGUoZGF0ZSkpO1xuICB9XG5cbiAgLy8gVGhlIHZhbHVlIHJlYWwgY2hhbmdlZCB0byBvdXRzaWRlXG4gIG9uU2VsZWN0RGF0ZShkYXRlOiBDYW5keURhdGUgfCBEYXRlKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRlIGluc3RhbmNlb2YgQ2FuZHlEYXRlID8gZGF0ZSA6IG5ldyBDYW5keURhdGUoZGF0ZSk7XG4gICAgY29uc3QgdGltZVZhbHVlID0gdGhpcy50aW1lT3B0aW9ucyAmJiB0aGlzLnRpbWVPcHRpb25zLm56RGVmYXVsdE9wZW5WYWx1ZTtcblxuICAgIC8vIERpc3BsYXkgdGltZVZhbHVlIHdoZW4gdmFsdWUgaXMgbnVsbFxuICAgIGlmICghdGhpcy52YWx1ZSAmJiB0aW1lVmFsdWUpIHtcbiAgICAgIHZhbHVlLnNldEhtcyh0aW1lVmFsdWUuZ2V0SG91cnMoKSwgdGltZVZhbHVlLmdldE1pbnV0ZXMoKSwgdGltZVZhbHVlLmdldFNlY29uZHMoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3REYXRlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25DaG9vc2VNb250aCh2YWx1ZTogQ2FuZHlEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5hY3RpdmVEYXRlLnNldE1vbnRoKHZhbHVlLmdldE1vbnRoKCkpO1xuICAgIGlmICh0aGlzLmVuZFBhbmVsTW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5zZWxlY3REYXRlLmVtaXQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlckNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgIHRoaXMucGFuZWxNb2RlQ2hhbmdlLmVtaXQodGhpcy5lbmRQYW5lbE1vZGUpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hvb3NlWWVhcih2YWx1ZTogQ2FuZHlEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5hY3RpdmVEYXRlLnNldFllYXIodmFsdWUuZ2V0WWVhcigpKTtcbiAgICBpZiAodGhpcy5lbmRQYW5lbE1vZGUgPT09ICd5ZWFyJykge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5zZWxlY3REYXRlLmVtaXQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlckNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgIHRoaXMucGFuZWxNb2RlQ2hhbmdlLmVtaXQodGhpcy5lbmRQYW5lbE1vZGUpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hvb3NlRGVjYWRlKHZhbHVlOiBDYW5keURhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLmFjdGl2ZURhdGUuc2V0WWVhcih2YWx1ZS5nZXRZZWFyKCkpO1xuICAgIGlmICh0aGlzLmVuZFBhbmVsTW9kZSA9PT0gJ2RlY2FkZScpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2VsZWN0RGF0ZS5lbWl0KHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkZXJDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLnBhbmVsTW9kZUNoYW5nZS5lbWl0KCd5ZWFyJyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmFjdGl2ZURhdGUgJiYgIWNoYW5nZXMuYWN0aXZlRGF0ZS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IG5ldyBDYW5keURhdGUoKTtcbiAgICB9XG4gICAgLy8gTmV3IEFudGQgdmVzaW9uIGhhcyBtZXJnZWQgJ2RhdGUnIGFudCAndGltZScgdG8gb25lIHBhbmVsLFxuICAgIC8vIFNvIHRoZXJlIGlzIG5vdCAndGltZScgcGFuZWxcbiAgICBpZiAoY2hhbmdlcy5wYW5lbE1vZGUgJiYgY2hhbmdlcy5wYW5lbE1vZGUuY3VycmVudFZhbHVlID09PSAndGltZScpIHtcbiAgICAgIHRoaXMucGFuZWxNb2RlID0gJ2RhdGUnO1xuICAgIH1cbiAgfVxufVxuIl19