UNPKG

@fivethree/core

Version:
538 lines 42 kB
/** * @fileoverview added by tsickle * Generated from: lib/bottom-sheet/bottom-sheet.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { FivBottomSheetContent } from './bottom-sheet-content/bottom-sheet-content.component'; import { Component, Input, Output, EventEmitter, ElementRef, Renderer2, ContentChild } from '@angular/core'; import { DomController, Platform } from '@ionic/angular'; import { DrawerState } from './drawer-state'; import { merge, Subject, fromEvent, from } from 'rxjs'; import { takeUntil, map, tap, flatMap, repeat, withLatestFrom, filter, first, take, repeatWhen } from 'rxjs/operators'; /** * @record */ export function PanEvent() { } if (false) { /** @type {?} */ PanEvent.prototype.currentOffset; /** @type {?} */ PanEvent.prototype.startOffset; /** @type {?} */ PanEvent.prototype.currentTop; /** @type {?} */ PanEvent.prototype.startTop; /** @type {?} */ PanEvent.prototype.distance; /** @type {?} */ PanEvent.prototype.touch; } var FivBottomSheet = /** @class */ (function () { function FivBottomSheet(_element, _renderer, _domCtrl, _platform) { this._element = _element; this._renderer = _renderer; this._domCtrl = _domCtrl; this._platform = _platform; this.dockedHeight = 80; this.shouldBounce = true; this.distanceTop = 56; this.transition = '0.25s'; this.state = DrawerState.Bottom; this.bounceThreshold = 40; this.panThreshold = 20; this.panEnabled = true; this.stateChange = new EventEmitter(); this.fivOpen = new EventEmitter(); this.fivDocked = new EventEmitter(); this.fivClose = new EventEmitter(); this.fivProgress = new EventEmitter(); this.scrollTop = 0; this.$onDestroy = new Subject(); } /** * @return {?} */ FivBottomSheet.prototype.ngOnDestroy = /** * @return {?} */ function () { this.$onDestroy.next(); }; /** * @return {?} */ FivBottomSheet.prototype.ngAfterViewInit = /** * @return {?} */ function () { var _this = this; this._setDrawerState(this.state); this.content.shouldBounce = this.shouldBounce; /** @type {?} */ var touchmove = fromEvent(this._element.nativeElement, 'touchmove', { passive: true }); /** @type {?} */ var touchend = merge(fromEvent(this._element.nativeElement, 'touchend', { passive: true }), fromEvent(this._element.nativeElement, 'touchcancel', { passive: true })); /** @type {?} */ var getScrollContent = from(this.content.content.getScrollElement()); /** @type {?} */ var scroll = this.content.content.ionScroll.pipe(tap((/** * @param {?} el * @return {?} */ function (el) { return (_this.scrollTop = el.detail.scrollTop); })), takeUntil(this.$onDestroy)); scroll.subscribe(); this.content.content.ionScrollEnd .pipe(filter((/** * @param {?} el * @return {?} */ function (el) { return _this.scrollTop === 0 && _this.state === DrawerState.Top; })), tap((/** * @return {?} */ function () { return _this.content.content.scrollByPoint(0, 1, 0); })), takeUntil(this.$onDestroy)) .subscribe(); /** @type {?} */ var canStart = touchmove.pipe(filter((/** * @return {?} */ function () { return _this.scrollTop === 0; }))); /** @type {?} */ var start = canStart.pipe(take(1), tap((/** * @param {?} s * @return {?} */ function (s) { return _this._handlePanStart(s); }))); /** @type {?} */ var pan = start.pipe(filter((/** * @return {?} */ function () { return _this.panEnabled; })), flatMap((/** * @return {?} */ function () { return touchmove; })), map((/** * @param {?} tm * @return {?} */ function (tm) { return _this.calculatePanEvent(tm); }))); /** @type {?} */ var handlePan = pan.pipe(filter((/** * @param {?} p * @return {?} */ function (p) { return Math.abs(p.distance) > _this.panThreshold; })), map((/** * @param {?} tm * @return {?} */ function (tm) { return _this._handlePan(tm); })), takeUntil(touchend), repeat(), takeUntil(this.$onDestroy)); /** @type {?} */ var handleBackPan = pan .pipe(filter((/** * @param {?} p * @return {?} */ function (p) { return Math.abs(p.distance) <= _this.panThreshold && _this.content.panning; })), map((/** * @param {?} tm * @return {?} */ function (tm) { return _this._handlePan(tm); })), takeUntil(touchend), repeat(), takeUntil(this.$onDestroy)) .subscribe(); handlePan .pipe(first(), tap((/** * @return {?} */ function () { return (_this.content.panning = true); })), repeatWhen((/** * @return {?} */ function () { return touchend; })), takeUntil(this.$onDestroy)) .subscribe(); handlePan .pipe(flatMap((/** * @return {?} */ function () { return touchend; })), first(), withLatestFrom(pan), tap((/** * @return {?} */ function () { return _this.content.content.scrollByPoint(0, 1, 0); })), tap((/** * @return {?} */ function () { return (_this.content.panning = false); })), map((/** * @param {?} ev * @return {?} */ function (ev) { return ev[1]; })), repeat(), takeUntil(this.$onDestroy)) .subscribe((/** * @param {?} ev * @return {?} */ function (ev) { return _this._handlePanEnd(ev); })); }; /** * @param {?} changes * @return {?} */ FivBottomSheet.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (!changes.state) { return; } this._setDrawerState(changes.state.currentValue); this.updateContent(changes.state.currentValue); }; /** * @param {?} state * @return {?} */ FivBottomSheet.prototype.updateContent = /** * @param {?} state * @return {?} */ function (state) { if (this.content) { this.content.updateState(state); } }; /** * @private * @param {?} state * @return {?} */ FivBottomSheet.prototype._setDrawerState = /** * @private * @param {?} state * @return {?} */ function (state) { this._renderer.setStyle(this._element.nativeElement, 'transition', this.transition); switch (state) { case DrawerState.Bottom: this.content.content.scrollToTop(0); this._setTranslateY(this._platform.height()); break; case DrawerState.Docked: this.content.content.scrollToTop(0); this._setTranslateY(this._platform.height() - this.dockedHeight); break; default: this._setTranslateY(this.distanceTop); } }; /** * @private * @param {?} event * @return {?} */ FivBottomSheet.prototype._handlePanStart = /** * @private * @param {?} event * @return {?} */ function (event) { this._startPositionTop = this.getCurrentTop(); this._startPositionOffset = event.touches[0].pageY; }; /** * @return {?} */ FivBottomSheet.prototype.getCurrentTop = /** * @return {?} */ function () { return this._element.nativeElement.getBoundingClientRect().top; }; /** * @private * @param {?} ev * @return {?} */ FivBottomSheet.prototype._handlePanEnd = /** * @private * @param {?} ev * @return {?} */ function (ev) { if (this.shouldBounce) { this._renderer.setStyle(this._element.nativeElement, 'transition', this.transition); switch (this.state) { case DrawerState.Docked: this._handleDockedPanEnd(ev); break; case DrawerState.Top: this._handleTopPanEnd(ev); break; default: this._handleBottomPanEnd(ev); } } this.stateChange.emit(this.state); }; /** * @private * @param {?} ev * @return {?} */ FivBottomSheet.prototype._handleTopPanEnd = /** * @private * @param {?} ev * @return {?} */ function (ev) { if (ev.distance > this.bounceThreshold) { if (this.state !== DrawerState.Docked) { this.state = DrawerState.Docked; this.fivDocked.emit(this); } } else { this._setTranslateY(this.distanceTop); } }; /** * @private * @param {?} ev * @return {?} */ FivBottomSheet.prototype._handleDockedPanEnd = /** * @private * @param {?} ev * @return {?} */ function (ev) { /** @type {?} */ var absDeltaY = Math.abs(ev.distance); if (absDeltaY > this.bounceThreshold && ev.distance < 0) { if (this.state !== DrawerState.Top) { this.state = DrawerState.Top; this.fivOpen.emit(); } } else if (absDeltaY > this.bounceThreshold && ev.distance > 0) { if (this.state !== DrawerState.Bottom) { this.close(); } } else { this._setTranslateY(this._platform.height() - this.dockedHeight); } }; /** * @private * @param {?} ev * @return {?} */ FivBottomSheet.prototype._handleBottomPanEnd = /** * @private * @param {?} ev * @return {?} */ function (ev) { if (-ev.distance > this.bounceThreshold) { if (this.state !== DrawerState.Docked) { this.state = DrawerState.Docked; this.fivDocked.emit(); } } else { this._setTranslateY('100vh'); } }; /** * @param {?} ev * @return {?} */ FivBottomSheet.prototype.calculatePanEvent = /** * @param {?} ev * @return {?} */ function (ev) { return { currentOffset: ev.touches[0].pageY, startOffset: this._startPositionOffset, startTop: this._startPositionTop, currentTop: this.getCurrentTop(), distance: ev.touches[0].pageY - this._startPositionOffset, touch: ev }; }; /** * @private * @param {?} event * @return {?} */ FivBottomSheet.prototype._handlePan = /** * @private * @param {?} event * @return {?} */ function (event) { this._renderer.setStyle(this._element.nativeElement, 'transition', 'none'); if (event.currentTop >= 0 && event.currentTop <= this._platform.height()) { /** @type {?} */ var newTop = this._startPositionTop + event.distance; if (newTop >= this.distanceTop) { this._setTranslateY(newTop); } else if (newTop <= this.distanceTop && this.content.panning) { this._setTranslateY(this.distanceTop); this.content.content.scrollToPoint(0, 0 - newTop, 0); } return event; } }; /** * @private * @param {?} value * @return {?} */ FivBottomSheet.prototype._setTranslateY = /** * @private * @param {?} value * @return {?} */ function (value) { var _this = this; this.fivProgress.emit(1 - value / (this._platform.height() - this.dockedHeight)); this._domCtrl.write((/** * @return {?} */ function () { _this._renderer.setStyle(_this._element.nativeElement, 'transform', 'translateY(' + value + 'px)'); })); }; /** * @return {?} */ FivBottomSheet.prototype.open = /** * @return {?} */ function () { this.state = DrawerState.Top; this._setDrawerState(this.state); this.updateContent(this.state); }; /** * @return {?} */ FivBottomSheet.prototype.close = /** * @return {?} */ function () { this.state = DrawerState.Bottom; this._setDrawerState(this.state); this.updateContent(this.state); this.fivClose.emit(); }; /** * @return {?} */ FivBottomSheet.prototype.dock = /** * @return {?} */ function () { this.state = DrawerState.Docked; this._setDrawerState(this.state); this.updateContent(this.state); }; FivBottomSheet.decorators = [ { type: Component, args: [{ selector: 'fiv-bottom-sheet', template: "<div class=\"fiv-bottom-drawer-scrollable-content\" no-bounce>\n <ng-content></ng-content>\n</div>", styles: [":host{width:100%;height:100%;position:absolute;left:0;z-index:11!important;background-color:rgba(0,0,0,0);transform:translateY(100vh)}.fiv-bottom-drawer-scrollable-content{width:100%;height:100%}"] }] } ]; /** @nocollapse */ FivBottomSheet.ctorParameters = function () { return [ { type: ElementRef }, { type: Renderer2 }, { type: DomController }, { type: Platform } ]; }; FivBottomSheet.propDecorators = { dockedHeight: [{ type: Input }], shouldBounce: [{ type: Input }], distanceTop: [{ type: Input }], transition: [{ type: Input }], state: [{ type: Input }], bounceThreshold: [{ type: Input }], panThreshold: [{ type: Input }], panEnabled: [{ type: Input }], stateChange: [{ type: Output }], fivOpen: [{ type: Output }], fivDocked: [{ type: Output }], fivClose: [{ type: Output }], fivProgress: [{ type: Output }], content: [{ type: ContentChild, args: [FivBottomSheetContent, { static: true },] }] }; return FivBottomSheet; }()); export { FivBottomSheet }; if (false) { /** @type {?} */ FivBottomSheet.prototype.dockedHeight; /** @type {?} */ FivBottomSheet.prototype.shouldBounce; /** @type {?} */ FivBottomSheet.prototype.distanceTop; /** @type {?} */ FivBottomSheet.prototype.transition; /** @type {?} */ FivBottomSheet.prototype.state; /** @type {?} */ FivBottomSheet.prototype.bounceThreshold; /** @type {?} */ FivBottomSheet.prototype.panThreshold; /** @type {?} */ FivBottomSheet.prototype.panEnabled; /** @type {?} */ FivBottomSheet.prototype.stateChange; /** @type {?} */ FivBottomSheet.prototype.fivOpen; /** @type {?} */ FivBottomSheet.prototype.fivDocked; /** @type {?} */ FivBottomSheet.prototype.fivClose; /** @type {?} */ FivBottomSheet.prototype.fivProgress; /** @type {?} */ FivBottomSheet.prototype.content; /** * @type {?} * @private */ FivBottomSheet.prototype._startPositionTop; /** @type {?} */ FivBottomSheet.prototype._startPositionOffset; /** @type {?} */ FivBottomSheet.prototype.scrollTop; /** @type {?} */ FivBottomSheet.prototype.$onDestroy; /** * @type {?} * @private */ FivBottomSheet.prototype._element; /** * @type {?} * @private */ FivBottomSheet.prototype._renderer; /** * @type {?} * @private */ FivBottomSheet.prototype._domCtrl; /** * @type {?} * @private */ FivBottomSheet.prototype._platform; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90dG9tLXNoZWV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BmaXZldGhyZWUvY29yZS8iLCJzb3VyY2VzIjpbImxpYi9ib3R0b20tc2hlZXQvYm90dG9tLXNoZWV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQzlGLE9BQU8sRUFDTCxTQUFTLEVBR1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osVUFBVSxFQUNWLFNBQVMsRUFFVCxZQUFZLEVBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQ0wsU0FBUyxFQUNULEdBQUcsRUFDSCxHQUFHLEVBQ0gsT0FBTyxFQUNQLE1BQU0sRUFDTixjQUFjLEVBQ2QsTUFBTSxFQUNOLEtBQUssRUFDTCxJQUFJLEVBQ0osVUFBVSxFQUVYLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFFeEIsOEJBT0M7OztJQU5DLGlDQUFzQjs7SUFDdEIsK0JBQW9COztJQUNwQiw4QkFBbUI7O0lBQ25CLDRCQUFpQjs7SUFDakIsNEJBQWlCOztJQUNqQix5QkFBa0I7O0FBR3BCO0lBNENFLHdCQUNVLFFBQW9CLEVBQ3BCLFNBQW9CLEVBQ3BCLFFBQXVCLEVBQ3ZCLFNBQW1CO1FBSG5CLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixhQUFRLEdBQVIsUUFBUSxDQUFlO1FBQ3ZCLGNBQVMsR0FBVCxTQUFTLENBQVU7UUExQ3BCLGlCQUFZLEdBQUcsRUFB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NEI7Ozs7O0lBQzVCLG1DQUE0Qjs7Ozs7SUFDNUIsa0NBQStCOzs7OztJQUMvQixtQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaXZCb3R0b21TaGVldENvbnRlbnQgfSBmcm9tICcuL2JvdHRvbS1zaGVldC1jb250ZW50L2JvdHRvbS1zaGVldC1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEFmdGVyVmlld0luaXQsXG4gIE9uQ2hhbmdlcyxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBFbGVtZW50UmVmLFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIENvbnRlbnRDaGlsZCxcbiAgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tQ29udHJvbGxlciwgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBEcmF3ZXJTdGF0ZSB9IGZyb20gJy4vZHJhd2VyLXN0YXRlJztcbmltcG9ydCB7IG1lcmdlLCBTdWJqZWN0LCBmcm9tRXZlbnQsIGZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIHRha2VVbnRpbCxcbiAgbWFwLFxuICB0YXAsXG4gIGZsYXRNYXAsXG4gIHJlcGVhdCxcbiAgd2l0aExhdGVzdEZyb20sXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIHRha2UsXG4gIHJlcGVhdFdoZW4sXG4gIHNraXBXaGlsZVxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFuRXZlbnQge1xuICBjdXJyZW50T2Zmc2V0OiBudW1iZXI7XG4gIHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG4gIGN1cnJlbnRUb3A6IG51bWJlcjtcbiAgc3RhcnRUb3A6IG51bWJlcjtcbiAgZGlzdGFuY2U6IG51bWJlcjtcbiAgdG91Y2g6IFRvdWNoRXZlbnQ7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Zpdi1ib3R0b20tc2hlZXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYm90dG9tLXNoZWV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYm90dG9tLXNoZWV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRml2Qm90dG9tU2hlZXQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGRvY2tlZEhlaWdodCA9IDgwO1xuXG4gIEBJbnB1dCgpIHNob3VsZEJvdW5jZSA9IHRydWU7XG5cbiAgQElucHV0KCkgZGlzdGFuY2VUb3AgPSA1NjtcblxuICBASW5wdXQoKSB0cmFuc2l0aW9uID0gJzAuMjVzJztcblxuICBASW5wdXQoKSBzdGF0ZTogRHJhd2VyU3RhdGUgPSBEcmF3ZXJTdGF0ZS5Cb3R0b207XG5cbiAgQElucHV0KCkgYm91bmNlVGhyZXNob2xkID0gNDA7XG4gIEBJbnB1dCgpIHBhblRocmVzaG9sZCA9IDIwO1xuXG4gIEBJbnB1dCgpIHBhbkVuYWJsZWQgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPERyYXdlclN0YXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgRHJhd2VyU3RhdGVcbiAgPigpO1xuICBAT3V0cHV0KCkgZml2T3BlbjogRXZlbnRFbWl0dGVyPEZpdkJvdHRvbVNoZWV0PiA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgRml2Qm90dG9tU2hlZXRcbiAgPigpO1xuICBAT3V0cHV0KCkgZml2RG9ja2VkOiBFdmVudEVtaXR0ZXI8Rml2Qm90dG9tU2hlZXQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxcbiAgICBGaXZCb3R0b21TaGVldFxuICA+KCk7XG4gIEBPdXRwdXQoKSBmaXZDbG9zZTogRXZlbnRFbWl0dGVyPEZpdkJvdHRvbVNoZWV0PiA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgRml2Qm90dG9tU2hlZXRcbiAgPigpO1xuICBAT3V0cHV0KCkgZml2UHJvZ3Jlc3M6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgQENvbnRlbnRDaGlsZChGaXZCb3R0b21TaGVldENvbnRlbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNvbnRlbnQ6IEZpdkJvdHRvbVNoZWV0Q29udGVudDtcblxuICBwcml2YXRlIF9zdGFydFBvc2l0aW9uVG9wOiBudW1iZXI7XG4gIF9zdGFydFBvc2l0aW9uT2Zmc2V0OiBudW1iZXI7XG4gIHNjcm9sbFRvcCA9IDA7XG5cbiAgJG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZWxlbWVudDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX2RvbUN0cmw6IERvbUNvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm06IFBsYXRmb3JtXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiRvbkRlc3Ryb3kubmV4dCgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX3NldERyYXdlclN0YXRlKHRoaXMuc3RhdGUpO1xuICAgIHRoaXMuY29udGVudC5zaG91bGRCb3VuY2UgPSB0aGlzLnNob3VsZEJvdW5jZTtcblxuICAgIGNvbnN0IHRvdWNobW92ZSA9IGZyb21FdmVudDxUb3VjaEV2ZW50PihcbiAgICAgIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICd0b3VjaG1vdmUnLFxuICAgICAge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9XG4gICAgKTtcbiAgICBjb25zdCB0b3VjaGVuZCA9IG1lcmdlKFxuICAgICAgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3RvdWNoZW5kJywge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KSxcbiAgICAgIGZyb21FdmVudDxUb3VjaEV2ZW50Pih0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd0b3VjaGNhbmNlbCcsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgZ2V0U2Nyb2xsQ29udGVudCA9IGZyb20odGhpcy5jb250ZW50LmNvbnRlbnQuZ2V0U2Nyb2xsRWxlbWVudCgpKTtcblxuICAgIGNvbnN0IHNjcm9sbCA9IHRoaXMuY29udGVudC5jb250ZW50LmlvblNjcm9sbC5waXBlKFxuICAgICAgdGFwKGVsID0+ICh0aGlzLnNjcm9sbFRvcCA9IGVsLmRldGFpbC5zY3JvbGxUb3ApKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLiRvbkRlc3Ryb3kpXG4gICAgKTtcbiAgICBzY3JvbGwuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLmNvbnRlbnQuY29udGVudC5pb25TY3JvbGxFbmRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoZWwgPT4gdGhpcy5zY3JvbGxUb3AgPT09IDAgJiYgdGhpcy5zdGF0ZSA9PT0gRHJhd2VyU3RhdGUuVG9wKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuY29udGVudC5jb250ZW50LnNjcm9sbEJ5UG9pbnQoMCwgMSwgMCkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy4kb25EZXN0cm95KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgY29uc3QgY2FuU3RhcnQgPSB0b3VjaG1vdmUucGlwZShmaWx0ZXIoKCkgPT4gdGhpcy5zY3JvbGxUb3AgPT09IDApKTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gY2FuU3RhcnQucGlwZShcbiAgICAgIHRha2UoMSksXG4gICAgICB0YXAoKHM6IFRvdWNoRXZlbnQpID0+IHRoaXMuX2hhbmRsZVBhblN0YXJ0KHMpKVxuICAgICk7XG5cbiAgICBjb25zdCBwYW4gPSBzdGFydC5waXBlKFxuICAgICAgZmlsdGVyKCgpID0+IHRoaXMucGFuRW5hYmxlZCksXG4gICAgICBmbGF0TWFwKCgpID0+IHRvdWNobW92ZSksXG4gICAgICBtYXAoKHRtOiBUb3VjaEV2ZW50KSA9PiB0aGlzLmNhbGN1bGF0ZVBhbkV2ZW50KHRtKSlcbiAgICApO1xuXG4gICAgY29uc3QgaGFuZGxlUGFuID0gcGFuLnBpcGUoXG4gICAgICBmaWx0ZXIocCA9PiBNYXRoLmFicyhwLmRpc3RhbmNlKSA+IHRoaXMucGFuVGhyZXNob2xkKSxcbiAgICAgIG1hcCh0bSA9PiB0aGlzLl9oYW5kbGVQYW4odG0pKSxcbiAgICAgIHRha2VVbnRpbCh0b3VjaGVuZCksXG4gICAgICByZXBlYXQoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLiRvbkRlc3Ryb3kpXG4gICAgKTtcblxuICAgIGNvbnN0IGhhbmRsZUJhY2tQYW4gPSBwYW5cbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgcCA9PiBNYXRoLmFicyhwLmRpc3RhbmNlKSA8PSB0aGlzLnBhblRocmVzaG9sZCAmJiB0aGlzLmNvbnRlbnQucGFubmluZ1xuICAgICAgICApLFxuICAgICAgICBtYXAodG0gPT4gdGhpcy5faGFuZGxlUGFuKHRtKSksXG4gICAgICAgIHRha2VVbnRpbCh0b3VjaGVuZCksXG4gICAgICAgIHJlcGVhdCgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy4kb25EZXN0cm95KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgaGFuZGxlUGFuXG4gICAgICAucGlwZShcbiAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgdGFwKCgpID0+ICh0aGlzLmNvbnRlbnQucGFubmluZyA9IHRydWUpKSxcbiAgICAgICAgcmVwZWF0V2hlbigoKSA9PiB0b3VjaGVuZCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLiRvbkRlc3Ryb3kpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBoYW5kbGVQYW5cbiAgICAgIC5waXBlKFxuICAgICAgICBmbGF0TWFwKCgpID0+IHRvdWNoZW5kKSxcbiAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgd2l0aExhdGVzdEZyb208VG91Y2hFdmVudCwgUGFuRXZlbnQ+KHBhbiksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmNvbnRlbnQuY29udGVudC5zY3JvbGxCeVBvaW50KDAsIDEsIDApKSxcbiAgICAgICAgdGFwKCgpID0+ICh0aGlzLmNvbnRlbnQucGFubmluZyA9IGZhbHNlKSksXG4gICAgICAgIG1hcChldiA9PiBldlsxXSksXG4gICAgICAgIHJlcGVhdCgpLFxuICAgICAgICB0YWtlVW50aWw8UGFuRXZlbnQ+KHRoaXMuJG9uRGVzdHJveSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXYgPT4gdGhpcy5faGFuZGxlUGFuRW5kKGV2KSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKCFjaGFuZ2VzLnN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NldERyYXdlclN0YXRlKGNoYW5nZXMuc3RhdGUuY3VycmVudFZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZUNvbnRlbnQoY2hhbmdlcy5zdGF0ZS5jdXJyZW50VmFsdWUpO1xuICB9XG5cbiAgdXBkYXRlQ29udGVudChzdGF0ZTogRHJhd2VyU3RhdGUpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnQudXBkYXRlU3RhdGUoc3RhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldERyYXdlclN0YXRlKHN0YXRlOiBEcmF3ZXJTdGF0ZSkge1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgJ3RyYW5zaXRpb24nLFxuICAgICAgdGhpcy50cmFuc2l0aW9uXG4gICAgKTtcbiAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICBjYXNlIERyYXdlclN0YXRlLkJvdHRvbTpcbiAgICAgICAgdGhpcy5jb250ZW50LmNvbnRlbnQuc2Nyb2xsVG9Ub3AoMCk7XG4gICAgICAgIHRoaXMuX3NldFRyYW5zbGF0ZVkodGhpcy5fcGxhdGZvcm0uaGVpZ2h0KCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRHJhd2VyU3RhdGUuRG9ja2VkOlxuICAgICAgICB0aGlzLmNvbnRlbnQuY29udGVudC5zY3JvbGxUb1RvcCgwKTtcbiAgICAgICAgdGhpcy5fc2V0VHJhbnNsYXRlWSh0aGlzLl9wbGF0Zm9ybS5oZWlnaHQoKSAtIHRoaXMuZG9ja2VkSGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9zZXRUcmFuc2xhdGVZKHRoaXMuZGlzdGFuY2VUb3ApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVBhblN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KSB7XG4gICAgdGhpcy5fc3RhcnRQb3NpdGlvblRvcCA9IHRoaXMuZ2V0Q3VycmVudFRvcCgpO1xuICAgIHRoaXMuX3N0YXJ0UG9zaXRpb25PZmZzZXQgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VZO1xuICB9XG5cbiAgZ2V0Q3VycmVudFRvcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVBhbkVuZChldjogUGFuRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zaG91bGRCb3VuY2UpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICd0cmFuc2l0aW9uJyxcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uXG4gICAgICApO1xuXG4gICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcbiAgICAgICAgY2FzZSBEcmF3ZXJTdGF0ZS5Eb2NrZWQ6XG4gICAgICAgICAgdGhpcy5faGFuZGxlRG9ja2VkUGFuRW5kKGV2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEcmF3ZXJTdGF0ZS5Ub3A6XG4gICAgICAgICAgdGhpcy5faGFuZGxlVG9wUGFuRW5kKGV2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLl9oYW5kbGVCb3R0b21QYW5FbmQoZXYpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXRlQ2hhbmdlLmVtaXQodGhpcy5zdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVUb3BQYW5FbmQoZXY6IFBhbkV2ZW50KSB7XG4gICAgaWYgKGV2LmRpc3RhbmNlID4gdGhpcy5ib3VuY2VUaHJlc2hvbGQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBEcmF3ZXJTdGF0ZS5Eb2NrZWQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERyYXdlclN0YXRlLkRvY2tlZDtcbiAgICAgICAgdGhpcy5maXZEb2NrZWQuZW1pdCh0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2V0VHJhbnNsYXRlWSh0aGlzLmRpc3RhbmNlVG9wKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVEb2NrZWRQYW5FbmQoZXY6IFBhbkV2ZW50KSB7XG4gICAgY29uc3QgYWJzRGVsdGFZID0gTWF0aC5hYnMoZXYuZGlzdGFuY2UpO1xuICAgIGlmIChhYnNEZWx0YVkgPiB0aGlzLmJvdW5jZVRocmVzaG9sZCAmJiBldi5kaXN0YW5jZSA8IDApIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBEcmF3ZXJTdGF0ZS5Ub3ApIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IERyYXdlclN0YXRlLlRvcDtcbiAgICAgICAgdGhpcy5maXZPcGVuLmVtaXQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFic0RlbHRhWSA+IHRoaXMuYm91bmNlVGhyZXNob2xkICYmIGV2LmRpc3RhbmNlID4gMCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IERyYXdlclN0YXRlLkJvdHRvbSkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NldFRyYW5zbGF0ZVkodGhpcy5fcGxhdGZvcm0uaGVpZ2h0KCkgLSB0aGlzLmRvY2tlZEhlaWdodCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQm90dG9tUGFuRW5kKGV2OiBQYW5FdmVudCkge1xuICAgIGlmICgtZXYuZGlzdGFuY2UgPiB0aGlzLmJvdW5jZVRocmVzaG9sZCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IERyYXdlclN0YXRlLkRvY2tlZCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gRHJhd2VyU3RhdGUuRG9ja2VkO1xuICAgICAgICB0aGlzLmZpdkRvY2tlZC5lbWl0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NldFRyYW5zbGF0ZVkoJzEwMHZoJyk7XG4gICAgfVxuICB9XG5cbiAgY2FsY3VsYXRlUGFuRXZlbnQoZXY6IFRvdWNoRXZlbnQpOiBQYW5FdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRPZmZzZXQ6IGV2LnRvdWNoZXNbMF0ucGFnZVksXG4gICAgICBzdGFydE9mZnNldDogdGhpcy5fc3RhcnRQb3NpdGlvbk9mZnNldCxcbiAgICAgIHN0YXJ0VG9wOiB0aGlzLl9zdGFydFBvc2l0aW9uVG9wLFxuICAgICAgY3VycmVudFRvcDogdGhpcy5nZXRDdXJyZW50VG9wKCksXG4gICAgICBkaXN0YW5jZTogZXYudG91Y2hlc1swXS5wYWdlWSAtIHRoaXMuX3N0YXJ0UG9zaXRpb25PZmZzZXQsXG4gICAgICB0b3VjaDogZXZcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlUGFuKGV2ZW50OiBQYW5FdmVudCkge1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3RyYW5zaXRpb24nLCAnbm9uZScpO1xuICAgIGlmIChldmVudC5jdXJyZW50VG9wID49IDAgJiYgZXZlbnQuY3VycmVudFRvcCA8PSB0aGlzLl9wbGF0Zm9ybS5oZWlnaHQoKSkge1xuICAgICAgY29uc3QgbmV3VG9wID0gdGhpcy5fc3RhcnRQb3NpdGlvblRvcCArIGV2ZW50LmRpc3RhbmNlO1xuICAgICAgaWYgKG5ld1RvcCA+PSB0aGlzLmRpc3RhbmNlVG9wKSB7XG4gICAgICAgIHRoaXMuX3NldFRyYW5zbGF0ZVkobmV3VG9wKTtcbiAgICAgIH0gZWxzZSBpZiAobmV3VG9wIDw9IHRoaXMuZGlzdGFuY2VUb3AgJiYgdGhpcy5jb250ZW50LnBhbm5pbmcpIHtcbiAgICAgICAgdGhpcy5fc2V0VHJhbnNsYXRlWSh0aGlzLmRpc3RhbmNlVG9wKTtcbiAgICAgICAgdGhpcy5jb250ZW50LmNvbnRlbnQuc2Nyb2xsVG9Qb2ludCgwLCAwIC0gbmV3VG9wLCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRUcmFuc2xhdGVZKHZhbHVlKSB7XG4gICAgdGhpcy5maXZQcm9ncmVzcy5lbWl0KFxuICAgICAgMSAtIHZhbHVlIC8gKHRoaXMuX3BsYXRmb3JtLmhlaWdodCgpIC0gdGhpcy5kb2NrZWRIZWlnaHQpXG4gICAgKTtcbiAgICB0aGlzLl9kb21DdHJsLndyaXRlKCgpID0+IHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAndHJhbnNsYXRlWSgnICsgdmFsdWUgKyAncHgpJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9wZW4oKSB7XG4gICAgdGhpcy5zdGF0ZSA9IERyYXdlclN0YXRlLlRvcDtcbiAgICB0aGlzLl9zZXREcmF3ZXJTdGF0ZSh0aGlzLnN0YXRlKTtcbiAgICB0aGlzLnVwZGF0ZUNvbnRlbnQodGhpcy5zdGF0ZSk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLnN0YXRlID0gRHJhd2VyU3RhdGUuQm90dG9tO1xuICAgIHRoaXMuX3NldERyYXdlclN0YXRlKHRoaXMuc3RhdGUpO1xuICAgIHRoaXMudXBkYXRlQ29udGVudCh0aGlzLnN0YXRlKTtcbiAgICB0aGlzLmZpdkNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIGRvY2soKSB7XG4gICAgdGhpcy5zdGF0ZSA9IERyYXdlclN0YXRlLkRvY2tlZDtcbiAgICB0aGlzLl9zZXREcmF3ZXJTdGF0ZSh0aGlzLnN0YXRlKTtcbiAgICB0aGlzLnVwZGF0ZUNvbnRlbnQodGhpcy5zdGF0ZSk7XG4gIH1cbn1cbiJdfQ==