angular-upcrop
Version:
Library with upload and crop feature for Angular 6+
242 lines (241 loc) • 22.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ViewChild, Inject } from '@angular/core';
import { UpcropUploadComponent } from '../upcrop-upload/upcrop-upload.component';
import { UpcropCropComponent } from '../upcrop-crop/upcrop-crop.component';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
var UpcropDialogComponent = /** @class */ (function () {
function UpcropDialogComponent(dialogRef, data) {
var _this = this;
this.dialogRef = dialogRef;
this.data = data;
this.cropData = {};
this.uploadedImages = [];
this.uploader = null;
this.steps = {
total: 2,
options: [{
label: 'Subir imagens',
number: 1,
next: 2,
nextDisabled: function () { return _this.step1NextDisabled(); },
nextAction: function () { _this.goToStep2(); }
}, {
label: 'Cortar imagens',
number: 2,
previus: 1,
previusAction: function () { _this.goToStep1(); }
}],
current: {}
};
}
/**
* @return {?}
*/
UpcropDialogComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
//
// Set first step
this.steps.current = this.steps.options[0];
};
/**
* Go to step 1
*/
/**
* Go to step 1
* @return {?}
*/
UpcropDialogComponent.prototype.goToStep1 = /**
* Go to step 1
* @return {?}
*/
function () {
//
// Reset crop
this.upcropCrop.unsetCropping();
//
// Change to step 1
this.steps.current = this.steps.options[0];
//
// Reset crop
this.upcropCrop.current = false;
this.upcropCrop.currentNumber = false;
};
/**
* Go to step 2
*/
/**
* Go to step 2
* @return {?}
*/
UpcropDialogComponent.prototype.goToStep2 = /**
* Go to step 2
* @return {?}
*/
function () {
//
// Change to step 2
this.steps.current = this.steps.options[1];
//
// Set crop
this.upcropCrop.setCropping(this.upcropUpload.uploader);
};
/**
* Finish
*/
/**
* Finish
* @return {?}
*/
UpcropDialogComponent.prototype.finish = /**
* Finish
* @return {?}
*/
function () {
var _this = this;
//
// On complete all files uplaod
this.upcropUpload.uploader.onCompleteAll = function () {
//
// Remove loading
//
// Remove loading
_this.upcropCrop.uploading = false;
//
// Close dialog with uploadedImages
//
// Close dialog with uploadedImages
_this.dialogRef.close(_this.uploadedImages);
};
//
// Emit on crop image
this.upcropCrop.emitOnCropImage();
//
// Set crop data in additionalParameter
this.upcropUpload.uploader.options.additionalParameter['cropData'] = this.cropData;
//
// Upload all
this.upcropCrop.uploading = true;
this.upcropUpload.uploader.uploadAll();
};
/**
* Step 1 next button disabled conditions
*/
/**
* Step 1 next button disabled conditions
* @return {?}
*/
UpcropDialogComponent.prototype.step1NextDisabled = /**
* Step 1 next button disabled conditions
* @return {?}
*/
function () {
return !this.upcropUpload.uploader.queue.length;
};
/**
* On crop image event
* @param event
*/
/**
* On crop image event
* @param {?} event
* @return {?}
*/
UpcropDialogComponent.prototype.onCropImage = /**
* On crop image event
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var cropData = this.createUrlParams(event.data);
//
// Add crop to uploader file crop data
this.upcropUpload.uploader.queue[event.file].url = this.data.uploadConfig.url + cropData;
};
/**
* On upload image event
* @param event
*/
/**
* On upload image event
* @param {?} event
* @return {?}
*/
UpcropDialogComponent.prototype.onUploadImage = /**
* On upload image event
* @param {?} event
* @return {?}
*/
function (event) {
this.uploadedImages.push(event);
};
/**
* Create url params
* @param obj
*/
/**
* Create url params
* @param {?} obj
* @return {?}
*/
UpcropDialogComponent.prototype.createUrlParams = /**
* Create url params
* @param {?} obj
* @return {?}
*/
function (obj) {
//
// Validate obj
if (!obj)
return '';
/** @type {?} */
var url = '?';
/** @type {?} */
var params = Object.keys(obj).map(function (key) {
return key + '=' + encodeURIComponent(obj[key]);
}).join('&');
return url + params;
};
UpcropDialogComponent.decorators = [
{ type: Component, args: [{
selector: 'upcrop-dialog',
template: "<h2 mat-dialog-title class=\"has-text-danger\">\n Upload de imagens\n <small>com corte</small>\n</h2>\n<mat-dialog-content>\n\n <!-- STEPS -->\n <div steps>\n <div steps-content fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <button mat-icon-button fxHide.xs [disabled]=\"!steps.current.previus || (steps.current.previusDisabled && steps.current.previusDisabled())\"\n (click)=\"steps.current.previusAction()\">\n <mat-icon>keyboard_arrow_left</mat-icon>\n </button>\n <span fxFlex></span>\n <h3>Passo\n <b>{{steps.current.number}}</b> de\n <b>{{steps.total}}</b> /\n <span class=\"has-text-primary\">{{steps.current.label}}</span>\n </h3>\n <span fxFlex></span>\n <button mat-icon-button fxHide.xs [disabled]=\"!steps.current.next || (steps.current.nextDisabled && steps.current.nextDisabled())\"\n (click)=\"steps.current.nextAction()\">\n <mat-icon>keyboard_arrow_right</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- STEP 1 / UPLOAD -->\n <div class=\"step-1\" [hidden]=\"steps.current.number != 1\">\n <upcrop-upload #upcropUpload [config]=\"data.uploadConfig\" (onUploadImage)=\"onUploadImage($event)\"></upcrop-upload>\n </div>\n\n <!-- STEP 2 / CROP -->\n <div class=\"step-2\" [hidden]=\"steps.current.number != 2\">\n <upcrop-crop #upcropCrop [config]=\"data.cropConfig\" (onCropImage)=\"onCropImage($event)\"></upcrop-crop>\n </div>\n</mat-dialog-content>\n<mat-dialog-actions *ngIf=\"steps.current.number == 1\">\n <button mat-button mat-dialog-close>Fechar</button>\n <button mat-button color=\"primary\" [disabled]=\"!upcropUpload.uploader.queue.length\" (click)=\"goToStep2()\">Continuar</button>\n</mat-dialog-actions>\n<mat-dialog-actions *ngIf=\"steps.current.number == 2\">\n <button mat-button (click)=\"goToStep1()\">Voltar</button>\n <button mat-button color=\"primary\" [fxHide]=\"upcropCrop.uploader?.queue?.length == (upcropCrop.currentNumber + 1)\" (click)=\"upcropCrop.goToNextCrop()\">Pr\u00F3xima imagem</button>\n <button mat-button color=\"primary\" [fxHide]=\"upcropCrop.uploader?.queue?.length > (upcropCrop.currentNumber + 1)\" [disabled]=\"upcropCrop.uploading\"\n (click)=\"finish()\">Concluir</button>\n</mat-dialog-actions>\n",
styles: ["[mat-dialog-title] small{color:#b5b5b5!important;font:400 16px/28px Roboto,\"Helvetica Neue\",sans-serif!important;margin:0 0 16px!important}[steps]{margin:0 -24px 16px;padding-top:16px;padding-bottom:16px;background-color:rgba(0,0,0,.04)}[steps] .has-text-primary{color:#3f51b5!important}[mat-dialog-title] .has-text-danger{color:#f44336!important}"]
},] },
];
/** @nocollapse */
UpcropDialogComponent.ctorParameters = function () { return [
{ type: MatDialogRef },
{ type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] }
]; };
UpcropDialogComponent.propDecorators = {
upcropUpload: [{ type: ViewChild, args: ['upcropUpload',] }],
upcropCrop: [{ type: ViewChild, args: ['upcropCrop',] }]
};
return UpcropDialogComponent;
}());
export { UpcropDialogComponent };
if (false) {
/** @type {?} */
UpcropDialogComponent.prototype.upcropUpload;
/** @type {?} */
UpcropDialogComponent.prototype.upcropCrop;
/** @type {?} */
UpcropDialogComponent.prototype.cropData;
/** @type {?} */
UpcropDialogComponent.prototype.uploadedImages;
/** @type {?} */
UpcropDialogComponent.prototype.uploader;
/** @type {?} */
UpcropDialogComponent.prototype.steps;
/** @type {?} */
UpcropDialogComponent.prototype.dialogRef;
/** @type {?} */
UpcropDialogComponent.prototype.data;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBjcm9wLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXVwY3JvcC8iLCJzb3VyY2VzIjpbImxpYi91cGNyb3AtZGlhbG9nL3VwY3JvcC1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7SUErRTlELCtCQUNXLFdBQ3lCLElBQVM7UUFGN0MsaUJBR0s7UUFGTSxjQUFTLEdBQVQsU0FBUztRQUNnQixTQUFJLEdBQUosSUFBSSxDQUFLO3dCQXRCM0IsRUFBRTs4QkFDSSxFQUFFO3dCQUNILElBQUk7cUJBQ1A7WUFDaEIsS0FBSyxFQUFFLENBQUM7WUFDUixPQUFPLEVBQUUsQ0FBQztvQkFDTixLQUFLLEVBQUUsZUFBZTtvQkFDdEIsTUFBTSxFQUFFLENBQUM7b0JBQ1QsSUFBSSxFQUFFLENBQUM7b0JBQ1AsWUFBWSxFQUFFLGNBQVEsTUFBTSxDQUFDLEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUU7b0JBQ3hELFVBQVUsRUFBRSxjQUFRLEtBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFO2lCQUMxQyxFQUFFO29CQUNDLEtBQUssRUFBRSxnQkFBZ0I7b0JBQ3ZCLE1BQU0sRUFBRSxDQUFDO29CQUNULE9BQU8sRUFBRSxDQUFDO29CQUNWLGFBQWEsRUFBRSxjQUFRLEtBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFO2lCQUM3QyxDQUFDO1lBQ0YsT0FBTyxFQUFFLEVBQUU7U0FDZDtLQUtJOzs7O0lBRUwsd0NB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R0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbkQsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUViLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO0tBQ3ZCOztnQkE3TUosU0FBUyxTQUFDO29CQUNQLFFBQVEsRUFBRSxlQUFlO29CQUN6QixRQUFRLEVBQUUsKzRFQStDYjtvQkFDRyxNQUFNLEVBQUUsQ0FBQywrVkFBNlYsQ0FBQztpQkFDMVc7Ozs7Z0JBckRRLFlBQVk7Z0RBaUZaLE1BQU0sU0FBQyxlQUFlOzs7K0JBekIxQixTQUFTLFNBQUMsY0FBYzs2QkFDeEIsU0FBUyxTQUFDLFlBQVk7O2dDQTVEM0I7O1NBeURhLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVXBjcm9wVXBsb2FkQ29tcG9uZW50IH0gZnJvbSAnLi4vdXBjcm9wLXVwbG9hZC91cGNyb3AtdXBsb2FkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVcGNyb3BDcm9wQ29tcG9uZW50IH0gZnJvbSAnLi4vdXBjcm9wLWNyb3AvdXBjcm9wLWNyb3AuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3VwY3JvcC1kaWFsb2cnLFxuICAgIHRlbXBsYXRlOiBgPGgyIG1hdC1kaWFsb2ctdGl0bGUgY2xhc3M9XCJoYXMtdGV4dC1kYW5nZXJcIj5cbiAgICBVcGxvYWQgZGUgaW1hZ2Vuc1xuICAgIDxzbWFsbD5jb20gY29ydGU8L3NtYWxsPlxuPC9oMj5cbjxtYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbiAgICA8IS0tIFNURVBTIC0tPlxuICAgIDxkaXYgc3RlcHM+XG4gICAgICAgIDxkaXYgc3RlcHMtY29udGVudCBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGZ4SGlkZS54cyBbZGlzYWJsZWRdPVwiIXN0ZXBzLmN1cnJlbnQucHJldml1cyB8fCAoc3RlcHMuY3VycmVudC5wcmV2aXVzRGlzYWJsZWQgJiYgc3RlcHMuY3VycmVudC5wcmV2aXVzRGlzYWJsZWQoKSlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzdGVwcy5jdXJyZW50LnByZXZpdXNBY3Rpb24oKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9hcnJvd19sZWZ0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gZnhGbGV4Pjwvc3Bhbj5cbiAgICAgICAgICAgIDxoMz5QYXNzb1xuICAgICAgICAgICAgICAgIDxiPnt7c3RlcHMuY3VycmVudC5udW1iZXJ9fTwvYj4gZGVcbiAgICAgICAgICAgICAgICA8Yj57e3N0ZXBzLnRvdGFsfX08L2I+IC9cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhhcy10ZXh0LXByaW1hcnlcIj57e3N0ZXBzLmN1cnJlbnQubGFiZWx9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICA8c3BhbiBmeEZsZXg+PC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gZnhIaWRlLnhzIFtkaXNhYmxlZF09XCIhc3RlcHMuY3VycmVudC5uZXh0IHx8IChzdGVwcy5jdXJyZW50Lm5leHREaXNhYmxlZCAmJiBzdGVwcy5jdXJyZW50Lm5leHREaXNhYmxlZCgpKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInN0ZXBzLmN1cnJlbnQubmV4dEFjdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2Fycm93X3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU1RFUCAxIC8gVVBMT0FEIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzdGVwLTFcIiBbaGlkZGVuXT1cInN0ZXBzLmN1cnJlbnQubnVtYmVyICE9IDFcIj5cbiAgICAgICAgPHVwY3JvcC11cGxvYWQgI3VwY3JvcFVwbG9hZCBbY29uZmlnXT1cImRhdGEudXBsb2FkQ29uZmlnXCIgKG9uVXBsb2FkSW1hZ2UpPVwib25VcGxvYWRJbWFnZSgkZXZlbnQpXCI+PC91cGNyb3AtdXBsb2FkPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTVEVQIDIgLyBDUk9QIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzdGVwLTJcIiBbaGlkZGVuXT1cInN0ZXBzLmN1cnJlbnQubnVtYmVyICE9IDJcIj5cbiAgICAgICAgPHVwY3JvcC1jcm9wICN1cGNyb3BDcm9wIFtjb25maWddPVwiZGF0YS5jcm9wQ29uZmlnXCIgKG9uQ3JvcEltYWdlKT1cIm9uQ3JvcEltYWdlKCRldmVudClcIj48L3VwY3JvcC1jcm9wPlxuICAgIDwvZGl2PlxuPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG48bWF0LWRpYWxvZy1hY3Rpb25zICpuZ0lmPVwic3RlcHMuY3VycmVudC5udW1iZXIgPT0gMVwiPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlPkZlY2hhcjwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiIXVwY3JvcFVwbG9hZC51cGxvYWRlci5xdWV1ZS5sZW5ndGhcIiAoY2xpY2spPVwiZ29Ub1N0ZXAyKClcIj5Db250aW51YXI8L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuPG1hdC1kaWFsb2ctYWN0aW9ucyAqbmdJZj1cInN0ZXBzLmN1cnJlbnQubnVtYmVyID09IDJcIj5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cImdvVG9TdGVwMSgpXCI+Vm9sdGFyPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtmeEhpZGVdPVwidXBjcm9wQ3JvcC51cGxvYWRlcj8ucXVldWU/Lmxlbmd0aCA9PSAodXBjcm9wQ3JvcC5jdXJyZW50TnVtYmVyICsgMSlcIiAoY2xpY2spPVwidXBjcm9wQ3JvcC5nb1RvTmV4dENyb3AoKVwiPlByw7N4aW1hIGltYWdlbTwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBbZnhIaWRlXT1cInVwY3JvcENyb3AudXBsb2FkZXI/LnF1ZXVlPy5sZW5ndGggPiAodXBjcm9wQ3JvcC5jdXJyZW50TnVtYmVyICsgMSlcIiBbZGlzYWJsZWRdPVwidXBjcm9wQ3JvcC51cGxvYWRpbmdcIlxuICAgICAgICAoY2xpY2spPVwiZmluaXNoKClcIj5Db25jbHVpcjwvYnV0dG9uPlxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG5gLFxuICAgIHN0eWxlczogW2BbbWF0LWRpYWxvZy10aXRsZV0gc21hbGx7Y29sb3I6I2I1YjViNSFpbXBvcnRhbnQ7Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZiFpbXBvcnRhbnQ7bWFyZ2luOjAgMCAxNnB4IWltcG9ydGFudH1bc3RlcHNde21hcmdpbjowIC0yNHB4IDE2cHg7cGFkZGluZy10b3A6MTZweDtwYWRkaW5nLWJvdHRvbToxNnB4O2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfVtzdGVwc10gLmhhcy10ZXh0LXByaW1hcnl7Y29sb3I6IzNmNTFiNSFpbXBvcnRhbnR9W21hdC1kaWFsb2ctdGl0bGVdIC5oYXMtdGV4dC1kYW5nZXJ7Y29sb3I6I2Y0NDMzNiFpbXBvcnRhbnR9YF1cbn0pXG5leHBvcnQgY2xhc3MgVXBjcm9wRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIEBWaWV3Q2hpbGQoJ3VwY3JvcFVwbG9hZCcpIHB1YmxpYyB1cGNyb3BVcGxvYWQ6IFVwY3JvcFVwbG9hZENvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCd1cGNyb3BDcm9wJykgcHVibGljIHVwY3JvcENyb3A6IFVwY3JvcENyb3BDb21wb25lbnQ7XG5cbiAgICBwdWJsaWMgY3JvcERhdGEgPSB7fTtcbiAgICBwdWJsaWMgdXBsb2FkZWRJbWFnZXMgPSBbXTtcbiAgICBwdWJsaWMgdXBsb2FkZXI6IGFueSA9IG51bGw7XG4gICAgcHVibGljIHN0ZXBzOiBhbnkgPSB7XG4gICAgICAgIHRvdGFsOiAyLFxuICAgICAgICBvcHRpb25zOiBbe1xuICAgICAgICAgICAgbGFiZWw6ICdTdWJpciBpbWFnZW5zJyxcbiAgICAgICAgICAgIG51bWJlcjogMSxcbiAgICAgICAgICAgIG5leHQ6IDIsXG4gICAgICAgICAgICBuZXh0RGlzYWJsZWQ6ICgpID0+IHsgcmV0dXJuIHRoaXMuc3RlcDFOZXh0RGlzYWJsZWQoKTsgfSxcbiAgICAgICAgICAgIG5leHRBY3Rpb246ICgpID0+IHsgdGhpcy5nb1RvU3RlcDIoKTsgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBsYWJlbDogJ0NvcnRhciBpbWFnZW5zJyxcbiAgICAgICAgICAgIG51bWJlcjogMixcbiAgICAgICAgICAgIHByZXZpdXM6IDEsXG4gICAgICAgICAgICBwcmV2aXVzQWN0aW9uOiAoKSA9PiB7IHRoaXMuZ29Ub1N0ZXAxKCk7IH1cbiAgICAgICAgfV0sXG4gICAgICAgIGN1cnJlbnQ6IHt9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8VXBjcm9wRGlhbG9nQ29tcG9uZW50PixcbiAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnlcbiAgICApIHsgfVxuXG4gICAgbmdPbkluaXQoKSB7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2V0IGZpcnN0IHN0ZXBcbiAgICAgICAgdGhpcy5zdGVwcy5jdXJyZW50ID0gdGhpcy5zdGVwcy5vcHRpb25zWzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdvIHRvIHN0ZXAgMVxuICAgICAqL1xuICAgIGdvVG9TdGVwMSgpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBSZXNldCBjcm9wXG4gICAgICAgIHRoaXMudXBjcm9wQ3JvcC51bnNldENyb3BwaW5nKCk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQ2hhbmdlIHRvIHN0ZXAgMVxuICAgICAgICB0aGlzLnN0ZXBzLmN1cnJlbnQgPSB0aGlzLnN0ZXBzLm9wdGlvbnNbMF07XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUmVzZXQgY3JvcFxuICAgICAgICB0aGlzLnVwY3JvcENyb3AuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVwY3JvcENyb3AuY3VycmVudE51bWJlciA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdvIHRvIHN0ZXAgMlxuICAgICAqL1xuICAgIGdvVG9TdGVwMigpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBDaGFuZ2UgdG8gc3RlcCAyXG4gICAgICAgIHRoaXMuc3RlcHMuY3VycmVudCA9IHRoaXMuc3RlcHMub3B0aW9uc1sxXTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBTZXQgY3JvcFxuICAgICAgICB0aGlzLnVwY3JvcENyb3Auc2V0Q3JvcHBpbmcodGhpcy51cGNyb3BVcGxvYWQudXBsb2FkZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmlzaFxuICAgICAqL1xuICAgIGZpbmlzaCgpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBPbiBjb21wbGV0ZSBhbGwgZmlsZXMgdXBsYW9kXG4gICAgICAgIHRoaXMudXBjcm9wVXBsb2FkLnVwbG9hZGVyLm9uQ29tcGxldGVBbGwgPSAoKSA9PiB7XG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBSZW1vdmUgbG9hZGluZ1xuICAgICAgICAgICAgdGhpcy51cGNyb3BDcm9wLnVwbG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQ2xvc2UgZGlhbG9nIHdpdGggdXBsb2FkZWRJbWFnZXNcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRoaXMudXBsb2FkZWRJbWFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRW1pdCBvbiBjcm9wIGltYWdlXG4gICAgICAgIHRoaXMudXBjcm9wQ3JvcC5lbWl0T25Dcm9wSW1hZ2UoKTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBTZXQgY3JvcCBkYXRhIGluIGFkZGl0aW9uYWxQYXJhbWV0ZXJcbiAgICAgICAgdGhpcy51cGNyb3BVcGxvYWQudXBsb2FkZXIub3B0aW9ucy5hZGRpdGlvbmFsUGFyYW1ldGVyWydjcm9wRGF0YSddID0gdGhpcy5jcm9wRGF0YTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBVcGxvYWQgYWxsXG4gICAgICAgIHRoaXMudXBjcm9wQ3JvcC51cGxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnVwY3JvcFVwbG9hZC51cGxvYWRlci51cGxvYWRBbGwoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGVwIDEgbmV4dCBidXR0b24gZGlzYWJsZWQgY29uZGl0aW9uc1xuICAgICAqL1xuICAgIHN0ZXAxTmV4dERpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMudXBjcm9wVXBsb2FkLnVwbG9hZGVyLnF1ZXVlLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBjcm9wIGltYWdlIGV2ZW50XG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICovXG4gICAgb25Dcm9wSW1hZ2UoZXZlbnQpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBDcmVhdGUgdXJsIHBhcmFtcyB3aXRoIGNyb3AgZGF0YVxuICAgICAgICBjb25zdCBjcm9wRGF0YSA9IHRoaXMuY3JlYXRlVXJsUGFyYW1zKGV2ZW50LmRhdGEpO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEFkZCBjcm9wIHRvIHVwbG9hZGVyIGZpbGUgY3JvcCBkYXRhXG4gICAgICAgIHRoaXMudXBjcm9wVXBsb2FkLnVwbG9hZGVyLnF1ZXVlW2V2ZW50LmZpbGVdLnVybCA9IHRoaXMuZGF0YS51cGxvYWRDb25maWcudXJsICsgY3JvcERhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gdXBsb2FkIGltYWdlIGV2ZW50XG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICovXG4gICAgb25VcGxvYWRJbWFnZShldmVudCkge1xuICAgICAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzLnB1c2goZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSB1cmwgcGFyYW1zXG4gICAgICogQHBhcmFtIG9ialxuICAgICAqL1xuICAgIGNyZWF0ZVVybFBhcmFtcyhvYmopIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBWYWxpZGF0ZSBvYmpcbiAgICAgICAgaWYgKCFvYmopIHJldHVybiAnJztcblxuICAgICAgICAvL1xuICAgICAgICAvLyBGaXJzdCBwYXJhbVxuICAgICAgICBjb25zdCB1cmwgPSAnPyc7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gR2VuZXJhdGUgdXJsIHBhcmFtXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5rZXlzKG9iaikubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pO1xuICAgICAgICB9KS5qb2luKCcmJyk7XG5cbiAgICAgICAgcmV0dXJuIHVybCArIHBhcmFtcztcbiAgICB9XG59XG4iXX0=