UNPKG

gentics-ui-core

Version:

This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.

139 lines 21.4 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef, Input, QueryList } from '@angular/core'; import { coerceToBoolean } from '../../common/coerce-to-boolean'; import { DropdownItem } from '../dropdown-list/dropdown-item.component'; import { SplitButtonPrimaryAction } from './split-button-primary-action.component'; import * as i0 from "@angular/core"; import * as i1 from "../button/button.component"; import * as i2 from "../dropdown-list/dropdown-list.component"; import * as i3 from "../dropdown-list/dropdown-content.component"; import * as i4 from "../../directives/autofocus/autofocus.directive"; import * as i5 from "@angular/common"; import * as i6 from "../dropdown-list/dropdown-trigger.directive"; import * as i7 from "../icon/icon.directive"; /** * A split button component. * * The main content of the button and the handler of the main click event is specified by * using a `<gtx-split-button-primary-action>` child element. * * Secondary actions can be defined using `<gtx-dropdown-item>` child elements and * their click handlers. If secondary actions are defined, a dropdown trigger * will be displayed to the right of the main content. * * All input properties of `<gtx-button>`, except for `icon` and `submit` are supported. * * This component depends on the `<gtx-overlay-host>` being present in the app. * * ```html * <gtx-split-button> * <gtx-split-button-primary-action (click)="save()">Save Document</gtx-split-button-primary-action> * <gtx-dropdown-item (click)="saveAndPublish()">Save and Publish</gtx-dropdown-item> * <gtx-dropdown-item (click)="saveAndEmail()">Save and Send via E-Mail</gtx-dropdown-item> * </gtx-split-button> * ``` */ export class SplitButton { constructor(changeDetector) { this.changeDetector = changeDetector; /** * Sets the input field to be auto-focused. Handled by `AutofocusDirective`. */ this.autofocus = false; /** * Specify the size of the button. Can be "small", "regular" or "large". */ this.size = 'regular'; /** * Type determines the style of the button. Can be "default", "secondary", * "success", "warning" or "alert". */ this.type = 'default'; this.isFlat = false; this.isDisabled = false; } /** * Setting the "flat" attribute gives the button a transparent background * and only depth on hover. */ get flat() { return this.isFlat; } set flat(value) { this.isFlat = coerceToBoolean(value); } /** * Controls whether the button is disabled. */ get disabled() { return this.isDisabled; } set disabled(value) { this.isDisabled = coerceToBoolean(value); } ngAfterViewInit() { this.queryListSub = this.secondaryActions.changes.subscribe(() => this.changeDetector.markForCheck()); this.secondaryActions.notifyOnChanges(); } ngOnDestroy() { if (this.queryListSub) { this.queryListSub.unsubscribe(); this.queryListSub = null; } } /** * If the user does not click the primary action content itself, but the button around it, * this method is used to trigger a click event on the primary action content. */ onPrimaryButtonClick(event) { if (this.primaryAction && this.isFromPrimaryButton(event)) { this.primaryAction.nativeElement.click(); } } /** * Returns true if the event was fired by the primary `gtx-button` element or one of its children, * but not by the `gtx-split-button-primary-action` or one of its children. */ isFromPrimaryButton(event) { if (event && event.srcElement && event.srcElement instanceof Node) { // We traverse the DOM tree upwards from the srcElement. // If we first find a gtx-split-button-primary-action, the click came from // inside the primary action content. // If we find a gtx-button first, the click didn't come from inside the primary action content. let currNode = event.srcElement; do { switch (currNode.nodeName) { case 'GTX-BUTTON': return true; case 'GTX-SPLIT-BUTTON-PRIMARY-ACTION': return false; default: break; } } while (currNode = currNode.parentNode); } return false; } } /** @nocollapse */ SplitButton.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: SplitButton, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ SplitButton.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: SplitButton, selector: "gtx-split-button", inputs: { autofocus: "autofocus", size: "size", type: "type", flat: "flat", disabled: "disabled" }, queries: [{ propertyName: "primaryAction", first: true, predicate: SplitButtonPrimaryAction, descendants: true, read: ElementRef, static: true }, { propertyName: "secondaryActions", predicate: DropdownItem }], ngImport: i0, template: "<div class=\"split-button-wrapper z-depth-1\">\n\n <gtx-button class=\"primary-button\"\n [autofocus]=\"autofocus\"\n [size]=\"size\"\n [type]=\"type\"\n [flat]=\"isFlat\"\n [disabled]=\"isDisabled\"\n [class.has-secondary-actions]=\"secondaryActions.length > 0\"\n (click)=\"onPrimaryButtonClick($event)\">\n <ng-content select=\"gtx-split-button-primary-action\"></ng-content>\n </gtx-button>\n\n <ng-container *ngIf=\"secondaryActions.length > 0\">\n\n <div class=\"spacer-line\"></div>\n\n <gtx-dropdown-list align=\"right\" belowTrigger=\"true\">\n <gtx-dropdown-trigger>\n <gtx-button class=\"more-trigger\"\n [size]=\"size\"\n [type]=\"type\"\n [flat]=\"isFlat\"\n [disabled]=\"isDisabled\">\n <icon>arrow_drop_down</icon>\n </gtx-button>\n </gtx-dropdown-trigger>\n <gtx-dropdown-content>\n <ng-content select=\"gtx-dropdown-item\"></ng-content>\n </gtx-dropdown-content>\n </gtx-dropdown-list>\n\n </ng-container>\n\n</div>\n", components: [{ type: i1.Button, selector: "gtx-button", inputs: ["autofocus", "size", "type", "flat", "icon", "disabled", "submit"] }, { type: i2.DropdownList, selector: "gtx-dropdown-list", inputs: ["align", "width", "belowTrigger", "sticky", "closeOnEscape", "disabled"], outputs: ["open", "close"] }, { type: i3.DropdownContent, selector: "gtx-dropdown-content" }], directives: [{ type: i4.AutofocusDirective, selector: "\n gtx-button[autofocus],\n gtx-checkbox[autofocus],\n gtx-date-time-picker[autofocus],\n gtx-file-picker[autofocus],\n gtx-input[autofocus],\n gtx-radio-button[autofocus],\n gtx-search-bar[autofocus],\n gtx-select[autofocus],\n gtx-textarea[autofocus]", inputs: ["autofocus"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.DropdownTriggerDirective, selector: "gtx-dropdown-trigger" }, { type: i7.Icon, selector: "icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: SplitButton, decorators: [{ type: Component, args: [{ selector: 'gtx-split-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"split-button-wrapper z-depth-1\">\n\n <gtx-button class=\"primary-button\"\n [autofocus]=\"autofocus\"\n [size]=\"size\"\n [type]=\"type\"\n [flat]=\"isFlat\"\n [disabled]=\"isDisabled\"\n [class.has-secondary-actions]=\"secondaryActions.length > 0\"\n (click)=\"onPrimaryButtonClick($event)\">\n <ng-content select=\"gtx-split-button-primary-action\"></ng-content>\n </gtx-button>\n\n <ng-container *ngIf=\"secondaryActions.length > 0\">\n\n <div class=\"spacer-line\"></div>\n\n <gtx-dropdown-list align=\"right\" belowTrigger=\"true\">\n <gtx-dropdown-trigger>\n <gtx-button class=\"more-trigger\"\n [size]=\"size\"\n [type]=\"type\"\n [flat]=\"isFlat\"\n [disabled]=\"isDisabled\">\n <icon>arrow_drop_down</icon>\n </gtx-button>\n </gtx-dropdown-trigger>\n <gtx-dropdown-content>\n <ng-content select=\"gtx-dropdown-item\"></ng-content>\n </gtx-dropdown-content>\n </gtx-dropdown-list>\n\n </ng-container>\n\n</div>\n" }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { autofocus: [{ type: Input }], size: [{ type: Input }], type: [{ type: Input }], flat: [{ type: Input }], disabled: [{ type: Input }], primaryAction: [{ type: ContentChild, args: [SplitButtonPrimaryAction, { read: ElementRef, static: true }] }], secondaryActions: [{ type: ContentChildren, args: [DropdownItem] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NwbGl0LWJ1dHRvbi9zcGxpdC1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc3BsaXQtYnV0dG9uL3NwbGl0LWJ1dHRvbi50cGwuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsS0FBSyxFQUVMLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHlDQUF5QyxDQUFDOzs7Ozs7Ozs7QUFFakY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQU1ILE1BQU0sT0FBTyxXQUFXO0lBb0RwQixZQUFvQixjQUFpQztRQUFqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFsRHJEOztXQUVHO1FBQ00sY0FBUyxHQUFZLEtBQUssQ0FBQztRQUVwQzs7V0FFRztRQUNNLFNBQUksR0FBa0MsU0FBUyxDQUFDO1FBRXpEOzs7V0FHRztRQUNNLFNBQUksR0FBOEQsU0FBUyxDQUFDO1FBK0JyRixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsZUFBVSxHQUFHLEtBQUssQ0FBQztJQUlxQyxDQUFDO0lBbEN6RDs7O09BR0c7SUFDSCxJQUNJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLEtBQWM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFjO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFlRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDdkQsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FDM0MsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzVCO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILG9CQUFvQixDQUFDLEtBQVk7UUFDN0IsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUM1QztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxtQkFBbUIsQ0FBQyxLQUFZO1FBQ3BDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsWUFBWSxJQUFJLEVBQUU7WUFDL0Qsd0RBQXdEO1lBQ3hELDBFQUEwRTtZQUMxRSxxQ0FBcUM7WUFDckMsK0ZBQStGO1lBQy9GLElBQUksUUFBUSxHQUFTLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDdEMsR0FBRztnQkFDQyxRQUFRLFFBQVEsQ0FBQyxRQUFRLEVBQUU7b0JBQ3ZCLEtBQUssWUFBWTt3QkFDYixPQUFPLElBQUksQ0FBQztvQkFDaEIsS0FBSyxpQ0FBaUM7d0JBQ2xDLE9BQU8sS0FBSyxDQUFDO29CQUNqQjt3QkFDSSxNQUFNO2lCQUNiO2FBQ0osUUFBUSxRQUFRLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRTtTQUM1QztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7OzJIQXJHUSxXQUFXOytHQUFYLFdBQVcsdU1BeUNOLHdCQUF3QiwyQkFBVSxVQUFVLGlFQUd6QyxZQUFZLDZCQ3pGakMscXVDQW1DQTsyRkRVYSxXQUFXO2tCQUx2QixTQUFTOytCQUNJLGtCQUFrQixtQkFFWCx1QkFBdUIsQ0FBQyxNQUFNO3dHQU90QyxTQUFTO3NCQUFqQixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFNRyxJQUFJO3NCQUFaLEtBQUs7Z0JBT0YsSUFBSTtzQkFEUCxLQUFLO2dCQVlGLFFBQVE7c0JBRFgsS0FBSztnQkFTTixhQUFhO3NCQURaLFlBQVk7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTFFLGdCQUFnQjtzQkFEZixlQUFlO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRWxlbWVudFJlZixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge2NvZXJjZVRvQm9vbGVhbn0gZnJvbSAnLi4vLi4vY29tbW9uL2NvZXJjZS10by1ib29sZWFuJztcbmltcG9ydCB7RHJvcGRvd25JdGVtfSBmcm9tICcuLi9kcm9wZG93bi1saXN0L2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7U3BsaXRCdXR0b25QcmltYXJ5QWN0aW9ufSBmcm9tICcuL3NwbGl0LWJ1dHRvbi1wcmltYXJ5LWFjdGlvbi5jb21wb25lbnQnO1xuXG4vKipcbiAqIEEgc3BsaXQgYnV0dG9uIGNvbXBvbmVudC5cbiAqXG4gKiBUaGUgbWFpbiBjb250ZW50IG9mIHRoZSBidXR0b24gYW5kIHRoZSBoYW5kbGVyIG9mIHRoZSBtYWluIGNsaWNrIGV2ZW50IGlzIHNwZWNpZmllZCBieVxuICogdXNpbmcgYSBgPGd0eC1zcGxpdC1idXR0b24tcHJpbWFyeS1hY3Rpb24+YCBjaGlsZCBlbGVtZW50LlxuICpcbiAqIFNlY29uZGFyeSBhY3Rpb25zIGNhbiBiZSBkZWZpbmVkIHVzaW5nIGA8Z3R4LWRyb3Bkb3duLWl0ZW0+YCBjaGlsZCBlbGVtZW50cyBhbmRcbiAqIHRoZWlyIGNsaWNrIGhhbmRsZXJzLiBJZiBzZWNvbmRhcnkgYWN0aW9ucyBhcmUgZGVmaW5lZCwgYSBkcm9wZG93biB0cmlnZ2VyXG4gKiB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gY29udGVudC5cbiAqXG4gKiBBbGwgaW5wdXQgcHJvcGVydGllcyBvZiBgPGd0eC1idXR0b24+YCwgZXhjZXB0IGZvciBgaWNvbmAgYW5kIGBzdWJtaXRgIGFyZSBzdXBwb3J0ZWQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgZGVwZW5kcyBvbiB0aGUgYDxndHgtb3ZlcmxheS1ob3N0PmAgYmVpbmcgcHJlc2VudCBpbiB0aGUgYXBwLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxndHgtc3BsaXQtYnV0dG9uPlxuICogICAgIDxndHgtc3BsaXQtYnV0dG9uLXByaW1hcnktYWN0aW9uIChjbGljayk9XCJzYXZlKClcIj5TYXZlIERvY3VtZW50PC9ndHgtc3BsaXQtYnV0dG9uLXByaW1hcnktYWN0aW9uPlxuICogICAgIDxndHgtZHJvcGRvd24taXRlbSAoY2xpY2spPVwic2F2ZUFuZFB1Ymxpc2goKVwiPlNhdmUgYW5kIFB1Ymxpc2g8L2d0eC1kcm9wZG93bi1pdGVtPlxuICogICAgIDxndHgtZHJvcGRvd24taXRlbSAoY2xpY2spPVwic2F2ZUFuZEVtYWlsKClcIj5TYXZlIGFuZCBTZW5kIHZpYSBFLU1haWw8L2d0eC1kcm9wZG93bi1pdGVtPlxuICogPC9ndHgtc3BsaXQtYnV0dG9uPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ3R4LXNwbGl0LWJ1dHRvbicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NwbGl0LWJ1dHRvbi50cGwuaHRtbCcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU3BsaXRCdXR0b24gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaW5wdXQgZmllbGQgdG8gYmUgYXV0by1mb2N1c2VkLiBIYW5kbGVkIGJ5IGBBdXRvZm9jdXNEaXJlY3RpdmVgLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGF1dG9mb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgYnV0dG9uLiBDYW4gYmUgXCJzbWFsbFwiLCBcInJlZ3VsYXJcIiBvciBcImxhcmdlXCIuXG4gICAgICovXG4gICAgQElucHV0KCkgc2l6ZTogJ3NtYWxsJyB8ICdyZWd1bGFyJyB8ICdsYXJnZScgPSAncmVndWxhcic7XG5cbiAgICAvKipcbiAgICAgKiBUeXBlIGRldGVybWluZXMgdGhlIHN0eWxlIG9mIHRoZSBidXR0b24uIENhbiBiZSBcImRlZmF1bHRcIiwgXCJzZWNvbmRhcnlcIixcbiAgICAgKiBcInN1Y2Nlc3NcIiwgXCJ3YXJuaW5nXCIgb3IgXCJhbGVydFwiLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHR5cGU6ICdkZWZhdWx0JyB8ICdzZWNvbmRhcnknIHwgJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgJ2FsZXJ0JyA9ICdkZWZhdWx0JztcblxuICAgIC8qKlxuICAgICAqIFNldHRpbmcgdGhlIFwiZmxhdFwiIGF0dHJpYnV0ZSBnaXZlcyB0aGUgYnV0dG9uIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZFxuICAgICAqIGFuZCBvbmx5IGRlcHRoIG9uIGhvdmVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGZsYXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRmxhdDtcbiAgICB9XG4gICAgc2V0IGZsYXQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5pc0ZsYXQgPSBjb2VyY2VUb0Jvb2xlYW4odmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXNhYmxlZDtcbiAgICB9XG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGNvZXJjZVRvQm9vbGVhbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgQENvbnRlbnRDaGlsZChTcGxpdEJ1dHRvblByaW1hcnlBY3Rpb24sIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpbWFyeUFjdGlvbjogRWxlbWVudFJlZjtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oRHJvcGRvd25JdGVtKVxuICAgIHNlY29uZGFyeUFjdGlvbnM6IFF1ZXJ5TGlzdDxEcm9wZG93bkl0ZW0+O1xuXG4gICAgaXNGbGF0ID0gZmFsc2U7XG4gICAgaXNEaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBxdWVyeUxpc3RTdWI6IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnF1ZXJ5TGlzdFN1YiA9IHRoaXMuc2Vjb25kYXJ5QWN0aW9ucy5jaGFuZ2VzLnN1YnNjcmliZShcbiAgICAgICAgICAgICgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZWNvbmRhcnlBY3Rpb25zLm5vdGlmeU9uQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5xdWVyeUxpc3RTdWIpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlMaXN0U3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5TGlzdFN1YiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgdXNlciBkb2VzIG5vdCBjbGljayB0aGUgcHJpbWFyeSBhY3Rpb24gY29udGVudCBpdHNlbGYsIGJ1dCB0aGUgYnV0dG9uIGFyb3VuZCBpdCxcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIHRyaWdnZXIgYSBjbGljayBldmVudCBvbiB0aGUgcHJpbWFyeSBhY3Rpb24gY29udGVudC5cbiAgICAgKi9cbiAgICBvblByaW1hcnlCdXR0b25DbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucHJpbWFyeUFjdGlvbiAmJiB0aGlzLmlzRnJvbVByaW1hcnlCdXR0b24oZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnByaW1hcnlBY3Rpb24ubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCB3YXMgZmlyZWQgYnkgdGhlIHByaW1hcnkgYGd0eC1idXR0b25gIGVsZW1lbnQgb3Igb25lIG9mIGl0cyBjaGlsZHJlbixcbiAgICAgKiBidXQgbm90IGJ5IHRoZSBgZ3R4LXNwbGl0LWJ1dHRvbi1wcmltYXJ5LWFjdGlvbmAgb3Igb25lIG9mIGl0cyBjaGlsZHJlbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzRnJvbVByaW1hcnlCdXR0b24oZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5zcmNFbGVtZW50ICYmIGV2ZW50LnNyY0VsZW1lbnQgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgICAgICAvLyBXZSB0cmF2ZXJzZSB0aGUgRE9NIHRyZWUgdXB3YXJkcyBmcm9tIHRoZSBzcmNFbGVtZW50LlxuICAgICAgICAgICAgLy8gSWYgd2UgZmlyc3QgZmluZCBhIGd0eC1zcGxpdC1idXR0b24tcHJpbWFyeS1hY3Rpb24sIHRoZSBjbGljayBjYW1lIGZyb21cbiAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgcHJpbWFyeSBhY3Rpb24gY29udGVudC5cbiAgICAgICAgICAgIC8vIElmIHdlIGZpbmQgYSBndHgtYnV0dG9uIGZpcnN0LCB0aGUgY2xpY2sgZGlkbid0IGNvbWUgZnJvbSBpbnNpZGUgdGhlIHByaW1hcnkgYWN0aW9uIGNvbnRlbnQuXG4gICAgICAgICAgICBsZXQgY3Vyck5vZGU6IE5vZGUgPSBldmVudC5zcmNFbGVtZW50O1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoY3Vyck5vZGUubm9kZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnR1RYLUJVVFRPTic6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnR1RYLVNQTElULUJVVFRPTi1QUklNQVJZLUFDVElPTic6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChjdXJyTm9kZSA9IGN1cnJOb2RlLnBhcmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJzcGxpdC1idXR0b24td3JhcHBlciB6LWRlcHRoLTFcIj5cblxuICAgIDxndHgtYnV0dG9uIGNsYXNzPVwicHJpbWFyeS1idXR0b25cIlxuICAgICAgICAgICAgW2F1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxuICAgICAgICAgICAgW3NpemVdPVwic2l6ZVwiXG4gICAgICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgICAgIFtmbGF0XT1cImlzRmxhdFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICBbY2xhc3MuaGFzLXNlY29uZGFyeS1hY3Rpb25zXT1cInNlY29uZGFyeUFjdGlvbnMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25QcmltYXJ5QnV0dG9uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJndHgtc3BsaXQtYnV0dG9uLXByaW1hcnktYWN0aW9uXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZ3R4LWJ1dHRvbj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWNvbmRhcnlBY3Rpb25zLmxlbmd0aCA+IDBcIj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2VyLWxpbmVcIj48L2Rpdj5cblxuICAgICAgICA8Z3R4LWRyb3Bkb3duLWxpc3QgYWxpZ249XCJyaWdodFwiIGJlbG93VHJpZ2dlcj1cInRydWVcIj5cbiAgICAgICAgICAgIDxndHgtZHJvcGRvd24tdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICA8Z3R4LWJ1dHRvbiBjbGFzcz1cIm1vcmUtdHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCJzaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cInR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZsYXRdPVwiaXNGbGF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpY29uPmFycm93X2Ryb3BfZG93bjwvaWNvbj5cbiAgICAgICAgICAgICAgICA8L2d0eC1idXR0b24+XG4gICAgICAgICAgICA8L2d0eC1kcm9wZG93bi10cmlnZ2VyPlxuICAgICAgICAgICAgPGd0eC1kcm9wZG93bi1jb250ZW50PlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImd0eC1kcm9wZG93bi1pdGVtXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPC9ndHgtZHJvcGRvd24tY29udGVudD5cbiAgICAgICAgPC9ndHgtZHJvcGRvd24tbGlzdD5cblxuICAgIDwvbmctY29udGFpbmVyPlxuXG48L2Rpdj5cbiJdfQ==