@schoolbelle/common
Version:
Demo library to showcase Angular packaging format
254 lines (248 loc) • 25.3 kB
JavaScript
import { Injectable, Inject, NgModule } from '@angular/core';
import { REST_SERVER_HOST } from '@schoolbelle/common/tokens';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { GroupService } from '@schoolbelle/common/services/group';
import { SocketService } from '@schoolbelle/common/services/socket';
import { Observable, Subject } from 'rxjs';
import { forEach } from 'lodash';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class FileService {
/**
* @param {?} http
* @param {?} groupService
* @param {?} socketService
* @param {?} serverHost
*/
constructor(http, groupService, socketService, serverHost) {
this.http = http;
this.groupService = groupService;
this.socketService = socketService;
this.serverHost = serverHost;
this.uploadStatusChangeEvent = new Subject();
this.uploadStatus = new Map();
}
/**
* @return {?}
*/
get onUploadStatusChange() {
return this.uploadStatusChangeEvent.asObservable();
}
/**
* @param {?} key
* @param {?} data
* @return {?}
*/
setUploadStatus(key, data) {
this.uploadStatus.set(key, data);
this.uploadStatusChangeEvent.next(this.caculatePercent());
}
/**
* @param {?} key
* @param {?} data
* @return {?}
*/
updateUploadStatus(key, data) {
let /** @type {?} */ found = this.uploadStatus.get(key);
if (found) {
Object.assign(found, data);
this.uploadStatusChangeEvent.next(this.caculatePercent());
}
}
/**
* @return {?}
*/
caculatePercent() {
let /** @type {?} */ perc = 0;
this.uploadStatus.forEach((uploadState, key) => {
perc +=
(uploadState.upload * 0.5 +
(typeof uploadState.process === 'undefined'
? 1
: uploadState.process) *
0.5) /
this.uploadStatus.size;
});
return perc;
}
/**
* @param {?} file
* @param {?} opts
* @return {?}
*/
getUrl(file, opts) {
return this.http
.post(this.serverHost + '/group/file/sign_url', {
sign_for: 'upload',
name: file.name,
type: file.type,
size: file.size,
process: opts.process
}, {
headers: { Authorization: `Bearer ${this.groupService.token}` }
})
.toPromise();
}
/**
* @param {?} file
* @param {?=} opts
* @return {?}
*/
upload(file, opts = { process: false }) {
return new Promise((resolve, reject) => {
this.getUrl(file, opts)
.then((data) => {
this.setUploadStatus(data.file_id, {
name: file.name,
size: file.size,
type: file.type,
upload: 0,
process: opts.process ? 0 : undefined
});
this.http
.put(data.signedUrl, file, { reportProgress: true })
.subscribe(event => {
console.log(event);
// let perc = Math.round(progressEvent.loaded / progressEvent.total * 100);
// let info = this.uploadStatus.get(data.file_id);
// if (info) info.upload = perc;
// observer.next(perc);
}, reject, () => {
this.updateUploadStatus(data.file_id, { upload: 100 });
if (opts.process === true)
this.observeProgress(data.file_id).subscribe(null, reject, () => resolve(data.file_id));
else
resolve(data.file_id);
});
})
.catch(reject);
}).then((sbe_file_id) => this.register(sbe_file_id));
}
/**
* @param {?} sbe_file_id
* @return {?}
*/
register(sbe_file_id) {
return this.http
.post(this.serverHost + '/group/file/register', { file_id: sbe_file_id }, { headers: { Authorization: `Bearer ${this.groupService.token}` } })
.toPromise();
// .then(response=>response.json());
}
/**
* @param {?} file_id
* @return {?}
*/
observeProgress(file_id) {
return new Observable(observer => {
let /** @type {?} */ uploadStatus = this.uploadStatus.get(file_id);
let /** @type {?} */ process = uploadStatus ? uploadStatus.process : undefined;
if (process === undefined)
observer.error('no processing found');
else if (process === 100)
observer.complete();
else {
this.socketService.listen('f' + file_id);
let /** @type {?} */ subscription = this.socketService
.getObservable('f' + file_id)
.subscribe(event => {
let /** @type {?} */ data = event.data;
if (data.match(/download \d+/))
process = Math.round(FileService.Weights.download * parseInt(data.replace(/\D/g, '')));
else if (data.match(/convert.low \d+/))
process = Math.round(FileService.Weights.download * 100 +
FileService.Weights.convert *
parseInt(data.replace(/\D/g, '')));
else if (data.match(/upload.low \d+/))
process = Math.round((FileService.Weights.download + FileService.Weights.convert) *
100 +
FileService.Weights.upload * parseInt(data.replace(/\D/g, '')));
this.updateUploadStatus(file_id, { process: process });
if (process === 100 || data.match('job is done')) {
observer.complete();
this.socketService.unlisten('f' + file_id);
subscription.unsubscribe();
}
else if (data.match('timeout')) {
observer.error('timeout');
subscription.unsubscribe();
}
else {
observer.next(process);
}
});
}
});
}
/**
* @param {?} letterFiles
* @param {?=} process
* @return {?}
*/
multipleUpload(letterFiles, process = true) {
this.uploadStatus.clear();
if (process)
this.socketService.connect(true);
let /** @type {?} */ promises = [];
forEach(letterFiles, (file, index) => {
if (file instanceof File) {
promises.push(this.upload(file, { process: process }).then((fileInfo) => {
letterFiles.splice(index, 1, fileInfo);
}));
}
});
return Promise.all(promises).then(() => /** @type {?} */ (letterFiles));
}
/**
* @param {?} uri
* @param {?} name
* @return {?}
*/
download(uri, name) { }
}
FileService.Weights = {
download: 0.1,
convert: 0.8,
upload: 0.1
};
FileService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
FileService.ctorParameters = () => [
{ type: HttpClient, },
{ type: GroupService, },
{ type: SocketService, },
{ type: undefined, decorators: [{ type: Inject, args: [REST_SERVER_HOST,] },] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class FileServiceModule {
/**
* @return {?}
*/
static forRoot() {
return {
ngModule: FileServiceModule,
providers: [FileService]
};
}
}
FileServiceModule.decorators = [
{ type: NgModule, args: [{
imports: [HttpClientModule]
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { FileService, FileServiceModule };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nob29sYmVsbGUtY29tbW9uLXNlcnZpY2VzLWZpbGUuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BzY2hvb2xiZWxsZS9jb21tb24vc2VydmljZXMvZmlsZS9maWxlLnNlcnZpY2UudHMiLCJuZzovL0BzY2hvb2xiZWxsZS9jb21tb24vc2VydmljZXMvZmlsZS9maWxlLXNlcnZpY2UubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUkVTVF9TRVJWRVJfSE9TVCB9IGZyb20gJ0BzY2hvb2xiZWxsZS9jb21tb24vdG9rZW5zJztcblxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEdyb3VwU2VydmljZSB9IGZyb20gJ0BzY2hvb2xiZWxsZS9jb21tb24vc2VydmljZXMvZ3JvdXAnO1xuaW1wb3J0IHsgU29ja2V0U2VydmljZSB9IGZyb20gJ0BzY2hvb2xiZWxsZS9jb21tb24vc2VydmljZXMvc29ja2V0JztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IFVwbG9hZFN0YXR1cyB9IGZyb20gJy4vdXBsb2FkLXN0YXR1cy50eXBlJztcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlSW5mb0ludGVyZmFjZSB7XG4gIGZpbGVfaWQ6IG51bWJlcjtcbiAgdXJsOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBwcmlvcml0eTogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7XG4gIGRvd25zYW1wbGVkOiBzdHJpbmc7XG4gIHRodW1ibmFpbDogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmlsZVNlcnZpY2Uge1xuICBzdGF0aWMgV2VpZ2h0cyA9IHtcbiAgICBkb3dubG9hZDogMC4xLFxuICAgIGNvbnZlcnQ6IDAuOCxcbiAgICB1cGxvYWQ6IDAuMVxuICB9O1xuICBwcml2YXRlIHVwbG9hZFN0YXR1c0NoYW5nZUV2ZW50ID0gbmV3IFN1YmplY3QoKTtcbiAgZ2V0IG9uVXBsb2FkU3RhdHVzQ2hhbmdlKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkU3RhdHVzQ2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgcHVibGljIHVwbG9hZFN0YXR1czogTWFwPG51bWJlciwgVXBsb2FkU3RhdHVzPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaHR0cDogSHR0cENsaWVudCxcbiAgICBwdWJsaWMgZ3JvdXBTZXJ2aWNlOiBHcm91cFNlcnZpY2UsXG4gICAgcHVibGljIHNvY2tldFNlcnZpY2U6IFNvY2tldFNlcnZpY2UsXG4gICAgQEluamVjdChSRVNUX1NFUlZFUl9IT1NUKSBwcml2YXRlIHNlcnZlckhvc3Q6IHN0cmluZ1xuICApIHt9XG4gIHByaXZhdGUgc2V0VXBsb2FkU3RhdHVzKGtleTogYW55LCBkYXRhOiBVcGxvYWRTdGF0dXMpIHtcbiAgICB0aGlzLnVwbG9hZFN0YXR1cy5zZXQoa2V5LCBkYXRhKTtcbiAgICB0aGlzLnVwbG9hZFN0YXR1c0NoYW5nZUV2ZW50Lm5leHQodGhpcy5jYWN1bGF0ZVBlcmNlbnQoKSk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVVcGxvYWRTdGF0dXMoa2V5OiBhbnksIGRhdGE6IFBhcnRpYWw8VXBsb2FkU3RhdHVzPikge1xuICAgIGxldCBmb3VuZCA9IHRoaXMudXBsb2FkU3RhdHVzLmdldChrZXkpO1xuICAgIGlmIChmb3VuZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihmb3VuZCwgZGF0YSk7XG4gICAgICB0aGlzLnVwbG9hZFN0YXR1c0NoYW5nZUV2ZW50Lm5leHQodGhpcy5jYWN1bGF0ZVBlcmNlbnQoKSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2FjdWxhdGVQZXJjZW50KCkge1xuICAgIGxldCBwZXJjID0gMDtcbiAgICB0aGlzLnVwbG9hZFN0YXR1cy5mb3JFYWNoKCh1cGxvYWRTdGF0ZSwga2V5KSA9PiB7XG4gICAgICBwZXJjICs9XG4gICAgICAgICh1cGxvYWRTdGF0ZS51cGxvYWQgKiAwLjUgK1xuICAgICAgICAgICh0eXBlb2YgdXBsb2FkU3RhdGUucHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgOiB1cGxvYWRTdGF0ZS5wcm9jZXNzKSAqXG4gICAgICAgICAgICAwLjUpIC9cbiAgICAgICAgdGhpcy51cGxvYWRTdGF0dXMuc2l6ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGVyYztcbiAgfVxuICBwdWJsaWMgZ2V0VXJsKGZpbGU6IEZpbGUsIG9wdHM6IHsgcHJvY2VzczogYm9vbGVhbiB9KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoXG4gICAgICAgIHRoaXMuc2VydmVySG9zdCArICcvZ3JvdXAvZmlsZS9zaWduX3VybCcsXG4gICAgICAgIHtcbiAgICAgICAgICBzaWduX2ZvcjogJ3VwbG9hZCcsXG4gICAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgcHJvY2Vzczogb3B0cy5wcm9jZXNzXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmdyb3VwU2VydmljZS50b2tlbn1gIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG4gIHB1YmxpYyB1cGxvYWQoXG4gICAgZmlsZTogRmlsZSxcbiAgICBvcHRzOiB7IHByb2Nlc3M6IGJvb2xlYW4gfSA9IHsgcHJvY2VzczogZmFsc2UgfVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdldFVybChmaWxlLCBvcHRzKVxuICAgICAgICAudGhlbigoZGF0YTogeyBmaWxlX2lkOiBudW1iZXI7IHNpZ25lZFVybDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICB0aGlzLnNldFVwbG9hZFN0YXR1cyhkYXRhLmZpbGVfaWQsIHtcbiAgICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICAgIHVwbG9hZDogMCxcbiAgICAgICAgICAgIHByb2Nlc3M6IG9wdHMucHJvY2VzcyA/IDAgOiB1bmRlZmluZWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wdXQoZGF0YS5zaWduZWRVcmwsIGZpbGUsIHsgcmVwb3J0UHJvZ3Jlc3M6IHRydWUgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XG4gICAgICAgICAgICAgICAgLy8gbGV0IHBlcmMgPSBNYXRoLnJvdW5kKHByb2dyZXNzRXZlbnQubG9hZGVkIC8gcHJvZ3Jlc3NFdmVudC50b3RhbCAqIDEwMCk7XG4gICAgICAgICAgICAgICAgLy8gbGV0IGluZm8gPSB0aGlzLnVwbG9hZFN0YXR1cy5nZXQoZGF0YS5maWxlX2lkKTtcbiAgICAgICAgICAgICAgICAvLyBpZiAoaW5mbykgaW5mby51cGxvYWQgPSBwZXJjO1xuICAgICAgICAgICAgICAgIC8vIG9ic2VydmVyLm5leHQocGVyYyk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVXBsb2FkU3RhdHVzKGRhdGEuZmlsZV9pZCwgeyB1cGxvYWQ6IDEwMCB9KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5wcm9jZXNzID09PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlUHJvZ3Jlc3MoZGF0YS5maWxlX2lkKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4gcmVzb2x2ZShkYXRhLmZpbGVfaWQpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGVsc2UgcmVzb2x2ZShkYXRhLmZpbGVfaWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gocmVqZWN0KTtcbiAgICB9KS50aGVuKChzYmVfZmlsZV9pZDogbnVtYmVyKSA9PiB0aGlzLnJlZ2lzdGVyKHNiZV9maWxlX2lkKSk7XG4gIH1cbiAgcHVibGljIHJlZ2lzdGVyKHNiZV9maWxlX2lkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdChcbiAgICAgICAgdGhpcy5zZXJ2ZXJIb3N0ICsgJy9ncm91cC9maWxlL3JlZ2lzdGVyJyxcbiAgICAgICAgeyBmaWxlX2lkOiBzYmVfZmlsZV9pZCB9LFxuICAgICAgICB7IGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuZ3JvdXBTZXJ2aWNlLnRva2VufWAgfSB9XG4gICAgICApXG4gICAgICAudG9Qcm9taXNlKCk7XG4gICAgLy8gLnRoZW4ocmVzcG9uc2U9PnJlc3BvbnNlLmpzb24oKSk7XG4gIH1cbiAgcHJpdmF0ZSBvYnNlcnZlUHJvZ3Jlc3MoZmlsZV9pZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcbiAgICAgIGxldCB1cGxvYWRTdGF0dXM6IFVwbG9hZFN0YXR1cyA9IHRoaXMudXBsb2FkU3RhdHVzLmdldChmaWxlX2lkKTtcbiAgICAgIGxldCBwcm9jZXNzID0gdXBsb2FkU3RhdHVzID8gdXBsb2FkU3RhdHVzLnByb2Nlc3MgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvY2VzcyA9PT0gdW5kZWZpbmVkKSBvYnNlcnZlci5lcnJvcignbm8gcHJvY2Vzc2luZyBmb3VuZCcpO1xuICAgICAgZWxzZSBpZiAocHJvY2VzcyA9PT0gMTAwKSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuc29ja2V0U2VydmljZS5saXN0ZW4oJ2YnICsgZmlsZV9pZCk7XG4gICAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLnNvY2tldFNlcnZpY2VcbiAgICAgICAgICAuZ2V0T2JzZXJ2YWJsZSgnZicgKyBmaWxlX2lkKVxuICAgICAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgaWYgKGRhdGEubWF0Y2goL2Rvd25sb2FkIFxcZCsvKSlcbiAgICAgICAgICAgICAgcHJvY2VzcyA9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgRmlsZVNlcnZpY2UuV2VpZ2h0cy5kb3dubG9hZCAqIHBhcnNlSW50KGRhdGEucmVwbGFjZSgvXFxEL2csICcnKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEubWF0Y2goL2NvbnZlcnQubG93IFxcZCsvKSlcbiAgICAgICAgICAgICAgcHJvY2VzcyA9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgRmlsZVNlcnZpY2UuV2VpZ2h0cy5kb3dubG9hZCAqIDEwMCArXG4gICAgICAgICAgICAgICAgICBGaWxlU2VydmljZS5XZWlnaHRzLmNvbnZlcnQgKlxuICAgICAgICAgICAgICAgICAgICBwYXJzZUludChkYXRhLnJlcGxhY2UoL1xcRC9nLCAnJykpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhLm1hdGNoKC91cGxvYWQubG93IFxcZCsvKSlcbiAgICAgICAgICAgICAgcHJvY2VzcyA9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgKEZpbGVTZXJ2aWNlLldlaWdodHMuZG93bmxvYWQgKyBGaWxlU2VydmljZS5XZWlnaHRzLmNvbnZlcnQpICpcbiAgICAgICAgICAgICAgICAgIDEwMCArXG4gICAgICAgICAgICAgICAgICBGaWxlU2VydmljZS5XZWlnaHRzLnVwbG9hZCAqIHBhcnNlSW50KGRhdGEucmVwbGFjZSgvXFxEL2csICcnKSlcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVVcGxvYWRTdGF0dXMoZmlsZV9pZCwgeyBwcm9jZXNzOiBwcm9jZXNzIH0pO1xuXG4gICAgICAgICAgICBpZiAocHJvY2VzcyA9PT0gMTAwIHx8IGRhdGEubWF0Y2goJ2pvYiBpcyBkb25lJykpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgdGhpcy5zb2NrZXRTZXJ2aWNlLnVubGlzdGVuKCdmJyArIGZpbGVfaWQpO1xuICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5tYXRjaCgndGltZW91dCcpKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCd0aW1lb3V0Jyk7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChwcm9jZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgbXVsdGlwbGVVcGxvYWQoXG4gICAgbGV0dGVyRmlsZXM6IEFycmF5PEZpbGUgfCBGaWxlSW5mb0ludGVyZmFjZT4sXG4gICAgcHJvY2VzczogYm9vbGVhbiA9IHRydWVcbiAgICAvLyBsaXN0OiB7IGZpbGU6IEZpbGU7IHByaW9yaXR5OiBudW1iZXI7IHByb2Nlc3M/OiBib29sZWFuIH1bXVxuICApOiBQcm9taXNlPEZpbGVJbmZvSW50ZXJmYWNlW10+IHtcbiAgICB0aGlzLnVwbG9hZFN0YXR1cy5jbGVhcigpO1xuICAgIGlmIChwcm9jZXNzKSB0aGlzLnNvY2tldFNlcnZpY2UuY29ubmVjdCh0cnVlKTtcbiAgICBsZXQgcHJvbWlzZXMgPSBbXTtcbiAgICBmb3JFYWNoKGxldHRlckZpbGVzLCAoZmlsZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgIHRoaXMudXBsb2FkKGZpbGUsIHsgcHJvY2VzczogcHJvY2VzcyB9KS50aGVuKFxuICAgICAgICAgICAgKGZpbGVJbmZvOiBGaWxlSW5mb0ludGVyZmFjZSkgPT4ge1xuICAgICAgICAgICAgICBsZXR0ZXJGaWxlcy5zcGxpY2UoaW5kZXgsIDEsIGZpbGVJbmZvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IGxldHRlckZpbGVzIGFzIEZpbGVJbmZvSW50ZXJmYWNlW10pO1xuICB9XG5cbiAgcHVibGljIGRvd25sb2FkKHVyaSwgbmFtZSkge31cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEZpbGVTZXJ2aWNlIH0gZnJvbSAnLi9maWxlLnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbSHR0cENsaWVudE1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgRmlsZVNlcnZpY2VNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IEZpbGVTZXJ2aWNlTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbRmlsZVNlcnZpY2VdXG4gICAgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7O0lBb0NFLFlBQ1MsTUFDQSxjQUNBLGVBQzJCO1FBSDNCLFNBQUksR0FBSixJQUFJO1FBQ0osaUJBQVksR0FBWixZQUFZO1FBQ1osa0JBQWEsR0FBYixhQUFhO1FBQ2MsZUFBVSxHQUFWLFVBQVU7dUNBVlosSUFBSSxPQUFPLEVBQUU7NEJBSUUsSUFBSSxHQUFHLEVBQUU7S0FPdEQ7Ozs7SUFWSixJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQUNwRDs7Ozs7O0lBU08sZUFBZSxDQUFDLEdBQVEsRUFBRSxJQUFrQjtRQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQzs7Ozs7OztJQUVwRCxrQkFBa0IsQ0FBQyxHQUFRLEVBQUUsSUFBMkI7UUFDOUQscUJBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksS0FBSyxFQUFFO1lBQ1QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENB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