UNPKG

carbon-components-angular

Version:
190 lines 16.7 kB
import { Component, Input, Output, EventEmitter, ViewChild, HostListener } from "@angular/core"; import * as i0 from "@angular/core"; import * as i1 from "carbon-components-angular/i18n"; import * as i2 from "@angular/common"; import * as i3 from "carbon-components-angular/icon"; export class SelectionTile { constructor(i18n) { this.i18n = i18n; /** * @deprecated since v5 - Use `cdsLayer` directive instead * Set to `"light"` to apply the light style */ this.theme = "dark"; /** * The unique id for the input. */ this.id = `tile-${SelectionTile.tileCount}`; /** * Internal event used to notify the containing `TileGroup` of changes. */ this.change = new EventEmitter(); /** * Set to `true` to disable the selection tile. */ this.disabled = false; /** * When `true` with a `decorator`, applies rounded styling. */ this.hasRoundedCorners = false; /** * Set by the containing `TileGroup`. Used for the `name` property on the input. */ this.name = "tile-group-unbound"; /** * Defines whether or not the `SelectionTile` supports selecting multiple tiles as opposed to single * tile selection. */ this.multiple = true; // Set to true because of the way tile group sets it up. // If an initial selected value is set before input exists, we save // the value and check again when input exists in `AfterViewInit`. this._selected = null; SelectionTile.tileCount++; } /** * Updating the state of the input to match the state of the parameter passed in. * Set to `true` if this tile should be selected. */ set selected(value) { // If an initial selected value is set before input exists, we save // the value and check again when input exists in `AfterViewInit`. this._selected = value ? true : null; if (this.input) { this.input.nativeElement.checked = this._selected; } } get selected() { return this.input ? this.input.nativeElement.checked : false; } ngAfterViewInit() { if (this.input) { setTimeout(() => { this.input.nativeElement.checked = this._selected; }); } } keyboardInput(event) { if (event.key === "Enter" || event.key === "Spacebar" || event.key === " ") { this.selected = !this.selected; this.change.emit(event); } } onChange(event) { this.change.emit(event); } } SelectionTile.tileCount = 0; SelectionTile.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SelectionTile, deps: [{ token: i1.I18n }], target: i0.ɵɵFactoryTarget.Component }); SelectionTile.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SelectionTile, selector: "cds-selection-tile, ibm-selection-tile", inputs: { theme: "theme", id: "id", selected: "selected", value: "value", disabled: "disabled", decorator: "decorator", hasRoundedCorners: "hasRoundedCorners" }, outputs: { change: "change" }, host: { listeners: { "keydown": "keyboardInput($event)" } }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, static: true }], ngImport: i0, template: ` <input #input [attr.tabindex]="disabled ? null : 0" class="cds--tile-input" [id]="id" [disabled]="disabled" [type]="(multiple ? 'checkbox': 'radio')" [value]="value" [name]="name" (change)="onChange($event)"/> <label class="cds--tile cds--tile--selectable" [for]="id" [ngClass]="{ 'cds--tile--is-selected' : selected, 'cds--tile--light': theme === 'light', 'cds--tile--disabled' : disabled, 'cds--tile--decorator': !!decorator, 'cds--tile--decorator-rounded': !!decorator && hasRoundedCorners }" [attr.aria-label]="i18n.get('TILES.TILE') | async"> <div class="cds--tile__checkmark" [class.cds--tile__checkmark--persistent]="multiple"> <svg *ngIf="!selected; else selectedIcon" [cdsIcon]="multiple ? 'checkbox' : 'checkmark'" size="16"> </svg> <ng-template #selectedIcon> <svg [cdsIcon]="multiple ? 'checkbox--checked--filled' : 'checkmark--filled'" size="16"></svg> </ng-template> </div> <div class="cds--tile-content"> <ng-content></ng-content> </div> <ng-container *ngIf="decorator"> <div class="cds--tile--inner-decorator"> <ng-template [ngTemplateOutlet]="decorator"></ng-template> </div> </ng-container> </label> `, isInline: true, dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SelectionTile, decorators: [{ type: Component, args: [{ selector: "cds-selection-tile, ibm-selection-tile", template: ` <input #input [attr.tabindex]="disabled ? null : 0" class="cds--tile-input" [id]="id" [disabled]="disabled" [type]="(multiple ? 'checkbox': 'radio')" [value]="value" [name]="name" (change)="onChange($event)"/> <label class="cds--tile cds--tile--selectable" [for]="id" [ngClass]="{ 'cds--tile--is-selected' : selected, 'cds--tile--light': theme === 'light', 'cds--tile--disabled' : disabled, 'cds--tile--decorator': !!decorator, 'cds--tile--decorator-rounded': !!decorator && hasRoundedCorners }" [attr.aria-label]="i18n.get('TILES.TILE') | async"> <div class="cds--tile__checkmark" [class.cds--tile__checkmark--persistent]="multiple"> <svg *ngIf="!selected; else selectedIcon" [cdsIcon]="multiple ? 'checkbox' : 'checkmark'" size="16"> </svg> <ng-template #selectedIcon> <svg [cdsIcon]="multiple ? 'checkbox--checked--filled' : 'checkmark--filled'" size="16"></svg> </ng-template> </div> <div class="cds--tile-content"> <ng-content></ng-content> </div> <ng-container *ngIf="decorator"> <div class="cds--tile--inner-decorator"> <ng-template [ngTemplateOutlet]="decorator"></ng-template> </div> </ng-container> </label> ` }] }], ctorParameters: function () { return [{ type: i1.I18n }]; }, propDecorators: { theme: [{ type: Input }], id: [{ type: Input }], selected: [{ type: Input }], value: [{ type: Input }], change: [{ type: Output }], disabled: [{ type: Input }], decorator: [{ type: Input }], hasRoundedCorners: [{ type: Input }], input: [{ type: ViewChild, args: ["input", { static: true }] }], keyboardInput: [{ type: HostListener, args: ["keydown", ["$event"]] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLXRpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RpbGVzL3NlbGVjdGlvbi10aWxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFNBQVMsRUFDVCxZQUFZLEVBR1osTUFBTSxlQUFlLENBQUM7Ozs7O0FBZ0R2QixNQUFNLE9BQU8sYUFBYTtJQXVFekIsWUFBbUIsSUFBVTtRQUFWLFNBQUksR0FBSixJQUFJLENBQU07UUFwRTdCOzs7V0FHRztRQUNNLFVBQUssR0FBcUIsTUFBTSxDQUFDO1FBRTFDOztXQUVHO1FBQ00sT0FBRSxHQUFHLFFBQVEsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBc0JoRDs7V0FFRztRQUNPLFdBQU0sR0FBd0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUzRDs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFPMUI7O1dBRUc7UUFDTSxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFbkM7O1dBRUc7UUFDSCxTQUFJLEdBQUcsb0JBQW9CLENBQUM7UUFDNUI7OztXQUdHO1FBQ0gsYUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLHdEQUF3RDtRQUt6RSxtRUFBbUU7UUFDbkUsa0VBQWtFO1FBQ3hELGNBQVMsR0FBRyxJQUFJLENBQUM7UUFHMUIsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUEzREQ7OztPQUdHO0lBQ0gsSUFBYSxRQUFRLENBQUMsS0FBYztRQUNuQyxtRUFBbUU7UUFDbkUsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUNsRDtJQUNGLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzlELENBQUM7SUE4Q0QsZUFBZTtRQUNkLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7U0FDSDtJQUNGLENBQUM7SUFHRCxhQUFhLENBQUMsS0FBSztRQUNsQixJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssVUFBVSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFO1lBQzNFLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3hCO0lBQ0YsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFLO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQzs7QUE1Rk0sdUJBQVMsR0FBRyxDQUFDLENBQUM7MEdBRFQsYUFBYTs4RkFBYixhQUFhLDBiQTNDZjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF5Q1Q7MkZBRVcsYUFBYTtrQkE3Q3pCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLHdDQUF3QztvQkFDbEQsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlDVDtpQkFDRDsyRkFRUyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csRUFBRTtzQkFBVixLQUFLO2dCQU1PLFFBQVE7c0JBQXBCLEtBQUs7Z0JBZUcsS0FBSztzQkFBYixLQUFLO2dCQUlJLE1BQU07c0JBQWYsTUFBTTtnQkFLRSxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQWFnQyxLQUFLO3NCQUExQyxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBbUJwQyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LFxuXHRJbnB1dCxcblx0T3V0cHV0LFxuXHRFdmVudEVtaXR0ZXIsXG5cdFZpZXdDaGlsZCxcblx0SG9zdExpc3RlbmVyLFxuXHRBZnRlclZpZXdJbml0LFxuXHRUZW1wbGF0ZVJlZlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgSTE4biB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2kxOG5cIjtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiBcImNkcy1zZWxlY3Rpb24tdGlsZSwgaWJtLXNlbGVjdGlvbi10aWxlXCIsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGlucHV0XG5cdFx0XHQjaW5wdXRcblx0XHRcdFthdHRyLnRhYmluZGV4XT1cImRpc2FibGVkID8gbnVsbCA6IDBcIlxuXHRcdFx0Y2xhc3M9XCJjZHMtLXRpbGUtaW5wdXRcIlxuXHRcdFx0W2lkXT1cImlkXCJcblx0XHRcdFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG5cdFx0XHRbdHlwZV09XCIobXVsdGlwbGUgPyAnY2hlY2tib3gnOiAncmFkaW8nKVwiXG5cdFx0XHRbdmFsdWVdPVwidmFsdWVcIlxuXHRcdFx0W25hbWVdPVwibmFtZVwiXG5cdFx0XHQoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIi8+XG5cdFx0PGxhYmVsXG5cdFx0XHRjbGFzcz1cImNkcy0tdGlsZSBjZHMtLXRpbGUtLXNlbGVjdGFibGVcIlxuXHRcdFx0W2Zvcl09XCJpZFwiXG5cdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdCdjZHMtLXRpbGUtLWlzLXNlbGVjdGVkJyA6IHNlbGVjdGVkLFxuXHRcdFx0XHQnY2RzLS10aWxlLS1saWdodCc6IHRoZW1lID09PSAnbGlnaHQnLFxuXHRcdFx0XHQnY2RzLS10aWxlLS1kaXNhYmxlZCcgOiBkaXNhYmxlZCxcblx0XHRcdFx0J2Nkcy0tdGlsZS0tZGVjb3JhdG9yJzogISFkZWNvcmF0b3IsXG5cdFx0XHRcdCdjZHMtLXRpbGUtLWRlY29yYXRvci1yb3VuZGVkJzogISFkZWNvcmF0b3IgJiYgaGFzUm91bmRlZENvcm5lcnNcblx0XHRcdH1cIlxuXHRcdFx0W2F0dHIuYXJpYS1sYWJlbF09XCJpMThuLmdldCgnVElMRVMuVElMRScpIHwgYXN5bmNcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJjZHMtLXRpbGVfX2NoZWNrbWFya1wiXG5cdFx0XHRcdFtjbGFzcy5jZHMtLXRpbGVfX2NoZWNrbWFyay0tcGVyc2lzdGVudF09XCJtdWx0aXBsZVwiPlxuXHRcdFx0XHQ8c3ZnICpuZ0lmPVwiIXNlbGVjdGVkOyBlbHNlIHNlbGVjdGVkSWNvblwiXG5cdFx0XHRcdFx0W2Nkc0ljb25dPVwibXVsdGlwbGUgPyAnY2hlY2tib3gnIDogJ2NoZWNrbWFyaydcIlxuXHRcdFx0XHRcdHNpemU9XCIxNlwiPlxuXHRcdFx0XHQ8L3N2Zz5cblx0XHRcdFx0PG5nLXRlbXBsYXRlICNzZWxlY3RlZEljb24+XG5cdFx0XHRcdFx0PHN2ZyBbY2RzSWNvbl09XCJtdWx0aXBsZSA/ICdjaGVja2JveC0tY2hlY2tlZC0tZmlsbGVkJyA6ICdjaGVja21hcmstLWZpbGxlZCdcIiBzaXplPVwiMTZcIj48L3N2Zz5cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdiBjbGFzcz1cImNkcy0tdGlsZS1jb250ZW50XCI+XG5cdFx0XHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImRlY29yYXRvclwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS10aWxlLS1pbm5lci1kZWNvcmF0b3JcIj5cblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGVjb3JhdG9yXCI+PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHQ8L2xhYmVsPlxuXHRgXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdGlvblRpbGUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcblx0c3RhdGljIHRpbGVDb3VudCA9IDA7XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkIHNpbmNlIHY1IC0gVXNlIGBjZHNMYXllcmAgZGlyZWN0aXZlIGluc3RlYWRcblx0ICogU2V0IHRvIGBcImxpZ2h0XCJgIHRvIGFwcGx5IHRoZSBsaWdodCBzdHlsZVxuXHQgKi9cblx0QElucHV0KCkgdGhlbWU6IFwibGlnaHRcIiB8IFwiZGFya1wiID0gXCJkYXJrXCI7XG5cblx0LyoqXG5cdCAqIFRoZSB1bmlxdWUgaWQgZm9yIHRoZSBpbnB1dC5cblx0ICovXG5cdEBJbnB1dCgpIGlkID0gYHRpbGUtJHtTZWxlY3Rpb25UaWxlLnRpbGVDb3VudH1gO1xuXG5cdC8qKlxuXHQgKiBVcGRhdGluZyB0aGUgc3RhdGUgb2YgdGhlIGlucHV0IHRvIG1hdGNoIHRoZSBzdGF0ZSBvZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbi5cblx0ICogU2V0IHRvIGB0cnVlYCBpZiB0aGlzIHRpbGUgc2hvdWxkIGJlIHNlbGVjdGVkLlxuXHQgKi9cblx0QElucHV0KCkgc2V0IHNlbGVjdGVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0Ly8gSWYgYW4gaW5pdGlhbCBzZWxlY3RlZCB2YWx1ZSBpcyBzZXQgYmVmb3JlIGlucHV0IGV4aXN0cywgd2Ugc2F2ZVxuXHRcdC8vIHRoZSB2YWx1ZSBhbmQgY2hlY2sgYWdhaW4gd2hlbiBpbnB1dCBleGlzdHMgaW4gYEFmdGVyVmlld0luaXRgLlxuXHRcdHRoaXMuX3NlbGVjdGVkID0gdmFsdWUgPyB0cnVlIDogbnVsbDtcblx0XHRpZiAodGhpcy5pbnB1dCkge1xuXHRcdFx0dGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmNoZWNrZWQgPSB0aGlzLl9zZWxlY3RlZDtcblx0XHR9XG5cdH1cblxuXHRnZXQgc2VsZWN0ZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaW5wdXQgPyB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuY2hlY2tlZCA6IGZhbHNlO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGUgdmFsdWUgZm9yIHRoZSB0aWxlLiBSZXR1cm5lZCB2aWEgYG5nTW9kZWxgIG9yIGBzZWxlY3RlZGAgZXZlbnQgb24gdGhlIGNvbnRhaW5pbmcgYFRpbGVHcm91cGAuXG5cdCAqL1xuXHRASW5wdXQoKSB2YWx1ZTogc3RyaW5nO1xuXHQvKipcblx0ICogSW50ZXJuYWwgZXZlbnQgdXNlZCB0byBub3RpZnkgdGhlIGNvbnRhaW5pbmcgYFRpbGVHcm91cGAgb2YgY2hhbmdlcy5cblx0ICovXG5cdEBPdXRwdXQoKSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqXG5cdCAqIFNldCB0byBgdHJ1ZWAgdG8gZGlzYWJsZSB0aGUgc2VsZWN0aW9uIHRpbGUuXG5cdCAqL1xuXHRASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiAqKkV4cGVyaW1lbnRhbCoqOiBPcHRpb25hbCBkZWNvcmF0b3IgKGUuZy4gQUkgbGFiZWwpLlxuXHQgKi9cblx0QElucHV0KCkgZGVjb3JhdG9yOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG5cdC8qKlxuXHQgKiBXaGVuIGB0cnVlYCB3aXRoIGEgYGRlY29yYXRvcmAsIGFwcGxpZXMgcm91bmRlZCBzdHlsaW5nLlxuXHQgKi9cblx0QElucHV0KCkgaGFzUm91bmRlZENvcm5lcnMgPSBmYWxzZTtcblxuXHQvKipcblx0ICogU2V0IGJ5IHRoZSBjb250YWluaW5nIGBUaWxlR3JvdXBgLiBVc2VkIGZvciB0aGUgYG5hbWVgIHByb3BlcnR5IG9uIHRoZSBpbnB1dC5cblx0ICovXG5cdG5hbWUgPSBcInRpbGUtZ3JvdXAtdW5ib3VuZFwiO1xuXHQvKipcblx0ICogRGVmaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgYFNlbGVjdGlvblRpbGVgIHN1cHBvcnRzIHNlbGVjdGluZyBtdWx0aXBsZSB0aWxlcyBhcyBvcHBvc2VkIHRvIHNpbmdsZVxuXHQgKiB0aWxlIHNlbGVjdGlvbi5cblx0ICovXG5cdG11bHRpcGxlID0gdHJ1ZTtcdC8vIFNldCB0byB0cnVlIGJlY2F1c2Ugb2YgdGhlIHdheSB0aWxlIGdyb3VwIHNldHMgaXQgdXAuXG5cdFx0XHRcdFx0XHQvLyBJZiBpdCBpcyBmaXJzdCB1bmRlZmluZWQgdGhlbiBzZXQgdG8gdHJ1ZSwgdGhlIHR5cGUgd2lsbCBjaGFuZ2UgZnJvbSByYWRpbyB0byBjaGVja2JveCBhbmQgZGVzZWxlY3RzIHRoZSBpbnB1dHMuXG5cblx0QFZpZXdDaGlsZChcImlucHV0XCIsIHsgc3RhdGljOiB0cnVlIH0pIGlucHV0O1xuXG5cdC8vIElmIGFuIGluaXRpYWwgc2VsZWN0ZWQgdmFsdWUgaXMgc2V0IGJlZm9yZSBpbnB1dCBleGlzdHMsIHdlIHNhdmVcblx0Ly8gdGhlIHZhbHVlIGFuZCBjaGVjayBhZ2FpbiB3aGVuIGlucHV0IGV4aXN0cyBpbiBgQWZ0ZXJWaWV3SW5pdGAuXG5cdHByb3RlY3RlZCBfc2VsZWN0ZWQgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyBpMThuOiBJMThuKSB7XG5cdFx0U2VsZWN0aW9uVGlsZS50aWxlQ291bnQrKztcblx0fVxuXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcblx0XHRpZiAodGhpcy5pbnB1dCkge1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5jaGVja2VkID0gdGhpcy5fc2VsZWN0ZWQ7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKFwia2V5ZG93blwiLCBbXCIkZXZlbnRcIl0pXG5cdGtleWJvYXJkSW5wdXQoZXZlbnQpIHtcblx0XHRpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIgfHwgZXZlbnQua2V5ID09PSBcIlNwYWNlYmFyXCIgfHwgZXZlbnQua2V5ID09PSBcIiBcIikge1xuXHRcdFx0dGhpcy5zZWxlY3RlZCA9ICF0aGlzLnNlbGVjdGVkO1xuXHRcdFx0dGhpcy5jaGFuZ2UuZW1pdChldmVudCk7XG5cdFx0fVxuXHR9XG5cblx0b25DaGFuZ2UoZXZlbnQpIHtcblx0XHR0aGlzLmNoYW5nZS5lbWl0KGV2ZW50KTtcblx0fVxufVxuXG5cbiJdfQ==