UNPKG

@hxui/angular

Version:

* * *

351 lines (350 loc) 37.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { Component, Input, ChangeDetectorRef } from '@angular/core'; import { Subject } from 'rxjs/index'; import { Visibility } from '../enums'; import { DatepickerConfig } from './datepicker.config'; import * as moment_ from 'moment'; /** @type {?} */ const moment = moment_; export class DatepickerComponent { /** * @param {?} _changeDetectionRef * @param {?} datePickerConfig */ constructor(_changeDetectionRef, datePickerConfig) { this._changeDetectionRef = _changeDetectionRef; this.datePickerConfig = datePickerConfig; this.OpenDiv = true; this.showCalendar = true; this.activeVariable = true; this.placement = 'bottom'; this.allowInterval = false; this.selectedDueDateInterval = '0 day(s)'; this.visibilityEnum = Visibility; this.visibility = Visibility.Hidden; this.days = new Array(); this.week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; this.cellCount = 41; /** * Subject for notifying that the calendar has been hidden from the view */ this._onHide = new Subject(); } // Populates the days array with the current month, and completes the view with partial dates from sibling months /** * @return {?} */ renderCalendar() { for (let i = 0; i <= this.cellCount; i++) { // date will be set to the first day of the month set in this.viewDate /** @type {?} */ const date = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth()); // Shifts the week to start from Monday, rather than Sunday, this causes the index to start at 1 /** @type {?} */ const dayOffset = date.getDay() === 0 ? 7 : date.getDay(); this.days[i] = new Date(date.setDate(2 - dayOffset + i)); } } /** * @return {?} */ previousMonth() { this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() - 1); this.renderCalendar(); } /** * @return {?} */ nextMonth() { this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() + 1); this.renderCalendar(); } /** * @param {?} inputDate * @return {?} */ isCurrentMonth(inputDate) { return inputDate.getMonth() === this.viewDate.getMonth(); } /** * @param {?} inputDate * @return {?} */ isCurrentDay(inputDate) { return inputDate.getTime() === this.presentDate.getTime(); } /** * @param {?} inputDate * @return {?} */ isSelectedDay(inputDate) { if (this.selectedDate) { return inputDate.getTime() === this.selectedDate.getTime(); } return false; } /** * @param {?} inputDate * @return {?} */ isInvalidDay(inputDate) { return this.validators.map((fn) => fn(inputDate)).reduce((prev, next) => prev || next, false); } /** * @param {?} date * @return {?} */ setSelectedDate(date) { if (!this.isInvalidDay(date)) { this.selectedDate = date; this.onDateSelected(date); } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (!!changes.selectedDate.currentValue) { this.viewDate = new Date(this.selectedDate.getFullYear(), this.selectedDate.getMonth()); } } /** * @return {?} */ ngOnInit() { /** @type {?} */ const date = this.selectedDate ? this.selectedDate : new Date(); this.presentDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); this.viewDate = this.viewDate || new Date(date.getFullYear(), date.getMonth()); this.renderCalendar(); if (this.datePickerConfig.tabSelected === 'tab1') { this.activeVariable1 = false; this.activeVariable = true; } if (this.datePickerConfig.tabSelected === 'tab2') { this.activeVariable1 = true; this.activeVariable = false; } } /** * Shows the tooltip * @param {?} delay Amount of milliseconds to the delay showing the tooltip. * @return {?} */ show(delay) { // Cancel the delayed hide if it is scheduled if (this._hideTimeoutId) { clearTimeout(this._hideTimeoutId); } this._showTimeoutId = window.setTimeout(() => { // Schedule for change detection incase the tooltip is used within a // component with OnPush change detection this._changeDetectionRef.markForCheck(); this.visibility = Visibility.Visible; }, delay); if (this.allowInterval) { this.OpenDiv = true; this.showCalendar = false; } else { this.OpenDiv = false; this.showCalendar = true; } } /** * Hide the tooltip after the provided delay in ms. * @param {?} delay Amount of milliseconds to delay hiding the tooltip. * @return {?} */ hide(delay) { // Cancel the delayed show if it is scheduled if (this._showTimeoutId) { clearTimeout(this._showTimeoutId); } this._hideTimeoutId = window.setTimeout(() => { this.visibility = Visibility.Hidden; this._onHide.next(); }, delay); } /** * Returns an observable that notifies when the tooltip has been hidden from view. * @return {?} */ afterHidden() { return this._onHide.asObservable(); } /** * @return {?} */ isVisible() { return this.visibility === Visibility.Visible; } /** * @param {?} tabname * @return {?} */ onTabSelect(tabname) { if (tabname === 'tab1') { this.datePickerConfig.tabSelected = tabname; } else { this.datePickerConfig.tabSelected = tabname; } } } DatepickerComponent.decorators = [ { type: Component, args: [{ selector: 'hxa-datepicker', template: `<div class="hxui-reset" *ngIf="OpenDiv"> <div class="hxa-tabs"> <hx-tabset class="hxa-tabset"> <hx-tab heading="Set interval" (select)="onTabSelect('tab1')" [active]="activeVariable"> <hxa-datepicker-interval></hxa-datepicker-interval> </hx-tab> <hx-tab heading="Specific date" (select)="onTabSelect('tab2')" [active]="activeVariable1"> <div class="hxui-reset"> <div class="hx-card hxa-datepicker-container"> <div class="hx-card-header hxa-datepicker-header"> <div class="hxa-datepicker-month"> <div class="hxa-datepicker-icon" title="Previous Month" (click)="previousMonth()"> <a class="hx-button is-transparent"><i class="hx-icon icon-angle-left"></i></a> </div> <div class="hxa-datepicker-month-title"> <span>{{viewDate.toLocaleString("en-au", { month: "long", year: "numeric" })}}</span></div> <div class="hxa-datepicker-icon" title="Next Month" (click)="nextMonth()"> <a class="hx-button is-transparent"><i class="hx-icon icon-angle-right"></i></a> </div> </div> <div class="hxa-datepicker-week"> <div class="hxa-datepicker-weekday" *ngFor="let weekday of week"> {{weekday | slice:0:3}} </div> </div> </div> <div class="hxa-datepicker-contents"> <div class="hxa-datepicker-day" *ngFor="let day of days" [ngClass]="{'hxa-datepicker-day-siblingmonth': !isCurrentMonth(day), 'hxa-datepicker-day-currentday': isCurrentDay(day), 'hxa-datepicker-day-selectedday': isSelectedDay(day), 'hxa-datepicker-day-invalidday': isInvalidDay(day)}" (click)="setSelectedDate(day)"> <a class="hx-button is-transparent">{{day.getDate()}}</a> </div> </div> </div> </div> </hx-tab> </hx-tabset> </div> </div> <div class="hxui-reset" *ngIf="showCalendar"> <div class="hx-card hxa-datepicker-container"> <div class="hx-card-header hxa-datepicker-header"> <div class="hxa-datepicker-month"> <div class="hxa-datepicker-icon" title="Previous Month" (click)="previousMonth()"> <a class="hx-button is-transparent"><i class="hx-icon icon-angle-left"></i></a> </div> <div class="hxa-datepicker-month-title"> <span>{{viewDate.toLocaleString("en-au", { month: "long", year: "numeric" })}}</span></div> <div class="hxa-datepicker-icon" title="Next Month" (click)="nextMonth()"> <a class="hx-button is-transparent"><i class="hx-icon icon-angle-right"></i></a> </div> </div> <div class="hxa-datepicker-week"> <div class="hxa-datepicker-weekday" *ngFor="let weekday of week"> {{weekday | slice:0:3}} </div> </div> </div> <div class="hxa-datepicker-contents"> <div class="hxa-datepicker-day" *ngFor="let day of days" [ngClass]="{'hxa-datepicker-day-siblingmonth': !isCurrentMonth(day), 'hxa-datepicker-day-currentday': isCurrentDay(day), 'hxa-datepicker-day-selectedday': isSelectedDay(day), 'hxa-datepicker-day-invalidday': isInvalidDay(day)}" (click)="setSelectedDate(day)"> <a class="hx-button is-transparent">{{day.getDate()}}</a> </div> </div> </div> </div> `, styles: [`.hxa-datepicker-container{max-width:19rem;width:19rem;height:21rem;display:flex;flex-direction:column;font-size:1rem}.hxa-datepicker-header{padding:.5rem .5rem 0;flex-direction:column;align-items:initial;justify-content:space-around;font-weight:100}.hxa-datepicker-icon{cursor:pointer;display:flex;flex:1;flex-direction:column;justify-content:center;align-items:center}.hxa-datepicker-icon .hx-button{position:initial!important;top:initial!important}.hxa-datepicker-icon .hx-button.is-transparent:hover{color:#000}.hxa-datepicker-icon .hx-icon{font-size:2em;position:initial!important;top:initial!important;color:#0d4d78}.hxa-datepicker-month{display:flex;text-align:center;margin-bottom:.5rem}.hxa-datepicker-month-title{font-size:1.25em;font-weight:400;flex:3;display:flex;justify-content:center;align-items:center;color:#0d4d78}.hxa-datepicker-week{display:flex;width:100%;text-align:center}.hxa-datepicker-weekday{flex:1;color:#0d4d78;font-size:.85em}.hxa-datepicker-contents{padding:.5rem;background-color:rgba(246,246,249,.5);display:flex;flex-flow:row wrap;flex:1;justify-content:space-around;align-content:space-around}.hxa-datepicker-day{flex:1 1 14%;height:16.666%;display:flex;justify-content:center;align-items:center}.hxa-datepicker-day .hx-button{position:initial;top:initial;flex:1;font-weight:400;height:100%;padding:0;color:#41b987}.hxa-datepicker-day-siblingmonth .hx-button{color:#3b3b3b;font-weight:100}.hxa-datepicker-day-selectedday .hx-button{color:#fff;background:#41b987}.hxa-datepicker-day-invalidday .hx-button{color:#e0e0e1!important;pointer-events:none}.hxa-datepicker-day-currentday .hx-button{border:2px solid #41b987}:host{max-width:24rem;border:1px solid #d3d3d3;background:#fff}:host .hxa-tabs ::ng-deep hx-tabset ::ng-deep ul{background-color:#fff;margin-bottom:0}:host .hxa-tabs ::ng-deep hx-tabset ::ng-deep ul ::ng-deep li{width:50%}:host .hxa-tabs ::ng-deep hx-tabset ::ng-deep ul ::ng-deep li a span{font-size:medium;margin:auto}:host .hxa-tabs ::ng-deep hx-tabset ::ng-deep .hx-tab-content{padding:0}`] },] }, ]; /** @nocollapse */ DatepickerComponent.ctorParameters = () => [ { type: ChangeDetectorRef }, { type: DatepickerConfig } ]; DatepickerComponent.propDecorators = { selectedDate: [{ type: Input }], validators: [{ type: Input }], placement: [{ type: Input }], allowInterval: [{ type: Input }], selectedDueDateInterval: [{ type: Input }] }; if (false) { /** @type {?} */ DatepickerComponent.prototype.OpenDiv; /** @type {?} */ DatepickerComponent.prototype.showCalendar; /** @type {?} */ DatepickerComponent.prototype.tabname1; /** @type {?} */ DatepickerComponent.prototype.activeVariable; /** @type {?} */ DatepickerComponent.prototype.activeVariable1; /** @type {?} */ DatepickerComponent.prototype.selectedDate; /** @type {?} */ DatepickerComponent.prototype.validators; /** @type {?} */ DatepickerComponent.prototype.placement; /** @type {?} */ DatepickerComponent.prototype.allowInterval; /** @type {?} */ DatepickerComponent.prototype.selectedDueDateInterval; /** @type {?} */ DatepickerComponent.prototype.onDateSelected; /** @type {?} */ DatepickerComponent.prototype.visibilityEnum; /** @type {?} */ DatepickerComponent.prototype.visibility; /** @type {?} */ DatepickerComponent.prototype.viewDate; /** @type {?} */ DatepickerComponent.prototype.days; /** @type {?} */ DatepickerComponent.prototype.week; /** @type {?} */ DatepickerComponent.prototype.presentDate; /** @type {?} */ DatepickerComponent.prototype.cellCount; /** @type {?} */ DatepickerComponent.prototype._dp; /** * Subject for notifying that the calendar has been hidden from the view * @type {?} */ DatepickerComponent.prototype._onHide; /** * The timeout ID of any current timer set to show the calendar * @type {?} */ DatepickerComponent.prototype._showTimeoutId; /** * The timeout ID of any current timer set to hide the calendar * @type {?} */ DatepickerComponent.prototype._hideTimeoutId; /** @type {?} */ DatepickerComponent.prototype._changeDetectionRef; /** @type {?} */ DatepickerComponent.prototype.datePickerConfig; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLE9BQU8sRUFDTCxTQUFTLEVBQWtCLEtBQUssRUFDaEMsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBYSxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0MsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQzs7TUFDNUIsTUFBTSxHQUFHLE9BQU87QUFpRnRCLE1BQU0sT0FBTyxtQkFBbUI7Ozs7O0lBd0M5QixZQUFvQixtQkFBc0MsRUFBVSxnQkFBa0M7UUFBbEYsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFtQjtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUF2Qy9GLFlBQU8sR0FBWSxJQUFJLENBQUM7UUFDeEIsaUJBQVksR0FBWSxJQUFJLENBQUM7UUFFN0IsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFVdEMsY0FBUyxHQUF3QyxRQUFRLENBQUM7UUFHMUQsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFHdEIsNEJBQXVCLEdBQUcsVUFBVSxDQUFDO1FBR3JDLG1CQUFjLEdBQUcsVUFBVSxDQUFDO1FBQzVCLGVBQVUsR0FBZSxVQUFVLENBQUMsTUFBTSxDQUFDO1FBRTNDLFNBQUksR0FBZ0IsSUFBSSxLQUFLLEVBQVEsQ0FBQztRQUN0QyxTQUFJLEdBQWtCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFN0Ys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SCxDQUFDOzs7WUF4UEgsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EwRVg7Z0JBQ0MsTUFBTSxFQUFFLENBQUMsMi9EQUEyL0QsQ0FBQzthQUN0Z0U7Ozs7WUF0RkMsaUJBQWlCO1lBSVgsZ0JBQWdCOzs7MkJBMEZyQixLQUFLO3lCQUdMLEtBQUs7d0JBR0wsS0FBSzs0QkFHTCxLQUFLO3NDQUdMLEtBQUs7Ozs7SUFsQk4sc0NBQStCOztJQUMvQiwyQ0FBb0M7O0lBQ3BDLHVDQUF3Qjs7SUFDeEIsNkNBQXNDOztJQUN0Qyw4Q0FBZ0M7O0lBRWhDLDJDQUNtQjs7SUFFbkIseUNBQzJDOztJQUUzQyx3Q0FDMEQ7O0lBRTFELDRDQUNzQjs7SUFFdEIsc0RBQ3FDOztJQUVyQyw2Q0FBMEM7O0lBQzFDLDZDQUE0Qjs7SUFDNUIseUNBQTJDOztJQUMzQyx1Q0FBZTs7SUFDZixtQ0FBc0M7O0lBQ3RDLG1DQUFxRzs7SUFDckcsMENBQTBCOztJQUMxQix3Q0FBdUI7O0lBQ3ZCLGtDQUFnRDs7Ozs7SUFFaEQsc0NBQXVEOzs7OztJQUd2RCw2Q0FBK0I7Ozs7O0lBRy9CLDZDQUErQjs7SUFFbkIsa0RBQThDOztJQUFFLCtDQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVwaWNrZXJJbnRlcnZhbENvbXBvbmVudCB9IGZyb20gJy4vZGF0ZXBpY2tlci1pbnRlcnZhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCwgT25Jbml0LCBPdXRwdXQsIElucHV0LCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tICdyeGpzL2luZGV4JztcclxuaW1wb3J0IHtWaXNpYmlsaXR5fSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7RGF0ZXBpY2tlckNvbmZpZ30gZnJvbSAnLi9kYXRlcGlja2VyLmNvbmZpZyc7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaHhhLWRhdGVwaWNrZXInLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImh4dWktcmVzZXRcIiAqbmdJZj1cIk9wZW5EaXZcIj5cclxuICA8ZGl2IGNsYXNzPVwiaHhhLXRhYnNcIj5cclxuICAgIDxoeC10YWJzZXQgY2xhc3M9XCJoeGEtdGFic2V0XCI+XHJcbiAgICAgIDxoeC10YWIgIGhlYWRpbmc9XCJTZXQgaW50ZXJ2YWxcIiAoc2VsZWN0KT1cIm9uVGFiU2VsZWN0KCd0YWIxJylcIiBbYWN0aXZlXT1cImFjdGl2ZVZhcmlhYmxlXCI+XHJcbiAgICAgICAgPGh4YS1kYXRlcGlja2VyLWludGVydmFsPjwvaHhhLWRhdGVwaWNrZXItaW50ZXJ2YWw+XHJcbiAgICAgIDwvaHgtdGFiPlxyXG4gICAgICA8aHgtdGFiICBoZWFkaW5nPVwiU3BlY2lmaWMgZGF0ZVwiIChzZWxlY3QpPVwib25UYWJTZWxlY3QoJ3RhYjInKVwiIFthY3RpdmVdPVwiYWN0aXZlVmFyaWFibGUxXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImh4dWktcmVzZXRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoeC1jYXJkIGh4YS1kYXRlcGlja2VyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaHgtY2FyZC1oZWFkZXIgaHhhLWRhdGVwaWNrZXItaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLW1vbnRoXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItaWNvblwiIHRpdGxlPVwiUHJldmlvdXMgTW9udGhcIiAoY2xpY2spPVwicHJldmlvdXNNb250aCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJoeC1idXR0b24gaXMtdHJhbnNwYXJlbnRcIj48aSBjbGFzcz1cImh4LWljb24gaWNvbi1hbmdsZS1sZWZ0XCI+PC9pPjwvYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLW1vbnRoLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7dmlld0RhdGUudG9Mb2NhbGVTdHJpbmcoXCJlbi1hdVwiLCB7IG1vbnRoOiBcImxvbmdcIiwgeWVhcjogXCJudW1lcmljXCIgfSl9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1pY29uXCIgdGl0bGU9XCJOZXh0IE1vbnRoXCIgKGNsaWNrKT1cIm5leHRNb250aCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJoeC1idXR0b24gaXMtdHJhbnNwYXJlbnRcIj48aSBjbGFzcz1cImh4LWljb24gaWNvbi1hbmdsZS1yaWdodFwiPjwvaT48L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItd2Vla1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLXdlZWtkYXlcIiAqbmdGb3I9XCJsZXQgd2Vla2RheSBvZiB3ZWVrXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7d2Vla2RheSB8IHNsaWNlOjA6M319XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1jb250ZW50c1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1kYXlcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIGRheXNcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydoeGEtZGF0ZXBpY2tlci1kYXktc2libGluZ21vbnRoJzogIWlzQ3VycmVudE1vbnRoKGRheSksXHJcbiAgICAgICAgICAgICAgICAnaHhhLWRhdGVwaWNrZXItZGF5LWN1cnJlbnRkYXknOiBpc0N1cnJlbnREYXkoZGF5KSxcclxuICAgICAgICAgICAgICAgICdoeGEtZGF0ZXBpY2tlci1kYXktc2VsZWN0ZWRkYXknOiBpc1NlbGVjdGVkRGF5KGRheSksXHJcbiAgICAgICAgICAgICAgICAnaHhhLWRhdGVwaWNrZXItZGF5LWludmFsaWRkYXknOiBpc0ludmFsaWREYXkoZGF5KX1cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldFNlbGVjdGVkRGF0ZShkYXkpXCI+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJoeC1idXR0b24gaXMtdHJhbnNwYXJlbnRcIj57e2RheS5nZXREYXRlKCl9fTwvYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9oeC10YWI+XHJcbiAgICA8L2h4LXRhYnNldD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJoeHVpLXJlc2V0XCIgKm5nSWY9XCJzaG93Q2FsZW5kYXJcIj5cclxuICA8ZGl2IGNsYXNzPVwiaHgtY2FyZCBoeGEtZGF0ZXBpY2tlci1jb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJoeC1jYXJkLWhlYWRlciBoeGEtZGF0ZXBpY2tlci1oZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLW1vbnRoXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLWljb25cIiB0aXRsZT1cIlByZXZpb3VzIE1vbnRoXCIgKGNsaWNrKT1cInByZXZpb3VzTW9udGgoKVwiPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImh4LWJ1dHRvbiBpcy10cmFuc3BhcmVudFwiPjxpIGNsYXNzPVwiaHgtaWNvbiBpY29uLWFuZ2xlLWxlZnRcIj48L2k+PC9hPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1tb250aC10aXRsZVwiPlxyXG4gICAgICAgICAgPHNwYW4+e3t2aWV3RGF0ZS50b0xvY2FsZVN0cmluZyhcImVuLWF1XCIsIHsgbW9udGg6IFwibG9uZ1wiLCB5ZWFyOiBcIm51bWVyaWNcIiB9KX19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1pY29uXCIgdGl0bGU9XCJOZXh0IE1vbnRoXCIgKGNsaWNrKT1cIm5leHRNb250aCgpXCI+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiaHgtYnV0dG9uIGlzLXRyYW5zcGFyZW50XCI+PGkgY2xhc3M9XCJoeC1pY29uIGljb24tYW5nbGUtcmlnaHRcIj48L2k+PC9hPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLXdlZWtcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItd2Vla2RheVwiICpuZ0Zvcj1cImxldCB3ZWVrZGF5IG9mIHdlZWtcIj5cclxuICAgICAgICAgIHt7d2Vla2RheSB8IHNsaWNlOjA6M319XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItY29udGVudHNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLWRheVwiICpuZ0Zvcj1cImxldCBkYXkgb2YgZGF5c1wiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydoeGEtZGF0ZXBpY2tlci1kYXktc2libGluZ21vbnRoJzogIWlzQ3VycmVudE1vbnRoKGRheSksXHJcbiAgICAgICAgJ2h4YS1kYXRlcGlja2VyLWRheS1jdXJyZW50ZGF5JzogaXNDdXJyZW50RGF5KGRheSksXHJcbiAgICAgICAgJ2h4YS1kYXRlcGlja2VyLWRheS1zZWxlY3RlZGRheSc6IGlzU2VsZWN0ZWREYXkoZGF5KSxcclxuICAgICAgICAnaHhhLWRhdGVwaWNrZXItZGF5LWludmFsaWRkYXknOiBpc0ludmFsaWREYXkoZGF5KX1cIlxyXG4gICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZERhdGUoZGF5KVwiPlxyXG4gICAgICA8YSBjbGFzcz1cImh4LWJ1dHRvbiBpcy10cmFuc3BhcmVudFwiPnt7ZGF5LmdldERhdGUoKX19PC9hPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbmAsXHJcbiAgc3R5bGVzOiBbYC5oeGEtZGF0ZXBpY2tlci1jb250YWluZXJ7bWF4LXdpZHRoOjE5cmVtO3dpZHRoOjE5cmVtO2hlaWdodDoyMXJlbTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZvbnQtc2l6ZToxcmVtfS5oeGEtZGF0ZXBpY2tlci1oZWFkZXJ7cGFkZGluZzouNXJlbSAuNXJlbSAwO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczppbml0aWFsO2p1c3RpZnktY29udGVudDpzcGFjZS1hcm91bmQ7Zm9udC13ZWlnaHQ6MTAwfS5oeGEtZGF0ZXBpY2tlci1pY29ue2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6ZmxleDtmbGV4OjE7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS5oeGEtZGF0ZXBpY2tlci1pY29uIC5oeC1idXR0b257cG9zaXRpb246aW5pdGlhbCFpbXBvcnRhbnQ7dG9wOmluaXRpYWwhaW1wb3J0YW50fS5oeGEtZGF0ZXBpY2tlci1pY29uIC5oeC1idXR0b24uaXMtdHJhbnNwYXJlbnQ6aG92ZXJ7Y29sb3I6IzAwMH0uaHhhLWRhdGVwaWNrZXItaWNvbiAuaHgtaWNvbntmb250LXNpemU6MmVtO3Bvc2l0aW9uOmluaXRpYWwhaW1wb3J0YW50O3RvcDppbml0aWFsIWltcG9ydGFudDtjb2xvcjojMGQ0ZDc4fS5oeGEtZGF0ZXBpY2tlci1tb250aHtkaXNwbGF5OmZsZXg7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luLWJvdHRvbTouNXJlbX0uaHhhLWRhdGVwaWNrZXItbW9udGgtdGl0bGV7Zm9udC1zaXplOjEuMjVlbTtmb250LXdlaWdodDo0MDA7ZmxleDozO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtjb2xvcjojMGQ0ZDc4fS5oeGEtZGF0ZXBpY2tlci13ZWVre2Rpc3BsYXk6ZmxleDt3aWR0aDoxMDAlO3RleHQtYWxpZ246Y2VudGVyfS5oeGEtZGF0ZXBpY2tlci13ZWVrZGF5e2ZsZXg6MTtjb2xvcjojMGQ0ZDc4O2ZvbnQtc2l6ZTouODVlbX0uaHhhLWRhdGVwaWNrZXItY29udGVudHN7cGFkZGluZzouNXJlbTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ2LDI0NiwyNDksLjUpO2Rpc3BsYXk6ZmxleDtmbGV4LWZsb3c6cm93IHdyYXA7ZmxleDoxO2p1c3RpZnktY29udGVudDpzcGFjZS1hcm91bmQ7YWxpZ24tY29udGVudDpzcGFjZS1hcm91bmR9Lmh4YS1kYXRlcGlja2VyLWRheXtmbGV4OjEgMSAxNCU7aGVpZ2h0OjE2LjY2NiU7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS5oeGEtZGF0ZXBpY2tlci1kYXkgLmh4LWJ1dHRvbntwb3NpdGlvbjppbml0aWFsO3RvcDppbml0aWFsO2ZsZXg6MTtmb250LXdlaWdodDo0MDA7aGVpZ2h0OjEwMCU7cGFkZGluZzowO2NvbG9yOiM0MWI5ODd9Lmh4YS1kYXRlcGlja2VyLWRheS1zaWJsaW5nbW9udGggLmh4LWJ1dHRvbntjb2xvcjojM2IzYjNiO2ZvbnQtd2VpZ2h0OjEwMH0uaHhhLWRhdGVwaWNrZXItZGF5LXNlbGVjdGVkZGF5IC5oeC1idXR0b257Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiM0MWI5ODd9Lmh4YS1kYXRlcGlja2VyLWRheS1pbnZhbGlkZGF5IC5oeC1idXR0b257Y29sb3I6I2UwZTBlMSFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZX0uaHhhLWRhdGVwaWNrZXItZGF5LWN1cnJlbnRkYXkgLmh4LWJ1dHRvbntib3JkZXI6MnB4IHNvbGlkICM0MWI5ODd9Omhvc3R7bWF4LXdpZHRoOjI0cmVtO2JvcmRlcjoxcHggc29saWQgI2QzZDNkMztiYWNrZ3JvdW5kOiNmZmZ9Omhvc3QgLmh4YS10YWJzIDo6bmctZGVlcCBoeC10YWJzZXQgOjpuZy1kZWVwIHVse2JhY2tncm91bmQtY29sb3I6I2ZmZjttYXJnaW4tYm90dG9tOjB9Omhvc3QgLmh4YS10YWJzIDo6bmctZGVlcCBoeC10YWJzZXQgOjpuZy1kZWVwIHVsIDo6bmctZGVlcCBsaXt3aWR0aDo1MCV9Omhvc3QgLmh4YS10YWJzIDo6bmctZGVlcCBoeC10YWJzZXQgOjpuZy1kZWVwIHVsIDo6bmctZGVlcCBsaSBhIHNwYW57Zm9udC1zaXplOm1lZGl1bTttYXJnaW46YXV0b306aG9zdCAuaHhhLXRhYnMgOjpuZy1kZWVwIGh4LXRhYnNldCA6Om5nLWRlZXAgLmh4LXRhYi1jb250ZW50e3BhZGRpbmc6MH1gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBwdWJsaWMgT3BlbkRpdjogQm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIHNob3dDYWxlbmRhcjogQm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIHRhYm5hbWUxOiBTdHJpbmc7XHJcbiAgcHVibGljIGFjdGl2ZVZhcmlhYmxlOiBCb29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgYWN0aXZlVmFyaWFibGUxOiBCb29sZWFuO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNlbGVjdGVkRGF0ZTogRGF0ZTtcclxuXHJcbiAgQElucHV0KClcclxuICB2YWxpZGF0b3JzOiBBcnJheTwoZGF0ZTogRGF0ZSkgPT4gYm9vbGVhbj47XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcGxhY2VtZW50OiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdib3R0b20nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGFsbG93SW50ZXJ2YWwgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZWxlY3RlZER1ZURhdGVJbnRlcnZhbCA9ICcwIGRheShzKSc7XHJcblxyXG4gIG9uRGF0ZVNlbGVjdGVkOiAoaW5wdXREYXRlOiBEYXRlKSA9PiB2b2lkO1xyXG4gIHZpc2liaWxpdHlFbnVtID0gVmlzaWJpbGl0eTtcclxuICB2aXNpYmlsaXR5OiBWaXNpYmlsaXR5ID0gVmlzaWJpbGl0eS5IaWRkZW47XHJcbiAgdmlld0RhdGU6IERhdGU7XHJcbiAgZGF5czogQXJyYXk8RGF0ZT4gPSBuZXcgQXJyYXk8RGF0ZT4oKTtcclxuICB3ZWVrOiBBcnJheTxzdHJpbmc+ID0gWydNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5JywgJ1N1bmRheSddO1xyXG4gIHByaXZhdGUgcHJlc2VudERhdGU6IERhdGU7XHJcbiAgcHJpdmF0ZSBjZWxsQ291bnQgPSA0MTtcclxuICBwcml2YXRlIF9kcDogRGF0ZXBpY2tlckludGVydmFsQ29tcG9uZW50IHwgbnVsbDtcclxuICAvKiogU3ViamVjdCBmb3Igbm90aWZ5aW5nIHRoYXQgdGhlIGNhbGVuZGFyIGhhcyBiZWVuIGhpZGRlbiBmcm9tIHRoZSB2aWV3ICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfb25IaWRlOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAvKiogVGhlIHRpbWVvdXQgSUQgb2YgYW55IGN1cnJlbnQgdGltZXIgc2V0IHRvIHNob3cgdGhlIGNhbGVuZGFyICovXHJcbiAgcHJpdmF0ZSBfc2hvd1RpbWVvdXRJZDogbnVtYmVyO1xyXG5cclxuICAvKiogVGhlIHRpbWVvdXQgSUQgb2YgYW55IGN1cnJlbnQgdGltZXIgc2V0IHRvIGhpZGUgdGhlIGNhbGVuZGFyICovXHJcbiAgcHJpdmF0ZSBfaGlkZVRpbWVvdXRJZDogbnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jaGFuZ2VEZXRlY3Rpb25SZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGRhdGVQaWNrZXJDb25maWc6IERhdGVwaWNrZXJDb25maWcpIHtcclxuICAgIH1cclxuXHJcbiAgLy8gUG9wdWxhdGVzIHRoZSBkYXlzIGFycmF5IHdpdGggdGhlIGN1cnJlbnQgbW9udGgsIGFuZCBjb21wbGV0ZXMgdGhlIHZpZXcgd2l0aCBwYXJ0aWFsIGRhdGVzIGZyb20gc2libGluZyBtb250aHNcclxuICBwdWJsaWMgcmVuZGVyQ2FsZW5kYXIoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0aGlzLmNlbGxDb3VudDsgaSsrKSB7XHJcbiAgICAgIC8vIGRhdGUgd2lsbCBiZSBzZXQgdG8gdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGggc2V0IGluIHRoaXMudmlld0RhdGVcclxuICAgICAgY29uc3QgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHRoaXMudmlld0RhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy52aWV3RGF0ZS5nZXRNb250aCgpKTtcclxuICAgICAgLy8gU2hpZnRzIHRoZSB3ZWVrIHRvIHN0YXJ0IGZyb20gTW9uZGF5LCByYXRoZXIgdGhhbiBTdW5kYXksIHRoaXMgY2F1c2VzIHRoZSBpbmRleCB0byBzdGFydCBhdCAxXHJcbiAgICAgIGNvbnN0IGRheU9mZnNldCA9IGRhdGUuZ2V0RGF5KCkgPT09IDAgPyA3IDogZGF0ZS5nZXREYXkoKTtcclxuICAgICAgdGhpcy5kYXlzW2ldID0gbmV3IERhdGUoZGF0ZS5zZXREYXRlKDIgLSBkYXlPZmZzZXQgKyBpKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIHByZXZpb3VzTW9udGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUodGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCkgLSAxKTtcclxuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZXh0TW9udGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUodGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCkgKyAxKTtcclxuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0N1cnJlbnRNb250aChpbnB1dERhdGU6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpbnB1dERhdGUuZ2V0TW9udGgoKSA9PT0gdGhpcy52aWV3RGF0ZS5nZXRNb250aCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQ3VycmVudERheShpbnB1dERhdGU6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpbnB1dERhdGUuZ2V0VGltZSgpID09PSB0aGlzLnByZXNlbnREYXRlLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1NlbGVjdGVkRGF5KGlucHV0RGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlKSB7XHJcbiAgICAgIHJldHVybiBpbnB1dERhdGUuZ2V0VGltZSgpID09PSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRUaW1lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSW52YWxpZERheShpbnB1dERhdGU6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnZhbGlkYXRvcnMubWFwKChmbikgPT4gZm4oaW5wdXREYXRlKSkucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2IHx8IG5leHQsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWxlY3RlZERhdGUoZGF0ZTogRGF0ZSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzSW52YWxpZERheShkYXRlKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XHJcbiAgICAgIHRoaXMub25EYXRlU2VsZWN0ZWQoZGF0ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoISFjaGFuZ2VzLnNlbGVjdGVkRGF0ZS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy52aWV3RGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuc2VsZWN0ZWREYXRlLmdldE1vbnRoKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkYXRlOiBEYXRlID0gdGhpcy5zZWxlY3RlZERhdGUgPyB0aGlzLnNlbGVjdGVkRGF0ZSA6IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLnByZXNlbnREYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcclxuICAgIHRoaXMudmlld0RhdGUgPSB0aGlzLnZpZXdEYXRlIHx8IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpKTtcclxuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoKTtcclxuICAgIGlmICggdGhpcy5kYXRlUGlja2VyQ29uZmlnLnRhYlNlbGVjdGVkID09PSAndGFiMScpIHtcclxuICAgICB0aGlzLmFjdGl2ZVZhcmlhYmxlMSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmFjdGl2ZVZhcmlhYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICggdGhpcy5kYXRlUGlja2VyQ29uZmlnLnRhYlNlbGVjdGVkID09PSAndGFiMicpIHtcclxuICAgICAgdGhpcy5hY3RpdmVWYXJpYWJsZTEgPSB0cnVlO1xyXG4gICAgICB0aGlzLmFjdGl2ZVZhcmlhYmxlID0gZmFsc2U7XHJcbiAgICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvd3MgdGhlIHRvb2x0aXBcclxuICAgKiBAcGFyYW0gZGVsYXkgQW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZGVsYXkgc2hvd2luZyB0aGUgdG9vbHRpcC5cclxuICAgKi9cclxuICBzaG93KGRlbGF5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vIENhbmNlbCB0aGUgZGVsYXllZCBoaWRlIGlmIGl0IGlzIHNjaGVkdWxlZFxyXG4gICAgaWYgKHRoaXMuX2hpZGVUaW1lb3V0SWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hpZGVUaW1lb3V0SWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2hvd1RpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gU2NoZWR1bGUgZm9yIGNoYW5nZSBkZXRlY3Rpb24gaW5jYXNlIHRoZSB0b29sdGlwIGlzIHVzZWQgd2l0aGluIGFcclxuICAgICAgLy8gY29tcG9uZW50IHdpdGggT25QdXNoIGNoYW5nZSBkZXRlY3Rpb25cclxuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0aW9uUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB0aGlzLnZpc2liaWxpdHkgPSBWaXNpYmlsaXR5LlZpc2libGU7XHJcbiAgICB9LCBkZWxheSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dJbnRlcnZhbCkge1xyXG4gICAgICAgdGhpcy5PcGVuRGl2ID0gdHJ1ZTtcclxuICAgICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gZmFsc2U7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICB0aGlzLk9wZW5EaXYgPSBmYWxzZTtcclxuICAgICB0aGlzLnNob3dDYWxlbmRhciA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIaWRlIHRoZSB0b29sdGlwIGFmdGVyIHRoZSBwcm92aWRlZCBkZWxheSBpbiBtcy5cclxuICAgKiBAcGFyYW0gZGVsYXkgQW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBoaWRpbmcgdGhlIHRvb2x0aXAuXHJcbiAgICovXHJcbiAgaGlkZShkZWxheTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAvLyBDYW5jZWwgdGhlIGRlbGF5ZWQgc2hvdyBpZiBpdCBpcyBzY2hlZHVsZWRcclxuICAgIGlmICh0aGlzLl9zaG93VGltZW91dElkKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zaG93VGltZW91dElkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9oaWRlVGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnZpc2liaWxpdHkgPSBWaXNpYmlsaXR5LkhpZGRlbjtcclxuICAgICAgdGhpcy5fb25IaWRlLm5leHQoKTtcclxuICAgIH0sIGRlbGF5KTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgdGhhdCBub3RpZmllcyB3aGVuIHRoZSB0b29sdGlwIGhhcyBiZWVuIGhpZGRlbiBmcm9tIHZpZXcuICovXHJcbiAgYWZ0ZXJIaWRkZW4oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fb25IaWRlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmlzaWJpbGl0eSA9PT0gVmlzaWJpbGl0eS5WaXNpYmxlO1xyXG4gIH1cclxuICBvblRhYlNlbGVjdCh0YWJuYW1lOiBTdHJpbmcpIHtcclxuICAgICBpZiAodGFibmFtZSA9PT0gJ3RhYjEnKSB7XHJcbiAgICAgIHRoaXMuZGF0ZVBpY2tlckNvbmZpZy50YWJTZWxlY3RlZCA9IHRhYm5hbWU7XHJcbiAgICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRlUGlja2VyQ29uZmlnLnRhYlNlbGVjdGVkID0gdGFibmFtZTtcclxuICAgICB9XHJcbiAgIH1cclxufVxyXG4iXX0=