@crystalui/angular-lightbox
Version:
Angular library for viewing images in a pop-up window with touch screen support.
390 lines • 52.2 kB
JavaScript
import { __decorate } from "tslib";
import { Component, Input, EventEmitter, OnInit, HostBinding, HostListener, ViewChild, ViewChildren, ElementRef, ChangeDetectorRef, ContentChildren, QueryList } from '@angular/core';
import { EventService } from './event.service';
import { LightboxCommonComponent } from './lightbox-common.component';
let LightboxComponent = class LightboxComponent extends LightboxCommonComponent {
constructor(elementRef, ref, eventService) {
super(eventService);
this.elementRef = elementRef;
this.ref = ref;
this.eventService = eventService;
this.spinnerHeight = 30;
this.minTimeout = 30;
this.preloaderTimeout = 100;
this.spinnerStyles = {
transform: ''
};
this.configThumbnailPreloader = true;
this.events = new EventEmitter();
this.hostShown = false;
this.hideControls = false;
}
get simpleMode() {
return this.properties.simpleMode;
}
get hostLightTheme() {
return this.properties.backgroundColor === 'white';
}
get currImagePath() {
let image = this.images[this.index];
let path;
if (!image) {
return false;
}
if (image.fullImage && image.fullImage.path) {
path = image.fullImage.path;
}
else if (image.thumbnailImage && image.thumbnailImage.path) {
path = image.thumbnailImage.path;
}
else if (image.path) {
path = image.path;
}
return path;
}
get prevImagePath() {
return this.images[this.prevIndex];
}
set prevImagePath(value) {
this.images[this.prevIndex] = value;
}
get isHiddenPrevArrow() {
return this.isFirstImage && !this.properties.loop || this.isZoomIn;
}
get isHiddenNextArrow() {
return this.isLastImage && !this.properties.loop || this.isZoomIn;
}
get isPreloader() {
return this.animationMode === 'zoom-preloader' &&
this.showState != 'animation-end' &&
this.currImageLoadingState === 'loading';
}
get imageOrientation() {
if (this.thumbnailImage.naturalWidth > this.thumbnailImage.naturalHeight) {
return 'horizontal';
}
else {
return 'vertical';
}
}
scrolling() {
if (this.showState === 'initial-thumbnail-image' ||
this.showState === 'initial-virtual-image' ||
this.closingState === 'animation') {
this.updateThumbnailPosition();
}
}
onKeyDown(event) {
switch (event.key) {
case 'ArrowLeft':
this.prev();
break;
case 'ArrowRight':
this.next();
break;
case 'Escape':
this.closeLightbox();
break;
}
}
onMouseEnter(event) {
this.hideControls = false;
}
transitionEnd(event) {
if (event.propertyName === "transform" && this.hostAnimation) {
this.hostAnimation = false;
}
}
ngOnInit() {
this.currentImageIndex = this.properties.index;
this.initialLightbox();
}
ngAfterViewInit() {
setTimeout(() => {
if (this.currImageLoadingState === 'not-loaded') {
this.currImageLoadingState = 'loading';
}
}, this.preloaderTimeout);
// Mode: default
if (this.animationMode === 'default') {
setTimeout(() => {
this.showLightboxAnimation();
}, this.minTimeout);
}
}
onImageLoaded() {
// When opening lightbox
if (this.animationMode === 'zoom-preloader' &&
this.showState === 'initial-thumbnail-image') {
this.initialLightboxVirtualImage();
setTimeout(() => {
this.currImageLoadingState = 'uploaded';
this.showLightboxAnimation();
if (this.properties.hideThumbnail) {
this.hideThumbnailImage();
}
}, this.minTimeout);
}
// When opening next / previous image
if (this.showState === 'animation-end') {
this.currImageLoadingState = 'uploaded';
if (this.properties.hideThumbnail) {
this.hideThumbnailImage();
}
}
this.ref.detectChanges();
}
onImageError(event) {
this.currImageLoadingState = 'error';
this.initialLightboxDefault();
setTimeout(() => {
this.showLightboxAnimation();
}, this.minTimeout);
}
onContainerClick(event) {
if (event.target === this.lightboxContainerElem.nativeElement || this.simpleMode) {
this.closeLightbox();
}
}
initialLightbox() {
this.setMaxDimensions();
this.setAnimationDuration();
switch (this.animationMode) {
case 'zoom-preloader':
this.initialLightboxThumbnailImage();
break;
case 'default':
this.initialLightboxDefault();
break;
}
}
initialLightboxDefault() {
this.showState = 'initial-default';
this.containerStyles = {
transform: 'translate3d(0, 0, 0)',
height: '100%',
width: '100%',
opacity: '0'
};
// next step: AfterViewInit
}
initialLightboxVirtualImage() {
this.setShowState('initial-virtual-image');
this.containerStyles = {
transform: this.containerInitialPosition,
height: this.virtualImageDimension.height + 'px',
width: this.virtualImageDimension.width + 'px'
};
// next step: onImageLoaded() -> showLightboxAnimation()
}
initialLightboxThumbnailImage() {
this.setShowState('initial-thumbnail-image');
this.containerStyles = {
transform: this.containerInitialPosition,
height: this.thumbnailImagePosition.height + 'px',
width: this.thumbnailImagePosition.width + 'px'
};
// next step: onImageLoaded()
}
showLightboxAnimation() {
this.hostAnimation = true;
this.setShowState('animation');
this.hostShown = true;
this.setBackgroundColor();
this.setAnimationDuration();
// Mode: zoom preloader
if (this.animationMode === 'zoom-preloader' &&
this.currImageLoadingState !== 'error') {
this.containerStyles.transform = this.containerFullscreenPosition;
}
// Mode: default
if (this.animationMode === 'default') {
this.containerStyles.opacity = '1';
}
// next step: handleLightboxTransitionEnd
}
showLightboxAnimationEnd() {
this.setShowState('animation-end');
this.containerStyles = {
transform: 'translate3d(0, 0, 0)',
height: '100%',
width: '100%',
};
}
closeLightbox() {
this.setClosingState('initial');
this.hostShown = false;
this.closeLightboxInitial();
}
closeLightboxInitial() {
this.setClosingState('initial-styles');
// Mode: zoom preloader
if (this.animationMode === 'zoom-preloader') {
this.containerStyles = {
transform: this.containerFullscreenPosition,
height: this.virtualImageDimension.height + 'px',
width: this.virtualImageDimension.width + 'px',
};
}
// Mode: default
if (this.animationMode === 'default') {
this.containerStyles.opacity = '1';
}
setTimeout(() => {
this.closeLightboxAnimation();
}, this.minTimeout);
}
closeLightboxAnimation() {
this.setClosingState('animation');
// Mode: zoom preloader
if (this.animationMode === 'zoom-preloader') {
this.hostAnimation = true;
this.containerStyles = {
transform: this.containerInitialPosition,
height: this.getContainerHeight(),
width: this.getContainerWidth(),
};
this.hostStyleBackgroundColor = '';
}
// Mode: default
if (this.animationMode === 'default') {
this.hostAnimation = true;
this.containerStyles.opacity = '0';
this.hostStyleBackgroundColor = '';
}
this.setAnimationDuration();
// next step: handleLightboxTransitionEnd
if (this.animationDuration === 0) { // in the future, change to a type conversion getter
this.closeLightboxAnimationEnd();
}
}
closeLightboxAnimationEnd() {
this.setClosingState('animation-end');
this.events.emit({ type: 'close' });
// Mode: zoom preloader
if (this.animationMode === 'zoom-preloader') {
this.showThumbnailImage();
}
}
/*
* Transition End
*/
handleLightboxTransitionEnd(event) {
if (this.showState === 'animation') {
this.showLightboxAnimationEnd();
}
// Last close step
if (this.closingState === 'animation') {
this.closeLightboxAnimationEnd();
}
}
next() {
if (this.animationMode === 'zoom-preloader') {
this.showThumbnailImage();
}
if (this.isLastImage) {
if (this.properties.loop) {
this.currentImageIndex = 0;
}
else {
return;
}
}
else {
this.currentImageIndex++;
this.currImageLoadingState = 'loading';
}
setTimeout(() => {
if (this.currImageLoadingState !== 'uploaded') {
this.currImageLoadingState = 'loading';
}
}, this.preloaderTimeout);
}
prev() {
if (this.animationMode === 'zoom-preloader') {
this.showThumbnailImage();
}
if (this.isFirstImage) {
if (this.properties.loop) {
this.currentImageIndex = this.latestImageIndex;
}
else {
return;
}
}
else {
this.currentImageIndex--;
this.currImageLoadingState = 'loading';
}
setTimeout(() => {
if (this.currImageLoadingState !== 'uploaded') {
this.currImageLoadingState = 'loading';
}
}, this.preloaderTimeout);
}
setMaxDimensions() {
this.lightboxImage.nativeElement.style.maxHeight = 'calc(' + this.properties.imageMaxHeight + ')';
this.lightboxImage.nativeElement.style.maxWidth = this.properties.imageMaxWidth;
}
handlePinchZoomEvents(event) {
if (event.type === "zoom-in") {
this.isZoomIn = true;
}
if (event.type === "zoom-out") {
this.isZoomIn = false;
}
}
getContainerWidth() {
return this.thumbnailImagePosition.width / this.containerScale + 'px';
}
};
LightboxComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: EventService }
];
__decorate([
HostBinding('class.lightbox-shown')
], LightboxComponent.prototype, "hostShown", void 0);
__decorate([
HostBinding('class.lightbox-hide-controls')
], LightboxComponent.prototype, "hideControls", void 0);
__decorate([
HostBinding('class.lightbox-animation')
], LightboxComponent.prototype, "hostAnimation", void 0);
__decorate([
HostBinding('class.lightbox-simple-mode')
], LightboxComponent.prototype, "simpleMode", null);
__decorate([
HostBinding('class.lightbox-light')
], LightboxComponent.prototype, "hostLightTheme", null);
__decorate([
HostBinding('style.backgroundColor')
], LightboxComponent.prototype, "hostStyleBackgroundColor", void 0);
__decorate([
ViewChild('prevImageElem', { static: true })
], LightboxComponent.prototype, "prevImageElem", void 0);
__decorate([
ViewChild('lightboxContainer', { static: true })
], LightboxComponent.prototype, "lightboxContainerElem", void 0);
__decorate([
HostListener('window:scroll')
], LightboxComponent.prototype, "scrolling", null);
__decorate([
HostListener('window:keydown', ['$event'])
], LightboxComponent.prototype, "onKeyDown", null);
__decorate([
HostListener("mouseenter", ['$event'])
], LightboxComponent.prototype, "onMouseEnter", null);
__decorate([
HostListener('transitionend', ['$event'])
], LightboxComponent.prototype, "transitionEnd", null);
LightboxComponent = __decorate([
Component({
selector: 'crystal-lightbox',
template: "<div class=\"lightbox-counter\" *ngIf=\"properties.counter && images.length > 1\">{{counter}}</div>\n<div class=\"lightbox-close\" *ngIf=\"!simpleMode\" (click)=\"closeLightbox()\">{{closeButtonText}}</div>\n<div class=\"lightbox-spinner\" \n\t*ngIf=\"currImageLoadingState === 'loading' && showState === 'animation-end'\"></div>\n<div class=\"lightbox-container\" \n\t#lightboxContainer\n\t[ngStyle]=\"containerStyles\"\n\t(transitionend)=\"handleLightboxTransitionEnd($event)\"\n\t(click)=\"onContainerClick($event)\">\n\n\t<div class=\"lightbox-preloader\" *ngIf=\"isPreloader\">\n\t\t<div class=\"lightbox-spinner\"></div>\n\t</div>\n\n\t<div class=\"lightbox-error\" *ngIf=\"currImageLoadingState === 'error' && !closingState\">Failed to load image</div>\n\n\t<img class=\"lightbox-curr-image\" \n\t\t#lightboxImage\n\t\t[src]=\"currImagePath\" \n\t\t[class.lightbox-show]=\"currImageLoadingState === 'uploaded'\" \n\t\t(load)=\"onImageLoaded()\"\n\t\t(error)=\"onImageError($event)\" />\n</div>\n\n<div class=\"lightbox-prev\" [hidden]=\"isHiddenPrevArrow\" (click)=\"prev()\"></div>\n<div class=\"lightbox-next\" [hidden]=\"isHiddenNextArrow\" (click)=\"next()\"></div>",
styles: [".lightbox-spinner,.lightbox-spinner:after,.lightbox-spinner:before{border-radius:50%;width:10px;height:10px;-webkit-animation:1.5s ease-in-out infinite lightbox-load;animation:1.5s ease-in-out infinite lightbox-load}.lightbox-spinner{color:#fff;font-size:10px;margin:0 auto 20px;position:relative;text-indent:-9999em;transform:translateZ(0);-webkit-animation-delay:-.16s;animation-delay:-.16s}.lightbox-spinner:after,.lightbox-spinner:before{content:\"\";position:absolute;top:0}.lightbox-spinner:before{left:-32px;-webkit-animation-delay:-.32s;animation-delay:-.32s}.lightbox-spinner:after{left:32px}@-webkit-keyframes lightbox-load{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes lightbox-load{0%,100%,80%{box-shadow:0 10px 0 -1.3em}40%{box-shadow:0 10px 0 0}}:host.lightbox-shown{opacity:1}:host.lightbox-shown .lightbox-close,:host.lightbox-shown .lightbox-next,:host.lightbox-shown .lightbox-prev{opacity:.5;transition-delay:.1s}:host.lightbox-shown .lightbox-close:hover,:host.lightbox-shown .lightbox-next:hover,:host.lightbox-shown .lightbox-prev:hover{opacity:1;transition-delay:0}:host.lightbox-shown .lightbox-counter{opacity:1}:host.lightbox-hide-controls .lightbox-close,:host.lightbox-hide-controls .lightbox-next,:host.lightbox-hide-controls .lightbox-prev{opacity:0}:host.lightbox-simple-mode .lightbox-container{cursor:zoom-out}:host:not(.lightbox-animation) .lightbox-container{display:flex;align-items:center;justify-content:center;top:0;left:0;height:100%}:host.lightbox-light{color:#000;text-shadow:none}:host{position:fixed;top:0;left:0;width:100%;height:100%;color:#fff;text-shadow:0 0 1px rgba(0,0,0,.65);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:10000}:host img{opacity:1;max-width:100%;max-height:100%}:host img.lightbox-curr-image.lightbox-show{opacity:1}:host img.lightbox-curr-image{opacity:0;z-index:10}:host .lightbox-container.lightbox-hide{display:none}:host .lightbox-container{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transform-origin:top left}:host .lightbox-preloader{background:rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center;width:100%;height:100%;position:absolute}:host .lightbox-spinner{position:absolute;top:51%;left:50%;margin-top:-15px;margin-left:-5px}:host .lightbox-preloader .lightbox-spinner{margin-top:-9px;margin-left:-3px}:host .lightbox-preloader .lightbox-spinner,:host .lightbox-preloader .lightbox-spinner:after,:host .lightbox-preloader .lightbox-spinner:before{width:6px;height:6px}:host .lightbox-preloader .lightbox-spinner:before{left:-21px}:host .lightbox-preloader .lightbox-spinner:after{left:21px}:host .lightbox-counter{text-align:left;position:absolute;left:22px;top:13px;font-size:14px;z-index:30}:host .lightbox-description{text-align:center;max-width:calc(100% - 200px);margin:0 auto;font-size:14px;line-height:43px;position:relative;z-index:50}:host .lightbox-error{color:rgba(255,255,255,.75);font-size:19px}:host .lightbox-close{position:absolute;top:0;right:0;padding:13px 22px;font-size:13px;text-transform:uppercase;cursor:pointer;opacity:.5;z-index:30;transition:opacity .1s ease-in-out}:host .lightbox-next,:host .lightbox-prev{width:100px;height:100%;position:absolute;top:0;cursor:pointer;opacity:.5;z-index:20;transition:opacity .1s ease-in-out;-webkit-tap-highlight-color:rgba(255,255,255,0)}:host .lightbox-prev{left:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAiCAYAAABbXymAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjMzMTZCQzFERDgzMTExRTc5QUYxQTUxRDI5MkM5ODZCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjMzMTZCQzFFRDgzMTExRTc5QUYxQTUxRDI5MkM5ODZCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzMxNkJDMUJEODMxMTFFNzlBRjFBNTFEMjkyQzk4NkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzMxNkJDMUNEODMxMTFFNzlBRjFBNTFEMjkyQzk4NkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7VrwZKAAAClElEQVR42qzWSY8SQRgGYLoVHPeTXlwCiIwMArJGtiABNep4IGZi4oEfMJooLjePrnFGf5yJS0hYmq2b/aBxiQ6+lRRJdaUZq5vp5E2TLnioVFd9VZLN+iUxIdeMiW2fRVCmvz2DpJBVCk6X6SVBHQRLpVKb7Xb782g0Usrl8jM8W0P20+9YQn3JZPIhwN6MXoPBoI3nG8iKGZhF14A+AqrOmKtWq31F213kkOgQ69B0Ol0BqrFot9vV/H7/c7RfEoVZ1G+EdjqdvtfrfYn2K8gJkaHQodlstjIej/ssihdH0Ddov4acQo7QlycJo5PJhEc1j8fzmqJk2h1D7Lv1lkUv5nK5xzzaarWMUIcwms/nCTrgUbfbTdCrVtAAQafTqQ5VFEVdCi0UCk/Q0yGLNptN1el0vqLoaRHUxqPoKY/2KFo0g0r0ba4Wi8WnQEcs2mg0VAPULrJsZTqpNzDZ6yxar9dVl8tFVtR10SnFohJdgnZYuh9IkjSTZfknPn5DviO/kL/IjkgtIOhhJJ7JZF5gdU24hdDG6qqg/QJywEzlmg/FSTLhE4nE9nA4nHJFRvH5fJto94gOBfvyjtJxXI/H4x+A63re6/UUVDCCnzeDz6fbceQscjsWi703wFsM7hDBJQN8PRqNbmNn0OGapu0JfoviYx4PBAL30e5dCg+Hw0Z4e8/wfr/P451QKPRgaRzIFjDdksefsbjdKn5zER6JRMiwuP+3Ne2KB4PBLVVVR1xd+YK2O2bOFYvwd8CHbK/x/J6Zc8Ui/AZmxdtqtdrAwlFLpRLZrS/PYcnkEUuiY7hCS+g5sovT55+Qj7QS/jYD8zjp/UF6t9GS+oPed8zCLC5zJ0tSo//Q+8wKLHTw/ifAAMQVS4vHZR2VAAAAAElFTkSuQmCC) center left 22px no-repeat}:host .lightbox-next{right:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAiCAYAAABbXymAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjEyNDE3MDE1RDgzMTExRTc5NjM4QTIzQzI2Rjc2Qjg2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjEyNDE3MDE2RDgzMTExRTc5NjM4QTIzQzI2Rjc2Qjg2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTI0MTcwMTNEODMxMTFFNzk2MzhBMjNDMjZGNzZCODYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTI0MTcwMTREODMxMTFFNzk2MzhBMjNDMjZGNzZCODYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7zv5BKAAACl0lEQVR42rTW224SQRwGcHZb8FT1Sm88BJCiFAE5JpyCBNRE8coYEy94AGqi9XDXS0+JVh/CB/EhiFET5LjAclgWjaa1aazfJDM6u6LuLjrJl2124cd0duY/I9h+NoELabtcTLcFCon0bw+SRE4h28hn2xyNoIvISrlcfqAoSluSpLepVKqCe6cRB/2MYAXei1wfjUbSLm34gX4ymbyN+z6rOBmC/ciNer3+fpdrwGXgd8h/YwVn8Dm/37/e6/UGOnyQTqfXrOBsKI4g571e76Nutzv8De43gwv05S0hx5CLwJ/iBWrwyWQyzGazpnHyITtyCDlBcI/H8wS4ZlhUVbWMO/R4p9P5Bc/lcnfx/Ow8+AW32z0LH+Xz+X+Dt9ttmcen0ynDA1bx4wR3Op2PW62WrOv5uFAo3JsXL1K8r+v5LNxmZrb8wJvNpn5YlGKxeJ/WFruZBcRPxUsul2u90WhocCyqBqk3dLGJiwbgb/T6FflCSqkoiluCIGjqNGzWgQUz9YR8aQ9yBqtyDQtH0q1KNZPJPMTzOHKA4oaHwuPz+SooUm0eHY/H00QisUEWFHKUDYVRdBmVr9Lv9/WoGo/HX+J5iY7/QSMvj003hnb0aCwWe4HnV5GTyGEj002DDgYDDYqdRo1Goxu0p3pU+BvqDQQCqzPQCUWvzINKejQcDltHQ6HQLaBdHh0Oh5ZRO0OBaFD8iIL7z82ibGtyRyKR1T+gl82g/GZ6Dev/HY/KsqwEg0FLKL/93+R7C3QM9Nk8KDtiOWq12jb2s2XS01Kp9Kparb7G/TfIR2QT2TF6UBS42bBEi/UK/SIBPyCfkC0zKA+z6rWPXm30tLlJr6ZQ/ZmYDYnI1eEdejV9Thb+18H7uwADAOG/Wcm4x+knAAAAAElFTkSuQmCC) center right 22px no-repeat}:host .lightbox-close,:host .lightbox-counter,:host .lightbox-next,:host .lightbox-prev{opacity:0;transition:opacity 150ms cubic-bezier(.475,.105,.445,.945)}"]
})
], LightboxComponent);
export { LightboxComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNyeXN0YWx1aS9hbmd1bGFyLWxpZ2h0Ym94LyIsInNvdXJjZXMiOlsibGliL2xpZ2h0Ym94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdEwsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBUXRFLElBQWEsaUJBQWlCLEdBQTlCLE1BQWEsaUJBQWtCLFNBQVEsdUJBQXVCO0lBZ0gxRCxZQUNZLFVBQXNCLEVBQ3RCLEdBQXNCLEVBQ3ZCLFlBQTBCO1FBQ2pDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUhaLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFqSHJDLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBRTNCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIscUJBQWdCLEdBQVcsR0FBRyxDQUFDO1FBQy9CLGtCQUFhLEdBQVE7WUFDakIsU0FBUyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztRQUNGLDZCQUF3QixHQUFHLElBQUksQ0FBQztRQUNoQyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVTLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDbkIsaUJBQVksR0FBWSxLQUFLLENBQUM7SUF3RzNFLENBQUM7SUFyR0QsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFD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QjtZQUNULFlBQVk7O0FBdkdBO0lBQXBDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQztvREFBNEI7QUFDbkI7SUFBNUMsV0FBVyxDQUFDLDhCQUE4QixDQUFDO3VEQUErQjtBQUNsQztJQUF4QyxXQUFXLENBQUMsMEJBQTBCLENBQUM7d0RBQXdCO0FBRWhFO0lBREMsV0FBVyxDQUFDLDRCQUE0QixDQUFDO21EQUd6QztBQUVvQztJQUFwQyxXQUFXLENBQUMsc0JBQXNCLENBQUM7dURBRW5DO0FBRXFDO0lBQXJDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQzttRUFBa0M7QUFFekI7SUFBN0MsU0FBUyxDQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzt3REFBMkI7QUFDdEI7SUFBakQsU0FBUyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO2dFQUFtQztBQWtEckQ7SUFBOUIsWUFBWSxDQUFDLGVBQWUsQ0FBQztrREFNN0I7QUFHRDtJQURDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2tEQWExQztBQUdEO0lBREMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FEQUd0QztBQUdEO0lBREMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3NEQUt6QztBQTlHUSxpQkFBaUI7SUFON0IsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixvcUNBQXdDOztLQUUzQyxDQUFDO0dBRVcsaUJBQWlCLENBZ1o3QjtTQWhaWSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIEVsZW1lbnRSZWYsIENoYW5nZURldGVjdG9yUmVmLCBDb250ZW50Q2hpbGRyZW4sIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlnaHRib3hEYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFNob3dTdGF0ZSwgQ2xvc2luZ1N0YXRlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBFdmVudFNlcnZpY2UgfSBmcm9tICcuL2V2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTGlnaHRib3hDb21tb25Db21wb25lbnQgfSBmcm9tICcuL2xpZ2h0Ym94LWNvbW1vbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NyeXN0YWwtbGlnaHRib3gnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9saWdodGJveC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY3NzL2xpZ2h0Ym94LmNvbXBvbmVudC5zYXNzJ11cbn0pXG5cbmV4cG9ydCBjbGFzcyBMaWdodGJveENvbXBvbmVudCBleHRlbmRzIExpZ2h0Ym94Q29tbW9uQ29tcG9uZW50IHtcbiAgICBwcmV2SW5kZXg6IG51bWJlcjtcbiAgICBzcGlubmVySGVpZ2h0OiBudW1iZXIgPSAzMDtcbiAgICBpc1pvb21JbjogYm9vbGVhbjtcbiAgICBtaW5UaW1lb3V0OiBudW1iZXIgPSAzMDtcbiAgICBwcmVsb2FkZXJUaW1lb3V0OiBudW1iZXIgPSAxMDA7XG4gICAgc3Bpbm5lclN0eWxlczogYW55ID0ge1xuICAgICAgICB0cmFuc2Zvcm06ICcnXG4gICAgfTtcbiAgICBjb25maWdUaHVtYm5haWxQcmVsb2FkZXIgPSB0cnVlO1xuICAgIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MubGlnaHRib3gtc2hvd24nKSBob3N0U2hvd246IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmxpZ2h0Ym94LWhpZGUtY29udHJvbHMnKSBoaWRlQ29udHJvbHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmxpZ2h0Ym94LWFuaW1hdGlvbicpIGhvc3RBbmltYXRpb246IGJvb2xlYW47XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5saWdodGJveC1zaW1wbGUtbW9kZScpXG4gICAgZ2V0IHNpbXBsZU1vZGUoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5zaW1wbGVNb2RlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MubGlnaHRib3gtbGlnaHQnKSBnZXQgaG9zdExpZ2h0VGhlbWUoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5iYWNrZ3JvdW5kQ29sb3IgPT09ICd3aGl0ZSc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5iYWNrZ3JvdW5kQ29sb3InKSBob3N0U3R5bGVCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcblxuICAgIEBWaWV3Q2hpbGQoJ3ByZXZJbWFnZUVsZW0nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcmV2SW1hZ2VFbGVtOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2xpZ2h0Ym94Q29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSkgbGlnaHRib3hDb250YWluZXJFbGVtOiBFbGVtZW50UmVmO1xuXG4gICAgZ2V0IGN1cnJJbWFnZVBhdGgoKXtcbiAgICAgICAgbGV0IGltYWdlID0gdGhpcy5pbWFnZXNbdGhpcy5pbmRleF07XG4gICAgICAgIGxldCBwYXRoO1xuXG4gICAgICAgIGlmICghaW1hZ2Upe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltYWdlLmZ1bGxJbWFnZSAmJiBpbWFnZS5mdWxsSW1hZ2UucGF0aCl7XG4gICAgICAgICAgICBwYXRoID0gIGltYWdlLmZ1bGxJbWFnZS5wYXRoO1xuICAgICAgICB9IGVsc2UgaWYgKGltYWdlLnRodW1ibmFpbEltYWdlICYmIGltYWdlLnRodW1ibmFpbEltYWdlLnBhdGgpIHtcbiAgICAgICAgICAgIHBhdGggPSBpbWFnZS50aHVtYm5haWxJbWFnZS5wYXRoO1xuICAgICAgICB9IGVsc2UgaWYgKGltYWdlLnBhdGgpe1xuICAgICAgICAgICAgcGF0aCA9IGltYWdlLnBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG5cbiAgICBnZXQgcHJldkltYWdlUGF0aCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbdGhpcy5wcmV2SW5kZXhdO1xuICAgIH1cblxuICAgIHNldCBwcmV2SW1hZ2VQYXRoKHZhbHVlOiBhbnkpe1xuICAgICAgICB0aGlzLmltYWdlc1t0aGlzLnByZXZJbmRleF0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNIaWRkZW5QcmV2QXJyb3coKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNGaXJzdEltYWdlICYmICF0aGlzLnByb3BlcnRpZXMubG9vcCB8fCB0aGlzLmlzWm9vbUluO1xuICAgIH1cbiAgICBnZXQgaXNIaWRkZW5OZXh0QXJyb3coKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMYXN0SW1hZ2UgJiYgIXRoaXMucHJvcGVydGllcy5sb29wIHx8IHRoaXMuaXNab29tSW47XG4gICAgfVxuXG4gICAgZ2V0IGlzUHJlbG9hZGVyKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbk1vZGUgPT09ICd6b29tLXByZWxvYWRlcicgJiYgXG4gICAgICAgICAgIHRoaXMuc2hvd1N0YXRlICE9ICdhbmltYXRpb24tZW5kJyAmJiBcbiAgICAgICAgICAgdGhpcy5jdXJySW1hZ2VMb2FkaW5nU3RhdGUgPT09ICdsb2FkaW5nJztcbiAgICB9XG5cbiAgICBnZXQgaW1hZ2VPcmllbnRhdGlvbigpOid2ZXJ0aWNhbCcgfCAnaG9yaXpvbnRhbCcge1xuICAgICAgICBpZiAodGhpcy50aHVtYm5haWxJbWFnZS5uYXR1cmFsV2lkdGggPiB0aGlzLnRodW1ibmFpbEltYWdlLm5hdHVyYWxIZWlnaHQpe1xuICAgICAgICAgICAgcmV0dXJuICdob3Jpem9udGFsJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAndmVydGljYWwnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcpIHNjcm9sbGluZygpe1xuICAgICAgICBpZiAodGhpcy5zaG93U3RhdGUgPT09ICdpbml0aWFsLXRodW1ibmFpbC1pbWFnZScgfHxcbiAgICAgICAgICAgIHRoaXMuc2hvd1N0YXRlID09PSAnaW5pdGlhbC12aXJ0dWFsLWltYWdlJyB8fFxuICAgICAgICAgICAgdGhpcy5jbG9zaW5nU3RhdGUgPT09ICdhbmltYXRpb24nKXtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGh1bWJuYWlsUG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBvbktleURvd24oZXZlbnQ6IGFueSkge1xuICAgICAgICBzd2l0Y2goZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICAgICAgICAgIHRoaXMucHJldigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VMaWdodGJveCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgWyckZXZlbnQnXSlcbiAgICBvbk1vdXNlRW50ZXIoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmhpZGVDb250cm9scyA9IGZhbHNlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBbJyRldmVudCddKVxuICAgIHRyYW5zaXRpb25FbmQoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnByb3BlcnR5TmFtZSA9PT0gXCJ0cmFuc2Zvcm1cIiAmJiB0aGlzLmhvc3RBbmltYXRpb24pe1xuICAgICAgICAgICAgdGhpcy5ob3N0QW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBcbiAgICAgICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwdWJsaWMgZXZlbnRTZXJ2aWNlOiBFdmVudFNlcnZpY2Upe1xuICAgICAgICBzdXBlcihldmVudFNlcnZpY2UpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCl7XG4gICAgICAgIHRoaXMuY3VycmVudEltYWdlSW5kZXggPSB0aGlzLnByb3BlcnRpZXMuaW5kZXg7XG4gICAgICAgIHRoaXMuaW5pdGlhbExpZ2h0Ym94KCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJJbWFnZUxvYWRpbmdTdGF0ZSA9PT0gJ25vdC1sb2FkZWQnKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZUxvYWRpbmdTdGF0ZSA9ICdsb2FkaW5nJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5wcmVsb2FkZXJUaW1lb3V0KTtcblxuICAgICAgICAvLyBNb2RlOiBkZWZhdWx0XG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGlvbk1vZGUgPT09ICdkZWZhdWx0Jyl7IFxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93TGlnaHRib3hBbmltYXRpb24oKTtcbiAgICAgICAgICAgIH0sIHRoaXMubWluVGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkltYWdlTG9hZGVkKCl7XG4gICAgICAgIC8vIFdoZW4gb3BlbmluZyBsaWdodGJveFxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb25Nb2RlID09PSAnem9vbS1wcmVsb2FkZXInICYmIFxuICAgICAgICAgICAgdGhpcy5zaG93U3RhdGUgPT09ICdpbml0aWFsLXRodW1ibmFpbC1pbWFnZScpe1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsTGlnaHRib3hWaXJ0dWFsSW1hZ2UoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlTG9hZGluZ1N0YXRlID0gJ3VwbG9hZGVkJztcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dMaWdodGJveEFuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMuaGlkZVRodW1ibmFpbCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZVRodW1ibmFpbEltYWdlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdGhpcy5taW5UaW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdoZW4gb3BlbmluZyBuZXh0IC8gcHJldmlvdXMgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMuc2hvd1N0YXRlID09PSAnYW5pbWF0aW9uLWVuZCcpe1xuICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2VMb2FkaW5nU3RhdGUgPSAndXBsb2FkZWQnO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5oaWRlVGh1bWJuYWlsKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVUaHVtYm5haWxJbWFnZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIG9uSW1hZ2VFcnJvcihldmVudCl7XG4gICAgICAgIHRoaXMuY3VyckltYWdlTG9hZGluZ1N0YXRlID0gJ2Vycm9yJztcbiAgICAgICAgdGhpcy5pbml0aWFsTGlnaHRib3hEZWZhdWx0KCk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dMaWdodGJveEFuaW1hdGlvbigpO1xuICAgICAgICB9LCB0aGlzLm1pblRpbWVvdXQpO1xuICAgIH1cblxuICAgIG9uQ29udGFpbmVyQ2xpY2soZXZlbnQpe1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLmxpZ2h0Ym94Q29udGFpbmVyRWxlbS5uYXRpdmVFbGVtZW50IHx8IHRoaXMuc2ltcGxlTW9kZSl7XG4gICAgICAgICAgICB0aGlzLmNsb3NlTGlnaHRib3goKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRpYWxMaWdodGJveCgpe1xuICAgICAgICB0aGlzLnNldE1heERpbWVuc2lvbnMoKTtcbiAgICAgICAgdGhpcy5zZXRBbmltYXRpb25EdXJhdGlvbigpO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5hbmltYXRpb25Nb2RlKSB7XG4gICAgICAgICAgICBjYXNlICd6b29tLXByZWxvYWRlcic6XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsTGlnaHRib3hUaHVtYm5haWxJbWFnZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGVmYXVsdCc6XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsTGlnaHRib3hEZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0aWFsTGlnaHRib3hEZWZhdWx0KCl7XG4gICAgICAgIHRoaXMuc2hvd1N0YXRlID0gJ2luaXRpYWwtZGVmYXVsdCc7XG4gICAgICAgIHRoaXMuY29udGFpbmVyU3R5bGVzID0ge1xuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgb3BhY2l0eTogJzAnXG4gICAgICAgIH1cbiAgICAgICAgLy8gbmV4dCBzdGVwOiBBZnRlclZpZXdJbml0XG4gICAgfVxuXG4gICAgaW5pdGlhbExpZ2h0Ym94VmlydHVhbEltYWdlKCl7XG4gICAgICAgIHRoaXMuc2V0U2hvd1N0YXRlKCdpbml0aWFsLXZpcnR1YWwtaW1hZ2UnKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJTdHlsZXMgPSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMuY29udGFpbmVySW5pdGlhbFBvc2l0aW9uLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnZpcnR1YWxJbWFnZURpbWVuc2lvbi5oZWlnaHQgKyAncHgnLFxuICAgICAgICAgICAgd2lkdGg6IHRoaXMudmlydHVhbEltYWdlRGltZW5zaW9uLndpZHRoICsgJ3B4J1xuICAgICAgICB9XG4gICAgICAgIC8vIG5leHQgc3RlcDogb25JbWFnZUxvYWRlZCgpIC0+IHNob3dMaWdodGJveEFuaW1hdGlvbigpXG4gICAgfVxuXG4gICAgaW5pdGlhbExpZ2h0Ym94VGh1bWJuYWlsSW1hZ2UoKXtcbiAgICAgICAgdGhpcy5zZXRTaG93U3RhdGUoJ2luaXRpYWwtdGh1bWJuYWlsLWltYWdlJyk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyU3R5bGVzID0ge1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLmNvbnRhaW5lckluaXRpYWxQb3NpdGlvbixcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy50aHVtYm5haWxJbWFnZVBvc2l0aW9uLmhlaWdodCArICdweCcsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy50aHVtYm5haWxJbWFnZVBvc2l0aW9uLndpZHRoICsgJ3B4J1xuICAgICAgICB9XG4gICAgICAgIC8vIG5leHQgc3RlcDogb25JbWFnZUxvYWRlZCgpXG4gICAgfVxuXG4gICAgc2hvd0xpZ2h0Ym94QW5pbWF0aW9uKCl7XG4gICAgICAgIHRoaXMuaG9zdEFuaW1hdGlvbiA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0U2hvd1N0YXRlKCdhbmltYXRpb24nKTtcbiAgICAgICAgdGhpcy5ob3N0U2hvd24gPSB0cnVlO1xuICAgICAgICB0aGlzLnNldEJhY2tncm91bmRDb2xvcigpO1xuICAgICAgICB0aGlzLnNldEFuaW1hdGlvbkR1cmF0aW9uKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBNb2RlOiB6b29tIHByZWxvYWRlclxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb25Nb2RlID09PSAnem9vbS1wcmVsb2FkZXInICYmXG4gICAgICAgICAgICB0aGlzLmN1cnJJbWFnZUxvYWRpbmdTdGF0ZSAhPT0gJ2Vycm9yJyl7IFxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJTdHlsZXMudHJhbnNmb3JtID0gdGhpcy5jb250YWluZXJGdWxsc2NyZWVuUG9zaXRpb247XG4gICAgICAgIH0gXG5cbiAgICAgICAgLy8gTW9kZTogZGVmYXVsdFxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb25Nb2RlID09PSAnZGVmYXVsdCcpe1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJTdHlsZXMub3BhY2l0eSA9ICcxJztcbiAgICAgICAgfVxuICAgICAgICAvLyBuZXh0IHN0ZXA6IGhhbmRsZUxpZ2h0Ym94VHJhbnNpdGlvbkVuZFxuICAgIH1cblxuICAgIHNob3dMaWdodGJveEFuaW1hdGlvbkVuZCgpe1xuICAgICAgICB0aGlzLnNldFNob3dTdGF0ZSgnYW5pbWF0aW9uLWVuZCcpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclN0eWxlcyA9IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsb3NlTGlnaHRib3goKXtcbiAgICAgICAgdGhpcy5zZXRDbG9zaW5nU3RhdGUoJ2luaXRpYWwnKTtcbiAgICAgICAgdGhpcy5ob3N0U2hvd24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbG9zZUxpZ2h0Ym94SW5pdGlhbCgpO1xuICAgIH1cblxuICAgIGNsb3NlTGlnaHRib3hJbml0aWFsKCl7XG4gICAgICAgIHRoaXMuc2V0Q2xvc2luZ1N0YXRlKCdpbml0aWFsLXN0eWxlcycpO1xuXG4gICAgICAgIC8vIE1vZGU6IHpvb20gcHJlbG9hZGVyXG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGlvbk1vZGUgPT09ICd6b29tLXByZWxvYWRlcicpe1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJTdHlsZXMgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLmNvbnRhaW5lckZ1bGxzY3JlZW5Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMudmlydHVhbEltYWdlRGltZW5zaW9uLmhlaWdodCArICdweCcsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMudmlydHVhbEltYWdlRGltZW5zaW9uLndpZHRoICsgJ3B4JyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vZGU6IGRlZmF1bHRcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uTW9kZSA9PT0gJ2RlZmF1bHQnKXtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyU3R5bGVzLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VMaWdodGJveEFuaW1hdGlvbigpO1xuICAgICAgICB9LCB0aGlzLm1pblRpbWVvdXQpO1xuICAgIH1cblxuICAgIGNsb3NlTGlnaHRib3hBbmltYXRpb24oKXtcbiAgICAgICAgdGhpcy5zZXRDbG9zaW5nU3RhdGUoJ2FuaW1hdGlvbicpO1xuXG4gICAgICAgIC8vIE1vZGU6IHpvb20gcHJlbG9hZGVyXG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGlvbk1vZGUgPT09ICd6b29tLXByZWxvYWRlcicpe1xuICAgICAgICAgICAgdGhpcy5ob3N0QW5pbWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyU3R5bGVzID0ge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy5jb250YWluZXJJbml0aWFsUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmdldENvbnRhaW5lckhlaWdodCgpLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLmdldENvbnRhaW5lcldpZHRoKCksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaG9zdFN0eWxlQmFja2dyb3VuZENvbG9yID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb2RlOiBkZWZhdWx0XG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGlvbk1vZGUgPT09ICdkZWZhdWx0Jyl7XG4gICAgICAgICAgICB0aGlzLmhvc3RBbmltYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJTdHlsZXMub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIHRoaXMuaG9zdFN0eWxlQmFja2dyb3VuZENvbG9yID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldEFuaW1hdGlvbkR1cmF0aW9uKCk7XG4gICAgICAgIC8vIG5leHQgc3RlcDogaGFuZGxlTGlnaHRib3hUcmFuc2l0aW9uRW5kXG5cbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uRHVyYXRpb24gPT09IDApeyAvLyBpbiB0aGUgZnV0dXJlLCBjaGFuZ2UgdG8gYSB0eXBlIGNvbnZlcnNpb24gZ2V0dGVyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTGlnaHRib3hBbmltYXRpb25FbmQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsb3NlTGlnaHRib3hBbmltYXRpb25FbmQoKXtcbiAgICAgICAgdGhpcy5zZXRDbG9zaW5nU3RhdGUoJ2FuaW1hdGlvbi1lbmQnKTtcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdCh7dHlwZTogJ2Nsb3NlJ30pO1xuXG4gICAgICAgIC8vIE1vZGU6IHpvb20gcHJlbG9hZGVyXG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGlvbk1vZGUgPT09ICd6b29tLXByZWxvYWRlcicpe1xuICAgICAgICAgICAgdGhpcy5zaG93VGh1bWJuYWlsSW1hZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogVHJhbnNpdGlvbiBFbmRcbiAgICAgKi9cblxuICAgIGhhbmRsZUxpZ2h0Ym94VHJhbnNpdGlvbkVuZChldmVudCl7XG4gICAgICAgIGlmICh0aGlzLnNob3dTdGF0ZSA9PT0gJ2FuaW1hdGlvbicpe1xuICAgICAgICAgICAgdGhpcy5zaG93TGlnaHRib3hBbmltYXRpb25FbmQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExhc3QgY2xvc2Ugc3RlcFxuICAgICAgICBpZiAodGhpcy5jbG9zaW5nU3RhdGUgPT09ICdhbmltYXRpb24nKXtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VMaWdodGJveEFuaW1hdGlvbkVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmV4dCgpe1xuICAgICAgICBpZiAodGhpcy5hbmltYXRpb25Nb2RlID09PSAnem9vbS1wcmVsb2FkZXInKXtcbiAgICAgICAgICAgIHRoaXMuc2hvd1RodW1ibmFpbEltYWdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0xhc3RJbWFnZSl7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmxvb3Ape1xuICAgICA