sx-ng-aggrid
Version:
Angular Grid Table(ag-grid) Componet
484 lines • 76.3 kB
JavaScript
import * as tslib_1 from "tslib";
import { Component, ViewChild, Input } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Router, ActivatedRoute } from '@angular/router';
import { gridSequelizeFormatter } from './grid-sequelize';
import { GridValueFormatter as _GridValueFormatter } from './grid-value-formatter';
import { Papa } from 'ngx-papaparse';
export var GridFilterType;
(function (GridFilterType) {
GridFilterType["Text"] = "agTextColumnFilter";
GridFilterType["Date"] = "agDateColumnFilter";
GridFilterType["Number"] = "agNumberColumnFilter";
})(GridFilterType || (GridFilterType = {}));
export var GridValueFormatter = _GridValueFormatter;
var GridComponent = /** @class */ (function () {
function GridComponent(http, route, router, papa) {
var _this = this;
this.http = http;
this.route = route;
this.router = router;
this.papa = papa;
this.gridSortModel = [];
this.gridFilterModel = null;
this.totalPageCount = 1;
this.currentPageNumber = 1;
this.pageRowCount = 100;
this.totalRowCount = 0;
this.isRowViewMode = false;
this.rowViewDataId = null;
this.rowViewData = [];
this.gridOptions = {
defaultColDef: {
width: 120,
filterParams: { caseSensitive: true, debounceMs: 1000, newRowsAction: 'keep' }
},
enableServerSideFilter: true,
enableServerSideSorting: true,
enableFilter: true,
enableSorting: true,
enableColResize: true,
rowSelection: 'single',
onGridReady: function () {
// If there is saved filter/sort
// Then read & load to grid
var savedFilterSort = _this.loadLocalStorageData();
if (savedFilterSort && _this.params.keepUserFilterSort) {
_this.gridFilterModel = savedFilterSort.gridFilterModel || undefined;
_this.gridSortModel = savedFilterSort.gridSortModel || [];
_this.currentPageNumber = savedFilterSort.currentPageNumber > 0 ? +savedFilterSort.currentPageNumber : 1;
_this.gridOptions.api.setSortModel(_this.gridSortModel);
_this.gridOptions.api.setFilterModel(_this.gridFilterModel);
if (_this.params.doNotUsePagination)
_this.refresh();
}
else {
_this.refresh();
}
},
onSortChanged: function () {
_this.gridSortModel = _this.gridOptions.api.getSortModel();
if (!_this.params.doNotUsePagination)
_this.refresh();
},
onFilterChanged: function () {
_this.gridFilterModel = _this.gridOptions.api.getFilterModel();
if (!_this.params.doNotUsePagination) {
_this.refresh();
}
else {
_this.totalRowCount = _this.gridOptions.api.getDisplayedRowCount();
}
},
onRowDoubleClicked: function (event) {
_this.onButtonEdit();
}
};
}
GridComponent.prototype.ngOnInit = function () {
if (this.params.doNotUsePagination) {
this.pageRowCount = Number.MAX_SAFE_INTEGER;
this.gridOptions.enableServerSideFilter = false;
this.gridOptions.enableServerSideSorting = false;
}
};
GridComponent.prototype.ngOnDestroy = function () {
this.saveLocalStorageData();
};
GridComponent.prototype.saveLocalStorageData = function () {
if (!this.params.keepUserFilterSort) {
return;
}
// On Destroy read & save filter/sort/currentPage info
// We will load it when we are back
localStorage.setItem(this.params.httpEndpoint, JSON.stringify({
gridFilterModel: this.gridFilterModel,
gridSortModel: this.gridSortModel,
currentPageNumber: this.currentPageNumber
}));
};
GridComponent.prototype.loadLocalStorageData = function () {
var str = localStorage.getItem(this.params.httpEndpoint);
if (str) {
return JSON.parse(str);
}
return null;
};
GridComponent.prototype.refresh = function (updateOnPosition) {
var _this = this;
if (!this.params.doNotUsePagination) {
var params_1 = gridSequelizeFormatter(this.params.initialSortModel, this.params.staticFilter, this.params.httpIncludeParam, this.currentPageNumber, this.pageRowCount, this.gridSortModel, this.gridFilterModel);
this.http
.get(this.params.httpEndpoint + '/count', { params: params_1 })
.subscribe(function (count) {
_this.totalRowCount = count;
_this.totalPageCount = Math.ceil(_this.totalRowCount / _this.pageRowCount);
// check currentPageNumber & offset
if (_this.currentPageNumber == 0 && _this.totalPageCount > 0) {
_this.currentPageNumber = 1;
}
if (_this.currentPageNumber > _this.totalPageCount) {
_this.currentPageNumber = _this.totalPageCount;
params_1.offset = _this.currentPageNumber > 0 ? (_this.currentPageNumber - 1) * _this.pageRowCount : 0;
}
_this.http
.get(_this.params.httpEndpoint, { params: params_1 })
.subscribe(function (rowData) {
if (updateOnPosition) {
var displayedRowData_1 = [];
_this.gridOptions.api.getModel().forEachNode(function (row) {
displayedRowData_1.push(row);
});
if (rowData.length < displayedRowData_1.length) {
for (var i = rowData.length; i < displayedRowData_1.length; i++) {
_this.gridOptions.api.updateRowData({ remove: [displayedRowData_1[i].data] });
}
}
else if (rowData.length > displayedRowData_1.length) {
for (var i = displayedRowData_1.length; i < rowData.length; i++) {
_this.gridOptions.api.updateRowData({ add: [rowData[i]] });
}
}
rowData.map(function (data, index) {
var gridRow = _this.gridOptions.api.getRowNode(index.toString());
if (gridRow)
gridRow.setData(data);
});
// setData filtreleme, sıralama gibi işlemlerdeki değişiklikleri yansıtacak şekilde güncellemiyor.
// setData ile veri girişi yapıldıktan sonra tablodaki verilerin filtrelenmesini, sıralanmasını güncellemek için eklendi
_this.gridOptions.api.refreshClientSideRowModel('filter');
_this.gridOptions.api.refreshClientSideRowModel('sort');
}
else {
_this.gridOptions.api.setRowData(rowData);
}
_this.gridOptions.api.sizeColumnsToFit();
}, function (err) {
if (_this.params.gridFunctions.logToConsole) {
console.log(_this.formatErrorMessage(err));
}
else {
alert(_this.formatErrorMessage(err));
}
});
}, function (err) {
if (_this.params.gridFunctions.logToConsole) {
console.log(_this.formatErrorMessage(err));
}
else {
alert(_this.formatErrorMessage(err));
}
});
}
else {
var params_2 = gridSequelizeFormatter(this.params.initialSortModel, this.params.staticFilter, this.params.httpIncludeParam);
this.http
.get(this.params.httpEndpoint, { params: params_2 })
.subscribe(function (rowData) {
// Count
_this.totalPageCount = 1;
_this.currentPageNumber = 1;
params_2.offset = 0;
if (updateOnPosition) {
var displayedRowData_2 = [];
_this.gridOptions.api.getModel().forEachNode(function (row) {
displayedRowData_2.push(row);
});
if (rowData.length < displayedRowData_2.length) {
for (var i = rowData.length; i < displayedRowData_2.length; i++) {
_this.gridOptions.api.updateRowData({ remove: [displayedRowData_2[i].data] });
}
}
else if (rowData.length > displayedRowData_2.length) {
for (var i = displayedRowData_2.length; i < rowData.length; i++) {
_this.gridOptions.api.updateRowData({ add: [rowData[i]] });
}
}
rowData.map(function (data, index) {
var gridRow = _this.gridOptions.api.getRowNode(index.toString());
if (gridRow)
gridRow.setData(data);
});
// setData filtreleme, sıralama gibi işlemlerdeki değişiklikleri yansıtacak şekilde güncellemiyor.
// setData ile veri girişi yapıldıktan sonra tablodaki verilerin filtrelenmesini, sıralanmasını güncellemek için eklendi
_this.gridOptions.api.refreshClientSideRowModel('filter');
_this.gridOptions.api.refreshClientSideRowModel('sort');
}
else {
_this.gridOptions.api.setRowData(rowData);
}
_this.totalRowCount = _this.gridOptions.api.getDisplayedRowCount();
_this.gridOptions.api.sizeColumnsToFit();
}, function (err) {
if (_this.params.gridFunctions.logToConsole) {
console.log(_this.formatErrorMessage(err));
}
else {
alert(_this.formatErrorMessage(err));
}
});
}
};
GridComponent.prototype.onButtonAdd = function () {
if (!this.params.gridFunctions.canAdd || !this.params.gridFunctions.addBaseUrl) {
return;
}
this.saveLocalStorageData();
this.router.navigate([this.params.gridFunctions.addBaseUrl + "/0"], { queryParams: { returnUrl: this.router.url } });
};
GridComponent.prototype.onButtonEdit = function () {
if (!this.params.gridFunctions.canEdit || !this.params.gridFunctions.editBaseUrl) {
return this.onButtonView();
}
var selRow = this.gridOptions.api.getSelectedRows()[0];
if (!selRow) {
return;
}
this.saveLocalStorageData();
this.router.navigate([this.params.gridFunctions.editBaseUrl + "/" + selRow[this.params.idColName || 'id']], { queryParams: { returnUrl: this.router.url } });
};
GridComponent.prototype.onButtonCopy = function () {
if (!this.params.gridFunctions.canCopy || !this.params.gridFunctions.addBaseUrl) {
return this.onButtonView();
}
var selRow = this.gridOptions.api.getSelectedRows()[0];
if (!selRow) {
return;
}
this.router.navigate([this.params.gridFunctions.addBaseUrl + "/0"], { queryParams: selRow });
};
GridComponent.prototype.onButtonDelete = function () {
var _this = this;
if (!this.params.gridFunctions.canDelete) {
return;
}
var selRow = this.gridOptions.api.getSelectedRows()[0];
if (!selRow) {
return;
}
if (confirm('Delete?')) {
this.http
.delete(this.params.httpEndpoint + '/' + selRow[this.params.idColName || 'id'])
.subscribe(function (result) {
_this.refresh();
}, function (err) {
alert(_this.formatErrorMessage(err));
});
}
};
GridComponent.prototype.onButtonBackward = function () {
if (this.currentPageNumber <= 1) {
return;
}
this.currentPageNumber = 1;
this.refresh();
};
GridComponent.prototype.onButtonForward = function () {
if (this.currentPageNumber >= this.totalPageCount) {
return;
}
this.currentPageNumber = this.totalPageCount;
this.refresh();
};
GridComponent.prototype.onButtonNext = function () {
if (this.currentPageNumber >= this.totalPageCount) {
return;
}
this.currentPageNumber = this.currentPageNumber + 1;
this.refresh();
};
GridComponent.prototype.onButtonPrevious = function () {
if (this.currentPageNumber <= 1) {
return;
}
this.currentPageNumber = this.currentPageNumber - 1;
this.refresh();
};
GridComponent.prototype.onButtonRefresh = function () {
this.refresh(true);
};
GridComponent.prototype.formatErrorMessage = function (error) {
console.error(error);
var errMsg = 'Unknown Error';
if (error && error.error && error.error.error && error.error.error.message) {
errMsg = error.error.error.message;
}
else {
if (error && error.error && error.error.message) {
errMsg = error.error.message;
}
else {
if (error && error.message) {
errMsg = error.message;
}
}
}
return errMsg;
};
GridComponent.prototype.onButtonView = function () {
var _this = this;
var selRow = this.gridOptions.api.getSelectedRows()[0];
if (!selRow) {
return;
}
this.rowViewData = [];
this.gridOptions.columnDefs.forEach(function (column) {
_this.rowViewData.push({
headerName: column.headerName,
value: column.valueFormatter
? column.valueFormatter({ value: getObjectValueWithDotNotation(selRow, column.field) })
: getObjectValueWithDotNotation(selRow, column.field)
});
});
this.saveLocalStorageData();
this.rowViewDataId = selRow[this.params.idColName || 'id'];
this.isRowViewMode = true;
};
GridComponent.prototype.onButtonViewCancel = function () {
this.isRowViewMode = false;
};
GridComponent.prototype.onButtonViewEdit = function () {
if (!this.params.gridFunctions.canEdit || !this.params.gridFunctions.editBaseUrl) {
return;
}
this.saveLocalStorageData();
this.router.navigate([this.params.gridFunctions.editBaseUrl + "/" + this.rowViewDataId], { queryParams: { returnUrl: this.router.url } });
};
GridComponent.prototype.onButtonImportCSV = function ($event) {
var _this = this;
if (!this.params.gridFunctions.canImport) {
return;
}
var files = $event.srcElement.files;
var reader = new FileReader();
reader.onload = function () {
_this.csvData = reader.result;
_this.papa.parse(_this.csvData, {
header: true,
delimiter: ';',
skipEmptyLines: true,
complete: function (results) {
_this.http
.post(_this.params.httpEndpoint + '/createBulk', results.data)
.subscribe(function (result) {
_this.fileImput.nativeElement.value = '';
_this.refresh();
}, function (err) {
_this.fileImput.nativeElement.value = '';
alert(_this.formatErrorMessage(err));
});
}
});
};
reader.readAsText(files[0]);
};
GridComponent.prototype.onButtonExport = function () {
var _this = this;
if (this.params.gridFunctions.exportFromServerSide) {
this.http
.get(this.params.httpEndpoint + '/export', { observe: 'response', responseType: 'arraybuffer' })
.subscribe(function (data) {
var fileName = data.headers.get('Content-Filename');
downloadFile(data.body, fileName, 'application/gzip', '.zip');
}, function (err) {
alert(_this.formatErrorMessage(err));
});
}
else {
var params = gridSequelizeFormatter(this.params.initialSortModel, this.params.staticFilter, this.params.httpIncludeParam, 0, 1000 * 1000 * 1000, // Allow max record
this.gridSortModel, this.gridFilterModel);
this.http
.get(this.params.httpEndpoint, { params: params })
.subscribe(function (rowData) {
var csvData;
_this.gridOptions.columnDefs.forEach(function (column) {
if (_this.params.exportFields && _this.params.exportFields.indexOf(column.field) < 0) {
return;
}
if (csvData) {
csvData = csvData + ";\"" + column.field + "\"";
}
else {
csvData = "\"" + column.field + "\"";
}
});
csvData += '\r\n';
// Add rows
for (var i = 0; i < rowData.length; i++) {
for (var j = 0; j < _this.gridOptions.columnDefs.length; j++) {
var column = _this.gridOptions.columnDefs[j];
if (_this.params.exportFields && _this.params.exportFields.indexOf(column.field) < 0) {
continue;
}
var value = column.valueFormatter ? column.valueFormatter({
value: getObjectValueWithDotNotation(rowData[i], column.field)
}) : getObjectValueWithDotNotation(rowData[i], column.field);
if (typeof value === 'string') {
value = value.replace(/\/\r|\n/gi, '');
}
if (j === 0) {
csvData = csvData + "\"" + (value ? value : '') + "\"";
}
else {
csvData = csvData + ";\"" + (value ? value : '') + "\"";
}
}
csvData += '\r\n';
}
downloadFile(csvData, 'Export_Grid', 'text/csv', '.csv');
}, function (err) {
alert(_this.formatErrorMessage(err));
});
}
};
GridComponent.ctorParameters = function () { return [
{ type: HttpClient },
{ type: ActivatedRoute },
{ type: Router },
{ type: Papa }
]; };
tslib_1.__decorate([
Input()
], GridComponent.prototype, "params", void 0);
tslib_1.__decorate([
ViewChild('agGrid', { static: false })
], GridComponent.prototype, "agGrid", void 0);
tslib_1.__decorate([
ViewChild('fileImput', { static: false })
], GridComponent.prototype, "fileImput", void 0);
GridComponent = tslib_1.__decorate([
Component({
// tslint:disable-next-line: component-selector
selector: 'sx-ng-aggrid',
template: "<!-- Grid View -->\n<div *ngIf=\"!isRowViewMode\" style=\"width: 100%; height: 100%;\" class=\"container-fluid sx-ng-aggrid-main\">\n <div style=\"width: 100%;min-height:42px\" class=\" sx-ng-aggrid-toolbar\" *ngIf=\"!params?.hideToolbar\">\n <div class=\"row\">\n <div class=\"col-md-5 mb-1\">\n <div class=\"btn-toolbar\" role=\"toolbar\">\n <div class=\"btn-group mr-2 me-2\" role=\"group\">\n <button *ngIf=\"!params?.gridFunctions?.hideView\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonView()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"View Record\">\n <i class=\"fa fa-search-plus\"> </i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canAdd\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonAdd()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Add...\">\n <i class=\"fa fa-plus\"> </i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canEdit\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonEdit()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Edit...\">\n <i class=\"fa fa-edit\"> </i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canCopy\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonCopy()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Copy...\">\n <i class=\"far fa-copy\"> </i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canDelete\" type=\"button\" class=\"btn btn-secondary\"\n (click)=\"onButtonDelete()\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Delete...\">\n <i class=\"fa fa-times\"> </i>\n </button>\n <button *ngIf=\"params?.gridFunctions?.canImport\" type=\"button\" class=\"btn btn-secondary import\"\n data-toggle=\"tooltip\" data-placement=\"top\" title=\"Import\">\n <label for=\"customFile\" class=\"m-0\"><i class=\"fas fa-upload\"></i></label>\n <input #fileImput type=\"file\" class=\"custom-file-input d-none\" id=\"customFile\" accept=\".csv\"\n (change)=\"onButtonImportCSV($event)\">\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonExport()\" data-toggle=\"tooltip\"\n data-placement=\"top\" title=\"Export\">\n <i class=\"fa fa-download\"> </i>\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonRefresh()\"\n data-toggle=\"tooltip\" data-placement=\"top\" title=\"Refresh\">\n <i class=\"fa fa-undo\"> </i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"col-md-2 mb-1 text-center\">\n <button type=\"button\" class=\"btn btn-light count-btn\" disabled>\n <i class=\"fa fa-database\"></i>: {{totalRowCount}}\n </button>\n </div>\n <div class=\"mb-1\"\n [ngClass]=\"!params?.doNotUsePagination ? 'col-md-1' : 'col-md-5 ms-auto ml-auto text-right'\">\n <ng-content select=\"[extra-buttons]\"></ng-content>\n </div>\n <div class=\"col-md-4 mb-1 pagination\" *ngIf=\"!params?.doNotUsePagination\">\n <div class=\"btn-group ms-auto ml-auto\" role=\"group\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonBackward()\">\n <i class=\"fa fa-backward\"></i> \n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonPrevious()\">\n <i class=\"fa fa-caret-left\"></i> \n </button>\n <button type=\"button\" class=\"btn btn-light\" disabled>{{' '+currentPageNumber+' / '+totalPageCount+'\n '}}</button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonNext()\">\n <i class=\"fa fa-caret-right\"></i>\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonForward()\">\n <i class=\"fa fa-forward\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div style=\"width: 100%; height: 100%;\" class=\"sx-ng-aggrid-toolbar\">\n <ag-grid-angular #agGrid style=\"width: 100%; height: 100%;\" class=\"ag-theme-fresh\" [rowData]=\"rowData\"\n [columnDefs]=\"params?.columnDefs\" [gridOptions]=\"gridOptions\"></ag-grid-angular>\n </div>\n</div>\n\n<!-- Row View -->\n<div *ngIf=\"isRowViewMode\" class=\"container-fluid\">\n <div class=\"row\">\n <div class=\"col-md-8 mb-1\">\n <h3>Details\n <span class=\"float-right float-end\">\n <button *ngIf=\"params?.gridFunctions?.canEdit\" type=\"button\" class=\"btn btn-primary\"\n (click)=\"onButtonViewEdit()\">\n \n <i class=\"fa fa-edit\"></i> \n </button> \n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onButtonViewCancel()\">\n \n <i class=\"fa fa-arrow-circle-left\"></i> \n </button>\n </span>\n </h3>\n <hr style=\"border-top: 1px solid black;\" />\n\n <div class=\"form-group mb-3\" *ngFor=\"let field of rowViewData\">\n <label class=\"mb-2\">{{field.headerName}}</label>\n <input class=\"form-control\" [value]=\"field.value\" disabled>\n </div>\n </div>\n </div>\n</div>",
styles: ["@media only screen and (max-width:767px){.btn-toolbar>.btn-group.mr-2{width:100%;margin-right:0!important}.count-btn{width:100%}.pagination{display:-ms-grid;display:grid;padding:0 15px}.pagination>.btn-group{margin:auto 0!important}}.import{min-width:42px;padding:0}.import>label{width:100%;height:100%;position:absolute;top:0;left:0;line-height:36px;cursor:pointer}.fa-file-archive::before{content:'\\f1c6'}"]
})
], GridComponent);
return GridComponent;
}());
export { GridComponent };
/**
* Helper Functions
*/
function getObjectValueWithDotNotation(object, keys) {
return keys.split('.').reduce(function (o, k) {
return (o || {})[k];
}, object);
}
function downloadFile(data, filename, fileType, fileExtention) {
var htmlElement = document.createElement('a');
htmlElement.setAttribute('style', 'display:none;');
document.body.appendChild(htmlElement);
var blob = new Blob([data], { type: fileType });
var url = window.URL.createObjectURL(blob);
htmlElement.href = url;
var isIE = /*@cc_on!@*/ false || !!document.documentMode;
if (isIE) {
var retVal = navigator.msSaveBlob(blob, filename + fileExtention);
}
else {
htmlElement.download = filename + fileExtention;
}
htmlElement.click();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zeC1uZy1hZ2dyaWQvIiwic291cmNlcyI6WyJzcmMvYXBwL21vZHVsZXMvZ3JpZC9ncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsS0FBSyxFQUF5QixNQUFNLGVBQWUsQ0FBQztBQUczRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLElBQUksbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJDLE1BQU0sQ0FBTixJQUFZLGNBSVg7QUFKRCxXQUFZLGNBQWM7SUFDeEIsNkNBQTJCLENBQUE7SUFDM0IsNkNBQTJCLENBQUE7SUFDM0IsaURBQStCLENBQUE7QUFDakMsQ0FBQyxFQUpXLGNBQWMsS0FBZCxjQUFjLFFBSXpCO0FBRUQsTUFBTSxDQUFDLElBQU0sa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7QUFpQ3REO0lBc0JFLHVCQUNVLElBQWdCLEVBQ2hCLEtBQXFCLEVBQ3JCLE1BQWMsRUFDZCxJQUFVO1FBSnBCLGlCQW1EQztRQWxEUyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxTQUFJLEdBQUosSUFBSSxDQUFNO1FBcEJwQixrQkFBYSxHQUFpQixFQUFFLENBQUM7UUFDakMsb0JBQWUsR0FBaUIsSUFBSSxDQUFDO1FBQ3JDLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLHNCQUFpQixH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