@glowgreen/gg-questionnaire-v2 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/bundles/glowgreen-gg-questionnaire-v2.umd.js +2102 -0
  2. package/bundles/glowgreen-gg-questionnaire-v2.umd.js.map +1 -0
  3. package/bundles/glowgreen-gg-questionnaire-v2.umd.min.js +2 -0
  4. package/bundles/glowgreen-gg-questionnaire-v2.umd.min.js.map +1 -0
  5. package/esm2015/glowgreen-gg-questionnaire-v2.js +11 -0
  6. package/esm2015/lib/enums/condition-relationship.enum.js +11 -0
  7. package/esm2015/lib/enums/condition-type.enum.js +15 -0
  8. package/esm2015/lib/enums/input-type.enum.js +20 -0
  9. package/esm2015/lib/enums/question-type.enum.js +17 -0
  10. package/esm2015/lib/enums/repeater-question-type.enum.js +11 -0
  11. package/esm2015/lib/enums/validation-type.enum.js +15 -0
  12. package/esm2015/lib/gg-questionnaire-v2.module.js +41 -0
  13. package/esm2015/lib/interfaces/attachment.js +15 -0
  14. package/esm2015/lib/interfaces/checklist-item.js +15 -0
  15. package/esm2015/lib/interfaces/condition-group.js +15 -0
  16. package/esm2015/lib/interfaces/condition.js +17 -0
  17. package/esm2015/lib/interfaces/question.js +41 -0
  18. package/esm2015/lib/interfaces/questionnaire-options.js +21 -0
  19. package/esm2015/lib/interfaces/questionnaire.js +15 -0
  20. package/esm2015/lib/interfaces/repeater-question.js +27 -0
  21. package/esm2015/lib/interfaces/section.js +19 -0
  22. package/esm2015/lib/interfaces/select-option.js +15 -0
  23. package/esm2015/lib/interfaces/validator.js +15 -0
  24. package/esm2015/lib/services/filter.service.js +258 -0
  25. package/esm2015/lib/services/form-constructor.service.js +245 -0
  26. package/esm2015/lib/services/questionnaire.service.js +644 -0
  27. package/esm2015/public_api.js +16 -0
  28. package/esm5/glowgreen-gg-questionnaire-v2.js +11 -0
  29. package/esm5/lib/enums/condition-relationship.enum.js +11 -0
  30. package/esm5/lib/enums/condition-type.enum.js +15 -0
  31. package/esm5/lib/enums/input-type.enum.js +20 -0
  32. package/esm5/lib/enums/question-type.enum.js +17 -0
  33. package/esm5/lib/enums/repeater-question-type.enum.js +11 -0
  34. package/esm5/lib/enums/validation-type.enum.js +15 -0
  35. package/esm5/lib/gg-questionnaire-v2.module.js +49 -0
  36. package/esm5/lib/interfaces/attachment.js +15 -0
  37. package/esm5/lib/interfaces/checklist-item.js +15 -0
  38. package/esm5/lib/interfaces/condition-group.js +15 -0
  39. package/esm5/lib/interfaces/condition.js +17 -0
  40. package/esm5/lib/interfaces/question.js +41 -0
  41. package/esm5/lib/interfaces/questionnaire-options.js +21 -0
  42. package/esm5/lib/interfaces/questionnaire.js +15 -0
  43. package/esm5/lib/interfaces/repeater-question.js +27 -0
  44. package/esm5/lib/interfaces/section.js +19 -0
  45. package/esm5/lib/interfaces/select-option.js +15 -0
  46. package/esm5/lib/interfaces/validator.js +15 -0
  47. package/esm5/lib/services/filter.service.js +445 -0
  48. package/esm5/lib/services/form-constructor.service.js +460 -0
  49. package/esm5/lib/services/questionnaire.service.js +943 -0
  50. package/esm5/public_api.js +16 -0
  51. package/fesm2015/glowgreen-gg-questionnaire-v2.js +1194 -0
  52. package/fesm2015/glowgreen-gg-questionnaire-v2.js.map +1 -0
  53. package/fesm5/glowgreen-gg-questionnaire-v2.js +1897 -0
  54. package/fesm5/glowgreen-gg-questionnaire-v2.js.map +1 -0
  55. package/glowgreen-gg-questionnaire-v2.d.ts +6 -0
  56. package/glowgreen-gg-questionnaire-v2.metadata.json +1 -0
  57. package/lib/enums/condition-relationship.enum.d.ts +4 -0
  58. package/lib/enums/condition-type.enum.d.ts +8 -0
  59. package/lib/enums/input-type.enum.d.ts +13 -0
  60. package/lib/enums/question-type.enum.d.ts +10 -0
  61. package/lib/enums/repeater-question-type.enum.d.ts +4 -0
  62. package/lib/enums/validation-type.enum.d.ts +8 -0
  63. package/lib/gg-questionnaire-v2.module.d.ts +5 -0
  64. package/lib/interfaces/attachment.d.ts +4 -0
  65. package/lib/interfaces/checklist-item.d.ts +4 -0
  66. package/lib/interfaces/condition-group.d.ts +6 -0
  67. package/lib/interfaces/condition.d.ts +6 -0
  68. package/lib/interfaces/question.d.ts +24 -0
  69. package/lib/interfaces/questionnaire-options.d.ts +7 -0
  70. package/lib/interfaces/questionnaire.d.ts +5 -0
  71. package/lib/interfaces/repeater-question.d.ts +15 -0
  72. package/lib/interfaces/section.d.ts +8 -0
  73. package/lib/interfaces/select-option.d.ts +4 -0
  74. package/lib/interfaces/validator.d.ts +5 -0
  75. package/lib/services/filter.service.d.ts +62 -0
  76. package/lib/services/form-constructor.service.d.ts +78 -0
  77. package/lib/services/questionnaire.service.d.ts +163 -0
  78. package/package.json +21 -0
  79. package/public_api.d.ts +17 -0
@@ -0,0 +1,445 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ import { Injectable } from '@angular/core';
7
+ import { ConditionType } from '../enums/condition-type.enum';
8
+ import { ConditionRelationship } from '../enums/condition-relationship.enum';
9
+ import * as i0 from "@angular/core";
10
+ var FilterService = /** @class */ (function () {
11
+ function FilterService() {
12
+ }
13
+ /**
14
+ * Filters an array of sections based on their condition groups.
15
+ * @param sections The array of sections to filter.
16
+ * @param currentQuestionnaireForm The current form data, can be null/undefined.
17
+ * @returns An array of filtered sections with their filtered questions.
18
+ * @author Will Poulson
19
+ */
20
+ /**
21
+ * Filters an array of sections based on their condition groups.
22
+ * @author Will Poulson
23
+ * @param {?} sections The array of sections to filter.
24
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
25
+ * @return {?} An array of filtered sections with their filtered questions.
26
+ */
27
+ FilterService.prototype.filterSections = /**
28
+ * Filters an array of sections based on their condition groups.
29
+ * @author Will Poulson
30
+ * @param {?} sections The array of sections to filter.
31
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
32
+ * @return {?} An array of filtered sections with their filtered questions.
33
+ */
34
+ function (sections, currentQuestionnaireForm) {
35
+ var e_1, _a, e_2, _b, e_3, _c;
36
+ /** @type {?} */
37
+ var filteredSections = [];
38
+ try {
39
+ for (var sections_1 = tslib_1.__values(sections), sections_1_1 = sections_1.next(); !sections_1_1.done; sections_1_1 = sections_1.next()) {
40
+ var section = sections_1_1.value;
41
+ if (this.meetsConditionGroups(section.conditionGroups, currentQuestionnaireForm)) {
42
+ /** @type {?} */
43
+ var filteredQuestions = [];
44
+ try {
45
+ for (var _d = tslib_1.__values(section.questions), _e = _d.next(); !_e.done; _e = _d.next()) {
46
+ var question = _e.value;
47
+ if (this.meetsConditionGroups(question.conditionGroups, currentQuestionnaireForm)) {
48
+ if (question.repeaterQuestions) {
49
+ /** @type {?} */
50
+ var filteredRepeaterQuestions = [];
51
+ try {
52
+ for (var _f = tslib_1.__values(question.repeaterQuestions), _g = _f.next(); !_g.done; _g = _f.next()) {
53
+ var repeaterQuestion = _g.value;
54
+ if (this.meetsConditionGroups(repeaterQuestion.conditionGroups, currentQuestionnaireForm)) {
55
+ filteredRepeaterQuestions.push(repeaterQuestion);
56
+ }
57
+ }
58
+ }
59
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
60
+ finally {
61
+ try {
62
+ if (_g && !_g.done && (_c = _f.return)) _c.call(_f);
63
+ }
64
+ finally { if (e_3) throw e_3.error; }
65
+ }
66
+ }
67
+ filteredQuestions.push(question);
68
+ }
69
+ }
70
+ }
71
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
72
+ finally {
73
+ try {
74
+ if (_e && !_e.done && (_b = _d.return)) _b.call(_d);
75
+ }
76
+ finally { if (e_2) throw e_2.error; }
77
+ }
78
+ section.questions = filteredQuestions;
79
+ filteredSections.push(section);
80
+ }
81
+ }
82
+ }
83
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
84
+ finally {
85
+ try {
86
+ if (sections_1_1 && !sections_1_1.done && (_a = sections_1.return)) _a.call(sections_1);
87
+ }
88
+ finally { if (e_1) throw e_1.error; }
89
+ }
90
+ return filteredSections;
91
+ };
92
+ /**
93
+ * Checks if each condition groups conditions have been met.
94
+ * @param conditionGroups The array of condition groups.
95
+ * @param currentQuestionnaireForm The current form data, can be null/undefined.
96
+ * @returns A boolean stating if the condition groups conditions has been met.
97
+ * @author Will Poulson
98
+ */
99
+ /**
100
+ * Checks if each condition groups conditions have been met.
101
+ * @author Will Poulson
102
+ * @private
103
+ * @param {?} conditionGroups The array of condition groups.
104
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
105
+ * @return {?} A boolean stating if the condition groups conditions has been met.
106
+ */
107
+ FilterService.prototype.meetsConditionGroups = /**
108
+ * Checks if each condition groups conditions have been met.
109
+ * @author Will Poulson
110
+ * @private
111
+ * @param {?} conditionGroups The array of condition groups.
112
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
113
+ * @return {?} A boolean stating if the condition groups conditions has been met.
114
+ */
115
+ function (conditionGroups, currentQuestionnaireForm) {
116
+ var _this = this;
117
+ if (!conditionGroups || conditionGroups.length === 0) {
118
+ return true;
119
+ }
120
+ return conditionGroups.every((/**
121
+ * @param {?} x
122
+ * @return {?}
123
+ */
124
+ function (x) {
125
+ return _this.meetsConditionGroup(x, currentQuestionnaireForm) === true;
126
+ }));
127
+ };
128
+ /**
129
+ * Checks if a condition groups conditions have been met.
130
+ * @param conditionGroup The condition group to check.
131
+ * @param currentQuestionnaireForm The current form data, can be null/undefined.
132
+ * @returns A boolean stating if the condition group conditions has been met.
133
+ * @author Will Poulson
134
+ */
135
+ /**
136
+ * Checks if a condition groups conditions have been met.
137
+ * @author Will Poulson
138
+ * @private
139
+ * @param {?} conditionGroup The condition group to check.
140
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
141
+ * @return {?} A boolean stating if the condition group conditions has been met.
142
+ */
143
+ FilterService.prototype.meetsConditionGroup = /**
144
+ * Checks if a condition groups conditions have been met.
145
+ * @author Will Poulson
146
+ * @private
147
+ * @param {?} conditionGroup The condition group to check.
148
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
149
+ * @return {?} A boolean stating if the condition group conditions has been met.
150
+ */
151
+ function (conditionGroup, currentQuestionnaireForm) {
152
+ var e_4, _a;
153
+ if (!conditionGroup.conditions || conditionGroup.conditions.length === 0) {
154
+ return true;
155
+ }
156
+ /** @type {?} */
157
+ var results = [];
158
+ try {
159
+ for (var _b = tslib_1.__values(conditionGroup.conditions), _c = _b.next(); !_c.done; _c = _b.next()) {
160
+ var condition = _c.value;
161
+ results.push(this.meetsCondition(condition, currentQuestionnaireForm));
162
+ }
163
+ }
164
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
165
+ finally {
166
+ try {
167
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
168
+ }
169
+ finally { if (e_4) throw e_4.error; }
170
+ }
171
+ switch (conditionGroup.relationship) {
172
+ case ConditionRelationship.Every:
173
+ return results.every((/**
174
+ * @param {?} x
175
+ * @return {?}
176
+ */
177
+ function (x) {
178
+ return x === true;
179
+ }));
180
+ case ConditionRelationship.Any:
181
+ return !!results.find((/**
182
+ * @param {?} x
183
+ * @return {?}
184
+ */
185
+ function (x) {
186
+ return x === true;
187
+ }));
188
+ default:
189
+ return true;
190
+ }
191
+ };
192
+ /**
193
+ * Checks if a condition has been met.
194
+ * @param condition The condition to check.
195
+ * @param currentQuestionnaireForm The current form data, can be null/undefined.
196
+ * @returns A boolean stating if the condition group conditions has been met.
197
+ * @author Will Poulson
198
+ */
199
+ /**
200
+ * Checks if a condition has been met.
201
+ * @author Will Poulson
202
+ * @private
203
+ * @param {?} condition The condition to check.
204
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
205
+ * @return {?} A boolean stating if the condition group conditions has been met.
206
+ */
207
+ FilterService.prototype.meetsCondition = /**
208
+ * Checks if a condition has been met.
209
+ * @author Will Poulson
210
+ * @private
211
+ * @param {?} condition The condition to check.
212
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
213
+ * @return {?} A boolean stating if the condition group conditions has been met.
214
+ */
215
+ function (condition, currentQuestionnaireForm) {
216
+ var e_5, _a, e_6, _b;
217
+ /** @type {?} */
218
+ var v1s = this.getValuesForArray(condition.v1s, currentQuestionnaireForm);
219
+ /** @type {?} */
220
+ var v2s = this.getValuesForArray(condition.v2s, currentQuestionnaireForm);
221
+ /** @type {?} */
222
+ var result = false;
223
+ switch (condition.type) {
224
+ case ConditionType.Excludes:
225
+ result = v1s.filter((/**
226
+ * @param {?} v1
227
+ * @return {?}
228
+ */
229
+ function (v1) {
230
+ return v2s.indexOf(v1) > -1;
231
+ })).length === 0;
232
+ break;
233
+ case ConditionType.Includes:
234
+ result = v1s.filter((/**
235
+ * @param {?} v1
236
+ * @return {?}
237
+ */
238
+ function (v1) {
239
+ return v2s.indexOf(v1) > -1;
240
+ })).length !== 0;
241
+ break;
242
+ default: try {
243
+ for (var v2s_1 = tslib_1.__values(v2s), v2s_1_1 = v2s_1.next(); !v2s_1_1.done; v2s_1_1 = v2s_1.next()) {
244
+ var v2 = v2s_1_1.value;
245
+ try {
246
+ for (var v1s_1 = tslib_1.__values(v1s), v1s_1_1 = v1s_1.next(); !v1s_1_1.done; v1s_1_1 = v1s_1.next()) {
247
+ var v1 = v1s_1_1.value;
248
+ switch (condition.type) {
249
+ case ConditionType.EqualTo:
250
+ v1 = this.getStringForValue(v1);
251
+ v2 = this.getStringForValue(v2);
252
+ if (v1 === v2) {
253
+ result = true;
254
+ }
255
+ break;
256
+ case ConditionType.NotEqualTo:
257
+ v1 = this.getStringForValue(v1);
258
+ v2 = this.getStringForValue(v2);
259
+ if (v1 !== v2) {
260
+ result = true;
261
+ }
262
+ break;
263
+ case ConditionType.GreaterThan:
264
+ v1 = parseFloat(v1);
265
+ v2 = parseFloat(v2);
266
+ if (v1 >= v2) {
267
+ result = true;
268
+ }
269
+ break;
270
+ case ConditionType.LessThan:
271
+ v1 = parseFloat(v1);
272
+ v2 = parseFloat(v2);
273
+ if (v1 <= v2) {
274
+ result = true;
275
+ }
276
+ break;
277
+ }
278
+ }
279
+ }
280
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
281
+ finally {
282
+ try {
283
+ if (v1s_1_1 && !v1s_1_1.done && (_b = v1s_1.return)) _b.call(v1s_1);
284
+ }
285
+ finally { if (e_6) throw e_6.error; }
286
+ }
287
+ }
288
+ }
289
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
290
+ finally {
291
+ try {
292
+ if (v2s_1_1 && !v2s_1_1.done && (_a = v2s_1.return)) _a.call(v2s_1);
293
+ }
294
+ finally { if (e_5) throw e_5.error; }
295
+ }
296
+ }
297
+ return result;
298
+ };
299
+ /**
300
+ * @private
301
+ * @param {?} value
302
+ * @return {?}
303
+ */
304
+ FilterService.prototype.getStringForValue = /**
305
+ * @private
306
+ * @param {?} value
307
+ * @return {?}
308
+ */
309
+ function (value) {
310
+ switch (value) {
311
+ case null:
312
+ return 'null';
313
+ default:
314
+ return value.toString();
315
+ }
316
+ };
317
+ /**
318
+ * Gets the current values for an array of strings.
319
+ * @param paths The array of strings to check.
320
+ * @param currentQuestionnaireForm The current form data, can be null/undefined.
321
+ * @returns An array of strings/values
322
+ * @author Will Poulson
323
+ */
324
+ /**
325
+ * Gets the current values for an array of strings.
326
+ * @author Will Poulson
327
+ * @private
328
+ * @param {?} paths The array of strings to check.
329
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
330
+ * @return {?} An array of strings/values
331
+ */
332
+ FilterService.prototype.getValuesForArray = /**
333
+ * Gets the current values for an array of strings.
334
+ * @author Will Poulson
335
+ * @private
336
+ * @param {?} paths The array of strings to check.
337
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
338
+ * @return {?} An array of strings/values
339
+ */
340
+ function (paths, currentQuestionnaireForm) {
341
+ var e_7, _a;
342
+ if (currentQuestionnaireForm) {
343
+ /** @type {?} */
344
+ var values = [];
345
+ try {
346
+ for (var paths_1 = tslib_1.__values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {
347
+ var path = paths_1_1.value;
348
+ /** @type {?} */
349
+ var value = this.getValueForString(path, currentQuestionnaireForm);
350
+ values.push(value);
351
+ }
352
+ }
353
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
354
+ finally {
355
+ try {
356
+ if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);
357
+ }
358
+ finally { if (e_7) throw e_7.error; }
359
+ }
360
+ return values;
361
+ }
362
+ else {
363
+ return paths;
364
+ }
365
+ };
366
+ /**
367
+ * Gets a current value for a string.
368
+ * @param path The string value to check.
369
+ * @param currentQuestionnaireForm The current form data, can be null/undefined.
370
+ * @returns A string/value.
371
+ * @author Will Poulson
372
+ */
373
+ /**
374
+ * Gets a current value for a string.
375
+ * @author Will Poulson
376
+ * @private
377
+ * @param {?} path The string value to check.
378
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
379
+ * @return {?} A string/value.
380
+ */
381
+ FilterService.prototype.getValueForString = /**
382
+ * Gets a current value for a string.
383
+ * @author Will Poulson
384
+ * @private
385
+ * @param {?} path The string value to check.
386
+ * @param {?} currentQuestionnaireForm The current form data, can be null/undefined.
387
+ * @return {?} A string/value.
388
+ */
389
+ function (path, currentQuestionnaireForm) {
390
+ if (currentQuestionnaireForm) {
391
+ /** @type {?} */
392
+ var control = currentQuestionnaireForm.get(path);
393
+ return control ? control.value : this.convertStringToValue(path);
394
+ }
395
+ else {
396
+ return this.convertStringToValue(path);
397
+ }
398
+ };
399
+ /**
400
+ * Converts a string to a value.
401
+ * Eg. true/false.
402
+ * @param path The string value to check for conversion;
403
+ * @returns Either a string or the converted value.
404
+ * @author Will Poulson
405
+ */
406
+ /**
407
+ * Converts a string to a value.
408
+ * Eg. true/false.
409
+ * @author Will Poulson
410
+ * @private
411
+ * @param {?} path The string value to check for conversion;
412
+ * @return {?} Either a string or the converted value.
413
+ */
414
+ FilterService.prototype.convertStringToValue = /**
415
+ * Converts a string to a value.
416
+ * Eg. true/false.
417
+ * @author Will Poulson
418
+ * @private
419
+ * @param {?} path The string value to check for conversion;
420
+ * @return {?} Either a string or the converted value.
421
+ */
422
+ function (path) {
423
+ switch (path) {
424
+ case 'true':
425
+ return true;
426
+ case 'false':
427
+ return false;
428
+ case 'null':
429
+ return null;
430
+ default:
431
+ return path;
432
+ }
433
+ };
434
+ FilterService.decorators = [
435
+ { type: Injectable, args: [{
436
+ providedIn: 'root'
437
+ },] }
438
+ ];
439
+ /** @nocollapse */
440
+ FilterService.ctorParameters = function () { return []; };
441
+ /** @nocollapse */ FilterService.ngInjectableDef = i0.defineInjectable({ factory: function FilterService_Factory() { return new FilterService(); }, token: FilterService, providedIn: "root" });
442
+ return FilterService;
443
+ }());
444
+ export { FilterService };
445
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZ2xvd2dyZWVuL2dnLXF1ZXN0aW9ubmFpcmUtdjIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7QUFFN0U7SUFLRTtJQUFnQixDQUFDO0lBRWpCOzs7Ozs7T0FNRzs7Ozs7Ozs7SUFDSSxzQ0FBYzs7Ozs7OztJQUFyQixVQUFzQixRQUF3QixFQUFFLHdCQUEwQzs7O1lBQ2xGLGdCQUFnQixHQUFHLEVBQUU7O1lBQzNCLEtBQXNCLElBQUEsYUFBQSxpQkFBQSxRQUFRLENBQUEsa0NBQUEsd0RBQUU7Z0JBQTNCLElBQU0sT0FBTyxxQkFBQTtnQkFDaEIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFOzt3QkFDMUUsaUJBQWlCLEdBQUcsRUFBRTs7d0JBQzVCLEtBQXVCLElBQUEsS0FBQSxpQkFBQSxPQUFPLENBQUMsU0FBUyxDQUFBLGdCQUFBLDRCQUFFOzRCQUFyQyxJQUFNLFFBQVEsV0FBQTs0QkFDakIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFO2dDQUVqRixJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTs7d0NBQ3hCLHlCQUF5QixHQUFHLEVBQUU7O3dDQUNwQyxLQUErQixJQUFBLEtBQUEsaUJBQUEsUUFBUSxDQUFDLGlCQUFpQixDQUFBLGdCQUFBLDRCQUFFOzRDQUF0RCxJQUFNLGdCQUFnQixXQUFBOzRDQUN6QixJQUFJLElBQUks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Ozs7Ozs7SUFDSyx5Q0FBaUI7Ozs7Ozs7O0lBQXpCLFVBQTBCLElBQVksRUFBRSx3QkFBbUM7UUFDekUsSUFBSSx3QkFBd0IsRUFBRTs7Z0JBQ3RCLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ2xELE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEU7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRzs7Ozs7Ozs7O0lBQ0ssNENBQW9COzs7Ozs7OztJQUE1QixVQUE2QixJQUFZO1FBQ3ZDLFFBQVEsSUFBSSxFQUFFO1lBQ1osS0FBSyxNQUFNO2dCQUNULE9BQU8sSUFBSSxDQUFDO1lBQ2QsS0FBSyxPQUFPO2dCQUNWLE9BQU8sS0FBSyxDQUFDO1lBQ2YsS0FBSyxNQUFNO2dCQUNULE9BQU8sSUFBSSxDQUFDO1lBQ2Q7Z0JBQ0UsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNILENBQUM7O2dCQWhORixVQUFVLFNBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzs7Ozt3QkFWRDtDQXlOQyxBQWpORCxJQWlOQztTQTlNWSxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2VjdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2VjdGlvbic7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmRpdGlvbic7XG5pbXBvcnQgeyBDb25kaXRpb25Hcm91cCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZGl0aW9uLWdyb3VwJztcbmltcG9ydCB7IENvbmRpdGlvblR5cGUgfSBmcm9tICcuLi9lbnVtcy9jb25kaXRpb24tdHlwZS5lbnVtJztcbmltcG9ydCB7IENvbmRpdGlvblJlbGF0aW9uc2hpcCB9IGZyb20gJy4uL2VudW1zL2NvbmRpdGlvbi1yZWxhdGlvbnNoaXAuZW51bSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEZpbHRlclNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYW4gYXJyYXkgb2Ygc2VjdGlvbnMgYmFzZWQgb24gdGhlaXIgY29uZGl0aW9uIGdyb3Vwcy5cbiAgICogQHBhcmFtIHNlY3Rpb25zIFRoZSBhcnJheSBvZiBzZWN0aW9ucyB0byBmaWx0ZXIuXG4gICAqIEBwYXJhbSBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0gVGhlIGN1cnJlbnQgZm9ybSBkYXRhLCBjYW4gYmUgbnVsbC91bmRlZmluZWQuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGZpbHRlcmVkIHNlY3Rpb25zIHdpdGggdGhlaXIgZmlsdGVyZWQgcXVlc3Rpb25zLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGZpbHRlclNlY3Rpb25zKHNlY3Rpb25zOiBBcnJheTxTZWN0aW9uPiwgY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtOiBGb3JtR3JvdXAgfCBudWxsKTogQXJyYXk8U2VjdGlvbj4ge1xuICAgIGNvbnN0IGZpbHRlcmVkU2VjdGlvbnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLm1lZXRzQ29uZGl0aW9uR3JvdXBzKHNlY3Rpb24uY29uZGl0aW9uR3JvdXBzLCBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0pKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkUXVlc3Rpb25zID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcXVlc3Rpb24gb2Ygc2VjdGlvbi5xdWVzdGlvbnMpIHtcbiAgICAgICAgICBpZiAodGhpcy5tZWV0c0NvbmRpdGlvbkdyb3VwcyhxdWVzdGlvbi5jb25kaXRpb25Hcm91cHMsIGN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSkpIHtcblxuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLnJlcGVhdGVyUXVlc3Rpb25zKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUmVwZWF0ZXJRdWVzdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCByZXBlYXRlclF1ZXN0aW9uIG9mIHF1ZXN0aW9uLnJlcGVhdGVyUXVlc3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWVldHNDb25kaXRpb25Hcm91cHMocmVwZWF0ZXJRdWVzdGlvbi5jb25kaXRpb25Hcm91cHMsIGN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbHRlcmVkUmVwZWF0ZXJRdWVzdGlvbnMucHVzaChyZXBlYXRlclF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsdGVyZWRRdWVzdGlvbnMucHVzaChxdWVzdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNlY3Rpb24ucXVlc3Rpb25zID0gZmlsdGVyZWRRdWVzdGlvbnM7XG4gICAgICAgIGZpbHRlcmVkU2VjdGlvbnMucHVzaChzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkU2VjdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGVhY2ggY29uZGl0aW9uIGdyb3VwcyBjb25kaXRpb25zIGhhdmUgYmVlbiBtZXQuXG4gICAqIEBwYXJhbSBjb25kaXRpb25Hcm91cHMgVGhlIGFycmF5IG9mIGNvbmRpdGlvbiBncm91cHMuXG4gICAqIEBwYXJhbSBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0gVGhlIGN1cnJlbnQgZm9ybSBkYXRhLCBjYW4gYmUgbnVsbC91bmRlZmluZWQuXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiBzdGF0aW5nIGlmIHRoZSBjb25kaXRpb24gZ3JvdXBzIGNvbmRpdGlvbnMgaGFzIGJlZW4gbWV0LlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHJpdmF0ZSBtZWV0c0NvbmRpdGlvbkdyb3Vwcyhjb25kaXRpb25Hcm91cHM6IEFycmF5PENvbmRpdGlvbkdyb3VwPiwgY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtOiBGb3JtR3JvdXAgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb25kaXRpb25Hcm91cHMgfHwgY29uZGl0aW9uR3JvdXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBjb25kaXRpb25Hcm91cHMuZXZlcnkoKHgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLm1lZXRzQ29uZGl0aW9uR3JvdXAoeCwgY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtKSA9PT0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBjb25kaXRpb24gZ3JvdXBzIGNvbmRpdGlvbnMgaGF2ZSBiZWVuIG1ldC5cbiAgICogQHBhcmFtIGNvbmRpdGlvbkdyb3VwIFRoZSBjb25kaXRpb24gZ3JvdXAgdG8gY2hlY2suXG4gICAqIEBwYXJhbSBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0gVGhlIGN1cnJlbnQgZm9ybSBkYXRhLCBjYW4gYmUgbnVsbC91bmRlZmluZWQuXG4gICAqIEByZXR1cm5zIEEgYm9vbGVhbiBzdGF0aW5nIGlmIHRoZSBjb25kaXRpb24gZ3JvdXAgY29uZGl0aW9ucyBoYXMgYmVlbiBtZXQuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwcml2YXRlIG1lZXRzQ29uZGl0aW9uR3JvdXAoY29uZGl0aW9uR3JvdXA6IENvbmRpdGlvbkdyb3VwLCBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm06IEZvcm1Hcm91cCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbmRpdGlvbkdyb3VwLmNvbmRpdGlvbnMgfHwgY29uZGl0aW9uR3JvdXAuY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbkdyb3VwLmNvbmRpdGlvbnMpIHtcbiAgICAgIHJlc3VsdHMucHVzaCh0aGlzLm1lZXRzQ29uZGl0aW9uKGNvbmRpdGlvbiwgY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtKSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb25kaXRpb25Hcm91cC5yZWxhdGlvbnNoaXApIHtcbiAgICAgIGNhc2UgQ29uZGl0aW9uUmVsYXRpb25zaGlwLkV2ZXJ5OlxuICAgICAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgoeCkgPT4ge1xuICAgICAgICAgIHJldHVybiB4ID09PSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgQ29uZGl0aW9uUmVsYXRpb25zaGlwLkFueTpcbiAgICAgICAgcmV0dXJuICEhcmVzdWx0cy5maW5kKCh4KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHggPT09IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuXG4gICAqIEBwYXJhbSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0byBjaGVjay5cbiAgICogQHBhcmFtIGN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSBUaGUgY3VycmVudCBmb3JtIGRhdGEsIGNhbiBiZSBudWxsL3VuZGVmaW5lZC5cbiAgICogQHJldHVybnMgQSBib29sZWFuIHN0YXRpbmcgaWYgdGhlIGNvbmRpdGlvbiBncm91cCBjb25kaXRpb25zIGhhcyBiZWVuIG1ldC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgbWVldHNDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb24sIGN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdjFzOiBBcnJheTxhbnk+ID0gdGhpcy5nZXRWYWx1ZXNGb3JBcnJheShjb25kaXRpb24udjFzLCBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0pO1xuICAgIGNvbnN0IHYyczogQXJyYXk8YW55PiA9IHRoaXMuZ2V0VmFsdWVzRm9yQXJyYXkoY29uZGl0aW9uLnYycywgY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtKTtcblxuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcblxuICAgIHN3aXRjaCAoY29uZGl0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgQ29uZGl0aW9uVHlwZS5FeGNsdWRlczpcbiAgICAgICAgcmVzdWx0ID0gIHYxcy5maWx0ZXIoKHYxKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHYycy5pbmRleE9mKHYxKSA+IC0xO1xuICAgICAgICB9KS5sZW5ndGggPT09IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb25kaXRpb25UeXBlLkluY2x1ZGVzOlxuICAgICAgICByZXN1bHQgPSB2MXMuZmlsdGVyKCh2MSkgPT4ge1xuICAgICAgICAgIHJldHVybiB2MnMuaW5kZXhPZih2MSkgPiAtMTtcbiAgICAgICAgfSkubGVuZ3RoICE9PSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGZvciAobGV0IHYyIG9mIHYycykge1xuICAgICAgICAgIGZvciAobGV0IHYxIG9mIHYxcykge1xuICAgICAgICAgICAgc3dpdGNoIChjb25kaXRpb24udHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIENvbmRpdGlvblR5cGUuRXF1YWxUbzpcbiAgICAgICAgICAgICAgICB2MSA9IHRoaXMuZ2V0U3RyaW5nRm9yVmFsdWUodjEpO1xuICAgICAgICAgICAgICAgIHYyID0gdGhpcy5nZXRTdHJpbmdGb3JWYWx1ZSh2Mik7XG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB2MikgeyByZXN1bHQgPSB0cnVlOyB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQ29uZGl0aW9uVHlwZS5Ob3RFcXVhbFRvOlxuICAgICAgICAgICAgICAgIHYxID0gdGhpcy5nZXRTdHJpbmdGb3JWYWx1ZSh2MSk7XG4gICAgICAgICAgICAgICAgdjIgPSB0aGlzLmdldFN0cmluZ0ZvclZhbHVlKHYyKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgIT09IHYyKSB7IHJlc3VsdCA9IHRydWU7IH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBDb25kaXRpb25UeXBlLkdyZWF0ZXJUaGFuOlxuICAgICAgICAgICAgICAgIHYxID0gcGFyc2VGbG9hdCh2MSk7XG4gICAgICAgICAgICAgICAgdjIgPSBwYXJzZUZsb2F0KHYyKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPj0gdjIpIHsgcmVzdWx0ID0gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIENvbmRpdGlvblR5cGUuTGVzc1RoYW46XG4gICAgICAgICAgICAgICAgdjEgPSBwYXJzZUZsb2F0KHYxKTtcbiAgICAgICAgICAgICAgICB2MiA9IHBhcnNlRmxvYXQodjIpO1xuICAgICAgICAgICAgICAgIGlmICh2MSA8PSB2MikgeyByZXN1bHQgPSB0cnVlOyB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RyaW5nRm9yVmFsdWUodmFsdWUpIHtcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlIG51bGw6XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCB2YWx1ZXMgZm9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gICAqIEBwYXJhbSBwYXRocyBUaGUgYXJyYXkgb2Ygc3RyaW5ncyB0byBjaGVjay5cbiAgICogQHBhcmFtIGN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSBUaGUgY3VycmVudCBmb3JtIGRhdGEsIGNhbiBiZSBudWxsL3VuZGVmaW5lZC5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc3RyaW5ncy92YWx1ZXNcbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgZ2V0VmFsdWVzRm9yQXJyYXkocGF0aHM6IEFycmF5PHN0cmluZz4sIGN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybTogRm9ybUdyb3VwKTogQXJyYXk8YW55PiB7XG4gICAgaWYgKGN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSkge1xuICAgICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlRm9yU3RyaW5nKHBhdGgsIGN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSk7XG4gICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXRocztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGN1cnJlbnQgdmFsdWUgZm9yIGEgc3RyaW5nLlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgc3RyaW5nIHZhbHVlIHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtIFRoZSBjdXJyZW50IGZvcm0gZGF0YSwgY2FuIGJlIG51bGwvdW5kZWZpbmVkLlxuICAgKiBAcmV0dXJucyBBIHN0cmluZy92YWx1ZS5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgZ2V0VmFsdWVGb3JTdHJpbmcocGF0aDogc3RyaW5nLCBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm06IEZvcm1Hcm91cCkge1xuICAgIGlmIChjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0pIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0KHBhdGgpO1xuICAgICAgcmV0dXJuIGNvbnRyb2wgPyBjb250cm9sLnZhbHVlIDogdGhpcy5jb252ZXJ0U3RyaW5nVG9WYWx1ZShwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFN0cmluZ1RvVmFsdWUocGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdmFsdWUuXG4gICAqIEVnLiB0cnVlL2ZhbHNlLlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgc3RyaW5nIHZhbHVlIHRvIGNoZWNrIGZvciBjb252ZXJzaW9uO1xuICAgKiBAcmV0dXJucyBFaXRoZXIgYSBzdHJpbmcgb3IgdGhlIGNvbnZlcnRlZCB2YWx1ZS5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgY29udmVydFN0cmluZ1RvVmFsdWUocGF0aDogc3RyaW5nKSB7XG4gICAgc3dpdGNoIChwYXRoKSB7XG4gICAgICBjYXNlICd0cnVlJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdmYWxzZSc6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgfVxufVxuIl19