ionic-image-loader-v7
Version:
ionic-image-loader to Ionic 6
240 lines • 25.5 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./services/image-loader.service";
import * as i2 from "./services/image-loader-config.service";
import * as i3 from "@ionic/angular";
import * as i4 from "@angular/common";
const propMap = {
display: 'display',
height: 'height',
width: 'width',
backgroundSize: 'background-size',
backgroundRepeat: 'background-repeat',
};
export class IonicImageLoaderComponent {
constructor(_element, renderer, imageLoader, config) {
this._element = _element;
this.renderer = renderer;
this.imageLoader = imageLoader;
this.config = config;
/**
* Fallback URL to load when the image url fails to load or does not exist.
*/
this.fallbackUrl = this.config.fallbackUrl;
/**
* Whether to show a spinner while the image loads
*/
this.spinner = this.config.spinnerEnabled;
/**
* Whether to show the fallback image instead of a spinner while the image loads
*/
this.fallbackAsPlaceholder = this.config.fallbackAsPlaceholder;
/**
* Attributes to pass through to img tag if _useImg == true
*/
this.imgAttributes = [];
/**
* Enable/Disable caching
*/
this.cache = true;
/**
* Width of the image. This will be ignored if using useImg.
*/
this.width = this.config.width;
/**
* Height of the image. This will be ignored if using useImg.
*/
this.height = this.config.height;
/**
* Display type of the image. This will be ignored if using useImg.
*/
this.display = this.config.display;
/**
* Background size. This will be ignored if using useImg.
*/
this.backgroundSize = this.config.backgroundSize;
/**
* Background repeat. This will be ignored if using useImg.
*/
this.backgroundRepeat = this.config.backgroundRepeat;
/**
* Name of the spinner
*/
this.spinnerName = this.config.spinnerName;
/**
* Color of the spinner
*/
this.spinnerColor = this.config.spinnerColor;
/**
* Notify on image load..
*/
this.load = new EventEmitter();
/**
* Indicates if the image is still loading
*/
this.isLoading = true;
this._useImg = this.config.useImg;
}
/**
* Use <img> tag
*/
set useImg(val) {
this._useImg = val !== false;
}
/**
* Convenience attribute to disable caching
*/
set noCache(val) {
this.cache = val !== false;
}
get src() {
return this._src;
}
/**
* The URL of the image to load.
*/
set src(imageUrl) {
this._src = this.processImageUrl(imageUrl);
this.updateImage(this._src);
}
ngOnInit() {
if (this.fallbackAsPlaceholder && this.fallbackUrl) {
this.setImage(this.fallbackUrl, false);
}
if (!this.src) {
// image url was not passed
// this can happen when [src] is set to a variable that turned out to be undefined
// one example could be a list of users with their profile pictures
// in this case, it would be useful to use the fallback image instead
// if fallbackUrl was used as placeholder we do not need to set it again
if (!this.fallbackAsPlaceholder && this.fallbackUrl) {
// we're not going to cache the fallback image since it should be locally saved
this.setImage(this.fallbackUrl);
}
else {
this.isLoading = false;
}
}
}
updateImage(imageUrl) {
this.imageLoader
.getImagePath(imageUrl)
.then((url) => this.setImage(url))
.catch((error) => this.setImage(this.fallbackUrl || imageUrl));
}
/**
* Gets the image URL to be loaded and disables caching if necessary
*/
processImageUrl(imageUrl) {
if (this.cache === false) {
// need to disable caching
if (imageUrl.indexOf('?') < 0) {
// add ? if doesn't exists
imageUrl += '?';
}
else {
imageUrl += '&';
}
// append timestamp at the end to make URL unique
imageUrl += 'cache_buster=' + Date.now();
}
return imageUrl;
}
/**
* Set the image to be displayed
* @param imageUrl image src
* @param stopLoading set to true to mark the image as loaded
*/
setImage(imageUrl, stopLoading = true) {
this.isLoading = !stopLoading;
if (this._useImg) {
// Using <img> tag
if (!this.element) {
// create img element if we dont have one
this.element = this.renderer.createElement('img');
this.renderer.appendChild(this._element.nativeElement, this.element);
}
// set it's src
this.renderer.setAttribute(this.element, 'src', imageUrl);
// if imgAttributes are defined, add them to our img element
this.imgAttributes.forEach((attribute) => {
this.renderer.setAttribute(this.element, attribute.element, attribute.value);
});
if (this.fallbackUrl && !this.imageLoader.nativeAvailable) {
this.renderer.listen(this.element, 'error', () => this.renderer.setAttribute(this.element, 'src', this.fallbackUrl));
}
}
else {
// Not using <img> tag
this.element = this._element.nativeElement;
for (const prop in propMap) {
if (this[prop]) {
this.renderer.setStyle(this.element, propMap[prop], this[prop]);
}
}
this.renderer.setStyle(this.element, 'background-image', `url("${imageUrl || this.fallbackUrl}")`);
}
if (stopLoading) {
this.load.emit(this);
}
}
}
IonicImageLoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: IonicImageLoaderComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.ImageLoaderService }, { token: i2.ImageLoaderConfigService }], target: i0.ɵɵFactoryTarget.Component });
IonicImageLoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: IonicImageLoaderComponent, selector: "img-loader", inputs: { fallbackUrl: "fallbackUrl", spinner: "spinner", fallbackAsPlaceholder: "fallbackAsPlaceholder", imgAttributes: "imgAttributes", cache: "cache", width: "width", height: "height", display: "display", backgroundSize: "backgroundSize", backgroundRepeat: "backgroundRepeat", spinnerName: "spinnerName", spinnerColor: "spinnerColor", useImg: "useImg", noCache: "noCache", src: "src" }, outputs: { load: "load" }, ngImport: i0, template: `
<ion-spinner
*ngIf="spinner && isLoading && !fallbackAsPlaceholder"
[name]="spinnerName"
[color]="spinnerColor"
></ion-spinner>
<ng-content></ng-content>
`, isInline: true, styles: ["ion-spinner{float:none;margin-left:auto;margin-right:auto;display:block}\n"], components: [{ type: i3.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: IonicImageLoaderComponent, decorators: [{
type: Component,
args: [{
selector: 'img-loader',
template: `
<ion-spinner
*ngIf="spinner && isLoading && !fallbackAsPlaceholder"
[name]="spinnerName"
[color]="spinnerColor"
></ion-spinner>
<ng-content></ng-content>
`,
styles: [
'ion-spinner { float: none; margin-left: auto; margin-right: auto; display: block; }',
],
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.ImageLoaderService }, { type: i2.ImageLoaderConfigService }]; }, propDecorators: { fallbackUrl: [{
type: Input
}], spinner: [{
type: Input
}], fallbackAsPlaceholder: [{
type: Input
}], imgAttributes: [{
type: Input
}], cache: [{
type: Input
}], width: [{
type: Input
}], height: [{
type: Input
}], display: [{
type: Input
}], backgroundSize: [{
type: Input
}], backgroundRepeat: [{
type: Input
}], spinnerName: [{
type: Input
}], spinnerColor: [{
type: Input
}], load: [{
type: Output
}], useImg: [{
type: Input
}], noCache: [{
type: Input
}], src: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9uaWMtaW1hZ2UtbG9hZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lvbmljLWltYWdlLWxvYWRlci12Ny9zcmMvbGliL2lvbmljLWltYWdlLWxvYWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBSXRHLE1BQU0sT0FBTyxHQUFRO0lBQ25CLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLEtBQUssRUFBRSxPQUFPO0lBQ2QsY0FBYyxFQUFFLGlCQUFpQjtJQUNqQyxnQkFBZ0IsRUFBRSxtQkFBbUI7Q0FDdEMsQ0FBQztBQXFCRixNQUFNLE9BQU8seUJBQXlCO0lBNkRwQyxZQUNZLFFBQW9CLEVBQ3BCLFFBQW1CLEVBQ25CLFdBQStCLEVBQy9CLE1BQWdDO1FBSGhDLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDL0IsV0FBTSxHQUFOLE1BQU0sQ0FBMEI7UUFoRTVDOztXQUVHO1FBQ00sZ0JBQVcsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN2RDs7V0FFRztRQUNNLFlBQU8sR0FBWSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUN2RDs7V0FFRztRQUVNLDBCQUFxQixHQUFZLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7UUFDNUU7O1dBRUc7UUFDTSxrQkFBYSxHQUFxQixFQUFFLENBQUM7UUFDOUM7O1dBRUc7UUFDTSxVQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3RCOztXQUVHO1FBQ00sVUFBSyxHQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFD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QWYsS0FBSztnQkFJRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS04sSUFBSTtzQkFESCxNQUFNO2dCQXNCSCxNQUFNO3NCQURULEtBQUs7Z0JBU0YsT0FBTztzQkFEVixLQUFLO2dCQWVGLEdBQUc7c0JBRE4sS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJbWFnZUxvYWRlckNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2ltYWdlLWxvYWRlci1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IEltYWdlTG9hZGVyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvaW1hZ2UtbG9hZGVyLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgcHJvcE1hcDogYW55ID0ge1xyXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcclxuICBoZWlnaHQ6ICdoZWlnaHQnLFxyXG4gIHdpZHRoOiAnd2lkdGgnLFxyXG4gIGJhY2tncm91bmRTaXplOiAnYmFja2dyb3VuZC1zaXplJyxcclxuICBiYWNrZ3JvdW5kUmVwZWF0OiAnYmFja2dyb3VuZC1yZXBlYXQnLFxyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUF0dHJpYnV0ZSB7XHJcbiAgZWxlbWVudDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaW1nLWxvYWRlcicsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxpb24tc3Bpbm5lclxyXG4gICAgICAgICpuZ0lmPVwic3Bpbm5lciAmJiBpc0xvYWRpbmcgJiYgIWZhbGxiYWNrQXNQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgW25hbWVdPVwic3Bpbm5lck5hbWVcIlxyXG4gICAgICAgIFtjb2xvcl09XCJzcGlubmVyQ29sb3JcIlxyXG4gICAgPjwvaW9uLXNwaW5uZXI+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtcclxuICAgICdpb24tc3Bpbm5lciB7IGZsb2F0OiBub25lOyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyBkaXNwbGF5OiBibG9jazsgfScsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIElvbmljSW1hZ2VMb2FkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8qKlxyXG4gICAqIEZhbGxiYWNrIFVSTCB0byBsb2FkIHdoZW4gdGhlIGltYWdlIHVybCBmYWlscyB0byBsb2FkIG9yIGRvZXMgbm90IGV4aXN0LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGZhbGxiYWNrVXJsOiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5mYWxsYmFja1VybDtcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgYSBzcGlubmVyIHdoaWxlIHRoZSBpbWFnZSBsb2Fkc1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNwaW5uZXI6IGJvb2xlYW4gPSB0aGlzLmNvbmZpZy5zcGlubmVyRW5hYmxlZDtcclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIGZhbGxiYWNrIGltYWdlIGluc3RlYWQgb2YgYSBzcGlubmVyIHdoaWxlIHRoZSBpbWFnZSBsb2Fkc1xyXG4gICAqL1xyXG5cclxuICBASW5wdXQoKSBmYWxsYmFja0FzUGxhY2Vob2xkZXI6IGJvb2xlYW4gPSB0aGlzLmNvbmZpZy5mYWxsYmFja0FzUGxhY2Vob2xkZXI7XHJcbiAgLyoqXHJcbiAgICogQXR0cmlidXRlcyB0byBwYXNzIHRocm91Z2ggdG8gaW1nIHRhZyBpZiBfdXNlSW1nID09IHRydWVcclxuICAgKi9cclxuICBASW5wdXQoKSBpbWdBdHRyaWJ1dGVzOiBJbWFnZUF0dHJpYnV0ZVtdID0gW107XHJcbiAgLyoqXHJcbiAgICogRW5hYmxlL0Rpc2FibGUgY2FjaGluZ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNhY2hlID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiBXaWR0aCBvZiB0aGUgaW1hZ2UuIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIHVzaW5nIHVzZUltZy5cclxuICAgKi9cclxuICBASW5wdXQoKSB3aWR0aDogc3RyaW5nID0gdGhpcy5jb25maWcud2lkdGg7XHJcbiAgLyoqXHJcbiAgICogSGVpZ2h0IG9mIHRoZSBpbWFnZS4gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgdXNpbmcgdXNlSW1nLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGhlaWdodDogc3RyaW5nID0gdGhpcy5jb25maWcuaGVpZ2h0O1xyXG4gIC8qKlxyXG4gICAqIERpc3BsYXkgdHlwZSBvZiB0aGUgaW1hZ2UuIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIHVzaW5nIHVzZUltZy5cclxuICAgKi9cclxuICBASW5wdXQoKSBkaXNwbGF5OiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5kaXNwbGF5O1xyXG4gIC8qKlxyXG4gICAqIEJhY2tncm91bmQgc2l6ZS4gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgdXNpbmcgdXNlSW1nLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGJhY2tncm91bmRTaXplOiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5iYWNrZ3JvdW5kU2l6ZTtcclxuICAvKipcclxuICAgKiBCYWNrZ3JvdW5kIHJlcGVhdC4gVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgdXNpbmcgdXNlSW1nLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGJhY2tncm91bmRSZXBlYXQ6IHN0cmluZyA9IHRoaXMuY29uZmlnLmJhY2tncm91bmRSZXBlYXQ7XHJcbiAgLyoqXHJcbiAgICogTmFtZSBvZiB0aGUgc3Bpbm5lclxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNwaW5uZXJOYW1lOiBzdHJpbmcgPSB0aGlzLmNvbmZpZy5zcGlubmVyTmFtZTtcclxuICAvKipcclxuICAgKiBDb2xvciBvZiB0aGUgc3Bpbm5lclxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNwaW5uZXJDb2xvcjogc3RyaW5nID0gdGhpcy5jb25maWcuc3Bpbm5lckNvbG9yO1xyXG4gIC8qKlxyXG4gICAqIE5vdGlmeSBvbiBpbWFnZSBsb2FkLi5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBsb2FkOiBFdmVudEVtaXR0ZXI8SW9uaWNJbWFnZUxvYWRlckNvbXBvbmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPElvbmljSW1hZ2VMb2FkZXJDb21wb25lbnQ+KCk7XHJcbiAgLyoqXHJcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBpbWFnZSBpcyBzdGlsbCBsb2FkaW5nXHJcbiAgICovXHJcbiAgaXNMb2FkaW5nID0gdHJ1ZTtcclxuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXHJcbiAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgcHJpdmF0ZSBpbWFnZUxvYWRlcjogSW1hZ2VMb2FkZXJTZXJ2aWNlLFxyXG4gICAgICBwcml2YXRlIGNvbmZpZzogSW1hZ2VMb2FkZXJDb25maWdTZXJ2aWNlLFxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXNlSW1nOiBib29sZWFuID0gdGhpcy5jb25maWcudXNlSW1nO1xyXG5cclxuICAvKipcclxuICAgKiBVc2UgPGltZz4gdGFnXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgdXNlSW1nKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdXNlSW1nID0gdmFsICE9PSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlbmllbmNlIGF0dHJpYnV0ZSB0byBkaXNhYmxlIGNhY2hpbmdcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBub0NhY2hlKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5jYWNoZSA9IHZhbCAhPT0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zcmM6IHN0cmluZztcclxuXHJcbiAgZ2V0IHNyYygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NyYztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBVUkwgb2YgdGhlIGltYWdlIHRvIGxvYWQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc3JjKGltYWdlVXJsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3NyYyA9IHRoaXMucHJvY2Vzc0ltYWdlVXJsKGltYWdlVXJsKTtcclxuICAgIHRoaXMudXBkYXRlSW1hZ2UodGhpcy5fc3JjKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmFsbGJhY2tBc1BsYWNlaG9sZGVyICYmIHRoaXMuZmFsbGJhY2tVcmwpIHtcclxuICAgICAgdGhpcy5zZXRJbWFnZSh0aGlzLmZhbGxiYWNrVXJsLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnNyYykge1xyXG4gICAgICAvLyBpbWFnZSB1cmwgd2FzIG5vdCBwYXNzZWRcclxuICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gW3NyY10gaXMgc2V0IHRvIGEgdmFyaWFibGUgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIHVuZGVmaW5lZFxyXG4gICAgICAvLyBvbmUgZXhhbXBsZSBjb3VsZCBiZSBhIGxpc3Qgb2YgdXNlcnMgd2l0aCB0aGVpciBwcm9maWxlIHBpY3R1cmVzXHJcbiAgICAgIC8vIGluIHRoaXMgY2FzZSwgaXQgd291bGQgYmUgdXNlZnVsIHRvIHVzZSB0aGUgZmFsbGJhY2sgaW1hZ2UgaW5zdGVhZFxyXG4gICAgICAvLyBpZiBmYWxsYmFja1VybCB3YXMgdXNlZCBhcyBwbGFjZWhvbGRlciB3ZSBkbyBub3QgbmVlZCB0byBzZXQgaXQgYWdhaW5cclxuICAgICAgaWYgKCF0aGlzLmZhbGxiYWNrQXNQbGFjZWhvbGRlciAmJiB0aGlzLmZhbGxiYWNrVXJsKSB7XHJcbiAgICAgICAgLy8gd2UncmUgbm90IGdvaW5nIHRvIGNhY2hlIHRoZSBmYWxsYmFjayBpbWFnZSBzaW5jZSBpdCBzaG91bGQgYmUgbG9jYWxseSBzYXZlZFxyXG4gICAgICAgIHRoaXMuc2V0SW1hZ2UodGhpcy5mYWxsYmFja1VybCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVJbWFnZShpbWFnZVVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmltYWdlTG9hZGVyXHJcbiAgICAgICAgLmdldEltYWdlUGF0aChpbWFnZVVybClcclxuICAgICAgICAudGhlbigodXJsOiBzdHJpbmcpID0+IHRoaXMuc2V0SW1hZ2UodXJsKSlcclxuICAgICAgICAuY2F0Y2goKGVycm9yOiBhbnkpID0+IHRoaXMuc2V0SW1hZ2UodGhpcy5mYWxsYmFja1VybCB8fCBpbWFnZVVybCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgaW1hZ2UgVVJMIHRvIGJlIGxvYWRlZCBhbmQgZGlzYWJsZXMgY2FjaGluZyBpZiBuZWNlc3NhcnlcclxuICAgKi9cclxuICBwcml2YXRlIHByb2Nlc3NJbWFnZVVybChpbWFnZVVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmNhY2hlID09PSBmYWxzZSkge1xyXG4gICAgICAvLyBuZWVkIHRvIGRpc2FibGUgY2FjaGluZ1xyXG5cclxuICAgICAgaWYgKGltYWdlVXJsLmluZGV4T2YoJz8nKSA8IDApIHtcclxuICAgICAgICAvLyBhZGQgPyBpZiBkb2Vzbid0IGV4aXN0c1xyXG4gICAgICAgIGltYWdlVXJsICs9ICc/JztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbWFnZVVybCArPSAnJic7XHJcbiAgICAgIH1cclxuICAgICAgLy8gYXBwZW5kIHRpbWVzdGFtcCBhdCB0aGUgZW5kIHRvIG1ha2UgVVJMIHVuaXF1ZVxyXG4gICAgICBpbWFnZVVybCArPSAnY2FjaGVfYnVzdGVyPScgKyBEYXRlLm5vdygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbWFnZVVybDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgaW1hZ2UgdG8gYmUgZGlzcGxheWVkXHJcbiAgICogQHBhcmFtIGltYWdlVXJsIGltYWdlIHNyY1xyXG4gICAqIEBwYXJhbSBzdG9wTG9hZGluZyBzZXQgdG8gdHJ1ZSB0byBtYXJrIHRoZSBpbWFnZSBhcyBsb2FkZWRcclxuICAgKi9cclxuICBwcml2YXRlIHNldEltYWdlKGltYWdlVXJsOiBzdHJpbmcsIHN0b3BMb2FkaW5nOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSAhc3RvcExvYWRpbmc7XHJcblxyXG4gICAgaWYgKHRoaXMuX3VzZUltZykge1xyXG4gICAgICAvLyBVc2luZyA8aW1nPiB0YWdcclxuICAgICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcclxuICAgICAgICAvLyBjcmVhdGUgaW1nIGVsZW1lbnQgaWYgd2UgZG9udCBoYXZlIG9uZVxyXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBpdCdzIHNyY1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsZW1lbnQsICdzcmMnLCBpbWFnZVVybCk7XHJcblxyXG4gICAgICAvLyBpZiBpbWdBdHRyaWJ1dGVzIGFyZSBkZWZpbmVkLCBhZGQgdGhlbSB0byBvdXIgaW1nIGVsZW1lbnRcclxuICAgICAgdGhpcy5pbWdBdHRyaWJ1dGVzLmZvckVhY2goKGF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgYXR0cmlidXRlLmVsZW1lbnQsIGF0dHJpYnV0ZS52YWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodGhpcy5mYWxsYmFja1VybCAmJiAhdGhpcy5pbWFnZUxvYWRlci5uYXRpdmVBdmFpbGFibGUpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQsICdlcnJvcicsICgpID0+XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgJ3NyYycsIHRoaXMuZmFsbGJhY2tVcmwpLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE5vdCB1c2luZyA8aW1nPiB0YWdcclxuXHJcbiAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwcm9wTWFwKSB7XHJcbiAgICAgICAgaWYgKHRoaXNbcHJvcF0pIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50LCBwcm9wTWFwW3Byb3BdLCB0aGlzW3Byb3BdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgIHRoaXMuZWxlbWVudCxcclxuICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJyxcclxuICAgICAgICAgIGB1cmwoXCIke2ltYWdlVXJsIHx8IHRoaXMuZmFsbGJhY2tVcmx9XCIpYCxcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChzdG9wTG9hZGluZykge1xyXG4gICAgICB0aGlzLmxvYWQuZW1pdCh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19