tuain-ng-forms-lib 17.3.7 → 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 (71) hide show
  1. package/README.md +280 -335
  2. package/fesm2022/tuain-ng-forms-lib.mjs +297 -103
  3. package/fesm2022/tuain-ng-forms-lib.mjs.map +1 -1
  4. package/lib/classes/forms/action.d.ts +3 -2
  5. package/lib/classes/forms/element.d.ts +2 -1
  6. package/lib/classes/forms/field.d.ts +5 -4
  7. package/lib/classes/forms/form.d.ts +4 -2
  8. package/lib/classes/forms/piece-propagate.d.ts +2 -1
  9. package/lib/classes/forms/piece.d.ts +4 -3
  10. package/lib/classes/forms/section.d.ts +3 -2
  11. package/lib/classes/forms/subsection.d.ts +2 -1
  12. package/lib/classes/forms/table/action.d.ts +2 -1
  13. package/lib/classes/forms/table/column.d.ts +2 -1
  14. package/lib/classes/forms/table/row-data.d.ts +3 -2
  15. package/lib/classes/forms/table/table.d.ts +3 -1
  16. package/lib/components/elements/layout/piece.component.d.ts +2 -2
  17. package/lib/components/forms/basic-form.d.ts +4 -4
  18. package/lib/interfaces/action.interface.d.ts +23 -0
  19. package/lib/interfaces/field.interface.d.ts +70 -0
  20. package/lib/interfaces/form-config.interface.d.ts +24 -16
  21. package/lib/interfaces/form.interface.d.ts +106 -0
  22. package/lib/interfaces/index.d.ts +7 -0
  23. package/lib/interfaces/piece.interface.d.ts +67 -0
  24. package/lib/interfaces/section.interface.d.ts +56 -0
  25. package/lib/interfaces/sse-live-connection.interface.d.ts +67 -0
  26. package/lib/interfaces/table.interface.d.ts +139 -0
  27. package/lib/services/file-manager.service.d.ts +4 -4
  28. package/lib/services/form-manager.service.d.ts +3 -3
  29. package/lib/services/icon-dictionary.service.d.ts +1 -1
  30. package/lib/services/sse-live-connection.service.d.ts +56 -0
  31. package/lib/tokens/sse-live-connection.token.d.ts +7 -0
  32. package/package.json +6 -7
  33. package/public-api.d.ts +2 -0
  34. package/esm2022/lib/classes/forms/action.mjs +0 -112
  35. package/esm2022/lib/classes/forms/element.mjs +0 -25
  36. package/esm2022/lib/classes/forms/field.mjs +0 -484
  37. package/esm2022/lib/classes/forms/form.constants.mjs +0 -55
  38. package/esm2022/lib/classes/forms/form.mjs +0 -589
  39. package/esm2022/lib/classes/forms/piece-propagate.mjs +0 -36
  40. package/esm2022/lib/classes/forms/piece.mjs +0 -139
  41. package/esm2022/lib/classes/forms/section.mjs +0 -150
  42. package/esm2022/lib/classes/forms/subsection.mjs +0 -96
  43. package/esm2022/lib/classes/forms/table/action.mjs +0 -49
  44. package/esm2022/lib/classes/forms/table/column.mjs +0 -74
  45. package/esm2022/lib/classes/forms/table/row-data.mjs +0 -116
  46. package/esm2022/lib/classes/forms/table/table.mjs +0 -537
  47. package/esm2022/lib/components/elements/action.component.mjs +0 -71
  48. package/esm2022/lib/components/elements/field.component.mjs +0 -113
  49. package/esm2022/lib/components/elements/layout/element.component.mjs +0 -23
  50. package/esm2022/lib/components/elements/layout/form-error.component.mjs +0 -25
  51. package/esm2022/lib/components/elements/layout/form-header.component.mjs +0 -25
  52. package/esm2022/lib/components/elements/layout/piece.component.mjs +0 -59
  53. package/esm2022/lib/components/elements/layout/section.component.mjs +0 -57
  54. package/esm2022/lib/components/elements/layout/sub-section.component.mjs +0 -57
  55. package/esm2022/lib/components/elements/tables/table-record-action.component.mjs +0 -71
  56. package/esm2022/lib/components/elements/tables/table-record-field.component.mjs +0 -32
  57. package/esm2022/lib/components/elements/tables/table.component.mjs +0 -109
  58. package/esm2022/lib/components/forms/basic-form.mjs +0 -1408
  59. package/esm2022/lib/components/shared/constants.mjs +0 -2
  60. package/esm2022/lib/interfaces/form-config.interface.mjs +0 -2
  61. package/esm2022/lib/interfaces/icon-resolver.interface.mjs +0 -2
  62. package/esm2022/lib/interfaces/index.mjs +0 -3
  63. package/esm2022/lib/services/base-icon-resolver.service.mjs +0 -40
  64. package/esm2022/lib/services/event-manager.service.mjs +0 -55
  65. package/esm2022/lib/services/file-manager.service.mjs +0 -14
  66. package/esm2022/lib/services/form-manager.service.mjs +0 -88
  67. package/esm2022/lib/services/icon-dictionary.service.mjs +0 -162
  68. package/esm2022/lib/tokens/icon-resolver.token.mjs +0 -3
  69. package/esm2022/lib/tuain-ng-forms-lib.module.mjs +0 -54
  70. package/esm2022/public-api.mjs +0 -43
  71. package/esm2022/tuain-ng-forms-lib.mjs +0 -5
@@ -1,1408 +0,0 @@
1
- import { Component, signal, inject, DestroyRef, ChangeDetectionStrategy } from '@angular/core';
2
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
- import { FormStructureAndData } from '../../classes/forms/form';
4
- import { FormActionType, NO_ERROR } from '../../classes/forms/form.constants';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../../services/form-manager.service";
7
- import * as i2 from "../../services/event-manager.service";
8
- import * as i3 from "../../services/file-manager.service";
9
- const PAYLOAD_VERSION = 'TUAINEXCHANGE_1.0';
10
- const INLINE_ACTION = 'INLINE';
11
- const GLOBAL_ACTION = 'GLOBAL';
12
- const GET_DATA_ACTION = 'GETDATA';
13
- const SUBJECT = 'subject';
14
- const TOKEN = 'token';
15
- export class BasicFormComponent extends FormStructureAndData {
16
- formManagerService;
17
- _eventManager;
18
- fileMgmtServices;
19
- destroyRef = inject(DestroyRef);
20
- _controlToken = null;
21
- _originToken = null;
22
- _formRoute = null;
23
- _definitionObtained = false;
24
- _notifyFormActivity = true;
25
- // Eventos de acciones y campos
26
- _formChangeState = [];
27
- _formSectionsCanDeactivate = {};
28
- _formSectionsActivate = {};
29
- _formSectionsInactivate = {};
30
- _formActionsStart = {};
31
- _formActionsFinish = {};
32
- _fieldCustomEvent = {};
33
- _fieldInputValidation = {};
34
- _fieldValidationsStart = {};
35
- _fieldValidationsFinish = {};
36
- // Callback de acciones de tablas
37
- _tableSelectionsStart = {};
38
- _tableSelectionsFinish = {};
39
- _tableActionsStart = {};
40
- _tableActionsFinish = {};
41
- _tableGetDataStart = {};
42
- _tableGetDataFinish = {};
43
- // Errores en procesos
44
- _actionServerError = [];
45
- _fieldServerError = [];
46
- _tableServerError = [];
47
- // Acciones en curso dentro del formulario
48
- _actionsInProgress = {};
49
- _serverActionsInProgress = {};
50
- // Datos complementarios del formulario
51
- inputDataFields = {};
52
- extraData = {};
53
- _eventEmiter;
54
- enabledSections = [];
55
- // Gestión de error
56
- _errorType = '';
57
- errorCode = '';
58
- errorFullCode = '';
59
- errorName = '';
60
- errorMessage = '';
61
- errorDetail = '';
62
- // Control de estado
63
- visible = false;
64
- busy = signal(false);
65
- constructor(formManagerService, _eventManager, fileMgmtServices) {
66
- super();
67
- this.formManagerService = formManagerService;
68
- this._eventManager = _eventManager;
69
- this.fileMgmtServices = fileMgmtServices;
70
- this._eventEmiter = this._eventManager;
71
- this.cleanStart();
72
- }
73
- cleanStart() {
74
- this._errorType = '';
75
- this.errorCode = '';
76
- this.errorFullCode = '';
77
- this.errorName = '';
78
- this.errorMessage = '';
79
- this.errorDetail = '';
80
- this.cleanForm();
81
- this._controlToken = null;
82
- this.inputDataFields = {};
83
- this._definitionObtained = false;
84
- // Se limpian los manejadores de eventos
85
- this.visible = false;
86
- this.busy.set(false);
87
- this._formChangeState = [];
88
- this._formSectionsCanDeactivate = {};
89
- this._formSectionsActivate = {};
90
- this._formSectionsInactivate = {};
91
- this._formActionsStart = {};
92
- this._formActionsFinish = {};
93
- this._fieldCustomEvent = {};
94
- this._fieldInputValidation = {};
95
- this._fieldValidationsStart = {};
96
- this._fieldValidationsFinish = {};
97
- this._tableSelectionsStart = {};
98
- this._tableSelectionsFinish = {};
99
- this._tableActionsStart = {};
100
- this._tableActionsFinish = {};
101
- this._tableGetDataStart = {};
102
- this._tableGetDataFinish = {};
103
- this._actionServerError = [];
104
- this._fieldServerError = [];
105
- this._tableServerError = [];
106
- this.onActionServerError(() => this.displayActionServerError());
107
- this.onValidationServerError(() => this.displayValidationServerError());
108
- this.onTableServerError(() => this.displayTableServerError());
109
- }
110
- get formVisible() { return this.visible; }
111
- get form() { return this; }
112
- ngOnInit() {
113
- this.preStart();
114
- this.customPreProcessing();
115
- }
116
- // Métodos virtuales
117
- preStart() { }
118
- start() { }
119
- /**
120
- * @deprecated Since v17. Use preStart instead. Will be removed in v19.
121
- */
122
- customPreProcessing() { }
123
- /**
124
- * @deprecated Since v17. Overload start instead. Will be removed in v19.
125
- */
126
- customFormStart() { }
127
- displayActionServerError() { }
128
- displayValidationServerError() { }
129
- displayTableServerError() { }
130
- showFieldInfo(code, detail) { }
131
- showModalDialog(title, body, options, callback, params) { }
132
- openUploadDialog(title, body, options, callback, params) { }
133
- subscribeAppEvent(eventName, callback) {
134
- this._eventEmiter.subscribe(eventName, callback);
135
- }
136
- openForm(name, data = null, backData = null, cleanStack = false) {
137
- let origin = null;
138
- if (!cleanStack) {
139
- origin = { ...backData, name: this.name, url: this._formRoute, token: this._controlToken };
140
- origin.subject = origin?.subject ?? this.subject;
141
- origin.state = origin?.state ?? this.state;
142
- origin.fields = origin?.fields ?? {};
143
- origin.extra = origin?.extra ?? {};
144
- }
145
- const target = { ...data, name };
146
- target.subject = target?.subject ?? null;
147
- target.state = target?.state ?? null;
148
- target.fields = target?.fields ?? {};
149
- target.extra = target?.extra ?? {};
150
- this.formManagerService.openForm(origin, target);
151
- }
152
- enableActivityNotification() { this._notifyFormActivity = true; }
153
- disableActivityNotification() { this._notifyFormActivity = false; }
154
- canGoBack() { return this._originToken !== null; }
155
- goBack() { return this.formManagerService.backTo(); }
156
- goBackForm() { return this.goBack(); }
157
- getOriginDetail() { return this.formManagerService?.getFormInfo(this._originToken ?? ''); }
158
- setError(errorType, errorMessage, errorDetail) {
159
- this._errorType = errorType || '';
160
- this.errorMessage = errorMessage || '';
161
- this.errorDetail = errorDetail || '';
162
- }
163
- resetError() {
164
- this.errorCode = NO_ERROR;
165
- this.errorFullCode = '';
166
- this.errorName = '';
167
- this.errorMessage = '';
168
- this.errorDetail = '';
169
- }
170
- getErrorType() { return this._errorType; }
171
- getErrorMessage() { return this.errorMessage; }
172
- getErrorDetail() { return this.errorDetail; }
173
- getErrorName() { return this.errorName; }
174
- getErrorFullCode() { return this.errorFullCode; }
175
- getErrorCode() { return this.errorCode; }
176
- getFormParameter(name) {
177
- return (name) ? (this.extraData?.[name] ?? null) : null;
178
- }
179
- processInputParams(params) {
180
- this._controlToken = params?.[TOKEN] ?? null;
181
- this.subject = params?.[SUBJECT] ?? null;
182
- const tokenInfo = (this._controlToken) ? this.formManagerService.getFormInfo(this._controlToken) : {};
183
- const { token, subject, state, fields, extra, originToken } = tokenInfo;
184
- if (token && this._controlToken === token) {
185
- this.subject = this.subject ?? subject ?? null;
186
- this.inputDataFields = fields;
187
- this.extraData = extra;
188
- this._originToken = originToken;
189
- return state;
190
- }
191
- return null;
192
- }
193
- subscribeSectionActivation() {
194
- const formSections = this.sections;
195
- const sectionNames = Object.keys(formSections);
196
- for (let index = 0; index < sectionNames.length; index++) {
197
- const sectionName = sectionNames[index];
198
- const section = formSections[sectionName];
199
- section.activation
200
- .pipe(takeUntilDestroyed(this.destroyRef))
201
- .subscribe((code) => this.launchSectionActivation(code));
202
- section.inactivation
203
- .pipe(takeUntilDestroyed(this.destroyRef))
204
- .subscribe((code) => this.launchSectionInactivation(code));
205
- // Adicionalmente se le pide a la sección se subscriba al cambio de estado del formulario
206
- section.connectWithParentForm(this, this.stateChange);
207
- }
208
- }
209
- subscribeFieldsSubjects() {
210
- const formFields = this.getFields();
211
- if (Array.isArray(formFields)) {
212
- formFields.forEach(field => {
213
- field.customEvent
214
- .pipe(takeUntilDestroyed(this.destroyRef))
215
- .subscribe((event) => {
216
- const { code, eventName, eventData } = event;
217
- this.startFieldCustomEvent(code, eventName, eventData);
218
- });
219
- field.editionFinish
220
- .pipe(takeUntilDestroyed(this.destroyRef))
221
- .subscribe((event) => {
222
- const { code, intrinsicValidation } = event;
223
- this.startFieldValidation(code, intrinsicValidation);
224
- });
225
- field.editionPartial
226
- .pipe(takeUntilDestroyed(this.destroyRef))
227
- .subscribe((event) => {
228
- const { code, intrinsicValidation } = event;
229
- this.startFieldInputValidation(code, intrinsicValidation);
230
- });
231
- field.detailRequest
232
- .pipe(takeUntilDestroyed(this.destroyRef))
233
- .subscribe((event) => this.showFieldInfo(event.code, event.detail));
234
- // Adicionalmente se le pide al campo se subscriba al cambio de estado del formulario
235
- field.connectWithParentForm(this, this.stateChange);
236
- });
237
- }
238
- }
239
- subscribeActionSubjects() {
240
- const formActions = this.getActions();
241
- if (Array.isArray(formActions)) {
242
- formActions.forEach(action => {
243
- action.actionActivated
244
- .pipe(takeUntilDestroyed(this.destroyRef))
245
- .subscribe((code) => this.startAction(code));
246
- // Adicionalmente se le pide a la acción se subscriba al cambio de estado del formulario
247
- action.connectWithParentForm(this, this.stateChange);
248
- });
249
- }
250
- }
251
- subscribeTableSubjects() {
252
- const formTables = this.getTables();
253
- if (Array.isArray(formTables)) {
254
- formTables.forEach(table => {
255
- table.inlineActionTrigger
256
- .pipe(takeUntilDestroyed(this.destroyRef))
257
- .subscribe((event) => this.startTableAction(event));
258
- table.globalActionTrigger
259
- .pipe(takeUntilDestroyed(this.destroyRef))
260
- .subscribe((event) => this.startTableGlobalAction(event));
261
- table.recordSelectionTrigger
262
- .pipe(takeUntilDestroyed(this.destroyRef))
263
- .subscribe((event) => this.startTableRecordSelection(event));
264
- table.selectionActionTrigger
265
- .pipe(takeUntilDestroyed(this.destroyRef))
266
- .subscribe((event) => this.startTableSelectionAction(event));
267
- table.getDataTrigger
268
- .pipe(takeUntilDestroyed(this.destroyRef))
269
- .subscribe((event) => this.startTableGetData(event));
270
- // Adicionalmente se le pide a la tabla se subscriba al cambio de estado del formulario
271
- table.connectWithParentForm(this, this.stateChange);
272
- });
273
- }
274
- }
275
- async formInit(params, forceReload = false) {
276
- let initialState = this.processInputParams(params);
277
- if (!this.name) {
278
- return;
279
- }
280
- try {
281
- if (forceReload || !this._definitionObtained) {
282
- this.busy.set(true);
283
- const formDefinition = await this.formManagerService.getFormDefinition(this.name);
284
- this.busy.set(false);
285
- this.loadDefinition(formDefinition);
286
- this._definitionObtained = true;
287
- }
288
- else {
289
- this.cleanData();
290
- }
291
- }
292
- catch (e) {
293
- this.busy.set(false);
294
- console.error(`Error loading form definition for ${this.name}: ${e}`);
295
- return;
296
- }
297
- if (!this.supportState(initialState ?? '')) {
298
- initialState = this.defaultState ?? null;
299
- }
300
- const inputFieldNames = Object.keys(this.inputDataFields);
301
- for (let index = 0; index < inputFieldNames.length; index++) {
302
- const code = inputFieldNames[index];
303
- const fieldValue = this.inputDataFields[code];
304
- this.setFieldValue(code, fieldValue);
305
- }
306
- this.subscribeSectionActivation();
307
- this.subscribeFieldsSubjects();
308
- this.subscribeActionSubjects();
309
- this.subscribeTableSubjects();
310
- // Se define el estado inicial y se solicita la acción inicial
311
- this.changeState(initialState || this.defaultState);
312
- if (this.loadInitialData) {
313
- try {
314
- const recordResponse = await this.requestFormAction(FormActionType.GetData);
315
- this.checkErrorRecordReceived(recordResponse);
316
- }
317
- catch (e) {
318
- console.error(`Error loading initial data for ${this.name}: ${e}`);
319
- }
320
- }
321
- this.visible = true;
322
- this.enabledSections = this.visibleSections ?? [];
323
- this.start();
324
- this.customFormStart();
325
- }
326
- changeState(state) {
327
- const stateChanged = super.changeState(state ?? '') ?? false;
328
- if (stateChanged) {
329
- const clientActionMethods = this._formChangeState;
330
- if (clientActionMethods && clientActionMethods.length > 0) {
331
- for (const callback of clientActionMethods) {
332
- callback(state);
333
- }
334
- }
335
- }
336
- return stateChanged;
337
- }
338
- checkErrorRecordReceived(recordResponse) {
339
- const { error } = recordResponse ?? {};
340
- if (!error) {
341
- return false;
342
- }
343
- this.errorCode = recordResponse.errorCode;
344
- this.errorFullCode = recordResponse.errorFullCode;
345
- this.errorName = recordResponse.errorName;
346
- this.errorMessage = recordResponse.errorMessage;
347
- this.errorDetail = recordResponse.errorDetail;
348
- return true;
349
- }
350
- errorOccured() {
351
- return (this.errorCode !== NO_ERROR);
352
- }
353
- registerEventHandler(handlerMap, codes, callback, properties = null) {
354
- const codeSet = Array.isArray(codes) ? codes : (codes ? [codes] : []);
355
- codeSet.forEach((code) => {
356
- if (!handlerMap[code]) {
357
- handlerMap[code] = [];
358
- }
359
- handlerMap[code].push({ callback, properties });
360
- });
361
- }
362
- removeEventHandler(handlerMap, codes) {
363
- const codeSet = Array.isArray(codes) ? codes : (codes ? [codes] : []);
364
- codeSet.forEach((code) => { handlerMap[code] = []; });
365
- }
366
- async executeHandlers(handlers, ...args) {
367
- const promises = handlers.map(({ callback }) => callback(...args));
368
- const results = await Promise.allSettled(promises);
369
- return results.every(r => r.status === 'fulfilled' && r.value !== false);
370
- }
371
- /**
372
- * Soporte manejo de eventos de formulario
373
- */
374
- async requestFormAction(actionCode, actionSubject = {}) {
375
- const actionDetail = {
376
- formCode: this.name,
377
- formSubject: this.subject,
378
- currentMode: this.state,
379
- actionCode,
380
- actionSubject,
381
- version: PAYLOAD_VERSION,
382
- formData: this.getPayload(),
383
- immutableData: this.immutableData,
384
- };
385
- this.errorCode = NO_ERROR;
386
- this.errorFullCode = '';
387
- this.errorName = '';
388
- this.errorMessage = '';
389
- this.errorDetail = '';
390
- this.busy.set(true);
391
- const formActionResponse = await this.formManagerService.execServerAction(actionDetail);
392
- if (!formActionResponse) {
393
- return null;
394
- }
395
- this.busy.set(false);
396
- if (formActionResponse.hasError()) {
397
- const error = formActionResponse.error;
398
- this.errorCode = error.errorCode;
399
- this.errorFullCode = error.errorFullCode;
400
- this.errorName = error.errorName;
401
- this.errorMessage = error.errorMessage;
402
- this.errorDetail = error.errorDetail;
403
- }
404
- const formResponseData = formActionResponse.getData();
405
- this.updateFormWithServerData(formResponseData);
406
- return formResponseData;
407
- }
408
- updateFormWithServerData(formContent) {
409
- const { currentMode, formSubject, actions, fields, recordTables, returnedFile, immutableData, extraInfo, } = formContent;
410
- currentMode && this.changeState(currentMode);
411
- if (formSubject) {
412
- this.subject = formSubject;
413
- }
414
- if (actions && actions.length > 0) {
415
- for (const changedAction of actions) {
416
- const actionObject = this.getAction(changedAction.actionCode);
417
- if (actionObject) {
418
- actionObject.updateFromServer(changedAction);
419
- }
420
- }
421
- }
422
- if (fields && fields.length > 0) {
423
- for (const changedField of fields) {
424
- const fieldObject = this.getField(changedField.fieldCode);
425
- if (fieldObject) {
426
- fieldObject.updateFromServer(changedField);
427
- }
428
- }
429
- }
430
- if (recordTables && recordTables.length > 0) {
431
- for (const changedTable of recordTables) {
432
- const tableObject = this.getTable(changedTable.tableCode);
433
- if (tableObject) {
434
- tableObject.updateFromServer(changedTable);
435
- }
436
- }
437
- }
438
- if (returnedFile && returnedFile.file) {
439
- this.fileMgmtServices.saveFile(returnedFile.file, returnedFile.name, returnedFile.type);
440
- }
441
- this.immutableData = immutableData;
442
- this.extraInfo = extraInfo;
443
- }
444
- /**
445
- * Manejo de event handlers para errores Server del formulario
446
- */
447
- cleanActionServerError() { this._actionServerError = []; }
448
- cleanFieldServerError() { this._fieldServerError = []; }
449
- cleanTableServerError() { this._tableServerError = []; }
450
- onActionServerError(callback, properties = null) { this._actionServerError.push({ callback, properties }); }
451
- onValidationServerError(callback, properties = null) { this._fieldServerError.push({ callback, properties }); }
452
- onTableServerError(callback, properties = null) { this._tableServerError.push({ callback, properties }); }
453
- /**
454
- * Manejo de event handlers para acciones sobre el formulario
455
- */
456
- onFormChange(callback) {
457
- this._formChangeState.push(callback);
458
- }
459
- onSectionCanDeactivate(codes, callback, properties = null) {
460
- this.registerEventHandler(this._formSectionsCanDeactivate, codes, callback, properties);
461
- }
462
- onSectionActivation(codes, callback, properties = null) {
463
- this.registerEventHandler(this._formSectionsActivate, codes, callback, properties);
464
- }
465
- onSectionInactivation(codes, callback, properties = null) {
466
- this.registerEventHandler(this._formSectionsInactivate, codes, callback, properties);
467
- }
468
- onActionStart(codes, callback, properties = null) {
469
- this.registerEventHandler(this._formActionsStart, codes, callback, properties);
470
- }
471
- onActionFinish(codes, callback, properties = null) {
472
- this.registerEventHandler(this._formActionsFinish, codes, callback, properties);
473
- }
474
- async verifySectionActivation(code) {
475
- const sectionObject = this.getSection(code);
476
- if (!sectionObject) {
477
- return false;
478
- }
479
- const clientSectionMethods = this._formSectionsCanDeactivate[code];
480
- if (clientSectionMethods) {
481
- for (const clientSectionMethod of clientSectionMethods) {
482
- const { callback, properties } = clientSectionMethod;
483
- const canActivate = callback(sectionObject);
484
- if (canActivate === false) {
485
- return false;
486
- }
487
- }
488
- }
489
- return true;
490
- }
491
- async launchSectionActivation(code) {
492
- this.notifyFormActivity();
493
- const sectionObject = this.getSection(code);
494
- if (!sectionObject) {
495
- return;
496
- }
497
- const clientSectionMethods = this._formSectionsActivate[code];
498
- if (clientSectionMethods) {
499
- for (const clientSectionMethod of clientSectionMethods) {
500
- const { callback, properties } = clientSectionMethod;
501
- callback(sectionObject);
502
- }
503
- }
504
- }
505
- async launchSectionInactivation(code) {
506
- this.notifyFormActivity();
507
- const sectionObject = this.getSection(code);
508
- if (!sectionObject) {
509
- return;
510
- }
511
- const clientSectionMethods = this._formSectionsInactivate[code];
512
- if (clientSectionMethods) {
513
- for (const clientSectionMethod of clientSectionMethods) {
514
- const { callback, properties } = clientSectionMethod;
515
- callback(sectionObject);
516
- }
517
- }
518
- }
519
- async startAction(code) {
520
- this.notifyFormActivity();
521
- const actionObject = this.getAction(code);
522
- if (!actionObject) {
523
- return;
524
- }
525
- if (this._actionsInProgress[code]) {
526
- const { sent } = this._actionsInProgress[code];
527
- console.log(`Reingreso sobre acción ${code} con ejecución previa ${sent}`);
528
- return;
529
- }
530
- this._actionsInProgress[code] = { sent: new Date() };
531
- this.resetError();
532
- actionObject.start();
533
- const clientActionMethods = this._formActionsStart[code];
534
- if (clientActionMethods) {
535
- const clientActionPromises = [];
536
- for (const clientActionMethod of clientActionMethods) {
537
- const { callback, properties } = clientActionMethod;
538
- const continueActionPromise = callback(actionObject);
539
- clientActionPromises.push(continueActionPromise);
540
- }
541
- const clientActionResults = await Promise.allSettled(clientActionPromises);
542
- const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
543
- if (!continueAction) {
544
- actionObject.stop();
545
- this._actionsInProgress[code] = null;
546
- delete this._actionsInProgress[code];
547
- return;
548
- }
549
- }
550
- await this.startServerAction(actionObject);
551
- this._actionsInProgress[code] = null;
552
- delete this._actionsInProgress[code];
553
- }
554
- async startServerAction(actionInput) {
555
- const action = (typeof actionInput === 'string')
556
- ? this.getAction(actionInput) : actionInput;
557
- const { actionCode: code, backend } = action ?? {};
558
- if (!action || !code) {
559
- return;
560
- }
561
- let serverError = false;
562
- let actionResult = null;
563
- if (backend) {
564
- if (this._serverActionsInProgress[code]) {
565
- const { sent } = this._serverActionsInProgress[code];
566
- console.log(`Reingreso server en acción ${code} con ejecución previa ${sent}`);
567
- return;
568
- }
569
- this._serverActionsInProgress[code] = { sent: new Date() };
570
- // Se inicia la parte server de la acción
571
- actionResult = await this.requestFormAction(action.actionCode);
572
- }
573
- await this.finishAction(action, actionResult, serverError);
574
- serverError = !!this.errorOccured();
575
- if (!serverError) {
576
- action.newState && this.changeState(action.newState);
577
- }
578
- else {
579
- for (let index = 0; index < this._actionServerError.length; index++) {
580
- const { callback, properties } = this._actionServerError[index];
581
- callback(action);
582
- }
583
- }
584
- this._serverActionsInProgress[code] = null;
585
- delete this._serverActionsInProgress[code];
586
- action.stop();
587
- }
588
- async finishAction(action, actionResult, serverError = false) {
589
- const finishActionMethods = this._formActionsFinish[action.actionCode];
590
- if (finishActionMethods) {
591
- const clientActionPromises = [];
592
- for (const clientActionMethod of finishActionMethods) {
593
- const { callback, properties } = clientActionMethod;
594
- const continueOnError = properties?.continueOnError ?? false;
595
- if (callback && (!serverError || continueOnError)) {
596
- clientActionPromises.push(callback(action, actionResult));
597
- }
598
- }
599
- await Promise.allSettled(clientActionPromises);
600
- }
601
- }
602
- completeGlobalAction(action) {
603
- return this.startServerAction(action);
604
- }
605
- /**
606
- * Manejadores de eventos para validaciones sobre campos
607
- */
608
- removeFieldValidationInput(codes) {
609
- this.removeEventHandler(this._fieldInputValidation, codes);
610
- }
611
- onFieldInput(codes, callback, properties = null) {
612
- this.registerEventHandler(this._fieldInputValidation, codes, callback, properties);
613
- }
614
- removeFieldCustomEvent(codes) {
615
- this.removeEventHandler(this._fieldCustomEvent, codes);
616
- }
617
- onFieldCustomEvent(codes, callback, properties = null) {
618
- this.registerEventHandler(this._fieldCustomEvent, codes, callback, properties);
619
- }
620
- removeFieldValidationStart(codes) {
621
- this.removeEventHandler(this._fieldValidationsStart, codes);
622
- }
623
- onFieldValidationStart(codes, callback, properties = null) {
624
- this.registerEventHandler(this._fieldValidationsStart, codes, callback, properties);
625
- }
626
- removeFieldValidationFinish(codes) {
627
- this.removeEventHandler(this._fieldValidationsFinish, codes);
628
- }
629
- onFieldValidationFinish(codes, callback, properties = null) {
630
- this.registerEventHandler(this._fieldValidationsFinish, codes, callback, properties);
631
- }
632
- removeFieldAllEventCallbacks(codes) {
633
- this.removeEventHandler(this._fieldInputValidation, codes);
634
- this.removeEventHandler(this._fieldCustomEvent, codes);
635
- this.removeEventHandler(this._fieldValidationsStart, codes);
636
- this.removeEventHandler(this._fieldValidationsFinish, codes);
637
- }
638
- async startFieldInputValidation(code, intrinsicValidation = true) {
639
- this.notifyFormActivity();
640
- const fieldToValidate = this.getField(code);
641
- if (!fieldToValidate) {
642
- return false;
643
- }
644
- const validationCallbacks = this._fieldInputValidation[code];
645
- if (validationCallbacks) {
646
- const clientValidationPromises = [];
647
- for (const validationMethod of validationCallbacks) {
648
- const { callback, properties } = validationMethod;
649
- const continueValidationPromise = callback(fieldToValidate);
650
- clientValidationPromises.push(continueValidationPromise);
651
- }
652
- await Promise.allSettled(clientValidationPromises);
653
- }
654
- return true;
655
- }
656
- async startFieldCustomEvent(code, eventName, eventData) {
657
- this.notifyFormActivity();
658
- const fieldToTrigger = this.getField(code);
659
- if (!fieldToTrigger) {
660
- return;
661
- }
662
- const eventHandlerCallbacks = this._fieldCustomEvent[code];
663
- if (eventHandlerCallbacks) {
664
- const clientEventPromises = [];
665
- for (const eventHandlerMethod of eventHandlerCallbacks) {
666
- const { callback, properties } = eventHandlerMethod;
667
- const clientEventPromise = callback(eventName, eventData, fieldToTrigger);
668
- clientEventPromises.push(clientEventPromise);
669
- }
670
- }
671
- }
672
- async startFieldValidation(code, intrinsicValidation = true) {
673
- this.notifyFormActivity();
674
- const fieldToValidate = this.getField(code);
675
- if (!fieldToValidate) {
676
- return;
677
- }
678
- const validationCallbacks = this._fieldValidationsStart[code];
679
- if (validationCallbacks) {
680
- const clientValidationPromises = [];
681
- for (const validationMethod of validationCallbacks) {
682
- const { callback, properties } = validationMethod;
683
- const clientValidationPromise = callback(fieldToValidate);
684
- clientValidationPromises.push(clientValidationPromise);
685
- }
686
- const clientValidationResults = await Promise.allSettled(clientValidationPromises);
687
- const continueValidation = clientValidationResults.every(r => r.status === 'fulfilled' && r.value !== false);
688
- if (!continueValidation) {
689
- return;
690
- }
691
- }
692
- if (intrinsicValidation) {
693
- this.startServerFieldValidation(fieldToValidate);
694
- }
695
- }
696
- async startServerFieldValidation(inputField) {
697
- const fieldObj = (typeof inputField === 'string')
698
- ? this.getField(inputField) : inputField;
699
- let serverError = false;
700
- let validationResult = true;
701
- if (!fieldObj) {
702
- return;
703
- }
704
- if (fieldObj.backend) {
705
- fieldObj.validating = true;
706
- validationResult = await this
707
- .requestFormAction(FormActionType.Validate, fieldObj.code);
708
- serverError = !!this.errorOccured();
709
- }
710
- if (serverError) {
711
- fieldObj?.setErrorCode(this.errorCode);
712
- fieldObj?.setErrorMessage(this.errorMessage);
713
- for (let index = 0; index < this._fieldServerError.length; index++) {
714
- const { callback, properties } = this._fieldServerError[index];
715
- callback(fieldObj);
716
- }
717
- }
718
- await this.finishFieldValidation(fieldObj, validationResult, serverError);
719
- fieldObj.validating = false;
720
- }
721
- async finishFieldValidation(fieldObject, validationResult, serverError = false) {
722
- const validationCallbacks = this._fieldValidationsFinish[fieldObject.code];
723
- if (validationCallbacks) {
724
- const clientActionPromises = [];
725
- for (const validationMethod of validationCallbacks) {
726
- const { callback, properties } = validationMethod;
727
- const continueOnError = properties?.continueOnError ?? false;
728
- if (!serverError || continueOnError) {
729
- clientActionPromises.push(callback(fieldObject, validationResult));
730
- }
731
- }
732
- await Promise.allSettled(clientActionPromises);
733
- }
734
- }
735
- async continueFieldValidation(code) {
736
- return this.startServerFieldValidation(code);
737
- }
738
- /**
739
- * Manejadores de eventos para acciones sobre Tablas
740
- */
741
- onTableActionStart(code, actionCode, callback, properties = null) {
742
- const tableObject = this.getTable(code);
743
- if (!tableObject) {
744
- return;
745
- }
746
- const inlineActionObject = tableObject.getAction(actionCode);
747
- if (!inlineActionObject) {
748
- return;
749
- }
750
- let tableEventHandlers;
751
- if (this._tableActionsStart[code]) {
752
- tableEventHandlers = this._tableActionsStart[code];
753
- }
754
- else {
755
- tableEventHandlers = {};
756
- this._tableActionsStart[code] = tableEventHandlers;
757
- }
758
- if (!tableEventHandlers[actionCode]) {
759
- tableEventHandlers[actionCode] = [];
760
- }
761
- tableEventHandlers[actionCode].push({ callback, properties });
762
- }
763
- onTableActionFinish(code, actionCode, callback, properties = null) {
764
- const tableObject = this.getTable(code);
765
- if (!tableObject) {
766
- return;
767
- }
768
- const inlineActionObject = tableObject.getAction(actionCode);
769
- if (!inlineActionObject) {
770
- return;
771
- }
772
- let tableEventHandlers;
773
- if (this._tableActionsFinish[code]) {
774
- tableEventHandlers = this._tableActionsFinish[code];
775
- }
776
- else {
777
- tableEventHandlers = {};
778
- this._tableActionsFinish[code] = tableEventHandlers;
779
- }
780
- if (!tableEventHandlers[actionCode]) {
781
- tableEventHandlers[actionCode] = [];
782
- }
783
- tableEventHandlers[actionCode].push({ callback, properties });
784
- }
785
- onTableSelectionStart(code, callback, properties = null) {
786
- const tableObject = this.getTable(code);
787
- if (!tableObject) {
788
- return;
789
- }
790
- let tableEventHandlers;
791
- if (this._tableSelectionsStart[code]) {
792
- tableEventHandlers = this._tableSelectionsStart[code];
793
- }
794
- else {
795
- tableEventHandlers = [];
796
- this._tableSelectionsStart[code] = tableEventHandlers;
797
- }
798
- tableEventHandlers.push({ callback, properties });
799
- }
800
- onTableSelectionFinish(code, callback, properties = null) {
801
- const tableObject = this.getTable(code);
802
- if (!tableObject) {
803
- return;
804
- }
805
- let tableEventHandlers;
806
- if (this._tableSelectionsFinish[code]) {
807
- tableEventHandlers = this._tableSelectionsFinish[code];
808
- }
809
- else {
810
- tableEventHandlers = [];
811
- this._tableSelectionsFinish[code] = tableEventHandlers;
812
- }
813
- tableEventHandlers.push({ callback, properties });
814
- }
815
- onTableGetDataStart(code, callback, properties = null) {
816
- const tableObject = this.getTable(code);
817
- if (!tableObject) {
818
- return;
819
- }
820
- let tableEventHandlers;
821
- if (this._tableGetDataStart[code]) {
822
- tableEventHandlers = this._tableGetDataStart[code];
823
- }
824
- else {
825
- tableEventHandlers = [];
826
- this._tableGetDataStart[code] = tableEventHandlers;
827
- }
828
- tableEventHandlers.push({ callback, properties });
829
- }
830
- onTableGetDataFinish(code, callback, properties = null) {
831
- const tableObject = this.getTable(code);
832
- if (!tableObject) {
833
- return;
834
- }
835
- let tableEventHandlers;
836
- if (this._tableGetDataFinish[code]) {
837
- tableEventHandlers = this._tableGetDataFinish[code];
838
- }
839
- else {
840
- tableEventHandlers = {};
841
- this._tableGetDataFinish[code] = tableEventHandlers;
842
- }
843
- tableEventHandlers[GET_DATA_ACTION] = { callback, properties };
844
- }
845
- async startTableGlobalAction(tableActionEvent) {
846
- this.notifyFormActivity();
847
- const { tableCode, actionCode } = tableActionEvent;
848
- const tableObject = this.getTable(tableCode);
849
- if (!tableObject || !actionCode) {
850
- return;
851
- }
852
- this.resetError();
853
- const action = tableObject.getAction(actionCode);
854
- if (!action) {
855
- return;
856
- }
857
- const tableActionDetail = {
858
- tableObject,
859
- action,
860
- tableCode,
861
- actionCode,
862
- };
863
- const tableEventHandlers = this._tableActionsStart[tableCode];
864
- const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
865
- if (tableActionMethods) {
866
- const clientActionPromises = [];
867
- for (const tableActionMethod of tableActionMethods) {
868
- const { callback, properties } = tableActionMethod;
869
- const clientActionPromise = callback(tableActionDetail);
870
- clientActionPromises.push(clientActionPromise);
871
- }
872
- const clientActionResults = await Promise.allSettled(clientActionPromises);
873
- const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
874
- if (!continueAction) {
875
- return;
876
- }
877
- }
878
- this.startTableServerGlobalAction(tableActionDetail);
879
- }
880
- async startTableServerGlobalAction(tableActionDetail) {
881
- const { tableObject, action, tableCode, actionCode } = tableActionDetail;
882
- if (!tableObject || !action) {
883
- return;
884
- }
885
- tableObject.putOnWait();
886
- let serverError = false;
887
- let actionResult = null;
888
- if (action.backend) {
889
- const actionSubject = {
890
- tableCode,
891
- actionType: GLOBAL_ACTION,
892
- actionCode
893
- };
894
- actionResult = await this
895
- .requestFormAction(FormActionType.TableAction, actionSubject);
896
- serverError = !!this.errorOccured();
897
- }
898
- await this.finishTableGlobalAction(tableActionDetail, actionResult, serverError);
899
- if (!serverError) {
900
- action.newState && this.changeState(action.newState);
901
- }
902
- else {
903
- for (let index = 0; index < this._tableServerError.length; index++) {
904
- const { callback, properties } = this._tableServerError[index];
905
- callback(tableObject);
906
- }
907
- }
908
- tableObject.freeWaiting();
909
- }
910
- async finishTableGlobalAction(tableActionDetail, actionResult, serverError = false) {
911
- const { tableCode, actionCode } = tableActionDetail;
912
- const tableEventHandlers = this._tableActionsFinish[tableCode];
913
- const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
914
- if (tableActionMethods) {
915
- const clientActionPromises = [];
916
- for (const tableActionMethod of tableActionMethods) {
917
- const { callback, properties } = tableActionMethod;
918
- const continueOnError = properties?.continueOnError ?? false;
919
- if (!serverError || continueOnError) {
920
- clientActionPromises.push(callback(tableActionDetail, actionResult));
921
- }
922
- }
923
- await Promise.allSettled(clientActionPromises);
924
- }
925
- }
926
- async startTableAction(tableActionEvent) {
927
- this.notifyFormActivity();
928
- const { tableCode, actionCode, actionDetail } = tableActionEvent;
929
- const tableObject = this.getTable(tableCode);
930
- if (!tableObject || !actionCode) {
931
- return;
932
- }
933
- this.resetError();
934
- const { recordId, recordData } = actionDetail;
935
- const action = tableObject.getAction(actionCode);
936
- if (!action) {
937
- return;
938
- }
939
- const tableActionDetail = {
940
- tableObject,
941
- action,
942
- tableCode,
943
- actionCode,
944
- recordId,
945
- recordData
946
- };
947
- const tableEventHandlers = this._tableActionsStart[tableCode];
948
- const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
949
- if (tableActionMethods) {
950
- const clientActionPromises = [];
951
- for (const tableActionMethod of tableActionMethods) {
952
- const { callback, properties } = tableActionMethod;
953
- const clientActionPromise = callback(tableActionDetail);
954
- clientActionPromises.push(clientActionPromise);
955
- }
956
- const clientActionResults = await Promise.allSettled(clientActionPromises);
957
- const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
958
- if (!continueAction) {
959
- return;
960
- }
961
- }
962
- this.startTableServerAction(tableActionDetail);
963
- }
964
- async startTableServerAction(tableActionDetail) {
965
- const { tableObject, action, tableCode, actionCode, recordId, recordData } = tableActionDetail;
966
- if (!tableObject || !action) {
967
- return;
968
- }
969
- tableObject.putOnWait();
970
- let serverError = false;
971
- let actionResult = null;
972
- if (action.backend) {
973
- const actionSubject = {
974
- tableCode,
975
- actionType: this.formConfig?.tableActions.inline,
976
- actionCode,
977
- tableRecordId: recordId,
978
- tableRecordData: recordData
979
- };
980
- actionResult = await this
981
- .requestFormAction(FormActionType.TableAction, actionSubject);
982
- serverError = !!this.errorOccured();
983
- }
984
- await this.finishTableAction(tableActionDetail, actionResult, serverError);
985
- if (!serverError) {
986
- action.newState && this.changeState(action.newState);
987
- }
988
- else {
989
- this.displayTableServerError();
990
- }
991
- tableObject.freeWaiting();
992
- }
993
- completeInlineAction(tableAction) {
994
- return this.startTableServerAction(tableAction);
995
- }
996
- async finishTableAction(tableActionDetail, actionResult, serverError = false) {
997
- const { tableCode, actionCode } = tableActionDetail;
998
- const tableEventHandlers = this._tableActionsFinish[tableCode];
999
- const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
1000
- if (tableActionMethods) {
1001
- const clientActionPromises = [];
1002
- for (const tableActionMethod of tableActionMethods) {
1003
- const { callback, properties } = tableActionMethod;
1004
- const continueOnError = properties?.continueOnError ?? false;
1005
- if (!serverError || continueOnError) {
1006
- clientActionPromises.push(callback(tableActionDetail, actionResult));
1007
- }
1008
- }
1009
- await Promise.allSettled(clientActionPromises);
1010
- }
1011
- }
1012
- async startTableRecordSelection(tableActionEvent) {
1013
- this.notifyFormActivity();
1014
- const { tableCode, actionDetail } = tableActionEvent;
1015
- const tableObject = this.getTable(tableCode);
1016
- if (!tableObject) {
1017
- return;
1018
- }
1019
- this.resetError();
1020
- const { recordId, recordData } = actionDetail;
1021
- const tableSelectionDetail = {
1022
- tableObject,
1023
- tableCode,
1024
- recordId,
1025
- recordData
1026
- };
1027
- const tableEventHandlers = this._tableSelectionsStart[tableCode];
1028
- if (tableEventHandlers) {
1029
- const clientActionPromises = [];
1030
- for (const tableSelectionMethod of tableEventHandlers) {
1031
- const { callback, properties } = tableSelectionMethod;
1032
- const clientActionPromise = callback(tableSelectionDetail);
1033
- clientActionPromises.push(clientActionPromise);
1034
- }
1035
- const clientActionResults = await Promise.allSettled(clientActionPromises);
1036
- const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
1037
- if (!continueAction) {
1038
- return;
1039
- }
1040
- }
1041
- this.startTableServerRecordSelection(tableSelectionDetail);
1042
- }
1043
- async startTableServerRecordSelection(tableSelectionDetail) {
1044
- const { tableObject, tableCode, recordId, recordData } = tableSelectionDetail;
1045
- if (!tableObject) {
1046
- return;
1047
- }
1048
- tableObject.putOnWait();
1049
- let serverError = false;
1050
- let actionResult = null;
1051
- if (tableObject.selectionBackend) {
1052
- const actionSubject = {
1053
- tableCode,
1054
- actionType: this.formConfig?.tableActions.rowSelection,
1055
- actionCode: null,
1056
- tableRecordId: recordId,
1057
- tableRecordData: recordData
1058
- };
1059
- actionResult = await this
1060
- .requestFormAction(FormActionType.TableAction, actionSubject);
1061
- serverError = !!this.errorOccured();
1062
- }
1063
- await this.finishTableRecordSelection(tableSelectionDetail, actionResult, serverError);
1064
- if (serverError) {
1065
- this.displayTableServerError();
1066
- }
1067
- tableObject.freeWaiting();
1068
- }
1069
- async finishTableRecordSelection(tableSelectionDetail, actionResult, serverError = false) {
1070
- const { tableCode } = tableSelectionDetail;
1071
- const tableEventHandlers = this._tableSelectionsFinish[tableCode];
1072
- if (tableEventHandlers) {
1073
- const clientActionPromises = [];
1074
- for (const tableSelectionMethod of tableEventHandlers) {
1075
- const { callback, properties } = tableSelectionMethod;
1076
- const continueOnError = properties?.continueOnError ?? false;
1077
- if (!serverError || continueOnError) {
1078
- clientActionPromises.push(callback(tableSelectionDetail, actionResult));
1079
- }
1080
- }
1081
- await Promise.allSettled(clientActionPromises);
1082
- }
1083
- }
1084
- async startTableSelectionAction(tableActionEvent) {
1085
- this.notifyFormActivity();
1086
- const { tableCode, actionCode, actionDetail } = tableActionEvent;
1087
- const tableObject = this.getTable(tableCode);
1088
- if (!tableObject || !actionCode) {
1089
- return;
1090
- }
1091
- this.resetError();
1092
- const { selectedRecords } = actionDetail;
1093
- const action = tableObject.getAction(actionCode);
1094
- if (!action) {
1095
- return;
1096
- }
1097
- const tableActionDetail = {
1098
- tableObject,
1099
- action,
1100
- tableCode,
1101
- actionCode,
1102
- selectedRecords
1103
- };
1104
- const tableEventHandlers = this._tableActionsStart[tableCode];
1105
- const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
1106
- if (tableActionMethods) {
1107
- const clientActionPromises = [];
1108
- for (const tableActionMethod of tableActionMethods) {
1109
- const { callback, properties } = tableActionMethod;
1110
- const clientActionPromise = callback(tableActionDetail);
1111
- clientActionPromises.push(clientActionPromise);
1112
- }
1113
- const clientActionResults = await Promise.allSettled(clientActionPromises);
1114
- const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
1115
- if (!continueAction) {
1116
- return;
1117
- }
1118
- }
1119
- this.startTableServerSelectionAction(tableActionDetail);
1120
- }
1121
- async startTableServerSelectionAction(tableActionDetail) {
1122
- const { tableObject, action, tableCode, actionCode, selectedRecords } = tableActionDetail;
1123
- if (!tableObject || !action) {
1124
- return;
1125
- }
1126
- tableObject.putOnWait();
1127
- let serverError = false;
1128
- let actionResult = null;
1129
- if (action.backend) {
1130
- const actionSubject = {
1131
- tableCode,
1132
- actionType: this.formConfig?.tableActions.selection,
1133
- actionCode,
1134
- selectedRecords
1135
- };
1136
- actionResult = await this
1137
- .requestFormAction(FormActionType.TableAction, actionSubject);
1138
- serverError = !!this.errorOccured();
1139
- }
1140
- await this.finishTableSelectionAction(tableActionDetail, actionResult, serverError);
1141
- if (!serverError) {
1142
- action.newState && this.changeState(action.newState);
1143
- }
1144
- else {
1145
- this.displayTableServerError();
1146
- }
1147
- tableObject.freeWaiting();
1148
- }
1149
- async finishTableSelectionAction(tableActionDetail, actionResult, serverError = false) {
1150
- const { tableCode, actionCode } = tableActionDetail;
1151
- const tableEventHandlers = this._tableActionsFinish[tableCode];
1152
- const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[actionCode] : null;
1153
- if (tableActionMethods) {
1154
- const clientActionPromises = [];
1155
- for (const tableActionMethod of tableActionMethods) {
1156
- const { callback, properties } = tableActionMethod;
1157
- const continueOnError = properties?.continueOnError ?? false;
1158
- if (!serverError || continueOnError) {
1159
- clientActionPromises.push(callback(tableActionDetail, actionResult));
1160
- }
1161
- }
1162
- await Promise.allSettled(clientActionPromises);
1163
- }
1164
- }
1165
- async startTableGetData(tableActionEvent) {
1166
- this.notifyFormActivity();
1167
- const { tableCode } = tableActionEvent;
1168
- const tableObject = this.getTable(tableCode);
1169
- const tableActionDetail = {
1170
- tableObject,
1171
- tableCode
1172
- };
1173
- this.resetError();
1174
- const tableEventHandlers = this._tableGetDataStart[tableCode];
1175
- if (tableEventHandlers) {
1176
- const clientActionPromises = [];
1177
- for (const tableActionMethod of tableEventHandlers) {
1178
- const { callback, properties } = tableActionMethod;
1179
- const clientActionPromise = callback(tableActionDetail);
1180
- clientActionPromises.push(clientActionPromise);
1181
- }
1182
- const clientActionResults = await Promise.allSettled(clientActionPromises);
1183
- const continueAction = clientActionResults.every(r => r.status === 'fulfilled' && r.value !== false);
1184
- if (!continueAction) {
1185
- return;
1186
- }
1187
- }
1188
- this.startTableServerGetData(tableActionDetail);
1189
- }
1190
- async startTableServerGetData(tableActionDetail) {
1191
- const { tableObject, tableCode } = tableActionDetail;
1192
- tableObject.putOnWait();
1193
- let serverError = false;
1194
- const actionSubject = { tableCode };
1195
- const actionResult = await this
1196
- .requestFormAction(FormActionType.GetTableData, actionSubject);
1197
- serverError = !!this.errorOccured();
1198
- await this.finishTableGetData(tableActionDetail, actionResult, serverError);
1199
- if (serverError) {
1200
- this.displayTableServerError();
1201
- }
1202
- tableObject.freeWaiting();
1203
- }
1204
- async finishTableGetData(tableActionDetail, actionResult, serverError = false) {
1205
- const { tableCode, tableActionCode } = tableActionDetail;
1206
- const tableEventHandlers = this._tableActionsFinish[tableCode];
1207
- const tableActionMethods = (tableEventHandlers) ? tableEventHandlers[tableActionCode] : null;
1208
- if (tableActionMethods) {
1209
- const clientActionPromises = [];
1210
- for (const tableActionMethod of tableActionMethods) {
1211
- const { callback, properties } = tableActionMethod;
1212
- const continueOnError = properties?.continueOnError ?? false;
1213
- if (!serverError || continueOnError) {
1214
- clientActionPromises.push(callback(tableActionDetail, actionResult));
1215
- }
1216
- }
1217
- await Promise.allSettled(clientActionPromises);
1218
- }
1219
- }
1220
- checkSectionRequiredFields(sectionCode, reqFieldMessage) {
1221
- this.cleanErrorFields(null, sectionCode);
1222
- const requiredFieldMessage = reqFieldMessage ?? this.formConfig?.formStandardErrors.requiredField;
1223
- const numErrors = this.tagFieldsWithError(requiredFieldMessage, this.getRequiredEmptyFields(null, sectionCode));
1224
- return (numErrors === 0);
1225
- }
1226
- validateSectionConsistency(sectionCode, reqFieldMessage) {
1227
- this.resetError();
1228
- const completeFields = this.checkSectionRequiredFields(sectionCode, reqFieldMessage);
1229
- if (!completeFields) {
1230
- this.setError(this.formConfig?.formStandardErrors.typeWarning, this.formConfig?.formStandardErrors.validationTitle, this.formConfig?.formStandardErrors.requiredFields);
1231
- return false;
1232
- }
1233
- let validationError = false;
1234
- const requiredEmptyFields = this.getRequiredEmptyFields(null, sectionCode) ?? [];
1235
- if (requiredEmptyFields?.length > 0) {
1236
- validationError = true;
1237
- this.setError(this.formConfig?.formStandardErrors.typeWarning, this.formConfig?.formStandardErrors.validationTitle, this.formConfig?.formStandardErrors.requiredFields);
1238
- this.tagFieldsWithError(this.formConfig?.formStandardErrors.requiredField, requiredEmptyFields);
1239
- for (const code of requiredEmptyFields) {
1240
- const requiredEmptyField = this.getField(code);
1241
- requiredEmptyField?.focus();
1242
- break;
1243
- }
1244
- }
1245
- const validationIssueFields = this.getFieldsWithValidationIssues(null, sectionCode) ?? [];
1246
- if (!validationError && validationIssueFields.length > 0) {
1247
- validationError = true;
1248
- this.setError(this.formConfig?.formStandardErrors.typeWarning, this.formConfig?.formStandardErrors.validationTitle, this.formConfig?.formStandardErrors.validationFields);
1249
- for (const code of validationIssueFields) {
1250
- const validationIssueField = this.getField(code);
1251
- if (validationIssueField) {
1252
- validationIssueField.focus();
1253
- }
1254
- break;
1255
- }
1256
- }
1257
- return validationError;
1258
- }
1259
- copyTableRecordToFields(tableObj, mappingTable = null) {
1260
- const tableObject = this.getTable(tableObj.tableCode);
1261
- const tableRecord = tableObject?.getTableRecord(tableObj.recordId);
1262
- const columnNames = tableObject?.columnNames;
1263
- if (tableRecord && columnNames) {
1264
- for (const columnName of columnNames) {
1265
- const columnValue = tableRecord.getFieldValue(columnName) ?? '';
1266
- const code = mappingTable?.[columnName] ?? columnName;
1267
- const field = code ? this.getField(code) : null;
1268
- if (field) {
1269
- field.setValue(columnValue);
1270
- field.hasChanged = false;
1271
- }
1272
- }
1273
- return true;
1274
- }
1275
- return false;
1276
- }
1277
- notifyFormActivity() {
1278
- if (this._notifyFormActivity) {
1279
- this._eventEmiter.next('formActivity', { code: this.formCode });
1280
- }
1281
- }
1282
- /**
1283
- * Métodos Legacy de compatibilidad hacia atrás
1284
- */
1285
- /**
1286
- * @deprecated Since v17. Use name instead. Will be removed in v19.
1287
- */
1288
- get formCode() { return this.name ?? ''; }
1289
- /**
1290
- * @deprecated Since v17. Use name instead. Will be removed in v19.
1291
- */
1292
- set formCode(name) { this.name = name; }
1293
- /**
1294
- * @deprecated Since v17. Use busy signal instead. Will be removed in v19.
1295
- */
1296
- get inServerProcess() { return this.busy(); }
1297
- /**
1298
- * @deprecated Since v17. Use state instead. Will be removed in v19.
1299
- */
1300
- get currentState() { return this.state ?? ''; }
1301
- /**
1302
- * @deprecated Since v17. Use changeState instead. Will be removed in v19.
1303
- */
1304
- set currentState(state) { this?.changeState(state); }
1305
- /**
1306
- * @deprecated Since v17. Use onSectionActivation instead. Will be removed in v19.
1307
- */
1308
- get formRoute() { return this._formRoute ?? ''; }
1309
- /**
1310
- * @deprecated Since v17. Use onSectionActivation instead. Will be removed in v19.
1311
- */
1312
- set formRoute(route) { this._formRoute = route; }
1313
- /**
1314
- * @deprecated Since v17. Use onSectionActivation instead. Will be removed in v19.
1315
- */
1316
- addSectionActivation(codes, callback, properties = null) {
1317
- return this.onSectionActivation(codes, callback, properties);
1318
- }
1319
- /**
1320
- * @deprecated Since v17. Use onSectionInactivation instead. Will be removed in v19.
1321
- */
1322
- addSectionInactivation(codes, callback, properties = null) {
1323
- return this.onSectionInactivation(codes, callback, properties);
1324
- }
1325
- /**
1326
- * @deprecated Since v17. Use onActionStart instead. Will be removed in v19.
1327
- */
1328
- addActionMethodStart(codes, callback, properties = null) {
1329
- return this.onActionStart(codes, callback, properties);
1330
- }
1331
- /**
1332
- * @deprecated Since v17. Use onActionFinish instead. Will be removed in v19.
1333
- */
1334
- addActionMethodFinish(codes, callback, properties = null) {
1335
- return this.onActionFinish(codes, callback, properties);
1336
- }
1337
- /**
1338
- * @deprecated Since v17. Use onFieldInput instead. Will be removed in v19.
1339
- */
1340
- addFieldInputValidation(codes, callback, properties = null) {
1341
- return this.onFieldInput(codes, callback, properties);
1342
- }
1343
- /**
1344
- * @deprecated Since v17. Use onFieldValidationStart instead. Will be removed in v19.
1345
- */
1346
- addFieldValidationStart(codes, callback, properties = null) {
1347
- return this.onFieldValidationStart(codes, callback, properties);
1348
- }
1349
- /**
1350
- * @deprecated Since v17. Use onFieldValidationFinish instead. Will be removed in v19.
1351
- */
1352
- addFieldValidationFinish(codes, callback, properties = null) {
1353
- return this.onFieldValidationFinish(codes, callback, properties);
1354
- }
1355
- /**
1356
- * @deprecated Since v17. Use onTableActionStart instead. Will be removed in v19.
1357
- */
1358
- addTableActionStart(code, actionCode, callback, properties = null) {
1359
- return this.onTableActionStart(code, actionCode, callback, properties);
1360
- }
1361
- /**
1362
- * @deprecated Since v17. Use onTableActionFinish instead. Will be removed in v19.
1363
- */
1364
- addTableActionFinish(code, actionCode, callback, properties = null) {
1365
- return this.onTableActionFinish(code, actionCode, callback, properties);
1366
- }
1367
- /**
1368
- * @deprecated Since v17. Use onTableSelectionStart instead. Will be removed in v19.
1369
- */
1370
- addTableSelectionStart(code, callback, properties = null) {
1371
- return this.onTableSelectionStart(code, callback, properties);
1372
- }
1373
- /**
1374
- * @deprecated Since v17. Use onTableSelectionFinish instead. Will be removed in v19.
1375
- */
1376
- addTableSelectionFinish(code, callback, properties = null) {
1377
- return this.onTableSelectionFinish(code, callback, properties);
1378
- }
1379
- /**
1380
- * @deprecated Since v17. Use onTableGetDataStart instead. Will be removed in v19.
1381
- */
1382
- addTableGetDataStart(code, callback, properties = null) {
1383
- return this.onTableGetDataStart(code, callback, properties);
1384
- }
1385
- /**
1386
- * @deprecated Since v17. Use onTableGetDataFinish instead. Will be removed in v19.
1387
- */
1388
- addTableGetDataFinish(code, callback, properties = null) {
1389
- return this.onTableGetDataFinish(code, callback, properties);
1390
- }
1391
- /**
1392
- * @deprecated Since v17. Use processInputParams instead. Will be removed in v19.
1393
- */
1394
- preocessInputParams(params) {
1395
- return this.processInputParams(params);
1396
- }
1397
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BasicFormComponent, deps: [{ token: i1.LibFormManagerService }, { token: i2.LibEventManagerService }, { token: i3.LibFileManagementService }], target: i0.ɵɵFactoryTarget.Component });
1398
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BasicFormComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
1399
- }
1400
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BasicFormComponent, decorators: [{
1401
- type: Component,
1402
- args: [{
1403
- standalone: true,
1404
- template: `<ng-content></ng-content>`,
1405
- changeDetection: ChangeDetectionStrategy.OnPush
1406
- }]
1407
- }], ctorParameters: () => [{ type: i1.LibFormManagerService }, { type: i2.LibEventManagerService }, { type: i3.LibFileManagementService }] });
1408
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1YWluLW5nLWZvcm1zLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvYmFzaWMtZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSWhFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7O0FBSzlFLE1BQU0sZUFBZSxHQUFHLG1CQUFtQixDQUFDO0FBQzVDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQztBQUMvQixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUM7QUFDL0IsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBRWxDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFPdEIsTUFBTSxPQUFnQixrQkFBbUIsU0FBUSxvQkFBb0I7SUFtRHZEO0lBQ0E7SUFDQTtJQXBESixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhDLGFBQWEsR0FBa0IsSUFBSSxDQUFDO0lBQ3BDLFlBQVksR0FBa0IsSUFBSSxDQUFDO0lBQ25DLFVBQVUsR0FBa0IsSUFBSSxDQUFDO0lBQ2pDLG1CQUFtQixHQUFZLEtBQUssQ0FBQztJQUNyQyxtQkFBbUIsR0FBWSxJQUFJLENBQUM7SUFDNUMsK0JBQStCO0lBQ3ZCLGdCQUFnQixHQUFnQyxFQUFFLENBQUM7SUFDbkQsMEJBQTBCLEdBQW9DLEVBQUUsQ0FBQztJQUNqRSxx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bnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBzaWduYWwsIE9uSW5pdCwgaW5qZWN0LCBEZXN0cm95UmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybVN0cnVjdHVyZUFuZERhdGEgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL2Zvcm0nO1xuaW1wb3J0IHsgTGliRm9ybU1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGliRXZlbnRNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V2ZW50LW1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMaWJGaWxlTWFuYWdlbWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWxlLW1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtQWN0aW9uVHlwZSwgTk9fRVJST1IgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL2Zvcm0uY29uc3RhbnRzJztcbmltcG9ydCB7IEZpZWxkRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZm9ybXMvZmllbGQnO1xuaW1wb3J0IHsgUmVjb3JkRm9ybVNlY3Rpb24gfSBmcm9tICcuLi8uLi9jbGFzc2VzL2Zvcm1zL3NlY3Rpb24nO1xuaW1wb3J0IHsgRXZlbnRDYWxsYmFjayB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZm9ybS1jb25maWcuaW50ZXJmYWNlJztcblxuY29uc3QgUEFZTE9BRF9WRVJTSU9OID0gJ1RVQUlORVhDSEFOR0VfMS4wJztcbmNvbnN0IElOTElORV9BQ1RJT04gPSAnSU5MSU5FJztcbmNvbnN0IEdMT0JBTF9BQ1RJT04gPSAnR0xPQkFMJztcbmNvbnN0IEdFVF9EQVRBX0FDVElPTiA9ICdHRVREQVRBJztcblxuY29uc3QgU1VCSkVDVCA9ICdzdWJqZWN0JztcbmNvbnN0IFRPS0VOID0gJ3Rva2VuJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2ljRm9ybUNvbXBvbmVudCBleHRlbmRzIEZvcm1TdHJ1Y3R1cmVBbmREYXRhIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgX2NvbnRyb2xUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX29yaWdpblRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZm9ybVJvdXRlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZGVmaW5pdGlvbk9idGFpbmVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX25vdGlmeUZvcm1BY3Rpdml0eTogYm9vbGVhbiA9IHRydWU7XG4gIC8vIEV2ZW50b3MgZGUgYWNjaW9uZXMgeSBjYW1wb3NcbiAgcHJpdmF0ZSBfZm9ybUNoYW5nZVN0YXRlOiAoKHN0YXRlOiBzdHJpbmcpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSBfZm9ybVNlY3Rpb25zQ2FuRGVhY3RpdmF0ZTogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPiA9IHt9O1xuICBwcml2YXRlIF9mb3JtU2VjdGlvbnNBY3RpdmF0ZTogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPiA9IHt9O1xuICBwcml2YXRlIF9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlOiBSZWNvcmQ8c3RyaW5nLCBFdmVudENhbGxiYWNrW10+ID0ge307XG4gIHByaXZhdGUgX2Zvcm1BY3Rpb25zU3RhcnQ6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4gPSB7fTtcbiAgcHJpdmF0ZSBfZm9ybUFjdGlvbnNGaW5pc2g6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4gPSB7fTtcbiAgcHJpdmF0ZSBfZmllbGRDdXN0b21FdmVudDogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPiA9IHt9O1xuICBwcml2YXRlIF9maWVsZElucHV0VmFsaWRhdGlvbjogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPiA9IHt9O1xuICBwcml2YXRlIF9maWVsZFZhbGlkYXRpb25zU3RhcnQ6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4gPSB7fTtcbiAgcHJpdmF0ZSBfZmllbGRWYWxpZGF0aW9uc0ZpbmlzaDogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPiA9IHt9O1xuICAvLyBDYWxsYmFjayBkZSBhY2Npb25lcyBkZSB0YWJsYXNcbiAgcHJpdmF0ZSBfdGFibGVTZWxlY3Rpb25zU3RhcnQ6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4gPSB7fTtcbiAgcHJpdmF0ZSBfdGFibGVTZWxlY3Rpb25zRmluaXNoOiBSZWNvcmQ8c3RyaW5nLCBFdmVudENhbGxiYWNrW10+ID0ge307XG4gIHByaXZhdGUgX3RhYmxlQWN0aW9uc1N0YXJ0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBFdmVudENhbGxiYWNrW10+PiA9IHt9O1xuICBwcml2YXRlIF90YWJsZUFjdGlvbnNGaW5pc2g6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4+ID0ge307XG4gIHByaXZhdGUgX3RhYmxlR2V0RGF0YVN0YXJ0OiBSZWNvcmQ8c3RyaW5nLCBFdmVudENhbGxiYWNrW10+ID0ge307XG4gIHByaXZhdGUgX3RhYmxlR2V0RGF0YUZpbmlzaDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFjaz4+ID0ge307XG4gIC8vIEVycm9yZXMgZW4gcHJvY2Vzb3NcbiAgcHJpdmF0ZSBfYWN0aW9uU2VydmVyRXJyb3I6IEV2ZW50Q2FsbGJhY2tbXSA9IFtdO1xuICBwcml2YXRlIF9maWVsZFNlcnZlckVycm9yOiBFdmVudENhbGxiYWNrW10gPSBbXTtcbiAgcHJpdmF0ZSBfdGFibGVTZXJ2ZXJFcnJvcjogRXZlbnRDYWxsYmFja1tdID0gW107XG4gIC8vIEFjY2lvbmVzIGVuIGN1cnNvIGRlbnRybyBkZWwgZm9ybXVsYXJpb1xuICBwcml2YXRlIF9hY3Rpb25zSW5Qcm9ncmVzczogUmVjb3JkPHN0cmluZywgeyBzZW50OiBEYXRlIH0+ID0ge307XG4gIHByaXZhdGUgX3NlcnZlckFjdGlvbnNJblByb2dyZXNzOiBSZWNvcmQ8c3RyaW5nLCB7IHNlbnQ6IERhdGUgfT4gPSB7fTtcbiAgLy8gRGF0b3MgY29tcGxlbWVudGFyaW9zIGRlbCBmb3JtdWxhcmlvXG4gIHByb3RlY3RlZCBpbnB1dERhdGFGaWVsZHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgcHJvdGVjdGVkIGV4dHJhRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICBwcm90ZWN0ZWQgX2V2ZW50RW1pdGVyOiBMaWJFdmVudE1hbmFnZXJTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZW5hYmxlZFNlY3Rpb25zOiBSZWNvcmRGb3JtU2VjdGlvbltdID0gW107XG4gIC8vIEdlc3Rpw7NuIGRlIGVycm9yXG4gIF9lcnJvclR5cGU6IHN0cmluZyA9ICcnO1xuICBlcnJvckNvZGU6IHN0cmluZyA9ICcnO1xuICBlcnJvckZ1bGxDb2RlOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JOYW1lOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgZXJyb3JEZXRhaWw6IHN0cmluZyA9ICcnO1xuXG4gIC8vIENvbnRyb2wgZGUgZXN0YWRvXG4gIHZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYnVzeSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1NYW5hZ2VyU2VydmljZTogTGliRm9ybU1hbmFnZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBfZXZlbnRNYW5hZ2VyOiBMaWJFdmVudE1hbmFnZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBmaWxlTWdtdFNlcnZpY2VzOiBMaWJGaWxlTWFuYWdlbWVudFNlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2V2ZW50RW1pdGVyID0gdGhpcy5fZXZlbnRNYW5hZ2VyO1xuICAgIHRoaXMuY2xlYW5TdGFydCgpO1xuICB9XG5cbiAgY2xlYW5TdGFydCgpIHtcbiAgICB0aGlzLl9lcnJvclR5cGUgPSAnJztcbiAgICB0aGlzLmVycm9yQ29kZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JGdWxsQ29kZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JOYW1lID0gJyc7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLmVycm9yRGV0YWlsID0gJyc7XG4gICAgdGhpcy5jbGVhbkZvcm0oKTtcbiAgICB0aGlzLl9jb250cm9sVG9rZW4gPSBudWxsO1xuICAgIHRoaXMuaW5wdXREYXRhRmllbGRzID0ge307XG4gICAgdGhpcy5fZGVmaW5pdGlvbk9idGFpbmVkID0gZmFsc2U7XG4gICAgLy8gU2UgbGltcGlhbiBsb3MgbWFuZWphZG9yZXMgZGUgZXZlbnRvc1xuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuX2Zvcm1DaGFuZ2VTdGF0ZSA9IFtdO1xuICAgIHRoaXMuX2Zvcm1TZWN0aW9uc0NhbkRlYWN0aXZhdGUgPSB7fTtcbiAgICB0aGlzLl9mb3JtU2VjdGlvbnNBY3RpdmF0ZSA9IHt9O1xuICAgIHRoaXMuX2Zvcm1TZWN0aW9uc0luYWN0aXZhdGUgPSB7fTtcbiAgICB0aGlzLl9mb3JtQWN0aW9uc1N0YXJ0ID0ge307XG4gICAgdGhpcy5fZm9ybUFjdGlvbnNGaW5pc2ggPSB7fTtcbiAgICB0aGlzLl9maWVsZEN1c3RvbUV2ZW50ID0ge307XG4gICAgdGhpcy5fZmllbGRJbnB1dFZhbGlkYXRpb24gPSB7fTtcbiAgICB0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLl9maWVsZFZhbGlkYXRpb25zRmluaXNoID0ge307XG4gICAgdGhpcy5fdGFibGVTZWxlY3Rpb25zU3RhcnQgPSB7fTtcbiAgICB0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2ggPSB7fTtcbiAgICB0aGlzLl90YWJsZUFjdGlvbnNTdGFydCA9IHt9O1xuICAgIHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaCA9IHt9O1xuICAgIHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0ID0ge307XG4gICAgdGhpcy5fdGFibGVHZXREYXRhRmluaXNoID0ge307XG5cbiAgICB0aGlzLl9hY3Rpb25TZXJ2ZXJFcnJvciA9IFtdO1xuICAgIHRoaXMuX2ZpZWxkU2VydmVyRXJyb3IgPSBbXTtcbiAgICB0aGlzLl90YWJsZVNlcnZlckVycm9yID0gW107XG5cbiAgICB0aGlzLm9uQWN0aW9uU2VydmVyRXJyb3IoKCkgPT4gdGhpcy5kaXNwbGF5QWN0aW9uU2VydmVyRXJyb3IoKSk7XG4gICAgdGhpcy5vblZhbGlkYXRpb25TZXJ2ZXJFcnJvcigoKSA9PiB0aGlzLmRpc3BsYXlWYWxpZGF0aW9uU2VydmVyRXJyb3IoKSk7XG4gICAgdGhpcy5vblRhYmxlU2VydmVyRXJyb3IoKCkgPT4gdGhpcy5kaXNwbGF5VGFibGVTZXJ2ZXJFcnJvcigpKTtcbiAgfVxuXG4gIGdldCBmb3JtVmlzaWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMudmlzaWJsZTsgfVxuICBnZXQgZm9ybSgpIHsgcmV0dXJuIHRoaXM7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnByZVN0YXJ0KCk7XG4gICAgdGhpcy5jdXN0b21QcmVQcm9jZXNzaW5nKCk7XG4gIH1cblxuICAvLyBNw6l0b2RvcyB2aXJ0dWFsZXNcbiAgcHJlU3RhcnQoKSB7IH1cbiAgc3RhcnQoKSB7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2UgcHJlU3RhcnQgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGN1c3RvbVByZVByb2Nlc3NpbmcoKSB7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBPdmVybG9hZCBzdGFydCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgY3VzdG9tRm9ybVN0YXJ0KCkgeyB9XG5cbiAgZGlzcGxheUFjdGlvblNlcnZlckVycm9yKCkgeyB9XG4gIGRpc3BsYXlWYWxpZGF0aW9uU2VydmVyRXJyb3IoKSB7IH1cbiAgZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKSB7IH1cbiAgc2hvd0ZpZWxkSW5mbyhjb2RlPzogc3RyaW5nLCBkZXRhaWw/OiBhbnkpIHsgfVxuICBzaG93TW9kYWxEaWFsb2codGl0bGU6IGFueSwgYm9keTogYW55LCBvcHRpb25zOiBhbnksIGNhbGxiYWNrPzogYW55LCBwYXJhbXM/OiBhbnkpIHsgfVxuICBvcGVuVXBsb2FkRGlhbG9nKHRpdGxlOiBhbnksIGJvZHk6IGFueSwgb3B0aW9uczogYW55LCBjYWxsYmFjaz86IGFueSwgcGFyYW1zPzogYW55KSB7IH1cblxuICBzdWJzY3JpYmVBcHBFdmVudChldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogdm9pZCB7XG4gICAgdGhpcy5fZXZlbnRFbWl0ZXIuc3Vic2NyaWJlKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xuICB9XG5cbiAgb3BlbkZvcm0obmFtZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsLCBiYWNrRGF0YTogYW55ID0gbnVsbCwgY2xlYW5TdGFjayA9IGZhbHNlKTogdm9pZCB7XG4gICAgbGV0IG9yaWdpbjogYW55ID0gbnVsbDtcbiAgICBpZiAoIWNsZWFuU3RhY2spIHtcbiAgICAgIG9yaWdpbiA9IHsgLi4uYmFja0RhdGEsIG5hbWU6IHRoaXMubmFtZSwgdXJsOiB0aGlzLl9mb3JtUm91dGUsIHRva2VuOiB0aGlzLl9jb250cm9sVG9rZW4gfTtcbiAgICAgIG9yaWdpbi5zdWJqZWN0ID0gb3JpZ2luPy5zdWJqZWN0ID8/IHRoaXMuc3ViamVjdDtcbiAgICAgIG9yaWdpbi5zdGF0ZSA9IG9yaWdpbj8uc3RhdGUgPz8gdGhpcy5zdGF0ZTtcbiAgICAgIG9yaWdpbi5maWVsZHMgPSBvcmlnaW4/LmZpZWxkcyA/PyB7fTtcbiAgICAgIG9yaWdpbi5leHRyYSA9IG9yaWdpbj8uZXh0cmEgPz8ge307XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IHsgLi4uZGF0YSwgbmFtZSB9O1xuICAgIHRhcmdldC5zdWJqZWN0ID0gdGFyZ2V0Py5zdWJqZWN0ID8/IG51bGw7XG4gICAgdGFyZ2V0LnN0YXRlID0gdGFyZ2V0Py5zdGF0ZSA/PyBudWxsO1xuICAgIHRhcmdldC5maWVsZHMgPSB0YXJnZXQ/LmZpZWxkcyA/PyB7fTtcbiAgICB0YXJnZXQuZXh0cmEgPSB0YXJnZXQ/LmV4dHJhID8/IHt9O1xuICAgIHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLm9wZW5Gb3JtKG9yaWdpbiwgdGFyZ2V0KTtcbiAgfVxuXG4gIGVuYWJsZUFjdGl2aXR5Tm90aWZpY2F0aW9uKCkgeyB0aGlzLl9ub3RpZnlGb3JtQWN0aXZpdHkgPSB0cnVlOyB9XG4gIGRpc2FibGVBY3Rpdml0eU5vdGlmaWNhdGlvbigpIHsgdGhpcy5fbm90aWZ5Rm9ybUFjdGl2aXR5ID0gZmFsc2U7IH1cbiAgY2FuR29CYWNrKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fb3JpZ2luVG9rZW4gIT09IG51bGwgfVxuICBnb0JhY2soKTogdm9pZCB7IHJldHVybiB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5iYWNrVG8oKTsgfVxuICBnb0JhY2tGb3JtKCk6IHZvaWQgeyByZXR1cm4gdGhpcy5nb0JhY2soKTsgfVxuICBnZXRPcmlnaW5EZXRhaWwoKTogYW55IHsgcmV0dXJuIHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlPy5nZXRGb3JtSW5mbyh0aGlzLl9vcmlnaW5Ub2tlbiA/PyAnJyk7IH1cblxuICBzZXRFcnJvcihlcnJvclR5cGU6IHN0cmluZyB8IG51bGwsIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbCwgZXJyb3JEZXRhaWw6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9lcnJvclR5cGUgPSBlcnJvclR5cGUgfHwgJyc7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UgfHwgJyc7XG4gICAgdGhpcy5lcnJvckRldGFpbCA9IGVycm9yRGV0YWlsIHx8ICcnO1xuICB9XG5cbiAgcmVzZXRFcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLmVycm9yQ29kZSA9IE5PX0VSUk9SO1xuICAgIHRoaXMuZXJyb3JGdWxsQ29kZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JOYW1lID0gJyc7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICB0aGlzLmVycm9yRGV0YWlsID0gJyc7XG4gIH1cblxuICBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2Vycm9yVHlwZTsgfVxuICBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZXJyb3JNZXNzYWdlOyB9XG4gIGdldEVycm9yRGV0YWlsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmVycm9yRGV0YWlsOyB9XG4gIGdldEVycm9yTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5lcnJvck5hbWU7IH1cbiAgZ2V0RXJyb3JGdWxsQ29kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5lcnJvckZ1bGxDb2RlOyB9XG4gIGdldEVycm9yQ29kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5lcnJvckNvZGU7IH1cblxuICBnZXRGb3JtUGFyYW1ldGVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChuYW1lKSA/ICh0aGlzLmV4dHJhRGF0YT8uW25hbWVdID8/IG51bGwpIDogbnVsbDtcbiAgfVxuXG4gIHByb2Nlc3NJbnB1dFBhcmFtcyhwYXJhbXM6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIHRoaXMuX2NvbnRyb2xUb2tlbiA9IHBhcmFtcz8uW1RPS0VOXSA/PyBudWxsO1xuICAgIHRoaXMuc3ViamVjdCA9IHBhcmFtcz8uW1NVQkpFQ1RdID8/IG51bGw7XG4gICAgY29uc3QgdG9rZW5JbmZvOiBhbnkgPSAodGhpcy5fY29udHJvbFRva2VuKSA/IHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLmdldEZvcm1JbmZvKHRoaXMuX2NvbnRyb2xUb2tlbikgOiB7fTtcbiAgICBjb25zdCB7IHRva2VuLCBzdWJqZWN0LCBzdGF0ZSwgZmllbGRzLCBleHRyYSwgb3JpZ2luVG9rZW4gfSA9IHRva2VuSW5mbztcbiAgICBpZiAodG9rZW4gJiYgdGhpcy5fY29udHJvbFRva2VuID09PSB0b2tlbikge1xuICAgICAgdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0ID8/IHN1YmplY3QgPz8gbnVsbDtcbiAgICAgIHRoaXMuaW5wdXREYXRhRmllbGRzID0gZmllbGRzO1xuICAgICAgdGhpcy5leHRyYURhdGEgPSBleHRyYTtcbiAgICAgIHRoaXMuX29yaWdpblRva2VuID0gb3JpZ2luVG9rZW47XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3Vic2NyaWJlU2VjdGlvbkFjdGl2YXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybVNlY3Rpb25zID0gdGhpcy5zZWN0aW9ucztcbiAgICBjb25zdCBzZWN0aW9uTmFtZXMgPSBPYmplY3Qua2V5cyhmb3JtU2VjdGlvbnMpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzZWN0aW9uTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzZWN0aW9uTmFtZSA9IHNlY3Rpb25OYW1lc1tpbmRleF07XG4gICAgICBjb25zdCBzZWN0aW9uID0gZm9ybVNlY3Rpb25zW3NlY3Rpb25OYW1lXTtcbiAgICAgIHNlY3Rpb24uYWN0aXZhdGlvblxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY29kZTogc3RyaW5nKSA9PiB0aGlzLmxhdW5jaFNlY3Rpb25BY3RpdmF0aW9uKGNvZGUpKTtcbiAgICAgIHNlY3Rpb24uaW5hY3RpdmF0aW9uXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAuc3Vic2NyaWJlKChjb2RlOiBzdHJpbmcpID0+IHRoaXMubGF1bmNoU2VjdGlvbkluYWN0aXZhdGlvbihjb2RlKSk7XG4gICAgICAvLyBBZGljaW9uYWxtZW50ZSBzZSBsZSBwaWRlIGEgbGEgc2VjY2nDs24gc2Ugc3Vic2NyaWJhIGFsIGNhbWJpbyBkZSBlc3RhZG8gZGVsIGZvcm11bGFyaW9cbiAgICAgIHNlY3Rpb24uY29ubmVjdFdpdGhQYXJlbnRGb3JtKHRoaXMsIHRoaXMuc3RhdGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZUZpZWxkc1N1YmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLmdldEZpZWxkcygpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1GaWVsZHMpKSB7XG4gICAgICBmb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICBmaWVsZC5jdXN0b21FdmVudFxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgZXZlbnROYW1lLCBldmVudERhdGEgfSA9IGV2ZW50O1xuICAgICAgICAgICAgdGhpcy5zdGFydEZpZWxkQ3VzdG9tRXZlbnQoY29kZSwgZXZlbnROYW1lLCBldmVudERhdGEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICBmaWVsZC5lZGl0aW9uRmluaXNoXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uIH0gPSBldmVudDtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRGaWVsZFZhbGlkYXRpb24oY29kZSwgaW50cmluc2ljVmFsaWRhdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIGZpZWxkLmVkaXRpb25QYXJ0aWFsXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uIH0gPSBldmVudDtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRGaWVsZElucHV0VmFsaWRhdGlvbihjb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgZmllbGQuZGV0YWlsUmVxdWVzdFxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHRoaXMuc2hvd0ZpZWxkSW5mbyhldmVudC5jb2RlLCBldmVudC5kZXRhaWwpKTtcbiAgICAgICAgLy8gQWRpY2lvbmFsbWVudGUgc2UgbGUgcGlkZSBhbCBjYW1wbyBzZSBzdWJzY3JpYmEgYWwgY2FtYmlvIGRlIGVzdGFkbyBkZWwgZm9ybXVsYXJpb1xuICAgICAgICBmaWVsZC5jb25uZWN0V2l0aFBhcmVudEZvcm0odGhpcywgdGhpcy5zdGF0ZUNoYW5nZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdWJzY3JpYmVBY3Rpb25TdWJqZWN0cygpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtQWN0aW9ucyA9IHRoaXMuZ2V0QWN0aW9ucygpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1BY3Rpb25zKSkge1xuICAgICAgZm9ybUFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICBhY3Rpb24uYWN0aW9uQWN0aXZhdGVkXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoY29kZTogc3RyaW5nKSA9PiB0aGlzLnN0YXJ0QWN0aW9uKGNvZGUpKTtcbiAgICAgICAgLy8gQWRpY2lvbmFsbWVudGUgc2UgbGUgcGlkZSBhIGxhIGFjY2nDs24gc2Ugc3Vic2NyaWJhIGFsIGNhbWJpbyBkZSBlc3RhZG8gZGVsIGZvcm11bGFyaW9cbiAgICAgICAgYWN0aW9uLmNvbm5lY3RXaXRoUGFyZW50Rm9ybSh0aGlzLCB0aGlzLnN0YXRlQ2hhbmdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZVRhYmxlU3ViamVjdHMoKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybVRhYmxlcyA9IHRoaXMuZ2V0VGFibGVzKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVRhYmxlcykpIHtcbiAgICAgIGZvcm1UYWJsZXMuZm9yRWFjaCh0YWJsZSA9PiB7XG4gICAgICAgIHRhYmxlLmlubGluZUFjdGlvblRyaWdnZXJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB0aGlzLnN0YXJ0VGFibGVBY3Rpb24oZXZlbnQpKTtcbiAgICAgICAgdGFibGUuZ2xvYmFsQWN0aW9uVHJpZ2dlclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHRoaXMuc3RhcnRUYWJsZUdsb2JhbEFjdGlvbihldmVudCkpO1xuICAgICAgICB0YWJsZS5yZWNvcmRTZWxlY3Rpb25UcmlnZ2VyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4gdGhpcy5zdGFydFRhYmxlUmVjb3JkU2VsZWN0aW9uKGV2ZW50KSk7XG4gICAgICAgIHRhYmxlLnNlbGVjdGlvbkFjdGlvblRyaWdnZXJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB0aGlzLnN0YXJ0VGFibGVTZWxlY3Rpb25BY3Rpb24oZXZlbnQpKTtcbiAgICAgICAgdGFibGUuZ2V0RGF0YVRyaWdnZXJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB0aGlzLnN0YXJ0VGFibGVHZXREYXRhKGV2ZW50KSk7XG4gICAgICAgIC8vIEFkaWNpb25hbG1lbnRlIHNlIGxlIHBpZGUgYSBsYSB0YWJsYSBzZSBzdWJzY3JpYmEgYWwgY2FtYmlvIGRlIGVzdGFkbyBkZWwgZm9ybXVsYXJpb1xuICAgICAgICB0YWJsZS5jb25uZWN0V2l0aFBhcmVudEZvcm0odGhpcywgdGhpcy5zdGF0ZUNoYW5nZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmb3JtSW5pdChwYXJhbXM6IGFueSwgZm9yY2VSZWxvYWQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbml0aWFsU3RhdGU6IHN0cmluZyB8IG51bGwgPSB0aGlzLnByb2Nlc3NJbnB1dFBhcmFtcyhwYXJhbXMpO1xuICAgIGlmICghdGhpcy5uYW1lKSB7IHJldHVybjsgfVxuICAgIHRyeSB7XG4gICAgICBpZiAoZm9yY2VSZWxvYWQgfHwgIXRoaXMuX2RlZmluaXRpb25PYnRhaW5lZCkge1xuICAgICAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgICAgICBjb25zdCBmb3JtRGVmaW5pdGlvbiA9IGF3YWl0IHRoaXMuZm9ybU1hbmFnZXJTZXJ2aWNlLmdldEZvcm1EZWZpbml0aW9uKHRoaXMubmFtZSk7XG4gICAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmxvYWREZWZpbml0aW9uKGZvcm1EZWZpbml0aW9uKVxuICAgICAgICB0aGlzLl9kZWZpbml0aW9uT2J0YWluZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGVhbkRhdGEoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGxvYWRpbmcgZm9ybSBkZWZpbml0aW9uIGZvciAke3RoaXMubmFtZX06ICR7ZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnN1cHBvcnRTdGF0ZShpbml0aWFsU3RhdGUgPz8gJycpKSB7XG4gICAgICBpbml0aWFsU3RhdGUgPSB0aGlzLmRlZmF1bHRTdGF0ZSA/PyBudWxsO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dEZpZWxkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmlucHV0RGF0YUZpZWxkcyk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGlucHV0RmllbGROYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dEZpZWxkTmFtZXNbaW5kZXhdO1xuICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHRoaXMuaW5wdXREYXRhRmllbGRzW2NvZGVdO1xuICAgICAgdGhpcy5zZXRGaWVsZFZhbHVlKGNvZGUsIGZpZWxkVmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZVNlY3Rpb25BY3RpdmF0aW9uKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVGaWVsZHNTdWJqZWN0cygpO1xuICAgIHRoaXMuc3Vic2NyaWJlQWN0aW9uU3ViamVjdHMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRhYmxlU3ViamVjdHMoKTtcbiAgICAvLyBTZSBkZWZpbmUgZWwgZXN0YWRvIGluaWNpYWwgeSBzZSBzb2xpY2l0YSBsYSBhY2Npw7NuIGluaWNpYWxcbiAgICB0aGlzLmNoYW5nZVN0YXRlKGluaXRpYWxTdGF0ZSB8fCB0aGlzLmRlZmF1bHRTdGF0ZSk7XG4gICAgaWYgKHRoaXMubG9hZEluaXRpYWxEYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWNvcmRSZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdEZvcm1BY3Rpb24oRm9ybUFjdGlvblR5cGUuR2V0RGF0YSk7XG4gICAgICAgIHRoaXMuY2hlY2tFcnJvclJlY29yZFJlY2VpdmVkKHJlY29yZFJlc3BvbnNlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbG9hZGluZyBpbml0aWFsIGRhdGEgZm9yICR7dGhpcy5uYW1lfTogJHtlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMuZW5hYmxlZFNlY3Rpb25zID0gdGhpcy52aXNpYmxlU2VjdGlvbnMgPz8gW107XG5cbiAgICB0aGlzLnN0YXJ0KCk7XG4gICAgdGhpcy5jdXN0b21Gb3JtU3RhcnQoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNoYW5nZVN0YXRlKHN0YXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGF0ZUNoYW5nZWQgPSBzdXBlci5jaGFuZ2VTdGF0ZShzdGF0ZSA/PyAnJykgPz8gZmFsc2U7XG4gICAgaWYgKHN0YXRlQ2hhbmdlZCkge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uTWV0aG9kcyA9IHRoaXMuX2Zvcm1DaGFuZ2VTdGF0ZTtcbiAgICAgIGlmIChjbGllbnRBY3Rpb25NZXRob2RzICYmIGNsaWVudEFjdGlvbk1ldGhvZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNsaWVudEFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgICBjYWxsYmFjayhzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlQ2hhbmdlZDtcbiAgfVxuXG4gIGNoZWNrRXJyb3JSZWNvcmRSZWNlaXZlZChyZWNvcmRSZXNwb25zZTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBlcnJvciB9ID0gcmVjb3JkUmVzcG9uc2UgPz8ge307XG4gICAgaWYgKCFlcnJvcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB0aGlzLmVycm9yQ29kZSA9IHJlY29yZFJlc3BvbnNlLmVycm9yQ29kZTtcbiAgICB0aGlzLmVycm9yRnVsbENvZGUgPSByZWNvcmRSZXNwb25zZS5lcnJvckZ1bGxDb2RlO1xuICAgIHRoaXMuZXJyb3JOYW1lID0gcmVjb3JkUmVzcG9uc2UuZXJyb3JOYW1lO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gcmVjb3JkUmVzcG9uc2UuZXJyb3JNZXNzYWdlO1xuICAgIHRoaXMuZXJyb3JEZXRhaWwgPSByZWNvcmRSZXNwb25zZS5lcnJvckRldGFpbDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGVycm9yT2NjdXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuZXJyb3JDb2RlICE9PSBOT19FUlJPUik7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyRXZlbnRIYW5kbGVyKFxuICAgIGhhbmRsZXJNYXA6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT4sXG4gICAgY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCxcbiAgICBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gICAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGVTZXQgPSBBcnJheS5pc0FycmF5KGNvZGVzKSA/IGNvZGVzIDogKGNvZGVzID8gW2NvZGVzXSA6IFtdKTtcbiAgICBjb2RlU2V0LmZvckVhY2goKGNvZGUpID0+IHtcbiAgICAgIGlmICghaGFuZGxlck1hcFtjb2RlXSkgeyBoYW5kbGVyTWFwW2NvZGVdID0gW107IH1cbiAgICAgIGhhbmRsZXJNYXBbY29kZV0ucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVFdmVudEhhbmRsZXIoXG4gICAgaGFuZGxlck1hcDogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPixcbiAgICBjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNvZGVTZXQgPSBBcnJheS5pc0FycmF5KGNvZGVzKSA/IGNvZGVzIDogKGNvZGVzID8gW2NvZGVzXSA6IFtdKTtcbiAgICBjb2RlU2V0LmZvckVhY2goKGNvZGUpID0+IHsgaGFuZGxlck1hcFtjb2RlXSA9IFtdOyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUhhbmRsZXJzKFxuICAgIGhhbmRsZXJzOiBFdmVudENhbGxiYWNrW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBoYW5kbGVycy5tYXAoKHsgY2FsbGJhY2sgfSkgPT4gY2FsbGJhY2soLi4uYXJncykpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpO1xuICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KHIgPT4gci5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHIudmFsdWUgIT09IGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3BvcnRlIG1hbmVqbyBkZSBldmVudG9zIGRlIGZvcm11bGFyaW9cbiAgICovXG5cbiAgYXN5bmMgcmVxdWVzdEZvcm1BY3Rpb24oYWN0aW9uQ29kZTogc3RyaW5nLCBhY3Rpb25TdWJqZWN0OiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgYWN0aW9uRGV0YWlsID0ge1xuICAgICAgZm9ybUNvZGU6IHRoaXMubmFtZSxcbiAgICAgIGZvcm1TdWJqZWN0OiB0aGlzLnN1YmplY3QsXG4gICAgICBjdXJyZW50TW9kZTogdGhpcy5zdGF0ZSxcbiAgICAgIGFjdGlvbkNvZGUsXG4gICAgICBhY3Rpb25TdWJqZWN0LFxuICAgICAgdmVyc2lvbjogUEFZTE9BRF9WRVJTSU9OLFxuICAgICAgZm9ybURhdGE6IHRoaXMuZ2V0UGF5bG9hZCgpLFxuICAgICAgaW1tdXRhYmxlRGF0YTogdGhpcy5pbW11dGFibGVEYXRhLFxuICAgIH07XG4gICAgdGhpcy5lcnJvckNvZGUgPSBOT19FUlJPUjtcbiAgICB0aGlzLmVycm9yRnVsbENvZGUgPSAnJztcbiAgICB0aGlzLmVycm9yTmFtZSA9ICcnO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgdGhpcy5lcnJvckRldGFpbCA9ICcnO1xuICAgIHRoaXMuYnVzeS5zZXQodHJ1ZSk7XG4gICAgY29uc3QgZm9ybUFjdGlvblJlc3BvbnNlOiBhbnkgPSBhd2FpdCB0aGlzLmZvcm1NYW5hZ2VyU2VydmljZS5leGVjU2VydmVyQWN0aW9uKGFjdGlvbkRldGFpbCk7XG4gICAgaWYgKCFmb3JtQWN0aW9uUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICBpZiAoZm9ybUFjdGlvblJlc3BvbnNlLmhhc0Vycm9yKCkpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gZm9ybUFjdGlvblJlc3BvbnNlLmVycm9yO1xuICAgICAgdGhpcy5lcnJvckNvZGUgPSBlcnJvci5lcnJvckNvZGU7XG4gICAgICB0aGlzLmVycm9yRnVsbENvZGUgPSBlcnJvci5lcnJvckZ1bGxDb2RlO1xuICAgICAgdGhpcy5lcnJvck5hbWUgPSBlcnJvci5lcnJvck5hbWU7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yLmVycm9yTWVzc2FnZTtcbiAgICAgIHRoaXMuZXJyb3JEZXRhaWwgPSBlcnJvci5lcnJvckRldGFpbDtcbiAgICB9XG4gICAgY29uc3QgZm9ybVJlc3BvbnNlRGF0YSA9IGZvcm1BY3Rpb25SZXNwb25zZS5nZXREYXRhKCk7XG4gICAgdGhpcy51cGRhdGVGb3JtV2l0aFNlcnZlckRhdGEoZm9ybVJlc3BvbnNlRGF0YSk7XG4gICAgcmV0dXJuIGZvcm1SZXNwb25zZURhdGE7XG4gIH1cblxuICB1cGRhdGVGb3JtV2l0aFNlcnZlckRhdGEoZm9ybUNvbnRlbnQ6IGFueSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRNb2RlLCBmb3JtU3ViamVjdCwgYWN0aW9ucywgZmllbGRzLCByZWNvcmRUYWJsZXMsXG4gICAgICByZXR1cm5lZEZpbGUsIGltbXV0YWJsZURhdGEsIGV4dHJhSW5mbyxcbiAgICB9ID0gZm9ybUNvbnRlbnQ7XG4gICAgY3VycmVudE1vZGUgJiYgdGhpcy5jaGFuZ2VTdGF0ZShjdXJyZW50TW9kZSk7XG4gICAgaWYgKGZvcm1TdWJqZWN0KSB7IHRoaXMuc3ViamVjdCA9IGZvcm1TdWJqZWN0OyB9XG4gICAgaWYgKGFjdGlvbnMgJiYgYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRBY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICBjb25zdCBhY3Rpb25PYmplY3QgPSB0aGlzLmdldEFjdGlvbihjaGFuZ2VkQWN0aW9uLmFjdGlvbkNvZGUpO1xuICAgICAgICBpZiAoYWN0aW9uT2JqZWN0KSB7IGFjdGlvbk9iamVjdC51cGRhdGVGcm9tU2VydmVyKGNoYW5nZWRBY3Rpb24pOyB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY2hhbmdlZEZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICBjb25zdCBmaWVsZE9iamVjdCA9IHRoaXMuZ2V0RmllbGQoY2hhbmdlZEZpZWxkLmZpZWxkQ29kZSk7XG4gICAgICAgIGlmIChmaWVsZE9iamVjdCkge1xuICAgICAgICAgIGZpZWxkT2JqZWN0LnVwZGF0ZUZyb21TZXJ2ZXIoY2hhbmdlZEZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVjb3JkVGFibGVzICYmIHJlY29yZFRhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZWRUYWJsZSBvZiByZWNvcmRUYWJsZXMpIHtcbiAgICAgICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKGNoYW5nZWRUYWJsZS50YWJsZUNvZGUpO1xuICAgICAgICBpZiAodGFibGVPYmplY3QpIHtcbiAgICAgICAgICB0YWJsZU9iamVjdC51cGRhdGVGcm9tU2VydmVyKGNoYW5nZWRUYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJldHVybmVkRmlsZSAmJiByZXR1cm5lZEZpbGUuZmlsZSkge1xuICAgICAgdGhpcy5maWxlTWdtdFNlcnZpY2VzLnNhdmVGaWxlKHJldHVybmVkRmlsZS5maWxlLCByZXR1cm5lZEZpbGUubmFtZSwgcmV0dXJuZWRGaWxlLnR5cGUpO1xuICAgIH1cbiAgICB0aGlzLmltbXV0YWJsZURhdGEgPSBpbW11dGFibGVEYXRhO1xuICAgIHRoaXMuZXh0cmFJbmZvID0gZXh0cmFJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqbyBkZSBldmVudCBoYW5kbGVycyBwYXJhIGVycm9yZXMgU2VydmVyIGRlbCBmb3JtdWxhcmlvXG4gICAqL1xuXG4gIGNsZWFuQWN0aW9uU2VydmVyRXJyb3IoKSB7IHRoaXMuX2FjdGlvblNlcnZlckVycm9yID0gW107IH1cbiAgY2xlYW5GaWVsZFNlcnZlckVycm9yKCkgeyB0aGlzLl9maWVsZFNlcnZlckVycm9yID0gW107IH1cbiAgY2xlYW5UYWJsZVNlcnZlckVycm9yKCkgeyB0aGlzLl90YWJsZVNlcnZlckVycm9yID0gW107IH1cbiAgb25BY3Rpb25TZXJ2ZXJFcnJvcihjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkgeyB0aGlzLl9hY3Rpb25TZXJ2ZXJFcnJvci5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7IH1cbiAgb25WYWxpZGF0aW9uU2VydmVyRXJyb3IoY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHsgdGhpcy5fZmllbGRTZXJ2ZXJFcnJvci5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7IH1cbiAgb25UYWJsZVNlcnZlckVycm9yKGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7IHRoaXMuX3RhYmxlU2VydmVyRXJyb3IucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pOyB9XG5cbiAgLyoqXG4gICAqIE1hbmVqbyBkZSBldmVudCBoYW5kbGVycyBwYXJhIGFjY2lvbmVzIHNvYnJlIGVsIGZvcm11bGFyaW9cbiAgICovXG5cbiAgb25Gb3JtQ2hhbmdlKGNhbGxiYWNrOiAoc3RhdGU6IHN0cmluZykgPT4gdm9pZCkge1xuICAgIHRoaXMuX2Zvcm1DaGFuZ2VTdGF0ZS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIG9uU2VjdGlvbkNhbkRlYWN0aXZhdGUoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKHRoaXMuX2Zvcm1TZWN0aW9uc0NhbkRlYWN0aXZhdGUsIGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICBvblNlY3Rpb25BY3RpdmF0aW9uKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50SGFuZGxlcih0aGlzLl9mb3JtU2VjdGlvbnNBY3RpdmF0ZSwgY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIG9uU2VjdGlvbkluYWN0aXZhdGlvbihjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXIodGhpcy5fZm9ybVNlY3Rpb25zSW5hY3RpdmF0ZSwgY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIG9uQWN0aW9uU3RhcnQoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKHRoaXMuX2Zvcm1BY3Rpb25zU3RhcnQsIGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICBvbkFjdGlvbkZpbmlzaChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXIodGhpcy5fZm9ybUFjdGlvbnNGaW5pc2gsIGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlTZWN0aW9uQWN0aXZhdGlvbihjb2RlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzZWN0aW9uT2JqZWN0ID0gdGhpcy5nZXRTZWN0aW9uKGNvZGUpO1xuICAgIGlmICghc2VjdGlvbk9iamVjdCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBjb25zdCBjbGllbnRTZWN0aW9uTWV0aG9kcyA9IHRoaXMuX2Zvcm1TZWN0aW9uc0NhbkRlYWN0aXZhdGVbY29kZV07XG4gICAgaWYgKGNsaWVudFNlY3Rpb25NZXRob2RzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNsaWVudFNlY3Rpb25NZXRob2Qgb2YgY2xpZW50U2VjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gY2xpZW50U2VjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY2FuQWN0aXZhdGUgPSBjYWxsYmFjayhzZWN0aW9uT2JqZWN0KTtcbiAgICAgICAgaWYgKGNhbkFjdGl2YXRlID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGxhdW5jaFNlY3Rpb25BY3RpdmF0aW9uKGNvZGU6IHN0cmluZykge1xuICAgIHRoaXMubm90aWZ5Rm9ybUFjdGl2aXR5KCk7XG4gICAgY29uc3Qgc2VjdGlvbk9iamVjdCA9IHRoaXMuZ2V0U2VjdGlvbihjb2RlKTtcbiAgICBpZiAoIXNlY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZHMgPSB0aGlzLl9mb3JtU2VjdGlvbnNBY3RpdmF0ZVtjb2RlXTtcbiAgICBpZiAoY2xpZW50U2VjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZCBvZiBjbGllbnRTZWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSBjbGllbnRTZWN0aW9uTWV0aG9kO1xuICAgICAgICBjYWxsYmFjayhzZWN0aW9uT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBsYXVuY2hTZWN0aW9uSW5hY3RpdmF0aW9uKGNvZGU6IHN0cmluZykge1xuICAgIHRoaXMubm90aWZ5Rm9ybUFjdGl2aXR5KCk7XG4gICAgY29uc3Qgc2VjdGlvbk9iamVjdCA9IHRoaXMuZ2V0U2VjdGlvbihjb2RlKTtcbiAgICBpZiAoIXNlY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgY2xpZW50U2VjdGlvbk1ldGhvZHMgPSB0aGlzLl9mb3JtU2VjdGlvbnNJbmFjdGl2YXRlW2NvZGVdO1xuICAgIGlmIChjbGllbnRTZWN0aW9uTWV0aG9kcykge1xuICAgICAgZm9yIChjb25zdCBjbGllbnRTZWN0aW9uTWV0aG9kIG9mIGNsaWVudFNlY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IGNsaWVudFNlY3Rpb25NZXRob2Q7XG4gICAgICAgIGNhbGxiYWNrKHNlY3Rpb25PYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0QWN0aW9uKGNvZGU6IHN0cmluZykge1xuICAgIHRoaXMubm90aWZ5Rm9ybUFjdGl2aXR5KCk7XG4gICAgY29uc3QgYWN0aW9uT2JqZWN0ID0gdGhpcy5nZXRBY3Rpb24oY29kZSk7XG4gICAgaWYgKCFhY3Rpb25PYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgaWYgKHRoaXMuX2FjdGlvbnNJblByb2dyZXNzW2NvZGVdKSB7XG4gICAgICBjb25zdCB7IHNlbnQgfSA9IHRoaXMuX2FjdGlvbnNJblByb2dyZXNzW2NvZGVdO1xuICAgICAgY29uc29sZS5sb2coYFJlaW5ncmVzbyBzb2JyZSBhY2Npw7NuICR7Y29kZX0gY29uIGVqZWN1Y2nDs24gcHJldmlhICR7c2VudH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYWN0aW9uc0luUHJvZ3Jlc3NbY29kZV0gPSB7IHNlbnQ6IG5ldyBEYXRlKCkgfTtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBhY3Rpb25PYmplY3Quc3RhcnQoKTtcbiAgICBjb25zdCBjbGllbnRBY3Rpb25NZXRob2RzID0gdGhpcy5fZm9ybUFjdGlvbnNTdGFydFtjb2RlXTtcbiAgICBpZiAoY2xpZW50QWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNsaWVudEFjdGlvbk1ldGhvZCBvZiBjbGllbnRBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IGNsaWVudEFjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY29udGludWVBY3Rpb25Qcm9taXNlID0gY2FsbGJhY2soYWN0aW9uT2JqZWN0KTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjb250aW51ZUFjdGlvblByb21pc2UpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMuZXZlcnkociA9PiByLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgci52YWx1ZSAhPT0gZmFsc2UpO1xuICAgICAgaWYgKCFjb250aW51ZUFjdGlvbikge1xuICAgICAgICBhY3Rpb25PYmplY3Quc3RvcCgpO1xuICAgICAgICB0aGlzLl9hY3Rpb25zSW5Qcm9ncmVzc1tjb2RlXSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9hY3Rpb25zSW5Qcm9ncmVzc1tjb2RlXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLnN0YXJ0U2VydmVyQWN0aW9uKGFjdGlvbk9iamVjdCk7XG4gICAgdGhpcy5fYWN0aW9uc0luUHJvZ3Jlc3NbY29kZV0gPSBudWxsO1xuICAgIGRlbGV0ZSB0aGlzLl9hY3Rpb25zSW5Qcm9ncmVzc1tjb2RlXTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2VydmVyQWN0aW9uKGFjdGlvbklucHV0OiBhbnkpIHtcbiAgICBjb25zdCBhY3Rpb24gPSAodHlwZW9mIGFjdGlvbklucHV0ID09PSAnc3RyaW5nJylcbiAgICAgID8gdGhpcy5nZXRBY3Rpb24oYWN0aW9uSW5wdXQpIDogYWN0aW9uSW5wdXQ7XG4gICAgY29uc3QgeyBhY3Rpb25Db2RlOiBjb2RlLCBiYWNrZW5kIH0gPSBhY3Rpb24gPz8ge307XG4gICAgaWYgKCFhY3Rpb24gfHwgIWNvZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGJhY2tlbmQpIHtcbiAgICAgIGlmICh0aGlzLl9zZXJ2ZXJBY3Rpb25zSW5Qcm9ncmVzc1tjb2RlXSkge1xuICAgICAgICBjb25zdCB7IHNlbnQgfSA9IHRoaXMuX3NlcnZlckFjdGlvbnNJblByb2dyZXNzW2NvZGVdO1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVpbmdyZXNvIHNlcnZlciBlbiBhY2Npw7NuICR7Y29kZX0gY29uIGVqZWN1Y2nDs24gcHJldmlhICR7c2VudH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fc2VydmVyQWN0aW9uc0luUHJvZ3Jlc3NbY29kZV0gPSB7IHNlbnQ6IG5ldyBEYXRlKCkgfTtcbiAgICAgIC8vIFNlIGluaWNpYSBsYSBwYXJ0ZSBzZXJ2ZXIgZGUgbGEgYWNjacOzblxuICAgICAgYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0Rm9ybUFjdGlvbihhY3Rpb24uYWN0aW9uQ29kZSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZmluaXNoQWN0aW9uKGFjdGlvbiwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvcik7XG4gICAgc2VydmVyRXJyb3IgPSAhIXRoaXMuZXJyb3JPY2N1cmVkKCk7XG4gICAgaWYgKCFzZXJ2ZXJFcnJvcikge1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2FjdGlvblNlcnZlckVycm9yLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0aGlzLl9hY3Rpb25TZXJ2ZXJFcnJvcltpbmRleF07XG4gICAgICAgIGNhbGxiYWNrKGFjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3NlcnZlckFjdGlvbnNJblByb2dyZXNzW2NvZGVdID0gbnVsbDtcbiAgICBkZWxldGUgdGhpcy5fc2VydmVyQWN0aW9uc0luUHJvZ3Jlc3NbY29kZV07XG4gICAgYWN0aW9uLnN0b3AoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaEFjdGlvbihhY3Rpb246IGFueSwgYWN0aW9uUmVzdWx0OiBhbnksIHNlcnZlckVycm9yOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaW5pc2hBY3Rpb25NZXRob2RzID0gdGhpcy5fZm9ybUFjdGlvbnNGaW5pc2hbYWN0aW9uLmFjdGlvbkNvZGVdO1xuICAgIGlmIChmaW5pc2hBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY2xpZW50QWN0aW9uTWV0aG9kIG9mIGZpbmlzaEFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gY2xpZW50QWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmIChjYWxsYmFjayAmJiAoIXNlcnZlckVycm9yIHx8IGNvbnRpbnVlT25FcnJvcikpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKGFjdGlvbiwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgY29tcGxldGVHbG9iYWxBY3Rpb24oYWN0aW9uOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydFNlcnZlckFjdGlvbihhY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYWRvcmVzIGRlIGV2ZW50b3MgcGFyYSB2YWxpZGFjaW9uZXMgc29icmUgY2FtcG9zXG4gICAqL1xuXG4gIHJlbW92ZUZpZWxkVmFsaWRhdGlvbklucHV0KGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50SGFuZGxlcih0aGlzLl9maWVsZElucHV0VmFsaWRhdGlvbiwgY29kZXMpO1xuICB9XG5cbiAgb25GaWVsZElucHV0KGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50SGFuZGxlcih0aGlzLl9maWVsZElucHV0VmFsaWRhdGlvbiwgY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHJlbW92ZUZpZWxkQ3VzdG9tRXZlbnQoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRIYW5kbGVyKHRoaXMuX2ZpZWxkQ3VzdG9tRXZlbnQsIGNvZGVzKTtcbiAgfVxuXG4gIG9uRmllbGRDdXN0b21FdmVudChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXIodGhpcy5fZmllbGRDdXN0b21FdmVudCwgY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHJlbW92ZUZpZWxkVmFsaWRhdGlvblN0YXJ0KGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50SGFuZGxlcih0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnQsIGNvZGVzKTtcbiAgfVxuXG4gIG9uRmllbGRWYWxpZGF0aW9uU3RhcnQoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNTdGFydCwgY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHJlbW92ZUZpZWxkVmFsaWRhdGlvbkZpbmlzaChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVFdmVudEhhbmRsZXIodGhpcy5fZmllbGRWYWxpZGF0aW9uc0ZpbmlzaCwgY29kZXMpO1xuICB9XG5cbiAgb25GaWVsZFZhbGlkYXRpb25GaW5pc2goY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNGaW5pc2gsIGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICByZW1vdmVGaWVsZEFsbEV2ZW50Q2FsbGJhY2tzKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50SGFuZGxlcih0aGlzLl9maWVsZElucHV0VmFsaWRhdGlvbiwgY29kZXMpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRIYW5kbGVyKHRoaXMuX2ZpZWxkQ3VzdG9tRXZlbnQsIGNvZGVzKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50SGFuZGxlcih0aGlzLl9maWVsZFZhbGlkYXRpb25zU3RhcnQsIGNvZGVzKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50SGFuZGxlcih0aGlzLl9maWVsZFZhbGlkYXRpb25zRmluaXNoLCBjb2Rlcyk7XG4gIH1cblxuICBhc3luYyBzdGFydEZpZWxkSW5wdXRWYWxpZGF0aW9uKGNvZGU6IHN0cmluZywgaW50cmluc2ljVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLm5vdGlmeUZvcm1BY3Rpdml0eSgpO1xuICAgIGNvbnN0IGZpZWxkVG9WYWxpZGF0ZSA9IHRoaXMuZ2V0RmllbGQoY29kZSk7XG4gICAgaWYgKCFmaWVsZFRvVmFsaWRhdGUpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY29uc3QgdmFsaWRhdGlvbkNhbGxiYWNrcyA9IHRoaXMuX2ZpZWxkSW5wdXRWYWxpZGF0aW9uW2NvZGVdO1xuICAgIGlmICh2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICBjb25zdCBjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb25NZXRob2Qgb2YgdmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB2YWxpZGF0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZVZhbGlkYXRpb25Qcm9taXNlID0gY2FsbGJhY2soZmllbGRUb1ZhbGlkYXRlKTtcbiAgICAgICAgY2xpZW50VmFsaWRhdGlvblByb21pc2VzLnB1c2goY29udGludWVWYWxpZGF0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2xpZW50VmFsaWRhdGlvblByb21pc2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBzdGFydEZpZWxkQ3VzdG9tRXZlbnQoY29kZTogc3RyaW5nLCBldmVudE5hbWU6IHN0cmluZywgZXZlbnREYXRhOiBhbnkpIHtcbiAgICB0aGlzLm5vdGlmeUZvcm1BY3Rpdml0eSgpO1xuICAgIGNvbnN0IGZpZWxkVG9UcmlnZ2VyID0gdGhpcy5nZXRGaWVsZChjb2RlKTtcbiAgICBpZiAoIWZpZWxkVG9UcmlnZ2VyKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IGV2ZW50SGFuZGxlckNhbGxiYWNrcyA9IHRoaXMuX2ZpZWxkQ3VzdG9tRXZlbnRbY29kZV07XG4gICAgaWYgKGV2ZW50SGFuZGxlckNhbGxiYWNrcykge1xuICAgICAgY29uc3QgY2xpZW50RXZlbnRQcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZXZlbnRIYW5kbGVyTWV0aG9kIG9mIGV2ZW50SGFuZGxlckNhbGxiYWNrcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSBldmVudEhhbmRsZXJNZXRob2Q7XG4gICAgICAgIGNvbnN0IGNsaWVudEV2ZW50UHJvbWlzZSA9IGNhbGxiYWNrKGV2ZW50TmFtZSwgZXZlbnREYXRhLCBmaWVsZFRvVHJpZ2dlcik7XG4gICAgICAgIGNsaWVudEV2ZW50UHJvbWlzZXMucHVzaChjbGllbnRFdmVudFByb21pc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0RmllbGRWYWxpZGF0aW9uKGNvZGU6IHN0cmluZywgaW50cmluc2ljVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLm5vdGlmeUZvcm1BY3Rpdml0eSgpO1xuICAgIGNvbnN0IGZpZWxkVG9WYWxpZGF0ZSA9IHRoaXMuZ2V0RmllbGQoY29kZSk7XG4gICAgaWYgKCFmaWVsZFRvVmFsaWRhdGUpIHsgcmV0dXJuOyB9XG4gICAgY29uc3QgdmFsaWRhdGlvbkNhbGxiYWNrcyA9IHRoaXMuX2ZpZWxkVmFsaWRhdGlvbnNTdGFydFtjb2RlXTtcbiAgICBpZiAodmFsaWRhdGlvbkNhbGxiYWNrcykge1xuICAgICAgY29uc3QgY2xpZW50VmFsaWRhdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uTWV0aG9kIG9mIHZhbGlkYXRpb25DYWxsYmFja3MpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdmFsaWRhdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY2xpZW50VmFsaWRhdGlvblByb21pc2UgPSBjYWxsYmFjayhmaWVsZFRvVmFsaWRhdGUpO1xuICAgICAgICBjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXMucHVzaChjbGllbnRWYWxpZGF0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRWYWxpZGF0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRWYWxpZGF0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVWYWxpZGF0aW9uID0gY2xpZW50VmFsaWRhdGlvblJlc3VsdHMuZXZlcnkociA9PiByLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgci52YWx1ZSAhPT0gZmFsc2UpO1xuICAgICAgaWYgKCFjb250aW51ZVZhbGlkYXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW50cmluc2ljVmFsaWRhdGlvbikge1xuICAgICAgdGhpcy5zdGFydFNlcnZlckZpZWxkVmFsaWRhdGlvbihmaWVsZFRvVmFsaWRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2VydmVyRmllbGRWYWxpZGF0aW9uKGlucHV0RmllbGQ6IHN0cmluZyB8IEZpZWxkRGVzY3JpcHRvcikge1xuICAgIGNvbnN0IGZpZWxkT2JqOiBGaWVsZERlc2NyaXB0b3IgfCBudWxsID0gKHR5cGVvZiBpbnB1dEZpZWxkID09PSAnc3RyaW5nJylcbiAgICAgID8gdGhpcy5nZXRGaWVsZChpbnB1dEZpZWxkKSA6IGlucHV0RmllbGQ7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IHZhbGlkYXRpb25SZXN1bHQ6IGJvb2xlYW4gPSB0cnVlO1xuICAgIGlmICghZmllbGRPYmopIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGZpZWxkT2JqLmJhY2tlbmQpIHtcbiAgICAgIGZpZWxkT2JqLnZhbGlkYXRpbmcgPSB0cnVlO1xuICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKEZvcm1BY3Rpb25UeXBlLlZhbGlkYXRlLCBmaWVsZE9iai5jb2RlKTtcbiAgICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBpZiAoc2VydmVyRXJyb3IpIHtcbiAgICAgIGZpZWxkT2JqPy5zZXRFcnJvckNvZGUodGhpcy5lcnJvckNvZGUpO1xuICAgICAgZmllbGRPYmo/LnNldEVycm9yTWVzc2FnZSh0aGlzLmVycm9yTWVzc2FnZSk7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZmllbGRTZXJ2ZXJFcnJvci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGhpcy5fZmllbGRTZXJ2ZXJFcnJvcltpbmRleF07XG4gICAgICAgIGNhbGxiYWNrKGZpZWxkT2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgdGhpcy5maW5pc2hGaWVsZFZhbGlkYXRpb24oZmllbGRPYmosIHZhbGlkYXRpb25SZXN1bHQsIHNlcnZlckVycm9yKTtcbiAgICBmaWVsZE9iai52YWxpZGF0aW5nID0gZmFsc2U7XG4gIH1cblxuICBhc3luYyBmaW5pc2hGaWVsZFZhbGlkYXRpb24oZmllbGRPYmplY3Q6IGFueSwgdmFsaWRhdGlvblJlc3VsdDogYm9vbGVhbiwgc2VydmVyRXJyb3IgPSBmYWxzZSkge1xuICAgIGNvbnN0IHZhbGlkYXRpb25DYWxsYmFja3MgPSB0aGlzLl9maWVsZFZhbGlkYXRpb25zRmluaXNoW2ZpZWxkT2JqZWN0LmNvZGVdO1xuICAgIGlmICh2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbk1ldGhvZCBvZiB2YWxpZGF0aW9uQ2FsbGJhY2tzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHZhbGlkYXRpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlT25FcnJvciA9IHByb3BlcnRpZXM/LmNvbnRpbnVlT25FcnJvciA/PyBmYWxzZTtcbiAgICAgICAgaWYgKCFzZXJ2ZXJFcnJvciB8fCBjb250aW51ZU9uRXJyb3IpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKGZpZWxkT2JqZWN0LCB2YWxpZGF0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY29udGludWVGaWVsZFZhbGlkYXRpb24oY29kZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRTZXJ2ZXJGaWVsZFZhbGlkYXRpb24oY29kZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphZG9yZXMgZGUgZXZlbnRvcyBwYXJhIGFjY2lvbmVzIHNvYnJlIFRhYmxhc1xuICAgKi9cblxuICBvblRhYmxlQWN0aW9uU3RhcnQoY29kZTogc3RyaW5nLCBhY3Rpb25Db2RlOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKGNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5saW5lQWN0aW9uT2JqZWN0ID0gdGFibGVPYmplY3QuZ2V0QWN0aW9uKGFjdGlvbkNvZGUpO1xuICAgIGlmICghaW5saW5lQWN0aW9uT2JqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB0YWJsZUV2ZW50SGFuZGxlcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50Q2FsbGJhY2tbXT47XG4gICAgaWYgKHRoaXMuX3RhYmxlQWN0aW9uc1N0YXJ0W2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0ge307XG4gICAgICB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFtjb2RlXSA9IHRhYmxlRXZlbnRIYW5kbGVycztcbiAgICB9XG4gICAgaWYgKCF0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA9IFtdO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0ucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgb25UYWJsZUFjdGlvbkZpbmlzaChjb2RlOiBzdHJpbmcsIGFjdGlvbkNvZGU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmxpbmVBY3Rpb25PYmplY3QgPSB0YWJsZU9iamVjdC5nZXRBY3Rpb24oYWN0aW9uQ29kZSk7XG4gICAgaWYgKCFpbmxpbmVBY3Rpb25PYmplY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVyczogUmVjb3JkPHN0cmluZywgRXZlbnRDYWxsYmFja1tdPjtcbiAgICBpZiAodGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbY29kZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy5fdGFibGVBY3Rpb25zRmluaXNoW2NvZGVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICBpZiAoIXRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSkge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdID0gW107XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXS5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBvblRhYmxlU2VsZWN0aW9uU3RhcnQoY29kZTogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkge1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZShjb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0KSB7IHJldHVybjsgfVxuICAgIGxldCB0YWJsZUV2ZW50SGFuZGxlcnM6IEV2ZW50Q2FsbGJhY2tbXTtcbiAgICBpZiAodGhpcy5fdGFibGVTZWxlY3Rpb25zU3RhcnRbY29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0W2NvZGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSBbXTtcbiAgICAgIHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0W2NvZGVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnMucHVzaCh7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgb25UYWJsZVNlbGVjdGlvbkZpbmlzaChjb2RlOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKGNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgbGV0IHRhYmxlRXZlbnRIYW5kbGVyczogRXZlbnRDYWxsYmFja1tdO1xuICAgIGlmICh0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2hbY29kZV0pIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc0ZpbmlzaFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gW107XG4gICAgICB0aGlzLl90YWJsZVNlbGVjdGlvbnNGaW5pc2hbY29kZV0gPSB0YWJsZUV2ZW50SGFuZGxlcnM7XG4gICAgfVxuICAgIHRhYmxlRXZlbnRIYW5kbGVycy5wdXNoKHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBvblRhYmxlR2V0RGF0YVN0YXJ0KGNvZGU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzOiBFdmVudENhbGxiYWNrW107XG4gICAgaWYgKHRoaXMuX3RhYmxlR2V0RGF0YVN0YXJ0W2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUdldERhdGFTdGFydFtjb2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFibGVFdmVudEhhbmRsZXJzID0gW107XG4gICAgICB0aGlzLl90YWJsZUdldERhdGFTdGFydFtjb2RlXSA9IHRhYmxlRXZlbnRIYW5kbGVycztcbiAgICB9XG4gICAgdGFibGVFdmVudEhhbmRsZXJzLnB1c2goeyBjYWxsYmFjaywgcHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIG9uVGFibGVHZXREYXRhRmluaXNoKGNvZGU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUoY29kZSk7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGFibGVFdmVudEhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudENhbGxiYWNrPjtcbiAgICBpZiAodGhpcy5fdGFibGVHZXREYXRhRmluaXNoW2NvZGVdKSB7XG4gICAgICB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUdldERhdGFGaW5pc2hbY29kZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlRXZlbnRIYW5kbGVycyA9IHt9O1xuICAgICAgdGhpcy5fdGFibGVHZXREYXRhRmluaXNoW2NvZGVdID0gdGFibGVFdmVudEhhbmRsZXJzO1xuICAgIH1cbiAgICB0YWJsZUV2ZW50SGFuZGxlcnNbR0VUX0RBVEFfQUNUSU9OXSA9IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVHbG9iYWxBY3Rpb24odGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgdGhpcy5ub3RpZnlGb3JtQWN0aXZpdHkoKTtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb25Db2RlKSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRhYmxlT2JqZWN0LmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICBpZiAoIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgYWN0aW9uLFxuICAgICAgdGFibGVDb2RlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICB9O1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc1N0YXJ0W3RhYmxlQ29kZV07XG4gICAgY29uc3QgdGFibGVBY3Rpb25NZXRob2RzID0gKHRhYmxlRXZlbnRIYW5kbGVycykgPyB0YWJsZUV2ZW50SGFuZGxlcnNbYWN0aW9uQ29kZV0gOiBudWxsO1xuICAgIGlmICh0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUFjdGlvbk1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSBjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uID0gY2xpZW50QWN0aW9uUmVzdWx0cy5ldmVyeShyID0+IHIuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByLnZhbHVlICE9PSBmYWxzZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyR2xvYmFsQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVTZXJ2ZXJHbG9iYWxBY3Rpb24odGFibGVBY3Rpb25EZXRhaWw6IGFueSkge1xuICAgIGNvbnN0IHsgdGFibGVPYmplY3QsIGFjdGlvbiwgdGFibGVDb2RlLCBhY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGFjdGlvbi5iYWNrZW5kKSB7XG4gICAgICBjb25zdCBhY3Rpb25TdWJqZWN0ID0ge1xuICAgICAgICB0YWJsZUNvZGUsXG4gICAgICAgIGFjdGlvblR5cGU6IEdMT0JBTF9BQ1RJT04sXG4gICAgICAgIGFjdGlvbkNvZGVcbiAgICAgIH07XG4gICAgICBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzXG4gICAgICAgIC5yZXF1ZXN0Rm9ybUFjdGlvbihGb3JtQWN0aW9uVHlwZS5UYWJsZUFjdGlvbiwgYWN0aW9uU3ViamVjdCk7XG4gICAgICBzZXJ2ZXJFcnJvciA9ICEhdGhpcy5lcnJvck9jY3VyZWQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5maW5pc2hUYWJsZUdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvcik7XG4gICAgaWYgKCFzZXJ2ZXJFcnJvcikge1xuICAgICAgYWN0aW9uLm5ld1N0YXRlICYmIHRoaXMuY2hhbmdlU3RhdGUoYWN0aW9uLm5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX3RhYmxlU2VydmVyRXJyb3IubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRoaXMuX3RhYmxlU2VydmVyRXJyb3JbaW5kZXhdO1xuICAgICAgICBjYWxsYmFjayh0YWJsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZUdsb2JhbEFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55LCBhY3Rpb25SZXN1bHQ6IGFueSwgc2VydmVyRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCBhY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA6IG51bGw7XG4gICAgaWYgKHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZUFjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY29udGludWVPbkVycm9yID0gcHJvcGVydGllcz8uY29udGludWVPbkVycm9yID8/IGZhbHNlO1xuICAgICAgICBpZiAoIXNlcnZlckVycm9yIHx8IGNvbnRpbnVlT25FcnJvcikge1xuICAgICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2FsbGJhY2sodGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVBY3Rpb24odGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgdGhpcy5ub3RpZnlGb3JtQWN0aXZpdHkoKTtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uQ29kZSwgYWN0aW9uRGV0YWlsIH0gPSB0YWJsZUFjdGlvbkV2ZW50O1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZUNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QgfHwgIWFjdGlvbkNvZGUpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgeyByZWNvcmRJZCwgcmVjb3JkRGF0YSB9ID0gYWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IGFjdGlvbiA9IHRhYmxlT2JqZWN0LmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICBpZiAoIWFjdGlvbikgeyByZXR1cm47IH1cbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgYWN0aW9uLFxuICAgICAgdGFibGVDb2RlLFxuICAgICAgYWN0aW9uQ29kZSxcbiAgICAgIHJlY29yZElkLFxuICAgICAgcmVjb3JkRGF0YVxuICAgIH07XG4gICAgY29uc3QgdGFibGVFdmVudEhhbmRsZXJzID0gdGhpcy5fdGFibGVBY3Rpb25zU3RhcnRbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA6IG51bGw7XG4gICAgaWYgKHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZUFjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZSA9IGNhbGxiYWNrKHRhYmxlQWN0aW9uRGV0YWlsKTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLmV2ZXJ5KHIgPT4gci5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHIudmFsdWUgIT09IGZhbHNlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJBY3Rpb24odGFibGVBY3Rpb25EZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlcnZlckFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZU9iamVjdCwgYWN0aW9uLCB0YWJsZUNvZGUsIGFjdGlvbkNvZGUsIHJlY29yZElkLCByZWNvcmREYXRhIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGFjdGlvbi5iYWNrZW5kKSB7XG4gICAgICBjb25zdCBhY3Rpb25TdWJqZWN0ID0ge1xuICAgICAgICB0YWJsZUNvZGUsXG4gICAgICAgIGFjdGlvblR5cGU6IHRoaXMuZm9ybUNvbmZpZz8udGFibGVBY3Rpb25zLmlubGluZSxcbiAgICAgICAgYWN0aW9uQ29kZSxcbiAgICAgICAgdGFibGVSZWNvcmRJZDogcmVjb3JkSWQsXG4gICAgICAgIHRhYmxlUmVjb3JkRGF0YTogcmVjb3JkRGF0YVxuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKEZvcm1BY3Rpb25UeXBlLlRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZpbmlzaFRhYmxlQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yKTtcbiAgICBpZiAoIXNlcnZlckVycm9yKSB7XG4gICAgICBhY3Rpb24ubmV3U3RhdGUgJiYgdGhpcy5jaGFuZ2VTdGF0ZShhY3Rpb24ubmV3U3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCk7XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBjb21wbGV0ZUlubGluZUFjdGlvbih0YWJsZUFjdGlvbjogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRUYWJsZVNlcnZlckFjdGlvbih0YWJsZUFjdGlvbik7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZUFjdGlvbih0YWJsZUFjdGlvbkRldGFpbDogYW55LCBhY3Rpb25SZXN1bHQ6IGFueSwgc2VydmVyRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgdGFibGVDb2RlLCBhY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1thY3Rpb25Db2RlXSA6IG51bGw7XG4gICAgaWYgKHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kIG9mIHRhYmxlQWN0aW9uTWV0aG9kcykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZUFjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY29udGludWVPbkVycm9yID0gcHJvcGVydGllcz8uY29udGludWVPbkVycm9yID8/IGZhbHNlO1xuICAgICAgICBpZiAoIXNlcnZlckVycm9yIHx8IGNvbnRpbnVlT25FcnJvcikge1xuICAgICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2FsbGJhY2sodGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0VGFibGVSZWNvcmRTZWxlY3Rpb24odGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgdGhpcy5ub3RpZnlGb3JtQWN0aXZpdHkoKTtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgYWN0aW9uRGV0YWlsIH0gPSB0YWJsZUFjdGlvbkV2ZW50O1xuICAgIGNvbnN0IHRhYmxlT2JqZWN0ID0gdGhpcy5nZXRUYWJsZSh0YWJsZUNvZGUpO1xuICAgIGlmICghdGFibGVPYmplY3QpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5yZXNldEVycm9yKCk7XG4gICAgY29uc3QgeyByZWNvcmRJZCwgcmVjb3JkRGF0YSB9ID0gYWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlU2VsZWN0aW9uRGV0YWlsID0ge1xuICAgICAgdGFibGVPYmplY3QsXG4gICAgICB0YWJsZUNvZGUsXG4gICAgICByZWNvcmRJZCxcbiAgICAgIHJlY29yZERhdGFcbiAgICB9O1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc1N0YXJ0W3RhYmxlQ29kZV07XG4gICAgaWYgKHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRhYmxlU2VsZWN0aW9uTWV0aG9kIG9mIHRhYmxlRXZlbnRIYW5kbGVycykge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrLCBwcm9wZXJ0aWVzIH0gPSB0YWJsZVNlbGVjdGlvbk1ldGhvZDtcbiAgICAgICAgY29uc3QgY2xpZW50QWN0aW9uUHJvbWlzZSA9IGNhbGxiYWNrKHRhYmxlU2VsZWN0aW9uRGV0YWlsKTtcbiAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjbGllbnRBY3Rpb25Qcm9taXNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2xpZW50QWN0aW9uUHJvbWlzZXMpO1xuICAgICAgY29uc3QgY29udGludWVBY3Rpb24gPSBjbGllbnRBY3Rpb25SZXN1bHRzLmV2ZXJ5KHIgPT4gci5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHIudmFsdWUgIT09IGZhbHNlKTtcbiAgICAgIGlmICghY29udGludWVBY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGFibGVTZXJ2ZXJSZWNvcmRTZWxlY3Rpb24odGFibGVTZWxlY3Rpb25EZXRhaWwpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZVNlcnZlclJlY29yZFNlbGVjdGlvbih0YWJsZVNlbGVjdGlvbkRldGFpbDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZU9iamVjdCwgdGFibGVDb2RlLCByZWNvcmRJZCwgcmVjb3JkRGF0YSB9ID0gdGFibGVTZWxlY3Rpb25EZXRhaWw7XG4gICAgaWYgKCF0YWJsZU9iamVjdCkgeyByZXR1cm47IH1cbiAgICB0YWJsZU9iamVjdC5wdXRPbldhaXQoKTtcbiAgICBsZXQgc2VydmVyRXJyb3IgPSBmYWxzZTtcbiAgICBsZXQgYWN0aW9uUmVzdWx0ID0gbnVsbDtcbiAgICBpZiAodGFibGVPYmplY3Quc2VsZWN0aW9uQmFja2VuZCkge1xuICAgICAgY29uc3QgYWN0aW9uU3ViamVjdDogYW55ID0ge1xuICAgICAgICB0YWJsZUNvZGUsXG4gICAgICAgIGFjdGlvblR5cGU6IHRoaXMuZm9ybUNvbmZpZz8udGFibGVBY3Rpb25zLnJvd1NlbGVjdGlvbixcbiAgICAgICAgYWN0aW9uQ29kZTogbnVsbCxcbiAgICAgICAgdGFibGVSZWNvcmRJZDogcmVjb3JkSWQsXG4gICAgICAgIHRhYmxlUmVjb3JkRGF0YTogcmVjb3JkRGF0YVxuICAgICAgfTtcbiAgICAgIGFjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXNcbiAgICAgICAgLnJlcXVlc3RGb3JtQWN0aW9uKEZvcm1BY3Rpb25UeXBlLlRhYmxlQWN0aW9uLCBhY3Rpb25TdWJqZWN0KTtcbiAgICAgIHNlcnZlckVycm9yID0gISF0aGlzLmVycm9yT2NjdXJlZCgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZpbmlzaFRhYmxlUmVjb3JkU2VsZWN0aW9uKHRhYmxlU2VsZWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQsIHNlcnZlckVycm9yKTtcbiAgICBpZiAoc2VydmVyRXJyb3IpIHtcbiAgICAgIHRoaXMuZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKTtcbiAgICB9XG4gICAgdGFibGVPYmplY3QuZnJlZVdhaXRpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFRhYmxlUmVjb3JkU2VsZWN0aW9uKHRhYmxlU2VsZWN0aW9uRGV0YWlsOiBhbnksIGFjdGlvblJlc3VsdDogYW55LCBzZXJ2ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUgfSA9IHRhYmxlU2VsZWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlU2VsZWN0aW9uc0ZpbmlzaFt0YWJsZUNvZGVdO1xuICAgIGlmICh0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZVNlbGVjdGlvbk1ldGhvZCBvZiB0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVTZWxlY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNvbnRpbnVlT25FcnJvciA9IHByb3BlcnRpZXM/LmNvbnRpbnVlT25FcnJvciA/PyBmYWxzZTtcbiAgICAgICAgaWYgKCFzZXJ2ZXJFcnJvciB8fCBjb250aW51ZU9uRXJyb3IpIHtcbiAgICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNhbGxiYWNrKHRhYmxlU2VsZWN0aW9uRGV0YWlsLCBhY3Rpb25SZXN1bHQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlU2VsZWN0aW9uQWN0aW9uKHRhYmxlQWN0aW9uRXZlbnQ6IGFueSkge1xuICAgIHRoaXMubm90aWZ5Rm9ybUFjdGl2aXR5KCk7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUsIGFjdGlvbkRldGFpbCB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb25Db2RlKSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IHsgc2VsZWN0ZWRSZWNvcmRzIH0gPSBhY3Rpb25EZXRhaWw7XG4gICAgY29uc3QgYWN0aW9uID0gdGFibGVPYmplY3QuZ2V0QWN0aW9uKGFjdGlvbkNvZGUpO1xuICAgIGlmICghYWN0aW9uKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IHRhYmxlQWN0aW9uRGV0YWlsID0ge1xuICAgICAgdGFibGVPYmplY3QsXG4gICAgICBhY3Rpb24sXG4gICAgICB0YWJsZUNvZGUsXG4gICAgICBhY3Rpb25Db2RlLFxuICAgICAgc2VsZWN0ZWRSZWNvcmRzXG4gICAgfTtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNTdGFydFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlQWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlID0gY2FsbGJhY2sodGFibGVBY3Rpb25EZXRhaWwpO1xuICAgICAgICBjbGllbnRBY3Rpb25Qcm9taXNlcy5wdXNoKGNsaWVudEFjdGlvblByb21pc2UpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50QWN0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgICBjb25zdCBjb250aW51ZUFjdGlvbiA9IGNsaWVudEFjdGlvblJlc3VsdHMuZXZlcnkociA9PiByLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgci52YWx1ZSAhPT0gZmFsc2UpO1xuICAgICAgaWYgKCFjb250aW51ZUFjdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RhcnRUYWJsZVNlcnZlclNlbGVjdGlvbkFjdGlvbih0YWJsZUFjdGlvbkRldGFpbCk7XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlU2VydmVyU2VsZWN0aW9uQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsOiBhbnkpIHtcbiAgICBjb25zdCB7IHRhYmxlT2JqZWN0LCBhY3Rpb24sIHRhYmxlQ29kZSwgYWN0aW9uQ29kZSwgc2VsZWN0ZWRSZWNvcmRzIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBpZiAoIXRhYmxlT2JqZWN0IHx8ICFhY3Rpb24pIHsgcmV0dXJuOyB9XG4gICAgdGFibGVPYmplY3QucHV0T25XYWl0KCk7XG4gICAgbGV0IHNlcnZlckVycm9yID0gZmFsc2U7XG4gICAgbGV0IGFjdGlvblJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGFjdGlvbi5iYWNrZW5kKSB7XG4gICAgICBjb25zdCBhY3Rpb25TdWJqZWN0ID0ge1xuICAgICAgICB0YWJsZUNvZGUsXG4gICAgICAgIGFjdGlvblR5cGU6IHRoaXMuZm9ybUNvbmZpZz8udGFibGVBY3Rpb25zLnNlbGVjdGlvbixcbiAgICAgICAgYWN0aW9uQ29kZSxcbiAgICAgICAgc2VsZWN0ZWRSZWNvcmRzXG4gICAgICB9O1xuICAgICAgYWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpc1xuICAgICAgICAucmVxdWVzdEZvcm1BY3Rpb24oRm9ybUFjdGlvblR5cGUuVGFibGVBY3Rpb24sIGFjdGlvblN1YmplY3QpO1xuICAgICAgc2VydmVyRXJyb3IgPSAhIXRoaXMuZXJyb3JPY2N1cmVkKCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZmluaXNoVGFibGVTZWxlY3Rpb25BY3Rpb24odGFibGVBY3Rpb25EZXRhaWwsIGFjdGlvblJlc3VsdCwgc2VydmVyRXJyb3IpO1xuICAgIGlmICghc2VydmVyRXJyb3IpIHtcbiAgICAgIGFjdGlvbi5uZXdTdGF0ZSAmJiB0aGlzLmNoYW5nZVN0YXRlKGFjdGlvbi5uZXdTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGxheVRhYmxlU2VydmVyRXJyb3IoKTtcbiAgICB9XG4gICAgdGFibGVPYmplY3QuZnJlZVdhaXRpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFRhYmxlU2VsZWN0aW9uQWN0aW9uKHRhYmxlQWN0aW9uRGV0YWlsOiBhbnksIGFjdGlvblJlc3VsdDogYW55LCBzZXJ2ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyB0YWJsZUNvZGUsIGFjdGlvbkNvZGUgfSA9IHRhYmxlQWN0aW9uRGV0YWlsO1xuICAgIGNvbnN0IHRhYmxlRXZlbnRIYW5kbGVycyA9IHRoaXMuX3RhYmxlQWN0aW9uc0ZpbmlzaFt0YWJsZUNvZGVdO1xuICAgIGNvbnN0IHRhYmxlQWN0aW9uTWV0aG9kcyA9ICh0YWJsZUV2ZW50SGFuZGxlcnMpID8gdGFibGVFdmVudEhhbmRsZXJzW2FjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlQWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmICghc2VydmVyRXJyb3IgfHwgY29udGludWVPbkVycm9yKSB7XG4gICAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRUYWJsZUdldERhdGEodGFibGVBY3Rpb25FdmVudDogYW55KSB7XG4gICAgdGhpcy5ub3RpZnlGb3JtQWN0aXZpdHkoKTtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSB9ID0gdGFibGVBY3Rpb25FdmVudDtcbiAgICBjb25zdCB0YWJsZU9iamVjdCA9IHRoaXMuZ2V0VGFibGUodGFibGVDb2RlKTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbkRldGFpbCA9IHtcbiAgICAgIHRhYmxlT2JqZWN0LFxuICAgICAgdGFibGVDb2RlXG4gICAgfTtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUdldERhdGFTdGFydFt0YWJsZUNvZGVdO1xuICAgIGlmICh0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2VzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0YWJsZUFjdGlvbk1ldGhvZCBvZiB0YWJsZUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFjaywgcHJvcGVydGllcyB9ID0gdGFibGVBY3Rpb25NZXRob2Q7XG4gICAgICAgIGNvbnN0IGNsaWVudEFjdGlvblByb21pc2UgPSBjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCk7XG4gICAgICAgIGNsaWVudEFjdGlvblByb21pc2VzLnB1c2goY2xpZW50QWN0aW9uUHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNsaWVudEFjdGlvblByb21pc2VzKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQWN0aW9uID0gY2xpZW50QWN0aW9uUmVzdWx0cy5ldmVyeShyID0+IHIuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByLnZhbHVlICE9PSBmYWxzZSk7XG4gICAgICBpZiAoIWNvbnRpbnVlQWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdGFydFRhYmxlU2VydmVyR2V0RGF0YSh0YWJsZUFjdGlvbkRldGFpbCk7XG4gIH1cblxuICBhc3luYyBzdGFydFRhYmxlU2VydmVyR2V0RGF0YSh0YWJsZUFjdGlvbkRldGFpbDogYW55KSB7XG4gICAgY29uc3QgeyB0YWJsZU9iamVjdCwgdGFibGVDb2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICB0YWJsZU9iamVjdC5wdXRPbldhaXQoKTtcbiAgICBsZXQgc2VydmVyRXJyb3IgPSBmYWxzZTtcbiAgICBjb25zdCBhY3Rpb25TdWJqZWN0ID0geyB0YWJsZUNvZGUgfTtcbiAgICBjb25zdCBhY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzXG4gICAgICAucmVxdWVzdEZvcm1BY3Rpb24oRm9ybUFjdGlvblR5cGUuR2V0VGFibGVEYXRhLCBhY3Rpb25TdWJqZWN0KTtcbiAgICBzZXJ2ZXJFcnJvciA9ICEhdGhpcy5lcnJvck9jY3VyZWQoKTtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaFRhYmxlR2V0RGF0YSh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0LCBzZXJ2ZXJFcnJvcik7XG4gICAgaWYgKHNlcnZlckVycm9yKSB7XG4gICAgICB0aGlzLmRpc3BsYXlUYWJsZVNlcnZlckVycm9yKCk7XG4gICAgfVxuICAgIHRhYmxlT2JqZWN0LmZyZWVXYWl0aW5nKCk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hUYWJsZUdldERhdGEodGFibGVBY3Rpb25EZXRhaWw6IGFueSwgYWN0aW9uUmVzdWx0OiBhbnksIHNlcnZlckVycm9yOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHRhYmxlQ29kZSwgdGFibGVBY3Rpb25Db2RlIH0gPSB0YWJsZUFjdGlvbkRldGFpbDtcbiAgICBjb25zdCB0YWJsZUV2ZW50SGFuZGxlcnMgPSB0aGlzLl90YWJsZUFjdGlvbnNGaW5pc2hbdGFibGVDb2RlXTtcbiAgICBjb25zdCB0YWJsZUFjdGlvbk1ldGhvZHMgPSAodGFibGVFdmVudEhhbmRsZXJzKSA/IHRhYmxlRXZlbnRIYW5kbGVyc1t0YWJsZUFjdGlvbkNvZGVdIDogbnVsbDtcbiAgICBpZiAodGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICBjb25zdCBjbGllbnRBY3Rpb25Qcm9taXNlczogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdGFibGVBY3Rpb25NZXRob2Qgb2YgdGFibGVBY3Rpb25NZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHByb3BlcnRpZXMgfSA9IHRhYmxlQWN0aW9uTWV0aG9kO1xuICAgICAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSBwcm9wZXJ0aWVzPy5jb250aW51ZU9uRXJyb3IgPz8gZmFsc2U7XG4gICAgICAgIGlmICghc2VydmVyRXJyb3IgfHwgY29udGludWVPbkVycm9yKSB7XG4gICAgICAgICAgY2xpZW50QWN0aW9uUHJvbWlzZXMucHVzaChjYWxsYmFjayh0YWJsZUFjdGlvbkRldGFpbCwgYWN0aW9uUmVzdWx0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjbGllbnRBY3Rpb25Qcm9taXNlcyk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tTZWN0aW9uUmVxdWlyZWRGaWVsZHMoc2VjdGlvbkNvZGU6IHN0cmluZywgcmVxRmllbGRNZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jbGVhbkVycm9yRmllbGRzKG51bGwsIHNlY3Rpb25Db2RlKTtcbiAgICBjb25zdCByZXF1aXJlZEZpZWxkTWVzc2FnZSA9IHJlcUZpZWxkTWVzc2FnZSA/PyB0aGlzLmZvcm1Db25maWc/LmZvcm1TdGFuZGFyZEVycm9ycy5yZXF1aXJlZEZpZWxkXG4gICAgY29uc3QgbnVtRXJyb3JzID0gdGhpcy50YWdGaWVsZHNXaXRoRXJyb3IocmVxdWlyZWRGaWVsZE1lc3NhZ2UsIHRoaXMuZ2V0UmVxdWlyZWRFbXB0eUZpZWxkcyhudWxsLCBzZWN0aW9uQ29kZSkpO1xuICAgIHJldHVybiAobnVtRXJyb3JzID09PSAwKTtcbiAgfVxuXG4gIHZhbGlkYXRlU2VjdGlvbkNvbnNpc3RlbmN5KHNlY3Rpb25Db2RlOiBzdHJpbmcsIHJlcUZpZWxkTWVzc2FnZT86IHN0cmluZykge1xuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgIGNvbnN0IGNvbXBsZXRlRmllbGRzID0gdGhpcy5jaGVja1NlY3Rpb25SZXF1aXJlZEZpZWxkcyhzZWN0aW9uQ29kZSwgcmVxRmllbGRNZXNzYWdlKTtcbiAgICBpZiAoIWNvbXBsZXRlRmllbGRzKSB7XG4gICAgICB0aGlzLnNldEVycm9yKHRoaXMuZm9ybUNvbmZpZz8uZm9ybVN0YW5kYXJkRXJyb3JzLnR5cGVXYXJuaW5nLFxuICAgICAgICB0aGlzLmZvcm1Db25maWc/LmZvcm1TdGFuZGFyZEVycm9ycy52YWxpZGF0aW9uVGl0bGUsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZz8uZm9ybVN0YW5kYXJkRXJyb3JzLnJlcXVpcmVkRmllbGRzKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHZhbGlkYXRpb25FcnJvciA9IGZhbHNlO1xuICAgIGNvbnN0IHJlcXVpcmVkRW1wdHlGaWVsZHM6IGFueVtdID0gdGhpcy5nZXRSZXF1aXJlZEVtcHR5RmllbGRzKG51bGwsIHNlY3Rpb25Db2RlKSA/PyBbXTtcbiAgICBpZiAocmVxdWlyZWRFbXB0eUZpZWxkcz8ubGVuZ3RoID4gMCkge1xuICAgICAgdmFsaWRhdGlvbkVycm9yID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0RXJyb3IodGhpcy5mb3JtQ29uZmlnPy5mb3JtU3RhbmRhcmRFcnJvcnMudHlwZVdhcm5pbmcsXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZz8uZm9ybVN0YW5kYXJkRXJyb3JzLnZhbGlkYXRpb25UaXRsZSxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnPy5mb3JtU3RhbmRhcmRFcnJvcnMucmVxdWlyZWRGaWVsZHMpO1xuICAgICAgdGhpcy50YWdGaWVsZHNXaXRoRXJyb3IodGhpcy5mb3JtQ29uZmlnPy5mb3JtU3RhbmRhcmRFcnJvcnMucmVxdWlyZWRGaWVsZCwgcmVxdWlyZWRFbXB0eUZpZWxkcyk7XG4gICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgcmVxdWlyZWRFbXB0eUZpZWxkcykge1xuICAgICAgICBjb25zdCByZXF1aXJlZEVtcHR5RmllbGQgPSB0aGlzLmdldEZpZWxkKGNvZGUpO1xuICAgICAgICByZXF1aXJlZEVtcHR5RmllbGQ/LmZvY3VzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB2YWxpZGF0aW9uSXNzdWVGaWVsZHM6IGFueVtdID0gdGhpcy5nZXRGaWVsZHNXaXRoVmFsaWRhdGlvbklzc3VlcyhudWxsLFxuICAgICAgc2VjdGlvbkNvZGUpID8/IFtdO1xuICAgIGlmICghdmFsaWRhdGlvbkVycm9yICYmIHZhbGlkYXRpb25Jc3N1ZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YWxpZGF0aW9uRXJyb3IgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRFcnJvcih0aGlzLmZvcm1Db25maWc/LmZvcm1TdGFuZGFyZEVycm9ycy50eXBlV2FybmluZyxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnPy5mb3JtU3RhbmRhcmRFcnJvcnMudmFsaWRhdGlvblRpdGxlLFxuICAgICAgICB0aGlzLmZvcm1Db25maWc/LmZvcm1TdGFuZGFyZEVycm9ycy52YWxpZGF0aW9uRmllbGRzKTtcbiAgICAgIGZvciAoY29uc3QgY29kZSBvZiB2YWxpZGF0aW9uSXNzdWVGaWVsZHMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbklzc3VlRmllbGQgPSB0aGlzLmdldEZpZWxkKGNvZGUpO1xuICAgICAgICBpZiAodmFsaWRhdGlvbklzc3VlRmllbGQpIHtcbiAgICAgICAgICB2YWxpZGF0aW9uSXNzdWVGaWVsZC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdGlvbkVycm9yO1xuICB9XG5cbiAgY29weVRhYmxlUmVjb3JkVG9GaWVsZHModGFibGVPYmo6IGFueSwgbWFwcGluZ1RhYmxlOiBhbnkgPSBudWxsKSB7XG4gICAgY29uc3QgdGFibGVPYmplY3QgPSB0aGlzLmdldFRhYmxlKHRhYmxlT2JqLnRhYmxlQ29kZSk7XG4gICAgY29uc3QgdGFibGVSZWNvcmQgPSB0YWJsZU9iamVjdD8uZ2V0VGFibGVSZWNvcmQodGFibGVPYmoucmVjb3JkSWQpO1xuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gdGFibGVPYmplY3Q/LmNvbHVtbk5hbWVzO1xuICAgIGlmICh0YWJsZVJlY29yZCAmJiBjb2x1bW5OYW1lcykge1xuICAgICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIG9mIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gdGFibGVSZWNvcmQuZ2V0RmllbGRWYWx1ZShjb2x1bW5OYW1lKSA/PyAnJztcbiAgICAgICAgY29uc3QgY29kZSA9IG1hcHBpbmdUYWJsZT8uW2NvbHVtbk5hbWVdID8/IGNvbHVtbk5hbWU7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29kZSA/IHRoaXMuZ2V0RmllbGQoY29kZSkgOiBudWxsO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShjb2x1bW5WYWx1ZSk7XG4gICAgICAgICAgZmllbGQuaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbm90aWZ5Rm9ybUFjdGl2aXR5KCkge1xuICAgIGlmICh0aGlzLl9ub3RpZnlGb3JtQWN0aXZpdHkpIHtcbiAgICAgIHRoaXMuX2V2ZW50RW1pdGVyLm5leHQoJ2Zvcm1BY3Rpdml0eScsIHsgY29kZTogdGhpcy5mb3JtQ29kZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTcOpdG9kb3MgTGVnYWN5IGRlIGNvbXBhdGliaWxpZGFkIGhhY2lhIGF0csOhc1xuICAgKi9cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2UgbmFtZSBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgZ2V0IGZvcm1Db2RlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm5hbWUgPz8gJyc7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2UgbmFtZSBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgc2V0IGZvcm1Db2RlKG5hbWU6IHN0cmluZykgeyB0aGlzLm5hbWUgPSBuYW1lOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIGJ1c3kgc2lnbmFsIGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBnZXQgaW5TZXJ2ZXJQcm9jZXNzKCkgeyByZXR1cm4gdGhpcy5idXN5KCk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugc3RhdGUgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGdldCBjdXJyZW50U3RhdGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3RhdGUgPz8gJyc7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2UgY2hhbmdlU3RhdGUgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIHNldCBjdXJyZW50U3RhdGUoc3RhdGU6IHN0cmluZykgeyB0aGlzPy5jaGFuZ2VTdGF0ZShzdGF0ZSk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25TZWN0aW9uQWN0aXZhdGlvbiBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgZ2V0IGZvcm1Sb3V0ZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZm9ybVJvdXRlID8/ICcnOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIG9uU2VjdGlvbkFjdGl2YXRpb24gaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIHNldCBmb3JtUm91dGUocm91dGU6IHN0cmluZykgeyB0aGlzLl9mb3JtUm91dGUgPSByb3V0ZTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvblNlY3Rpb25BY3RpdmF0aW9uIGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBhZGRTZWN0aW9uQWN0aXZhdGlvbihjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm9uU2VjdGlvbkFjdGl2YXRpb24oY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvblNlY3Rpb25JbmFjdGl2YXRpb24gaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGFkZFNlY3Rpb25JbmFjdGl2YXRpb24oY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vblNlY3Rpb25JbmFjdGl2YXRpb24oY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvbkFjdGlvblN0YXJ0IGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBhZGRBY3Rpb25NZXRob2RTdGFydChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm9uQWN0aW9uU3RhcnQoY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvbkFjdGlvbkZpbmlzaCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgYWRkQWN0aW9uTWV0aG9kRmluaXNoKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25BY3Rpb25GaW5pc2goY29kZXMsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvbkZpZWxkSW5wdXQgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGFkZEZpZWxkSW5wdXRWYWxpZGF0aW9uKGNvZGVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25GaWVsZElucHV0KGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25GaWVsZFZhbGlkYXRpb25TdGFydCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgYWRkRmllbGRWYWxpZGF0aW9uU3RhcnQoY29kZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgbnVsbCwgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vbkZpZWxkVmFsaWRhdGlvblN0YXJ0KGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25GaWVsZFZhbGlkYXRpb25GaW5pc2ggaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGFkZEZpZWxkVmFsaWRhdGlvbkZpbmlzaChjb2Rlczogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm9uRmllbGRWYWxpZGF0aW9uRmluaXNoKGNvZGVzLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25UYWJsZUFjdGlvblN0YXJ0IGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBhZGRUYWJsZUFjdGlvblN0YXJ0KGNvZGU6IHN0cmluZywgYWN0aW9uQ29kZTogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm9uVGFibGVBY3Rpb25TdGFydChjb2RlLCBhY3Rpb25Db2RlLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25UYWJsZUFjdGlvbkZpbmlzaCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgYWRkVGFibGVBY3Rpb25GaW5pc2goY29kZTogc3RyaW5nLCBhY3Rpb25Db2RlOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25UYWJsZUFjdGlvbkZpbmlzaChjb2RlLCBhY3Rpb25Db2RlLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25UYWJsZVNlbGVjdGlvblN0YXJ0IGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBhZGRUYWJsZVNlbGVjdGlvblN0YXJ0KGNvZGU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vblRhYmxlU2VsZWN0aW9uU3RhcnQoY29kZSwgY2FsbGJhY2ssIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIG9uVGFibGVTZWxlY3Rpb25GaW5pc2ggaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGFkZFRhYmxlU2VsZWN0aW9uRmluaXNoKGNvZGU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5vblRhYmxlU2VsZWN0aW9uRmluaXNoKGNvZGUsIGNhbGxiYWNrLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvblRhYmxlR2V0RGF0YVN0YXJ0IGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBhZGRUYWJsZUdldERhdGFTdGFydChjb2RlOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25UYWJsZUdldERhdGFTdGFydChjb2RlLCBjYWxsYmFjaywgcHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb25UYWJsZUdldERhdGFGaW5pc2ggaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGFkZFRhYmxlR2V0RGF0YUZpbmlzaChjb2RlOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMub25UYWJsZUdldERhdGFGaW5pc2goY29kZSwgY2FsbGJhY2ssIHByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIHByb2Nlc3NJbnB1dFBhcmFtcyBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgcHJlb2Nlc3NJbnB1dFBhcmFtcyhwYXJhbXM6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NJbnB1dFBhcmFtcyhwYXJhbXMpO1xuICB9XG5cbn1cbiJdfQ==