angular-upcrop
Version:
Library with upload and crop feature for Angular 6+
155 lines (154 loc) • 33.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { FileUploader } from 'ng2-file-upload';
var UpcropUploadComponent = /** @class */ (function () {
function UpcropUploadComponent() {
this.config = {};
this.uploadQueue = [];
this.onUploadQueue = new EventEmitter();
this.onUploadImage = new EventEmitter();
this.uploader = new FileUploader({});
this.hasFileOver = false;
}
/**
* @return {?}
*/
UpcropUploadComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
//
// Set uploader
this.setUploader();
};
/**
* Set uploader
*/
/**
* Set uploader
* @return {?}
*/
UpcropUploadComponent.prototype.setUploader = /**
* Set uploader
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var self = this;
//
// Set uploader
this.uploader.setOptions({ url: this.config.url, authToken: this.config.authToken, autoUpload: this.config.autoUpload, additionalParameter: this.config.additionalParameter });
//
// After add file event
this.uploader.onAfterAddingFile = function (file) {
//
// Set with credentials
file.withCredentials = _this.config.withCredentials;
//
// Emit onUploadQueue
//
// Emit onUploadQueue
_this.onUploadQueue.emit({
file: file
});
};
//
// On success item event
this.uploader.onSuccessItem = function (item, response, status, headers) {
if (status == 200) {
/** @type {?} */
var data = JSON.parse(response);
//
// Emit onUploadQueue
//
// Emit onUploadQueue
_this.onUploadImage.emit({
data: data
});
}
else {
}
};
};
/**
* On file over event
* @param {?} e
* @return {?}
*/
UpcropUploadComponent.prototype.onFileOver = /**
* On file over event
* @param {?} e
* @return {?}
*/
function (e) {
this.hasFileOver = e;
};
/**
* Truncate filename
* @param n
* @param len
*/
/**
* Truncate filename
* @param {?} n
* @param {?} len
* @return {?}
*/
UpcropUploadComponent.prototype.truncate = /**
* Truncate filename
* @param {?} n
* @param {?} len
* @return {?}
*/
function (n, len) {
//
// Validate
if (!n)
return n;
/** @type {?} */
var ext = n.substring(n.lastIndexOf(".") + 1, n.length).toLowerCase();
/** @type {?} */
var filename = n.replace('.' + ext, '');
if (filename.length <= len) {
return n;
}
filename = filename.substr(0, len) + (n.length > len ? '[...]' : '');
return filename + '.' + ext;
};
UpcropUploadComponent.decorators = [
{ type: Component, args: [{
selector: 'upcrop-upload',
template: "<label ng2FileDrop multiple class=\"my-drop-zone\" [ngClass]=\"{'nv-file-over': hasFileOver}\" (fileOver)=\"onFileOver($event)\"\n [uploader]=\"uploader\" fxLayout fxLayoutAlign=\"center center\">\n \u00C1rea de upload\n <input type=\"file\" ng2FileSelect multiple [uploader]=\"uploader\" style=\"display: none\" />\n</label>\n\n<!-- FILES -->\n<table class=\"table upcrop-upload-table\">\n <thead>\n <tr>\n <th>Preview</th>\n <th>Arquivo</th>\n <th style=\"width:30px; text-align: center\">\n <mat-icon class=\"is-pulled-right\">settings</mat-icon>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let item of uploader.queue\">\n <td class=\"image-preview\" style=\"width:100px\">\n <img upcropImagePreview [image]=\"item?._file\" class=\"media-object\" />\n </td>\n <td>{{ truncate(item?.file?.name, 16) }}</td>\n <td class=\"actions\" style=\"width:30px\">\n <button class=\"danger-btn\" mat-icon-button color=\"warn\" (click)=\"item.remove()\">\n <mat-icon>delete</mat-icon>\n </button>\n </td>\n </tr>\n <tr [hidden]=\"uploader.queue.length\">\n <td colspan=\"3\" class=\"has-text-danger\">\n Nenhum arquivo, adicione acima.\n </td>\n </tr>\n </tbody>\n</table>\n",
styles: [".my-drop-zone{border:2px dashed rgba(0,0,0,.04);width:100%;display:flex;padding:20px;background-color:rgba(0,0,0,.04);color:rgba(0,0,0,.7)}.nv-file-over{border:2px dashed rgba(244,67,54,.4)}[upcropImagePreview]{display:block}.upcrop-upload-table{background-color:#fff;color:#363636;border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:0}.upcrop-upload-table td,.upcrop-upload-table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.upcrop-upload-table td.is-white,.upcrop-upload-table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.upcrop-upload-table td.is-black,.upcrop-upload-table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.upcrop-upload-table td.is-light,.upcrop-upload-table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.upcrop-upload-table td.is-dark,.upcrop-upload-table th.is-dark{background-color:#363636;border-color:#363636;color:#f5f5f5}.upcrop-upload-table td.is-primary,.upcrop-upload-table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.upcrop-upload-table td.is-info,.upcrop-upload-table th.is-info{background-color:#3273dc;border-color:#3273dc;color:#fff}.upcrop-upload-table td.is-success,.upcrop-upload-table th.is-success{background-color:#23d160;border-color:#23d160;color:#fff}.upcrop-upload-table td.is-warning,.upcrop-upload-table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,.7)}.upcrop-upload-table td.is-danger,.upcrop-upload-table th.is-danger{background-color:#ff3860;border-color:#ff3860;color:#fff}.upcrop-upload-table td.is-narrow,.upcrop-upload-table th.is-narrow{white-space:nowrap;width:1%}.upcrop-upload-table th{color:#363636;text-align:left}.upcrop-upload-table tr:hover{background-color:#fafafa}.upcrop-upload-table tr.is-selected{background-color:#00d1b2;color:#fff}.upcrop-upload-table tr.is-selected a,.upcrop-upload-table tr.is-selected strong{color:currentColor}.upcrop-upload-table tr.is-selected td,.upcrop-upload-table tr.is-selected th{border-color:#fff;color:currentColor}.upcrop-upload-table tfoot td,.upcrop-upload-table tfoot th{border-width:2px 0 0;color:#363636}.upcrop-upload-table tbody tr:last-child td,.upcrop-upload-table tbody tr:last-child th{border-bottom-width:0}.upcrop-upload-table.is-bordered td,.upcrop-upload-table.is-bordered th{border-width:1px}.upcrop-upload-table.is-bordered tr:last-child td,.upcrop-upload-table.is-bordered tr:last-child th{border-bottom-width:1px}.upcrop-upload-table.is-fullwidth{width:100%}.upcrop-upload-table.is-narrow td,.upcrop-upload-table.is-narrow th{padding:.25em .5em}.upcrop-upload-table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.upcrop-upload-table.is-striped tbody tr:not(.is-selected):nth-child(even):hover{background-color:#f5f5f5}td,th{padding:0;text-align:left}.upcrop-upload-table-search{display:flex;padding:1.3em 1.6em}.upcrop-upload-table-search input{font-size:14px;flex:1 1 100%;box-sizing:border-box;-webkit-box-flex:1;border:none;background-color:transparent;outline:-webkit-focus-ring-color auto 0!important}.upcrop-upload-table-search>mat-icon{margin-right:16px;margin-top:2px}[table-loading]{position:absolute;width:100%;margin-top:59px!important;background-color:rgba(255,255,255,.9);height:calc(100% - 59px);z-index:1}[table-no-entries]{padding:1.6em}.mat-card[has-table]{padding:0}.mat-card[has-table] .mat-card-actions{padding:8px!important;margin:0;border-top:1px solid #dbdbdb;border-color:rgba(0,0,0,.09)}.mat-card[has-table] .mat-card-actions .mat-icon-button{color:rgba(0,0,0,.54)}.mat-card[has-table] .mat-card-actions .mat-icon-button[disabled]{color:rgba(0,0,0,.18)}.mat-card[has-table] .mat-card-actions .mat-paginator-page-size-label{margin:0 15px;color:rgba(0,0,0,.54);font-size:12px;font-weight:400}.upcrop-upload-table .actions .mat-icon-button{height:30px!important;width:30px;line-height:30px;flex-direction:column;box-sizing:border-box;display:flex;max-width:100%;place-content:center;align-items:center}.upcrop-upload-table .actions .mat-icon-button .mat-icon{font-size:18px;line-height:18px;width:18px;height:18px}.upcrop-upload-table thead tr{background-color:rgba(0,0,0,.04)!important}.upcrop-upload-table thead td:first-of-type,.upcrop-upload-table thead th:first-of-type{padding-left:1.8em}.upcrop-upload-table thead td:last-of-type,.upcrop-upload-table thead th:last-of-type{padding-right:1.8em}.upcrop-upload-table thead td mat-icon,.upcrop-upload-table thead th mat-icon{height:16px;width:16px;line-height:16px;font-size:16px;vertical-align:bottom;margin-right:3px}.upcrop-upload-table tbody td,.upcrop-upload-table tbody th{border-color:rgba(0,0,0,.04)}.upcrop-upload-table tbody td:first-of-type,.upcrop-upload-table tbody th:first-of-type{padding-left:1.6em}.upcrop-upload-table tbody td:last-of-type,.upcrop-upload-table tbody th:last-of-type{padding-right:1.6em}.upcrop-upload-table thead td,.upcrop-upload-table thead th{color:rgba(0,0,0,.54);font-size:12px;font-weight:400;padding:1.3em .75em;border:0}.upcrop-upload-table tbody td{color:rgba(0,0,0,.87);padding:1em .75em;font-size:.9rem;font-weight:400}@media (max-width:800px){.upcrop-upload-table{display:inline-block;vertical-align:top;max-width:100%;overflow-x:auto;white-space:nowrap;border-collapse:collapse;border-spacing:0;display:flex;overflow:hidden;background:0 0}.upcrop-upload-table .actions a{margin-top:-.35em}.upcrop-upload-table .is-pulled-right{float:none!important}.upcrop-upload-table thead{display:flex;flex-shrink:0;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.upcrop-upload-table thead td,.upcrop-upload-table thead th{padding:1.3em 1.8em;text-align:right;width:100%!important}.upcrop-upload-table thead td mat-icon,.upcrop-upload-table thead th mat-icon{margin-right:0}.upcrop-upload-table tbody{flex:1 1 100%;box-sizing:border-box;-webkit-box-flex:1;-webkit-overflow-scrolling:touch;background:radial-gradient(left,ellipse,rgba(0,0,0,.2) 0,transparent 75%) 0 center,radial-gradient(right,ellipse,rgba(0,0,0,.2) 0,transparent 75%) 100% center;background-size:10px 100%,10px 100%;background-attachment:scroll,scroll;background-repeat:no-repeat;display:flex;position:relative;overflow-x:auto;overflow-y:hidden;margin-right:1.6em}.upcrop-upload-table tbody tr{flex:1 1 100%;box-sizing:border-box;-webkit-box-flex:1}.upcrop-upload-table tbody td,.upcrop-upload-table tbody th{padding:1.155em 1.6em;text-align:left!important}.upcrop-upload-table tbody td:first-of-type,.upcrop-upload-table tbody th:first-of-type{padding-left:1.6em}.upcrop-upload-table tbody td:last-of-type,.upcrop-upload-table tbody th:last-of-type{padding-right:1.6em}.upcrop-upload-table tr{display:flex;flex-direction:column;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;flex-shrink:0}.upcrop-upload-table td,.upcrop-upload-table th{display:block;background-image:none!important;border-left:0}.upcrop-upload-table td:first-child,.upcrop-upload-table th:first-child{background-image:linear-gradient(to right,#fff 50%,rgba(255,255,255,0) 100%);background-repeat:no-repeat;background-size:20px 100%}.upcrop-upload-table td:last-child,.upcrop-upload-table th:last-child{background-image:linear-gradient(to left,#fff 50%,rgba(255,255,255,0) 100%);background-repeat:no-repeat;background-position:100% 0;background-size:20px 100%}.upcrop-upload-table td:not(:last-child),.upcrop-upload-table th:not(:last-child){border-bottom:0}}.upcrop-upload-table ::-webkit-scrollbar{height:8px;overflow:visible;width:16px}.upcrop-upload-table ::-webkit-scrollbar-button{height:0;width:0}.upcrop-upload-table ::-webkit-scrollbar-corner{background:0 0}.upcrop-upload-table ::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.2);background-clip:padding-box;border:solid transparent;border-width:1px 1px 1px 6px;min-height:28px;padding:100px 0 0;box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07)}.upcrop-upload-table ::-webkit-scrollbar-track{background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}[enterlist] [has-table]{margin-right:-24px;margin-left:-24px}[enterlist] [has-table] .upcrop-upload-table{background-color:transparent}[enterlist] [has-table] .upcrop-upload-table thead tr{background-color:rgba(0,0,0,.02)!important}[enterlist] [has-table] .upcrop-upload-table tr:hover{background-color:inherit}.image-preview img{max-width:100%}"]
},] },
];
/** @nocollapse */
UpcropUploadComponent.ctorParameters = function () { return []; };
UpcropUploadComponent.propDecorators = {
config: [{ type: Input }],
uploadQueue: [{ type: Input }],
onUploadQueue: [{ type: Output }],
onUploadImage: [{ type: Output }]
};
return UpcropUploadComponent;
}());
export { UpcropUploadComponent };
if (false) {
/** @type {?} */
UpcropUploadComponent.prototype.config;
/** @type {?} */
UpcropUploadComponent.prototype.uploadQueue;
/** @type {?} */
UpcropUploadComponent.prototype.onUploadQueue;
/** @type {?} */
UpcropUploadComponent.prototype.onUploadImage;
/** @type {?} */
UpcropUploadComponent.prototype.uploader;
/** @type {?} */
UpcropUploadComponent.prototype.hasFileOver;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBjcm9wLXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXVwY3JvcC8iLCJzb3VyY2VzIjpbImxpYi91cGNyb3AtdXBsb2FkL3VwY3JvcC11cGxvYWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxZQUFZLEVBQW1DLE1BQU0saUJBQWlCLENBQUM7O0lBc0Q1RTtzQkFSOEIsRUFBRTsyQkFDRyxFQUFFOzZCQUNKLElBQUksWUFBWSxFQUFFOzZCQUNsQixJQUFJLFlBQVksRUFBRTt3QkFFbkIsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDOzJCQUN0QixLQUFLO0tBRWxCOzs7O0lBRWpCLHdDQUFROzs7SUFBUjs7O1FBSUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0tBQ3RCO0lBRUQ7O09BRUc7Ozs7O0lBQ0gsMkNBQVc7Ozs7SUFBWDtRQUFBLGlCQTJDQzs7UUF2Q0csSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDOzs7UUFJaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQzs7O1FBSS9LLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEdBQUcsVUFBQyxJQUFJOzs7WUFJbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQzs7O1lBSW5ELEFBRkEsRUFBRTtZQUNGLHFCQUFxQjtZQUNyQixLQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztnQkFDcEIsSUFBSSxFQUFFLElBQUk7YUFDYixDQUFDLENBQUM7U0FDTixDQUFDOzs7UUFJRixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxVQUFDLElBQWMsRUFBRSxRQUFnQixFQUFFLE1BQWMsRUFBRSxPQUE4QjtZQUUzRyxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQzs7Z0JBSWhCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7OztnQkFJaEMsQUFGQSxFQUFFO2dCQUNGLHFCQUFxQjtnQkFDckIsS0FBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7b0JBQ3BCLElBQUksRUFBRSxJQUFJO2lCQUNiLENBQUMsQ0FBQzthQUNOO1lBQUMsSUFBSSxDQUFDLENBQUM7YUFDUDtTQUNKLENBQUM7S0FDTDs7Ozs7O0lBTU0sMENBQVU7Ozs7O2NBQUMsQ0FBTTtRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQzs7SUFHekI7Ozs7T0FJRzs7Ozs7OztJQUNILHdDQUFROzs7Ozs7SUFBUixVQUFTLENBQUMsRUFBRSxHQUFHOzs7UUFJWCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7O1FBRWpCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDOztRQUN0RSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDWjtRQUNELFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztLQUMvQjs7Z0JBdklKLFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsUUFBUSxFQUFFLDY2Q0FxQ2I7b0JBQ0csTUFBTSxFQUFFLENBQUMseXdRQUF5d1EsQ0FBQztpQkFDdHhROzs7Ozt5QkFHSSxLQUFLOzhCQUNMLEtBQUs7Z0NBQ0wsTUFBTTtnQ0FDTixNQUFNOztnQ0FsRFg7O1NBNkNhLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpbGVVcGxvYWRlciwgRmlsZUl0ZW0sIFBhcnNlZFJlc3BvbnNlSGVhZGVycyB9IGZyb20gJ25nMi1maWxlLXVwbG9hZCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXBjcm9wLXVwbG9hZCcsXG4gICAgdGVtcGxhdGU6IGA8bGFiZWwgbmcyRmlsZURyb3AgbXVsdGlwbGUgY2xhc3M9XCJteS1kcm9wLXpvbmVcIiBbbmdDbGFzc109XCJ7J252LWZpbGUtb3Zlcic6IGhhc0ZpbGVPdmVyfVwiIChmaWxlT3Zlcik9XCJvbkZpbGVPdmVyKCRldmVudClcIlxuICAgIFt1cGxvYWRlcl09XCJ1cGxvYWRlclwiIGZ4TGF5b3V0IGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCI+XG4gICAgw4FyZWEgZGUgdXBsb2FkXG4gICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgbmcyRmlsZVNlbGVjdCBtdWx0aXBsZSBbdXBsb2FkZXJdPVwidXBsb2FkZXJcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiAvPlxuPC9sYWJlbD5cblxuPCEtLSBGSUxFUyAtLT5cbjx0YWJsZSBjbGFzcz1cInRhYmxlIHVwY3JvcC11cGxvYWQtdGFibGVcIj5cbiAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aD5QcmV2aWV3PC90aD5cbiAgICAgICAgICAgIDx0aD5BcnF1aXZvPC90aD5cbiAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjMwcHg7IHRleHQtYWxpZ246IGNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImlzLXB1bGxlZC1yaWdodFwiPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgPC90aGVhZD5cblxuICAgIDx0Ym9keT5cbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHVwbG9hZGVyLnF1ZXVlXCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJpbWFnZS1wcmV2aWV3XCIgc3R5bGU9XCJ3aWR0aDoxMDBweFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgdXBjcm9wSW1hZ2VQcmV2aWV3IFtpbWFnZV09XCJpdGVtPy5fZmlsZVwiIGNsYXNzPVwibWVkaWEtb2JqZWN0XCIgLz5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgdHJ1bmNhdGUoaXRlbT8uZmlsZT8ubmFtZSwgMTYpIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbnNcIiBzdHlsZT1cIndpZHRoOjMwcHhcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGFuZ2VyLWJ0blwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiAoY2xpY2spPVwiaXRlbS5yZW1vdmUoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBbaGlkZGVuXT1cInVwbG9hZGVyLnF1ZXVlLmxlbmd0aFwiPlxuICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIzXCIgY2xhc3M9XCJoYXMtdGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICBOZW5odW0gYXJxdWl2bywgYWRpY2lvbmUgYWNpbWEuXG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGJvZHk+XG48L3RhYmxlPlxuYCxcbiAgICBzdHlsZXM6IFtgLm15LWRyb3Atem9uZXtib3JkZXI6MnB4IGRhc2hlZCByZ2JhKDAsMCwwLC4wNCk7d2lkdGg6MTAwJTtkaXNwbGF5OmZsZXg7cGFkZGluZzoyMHB4O2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOnJnYmEoMCwwLDAsLjcpfS5udi1maWxlLW92ZXJ7Ym9yZGVyOjJweCBkYXNoZWQgcmdiYSgyNDQsNjcsNTQsLjQpfVt1cGNyb3BJbWFnZVByZXZpZXdde2Rpc3BsYXk6YmxvY2t9LnVwY3JvcC11cGxvYWQtdGFibGV7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMzNjM2MzY7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2JvcmRlci1zcGFjaW5nOjA7d2lkdGg6MTAwJTttYXJnaW4tYm90dG9tOjB9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQsLnVwY3JvcC11cGxvYWQtdGFibGUgdGh7Ym9yZGVyOjFweCBzb2xpZCAjZGJkYmRiO2JvcmRlci13aWR0aDowIDAgMXB4O3BhZGRpbmc6LjVlbSAuNzVlbTt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQuaXMtd2hpdGUsLnVwY3JvcC11cGxvYWQtdGFibGUgdGguaXMtd2hpdGV7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1jb2xvcjojZmZmO2NvbG9yOiMwYTBhMGF9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQuaXMtYmxhY2ssLnVwY3JvcC11cGxvYWQtdGFibGUgdGguaXMtYmxhY2t7YmFja2dyb3VuZC1jb2xvcjojMGEwYTBhO2JvcmRlci1jb2xvcjojMGEwYTBhO2NvbG9yOiNmZmZ9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQuaXMtbGlnaHQsLnVwY3JvcC11cGxvYWQtdGFibGUgdGguaXMtbGlnaHR7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O2JvcmRlci1jb2xvcjojZjVmNWY1O2NvbG9yOiMzNjM2MzZ9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQuaXMtZGFyaywudXBjcm9wLXVwbG9hZC10YWJsZSB0aC5pcy1kYXJre2JhY2tncm91bmQtY29sb3I6IzM2MzYzNjtib3JkZXItY29sb3I6IzM2MzYzNjtjb2xvcjojZjVmNWY1fS51cGNyb3AtdXBsb2FkLXRhYmxlIHRkLmlzLXByaW1hcnksLnVwY3JvcC11cGxvYWQtdGFibGUgdGguaXMtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiMwMGQxYjI7Ym9yZGVyLWNvbG9yOiMwMGQxYjI7Y29sb3I6I2ZmZn0udXBjcm9wLXVwbG9hZC10YWJsZSB0ZC5pcy1pbmZvLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoLmlzLWluZm97YmFja2dyb3VuZC1jb2xvcjojMzI3M2RjO2JvcmRlci1jb2xvcjojMzI3M2RjO2NvbG9yOiNmZmZ9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQuaXMtc3VjY2VzcywudXBjcm9wLXVwbG9hZC10YWJsZSB0aC5pcy1zdWNjZXNze2JhY2tncm91bmQtY29sb3I6IzIzZDE2MDtib3JkZXItY29sb3I6IzIzZDE2MDtjb2xvcjojZmZmfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRkLmlzLXdhcm5pbmcsLnVwY3JvcC11cGxvYWQtdGFibGUgdGguaXMtd2FybmluZ3tiYWNrZ3JvdW5kLWNvbG9yOiNmZmRkNTc7Ym9yZGVyLWNvbG9yOiNmZmRkNTc7Y29sb3I6cmdiYSgwLDAsMCwuNyl9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQuaXMtZGFuZ2VyLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoLmlzLWRhbmdlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjM4NjA7Ym9yZGVyLWNvbG9yOiNmZjM4NjA7Y29sb3I6I2ZmZn0udXBjcm9wLXVwbG9hZC10YWJsZSB0ZC5pcy1uYXJyb3csLnVwY3JvcC11cGxvYWQtdGFibGUgdGguaXMtbmFycm93e3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDoxJX0udXBjcm9wLXVwbG9hZC10YWJsZSB0aHtjb2xvcjojMzYzNjM2O3RleHQtYWxpZ246bGVmdH0udXBjcm9wLXVwbG9hZC10YWJsZSB0cjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9LnVwY3JvcC11cGxvYWQtdGFibGUgdHIuaXMtc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojMDBkMWIyO2NvbG9yOiNmZmZ9LnVwY3JvcC11cGxvYWQtdGFibGUgdHIuaXMtc2VsZWN0ZWQgYSwudXBjcm9wLXVwbG9hZC10YWJsZSB0ci5pcy1zZWxlY3RlZCBzdHJvbmd7Y29sb3I6Y3VycmVudENvbG9yfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRyLmlzLXNlbGVjdGVkIHRkLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRyLmlzLXNlbGVjdGVkIHRoe2JvcmRlci1jb2xvcjojZmZmO2NvbG9yOmN1cnJlbnRDb2xvcn0udXBjcm9wLXVwbG9hZC10YWJsZSB0Zm9vdCB0ZCwudXBjcm9wLXVwbG9hZC10YWJsZSB0Zm9vdCB0aHtib3JkZXItd2lkdGg6MnB4IDAgMDtjb2xvcjojMzYzNjM2fS51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRyOmxhc3QtY2hpbGQgdGQsLnVwY3JvcC11cGxvYWQtdGFibGUgdGJvZHkgdHI6bGFzdC1jaGlsZCB0aHtib3JkZXItYm90dG9tLXdpZHRoOjB9LnVwY3JvcC11cGxvYWQtdGFibGUuaXMtYm9yZGVyZWQgdGQsLnVwY3JvcC11cGxvYWQtdGFibGUuaXMtYm9yZGVyZWQgdGh7Ym9yZGVyLXdpZHRoOjFweH0udXBjcm9wLXVwbG9hZC10YWJsZS5pcy1ib3JkZXJlZCB0cjpsYXN0LWNoaWxkIHRkLC51cGNyb3AtdXBsb2FkLXRhYmxlLmlzLWJvcmRlcmVkIHRyOmxhc3QtY2hpbGQgdGh7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LnVwY3JvcC11cGxvYWQtdGFibGUuaXMtZnVsbHdpZHRoe3dpZHRoOjEwMCV9LnVwY3JvcC11cGxvYWQtdGFibGUuaXMtbmFycm93IHRkLC51cGNyb3AtdXBsb2FkLXRhYmxlLmlzLW5hcnJvdyB0aHtwYWRkaW5nOi4yNWVtIC41ZW19LnVwY3JvcC11cGxvYWQtdGFibGUuaXMtc3RyaXBlZCB0Ym9keSB0cjpub3QoLmlzLXNlbGVjdGVkKTpudGgtY2hpbGQoZXZlbil7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS51cGNyb3AtdXBsb2FkLXRhYmxlLmlzLXN0cmlwZWQgdGJvZHkgdHI6bm90KC5pcy1zZWxlY3RlZCk6bnRoLWNoaWxkKGV2ZW4pOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNX10ZCx0aHtwYWRkaW5nOjA7dGV4dC1hbGlnbjpsZWZ0fS51cGNyb3AtdXBsb2FkLXRhYmxlLXNlYXJjaHtkaXNwbGF5OmZsZXg7cGFkZGluZzoxLjNlbSAxLjZlbX0udXBjcm9wLXVwbG9hZC10YWJsZS1zZWFyY2ggaW5wdXR7Zm9udC1zaXplOjE0cHg7ZmxleDoxIDEgMTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtZmxleDoxO2JvcmRlcjpub25lO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7b3V0bGluZTotd2Via2l0LWZvY3VzLXJpbmctY29sb3IgYXV0byAwIWltcG9ydGFudH0udXBjcm9wLXVwbG9hZC10YWJsZS1zZWFyY2g+bWF0LWljb257bWFyZ2luLXJpZ2h0OjE2cHg7bWFyZ2luLXRvcDoycHh9W3RhYmxlLWxvYWRpbmdde3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCU7bWFyZ2luLXRvcDo1OXB4IWltcG9ydGFudDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpO2hlaWdodDpjYWxjKDEwMCUgLSA1OXB4KTt6LWluZGV4OjF9W3RhYmxlLW5vLWVudHJpZXNde3BhZGRpbmc6MS42ZW19Lm1hdC1jYXJkW2hhcy10YWJsZV17cGFkZGluZzowfS5tYXQtY2FyZFtoYXMtdGFibGVdIC5tYXQtY2FyZC1hY3Rpb25ze3BhZGRpbmc6OHB4IWltcG9ydGFudDttYXJnaW46MDtib3JkZXItdG9wOjFweCBzb2xpZCAjZGJkYmRiO2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4wOSl9Lm1hdC1jYXJkW2hhcy10YWJsZV0gLm1hdC1jYXJkLWFjdGlvbnMgLm1hdC1pY29uLWJ1dHRvbntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYXJkW2hhcy10YWJsZV0gLm1hdC1jYXJkLWFjdGlvbnMgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF17Y29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FyZFtoYXMtdGFibGVdIC5tYXQtY2FyZC1hY3Rpb25zIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1sYWJlbHttYXJnaW46MCAxNXB4O2NvbG9yOnJnYmEoMCwwLDAsLjU0KTtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo0MDB9LnVwY3JvcC11cGxvYWQtdGFibGUgLmFjdGlvbnMgLm1hdC1pY29uLWJ1dHRvbntoZWlnaHQ6MzBweCFpbXBvcnRhbnQ7d2lkdGg6MzBweDtsaW5lLWhlaWdodDozMHB4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO3BsYWNlLWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0udXBjcm9wLXVwbG9hZC10YWJsZSAuYWN0aW9ucyAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoxOHB4O3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHh9LnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdHJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCkhaW1wb3J0YW50fS51cGNyb3AtdXBsb2FkLXRhYmxlIHRoZWFkIHRkOmZpcnN0LW9mLXR5cGUsLnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdGg6Zmlyc3Qtb2YtdHlwZXtwYWRkaW5nLWxlZnQ6MS44ZW19LnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWQgdGQ6bGFzdC1vZi10eXBlLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoZWFkIHRoOmxhc3Qtb2YtdHlwZXtwYWRkaW5nLXJpZ2h0OjEuOGVtfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRoZWFkIHRkIG1hdC1pY29uLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoZWFkIHRoIG1hdC1pY29ue2hlaWdodDoxNnB4O3dpZHRoOjE2cHg7bGluZS1oZWlnaHQ6MTZweDtmb250LXNpemU6MTZweDt2ZXJ0aWNhbC1hbGlnbjpib3R0b207bWFyZ2luLXJpZ2h0OjNweH0udXBjcm9wLXVwbG9hZC10YWJsZSB0Ym9keSB0ZCwudXBjcm9wLXVwbG9hZC10YWJsZSB0Ym9keSB0aHtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMDQpfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRkOmZpcnN0LW9mLXR5cGUsLnVwY3JvcC11cGxvYWQtdGFibGUgdGJvZHkgdGg6Zmlyc3Qtb2YtdHlwZXtwYWRkaW5nLWxlZnQ6MS42ZW19LnVwY3JvcC11cGxvYWQtdGFibGUgdGJvZHkgdGQ6bGFzdC1vZi10eXBlLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRoOmxhc3Qtb2YtdHlwZXtwYWRkaW5nLXJpZ2h0OjEuNmVtfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRoZWFkIHRkLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoZWFkIHRoe2NvbG9yOnJnYmEoMCwwLDAsLjU0KTtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo0MDA7cGFkZGluZzoxLjNlbSAuNzVlbTtib3JkZXI6MH0udXBjcm9wLXVwbG9hZC10YWJsZSB0Ym9keSB0ZHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7cGFkZGluZzoxZW0gLjc1ZW07Zm9udC1zaXplOi45cmVtO2ZvbnQtd2VpZ2h0OjQwMH1AbWVkaWEgKG1heC13aWR0aDo4MDBweCl7LnVwY3JvcC11cGxvYWQtdGFibGV7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246dG9wO21heC13aWR0aDoxMDAlO292ZXJmbG93LXg6YXV0bzt3aGl0ZS1zcGFjZTpub3dyYXA7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2JvcmRlci1zcGFjaW5nOjA7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOjAgMH0udXBjcm9wLXVwbG9hZC10YWJsZSAuYWN0aW9ucyBhe21hcmdpbi10b3A6LS4zNWVtfS51cGNyb3AtdXBsb2FkLXRhYmxlIC5pcy1wdWxsZWQtcmlnaHR7ZmxvYXQ6bm9uZSFpbXBvcnRhbnR9LnVwY3JvcC11cGxvYWQtdGFibGUgdGhlYWR7ZGlzcGxheTpmbGV4O2ZsZXgtc2hyaW5rOjA7bWluLXdpZHRoOi13ZWJraXQtbWluLWNvbnRlbnQ7bWluLXdpZHRoOi1tb3otbWluLWNvbnRlbnQ7bWluLXdpZHRoOm1pbi1jb250ZW50fS51cGNyb3AtdXBsb2FkLXRhYmxlIHRoZWFkIHRkLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoZWFkIHRoe3BhZGRpbmc6MS4zZW0gMS44ZW07dGV4dC1hbGlnbjpyaWdodDt3aWR0aDoxMDAlIWltcG9ydGFudH0udXBjcm9wLXVwbG9hZC10YWJsZSB0aGVhZCB0ZCBtYXQtaWNvbiwudXBjcm9wLXVwbG9hZC10YWJsZSB0aGVhZCB0aCBtYXQtaWNvbnttYXJnaW4tcmlnaHQ6MH0udXBjcm9wLXVwbG9hZC10YWJsZSB0Ym9keXtmbGV4OjEgMSAxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1mbGV4OjE7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7YmFja2dyb3VuZDpyYWRpYWwtZ3JhZGllbnQobGVmdCxlbGxpcHNlLHJnYmEoMCwwLDAsLjIpIDAsdHJhbnNwYXJlbnQgNzUlKSAwIGNlbnRlcixyYWRpYWwtZ3JhZGllbnQocmlnaHQsZWxsaXBzZSxyZ2JhKDAsMCwwLC4yKSAwLHRyYW5zcGFyZW50IDc1JSkgMTAwJSBjZW50ZXI7YmFja2dyb3VuZC1zaXplOjEwcHggMTAwJSwxMHB4IDEwMCU7YmFja2dyb3VuZC1hdHRhY2htZW50OnNjcm9sbCxzY3JvbGw7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdy14OmF1dG87b3ZlcmZsb3cteTpoaWRkZW47bWFyZ2luLXJpZ2h0OjEuNmVtfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRye2ZsZXg6MSAxIDEwMCU7Ym94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LWZsZXg6MX0udXBjcm9wLXVwbG9hZC10YWJsZSB0Ym9keSB0ZCwudXBjcm9wLXVwbG9hZC10YWJsZSB0Ym9keSB0aHtwYWRkaW5nOjEuMTU1ZW0gMS42ZW07dGV4dC1hbGlnbjpsZWZ0IWltcG9ydGFudH0udXBjcm9wLXVwbG9hZC10YWJsZSB0Ym9keSB0ZDpmaXJzdC1vZi10eXBlLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRoOmZpcnN0LW9mLXR5cGV7cGFkZGluZy1sZWZ0OjEuNmVtfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRib2R5IHRkOmxhc3Qtb2YtdHlwZSwudXBjcm9wLXVwbG9hZC10YWJsZSB0Ym9keSB0aDpsYXN0LW9mLXR5cGV7cGFkZGluZy1yaWdodDoxLjZlbX0udXBjcm9wLXVwbG9hZC10YWJsZSB0cntkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDotd2Via2l0LW1pbi1jb250ZW50O21pbi13aWR0aDotbW96LW1pbi1jb250ZW50O21pbi13aWR0aDptaW4tY29udGVudDtmbGV4LXNocmluazowfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRkLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoe2Rpc3BsYXk6YmxvY2s7YmFja2dyb3VuZC1pbWFnZTpub25lIWltcG9ydGFudDtib3JkZXItbGVmdDowfS51cGNyb3AtdXBsb2FkLXRhYmxlIHRkOmZpcnN0LWNoaWxkLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoOmZpcnN0LWNoaWxke2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCNmZmYgNTAlLHJnYmEoMjU1LDI1NSwyNTUsMCkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZToyMHB4IDEwMCV9LnVwY3JvcC11cGxvYWQtdGFibGUgdGQ6bGFzdC1jaGlsZCwudXBjcm9wLXVwbG9hZC10YWJsZSB0aDpsYXN0LWNoaWxke2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQsI2ZmZiA1MCUscmdiYSgyNTUsMjU1LDI1NSwwKSAxMDAlKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjoxMDAlIDA7YmFja2dyb3VuZC1zaXplOjIwcHggMTAwJX0udXBjcm9wLXVwbG9hZC10YWJsZSB0ZDpub3QoOmxhc3QtY2hpbGQpLC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoOm5vdCg6bGFzdC1jaGlsZCl7Ym9yZGVyLWJvdHRvbTowfX0udXBjcm9wLXVwbG9hZC10YWJsZSA6Oi13ZWJraXQtc2Nyb2xsYmFye2hlaWdodDo4cHg7b3ZlcmZsb3c6dmlzaWJsZTt3aWR0aDoxNnB4fS51cGNyb3AtdXBsb2FkLXRhYmxlIDo6LXdlYmtpdC1zY3JvbGxiYXItYnV0dG9ue2hlaWdodDowO3dpZHRoOjB9LnVwY3JvcC11cGxvYWQtdGFibGUgOjotd2Via2l0LXNjcm9sbGJhci1jb3JuZXJ7YmFja2dyb3VuZDowIDB9LnVwY3JvcC11cGxvYWQtdGFibGUgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjIpO2JhY2tncm91bmQtY2xpcDpwYWRkaW5nLWJveDtib3JkZXI6c29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXdpZHRoOjFweCAxcHggMXB4IDZweDttaW4taGVpZ2h0OjI4cHg7cGFkZGluZzoxMDBweCAwIDA7Ym94LXNoYWRvdzppbnNldCAxcHggMXB4IDAgcmdiYSgwLDAsMCwuMSksaW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwuMDcpfS51cGNyb3AtdXBsb2FkLXRhYmxlIDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94O2JvcmRlcjpzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItd2lkdGg6MCAwIDAgNHB4fVtlbnRlcmxpc3RdIFtoYXMtdGFibGVde21hcmdpbi1yaWdodDotMjRweDttYXJnaW4tbGVmdDotMjRweH1bZW50ZXJsaXN0XSBbaGFzLXRhYmxlXSAudXBjcm9wLXVwbG9hZC10YWJsZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fVtlbnRlcmxpc3RdIFtoYXMtdGFibGVdIC51cGNyb3AtdXBsb2FkLXRhYmxlIHRoZWFkIHRye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpIWltcG9ydGFudH1bZW50ZXJsaXN0XSBbaGFzLXRhYmxlXSAudXBjcm9wLXVwbG9hZC10YWJsZSB0cjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmluaGVyaXR9LmltYWdlLXByZXZpZXcgaW1ne21heC13aWR0aDoxMDAlfWBdXG59KVxuZXhwb3J0IGNsYXNzIFVwY3JvcFVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgY29uZmlnOiBhbnkgPSB7fTtcbiAgICBASW5wdXQoKSBwdWJsaWMgdXBsb2FkUXVldWU6IGFueSA9IFtdO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25VcGxvYWRRdWV1ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uVXBsb2FkSW1hZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBwdWJsaWMgdXBsb2FkZXI6IEZpbGVVcGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoe30pO1xuICAgIHB1YmxpYyBoYXNGaWxlT3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoKSB7IH1cblxuICAgIG5nT25Jbml0KCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNldCB1cGxvYWRlclxuICAgICAgICB0aGlzLnNldFVwbG9hZGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHVwbG9hZGVyXG4gICAgICovXG4gICAgc2V0VXBsb2FkZXIoKSB7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQ29udGV4dCBmb3IgdXBsb2FkZXJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNldCB1cGxvYWRlclxuICAgICAgICB0aGlzLnVwbG9hZGVyLnNldE9wdGlvbnMoeyB1cmw6IHRoaXMuY29uZmlnLnVybCwgYXV0aFRva2VuOiB0aGlzLmNvbmZpZy5hdXRoVG9rZW4sIGF1dG9VcGxvYWQ6IHRoaXMuY29uZmlnLmF1dG9VcGxvYWQsIGFkZGl0aW9uYWxQYXJhbWV0ZXI6IHRoaXMuY29uZmlnLmFkZGl0aW9uYWxQYXJhbWV0ZXIgfSk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQWZ0ZXIgYWRkIGZpbGUgZXZlbnRcbiAgICAgICAgdGhpcy51cGxvYWRlci5vbkFmdGVyQWRkaW5nRmlsZSA9IChmaWxlKSA9PiB7XG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBTZXQgd2l0aCBjcmVkZW50aWFsc1xuICAgICAgICAgICAgZmlsZS53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLmNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBFbWl0IG9uVXBsb2FkUXVldWVcbiAgICAgICAgICAgIHRoaXMub25VcGxvYWRRdWV1ZS5lbWl0KHtcbiAgICAgICAgICAgICAgICBmaWxlOiBmaWxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBPbiBzdWNjZXNzIGl0ZW0gZXZlbnRcbiAgICAgICAgdGhpcy51cGxvYWRlci5vblN1Y2Nlc3NJdGVtID0gKGl0ZW06IEZpbGVJdGVtLCByZXNwb25zZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgaGVhZGVyczogUGFyc2VkUmVzcG9uc2VIZWFkZXJzKSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMjAwKSB7XG5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIFBhcnNlIHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gRW1pdCBvblVwbG9hZFF1ZXVlXG4gICAgICAgICAgICAgICAgdGhpcy5vblVwbG9hZEltYWdlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGZpbGUgb3ZlciBldmVudFxuICAgICAqIEBwYXJhbSBlXG4gICAgICovXG4gICAgcHVibGljIG9uRmlsZU92ZXIoZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGFzRmlsZU92ZXIgPSBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydW5jYXRlIGZpbGVuYW1lXG4gICAgICogQHBhcmFtIG5cbiAgICAgKiBAcGFyYW0gbGVuXG4gICAgICovXG4gICAgdHJ1bmNhdGUobiwgbGVuKSB7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVmFsaWRhdGVcbiAgICAgICAgaWYgKCFuKSByZXR1cm4gbjtcblxuICAgICAgICBsZXQgZXh0ID0gbi5zdWJzdHJpbmcobi5sYXN0SW5kZXhPZihcIi5cIikgKyAxLCBuLmxlbmd0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGZpbGVuYW1lID0gbi5yZXBsYWNlKCcuJyArIGV4dCwgJycpO1xuICAgICAgICBpZiAoZmlsZW5hbWUubGVuZ3RoIDw9IGxlbikge1xuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoMCwgbGVuKSArIChuLmxlbmd0aCA+IGxlbiA/ICdbLi4uXScgOiAnJyk7XG4gICAgICAgIHJldHVybiBmaWxlbmFtZSArICcuJyArIGV4dDtcbiAgICB9XG59XG4iXX0=