UNPKG

@junte/ui

Version:

Quality Angular UI components kit

364 lines 57.5 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, Renderer2, TemplateRef, ViewChild } from '@angular/core'; import { Behaviour } from '../../core/enums/behaviour'; import { Breakpoint } from '../../core/enums/breakpoint'; import { Feature } from '../../core/enums/feature'; import { Gutter } from '../../core/enums/gutter'; import { Placement } from '../../core/enums/placement'; import { Position } from '../../core/enums/position'; import { Triggers } from '../../core/enums/triggers'; import { BreakpointService } from '../../layout/responsive/breakpoint.service'; import { DeviceService } from '../../layout/responsive/device.service'; const PADDING_SIZE = 8; const DROPDOWN_PADDING_SIZE = 4; export class PopoverOptions { constructor(defs = null) { this.trigger = Triggers.hover; this.position = Position.bottom; this.placement = Placement.absolute; this.maxHeight = '500px'; this.padding = Gutter.normal; this.features = [Feature.smarty]; this.disabled = false; Object.assign(this, defs); } } class PopoverPosition { constructor(top, left, shiftX = 0, shiftY = 0) { this.top = top; this.left = left; this.shiftX = shiftX; this.shiftY = shiftY; } } let PopoverComponent = class PopoverComponent { constructor(renderer, hostRef, cd, breakpoint, device) { this.renderer = renderer; this.hostRef = hostRef; this.cd = cd; this.breakpoint = breakpoint; this.device = device; this.observers = { target: this.createObserver(), host: this.createObserver() }; this.options = new PopoverOptions(); this.host = 'jnt-popover-host'; } get placement() { return this.options.placement; } get context() { return this.options.context; } createObserver() { return new MutationObserver(() => this.update()); } getMaxSizes() { var _a, _b; const rect = this.target.getBoundingClientRect(); const maxWidth = +((_a = this.options.maxWidth) === null || _a === void 0 ? void 0 : _a.replace('px', '')); const maxHeight = +((_b = this.options.maxHeight) === null || _b === void 0 ? void 0 : _b.replace('px', '')); const padding = this.options.behaviour === Behaviour.dropdown ? DROPDOWN_PADDING_SIZE : PADDING_SIZE; let fullMaxWidth = null; let fullMaxHeight = null; switch (this.position) { case Position.top: { fullMaxHeight = rect.top - padding; if (this.options.behaviour === Behaviour.dropdown) { fullMaxWidth = window.innerWidth - rect.left - padding; } break; } case Position.right: { fullMaxWidth = window.innerWidth - rect.left - padding - rect.width; if (this.options.behaviour === Behaviour.dropdown) { fullMaxHeight = window.innerHeight - rect.top - padding; } break; } case Position.bottom: { fullMaxHeight = window.innerHeight - rect.top - padding - rect.height; if (this.options.behaviour === Behaviour.dropdown) { fullMaxWidth = window.innerWidth - rect.left - padding; } break; } case Position.rightBottom: { fullMaxHeight = window.innerHeight - rect.top - padding - rect.height; if (this.options.behaviour === Behaviour.dropdown) { fullMaxWidth = rect.right - padding; } break; } case Position.left: { fullMaxWidth = rect.left - padding; if (this.options.behaviour === Behaviour.dropdown) { fullMaxHeight = window.innerHeight - rect.top - padding; } break; } } if (!!fullMaxWidth) { this.options.maxWidth = `${!!maxWidth ? Math.min(maxWidth, fullMaxWidth) : fullMaxWidth}px`; } if (!!fullMaxHeight) { this.options.maxHeight = `${!!maxHeight ? Math.min(maxHeight, fullMaxHeight) : fullMaxHeight}px`; } } checkPosition(position) { const rect = this.target.getBoundingClientRect(); const { nativeElement: host } = this.hostRef; const offsetLeft = this.options.placement === Placement.absolute ? window.pageXOffset || document.documentElement.offsetLeft : 0; const offsetTop = this.options.placement === Placement.absolute ? window.pageYOffset || document.documentElement.offsetTop : 0; const padding = this.options.behaviour === Behaviour.dropdown ? DROPDOWN_PADDING_SIZE : PADDING_SIZE; switch (this.position) { case Position.top: { const shift = offsetTop - padding + host.clientHeight; if (position.top - shift < 0) { if (rect.top + padding + host.clientHeight < window.innerHeight) { this.position = Position.bottom; } else if (rect.right + padding + host.clientWidth < window.innerWidth) { this.position = Position.right; } else if (rect.left - padding - host.clientWidth > 0) { this.position = Position.left; } else { this.getMaxSizes(); } } break; } case Position.right: { const shift = offsetLeft - padding - this.target.clientWidth - host.clientWidth; if (position.left - shift > window.innerWidth) { if (rect.left - padding - host.clientWidth > 0) { this.position = Position.left; } else if (rect.top + padding + host.clientHeight < window.innerHeight) { this.position = Position.bottom; } else if (rect.top - padding - host.clientHeight > 0) { this.position = Position.top; } else { this.getMaxSizes(); } } break; } case Position.bottom: case Position.rightBottom: { const shift = offsetTop + padding - this.target.clientHeight - host.clientHeight; if (position.top - shift > window.innerHeight) { if (rect.top - padding - host.clientHeight > 0) { this.position = Position.top; } else if (rect.right + padding + host.clientWidth < window.innerWidth) { this.position = Position.right; } else if (rect.left - padding - host.clientWidth > 0) { this.position = Position.left; } else { this.getMaxSizes(); } } break; } case Position.left: { const shift = offsetLeft - padding + host.clientWidth; if (position.left - shift < 0) { if (rect.right + padding + host.clientWidth < window.innerWidth) { this.position = Position.right; } else if (rect.top + padding + host.clientHeight < window.innerHeight) { this.position = Position.bottom; } else if (rect.top - padding - host.clientHeight > 0) { this.position = Position.top; } else { this.getMaxSizes(); } } break; } } } getPosition() { var _a; const rect = this.target.getBoundingClientRect(); const offsetLeft = this.options.placement === Placement.absolute ? window.pageXOffset || document.documentElement.offsetLeft : 0; const offsetTop = this.options.placement === Placement.absolute ? window.pageYOffset || document.documentElement.offsetTop : 0; const position = new PopoverPosition(rect.top + offsetTop, rect.left + offsetLeft); const { nativeElement: host } = this.hostRef; this.position = this.options.position; if ((_a = this.options.features) === null || _a === void 0 ? void 0 : _a.includes(Feature.smarty)) { this.checkPosition(position); } else { this.getMaxSizes(); } this.renderer.setAttribute(host, 'data-placement', this.position); this.cd.detectChanges(); switch (this.position) { case Position.top: { position.top -= host.clientHeight; position.left += (this.target.clientWidth - host.clientWidth) / 2; position.shiftX = position.left < 0 ? position.left : (position.left > (window.innerWidth + offsetLeft) - host.clientWidth ? host.clientWidth - ((window.innerWidth + offsetLeft) - position.left) : 0); break; } case Position.right: { position.top += (this.target.clientHeight - host.clientHeight) / 2; position.left += this.target.clientWidth; position.shiftY = (position.top - offsetTop) < 0 ? position.top - offsetTop : (position.top > (window.innerHeight + offsetTop) - host.clientHeight ? host.clientHeight - ((window.innerHeight + offsetTop) - position.top) : 0); break; } case Position.bottom: case Position.rightBottom: { position.top += this.target.clientHeight; position.left += (this.target.clientWidth - host.clientWidth) / 2; position.shiftX = position.left < 0 ? position.left : (position.left > (window.innerWidth + offsetLeft) - host.clientWidth ? host.clientWidth - ((window.innerWidth + offsetLeft) - position.left) : 0); break; } case Position.left: { position.top += (this.target.clientHeight - host.clientHeight) / 2; position.left -= host.clientWidth; position.shiftY = (position.top - offsetTop) < 0 ? position.top - offsetTop : (position.top > (window.innerHeight + offsetTop) - host.clientHeight ? host.clientHeight - ((window.innerHeight + offsetTop) - position.top) : 0); break; } } return position; } // TODO: options to type with optionals?. show({ nativeElement: target }, options = {}) { this.target = target; this.options = new PopoverOptions(options); this.minWidth = this.options.minWidth || (this.options.behaviour === Behaviour.dropdown ? this.target.clientWidth + 'px' : null); // TODO: think to be better this.observers.target.observe(target, { childList: true, subtree: true }); this.observers.host.observe(this.hostRef.nativeElement, { childList: true, subtree: true }); this.renderer.setAttribute(this.hostRef.nativeElement, 'data-dropdown', this.options.behaviour === Behaviour.dropdown ? 'true' : 'false'); this.renderer.setStyle(this.hostRef.nativeElement, 'display', 'block'); this.cd.detectChanges(); } picked(elements) { return elements.indexOf(this.hostRef.nativeElement) !== -1; } update() { if (!this.target) { console.error('target is not defined'); return; } const { nativeElement: host } = this.hostRef; this.renderer.removeStyle(this.arrow.nativeElement, 'top'); this.renderer.removeStyle(this.arrow.nativeElement, 'left'); this.renderer.removeStyle(host, 'top'); this.renderer.removeStyle(host, 'left'); this.renderer.setStyle(host, 'width', this.breakpoint.current === Breakpoint.mobile && (this.position === Position.top || this.position === Position.bottom) ? '100%' : 'auto'); const position = this.getPosition(); const rect = this.target.getBoundingClientRect(); let left = position.left - position.shiftX; let top = position.top - position.shiftY; if (this.options.behaviour === Behaviour.dropdown) { this.getMaxSizes(); if (this.position === Position.top || this.position === Position.bottom) { left = rect.left + (this.placement === Placement.absolute ? window.pageXOffset : 0); } else if (this.position === Position.rightTop || this.position === Position.rightBottom) { this.renderer.setStyle(host, 'width', this.breakpoint.current === Breakpoint.mobile ? this.options.maxWidth : 'auto'); left = rect.left - host.clientWidth + rect.width + (this.placement === Placement.absolute ? window.pageXOffset : 0); } else { top = rect.top + (this.placement === Placement.absolute ? window.pageYOffset : 0); } } this.renderer.setStyle(host, 'top', `${top}px`); this.renderer.setStyle(host, 'left', `${left}px`); if (this.options.behaviour !== Behaviour.dropdown) { switch (this.position) { case Position.top: case Position.bottom: case Position.rightBottom: { this.renderer.setStyle(this.arrow.nativeElement, 'left', `calc(50% + ${position.shiftX}px)`); break; } case Position.right: case Position.left: { this.renderer.setStyle(this.arrow.nativeElement, 'top', `calc(50% + ${position.shiftY}px`); break; } } } this.cd.detectChanges(); } hide() { this.observers.target.disconnect(); this.observers.host.disconnect(); this.options = new PopoverOptions(); this.renderer.setStyle(this.hostRef.nativeElement, 'display', 'none'); this.cd.detectChanges(); } }; PopoverComponent.ctorParameters = () => [ { type: Renderer2 }, { type: ElementRef }, { type: ChangeDetectorRef }, { type: BreakpointService }, { type: DeviceService } ]; __decorate([ HostBinding('attr.host'), __metadata("design:type", Object) ], PopoverComponent.prototype, "host", void 0); __decorate([ HostBinding('style.position'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], PopoverComponent.prototype, "placement", null); __decorate([ HostBinding('attr.context'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], PopoverComponent.prototype, "context", null); __decorate([ HostBinding('attr.data-placement'), __metadata("design:type", Object) ], PopoverComponent.prototype, "position", void 0); __decorate([ HostBinding('style.min-width'), __metadata("design:type", String) ], PopoverComponent.prototype, "minWidth", void 0); __decorate([ ViewChild('arrow'), __metadata("design:type", ElementRef) ], PopoverComponent.prototype, "arrow", void 0); PopoverComponent = __decorate([ Component({ selector: 'jnt-popover', template: "<ng-template #defaultContentTemplate>\n <div child-of=\"jnt-popover-host\" data-content>\n {{options.content}}\n </div>\n</ng-template>\n\n<svg child-of=\"jnt-popover-host\" #arrow data-arrow width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\">\n <g child-of=\"jnt-popover-host\" clip-path=\"url(#popover_marker_clip)\">\n <g child-of=\"jnt-popover-host\" data-inner>\n <path child-of=\"jnt-popover-host\" d=\"M4 14C8.41827 14 11 22 13 22C15 22 17.5817 14 22 14L4 14Z\"></path>\n </g>\n <rect child-of=\"jnt-popover-host\" y=\"6\" width=\"26\" height=\"8\"></rect>\n </g>\n <defs child-of=\"jnt-popover-host\" >\n <filter child-of=\"jnt-popover-host\" id=\"popover_marker_shadow-light\" x=\"-4\" y=\"6\" width=\"34\" height=\"24\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood child-of=\"jnt-popover-host\" flood-opacity=\"0\" result=\"BackgroundImageFix\"></feFlood>\n <feColorMatrix child-of=\"jnt-popover-host\" in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"></feColorMatrix>\n <feGaussianBlur child-of=\"jnt-popover-host\" stdDeviation=\"4\"></feGaussianBlur>\n <feColorMatrix child-of=\"jnt-popover-host\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0\"></feColorMatrix>\n <feBlend child-of=\"jnt-popover-host\" mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow\"></feBlend>\n <feBlend child-of=\"jnt-popover-host\" mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow\" result=\"shape\"></feBlend>\n </filter>\n <filter child-of=\"jnt-popover-host\" id=\"popover_marker_shadow-dark\" x=\"-4\" y=\"6\" width=\"34\" height=\"24\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood child-of=\"jnt-popover-host\" flood-opacity=\"0\" result=\"BackgroundImageFix\"></feFlood>\n <feColorMatrix child-of=\"jnt-popover-host\" in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"></feColorMatrix>\n <feGaussianBlur child-of=\"jnt-popover-host\" stdDeviation=\"4\"></feGaussianBlur>\n <feColorMatrix child-of=\"jnt-popover-host\" type=\"matrix\" values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.25 0\"></feColorMatrix>\n <feBlend child-of=\"jnt-popover-host\" mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow\"></feBlend>\n <feBlend child-of=\"jnt-popover-host\" mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow\" result=\"shape\"></feBlend>\n </filter>\n <clipPath child-of=\"jnt-popover-host\" id=\"popover_marker_clip\">\n <rect child-of=\"jnt-popover-host\" width=\"26\" height=\"26\"></rect>\n </clipPath>\n </defs>\n</svg>\n\n<div child-of=\"jnt-popover-host\" data-wrapper role=\"popover\"\n [attr.data-windows]=\"device.platform.windows\"\n [attr.data-padding]=\"options.padding\"\n [ngStyle]=\"{'max-height': options.maxHeight, 'max-width': options.maxWidth}\">\n <div child-of=\"jnt-popover-host\" data-title *ngIf=\"options.title\">{{options.title}}</div>\n\n <ng-container *ngTemplateOutlet=\"!!options.contentTemplate\n ? options.contentTemplate : defaultContentTemplate\">\n </ng-container>\n</div>", changeDetection: ChangeDetectionStrategy.OnPush }), __metadata("design:paramtypes", [Renderer2, ElementRef, ChangeDetectorRef, BreakpointService, DeviceService]) ], PopoverComponent); export { PopoverComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AanVudGUvdWkvIiwic291cmNlcyI6WyJsaWIvb3ZlcmxheXMvcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV2RSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdkIsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFFaEMsTUFBTSxPQUFPLGNBQWM7SUFpQnpCLFlBQVksT0FBZ0MsSUFBSTtRQVpoRCxZQUFPLEdBQWEsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNuQyxhQUFRLEdBQWEsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxjQUFTLEdBQWMsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUcxQyxjQUFTLEdBQUcsT0FBTyxDQUFD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QUM7O2tEQUNkO0FBR2pCO0lBREMsU0FBUyxDQUFDLE9BQU8sQ0FBQzs4QkFDWixVQUFVOytDQUFDO0FBM0JQLGdCQUFnQjtJQUw1QixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsYUFBYTtRQUN2QixxdUdBQTBDO1FBQzFDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO0tBQ2hELENBQUM7cUNBOEI4QixTQUFTO1FBQ1YsVUFBVTtRQUNmLGlCQUFpQjtRQUNULGlCQUFpQjtRQUN0QixhQUFhO0dBakM3QixnQkFBZ0IsQ0FtVDVCO1NBblRZLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgUmVuZGVyZXIyLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3VyIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9iZWhhdmlvdXInO1xuaW1wb3J0IHsgQnJlYWtwb2ludCB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvYnJlYWtwb2ludCc7XG5pbXBvcnQgeyBGZWF0dXJlIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9mZWF0dXJlJztcbmltcG9ydCB7IEd1dHRlciB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvZ3V0dGVyJztcbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvcGxhY2VtZW50JztcbmltcG9ydCB7IFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9wb3NpdGlvbic7XG5pbXBvcnQgeyBUcmlnZ2VycyB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvdHJpZ2dlcnMnO1xuaW1wb3J0IHsgQnJlYWtwb2ludFNlcnZpY2UgfSBmcm9tICcuLi8uLi9sYXlvdXQvcmVzcG9uc2l2ZS9icmVha3BvaW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGV2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL2xheW91dC9yZXNwb25zaXZlL2RldmljZS5zZXJ2aWNlJztcblxuY29uc3QgUEFERElOR19TSVpFID0gODtcbmNvbnN0IERST1BET1dOX1BBRERJTkdfU0laRSA9IDQ7XG5cbmV4cG9ydCBjbGFzcyBQb3BvdmVyT3B0aW9ucyB7XG5cbiAgdGl0bGU6IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xuICBjb250ZW50VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIHRyaWdnZXI6IFRyaWdnZXJzID0gVHJpZ2dlcnMuaG92ZXI7XG4gIHBvc2l0aW9uOiBQb3NpdGlvbiA9IFBvc2l0aW9uLmJvdHRvbTtcbiAgcGxhY2VtZW50OiBQbGFjZW1lbnQgPSBQbGFjZW1lbnQuYWJzb2x1dGU7XG4gIG1heFdpZHRoOiBzdHJpbmc7XG4gIG1pbldpZHRoOiBzdHJpbmc7XG4gIG1heEhlaWdodCA9ICc1MDBweCc7XG4gIHBhZGRpbmc6IEd1dHRlciA9IEd1dHRlci5ub3JtYWw7XG4gIGZlYXR1cmVzOiBGZWF0dXJlW10gPSBbRmVhdHVyZS5zbWFydHldO1xuICBiZWhhdmlvdXI6IEJlaGF2aW91cjtcbiAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgY29udGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRlZnM6IFBhcnRpYWw8UG9wb3Zlck9wdGlvbnM+ID0gbnVsbCkge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGVmcyk7XG4gIH1cblxufVxuXG5jbGFzcyBQb3BvdmVyUG9zaXRpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyBsZWZ0OiBudW1iZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyBzaGlmdFg6IG51bWJlciA9IDAsXG4gICAgICAgICAgICAgIHB1YmxpYyBzaGlmdFk6IG51bWJlciA9IDApIHtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdqbnQtcG9wb3ZlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wb3BvdmVyLmVuY2Fwc3VsYXRlZC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUG9wb3ZlckNvbXBvbmVudCB7XG5cbiAgcHJpdmF0ZSBvYnNlcnZlcnMgPSB7dGFyZ2V0OiB0aGlzLmNyZWF0ZU9ic2VydmVyKCksIGhvc3Q6IHRoaXMuY3JlYXRlT2JzZXJ2ZXIoKX07XG5cbiAgb3B0aW9ucyA9IG5ldyBQb3BvdmVyT3B0aW9ucygpO1xuICB0YXJnZXQ6IEhUTUxFbGVtZW50O1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5ob3N0JylcbiAgcmVhZG9ubHkgaG9zdCA9ICdqbnQtcG9wb3Zlci1ob3N0JztcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnBvc2l0aW9uJylcbiAgZ2V0IHBsYWNlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBsYWNlbWVudDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5jb250ZXh0JylcbiAgZ2V0IGNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZXh0O1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtcGxhY2VtZW50JylcbiAgcG9zaXRpb247XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5taW4td2lkdGgnKVxuICBtaW5XaWR0aDogc3RyaW5nO1xuXG4gIEBWaWV3Q2hpbGQoJ2Fycm93JylcbiAgYXJyb3c6IEVsZW1lbnRSZWY7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICBwcml2YXRlIGhvc3RSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIGJyZWFrcG9pbnQ6IEJyZWFrcG9pbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwdWJsaWMgZGV2aWNlOiBEZXZpY2VTZXJ2aWNlKSB7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9ic2VydmVyKCkge1xuICAgIHJldHVybiBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB0aGlzLnVwZGF0ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWF4U2l6ZXMoKSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1heFdpZHRoID0gK3RoaXMub3B0aW9ucy5tYXhXaWR0aD8ucmVwbGFjZSgncHgnLCAnJyk7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gK3RoaXMub3B0aW9ucy5tYXhIZWlnaHQ/LnJlcGxhY2UoJ3B4JywgJycpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLm9wdGlvbnMuYmVoYXZpb3VyID09PSBCZWhhdmlvdXIuZHJvcGRvd24gPyBEUk9QRE9XTl9QQURESU5HX1NJWkUgOiBQQURESU5HX1NJWkU7XG4gICAgbGV0IGZ1bGxNYXhXaWR0aCA9IG51bGw7XG4gICAgbGV0IGZ1bGxNYXhIZWlnaHQgPSBudWxsO1xuICAgIHN3aXRjaCAodGhpcy5wb3NpdGlvbikge1xuICAgICAgY2FzZSBQb3NpdGlvbi50b3A6IHtcbiAgICAgICAgZnVsbE1heEhlaWdodCA9IHJlY3QudG9wIC0gcGFkZGluZztcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5iZWhhdmlvdXIgPT09IEJlaGF2aW91ci5kcm9wZG93bikge1xuICAgICAgICAgIGZ1bGxNYXhXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gcmVjdC5sZWZ0IC0gcGFkZGluZztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUG9zaXRpb24ucmlnaHQ6IHtcbiAgICAgICAgZnVsbE1heFdpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSByZWN0LmxlZnQgLSBwYWRkaW5nIC0gcmVjdC53aWR0aDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5iZWhhdmlvdXIgPT09IEJlaGF2aW91ci5kcm9wZG93bikge1xuICAgICAgICAgIGZ1bGxNYXhIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCAtIHBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBvc2l0aW9uLmJvdHRvbToge1xuICAgICAgICBmdWxsTWF4SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgLSBwYWRkaW5nIC0gcmVjdC5oZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYmVoYXZpb3VyID09PSBCZWhhdmlvdXIuZHJvcGRvd24pIHtcbiAgICAgICAgICBmdWxsTWF4V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QubGVmdCAtIHBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBvc2l0aW9uLnJpZ2h0Qm90dG9tOiB7XG4gICAgICAgIGZ1bGxNYXhIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCAtIHBhZGRpbmcgLSByZWN0LmhlaWdodDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5iZWhhdmlvdXIgPT09IEJlaGF2aW91ci5kcm9wZG93bikge1xuICAgICAgICAgIGZ1bGxNYXhXaWR0aCA9IHJlY3QucmlnaHQgLSBwYWRkaW5nO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQb3NpdGlvbi5sZWZ0OiB7XG4gICAgICAgIGZ1bGxNYXhXaWR0aCA9IHJlY3QubGVmdCAtIHBhZGRpbmc7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYmVoYXZpb3VyID09PSBCZWhhdmlvdXIuZHJvcGRvd24pIHtcbiAgICAgICAgICBmdWxsTWF4SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgLSBwYWRkaW5nO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghIWZ1bGxNYXhXaWR0aCkge1xuICAgICAgdGhpcy5vcHRpb25zLm1heFdpZHRoID0gYCR7ISFtYXhXaWR0aCA/IE1hdGgubWluKG1heFdpZHRoLCBmdWxsTWF4V2lkdGgpIDogZnVsbE1heFdpZHRofXB4YDtcbiAgICB9XG4gICAgaWYgKCEhZnVsbE1heEhlaWdodCkge1xuICAgICAgdGhpcy5vcHRpb25zLm1heEhlaWdodCA9IGAkeyEhbWF4SGVpZ2h0ID8gTWF0aC5taW4obWF4SGVpZ2h0LCBmdWxsTWF4SGVpZ2h0KSA6IGZ1bGxNYXhIZWlnaHR9cHhgO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tQb3NpdGlvbihwb3NpdGlvbjogUG9wb3ZlclBvc2l0aW9uKSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHtuYXRpdmVFbGVtZW50OiBob3N0fSA9IHRoaXMuaG9zdFJlZjtcbiAgICBjb25zdCBvZmZzZXRMZWZ0ID0gdGhpcy5vcHRpb25zLnBsYWNlbWVudCA9PT0gUGxhY2VtZW50LmFic29sdXRlXG4gICAgICA/IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0TGVmdCA6IDA7XG4gICAgY29uc3Qgb2Zmc2V0VG9wID0gdGhpcy5vcHRpb25zLnBsYWNlbWVudCA9PT0gUGxhY2VtZW50LmFic29sdXRlXG4gICAgICA/IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0VG9wIDogMDtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy5vcHRpb25zLmJlaGF2aW91ciA9PT0gQmVoYXZpb3VyLmRyb3Bkb3duID8gRFJPUERPV05fUEFERElOR19TSVpFIDogUEFERElOR19TSVpFO1xuXG4gICAgc3dpdGNoICh0aGlzLnBvc2l0aW9uKSB7XG4gICAgICBjYXNlIFBvc2l0aW9uLnRvcDoge1xuICAgICAgICBjb25zdCBzaGlmdCA9IG9mZnNldFRvcCAtIHBhZGRpbmcgKyBob3N0LmNsaWVudEhlaWdodDtcbiAgICAgICAgaWYgKHBvc2l0aW9uLnRvcCAtIHNoaWZ0IDwgMCkge1xuICAgICAgICAgIGlmIChyZWN0LnRvcCArIHBhZGRpbmcgKyBob3N0LmNsaWVudEhlaWdodCA8IHdpbmRvdy5pbm5lckhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFBvc2l0aW9uLmJvdHRvbTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY3QucmlnaHQgKyBwYWRkaW5nICsgaG9zdC5jbGllbnRXaWR0aCA8IHdpbmRvdy5pbm5lcldpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gUG9zaXRpb24ucmlnaHQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWN0LmxlZnQgLSBwYWRkaW5nIC0gaG9zdC5jbGllbnRXaWR0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBQb3NpdGlvbi5sZWZ0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldE1heFNpemVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQb3NpdGlvbi5yaWdodDoge1xuICAgICAgICBjb25zdCBzaGlmdCA9IG9mZnNldExlZnQgLSBwYWRkaW5nIC0gdGhpcy50YXJnZXQuY2xpZW50V2lkdGggLSBob3N0LmNsaWVudFdpZHRoO1xuICAgICAgICBpZiAocG9zaXRpb24ubGVmdCAtIHNoaWZ0ID4gd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICBpZiAocmVjdC5sZWZ0IC0gcGFkZGluZyAtIGhvc3QuY2xpZW50V2lkdGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gUG9zaXRpb24ubGVmdDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY3QudG9wICsgcGFkZGluZyArIGhvc3QuY2xpZW50SGVpZ2h0IDwgd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gUG9zaXRpb24uYm90dG9tO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVjdC50b3AgLSBwYWRkaW5nIC0gaG9zdC5jbGllbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gUG9zaXRpb24udG9wO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldE1heFNpemVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQb3NpdGlvbi5ib3R0b206XG4gICAgICBjYXNlIFBvc2l0aW9uLnJpZ2h0Qm90dG9tOiB7XG4gICAgICAgIGNvbnN0IHNoaWZ0ID0gb2Zmc2V0VG9wICsgcGFkZGluZyAtIHRoaXMudGFyZ2V0LmNsaWVudEhlaWdodCAtIGhvc3QuY2xpZW50SGVpZ2h0O1xuICAgICAgICBpZiAocG9zaXRpb24udG9wIC0gc2hpZnQgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICBpZiAocmVjdC50b3AgLSBwYWRkaW5nIC0gaG9zdC5jbGllbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gUG9zaXRpb24udG9wO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVjdC5yaWdodCArIHBhZGRpbmcgKyBob3N0LmNsaWVudFdpZHRoIDwgd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBQb3NpdGlvbi5yaWdodDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY3QubGVmdCAtIHBhZGRpbmcgLSBob3N0LmNsaWVudFdpZHRoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFBvc2l0aW9uLmxlZnQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0TWF4U2l6ZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBvc2l0aW9uLmxlZnQ6IHtcbiAgICAgICAgY29uc3Qgc2hpZnQgPSBvZmZzZXRMZWZ0IC0gcGFkZGluZyArIGhvc3QuY2xpZW50V2lkdGg7XG4gICAgICAgIGlmIChwb3NpdGlvbi5sZWZ0IC0gc2hpZnQgPCAwKSB7XG4gICAgICAgICAgaWYgKHJlY3QucmlnaHQgKyBwYWRkaW5nICsgaG9zdC5jbGllbnRXaWR0aCA8IHdpbmRvdy5pbm5lcldpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gUG9zaXRpb24ucmlnaHQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWN0LnRvcCArIHBhZGRpbmcgKyBob3N0LmNsaWVudEhlaWdodCA8IHdpbmRvdy5pbm5lckhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFBvc2l0aW9uLmJvdHRvbTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY3QudG9wIC0gcGFkZGluZyAtIGhvc3QuY2xpZW50SGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFBvc2l0aW9uLnRvcDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZXRNYXhTaXplcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFBvc2l0aW9uKCk6IFBvcG92ZXJQb3NpdGlvbiB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG9mZnNldExlZnQgPSB0aGlzLm9wdGlvbnMucGxhY2VtZW50ID09PSBQbGFjZW1lbnQuYWJzb2x1dGVcbiAgICAgID8gd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRMZWZ0IDogMDtcbiAgICBjb25zdCBvZmZzZXRUb3AgPSB0aGlzLm9wdGlvbnMucGxhY2VtZW50ID09PSBQbGFjZW1lbnQuYWJzb2x1dGVcbiAgICAgID8gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRUb3AgOiAwO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gbmV3IFBvcG92ZXJQb3NpdGlvbihyZWN0LnRvcCArIG9mZnNldFRvcCwgcmVjdC5sZWZ0