brainloper-ui 14.0.15 → 14.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/package.json +5 -1
  2. package/esm2020/brainloper-ui.mjs +0 -5
  3. package/esm2020/public_api.mjs +0 -52
  4. package/esm2020/src/app/modules/brainloper-ui/brainloper-ui.module.mjs +0 -305
  5. package/esm2020/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.mjs +0 -29
  6. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.mjs +0 -23
  7. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.mjs +0 -83
  8. package/esm2020/src/app/modules/brainloper-ui/components/carousel/carousel.component.mjs +0 -31
  9. package/esm2020/src/app/modules/brainloper-ui/components/combos/combos.component.mjs +0 -176
  10. package/esm2020/src/app/modules/brainloper-ui/components/data-table/data-table.component.mjs +0 -691
  11. package/esm2020/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.mjs +0 -118
  12. package/esm2020/src/app/modules/brainloper-ui/components/file-input/file-input.component.mjs +0 -185
  13. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.mjs +0 -2
  14. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.mjs +0 -2
  15. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.mjs +0 -2
  16. package/esm2020/src/app/modules/brainloper-ui/components/filters/filters.component.mjs +0 -222
  17. package/esm2020/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.mjs +0 -80
  18. package/esm2020/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.mjs +0 -81
  19. package/esm2020/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.mjs +0 -108
  20. package/esm2020/src/app/modules/data/rolesAndPermissions.mjs +0 -491
  21. package/esm2020/src/app/modules/interfaces/buttons/button-icon.mjs +0 -2
  22. package/esm2020/src/app/modules/interfaces/buttons/button-lavel-edit.mjs +0 -2
  23. package/esm2020/src/app/modules/interfaces/combos/combos-configuration.mjs +0 -2
  24. package/esm2020/src/app/modules/interfaces/common/Permissions.mjs +0 -8
  25. package/esm2020/src/app/modules/interfaces/data-table/params.mjs +0 -2
  26. package/esm2020/src/app/modules/interfaces/data-table/rules.mjs +0 -2
  27. package/esm2020/src/app/modules/interfaces/data-table/table-columns.mjs +0 -2
  28. package/esm2020/src/app/modules/interfaces/data-table/table-configuration.mjs +0 -2
  29. package/esm2020/src/app/modules/interfaces/enum/enumActions.mjs +0 -7
  30. package/esm2020/src/app/modules/interfaces/enum/enumRules.mjs +0 -8
  31. package/esm2020/src/app/modules/interfaces/file-forms-service/file-forms-params.mjs +0 -2
  32. package/esm2020/src/app/modules/interfaces/file-forms-service/file-input-params.mjs +0 -2
  33. package/esm2020/src/app/modules/interfaces/filters/header-filters.mjs +0 -2
  34. package/esm2020/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.mjs +0 -8
  35. package/esm2020/src/app/modules/interfaces/report/template-pdf-ot.mjs +0 -2
  36. package/esm2020/src/app/modules/interfaces/report/template-pfd-fo.mjs +0 -2
  37. package/esm2020/src/app/modules/services/crypto.service.mjs +0 -37
  38. package/esm2020/src/app/modules/services/export-data.service.mjs +0 -78055
  39. package/esm2020/src/app/modules/services/file-forms.service.mjs +0 -24
  40. package/esm2020/src/app/modules/services/functions.service.mjs +0 -54
  41. package/esm2020/src/app/modules/services/generate-pdf.service.mjs +0 -58
  42. package/esm2020/src/app/modules/services/http.service.mjs +0 -154
  43. package/esm2020/src/app/modules/services/loading/loading.component.mjs +0 -28
  44. package/esm2020/src/app/modules/services/local-storage.service.mjs +0 -115
  45. package/esm2020/src/app/modules/services/message.service.mjs +0 -200
  46. package/esm2020/src/app/modules/services/screen-size-util.mjs +0 -6
  47. package/esm2020/src/app/modules/services/session.service.mjs +0 -42
  48. package/fesm2015/brainloper-ui.mjs +0 -81324
  49. package/fesm2015/brainloper-ui.mjs.map +0 -1
  50. package/fesm2020/brainloper-ui.mjs +0 -81285
  51. package/fesm2020/brainloper-ui.mjs.map +0 -1
  52. package/index.d.ts +0 -5
  53. package/public_api.d.ts +0 -51
  54. package/src/app/modules/brainloper-ui/brainloper-ui.module.d.ts +0 -73
  55. package/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.d.ts +0 -13
  56. package/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.d.ts +0 -10
  57. package/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.d.ts +0 -24
  58. package/src/app/modules/brainloper-ui/components/carousel/carousel.component.d.ts +0 -12
  59. package/src/app/modules/brainloper-ui/components/combos/combos.component.d.ts +0 -46
  60. package/src/app/modules/brainloper-ui/components/data-table/data-table.component.d.ts +0 -121
  61. package/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.d.ts +0 -21
  62. package/src/app/modules/brainloper-ui/components/file-input/file-input.component.d.ts +0 -42
  63. package/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.d.ts +0 -2
  64. package/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.d.ts +0 -2
  65. package/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.d.ts +0 -2
  66. package/src/app/modules/brainloper-ui/components/filters/filters.component.d.ts +0 -30
  67. package/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.d.ts +0 -35
  68. package/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.d.ts +0 -36
  69. package/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.d.ts +0 -26
  70. package/src/app/modules/data/rolesAndPermissions.d.ts +0 -2
  71. package/src/app/modules/interfaces/buttons/button-icon.d.ts +0 -9
  72. package/src/app/modules/interfaces/buttons/button-lavel-edit.d.ts +0 -6
  73. package/src/app/modules/interfaces/combos/combos-configuration.d.ts +0 -13
  74. package/src/app/modules/interfaces/common/Permissions.d.ts +0 -40
  75. package/src/app/modules/interfaces/data-table/params.d.ts +0 -7
  76. package/src/app/modules/interfaces/data-table/rules.d.ts +0 -8
  77. package/src/app/modules/interfaces/data-table/table-columns.d.ts +0 -25
  78. package/src/app/modules/interfaces/data-table/table-configuration.d.ts +0 -25
  79. package/src/app/modules/interfaces/enum/enumActions.d.ts +0 -5
  80. package/src/app/modules/interfaces/enum/enumRules.d.ts +0 -6
  81. package/src/app/modules/interfaces/file-forms-service/file-forms-params.d.ts +0 -4
  82. package/src/app/modules/interfaces/file-forms-service/file-input-params.d.ts +0 -13
  83. package/src/app/modules/interfaces/filters/header-filters.d.ts +0 -13
  84. package/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.d.ts +0 -10
  85. package/src/app/modules/interfaces/report/template-pdf-ot.d.ts +0 -19
  86. package/src/app/modules/interfaces/report/template-pfd-fo.d.ts +0 -20
  87. package/src/app/modules/services/crypto.service.d.ts +0 -10
  88. package/src/app/modules/services/export-data.service.d.ts +0 -18
  89. package/src/app/modules/services/file-forms.service.d.ts +0 -7
  90. package/src/app/modules/services/functions.service.d.ts +0 -13
  91. package/src/app/modules/services/generate-pdf.service.d.ts +0 -12
  92. package/src/app/modules/services/http.service.d.ts +0 -21
  93. package/src/app/modules/services/loading/loading.component.d.ts +0 -15
  94. package/src/app/modules/services/local-storage.service.d.ts +0 -49
  95. package/src/app/modules/services/message.service.d.ts +0 -23
  96. package/src/app/modules/services/screen-size-util.d.ts +0 -3
  97. package/src/app/modules/services/session.service.d.ts +0 -14
@@ -1,691 +0,0 @@
1
- import { modulesByRol } from './../../../data/rolesAndPermissions';
2
- import { ScreenSizeUtil } from './../../../services/screen-size-util';
3
- import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core';
4
- import { TableModalComponent } from '../../../brainloper-ui/components/data-table/table-modal/table-modal.component';
5
- import { MatPaginator } from '@angular/material/paginator';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/material/dialog";
8
- import * as i2 from "../../../services/http.service";
9
- import * as i3 from "../../../services/message.service";
10
- import * as i4 from "../../../services/functions.service";
11
- import * as i5 from "@angular/material/paginator";
12
- import * as i6 from "./../../../services/export-data.service";
13
- import * as i7 from "@angular/common";
14
- import * as i8 from "@angular/material/core";
15
- import * as i9 from "@angular/material/icon";
16
- import * as i10 from "@angular/material/menu";
17
- import * as i11 from "@angular/material/form-field";
18
- import * as i12 from "@angular/material/input";
19
- import * as i13 from "@angular/material/checkbox";
20
- import * as i14 from "@angular/material/tooltip";
21
- import * as i15 from "@angular/forms";
22
- import * as i16 from "../filters/filters.component";
23
- const spanishRangeLabel = (page, pageSize, length) => {
24
- if (length == 0 || pageSize == 0) {
25
- return `0 de ${length}`;
26
- }
27
- length = Math.max(length, 0);
28
- const startIndex = page * pageSize;
29
- const endIndex = startIndex < length
30
- ? Math.min(startIndex + pageSize, length)
31
- : startIndex + pageSize;
32
- return `${startIndex + 1} - ${endIndex} de ${length}`;
33
- };
34
- const rolesAndPermissions = modulesByRol;
35
- export class DataTableComponent {
36
- constructor(dialog, http, message, functionEter, paginatorTranslate, exportService) {
37
- this.dialog = dialog;
38
- this.http = http;
39
- this.message = message;
40
- this.functionEter = functionEter;
41
- this.paginatorTranslate = paginatorTranslate;
42
- this.exportService = exportService;
43
- this.data = [];
44
- this.configuration = {
45
- add: false,
46
- edit: false,
47
- delete: false,
48
- active: false,
49
- selectable: false,
50
- print: false,
51
- addPer: false,
52
- editPer: false,
53
- primaryKey: 'id',
54
- exportXslx: false,
55
- hideTitle: true,
56
- hideFilter: true,
57
- notInitialize: false,
58
- exportXslxByRow: false,
59
- exportXslxWithPages: false,
60
- view: false,
61
- closeOrder: false,
62
- packOff: false,
63
- advance: false,
64
- advanceLabel: null,
65
- income: false,
66
- exit: false,
67
- sendEmail: false,
68
- };
69
- this.titleLoading = '';
70
- this.messageLoading = '';
71
- this.headerFileXlsm = [];
72
- this.headerFilters = [];
73
- this.xslxParams = null;
74
- this.roleId = 0;
75
- this.moduleId = 0;
76
- this.subModuleId = 0;
77
- this.hasAccessToAll = true;
78
- this.rolesAndPermissionUser = {};
79
- this.clickRow = new EventEmitter();
80
- this.add = new EventEmitter();
81
- this.edit = new EventEmitter();
82
- this.delete = new EventEmitter();
83
- this.print = new EventEmitter();
84
- this.exportXslxByRow = new EventEmitter();
85
- this.active = new EventEmitter();
86
- this.selected = new EventEmitter();
87
- this.view = new EventEmitter();
88
- this.closeOrder = new EventEmitter();
89
- this.packOff = new EventEmitter();
90
- this.advance = new EventEmitter();
91
- this.income = new EventEmitter();
92
- this.exit = new EventEmitter();
93
- this.internalData = new EventEmitter();
94
- this.sendEmail = new EventEmitter();
95
- this.movil = ScreenSizeUtil.isMobile();
96
- this.filtersPost = [];
97
- this.selectedRows = []; /** almacena las filas seleccionadas */
98
- this.checkboxs = {};
99
- this.selectAll = false;
100
- this.indeterminateState = false;
101
- this.originalData = [];
102
- this.paginatorActive = true;
103
- this.screen = true;
104
- this.pageSizeOptions = [5, 10, 25, 50, 100];
105
- this.pageSize = screen.width > 500 ? 10 : 5;
106
- this.length = 0;
107
- this.page = 0;
108
- this.above = ['above'];
109
- this.buttonsConfig = [];
110
- this.paginatorTranslate.itemsPerPageLabel = 'Elementos por página';
111
- this.paginatorTranslate.nextPageLabel = 'Siguiente página';
112
- this.paginatorTranslate.lastPageLabel = 'Última página';
113
- this.paginatorTranslate.previousPageLabel = 'Página anterior';
114
- this.paginatorTranslate.firstPageLabel = 'Primera página';
115
- this.paginatorTranslate.getRangeLabel = spanishRangeLabel;
116
- }
117
- async ngOnInit() {
118
- this.validateRolAndPermission();
119
- if (window.screen.width > 1000) {
120
- this.screen = true;
121
- window.addEventListener('resize', () => {
122
- window.screen.width > 1000
123
- ? (this.screen = true)
124
- : (this.screen = false);
125
- });
126
- }
127
- else {
128
- this.screen = false;
129
- window.addEventListener('resize', () => {
130
- window.screen.width > 1000
131
- ? (this.screen = true)
132
- : (this.screen = false);
133
- });
134
- }
135
- if (this.reloadTable) {
136
- this.reloadTable.subscribe((res) => {
137
- this.originalData = [];
138
- this.selectAll = false;
139
- this.seletecAllEvent('');
140
- });
141
- }
142
- this.titleLoading == '' ? (this.titleLoading = 'Cargando') : '';
143
- this.messageLoading == ''
144
- ? (this.messageLoading = 'Obteniendo datos...')
145
- : '';
146
- this.url && !this.configuration.notInitialize
147
- ? this.message.openLoading(this.titleLoading, this.messageLoading)
148
- : '';
149
- try {
150
- if (this.url && !this.configuration.notInitialize) {
151
- let service = await this.getDateTableByUrl();
152
- this.data = service['data'];
153
- this.length = service['count'];
154
- this.data.forEach((row) => {
155
- this.checkboxs[row[this.configuration.primaryKey]] = false;
156
- });
157
- this.internalData.emit(service);
158
- setTimeout(() => {
159
- this.message.closeLoading();
160
- }, 1000);
161
- this.validateRules();
162
- }
163
- else if (!this.url) {
164
- this.paginatorActive = false;
165
- }
166
- }
167
- catch (error) {
168
- console.log(error);
169
- }
170
- }
171
- validateRolAndPermission() {
172
- if (this.roleId == 0) {
173
- let rolePermissions = rolesAndPermissions?.find(x => x.id == this.roleId);
174
- this.hasAccessToAll = rolePermissions?.hasAccessToAll ?? rolePermissions.modules?.find(x => x.id == this.moduleId)?.hasAccessToAll ?? false;
175
- }
176
- ;
177
- this.rolesAndPermissionUser = rolesAndPermissions?.find(x => x.id == this.roleId)?.modules?.find(x => x.id == this.moduleId)?.subModules?.find(x => x.id == this.subModuleId)?.permissions ?? {};
178
- if (!this.hasAccessToAll && !this.rolesAndPermissionUser.readAll && this.rolesAndPermissionUser.readOwn == true) {
179
- this.params = [...this.params, { id: 'readOwn', value: true }];
180
- }
181
- this.configureButtons();
182
- }
183
- configureButtons() {
184
- this.buttonsConfig = [
185
- {
186
- action: 'edit',
187
- conditionShowHeader: () => this.selectedRows.length === 1 &&
188
- this.configuration.edit &&
189
- this.hasPermission('update'),
190
- condition: () => this.configuration.edit && this.hasPermission('update'),
191
- icon: 'fa-edit',
192
- tooltip: 'Editar',
193
- },
194
- {
195
- action: 'print',
196
- conditionShowHeader: () => this.selectedRows.length === 1 &&
197
- this.configuration.print &&
198
- this.screen &&
199
- this.hasPermission('print'),
200
- condition: () => this.configuration.print && this.screen && this.hasPermission('print'),
201
- icon: 'fa-print',
202
- tooltip: 'Imprimir',
203
- },
204
- {
205
- action: 'active',
206
- conditionShowHeader: () => this.selectedRows.length > 0 && this.configuration.active && this.hasPermission('activateAndInactivate'),
207
- condition: () => this.configuration.active && this.hasPermission('activateAndInactivate'),
208
- icon: 'fa-adjust',
209
- tooltip: 'Activar/Desactivar',
210
- },
211
- {
212
- action: 'add',
213
- conditionShowHeader: () => this.selectedRows.length === 0 && this.configuration.add && this.hasPermission('write'),
214
- condition: () => false,
215
- icon: 'fa-plus-circle',
216
- tooltip: 'Nuevo',
217
- },
218
- {
219
- action: 'income',
220
- conditionShowHeader: () => this.selectedRows.length === 0 && this.configuration.income && this.hasPermission('write'),
221
- condition: () => false,
222
- icon: 'fa-user-plus',
223
- tooltip: 'Ingreso',
224
- },
225
- {
226
- action: 'exit',
227
- conditionShowHeader: () => this.selectedRows.length === 0 && this.configuration.exit && this.hasPermission('write'),
228
- condition: () => false,
229
- icon: 'fa-user-times',
230
- tooltip: 'Salida',
231
- },
232
- {
233
- action: 'view',
234
- conditionShowHeader: () => this.selectedRows.length === 1 && this.configuration.view && this.hasPermission('readDetail'),
235
- condition: () => this.configuration.view && this.hasPermission('readDetail'),
236
- icon: 'fa-eye',
237
- tooltip: 'Ver detalle',
238
- },
239
- {
240
- action: 'closeOrder',
241
- conditionShowHeader: () => (this.selectedRows.length === 1 && this.configuration.closeOrder) && this.hasPermission('closeOT'),
242
- condition: () => this.configuration.closeOrder && this.hasPermission('closeOT'),
243
- icon: 'fa-check-circle',
244
- tooltip: 'Cerrar orden',
245
- },
246
- {
247
- action: 'packOff',
248
- conditionShowHeader: () => this.selectedRows.length === 1 && this.configuration.packOff && this.hasPermission('allocateResources'),
249
- condition: () => this.configuration.packOff && this.hasPermission('allocateResources'),
250
- icon: 'fa-cart-arrow-down',
251
- tooltip: 'Despachar recursos',
252
- },
253
- {
254
- action: 'advance',
255
- conditionShowHeader: () => this.selectedRows.length === 1 && this.configuration.advance && this.hasPermission('advance'),
256
- condition: () => this.configuration.advance && this.hasPermission('advance'),
257
- icon: 'fa-arrow-right',
258
- tooltip: this.configuration.advanceLabel,
259
- },
260
- {
261
- action: 'sendEmail',
262
- conditionShowHeader: () => this.selectedRows.length === 1 &&
263
- this.configuration.sendEmail &&
264
- this.screen &&
265
- this.hasPermission('sendEmail'),
266
- condition: () => this.configuration.sendEmail && this.screen && this.hasPermission('sendEmail'),
267
- icon: 'fa-mail-bulk',
268
- tooltip: 'Envia correo',
269
- },
270
- {
271
- action: 'exportToExcel',
272
- conditionShowHeader: () => this.selectedRows.length === 0 &&
273
- this.data.length > 0 &&
274
- (this.configuration.exportXslx || this.configuration.exportXslxWithPages) &&
275
- this.hasPermission('export'),
276
- condition: () => false,
277
- icon: 'fa-download',
278
- tooltip: 'Exportar Tabla',
279
- },
280
- {
281
- action: 'exportToExcelByRow',
282
- conditionShowHeader: () => this.selectedRows.length === 1 && this.configuration.exportXslxByRow && this.hasPermission('export'),
283
- condition: () => this.configuration.exportXslxByRow && this.hasPermission('export'),
284
- icon: 'fa-download',
285
- tooltip: 'Exportar Registro',
286
- },
287
- {
288
- action: 'delete',
289
- conditionShowHeader: () => this.selectedRows.length > 0 && this.configuration.delete && this.hasPermission('delete'),
290
- condition: () => this.configuration.delete && this.hasPermission('delete'),
291
- icon: 'fa-trash',
292
- tooltip: 'Eliminar',
293
- },
294
- ];
295
- }
296
- hasPermission(permission) {
297
- if (this.hasAccessToAll)
298
- return true;
299
- return this.rolesAndPermissionUser?.[permission] ?? false;
300
- }
301
- async getDateTableByUrl() {
302
- this.validarParams();
303
- return await this.http.postDataBody(this.url, this.filtersPost, this.params);
304
- }
305
- validarParams() {
306
- this.params = this.functionEter.removeDuplicateObjects(this.params);
307
- if (this.params) {
308
- if (!this.params.find((x) => x.id == 'page')) {
309
- this.params.push({ id: 'page', value: '0' });
310
- }
311
- if (!this.params.find((x) => x.id == 'per_page')) {
312
- this.params.push({ id: 'per_page', value: this.pageSize });
313
- }
314
- if (!this.params.find((x) => x.id == 'filter')) {
315
- this.params.push({ id: 'filter', value: '' });
316
- }
317
- }
318
- }
319
- async validateRules() {
320
- for (const [index, columns] of this.columns.entries()) {
321
- for (const [indexData, element] of this.data.entries()) {
322
- if (columns.rules) {
323
- for (const rule of columns.rules) {
324
- if (rule.rule == enumRules['==']) {
325
- if (element[columns.ID] &&
326
- element[columns.ID].toString() == rule.valueRule.toString()) {
327
- this.data[indexData][columns.ID] = rule.valueAction;
328
- }
329
- }
330
- }
331
- }
332
- const columnValue = element[columns.ID];
333
- if (columns.type == 'fecha' || columns.type == 'date')
334
- this.data[indexData][columns.ID] =
335
- this.functionEter.dateIso(columnValue);
336
- if (columns.type == 'dateWithTime')
337
- this.data[indexData][columns.ID] = this.functionEter.dateWithTime(columnValue?.toString() ?? columnValue);
338
- if (columns.type == 'currency')
339
- this.data[indexData][columns.ID] =
340
- Intl.NumberFormat('es-CO').format(columnValue);
341
- if (columns.type == 'boolean')
342
- this.data[indexData][columns.ID] = columnValue == 1 ? 'Si' : 'No';
343
- }
344
- }
345
- }
346
- ngOnChanges(changes) {
347
- if (changes.data) {
348
- if (this.data) {
349
- this.data.forEach((row) => {
350
- this.checkboxs[row[this.configuration.primaryKey]] = false;
351
- });
352
- if (this.originalData.length == 0) {
353
- if (this.data.length != 0) {
354
- this.data.forEach((element) => {
355
- this.originalData.push(element);
356
- });
357
- }
358
- }
359
- }
360
- this.validateRules();
361
- }
362
- if (changes.configuration) {
363
- this.updateButtonConfig();
364
- }
365
- }
366
- updateButtonConfig() {
367
- this.buttonsConfig = this.buttonsConfig.map((button) => {
368
- if (button.action === 'advance') {
369
- return {
370
- ...button,
371
- tooltip: this.configuration.advanceLabel ?? 'Avanzar',
372
- };
373
- }
374
- return button;
375
- });
376
- }
377
- clickOnRoW(rowData) {
378
- let state = this.checkboxs[rowData[this.configuration.primaryKey]];
379
- if (!this.configuration.selectable) {
380
- this.clearCheckboxes();
381
- }
382
- this.selection(rowData, { checked: !state }, this.configuration.selectable);
383
- this.clickRow.emit(rowData);
384
- }
385
- showMenu($event) {
386
- $event.stopPropagation();
387
- }
388
- action(action, row = null) {
389
- var currentRow = row ? [row] : this.selectedRows;
390
- switch (action) {
391
- case 'add':
392
- if (this.configuration.addPer) {
393
- this.add.emit(this.length);
394
- }
395
- else {
396
- this.dialog
397
- .open(TableModalComponent, {
398
- data: {
399
- action,
400
- columns: JSON.parse(JSON.stringify(this.columns)),
401
- },
402
- width: '60vh',
403
- })
404
- .afterClosed()
405
- .subscribe((result) => {
406
- if (result) {
407
- this.add.emit(result);
408
- }
409
- });
410
- }
411
- break;
412
- case 'edit':
413
- if (this.configuration.editPer) {
414
- this.edit.emit(currentRow);
415
- }
416
- else {
417
- let columns;
418
- columns = this.columns;
419
- columns.forEach((column, index) => {
420
- Object.keys(currentRow[0]).forEach((key) => {
421
- if (column.ID == key) {
422
- columns[index].value = currentRow[0][key];
423
- }
424
- });
425
- });
426
- this.dialog
427
- .open(TableModalComponent, {
428
- data: {
429
- action,
430
- columns: JSON.parse(JSON.stringify(this.columns)),
431
- values: currentRow[0],
432
- },
433
- width: '60vh',
434
- })
435
- .afterClosed()
436
- .subscribe((result) => {
437
- if (result) {
438
- this.edit.emit({ new: result, old: currentRow[0] });
439
- }
440
- });
441
- }
442
- break;
443
- case 'delete':
444
- this.delete.emit(currentRow);
445
- break;
446
- case 'print':
447
- this.print.emit(currentRow);
448
- break;
449
- case 'active':
450
- this.active.emit(currentRow);
451
- break;
452
- case 'exportToExcel':
453
- this.exportToExcel();
454
- break;
455
- case 'exportToExcelByRow':
456
- this.exportXslxByRow.emit(currentRow);
457
- break;
458
- case 'view':
459
- this.view.emit(currentRow);
460
- break;
461
- case 'closeOrder':
462
- this.closeOrder.emit(currentRow);
463
- break;
464
- case 'packOff':
465
- this.packOff.emit(currentRow);
466
- break;
467
- case 'advance':
468
- this.advance.emit(currentRow);
469
- break;
470
- case 'income':
471
- this.income.emit(this.length);
472
- break;
473
- case 'exit':
474
- this.exit.emit(this.length);
475
- break;
476
- case 'sendEmail':
477
- this.sendEmail.emit(currentRow);
478
- break;
479
- }
480
- }
481
- shouldShowMenu() {
482
- return this.buttonsConfig.some((btn) => btn.condition());
483
- }
484
- exportToExcel() {
485
- let params = [];
486
- if (this.url && this.params) {
487
- params = [...this.params];
488
- if (this.xslxParams) {
489
- params = [...params, ...this.xslxParams];
490
- }
491
- let i = params.findIndex((x) => x.id == 'per_page');
492
- if (i != -1)
493
- params[i].value = 100000000;
494
- }
495
- if (this.configuration.exportXslxWithPages) {
496
- this.exportService.generateExcelWithSheets(this.title, this.headerFileXlsm, this.title, this.url ? null : this.data, this.url, params, this.filtersPost, this.xslxTitleFields, this.xslxSheetNameFields, this.xslxBodyFields);
497
- }
498
- else {
499
- this.exportService.generateToXlsx(this.title, this.headerFileXlsm, this.title, this.url ? null : this.data, this.url, params, this.filtersPost);
500
- }
501
- }
502
- selection(row, $event, emitEvent = true) {
503
- this.checkboxs[row[this.configuration.primaryKey]] = $event.checked;
504
- if ($event.checked) {
505
- this.selectedRows.push(row);
506
- }
507
- else {
508
- let index = this.selectedRows.indexOf(row);
509
- this.selectedRows.splice(index, 1);
510
- }
511
- if (this.configuration.selectable && emitEvent) {
512
- this.selected.emit(this.selectedRows);
513
- }
514
- if (this.selectedRows.length == this.data.length) {
515
- this.selectAll = true;
516
- }
517
- else {
518
- this.selectAll = false;
519
- }
520
- if (this.selectedRows.length > 0 &&
521
- this.selectedRows.length < this.data.length) {
522
- this.indeterminateState = true;
523
- }
524
- else {
525
- this.indeterminateState = false;
526
- }
527
- }
528
- clicked($event) {
529
- event.stopPropagation();
530
- }
531
- async seletecAllEvent($event) {
532
- this.indeterminateState = false;
533
- if (this.selectAll) {
534
- Object.keys(this.checkboxs).forEach((key) => {
535
- this.checkboxs[key] = true;
536
- });
537
- this.selectedRows = [];
538
- let data = this.data;
539
- data.forEach((element) => {
540
- this.selectedRows.push(element);
541
- });
542
- this.selected.emit(this.selectedRows);
543
- }
544
- else {
545
- this.clearCheckboxes();
546
- this.selected.emit(this.selectedRows);
547
- }
548
- let service = await this.getDateTableByUrl();
549
- this.data = service['data'];
550
- this.internalData.emit(service);
551
- this.length = service['count'];
552
- this.validateRules();
553
- }
554
- clearCheckboxes() {
555
- Object.keys(this.checkboxs).forEach((key) => {
556
- this.checkboxs[key] = false;
557
- });
558
- this.selectedRows = [];
559
- }
560
- changeFilters() {
561
- if (this.params)
562
- this.params.forEach((element) => {
563
- if (element.id == 'filter') {
564
- element.value = this.filters;
565
- }
566
- });
567
- this.applyFilters();
568
- }
569
- async applyFilters($event) {
570
- if ($event)
571
- this.filtersPost = $event;
572
- if (this.url) {
573
- let res = await this.getDateTableByUrl();
574
- this.data = res['data'];
575
- this.validateRules();
576
- this.length = res['count'];
577
- this.internalData.emit(res);
578
- }
579
- else {
580
- this.data = this.originalData.filter((data) => {
581
- for (let key of Object.keys(data)) {
582
- let result = data[key]
583
- .toString()
584
- .toLowerCase()
585
- .includes(this.filters.toLowerCase());
586
- if (result) {
587
- return data;
588
- }
589
- }
590
- });
591
- }
592
- }
593
- changePage($event) {
594
- this.params.forEach((element, index) => {
595
- if (element.id == 'per_page') {
596
- element.value = $event.pageSize;
597
- }
598
- if (element.id == 'page') {
599
- element.value = $event.pageIndex;
600
- }
601
- });
602
- this.applyFilters();
603
- }
604
- }
605
- DataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DataTableComponent, deps: [{ token: i1.MatDialog }, { token: i2.HttpService }, { token: i3.MessageService }, { token: i4.FunctionsService }, { token: i5.MatPaginatorIntl }, { token: i6.ExportDataService }], target: i0.ɵɵFactoryTarget.Component });
606
- DataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DataTableComponent, selector: "data-table", inputs: { title: "title", columns: "columns", data: "data", combo: "combo", configuration: "configuration", reloadTable: "reloadTable", url: "url", params: "params", titleLoading: "titleLoading", messageLoading: "messageLoading", headerFileXlsm: "headerFileXlsm", headerFilters: "headerFilters", xslxTitleFields: "xslxTitleFields", xslxSheetNameFields: "xslxSheetNameFields", xslxBodyFields: "xslxBodyFields", xslxParams: "xslxParams", roleId: "roleId", moduleId: "moduleId", subModuleId: "subModuleId" }, outputs: { clickRow: "clickRow", add: "add", edit: "edit", delete: "delete", print: "print", exportXslxByRow: "exportXslxByRow", active: "active", selected: "selected", view: "view", closeOrder: "closeOrder", packOff: "packOff", advance: "advance", income: "income", exit: "exit", internalData: "internalData", sendEmail: "sendEmail" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"contenedor-tabla\">\r\n <app-filters [headerFilters]=\"headerFilters\" (applyFilters)=\"applyFilters($event)\">\r\n </app-filters>\r\n\r\n <div style='display: flex; flex-direction: row; justify-content: space-between; align-items: center;'>\r\n <div style='flex:1; font-size: 1rem;'>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length>0 && selectedRows.length<2 && configuration.selectable'> {{selectedRows.length}} Seleccionado </p></strong>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length>1'> {{selectedRows.length}} Seleccionados </p></strong>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length<1 && !configuration.hideTitle'> {{title}} </p></strong>\r\n </div>\r\n\r\n <div *ngIf=\"!configuration.hideFilter\" style='flex:3; padding-right: 10px; margin-bottom: 5px;'>\r\n <mat-form-field class='filter'>\r\n <input type=\"text\" [(ngModel)]='filters' (keyup)='changeFilters()' matInput placeholder=\"Filtrar\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <ng-container *ngTemplateOutlet=\"buttonsTable\"></ng-container>\r\n\r\n </div>\r\n\r\n <table class=\"table_Eter table-hover\">\r\n <thead class=\"dark\">\r\n <tr >\r\n <th *ngIf='configuration.selectable' style='justify-content: center;'>\r\n <mat-checkbox color='primary' (change)='seletecAllEvent($event)' [(ngModel)]='selectAll' [indeterminate]='indeterminateState'> </mat-checkbox> </th>\r\n <th\r\n [class]=\"column.style?.movil\"\r\n *ngFor='let column of columns' scope=\"col\"\r\n [ngStyle]=\"column.style\"\r\n >{{column.label}}</th>\r\n <th *ngIf=\"shouldShowMenu()\"></th>\r\n </tr>\r\n </thead>\r\n <tbody class='mat-elevation-z3'>\r\n\r\n <tr style=\"cursor: pointer;\" *ngFor='let row of data' (click)='clickOnRoW(row)' [class]=\"checkboxs[row[configuration.primaryKey]]?'selected-row':''\">\r\n <th *ngIf='configuration.selectable' style='justify-content: center;'> <mat-checkbox color='primary' [(ngModel)]='checkboxs[row[configuration.primaryKey]]' (click)='clicked($event)' (change)='selection(row, $event)'> </mat-checkbox> </th>\r\n <th [class]='column.style?.movil' [ngStyle]='column.style' scope=\"row\" *ngFor='let column of columns'>{{ row[column.ID] }}</th>\r\n\r\n <th *ngIf=\"shouldShowMenu()\" style=\"display: flex; justify-content: center; align-items: center; overflow: visible;\">\r\n <mat-icon\r\n (click)=\"showMenu($event)\"\r\n [matMenuTriggerFor]=\"menu\"\r\n matRipple\r\n class=\"menu_more_vert\"\r\n aria-hidden=\"false\"\r\n aria-label=\"Example delete icon\"\r\n >more_vert</mat-icon>\r\n\r\n <mat-menu #menu=\"matMenu\">\r\n <div *ngFor=\"let btn of buttonsConfig\" >\r\n <button *ngIf=\"btn.condition()\" (click)=\"action(btn.action, row)\" mat-menu-item class=\"d-flex align-items-center w-100\" >\r\n <i class=\"fa {{btn.icon}} btn-accion\" style=\"font-size:120%; margin-right: 10px\"></i>\r\n {{btn.tooltip}}\r\n </button>\r\n </div>\r\n\r\n </mat-menu>\r\n </th>\r\n\r\n </tr>\r\n\r\n\r\n </tbody>\r\n\r\n </table>\r\n\r\n <div *ngIf='length == 0 && data.length == 0' style=\"margin-left: 10px;\"> <strong>No se encontr\u00F3 informaci\u00F3n</strong></div>\r\n\r\n <mat-paginator *ngIf=\"paginatorActive\"\r\n [length]=\"length\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons\r\n (page)=\"changePage($event)\"></mat-paginator>\r\n\r\n </div>\r\n\r\n<ng-template #buttonsTable let-fontSize=\"fontSize\" let-marginRight=\"marginRight\" style='flex:0.5; display:flex; flex-direction: row; justify-content: flex-end;'>\r\n <ng-container *ngFor=\"let btn of buttonsConfig\">\r\n <div *ngIf=\"btn.conditionShowHeader()\" (click)=\"action(btn.action)\" matTooltip=\"{{btn.tooltip}}\" matTooltipPosition=\"above\">\r\n <i class=\"fa {{btn.icon}} btn-accion\" [ngStyle]=\"{'font-size': fontSize ? fontSize : '170%', 'margin-right': marginRight ? marginRight : '15px'}\"></i>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".contenedor-tabla{width:100%;overflow-x:auto}.table_Eter{width:100%;margin-bottom:4px;color:primary;border-collapse:collapse}.table_Eter .dark th{color:#fff;background-color:#343a40;border-color:#454d55;text-align:center;vertical-align:middle}.table_Eter thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table_Eter th,.table_Eter td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}th{text-align:inherit}*,*:before,*:after{box-sizing:border-box}.btn-accion{cursor:pointer}mat-form-field{padding:0!important;width:100%}.filter{padding:0;margin-bottom:10px;width:100%}.filter ::ng-deep .mat-form-field-underline{bottom:3px!important}.filter ::ng-deep .mat-form-field-infix{border:0!important}.filter ::ng-deep .mat-form-field-wrapper{padding:0}.filter ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-wrapper{padding:0}.selected-row{color:#212529;background-color:#00000013}button:focus{outline:none!important}@media only screen and (max-width: 600px){.no-movil{display:none}}::ng-deep .mat-paginator{background:transparent!important}@media screen and (max-width: 400px){.filter{padding:0;margin-bottom:40px;width:70%}}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i8.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i5.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i15.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i16.FiltersComponent, selector: "app-filters", inputs: ["headerFilters"], outputs: ["applyFilters"] }] });
607
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DataTableComponent, decorators: [{
608
- type: Component,
609
- args: [{ selector: 'data-table', template: "<div class=\"contenedor-tabla\">\r\n <app-filters [headerFilters]=\"headerFilters\" (applyFilters)=\"applyFilters($event)\">\r\n </app-filters>\r\n\r\n <div style='display: flex; flex-direction: row; justify-content: space-between; align-items: center;'>\r\n <div style='flex:1; font-size: 1rem;'>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length>0 && selectedRows.length<2 && configuration.selectable'> {{selectedRows.length}} Seleccionado </p></strong>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length>1'> {{selectedRows.length}} Seleccionados </p></strong>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length<1 && !configuration.hideTitle'> {{title}} </p></strong>\r\n </div>\r\n\r\n <div *ngIf=\"!configuration.hideFilter\" style='flex:3; padding-right: 10px; margin-bottom: 5px;'>\r\n <mat-form-field class='filter'>\r\n <input type=\"text\" [(ngModel)]='filters' (keyup)='changeFilters()' matInput placeholder=\"Filtrar\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <ng-container *ngTemplateOutlet=\"buttonsTable\"></ng-container>\r\n\r\n </div>\r\n\r\n <table class=\"table_Eter table-hover\">\r\n <thead class=\"dark\">\r\n <tr >\r\n <th *ngIf='configuration.selectable' style='justify-content: center;'>\r\n <mat-checkbox color='primary' (change)='seletecAllEvent($event)' [(ngModel)]='selectAll' [indeterminate]='indeterminateState'> </mat-checkbox> </th>\r\n <th\r\n [class]=\"column.style?.movil\"\r\n *ngFor='let column of columns' scope=\"col\"\r\n [ngStyle]=\"column.style\"\r\n >{{column.label}}</th>\r\n <th *ngIf=\"shouldShowMenu()\"></th>\r\n </tr>\r\n </thead>\r\n <tbody class='mat-elevation-z3'>\r\n\r\n <tr style=\"cursor: pointer;\" *ngFor='let row of data' (click)='clickOnRoW(row)' [class]=\"checkboxs[row[configuration.primaryKey]]?'selected-row':''\">\r\n <th *ngIf='configuration.selectable' style='justify-content: center;'> <mat-checkbox color='primary' [(ngModel)]='checkboxs[row[configuration.primaryKey]]' (click)='clicked($event)' (change)='selection(row, $event)'> </mat-checkbox> </th>\r\n <th [class]='column.style?.movil' [ngStyle]='column.style' scope=\"row\" *ngFor='let column of columns'>{{ row[column.ID] }}</th>\r\n\r\n <th *ngIf=\"shouldShowMenu()\" style=\"display: flex; justify-content: center; align-items: center; overflow: visible;\">\r\n <mat-icon\r\n (click)=\"showMenu($event)\"\r\n [matMenuTriggerFor]=\"menu\"\r\n matRipple\r\n class=\"menu_more_vert\"\r\n aria-hidden=\"false\"\r\n aria-label=\"Example delete icon\"\r\n >more_vert</mat-icon>\r\n\r\n <mat-menu #menu=\"matMenu\">\r\n <div *ngFor=\"let btn of buttonsConfig\" >\r\n <button *ngIf=\"btn.condition()\" (click)=\"action(btn.action, row)\" mat-menu-item class=\"d-flex align-items-center w-100\" >\r\n <i class=\"fa {{btn.icon}} btn-accion\" style=\"font-size:120%; margin-right: 10px\"></i>\r\n {{btn.tooltip}}\r\n </button>\r\n </div>\r\n\r\n </mat-menu>\r\n </th>\r\n\r\n </tr>\r\n\r\n\r\n </tbody>\r\n\r\n </table>\r\n\r\n <div *ngIf='length == 0 && data.length == 0' style=\"margin-left: 10px;\"> <strong>No se encontr\u00F3 informaci\u00F3n</strong></div>\r\n\r\n <mat-paginator *ngIf=\"paginatorActive\"\r\n [length]=\"length\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons\r\n (page)=\"changePage($event)\"></mat-paginator>\r\n\r\n </div>\r\n\r\n<ng-template #buttonsTable let-fontSize=\"fontSize\" let-marginRight=\"marginRight\" style='flex:0.5; display:flex; flex-direction: row; justify-content: flex-end;'>\r\n <ng-container *ngFor=\"let btn of buttonsConfig\">\r\n <div *ngIf=\"btn.conditionShowHeader()\" (click)=\"action(btn.action)\" matTooltip=\"{{btn.tooltip}}\" matTooltipPosition=\"above\">\r\n <i class=\"fa {{btn.icon}} btn-accion\" [ngStyle]=\"{'font-size': fontSize ? fontSize : '170%', 'margin-right': marginRight ? marginRight : '15px'}\"></i>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".contenedor-tabla{width:100%;overflow-x:auto}.table_Eter{width:100%;margin-bottom:4px;color:primary;border-collapse:collapse}.table_Eter .dark th{color:#fff;background-color:#343a40;border-color:#454d55;text-align:center;vertical-align:middle}.table_Eter thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table_Eter th,.table_Eter td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}th{text-align:inherit}*,*:before,*:after{box-sizing:border-box}.btn-accion{cursor:pointer}mat-form-field{padding:0!important;width:100%}.filter{padding:0;margin-bottom:10px;width:100%}.filter ::ng-deep .mat-form-field-underline{bottom:3px!important}.filter ::ng-deep .mat-form-field-infix{border:0!important}.filter ::ng-deep .mat-form-field-wrapper{padding:0}.filter ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-wrapper{padding:0}.selected-row{color:#212529;background-color:#00000013}button:focus{outline:none!important}@media only screen and (max-width: 600px){.no-movil{display:none}}::ng-deep .mat-paginator{background:transparent!important}@media screen and (max-width: 400px){.filter{padding:0;margin-bottom:40px;width:70%}}\n"] }]
610
- }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.HttpService }, { type: i3.MessageService }, { type: i4.FunctionsService }, { type: i5.MatPaginatorIntl }, { type: i6.ExportDataService }]; }, propDecorators: { title: [{
611
- type: Input
612
- }], columns: [{
613
- type: Input
614
- }], data: [{
615
- type: Input
616
- }], combo: [{
617
- type: Input
618
- }], configuration: [{
619
- type: Input
620
- }], reloadTable: [{
621
- type: Input
622
- }], url: [{
623
- type: Input
624
- }], params: [{
625
- type: Input
626
- }], titleLoading: [{
627
- type: Input
628
- }], messageLoading: [{
629
- type: Input
630
- }], headerFileXlsm: [{
631
- type: Input
632
- }], headerFilters: [{
633
- type: Input
634
- }], xslxTitleFields: [{
635
- type: Input
636
- }], xslxSheetNameFields: [{
637
- type: Input
638
- }], xslxBodyFields: [{
639
- type: Input
640
- }], xslxParams: [{
641
- type: Input
642
- }], roleId: [{
643
- type: Input
644
- }], moduleId: [{
645
- type: Input
646
- }], subModuleId: [{
647
- type: Input
648
- }], clickRow: [{
649
- type: Output
650
- }], add: [{
651
- type: Output
652
- }], edit: [{
653
- type: Output
654
- }], delete: [{
655
- type: Output
656
- }], print: [{
657
- type: Output
658
- }], exportXslxByRow: [{
659
- type: Output
660
- }], active: [{
661
- type: Output
662
- }], selected: [{
663
- type: Output
664
- }], view: [{
665
- type: Output
666
- }], closeOrder: [{
667
- type: Output
668
- }], packOff: [{
669
- type: Output
670
- }], advance: [{
671
- type: Output
672
- }], income: [{
673
- type: Output
674
- }], exit: [{
675
- type: Output
676
- }], internalData: [{
677
- type: Output
678
- }], sendEmail: [{
679
- type: Output
680
- }], paginator: [{
681
- type: ViewChild,
682
- args: [MatPaginator, { static: true }]
683
- }] } });
684
- var enumRules;
685
- (function (enumRules) {
686
- enumRules[enumRules[">"] = 0] = ">";
687
- enumRules[enumRules["<"] = 1] = "<";
688
- enumRules[enumRules["=="] = 2] = "==";
689
- enumRules[enumRules["!="] = 3] = "!=";
690
- })(enumRules || (enumRules = {}));
691
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXRFLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdGQUFnRixDQUFDO0FBRXJILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUTNELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsRUFBRTtJQUMzRSxJQUFJLE1BQU0sSUFBSSxDQUFDLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRTtRQUNoQyxPQUFPLFFBQVEsTUFBTSxFQUFFLENBQUM7S0FDekI7SUFFRCxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFN0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUVuQyxNQUFNLFFBQVEsR0FDWixVQUFVLEdBQUcsTUFBTTtRQUNqQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxV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QTtJQUNILHFDQUFJLENBQUE7SUFDSixxQ0FBSSxDQUFBO0FBQ04sQ0FBQyxFQUxJLFNBQVMsS0FBVCxTQUFTLFFBS2IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtb2R1bGVzQnlSb2wgfSBmcm9tICcuLy4uLy4uLy4uL2RhdGEvcm9sZXNBbmRQZXJtaXNzaW9ucyc7XHJcbmltcG9ydCB7IFNjcmVlblNpemVVdGlsIH0gZnJvbSAnLi8uLi8uLi8uLi9zZXJ2aWNlcy9zY3JlZW4tc2l6ZS11dGlsJztcclxuaW1wb3J0IHsgRXhwb3J0RGF0YVNlcnZpY2UgfSBmcm9tICcuLy4uLy4uLy4uL3NlcnZpY2VzL2V4cG9ydC1kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IFRhYmxlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9icmFpbmxvcGVyLXVpL2NvbXBvbmVudHMvZGF0YS10YWJsZS90YWJsZS1tb2RhbC90YWJsZS1tb2RhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBIdHRwU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2h0dHAuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWVzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRnVuY3Rpb25zU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Z1bmN0aW9ucy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9ySW50bCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBJUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2R1bGVzL2ludGVyZmFjZXMvY29tbW9uL1Blcm1pc3Npb25zJztcclxuXHJcblxyXG5jb25zdCBzcGFuaXNoUmFuZ2VMYWJlbCA9IChwYWdlOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKSA9PiB7XHJcbiAgaWYgKGxlbmd0aCA9PSAwIHx8IHBhZ2VTaXplID09IDApIHtcclxuICAgIHJldHVybiBgMCBkZSAke2xlbmd0aH1gO1xyXG4gIH1cclxuXHJcbiAgbGVuZ3RoID0gTWF0aC5tYXgobGVuZ3RoLCAwKTtcclxuXHJcbiAgY29uc3Qgc3RhcnRJbmRleCA9IHBhZ2UgKiBwYWdlU2l6ZTtcclxuXHJcbiAgY29uc3QgZW5kSW5kZXggPVxyXG4gICAgc3RhcnRJbmRleCA8IGxlbmd0aFxyXG4gICAgICA/IE1hdGgubWluKHN0YXJ0SW5kZXggKyBwYWdlU2l6ZSwgbGVuZ3RoKVxyXG4gICAgICA6IHN0YXJ0SW5kZXggKyBwYWdlU2l6ZTtcclxuXHJcbiAgcmV0dXJuIGAke3N0YXJ0SW5kZXggKyAxfSAtICR7ZW5kSW5kZXh9IGRlICR7bGVuZ3RofWA7XHJcbn07XHJcblxyXG5jb25zdCByb2xlc0FuZFBlcm1pc3Npb25zID0gbW9kdWxlc0J5Um9sXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZGF0YS10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSB0aXRsZTtcclxuICBASW5wdXQoKSBjb2x1bW5zO1xyXG4gIEBJbnB1dCgpIGRhdGE6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIGNvbWJvO1xyXG4gIEBJbnB1dCgpIGNvbmZpZ3VyYXRpb24gPSB7XHJcbiAgICBhZGQ6IGZhbHNlLFxyXG4gICAgZWRpdDogZmFsc2UsXHJcbiAgICBkZWxldGU6IGZhbHNlLFxyXG4gICAgYWN0aXZlOiBmYWxzZSxcclxuICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgcHJpbnQ6IGZhbHNlLFxyXG4gICAgYWRkUGVyOiBmYWxzZSxcclxuICAgIGVkaXRQZXI6IGZhbHNlLFxyXG4gICAgcHJpbWFyeUtleTogJ2lkJyxcclxuICAgIGV4cG9ydFhzbHg6IGZhbHNlLFxyXG4gICAgaGlkZVRpdGxlOiB0cnVlLFxyXG4gICAgaGlkZUZpbHRlcjogdHJ1ZSxcclxuICAgIG5vdEluaXRpYWxpemU6IGZhbHNlLFxyXG4gICAgZXhwb3J0WHNseEJ5Um93OiBmYWxzZSxcclxuICAgIGV4cG9ydFhzbHhXaXRoUGFnZXM6IGZhbHNlLFxyXG4gICAgdmlldzogZmFsc2UsXHJcbiAgICBjbG9zZU9yZGVyOiBmYWxzZSxcclxuICAgIHBhY2tPZmY6IGZhbHNlLFxyXG4gICAgYWR2YW5jZTogZmFsc2UsXHJcbiAgICBhZHZhbmNlTGFiZWw6IG51bGwsXHJcbiAgICBpbmNvbWU6IGZhbHNlLFxyXG4gICAgZXhpdDogZmFsc2UsXHJcbiAgICBzZW5kRW1haWw6IGZhbHNlLFxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpIHJlbG9hZFRhYmxlOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBASW5wdXQoKSB1cmw6IHN0cmluZztcclxuICBASW5wdXQoKSBwYXJhbXM6IEFycmF5PGFueT47XHJcbiAgQElucHV0KCkgdGl0bGVMb2FkaW5nOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBtZXNzYWdlTG9hZGluZzogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgaGVhZGVyRmlsZVhsc206IEFycmF5PGFueT4gPSBbXTtcclxuICBASW5wdXQoKSBoZWFkZXJGaWx0ZXJzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgQElucHV0KCkgeHNseFRpdGxlRmllbGRzOiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSB4c2x4U2hlZXROYW1lRmllbGRzOiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSB4c2x4Qm9keUZpZWxkczogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHhzbHhQYXJhbXM6IEFycmF5PGFueT4gPSBudWxsO1xyXG4gIEBJbnB1dCgpIHJvbGVJZDogbnVtYmVyID0gMDtcclxuICBASW5wdXQoKSBtb2R1bGVJZDogbnVtYmVyID0gMDtcclxuICBASW5wdXQoKSBzdWJNb2R1bGVJZDogbnVtYmVyID0gMDtcclxuXHJcblxyXG4gIHByaXZhdGUgaGFzQWNjZXNzVG9BbGwgPSB0cnVlO1xyXG4gIHByaXZhdGUgcm9sZXNBbmRQZXJtaXNzaW9uVXNlcjogSVBlcm1pc3Npb25zID0ge30gYXMgSVBlcm1pc3Npb25zO1xyXG5cclxuICBAT3V0cHV0KCkgY2xpY2tSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgYWRkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHByaW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGV4cG9ydFhzbHhCeVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBhY3RpdmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgdmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBjbG9zZU9yZGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHBhY2tPZmYgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgYWR2YW5jZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBpbmNvbWUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZXhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBpbnRlcm5hbERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2VuZEVtYWlsID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIG1vdmlsID0gU2NyZWVuU2l6ZVV0aWwuaXNNb2JpbGUoKTtcclxuICBmaWx0ZXJzUG9zdDogQXJyYXk8YW55PiA9IFtdO1xyXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yLCB7IHN0YXRpYzogdHJ1ZSB9KSBwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcclxuXHJcbiAgc2VsZWN0ZWRSb3dzID0gW107IC8qKiBhbG1hY2VuYSBsYXMgZmlsYXMgc2VsZWNjaW9uYWRhcyAqL1xyXG4gIGNoZWNrYm94cyA9IHt9O1xyXG4gIHNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gIGluZGV0ZXJtaW5hdGVTdGF0ZSA9IGZhbHNlO1xyXG4gIGZpbHRlcnM7XHJcbiAgb3JpZ2luYWxEYXRhID0gW107XHJcbiAgcGFnaW5hdG9yQWN0aXZlID0gdHJ1ZTtcclxuICBzY3JlZW46IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBpZF9jb21wYW5pYTtcclxuXHJcbiAgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMjUsIDUwLCAxMDBdO1xyXG5cclxuICBwYWdlU2l6ZSA9IHNjcmVlbi53aWR0aCA+IDUwMCA/IDEwIDogNTtcclxuICBsZW5ndGggPSAwO1xyXG5cclxuICBwYWdlID0gMDtcclxuXHJcbiAgYWJvdmU6IFRvb2x0aXBQb3NpdGlvbltdID0gWydhYm92ZSddO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1lc3NhZ2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmdW5jdGlvbkV0ZXI6IEZ1bmN0aW9uc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBhZ2luYXRvclRyYW5zbGF0ZTogTWF0UGFnaW5hdG9ySW50bCxcclxuICAgIHByaXZhdGUgZXhwb3J0U2VydmljZTogRXhwb3J0RGF0YVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMucGFnaW5hdG9yVHJhbnNsYXRlLml0ZW1zUGVyUGFnZUxhYmVsID0gJ0VsZW1lbnRvcyBwb3IgcMOhZ2luYSc7XHJcbiAgICB0aGlzLnBhZ2luYXRvclRyYW5zbGF0ZS5uZXh0UGFnZUxhYmVsID0gJ1NpZ3VpZW50ZSBww6FnaW5hJztcclxuICAgIHRoaXMucGFnaW5hdG9yVHJhbnNsYXRlLmxhc3RQYWdlTGFiZWwgPSAnw5psdGltYSBww6FnaW5hJztcclxuICAgIHRoaXMucGFnaW5hdG9yVHJhbnNsYXRlLnByZXZpb3VzUGFnZUxhYmVsID0gJ1DDoWdpbmEgYW50ZXJpb3InO1xyXG4gICAgdGhpcy5wYWdpbmF0b3JUcmFuc2xhdGUuZmlyc3RQYWdlTGFiZWwgPSAnUHJpbWVyYSBww6FnaW5hJztcclxuICAgIHRoaXMucGFnaW5hdG9yVHJhbnNsYXRlLmdldFJhbmdlTGFiZWwgPSBzcGFuaXNoUmFuZ2VMYWJlbDtcclxuICB9XHJcblxyXG4gIGJ1dHRvbnNDb25maWcgPSBbXHJcbiAgXTtcclxuXHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy52YWxpZGF0ZVJvbEFuZFBlcm1pc3Npb24oKVxyXG4gICAgaWYgKHdpbmRvdy5zY3JlZW4ud2lkdGggPiAxMDAwKSB7XHJcbiAgICAgIHRoaXMuc2NyZWVuID0gdHJ1ZTtcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcclxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID4gMTAwMFxyXG4gICAgICAgICAgPyAodGhpcy5zY3JlZW4gPSB0cnVlKVxyXG4gICAgICAgICAgOiAodGhpcy5zY3JlZW4gPSBmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY3JlZW4gPSBmYWxzZTtcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcclxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID4gMTAwMFxyXG4gICAgICAgICAgPyAodGhpcy5zY3JlZW4gPSB0cnVlKVxyXG4gICAgICAgICAgOiAodGhpcy5zY3JlZW4gPSBmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlbG9hZFRhYmxlKSB7XHJcbiAgICAgIHRoaXMucmVsb2FkVGFibGUuc3Vic2NyaWJlKChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWxldGVjQWxsRXZlbnQoJycpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRpdGxlTG9hZGluZyA9PSAnJyA/ICh0aGlzLnRpdGxlTG9hZGluZyA9ICdDYXJnYW5kbycpIDogJyc7XHJcbiAgICB0aGlzLm1lc3NhZ2VMb2FkaW5nID09ICcnXHJcbiAgICAgID8gKHRoaXMubWVzc2FnZUxvYWRpbmcgPSAnT2J0ZW5pZW5kbyBkYXRvcy4uLicpXHJcbiAgICAgIDogJyc7XHJcbiAgICB0aGlzLnVybCAmJiAhdGhpcy5jb25maWd1cmF0aW9uLm5vdEluaXRpYWxpemVcclxuICAgICAgPyB0aGlzLm1lc3NhZ2Uub3BlbkxvYWRpbmcodGhpcy50aXRsZUxvYWRpbmcsIHRoaXMubWVzc2FnZUxvYWRpbmcpXHJcbiAgICAgIDogJyc7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMudXJsICYmICF0aGlzLmNvbmZpZ3VyYXRpb24ubm90SW5pdGlhbGl6ZSkge1xyXG4gICAgICAgIGxldCBzZXJ2aWNlID0gYXdhaXQgdGhpcy5nZXREYXRlVGFibGVCeVVybCgpO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHNlcnZpY2VbJ2RhdGEnXTtcclxuICAgICAgICB0aGlzLmxlbmd0aCA9IHNlcnZpY2VbJ2NvdW50J107XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2hlY2tib3hzW3Jvd1t0aGlzLmNvbmZpZ3VyYXRpb24ucHJpbWFyeUtleV1dID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxEYXRhLmVtaXQoc2VydmljZSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2UuY2xvc2VMb2FkaW5nKCk7XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0ZVJ1bGVzKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMudXJsKSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0b3JBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVSb2xBbmRQZXJtaXNzaW9uKCkge1xyXG4gICAgaWYodGhpcy5yb2xlSWQgPT0gMCl7XHJcbiAgICAgIGxldCByb2xlUGVybWlzc2lvbnMgPSByb2xlc0FuZFBlcm1pc3Npb25zPy5maW5kKHggPT4geC5pZCA9PSB0aGlzLnJvbGVJZClcclxuICAgICAgdGhpcy5oYXNBY2Nlc3NUb0FsbCA9IHJvbGVQZXJtaXNzaW9ucz8uaGFzQWNjZXNzVG9BbGwgPz8gcm9sZVBlcm1pc3Npb25zLm1vZHVsZXM/LmZpbmQoeCA9PiB4LmlkID09IHRoaXMubW9kdWxlSWQpPy5oYXNBY2Nlc3NUb0FsbCA/PyBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5yb2xlc0FuZFBlcm1pc3Npb25Vc2VyID0gcm9sZXNBbmRQZXJtaXNzaW9ucz8uZmluZCh4ID0+IHguaWQgPT0gdGhpcy5yb2xlSWQpPy5tb2R1bGVzPy5maW5kKHggPT4geC5pZCA9PSB0aGlzLm1vZHVsZUlkKT8uc3ViTW9kdWxlcz8uZmluZCh4ID0+IHguaWQgPT0gdGhpcy5zdWJNb2R1bGVJZCk/LnBlcm1pc3Npb25zID8/IHt9IGFzIElQZXJtaXNzaW9ucztcclxuICAgIGlmICghdGhpcy5oYXNBY2Nlc3NUb0FsbCAmJiAhdGhpcy5yb2xlc0FuZFBlcm1pc3Npb25Vc2VyLnJlYWRBbGwgJiYgdGhpcy5yb2xlc0FuZFBlcm1pc3Npb25Vc2VyLnJlYWRPd24gPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnBhcmFtcyA9IFsuLi50aGlzLnBhcmFtcywgeyBpZDogJ3JlYWRPd24nLCB2YWx1ZTogdHJ1ZSB9XTtcclxuICAgIH1cclxuICAgIHRoaXMuY29uZmlndXJlQnV0dG9ucygpXHJcbiAgfVxyXG5cclxuICBjb25maWd1cmVCdXR0b25zKCkge1xyXG4gICAgdGhpcy5idXR0b25zQ29uZmlnID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZWRpdCcsXHJcbiAgICAgICAgY29uZGl0aW9uU2hvd0hlYWRlcjogKCkgPT5cclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmVkaXQgJiZcclxuICAgICAgICAgIHRoaXMuaGFzUGVybWlzc2lvbigndXBkYXRlJyksXHJcbiAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB0aGlzLmNvbmZpZ3VyYXRpb24uZWRpdCAmJiB0aGlzLmhhc1Blcm1pc3Npb24oJ3VwZGF0ZScpLFxyXG4gICAgICAgIGljb246ICdmYS1lZGl0JyxcclxuICAgICAgICB0b29sdGlwOiAnRWRpdGFyJyxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGFjdGlvbjogJ3ByaW50JyxcclxuICAgICAgICBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAxICYmXHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucHJpbnQgJiZcclxuICAgICAgICAgIHRoaXMuc2NyZWVuICYmXHJcbiAgICAgICAgICB0aGlzLmhhc1Blcm1pc3Npb24oJ3ByaW50JyksXHJcbiAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB0aGlzLmNvbmZpZ3VyYXRpb24ucHJpbnQgJiYgdGhpcy5zY3JlZW4gJiYgdGhpcy5oYXNQZXJtaXNzaW9uKCdwcmludCcpLFxyXG4gICAgICAgIGljb246ICdmYS1wcmludCcsXHJcbiAgICAgICAgdG9vbHRpcDogJ0ltcHJpbWlyJyxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2FjdGl2ZScsXHJcbiAgICAgICAgY29uZGl0aW9uU2hvd0hlYWRlcjogKCkgPT5cclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDAgJiYgdGhpcy5jb25maWd1cmF0aW9uLmFjdGl2ZSAmJiB0aGlzLmhhc1Blcm1pc3Npb24oJ2FjdGl2YXRlQW5kSW5hY3RpdmF0ZScpLFxyXG4gICAgICAgIGNvbmRpdGlvbjogKCkgPT4gdGhpcy5jb25maWd1cmF0aW9uLmFjdGl2ZSAmJiB0aGlzLmhhc1Blcm1pc3Npb24oJ2FjdGl2YXRlQW5kSW5hY3RpdmF0ZScpLFxyXG4gICAgICAgIGljb246ICdmYS1hZGp1c3QnLFxyXG4gICAgICAgIHRvb2x0aXA6ICdBY3RpdmFyL0Rlc2FjdGl2YXInLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnYWRkJyxcclxuICAgICAgICBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAwICYmIHRoaXMuY29uZmlndXJhdGlvbi5hZGQgJiYgdGhpcy5oYXNQZXJtaXNzaW9uKCd3cml0ZScpLFxyXG4gICAgICAgIGNvbmRpdGlvbjogKCkgPT4gZmFsc2UsXHJcbiAgICAgICAgaWNvbjogJ2ZhLXBsdXMtY2lyY2xlJyxcclxuICAgICAgICB0b29sdGlwOiAnTnVldm8nLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnaW5jb21lJyxcclxuICAgICAgICBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAwICYmIHRoaXMuY29uZmlndXJhdGlvbi5pbmNvbWUgJiYgdGhpcy5oYXNQZXJtaXNzaW9uKCd3cml0ZScpLFxyXG4gICAgICAgIGNvbmRpdGlvbjogKCkgPT4gZmFsc2UsXHJcbiAgICAgICAgaWNvbjogJ2ZhLXVzZXItcGx1cycsXHJcbiAgICAgICAgdG9vbHRpcDogJ0luZ3Jlc28nLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZXhpdCcsXHJcbiAgICAgICAgY29uZGl0aW9uU2hvd0hlYWRlcjogKCkgPT5cclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmNvbmZpZ3VyYXRpb24uZXhpdCAmJiB0aGlzLmhhc1Blcm1pc3Npb24oJ3dyaXRlJyksXHJcbiAgICAgICAgY29uZGl0aW9uOiAoKSA9PiBmYWxzZSxcclxuICAgICAgICBpY29uOiAnZmEtdXNlci10aW1lcycsXHJcbiAgICAgICAgdG9vbHRpcDogJ1NhbGlkYScsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBhY3Rpb246ICd2aWV3JyxcclxuICAgICAgICBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAxICYmIHRoaXMuY29uZmlndXJhdGlvbi52aWV3ICYmIHRoaXMuaGFzUGVybWlzc2lvbigncmVhZERldGFpbCcpLFxyXG4gICAgICAgIGNvbmRpdGlvbjogKCkgPT4gdGhpcy5jb25maWd1cmF0aW9uLnZpZXcgJiYgdGhpcy5oYXNQZXJtaXNzaW9uKCdyZWFkRGV0YWlsJyksXHJcbiAgICAgICAgaWNvbjogJ2ZhLWV5ZScsXHJcbiAgICAgICAgdG9vbHRpcDogJ1ZlciBkZXRhbGxlJyxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2Nsb3NlT3JkZXInLFxyXG4gICAgICAgIGNvbmRpdGlvblNob3dIZWFkZXI6ICgpID0+XHJcbiAgICAgICAgICAodGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAxICYmIHRoaXMuY29uZmlndXJhdGlvbi5jbG9zZU9yZGVyKSAmJiB0aGlzLmhhc1Blcm1pc3Npb24oJ2Nsb3NlT1QnKSxcclxuICAgICAgICBjb25kaXRpb246ICgpID0+IHRoaXMuY29uZmlndXJhdGlvbi5jbG9zZU9yZGVyICYmIHRoaXMuaGFzUGVybWlzc2lvbignY2xvc2VPVCcpLFxyXG4gICAgICAgIGljb246ICdmYS1jaGVjay1jaXJjbGUnLFxyXG4gICAgICAgIHRvb2x0aXA6ICdDZXJyYXIgb3JkZW4nLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAncGFja09mZicsXHJcbiAgICAgICAgY29uZGl0aW9uU2hvd0hlYWRlcjogKCkgPT5cclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ucGFja09mZiAmJiB0aGlzLmhhc1Blcm1pc3Npb24oJ2FsbG9jYXRlUmVzb3VyY2VzJyksXHJcbiAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB0aGlzLmNvbmZpZ3VyYXRpb24ucGFja09mZiAmJiB0aGlzLmhhc1Blcm1pc3Npb24oJ2FsbG9jYXRlUmVzb3VyY2VzJyksXHJcbiAgICAgICAgaWNvbjogJ2ZhLWNhcnQtYXJyb3ctZG93bicsXHJcbiAgICAgICAgdG9vbHRpcDogJ0Rlc3BhY2hhciByZWN1cnNvcycsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBhY3Rpb246ICdhZHZhbmNlJyxcclxuICAgICAgICBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAxICYmIHRoaXMuY29uZmlndXJhdGlvbi5hZHZhbmNlICYmIHRoaXMuaGFzUGVybWlzc2lvbignYWR2YW5jZScpLFxyXG4gICAgICAgIGNvbmRpdGlvbjogKCkgPT4gdGhpcy5jb25maWd1cmF0aW9uLmFkdmFuY2UgJiYgdGhpcy5oYXNQZXJtaXNzaW9uKCdhZHZhbmNlJyksXHJcbiAgICAgICAgaWNvbjogJ2ZhLWFycm93LXJpZ2h0JyxcclxuICAgICAgICB0b29sdGlwOiB0aGlzLmNvbmZpZ3VyYXRpb24uYWR2YW5jZUxhYmVsLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnc2VuZEVtYWlsJyxcclxuICAgICAgICBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAxICYmXHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uc2VuZEVtYWlsICYmXHJcbiAgICAgICAgICB0aGlzLnNjcmVlbiAmJlxyXG4gICAgICAgICAgdGhpcy5oYXNQZXJtaXNzaW9uKCdzZW5kRW1haWwnKSxcclxuICAgICAgICBjb25kaXRpb246ICgpID0+IHRoaXMuY29uZmlndXJhdGlvbi5zZW5kRW1haWwgJiYgdGhpcy5zY3JlZW4gJiYgdGhpcy5oYXNQZXJtaXNzaW9uKCdzZW5kRW1haWwnKSxcclxuICAgICAgICBpY29uOiAnZmEtbWFpbC1idWxrJyxcclxuICAgICAgICB0b29sdGlwOiAnRW52aWEgY29ycmVvJyxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2V4cG9ydFRvRXhjZWwnLFxyXG4gICAgICAgIGNvbmRpdGlvblNob3dIZWFkZXI6ICgpID0+XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPT09IDAgJiZcclxuICAgICAgICAgIHRoaXMuZGF0YS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAodGhpcy5jb25maWd1cmF0aW9uLmV4cG9ydFhzbHggfHwgdGhpcy5jb25maWd1cmF0aW9uLmV4cG9ydFhzbHhXaXRoUGFnZXMpICYmXHJcbiAgICAgICAgICB0aGlzLmhhc1Blcm1pc3Npb24oJ2V4cG9ydCcpLFxyXG4gICAgICAgIGNvbmRpdGlvbjogKCkgPT4gZmFsc2UsXHJcbiAgICAgICAgaWNvbjogJ2ZhLWRvd25sb2FkJyxcclxuICAgICAgICB0b29sdGlwOiAnRXhwb3J0YXIgVGFibGEnLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZXhwb3J0VG9FeGNlbEJ5Um93JyxcclxuICAgICAgICBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PlxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAxICYmIHRoaXMuY29uZmlndXJhdGlvbi5leHBvcnRYc2x4QnlSb3cgJiYgdGhpcy5oYXNQZXJtaXNzaW9uKCdleHBvcnQnKSxcclxuICAgICAgICBjb25kaXRpb246ICgpID0+IHRoaXMuY29uZmlndXJhdGlvbi5leHBvcnRYc2x4QnlSb3cgJiYgdGhpcy5oYXNQZXJtaXNzaW9uKCdleHBvcnQnKSxcclxuICAgICAgICBpY29uOiAnZmEtZG93bmxvYWQnLFxyXG4gICAgICAgIHRvb2x0aXA6ICdFeHBvcnRhciBSZWdpc3RybycsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkZWxldGUnLFxyXG4gICAgICAgIGNvbmRpdGlvblNob3dIZWFkZXI6ICgpID0+XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPiAwICYmIHRoaXMuY29uZmlndXJhdGlvbi5kZWxldGUgJiYgdGhpcy5oYXNQZXJtaXNzaW9uKCdkZWxldGUnKSxcclxuICAgICAgICBjb25kaXRpb246ICgpID0+IHRoaXMuY29uZmlndXJhdGlvbi5kZWxldGUgJiYgdGhpcy5oYXNQZXJtaXNzaW9uKCdkZWxldGUnKSxcclxuICAgICAgICBpY29uOiAnZmEtdHJhc2gnLFxyXG4gICAgICAgIHRvb2x0aXA6ICdFbGltaW5hcicsXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgaGFzUGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmhhc0FjY2Vzc1RvQWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiB0aGlzLnJvbGVzQW5kUGVybWlzc2lvblVzZXI/LltwZXJtaXNzaW9uXSA/PyBmYWxzZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldERhdGVUYWJsZUJ5VXJsKCkge1xyXG4gICAgdGhpcy52YWxpZGFyUGFyYW1zKCk7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5odHRwLnBvc3REYXRhQm9keShcclxuICAgICAgdGhpcy51cmwsXHJcbiAgICAgIHRoaXMuZmlsdGVyc1Bvc3QsXHJcbiAgICAgIHRoaXMucGFyYW1zXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhclBhcmFtcygpIHtcclxuICAgIHRoaXMucGFyYW1zID0gdGhpcy5mdW5jdGlvbkV0ZXIucmVtb3ZlRHVwbGljYXRlT2JqZWN0cyh0aGlzLnBhcmFtcyk7XHJcbiAgICBpZiAodGhpcy5wYXJhbXMpIHtcclxuICAgICAgaWYgKCF0aGlzLnBhcmFtcy5maW5kKCh4KSA9PiB4LmlkID09ICdwYWdlJykpIHtcclxuICAgICAgICB0aGlzLnBhcmFtcy5wdXNoKHsgaWQ6ICdwYWdlJywgdmFsdWU6ICcwJyB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMucGFyYW1zLmZpbmQoKHgpID0+IHguaWQgPT0gJ3Blcl9wYWdlJykpIHtcclxuICAgICAgICB0aGlzLnBhcmFtcy5wdXNoKHsgaWQ6ICdwZXJfcGFnZScsIHZhbHVlOiB0aGlzLnBhZ2VTaXplIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5wYXJhbXMuZmluZCgoeCkgPT4geC5pZCA9PSAnZmlsdGVyJykpIHtcclxuICAgICAgICB0aGlzLnBhcmFtcy5wdXNoKHsgaWQ6ICdmaWx0ZXInLCB2YWx1ZTogJycgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHZhbGlkYXRlUnVsZXMoKSB7XHJcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY29sdW1uc10gb2YgdGhpcy5jb2x1bW5zLmVudHJpZXMoKSkge1xyXG4gICAgICBmb3IgKGNvbnN0IFtpbmRleERhdGEsIGVsZW1lbnRdIG9mIHRoaXMuZGF0YS5lbnRyaWVzKCkpIHtcclxuICAgICAgICBpZiAoY29sdW1ucy5ydWxlcykge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNvbHVtbnMucnVsZXMpIHtcclxuICAgICAgICAgICAgaWYgKHJ1bGUucnVsZSA9PSBlbnVtUnVsZXNbJz09J10pIHtcclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50W2NvbHVtbnMuSURdICYmXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50W2NvbHVtbnMuSURdLnRvU3RyaW5nKCkgPT0gcnVsZS52YWx1ZVJ1bGUudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhW2luZGV4RGF0YV1bY29sdW1ucy5JRF0gPSBydWxlLnZhbHVlQWN0aW9uO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb2x1bW5WYWx1ZSA9IGVsZW1lbnRbY29sdW1ucy5JRF07XHJcbiAgICAgICAgaWYgKGNvbHVtbnMudHlwZSA9PSAnZmVjaGEnIHx8IGNvbHVtbnMudHlwZSA9PSAnZGF0ZScpXHJcbiAgICAgICAgICB0aGlzLmRhdGFbaW5kZXhEYXRhXVtjb2x1bW5zLklEXSA9XHJcbiAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25FdGVyLmRhdGVJc28oY29sdW1uVmFsdWUpO1xyXG4gICAgICAgIGlmIChjb2x1bW5zLnR5cGUgPT0gJ2RhdGVXaXRoVGltZScpXHJcbiAgICAgICAgICB0aGlzLmRhdGFbaW5kZXhEYXRhXVtjb2x1bW5zLklEXSA9IHRoaXMuZnVuY3Rpb25FdGVyLmRhdGVXaXRoVGltZShcclxuICAgICAgICAgICAgY29sdW1uVmFsdWU/LnRvU3RyaW5nKCkgPz8gY29sdW1uVmFsdWVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgaWYgKGNvbHVtbnMudHlwZSA9PSAnY3VycmVuY3knKVxyXG4gICAgICAgICAgdGhpcy5kYXRhW2luZGV4RGF0YV1bY29sdW1ucy5JRF0gPVxyXG4gICAgICAgICAgICBJbnRsLk51bWJlckZvcm1hdCgnZXMtQ08nKS5mb3JtYXQoY29sdW1uVmFsdWUpO1xyXG4gICAgICAgIGlmIChjb2x1bW5zLnR5cGUgPT0gJ2Jvb2xlYW4nKVxyXG4gICAgICAgICAgdGhpcy5kYXRhW2luZGV4RGF0YV1bY29sdW1ucy5JRF0gPSBjb2x1bW5WYWx1ZSA9PSAxID8gJ1NpJyA6ICdObyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLmRhdGEpIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2hlY2tib3hzW3Jvd1t0aGlzLmNvbmZpZ3VyYXRpb24ucHJpbWFyeUtleV1dID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMub3JpZ2luYWxEYXRhLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEucHVzaChlbGVtZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudmFsaWRhdGVSdWxlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzLmNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy51cGRhdGVCdXR0b25Db25maWcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUJ1dHRvbkNvbmZpZygpIHtcclxuICAgIHRoaXMuYnV0dG9uc0NvbmZpZyA9IHRoaXMuYnV0dG9uc0NvbmZpZy5tYXAoKGJ1dHRvbikgPT4ge1xyXG4gICAgICBpZiAoYnV0dG9uLmFjdGlvbiA9PT0gJ2FkdmFuY2UnKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLmJ1dHRvbixcclxuICAgICAgICAgIHRvb2x0aXA6IHRoaXMuY29uZmlndXJhdGlvbi5hZHZhbmNlTGFiZWwgPz8gJ0F2YW56YXInLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGJ1dHRvbjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xpY2tPblJvVyhyb3dEYXRhKSB7XHJcbiAgICBsZXQgc3RhdGUgPSB0aGlzLmNoZWNrYm94c1tyb3dEYXRhW3RoaXMuY29uZmlndXJhdGlvbi5wcmltYXJ5S2V5XV07XHJcblxyXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0YWJsZSkge1xyXG4gICAgICB0aGlzLmNsZWFyQ2hlY2tib3hlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uKHJvd0RhdGEsIHsgY2hlY2tlZDogIXN0YXRlIH0sIHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RhYmxlKTtcclxuICAgIHRoaXMuY2xpY2tSb3cuZW1pdChyb3dEYXRhKTtcclxuICB9XHJcblxyXG4gIHNob3dNZW51KCRldmVudCkge1xyXG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgYWN0aW9uKGFjdGlvbiwgcm93ID0gbnVsbCkge1xyXG4gICAgdmFyIGN1cnJlbnRSb3cgPSByb3cgPyBbcm93XSA6IHRoaXMuc2VsZWN0ZWRSb3dzO1xyXG5cclxuICAgIHN3aXRjaCAoYWN0aW9uKSB7XHJcbiAgICAgIGNhc2UgJ2FkZCc6XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5hZGRQZXIpIHtcclxuICAgICAgICAgIHRoaXMuYWRkLmVtaXQodGhpcy5sZW5ndGgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRpYWxvZ1xyXG4gICAgICAgICAgICAub3BlbihUYWJsZU1vZGFsQ29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgY29sdW1uczogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNvbHVtbnMpKSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHdpZHRoOiAnNjB2aCcsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5hZnRlckNsb3NlZCgpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkLmVtaXQocmVzdWx0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdlZGl0JzpcclxuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmVkaXRQZXIpIHtcclxuICAgICAgICAgIHRoaXMuZWRpdC5lbWl0KGN1cnJlbnRSb3cpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgY29sdW1uczogYW55O1xyXG4gICAgICAgICAgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcclxuXHJcbiAgICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY3VycmVudFJvd1swXSkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbi5JRCA9PSBrZXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbHVtbnNbaW5kZXhdLnZhbHVlID0gY3VycmVudFJvd1swXVtrZXldO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLmRpYWxvZ1xyXG4gICAgICAgICAgICAub3BlbihUYWJsZU1vZGFsQ29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgY29sdW1uczogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNvbHVtbnMpKSxcclxuICAgICAgICAgICAgICAgIHZhbHVlczogY3VycmVudFJvd1swXSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHdpZHRoOiAnNjB2aCcsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5hZnRlckNsb3NlZCgpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdC5lbWl0KHsgbmV3OiByZXN1bHQsIG9sZDogY3VycmVudFJvd1swXSB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdkZWxldGUnOlxyXG4gICAgICAgIHRoaXMuZGVsZXRlLmVtaXQoY3VycmVudFJvdyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3ByaW50JzpcclxuICAgICAgICB0aGlzLnByaW50LmVtaXQoY3VycmVudFJvdyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2FjdGl2ZSc6XHJcbiAgICAgICAgdGhpcy5hY3RpdmUuZW1pdChjdXJyZW50Um93KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZXhwb3J0VG9FeGNlbCc6XHJcbiAgICAgICAgdGhpcy5leHBvcnRUb0V4Y2VsKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2V4cG9ydFRvRXhjZWxCeVJvdyc6XHJcbiAgICAgICAgdGhpcy5leHBvcnRYc2x4QnlSb3cuZW1pdChjdXJyZW50Um93KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAndmlldyc6XHJcbiAgICAgICAgdGhpcy52aWV3LmVtaXQoY3VycmVudFJvdyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2Nsb3NlT3JkZXInOlxyXG4gICAgICAgIHRoaXMuY2xvc2VPcmRlci5lbWl0KGN1cnJlbnRSb3cpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdwYWNrT2ZmJzpcclxuICAgICAgICB0aGlzLnBhY2tPZmYuZW1pdChjdXJyZW50Um93KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnYWR2YW5jZSc6XHJcbiAgICAgICAgdGhpcy5hZHZhbmNlLmVtaXQoY3VycmVudFJvdyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2luY29tZSc6XHJcbiAgICAgICAgdGhpcy5pbmNvbWUuZW1pdCh0aGlzLmxlbmd0aCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2V4aXQnOlxyXG4gICAgICAgIHRoaXMuZXhpdC5lbWl0KHRoaXMubGVuZ3RoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnc2VuZEVtYWlsJzpcclxuICAgICAgICB0aGlzLnNlbmRFbWFpbC5lbWl0KGN1cnJlbnRSb3cpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvdWxkU2hvd01lbnUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5idXR0b25zQ29uZmlnLnNvbWUoKGJ0bikgPT4gYnRuLmNvbmRpdGlvbigpKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydFRvRXhjZWwoKSB7XHJcbiAgICBsZXQgcGFyYW1zID0gW107XHJcbiAgICBpZiAodGhpcy51cmwgJiYgdGhpcy5wYXJhbXMpIHtcclxuICAgICAgcGFyYW1zID0gWy4uLnRoaXMucGFyYW1zXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnhzbHhQYXJhbXMpIHtcclxuICAgICAgICBwYXJhbXMgPSBbLi4ucGFyYW1zLCAuLi50aGlzLnhzbHhQYXJhbXNdO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBpID0gcGFyYW1zLmZpbmRJbmRleCgoeCkgPT4geC5pZCA9PSAncGVyX3BhZ2UnKTtcclxuICAgICAgaWYgKGkgIT0gLTEpIHBhcmFtc1tpXS52YWx1ZSA9IDEwMDAwMDAwMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmV4cG9ydFhzbHhXaXRoUGFnZXMpIHtcclxuICAgICAgdGhpcy5leHBvcnRTZXJ2aWNlLmdlbmVyYXRlRXhjZWxXaXRoU2hlZXRzPGFueT4oXHJcbiAgICAgICAgdGhpcy50aXRsZSxcclxuICAgICAgICB0aGlzLmhlYWRlckZpbGVYbHNtLFxyXG4gICAgICAgIHRoaXMudGl0bGUsXHJcbiAgICAgICAgdGhpcy51cmwgPyBudWxsIDogdGhpcy5kYXRhLFxyXG4gICAgICAgIHRoaXMudXJsLFxyXG4gICAgICAgIHBhcmFtcyxcclxuICAgICAgICB0aGlzLmZpbHRlcnNQb3N0LFxyXG4gICAgICAgIHRoaXMueHNseFRpdGxlRmllbGRzLFxyXG4gICAgICAgIHRoaXMueHNseFNoZWV0TmFtZUZpZWxkcyxcclxuICAgICAgICB0aGlzLnhzbHhCb2R5RmllbGRzXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZ2VuZXJhdGVUb1hsc3g8YW55PihcclxuICAgICAgICB0aGlzLnRpdGxlLFxyXG4gICAgICAgIHRoaXMuaGVhZGVyRmlsZVhsc20sXHJcbiAgICAgICAgdGhpcy50aXRsZSxcclxuICAgICAgICB0aGlzLnVybCA/IG51bGwgOiB0aGlzLmRhdGEsXHJcbiAgICAgICAgdGhpcy51cmwsXHJcbiAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgIHRoaXMuZmlsdGVyc1Bvc3RcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdGlvbihyb3csICRldmVudCwgZW1pdEV2ZW50ID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5jaGVja2JveHNbcm93W3RoaXMuY29uZmlndXJhdGlvbi5wcmltYXJ5S2V5XV0gPSAkZXZlbnQuY2hlY2tlZDtcclxuICAgIGlmICgkZXZlbnQuY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93cy5wdXNoKHJvdyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgaW5kZXggPSB0aGlzLnNlbGVjdGVkUm93cy5pbmRleE9mKHJvdyk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RhYmxlICYmIGVtaXRFdmVudCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPT0gdGhpcy5kYXRhLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdEFsbCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID4gMCAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPCB0aGlzLmRhdGEubGVuZ3RoXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5pbmRldGVybWluYXRlU3RhdGUgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbmRldGVybWluYXRlU3RhdGUgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsaWNrZWQoJGV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNlbGV0ZWNBbGxFdmVudCgkZXZlbnQpIHtcclxuICAgIHRoaXMuaW5kZXRlcm1pbmF0ZVN0YXRlID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0QWxsKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuY2hlY2tib3hzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrYm94c1trZXldID0gdHJ1ZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgICBsZXQgZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgICAgZGF0YS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MucHVzaChlbGVtZW50KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jbGVhckNoZWNrYm94ZXMoKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dzKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgc2VydmljZSA9IGF3YWl0IHRoaXMuZ2V0RGF0ZVRhYmxlQnlVcmwoKTtcclxuICAgIHRoaXMuZGF0YSA9IHNlcnZpY2VbJ2RhdGEnXTtcclxuICAgIHRoaXMuaW50ZXJuYWxEYXRhLmVtaXQoc2VydmljZSk7XHJcbiAgICB0aGlzLmxlbmd0aCA9IHNlcnZpY2VbJ2NvdW50J107XHJcbiAgICB0aGlzLnZhbGlkYXRlUnVsZXMoKTtcclxuICB9XHJcblxyXG4gIGNsZWFyQ2hlY2tib3hlcygpIHtcclxuICAgIE9iamVjdC5rZXlzKHRoaXMuY2hlY2tib3hzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgdGhpcy5jaGVja2JveHNba2V5XSA9IGZhbHNlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcclxuICB9XHJcblxyXG4gIGNoYW5nZUZpbHRlcnMoKSB7XHJcbiAgICBpZiAodGhpcy5wYXJhbXMpXHJcbiAgICAgIHRoaXMucGFyYW1zLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICBpZiAoZWxlbWVudC5pZCA9PSAnZmlsdGVyJykge1xyXG4gICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHRoaXMuZmlsdGVycztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYXBwbHlGaWx0ZXJzKCRldmVudD86IGFueSkge1xyXG4gICAgaWYgKCRldmVudCkgdGhpcy5maWx0ZXJzUG9zdCA9ICRldmVudDtcclxuICAgIGlmICh0aGlzLnVybCkge1xyXG4gICAgICBsZXQgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLmdldERhdGVUYWJsZUJ5VXJsKCk7XHJcbiAgICAgIHRoaXMuZGF0YSA9IHJlc1snZGF0YSddO1xyXG4gICAgICB0aGlzLnZhbGlkYXRlUnVsZXMoKTtcclxuICAgICAgdGhpcy5sZW5ndGggPSByZXNbJ2NvdW50J107XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxEYXRhLmVtaXQocmVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhLmZpbHRlcigoZGF0YSkgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhkYXRhKSkge1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IGRhdGFba2V5XVxyXG4gICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAuaW5jbHVkZXModGhpcy5maWx0ZXJzLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlUGFnZSgkZXZlbnQpIHtcclxuICAgIHRoaXMucGFyYW1zLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XHJcbiAgICAgIGlmIChlbGVtZW50LmlkID09ICdwZXJfcGFnZScpIHtcclxuICAgICAgICBlbGVtZW50LnZhbHVlID0gJGV2ZW50LnBhZ2VTaXplO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChlbGVtZW50LmlkID09ICdwYWdlJykge1xyXG4gICAgICAgIGVsZW1lbnQudmFsdWUgPSAkZXZlbnQucGFnZUluZGV4O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XHJcbiAgfVxyXG59XHJcblxyXG5lbnVtIGVudW1SdWxlcyB7XHJcbiAgJz4nLFxyXG4gICc8JyxcclxuICAnPT0nLFxyXG4gICchPScsXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRlbmVkb3ItdGFibGFcIj5cclxuICA8YXBwLWZpbHRlcnMgW2hlYWRlckZpbHRlcnNdPVwiaGVhZGVyRmlsdGVyc1wiIChhcHBseUZpbHRlcnMpPVwiYXBwbHlGaWx0ZXJzKCRldmVudClcIj5cclxuICA8L2FwcC1maWx0ZXJzPlxyXG5cclxuICA8ZGl2IHN0eWxlPSdkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47ICBhbGlnbi1pdGVtczogY2VudGVyOyc+XHJcbiAgICA8ZGl2IHN0eWxlPSdmbGV4OjE7IGZvbnQtc2l6ZTogMXJlbTsnPlxyXG4gICAgICA8c3Ryb25nPjxwIHN0eWxlPSdtYXJnaW46MCcgKm5nSWY9J3NlbGVjdGVkUm93cy5sZW5ndGg+MCAmJiBzZWxlY3RlZFJvd3MubGVuZ3RoPDIgJiYgY29uZmlndXJhdGlvbi5zZWxlY3RhYmxlJz4ge3tzZWxlY3RlZFJvd3MubGVuZ3RofX0gU2VsZWNjaW9uYWRvIDwvcD48L3N0cm9uZz5cclxuICAgICAgPHN0cm9uZz48cCBzdHlsZT0nbWFyZ2luOjAnICpuZ0lmPSdzZWxlY3RlZFJvd3MubGVuZ3RoPjEnPiB7e3NlbGVjdGVkUm93cy5sZW5ndGh9fSBTZWxlY2Npb25hZG9zIDwvcD48L3N0cm9uZz5cclxuICAgICAgPHN0cm9uZz48cCBzdHlsZT0nbWFyZ2luOjAnICpuZ0lmPSdzZWxlY3RlZFJvd3MubGVuZ3RoPDEgJiYgIWNvbmZpZ3VyYXRpb24uaGlkZVRpdGxlJz4ge3t0aXRsZX19IDwvcD48L3N0cm9uZz5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCIhY29uZmlndXJhdGlvbi5oaWRlRmlsdGVyXCIgc3R5bGU9J2ZsZXg6MzsgcGFkZGluZy1yaWdodDogMTBweDsgbWFyZ2luLWJvdHRvbTogNXB4Oyc+XHJcbiAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9J2ZpbHRlcic+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09J2ZpbHRlcnMnIChrZXl1cCk9J2NoYW5nZUZpbHRlcnMoKScgIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiRmlsdHJhclwiPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnNUYWJsZVwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuICA8L2Rpdj5cclxuXHJcbiA8dGFibGUgY2xhc3M9XCJ0YWJsZV9FdGVyIHRhYmxlLWhvdmVyXCI+XHJcbiAgICAgPHRoZWFkIGNsYXNzPVwiZGFya1wiPlxyXG4gICAgICAgPHRyID5cclxuICAgICAgICA8dGggKm5nSWY9J2NvbmZpZ3VyYXRpb24uc2VsZWN0YWJsZScgc3R5bGU9J2p1c3RpZnktY29udGVudDogY2VudGVyOyc+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IGNvbG9yPSdwcmltYXJ5JyAoY2hhbmdlKT0nc2VsZXRlY0FsbEV2ZW50KCRldmVudCknIFsobmdNb2RlbCldPSdzZWxlY3RBbGwnIFtpbmRldGVybWluYXRlXT0naW5kZXRlcm1pbmF0ZVN0YXRlJz4gPC9tYXQtY2hlY2tib3g+ICA8L3RoPlxyXG4gICAgICAgPHRoXHJcbiAgICAgICBbY2xhc3NdPVwiY29sdW1uLnN0eWxlPy5tb3ZpbFwiXHJcbiAgICAgICAqbmdGb3I9J2xldCBjb2x1bW4gb2YgY29sdW1ucycgc2NvcGU9XCJjb2xcIlxyXG4gICAgICAgW25nU3R5bGVdPVwiY29sdW1uLnN0eWxlXCJcclxuICAgICAgID57e2NvbHVtbi5sYWJlbH19PC90aD5cclxuICAgICAgIDx0aCAqbmdJZj1cInNob3VsZFNob3dNZW51KClcIj48L3RoPlxyXG4gICAgICAgPC90cj5cclxuICAgICA8L3RoZWFkPlxyXG4gICAgIDx0Ym9keSBjbGFzcz0nbWF0LWVsZXZhdGlvbi16Myc+XHJcblxyXG4gICAgICAgPHRyIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiICpuZ0Zvcj0nbGV0IHJvdyBvZiBkYXRhJyAoY2xpY2spPSdjbGlja09uUm9XKHJvdyknIFtjbGFzc109XCJjaGVja2JveHNbcm93W2NvbmZpZ3VyYXRpb24ucHJpbWFyeUtleV1dPydzZWxlY3RlZC1yb3cnOicnXCI+XHJcbiAgICAgICAgPHRoICpuZ0lmPSdjb25maWd1cmF0aW9uLnNlbGVjdGFibGUnIHN0eWxlPSdqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsnPiA8bWF0LWNoZWNrYm94IGNvbG9yPSdwcmltYXJ5JyBbKG5nTW9kZWwpXT0nY2hlY2tib3hzW3Jvd1tjb25maWd1cmF0aW9uLnByaW1hcnlLZXldXScgKGNsaWNrKT0nY2xpY2tlZCgkZXZlbnQpJyAoY2hhbmdlKT0nc2VsZWN0aW9uKHJvdywgJGV2ZW50KSc+IDwvbWF0LWNoZWNrYm94PiAgPC90aD5cclxuICAgICAgICA8dGggW2NsYXNzXT0nY29sdW1uLnN0eWxlPy5tb3ZpbCcgW25nU3R5bGVdPSdjb2x1bW4uc3R5bGUnIHNjb3BlPVwicm93XCIgKm5nRm9yPSdsZXQgY29sdW1uIG9mIGNvbHVtbnMnPnt7IHJvd1tjb2x1bW4uSURdIH19PC90aD5cclxuXHJcbiAgICAgICAgPHRoICpuZ0lmPVwic2hvdWxkU2hvd01lbnUoKVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG92ZXJmbG93OiB2aXNpYmxlO1wiPlxyXG4gICAgICAgICAgPG1hdC1pY29uXHJcbiAgICAgICAgICAoY2xpY2spPVwic2hvd01lbnUoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiXHJcbiAgICAgICAgICBtYXRSaXBwbGVcclxuICAgICAgICAgIGNsYXNzPVwibWVudV9tb3JlX3ZlcnRcIlxyXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJmYWxzZVwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiRXhhbXBsZSBkZWxldGUgaWNvblwiXHJcbiAgICAgICAgICA+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cclxuXHJcbiAgICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGJ0biBvZiBidXR0b25zQ29uZmlnXCIgPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJidG4uY29uZGl0aW9uKClcIiAoY2xpY2spPVwiYWN0aW9uKGJ0bi5hY3Rpb24sIHJvdylcIiBtYXQtbWVudS1pdGVtIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMFwiID5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEge3tidG4uaWNvbn19IGJ0bi1hY2Npb25cIiBzdHlsZT1cImZvbnQtc2l6ZToxMjAlOyBtYXJnaW4tcmlnaHQ6IDEwcHhcIj48L2k+XHJcbiAgICAgICAgICAgICAgICB7e2J0bi50b29sdGlwfX1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgIDwvdHI+XHJcblxyXG5cclxuICAgICA8L3Rib2R5PlxyXG5cclxuICAgPC90YWJsZT5cclxuXHJcbiAgIDxkaXYgKm5nSWY9J2xlbmd0aCA9PSAwICYmIGRhdGEubGVuZ3RoID09IDAnIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHg7XCI+IDxzdHJvbmc+Tm8gc2UgZW5jb250csOzIGluZm9ybWFjacOzbjwvc3Ryb25nPjwvZGl2PlxyXG5cclxuICAgPG1hdC1wYWdpbmF0b3IgKm5nSWY9XCJwYWdpbmF0b3JBY3RpdmVcIlxyXG4gICBbbGVuZ3RoXT1cImxlbmd0aFwiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCIgc2hvd0ZpcnN0TGFzdEJ1dHRvbnNcclxuICAgKHBhZ2UpPVwiY2hhbmdlUGFnZSgkZXZlbnQpXCI+PC9tYXQtcGFnaW5hdG9yPlxyXG5cclxuICA8L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjYnV0dG9uc1RhYmxlIGxldC1mb250U2l6ZT1cImZvbnRTaXplXCIgbGV0LW1hcmdpblJpZ2h0PVwibWFyZ2luUmlnaHRcIiBzdHlsZT0nZmxleDowLjU7IGRpc3BsYXk6ZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsnPlxyXG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBidXR0b25zQ29uZmlnXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiYnRuLmNvbmRpdGlvblNob3dIZWFkZXIoKVwiIChjbGljayk9XCJhY3Rpb24oYnRuLmFjdGlvbilcIiBtYXRUb29sdGlwPVwie3tidG4udG9vbHRpcH19XCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYSB7e2J0bi5pY29ufX0gYnRuLWFjY2lvblwiIFtuZ1N0eWxlXT1cInsnZm9udC1zaXplJzogZm9udFNpemUgPyBmb250U2l6ZSA6ICcxNzAlJywgJ21hcmdpbi1yaWdodCc6IG1hcmdpblJpZ2h0ID8gbWFyZ2luUmlnaHQgOiAnMTVweCd9XCI+PC9pPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG4iXX0=