ng-devui
Version:
DevUI components based on Angular
236 lines • 37.5 kB
JavaScript
import { Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, } from '@angular/core';
import { WindowRef } from 'ng-devui/window-ref';
import { fromEvent } from 'rxjs';
import { filter, throttleTime } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "ng-devui/window-ref";
export class StickyComponent {
set status(status) {
if (status !== this._status) {
this._prevStatus = this._status;
this._status = status;
this.statusChange.emit(this._status);
this.statusProcess(this._status);
}
}
get status() {
return this._status;
}
constructor(el, windowRef) {
this.el = el;
this.windowRef = windowRef;
this.hostPosition = 'relative';
this.statusChange = new EventEmitter();
this._prevStatus = undefined;
this._status = 'normal';
this.THROTTLE_DELAY = 16;
this.THROTTLE_TRIGGER = 100;
this.throttle = () => {
const fn = this.scrollAndResizeHock;
const 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(() => {
fn();
this.scrollPreStart = null;
this.scrollTimer = null;
}, this.THROTTLE_DELAY);
}
};
this.scrollAndResizeHock = () => {
if (this.container.getBoundingClientRect().left - (this.containerLeft || 0) !== 0) {
this.status = 'stay';
this.containerLeft = this.container.getBoundingClientRect().left;
}
else {
this.scrollHandler();
}
};
this.scrollHandler = () => {
const viewOffsetTop = this.scrollTarget && this.scrollTarget !== this.windowRef.window ? this.scrollTarget.getBoundingClientRect().top : 0;
const computedStyle = this.windowRef.window.getComputedStyle(this.container);
if (this.parentNode.getBoundingClientRect().top - viewOffsetTop > ((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) -
viewOffsetTop >=
((this.view && this.view.top) || 0)) {
this.status = 'normal';
}
else if (this.container.getBoundingClientRect().bottom -
parseInt(computedStyle.paddingBottom, 10) -
parseInt(computedStyle.borderBottomWidth, 10) <
viewOffsetTop +
((this.view && this.view.top) || 0) +
this.wrapper.nativeElement.getBoundingClientRect().height +
((this.view && this.view.bottom) || 0)) {
this.status = 'remain';
}
else if (this.container.getBoundingClientRect().top + parseInt(computedStyle.paddingTop, 10) - viewOffsetTop <
((this.view && this.view.top) || 0)) {
this.status = 'follow';
}
};
}
ngOnInit() {
this.parentNode = this.el.nativeElement.parentNode;
if (!this.container) {
this.container = this.parentNode;
}
}
ngAfterViewInit() {
this.scrollTarget = this.scrollTarget || this.windowRef.window; // window有scroll事件,document.documentElement没有scroll事件
this.scrollTarget.addEventListener('scroll', this.throttle);
this.initScrollStatus(this.scrollTarget);
if (this.scrollTarget !== this.windowRef.window) {
this.subscription = fromEvent(this.windowRef.window, 'scroll')
.pipe(throttleTime(100, undefined, { leading: true, trailing: true }), filter((event) => event.target !== this.scrollTarget &&
(event.target === this.windowRef.window ||
event.target === this.windowRef.document || // fix ie11 document.contains is not defined
(event.target.contains && event.target.contains(this.scrollTarget)))))
.subscribe((event) => {
this.statusProcess(this._status);
});
}
}
ngOnDestroy() {
this.scrollTarget.removeEventListener('scroll', this.throttle);
if (this.subscription) {
this.subscription.unsubscribe();
}
}
statusProcess(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': {
const viewOffset = this.scrollTarget && this.scrollTarget !== this.windowRef.window ? this.scrollTarget.getBoundingClientRect().top : 0;
this.wrapper.nativeElement.style.top = Number(viewOffset) + ((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:
}
}
calculateRelativePosition(element, relativeElement, direction) {
const key = {
left: ['left', 'Left'],
top: ['top', 'Top'],
};
if (this.windowRef.window && this.windowRef.window.getComputedStyle) {
const computedStyle = this.windowRef.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));
}
}
calculateRemainPosition(element, relativeElement, container) {
if (this.windowRef.window && this.windowRef.window.getComputedStyle) {
const computedStyle = this.windowRef.window.getComputedStyle(container);
const 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;
}
}
initScrollStatus(target) {
const scrollTargets = target === this.windowRef.window ? [this.windowRef.document.documentElement, this.windowRef.document.body] : [target];
let flag = false;
scrollTargets.forEach((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());```
* 慎用,少用, 使用太多会影响性能。
*/
recalculatePosition() {
this.initScrollStatus(this.scrollTarget);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickyComponent, deps: [{ token: i0.ElementRef }, { token: i1.WindowRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StickyComponent, selector: "d-sticky", inputs: { zIndex: "zIndex", container: "container", view: "view", scrollTarget: "scrollTarget" }, outputs: { statusChange: "statusChange" }, host: { listeners: { "window:resize": "throttle()" }, properties: { "style.position": "this.hostPosition" } }, viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["stickyWrapper"], descendants: true, static: true }], ngImport: i0, template: `
<div #stickyWrapper [style.zIndex]="zIndex">
<ng-content></ng-content>
</div>
`, isInline: true }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickyComponent, decorators: [{
type: Component,
args: [{
selector: 'd-sticky',
template: `
<div #stickyWrapper [style.zIndex]="zIndex">
<ng-content></ng-content>
</div>
`,
preserveWhitespaces: false,
}]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.WindowRef }], 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']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpY2t5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL3N0aWNreS9zdGlja3kuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQWdCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFhdEQsTUFBTSxPQUFPLGVBQWU7SUFlMUIsSUFBSSxNQUFNLENBQUMsTUFBb0I7UUFDN0IsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQVdELFlBQW9CLEVBQWMsRUFBVSxTQUFvQjtRQUE1QyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBVztRQW5DakMsaUJBQVksR0FBRyxVQUFVLENBQUM7UUFTL0MsaUJBQVksR0FBK0IsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFH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RSxLQUFLO2lCQUMzQjt1R0FFZ0MsWUFBWTtzQkFBMUMsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBQ3BCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ3VDLE9BQU87c0JBQXBELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFxRzVDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0QmluZGluZyxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBXaW5kb3dSZWYgfSBmcm9tICduZy1kZXZ1aS93aW5kb3ctcmVmJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5leHBvcnQgdHlwZSBTdGlja3lTdGF0dXMgPSAnbm9ybWFsJyB8ICdmb2xsb3cnIHwgJ3N0YXknIHwgJ3JlbWFpbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Qtc3RpY2t5JyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiAjc3RpY2t5V3JhcHBlciBbc3R5bGUuekluZGV4XT1cInpJbmRleFwiPlxyXG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RpY2t5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBIb3N0QmluZGluZygnc3R5bGUucG9zaXRpb24nKSBob3N0UG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gIEBJbnB1dCgpIHpJbmRleDogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGNvbnRhaW5lcjogRWxlbWVudDsgLy8g6buY6K6k5YC854i25a655ZmoXHJcbiAgQElucHV0KCkgdmlldzoge1xyXG4gICAgdG9wPzogbnVtYmVyO1xyXG4gICAgYm90dG9tPzogbnVtYmVyO1xyXG4gIH07XHJcbiAgQElucHV0KCkgc2Nyb2xsVGFyZ2V0O1xyXG5cclxuICBAT3V0cHV0KCkgc3RhdHVzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8U3RpY2t5U3RhdHVzPiA9IG5ldyBFdmVudEVtaXR0ZXI8U3RpY2t5U3RhdHVzPigpO1xyXG4gIEBWaWV3Q2hpbGQoJ3N0aWNreVdyYXBwZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSB3cmFwcGVyO1xyXG5cclxuICBfcHJldlN0YXR1czogU3RpY2t5U3RhdHVzID0gdW5kZWZpbmVkO1xyXG4gIF9zdGF0dXM6IFN0aWNreVN0YXR1cyA9ICdub3JtYWwnO1xyXG4gIHNldCBzdGF0dXMoc3RhdHVzOiBTdGlja3lTdGF0dXMpIHtcclxuICAgIGlmIChzdGF0dXMgIT09IHRoaXMuX3N0YXR1cykge1xyXG4gICAgICB0aGlzLl9wcmV2U3RhdHVzID0gdGhpcy5fc3RhdHVzO1xyXG4gICAgICB0aGlzLl9zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICAgIHRoaXMuc3RhdHVzQ2hhbmdlLmVtaXQodGhpcy5fc3RhdHVzKTtcclxuICAgICAgdGhpcy5zdGF0dXNQcm9jZXNzKHRoaXMuX3N0YXR1cyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzdGF0dXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcGFyZW50Tm9kZTtcclxuICBjb250YWluZXJMZWZ0OyAvLyDnlKjkuo7nm5HlkKzmmK/lkKbmmK/mqKrlkJHmu5rliqhcclxuXHJcbiAgcHJpdmF0ZSBUSFJPVFRMRV9ERUxBWSA9IDE2O1xyXG4gIHByaXZhdGUgVEhST1RUTEVfVFJJR0dFUiA9IDEwMDtcclxuICBwcml2YXRlIHNjcm9sbFByZVN0YXJ0O1xyXG4gIHByaXZhdGUgc2Nyb2xsVGltZXI7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgd2luZG93UmVmOiBXaW5kb3dSZWYpIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5wYXJlbnROb2RlID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XHJcbiAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnROb2RlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5zY3JvbGxUYXJnZXQgPSB0aGlzLnNjcm9sbFRhcmdldCB8fCB0aGlzLndpbmRvd1JlZi53aW5kb3c7IC8vIHdpbmRvd+aciXNjcm9sbOS6i+S7tu+8jGRvY3VtZW50LmRvY3VtZW50RWxlbWVudOayoeaciXNjcm9sbOS6i+S7tlxyXG4gICAgdGhpcy5zY3JvbGxUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy50aHJvdHRsZSk7XHJcbiAgICB0aGlzLmluaXRTY3JvbGxTdGF0dXModGhpcy5zY3JvbGxUYXJnZXQpO1xyXG4gICAgaWYgKHRoaXMuc2Nyb2xsVGFyZ2V0ICE9PSB0aGlzLndpbmRvd1JlZi53aW5kb3cpIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQ8RXZlbnQ+KHRoaXMud2luZG93UmVmLndpbmRvdywgJ3Njcm9sbCcpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0aHJvdHRsZVRpbWUoMTAwLCB1bmRlZmluZWQsIHsgbGVhZGluZzogdHJ1ZSwgdHJhaWxpbmc6IHRydWUgfSksXHJcbiAgICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAgIChldmVudCkgPT5cclxuICAgICAgICAgICAgICBldmVudC50YXJnZXQgIT09IHRoaXMuc2Nyb2xsVGFyZ2V0ICYmXHJcbiAgICAgICAgICAgICAgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy53aW5kb3dSZWYud2luZG93IHx8XHJcbiAgICAgICAgICAgICAgICBldmVudC50YXJnZXQgPT09IHRoaXMud2luZG93UmVmLmRvY3VtZW50IHx8IC8vIGZpeCBpZTExIGRvY3VtZW50LmNvbnRhaW5zIGlzIG5vdCBkZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAoKDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQpLmNvbnRhaW5zICYmICg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5jb250YWlucyh0aGlzLnNjcm9sbFRhcmdldCkpKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdGF0dXNQcm9jZXNzKHRoaXMuX3N0YXR1cyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuc2Nyb2xsVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudGhyb3R0bGUpO1xyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0dXNQcm9jZXNzKHN0YXR1cykge1xyXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcclxuICAgIGNhc2UgJ25vcm1hbCc6XHJcbiAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9ICdhdXRvJztcclxuICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9ICdhdXRvJztcclxuICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnc3RhdGljJztcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlICdmb2xsb3cnOiB7XHJcbiAgICAgIGNvbnN0IHZpZXdPZmZzZXQgPVxyXG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ICYmIHRoaXMuc2Nyb2xsVGFyZ2V0ICE9PSB0aGlzLndpbmRvd1JlZi53aW5kb3cgPyB0aGlzLnNjcm9sbFRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgOiAwO1xyXG4gICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPSBOdW1iZXIodmlld09mZnNldCkgKyAoKHRoaXMudmlldyAmJiB0aGlzLnZpZXcudG9wKSB8fCAwKSArICdweCc7XHJcbiAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgJ3B4JztcclxuICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGNhc2UgJ3N0YXknOiB7XHJcbiAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9IHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVQb3NpdGlvbih0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wYXJlbnROb2RlLCAndG9wJykgKyAncHgnO1xyXG4gICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gJ2F1dG8nO1xyXG4gICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgY2FzZSAncmVtYWluJzoge1xyXG4gICAgICBpZiAodGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcgfHwgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gIT09ICdhYnNvbHV0ZScpIHtcclxuICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmNhbGN1bGF0ZVJlbGF0aXZlUG9zaXRpb24odGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQsIHRoaXMucGFyZW50Tm9kZSwgJ3RvcCcpICsgJ3B4JztcclxuICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gJ2F1dG8nO1xyXG4gICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsgLy8g6KaB5YWI6L2s5Li6YWJzb2x1dGXlho3orqHnrpfvvIzlkKbliJnlpoLmnpzlpITkuo7pnZ5maXhlZOW9seWTjeiuoeeul1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVSZW1haW5Qb3NpdGlvbih0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wYXJlbnROb2RlLCB0aGlzLmNvbnRhaW5lcikgKyAncHgnO1xyXG4gICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gdGhpcy5jYWxjdWxhdGVSZWxhdGl2ZVBvc2l0aW9uKHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LCB0aGlzLnBhcmVudE5vZGUsICdsZWZ0JykgKyAncHgnO1xyXG4gICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgZGVmYXVsdDpcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxyXG4gIHRocm90dGxlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgZm4gPSB0aGlzLnNjcm9sbEFuZFJlc2l6ZUhvY2s7XHJcbiAgICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcclxuICAgIGlmICh0aGlzLnNjcm9sbFRpbWVyKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbFRpbWVyKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zY3JvbGxQcmVTdGFydCkge1xyXG4gICAgICB0aGlzLnNjcm9sbFByZVN0YXJ0ID0gdGltZTtcclxuICAgIH1cclxuICAgIGlmICh0aW1lIC0gdGhpcy5zY3JvbGxQcmVTdGFydCA+IHRoaXMuVEhST1RUTEVfVFJJR0dFUikge1xyXG4gICAgICBmbigpO1xyXG4gICAgICB0aGlzLnNjcm9sbFByZVN0YXJ0ID0gbnVsbDtcclxuICAgICAgdGhpcy5zY3JvbGxUaW1lciA9IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNjcm9sbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgZm4oKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFByZVN0YXJ0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNjcm9sbFRpbWVyID0gbnVsbDtcclxuICAgICAgfSwgdGhpcy5USFJPVFRMRV9ERUxBWSk7XHJcbiAgICB9XHJcbiAgfTtcclxuICBzY3JvbGxBbmRSZXNpemVIb2NrID0gKCkgPT4ge1xyXG4gICAgaWYgKHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSAodGhpcy5jb250YWluZXJMZWZ0IHx8IDApICE9PSAwKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gJ3N0YXknO1xyXG4gICAgICB0aGlzLmNvbnRhaW5lckxlZnQgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY3JvbGxIYW5kbGVyKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgc2Nyb2xsSGFuZGxlciA9ICgpID0+IHtcclxuICAgIGNvbnN0IHZpZXdPZmZzZXRUb3AgPVxyXG4gICAgICB0aGlzLnNjcm9sbFRhcmdldCAmJiB0aGlzLnNjcm9sbFRhcmdldCAhPT0gdGhpcy53aW5kb3dSZWYud2luZG93ID8gdGhpcy5zY3JvbGxUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIDogMDtcclxuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB0aGlzLndpbmRvd1JlZi53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICBpZiAodGhpcy5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHZpZXdPZmZzZXRUb3AgPiAoKHRoaXMudmlldyAmJiB0aGlzLnZpZXcudG9wKSB8fCAwKSkge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9ICdub3JtYWwnOyAvLyDlhajlsYDmu5HliqjvvIhjb250YWluZXIhPT1wYXJlbnROb2Rl77yJ5pe25YCZ5aKe5Yqg6aKE5YikXHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgK1xyXG4gICAgICAgIHBhcnNlSW50KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCwgMTApICtcclxuICAgICAgICBwYXJzZUludChjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMCkgLVxyXG4gICAgICAgIHZpZXdPZmZzZXRUb3AgPj1cclxuICAgICAgKCh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LnRvcCkgfHwgMClcclxuICAgICkge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9ICdub3JtYWwnO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIC1cclxuICAgICAgICBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdCb3R0b20sIDEwKSAtXHJcbiAgICAgICAgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCwgMTApIDxcclxuICAgICAgdmlld09mZnNldFRvcCArXHJcbiAgICAgICAgKCh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LnRvcCkgfHwgMCkgK1xyXG4gICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCArXHJcbiAgICAgICAgKCh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LmJvdHRvbSkgfHwgMClcclxuICAgICkge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9ICdyZW1haW4nO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nVG9wLCAxMCkgLSB2aWV3T2Zmc2V0VG9wIDxcclxuICAgICAgKCh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LnRvcCkgfHwgMClcclxuICAgICkge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9ICdmb2xsb3cnO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNhbGN1bGF0ZVJlbGF0aXZlUG9zaXRpb24oZWxlbWVudCwgcmVsYXRpdmVFbGVtZW50LCBkaXJlY3Rpb24pIHtcclxuICAgIGNvbnN0IGtleSA9IHtcclxuICAgICAgbGVmdDogWydsZWZ0JywgJ0xlZnQnXSxcclxuICAgICAgdG9wOiBbJ3RvcCcsICdUb3AnXSxcclxuICAgIH07XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZWYud2luZG93ICYmIHRoaXMud2luZG93UmVmLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKSB7XHJcbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB0aGlzLndpbmRvd1JlZi53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShyZWxhdGl2ZUVsZW1lbnQpO1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClba2V5W2RpcmVjdGlvbl1bMF1dIC1cclxuICAgICAgICByZWxhdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClba2V5W2RpcmVjdGlvbl1bMF1dIC1cclxuICAgICAgICBwYXJzZUludChjb21wdXRlZFN0eWxlWydwYWRkaW5nJyArIGtleVtkaXJlY3Rpb25dWzFdXSwgMTApIC1cclxuICAgICAgICBwYXJzZUludChjb21wdXRlZFN0eWxlWydib3JkZXInICsga2V5W2RpcmVjdGlvbl1bMV0gKyAnV2lkdGgnXSwgMTApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNhbGN1bGF0ZVJlbWFpblBvc2l0aW9uKGVsZW1lbnQsIHJlbGF0aXZlRWxlbWVudCwgY29udGFpbmVyKSB7XHJcbiAgICBpZiAodGhpcy53aW5kb3dSZWYud2luZG93ICYmIHRoaXMud2luZG93UmVmLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKSB7XHJcbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB0aGlzLndpbmRvd1JlZi53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xyXG4gICAgICBjb25zdCByZXN1bHQgPVxyXG4gICAgICAgIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLVxyXG4gICAgICAgIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICtcclxuICAgICAgICBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC1cclxuICAgICAgICByZWxhdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC1cclxuICAgICAgICBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3AsIDEwKSAtXHJcbiAgICAgICAgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwgMTApIC1cclxuICAgICAgICBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdCb3R0b20sIDEwKSAtXHJcbiAgICAgICAgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCwgMTApO1xyXG4gICAgICByZXR1cm4gcmVzdWx0IDwgMCA/IDAgOiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0U2Nyb2xsU3RhdHVzKHRhcmdldCkge1xyXG4gICAgY29uc3Qgc2Nyb2xsVGFyZ2V0cyA9XHJcbiAgICAgIHRhcmdldCA9PT0gdGhpcy53aW5kb3dSZWYud2luZG93ID8gW3RoaXMud2luZG93UmVmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgdGhpcy53aW5kb3dSZWYuZG9jdW1lbnQuYm9keV0gOiBbdGFyZ2V0XTtcclxuICAgIGxldCBmbGFnID0gZmFsc2U7XHJcbiAgICBzY3JvbGxUYXJnZXRzLmZvckVhY2goKHNjcm9sbFRhcmdldCkgPT4ge1xyXG4gICAgICBpZiAoc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCAmJiBzY3JvbGxUYXJnZXQuc2Nyb2xsVG9wID4gMCkge1xyXG4gICAgICAgIGZsYWcgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChmbGFnKSB7XHJcbiAgICAgIHNldFRpbWVvdXQodGhpcy5zY3JvbGxIYW5kbGVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOaPkOS+m+e7meS4muWKoeiHquW3seinpuWPkVxyXG4gICAqIOeUqOazle+8mlxyXG4gICAqIDEu5o2V6I635omA5pyJc3RpY2t577yaYGBgQFZpZXdDaGlsZHJlbihTdGlja3lDb21wb25lbnQpIHN0aWNraWVzO2BgYFxyXG4gICAqIDIu6Kem5Y+R5Yi35paw77ya5b2T6ZyA6KaB5omL5Yqo6Kem5Y+R5pu05paw55qE5pe25YCZ77yM5q+U5aaC6K6i6ZiF5pWw5o2u6L+U5Zue5ZCO6aG16Z2i6auY5bqm5Y+R55Sf5Y+Y5YyW5Y+v5Lul6LCD55SoIGBgYHN0aWNraWVzLmZvckVhY2goc3RpY2t5ID0+IHN0aWNreS5yZWNhbGN1bGF0ZVBvc2l0aW9uKCkpO2BgYFxyXG4gICAqIOaFjueUqO+8jOWwkeeUqO+8jCDkvb/nlKjlpKrlpJrkvJrlvbHlk43mgKfog73jgIJcclxuICAgKi9cclxuICBwdWJsaWMgcmVjYWxjdWxhdGVQb3NpdGlvbigpIHtcclxuICAgIHRoaXMuaW5pdFNjcm9sbFN0YXR1cyh0aGlzLnNjcm9sbFRhcmdldCk7XHJcbiAgfVxyXG59XHJcbi8vIFRPRE86IOmHjeaehOais+eQhueKtuaAgVxyXG4iXX0=