UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

367 lines (366 loc) 31.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { ViewContainerRef, ViewChild, HostListener, Component, TemplateRef, Input, EventEmitter, Output, ViewEncapsulation, HostBinding } from '@angular/core'; /** * @record */ export function Indicator() { } /** @type {?|undefined} */ Indicator.prototype.activate; /** @type {?|undefined} */ Indicator.prototype.deactivate; /** @type {?|undefined} */ Indicator.prototype.release; /** @type {?|undefined} */ Indicator.prototype.finish; var PullToRefreshComponent = /** @class */ (function () { function PullToRefreshComponent() { this.transtionCls = {}; this.style = { '-webkit-transform': 'translate3d( 0, 0, 0 )', transform: 'translate3d( 0, 0, 0 )' }; this.state = { currSt: 'deactivate', drag: false }; this._indicator = { activate: '松开立即刷新', deactivate: '下拉可以刷新', release: '刷新中。。。', finish: '完成刷新' }; this._direction = 'down'; this._clientHeight = 0; this._currentContentHeight = 0; this._footerHeight = 54; this._lastcontentOffset = 0; this._viewHeight = Math.max(window.innerHeight, window.innerWidth); this.scrollRefresh = false; this.distanceToRefresh = 25; this.damping = 100; this.footerRefresh = new EventEmitter(); this.onRefresh = new EventEmitter(); this.refresh = true; this.container = true; this.refreshUp = false; this.refreshDown = true; } Object.defineProperty(PullToRefreshComponent.prototype, "direction", { get: /** * @return {?} */ function () { return this._direction; }, set: /** * @param {?} value * @return {?} */ function (value) { this._direction = value; this.refreshUp = this._direction === 'up'; this.refreshDown = this._direction === 'down'; }, enumerable: true, configurable: true }); Object.defineProperty(PullToRefreshComponent.prototype, "indicator", { get: /** * @return {?} */ function () { return this._indicator; }, set: /** * @param {?} value * @return {?} */ function (value) { this._indicator.activate = value.activate ? value.activate : this._indicator.activate; this._indicator.deactivate = value.deactivate ? value.deactivate : this._indicator.deactivate; this._indicator.release = value.release ? value.release : this._indicator.release; this._indicator.finish = value.finish ? value.finish : this._indicator.finish; }, enumerable: true, configurable: true }); /** * @param {?} e * @return {?} */ PullToRefreshComponent.prototype.touchstart = /** * @param {?} e * @return {?} */ function (e) { if (this._direction === 'down') { if (document.getElementsByTagName('pulltorefresh')[0].scrollTop > 0) { this.startY = undefined; return; } this.startY = e && e.changedTouches && e.changedTouches[0] && e.changedTouches[0].clientY; this.state.drag = undefined; } else { this.startY = e && e.changedTouches && e.changedTouches[0] && e.changedTouches[0].clientY; this._clientHeight = this._pullToRefresh.element.nativeElement.clientHeight; this._currentContentHeight = document.getElementsByTagName('pulltorefresh')[0].clientHeight; } this.transtionCls = ''; }; /** * @param {?} e * @return {?} */ PullToRefreshComponent.prototype.touchmove = /** * @param {?} e * @return {?} */ function (e) { if (this._direction === 'down') { if (!this.startY) { return; } /** @type {?} */ var distanceY = e.changedTouches[0].clientY - this.startY; if (distanceY < 0) { // 滚动 this.state.drag = false; } else { // 下拉 this.state.drag = true; } if (this.state.drag) { // 禁止滚动 e.preventDefault(); } else { return; } if (distanceY > this.damping) { //当超过设定阈值是,缓慢增加 distanceY = (distanceY / (distanceY + this.damping)) * this.damping * 2; } else if (distanceY < 0) { distanceY = 0; } if (distanceY > this.distanceToRefresh) { this.state.currSt = 'activate'; } this.style = { '-webkit-transform': 'translate3d( 0, ' + distanceY + 'px, 0 )', transform: 'translate3d( 0, ' + distanceY + 'px, 0 )' }; } else { /** @type {?} */ var distanceY = e.changedTouches[0].clientY - this.startY; //向上拉动的时候,如果当前窗口内容没有滚到最后,则不实现拖动的动作;向下滚动不实现拖动动作 if (Math.abs(this._lastcontentOffset) <= this._clientHeight - this._currentContentHeight - this.distanceToRefresh || distanceY > 0) { // 滚动 this.state.drag = false; } else { // 上拉 this.state.drag = true; } if (this.state.drag) { // 禁止滚动 e.preventDefault(); } else { return; } //如果滑动到底部了,滑动距离随着拉动的距离增加缓慢增加 distanceY = -(distanceY / (distanceY - this.damping)) * this.damping; if (Math.abs(distanceY) > this.distanceToRefresh) { this.state.currSt = 'activate'; } this.style = { '-webkit-transform': 'translate3d( 0, ' + distanceY + 'px, 0 )', transform: 'translate3d( 0, ' + distanceY + 'px, 0 )' }; } }; /** * @param {?} e * @return {?} */ PullToRefreshComponent.prototype.touchend = /** * @param {?} e * @return {?} */ function (e) { var _this = this; if (!this.startY || this.state.drag === false) { return; } /** @type {?} */ var distanceY = e.changedTouches[0].clientY - this.startY; if (Math.abs(distanceY) >= this.distanceToRefresh) { this.state.currSt = 'release'; if (this._direction === 'down') { this.translateY(this.distanceToRefresh + 1); } else { this.translateY(-this.distanceToRefresh - 1); } setTimeout(function () { _this.state.currSt = 'finish'; _this.onRefresh.emit(); setTimeout(function () { _this.state.currSt = 'deactivate'; _this.translateY(0); }, 0); }, 500); } else { this.translateY(0); } }; /** * @param {?} evt * @return {?} */ PullToRefreshComponent.prototype.touchcancel = /** * @param {?} evt * @return {?} */ function (evt) { this.translateY(0); }; /** * @param {?} evt * @return {?} */ PullToRefreshComponent.prototype.scroll = /** * @param {?} evt * @return {?} */ function (evt) { var _this = this; /** @type {?} */ var contentOffset = evt.target.scrollTop; /** @type {?} */ var offset = contentOffset - this._lastcontentOffset; this._lastcontentOffset = contentOffset; if (!this.scrollRefresh) { return; } if (offset > 0 && contentOffset > 0 && evt.target.scrollTop + this._viewHeight > evt.target.scrollHeight - this._footerHeight / 2) { setTimeout(function () { _this.footerRefresh.emit('finished'); }, 500); } }; /** * @param {?} value * @return {?} */ PullToRefreshComponent.prototype.isTemplateRef = /** * @param {?} value * @return {?} */ function (value) { if (value) { return value instanceof TemplateRef; } }; /** * @param {?} distanceY * @return {?} */ PullToRefreshComponent.prototype.translateY = /** * @param {?} distanceY * @return {?} */ function (distanceY) { this.transtionCls = 'am-pull-to-refresh-transition'; this.style = { '-webkit-transform': 'translate3d( 0, ' + distanceY + 'px, 0 )', transform: 'translate3d( 0, ' + distanceY + 'px, 0 )' }; }; PullToRefreshComponent.decorators = [ { type: Component, args: [{ selector: 'PullToRefresh, nzm-pull-to-refresh', template: "<div class=\"am-pull-to-refresh-content-wrapper\">\n <div class=\"am-pull-to-refresh-content\" [ngClass]=\"transtionCls\" [ngStyle]=\"style\">\n <div *ngIf=\"direction === 'down'\" class=\"am-pull-to-refresh-indicator\">\n <ng-template *ngIf=\"isTemplateRef(indicator[state.currSt])\" [ngTemplateOutlet]=\"indicator[state.currSt]\"></ng-template>\n <ng-container *ngIf=\"!isTemplateRef(indicator[state.currSt])\">{{indicator[state.currSt]}}</ng-container>\n </div>\n <div #pullToRefresh>\n <ng-content></ng-content>\n </div>\n <div *ngIf=\"direction === 'up'\" class=\"am-pull-to-refresh-indicator\">\n <ng-template *ngIf=\"isTemplateRef(indicator[state.currSt])\" [ngTemplateOutlet]=\"indicator[state.currSt]\"></ng-template>\n <ng-container *ngIf=\"!isTemplateRef(indicator[state.currSt])\">{{indicator[state.currSt]}}</ng-container>\n </div>\n </div>\n</div>\n", encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ PullToRefreshComponent.ctorParameters = function () { return []; }; PullToRefreshComponent.propDecorators = { _pullToRefresh: [{ type: ViewChild, args: ['pullToRefresh', { read: ViewContainerRef },] }], scrollRefresh: [{ type: Input }], distanceToRefresh: [{ type: Input }], damping: [{ type: Input }], direction: [{ type: Input }], indicator: [{ type: Input }], footerRefresh: [{ type: Output }], onRefresh: [{ type: Output }], refresh: [{ type: HostBinding, args: ['class.am-pull-to-refresh',] }], container: [{ type: HostBinding, args: ['class.super-container',] }], refreshUp: [{ type: HostBinding, args: ['class.am-pull-to-refresh-up',] }], refreshDown: [{ type: HostBinding, args: ['class.am-pull-to-refresh-down',] }], touchstart: [{ type: HostListener, args: ['touchstart', ['$event'],] }], touchmove: [{ type: HostListener, args: ['touchmove', ['$event'],] }], touchend: [{ type: HostListener, args: ['touchend', ['$event'],] }], touchcancel: [{ type: HostListener, args: ['touchcancel', ['$event'],] }], scroll: [{ type: HostListener, args: ['scroll', ['$event'],] }] }; return PullToRefreshComponent; }()); export { PullToRefreshComponent }; if (false) { /** @type {?} */ PullToRefreshComponent.prototype.transtionCls; /** @type {?} */ PullToRefreshComponent.prototype.style; /** @type {?} */ PullToRefreshComponent.prototype.startY; /** @type {?} */ PullToRefreshComponent.prototype.state; /** @type {?} */ PullToRefreshComponent.prototype._indicator; /** @type {?} */ PullToRefreshComponent.prototype._direction; /** @type {?} */ PullToRefreshComponent.prototype._clientHeight; /** @type {?} */ PullToRefreshComponent.prototype._currentContentHeight; /** @type {?} */ PullToRefreshComponent.prototype._footerHeight; /** @type {?} */ PullToRefreshComponent.prototype._lastcontentOffset; /** @type {?} */ PullToRefreshComponent.prototype._viewHeight; /** @type {?} */ PullToRefreshComponent.prototype._pullToRefresh; /** @type {?} */ PullToRefreshComponent.prototype.scrollRefresh; /** @type {?} */ PullToRefreshComponent.prototype.distanceToRefresh; /** @type {?} */ PullToRefreshComponent.prototype.damping; /** @type {?} */ PullToRefreshComponent.prototype.footerRefresh; /** @type {?} */ PullToRefreshComponent.prototype.onRefresh; /** @type {?} */ PullToRefreshComponent.prototype.refresh; /** @type {?} */ PullToRefreshComponent.prototype.container; /** @type {?} */ PullToRefreshComponent.prototype.refreshUp; /** @type {?} */ PullToRefreshComponent.prototype.refreshDown; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC10by1yZWZyZXNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsicHVsbC10by1yZWZyZXNoL3B1bGwtdG8tcmVmcmVzaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFlBQVksRUFDWixTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssRUFDTCxZQUFZLEVBQ1osTUFBTSxFQUNOLGlCQUFpQixFQUNqQixXQUFXLEVBQ1osTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7O0lBK01yQjs0QkFqTW9CLEVBQUU7cUJBQ047WUFDZCxtQkFBbUIsRUFBRSx3QkFBd0I7WUFDN0MsU0FBUyxFQUFFLHdCQUF3QjtTQUNwQztxQkFFWTtZQUNYLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLElBQUksRUFBRSxLQUFLO1NBQ1o7MEJBRStCO1lBQzlCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLE1BQU0sRUFBRSxNQUFNO1NBQ2Y7MEJBQzRCLE1BQU07NkJBQ0gsQ0FBQztxQ0FDTyxDQUFDOzZCQUNULEVBQUU7a0NBQ0csQ0FBQzsyQkFDUixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQzs2QkFNcEQsS0FBSztpQ0FFRixFQUFFO3VCQUVaLEdBQUc7NkJBcUJjLElBQUksWUFBWSxFQUFFO3lCQUV0QixJQUFJLFlBQVksRUFBRTt1QkFHOUIsSUFBSTt5QkFFRixJQUFJO3lCQUVKLEtBQUs7MkJBRUgsSUFBSTtLQWlJWDtJQWhLaEIsc0JBQ0ksNkNBQVM7Ozs7UUFEYjtZQUVFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUN4Qjs7Ozs7UUFDRCxVQUFjLEtBQWE7WUFDekIsSUFBSSxD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QUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQzt5QkFJdEMsWUFBWSxTQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7aUNBdk1wQzs7U0F3QmEsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0NoaWxkLFxuICBIb3N0TGlzdGVuZXIsXG4gIENvbXBvbmVudCxcbiAgVGVtcGxhdGVSZWYsXG4gIElucHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE91dHB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuZXhwb3J0IGludGVyZmFjZSBJbmRpY2F0b3Ige1xuICBhY3RpdmF0ZT86IGFueTtcbiAgZGVhY3RpdmF0ZT86IGFueTtcbiAgcmVsZWFzZT86IGFueTtcbiAgZmluaXNoPzogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdQdWxsVG9SZWZyZXNoLCBuem0tcHVsbC10by1yZWZyZXNoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3B1bGwtdG8tcmVmcmVzaC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgUHVsbFRvUmVmcmVzaENvbXBvbmVudCB7XG4gIHRyYW5zdGlvbkNsczogYW55ID0ge307XG4gIHN0eWxlOiBvYmplY3QgPSB7XG4gICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZTNkKCAwLCAwLCAwICknLFxuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCAwLCAwLCAwICknXG4gIH07XG4gIHN0YXJ0WTogbnVtYmVyO1xuICBzdGF0ZTogYW55ID0ge1xuICAgIGN1cnJTdDogJ2RlYWN0aXZhdGUnLFxuICAgIGRyYWc6IGZhbHNlXG4gIH07XG5cbiAgcHJpdmF0ZSBfaW5kaWNhdG9yOiBJbmRpY2F0b3IgPSB7XG4gICAgYWN0aXZhdGU6ICfmnb7lvIDnq4vljbPliLfmlrAnLFxuICAgIGRlYWN0aXZhdGU6ICfkuIvmi4nlj6/ku6XliLfmlrAnLFxuICAgIHJlbGVhc2U6ICfliLfmlrDkuK3jgILjgILjgIInLFxuICAgIGZpbmlzaDogJ+WujOaIkOWIt+aWsCdcbiAgfTtcbiAgcHJpdmF0ZSBfZGlyZWN0aW9uOiBzdHJpbmcgPSAnZG93bic7XG4gIHByaXZhdGUgX2NsaWVudEhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfY3VycmVudENvbnRlbnRIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2Zvb3RlckhlaWdodDogbnVtYmVyID0gNTQ7XG4gIHByaXZhdGUgX2xhc3Rjb250ZW50T2Zmc2V0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF92aWV3SGVpZ2h0OiBudW1iZXIgPSBNYXRoLm1heCh3aW5kb3cuaW5uZXJIZWlnaHQsIHdpbmRvdy5pbm5lcldpZHRoKTtcblxuICBAVmlld0NoaWxkKCdwdWxsVG9SZWZyZXNoJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIHByaXZhdGUgX3B1bGxUb1JlZnJlc2g6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQElucHV0KClcbiAgc2Nyb2xsUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBkaXN0YW5jZVRvUmVmcmVzaDogbnVtYmVyID0gMjU7IC8v6Kem5Y+R5Yi35paw6Led56a7XG4gIEBJbnB1dCgpXG4gIGRhbXBpbmc6IG51bWJlciA9IDEwMDsgLy8g5LiL5ouJ55qE5pyA5aSn6Led56a7XG4gIEBJbnB1dCgpXG4gIGdldCBkaXJlY3Rpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uO1xuICB9XG4gIHNldCBkaXJlY3Rpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RpcmVjdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMucmVmcmVzaFVwID0gdGhpcy5fZGlyZWN0aW9uID09PSAndXAnO1xuICAgIHRoaXMucmVmcmVzaERvd24gPSB0aGlzLl9kaXJlY3Rpb24gPT09ICdkb3duJztcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgaW5kaWNhdG9yKCk6IEluZGljYXRvciB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGljYXRvcjtcbiAgfVxuICBzZXQgaW5kaWNhdG9yKHZhbHVlOiBJbmRpY2F0b3IpIHtcbiAgICB0aGlzLl9pbmRpY2F0b3IuYWN0aXZhdGUgPSB2YWx1ZS5hY3RpdmF0ZSA/IHZhbHVlLmFjdGl2YXRlIDogdGhpcy5faW5kaWNhdG9yLmFjdGl2YXRlO1xuICAgIHRoaXMuX2luZGljYXRvci5kZWFjdGl2YXRlID0gdmFsdWUuZGVhY3RpdmF0ZSA/IHZhbHVlLmRlYWN0aXZhdGUgOiB0aGlzLl9pbmRpY2F0b3IuZGVhY3RpdmF0ZTtcbiAgICB0aGlzLl9pbmRpY2F0b3IucmVsZWFzZSA9IHZhbHVlLnJlbGVhc2UgPyB2YWx1ZS5yZWxlYXNlIDogdGhpcy5faW5kaWNhdG9yLnJlbGVhc2U7XG4gICAgdGhpcy5faW5kaWNhdG9yLmZpbmlzaCA9IHZhbHVlLmZpbmlzaCA/IHZhbHVlLmZpbmlzaCA6IHRoaXMuX2luZGljYXRvci5maW5pc2g7XG4gIH1cbiAgQE91dHB1dCgpXG4gIGZvb3RlclJlZnJlc2g6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgb25SZWZyZXNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXB1bGwtdG8tcmVmcmVzaCcpXG4gIHJlZnJlc2g6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnN1cGVyLWNvbnRhaW5lcicpXG4gIGNvbnRhaW5lcjogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tcHVsbC10by1yZWZyZXNoLXVwJylcbiAgcmVmcmVzaFVwOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tcHVsbC10by1yZWZyZXNoLWRvd24nKVxuICByZWZyZXNoRG93bjogYm9vbGVhbiA9IHRydWU7XG5cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gIHRvdWNoc3RhcnQoZSkge1xuICAgIGlmICh0aGlzLl9kaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwdWxsdG9yZWZyZXNoJylbMF0uc2Nyb2xsVG9wID4gMCkge1xuICAgICAgICB0aGlzLnN0YXJ0WSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGFydFkgPSBlICYmIGUuY2hhbmdlZFRvdWNoZXMgJiYgZS5jaGFuZ2VkVG91Y2hlc1swXSAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICB0aGlzLnN0YXRlLmRyYWcgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnRZID0gZSAmJiBlLmNoYW5nZWRUb3VjaGVzICYmIGUuY2hhbmdlZFRvdWNoZXNbMF0gJiYgZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgdGhpcy5fY2xpZW50SGVpZ2h0ID0gdGhpcy5fcHVsbFRvUmVmcmVzaC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgdGhpcy5fY3VycmVudENvbnRlbnRIZWlnaHQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgncHVsbHRvcmVmcmVzaCcpWzBdLmNsaWVudEhlaWdodDtcbiAgICB9XG4gICAgdGhpcy50cmFuc3Rpb25DbHMgPSAnJztcbiAgfVxuICBASG9zdExpc3RlbmVyKCd0b3VjaG1vdmUnLCBbJyRldmVudCddKVxuICB0b3VjaG1vdmUoZSkge1xuICAgIGlmICh0aGlzLl9kaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgaWYgKCF0aGlzLnN0YXJ0WSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgZGlzdGFuY2VZID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG4gICAgICBpZiAoZGlzdGFuY2VZIDwgMCkge1xuICAgICAgICAvLyDmu5rliqhcbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDkuIvmi4lcbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXRlLmRyYWcpIHtcbiAgICAgICAgLy8g56aB5q2i5rua5YqoXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkaXN0YW5jZVkgPiB0aGlzLmRhbXBpbmcpIHtcbiAgICAgICAgLy/lvZPotoXov4forr7lrprpmIjlgLzmmK/vvIznvJPmhaLlop7liqBcbiAgICAgICAgZGlzdGFuY2VZID0gKGRpc3RhbmNlWSAvIChkaXN0YW5jZVkgKyB0aGlzLmRhbXBpbmcpKSAqIHRoaXMuZGFtcGluZyAqIDI7XG4gICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlWSA8IDApIHtcbiAgICAgICAgZGlzdGFuY2VZID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChkaXN0YW5jZVkgPiB0aGlzLmRpc3RhbmNlVG9SZWZyZXNoKSB7XG4gICAgICAgIHRoaXMuc3RhdGUuY3VyclN0ID0gJ2FjdGl2YXRlJztcbiAgICAgIH1cbiAgICAgIHRoaXMuc3R5bGUgPSB7XG4gICAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGUzZCggMCwgJyArIGRpc3RhbmNlWSArICdweCwgMCApJyxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoIDAsICcgKyBkaXN0YW5jZVkgKyAncHgsIDAgKSdcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBkaXN0YW5jZVkgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICAgIC8v5ZCR5LiK5ouJ5Yqo55qE5pe25YCZ77yM5aaC5p6c5b2T5YmN56qX5Y+j5YaF5a655rKh5pyJ5rua5Yiw5pyA5ZCO77yM5YiZ5LiN5a6e546w5ouW5Yqo55qE5Yqo5L2c77yb5ZCR5LiL5rua5Yqo5LiN5a6e546w5ouW5Yqo5Yqo5L2cXG4gICAgICBpZiAoXG4gICAgICAgIE1hdGguYWJzKHRoaXMuX2xhc3Rjb250ZW50T2Zmc2V0KSA8PSB0aGlzLl9jbGllbnRIZWlnaHQgLSB0aGlzLl9jdXJyZW50Q29udGVudEhlaWdodCAtIHRoaXMuZGlzdGFuY2VUb1JlZnJlc2ggfHxcbiAgICAgICAgZGlzdGFuY2VZID4gMFxuICAgICAgKSB7XG4gICAgICAgIC8vIOa7muWKqFxuICAgICAgICB0aGlzLnN0YXRlLmRyYWcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOS4iuaLiVxuICAgICAgICB0aGlzLnN0YXRlLmRyYWcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhdGUuZHJhZykge1xuICAgICAgICAvLyDnpoHmraLmu5rliqhcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy/lpoLmnpzmu5HliqjliLDlupXpg6jkuobvvIzmu5Hliqjot53nprvpmo/nnYDmi4nliqjnmoTot53nprvlop7liqDnvJPmhaLlop7liqBcbiAgICAgIGRpc3RhbmNlWSA9IC0oZGlzdGFuY2VZIC8gKGRpc3RhbmNlWSAtIHRoaXMuZGFtcGluZykpICogdGhpcy5kYW1waW5nO1xuICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlWSkgPiB0aGlzLmRpc3RhbmNlVG9SZWZyZXNoKSB7XG4gICAgICAgIHRoaXMuc3RhdGUuY3VyclN0ID0gJ2FjdGl2YXRlJztcbiAgICAgIH1cbiAgICAgIHRoaXMuc3R5bGUgPSB7XG4gICAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGUzZCggMCwgJyArIGRpc3RhbmNlWSArICdweCwgMCApJyxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoIDAsICcgKyBkaXN0YW5jZVkgKyAncHgsIDAgKSdcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgdG91Y2hlbmQoZSkge1xuICAgIGlmICghdGhpcy5zdGFydFkgfHwgdGhpcy5zdGF0ZS5kcmFnID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXN0YW5jZVkgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2VZKSA+PSB0aGlzLmRpc3RhbmNlVG9SZWZyZXNoKSB7XG4gICAgICB0aGlzLnN0YXRlLmN1cnJTdCA9ICdyZWxlYXNlJztcbiAgICAgIGlmICh0aGlzLl9kaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVkodGhpcy5kaXN0YW5jZVRvUmVmcmVzaCArIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVZKC10aGlzLmRpc3RhbmNlVG9SZWZyZXNoIC0gMSk7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJyU3QgPSAnZmluaXNoJztcbiAgICAgICAgdGhpcy5vblJlZnJlc2guZW1pdCgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnN0YXRlLmN1cnJTdCA9ICdkZWFjdGl2YXRlJztcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVkoMCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSwgNTAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2xhdGVZKDApO1xuICAgIH1cbiAgfVxuICBASG9zdExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIFsnJGV2ZW50J10pXG4gIHRvdWNoY2FuY2VsKGV2dCkge1xuICAgIHRoaXMudHJhbnNsYXRlWSgwKTtcbiAgfVxuICBASG9zdExpc3RlbmVyKCdzY3JvbGwnLCBbJyRldmVudCddKVxuICBzY3JvbGwoZXZ0KSB7XG4gICAgY29uc3QgY29udGVudE9mZnNldCA9IGV2dC50YXJnZXQuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IG9mZnNldCA9IGNvbnRlbnRPZmZzZXQgLSB0aGlzLl9sYXN0Y29udGVudE9mZnNldDtcbiAgICB0aGlzLl9sYXN0Y29udGVudE9mZnNldCA9IGNvbnRlbnRPZmZzZXQ7XG4gICAgaWYgKCF0aGlzLnNjcm9sbFJlZnJlc2gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgb2Zmc2V0ID4gMCAmJlxuICAgICAgY29udGVudE9mZnNldCA+IDAgJiZcbiAgICAgIGV2dC50YXJnZXQuc2Nyb2xsVG9wICsgdGhpcy5fdmlld0hlaWdodCA+IGV2dC50YXJnZXQuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5fZm9vdGVySGVpZ2h0IC8gMlxuICAgICkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZm9vdGVyUmVmcmVzaC5lbWl0KCdmaW5pc2hlZCcpO1xuICAgICAgfSwgNTAwKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgaXNUZW1wbGF0ZVJlZih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gICAgfVxuICB9XG5cbiAgdHJhbnNsYXRlWShkaXN0YW5jZVkpIHtcbiAgICB0aGlzLnRyYW5zdGlvbkNscyA9ICdhbS1wdWxsLXRvLXJlZnJlc2gtdHJhbnNpdGlvbic7XG4gICAgdGhpcy5zdHlsZSA9IHtcbiAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGUzZCggMCwgJyArIGRpc3RhbmNlWSArICdweCwgMCApJyxcbiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCAwLCAnICsgZGlzdGFuY2VZICsgJ3B4LCAwICknXG4gICAgfTtcbiAgfVxufVxuIl19