@ngez/core
Version:
A collection of minimalistic, easy-to-use and fully customizable Angular components, directives and services
231 lines • 21.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Directive, ElementRef, Inject, PLATFORM_ID, Optional, Input, Output, EventEmitter } from "@angular/core";
import { WINDOW } from "../window/window.service";
import { DOCUMENT, isPlatformBrowser } from "@angular/common";
import { defaultConfig, defaultOffsetConfig } from "./models";
import { fromEvent, merge, of } from "rxjs";
export class NgEzInViewportDirective {
/**
* @param {?} element
* @param {?} platformId
* @param {?} window
* @param {?} document
*/
constructor(element, platformId, window, document) {
this.element = element;
this.platformId = platformId;
this.window = window;
this.document = document;
this.inViewportChange = new EventEmitter();
this.latest = {
top: false,
bottom: false,
left: false,
right: false,
all: false,
any: false
};
}
/**
* @param {?} config
* @return {?}
*/
set config(config) {
this._config = config;
}
/**
* @return {?}
*/
ngOnInit() {
if (!isPlatformBrowser(this.platformId))
return;
this.container = this.getClosestScrollableParent(this.element.nativeElement);
//Check on scroll, window resize and oninit
this.subscription = merge(fromEvent(this.isDocumentTheScrollableContainer() ? this.document : this.container, 'scroll'), fromEvent(this.window, 'resize'), of(null))
.subscribe(() => this.check());
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.subscription)
this.subscription.unsubscribe();
}
/**
* @return {?}
*/
get config() {
const _a = this._config || {}, { offset = {} } = _a, config = tslib_1.__rest(_a, ["offset"]);
return Object.assign({}, defaultConfig, config, { offset: Object.assign({}, defaultOffsetConfig, offset) });
}
/**
* @return {?}
*/
check() {
/** @type {?} */
const previous = this.latest;
/** @type {?} */
const current = this.calculateVisibility();
/** @type {?} */
const hasChanged = previous.top != current.top
|| previous.bottom != current.bottom
|| previous.left != current.left
|| previous.right != current.right;
if (hasChanged)
this.inViewportChange.emit(current);
this.latest = current;
return current;
}
/**
* @private
* @return {?}
*/
calculateVisibility() {
/** @type {?} */
const elementRect = this.element.nativeElement.getBoundingClientRect();
/** @type {?} */
const height = elementRect.height;
/** @type {?} */
const width = elementRect.width;
/** @type {?} */
const containerRect = this.container.getBoundingClientRect();
/** @type {?} */
const top = elementRect.top - (this.isDocumentTheScrollableContainer()
? 0
: containerRect.top);
/** @type {?} */
const bottom = top + height;
/** @type {?} */
const left = elementRect.left - (this.isDocumentTheScrollableContainer()
? 0
: containerRect.left);
/** @type {?} */
const right = left + width;
/** @type {?} */
const containerHeight = this.container.clientHeight || this.window.innerHeight;
/** @type {?} */
const containerWidth = this.container.clientWidth || this.window.innerWidth;
/** @type {?} */
const topInView = top + this.config.offset.top >= 0 && top <= (containerHeight + this.config.offset.top);
/** @type {?} */
const bottomInView = bottom + this.config.offset.bottom >= 0 && bottom <= (containerHeight + this.config.offset.bottom);
/** @type {?} */
const leftInView = left + this.config.offset.left >= 0 && left <= (containerWidth + this.config.offset.left);
/** @type {?} */
const rightInView = right + this.config.offset.right >= 0 && right <= (containerWidth + this.config.offset.right);
return {
top: topInView,
bottom: bottomInView,
left: leftInView && (topInView || bottomInView),
right: rightInView && (topInView || bottomInView),
any: (topInView || bottomInView) && (leftInView || rightInView),
all: topInView && bottomInView && leftInView && rightInView
};
}
/**
* @private
* @param {?} node
* @return {?}
*/
getClosestScrollableParent(node) {
return !node || node === this.document.body
? this.document.documentElement
: this.isScrollable(node)
? node
: this.getClosestScrollableParent(node.parentNode);
}
/**
* @private
* @param {?} node
* @return {?}
*/
isScrollable(node) {
/** @type {?} */
const regex = /(auto|scroll)/;
return regex.test(this.getComputedStyle(node, 'overflow') +
this.getComputedStyle(node, 'overflow-y') +
this.getComputedStyle(node, 'overflow-x'));
}
/**
* @private
* @param {?} node
* @param {?} style
* @return {?}
*/
getComputedStyle(node, style) {
return this.window.getComputedStyle(node).getPropertyValue(style);
}
/**
* @private
* @return {?}
*/
isDocumentTheScrollableContainer() {
return this.document.documentElement === this.container;
}
}
NgEzInViewportDirective.decorators = [
{ type: Directive, args: [{
selector: '[ngezInViewport]',
exportAs: 'ngezInViewport'
},] }
];
/** @nocollapse */
NgEzInViewportDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: undefined, decorators: [{ type: Inject, args: [WINDOW,] }] },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] }
];
NgEzInViewportDirective.propDecorators = {
config: [{ type: Input }],
inViewportChange: [{ type: Output }]
};
if (false) {
/** @type {?} */
NgEzInViewportDirective.prototype.inViewportChange;
/**
* @type {?}
* @private
*/
NgEzInViewportDirective.prototype._config;
/**
* @type {?}
* @private
*/
NgEzInViewportDirective.prototype.container;
/**
* @type {?}
* @private
*/
NgEzInViewportDirective.prototype.subscription;
/**
* @type {?}
* @private
*/
NgEzInViewportDirective.prototype.latest;
/**
* @type {?}
* @private
*/
NgEzInViewportDirective.prototype.element;
/**
* @type {?}
* @private
*/
NgEzInViewportDirective.prototype.platformId;
/**
* @type {?}
* @private
*/
NgEzInViewportDirective.prototype.window;
/**
* @type {?}
* @private
*/
NgEzInViewportDirective.prototype.document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW4tdmlld3BvcnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5nZXovY29yZS8iLCJzb3VyY2VzIjpbImluLXZpZXdwb3J0L2luLXZpZXdwb3J0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixXQUFXLEVBQ1gsUUFBUSxFQUVSLEtBQUssRUFHTCxNQUFNLEVBQ04sWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUF3QixhQUFhLEVBQUUsbUJBQW1CLEVBQXVCLE1BQU0sVUFBVSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFnQixFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFNMUQsTUFBTSxPQUFPLHVCQUF1Qjs7Ozs7OztJQXVCaEMsWUFDWSxPQUFtQixFQUNFLFVBQWtCLEVBQ3ZCLE1BQVcsRUFDRyxRQUFhO1FBSDNDLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDRSxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQUs7UUFDRyxhQUFRLEdBQVIsUUFBUSxDQUFLO1FBckI3QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQVE3RCxXQUFNLEdBQXdCO1lBQ2xDLEdBQUcsRUFBRSxLQUFLO1lBQ1YsTUFBTSxFQUFFLEtBQUs7WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLEtBQUssRUFBRSxLQUFLO1lBQ1osR0FBRyxFQUFFLEtBQUs7WUFDVixHQUFHLEVBQUUsS0FBSztTQUNiLENBQUM7SUFNdUQsQ0FBQzs7Ozs7SUF6QjFELElBQWEsTUFBTSxDQUFDLE1BQTRCO1FBQzVD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QUV0Qyw0Q0FBMkI7Ozs7O0lBRTNCLCtDQUFtQzs7Ozs7SUFFbkMseUNBT0U7Ozs7O0lBR0UsMENBQTJCOzs7OztJQUMzQiw2Q0FBK0M7Ozs7O0lBQy9DLHlDQUFtQzs7Ozs7SUFDbkMsMkNBQW1EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgXHJcbiAgICBEaXJlY3RpdmUsIFxyXG4gICAgRWxlbWVudFJlZiwgXHJcbiAgICBJbmplY3QsIFxyXG4gICAgUExBVEZPUk1fSUQsIFxyXG4gICAgT3B0aW9uYWwsIFxyXG4gICAgT25Jbml0LCBcclxuICAgIElucHV0LCBcclxuICAgIFRlbXBsYXRlUmVmLCBcclxuICAgIE9uRGVzdHJveSwgXHJcbiAgICBPdXRwdXQsXHJcbiAgICBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBXSU5ET1cgfSBmcm9tIFwiLi4vd2luZG93L3dpbmRvdy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgTmdFekluVmlld3BvcnRDb25maWcsIGRlZmF1bHRDb25maWcsIGRlZmF1bHRPZmZzZXRDb25maWcsIE5nRXpJblZpZXdwb3J0RXZlbnQgfSBmcm9tIFwiLi9tb2RlbHNcIjtcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgU3Vic2NyaXB0aW9uLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW25nZXpJblZpZXdwb3J0XScsXHJcbiAgICBleHBvcnRBczogJ25nZXpJblZpZXdwb3J0J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdFekluVmlld3BvcnREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveXtcclxuXHJcbiAgICBASW5wdXQoKSBzZXQgY29uZmlnKGNvbmZpZzogTmdFekluVmlld3BvcnRDb25maWcpe1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KCkgaW5WaWV3cG9ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TmdFekluVmlld3BvcnRFdmVudD4oKTtcclxuXHJcbiAgICBwcml2YXRlIF9jb25maWc6IE5nRXpJblZpZXdwb3J0Q29uZmlnO1xyXG5cclxuICAgIHByaXZhdGUgY29udGFpbmVyOiBFbGVtZW50O1xyXG5cclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgcHJpdmF0ZSBsYXRlc3Q6IE5nRXpJblZpZXdwb3J0RXZlbnQgPSB7XHJcbiAgICAgICAgdG9wOiBmYWxzZSxcclxuICAgICAgICBib3R0b206IGZhbHNlLFxyXG4gICAgICAgIGxlZnQ6IGZhbHNlLFxyXG4gICAgICAgIHJpZ2h0OiBmYWxzZSxcclxuICAgICAgICBhbGw6IGZhbHNlLFxyXG4gICAgICAgIGFueTogZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxyXG4gICAgICAgIEBJbmplY3QoV0lORE9XKSBwcml2YXRlIHdpbmRvdzogYW55LFxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSl7fVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5nZXRDbG9zZXN0U2Nyb2xsYWJsZVBhcmVudCh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy9DaGVjayBvbiBzY3JvbGwsIHdpbmRvdyByZXNpemUgYW5kIG9uaW5pdFxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbWVyZ2UoXHJcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLmlzRG9jdW1lbnRUaGVTY3JvbGxhYmxlQ29udGFpbmVyKCkgPyB0aGlzLmRvY3VtZW50IDogdGhpcy5jb250YWluZXIsICdzY3JvbGwnKSwgXHJcbiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLndpbmRvdywgJ3Jlc2l6ZScpLFxyXG4gICAgICAgICAgICBvZihudWxsKSlcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVjaygpKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBpZih0aGlzLnN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0IGNvbmZpZygpOiBOZ0V6SW5WaWV3cG9ydENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgeyBvZmZzZXQgPSB7fSwgLi4uY29uZmlnIH0gPSB0aGlzLl9jb25maWcgfHwge307XHJcblxyXG4gICAgICAgIHJldHVybiB7IFxyXG4gICAgICAgICAgICAuLi5kZWZhdWx0Q29uZmlnLCBcclxuICAgICAgICAgICAgLi4uY29uZmlnLCBcclxuICAgICAgICAgICAgb2Zmc2V0OiB7XHJcbiAgICAgICAgICAgICAgICAuLi5kZWZhdWx0T2Zmc2V0Q29uZmlnLFxyXG4gICAgICAgICAgICAgICAgLi4ub2Zmc2V0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrKCk6IE5nRXpJblZpZXdwb3J0RXZlbnR7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmxhdGVzdDtcclxuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYWxjdWxhdGVWaXNpYmlsaXR5KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0NoYW5nZWQgPSBwcmV2aW91cy50b3AgIT0gY3VycmVudC50b3BcclxuICAgICAgICAgICAgfHwgcHJldmlvdXMuYm90dG9tICE9IGN1cnJlbnQuYm90dG9tXHJcbiAgICAgICAgICAgIHx8IHByZXZpb3VzLmxlZnQgIT0gY3VycmVudC5sZWZ0XHJcbiAgICAgICAgICAgIHx8IHByZXZpb3VzLnJpZ2h0ICE9IGN1cnJlbnQucmlnaHQ7XHJcblxyXG4gICAgICAgIGlmKGhhc0NoYW5nZWQpXHJcbiAgICAgICAgICAgIHRoaXMuaW5WaWV3cG9ydENoYW5nZS5lbWl0KGN1cnJlbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmxhdGVzdCA9IGN1cnJlbnQ7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVWaXNpYmlsaXR5KCk6IE5nRXpJblZpZXdwb3J0RXZlbnR7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSAgZWxlbWVudFJlY3Qud2lkdGg7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgY29uc3QgdG9wID0gZWxlbWVudFJlY3QudG9wIC0gKHRoaXMuaXNEb2N1bWVudFRoZVNjcm9sbGFibGVDb250YWluZXIoKVxyXG4gICAgICAgICAgICA/IDBcclxuICAgICAgICAgICAgOiBjb250YWluZXJSZWN0LnRvcCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHRvcCArIGhlaWdodDtcclxuXHJcbiAgICAgICAgY29uc3QgbGVmdCA9IGVsZW1lbnRSZWN0LmxlZnQgLSAodGhpcy5pc0RvY3VtZW50VGhlU2Nyb2xsYWJsZUNvbnRhaW5lcigpXHJcbiAgICAgICAgICAgID8gMFxyXG4gICAgICAgICAgICA6IGNvbnRhaW5lclJlY3QubGVmdCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gbGVmdCArIHdpZHRoO1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQgfHwgdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCB8fCB0aGlzLndpbmRvdy5pbm5lcldpZHRoO1xyXG5cclxuICAgICAgICBjb25zdCB0b3BJblZpZXcgPSB0b3AgKyB0aGlzLmNvbmZpZy5vZmZzZXQudG9wID49IDAgJiYgdG9wIDw9IChjb250YWluZXJIZWlnaHQgKyB0aGlzLmNvbmZpZy5vZmZzZXQudG9wKTtcclxuICAgICAgICBjb25zdCBib3R0b21JblZpZXcgPSBib3R0b20gKyB0aGlzLmNvbmZpZy5vZmZzZXQuYm90dG9tID49IDAgJiYgYm90dG9tIDw9IChjb250YWluZXJIZWlnaHQgKyB0aGlzLmNvbmZpZy5vZmZzZXQuYm90dG9tKTtcclxuICAgICAgICBjb25zdCBsZWZ0SW5WaWV3ID0gbGVmdCArIHRoaXMuY29uZmlnLm9mZnNldC5sZWZ0ID49IDAgJiYgbGVmdCA8PSAoY29udGFpbmVyV2lkdGggKyB0aGlzLmNvbmZpZy5vZmZzZXQubGVmdCk7XHJcbiAgICAgICAgY29uc3QgcmlnaHRJblZpZXcgPSByaWdodCArIHRoaXMuY29uZmlnLm9mZnNldC5yaWdodCA+PSAwICYmIHJpZ2h0IDw9IChjb250YWluZXJXaWR0aCArIHRoaXMuY29uZmlnLm9mZnNldC5yaWdodCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRvcDogdG9wSW5WaWV3LFxyXG4gICAgICAgICAgICBib3R0b206IGJvdHRvbUluVmlldyxcclxuICAgICAgICAgICAgbGVmdDogbGVmdEluVmlldyAmJiAodG9wSW5WaWV3IHx8IGJvdHRvbUluVmlldyksXHJcbiAgICAgICAgICAgIHJpZ2h0OiByaWdodEluVmlldyAmJiAodG9wSW5WaWV3IHx8IGJvdHRvbUluVmlldyksXHJcbiAgICAgICAgICAgIGFueTogKHRvcEluVmlldyB8fCBib3R0b21JblZpZXcpICYmIChsZWZ0SW5WaWV3IHx8IHJpZ2h0SW5WaWV3KSxcclxuICAgICAgICAgICAgYWxsOiB0b3BJblZpZXcgJiYgYm90dG9tSW5WaWV3ICYmIGxlZnRJblZpZXcgJiYgcmlnaHRJblZpZXdcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q2xvc2VzdFNjcm9sbGFibGVQYXJlbnQobm9kZTogTm9kZSkge1xyXG4gICAgICAgIHJldHVybiAhbm9kZSB8fCBub2RlID09PSB0aGlzLmRvY3VtZW50LmJvZHlcclxuICAgICAgICAgICAgPyB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxyXG4gICAgICAgICAgICA6IHRoaXMuaXNTY3JvbGxhYmxlKG5vZGUpXHJcbiAgICAgICAgICAgICAgICA/IG5vZGUgXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0Q2xvc2VzdFNjcm9sbGFibGVQYXJlbnQobm9kZS5wYXJlbnROb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzU2Nyb2xsYWJsZShub2RlOiBOb2RlKXtcclxuICAgICAgICBjb25zdCByZWdleCA9IC8oYXV0b3xzY3JvbGwpLztcclxuICAgICAgICByZXR1cm4gcmVnZXgudGVzdChcclxuICAgICAgICAgICAgdGhpcy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICdvdmVyZmxvdycpICtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsICdvdmVyZmxvdy15JykgK1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbXB1dGVkU3R5bGUobm9kZSwgJ292ZXJmbG93LXgnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb21wdXRlZFN0eWxlKG5vZGU6IE5vZGUsIHN0eWxlOiBzdHJpbmcpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpLmdldFByb3BlcnR5VmFsdWUoc3R5bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNEb2N1bWVudFRoZVNjcm9sbGFibGVDb250YWluZXIoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgPT09IHRoaXMuY29udGFpbmVyO1xyXG4gICAgfVxyXG59Il19