@nova-ui/bits
Version:
SolarWinds Nova Framework
169 lines • 25.4 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { DOCUMENT } from "@angular/common";
import { Inject, Injectable } from "@angular/core";
import _isNil from "lodash/isNil";
import { popoverConstants } from "../../constants/popover.constants";
import { EdgeDetectionService } from "../../services/edge-detection.service";
import { PositionService } from "../../services/position.service";
import * as i0 from "@angular/core";
import * as i1 from "../../services/position.service";
import * as i2 from "../../services/edge-detection.service";
/**
* @dynamic
* @ignore
*/
export class PopoverModalService {
constructor(positionService, document, edgeDetector) {
this.positionService = positionService;
this.document = document;
this.edgeDetector = edgeDetector;
}
setPosition(popoverModal, popoverTrigger, appendToBody, contextPlacement) {
// Element with dimensions
const popoverElement = (popoverModal.querySelector(".nui-popover-container"));
const edgeDetectionResult = this.edgeDetector.canBe(popoverTrigger, popoverElement);
if (_isNil(edgeDetectionResult)) {
throw new Error("edgeDetectionResult is Nil");
}
const placementAndAlignment = this.getPlacementAndAlignment(edgeDetectionResult, contextPlacement);
const placement = placementAndAlignment.placement;
const arrowPosition = placementAndAlignment.alignment;
const position = this.positionService.getPosition(popoverTrigger, popoverElement, `${placement}-${arrowPosition}`, appendToBody);
position.top += this.getYAdjustment(popoverTrigger, placementAndAlignment);
position.left += this.getXAdjustment(popoverTrigger, placementAndAlignment);
return {
placement,
position,
arrowPosition,
};
}
getPlacementAndAlignment(edgeDetectionResult, contextPlacement) {
const canOpenHorizontally = edgeDetectionResult.placed.right || edgeDetectionResult.placed.left;
const canOpenVertically = edgeDetectionResult.placed.top || edgeDetectionResult.placed.bottom;
// placements
const canBePlacedRight = edgeDetectionResult.placed.right
? "right"
: "left";
const canBePlacedLeft = edgeDetectionResult.placed.left
? "left"
: "right";
const canBePlacedBottom = edgeDetectionResult.placed.bottom
? "bottom"
: "top";
const canBePlacedTop = edgeDetectionResult.placed.top
? "top"
: "bottom";
// alignments
const canBeAlignedTop = edgeDetectionResult.aligned.top
? "top"
: "bottom";
const canBeAlignedRight = edgeDetectionResult.aligned.right
? "right"
: "left";
const canBeAlignedLeft = edgeDetectionResult.aligned.left
? "left"
: "right";
// if horizontal/vertical placement is possible opening left/right/top/bottom respectively
switch (contextPlacement) {
case "left":
return {
placement: canOpenHorizontally
? canBePlacedLeft
: canBePlacedBottom,
alignment: canOpenHorizontally
? canBeAlignedTop
: canBeAlignedRight,
};
case "right":
return {
placement: canOpenHorizontally
? canBePlacedRight
: canBePlacedBottom,
alignment: canOpenHorizontally
? canBeAlignedTop
: canBeAlignedRight,
};
case "bottom":
return {
placement: canOpenVertically
? canBePlacedBottom
: canBePlacedRight,
alignment: canOpenVertically
? canBeAlignedLeft
: canBeAlignedTop,
};
case "top":
return {
placement: canOpenVertically
? canBePlacedTop
: canBePlacedRight,
alignment: canOpenVertically
? canBeAlignedLeft
: canBeAlignedTop,
};
default:
return {
placement: canOpenHorizontally
? canBePlacedRight
: canBePlacedBottom,
alignment: canOpenHorizontally
? canBeAlignedTop
: canBeAlignedRight,
};
}
}
// calculating adjustments for popover modal on Y axis
getYAdjustment(popoverTrigger, placementAndAlignment) {
// y-adjustment not needed for top or bottom placement
if (placementAndAlignment.placement === "top" ||
placementAndAlignment.placement === "bottom") {
return 0;
}
const yAdjustment = popoverTrigger.offsetHeight / 2 -
(popoverConstants.arrowOffset + popoverConstants.arrowBorderWidth);
return placementAndAlignment.alignment === "top"
? yAdjustment
: -yAdjustment;
}
// calculating adjustments for popover modal on X axis
// popover modal should be always on center on X axis
getXAdjustment(popoverTrigger, placementAndAlignment) {
// x-adjustment not needed for left or right placement
if (placementAndAlignment.placement === "left" ||
placementAndAlignment.placement === "right") {
return 0;
}
const xAdjustment = popoverTrigger.offsetWidth / 2 -
(popoverConstants.arrowOffset + popoverConstants.arrowBorderWidth);
return placementAndAlignment.alignment === "left"
? xAdjustment
: -xAdjustment;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverModalService, deps: [{ token: i1.PositionService }, { token: DOCUMENT }, { token: i2.EdgeDetectionService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverModalService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopoverModalService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.PositionService }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i2.EdgeDetectionService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci1tb2RhbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wb3BvdmVyL3BvcG92ZXItbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQztBQUdsQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7QUFtQ2xFOzs7R0FHRztBQUVILE1BQU0sT0FBTyxtQkFBbUI7SUFDNUIsWUFDWSxlQUFnQyxFQUNkLFFBQWtCLEVBQ3BDLFlBQWtDO1FBRmxDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQXNCO0lBQzNDLENBQUM7SUFFRyxXQUFXLENBQ2QsWUFBeUIsRUFDekIsY0FBMkIsRUFDM0IsWUFBcUIsRUFDckIsZ0JBQWtDO1FBRWxDLDBCQUEwQjtRQUMxQixNQUFN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Q1o7UUFFRCxNQUFNLFdBQVcsR0FDYixjQUFjLENBQUMsWUFBWSxHQUFHLENBQUM7WUFDL0IsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN2RSxPQUFPLHFCQUFxQixDQUFDLFNBQVMsS0FBSyxLQUFLO1lBQzVDLENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQscURBQXFEO0lBQzdDLGNBQWMsQ0FDbEIsY0FBMkIsRUFDM0IscUJBQWlEO1FBRWpELHNEQUFzRDtRQUN0RCxJQUNJLHFCQUFxQixDQUFDLFNBQVMsS0FBSyxNQUFNO1lBQzFDLHFCQUFxQixDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQzdDO1lBQ0UsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUVELE1BQU0sV0FBVyxHQUNiLGNBQWMsQ0FBQyxXQUFXLEdBQUcsQ0FBQztZQUM5QixDQUFDLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8scUJBQXFCLENBQUMsU0FBUyxLQUFLLE1BQU07WUFDN0MsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFDdkIsQ0FBQzsrR0EvS1EsbUJBQW1CLGlEQUdoQixRQUFRO21IQUhYLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBSUYsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBfaXNOaWwgZnJvbSBcImxvZGFzaC9pc05pbFwiO1xuXG5pbXBvcnQgeyBQb3BvdmVyUGxhY2VtZW50IH0gZnJvbSBcIi4vcHVibGljLWFwaVwiO1xuaW1wb3J0IHsgcG9wb3ZlckNvbnN0YW50cyB9IGZyb20gXCIuLi8uLi9jb25zdGFudHMvcG9wb3Zlci5jb25zdGFudHNcIjtcbmltcG9ydCB7IEVkZ2VEZXRlY3Rpb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2VkZ2UtZGV0ZWN0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBvc2l0aW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9wb3NpdGlvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBJRWRnZURldGVjdGlvblJlc3VsdCB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9wdWJsaWMtYXBpXCI7XG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuaW50ZXJmYWNlIElQb3BvdmVyUGxhY2VtZW50QWxpZ25tZW50IHtcbiAgICBwbGFjZW1lbnQ6IFBvcG92ZXJQbGFjZW1lbnQ7XG4gICAgYWxpZ25tZW50OiBQb3BvdmVyQWxpZ25tZW50O1xufVxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCB0eXBlIFBvcG92ZXJBbGlnbm1lbnQgPSBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwidG9wXCIgfCBcImJvdHRvbVwiO1xuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVBvcG92ZXJNb2RhbENvbnRleHQge1xuICAgIGFycm93TWFyZ2luVG9wPzogbnVtYmVyO1xuICAgIGljb246IHN0cmluZztcbiAgICBwb3BvdmVyUG9zaXRpb24/OiBzdHJpbmc7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgcGxhY2VtZW50PzogUG9wb3ZlclBsYWNlbWVudDtcbn1cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElQb3BvdmVyUG9zaXRpb24ge1xuICAgIHBsYWNlbWVudDogUG9wb3ZlclBsYWNlbWVudDtcbiAgICBhcnJvd1Bvc2l0aW9uOiBQb3BvdmVyQWxpZ25tZW50O1xuICAgIHBvc2l0aW9uOiB7XG4gICAgICAgIHRvcDogbnVtYmVyO1xuICAgICAgICBsZWZ0OiBudW1iZXI7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBAZHluYW1pY1xuICogQGlnbm9yZVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUG9wb3Zlck1vZGFsU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcG9zaXRpb25TZXJ2aWNlOiBQb3NpdGlvblNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgICAgICBwcml2YXRlIGVkZ2VEZXRlY3RvcjogRWRnZURldGVjdGlvblNlcnZpY2VcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc2V0UG9zaXRpb24oXG4gICAgICAgIHBvcG92ZXJNb2RhbDogSFRNTEVsZW1lbnQsXG4gICAgICAgIHBvcG92ZXJUcmlnZ2VyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgYXBwZW5kVG9Cb2R5OiBib29sZWFuLFxuICAgICAgICBjb250ZXh0UGxhY2VtZW50OiBQb3BvdmVyUGxhY2VtZW50XG4gICAgKTogSVBvcG92ZXJQb3NpdGlvbiB7XG4gICAgICAgIC8vIEVsZW1lbnQgd2l0aCBkaW1lbnNpb25zXG4gICAgICAgIGNvbnN0IHBvcG92ZXJFbGVtZW50ID0gPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgIHBvcG92ZXJNb2RhbC5xdWVyeVNlbGVjdG9yKFwiLm51aS1wb3BvdmVyLWNvbnRhaW5lclwiKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlZGdlRGV0ZWN0aW9uUmVzdWx0ID0gdGhpcy5lZGdlRGV0ZWN0b3IuY2FuQmUoXG4gICAgICAgICAgICBwb3BvdmVyVHJpZ2dlcixcbiAgICAgICAgICAgIHBvcG92ZXJFbGVtZW50XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKF9pc05pbChlZGdlRGV0ZWN0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZWRnZURldGVjdGlvblJlc3VsdCBpcyBOaWxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwbGFjZW1lbnRBbmRBbGlnbm1lbnQgPSB0aGlzLmdldFBsYWNlbWVudEFuZEFsaWdubWVudChcbiAgICAgICAgICAgIGVkZ2VEZXRlY3Rpb25SZXN1bHQsXG4gICAgICAgICAgICBjb250ZXh0UGxhY2VtZW50XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IHBsYWNlbWVudEFuZEFsaWdubWVudC5wbGFjZW1lbnQ7XG4gICAgICAgIGNvbnN0IGFycm93UG9zaXRpb24gPSBwbGFjZW1lbnRBbmRBbGlnbm1lbnQuYWxpZ25tZW50O1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb25TZXJ2aWNlLmdldFBvc2l0aW9uKFxuICAgICAgICAgICAgcG9wb3ZlclRyaWdnZXIsXG4gICAgICAgICAgICBwb3BvdmVyRWxlbWVudCxcbiAgICAgICAgICAgIGAke3BsYWNlbWVudH0tJHthcnJvd1Bvc2l0aW9ufWAsXG4gICAgICAgICAgICBhcHBlbmRUb0JvZHlcbiAgICAgICAgKTtcbiAgICAgICAgcG9zaXRpb24udG9wICs9IHRoaXMuZ2V0WUFkanVzdG1lbnQoXG4gICAgICAgICAgICBwb3BvdmVyVHJpZ2dlcixcbiAgICAgICAgICAgIHBsYWNlbWVudEFuZEFsaWdubWVudFxuICAgICAgICApO1xuICAgICAgICBwb3NpdGlvbi5sZWZ0ICs9IHRoaXMuZ2V0WEFkanVzdG1lbnQoXG4gICAgICAgICAgICBwb3BvdmVyVHJpZ2dlcixcbiAgICAgICAgICAgIHBsYWNlbWVudEFuZEFsaWdubWVudFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICBhcnJvd1Bvc2l0aW9uLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGxhY2VtZW50QW5kQWxpZ25tZW50KFxuICAgICAgICBlZGdlRGV0ZWN0aW9uUmVzdWx0OiBJRWRnZURldGVjdGlvblJlc3VsdCxcbiAgICAgICAgY29udGV4dFBsYWNlbWVudDogUG9wb3ZlclBsYWNlbWVudFxuICAgICk6IElQb3BvdmVyUGxhY2VtZW50QWxpZ25tZW50IHtcbiAgICAgICAgY29uc3QgY2FuT3Blbkhvcml6b250YWxseSA9XG4gICAgICAgICAgICBlZGdlRGV0ZWN0aW9uUmVzdWx0LnBsYWNlZC5yaWdodCB8fCBlZGdlRGV0ZWN0aW9uUmVzdWx0LnBsYWNlZC5sZWZ0O1xuICAgICAgICBjb25zdCBjYW5PcGVuVmVydGljYWxseSA9XG4gICAgICAgICAgICBlZGdlRGV0ZWN0aW9uUmVzdWx0LnBsYWNlZC50b3AgfHwgZWRnZURldGVjdGlvblJlc3VsdC5wbGFjZWQuYm90dG9tO1xuICAgICAgICAvLyBwbGFjZW1lbnRzXG4gICAgICAgIGNvbnN0IGNhbkJlUGxhY2VkUmlnaHQgPSBlZGdlRGV0ZWN0aW9uUmVzdWx0LnBsYWNlZC5yaWdodFxuICAgICAgICAgICAgPyBcInJpZ2h0XCJcbiAgICAgICAgICAgIDogXCJsZWZ0XCI7XG4gICAgICAgIGNvbnN0IGNhbkJlUGxhY2VkTGVmdCA9IGVkZ2VEZXRlY3Rpb25SZXN1bHQucGxhY2VkLmxlZnRcbiAgICAgICAgICAgID8gXCJsZWZ0XCJcbiAgICAgICAgICAgIDogXCJyaWdodFwiO1xuICAgICAgICBjb25zdCBjYW5CZVBsYWNlZEJvdHRvbSA9IGVkZ2VEZXRlY3Rpb25SZXN1bHQucGxhY2VkLmJvdHRvbVxuICAgICAgICAgICAgPyBcImJvdHRvbVwiXG4gICAgICAgICAgICA6IFwidG9wXCI7XG4gICAgICAgIGNvbnN0IGNhbkJlUGxhY2VkVG9wID0gZWRnZURldGVjdGlvblJlc3VsdC5wbGFjZWQudG9wXG4gICAgICAgICAgICA/IFwidG9wXCJcbiAgICAgICAgICAgIDogXCJib3R0b21cIjtcbiAgICAgICAgLy8gYWxpZ25tZW50c1xuICAgICAgICBjb25zdCBjYW5CZUFsaWduZWRUb3AgPSBlZGdlRGV0ZWN0aW9uUmVzdWx0LmFsaWduZWQudG9wXG4gICAgICAgICAgICA/IFwidG9wXCJcbiAgICAgICAgICAgIDogXCJib3R0b21cIjtcbiAgICAgICAgY29uc3QgY2FuQmVBbGlnbmVkUmlnaHQgPSBlZGdlRGV0ZWN0aW9uUmVzdWx0LmFsaWduZWQucmlnaHRcbiAgICAgICAgICAgID8gXCJyaWdodFwiXG4gICAgICAgICAgICA6IFwibGVmdFwiO1xuICAgICAgICBjb25zdCBjYW5CZUFsaWduZWRMZWZ0ID0gZWRnZURldGVjdGlvblJlc3VsdC5hbGlnbmVkLmxlZnRcbiAgICAgICAgICAgID8gXCJsZWZ0XCJcbiAgICAgICAgICAgIDogXCJyaWdodFwiO1xuICAgICAgICAvLyBpZiBob3Jpem9udGFsL3ZlcnRpY2FsIHBsYWNlbWVudCBpcyBwb3NzaWJsZSBvcGVuaW5nIGxlZnQvcmlnaHQvdG9wL2JvdHRvbSByZXNwZWN0aXZlbHlcbiAgICAgICAgc3dpdGNoIChjb250ZXh0UGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogY2FuT3Blbkhvcml6b250YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZVBsYWNlZExlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuQmVQbGFjZWRCb3R0b20sXG4gICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogY2FuT3Blbkhvcml6b250YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZUFsaWduZWRUb3BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuQmVBbGlnbmVkUmlnaHQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogY2FuT3Blbkhvcml6b250YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZVBsYWNlZFJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNhbkJlUGxhY2VkQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGNhbk9wZW5Ib3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY2FuQmVBbGlnbmVkVG9wXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNhbkJlQWxpZ25lZFJpZ2h0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlIFwiYm90dG9tXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50OiBjYW5PcGVuVmVydGljYWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZVBsYWNlZEJvdHRvbVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjYW5CZVBsYWNlZFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGNhbk9wZW5WZXJ0aWNhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNhbkJlQWxpZ25lZExlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuQmVBbGlnbmVkVG9wLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlIFwidG9wXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50OiBjYW5PcGVuVmVydGljYWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZVBsYWNlZFRvcFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjYW5CZVBsYWNlZFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGNhbk9wZW5WZXJ0aWNhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNhbkJlQWxpZ25lZExlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuQmVBbGlnbmVkVG9wLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogY2FuT3Blbkhvcml6b250YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjYW5CZVBsYWNlZFJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNhbkJlUGxhY2VkQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGNhbk9wZW5Ib3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY2FuQmVBbGlnbmVkVG9wXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNhbkJlQWxpZ25lZFJpZ2h0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGluZyBhZGp1c3RtZW50cyBmb3IgcG9wb3ZlciBtb2RhbCBvbiBZIGF4aXNcbiAgICBwcml2YXRlIGdldFlBZGp1c3RtZW50KFxuICAgICAgICBwb3BvdmVyVHJpZ2dlcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIHBsYWNlbWVudEFuZEFsaWdubWVudDogSVBvcG92ZXJQbGFjZW1lbnRBbGlnbm1lbnRcbiAgICApOiBudW1iZXIge1xuICAgICAgICAvLyB5LWFkanVzdG1lbnQgbm90IG5lZWRlZCBmb3IgdG9wIG9yIGJvdHRvbSBwbGFjZW1lbnRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGxhY2VtZW50QW5kQWxpZ25tZW50LnBsYWNlbWVudCA9PT0gXCJ0b3BcIiB8fFxuICAgICAgICAgICAgcGxhY2VtZW50QW5kQWxpZ25tZW50LnBsYWNlbWVudCA9PT0gXCJib3R0b21cIlxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeUFkanVzdG1lbnQgPVxuICAgICAgICAgICAgcG9wb3ZlclRyaWdnZXIub2Zmc2V0SGVpZ2h0IC8gMiAtXG4gICAgICAgICAgICAocG9wb3ZlckNvbnN0YW50cy5hcnJvd09mZnNldCArIHBvcG92ZXJDb25zdGFudHMuYXJyb3dCb3JkZXJXaWR0aCk7XG4gICAgICAgIHJldHVybiBwbGFjZW1lbnRBbmRBbGlnbm1lbnQuYWxpZ25tZW50ID09PSBcInRvcFwiXG4gICAgICAgICAgICA/IHlBZGp1c3RtZW50XG4gICAgICAgICAgICA6IC15QWRqdXN0bWVudDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGluZyBhZGp1c3RtZW50cyBmb3IgcG9wb3ZlciBtb2RhbCBvbiBYIGF4aXNcbiAgICAvLyBwb3BvdmVyIG1vZGFsIHNob3VsZCBiZSBhbHdheXMgb24gY2VudGVyIG9uIFggYXhpc1xuICAgIHByaXZhdGUgZ2V0WEFkanVzdG1lbnQoXG4gICAgICAgIHBvcG92ZXJUcmlnZ2VyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcGxhY2VtZW50QW5kQWxpZ25tZW50OiBJUG9wb3ZlclBsYWNlbWVudEFsaWdubWVudFxuICAgICk6IG51bWJlciB7XG4gICAgICAgIC8vIHgtYWRqdXN0bWVudCBub3QgbmVlZGVkIGZvciBsZWZ0IG9yIHJpZ2h0IHBsYWNlbWVudFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwbGFjZW1lbnRBbmRBbGlnbm1lbnQucGxhY2VtZW50ID09PSBcImxlZnRcIiB8fFxuICAgICAgICAgICAgcGxhY2VtZW50QW5kQWxpZ25tZW50LnBsYWNlbWVudCA9PT0gXCJyaWdodFwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4QWRqdXN0bWVudCA9XG4gICAgICAgICAgICBwb3BvdmVyVHJpZ2dlci5vZmZzZXRXaWR0aCAvIDIgLVxuICAgICAgICAgICAgKHBvcG92ZXJDb25zdGFudHMuYXJyb3dPZmZzZXQgKyBwb3BvdmVyQ29uc3RhbnRzLmFycm93Qm9yZGVyV2lkdGgpO1xuICAgICAgICByZXR1cm4gcGxhY2VtZW50QW5kQWxpZ25tZW50LmFsaWdubWVudCA9PT0gXCJsZWZ0XCJcbiAgICAgICAgICAgID8geEFkanVzdG1lbnRcbiAgICAgICAgICAgIDogLXhBZGp1c3RtZW50O1xuICAgIH1cbn1cbiJdfQ==