UNPKG

ngx-month-picker-range

Version:

Esta libreria fue generada con [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.

647 lines (624 loc) 67.1 kB
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, Renderer2, ViewChild } from '@angular/core'; import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms'; import { DomHandler } from './domhandler'; export class NgxMonthPickerComponent { constructor(renderer, cd, elem) { this.renderer = renderer; this.cd = cd; this.elem = elem; this.mode = 'single' || 'range'; this.inputContainerClass = "calendar-input-container"; this.inputValueClass = "calendar-input-value"; this.calendarContainerClass = "calendar-ui"; this.monthItemClass = "monthItem"; this.edgeClass = "isEdge"; this.notYearClass = "notCurrentYear"; this.inRangeClass = "inRange"; this.lowerEdgeClass = "isLowerEdge"; this.upperEdgeClass = "upperEdgeClass"; this.cleanBtnClass = "clean-btn"; this.acceptBtnClass = "accept-btn"; this.locale = "es-MX"; //@Input('appendTo') this.appendTo = "body"; this.monthRangeSelected = new EventEmitter(); this.tabindex = 0; this.onChange = (_) => { }; this.onTouched = () => { }; this.onModelTouched = () => { }; if (!this.placeholder) this.placeholder = 'Seleccionar...'; } blurHandler() { this.focused = false; this.itemFocused = -1; this.onTouched(); } focusHandler() { this.focused = true; } set value(val) { this._Value = val; } get value() { return this._Value; } set itemFocused(val) { this._itemFocused = val; } get itemFocused() { return this._itemFocused; } ngOnInit() { this.initCalendar(); this.cd.detectChanges(); } initCalendar() { this.initYearLabels(); this.initMonthLabels(); this.initViewSlices(); this.initMonthsData(); this.initRangeIndexes(); if (this.value) { if (!this.value['start']) { this.currentYearIndex = this.years.findIndex(year => year === this.value.getFullYear()); } else { this.currentYearIndex = this.years.findIndex(year => year === this.value['start'].getFullYear()); } } else { this.currentYearIndex = this.years.findIndex(year => year === (new Date()).getFullYear()); } this.sliceDataIntoView(); } ngOnChanges(simpleChange) { if (simpleChange.value) { this.value = simpleChange.value.currentValue; } if (simpleChange.mode) { this.mode = simpleChange.mode.currentValue; } if (simpleChange.placeholder) { this.placeholder = simpleChange.placeholder.currentValue; } if (simpleChange.acceptBtnClass) this.acceptBtnClass = simpleChange.acceptBtnClass.currentValue; } ngAfterContentInit() { this.renderer.listen(this.elem.nativeElement, "keydown", ($event) => onKeydown($event, this)); } ngOnDestroy() { if (this.isOpen) { this.onShowCalendar(); } this.renderer.listen(this.elem.nativeElement, "keydown", null); } onShowCalendar(event) { if (this.disabled) return; if (event) { event.stopPropagation(); } if (!this.isOpen) { this.show(event); } else { this.hide(event); } } show(event) { if (event) { event.stopPropagation(); } this.initCalendar(); this.isOpen = true; const selectedStyles = document.querySelectorAll('.calendar-input-container'); selectedStyles.forEach(element => { if (element.getAttribute('class').includes('active')) { this.renderer.removeClass(element, 'active'); } }); const selectedOptions = document.querySelectorAll('.calendar-ui'); selectedOptions.forEach(element => { this.renderer.setStyle(element, 'display', 'none'); }); this.renderer.addClass(this.calendarInputContainer.nativeElement, 'active'); this.appendOverlay(); this.alignOverlay(); this.renderer.setStyle(this.calendarUI.nativeElement, 'display', 'block'); } hide(event) { if (event) { event.stopPropagation(); } this.isOpen = false; this.renderer.removeClass(this.calendarInputContainer.nativeElement, 'active'); this.renderer.setStyle(this.calendarUI.nativeElement, 'display', 'none'); this.restoreOverlayAppend(); } appendOverlay() { if (this.appendTo) { if (this.appendTo === 'body') document.body.appendChild(this.calendarUI.nativeElement); else DomHandler.appendChild(this.calendarUI, this.appendTo); } //this.calendarUI.nativeElement.style.width = DomHandler.getWidth(this.containerViewChild.nativeElement) + 'px'; } restoreOverlayAppend() { if (this.calendarUI) { if (this.appendTo) { this.elem.nativeElement.appendChild(this.calendarUI.nativeElement); } } } alignOverlay() { if (this.calendarUI) { if (this.appendTo) DomHandler.absolutePosition(this.calendarUI.nativeElement, this.containerViewChild.nativeElement); else DomHandler.relativePosition(this.calendarUI.nativeElement, this.containerViewChild.nativeElement); } } onClick(indexClicked) { if (this.mode === 'single') { this.rangeIndexes[0] = this.globalIndexOffset + indexClicked; let fromMonthYear = this.monthsData[this.rangeIndexes[0]]; let initDate = new Date(fromMonthYear.monthYear, fromMonthYear.month, 1); this.value = initDate; return; } if (this.rangeIndexes[0] !== null && this.rangeIndexes[1] !== null) { this.clearData(); } if (this.rangeIndexes[0] === null) { this.rangeIndexes[0] = this.globalIndexOffset + indexClicked; } else if (this.rangeIndexes[1] === null) { this.rangeIndexes[1] = this.globalIndexOffset + indexClicked; this.paintRange(); let fromMonthYear = this.monthsData[this.rangeIndexes[0]]; let toMonthYear = this.monthsData[this.rangeIndexes[1]]; let initDate = new Date(fromMonthYear.monthYear, fromMonthYear.month, 1); let endDate = new Date(toMonthYear.monthYear, toMonthYear.month + 1, 0); this.value = { start: initDate, end: endDate }; } else { this.initRangeIndexes(); this.initMonthsData(); this.onClick(indexClicked); this.sliceDataIntoView(); } ; } ; paintRange() { this.rangeIndexes.sort((a, b) => a - b); this.monthsData.forEach((month, index) => { if ((this.rangeIndexes[0] <= index) && (index <= this.rangeIndexes[1])) { month.isInRange = true; } ; if (this.rangeIndexes[0] === index) { month.isLowerEdge = true; } ; if (this.rangeIndexes[1] === index) { month.isUpperEdge = true; } ; }); } emitData() { this.isClosing = true; this.updateChanges(); this.onTouched(); this.monthRangeSelected.emit(this.value); this.hide(); } ; sliceDataIntoView() { this.globalIndexOffset = this.monthViewSlicesIndexes[this.currentYearIndex]; this.monthDataSlice = this.monthsData.slice(this.globalIndexOffset, this.globalIndexOffset + 24); } ; incrementYear() { if (this.currentYearIndex !== this.years.length - 1) { this.currentYearIndex++; this.sliceDataIntoView(); } ; } ; decrementYear() { if (this.currentYearIndex !== 0) { this.currentYearIndex--; this.sliceDataIntoView(); } ; } ; initRangeIndexes() { if (this.value) { this.rangeIndexes = []; if (this.value['start']) { this.rangeIndexes.push(this.monthsData.findIndex((v, i) => (v.month === this.value['start'].getMonth() && v.monthYear === this.value['start'].getFullYear()))); if (this.value['end']) this.rangeIndexes.push(this.monthsData.findIndex((v, i) => (v.month === this.value['end'].getMonth() && v.monthYear === this.value['end'].getFullYear()))); this.paintRange(); } else { this.rangeIndexes.push(this.monthsData.findIndex((v, i) => (v.month === this.value.getMonth() && v.monthYear === this.value.getFullYear()))); } } else this.rangeIndexes = [null, null]; } ; initMonthsData() { this.monthsData = new Array(); this.years.forEach(year => { this.months.forEach((month, i) => { this.monthsData.push({ monthName: month, month: i, monthYear: year, isInRange: false, isLowerEdge: false, isUpperEdge: false }); }); }); } ; initYearLabels() { const currentYear = (new Date()).getFullYear(); const range = (start, stop, step) => Array.from({ length: (stop - start) / step + 1 }, (_, i) => start + (i * step)); this.years = range(this.firstYear ? this.firstYear : (currentYear - 5), this.lastYear ? this.lastYear : (currentYear + 5), 1); } ; initMonthLabels() { this.months = new Array(12).fill(0).map((_, i) => { //console.log(new Date(`${i + 1}/1/1`).toLocaleDateString(this.locale, { month: 'short' })); return new Date(`${i + 1}/1/1`).toLocaleDateString(this.locale, { month: 'short' }); }); } ; initViewSlices() { this.monthViewSlicesIndexes = []; this.years.forEach((year, index) => { if (index === 0) { this.monthViewSlicesIndexes.push(0); } else if (index === 1) { this.monthViewSlicesIndexes.push(6); } else this.monthViewSlicesIndexes.push(this.monthViewSlicesIndexes[index - 1] + 12); }); } get valueText() { let text = ""; let fromMonthYear = this.monthsData[this.rangeIndexes[0]]; let toMonthYear = this.monthsData[this.rangeIndexes[1]]; if (this.mode === 'single') { if (fromMonthYear) { text += `${fromMonthYear.monthName}, ${fromMonthYear.monthYear}`; } } else if (fromMonthYear && toMonthYear) { if (fromMonthYear.monthYear === toMonthYear.monthYear) { if (fromMonthYear.monthName !== toMonthYear.monthName) { text += `${fromMonthYear.monthName} - ${toMonthYear.monthName}, ${fromMonthYear.monthYear}`; } else { text += `${fromMonthYear.monthName}, ${fromMonthYear.monthYear}`; } } else { text += `${fromMonthYear.monthName}, ${fromMonthYear.monthYear} - ${toMonthYear.monthName}, ${toMonthYear.monthYear}`; } } if (text === '') { text = this.placeholder ? this.placeholder : "Seleccionar..."; } return text; } clearData() { this.value = undefined; this.updateChanges(); this.ngOnInit(); } validate({ value }) { const isNotValid = this.isRequired && this.value == undefined; return isNotValid && { invalid: true }; } updateChanges() { this.onChange(this.value); } writeValue(value) { this.value = value; this.updateChanges(); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(val) { this.disabled = val; } setReadOnlyState(val) { this.isReadOnly = val; } } NgxMonthPickerComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-month-picker', template: ` <div class="calendar-widget" #select> <div [ngClass]="inputContainerClass" (click)="onShowCalendar($event)" role="listbox" #calendarInputContainer [title]="valueText"> <span [ngClass]="inputValueClass">{{valueText}}</span> </div> <div [ngClass]="calendarContainerClass" #calendarUI style="display: none;"> <div class="outerCard"> <div class="topPanel"> <button class="prevYearButton" (click)="decrementYear()"> <i class="arrow arrow-left"></i> </button> <span class="yearLabel">{{ years[currentYearIndex] }}</span> <button class="nextYearButton" (click)="incrementYear()"> <i class="arrow arrow-right"></i> </button> </div> <div class="contentPanel" #calendarContent> <div (click)="onClick(i)" *ngFor="let month of monthDataSlice; let i = index" [ngClass]="[monthItemClass, (rangeIndexes[0]===globalIndexOffset+i || rangeIndexes[1]===globalIndexOffset+i) ? edgeClass: '', (currentYearIndex===0? i > 11:(i < 6 || i > 17)) ? notYearClass : '']"> <div [id]="i" class="monthItemHighlight" [ngClass]="[ month.isInRange ? inRangeClass : '', month.isLowerEdge ? lowerEdgeClass : '', month.isUpperEdge ? upperEdgeClass : '' ]"> {{ month.monthName }} </div> </div> </div> <div class="footerPanel"> <a id="cleanBtn" href="javascript:void(0)" [ngClass]="cleanBtnClass" (click)="clearData()"> Limpiar </a> <a id="acceptBtn" href="javascript:void(0)" [ngClass]="acceptBtnClass" (click)="emitData()"> Aceptar </a> </div> </div> </div> </div> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxMonthPickerComponent), multi: true }, { provide: NG_VALIDATORS, useExisting: NgxMonthPickerComponent, multi: true } ], styles: [` .calendar-ui { z-index: 1003; width: 350px; background-color: white; } .calendar-input-container { background: #F5F5F6 !important; border: solid 1px #C2D1D9 !important; color: #A8B0BA !important; font-family: "open_sansitalic", sans-serif !important; line-height: 17px; min-height: 48px; display: flex; align-items: center; border-radius: 3px; width: 100%; font-size: 16px; letter-spacing: 0; } .calendar-input-value { padding-left: 10px; padding-right: 10px; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } .outerCard { touch-action: none; overflow: hidden; width: inherit; /*height: 350px;*/ box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); } .topPanel { width: inherit; height: 44px; text-align: center; line-height: 64px; } .prevYearButton { float: left; } .nextYearButton { float: right; } button { width: 64px; height: 64px; background: none; border: none; margin: 0; padding: 0; cursor: pointer; } button:focus { outline: 0; } i { border: solid black; border-width: 0 3px 3px 0; display: inline-block; padding: 6px; } .arrow-right { transform: rotate(-45deg); -webkit-transform: rotate(-45deg); } .arrow-left { transform: rotate(135deg); -webkit-transform: rotate(135deg); } .topPanel.yearLabel { display: inline-block; margin: 0 auto; } .contentPanel { padding: 32px 6px; } .footerPanel { display: flex; } .monthItem { display: inline-block; height: 54px; width: 54px; cursor: pointer; text-align: center; line-height: 54px; margin-top: 1px; margin-bottom: 1px; } .monthItem:hover { border-radius: 100%; background-color: #F5F5F6; color: #A8B0BA; } .isEdge { border-radius: 100%; background-color: #1474a4; color: white; } .inRange { background-color: #1474a4; opacity: 0.5; color: white; } .isLowerEdge { background-color: none; background: linear-gradient(to right, transparent 50%, #1474a4 50%); } .isUpperEdge { background-color: none; background: linear-gradient(to right, #1474a4 50%, transparent 50%); } .notCurrentYear { color: #c4cbd6; } .clean-btn { text-decoration: none; width: 50%; display: inline-block; font-weight: 400; color: #A8B0BA; background-color: #F5F5F6; text-align: center; vertical-align: middle; user-select: none; border: 1px solid transparent; padding: .375rem .75rem; font-size: 1rem; line-height: 1.5; } .accept-btn { text-decoration: none; width: 50%; display: inline-block; font-weight: 400; text-align: center; vertical-align: middle; user-select: none; border: 1px solid transparent; padding: .375rem .75rem; font-size: 1rem; line-height: 1.5; color: white; background-color: #1474a4; } `] },] } ]; NgxMonthPickerComponent.ctorParameters = () => [ { type: Renderer2 }, { type: ChangeDetectorRef }, { type: ElementRef } ]; NgxMonthPickerComponent.propDecorators = { placeholder: [{ type: Input, args: ['placeholder',] }], isRequired: [{ type: Input, args: ['required',] }], disabled: [{ type: Input, args: ['disabled',] }], isReadOnly: [{ type: Input, args: ['readonly',] }], mode: [{ type: Input, args: ['mode',] }], firstYear: [{ type: Input, args: ['firstYear',] }], lastYear: [{ type: Input, args: ['lastYear',] }], inputContainerClass: [{ type: Input, args: ['inputContainerClass',] }], inputValueClass: [{ type: Input, args: ['inputValueClass',] }], calendarContainerClass: [{ type: Input, args: ['inputValueClass',] }], monthItemClass: [{ type: Input, args: ['monthItemClass',] }], edgeClass: [{ type: Input, args: ['edgeClass',] }], notYearClass: [{ type: Input, args: ['notYearClass',] }], inRangeClass: [{ type: Input, args: ['inRangeClass',] }], lowerEdgeClass: [{ type: Input, args: ['lowerEdgeClass',] }], upperEdgeClass: [{ type: Input, args: ['upperEdgeClass',] }], cleanBtnClass: [{ type: Input, args: ['cleanBtnClass',] }], acceptBtnClass: [{ type: Input, args: ['acceptBtnClass',] }], locale: [{ type: Input, args: ['locale',] }], calendarInputContainer: [{ type: ViewChild, args: ["calendarInputContainer", { static: false },] }], calendarUI: [{ type: ViewChild, args: ["calendarUI", { static: false },] }], calendarContent: [{ type: ViewChild, args: ["calendarContent", { static: false },] }], containerViewChild: [{ type: ViewChild, args: ["select", { static: false },] }], monthRangeSelected: [{ type: Output }], tabindex: [{ type: HostBinding, args: ['tabindex',] }], blurHandler: [{ type: HostListener, args: ['blur',] }], focusHandler: [{ type: HostListener, args: ['focus',] }] }; function onKeydown(event, component) { switch (event.which) { //down case 40: if (!component.isOpen && event.altKey) { component.onShowCalendar(); component.itemFocused = -1; } event.preventDefault(); break; case 13: component.onShowCalendar(); component.itemFocused = -1; event.preventDefault(); break; case 27: component.hide(); component.itemFocused = -1; event.preventDefault(); break; case 8: component.clearData(); component.itemFocused = -1; event.preventDefault(); break; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1vbnRoLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvSnVhbiBNYW51ZWwgTWVuZXNlcy9Eb2N1bWVudHMvR2l0SHViL2xpYnJhcmllcy9wcm9qZWN0cy9uZ3gtbW9udGgtcGlja2VyLXJhbmdlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtbW9udGgtcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTZDLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFFLFNBQVMsRUFBaUIsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM5USxPQUFPLEVBQXFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFtTzFDLE1BQU0sT0FBTyx1QkFBdUI7SUFtR2xDLFlBQW9CLFFBQW1CLEVBQVUsRUFBcUIsRUFBVSxJQUFnQjtRQUE1RSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBNUZqRixTQUFJLEdBQVcsUUFBUSxJQUFJLE9BQU8sQ0FBQztRQUlwQix3QkFBbUIsR0FBVywwQkFBMEIsQ0FBQztRQUM3RCxvQkFBZSxHQUFXLHNCQUFzQixDQUFDO1FBQ2pELDJCQUFzQixHQUFXLGFBQWEsQ0FBQztRQUNoRCxtQkFBYyxHQUFXLFdBQVcsQ0FBQztRQUMxQyxjQUFTLEdBQVcsUUFBUSxDQUFDO1FBQzFCLGlCQUFZLEdBQVcsZ0JBQWdCLENBQUM7UUFDeEMsaUJBQVksR0FBVyxTQUFTLENBQUM7UUFDL0IsbUJBQWMsR0FBVyxhQUFhLENBQUM7UUFDdkMsbUJBQWMsR0FBVyxnQkFBZ0Is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RSxDQUFDO1lBRXZCLE1BQU07UUFDUixLQUFLLENBQUM7WUFDSixTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEIsU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFdkIsTUFBTTtLQUNUO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdG9yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG9tSGFuZGxlciB9IGZyb20gJy4vZG9taGFuZGxlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1tb250aC1waWNrZXInLFxuICB0ZW1wbGF0ZTpgXG4gIDxkaXYgY2xhc3M9XCJjYWxlbmRhci13aWRnZXRcIiAjc2VsZWN0PlxuICAgIDxkaXYgW25nQ2xhc3NdPVwiaW5wdXRDb250YWluZXJDbGFzc1wiIChjbGljayk9XCJvblNob3dDYWxlbmRhcigkZXZlbnQpXCIgcm9sZT1cImxpc3Rib3hcIiAjY2FsZW5kYXJJbnB1dENvbnRhaW5lciBbdGl0bGVdPVwidmFsdWVUZXh0XCI+XG4gICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImlucHV0VmFsdWVDbGFzc1wiPnt7dmFsdWVUZXh0fX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBbbmdDbGFzc109XCJjYWxlbmRhckNvbnRhaW5lckNsYXNzXCIgI2NhbGVuZGFyVUkgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXJDYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wUGFuZWxcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicHJldlllYXJCdXR0b25cIiAoY2xpY2spPVwiZGVjcmVtZW50WWVhcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYXJyb3cgYXJyb3ctbGVmdFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInllYXJMYWJlbFwiPnt7IHllYXJzW2N1cnJlbnRZZWFySW5kZXhdIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuZXh0WWVhckJ1dHRvblwiIChjbGljayk9XCJpbmNyZW1lbnRZZWFyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJhcnJvdyBhcnJvdy1yaWdodFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRQYW5lbFwiICNjYWxlbmRhckNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25DbGljayhpKVwiICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aERhdGFTbGljZTsgbGV0IGkgPSBpbmRleFwiIFtuZ0NsYXNzXT1cIlttb250aEl0ZW1DbGFzcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAocmFuZ2VJbmRleGVzWzBdPT09Z2xvYmFsSW5kZXhPZmZzZXQraSB8fCByYW5nZUluZGV4ZXNbMV09PT1nbG9iYWxJbmRleE9mZnNldCtpKSA/IGVkZ2VDbGFzczogJycsIFxuICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRZZWFySW5kZXg9PT0wPyBpID4gMTE6KGkgPCA2IHx8IGkgPiAxNykpID8gbm90WWVhckNsYXNzIDogJyddXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cImlcIiBjbGFzcz1cIm1vbnRoSXRlbUhpZ2hsaWdodFwiIFtuZ0NsYXNzXT1cIlsgbW9udGguaXNJblJhbmdlID8gaW5SYW5nZUNsYXNzIDogJycsIFxuICAgICAgICAgICAgICAgICAgICBtb250aC5pc0xvd2VyRWRnZSA/IGxvd2VyRWRnZUNsYXNzIDogJycsIG1vbnRoLmlzVXBwZXJFZGdlID8gdXBwZXJFZGdlQ2xhc3MgOiAnJyBdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBtb250aC5tb250aE5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXJQYW5lbFwiPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiY2xlYW5CdG5cIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgW25nQ2xhc3NdPVwiY2xlYW5CdG5DbGFzc1wiIChjbGljayk9XCJjbGVhckRhdGEoKVwiPlxuICAgICAgICAgICAgICAgICAgICBMaW1waWFyXG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiYWNjZXB0QnRuXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIFtuZ0NsYXNzXT1cImFjY2VwdEJ0bkNsYXNzXCIgKGNsaWNrKT1cImVtaXREYXRhKClcIj5cbiAgICAgICAgICAgICAgICAgICAgQWNlcHRhclxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuICBgLFxuICBzdHlsZXM6W2BcbiAgLmNhbGVuZGFyLXVpIHtcbiAgICB6LWluZGV4OiAxMDAzO1xuICAgIHdpZHRoOiAzNTBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbn1cblxuLmNhbGVuZGFyLWlucHV0LWNvbnRhaW5lciB7XG4gICAgYmFja2dyb3VuZDogI0Y1RjVGNiAhaW1wb3J0YW50O1xuICAgIGJvcmRlcjogc29saWQgMXB4ICNDMkQxRDkgIWltcG9ydGFudDtcbiAgICBjb2xvcjogI0E4QjBCQSAhaW1wb3J0YW50O1xuICAgIGZvbnQtZmFtaWx5OiBcIm9wZW5fc2Fuc2l0YWxpY1wiLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XG4gICAgbGluZS1oZWlnaHQ6IDE3cHg7XG4gICAgbWluLWhlaWdodDogNDhweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBsZXR0ZXItc3BhY2luZzogMDtcbn1cblxuLmNhbGVuZGFyLWlucHV0LXZhbHVlIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gICAgcGFkZGluZy1yaWdodDogMTBweDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5vdXRlckNhcmQge1xuICAgIHRvdWNoLWFjdGlvbjogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdpZHRoOiBpbmhlcml0O1xuICAgIC8qaGVpZ2h0OiAzNTBweDsqL1xuICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4yKTtcbn1cblxuLnRvcFBhbmVsIHtcbiAgICB3aWR0aDogaW5oZXJpdDtcbiAgICBoZWlnaHQ6IDQ0cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGxpbmUtaGVpZ2h0OiA2NHB4O1xufVxuXG4ucHJldlllYXJCdXR0b24ge1xuICAgIGZsb2F0OiBsZWZ0O1xufVxuXG4ubmV4dFllYXJCdXR0b24ge1xuICAgIGZsb2F0OiByaWdodDtcbn1cblxuYnV0dG9uIHtcbiAgICB3aWR0aDogNjRweDtcbiAgICBoZWlnaHQ6IDY0cHg7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5idXR0b246Zm9jdXMge1xuICAgIG91dGxpbmU6IDA7XG59XG5cbmkge1xuICAgIGJvcmRlcjogc29saWQgYmxhY2s7XG4gICAgYm9yZGVyLXdpZHRoOiAwIDNweCAzcHggMDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZzogNnB4O1xufVxuXG4uYXJyb3ctcmlnaHQge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xufVxuXG4uYXJyb3ctbGVmdCB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7XG59XG5cbi50b3BQYW5lbC55ZWFyTGFiZWwge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW46IDAgYXV0bztcbn1cblxuLmNvbnRlbnRQYW5lbCB7XG4gICAgcGFkZGluZzogMzJweCA2cHg7XG59XG5cbi5mb290ZXJQYW5lbCB7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLm1vbnRoSXRlbSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGhlaWdodDogNTRweDtcbiAgICB3aWR0aDogNTRweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGxpbmUtaGVpZ2h0OiA1NHB4O1xuICAgIG1hcmdpbi10b3A6IDFweDtcbiAgICBtYXJnaW4tYm90dG9tOiAxcHg7XG59XG5cbi5tb250aEl0ZW06aG92ZXIge1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjVGNjtcbiAgICBjb2xvcjogI0E4QjBCQTtcbn1cblxuLmlzRWRnZSB7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTQ3NGE0O1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLmluUmFuZ2Uge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxNDc0YTQ7XG4gICAgb3BhY2l0eTogMC41O1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLmlzTG93ZXJFZGdlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBub25lO1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQgNTAlLCAjMTQ3NGE0IDUwJSk7XG59XG5cbi5pc1VwcGVyRWRnZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICMxNDc0YTQgNTAlLCB0cmFuc3BhcmVudCA1MCUpO1xufVxuXG4ubm90Q3VycmVudFllYXIge1xuICAgIGNvbG9yOiAjYzRjYmQ2O1xufVxuXG4uY2xlYW4tYnRuIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgd2lkdGg6IDUwJTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICBjb2xvcjogI0E4QjBCQTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNUY2O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHBhZGRpbmc6IC4zNzVyZW0gLjc1cmVtO1xuICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS41O1xufVxuXG4uYWNjZXB0LWJ0biB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIHdpZHRoOiA1MCU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgcGFkZGluZzogLjM3NXJlbSAuNzVyZW07XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjU7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxNDc0YTQ7XG59XG4gIGBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5neE1vbnRoUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IE5neE1vbnRoUGlja2VyQ29tcG9uZW50LFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4TW9udGhQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25DaGFuZ2VzIHtcbiBcbiAgQElucHV0KCdwbGFjZWhvbGRlcicpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgncmVxdWlyZWQnKSBpc1JlcXVpcmVkOiBib29sZWFuO1xuICBASW5wdXQoJ2Rpc2FibGVkJykgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgncmVhZG9ubHknKSBpc1JlYWRPbmx5OiBib29sZWFuO1xuXG4gIEBJbnB1dCgnbW9kZScpIG1vZGU6IHN0cmluZyA9ICdzaW5nbGUnIHx8ICdyYW5nZSc7XG4gIEBJbnB1dCgnZmlyc3RZZWFyJykgZmlyc3RZZWFyOiBudW1iZXI7XG4gIEBJbnB1dCgnbGFzdFllYXInKSBsYXN0WWVhcjogbnVtYmVyO1xuXG4gIEBJbnB1dCgnaW5wdXRDb250YWluZXJDbGFzcycpIGlucHV0Q29udGFpbmVyQ2xhc3M6IHN0cmluZyA9IFwiY2FsZW5kYXItaW5wdXQtY29udGFpbmVyXCI7XG4gIEBJbnB1dCgnaW5wdXRWYWx1ZUNsYXNzJykgaW5wdXRWYWx1ZUNsYXNzOiBzdHJpbmcgPSBcImNhbGVuZGFyLWlucHV0LXZhbHVlXCI7IFxuICBASW5wdXQoJ2lucHV0VmFsdWVDbGFzcycpIGNhbGVuZGFyQ29udGFpbmVyQ2xhc3M6IHN0cmluZyA9IFwiY2FsZW5kYXItdWlcIjsgXG4gIEBJbnB1dCgnbW9udGhJdGVtQ2xhc3MnKSBtb250aEl0ZW1DbGFzczogc3RyaW5nID0gXCJtb250aEl0ZW1cIjtcbiAgQElucHV0KCdlZGdlQ2xhc3MnKSBlZGdlQ2xhc3M6IHN0cmluZyA9IFwiaXNFZGdlXCI7XG4gIEBJbnB1dCgnbm90WWVhckNsYXNzJykgbm90WWVhckNsYXNzOiBzdHJpbmcgPSBcIm5vdEN1cnJlbnRZZWFyXCI7XG4gIEBJbnB1dCgnaW5SYW5nZUNsYXNzJykgaW5SYW5nZUNsYXNzOiBzdHJpbmcgPSBcImluUmFuZ2VcIjtcbiAgQElucHV