tuain-ng-forms-lib 17.4.0 → 19.0.1

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