@magic-xpa/angular 4.1100.0-dev4110.99 → 4.1101.0-dev4111.271

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 (170) hide show
  1. package/README.md +5 -5
  2. package/{esm2020 → esm2022}/index.mjs +59 -59
  3. package/{esm2020 → esm2022}/magic-xpa-angular.mjs +1 -1
  4. package/esm2022/src/controls.metadata.model.mjs +183 -0
  5. package/{esm2020 → esm2022}/src/interfaces/sub-form-definition.iterface.mjs +1 -1
  6. package/{esm2020 → esm2022}/src/magic.core.module.mjs +159 -160
  7. package/{esm2020 → esm2022}/src/services/ISubformMagicService.mjs +1 -1
  8. package/esm2022/src/services/OverlayWindowService.mjs +245 -0
  9. package/esm2022/src/services/StylesMapManager.mjs +28 -0
  10. package/esm2022/src/services/accessor.magic.service.mjs +358 -0
  11. package/esm2022/src/services/commands-collector.magic.service.mjs +47 -0
  12. package/esm2022/src/services/component-list.magic.service.mjs +45 -0
  13. package/{esm2020 → esm2022}/src/services/confirmation.components.magic.provider.mjs +21 -21
  14. package/esm2022/src/services/engine.magic.service.mjs +80 -0
  15. package/{esm2020 → esm2022}/src/services/exit.magic.service.mjs +13 -13
  16. package/esm2022/src/services/magic-color.service.mjs +101 -0
  17. package/{esm2020 → esm2022}/src/services/magic.lazy.loader.service.mjs +16 -16
  18. package/{esm2020 → esm2022}/src/services/magic.providers.mjs +24 -24
  19. package/esm2022/src/services/magic.services.mjs +36 -0
  20. package/esm2022/src/services/mg-date-adapter.mjs +108 -0
  21. package/{esm2020 → esm2022}/src/services/overlay.conainer.magic.provider.mjs +14 -14
  22. package/esm2022/src/services/router-commands.magic.service.mjs +31 -0
  23. package/esm2022/src/services/subform.magic.service.mjs +195 -0
  24. package/esm2022/src/services/table.magic.service.mjs +81 -0
  25. package/esm2022/src/services/task.magics.service.mjs +648 -0
  26. package/esm2022/src/services/title.magic.service.mjs +19 -0
  27. package/esm2022/src/ui/GuiInteractiveExecutor.mjs +114 -0
  28. package/esm2022/src/ui/components/base-magic-alert.component.mjs +24 -0
  29. package/esm2022/src/ui/components/base-magic-confirm.component.mjs +24 -0
  30. package/esm2022/src/ui/components/magic-alert.component.mjs +36 -0
  31. package/esm2022/src/ui/components/magic-confirmation-box.component.mjs +42 -0
  32. package/esm2022/src/ui/directives/NonMagicControlDirective.mjs +58 -0
  33. package/esm2022/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.mjs +29 -0
  34. package/esm2022/src/ui/directives/magic/checkbox.magic.directive.mjs +100 -0
  35. package/esm2022/src/ui/directives/magic/combobox.magic.directive.mjs +37 -0
  36. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.mjs +27 -0
  37. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.mjs +85 -0
  38. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.mjs +32 -0
  39. package/esm2022/src/ui/directives/magic/input.noformcontrol.magic.directive.mjs +28 -0
  40. package/{esm2020 → esm2022}/src/ui/directives/magic/nocontrol.magic.directive.mjs +193 -193
  41. package/esm2022/src/ui/directives/magic/row.magic.directive.mjs +62 -0
  42. package/esm2022/src/ui/directives/magic-focus.directive.mjs +20 -0
  43. package/esm2022/src/ui/directives/magic.directive.mjs +232 -0
  44. package/esm2022/src/ui/directives/magicViewContainerRef.directive.mjs +20 -0
  45. package/esm2022/src/ui/directives/mgformat.magic.directive.mjs +579 -0
  46. package/esm2022/src/ui/directives/range-validator.magic.directive.mjs +60 -0
  47. package/{esm2020 → esm2022}/src/ui/magic-confirmationBox.mjs +41 -41
  48. package/{esm2020 → esm2022}/src/ui/magic-modal/base-magic-overlay-container.mjs +22 -22
  49. package/esm2022/src/ui/magic-modal/magic-modal-form.mjs +6 -0
  50. package/{esm2020 → esm2022}/src/ui/magic-modal/magic-modal-interface.mjs +1 -1
  51. package/esm2022/src/ui/magic-modal/magic-overlay-container-wrapper.mjs +125 -0
  52. package/esm2022/src/ui/magic-modal/magic-overlay-container.mjs +162 -0
  53. package/esm2022/src/ui/magic-root.component.mjs +236 -0
  54. package/esm2022/src/ui/mgerror.magic.component.mjs +125 -0
  55. package/esm2022/src/ui/pipes/date.magic.pipe.mjs +106 -0
  56. package/esm2022/src/ui/pipes/time.magic.pipe.mjs +52 -0
  57. package/esm2022/src/ui/pipes/time24.magic.pipe.mjs +35 -0
  58. package/esm2022/src/ui/router-container.magic.component.mjs +115 -0
  59. package/{esm2020 → esm2022}/src/ui/subform.magic.component.mjs +50 -46
  60. package/esm2022/src/ui/task-base.magic.component.mjs +91 -0
  61. package/{esm2020 → esm2022}/src/ui/utils.mjs +53 -53
  62. package/{fesm2020 → fesm2022}/magic-xpa-angular.mjs +4933 -4495
  63. package/fesm2022/magic-xpa-angular.mjs.map +1 -0
  64. package/index.d.ts +58 -58
  65. package/package.json +10 -16
  66. package/src/controls.metadata.model.d.ts +62 -62
  67. package/src/interfaces/sub-form-definition.iterface.d.ts +12 -12
  68. package/src/magic.core.module.d.ts +41 -41
  69. package/src/services/ISubformMagicService.d.ts +4 -4
  70. package/src/services/OverlayWindowService.d.ts +30 -31
  71. package/src/services/StylesMapManager.d.ts +5 -5
  72. package/src/services/accessor.magic.service.d.ts +69 -69
  73. package/src/services/commands-collector.magic.service.d.ts +15 -15
  74. package/src/services/component-list.magic.service.d.ts +23 -23
  75. package/src/services/confirmation.components.magic.provider.d.ts +8 -8
  76. package/src/services/engine.magic.service.d.ts +27 -27
  77. package/src/services/exit.magic.service.d.ts +6 -6
  78. package/src/services/magic-color.service.d.ts +19 -19
  79. package/src/services/magic.lazy.loader.service.d.ts +6 -6
  80. package/src/services/magic.providers.d.ts +107 -107
  81. package/src/services/magic.services.d.ts +16 -16
  82. package/src/services/mg-date-adapter.d.ts +38 -40
  83. package/src/services/overlay.conainer.magic.provider.d.ts +7 -7
  84. package/src/services/router-commands.magic.service.d.ts +17 -17
  85. package/src/services/subform.magic.service.d.ts +43 -43
  86. package/src/services/table.magic.service.d.ts +30 -30
  87. package/src/services/task.magics.service.d.ts +100 -100
  88. package/src/services/title.magic.service.d.ts +9 -9
  89. package/src/ui/GuiInteractiveExecutor.d.ts +22 -22
  90. package/src/ui/components/base-magic-alert.component.d.ts +10 -10
  91. package/src/ui/components/base-magic-confirm.component.d.ts +10 -10
  92. package/src/ui/components/magic-alert.component.d.ts +6 -6
  93. package/src/ui/components/magic-confirmation-box.component.d.ts +6 -6
  94. package/src/ui/directives/NonMagicControlDirective.d.ts +26 -26
  95. package/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.d.ts +9 -9
  96. package/src/ui/directives/magic/checkbox.magic.directive.d.ts +22 -9
  97. package/src/ui/directives/magic/combobox.magic.directive.d.ts +10 -10
  98. package/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.d.ts +7 -7
  99. package/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.d.ts +23 -17
  100. package/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.d.ts +7 -7
  101. package/src/ui/directives/magic/input.noformcontrol.magic.directive.d.ts +9 -9
  102. package/src/ui/directives/magic/nocontrol.magic.directive.d.ts +18 -18
  103. package/src/ui/directives/magic/row.magic.directive.d.ts +17 -17
  104. package/src/ui/directives/magic-focus.directive.d.ts +9 -9
  105. package/src/ui/directives/magic.directive.d.ts +45 -44
  106. package/src/ui/directives/magicViewContainerRef.directive.d.ts +8 -8
  107. package/src/ui/directives/mgformat.magic.directive.d.ts +38 -31
  108. package/src/ui/directives/range-validator.magic.directive.d.ts +17 -17
  109. package/src/ui/magic-confirmationBox.d.ts +6 -6
  110. package/src/ui/magic-modal/base-magic-overlay-container.d.ts +5 -5
  111. package/src/ui/magic-modal/magic-modal-form.d.ts +5 -5
  112. package/src/ui/magic-modal/magic-modal-interface.d.ts +10 -10
  113. package/src/ui/magic-modal/magic-overlay-container-wrapper.d.ts +30 -31
  114. package/src/ui/magic-modal/magic-overlay-container.d.ts +24 -25
  115. package/src/ui/magic-root.component.d.ts +43 -40
  116. package/src/ui/mgerror.magic.component.d.ts +20 -20
  117. package/src/ui/pipes/date.magic.pipe.d.ts +17 -17
  118. package/src/ui/pipes/time.magic.pipe.d.ts +11 -11
  119. package/src/ui/pipes/time24.magic.pipe.d.ts +10 -10
  120. package/src/ui/router-container.magic.component.d.ts +29 -30
  121. package/src/ui/subform.magic.component.d.ts +16 -16
  122. package/src/ui/task-base.magic.component.d.ts +34 -34
  123. package/src/ui/utils.d.ts +9 -9
  124. package/esm2020/src/controls.metadata.model.mjs +0 -180
  125. package/esm2020/src/services/OverlayWindowService.mjs +0 -236
  126. package/esm2020/src/services/StylesMapManager.mjs +0 -28
  127. package/esm2020/src/services/accessor.magic.service.mjs +0 -356
  128. package/esm2020/src/services/commands-collector.magic.service.mjs +0 -46
  129. package/esm2020/src/services/component-list.magic.service.mjs +0 -46
  130. package/esm2020/src/services/engine.magic.service.mjs +0 -82
  131. package/esm2020/src/services/magic-color.service.mjs +0 -99
  132. package/esm2020/src/services/magic.services.mjs +0 -31
  133. package/esm2020/src/services/mg-date-adapter.mjs +0 -109
  134. package/esm2020/src/services/router-commands.magic.service.mjs +0 -28
  135. package/esm2020/src/services/subform.magic.service.mjs +0 -184
  136. package/esm2020/src/services/table.magic.service.mjs +0 -77
  137. package/esm2020/src/services/task.magics.service.mjs +0 -624
  138. package/esm2020/src/services/title.magic.service.mjs +0 -18
  139. package/esm2020/src/ui/GuiInteractiveExecutor.mjs +0 -105
  140. package/esm2020/src/ui/components/base-magic-alert.component.mjs +0 -23
  141. package/esm2020/src/ui/components/base-magic-confirm.component.mjs +0 -23
  142. package/esm2020/src/ui/components/magic-alert.component.mjs +0 -35
  143. package/esm2020/src/ui/components/magic-confirmation-box.component.mjs +0 -41
  144. package/esm2020/src/ui/directives/NonMagicControlDirective.mjs +0 -49
  145. package/esm2020/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.mjs +0 -28
  146. package/esm2020/src/ui/directives/magic/checkbox.magic.directive.mjs +0 -28
  147. package/esm2020/src/ui/directives/magic/combobox.magic.directive.mjs +0 -36
  148. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.mjs +0 -27
  149. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.mjs +0 -52
  150. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.mjs +0 -32
  151. package/esm2020/src/ui/directives/magic/input.noformcontrol.magic.directive.mjs +0 -27
  152. package/esm2020/src/ui/directives/magic/row.magic.directive.mjs +0 -58
  153. package/esm2020/src/ui/directives/magic-focus.directive.mjs +0 -19
  154. package/esm2020/src/ui/directives/magic.directive.mjs +0 -215
  155. package/esm2020/src/ui/directives/magicViewContainerRef.directive.mjs +0 -19
  156. package/esm2020/src/ui/directives/mgformat.magic.directive.mjs +0 -408
  157. package/esm2020/src/ui/directives/range-validator.magic.directive.mjs +0 -58
  158. package/esm2020/src/ui/magic-modal/magic-modal-form.mjs +0 -8
  159. package/esm2020/src/ui/magic-modal/magic-overlay-container-wrapper.mjs +0 -121
  160. package/esm2020/src/ui/magic-modal/magic-overlay-container.mjs +0 -159
  161. package/esm2020/src/ui/magic-root.component.mjs +0 -203
  162. package/esm2020/src/ui/mgerror.magic.component.mjs +0 -119
  163. package/esm2020/src/ui/pipes/date.magic.pipe.mjs +0 -105
  164. package/esm2020/src/ui/pipes/time.magic.pipe.mjs +0 -51
  165. package/esm2020/src/ui/pipes/time24.magic.pipe.mjs +0 -34
  166. package/esm2020/src/ui/router-container.magic.component.mjs +0 -108
  167. package/esm2020/src/ui/task-base.magic.component.mjs +0 -86
  168. package/fesm2015/magic-xpa-angular.mjs +0 -4865
  169. package/fesm2015/magic-xpa-angular.mjs.map +0 -1
  170. package/fesm2020/magic-xpa-angular.mjs.map +0 -1
@@ -0,0 +1,648 @@
1
+ import { EventEmitter, Injectable } from '@angular/core';
2
+ import { FormControl, FormGroup } from '@angular/forms';
3
+ import { filter } from 'rxjs/operators';
4
+ import { Subject } from 'rxjs';
5
+ import { isNullOrUndefined, isUndefined } from '@magic-xpa/mscorelib';
6
+ import { StylesMapManager } from './StylesMapManager';
7
+ import { EngineMagicService } from './engine.magic.service';
8
+ import { Records } from '../controls.metadata.model';
9
+ import { CommandType, GuiConstants, HtmlProperties } from '@magic-xpa/gui';
10
+ import { NString, StringBuilder } from '@magic-xpa/mscorelib';
11
+ import { StorageAttribute } from '@magic-xpa/utils';
12
+ import { getGuiEventObj } from '@magic-xpa/engine';
13
+ import { GuiInteractiveExecutor } from '../ui/GuiInteractiveExecutor';
14
+ import { OverlayWindowService } from './OverlayWindowService';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "./engine.magic.service";
17
+ import * as i2 from "./OverlayWindowService";
18
+ export class TaskMagicService {
19
+ magic;
20
+ overlayWindowService;
21
+ tableService;
22
+ Records = new Records();
23
+ formGroups = [];
24
+ ScreenModeControls;
25
+ refreshDom = new Subject();
26
+ subscribeRefreshDom;
27
+ detectChanges = new Subject();
28
+ subscribeInteractiveCommands;
29
+ interactiveCommands = new Subject();
30
+ OnSelectedRowChanged = new EventEmitter();
31
+ customPropertiesSubject = new Subject();
32
+ recordsCountChangeSubject = new Subject();
33
+ mgLoadSubject = new Subject();
34
+ template;
35
+ mgSubformService;
36
+ mgTitleService;
37
+ mgAccessorService;
38
+ mgInputDateFormat;
39
+ oldPageSize = 0;
40
+ constructor(magic, overlayWindowService) {
41
+ this.magic = magic;
42
+ this.overlayWindowService = overlayWindowService;
43
+ this.Records.setGuiTopIndex(0);
44
+ this.mgInputDateFormat = null;
45
+ }
46
+ getIsLoggenIn() {
47
+ return this.magic.getIsLoggedIn();
48
+ }
49
+ _taskId;
50
+ get taskId() {
51
+ return this._taskId;
52
+ }
53
+ set taskId(value) {
54
+ this._taskId = value;
55
+ }
56
+ get ScreenControlsData() {
57
+ return this.Records.list['0'];
58
+ }
59
+ settemplate(value) {
60
+ this.template = value;
61
+ }
62
+ buildScreenModeControls() {
63
+ const group = new FormGroup({});
64
+ for (const key in this.template) {
65
+ if (this.template[key] == '0') {
66
+ let fc = new FormControl('');
67
+ this.setStubValue(0, fc, key);
68
+ group.addControl(key, fc);
69
+ }
70
+ }
71
+ this.ScreenModeControls = group;
72
+ }
73
+ isTableControl(id) {
74
+ return this.template[id] == '1';
75
+ }
76
+ getMgInputDateFormat() { return this.mgInputDateFormat; }
77
+ getFormControl(guiRowid, id) {
78
+ let c;
79
+ let group = this.isTableControl(id) ? this.formGroups[guiRowid] : this.ScreenModeControls;
80
+ if (!isNullOrUndefined(group)) {
81
+ group.get(id);
82
+ c = group.controls[id];
83
+ }
84
+ return c;
85
+ }
86
+ setInputTextValue(controlId, guiRowid, val) {
87
+ this.setValue(controlId, guiRowid, this.ConvertValToNative(controlId, 0, val));
88
+ const fc = this.getFormControl(guiRowid, controlId);
89
+ if (!isNullOrUndefined(val))
90
+ fc.setValue(val);
91
+ }
92
+ buildTableRowControls(guiRowId) {
93
+ const group = new FormGroup({});
94
+ for (const key in this.template) {
95
+ if (this.template[key] == '1') {
96
+ let fc = new FormControl('');
97
+ this.setStubValue(guiRowId, fc, key);
98
+ group.addControl(key, fc);
99
+ }
100
+ }
101
+ this.formGroups[guiRowId] = group;
102
+ }
103
+ updateRecordsBeforeCurrentView(value) {
104
+ this.Records.recordsBeforeCurrentView = value;
105
+ }
106
+ setIncludesFirst(value) {
107
+ this.Records.includesFirst = value;
108
+ }
109
+ setIncludesLast(value) {
110
+ this.Records.includesLast = value;
111
+ }
112
+ markRowAsCreated(guiRowId) {
113
+ this.Records.markRowAsCreated(guiRowId);
114
+ }
115
+ markRowAsNotCreated(guiRowId) {
116
+ this.Records.markRowAsNotCreated(guiRowId);
117
+ }
118
+ startRowEditing(guiRowId) {
119
+ this.Records.startRowEditing(guiRowId);
120
+ }
121
+ stopRowEditing(guiRowId) {
122
+ this.Records.stopRowEditing(guiRowId);
123
+ }
124
+ isRowInRowEditing(guiRowId) {
125
+ return this.Records.isRowInRowEditing(guiRowId);
126
+ }
127
+ setIsEmptyDataView(isEmpty) {
128
+ if (this.Records.isEmptyDataView !== isEmpty) {
129
+ if (isEmpty)
130
+ this.recordsCountChangeSubject.next(0);
131
+ this.Records.isEmptyDataView = isEmpty;
132
+ this.tableService.refreshDataSource();
133
+ this.refreshView();
134
+ }
135
+ }
136
+ initTask(taskId, taskDescription) {
137
+ this.Records.createFirst();
138
+ this.oldPageSize = 0;
139
+ if (this.IsStub()) {
140
+ this.loadData();
141
+ }
142
+ else {
143
+ this.taskId = taskId;
144
+ this.settemplate(taskDescription);
145
+ }
146
+ this.buildScreenModeControls();
147
+ if (!isNullOrUndefined(this.subscribeRefreshDom))
148
+ this.subscribeRefreshDom.unsubscribe();
149
+ if (!isNullOrUndefined(this.subscribeInteractiveCommands))
150
+ this.subscribeInteractiveCommands.unsubscribe();
151
+ this.subscribeRefreshDom = this.magic.refreshDom.pipe(filter(command => command.TaskTag === this.taskId))
152
+ .subscribe(command => {
153
+ this.executeCommand(command);
154
+ });
155
+ this.subscribeInteractiveCommands = this.magic.interactiveCommands
156
+ .pipe(filter(command => command.TaskTag === this.taskId))
157
+ .subscribe(command => {
158
+ this.executeInteractiveCommand(command);
159
+ });
160
+ }
161
+ refreshView() {
162
+ this.detectChanges.next('');
163
+ }
164
+ insertEvent(guiEvent) {
165
+ guiEvent.TaskID = this.taskId;
166
+ this.magic.insertEvent(guiEvent);
167
+ }
168
+ GetControlPictureMask(controlName) {
169
+ return this.magic.GetControlPictureMask(this.taskId, controlName);
170
+ }
171
+ ValidateControlValue(controlName, value) {
172
+ return this.magic.ValidateControlValue(this.taskId, controlName, value);
173
+ }
174
+ GetRangedValue(controlName, value) {
175
+ return this.magic.GetRangedValue(this.taskId, controlName, value);
176
+ }
177
+ GetFldRanges(controlName) {
178
+ return this.magic.GetFldRanges(this.taskId, controlName);
179
+ }
180
+ getProperty(controlId, prop, guiRowId) {
181
+ if (isNullOrUndefined(guiRowId))
182
+ guiRowId = '0';
183
+ if (this.IsStub())
184
+ return this.getPropertyStub(this.Records.list[guiRowId], controlId, prop);
185
+ else {
186
+ let rec = this.Records.list[guiRowId];
187
+ if (isNullOrUndefined(rec))
188
+ debugger;
189
+ else
190
+ return this.Records.list[guiRowId].getProperty(controlId, prop);
191
+ }
192
+ }
193
+ getPropertyStub(ControlsProperties, controlId, prop) {
194
+ ControlsProperties = ControlsProperties.ControlsProperties;
195
+ if (controlId in ControlsProperties) {
196
+ if (prop in ControlsProperties[controlId].properties) {
197
+ return ControlsProperties[controlId].properties[prop];
198
+ }
199
+ }
200
+ return '';
201
+ }
202
+ getStyleStub(ControlsProperties, controlId, styleName) {
203
+ ControlsProperties = ControlsProperties.ControlsProperties;
204
+ return ControlsProperties[controlId].stylesMap.get(styleName);
205
+ }
206
+ getClasses(controlId, guiRowId) {
207
+ if (isNullOrUndefined(guiRowId))
208
+ guiRowId = '0';
209
+ return this.Records.list[guiRowId].getControlMetadata(controlId).classes;
210
+ }
211
+ getStyle(controlId, styleName, guiRowId) {
212
+ if (isNullOrUndefined(guiRowId))
213
+ guiRowId = '0';
214
+ if (this.IsStub())
215
+ return this.getStyleStub(this.Records.list[guiRowId], controlId, styleName);
216
+ else {
217
+ let magicValue = this.Records.list[guiRowId].getControlMetadata(controlId).stylesMap.get(styleName);
218
+ return StylesMapManager.magicValueGetStyle(styleName, magicValue);
219
+ }
220
+ }
221
+ getValue(controlId, guiRowId) {
222
+ if (isNullOrUndefined(guiRowId))
223
+ guiRowId = '0';
224
+ return this.Records.list.length > +guiRowId ? this.Records.list[guiRowId].values[controlId] : '';
225
+ }
226
+ getFormattedValue(controlName, val, rowId) {
227
+ return this.magic.GetFormattedValue(this.taskId, controlName, val, rowId);
228
+ }
229
+ setValue(controlId, guiRowId, value) {
230
+ return this.Records.list[guiRowId].setValue(controlId, value);
231
+ }
232
+ executeInteractiveCommand(guiInteractiveCommand) {
233
+ GuiInteractiveExecutor.executeInteractiveCommand(this, guiInteractiveCommand, this.overlayWindowService);
234
+ this.interactiveCommands.next(guiInteractiveCommand);
235
+ }
236
+ handleSetProperty(command, isTableChild) {
237
+ let controlId = command.CtrlName;
238
+ let dvRowId = (command.line || 0);
239
+ let guiRowId = this.getGuiRowId(dvRowId, isTableChild);
240
+ let properties;
241
+ if (command.Operation === HtmlProperties.SelectedRow) {
242
+ if (command.obj1 !== GuiConstants.NO_ROW_SELECTED) {
243
+ guiRowId = this.getGuiRowId(command.obj1, true);
244
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
245
+ properties.properties.set(command.Operation, command.line);
246
+ this.tableService.selectRow(guiRowId.toString());
247
+ this.OnSelectedRowChanged.emit(guiRowId.toString());
248
+ }
249
+ }
250
+ else if (command.Operation === HtmlProperties.Enabled) {
251
+ let c = this.getFormControl(guiRowId.toString(), controlId);
252
+ if (!isNullOrUndefined(c)) {
253
+ if (command.obj1)
254
+ c.enable();
255
+ else
256
+ c.disable();
257
+ }
258
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
259
+ properties.properties.set(command.Operation, command.obj1);
260
+ }
261
+ else {
262
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
263
+ properties.properties.set(command.Operation, command.obj1);
264
+ }
265
+ }
266
+ executeCommand(command) {
267
+ let dvRowId = (command.line || 0);
268
+ let guiRowId = 0;
269
+ let controlId = command.CtrlName;
270
+ let properties;
271
+ let isTableChild = this.isTableControl(controlId);
272
+ if (command.obj !== null)
273
+ isTableChild = isTableChild || command.obj.IsTableChild;
274
+ guiRowId = this.getGuiRowId(dvRowId, isTableChild);
275
+ switch (command.CommandType) {
276
+ case CommandType.SET_IS_LOGGED_IN:
277
+ break;
278
+ case CommandType.SET_TABLE_TOP_INDEX:
279
+ this.tableService.setTableTopIndex(command.number);
280
+ break;
281
+ case CommandType.REFRESH_TASK:
282
+ this.tableService.refreshDataSource();
283
+ this.refreshView();
284
+ break;
285
+ case CommandType.SET_TABLE_ITEMS_COUNT:
286
+ if (!isUndefined(command.number)) {
287
+ this.tableService.updateTableSize(command.number);
288
+ if (command.number > 0 && this.Records.sizeUpdated &&
289
+ !this.Records.isEmptyDataView) {
290
+ this.recordsCountChangeSubject.next(command.number);
291
+ this.Records.sizeUpdated = false;
292
+ }
293
+ }
294
+ break;
295
+ case CommandType.SET_CHUNK_SIZE:
296
+ if (!isUndefined(command.number)) {
297
+ this.tableService.setChunkSize(command.number);
298
+ }
299
+ break;
300
+ case CommandType.SET_RECORDS_BEFORE_CURRENT_VIEW:
301
+ this.updateRecordsBeforeCurrentView(command.number);
302
+ break;
303
+ case CommandType.CREATE_TABLE_ROW:
304
+ guiRowId = this.getGuiRowId(command.number, true);
305
+ this.buildTableRowControls(guiRowId);
306
+ this.markRowAsCreated(guiRowId);
307
+ break;
308
+ case CommandType.SET_IS_ROW_EDITING:
309
+ guiRowId = this.getGuiRowId(command.line, command.value);
310
+ this.startRowEditing(guiRowId);
311
+ break;
312
+ case CommandType.SET_NOT_IS_ROW_EDITING:
313
+ guiRowId = this.getGuiRowId(command.line, command.value);
314
+ this.stopRowEditing(guiRowId);
315
+ break;
316
+ case CommandType.UNDO_CREATE_TABLE_ROW:
317
+ this.markRowAsNotCreated(this.getGuiRowId(command.number, true));
318
+ break;
319
+ case CommandType.SET_TABLE_INCLUDES_FIRST:
320
+ this.setIncludesFirst(command.Bool1);
321
+ break;
322
+ case CommandType.SET_TABLE_INCLUDES_LAST:
323
+ this.setIncludesLast(command.Bool1);
324
+ break;
325
+ case CommandType.SET_PROPERTY:
326
+ this.handleSetProperty(command, isTableChild);
327
+ if (command.Operation == HtmlProperties.ReadOnly ||
328
+ command.Operation == HtmlProperties.ItemsList ||
329
+ command.Operation == HtmlProperties.CheckBoxIndeterminate)
330
+ this.refreshDom.next(command);
331
+ break;
332
+ case CommandType.PROP_SET_USER_PROPERTY:
333
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
334
+ if (properties.userProperties.get(command.Operation) !== command.obj1) {
335
+ properties.userProperties.set(command.Operation, command.obj1);
336
+ this.customPropertiesSubject.next({ propertyName: controlId + '~' + command.Operation, value: command.obj1, rowId: guiRowId });
337
+ }
338
+ break;
339
+ case CommandType.PROP_SET_CUSTOM_VALIDATOR:
340
+ {
341
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
342
+ let control = this.getFormControl(guiRowId.toString(), controlId);
343
+ if (control != null) {
344
+ properties.customValidators.set(command.Operation, command.obj1);
345
+ if (control.validator != null)
346
+ control.setValidators([control.validator, this.customValidator(guiRowId.toString(), controlId)]);
347
+ else
348
+ control.setValidators(this.customValidator(guiRowId.toString(), controlId));
349
+ control.updateValueAndValidity();
350
+ }
351
+ }
352
+ break;
353
+ case CommandType.SET_CLASS:
354
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
355
+ properties.setClass(command.Operation, command.obj1);
356
+ break;
357
+ case CommandType.SET_STYLE:
358
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
359
+ properties.setStyle(command.Operation, command.obj1);
360
+ break;
361
+ case CommandType.SET_ATTRIBUTE:
362
+ properties = this.Records.list[0].getControlMetadata(controlId);
363
+ properties.dataType = String.fromCharCode(command.number);
364
+ break;
365
+ case CommandType.SET_VALUE:
366
+ this.Records.list[guiRowId].values[controlId] = command.value;
367
+ let c = this.getFormControl(guiRowId.toString(), controlId);
368
+ if (!isNullOrUndefined(c)) {
369
+ c.setValue(this.ConvertValFromNative(controlId, command.line, command.value));
370
+ }
371
+ break;
372
+ case CommandType.CREATE_SUB_FORM:
373
+ this.mgSubformService.addSubformComp(command.CtrlName, command.userDropFormat.toString(), command.str, command.fileName, command.contextID, command.params, command.Bool1);
374
+ break;
375
+ case CommandType.CLOSE_SUB_FORM:
376
+ this.mgSubformService.deleteSubformComp(command.CtrlName, command.userDropFormat.toString());
377
+ break;
378
+ case CommandType.SET_EMPTY_DATAVIEW:
379
+ this.setIsEmptyDataView(command.Bool1);
380
+ break;
381
+ case CommandType.SET_FOCUS:
382
+ this.refreshDom.next(command);
383
+ break;
384
+ case CommandType.SET_WC_IDLE:
385
+ this.mgLoadSubject.next();
386
+ break;
387
+ }
388
+ }
389
+ customValidator(rowid, id) {
390
+ return (control) => {
391
+ let controlMetadata;
392
+ controlMetadata = this.Records.list[rowid].getControlMetadata(id);
393
+ for (let key of controlMetadata.customValidators.keys()) {
394
+ let validator = controlMetadata.customValidators.get(key);
395
+ if (!validator.isValid()) {
396
+ return { [key]: true };
397
+ }
398
+ }
399
+ return null;
400
+ };
401
+ }
402
+ ConvertValToNative(controlId, rowId, val) {
403
+ let properties;
404
+ properties = this.Records.list[0].getControlMetadata(controlId);
405
+ switch (properties.dataType) {
406
+ case StorageAttribute.BOOLEAN: {
407
+ if (typeof val === 'string') {
408
+ let ranges = this.GetFldRanges(controlId);
409
+ let found = ranges.indexOf(',');
410
+ let trueOption = ranges.substr(0, found);
411
+ let falseOption = ranges.substr(found + 1);
412
+ if (NString.Equals(val, trueOption, true))
413
+ return true;
414
+ else if (NString.Equals(val, falseOption, true))
415
+ return false;
416
+ else
417
+ return val;
418
+ }
419
+ else
420
+ return val;
421
+ }
422
+ case StorageAttribute.TIME: {
423
+ if (typeof val === 'string') {
424
+ let idx = val.indexOf(':', 0);
425
+ let hours = +val.substr(0, idx);
426
+ let minutes = +val.substr(idx + 1, 2);
427
+ let seconds = 0;
428
+ if (val.length > 5) {
429
+ idx = val.indexOf(':', idx + 1);
430
+ if (idx >= 0)
431
+ seconds = +val.substr(idx + 1, 2);
432
+ }
433
+ if (val.indexOf('PM') > 0)
434
+ hours += 12;
435
+ let dt = new Date();
436
+ dt.setHours(hours);
437
+ dt.setMinutes(minutes);
438
+ dt.setSeconds(seconds);
439
+ return dt;
440
+ }
441
+ else
442
+ return val;
443
+ }
444
+ case StorageAttribute.NUMERIC:
445
+ if (isUndefined(val))
446
+ return val;
447
+ else
448
+ return (val != null) ? (typeof val === 'string') ? val : +val : null;
449
+ default:
450
+ return val;
451
+ }
452
+ }
453
+ ConvertValFromNative(controlId, rowId, val) {
454
+ let properties;
455
+ properties = this.Records.list[0].getControlMetadata(controlId);
456
+ switch (properties.dataType) {
457
+ case StorageAttribute.TIME: {
458
+ if (val instanceof Date) {
459
+ let str = new StringBuilder();
460
+ let format = val.getHours() > 9 ? '{0}' : '0{0}';
461
+ str.AppendFormat(format, val.getHours().toString());
462
+ str.Append(':');
463
+ format = val.getMinutes() > 9 ? '{0}' : '0{0}';
464
+ str.AppendFormat(format, val.getMinutes().toString());
465
+ if (val.getSeconds() > 0) {
466
+ str.Append(':');
467
+ format = val.getSeconds() > 9 ? '{0}' : '0{0}';
468
+ str.AppendFormat(format, val.getSeconds().toString());
469
+ }
470
+ return str.ToString();
471
+ }
472
+ else
473
+ return val;
474
+ }
475
+ case StorageAttribute.BOOLEAN: {
476
+ let properties;
477
+ properties = this.Records.list['0'].getControlMetadata(controlId);
478
+ if (typeof val === 'boolean' && properties.rangeValidator) {
479
+ let ranges = this.GetFldRanges(controlId);
480
+ let found = ranges.indexOf(',');
481
+ let trueOption = ranges.substr(0, found);
482
+ let falseOption = ranges.substr(found + 1);
483
+ if (val)
484
+ return trueOption;
485
+ else
486
+ return falseOption;
487
+ }
488
+ else
489
+ return val;
490
+ }
491
+ default:
492
+ return val;
493
+ }
494
+ }
495
+ resize(pageSize, topGuiRowId) {
496
+ let guiEvent = getGuiEventObj('resize', 'table', 0);
497
+ guiEvent.PageSize = pageSize;
498
+ guiEvent.Line = topGuiRowId;
499
+ this.insertEvent(guiEvent);
500
+ }
501
+ onScrollDown() {
502
+ if (!this.Records.includesLast) {
503
+ let guiEvent = getGuiEventObj('getRows', '', 0);
504
+ guiEvent.Line = this.formGroups.length;
505
+ this.insertEvent(guiEvent);
506
+ }
507
+ }
508
+ setTitle(newTitle) {
509
+ this.mgTitleService.setTitle(newTitle);
510
+ }
511
+ getGuiRowId(dvRowId, isTableControl) {
512
+ return (isTableControl ? dvRowId + this.Records.recordsBeforeCurrentView : 0);
513
+ }
514
+ getDvRowId(guiRowId) {
515
+ return (guiRowId - this.Records.recordsBeforeCurrentView);
516
+ }
517
+ dispose() {
518
+ this.refreshDom.complete();
519
+ this.detectChanges.complete();
520
+ this.subscribeInteractiveCommands.unsubscribe();
521
+ this.subscribeRefreshDom.unsubscribe();
522
+ this.interactiveCommands.complete();
523
+ this.customPropertiesSubject.complete();
524
+ this.OnSelectedRowChanged.complete();
525
+ }
526
+ onComboboxSelectionChanged(event, idx, line) {
527
+ let guiEvent = getGuiEventObj('selectionchanged', idx, line);
528
+ if (typeof (event) == 'number') {
529
+ guiEvent.Value = event;
530
+ }
531
+ else {
532
+ if (!isNullOrUndefined(event.target)) {
533
+ let indexes = new Array(event.target.selectedOptions.length);
534
+ for (let i = 0; i < event.target.selectedOptions.length; i++) {
535
+ indexes[i] = event.target.selectedOptions[i].index;
536
+ }
537
+ guiEvent.Value = indexes.join(',');
538
+ }
539
+ else
540
+ guiEvent.Value = event.value;
541
+ }
542
+ this.insertEvent(guiEvent);
543
+ }
544
+ onListBoxSelectionChanged(event, idx) {
545
+ let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
546
+ let selectedOptions;
547
+ if (!isNullOrUndefined(event.target))
548
+ selectedOptions = event.target.selectedOptions;
549
+ else
550
+ selectedOptions = event.source.selectedOptions.selected;
551
+ let length = selectedOptions.length;
552
+ let indexes = new Array(length);
553
+ for (let i = 0; i < length; i++) {
554
+ if (!isNullOrUndefined(event.target))
555
+ indexes[i] = (selectedOptions[i]).index;
556
+ else
557
+ indexes[i] = (selectedOptions[i]).value;
558
+ }
559
+ guiEvent.Value = indexes;
560
+ this.insertEvent(guiEvent);
561
+ }
562
+ onCheckChanged(event, idx, rowId) {
563
+ if (typeof rowId === 'undefined')
564
+ rowId = 0;
565
+ let guiEvent = getGuiEventObj('selectionchanged', idx, rowId);
566
+ if (typeof (event) == 'boolean') {
567
+ guiEvent.Value = event;
568
+ }
569
+ else if (typeof (event) == 'string') {
570
+ if (event == "unchecked") {
571
+ guiEvent.Value = false;
572
+ }
573
+ else if (event == 'indeterminate')
574
+ guiEvent.Value = null;
575
+ else if (event == 'checked') {
576
+ guiEvent.Value = true;
577
+ }
578
+ }
579
+ else {
580
+ if (typeof event.target === 'undefined')
581
+ guiEvent.Value = (event).checked;
582
+ else
583
+ guiEvent.Value = (event.target).checked;
584
+ }
585
+ this.insertEvent(guiEvent);
586
+ }
587
+ mgOnTabSelectionChanged(idx, layer) {
588
+ let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
589
+ guiEvent.Value = layer.toString();
590
+ this.insertEvent(guiEvent);
591
+ }
592
+ mgOnRadioSelectionChanged(idx) {
593
+ let result = this.getFormControl('0', idx);
594
+ let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
595
+ if (typeof result.value !== 'number')
596
+ guiEvent.Value = result.value.index;
597
+ else
598
+ guiEvent.Value = result.value.toString();
599
+ this.insertEvent(guiEvent);
600
+ }
601
+ close() {
602
+ this.insertEvent(getGuiEventObj('close', null, 0));
603
+ }
604
+ IsStub() {
605
+ return this.magic.isStub;
606
+ }
607
+ jsonData;
608
+ saveData(data) {
609
+ this.magic.saveData(data);
610
+ }
611
+ createData() {
612
+ let myData = {
613
+ records: this.Records,
614
+ template: this.template
615
+ };
616
+ let text = 'loadData():any {\n' +
617
+ ' let stubData = ' + JSON.stringify(myData) + ';\n' +
618
+ ' this.loadStubData(stubData);}';
619
+ console.log(text);
620
+ this.saveData(text);
621
+ }
622
+ loadStubData(stubData) {
623
+ this.Records = stubData.records;
624
+ this.settemplate(stubData.template);
625
+ this.taskId = '1';
626
+ for (let i = 0; i < this.Records.list.length; i++)
627
+ this.buildTableRowControls(i);
628
+ }
629
+ loadData() {
630
+ alert('Please, overwrite method loadData');
631
+ }
632
+ setStubValue(guiRowId, fc, name) {
633
+ if (this.IsStub()) {
634
+ try {
635
+ let val = this.Records.list[guiRowId].values[name];
636
+ fc.setValue(val);
637
+ }
638
+ catch (e) {
639
+ }
640
+ }
641
+ }
642
+ static ɵfac = function TaskMagicService_Factory(t) { return new (t || TaskMagicService)(i0.ɵɵinject(i1.EngineMagicService), i0.ɵɵinject(i2.OverlayWindowService)); };
643
+ static ɵprov = i0.ɵɵdefineInjectable({ token: TaskMagicService, factory: TaskMagicService.ɵfac });
644
+ }
645
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TaskMagicService, [{
646
+ type: Injectable
647
+ }], () => [{ type: i1.EngineMagicService }, { type: i2.OverlayWindowService }], null); })();
648
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay5tYWdpY3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIvc3JjL3NlcnZpY2VzL3Rhc2subWFnaWNzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFrQixXQUFXLEVBQUUsU0FBUyxFQUFnQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQWtCLE9BQU8sRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxXQUFXLEVBQStCLFlBQVksRUFBa0IsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEgsT0FBTyxFQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFZLE1BQU0sbUJBQW1CLENBQUM7QUFJNUQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFNNUQsTUFBTSxPQUFPLGdCQUFnQjtJQXVGTDtJQUFtQztJQWxGbEQsWUFBWSxDQUFNO0lB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QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUMvQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUtNLFFBQVE7UUFDYixLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBS0QsWUFBWSxDQUFDLFFBQWdCLEVBQUUsRUFBZSxFQUFFLElBQVk7UUFDMUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakIsSUFBSTtnQkFDRixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25ELEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDbEI7WUFBQyxPQUFPLENBQUMsRUFBRTthQUNYO1NBQ0Y7SUFDSCxDQUFDOzBFQWpqQ1UsZ0JBQWdCO2tEQUFoQixnQkFBZ0IsV0FBaEIsZ0JBQWdCOztpRkFBaEIsZ0JBQWdCO2NBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3JGbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge2ZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQge2lzTnVsbE9yVW5kZWZpbmVkLCBpc1VuZGVmaW5lZH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1N0eWxlc01hcE1hbmFnZXJ9IGZyb20gJy4vU3R5bGVzTWFwTWFuYWdlcic7XHJcblxyXG5pbXBvcnQge0VuZ2luZU1hZ2ljU2VydmljZX0gZnJvbSAnLi9lbmdpbmUubWFnaWMuc2VydmljZSc7XHJcbmltcG9ydCB7Q29udHJvbE1ldGFkYXRhLCBSZWNvcmRzfSBmcm9tICcuLi9jb250cm9scy5tZXRhZGF0YS5tb2RlbCc7XHJcbmltcG9ydCB7Q29tbWFuZFR5cGUsIEN1c3RvbVZhbGlkYXRvciwgR3VpQ29tbWFuZCwgR3VpQ29uc3RhbnRzLCBHdWlJbnRlcmFjdGl2ZSwgSHRtbFByb3BlcnRpZXN9IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuXHJcbmltcG9ydCB7TlN0cmluZywgU3RyaW5nQnVpbGRlcn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1N0b3JhZ2VBdHRyaWJ1dGV9IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge2dldEd1aUV2ZW50T2JqLCBJR3VpRXZlbnR9IGZyb20gJ0BtYWdpYy14cGEvZW5naW5lJztcclxuaW1wb3J0IHtTdWJmb3JtTWFnaWNTZXJ2aWNlfSBmcm9tICcuL3N1YmZvcm0ubWFnaWMuc2VydmljZSc7XHJcbmltcG9ydCB7VGl0bGVNYWdpY1NlcnZpY2V9IGZyb20gJy4vdGl0bGUubWFnaWMuc2VydmljZSc7XHJcbmltcG9ydCB7QWNjZXNzb3JNYWdpY1NlcnZpY2V9IGZyb20gJy4vYWNjZXNzb3IubWFnaWMuc2VydmljZSc7XHJcbmltcG9ydCB7R3VpSW50ZXJhY3RpdmVFeGVjdXRvcn0gZnJvbSAnLi4vdWkvR3VpSW50ZXJhY3RpdmVFeGVjdXRvcic7XHJcbmltcG9ydCB7T3ZlcmxheVdpbmRvd1NlcnZpY2V9IGZyb20gJy4vT3ZlcmxheVdpbmRvd1NlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIE1haW4gc2VydmljZSB0byBjb25uZWN0IHRoZSBVSSB3aXRoIHRoZSBNYWdpYyBXZWJDTGllbnRcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRhc2tNYWdpY1NlcnZpY2Uge1xyXG5cclxuICAvKipcclxuICAgKiBTZXJ2aWNlIHRvIHByb3ZpZGUgdGFibGUtcmVsYXRlZCBmdW5jdGlvbmFsaXRpZXNcclxuICAgKi9cclxuICBwdWJsaWMgdGFibGVTZXJ2aWNlOiBhbnk7XHJcbiAgLyoqXHJcbiAgICogQ29sbGVjdGlvbiBvZiBkYXRhIGZvciBhbGwgY29udHJvbHNcclxuICAgKi9cclxuICBSZWNvcmRzOiBhbnkgPSBuZXcgUmVjb3JkcygpO1xyXG4gIC8qKlxyXG4gICAqIEZvcm1Hcm91cCBjb2xsZWN0aW9uIGZvciBsaW5lIG1vZGVcclxuICAgKi9cclxuICBmb3JtR3JvdXBzOiBBcnJheTxGb3JtR3JvdXA+ID0gW107XHJcbiAgLyoqXHJcbiAgICogRm9ybUdyb3VwIGZvciBhbGwgY29udHJvbHMgaW4gc2NyZWVuIG1vZGVcclxuICAgKi9cclxuICBTY3JlZW5Nb2RlQ29udHJvbHM6IEZvcm1Hcm91cDtcclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcmVmcmVzaERvbTogU3ViamVjdDxHdWlDb21tYW5kPiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHN1YnNjcmliZVJlZnJlc2hEb206IFN1YnNjcmlwdGlvbjtcclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgZGV0ZWN0Q2hhbmdlczogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc3Vic2NyaWJlSW50ZXJhY3RpdmVDb21tYW5kczogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgaW50ZXJhY3RpdmVDb21tYW5kczogU3ViamVjdDxHdWlJbnRlcmFjdGl2ZT49IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKiBUaGlzIGV2ZW50IGlzIGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0ZWQgcm93IGluIGEgdGFibGUgY2hhbmdlcy5cclxuICAgKi9cclxuICBPblNlbGVjdGVkUm93Q2hhbmdlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGN1c3RvbVByb3BlcnRpZXNTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHJlY29yZHNDb3VudENoYW5nZVN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIG1nTG9hZFN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwdWJsaWMgdGVtcGxhdGU6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmc7IH07XHJcbiAgLyoqXHJcbiAgICogU2VydmljZSB0byBwcm92aWRlIHN1YmZvcm0tcmVsYXRlZCBmdW5jdGlvbmFsaXRpZXNcclxuICAgKi9cclxuICBwdWJsaWMgbWdTdWJmb3JtU2VydmljZTogU3ViZm9ybU1hZ2ljU2VydmljZTtcclxuICAvKipcclxuICAgKiBTZXJ2aWNlIHRvIHByb3ZpZGUgdGhlIHRpdGxlLWNoYW5nZSBmdW5jdGlvbmFsaXR5XHJcbiAgICovXHJcbiAgcHVibGljIG1nVGl0bGVTZXJ2aWNlOiBUaXRsZU1hZ2ljU2VydmljZTtcclxuICAvKipcclxuICAgKiBTZXJ2aWNlIHdoaWNoIGVuYWJsZXMgZ2V0dGluZy9zZXR0aW5nIHZhbHVlcyBmcm9tL3RvIHRoZSBNYWdpYyBXZWJDbGllbnQgZW5naW5lXHJcbiAgICovXHJcbiAgcHVibGljIG1nQWNjZXNzb3JTZXJ2aWNlOiBBY2Nlc3Nvck1hZ2ljU2VydmljZTtcclxuXHJcbiAgcHVibGljIG1nSW5wdXREYXRlRm9ybWF0O1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgb2xkUGFnZVNpemUgPSAwO1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSAgbWFnaWNcclxuICAgKi9cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbWFnaWM6IEVuZ2luZU1hZ2ljU2VydmljZSwgcHJpdmF0ZSBvdmVybGF5V2luZG93U2VydmljZTogT3ZlcmxheVdpbmRvd1NlcnZpY2UpIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5zZXRHdWlUb3BJbmRleCgwKTtcclxuICAgIHRoaXMubWdJbnB1dERhdGVGb3JtYXQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgIC8qKlxyXG4gICAqIHJldHVybnMgdHJ1ZSBpZiB1c2VkIGlzIGxvZ2dlZCBpblxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgcHVibGljIGdldElzTG9nZ2VuSW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYWdpYy5nZXRJc0xvZ2dlZEluKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJZCBvZiB0YXNrIHRvIHdoaWNoIHRoaXMgc2VydmljZSByZWZlcnNcclxuICAgKi9cclxuICBfdGFza0lkOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIHJldHVybnMgdGhlIHRhc2sgSWRcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGdldCB0YXNrSWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFza0lkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgdGFzayBJZFxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdGFzayBpZCB0byBzZXRcclxuICAgKi9cclxuICBzZXQgdGFza0lkKHZhbHVlKSB7XHJcbiAgICAvLyBkZWJ1Z2dlcjtcclxuICAgIHRoaXMuX3Rhc2tJZCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdGFzaydzIGRhdGEgaW4gU2NyZWVuIG1vZGVcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGdldCBTY3JlZW5Db250cm9sc0RhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5SZWNvcmRzLmxpc3RbJzAnXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzZXR0ZW1wbGF0ZSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnRlbXBsYXRlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIHRoZSBGb3JtQ29udHJvbCBmb3IgZWFjaCBhbmQgZXZlcnkgY29udHJvbFxyXG4gICAqL1xyXG4gIGJ1aWxkU2NyZWVuTW9kZUNvbnRyb2xzKCkge1xyXG4gICAgY29uc3QgZ3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy50ZW1wbGF0ZSkge1xyXG5cclxuICAgICAgaWYgKHRoaXMudGVtcGxhdGVba2V5XSA9PSAnMCcpIHtcclxuICAgICAgICBsZXQgZmMgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xyXG4gICAgICAgIHRoaXMuc2V0U3R1YlZhbHVlKDAsIGZjLCBrZXkpO1xyXG4gICAgICAgIGdyb3VwLmFkZENvbnRyb2woa2V5LCBmYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLlNjcmVlbk1vZGVDb250cm9scyA9IGdyb3VwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSXMgdGhlIGNvbnRyb2wgYSB0YWJsZSBjb250cm9sXHJcbiAgICogQHBhcmFtIGlkIElkIG9mIHRoZSBjb250cm9sXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBpc1RhYmxlQ29udHJvbChpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVtpZF0gPT0gJzEnO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWdJbnB1dERhdGVGb3JtYXQoKTogc3RyaW5nIHtyZXR1cm4gdGhpcy5tZ0lucHV0RGF0ZUZvcm1hdDt9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIEZvcm1Db250cm9sIG9mIGEgY29udHJvbFxyXG4gICAqIEBwYXJhbSBndWlSb3dpZCBJZCBvZiB0aGUgcmVxdWVzdGVkIHJvd1xyXG4gICAqIEBwYXJhbSBpZCBJZCBvZiB0aGUgY29udHJvbFxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgZ2V0Rm9ybUNvbnRyb2woZ3VpUm93aWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICBsZXQgYzogQWJzdHJhY3RDb250cm9sO1xyXG4gICAgbGV0IGdyb3VwOiBGb3JtR3JvdXAgPSB0aGlzLmlzVGFibGVDb250cm9sKGlkKSA/IHRoaXMuZm9ybUdyb3Vwc1tndWlSb3dpZF0gOiB0aGlzLlNjcmVlbk1vZGVDb250cm9scztcclxuICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZ3JvdXApKSB7XHJcbiAgICAgIGdyb3VwLmdldChpZCk7XHJcbiAgICAgIGMgPSBncm91cC5jb250cm9sc1tpZF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGhhbmRsZSB0aGUgY2hhbmdlIG9mIHRleHQgZm9yIGlucHV0IGNvbnRyb2wgaW5zaWRlIHRhYmxlXHJcbiAgICogQHBhcmFtICBndWlSb3dJZCBJZCBvZiB0aGUgcm93IGZvciB3aGljaCB0aGUgRm9ybUNvbnRyb2xzIGFyZSBidWlsdFxyXG4gICAqIHNldCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBmb3JtY29udHJvbFxyXG4gICAqL1xyXG4gIHNldElucHV0VGV4dFZhbHVlKGNvbnRyb2xJZDogc3RyaW5nLCBndWlSb3dpZDogc3RyaW5nLCB2YWw6IGFueSkge1xyXG4gICAgdGhpcy5zZXRWYWx1ZShjb250cm9sSWQsIGd1aVJvd2lkLCB0aGlzLkNvbnZlcnRWYWxUb05hdGl2ZShjb250cm9sSWQsIDAsIHZhbCkpO1xyXG5cclxuICAgIGNvbnN0IGZjID0gdGhpcy5nZXRGb3JtQ29udHJvbChndWlSb3dpZCwgY29udHJvbElkKTtcclxuICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQodmFsKSlcclxuICAgICAgZmMuc2V0VmFsdWUodmFsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIHRoZSBGb3JtQ29udHJvbHMgZm9yIGEgdGFibGUgcm93XHJcbiAgICogQHBhcmFtICBndWlSb3dJZCBJZCBvZiB0aGUgcm93IGZvciB3aGljaCB0aGUgRm9ybUNvbnRyb2xzIGFyZSBidWlsdFxyXG4gICAqL1xyXG4gIGJ1aWxkVGFibGVSb3dDb250cm9scyhndWlSb3dJZDogbnVtYmVyKSB7XHJcblxyXG4gICAgY29uc3QgZ3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMudGVtcGxhdGUpIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLnRlbXBsYXRlW2tleV0gPT0gJzEnKSB7XHJcbiAgICAgICAgbGV0IGZjID0gbmV3IEZvcm1Db250cm9sKCcnKTtcclxuICAgICAgICB0aGlzLnNldFN0dWJWYWx1ZShndWlSb3dJZCwgZmMsIGtleSk7XHJcbiAgICAgICAgZ3JvdXAuYWRkQ29udHJvbChrZXksIGZjKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtR3JvdXBzW2d1aVJvd0lkXSA9IGdyb3VwO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHVwZGF0ZVJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLlJlY29yZHMucmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc2V0SW5jbHVkZXNGaXJzdCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5SZWNvcmRzLmluY2x1ZGVzRmlyc3QgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzZXRJbmNsdWRlc0xhc3QodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5pbmNsdWRlc0xhc3QgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBtYXJrUm93QXNDcmVhdGVkKGd1aVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5tYXJrUm93QXNDcmVhdGVkKGd1aVJvd0lkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBtYXJrUm93QXNOb3RDcmVhdGVkKGd1aVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5tYXJrUm93QXNOb3RDcmVhdGVkKGd1aVJvd0lkKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc3RhcnRSb3dFZGl0aW5nKGd1aVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5zdGFydFJvd0VkaXRpbmcoZ3VpUm93SWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHN0b3BSb3dFZGl0aW5nKGd1aVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5zdG9wUm93RWRpdGluZyhndWlSb3dJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgaXNSb3dJblJvd0VkaXRpbmcoZ3VpUm93SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuUmVjb3Jkcy5pc1Jvd0luUm93RWRpdGluZyhndWlSb3dJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc2V0SXNFbXB0eURhdGFWaWV3KGlzRW1wdHk6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLlJlY29yZHMuaXNFbXB0eURhdGFWaWV3ICE9PSBpc0VtcHR5KSB7XHJcblxyXG4gICAgICBpZiAoaXNFbXB0eSlcclxuICAgICAgICB0aGlzLnJlY29yZHNDb3VudENoYW5nZVN1YmplY3QubmV4dCgwKTtcclxuXHJcbiAgICAgIHRoaXMuUmVjb3Jkcy5pc0VtcHR5RGF0YVZpZXcgPSBpc0VtcHR5O1xyXG4gICAgICB0aGlzLnRhYmxlU2VydmljZS5yZWZyZXNoRGF0YVNvdXJjZSgpO1xyXG4gICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplIHRoZSBzZXJ2aWNlIHRvIHdvcmsgd2l0aCB0aGUgdGFza1xyXG4gICAqIEBwYXJhbSB0YXNrSWQgSWQgb2YgdGhlIHRhc2tcclxuICAgKiBAcGFyYW0gdGFza0Rlc2NyaXB0aW9uXHJcbiAgICovXHJcbiAgaW5pdFRhc2sodGFza0lkLCB0YXNrRGVzY3JpcHRpb24pIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5jcmVhdGVGaXJzdCgpO1xyXG4gICAgdGhpcy5vbGRQYWdlU2l6ZSA9IDA7XHJcbiAgICBpZiAodGhpcy5Jc1N0dWIoKSkge1xyXG4gICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRhc2tJZCA9IHRhc2tJZDtcclxuICAgICAgdGhpcy5zZXR0ZW1wbGF0ZSh0YXNrRGVzY3JpcHRpb24pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5idWlsZFNjcmVlbk1vZGVDb250cm9scygpO1xyXG5cclxuICAgIC8vIHJlbW92ZSBwcmV2aW91cyBzdWJzY3JpcHRpb25zXHJcbiAgICBpZighaXNOdWxsT3JVbmRlZmluZWQodGhpcy5zdWJzY3JpYmVSZWZyZXNoRG9tKSlcclxuICAgICAgdGhpcy5zdWJzY3JpYmVSZWZyZXNoRG9tLnVuc3Vic2NyaWJlKCk7XHJcbiAgICBpZighaXNOdWxsT3JVbmRlZmluZWQodGhpcy5zdWJzY3JpYmVJbnRlcmFjdGl2ZUNvbW1hbmRzKSlcclxuICAgICAgdGhpcy5zdWJzY3JpYmVJbnRlcmFjdGl2ZUNvbW1hbmRzLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpYmVSZWZyZXNoRG9tID0gdGhpcy5tYWdpYy5yZWZyZXNoRG9tLnBpcGUoZmlsdGVyKGNvbW1hbmQgPT4gY29tbWFuZC5UYXNrVGFnID09PSB0aGlzLnRhc2tJZCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoY29tbWFuZCA9PiB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJUYXNrIFwiICsgY29tbWFuZC5UYXNrVGFnICsgXCJjb21tYW5kIFwiICsgY29tbWFuZC5Db21tYW5kVHlwZSk7XHJcbiAgICAgICAgdGhpcy5leGVjdXRlQ29tbWFuZChjb21tYW5kKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnN1YnNjcmliZUludGVyYWN0aXZlQ29tbWFuZHMgPSB0aGlzLm1hZ2ljLmludGVyYWN0aXZlQ29tbWFuZHNcclxuICAgICAgLnBpcGUoZmlsdGVyKGNvbW1hbmQgPT4gY29tbWFuZC5UYXNrVGFnID09PSB0aGlzLnRhc2tJZCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoY29tbWFuZCA9PiB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJUYXNrIFwiICsgY29tbWFuZC5UYXNrVGFnICsgXCJjb21tYW5kIFwiICsgY29tbWFuZC5Db21tYW5kVHlwZSk7XHJcbiAgICAgICAgdGhpcy5leGVjdXRlSW50ZXJhY3RpdmVDb21tYW5kKGNvbW1hbmQpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHJlZnJlc2hWaWV3KCkge1xyXG4gICAgdGhpcy5kZXRlY3RDaGFuZ2VzLm5leHQoJycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0IGFuIGV2ZW50IHRvIHRoZSBNYWdpYyBXZWJDbGllbnQgZXZlbnQgcXVldWVcclxuICAgKiBAcGFyYW0gZ3VpRXZlbnQgVGhlIGV2ZW50IHRvIGluc2VydFxyXG4gICAqL1xyXG4gIGluc2VydEV2ZW50KGd1aUV2ZW50OiBJR3VpRXZlbnQpOiB2b2lkIHtcclxuICAgIGd1aUV2ZW50LlRhc2tJRCA9IHRoaXMudGFza0lkO1xyXG4gICAgdGhpcy5tYWdpYy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgR2V0Q29udHJvbFBpY3R1cmVNYXNrKGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMubWFnaWMuR2V0Q29udHJvbFBpY3R1cmVNYXNrKHRoaXMudGFza0lkLCBjb250cm9sTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgdGhlIGNvbnRyb2wgdmFsdWUsIHVzaW5nIHRoZSBNYWdpYyBXZWJDbGllbnRcclxuICAgKiBAcGFyYW0gY29udHJvbE5hbWUgSWQgb2YgdmFsaWRhdGVkIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkXHJcbiAgICogQHJldHVybnMgSWYgdmFsaWRhdGlvbiBmYWlscywgcmV0dXJucyBlcnJvciBtZXNzYWdlLCBlbHNlIHJldHVybnMgbnVsbFxyXG4gICAqL1xyXG4gIFZhbGlkYXRlQ29udHJvbFZhbHVlKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubWFnaWMuVmFsaWRhdGVDb250cm9sVmFsdWUodGhpcy50YXNrSWQsIGNvbnRyb2xOYW1lLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgR2V0UmFuZ2VkVmFsdWUoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5tYWdpYy5HZXRSYW5nZWRWYWx1ZSh0aGlzLnRhc2tJZCwgY29udHJvbE5hbWUsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBHZXRGbGRSYW5nZXMoY29udHJvbE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5tYWdpYy5HZXRGbGRSYW5nZXModGhpcy50YXNrSWQsIGNvbnRyb2xOYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHJldHVybnMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gY29udHJvbElkIElkIG9mIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gcHJvcCBQcm9wZXJ0eVxyXG4gICAqIEBwYXJhbSBndWlSb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcmV0dXJucyBQcm9wZXJ0eSB2YWx1ZVxyXG4gICAqL1xyXG4gIGdldFByb3BlcnR5KGNvbnRyb2xJZDogc3RyaW5nLCBwcm9wOiBIdG1sUHJvcGVydGllcywgZ3VpUm93SWQ/OiBzdHJpbmcpIHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChndWlSb3dJZCkpXHJcbiAgICAgIGd1aVJvd0lkID0gJzAnO1xyXG4gICAgaWYgKHRoaXMuSXNTdHViKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5U3R1Yih0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0sIGNvbnRyb2xJZCwgcHJvcCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHJlYyA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXTtcclxuICAgICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHJlYykpXHJcbiAgICAgICAgZGVidWdnZXI7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldFByb3BlcnR5KGNvbnRyb2xJZCwgcHJvcCk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGdldFByb3BlcnR5U3R1YihDb250cm9sc1Byb3BlcnRpZXM6IGFueSwgY29udHJvbElkLCBwcm9wKSB7XHJcbiAgICBDb250cm9sc1Byb3BlcnRpZXMgPSBDb250cm9sc1Byb3BlcnRpZXMuQ29udHJvbHNQcm9wZXJ0aWVzO1xyXG4gICAgaWYgKGNvbnRyb2xJZCBpbiBDb250cm9sc1Byb3BlcnRpZXMpIHtcclxuICAgICAgaWYgKHByb3AgaW4gQ29udHJvbHNQcm9wZXJ0aWVzW2NvbnRyb2xJZF0ucHJvcGVydGllcykge1xyXG4gICAgICAgIHJldHVybiBDb250cm9sc1Byb3BlcnRpZXNbY29udHJvbElkXS5wcm9wZXJ0aWVzW3Byb3BdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgZ2V0U3R5bGVTdHViKENvbnRyb2xzUHJvcGVydGllczogYW55LCBjb250cm9sSWQsIHN0eWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBDb250cm9sc1Byb3BlcnRpZXMgPSBDb250cm9sc1Byb3BlcnRpZXMuQ29udHJvbHNQcm9wZXJ0aWVzO1xyXG4gICAgcmV0dXJuIENvbnRyb2xzUHJvcGVydGllc1tjb250cm9sSWRdLnN0eWxlc01hcC5nZXQoc3R5bGVOYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgQ1NTIGNsYXNzZXMgdXNlZCBmb3IgdGhpcyBjb250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtIGd1aVJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEByZXR1cm5zIFN0cmluZyBjb250YWluaW5nIHRoZSBjbGFzc2VzIGN1cnJlbnRseSBkZWZpbmVkIGZvciB0aGlzIGNvbnRyb2xcclxuICAgKi9cclxuICBnZXRDbGFzc2VzKGNvbnRyb2xJZDogc3RyaW5nLCBndWlSb3dJZD86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZ3VpUm93SWQpKVxyXG4gICAgICBndWlSb3dJZCA9ICcwJztcclxuICAgIHJldHVybiB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCkuY2xhc3NlcztcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgc3R5bGUgdXNlZCBmb3IgYSBjb250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtIHN0eWxlTmFtZSBOYW1lIG9mIHN0eWxlXHJcbiAgICogQHBhcmFtIGd1aVJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEByZXR1cm5zIHZhbHVlIG9mIHN0eWxlIG9mIHRoZSBjb250cm9sXHJcbiAgICovXHJcbiAgZ2V0U3R5bGUoY29udHJvbElkOiBzdHJpbmcsIHN0eWxlTmFtZTogc3RyaW5nLCBndWlSb3dJZD86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZ3VpUm93SWQpKVxyXG4gICAgICBndWlSb3dJZCA9ICcwJztcclxuICAgIGlmICh0aGlzLklzU3R1YigpKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRTdHlsZVN0dWIodGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLCBjb250cm9sSWQsIHN0eWxlTmFtZSk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG1hZ2ljVmFsdWUgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCkuc3R5bGVzTWFwLmdldChzdHlsZU5hbWUpO1xyXG4gICAgICByZXR1cm4gU3R5bGVzTWFwTWFuYWdlci5tYWdpY1ZhbHVlR2V0U3R5bGUoc3R5bGVOYW1lLCBtYWdpY1ZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgdmFsdWUgb2YgYSBjb250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtIGd1aVJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEByZXR1cm5zIHZhbHVlIG9mIHRoZSBjb250cm9sXHJcbiAgICovXHJcbiAgZ2V0VmFsdWUoY29udHJvbElkOiBzdHJpbmcsIGd1aVJvd0lkPzogc3RyaW5nKSB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZ3VpUm93SWQpKVxyXG4gICAgICBndWlSb3dJZCA9ICcwJztcclxuICAgIHJldHVybiB0aGlzLlJlY29yZHMubGlzdC5sZW5ndGggPiArZ3VpUm93SWQgPyB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0udmFsdWVzW2NvbnRyb2xJZF0gOiAnJztcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGZvcm1hdHRlZCB2YWx1ZSBvZiBhIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gY29udHJvbElkIElkIG9mIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gZ3VpUm93SWQgUm93IElkLCBpZiBhcHBsaWNhYmxlXHJcbiAgICogQHJldHVybnMgdmFsdWUgb2YgdGhlIGNvbnRyb2xcclxuICAgKi9cclxuICBnZXRGb3JtYXR0ZWRWYWx1ZShjb250cm9sTmFtZTogc3RyaW5nLCB2YWw6IGFueSwgcm93SWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hZ2ljLkdldEZvcm1hdHRlZFZhbHVlKHRoaXMudGFza0lkLCBjb250cm9sTmFtZSwgdmFsLCByb3dJZCk7XHJcbiB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgY29udHJvbFxyXG4gICAqIEBwYXJhbSBjb250cm9sSWQgSWQgb2YgY29udHJvbFxyXG4gICAqIEBwYXJhbSBndWlSb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc2V0XHJcbiAgICovXHJcbiAgc2V0VmFsdWUoY29udHJvbElkOiBzdHJpbmcsIGd1aVJvd0lkOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHJldHVybiB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uc2V0VmFsdWUoY29udHJvbElkLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGV4ZWN1dGVJbnRlcmFjdGl2ZUNvbW1hbmQoZ3VpSW50ZXJhY3RpdmVDb21tYW5kOiBHdWlJbnRlcmFjdGl2ZSlcclxuICB7XHJcbiAgICBHdWlJbnRlcmFjdGl2ZUV4ZWN1dG9yLmV4ZWN1dGVJbnRlcmFjdGl2ZUNvbW1hbmQodGhpcywgZ3VpSW50ZXJhY3RpdmVDb21tYW5kLCB0aGlzLm92ZXJsYXlXaW5kb3dTZXJ2aWNlKTtcclxuICAgIHRoaXMuaW50ZXJhY3RpdmVDb21tYW5kcy5uZXh0KGd1aUludGVyYWN0aXZlQ29tbWFuZClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBoYW5kbGVTZXRQcm9wZXJ0eShjb21tYW5kOiBHdWlDb21tYW5kLCBpc1RhYmxlQ2hpbGQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBjb250cm9sSWQgPSBjb21tYW5kLkN0cmxOYW1lO1xyXG4gICAgbGV0IGR2Um93SWQ6IG51bWJlciA9IChjb21tYW5kLmxpbmUgfHwgMCk7XHJcbiAgICBsZXQgZ3VpUm93SWQ6IG51bWJlciA9IHRoaXMuZ2V0R3VpUm93SWQoZHZSb3dJZCwgaXNUYWJsZUNoaWxkKTtcclxuICAgIGxldCBwcm9wZXJ0aWVzOiBDb250cm9sTWV0YWRhdGE7XHJcblxyXG4gICAgaWYgKGNvbW1hbmQuT3BlcmF0aW9uID09PSBIdG1sUHJvcGVydGllcy5TZWxlY3RlZFJvdykge1xyXG4gICAgICBpZiAoY29tbWFuZC5vYmoxICE9PSBHdWlDb25zdGFudHMuTk9fUk9XX1NFTEVDVEVEKSB7XHJcbiAgICAgICAgZ3VpUm93SWQgPSB0aGlzLmdldEd1aVJvd0lkKGNvbW1hbmQub2JqMSwgdHJ1ZSk7XHJcbiAgICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuICAgICAgICBwcm9wZXJ0aWVzLnByb3BlcnRpZXMuc2V0KGNvbW1hbmQuT3BlcmF0aW9uLCBjb21tYW5kLmxpbmUpO1xyXG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLnNlbGVjdFJvdyhndWlSb3dJZC50b1N0cmluZygpKTtcclxuICAgICAgICB0aGlzLk9uU2VsZWN0ZWRSb3dDaGFuZ2VkLmVtaXQoZ3VpUm93SWQudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoY29tbWFuZC5PcGVyYXRpb24gPT09IEh0bWxQcm9wZXJ0aWVzLkVuYWJsZWQpIHtcclxuICAgICAgbGV0IGMgPSB0aGlzLmdldEZvcm1Db250cm9sKGd1aVJvd0lkLnRvU3RyaW5nKCksIGNvbnRyb2xJZCk7XHJcbiAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoYykpIHtcclxuICAgICAgICBpZiAoY29tbWFuZC5vYmoxKVxyXG4gICAgICAgICAgYy5lbmFibGUoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBjLmRpc2FibGUoKTtcclxuICAgICAgfVxyXG4gICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICBwcm9wZXJ0aWVzLnByb3BlcnRpZXMuc2V0KGNvbW1hbmQuT3BlcmF0aW9uLCBjb21tYW5kLm9iajEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuICAgICAgcHJvcGVydGllcy5wcm9wZXJ0aWVzLnNldCg8SHRtbFByb3BlcnRpZXM+Y29tbWFuZC5PcGVyYXRpb24sIGNvbW1hbmQub2JqMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZXhlY3V0ZUNvbW1hbmQoY29tbWFuZDogR3VpQ29tbWFuZCk6IHZvaWQge1xyXG4gICAgbGV0IGR2Um93SWQ6IG51bWJlciA9IChjb21tYW5kLmxpbmUgfHwgMCk7XHJcbiAgICBsZXQgZ3VpUm93SWQ6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgY29udHJvbElkID0gY29tbWFuZC5DdHJsTmFtZTtcclxuICAgIGxldCBwcm9wZXJ0aWVzOiBDb250cm9sTWV0YWRhdGE7XHJcbiAgICBsZXQgaXNUYWJsZUNoaWxkOiBib29sZWFuID0gdGhpcy5pc1RhYmxlQ29udHJvbChjb250cm9sSWQpO1xyXG5cclxuICAgIC8vIEZvciBub24taW5wdXQgdHlwZSBjb250cm9scyBvbiB0YWJsZS5cclxuICAgIGlmIChjb21tYW5kLm9iaiAhPT0gbnVsbClcclxuICAgICAgaXNUYWJsZUNoaWxkID0gaXNUYWJsZUNoaWxkIHx8IGNvbW1hbmQub2JqLklzVGFibGVDaGlsZDtcclxuXHJcbiAgICBndWlSb3dJZCA9IHRoaXMuZ2V0R3VpUm93SWQoZHZSb3dJZCwgaXNUYWJsZUNoaWxkKTtcclxuXHJcbiAgICBzd2l0Y2ggKGNvbW1hbmQuQ29tbWFuZFR5cGUpIHtcclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfSVNfTE9HR0VEX0lOOlxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfVEFCTEVfVE9QX0lOREVYOlxyXG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLnNldFRhYmxlVG9wSW5kZXgoY29tbWFuZC5udW1iZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlJFRlJFU0hfVEFTSzpcclxuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5yZWZyZXNoRGF0YVNvdXJjZSgpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaFZpZXcoKTtcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lURU1TX0NPVU5UOlxyXG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoY29tbWFuZC5udW1iZXIpKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS51cGRhdGVUYWJsZVNpemUoY29tbWFuZC5udW1iZXIpO1xyXG5cclxuICAgICAgICAgIGlmIChjb21tYW5kLm51bWJlciA+IDAgJiYgdGhpcy5SZWNvcmRzLnNpemVVcGRhdGVkICYmXHJcbiAgICAgICAgICAgICF0aGlzLlJlY29yZHMuaXNFbXB0eURhdGFWaWV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb3Jkc0NvdW50Q2hhbmdlU3ViamVjdC5uZXh0KGNvbW1hbmQubnVtYmVyKTtcclxuICAgICAgICAgICAgdGhpcy5SZWNvcmRzLnNpemVVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9DSFVOS19TSVpFOlxyXG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoY29tbWFuZC5udW1iZXIpKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5zZXRDaHVua1NpemUoY29tbWFuZC5udW1iZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfUkVDT1JEU19CRUZPUkVfQ1VSUkVOVF9WSUVXOlxyXG4gICAgICAgIHRoaXMudXBkYXRlUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KGNvbW1hbmQubnVtYmVyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuQ1JFQVRFX1RBQkxFX1JPVzpcclxuICAgICAgICBndWlSb3dJZCA9IHRoaXMuZ2V0R3VpUm93SWQoY29tbWFuZC5udW1iZXIsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuYnVpbGRUYWJsZVJvd0NvbnRyb2xzKGd1aVJvd0lkKTtcclxuICAgICAgICB0aGlzLm1hcmtSb3dBc0NyZWF0ZWQoZ3VpUm93SWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfSVNfUk9XX0VESVRJTkc6XHJcbiAgICAgICAgZ3VpUm93SWQgPSB0aGlzLmdldEd1aVJvd0lkKGNvbW1hbmQubGluZSwgY29tbWFuZC52YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5zdGFydFJvd0VkaXRpbmcoZ3VpUm93SWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfTk9UX0lTX1JPV19FRElUSU5HOlxyXG4gICAgICAgIGd1aVJvd0lkID0gdGhpcy5nZXRHdWlSb3dJZChjb21tYW5kLmxpbmUsIGNvbW1hbmQudmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc3RvcFJvd0VkaXRpbmcoZ3VpUm93SWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuVU5ET19DUkVBVEVfVEFCTEVfUk9XOlxyXG4gICAgICAgIHRoaXMubWFya1Jvd0FzTm90Q3JlYXRlZCh0aGlzLmdldEd1aVJvd0lkKGNvbW1hbmQubnVtYmVyLCB0cnVlKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfVEFCTEVfSU5DTFVERVNfRklSU1Q6XHJcbiAgICAgICAgdGhpcy5zZXRJbmNsdWRlc0ZpcnN0KGNvbW1hbmQuQm9vbDEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19MQVNUOlxyXG4gICAgICAgIHRoaXMuc2V0SW5jbHVkZXNMYXN0KGNvbW1hbmQuQm9vbDEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZOlxyXG4gICAgICAgIHRoaXMuaGFuZGxlU2V0UHJvcGVydHkoY29tbWFuZCwgaXNUYWJsZUNoaWxkKTtcclxuICAgICAgICBpZiAoY29tbWFuZC5PcGVyYXRpb24gPT0gSHRtbFByb3BlcnRpZXMuUmVhZE9ubHkgfHxcclxuICAgICAgICAgIGNvbW1hbmQuT3BlcmF0aW9uID09IEh0bWxQcm9wZXJ0aWVzLkl0ZW1zTGlzdCB8fFxyXG4gICAgICAgICAgY29tbWFuZC5PcGVyYXRpb24gPT0gSHRtbFByb3BlcnRpZXMuQ2hlY2tCb3hJbmRldGVybWluYXRlKVxyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoRG9tLm5leHQoY29tbWFuZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlBST1BfU0VUX1VTRVJfUFJPUEVSVFk6XHJcbiAgICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuICAgICAgICAvLyBpZiB0aGUgcHJvcGVydHkgaGFzIGNoYW5nZWQsIHNldCB0aGUgcHJvcGVydHkgYW5kIHJhaXNlIHRoZSBzdWJqZWN0XHJcbiAgICAgICAgaWYocHJvcGVydGllcy51c2VyUHJvcGVydGllcy5nZXQoY29tbWFuZC5PcGVyYXRpb24pIT09IGNvbW1hbmQub2JqMSkge1xyXG4gICAgICAgICAgcHJvcGVydGllcy51c2VyUHJvcGVydGllcy5zZXQoY29tbWFuZC5PcGVyYXRpb24sIGNvbW1hbmQub2JqMSk7XHJcbiAgICAgICAgICAvLyB0aGUgcHJvcGVydHkgbmFtZSBpcyBvZiBmb3JtYXQgPGNvbnRyb2xOYW1lPn48cHJvcGVydHlOYW1lPlxyXG4gICAgICAgICAgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzU3ViamVjdC5uZXh0KHsgcHJvcGVydHlOYW1lOiBjb250cm9sSWQgKyAnficgKyBjb21tYW5kLk9wZXJhdGlvbiwgdmFsdWU6IGNvbW1hbmQub2JqMSwgcm93SWQ6IGd1aVJvd0lkIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuUFJPUF9TRVRfQ1VTVE9NX1ZBTElEQVRPUjoge1xyXG4gICAgICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuXHJcbiAgICAgICAgICBsZXQgY29udHJvbCA9IHRoaXMuZ2V0Rm9ybUNvbnRyb2woZ3VpUm93SWQudG9TdHJpbmcoKSwgY29udHJvbElkKTtcclxuICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcHJvcGVydGllcy5jdXN0b21WYWxpZGF0b3JzLnNldChjb21tYW5kLk9wZXJhdGlvbiwgY29tbWFuZC5vYmoxKTtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsaWRhdG9yICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFtjb250cm9sLnZhbGlkYXRvciwgdGhpcy5jdXN0b21WYWxpZGF0b3IoZ3VpUm93SWQudG9TdHJpbmcoKSwgY29udHJvbElkKV0pO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuY3VzdG9tVmFsaWRhdG9yKGd1aVJvd0lkLnRvU3RyaW5nKCksIGNvbnRyb2xJZCkpO1xyXG5cclxuICAgICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX0NMQVNTOlxyXG4gICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcbiAgICAgICAgcHJvcGVydGllcy5zZXRDbGFzcyhjb21tYW5kLk9wZXJhdGlvbiwgY29tbWFuZC5vYmoxKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX1NUWUxFOlxyXG4gICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcbiAgICAgICAgcHJvcGVydGllcy5zZXRTdHlsZShjb21tYW5kLk9wZXJhdGlvbiwgY29tbWFuZC5vYmoxKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX0FUVFJJQlVURTpcclxuICAgICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbMF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcbiAgICAgICAgcHJvcGVydGllcy5kYXRhVHlwZSA9IDxTdG9yYWdlQXR0cmlidXRlPlN0cmluZy5mcm9tQ2hhckNvZGUoY29tbWFuZC5udW1iZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAgQ29tbWFuZFR5cGUuU0VUX1ZBTFVFOlxyXG4gICAgICAgIHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS52YWx1ZXNbY29udHJvbElkXSA9IGNvbW1hbmQudmFsdWU7XHJcbiAgICAgICAgbGV0IGMgPSB0aGlzLmdldEZvcm1Db250cm9sKGd1aVJvd0lkLnRvU3RyaW5nKCksIGNvbnRyb2xJZCk7XHJcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChjKSkge1xyXG4gICAgICAgICAgYy5zZXRWYWx1ZSh0aGlzLkNvbnZlcnRWYWxGcm9tTmF0aXZlKGNvbnRyb2xJZCwgY29tbWFuZC5saW5lLCBjb21tYW5kLnZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuQ1JFQVRFX1NVQl9GT1JNOlxyXG4gICAgICAgIHRoaXMubWdTdWJmb3JtU2VydmljZS5hZGRTdWJmb3JtQ29tcChjb21tYW5kLkN0cmxOYW1lLCBjb21tYW5kLnVzZXJEcm9wRm9ybWF0LnRvU3RyaW5nKCksIGNvbW1hbmQuc3RyLCBjb21tYW5kLmZpbGVOYW1lLCBjb21tYW5kLmNvbnRleHRJRCwgY29tbWFuZC5wYXJhbXMsIGNvbW1hbmQuQm9vbDEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5DTE9TRV9TVUJfRk9STTpcclxuICAgICAgICB0aGlzLm1nU3ViZm9ybVNlcnZpY2UuZGVsZXRlU3ViZm9ybUNvbXAoY29tbWFuZC5DdHJsTmFtZSwgY29tbWFuZC51c2VyRHJvcEZvcm1hdC50b1N0cmluZygpKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX0VNUFRZX0RBVEFWSUVXOlxyXG4gICAgICAgIHRoaXMuc2V0SXNFbXB0eURhdGFWaWV3KGNvbW1hbmQuQm9vbDEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfRk9DVVM6XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRG9tLm5leHQoY29tbWFuZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9XQ19JRExFOlxyXG4gICAgICAgIHRoaXMubWdMb2FkU3ViamVjdC5uZXh0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgY3VzdG9tIHZhbGlkYXRvclxyXG4gICovXHJcbiAgY3VzdG9tVmFsaWRhdG9yKHJvd2lkOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBWYWxpZGF0b3JGbiB7XHJcblxyXG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzID0+IHtcclxuICAgICAgbGV0IGNvbnRyb2xNZXRhZGF0YTogQ29udHJvbE1ldGFkYXRhO1xyXG4gICAgICBjb250cm9sTWV0YWRhdGEgPSB0aGlzLlJlY29yZHMubGlzdFtyb3dpZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGlkKTtcclxuICAgICAgZm9yIChsZXQga2V5IG9mIGNvbnRyb2xNZXRhZGF0YS5jdXN0b21WYWxpZGF0b3JzLmtleXMoKSkge1xyXG4gICAgICAgIGxldCB2YWxpZGF0b3IgPSBjb250cm9sTWV0YWRhdGEuY3VzdG9tVmFsaWRhdG9ycy5nZXQoa2V5KTtcclxuICAgICAgICBpZiAoISg8Q3VzdG9tVmFsaWRhdG9yPnZhbGlkYXRvcikuaXNWYWxpZCgpKSB7XHJcbiAgICAgICAgICByZXR1cm4geyBba2V5XTogdHJ1ZSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDT252ZXJ0IGEgdmFsdWUgZnJvbSBNYWdpYyBmb3JtYXQgdG8gbmF0aXZlIGZvcm1hdFxyXG4gICAqIEBwYXJhbSBjb250cm9sSWQgSWQgb2YgY29udHJvbFxyXG4gICAqIEBwYXJhbSAgcm93SWQgUm93IElkLCBpZiBhcHBsaWNhYmxlXHJcbiAgICogQHBhcmFtIHZhbCBWYWx1ZSB0byBjb252ZXJ0XHJcbiAgICogQHJldHVybnMgQ29udmVydGVkIHZhbHVlXHJcbiAgICovXHJcbiAgQ29udmVydFZhbFRvTmF0aXZlKGNvbnRyb2xJZDogc3RyaW5nLCByb3dJZDogbnVtYmVyLCB2YWw6IGFueSk6IGFueSB7XHJcblxyXG4gICAgbGV0IHByb3BlcnRpZXM6IENvbnRyb2xNZXRhZGF0YTtcclxuICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFswXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuXHJcbiAgICBzd2l0Y2ggKHByb3BlcnRpZXMuZGF0YVR5cGUpIHtcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBsZXQgcmFuZ2VzOiBzdHJpbmcgPSB0aGlzLkdldEZsZFJhbmdlcyhjb250cm9sSWQpO1xyXG4gICAgICAgICAgbGV0IGZvdW5kOiBudW1iZXIgPSByYW5nZXMuaW5kZXhPZignLCcpO1xyXG4gICAgICAgICAgbGV0IHRydWVPcHRpb246IHN0cmluZyA9IHJhbmdlcy5zdWJzdHIoMCwgZm91bmQpO1xyXG4gICAgICAgICAgbGV0IGZhbHNlT3B0aW9uOiBzdHJpbmcgPSByYW5nZXMuc3Vic3RyKGZvdW5kICsgMSk7XHJcbiAgICAgICAgICBpZiAoTlN0cmluZy5FcXVhbHModmFsLCB0cnVlT3B0aW9uLCB0cnVlKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICBlbHNlIGlmIChOU3RyaW5nLkVxdWFscyh2YWwsIGZhbHNlT3B0aW9uLCB0cnVlKSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6IHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpe1xyXG4gICAgICAgIGxldCBpZHggPSB2YWwuaW5kZXhPZignOicsMCk7XHJcbiAgICAgICAgbGV0IGhvdXJzOiBudW1iZXIgPSArdmFsLnN1YnN0cigwLCBpZHgpO1xyXG4gICAgICAgIGxldCBtaW51dGVzOiBudW1iZXIgPSArdmFsLnN1YnN0cihpZHgrMSwgMik7XHJcbiAgICAgICAgbGV0IHNlY29uZHMgPSAwO1xyXG4gICAgICAgIGlmICh2YWwubGVuZ3RoID4gNSkge1xyXG4gICAgICAgICAgaWR4ID0gdmFsLmluZGV4T2YoJzonLCBpZHggKyAxKTtcclxuICAgICAgICAgIGlmIChpZHggPj0gMClcclxuICAgICAgICAgICAgc2Vjb25kcyA9ICt2YWwuc3Vic3RyKGlkeCArIDEsIDIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsLmluZGV4T2YoJ1BNJyk+MClcclxuICAgICAgICAgIGhvdXJzICs9IDEyO1xyXG4gICAgICAgIGxldCBkdDogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgZHQuc2V0SG91cnMoaG91cnMpO1xyXG4gICAgICAgIGR0LnNldE1pbnV0ZXMobWludXRlcyk7XHJcbiAgICAgICAgZHQuc2V0U2Vjb25kcyhzZWNvbmRzKTtcclxuXHJcblxyXG4gICAgICAgIHJldHVybiBkdDtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbCkpXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICAgIGVsc2UgcmV0dXJuICh2YWwgIT0gbnVsbCkgPyAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpID8gdmFsIDogK3ZhbCA6IG51bGw7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgYSB2YWx1ZSBmcm9tIG5hdGl2ZSB0byBNYWdpYyBmb3JtYXRcclxuICAgKiBAcGFyYW0gY29udHJvbElkIElkIG9mIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gIHJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEBwYXJhbSB2YWwgVmFsdWUgdG8gY29udmVydFxyXG4gICAqIEByZXR1cm5zIENvbnZlcnRlZCB2YWx1ZVxyXG4gICAqL1xyXG4gIENvbnZlcnRWYWxGcm9tTmF0aXZlKGNvbnRyb2xJZDogc3RyaW5nLCByb3dJZDogbnVtYmVyLCB2YWw6IGFueSk6IGFueSB7XHJcblxyXG4gICAgbGV0IHByb3BlcnRpZXM6IENvbnRyb2xNZXRhZGF0YTtcclxuICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFswXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuXHJcbiAgICBzd2l0Y2ggKHByb3BlcnRpZXMuZGF0YVR5cGUpIHtcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOiB7XHJcbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgIGxldCBzdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgICAgICAgbGV0IGZvcm1hdDogc3RyaW5nID0gdmFsLmdldEhvdXJzKCkgPiA5ID8gJ3swfScgOiAnMHswfSc7XHJcbiAgICAgICAgICBzdHIuQXBwZW5kRm9ybWF0KGZvcm1hdCwgdmFsLmdldEhvdXJzKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICBzdHIuQXBwZW5kKCc6Jyk7XHJcbiAgICAgICAgICBmb3JtYXQgPSB2YWwuZ2V0TWludXRlcygpID4gOSA/ICd7MH0nIDogJzB7MH0nO1xyXG4gICAgICAgICAgc3RyLkFwcGVuZEZvcm1hdChmb3JtYXQsIHZhbC5nZXRNaW51dGVzKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICBpZiAoIHZhbC5nZXRTZWNvbmRzKCkgPiAwKSB7XHJcbiAgICAgICAgICAgIHN0ci5BcHBlbmQoJzonKTtcclxuICAgICAgICAgICAgZm9ybWF0ID0gdmFsLmdldFNlY29uZHMoKSA+IDkgPyAnezB9JyA6ICcwezB9JztcclxuICAgICAgICAgICAgc3RyLkFwcGVuZEZvcm1hdChmb3JtYXQsIHZhbC5nZXRTZWNvbmRzKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gc3RyLlRvU3RyaW5nKCk7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOiB7XHJcbiAgICAgICAgbGV0IHByb3BlcnRpZXM6IENvbnRyb2xNZXRhZGF0YTtcclxuICAgICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbJzAnXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nICYmIHByb3BlcnRpZXMucmFuZ2VWYWxpZGF0b3IpIHtcclxuICAgICAgICAgIGxldCByYW5nZXM6IHN0cmluZyA9IHRoaXMuR2V0RmxkUmFuZ2VzKGNvbnRyb2xJZCk7XHJcbiAgICAgICAgICBsZXQgZm91bmQ6IG51bWJlciA9IHJhbmdlcy5pbmRleE9mKCcsJyk7XHJcbiAgICAgICAgICBsZXQgdHJ1ZU9wdGlvbjogc3RyaW5nID0gcmFuZ2VzLnN1YnN0cigwLCBmb3VuZCk7XHJcbiAgICAgICAgICBsZXQgZmFsc2VPcHRpb246IHN0cmluZyA9IHJhbmdlcy5zdWJzdHIoZm91bmQgKyAxKTtcclxuICAgICAgICAgIGlmICh2YWwpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlT3B0aW9uO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VPcHRpb247XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgcmVzaXplIGFuZCBhbHNvIGZldGNoIGNodW5rIG9mIHJlY29yZHMgaWYgaGF2aW5nIGFuIGVtcHR5IHZpZXcuXHJcbiAgICogQGlnbm9yZVxyXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSA6IFBhZ2VTaXplXHJcbiAgICogQHBhcmFtIHRvcEd1aVJvd0lkIDogR3VpUm93SWQgb2YgZmlyc3QgcmVjb3JkIGluIHZpZXcuXHJcbiAgICovXHJcbiAgIHJlc2l6ZShwYWdlU2l6ZTogbnVtYmVyLCB0b3BHdWlSb3dJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgZ3VpRXZlbnQ6IElHdWlFdmVudCA9IGdldEd1aUV2ZW50T2JqKCdyZXNpemUnLCAndGFibGUnLCAwKTtcclxuICAgIGd1aUV2ZW50LlBhZ2VTaXplID0gcGFnZVNpemU7XHJcblxyXG4gICAgLy9BcyAnZ2V0Um93cycgZXZlbnQgYWxzbyBnZXRzIGV4ZWN1dGVkLCBzZXQgdGhlIGd1aUV2ZW50LkxpbmUgcGFyYW1ldGVyLlxyXG4gICAgZ3VpRXZlbnQuTGluZSA9IHRvcEd1aVJvd0lkO1xyXG4gICAgdGhpcy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGRhdGEgZm9yIG5ldyB0YWJsZSByb3dzIHdoZW4gc2Nyb2xsaW5nIGRvbmVcclxuICAgKi9cclxuICBvblNjcm9sbERvd24oKSB7XHJcbiAgICBpZiAoIXRoaXMuUmVjb3Jkcy5pbmNsdWRlc0xhc3QpIHtcclxuICAgICAgbGV0IGd1aUV2ZW50OiBJR3VpRXZlbnQgPSBnZXRHdWlFdmVudE9iaignZ2V0Um93cycsICcnLCAwKTtcclxuICAgICAgZ3VpRXZlbnQuTGluZSA9IHRoaXMuZm9ybUdyb3Vwcy5sZW5ndGg7XHJcbiAgICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgbmV3IGJyb3dzZXIgd2luZG93IHRpdGxlXHJcbiAgICogQHBhcmFtIG5ld1RpdGxlIE5ldyB3aW5kb3cgdGl0bGVcclxuICAgKi9cclxuICBzZXRUaXRsZShuZXdUaXRsZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLm1nVGl0bGVTZXJ2aWNlLnNldFRpdGxlKG5ld1RpdGxlKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgZ2V0R3VpUm93SWQoZHZSb3dJZDogbnVtYmVyLCBpc1RhYmxlQ29udHJvbDogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGlzVGFibGVDb250cm9sID8gZHZSb3dJZCArIHRoaXMuUmVjb3Jkcy5yZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgOiAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGdldER2Um93SWQoZ3VpUm93SWQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGd1aVJvd0lkIC0gdGhpcy5SZWNvcmRzLnJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhbiB1cCB0aGUgc2VydmljZSB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWRcclxuICAgKi9cclxuICBkaXNwb3NlKCkge1xyXG4gICAgIHRoaXMucmVmcmVzaERvbS5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5kZXRlY3RDaGFuZ2VzLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZUludGVyYWN0aXZlQ29tbWFuZHMudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlUmVmcmVzaERvbS51bnN1YnNjcmliZSgpO1xyXG4gICAgIHRoaXMuaW50ZXJhY3RpdmVDb21tYW5kcy5jb21wbGV0ZSgpO1xyXG4gICAgIHRoaXMuY3VzdG9tUHJvcGVydGllc1N1YmplY3QuY29tcGxldGUoKTtcclxuICAgICB0aGlzLk9uU2VsZWN0ZWRSb3dDaGFuZ2VkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgLy9FdmVudHM6XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSB0aGUgQ29tYm9ib3ggXCJjaGFuZ2VcIiBldmVudFxyXG4gICAqIEBwYXJhbSBldmVudCAgVGhlIGV2ZW50IHJlY2VpdmVkIGZyb20gdGhlIFVJXHJcbiAgICogQHBhcmFtIGlkeCBJZCBvZiB0aGUgY29udHJvbCByYWlzaW5nIHRoZSBldmVudFxyXG4gICAqIEBwYXJhbSBsaW5lIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqL1xyXG4gIG9uQ29tYm9ib3hTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50OiBFdmVudCwgaWR4OiBzdHJpbmcsIGxpbmU6IG51bWJlcikge1xyXG4gICAgbGV0IGd1aUV2ZW50OiBJR3VpRXZlbnQgPSBnZXRHdWlFdmVudE9iaignc2VsZWN0aW9uY2hhbmdlZCcsIGlkeCwgbGluZSk7XHJcblxyXG4gICAgaWYgKHR5cGVvZiAoZXZlbnQpID09ICdudW1iZXInKSB7XHJcbiAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSBldmVudDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICBsZXQgaW5kZXhlczogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPigoPGFueT5ldmVudC50YXJnZXQpLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICg8YW55PmV2ZW50LnRhcmdldCkuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpbmRleGVzW2ldID0gKDxIVE1MT3B0aW9uRWxlbWVudD4oPGFueT5ldmVudC50YXJnZXQpLnNlbGVjdGVkT3B0aW9uc1tpXSkuaW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSBpbmRleGVzLmpvaW4oJywnKTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSAoPGFueT5ldmVudCkudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgdGhlIExpc3Rib3ggXCJjaGFuZ2VcIiBldmVudFxyXG4gICAqIEBwYXJhbSAgZXZlbnQgVGhlIGV2ZW50IHJlY2VpdmVkIGZyb20gdGhlIFVJXHJcbiAgICogQHBhcmFtIGlkeCBJZCBvZiB0aGUgY29udHJvbCByYWlzaW5nIHRoZSBldmVudFxyXG4gICAqL1xyXG4gIG9uTGlzdEJveFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQ6IEV2ZW50LCBpZHg6IHN0cmluZykge1xyXG4gICAgbGV0IGd1aUV2ZW50OiBJR3VpRXZlbnQgPSBnZXRHdWlFdmVudE9iaignc2VsZWN0aW9uY2hhbmdlZCcsIGlkeCwgMCk7XHJcblxyXG4gICAgbGV0IHNlbGVjdGVkT3B0aW9ucztcclxuICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZXZlbnQudGFyZ2V0KSlcclxuICAgICAgc2VsZWN0ZWRPcHRpb25zID0gKDxhbnk+ZXZlbnQudGFyZ2V0KS5zZWxlY3RlZE9wdGlvbnM7XHJcbiAgICBlbHNlXHJcbiAgICAgIHNlbGVjdGVkT3B0aW9ucyA9ICg8YW55PmV2ZW50KS5zb3VyY2Uuc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkO1xyXG5cclxuICAgIGxldCBsZW5ndGggPSBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoO1xyXG4gICAgbGV0IGluZGV4ZXM6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4obGVuZ3RoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZXZlbnQudGFyZ2V0KSlcclxuICAgICAgICBpbmRleGVzW2ldID0gKHNlbGVjdGVkT3B0aW9uc1tpXSkuaW5kZXg7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBpbmRleGVzW2ldID0gKHNlbGVjdGVkT3B0aW9uc1tpXSkudmFsdWU7XHJcbiAgICB9XHJcbiAgICBndWlFdmVudC5WYWx1ZSA9IDxhbnk+aW5kZXhlczsgLy8gVE9ETzogZml4XHJcbiAgICB0aGlzLmluc2VydEV2ZW50KGd1aUV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSB0aGUgQ2hlY2tib3ggXCJjaGFuZ2VcIiBldmVudFxyXG4gICAqIEBwYXJhbSAgZXZlbnQgVGhlIGV2ZW50IHJlY2VpdmVkIGZyb20gdGhlIFVJXHJcbiAgICogQHBhcmFtIGlkeCBJZCBvZiB0aGUgY29udHJvbCByYWlzaW5nIHRoZSBldmVudFxyXG4gICAqIEBwYXJhbSAgcm93SWQgUm93IElkLCBpZiBhcHBsaWNhYmxlXHJcbiAgICovXHJcbiAgb25DaGVja0NoYW5nZWQoZXZlbnQ6IEV2ZW50LCBpZHg6IHN0cmluZywgcm93SWQ6IG51bWJlcikge1xyXG4gICAgaWYgKHR5cGVvZiByb3dJZCA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgIHJvd0lkID0gMDtcclxuICAgIGxldCBndWlFdmVudDogSUd1aUV2ZW50ID0gZ2V0R3VpRXZlbnRPYmooJ3NlbGVjdGlvbmNoYW5nZWQnLCBpZHgsIHJvd0lkKTtcclxuXHJcbiAgICBpZiAodHlwZW9mIChldmVudCkgPT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSBldmVudDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYodHlwZW9mIChldmVudCkgPT0gJ3N0cmluZycpIHtcclxuICAgICAgaWYoZXZlbnQgPT0gXCJ1bmNoZWNrZWRcIilcclxuICAgICAgeyAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKCBldmVudCA9PSAnaW5kZXRlcm1pbmF0ZScpXHJcbiAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSBudWxsO1xyXG4gICAgICBlbHNlIGlmKGV2ZW50ID09ICdjaGVja2VkJylcclxuICAgICAgeyAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgZ3VpRXZlbnQuVmFsdWUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50LnRhcmdldCA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIGd1aUV2ZW50LlZhbHVlID0gKDxhbnk+KGV2ZW50KSkuY2hlY2tlZDtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGd1aUV2ZW50LlZhbHVlID0gKDxhbnk+KGV2ZW50LnRhcmdldCkpLmNoZWNrZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgdGFiIHNlbGVjdGlvbiBjaGFuZ2UsIGNhdXNlZCBieSBVSSBldmVudHNcclxuICAgKiBAcGFyYW0gaWR4IElkIG9mIHRoZSBjb250cm9sIHJhaXNpbmcgdGhlIGV2ZW50XHJcbiAgICogQHBhcmFtICBsYXllciBJZCBvZiBzZWxlY3RlZCB0YWJwYWdlXHJcbiAgICovXHJcbiAgbWdPblRhYlNlbGVjdGlvbkNoYW5nZWQoaWR4OiBzdHJpbmcsIGxheWVyOiBudW1iZXIpIHtcclxuICAgIGxldCBndWlFdmVudDogSUd1aUV2ZW50ID0gZ2V0R3VpRXZlbnRPYmooJ3NlbGVjdGlvbmNoYW5nZWQnLCBpZHgsIDApO1xyXG4gICAgZ3VpRXZlbnQuVmFsdWUgPSBsYXllci50b1N0cmluZygpO1xyXG4gICAgdGhpcy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHRoZSBSYWRpbyBidXR0b24gXCJjaGFuZ2VcIiBldmVudFxyXG4gICAqIEBwYXJhbSAgZXZlbnQgVGhlIGV2ZW50IHJlY2VpdmVkIGZyb20gdGhlIFVJXHJcbiAgICogQHBhcmFtIGlkeCBJZCBvZiB0aGUgY29udHJvbCByYWlzaW5nIHRoZSBldmVudFxyXG4gICAqL1xyXG4gIG1nT25SYWRpb1NlbGVjdGlvbkNoYW5nZWQoaWR4OiBzdHJpbmcpIHtcclxuICAgIGxldCByZXN1bHQgPSB0aGlzLmdldEZvcm1Db250cm9sKCcwJywgaWR4KTtcclxuICAgIGxldCBndWlFdmVudDogSUd1aUV2ZW50ID0gZ2V0R3VpRXZlbnRPYmooJ3NlbGVjdGlvbmNoYW5nZWQnLCBpZHgsIDApO1xyXG4gICAgaWYodHlwZW9mIHJlc3VsdC52YWx1ZSAhPT0gJ251bWJlcicpXHJcbiAgICAgIGd1aUV2ZW50LlZhbHVlID0gcmVzdWx0LnZhbHVlLmluZGV4O1xyXG4gICAgZWxzZVxyXG4gICAgICBndWlFdmVudC5WYWx1ZSA9ICByZXN1bHQudmFsdWUudG9TdHJpbmcoKTtcclxuICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0cyB0aGUgXCJjbG9zZVwiIGV2ZW50IHRvIHRoZSBtYWdpYyBXZWJDbGllbnQgZXZlbnQgcXVldWVcclxuICAgKi9cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ2V0R3VpRXZlbnRPYmooJ2Nsb3NlJywgbnVsbCwgMCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBJc1N0dWIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYWdpYy5pc1N0dWI7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAvLy9TdHViIGhhbmRsaW5nXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGpzb25EYXRhOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzYXZlRGF0YShkYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubWFnaWMuc2F2ZURhdGEoZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHVibGljIGNyZWF0ZURhdGEoKSB7XHJcbiAgICBsZXQgbXlEYXRhID0ge1xyXG4gICAgICByZWNvcmRzOiB0aGlzLlJlY29yZHMsXHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRlbXBsYXRlXHJcbiAgICB9O1xyXG4gICAgbGV0IHRleHQ6IHN0cmluZyA9ICdsb2FkRGF0YSgpOmFueSAgIHtcXG4nICtcclxuICAgICAgJyAgICBsZXQgc3R1YkRhdGEgPSAnICsgSlNPTi5zdHJpbmdpZnkobXlEYXRhKSArICc7XFxuJyArXHJcbiAgICAgICcgICAgdGhpcy5sb2FkU3R1YkRhdGEoc3R1YkRhdGEpO30nO1xyXG4gICAgY29uc29sZS5sb2codGV4dCk7XHJcbiAgICB0aGlzLnNhdmVEYXRhKHRleHQpO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwdWJsaWMgbG9hZFN0dWJEYXRhKHN0dWJEYXRhOiBhbnkpIHtcclxuXHJcbiAgICB0aGlzLlJlY29yZHMgPSBzdHViRGF0YS5yZWNvcmRzO1xyXG4gICAgdGhpcy5zZXR0ZW1wbGF0ZShzdHViRGF0YS50ZW1wbGF0ZSk7XHJcbiAgICB0aGlzLnRhc2tJZCA9ICcxJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5SZWNvcmRzLmxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICAgIHRoaXMuYnVpbGRUYWJsZVJvd0NvbnRyb2xzKGkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBsb2FkRGF0YSgpIHtcclxuICAgIGFsZXJ0KCdQbGVhc2UsIG92ZXJ3cml0ZSBtZXRob2QgbG9hZERhdGEnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzZXRTdHViVmFsdWUoZ3VpUm93SWQ6IG51bWJlciwgZmM6IEZvcm1Db250cm9sLCBuYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLklzU3R1YigpKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHZhbCA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS52YWx1ZXNbbmFtZV07XHJcbiAgICAgICAgZmMuc2V0VmFsdWUodmFsKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBFbmQgb2Ygc3R1YiBoYW5kbGluXHJcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxufVxyXG5cclxuIl19