angular-responsive-carousel
Version:
Carousel for Angular. A simple solution for horizontal scrolling images with lazy loading.
397 lines • 52.2 kB
JavaScript
export class Slide {
constructor(carouselProperties, utils, cells, container) {
this.carouselProperties = carouselProperties;
this.utils = utils;
this.cells = cells;
this.container = container;
this.slideLength = 0;
this.isSlideInProgress = false;
this.counter = 0;
this._counter = 0;
this.distance = 0;
this.distanceAbs = 0;
this.isNotClickOnArrow = false;
this.initialPositionX = 0;
this.currentPositionX = 0;
/* The slide length has been limited by the limitSlideLength() method */
this.isSlideLengthLimited = false;
this.init();
}
get fullCellWidth() {
return this.carouselProperties.cellWidth + this.carouselProperties.margin;
}
get margin() {
return this.carouselProperties.margin;
}
get minSwipeDistance() {
return this.carouselProperties.minSwipeDistance;
}
get numberOfVisibleCells() {
return this.utils.numberOfVisibleCells;
}
get visibleCellsOverflowContainer() {
return this.utils.visibleCellsOverflowContainer;
}
/* The position to which the container returns after each slide
* in the light DUM tree mode.
*/
get fixedContainerPosition() {
return -(this.overflowCellsLimit * this.fullCellWidth);
}
get overflowCellsLimit() {
return this.utils.overflowCellsLimit;
}
get images() {
return this.carouselProperties.images;
}
/* Number of cell elements in the DUM tree */
get cellLength() {
if (this.isLightDOM) {
return this.cells.cellLengthInLightDOMMode;
}
else {
if (this.images) {
return this.images.length;
}
else {
return this.cells.cellLength;
}
}
}
get isLightDOM() {
return this.carouselProperties.lightDOM || this.carouselProperties.loop;
}
updateProperties(carouselProperties) {
this.carouselProperties = carouselProperties;
this.setVisibleWidth();
}
init() {
this.visibleWidth = this.carouselProperties.visibleWidth || this.carouselProperties.hostElement.clientWidth;
}
handleTouchstart() {
/* Touchstart event is not called for arrow */
this.isNotClickOnArrow = true;
this.isSlideLengthLimited = false;
if (!this.isSlideInProgress) {
this.initialPositionX = this.container.getCurrentPositionX();
}
}
handleTouchend() {
if (!this.isNotClickOnArrow) {
return;
}
this.currentPositionX = this.container.getCurrentPositionX();
this.distanceAbs = Math.abs(this.initialPositionX - this.currentPositionX);
this.distance = this.initialPositionX - this.currentPositionX;
this.direction = this.getDirection();
this.isNotClickOnArrow = false;
this.handleSlide();
}
handleTransitionend() {
this.setCounter();
this.isSlideInProgress = false;
if (this.isLightDOM) {
this.alignContainerFast();
}
}
handleSlide(customSlideLength = undefined) {
let isUsingButton = customSlideLength;
let newPositionX;
if (isUsingButton && this.isSlideInProgress || !this.direction) {
return;
}
/* Custom slide length is used in arrows */
if (customSlideLength) {
this.slideLength = this.limitSlideLength(customSlideLength);
if (!this.isSlideInProgress) {
this.initialPositionX = this.container.getCurrentPositionX();
}
}
else {
this.slideLength = this.getSlideLength(this.distanceAbs);
}
/* Store intermediate counter value */
this._counter = this.getPreliminaryCounter();
if (this.direction === 'left') {
if (!customSlideLength) {
this.slideLength = this.limitSlideLength(this.getSlideLength(this.distanceAbs));
}
this._counter = this.getPreliminaryCounter();
let isSlidesEnd = this.isSlidesEnd(this._counter);
newPositionX = this.getPositionByIndex(this._counter);
if (isSlidesEnd) {
this._counter = this.counter;
newPositionX = this.getPositionByIndex(this.counter);
this.slideLength = 0;
}
}
if (this.direction === 'right') {
if (!customSlideLength) {
this.slideLength = this.getSlideLength(this.distanceAbs);
}
if (this._counter < 0) {
this._counter = this.counter;
this.slideLength = this.counter;
}
newPositionX = this.getPositionByIndex(this.counter - this.slideLength);
}
if (this.container.getCurrentPositionX() !== newPositionX) {
this.isSlideInProgress = true;
this.container.transformPositionX(newPositionX);
}
}
next(length = 1) {
this.direction = 'left';
this.handleSlide(length);
}
prev(length = 1) {
this.direction = 'right';
this.handleSlide(length);
}
select(index) {
if (index > this.cellLength - 1) {
return;
}
if (index > this.counter) {
let length = index - this.counter;
this.next(length);
}
if (index < this.counter) {
let length = this.counter - index;
this.prev(length);
}
}
getPreliminaryCounter() {
if (this.direction === 'left') {
return this.counter + this.slideLength;
}
if (this.direction === 'right') {
return this.counter - this.slideLength;
}
return 0;
}
/*
* Limits the length of the slide during calls to the next() and prev()
* methods if the specified position is outside the cell length
*/
limitSlideLength(slideLength) {
if (slideLength > 1) {
for (var i = 0; i < slideLength; i++) {
let newCounter = this.counter + (slideLength - i);
if (!this.isSlidesEnd(newCounter)) {
slideLength = slideLength - i;
this.isSlideLengthLimited = i > 0;
break;
}
}
}
return slideLength;
}
/* Offset the container to show the last cell completely */
getPositionCorrection(counter) {
let correction = 0;
let isLastSlide = this.isLastSlide(counter);
if (this.carouselProperties.loop || this.direction === "right") {
return 0;
}
if (this.isSlideLengthLimited || isLastSlide) {
let cellsWidth = this.cells.cellLengthInLightDOMMode * this.fullCellWidth;
if (this.visibleWidth < cellsWidth) {
correction = -(this.numberOfVisibleCells * this.fullCellWidth - this.visibleWidth - this.margin);
}
if (correction >= -this.margin) {
correction = 0;
}
}
return correction;
}
getSlideLength(distanceAbs) {
let isLastSlide = this.isLastSlide(this.counter);
/* If the last cell does not fit entirely, then the
* length of the swipe to the left, from the extreme
* right position, may be shorter than usual.
*/
if (isLastSlide && this.direction === "right") {
distanceAbs = distanceAbs + this.visibleWidth % this.fullCellWidth;
}
let length = Math.floor(distanceAbs / this.fullCellWidth);
if (distanceAbs % this.fullCellWidth >= this.minSwipeDistance) {
length++;
}
return length;
}
getDistanceAbs() {
return Math.abs(this.initialPositionX - this.currentPositionX);
}
getDirection() {
const direction = Math.sign(this.initialPositionX - this.currentPositionX);
if (direction === -1) {
return 'right';
}
if (direction === 1) {
return 'left';
}
return undefined;
}
isSlidesEnd(counter) {
let margin = this.visibleCellsOverflowContainer ? 1 : 0;
let imageLength = this.images ? this.images.length : this.cells.cellLength;
if (this.carouselProperties.loop) {
return false;
}
else {
return (imageLength - counter + margin) < this.numberOfVisibleCells;
}
}
isLastSlide(counter) {
return this.isSlidesEnd(counter + 1);
}
setCounter() {
if (this.direction === 'left') {
this.counter = this.counter + this.slideLength;
}
if (this.direction === 'right') {
this.counter = this.counter - this.slideLength;
}
}
getPositionByIndex(_counter) {
let correction = this.getPositionCorrection(this.counter + this.slideLength);
let position;
if (correction !== 0) {
correction = correction + this.fullCellWidth;
}
if (this.direction === 'right') {
correction = 0;
}
if (this.isLightDOM && this.isLightDOMMode(_counter) ||
this.isLightDOM && this.ifLeftDOMModeAtEnd(_counter)) {
let initialPosition = this.getPositionWithoutCorrection(this.initialPositionX);
let counterDifference = _counter - this.counter;
position = initialPosition - ((counterDifference * this.fullCellWidth) - correction);
}
else {
position = -((_counter * this.fullCellWidth) - correction);
}
position = this.provideSafePosition(position);
return position;
}
provideSafePosition(position) {
const endPosition = this.container.getEndPosition();
if (this.direction === 'left') {
if (position > 0) {
position = 0;
}
}
if (this.direction === 'right') {
if (position < endPosition) {
position = endPosition;
}
}
return position;
}
getPositionWithoutCorrection(value) {
let remainder = Math.round(value) % this.fullCellWidth;
if (remainder !== 0) {
return value - (this.fullCellWidth + remainder);
}
else {
return value;
}
}
isNextArrowDisabled() {
return this.isLastSlide(this.counter) ||
(!this.visibleCellsOverflowContainer && this.cellLength <= this.numberOfVisibleCells) ||
(this.visibleCellsOverflowContainer && this.cellLength < this.numberOfVisibleCells);
}
isPrevArrowDisabled() {
return this.counter === 0;
}
alignContainerFast() {
if (this.isLightDOMMode(this.counter)) {
let positionX = this.fixedContainerPosition;
this.container.transformPositionX(positionX, 0);
this.cells.setCounter(this.counter);
this.cells.lineUp();
}
else if (this.ifLeftDOMModeToBeginning(this.counter)) {
/* If we have already exited the light DOM mode but
* the cells are still out of place
*/
if (this.cells.ifSequenceOfCellsIsChanged()) {
let positionX = -(this.counter * this.fullCellWidth);
this.container.transformPositionX(positionX, 0);
this.cells.setCounter(this.counter);
this.cells.lineUp();
}
}
else if (this.ifLeftDOMModeAtEnd(this.counter)) {
let containerPositionX = this.container.getCurrentPositionX();
let containerWidth = this.container.getWidth();
this.visibleWidth;
if (this.isLastSlide(this.counter) &&
containerWidth + containerPositionX >= this.visibleWidth) {
return;
}
let correction = this.getPositionCorrection(this.counter);
if (correction !== 0) {
correction = correction + this.fullCellWidth;
}
if (this.direction === 'right') {
correction = 0;
}
let positionX = this.fixedContainerPosition + correction;
this.container.transformPositionX(positionX, 0);
this.cells.setCounter(this.counter);
this.cells.lineUp();
}
}
isLightDOMMode(counter) {
let flag;
let remainderOfCells = this.images.length - this.overflowCellsLimit - this.numberOfVisibleCells;
if (!this.isLightDOM) {
return false;
}
if (counter > this.overflowCellsLimit && this.direction === "left" &&
counter <= remainderOfCells) {
flag = true;
}
if (counter >= this.overflowCellsLimit && this.direction === "right" &&
counter < remainderOfCells) {
flag = true;
}
if (this.counter > this.overflowCellsLimit && this.direction === "left" &&
this.counter <= remainderOfCells) {
flag = true;
}
if (this.counter >= this.overflowCellsLimit && this.direction === "right" &&
this.counter < remainderOfCells) {
flag = true;
}
return flag;
}
ifLeftDOMModeAtEnd(counter) {
let flag;
let remainderOfCells = this.images.length - this.overflowCellsLimit - this.numberOfVisibleCells;
if (counter >= remainderOfCells) {
flag = true;
}
if (this.counter >= remainderOfCells) {
flag = true;
}
return flag;
}
ifLeftDOMModeToBeginning(counter) {
let flag;
if (counter <= this.overflowCellsLimit) {
flag = true;
}
if (this.counter <= this.overflowCellsLimit) {
flag = true;
}
return flag;
}
setVisibleWidth() {
this.visibleWidth = this.carouselProperties.visibleWidth || this.carouselProperties.hostElement.clientWidth;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXJlc3BvbnNpdmUtY2Fyb3VzZWwvc3JjL2xpYi9zbGlkZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxNQUFNLE9BQU8sS0FBSztJQW9FZCxZQUFvQixrQkFBc0MsRUFDOUMsS0FBVSxFQUNWLEtBQVUsRUFDVixTQUFjO1FBSE4sdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUM5QyxVQUFLLEdBQUwsS0FBSyxDQUFLO1FBQ1YsVUFBSyxHQUFMLEtBQUssQ0FBSztRQUNWLGNBQVMsR0FBVCxTQUFTLENBQUs7UUF0RTFCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUVuQyxZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFDckIsYUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQixnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUV4QixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBQzdCLHFCQUFnQixHQUFXLENBQUMsQ0FBQztRQUU3Qix3RUFBd0U7UUFDeEUseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBMkRsQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQTFERCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztJQUM5RSxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNoQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQztJQUNwRCxDQUFDO0lB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SUFBSSxnQkFBZ0IsRUFBRTtZQUNsQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsd0JBQXdCLENBQUMsT0FBZTtRQUNwQyxJQUFJLElBQUksQ0FBQztRQUVULElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUNwQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3pDLElBQUksR0FBRyxJQUFJLENBQUM7U0FDZjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO0lBQ2hILENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UHJvcGVydGllcyBhcyBDYXJvdXNlbFByb3BlcnRpZXN9IGZyb20gJy4vaW50ZXJmYWNlcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnRpZXMge1xyXG4gICAgY2Fyb3VzZWxQcm9wZXJ0aWVzOiBDYXJvdXNlbFByb3BlcnRpZXM7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTbGlkZSB7XHJcbiAgICBzbGlkZUxlbmd0aDogbnVtYmVyID0gMDtcclxuICAgIGlzU2xpZGVJblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCcgfCB1bmRlZmluZWQ7XHJcbiAgICBjb3VudGVyOiBudW1iZXIgPSAwO1xyXG4gICAgX2NvdW50ZXI6IG51bWJlciA9IDA7XHJcbiAgICBkaXN0YW5jZTogbnVtYmVyID0gMDtcclxuICAgIGRpc3RhbmNlQWJzOiBudW1iZXIgPSAwO1xyXG4gICAgdmlzaWJsZVdpZHRoITogbnVtYmVyO1xyXG4gICAgaXNOb3RDbGlja09uQXJyb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGluaXRpYWxQb3NpdGlvblg6IG51bWJlciA9IDA7XHJcbiAgICBjdXJyZW50UG9zaXRpb25YOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qIFRoZSBzbGlkZSBsZW5ndGggaGFzIGJlZW4gbGltaXRlZCBieSB0aGUgbGltaXRTbGlkZUxlbmd0aCgpIG1ldGhvZCAqL1xyXG4gICAgaXNTbGlkZUxlbmd0aExpbWl0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgZnVsbENlbGxXaWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMuY2VsbFdpZHRoICsgdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubWFyZ2luO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtYXJnaW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLm1hcmdpbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWluU3dpcGVEaXN0YW5jZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubWluU3dpcGVEaXN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbnVtYmVyT2ZWaXNpYmxlQ2VsbHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXRpbHMubnVtYmVyT2ZWaXNpYmxlQ2VsbHM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZpc2libGVDZWxsc092ZXJmbG93Q29udGFpbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnV0aWxzLnZpc2libGVDZWxsc092ZXJmbG93Q29udGFpbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFRoZSBwb3NpdGlvbiB0byB3aGljaCB0aGUgY29udGFpbmVyIHJldHVybnMgYWZ0ZXIgZWFjaCBzbGlkZSBcclxuICAgICAqIGluIHRoZSBsaWdodCBEVU0gdHJlZSBtb2RlLiBcclxuICAgICAqL1xyXG4gICAgZ2V0IGZpeGVkQ29udGFpbmVyUG9zaXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIC0odGhpcy5vdmVyZmxvd0NlbGxzTGltaXQgKiB0aGlzLmZ1bGxDZWxsV2lkdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvdmVyZmxvd0NlbGxzTGltaXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXRpbHMub3ZlcmZsb3dDZWxsc0xpbWl0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpbWFnZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmltYWdlcztcclxuICAgIH1cclxuXHJcbiAgICAvKiBOdW1iZXIgb2YgY2VsbCBlbGVtZW50cyBpbiB0aGUgRFVNIHRyZWUgKi9cclxuICAgIGdldCBjZWxsTGVuZ3RoKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTGlnaHRET00pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHMuY2VsbExlbmd0aEluTGlnaHRET01Nb2RlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmltYWdlcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzLmxlbmd0aDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNlbGxzLmNlbGxMZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzTGlnaHRET00oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmxpZ2h0RE9NIHx8IHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmxvb3A7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjYXJvdXNlbFByb3BlcnRpZXM6IENhcm91c2VsUHJvcGVydGllcyxcclxuICAgICAgICBwcml2YXRlIHV0aWxzOiBhbnksXHJcbiAgICAgICAgcHJpdmF0ZSBjZWxsczogYW55LFxyXG4gICAgICAgIHByaXZhdGUgY29udGFpbmVyOiBhbnkpIHtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlUHJvcGVydGllcyhjYXJvdXNlbFByb3BlcnRpZXM6IENhcm91c2VsUHJvcGVydGllcykge1xyXG4gICAgICAgIHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzID0gY2Fyb3VzZWxQcm9wZXJ0aWVzO1xyXG4gICAgICAgIHRoaXMuc2V0VmlzaWJsZVdpZHRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICB0aGlzLnZpc2libGVXaWR0aCA9IHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLnZpc2libGVXaWR0aCB8fCB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5ob3N0RWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVUb3VjaHN0YXJ0KCkge1xyXG4gICAgICAgIC8qIFRvdWNoc3RhcnQgZXZlbnQgaXMgbm90IGNhbGxlZCBmb3IgYXJyb3cgKi9cclxuICAgICAgICB0aGlzLmlzTm90Q2xpY2tPbkFycm93ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzU2xpZGVMZW5ndGhMaW1pdGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pc1NsaWRlSW5Qcm9ncmVzcykge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxQb3NpdGlvblggPSB0aGlzLmNvbnRhaW5lci5nZXRDdXJyZW50UG9zaXRpb25YKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVRvdWNoZW5kKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc05vdENsaWNrT25BcnJvdykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudFBvc2l0aW9uWCA9IHRoaXMuY29udGFpbmVyLmdldEN1cnJlbnRQb3NpdGlvblgoKTtcclxuICAgICAgICB0aGlzLmRpc3RhbmNlQWJzID0gTWF0aC5hYnModGhpcy5pbml0aWFsUG9zaXRpb25YIC0gdGhpcy5jdXJyZW50UG9zaXRpb25YKTtcclxuICAgICAgICB0aGlzLmRpc3RhbmNlID0gdGhpcy5pbml0aWFsUG9zaXRpb25YIC0gdGhpcy5jdXJyZW50UG9zaXRpb25YO1xyXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5nZXREaXJlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLmlzTm90Q2xpY2tPbkFycm93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVTbGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVRyYW5zaXRpb25lbmQoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb3VudGVyKCk7XHJcbiAgICAgICAgdGhpcy5pc1NsaWRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0xpZ2h0RE9NKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWxpZ25Db250YWluZXJGYXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNsaWRlKGN1c3RvbVNsaWRlTGVuZ3RoOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBsZXQgaXNVc2luZ0J1dHRvbiA9IGN1c3RvbVNsaWRlTGVuZ3RoO1xyXG4gICAgICAgIGxldCBuZXdQb3NpdGlvblg7XHJcblxyXG4gICAgICAgIGlmIChpc1VzaW5nQnV0dG9uICYmIHRoaXMuaXNTbGlkZUluUHJvZ3Jlc3MgfHwgIXRoaXMuZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIEN1c3RvbSBzbGlkZSBsZW5ndGggaXMgdXNlZCBpbiBhcnJvd3MgKi9cclxuICAgICAgICBpZiAoY3VzdG9tU2xpZGVMZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5zbGlkZUxlbmd0aCA9IHRoaXMubGltaXRTbGlkZUxlbmd0aChjdXN0b21TbGlkZUxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTbGlkZUluUHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFBvc2l0aW9uWCA9IHRoaXMuY29udGFpbmVyLmdldEN1cnJlbnRQb3NpdGlvblgoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2xpZGVMZW5ndGggPSB0aGlzLmdldFNsaWRlTGVuZ3RoKHRoaXMuZGlzdGFuY2VBYnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogU3RvcmUgaW50ZXJtZWRpYXRlIGNvdW50ZXIgdmFsdWUgKi9cclxuICAgICAgICB0aGlzLl9jb3VudGVyID0gdGhpcy5nZXRQcmVsaW1pbmFyeUNvdW50ZXIoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcclxuICAgICAgICAgICAgaWYgKCFjdXN0b21TbGlkZUxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZUxlbmd0aCA9IHRoaXMubGltaXRTbGlkZUxlbmd0aCh0aGlzLmdldFNsaWRlTGVuZ3RoKHRoaXMuZGlzdGFuY2VBYnMpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fY291bnRlciA9IHRoaXMuZ2V0UHJlbGltaW5hcnlDb3VudGVyKCk7XHJcbiAgICAgICAgICAgIGxldCBpc1NsaWRlc0VuZCA9IHRoaXMuaXNTbGlkZXNFbmQodGhpcy5fY291bnRlcik7XHJcbiAgICAgICAgICAgIG5ld1Bvc2l0aW9uWCA9IHRoaXMuZ2V0UG9zaXRpb25CeUluZGV4KHRoaXMuX2NvdW50ZXIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzU2xpZGVzRW5kKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb3VudGVyID0gdGhpcy5jb3VudGVyO1xyXG5cclxuICAgICAgICAgICAgICAgIG5ld1Bvc2l0aW9uWCA9IHRoaXMuZ2V0UG9zaXRpb25CeUluZGV4KHRoaXMuY291bnRlcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlTGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XHJcbiAgICAgICAgICAgIGlmICghY3VzdG9tU2xpZGVMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVMZW5ndGggPSB0aGlzLmdldFNsaWRlTGVuZ3RoKHRoaXMuZGlzdGFuY2VBYnMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY291bnRlciA8IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLmNvdW50ZXI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlTGVuZ3RoID0gdGhpcy5jb3VudGVyO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBuZXdQb3NpdGlvblggPSB0aGlzLmdldFBvc2l0aW9uQnlJbmRleCh0aGlzLmNvdW50ZXIgLSB0aGlzLnNsaWRlTGVuZ3RoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5nZXRDdXJyZW50UG9zaXRpb25YKCkgIT09IG5ld1Bvc2l0aW9uWCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzU2xpZGVJblByb2dyZXNzID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIudHJhbnNmb3JtUG9zaXRpb25YKG5ld1Bvc2l0aW9uWCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5leHQobGVuZ3RoOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSAnbGVmdCc7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVTbGlkZShsZW5ndGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZXYobGVuZ3RoOiBudW1iZXIgPSAxKSB7XHJcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSAncmlnaHQnO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlU2xpZGUobGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3QoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChpbmRleCA+IHRoaXMuY2VsbExlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID4gdGhpcy5jb3VudGVyKSB7XHJcbiAgICAgICAgICAgIGxldCBsZW5ndGggPSBpbmRleCAtIHRoaXMuY291bnRlcjtcclxuICAgICAgICAgICAgdGhpcy5uZXh0KGxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5kZXggPCB0aGlzLmNvdW50ZXIpIHtcclxuICAgICAgICAgICAgbGV0IGxlbmd0aCA9IHRoaXMuY291bnRlciAtIGluZGV4O1xyXG4gICAgICAgICAgICB0aGlzLnByZXYobGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJlbGltaW5hcnlDb3VudGVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50ZXIgKyB0aGlzLnNsaWRlTGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50ZXIgLSB0aGlzLnNsaWRlTGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyogIFxyXG4gICAgICogTGltaXRzIHRoZSBsZW5ndGggb2YgdGhlIHNsaWRlIGR1cmluZyBjYWxscyB0byB0aGUgbmV4dCgpIGFuZCBwcmV2KCkgXHJcbiAgICAgKiBtZXRob2RzIGlmIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaXMgb3V0c2lkZSB0aGUgY2VsbCBsZW5ndGggXHJcbiAgICAgKi9cclxuICAgIGxpbWl0U2xpZGVMZW5ndGgoc2xpZGVMZW5ndGg6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChzbGlkZUxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGlkZUxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmV3Q291bnRlciA9IHRoaXMuY291bnRlciArIChzbGlkZUxlbmd0aCAtIGkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NsaWRlc0VuZChuZXdDb3VudGVyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNsaWRlTGVuZ3RoID0gc2xpZGVMZW5ndGggLSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTbGlkZUxlbmd0aExpbWl0ZWQgPSBpID4gMDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2xpZGVMZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyogT2Zmc2V0IHRoZSBjb250YWluZXIgdG8gc2hvdyB0aGUgbGFzdCBjZWxsIGNvbXBsZXRlbHkgKi9cclxuICAgIGdldFBvc2l0aW9uQ29ycmVjdGlvbihjb3VudGVyOm51bWJlcikge1xyXG4gICAgICAgIGxldCBjb3JyZWN0aW9uID0gMDtcclxuICAgICAgICBsZXQgaXNMYXN0U2xpZGUgPSB0aGlzLmlzTGFzdFNsaWRlKGNvdW50ZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubG9vcCB8fCB0aGlzLmRpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTbGlkZUxlbmd0aExpbWl0ZWQgfHwgaXNMYXN0U2xpZGUpIHtcclxuICAgICAgICAgICAgbGV0IGNlbGxzV2lkdGggPSB0aGlzLmNlbGxzLmNlbGxMZW5ndGhJbkxpZ2h0RE9NTW9kZSAqIHRoaXMuZnVsbENlbGxXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZpc2libGVXaWR0aCA8IGNlbGxzV2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIGNvcnJlY3Rpb24gPSAtKHRoaXMubnVtYmVyT2ZWaXNpYmxlQ2VsbHMgKiB0aGlzLmZ1bGxDZWxsV2lkdGggLSB0aGlzLnZpc2libGVXaWR0aCAtIHRoaXMubWFyZ2luKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvcnJlY3Rpb24gPj0gLXRoaXMubWFyZ2luKSB7XHJcbiAgICAgICAgICAgICAgICBjb3JyZWN0aW9uID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvcnJlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2xpZGVMZW5ndGgoZGlzdGFuY2VBYnM6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBpc0xhc3RTbGlkZSA9IHRoaXMuaXNMYXN0U2xpZGUodGhpcy5jb3VudGVyKTtcclxuXHJcbiAgICAgICAgLyogSWYgdGhlIGxhc3QgY2VsbCBkb2VzIG5vdCBmaXQgZW50aXJlbHksIHRoZW4gdGhlIFxyXG4gICAgICAgICAqIGxlbmd0aCBvZiB0aGUgc3dpcGUgdG8gdGhlIGxlZnQsIGZyb20gdGhlIGV4dHJlbWUgXHJcbiAgICAgICAgICogcmlnaHQgcG9zaXRpb24sIG1heSBiZSBzaG9ydGVyIHRoYW4gdXN1YWwuIFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChpc0xhc3RTbGlkZSAmJiB0aGlzLmRpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XHJcbiAgICAgICAgICAgIGRpc3RhbmNlQWJzID0gZGlzdGFuY2VBYnMgKyB0aGlzLnZpc2libGVXaWR0aCAlIHRoaXMuZnVsbENlbGxXaWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBsZW5ndGggPSBNYXRoLmZsb29yKGRpc3RhbmNlQWJzIC8gdGhpcy5mdWxsQ2VsbFdpZHRoKTtcclxuXHJcbiAgICAgICAgaWYgKGRpc3RhbmNlQWJzICUgdGhpcy5mdWxsQ2VsbFdpZHRoID49IHRoaXMubWluU3dpcGVEaXN0YW5jZSkge1xyXG4gICAgICAgICAgICBsZW5ndGgrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGlzdGFuY2VBYnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMuaW5pdGlhbFBvc2l0aW9uWCAtIHRoaXMuY3VycmVudFBvc2l0aW9uWCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGlyZWN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IE1hdGguc2lnbih0aGlzLmluaXRpYWxQb3NpdGlvblggLSB0aGlzLmN1cnJlbnRQb3NpdGlvblgpO1xyXG5cclxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3JpZ2h0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2xlZnQnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBpc1NsaWRlc0VuZChjb3VudGVyOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgbWFyZ2luID0gdGhpcy52aXNpYmxlQ2VsbHNPdmVyZmxvd0NvbnRhaW5lciA/IDEgOiAwO1xyXG4gICAgICAgIGxldCBpbWFnZUxlbmd0aCA9IHRoaXMuaW1hZ2VzID8gdGhpcy5pbWFnZXMubGVuZ3RoIDogdGhpcy5jZWxscy5jZWxsTGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubG9vcCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIChpbWFnZUxlbmd0aCAtIGNvdW50ZXIgKyBtYXJnaW4pIDwgdGhpcy5udW1iZXJPZlZpc2libGVDZWxscztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNMYXN0U2xpZGUoY291bnRlcjogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTbGlkZXNFbmQoY291bnRlciArIDEpXHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q291bnRlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50ZXIgPSB0aGlzLmNvdW50ZXIgKyB0aGlzLnNsaWRlTGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY291bnRlciA9IHRoaXMuY291bnRlciAtIHRoaXMuc2xpZGVMZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFBvc2l0aW9uQnlJbmRleChfY291bnRlcjogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGNvcnJlY3Rpb24gPSB0aGlzLmdldFBvc2l0aW9uQ29ycmVjdGlvbih0aGlzLmNvdW50ZXIgKyB0aGlzLnNsaWRlTGVuZ3RoKTtcclxuICAgICAgICBsZXQgcG9zaXRpb247XHJcblxyXG4gICAgICAgIGlmIChjb3JyZWN0aW9uICE9PSAwKSB7XHJcbiAgICAgICAgICAgIGNvcnJlY3Rpb24gPSBjb3JyZWN0aW9uICsgdGhpcy5mdWxsQ2VsbFdpZHRoXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcclxuICAgICAgICAgICAgY29ycmVjdGlvbiA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0xpZ2h0RE9NICYmIHRoaXMuaXNMaWdodERPTU1vZGUoX2NvdW50ZXIpIHx8XHJcbiAgICAgICAgICAgIHRoaXMuaXNMaWdodERPTSAmJiB0aGlzLmlmTGVmdERPTU1vZGVBdEVuZChfY291bnRlcikpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBpbml0aWFsUG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uV2l0aG91dENvcnJlY3Rpb24odGhpcy5pbml0aWFsUG9zaXRpb25YKTtcclxuICAgICAgICAgICAgbGV0IGNvdW50ZXJEaWZmZXJlbmNlID0gX2NvdW50ZXIgLSB0aGlzLmNvdW50ZXI7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaW5pdGlhbFBvc2l0aW9uIC0gKChjb3VudGVyRGlmZmVyZW5jZSAqIHRoaXMuZnVsbENlbGxXaWR0aCkgLSBjb3JyZWN0aW9uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwb3NpdGlvbiA9IC0oKF9jb3VudGVyICogdGhpcy5mdWxsQ2VsbFdpZHRoKSAtIGNvcnJlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcG9zaXRpb24gPSB0aGlzLnByb3ZpZGVTYWZlUG9zaXRpb24ocG9zaXRpb24pO1xyXG5cclxuICAgICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdmlkZVNhZmVQb3NpdGlvbihwb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmNvbnRhaW5lci5nZXRFbmRQb3NpdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xyXG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xyXG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPCBlbmRQb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBlbmRQb3NpdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBvc2l0aW9uV2l0aG91dENvcnJlY3Rpb24odmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGxldCByZW1haW5kZXIgPSBNYXRoLnJvdW5kKHZhbHVlKSAlIHRoaXMuZnVsbENlbGxXaWR0aDtcclxuXHJcbiAgICAgICAgaWYgKHJlbWFpbmRlciAhPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgLSAodGhpcy5mdWxsQ2VsbFdpZHRoICsgcmVtYWluZGVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlzTmV4dEFycm93RGlzYWJsZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMYXN0U2xpZGUodGhpcy5jb3VudGVyKSB8fCBcclxuICAgICAgICAoIXRoaXMudmlzaWJsZUNlbGxzT3ZlcmZsb3dDb250YWluZXIgJiYgdGhpcy5jZWxsTGVuZ3RoIDw9IHRoaXMubnVtYmVyT2ZWaXNpYmxlQ2VsbHMpIHx8XHJcbiAgICAgICAgKHRoaXMudmlzaWJsZUNlbGxzT3ZlcmZsb3dDb250YWluZXIgJiYgdGhpcy5jZWxsTGVuZ3RoIDwgdGhpcy5udW1iZXJPZlZpc2libGVDZWxscylcclxuICAgIH1cclxuXHJcbiAgICBpc1ByZXZBcnJvd0Rpc2FibGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvdW50ZXIgPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgYWxpZ25Db250YWluZXJGYXN0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTGlnaHRET01Nb2RlKHRoaXMuY291bnRlcikpIHtcclxuICAgICAgICAgICAgbGV0IHBvc2l0aW9uWCA9IHRoaXMuZml4ZWRDb250YWluZXJQb3NpdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIudHJhbnNmb3JtUG9zaXRpb25YKHBvc2l0aW9uWCwgMCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNlbGxzLnNldENvdW50ZXIodGhpcy5jb3VudGVyKTtcclxuICAgICAgICAgICAgdGhpcy5jZWxscy5saW5lVXAoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaWZMZWZ0RE9NTW9kZVRvQmVnaW5uaW5nKHRoaXMuY291bnRlcikpIHtcclxuICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGV4aXRlZCB0aGUgbGlnaHQgRE9NIG1vZGUgYnV0IFxyXG4gICAgICAgICAgICAgKiB0aGUgY2VsbHMgYXJlIHN0aWxsIG91dCBvZiBwbGFjZSBcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNlbGxzLmlmU2VxdWVuY2VPZkNlbGxzSXNDaGFuZ2VkKCkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvblggPSAtKHRoaXMuY291bnRlciAqIHRoaXMuZnVsbENlbGxXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci50cmFuc2Zvcm1Qb3NpdGlvblgocG9zaXRpb25YLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNlbGxzLnNldENvdW50ZXIodGhpcy5jb3VudGVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMubGluZVVwKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaWZMZWZ0RE9NTW9kZUF0RW5kKHRoaXMuY291bnRlcikpIHtcclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lclBvc2l0aW9uWCA9IHRoaXMuY29udGFpbmVyLmdldEN1cnJlbnRQb3NpdGlvblgoKTtcclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXIuZ2V0V2lkdGgoKTtcclxuICAgICAgICAgICAgdGhpcy52aXNpYmxlV2lkdGg7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xhc3RTbGlkZSh0aGlzLmNvdW50ZXIpICYmXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJXaWR0aCArIGNvbnRhaW5lclBvc2l0aW9uWCA+PSB0aGlzLnZpc2libGVXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY29ycmVjdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb25Db3JyZWN0aW9uKHRoaXMuY291bnRlcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29ycmVjdGlvbiAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbiA9IGNvcnJlY3Rpb24gKyB0aGlzLmZ1bGxDZWxsV2lkdGhcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb3JyZWN0aW9uID0gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHBvc2l0aW9uWCA9IHRoaXMuZml4ZWRDb250YWluZXJQb3NpdGlvbiArIGNvcnJlY3Rpb247XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci50cmFuc2Zvcm1Qb3NpdGlvblgocG9zaXRpb25YLCAwKTtcclxuICAgICAgICAgICAgdGhpcy5jZWxscy5zZXRDb3VudGVyKHRoaXMuY291bnRlcik7XHJcbiAgICAgICAgICAgIHRoaXMuY2VsbHMubGluZVVwKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlzTGlnaHRET01Nb2RlKGNvdW50ZXI6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBmbGFnO1xyXG4gICAgICAgIGxldCByZW1haW5kZXJPZkNlbGxzID0gdGhpcy5pbWFnZXMubGVuZ3RoIC0gdGhpcy5vdmVyZmxvd0NlbGxzTGltaXQgLSB0aGlzLm51bWJlck9mVmlzaWJsZUNlbGxzO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNMaWdodERPTSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxu