UNPKG

ng-image-video-gallery

Version:

Angular Image slider with lightbox. An Angular responsive image slider with lightbox popup. Also support youtube url, image base64 string and mp4 video urls and base64 string.

321 lines 46.2 kB
/** * @fileoverview added by tsickle * Generated from: lib/slider-custom-image/slider-custom-image.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Inject, Output, EventEmitter } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { DomSanitizer } from '@angular/platform-browser'; import { NgImageSliderService } from './../ng-image-slider.service'; import { SliderService } from '../services/slider.service'; /** @type {?} */ var youtubeRegExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/; /** @type {?} */ var validFileExtensions = ['jpeg', 'jpg', 'gif', 'png']; /** @type {?} */ var validVideoExtensions = ['mp4']; /** @type {?} */ var vimeoRegExp = /\/\/(?:www.)?vimeo.com\/([0-9a-z-_]+)/i; /** @type {?} */ var wistiaRegExp = /https?:\/\/[^.]+\.(wistia\.com|wi\.st)\/(medias|embed)\/.*/; var SliderCustomImageComponent = /** @class */ (function () { function SliderCustomImageComponent(imageSliderService, sanitizer, document, sliderService) { this.imageSliderService = imageSliderService; this.sanitizer = sanitizer; this.sliderService = sliderService; this.YOUTUBE = 'youtube'; this.IMAGE = 'image'; this.VIDEO = 'video'; this.ANOTHER_VIDEO = 'another-video'; this.fileUrl = ''; this.videoUrl = ''; this.fileExtension = ''; this.type = this.IMAGE; this.imageLoading = true; this.wistiaUrl = ''; // @inputs this.showVideo = false; this.videoAutoPlay = false; this.showVideoControls = 1; this.speed = 1; this.isVideo = false; this.alt = ''; this.title = ''; this.direction = 'ltr'; this.ratio = false; this.lazy = false; this.getThumbnail = new EventEmitter(); } /** * @return {?} */ SliderCustomImageComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @param {?} changes * @return {?} */ SliderCustomImageComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (this.imageUrl && this.imageUrl && this.imageUrl && typeof (this.imageUrl) === 'string' && ((changes.imageUrl && changes.imageUrl.firstChange) || (this.videoAutoPlay))) { this.setUrl(); } }; /** * @return {?} */ SliderCustomImageComponent.prototype.setUrl = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var url = this.imageUrl; this.imageLoading = true; this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url); this.fileExtension = url.split('.').pop().split(/\#|\?/)[0]; if (this.imageSliderService.base64FileExtension(url) && (validFileExtensions.indexOf(this.imageSliderService.base64FileExtension(url).toLowerCase()) > -1 || validVideoExtensions.indexOf(this.imageSliderService.base64FileExtension(url).toLowerCase()) > -1)) { this.fileExtension = this.imageSliderService.base64FileExtension(url); } // verify for youtube url /** @type {?} */ var match = url.match(youtubeRegExp); /** @type {?} */ var matchVimeoUrl = url.match(vimeoRegExp); /** @type {?} */ var matchWistiaUrl = url.match(wistiaRegExp); if (match && match[2].length === 11) { if (this.showVideo) { this.type = this.YOUTUBE; this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl("" + 'https://www.youtube.com/embed/' + match[2] + (this.videoAutoPlay ? '?autoplay=1&enablejsapi=1' : '?autoplay=0&enablejsapi=1') + '&controls=' + this.showVideoControls); } else { this.type = this.IMAGE; //this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(`https://img.youtube.com/vi/${match[2]}/0.jpg`); // Remove black background and get full size high resoultion image this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl("https://img.youtube.com/vi/" + match[2] + "/maxresdefault.jpg"); /** @type {?} */ var thumnailObject = { index: this.imagePositionInSlider, image: this.fileUrl }; this.getThumbnail.emit(thumnailObject); } } else if (matchVimeoUrl) { this.sliderService.getoEmbedResponse('https://vimeo.com/api/oembed.json?url=', url).subscribe((/** * @param {?} res * @return {?} */ function (res) { if (_this.showVideo) { _this.type = _this.ANOTHER_VIDEO; /** @type {?} */ var vimeoVideoUrl = "" + 'https://player.vimeo.com/video/' + res['video_id']; _this.videoUrl = _this.sanitizer.bypassSecurityTrustResourceUrl(vimeoVideoUrl); } else { _this.type = _this.IMAGE; _this.videoUrl = _this.sanitizer.bypassSecurityTrustResourceUrl(res['thumbnail_url']); /** @type {?} */ var thumnailObject = { index: _this.imagePositionInSlider, image: _this.videoUrl }; _this.getThumbnail.emit(thumnailObject); } })); } else if (url.indexOf('https://player.vimeo.com/video') !== -1) { if (this.showVideo) { this.type = this.ANOTHER_VIDEO; this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url); } else { this.type = this.IMAGE; this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl('data:image/png;base64,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'); /** @type {?} */ var thumnailObject = { index: this.imagePositionInSlider, image: this.videoUrl }; this.getThumbnail.emit(thumnailObject); } } else if (url.indexOf('https://players.brightcove.net/') !== -1) { if (this.showVideo) { this.type = this.ANOTHER_VIDEO; this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url); } else { this.type = this.IMAGE; this.videoUrl = this.sanitizer.bypassSecurityTrustResourceUrl('https://cdn.mos.cms.futurecdn.net/xnhBGrzwAHmbTmyfWx6RsM-970-75.png.webp'); /** @type {?} */ var thumnailObject = { index: this.imagePositionInSlider, image: this.videoUrl }; this.getThumbnail.emit(thumnailObject); } } else if (url.indexOf(matchWistiaUrl) && url.indexOf('wistia') !== -1) { this.sliderService.getoEmbedResponse("https://fast.wistia.com/oembed.json?url=", url).subscribe((/** * @param {?} res * @return {?} */ function (res) { if (_this.showVideo) { _this.type = _this.ANOTHER_VIDEO; _this.wistiaUrl = url + "?resumable=false"; _this.videoUrl = _this.sanitizer.bypassSecurityTrustResourceUrl(_this.wistiaUrl); } else { _this.type = _this.IMAGE; _this.videoUrl = _this.sanitizer.bypassSecurityTrustResourceUrl(res['thumbnail_url']); /** @type {?} */ var thumnailObject = { index: _this.imagePositionInSlider, image: _this.videoUrl }; _this.getThumbnail.emit(thumnailObject); } })); } else if (this.fileExtension && validFileExtensions.indexOf(this.fileExtension.toLowerCase()) > -1) { this.type = this.IMAGE; } else if (this.fileExtension && validVideoExtensions.indexOf(this.fileExtension.toLowerCase()) > -1) { this.type = this.VIDEO; if (this.videoAutoPlay && document.getElementById("video_" + this.imageIndex)) { /** @type {?} */ var videoObj_1 = document.getElementById("video_" + this.imageIndex); setTimeout((/** * @return {?} */ function () { videoObj_1.play(); }), this.speed * 1000); } } }; /** * @param {?} event * @return {?} */ SliderCustomImageComponent.prototype.videoClickHandler = /** * @param {?} event * @return {?} */ function (event) { if (event && event.srcElement && !this.showVideoControls) { if (event.srcElement.paused) { event.srcElement.play(); } else { event.srcElement.pause(); } } }; SliderCustomImageComponent.decorators = [ { type: Component, args: [{ selector: 'custom-img', template: "\r\n <div *ngIf=\"fileUrl\" class=\"custom-image-main\" [ngClass]=\"{'ng-fullimage-loading': imageLoading}\">\r\n <img class=\"image cursor-pointer\"\r\n (load)=\"imageLoading = false\"\r\n [ngClass]=\"type === IMAGE && (imgData?.imageTitle || imgData?.imageDescription) ? {imageTitleClass: 'imageTitleClass','ratio': ratio} : {videoClass: 'videoClass','ratio': ratio}\"\r\n *ngIf=\"(type === IMAGE && fileUrl) || (type === IMAGE && videoUrl)\"\r\n [src]=\"videoUrl ? videoUrl : fileUrl\"\r\n [alt]=\"alt\"\r\n [title]=\"title\"\r\n [ngStyle]=\"{'height': imgHeight}\"\r\n [attr.loading]=\"lazy == true ? 'lazy' : null\">\r\n <iframe class=\"youtube\"\r\n *ngIf=\"(type === YOUTUBE && fileUrl) || (type === ANOTHER_VIDEO && videoUrl)\"\r\n [src]=\"(type === YOUTUBE) ? fileUrl : videoUrl\"\r\n [attr.loading]=\"lazy == true ? 'lazy' : null\"\r\n frameborder=\"0\"\r\n allow=\"autoplay\"\r\n allowfullscreen></iframe>\r\n <video class=\"video\"\r\n [id]=\"'video_' + imageIndex\"\r\n [ngClass]=\"{'ratio': ratio}\"\r\n (click)=\"videoClickHandler($event)\"\r\n [autoplay]=\"videoAutoPlay\"\r\n *ngIf=\"type === VIDEO\"\r\n type=\"video/mp4\"\r\n [attr.controls]=\"showVideoControls ? showVideoControls : null\"\r\n controlsList=\"nodownload\">\r\n <source [src]=\"fileUrl\" type=\"video/mp4\">\r\n Your browser does not support the video tag.\r\n </video>\r\n <div [dir]=\"direction\" *ngIf=\"!fileUrl\" class=\"invalid-msg\">Invalid file format</div>\r\n <span *ngIf=\"type === YOUTUBE || type === VIDEO || isVideo\" class=\"youtube-icon cursor-pointer\" [ngStyle]=\"{'height': imgHeight}\"></span>\r\n </div>" }] } ]; /** @nocollapse */ SliderCustomImageComponent.ctorParameters = function () { return [ { type: NgImageSliderService }, { type: DomSanitizer }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: SliderService } ]; }; SliderCustomImageComponent.propDecorators = { showVideo: [{ type: Input }], videoAutoPlay: [{ type: Input }], showVideoControls: [{ type: Input }], currentImageIndex: [{ type: Input }], imageIndex: [{ type: Input }], speed: [{ type: Input }], imageUrl: [{ type: Input }], isVideo: [{ type: Input }], alt: [{ type: Input }], title: [{ type: Input }], direction: [{ type: Input }], ratio: [{ type: Input }], lazy: [{ type: Input }], imgData: [{ type: Input }], imgHeight: [{ type: Input }], getThumbnail: [{ type: Output }], imagePositionInSlider: [{ type: Input }] }; return SliderCustomImageComponent; }()); export { SliderCustomImageComponent }; if (false) { /** @type {?} */ SliderCustomImageComponent.prototype.YOUTUBE; /** @type {?} */ SliderCustomImageComponent.prototype.IMAGE; /** @type {?} */ SliderCustomImageComponent.prototype.VIDEO; /** @type {?} */ SliderCustomImageComponent.prototype.ANOTHER_VIDEO; /** @type {?} */ SliderCustomImageComponent.prototype.fileUrl; /** @type {?} */ SliderCustomImageComponent.prototype.videoUrl; /** @type {?} */ SliderCustomImageComponent.prototype.fileExtension; /** @type {?} */ SliderCustomImageComponent.prototype.type; /** @type {?} */ SliderCustomImageComponent.prototype.imageLoading; /** @type {?} */ SliderCustomImageComponent.prototype.wistiaUrl; /** @type {?} */ SliderCustomImageComponent.prototype.showVideo; /** @type {?} */ SliderCustomImageComponent.prototype.videoAutoPlay; /** @type {?} */ SliderCustomImageComponent.prototype.showVideoControls; /** @type {?} */ SliderCustomImageComponent.prototype.currentImageIndex; /** @type {?} */ SliderCustomImageComponent.prototype.imageIndex; /** @type {?} */ SliderCustomImageComponent.prototype.speed; /** @type {?} */ SliderCustomImageComponent.prototype.imageUrl; /** @type {?} */ SliderCustomImageComponent.prototype.isVideo; /** @type {?} */ SliderCustomImageComponent.prototype.alt; /** @type {?} */ SliderCustomImageComponent.prototype.title; /** @type {?} */ SliderCustomImageComponent.prototype.direction; /** @type {?} */ SliderCustomImageComponent.prototype.ratio; /** @type {?} */ SliderCustomImageComponent.prototype.lazy; /** @type {?} */ SliderCustomImageComponent.prototype.imgData; /** @type {?} */ SliderCustomImageComponent.prototype.imgHeight; /** @type {?} */ SliderCustomImageComponent.prototype.getThumbnail; /** @type {?} */ SliderCustomImageComponent.prototype.imagePositionInSlider; /** @type {?} */ SliderCustomImageComponent.prototype.imageSliderService; /** * @type {?} * @private */ SliderCustomImageComponent.prototype.sanitizer; /** * @type {?} * @private */ SliderCustomImageComponent.prototype.sliderService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWN1c3RvbS1pbWFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1pbWFnZS12aWRlby1nYWxsZXJ5LyIsInNvdXJjZXMiOlsibGliL3NsaWRlci1jdXN0b20taW1hZ2Uvc2xpZGVyLWN1c3RvbS1pbWFnZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULEtBQUssRUFHTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBbUIsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0lBRXJELGFBQWEsR0FBRyxzRUFBc0U7O0lBQ3hGLG1CQUFtQixHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDOztJQUNuRCxvQkFBb0IsR0FBRyxDQUFDLEtBQUssQ0FBQzs7SUFDNUIsV0FBVyxHQUFHLHdDQUF3Qzs7SUFDdEQsWUFBWSxHQUFDLDREQUE0RDtBQUMvRTtJQW1DSSxvQ0FDVyxrQkFBd0MsRUFDdkMsU0FBdUIsRUFDYixRQUFRLEVBQVUsYUFBNEI7UUFGekQsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFzQjtRQUN2QyxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ0ssa0JBQWEsR0FBYixhQUFhLENBQWU7UUFqQ3BFLFlBQU8sR0FBRyxTQUFTLENBQUM7UUFDcEIsVUFBSyxHQUFHLE9BQU8sQ0FBQztRQUNoQixVQUFLLEdBQUcsT0FBTyxDQUFDO1FBQ2hCLGtCQUFhLEdBQUcsZUFBZSxDQUFDO1FBQ2hDLFlBQU8sR0FBb0IsRUFBRSxDQUFDO1FB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QUFVLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDNUI7U0FDSjtJQUNMLENBQUM7O2dCQS9KSixTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLDY0REFBbUQ7aUJBQ3REOzs7O2dCQVhRLG9CQUFvQjtnQkFEcEIsWUFBWTtnREErQ1osTUFBTSxTQUFDLFFBQVE7Z0JBN0NmLGFBQWE7Ozs0QkF3QmpCLEtBQUs7Z0NBQ0wsS0FBSztvQ0FDTCxLQUFLO29DQUNMLEtBQUs7NkJBQ0wsS0FBSzt3QkFDTCxLQUFLOzJCQUNMLEtBQUs7MEJBQ0wsS0FBSztzQkFDTCxLQUFLO3dCQUNMLEtBQUs7NEJBQ0wsS0FBSzt3QkFDTCxLQUFLO3VCQUNMLEtBQUs7MEJBQ0wsS0FBSzs0QkFDTCxLQUFLOytCQUNMLE1BQU07d0NBQ04sS0FBSzs7SUErSFYsaUNBQUM7Q0FBQSxBQWhLRCxJQWdLQztTQTVKWSwwQkFBMEI7OztJQUNuQyw2Q0FBb0I7O0lBQ3BCLDJDQUFnQjs7SUFDaEIsMkNBQWdCOztJQUNoQixtREFBZ0M7O0lBQ2hDLDZDQUE4Qjs7SUFDOUIsOENBQStCOztJQUUvQixtREFBbUI7O0lBQ25CLDBDQUFrQjs7SUFDbEIsa0RBQTRCOztJQUM1QiwrQ0FBb0I7O0lBRXBCLCtDQUFvQzs7SUFDcEMsbURBQXdDOztJQUN4Qyx1REFBdUM7O0lBQ3ZDLHVEQUFtQzs7SUFDbkMsZ0RBQTRCOztJQUM1QiwyQ0FBMkI7O0lBQzNCLDhDQUFrQjs7SUFDbEIsNkNBQXlCOztJQUN6Qix5Q0FBMEI7O0lBQzFCLDJDQUE0Qjs7SUFDNUIsK0NBQW1DOztJQUNuQywyQ0FBZ0M7O0lBQ2hDLDBDQUErQjs7SUFDL0IsNkNBQWlCOztJQUNqQiwrQ0FBbUI7O0lBQ25CLGtEQUEyQzs7SUFDM0MsMkRBQStCOztJQUczQix3REFBK0M7Ozs7O0lBQy9DLCtDQUErQjs7Ozs7SUFDSCxtREFBb0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgSW5qZWN0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgRXZlbnRFbWl0dGVyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlUmVzb3VyY2VVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgTmdJbWFnZVNsaWRlclNlcnZpY2UgfSBmcm9tICcuLy4uL25nLWltYWdlLXNsaWRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2xpZGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3NsaWRlci5zZXJ2aWNlJztcclxuXHJcbmNvbnN0IHlvdXR1YmVSZWdFeHAgPSAvXi4qKHlvdXR1LmJlXFwvfHZcXC98dVxcL1xcd1xcL3xlbWJlZFxcL3x3YXRjaFxcP3Y9fFxcJnY9fFxcP3Y9KShbXiNcXCZcXD9dKikuKi8sXHJcbiAgICB2YWxpZEZpbGVFeHRlbnNpb25zID0gWydqcGVnJywgJ2pwZycsICdnaWYnLCAncG5nJ10sXHJcbiAgICB2YWxpZFZpZGVvRXh0ZW5zaW9ucyA9IFsnbXA0J107XHJcbmNvbnN0IHZpbWVvUmVnRXhwID0gL1xcL1xcLyg/Ond3dy4pP3ZpbWVvLmNvbVxcLyhbMC05YS16LV9dKykvaTtcclxuY29uc3Qgd2lzdGlhUmVnRXhwPS9odHRwcz86XFwvXFwvW14uXStcXC4od2lzdGlhXFwuY29tfHdpXFwuc3QpXFwvKG1lZGlhc3xlbWJlZClcXC8uKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2N1c3RvbS1pbWcnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NsaWRlci1jdXN0b20taW1hZ2UuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTbGlkZXJDdXN0b21JbWFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgICBZT1VUVUJFID0gJ3lvdXR1YmUnO1xyXG4gICAgSU1BR0UgPSAnaW1hZ2UnO1xyXG4gICAgVklERU8gPSAndmlkZW8nO1xyXG4gICAgQU5PVEhFUl9WSURFTyA9ICdhbm90aGVyLXZpZGVvJztcclxuICAgIGZpbGVVcmw6IFNhZmVSZXNvdXJjZVVybCA9ICcnO1xyXG4gICAgdmlkZW9Vcmw6IFNhZmVSZXNvdXJjZVVybCA9ICcnO1xyXG5cclxuICAgIGZpbGVFeHRlbnNpb24gPSAnJztcclxuICAgIHR5cGUgPSB0aGlzLklNQUdFO1xyXG4gICAgaW1hZ2VMb2FkaW5nOmJvb2xlYW4gPSB0cnVlO1xyXG4gICAgd2lzdGlhVXJsOnN0cmluZz0nJztcclxuICAgIC8vIEBpbnB1dHNcclxuICAgIEBJbnB1dCgpIHNob3dWaWRlbzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgdmlkZW9BdXRvUGxheTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgc2hvd1ZpZGVvQ29udHJvbHM6IG51bWJlciA9IDE7XHJcbiAgICBASW5wdXQoKSBjdXJyZW50SW1hZ2VJbmRleDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgaW1hZ2VJbmRleDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgc3BlZWQ6IG51bWJlciA9IDE7XHJcbiAgICBASW5wdXQoKSBpbWFnZVVybDtcclxuICAgIEBJbnB1dCgpIGlzVmlkZW8gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGFsdDogU3RyaW5nID0gJyc7XHJcbiAgICBASW5wdXQoKSB0aXRsZTogU3RyaW5nID0gJyc7XHJcbiAgICBASW5wdXQoKSBkaXJlY3Rpb246IHN0cmluZyA9ICdsdHInO1xyXG4gICAgQElucHV0KCkgcmF0aW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGltZ0RhdGE7XHJcbiAgICBASW5wdXQoKSBpbWdIZWlnaHQ7XHJcbiAgICBAT3V0cHV0KCkgZ2V0VGh1bWJuYWlsPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBASW5wdXQoKSBpbWFnZVBvc2l0aW9uSW5TbGlkZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIGltYWdlU2xpZGVyU2VydmljZTogTmdJbWFnZVNsaWRlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudCwgcHJpdmF0ZSBzbGlkZXJTZXJ2aWNlOiBTbGlkZXJTZXJ2aWNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGlmICh0aGlzLmltYWdlVXJsXHJcbiAgICAgICAgICAgICYmIHRoaXMuaW1hZ2VVcmxcclxuICAgICAgICAgICAgJiYgdGhpcy5pbWFnZVVybFxyXG4gICAgICAgICAgICAmJiB0eXBlb2YgKHRoaXMuaW1hZ2VVcmwpID09PSAnc3RyaW5nJ1xyXG4gICAgICAgICAgICAmJiAoXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlcy5pbWFnZVVybCAmJiBjaGFuZ2VzLmltYWdlVXJsLmZpcnN0Q2hhbmdlKVxyXG4gICAgICAgICAgICAgICAgfHxcclxuICAgICAgICAgICAgICAgICh0aGlzLnZpZGVvQXV0b1BsYXkpXHJcbiAgICAgICAgICAgICAgICkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRVcmwoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VXJsKCkge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuaW1hZ2VVcmw7XHJcbiAgICAgICAgdGhpcy5pbWFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZmlsZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh1cmwpO1xyXG4gICAgICAgIHRoaXMuZmlsZUV4dGVuc2lvbiA9IHVybC5zcGxpdCgnLicpLnBvcCgpLnNwbGl0KC9cXCN8XFw/LylbMF07XHJcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VTbGlkZXJTZXJ2aWNlLmJhc2U2NEZpbGVFeHRlbnNpb24odXJsKVxyXG4gICAgICAgICYmICh2YWxpZEZpbGVFeHRlbnNpb25zLmluZGV4T2YodGhpcy5pbWFnZVNsaWRlclNlcnZpY2UuYmFzZTY0RmlsZUV4dGVuc2lvbih1cmwpLnRvTG93ZXJDYXNlKCkpID4gLTEgXHJcbiAgICAgICAgfHwgdmFsaWRWaWRlb0V4dGVuc2lvbnMuaW5kZXhPZih0aGlzLmltYWdlU2xpZGVyU2VydmljZS5iYXNlNjRGaWxlRXh0ZW5zaW9uKHVybCkudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlRXh0ZW5zaW9uID0gdGhpcy5pbWFnZVNsaWRlclNlcnZpY2UuYmFzZTY0RmlsZUV4dGVuc2lvbih1cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB2ZXJpZnkgZm9yIHlvdXR1YmUgdXJsXHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goeW91dHViZVJlZ0V4cCk7XHJcbiAgICAgICAgY29uc3QgbWF0Y2hWaW1lb1VybCA9IHVybC5tYXRjaCh2aW1lb1JlZ0V4cCk7XHJcbiAgICAgICAgY29uc3QgbWF0Y2hXaXN0aWFVcmw9dXJsLm1hdGNoKHdpc3RpYVJlZ0V4cCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoWzJdLmxlbmd0aCA9PT0gMTEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1ZpZGVvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLllPVVRVQkU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoYCR7J2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyd9JHttYXRjaFsyXX0ke3RoaXMudmlkZW9BdXRvUGxheSA/ICc/YXV0b3BsYXk9MSZlbmFibGVqc2FwaT0xJyA6ICc/YXV0b3BsYXk9MCZlbmFibGVqc2FwaT0xJ30keycmY29udHJvbHM9J30ke3RoaXMuc2hvd1ZpZGVvQ29udHJvbHN9YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLklNQUdFO1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmZpbGVVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoYGh0dHBzOi8vaW1nLnlvdXR1YmUuY29tL3ZpLyR7bWF0Y2hbMl19LzAuanBnYCk7XHJcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYmxhY2sgYmFja2dyb3VuZCBhbmQgZ2V0IGZ1bGwgc2l6ZSBoaWdoIHJlc291bHRpb24gaW1hZ2VcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChgaHR0cHM6Ly9pbWcueW91dHViZS5jb20vdmkvJHttYXRjaFsyXX0vbWF4cmVzZGVmYXVsdC5qcGdgKTtcclxuICAgICAgICAgICAgICAgIGxldCB0aHVtbmFpbE9iamVjdCA9IHtpbmRleDogdGhpcy5pbWFnZVBvc2l0aW9uSW5TbGlkZXIsIGltYWdlOiB0aGlzLmZpbGVVcmx9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRodW1ibmFpbC5lbWl0KHRodW1uYWlsT2JqZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hWaW1lb1VybCkgeyAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLnNsaWRlclNlcnZpY2UuZ2V0b0VtYmVkUmVzcG9uc2UoJ2h0dHBzOi8vdmltZW8uY29tL2FwaS9vZW1iZWQuanNvbj91cmw9JywgdXJsKS5zdWJzY3JpYmUocmVzPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2hvd1ZpZGVvKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuQU5PVEhFUl9WSURFTztcclxuICAgICAgICAgICAgbGV0IHZpbWVvVmlkZW9VcmwgPSBgJHsnaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLyd9JHtyZXNbJ3ZpZGVvX2lkJ119YDtcclxuICAgICAgICAgICAgdGhpcy52aWRlb1VybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh2aW1lb1ZpZGVvVXJsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLklNQUdFO1xyXG4gICAgICAgICAgICB0aGlzLnZpZGVvVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHJlc1sndGh1bWJuYWlsX3VybCddKTtcclxuICAgICAgICAgICAgbGV0IHRodW1uYWlsT2JqZWN0ID0ge2luZGV4OiB0aGlzLmltYWdlUG9zaXRpb25JblNsaWRlciwgaW1hZ2U6IHRoaXMudmlkZW9Vcmx9XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGh1bWJuYWlsLmVtaXQodGh1bW5haWxPYmplY3QpO1xyXG4gICAgICAgICAgICBcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKHVybC5pbmRleE9mKCdodHRwczovL3BsYXllci52aW1lby5jb20vdmlkZW8nKSAhPT0tMSl7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dWaWRlbykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5BTk9USEVSX1ZJREVPO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb1VybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh1cmwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5JTUFHRTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9VcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBVDRBQUFDZkNBTUFBQUJYMFVYOUFBQUFrRkJNVkVYLy8vOGpJQ0VnSFI0ZEdoc0FBQUFZRkJVVUR4RWJHQm44L1B3UUN3MFdFaFB5OHZJYUZoZjQrUGdmR3h6dDdlMHpNREVuSkNYaDRlSGIyOXVkbkp5OHU3c01CUWpvNk9oVVVsTk9URXdzS1NyTHlzdXVyYTA4T1RwR1EwVFQwdEpuWldhRWc0T2hvS0I1ZDNpenNySndiMitWbEpTTmpJeDdlWHJDd2NGUlQxQmJXbHJPemMxSVJVWTlPenhrWW1PT0ZsWjVBQUFNVWtsRVFWUjRuTzFjNlpxcXNMS1ZZSUF3Q2FLZ2dBTXFEbTJyNy85MkIyU3FZdWg5OXYyMmV2czd0WDVDT2xaV2FrN28wWWhBSUJBSUJBS0JRQ0FRQ0FRQ2dVQWdFQWdFQW9GQUlCQUlCQUtCUUNBUUNBUUNnVUFnRVA3SG9HbWZsdURYUXZQbXh5VFpiVDR0eCs5RWxJYStVQlRmblgxYWtsOElZeTkwSnVWZzQrT25oZmwxOE5aQ3FzREdaTDkvQjIvTnBRWks4bWw1ZmhjbVZ4MndKOGxMNjlNUy9Tck1oSVRvdXhGOWZ3SHJMaVA2ZUVyWjMxL0FjeG1pYjN6NHRFUy9DaEZEOUtsM1VyNi9nUmRDK21UNys5TUMvUzVZYStEN1pIZithWGwrRzJhaVZqL2RJZmIrRnRiWlYyVEdtQ244N2ZUVHd2eEdmQ2ZMTUhTdU0rL1RndnhhYU5Uckl4QUlCTUlnSmxOdk92bTBFUCsvTVQzTVlxOG5sbHBSY2wwN29iTit4QVlhSDg5MmtkRWFyRzJ5U1Y0am56SEo4WWRnUC9FdXUxT1M0UlJ2M3JuZjN0bmhKbmZUVGhKOHVkcGNsVzNHWkpNdkdtYW01OUEwVFhVWm9jSFRQZVBjUGJjRk53SXZpaUt2WnoxV01NM2UvR21sazgwdVNhL0xITnNrRGdaR2FkTmRlbk5Oaytjd1RmdDIvbjVYWmhVN1NsNkdNYkhBS3pGT05tL2FBL3FxZWh1dml2SGNodnpONy9sVEpxNndlMnJNazBWb3Foblg5NlIxSmpJOVBod3p4MzAvM0hVdzV1YzcxL1ZzRDNPWXVoNmUrL1RibXFldXJzdU5zRXpXemE0MnZBTEdmbXlYUHlyMjZNVkRvTmFVWHh4cVdJbW94dk5sWTc4N3Vld2srS2Y2V1hCeWhLS3lZajFDanNIa20xUVhadEg2a2hWbDRMUXpPRHBDeDgxWnBraHhaOXo4UzNEY2hIeU9mRWM3QTU2YVNUN2MycTNTa3NmTUxTZFlndkhqV3NERXIrUm5TbWxneHBFai90bTRYdmdrOFhVRzMreDZKSnVjaE9pUWdxWXBzRm1NMWU2d0RMYmZaZm9mNCtLWTRBZVZSbk5HUjc4dFR0NVg5aHg0eXFhbnhWampEQWFMNHVRM1dyY1hienNsc1ZIaExRQWxySFBhcWNWT0gzbjVZQTRIYXp2VDdCMldqOVJmek4vQlJiWmhyMnAvdTJFZDRaVms5STNZbHRURjA5Rk5Vbmg2cEg3bGsrd2tXV3BERkVvVzI1MVhvbjNhR2FSbTkrOHJPZlpOVkppa1NqL0pUOGpoU3craFk5M0d2emV1M0syVzZoMWh6SFR1WURPUm44NHZ3R2JPd3NuSU92bzlxMUsvOHBsM2N2ZVZmTU5SNjN1dEQ3UEN3am9vQkl1dW1CRDgranJ5dE5tNExhTmZPYlBJN29yUFZtR0xiZmtyb3krNDRwTkxKazIxVXg5NzJicXo0YnRlaDRiVlpPNzJlN01TZW5VNkZkdzY3TFVtRnk4TEgxWXk3Z2dteWhpbzdaWE91OXhGdFI3azlFM3Y3U1hZMzcwVUZTNHVObnRmbVJjZzJVRVpOTnhDeXZKZVRiQnNTU2tMWVp2b21ieCtFWHVUUnljMlpQdGFwaTVlS0lUL2cvMlU0T2xvZzJMSmt5VG4xUFdiNWF2TllTQWU2RUJMWWdVcE9UT0Z3TXBZM2dzeEZwZzlWYm5Ob3FsM1JPN1pmODFSbHJmTWxhYTl6aklXakhiT2ZoYWZuYTRKWWIrbEhLTlE3VXpqdWtPOHUyazNQeXNBNkl1eDMrRFNkcmE3b2owcTZMTlN6SjV5bXhjaDVRU2RpWGpORGJCREhyRjBaNFdqL3RNNzVlUSs2MHZ2MWpJaWs2MlJjeGxIeDl3QmNEZjhvNklXR0RSS1h0TjNRY2tBMHgrYlRCVGpDbmRTUFBPckkxWjdrVllGM1JSS1kxNWZVN3dsWE9icEpraXc1L0pScGJQRCs2c3Y1OFljYUJxVHA5cGUyR3I2ZmVsejlhd254QTY4WVc1bFkwR0kyRE9UWWo5anBGRjVPaGRoSGVmYnBsaE1BYkhNYlhjMi9nMk1xNU5MWVQzUUp2b29VbTFRVE9YbmZIKzNqYjdtNllaMWRXTnJOT21xSCtQT1d1clBhTG03bG5BTXQ1MXkyN1FIMmpGUjVmRno0S2labXhWSDJnM05iUzRBU3pFY3JMNm9DUlFVRW5zb1FnaFVmaUw2K1BiNTdOZzg0M25STWNuRkN6cjBNWDBXR042MWh6L21KNEh4dmNiNStycGMvUTVsQTM2ZElKOEFxM3liUGQyaHdHYzdNUEhad0VrNGpPa3Z3Qm1hcjQ2NkJnZElYMW5nN3B2aGpWdWV0bU1RS3pLUkxxMlM3VDZ6dGdQU01yTTBQUStGRGJOdVNSZ3JvSzMrcFRPeGpvcm1LWno3MWZSOXc3MVNvUkdNb0dPVVY4OFZhazRqZDlNeHdGWXVsZTRwdzdYdEZKbGF2RUgrdlRKU1hPc3dVYXNVdkZPbzVEcS9RejlvWG5FekYvcWpWOU9uUVR0aURtaElCdkFxWDlsVjhzRE8xaVhlS0dwbDRMenNKWXoyN2F5dzBsakxnZlQ1UlIxeE1YczR6YWNIWE10T1Z0OFpTMlQ3SnE0dDNrb2Y4aXVTQUU0a0JpL3NlMUdWZ2hESW5McFFqWEVLYmp1VnY5NjJuRit0SjRpK3F1T3loZXR1cGcrK21sbVlsTk54UVpFSG0weTJ4VkNhbDlNWG9aNVY0MFVNbVBicFpVd0JTWUhhTkpaUE9NUGh0Vk5jdExxZG91SVZHYTk4ZjY3ZlEwbWxVazB5QWRHWThhZDhLRE9XMm4wOTVJNU1mS1R3NzRIOGNtMTJXWXdGbkZSZVhBTXJCSGZxc1pMSjYxb3RWemgwK0RXdkVlVDFHVXZ4RHhicHlWTzhCVkQ0d3FjYUN4V05iSjJBb01URkhqb2UrV2NBd1ZTeTY5WVIxQSttbHQ0Rk9qbS9WbFFMbHllTkJ1TUFrUlUxZFFtQWdubzVFN28xYlQ2S3NkNjkwWGRaRkQ1eWloeW4ydTVLd2ZVdzUrVTMxMk9ZcGR1Vjg0TzV1M0l1MTMyRXJmcmFxK0FicC9hcTN2QUxkbjFLWTJYb2ZyNy9OREJzdTBXTTBlYWdRV3U2NVM5ZXBPRmNOVFAyRzdBbTlVVkZHd0JhZmVYa0xtQjljaFVLTEppSWpHdVdJdVQ2Z0ZFZlc5MmpXaE1zVkZpRno1bm15S0U5RmMwN04wMW5waStyblkxeHBkUUtEdEViV2dZUUZuUWw4dGZ6V2JBQ2xsVDc1Z0NVS0V5cTQ5MEI1UzFtMHlQNndrYmRLTjhFR3FxOGZEN0RYR2ZKU0hBRWh5S3kyUndobzZ5UDJhMnlMRUdaeEtzRDd3Z0hNdlk4dlVYZElIMWJHY0FCT0dWNXFmWDlQZEl4cEUveXVza3ZJbWgrL1B4OGxpSkx0NDlIcCtsWjIvNGQ4SEJFOUlXNDBUK0Y0WXJwcitrWUlNeWg0T29pY3prSjVDbXNyUlFXZVBxNWVxcEJTNFRtRXFGMDBBZVZGWEo5NVlGWUs4a0J4NVN5Nyt4Z0JNRDB0WUlET2lJc0MvWFhBbTJZcENjUlZBUW0xem05QVkyeE9kWFVVR21tTklrV3F1dFoyQmdaSnJ6OGkyVi9OOUJXK0hLSEZTeEdHUTZtejBOUitSMjJPN0pRdWkvSjZLUkdidzUvcDdCUHgrdnV3anhFRlVTekd1U0YrQmFjTDZKTVo1ZytKaXQ4dForM0ROQkMvWGptb05jd2E4bjh4VnR1dXN4dzBZVjA4ZEZJaDVJMVZ2UVFzc1dnL3JCOGE2WkYvU3BZRytCTVJ5bFU1TkZ1TDloUytKVWNnaFlEazkzVlJjS2kwSEZRNGN6OFBWK005WjFMbG15c1FQLzVoRnJUeFcwSjc0b1Bxbm1UdG1nb0Q0YVhBdzV5OTArTWx1K1Q1TzFsMm5iOHhpVnhSS3VPOWdGSEhtcFdxMi82V0hheUhqaUZZTWg1UEZwWjhDbTZKR3FycHlJYUpkTlFYYnNFL2d2bktNdytSdEZ1MWVsdHJWb1pTVEEvTzByM1ZvRzZxUFV6d0djM3lqczhYNzdRODhCcFBicVBNMmtmSFNsQ2RGWUQrTlpRc3pvRk0rMWJQNWROSkxvYmFKdW44czZtTmQzRTV6c2JPRHNWbGZwRitBNkovN1lQM1E4OWg3NGRBWENwT1FEZUJGNUVud0RYajdUSDRMVWVCTWJEMnlOTkY4dTFZeXZtNE1tVDdPUmJwbTNPK0NTUEw5OTJ4OVRyUGRuV3Q4aDNiQVk5SkZpeEJOSVRHSU5nNU1BZGt4K25rMDFWVldXNUpSN0RxaXE3MitSOGRmRWhzdXkrNzU5VWFIMUpsMzdGMjlkcHlWZUN3cndGMGdkRHh4aDBoUDk3K3ZxaGhrdDhVc2RNbmFzdGh0K1M4bFdZZGFuUmw2M3JyUVAwaVFkb3lVUDZVTk5tRE5xV0EvVEovZmRmT3NQRUlqS0dZbDB0aDlKMzVmSmw2SnlWU2NxdDNXaHNmNGRmeURrK3crSU0wUWY3bG1Qd3ZKOCtzWXdIcjNjQThuem5vT1gxNEk5RDVmZXkxejNVRVYrZE5tMG44a3I1dlp4ZDNzZXEveGpSTndGckhFTmI2cms5eVB6VUdzMjZsNzVhUHlmdWNYV1Q1UWYrK05zLzA4WmhsU25ibmxiRnVYMXRqU2xGRDI3VHRPVTRQRnNBdFQzMGZhTlptejZtaDdtNldFbC9CbEFPNHNwWC9YMkpsZ3plSzJWaThmNS9iWFNFaDdvczZjdlhOL2oySWRPZFU3bWFRMTBtbzFSVmErN093bjdMYUxyQ2VteksyMkxCMW5uSUtKbkt3eTJzZnJXVDJ1di9HSmRPSC9nS3lxcnYyREw5UGxBcmdnL3hKWm03YVdPb2wyVVorZ1J5T2xiaThtS1JPa29oZDBCMU1tSVc4NnB3MEdZaGI5MWhMWWE0aTJQN3RzcGgxVTJqR2JlM24vbnZGTUVpLzhLRHljSk9CaytuanI0aTI4eVdUZUd2OEJjcVJyeHd4MExSL1FmK2kwMnk0cjVRdUZnamxUZ3FJdjljeVRZVlAzeGNZRmZBTzRlK0xoY3BKc3MvYUZKOGZmWFk5WDB6TmprNlBtL1NKaWJyNC9DSGoyeGVET3ZvbUhxNFBQNzBPYzRtdWExV3E5dDJGbld0Tzdqc1R2dHQ1NzhLYVp2NTdMUlBIMWg1dk5NeW0yaDlQVjA2ZXhVY3pqZkg1WXJDM1hDMTNKN21tOEhLZnpKUDc2NFk1L0JsWjVsY1B2cnhvckg1bnY2eFEyWVkvNmdCbmswMDlHTmE0SDFuOERvdGx5NHNMNXJudUd6YXJTMENnVUFnRUFnRUFvRkFJQkFJQkFLQlFDQVFDQVFDZ1VBZ0VBZ0VBb0ZBSUJBSUJBS0JRQ0FRQ0FRQ2dVQWdFQWdFQW9GQUlCQUlCQUtCUVBnLzREOTJIY1BQaE5MMkpBQUFBQUJKUlU1RXJrSmdnZz09Jyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGh1bW5haWxPYmplY3QgPSB7aW5kZXg6IHRoaXMuaW1hZ2VQb3NpdGlvbkluU2xpZGVyLCBpbWFnZTogdGhpcy52aWRlb1VybH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGh1bWJuYWlsLmVtaXQodGh1bW5haWxPYmplY3QpOyAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZih1cmwuaW5kZXhPZignaHR0cHM6Ly9wbGF5ZXJzLmJyaWdodGNvdmUubmV0LycpICE9PS0xKXtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1ZpZGVvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLkFOT1RIRVJfVklERU87XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHVybCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLklNQUdFO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb1VybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCgnaHR0cHM6Ly9jZG4ubW9zLmNtcy5mdXR1cmVjZG4ubmV0L3huaEJHcnp3QUhtYlRteWZXeDZSc00tOTcwLTc1LnBuZy53ZWJwJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGh1bW5haWxPYmplY3QgPSB7aW5kZXg6IHRoaXMuaW1hZ2VQb3NpdGlvbkluU2xpZGVyLCBpbWFnZTogdGhpcy52aWRlb1VybH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGh1bWJuYWlsLmVtaXQodGh1bW5haWxPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYodXJsLmluZGV4T2YobWF0Y2hXaXN0aWFVcmwpICYmIHVybC5pbmRleE9mKCd3aXN0aWEnKSAhPT0gLTEpe1xyXG4gICAgICAgICAgICB0aGlzLnNsaWRlclNlcnZpY2UuZ2V0b0VtYmVkUmVzcG9uc2UoXCJodHRwczovL2Zhc3Qud2lzdGlhLmNvbS9vZW1iZWQuanNvbj91cmw9XCIsdXJsKS5zdWJzY3JpYmUocmVzID0+XHJcbiAgICAgICAgICAgICAgIHsgXHJcbiAgICAgICAgICAgICAgICAgICBpZih0aGlzLnNob3dWaWRlbyl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5BTk9USEVSX1ZJREVPO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2lzdGlhVXJsPXVybCtgP3Jlc3VtYWJsZT1mYWxzZWBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZGVvVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHRoaXMud2lzdGlhVXJsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuSU1BR0U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWRlb1VybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChyZXNbJ3RodW1ibmFpbF91cmwnXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRodW1uYWlsT2JqZWN0ID0ge2luZGV4OiB0aGlzLmltYWdlUG9zaXRpb25JblNsaWRlciwgaW1hZ2U6IHRoaXMudmlkZW9Vcmx9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUaHVtYm5haWwuZW1pdCh0aHVtbmFpbE9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZmlsZUV4dGVuc2lvbiAmJiB2YWxpZEZpbGVFeHRlbnNpb25zLmluZGV4T2YodGhpcy5maWxlRXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5JTUFHRTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmlsZUV4dGVuc2lvbiAmJiB2YWxpZFZpZGVvRXh0ZW5zaW9ucy5pbmRleE9mKHRoaXMuZmlsZUV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuVklERU87XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZGVvQXV0b1BsYXkgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHZpZGVvXyR7dGhpcy5pbWFnZUluZGV4fWApKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2aWRlb09iajphbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdmlkZW9fJHt0aGlzLmltYWdlSW5kZXh9YCk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB2aWRlb09iai5wbGF5KCk7XHJcbiAgICAgICAgICAgICAgICB9LCB0aGlzLnNwZWVkICogMTAwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmlkZW9DbGlja0hhbmRsZXIoZXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuc3JjRWxlbWVudCAmJiAhdGhpcy5zaG93VmlkZW9Db250cm9scykge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuc3JjRWxlbWVudC5wYXVzZWQpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnNyY0VsZW1lbnQucGxheSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3JjRWxlbWVudC5wYXVzZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==