UNPKG

ngx-crystal-gallery

Version:

Responsive gallery with support for masonry layout and lightbox.

1,206 lines 134 kB
import { Component, Input, EventEmitter, HostBinding, HostListener, ViewChild, ElementRef, ChangeDetectorRef, Injectable, Injector, ComponentFactoryResolver, ApplicationRef, Output, Directive, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class LightboxComponent {
    /**
     * @param {?} elementRef
     * @param {?} ref
     */
    constructor(elementRef, ref) {
        this.elementRef = elementRef;
        this.ref = ref;
        this.currentImageIndex = 0;
        this.spinnerHeight = 30;
        this.descriptionHeight = 43;
        this.close = new EventEmitter();
        this.showLightbox = false;
        this.hideControls = false;
    }
    /**
     * @return {?}
     */
    get images() {
        return this.data.images;
    }
    /**
     * @return {?}
     */
    get config() {
        return this.data.config;
    }
    /**
     * @return {?}
     */
    get index() {
        return this.currentImageIndex;
    }
    /**
     * @return {?}
     */
    get currImagePath() {
        /** @type {?} */
        let image = this.images[this.index];
        if (!image) {
            return false;
        }
        if (image.path) {
            image.full = image.path;
        }
        return image;
    }
    /**
     * @return {?}
     */
    get prevImagePath() {
        return this.images[this.prevIndex];
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set prevImagePath(value) {
        this.images[this.prevIndex] = value;
    }
    /**
     * @return {?}
     */
    get isFirst() {
        return this.index === 0;
    }
    /**
     * @return {?}
     */
    get isLast() {
        return this.index === (this.images.length - 1);
    }
    /**
     * @return {?}
     */
    get latestImageIndex() {
        return this.images.length - 1;
    }
    /**
     * @return {?}
     */
    get description() {
        return this.images[this.index].description;
    }
    /**
     * @return {?}
     */
    get counter() {
        return this.currentImageIndex + 1 + '/' + this.images.length;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onKeyDown(event) {
        switch (event.key) {
            case 'ArrowLeft':
                this.prev();
                break;
            case 'ArrowRight':
                this.next();
                break;
            case 'Escape':
                this.closeLightbox();
                break;
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onMouseEnter(event) {
        this.hideControls = false;
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.setBackgroundOpacity(this.config.backgroundOpacity);
        this.currentImageIndex = this.config.index;
        //document.body.style.overflow = 'hidden';
        setTimeout(() => {
            this.showLightbox = true;
        }, 30);
        this.setMaxDimensions();
        this.setAnimationDuration();
    }
    /**
     * @return {?}
     */
    closeLightbox() {
        this.showLightbox = false;
        setTimeout(() => {
            this.close.emit('close');
            //document.body.style.overflow = '';
        }, this.config.animationDuration);
    }
    /**
     * @return {?}
     */
    next() {
        if (this.isLast) {
            if (this.config.loop) {
                this.currentImageIndex = 0;
            }
            else {
                return;
            }
        }
        else {
            this.currentImageIndex++;
        }
        this.currImageLoaded = 'loading';
        setTimeout(() => {
            if (this.currImageLoaded === 'loading') {
                this.currImageLoaded = false;
            }
        }, 50);
        this.setMaxDimensions();
    }
    /**
     * @return {?}
     */
    prev() {
        if (this.isFirst) {
            if (this.config.loop) {
                this.currentImageIndex = this.latestImageIndex;
            }
            else {
                return;
            }
        }
        else {
            this.currentImageIndex--;
        }
        setTimeout(() => {
            if (this.currImageLoaded === 'loading') {
                this.currImageLoaded = false;
            }
        }, 50);
        this.setMaxDimensions();
    }
    /**
     * @return {?}
     */
    onImageLoaded() {
        this.currImageLoaded = true;
        this.ref.detectChanges();
    }
    /**
     * @param {?} opacity
     * @return {?}
     */
    setBackgroundOpacity(opacity) {
        this.hostStyleBackgroundColor = 'rgba(0, 0, 0, ' + opacity + ')';
    }
    /**
     * @return {?}
     */
    setMaxDimensions() {
        if (this.description) {
            this.wrapperElem.nativeElement.style.height = 'calc(100% - ' + (this.descriptionHeight * 2) + 'px)';
        }
        else {
            this.wrapperElem.nativeElement.style.height = '';
        }
        this.currImageElem.nativeElement.style.maxHeight = 'calc(' + this.config.lightboxMaxHeight + ')';
        this.currImageElem.nativeElement.style.maxWidth = this.config.lightboxMaxWidth;
    }
    /**
     * @return {?}
     */
    setAnimationDuration() {
        this.hostStyleTransition = 'opacity ' + this.config.animationDuration + 'ms';
    }
}
LightboxComponent.decorators = [
    { type: Component, args: [{
                selector: 'crystal-lightbox',
                template: `<div class="cg-counter" *ngIf="config.counter && images.length > 1">{{counter}}</div>
<div class="cg-description" *ngIf="description">{{description}}</div>

<div 
	class="cg-close" 
	(click)="closeLightbox()">Close</div>

<div 
	class="cg-spinner" 
	 *ngIf="!currImageLoaded"></div>

<div class="cg-wrapper" #wrapper>
	<img 
		class="cg-curr-image" 
		#currImageElem 
		[src]="currImagePath?.full" 
		[class.cg-show]="currImageLoaded" 
		(load)="onImageLoaded()" />
</div>

<div 
	class="cg-prev" 
	[hidden]="isFirst && !config.loop" 
	(click)="prev()"></div>
<div 
	class="cg-next" 
	[hidden]="isLast && !config.loop" 
	(click)="next()"></div>`,
                styles: [`._cg-spinner,._cg-spinner:after{border-radius:50%;width:36px;height:36px}._cg-spinner{margin:0 auto;font-size:10px;position:relative;text-indent:-9999em;border-top:4px solid rgba(255,255,255,.2);border-right:4px solid rgba(255,255,255,.2);border-bottom:4px solid rgba(255,255,255,.2);border-left:4px solid #fff;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:.9s linear infinite load8;animation:.9s linear infinite load8}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cg-spinner,.cg-spinner:after,.cg-spinner:before{border-radius:50%;width:10px;height:10px;-webkit-animation:1.5s ease-in-out infinite load7;animation:1.5s ease-in-out infinite load7}.cg-spinner{color:#fff;font-size:10px;margin:0 auto 20px;position:relative;text-indent:-9999em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation-delay:-.16s;animation-delay:-.16s}.cg-spinner:after,.cg-spinner:before{content:"";position:absolute;top:0}.cg-spinner:before{left:-3em;-webkit-animation-delay:-.32s;animation-delay:-.32s}.cg-spinner:after{left:3em}@-webkit-keyframes load7{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes load7{0%,100%,80%{box-shadow:0 10px 0 -1.3em}40%{box-shadow:0 10px 0 0}}:host(.cg-show){opacity:1}:host(.cg-hide-controls) .cg-close,:host(.cg-hide-controls) .cg-next,:host(.cg-hide-controls) .cg-prev{opacity:0}:host{opacity:0;position:fixed;top:0;left:0;width:100%;height:100%;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:opacity .1s cubic-bezier(.645,.045,.355,1);z-index:10000;background-color:rgba(0,0,0,.85)}:host img{opacity:1;max-width:100%;max-height:100%;box-shadow:0 4px 15px 2px rgba(0,0,0,.35)}:host img.cg-curr-image.cg-show{opacity:1}:host img.cg-curr-image{opacity:0;z-index:10}:host .cg-wrapper.cg-hide{display:none}:host .cg-wrapper{display:flex;align-items:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;top:0;left:0;width:100%;height:100%}:host .cg-spinner{position:absolute;top:50%;left:50%;margin-top:-15px;margin-left:-5px}:host .cg-counter{text-align:left;position:absolute;left:22px;top:13px;font-size:14px;text-shadow:0 0 1px rgba(0,0,0,.65);z-index:30}:host .cg-description{text-align:center;max-width:calc(100% - 200px);margin:0 auto;font-size:14px;line-height:43px;position:relative;z-index:50}:host .cg-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;text-shadow:0 0 1px rgba(0,0,0,.65)}:host .cg-close:hover{opacity:1}:host .cg-next,:host .cg-prev{width:40%;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 .cg-next:hover,:host .cg-prev:hover{opacity:1}:host .cg-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 .cg-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}`]
            },] },
];
/** @nocollapse */
LightboxComponent.ctorParameters = () => [
    { type: ElementRef },
    { type: ChangeDetectorRef }
];
LightboxComponent.propDecorators = {
    data: [{ type: Input }],
    showLightbox: [{ type: HostBinding, args: ['class.cg-show',] }],
    hideControls: [{ type: HostBinding, args: ['class.cg-hide-controls',] }],
    hostStyleTransition: [{ type: HostBinding, args: ['style.transition',] }],
    hostStyleBackgroundColor: [{ type: HostBinding, args: ['style.backgroundColor',] }],
    currImageElem: [{ type: ViewChild, args: ['currImageElem',] }],
    prevImageElem: [{ type: ViewChild, args: ['prevImageElem',] }],
    wrapperElem: [{ type: ViewChild, args: ['wrapper',] }],
    onKeyDown: [{ type: HostListener, args: ['window:keydown', ['$event'],] }],
    onMouseEnter: [{ type: HostListener, args: ["mouseenter", ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class LightboxMobileComponent {
    /**
     * @param {?} elementRef
     * @param {?} ref
     */
    constructor(elementRef, ref) {
        this.elementRef = elementRef;
        this.ref = ref;
        this.currImage = {
            show: false,
            loaded: false,
            index: 0
        };
        this.prevImage = {
            loaded: false
        };
        this.nextImage = {
            loaded: false
        };
        this.close = new EventEmitter();
        this.lightboxShown = false;
    }
    /**
     * @return {?}
     */
    get images() {
        return this.data.images;
    }
    /**
     * @return {?}
     */
    get config() {
        return this.data.config;
    }
    /**
     * @return {?}
     */
    get index() {
        return this.currImage.index;
    }
    /**
     * @return {?}
     */
    get currImagePath() {
        /** @type {?} */
        let image = this.images[this.index];
        if (!image) {
            return false;
        }
        if (image.path) {
            image.full = image.path;
        }
        return image;
    }
    /**
     * @return {?}
     */
    get prevImagePath() {
        if (this.prevIndex < 0 && this.config.loop) {
            this.prevIndex = this.latestImageIndex;
        }
        /** @type {?} */
        let image = this.images[this.prevIndex];
        if (image && image.path) {
            image.full = image.path;
        }
        return image;
    }
    /**
     * @return {?}
     */
    get nextImagePath() {
        /** @type {?} */
        let image = this.images[this.nextIndex];
        if (image && image.path) {
            image.full = image.path;
        }
        return image;
    }
    /**
     * @return {?}
     */
    get isFirst() {
        if (this.config.loop) {
            return false;
        }
        else {
            return this.index === 0;
        }
    }
    /**
     * @return {?}
     */
    get isLast() {
        if (this.config.loop) {
            return false;
        }
        else {
            return this.index === this.latestImageIndex;
        }
    }
    /**
     * @return {?}
     */
    get latestImageIndex() {
        return this.images.length - 1;
    }
    /**
     * @return {?}
     */
    get isLandscape() {
        return window.innerWidth > window.innerHeight;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    onWindowResize(event) {
        this.landscapeMode = this.isLandscape;
        this.ref.detectChanges();
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.currImage.index = this.config.index;
        this.prevIndex = this.currImage.index - 1;
        this.nextIndex = this.currImage.index + 1;
        this.showLightbox();
    }
    /**
     * @return {?}
     */
    showLightbox() {
        this.currImage.show = true;
        setTimeout(() => {
            this.lightboxShown = true;
        }, 30);
    }
    /**
     * @return {?}
     */
    closeLightbox() {
        this.lightboxShown = false;
        setTimeout(() => {
            this.close.emit(true);
        }, 200);
    }
    /**
     * @param {?} event
     * @return {?}
     */
    slide(event) {
        if (event === 'next') {
            if (this.isLast) {
                return;
            }
            else {
                setTimeout(() => {
                    this.currImage.index++;
                }, 200);
            }
            if (this.index === this.latestImageIndex) {
                setTimeout(() => {
                    this.currImage.index = 0;
                }, 200);
            }
            setTimeout(() => {
                this.afterSlide('next');
            }, 300);
        }
        if (event === 'prev') {
            if (this.isFirst) {
                return;
            }
            else {
                setTimeout(() => {
                    this.currImage.index--;
                }, 200);
            }
            if (this.index === 0) {
                setTimeout(() => {
                    this.currImage.index = this.latestImageIndex;
                }, 200);
            }
            setTimeout(() => {
                this.afterSlide('prev');
            }, 300);
        }
    }
    /**
     * @param {?} eventType
     * @return {?}
     */
    afterSlide(eventType) {
        this.currImage.show = true;
        if (this.index === this.latestImageIndex && this.config.loop) {
            this.nextIndex = 0;
        }
        else {
            this.nextIndex = this.index + 1;
        }
        if (this.index === 0 && this.config.loop) {
            this.prevIndex = this.latestImageIndex;
        }
        else {
            this.prevIndex = this.index - 1;
        }
        if (eventType === 'prev') {
            if (!this.prevImage.loaded) {
                this.currImage.loaded = false;
                this.prevImage.loaded = false;
            }
            if (!this.currImage.loaded) {
                this.nextImage.loaded = false;
            }
        }
        if (eventType === 'next') {
            if (!this.nextImage.loaded) {
                this.currImage.loaded = false;
                this.nextImage.loaded = false;
            }
            if (!this.currImage.loaded) {
                this.prevImage.loaded = false;
            }
        }
        this.defaultWrapperPosition();
        this.ref.detectChanges();
    }
    /**
     * @param {?} elem
     * @return {?}
     */
    onImageLoaded(elem) {
        this[elem].loaded = true;
        this.ref.detectChanges();
    }
    /**
     * @param {?} $event
     * @return {?}
     */
    handlePinchEvents($event) {
        if ($event === 'prev') {
            this.slide('prev');
        }
        if ($event === 'next') {
            this.slide('next');
        }
    }
    /**
     * @return {?}
     */
    defaultWrapperPosition() {
        /** @type {?} */
        let elem = this.wrapperEl.nativeElement;
        elem.style.transition = 'all 0ms';
        elem.style.transform = 'matrix(1, 0, 0, 1, 0, 0)';
        elem.style.webkitTransform = 'matrix(1, 0, 0, 1, 0, 0)';
    }
}
LightboxMobileComponent.decorators = [
    { type: Component, args: [{
                selector: 'crystal-lightbox-mobile',
                template: `<div class="cg-back" (click)="closeLightbox()"></div>

<div 
	class="cg-wrapper" 
	[class.cg-landscape]="landscapeMode"
	pinch [isLast]="isLast" [isFirst]="isFirst" (events)="handlePinchEvents($event)"
	#wrapper>
	<div class="cg-image-wrap cg-prev-image">
		<img 
			*ngIf="prevImagePath"
			[src]="prevImagePath.full" 
			[class.cg-hide]="!prevImage.loaded"
			(load)="onImageLoaded('prevImage')"
		/>
		<div class="cg-spinner" *ngIf="!prevImage.loaded && prevImagePath"></div>
	</div>

	<div class="cg-image-wrap cg-curr-image" *ngIf="currImage.show">
		<img 
			[src]="currImagePath?.full" 
			[class.cg-hide]="!currImage.loaded" 
			(load)="onImageLoaded('currImage')"
		/>
		<div class="cg-spinner" *ngIf="!currImage.loaded"></div>
	</div>
	
	<div class="cg-image-wrap cg-next-image">
		<img 
			*ngIf="nextImagePath"
			[src]="nextImagePath.full" 
			[class.cg-hide]="!nextImage.loaded" 
			(load)="onImageLoaded('nextImage')"
		/>
		<div class="cg-spinner" *ngIf="!nextImage.loaded && nextImagePath"></div>
	</div>
</div>`,
                styles: [`._cg-spinner,._cg-spinner:after{border-radius:50%;width:36px;height:36px}._cg-spinner{margin:0 auto;font-size:10px;position:relative;text-indent:-9999em;border-top:4px solid rgba(255,255,255,.2);border-right:4px solid rgba(255,255,255,.2);border-bottom:4px solid rgba(255,255,255,.2);border-left:4px solid #fff;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:.9s linear infinite load8;animation:.9s linear infinite load8}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cg-spinner,.cg-spinner:after,.cg-spinner:before{border-radius:50%;width:10px;height:10px;-webkit-animation:1.5s ease-in-out infinite load7;animation:1.5s ease-in-out infinite load7}.cg-spinner{color:#fff;font-size:10px;margin:0 auto 20px;position:relative;text-indent:-9999em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation-delay:-.16s;animation-delay:-.16s}.cg-spinner:after,.cg-spinner:before{content:"";position:absolute;top:0}.cg-spinner:before{left:-3em;-webkit-animation-delay:-.32s;animation-delay:-.32s}.cg-spinner:after{left:3em}@-webkit-keyframes load7{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@keyframes load7{0%,100%,80%{box-shadow:0 10px 0 -1.3em}40%{box-shadow:0 10px 0 0}}:host(.cg-show){opacity:1}:host(.cg-hide-controls) .cg-close,:host(.cg-hide-controls) .cg-next,:host(.cg-hide-controls) .cg-prev{opacity:0}:host{opacity:0;position:fixed;top:0;left:0;width:100%;height:100%;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:opacity .2s cubic-bezier(.645,.045,.355,1);z-index:10000;background-color:#000}:host .cg-back{background:url("data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22UTF-8%22%3F%3E%3Csvg width%3D%2210px%22 height%3D%2216px%22 viewBox%3D%220 0 10 16%22 version%3D%221.1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E    %3C!-- Generator%3A sketchtool 40.2 (33826) - http%3A%2F%2Fwww.bohemiancoding.com%2Fsketch --%3E    %3Ctitle%3E11A73872-5EBF-46F6-B7C5-142D47A33339%3C%2Ftitle%3E    %3Cdesc%3ECreated with sketchtool.%3C%2Fdesc%3E    %3Cdefs%3E%3C%2Fdefs%3E    %3Cg id%3D%22Interface-1280-x-800%22 stroke%3D%22none%22 stroke-width%3D%221%22 fill%3D%22none%22 fill-rule%3D%22evenodd%22%3E        %3Cg id%3D%22Lot_viewpage_open%22 transform%3D%22translate(-111.000000%2C -296.000000)%22 fill%3D%22%23FFFFFF%22%3E            %3Cg id%3D%22arrows-16px-1_minimal-left%22 transform%3D%22translate(111.000000%2C 296.000000)%22%3E                %3Cpolygon id%3D%22Shape%22 points%3D%228.1 15.7 0.4 8 8.1 0.3 9.6 1.7 3.3 8 9.6 14.3%22%3E%3C%2Fpolygon%3E            %3C%2Fg%3E        %3C%2Fg%3E    %3C%2Fg%3E%3C%2Fsvg%3E") center/12px no-repeat;width:40px;height:40px;opacity:.9;position:fixed;top:0;left:0;z-index:1000}:host .cg-wrapper.cg-landscape .cg-image-wrap img{height:100%}:host .cg-wrapper{transition:none;width:100%;height:100%;display:block}:host .cg-wrapper .cg-image-wrap.cg-prev-image{-webkit-transform:translate3d(calc(-100% - 8px),0,0);transform:translate3d(calc(-100% - 8px),0,0)}:host .cg-wrapper .cg-image-wrap.cg-next-image{-webkit-transform:translate3d(calc(100% + 8px),0,0);transform:translate3d(calc(100% + 8px),0,0)}:host .cg-wrapper .cg-image-wrap{width:100%;height:100%;text-align:center;position:absolute;display:flex;align-items:center;justify-content:center}:host .cg-wrapper .cg-image-wrap img{max-width:100%;max-height:100%;width:auto;height:auto;position:relative}:host .cg-wrapper .cg-image-wrap img.cg-hide{display:none}`]
            },] },
];
/** @nocollapse */
LightboxMobileComponent.ctorParameters = () => [
    { type: ElementRef },
    { type: ChangeDetectorRef }
];
LightboxMobileComponent.propDecorators = {
    data: [{ type: Input }],
    wrapperEl: [{ type: ViewChild, args: ['wrapper',] }],
    lightboxShown: [{ type: HostBinding, args: ['class.cg-show',] }],
    onWindowResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
/** @type {?} */
const defaultConfig = {
    masonry: true,
    masonryMaxHeight: 200,
    masonryGutter: 4,
    loop: false,
    index: 0,
    backgroundOpacity: 0.85,
    counter: false,
    lightboxMaxHeight: "100%",
    lightboxMaxWidth: "100%",
    animationDuration: 100
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CrystalLightbox {
    /**
     * @param {?} componentFactoryResolver
     * @param {?} appRef
     * @param {?} injector
     */
    constructor(componentFactoryResolver, appRef, injector) {
        this.componentFactoryResolver = componentFactoryResolver;
        this.appRef = appRef;
        this.injector = injector;
    }
    /**
     * @return {?}
     */
    get isMobile() {
        /** @type {?} */
        var check = false;
        (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)))
            check = true; })(navigator.userAgent || navigator.vendor);
        return check;
    }
    ;
    /**
     * @param {?} component
     * @param {?} data
     * @return {?}
     */
    appendComponentToBody(component, data) {
        /** @type {?} */
        const componentRef = this.componentFactoryResolver
            .resolveComponentFactory(component)
            .create(this.injector);
        (/** @type {?} */ (componentRef.instance)).data = data;
        this.appRef.attachView(componentRef.hostView);
        /** @type {?} */
        const domElem = /** @type {?} */ ((/** @type {?} */ (componentRef.hostView)).rootNodes[0]);
        document.body.appendChild(domElem);
        (/** @type {?} */ (componentRef.instance)).close.subscribe(() => {
            this.appRef.detachView(componentRef.hostView);
            componentRef.destroy();
        });
    }
    /**
     * @param {?} images
     * @param {?=} config
     * @return {?}
     */
    open(images, config = {}) {
        config = this.applyConfigDefaults(defaultConfig, config);
        /** @type {?} */
        let data = {
            images,
            config
        };
        /** @type {?} */
        let component = this.getLightboxComponent();
        this.appendComponentToBody(component, data);
    }
    /**
     * @return {?}
     */
    getLightboxComponent() {
        return !this.isMobile ? LightboxComponent : LightboxMobileComponent;
    }
    /**
     * @param {?} defaultConfig
     * @param {?} config
     * @return {?}
     */
    applyConfigDefaults(defaultConfig$$1, config) {
        if (!config.index) {
            config.index = 0;
        }
        return Object.assign(defaultConfig$$1, config);
    }
}
CrystalLightbox.decorators = [
    { type: Injectable },
];
/** @nocollapse */
CrystalLightbox.ctorParameters = () => [
    { type: ComponentFactoryResolver },
    { type: ApplicationRef },
    { type: Injector }
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class GalleryComponent {
    /**
     * @param {?} lightbox
     * @param {?} elementRef
     */
    constructor(lightbox, elementRef) {
        this.lightbox = lightbox;
        this.elementRef = elementRef;
        this.config = {};
    }
    /**
     * @return {?}
     */
    get isNgContent() {
        return this.contentWrapper.nativeElement.children.length > 0;
    }
    /**
     * @return {?}
     */
    get masonryState() {
        return this.config.masonry;
    }
    /**
     * @return {?}
     */
    get masonryMaxHeight() {
        return this.config.masonryMaxHeight;
    }
    /**
     * @return {?}
     */
    get masonryGutter() {
        return this.config.masonryGutter;
    }
    /**
     * @param {?} images
     * @param {?} i
     * @return {?}
     */
    showLightbox(images, i) {
        this.config.index = i;
        this.lightbox.open(images, this.config);
    }
    /**
     * @param {?} event
     * @return {?}
     */
    handleMasonryLayoutEvents(event) {
        this.showLightbox(this.images, event.index);
    }
}
GalleryComponent.decorators = [
    { type: Component, args: [{
                selector: 'crystal-gallery',
                template: `<div #contentWrapper [hidden]="isNgContent">
    <ng-content></ng-content>
</div>

<masonry-layout 
    class="cg-wrapper"
    *ngIf="!isNgContent" 

    [max-height]="masonryMaxHeight" 
    [gutter]="masonryGutter"
    [masonry]="masonryState"
    [class-name]="'cg-image'"
    [images]="images"
    (events)="handleMasonryLayoutEvents($event)"></masonry-layout>`,
                styles: [`:host{display:block;width:100%}:host .cg-wrapper{display:block;width:100%;overflow:hidden}:host .cg-wrapper.cg-show{height:auto;position:relative;display:table}:host .cg-image img{cursor:pointer;width:100%}`],
            },] },
];
/** @nocollapse */
GalleryComponent.ctorParameters = () => [
    { type: CrystalLightbox },
    { type: ElementRef }
];
GalleryComponent.propDecorators = {
    images: [{ type: Input, args: ['images',] }],
    config: [{ type: Input, args: ['config',] }],
    contentWrapper: [{ type: ViewChild, args: ['contentWrapper',] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class MasonryLayoutComponent {
    /**
     * @param {?} elementRef
     */
    constructor(elementRef) {
        this.elementRef = elementRef;
        this.GUTTER = 0;
        this.savedNodeDimensions = [];
        this.gridState = 'not started';
        this.ENABLE_MASONRY = true;
        this.MAX_HEIGHT = 400;
        this.events = new EventEmitter();
        this.elem = this.elementRef.nativeElement;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set gutter(value) {
        this.GUTTER = value / 2;
    }
    /**
     * @return {?}
     */
    get isMobile() {
        /** @type {?} */
        var check = false;
        (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)))
            check = true; })(navigator.userAgent || navigator.vendor);
        return check;
    }
    ;
    /**
     * @param {?} event
     * @return {?}
     */
    onWindowResize(event) {
        clearTimeout(this.resizeTimer);
        this.resizeTimer = setTimeout(() => {
            this.gridState = 'not started';
            this.buildGrid();
        }, 250);
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.buildGrid();
    }
    /**
     * @return {?}
     */
    ngOnChanges() {
        clearTimeout(this.changesTimer);
        this.changesTimer = setTimeout(() => {
            this.gridState = 'not started';
            this.buildGrid();
        }, 250);
    }
    /**
     * @return {?}
     */
    buildGrid() {
        /** @type {?} */
        let parentWidth = Math.floor(this.elem.parentNode.offsetWidth);
        /** @type {?} */
        let row = {
            startIndex: 0,
            endIndex: 0,
            length: 0,
            totalWidth: 0
        };
        if (!this.images || !this.images.length) {
            return;
        }
        this.elem.style.width = parentWidth + 'px';
        this.elem.style.display = 'table';
        this.images.forEach((node, index) => {
            if (row.totalWidth === 0) {
                row.startIndex = index;
                row.length = 0;
            }
            row.length++;
            row.totalWidth += this.getComputedWidth(index);
            if (row.totalWidth >= parentWidth || this.isLastChild(index)) {
                row.endIndex = index;
                /** @type {?} */
                let scaling = row.totalWidth / parentWidth;
                this.setColDimensions(scaling, row);
                row.totalWidth = 0;
            }
        });
    }
    /**
     * @param {?} scaling
     * @param {?} row
     * @return {?}
     */
    setColDimensions(scaling, row) {
        /** @type {?} */
        let totalRowWidth = 0;
        /** @type {?} */
        let parentWidth = this.elem.parentNode.offsetWidth;
        scaling = (scaling < 1) ? 1 : scaling;
        this.images.forEach((node, index) => {
            if (!this.ENABLE_MASONRY) {
                node.computedHeight = this.MAX_HEIGHT + 'px';
                node.computedWidth = this.getComputedWidth(index) + 'px';
                node.margin = this.getNodeMargin(parentWidth);
                return;
            }
            if (index >= row.startIndex && index <= row.endIndex) {
                /** @type {?} */
                let nodeWidth;
                // last image
                if (index === row.endIndex && scaling > 1) {
                    nodeWidth = (100 - totalRowWidth) - ((this.GUTTER * 2) / parentWidth * 100);
                    node.computedWidth = 'calc(' + nodeWidth + '%)';
                    if (this.gridState === 'not started') {
                        this.gridState = 'pre-building';
                        setTimeout(() => {
                            this.buildGrid();
                        }, 100);
                    }
                }
                else {
                    nodeWidth = ((this.getComputedWidth(index) / scaling) / parentWidth * 100) - ((row.length * (this.GUTTER * 2)) * (this.getComputedWidth(index) / scaling) / parentWidth) / parentWidth * 100;
                    node.computedWidth = 'calc(' + nodeWidth + '%)';
                    totalRowWidth += nodeWidth;
                    totalRowWidth += (this.GUTTER / parentWidth * 100) * 2;
                }
                // last row and last image
                if (index === row.endIndex && row.length === 1 && this.isMobile) {
                    nodeWidth = 100 - ((this.GUTTER * 2) / parentWidth * 100);
                    /** @type {?} */
                    let height = node.height * (parentWidth * (nodeWidth / 100) / node.width);
                    if (height / 2 < this.MAX_HEIGHT) {
                        node.computedWidth = 'calc(' + nodeWidth + '%)';
                    }
                }
                node.margin = this.getNodeMargin(parentWidth);
                node.computedHeight = node.height * (parentWidth * (nodeWidth / 100) / node.width) + 'px';
            }
        });
    }
    /**
     * @param {?} index
     * @return {?}
     */
    getComputedWidth(index) {
        return this.images[index].width / (this.images[index].height / this.MAX_HEIGHT);
    }
    /**
     * @param {?} index
     * @return {?}
     */
    isLastChild(index) {
        return index + 1 === this.images.length;
    }
    /**
     * @param {?} parentWidth
     * @return {?}
     */
    getNodeMargin(parentWidth) {
        return 'calc(' + this.GUTTER / parentWidth * 100 + '%)';
    }
    /**
     * @param {?} image
     * @param {?} i
     * @return {?}
     */
    clickOnImage(image, i) {
        this.events.emit({
            type: 'click-on-image',
            image: image,
            index: i
        });
    }
    /**
     * @param {?} elem
     * @return {?}
     */
    onImageLoaded(elem) {
        elem.style.opacity = 1;
    }
}
MasonryLayoutComponent.decorators = [
    { type: Component, args: [{
                selector: 'masonry-layout',
                template: `<div 
	[ngClass]="CLASS_NAME"
	*ngFor="let image of images; let i = index;"
    [style.width]="image.computedWidth"
    [style.height]="image.computedHeight"
    [style.float]="'left'"
    [style.margin]="image.margin"
    [style.background]="'#eeeeee'"
    [style.lineHeight]="0">
	<img 
        #imageElem
        [src]="image.preview || image.full" 
        [style.width.%]="100" 
        [style.height]="'auto'"
        [style.opacity]="0"
        (click)="clickOnImage(image, i)"
        (load)="onImageLoaded(imageElem)" />
</div>`,
            },] },
];
/** @nocollapse */
MasonryLayoutComponent.ctorParameters = () => [
    { type: ElementRef }
];
MasonryLayoutComponent.propDecorators = {
    images: [{ type: Input, args: ['images',] }],
    ENABLE_MASONRY: [{ type: Input, args: ['masonry',] }],
    MAX_HEIGHT: [{ type: Input, args: ['max-height',] }],
    CLASS_NAME: [{ type: Input, args: ['class-name',] }],
    gutter: [{ type: Input, args: ['gutter',] }],
    events: [{ type: Output }],
    onWindowResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class PinchDirective {
    /**
     * @param {?} elementRef
     */
    constructor(elementRef) {
        this.elementRef = elementRef;
        this.scale = 1;
        this.initialScale = 1;
        this.moveX = 0;
        this.moveY = 0;
        this.initialMoveX = 0;
        this.initialMoveY = 0;
        this.isNextImageLoaded = true;
        this.events = new EventEmitter();
        this.elem = this.elementRef.nativeElement;
    }
    /**
     * @param {?} event
     * @return {?}
     */
    touchstartHandler(event) {
        this.elem.style.transformOrigin = '0 0';
    }
    /**
     * @param {?} event
     * @return {?}
     */
    touchmoveHandler(event) {
        /** @type {?} */
        let touches = event.touches;
        if (touches.length === 1 && this.scale === 1 && !this.eventType || this.eventType == 'swipe') {
            event.preventDefault();
            if (!this.isNextImageLoaded) {
                return;
            }
            if (!this.eventType) {
                this.startX = event.touches[0].pageX;
                this.startY = event.touches[0].pageY;
            }
            this.eventType = 'swipe';
            this.moveX = this.initialMoveX + (event.touches[0].pageX - this.startX);
            this.moveY = 0;
            this.transformElem(0);
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    touchendHandler(event) {
        /** @type {?} */
        let touches = event.touches;
        /** @type {?} */
        let img = this.elem.getElementsByTagName("img")[0];
        if (!this.isNextImageLoaded) {
            return;
        }
        if (this.scale < 1) {
            this.scale = 1;
        }
        if (this.moveY > 0) {
            this.moveY = 0;
        }
        if (this.moveX > 100) {
            this.slide('prev');
        }
        else if (this.moveX < -100) {
            this.slide('next');
        }
        else {
            this.moveX = 0;
        }
        this.initialScale = this.scale;
        this.initialMoveX = this.moveX;
        this.initialMoveY = this.moveY;
        this.transformElem(200);
        this.eventType = 'touchend';
        if (touches.length == 0) {
            this.eventType = '';
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    slide(event) {
        this.onSlide(event);
        if (event === 'prev') {
            this.moveX = window.innerWidth + 8;
            if (this.isFirst) {
                this.moveX = 0;
            }
        }
        if (event === 'next') {
            this.moveX = -window.innerWidth - 8;
            if (this.isLast) {
                this.moveX = 0;
            }
        }
        this.isNextImageLoaded = false;
        setTimeout(() => {
            this.moveX = 0;
            this.initialMoveX = 0;
            this.isNextImageLoaded = true;
        }, 200);
    }
    /**
     * @param {?} evenType
     * @return {?}
     */
    onSlide(evenType) {
        this.events.emit(evenType);
    }
    /**
     * @param {?=} duration
     * @return {?}
     */
    transformElem(duration = 50) {
        /** @type {?} */
        let matrixVal = 'matrix(' + Number(this.scale) + ',' + 0 + ',' + 0 + ',' + Number(this.scale) + ',' + Number(this.moveX) + ',' + Number(this.moveY) + ')';
        this.elem.style.transition = 'all ' + duration + 'ms';
        this.elem.style.transform = matrixVal;
        this.elem.style.webkitTransform = matrixVal;
    }
}
PinchDirective.decorators = [
    { type: Directive, args: [{
                selector: '[pinch]'
            },] },
];
/** @nocollapse */
PinchDirective.ctorParameters = () => [
    { type: ElementRef }
];
PinchDirective.propDecorators = {
    isLast: [{ type: Input }],
    isFirst: [{ type: Input }],
    events: [{ type: Output }],
    touchstartHandler: [{ type: HostListener, args: ['touchstart', ['$event'],] }],
    touchmoveHandler: [{ type: HostListener, args: ['touchmove', ['$event'],] }],
    touchendHandler: [{ type: HostListener, args: ['touchend', ['$event'],] }]
};

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
class CrystalGalleryModule {
}
CrystalGalleryModule.decorators = [
    { type: NgModule, args: [{
                declarations: [
                    LightboxComponent,
                    LightboxMobileComponent,
                    GalleryComponent,
                    MasonryLayoutComponent,
                    PinchDirective
                ],
                imports: [
                    CommonModule
                ],
                exports: [
                    GalleryComponent
                ],
                providers: [
                    CrystalLightbox
                ],
                bootstrap: [],
                entryComponents: [
                    LightboxComponent,
                    LightboxMobileComponent
                ]
            },] },
];

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */

export { CrystalLightbox, GalleryComponent, CrystalGalleryModule, LightboxComponent, LightboxMobileComponent, MasonryLayoutComponent, PinchDirective as ɵa };

//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNyeXN0YWwtZ2FsbGVyeS5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LWNyeXN0YWwtZ2FsbGVyeS9saWIvbGlnaHRib3guY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtY3J5c3RhbC1nYWxsZXJ5L2xpYi9saWdodGJveC1tb2JpbGUuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtY3J5c3RhbC1nYWxsZXJ5L2xpYi9jb25maWcudHMiLCJuZzovL25neC1jcnlzdGFsLWdhbGxlcnkvbGliL2RvbS5zZXJ2aWNlLnRzIiwibmc6Ly9uZ3gtY3J5c3RhbC1nYWxsZXJ5L2xpYi9nYWxsZXJ5LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWNyeXN0YWwtZ2FsbGVyeS9saWIvbWFzb25yeS1sYXlvdXQuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtY3J5c3RhbC1nYWxsZXJ5L2xpYi9waW5jaC5kaXJlY3RpdmUudHMiLCJuZzovL25neC1jcnlzdGFsLWdhbGxlcnkvbGliL2dhbGxlcnkubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFxuICAgIENvbXBvbmVudCwgXG4gICAgSW5wdXQsIFxuICAgIEV2ZW50RW1pdHRlciwgXG4gICAgT25Jbml0LCBcbiAgICBIb3N0QmluZGluZywgXG4gICAgSG9zdExpc3RlbmVyLCBcbiAgICBWaWV3Q2hpbGQsIFxuICAgIEVsZW1lbnRSZWYsIFxuICAgIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnY3J5c3RhbC1saWdodGJveCcsXG4gICAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiY2ctY291bnRlclwiICpuZ0lmPVwiY29uZmlnLmNvdW50ZXIgJiYgaW1hZ2VzLmxlbmd0aCA+IDFcIj57e2NvdW50ZXJ9fTwvZGl2PlxuPGRpdiBjbGFzcz1cImNnLWRlc2NyaXB0aW9uXCIgKm5nSWY9XCJkZXNjcmlwdGlvblwiPnt7ZGVzY3JpcHRpb259fTwvZGl2PlxuXG48ZGl2IFxuXHRjbGFzcz1cImNnLWNsb3NlXCIgXG5cdChjbGljayk9XCJjbG9zZUxpZ2h0Ym94KClcIj5DbG9zZTwvZGl2PlxuXG48ZGl2IFxuXHRjbGFzcz1cImNnLXNwaW5uZXJcIiBcblx0ICpuZ0lmPVwiIWN1cnJJbWFnZUxvYWRlZFwiPjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiY2ctd3JhcHBlclwiICN3cmFwcGVyPlxuXHQ8aW1nIFxuXHRcdGNsYXNzPVwiY2ctY3Vyci1pbWFnZVwiIFxuXHRcdCNjdXJySW1hZ2VFbGVtIFxuXHRcdFtzcmNdPVwiY3VyckltYWdlUGF0aD8uZnVsbFwiIFxuXHRcdFtjbGFzcy5jZy1zaG93XT1cImN1cnJJbWFnZUxvYWRlZFwiIFxuXHRcdChsb2FkKT1cIm9uSW1hZ2VMb2FkZWQoKVwiIC8+XG48L2Rpdj5cblxuPGRpdiBcblx0Y2xhc3M9XCJjZy1wcmV2XCIgXG5cdFtoaWRkZW5dPVwiaXNGaXJzdCAmJiAhY29uZmlnLmxvb3BcIiBcblx0KGNsaWNrKT1cInByZXYoKVwiPjwvZGl2PlxuPGRpdiBcblx0Y2xhc3M9XCJjZy1uZXh0XCIgXG5cdFtoaWRkZW5dPVwiaXNMYXN0ICYmICFjb25maWcubG9vcFwiIFxuXHQoY2xpY2spPVwibmV4dCgpXCI+PC9kaXY+YCxcbiAgICBzdHlsZXM6IFtgLl9jZy1zcGlubmVyLC5fY2ctc3Bpbm5lcjphZnRlcntib3JkZXItcmFkaXVzOjUwJTt3aWR0aDozNnB4O2hlaWdodDozNnB4fS5fY2ctc3Bpbm5lcnttYXJnaW46MCBhdXRvO2ZvbnQtc2l6ZToxMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtaW5kZW50Oi05OTk5ZW07Ym9yZGVyLXRvcDo0cHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMik7Ym9yZGVyLXJpZ2h0OjRweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4yKTtib3JkZXItYm90dG9tOjRweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4yKTtib3JkZXItbGVmdDo0cHggc29saWQgI2ZmZjstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApOy13ZWJraXQtYW5pbWF0aW9uOi45cyBsaW5lYXIgaW5maW5pdGUgbG9hZDg7YW5pbWF0aW9uOi45cyBsaW5lYXIgaW5maW5pdGUgbG9hZDh9QC13ZWJraXQta2V5ZnJhbWVzIGxvYWQ4ezAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIGxvYWQ4ezAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX0uY2ctc3Bpbm5lciwuY2ctc3Bpbm5lcjphZnRlciwuY2ctc3Bpbm5lcjpiZWZvcmV7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6MTBweDtoZWlnaHQ6MTBweDstd2Via2l0LWFuaW1hdGlvbjoxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlIGxvYWQ3O2FuaW1hdGlvbjoxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlIGxvYWQ3fS5jZy1zcGlubmVye2NvbG9yOiNmZmY7Zm9udC1zaXplOjEwcHg7bWFyZ2luOjAgYXV0byAyMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtaW5kZW50Oi05OTk5ZW07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKTstd2Via2l0LWFuaW1hdGlvbi1kZWxheTotLjE2czthbmltYXRpb24tZGVsYXk6LS4xNnN9LmNnLXNwaW5uZXI6YWZ0ZXIsLmNnLXNwaW5uZXI6YmVmb3Jle2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MH0uY2ctc3Bpbm5lcjpiZWZvcmV7bGVmdDotM2VtOy13ZWJraXQtYW5pbWF0aW9uLWRlbGF5Oi0uMzJzO2FuaW1hdGlvbi1kZWxheTotLjMyc30uY2ctc3Bpbm5lcjphZnRlcntsZWZ0OjNlbX1ALXdlYmtpdC1rZXlmcmFtZXMgbG9hZDd7MCUsMTAwJSw4MCV7Ym94LXNoYWRvdzowIDIuNWVtIDAgLTEuM2VtfTQwJXtib3gtc2hhZG93OjAgMi41ZW0gMCAwfX1Aa2V5ZnJhbWVzIGxvYWQ3ezAlLDEwMCUsODAle2JveC1zaGFkb3c6MCAxMHB4IDAgLTEuM2VtfTQwJXtib3gtc2hhZG93OjAgMTBweCAwIDB9fTpob3N0KC5jZy1zaG93KXtvcGFjaXR5OjF9Omhvc3QoLmNnLWhpZGUtY29udHJvbHMpIC5jZy1jbG9zZSw6aG9zdCguY2ctaGlkZS1jb250cm9scykgLmNnLW5leHQsOmhvc3QoLmNnLWhpZGUtY29udHJvbHMpIC5jZy1wcmV2e29wYWNpdHk6MH06aG9zdHtvcGFjaXR5OjA7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Y29sb3I6I2ZmZjstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBjdWJpYy1iZXppZXIoLjY0NSwuMDQ1LC4zNTUsMSk7ei1pbmRleDoxMDAwMDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg1KX06aG9zdCBpbWd7b3BhY2l0eToxO21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJTtib3gtc2hhZG93OjAgNHB4IDE1cHggMnB4IHJnYmEoMCwwLDAsLjM1KX06aG9zdCBpbWcuY2ctY3Vyci1pbWFnZS5jZy1zaG93e29wYWNpdHk6MX06aG9zdCBpbWcuY2ctY3Vyci1pbWFnZXtvcGFjaXR5OjA7ei1pbmRleDoxMH06aG9zdCAuY2ctd3JhcHBlci5jZy1oaWRle2Rpc3BsYXk6bm9uZX06aG9zdCAuY2ctd3JhcHBlcntkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfTpob3N0IC5jZy1zcGlubmVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bGVmdDo1MCU7bWFyZ2luLXRvcDotMTVweDttYXJnaW4tbGVmdDotNXB4fTpob3N0IC5jZy1jb3VudGVye3RleHQtYWxpZ246bGVmdDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjIycHg7dG9wOjEzcHg7Zm9udC1zaXplOjE0cHg7dGV4dC1zaGFkb3c6MCAwIDFweCByZ2JhKDAsMCwwLC42NSk7ei1pbmRleDozMH06aG9zdCAuY2ctZGVzY3JpcHRpb257dGV4dC1hbGlnbjpjZW50ZXI7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDIwMHB4KTttYXJnaW46MCBhdXRvO2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjQzcHg7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDo1MH06aG9zdCAuY2ctY2xvc2V7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtwYWRkaW5nOjEzcHggMjJweDtmb250LXNpemU6MTNweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouNTt6LWluZGV4OjMwO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZS1pbi1vdXQ7dGV4dC1zaGFkb3c6MCAwIDFweCByZ2JhKDAsMCwwLC42NSl9Omhvc3QgLmNnLWNsb3NlOmhvdmVye29wYWNpdHk6MX06aG9zdCAuY2ctbmV4dCw6aG9zdCAuY2ctcHJldnt3aWR0aDo0MCU7aGVpZ2h0OjEwMCU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouNTt6LWluZGV4OjIwO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZS1pbi1vdXQ7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMCl9Omhvc3QgLmNnLW5leHQ6aG92ZXIsOmhvc3QgLmNnLXByZXY6aG92ZXJ7b3BhY2l0eToxfTpob3N0IC5jZy1wcmV2e2xlZnQ6MDtiYWNrZ3JvdW5kOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQWlDQVlBQUFCYlh5bUFBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlacFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGNnS0ZkcGJtUnZkM01wSWlCNGJYQk5UVHBKYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2pNek1UWkNRekZFUkRnek1URXhSVGM1UVVZeFFUVXhSREk1TWtNNU9EWkNJaUI0YlhCTlRUcEViMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPak16TVRaQ1F6RkZSRGd6TVRFeFJUYzVRVVl4UVRVeFJESTVNa001T0RaQ0lqNGdQSGh0Y0UxTk9rUmxjbWwyWldSR2NtOXRJSE4wVW1WbU9tbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZNek14TmtKRE1VSkVPRE14TVRGRk56bEJSakZCTlRGRU1qa3lRems0TmtJaUlITjBVbVZtT21SdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk16TXhOa0pETVVORU9ETXhNVEZGTnpsQlJqRkJOVEZFTWpreVF6azROa0lpTHo0Z1BDOXlaR1k2UkdWelkzSnBjSFJwYjI0K0lEd3ZjbVJtT2xKRVJqNGdQQzk0T25odGNHMWxkR0UrSUR3L2VIQmhZMnRsZENCbGJtUTlJbklpUHo3VnJ3WktBQUFDbEVsRVFWUjQycXpXU1k4U1FSZ0dZTG9WSFBlVFhsd0NpSXdNQXJKR3RpQUJOZXA0SUdaaTRvRWZNSm9vTGplUHJuRkdmNXlKUzBoWW1xMmIvYUJ4aVE2K2xSUkpkYVVacTV2cDVFMlRMbmlvVkZkOVZaTE4raVV4SWRlTWlXMmZSVkNtdnoyRHBKQlZDazZYNlNWQkhRUkxwVktiN1hiNzgyZzBVc3JsOGpNOFcwUDIwKzlZUW4zSlpQSWh3TjZNWG9QQm9JM25HOGlLR1poRjE0QStBcXJPbUt0V3EzMUYyMTNra09nUTY5QjBPbDBCcXJGb3Q5dlYvSDcvYzdSZkVvVloxRytFZGpxZHZ0ZnJmWW4ySzhnSmthSFFvZGxzdGpJZWovc3NpaGRIMERkb3Y0YWNRbzdRbHljSm81UEpoRWMxajhmem1xSmsyaDFEN0x2MWxrVXY1bks1eHp6YWFyV01VSWN3bXMvbkNUcmdVYmZiVGRDclZ0QUFRYWZUcVE1VkZFVmRDaTBVQ2svUTB5R0xOcHROMWVsMHZxTG9hUkhVeHFQb0tZLzJLRm8wZzByMGJhNFdpOFduUUVjczJtZzBWQVBVTHJKc1pUcXBOekRaNnl4YXI5ZFZsOHRGVnRSMTBTbkZvaEpkZ25aWXVoOUlralNUWmZrblBuNUR2aU8va0wvSWprZ3RJT2hoSko3SlpGNWdkVTI0aGRERzZxcWcvUUp5d0V6bG1nL0ZTVExoRTRuRTluQTRuSEpGUnZINWZKdG85NGdPQmZ2eWp0SnhYSS9INHgrQTYzcmU2L1VVVkRDQ256ZUR6NmZiY2VRc2Nqc1dpNzAzd0ZzTTdoREJKUU44UFJxTmJtTm4wT0dhcHUwSmZvdmlZeDRQQkFMMzBlNWRDZytIdzBaNGU4L3dmci9QNDUxUUtQUmdhUnpJRmpEZGtzZWZzYmpkS241ekVSNkpSTWl3dVArM05lMktCNFBCTFZWVlIxeGQrWUsyTzJiT0ZZdndkOENIYksveC9KNlpjOFVpL0FabXhkdHF0ZHJBd2xGTHBSTFpyUy9QWWNua0VVdWlZN2hDUytnNXNvdlQ1NStRajdRUy9qWUQ4empwL1VGNnQ5R1Mrb1BlZDh6Q0xDNXpKMHRTby8vUSs4d0tMSFR3L2lmQUFNUVZTNHZIWlIyVkFBQUFBRWxGVGtTdVFtQ0MpIGNlbnRlciBsZWZ0IDIycHggbm8tcmVwZWF0fTpob3N0IC5jZy1uZXh0e3JpZ2h0OjA7YmFja2dyb3VuZDp1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCWUFBQUFpQ0FZQUFBQmJYeW1BQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5WnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRjZ0tGZHBibVJ2ZDNNcElpQjRiWEJOVFRwSmJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09qRXlOREUzTURFMVJEZ3pNVEV4UlRjNU5qTTRRVEl6UXpJMlJqYzJRamcySWlCNGJYQk5UVHBFYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2pFeU5ERTNNREUyUkRnek1URXhSVGM1TmpNNFFUSXpRekkyUmpjMlFqZzJJajRnUEhodGNFMU5Pa1JsY21sMlpXUkdjbTl0SUhOMFVtVm1PbWx1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2TVRJME1UY3dNVE5FT0RNeE1URkZOemsyTXpoQk1qTkRNalpHTnpaQ09EWWlJSE4wVW1WbU9tUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZNVEkwTVRjd01UUkVPRE14TVRGRk56azJNemhCTWpORE1qWkdOelpDT0RZaUx6NGdQQzl5WkdZNlJHVnpZM0pwY0hScGIyNCtJRHd2Y21SbU9sSkVSajRnUEM5NE9uaHRjRzFsZEdFK0lEdy9lSEJoWTJ0bGRDQmxibVE5SW5JaVB6N3p2NUJLQUFBQ2wwbEVRVlI0MnJUVzIyNFNRUndHY0haYjhGVDFTbTg4QkpDaUZBRTVKcHlDQk5SRThjb1lFeTk0QUdxaTlYRFhTMCtKVmgvQ0IvRWhpRkVUNUxqQWNsZ1dqYWExYWF6ZkpETTZ1Nkx1TGpySmwyMTI0Y2QwZHVZL0k5aCtOb0VMYWJ0Y1RMY0ZDb24wYncrU1JFNGgyOGhuMnh5Tm9JdklTcmxjZnFBb1NsdVNwTGVwVktxQ2U2Y1JCLzJNWUFYZWkxd2ZqVWJTTG0zNGdYNHltYnlOK3o2ck9CbUMvY2lOZXIzK2ZwZHJ3R1hnZDhoL1l3Vm44RG0vMzcvZTYvVUdPbnlRVHFmWHJPQnNLSTRnNTcxZTc2TnV0enY4RGU0M2d3djA1UzBoeDVDTHdKL2lCV3J3eVdReXpHYXpwbkh5SVR0eUNEbEJjSS9IOHdTNFpsaFVWYldNTy9SNHA5UDVCYy9sY25meC9PdzgrQVczMnowTEgrWHorWCtEdDl0dG1jZW4weW5EQTFieDR3UjNPcDJQVzYyV3JPdjV1RkFvM0pzWEwxSzhyK3Y1TE54bVpyYjh3SnZOcG41WWxHS3hlSi9XRnJ1WkJjUlB4VXN1bDJ1OTBXaG9jQ3lxQnFrM2RMR0ppd2JnYi9UNkZmbENTcWtvaWx1Q0lHanFOR3pXZ1FVejlZUjhhUTl5QnF0eURRdEgwcTFLTlpQSlBNVHpPSEtBNG9hSHd1UHorU29vVW0wZUhZL0gwMFFpc1VFV0ZIS1VEWVZSZEJtVnI5THY5L1dvR28vSFgrSjVpWTcvUVNNdmowMDNobmIwYUN3V2U0SG5WNUdUeUdFajAwMkREZ1lERFlxZFJvMUdveHUwcDNwVStCdnFEUVFDcXpQUUNVV3Z6SU5LZWpRY0RsdEhRNkhRTGFCZEhoME9oNVpSTzBPQmFGRDhpSUw3ejgyaWJHdHlSeUtSMVQrZ2w4MmcvR1o2RGV2L0hZL0tzcXdFZzBGTEtMLzkzK1I3QzNRTTlOazhLRHRpT1dxMTJqYjJzMlhTMDFLcDlLcGFyYjdHL1RmSVIyUVQyVEY2VUJTNDJiQkVpL1VLL1NJQlB5Q2ZrQzB6S0ErejZyV1BYbTMwdExsSnI2WlEvWm1ZRFluSTFlRWRlalY5VGhiKzE4SDd1d0FEQU9HL1djbTR4K2tuQUFBQUFFbEZUa1N1UW1DQykgY2VudGVyIHJpZ2h0IDIycHggbm8tcmVwZWF0fWBdXG59KVxuZXhwb3J0IGNsYXNzIExpZ2h0Ym94Q29tcG9uZW50IHtcbiAgICBfaW5kZXg6IGFueTtcbiAgICBwcmV2SW5kZXg6IGFueTtcbiAgICBjdXJySW1hZ2VMb2FkZWQ6IGFueTsgXG4gICAgcHJldkltYWdlSGlkZTogYW55O1xuICAgIHdyYXBwZXJQcm9wOiBhbnk7XG4gICAgX2RhdGE6IGFueTtcbiAgICBjdXJyZW50SW1hZ2VJbmRleDogbnVtYmVyID0gMDtcbiAgICBzcGlubmVySGVpZ2h0OiBudW1iZXIgPSAzMDtcbiAgICBkZXNjcmlwdGlvbkhlaWdodDogbnVtYmVyID0gNDM7XG5cbiAgICBASW5wdXQoKSBkYXRhOiBhbnk7XG5cbiAgICBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuY2ctc2hvdycpIHNob3dMaWdodGJveDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuY2ctaGlkZS1jb250cm9scycpIGhpZGVDb250cm9sczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUudHJhbnNpdGlvbicpIGhvc3RTdHlsZVRyYW5zaXRpb246IHN0cmluZztcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmJhY2tncm91bmRDb2xvcicpIGhvc3RTdHlsZUJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuXG4gICAgQFZpZXdDaGlsZCgnY3VyckltYWdlRWxlbScpIGN1cnJJbWFnZUVsZW06IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgncHJldkltYWdlRWxlbScpIHByZXZJbWFnZUVsZW06IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnd3JhcHBlcicpIHdyYXBwZXJFbGVtOiBFbGVtZW50UmVmO1xuXG4gICAgZ2V0IGltYWdlcygpe1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmltYWdlcztcbiAgICB9XG5cbiAgICBnZXQgY29uZmlnKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuY29uZmlnO1xuICAgIH1cblxuICAgIGdldCBpbmRleCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SW1hZ2VJbmRleDtcbiAgICB9XG5cbiAgICBnZXQgY3VyckltYWdlUGF0aCgpe1xuICAgICAgICBsZXQgaW1hZ2UgPSB0aGlzLmltYWdlc1t0aGlzLmluZGV4XTtcblxuICAgICAgICBpZiAoIWltYWdlKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbWFnZS5wYXRoKXtcbiAgICAgICAgICAgIGltYWdlLmZ1bGwgPSBpbWFnZS5wYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH1cblxuICAgIGdldCBwcmV2SW1hZ2VQYXRoKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlc1t0aGlzLnByZXZJbmRleF07XG4gICAgfVxuXG4gICAgc2V0IHByZXZJbWFnZVBhdGgodmFsdWU6IGFueSl7XG4gICAgICAgIHRoaXMuaW1hZ2VzW3RoaXMucHJldkluZGV4XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCBpc0ZpcnN0KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSAwO1xuICAgIH1cblxuICAgIGdldCBpc0xhc3QoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09ICh0aGlzLmltYWdlcy5sZW5ndGgtMSk7XG4gICAgfVxuXG4gICAgZ2V0IGxhdGVzdEltYWdlSW5kZXgoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzLmxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlc1t0aGlzLmluZGV4XS5kZXNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgY291bnRlcigpe1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SW1hZ2VJbmRleCArIDEgKycvJysgdGhpcy5pbWFnZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBvbktleURvd24oZXZlbnQ6IGFueSkge1xuICAgICAgICBzd2l0Y2goZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICAgICAgICAgIHRoaXMucHJldigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VMaWdodGJveCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgWyckZXZlbnQnXSlcbiAgICBvbk1vdXNlRW50ZXIoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmhpZGVDb250cm9scyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmKXtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpe1xuICAgICAgICB0aGlzLnNldEJhY2tncm91bmRPcGFjaXR5KHRoaXMuY29uZmlnLmJhY2tncm91bmRPcGFjaXR5KTtcbiAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleCA9IHRoaXMuY29uZmlnLmluZGV4O1xuICAgICAgICAvL2RvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0xpZ2h0Ym94ID0gdHJ1ZTtcbiAgICAgICAgfSwgMzApO1xuXG4gICAgICAgIHRoaXMuc2V0TWF4RGltZW5zaW9ucygpO1xuICAgICAgICB0aGlzLnNldEFuaW1hdGlvbkR1cmF0aW9uKCk7XG4gICAgfVxuXG4gICAgY2xvc2VMaWdodGJveCgpe1xuICAgICAgICB0aGlzLnNob3dMaWdodGJveCA9IGZhbHNlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgdGhpcy5jbG9zZS5lbWl0KCdjbG9zZScpO1xuICAgICAgICAgICAvL2RvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICAgICAgfSwgdGhpcy5jb25maWcuYW5pbWF0aW9uRHVyYXRpb24pOyBcbiAgICB9XG5cbiAgICBuZXh0KCl7XG4gICAgICAgIGlmICh0aGlzLmlzTGFzdCl7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEltYWdlSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJJbWFnZUxvYWRlZCA9ICdsb2FkaW5nJztcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJJbWFnZUxvYWRlZCA9PT0gJ2xvYWRpbmcnKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCA1MCk7XG5cbiAgICAgICAgdGhpcy5zZXRNYXhEaW1lbnNpb25zKCk7XG4gICAgfVxuICAgIHByZXYoKXtcbiAgICAgICAgaWYgKHRoaXMuaXNGaXJzdCl7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleCA9IHRoaXMubGF0ZXN0SW1hZ2VJbmRleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1hZ2VJbmRleC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJySW1hZ2VMb2FkZWQgPT09ICdsb2FkaW5nJyl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2VMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgNTApO1xuXG4gICAgICAgIHRoaXMuc2V0TWF4RGltZW5zaW9ucygpO1xuICAgIH1cblxuICAgIG9uSW1hZ2VMb2FkZWQoKXtcbiAgICAgICAgdGhpcy5jdXJySW1hZ2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgc2V0QmFja2dyb3VuZE9wYWNpdHkob3BhY2l0eTogYW55KXtcbiAgICAgICAgdGhpcy5ob3N0U3R5bGVCYWNrZ3JvdW5kQ29sb3IgPSAncmdiYSgwLCAwLCAwLCAnK29wYWNpdHkrJyknO1xuICAgIH1cblxuICAgIHNldE1heERpbWVuc2lvbnMoKXtcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pe1xuICAgICAgICAgICAgdGhpcy53cmFwcGVyRWxlbS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICdjYWxjKDEwMCUgLSAnICsgKHRoaXMuZGVzY3JpcHRpb25IZWlnaHQgKiAyKSArICdweCknO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cmFwcGVyRWxlbS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJySW1hZ2VFbGVtLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0ID0gJ2NhbGMoJyArIHRoaXMuY29uZmlnLmxpZ2h0Ym94TWF4SGVpZ2h0ICsgJyknO1xuICAgICAgICB0aGlzLmN1cnJJbWFnZUVsZW0ubmF0aXZlRWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9IHRoaXMuY29uZmlnLmxpZ2h0Ym94TWF4V2lkdGg7XG4gICAgfVxuXG4gICAgc2V0QW5pbWF0aW9uRHVyYXRpb24oKXtcbiAgICAgICAgdGhpcy5ob3N0U3R5bGVUcmFuc2l0aW9uID0gJ29wYWNpdHkgJyt0aGlzLmNvbmZpZy5hbmltYXRpb25EdXJhdGlvbisnbXMnO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdjcnlzdGFsLWxpZ2h0Ym94LW1vYmlsZScsXG5cdHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNnLWJhY2tcIiAoY2xpY2spPVwiY2xvc2VMaWdodGJveCgpXCI+PC9kaXY+XG5cbjxkaXYgXG5cdGNsYXNzPVwiY2ctd3JhcHBlclwiIFxuXHRbY2xhc3MuY2ctbGFuZHNjYXBlXT1cImxhbmRzY2FwZU1vZGVcIlxuXHRwaW5jaCBbaXNMYXN0XT1cImlzTGFzdFwiIFtpc0ZpcnN0XT1cImlzRmlyc3RcIiAoZXZlbnRzKT1cImhhbmRsZVBpbmNoRXZlbnRzKCRldmVudClcIlxuXHQjd3JhcHBlcj5cblx0PGRpdiBjbGFzcz1cImNnLWltYWdlLXdyYXAgY2ctcHJldi1pbWFnZVwiPlxuXHRcdDxpbWcgXG5cdFx0XHQqbmdJZj1cInByZXZJbWFnZVBhdGhcIlxuXHRcdFx0W3NyY109XCJwcmV2SW1hZ2VQYXRoLmZ1bGxcIiBcblx0XHRcdFtjbGFzcy5jZy1oaWRlXT1cIiFwcmV2SW1hZ2UubG9hZGVkXCJcblx0XHRcdChsb2FkKT1cIm9uSW1hZ2VMb2FkZWQoJ3ByZXZJbWFnZScpXCJcblx0XHQvPlxuXHRcdDxkaXYgY2xhc3M9XCJjZy1zcGlubmVyXCIgKm5nSWY9XCIhcHJldkltYWdlLmxvYWRlZCAmJiBwcmV2SW1hZ2VQYXRoXCI+PC9kaXY+XG5cdDwvZGl2PlxuXG5cdDxkaXYgY2xhc3M9XCJjZy1pbWFnZS13cmFwIGNnLWN1cnItaW1hZ2VcIiAqbmdJZj1cImN1cnJJbWFnZS5zaG93XCI+XG5cdFx0PGltZyBcblx0XHRcdFtzcmNdPVwiY3VyckltYWdlUGF0aD8uZnVsbFwiIFxuXHRcdFx0W2NsYXNzLmNnLWhpZGVdPVwiIWN1cnJJbWFnZS5sb2FkZWRcIiBcblx0XHRcdChsb2FkKT1cIm9uSW1hZ2VMb2FkZWQoJ2N1cnJJbWFnZScpXCJcblx0XHQvPlxuXHRcdDxkaXYgY2xhc3M9XCJjZy1zcGlubmVyXCIgKm5nSWY9XCIhY3VyckltYWdlLmxvYWRlZFwiPjwvZGl2PlxuXHQ8L2Rpdj5cblx0XG5cdDxkaXYgY2xhc3M9XCJjZy1pbWFnZS13cmFwIGNnLW5leHQtaW1hZ2VcIj5cblx0XHQ8aW1nIFxuXHRcdFx0Km5nSWY9XCJuZXh0SW1hZ2VQYXRoXCJcblx0XHRcdFtzcmNdPVwibmV4dEltYWdlUGF0aC5mdWxsXCIgXG5cdFx0XHRbY2xhc3MuY2ctaGlkZV09XCIhbmV4dEltYWdlLmxvYWRlZFwiIFxuXHRcdFx0KGxvYWQpPVwib25JbWFnZUxvYWRlZCgnbmV4dEltYWdlJylcIlxuXHRcdC8+XG5cdFx0PGRpdiBjbGFzcz1cImNnLXNwaW5uZXJcIiAqbmdJZj1cIiFuZXh0SW1hZ2UubG9hZGVkICYmIG5leHRJbWFnZVBhdGhcIj48L2Rpdj5cblx0PC9kaXY+XG48L2Rpdj5gLFxuICAgIHN0eWxlczogW2AuX2NnLXNwaW5uZXIsLl9jZy1zcGlubmVyOmFmdGVye2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjM2cHg7aGVpZ2h0OjM2cHh9Ll9jZy1zcGlubmVye21hcmdpbjowIGF1dG87Zm9udC1zaXplOjEwcHg7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1pbmRlbnQ6LTk5OTllbTtib3JkZXItdG9wOjRweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4yKTtib3JkZXItcmlnaHQ6NHB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2JvcmRlci1ib3R0b206NHB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2JvcmRlci1sZWZ0OjRweCBzb2xpZCAjZmZmOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7LXdlYmtpdC1hbmltYXRpb246LjlzIGxpbmVhciBpbmZpbml0ZSBsb2FkODthbmltYXRpb246LjlzIGxpbmVhciBpbmZpbml0ZSBsb2FkOH1ALXdlYmtpdC1rZXlmcmFtZXMgbG9hZDh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgbG9hZDh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fS5jZy1zcGlubmVyLC5jZy1zcGlubmVyOmFmdGVyLC5jZy1zcGlubmVyOmJlZm9yZXtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDoxMHB4O2hlaWdodDoxMHB4Oy13ZWJraXQtYW5pbWF0aW9uOjEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGUgbG9hZDc7YW5pbWF0aW9uOjEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGUgbG9hZDd9LmNnLXNwaW5uZXJ7Y29sb3I6I2ZmZjtmb250LXNpemU6MTBweDttYXJnaW46MCBhdXRvIDIwcHg7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1pbmRlbnQ6LTk5OTllbTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApOy13ZWJraXQtYW5pbWF0aW9uLWRlbGF5Oi0uMTZzO2FuaW1hdGlvbi1kZWxheTotLjE2c30uY2ctc3Bpbm5lcjphZnRlciwuY2ctc3Bpbm5lcjpiZWZvcmV7Y29udGVudDpcIlwiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowfS5jZy1zcGlubmVyOmJlZm9yZXtsZWZ0Oi0zZW07LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LS4zMnM7YW5pbWF0aW9uLWRlbGF5Oi0uMzJzfS5jZy1zcGlubmVyOmFmdGVye2xlZnQ6M2VtfUAtd2Via2l0LWtleWZyYW1lcyBsb2FkN3swJSwxMDAlLDgwJXtib3gtc2hhZG93OjAgMi41ZW0gMCAtMS4zZW19NDAle2JveC1zaGFkb3c6MCAyLjVlbSAwIDB9fUBrZXlmcmFtZXMgbG9hZDd7MCUsMTAwJSw4MCV7Ym94LXNoYWRvdzowIDEwcHggMCAtMS4zZW19NDAle2JveC1zaGFkb3c6MCAxMHB4IDAgMH19Omhvc3QoLmNnLXNob3cpe29wYWNpdHk6MX06aG9zdCguY2ctaGlkZS1jb250cm9scykgLmNnLWNsb3NlLDpob3N0KC5jZy1oaWRlLWNvbnRyb2xzKSAuY2ctbmV4dCw6aG9zdCguY2ctaGlkZS1jb250cm9scykgLmNnLXByZXZ7b3BhY2l0eTowfTpob3N0e29wYWNpdHk6MDtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtjb2xvcjojZmZmOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzIGN1YmljLWJlemllciguNjQ1LC4wNDUsLjM1NSwxKTt6LWluZGV4OjEwMDAwO2JhY2tncm91bmQtY29sb3I6IzAwMH06aG9zdCAuY2ctYmFja3tiYWNrZ3JvdW5kOnVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwgdmVyc2lvbiUzRCUyMjEuMCUyMiBlbmNvZGluZyUzRCUyMlVURi04JTIyJTNGJTNFJTNDc3ZnIHdpZHRoJTNEJTIyMTBweCUyMiBoZWlnaHQlM0QlMjIxNnB4JTIyIHZpZXdCb3glM0QlMjIwIDAgMTAgMTYlMjIgdmVyc2lvbiUzRCUyMjEuMSUyMiB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyUyMiB4bWxucyUzQXhsaW5rJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYxOTk5JTJGeGxpbmslMjIlM0UgICAgJTNDIS0tIEdlbmVyYXRvciUzQSBza2V0Y2h0b29sIDQwLjIgKDMzODI2KSAtIGh0dHAlM0ElMkYlMkZ3d3cuYm9oZW1pYW5jb2RpbmcuY29tJTJGc2tldGNoIC0tJTNFICAgICUzQ3RpdGxlJTNFMTFBNzM4NzItNUVCRi00NkY2LUI3QzUtMTQyRDQ3QTMzMzM5JTNDJTJGdGl0bGUlM0UgICAgJTNDZGVzYyUzRUNyZWF0ZWQgd2l0aCBza2V0Y2h0b29sLiUzQyUyRmRlc2MlM0UgICAgJTNDZGVmcyUzRSUzQyUyRmRlZnMlM0UgICAgJTNDZyBpZCUzRCUyMkludGVyZmFjZS0xMjgwLXgtODAwJTIyIHN0cm9rZSUzRCUyMm5vbmUlMjIgc3Ryb2tlLXdpZHRoJTNEJTIyMSUyMiBmaWxsJTNEJTIybm9uZSUyMiBmaWxsLXJ1bGUlM0QlMjJldmVub2RkJTIyJTNFICAgICAgICAlM0NnIGlkJTNEJTIyTG90X3ZpZXdwYWdlX29wZW4lMjIgdHJhbnNmb3JtJTNEJTIydHJhbnNsYXRlKC0xMTEuMDAwMDAwJTJDIC0yOTYuMDAwMDAwKSUyMiBmaWxsJTNEJTIyJTIzRkZGRkZGJTIyJTNFICAgICAgICAgICAgJTNDZyBpZCUzRCUyMmFycm93cy0xNnB4LTFfbWluaW1hbC1sZWZ0JTIyIHRyYW5zZm9ybSUzRCUyMnRyYW5zbGF0ZSgxMTEuMDAwMDAwJTJDIDI5Ni4wMDAwMDApJTIyJTNFICAgICAgICAgICAgICAgICUzQ3BvbHlnb24gaWQlM0QlMjJTaGFwZSUyMiBwb2ludHMlM0QlMjI4LjEgMTUuNyAwLjQgOCA4LjEgMC4zIDkuNiAxLjcgMy4zIDggOS42IDE0LjMlMjIlM0UlM0MlMkZwb2x5Z29uJTNFICAgICAgICAgICAgJTNDJTJGZyUzRSAgICAgICAgJTNDJTJGZyUzRSAgICAlM0MlMkZnJTNFJTNDJTJGc3ZnJTNFXCIpIGNlbnRlci8xMnB4IG5vLXJlcGVhdDt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O29wYWNpdHk6Ljk7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3otaW5kZXg6MTAwMH06aG9zdCAuY2ctd3JhcHBlci5jZy1sYW5kc2NhcGUgLmNnLWltYWdlLXdyYXAgaW1ne2hlaWdodDoxMDAlfTpob3N0IC5jZy13cmFwcGVye3RyYW5zaXRpb246bm9uZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2Rpc3BsYXk6YmxvY2t9Omhvc3QgLmNnLXdyYXBwZXIgLmNnLWltYWdlLXdyYXAuY2ctcHJldi1pbWFnZXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZChjYWxjKC0xMDAlIC0gOHB4KSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZChjYWxjKC0xMDAlIC0gOHB4KSwwLDApfTpob3N0IC5jZy13cmFwcGVyIC5jZy1pbWFnZS13cmFwLmNnLW5leHQtaW1hZ2V7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoY2FsYygxMDAlICsgOHB4KSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZChjYWxjKDEwMCUgKyA4cHgpLDAsMCl9Omhvc3QgLmNnLXdyYXBwZXIgLmNnLWltYWdlLXdyYXB7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9Omhvc3QgLmNnLXdyYXBwZXIgLmNnLWltYWdlLXdyYXAgaW1ne21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJTt3aWR0aDphdXRvO2hlaWdodDphdXRvO3Bvc2l0aW9uOnJlbGF0aXZlfTpob3N0IC5jZy13cmFwcGVyIC5jZy1pbWFnZS13cmFwIGltZy5jZy1oaWRle2Rpc3BsYXk6bm9uZX1gXVxufSlcbmV4cG9ydCBjbGFzcyBMaWdodGJveE1vYmlsZUNvbXBvbmVudCB7IFxuXHRfaW5kZXg6IGFueTtcbiAgICBwcmV2SW5kZXg6IGFueTtcbiAgICBuZXh0SW5kZXg6IGFueTtcblxuICAgIGN1cnJJbWFnZSA9IHtcbiAgICAgICAgc2hvdzogZmFsc2UsXG4gICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgIGluZGV4OiAwXG4gICAgfTsgXG5cbiAgICBwcmV2SW1hZ2UgPSB7XG4gICAgICAgIGxvYWRlZDogZmFsc2VcbiAgICB9OyBcblxuICAgIG5leHRJbWFnZSA9IHtcbiAgICAgICAgbG9hZGVkOiBmYWxzZVxuICAgIH07IFxuXG4gICAgd3JhcHBlclByb3A6IGFueTtcbiAgICBsYW5kc2NhcGVNb2RlOiBhbnk7XG5cblx0Y2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBASW5wdXQoKSBkYXRhOiBhbnk7XG5cbiAgICBAVmlld0NoaWxkKCd3cmFwcGVyJykgd3JhcHBlckVsOiBFbGVtZW50UmVmO1xuXG4gICAgZ2V0IGltYWdlcygpe1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmltYWdlcztcbiAgICB9XG5cbiAgICBnZXQgY29uZmlnKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuY29uZmlnO1xuICAgIH1cblxuICAgIGdldCBpbmRleCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJySW1hZ2UuaW5kZXg7XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJJbWFnZVBhdGgoKXtcbiAgICAgICAgbGV0IGltYWdlID0gdGhpcy5pbWFnZXNbdGhpcy5pbmRleF07XG5cbiAgICAgICAgaWYgKCFpbWFnZSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW1hZ2UucGF0aCl7XG4gICAgICAgICAgICBpbWFnZS5mdWxsID0gaW1hZ2UucGF0aDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH1cblxuICAgIGdldCBwcmV2SW1hZ2VQYXRoKCl7XG4gICAgICAgIGlmICh0aGlzLnByZXZJbmRleCA8IDAgJiYgdGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICB0aGlzLnByZXZJbmRleCA9IHRoaXMubGF0ZXN0SW1hZ2VJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbWFnZSA9IHRoaXMuaW1hZ2VzW3RoaXMucHJldkluZGV4XTtcblxuICAgICAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UucGF0aCl7XG4gICAgICAgICAgICBpbWFnZS5mdWxsID0gaW1hZ2UucGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgfVxuXG4gICAgZ2V0IG5leHRJbWFnZVBhdGgoKXtcbiAgICAgICAgbGV0IGltYWdlID0gdGhpcy5pbWFnZXNbdGhpcy5uZXh0SW5kZXhdO1xuXG4gICAgICAgIGlmIChpbWFnZSAmJiBpbWFnZS5wYXRoKXtcbiAgICAgICAgICAgIGltYWdlLmZ1bGwgPSBpbWFnZS5wYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbWFnZTtcbiAgICB9XG5cbiAgICBnZXQgaXNGaXJzdCgpe1xuICAgICAgICBpZiAodGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgXHQgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgaXNMYXN0KCl7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSB0aGlzLmxhdGVzdEltYWdlSW5kZXg7XG4gICAgICAgIH0gICAgICAgIFxuICAgIH1cblxuICAgIGdldCBsYXRlc3RJbWFnZUluZGV4KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlcy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIGdldCBpc0xhbmRzY2FwZSgpe1xuICAgICAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPiB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jZy1zaG93JykgbGlnaHRib3hTaG93bjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gICAgb25XaW5kb3dSZXNpemUoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmxhbmRzY2FwZU1vZGUgPSB0aGlzLmlzTGFuZHNjYXBlO1xuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpe1xuICAgIH1cblxuICAgIG5nT25Jbml0KCl7XG4gICAgICAgIHRoaXMuY3VyckltYWdlLmluZGV4ID0gdGhpcy5jb25maWcuaW5kZXg7XG4gICAgICAgIHRoaXMucHJldkluZGV4ID0gdGhpcy5jdXJySW1hZ2UuaW5kZXgtMTtcbiAgICAgICAgdGhpcy5uZXh0SW5kZXggPSB0aGlzLmN1cnJJbWFnZS5pbmRleCsxO1xuXG4gICAgICAgIHRoaXMuc2hvd0xpZ2h0Ym94KCk7XG4gICAgfVxuXG4gICAgc2hvd0xpZ2h0Ym94KCl7XG4gICAgICAgIHRoaXMuY3VyckltYWdlLnNob3cgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgdGhpcy5saWdodGJveFNob3duID0gdHJ1ZTtcbiAgICAgICAgfSwgMzApO1xuICAgIH1cblxuXHRjbG9zZUxpZ2h0Ym94KCl7XG5cdFx0dGhpcy5saWdodGJveFNob3duID0gZmFsc2U7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQodHJ1ZSk7XG4gICAgICAgIH0sIDIwMCk7IFxuXHR9XG5cbiAgICBzbGlkZShldmVudDogYW55KXtcbiAgICAgICAgaWYgKGV2ZW50ID09PSAnbmV4dCcpe1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xhc3Qpe1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlLmluZGV4Kys7XG4gICAgICAgICAgICAgICAgfSwgMjAwKTsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ID09PSB0aGlzLmxhdGVzdEltYWdlSW5kZXgpe1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZS5pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfSwgMjAwKTsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJTbGlkZSgnbmV4dCcpO1xuICAgICAgICAgICAgfSwgMzAwKTsgXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQgPT09ICdwcmV2Jyl7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzRmlyc3Qpe1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlLmluZGV4LS07XG4gICAgICAgICAgICAgICAgfSwgMjAwKTsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ID09PSAwKXtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2UuaW5kZXggPSB0aGlzLmxhdGVzdEltYWdlSW5kZXg7XG4gICAgICAgICAgICAgICAgfSwgMjAwKTsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJTbGlkZSgncHJldicpO1xuICAgICAgICAgICAgfSwgMzAwKTsgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZnRlclNsaWRlKGV2ZW50VHlwZTogYW55KXtcbiAgICAgICAgdGhpcy5jdXJySW1hZ2Uuc2hvdyA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gdGhpcy5sYXRlc3RJbWFnZUluZGV4ICYmIHRoaXMuY29uZmlnLmxvb3Ape1xuICAgICAgICAgICAgdGhpcy5uZXh0SW5kZXggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5uZXh0SW5kZXggPSB0aGlzLmluZGV4KzE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gMCAmJiB0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgIHRoaXMucHJldkluZGV4ID0gdGhpcy5sYXRlc3RJbWFnZUluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcmV2SW5kZXggPSB0aGlzLmluZGV4LTE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAncHJldicpe1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJldkltYWdlLmxvYWRlZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2SW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3VyckltYWdlLmxvYWRlZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0SW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAnbmV4dCcpe1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMubmV4dEltYWdlLmxvYWRlZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0SW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3VyckltYWdlLmxvYWRlZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2SW1hZ2UubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlZmF1bHRXcmFwcGVyUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIG9uSW1hZ2VMb2FkZWQoZWxlbTogYW55KXtcbiAgICAgICAgdGhpc1tlbGVtXS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgaGFuZGxlUGluY2hFdmVudHMoJGV2ZW50KXtcbiAgICAgICAgaWYgKCRldmVudCA9PT0gJ3ByZXYnKXtcbiAgICAgICAgICAgIHRoaXMuc2xpZGUoJ3ByZXYnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJGV2ZW50ID09PSAnbmV4dCcpe1xuICAgICAgICAgICAgdGhpcy5zbGlkZSgnbmV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVmYXVsdFdyYXBwZXJQb3NpdGlvbigpe1xuICAgICAgICBsZXQgZWxlbSA9IHRoaXMud3JhcHBlckVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGVsZW0uc3R5bGUudHJhbnNpdGlvbiA9ICdhbGwgMG1zJztcbiAgICAgICAgZWxlbS5zdHlsZS50cmFuc2Zvcm0gPSAnbWF0cml4KDEsIDAsIDAsIDEsIDAsIDApJztcbiAgICAgICAgZWxlbS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSAnbWF0cml4KDEsIDAsIDAsIDEsIDAsIDApJztcbiAgICB9XG59IiwiZXhwb3J0IGNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG5cdG1hc29ucnk6IHRydWUsXG5cdG1hc29ucnlNYXhIZWlnaHQ6IDIwMCxcblx0bWFzb25yeUd1dHRlcjogNCxcblx0bG9vcDogZmFsc2UsXG5cdGluZGV4OiAwLFxuXHRiYWNrZ3JvdW5kT3BhY2l0eTogMC44NSxcblx0Y291bnRlcjogZmFsc2UsXG5cdGxpZ2h0Ym94TWF4SGVpZ2h0OiBcIjEwMCVcIixcblx0bGlnaHRib3hNYXhXaWR0aDogXCIxMDAlXCIsXG5cdGFuaW1hdGlvbkR1cmF0aW9uOiAxMDBcbn0iLCJpbXBvcnQge1xuICAgIEluamVjdGFibGUsXG4gICAgSW5qZWN0b3IsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIEVtYmVkZGVkVmlld1JlZixcbiAgICBBcHBsaWNhdGlvblJlZixcbiAgICBDb21wb25lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IExpZ2h0Ym94Q29tcG9uZW50IH0gZnJvbSAnLi9saWdodGJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlnaHRib3hNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuL2xpZ2h0Ym94LW1vYmlsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcblxuZXhwb3J0IGludGVyZmFjZSBBZENvbXBvbmVudCB7XG4gIGRhdGE6IGFueTtcbiAgY2xvc2U6IGFueTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENyeXN0YWxMaWdodGJveCB7XG5cbiAgICBnZXQgaXNNb2JpbGUoKSB7XG4gICAgICAgIHZhciBjaGVjayA9IGZhbHNlO1xuICAgICAgICAoZnVuY3Rpb24oYSl7aWYoLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWluby9pLnRlc3QoYSl8fC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzXFwtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFxcLW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxid1xcLShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtXFwtfGNlbGx8Y2h0bXxjbGRjfGNtZFxcLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkY1xcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XFwtZCl8ZWwoNDl8YWkpfGVtKGwyfHVsKXxlcihpY3xrMCl8ZXNsOHxleihbNC03XTB8b3N8d2F8emUpfGZldGN8Zmx5KFxcLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZlxcLTV8Z1xcLW1vfGdvKFxcLnd8b2QpfGdyKGFkfHVuKXxoYWllfGhjaXR8aGRcXC0obXxwfHQpfGhlaVxcLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzXFwtY3xodChjKFxcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcXC0oMjB8Z298bWEpfGkyMzB8aWFjKCB8XFwtfFxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcXC8pfGtsb258a3B0IHxrd2NcXC18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8XFwtW2Etd10pfGxpYnd8bHlueHxtMVxcLXd8bTNnYXxtNTBcXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXFwtY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoXFwtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSlcXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFxcLShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwblxcLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdFxcLWd8cWFcXC1hfHFjKDA3fDEyfDIxfDMyfDYwfFxcLVsyLTddfGlcXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XFwvfHNhKGdlfG1hfG1tfG1zfG55fHZhKXxzYygwMXxoXFwtfG9vfHBcXC0pfHNka1xcL3xzZShjKFxcLXwwfDEpfDQ3fG1jfG5kfHJpKXxzZ2hcXC18c2hhcnxzaWUoXFwtfG0pfHNrXFwtMHxzbCg0NXxpZCl8c20oYWx8YXJ8YjN8aXR8dDUpfHNvKGZ0fG55KXxzcCgwMXxoXFwtfHZcXC18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2xcXC18dGRnXFwtfHRlbChpfG0pfHRpbVxcLXx0XFwtbW98dG8ocGx8c2gpfHRzKDcwfG1cXC18bTN8bTUpfHR4XFwtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118XFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcXC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXNcXC18eW91cnx6ZXRvfHp0ZVxcLS9pLnRlc3QoYS5zdWJzdHIoMCw0KSkpIGNoZWNrID0gdHJ1ZTt9KShuYXZpZ2F0b3IudXNlckFnZW50fHxuYXZpZ2F0b3IudmVuZG9yKTtcbiAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH07XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcblx0XHRwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG5cdFx0cHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3Jcblx0KSB7IH1cbiBcblx0YXBwZW5kQ29tcG9uZW50VG9Cb2R5KGNvbXBvbmVudDogYW55LCBkYXRhOiBhbnkpIHtcdFx0XG5cdFx0Y29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcblx0XHRcdC5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpXG5cdFx0XHQuY3JlYXRlKHRoaXMuaW5qZWN0b3IpO1xuXG5cdFx0KDxBZENvbXBvbmVudD5jb21wb25lbnRSZWYuaW5zdGFuY2UpLmRhdGEgPSBkYXRhO1xuXHRcdHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcblx0XHRjb25zdCBkb21FbGVtID0gKGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9tRWxlbSk7XG5cdFx0XG4gICAgICAgICg8QWRDb21wb25lbnQ+Y29tcG9uZW50UmVmLmluc3RhbmNlKS5jbG9zZS5zdWJzY3JpYmUoKCkgPT4ge1xuXHRcdFx0dGhpcy5hcHBSZWYuZGV0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuXHRcdFx0Y29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG5cdH1cblxuXHRvcGVuKGltYWdlczogYW55LCBjb25maWc6IGFueSA9IHt9KXtcblx0XHRjb25maWcgPSB0aGlzLmFwcGx5Q29uZmlnRGVmYXVsdHMoZGVmYXVsdENvbmZpZywgY29uZmlnKTtcblx0XHRsZXQgZGF0YSA9IHtcblx0XHRcdGltYWdlcywgXG5cdFx0XHRjb25maWdcblx0XHR9O1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5nZXRMaWdodGJveENvbXBvbmVudCgpO1xuICAgICAgICBcblx0XHR0aGlzLmFwcGVuZENvbXBvbmVudFRvQm9keShjb21wb25lbnQsIGRhdGEpO1xuXHR9XG5cblx0Z2V0TGlnaHRib3hDb21wb25lbnQoKXtcblx0XHRyZXR1cm4gIXRoaXMuaXNNb2JpbGUgPyBMaWdodGJveENvbXBvbmVudCA6IExpZ2h0Ym94TW9iaWxlQ29tcG9uZW50O1xuXHR9XG5cblx0YXBwbHlDb25maWdEZWZhdWx0cyhkZWZhdWx0Q29uZmlnLCBjb25maWcpe1xuXHRcdGlmICghY29uZmlnLmluZGV4KXsgXG5cdFx0XHRjb25maWcuaW5kZXggPSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0Q29uZmlnLCBjb25maWcpO1xuXHR9XG59IiwiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENyeXN0YWxMaWdodGJveCB9IGZyb20nLi9kb20uc2VydmljZSdcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnY3J5c3RhbC1nYWxsZXJ5JywgXG5cdHRlbXBsYXRlOiBgPGRpdiAjY29udGVudFdyYXBwZXIgW2hpZGRlbl09XCJpc05nQ29udGVudFwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuXG48bWFzb25yeS1sYXlvdXQgXG4gICAgY2xhc3M9XCJjZy13cmFwcGVyXCJcbiAgICAqbmdJZj1cIiFpc05nQ29udGVudFwiIFxuXG4gICAgW21heC1oZWlnaHRdPVwibWFzb25yeU1heEhlaWdodFwiIFxuICAgIFtndXR0ZXJdPVwibWFzb25yeUd1dHRlclwiXG4gICAgW21hc29ucnldPVwibWFzb25yeVN0YXRlXCJcbiAgICBbY2xhc3MtbmFtZV09XCInY2ctaW1hZ2UnXCJcbiAgICBbaW1hZ2VzXT1cImltYWdlc1wiXG4gICAgKGV2ZW50cyk9XCJoYW5kbGVNYXNvbnJ5TGF5b3V0RXZlbnRzKCRldmVudClcIj48L21hc29ucnktbGF5b3V0PmAsXG4gICAgc3R5bGVzOiBbYDpob3N0e2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJX06aG9zdCAuY2ctd3JhcHBlcntkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVufTpob3N0IC5jZy13cmFwcGVyLmNnLXNob3d7aGVpZ2h0OmF1dG87cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTp0YWJsZX06aG9zdCAuY2ctaW1hZ2UgaW1ne2N1cnNvcjpwb2ludGVyO3dpZHRoOjEwMCV9YF0sXG59KVxuZXhwb3J0IGNsYXNzIEdhbGxlcnlDb21wb25lbnQge1xuXG4gICAgQElucHV0KCdpbWFnZXMnKSBpbWFnZXM6IGFueTtcbiAgICBASW5wdXQoJ2NvbmZpZycpIGNvbmZpZzogYW55ID0ge307XG5cbiAgICBAVmlld0NoaWxkKCdjb250ZW50V3JhcHBlcicpIGNvbnRlbnRXcmFwcGVyOiBFbGVtZW50UmVmO1xuXG4gICAgZ2V0IGlzTmdDb250ZW50KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBnZXQgbWFzb25yeVN0YXRlKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5tYXNvbnJ5O1xuICAgIH1cblxuICAgIGdldCBtYXNvbnJ5TWF4SGVpZ2h0KCl7XG4gICAgXHRyZXR1cm4gdGhpcy5jb25maWcubWFzb25yeU1heEhlaWdodDtcbiAgICB9XG5cbiAgICBnZXQgbWFzb25yeUd1dHRlcigpe1xuICAgIFx0cmV0dXJuIHRoaXMuY29uZmlnLm1hc29ucnlHdXR0ZXI7XG4gICAgfVxuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgbGlnaHRib3g6IENyeXN0YWxMaWdodGJveCxcblx0XHRwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWZcblx0KSB7fVxuXG5cdHNob3dMaWdodGJveChpbWFnZXM6IGFueSwgaTogbnVtYmVyKXtcbiAgICAgICAgdGhpcy5jb25maWcuaW5kZXggPSBpO1xuXHRcdHRoaXMubGlnaHRib3gub3BlbihpbWFnZXMsIHRoaXMuY29uZmlnKTtcblx0fVxuXG4gICAgaGFuZGxlTWFzb25yeUxheW91dEV2ZW50cyhldmVudCl7XG4gICAgICAgIHRoaXMuc2hvd0xpZ2h0Ym94KHRoaXMuaW1hZ2VzLCBldmVudC5pbmRleCk7XG4gICAgfVxufSIsImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2Uge1xuICAgIHBhdGg6IHN0cmluZzsgXG4gICAgd2lkdGg6IG51bWJlcjsgXG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgY29tcHV0ZWRIZWlnaHQ/OiBzdHJpbmc7XG4gICAgY29tcHV0ZWRXaWR0aD86IHN0cmluZztcbiAgICBtYXJnaW4/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlcyBleHRlbmRzIEFycmF5PEltYWdlPnt9XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbWFzb25yeS1sYXlvdXQnLCBcbiAgICB0ZW1wbGF0ZTogYDxkaXYgXG5cdFtuZ0NsYXNzXT1cIkNMQVNTX05BTUVcIlxuXHQqbmdGb3I9XCJsZXQgaW1hZ2Ugb2YgaW1hZ2VzOyBsZXQgaSA9IGluZGV4O1wiXG4gICAgW3N0eWxlLndpZHRoXT1cImltYWdlLmNvbXB1dGVkV2lkdGhcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwiaW1hZ2UuY29tcHV0ZWRIZWlnaHRcIlxuICAgIFtzdHlsZS5mbG9hdF09XCInbGVmdCdcIlxuICAgIFtzdHlsZS5tYXJnaW5dPVwiaW1hZ2UubWFyZ2luXCJcbiAgICBbc3R5bGUuYmFja2dyb3VuZF09XCInI2VlZWVlZSdcIlxuICAgIFtzdHlsZS5saW5lSGVpZ2h0XT1cIjBcIj5cblx0PGltZyBcbiAgICAgICAgI2ltYWdlRWxlbVxuICAgICAgICBbc3JjXT1cImltYWdlLnByZXZpZXcgfHwgaW1hZ2UuZnVsbFwiIFxuICAgICAgICBbc3R5bGUud2lkdGguJV09XCIxMDBcIiBcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCInYXV0bydcIlxuICAgICAgICBbc3R5bGUub3BhY2l0eV09XCIwXCJcbiAgICAgICAgKGNsaWNrKT1cImNsaWNrT25JbWFnZShpbWFnZSwgaSlcIlxuICAgICAgICAobG9hZCk9XCJvbkltYWdlTG9hZGVkKGltYWdlRWxlbSlcIiAvPlxuPC9kaXY+YCxcbn0pXG5cbmV4cG9ydCBjbGFzcyBNYXNvbnJ5TGF5b3V0Q29tcG9uZW50IHtcbiAgICBHVVRURVI6IG51bWJlciA9IDA7XG4gICAgbm9kZXM6IGFueTtcbiAgICBlbGVtOiBhbnk7XG4gICAgc2F2ZWROb2RlRGltZW5zaW9uczogYW55ID0gW107XG4gICAgb2JzZXJ2ZXI6IGFueTtcbiAgICBncmlkU3RhdGU6IHN0cmluZyA9ICdub3Qgc3RhcnRlZCc7XG4gICAgcmVzaXplVGltZXI6IGFueTtcbiAgICBjaGFuZ2VzVGltZXI6IGFueTtcblxuICAgIEBJbnB1dCgnaW1hZ2VzJykgaW1hZ2VzOiBJbWFnZXM7IFxuICAgIEBJbnB1dCgnbWFzb25yeScpIEVOQUJMRV9NQVNPTlJZOiBib29sZWFuID0gdHJ1ZTsgXG4gICAgQElucHV0KCdtYXgtaGVpZ2h0JykgTUFYX0hFSUdIVDogbnVtYmVyID0gNDAwOyBcbiAgICBASW5wdXQoJ2NsYXNzLW5hbWUnKSBDTEFTU19OQU1FOiBzdHJpbmcgfCB7IFtrZXk6IHN0cmluZ106IGFueTsgfTtcblxuICAgIEBJbnB1dCgnZ3V0dGVyJylcbiAgICBzZXQgZ3V0dGVyKHZhbHVlOiBudW1iZXIpe1xuICAgICAgICB0aGlzLkdVVFRFUiA9IHZhbHVlIC8gMjtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgZXZlbnRzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgICBcbiAgICBnZXQgaXNNb2JpbGUoKTpib29sZWFuIHtcbiAgICAgICAgdmFyIGNoZWNrID0gZmFsc2U7XG4gICAgICAgIChmdW5jdGlvbihhKXtpZigvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vL2kudGVzdChhKXx8LzEyMDd8NjMxMHw2NTkwfDNnc298NHRocHw1MFsxLTZdaXw3NzBzfDgwMnN8YSB3YXxhYmFjfGFjKGVyfG9vfHNcXC0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8XFwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3XFwtKG58dSl8YzU1XFwvfGNhcGl8Y2N3YXxjZG1cXC18Y2VsbHxjaHRtfGNsZGN8Y21kXFwtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjXFwtc3xkZXZpfGRpY2F8ZG1vYnxkbyhjfHApb3xkcygxMnxcXC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoXFwtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmXFwtNXxnXFwtbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZFxcLShtfHB8dCl8aGVpXFwtfGhpKHB0fHRhKXxocCggaXxpcCl8aHNcXC1jfGh0KGMoXFwtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aVxcLSgyMHxnb3xtYSl8aTIzMHxpYWMoIHxcXC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Y1xcLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHxcXC1bYS13XSl8bGlid3xseW54fG0xXFwtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG1cXC1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChcXC18IHxvfHYpfHp6KXxtdCg1MHxwMXx2ICl8bXdicHxteXdhfG4xMFswLTJdfG4yMFsyLTNdfG4zMCgwfDIpfG41MCgwfDJ8NSl8bjcoMCgwfDEpfDEwKXxuZSgoY3xtKVxcLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8XFwtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuXFwtMnxwbyhja3xydHxzZSl8cHJveHxwc2lvfHB0XFwtZ3xxYVxcLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8XFwtWzItN118aVxcLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGhcXC18b298cFxcLSl8c2RrXFwvfHNlKGMoXFwtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaFxcLXxzaGFyfHNpZShcXC18bSl8c2tcXC0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGhcXC18dlxcLXx2ICl8c3koMDF8bWIpfHQyKDE4fDUwKXx0NigwMHwxMHwxOCl8dGEoZ3R8bGspfHRjbFxcLXx0ZGdcXC18dGVsKGl8bSl8dGltXFwtfHRcXC1tb3x0byhwbHxzaCl8dHMoNzB8bVxcLXxtM3xtNSl8dHhcXC05fHVwKFxcLmJ8ZzF8c2kpfHV0c3R8djQwMHx2NzUwfHZlcml8dmkocmd8dGUpfHZrKDQwfDVbMC0zXXxcXC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKFxcLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhc1xcLXx5b3VyfHpldG98enRlXFwtL2kudGVzdChhLnN1YnN0cigwLDQpKSkgY2hlY2sgPSB0cnVlO30pKG5hdmlnYXRvci51c2VyQWdlbnR8fG5hdmlnYXRvci52ZW5kb3IpO1xuICAgICAgICByZXR1cm4gY2hlY2s7XG4gICAgfTtcbiAgICAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKXtcbiAgICAgICAgdGhpcy5lbGVtID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gICAgb25XaW5kb3dSZXNpemUoZXZlbnQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZXIpO1xuXG4gICAgICAgIHRoaXMucmVzaXplVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFN0YXRlID0gJ25vdCBzdGFydGVkJztcbiAgICAgICAgICAgIHRoaXMuYnVpbGRHcmlkKCk7IFxuICAgICAgICB9LCAyNTApO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmJ1aWxkR3JpZCgpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKCl7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNoYW5nZXNUaW1lcik7XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VzVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFN0YXRlID0gJ25vdCBzdGFydGVkJztcbiAgICAgICAgICAgIHRoaXMuYnVpbGRHcmlkKCk7IFxuICAgICAgICB9LCAyNTApO1xuICAgIH1cblxuICAgIGJ1aWxkR3JpZCgpe1xuICAgICAgICBsZXQgcGFyZW50V2lkdGggPSBNYXRoLmZsb29yKHRoaXMuZWxlbS5wYXJlbnROb2RlLm9mZnNldFdpZHRoKTtcbiAgICAgICAgbGV0IHRvdGFsUm93V2lkdGg6IGFueSA9IDA7IFxuICAgICAgICBsZXQgcm93OiBhbnkgPSB7XG4gICAgICAgICAgICBzdGFydEluZGV4OiAwLFxuICAgICAgICAgICAgZW5kSW5kZXg6IDAsXG4gICAgICAgICAgICBsZW5ndGg6IDAsXG4gICAgICAgICAgICB0b3RhbFdpZHRoOiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0aGlzLmltYWdlcyB8fCAhdGhpcy5pbWFnZXMubGVuZ3RoKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWxlbS5zdHlsZS53aWR0aCA9IHBhcmVudFdpZHRoICsncHgnO1xuICAgICAgICB0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9ICd0YWJsZSc7XG5cbiAgICAgICAgdGhpcy5pbWFnZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChyb3cudG90YWxXaWR0aCA9PT0gMCl7XG4gICAgICAgICAgICAgICAgcm93LnN0YXJ0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICByb3cubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcm93Lmxlbmd0aCsrO1xuICAgICAgICAgICAgcm93LnRvdGFsV2lkdGggKz0gdGhpcy5nZXRDb21wdXRlZFdpZHRoKGluZGV4KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJvdy50b3RhbFdpZHRoID49IHBhcmVudFdpZHRoIHx8IHRoaXMuaXNMYXN0Q2hpbGQoaW5kZXgpKXtcbiAgICAgICAgICAgICAgICByb3cuZW5kSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICBsZXQgc2NhbGluZyA9IHJvdy50b3RhbFdpZHRoL3BhcmVudFdpZHRoO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb2xEaW1lbnNpb25zKHNjYWxpbmcsIHJvdyk7XG4gICAgICAgICAgICAgICAgcm93LnRvdGFsV2lkdGggPSAwOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0Q29sRGltZW5zaW9ucyhzY2FsaW5nOiBudW1iZXIsIHJvdzogYW55KXtcbiAgICAgICAgbGV0IHRvdGFsUm93V2lkdGg6IGFueSA9IDA7XG4gICAgICAgIGxldCBwYXJlbnRXaWR0aCA9IHRoaXMuZWxlbS5wYXJlbnROb2RlLm9mZnNldFdpZHRoO1xuICAgICAgICBzY2FsaW5nID0gKHNjYWxpbmcgPCAxKSA/IDEgOiBzY2FsaW5nO1xuXG4gICAgICAgIHRoaXMuaW1hZ2VzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuRU5BQkxFX01BU09OUlkpe1xuICAgICAgICAgICAgICAgIG5vZGUuY29tcHV0ZWRIZWlnaHQgPSB0aGlzLk1BWF9IRUlHSFQgKyAncHgnO1xuICAgICAgICAgICAgICAgIG5vZGUuY29tcHV0ZWRXaWR0aCA9IHRoaXMuZ2V0Q29tcHV0ZWRXaWR0aChpbmRleCkgKyAncHgnO1xuICAgICAgICAgICAgICAgIG5vZGUubWFyZ2luID0gdGhpcy5nZXROb2RlTWFyZ2luKHBhcmVudFdpZHRoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbmRleCA+PSByb3cuc3RhcnRJbmRleCAmJiBpbmRleCA8PSByb3cuZW5kSW5kZXgpe1xuICAgICAgICAgICAgICAgIGxldCBub2RlV2lkdGg7XG5cbiAgICAgICAgICAgICAgICAvLyBsYXN0IGltYWdlXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSByb3cuZW5kSW5kZXggJiYgc2NhbGluZyA+IDEpeyBcbiAgICAgICAgICAgICAgICAgICAgbm9kZVdpZHRoID0gKDEwMCAtIHRvdGFsUm93V2lkdGgpIC0gKCh0aGlzLkdVVFRFUiAqIDIpIC8gcGFyZW50V2lkdGggKiAxMDApO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmNvbXB1dGVkV2lkdGggPSAnY2FsYygnK25vZGVXaWR0aCsnJSknO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyaWRTdGF0ZSA9PT0gJ25vdCBzdGFydGVkJyl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZSA9ICdwcmUtYnVpbGRpbmcnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkR3JpZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVXaWR0aCA9ICgodGhpcy5nZXRDb21wdXRlZFdpZHRoKGluZGV4KSAvIHNjYWxpbmcpIC8gcGFyZW50V2lkdGggKiAxMDApIC0gKChyb3cubGVuZ3RoICogKHRoaXMuR1VUVEVSICogMikpICogKHRoaXMuZ2V0Q29tcHV0ZWRXaWR0aChpbmRleCkgLyBzY2FsaW5nKSAvIHBhcmVudFdpZHRoKSAvIHBhcmVudFdpZHRoICogMTAwO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmNvbXB1dGVkV2lkdGggPSAnY2FsYygnK25vZGVXaWR0aCsnJSknO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdG90YWxSb3dXaWR0aCArPSBub2RlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUm93V2lkdGggKz0gKHRoaXMuR1VUVEVSIC8gcGFyZW50V2lkdGggKiAxMDApICogMjsgIFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGxhc3Qgcm93IGFuZCBsYXN0IGltYWdlXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSByb3cuZW5kSW5kZXggJiYgcm93Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLmlzTW9iaWxlKXtcbiAgICAgICAgICAgICAgICBcdG5vZGVXaWR0aCA9IDEwMCAtICgodGhpcy5HVVRURVIgKiAyKSAvIHBhcmVudFdpZHRoICogMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IG5vZGUuaGVpZ2h0ICogKCBwYXJlbnRXaWR0aCAqIChub2RlV2lkdGggLyAxMDApIC8gbm9kZS53aWR0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodC8yIDwgdGhpcy5NQVhfSEVJR0hUKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY29tcHV0ZWRXaWR0aCA9ICdjYWxjKCcrbm9kZVdpZHRoKyclKSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBub2RlLm1hcmdpbiA9IHRoaXMuZ2V0Tm9kZU1hcmdpbihwYXJlbnRXaWR0aCk7XG4gICAgICAgICAgICAgICAgbm9kZS5jb21wdXRlZEhlaWdodCA9IG5vZGUuaGVpZ2h0ICogKCBwYXJlbnRXaWR0aCAqIChub2RlV2lkdGggLyAxMDApIC8gbm9kZS53aWR0aCkgKyAncHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRDb21wdXRlZFdpZHRoKGluZGV4OiBudW1iZXIpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbaW5kZXhdLndpZHRoIC8gKHRoaXMuaW1hZ2VzW2luZGV4XS5oZWlnaHQgLyB0aGlzLk1BWF9IRUlHSFQpO1xuICAgIH1cblxuICAgIGlzTGFzdENoaWxkKGluZGV4OiBudW1iZXIpe1xuICAgICAgICByZXR1cm4gaW5kZXggKyAxID09PSB0aGlzLmltYWdlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0Tm9kZU1hcmdpbihwYXJlbnRXaWR0aDogbnVtYmVyKXtcbiAgICAgICAgcmV0dXJuICdjYWxjKCcrdGhpcy5HVVRURVIgLyBwYXJlbnRXaWR0aCAqIDEwMCsnJSknO1xuICAgIH1cblxuICAgIGNsaWNrT25JbWFnZShpbWFnZTogYW55LCBpOiBudW1iZXIpe1xuICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KHtcbiAgICAgICAgICAgIHR5cGU6ICdjbGljay1vbi1pbWFnZScsXG4gICAgICAgICAgICBpbWFnZTogaW1hZ2UsXG4gICAgICAgICAgICBpbmRleDogaVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkltYWdlTG9hZGVkKGVsZW0pe1xuICAgICAgICBlbGVtLnN0eWxlLm9wYWNpdHkgPSAxO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3BpbmNoXSdcbn0pXG5cbmV4cG9ydCBjbGFzcyBQaW5jaERpcmVjdGl2ZXtcblxuICAgIGVsZW06IGFueTtcbiAgICBldmVudFR5cGU6IGFueTtcblxuICAgIHNjYWxlOiBhbnkgPSAxO1xuICAgIGluaXRpYWxTY2FsZTogYW55ID0gMTtcblxuICAgIHN0YXJ0WDogYW55O1xuICAgIHN0YXJ0WTogYW55O1xuXG4gICAgbW92ZVg6IGFueSA9IDA7XG4gICAgbW92ZVk6IGFueSA9IDA7XG4gICAgaW5pdGlhbE1vdmVYOiBhbnkgPSAwO1xuICAgIGluaXRpYWxNb3ZlWTogYW55ID0gMDtcblxuICAgIG1vdmVYQzogYW55O1xuICAgIG1vdmVZQzogYW55O1xuXG4gICAgZGlzdGFuY2U6IGFueTtcbiAgICBpbml0aWFsRGlzdGFuY2U6IGFueTtcblxuICAgIGlzTmV4dEltYWdlTG9hZGVkOiBhbnkgPSB0cnVlO1xuXG4gICAgQElucHV0KCkgaXNMYXN0OiBhbnk7XG4gICAgQElucHV0KCkgaXNGaXJzdDogYW55O1xuXG4gICAgQE91dHB1dCgpIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKXtcbiAgICAgICAgdGhpcy5lbGVtID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gICAgdG91Y2hzdGFydEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5lbGVtLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICcwIDAnO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3RvdWNobW92ZScsIFsnJGV2ZW50J10pXG4gICAgdG91Y2htb3ZlSGFuZGxlcihldmVudCkge1xuICAgICAgICBsZXQgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXM7XG5cbiAgICAgICAgaWYgKHRvdWNoZXMubGVuZ3RoID09PSAxICYmIHRoaXMuc2NhbGUgPT09IDEgJiYgIXRoaXMuZXZlbnRUeXBlIHx8IHRoaXMuZXZlbnRUeXBlID09ICdzd2lwZScpe1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTmV4dEltYWdlTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZXZlbnRUeXBlKXtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVg7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFkgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VZO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50VHlwZSA9ICdzd2lwZSc7XG5cbiAgICAgICAgICAgIHRoaXMubW92ZVggPSB0aGlzLmluaXRpYWxNb3ZlWCArIChldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gdGhpcy5zdGFydFgpO1xuICAgICAgICAgICAgdGhpcy5tb3ZlWSA9IDA7XG5cbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtRWxlbSgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgICB0b3VjaGVuZEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgbGV0IHRvdWNoZXMgPSBldmVudC50b3VjaGVzO1xuICAgICAgICBsZXQgaW1nID0gdGhpcy5lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW1nXCIpWzBdO1xuXG4gICAgICAgIGlmICghdGhpcy5pc05leHRJbWFnZUxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5zY2FsZSA8IDEpe1xuICAgICAgICAgICAgdGhpcy5zY2FsZSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW92ZVkgPiAwKXtcbiAgICAgICAgICAgIHRoaXMubW92ZVkgPSAwO1xuICAgICAgICB9IFxuXG4gICAgICAgIGlmICh0aGlzLm1vdmVYID4gMTAwKXtcbiAgICAgICAgICAgIHRoaXMuc2xpZGUoJ3ByZXYnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vdmVYIDwgLTEwMCl7XG4gICAgICAgICAgICB0aGlzLnNsaWRlKCduZXh0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVYID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdGlhbFNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICAgICAgdGhpcy5pbml0aWFsTW92ZVggPSB0aGlzLm1vdmVYO1xuICAgICAgICB0aGlzLmluaXRpYWxNb3ZlWSA9IHRoaXMubW92ZVk7XG5cbiAgICAgICAgdGhpcy50cmFuc2Zvcm1FbGVtKDIwMCk7IFxuXG4gICAgICAgIHRoaXMuZXZlbnRUeXBlID0gJ3RvdWNoZW5kJzsgICAgICAgIFxuICAgICAgICBpZiAodG91Y2hlcy5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICB0aGlzLmV2ZW50VHlwZSA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2xpZGUoZXZlbnQ6IGFueSl7XG4gICAgICAgIHRoaXMub25TbGlkZShldmVudCk7XG5cbiAgICAgICAgaWYgKGV2ZW50ID09PSAncHJldicpe1xuICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IHdpbmRvdy5pbm5lcldpZHRoICsgODsgXG4gICAgICAgICAgICBpZiAodGhpcy5pc0ZpcnN0KXtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVYID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQgPT09ICduZXh0Jyl7XG4gICAgICAgICAgICB0aGlzLm1vdmVYID0gLXdpbmRvdy5pbm5lcldpZHRoIC0gODtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGFzdCl7XG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzTmV4dEltYWdlTG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vdmVYID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbE1vdmVYID0gMDtcbiAgICAgICAgICAgIHRoaXMuaXNOZXh0SW1hZ2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICB9LCAyMDApO1xuICAgIH1cblxuICAgIG9uU2xpZGUoZXZlblR5cGU6YW55KSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoZXZlblR5cGUpO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybUVsZW0oZHVyYXRpb246IGFueSA9IDUwKXtcbiAgICAgICAgbGV0IG1hdHJpeFZhbCA9ICdtYXRyaXgoJysgTnVtYmVyKHRoaXMuc2NhbGUpICsnLCcrIDAgKycsJysgMCArJywnKyBOdW1iZXIodGhpcy5zY2FsZSkgKycsJysgTnVtYmVyKHRoaXMubW92ZVgpICsnLCcrIE51bWJlcih0aGlzLm1vdmVZKSArJyknO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5lbGVtLnN0eWxlLnRyYW5zaXRpb24gPSAnYWxsICcrIGR1cmF0aW9uICsnbXMnO1xuICAgICAgICB0aGlzLmVsZW0uc3R5bGUudHJhbnNmb3JtID0gbWF0cml4VmFsO1xuICAgICAgICB0aGlzLmVsZW0uc3R5bGUud2Via2l0VHJhbnNmb3JtID0gbWF0cml4VmFsO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IExpZ2h0Ym94Q29tcG9uZW50IH0gZnJvbSAnLi9saWdodGJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlnaHRib3hNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuL2xpZ2h0Ym94LW1vYmlsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FsbGVyeUNvbXBvbmVudCB9IGZyb20gJy4vZ2FsbGVyeS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3J5c3RhbExpZ2h0Ym94IH0gZnJvbScuL2RvbS5zZXJ2aWNlJyBcbmltcG9ydCB7IE1hc29ucnlMYXlvdXRDb21wb25lbnQgfSBmcm9tICcuL21hc29ucnktbGF5b3V0LmNvbXBvbmVudCc7IFxuaW1wb3J0IHsgUGluY2hEaXJlY3RpdmUgfSBmcm9tICcuL3BpbmNoLmRpcmVjdGl2ZSc7IFxuXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBMaWdodGJveENvbXBvbmVudCxcbiAgICAgICAgTGlnaHRib3hNb2JpbGVDb21wb25lbnQsXG4gICAgICAgIEdhbGxlcnlDb21wb25lbnQsXG4gICAgICAgIE1hc29ucnlMYXlvdXRDb21wb25lbnQsXG4gICAgICAgIFBpbmNoRGlyZWN0aXZlXG4gICAgXSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZVxuICAgIF0sXG4gICAgZXhwb3J0czogW1xuICAgICAgICBHYWxsZXJ5Q29tcG9uZW50XG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgQ3J5c3RhbExpZ2h0Ym94XG4gICAgXSxcbiAgICBib290c3RyYXA6IFtcbiAgICAgICAgXG4gICAgXSxcbiAgICBlbnRyeUNvbXBvbmVudHM6IFtcbiAgICAgICAgTGlnaHRib3hDb21wb25lbnQsXG4gICAgICAgIExpZ2h0Ym94TW9iaWxlQ29tcG9uZW50XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBDcnlzdGFsR2FsbGVyeU1vZHVsZSB7IH1cbiJdLCJuYW1lcyI6WyJkZWZhdWx0Q29uZmlnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7Ozs7O0lBNklJLFlBQW9CLFVBQXNCLEVBQVUsR0FBc0I7UUFBdEQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO2lDQTNGOUMsQ0FBQzs2QkFDTCxFQUFFO2lDQUNFLEVBQUU7cUJBSXRCLElBQUksWUFBWSxFQUFFOzRCQUU0QixLQUFLOzRCQUNJLEtBQUs7S0FtRm5FOzs7O0lBM0VELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDM0I7Ozs7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0tBQzNCOzs7O0lBRUQsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7S0FDakM7Ozs7SUFFRCxJQUFJLGFBQWE7O1FBQ2IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEMsSUFBSSxDQUFDLEtBQUssRUFBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFDO1lBQ1gsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1NBQzNCO1FBRUQs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