@glowgreen/gg-questionnaire-v2 0.0.81 → 0.0.83

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 (62) hide show
  1. package/bundles/glowgreen-gg-questionnaire-v2.umd.js +305 -1239
  2. package/bundles/glowgreen-gg-questionnaire-v2.umd.js.map +1 -1
  3. package/bundles/glowgreen-gg-questionnaire-v2.umd.min.js +15 -1
  4. package/bundles/glowgreen-gg-questionnaire-v2.umd.min.js.map +1 -1
  5. package/esm2015/glowgreen-gg-questionnaire-v2.js +2 -8
  6. package/esm2015/lib/enums/condition-relationship.enum.js +6 -11
  7. package/esm2015/lib/enums/condition-type.enum.js +10 -15
  8. package/esm2015/lib/enums/input-type.enum.js +15 -20
  9. package/esm2015/lib/enums/question-type.enum.js +15 -20
  10. package/esm2015/lib/enums/repeater-question-type.enum.js +7 -12
  11. package/esm2015/lib/enums/validation-type.enum.js +10 -15
  12. package/esm2015/lib/gg-questionnaire-v2.module.js +17 -13
  13. package/esm2015/lib/interfaces/attachment.js +1 -15
  14. package/esm2015/lib/interfaces/checklist-item.js +1 -15
  15. package/esm2015/lib/interfaces/condition-group.js +1 -15
  16. package/esm2015/lib/interfaces/condition.js +1 -17
  17. package/esm2015/lib/interfaces/question.js +1 -59
  18. package/esm2015/lib/interfaces/questionnaire-options.js +1 -21
  19. package/esm2015/lib/interfaces/questionnaire.js +1 -15
  20. package/esm2015/lib/interfaces/repeater-question.js +1 -33
  21. package/esm2015/lib/interfaces/section.js +1 -19
  22. package/esm2015/lib/interfaces/select-option.js +1 -19
  23. package/esm2015/lib/interfaces/validator.js +1 -15
  24. package/esm2015/lib/services/filter.service.js +44 -123
  25. package/esm2015/lib/services/form-constructor.service.js +30 -113
  26. package/esm2015/lib/services/questionnaire.service.js +97 -377
  27. package/esm2015/public_api.js +1 -5
  28. package/esm5/glowgreen-gg-questionnaire-v2.js +2 -8
  29. package/esm5/lib/enums/condition-relationship.enum.js +6 -11
  30. package/esm5/lib/enums/condition-type.enum.js +10 -15
  31. package/esm5/lib/enums/input-type.enum.js +15 -20
  32. package/esm5/lib/enums/question-type.enum.js +15 -20
  33. package/esm5/lib/enums/repeater-question-type.enum.js +7 -12
  34. package/esm5/lib/enums/validation-type.enum.js +10 -15
  35. package/esm5/lib/gg-questionnaire-v2.module.js +27 -27
  36. package/esm5/lib/interfaces/attachment.js +1 -15
  37. package/esm5/lib/interfaces/checklist-item.js +1 -15
  38. package/esm5/lib/interfaces/condition-group.js +1 -15
  39. package/esm5/lib/interfaces/condition.js +1 -17
  40. package/esm5/lib/interfaces/question.js +1 -59
  41. package/esm5/lib/interfaces/questionnaire-options.js +1 -21
  42. package/esm5/lib/interfaces/questionnaire.js +1 -15
  43. package/esm5/lib/interfaces/repeater-question.js +1 -33
  44. package/esm5/lib/interfaces/section.js +1 -19
  45. package/esm5/lib/interfaces/select-option.js +1 -19
  46. package/esm5/lib/interfaces/validator.js +1 -15
  47. package/esm5/lib/services/filter.service.js +46 -263
  48. package/esm5/lib/services/form-constructor.service.js +35 -247
  49. package/esm5/lib/services/questionnaire.service.js +105 -608
  50. package/esm5/public_api.js +1 -5
  51. package/fesm2015/glowgreen-gg-questionnaire-v2.js +244 -711
  52. package/fesm2015/glowgreen-gg-questionnaire-v2.js.map +1 -1
  53. package/fesm5/glowgreen-gg-questionnaire-v2.js +242 -1203
  54. package/fesm5/glowgreen-gg-questionnaire-v2.js.map +1 -1
  55. package/glowgreen-gg-questionnaire-v2.d.ts +1 -2
  56. package/lib/gg-questionnaire-v2.module.d.ts +5 -1
  57. package/lib/interfaces/question.d.ts +1 -1
  58. package/lib/services/filter.service.d.ts +3 -0
  59. package/lib/services/form-constructor.service.d.ts +3 -0
  60. package/lib/services/questionnaire.service.d.ts +12 -9
  61. package/package.json +5 -3
  62. package/glowgreen-gg-questionnaire-v2.metadata.json +0 -1
@@ -1,8 +1,4 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
1
+ import { __values } from "tslib";
6
2
  import { Injectable, Inject, EventEmitter } from '@angular/core';
7
3
  import { FormConstructorService } from './form-constructor.service';
8
4
  import { FormArray } from '@angular/forms';
@@ -25,28 +21,11 @@ var QuestionnaireService = /** @class */ (function () {
25
21
  * @returns null
26
22
  * @author Will Poulson
27
23
  */
28
- /**
29
- * Loads a questionnaire from data.
30
- * @author Will Poulson
31
- * @param {?} questionnaire The questionnaire data to load, often parsed JSON from the editor.
32
- * @param {?=} savedState The saved state of the questionnaire, often from localstorage.
33
- * @param {?=} additionalData
34
- * @return {?} null
35
- */
36
- QuestionnaireService.prototype.loadQuestionnaire = /**
37
- * Loads a questionnaire from data.
38
- * @author Will Poulson
39
- * @param {?} questionnaire The questionnaire data to load, often parsed JSON from the editor.
40
- * @param {?=} savedState The saved state of the questionnaire, often from localstorage.
41
- * @param {?=} additionalData
42
- * @return {?} null
43
- */
44
- function (questionnaire, savedState, additionalData) {
24
+ QuestionnaireService.prototype.loadQuestionnaire = function (questionnaire, savedState, additionalData) {
45
25
  this.originalQuestionnaire = _.cloneDeep(questionnaire);
46
26
  this.currentQuestionnaire = _.cloneDeep(questionnaire);
47
27
  this.additionalData = additionalData;
48
28
  if (savedState && Object.keys(savedState).length > 0) {
49
- /** @type {?} */
50
29
  var newData = this.formConstuctor.generateFormsForQuestionnaire(_.cloneDeep(this.originalQuestionnaire), _.cloneDeep(this.currentQuestionnaire), this.currentQuestionnaireForm, this.additionalData, true);
51
30
  if (newData) {
52
31
  this.formConstuctor.constructRepeaterFromsFromState(savedState, newData.sections, newData.forms);
@@ -68,33 +47,10 @@ var QuestionnaireService = /** @class */ (function () {
68
47
  * @returns null
69
48
  * @author Will Poulson
70
49
  */
71
- /**
72
- * Updates the current questionnaire, used when a value is updated to check conditions.
73
- * @author Will Poulson
74
- * @param {?=} savedState The saved state of the questionnaire, often from localstorage.
75
- * @return {?} null
76
- */
77
- QuestionnaireService.prototype.updateQuestionnaire = /**
78
- * Updates the current questionnaire, used when a value is updated to check conditions.
79
- * @author Will Poulson
80
- * @param {?=} savedState The saved state of the questionnaire, often from localstorage.
81
- * @return {?} null
82
- */
83
- function (savedState) {
50
+ QuestionnaireService.prototype.updateQuestionnaire = function (savedState) {
84
51
  var e_1, _a, e_2, _b;
85
52
  var _this = this;
86
- /** @type {?} */
87
- var oldLength = this.currentQuestionnaire.sections.map((/**
88
- * @param {?} x
89
- * @return {?}
90
- */
91
- function (x) { return x.questions.length; })).reduce((/**
92
- * @param {?} a
93
- * @param {?} b
94
- * @return {?}
95
- */
96
- function (a, b) { return a + b; }), 0);
97
- /** @type {?} */
53
+ var oldLength = this.currentQuestionnaire.sections.map(function (x) { return x.questions.length; }).reduce(function (a, b) { return a + b; }, 0);
98
54
  var newData = this.formConstuctor.generateFormsForQuestionnaire(_.cloneDeep(this.originalQuestionnaire), _.cloneDeep(this.currentQuestionnaire), this.currentQuestionnaireForm, this.additionalData);
99
55
  if (newData) {
100
56
  this.currentQuestionnaireForm = newData.forms;
@@ -109,40 +65,23 @@ var QuestionnaireService = /** @class */ (function () {
109
65
  if (this.questionValueChangeSubscription) {
110
66
  this.questionValueChangeSubscription.unsubscribe();
111
67
  }
112
- this.questionnaireValueChangeSubscription = this.currentQuestionnaireForm.valueChanges.subscribe((/**
113
- * @return {?}
114
- */
115
- function () {
68
+ this.questionnaireValueChangeSubscription = this.currentQuestionnaireForm.valueChanges.subscribe(function () {
116
69
  _this.dataChangedEvent.emit();
117
70
  _this.updateQuestionnaire(_this.currentQuestionnaireForm.getRawValue());
118
- }));
71
+ });
119
72
  if (this.currentQuestion && this.currentQuestion.formControl) {
120
- this.questionValueChangeSubscription = this.currentQuestion.formControl.valueChanges.subscribe((/**
121
- * @return {?}
122
- */
123
- function () {
73
+ this.questionValueChangeSubscription = this.currentQuestion.formControl.valueChanges.subscribe(function () {
124
74
  _this.clearFields(_this.currentQuestion.data.clearfields);
125
- }));
75
+ });
126
76
  }
127
- /** @type {?} */
128
- var newLength = this.currentQuestionnaire.sections.map((/**
129
- * @param {?} x
130
- * @return {?}
131
- */
132
- function (x) { return x.questions.length; })).reduce((/**
133
- * @param {?} a
134
- * @param {?} b
135
- * @return {?}
136
- */
137
- function (a, b) { return a + b; }), 0);
77
+ var newLength = this.currentQuestionnaire.sections.map(function (x) { return x.questions.length; }).reduce(function (a, b) { return a + b; }, 0);
138
78
  if (oldLength !== newLength) {
139
79
  try {
140
- for (var _c = tslib_1.__values(this.currentQuestionnaire.sections), _d = _c.next(); !_d.done; _d = _c.next()) {
80
+ for (var _c = __values(this.currentQuestionnaire.sections), _d = _c.next(); !_d.done; _d = _c.next()) {
141
81
  var section = _d.value;
142
82
  try {
143
- for (var _e = (e_2 = void 0, tslib_1.__values(section.questions)), _f = _e.next(); !_f.done; _f = _e.next()) {
83
+ for (var _e = (e_2 = void 0, __values(section.questions)), _f = _e.next(); !_f.done; _f = _e.next()) {
144
84
  var question = _f.value;
145
- /** @type {?} */
146
85
  var control = this.currentQuestionnaireForm.get([section.name, question.name]);
147
86
  if (control && control.value === null && question.defaultValue) {
148
87
  control.setValue(question.defaultValue);
@@ -167,47 +106,26 @@ var QuestionnaireService = /** @class */ (function () {
167
106
  }
168
107
  }
169
108
  };
170
- /**
171
- * @param {?} payload
172
- * @return {?}
173
- */
174
- QuestionnaireService.prototype.updateAdditionalData = /**
175
- * @param {?} payload
176
- * @return {?}
177
- */
178
- function (payload) {
109
+ QuestionnaireService.prototype.updateAdditionalData = function (payload) {
179
110
  this.additionalData = Object.assign(this.additionalData, payload);
180
111
  this.updateQuestionnaire(this.currentQuestionnaireForm.getRawValue());
181
112
  };
182
- /**
183
- * @return {?}
184
- */
185
- QuestionnaireService.prototype.clearAdditionalData = /**
186
- * @return {?}
187
- */
188
- function () {
113
+ QuestionnaireService.prototype.clearAdditionalData = function () {
189
114
  this.additionalData = {};
190
115
  this.updateQuestionnaire(this.currentQuestionnaireForm.getRawValue());
191
116
  };
192
117
  Object.defineProperty(QuestionnaireService.prototype, "isValid", {
193
- get: /**
194
- * @return {?}
195
- */
196
- function () {
118
+ get: function () {
197
119
  return this.currentQuestionnaireForm.valid;
198
120
  },
199
121
  enumerable: true,
200
122
  configurable: true
201
123
  });
202
124
  Object.defineProperty(QuestionnaireService.prototype, "isFirstQuestion", {
203
- get: /**
204
- * @return {?}
205
- */
206
- function () {
125
+ get: function () {
207
126
  if (!this.currentSection || !this.currentQuestion) {
208
127
  return false;
209
128
  }
210
- /** @type {?} */
211
129
  var currentIndex = this.currentSection.data.questions.indexOf(this.currentQuestion.data);
212
130
  return currentIndex === 0;
213
131
  },
@@ -215,16 +133,11 @@ var QuestionnaireService = /** @class */ (function () {
215
133
  configurable: true
216
134
  });
217
135
  Object.defineProperty(QuestionnaireService.prototype, "isLastQuestion", {
218
- get: /**
219
- * @return {?}
220
- */
221
- function () {
136
+ get: function () {
222
137
  if (!this.currentSection || !this.currentQuestion) {
223
138
  return false;
224
139
  }
225
- /** @type {?} */
226
140
  var currentIndex = this.currentSection.data.questions.indexOf(this.currentQuestion.data);
227
- /** @type {?} */
228
141
  var maxIndex = this.currentSection.data.questions.length - 1;
229
142
  return currentIndex === maxIndex;
230
143
  },
@@ -232,14 +145,10 @@ var QuestionnaireService = /** @class */ (function () {
232
145
  configurable: true
233
146
  });
234
147
  Object.defineProperty(QuestionnaireService.prototype, "isFirstSection", {
235
- get: /**
236
- * @return {?}
237
- */
238
- function () {
148
+ get: function () {
239
149
  if (!this.currentSection) {
240
150
  return false;
241
151
  }
242
- /** @type {?} */
243
152
  var currentIndex = this.currentQuestionnaire.sections.indexOf(this.currentSection.data);
244
153
  return currentIndex === 0;
245
154
  },
@@ -247,31 +156,18 @@ var QuestionnaireService = /** @class */ (function () {
247
156
  configurable: true
248
157
  });
249
158
  Object.defineProperty(QuestionnaireService.prototype, "isLastSection", {
250
- get: /**
251
- * @return {?}
252
- */
253
- function () {
159
+ get: function () {
254
160
  if (!this.currentSection) {
255
161
  return false;
256
162
  }
257
- /** @type {?} */
258
163
  var currentIndex = this.currentQuestionnaire.sections.indexOf(this.currentSection.data);
259
- /** @type {?} */
260
164
  var maxIndex = this.currentQuestionnaire.sections.length - 1;
261
165
  return currentIndex === maxIndex;
262
166
  },
263
167
  enumerable: true,
264
168
  configurable: true
265
169
  });
266
- /**
267
- * @param {?} name
268
- * @return {?}
269
- */
270
- QuestionnaireService.prototype.sectionValid = /**
271
- * @param {?} name
272
- * @return {?}
273
- */
274
- function (name) {
170
+ QuestionnaireService.prototype.sectionValid = function (name) {
275
171
  return this.currentQuestionnaireForm.get(name).valid;
276
172
  };
277
173
  /**
@@ -279,29 +175,14 @@ var QuestionnaireService = /** @class */ (function () {
279
175
  * @param clearfields An array of strings, paths to clear.
280
176
  * @author Will Poulson
281
177
  */
282
- /**
283
- * Clears all the fields parsed
284
- * @author Will Poulson
285
- * @private
286
- * @param {?} clearfields An array of strings, paths to clear.
287
- * @return {?}
288
- */
289
- QuestionnaireService.prototype.clearFields = /**
290
- * Clears all the fields parsed
291
- * @author Will Poulson
292
- * @private
293
- * @param {?} clearfields An array of strings, paths to clear.
294
- * @return {?}
295
- */
296
- function (clearfields) {
178
+ QuestionnaireService.prototype.clearFields = function (clearfields) {
297
179
  var e_3, _a;
298
180
  if (!clearfields || clearfields.length === 0) {
299
181
  return;
300
182
  }
301
183
  try {
302
- for (var clearfields_1 = tslib_1.__values(clearfields), clearfields_1_1 = clearfields_1.next(); !clearfields_1_1.done; clearfields_1_1 = clearfields_1.next()) {
184
+ for (var clearfields_1 = __values(clearfields), clearfields_1_1 = clearfields_1.next(); !clearfields_1_1.done; clearfields_1_1 = clearfields_1.next()) {
303
185
  var clearfield = clearfields_1_1.value;
304
- /** @type {?} */
305
186
  var control = this.currentQuestionnaireForm.get(clearfield);
306
187
  if (control) {
307
188
  control.reset(undefined);
@@ -321,19 +202,7 @@ var QuestionnaireService = /** @class */ (function () {
321
202
  * Useful when exiting a questionnaire page or completing a questionnaire.
322
203
  * @author Will Poulson
323
204
  */
324
- /**
325
- * Unloads the current questionnaire.
326
- * Useful when exiting a questionnaire page or completing a questionnaire.
327
- * @author Will Poulson
328
- * @return {?}
329
- */
330
- QuestionnaireService.prototype.unloadQuestionnaire = /**
331
- * Unloads the current questionnaire.
332
- * Useful when exiting a questionnaire page or completing a questionnaire.
333
- * @author Will Poulson
334
- * @return {?}
335
- */
336
- function () {
205
+ QuestionnaireService.prototype.unloadQuestionnaire = function () {
337
206
  this.originalQuestionnaire = undefined;
338
207
  this.currentQuestionnaireForm = undefined;
339
208
  this.currentQuestionnaire = undefined;
@@ -347,30 +216,20 @@ var QuestionnaireService = /** @class */ (function () {
347
216
  * @returns An object containing the section data and the related form group.
348
217
  * @author Will Poulson
349
218
  */
350
- get: /**
351
- * Gets the current selected section.
352
- * @author Will Poulson
353
- * @return {?} An object containing the section data and the related form group.
354
- */
355
- function () {
219
+ get: function () {
356
220
  var _this = this;
357
221
  if (!this.currentSectionName) {
358
222
  return null;
359
223
  }
360
- /** @type {?} */
361
- var data = this.currentQuestionnaire.sections.find((/**
362
- * @param {?} x
363
- * @return {?}
364
- */
365
- function (x) {
224
+ var data = this.currentQuestionnaire.sections.find(function (x) {
366
225
  return x.name === _this.currentSectionName;
367
- }));
226
+ });
368
227
  if (!data) {
369
228
  return null;
370
229
  }
371
230
  return {
372
231
  data: data,
373
- formGroup: (/** @type {?} */ (this.currentQuestionnaireForm.get(data.name)))
232
+ formGroup: this.currentQuestionnaireForm.get(data.name)
374
233
  };
375
234
  },
376
235
  enumerable: true,
@@ -382,12 +241,7 @@ var QuestionnaireService = /** @class */ (function () {
382
241
  * @returns An array of all avaialble sections.
383
242
  * @author Will Poulson
384
243
  */
385
- get: /**
386
- * Gets all the avaialble sections.
387
- * @author Will Poulson
388
- * @return {?} An array of all avaialble sections.
389
- */
390
- function () {
244
+ get: function () {
391
245
  if (!this.currentQuestionnaire || !this.currentQuestionnaire.sections) {
392
246
  return [];
393
247
  }
@@ -402,12 +256,7 @@ var QuestionnaireService = /** @class */ (function () {
402
256
  * @returns An object of data.
403
257
  * @author Will Poulson
404
258
  */
405
- get: /**
406
- * Gets the current data for the entire questionnaire.
407
- * @author Will Poulson
408
- * @return {?} An object of data.
409
- */
410
- function () {
259
+ get: function () {
411
260
  return this.currentQuestionnaireForm ? this.currentQuestionnaireForm.getRawValue() : {};
412
261
  },
413
262
  enumerable: true,
@@ -419,29 +268,18 @@ var QuestionnaireService = /** @class */ (function () {
419
268
  * @returns An object containing the question data and the related form control.
420
269
  * @author Will Poulson
421
270
  */
422
- get: /**
423
- * Gets the current selected question.
424
- * @author Will Poulson
425
- * @return {?} An object containing the question data and the related form control.
426
- */
427
- function () {
271
+ get: function () {
428
272
  var _this = this;
429
273
  if (!this.currentQuestionName) {
430
274
  return null;
431
275
  }
432
- /** @type {?} */
433
- var data = this.currentSection.data.questions.find((/**
434
- * @param {?} x
435
- * @return {?}
436
- */
437
- function (x) {
276
+ var data = this.currentSection.data.questions.find(function (x) {
438
277
  return x.name === _this.currentQuestionName;
439
- }));
278
+ });
440
279
  if (!data) {
441
280
  return null;
442
281
  }
443
- /** @type {?} */
444
- var formControl = (/** @type {?} */ (this.currentSection.formGroup.get(data.name)));
282
+ var formControl = this.currentSection.formGroup.get(data.name);
445
283
  return {
446
284
  data: data,
447
285
  formControl: formControl
@@ -458,70 +296,31 @@ var QuestionnaireService = /** @class */ (function () {
458
296
  * @returns A promise which will resolve when the question has been navigated to.
459
297
  * @author Will Poulson
460
298
  */
461
- /**
462
- * Navigates to the next question.
463
- * If there is no question to navigate to it will reject with a out of bounds exception.
464
- * If allowSkipRequiredField is false then it will reject if the current question is invalid.
465
- * If emitSectionFinishEvent is true then it will emit an event if it's navigating past the length of questions.
466
- * @author Will Poulson
467
- * @return {?} A promise which will resolve when the question has been navigated to.
468
- */
469
- QuestionnaireService.prototype.nextQuestion = /**
470
- * Navigates to the next question.
471
- * If there is no question to navigate to it will reject with a out of bounds exception.
472
- * If allowSkipRequiredField is false then it will reject if the current question is invalid.
473
- * If emitSectionFinishEvent is true then it will emit an event if it's navigating past the length of questions.
474
- * @author Will Poulson
475
- * @return {?} A promise which will resolve when the question has been navigated to.
476
- */
477
- function () {
299
+ QuestionnaireService.prototype.nextQuestion = function () {
478
300
  var _this = this;
479
- return new Promise((/**
480
- * @param {?} resolve
481
- * @param {?} reject
482
- * @return {?}
483
- */
484
- function (resolve, reject) {
301
+ return new Promise(function (resolve, reject) {
485
302
  if (!_this.options.allowSkipRequiredField) {
486
303
  if (_this.currentQuestion.formControl && !_this.currentQuestion.formControl.valid) {
487
304
  return reject('Current question is invalid');
488
305
  }
489
306
  }
490
- _this.getCurrentQuestionIndex().then((/**
491
- * @param {?} currentIndex
492
- * @return {?}
493
- */
494
- function (currentIndex) {
495
- /** @type {?} */
307
+ _this.getCurrentQuestionIndex().then(function (currentIndex) {
496
308
  var lastQuestionIndex = _this.currentSection.data.questions.length - 1;
497
- /** @type {?} */
498
309
  var isLastQuestion = lastQuestionIndex === currentIndex;
499
310
  if (isLastQuestion) {
500
311
  _this.sectionFinishedEvent.emit();
501
312
  return resolve();
502
313
  }
503
- /** @type {?} */
504
314
  var newIndex = currentIndex + 1;
505
- _this.navigateToQuestion(newIndex).then((/**
506
- * @return {?}
507
- */
508
- function () {
315
+ _this.navigateToQuestion(newIndex).then(function () {
509
316
  return resolve();
510
- })).catch((/**
511
- * @param {?} error
512
- * @return {?}
513
- */
514
- function (error) {
317
+ }).catch(function (error) {
515
318
  return reject(error);
516
- }));
517
- })).catch((/**
518
- * @param {?} error
519
- * @return {?}
520
- */
521
- function (error) {
319
+ });
320
+ }).catch(function (error) {
522
321
  return reject(error);
523
- }));
524
- }));
322
+ });
323
+ });
525
324
  };
526
325
  /**
527
326
  * Navigates to the previous question.
@@ -530,91 +329,38 @@ var QuestionnaireService = /** @class */ (function () {
530
329
  * @returns A promise which will resolve when the question has been navigated to.
531
330
  * @author Will Poulson
532
331
  */
533
- /**
534
- * Navigates to the previous question.
535
- * If there is no question to navigate to it will reject with a out of bounds exception.
536
- * If allowNavigateBackwards is false then it will reject.
537
- * @author Will Poulson
538
- * @return {?} A promise which will resolve when the question has been navigated to.
539
- */
540
- QuestionnaireService.prototype.prevQuestion = /**
541
- * Navigates to the previous question.
542
- * If there is no question to navigate to it will reject with a out of bounds exception.
543
- * If allowNavigateBackwards is false then it will reject.
544
- * @author Will Poulson
545
- * @return {?} A promise which will resolve when the question has been navigated to.
546
- */
547
- function () {
332
+ QuestionnaireService.prototype.prevQuestion = function () {
548
333
  var _this = this;
549
- return new Promise((/**
550
- * @param {?} resolve
551
- * @param {?} reject
552
- * @return {?}
553
- */
554
- function (resolve, reject) {
334
+ return new Promise(function (resolve, reject) {
555
335
  if (!_this.options.allowNavigateBackwards) {
556
336
  return reject('This questionnaire does not allow for backwards navigation');
557
337
  }
558
- _this.getCurrentQuestionIndex().then((/**
559
- * @param {?} currentIndex
560
- * @return {?}
561
- */
562
- function (currentIndex) {
563
- /** @type {?} */
338
+ _this.getCurrentQuestionIndex().then(function (currentIndex) {
564
339
  var newIndex = currentIndex - 1;
565
- _this.navigateToQuestion(newIndex).then((/**
566
- * @return {?}
567
- */
568
- function () {
340
+ _this.navigateToQuestion(newIndex).then(function () {
569
341
  return resolve();
570
- })).catch((/**
571
- * @param {?} error
572
- * @return {?}
573
- */
574
- function (error) {
342
+ }).catch(function (error) {
575
343
  return reject(error);
576
- }));
577
- })).catch((/**
578
- * @param {?} error
579
- * @return {?}
580
- */
581
- function (error) {
344
+ });
345
+ }).catch(function (error) {
582
346
  return reject(error);
583
- }));
584
- }));
347
+ });
348
+ });
585
349
  };
586
350
  /**
587
351
  * Gets the current questions index.
588
352
  * @returns A promise which resolves a number.
589
353
  * @author Will Poulson
590
354
  */
591
- /**
592
- * Gets the current questions index.
593
- * @author Will Poulson
594
- * @private
595
- * @return {?} A promise which resolves a number.
596
- */
597
- QuestionnaireService.prototype.getCurrentQuestionIndex = /**
598
- * Gets the current questions index.
599
- * @author Will Poulson
600
- * @private
601
- * @return {?} A promise which resolves a number.
602
- */
603
- function () {
355
+ QuestionnaireService.prototype.getCurrentQuestionIndex = function () {
604
356
  var _this = this;
605
- return new Promise((/**
606
- * @param {?} resolve
607
- * @param {?} reject
608
- * @return {?}
609
- */
610
- function (resolve, reject) {
611
- /** @type {?} */
357
+ return new Promise(function (resolve, reject) {
612
358
  var currentIndex = _this.currentSection.data.questions.indexOf(_this.currentQuestion.data);
613
359
  if (currentIndex === -1) {
614
360
  return reject('Could not find current question');
615
361
  }
616
362
  return resolve(currentIndex);
617
- }));
363
+ });
618
364
  };
619
365
  /**
620
366
  * Checks a question is in bounds then navigates to it.
@@ -622,167 +368,70 @@ var QuestionnaireService = /** @class */ (function () {
622
368
  * @returns A promise which will resolve when the question has been navigated to.
623
369
  * @author Will Poulson
624
370
  */
625
- /**
626
- * Checks a question is in bounds then navigates to it.
627
- * @author Will Poulson
628
- * @param {?} index The index to navigate to.
629
- * @return {?} A promise which will resolve when the question has been navigated to.
630
- */
631
- QuestionnaireService.prototype.navigateToQuestion = /**
632
- * Checks a question is in bounds then navigates to it.
633
- * @author Will Poulson
634
- * @param {?} index The index to navigate to.
635
- * @return {?} A promise which will resolve when the question has been navigated to.
636
- */
637
- function (index) {
371
+ QuestionnaireService.prototype.navigateToQuestion = function (index) {
638
372
  var _this = this;
639
- return new Promise((/**
640
- * @param {?} resolve
641
- * @param {?} reject
642
- * @return {?}
643
- */
644
- function (resolve, reject) {
373
+ return new Promise(function (resolve, reject) {
645
374
  if (_this.currentSection.data.questions.length - 1 < index || index < 0) {
646
375
  return reject('Out of bounds exception');
647
376
  }
648
377
  _this.currentQuestionName = _this.currentSection.data.questions[index].name;
649
378
  return resolve();
650
- }));
379
+ });
651
380
  };
652
381
  /**
653
382
  * Navigates to the next section.
654
383
  * @returns A promise which will resolve when the section has been navigated to.
655
384
  * @author Will Poulson
656
385
  */
657
- /**
658
- * Navigates to the next section.
659
- * @author Will Poulson
660
- * @return {?} A promise which will resolve when the section has been navigated to.
661
- */
662
- QuestionnaireService.prototype.nextSection = /**
663
- * Navigates to the next section.
664
- * @author Will Poulson
665
- * @return {?} A promise which will resolve when the section has been navigated to.
666
- */
667
- function () {
386
+ QuestionnaireService.prototype.nextSection = function () {
668
387
  var _this = this;
669
- return new Promise((/**
670
- * @param {?} resolve
671
- * @param {?} reject
672
- * @return {?}
673
- */
674
- function (resolve, reject) {
675
- _this.getCurrentSectionIndex().then((/**
676
- * @param {?} currentIndex
677
- * @return {?}
678
- */
679
- function (currentIndex) {
680
- /** @type {?} */
388
+ return new Promise(function (resolve, reject) {
389
+ _this.getCurrentSectionIndex().then(function (currentIndex) {
681
390
  var newIndex = currentIndex + 1;
682
- _this.navigateToSection(newIndex).then((/**
683
- * @return {?}
684
- */
685
- function () {
391
+ _this.navigateToSection(newIndex).then(function () {
686
392
  return resolve();
687
- })).catch((/**
688
- * @param {?} error
689
- * @return {?}
690
- */
691
- function (error) {
393
+ }).catch(function (error) {
692
394
  return reject(error);
693
- }));
694
- })).catch((/**
695
- * @param {?} error
696
- * @return {?}
697
- */
698
- function (error) {
395
+ });
396
+ }).catch(function (error) {
699
397
  return reject(error);
700
- }));
701
- }));
398
+ });
399
+ });
702
400
  };
703
401
  /**
704
402
  * Navigates to the previous section.
705
403
  * @returns A promise which will resolve when the section has been navigated to.
706
404
  * @author Will Poulson
707
405
  */
708
- /**
709
- * Navigates to the previous section.
710
- * @author Will Poulson
711
- * @return {?} A promise which will resolve when the section has been navigated to.
712
- */
713
- QuestionnaireService.prototype.prevSection = /**
714
- * Navigates to the previous section.
715
- * @author Will Poulson
716
- * @return {?} A promise which will resolve when the section has been navigated to.
717
- */
718
- function () {
406
+ QuestionnaireService.prototype.prevSection = function () {
719
407
  var _this = this;
720
- return new Promise((/**
721
- * @param {?} resolve
722
- * @param {?} reject
723
- * @return {?}
724
- */
725
- function (resolve, reject) {
726
- _this.getCurrentSectionIndex().then((/**
727
- * @param {?} currentIndex
728
- * @return {?}
729
- */
730
- function (currentIndex) {
731
- /** @type {?} */
408
+ return new Promise(function (resolve, reject) {
409
+ _this.getCurrentSectionIndex().then(function (currentIndex) {
732
410
  var newIndex = currentIndex - 1;
733
- _this.navigateToSection(newIndex).then((/**
734
- * @return {?}
735
- */
736
- function () {
411
+ _this.navigateToSection(newIndex).then(function () {
737
412
  return resolve();
738
- })).catch((/**
739
- * @param {?} error
740
- * @return {?}
741
- */
742
- function (error) {
413
+ }).catch(function (error) {
743
414
  return reject(error);
744
- }));
745
- })).catch((/**
746
- * @param {?} error
747
- * @return {?}
748
- */
749
- function (error) {
415
+ });
416
+ }).catch(function (error) {
750
417
  return reject(error);
751
- }));
752
- }));
418
+ });
419
+ });
753
420
  };
754
421
  /**
755
422
  * Gets the current section index.
756
423
  * @returns A promise which resolves a number.
757
424
  * @author Will Poulson
758
425
  */
759
- /**
760
- * Gets the current section index.
761
- * @author Will Poulson
762
- * @private
763
- * @return {?} A promise which resolves a number.
764
- */
765
- QuestionnaireService.prototype.getCurrentSectionIndex = /**
766
- * Gets the current section index.
767
- * @author Will Poulson
768
- * @private
769
- * @return {?} A promise which resolves a number.
770
- */
771
- function () {
426
+ QuestionnaireService.prototype.getCurrentSectionIndex = function () {
772
427
  var _this = this;
773
- return new Promise((/**
774
- * @param {?} resolve
775
- * @param {?} reject
776
- * @return {?}
777
- */
778
- function (resolve, reject) {
779
- /** @type {?} */
428
+ return new Promise(function (resolve, reject) {
780
429
  var currentIndex = _this.currentQuestionnaire.sections.indexOf(_this.currentSection.data);
781
430
  if (currentIndex === -1) {
782
431
  return reject('Could not find current section');
783
432
  }
784
433
  return resolve(currentIndex);
785
- }));
434
+ });
786
435
  };
787
436
  /**
788
437
  * Checks a section is in bounds then navigates to it.
@@ -790,53 +439,22 @@ var QuestionnaireService = /** @class */ (function () {
790
439
  * @returns A promise which will resolve when the section has been navigated to.
791
440
  * @author Will Poulson
792
441
  */
793
- /**
794
- * Checks a section is in bounds then navigates to it.
795
- * @author Will Poulson
796
- * @param {?} index The index to navigate to.
797
- * @return {?} A promise which will resolve when the section has been navigated to.
798
- */
799
- QuestionnaireService.prototype.navigateToSection = /**
800
- * Checks a section is in bounds then navigates to it.
801
- * @author Will Poulson
802
- * @param {?} index The index to navigate to.
803
- * @return {?} A promise which will resolve when the section has been navigated to.
804
- */
805
- function (index) {
442
+ QuestionnaireService.prototype.navigateToSection = function (index) {
806
443
  var _this = this;
807
- return new Promise((/**
808
- * @param {?} resolve
809
- * @param {?} reject
810
- * @return {?}
811
- */
812
- function (resolve, reject) {
444
+ return new Promise(function (resolve, reject) {
813
445
  if (_this.currentQuestionnaire.sections.length - 1 < index || index < 0) {
814
446
  return reject('Out of bounds exception');
815
447
  }
816
448
  _this.currentSectionName = _this.currentQuestionnaire.sections[index].name;
817
449
  return resolve();
818
- }));
450
+ });
819
451
  };
820
452
  /**
821
453
  * Answers the current question with the parsed value.
822
454
  * @param answer The value to answer the question with.
823
455
  * @author Will Poulson
824
456
  */
825
- /**
826
- * Answers the current question with the parsed value.
827
- * @author Will Poulson
828
- * @param {?} answer The value to answer the question with.
829
- * @param {?=} sendToNextQuestion
830
- * @return {?}
831
- */
832
- QuestionnaireService.prototype.answerCurrentQuestion = /**
833
- * Answers the current question with the parsed value.
834
- * @author Will Poulson
835
- * @param {?} answer The value to answer the question with.
836
- * @param {?=} sendToNextQuestion
837
- * @return {?}
838
- */
839
- function (answer, sendToNextQuestion) {
457
+ QuestionnaireService.prototype.answerCurrentQuestion = function (answer, sendToNextQuestion) {
840
458
  var _this = this;
841
459
  if (!sendToNextQuestion) {
842
460
  this.currentQuestion.formControl.setValue(answer);
@@ -844,18 +462,12 @@ var QuestionnaireService = /** @class */ (function () {
844
462
  }
845
463
  if (this.skippable) { // Timeout to prevent skipping glitch.
846
464
  this.skippable = false;
847
- setTimeout((/**
848
- * @return {?}
849
- */
850
- function () {
465
+ setTimeout(function () {
851
466
  _this.currentQuestion.formControl.setValue(answer);
852
- _this.nextQuestion().then((/**
853
- * @return {?}
854
- */
855
- function () {
467
+ _this.nextQuestion().then(function () {
856
468
  _this.skippable = true;
857
- }));
858
- }), 150);
469
+ });
470
+ }, 150);
859
471
  }
860
472
  };
861
473
  /**
@@ -864,30 +476,12 @@ var QuestionnaireService = /** @class */ (function () {
864
476
  * @returns A promise which resolves when the repeater item has been added.
865
477
  * @author Will Poulson
866
478
  */
867
- /**
868
- * Adds a repeater item to the current question.
869
- * Current question must be of type Repeater.
870
- * @author Will Poulson
871
- * @return {?} A promise which resolves when the repeater item has been added.
872
- */
873
- QuestionnaireService.prototype.addRepeaterItem = /**
874
- * Adds a repeater item to the current question.
875
- * Current question must be of type Repeater.
876
- * @author Will Poulson
877
- * @return {?} A promise which resolves when the repeater item has been added.
878
- */
879
- function () {
479
+ QuestionnaireService.prototype.addRepeaterItem = function () {
880
480
  var _this = this;
881
- return new Promise((/**
882
- * @param {?} resolve
883
- * @param {?} reject
884
- * @return {?}
885
- */
886
- function (resolve, reject) {
481
+ return new Promise(function (resolve, reject) {
887
482
  if (_this.currentQuestion.data.type !== QuestionType.Repeater) {
888
483
  return reject("Current question isn't a repeater");
889
484
  }
890
- /** @type {?} */
891
485
  var repeaterForm = _this.formConstuctor.generateFormsForRepeater(_this.currentQuestion.data);
892
486
  if (!repeaterForm) {
893
487
  return reject("Repeater template failed to generate. May be due to the repeater having no items in the editor.");
@@ -897,7 +491,7 @@ var QuestionnaireService = /** @class */ (function () {
897
491
  }
898
492
  _this.currentQuestion.formControl.push(repeaterForm);
899
493
  return resolve();
900
- }));
494
+ });
901
495
  };
902
496
  /**
903
497
  * Removes a repeater item on the current question.
@@ -906,28 +500,9 @@ var QuestionnaireService = /** @class */ (function () {
906
500
  * @returns A promise which resolves when the repeater item has been removed.
907
501
  * @author Will Poulson
908
502
  */
909
- /**
910
- * Removes a repeater item on the current question.
911
- * Current question must be of type Repeater.
912
- * @author Will Poulson
913
- * @param {?} index The index at which to remove.
914
- * @return {?} A promise which resolves when the repeater item has been removed.
915
- */
916
- QuestionnaireService.prototype.removeRepeaterItem = /**
917
- * Removes a repeater item on the current question.
918
- * Current question must be of type Repeater.
919
- * @author Will Poulson
920
- * @param {?} index The index at which to remove.
921
- * @return {?} A promise which resolves when the repeater item has been removed.
922
- */
923
- function (index) {
503
+ QuestionnaireService.prototype.removeRepeaterItem = function (index) {
924
504
  var _this = this;
925
- return new Promise((/**
926
- * @param {?} resolve
927
- * @param {?} reject
928
- * @return {?}
929
- */
930
- function (resolve, reject) {
505
+ return new Promise(function (resolve, reject) {
931
506
  if (_this.currentQuestion.data.type !== QuestionType.Repeater) {
932
507
  return reject("Current question isn't a repeater");
933
508
  }
@@ -936,7 +511,7 @@ var QuestionnaireService = /** @class */ (function () {
936
511
  }
937
512
  _this.currentQuestion.formControl.removeAt(index);
938
513
  return resolve();
939
- }));
514
+ });
940
515
  };
941
516
  /**
942
517
  * Returns the display text for a given repeater item
@@ -944,43 +519,24 @@ var QuestionnaireService = /** @class */ (function () {
944
519
  * @returns A string which is the display text.
945
520
  * @author Will Poulson
946
521
  */
947
- /**
948
- * Returns the display text for a given repeater item
949
- * @author Will Poulson
950
- * @param {?} index The index at which to get the label for.
951
- * @return {?} A string which is the display text.
952
- */
953
- QuestionnaireService.prototype.getRepeaterItemLabel = /**
954
- * Returns the display text for a given repeater item
955
- * @author Will Poulson
956
- * @param {?} index The index at which to get the label for.
957
- * @return {?} A string which is the display text.
958
- */
959
- function (index) {
522
+ QuestionnaireService.prototype.getRepeaterItemLabel = function (index) {
960
523
  var e_4, _a;
961
524
  if (!this.currentQuestion.formControl || !(this.currentQuestion.formControl instanceof FormArray)) {
962
525
  return '';
963
526
  }
964
- /** @type {?} */
965
527
  var repeaterItem = this.currentQuestion.formControl.controls[index];
966
528
  if (!repeaterItem) {
967
529
  return '';
968
530
  }
969
- /** @type {?} */
970
531
  var template = this.currentQuestion.data.repeaterDisplayName;
971
- /** @type {?} */
972
532
  var splitTemplate = template.split(' ');
973
- /** @type {?} */
974
533
  var displayArray = [];
975
534
  try {
976
- for (var splitTemplate_1 = tslib_1.__values(splitTemplate), splitTemplate_1_1 = splitTemplate_1.next(); !splitTemplate_1_1.done; splitTemplate_1_1 = splitTemplate_1.next()) {
535
+ for (var splitTemplate_1 = __values(splitTemplate), splitTemplate_1_1 = splitTemplate_1.next(); !splitTemplate_1_1.done; splitTemplate_1_1 = splitTemplate_1.next()) {
977
536
  var templateItem = splitTemplate_1_1.value;
978
537
  if (templateItem.match(/\[.*?\]/)) {
979
- /** @type {?} */
980
538
  var path = templateItem.replace(/[\[\]']+/g, '');
981
- /** @type {?} */
982
539
  var item = repeaterItem.get(path);
983
- /** @type {?} */
984
540
  var value = (item && item.value ? item.value : '?');
985
541
  displayArray.push(value);
986
542
  }
@@ -996,80 +552,21 @@ var QuestionnaireService = /** @class */ (function () {
996
552
  }
997
553
  finally { if (e_4) throw e_4.error; }
998
554
  }
999
- /** @type {?} */
1000
555
  var display = displayArray.join(' ');
1001
556
  return display;
1002
557
  };
1003
- QuestionnaireService.decorators = [
1004
- { type: Injectable, args: [{
1005
- providedIn: 'root'
1006
- },] }
1007
- ];
1008
- /** @nocollapse */
1009
- QuestionnaireService.ctorParameters = function () { return [
1010
- { type: FormConstructorService },
1011
- { type: undefined, decorators: [{ type: Inject, args: ['options',] }] }
1012
- ]; };
1013
- /** @nocollapse */ QuestionnaireService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function QuestionnaireService_Factory() { return new QuestionnaireService(i0.ɵɵinject(i1.FormConstructorService), i0.ɵɵinject("options")); }, token: QuestionnaireService, providedIn: "root" });
558
+ QuestionnaireService.ɵfac = function QuestionnaireService_Factory(t) { return new (t || QuestionnaireService)(i0.ɵɵinject(i1.FormConstructorService), i0.ɵɵinject('options')); };
559
+ QuestionnaireService.ɵprov = i0.ɵɵdefineInjectable({ token: QuestionnaireService, factory: QuestionnaireService.ɵfac, providedIn: 'root' });
1014
560
  return QuestionnaireService;
1015
561
  }());
1016
562
  export { QuestionnaireService };
1017
- if (false) {
1018
- /** @type {?} */
1019
- QuestionnaireService.prototype.dataChangedEvent;
1020
- /** @type {?} */
1021
- QuestionnaireService.prototype.sectionFinishedEvent;
1022
- /**
1023
- * @type {?}
1024
- * @private
1025
- */
1026
- QuestionnaireService.prototype.originalQuestionnaire;
1027
- /**
1028
- * @type {?}
1029
- * @private
1030
- */
1031
- QuestionnaireService.prototype.currentQuestionnaire;
1032
- /**
1033
- * @type {?}
1034
- * @private
1035
- */
1036
- QuestionnaireService.prototype.currentQuestionnaireForm;
1037
- /**
1038
- * @type {?}
1039
- * @private
1040
- */
1041
- QuestionnaireService.prototype.currentSectionName;
1042
- /**
1043
- * @type {?}
1044
- * @private
1045
- */
1046
- QuestionnaireService.prototype.currentQuestionName;
1047
- /**
1048
- * @type {?}
1049
- * @private
1050
- */
1051
- QuestionnaireService.prototype.questionnaireValueChangeSubscription;
1052
- /**
1053
- * @type {?}
1054
- * @private
1055
- */
1056
- QuestionnaireService.prototype.questionValueChangeSubscription;
1057
- /** @type {?} */
1058
- QuestionnaireService.prototype.additionalData;
1059
- /**
1060
- * @type {?}
1061
- * @private
1062
- */
1063
- QuestionnaireService.prototype.skippable;
1064
- /**
1065
- * @type {?}
1066
- * @private
1067
- */
1068
- QuestionnaireService.prototype.formConstuctor;
1069
- /**
1070
- * @type {?}
1071
- * @private
1072
- */
1073
- QuestionnaireService.prototype.options;
1074
- }
1075
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb25uYWlyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdsb3dncmVlbi9nZy1xdWVzdGlvbm5haXJlLXYyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3F1ZXN0aW9ubmFpcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVwRSxPQUFPLEVBQThCLFNBQVMsRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBSXBGLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7O0FBRTNEO0lBc0JFLDhCQUNVLGNBQXNDLEVBQ25CLE9BQTZCO1FBRGhELG1CQUFjLEdBQWQsY0FBYyxDQUF3QjtRQUNuQixZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQXBCbkQscUJBQWdCLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDOUQseUJBQW9CLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFlakUsY0FBUyxHQUFHLElBQUksQ0FBQztJQUtyQixDQUFDO0lBRUw7Ozs7OztPQU1HOzs7Ozs7Ozs7SUFDSSxnREFBaUI7Ozs7Ozs7O0lBQXhCLFVBQXlCLGFBQTRCLEVBQUUsVUFBbUIsRUFBRSxjQUF1QjtRQUNqRyxJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUVyQyxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFD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QUFFLENBQUM7O3dCQUM1QyxJQUFJLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7O3dCQUM3QixLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUNyRCxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMxQjtxQkFBTTtvQkFDTCxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNqQzthQUNGOzs7Ozs7Ozs7O1lBRUssT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3RDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7O2dCQXZqQkYsVUFBVSxTQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7OztnQkFaUSxzQkFBc0I7Z0RBa0MxQixNQUFNLFNBQUMsU0FBUzs7OytCQW5DckI7Q0Fta0JDLEFBeGpCRCxJQXdqQkM7U0FyakJZLG9CQUFvQjs7O0lBQy9CLGdEQUFxRTs7SUFDckUsb0RBQXlFOzs7OztJQUV6RSxxREFBNkM7Ozs7O0lBRTdDLG9EQUE0Qzs7Ozs7SUFDNUMsd0RBQTRDOzs7OztJQUU1QyxrREFBbUM7Ozs7O0lBQ25DLG1EQUFvQzs7Ozs7SUFFcEMsb0VBQTJEOzs7OztJQUMzRCwrREFBc0Q7O0lBRXRELDhDQUE4Qjs7Ozs7SUFFOUIseUNBQXlCOzs7OztJQUd2Qiw4Q0FBOEM7Ozs7O0lBQzlDLHVDQUF3RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29uc3RydWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi9mb3JtLWNvbnN0cnVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgUXVlc3Rpb25uYWlyZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcXVlc3Rpb25uYWlyZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNlY3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3NlY3Rpb24nO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3F1ZXN0aW9uJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUXVlc3Rpb25uYWlyZU9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3F1ZXN0aW9ubmFpcmUtb3B0aW9ucyc7XG5pbXBvcnQgeyBRdWVzdGlvblR5cGUgfSBmcm9tICcuLi9lbnVtcy9xdWVzdGlvbi10eXBlLmVudW0nO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbm5haXJlU2VydmljZSB7XG4gIHB1YmxpYyBkYXRhQ2hhbmdlZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBwdWJsaWMgc2VjdGlvbkZpbmlzaGVkRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgcHJpdmF0ZSBvcmlnaW5hbFF1ZXN0aW9ubmFpcmU6IFF1ZXN0aW9ubmFpcmU7XG5cbiAgcHJpdmF0ZSBjdXJyZW50UXVlc3Rpb25uYWlyZTogUXVlc3Rpb25uYWlyZTtcbiAgcHJpdmF0ZSBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm06IEZvcm1Hcm91cDtcblxuICBwcml2YXRlIGN1cnJlbnRTZWN0aW9uTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGN1cnJlbnRRdWVzdGlvbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIHF1ZXN0aW9ubmFpcmVWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHF1ZXN0aW9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgYWRkaXRpb25hbERhdGE6IE9iamVjdDtcblxuICBwcml2YXRlIHNraXBwYWJsZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb3JtQ29uc3R1Y3RvcjogRm9ybUNvbnN0cnVjdG9yU2VydmljZSxcbiAgICBASW5qZWN0KCdvcHRpb25zJykgcHJpdmF0ZSBvcHRpb25zOiBRdWVzdGlvbm5haXJlT3B0aW9uc1xuICApIHsgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIHF1ZXN0aW9ubmFpcmUgZnJvbSBkYXRhLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25uYWlyZSBUaGUgcXVlc3Rpb25uYWlyZSBkYXRhIHRvIGxvYWQsIG9mdGVuIHBhcnNlZCBKU09OIGZyb20gdGhlIGVkaXRvci5cbiAgICogQHBhcmFtIHNhdmVkU3RhdGUgVGhlIHNhdmVkIHN0YXRlIG9mIHRoZSBxdWVzdGlvbm5haXJlLCBvZnRlbiBmcm9tIGxvY2Fsc3RvcmFnZS5cbiAgICogQHJldHVybnMgbnVsbFxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGxvYWRRdWVzdGlvbm5haXJlKHF1ZXN0aW9ubmFpcmU6IFF1ZXN0aW9ubmFpcmUsIHNhdmVkU3RhdGU/OiBPYmplY3QsIGFkZGl0aW9uYWxEYXRhPzogT2JqZWN0KSB7XG4gICAgdGhpcy5vcmlnaW5hbFF1ZXN0aW9ubmFpcmUgPSBfLmNsb25lRGVlcChxdWVzdGlvbm5haXJlKTtcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlID0gXy5jbG9uZURlZXAocXVlc3Rpb25uYWlyZSk7XG5cbiAgICB0aGlzLmFkZGl0aW9uYWxEYXRhID0gYWRkaXRpb25hbERhdGE7XG5cbiAgICBpZiAoc2F2ZWRTdGF0ZSAmJiBPYmplY3Qua2V5cyhzYXZlZFN0YXRlKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gdGhpcy5mb3JtQ29uc3R1Y3Rvci5nZW5lcmF0ZUZvcm1zRm9yUXVlc3Rpb25uYWlyZShcbiAgICAgICAgXy5jbG9uZURlZXAodGhpcy5vcmlnaW5hbFF1ZXN0aW9ubmFpcmUpLFxuICAgICAgICBfLmNsb25lRGVlcCh0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlKSxcbiAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0sXG4gICAgICAgIHRoaXMuYWRkaXRpb25hbERhdGEsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIGlmIChuZXdEYXRhKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnN0dWN0b3IuY29uc3RydWN0UmVwZWF0ZXJGcm9tc0Zyb21TdGF0ZShzYXZlZFN0YXRlLCBuZXdEYXRhLnNlY3Rpb25zLCBuZXdEYXRhLmZvcm1zKTtcbiAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0gPSBuZXdEYXRhLmZvcm1zO1xuICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS5wYXRjaFZhbHVlKHNhdmVkU3RhdGUpO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVRdWVzdGlvbm5haXJlKHNhdmVkU3RhdGUpO1xuXG5cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcFRvRmlyc3RTZWN0aW9uKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTZWN0aW9uTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmNvbnRyb2xzKVswXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNraXBUb0ZpcnN0UXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuY3VycmVudFNlY3Rpb24uZm9ybUdyb3VwLmNvbnRyb2xzKVswXTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjdXJyZW50IHF1ZXN0aW9ubmFpcmUsIHVzZWQgd2hlbiBhIHZhbHVlIGlzIHVwZGF0ZWQgdG8gY2hlY2sgY29uZGl0aW9ucy5cbiAgICogQHBhcmFtIHNhdmVkU3RhdGUgVGhlIHNhdmVkIHN0YXRlIG9mIHRoZSBxdWVzdGlvbm5haXJlLCBvZnRlbiBmcm9tIGxvY2Fsc3RvcmFnZS5cbiAgICogQHJldHVybnMgbnVsbFxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVF1ZXN0aW9ubmFpcmUoc2F2ZWRTdGF0ZT86IE9iamVjdCkge1xuICAgIGNvbnN0IG9sZExlbmd0aCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMubWFwKHggPT4geC5xdWVzdGlvbnMubGVuZ3RoKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcblxuICAgIGNvbnN0IG5ld0RhdGEgPSB0aGlzLmZvcm1Db25zdHVjdG9yLmdlbmVyYXRlRm9ybXNGb3JRdWVzdGlvbm5haXJlKFxuICAgICAgXy5jbG9uZURlZXAodGhpcy5vcmlnaW5hbFF1ZXN0aW9ubmFpcmUpLFxuICAgICAgXy5jbG9uZURlZXAodGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZSksXG4gICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSxcbiAgICAgIHRoaXMuYWRkaXRpb25hbERhdGFcbiAgICApO1xuXG4gICAgaWYgKG5ld0RhdGEpIHtcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtID0gbmV3RGF0YS5mb3JtcztcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMgPSBuZXdEYXRhLnNlY3Rpb25zO1xuICAgIH1cblxuICAgIGlmIChzYXZlZFN0YXRlICYmIE9iamVjdC5rZXlzKHNhdmVkU3RhdGUpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLnBhdGNoVmFsdWUoc2F2ZWRTdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVlc3Rpb25uYWlyZVZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9ubmFpcmVWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucXVlc3Rpb25WYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHRoaXMucXVlc3Rpb25uYWlyZVZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFDaGFuZ2VkRXZlbnQuZW1pdCgpO1xuICAgICAgdGhpcy51cGRhdGVRdWVzdGlvbm5haXJlKHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmdldFJhd1ZhbHVlKCkpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudFF1ZXN0aW9uICYmIHRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhckZpZWxkcyh0aGlzLmN1cnJlbnRRdWVzdGlvbi5kYXRhLmNsZWFyZmllbGRzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0xlbmd0aCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMubWFwKHggPT4geC5xdWVzdGlvbnMubGVuZ3RoKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcblxuICAgIGlmIChvbGRMZW5ndGggIT09IG5ld0xlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBzZWN0aW9uLnF1ZXN0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS5nZXQoW3NlY3Rpb24ubmFtZSwgcXVlc3Rpb24ubmFtZV0pO1xuICAgICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wudmFsdWUgPT09IG51bGwgJiYgcXVlc3Rpb24uZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHF1ZXN0aW9uLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUFkZGl0aW9uYWxEYXRhKHBheWxvYWQ6IGFueSkge1xuICAgIHRoaXMuYWRkaXRpb25hbERhdGEgPSBPYmplY3QuYXNzaWduKHRoaXMuYWRkaXRpb25hbERhdGEsIHBheWxvYWQpO1xuICAgIHRoaXMudXBkYXRlUXVlc3Rpb25uYWlyZSh0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS5nZXRSYXdWYWx1ZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckFkZGl0aW9uYWxEYXRhKCkge1xuICAgIHRoaXMuYWRkaXRpb25hbERhdGEgPSB7fTtcbiAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9ubmFpcmUodGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0UmF3VmFsdWUoKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLnZhbGlkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0ZpcnN0UXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTZWN0aW9uIHx8ICF0aGlzLmN1cnJlbnRRdWVzdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEucXVlc3Rpb25zLmluZGV4T2YodGhpcy5jdXJyZW50UXVlc3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIGN1cnJlbnRJbmRleCA9PT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNMYXN0UXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTZWN0aW9uIHx8ICF0aGlzLmN1cnJlbnRRdWVzdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEucXVlc3Rpb25zLmluZGV4T2YodGhpcy5jdXJyZW50UXVlc3Rpb24uZGF0YSk7XG4gICAgY29uc3QgbWF4SW5kZXggPSAgdGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhLnF1ZXN0aW9ucy5sZW5ndGggLSAxO1xuICAgIHJldHVybiBjdXJyZW50SW5kZXggPT09IG1heEluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBpc0ZpcnN0U2VjdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFNlY3Rpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zLmluZGV4T2YodGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhKTtcbiAgICByZXR1cm4gY3VycmVudEluZGV4ID09PSAwO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0xhc3RTZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jdXJyZW50U2VjdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMuaW5kZXhPZih0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEpO1xuICAgIGNvbnN0IG1heEluZGV4ID0gIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gY3VycmVudEluZGV4ID09PSBtYXhJbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBzZWN0aW9uVmFsaWQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmdldChuYW1lKS52YWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIHRoZSBmaWVsZHMgcGFyc2VkXG4gICAqIEBwYXJhbSBjbGVhcmZpZWxkcyBBbiBhcnJheSBvZiBzdHJpbmdzLCBwYXRocyB0byBjbGVhci5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgY2xlYXJGaWVsZHMoY2xlYXJmaWVsZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBpZiAoIWNsZWFyZmllbGRzIHx8IGNsZWFyZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2xlYXJmaWVsZCBvZiBjbGVhcmZpZWxkcykge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmdldChjbGVhcmZpZWxkKTtcblxuICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgY29udHJvbC5yZXNldCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvYWRzIHRoZSBjdXJyZW50IHF1ZXN0aW9ubmFpcmUuXG4gICAqIFVzZWZ1bCB3aGVuIGV4aXRpbmcgYSBxdWVzdGlvbm5haXJlIHBhZ2Ugb3IgY29tcGxldGluZyBhIHF1ZXN0aW9ubmFpcmUuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgdW5sb2FkUXVlc3Rpb25uYWlyZSgpIHtcbiAgICB0aGlzLm9yaWdpbmFsUXVlc3Rpb25uYWlyZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFNlY3Rpb25OYW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFkZGl0aW9uYWxEYXRhID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgc2VjdGlvbi5cbiAgICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNlY3Rpb24gZGF0YSBhbmQgdGhlIHJlbGF0ZWQgZm9ybSBncm91cC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFNlY3Rpb24oKTogeyBkYXRhOiBTZWN0aW9uOyBmb3JtR3JvdXA6IEZvcm1Hcm91cDsgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy5jdXJyZW50U2VjdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zLmZpbmQoKHgpID0+IHtcbiAgICAgIHJldHVybiB4Lm5hbWUgPT09IHRoaXMuY3VycmVudFNlY3Rpb25OYW1lO1xuICAgIH0pO1xuXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGZvcm1Hcm91cDogdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0KGRhdGEubmFtZSkgYXMgRm9ybUdyb3VwXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgYXZhaWFsYmxlIHNlY3Rpb25zLlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgYXZhaWFsYmxlIHNlY3Rpb25zLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGdldCBhdmFpbGFibGVTZWN0aW9ucygpOiBBcnJheTxTZWN0aW9uPiB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlIHx8ICF0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgZGF0YSBmb3IgdGhlIGVudGlyZSBxdWVzdGlvbm5haXJlLlxuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgb2YgZGF0YS5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtID8gdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0UmF3VmFsdWUoKSA6IHt9O1xuICB9XG5cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBzZWxlY3RlZCBxdWVzdGlvbi5cbiAgICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHF1ZXN0aW9uIGRhdGEgYW5kIHRoZSByZWxhdGVkIGZvcm0gY29udHJvbC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFF1ZXN0aW9uKCk6IHsgZGF0YTogUXVlc3Rpb247IGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsOyB9IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRRdWVzdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEucXVlc3Rpb25zLmZpbmQoKHgpID0+IHtcbiAgICAgIHJldHVybiB4Lm5hbWUgPT09IHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZTtcbiAgICB9KTtcblxuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmZvcm1Hcm91cC5nZXQoZGF0YS5uYW1lKSBhcyBBYnN0cmFjdENvbnRyb2w7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGZvcm1Db250cm9sOiBmb3JtQ29udHJvbFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIHRvIHRoZSBuZXh0IHF1ZXN0aW9uLlxuICAgKiBJZiB0aGVyZSBpcyBubyBxdWVzdGlvbiB0byBuYXZpZ2F0ZSB0byBpdCB3aWxsIHJlamVjdCB3aXRoIGEgb3V0IG9mIGJvdW5kcyBleGNlcHRpb24uXG4gICAqIElmIGFsbG93U2tpcFJlcXVpcmVkRmllbGQgaXMgZmFsc2UgdGhlbiBpdCB3aWxsIHJlamVjdCBpZiB0aGUgY3VycmVudCBxdWVzdGlvbiBpcyBpbnZhbGlkLlxuICAgKiBJZiBlbWl0U2VjdGlvbkZpbmlzaEV2ZW50IGlzIHRydWUgdGhlbiBpdCB3aWxsIGVtaXQgYW4gZXZlbnQgaWYgaXQncyBuYXZpZ2F0aW5nIHBhc3QgdGhlIGxlbmd0aCBvZiBxdWVzdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCB3aWxsIHJlc29sdmUgd2hlbiB0aGUgcXVlc3Rpb24gaGFzIGJlZW4gbmF2aWdhdGVkIHRvLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIG5leHRRdWVzdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWxsb3dTa2lwUmVxdWlyZWRGaWVsZCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wgJiYgIXRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sLnZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnQ3VycmVudCBxdWVzdGlvbiBpcyBpbnZhbGlkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5nZXRDdXJyZW50UXVlc3Rpb25JbmRleCgpLnRoZW4oKGN1cnJlbnRJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBsYXN0UXVlc3Rpb25JbmRleCA9IHRoaXMuY3VycmVudFNlY3Rpb24uZGF0YS5xdWVzdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgY29uc3QgaXNMYXN0UXVlc3Rpb24gPSBsYXN0UXVlc3Rpb25JbmRleCA9PT0gY3VycmVudEluZGV4O1xuXG4gICAgICAgIGlmIChpc0xhc3RRdWVzdGlvbikge1xuICAgICAgICAgIHRoaXMuc2VjdGlvbkZpbmlzaGVkRXZlbnQuZW1pdCgpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG5cbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUXVlc3Rpb24obmV3SW5kZXgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byB0aGUgcHJldmlvdXMgcXVlc3Rpb24uXG4gICAqIElmIHRoZXJlIGlzIG5vIHF1ZXN0aW9uIHRvIG5hdmlnYXRlIHRvIGl0IHdpbGwgcmVqZWN0IHdpdGggYSBvdXQgb2YgYm91bmRzIGV4Y2VwdGlvbi5cbiAgICogSWYgYWxsb3dOYXZpZ2F0ZUJhY2t3YXJkcyBpcyBmYWxzZSB0aGVuIGl0IHdpbGwgcmVqZWN0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gdGhlIHF1ZXN0aW9uIGhhcyBiZWVuIG5hdmlnYXRlZCB0by5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBwcmV2UXVlc3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93TmF2aWdhdGVCYWNrd2FyZHMpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnVGhpcyBxdWVzdGlvbm5haXJlIGRvZXMgbm90IGFsbG93IGZvciBiYWNrd2FyZHMgbmF2aWdhdGlvbicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmdldEN1cnJlbnRRdWVzdGlvbkluZGV4KCkudGhlbigoY3VycmVudEluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gY3VycmVudEluZGV4IC0gMTtcblxuICAgICAgICB0aGlzLm5hdmlnYXRlVG9RdWVzdGlvbihuZXdJbmRleCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBxdWVzdGlvbnMgaW5kZXguXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyBhIG51bWJlci5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFF1ZXN0aW9uSW5kZXgoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhLnF1ZXN0aW9ucy5pbmRleE9mKHRoaXMuY3VycmVudFF1ZXN0aW9uLmRhdGEpO1xuXG4gICAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KCdDb3VsZCBub3QgZmluZCBjdXJyZW50IHF1ZXN0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlKGN1cnJlbnRJbmRleCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGEgcXVlc3Rpb24gaXMgaW4gYm91bmRzIHRoZW4gbmF2aWdhdGVzIHRvIGl0LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIG5hdmlnYXRlIHRvLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gdGhlIHF1ZXN0aW9uIGhhcyBiZWVuIG5hdmlnYXRlZCB0by5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBuYXZpZ2F0ZVRvUXVlc3Rpb24oaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhLnF1ZXN0aW9ucy5sZW5ndGggLSAxIDwgaW5kZXggfHwgaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoJ091dCBvZiBib3VuZHMgZXhjZXB0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZSA9IHRoaXMuY3VycmVudFNlY3Rpb24uZGF0YS5xdWVzdGlvbnNbaW5kZXhdLm5hbWU7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byB0aGUgbmV4dCBzZWN0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gdGhlIHNlY3Rpb24gaGFzIGJlZW4gbmF2aWdhdGVkIHRvLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIG5leHRTZWN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdldEN1cnJlbnRTZWN0aW9uSW5kZXgoKS50aGVuKChjdXJyZW50SW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICB0aGlzLm5hdmlnYXRlVG9TZWN0aW9uKG5ld0luZGV4KS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByZXZpb3VzIHNlY3Rpb24uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCB3aWxsIHJlc29sdmUgd2hlbiB0aGUgc2VjdGlvbiBoYXMgYmVlbiBuYXZpZ2F0ZWQgdG8uXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgcHJldlNlY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZ2V0Q3VycmVudFNlY3Rpb25JbmRleCgpLnRoZW4oKGN1cnJlbnRJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUb1NlY3Rpb24obmV3SW5kZXgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc2VjdGlvbiBpbmRleC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIGEgbnVtYmVyLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50U2VjdGlvbkluZGV4KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMuaW5kZXhPZih0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEpO1xuXG4gICAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KCdDb3VsZCBub3QgZmluZCBjdXJyZW50IHNlY3Rpb24nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc29sdmUoY3VycmVudEluZGV4KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgYSBzZWN0aW9uIGlzIGluIGJvdW5kcyB0aGVuIG5hdmlnYXRlcyB0byBpdC5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBuYXZpZ2F0ZSB0by5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBzZWN0aW9uIGhhcyBiZWVuIG5hdmlnYXRlZCB0by5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBuYXZpZ2F0ZVRvU2VjdGlvbihpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zLmxlbmd0aCAtIDEgPCBpbmRleCB8fCBpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnT3V0IG9mIGJvdW5kcyBleGNlcHRpb24nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXJyZW50U2VjdGlvbk5hbWUgPSB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zW2luZGV4XS5uYW1lO1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbnN3ZXJzIHRoZSBjdXJyZW50IHF1ZXN0aW9uIHdpdGggdGhlIHBhcnNlZCB2YWx1ZS5cbiAgICogQHBhcmFtIGFuc3dlciBUaGUgdmFsdWUgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbiB3aXRoLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGFuc3dlckN1cnJlbnRRdWVzdGlvbihhbnN3ZXI6IGFueSwgc2VuZFRvTmV4dFF1ZXN0aW9uPzogYm9vbGVhbikge1xuICAgIGlmICghc2VuZFRvTmV4dFF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbC5zZXRWYWx1ZShhbnN3ZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNraXBwYWJsZSkgeyAvLyBUaW1lb3V0IHRvIHByZXZlbnQgc2tpcHBpbmcgZ2xpdGNoLlxuICAgICAgdGhpcy5za2lwcGFibGUgPSBmYWxzZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbC5zZXRWYWx1ZShhbnN3ZXIpO1xuICAgICAgICB0aGlzLm5leHRRdWVzdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2tpcHBhYmxlID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9LCAxNTApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVwZWF0ZXIgaXRlbSB0byB0aGUgY3VycmVudCBxdWVzdGlvbi5cbiAgICogQ3VycmVudCBxdWVzdGlvbiBtdXN0IGJlIG9mIHR5cGUgUmVwZWF0ZXIuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSByZXBlYXRlciBpdGVtIGhhcyBiZWVuIGFkZGVkLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGFkZFJlcGVhdGVySXRlbSgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFF1ZXN0aW9uLmRhdGEudHlwZSAhPT0gUXVlc3Rpb25UeXBlLlJlcGVhdGVyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoYEN1cnJlbnQgcXVlc3Rpb24gaXNuJ3QgYSByZXBlYXRlcmApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCByZXBlYXRlckZvcm0gPSB0aGlzLmZvcm1Db25zdHVjdG9yLmdlbmVyYXRlRm9ybXNGb3JSZXBlYXRlcih0aGlzLmN1cnJlbnRRdWVzdGlvbi5kYXRhKTtcblxuICAgICAgaWYgKCFyZXBlYXRlckZvcm0pIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChgUmVwZWF0ZXIgdGVtcGxhdGUgZmFpbGVkIHRvIGdlbmVyYXRlLiBNYXkgYmUgZHVlIHRvIHRoZSByZXBlYXRlciBoYXZpbmcgbm8gaXRlbXMgaW4gdGhlIGVkaXRvci5gKTtcbiAgICAgIH1cblxuXG4gICAgICBpZiAoISh0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChgVGhlIGN1cnJlbnQgcXVlc3Rpb25zIGNvbnRyb2wgaXNuJ3Qgb2YgdHlwZSBGb3JtQXJyYXlgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wucHVzaChyZXBlYXRlckZvcm0pO1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcmVwZWF0ZXIgaXRlbSBvbiB0aGUgY3VycmVudCBxdWVzdGlvbi5cbiAgICogQ3VycmVudCBxdWVzdGlvbiBtdXN0IGJlIG9mIHR5cGUgUmVwZWF0ZXIuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcmVwZWF0ZXIgaXRlbSBoYXMgYmVlbiByZW1vdmVkLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIHJlbW92ZVJlcGVhdGVySXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbi5kYXRhLnR5cGUgIT09IFF1ZXN0aW9uVHlwZS5SZXBlYXRlcikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGBDdXJyZW50IHF1ZXN0aW9uIGlzbid0IGEgcmVwZWF0ZXJgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEodGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoYFRoZSBjdXJyZW50IHF1ZXN0aW9ucyBjb250cm9sIGlzbid0IG9mIHR5cGUgRm9ybUFycmF5YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sLnJlbW92ZUF0KGluZGV4KTtcbiAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGlzcGxheSB0ZXh0IGZvciBhIGdpdmVuIHJlcGVhdGVyIGl0ZW1cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0byBnZXQgdGhlIGxhYmVsIGZvci5cbiAgICogQHJldHVybnMgQSBzdHJpbmcgd2hpY2ggaXMgdGhlIGRpc3BsYXkgdGV4dC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBnZXRSZXBlYXRlckl0ZW1MYWJlbChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sIHx8ICEodGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwZWF0ZXJJdGVtID0gdGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wuY29udHJvbHNbaW5kZXhdO1xuXG4gICAgaWYgKCFyZXBlYXRlckl0ZW0pIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuY3VycmVudFF1ZXN0aW9uLmRhdGEucmVwZWF0ZXJEaXNwbGF5TmFtZTtcbiAgICBjb25zdCBzcGxpdFRlbXBsYXRlID0gdGVtcGxhdGUuc3BsaXQoJyAnKTtcblxuICAgIGNvbnN0IGRpc3BsYXlBcnJheSA9IFtdO1xuICAgIGZvciAoY29uc3QgdGVtcGxhdGVJdGVtIG9mIHNwbGl0VGVtcGxhdGUpIHtcbiAgICAgIGlmICh0ZW1wbGF0ZUl0ZW0ubWF0Y2goL1xcWy4qP1xcXS8pKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSB0ZW1wbGF0ZUl0ZW0ucmVwbGFjZSgvW1xcW1xcXSddKy9nLCAnJyk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSByZXBlYXRlckl0ZW0uZ2V0KHBhdGgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChpdGVtICYmIGl0ZW0udmFsdWUgPyBpdGVtLnZhbHVlIDogJz8nKTtcbiAgICAgICAgZGlzcGxheUFycmF5LnB1c2godmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGxheUFycmF5LnB1c2godGVtcGxhdGVJdGVtKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkaXNwbGF5ID0gZGlzcGxheUFycmF5LmpvaW4oJyAnKTtcbiAgICByZXR1cm4gZGlzcGxheTtcbiAgfVxufVxuIl19
563
+ /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(QuestionnaireService, [{
564
+ type: Injectable,
565
+ args: [{
566
+ providedIn: 'root'
567
+ }]
568
+ }], function () { return [{ type: i1.FormConstructorService }, { type: undefined, decorators: [{
569
+ type: Inject,
570
+ args: ['options']
571
+ }] }]; }, null); })();
572
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb25uYWlyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdsb3dncmVlbi9nZy1xdWVzdGlvbm5haXJlLXYyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3F1ZXN0aW9ubmFpcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXBFLE9BQU8sRUFBOEIsU0FBUyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFJcEYsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFFM0Q7SUFzQkUsOEJBQ1UsY0FBc0MsRUFDbkIsT0FBNkI7UUFEaEQsbUJBQWMsR0FBZCxjQUFjLENBQXdCO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBcEJuRCxxQkFBZ0IsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUM5RCx5QkFBb0IsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQWVqRSxjQUFTLEdBQUcsSUFBSSxDQUFDO0lBS3JCLENBQUM7SUFFTDs7Ozs7O09BTUc7SUFDSSxnREFBaUIsR0FBeEIsVUFBeUIsYUFBNEIsRUFBRSxVQUFtQixFQUFFLGNBQXVCO1FBQ2pHLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXZELElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBRXJDLElBQUksVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFB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S0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDdEQsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDMUI7cUJBQU07b0JBQ0wsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDakM7YUFDRjs7Ozs7Ozs7O1FBRUQsSUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOzRGQXBqQlUsb0JBQW9CLHNEQXFCckIsU0FBUztnRUFyQlIsb0JBQW9CLFdBQXBCLG9CQUFvQixtQkFGbkIsTUFBTTsrQkFacEI7Q0Fta0JDLEFBeGpCRCxJQXdqQkM7U0FyakJZLG9CQUFvQjtrREFBcEIsb0JBQW9CO2NBSGhDLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7c0JBc0JJLE1BQU07dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29uc3RydWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi9mb3JtLWNvbnN0cnVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgUXVlc3Rpb25uYWlyZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcXVlc3Rpb25uYWlyZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNlY3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3NlY3Rpb24nO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3F1ZXN0aW9uJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUXVlc3Rpb25uYWlyZU9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3F1ZXN0aW9ubmFpcmUtb3B0aW9ucyc7XG5pbXBvcnQgeyBRdWVzdGlvblR5cGUgfSBmcm9tICcuLi9lbnVtcy9xdWVzdGlvbi10eXBlLmVudW0nO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbm5haXJlU2VydmljZSB7XG4gIHB1YmxpYyBkYXRhQ2hhbmdlZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBwdWJsaWMgc2VjdGlvbkZpbmlzaGVkRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgcHJpdmF0ZSBvcmlnaW5hbFF1ZXN0aW9ubmFpcmU6IFF1ZXN0aW9ubmFpcmU7XG5cbiAgcHJpdmF0ZSBjdXJyZW50UXVlc3Rpb25uYWlyZTogUXVlc3Rpb25uYWlyZTtcbiAgcHJpdmF0ZSBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm06IEZvcm1Hcm91cDtcblxuICBwcml2YXRlIGN1cnJlbnRTZWN0aW9uTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGN1cnJlbnRRdWVzdGlvbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIHF1ZXN0aW9ubmFpcmVWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHF1ZXN0aW9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwdWJsaWMgYWRkaXRpb25hbERhdGE6IE9iamVjdDtcblxuICBwcml2YXRlIHNraXBwYWJsZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb3JtQ29uc3R1Y3RvcjogRm9ybUNvbnN0cnVjdG9yU2VydmljZSxcbiAgICBASW5qZWN0KCdvcHRpb25zJykgcHJpdmF0ZSBvcHRpb25zOiBRdWVzdGlvbm5haXJlT3B0aW9uc1xuICApIHsgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIHF1ZXN0aW9ubmFpcmUgZnJvbSBkYXRhLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25uYWlyZSBUaGUgcXVlc3Rpb25uYWlyZSBkYXRhIHRvIGxvYWQsIG9mdGVuIHBhcnNlZCBKU09OIGZyb20gdGhlIGVkaXRvci5cbiAgICogQHBhcmFtIHNhdmVkU3RhdGUgVGhlIHNhdmVkIHN0YXRlIG9mIHRoZSBxdWVzdGlvbm5haXJlLCBvZnRlbiBmcm9tIGxvY2Fsc3RvcmFnZS5cbiAgICogQHJldHVybnMgbnVsbFxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGxvYWRRdWVzdGlvbm5haXJlKHF1ZXN0aW9ubmFpcmU6IFF1ZXN0aW9ubmFpcmUsIHNhdmVkU3RhdGU/OiBPYmplY3QsIGFkZGl0aW9uYWxEYXRhPzogT2JqZWN0KSB7XG4gICAgdGhpcy5vcmlnaW5hbFF1ZXN0aW9ubmFpcmUgPSBfLmNsb25lRGVlcChxdWVzdGlvbm5haXJlKTtcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlID0gXy5jbG9uZURlZXAocXVlc3Rpb25uYWlyZSk7XG5cbiAgICB0aGlzLmFkZGl0aW9uYWxEYXRhID0gYWRkaXRpb25hbERhdGE7XG5cbiAgICBpZiAoc2F2ZWRTdGF0ZSAmJiBPYmplY3Qua2V5cyhzYXZlZFN0YXRlKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gdGhpcy5mb3JtQ29uc3R1Y3Rvci5nZW5lcmF0ZUZvcm1zRm9yUXVlc3Rpb25uYWlyZShcbiAgICAgICAgXy5jbG9uZURlZXAodGhpcy5vcmlnaW5hbFF1ZXN0aW9ubmFpcmUpLFxuICAgICAgICBfLmNsb25lRGVlcCh0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlKSxcbiAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0sXG4gICAgICAgIHRoaXMuYWRkaXRpb25hbERhdGEsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIGlmIChuZXdEYXRhKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnN0dWN0b3IuY29uc3RydWN0UmVwZWF0ZXJGcm9tc0Zyb21TdGF0ZShzYXZlZFN0YXRlLCBuZXdEYXRhLnNlY3Rpb25zLCBuZXdEYXRhLmZvcm1zKTtcbiAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0gPSBuZXdEYXRhLmZvcm1zO1xuICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS5wYXRjaFZhbHVlKHNhdmVkU3RhdGUpO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVRdWVzdGlvbm5haXJlKHNhdmVkU3RhdGUpO1xuXG5cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcFRvRmlyc3RTZWN0aW9uKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTZWN0aW9uTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmNvbnRyb2xzKVswXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNraXBUb0ZpcnN0UXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuY3VycmVudFNlY3Rpb24uZm9ybUdyb3VwLmNvbnRyb2xzKVswXTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjdXJyZW50IHF1ZXN0aW9ubmFpcmUsIHVzZWQgd2hlbiBhIHZhbHVlIGlzIHVwZGF0ZWQgdG8gY2hlY2sgY29uZGl0aW9ucy5cbiAgICogQHBhcmFtIHNhdmVkU3RhdGUgVGhlIHNhdmVkIHN0YXRlIG9mIHRoZSBxdWVzdGlvbm5haXJlLCBvZnRlbiBmcm9tIGxvY2Fsc3RvcmFnZS5cbiAgICogQHJldHVybnMgbnVsbFxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVF1ZXN0aW9ubmFpcmUoc2F2ZWRTdGF0ZT86IE9iamVjdCkge1xuICAgIGNvbnN0IG9sZExlbmd0aCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMubWFwKHggPT4geC5xdWVzdGlvbnMubGVuZ3RoKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcblxuICAgIGNvbnN0IG5ld0RhdGEgPSB0aGlzLmZvcm1Db25zdHVjdG9yLmdlbmVyYXRlRm9ybXNGb3JRdWVzdGlvbm5haXJlKFxuICAgICAgXy5jbG9uZURlZXAodGhpcy5vcmlnaW5hbFF1ZXN0aW9ubmFpcmUpLFxuICAgICAgXy5jbG9uZURlZXAodGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZSksXG4gICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSxcbiAgICAgIHRoaXMuYWRkaXRpb25hbERhdGFcbiAgICApO1xuXG4gICAgaWYgKG5ld0RhdGEpIHtcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtID0gbmV3RGF0YS5mb3JtcztcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMgPSBuZXdEYXRhLnNlY3Rpb25zO1xuICAgIH1cblxuICAgIGlmIChzYXZlZFN0YXRlICYmIE9iamVjdC5rZXlzKHNhdmVkU3RhdGUpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLnBhdGNoVmFsdWUoc2F2ZWRTdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVlc3Rpb25uYWlyZVZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9ubmFpcmVWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucXVlc3Rpb25WYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHRoaXMucXVlc3Rpb25uYWlyZVZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFDaGFuZ2VkRXZlbnQuZW1pdCgpO1xuICAgICAgdGhpcy51cGRhdGVRdWVzdGlvbm5haXJlKHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmdldFJhd1ZhbHVlKCkpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudFF1ZXN0aW9uICYmIHRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhckZpZWxkcyh0aGlzLmN1cnJlbnRRdWVzdGlvbi5kYXRhLmNsZWFyZmllbGRzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0xlbmd0aCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMubWFwKHggPT4geC5xdWVzdGlvbnMubGVuZ3RoKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcblxuICAgIGlmIChvbGRMZW5ndGggIT09IG5ld0xlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBzZWN0aW9uLnF1ZXN0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS5nZXQoW3NlY3Rpb24ubmFtZSwgcXVlc3Rpb24ubmFtZV0pO1xuICAgICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wudmFsdWUgPT09IG51bGwgJiYgcXVlc3Rpb24uZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHF1ZXN0aW9uLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUFkZGl0aW9uYWxEYXRhKHBheWxvYWQ6IGFueSkge1xuICAgIHRoaXMuYWRkaXRpb25hbERhdGEgPSBPYmplY3QuYXNzaWduKHRoaXMuYWRkaXRpb25hbERhdGEsIHBheWxvYWQpO1xuICAgIHRoaXMudXBkYXRlUXVlc3Rpb25uYWlyZSh0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS5nZXRSYXdWYWx1ZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckFkZGl0aW9uYWxEYXRhKCkge1xuICAgIHRoaXMuYWRkaXRpb25hbERhdGEgPSB7fTtcbiAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9ubmFpcmUodGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0UmF3VmFsdWUoKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLnZhbGlkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0ZpcnN0UXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTZWN0aW9uIHx8ICF0aGlzLmN1cnJlbnRRdWVzdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEucXVlc3Rpb25zLmluZGV4T2YodGhpcy5jdXJyZW50UXVlc3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIGN1cnJlbnRJbmRleCA9PT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNMYXN0UXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTZWN0aW9uIHx8ICF0aGlzLmN1cnJlbnRRdWVzdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEucXVlc3Rpb25zLmluZGV4T2YodGhpcy5jdXJyZW50UXVlc3Rpb24uZGF0YSk7XG4gICAgY29uc3QgbWF4SW5kZXggPSAgdGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhLnF1ZXN0aW9ucy5sZW5ndGggLSAxO1xuICAgIHJldHVybiBjdXJyZW50SW5kZXggPT09IG1heEluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBpc0ZpcnN0U2VjdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFNlY3Rpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zLmluZGV4T2YodGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhKTtcbiAgICByZXR1cm4gY3VycmVudEluZGV4ID09PSAwO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0xhc3RTZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jdXJyZW50U2VjdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMuaW5kZXhPZih0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEpO1xuICAgIGNvbnN0IG1heEluZGV4ID0gIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gY3VycmVudEluZGV4ID09PSBtYXhJbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBzZWN0aW9uVmFsaWQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmdldChuYW1lKS52YWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIHRoZSBmaWVsZHMgcGFyc2VkXG4gICAqIEBwYXJhbSBjbGVhcmZpZWxkcyBBbiBhcnJheSBvZiBzdHJpbmdzLCBwYXRocyB0byBjbGVhci5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgY2xlYXJGaWVsZHMoY2xlYXJmaWVsZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBpZiAoIWNsZWFyZmllbGRzIHx8IGNsZWFyZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2xlYXJmaWVsZCBvZiBjbGVhcmZpZWxkcykge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmdldChjbGVhcmZpZWxkKTtcblxuICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgY29udHJvbC5yZXNldCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvYWRzIHRoZSBjdXJyZW50IHF1ZXN0aW9ubmFpcmUuXG4gICAqIFVzZWZ1bCB3aGVuIGV4aXRpbmcgYSBxdWVzdGlvbm5haXJlIHBhZ2Ugb3IgY29tcGxldGluZyBhIHF1ZXN0aW9ubmFpcmUuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgdW5sb2FkUXVlc3Rpb25uYWlyZSgpIHtcbiAgICB0aGlzLm9yaWdpbmFsUXVlc3Rpb25uYWlyZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFNlY3Rpb25OYW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFkZGl0aW9uYWxEYXRhID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgc2VjdGlvbi5cbiAgICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNlY3Rpb24gZGF0YSBhbmQgdGhlIHJlbGF0ZWQgZm9ybSBncm91cC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFNlY3Rpb24oKTogeyBkYXRhOiBTZWN0aW9uOyBmb3JtR3JvdXA6IEZvcm1Hcm91cDsgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy5jdXJyZW50U2VjdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zLmZpbmQoKHgpID0+IHtcbiAgICAgIHJldHVybiB4Lm5hbWUgPT09IHRoaXMuY3VycmVudFNlY3Rpb25OYW1lO1xuICAgIH0pO1xuXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGZvcm1Hcm91cDogdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0KGRhdGEubmFtZSkgYXMgRm9ybUdyb3VwXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgYXZhaWFsYmxlIHNlY3Rpb25zLlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgYXZhaWFsYmxlIHNlY3Rpb25zLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGdldCBhdmFpbGFibGVTZWN0aW9ucygpOiBBcnJheTxTZWN0aW9uPiB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlIHx8ICF0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgZGF0YSBmb3IgdGhlIGVudGlyZSBxdWVzdGlvbm5haXJlLlxuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgb2YgZGF0YS5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtID8gdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0UmF3VmFsdWUoKSA6IHt9O1xuICB9XG5cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBzZWxlY3RlZCBxdWVzdGlvbi5cbiAgICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHF1ZXN0aW9uIGRhdGEgYW5kIHRoZSByZWxhdGVkIGZvcm0gY29udHJvbC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFF1ZXN0aW9uKCk6IHsgZGF0YTogUXVlc3Rpb247IGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsOyB9IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRRdWVzdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEucXVlc3Rpb25zLmZpbmQoKHgpID0+IHtcbiAgICAgIHJldHVybiB4Lm5hbWUgPT09IHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZTtcbiAgICB9KTtcblxuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmZvcm1Hcm91cC5nZXQoZGF0YS5uYW1lKSBhcyBBYnN0cmFjdENvbnRyb2w7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGZvcm1Db250cm9sOiBmb3JtQ29udHJvbFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIHRvIHRoZSBuZXh0IHF1ZXN0aW9uLlxuICAgKiBJZiB0aGVyZSBpcyBubyBxdWVzdGlvbiB0byBuYXZpZ2F0ZSB0byBpdCB3aWxsIHJlamVjdCB3aXRoIGEgb3V0IG9mIGJvdW5kcyBleGNlcHRpb24uXG4gICAqIElmIGFsbG93U2tpcFJlcXVpcmVkRmllbGQgaXMgZmFsc2UgdGhlbiBpdCB3aWxsIHJlamVjdCBpZiB0aGUgY3VycmVudCBxdWVzdGlvbiBpcyBpbnZhbGlkLlxuICAgKiBJZiBlbWl0U2VjdGlvbkZpbmlzaEV2ZW50IGlzIHRydWUgdGhlbiBpdCB3aWxsIGVtaXQgYW4gZXZlbnQgaWYgaXQncyBuYXZpZ2F0aW5nIHBhc3QgdGhlIGxlbmd0aCBvZiBxdWVzdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCB3aWxsIHJlc29sdmUgd2hlbiB0aGUgcXVlc3Rpb24gaGFzIGJlZW4gbmF2aWdhdGVkIHRvLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIG5leHRRdWVzdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWxsb3dTa2lwUmVxdWlyZWRGaWVsZCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wgJiYgIXRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sLnZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnQ3VycmVudCBxdWVzdGlvbiBpcyBpbnZhbGlkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5nZXRDdXJyZW50UXVlc3Rpb25JbmRleCgpLnRoZW4oKGN1cnJlbnRJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBsYXN0UXVlc3Rpb25JbmRleCA9IHRoaXMuY3VycmVudFNlY3Rpb24uZGF0YS5xdWVzdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgY29uc3QgaXNMYXN0UXVlc3Rpb24gPSBsYXN0UXVlc3Rpb25JbmRleCA9PT0gY3VycmVudEluZGV4O1xuXG4gICAgICAgIGlmIChpc0xhc3RRdWVzdGlvbikge1xuICAgICAgICAgIHRoaXMuc2VjdGlvbkZpbmlzaGVkRXZlbnQuZW1pdCgpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG5cbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUXVlc3Rpb24obmV3SW5kZXgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byB0aGUgcHJldmlvdXMgcXVlc3Rpb24uXG4gICAqIElmIHRoZXJlIGlzIG5vIHF1ZXN0aW9uIHRvIG5hdmlnYXRlIHRvIGl0IHdpbGwgcmVqZWN0IHdpdGggYSBvdXQgb2YgYm91bmRzIGV4Y2VwdGlvbi5cbiAgICogSWYgYWxsb3dOYXZpZ2F0ZUJhY2t3YXJkcyBpcyBmYWxzZSB0aGVuIGl0IHdpbGwgcmVqZWN0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gdGhlIHF1ZXN0aW9uIGhhcyBiZWVuIG5hdmlnYXRlZCB0by5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBwcmV2UXVlc3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93TmF2aWdhdGVCYWNrd2FyZHMpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnVGhpcyBxdWVzdGlvbm5haXJlIGRvZXMgbm90IGFsbG93IGZvciBiYWNrd2FyZHMgbmF2aWdhdGlvbicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmdldEN1cnJlbnRRdWVzdGlvbkluZGV4KCkudGhlbigoY3VycmVudEluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gY3VycmVudEluZGV4IC0gMTtcblxuICAgICAgICB0aGlzLm5hdmlnYXRlVG9RdWVzdGlvbihuZXdJbmRleCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBxdWVzdGlvbnMgaW5kZXguXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyBhIG51bWJlci5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFF1ZXN0aW9uSW5kZXgoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhLnF1ZXN0aW9ucy5pbmRleE9mKHRoaXMuY3VycmVudFF1ZXN0aW9uLmRhdGEpO1xuXG4gICAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KCdDb3VsZCBub3QgZmluZCBjdXJyZW50IHF1ZXN0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlKGN1cnJlbnRJbmRleCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGEgcXVlc3Rpb24gaXMgaW4gYm91bmRzIHRoZW4gbmF2aWdhdGVzIHRvIGl0LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIG5hdmlnYXRlIHRvLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gdGhlIHF1ZXN0aW9uIGhhcyBiZWVuIG5hdmlnYXRlZCB0by5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBuYXZpZ2F0ZVRvUXVlc3Rpb24oaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhLnF1ZXN0aW9ucy5sZW5ndGggLSAxIDwgaW5kZXggfHwgaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoJ091dCBvZiBib3VuZHMgZXhjZXB0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZSA9IHRoaXMuY3VycmVudFNlY3Rpb24uZGF0YS5xdWVzdGlvbnNbaW5kZXhdLm5hbWU7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byB0aGUgbmV4dCBzZWN0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gdGhlIHNlY3Rpb24gaGFzIGJlZW4gbmF2aWdhdGVkIHRvLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIG5leHRTZWN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdldEN1cnJlbnRTZWN0aW9uSW5kZXgoKS50aGVuKChjdXJyZW50SW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICB0aGlzLm5hdmlnYXRlVG9TZWN0aW9uKG5ld0luZGV4KS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByZXZpb3VzIHNlY3Rpb24uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCB3aWxsIHJlc29sdmUgd2hlbiB0aGUgc2VjdGlvbiBoYXMgYmVlbiBuYXZpZ2F0ZWQgdG8uXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgcHJldlNlY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZ2V0Q3VycmVudFNlY3Rpb25JbmRleCgpLnRoZW4oKGN1cnJlbnRJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUb1NlY3Rpb24obmV3SW5kZXgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc2VjdGlvbiBpbmRleC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIGEgbnVtYmVyLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50U2VjdGlvbkluZGV4KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMuaW5kZXhPZih0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEpO1xuXG4gICAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KCdDb3VsZCBub3QgZmluZCBjdXJyZW50IHNlY3Rpb24nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc29sdmUoY3VycmVudEluZGV4KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgYSBzZWN0aW9uIGlzIGluIGJvdW5kcyB0aGVuIG5hdmlnYXRlcyB0byBpdC5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBuYXZpZ2F0ZSB0by5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBzZWN0aW9uIGhhcyBiZWVuIG5hdmlnYXRlZCB0by5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBuYXZpZ2F0ZVRvU2VjdGlvbihpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zLmxlbmd0aCAtIDEgPCBpbmRleCB8fCBpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnT3V0IG9mIGJvdW5kcyBleGNlcHRpb24nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXJyZW50U2VjdGlvbk5hbWUgPSB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zW2luZGV4XS5uYW1lO1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbnN3ZXJzIHRoZSBjdXJyZW50IHF1ZXN0aW9uIHdpdGggdGhlIHBhcnNlZCB2YWx1ZS5cbiAgICogQHBhcmFtIGFuc3dlciBUaGUgdmFsdWUgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbiB3aXRoLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGFuc3dlckN1cnJlbnRRdWVzdGlvbihhbnN3ZXI6IGFueSwgc2VuZFRvTmV4dFF1ZXN0aW9uPzogYm9vbGVhbikge1xuICAgIGlmICghc2VuZFRvTmV4dFF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbC5zZXRWYWx1ZShhbnN3ZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNraXBwYWJsZSkgeyAvLyBUaW1lb3V0IHRvIHByZXZlbnQgc2tpcHBpbmcgZ2xpdGNoLlxuICAgICAgdGhpcy5za2lwcGFibGUgPSBmYWxzZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbC5zZXRWYWx1ZShhbnN3ZXIpO1xuICAgICAgICB0aGlzLm5leHRRdWVzdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2tpcHBhYmxlID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9LCAxNTApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVwZWF0ZXIgaXRlbSB0byB0aGUgY3VycmVudCBxdWVzdGlvbi5cbiAgICogQ3VycmVudCBxdWVzdGlvbiBtdXN0IGJlIG9mIHR5cGUgUmVwZWF0ZXIuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSByZXBlYXRlciBpdGVtIGhhcyBiZWVuIGFkZGVkLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGFkZFJlcGVhdGVySXRlbSgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFF1ZXN0aW9uLmRhdGEudHlwZSAhPT0gUXVlc3Rpb25UeXBlLlJlcGVhdGVyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoYEN1cnJlbnQgcXVlc3Rpb24gaXNuJ3QgYSByZXBlYXRlcmApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCByZXBlYXRlckZvcm0gPSB0aGlzLmZvcm1Db25zdHVjdG9yLmdlbmVyYXRlRm9ybXNGb3JSZXBlYXRlcih0aGlzLmN1cnJlbnRRdWVzdGlvbi5kYXRhKTtcblxuICAgICAgaWYgKCFyZXBlYXRlckZvcm0pIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChgUmVwZWF0ZXIgdGVtcGxhdGUgZmFpbGVkIHRvIGdlbmVyYXRlLiBNYXkgYmUgZHVlIHRvIHRoZSByZXBlYXRlciBoYXZpbmcgbm8gaXRlbXMgaW4gdGhlIGVkaXRvci5gKTtcbiAgICAgIH1cblxuXG4gICAgICBpZiAoISh0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChgVGhlIGN1cnJlbnQgcXVlc3Rpb25zIGNvbnRyb2wgaXNuJ3Qgb2YgdHlwZSBGb3JtQXJyYXlgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wucHVzaChyZXBlYXRlckZvcm0pO1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcmVwZWF0ZXIgaXRlbSBvbiB0aGUgY3VycmVudCBxdWVzdGlvbi5cbiAgICogQ3VycmVudCBxdWVzdGlvbiBtdXN0IGJlIG9mIHR5cGUgUmVwZWF0ZXIuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcmVwZWF0ZXIgaXRlbSBoYXMgYmVlbiByZW1vdmVkLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIHJlbW92ZVJlcGVhdGVySXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbi5kYXRhLnR5cGUgIT09IFF1ZXN0aW9uVHlwZS5SZXBlYXRlcikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGBDdXJyZW50IHF1ZXN0aW9uIGlzbid0IGEgcmVwZWF0ZXJgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEodGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoYFRoZSBjdXJyZW50IHF1ZXN0aW9ucyBjb250cm9sIGlzbid0IG9mIHR5cGUgRm9ybUFycmF5YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sLnJlbW92ZUF0KGluZGV4KTtcbiAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGlzcGxheSB0ZXh0IGZvciBhIGdpdmVuIHJlcGVhdGVyIGl0ZW1cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0byBnZXQgdGhlIGxhYmVsIGZvci5cbiAgICogQHJldHVybnMgQSBzdHJpbmcgd2hpY2ggaXMgdGhlIGRpc3BsYXkgdGV4dC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBnZXRSZXBlYXRlckl0ZW1MYWJlbChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sIHx8ICEodGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwZWF0ZXJJdGVtID0gdGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wuY29udHJvbHNbaW5kZXhdO1xuXG4gICAgaWYgKCFyZXBlYXRlckl0ZW0pIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuY3VycmVudFF1ZXN0aW9uLmRhdGEucmVwZWF0ZXJEaXNwbGF5TmFtZTtcbiAgICBjb25zdCBzcGxpdFRlbXBsYXRlID0gdGVtcGxhdGUuc3BsaXQoJyAnKTtcblxuICAgIGNvbnN0IGRpc3BsYXlBcnJheSA9IFtdO1xuICAgIGZvciAoY29uc3QgdGVtcGxhdGVJdGVtIG9mIHNwbGl0VGVtcGxhdGUpIHtcbiAgICAgIGlmICh0ZW1wbGF0ZUl0ZW0ubWF0Y2goL1xcWy4qP1xcXS8pKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSB0ZW1wbGF0ZUl0ZW0ucmVwbGFjZSgvW1xcW1xcXSddKy9nLCAnJyk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSByZXBlYXRlckl0ZW0uZ2V0KHBhdGgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChpdGVtICYmIGl0ZW0udmFsdWUgPyBpdGVtLnZhbHVlIDogJz8nKTtcbiAgICAgICAgZGlzcGxheUFycmF5LnB1c2godmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGxheUFycmF5LnB1c2godGVtcGxhdGVJdGVtKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkaXNwbGF5ID0gZGlzcGxheUFycmF5LmpvaW4oJyAnKTtcbiAgICByZXR1cm4gZGlzcGxheTtcbiAgfVxufVxuIl19