sx-ng-aggrid
Version:
Angular Grid Table(ag-grid) Componet
477 lines • 75.1 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 const GridValueFormatter = _GridValueFormatter;
let GridComponent = class GridComponent {
constructor(http, route, router, papa) {
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: () => {
// If there is saved filter/sort
// Then read & load to grid
const 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: () => {
this.gridSortModel = this.gridOptions.api.getSortModel();
if (!this.params.doNotUsePagination)
this.refresh();
},
onFilterChanged: () => {
this.gridFilterModel = this.gridOptions.api.getFilterModel();
if (!this.params.doNotUsePagination) {
this.refresh();
}
else {
this.totalRowCount = this.gridOptions.api.getDisplayedRowCount();
}
},
onRowDoubleClicked: (event) => {
this.onButtonEdit();
}
};
}
ngOnInit() {
if (this.params.doNotUsePagination) {
this.pageRowCount = Number.MAX_SAFE_INTEGER;
this.gridOptions.enableServerSideFilter = false;
this.gridOptions.enableServerSideSorting = false;
}
}
ngOnDestroy() {
this.saveLocalStorageData();
}
saveLocalStorageData() {
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
}));
}
loadLocalStorageData() {
const str = localStorage.getItem(this.params.httpEndpoint);
if (str) {
return JSON.parse(str);
}
return null;
}
refresh(updateOnPosition) {
if (!this.params.doNotUsePagination) {
const params = 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 })
.subscribe((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.offset = this.currentPageNumber > 0 ? (this.currentPageNumber - 1) * this.pageRowCount : 0;
}
this.http
.get(this.params.httpEndpoint, { params })
.subscribe((rowData) => {
if (updateOnPosition) {
let displayedRowData = [];
this.gridOptions.api.getModel().forEachNode((row) => {
displayedRowData.push(row);
});
if (rowData.length < displayedRowData.length) {
for (let i = rowData.length; i < displayedRowData.length; i++) {
this.gridOptions.api.updateRowData({ remove: [displayedRowData[i].data] });
}
}
else if (rowData.length > displayedRowData.length) {
for (let i = displayedRowData.length; i < rowData.length; i++) {
this.gridOptions.api.updateRowData({ add: [rowData[i]] });
}
}
rowData.map((data, index) => {
let 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();
}, (err) => {
if (this.params.gridFunctions.logToConsole) {
console.log(this.formatErrorMessage(err));
}
else {
alert(this.formatErrorMessage(err));
}
});
}, (err) => {
if (this.params.gridFunctions.logToConsole) {
console.log(this.formatErrorMessage(err));
}
else {
alert(this.formatErrorMessage(err));
}
});
}
else {
const params = gridSequelizeFormatter(this.params.initialSortModel, this.params.staticFilter, this.params.httpIncludeParam);
this.http
.get(this.params.httpEndpoint, { params })
.subscribe((rowData) => {
// Count
this.totalPageCount = 1;
this.currentPageNumber = 1;
params.offset = 0;
if (updateOnPosition) {
let displayedRowData = [];
this.gridOptions.api.getModel().forEachNode((row) => {
displayedRowData.push(row);
});
if (rowData.length < displayedRowData.length) {
for (let i = rowData.length; i < displayedRowData.length; i++) {
this.gridOptions.api.updateRowData({ remove: [displayedRowData[i].data] });
}
}
else if (rowData.length > displayedRowData.length) {
for (let i = displayedRowData.length; i < rowData.length; i++) {
this.gridOptions.api.updateRowData({ add: [rowData[i]] });
}
}
rowData.map((data, index) => {
let 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();
}, (err) => {
if (this.params.gridFunctions.logToConsole) {
console.log(this.formatErrorMessage(err));
}
else {
alert(this.formatErrorMessage(err));
}
});
}
}
onButtonAdd() {
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 } });
}
onButtonEdit() {
if (!this.params.gridFunctions.canEdit || !this.params.gridFunctions.editBaseUrl) {
return this.onButtonView();
}
const 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 } });
}
onButtonCopy() {
if (!this.params.gridFunctions.canCopy || !this.params.gridFunctions.addBaseUrl) {
return this.onButtonView();
}
const selRow = this.gridOptions.api.getSelectedRows()[0];
if (!selRow) {
return;
}
this.router.navigate([`${this.params.gridFunctions.addBaseUrl}/0`], { queryParams: selRow });
}
onButtonDelete() {
if (!this.params.gridFunctions.canDelete) {
return;
}
const selRow = this.gridOptions.api.getSelectedRows()[0];
if (!selRow) {
return;
}
if (confirm('Delete?')) {
this.http
.delete(this.params.httpEndpoint + '/' + selRow[this.params.idColName || 'id'])
.subscribe((result) => {
this.refresh();
}, (err) => {
alert(this.formatErrorMessage(err));
});
}
}
onButtonBackward() {
if (this.currentPageNumber <= 1) {
return;
}
this.currentPageNumber = 1;
this.refresh();
}
onButtonForward() {
if (this.currentPageNumber >= this.totalPageCount) {
return;
}
this.currentPageNumber = this.totalPageCount;
this.refresh();
}
onButtonNext() {
if (this.currentPageNumber >= this.totalPageCount) {
return;
}
this.currentPageNumber = this.currentPageNumber + 1;
this.refresh();
}
onButtonPrevious() {
if (this.currentPageNumber <= 1) {
return;
}
this.currentPageNumber = this.currentPageNumber - 1;
this.refresh();
}
onButtonRefresh() {
this.refresh(true);
}
formatErrorMessage(error) {
console.error(error);
let 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;
}
onButtonView() {
const selRow = this.gridOptions.api.getSelectedRows()[0];
if (!selRow) {
return;
}
this.rowViewData = [];
this.gridOptions.columnDefs.forEach((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;
}
onButtonViewCancel() {
this.isRowViewMode = false;
}
onButtonViewEdit() {
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 } });
}
onButtonImportCSV($event) {
if (!this.params.gridFunctions.canImport) {
return;
}
const files = $event.srcElement.files;
const reader = new FileReader();
reader.onload = () => {
this.csvData = reader.result;
this.papa.parse(this.csvData, {
header: true,
delimiter: ';',
skipEmptyLines: true,
complete: (results) => {
this.http
.post(this.params.httpEndpoint + '/createBulk', results.data)
.subscribe((result) => {
this.fileImput.nativeElement.value = '';
this.refresh();
}, (err) => {
this.fileImput.nativeElement.value = '';
alert(this.formatErrorMessage(err));
});
}
});
};
reader.readAsText(files[0]);
}
onButtonExport() {
if (this.params.gridFunctions.exportFromServerSide) {
this.http
.get(this.params.httpEndpoint + '/export', { observe: 'response', responseType: 'arraybuffer' })
.subscribe((data) => {
const fileName = data.headers.get('Content-Filename');
downloadFile(data.body, fileName, 'application/gzip', '.zip');
}, (err) => {
alert(this.formatErrorMessage(err));
});
}
else {
const 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 })
.subscribe((rowData) => {
let csvData;
this.gridOptions.columnDefs.forEach((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 (let i = 0; i < rowData.length; i++) {
for (let j = 0; j < this.gridOptions.columnDefs.length; j++) {
const column = this.gridOptions.columnDefs[j];
if (this.params.exportFields && this.params.exportFields.indexOf(column.field) < 0) {
continue;
}
let 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');
}, (err) => {
alert(this.formatErrorMessage(err));
});
}
}
};
GridComponent.ctorParameters = () => [
{ 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);
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) {
const htmlElement = document.createElement('a');
htmlElement.setAttribute('style', 'display:none;');
document.body.appendChild(htmlElement);
const blob = new Blob([data], { type: fileType });
const url = window.URL.createObjectURL(blob);
htmlElement.href = url;
const isIE = /*@cc_on!@*/ false || !!document.documentMode;
if (isIE) {
const retVal = navigator.msSaveBlob(blob, filename + fileExtention);
}
else {
htmlElement.download = filename + fileExtention;
}
htmlElement.click();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zeC1uZy1hZ2dyaWQvIiwic291cmNlcyI6WyJzcmMvYXBwL21vZHVsZXMvZ3JpZC9ncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsS0FBSyxFQUF5QixNQUFNLGVBQWUsQ0FBQztBQUczRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLElBQUksbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJDLE1BQU0sQ0FBTixJQUFZLGNBSVg7QUFKRCxXQUFZLGNBQWM7SUFDeEIsNkNBQTJCLENBQUE7SUFDM0IsNkNBQTJCLENBQUE7SUFDM0IsaURBQStCLENBQUE7QUFDakMsQ0FBQyxFQUpXLGNBQWMsS0FBZCxjQUFjLFFBSXpCO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7QUFpQ3RELElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFzQnhCLFlBQ1UsSUFBZ0IsRUFDaEIsS0FBcUIsRUFDckIsTUFBYyxFQUNkLElBQVU7UUFIVixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxTQUFJLEdBQUosSUFBSSxDQUFNO1FBcEJwQixrQkFBYSxHQUFpQixFQUFFLENBQUM7UUFDakMsb0JBQWUsR0FBaUIsSUFBSSxDQUFDO1FBQ3JDLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FB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LEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMxQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUEwQixFQUFFLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRSxhQUFxQjtJQUN6RyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ25ELFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXZDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxXQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUV2QixNQUFNLElBQUksR0FBRyxZQUFZLENBQUEsS0FBSyxJQUFJLENBQUMsQ0FBRSxRQUFnQixDQUFDLFlBQVksQ0FBQztJQUVuRSxJQUFJLElBQUksRUFBRTtRQUNSLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsR0FBRyxhQUFhLENBQUMsQ0FBQztLQUNyRTtTQUFNO1FBQ0wsV0FBVyxDQUFDLFFBQVEsR0FBRyxRQUFRLEdBQUcsYUFBYSxDQUFDO0tBQ2pEO0lBRUQsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBJbnB1dCwgT25EZXN0cm95LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHcmlkT3B0aW9ucyB9IGZyb20gJ2FnLWdyaWQnO1xuaW1wb3J0IHsgQWdHcmlkTmcyLCBBZ0dyaWRDb2x1bW4gfSBmcm9tICdhZy1ncmlkLWFuZ3VsYXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5nd