@ngx-gallery/gallerize
Version:
Angular gallery directive that hooks the lightbox with the images automatically.
266 lines • 23.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, Input, Inject, Optional, Self, Host, NgZone, ElementRef, Renderer2, PLATFORM_ID } from '@angular/core';
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
import { Gallery, ImageItem, GalleryComponent } from '@ngx-gallery/core';
import { Lightbox } from '@ngx-gallery/lightbox';
import { Subject, from, EMPTY } from 'rxjs';
import { tap, map, switchMap, finalize, debounceTime } from 'rxjs/operators';
/** @enum {string} */
var GallerizeMode = {
Detector: 'detector',
Gallery: 'gallery',
};
var GallerizeDirective = /** @class */ (function () {
function GallerizeDirective(_zone, _el, _gallery, _lightbox, _renderer, platform, _document, _galleryCmp) {
this._zone = _zone;
this._el = _el;
this._gallery = _gallery;
this._lightbox = _lightbox;
this._renderer = _renderer;
this._document = _document;
this._galleryCmp = _galleryCmp;
/**
* Default gallery id
*/
this._galleryId = 'lightbox';
/**
* The selector used to query images elements
*/
this.selector = 'img';
// Set gallerize mode
if (isPlatformBrowser(platform)) {
this._mode = _galleryCmp ? "gallery" /* Gallery */ : "detector" /* Detector */;
}
}
/**
* @return {?}
*/
GallerizeDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this._zone.runOutsideAngular(function () {
_this._galleryId = _this.gallerize || _this._galleryId;
/** @type {?} */
var ref = _this._gallery.ref(_this._galleryId);
switch (_this._mode) {
case "detector" /* Detector */:
_this.detectorMode(ref);
break;
case "gallery" /* Gallery */:
_this.galleryMode(ref);
}
});
};
/**
* @return {?}
*/
GallerizeDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
switch (this._mode) {
case "detector" /* Detector */:
this._detector$.complete();
this._observer$.disconnect();
break;
case "gallery" /* Gallery */:
this._itemClick$.unsubscribe();
this._itemChange$.unsubscribe();
}
};
/** Gallery mode: means `gallerize` directive is used on `<gallery>` component
* Adds a click event to each gallery item so it opens in lightbox */
/**
* Gallery mode: means `gallerize` directive is used on `<gallery>` component
* Adds a click event to each gallery item so it opens in lightbox
* @private
* @param {?} galleryRef
* @return {?}
*/
GallerizeDirective.prototype.galleryMode = /**
* Gallery mode: means `gallerize` directive is used on `<gallery>` component
* Adds a click event to each gallery item so it opens in lightbox
* @private
* @param {?} galleryRef
* @return {?}
*/
function (galleryRef) {
var _this = this;
// Clone its items to the new gallery instance
this._itemClick$ = this._galleryCmp.galleryRef.itemClick.subscribe(function (i) { return _this._lightbox.open(i, _this._galleryId); });
this._itemChange$ = this._galleryCmp.galleryRef.itemsChanged.subscribe(function (state) { return galleryRef.load(state.items); });
};
/** Detector mode: means `gallerize` directive is used on a normal HTMLElement
* Detects images and adds a click event to each image so it opens in the lightbox */
/**
* Detector mode: means `gallerize` directive is used on a normal HTMLElement
* Detects images and adds a click event to each image so it opens in the lightbox
* @private
* @param {?} galleryRef
* @return {?}
*/
GallerizeDirective.prototype.detectorMode = /**
* Detector mode: means `gallerize` directive is used on a normal HTMLElement
* Detects images and adds a click event to each image so it opens in the lightbox
* @private
* @param {?} galleryRef
* @return {?}
*/
function (galleryRef) {
var _this = this;
this._detector$ = new Subject();
// Query image elements
this._detector$.pipe(debounceTime(300), switchMap(function () {
/**
* get all img elements from content
* @type {?}
*/
var imageElements = _this._el.nativeElement.querySelectorAll(_this.selector);
if (imageElements && imageElements.length) {
/** @type {?} */
var images_1 = [];
return from(imageElements).pipe(map(function (el, i) {
// Add click event to the image
_this._renderer.setStyle(el, 'cursor', 'pointer');
_this._renderer.setProperty(el, 'onclick', function () {
return _this._zone.run(function () { return _this._lightbox.open(i, _this._galleryId); });
});
if (el instanceof HTMLImageElement) {
// If element is type of img use the src property
return {
src: el.getAttribute('imageSrc') || el.src,
thumb: el.getAttribute('thumbSrc') || el.src
};
}
else {
// Otherwise, use element background-image url
/** @type {?} */
var elStyle = el.currentStyle || _this._document.defaultView.getComputedStyle(el, null);
/** @type {?} */
var background = elStyle.backgroundImage.slice(4, -1).replace(/"/g, '');
return {
src: el.getAttribute('imageSrc') || background,
thumb: el.getAttribute('thumbSrc') || background
};
}
}), tap(function (data) { return images_1.push(new ImageItem(data)); }), finalize(function () { return galleryRef.load(images_1); }));
}
else {
return EMPTY;
}
})).subscribe();
// Observe content changes
this._observer$ = new MutationObserver(function () { return _this._detector$.next(); });
this._observer$.observe(this._el.nativeElement, { childList: true, subtree: true });
};
GallerizeDirective.decorators = [
{ type: Directive, args: [{
selector: '[gallerize]'
},] }
];
/** @nocollapse */
GallerizeDirective.ctorParameters = function () { return [
{ type: NgZone },
{ type: ElementRef },
{ type: Gallery },
{ type: Lightbox },
{ type: Renderer2 },
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: GalleryComponent, decorators: [{ type: Host }, { type: Self }, { type: Optional }] }
]; };
GallerizeDirective.propDecorators = {
gallerize: [{ type: Input }],
selector: [{ type: Input }]
};
return GallerizeDirective;
}());
export { GallerizeDirective };
if (false) {
/**
* Default gallery id
* @type {?}
* @private
*/
GallerizeDirective.prototype._galleryId;
/**
* Gallerize mode
* @type {?}
* @private
*/
GallerizeDirective.prototype._mode;
/**
* Stream that emits to fire the detection stream the image elements has changed
* @type {?}
* @private
*/
GallerizeDirective.prototype._observer$;
/**
* Stream that emits when image is discover
* @type {?}
* @private
*/
GallerizeDirective.prototype._detector$;
/**
* Gallery events (if used on a gallery component)
* @type {?}
* @private
*/
GallerizeDirective.prototype._itemClick$;
/**
* @type {?}
* @private
*/
GallerizeDirective.prototype._itemChange$;
/**
* If set, it will become the gallery id
* @type {?}
*/
GallerizeDirective.prototype.gallerize;
/**
* The selector used to query images elements
* @type {?}
*/
GallerizeDirective.prototype.selector;
/**
* @type {?}
* @private
*/
GallerizeDirective.prototype._zone;
/**
* @type {?}
* @private
*/
GallerizeDirective.prototype._el;
/**
* @type {?}
* @private
*/
GallerizeDirective.prototype._gallery;
/**
* @type {?}
* @private
*/
GallerizeDirective.prototype._lightbox;
/**
* @type {?}
* @private
*/
GallerizeDirective.prototype._renderer;
/**
* @type {?}
* @private
*/
GallerizeDirective.prototype._document;
/**
* @type {?}
* @private
*/
GallerizeDirective.prototype._galleryCmp;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsbGVyaXplLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZ3gtZ2FsbGVyeS9nYWxsZXJpemUvIiwic291cmNlcyI6WyJsaWIvZ2FsbGVyaXplLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBR0wsTUFBTSxFQUNOLFFBQVEsRUFDUixJQUFJLEVBQ0osSUFBSSxFQUNKLE1BQU0sRUFDTixVQUFVLEVBQ1YsU0FBUyxFQUNULFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUQsT0FBTyxFQUFFLE9BQU8sRUFBYyxTQUFTLEVBQUUsZ0JBQWdCLEVBQTZCLE1BQU0sbUJBQW1CLENBQUM7QUFDaEgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpELE9BQU8sRUFBRSxPQUFPLEVBQWdCLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0lBUzNFLFVBQVcsVUFBVTtJQUNyQixTQUFVLFNBQVM7O0FBR3JCO0lBaUNFLDRCQUFvQixLQUFhLEVBQ2IsR0FBZSxFQUNmLFFBQWlCLEVBQ2pCLFNBQW1CLEVBQ25CLFNBQW9CLEVBQ1AsUUFBZ0IsRUFDWCxTQUFjLEVBQ0osV0FBNkI7UUFQekQsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDZixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFDbkIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUVGLGNBQVMsR0FBVCxTQUFTLENBQUs7UUFDSixnQkFBVyxHQUFY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Ozs7SUFDeEMseUNBQWlFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNlbGYsXG4gIEhvc3QsXG4gIE5nWm9uZSxcbiAgRWxlbWVudFJlZixcbiAgUmVuZGVyZXIyLFxuICBQTEFURk9STV9JRFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IEdhbGxlcnksIEdhbGxlcnlSZWYsIEltYWdlSXRlbSwgR2FsbGVyeUNvbXBvbmVudCwgR2FsbGVyeVN0YXRlLCBHYWxsZXJ5SXRlbSB9IGZyb20gJ0BuZ3gtZ2FsbGVyeS9jb3JlJztcbmltcG9ydCB7IExpZ2h0Ym94IH0gZnJvbSAnQG5neC1nYWxsZXJ5L2xpZ2h0Ym94JztcblxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBmcm9tLCBFTVBUWSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFwLCBtYXAsIHN3aXRjaE1hcCwgZmluYWxpemUsIGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSBoYXMgMiBtb2RlczpcbiAqIDEgLSBJZiBob3N0IGVsZW1lbnQgaXMgYSBIVE1MRWxlbWVudCwgaXQgZGV0ZWN0cyB0aGUgaW1hZ2VzIGFuZCBob29rcyB0aGVpciBjbGlja3MgdG8gbGlnaHRib3hcbiAqIDIgLSBJZiBob3N0IGVsZW1lbnQgaXMgYSBHYWxsZXJ5Q29tcG9uZW50LCBpdCBob29rcyB0aGUgaW1hZ2VzIGNsaWNrIHRvIHRoZSBsaWdodGJveFxuICovXG5cbmNvbnN0IGVudW0gR2FsbGVyaXplTW9kZSB7XG4gIERldGVjdG9yID0gJ2RldGVjdG9yJyxcbiAgR2FsbGVyeSA9ICdnYWxsZXJ5J1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZ2FsbGVyaXplXSdcbn0pXG5leHBvcnQgY2xhc3MgR2FsbGVyaXplRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKiBEZWZhdWx0IGdhbGxlcnkgaWQgKi9cbiAgcHJpdmF0ZSBfZ2FsbGVyeUlkID0gJ2xpZ2h0Ym94JztcblxuICAvKiogR2FsbGVyaXplIG1vZGUgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbW9kZTogR2FsbGVyaXplTW9kZTtcblxuICAvKiogSWYgaG9zdCBlbGVtZW50IGlzIGEgSFRNTEVsZW1lbnQsIHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOiAqL1xuXG4gIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyB0byBmaXJlIHRoZSBkZXRlY3Rpb24gc3RyZWFtIHRoZSBpbWFnZSBlbGVtZW50cyBoYXMgY2hhbmdlZCAqL1xuICBwcml2YXRlIF9vYnNlcnZlciQ6IGFueTtcblxuICAvKiogU3RyZWFtIHRoYXQgZW1pdHMgd2hlbiBpbWFnZSBpcyBkaXNjb3ZlciAqL1xuICBwcml2YXRlIF9kZXRlY3RvciQ6IFN1YmplY3Q8YW55PjtcblxuICAvKiogSWYgaG9zdCBlbGVtZW50IGlzIGEgR2FsbGVyeUNvbXBvbmVudCwgd2lsbCB1c2UgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6ICovXG5cbiAgLyoqIEdhbGxlcnkgZXZlbnRzIChpZiB1c2VkIG9uIGEgZ2FsbGVyeSBjb21wb25lbnQpICovXG4gIHByaXZhdGUgX2l0ZW1DbGljayQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfaXRlbUNoYW5nZSQ6IFN1YnNjcmlwdGlvbjtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogSWYgc2V0LCBpdCB3aWxsIGJlY29tZSB0aGUgZ2FsbGVyeSBpZCAqL1xuICBASW5wdXQoKSBnYWxsZXJpemU6IHN0cmluZztcblxuICAvKiogVGhlIHNlbGVjdG9yIHVzZWQgdG8gcXVlcnkgaW1hZ2VzIGVsZW1lbnRzICovXG4gIEBJbnB1dCgpIHNlbGVjdG9yID0gJ2ltZyc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfem9uZTogTmdab25lLFxuICAgICAgICAgICAgICBwcml2YXRlIF9lbDogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZ2FsbGVyeTogR2FsbGVyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbGlnaHRib3g6IExpZ2h0Ym94LFxuICAgICAgICAgICAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybTogT2JqZWN0LFxuICAgICAgICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55LFxuICAgICAgICAgICAgICBASG9zdCgpIEBTZWxmKCkgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfZ2FsbGVyeUNtcDogR2FsbGVyeUNvbXBvbmVudCkge1xuXG4gICAgLy8gU2V0IGdhbGxlcml6ZSBtb2RlXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtKSkge1xuICAgICAgdGhpcy5fbW9kZSA9IF9nYWxsZXJ5Q21wID8gR2FsbGVyaXplTW9kZS5HYWxsZXJ5IDogR2FsbGVyaXplTW9kZS5EZXRlY3RvcjtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX2dhbGxlcnlJZCA9IHRoaXMuZ2FsbGVyaXplIHx8IHRoaXMuX2dhbGxlcnlJZDtcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMuX2dhbGxlcnkucmVmKHRoaXMuX2dhbGxlcnlJZCk7XG5cbiAgICAgIHN3aXRjaCAodGhpcy5fbW9kZSkge1xuICAgICAgICBjYXNlIEdhbGxlcml6ZU1vZGUuRGV0ZWN0b3I6XG4gICAgICAgICAgdGhpcy5kZXRlY3Rvck1vZGUocmVmKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBHYWxsZXJpemVNb2RlLkdhbGxlcnk6XG4gICAgICAgICAgdGhpcy5nYWxsZXJ5TW9kZShyZWYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgc3dpdGNoICh0aGlzLl9tb2RlKSB7XG4gICAgICBjYXNlIEdhbGxlcml6ZU1vZGUuRGV0ZWN0b3I6XG4gICAgICAgIHRoaXMuX2RldGVjdG9yJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9vYnNlcnZlciQuZGlzY29ubmVjdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgR2FsbGVyaXplTW9kZS5HYWxsZXJ5OlxuICAgICAgICB0aGlzLl9pdGVtQ2xpY2skLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2l0ZW1DaGFuZ2UkLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdhbGxlcnkgbW9kZTogbWVhbnMgYGdhbGxlcml6ZWAgZGlyZWN0aXZlIGlzIHVzZWQgb24gYDxnYWxsZXJ5PmAgY29tcG9uZW50XG4gICAqIEFkZHMgYSBjbGljayBldmVudCB0byBlYWNoIGdhbGxlcnkgaXRlbSBzbyBpdCBvcGVucyBpbiBsaWdodGJveCAqL1xuICBwcml2YXRlIGdhbGxlcnlNb2RlKGdhbGxlcnlSZWY6IEdhbGxlcnlSZWYpIHtcbiAgICAvLyBDbG9uZSBpdHMgaXRlbXMgdG8gdGhlIG5ldyBnYWxsZXJ5IGluc3RhbmNlXG4gICAgdGhpcy5faXRlbUNsaWNrJCA9IHRoaXMuX2dhbGxlcnlDbXAuZ2FsbGVyeVJlZi5pdGVtQ2xpY2suc3Vic2NyaWJlKChpOiBudW1iZXIpID0+IHRoaXMuX2xpZ2h0Ym94Lm9wZW4oaSwgdGhpcy5fZ2FsbGVyeUlkKSk7XG4gICAgdGhpcy5faXRlbUNoYW5nZSQgPSB0aGlzLl9nYWxsZXJ5Q21wLmdhbGxlcnlSZWYuaXRlbXNDaGFuZ2VkLnN1YnNjcmliZSgoc3RhdGU6IEdhbGxlcnlTdGF0ZSkgPT4gZ2FsbGVyeVJlZi5sb2FkKHN0YXRlLml0ZW1zKSk7XG4gIH1cblxuICAvKiogRGV0ZWN0b3IgbW9kZTogbWVhbnMgYGdhbGxlcml6ZWAgZGlyZWN0aXZlIGlzIHVzZWQgb24gYSBub3JtYWwgSFRNTEVsZW1lbnRcbiAgICogIERldGVjdHMgaW1hZ2VzIGFuZCBhZGRzIGEgY2xpY2sgZXZlbnQgdG8gZWFjaCBpbWFnZSBzbyBpdCBvcGVucyBpbiB0aGUgbGlnaHRib3ggKi9cbiAgcHJpdmF0ZSBkZXRlY3Rvck1vZGUoZ2FsbGVyeVJlZjogR2FsbGVyeVJlZikge1xuICAgIHRoaXMuX2RldGVjdG9yJCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgLy8gUXVlcnkgaW1hZ2UgZWxlbWVudHNcbiAgICB0aGlzLl9kZXRlY3RvciQucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcblxuICAgICAgICAvKiogZ2V0IGFsbCBpbWcgZWxlbWVudHMgZnJvbSBjb250ZW50ICovXG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudHMgPSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZWxlY3Rvcik7XG5cbiAgICAgICAgaWYgKGltYWdlRWxlbWVudHMgJiYgaW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcblxuICAgICAgICAgIGNvbnN0IGltYWdlczogR2FsbGVyeUl0ZW1bXSA9IFtdO1xuXG4gICAgICAgICAgcmV0dXJuIGZyb20oaW1hZ2VFbGVtZW50cykucGlwZShcbiAgICAgICAgICAgIG1hcCgoZWw6IGFueSwgaSkgPT4ge1xuICAgICAgICAgICAgICAvLyBBZGQgY2xpY2sgZXZlbnQgdG8gdGhlIGltYWdlXG4gICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGVsLCAnY3Vyc29yJywgJ3BvaW50ZXInKTtcbiAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkoZWwsICdvbmNsaWNrJywgKCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLl9saWdodGJveC5vcGVuKGksIHRoaXMuX2dhbGxlcnlJZCkpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaXMgdHlwZSBvZiBpbWcgdXNlIHRoZSBzcmMgcHJvcGVydHlcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgc3JjOiBlbC5nZXRBdHRyaWJ1dGUoJ2ltYWdlU3JjJykgfHwgZWwuc3JjLFxuICAgICAgICAgICAgICAgICAgdGh1bWI6IGVsLmdldEF0dHJpYnV0ZSgndGh1bWJTcmMnKSB8fCBlbC5zcmNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdXNlIGVsZW1lbnQgYmFja2dyb3VuZC1pbWFnZSB1cmxcbiAgICAgICAgICAgICAgICBjb25zdCBlbFN0eWxlID0gZWwuY3VycmVudFN0eWxlIHx8IHRoaXMuX2RvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmQgPSBlbFN0eWxlLmJhY2tncm91bmRJbWFnZS5zbGljZSg0LCAtMSkucmVwbGFjZSgvXCIvZywgJycpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBzcmM6IGVsLmdldEF0dHJpYnV0ZSgnaW1hZ2VTcmMnKSB8fCBiYWNrZ3JvdW5kLFxuICAgICAgICAgICAgICAgICAgdGh1bWI6IGVsLmdldEF0dHJpYnV0ZSgndGh1bWJTcmMnKSB8fCBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAoKGRhdGE6IGFueSkgPT4gaW1hZ2VzLnB1c2gobmV3IEltYWdlSXRlbShkYXRhKSkpLFxuICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gZ2FsbGVyeVJlZi5sb2FkKGltYWdlcykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUoKTtcblxuICAgIC8vIE9ic2VydmUgY29udGVudCBjaGFuZ2VzXG4gICAgdGhpcy5fb2JzZXJ2ZXIkID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gdGhpcy5fZGV0ZWN0b3IkLm5leHQoKSk7XG4gICAgdGhpcy5fb2JzZXJ2ZXIkLm9ic2VydmUodGhpcy5fZWwubmF0aXZlRWxlbWVudCwge2NoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pO1xuICB9XG59XG4iXX0=