@circe/core
Version:
Circe Components for Angular :: Core Services and Tools
164 lines • 29.5 kB
JavaScript
import { npaPlacementElementTypes, npaPlacementHorizontal, npaPlacementTypes, npaPlacementVertical } from './placement.types';
export class Placement {
constructor(bm) {
this._bm = bm;
this._modV = 0;
this._modH = 0;
}
_processPlacement(placement, type = npaPlacementTypes.POSITION) {
const _placementArray = placement.split(' ');
if ((_placementArray === null || _placementArray === void 0 ? void 0 : _placementArray.length) === 2) {
if (type === npaPlacementTypes.POSITION) {
this._positionV = _placementArray[0];
this._positionH = _placementArray[1];
}
else if (type === npaPlacementTypes.ORIENTATION) {
this._orientationV = _placementArray[0];
this._orientationH = _placementArray[1];
}
}
}
_processModifiers(modifiers) {
if (!!modifiers || modifiers === 0) {
let _mods = modifiers;
if (typeof modifiers === 'number') {
_mods = [modifiers];
}
if (Array.isArray(_mods) && !!_mods.length && _mods.length <= 2) {
if (!!_mods[0] || _mods[0] === 0) {
this._modV = _mods[0];
}
if (!!_mods[1] || _mods[1] === 0) {
this._modH = _mods[1];
}
}
}
}
_rightHorizontalSpaceNeeded(actual) {
return actual.left + this._clientElementRect.width + this._modH > this._boundaryElementRect.right;
}
_leftHorizontalSpaceNeeded(actual) {
return actual.left < this._boundaryElementRect.left;
}
_bottomVerticalSpaceNeeded(actual) {
return actual.top + this._clientElementRect.height > this._boundaryElementRect.bottom;
}
_topVerticalSpaceNeeded(actual) {
return actual.top < this._boundaryElementRect.top;
}
_verticalSpaceNeeded(actual) {
return this._topVerticalSpaceNeeded(actual) || this._bottomVerticalSpaceNeeded(actual);
}
_horizontalSpaceNeeded(actual) {
return this._leftHorizontalSpaceNeeded(actual) || this._rightHorizontalSpaceNeeded(actual);
}
setDomElement(element, type = npaPlacementElementTypes.HOST) {
const _element = this._bm.getElement(element);
if (!!_element) {
if (type === npaPlacementElementTypes.HOST) {
this._hostElement = _element;
this._hostElementRect = this._hostElement.getBoundingClientRect();
this._hostPointsV = {
top: this._hostElementRect.top,
center: this._hostElementRect.top + (this._hostElementRect.height / 2),
bottom: this._hostElementRect.bottom
};
this._hostPointsH = {
left: this._hostElementRect.left,
center: this._hostElementRect.left + (this._hostElementRect.width / 2),
right: this._hostElementRect.right
};
}
else if (type === npaPlacementElementTypes.CLIENT) {
this._clientElement = _element;
this._clientElementRect = this._clientElement.getBoundingClientRect();
this._clientMoveV = {
top: this._clientElementRect.height,
center: this._clientElementRect.height / 2,
bottom: 0
};
this._clientMoveH = {
left: this._clientElementRect.width,
center: this._clientElementRect.width / 2,
right: 0
};
}
else if (type === npaPlacementElementTypes.RELATIVE) {
this._relativeElement = _element;
this._relativeElementRect = this._relativeElement.getBoundingClientRect();
this._relativeElementSet = true;
}
else if (type === npaPlacementElementTypes.SCROLL) {
this._scrollElement = _element;
this._scrollElementRect = this._scrollElement.getBoundingClientRect();
this._scrollElementSet = true;
}
else if (type === npaPlacementElementTypes.BOUNDARY) {
this._boundaryElement = _element;
this._boundaryElementRect = this._boundaryElement.getBoundingClientRect();
this._boundaryElementSet = true;
}
}
}
positioningElement(position, orientation, modifiers, checkAvailableSpace = false) {
let _output;
if (!!this._hostElement && !!this._clientElement) {
let _correctionV = 0;
let _correctionH = 0;
if (this._relativeElementSet) {
if (!this._scrollElementSet) {
this._scrollElement = this._relativeElement;
this._scrollElementRect = this._scrollElement.getBoundingClientRect();
}
if (!this._boundaryElementSet) {
this._boundaryElement = this._relativeElement;
this._boundaryElementRect = this._boundaryElement.getBoundingClientRect();
}
_correctionV = this._scrollElement.scrollTop - this._relativeElementRect.top;
_correctionH = this._scrollElement.scrollLeft - this._relativeElementRect.left;
}
this._processModifiers(modifiers);
this._processPlacement(position);
this._processPlacement(orientation, npaPlacementTypes.ORIENTATION);
_output = {
top: this._hostPointsV[this._positionV] + _correctionV - this._clientMoveV[this._orientationV] + this._modV,
left: this._hostPointsH[this._positionH] + _correctionH - this._clientMoveH[this._orientationH] + this._modH
};
if (checkAvailableSpace) {
const absoluteOutput = {
top: this._hostPointsV[this._positionV] - this._clientMoveV[this._orientationV] + this._modV,
left: this._hostPointsH[this._positionH] - this._clientMoveH[this._orientationH] + this._modH
};
const _placementsMap = {
[npaPlacementVertical.top]: npaPlacementVertical.bottom,
[npaPlacementVertical.bottom]: npaPlacementVertical.top,
[npaPlacementVertical.center]: npaPlacementVertical.center,
[npaPlacementHorizontal.left]: npaPlacementHorizontal.right,
[npaPlacementHorizontal.right]: npaPlacementHorizontal.left
};
let _newPositionV = this._positionV;
let _newOrientationV = this._orientationV;
let _newPositionH = this._positionH;
let _newOrientationH = this._orientationH;
let _newModV = this._modV;
let _newModH = this._modH;
if (this._verticalSpaceNeeded(absoluteOutput)) {
_newPositionV = _placementsMap[this._positionV];
_newOrientationV = _placementsMap[this._orientationV];
_newModV *= -1;
}
if (this._horizontalSpaceNeeded(absoluteOutput)) {
_newPositionH = _placementsMap[this._positionH];
_newOrientationH = _placementsMap[this._orientationH];
_newModH *= -1;
}
const _position = `${_newPositionV} ${_newPositionH}`;
const _orientation = `${_newOrientationV} ${_newOrientationH}`;
const _modifiers = [_newModV, _newModH];
_output = this.positioningElement(_position, _orientation, _modifiers, false);
}
}
return _output;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2VtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL3BsYWNlbWVudC9wbGFjZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUlMLHdCQUF3QixFQUFFLHNCQUFzQixFQUloRCxpQkFBaUIsRUFBRSxvQkFBb0IsRUFHeEMsTUFBTSxtQkFBbUIsQ0FBQztBQUczQixNQUFNLE9BQU8sU0FBUztJQW1DcEIsWUFBWSxFQUFtQjtRQUM3QixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUVkLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFNBQXVCLEVBQUUsT0FBeUIsaUJBQWlCLENBQUMsUUFBUTtRQUNwRyxNQUFNLGVBQWUsR0FBa0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUEsZUFBZSxhQUFmLGVBQWUsdUJBQWYsZUFBZSxDQUFFLE1BQU0sTUFBSyxDQUFDLEVBQUU7WUFDakMsSUFBSSxJQUFJLEtBQUssaUJBQWlCLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQXlCLENBQUM7Z0JBQzdELElBQUksQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBMkIsQ0FBQzthQUNoRTtpQkFBTSxJQUFJLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBeUIsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUEyQixDQUFDO2FBQ25FO1NBQ0Y7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENB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QWEsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBMkIsQ0FBQztvQkFDMUUsZ0JBQWdCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQTJCLENBQUM7b0JBQ2hGLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFDaEI7Z0JBRUQsTUFBTSxTQUFTLEdBQWlCLEdBQUcsYUFBYSxJQUFJLGFBQWEsRUFBa0IsQ0FBQztnQkFDcEYsTUFBTSxZQUFZLEdBQWlCLEdBQUcsZ0JBQWdCLElBQUksZ0JBQWdCLEVBQWtCLENBQUM7Z0JBQzdGLE1BQU0sVUFBVSxHQUFrQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDdkQsT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUMvRTtTQUNGO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQm94TW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vYm94LW1vZGVsL2JveC1tb2RlbC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIG5wYVBsYWNlbWVudCxcbiAgTnBhUGxhY2VtZW50LFxuICBOcGFQbGFjZW1lbnRFbGVtZW50VHlwZSxcbiAgbnBhUGxhY2VtZW50RWxlbWVudFR5cGVzLCBucGFQbGFjZW1lbnRIb3Jpem9udGFsLFxuICBOcGFQbGFjZW1lbnRIb3Jpem9udGFsLCBucGFQbGFjZW1lbnRJbnNpZGVBdXRvTWFyZ2lucyxcbiAgbnBhUGxhY2VtZW50SW5zaWRlQXV0b09yaWVudGF0aW9ucyxcbiAgTnBhUGxhY2VtZW50VHlwZSxcbiAgbnBhUGxhY2VtZW50VHlwZXMsIG5wYVBsYWNlbWVudFZlcnRpY2FsLFxuICBOcGFQbGFjZW1lbnRWZXJ0aWNhbCxcbiAgTnBhUG9zaXRpb25cbn0gZnJvbSAnLi9wbGFjZW1lbnQudHlwZXMnO1xuaW1wb3J0IHsgTnBhRWxlbWVudCB9IGZyb20gJy4uL190eXBlcy9lbGVtZW50LnR5cGVzJztcblxuZXhwb3J0IGNsYXNzIFBsYWNlbWVudCB7XG4gIHByaXZhdGUgX2JtOiBCb3hNb2RlbFNlcnZpY2U7XG5cbiAgcHJpdmF0ZSBfcmVsYXRpdmVFbGVtZW50OiBFbGVtZW50O1xuICBwcml2YXRlIF9yZWxhdGl2ZUVsZW1lbnRSZWN0OiBET01SZWN0O1xuXG4gIHByaXZhdGUgX2hvc3RFbGVtZW50OiBFbGVtZW50O1xuICBwcml2YXRlIF9ob3N0RWxlbWVudFJlY3Q6IERPTVJlY3Q7XG5cbiAgcHJpdmF0ZSBfY2xpZW50RWxlbWVudDogRWxlbWVudDtcbiAgcHJpdmF0ZSBfY2xpZW50RWxlbWVudFJlY3Q6IERPTVJlY3Q7XG5cbiAgcHJpdmF0ZSBfc2Nyb2xsRWxlbWVudDogRWxlbWVudDtcbiAgcHJpdmF0ZSBfc2Nyb2xsRWxlbWVudFJlY3Q6IERPTVJlY3Q7XG5cbiAgcHJpdmF0ZSBfYm91bmRhcnlFbGVtZW50OiBFbGVtZW50O1xuICBwcml2YXRlIF9ib3VuZGFyeUVsZW1lbnRSZWN0OiBET01SZWN0O1xuXG4gIHByaXZhdGUgX3JlbGF0aXZlRWxlbWVudFNldDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfc2Nyb2xsRWxlbWVudFNldDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfYm91bmRhcnlFbGVtZW50U2V0OiBib29sZWFuO1xuXG4gIHByaXZhdGUgX3Bvc2l0aW9uSDogTnBhUGxhY2VtZW50SG9yaXpvbnRhbDtcbiAgcHJpdmF0ZSBfcG9zaXRpb25WOiBOcGFQbGFjZW1lbnRWZXJ0aWNhbDtcbiAgcHJpdmF0ZSBfb3JpZW50YXRpb25IOiBOcGFQbGFjZW1lbnRIb3Jpem9udGFsO1xuICBwcml2YXRlIF9vcmllbnRhdGlvblY6IE5wYVBsYWNlbWVudFZlcnRpY2FsO1xuXG4gIHByaXZhdGUgX2hvc3RQb2ludHNWOiB7IFtrZXkgaW4gTnBhUGxhY2VtZW50VmVydGljYWxdOiBudW1iZXIgfTtcbiAgcHJpdmF0ZSBfaG9zdFBvaW50c0g6IHsgW2tleSBpbiBOcGFQbGFjZW1lbnRIb3Jpem9udGFsXTogbnVtYmVyIH07XG4gIHByaXZhdGUgX2NsaWVudE1vdmVWOiB7IFtrZXkgaW4gTnBhUGxhY2VtZW50VmVydGljYWxdOiBudW1iZXIgfTtcbiAgcHJpdmF0ZSBfY2xpZW50TW92ZUg6IHsgW2tleSBpbiBOcGFQbGFjZW1lbnRIb3Jpem9udGFsXTogbnVtYmVyIH07XG5cbiAgcHJpdmF0ZSBfbW9kVjogbnVtYmVyO1xuICBwcml2YXRlIF9tb2RIOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYm06IEJveE1vZGVsU2VydmljZSkge1xuICAgIHRoaXMuX2JtID0gYm07XG5cbiAgICB0aGlzLl9tb2RWID0gMDtcbiAgICB0aGlzLl9tb2RIID0gMDtcbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3NQbGFjZW1lbnQocGxhY2VtZW50OiBOcGFQbGFjZW1lbnQsIHR5cGU6IE5wYVBsYWNlbWVudFR5cGUgPSBucGFQbGFjZW1lbnRUeXBlcy5QT1NJVElPTik6IHZvaWQge1xuICAgIGNvbnN0IF9wbGFjZW1lbnRBcnJheTogQXJyYXk8c3RyaW5nPiA9IHBsYWNlbWVudC5zcGxpdCgnICcpO1xuICAgIGlmIChfcGxhY2VtZW50QXJyYXk/Lmxlbmd0aCA9PT0gMikge1xuICAgICAgaWYgKHR5cGUgPT09IG5wYVBsYWNlbWVudFR5cGVzLlBPU0lUSU9OKSB7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uViA9IF9wbGFjZW1lbnRBcnJheVswXSBhcyBOcGFQbGFjZW1lbnRWZXJ0aWNhbDtcbiAgICAgICAgdGhpcy5fcG9zaXRpb25IID0gX3BsYWNlbWVudEFycmF5WzFdIGFzIE5wYVBsYWNlbWVudEhvcml6b250YWw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IG5wYVBsYWNlbWVudFR5cGVzLk9SSUVOVEFUSU9OKSB7XG4gICAgICAgIHRoaXMuX29yaWVudGF0aW9uViA9IF9wbGFjZW1lbnRBcnJheVswXSBhcyBOcGFQbGFjZW1lbnRWZXJ0aWNhbDtcbiAgICAgICAgdGhpcy5fb3JpZW50YXRpb25IID0gX3BsYWNlbWVudEFycmF5WzFdIGFzIE5wYVBsYWNlbWVudEhvcml6b250YWw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2Vzc01vZGlmaWVycyhtb2RpZmllcnM6IG51bWJlciB8IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcbiAgICBpZiAoISFtb2RpZmllcnMgfHwgbW9kaWZpZXJzID09PSAwKSB7XG4gICAgICBsZXQgX21vZHM6IEFycmF5PG51bWJlcj4gPSBtb2RpZmllcnMgYXMgQXJyYXk8bnVtYmVyPjtcbiAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXJzID09PSAnbnVtYmVyJykge1xuICAgICAgICBfbW9kcyA9IFttb2RpZmllcnNdO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX21vZHMpICYmICEhX21vZHMubGVuZ3RoICYmIF9tb2RzLmxlbmd0aCA8PSAyKSB7XG4gICAgICAgIGlmICghIV9tb2RzWzBdIHx8IF9tb2RzWzBdID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fbW9kViA9IF9tb2RzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIV9tb2RzWzFdIHx8IF9tb2RzWzFdID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fbW9kSCA9IF9tb2RzWzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmlnaHRIb3Jpem9udGFsU3BhY2VOZWVkZWQoYWN0dWFsOiBOcGFQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhY3R1YWwubGVmdCArIHRoaXMuX2NsaWVudEVsZW1lbnRSZWN0LndpZHRoICsgdGhpcy5fbW9kSCA+IHRoaXMuX2JvdW5kYXJ5RWxlbWVudFJlY3QucmlnaHQ7XG4gIH1cblxuICBwcml2YXRlIF9sZWZ0SG9yaXpvbnRhbFNwYWNlTmVlZGVkKGFjdHVhbDogTnBhUG9zaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gYWN0dWFsLmxlZnQgPCB0aGlzLl9ib3VuZGFyeUVsZW1lbnRSZWN0LmxlZnQ7XG4gIH1cblxuICBwcml2YXRlIF9ib3R0b21WZXJ0aWNhbFNwYWNlTmVlZGVkKGFjdHVhbDogTnBhUG9zaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gYWN0dWFsLnRvcCArIHRoaXMuX2NsaWVudEVsZW1lbnRSZWN0LmhlaWdodCA+IHRoaXMuX2JvdW5kYXJ5RWxlbWVudFJlY3QuYm90dG9tO1xuICB9XG5cbiAgcHJpdmF0ZSBfdG9wVmVydGljYWxTcGFjZU5lZWRlZChhY3R1YWw6IE5wYVBvc2l0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFjdHVhbC50b3AgPCB0aGlzLl9ib3VuZGFyeUVsZW1lbnRSZWN0LnRvcDtcbiAgfVxuXG4gIHByaXZhdGUgX3ZlcnRpY2FsU3BhY2VOZWVkZWQoYWN0dWFsOiBOcGFQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl90b3BWZXJ0aWNhbFNwYWNlTmVlZGVkKGFjdHVhbCkgfHwgdGhpcy5fYm90dG9tVmVydGljYWxTcGFjZU5lZWRlZChhY3R1YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaG9yaXpvbnRhbFNwYWNlTmVlZGVkKGFjdHVhbDogTnBhUG9zaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbGVmdEhvcml6b250YWxTcGFjZU5lZWRlZChhY3R1YWwpIHx8IHRoaXMuX3JpZ2h0SG9yaXpvbnRhbFNwYWNlTmVlZGVkKGFjdHVhbCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RG9tRWxlbWVudChlbGVtZW50OiBOcGFFbGVtZW50LCB0eXBlOiBOcGFQbGFjZW1lbnRFbGVtZW50VHlwZSA9IG5wYVBsYWNlbWVudEVsZW1lbnRUeXBlcy5IT1NUKTogdm9pZCB7XG4gICAgY29uc3QgX2VsZW1lbnQ6IEVsZW1lbnQgPSB0aGlzLl9ibS5nZXRFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmICghIV9lbGVtZW50KSB7XG4gICAgICBpZiAodHlwZSA9PT0gbnBhUGxhY2VtZW50RWxlbWVudFR5cGVzLkhPU1QpIHtcbiAgICAgICAgdGhpcy5faG9zdEVsZW1lbnQgPSBfZWxlbWVudDtcbiAgICAgICAgdGhpcy5faG9zdEVsZW1lbnRSZWN0ID0gdGhpcy5faG9zdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuX2hvc3RQb2ludHNWID0ge1xuICAgICAgICAgIHRvcDogdGhpcy5faG9zdEVsZW1lbnRSZWN0LnRvcCxcbiAgICAgICAgICBjZW50ZXI6IHRoaXMuX2hvc3RFbGVtZW50UmVjdC50b3AgKyAodGhpcy5faG9zdEVsZW1lbnRSZWN0LmhlaWdodCAvIDIpLFxuICAgICAgICAgIGJvdHRvbTogdGhpcy5faG9zdEVsZW1lbnRSZWN0LmJvdHRvbVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9ob3N0UG9pbnRzSCA9IHtcbiAgICAgICAgICBsZWZ0OiB0aGlzLl9ob3N0RWxlbWVudFJlY3QubGVmdCxcbiAgICAgICAgICBjZW50ZXI6IHRoaXMuX2hvc3RFbGVtZW50UmVjdC5sZWZ0ICsgKHRoaXMuX2hvc3RFbGVtZW50UmVjdC53aWR0aCAvIDIpLFxuICAgICAgICAgIHJpZ2h0OiB0aGlzLl9ob3N0RWxlbWVudFJlY3QucmlnaHRcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gbnBhUGxhY2VtZW50RWxlbWVudFR5cGVzLkNMSUVOVCkge1xuICAgICAgICB0aGlzLl9jbGllbnRFbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgICAgIHRoaXMuX2NsaWVudEVsZW1lbnRSZWN0ID0gdGhpcy5fY2xpZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5fY2xpZW50TW92ZVYgPSB7XG4gICAgICAgICAgdG9wOiB0aGlzLl9jbGllbnRFbGVtZW50UmVjdC5oZWlnaHQsXG4gICAgICAgICAgY2VudGVyOiB0aGlzLl9jbGllbnRFbGVtZW50UmVjdC5oZWlnaHQgLyAyLFxuICAgICAgICAgIGJvdHRvbTogMFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9jbGllbnRNb3ZlSCA9IHtcbiAgICAgICAgICBsZWZ0OiB0aGlzLl9jbGllbnRFbGVtZW50UmVjdC53aWR0aCxcbiAgICAgICAgICBjZW50ZXI6IHRoaXMuX2NsaWVudEVsZW1lbnRSZWN0LndpZHRoIC8gMixcbiAgICAgICAgICByaWdodDogMFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBucGFQbGFjZW1lbnRFbGVtZW50VHlwZXMuUkVMQVRJVkUpIHtcbiAgICAgICAgdGhpcy5fcmVsYXRpdmVFbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgICAgIHRoaXMuX3JlbGF0aXZlRWxlbWVudFJlY3QgPSB0aGlzLl9yZWxhdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuX3JlbGF0aXZlRWxlbWVudFNldCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IG5wYVBsYWNlbWVudEVsZW1lbnRUeXBlcy5TQ1JPTEwpIHtcbiAgICAgICAgdGhpcy5fc2Nyb2xsRWxlbWVudCA9IF9lbGVtZW50O1xuICAgICAgICB0aGlzLl9zY3JvbGxFbGVtZW50UmVjdCA9IHRoaXMuX3Njcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuX3Njcm9sbEVsZW1lbnRTZXQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBucGFQbGFjZW1lbnRFbGVtZW50VHlwZXMuQk9VTkRBUlkpIHtcbiAgICAgICAgdGhpcy5fYm91bmRhcnlFbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgICAgIHRoaXMuX2JvdW5kYXJ5RWxlbWVudFJlY3QgPSB0aGlzLl9ib3VuZGFyeUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuX2JvdW5kYXJ5RWxlbWVudFNldCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHBvc2l0aW9uaW5nRWxlbWVudChcbiAgICBwb3NpdGlvbjogTnBhUGxhY2VtZW50LFxuICAgIG9yaWVudGF0aW9uOiBOcGFQbGFjZW1lbnQsXG4gICAgbW9kaWZpZXJzPzogbnVtYmVyIHwgQXJyYXk8bnVtYmVyPixcbiAgICBjaGVja0F2YWlsYWJsZVNwYWNlOiBib29sZWFuID0gZmFsc2VcbiAgKTogTnBhUG9zaXRpb24ge1xuICAgIGxldCBfb3V0cHV0OiBOcGFQb3NpdGlvbjtcbiAgICBpZiAoISF0aGlzLl9ob3N0RWxlbWVudCAmJiAhIXRoaXMuX2NsaWVudEVsZW1lbnQpIHtcbiAgICAgIGxldCBfY29ycmVjdGlvblY6IG51bWJlciA9IDA7XG4gICAgICBsZXQgX2NvcnJlY3Rpb25IOiBudW1iZXIgPSAwO1xuICAgICAgaWYgKHRoaXMuX3JlbGF0aXZlRWxlbWVudFNldCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Njcm9sbEVsZW1lbnRTZXQpIHtcbiAgICAgICAgICB0aGlzLl9zY3JvbGxFbGVtZW50ID0gdGhpcy5fcmVsYXRpdmVFbGVtZW50O1xuICAgICAgICAgIHRoaXMuX3Njcm9sbEVsZW1lbnRSZWN0ID0gdGhpcy5fc2Nyb2xsRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2JvdW5kYXJ5RWxlbWVudFNldCkge1xuICAgICAgICAgIHRoaXMuX2JvdW5kYXJ5RWxlbWVudCA9IHRoaXMuX3JlbGF0aXZlRWxlbWVudDtcbiAgICAgICAgICB0aGlzLl9ib3VuZGFyeUVsZW1lbnRSZWN0ID0gdGhpcy5fYm91bmRhcnlFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIF9jb3JyZWN0aW9uViA9IHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsVG9wIC0gdGhpcy5fcmVsYXRpdmVFbGVtZW50UmVjdC50b3A7XG4gICAgICAgIF9jb3JyZWN0aW9uSCA9IHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsTGVmdCAtIHRoaXMuX3JlbGF0aXZlRWxlbWVudFJlY3QubGVmdDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcHJvY2Vzc01vZGlmaWVycyhtb2RpZmllcnMpO1xuXG4gICAgICB0aGlzLl9wcm9jZXNzUGxhY2VtZW50KHBvc2l0aW9uKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NQbGFjZW1lbnQob3JpZW50YXRpb24sIG5wYVBsYWNlbWVudFR5cGVzLk9SSUVOVEFUSU9OKTtcblxuICAgICAgX291dHB1dCA9IHtcbiAgICAgICAgdG9wOiB0aGlzLl9ob3N0UG9pbnRzVlt0aGlzLl9wb3NpdGlvblZdICsgX2NvcnJlY3Rpb25WIC0gdGhpcy5fY2xpZW50TW92ZVZbdGhpcy5fb3JpZW50YXRpb25WXSArIHRoaXMuX21vZFYsXG4gICAgICAgIGxlZnQ6IHRoaXMuX2hvc3RQb2ludHNIW3RoaXMuX3Bvc2l0aW9uSF0gKyBfY29ycmVjdGlvbkggLSB0aGlzLl9jbGllbnRNb3ZlSFt0aGlzLl9vcmllbnRhdGlvbkhdICsgdGhpcy5fbW9kSFxuICAgICAgfTtcblxuXG4gICAgICBpZiAoY2hlY2tBdmFpbGFibGVTcGFjZSkge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZU91dHB1dDogTnBhUG9zaXRpb24gPSB7XG4gICAgICAgICAgdG9wOiB0aGlzLl9ob3N0UG9pbnRzVlt0aGlzLl9wb3NpdGlvblZdIC0gdGhpcy5fY2xpZW50TW92ZVZbdGhpcy5fb3JpZW50YXRpb25WXSArIHRoaXMuX21vZFYsXG4gICAgICAgICAgbGVmdDogdGhpcy5faG9zdFBvaW50c0hbdGhpcy5fcG9zaXRpb25IXSAtIHRoaXMuX2NsaWVudE1vdmVIW3RoaXMuX29yaWVudGF0aW9uSF0gKyB0aGlzLl9tb2RIXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IF9wbGFjZW1lbnRzTWFwOiBSZWNvcmQ8TnBhUGxhY2VtZW50VmVydGljYWwgfCBOcGFQbGFjZW1lbnRIb3Jpem9udGFsLCBOcGFQbGFjZW1lbnRWZXJ0aWNhbCB8IE5wYVBsYWNlbWVudEhvcml6b250YWw+ID0ge1xuICAgICAgICAgIFtucGFQbGFjZW1lbnRWZXJ0aWNhbC50b3BdOiBucGFQbGFjZW1lbnRWZXJ0aWNhbC5ib3R0b20sXG4gICAgICAgICAgW25wYVBsYWNlbWVudFZlcnRpY2FsLmJvdHRvbV06IG5wYVBsYWNlbWVudFZlcnRpY2FsLnRvcCxcbiAgICAgICAgICBbbnBhUGxhY2VtZW50VmVydGljYWwuY2VudGVyXTogbnBhUGxhY2VtZW50VmVydGljYWwuY2VudGVyLFxuICAgICAgICAgIFtucGFQbGFjZW1lbnRIb3Jpem9udGFsLmxlZnRdOiBucGFQbGFjZW1lbnRIb3Jpem9udGFsLnJpZ2h0LFxuICAgICAgICAgIFtucGFQbGFjZW1lbnRIb3Jpem9udGFsLnJpZ2h0XTogbnBhUGxhY2VtZW50SG9yaXpvbnRhbC5sZWZ0XG4gICAgICAgIH07XG4gICAgICAgIGxldCBfbmV3UG9zaXRpb25WOiBOcGFQbGFjZW1lbnRWZXJ0aWNhbCA9IHRoaXMuX3Bvc2l0aW9uVjtcbiAgICAgICAgbGV0IF9uZXdPcmllbnRhdGlvblY6IE5wYVBsYWNlbWVudFZlcnRpY2FsID0gdGhpcy5fb3JpZW50YXRpb25WO1xuICAgICAgICBsZXQgX25ld1Bvc2l0aW9uSDogTnBhUGxhY2VtZW50SG9yaXpvbnRhbCA9IHRoaXMuX3Bvc2l0aW9uSDtcbiAgICAgICAgbGV0IF9uZXdPcmllbnRhdGlvbkg6IE5wYVBsYWNlbWVudEhvcml6b250YWwgPSB0aGlzLl9vcmllbnRhdGlvbkg7XG4gICAgICAgIGxldCBfbmV3TW9kVjogbnVtYmVyID0gdGhpcy5fbW9kVjtcbiAgICAgICAgbGV0IF9uZXdNb2RIOiBudW1iZXIgPSB0aGlzLl9tb2RIO1xuXG5cbiAgICAgICAgaWYgKHRoaXMuX3ZlcnRpY2FsU3BhY2VOZWVkZWQoYWJzb2x1dGVPdXRwdXQpKSB7XG4gICAgICAgICAgX25ld1Bvc2l0aW9uViA9IF9wbGFjZW1lbnRzTWFwW3RoaXMuX3Bvc2l0aW9uVl0gYXMgTnBhUGxhY2VtZW50VmVydGljYWw7XG4gICAgICAgICAgX25ld09yaWVudGF0aW9uViA9IF9wbGFjZW1lbnRzTWFwW3RoaXMuX29yaWVudGF0aW9uVl0gYXMgTnBhUGxhY2VtZW50VmVydGljYWw7XG4gICAgICAgICAgX25ld01vZFYgKj0gLTE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faG9yaXpvbnRhbFNwYWNlTmVlZGVkKGFic29sdXRlT3V0cHV0KSkge1xuICAgICAgICAgIF9uZXdQb3NpdGlvbkggPSBfcGxhY2VtZW50c01hcFt0aGlzLl9wb3NpdGlvbkhdIGFzIE5wYVBsYWNlbWVudEhvcml6b250YWw7XG4gICAgICAgICAgX25ld09yaWVudGF0aW9uSCA9IF9wbGFjZW1lbnRzTWFwW3RoaXMuX29yaWVudGF0aW9uSF0gYXMgTnBhUGxhY2VtZW50SG9yaXpvbnRhbDtcbiAgICAgICAgICBfbmV3TW9kSCAqPSAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IF9wb3NpdGlvbjogTnBhUGxhY2VtZW50ID0gYCR7X25ld1Bvc2l0aW9uVn0gJHtfbmV3UG9zaXRpb25IfWAgYXMgTnBhUGxhY2VtZW50O1xuICAgICAgICBjb25zdCBfb3JpZW50YXRpb246IE5wYVBsYWNlbWVudCA9IGAke19uZXdPcmllbnRhdGlvblZ9ICR7X25ld09yaWVudGF0aW9uSH1gIGFzIE5wYVBsYWNlbWVudDtcbiAgICAgICAgY29uc3QgX21vZGlmaWVyczogQXJyYXk8bnVtYmVyPiA9IFtfbmV3TW9kViwgX25ld01vZEhdO1xuICAgICAgICBfb3V0cHV0ID0gdGhpcy5wb3NpdGlvbmluZ0VsZW1lbnQoX3Bvc2l0aW9uLCBfb3JpZW50YXRpb24sIF9tb2RpZmllcnMsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9vdXRwdXQ7XG4gIH1cbn1cbiJdfQ==