UNPKG

carousel-angular

Version:

A simple carousel component for Angular 14+ based on 'angular-responsive-carousel' by Ivy Laboratory http://ivylab.space

299 lines 35.3 kB
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; } /* Number of cell elements in the DUM tree */ get cellLength() { return this.cells.cellLength; } 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; } handleSlide(customSlideLength = undefined) { const 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(); const 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) { const length = index - this.counter; this.next(length); } if (index < this.counter) { const 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 (let i = 0; i < slideLength; i++) { const newCounter = this.counter + (slideLength - i); if (!this.isSlidesEnd(newCounter)) { slideLength -= i; this.isSlideLengthLimited = i > 0; break; } } } return slideLength; } /* Offset the container to show the last cell completely */ getPositionCorrection(counter) { let correction = 0; const isLastSlide = this.isLastSlide(counter); if (this.isSlideLengthLimited || isLastSlide) { const 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 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) { const margin = this.visibleCellsOverflowContainer ? 1 : 0; const imageLength = this.cells.cellLength; return imageLength - counter + margin < this.numberOfVisibleCells; } isLastSlide(counter) { return this.isSlidesEnd(counter + 1); } setCounter() { if (this.direction === 'left') { this.counter += this.slideLength; } if (this.direction === 'right') { this.counter -= this.slideLength; } } getPositionByIndex(_counter) { let correction = this.getPositionCorrection(this.counter + this.slideLength); let position; if (correction !== 0) { correction += this.fullCellWidth; } if (this.direction === 'right') { correction = 0; } 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) { const remainder = Math.round(value) % this.fullCellWidth; if (remainder !== 0) { return value - (this.fullCellWidth + remainder); } 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.ifLeftDOMModeToBeginning(this.counter)) { /* If we have already exited the light DOM mode but * the cells are still out of place */ if (this.cells.ifSequenceOfCellsIsChanged()) { const positionX = -(this.counter * this.fullCellWidth); this.container.transformPositionX(positionX, 0); this.cells.setCounter(this.counter); this.cells.lineUp(); } } } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9jYXJvdXNlbC1hbmd1bGFyL3NyYy9saWIvc2xpZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxPQUFPLEtBQUs7SUE4RGhCLFlBQ1Usa0JBQXNDLEVBQ3RDLEtBQVUsRUFDVixLQUFVLEVBQ1YsU0FBYztRQUhkLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsVUFBSyxHQUFMLEtBQUssQ0FBSztRQUNWLFVBQUssR0FBTCxLQUFLLENBQUs7UUFDVixjQUFTLEdBQVQsU0FBUyxDQUFLO1FBakV4QixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUVoQixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFJMUIsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUVaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFFYixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRWIsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFJaEIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRTFCLHFCQUFnQixHQUFHLENBQUMsQ0FBQztRQUVyQixxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFFckIsd0VBQXdFO1FBQ3hFLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQTRDM0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQTNDRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQztJQUNsRCxDQUFDO0lBRUQsSUFBSSxvQkFBb0I7UUFD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LDBCQUEwQixFQUFFLEVBQUU7Z0JBQzNDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBRWhELElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNyQjtTQUNGO0lBQ0gsQ0FBQztJQUVELHdCQUF3QixDQUFDLE9BQWU7UUFDdEMsSUFBSSxJQUFJLENBQUM7UUFFVCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDdEMsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFlBQVk7WUFDZixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWTtnQkFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7SUFDcEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvcGVydGllcyBhcyBDYXJvdXNlbFByb3BlcnRpZXMgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnRpZXMge1xuICBjYXJvdXNlbFByb3BlcnRpZXM6IENhcm91c2VsUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNsYXNzIFNsaWRlIHtcbiAgc2xpZGVMZW5ndGggPSAwO1xuXG4gIGlzU2xpZGVJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnIHwgdW5kZWZpbmVkO1xuXG4gIGNvdW50ZXIgPSAwO1xuXG4gIF9jb3VudGVyID0gMDtcblxuICBkaXN0YW5jZSA9IDA7XG5cbiAgZGlzdGFuY2VBYnMgPSAwO1xuXG4gIHZpc2libGVXaWR0aCE6IG51bWJlcjtcblxuICBpc05vdENsaWNrT25BcnJvdyA9IGZhbHNlO1xuXG4gIGluaXRpYWxQb3NpdGlvblggPSAwO1xuXG4gIGN1cnJlbnRQb3NpdGlvblggPSAwO1xuXG4gIC8qIFRoZSBzbGlkZSBsZW5ndGggaGFzIGJlZW4gbGltaXRlZCBieSB0aGUgbGltaXRTbGlkZUxlbmd0aCgpIG1ldGhvZCAqL1xuICBpc1NsaWRlTGVuZ3RoTGltaXRlZCA9IGZhbHNlO1xuXG4gIGdldCBmdWxsQ2VsbFdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5jZWxsV2lkdGggKyB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5tYXJnaW47XG4gIH1cblxuICBnZXQgbWFyZ2luKCkge1xuICAgIHJldHVybiB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5tYXJnaW47XG4gIH1cblxuICBnZXQgbWluU3dpcGVEaXN0YW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubWluU3dpcGVEaXN0YW5jZTtcbiAgfVxuXG4gIGdldCBudW1iZXJPZlZpc2libGVDZWxscygpIHtcbiAgICByZXR1cm4gdGhpcy51dGlscy5udW1iZXJPZlZpc2libGVDZWxscztcbiAgfVxuXG4gIGdldCB2aXNpYmxlQ2VsbHNPdmVyZmxvd0NvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy51dGlscy52aXNpYmxlQ2VsbHNPdmVyZmxvd0NvbnRhaW5lcjtcbiAgfVxuXG4gIC8qIFRoZSBwb3NpdGlvbiB0byB3aGljaCB0aGUgY29udGFpbmVyIHJldHVybnMgYWZ0ZXIgZWFjaCBzbGlkZVxuICAgKiBpbiB0aGUgbGlnaHQgRFVNIHRyZWUgbW9kZS5cbiAgICovXG4gIGdldCBmaXhlZENvbnRhaW5lclBvc2l0aW9uKCkge1xuICAgIHJldHVybiAtKHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0ICogdGhpcy5mdWxsQ2VsbFdpZHRoKTtcbiAgfVxuXG4gIGdldCBvdmVyZmxvd0NlbGxzTGltaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbHMub3ZlcmZsb3dDZWxsc0xpbWl0O1xuICB9XG5cbiAgLyogTnVtYmVyIG9mIGNlbGwgZWxlbWVudHMgaW4gdGhlIERVTSB0cmVlICovXG4gIGdldCBjZWxsTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmNlbGxzLmNlbGxMZW5ndGg7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNhcm91c2VsUHJvcGVydGllczogQ2Fyb3VzZWxQcm9wZXJ0aWVzLFxuICAgIHByaXZhdGUgdXRpbHM6IGFueSxcbiAgICBwcml2YXRlIGNlbGxzOiBhbnksXG4gICAgcHJpdmF0ZSBjb250YWluZXI6IGFueVxuICApIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIHVwZGF0ZVByb3BlcnRpZXMoY2Fyb3VzZWxQcm9wZXJ0aWVzOiBDYXJvdXNlbFByb3BlcnRpZXMpIHtcbiAgICB0aGlzLmNhcm91c2VsUHJvcGVydGllcyA9IGNhcm91c2VsUHJvcGVydGllcztcbiAgICB0aGlzLnNldFZpc2libGVXaWR0aCgpO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLnZpc2libGVXaWR0aCA9XG4gICAgICB0aGlzLmNhcm91c2VsUHJvcGVydGllcy52aXNpYmxlV2lkdGggfHxcbiAgICAgIHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmhvc3RFbGVtZW50LmNsaWVudFdpZHRoO1xuICB9XG5cbiAgaGFuZGxlVG91Y2hzdGFydCgpIHtcbiAgICAvKiBUb3VjaHN0YXJ0IGV2ZW50IGlzIG5vdCBjYWxsZWQgZm9yIGFycm93ICovXG4gICAgdGhpcy5pc05vdENsaWNrT25BcnJvdyA9IHRydWU7XG4gICAgdGhpcy5pc1NsaWRlTGVuZ3RoTGltaXRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmlzU2xpZGVJblByb2dyZXNzKSB7XG4gICAgICB0aGlzLmluaXRpYWxQb3NpdGlvblggPSB0aGlzLmNvbnRhaW5lci5nZXRDdXJyZW50UG9zaXRpb25YKCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVG91Y2hlbmQoKSB7XG4gICAgaWYgKCF0aGlzLmlzTm90Q2xpY2tPbkFycm93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFBvc2l0aW9uWCA9IHRoaXMuY29udGFpbmVyLmdldEN1cnJlbnRQb3NpdGlvblgoKTtcbiAgICB0aGlzLmRpc3RhbmNlQWJzID0gTWF0aC5hYnModGhpcy5pbml0aWFsUG9zaXRpb25YIC0gdGhpcy5jdXJyZW50UG9zaXRpb25YKTtcbiAgICB0aGlzLmRpc3RhbmNlID0gdGhpcy5pbml0aWFsUG9zaXRpb25YIC0gdGhpcy5jdXJyZW50UG9zaXRpb25YO1xuICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5nZXREaXJlY3Rpb24oKTtcbiAgICB0aGlzLmlzTm90Q2xpY2tPbkFycm93ID0gZmFsc2U7XG4gICAgdGhpcy5oYW5kbGVTbGlkZSgpO1xuICB9XG5cbiAgaGFuZGxlVHJhbnNpdGlvbmVuZCgpIHtcbiAgICB0aGlzLnNldENvdW50ZXIoKTtcbiAgICB0aGlzLmlzU2xpZGVJblByb2dyZXNzID0gZmFsc2U7XG4gIH1cblxuICBoYW5kbGVTbGlkZShjdXN0b21TbGlkZUxlbmd0aDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgaXNVc2luZ0J1dHRvbiA9IGN1c3RvbVNsaWRlTGVuZ3RoO1xuICAgIGxldCBuZXdQb3NpdGlvblg7XG5cbiAgICBpZiAoKGlzVXNpbmdCdXR0b24gJiYgdGhpcy5pc1NsaWRlSW5Qcm9ncmVzcykgfHwgIXRoaXMuZGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyogQ3VzdG9tIHNsaWRlIGxlbmd0aCBpcyB1c2VkIGluIGFycm93cyAqL1xuICAgIGlmIChjdXN0b21TbGlkZUxlbmd0aCkge1xuICAgICAgdGhpcy5zbGlkZUxlbmd0aCA9IHRoaXMubGltaXRTbGlkZUxlbmd0aChjdXN0b21TbGlkZUxlbmd0aCk7XG5cbiAgICAgIGlmICghdGhpcy5pc1NsaWRlSW5Qcm9ncmVzcykge1xuICAgICAgICB0aGlzLmluaXRpYWxQb3NpdGlvblggPSB0aGlzLmNvbnRhaW5lci5nZXRDdXJyZW50UG9zaXRpb25YKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2xpZGVMZW5ndGggPSB0aGlzLmdldFNsaWRlTGVuZ3RoKHRoaXMuZGlzdGFuY2VBYnMpO1xuICAgIH1cblxuICAgIC8qIFN0b3JlIGludGVybWVkaWF0ZSBjb3VudGVyIHZhbHVlICovXG4gICAgdGhpcy5fY291bnRlciA9IHRoaXMuZ2V0UHJlbGltaW5hcnlDb3VudGVyKCk7XG5cbiAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgaWYgKCFjdXN0b21TbGlkZUxlbmd0aCkge1xuICAgICAgICB0aGlzLnNsaWRlTGVuZ3RoID0gdGhpcy5saW1pdFNsaWRlTGVuZ3RoKFxuICAgICAgICAgIHRoaXMuZ2V0U2xpZGVMZW5ndGgodGhpcy5kaXN0YW5jZUFicylcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY291bnRlciA9IHRoaXMuZ2V0UHJlbGltaW5hcnlDb3VudGVyKCk7XG4gICAgICBjb25zdCBpc1NsaWRlc0VuZCA9IHRoaXMuaXNTbGlkZXNFbmQodGhpcy5fY291bnRlcik7XG4gICAgICBuZXdQb3NpdGlvblggPSB0aGlzLmdldFBvc2l0aW9uQnlJbmRleCh0aGlzLl9jb3VudGVyKTtcblxuICAgICAgaWYgKGlzU2xpZGVzRW5kKSB7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLmNvdW50ZXI7XG5cbiAgICAgICAgbmV3UG9zaXRpb25YID0gdGhpcy5nZXRQb3NpdGlvbkJ5SW5kZXgodGhpcy5jb3VudGVyKTtcbiAgICAgICAgdGhpcy5zbGlkZUxlbmd0aCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICBpZiAoIWN1c3RvbVNsaWRlTGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2xpZGVMZW5ndGggPSB0aGlzLmdldFNsaWRlTGVuZ3RoKHRoaXMuZGlzdGFuY2VBYnMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY291bnRlciA8IDApIHtcbiAgICAgICAgdGhpcy5fY291bnRlciA9IHRoaXMuY291bnRlcjtcbiAgICAgICAgdGhpcy5zbGlkZUxlbmd0aCA9IHRoaXMuY291bnRlcjtcbiAgICAgIH1cblxuICAgICAgbmV3UG9zaXRpb25YID0gdGhpcy5nZXRQb3NpdGlvbkJ5SW5kZXgodGhpcy5jb3VudGVyIC0gdGhpcy5zbGlkZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udGFpbmVyLmdldEN1cnJlbnRQb3NpdGlvblgoKSAhPT0gbmV3UG9zaXRpb25YKSB7XG4gICAgICB0aGlzLmlzU2xpZGVJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY29udGFpbmVyLnRyYW5zZm9ybVBvc2l0aW9uWChuZXdQb3NpdGlvblgpO1xuICAgIH1cbiAgfVxuXG4gIG5leHQobGVuZ3RoID0gMSkge1xuICAgIHRoaXMuZGlyZWN0aW9uID0gJ2xlZnQnO1xuICAgIHRoaXMuaGFuZGxlU2xpZGUobGVuZ3RoKTtcbiAgfVxuXG4gIHByZXYobGVuZ3RoID0gMSkge1xuICAgIHRoaXMuZGlyZWN0aW9uID0gJ3JpZ2h0JztcbiAgICB0aGlzLmhhbmRsZVNsaWRlKGxlbmd0aCk7XG4gIH1cblxuICBzZWxlY3QoaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChpbmRleCA+IHRoaXMuY2VsbExlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPiB0aGlzLmNvdW50ZXIpIHtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IGluZGV4IC0gdGhpcy5jb3VudGVyO1xuICAgICAgdGhpcy5uZXh0KGxlbmd0aCk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4IDwgdGhpcy5jb3VudGVyKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLmNvdW50ZXIgLSBpbmRleDtcbiAgICAgIHRoaXMucHJldihsZW5ndGgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFByZWxpbWluYXJ5Q291bnRlcigpIHtcbiAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY291bnRlciArIHRoaXMuc2xpZGVMZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb3VudGVyIC0gdGhpcy5zbGlkZUxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qXG4gICAqIExpbWl0cyB0aGUgbGVuZ3RoIG9mIHRoZSBzbGlkZSBkdXJpbmcgY2FsbHMgdG8gdGhlIG5leHQoKSBhbmQgcHJldigpXG4gICAqIG1ldGhvZHMgaWYgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpcyBvdXRzaWRlIHRoZSBjZWxsIGxlbmd0aFxuICAgKi9cbiAgbGltaXRTbGlkZUxlbmd0aChzbGlkZUxlbmd0aDogbnVtYmVyKSB7XG4gICAgaWYgKHNsaWRlTGVuZ3RoID4gMSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGlkZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvdW50ZXIgPSB0aGlzLmNvdW50ZXIgKyAoc2xpZGVMZW5ndGggLSBpKTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNTbGlkZXNFbmQobmV3Q291bnRlcikpIHtcbiAgICAgICAgICBzbGlkZUxlbmd0aCAtPSBpO1xuICAgICAgICAgIHRoaXMuaXNTbGlkZUxlbmd0aExpbWl0ZWQgPSBpID4gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2xpZGVMZW5ndGg7XG4gIH1cblxuICAvKiBPZmZzZXQgdGhlIGNvbnRhaW5lciB0byBzaG93IHRoZSBsYXN0IGNlbGwgY29tcGxldGVseSAqL1xuICBnZXRQb3NpdGlvbkNvcnJlY3Rpb24oY291bnRlcjogbnVtYmVyKSB7XG4gICAgbGV0IGNvcnJlY3Rpb24gPSAwO1xuICAgIGNvbnN0IGlzTGFzdFNsaWRlID0gdGhpcy5pc0xhc3RTbGlkZShjb3VudGVyKTtcblxuICAgIGlmICh0aGlzLmlzU2xpZGVMZW5ndGhMaW1pdGVkIHx8IGlzTGFzdFNsaWRlKSB7XG4gICAgICBjb25zdCBjZWxsc1dpZHRoID1cbiAgICAgICAgdGhpcy5jZWxscy5jZWxsTGVuZ3RoSW5MaWdodERPTU1vZGUgKiB0aGlzLmZ1bGxDZWxsV2lkdGg7XG5cbiAgICAgIGlmICh0aGlzLnZpc2libGVXaWR0aCA8IGNlbGxzV2lkdGgpIHtcbiAgICAgICAgY29ycmVjdGlvbiA9IC0oXG4gICAgICAgICAgdGhpcy5udW1iZXJPZlZpc2libGVDZWxscyAqIHRoaXMuZnVsbENlbGxXaWR0aCAtXG4gICAgICAgICAgdGhpcy52aXNpYmxlV2lkdGggLVxuICAgICAgICAgIHRoaXMubWFyZ2luXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb3JyZWN0aW9uID49IC10aGlzLm1hcmdpbikge1xuICAgICAgICBjb3JyZWN0aW9uID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29ycmVjdGlvbjtcbiAgfVxuXG4gIGdldFNsaWRlTGVuZ3RoKGRpc3RhbmNlQWJzOiBudW1iZXIpIHtcbiAgICBsZXQgbGVuZ3RoID0gTWF0aC5mbG9vcihkaXN0YW5jZUFicyAvIHRoaXMuZnVsbENlbGxXaWR0aCk7XG5cbiAgICBpZiAoZGlzdGFuY2VBYnMgJSB0aGlzLmZ1bGxDZWxsV2lkdGggPj0gdGhpcy5taW5Td2lwZURpc3RhbmNlKSB7XG4gICAgICBsZW5ndGgrKztcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuZ3RoO1xuICB9XG5cbiAgZ2V0RGlzdGFuY2VBYnMoKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHRoaXMuaW5pdGlhbFBvc2l0aW9uWCAtIHRoaXMuY3VycmVudFBvc2l0aW9uWCk7XG4gIH1cblxuICBnZXREaXJlY3Rpb24oKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gTWF0aC5zaWduKHRoaXMuaW5pdGlhbFBvc2l0aW9uWCAtIHRoaXMuY3VycmVudFBvc2l0aW9uWCk7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAtMSkge1xuICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlzU2xpZGVzRW5kKGNvdW50ZXI6IG51bWJlcikge1xuICAgIGNvbnN0IG1hcmdpbiA9IHRoaXMudmlzaWJsZUNlbGxzT3ZlcmZsb3dDb250YWluZXIgPyAxIDogMDtcbiAgICBjb25zdCBpbWFnZUxlbmd0aCA9IHRoaXMuY2VsbHMuY2VsbExlbmd0aDtcblxuICAgIHJldHVybiBpbWFnZUxlbmd0aCAtIGNvdW50ZXIgKyBtYXJnaW4gPCB0aGlzLm51bWJlck9mVmlzaWJsZUNlbGxzO1xuICB9XG5cbiAgaXNMYXN0U2xpZGUoY291bnRlcjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTbGlkZXNFbmQoY291bnRlciArIDEpO1xuICB9XG5cbiAgc2V0Q291bnRlcigpIHtcbiAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgdGhpcy5jb3VudGVyICs9IHRoaXMuc2xpZGVMZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICB0aGlzLmNvdW50ZXIgLT0gdGhpcy5zbGlkZUxlbmd0aDtcbiAgICB9XG4gIH1cblxuICBnZXRQb3NpdGlvbkJ5SW5kZXgoX2NvdW50ZXI6IG51bWJlcikge1xuICAgIGxldCBjb3JyZWN0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkNvcnJlY3Rpb24oXG4gICAgICB0aGlzLmNvdW50ZXIgKyB0aGlzLnNsaWRlTGVuZ3RoXG4gICAgKTtcbiAgICBsZXQgcG9zaXRpb247XG5cbiAgICBpZiAoY29ycmVjdGlvbiAhPT0gMCkge1xuICAgICAgY29ycmVjdGlvbiArPSB0aGlzLmZ1bGxDZWxsV2lkdGg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICBjb3JyZWN0aW9uID0gMDtcbiAgICB9XG5cbiAgICBwb3NpdGlvbiA9IC0oX2NvdW50ZXIgKiB0aGlzLmZ1bGxDZWxsV2lkdGggLSBjb3JyZWN0aW9uKTtcblxuICAgIHBvc2l0aW9uID0gdGhpcy5wcm92aWRlU2FmZVBvc2l0aW9uKHBvc2l0aW9uKTtcblxuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfVxuXG4gIHByb3ZpZGVTYWZlUG9zaXRpb24ocG9zaXRpb246IG51bWJlcikge1xuICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5jb250YWluZXIuZ2V0RW5kUG9zaXRpb24oKTtcblxuICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICBpZiAocG9zaXRpb24gPiAwKSB7XG4gICAgICAgIHBvc2l0aW9uID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICAgIGlmIChwb3NpdGlvbiA8IGVuZFBvc2l0aW9uKSB7XG4gICAgICAgIHBvc2l0aW9uID0gZW5kUG9zaXRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgZ2V0UG9zaXRpb25XaXRob3V0Q29ycmVjdGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgcmVtYWluZGVyID0gTWF0aC5yb3VuZCh2YWx1ZSkgJSB0aGlzLmZ1bGxDZWxsV2lkdGg7XG5cbiAgICBpZiAocmVtYWluZGVyICE9PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWUgLSAodGhpcy5mdWxsQ2VsbFdpZHRoICsgcmVtYWluZGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaXNOZXh0QXJyb3dEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc0xhc3RTbGlkZSh0aGlzLmNvdW50ZXIpIHx8XG4gICAgICAoIXRoaXMudmlzaWJsZUNlbGxzT3ZlcmZsb3dDb250YWluZXIgJiZcbiAgICAgICAgdGhpcy5jZWxsTGVuZ3RoIDw9IHRoaXMubnVtYmVyT2ZWaXNpYmxlQ2VsbHMpIHx8XG4gICAgICAodGhpcy52aXNpYmxlQ2VsbHNPdmVyZmxvd0NvbnRhaW5lciAmJlxuICAgICAgICB0aGlzLmNlbGxMZW5ndGggPCB0aGlzLm51bWJlck9mVmlzaWJsZUNlbGxzKVxuICAgICk7XG4gIH1cblxuICBpc1ByZXZBcnJvd0Rpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50ZXIgPT09IDA7XG4gIH1cblxuICBhbGlnbkNvbnRhaW5lckZhc3QoKSB7XG4gICAgaWYgKHRoaXMuaWZMZWZ0RE9NTW9kZVRvQmVnaW5uaW5nKHRoaXMuY291bnRlcikpIHtcbiAgICAgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBleGl0ZWQgdGhlIGxpZ2h0IERPTSBtb2RlIGJ1dFxuICAgICAgICogdGhlIGNlbGxzIGFyZSBzdGlsbCBvdXQgb2YgcGxhY2VcbiAgICAgICAqL1xuICAgICAgaWYgKHRoaXMuY2VsbHMuaWZTZXF1ZW5jZU9mQ2VsbHNJc0NoYW5nZWQoKSkge1xuICAgICAgICBjb25zdCBwb3NpdGlvblggPSAtKHRoaXMuY291bnRlciAqIHRoaXMuZnVsbENlbGxXaWR0aCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnRyYW5zZm9ybVBvc2l0aW9uWChwb3NpdGlvblgsIDApO1xuXG4gICAgICAgIHRoaXMuY2VsbHMuc2V0Q291bnRlcih0aGlzLmNvdW50ZXIpO1xuICAgICAgICB0aGlzLmNlbGxzLmxpbmVVcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmTGVmdERPTU1vZGVUb0JlZ2lubmluZyhjb3VudGVyOiBudW1iZXIpIHtcbiAgICBsZXQgZmxhZztcblxuICAgIGlmIChjb3VudGVyIDw9IHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0KSB7XG4gICAgICBmbGFnID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb3VudGVyIDw9IHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0KSB7XG4gICAgICBmbGFnID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhZztcbiAgfVxuXG4gIHNldFZpc2libGVXaWR0aCgpIHtcbiAgICB0aGlzLnZpc2libGVXaWR0aCA9XG4gICAgICB0aGlzLmNhcm91c2VsUHJvcGVydGllcy52aXNpYmxlV2lkdGggfHxcbiAgICAgIHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmhvc3RFbGVtZW50LmNsaWVudFdpZHRoO1xuICB9XG59XG4iXX0=