UNPKG

ngx-crystal-gallery

Version:

Responsive gallery with support for masonry layout and lightbox.

350 lines (346 loc) 35.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, EventEmitter, HostBinding, HostListener, ViewChild, ElementRef, ChangeDetectorRef } from '@angular/core'; export 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'],] }] }; if (false) { /** @type {?} */ LightboxMobileComponent.prototype._index; /** @type {?} */ LightboxMobileComponent.prototype.prevIndex; /** @type {?} */ LightboxMobileComponent.prototype.nextIndex; /** @type {?} */ LightboxMobileComponent.prototype.currImage; /** @type {?} */ LightboxMobileComponent.prototype.prevImage; /** @type {?} */ LightboxMobileComponent.prototype.nextImage; /** @type {?} */ LightboxMobileComponent.prototype.wrapperProp; /** @type {?} */ LightboxMobileComponent.prototype.landscapeMode; /** @type {?} */ LightboxMobileComponent.prototype.close; /** @type {?} */ LightboxMobileComponent.prototype.data; /** @type {?} */ LightboxMobileComponent.prototype.wrapperEl; /** @type {?} */ LightboxMobileComponent.prototype.lightboxShown; /** @type {?} */ LightboxMobileComponent.prototype.elementRef; /** @type {?} */ LightboxMobileComponent.prototype.ref; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3gtbW9iaWxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1jcnlzdGFsLWdhbGxlcnkvIiwic291cmNlcyI6WyJsaWIvbGlnaHRib3gtbW9iaWxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFVLFdBQVcsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTBDNUksTUFBTTs7Ozs7SUE0R0YsWUFBb0IsVUFBc0IsRUFBVSxHQUFzQjtRQUF0RCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7eUJBdkc5RDtZQUNSLElBQUksRUFBRSxLQUFLO1lBQ1gsTUFBTSxFQUFFLEtBQUs7WUFDYixLQUFLLEVBQUUsQ0FBQztTQUNYO3lCQUVXO1lBQ1IsTUFBTSxFQUFFLEtBQUs7U0FDaEI7eUJBRVc7WUFDUixNQUFNLEVBQUUsS0FBSztTQUNoQjtxQkFLSSxJQUFJLFlBQVksRUFBRTs2QkE4RWdDLEtBQUs7S0FTM0Q7Ozs7SUFqRkQsSUFBSSxNQUFNO1FBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0tBQzNCOzs7O0lBRUQsSUFBSSxNQUFNO1FBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0tBQzNCOzs7O0lBRUQsSUFBSSxLQUFLO1FBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0tBQy9COzs7O0lBRUQsSUFBSSxhQUFhOztRQUNiLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUEsQ0FBQztZQUNSLE1BQU0s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QUM7WUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0QjtRQUNELEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQSxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdEI7S0FDSjs7OztJQUVELHNCQUFzQjs7UUFDbEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLDBCQUEwQixDQUFDO1FBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLDBCQUEwQixDQUFDO0tBQzNEOzs7WUFyUkosU0FBUyxTQUFDO2dCQUNWLFFBQVEsRUFBRSx5QkFBeUI7Z0JBQ25DLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQ0o7Z0JBQ0gsTUFBTSxFQUFFLENBQUMsdXRIQUF1dEgsQ0FBQzthQUNwdUg7Ozs7WUF6Q3NGLFVBQVU7WUFBRSxpQkFBaUI7OzttQkFrRS9HLEtBQUs7d0JBRUwsU0FBUyxTQUFDLFNBQVM7NEJBMEVuQixXQUFXLFNBQUMsZUFBZTs2QkFFM0IsWUFBWSxTQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ2NyeXN0YWwtbGlnaHRib3gtbW9iaWxlJyxcblx0dGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiY2ctYmFja1wiIChjbGljayk9XCJjbG9zZUxpZ2h0Ym94KClcIj48L2Rpdj5cblxuPGRpdiBcblx0Y2xhc3M9XCJjZy13cmFwcGVyXCIgXG5cdFtjbGFzcy5jZy1sYW5kc2NhcGVdPVwibGFuZHNjYXBlTW9kZVwiXG5cdHBpbmNoIFtpc0xhc3RdPVwiaXNMYXN0XCIgW2lzRmlyc3RdPVwiaXNGaXJzdFwiIChldmVudHMpPVwiaGFuZGxlUGluY2hFdmVudHMoJGV2ZW50KVwiXG5cdCN3cmFwcGVyPlxuXHQ8ZGl2IGNsYXNzPVwiY2ctaW1hZ2Utd3JhcCBjZy1wcmV2LWltYWdlXCI+XG5cdFx0PGltZyBcblx0XHRcdCpuZ0lmPVwicHJldkltYWdlUGF0aFwiXG5cdFx0XHRbc3JjXT1cInByZXZJbWFnZVBhdGguZnVsbFwiIFxuXHRcdFx0W2NsYXNzLmNnLWhpZGVdPVwiIXByZXZJbWFnZS5sb2FkZWRcIlxuXHRcdFx0KGxvYWQpPVwib25JbWFnZUxvYWRlZCgncHJldkltYWdlJylcIlxuXHRcdC8+XG5cdFx0PGRpdiBjbGFzcz1cImNnLXNwaW5uZXJcIiAqbmdJZj1cIiFwcmV2SW1hZ2UubG9hZGVkICYmIHByZXZJbWFnZVBhdGhcIj48L2Rpdj5cblx0PC9kaXY+XG5cblx0PGRpdiBjbGFzcz1cImNnLWltYWdlLXdyYXAgY2ctY3Vyci1pbWFnZVwiICpuZ0lmPVwiY3VyckltYWdlLnNob3dcIj5cblx0XHQ8aW1nIFxuXHRcdFx0W3NyY109XCJjdXJySW1hZ2VQYXRoPy5mdWxsXCIgXG5cdFx0XHRbY2xhc3MuY2ctaGlkZV09XCIhY3VyckltYWdlLmxvYWRlZFwiIFxuXHRcdFx0KGxvYWQpPVwib25JbWFnZUxvYWRlZCgnY3VyckltYWdlJylcIlxuXHRcdC8+XG5cdFx0PGRpdiBjbGFzcz1cImNnLXNwaW5uZXJcIiAqbmdJZj1cIiFjdXJySW1hZ2UubG9hZGVkXCI+PC9kaXY+XG5cdDwvZGl2PlxuXHRcblx0PGRpdiBjbGFzcz1cImNnLWltYWdlLXdyYXAgY2ctbmV4dC1pbWFnZVwiPlxuXHRcdDxpbWcgXG5cdFx0XHQqbmdJZj1cIm5leHRJbWFnZVBhdGhcIlxuXHRcdFx0W3NyY109XCJuZXh0SW1hZ2VQYXRoLmZ1bGxcIiBcblx0XHRcdFtjbGFzcy5jZy1oaWRlXT1cIiFuZXh0SW1hZ2UubG9hZGVkXCIgXG5cdFx0XHQobG9hZCk9XCJvbkltYWdlTG9hZGVkKCduZXh0SW1hZ2UnKVwiXG5cdFx0Lz5cblx0XHQ8ZGl2IGNsYXNzPVwiY2ctc3Bpbm5lclwiICpuZ0lmPVwiIW5leHRJbWFnZS5sb2FkZWQgJiYgbmV4dEltYWdlUGF0aFwiPjwvZGl2PlxuXHQ8L2Rpdj5cbjwvZGl2PmAsXG4gICAgc3R5bGVzOiBbYC5fY2ctc3Bpbm5lciwuX2NnLXNwaW5uZXI6YWZ0ZXJ7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6MzZweDtoZWlnaHQ6MzZweH0uX2NnLXNwaW5uZXJ7bWFyZ2luOjAgYXV0bztmb250LXNpemU6MTBweDtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWluZGVudDotOTk5OWVtO2JvcmRlci10b3A6NHB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjIpO2JvcmRlci1yaWdodDo0cHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMik7Ym9yZGVyLWJvdHRvbTo0cHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMik7Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkICNmZmY7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKTstd2Via2l0LWFuaW1hdGlvbjouOXMgbGluZWFyIGluZmluaXRlIGxvYWQ4O2FuaW1hdGlvbjouOXMgbGluZWFyIGluZmluaXRlIGxvYWQ4fUAtd2Via2l0LWtleWZyYW1lcyBsb2FkOHswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBsb2FkOHswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19LmNnLXNwaW5uZXIsLmNnLXNwaW5uZXI6YWZ0ZXIsLmNnLXNwaW5uZXI6YmVmb3Jle2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7LXdlYmtpdC1hbmltYXRpb246MS41cyBlYXNlLWluLW91dCBpbmZpbml0ZSBsb2FkNzthbmltYXRpb246MS41cyBlYXNlLWluLW91dCBpbmZpbml0ZSBsb2FkN30uY2ctc3Bpbm5lcntjb2xvcjojZmZmO2ZvbnQtc2l6ZToxMHB4O21hcmdpbjowIGF1dG8gMjBweDtwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWluZGVudDotOTk5OWVtOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LS4xNnM7YW5pbWF0aW9uLWRlbGF5Oi0uMTZzfS5jZy1zcGlubmVyOmFmdGVyLC5jZy1zcGlubmVyOmJlZm9yZXtjb250ZW50OlwiXCI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjB9LmNnLXNwaW5uZXI6YmVmb3Jle2xlZnQ6LTNlbTstd2Via2l0LWFuaW1hdGlvbi1kZWxheTotLjMyczthbmltYXRpb24tZGVsYXk6LS4zMnN9LmNnLXNwaW5uZXI6YWZ0ZXJ7bGVmdDozZW19QC13ZWJraXQta2V5ZnJhbWVzIGxvYWQ3ezAlLDEwMCUsODAle2JveC1zaGFkb3c6MCAyLjVlbSAwIC0xLjNlbX00MCV7Ym94LXNoYWRvdzowIDIuNWVtIDAgMH19QGtleWZyYW1lcyBsb2FkN3swJSwxMDAlLDgwJXtib3gtc2hhZG93OjAgMTBweCAwIC0xLjNlbX00MCV7Ym94LXNoYWRvdzowIDEwcHggMCAwfX06aG9zdCguY2ctc2hvdyl7b3BhY2l0eToxfTpob3N0KC5jZy1oaWRlLWNvbnRyb2xzKSAuY2ctY2xvc2UsOmhvc3QoLmNnLWhpZGUtY29udHJvbHMpIC5jZy1uZXh0LDpob3N0KC5jZy1oaWRlLWNvbnRyb2xzKSAuY2ctcHJldntvcGFjaXR5OjB9Omhvc3R7b3BhY2l0eTowO3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2NvbG9yOiNmZmY7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246b3BhY2l0eSAuMnMgY3ViaWMtYmV6aWVyKC42NDUsLjA0NSwuMzU1LDEpO3otaW5kZXg6MTAwMDA7YmFja2dyb3VuZC1jb2xvcjojMDAwfTpob3N0IC5jZy1iYWNre2JhY2tncm91bmQ6dXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCB2ZXJzaW9uJTNEJTIyMS4wJTIyIGVuY29kaW5nJTNEJTIyVVRGLTglMjIlM0YlM0UlM0Nzdmcgd2lkdGglM0QlMjIxMHB4JTIyIGhlaWdodCUzRCUyMjE2cHglMjIgdmlld0JveCUzRCUyMjAgMCAxMCAxNiUyMiB2ZXJzaW9uJTNEJTIyMS4xJTIyIHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyIHhtbG5zJTNBeGxpbmslM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjE5OTklMkZ4bGluayUyMiUzRSAgICAlM0MhLS0gR2VuZXJhdG9yJTNBIHNrZXRjaHRvb2wgNDAuMiAoMzM4MjYpIC0gaHR0cCUzQSUyRiUyRnd3dy5ib2hlbWlhbmNvZGluZy5jb20lMkZza2V0Y2ggLS0lM0UgICAgJTNDdGl0bGUlM0UxMUE3Mzg3Mi01RUJGLTQ2RjYtQjdDNS0xNDJENDdBMzMzMzklM0MlMkZ0aXRsZSUzRSAgICAlM0NkZXNjJTNFQ3JlYXRlZCB3aXRoIHNrZXRjaHRvb2wuJTNDJTJGZGVzYyUzRSAgICAlM0NkZWZzJTNFJTNDJTJGZGVmcyUzRSAgICAlM0NnIGlkJTNEJTIySW50ZXJmYWNlLTEyODAteC04MDAlMjIgc3Ryb2tlJTNEJTIybm9uZSUyMiBzdHJva2Utd2lkdGglM0QlMjIxJTIyIGZpbGwlM0QlMjJub25lJTIyIGZpbGwtcnVsZSUzRCUyMmV2ZW5vZGQlMjIlM0UgICAgICAgICUzQ2cgaWQlM0QlMjJMb3Rfdmlld3BhZ2Vfb3BlbiUyMiB0cmFuc2Zvcm0lM0QlMjJ0cmFuc2xhdGUoLTExMS4wMDAwMDAlMkMgLTI5Ni4wMDAwMDApJTIyIGZpbGwlM0QlMjIlMjNGRkZGRkYlMjIlM0UgICAgICAgICAgICAlM0NnIGlkJTNEJTIyYXJyb3dzLTE2cHgtMV9taW5pbWFsLWxlZnQlMjIgdHJhbnNmb3JtJTNEJTIydHJhbnNsYXRlKDExMS4wMDAwMDAlMkMgMjk2LjAwMDAwMCklMjIlM0UgICAgICAgICAgICAgICAgJTNDcG9seWdvbiBpZCUzRCUyMlNoYXBlJTIyIHBvaW50cyUzRCUyMjguMSAxNS43IDAuNCA4IDguMSAwLjMgOS42IDEuNyAzLjMgOCA5LjYgMTQuMyUyMiUzRSUzQyUyRnBvbHlnb24lM0UgICAgICAgICAgICAlM0MlMkZnJTNFICAgICAgICAlM0MlMkZnJTNFICAgICUzQyUyRmclM0UlM0MlMkZzdmclM0VcIikgY2VudGVyLzEycHggbm8tcmVwZWF0O3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7b3BhY2l0eTouOTtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7ei1pbmRleDoxMDAwfTpob3N0IC5jZy13cmFwcGVyLmNnLWxhbmRzY2FwZSAuY2ctaW1hZ2Utd3JhcCBpbWd7aGVpZ2h0OjEwMCV9Omhvc3QgLmNnLXdyYXBwZXJ7dHJhbnNpdGlvbjpub25lO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ZGlzcGxheTpibG9ja306aG9zdCAuY2ctd3JhcHBlciAuY2ctaW1hZ2Utd3JhcC5jZy1wcmV2LWltYWdley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKGNhbGMoLTEwMCUgLSA4cHgpLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKGNhbGMoLTEwMCUgLSA4cHgpLDAsMCl9Omhvc3QgLmNnLXdyYXBwZXIgLmNnLWltYWdlLXdyYXAuY2ctbmV4dC1pbWFnZXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZChjYWxjKDEwMCUgKyA4cHgpLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKGNhbGMoMTAwJSArIDhweCksMCwwKX06aG9zdCAuY2ctd3JhcHBlciAuY2ctaW1hZ2Utd3JhcHt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RleHQtYWxpZ246Y2VudGVyO3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn06aG9zdCAuY2ctd3JhcHBlciAuY2ctaW1hZ2Utd3JhcCBpbWd7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlO3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87cG9zaXRpb246cmVsYXRpdmV9Omhvc3QgLmNnLXdyYXBwZXIgLmNnLWltYWdlLXdyYXAgaW1nLmNnLWhpZGV7ZGlzcGxheTpub25lfWBdXG59KVxuZXhwb3J0IGNsYXNzIExpZ2h0Ym94TW9iaWxlQ29tcG9uZW50IHsgXG5cdF9pbmRleDogYW55O1xuICAgIHByZXZJbmRleDogYW55O1xuICAgIG5leHRJbmRleDogYW55O1xuXG4gICAgY3VyckltYWdlID0ge1xuICAgICAgICBzaG93OiBmYWxzZSxcbiAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgaW5kZXg6IDBcbiAgICB9OyBcblxuICAgIHByZXZJbWFnZSA9IHtcbiAgICAgICAgbG9hZGVkOiBmYWxzZVxuICAgIH07IFxuXG4gICAgbmV4dEltYWdlID0ge1xuICAgICAgICBsb2FkZWQ6IGZhbHNlXG4gICAgfTsgXG5cbiAgICB3cmFwcGVyUHJvcDogYW55O1xuICAgIGxhbmRzY2FwZU1vZGU6IGFueTtcblxuXHRjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcblxuICAgIEBWaWV3Q2hpbGQoJ3dyYXBwZXInKSB3cmFwcGVyRWw6IEVsZW1lbnRSZWY7XG5cbiAgICBnZXQgaW1hZ2VzKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuaW1hZ2VzO1xuICAgIH1cblxuICAgIGdldCBjb25maWcoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jb25maWc7XG4gICAgfVxuXG4gICAgZ2V0IGluZGV4KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJJbWFnZS5pbmRleDtcbiAgICB9XG5cbiAgICBnZXQgY3VyckltYWdlUGF0aCgpe1xuICAgICAgICBsZXQgaW1hZ2UgPSB0aGlzLmltYWdlc1t0aGlzLmluZGV4XTtcblxuICAgICAgICBpZiAoIWltYWdlKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbWFnZS5wYXRoKXtcbiAgICAgICAgICAgIGltYWdlLmZ1bGwgPSBpbWFnZS5wYXRoO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgfVxuXG4gICAgZ2V0IHByZXZJbWFnZVBhdGgoKXtcbiAgICAgICAgaWYgKHRoaXMucHJldkluZGV4IDwgMCAmJiB0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgIHRoaXMucHJldkluZGV4ID0gdGhpcy5sYXRlc3RJbWFnZUluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGltYWdlID0gdGhpcy5pbWFnZXNbdGhpcy5wcmV2SW5kZXhdO1xuXG4gICAgICAgIGlmIChpbWFnZSAmJiBpbWFnZS5wYXRoKXtcbiAgICAgICAgICAgIGltYWdlLmZ1bGwgPSBpbWFnZS5wYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbWFnZTtcbiAgICB9XG5cbiAgICBnZXQgbmV4dEltYWdlUGF0aCgpe1xuICAgICAgICBsZXQgaW1hZ2UgPSB0aGlzLmltYWdlc1t0aGlzLm5leHRJbmRleF07XG5cbiAgICAgICAgaWYgKGltYWdlICYmIGltYWdlLnBhdGgpe1xuICAgICAgICAgICAgaW1hZ2UuZnVsbCA9IGltYWdlLnBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH1cblxuICAgIGdldCBpc0ZpcnN0KCl7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb29wKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICBcdCAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpc0xhc3QoKXtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvb3Ape1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IHRoaXMubGF0ZXN0SW1hZ2VJbmRleDtcbiAgICAgICAgfSAgICAgICAgXG4gICAgfVxuXG4gICAgZ2V0IGxhdGVzdEltYWdlSW5kZXgoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzLmxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgZ2V0IGlzTGFuZHNjYXBlKCl7XG4gICAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA+IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNnLXNob3cnKSBsaWdodGJveFNob3duOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgICBvbldpbmRvd1Jlc2l6ZShldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMubGFuZHNjYXBlTW9kZSA9IHRoaXMuaXNMYW5kc2NhcGU7XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZil7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKXtcbiAgICAgICAgdGhpcy5jdXJySW1hZ2UuaW5kZXggPSB0aGlzLmNvbmZpZy5pbmRleDtcbiAgICAgICAgdGhpcy5wcmV2SW5kZXggPSB0aGlzLmN1cnJJbWFnZS5pbmRleC0xO1xuICAgICAgICB0aGlzLm5leHRJbmRleCA9IHRoaXMuY3VyckltYWdlLmluZGV4KzE7XG5cbiAgICAgICAgdGhpcy5zaG93TGlnaHRib3goKTtcbiAgICB9XG5cbiAgICBzaG93TGlnaHRib3goKXtcbiAgICAgICAgdGhpcy5jdXJySW1hZ2Uuc2hvdyA9IHRydWU7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICB0aGlzLmxpZ2h0Ym94U2hvd24gPSB0cnVlO1xuICAgICAgICB9LCAzMCk7XG4gICAgfVxuXG5cdGNsb3NlTGlnaHRib3goKXtcblx0XHR0aGlzLmxpZ2h0Ym94U2hvd24gPSBmYWxzZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgIHRoaXMuY2xvc2UuZW1pdCh0cnVlKTtcbiAgICAgICAgfSwgMjAwKTsgXG5cdH1cblxuICAgIHNsaWRlKGV2ZW50OiBhbnkpe1xuICAgICAgICBpZiAoZXZlbnQgPT09ICduZXh0Jyl7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGFzdCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2UuaW5kZXgrKztcbiAgICAgICAgICAgICAgICB9LCAyMDApOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IHRoaXMubGF0ZXN0SW1hZ2VJbmRleCl7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyckltYWdlLmluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB9LCAyMDApOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlclNsaWRlKCduZXh0Jyk7XG4gICAgICAgICAgICB9LCAzMDApOyBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudCA9PT0gJ3ByZXYnKXtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNGaXJzdCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJySW1hZ2UuaW5kZXgtLTtcbiAgICAgICAgICAgICAgICB9LCAyMDApOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IDApe1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZS5pbmRleCA9IHRoaXMubGF0ZXN0SW1hZ2VJbmRleDtcbiAgICAgICAgICAgICAgICB9LCAyMDApOyBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlclNsaWRlKCdwcmV2Jyk7XG4gICAgICAgICAgICB9LCAzMDApOyBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFmdGVyU2xpZGUoZXZlbnRUeXBlOiBhbnkpe1xuICAgICAgICB0aGlzLmN1cnJJbWFnZS5zaG93ID0gdHJ1ZTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09PSB0aGlzLmxhdGVzdEltYWdlSW5kZXggJiYgdGhpcy5jb25maWcubG9vcCl7XG4gICAgICAgICAgICB0aGlzLm5leHRJbmRleCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5leHRJbmRleCA9IHRoaXMuaW5kZXgrMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09PSAwICYmIHRoaXMuY29uZmlnLmxvb3Ape1xuICAgICAgICAgICAgdGhpcy5wcmV2SW5kZXggPSB0aGlzLmxhdGVzdEltYWdlSW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZXZJbmRleCA9IHRoaXMuaW5kZXgtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudFR5cGUgPT09ICdwcmV2Jyl7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5wcmV2SW1hZ2UubG9hZGVkKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJySW1hZ2UubG9hZGVkKXtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudFR5cGUgPT09ICduZXh0Jyl7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5uZXh0SW1hZ2UubG9hZGVkKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJySW1hZ2UubG9hZGVkKXtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZJbWFnZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVmYXVsdFdyYXBwZXJQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgb25JbWFnZUxvYWRlZChlbGVtOiBhbnkpe1xuICAgICAgICB0aGlzW2VsZW1dLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVQaW5jaEV2ZW50cygkZXZlbnQpe1xuICAgICAgICBpZiAoJGV2ZW50ID09PSAncHJldicpe1xuICAgICAgICAgICAgdGhpcy5zbGlkZSgncHJldicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkZXZlbnQgPT09ICduZXh0Jyl7XG4gICAgICAgICAgICB0aGlzLnNsaWRlKCduZXh0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZWZhdWx0V3JhcHBlclBvc2l0aW9uKCl7XG4gICAgICAgIGxldCBlbGVtID0gdGhpcy53cmFwcGVyRWwubmF0aXZlRWxlbWVudDtcbiAgICAgICAgZWxlbS5zdHlsZS50cmFuc2l0aW9uID0gJ2FsbCAwbXMnO1xuICAgICAgICBlbGVtLnN0eWxlLnRyYW5zZm9ybSA9ICdtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCknO1xuICAgICAgICBlbGVtLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9ICdtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCknO1xuICAgIH1cbn0iXX0=