UNPKG

fundamental-ngx

Version:

SAP Fiori Fundamentals, implemented in Angular

539 lines 39.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ApplicationRef, ChangeDetectorRef, ComponentFactoryResolver, Directive, ElementRef, EventEmitter, HostListener, Injector, Input, Output, Renderer2 } from '@angular/core'; import { PopoverContainer } from './popover-container'; import Popper from 'popper.js'; /** * Directive which manages the popper and popover components of the library. * It can be attached to any element. To bind it to a body, use the following syntax. * ```html * <div [fdPopover]="template">Control Element</div> * <ng-template #template> * Popover Body * </ng-template> * ``` */ export class PopoverDirective { /** * @hidden * @param {?} elRef * @param {?} cdRef * @param {?} resolver * @param {?} injector * @param {?} appRef * @param {?} renderer */ constructor(elRef, cdRef, resolver, injector, appRef, renderer) { this.elRef = elRef; this.cdRef = cdRef; this.resolver = resolver; this.injector = injector; this.appRef = appRef; this.renderer = renderer; /** * Whether the popover is open. Can be used through two-way binding. */ this.isOpen = false; /** * The trigger events that will open/close the popover. * Accepts any [HTML DOM Events](https://www.w3schools.com/jsref/dom_obj_event.asp). */ this.triggers = ['click']; /** * Whether the popover should display the default arrow. */ this.defaultArrow = false; /** * Whether the popover should be focusTrapped. */ this.focusTrapped = false; /** * Whether the popover should close when the escape key is pressed. */ this.closeOnEscapeKey = true; /** * Whether the popover is disabled. */ this.disabled = false; /** * Whether the popover should close when a click is made outside its boundaries. */ this.closeOnOutsideClick = true; /** * The element to which the popover should be appended. */ this.appendTo = 'body'; /** * The Popper.js options to attach to this popover. * See the [Popper.js Documentation](https://popper.js.org/popper-documentation.html) for details. */ this.options = { placement: 'bottom-start', modifiers: { preventOverflow: { enabled: true, escapeWithReference: true, boundariesElement: 'scrollParent' } } }; /** * Whether the Popover Body should try to have the same width as the Popover Control. */ this.fillControl = false; /** * Event emitted when the state of the isOpen property changes. */ this.isOpenChange = new EventEmitter(); this.eventRef = []; this.isSetup = false; } /** * @hidden * @return {?} */ ngOnInit() { if (this.isOpen) { this.open(); } this.initFillControl(); this.initPlacement(); this.addTriggerListeners(); this.isSetup = true; } /** * @hidden * @return {?} */ ngOnDestroy() { if (this.popper) { this.popper.destroy(); } if (this.containerRef) { this.destroyContainer(); } this.destroyTriggerListeners(); } /** * @hidden * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (!this.isSetup) { return; } if (changes.triggers) { setTimeout((/** * @return {?} */ () => { this.destroyTriggerListeners(); this.addTriggerListeners(); })); } if (changes.isOpen) { if (changes.isOpen.currentValue) { setTimeout((/** * @return {?} */ () => { this.isOpen = false; this.open(false); })); } else { setTimeout((/** * @return {?} */ () => { this.isOpen = true; this.close(false); })); } } if (changes.placement) { setTimeout((/** * @return {?} */ () => { this.initPlacement(); })); } if (changes.fillControl) { setTimeout((/** * @return {?} */ () => { this.initFillControl(); })); } } /** * Toggles the popover open state. * @param {?=} fireEvent * @return {?} */ toggle(fireEvent = true) { if (this.isOpen) { this.close(fireEvent); } else { this.open(fireEvent); } } /** * Opens the popover. * @param {?=} fireEvent * @return {?} */ open(fireEvent = true) { if (!this.isOpen && !this.disabled) { this.createContainer(); this.isOpen = true; if (fireEvent) { this.isOpenChange.emit(this.isOpen); } } } /** * Closes the popover. * @param {?=} fireEvent * @return {?} */ close(fireEvent = true) { if (this.isOpen) { this.destroyContainer(); this.isOpen = false; if (fireEvent) { this.isOpenChange.emit(this.isOpen); } } } /** * Forces an update of the popover's positioning calculation. * @return {?} */ updatePopper() { if (this.popper) { this.popper.scheduleUpdate(); } } /** * @private * @return {?} */ createContainer() { if (this.containerRef) { return; } /** @type {?} */ const factory = this.resolver.resolveComponentFactory(PopoverContainer); this.containerRef = factory.create(this.injector); // Set instance properties this.containerRef.instance.context = this; this.containerRef.instance.content = this.content; this.containerRef.instance.focusTrapped = this.focusTrapped; this.containerRef.instance.defaultArrow = this.defaultArrow; this.containerRef.instance.closeOnEscapeKey = this.closeOnEscapeKey; if (!this.defaultArrow) { this.containerRef.location.nativeElement.style.margin = 0; } this.appRef.attachView(this.containerRef.hostView); /** @type {?} */ const setupRef = this.containerRef.instance.isSetup.subscribe((/** * @return {?} */ () => { this.createPopper(); setupRef.unsubscribe(); })); /** @type {?} */ const containerEl = (/** @type {?} */ (((/** @type {?} */ (this.containerRef.hostView))).rootNodes[0])); if (this.appendTo === 'body') { document.body.appendChild(containerEl); } else { this.appendTo.appendChild(containerEl); } } /** * @private * @return {?} */ destroyTriggerListeners() { if (this.eventRef && this.eventRef.length > 0) { this.eventRef.forEach((/** * @param {?} event * @return {?} */ event => { event(); })); this.eventRef = []; } } /** * @private * @return {?} */ addTriggerListeners() { if (this.triggers && this.triggers.length > 0) { this.triggers.forEach((/** * @param {?} trigger * @return {?} */ trigger => { this.eventRef.push(this.renderer.listen(this.elRef.nativeElement, trigger, (/** * @return {?} */ () => { this.toggle(); }))); })); } } /** * @private * @return {?} */ destroyContainer() { if (this.containerRef) { this.appRef.detachView(this.containerRef.hostView); this.containerRef.destroy(); this.containerRef = null; } if (this.popper) { this.popper.destroy(); this.popper = null; } } /** * @private * @return {?} */ createPopper() { this.popper = new Popper((/** @type {?} */ (this.elRef.nativeElement)), (/** @type {?} */ (this.containerRef.location.nativeElement)), this.options); } /** * @private * @param {?} data * @return {?} */ fillReference(data) { data.offsets.popper.left = data.offsets.reference.left; data.offsets.popper.right = data.offsets.reference.right; data.offsets.popper.width = data.styles.width = data.offsets.reference.width; return data; } /** * @private * @return {?} */ initPlacement() { if (this.placement) { if (this.options) { this.options.placement = this.placement; } else { this.options = { placement: this.placement }; } } } /** * @private * @return {?} */ initFillControl() { if (this.fillControl) { if (this.options && this.options.modifiers) { this.options.modifiers.fillReference = { enabled: true, fn: this.fillReference, order: 840 }; } else { this.options = { modifiers: { fillReference: { enabled: true, fn: this.fillReference, order: 840 } } }; } } } /** * @hidden * @param {?} event * @return {?} */ clickHandler(event) { if (this.containerRef && this.isOpen && this.closeOnOutsideClick && event.target !== this.elRef.nativeElement && !this.elRef.nativeElement.contains(event.target) && !this.containerRef.location.nativeElement.contains(event.target)) { event.preventDefault(); event.stopPropagation(); this.close(); } } } PopoverDirective.decorators = [ { type: Directive, args: [{ selector: '[fdPopover]' },] } ]; /** @nocollapse */ PopoverDirective.ctorParameters = () => [ { type: ElementRef }, { type: ChangeDetectorRef }, { type: ComponentFactoryResolver }, { type: Injector }, { type: ApplicationRef }, { type: Renderer2 } ]; PopoverDirective.propDecorators = { content: [{ type: Input, args: ['fdPopover',] }], isOpen: [{ type: Input }], triggers: [{ type: Input }], defaultArrow: [{ type: Input }], placement: [{ type: Input }], focusTrapped: [{ type: Input }], closeOnEscapeKey: [{ type: Input }], disabled: [{ type: Input }], closeOnOutsideClick: [{ type: Input }], appendTo: [{ type: Input }], options: [{ type: Input }], fillControl: [{ type: Input }], isOpenChange: [{ type: Output }], clickHandler: [{ type: HostListener, args: ['document:click', ['$event'],] }] }; if (false) { /** * Content of the popover. Used through the actual directive tag. Accepts strings or TemplateRefs. * @type {?} */ PopoverDirective.prototype.content; /** * Whether the popover is open. Can be used through two-way binding. * @type {?} */ PopoverDirective.prototype.isOpen; /** * The trigger events that will open/close the popover. * Accepts any [HTML DOM Events](https://www.w3schools.com/jsref/dom_obj_event.asp). * @type {?} */ PopoverDirective.prototype.triggers; /** * Whether the popover should display the default arrow. * @type {?} */ PopoverDirective.prototype.defaultArrow; /** * The placement of the popover. It can be one of: top, top-start, top-end, bottom, * bottom-start, bottom-end, right, right-start, right-end, left, left-start, left-end. * @type {?} */ PopoverDirective.prototype.placement; /** * Whether the popover should be focusTrapped. * @type {?} */ PopoverDirective.prototype.focusTrapped; /** * Whether the popover should close when the escape key is pressed. * @type {?} */ PopoverDirective.prototype.closeOnEscapeKey; /** * Whether the popover is disabled. * @type {?} */ PopoverDirective.prototype.disabled; /** * Whether the popover should close when a click is made outside its boundaries. * @type {?} */ PopoverDirective.prototype.closeOnOutsideClick; /** * The element to which the popover should be appended. * @type {?} */ PopoverDirective.prototype.appendTo; /** * The Popper.js options to attach to this popover. * See the [Popper.js Documentation](https://popper.js.org/popper-documentation.html) for details. * @type {?} */ PopoverDirective.prototype.options; /** * Whether the Popover Body should try to have the same width as the Popover Control. * @type {?} */ PopoverDirective.prototype.fillControl; /** * Event emitted when the state of the isOpen property changes. * @type {?} */ PopoverDirective.prototype.isOpenChange; /** * @type {?} * @private */ PopoverDirective.prototype.containerRef; /** * @type {?} * @private */ PopoverDirective.prototype.popper; /** * @type {?} * @private */ PopoverDirective.prototype.eventRef; /** * @type {?} * @private */ PopoverDirective.prototype.isSetup; /** * @type {?} * @private */ PopoverDirective.prototype.elRef; /** * @type {?} * @private */ PopoverDirective.prototype.cdRef; /** * @type {?} * @private */ PopoverDirective.prototype.resolver; /** * @type {?} * @private */ PopoverDirective.prototype.injector; /** * @type {?} * @private */ PopoverDirective.prototype.appRef; /** * @type {?} * @private */ PopoverDirective.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvcG9wb3Zlci9wb3BvdmVyLWRpcmVjdGl2ZS9wb3BvdmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBRXhCLFNBQVMsRUFDVCxVQUFVLEVBQW1CLFlBQVksRUFBRSxZQUFZLEVBQ3ZELFFBQVEsRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBRSxTQUFTLEVBRW5FLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sTUFBb0MsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0FBZTdELE1BQU0sT0FBTyxnQkFBZ0I7Ozs7Ozs7Ozs7SUF3RXpCLFlBQW9CLEtBQWlCLEVBQ2pCLEtBQXdCLEVBQ3hCLFFBQWtDLEVBQ2xDLFFBQWtCLEVBQ2xCLE1BQXNCLEVBQ3RCLFFBQW1CO1FBTG5CLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixhQUFRLEdBQVIsUUFBUSxDQUFXOzs7O1FBckV2QyxXQUFNLEdBQVksS0FBSyxDQUFDOzs7OztRQUt4QixhQUFRLEdBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7OztRQUkvQixpQkFBWSxHQUFZLEtBQUssQ0FBQzs7OztRQVM5QixpQkFBWSxHQUFZLEtBQUssQ0FBQzs7OztRQUk5QixxQkFBZ0IsR0FBWSxJQUFJLENBQUM7Ozs7UUFJakMsYUFBUSxHQUFZLEtBQUssQ0FBQzs7OztRQUkxQix3QkFBbUIsR0FBWSxJQUFJLENBQUM7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Qzs7Ozs7OztJQWxUMUMsbUNBQ21DOzs7OztJQUduQyxrQ0FDd0I7Ozs7OztJQUl4QixvQ0FDK0I7Ozs7O0lBRy9CLHdDQUM4Qjs7Ozs7O0lBSTlCLHFDQUNxQjs7Ozs7SUFHckIsd0NBQzhCOzs7OztJQUc5Qiw0Q0FDaUM7Ozs7O0lBR2pDLG9DQUMwQjs7Ozs7SUFHMUIsK0NBQ29DOzs7OztJQUdwQyxvQ0FDd0M7Ozs7OztJQUl4QyxtQ0FVRTs7Ozs7SUFHRix1Q0FDNkI7Ozs7O0lBRzdCLHdDQUNrRTs7Ozs7SUFFbEUsd0NBQXFEOzs7OztJQUNyRCxrQ0FBdUI7Ozs7O0lBQ3ZCLG9DQUFrQzs7Ozs7SUFDbEMsbUNBQWlDOzs7OztJQUdyQixpQ0FBeUI7Ozs7O0lBQ3pCLGlDQUFnQzs7Ozs7SUFDaEMsb0NBQTBDOzs7OztJQUMxQyxvQ0FBMEI7Ozs7O0lBQzFCLGtDQUE4Qjs7Ozs7SUFDOUIsb0NBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBcHBsaWNhdGlvblJlZixcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLCBFbWJlZGRlZFZpZXdSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdG9yLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyQ29udGFpbmVyIH0gZnJvbSAnLi9wb3BvdmVyLWNvbnRhaW5lcic7XG5pbXBvcnQgUG9wcGVyLCB7IFBsYWNlbWVudCwgUG9wcGVyT3B0aW9ucyB9IGZyb20gJ3BvcHBlci5qcyc7XG5cbi8qKlxuICogRGlyZWN0aXZlIHdoaWNoIG1hbmFnZXMgdGhlIHBvcHBlciBhbmQgcG9wb3ZlciBjb21wb25lbnRzIG9mIHRoZSBsaWJyYXJ5LlxuICogSXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFueSBlbGVtZW50LiBUbyBiaW5kIGl0IHRvIGEgYm9keSwgdXNlIHRoZSBmb2xsb3dpbmcgc3ludGF4LlxuICogYGBgaHRtbFxuICogPGRpdiBbZmRQb3BvdmVyXT1cInRlbXBsYXRlXCI+Q29udHJvbCBFbGVtZW50PC9kaXY+XG4gKiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlPlxuICogICAgIFBvcG92ZXIgQm9keVxuICogPC9uZy10ZW1wbGF0ZT5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tmZFBvcG92ZXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgICAvKiogQ29udGVudCBvZiB0aGUgcG9wb3Zlci4gVXNlZCB0aHJvdWdoIHRoZSBhY3R1YWwgZGlyZWN0aXZlIHRhZy4gQWNjZXB0cyBzdHJpbmdzIG9yIFRlbXBsYXRlUmVmcy4gKi9cbiAgICBASW5wdXQoJ2ZkUG9wb3ZlcicpXG4gICAgY29udGVudDogVGVtcGxhdGVSZWY8YW55PiB8IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIGlzIG9wZW4uIENhbiBiZSB1c2VkIHRocm91Z2ggdHdvLXdheSBiaW5kaW5nLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogVGhlIHRyaWdnZXIgZXZlbnRzIHRoYXQgd2lsbCBvcGVuL2Nsb3NlIHRoZSBwb3BvdmVyLlxuICAgICAqICBBY2NlcHRzIGFueSBbSFRNTCBET00gRXZlbnRzXShodHRwczovL3d3dy53M3NjaG9vbHMuY29tL2pzcmVmL2RvbV9vYmpfZXZlbnQuYXNwKS4gKi9cbiAgICBASW5wdXQoKVxuICAgIHRyaWdnZXJzOiBzdHJpbmdbXSA9IFsnY2xpY2snXTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBkaXNwbGF5IHRoZSBkZWZhdWx0IGFycm93LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGVmYXVsdEFycm93OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogVGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wb3Zlci4gSXQgY2FuIGJlIG9uZSBvZjogdG9wLCB0b3Atc3RhcnQsIHRvcC1lbmQsIGJvdHRvbSxcbiAgICAgKiAgYm90dG9tLXN0YXJ0LCBib3R0b20tZW5kLCByaWdodCwgcmlnaHQtc3RhcnQsIHJpZ2h0LWVuZCwgbGVmdCwgbGVmdC1zdGFydCwgbGVmdC1lbmQuICovXG4gICAgQElucHV0KClcbiAgICBwbGFjZW1lbnQ6IFBsYWNlbWVudDtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBiZSBmb2N1c1RyYXBwZWQuICovXG4gICAgQElucHV0KClcbiAgICBmb2N1c1RyYXBwZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBjbG9zZSB3aGVuIHRoZSBlc2NhcGUga2V5IGlzIHByZXNzZWQuICovXG4gICAgQElucHV0KClcbiAgICBjbG9zZU9uRXNjYXBlS2V5OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIGlzIGRpc2FibGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBjbG9zZSB3aGVuIGEgY2xpY2sgaXMgbWFkZSBvdXRzaWRlIGl0cyBib3VuZGFyaWVzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY2xvc2VPbk91dHNpZGVDbGljazogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogVGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHBvcG92ZXIgc2hvdWxkIGJlIGFwcGVuZGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXBwZW5kVG86IEhUTUxFbGVtZW50IHwgJ2JvZHknID0gJ2JvZHknO1xuXG4gICAgLyoqIFRoZSBQb3BwZXIuanMgb3B0aW9ucyB0byBhdHRhY2ggdG8gdGhpcyBwb3BvdmVyLlxuICAgICAqIFNlZSB0aGUgW1BvcHBlci5qcyBEb2N1bWVudGF0aW9uXShodHRwczovL3BvcHBlci5qcy5vcmcvcG9wcGVyLWRvY3VtZW50YXRpb24uaHRtbCkgZm9yIGRldGFpbHMuICovXG4gICAgQElucHV0KClcbiAgICBvcHRpb25zOiBQb3BwZXJPcHRpb25zID0ge1xuICAgICAgICBwbGFjZW1lbnQ6ICdib3R0b20tc3RhcnQnLFxuICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZXNjYXBlV2l0aFJlZmVyZW5jZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBib3VuZGFyaWVzRWxlbWVudDogJ3Njcm9sbFBhcmVudCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogV2hldGhlciB0aGUgUG9wb3ZlciBCb2R5IHNob3VsZCB0cnkgdG8gaGF2ZSB0aGUgc2FtZSB3aWR0aCBhcyB0aGUgUG9wb3ZlciBDb250cm9sLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZmlsbENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBpc09wZW4gcHJvcGVydHkgY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBpc09wZW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIHByaXZhdGUgY29udGFpbmVyUmVmOiBDb21wb25lbnRSZWY8UG9wb3ZlckNvbnRhaW5lcj47XG4gICAgcHJpdmF0ZSBwb3BwZXI6IFBvcHBlcjtcbiAgICBwcml2YXRlIGV2ZW50UmVmOiBGdW5jdGlvbltdID0gW107XG4gICAgcHJpdmF0ZSBpc1NldHVwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0RmlsbENvbnRyb2woKTtcbiAgICAgICAgdGhpcy5pbml0UGxhY2VtZW50KCk7XG5cbiAgICAgICAgdGhpcy5hZGRUcmlnZ2VyTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuaXNTZXR1cCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucG9wcGVyKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHBlci5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb250YWluZXJSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveUNvbnRhaW5lcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZXN0cm95VHJpZ2dlckxpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZXR1cCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMudHJpZ2dlcnMpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveVRyaWdnZXJMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRyaWdnZXJMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuaXNPcGVuKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5pc09wZW4uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbihmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQbGFjZW1lbnQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuZmlsbENvbnRyb2wpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEZpbGxDb250cm9sKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHBvcG92ZXIgb3BlbiBzdGF0ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKGZpcmVFdmVudDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKGZpcmVFdmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oZmlyZUV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBwb3BvdmVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKGZpcmVFdmVudDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbiAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDb250YWluZXIoKTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKGZpcmVFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQodGhpcy5pc09wZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBwb3BvdmVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZShmaXJlRXZlbnQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95Q29udGFpbmVyKCk7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoZmlyZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2UuZW1pdCh0aGlzLmlzT3Blbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgYW4gdXBkYXRlIG9mIHRoZSBwb3BvdmVyJ3MgcG9zaXRpb25pbmcgY2FsY3VsYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVBvcHBlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucG9wcGVyKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHBlci5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb250YWluZXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lclJlZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShQb3BvdmVyQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJSZWYgPSBmYWN0b3J5LmNyZWF0ZSh0aGlzLmluamVjdG9yKTtcblxuICAgICAgICAvLyBTZXQgaW5zdGFuY2UgcHJvcGVydGllc1xuICAgICAgICB0aGlzLmNvbnRhaW5lclJlZi5pbnN0YW5jZS5jb250ZXh0ID0gdGhpcztcbiAgICAgICAgdGhpcy5jb250YWluZXJSZWYuaW5zdGFuY2UuY29udGVudCA9IHRoaXMuY29udGVudDtcbiAgICAgICAgdGhpcy5jb250YWluZXJSZWYuaW5zdGFuY2UuZm9jdXNUcmFwcGVkID0gdGhpcy5mb2N1c1RyYXBwZWQ7XG4gICAgICAgIHRoaXMuY29udGFpbmVyUmVmLmluc3RhbmNlLmRlZmF1bHRBcnJvdyA9IHRoaXMuZGVmYXVsdEFycm93O1xuICAgICAgICB0aGlzLmNvbnRhaW5lclJlZi5pbnN0YW5jZS5jbG9zZU9uRXNjYXBlS2V5ID0gdGhpcy5jbG9zZU9uRXNjYXBlS2V5O1xuXG4gICAgICAgIGlmICghdGhpcy5kZWZhdWx0QXJyb3cpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWFyZ2luID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5jb250YWluZXJSZWYuaG9zdFZpZXcpO1xuICAgICAgICBjb25zdCBzZXR1cFJlZiA9IHRoaXMuY29udGFpbmVyUmVmLmluc3RhbmNlLmlzU2V0dXAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUG9wcGVyKCk7XG4gICAgICAgICAgICBzZXR1cFJlZi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjb250YWluZXJFbCA9ICh0aGlzLmNvbnRhaW5lclJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmFwcGVuZFRvID09PSAnYm9keScpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyRWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRUby5hcHBlbmRDaGlsZChjb250YWluZXJFbCk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVRyaWdnZXJMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmV2ZW50UmVmICYmIHRoaXMuZXZlbnRSZWYubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5ldmVudFJlZi5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBldmVudCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50UmVmID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRyaWdnZXJMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXJzICYmIHRoaXMudHJpZ2dlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2Vycy5mb3JFYWNoKHRyaWdnZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRSZWYucHVzaCh0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQsIHRyaWdnZXIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveUNvbnRhaW5lcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KHRoaXMuY29udGFpbmVyUmVmLmhvc3RWaWV3KTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVmID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBvcHBlcikge1xuICAgICAgICAgICAgdGhpcy5wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wb3BwZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3BwZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucG9wcGVyID0gbmV3IFBvcHBlcihcbiAgICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbGxSZWZlcmVuY2UoZGF0YSk6IGFueSB7XG4gICAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIubGVmdCA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UubGVmdDtcbiAgICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlci5yaWdodCA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UucmlnaHQ7XG4gICAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIud2lkdGggPSBkYXRhLnN0eWxlcy53aWR0aCA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2Uud2lkdGg7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFBsYWNlbWVudCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7cGxhY2VtZW50OiB0aGlzLnBsYWNlbWVudH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEZpbGxDb250cm9sKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWxsQ29udHJvbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1vZGlmaWVycy5maWxsUmVmZXJlbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBmbjogdGhpcy5maWxsUmVmZXJlbmNlLFxuICAgICAgICAgICAgICAgICAgICBvcmRlcjogODQwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFJlZmVyZW5jZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm46IHRoaXMuZmlsbFJlZmVyZW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcjogODQwXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gICAgY2xpY2tIYW5kbGVyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lclJlZiAmJlxuICAgICAgICAgICAgdGhpcy5pc09wZW4gJiZcbiAgICAgICAgICAgIHRoaXMuY2xvc2VPbk91dHNpZGVDbGljayAmJlxuICAgICAgICAgICAgZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQgJiZcbiAgICAgICAgICAgICF0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRoaXMuY29udGFpbmVyUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19