UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

269 lines (268 loc) 23.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Observable } from 'rxjs'; import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { map, tap } from 'rxjs/operators'; /** * Service de gestion de fichier */ export class AsiFileService { /** * @param {?} http * @param {?} sanitizer */ constructor(http, sanitizer) { this.http = http; this.sanitizer = sanitizer; } /** * @param {?} file * @param {?=} sanitize * @return {?} */ fileToBase64(file, sanitize) { return this.toBase64(file, sanitize); } /** * @param {?} file * @param {?=} sanitize * @return {?} */ fileToBase64Url(file, sanitize) { return this.toBase64Url(file, sanitize); } /** * @param {?} file * @return {?} */ fileToBase64Data(file) { return this.toBase64Data(file); } /** * @param {?} blob * @param {?=} sanitize * @return {?} */ blobToBase64(blob, sanitize) { return this.toBase64(blob, sanitize); } /** * @param {?} blob * @param {?=} sanitize * @return {?} */ blobToBase64Url(blob, sanitize) { return this.toBase64Url(blob, sanitize); } /** * @param {?} blob * @return {?} */ blobToBase64Data(blob) { return this.toBase64Data(blob); } /** * @param {?} data * @param {?=} sanitize * @return {?} */ toBase64(data, sanitize) { return Observable.create((observer) => { /** @type {?} */ const reader = new FileReader(); reader.onloadend = () => { /** @type {?} */ let content = reader.result; if (!reader.result) { content = /** @type {?} */ (reader['content']); } if (sanitize) { content = this.sanitizer.bypassSecurityTrustResourceUrl(content); } observer.next(content); observer.complete(); }; reader.readAsDataURL(data); }); } /** * @param {?} data * @param {?=} sanitize * @return {?} */ toBase64Url(data, sanitize) { return this.toBase64(data, sanitize); } /** * @param {?} data * @return {?} */ toBase64Data(data) { return Observable.create((observer) => { /** @type {?} */ const reader = new FileReader(); reader.onloadend = () => { if (!reader.result) { observer.next(window.btoa(/** @type {?} */ (reader['content']))); } else { observer.next(window.btoa(/** @type {?} */ (reader.result))); } observer.complete(); }; reader.readAsBinaryString(data); }); } /** * Download the blob file with the specified name * @param {?} fileAsBlob the file to download as a Blob * @param {?} fileName the name to give to the downloaded file * @return {?} */ saveToFile(fileAsBlob, fileName) { // If no name is provided, we use the original name if available, or a default name if (!fileName) { if (!fileAsBlob.name) { fileName = 'tmpFile'; } else { fileName = fileAsBlob.name; } } if (window.navigator.msSaveBlob) { // IE window.navigator.msSaveBlob(fileAsBlob, fileName); } else { /** @type {?} */ let url = window.URL.createObjectURL(fileAsBlob); /** @type {?} */ const anchor = document.createElement('a'); anchor.download = fileName; anchor.target = '_blank'; anchor.href = url; anchor.dispatchEvent(new MouseEvent('click')); } } /** * Transform a Blob into a File adding a file name and a last modified date * @param {?} response The blob response * @return {?} */ getFileFromBlobResponse(response) { /** @type {?} */ const blob = response.body; // May be null if the server doesn't explicitly add the content-disposition in the headers if (blob.name == null) { /** @type {?} */ let originalFileName = response.headers.get('content-disposition').replace(/ /g, ''); if (originalFileName) { originalFileName = originalFileName.substring(originalFileName.lastIndexOf('filename=') + 9); } // The two attributes missing to a Blob to be a File blob.name = originalFileName; } if (blob.lastModifiedDate == null) { blob.lastModifiedDate = new Date(); } return /** @type {?} */ (blob); } /** * @param {?} file * @return {?} */ getFileUrl(file) { /** @type {?} */ let url = URL.createObjectURL(file); return this.sanitizer.bypassSecurityTrustResourceUrl(url); } /** * @param {?} fileUrl * @return {?} */ getFileAsText(fileUrl) { return this.http.get(fileUrl, { responseType: 'text' }); } /** * @param {?} fileUrl * @return {?} */ getFileAsBlob(fileUrl) { return this.http.get(fileUrl, { responseType: 'blob', observe: 'response' }).pipe(map((response) => { return this.getFileFromBlobResponse(response); })); } /** * @param {?} fileUrl * @param {?} body * @return {?} */ getFileAsBlobFromPostRequest(fileUrl, body) { return this.http.post(fileUrl, body, { responseType: 'blob', observe: 'response' }).pipe(map((response) => { return this.getFileFromBlobResponse(response); })); } /** * Download the file at the given url * @param {?} fileUrl The url of the downloadable file * @param {?=} fileName [Optional] The new name of the downloaded file * @return {?} */ downloadFile(fileUrl, fileName) { return this.getFileAsBlob(fileUrl).pipe(tap((fileAsBlob) => { this.saveToFile(fileAsBlob, fileName); })); } /** * Download the file at the given url from a POST request * @param {?} fileUrl The url of the downloadable file * @param {?} body the POST request body * @param {?=} fileName [Optional] The new name of the downloaded file * @return {?} */ downloadFileFromPostRequest(fileUrl, body, fileName) { return this.getFileAsBlobFromPostRequest(fileUrl, body).pipe(tap((fileAsBlob) => { this.saveToFile(fileAsBlob, fileName); })); } /** * @param {?} fileUrl * @return {?} */ getBlobImage(fileUrl) { return this.http.get(fileUrl, { responseType: 'blob' }); } /** * @param {?} url * @param {?} file * @param {?=} reportProgress * @return {?} */ uploadFile(url, file, reportProgress = false) { /** @type {?} */ let formData = new FormData(); formData.append('file', file, file.name); /** @type {?} */ const observe = reportProgress ? 'events' : 'body'; return this.http.post(url, formData, { reportProgress: reportProgress, observe: observe }); } } AsiFileService.decorators = [ { type: Injectable } ]; /** @nocollapse */ AsiFileService.ctorParameters = () => [ { type: HttpClient }, { type: DomSanitizer } ]; if (false) { /** @type {?} */ AsiFileService.prototype.http; /** @type {?} */ AsiFileService.prototype.sanitizer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWZpbGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvYXNpLWZpbGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFtQixNQUFNLDJCQUEyQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFNMUMsTUFBTTs7Ozs7SUFFSixZQUFvQixJQUFnQixFQUFVLFNBQXVCO1FBQWpELFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFjO0tBQ3BFOzs7Ozs7SUFFRCxZQUFZLENBQUMsSUFBVSxFQUFFLFFBQWtCO1FBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztLQUN0Qzs7Ozs7O0lBRUQsZUFBZSxDQUFDLElBQVUsRUFBRSxRQUFrQjtRQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDekM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsSUFBVTtRQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNoQzs7Ozs7O0lBRUQsWUFBWSxDQUFDLElBQVUsRUFBRSxRQUFrQjtRQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDdEM7Ozs7OztJQUVELGVBQWUsQ0FBQyxJQUFVLEVBQUUs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O0tBQ0w7Ozs7Ozs7O0lBUUQsMkJBQTJCLENBQUMsT0FBZSxFQUFFLElBQVMsRUFBRSxRQUFpQjtRQUN2RSxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDOUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDdkMsQ0FBQyxDQUFDLENBQUM7S0FDTDs7Ozs7SUFFRCxZQUFZLENBQUMsT0FBZTtRQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7S0FDekQ7Ozs7Ozs7SUFFRCxVQUFVLENBQUMsR0FBVyxFQUFFLElBQVUsRUFBRSxjQUFjLEdBQUcsS0FBSzs7UUFDeEQsSUFBSSxRQUFRLEdBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUN4QyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztRQUN6QyxNQUFNLE9BQU8sR0FBUSxjQUFjLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztLQUM1Rjs7O1lBdktGLFVBQVU7Ozs7WUFSRixVQUFVO1lBRVYsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmliZXIgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aWNlIGRlIGdlc3Rpb24gZGUgZmljaGllclxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQXNpRmlsZVNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcclxuICB9XHJcblxyXG4gIGZpbGVUb0Jhc2U2NChmaWxlOiBGaWxlLCBzYW5pdGl6ZT86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMudG9CYXNlNjQoZmlsZSwgc2FuaXRpemUpO1xyXG4gIH1cclxuXHJcbiAgZmlsZVRvQmFzZTY0VXJsKGZpbGU6IEZpbGUsIHNhbml0aXplPzogYm9vbGVhbik6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy50b0Jhc2U2NFVybChmaWxlLCBzYW5pdGl6ZSk7XHJcbiAgfVxyXG5cclxuICBmaWxlVG9CYXNlNjREYXRhKGZpbGU6IEZpbGUpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMudG9CYXNlNjREYXRhKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgYmxvYlRvQmFzZTY0KGJsb2I6IEJsb2IsIHNhbml0aXplPzogYm9vbGVhbik6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy50b0Jhc2U2NChibG9iLCBzYW5pdGl6ZSk7XHJcbiAgfVxyXG5cclxuICBibG9iVG9CYXNlNjRVcmwoYmxvYjogQmxvYiwgc2FuaXRpemU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLnRvQmFzZTY0VXJsKGJsb2IsIHNhbml0aXplKTtcclxuICB9XHJcblxyXG4gIGJsb2JUb0Jhc2U2NERhdGEoYmxvYjogQmxvYik6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy50b0Jhc2U2NERhdGEoYmxvYik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvQmFzZTY0KGRhdGE6IGFueSwgc2FuaXRpemU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZSgob2JzZXJ2ZXI6IFN1YnNjcmliZXI8YW55PikgPT4ge1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xyXG4gICAgICAgIGxldCBjb250ZW50OiBhbnkgPSByZWFkZXIucmVzdWx0O1xyXG4gICAgICAgIGlmICghcmVhZGVyLnJlc3VsdCkge1xyXG4gICAgICAgICAgY29udGVudCA9IDxzdHJpbmc+cmVhZGVyWydjb250ZW50J107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzYW5pdGl6ZSkge1xyXG4gICAgICAgICAgY29udGVudCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChjb250ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChjb250ZW50KTtcclxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGRhdGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvQmFzZTY0VXJsKGRhdGE6IGFueSwgc2FuaXRpemU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnRvQmFzZTY0KGRhdGEsIHNhbml0aXplKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9CYXNlNjREYXRhKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUoKG9ic2VydmVyOiBTdWJzY3JpYmVyPGFueT4pID0+IHtcclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICBpZiAoIXJlYWRlci5yZXN1bHQpIHtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQod2luZG93LmJ0b2EoPHN0cmluZz5yZWFkZXJbJ2NvbnRlbnQnXSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHdpbmRvdy5idG9hKDxzdHJpbmc+cmVhZGVyLnJlc3VsdCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoZGF0YSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIHRoZSBibG9iIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVcclxuICAgKiBAcGFyYW0gZmlsZUFzQmxvYiB0aGUgZmlsZSB0byBkb3dubG9hZCBhcyBhIEJsb2JcclxuICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIG5hbWUgdG8gZ2l2ZSB0byB0aGUgZG93bmxvYWRlZCBmaWxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzYXZlVG9GaWxlKGZpbGVBc0Jsb2I6IEZpbGUsIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIElmIG5vIG5hbWUgaXMgcHJvdmlkZWQsIHdlIHVzZSB0aGUgb3JpZ2luYWwgbmFtZSBpZiBhdmFpbGFibGUsIG9yIGEgZGVmYXVsdCBuYW1lXHJcbiAgICBpZiAoIWZpbGVOYW1lKSB7XHJcbiAgICAgIGlmICghZmlsZUFzQmxvYi5uYW1lKSB7XHJcbiAgICAgICAgZmlsZU5hbWUgPSAndG1wRmlsZSc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZmlsZU5hbWUgPSBmaWxlQXNCbG9iLm5hbWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHsgIC8vIElFXHJcbiAgICAgIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYihmaWxlQXNCbG9iLCBmaWxlTmFtZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZUFzQmxvYik7XHJcbiAgICAgIGNvbnN0IGFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgYW5jaG9yLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICAgIGFuY2hvci50YXJnZXQgPSAnX2JsYW5rJztcclxuICAgICAgYW5jaG9yLmhyZWYgPSB1cmw7XHJcbiAgICAgIGFuY2hvci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybSBhIEJsb2IgaW50byBhIEZpbGUgYWRkaW5nIGEgZmlsZSBuYW1lIGFuZCBhIGxhc3QgbW9kaWZpZWQgZGF0ZVxyXG4gICAqIEBwYXJhbSByZXNwb25zZSBUaGUgYmxvYiByZXNwb25zZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsZUZyb21CbG9iUmVzcG9uc2UocmVzcG9uc2U6IGFueSk6IEZpbGUge1xyXG4gICAgY29uc3QgYmxvYjogYW55ID0gcmVzcG9uc2UuYm9keTtcclxuICAgIC8vIE1heSBiZSBudWxsIGlmIHRoZSBzZXJ2ZXIgZG9lc24ndCBleHBsaWNpdGx5IGFkZCB0aGUgY29udGVudC1kaXNwb3NpdGlvbiBpbiB0aGUgaGVhZGVyc1xyXG4gICAgaWYgKGJsb2IubmFtZSA9PSBudWxsKSB7XHJcbiAgICAgIGxldCBvcmlnaW5hbEZpbGVOYW1lID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKS5yZXBsYWNlKC8gL2csICcnKTtcclxuICAgICAgaWYgKG9yaWdpbmFsRmlsZU5hbWUpIHtcclxuICAgICAgICBvcmlnaW5hbEZpbGVOYW1lID0gb3JpZ2luYWxGaWxlTmFtZS5zdWJzdHJpbmcob3JpZ2luYWxGaWxlTmFtZS5sYXN0SW5kZXhPZignZmlsZW5hbWU9JykgKyA5KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBUaGUgdHdvIGF0dHJpYnV0ZXMgbWlzc2luZyB0byBhIEJsb2IgdG8gYmUgYSBGaWxlXHJcbiAgICAgIGJsb2IubmFtZSA9IG9yaWdpbmFsRmlsZU5hbWU7XHJcbiAgICB9XHJcbiAgICBpZiAoYmxvYi5sYXN0TW9kaWZpZWREYXRlID09IG51bGwpIHtcclxuICAgICAgYmxvYi5sYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiA8RmlsZT5ibG9iO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZVVybChmaWxlOiBGaWxlKTogU2FmZVJlc291cmNlVXJsIHtcclxuICAgIGxldCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xyXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZUFzVGV4dChmaWxlVXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZmlsZVVybCwgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KTtcclxuICB9XHJcblxyXG4gIGdldEZpbGVBc0Jsb2IoZmlsZVVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxGaWxlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChmaWxlVXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pLnBpcGUobWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWxlRnJvbUJsb2JSZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlQXNCbG9iRnJvbVBvc3RSZXF1ZXN0KGZpbGVVcmw6IHN0cmluZywgYm9keTogYW55KTogT2JzZXJ2YWJsZTxGaWxlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZmlsZVVybCwgYm9keSwgeyByZXNwb25zZVR5cGU6ICdibG9iJywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS5waXBlKG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsZUZyb21CbG9iUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWQgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIHVybFxyXG4gICAqIEBwYXJhbSBmaWxlVXJsIFRoZSB1cmwgb2YgdGhlIGRvd25sb2FkYWJsZSBmaWxlXHJcbiAgICogQHBhcmFtIGZpbGVOYW1lIFtPcHRpb25hbF0gVGhlIG5ldyBuYW1lIG9mIHRoZSBkb3dubG9hZGVkIGZpbGVcclxuICAgKi9cclxuICBkb3dubG9hZEZpbGUoZmlsZVVybDogc3RyaW5nLCBmaWxlTmFtZT86IHN0cmluZyk6IE9ic2VydmFibGU8RmlsZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsZUFzQmxvYihmaWxlVXJsKS5waXBlKHRhcCgoZmlsZUFzQmxvYikgPT4ge1xyXG4gICAgICB0aGlzLnNhdmVUb0ZpbGUoZmlsZUFzQmxvYiwgZmlsZU5hbWUpO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWQgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIHVybCBmcm9tIGEgUE9TVCByZXF1ZXN0XHJcbiAgICogQHBhcmFtIGZpbGVVcmwgVGhlIHVybCBvZiB0aGUgZG93bmxvYWRhYmxlIGZpbGVcclxuICAgKiBAcGFyYW0gYm9keSB0aGUgUE9TVCByZXF1ZXN0IGJvZHlcclxuICAgKiBAcGFyYW0gZmlsZU5hbWUgW09wdGlvbmFsXSBUaGUgbmV3IG5hbWUgb2YgdGhlIGRvd25sb2FkZWQgZmlsZVxyXG4gICAqL1xyXG4gIGRvd25sb2FkRmlsZUZyb21Qb3N0UmVxdWVzdChmaWxlVXJsOiBzdHJpbmcsIGJvZHk6IGFueSwgZmlsZU5hbWU/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPEZpbGU+IHtcclxuICAgIHJldHVybiB0aGlzLmdldEZpbGVBc0Jsb2JGcm9tUG9zdFJlcXVlc3QoZmlsZVVybCwgYm9keSkucGlwZSh0YXAoKGZpbGVBc0Jsb2IpID0+IHtcclxuICAgICAgdGhpcy5zYXZlVG9GaWxlKGZpbGVBc0Jsb2IsIGZpbGVOYW1lKTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGdldEJsb2JJbWFnZShmaWxlVXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEJsb2I+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGZpbGVVcmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSk7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRGaWxlKHVybDogc3RyaW5nLCBmaWxlOiBGaWxlLCByZXBvcnRQcm9ncmVzcyA9IGZhbHNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XHJcbiAgICBjb25zdCBvYnNlcnZlOiBhbnkgPSByZXBvcnRQcm9ncmVzcyA/ICdldmVudHMnIDogJ2JvZHknO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwgZm9ybURhdGEsIHsgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzLCBvYnNlcnZlOiBvYnNlcnZlIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=