UNPKG

sdk-textbox

Version:

Simple to use (Angular) textbox for controlling input while typing.

171 lines 37.4 kB
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class CalendarComponent { constructor(datePipe) { this.datePipe = datePipe; this.date = ""; this.show = false; this.height = "180px"; this.width = "180px"; this.fontSize = "1.0em"; this.setDateEvent = new EventEmitter(); this.showCalendar = true; this.showMonths = false; this.showYears = false; this.calendarHtml = ""; this.year = 0; this.month = ""; this.monthNumber = 0; this.dayNumber = 0; this.months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; this.days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; this.newData = ""; } ngOnInit() { this.setCalendar(); setTimeout(() => { this.setStyle(); }, 1); } ngOnChanges() { this.newData = this.date; } setDate(date) { this.setDateEvent.emit(date); } getToday() { this.newData = new Date().toString(); this.setCalendar(); } getMonth() { this.showMonths = true; this.showCalendar = false; } setMonth(month) { this.showCalendar = true; this.showMonths = false; this.newData = new Date(this.year, month, this.dayNumber).toString(); this.setCalendar(); } getYear() { this.showYears = true; this.showCalendar = false; } setYear() { if (this.yearText?.nativeElement.value !== "" && this.yearText?.nativeElement.value.length === 4) { this.showCalendar = true; this.showYears = false; this.newData = new Date(this.yearText?.nativeElement.value, this.monthNumber - 1, this.dayNumber).toString(); this.setCalendar(); } } onKeyDown(event) { let text = event.target.value; if (event.key === "Enter") { this.setYear(); } else if (event.key === "Backspace" || event.key === "Tab" || event.key === "ArrowLeft" || event.key === "ArrowRight" || event.key === "Meta" || event.key === "Control") { // DO NOTHING } else { if (!(event.metaKey && event.key === "v") && !(event.metaKey && event.key === "c")) { if (!event.key.match(/[0-9]/) || text.length >= 4) { event.preventDefault(); } } } } /************************************************************************** * Protected Methods **************************************************************************/ setCalendar() { let dt = (this.newData && this.newData !== "") ? new Date(this.newData) : new Date(); this.year = dt.getFullYear(); this.month = this.months[dt.getMonth()]; this.monthNumber = (dt.getMonth() + 1); this.dayNumber = dt.getDate(); let fistDay = new Date(this.year, dt.getMonth(), 1).getDay(); let totalDays = this.getTotalDays(dt.getFullYear(), dt.getMonth() + 1); let weeks = Math.floor(totalDays / 7); let isToday = false; let isSelected = false; if (fistDay > 0) weeks = weeks + 1; if ((totalDays + fistDay) > (weeks * 7)) weeks = weeks + 1; let plotDay = 1; this.calDays = []; for (let w = 0; w < weeks; w++) { for (let d = 0; d < 7; d++) { let currentDay = ((7 * w) + (d + 1)); if (currentDay < (fistDay + 1)) { this.calDays.push({ date: "", day: "" }); } else { if (plotDay <= totalDays) { if (this.datePipe.transform(new Date(this.year, this.monthNumber - 1, plotDay), 'yyyy-MM-dd') === this.datePipe.transform(new Date(), 'yyyy-MM-dd')) { isToday = true; } else { isToday = false; } if (this.datePipe.transform(new Date(this.year, this.monthNumber - 1, plotDay), 'yyyy-MM-dd') === this.datePipe.transform(this.date, 'yyyy-MM-dd')) { isSelected = true; } else { isSelected = false; } this.calDays.push({ date: this.datePipe.transform(new Date(this.year, this.monthNumber - 1, plotDay), 'yyyy-MM-dd'), day: plotDay.toString(), today: isToday, selected: isSelected }); plotDay++; } else { this.calDays.push({ date: "", day: "" }); } } } } } getTotalDays(year, month) { return new Date(year, month, 0).getDate(); } setStyle() { let element = this.calendar?.nativeElement; if (element) { element.style.setProperty("--height", this.height); element.style.setProperty("--width", this.width); element.style.setProperty("--font-size", this.fontSize); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: CalendarComponent, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.10", type: CalendarComponent, selector: "calendar", inputs: { date: "date", show: "show", height: "height", width: "width", fontSize: "fontSize" }, outputs: { setDateEvent: "setDateEvent" }, viewQueries: [{ propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "yearText", first: true, predicate: ["yearText"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #calendar *ngIf=\"show\" class=\"sdk-textbox-calendar\" [style.height]=\"((calDays.length * 30) + 30) + 'px'\">\n <div class=\"frame\" *ngIf=\"showCalendar\">\n <div class=\"header\">\n <div class=\"month\" (click)=\"getMonth()\">{{ month }}</div>\n <div class=\"today\" (click)=\"getToday()\">Today</div>\n <div class=\"year\" (click)=\"getYear()\">{{ year }}</div>\n </div>\n <div class=\"calendar\">\n <div class=\"grid\">\n <div class=\"label\">Sun</div>\n <div class=\"label\">Mon</div>\n <div class=\"label\">Tue</div>\n <div class=\"label\">Wed</div>\n <div class=\"label\">Thu</div>\n <div class=\"label\">Fri</div>\n <div class=\"label\">Sat</div>\n <div class=\"item\" [ngClass]=\"{ today: day.today, selected: day.selected }\" *ngFor=\"let day of calDays; let i = index\" (mousedown)=\"setDate(day.date)\">{{ day.day }}</div>\n </div>\n </div>\n </div>\n \n <table *ngIf=\"showMonths\" class=\"table\">\n <tbody>\n <tr>\n <td (click)=\"setMonth(0)\">Jan</td>\n <td (click)=\"setMonth(1)\">Feb</td>\n <td (click)=\"setMonth(2)\">Mar</td>\n <td (click)=\"setMonth(3)\">Apr</td>\n </tr>\n <tr>\n <td (click)=\"setMonth(4)\">May</td>\n <td (click)=\"setMonth(5)\">Jun</td>\n <td (click)=\"setMonth(6)\">Jul</td>\n <td (click)=\"setMonth(7)\">Aug</td>\n </tr>\n <tr>\n <td (click)=\"setMonth(8)\">Sep</td>\n <td (click)=\"setMonth(9)\">Oct</td>\n <td (click)=\"setMonth(10)\">Nov</td>\n <td (click)=\"setMonth(11)\">Dec</td>\n </tr>\n </tbody>\n </table>\n\n <table *ngIf=\"showYears\" class=\"table\">\n <tbody>\n <tr>\n <td>\n <div class=\"year-box\">\n <input #yearText class=\"year\" type=\"number\" (keydown)=\"onKeyDown($event)\" [value]=\"year\" />\n <button class=\"set\" (click)=\"setYear()\">SET</button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n", styles: [".sdk-textbox-calendar{position:absolute;left:0;right:0;z-index:999;min-height:var(--height, 180px);min-width:var(--width, 175px);max-height:var(--height, 180px);max-width:var(--width, 175px);border:1px solid rgb(200,200,200);background-color:#fff;overflow:hidden;font-size:var(--font-size, 1em)}.sdk-textbox-calendar .frame *{box-sizing:content-box}.sdk-textbox-calendar .frame .header{height:20px;padding:5px;font-weight:600;font-size:.8em;text-align:center}.sdk-textbox-calendar .frame .header .month{display:inline-flex;float:left}.sdk-textbox-calendar .frame .header .month:hover{color:#0066b2;cursor:pointer}.sdk-textbox-calendar .frame .header .today{display:inline-flex;color:#0066b2}.sdk-textbox-calendar .frame .header .today:hover{color:#fff;background-color:#0066b2;padding:2px;cursor:pointer}.sdk-textbox-calendar .frame .header .year{display:inline-flex;float:right}.sdk-textbox-calendar .frame .header .year:hover{color:#0066b2;cursor:pointer}.sdk-textbox-calendar .frame .calendar{height:calc(var(--height, 180px) - 32px);width:100%}.sdk-textbox-calendar .frame .calendar .grid{height:100%;width:100%;overflow:hidden;display:grid;grid-template-columns:repeat(7,1fr)}.sdk-textbox-calendar .frame .calendar .grid .label{display:flex;justify-content:center;align-items:center;background-color:#ebebeb;border:.5px solid rgb(200,200,200);font-size:.6em}.sdk-textbox-calendar .frame .calendar .grid .item{display:flex;justify-content:center;align-items:center;border:.5px solid rgb(200,200,200);font-size:.7em}.sdk-textbox-calendar .frame .calendar .grid .item.selected{background-color:#c5ffb1}.sdk-textbox-calendar .frame .calendar .grid .item.today{border-width:1px;border-color:#0066b2;color:#0066b2;font-weight:700}.sdk-textbox-calendar .frame .calendar .grid .item:hover{background-color:#dbf0ff}.sdk-textbox-calendar .table{height:100%;width:100%;max-height:100%;max-width:100%;font-size:1.2em;border-collapse:separate;border-spacing:0}.sdk-textbox-calendar .table thead tr th{padding:2px;font-weight:600;font-size:.7em;text-align:center;border:.5px solid rgb(200,200,200);background-color:#dcdcdc}.sdk-textbox-calendar .table thead tr td{padding-bottom:5px}.sdk-textbox-calendar .table thead tr td .header{font-size:.75em;margin:5px}.sdk-textbox-calendar .table thead tr td .header .month{float:left}.sdk-textbox-calendar .table thead tr td .header .month:hover{color:#0066b2;cursor:pointer}.sdk-textbox-calendar .table thead tr td .header .year{float:right}.sdk-textbox-calendar .table thead tr td .header .year:hover{color:#0066b2;cursor:pointer}.sdk-textbox-calendar .table tbody tr td{font-size:.8em;text-align:center;align-items:center;border:.5px solid rgb(225,225,225)}.sdk-textbox-calendar .table tbody tr td .year-box .year{font-size:1.2em;width:40%}.sdk-textbox-calendar .table tbody tr td .year-box .set{font-size:1.2em;margin-left:5px}.sdk-textbox-calendar .table tbody tr td:hover{background-color:#dbf0ff}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: CalendarComponent, decorators: [{ type: Component, args: [{ selector: 'calendar', template: "<div #calendar *ngIf=\"show\" class=\"sdk-textbox-calendar\" [style.height]=\"((calDays.length * 30) + 30) + 'px'\">\n <div class=\"frame\" *ngIf=\"showCalendar\">\n <div class=\"header\">\n <div class=\"month\" (click)=\"getMonth()\">{{ month }}</div>\n <div class=\"today\" (click)=\"getToday()\">Today</div>\n <div class=\"year\" (click)=\"getYear()\">{{ year }}</div>\n </div>\n <div class=\"calendar\">\n <div class=\"grid\">\n <div class=\"label\">Sun</div>\n <div class=\"label\">Mon</div>\n <div class=\"label\">Tue</div>\n <div class=\"label\">Wed</div>\n <div class=\"label\">Thu</div>\n <div class=\"label\">Fri</div>\n <div class=\"label\">Sat</div>\n <div class=\"item\" [ngClass]=\"{ today: day.today, selected: day.selected }\" *ngFor=\"let day of calDays; let i = index\" (mousedown)=\"setDate(day.date)\">{{ day.day }}</div>\n </div>\n </div>\n </div>\n \n <table *ngIf=\"showMonths\" class=\"table\">\n <tbody>\n <tr>\n <td (click)=\"setMonth(0)\">Jan</td>\n <td (click)=\"setMonth(1)\">Feb</td>\n <td (click)=\"setMonth(2)\">Mar</td>\n <td (click)=\"setMonth(3)\">Apr</td>\n </tr>\n <tr>\n <td (click)=\"setMonth(4)\">May</td>\n <td (click)=\"setMonth(5)\">Jun</td>\n <td (click)=\"setMonth(6)\">Jul</td>\n <td (click)=\"setMonth(7)\">Aug</td>\n </tr>\n <tr>\n <td (click)=\"setMonth(8)\">Sep</td>\n <td (click)=\"setMonth(9)\">Oct</td>\n <td (click)=\"setMonth(10)\">Nov</td>\n <td (click)=\"setMonth(11)\">Dec</td>\n </tr>\n </tbody>\n </table>\n\n <table *ngIf=\"showYears\" class=\"table\">\n <tbody>\n <tr>\n <td>\n <div class=\"year-box\">\n <input #yearText class=\"year\" type=\"number\" (keydown)=\"onKeyDown($event)\" [value]=\"year\" />\n <button class=\"set\" (click)=\"setYear()\">SET</button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n</div>\n", styles: [".sdk-textbox-calendar{position:absolute;left:0;right:0;z-index:999;min-height:var(--height, 180px);min-width:var(--width, 175px);max-height:var(--height, 180px);max-width:var(--width, 175px);border:1px solid rgb(200,200,200);background-color:#fff;overflow:hidden;font-size:var(--font-size, 1em)}.sdk-textbox-calendar .frame *{box-sizing:content-box}.sdk-textbox-calendar .frame .header{height:20px;padding:5px;font-weight:600;font-size:.8em;text-align:center}.sdk-textbox-calendar .frame .header .month{display:inline-flex;float:left}.sdk-textbox-calendar .frame .header .month:hover{color:#0066b2;cursor:pointer}.sdk-textbox-calendar .frame .header .today{display:inline-flex;color:#0066b2}.sdk-textbox-calendar .frame .header .today:hover{color:#fff;background-color:#0066b2;padding:2px;cursor:pointer}.sdk-textbox-calendar .frame .header .year{display:inline-flex;float:right}.sdk-textbox-calendar .frame .header .year:hover{color:#0066b2;cursor:pointer}.sdk-textbox-calendar .frame .calendar{height:calc(var(--height, 180px) - 32px);width:100%}.sdk-textbox-calendar .frame .calendar .grid{height:100%;width:100%;overflow:hidden;display:grid;grid-template-columns:repeat(7,1fr)}.sdk-textbox-calendar .frame .calendar .grid .label{display:flex;justify-content:center;align-items:center;background-color:#ebebeb;border:.5px solid rgb(200,200,200);font-size:.6em}.sdk-textbox-calendar .frame .calendar .grid .item{display:flex;justify-content:center;align-items:center;border:.5px solid rgb(200,200,200);font-size:.7em}.sdk-textbox-calendar .frame .calendar .grid .item.selected{background-color:#c5ffb1}.sdk-textbox-calendar .frame .calendar .grid .item.today{border-width:1px;border-color:#0066b2;color:#0066b2;font-weight:700}.sdk-textbox-calendar .frame .calendar .grid .item:hover{background-color:#dbf0ff}.sdk-textbox-calendar .table{height:100%;width:100%;max-height:100%;max-width:100%;font-size:1.2em;border-collapse:separate;border-spacing:0}.sdk-textbox-calendar .table thead tr th{padding:2px;font-weight:600;font-size:.7em;text-align:center;border:.5px solid rgb(200,200,200);background-color:#dcdcdc}.sdk-textbox-calendar .table thead tr td{padding-bottom:5px}.sdk-textbox-calendar .table thead tr td .header{font-size:.75em;margin:5px}.sdk-textbox-calendar .table thead tr td .header .month{float:left}.sdk-textbox-calendar .table thead tr td .header .month:hover{color:#0066b2;cursor:pointer}.sdk-textbox-calendar .table thead tr td .header .year{float:right}.sdk-textbox-calendar .table thead tr td .header .year:hover{color:#0066b2;cursor:pointer}.sdk-textbox-calendar .table tbody tr td{font-size:.8em;text-align:center;align-items:center;border:.5px solid rgb(225,225,225)}.sdk-textbox-calendar .table tbody tr td .year-box .year{font-size:1.2em;width:40%}.sdk-textbox-calendar .table tbody tr td .year-box .set{font-size:1.2em;margin-left:5px}.sdk-textbox-calendar .table tbody tr td:hover{background-color:#dbf0ff}\n"] }] }], ctorParameters: () => [{ type: i1.DatePipe }], propDecorators: { date: [{ type: Input }], show: [{ type: Input }], height: [{ type: Input }], width: [{ type: Input }], fontSize: [{ type: Input }], setDateEvent: [{ type: Output }], calendar: [{ type: ViewChild, args: ["calendar"] }], yearText: [{ type: ViewChild, args: ["yearText"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrLXRleHRib3gvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay10ZXh0Ym94L3NyYy9saWIvY29tcG9uZW50cy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBU3RHLE1BQU0sT0FBTyxpQkFBaUI7SUErQjdCLFlBQW9CLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUE5QjdCLFNBQUksR0FBVyxFQUFFLENBQUM7UUFDbEIsU0FBSSxHQUFZLEtBQUssQ0FBQztRQUN0QixXQUFNLEdBQVcsT0FBTyxDQUFDO1FBQ3pCLFVBQUssR0FBVyxPQUFPLENBQUM7UUFDeEIsYUFBUSxHQUFXLE9BQU8sQ0FBQztRQUMxQixpQkFBWSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBUXhELGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBQzdCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUUzQixpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUUxQixTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ2pCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDbkIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsY0FBUyxHQUFXLENBQUMsQ0FBQztRQUN0QixXQUFNLEdBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUs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ZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZVBpcGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnY2FsZW5kYXInLFxuXHR0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuXHRzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5jb21wb25lbnQuc2NzcyddXG59KVxuXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXHRASW5wdXQoKSBkYXRlOiBzdHJpbmcgPSBcIlwiO1xuXHRASW5wdXQoKSBzaG93OiBib29sZWFuID0gZmFsc2U7XG5cdEBJbnB1dCgpIGhlaWdodDogc3RyaW5nID0gXCIxODBweFwiO1xuXHRASW5wdXQoKSB3aWR0aDogc3RyaW5nID0gXCIxODBweFwiO1xuXHRASW5wdXQoKSBmb250U2l6ZTogc3RyaW5nID0gXCIxLjBlbVwiO1xuXHRAT3V0cHV0KCkgc2V0RGF0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblx0KiBDb21wb25lbnQgVmFyaWFibGVzXG5cdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXHRAVmlld0NoaWxkKFwiY2FsZW5kYXJcIikgY2FsZW5kYXIhOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuXHRAVmlld0NoaWxkKFwieWVhclRleHRcIikgeWVhclRleHQ6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG5cblx0cHVibGljIHNob3dDYWxlbmRhcjogYm9vbGVhbiA9IHRydWU7XG5cdHB1YmxpYyBzaG93TW9udGhzOiBib29sZWFuID0gZmFsc2U7XG5cdHB1YmxpYyBzaG93WWVhcnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRwdWJsaWMgY2FsZW5kYXJIdG1sOiBzdHJpbmcgPSBcIlwiO1xuXG5cdHB1YmxpYyB5ZWFyOiBudW1iZXIgPSAwO1xuXHRwdWJsaWMgbW9udGg6IHN0cmluZyA9IFwiXCI7XG5cdHB1YmxpYyBtb250aE51bWJlcjogbnVtYmVyID0gMDtcblx0cHVibGljIGRheU51bWJlcjogbnVtYmVyID0gMDtcblx0cHVibGljIG1vbnRoczogc3RyaW5nW10gPSBbXCJKYW5cIiwgXCJGZWJcIiwgXCJNYXJcIiwgXCJBcHJcIiwgXCJNYXlcIiwgXCJKdW5cIiwgXCJKdWxcIiwgXCJBdWdcIiwgXCJTZXBcIiwgXCJPY3RcIiwgXCJOb3ZcIiwgXCJEZWNcIl07XG5cdHB1YmxpYyBkYXlzOiBzdHJpbmdbXSA9IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXTtcblxuXHRwdWJsaWMgY2FsRGF5czogYW55O1xuXG5cdHByaXZhdGUgbmV3RGF0YTogc3RyaW5nID0gXCJcIjtcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSkge31cblxuXHRwdWJsaWMgbmdPbkluaXQoKSB7XG5cdFx0dGhpcy5zZXRDYWxlbmRhcigpO1xuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLnNldFN0eWxlKCk7XG5cdFx0fSwgMSk7XG5cdH1cblxuXHRwdWJsaWMgbmdPbkNoYW5nZXMoKSB7XG5cdFx0dGhpcy5uZXdEYXRhID0gdGhpcy5kYXRlO1xuXHR9XG5cblx0cHVibGljIHNldERhdGUoZGF0ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5zZXREYXRlRXZlbnQuZW1pdChkYXRlKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRUb2RheSgpIHtcblx0XHR0aGlzLm5ld0RhdGEgPSBuZXcgRGF0ZSgpLnRvU3RyaW5nKCk7XG5cdFx0dGhpcy5zZXRDYWxlbmRhcigpO1xuXHR9XG5cblx0cHVibGljIGdldE1vbnRoKCkge1xuXHRcdHRoaXMuc2hvd01vbnRocyA9IHRydWU7XG5cdFx0dGhpcy5zaG93Q2FsZW5kYXIgPSBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBzZXRNb250aChtb250aDogYW55KSB7XG5cdFx0dGhpcy5zaG93Q2FsZW5kYXIgPSB0cnVlO1xuXHRcdHRoaXMuc2hvd01vbnRocyA9IGZhbHNlO1xuXG5cdFx0dGhpcy5uZXdEYXRhID0gbmV3IERhdGUodGhpcy55ZWFyLCBtb250aCwgdGhpcy5kYXlOdW1iZXIpLnRvU3RyaW5nKCk7XG5cdFx0dGhpcy5zZXRDYWxlbmRhcigpO1xuXHR9XG5cblx0cHVibGljIGdldFllYXIoKSB7XG5cdFx0dGhpcy5zaG93WWVhcnMgPSB0cnVlO1xuXHRcdHRoaXMuc2hvd0NhbGVuZGFyID0gZmFsc2U7XG5cdH1cblxuXHRwdWJsaWMgc2V0WWVhcigpIHtcblx0XHRpZiAodGhpcy55ZWFyVGV4dD8ubmF0aXZlRWxlbWVudC52YWx1ZSAhPT0gXCJcIiAmJiB0aGlzLnllYXJUZXh0Py5uYXRpdmVFbGVtZW50LnZhbHVlLmxlbmd0aCA9PT0gNCkge1xuXHRcdFx0dGhpcy5zaG93Q2FsZW5kYXIgPSB0cnVlO1xuXHRcdFx0dGhpcy5zaG93WWVhcnMgPSBmYWxzZTtcblxuXHRcdFx0dGhpcy5uZXdEYXRhID0gbmV3IERhdGUodGhpcy55ZWFyVGV4dD8ubmF0aXZlRWxlbWVudC52YWx1ZSwgdGhpcy5tb250aE51bWJlciAtIDEsIHRoaXMuZGF5TnVtYmVyKS50b1N0cmluZygpO1xuXHRcdFx0dGhpcy5zZXRDYWxlbmRhcigpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBvbktleURvd24oZXZlbnQ6IGFueSkge1xuXHRcdGxldCB0ZXh0ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG5cdFx0aWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XG5cdFx0XHR0aGlzLnNldFllYXIoKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0ZXZlbnQua2V5ID09PSBcIkJhY2tzcGFjZVwiXG5cdFx0XHR8fCBldmVudC5rZXkgPT09IFwiVGFiXCJcblx0XHRcdHx8IGV2ZW50LmtleSA9PT0gXCJBcnJvd0xlZnRcIlxuXHRcdFx0fHwgZXZlbnQua2V5ID09PSBcIkFycm93UmlnaHRcIlxuXHRcdFx0fHwgZXZlbnQua2V5ID09PSBcIk1ldGFcIlxuXHRcdFx0fHwgZXZlbnQua2V5ID09PSBcIkNvbnRyb2xcIlxuXHRcdCkge1xuXHRcdFx0Ly8gRE8gTk9USElOR1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIShldmVudC5tZXRhS2V5ICYmIGV2ZW50LmtleSA9PT0gXCJ2XCIpICYmICEoZXZlbnQubWV0YUtleSAmJiBldmVudC5rZXkgPT09IFwiY1wiKSkge1xuXHRcdFx0XHRpZiAoIWV2ZW50LmtleS5tYXRjaCgvWzAtOV0vKVxuXHRcdFx0XHRcdHx8IHRleHQubGVuZ3RoID49IDRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXHQqIFByb3RlY3RlZCBNZXRob2RzXG5cdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXHRwcml2YXRlIHNldENhbGVuZGFyKCkge1xuXHRcdGxldCBkdCA9ICh0aGlzLm5ld0RhdGEgJiYgdGhpcy5uZXdEYXRhICE9PSBcIlwiKSA/IG5ldyBEYXRlKHRoaXMubmV3RGF0YSkgOiBuZXcgRGF0ZSgpO1xuXG5cdFx0dGhpcy55ZWFyID0gZHQuZ2V0RnVsbFllYXIoKTtcblx0XHR0aGlzLm1vbnRoID0gdGhpcy5tb250aHNbZHQuZ2V0TW9udGgoKV07XG5cdFx0dGhpcy5tb250aE51bWJlciA9IChkdC5nZXRNb250aCgpICsgMSk7XG5cdFx0dGhpcy5kYXlOdW1iZXIgPSBkdC5nZXREYXRlKCk7XG5cblx0XHRsZXQgZmlzdERheSA9IG5ldyBEYXRlKHRoaXMueWVhciwgZHQuZ2V0TW9udGgoKSwgMSkuZ2V0RGF5KCk7XG5cdFx0bGV0IHRvdGFsRGF5cyA9IHRoaXMuZ2V0VG90YWxEYXlzKGR0LmdldEZ1bGxZZWFyKCksIGR0LmdldE1vbnRoKCkgKyAxKTtcblx0XHRsZXQgd2Vla3MgPSBNYXRoLmZsb29yKHRvdGFsRGF5cyAvIDcpO1xuXG5cdFx0bGV0IGlzVG9kYXk6IGJvb2xlYW4gPSBmYWxzZTtcblx0XHRsZXQgaXNTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdFx0aWYgKGZpc3REYXkgPiAwKSB3ZWVrcyA9IHdlZWtzICsgMTtcblx0XHRpZiAoKHRvdGFsRGF5cyArIGZpc3REYXkpID4gKHdlZWtzICogNykpIHdlZWtzID0gd2Vla3MgKyAxO1xuXG5cdFx0bGV0IHBsb3REYXk6IGFueSA9IDE7XG5cblx0XHR0aGlzLmNhbERheXMgPSBbXTtcblxuXHRcdGZvciAobGV0IHcgPSAwOyB3IDwgd2Vla3M7IHcrKykge1xuXHRcdFx0Zm9yIChsZXQgZCA9IDA7IGQgPCA3OyBkKyspIHtcblx0XHRcdFx0bGV0IGN1cnJlbnREYXkgPSAoKDcgKiB3KSArIChkICsgMSkpO1xuXG5cdFx0XHRcdGlmIChjdXJyZW50RGF5IDwgKGZpc3REYXkgKyAxKSkge1xuXHRcdFx0XHRcdHRoaXMuY2FsRGF5cy5wdXNoKHsgZGF0ZTogXCJcIiwgZGF5OiBcIlwifSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKHBsb3REYXkgPD0gdG90YWxEYXlzKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0obmV3IERhdGUodGhpcy55ZWFyLCB0aGlzLm1vbnRoTnVtYmVyIC0gMSwgcGxvdERheSksICd5eXl5LU1NLWRkJykgPT09IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKG5ldyBEYXRlKCksICd5eXl5LU1NLWRkJykpIHtcblx0XHRcdFx0XHRcdFx0aXNUb2RheSA9IHRydWU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpc1RvZGF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShuZXcgRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGhOdW1iZXIgLSAxLCBwbG90RGF5KSwgJ3l5eXktTU0tZGQnKSA9PT0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odGhpcy5kYXRlLCAneXl5eS1NTS1kZCcpKSB7XG5cdFx0XHRcdFx0XHRcdGlzU2VsZWN0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0aXNTZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR0aGlzLmNhbERheXMucHVzaCh7IGRhdGU6IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKG5ldyBEYXRlKHRoaXMueWVhciwgdGhpcy5tb250aE51bWJlciAtIDEsIHBsb3REYXkpLCAneXl5eS1NTS1kZCcpLCBkYXk6IHBsb3REYXkudG9TdHJpbmcoKSwgdG9kYXk6IGlzVG9kYXksIHNlbGVjdGVkOiBpc1NlbGVjdGVkIH0pO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRwbG90RGF5Kys7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMuY2FsRGF5cy5wdXNoKHsgZGF0ZTogXCJcIiwgZGF5OiBcIlwifSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRUb3RhbERheXMoeWVhcjogYW55LCBtb250aDogYW55KSB7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKS5nZXREYXRlKCk7XG5cdH1cblxuXHRwcml2YXRlIHNldFN0eWxlKCkge1xuXHRcdGxldCBlbGVtZW50ID0gdGhpcy5jYWxlbmRhcj8ubmF0aXZlRWxlbWVudDtcblxuXHRcdGlmIChlbGVtZW50KSB7XG5cdFx0XHRlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwiLS1oZWlnaHRcIiwgdGhpcy5oZWlnaHQpO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcIi0td2lkdGhcIiwgdGhpcy53aWR0aCk7XG5cdFx0XHRlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwiLS1mb250LXNpemVcIiwgdGhpcy5mb250U2l6ZSk7XG5cdFx0fVxuXHR9XG59IiwiPGRpdiAjY2FsZW5kYXIgKm5nSWY9XCJzaG93XCIgY2xhc3M9XCJzZGstdGV4dGJveC1jYWxlbmRhclwiIFtzdHlsZS5oZWlnaHRdPVwiKChjYWxEYXlzLmxlbmd0aCAqIDMwKSArIDMwKSArICdweCdcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZnJhbWVcIiAqbmdJZj1cInNob3dDYWxlbmRhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGhcIiAoY2xpY2spPVwiZ2V0TW9udGgoKVwiPnt7IG1vbnRoIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9kYXlcIiAoY2xpY2spPVwiZ2V0VG9kYXkoKVwiPlRvZGF5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwieWVhclwiIChjbGljayk9XCJnZXRZZWFyKClcIj57eyB5ZWFyIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+U3VuPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+TW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+VHVlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+V2VkPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+VGh1PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+RnJpPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+U2F0PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW1cIiBbbmdDbGFzc109XCJ7IHRvZGF5OiBkYXkudG9kYXksIHNlbGVjdGVkOiBkYXkuc2VsZWN0ZWQgIH1cIiAqbmdGb3I9XCJsZXQgZGF5IG9mIGNhbERheXM7IGxldCBpID0gaW5kZXhcIiAobW91c2Vkb3duKT1cInNldERhdGUoZGF5LmRhdGUpXCI+e3sgZGF5LmRheSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDx0YWJsZSAqbmdJZj1cInNob3dNb250aHNcIiBjbGFzcz1cInRhYmxlXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8dGQgKGNsaWNrKT1cInNldE1vbnRoKDApXCI+SmFuPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgKGNsaWNrKT1cInNldE1vbnRoKDEpXCI+RmViPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgKGNsaWNrKT1cInNldE1vbnRoKDIpXCI+TWFyPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgKGNsaWNrKT1cInNldE1vbnRoKDMpXCI+QXByPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRkIChjbGljayk9XCJzZXRNb250aCg0KVwiPk1heTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIChjbGljayk9XCJzZXRNb250aCg1KVwiPkp1bjwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIChjbGljayk9XCJzZXRNb250aCg2KVwiPkp1bDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkIChjbGljayk9XCJzZXRNb250aCg3KVwiPkF1ZzwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgIDx0ZCAoY2xpY2spPVwic2V0TW9udGgoOClcIj5TZXA8L3RkPlxuICAgICAgICAgICAgICAgIDx0ZCAoY2xpY2spPVwic2V0TW9udGgoOSlcIj5PY3Q8L3RkPlxuICAgICAgICAgICAgICAgIDx0ZCAoY2xpY2spPVwic2V0TW9udGgoMTApXCI+Tm92PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgKGNsaWNrKT1cInNldE1vbnRoKDExKVwiPkRlYzwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG5cbiAgICA8dGFibGUgKm5nSWY9XCJzaG93WWVhcnNcIiBjbGFzcz1cInRhYmxlXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ5ZWFyLWJveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICN5ZWFyVGV4dCBjbGFzcz1cInllYXJcIiB0eXBlPVwibnVtYmVyXCIgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIiBbdmFsdWVdPVwieWVhclwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2V0XCIgKGNsaWNrKT1cInNldFllYXIoKVwiPlNFVDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuPC9kaXY+XG4iXX0=