UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

182 lines 32.6 kB
import { __extends } from "tslib"; import { VerticalAlignment, HorizontalAlignment, Util } from '../services/overlay/utilities'; import { fadeOut, fadeIn } from '../animations/main'; import { isIE } from '../core/utils'; import { BaseFitPositionStrategy } from '../services/overlay/position/base-fit-position-strategy'; /** @hidden @internal */ var SelectPositioningStrategy = /** @class */ (function (_super) { __extends(SelectPositioningStrategy, _super); function SelectPositioningStrategy(select, settings) { var _this = _super.call(this) || this; _this.select = select; _this._selectDefaultSettings = { horizontalDirection: HorizontalAlignment.Right, verticalDirection: VerticalAlignment.Bottom, horizontalStartPoint: HorizontalAlignment.Left, verticalStartPoint: VerticalAlignment.Top, openAnimation: fadeIn, closeAnimation: fadeOut }; // Global variables required for cases of !initialCall (page scroll/overlay repositionAll) _this.global_yOffset = 0; _this.global_xOffset = 0; _this.global_styles = {}; _this.settings = Object.assign({}, _this._selectDefaultSettings, settings); return _this; } /** @inheritdoc */ SelectPositioningStrategy.prototype.position = function (contentElement, size, document, initialCall) { var rects = _super.prototype.calculateElementRectangles.call(this, contentElement); // selectFit obj, to be used for both cases of initialCall and !initialCall(page scroll/overlay repositionAll) var selectFit = { verticalOffset: this.global_yOffset, horizontalOffset: this.global_xOffset, targetRect: rects.targetRect, contentElementRect: rects.elementRect, styles: this.global_styles, scrollContainer: this.select.scrollContainer, scrollContainerRect: this.select.scrollContainer.getBoundingClientRect() }; if (initialCall) { // Fill in the required selectFit object properties. selectFit.viewPortRect = Util.getViewportRect(document); selectFit.itemElement = this.getInteractionItemElement(); selectFit.itemRect = selectFit.itemElement.getBoundingClientRect(); // Calculate input and selected item elements style related variables selectFit.styles = this.calculateStyles(selectFit); selectFit.scrollAmount = this.calculateScrollAmount(selectFit); // Calculate how much to offset the overlay container. this.calculateYoffset(selectFit); this.calculateXoffset(selectFit); _super.prototype.updateViewPortFit.call(this, selectFit); // container does not fit in viewPort and is out on Top or Bottom if (selectFit.fitVertical.back < 0 || selectFit.fitVertical.forward < 0) { this.fitInViewport(contentElement, selectFit); } this.select.scrollContainer.scrollTop = selectFit.scrollAmount; } this.setStyles(contentElement, selectFit); }; /** * Calculate selected item scroll position. */ SelectPositioningStrategy.prototype.calculateScrollAmount = function (selectFit) { var itemElementRect = selectFit.itemRect; var scrollContainer = selectFit.scrollContainer; var scrollContainerRect = selectFit.scrollContainerRect; var scrollDelta = scrollContainerRect.top - itemElementRect.top; var scrollPosition = scrollContainer.scrollTop - scrollDelta; var dropDownHeight = scrollContainer.clientHeight; scrollPosition -= dropDownHeight / 2; scrollPosition += itemElementRect.height / 2; return Math.round(Math.min(Math.max(0, scrollPosition), scrollContainer.scrollHeight - scrollContainerRect.height)); }; /** * Position the items outer container so selected item text is positioned over input text and if header * And/OR footer - both header/footer are visible * @param selectFit selectFit to use for computation. */ SelectPositioningStrategy.prototype.fitInViewport = function (contentElement, selectFit) { var footer = selectFit.scrollContainerRect.bottom - selectFit.contentElementRect.bottom; var header = selectFit.scrollContainerRect.top - selectFit.contentElementRect.top; var lastItemFitSize = selectFit.targetRect.bottom + selectFit.styles.itemTextToInputTextDiff - footer; var firstItemFitSize = selectFit.targetRect.top - selectFit.styles.itemTextToInputTextDiff - header; // out of viewPort on Top if (selectFit.fitVertical.back < 0) { var possibleScrollAmount = selectFit.scrollContainer.scrollHeight - selectFit.scrollContainerRect.height - selectFit.scrollAmount; if (possibleScrollAmount + selectFit.fitVertical.back > 0 && firstItemFitSize > selectFit.viewPortRect.top) { selectFit.scrollAmount -= selectFit.fitVertical.back; selectFit.verticalOffset -= selectFit.fitVertical.back; this.global_yOffset = selectFit.verticalOffset; } else { selectFit.verticalOffset = 0; this.global_yOffset = 0; } // out of viewPort on Bottom } else if (selectFit.fitVertical.forward < 0) { if (selectFit.scrollAmount + selectFit.fitVertical.forward > 0 && lastItemFitSize < selectFit.viewPortRect.bottom) { selectFit.scrollAmount += selectFit.fitVertical.forward; selectFit.verticalOffset += selectFit.fitVertical.forward; this.global_yOffset = selectFit.verticalOffset; } else { selectFit.verticalOffset = -selectFit.contentElementRect.height + selectFit.targetRect.height; this.global_yOffset = selectFit.verticalOffset; } } }; /** * Sets element's style which effectively positions the provided element * @param element Element to position * @param selectFit selectFit to use for computation. * @param initialCall should be true if this is the initial call to the position method calling setStyles */ SelectPositioningStrategy.prototype.setStyles = function (contentElement, selectFit) { _super.prototype.setStyle.call(this, contentElement, selectFit.targetRect, selectFit.contentElementRect, selectFit); contentElement.style.width = selectFit.styles.contentElementNewWidth + "px"; // manage container based on paddings? this.global_styles.contentElementNewWidth = selectFit.styles.contentElementNewWidth; }; /** * Calculate the necessary input and selected item styles to be used for positioning item text over input text. * Calculate & Set default items container width. * @param selectFit selectFit to use for computation. */ SelectPositioningStrategy.prototype.calculateStyles = function (selectFit) { var styles = {}; var inputElementStyles = window.getComputedStyle(this.settings.target); var itemElementStyles = window.getComputedStyle(selectFit.itemElement); var numericInputFontSize = parseFloat(inputElementStyles.fontSize); var numericItemFontSize = parseFloat(itemElementStyles.fontSize); var inputTextToInputTop = (selectFit.targetRect.bottom - selectFit.targetRect.top - numericInputFontSize) / 2; var itemTextToItemTop = (selectFit.itemRect.height - numericItemFontSize) / 2; // Adjust for input top padding var negateInputPaddings = (parseFloat(inputElementStyles.paddingTop) - parseFloat(inputElementStyles.paddingBottom)) / 2; styles.itemTextToInputTextDiff = Math.round(itemTextToItemTop - inputTextToInputTop + negateInputPaddings); var numericLeftPadding = parseFloat(itemElementStyles.paddingLeft); var numericTextIndent = parseFloat(itemElementStyles.textIndent); styles.itemTextPadding = numericLeftPadding; styles.itemTextIndent = numericTextIndent; // 24 is the input's toggle ddl icon width styles.contentElementNewWidth = selectFit.targetRect.width + 24 + numericLeftPadding * 2; return styles; }; /** * Obtain the selected item if there is such one or otherwise use the first one */ SelectPositioningStrategy.prototype.getInteractionItemElement = function () { var itemElement; if (this.select.selectedItem) { itemElement = this.select.selectedItem.element.nativeElement; // D.P. Feb 22 2019, #3921 Force item scroll before measuring in IE11, due to base scrollToItem delay if (isIE()) { this.select.scrollContainer.scrollTop = this.select.calculateScrollPosition(this.select.selectedItem); } } else { itemElement = this.select.getFirstItemElement(); } return itemElement; }; /** * Calculate how much to offset the overlay container for Y-axis. */ SelectPositioningStrategy.prototype.calculateYoffset = function (selectFit) { selectFit.verticalOffset = -(selectFit.itemRect.top - selectFit.contentElementRect.top + selectFit.styles.itemTextToInputTextDiff - selectFit.scrollAmount); this.global_yOffset = selectFit.verticalOffset; }; /** * Calculate how much to offset the overlay container for X-axis. */ SelectPositioningStrategy.prototype.calculateXoffset = function (selectFit) { selectFit.horizontalOffset = selectFit.styles.itemTextIndent - selectFit.styles.itemTextPadding; this.global_xOffset = selectFit.horizontalOffset; }; return SelectPositioningStrategy; }(BaseFitPositionStrategy)); export { SelectPositioningStrategy }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LXBvc2l0aW9uaW5nLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZWxlY3Qvc2VsZWN0LXBvc2l0aW9uaW5nLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQTBCLElBQUksRUFBaUIsTUFBTSwrQkFBK0IsQ0FBQztBQUVwSSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFFbEcsd0JBQXdCO0FBQ3hCO0lBQStDLDZDQUF1QjtJQWNsRSxtQ0FBbUIsTUFBcUIsRUFBRSxRQUEyQjtRQUFyRSxZQUNJLGlCQUFPLFNBRVY7UUFIa0IsWUFBTSxHQUFOLE1BQU0sQ0FBZTtRQVpoQyw0QkFBc0IsR0FBRztZQUM3QixtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLO1lBQzlDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLE1BQU07WUFDM0Msb0JBQW9CLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtZQUM5QyxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHO1lBQ3pDLGFBQWEsRUFBRSxNQUFNO1lBQ3JCLGNBQWMsRUFBRSxPQUFPO1NBQzFCLENBQUM7UUFVRiwwRkFBMEY7UUFDbEYsb0JBQWMsR0FBRyxDQUFDLENBQUM7UUFDbkIsb0JBQWMsR0FBRyxDQUFDLENBQUM7UUFDbkIsbUJBQWEsR0FBaUIsRUFBRSxDQUFDO1FBTnJDLEtBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSSxDQUFDLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxDQUFDOztJQUM3RSxDQUFDO0lB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Q0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO1FBQ2hHLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDO0lBQ3JELENBQUM7SUFDTCxnQ0FBQztBQUFELENBQUMsQUE5TEQsQ0FBK0MsdUJBQXVCLEdBOExyRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZlcnRpY2FsQWxpZ25tZW50LCBIb3Jpem9udGFsQWxpZ25tZW50LCBQb3NpdGlvblNldHRpbmdzLCBTaXplLCBVdGlsLCBDb25uZWN0ZWRGaXQgIH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgSVBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3Bvc2l0aW9uJztcbmltcG9ydCB7IGZhZGVPdXQsIGZhZGVJbiB9IGZyb20gJy4uL2FuaW1hdGlvbnMvbWFpbic7XG5pbXBvcnQgeyBJZ3hTZWxlY3RCYXNlIH0gZnJvbSAnLi9zZWxlY3QuY29tbW9uJztcbmltcG9ydCB7IGlzSUUgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEJhc2VGaXRQb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS9wb3NpdGlvbi9iYXNlLWZpdC1wb3NpdGlvbi1zdHJhdGVneSc7XG5cbi8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdFBvc2l0aW9uaW5nU3RyYXRlZ3kgZXh0ZW5kcyBCYXNlRml0UG9zaXRpb25TdHJhdGVneSBpbXBsZW1lbnRzIElQb3NpdGlvblN0cmF0ZWd5IHtcblxuICAgIHByaXZhdGUgX3NlbGVjdERlZmF1bHRTZXR0aW5ncyA9IHtcbiAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5SaWdodCxcbiAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgaG9yaXpvbnRhbFN0YXJ0UG9pbnQ6IEhvcml6b250YWxBbGlnbm1lbnQuTGVmdCxcbiAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5Ub3AsXG4gICAgICAgIG9wZW5BbmltYXRpb246IGZhZGVJbixcbiAgICAgICAgY2xvc2VBbmltYXRpb246IGZhZGVPdXRcbiAgICB9O1xuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgcHVibGljIHNldHRpbmdzOiBQb3NpdGlvblNldHRpbmdzO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHNlbGVjdDogSWd4U2VsZWN0QmFzZSwgc2V0dGluZ3M/OiBQb3NpdGlvblNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9zZWxlY3REZWZhdWx0U2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvLyBHbG9iYWwgdmFyaWFibGVzIHJlcXVpcmVkIGZvciBjYXNlcyBvZiAhaW5pdGlhbENhbGwgKHBhZ2Ugc2Nyb2xsL292ZXJsYXkgcmVwb3NpdGlvbkFsbClcbiAgICBwcml2YXRlIGdsb2JhbF95T2Zmc2V0ID0gMDtcbiAgICBwcml2YXRlIGdsb2JhbF94T2Zmc2V0ID0gMDtcbiAgICBwcml2YXRlIGdsb2JhbF9zdHlsZXM6IFNlbGVjdFN0eWxlcyA9IHt9O1xuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgcG9zaXRpb24oY29udGVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzaXplOiBTaXplLCBkb2N1bWVudD86IERvY3VtZW50LCBpbml0aWFsQ2FsbD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVjdHMgPSBzdXBlci5jYWxjdWxhdGVFbGVtZW50UmVjdGFuZ2xlcyhjb250ZW50RWxlbWVudCk7XG4gICAgICAgIC8vIHNlbGVjdEZpdCBvYmosIHRvIGJlIHVzZWQgZm9yIGJvdGggY2FzZXMgb2YgaW5pdGlhbENhbGwgYW5kICFpbml0aWFsQ2FsbChwYWdlIHNjcm9sbC9vdmVybGF5IHJlcG9zaXRpb25BbGwpXG4gICAgICAgIGNvbnN0IHNlbGVjdEZpdDogU2VsZWN0Rml0ID0ge1xuICAgICAgICAgICAgdmVydGljYWxPZmZzZXQ6IHRoaXMuZ2xvYmFsX3lPZmZzZXQsXG4gICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiB0aGlzLmdsb2JhbF94T2Zmc2V0LFxuICAgICAgICAgICAgdGFyZ2V0UmVjdDogcmVjdHMudGFyZ2V0UmVjdCxcbiAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50UmVjdDogcmVjdHMuZWxlbWVudFJlY3QsXG4gICAgICAgICAgICBzdHlsZXM6IHRoaXMuZ2xvYmFsX3N0eWxlcyxcbiAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lcjogdGhpcy5zZWxlY3Quc2Nyb2xsQ29udGFpbmVyLFxuICAgICAgICAgICAgc2Nyb2xsQ29udGFpbmVyUmVjdDogdGhpcy5zZWxlY3Quc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGluaXRpYWxDYWxsKSB7XG4gICAgICAgICAgICAvLyBGaWxsIGluIHRoZSByZXF1aXJlZCBzZWxlY3RGaXQgb2JqZWN0IHByb3BlcnRpZXMuXG4gICAgICAgICAgICBzZWxlY3RGaXQudmlld1BvcnRSZWN0ID0gVXRpbC5nZXRWaWV3cG9ydFJlY3QoZG9jdW1lbnQpO1xuICAgICAgICAgICAgc2VsZWN0Rml0Lml0ZW1FbGVtZW50ID0gdGhpcy5nZXRJbnRlcmFjdGlvbkl0ZW1FbGVtZW50KCk7XG4gICAgICAgICAgICBzZWxlY3RGaXQuaXRlbVJlY3QgPSBzZWxlY3RGaXQuaXRlbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBpbnB1dCBhbmQgc2VsZWN0ZWQgaXRlbSBlbGVtZW50cyBzdHlsZSByZWxhdGVkIHZhcmlhYmxlc1xuICAgICAgICAgICAgc2VsZWN0Rml0LnN0eWxlcyA9IHRoaXMuY2FsY3VsYXRlU3R5bGVzKHNlbGVjdEZpdCk7XG5cbiAgICAgICAgICAgIHNlbGVjdEZpdC5zY3JvbGxBbW91bnQgPSB0aGlzLmNhbGN1bGF0ZVNjcm9sbEFtb3VudChzZWxlY3RGaXQpO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBtdWNoIHRvIG9mZnNldCB0aGUgb3ZlcmxheSBjb250YWluZXIuXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVlvZmZzZXQoc2VsZWN0Rml0KTtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlWG9mZnNldChzZWxlY3RGaXQpO1xuXG4gICAgICAgICAgICBzdXBlci51cGRhdGVWaWV3UG9ydEZpdChzZWxlY3RGaXQpO1xuICAgICAgICAgICAgLy8gY29udGFpbmVyIGRvZXMgbm90IGZpdCBpbiB2aWV3UG9ydCBhbmQgaXMgb3V0IG9uIFRvcCBvciBCb3R0b21cbiAgICAgICAgICAgIGlmIChzZWxlY3RGaXQuZml0VmVydGljYWwuYmFjayA8IDAgfHwgc2VsZWN0Rml0LmZpdFZlcnRpY2FsLmZvcndhcmQgPCAwICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZml0SW5WaWV3cG9ydChjb250ZW50RWxlbWVudCwgc2VsZWN0Rml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0LnNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgPSBzZWxlY3RGaXQuc2Nyb2xsQW1vdW50O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3R5bGVzKGNvbnRlbnRFbGVtZW50LCBzZWxlY3RGaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBzZWxlY3RlZCBpdGVtIHNjcm9sbCBwb3NpdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVNjcm9sbEFtb3VudChzZWxlY3RGaXQ6IFNlbGVjdEZpdCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGl0ZW1FbGVtZW50UmVjdCA9IHNlbGVjdEZpdC5pdGVtUmVjdDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyID0gc2VsZWN0Rml0LnNjcm9sbENvbnRhaW5lcjtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyUmVjdCA9IHNlbGVjdEZpdC5zY3JvbGxDb250YWluZXJSZWN0O1xuICAgICAgICBjb25zdCBzY3JvbGxEZWx0YSA9IHNjcm9sbENvbnRhaW5lclJlY3QudG9wIC0gaXRlbUVsZW1lbnRSZWN0LnRvcDtcbiAgICAgICAgbGV0IHNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCAtIHNjcm9sbERlbHRhO1xuXG4gICAgICAgIGNvbnN0IGRyb3BEb3duSGVpZ2h0ID0gc2Nyb2xsQ29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gLT0gZHJvcERvd25IZWlnaHQgLyAyO1xuICAgICAgICBzY3JvbGxQb3NpdGlvbiArPSBpdGVtRWxlbWVudFJlY3QuaGVpZ2h0IC8gMjtcblxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1pbihNYXRoLm1heCgwLCBzY3JvbGxQb3NpdGlvbiksIHNjcm9sbENvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSBzY3JvbGxDb250YWluZXJSZWN0LmhlaWdodCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvc2l0aW9uIHRoZSBpdGVtcyBvdXRlciBjb250YWluZXIgc28gc2VsZWN0ZWQgaXRlbSB0ZXh0IGlzIHBvc2l0aW9uZWQgb3ZlciBpbnB1dCB0ZXh0IGFuZCBpZiBoZWFkZXJcbiAgICAgKiBBbmQvT1IgZm9vdGVyIC0gYm90aCBoZWFkZXIvZm9vdGVyIGFyZSB2aXNpYmxlXG4gICAgICogQHBhcmFtIHNlbGVjdEZpdCBzZWxlY3RGaXQgdG8gdXNlIGZvciBjb21wdXRhdGlvbi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZml0SW5WaWV3cG9ydChjb250ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIHNlbGVjdEZpdDogU2VsZWN0Rml0KSB7XG4gICAgICAgIGNvbnN0IGZvb3RlciA9IHNlbGVjdEZpdC5zY3JvbGxDb250YWluZXJSZWN0LmJvdHRvbSAtIHNlbGVjdEZpdC5jb250ZW50RWxlbWVudFJlY3QuYm90dG9tO1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBzZWxlY3RGaXQuc2Nyb2xsQ29udGFpbmVyUmVjdC50b3AgLSBzZWxlY3RGaXQuY29udGVudEVsZW1lbnRSZWN0LnRvcDtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW1GaXRTaXplID0gc2VsZWN0Rml0LnRhcmdldFJlY3QuYm90dG9tICsgc2VsZWN0Rml0LnN0eWxlcy5pdGVtVGV4dFRvSW5wdXRUZXh0RGlmZiAtIGZvb3RlcjtcbiAgICAgICAgY29uc3QgZmlyc3RJdGVtRml0U2l6ZSA9IHNlbGVjdEZpdC50YXJnZXRSZWN0LnRvcCAtIHNlbGVjdEZpdC5zdHlsZXMuaXRlbVRleHRUb0lucHV0VGV4dERpZmYgLSBoZWFkZXI7XG4gICAgICAgIC8vIG91dCBvZiB2aWV3UG9ydCBvbiBUb3BcbiAgICAgICAgaWYgKHNlbGVjdEZpdC5maXRWZXJ0aWNhbC5iYWNrIDwgMCkge1xuICAgICAgICAgICAgY29uc3QgcG9zc2libGVTY3JvbGxBbW91bnQgPSBzZWxlY3RGaXQuc2Nyb2xsQ29udGFpbmVyLnNjcm9sbEhlaWdodCAtXG4gICAgICAgICAgICAgICAgc2VsZWN0Rml0LnNjcm9sbENvbnRhaW5lclJlY3QuaGVpZ2h0IC0gc2VsZWN0Rml0LnNjcm9sbEFtb3VudDtcbiAgICAgICAgICAgIGlmIChwb3NzaWJsZVNjcm9sbEFtb3VudCArIHNlbGVjdEZpdC5maXRWZXJ0aWNhbC5iYWNrID4gMCAmJiBmaXJzdEl0ZW1GaXRTaXplID4gc2VsZWN0Rml0LnZpZXdQb3J0UmVjdC50b3ApIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RGaXQuc2Nyb2xsQW1vdW50IC09IHNlbGVjdEZpdC5maXRWZXJ0aWNhbC5iYWNrO1xuICAgICAgICAgICAgICAgIHNlbGVjdEZpdC52ZXJ0aWNhbE9mZnNldCAtPSBzZWxlY3RGaXQuZml0VmVydGljYWwuYmFjaztcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbF95T2Zmc2V0ID0gc2VsZWN0Rml0LnZlcnRpY2FsT2Zmc2V0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RGaXQudmVydGljYWxPZmZzZXQgPSAwIDtcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbF95T2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgLy8gb3V0IG9mIHZpZXdQb3J0IG9uIEJvdHRvbVxuICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdEZpdC5maXRWZXJ0aWNhbC5mb3J3YXJkIDwgMCkge1xuICAgICAgICAgICAgaWYgKHNlbGVjdEZpdC5zY3JvbGxBbW91bnQgKyBzZWxlY3RGaXQuZml0VmVydGljYWwuZm9yd2FyZCA+IDAgJiYgbGFzdEl0ZW1GaXRTaXplIDwgc2VsZWN0Rml0LnZpZXdQb3J0UmVjdC5ib3R0b20pIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RGaXQuc2Nyb2xsQW1vdW50ICs9IHNlbGVjdEZpdC5maXRWZXJ0aWNhbC5mb3J3YXJkO1xuICAgICAgICAgICAgICAgIHNlbGVjdEZpdC52ZXJ0aWNhbE9mZnNldCArPSBzZWxlY3RGaXQuZml0VmVydGljYWwuZm9yd2FyZDtcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbF95T2Zmc2V0ID0gc2VsZWN0Rml0LnZlcnRpY2FsT2Zmc2V0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RGaXQudmVydGljYWxPZmZzZXQgPSAtc2VsZWN0Rml0LmNvbnRlbnRFbGVtZW50UmVjdC5oZWlnaHQgKyBzZWxlY3RGaXQudGFyZ2V0UmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5nbG9iYWxfeU9mZnNldCA9IHNlbGVjdEZpdC52ZXJ0aWNhbE9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgZWxlbWVudCdzIHN0eWxlIHdoaWNoIGVmZmVjdGl2ZWx5IHBvc2l0aW9ucyB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqIEBwYXJhbSBlbGVtZW50IEVsZW1lbnQgdG8gcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gc2VsZWN0Rml0IHNlbGVjdEZpdCB0byB1c2UgZm9yIGNvbXB1dGF0aW9uLlxuICAgICAqIEBwYXJhbSBpbml0aWFsQ2FsbCBzaG91bGQgYmUgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBpbml0aWFsIGNhbGwgdG8gdGhlIHBvc2l0aW9uIG1ldGhvZCBjYWxsaW5nIHNldFN0eWxlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBzZXRTdHlsZXMoY29udGVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzZWxlY3RGaXQ6IFNlbGVjdEZpdCkge1xuICAgICAgICBzdXBlci5zZXRTdHlsZShjb250ZW50RWxlbWVudCwgc2VsZWN0Rml0LnRhcmdldFJlY3QsIHNlbGVjdEZpdC5jb250ZW50RWxlbWVudFJlY3QsIHNlbGVjdEZpdCk7XG4gICAgICAgIGNvbnRlbnRFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7c2VsZWN0Rml0LnN0eWxlcy5jb250ZW50RWxlbWVudE5ld1dpZHRofXB4YDsgLy8gbWFuYWdlIGNvbnRhaW5lciBiYXNlZCBvbiBwYWRkaW5ncz9cbiAgICAgICAgdGhpcy5nbG9iYWxfc3R5bGVzLmNvbnRlbnRFbGVtZW50TmV3V2lkdGggPSBzZWxlY3RGaXQuc3R5bGVzLmNvbnRlbnRFbGVtZW50TmV3V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBuZWNlc3NhcnkgaW5wdXQgYW5kIHNlbGVjdGVkIGl0ZW0gc3R5bGVzIHRvIGJlIHVzZWQgZm9yIHBvc2l0aW9uaW5nIGl0ZW0gdGV4dCBvdmVyIGlucHV0IHRleHQuXG4gICAgICogQ2FsY3VsYXRlICYgU2V0IGRlZmF1bHQgaXRlbXMgY29udGFpbmVyIHdpZHRoLlxuICAgICAqIEBwYXJhbSBzZWxlY3RGaXQgc2VsZWN0Rml0IHRvIHVzZSBmb3IgY29tcHV0YXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVTdHlsZXMoc2VsZWN0Rml0OiBTZWxlY3RGaXQpOiBTZWxlY3RTdHlsZXMgIHtcbiAgICAgICAgY29uc3Qgc3R5bGVzOiBTZWxlY3RTdHlsZXMgPSB7fTtcbiAgICAgICAgY29uc3QgaW5wdXRFbGVtZW50U3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5zZXR0aW5ncy50YXJnZXQgYXMgRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGl0ZW1FbGVtZW50U3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc2VsZWN0Rml0Lml0ZW1FbGVtZW50KTtcbiAgICAgICAgY29uc3QgbnVtZXJpY0lucHV0Rm9udFNpemUgPSBwYXJzZUZsb2F0KGlucHV0RWxlbWVudFN0eWxlcy5mb250U2l6ZSk7XG4gICAgICAgIGNvbnN0IG51bWVyaWNJdGVtRm9udFNpemUgPSBwYXJzZUZsb2F0KGl0ZW1FbGVtZW50U3R5bGVzLmZvbnRTaXplKTtcbiAgICAgICAgY29uc3QgaW5wdXRUZXh0VG9JbnB1dFRvcCA9IChzZWxlY3RGaXQudGFyZ2V0UmVjdC5ib3R0b20gLSBzZWxlY3RGaXQudGFyZ2V0UmVjdC50b3AgLSBudW1lcmljSW5wdXRGb250U2l6ZSkgLyAyO1xuICAgICAgICBjb25zdCBpdGVtVGV4dFRvSXRlbVRvcCA9IChzZWxlY3RGaXQuaXRlbVJlY3QuaGVpZ2h0IC0gbnVtZXJpY0l0ZW1Gb250U2l6ZSkgLyAyO1xuICAgICAgICAgLy8gQWRqdXN0IGZvciBpbnB1dCB0b3AgcGFkZGluZ1xuICAgICAgICBjb25zdCBuZWdhdGVJbnB1dFBhZGRpbmdzID0gKFxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoaW5wdXRFbGVtZW50U3R5bGVzLnBhZGRpbmdUb3ApIC1cbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KGlucHV0RWxlbWVudFN0eWxlcy5wYWRkaW5nQm90dG9tKVxuICAgICAgICAgICAgKSAvIDI7XG4gICAgICAgIHN0eWxlcy5pdGVtVGV4dFRvSW5wdXRUZXh0RGlmZiA9IE1hdGgucm91bmQoaXRlbVRleHRUb0l0ZW1Ub3AgLSBpbnB1dFRleHRUb0lucHV0VG9wICsgbmVnYXRlSW5wdXRQYWRkaW5ncyk7XG5cbiAgICAgICAgY29uc3QgbnVtZXJpY0xlZnRQYWRkaW5nID0gcGFyc2VGbG9hdChpdGVtRWxlbWVudFN0eWxlcy5wYWRkaW5nTGVmdCk7XG4gICAgICAgIGNvbnN0IG51bWVyaWNUZXh0SW5kZW50ID0gcGFyc2VGbG9hdChpdGVtRWxlbWVudFN0eWxlcy50ZXh0SW5kZW50KTtcblxuICAgICAgICBzdHlsZXMuaXRlbVRleHRQYWRkaW5nID0gbnVtZXJpY0xlZnRQYWRkaW5nO1xuICAgICAgICBzdHlsZXMuaXRlbVRleHRJbmRlbnQgPSBudW1lcmljVGV4dEluZGVudDtcbiAgICAgICAgLy8gMjQgaXMgdGhlIGlucHV0J3MgdG9nZ2xlIGRkbCBpY29uIHdpZHRoXG4gICAgICAgIHN0eWxlcy5jb250ZW50RWxlbWVudE5ld1dpZHRoID0gc2VsZWN0Rml0LnRhcmdldFJlY3Qud2lkdGggKyAyNCArIG51bWVyaWNMZWZ0UGFkZGluZyAqIDI7XG5cbiAgICAgICAgcmV0dXJuIHN0eWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnRhaW4gdGhlIHNlbGVjdGVkIGl0ZW0gaWYgdGhlcmUgaXMgc3VjaCBvbmUgb3Igb3RoZXJ3aXNlIHVzZSB0aGUgZmlyc3Qgb25lXG4gICAgICovXG4gICAgcHVibGljIGdldEludGVyYWN0aW9uSXRlbUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBsZXQgaXRlbUVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdC5zZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1FbGVtZW50ID0gdGhpcy5zZWxlY3Quc2VsZWN0ZWRJdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIC8vIEQuUC4gRmViIDIyIDIwMTksICMzOTIxIEZvcmNlIGl0ZW0gc2Nyb2xsIGJlZm9yZSBtZWFzdXJpbmcgaW4gSUUxMSwgZHVlIHRvIGJhc2Ugc2Nyb2xsVG9JdGVtIGRlbGF5XG4gICAgICAgICAgICBpZiAoaXNJRSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Quc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IHRoaXMuc2VsZWN0LmNhbGN1bGF0ZVNjcm9sbFBvc2l0aW9uKHRoaXMuc2VsZWN0LnNlbGVjdGVkSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtRWxlbWVudCA9IHRoaXMuc2VsZWN0LmdldEZpcnN0SXRlbUVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIGhvdyBtdWNoIHRvIG9mZnNldCB0aGUgb3ZlcmxheSBjb250YWluZXIgZm9yIFktYXhpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVlvZmZzZXQoc2VsZWN0Rml0OiBTZWxlY3RGaXQpIHtcbiAgICAgICAgc2VsZWN0Rml0LnZlcnRpY2FsT2Zmc2V0ID0gLShzZWxlY3RGaXQuaXRlbVJlY3QudG9wIC0gc2VsZWN0Rml0LmNvbnRlbnRFbGVtZW50UmVjdC50b3AgK1xuICAgICAgICAgICAgc2VsZWN0Rml0LnN0eWxlcy5pdGVtVGV4dFRvSW5wdXRUZXh0RGlmZiAtIHNlbGVjdEZpdC5zY3JvbGxBbW91bnQpO1xuICAgICAgICB0aGlzLmdsb2JhbF95T2Zmc2V0ID0gc2VsZWN0Rml0LnZlcnRpY2FsT2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBob3cgbXVjaCB0byBvZmZzZXQgdGhlIG92ZXJsYXkgY29udGFpbmVyIGZvciBYLWF4aXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVYb2Zmc2V0KHNlbGVjdEZpdDogU2VsZWN0Rml0KSB7XG4gICAgICAgIHNlbGVjdEZpdC5ob3Jpem9udGFsT2Zmc2V0ID0gc2VsZWN0Rml0LnN0eWxlcy5pdGVtVGV4dEluZGVudCAtIHNlbGVjdEZpdC5zdHlsZXMuaXRlbVRleHRQYWRkaW5nO1xuICAgICAgICB0aGlzLmdsb2JhbF94T2Zmc2V0ID0gc2VsZWN0Rml0Lmhvcml6b250YWxPZmZzZXQ7XG4gICAgfVxufVxuXG4vKiogQGhpZGRlbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RGaXQgZXh0ZW5kcyBDb25uZWN0ZWRGaXQge1xuICAgIGl0ZW1FbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gICAgc2Nyb2xsQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBzY3JvbGxDb250YWluZXJSZWN0OiBDbGllbnRSZWN0O1xuICAgIGl0ZW1SZWN0PzogQ2xpZW50UmVjdDtcbiAgICBzdHlsZXM/OiBTZWxlY3RTdHlsZXM7XG4gICAgc2Nyb2xsQW1vdW50PzogbnVtYmVyO1xufVxuXG4vKiogQGhpZGRlbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RTdHlsZXMge1xuICAgIGl0ZW1UZXh0UGFkZGluZz86IG51bWJlcjtcbiAgICBpdGVtVGV4dEluZGVudD86IG51bWJlcjtcbiAgICBpdGVtVGV4dFRvSW5wdXRUZXh0RGlmZj86IG51bWJlcjtcbiAgICBjb250ZW50RWxlbWVudE5ld1dpZHRoPzogbnVtYmVyO1xuICAgIG51bWVyaWNMZWZ0UGFkZGluZz86IG51bWJlcjtcbn1cbiJdfQ==