@asoftwareworld/form-builder-pro
Version:
ASW Form Builder Pro helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same b
88 lines • 17.8 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
/**
* An internal class that represents the data corresponding to a single calendar cell.
* @docs-private
*/
export class AswCalendarCell {
value;
displayValue;
ariaLabel;
enabled;
constructor(value, displayValue, ariaLabel, enabled) {
this.value = value;
this.displayValue = displayValue;
this.ariaLabel = ariaLabel;
this.enabled = enabled;
}
}
/**
* An internal component used to display calendar data in a table.
* @docs-private
*/
export class AswCalendarBody {
/** The label for the table. (e.g. "Jan 2017"). */
label;
/** The cells to display in the table. */
rows;
/** The value in the table that corresponds to today. */
todayValue;
/** The value in the table that is currently selected. */
selectedValue;
/** The minimum number of free cells needed to fit the label in the first row. */
labelMinRequiredCells;
/** The number of columns in the table. */
numCols = 7;
/** Whether to allow selection of disabled cells. */
allowDisabledSelection = false;
/** The cell number of the active cell in the table. */
activeCell = 0;
/** Emits when a new value is selected. */
selectedValueChange = new EventEmitter();
/** The number of blank cells to put at the beginning for the first row. */
get _firstRowOffset() {
return this.rows && this.rows.length && this.rows[0].length ? this.numCols - this.rows[0].length : 0;
}
_cellClicked(cell) {
if (!this.allowDisabledSelection && !cell.enabled) {
return;
}
this.selectedValueChange.emit(cell.value);
}
_isActiveCell(rowIndex, colIndex) {
let cellNumber = rowIndex * this.numCols + colIndex;
// Account for the fact that the first row may not have as many cells.
if (rowIndex) {
cellNumber -= this._firstRowOffset;
}
return cellNumber === this.activeCell;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswCalendarBody, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: AswCalendarBody, selector: "[asw-calendar-body]", inputs: { label: "label", rows: "rows", todayValue: "todayValue", selectedValue: "selectedValue", labelMinRequiredCells: "labelMinRequiredCells", numCols: "numCols", allowDisabledSelection: "allowDisabledSelection", activeCell: "activeCell" }, outputs: { selectedValueChange: "selectedValueChange" }, host: { classAttribute: "asw-calendar-body" }, exportAs: ["aswCalendarBody"], ngImport: i0, template: "<!--\r\n If there's not enough space in the first row, create a separate label row. We mark this row as\r\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\r\n-->\r\n<tr *ngIf=\"_firstRowOffset < labelMinRequiredCells\" aria-hidden=\"true\">\r\n <td class=\"asw-calendar-body-label\" [attr.colspan]=\"numCols\">{{ label }}</td>\r\n</tr>\r\n\r\n<!-- Create the first row separately so we can include a special spacer cell. -->\r\n<tr *ngFor=\"let row of rows; let rowIndex = index\" role=\"row\">\r\n <!--\r\n We mark this cell as aria-hidden so it doesn't get read out as one of the days in the week.\r\n -->\r\n <td *ngIf=\"rowIndex === 0 && _firstRowOffset\"\r\n class=\"asw-calendar-body-label\" [attr.colspan]=\"_firstRowOffset\" aria-hidden=\"true\">\r\n {{ _firstRowOffset >= labelMinRequiredCells ? label : '' }}\r\n </td>\r\n <td *ngFor=\"let item of row; let colIndex = index\"\r\n role=\"gridcell\"\r\n class=\"asw-calendar-body-cell\"\r\n [class.asw-calendar-body-active]=\"_isActiveCell(rowIndex, colIndex)\"\r\n [class.asw-calendar-body-disabled]=\"!item.enabled\"\r\n [tabindex]=\"_isActiveCell(rowIndex, colIndex) ? 0 : -1\"\r\n [attr.data-mat-row]=\"rowIndex\"\r\n [attr.data-mat-col]=\"colIndex\"\r\n [attr.aria-label]=\"item.ariaLabel\"\r\n [attr.aria-disabled]=\"!item.enabled || null\"\r\n (click)=\"_cellClicked(item)\">\r\n <div class=\"asw-calendar-body-cell-content\"\r\n [class.asw-calendar-body-selected]=\"selectedValue === item.value\"\r\n [class.asw-calendar-body-today]=\"todayValue === item.value\"\r\n [attr.aria-selected]=\"selectedValue === item.value\">\r\n {{ item.displayValue }}\r\n </div>\r\n </td>\r\n</tr>\r\n", styles: [".asw-calendar-body{min-width:224px}.asw-calendar-body-label{height:0;line-height:0;text-align:left;padding:7.1428571429% 4.7142857143%}[dir=rtl] .asw-calendar-body-label{text-align:right}.asw-calendar-body-cell{position:relative;width:14.2857142857%;height:0;line-height:0;padding:7.1428571429% 0;text-align:center;outline:none;cursor:pointer}.asw-calendar-body-disabled{cursor:default;pointer-events:none}.asw-calendar-body-cell-content{position:absolute;top:5%;left:5%;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;border:1px solid transparent;border-radius:999px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswCalendarBody, decorators: [{
type: Component,
args: [{ selector: '[asw-calendar-body]', host: {
class: 'asw-calendar-body'
}, exportAs: 'aswCalendarBody', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\r\n If there's not enough space in the first row, create a separate label row. We mark this row as\r\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\r\n-->\r\n<tr *ngIf=\"_firstRowOffset < labelMinRequiredCells\" aria-hidden=\"true\">\r\n <td class=\"asw-calendar-body-label\" [attr.colspan]=\"numCols\">{{ label }}</td>\r\n</tr>\r\n\r\n<!-- Create the first row separately so we can include a special spacer cell. -->\r\n<tr *ngFor=\"let row of rows; let rowIndex = index\" role=\"row\">\r\n <!--\r\n We mark this cell as aria-hidden so it doesn't get read out as one of the days in the week.\r\n -->\r\n <td *ngIf=\"rowIndex === 0 && _firstRowOffset\"\r\n class=\"asw-calendar-body-label\" [attr.colspan]=\"_firstRowOffset\" aria-hidden=\"true\">\r\n {{ _firstRowOffset >= labelMinRequiredCells ? label : '' }}\r\n </td>\r\n <td *ngFor=\"let item of row; let colIndex = index\"\r\n role=\"gridcell\"\r\n class=\"asw-calendar-body-cell\"\r\n [class.asw-calendar-body-active]=\"_isActiveCell(rowIndex, colIndex)\"\r\n [class.asw-calendar-body-disabled]=\"!item.enabled\"\r\n [tabindex]=\"_isActiveCell(rowIndex, colIndex) ? 0 : -1\"\r\n [attr.data-mat-row]=\"rowIndex\"\r\n [attr.data-mat-col]=\"colIndex\"\r\n [attr.aria-label]=\"item.ariaLabel\"\r\n [attr.aria-disabled]=\"!item.enabled || null\"\r\n (click)=\"_cellClicked(item)\">\r\n <div class=\"asw-calendar-body-cell-content\"\r\n [class.asw-calendar-body-selected]=\"selectedValue === item.value\"\r\n [class.asw-calendar-body-today]=\"todayValue === item.value\"\r\n [attr.aria-selected]=\"selectedValue === item.value\">\r\n {{ item.displayValue }}\r\n </div>\r\n </td>\r\n</tr>\r\n", styles: [".asw-calendar-body{min-width:224px}.asw-calendar-body-label{height:0;line-height:0;text-align:left;padding:7.1428571429% 4.7142857143%}[dir=rtl] .asw-calendar-body-label{text-align:right}.asw-calendar-body-cell{position:relative;width:14.2857142857%;height:0;line-height:0;padding:7.1428571429% 0;text-align:center;outline:none;cursor:pointer}.asw-calendar-body-disabled{cursor:default;pointer-events:none}.asw-calendar-body-cell-content{position:absolute;top:5%;left:5%;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;border:1px solid transparent;border-radius:999px}\n"] }]
}], propDecorators: { label: [{
type: Input
}], rows: [{
type: Input
}], todayValue: [{
type: Input
}], selectedValue: [{
type: Input
}], labelMinRequiredCells: [{
type: Input
}], numCols: [{
type: Input
}], allowDisabledSelection: [{
type: Input
}], activeCell: [{
type: Input
}], selectedValueChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RhdGV0aW1lcGlja2VyL2NhbGVuZGFyLWJvZHkvY2FsZW5kYXItYm9keS50cyIsIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RhdGV0aW1lcGlja2VyL2NhbGVuZGFyLWJvZHkvY2FsZW5kYXItYm9keS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQUVuSDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUViO0lBQ0E7SUFDQTtJQUNBO0lBSlgsWUFDVyxLQUFhLEVBQ2IsWUFBb0IsRUFDcEIsU0FBaUIsRUFDakIsT0FBZ0I7UUFIaEIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQ3BCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDakIsWUFBTyxHQUFQLE9BQU8sQ0FBUztJQUN4QixDQUFDO0NBQ1A7QUFFRDs7O0dBR0c7QUFZSCxNQUFNLE9BQU8sZUFBZTtJQUN4QixrREFBa0Q7SUFDekMsS0FBSyxDQUFVO0lBRXhCLHlDQUF5QztJQUNoQyxJQUFJLENBQXVCO0lBRXBDLHdEQUF3RDtJQUMvQyxVQUFVLENBQVU7SUFFN0IseURBQXlEO0lBQ2hELGFBQWEsQ0FBVTtJQUVoQyxpRkFBaUY7SUFDeEUscUJBQXFCLENBQVU7SUFFeEMsMENBQTBDO0lBQ2pDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFckIsb0RBQW9EO0lBQzNDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztJQUV4Qyx1REFBdUQ7SUFDOUMsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUV4QiwwQ0FBMEM7SUFDaEMsbUJBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUUzRCwyRUFBMkU7SUFDM0UsSUFBSSxlQUFlO1FBQ2YsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekcsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFxQjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hELE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGFBQWEsQ0FBQyxRQUFnQixFQUFFLFFBQWdCO1FBQzVDLElBQUksVUFBVSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUVwRCxzRUFBc0U7UUFDdEUsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNYLFVBQVUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLFVBQVUsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzFDLENBQUM7dUdBakRRLGVBQWU7MkZBQWYsZUFBZSxzYkM5QjVCLGswREFvQ0E7OzJGRE5hLGVBQWU7a0JBWDNCLFNBQVM7K0JBQ0kscUJBQXFCLFFBR3pCO3dCQUNGLEtBQUssRUFBRSxtQkFBbUI7cUJBQzdCLFlBQ1MsaUJBQWlCLGlCQUNaLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07OEJBSXRDLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0ksbUJBQW1CO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEFuIGludGVybmFsIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSBjb3JyZXNwb25kaW5nIHRvIGEgc2luZ2xlIGNhbGVuZGFyIGNlbGwuXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3dDYWxlbmRhckNlbGwge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgdmFsdWU6IG51bWJlcixcbiAgICAgICAgcHVibGljIGRpc3BsYXlWYWx1ZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgYXJpYUxhYmVsOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuXG4gICAgKSB7fVxufVxuXG4vKipcbiAqIEFuIGludGVybmFsIGNvbXBvbmVudCB1c2VkIHRvIGRpc3BsYXkgY2FsZW5kYXIgZGF0YSBpbiBhIHRhYmxlLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1thc3ctY2FsZW5kYXItYm9keV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnY2FsZW5kYXItYm9keS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnY2FsZW5kYXItYm9keS5zY3NzJ10sXG4gICAgaG9zdDoge1xuICAgICAgICBjbGFzczogJ2Fzdy1jYWxlbmRhci1ib2R5J1xuICAgIH0sXG4gICAgZXhwb3J0QXM6ICdhc3dDYWxlbmRhckJvZHknLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQXN3Q2FsZW5kYXJCb2R5IHtcbiAgICAvKiogVGhlIGxhYmVsIGZvciB0aGUgdGFibGUuIChlLmcuIFwiSmFuIDIwMTdcIikuICovXG4gICAgQElucHV0KCkgbGFiZWwhOiBzdHJpbmc7XG5cbiAgICAvKiogVGhlIGNlbGxzIHRvIGRpc3BsYXkgaW4gdGhlIHRhYmxlLiAqL1xuICAgIEBJbnB1dCgpIHJvd3MhOiBBc3dDYWxlbmRhckNlbGxbXVtdO1xuXG4gICAgLyoqIFRoZSB2YWx1ZSBpbiB0aGUgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0b2RheS4gKi9cbiAgICBASW5wdXQoKSB0b2RheVZhbHVlITogbnVtYmVyO1xuXG4gICAgLyoqIFRoZSB2YWx1ZSBpbiB0aGUgdGFibGUgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuICovXG4gICAgQElucHV0KCkgc2VsZWN0ZWRWYWx1ZSE6IG51bWJlcjtcblxuICAgIC8qKiBUaGUgbWluaW11bSBudW1iZXIgb2YgZnJlZSBjZWxscyBuZWVkZWQgdG8gZml0IHRoZSBsYWJlbCBpbiB0aGUgZmlyc3Qgcm93LiAqL1xuICAgIEBJbnB1dCgpIGxhYmVsTWluUmVxdWlyZWRDZWxscyE6IG51bWJlcjtcblxuICAgIC8qKiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRhYmxlLiAqL1xuICAgIEBJbnB1dCgpIG51bUNvbHMgPSA3O1xuXG4gICAgLyoqIFdoZXRoZXIgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGRpc2FibGVkIGNlbGxzLiAqL1xuICAgIEBJbnB1dCgpIGFsbG93RGlzYWJsZWRTZWxlY3Rpb24gPSBmYWxzZTtcblxuICAgIC8qKiBUaGUgY2VsbCBudW1iZXIgb2YgdGhlIGFjdGl2ZSBjZWxsIGluIHRoZSB0YWJsZS4gKi9cbiAgICBASW5wdXQoKSBhY3RpdmVDZWxsID0gMDtcblxuICAgIC8qKiBFbWl0cyB3aGVuIGEgbmV3IHZhbHVlIGlzIHNlbGVjdGVkLiAqL1xuICAgIEBPdXRwdXQoKSBzZWxlY3RlZFZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKiogVGhlIG51bWJlciBvZiBibGFuayBjZWxscyB0byBwdXQgYXQgdGhlIGJlZ2lubmluZyBmb3IgdGhlIGZpcnN0IHJvdy4gKi9cbiAgICBnZXQgX2ZpcnN0Um93T2Zmc2V0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3MgJiYgdGhpcy5yb3dzLmxlbmd0aCAmJiB0aGlzLnJvd3NbMF0ubGVuZ3RoID8gdGhpcy5udW1Db2xzIC0gdGhpcy5yb3dzWzBdLmxlbmd0aCA6IDA7XG4gICAgfVxuXG4gICAgX2NlbGxDbGlja2VkKGNlbGw6IEFzd0NhbGVuZGFyQ2VsbCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuYWxsb3dEaXNhYmxlZFNlbGVjdGlvbiAmJiAhY2VsbC5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlQ2hhbmdlLmVtaXQoY2VsbC52YWx1ZSk7XG4gICAgfVxuXG4gICAgX2lzQWN0aXZlQ2VsbChyb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBjZWxsTnVtYmVyID0gcm93SW5kZXggKiB0aGlzLm51bUNvbHMgKyBjb2xJbmRleDtcblxuICAgICAgICAvLyBBY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0IHRoZSBmaXJzdCByb3cgbWF5IG5vdCBoYXZlIGFzIG1hbnkgY2VsbHMuXG4gICAgICAgIGlmIChyb3dJbmRleCkge1xuICAgICAgICAgICAgY2VsbE51bWJlciAtPSB0aGlzLl9maXJzdFJvd09mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjZWxsTnVtYmVyID09PSB0aGlzLmFjdGl2ZUNlbGw7XG4gICAgfVxufVxuIiwiPCEtLVxyXG4gIElmIHRoZXJlJ3Mgbm90IGVub3VnaCBzcGFjZSBpbiB0aGUgZmlyc3Qgcm93LCBjcmVhdGUgYSBzZXBhcmF0ZSBsYWJlbCByb3cuIFdlIG1hcmsgdGhpcyByb3cgYXNcclxuICBhcmlhLWhpZGRlbiBiZWNhdXNlIHdlIGRvbid0IHdhbnQgaXQgdG8gYmUgcmVhZCBvdXQgYXMgb25lIG9mIHRoZSB3ZWVrcyBpbiB0aGUgbW9udGguXHJcbi0tPlxyXG48dHIgKm5nSWY9XCJfZmlyc3RSb3dPZmZzZXQgPCBsYWJlbE1pblJlcXVpcmVkQ2VsbHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDx0ZCBjbGFzcz1cImFzdy1jYWxlbmRhci1ib2R5LWxhYmVsXCIgW2F0dHIuY29sc3Bhbl09XCJudW1Db2xzXCI+e3sgbGFiZWwgfX08L3RkPlxyXG48L3RyPlxyXG5cclxuPCEtLSBDcmVhdGUgdGhlIGZpcnN0IHJvdyBzZXBhcmF0ZWx5IHNvIHdlIGNhbiBpbmNsdWRlIGEgc3BlY2lhbCBzcGFjZXIgY2VsbC4gLS0+XHJcbjx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHJvd3M7IGxldCByb3dJbmRleCA9IGluZGV4XCIgcm9sZT1cInJvd1wiPlxyXG4gICAgPCEtLVxyXG4gICAgICAgIFdlIG1hcmsgdGhpcyBjZWxsIGFzIGFyaWEtaGlkZGVuIHNvIGl0IGRvZXNuJ3QgZ2V0IHJlYWQgb3V0IGFzIG9uZSBvZiB0aGUgZGF5cyBpbiB0aGUgd2Vlay5cclxuICAgIC0tPlxyXG4gICAgPHRkICpuZ0lmPVwicm93SW5kZXggPT09IDAgJiYgX2ZpcnN0Um93T2Zmc2V0XCJcclxuICAgICAgICBjbGFzcz1cImFzdy1jYWxlbmRhci1ib2R5LWxhYmVsXCIgW2F0dHIuY29sc3Bhbl09XCJfZmlyc3RSb3dPZmZzZXRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgICB7eyBfZmlyc3RSb3dPZmZzZXQgPj0gbGFiZWxNaW5SZXF1aXJlZENlbGxzID8gbGFiZWwgOiAnJyB9fVxyXG4gICAgPC90ZD5cclxuICAgIDx0ZCAqbmdGb3I9XCJsZXQgaXRlbSBvZiByb3c7IGxldCBjb2xJbmRleCA9IGluZGV4XCJcclxuICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxyXG4gICAgICAgIGNsYXNzPVwiYXN3LWNhbGVuZGFyLWJvZHktY2VsbFwiXHJcbiAgICAgICAgW2NsYXNzLmFzdy1jYWxlbmRhci1ib2R5LWFjdGl2ZV09XCJfaXNBY3RpdmVDZWxsKHJvd0luZGV4LCBjb2xJbmRleClcIlxyXG4gICAgICAgIFtjbGFzcy5hc3ctY2FsZW5kYXItYm9keS1kaXNhYmxlZF09XCIhaXRlbS5lbmFibGVkXCJcclxuICAgICAgICBbdGFiaW5kZXhdPVwiX2lzQWN0aXZlQ2VsbChyb3dJbmRleCwgY29sSW5kZXgpID8gMCA6IC0xXCJcclxuICAgICAgICBbYXR0ci5kYXRhLW1hdC1yb3ddPVwicm93SW5kZXhcIlxyXG4gICAgICAgIFthdHRyLmRhdGEtbWF0LWNvbF09XCJjb2xJbmRleFwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpdGVtLmFyaWFMYWJlbFwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCIhaXRlbS5lbmFibGVkIHx8IG51bGxcIlxyXG4gICAgICAgIChjbGljayk9XCJfY2VsbENsaWNrZWQoaXRlbSlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXN3LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50XCJcclxuICAgICAgICAgICAgW2NsYXNzLmFzdy1jYWxlbmRhci1ib2R5LXNlbGVjdGVkXT1cInNlbGVjdGVkVmFsdWUgPT09IGl0ZW0udmFsdWVcIlxyXG4gICAgICAgICAgICBbY2xhc3MuYXN3LWNhbGVuZGFyLWJvZHktdG9kYXldPVwidG9kYXlWYWx1ZSA9PT0gaXRlbS52YWx1ZVwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwic2VsZWN0ZWRWYWx1ZSA9PT0gaXRlbS52YWx1ZVwiPlxyXG4gICAgICAgIHt7IGl0ZW0uZGlzcGxheVZhbHVlIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3RkPlxyXG48L3RyPlxyXG4iXX0=