@fivethree/core
Version:
Fivethree Core Components
538 lines • 42 kB
JavaScript
/**
* @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==