UNPKG

@hxui/angular

Version:

This README includes the steps that are necessary to import the HxUi-angular into a project or to contribute with development.

196 lines (195 loc) 22.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Component, EventEmitter, Output, Input, ElementRef } from '@angular/core'; import { PositioningService } from '../positioning/positioning.service'; export class DatepickerComponent { /** * @param {?} hostElement * @param {?} positioningService */ constructor(hostElement, positioningService) { this.hostElement = hostElement; this.positioningService = positioningService; this.onDateSelected = new EventEmitter(); this.days = new Array(); this.week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; this.cellCount = 41; } /** * @return {?} */ renderCalendar() { for (let /** @type {?} */ i = 0; i <= this.cellCount; i++) { // date will be set to the first day of the month set in this.viewDate const /** @type {?} */ 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 const /** @type {?} */ dayOffset = date.getDay() === 0 ? 7 : date.getDay(); this.days[i] = new Date(date.setDate(2 - dayOffset + i)); } } /** * @return {?} */ positionCalendar() { const /** @type {?} */ rect = this.hostElement.nativeElement.getBoundingClientRect(); const /** @type {?} */ buffer = 10; if (this.positioningService.isElementBelowTheFold(this.hostElement.nativeElement)) { this.hostElement.nativeElement.style.top = (rect.top - (rect.top + rect.height + buffer)) + 'px'; } } /** * @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.emit(date); } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (!!changes["selectedDate"].currentValue) { this.viewDate = new Date(this.selectedDate.getFullYear(), this.selectedDate.getMonth()); } } /** * @return {?} */ ngOnInit() { const /** @type {?} */ date = new Date(); this.presentDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); this.viewDate = this.viewDate || new Date(date.getFullYear(), date.getMonth()); this.renderCalendar(); this.positionCalendar(); } } DatepickerComponent.decorators = [ { type: Component, args: [{ selector: 'hxa-datepicker', template: `<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>`, styles: [`.hxa-datepicker-container{max-width:21em;width:21em;height:24em;display:flex;flex-direction:column;font-size:1rem}.hxa-datepicker-header{padding:1rem 1rem 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:2.3em;position:initial!important;top:initial!important;color:#0d4d78}.hxa-datepicker-month{display:flex;text-align:center;margin-bottom:1rem}.hxa-datepicker-month-title{font-size:1.5em;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}.hxa-datepicker-contents{padding:1rem;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}`] },] }, ]; /** @nocollapse */ DatepickerComponent.ctorParameters = () => [ { type: ElementRef, }, { type: PositioningService, }, ]; DatepickerComponent.propDecorators = { "selectedDate": [{ type: Input },], "validators": [{ type: Input },], "onDateSelected": [{ type: Output },], }; function DatepickerComponent_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ DatepickerComponent.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ DatepickerComponent.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ DatepickerComponent.propDecorators; /** @type {?} */ DatepickerComponent.prototype.selectedDate; /** @type {?} */ DatepickerComponent.prototype.validators; /** @type {?} */ DatepickerComponent.prototype.onDateSelected; /** @type {?} */ DatepickerComponent.prototype.viewDate; /** @type {?} */ DatepickerComponent.prototype.days; /** @type {?} */ DatepickerComponent.prototype.week; /** @type {?} */ DatepickerComponent.prototype.presentDate; /** @type {?} */ DatepickerComponent.prototype.cellCount; /** @type {?} */ DatepickerComponent.prototype.hostElement; /** @type {?} */ DatepickerComponent.prototype.positioningService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQTRCLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNuSCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQXFDdEUsTUFBTTs7Ozs7SUFZSixZQUNVLGFBQ0E7UUFEQSxnQkFBVyxHQUFYLFdBQVc7UUFDWCx1QkFBa0IsR0FBbEIsa0JBQWtCOzhCQVYwQixJQUFJLFlBQVksRUFBUTtvQkFHbkQsSUFBSSxLQUFLLEVBQVE7b0JBQ2YsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUM7eUJBRXZGLEVBQUU7S0FJK0I7Ozs7SUFHOUMsY0FBYztRQUNuQixHQUFHLENBQUMsQ0FBQyxxQkFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O1lBRXpDLHVCQUFNLElBQUksR0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzs7WUFFbkYsdUJBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMs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QUNOLHVCQUFNLElBQUksR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztLQUN6Qjs7O1lBeEhGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQThCTDtnQkFDTCxNQUFNLEVBQUUsQ0FBQyw2a0RBQTZrRCxDQUFDO2FBQ3hsRDs7OztZQXJDaUYsVUFBVTtZQUNwRixrQkFBa0I7Ozs2QkFzQ3ZCLEtBQUs7MkJBQ0wsS0FBSzsrQkFFTCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE9uSW5pdCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMsIEVsZW1lbnRSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1Bvc2l0aW9uaW5nU2VydmljZX0gZnJvbSAnLi4vcG9zaXRpb25pbmcvcG9zaXRpb25pbmcuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2h4YS1kYXRlcGlja2VyJyxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJoeHVpLXJlc2V0XCI+XHJcbiAgPGRpdiBjbGFzcz1cImh4LWNhcmQgaHhhLWRhdGVwaWNrZXItY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaHgtY2FyZC1oZWFkZXIgaHhhLWRhdGVwaWNrZXItaGVhZGVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1tb250aFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1pY29uXCIgdGl0bGU9XCJQcmV2aW91cyBNb250aFwiIChjbGljayk9XCJwcmV2aW91c01vbnRoKClcIj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJoeC1idXR0b24gaXMtdHJhbnNwYXJlbnRcIj48aSBjbGFzcz1cImh4LWljb24gaWNvbi1hbmdsZS1sZWZ0XCI+PC9pPjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItbW9udGgtdGl0bGVcIj5cclxuICAgICAgICAgIDxzcGFuPnt7dmlld0RhdGUudG9Mb2NhbGVTdHJpbmcoXCJlbi1hdVwiLCB7IG1vbnRoOiBcImxvbmdcIiwgeWVhcjogXCJudW1lcmljXCIgfSl9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItaWNvblwiIHRpdGxlPVwiTmV4dCBNb250aFwiIChjbGljayk9XCJuZXh0TW9udGgoKVwiPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImh4LWJ1dHRvbiBpcy10cmFuc3BhcmVudFwiPjxpIGNsYXNzPVwiaHgtaWNvbiBpY29uLWFuZ2xlLXJpZ2h0XCI+PC9pPjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci13ZWVrXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLXdlZWtkYXlcIiAqbmdGb3I9XCJsZXQgd2Vla2RheSBvZiB3ZWVrXCI+XHJcbiAgICAgICAgICB7e3dlZWtkYXkgfCBzbGljZTowOjN9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLWNvbnRlbnRzXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1kYXlcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIGRheXNcIiBcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2h4YS1kYXRlcGlja2VyLWRheS1zaWJsaW5nbW9udGgnOiAhaXNDdXJyZW50TW9udGgoZGF5KSwgXHJcbiAgICAgICAgJ2h4YS1kYXRlcGlja2VyLWRheS1jdXJyZW50ZGF5JzogaXNDdXJyZW50RGF5KGRheSksXHJcbiAgICAgICAgJ2h4YS1kYXRlcGlja2VyLWRheS1zZWxlY3RlZGRheSc6IGlzU2VsZWN0ZWREYXkoZGF5KSxcclxuICAgICAgICAnaHhhLWRhdGVwaWNrZXItZGF5LWludmFsaWRkYXknOiBpc0ludmFsaWREYXkoZGF5KX1cIlxyXG4gICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZERhdGUoZGF5KVwiPlxyXG4gICAgICA8YSBjbGFzcz1cImh4LWJ1dHRvbiBpcy10cmFuc3BhcmVudFwiPnt7ZGF5LmdldERhdGUoKX19PC9hPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5gLFxyXG4gIHN0eWxlczogW2AuaHhhLWRhdGVwaWNrZXItY29udGFpbmVye21heC13aWR0aDoyMWVtO3dpZHRoOjIxZW07aGVpZ2h0OjI0ZW07ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmb250LXNpemU6MXJlbX0uaHhhLWRhdGVwaWNrZXItaGVhZGVye3BhZGRpbmc6MXJlbSAxcmVtIDA7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmluaXRpYWw7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZDtmb250LXdlaWdodDoxMDB9Lmh4YS1kYXRlcGlja2VyLWljb257Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXg6MTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9Lmh4YS1kYXRlcGlja2VyLWljb24gLmh4LWJ1dHRvbntwb3NpdGlvbjppbml0aWFsIWltcG9ydGFudDt0b3A6aW5pdGlhbCFpbXBvcnRhbnR9Lmh4YS1kYXRlcGlja2VyLWljb24gLmh4LWJ1dHRvbi5pcy10cmFuc3BhcmVudDpob3Zlcntjb2xvcjojMDAwfS5oeGEtZGF0ZXBpY2tlci1pY29uIC5oeC1pY29ue2ZvbnQtc2l6ZToyLjNlbTtwb3NpdGlvbjppbml0aWFsIWltcG9ydGFudDt0b3A6aW5pdGlhbCFpbXBvcnRhbnQ7Y29sb3I6IzBkNGQ3OH0uaHhhLWRhdGVwaWNrZXItbW9udGh7ZGlzcGxheTpmbGV4O3RleHQtYWxpZ246Y2VudGVyO21hcmdpbi1ib3R0b206MXJlbX0uaHhhLWRhdGVwaWNrZXItbW9udGgtdGl0bGV7Zm9udC1zaXplOjEuNWVtO2ZsZXg6MztkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7Y29sb3I6IzBkNGQ3OH0uaHhhLWRhdGVwaWNrZXItd2Vla3tkaXNwbGF5OmZsZXg7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcn0uaHhhLWRhdGVwaWNrZXItd2Vla2RheXtmbGV4OjE7Y29sb3I6IzBkNGQ3OH0uaHhhLWRhdGVwaWNrZXItY29udGVudHN7cGFkZGluZzoxcmVtO2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDYsMjQ2LDI0OSwuNSk7ZGlzcGxheTpmbGV4O2ZsZXgtZmxvdzpyb3cgd3JhcDtmbGV4OjE7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZDthbGlnbi1jb250ZW50OnNwYWNlLWFyb3VuZH0uaHhhLWRhdGVwaWNrZXItZGF5e2ZsZXg6MSAxIDE0JTtoZWlnaHQ6MTYuNjY2JTtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9Lmh4YS1kYXRlcGlja2VyLWRheSAuaHgtYnV0dG9ue3Bvc2l0aW9uOmluaXRpYWw7dG9wOmluaXRpYWw7ZmxleDoxO2ZvbnQtd2VpZ2h0OjQwMDtoZWlnaHQ6MTAwJTtwYWRkaW5nOjA7Y29sb3I6IzQxYjk4N30uaHhhLWRhdGVwaWNrZXItZGF5LXNpYmxpbmdtb250aCAuaHgtYnV0dG9ue2NvbG9yOiMzYjNiM2I7Zm9udC13ZWlnaHQ6MTAwfS5oeGEtZGF0ZXBpY2tlci1kYXktc2VsZWN0ZWRkYXkgLmh4LWJ1dHRvbntjb2xvcjojZmZmO2JhY2tncm91bmQ6IzQxYjk4N30uaHhhLWRhdGVwaWNrZXItZGF5LWludmFsaWRkYXkgLmh4LWJ1dHRvbntjb2xvcjojZTBlMGUxIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lfS5oeGEtZGF0ZXBpY2tlci1kYXktY3VycmVudGRheSAuaHgtYnV0dG9ue2JvcmRlcjoycHggc29saWQgIzQxYjk4N31gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWREYXRlOiBEYXRlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB2YWxpZGF0b3JzOiBBcnJheTwoZGF0ZTogRGF0ZSkgPT4gYm9vbGVhbj47XHJcblxyXG4gIEBPdXRwdXQoKSBwdWJsaWMgb25EYXRlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcclxuXHJcbiAgcHVibGljIHZpZXdEYXRlOiBEYXRlO1xyXG4gIHB1YmxpYyBkYXlzOiBBcnJheTxEYXRlPiA9IG5ldyBBcnJheTxEYXRlPigpO1xyXG4gIHB1YmxpYyB3ZWVrOiBBcnJheTxzdHJpbmc+ID0gWydNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5JywgJ1N1bmRheSddO1xyXG4gIHByaXZhdGUgcHJlc2VudERhdGU6IERhdGU7XHJcbiAgcHJpdmF0ZSBjZWxsQ291bnQgPSA0MTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBwb3NpdGlvbmluZ1NlcnZpY2U6IFBvc2l0aW9uaW5nU2VydmljZSkgeyB9XHJcblxyXG4gIC8vIFBvcHVsYXRlcyB0aGUgZGF5cyBhcnJheSB3aXRoIHRoZSBjdXJyZW50IG1vbnRoLCBhbmQgY29tcGxldGVzIHRoZSB2aWV3IHdpdGggcGFydGlhbCBkYXRlcyBmcm9tIHNpYmxpbmcgbW9udGhzXHJcbiAgcHVibGljIHJlbmRlckNhbGVuZGFyKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gdGhpcy5jZWxsQ291bnQ7IGkrKykge1xyXG4gICAgICAvLyBkYXRlIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoIHNldCBpbiB0aGlzLnZpZXdEYXRlXHJcbiAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMudmlld0RhdGUuZ2V0TW9udGgoKSk7XHJcbiAgICAgIC8vIFNoaWZ0cyB0aGUgd2VlayB0byBzdGFydCBmcm9tIE1vbmRheSwgcmF0aGVyIHRoYW4gU3VuZGF5LCB0aGlzIGNhdXNlcyB0aGUgaW5kZXggdG8gc3RhcnQgYXQgMVxyXG4gICAgICBjb25zdCBkYXlPZmZzZXQgPSBkYXRlLmdldERheSgpID09PSAwID8gNyA6IGRhdGUuZ2V0RGF5KCk7XHJcbiAgICAgIHRoaXMuZGF5c1tpXSA9IG5ldyBEYXRlKGRhdGUuc2V0RGF0ZSgyIC0gZGF5T2Zmc2V0ICsgaSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVE9ETzogTWF5YmUgd2Ugc2hvdWxkIG1vdmUgYWxsIG9mIHRoaXMgbG9naWMgaW50byB0aGUgcG9zaXRpb25pbmcgc2VydmljZT9cclxuICBwcml2YXRlIHBvc2l0aW9uQ2FsZW5kYXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCByZWN0ID0gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgYnVmZmVyID0gMTA7XHJcbiAgICBpZiAodGhpcy5wb3NpdGlvbmluZ1NlcnZpY2UuaXNFbGVtZW50QmVsb3dUaGVGb2xkKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCkpIHtcclxuICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9IChyZWN0LnRvcCAtIChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0ICsgYnVmZmVyKSkgKyAncHgnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHByZXZpb3VzTW9udGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUodGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCkgLSAxKTtcclxuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZXh0TW9udGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUodGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCkgKyAxKTtcclxuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0N1cnJlbnRNb250aChpbnB1dERhdGU6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpbnB1dERhdGUuZ2V0TW9udGgoKSA9PT0gdGhpcy52aWV3RGF0ZS5nZXRNb250aCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQ3VycmVudERheShpbnB1dERhdGU6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpbnB1dERhdGUuZ2V0VGltZSgpID09PSB0aGlzLnByZXNlbnREYXRlLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1NlbGVjdGVkRGF5KGlucHV0RGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlKSB7XHJcbiAgICAgIHJldHVybiBpbnB1dERhdGUuZ2V0VGltZSgpID09PSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRUaW1lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSW52YWxpZERheShpbnB1dERhdGU6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnZhbGlkYXRvcnMubWFwKChmbikgPT4gZm4oaW5wdXREYXRlKSkucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2IHx8IG5leHQsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWxlY3RlZERhdGUoZGF0ZTogRGF0ZSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzSW52YWxpZERheShkYXRlKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XHJcbiAgICAgIHRoaXMub25EYXRlU2VsZWN0ZWQuZW1pdChkYXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmICghIWNoYW5nZXMuc2VsZWN0ZWREYXRlLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5zZWxlY3RlZERhdGUuZ2V0TW9udGgoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy5wcmVzZW50RGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XHJcbiAgICB0aGlzLnZpZXdEYXRlID0gdGhpcy52aWV3RGF0ZSB8fCBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSk7XHJcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKCk7XHJcbiAgICB0aGlzLnBvc2l0aW9uQ2FsZW5kYXIoKTtcclxuICB9XHJcbn1cclxuIl19