UNPKG

carbon-components-angular

Version:
244 lines 25 kB
import { Component, HostBinding, Input, Output, EventEmitter, HostListener, ContentChild, Optional } from "@angular/core"; import { Subscription } from "rxjs"; import { ContextMenuComponent } from "./context-menu.component"; import * as i0 from "@angular/core"; import * as i1 from "./context-menu-selection.service"; import * as i2 from "@angular/common"; import * as i3 from "carbon-components-angular/icon"; export class ContextMenuItemComponent { constructor(elementRef, contextMenuSelectionService) { this.elementRef = elementRef; this.contextMenuSelectionService = contextMenuSelectionService; this.optionClass = true; this.role = "menuitem"; this.tabindex = -1; this.ariaHasPopup = null; this.ariaExpanded = null; this.disabled = false; this.danger = false; this.label = ""; this.info = ""; this.type = null; this.checked = false; this.icon = ""; this.value = ""; this.checkedChange = new EventEmitter(); this.itemClick = new EventEmitter(); this.hasChildren = false; this.selectable = false; this.subscriptions = new Subscription(); } get ariaChecked() { return this.type === "checkbox" ? (this.checked ? true : false) : null; } get ariaDisabled() { return this.disabled; } ngOnInit() { switch (this.type) { case "checkbox": { this.role = "menuitemcheckbox"; this.selectable = true; break; } case "radio": { this.role = "menuitemradio"; this.selectable = true; break; } default: { this.role = "menuitem"; } } if (this.type && this.contextMenuSelectionService && this.value) { const { selectionObservable } = this.contextMenuSelectionService; const subscription = selectionObservable.subscribe((value) => { if (this.type === "radio") { this.handleSelection(value === this.value); } if (this.type === "checkbox") { this.handleSelection(value.includes(this.value)); } }); this.subscriptions.add(subscription); } } ngAfterContentInit() { if (this.childContextMenu) { this.hasChildren = true; this.ariaHasPopup = true; this.ariaExpanded = false; } } handleClick(event) { event.stopPropagation(); if (this.hasChildren) { this.openSubMenu(); this.childContextMenu.focusMenu(); } if (this.type) { this.handleSelection(!this.checked); } if (this.contextMenuSelectionService) { if (this.type === "radio") { this.contextMenuSelectionService.selectRadio(this.value); } if (this.type === "checkbox") { this.contextMenuSelectionService.selectCheckbox(this.value); } } if (!this.disabled) { this.itemClick.emit({ event, label: this.label, info: this.info, value: this.value, type: this.type }); } } handleSelection(selected) { this.checked = selected; this.checkedChange.emit(this.checked); } openSubMenu() { if (this.childContextMenu) { this.childContextMenu.open = true; this.ariaExpanded = true; const dimensions = this.elementRef.nativeElement.getBoundingClientRect(); this.childContextMenu.position.left = dimensions.left + dimensions.width; // subtract 4px to account for margins this.childContextMenu.position.top = dimensions.top - 4; } } closeSubMenu() { if (this.childContextMenu) { this.childContextMenu.open = false; this.ariaExpanded = false; } } handleMouseOver() { this.openSubMenu(); } handleMouseOut() { this.closeSubMenu(); } handleFocus() { this.tabindex = 0; if (this.hasChildren && this.ariaExpanded) { this.closeSubMenu(); } } handleBlur() { this.tabindex = -1; } focusItem() { this.elementRef.nativeElement.focus(); } ngOnDestroy() { this.subscriptions.unsubscribe(); } } ContextMenuItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ContextMenuItemComponent, deps: [{ token: i0.ElementRef }, { token: i1.ContextMenuSelectionService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); ContextMenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ContextMenuItemComponent, selector: "cds-menu-item, cds-context-menu-item, ibm-context-menu-item", inputs: { disabled: "disabled", danger: "danger", label: "label", info: "info", type: "type", checked: "checked", icon: "icon", value: "value" }, outputs: { checkedChange: "checkedChange", itemClick: "itemClick" }, host: { listeners: { "keydown.enter": "handleClick($event)", "keydown.space": "handleClick($event)", "click": "handleClick($event)", "mouseover": "handleMouseOver()", "mouseout": "handleMouseOut()", "focus": "handleFocus()", "blur": "handleBlur()" }, properties: { "class.cds--menu-item": "this.optionClass", "attr.role": "this.role", "attr.tabindex": "this.tabindex", "attr.aria-haspopup": "this.ariaHasPopup", "attr.aria-expanded": "this.ariaExpanded", "attr.aria-checked": "this.ariaChecked", "attr.aria-disabled": "this.ariaDisabled", "class.cds--menu-item--disabled": "this.disabled", "class.cds--menu-item--danger": "this.danger" } }, queries: [{ propertyName: "childContextMenu", first: true, predicate: ContextMenuComponent, descendants: true, static: true }], ngImport: i0, template: ` <div class="cds--menu-item__icon"> <svg *ngIf="selectable && checked" cdsIcon="checkmark" size="16"></svg> <svg *ngIf="!selectable && icon" [cdsIcon]="icon" size="16"></svg> </div> <div class="cds--menu-item__label" [title]="label">{{label}}</div> <div class="cds--menu-item__shortcut"> <ng-container *ngIf="info">{{info}}</ng-container> <svg *ngIf="hasChildren" cdsIcon="caret--right" size="16"></svg> </div> <ng-content></ng-content> `, isInline: true, styles: [":host{grid-template-columns:1rem 1fr max-content}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ContextMenuItemComponent, decorators: [{ type: Component, args: [{ selector: "cds-menu-item, cds-context-menu-item, ibm-context-menu-item", template: ` <div class="cds--menu-item__icon"> <svg *ngIf="selectable && checked" cdsIcon="checkmark" size="16"></svg> <svg *ngIf="!selectable && icon" [cdsIcon]="icon" size="16"></svg> </div> <div class="cds--menu-item__label" [title]="label">{{label}}</div> <div class="cds--menu-item__shortcut"> <ng-container *ngIf="info">{{info}}</ng-container> <svg *ngIf="hasChildren" cdsIcon="caret--right" size="16"></svg> </div> <ng-content></ng-content> `, styles: [":host{grid-template-columns:1rem 1fr max-content}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ContextMenuSelectionService, decorators: [{ type: Optional }] }]; }, propDecorators: { optionClass: [{ type: HostBinding, args: ["class.cds--menu-item"] }], role: [{ type: HostBinding, args: ["attr.role"] }], tabindex: [{ type: HostBinding, args: ["attr.tabindex"] }], ariaHasPopup: [{ type: HostBinding, args: ["attr.aria-haspopup"] }], ariaExpanded: [{ type: HostBinding, args: ["attr.aria-expanded"] }], ariaChecked: [{ type: HostBinding, args: ["attr.aria-checked"] }], ariaDisabled: [{ type: HostBinding, args: ["attr.aria-disabled"] }], disabled: [{ type: Input }, { type: HostBinding, args: ["class.cds--menu-item--disabled"] }], danger: [{ type: Input }, { type: HostBinding, args: ["class.cds--menu-item--danger"] }], label: [{ type: Input }], info: [{ type: Input }], type: [{ type: Input }], checked: [{ type: Input }], icon: [{ type: Input }], value: [{ type: Input }], checkedChange: [{ type: Output }], itemClick: [{ type: Output }], childContextMenu: [{ type: ContentChild, args: [ContextMenuComponent, { static: true }] }], handleClick: [{ type: HostListener, args: ["keydown.enter", ["$event"]] }, { type: HostListener, args: ["keydown.space", ["$event"]] }, { type: HostListener, args: ["click", ["$event"]] }], handleMouseOver: [{ type: HostListener, args: ["mouseover"] }], handleMouseOut: [{ type: HostListener, args: ["mouseout"] }], handleFocus: [{ type: HostListener, args: ["focus"] }], handleBlur: [{ type: HostListener, args: ["blur"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnRleHQtbWVudS9jb250ZXh0LW1lbnUtaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBRVosWUFBWSxFQUNaLFlBQVksRUFDWixRQUFRLEVBSVIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7QUF1QmhFLE1BQU0sT0FBTyx3QkFBd0I7SUE4QnBDLFlBQ1csVUFBc0IsRUFDViwyQkFBd0Q7UUFEcEUsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNWLGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUEvQjFDLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzlCLFNBQUksR0FBRyxVQUFVLENBQUM7UUFDZCxhQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDVCxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQVFDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDbkIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUM1RCxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLFNBQUksR0FBZ0MsSUFBSSxDQUFDO1FBQ3pDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDVixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDNUMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBRXpELGdCQUFX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QUFLOztzQkFBSSxXQUFXO3VCQUFDLGdDQUFnQztnQkFDQSxNQUFNO3NCQUEzRCxLQUFLOztzQkFBSSxXQUFXO3VCQUFDLDhCQUE4QjtnQkFDM0MsS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUsrQyxnQkFBZ0I7c0JBQXJFLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQW1EcEQsV0FBVztzQkFIVixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ3hDLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDOztzQkFDeEMsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBeURqQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsV0FBVztnQkFNekIsY0FBYztzQkFEYixZQUFZO3VCQUFDLFVBQVU7Z0JBTXhCLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxPQUFPO2dCQVNyQixVQUFVO3NCQURULFlBQVk7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0SG9zdEJpbmRpbmcsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0RWxlbWVudFJlZixcblx0SG9zdExpc3RlbmVyLFxuXHRDb250ZW50Q2hpbGQsXG5cdE9wdGlvbmFsLFxuXHRPbkluaXQsXG5cdEFmdGVyQ29udGVudEluaXQsXG5cdE9uRGVzdHJveVxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IENvbnRleHRNZW51U2VsZWN0aW9uU2VydmljZSB9IGZyb20gXCIuL2NvbnRleHQtbWVudS1zZWxlY3Rpb24uc2VydmljZVwiO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tIFwiLi9jb250ZXh0LW1lbnUuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJdGVtQ2xpY2tFdmVudCB9IGZyb20gXCIuL2NvbnRleHQtbWVudS50eXBlc1wiO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6IFwiY2RzLW1lbnUtaXRlbSwgY2RzLWNvbnRleHQtbWVudS1pdGVtLCBpYm0tY29udGV4dC1tZW51LWl0ZW1cIixcblx0dGVtcGxhdGU6IGBcblx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS1tZW51LWl0ZW1fX2ljb25cIj5cblx0XHRcdDxzdmcgKm5nSWY9XCJzZWxlY3RhYmxlICYmIGNoZWNrZWRcIiBjZHNJY29uPVwiY2hlY2ttYXJrXCIgc2l6ZT1cIjE2XCI+PC9zdmc+XG5cdFx0XHQ8c3ZnICpuZ0lmPVwiIXNlbGVjdGFibGUgJiYgaWNvblwiIFtjZHNJY29uXT1cImljb25cIiBzaXplPVwiMTZcIj48L3N2Zz5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS1tZW51LWl0ZW1fX2xhYmVsXCIgW3RpdGxlXT1cImxhYmVsXCI+e3tsYWJlbH19PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cImNkcy0tbWVudS1pdGVtX19zaG9ydGN1dFwiPlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImluZm9cIj57e2luZm99fTwvbmctY29udGFpbmVyPlxuXHRcdFx0PHN2ZyAqbmdJZj1cImhhc0NoaWxkcmVuXCIgY2RzSWNvbj1cImNhcmV0LS1yaWdodFwiIHNpemU9XCIxNlwiPjwvc3ZnPlxuXHRcdDwvZGl2PlxuXHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0YCxcblx0c3R5bGVzOiBbYFxuXHRcdDpob3N0IHtcblx0XHRcdGdyaWQtdGVtcGxhdGUtY29sdW1uczogMXJlbSAxZnIgbWF4LWNvbnRlbnQ7XG5cdFx0fVxuXHRgXVxufSlcbmV4cG9ydCBjbGFzcyBDb250ZXh0TWVudUl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tbWVudS1pdGVtXCIpIG9wdGlvbkNsYXNzID0gdHJ1ZTtcblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5yb2xlXCIpIHJvbGUgPSBcIm1lbnVpdGVtXCI7XG5cdEBIb3N0QmluZGluZyhcImF0dHIudGFiaW5kZXhcIikgdGFiaW5kZXggPSAtMTtcblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5hcmlhLWhhc3BvcHVwXCIpIGFyaWFIYXNQb3B1cCA9IG51bGw7XG5cdEBIb3N0QmluZGluZyhcImF0dHIuYXJpYS1leHBhbmRlZFwiKSBhcmlhRXhwYW5kZWQgPSBudWxsO1xuXHRASG9zdEJpbmRpbmcoXCJhdHRyLmFyaWEtY2hlY2tlZFwiKSBnZXQgYXJpYUNoZWNrZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiID9cblx0XHRcdCh0aGlzLmNoZWNrZWQgPyB0cnVlIDogZmFsc2UpIDogbnVsbDtcblx0fVxuXHRASG9zdEJpbmRpbmcoXCJhdHRyLmFyaWEtZGlzYWJsZWRcIikgZ2V0IGFyaWFEaXNhYmxlZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5kaXNhYmxlZDtcblx0fVxuXHRASW5wdXQoKSBASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLW1lbnUtaXRlbS0tZGlzYWJsZWRcIikgZGlzYWJsZWQgPSBmYWxzZTtcblx0QElucHV0KCkgQEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1tZW51LWl0ZW0tLWRhbmdlclwiKSBkYW5nZXIgPSBmYWxzZTtcblx0QElucHV0KCkgbGFiZWwgPSBcIlwiO1xuXHRASW5wdXQoKSBpbmZvID0gXCJcIjtcblx0QElucHV0KCkgdHlwZTogbnVsbCB8IFwiY2hlY2tib3hcIiB8IFwicmFkaW9cIiA9IG51bGw7XG5cdEBJbnB1dCgpIGNoZWNrZWQgPSBmYWxzZTtcblx0QElucHV0KCkgaWNvbiA9IFwiXCI7XG5cdEBJbnB1dCgpIHZhbHVlID0gXCJcIjtcblx0QE91dHB1dCgpIGNoZWNrZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cdEBPdXRwdXQoKSBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEl0ZW1DbGlja0V2ZW50PigpO1xuXG5cdGhhc0NoaWxkcmVuID0gZmFsc2U7XG5cdHNlbGVjdGFibGUgPSBmYWxzZTtcblxuXHRAQ29udGVudENoaWxkKENvbnRleHRNZW51Q29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBjaGlsZENvbnRleHRNZW51OiBDb250ZXh0TWVudUNvbXBvbmVudDtcblx0cHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuXHRcdEBPcHRpb25hbCgpIHByb3RlY3RlZCBjb250ZXh0TWVudVNlbGVjdGlvblNlcnZpY2U6IENvbnRleHRNZW51U2VsZWN0aW9uU2VydmljZVxuXHQpIHt9XG5cblx0bmdPbkluaXQoKSB7XG5cdFx0c3dpdGNoICh0aGlzLnR5cGUpIHtcblx0XHRcdGNhc2UgXCJjaGVja2JveFwiOiB7XG5cdFx0XHRcdHRoaXMucm9sZSA9IFwibWVudWl0ZW1jaGVja2JveFwiO1xuXHRcdFx0XHR0aGlzLnNlbGVjdGFibGUgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJyYWRpb1wiOiB7XG5cdFx0XHRcdHRoaXMucm9sZSA9IFwibWVudWl0ZW1yYWRpb1wiO1xuXHRcdFx0XHR0aGlzLnNlbGVjdGFibGUgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0dGhpcy5yb2xlID0gXCJtZW51aXRlbVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLnR5cGUgJiYgdGhpcy5jb250ZXh0TWVudVNlbGVjdGlvblNlcnZpY2UgJiYgdGhpcy52YWx1ZSkge1xuXHRcdFx0Y29uc3QgeyBzZWxlY3Rpb25PYnNlcnZhYmxlIH0gPSB0aGlzLmNvbnRleHRNZW51U2VsZWN0aW9uU2VydmljZTtcblx0XHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHNlbGVjdGlvbk9ic2VydmFibGUuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcInJhZGlvXCIpIHtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZVNlbGVjdGlvbih2YWx1ZSA9PT0gdGhpcy52YWx1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImNoZWNrYm94XCIpIHtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZVNlbGVjdGlvbih2YWx1ZS5pbmNsdWRlcyh0aGlzLnZhbHVlKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWJzY3JpcHRpb24pO1xuXHRcdH1cblx0fVxuXG5cdG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcblx0XHRpZiAodGhpcy5jaGlsZENvbnRleHRNZW51KSB7XG5cdFx0XHR0aGlzLmhhc0NoaWxkcmVuID0gdHJ1ZTtcblx0XHRcdHRoaXMuYXJpYUhhc1BvcHVwID0gdHJ1ZTtcblx0XHRcdHRoaXMuYXJpYUV4cGFuZGVkID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcihcImtleWRvd24uZW50ZXJcIiwgW1wiJGV2ZW50XCJdKVxuXHRASG9zdExpc3RlbmVyKFwia2V5ZG93bi5zcGFjZVwiLCBbXCIkZXZlbnRcIl0pXG5cdEBIb3N0TGlzdGVuZXIoXCJjbGlja1wiLCBbXCIkZXZlbnRcIl0pXG5cdGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50ICYgS2V5Ym9hcmRFdmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGlmICh0aGlzLmhhc0NoaWxkcmVuKSB7XG5cdFx0XHR0aGlzLm9wZW5TdWJNZW51KCk7XG5cdFx0XHR0aGlzLmNoaWxkQ29udGV4dE1lbnUuZm9jdXNNZW51KCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMudHlwZSkge1xuXHRcdFx0dGhpcy5oYW5kbGVTZWxlY3Rpb24oIXRoaXMuY2hlY2tlZCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY29udGV4dE1lbnVTZWxlY3Rpb25TZXJ2aWNlKSB7XG5cdFx0XHRpZiAodGhpcy50eXBlID09PSBcInJhZGlvXCIpIHtcblx0XHRcdFx0dGhpcy5jb250ZXh0TWVudVNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0UmFkaW8odGhpcy52YWx1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuXHRcdFx0XHR0aGlzLmNvbnRleHRNZW51U2VsZWN0aW9uU2VydmljZS5zZWxlY3RDaGVja2JveCh0aGlzLnZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuZGlzYWJsZWQpIHtcblx0XHRcdHRoaXMuaXRlbUNsaWNrLmVtaXQoe1xuXHRcdFx0XHRldmVudCxcblx0XHRcdFx0bGFiZWw6IHRoaXMubGFiZWwsXG5cdFx0XHRcdGluZm86IHRoaXMuaW5mbyxcblx0XHRcdFx0dmFsdWU6IHRoaXMudmFsdWUsXG5cdFx0XHRcdHR5cGU6IHRoaXMudHlwZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0aGFuZGxlU2VsZWN0aW9uKHNlbGVjdGVkOiBib29sZWFuKSB7XG5cdFx0dGhpcy5jaGVja2VkID0gc2VsZWN0ZWQ7XG5cdFx0dGhpcy5jaGVja2VkQ2hhbmdlLmVtaXQodGhpcy5jaGVja2VkKTtcblx0fVxuXG5cdG9wZW5TdWJNZW51KCkge1xuXHRcdGlmICh0aGlzLmNoaWxkQ29udGV4dE1lbnUpIHtcblx0XHRcdHRoaXMuY2hpbGRDb250ZXh0TWVudS5vcGVuID0gdHJ1ZTtcblx0XHRcdHRoaXMuYXJpYUV4cGFuZGVkID0gdHJ1ZTtcblx0XHRcdGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdHRoaXMuY2hpbGRDb250ZXh0TWVudS5wb3NpdGlvbi5sZWZ0ID0gZGltZW5zaW9ucy5sZWZ0ICsgZGltZW5zaW9ucy53aWR0aDtcblx0XHRcdC8vIHN1YnRyYWN0IDRweCB0byBhY2NvdW50IGZvciBtYXJnaW5zXG5cdFx0XHR0aGlzLmNoaWxkQ29udGV4dE1lbnUucG9zaXRpb24udG9wID0gZGltZW5zaW9ucy50b3AgLSA0O1xuXHRcdH1cblx0fVxuXG5cdGNsb3NlU3ViTWVudSgpIHtcblx0XHRpZiAodGhpcy5jaGlsZENvbnRleHRNZW51KSB7XG5cdFx0XHR0aGlzLmNoaWxkQ29udGV4dE1lbnUub3BlbiA9IGZhbHNlO1xuXHRcdFx0dGhpcy5hcmlhRXhwYW5kZWQgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKFwibW91c2VvdmVyXCIpXG5cdGhhbmRsZU1vdXNlT3ZlcigpIHtcblx0XHR0aGlzLm9wZW5TdWJNZW51KCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKFwibW91c2VvdXRcIilcblx0aGFuZGxlTW91c2VPdXQoKSB7XG5cdFx0dGhpcy5jbG9zZVN1Yk1lbnUoKTtcblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoXCJmb2N1c1wiKVxuXHRoYW5kbGVGb2N1cygpIHtcblx0XHR0aGlzLnRhYmluZGV4ID0gMDtcblx0XHRpZiAodGhpcy5oYXNDaGlsZHJlbiAmJiB0aGlzLmFyaWFFeHBhbmRlZCkge1xuXHRcdFx0dGhpcy5jbG9zZVN1Yk1lbnUoKTtcblx0XHR9XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKFwiYmx1clwiKVxuXHRoYW5kbGVCbHVyKCkge1xuXHRcdHRoaXMudGFiaW5kZXggPSAtMTtcblx0fVxuXG5cdGZvY3VzSXRlbSgpIHtcblx0XHR0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuXHR9XG5cblx0bmdPbkRlc3Ryb3koKSB7XG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG5cdH1cbn1cbiJdfQ==