UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

368 lines 36.2 kB
/** * @fileoverview added by tsickle * Generated from: sticky.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, ViewChild, HostListener, ElementRef, HostBinding } from '@angular/core'; var StickyComponent = /** @class */ (function () { function StickyComponent(el) { var _this = this; this.el = el; this.hostPosition = 'relative'; this.statusChange = new EventEmitter(); this._prevStatus = undefined; this._status = 'normal'; // 用于监听是否是横向滚动 this.THROTTLE_DELAY = 16; this.THROTTLE_TRIGGER = 100; this.throttle = (/** * @return {?} */ function () { /** @type {?} */ var fn = _this.scrollAndResizeHock; /** @type {?} */ var time = Date.now(); if (_this.scrollTimer) { clearTimeout(_this.scrollTimer); } if (!_this.scrollPreStart) { _this.scrollPreStart = time; } if (time - _this.scrollPreStart > _this.THROTTLE_TRIGGER) { fn(); _this.scrollPreStart = null; _this.scrollTimer = null; } else { _this.scrollTimer = setTimeout((/** * @return {?} */ function () { fn(); _this.scrollPreStart = null; _this.scrollTimer = null; }), _this.THROTTLE_DELAY); } }); this.scrollAndResizeHock = (/** * @return {?} */ function () { if (_this.container.getBoundingClientRect().left - (_this.containerLeft || 0) !== 0) { _this.status = 'stay'; _this.containerLeft = _this.container.getBoundingClientRect().left; } else { _this.scrollHandler(); } }); this.scrollHandler = (/** * @return {?} */ function () { /** @type {?} */ var computedStyle = window.getComputedStyle(_this.container); if (_this.parentNode.getBoundingClientRect().top > (_this.view && _this.view.top || 0)) { _this.status = 'normal'; // 全局滑动(container!==parentNode)时候增加预判 } else if (_this.container.getBoundingClientRect().top + parseInt(computedStyle.paddingTop, 10) + parseInt(computedStyle.borderTopWidth, 10) >= (_this.view && _this.view.top || 0)) { _this.status = 'normal'; } else if (_this.container.getBoundingClientRect().bottom - parseInt(computedStyle.paddingBottom, 10) - parseInt(computedStyle.borderBottomWidth, 10) - _this.wrapper.nativeElement.getBoundingClientRect().height < (_this.view && _this.view.top || 0) + (_this.view && _this.view.bottom || 0)) { _this.status = 'remain'; } else if ((_this.container.getBoundingClientRect().top + parseInt(computedStyle.paddingTop, 10) < (_this.view && _this.view.top || 0))) { _this.status = 'follow'; } }); } Object.defineProperty(StickyComponent.prototype, "status", { get: /** * @return {?} */ function () { return this._status; }, set: /** * @param {?} status * @return {?} */ function (status) { if (status !== this._status) { this._prevStatus = this._status; this._status = status; this.statusProcess(this._status); } }, enumerable: true, configurable: true }); /** * @return {?} */ StickyComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.parentNode = this.el.nativeElement.parentNode; if (!this.container) { this.container = this.parentNode; } }; /** * @return {?} */ StickyComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.scrollTarget = this.scrollTarget || window; // window有scroll事件,document.documentElement没有scroll事件 this.scrollTarget.addEventListener('scroll', this.throttle); this.initScrollStatus(this.scrollTarget); }; /** * @return {?} */ StickyComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.scrollTarget.removeEventListener('scroll', this.throttle); }; /** * @param {?} status * @return {?} */ StickyComponent.prototype.statusProcess = /** * @param {?} status * @return {?} */ function (status) { switch (status) { case 'normal': this.wrapper.nativeElement.style.top = 'auto'; this.wrapper.nativeElement.style.left = 'auto'; this.wrapper.nativeElement.style.position = 'static'; break; case 'follow': this.wrapper.nativeElement.style.top = (this.view && this.view.top || 0) + 'px'; this.wrapper.nativeElement.style.left = this.wrapper.nativeElement.getBoundingClientRect().left + 'px'; this.wrapper.nativeElement.style.position = 'fixed'; break; case 'stay': this.wrapper.nativeElement.style.top = this.calculateRelativePosition(this.wrapper.nativeElement, this.parentNode, 'top') + 'px'; this.wrapper.nativeElement.style.left = 'auto'; this.wrapper.nativeElement.style.position = 'relative'; break; case 'remain': if (this.wrapper.nativeElement.style.position !== 'fixed' || this.wrapper.nativeElement.style.position !== 'absolute') { this.wrapper.nativeElement.style.top = this.calculateRelativePosition(this.wrapper.nativeElement, this.parentNode, 'top') + 'px'; this.wrapper.nativeElement.style.left = 'auto'; this.wrapper.nativeElement.style.position = 'absolute'; // 要先转为absolute再计算,否则如果处于非fixed影响计算 } this.wrapper.nativeElement.style.top = this.calculateRemainPosition(this.wrapper.nativeElement, this.parentNode, this.container) + 'px'; this.wrapper.nativeElement.style.left = this.calculateRelativePosition(this.wrapper.nativeElement, this.parentNode, 'left') + 'px'; this.wrapper.nativeElement.style.position = 'relative'; break; default: break; } }; /** * @param {?} element * @param {?} relativeElement * @param {?} direction * @return {?} */ StickyComponent.prototype.calculateRelativePosition = /** * @param {?} element * @param {?} relativeElement * @param {?} direction * @return {?} */ function (element, relativeElement, direction) { /** @type {?} */ var key = { 'left': ['left', 'Left'], 'top': ['top', 'Top'] }; if (window && window.getComputedStyle) { /** @type {?} */ var computedStyle = window.getComputedStyle(relativeElement); return element.getBoundingClientRect()[key[direction][0]] - relativeElement.getBoundingClientRect()[key[direction][0]] - parseInt(computedStyle['padding' + key[direction][1]], 10) - parseInt(computedStyle['border' + key[direction][1] + 'Width'], 10); } }; /** * @param {?} element * @param {?} relativeElement * @param {?} container * @return {?} */ StickyComponent.prototype.calculateRemainPosition = /** * @param {?} element * @param {?} relativeElement * @param {?} container * @return {?} */ function (element, relativeElement, container) { if (window && window.getComputedStyle) { /** @type {?} */ var computedStyle = window.getComputedStyle(container); /** @type {?} */ var result = container.getBoundingClientRect().height - element.getBoundingClientRect().height + container.getBoundingClientRect().top - relativeElement.getBoundingClientRect().top - parseInt(computedStyle['paddingTop'], 10) - parseInt(computedStyle['borderTopWidth'], 10) - parseInt(computedStyle['paddingBottom'], 10) - parseInt(computedStyle['borderBottomWidth'], 10); return result < 0 ? 0 : result; } }; /** * @param {?} target * @return {?} */ StickyComponent.prototype.initScrollStatus = /** * @param {?} target * @return {?} */ function (target) { /** @type {?} */ var scrollTargets = target === window ? [document.documentElement, document.body] : [target]; /** @type {?} */ var flag = false; scrollTargets.forEach((/** * @param {?} scrollTarget * @return {?} */ function (scrollTarget) { if (scrollTarget.scrollTop && scrollTarget.scrollTop > 0) { flag = true; } })); if (flag) { setTimeout(this.scrollHandler); } }; /** * 提供给业务自己触发 * 用法: * 1.捕获所有sticky:```@ViewChildren(StickyComponent) stickies;``` * 2.触发刷新:当需要手动触发更新的时候,比如订阅数据返回后页面高度发生变化可以调用 ```stickies.forEach(sticky => sticky.recalculatePosition());``` * 慎用,少用, 使用太多会影响性能。 */ /** * 提供给业务自己触发 * 用法: * 1.捕获所有sticky:```\@ViewChildren(StickyComponent) stickies;``` * 2.触发刷新:当需要手动触发更新的时候,比如订阅数据返回后页面高度发生变化可以调用 ```stickies.forEach(sticky => sticky.recalculatePosition());``` * 慎用,少用, 使用太多会影响性能。 * @return {?} */ StickyComponent.prototype.recalculatePosition = /** * 提供给业务自己触发 * 用法: * 1.捕获所有sticky:```\@ViewChildren(StickyComponent) stickies;``` * 2.触发刷新:当需要手动触发更新的时候,比如订阅数据返回后页面高度发生变化可以调用 ```stickies.forEach(sticky => sticky.recalculatePosition());``` * 慎用,少用, 使用太多会影响性能。 * @return {?} */ function () { this.initScrollStatus(this.scrollTarget); }; StickyComponent.decorators = [ { type: Component, args: [{ selector: 'd-sticky', template: "\n <div #stickyWrapper [style.zIndex]=\"zIndex\">\n <ng-content></ng-content>\n </div>\n " }] } ]; /** @nocollapse */ StickyComponent.ctorParameters = function () { return [ { type: ElementRef } ]; }; StickyComponent.propDecorators = { hostPosition: [{ type: HostBinding, args: ['style.position',] }], zIndex: [{ type: Input }], container: [{ type: Input }], view: [{ type: Input }], scrollTarget: [{ type: Input }], statusChange: [{ type: Output }], wrapper: [{ type: ViewChild, args: ['stickyWrapper', { static: true },] }], throttle: [{ type: HostListener, args: ['window:resize',] }] }; return StickyComponent; }()); export { StickyComponent }; if (false) { /** @type {?} */ StickyComponent.prototype.hostPosition; /** @type {?} */ StickyComponent.prototype.zIndex; /** @type {?} */ StickyComponent.prototype.container; /** @type {?} */ StickyComponent.prototype.view; /** @type {?} */ StickyComponent.prototype.scrollTarget; /** @type {?} */ StickyComponent.prototype.statusChange; /** @type {?} */ StickyComponent.prototype.wrapper; /** @type {?} */ StickyComponent.prototype._prevStatus; /** @type {?} */ StickyComponent.prototype._status; /** @type {?} */ StickyComponent.prototype.parentNode; /** @type {?} */ StickyComponent.prototype.containerLeft; /** * @type {?} * @private */ StickyComponent.prototype.THROTTLE_DELAY; /** * @type {?} * @private */ StickyComponent.prototype.THROTTLE_TRIGGER; /** * @type {?} * @private */ StickyComponent.prototype.scrollPreStart; /** * @type {?} * @private */ StickyComponent.prototype.scrollTimer; /** @type {?} */ StickyComponent.prototype.throttle; /** @type {?} */ StickyComponent.prototype.scrollAndResizeHock; /** @type {?} */ StickyComponent.prototype.scrollHandler; /** * @type {?} * @private */ StickyComponent.prototype.el; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpY2t5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL3N0aWNreS8iLCJzb3VyY2VzIjpbInN0aWNreS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQzVFLFVBQVUsRUFBNkIsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBSTdFO0lBMkNJLHlCQUFvQixFQUFjO1FBQWxDLGlCQUNDO1FBRG1CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFqQ0gsaUJBQVksR0FBRyxVQUFVLENBQUM7UUFTL0MsaUJBQVksR0FBK0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUd4RSxnQkFBVyxHQUFpQixTQUFTLENBQUM7UUFDdEMsWUFBTyxHQUFpQixRQUFRLENBQUM7O1FBZXpCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLHFCQUFnQixHQUFHLEdBQUcsQ0FBQztRQTZEL0IsYUFBUTs7O1FBQUc7O2dCQUNELEVBQUUsR0FBRyxLQUFJLENBQUMsbUJBQW1COztnQkFDN0IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxLQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixZQUFZLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2xDO1lBQ0QsSUFBSSxDQUFDLEtBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RCLEtBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDLGNBQWMsR0FBRyxLQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3BELEVBQUUsRUFBRSxDQUFDO2dCQUNMLEtBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUMzQixLQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUMz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K0UzQyxZQUFZLFNBQUMsZUFBZTs7SUF5R2pDLHNCQUFDO0NBQUEsQUE1TUQsSUE0TUM7U0FuTVksZUFBZTs7O0lBQ3hCLHVDQUF5RDs7SUFDekQsaUNBQXdCOztJQUN4QixvQ0FBNEI7O0lBQzVCLCtCQUdFOztJQUNGLHVDQUFzQjs7SUFFdEIsdUNBQXdFOztJQUN4RSxrQ0FBc0Q7O0lBRXRELHNDQUFzQzs7SUFDdEMsa0NBQWlDOztJQVlqQyxxQ0FBVzs7SUFDWCx3Q0FBYzs7Ozs7SUFFZCx5Q0FBNEI7Ozs7O0lBQzVCLDJDQUErQjs7Ozs7SUFDL0IseUNBQXVCOzs7OztJQUN2QixzQ0FBb0I7O0lBMERwQixtQ0FxQkM7O0lBQ0QsOENBT0M7O0lBRUQsd0NBb0JDOzs7OztJQTNHVyw2QkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEhvc3RMaXN0ZW5lcixcclxuICAgIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQgLCBPbkRlc3Ryb3ksIEhvc3RCaW5kaW5nfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmV4cG9ydCB0eXBlIFN0aWNreVN0YXR1cyA9ICAnbm9ybWFsJyB8ICdmb2xsb3cnIHwgJ3N0YXknIHwgJ3JlbWFpbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZC1zdGlja3knLFxyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8ZGl2ICNzdGlja3lXcmFwcGVyIFtzdHlsZS56SW5kZXhdPVwiekluZGV4XCI+XHJcbiAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICBgLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFN0aWNreUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBIb3N0QmluZGluZygnc3R5bGUucG9zaXRpb24nKSBob3N0UG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgQElucHV0KCkgekluZGV4OiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBjb250YWluZXI6IEVsZW1lbnQ7IC8vIOm7mOiupOWAvOeItuWuueWZqFxyXG4gICAgQElucHV0KCkgdmlldzoge1xyXG4gICAgICAgIHRvcD86IG51bWJlcixcclxuICAgICAgICBib3R0b20/OiBudW1iZXIsXHJcbiAgICB9O1xyXG4gICAgQElucHV0KCkgc2Nyb2xsVGFyZ2V0O1xyXG5cclxuICAgIEBPdXRwdXQoKSBzdGF0dXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxTdGlja3lTdGF0dXM+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQFZpZXdDaGlsZCgnc3RpY2t5V3JhcHBlcicsIHsgc3RhdGljOiB0cnVlIH0pIHdyYXBwZXI7XHJcblxyXG4gICAgX3ByZXZTdGF0dXM6IFN0aWNreVN0YXR1cyA9IHVuZGVmaW5lZDtcclxuICAgIF9zdGF0dXM6IFN0aWNreVN0YXR1cyA9ICdub3JtYWwnO1xyXG4gICAgc2V0IHN0YXR1cyhzdGF0dXM6IFN0aWNreVN0YXR1cykge1xyXG4gICAgICAgIGlmIChzdGF0dXMgIT09IHRoaXMuX3N0YXR1cykge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2U3RhdHVzID0gdGhpcy5fc3RhdHVzO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzUHJvY2Vzcyh0aGlzLl9zdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzdGF0dXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcclxuICAgIH1cclxuXHJcbiAgICBwYXJlbnROb2RlO1xyXG4gICAgY29udGFpbmVyTGVmdDsgLy8g55So5LqO55uR5ZCs5piv5ZCm5piv5qiq5ZCR5rua5YqoXHJcblxyXG4gICAgcHJpdmF0ZSBUSFJPVFRMRV9ERUxBWSA9IDE2O1xyXG4gICAgcHJpdmF0ZSBUSFJPVFRMRV9UUklHR0VSID0gMTAwO1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxQcmVTdGFydDtcclxuICAgIHByaXZhdGUgc2Nyb2xsVGltZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIGlmICggIXRoaXMuY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQgPSB0aGlzLnNjcm9sbFRhcmdldCB8fCB3aW5kb3c7IC8vIHdpbmRvd+aciXNjcm9sbOS6i+S7tu+8jGRvY3VtZW50LmRvY3VtZW50RWxlbWVudOayoeaciXNjcm9sbOS6i+S7tlxyXG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudGhyb3R0bGUpO1xyXG4gICAgICAgIHRoaXMuaW5pdFNjcm9sbFN0YXR1cyh0aGlzLnNjcm9sbFRhcmdldCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy50aHJvdHRsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdHVzUHJvY2VzcyhzdGF0dXMpIHtcclxuICAgICAgICBzd2l0Y2ggKHN0YXR1cykge1xyXG4gICAgICAgICAgICBjYXNlICdub3JtYWwnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID0gJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3N0YXRpYyc7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnZm9sbG93JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9ICh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LnRvcCB8fCAwICkgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3N0YXknOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID1cclxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSZWxhdGl2ZVBvc2l0aW9uKHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LCB0aGlzLnBhcmVudE5vZGUsICd0b3AnKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3JlbWFpbic6XHJcbiAgICAgICAgICAgICAgICBpZiAoIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uICE9PSAnZml4ZWQnIHx8IHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uICE9PSAnYWJzb2x1dGUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSZWxhdGl2ZVBvc2l0aW9uKHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LCB0aGlzLnBhcmVudE5vZGUsICd0b3AnKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7IC8vIOimgeWFiOi9rOS4umFic29sdXRl5YaN6K6h566X77yM5ZCm5YiZ5aaC5p6c5aSE5LqO6Z2eZml4ZWTlvbHlk43orqHnrpdcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSZW1haW5Qb3NpdGlvbih0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wYXJlbnROb2RlLCB0aGlzLmNvbnRhaW5lcikgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSZWxhdGl2ZVBvc2l0aW9uKHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LCB0aGlzLnBhcmVudE5vZGUsICdsZWZ0JykgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXHJcbiAgICB0aHJvdHRsZSA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBmbiA9IHRoaXMuc2Nyb2xsQW5kUmVzaXplSG9jaztcclxuICAgICAgICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBpZiAodGhpcy5zY3JvbGxUaW1lcikge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxUaW1lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxQcmVTdGFydCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFByZVN0YXJ0ID0gdGltZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRpbWUgLSB0aGlzLnNjcm9sbFByZVN0YXJ0ID4gdGhpcy5USFJPVFRMRV9UUklHR0VSKSB7XHJcbiAgICAgICAgICAgIGZuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsUHJlU3RhcnQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRpbWVyID0gbnVsbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxQcmVTdGFydCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRpbWVyID0gbnVsbDtcclxuICAgICAgICAgICAgfSwgdGhpcy5USFJPVFRMRV9ERUxBWSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2Nyb2xsQW5kUmVzaXplSG9jayA9ICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtICh0aGlzLmNvbnRhaW5lckxlZnQgfHwgMCkgICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ3N0YXknO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lckxlZnQgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuY29udGFpbmVyKTtcclxuICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wID4gKHRoaXMudmlldyAmJiB0aGlzLnZpZXcudG9wIHx8IDApKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ25vcm1hbCc7ICAgLy8g5YWo5bGA5ruR5Yqo77yIY29udGFpbmVyIT09cGFyZW50Tm9kZe+8ieaXtuWAmeWinuWKoOmihOWIpFxyXG4gICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcclxuICAgICAgICAgICArIHBhcnNlSW50KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCwgMTApXHJcbiAgICAgICAgICAgKyBwYXJzZUludChjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMClcclxuICAgICAgICAgICAgICAgPj0gKHRoaXMudmlldyAmJiB0aGlzLnZpZXcudG9wIHx8IDApKSB7XHJcbiAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnbm9ybWFsJztcclxuICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tXHJcbiAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdCb3R0b20sIDEwKVxyXG4gICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCwgMTApXHJcbiAgICAgICAgICAgLSB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcclxuICAgICAgICAgICAgICAgPCAodGhpcy52aWV3ICYmIHRoaXMudmlldy50b3AgfHwgMCkgKyAodGhpcy52aWV3ICYmIHRoaXMudmlldy5ib3R0b20gfHwgMClcclxuICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAncmVtYWluJztcclxuICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHBhcnNlSW50KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCwgMTApIDwgKHRoaXMudmlldyAmJiB0aGlzLnZpZXcudG9wIHx8IDApKVxyXG4gICAgICAgICApIHtcclxuICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdmb2xsb3cnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjYWxjdWxhdGVSZWxhdGl2ZVBvc2l0aW9uKGVsZW1lbnQsIHJlbGF0aXZlRWxlbWVudCwgZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0ge1xyXG4gICAgICAgICAgICAnbGVmdCc6IFsnbGVmdCcsICdMZWZ0J10sXHJcbiAgICAgICAgICAgICd0b3AnOiBbJ3RvcCcsICdUb3AnXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocmVsYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClba2V5W2RpcmVjdGlvbl1bMF1dXHJcbiAgICAgICAgICAgICAgICAgICAgLSByZWxhdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClba2V5W2RpcmVjdGlvbl1bMF1dXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydwYWRkaW5nJyArIGtleVtkaXJlY3Rpb25dWzFdXSwgMTApXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydib3JkZXInICsga2V5W2RpcmVjdGlvbl1bMV0gKyAnV2lkdGgnXSwgMTApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNhbGN1bGF0ZVJlbWFpblBvc2l0aW9uKGVsZW1lbnQsIHJlbGF0aXZlRWxlbWVudCwgY29udGFpbmVyKSB7XHJcbiAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgIC0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICArIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcclxuICAgICAgICAgICAgICAgICAgICAtIHJlbGF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcclxuICAgICAgICAgICAgICAgICAgICAtIHBhcnNlSW50KGNvbXB1dGVkU3R5bGVbJ3BhZGRpbmdUb3AnXSwgMTApXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydib3JkZXJUb3BXaWR0aCddLCAxMClcclxuICAgICAgICAgICAgICAgICAgICAtIHBhcnNlSW50KGNvbXB1dGVkU3R5bGVbJ3BhZGRpbmdCb3R0b20nXSwgMTApXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydib3JkZXJCb3R0b21XaWR0aCddLCAxMCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPCAwID8gMCA6IHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFNjcm9sbFN0YXR1cyh0YXJnZXQpIHtcclxuICAgICAgY29uc3Qgc2Nyb2xsVGFyZ2V0cyA9IHRhcmdldCA9PT0gd2luZG93ID8gW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgZG9jdW1lbnQuYm9keV0gOiBbdGFyZ2V0XTtcclxuICAgICAgbGV0IGZsYWcgPSBmYWxzZTtcclxuICAgICAgc2Nyb2xsVGFyZ2V0cy5mb3JFYWNoKHNjcm9sbFRhcmdldCA9PiB7XHJcbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldC5zY3JvbGxUb3AgJiYgc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCA+IDApIHtcclxuICAgICAgICAgICAgZmxhZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KHRoaXMuc2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmj5Dkvpvnu5nkuJrliqHoh6rlt7Hop6blj5FcclxuICAgICAqIOeUqOazle+8mlxyXG4gICAgICogMS7mjZXojrfmiYDmnIlzdGlja3nvvJpgYGBAVmlld0NoaWxkcmVuKFN0aWNreUNvbXBvbmVudCkgc3RpY2tpZXM7YGBgXHJcbiAgICAgKiAyLuinpuWPkeWIt+aWsO+8muW9k+mcgOimgeaJi+WKqOinpuWPkeabtOaWsOeahOaXtuWAme+8jOavlOWmguiuoumYheaVsOaNrui/lOWbnuWQjumhtemdoumrmOW6puWPkeeUn+WPmOWMluWPr+S7peiwg+eUqCBgYGBzdGlja2llcy5mb3JFYWNoKHN0aWNreSA9PiBzdGlja3kucmVjYWxjdWxhdGVQb3NpdGlvbigpKTtgYGBcclxuICAgICAqIOaFjueUqO+8jOWwkeeUqO+8jCDkvb/nlKjlpKrlpJrkvJrlvbHlk43mgKfog73jgIJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlY2FsY3VsYXRlUG9zaXRpb24oKSB7XHJcbiAgICAgIHRoaXMuaW5pdFNjcm9sbFN0YXR1cyh0aGlzLnNjcm9sbFRhcmdldCk7XHJcbiAgICB9XHJcbn1cclxuIl19