tuain-ng-forms-lib 15.2.11 → 17.0.0

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 (76) hide show
  1. package/esm2022/lib/classes/forms/action.mjs +78 -0
  2. package/esm2022/lib/classes/forms/element.mjs +18 -0
  3. package/esm2022/lib/classes/forms/field.mjs +458 -0
  4. package/esm2022/lib/classes/forms/form.mjs +581 -0
  5. package/esm2022/lib/classes/forms/piece-propagate.mjs +39 -0
  6. package/esm2022/lib/classes/forms/piece.mjs +126 -0
  7. package/esm2022/lib/classes/forms/section.mjs +139 -0
  8. package/esm2022/lib/classes/forms/subsection.mjs +81 -0
  9. package/esm2022/lib/classes/forms/table/action.mjs +38 -0
  10. package/esm2022/lib/classes/forms/table/column.mjs +74 -0
  11. package/esm2022/lib/classes/forms/table/row-data.mjs +116 -0
  12. package/esm2022/lib/classes/forms/table/table.mjs +481 -0
  13. package/esm2022/lib/components/elements/action.component.mjs +52 -0
  14. package/esm2022/lib/components/elements/field.component.mjs +112 -0
  15. package/esm2022/lib/components/elements/layout/element.component.mjs +21 -0
  16. package/esm2022/lib/components/elements/layout/form-error.component.mjs +23 -0
  17. package/esm2022/lib/components/elements/layout/form-header.component.mjs +23 -0
  18. package/esm2022/lib/components/elements/layout/piece.component.mjs +40 -0
  19. package/esm2022/lib/components/elements/layout/section.component.mjs +40 -0
  20. package/esm2022/lib/components/elements/layout/sub-section.component.mjs +40 -0
  21. package/esm2022/lib/components/elements/tables/table-record-action.component.mjs +67 -0
  22. package/esm2022/lib/components/elements/tables/table-record-field.component.mjs +31 -0
  23. package/esm2022/lib/components/elements/tables/table.component.mjs +95 -0
  24. package/esm2022/lib/components/forms/basic-form.mjs +1314 -0
  25. package/esm2022/lib/services/event-manager.service.mjs +43 -0
  26. package/esm2022/lib/services/form-manager.service.mjs +81 -0
  27. package/{esm2020 → esm2022}/lib/tuain-ng-forms-lib.module.mjs +29 -29
  28. package/{fesm2020 → fesm2022}/tuain-ng-forms-lib.mjs +331 -270
  29. package/fesm2022/tuain-ng-forms-lib.mjs.map +1 -0
  30. package/lib/components/elements/action.component.d.ts +1 -1
  31. package/lib/components/elements/field.component.d.ts +1 -2
  32. package/lib/components/elements/layout/element.component.d.ts +1 -1
  33. package/lib/components/elements/layout/form-error.component.d.ts +1 -1
  34. package/lib/components/elements/layout/form-header.component.d.ts +1 -1
  35. package/lib/components/elements/layout/piece.component.d.ts +1 -1
  36. package/lib/components/elements/layout/section.component.d.ts +1 -1
  37. package/lib/components/elements/layout/sub-section.component.d.ts +1 -1
  38. package/lib/components/elements/tables/table-record-action.component.d.ts +1 -1
  39. package/lib/components/elements/tables/table-record-field.component.d.ts +1 -1
  40. package/lib/components/elements/tables/table.component.d.ts +1 -1
  41. package/lib/components/forms/basic-form.d.ts +1 -1
  42. package/package.json +7 -13
  43. package/esm2020/lib/classes/forms/action.mjs +0 -72
  44. package/esm2020/lib/classes/forms/element.mjs +0 -18
  45. package/esm2020/lib/classes/forms/field.mjs +0 -456
  46. package/esm2020/lib/classes/forms/form.mjs +0 -574
  47. package/esm2020/lib/classes/forms/piece-propagate.mjs +0 -41
  48. package/esm2020/lib/classes/forms/piece.mjs +0 -123
  49. package/esm2020/lib/classes/forms/section.mjs +0 -138
  50. package/esm2020/lib/classes/forms/subsection.mjs +0 -81
  51. package/esm2020/lib/classes/forms/table/action.mjs +0 -30
  52. package/esm2020/lib/classes/forms/table/column.mjs +0 -74
  53. package/esm2020/lib/classes/forms/table/row-data.mjs +0 -116
  54. package/esm2020/lib/classes/forms/table/table.mjs +0 -464
  55. package/esm2020/lib/components/elements/action.component.mjs +0 -55
  56. package/esm2020/lib/components/elements/field.component.mjs +0 -104
  57. package/esm2020/lib/components/elements/layout/element.component.mjs +0 -20
  58. package/esm2020/lib/components/elements/layout/form-error.component.mjs +0 -20
  59. package/esm2020/lib/components/elements/layout/form-header.component.mjs +0 -24
  60. package/esm2020/lib/components/elements/layout/piece.component.mjs +0 -40
  61. package/esm2020/lib/components/elements/layout/section.component.mjs +0 -39
  62. package/esm2020/lib/components/elements/layout/sub-section.component.mjs +0 -39
  63. package/esm2020/lib/components/elements/tables/table-record-action.component.mjs +0 -67
  64. package/esm2020/lib/components/elements/tables/table-record-field.component.mjs +0 -30
  65. package/esm2020/lib/components/elements/tables/table.component.mjs +0 -92
  66. package/esm2020/lib/components/forms/basic-form.mjs +0 -1310
  67. package/esm2020/lib/services/event-manager.service.mjs +0 -43
  68. package/esm2020/lib/services/form-manager.service.mjs +0 -80
  69. package/fesm2015/tuain-ng-forms-lib.mjs +0 -4315
  70. package/fesm2015/tuain-ng-forms-lib.mjs.map +0 -1
  71. package/fesm2020/tuain-ng-forms-lib.mjs.map +0 -1
  72. /package/{esm2020 → esm2022}/lib/classes/forms/form.constants.mjs +0 -0
  73. /package/{esm2020 → esm2022}/lib/services/file-manager.service.mjs +0 -0
  74. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  75. /package/{esm2020 → esm2022}/tuain-ng-forms-lib.mjs +0 -0
  76. /package/{tuain-ng-forms-lib.d.ts → index.d.ts} +0 -0
@@ -1,574 +0,0 @@
1
- import { Subject } from 'rxjs';
2
- import { FormAction } from './action';
3
- import { FieldDescriptor } from './field';
4
- import { RecordTable } from './table/table';
5
- import { RecordFormSection } from './section';
6
- import { HEADER } from './form.constants';
7
- const ACTIVE = 'active';
8
- const SHOW = 'show';
9
- const HIDE = 'hide';
10
- const ENABLE = 'enable';
11
- const DISABLE = 'disable';
12
- const CLEAN = 'clean';
13
- const alwaysVisible = 'ALWAYS';
14
- const neverVisible = 'NONE';
15
- const onStatesVisible = 'ONSTATES';
16
- export class FormStructureAndData {
17
- constructor() {
18
- this._stateChange = new Subject();
19
- this.name = '';
20
- this.title = '';
21
- this.subject = null;
22
- this.fields = {};
23
- this.actions = {};
24
- this.tables = {};
25
- this.sections = {};
26
- this._immutableData = {};
27
- this._extraInfo = {};
28
- this._exclusiveSectionsByAttr = {};
29
- this.customAttributes = {};
30
- this.state = '';
31
- this.actionArray = [];
32
- this.fieldArray = [];
33
- this.tableArray = [];
34
- this.sectionArray = [];
35
- this.stateFlow = {
36
- defaultState: '',
37
- states: [],
38
- stateDescriptions: [],
39
- transitions: [],
40
- };
41
- }
42
- setConfig(formConfig) {
43
- this.formConfig = formConfig;
44
- }
45
- cleanForm() {
46
- this.actionArray = [];
47
- this.fieldArray = [];
48
- this.tableArray = [];
49
- this.sectionArray = [];
50
- this.stateFlow = {
51
- defaultState: '',
52
- states: [],
53
- stateDescriptions: [],
54
- transitions: [],
55
- };
56
- }
57
- loadDefinition(definitionReceived) {
58
- this.state = '';
59
- let allStates = [];
60
- this.cleanForm();
61
- if (!definitionReceived) {
62
- return;
63
- }
64
- this.name = this.name ?? definitionReceived?.form?.formCode;
65
- this.title = (definitionReceived.form && definitionReceived.form.formTitle)
66
- ? definitionReceived.form.formTitle : '';
67
- allStates = definitionReceived?.states;
68
- this.setStateFlow(definitionReceived?.states, definitionReceived?.transitions, definitionReceived?.defaultState, definitionReceived?.stateDescriptions);
69
- this.immutableData = definitionReceived.immutableData;
70
- this.extraInfo = definitionReceived.extraInfo;
71
- this.customAttributes = {};
72
- if (definitionReceived?.customAttributes) {
73
- this.setCustomAttributes(definitionReceived?.customAttributes);
74
- }
75
- if (definitionReceived.actions) {
76
- const formActions = definitionReceived.actions.map(objDef => {
77
- let visibleStates = objDef.visibleStates
78
- ?? (objDef.actionModes?.split(',')?.map(state => state.trim())?.filter(state => state))
79
- ?? [];
80
- let enabledStates = objDef.enabledStates ?? objDef.editableStates ?? [];
81
- if (!Array.isArray(visibleStates) && typeof visibleStates === 'string') {
82
- visibleStates = (visibleStates === neverVisible) ? [] : allStates;
83
- }
84
- if (!Array.isArray(enabledStates) && typeof enabledStates === 'string') {
85
- enabledStates = (enabledStates === neverVisible) ? [] : visibleStates;
86
- }
87
- enabledStates = enabledStates.filter(state => visibleStates.includes(state));
88
- return { ...objDef, visibleStates, enabledStates };
89
- });
90
- for (const actionReceived of formActions) {
91
- const globalAction = new FormAction(actionReceived, this.formConfig);
92
- const globalActionCode = globalAction.actionCode;
93
- if (globalActionCode) {
94
- this.actionArray.push(globalAction);
95
- this.actions[globalActionCode] = globalAction;
96
- }
97
- }
98
- }
99
- if (definitionReceived.fields) {
100
- const formFields = definitionReceived.fields.map(objDef => {
101
- let visibleStates = objDef.visibleStates
102
- ?? (objDef.fieldModes?.split(',')?.map(state => state.trim())?.filter(state => state))
103
- ?? [];
104
- let enabledStates = objDef.enabledStates ?? objDef.editableStates ?? [];
105
- if (!Array.isArray(visibleStates) && typeof visibleStates === 'string') {
106
- visibleStates = (visibleStates === neverVisible) ? [] : allStates;
107
- }
108
- if (!Array.isArray(enabledStates) && typeof enabledStates === 'string') {
109
- enabledStates = (enabledStates === neverVisible) ? [] : visibleStates;
110
- }
111
- enabledStates = enabledStates.filter(state => visibleStates.includes(state));
112
- return { ...objDef, visibleStates, enabledStates };
113
- });
114
- for (const fieldReceived of formFields) {
115
- const fieldToAdd = new FieldDescriptor(fieldReceived, this.formConfig);
116
- const fieldCode = fieldToAdd.code;
117
- if (fieldCode) {
118
- this.fieldArray.push(fieldToAdd);
119
- this.fields[fieldCode] = fieldToAdd;
120
- }
121
- }
122
- }
123
- if (definitionReceived.tables) {
124
- const tables = definitionReceived.tables.map(objDef => {
125
- let visibleStates = objDef.visibleStates
126
- ?? (objDef.tableModes?.split(',')?.map(state => state.trim())?.filter(state => state))
127
- ?? [];
128
- let enabledStates = objDef.enabledStates ?? objDef.editableStates ?? [];
129
- if (!Array.isArray(visibleStates) && typeof visibleStates === 'string') {
130
- visibleStates = (visibleStates === neverVisible) ? [] : allStates;
131
- }
132
- if (!Array.isArray(enabledStates) && typeof enabledStates === 'string') {
133
- enabledStates = (enabledStates === neverVisible) ? [] : visibleStates;
134
- }
135
- enabledStates = enabledStates.filter(state => visibleStates.includes(state));
136
- return { ...objDef, visibleStates, enabledStates };
137
- });
138
- for (const tableReceived of tables) {
139
- const tableToAdd = new RecordTable(tableReceived, this.formConfig);
140
- const tableCode = tableToAdd.tableCode;
141
- if (tableCode) {
142
- this.tableArray.push(tableToAdd);
143
- this.tables[tableCode] = tableToAdd;
144
- }
145
- }
146
- }
147
- if (definitionReceived.sections) {
148
- const formSections = definitionReceived.sections.map(objDef => {
149
- let visibleStates = objDef.visibleStates
150
- ?? (objDef.sectionModes?.split(',')?.map(state => state.trim())?.filter(state => state))
151
- ?? [];
152
- if (!Array.isArray(visibleStates) && typeof visibleStates === 'string') {
153
- visibleStates = (visibleStates === neverVisible) ? [] : allStates;
154
- }
155
- return { ...objDef, visibleStates };
156
- });
157
- for (const sectionReceived of formSections) {
158
- const sectionToAdd = new RecordFormSection(sectionReceived, this, this.formConfig);
159
- const sectionCode = sectionToAdd.sectionCode;
160
- if (sectionCode) {
161
- this.sectionArray.push(sectionToAdd);
162
- this.sections[sectionCode] = sectionToAdd;
163
- }
164
- }
165
- }
166
- }
167
- // Estados
168
- get defaultState() { return this.stateFlow.defaultState; }
169
- get states() { return this.stateFlow.states; }
170
- get stateDescriptions() { return this.stateFlow.stateDescriptions; }
171
- supportState(state = '') { return (!!state && this.stateFlow.states?.includes(state)); }
172
- getNextStates() {
173
- return this.stateFlow.transitions.filter(trns => trns.source === this.state)
174
- .map(trns => trns.destination);
175
- }
176
- changeState(newState) {
177
- const currentState = this.state;
178
- if (!newState || !this.supportState(newState) || currentState === newState) {
179
- return false;
180
- }
181
- if (!this.state) {
182
- this.state = newState;
183
- }
184
- else {
185
- const transitionToChange = this.stateFlow.transitions.find(trns => trns.source === this.state && trns.destination === newState);
186
- if (transitionToChange) {
187
- this.state = newState;
188
- }
189
- }
190
- this._stateChange.next({ state: this.state });
191
- return (this.state === newState);
192
- }
193
- get stateChange() { return this._stateChange; }
194
- setStateFlow(states, transitions, defaultState, stateDescriptions = []) {
195
- this.stateFlow.states = states;
196
- this.stateFlow.stateDescriptions = stateDescriptions;
197
- this.stateFlow.defaultState = defaultState || this.stateFlow.states[0];
198
- this.stateFlow.transitions = transitions.map(transition => {
199
- const name = transition.name;
200
- const source = (this.stateFlow.states.includes(transition.source)) ? transition.source : '';
201
- const destination = (this.stateFlow.states.includes(transition.destination)) ? transition.destination : '';
202
- return { name, source, destination };
203
- }).filter(item => item.name && item.source && item.destination);
204
- }
205
- // immutable Data
206
- getImmutableElement(name) { return this._immutableData?.[name]?.value ?? null; }
207
- set immutableData(immutableData) { Object.assign(this._immutableData, immutableData); }
208
- get immutableData() { return JSON.parse(JSON.stringify(this._immutableData)); }
209
- // extra Info
210
- getExtraInfo(name) { return this._extraInfo?.[name]?.value ?? null; }
211
- set extraInfo(extraInfo) { Object.assign(this._extraInfo, extraInfo); }
212
- get extraInfo() { return JSON.parse(JSON.stringify(this._extraInfo)); }
213
- // Custom Attributes
214
- getCustomAttribute(name) { return this.customAttributes?.[name] ?? null; }
215
- setCustomAttribute(name, value) { if (name) {
216
- this.customAttributes[name] = value;
217
- } }
218
- setCustomAttributes(attributes) {
219
- if (attributes && typeof attributes === 'object') {
220
- Object.entries(attributes).forEach(([name, value]) => {
221
- this.setCustomAttribute(name, value);
222
- });
223
- }
224
- return this;
225
- }
226
- // Fields
227
- get fieldNames() { return this.getFieldNames(); }
228
- getFields() { return this.fieldArray; }
229
- getFieldNames() { return this.fieldArray.map(field => field.code); }
230
- getField(code) { return (code && this.fields?.[code]) ? this.fields[code] : null; }
231
- enableField(code) { this.getField(code)?.enable(); }
232
- disableField(code) { this.getField(code)?.disable(); }
233
- getFieldValue(code) { return this.getField(code)?.value; }
234
- getFieldOptionText(code) { return this.getField(code)?.optionText; }
235
- getFieldOptions(code) { return this.getField(code)?.options ?? null; }
236
- setFieldValue(code, value) { this.getField(code)?.setValue(value); }
237
- setFieldError(code, errorCode, message, type = 'error') { this.getField(code)?.setError(errorCode, message, type); }
238
- setFieldIntrinsicErrorMessage(code, message) { this.getField(code)?.setIntrinsicErrorMessage(message); }
239
- setFieldRequired(inputCodes, required) {
240
- const codes = this.getFieldSet(null, inputCodes ?? null);
241
- for (const code of codes) {
242
- try {
243
- const field = this.getField(code) ?? null;
244
- field && (field.required = required);
245
- }
246
- catch (e) {
247
- console.log(`Error modificando campo ${code}: ${e}`);
248
- }
249
- }
250
- }
251
- setFieldErrorMessage(code, message) { this.getField(code)?.setErrorMessage(message); }
252
- setFieldOptions(code, optionsArray, idAttribute, nameAttribute) {
253
- const field = this.getField(code);
254
- if (field && optionsArray) {
255
- const fieldOptions = optionsArray.map(item => ({
256
- fieldOptionId: item[idAttribute],
257
- fieldOptionValue: item[nameAttribute]
258
- }));
259
- field.setFieldOptions(fieldOptions);
260
- }
261
- }
262
- getFieldSet(filter, inputCodes, secCode, subCode) {
263
- let codes = [];
264
- if (inputCodes) {
265
- if (typeof inputCodes === 'string') {
266
- codes = [inputCodes];
267
- }
268
- else if (Array.isArray(inputCodes) && inputCodes.length > 0) {
269
- codes = inputCodes ?? [];
270
- }
271
- }
272
- else if (secCode && !subCode) {
273
- codes = this.getSection(secCode)?.getFieldNames() ?? [];
274
- }
275
- else if (secCode && subCode) {
276
- codes = this.getSubSection(secCode, subCode)?.getFieldNames() ?? [];
277
- }
278
- else {
279
- codes = this.getFieldNames() ?? [];
280
- }
281
- return (filter) ? codes.filter(fld => filter(this.getField(fld))) : codes;
282
- }
283
- applyOnFields(processFunc, inputCodes, secCode, subCode) {
284
- if (!processFunc) {
285
- return 0;
286
- }
287
- const codes = this.getFieldSet(null, inputCodes ?? null, secCode, subCode);
288
- let processedFields = 0;
289
- for (const code of codes) {
290
- const field = this.getField(code);
291
- if (field) {
292
- try {
293
- processFunc(field);
294
- processedFields += 1;
295
- }
296
- catch (e) {
297
- console.log(`Error procesando funcion en campo ${field}: ${e}`);
298
- }
299
- }
300
- }
301
- return processedFields;
302
- }
303
- applyProcessToAllFields(processFunc) {
304
- return this.applyOnFields(processFunc);
305
- }
306
- enableFields(codes, secCode, subCode) {
307
- return this.applyOnFields(fld => fld?.enable(), codes, secCode, subCode);
308
- }
309
- showFields(codes, secCode, subCode) {
310
- return this.applyOnFields(fld => fld?.show(), codes, secCode, subCode);
311
- }
312
- hideFields(codes, secCode, subCode) {
313
- return this.applyOnFields(fld => fld?.hide(), codes, secCode, subCode);
314
- }
315
- showLabelFields(codes, secCode, subCode) {
316
- return this.applyOnFields(fld => fld?.showLablel(), codes, secCode, subCode);
317
- }
318
- hideLabelFields(codes, secCode, subCode) {
319
- return this.applyOnFields(fld => fld?.hideLabel(), codes, secCode, subCode);
320
- }
321
- disableFields(codes, secCode, subCode) {
322
- return this.applyOnFields(fld => fld?.disable(), codes, secCode, subCode);
323
- }
324
- cleanFields(codes, secCode, subCode) {
325
- return this.applyOnFields(fld => fld?.clean(), codes, secCode, subCode);
326
- }
327
- tagFieldsWithError(message, codes, secCode, subCode) {
328
- return this.applyOnFields(fld => fld?.setErrorMessage(message), codes, secCode, subCode);
329
- }
330
- cleanErrorFields(codes, secCode, subCode) {
331
- return this.tagFieldsWithError('', codes, secCode, subCode);
332
- }
333
- tagEmptyRequiredFields(message, codes = null, secCode, subCode) {
334
- return this.tagFieldsWithError(message, this.getRequiredEmptyFields(codes, secCode, subCode)) > 0;
335
- }
336
- getRequiredFields(codes, secCode, subCode) {
337
- return this.getFieldSet(fld => fld?.required, codes ?? null, secCode, subCode);
338
- }
339
- getRequiredEmptyFields(codes, secCode, subCode, onlyVisible) {
340
- if (onlyVisible) {
341
- return this.getFieldSet(fld => fld?.required && fld?.visible && fld?.empty, codes ?? null, secCode, subCode);
342
- }
343
- return this.getFieldSet(fld => fld?.required && fld?.empty, codes ?? null, secCode, subCode);
344
- }
345
- getChangedFields(codes, secCode, subCode) {
346
- return this.getFieldSet(fld => !fld?.outputOnly && fld?.hasChanged, codes ?? null, secCode, subCode);
347
- }
348
- getFieldsWithValidationIssues(codes, secCode, subCode, onlyVisible) {
349
- if (onlyVisible) {
350
- return this.getFieldSet(fld => (fld?.hasError() && fld?.visible), codes ?? null, secCode, subCode);
351
- }
352
- return this.getFieldSet(fld => fld?.hasError(), codes ?? null, secCode, subCode);
353
- }
354
- getFieldsValues(inputCodes, secCode, subCode) {
355
- const codes = this.getFieldSet(null, inputCodes ?? null, secCode, subCode);
356
- const resultObject = {};
357
- for (let index = 0; index < codes.length; index++) {
358
- const code = codes[index];
359
- if (code) {
360
- resultObject[code] = this.fields?.[code]?.getValue() ?? null;
361
- }
362
- }
363
- return resultObject;
364
- }
365
- // Acciones
366
- getActions() { return this.actionArray; }
367
- getAction(code) { return (code && this.actions?.[code]) ? this.actions[code] : null; }
368
- showActions(codes) { return this.execOnActions(codes, SHOW); }
369
- hideActions(codes) { return this.execOnActions(codes, HIDE); }
370
- enableActions(codes) { return this.execOnActions(codes, ENABLE); }
371
- disableActions(codes) { return this.execOnActions(codes, DISABLE); }
372
- enableAction(code) { return this.enableActions(code); }
373
- disableAction(code) { return this.disableActions(code); }
374
- showAction(code) { return this.showActions(code); }
375
- hideAction(code) { return this.hideActions(code); }
376
- getHeaderActions() { return this.getActionsByAttribute('location', HEADER); }
377
- getActionsByAttribute(name, value) {
378
- return this.actionArray.filter(actionItem => actionItem.matchAttribute(name, value));
379
- }
380
- execOnActions(codes, functionName) {
381
- const actionCodes = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
382
- if (!functionName || actionCodes.length === 0) {
383
- return;
384
- }
385
- actionCodes.forEach(code => {
386
- const action = this.getAction(code);
387
- action?.[functionName]?.();
388
- });
389
- }
390
- // Tablas
391
- getTables() { return this.tableArray; }
392
- getTable(code) { return (code && this.tables?.[code]) ? this.tables[code] : null; }
393
- getTableRecord(code, id) { return this.getTable(code)?.getTableRecord(id); }
394
- enableTables(codes) { return this.execOnTables(codes, ENABLE); }
395
- disableTables(codes) { return this.execOnTables(codes, DISABLE); }
396
- showTables(codes) { return this.execOnTables(codes, SHOW); }
397
- hideTables(codes) { return this.execOnTables(codes, HIDE); }
398
- cleanTables(codes) { return this.execOnTables(codes, CLEAN); }
399
- showTable(code) { return this.showTables(code); }
400
- hideTable(code) { return this.hideTables(code); }
401
- cleanTable(code) { return this.getTable(code)?.clean(); }
402
- execOnTables(codes, functionName) {
403
- const tableCodes = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
404
- if (!functionName || tableCodes.length === 0) {
405
- return;
406
- }
407
- tableCodes.forEach(code => {
408
- const table = this.getTable(code);
409
- table?.[functionName]?.();
410
- });
411
- }
412
- // Secciones
413
- getSections() { return this.sectionArray; }
414
- getSectionsTitles() { return this.getSections()?.filter(sec => sec?.title).map(sec => sec?.title ?? ''); }
415
- numSections() { return this.sectionArray.length; }
416
- getSectionsByAttribute(name, value) { return this.sectionArray.filter(item => item.matchAttribute(name, value)); }
417
- get sectionTitles() { return this.getSectionsTitles(); }
418
- get visibleSections() { return this.sectionArray.filter(sec => sec.absoluteVisible); }
419
- getSection(code) { return (code && this.sections?.[code]) ? this.sections[code] : null; }
420
- showSections(codes) { this.execOnSections(codes, SHOW); }
421
- hideSections(codes) { this.execOnSections(codes, HIDE); }
422
- showSection(code) { return this.showSections(code); }
423
- hideSection(code) { return this.hideSections(code); }
424
- activeSection() { return this._exclusiveSectionsByAttr[ACTIVE]; }
425
- getSubSection(code, subCode) { return this.getSection(code)?.getSubsection(subCode) ?? null; }
426
- showSubSections(code, subCodes) { return this.execOnSubSections(code, subCodes, SHOW); }
427
- showSubSection(code, subCode) { return this.showSubSections(code, subCode); }
428
- hideSubSection(code, subCode) { return this.hideSubSections(code, subCode); }
429
- hideSubSections(code, subCodes) { return this.execOnSubSections(code, subCodes, HIDE); }
430
- getSectionActions(code) { return this.getSection(code)?.getActions() ?? null; }
431
- getSectionActionNames(code) { return this.getSection(code)?.getActionNames() ?? null; }
432
- activateSection(code) {
433
- if (code === this._exclusiveSectionsByAttr[ACTIVE]) {
434
- return;
435
- }
436
- this.getSection(this.activeSection())?.inactivate();
437
- this.getSection(code)?.activate();
438
- this._exclusiveSectionsByAttr[ACTIVE] = code;
439
- }
440
- execOnSections(codes, functionName) {
441
- const sectionCodes = (Array.isArray(codes)) ? codes : (codes ? [codes] : []);
442
- if (!functionName || sectionCodes.length === 0) {
443
- return;
444
- }
445
- sectionCodes.forEach(code => {
446
- const section = this.getSection(code);
447
- section?.[functionName]?.();
448
- });
449
- }
450
- execOnSubSections(code, subNames, functionName) {
451
- const subCodes = (Array.isArray(subNames)) ? subNames : (subNames ? [subNames] : []);
452
- const section = this.getSection(code);
453
- if (!functionName || !section || subCodes.length === 0) {
454
- return;
455
- }
456
- for (const subCode of subCodes) {
457
- const subSection = this.getSubSection(code, subCode);
458
- subSection?.[functionName]?.();
459
- }
460
- }
461
- /**
462
- * Métodos propios de gestión del formulario
463
- */
464
- cleanData() {
465
- for (const field of this.fieldArray) {
466
- field.setValue(field.defaultValue);
467
- }
468
- for (const table of this.tableArray) {
469
- table.clean();
470
- }
471
- }
472
- getPayload() {
473
- const formData = { fields: [], tables: [] };
474
- formData.fields = this.getFields().filter(fld => !fld?.outputOnly)
475
- .map(fld => {
476
- const fieldPayload = {
477
- fieldCode: fld?.code,
478
- fieldValue: fld?.value,
479
- editable: !fld?.absoluteDisabled,
480
- visible: fld?.absoluteVisible,
481
- required: fld?.required,
482
- fieldOptions: '',
483
- };
484
- return fieldPayload;
485
- });
486
- formData.tables = this.getTables().map(tbl => {
487
- const tablePayload = {
488
- tableCode: tbl.tableCode,
489
- visible: tbl.absoluteVisible,
490
- currentPage: tbl.currentPage,
491
- requestedPage: tbl.requestedPage,
492
- recordsPerPage: tbl.recordsPerPage,
493
- currentFilter: tbl.currentFilter,
494
- sortingColumn: tbl.sorting.columnName,
495
- sortingDirection: tbl.sorting.direction,
496
- };
497
- return tablePayload;
498
- });
499
- return formData;
500
- }
501
- /**
502
- * @deprecated Use subject
503
- */
504
- get formSubject() { return this.subject; }
505
- /**
506
- * @deprecated Use subject
507
- */
508
- set formSubject(subject) { this.subject = subject; }
509
- /**
510
- * @deprecated Use states
511
- */
512
- getStates() { return this.states; }
513
- /**
514
- * @deprecated Use state
515
- */
516
- getCurrentState() { return this.state; }
517
- /**
518
- * @deprecated Use title
519
- */
520
- getTitle() { return this.title; }
521
- /**
522
- * @deprecated Use title
523
- */
524
- setTitle(title) { this.title = title; }
525
- /**
526
- * @deprecated Use supportState
527
- */
528
- supportMode(state) { return this.supportState(state); }
529
- /**
530
- * @deprecated Use enableFields
531
- */
532
- enableEditFields(codes, secCode, subCode) {
533
- return this.enableFields(codes, secCode, subCode);
534
- }
535
- /**
536
- * @deprecated Use disableFields
537
- */
538
- disableEditFields(codes, secCode, subCode) {
539
- return this.disableFields(codes, secCode, subCode);
540
- }
541
- /**
542
- * @deprecated Use getField
543
- */
544
- getFieldObject(code) { return this.getField(code); }
545
- /**
546
- * @deprecated Use getAction
547
- */
548
- getActionObject(code) { return this.getAction(code); }
549
- /**
550
- * @deprecated Use getTable
551
- */
552
- getTableObject(code) { return this.getTable(code); }
553
- /**
554
- * @deprecated Use getSection
555
- */
556
- getSectionObject(code) { return this.getSection(code); }
557
- /**
558
- * @deprecated Use changeState
559
- */
560
- changeFormMode(state) { return this.changeState(state); }
561
- /**
562
- * @deprecated Use subject
563
- */
564
- getFormSubject() { return this.subject; }
565
- /**
566
- * @deprecated Use subject
567
- */
568
- getSubject() { return this.subject ?? ''; }
569
- /**
570
- * @deprecated Use subject
571
- */
572
- getformSubject() { return this.subject ?? ''; }
573
- }
574
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1YWluLW5nLWZvcm1zLWxpYi9zcmMvbGliL2NsYXNzZXMvZm9ybXMvZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBZSxNQUFNLFNBQVMsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU5QyxPQUFPLEVBQVksTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUNwQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUM7QUFDcEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQ3hCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFFdEIsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDO0FBQy9CLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUM1QixNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUF1Q25DLE1BQU0sT0FBTyxvQkFBb0I7SUFxQi9CO1FBcEJpQixpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFHbkQsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUNsQixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ1QsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFFOUIsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixXQUFNLEdBQUcs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QUVHO0lBQ0gsZ0JBQWdCLENBQUMsSUFBWSxJQUE4QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTFGOztPQUVHO0lBQ0gsY0FBYyxDQUFDLEtBQWEsSUFBYSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTFFOztPQUVHO0lBQ0gsY0FBYyxLQUFhLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDakQ7O09BRUc7SUFDSCxVQUFVLEtBQWEsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkQ7O09BRUc7SUFDSCxjQUFjLEtBQWEsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FFeEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGb3JtQWN0aW9uIH0gZnJvbSAnLi9hY3Rpb24nO1xuaW1wb3J0IHsgRmllbGREZXNjcmlwdG9yLCBGaWVsZE9wdGlvbiB9IGZyb20gJy4vZmllbGQnO1xuaW1wb3J0IHsgUmVjb3JkVGFibGUgfSBmcm9tICcuL3RhYmxlL3RhYmxlJztcbmltcG9ydCB7IFJlY29yZEZvcm1TZWN0aW9uIH0gZnJvbSAnLi9zZWN0aW9uJztcbmltcG9ydCB7IFJlY29yZEZvcm1TdWJTZWN0aW9uIH0gZnJvbSAnLi9zdWJzZWN0aW9uJztcbmltcG9ydCB7IE5PX0VSUk9SLCBIRUFERVIgfSBmcm9tICcuL2Zvcm0uY29uc3RhbnRzJztcbmltcG9ydCB7IFRhYmxlUmVjb3JkRGF0YSB9IGZyb20gJy4vdGFibGUvcm93LWRhdGEnO1xuXG5jb25zdCBBQ1RJVkUgPSAnYWN0aXZlJztcbmNvbnN0IFNIT1cgPSAnc2hvdyc7XG5jb25zdCBISURFID0gJ2hpZGUnO1xuY29uc3QgRU5BQkxFID0gJ2VuYWJsZSc7XG5jb25zdCBESVNBQkxFID0gJ2Rpc2FibGUnO1xuY29uc3QgQ0xFQU4gPSAnY2xlYW4nO1xuXG5jb25zdCBhbHdheXNWaXNpYmxlID0gJ0FMV0FZUyc7XG5jb25zdCBuZXZlclZpc2libGUgPSAnTk9ORSc7XG5jb25zdCBvblN0YXRlc1Zpc2libGUgPSAnT05TVEFURVMnO1xuaW50ZXJmYWNlIFRyYW5zaXRpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHNvdXJjZTogc3RyaW5nO1xuICBkZXN0aW5hdGlvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU3RhdGVGbG93IHtcbiAgZGVmYXVsdFN0YXRlOiBzdHJpbmc7XG4gIHN0YXRlczogc3RyaW5nW107XG4gIHN0YXRlRGVzY3JpcHRpb25zOiBzdHJpbmdbXTtcbiAgdHJhbnNpdGlvbnM6IFRyYW5zaXRpb25bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZFBheWxvYWQge1xuICBmaWVsZENvZGU6IHN0cmluZztcbiAgZmllbGRWYWx1ZTogYW55O1xuICBlZGl0YWJsZTogYm9vbGVhbjtcbiAgdmlzaWJsZTogYm9vbGVhbjtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIGZpZWxkT3B0aW9uczogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlUGF5bG9hZCB7XG4gIHRhYmxlQ29kZTogc3RyaW5nO1xuICB2aXNpYmxlOiBib29sZWFuO1xuICBjdXJyZW50UGFnZTogbnVtYmVyO1xuICByZXF1ZXN0ZWRQYWdlOiBudW1iZXI7XG4gIHJlY29yZHNQZXJQYWdlOiBudW1iZXI7XG4gIGN1cnJlbnRGaWx0ZXI6IGFueSxcbiAgc29ydGluZ0NvbHVtbjogc3RyaW5nO1xuICBzb3J0aW5nRGlyZWN0aW9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBGb3JtUGF5bG9hZCB7XG4gIGZpZWxkczogRmllbGRQYXlsb2FkW10sXG4gIHRhYmxlczogVGFibGVQYXlsb2FkW10sXG59XG5cbmV4cG9ydCBjbGFzcyBGb3JtU3RydWN0dXJlQW5kRGF0YSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXRlQ2hhbmdlID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICBmb3JtQ29uZmlnOiBhbnk7XG4gIHN0YXRlOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZyA9ICcnO1xuICB0aXRsZTogc3RyaW5nID0gJyc7XG4gIHByb3RlY3RlZCBzdWJqZWN0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIHN0YXRlRmxvdzogU3RhdGVGbG93O1xuICBwcm90ZWN0ZWQgZmllbGRzID0ge307XG4gIHByb3RlY3RlZCBhY3Rpb25zID0ge307XG4gIHByb3RlY3RlZCB0YWJsZXMgPSB7fTtcbiAgcHJvdGVjdGVkIHNlY3Rpb25zID0ge307XG4gIHByb3RlY3RlZCBmaWVsZEFycmF5OiBGaWVsZERlc2NyaXB0b3JbXTtcbiAgcHJvdGVjdGVkIGFjdGlvbkFycmF5OiBGb3JtQWN0aW9uW107XG4gIHByb3RlY3RlZCB0YWJsZUFycmF5OiBSZWNvcmRUYWJsZVtdO1xuICBwcm90ZWN0ZWQgc2VjdGlvbkFycmF5OiBSZWNvcmRGb3JtU2VjdGlvbltdO1xuICBwcml2YXRlIF9pbW11dGFibGVEYXRhID0ge307XG4gIHByaXZhdGUgX2V4dHJhSW5mbyA9IHt9O1xuICBwcml2YXRlIF9leGNsdXNpdmVTZWN0aW9uc0J5QXR0ciA9IHt9O1xuICBwdWJsaWMgY3VzdG9tQXR0cmlidXRlczogYW55ID0ge307XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zdGF0ZSA9ICcnO1xuICAgIHRoaXMuYWN0aW9uQXJyYXkgPSBbXTtcbiAgICB0aGlzLmZpZWxkQXJyYXkgPSBbXTtcbiAgICB0aGlzLnRhYmxlQXJyYXkgPSBbXTtcbiAgICB0aGlzLnNlY3Rpb25BcnJheSA9IFtdO1xuICAgIHRoaXMuc3RhdGVGbG93ID0ge1xuICAgICAgZGVmYXVsdFN0YXRlOiAnJyxcbiAgICAgIHN0YXRlczogW10sXG4gICAgICBzdGF0ZURlc2NyaXB0aW9uczogW10sXG4gICAgICB0cmFuc2l0aW9uczogW10sXG4gICAgfTtcbiAgfVxuXG4gIHNldENvbmZpZyhmb3JtQ29uZmlnKSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnID0gZm9ybUNvbmZpZztcbiAgfVxuXG4gIGNsZWFuRm9ybSgpIHtcbiAgICB0aGlzLmFjdGlvbkFycmF5ID0gW107XG4gICAgdGhpcy5maWVsZEFycmF5ID0gW107XG4gICAgdGhpcy50YWJsZUFycmF5ID0gW107XG4gICAgdGhpcy5zZWN0aW9uQXJyYXkgPSBbXTtcbiAgICB0aGlzLnN0YXRlRmxvdyA9IHtcbiAgICAgIGRlZmF1bHRTdGF0ZTogJycsXG4gICAgICBzdGF0ZXM6IFtdLFxuICAgICAgc3RhdGVEZXNjcmlwdGlvbnM6IFtdLFxuICAgICAgdHJhbnNpdGlvbnM6IFtdLFxuICAgIH07XG4gIH1cblxuICBsb2FkRGVmaW5pdGlvbihkZWZpbml0aW9uUmVjZWl2ZWQpIHtcbiAgICB0aGlzLnN0YXRlID0gJyc7XG4gICAgbGV0IGFsbFN0YXRlcyA9IFtdO1xuICAgIHRoaXMuY2xlYW5Gb3JtKCk7XG4gICAgaWYgKCFkZWZpbml0aW9uUmVjZWl2ZWQpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lID8/IGRlZmluaXRpb25SZWNlaXZlZD8uZm9ybT8uZm9ybUNvZGU7XG4gICAgdGhpcy50aXRsZSA9IChkZWZpbml0aW9uUmVjZWl2ZWQuZm9ybSAmJiBkZWZpbml0aW9uUmVjZWl2ZWQuZm9ybS5mb3JtVGl0bGUpXG4gICAgICA/IGRlZmluaXRpb25SZWNlaXZlZC5mb3JtLmZvcm1UaXRsZSA6ICcnO1xuICAgIGFsbFN0YXRlcyA9IGRlZmluaXRpb25SZWNlaXZlZD8uc3RhdGVzO1xuICAgIHRoaXMuc2V0U3RhdGVGbG93KGRlZmluaXRpb25SZWNlaXZlZD8uc3RhdGVzLCBkZWZpbml0aW9uUmVjZWl2ZWQ/LnRyYW5zaXRpb25zLFxuICAgICAgZGVmaW5pdGlvblJlY2VpdmVkPy5kZWZhdWx0U3RhdGUsIGRlZmluaXRpb25SZWNlaXZlZD8uc3RhdGVEZXNjcmlwdGlvbnMpO1xuICAgIHRoaXMuaW1tdXRhYmxlRGF0YSA9IGRlZmluaXRpb25SZWNlaXZlZC5pbW11dGFibGVEYXRhO1xuICAgIHRoaXMuZXh0cmFJbmZvID0gZGVmaW5pdGlvblJlY2VpdmVkLmV4dHJhSW5mbztcbiAgICB0aGlzLmN1c3RvbUF0dHJpYnV0ZXMgPSB7fTtcbiAgICBpZiAoZGVmaW5pdGlvblJlY2VpdmVkPy5jdXN0b21BdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLnNldEN1c3RvbUF0dHJpYnV0ZXMoZGVmaW5pdGlvblJlY2VpdmVkPy5jdXN0b21BdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgaWYgKGRlZmluaXRpb25SZWNlaXZlZC5hY3Rpb25zKSB7XG4gICAgICBjb25zdCBmb3JtQWN0aW9ucyA9IGRlZmluaXRpb25SZWNlaXZlZC5hY3Rpb25zLm1hcChvYmpEZWYgPT4ge1xuICAgICAgICBsZXQgdmlzaWJsZVN0YXRlcyA9IG9iakRlZi52aXNpYmxlU3RhdGVzXG4gICAgICAgICAgPz8gKG9iakRlZi5hY3Rpb25Nb2Rlcz8uc3BsaXQoJywnKT8ubWFwKHN0YXRlID0+IHN0YXRlLnRyaW0oKSk/LmZpbHRlcihzdGF0ZSA9PiBzdGF0ZSkpXG4gICAgICAgICAgPz8gW107XG4gICAgICAgIGxldCBlbmFibGVkU3RhdGVzID0gb2JqRGVmLmVuYWJsZWRTdGF0ZXMgPz8gb2JqRGVmLmVkaXRhYmxlU3RhdGVzID8/IFtdO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmlzaWJsZVN0YXRlcykgJiYgdHlwZW9mIHZpc2libGVTdGF0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmlzaWJsZVN0YXRlcyA9ICh2aXNpYmxlU3RhdGVzID09PSBuZXZlclZpc2libGUpID8gW10gOiBhbGxTdGF0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVuYWJsZWRTdGF0ZXMpICYmIHR5cGVvZiBlbmFibGVkU3RhdGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGVuYWJsZWRTdGF0ZXMgPSAoZW5hYmxlZFN0YXRlcyA9PT0gbmV2ZXJWaXNpYmxlKSA/IFtdIDogdmlzaWJsZVN0YXRlcztcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVkU3RhdGVzID0gZW5hYmxlZFN0YXRlcy5maWx0ZXIoc3RhdGUgPT4gdmlzaWJsZVN0YXRlcy5pbmNsdWRlcyhzdGF0ZSkpO1xuICAgICAgICByZXR1cm4geyAuLi5vYmpEZWYsIHZpc2libGVTdGF0ZXMsIGVuYWJsZWRTdGF0ZXMgfTtcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBhY3Rpb25SZWNlaXZlZCBvZiBmb3JtQWN0aW9ucykge1xuICAgICAgICBjb25zdCBnbG9iYWxBY3Rpb24gPSBuZXcgRm9ybUFjdGlvbihhY3Rpb25SZWNlaXZlZCwgdGhpcy5mb3JtQ29uZmlnKTtcbiAgICAgICAgY29uc3QgZ2xvYmFsQWN0aW9uQ29kZSA9IGdsb2JhbEFjdGlvbi5hY3Rpb25Db2RlO1xuICAgICAgICBpZiAoZ2xvYmFsQWN0aW9uQ29kZSkge1xuICAgICAgICAgIHRoaXMuYWN0aW9uQXJyYXkucHVzaChnbG9iYWxBY3Rpb24pO1xuICAgICAgICAgIHRoaXMuYWN0aW9uc1tnbG9iYWxBY3Rpb25Db2RlXSA9IGdsb2JhbEFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZpbml0aW9uUmVjZWl2ZWQuZmllbGRzKSB7XG4gICAgICBjb25zdCBmb3JtRmllbGRzID0gZGVmaW5pdGlvblJlY2VpdmVkLmZpZWxkcy5tYXAob2JqRGVmID0+IHtcbiAgICAgICAgbGV0IHZpc2libGVTdGF0ZXMgPSBvYmpEZWYudmlzaWJsZVN0YXRlc1xuICAgICAgICAgID8/IChvYmpEZWYuZmllbGRNb2Rlcz8uc3BsaXQoJywnKT8ubWFwKHN0YXRlID0+IHN0YXRlLnRyaW0oKSk/LmZpbHRlcihzdGF0ZSA9PiBzdGF0ZSkpXG4gICAgICAgICAgPz8gW107XG4gICAgICAgIGxldCBlbmFibGVkU3RhdGVzID0gb2JqRGVmLmVuYWJsZWRTdGF0ZXMgPz8gb2JqRGVmLmVkaXRhYmxlU3RhdGVzID8/IFtdO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmlzaWJsZVN0YXRlcykgJiYgdHlwZW9mIHZpc2libGVTdGF0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmlzaWJsZVN0YXRlcyA9ICh2aXNpYmxlU3RhdGVzID09PSBuZXZlclZpc2libGUpID8gW10gOiBhbGxTdGF0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVuYWJsZWRTdGF0ZXMpICYmIHR5cGVvZiBlbmFibGVkU3RhdGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGVuYWJsZWRTdGF0ZXMgPSAoZW5hYmxlZFN0YXRlcyA9PT0gbmV2ZXJWaXNpYmxlKSA/IFtdIDogdmlzaWJsZVN0YXRlcztcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVkU3RhdGVzID0gZW5hYmxlZFN0YXRlcy5maWx0ZXIoc3RhdGUgPT4gdmlzaWJsZVN0YXRlcy5pbmNsdWRlcyhzdGF0ZSkpO1xuICAgICAgICByZXR1cm4geyAuLi5vYmpEZWYsIHZpc2libGVTdGF0ZXMsIGVuYWJsZWRTdGF0ZXMgfTtcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBmaWVsZFJlY2VpdmVkIG9mIGZvcm1GaWVsZHMpIHtcbiAgICAgICAgY29uc3QgZmllbGRUb0FkZCA9IG5ldyBGaWVsZERlc2NyaXB0b3IoZmllbGRSZWNlaXZlZCwgdGhpcy5mb3JtQ29uZmlnKTtcbiAgICAgICAgY29uc3QgZmllbGRDb2RlID0gZmllbGRUb0FkZC5jb2RlO1xuICAgICAgICBpZiAoZmllbGRDb2RlKSB7XG4gICAgICAgICAgdGhpcy5maWVsZEFycmF5LnB1c2goZmllbGRUb0FkZCk7XG4gICAgICAgICAgdGhpcy5maWVsZHNbZmllbGRDb2RlXSA9IGZpZWxkVG9BZGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmaW5pdGlvblJlY2VpdmVkLnRhYmxlcykge1xuICAgICAgY29uc3QgdGFibGVzID0gZGVmaW5pdGlvblJlY2VpdmVkLnRhYmxlcy5tYXAob2JqRGVmID0+IHtcbiAgICAgICAgbGV0IHZpc2libGVTdGF0ZXMgPSBvYmpEZWYudmlzaWJsZVN0YXRlc1xuICAgICAgICAgID8/IChvYmpEZWYudGFibGVNb2Rlcz8uc3BsaXQoJywnKT8ubWFwKHN0YXRlID0+IHN0YXRlLnRyaW0oKSk/LmZpbHRlcihzdGF0ZSA9PiBzdGF0ZSkpXG4gICAgICAgICAgPz8gW107XG4gICAgICAgIGxldCBlbmFibGVkU3RhdGVzID0gb2JqRGVmLmVuYWJsZWRTdGF0ZXMgPz8gb2JqRGVmLmVkaXRhYmxlU3RhdGVzID8/IFtdO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmlzaWJsZVN0YXRlcykgJiYgdHlwZW9mIHZpc2libGVTdGF0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmlzaWJsZVN0YXRlcyA9ICh2aXNpYmxlU3RhdGVzID09PSBuZXZlclZpc2libGUpID8gW10gOiBhbGxTdGF0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVuYWJsZWRTdGF0ZXMpICYmIHR5cGVvZiBlbmFibGVkU3RhdGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGVuYWJsZWRTdGF0ZXMgPSAoZW5hYmxlZFN0YXRlcyA9PT0gbmV2ZXJWaXNpYmxlKSA/IFtdIDogdmlzaWJsZVN0YXRlcztcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVkU3RhdGVzID0gZW5hYmxlZFN0YXRlcy5maWx0ZXIoc3RhdGUgPT4gdmlzaWJsZVN0YXRlcy5pbmNsdWRlcyhzdGF0ZSkpO1xuICAgICAgICByZXR1cm4geyAuLi5vYmpEZWYsIHZpc2libGVTdGF0ZXMsIGVuYWJsZWRTdGF0ZXMgfTtcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCB0YWJsZVJlY2VpdmVkIG9mIHRhYmxlcykge1xuICAgICAgICBjb25zdCB0YWJsZVRvQWRkID0gbmV3IFJlY29yZFRhYmxlKHRhYmxlUmVjZWl2ZWQsIHRoaXMuZm9ybUNvbmZpZyk7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29kZSA9IHRhYmxlVG9BZGQudGFibGVDb2RlO1xuICAgICAgICBpZiAodGFibGVDb2RlKSB7XG4gICAgICAgICAgdGhpcy50YWJsZUFycmF5LnB1c2godGFibGVUb0FkZCk7XG4gICAgICAgICAgdGhpcy50YWJsZXNbdGFibGVDb2RlXSA9IHRhYmxlVG9BZGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmaW5pdGlvblJlY2VpdmVkLnNlY3Rpb25zKSB7XG4gICAgICBjb25zdCBmb3JtU2VjdGlvbnMgPSBkZWZpbml0aW9uUmVjZWl2ZWQuc2VjdGlvbnMubWFwKG9iakRlZiA9PiB7XG4gICAgICAgIGxldCB2aXNpYmxlU3RhdGVzID0gb2JqRGVmLnZpc2libGVTdGF0ZXNcbiAgICAgICAgICA/PyAob2JqRGVmLnNlY3Rpb25Nb2Rlcz8uc3BsaXQoJywnKT8ubWFwKHN0YXRlID0+IHN0YXRlLnRyaW0oKSk/LmZpbHRlcihzdGF0ZSA9PiBzdGF0ZSkpXG4gICAgICAgICAgPz8gW107XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2aXNpYmxlU3RhdGVzKSAmJiB0eXBlb2YgdmlzaWJsZVN0YXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2aXNpYmxlU3RhdGVzID0gKHZpc2libGVTdGF0ZXMgPT09IG5ldmVyVmlzaWJsZSkgPyBbXSA6IGFsbFN0YXRlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyAuLi5vYmpEZWYsIHZpc2libGVTdGF0ZXMgfTtcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBzZWN0aW9uUmVjZWl2ZWQgb2YgZm9ybVNlY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25Ub0FkZCA9IG5ldyBSZWNvcmRGb3JtU2VjdGlvbihzZWN0aW9uUmVjZWl2ZWQsIHRoaXMsIHRoaXMuZm9ybUNvbmZpZyk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25Db2RlID0gc2VjdGlvblRvQWRkLnNlY3Rpb25Db2RlO1xuICAgICAgICBpZiAoc2VjdGlvbkNvZGUpIHtcbiAgICAgICAgICB0aGlzLnNlY3Rpb25BcnJheS5wdXNoKHNlY3Rpb25Ub0FkZCk7XG4gICAgICAgICAgdGhpcy5zZWN0aW9uc1tzZWN0aW9uQ29kZV0gPSBzZWN0aW9uVG9BZGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBFc3RhZG9zXG4gIGdldCBkZWZhdWx0U3RhdGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3RhdGVGbG93LmRlZmF1bHRTdGF0ZTsgfVxuICBnZXQgc3RhdGVzKCk6IGFueVtdIHsgcmV0dXJuIHRoaXMuc3RhdGVGbG93LnN0YXRlczsgfVxuICBnZXQgc3RhdGVEZXNjcmlwdGlvbnMoKTogYW55W10geyByZXR1cm4gdGhpcy5zdGF0ZUZsb3cuc3RhdGVEZXNjcmlwdGlvbnM7IH1cbiAgc3VwcG9ydFN0YXRlKHN0YXRlOiBzdHJpbmcgPSAnJyk6IGJvb2xlYW4geyByZXR1cm4gKCEhc3RhdGUgJiYgdGhpcy5zdGF0ZUZsb3cuc3RhdGVzPy5pbmNsdWRlcyhzdGF0ZSkpOyB9XG5cbiAgZ2V0TmV4dFN0YXRlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVGbG93LnRyYW5zaXRpb25zLmZpbHRlcih0cm5zID0+IHRybnMuc291cmNlID09PSB0aGlzLnN0YXRlKVxuICAgICAgLm1hcCh0cm5zID0+IHRybnMuZGVzdGluYXRpb24pO1xuICB9XG5cbiAgY2hhbmdlU3RhdGUobmV3U3RhdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKCFuZXdTdGF0ZSB8fCAhdGhpcy5zdXBwb3J0U3RhdGUobmV3U3RhdGUpIHx8IGN1cnJlbnRTdGF0ZSA9PT0gbmV3U3RhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnN0YXRlKSB7XG4gICAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRyYW5zaXRpb25Ub0NoYW5nZSA9IHRoaXMuc3RhdGVGbG93LnRyYW5zaXRpb25zLmZpbmQodHJucyA9PlxuICAgICAgICB0cm5zLnNvdXJjZSA9PT0gdGhpcy5zdGF0ZSAmJiB0cm5zLmRlc3RpbmF0aW9uID09PSBuZXdTdGF0ZSk7XG4gICAgICBpZiAodHJhbnNpdGlvblRvQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2UubmV4dCh7IHN0YXRlOiB0aGlzLnN0YXRlIH0pO1xuICAgIHJldHVybiAodGhpcy5zdGF0ZSA9PT0gbmV3U3RhdGUpO1xuICB9XG5cbiAgZ2V0IHN0YXRlQ2hhbmdlKCkgeyByZXR1cm4gdGhpcy5fc3RhdGVDaGFuZ2U7IH1cblxuICBzZXRTdGF0ZUZsb3coc3RhdGVzPywgdHJhbnNpdGlvbnM/LCBkZWZhdWx0U3RhdGU/OiBzdHJpbmcsIHN0YXRlRGVzY3JpcHRpb25zID0gW10pOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlRmxvdy5zdGF0ZXMgPSBzdGF0ZXM7XG4gICAgdGhpcy5zdGF0ZUZsb3cuc3RhdGVEZXNjcmlwdGlvbnMgPSBzdGF0ZURlc2NyaXB0aW9ucztcbiAgICB0aGlzLnN0YXRlRmxvdy5kZWZhdWx0U3RhdGUgPSBkZWZhdWx0U3RhdGUgfHwgdGhpcy5zdGF0ZUZsb3cuc3RhdGVzWzBdO1xuICAgIHRoaXMuc3RhdGVGbG93LnRyYW5zaXRpb25zID0gdHJhbnNpdGlvbnMubWFwKHRyYW5zaXRpb24gPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHRyYW5zaXRpb24ubmFtZTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9ICh0aGlzLnN0YXRlRmxvdy5zdGF0ZXMuaW5jbHVkZXModHJhbnNpdGlvbi5zb3VyY2UpKSA/IHRyYW5zaXRpb24uc291cmNlIDogJyc7XG4gICAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICh0aGlzLnN0YXRlRmxvdy5zdGF0ZXMuaW5jbHVkZXModHJhbnNpdGlvbi5kZXN0aW5hdGlvbikpID8gdHJhbnNpdGlvbi5kZXN0aW5hdGlvbiA6ICcnO1xuICAgICAgcmV0dXJuIHsgbmFtZSwgc291cmNlLCBkZXN0aW5hdGlvbiB9O1xuICAgIH0pLmZpbHRlcihpdGVtID0+IGl0ZW0ubmFtZSAmJiBpdGVtLnNvdXJjZSAmJiBpdGVtLmRlc3RpbmF0aW9uKTtcbiAgfVxuXG4gIC8vIGltbXV0YWJsZSBEYXRhXG4gIGdldEltbXV0YWJsZUVsZW1lbnQobmFtZTogc3RyaW5nKTogYW55IHsgcmV0dXJuIHRoaXMuX2ltbXV0YWJsZURhdGE/LltuYW1lXT8udmFsdWUgPz8gbnVsbDsgfVxuICBzZXQgaW1tdXRhYmxlRGF0YShpbW11dGFibGVEYXRhKSB7IE9iamVjdC5hc3NpZ24odGhpcy5faW1tdXRhYmxlRGF0YSwgaW1tdXRhYmxlRGF0YSk7IH1cbiAgZ2V0IGltbXV0YWJsZURhdGEoKTogYW55IHsgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5faW1tdXRhYmxlRGF0YSkpOyB9XG5cbiAgLy8gZXh0cmEgSW5mb1xuICBnZXRFeHRyYUluZm8obmFtZTogc3RyaW5nKTogYW55IHsgcmV0dXJuIHRoaXMuX2V4dHJhSW5mbz8uW25hbWVdPy52YWx1ZSA/PyBudWxsOyB9XG4gIHNldCBleHRyYUluZm8oZXh0cmFJbmZvKSB7IE9iamVjdC5hc3NpZ24odGhpcy5fZXh0cmFJbmZvLCBleHRyYUluZm8pOyB9XG4gIGdldCBleHRyYUluZm8oKTogYW55IHsgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5fZXh0cmFJbmZvKSk7IH1cblxuICAvLyBDdXN0b20gQXR0cmlidXRlc1xuICBnZXRDdXN0b21BdHRyaWJ1dGUobmFtZTogc3RyaW5nKTogYW55IHsgcmV0dXJuIHRoaXMuY3VzdG9tQXR0cmlidXRlcz8uW25hbWVdID8/IG51bGw7IH1cbiAgc2V0Q3VzdG9tQXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQgeyBpZiAobmFtZSkgeyB0aGlzLmN1c3RvbUF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTsgfSB9XG4gIHNldEN1c3RvbUF0dHJpYnV0ZXMoYXR0cmlidXRlczogYW55KTogRm9ybVN0cnVjdHVyZUFuZERhdGEge1xuICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykuZm9yRWFjaCgoW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICB0aGlzLnNldEN1c3RvbUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBGaWVsZHNcbiAgZ2V0IGZpZWxkTmFtZXMoKTogc3RyaW5nW10geyByZXR1cm4gdGhpcy5nZXRGaWVsZE5hbWVzKCk7IH1cbiAgZ2V0RmllbGRzKCk6IEZpZWxkRGVzY3JpcHRvcltdIHsgcmV0dXJuIHRoaXMuZmllbGRBcnJheTsgfVxuICBnZXRGaWVsZE5hbWVzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuZmllbGRBcnJheS5tYXAoZmllbGQgPT4gZmllbGQuY29kZSk7IH1cbiAgZ2V0RmllbGQoY29kZTogc3RyaW5nKTogRmllbGREZXNjcmlwdG9yIHsgcmV0dXJuIChjb2RlICYmIHRoaXMuZmllbGRzPy5bY29kZV0pID8gdGhpcy5maWVsZHNbY29kZV0gOiBudWxsOyB9XG4gIGVuYWJsZUZpZWxkKGNvZGU6IHN0cmluZyk6IHZvaWQgeyB0aGlzLmdldEZpZWxkKGNvZGUpPy5lbmFibGUoKTsgfVxuICBkaXNhYmxlRmllbGQoY29kZTogc3RyaW5nKTogdm9pZCB7IHRoaXMuZ2V0RmllbGQoY29kZSk/LmRpc2FibGUoKTsgfVxuICBnZXRGaWVsZFZhbHVlKGNvZGU6IHN0cmluZyk6IGFueSB7IHJldHVybiB0aGlzLmdldEZpZWxkKGNvZGUpPy52YWx1ZTsgfVxuICBnZXRGaWVsZE9wdGlvblRleHQoY29kZTogc3RyaW5nKTogYW55IHsgcmV0dXJuIHRoaXMuZ2V0RmllbGQoY29kZSk/Lm9wdGlvblRleHQ7IH1cbiAgZ2V0RmllbGRPcHRpb25zKGNvZGU6IHN0cmluZyk6IEZpZWxkT3B0aW9uW10gfCBudWxsIHsgcmV0dXJuIHRoaXMuZ2V0RmllbGQoY29kZSk/Lm9wdGlvbnMgPz8gbnVsbDsgfVxuICBzZXRGaWVsZFZhbHVlKGNvZGU6IHN0cmluZywgdmFsdWU6IGFueSk6IGFueSB7IHRoaXMuZ2V0RmllbGQoY29kZSk/LnNldFZhbHVlKHZhbHVlKTsgfVxuICBzZXRGaWVsZEVycm9yKGNvZGU6IHN0cmluZywgZXJyb3JDb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgdHlwZTogc3RyaW5nID0gJ2Vycm9yJyk6IGFueSB7IHRoaXMuZ2V0RmllbGQoY29kZSk/LnNldEVycm9yKGVycm9yQ29kZSwgbWVzc2FnZSwgdHlwZSk7IH1cbiAgc2V0RmllbGRJbnRyaW5zaWNFcnJvck1lc3NhZ2UoY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiBhbnkgeyB0aGlzLmdldEZpZWxkKGNvZGUpPy5zZXRJbnRyaW5zaWNFcnJvck1lc3NhZ2UobWVzc2FnZSk7IH1cblxuICBzZXRGaWVsZFJlcXVpcmVkKGlucHV0Q29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgcmVxdWlyZWQ6IGJvb2xlYW4pOiBhbnkge1xuICAgIGNvbnN0IGNvZGVzID0gdGhpcy5nZXRGaWVsZFNldChudWxsLCBpbnB1dENvZGVzID8/IG51bGwpO1xuICAgIGZvciAoY29uc3QgY29kZSBvZiBjb2Rlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmdldEZpZWxkKGNvZGUpID8/IG51bGw7XG4gICAgICAgIGZpZWxkICYmIChmaWVsZC5yZXF1aXJlZCA9IHJlcXVpcmVkKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEVycm9yIG1vZGlmaWNhbmRvIGNhbXBvICR7Y29kZX06ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRGaWVsZEVycm9yTWVzc2FnZShjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IGFueSB7IHRoaXMuZ2V0RmllbGQoY29kZSk/LnNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsgfVxuXG4gIHNldEZpZWxkT3B0aW9ucyhjb2RlOiBzdHJpbmcsIG9wdGlvbnNBcnJheTogYW55W10sIGlkQXR0cmlidXRlOiBzdHJpbmcsIG5hbWVBdHRyaWJ1dGU6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmdldEZpZWxkKGNvZGUpO1xuICAgIGlmIChmaWVsZCAmJiBvcHRpb25zQXJyYXkpIHtcbiAgICAgIGNvbnN0IGZpZWxkT3B0aW9ucyA9IG9wdGlvbnNBcnJheS5tYXAoaXRlbSA9PiAoe1xuICAgICAgICBmaWVsZE9wdGlvbklkOiBpdGVtW2lkQXR0cmlidXRlXSxcbiAgICAgICAgZmllbGRPcHRpb25WYWx1ZTogaXRlbVtuYW1lQXR0cmlidXRlXVxuICAgICAgfSkpO1xuICAgICAgZmllbGQuc2V0RmllbGRPcHRpb25zKGZpZWxkT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RmllbGRTZXQoZmlsdGVyLCBpbnB1dENvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcgfCBudWxsLCBzdWJDb2RlPzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZ1tdIHtcbiAgICBsZXQgY29kZXM6IGFueVtdID0gW107XG4gICAgaWYgKGlucHV0Q29kZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5wdXRDb2RlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29kZXMgPSBbaW5wdXRDb2Rlc107XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXRDb2RlcykgJiYgaW5wdXRDb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvZGVzID0gaW5wdXRDb2RlcyA/PyBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNlY0NvZGUgJiYgIXN1YkNvZGUpIHtcbiAgICAgIGNvZGVzID0gdGhpcy5nZXRTZWN0aW9uKHNlY0NvZGUpPy5nZXRGaWVsZE5hbWVzKCkgPz8gW107XG4gICAgfSBlbHNlIGlmIChzZWNDb2RlICYmIHN1YkNvZGUpIHtcbiAgICAgIGNvZGVzID0gdGhpcy5nZXRTdWJTZWN0aW9uKHNlY0NvZGUsIHN1YkNvZGUpPy5nZXRGaWVsZE5hbWVzKCkgPz8gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGVzID0gdGhpcy5nZXRGaWVsZE5hbWVzKCkgPz8gW107XG4gICAgfVxuICAgIHJldHVybiAoZmlsdGVyKSA/IGNvZGVzLmZpbHRlcihmbGQgPT4gZmlsdGVyKHRoaXMuZ2V0RmllbGQoZmxkKSkpIDogY29kZXM7XG4gIH1cblxuICBhcHBseU9uRmllbGRzKHByb2Nlc3NGdW5jLCBpbnB1dENvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIXByb2Nlc3NGdW5jKSB7IHJldHVybiAwOyB9XG4gICAgY29uc3QgY29kZXMgPSB0aGlzLmdldEZpZWxkU2V0KG51bGwsIGlucHV0Q29kZXMgPz8gbnVsbCwgc2VjQ29kZSwgc3ViQ29kZSk7XG4gICAgbGV0IHByb2Nlc3NlZEZpZWxkcyA9IDA7XG4gICAgZm9yIChjb25zdCBjb2RlIG9mIGNvZGVzKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2V0RmllbGQoY29kZSk7XG4gICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwcm9jZXNzRnVuYyhmaWVsZCk7XG4gICAgICAgICAgcHJvY2Vzc2VkRmllbGRzICs9IDE7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcHJvY2VzYW5kbyBmdW5jaW9uIGVuIGNhbXBvICR7ZmllbGR9OiAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NlZEZpZWxkcztcbiAgfVxuXG4gIGFwcGx5UHJvY2Vzc1RvQWxsRmllbGRzKHByb2Nlc3NGdW5jKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlPbkZpZWxkcyhwcm9jZXNzRnVuYyk7XG4gIH1cblxuICBlbmFibGVGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFwcGx5T25GaWVsZHMoZmxkID0+IGZsZD8uZW5hYmxlKCksIGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuXG4gIHNob3dGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFwcGx5T25GaWVsZHMoZmxkID0+IGZsZD8uc2hvdygpLCBjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBoaWRlRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseU9uRmllbGRzKGZsZCA9PiBmbGQ/LmhpZGUoKSwgY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG5cbiAgc2hvd0xhYmVsRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseU9uRmllbGRzKGZsZCA9PiBmbGQ/LnNob3dMYWJsZWwoKSwgY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG5cbiAgaGlkZUxhYmVsRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseU9uRmllbGRzKGZsZCA9PiBmbGQ/LmhpZGVMYWJlbCgpLCBjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBkaXNhYmxlRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseU9uRmllbGRzKGZsZCA9PiBmbGQ/LmRpc2FibGUoKSwgY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG5cbiAgY2xlYW5GaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFwcGx5T25GaWVsZHMoZmxkID0+IGZsZD8uY2xlYW4oKSwgY29kZXMsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG5cbiAgdGFnRmllbGRzV2l0aEVycm9yKG1lc3NhZ2U6IHN0cmluZywgY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFwcGx5T25GaWVsZHMoZmxkID0+IGZsZD8uc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpLCBjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBjbGVhbkVycm9yRmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50YWdGaWVsZHNXaXRoRXJyb3IoJycsIGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuXG4gIHRhZ0VtcHR5UmVxdWlyZWRGaWVsZHMobWVzc2FnZTogc3RyaW5nLCBjb2RlcyA9IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWdGaWVsZHNXaXRoRXJyb3IobWVzc2FnZSwgdGhpcy5nZXRSZXF1aXJlZEVtcHR5RmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKSkgPiAwO1xuICB9XG5cbiAgZ2V0UmVxdWlyZWRGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRTZXQoZmxkID0+IGZsZD8ucmVxdWlyZWQsIGNvZGVzID8/IG51bGwsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICB9XG5cbiAgZ2V0UmVxdWlyZWRFbXB0eUZpZWxkcyhjb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZywgb25seVZpc2libGU/OiBib29sZWFuKTogc3RyaW5nW10ge1xuICAgIGlmIChvbmx5VmlzaWJsZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRTZXQoZmxkID0+IGZsZD8ucmVxdWlyZWQgJiYgZmxkPy52aXNpYmxlICYmIGZsZD8uZW1wdHksIGNvZGVzID8/IG51bGwsIHNlY0NvZGUsIHN1YkNvZGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRGaWVsZFNldChmbGQgPT4gZmxkPy5yZXF1aXJlZCAmJiBmbGQ/LmVtcHR5LCBjb2RlcyA/PyBudWxsLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuXG4gIGdldENoYW5nZWRGaWVsZHMoY29kZXM/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIHNlY0NvZGU/OiBzdHJpbmcsIHN1YkNvZGU/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRTZXQoZmxkID0+ICFmbGQ/Lm91dHB1dE9ubHkgJiYgZmxkPy5oYXNDaGFuZ2VkLCBjb2RlcyA/PyBudWxsLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuXG4gIGdldEZpZWxkc1dpdGhWYWxpZGF0aW9uSXNzdWVzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nLCBvbmx5VmlzaWJsZT86IGJvb2xlYW4pOiBzdHJpbmdbXSB7XG4gICAgaWYgKG9ubHlWaXNpYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZFNldChmbGQgPT4gKGZsZD8uaGFzRXJyb3IoKSAmJiBmbGQ/LnZpc2libGUpLCBjb2RlcyA/PyBudWxsLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRTZXQoZmxkID0+IGZsZD8uaGFzRXJyb3IoKSwgY29kZXMgPz8gbnVsbCwgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICBnZXRGaWVsZHNWYWx1ZXMoaW5wdXRDb2Rlcz86IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgc2VjQ29kZT86IHN0cmluZywgc3ViQ29kZT86IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgY29kZXMgPSB0aGlzLmdldEZpZWxkU2V0KG51bGwsIGlucHV0Q29kZXMgPz8gbnVsbCwgc2VjQ29kZSwgc3ViQ29kZSk7XG4gICAgY29uc3QgcmVzdWx0T2JqZWN0ID0ge307XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvZGVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgY29kZSA9IGNvZGVzW2luZGV4XTtcbiAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgIHJlc3VsdE9iamVjdFtjb2RlXSA9IHRoaXMuZmllbGRzPy5bY29kZV0/LmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdE9iamVjdDtcbiAgfVxuXG4gIC8vIEFjY2lvbmVzXG4gIGdldEFjdGlvbnMoKTogRm9ybUFjdGlvbltdIHsgcmV0dXJuIHRoaXMuYWN0aW9uQXJyYXk7IH1cbiAgZ2V0QWN0aW9uKGNvZGU6IHN0cmluZyk6IEZvcm1BY3Rpb24geyByZXR1cm4gKGNvZGUgJiYgdGhpcy5hY3Rpb25zPy5bY29kZV0pID8gdGhpcy5hY3Rpb25zW2NvZGVdIDogbnVsbDsgfVxuICBzaG93QWN0aW9ucyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHsgcmV0dXJuIHRoaXMuZXhlY09uQWN0aW9ucyhjb2RlcywgU0hPVyk7IH1cbiAgaGlkZUFjdGlvbnMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7IHJldHVybiB0aGlzLmV4ZWNPbkFjdGlvbnMoY29kZXMsIEhJREUpOyB9XG4gIGVuYWJsZUFjdGlvbnMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7IHJldHVybiB0aGlzLmV4ZWNPbkFjdGlvbnMoY29kZXMsIEVOQUJMRSk7IH1cbiAgZGlzYWJsZUFjdGlvbnMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7IHJldHVybiB0aGlzLmV4ZWNPbkFjdGlvbnMoY29kZXMsIERJU0FCTEUpOyB9XG4gIGVuYWJsZUFjdGlvbihjb2RlOiBzdHJpbmcpOiB2b2lkIHsgcmV0dXJuIHRoaXMuZW5hYmxlQWN0aW9ucyhjb2RlKTsgfVxuICBkaXNhYmxlQWN0aW9uKGNvZGU6IHN0cmluZyk6IHZvaWQgeyByZXR1cm4gdGhpcy5kaXNhYmxlQWN0aW9ucyhjb2RlKTsgfVxuICBzaG93QWN0aW9uKGNvZGU6IHN0cmluZyk6IHZvaWQgeyByZXR1cm4gdGhpcy5zaG93QWN0aW9ucyhjb2RlKTsgfVxuICBoaWRlQWN0aW9uKGNvZGU6IHN0cmluZyk6IHZvaWQgeyByZXR1cm4gdGhpcy5oaWRlQWN0aW9ucyhjb2RlKTsgfVxuICBnZXRIZWFkZXJBY3Rpb25zKCkgeyByZXR1cm4gdGhpcy5nZXRBY3Rpb25zQnlBdHRyaWJ1dGUoJ2xvY2F0aW9uJywgSEVBREVSKTsgfVxuXG4gIGdldEFjdGlvbnNCeUF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlKTogRm9ybUFjdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5hY3Rpb25BcnJheS5maWx0ZXIoYWN0aW9uSXRlbSA9PiBhY3Rpb25JdGVtLm1hdGNoQXR0cmlidXRlKG5hbWUsIHZhbHVlKSk7XG4gIH1cblxuICBleGVjT25BY3Rpb25zKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGZ1bmN0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aW9uQ29kZXMgPSAoQXJyYXkuaXNBcnJheShjb2RlcykpID8gY29kZXMgOiAoY29kZXMgPyBbY29kZXNdIDogW10pO1xuICAgIGlmICghZnVuY3Rpb25OYW1lIHx8IGFjdGlvbkNvZGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cbiAgICBhY3Rpb25Db2Rlcy5mb3JFYWNoKGNvZGUgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5nZXRBY3Rpb24oY29kZSk7XG4gICAgICBhY3Rpb24/LltmdW5jdGlvbk5hbWVdPy4oKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRhYmxhc1xuICBnZXRUYWJsZXMoKTogUmVjb3JkVGFibGVbXSB7IHJldHVybiB0aGlzLnRhYmxlQXJyYXk7IH1cbiAgZ2V0VGFibGUoY29kZTogc3RyaW5nKTogUmVjb3JkVGFibGUgeyByZXR1cm4gKGNvZGUgJiYgdGhpcy50YWJsZXM/Lltjb2RlXSkgPyB0aGlzLnRhYmxlc1tjb2RlXSA6IG51bGw7IH1cbiAgZ2V0VGFibGVSZWNvcmQoY29kZTogc3RyaW5nLCBpZDogc3RyaW5nKTogVGFibGVSZWNvcmREYXRhIHsgcmV0dXJuIHRoaXMuZ2V0VGFibGUoY29kZSk/LmdldFRhYmxlUmVjb3JkKGlkKSB9XG4gIGVuYWJsZVRhYmxlcyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHsgcmV0dXJuIHRoaXMuZXhlY09uVGFibGVzKGNvZGVzLCBFTkFCTEUpOyB9XG4gIGRpc2FibGVUYWJsZXMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7IHJldHVybiB0aGlzLmV4ZWNPblRhYmxlcyhjb2RlcywgRElTQUJMRSk7IH1cbiAgc2hvd1RhYmxlcyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHsgcmV0dXJuIHRoaXMuZXhlY09uVGFibGVzKGNvZGVzLCBTSE9XKTsgfVxuICBoaWRlVGFibGVzKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyk6IHZvaWQgeyByZXR1cm4gdGhpcy5leGVjT25UYWJsZXMoY29kZXMsIEhJREUpOyB9XG4gIGNsZWFuVGFibGVzKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyk6IHZvaWQgeyByZXR1cm4gdGhpcy5leGVjT25UYWJsZXMoY29kZXMsIENMRUFOKTsgfVxuICBzaG93VGFibGUoY29kZTogc3RyaW5nKSB7IHJldHVybiB0aGlzLnNob3dUYWJsZXMoY29kZSk7IH1cbiAgaGlkZVRhYmxlKGNvZGU6IHN0cmluZykgeyByZXR1cm4gdGhpcy5oaWRlVGFibGVzKGNvZGUpOyB9XG4gIGNsZWFuVGFibGUoY29kZTogc3RyaW5nKSB7IHJldHVybiB0aGlzLmdldFRhYmxlKGNvZGUpPy5jbGVhbigpOyB9XG5cbiAgZXhlY09uVGFibGVzKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGZ1bmN0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGFibGVDb2RlcyA9IChBcnJheS5pc0FycmF5KGNvZGVzKSkgPyBjb2RlcyA6IChjb2RlcyA/IFtjb2Rlc10gOiBbXSk7XG4gICAgaWYgKCFmdW5jdGlvbk5hbWUgfHwgdGFibGVDb2Rlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgdGFibGVDb2Rlcy5mb3JFYWNoKGNvZGUgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmdldFRhYmxlKGNvZGUpO1xuICAgICAgdGFibGU/LltmdW5jdGlvbk5hbWVdPy4oKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNlY2Npb25lc1xuICBnZXRTZWN0aW9ucygpOiBSZWNvcmRGb3JtU2VjdGlvbltdIHsgcmV0dXJuIHRoaXMuc2VjdGlvbkFycmF5OyB9XG4gIGdldFNlY3Rpb25zVGl0bGVzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuZ2V0U2VjdGlvbnMoKT8uZmlsdGVyKHNlYyA9PiBzZWM/LnRpdGxlKS5tYXAoc2VjID0+IHNlYz8udGl0bGUgPz8gJycpOyB9XG4gIG51bVNlY3Rpb25zKCk6IG51bWJlciB7IHJldHVybiB0aGlzLnNlY3Rpb25BcnJheS5sZW5ndGg7IH1cbiAgZ2V0U2VjdGlvbnNCeUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk6IFJlY29yZEZvcm1TZWN0aW9uW10geyByZXR1cm4gdGhpcy5zZWN0aW9uQXJyYXkuZmlsdGVyKGl0ZW0gPT4gaXRlbS5tYXRjaEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkpOyB9XG4gIGdldCBzZWN0aW9uVGl0bGVzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuZ2V0U2VjdGlvbnNUaXRsZXMoKTsgfVxuICBnZXQgdmlzaWJsZVNlY3Rpb25zKCk6IFJlY29yZEZvcm1TZWN0aW9uW10geyByZXR1cm4gdGhpcy5zZWN0aW9uQXJyYXkuZmlsdGVyKHNlYyA9PiBzZWMuYWJzb2x1dGVWaXNpYmxlKTsgfVxuICBnZXRTZWN0aW9uKGNvZGU6IHN0cmluZyk6IFJlY29yZEZvcm1TZWN0aW9uIHsgcmV0dXJuIChjb2RlICYmIHRoaXMuc2VjdGlvbnM/Lltjb2RlXSkgPyB0aGlzLnNlY3Rpb25zW2NvZGVdIDogbnVsbDsgfVxuICBzaG93U2VjdGlvbnMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7IHRoaXMuZXhlY09uU2VjdGlvbnMoY29kZXMsIFNIT1cpOyB9XG4gIGhpZGVTZWN0aW9ucyhjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHsgdGhpcy5leGVjT25TZWN0aW9ucyhjb2RlcywgSElERSk7IH1cbiAgc2hvd1NlY3Rpb24oY29kZTogc3RyaW5nKTogdm9pZCB7IHJldHVybiB0aGlzLnNob3dTZWN0aW9ucyhjb2RlKTsgfVxuICBoaWRlU2VjdGlvbihjb2RlOiBzdHJpbmcpOiB2b2lkIHsgcmV0dXJuIHRoaXMuaGlkZVNlY3Rpb25zKGNvZGUpOyB9XG4gIGFjdGl2ZVNlY3Rpb24oKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2V4Y2x1c2l2ZVNlY3Rpb25zQnlBdHRyW0FDVElWRV07IH1cbiAgZ2V0U3ViU2VjdGlvbihjb2RlOiBzdHJpbmcsIHN1YkNvZGUpOiBSZWNvcmRGb3JtU3ViU2VjdGlvbiB7IHJldHVybiB0aGlzLmdldFNlY3Rpb24oY29kZSk/LmdldFN1YnNlY3Rpb24oc3ViQ29kZSkgPz8gbnVsbDsgfVxuICBzaG93U3ViU2VjdGlvbnMoY29kZTogc3RyaW5nLCBzdWJDb2Rlczogc3RyaW5nW10gfCBzdHJpbmcpOiB2b2lkIHsgcmV0dXJuIHRoaXMuZXhlY09uU3ViU2VjdGlvbnMoY29kZSwgc3ViQ29kZXMsIFNIT1cpOyB9XG4gIHNob3dTdWJTZWN0aW9uKGNvZGU6IHN0cmluZywgc3ViQ29kZTogc3RyaW5nKTogdm9pZCB7IHJldHVybiB0aGlzLnNob3dTdWJTZWN0aW9ucyhjb2RlLCBzdWJDb2RlKTsgfVxuICBoaWRlU3ViU2VjdGlvbihjb2RlOiBzdHJpbmcsIHN1YkNvZGU6IHN0cmluZyk6IHZvaWQgeyByZXR1cm4gdGhpcy5oaWRlU3ViU2VjdGlvbnMoY29kZSwgc3ViQ29kZSk7IH1cbiAgaGlkZVN1YlNlY3Rpb25zKGNvZGU6IHN0cmluZywgc3ViQ29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogdm9pZCB7IHJldHVybiB0aGlzLmV4ZWNPblN1YlNlY3Rpb25zKGNvZGUsIHN1YkNvZGVzLCBISURFKTsgfVxuICBnZXRTZWN0aW9uQWN0aW9ucyhjb2RlKTogRm9ybUFjdGlvbltdIHsgcmV0dXJuIHRoaXMuZ2V0U2VjdGlvbihjb2RlKT8uZ2V0QWN0aW9ucygpID8/IG51bGw7IH1cbiAgZ2V0U2VjdGlvbkFjdGlvbk5hbWVzKGNvZGUpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLmdldFNlY3Rpb24oY29kZSk/LmdldEFjdGlvbk5hbWVzKCkgPz8gbnVsbDsgfVxuXG4gIGFjdGl2YXRlU2VjdGlvbihjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoY29kZSA9PT0gdGhpcy5fZXhjbHVzaXZlU2VjdGlvbnNCeUF0dHJbQUNUSVZFXSkgeyByZXR1cm47IH1cbiAgICB0aGlzLmdldFNlY3Rpb24odGhpcy5hY3RpdmVTZWN0aW9uKCkpPy5pbmFjdGl2YXRlKCk7XG4gICAgdGhpcy5nZXRTZWN0aW9uKGNvZGUpPy5hY3RpdmF0ZSgpO1xuICAgIHRoaXMuX2V4Y2x1c2l2ZVNlY3Rpb25zQnlBdHRyW0FDVElWRV0gPSBjb2RlO1xuICB9XG5cbiAgZXhlY09uU2VjdGlvbnMoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgZnVuY3Rpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZWN0aW9uQ29kZXMgPSAoQXJyYXkuaXNBcnJheShjb2RlcykpID8gY29kZXMgOiAoY29kZXMgPyBbY29kZXNdIDogW10pO1xuICAgIGlmICghZnVuY3Rpb25OYW1lIHx8IHNlY3Rpb25Db2Rlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG4gICAgc2VjdGlvbkNvZGVzLmZvckVhY2goY29kZSA9PiB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5nZXRTZWN0aW9uKGNvZGUpO1xuICAgICAgc2VjdGlvbj8uW2Z1bmN0aW9uTmFtZV0/LigpO1xuICAgIH0pO1xuICB9XG5cbiAgZXhlY09uU3ViU2VjdGlvbnMoY29kZTogc3RyaW5nLCBzdWJOYW1lczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBmdW5jdGlvbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHN1YkNvZGVzID0gKEFycmF5LmlzQXJyYXkoc3ViTmFtZXMpKSA/IHN1Yk5hbWVzIDogKHN1Yk5hbWVzID8gW3N1Yk5hbWVzXSA6IFtdKTtcbiAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5nZXRTZWN0aW9uKGNvZGUpO1xuICAgIGlmICghZnVuY3Rpb25OYW1lIHx8ICFzZWN0aW9uIHx8IHN1YkNvZGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cbiAgICBmb3IgKGNvbnN0IHN1YkNvZGUgb2Ygc3ViQ29kZXMpIHtcbiAgICAgIGNvbnN0IHN1YlNlY3Rpb24gPSB0aGlzLmdldFN1YlNlY3Rpb24oY29kZSwgc3ViQ29kZSk7XG4gICAgICBzdWJTZWN0aW9uPy5bZnVuY3Rpb25OYW1lXT8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG9zIHByb3Bpb3MgZGUgZ2VzdGnDs24gZGVsIGZvcm11bGFyaW9cbiAgICovXG5cbiAgY2xlYW5EYXRhKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZEFycmF5KSB7XG4gICAgICBmaWVsZC5zZXRWYWx1ZShmaWVsZC5kZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIHRoaXMudGFibGVBcnJheSkge1xuICAgICAgdGFibGUuY2xlYW4oKTtcbiAgICB9XG4gIH1cblxuICBnZXRQYXlsb2FkKCk6IGFueSB7XG4gICAgY29uc3QgZm9ybURhdGE6IEZvcm1QYXlsb2FkID0geyBmaWVsZHM6IFtdLCB0YWJsZXM6IFtdIH07XG4gICAgZm9ybURhdGEuZmllbGRzID0gdGhpcy5nZXRGaWVsZHMoKS5maWx0ZXIoZmxkID0+ICFmbGQ/Lm91dHB1dE9ubHkpXG4gICAgICAubWFwKGZsZCA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkUGF5bG9hZDogRmllbGRQYXlsb2FkID0ge1xuICAgICAgICAgIGZpZWxkQ29kZTogZmxkPy5jb2RlLFxuICAgICAgICAgIGZpZWxkVmFsdWU6IGZsZD8udmFsdWUsXG4gICAgICAgICAgZWRpdGFibGU6ICFmbGQ/LmFic29sdXRlRGlzYWJsZWQsXG4gICAgICAgICAgdmlzaWJsZTogZmxkPy5hYnNvbHV0ZVZpc2libGUsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZsZD8ucmVxdWlyZWQsXG4gICAgICAgICAgZmllbGRPcHRpb25zOiAnJyxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmllbGRQYXlsb2FkO1xuICAgICAgfSk7XG5cbiAgICBmb3JtRGF0YS50YWJsZXMgPSB0aGlzLmdldFRhYmxlcygpLm1hcCh0YmwgPT4ge1xuICAgICAgY29uc3QgdGFibGVQYXlsb2FkOiBUYWJsZVBheWxvYWQgPSB7XG4gICAgICAgIHRhYmxlQ29kZTogdGJsLnRhYmxlQ29kZSxcbiAgICAgICAgdmlzaWJsZTogdGJsLmFic29sdXRlVmlzaWJsZSxcbiAgICAgICAgY3VycmVudFBhZ2U6IHRibC5jdXJyZW50UGFnZSxcbiAgICAgICAgcmVxdWVzdGVkUGFnZTogdGJsLnJlcXVlc3RlZFBhZ2UsXG4gICAgICAgIHJlY29yZHNQZXJQYWdlOiB0YmwucmVjb3Jkc1BlclBhZ2UsXG4gICAgICAgIGN1cnJlbnRGaWx0ZXI6IHRibC5jdXJyZW50RmlsdGVyLFxuICAgICAgICBzb3J0aW5nQ29sdW1uOiB0Ymwuc29ydGluZy5jb2x1bW5OYW1lLFxuICAgICAgICBzb3J0aW5nRGlyZWN0aW9uOiB0Ymwuc29ydGluZy5kaXJlY3Rpb24sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRhYmxlUGF5bG9hZFxuICAgIH0pXG4gICAgcmV0dXJuIGZvcm1EYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBzdWJqZWN0XG4gICAqL1xuICBnZXQgZm9ybVN1YmplY3QoKSB7IHJldHVybiB0aGlzLnN1YmplY3Q7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHN1YmplY3RcbiAgICovXG4gIHNldCBmb3JtU3ViamVjdChzdWJqZWN0KSB7IHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHN0YXRlc1xuICAgKi9cbiAgZ2V0U3RhdGVzKCkgeyByZXR1cm4gdGhpcy5zdGF0ZXM7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHN0YXRlXG4gICAqL1xuICBnZXRDdXJyZW50U3RhdGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3RhdGU7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRpdGxlXG4gICAqL1xuICBnZXRUaXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy50aXRsZTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgdGl0bGVcbiAgICovXG4gIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHsgdGhpcy50aXRsZSA9IHRpdGxlOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBzdXBwb3J0U3RhdGVcbiAgICovXG4gIHN1cHBvcnRNb2RlKHN0YXRlOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc3VwcG9ydFN0YXRlKHN0YXRlKTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZW5hYmxlRmllbGRzXG4gICAqL1xuICBlbmFibGVFZGl0RmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlRmllbGRzKGNvZGVzLCBzZWNDb2RlLCBzdWJDb2RlKTtcbiAgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGRpc2FibGVGaWVsZHNcbiAgICovXG4gIGRpc2FibGVFZGl0RmllbGRzKGNvZGVzPzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBzZWNDb2RlPzogc3RyaW5nLCBzdWJDb2RlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZUZpZWxkcyhjb2Rlcywgc2VjQ29kZSwgc3ViQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEZpZWxkXG4gICAqL1xuICBnZXRGaWVsZE9iamVjdChjb2RlOiBzdHJpbmcpOiBGaWVsZERlc2NyaXB0b3IgfCBudWxsIHsgcmV0dXJuIHRoaXMuZ2V0RmllbGQoY29kZSk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEFjdGlvblxuICAgKi9cbiAgZ2V0QWN0aW9uT2JqZWN0KGNvZGU6IHN0cmluZyk6IEZvcm1BY3Rpb24gfCBudWxsIHsgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uKGNvZGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBnZXRUYWJsZVxuICAgKi9cbiAgZ2V0VGFibGVPYmplY3QoY29kZTogc3RyaW5nKTogUmVjb3JkVGFibGUgfCBudWxsIHsgcmV0dXJuIHRoaXMuZ2V0VGFibGUoY29kZSk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGdldFNlY3Rpb25cbiAgICovXG4gIGdldFNlY3Rpb25PYmplY3QoY29kZTogc3RyaW5nKTogUmVjb3JkRm9ybVNlY3Rpb24gfCBudWxsIHsgcmV0dXJuIHRoaXMuZ2V0U2VjdGlvbihjb2RlKTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgY2hhbmdlU3RhdGVcbiAgICovXG4gIGNoYW5nZUZvcm1Nb2RlKHN0YXRlOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY2hhbmdlU3RhdGUoc3RhdGUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBzdWJqZWN0XG4gICAqL1xuICBnZXRGb3JtU3ViamVjdCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5zdWJqZWN0OyB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugc3ViamVjdFxuICAgKi9cbiAgZ2V0U3ViamVjdCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5zdWJqZWN0ID8/ICcnOyB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugc3ViamVjdFxuICAgKi9cbiAgZ2V0Zm9ybVN1YmplY3QoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3ViamVjdCA/PyAnJzsgfVxuXG59XG4iXX0=