@magic-xpa/gui 4.800.0 → 4.801.0-dev000.0

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 (128) hide show
  1. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/{esm2015/magic-xpa-gui.js → esm2020/magic-xpa-gui.mjs} +0 -0
  3. package/esm2020/src/Commands.mjs +186 -0
  4. package/esm2020/src/Events.mjs +420 -0
  5. package/esm2020/src/EventsProcessor.mjs +67 -0
  6. package/esm2020/src/FocusManager.mjs +34 -0
  7. package/{esm2015/src/GuiConstants.js → esm2020/src/GuiConstants.mjs} +0 -0
  8. package/{esm2015/src/GuiEnums.js → esm2020/src/GuiEnums.mjs} +0 -0
  9. package/{esm2015/src/GuiEnvironment.js → esm2020/src/GuiEnvironment.mjs} +0 -0
  10. package/{esm2015/src/IFlowMonitorQueue.js → esm2020/src/IFlowMonitorQueue.mjs} +2 -1
  11. package/esm2020/src/Manager.mjs +192 -0
  12. package/{esm2015/src/UIBridge.js → esm2020/src/UIBridge.mjs} +0 -0
  13. package/{esm2015/src/env/IEnvironment.js → esm2020/src/env/IEnvironment.mjs} +1 -0
  14. package/{esm2015/src/gui/ControlBase.js → esm2020/src/gui/ControlBase.mjs} +0 -0
  15. package/{esm2015/src/gui/GuiMgControl.js → esm2020/src/gui/GuiMgControl.mjs} +0 -0
  16. package/{esm2015/src/gui/GuiMgForm.js → esm2020/src/gui/GuiMgForm.mjs} +0 -0
  17. package/{esm2015/src/gui/KeyboardItem.js → esm2020/src/gui/KeyboardItem.mjs} +0 -0
  18. package/{esm2015/src/gui/LastFocusedVal.js → esm2020/src/gui/LastFocusedVal.mjs} +0 -0
  19. package/{esm2015/src/gui/MgValue.js → esm2020/src/gui/MgValue.mjs} +0 -0
  20. package/{esm2015/src/gui/PropParentInterface.js → esm2020/src/gui/PropParentInterface.mjs} +1 -0
  21. package/{esm2015/src/gui/low/DialogHandler.js → esm2020/src/gui/low/DialogHandler.mjs} +0 -0
  22. package/{esm2015/src/gui/low/GuiCommand.js → esm2020/src/gui/low/GuiCommand.mjs} +0 -0
  23. package/{esm2015/src/gui/low/GuiCommandQueue.js → esm2020/src/gui/low/GuiCommandQueue.mjs} +0 -0
  24. package/esm2020/src/gui/low/GuiInteractive.mjs +545 -0
  25. package/{esm2015/src/gui/low/Style.js → esm2020/src/gui/low/Style.mjs} +0 -0
  26. package/{esm2015/src/management/RuntimeContextBase.js → esm2020/src/management/RuntimeContextBase.mjs} +0 -0
  27. package/{esm2015/src/management/data/BlobType.js → esm2020/src/management/data/BlobType.mjs} +0 -0
  28. package/esm2020/src/management/data/DcValues.mjs +214 -0
  29. package/esm2020/src/management/data/DcValuesBuilderBase.mjs +97 -0
  30. package/{esm2015/src/management/data/FieldDef.js → esm2020/src/management/data/FieldDef.mjs} +0 -0
  31. package/{esm2015/src/management/data/FieldsTable.js → esm2020/src/management/data/FieldsTable.mjs} +0 -0
  32. package/esm2020/src/management/data/GuiDataViewBase.mjs +90 -0
  33. package/esm2020/src/management/data/GuiFieldBase.mjs +82 -0
  34. package/{esm2015/src/management/data/IRecord.js → esm2020/src/management/data/IRecord.mjs} +1 -0
  35. package/{esm2015/src/management/data/IReferencedObject.js → esm2020/src/management/data/IReferencedObject.mjs} +1 -0
  36. package/{esm2015/src/management/data/NUM_TYPE.js → esm2020/src/management/data/NUM_TYPE.mjs} +0 -0
  37. package/esm2020/src/management/data/ObjectReferenceBase.mjs +48 -0
  38. package/{esm2015/src/management/data/ObjectReferencesCollection.js → esm2020/src/management/data/ObjectReferencesCollection.mjs} +0 -0
  39. package/esm2020/src/management/data/RecordUtils.mjs +361 -0
  40. package/{esm2015/src/management/data/VectorType.js → esm2020/src/management/data/VectorType.mjs} +0 -0
  41. package/{esm2015/src/management/data/VectorTypeBase.js → esm2020/src/management/data/VectorTypeBase.mjs} +0 -0
  42. package/{esm2015/src/management/events/IActionManager.js → esm2020/src/management/events/IActionManager.mjs} +1 -0
  43. package/esm2020/src/management/events/IGuiEventsManager.mjs +2 -0
  44. package/{esm2015/src/management/exp/ExpressionInterface.js → esm2020/src/management/exp/ExpressionInterface.mjs} +0 -0
  45. package/esm2020/src/management/exp/GuiExpressionEvaluator.mjs +333 -0
  46. package/{esm2015/src/management/gui/ControlTable.js → esm2020/src/management/gui/ControlTable.mjs} +0 -0
  47. package/esm2020/src/management/gui/DisplayConvertor.mjs +1706 -0
  48. package/esm2020/src/management/gui/FieldValidator.mjs +1507 -0
  49. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +22 -0
  50. package/{esm2015/src/management/gui/GuiFormPropertyAdapter.js → esm2020/src/management/gui/GuiFormPropertyAdapter.mjs} +0 -0
  51. package/{esm2015/src/management/gui/HebrewDate.js → esm2020/src/management/gui/HebrewDate.mjs} +0 -0
  52. package/{esm2015/src/management/gui/Helps.js → esm2020/src/management/gui/Helps.mjs} +0 -0
  53. package/esm2020/src/management/gui/MgControlBase.mjs +1873 -0
  54. package/esm2020/src/management/gui/MgFormBase.mjs +748 -0
  55. package/{esm2015/src/management/gui/PIC.js → esm2020/src/management/gui/PIC.mjs} +0 -0
  56. package/esm2020/src/management/gui/PropDefaults.mjs +230 -0
  57. package/{esm2015/src/management/gui/PropInterface.js → esm2020/src/management/gui/PropInterface.mjs} +0 -0
  58. package/esm2020/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2020/src/management/gui/Property.mjs +1382 -0
  60. package/{esm2015/src/management/gui/ValidationDetails.js → esm2020/src/management/gui/ValidationDetails.mjs} +0 -0
  61. package/{esm2015/src/management/gui/ValidationDetailsBase.js → esm2020/src/management/gui/ValidationDetailsBase.mjs} +0 -0
  62. package/{esm2015/src/management/gui/WrongFormatException.js → esm2020/src/management/gui/WrongFormatException.mjs} +0 -0
  63. package/{esm2015/src/management/tasks/GuiDataCollection.js → esm2020/src/management/tasks/GuiDataCollection.mjs} +0 -0
  64. package/esm2020/src/management/tasks/GuiTaskBase.mjs +502 -0
  65. package/{esm2015/src/management/tasks/IMGDataTable.js → esm2020/src/management/tasks/IMGDataTable.mjs} +1 -0
  66. package/{esm2015/src/management/tasks/ITask.js → esm2020/src/management/tasks/ITask.mjs} +1 -0
  67. package/esm2020/src/management/tasks/MgTimer.mjs +21 -0
  68. package/{esm2015/src/management/tasks/TaskDefinitionId.js → esm2020/src/management/tasks/TaskDefinitionId.mjs} +0 -0
  69. package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
  70. package/{esm2015/src/util/AuthenticationDialogHandler.js → esm2020/src/util/AuthenticationDialogHandler.mjs} +0 -0
  71. package/{esm2015/src/util/MemoryUtil.js → esm2020/src/util/MemoryUtil.mjs} +0 -0
  72. package/{esm2015/src/util/ObjectReference.js → esm2020/src/util/ObjectReference.mjs} +0 -0
  73. package/esm2020/src/util/ProcessLauncher.mjs +32 -0
  74. package/esm2020/src/util/UsernamePasswordCredentials.mjs +52 -0
  75. package/fesm2015/{magic-xpa-gui.js → magic-xpa-gui.mjs} +133 -175
  76. package/fesm2015/magic-xpa-gui.mjs.map +1 -0
  77. package/fesm2020/magic-xpa-gui.mjs +17805 -0
  78. package/fesm2020/magic-xpa-gui.mjs.map +1 -0
  79. package/package.json +27 -14
  80. package/src/Events.d.ts +2 -2
  81. package/src/EventsProcessor.d.ts +1 -1
  82. package/src/IFlowMonitorQueue.d.ts +1 -1
  83. package/src/Manager.d.ts +2 -3
  84. package/src/management/data/DcValues.d.ts +1 -1
  85. package/src/management/data/DcValuesBuilderBase.d.ts +1 -1
  86. package/src/management/data/RecordUtils.d.ts +0 -3
  87. package/src/management/events/IGuiEventsManager.d.ts +5 -5
  88. package/src/management/exp/GuiExpressionEvaluator.d.ts +2 -2
  89. package/src/management/gui/DisplayConvertor.d.ts +6 -6
  90. package/src/management/gui/GuiControlPropertyAdapter.d.ts +6 -6
  91. package/src/management/gui/MgControlBase.d.ts +2 -4
  92. package/src/management/gui/MgFormBase.d.ts +1 -1
  93. package/src/management/gui/PropTable.d.ts +1 -1
  94. package/src/management/gui/Property.d.ts +2 -2
  95. package/src/management/tasks/GuiTaskBase.d.ts +3 -3
  96. package/src/util/ProcessLauncher.d.ts +1 -3
  97. package/bundles/magic-xpa-gui.umd.js +0 -19431
  98. package/bundles/magic-xpa-gui.umd.js.map +0 -1
  99. package/bundles/magic-xpa-gui.umd.min.js +0 -16
  100. package/bundles/magic-xpa-gui.umd.min.js.map +0 -1
  101. package/esm2015/src/Commands.js +0 -189
  102. package/esm2015/src/Events.js +0 -420
  103. package/esm2015/src/EventsProcessor.js +0 -68
  104. package/esm2015/src/FocusManager.js +0 -41
  105. package/esm2015/src/Manager.js +0 -197
  106. package/esm2015/src/gui/low/GuiInteractive.js +0 -545
  107. package/esm2015/src/management/data/DcValues.js +0 -214
  108. package/esm2015/src/management/data/DcValuesBuilderBase.js +0 -97
  109. package/esm2015/src/management/data/GuiDataViewBase.js +0 -90
  110. package/esm2015/src/management/data/GuiFieldBase.js +0 -85
  111. package/esm2015/src/management/data/ObjectReferenceBase.js +0 -48
  112. package/esm2015/src/management/data/RecordUtils.js +0 -447
  113. package/esm2015/src/management/events/IGuiEventsManager.js +0 -1
  114. package/esm2015/src/management/exp/GuiExpressionEvaluator.js +0 -333
  115. package/esm2015/src/management/gui/DisplayConvertor.js +0 -1706
  116. package/esm2015/src/management/gui/FieldValidator.js +0 -1507
  117. package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +0 -4
  118. package/esm2015/src/management/gui/MgControlBase.js +0 -1981
  119. package/esm2015/src/management/gui/MgFormBase.js +0 -763
  120. package/esm2015/src/management/gui/PropDefaults.js +0 -230
  121. package/esm2015/src/management/gui/PropTable.js +0 -224
  122. package/esm2015/src/management/gui/Property.js +0 -1402
  123. package/esm2015/src/management/tasks/GuiTaskBase.js +0 -506
  124. package/esm2015/src/management/tasks/MgTimer.js +0 -21
  125. package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +0 -41
  126. package/esm2015/src/util/ProcessLauncher.js +0 -32
  127. package/esm2015/src/util/UsernamePasswordCredentials.js +0 -52
  128. package/fesm2015/magic-xpa-gui.js.map +0 -1
@@ -0,0 +1,1507 @@
1
+ import { DateTime, Exception, NChar, NNumber, NString, NumberFormatInfo, StringBuilder } from '@magic-xpa/mscorelib';
2
+ import { DisplayConvertor } from './DisplayConvertor';
3
+ import { DateUtil, HTML_2_STR, MgControlType, MsgInterface, PICInterface, StorageAttribute, StrUtil, UtilDateJpn, UtilStrByteMode } from '@magic-xpa/utils';
4
+ import { Events } from '../../Events';
5
+ import { WrongFormatException } from './WrongFormatException';
6
+ import { DateElement } from '../../GuiEnums';
7
+ import { NUM_TYPE } from '../data/NUM_TYPE';
8
+ import { HebrewDate } from './HebrewDate';
9
+ import { BlobType } from '../data/BlobType';
10
+ import { GuiEnvironment } from '../../GuiEnvironment';
11
+ import { PropInterface } from "./PropInterface";
12
+ export class FieldValidator {
13
+ constructor() {
14
+ this._newvalue = null;
15
+ this._oldvalue = null;
16
+ this._pictureReal = null;
17
+ this._pictureEnable = null;
18
+ this._valDet = null;
19
+ this._isPm = false;
20
+ this._picture = null;
21
+ this.hebrew = false;
22
+ this._decimal = null;
23
+ this._environment = null;
24
+ this._environment = GuiEnvironment.Environment;
25
+ this._decimal = (this._environment.GetDecimal() || "");
26
+ }
27
+ checkVal(valDet) {
28
+ this._newvalue = (this._oldvalue = (this._pictureReal = (this._pictureEnable = null)));
29
+ this.init(valDet);
30
+ valDet.setValidationFailed(false);
31
+ let ctrl = valDet.getControl();
32
+ let modInQueuy = ctrl.isRepeatable() ? false : ctrl.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFY_IN_QUERY, false, ctrl.getDisplayLine(false));
33
+ let useNative = ctrl.isModifiable();
34
+ if (ctrl.getForm().getTask().getMode() === 'E' && !modInQueuy) {
35
+ valDet.setValue(this._oldvalue);
36
+ return valDet;
37
+ }
38
+ if (ctrl.Type === MgControlType.CTRL_TYPE_RADIO || ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX || ctrl.Type === MgControlType.CTRL_TYPE_TAB || ctrl.isSelectionCtrl()) {
39
+ try {
40
+ if (ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX) {
41
+ valDet.setNull(ctrl.isNullValue(this._newvalue));
42
+ }
43
+ if (this._newvalue !== null && ctrl.isSelectionCtrl()) {
44
+ let idx = NNumber.Parse(this._newvalue);
45
+ if (ctrl.isChoiceNull(idx)) {
46
+ valDet.setNull(true);
47
+ }
48
+ }
49
+ }
50
+ catch (ex_111) {
51
+ if (ex_111 instanceof Exception) {
52
+ }
53
+ else
54
+ throw ex_111;
55
+ }
56
+ valDet.setValue(this._newvalue);
57
+ return valDet;
58
+ }
59
+ if (ctrl.DataType !== StorageAttribute.ALPHA && ctrl.DataType !== StorageAttribute.UNICODE && ctrl.DataType !== StorageAttribute.BLOB) {
60
+ if ((typeof this._newvalue === 'string' && this._newvalue.trim().length === 0) || (ctrl.DataType === StorageAttribute.DATE && (ctrl.isDateZero(this._newvalue) || this.isNullDisplayVal()))) {
61
+ let field = ctrl.getField();
62
+ let defaultValue = field.getDefaultValue();
63
+ let text = null;
64
+ if (field.isNullDefault()) {
65
+ valDet.setNull(true);
66
+ text = field.getNullDisplay();
67
+ if (NString.IsNullOrEmpty(text) && ctrl.DataType === StorageAttribute.DATE) {
68
+ text = DisplayConvertor.Instance.mg2disp(defaultValue, valDet.getRange(), valDet.getPIC(), useNative, field.getTask().getCompIdx(), false);
69
+ }
70
+ }
71
+ if (text === null) {
72
+ text = DisplayConvertor.Instance.mg2disp(defaultValue, valDet.getRange(), valDet.getPIC(), useNative, field.getTask().getCompIdx(), false);
73
+ }
74
+ if ((!field.isNullDefault() && (this._valDet.getContinuousRangeValues() !== null || this._valDet.getDiscreteRangeValues() !== null)))
75
+ this._newvalue = text;
76
+ else {
77
+ valDet.setValue(text);
78
+ return valDet;
79
+ }
80
+ }
81
+ }
82
+ if ((typeof this._newvalue === 'string' && !(StrUtil.rtrim(this._newvalue) === StrUtil.rtrim(this._oldvalue))) || ctrl.ModifiedByUser) {
83
+ try {
84
+ switch (valDet.getType()) {
85
+ case StorageAttribute.ALPHA:
86
+ case StorageAttribute.UNICODE:
87
+ valDet.setValue(this.checkAlphaField());
88
+ break;
89
+ case StorageAttribute.NUMERIC:
90
+ this._pictureReal = valDet.getPictureReal();
91
+ this._pictureEnable = valDet.getPictureEnable();
92
+ this.checkNumericPicture();
93
+ valDet.setValue(this.checkNumericField());
94
+ break;
95
+ case StorageAttribute.BOOLEAN:
96
+ valDet.setValue(this.checkLogicalField());
97
+ break;
98
+ case StorageAttribute.DATE:
99
+ valDet.setValue(this.checkDateField());
100
+ break;
101
+ case StorageAttribute.TIME:
102
+ valDet.setValue(this.checkTimeField());
103
+ break;
104
+ case StorageAttribute.BLOB:
105
+ case StorageAttribute.BLOB_VECTOR:
106
+ valDet.setValue(this._newvalue);
107
+ break;
108
+ case StorageAttribute.NONE:
109
+ default:
110
+ Events.WriteExceptionToLog("FieldValidator.checkVal: Type of the field " + valDet.getType());
111
+ break;
112
+ }
113
+ }
114
+ catch (goBack) {
115
+ if (goBack instanceof WrongFormatException) {
116
+ valDet.setValue(this._oldvalue);
117
+ this.setValidationFailed(true);
118
+ if (goBack.getType() !== MsgInterface.STR_RNG_TXT) {
119
+ this.printMessage(goBack.getType(), false);
120
+ this.setValidationFailed(true);
121
+ }
122
+ else
123
+ this.printMessage(MsgInterface.STR_RNG_TXT, true);
124
+ }
125
+ }
126
+ }
127
+ return valDet;
128
+ }
129
+ checkAlphaField() {
130
+ let control = this._valDet.getControl();
131
+ let IsAttrAlpha = this._valDet.getType() === StorageAttribute.ALPHA;
132
+ if (this._newvalue.length === 0 && this._valDet.getContinuousRangeValues() === null && this._valDet.getDiscreteRangeValues() === null) {
133
+ this.setValidationFailed(false);
134
+ return this._newvalue;
135
+ }
136
+ if (IsAttrAlpha && UtilStrByteMode.isLocaleDefLangDBCS()) {
137
+ let picLenB = UtilStrByteMode.lenB(this._picture);
138
+ if (UtilStrByteMode.lenB(this._newvalue) > picLenB) {
139
+ this._newvalue = UtilStrByteMode.leftB(this._newvalue, picLenB);
140
+ }
141
+ }
142
+ else {
143
+ if (this._newvalue.length > this._picture.length) {
144
+ this._newvalue = this._newvalue.substr(0, this._picture.length);
145
+ }
146
+ }
147
+ let stringBuilder = new StringBuilder();
148
+ let currPicture;
149
+ let i = currPicture = 0;
150
+ for (currPicture = i = 0; i < this._newvalue.length && currPicture < this._picture.length;) {
151
+ if (!DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(currPicture)) && this._newvalue.charAt(i) === this._picture.charAt(currPicture)) {
152
+ stringBuilder.Append(this._picture.charAt(currPicture));
153
+ i = i + 1;
154
+ currPicture = currPicture + 1;
155
+ }
156
+ else {
157
+ if (!DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(currPicture)) && this._newvalue.charAt(i) !== this._picture.charAt(currPicture)) {
158
+ stringBuilder.Append(this._picture.charAt(currPicture));
159
+ currPicture = currPicture + 1;
160
+ }
161
+ else {
162
+ if (DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(currPicture)) && this.isPossibleAlphaLetter(i, currPicture)) {
163
+ if (UtilStrByteMode.isLocaleDefLangDBCS()) {
164
+ let strVal = this._newvalue.substr(i, 1);
165
+ if (UtilStrByteMode.lenB(strVal) === 2) {
166
+ if (IsAttrAlpha) {
167
+ if (currPicture + 1 < this._picture.length) {
168
+ if (DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(currPicture + 1)) && this.isPossibleAlphaLetter(i, currPicture + 1)) {
169
+ stringBuilder.Append(this._newvalue.charAt(i));
170
+ i = i + 1;
171
+ currPicture = currPicture + 2;
172
+ }
173
+ else {
174
+ stringBuilder.Append(' ');
175
+ currPicture = currPicture + 1;
176
+ }
177
+ }
178
+ else {
179
+ stringBuilder.Append(' ');
180
+ currPicture = currPicture + 1;
181
+ }
182
+ }
183
+ else {
184
+ stringBuilder.Append(this._newvalue.charAt(i));
185
+ i = i + 1;
186
+ currPicture = currPicture + 1;
187
+ }
188
+ }
189
+ else {
190
+ stringBuilder.Append(this._newvalue.charAt(i));
191
+ i = i + 1;
192
+ currPicture = currPicture + 1;
193
+ }
194
+ }
195
+ else {
196
+ stringBuilder.Append(this._newvalue.charAt(i));
197
+ i = i + 1;
198
+ currPicture = currPicture + 1;
199
+ }
200
+ }
201
+ else {
202
+ stringBuilder.Append(' ');
203
+ currPicture = currPicture + 1;
204
+ if (this._valDet.getControl() !== null) {
205
+ let type = control.Type;
206
+ if (type !== MgControlType.CTRL_TYPE_BUTTON) {
207
+ this.printMessage(MsgInterface.STR_ERR_NUM, false);
208
+ }
209
+ }
210
+ }
211
+ }
212
+ }
213
+ }
214
+ this._newvalue = stringBuilder.ToString();
215
+ if (this._valDet.getContinuousRangeValues() !== null || this._valDet.getDiscreteRangeValues() !== null) {
216
+ this._newvalue = this.fillAlphaByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues());
217
+ }
218
+ return this._newvalue;
219
+ }
220
+ isPossibleAlphaLetter(indexInput, indexPicture) {
221
+ let result;
222
+ switch (this._picture.charCodeAt(indexPicture)) {
223
+ case PICInterface.PIC_X:
224
+ case PICInterface.PIC_J:
225
+ case PICInterface.PIC_G:
226
+ case PICInterface.PIC_S:
227
+ case PICInterface.PIC_T:
228
+ return true;
229
+ case PICInterface.PIC_U:
230
+ let upper = this._newvalue[indexInput].toUpperCase();
231
+ if (upper !== this._newvalue[indexInput])
232
+ this.changeStringInside("" + upper, indexInput);
233
+ return true;
234
+ case PICInterface.PIC_L:
235
+ let lower = this._newvalue[indexInput].toLowerCase();
236
+ if (lower !== this._newvalue[indexInput])
237
+ this.changeStringInside("" + lower, indexInput);
238
+ return true;
239
+ case PICInterface.PIC_N:
240
+ let number1 = this._newvalue[indexInput];
241
+ if (UtilStrByteMode.isDigit(number1) || NChar.IsWhiteSpace(number1) || UtilStrByteMode.asNumeric(number1))
242
+ return true;
243
+ else {
244
+ Events.WriteErrorToLog("Bad Alpha value. Should be number only on place Num. " + indexInput);
245
+ return false;
246
+ }
247
+ default:
248
+ Events.WriteErrorToLog("FieldValidator.isPossibleAlphaLetter: illegal Char Directive: " + this._picture.indexOf(String.fromCharCode(indexPicture)) + " for " + this._newvalue[indexInput]);
249
+ return false;
250
+ }
251
+ }
252
+ fillAllAlpha() {
253
+ let stringBuilder = new StringBuilder(this._picture.length);
254
+ stringBuilder.Append(this._newvalue);
255
+ if (UtilStrByteMode.isLocaleDefLangDBCS() && this._valDet.getType() === StorageAttribute.ALPHA) {
256
+ let intNewvalueLenB = UtilStrByteMode.lenB(this._newvalue);
257
+ let strBuiedPicture = UtilStrByteMode.leftB(this._picture, intNewvalueLenB);
258
+ for (let i = strBuiedPicture.length; i < this._picture.length; i = i + 1) {
259
+ if (DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(i))) {
260
+ stringBuilder.Append(' ');
261
+ }
262
+ else {
263
+ stringBuilder.Append(this._picture.charAt(i));
264
+ }
265
+ }
266
+ }
267
+ else {
268
+ for (let i = this._newvalue.length - 1; i < this._picture.length && i >= 0; i++) {
269
+ if (DisplayConvertor.isAlphaPositionalDirective(this._picture.charAt(i))) {
270
+ stringBuilder.Append(' ');
271
+ }
272
+ else {
273
+ stringBuilder.Append(this._picture.charAt(i));
274
+ }
275
+ i = i + 1;
276
+ }
277
+ }
278
+ return stringBuilder.ToString();
279
+ }
280
+ fillAlphaByRange(ContinuousRangeValues, DiscreteRangeValues) {
281
+ let tmpBuffer = DisplayConvertor.Instance.fillAlphaByDiscreteRangeValues(DiscreteRangeValues, this._newvalue);
282
+ if (tmpBuffer !== null) {
283
+ return tmpBuffer;
284
+ }
285
+ tmpBuffer = DisplayConvertor.Instance.fillAlphaByContinuousRangeValues(ContinuousRangeValues, this._newvalue);
286
+ if (tmpBuffer !== null)
287
+ return tmpBuffer;
288
+ if (DiscreteRangeValues !== null)
289
+ return this.CompleteAlphaByRange(DiscreteRangeValues);
290
+ this.printMessage(MsgInterface.STR_RNG_TXT, true);
291
+ return this._oldvalue;
292
+ }
293
+ CompleteAlphaByRange(DiscreteRangeValues) {
294
+ let tmpNewValue = DisplayConvertor.Instance.completeAlphaByRange(DiscreteRangeValues, this._newvalue);
295
+ if (tmpNewValue !== null) {
296
+ return tmpNewValue;
297
+ }
298
+ this.printMessage(MsgInterface.STR_RNG_TXT, true);
299
+ return this._oldvalue;
300
+ }
301
+ checkLogicalField() {
302
+ if (this._newvalue.length === 0 && this._valDet.getContinuousRangeValues() === null && this._valDet.getDiscreteRangeValues() === null) {
303
+ throw new WrongFormatException(MsgInterface.STR_RNG_TXT);
304
+ }
305
+ if (this._valDet.getContinuousRangeValues() !== null || this._valDet.getDiscreteRangeValues() !== null) {
306
+ this._newvalue = this.fillAlphaByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues());
307
+ }
308
+ this.setValidationFailed(false);
309
+ return this._newvalue;
310
+ }
311
+ checkNumericField() {
312
+ let evaluated;
313
+ if (typeof this._newvalue === 'string') {
314
+ if (this._newvalue.length === 0) {
315
+ this._newvalue = "0";
316
+ }
317
+ let delimeterRealIndex = this._newvalue.indexOf(this._decimal);
318
+ let delimeterPictIndex = this._pictureReal.indexOf(this._decimal);
319
+ evaluated = "";
320
+ let evaluatedLeft;
321
+ let evaluatedRight;
322
+ this.setValidationFailed(false);
323
+ if (!this.checkNumericInDecFormat())
324
+ throw new WrongFormatException(MsgInterface.EDT_ERR_STR_1);
325
+ if (delimeterPictIndex !== -1 && delimeterRealIndex !== -1) {
326
+ evaluatedLeft = this.checkNumericLeft(delimeterPictIndex, delimeterRealIndex);
327
+ evaluatedRight = this.checkNumericRight(delimeterPictIndex, delimeterRealIndex);
328
+ evaluated = evaluatedLeft + this._decimal + evaluatedRight;
329
+ }
330
+ else {
331
+ if (delimeterPictIndex !== -1 && delimeterRealIndex === -1) {
332
+ evaluatedLeft = this.checkNumericLeft(delimeterPictIndex, Math.min(delimeterPictIndex, this._newvalue.length));
333
+ evaluatedRight = this.checkNumericRight(delimeterPictIndex, delimeterPictIndex - 1);
334
+ evaluated = evaluatedLeft + this._decimal + evaluatedRight;
335
+ }
336
+ else {
337
+ if (delimeterPictIndex === -1 && delimeterRealIndex === -1) {
338
+ evaluated = this.checkNumericRight(-1, -1);
339
+ evaluatedLeft = evaluated;
340
+ }
341
+ else {
342
+ if (delimeterRealIndex > 0) {
343
+ this._newvalue = this._newvalue.substr(0, delimeterRealIndex);
344
+ }
345
+ else {
346
+ this._newvalue = "0";
347
+ }
348
+ evaluated = this.checkNumericRight(-1, -1);
349
+ evaluatedLeft = evaluated;
350
+ }
351
+ }
352
+ }
353
+ if ((evaluatedRight.length === 0 && evaluatedLeft.length === 0) || (evaluated.length === 0 && this._newvalue.length > 0)) {
354
+ let ctrl;
355
+ ctrl = this._valDet.getControl();
356
+ let field = ctrl.getField();
357
+ let defValue = field.getDefaultValue();
358
+ let dispDefValue = null;
359
+ if (field.isNullDefault()) {
360
+ this._valDet.setNull(true);
361
+ dispDefValue = field.getNullDisplay();
362
+ }
363
+ if (dispDefValue == null)
364
+ dispDefValue = DisplayConvertor.Instance.mg2disp(defValue, this._valDet.getRange(), this._valDet.getPIC(), true, field.getTask().getCompIdx(), false);
365
+ }
366
+ let wholeDigitdiff = this.digitsBeforeDelimeter(evaluated, 0, this._decimal) - this._valDet.getPIC().getWholes();
367
+ if (wholeDigitdiff > 0) {
368
+ let padCharOnly = false;
369
+ if (this._valDet.getIsPadFill()) {
370
+ padCharOnly = true;
371
+ for (let i = 0; i < wholeDigitdiff && padCharOnly; i++)
372
+ if (evaluated[i] !== this._valDet.getPadFillChar())
373
+ padCharOnly = false;
374
+ }
375
+ if (!padCharOnly)
376
+ throw new WrongFormatException(MsgInterface.EDT_ERR_STR_1);
377
+ }
378
+ if (this._valDet.getIsNegative() && (this._newvalue.trim().startsWith("-") || (this._valDet.getNegativeSignPref().length !== 0 && this._newvalue.trim().startsWith(this._valDet.getNegativeSignPref())))) {
379
+ evaluated = "-" + evaluated;
380
+ }
381
+ evaluated = DisplayConvertor.Instance.disp2mg(this._newvalue, this._valDet.getPIC(), this._valDet.getControl().getForm().getTask().getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
382
+ evaluated = DisplayConvertor.Instance.mg2disp(evaluated, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), true);
383
+ let tempDispVal = StrUtil.ltrim(evaluated);
384
+ if (tempDispVal.length === 0 && this._valDet.getPIC().zeroFill() && this._valDet.getPIC().getZeroPad() === ' ')
385
+ evaluated = "0";
386
+ }
387
+ else {
388
+ evaluated = DisplayConvertor.Instance.disp2mg(this._newvalue, this._valDet.getPIC(), this._valDet.getControl().getForm().getTask().getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
389
+ evaluated = DisplayConvertor.Instance.mg2disp(evaluated, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), true);
390
+ }
391
+ if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null) {
392
+ this._newvalue = evaluated;
393
+ evaluated = this.fillNumericByRange();
394
+ }
395
+ return evaluated;
396
+ }
397
+ checkNumericLeft(delimeterPictIndex, delimeterRealIndex) {
398
+ let buffer = new StringBuilder();
399
+ let RealIndex = delimeterRealIndex - 1;
400
+ let PictIndex;
401
+ let isFound;
402
+ for (PictIndex = delimeterPictIndex - 1; PictIndex >= 0 && RealIndex >= 0; PictIndex--) {
403
+ if (this._pictureEnable[PictIndex] === '1') {
404
+ let tmpstorage = RealIndex;
405
+ isFound = false;
406
+ for (; RealIndex >= 0; RealIndex--) {
407
+ if (this._pictureReal[PictIndex] === this._newvalue[RealIndex]) {
408
+ isFound = true;
409
+ RealIndex--;
410
+ break;
411
+ }
412
+ }
413
+ if (!isFound)
414
+ RealIndex = tmpstorage;
415
+ buffer.Append(this._pictureReal[PictIndex]);
416
+ }
417
+ else {
418
+ for (; RealIndex >= 0; RealIndex--) {
419
+ if (UtilStrByteMode.isDigit(this._newvalue[RealIndex])) {
420
+ buffer.Append(this._newvalue[RealIndex]);
421
+ RealIndex--;
422
+ break;
423
+ }
424
+ }
425
+ }
426
+ }
427
+ if (RealIndex < 0 && PictIndex >= 0)
428
+ for (; PictIndex >= 0; PictIndex--) {
429
+ if (this._pictureEnable[PictIndex] === '1')
430
+ buffer.Append(this._pictureReal[PictIndex]);
431
+ else {
432
+ if (this._valDet.getIsPadFill())
433
+ buffer.Append(this._valDet.getPadFillChar());
434
+ }
435
+ }
436
+ return StrUtil.ReverseString(buffer).ToString();
437
+ }
438
+ checkNumericRight(delimeterPictIndex, delimeterRealIndex) {
439
+ let buffer = new StringBuilder();
440
+ let RealIndex = delimeterRealIndex + 1;
441
+ let PictIndex;
442
+ let pic = this._valDet.getPIC();
443
+ for (PictIndex = delimeterPictIndex + 1; PictIndex < this._pictureEnable.length && RealIndex < this._newvalue.length; PictIndex++) {
444
+ if (this._pictureEnable[PictIndex] === '1') {
445
+ if (RealIndex < PictIndex)
446
+ RealIndex = PictIndex;
447
+ buffer.Append(this._pictureReal[PictIndex]);
448
+ }
449
+ else {
450
+ for (; RealIndex < this._newvalue.length; RealIndex++) {
451
+ if (UtilStrByteMode.isDigit(this._newvalue[RealIndex]) && !pic.picIsMask(RealIndex)) {
452
+ buffer.Append(this._newvalue[RealIndex]);
453
+ RealIndex++;
454
+ break;
455
+ }
456
+ }
457
+ }
458
+ }
459
+ if (buffer.Length > 0) {
460
+ if (RealIndex >= this._newvalue.length && PictIndex < this._pictureReal.length)
461
+ for (; PictIndex < this._pictureReal.length; PictIndex++) {
462
+ if (this._pictureEnable[PictIndex] === '1')
463
+ buffer.Append(this._pictureReal[PictIndex]);
464
+ }
465
+ }
466
+ return buffer.ToString();
467
+ }
468
+ checkNumericPicture() {
469
+ let indexOfDec;
470
+ let lastDec;
471
+ let maxLength;
472
+ let currIndx;
473
+ let POINT_DEC = ".";
474
+ let pic = this._valDet.getPIC();
475
+ if (this._pictureReal == null || this._pictureEnable == null || pic.getAttr() !== StorageAttribute.NUMERIC || !pic.withDecimal())
476
+ return;
477
+ lastDec = this._pictureReal.lastIndexOf(POINT_DEC);
478
+ maxLength = this._pictureEnable.length;
479
+ currIndx = 0;
480
+ while (currIndx < lastDec) {
481
+ indexOfDec = this._pictureEnable.indexOf("1", currIndx);
482
+ if (indexOfDec === -1)
483
+ return;
484
+ else {
485
+ if (indexOfDec === this._pictureReal.indexOf(POINT_DEC, currIndx)) {
486
+ let first;
487
+ let second;
488
+ first = second = "";
489
+ if (indexOfDec === 0) {
490
+ if (indexOfDec + 1 < maxLength)
491
+ second = this._pictureReal.substr(indexOfDec + 1);
492
+ }
493
+ else if (indexOfDec === maxLength) {
494
+ first = this._pictureReal.substr(0, indexOfDec);
495
+ }
496
+ else {
497
+ first = this._pictureReal.substr(0, indexOfDec);
498
+ second = this._pictureReal.substr(indexOfDec + 1);
499
+ }
500
+ this._pictureReal = first + this._decimal + second;
501
+ break;
502
+ }
503
+ else {
504
+ currIndx = ++indexOfDec;
505
+ }
506
+ }
507
+ }
508
+ }
509
+ fillNumericByRange() {
510
+ let controlPic = this._valDet.getControl().getPIC();
511
+ let continuousRangeValues = this._valDet.getContinuousRangeValues();
512
+ let discreteRangeValues = this._valDet.getDiscreteRangeValues();
513
+ this.setValidationFailed(false);
514
+ let checkedStr = this.setNumericValueWithoutPicture(this._newvalue.toString());
515
+ if (checkedStr.length === 0) {
516
+ this.printMessage(MsgInterface.STR_RNG_TXT, true);
517
+ return this._oldvalue;
518
+ }
519
+ let checkedNum = new NUM_TYPE(this._newvalue.toString(), this._valDet.getControl().getPIC(), 0);
520
+ if (discreteRangeValues !== null) {
521
+ for (let i = 0; i < discreteRangeValues.length; i = i + 1) {
522
+ let rangeItemValue1 = new NUM_TYPE(discreteRangeValues.get_Item(i), controlPic, 0);
523
+ try {
524
+ if (NUM_TYPE.num_cmp(checkedNum, rangeItemValue1) === 0) {
525
+ return this._newvalue;
526
+ }
527
+ }
528
+ catch (ex_CC) {
529
+ }
530
+ }
531
+ }
532
+ if (continuousRangeValues !== null) {
533
+ for (let i = 0; i < continuousRangeValues.length; i = i + 1) {
534
+ let rangeItemValue1 = new NUM_TYPE();
535
+ let rangeItemValue2 = new NUM_TYPE();
536
+ rangeItemValue1.num_4_a_std(continuousRangeValues.get_Item(i++));
537
+ rangeItemValue2.num_4_a_std(continuousRangeValues.get_Item(i));
538
+ try {
539
+ if (NUM_TYPE.num_cmp(checkedNum, rangeItemValue1) !== -1 && NUM_TYPE.num_cmp(rangeItemValue2, checkedNum) !== -1) {
540
+ return this._newvalue;
541
+ }
542
+ }
543
+ catch (ex_15B) {
544
+ }
545
+ }
546
+ }
547
+ throw new WrongFormatException();
548
+ }
549
+ getDoubleVal(val) {
550
+ let dotFound = false;
551
+ let minusFound = false;
552
+ let digitFound = false;
553
+ let endOfNum = false;
554
+ let i = 0;
555
+ for (i = 0; i < val.length && !endOfNum; i++) {
556
+ let c = val[i];
557
+ if (c >= '0' && c <= '9')
558
+ digitFound = true;
559
+ else {
560
+ switch (c) {
561
+ case '-':
562
+ if (digitFound || dotFound || minusFound)
563
+ endOfNum = true;
564
+ minusFound = true;
565
+ break;
566
+ case '.':
567
+ if (dotFound || minusFound && !digitFound)
568
+ endOfNum = true;
569
+ dotFound = true;
570
+ break;
571
+ case ' ':
572
+ if (digitFound || dotFound || minusFound)
573
+ endOfNum = true;
574
+ break;
575
+ default:
576
+ endOfNum = true;
577
+ break;
578
+ }
579
+ }
580
+ }
581
+ if (endOfNum) {
582
+ i = i - 1;
583
+ }
584
+ if (i > 0) {
585
+ return NNumber.Parse(val.substr(0, i));
586
+ }
587
+ return -Infinity;
588
+ }
589
+ setNumericValueWithoutPicture(val) {
590
+ let checkedStr = new StringBuilder(val.length);
591
+ let isFirstDecimal = false;
592
+ let currChar;
593
+ for (let i = 0; i < this._pictureReal.length && i < val.length; i++) {
594
+ currChar = val[i];
595
+ if (UtilStrByteMode.isDigit(currChar))
596
+ checkedStr.Append(currChar);
597
+ else if (currChar === this._environment.GetDecimal() && !isFirstDecimal) {
598
+ checkedStr.Append(NString.ToCharArray(NumberFormatInfo.NumberDecimalSeparator).toString());
599
+ isFirstDecimal = true;
600
+ }
601
+ else if (currChar === '-' && this._valDet.getIsNegative())
602
+ checkedStr.Append(NString.ToCharArray(NumberFormatInfo.NegativeSign).toString());
603
+ }
604
+ if (checkedStr.ToString().length === 0) {
605
+ this.printMessage(MsgInterface.STR_ERR_NUM, false);
606
+ this.setValidationFailed(true);
607
+ }
608
+ return checkedStr.ToString();
609
+ }
610
+ checkNumericInDecFormat() {
611
+ let pic = this._valDet.getPIC();
612
+ let i;
613
+ let Dec;
614
+ let Whole;
615
+ let DecPos;
616
+ let decimalChar = this._environment.GetDecimal();
617
+ Dec = 0;
618
+ Whole = 0;
619
+ DecPos = -1;
620
+ for (i = 0; i < this._newvalue.length; i++)
621
+ if (pic.isNumeric(i))
622
+ if (UtilStrByteMode.isDigit(this._newvalue[i]))
623
+ if (DecPos >= 0)
624
+ Dec++;
625
+ else
626
+ Whole++;
627
+ else if (this._newvalue[i] === decimalChar)
628
+ DecPos = i;
629
+ if (pic.getWholes() < Whole || pic.getDec() < Dec)
630
+ return false;
631
+ else
632
+ return true;
633
+ }
634
+ checkDateField() {
635
+ let newDate = (this._newvalue == null ? null : new Date(this._newvalue));
636
+ this.setValidationFailed(false);
637
+ if (this._valDet.getControl().isDateZero(this._newvalue)) {
638
+ let defaultMgValue = this._valDet.getControl().getField().getDefaultValue();
639
+ newDate = DisplayConvertor.Instance.mg2disp(defaultMgValue, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), false);
640
+ }
641
+ else {
642
+ if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null)
643
+ newDate = this.fillDateByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues(), this._newvalue);
644
+ }
645
+ return newDate;
646
+ }
647
+ add2Date(currValue, buffer, type) {
648
+ let start = currValue;
649
+ let currAdd = new StringBuilder(this._newvalue.length);
650
+ let letters = 0;
651
+ switch (type) {
652
+ case PICInterface.PIC_DD:
653
+ case PICInterface.PIC_DDDD:
654
+ case PICInterface.PIC_MMD:
655
+ case PICInterface.PIC_YY:
656
+ letters = 2;
657
+ break;
658
+ case PICInterface.PIC_DDD:
659
+ letters = 3;
660
+ break;
661
+ case PICInterface.PIC_YYYY:
662
+ letters = 4;
663
+ break;
664
+ case PICInterface.PIC_W:
665
+ letters = 1;
666
+ break;
667
+ case PICInterface.PIC_YJ:
668
+ letters = 2;
669
+ type = PICInterface.PIC_YY;
670
+ break;
671
+ }
672
+ while (start < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue.charAt(start)))
673
+ start++;
674
+ if (start === this._newvalue.length && (this._newvalue.length === 0 || this._newvalue === "0")) {
675
+ for (let nul = 0; nul < letters; nul = nul + 1) {
676
+ buffer.Append('0');
677
+ }
678
+ return currValue;
679
+ }
680
+ else if (start === this._newvalue.length) {
681
+ this._newvalue = this._newvalue + "0";
682
+ }
683
+ let i;
684
+ for (i = start; i < start + letters && i < this._newvalue.length; i++) {
685
+ if (UtilStrByteMode.isDigit(this._newvalue.charAt(i)))
686
+ currAdd.Append(this._newvalue.charAt(i));
687
+ else
688
+ break;
689
+ }
690
+ if (currAdd.Length === 0) {
691
+ currAdd.Append('0');
692
+ }
693
+ let add = NNumber.Parse(currAdd.ToString());
694
+ if ((add < 1 && type !== PICInterface.PIC_YYYY && type !== PICInterface.PIC_YY) ||
695
+ (add > 31 && (type === PICInterface.PIC_DD || type === PICInterface.PIC_DDDD)) ||
696
+ (add > 12 && type === PICInterface.PIC_MMD) || (add > 7 && type === PICInterface.PIC_W)) {
697
+ throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
698
+ }
699
+ if (type === PICInterface.PIC_YYYY && this._environment.GetCentury(this._valDet.getControl().getForm().getTask().getCompIdx()) > 999 && currAdd.Length < 3)
700
+ currAdd = this.checkCentury(add);
701
+ for (let j = 0; j < letters - currAdd.Length; j = j + 1) {
702
+ buffer.Append('0');
703
+ }
704
+ buffer.Append(currAdd.ToString());
705
+ return i;
706
+ }
707
+ addM2Date(currValue, letters, buffer, type) {
708
+ let array;
709
+ let result;
710
+ if (type === PICInterface.PIC_MMM || type === PICInterface.PIC_MMD) {
711
+ if (this.hebrew) {
712
+ array = HebrewDate.GetLocalMonths();
713
+ }
714
+ else {
715
+ let messageString = Events.GetMessageString(MsgInterface.MONTHS_PTR);
716
+ array = DateUtil.getLocalMonths(messageString);
717
+ }
718
+ }
719
+ else {
720
+ if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W) {
721
+ if (this.hebrew) {
722
+ array = HebrewDate.GetLocalDows();
723
+ }
724
+ else {
725
+ let dayStr = Events.GetMessageString(MsgInterface.DAYS_PTR);
726
+ array = DateUtil.getLocalDays(dayStr);
727
+ }
728
+ }
729
+ else {
730
+ if (type === PICInterface.PIC_BB) {
731
+ array = UtilDateJpn.getArrayDow();
732
+ }
733
+ else {
734
+ if (type === PICInterface.PIC_JY1 || type === PICInterface.PIC_JY2 || type === PICInterface.PIC_JY4) {
735
+ if (this._newvalue.length < currValue + letters) {
736
+ throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
737
+ }
738
+ let text = this._newvalue.substr(currValue, letters);
739
+ buffer.Append(text);
740
+ return currValue + text.length;
741
+ }
742
+ else {
743
+ return currValue + letters;
744
+ }
745
+ }
746
+ }
747
+ }
748
+ if (this._newvalue.length < currValue) {
749
+ currValue = this._newvalue.length;
750
+ }
751
+ let max = this.getMonthOrWeek(this._newvalue.substr(currValue), letters, type);
752
+ if (array[max].trim().length >= letters) {
753
+ buffer.Append(array[max].trim().substr(0, letters));
754
+ }
755
+ else {
756
+ buffer.Append(array[max].trim());
757
+ for (let i = letters - array[max].trim().length; i > 0; i = i - 1) {
758
+ buffer.Append(' ');
759
+ }
760
+ }
761
+ return currValue + letters;
762
+ }
763
+ getEndOfNumericBlock(currValue) {
764
+ while (currValue < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue.charAt(currValue))) {
765
+ currValue = currValue + 1;
766
+ }
767
+ return currValue;
768
+ }
769
+ addDateSuffix(last) {
770
+ let thenumber = NNumber.Parse(last);
771
+ if (thenumber === 1 || thenumber === 21 || thenumber === 31)
772
+ return "st";
773
+ else if (thenumber === 2 || thenumber === 22)
774
+ return "nd";
775
+ else if (thenumber === 3 || thenumber === 23)
776
+ return "rd";
777
+ return "th";
778
+ }
779
+ getSizeOfBlock(start, type) {
780
+ let letters = start + 1;
781
+ while (letters < this._picture.length && this._picture.charCodeAt(letters) === type)
782
+ letters++;
783
+ return letters - start;
784
+ }
785
+ getMonthOrWeek(month_str, letters, type) {
786
+ let array;
787
+ if (type === PICInterface.PIC_MMM || type === PICInterface.PIC_MMD) {
788
+ if (this.hebrew)
789
+ array = HebrewDate.GetLocalMonths();
790
+ else {
791
+ let monthStr = Events.GetMessageString(MsgInterface.MONTHS_PTR);
792
+ array = DateUtil.getLocalMonths(monthStr.toString());
793
+ }
794
+ }
795
+ else if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W) {
796
+ if (this.hebrew)
797
+ array = HebrewDate.GetLocalDows();
798
+ else {
799
+ let dayStr = Events.GetMessageString(MsgInterface.DAYS_PTR);
800
+ array = DateUtil.getLocalDays(dayStr.toString());
801
+ }
802
+ }
803
+ else if (type === PICInterface.PIC_BB) {
804
+ array = UtilDateJpn.getArrayDow();
805
+ }
806
+ else {
807
+ return 1;
808
+ }
809
+ if (letters > month_str.length)
810
+ letters = month_str.length;
811
+ if (this.hebrew) {
812
+ let hstr = NString.TrimStart(month_str).substr(0, letters).trim();
813
+ for (let i = 1; i < array.length; i++) {
814
+ if (array[i].trim() === hstr) {
815
+ if (i === 14)
816
+ i = 6;
817
+ return i;
818
+ }
819
+ }
820
+ return 0;
821
+ }
822
+ try {
823
+ let str = month_str.substr(0, letters).trim();
824
+ let numBuffer = new StringBuilder(str.length);
825
+ for (let i = 0; i < str.length; i++) {
826
+ if (UtilStrByteMode.isDigit(str[i]))
827
+ numBuffer.Append(str[i]);
828
+ else
829
+ break;
830
+ }
831
+ let theNumber = NNumber.Parse(numBuffer.ToString());
832
+ if (theNumber < 1)
833
+ return 1;
834
+ if (type === PICInterface.PIC_MMM || type === PICInterface.PIC_MMD) {
835
+ if (theNumber > 12)
836
+ return 12;
837
+ }
838
+ else if (type === PICInterface.PIC_WWW || type === PICInterface.PIC_W || type === PICInterface.PIC_BB) {
839
+ if (theNumber > 7)
840
+ return 7;
841
+ }
842
+ return theNumber;
843
+ }
844
+ catch (ex_21A) {
845
+ }
846
+ let found = new Array(array.length);
847
+ let from;
848
+ let max = -1;
849
+ for (let tmp = 1; tmp < array.length; tmp++) {
850
+ found[tmp] = 0;
851
+ from = 0;
852
+ for (let i = 0; i < array[tmp].length && from < month_str.length && i < letters; i++, from++) {
853
+ if (array[tmp].toLowerCase()[i] === month_str.toLowerCase()[from])
854
+ found[tmp]++;
855
+ else
856
+ break;
857
+ }
858
+ if (from === letters || from === array[tmp].length) {
859
+ max = tmp;
860
+ break;
861
+ }
862
+ }
863
+ if (max === -1)
864
+ max = this.findMax(found);
865
+ return max;
866
+ }
867
+ isNumberAllowedInDate() {
868
+ for (let i = 0; i < this._picture.length; i++) {
869
+ if (this.isDatePositionalNumericDirective(this._picture[i]))
870
+ return true;
871
+ }
872
+ return false;
873
+ }
874
+ isAllNumbers0() {
875
+ let currChr;
876
+ for (let i = 0; i < this._newvalue.length; i++) {
877
+ currChr = this._newvalue[i];
878
+ if (UtilStrByteMode.isDigit(currChr) && currChr !== '0')
879
+ return false;
880
+ }
881
+ return true;
882
+ }
883
+ checkCentury(yearIn) {
884
+ let outVal;
885
+ let start_century = this._environment.GetCentury(this._valDet.getControl().getForm().getTask().getCompIdx());
886
+ let century = Math.floor(start_century / 100);
887
+ let years = start_century % 100;
888
+ if (yearIn >= years && yearIn !== 0)
889
+ outVal = (century * 100 + yearIn);
890
+ else
891
+ outVal = ((++century) * 100 + yearIn);
892
+ return new StringBuilder(outVal.toString());
893
+ }
894
+ isDateLegal4Range(ContinuousRange, DiscreteRange, currDate) {
895
+ let pic = this._valDet.getPIC();
896
+ let i;
897
+ let downDate;
898
+ let topDate;
899
+ if (ContinuousRange != null) {
900
+ for (i = 0; i < ContinuousRange.length - 1; i++) {
901
+ downDate = DisplayConvertor.Instance.a_2_date_pic(ContinuousRange.get_Item(i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx());
902
+ topDate = DisplayConvertor.Instance.a_2_date_pic(ContinuousRange.get_Item(++i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx());
903
+ if (currDate >= downDate && currDate <= topDate)
904
+ return true;
905
+ }
906
+ }
907
+ if (DiscreteRange != null) {
908
+ for (i = 0; i < DiscreteRange.length; i++) {
909
+ if (currDate === DisplayConvertor.Instance.a_2_date_pic(DiscreteRange.get_Item(i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx()))
910
+ return true;
911
+ }
912
+ }
913
+ throw new WrongFormatException();
914
+ }
915
+ fillDateByRange(ContinuousRange, DiscreteRange, buffer) {
916
+ let pic = this._valDet.getPIC();
917
+ let i;
918
+ let downDate;
919
+ let topDate;
920
+ let currDate = DisplayConvertor.Instance.fromNativeDateToMgDateNumber(buffer, pic);
921
+ this.setValidationFailed(false);
922
+ if (ContinuousRange != null) {
923
+ for (i = 0; i < ContinuousRange.length - 1; i++) {
924
+ downDate = DisplayConvertor.Instance.a_2_date_pic(ContinuousRange.get_Item(i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx());
925
+ topDate = DisplayConvertor.Instance.a_2_date_pic(ContinuousRange.get_Item(++i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx());
926
+ if (currDate >= downDate && currDate <= topDate)
927
+ return new Date(buffer);
928
+ }
929
+ }
930
+ if (DiscreteRange != null) {
931
+ for (i = 0; i < DiscreteRange.length; i++) {
932
+ if (currDate === DisplayConvertor.Instance.a_2_date_pic(DiscreteRange.get_Item(i), pic, pic.getMask(), this._valDet.getControl().getForm().getTask().getCompIdx())) {
933
+ return new Date(buffer);
934
+ }
935
+ }
936
+ }
937
+ throw new WrongFormatException();
938
+ }
939
+ checkDay(date, isDoy) {
940
+ let day = this.getDateElement(date, DateElement.DAY);
941
+ if (day < 29 && !isDoy)
942
+ return new StringBuilder(date);
943
+ let year = this.getDateElement(date, DateElement.YEAR);
944
+ if (!isDoy) {
945
+ if (year.toString().length < 3)
946
+ year = NNumber.Parse(this.checkCentury(year).ToString());
947
+ if (this._environment.GetDateMode(this._valDet.getControl().getForm().getTask().getCompIdx()) === 'B')
948
+ year -= PICInterface.DATE_BUDDHIST_GAP;
949
+ let month = this.getDateElement(date, DateElement.MONTH);
950
+ let dayMax = this.getMaxDayInMonth(year, month);
951
+ if (day > dayMax) {
952
+ throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
953
+ }
954
+ }
955
+ else {
956
+ let monthReal = this.getMonthByDay(year, day);
957
+ if (monthReal < 1 || monthReal > 12)
958
+ throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
959
+ }
960
+ return new StringBuilder(date);
961
+ }
962
+ checkWeek(date) {
963
+ let dow = this.getDateElement(date, DateElement.DOW);
964
+ let breakParams = DisplayConvertor.Instance.getNewDateBreakParams();
965
+ let dateMagic = DisplayConvertor.Instance.a_2_date(date, this._picture, this._valDet.getControl().getForm().getTask().getCompIdx());
966
+ DisplayConvertor.Instance.date_break_datemode(breakParams, dateMagic, true, this._valDet.getControl().getForm().getTask().getCompIdx());
967
+ let dowReal = breakParams.dow;
968
+ if (dowReal !== dowReal)
969
+ date = this.changeDow(date, dowReal);
970
+ return new StringBuilder(date);
971
+ }
972
+ checkJpnEraYear(strDate) {
973
+ let breakParams = DisplayConvertor.Instance.getNewDateBreakParams();
974
+ let dateMagic = DisplayConvertor.Instance.a_2_date(strDate, this._picture, this._valDet.getControl().getForm().getTask().getCompIdx());
975
+ DisplayConvertor.Instance.date_break_datemode(breakParams, dateMagic, true, this._valDet.getControl().getForm().getTask().getCompIdx());
976
+ let intYearAD = breakParams.year;
977
+ let intDoy = breakParams.doy;
978
+ let strEraAlpha;
979
+ let strEraKanji;
980
+ strEraAlpha = UtilDateJpn.getInstance().date_jpn_yr_2_a(intYearAD, intDoy, false);
981
+ strEraKanji = UtilDateJpn.getInstance().date_jpn_yr_2_a(intYearAD, intDoy, true);
982
+ let strYearJpnEra = new StringBuilder();
983
+ let num = UtilDateJpn.getInstance().date_jpn_year_ofs(intYearAD, intDoy);
984
+ if (num <= 0) {
985
+ throw new WrongFormatException(MsgInterface.STR_ERR_DATE);
986
+ }
987
+ if (num <= 9) {
988
+ strYearJpnEra.Append("0");
989
+ }
990
+ strYearJpnEra.Append(num.toString());
991
+ let intPicIdxOfs = 0;
992
+ for (let intCnt = 0; intCnt + intPicIdxOfs < this._picture.length; intCnt++) {
993
+ switch (this._picture.charCodeAt(intCnt + intPicIdxOfs)) {
994
+ case (PICInterface.PIC_JY1):
995
+ strDate = UtilStrByteMode.repC(strDate, strEraAlpha, intCnt + 1, 1);
996
+ break;
997
+ case (PICInterface.PIC_JY2):
998
+ strDate = UtilStrByteMode.repC(strDate, strEraKanji, intCnt + 1, 1);
999
+ intPicIdxOfs++;
1000
+ break;
1001
+ case (PICInterface.PIC_JY4):
1002
+ strDate = UtilStrByteMode.repC(strDate, strEraKanji, intCnt + 1, 2);
1003
+ intCnt++;
1004
+ intPicIdxOfs += 2;
1005
+ break;
1006
+ case (PICInterface.PIC_YJ):
1007
+ strDate = UtilStrByteMode.repC(strDate, strYearJpnEra.toString(), intCnt + 1, 2);
1008
+ intCnt++;
1009
+ break;
1010
+ default:
1011
+ if (intCnt < strDate.length) {
1012
+ if (UtilStrByteMode.isHalfWidth(strDate[intCnt]) === false && UtilStrByteMode.isHalfWidth(this._picture[intCnt + intPicIdxOfs]) === true)
1013
+ intPicIdxOfs++;
1014
+ }
1015
+ break;
1016
+ }
1017
+ }
1018
+ return new StringBuilder(strDate);
1019
+ }
1020
+ getMaxDayInMonth(year, month) {
1021
+ let array = [
1022
+ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
1023
+ ];
1024
+ let leapyear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
1025
+ if (leapyear && month === 2)
1026
+ return array[month] + 1;
1027
+ return array[month];
1028
+ }
1029
+ getMonthByDay(year, day) {
1030
+ let i;
1031
+ let LeapYear;
1032
+ LeapYear = (year % 4 === 0) && ((year % 100 !== 0) || (year % 400 === 0));
1033
+ for (i = 0; i < PICInterface.date_day_tab.length; i++) {
1034
+ if (!LeapYear) {
1035
+ if (PICInterface.date_day_tab[i] >= day)
1036
+ return i;
1037
+ }
1038
+ else {
1039
+ if (i < 3) {
1040
+ if (PICInterface.date_day_tab[i] >= day)
1041
+ return i;
1042
+ }
1043
+ else {
1044
+ if (PICInterface.date_day_tab[i] + 1 >= day)
1045
+ return i;
1046
+ }
1047
+ }
1048
+ }
1049
+ return i;
1050
+ }
1051
+ getDateElement(date, element) {
1052
+ let buffer = null;
1053
+ let letters = 0;
1054
+ let exitLoop = false;
1055
+ let picWeekType = PICInterface.PIC_WWW;
1056
+ let isJpnEraYear = false;
1057
+ let era_year = 0;
1058
+ let intPicIdxOfs = 0;
1059
+ let minLen = 0;
1060
+ if (UtilStrByteMode.isLocaleDefLangJPN())
1061
+ minLen = UtilStrByteMode.getMinLenPicture(date, this._picture);
1062
+ else
1063
+ minLen = Math.min(date.length, this._picture.length);
1064
+ for (let i = 0; i + intPicIdxOfs < minLen && !exitLoop; i++) {
1065
+ if (this.isDataPositionalDirective(this._picture[i + intPicIdxOfs])) {
1066
+ switch (this._picture.charCodeAt(i + intPicIdxOfs)) {
1067
+ case PICInterface.PIC_DD:
1068
+ if (element === DateElement.DAY) {
1069
+ buffer = date.substr(i, 2);
1070
+ exitLoop = true;
1071
+ break;
1072
+ }
1073
+ i++;
1074
+ break;
1075
+ case PICInterface.PIC_DDD:
1076
+ if (element === DateElement.DAY) {
1077
+ buffer = date.substr(i, 3);
1078
+ exitLoop = true;
1079
+ break;
1080
+ }
1081
+ i += 2;
1082
+ break;
1083
+ case PICInterface.PIC_DDDD:
1084
+ if (element === DateElement.DAY) {
1085
+ buffer = date.substr(i, 2);
1086
+ exitLoop = true;
1087
+ }
1088
+ i += 3;
1089
+ break;
1090
+ case PICInterface.PIC_MMD:
1091
+ if (element === DateElement.MONTH) {
1092
+ buffer = date.substr(i, 2);
1093
+ exitLoop = true;
1094
+ }
1095
+ i++;
1096
+ break;
1097
+ case PICInterface.PIC_MMM:
1098
+ letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_MMM);
1099
+ if (element === DateElement.MONTH) {
1100
+ buffer = date.substr(i, letters);
1101
+ exitLoop = true;
1102
+ break;
1103
+ }
1104
+ i += letters - 1;
1105
+ letters = 0;
1106
+ break;
1107
+ case PICInterface.PIC_YY:
1108
+ if (element === DateElement.YEAR) {
1109
+ buffer = date.substr(i, 2);
1110
+ exitLoop = true;
1111
+ }
1112
+ i++;
1113
+ break;
1114
+ case PICInterface.PIC_YYYY:
1115
+ if (element === DateElement.YEAR) {
1116
+ buffer = date.substr(i, 4);
1117
+ exitLoop = true;
1118
+ }
1119
+ i += 3;
1120
+ break;
1121
+ case PICInterface.PIC_W:
1122
+ if (element === DateElement.DOW) {
1123
+ buffer = date.substr(i, 1);
1124
+ exitLoop = true;
1125
+ }
1126
+ break;
1127
+ case PICInterface.PIC_WWW:
1128
+ letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_WWW);
1129
+ if (element === DateElement.DOW) {
1130
+ buffer = date.substr(i, letters);
1131
+ exitLoop = true;
1132
+ break;
1133
+ }
1134
+ i += letters - 1;
1135
+ letters = 0;
1136
+ break;
1137
+ case PICInterface.PIC_HYYYYY:
1138
+ case PICInterface.PIC_HL:
1139
+ case PICInterface.PIC_HDD:
1140
+ break;
1141
+ case PICInterface.PIC_BB:
1142
+ letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_BB);
1143
+ if (i + Math.floor(letters / 2) < date.length) {
1144
+ buffer = date.substr(i, Math.floor(letters / 2));
1145
+ intPicIdxOfs += letters - buffer.length;
1146
+ }
1147
+ if (element === DateElement.DOW) {
1148
+ exitLoop = true;
1149
+ picWeekType = PICInterface.PIC_BB;
1150
+ }
1151
+ else {
1152
+ buffer = null;
1153
+ }
1154
+ i += letters - 1;
1155
+ break;
1156
+ case PICInterface.PIC_JY1:
1157
+ isJpnEraYear = true;
1158
+ break;
1159
+ case PICInterface.PIC_JY2:
1160
+ isJpnEraYear = true;
1161
+ intPicIdxOfs++;
1162
+ break;
1163
+ case PICInterface.PIC_JY4:
1164
+ isJpnEraYear = true;
1165
+ intPicIdxOfs += 2;
1166
+ i++;
1167
+ break;
1168
+ case PICInterface.PIC_YJ:
1169
+ if (element === DateElement.YEAR) {
1170
+ buffer = date.substr(i, 2);
1171
+ exitLoop = true;
1172
+ }
1173
+ i++;
1174
+ break;
1175
+ }
1176
+ }
1177
+ }
1178
+ if (buffer == null) {
1179
+ if (element === DateElement.YEAR)
1180
+ return DateTime.Now.Year;
1181
+ else
1182
+ return 1;
1183
+ }
1184
+ buffer = buffer.trim();
1185
+ if (letters > 0) {
1186
+ if (element === DateElement.MONTH)
1187
+ letters = this.getMonthOrWeek(buffer.toString(), letters, PICInterface.PIC_MMM);
1188
+ else if (element === DateElement.DOW)
1189
+ letters = this.getMonthOrWeek(buffer.toString(), letters, picWeekType);
1190
+ }
1191
+ else {
1192
+ while (buffer.toString().startsWith("0") || buffer.toString().startsWith(" "))
1193
+ buffer = buffer.toString().substr(1);
1194
+ if (buffer.length === 0)
1195
+ letters = 0;
1196
+ else
1197
+ letters = NNumber.Parse(buffer.toString());
1198
+ }
1199
+ if (element === DateElement.YEAR && isJpnEraYear) {
1200
+ era_year = UtilDateJpn.getInstance().getStartYearOfEra(date, this._picture);
1201
+ if (era_year === 0)
1202
+ return 0;
1203
+ letters += era_year - 1;
1204
+ }
1205
+ return letters;
1206
+ }
1207
+ changeDow(date, dow) {
1208
+ let isDate = false;
1209
+ let letters;
1210
+ let startPart;
1211
+ let finishPart;
1212
+ let number1;
1213
+ number1 = "" + dow;
1214
+ let intPicIdxOfs = 0;
1215
+ for (let i = 0; i + intPicIdxOfs < this._picture.length && !isDate; i++) {
1216
+ if (this.isDataPositionalDirective(this._picture[i + intPicIdxOfs])) {
1217
+ switch (this._picture.charCodeAt(i + intPicIdxOfs)) {
1218
+ case PICInterface.PIC_W:
1219
+ startPart = date.substr(0, i);
1220
+ finishPart = date.substr(i + 1);
1221
+ date = startPart + number1 + finishPart;
1222
+ isDate = true;
1223
+ break;
1224
+ case PICInterface.PIC_WWW:
1225
+ letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_WWW);
1226
+ startPart = date.substr(0, i);
1227
+ finishPart = date.substr(i + letters);
1228
+ let dayStr = Events.GetMessageString(MsgInterface.DAYS_PTR);
1229
+ let dayNames = DateUtil.getLocalDays(dayStr);
1230
+ number1 = dayNames[dow];
1231
+ if (number1.length > letters)
1232
+ number1 = number1.substr(0, letters);
1233
+ else if (number1.length < letters)
1234
+ while (number1.length < letters)
1235
+ number1 = number1 + ' ';
1236
+ date = startPart + number1 + finishPart;
1237
+ isDate = true;
1238
+ break;
1239
+ case PICInterface.PIC_BB:
1240
+ letters = this.getSizeOfBlock(i + intPicIdxOfs, PICInterface.PIC_BB);
1241
+ startPart = date.substr(0, i);
1242
+ finishPart = date.substr(i + Math.floor(letters / 2));
1243
+ number1 = UtilDateJpn.getStrDow(dow);
1244
+ if (UtilStrByteMode.lenB(number1) > letters)
1245
+ number1 = UtilStrByteMode.leftB(number1, letters);
1246
+ else if (UtilStrByteMode.lenB(number1) < letters)
1247
+ while (UtilStrByteMode.lenB(number1) < letters)
1248
+ number1 = number1 + ' ';
1249
+ date = startPart + number1 + finishPart;
1250
+ isDate = true;
1251
+ break;
1252
+ default:
1253
+ if (UtilStrByteMode.isLocaleDefLangDBCS()) {
1254
+ if (i < date.length) {
1255
+ if (UtilStrByteMode.isHalfWidth(date[i]) === false && UtilStrByteMode.isHalfWidth(this._picture[i + intPicIdxOfs]) === true)
1256
+ intPicIdxOfs++;
1257
+ }
1258
+ }
1259
+ break;
1260
+ }
1261
+ }
1262
+ }
1263
+ return date;
1264
+ }
1265
+ checkTimeField() {
1266
+ let newTime = new Date(this._newvalue);
1267
+ this.setValidationFailed(false);
1268
+ if (this._valDet.getControl().isDateZero(this._newvalue)) {
1269
+ let defaultMgValue = this._valDet.getControl().getField().getDefaultValue();
1270
+ newTime = DisplayConvertor.Instance.mg2disp(defaultMgValue, "", this._valDet.getPIC(), true, this._valDet.getControl().getForm().getTask().getCompIdx(), false);
1271
+ }
1272
+ else {
1273
+ if (this._valDet.getContinuousRangeValues() != null || this._valDet.getDiscreteRangeValues() != null)
1274
+ newTime = this.fillTimeByRange(this._valDet.getContinuousRangeValues(), this._valDet.getDiscreteRangeValues(), this._newvalue);
1275
+ }
1276
+ return newTime;
1277
+ }
1278
+ add2Time(currValue, buffer, type) {
1279
+ let start = currValue;
1280
+ let i;
1281
+ let STR_00 = "00";
1282
+ let currAdd = new StringBuilder();
1283
+ while (start < this._newvalue.length && !UtilStrByteMode.isDigit(this._newvalue[start])) {
1284
+ start++;
1285
+ }
1286
+ if (start === this._newvalue.length) {
1287
+ buffer.Append(STR_00.toString());
1288
+ return currValue;
1289
+ }
1290
+ for (i = start; i < start + 2 && i < this._newvalue.length; i++) {
1291
+ if (UtilStrByteMode.isDigit(this._newvalue[i]))
1292
+ currAdd.Append(this._newvalue[i]);
1293
+ else {
1294
+ currAdd.Insert(0, '0');
1295
+ break;
1296
+ }
1297
+ }
1298
+ if (i === this._newvalue.length && i === start + 1)
1299
+ currAdd.Insert(0, '0');
1300
+ else if (i === this._newvalue.length && i === start)
1301
+ currAdd.Append(STR_00.toString());
1302
+ let add = NNumber.Parse(currAdd.ToString());
1303
+ if (add < 0 || (add > 59 && type === PICInterface.PIC_MMT) || (add > 59 && type === PICInterface.PIC_SS))
1304
+ throw new WrongFormatException(MsgInterface.STR_ERR_TIME);
1305
+ else if (type === PICInterface.PIC_HH) {
1306
+ let PM = this.getIsPM();
1307
+ let newStr = null;
1308
+ let dif;
1309
+ if ((add >= 12 || add === 0) && PM) {
1310
+ let addTmp = add % 24;
1311
+ this._isPm = (addTmp >= 12 && addTmp < 24);
1312
+ if (addTmp > 12)
1313
+ dif = addTmp - 12;
1314
+ else if (addTmp === 0)
1315
+ dif = 12;
1316
+ else
1317
+ dif = addTmp;
1318
+ newStr = ((dif > 9 ? "" : "0") + dif);
1319
+ }
1320
+ else if (add > 99 && !PM)
1321
+ newStr = "99";
1322
+ if (newStr != null) {
1323
+ currAdd.Remove(0, currAdd.Length);
1324
+ currAdd.Append(newStr.toString());
1325
+ }
1326
+ }
1327
+ buffer.Append(currAdd.ToString());
1328
+ return i;
1329
+ }
1330
+ addPM2Time(currValue, buffer) {
1331
+ let i;
1332
+ if ((i = this._newvalue.toUpperCase().indexOf("AM", currValue)) !== -1) {
1333
+ buffer.Append("am");
1334
+ return i + 2;
1335
+ }
1336
+ else {
1337
+ if ((i = this._newvalue.toUpperCase().indexOf("PM", currValue)) !== -1) {
1338
+ buffer.Append("pm");
1339
+ return i + 2;
1340
+ }
1341
+ else if (this._isPm) {
1342
+ buffer.Append("pm");
1343
+ return currValue;
1344
+ }
1345
+ else
1346
+ buffer.Append("am");
1347
+ }
1348
+ return currValue;
1349
+ }
1350
+ getIsPM() {
1351
+ for (let curr = 0; curr < this._picture.length; curr++) {
1352
+ if (this._picture.charCodeAt(curr) === PICInterface.PIC_PM)
1353
+ return true;
1354
+ }
1355
+ return false;
1356
+ }
1357
+ fillTimeByRange(ContinuousRange, DiscreteRange, buffer) {
1358
+ let pic = this._valDet.getPIC();
1359
+ let currTime = DisplayConvertor.Instance.fromNativeTimeToMgTimeNumber(buffer);
1360
+ let downTime, topTime;
1361
+ let i;
1362
+ this.setValidationFailed(false);
1363
+ if (ContinuousRange != null) {
1364
+ for (i = 0; i < ContinuousRange.length - 1; i++) {
1365
+ downTime = DisplayConvertor.Instance.a_2_time(ContinuousRange.get_Item(i), pic, false);
1366
+ topTime = DisplayConvertor.Instance.a_2_time(ContinuousRange.get_Item(++i), pic, false);
1367
+ if (currTime >= downTime && currTime <= topTime)
1368
+ return new Date(buffer);
1369
+ }
1370
+ }
1371
+ if (DiscreteRange != null) {
1372
+ for (i = 0; i < DiscreteRange.length; i++) {
1373
+ if (currTime === DisplayConvertor.Instance.a_2_time(DiscreteRange.get_Item(i), pic, false))
1374
+ return new Date(buffer);
1375
+ }
1376
+ }
1377
+ throw new WrongFormatException();
1378
+ }
1379
+ printMessage(msgId, setValidationFaild) {
1380
+ let message = new StringBuilder("");
1381
+ let ctrlType;
1382
+ if (msgId === MsgInterface.EDT_ERR_STR_1) {
1383
+ let pic = this._valDet.getPIC();
1384
+ let token = "%d";
1385
+ let messageString = Events.GetMessageString(msgId);
1386
+ messageString = StrUtil.replaceStringTokens(messageString, token, 1, pic.getWholes().toString());
1387
+ messageString = StrUtil.replaceStringTokens(messageString, token, 1, pic.getDec().toString());
1388
+ message.Append(messageString);
1389
+ }
1390
+ else {
1391
+ message.Append(Events.GetMessageString(msgId));
1392
+ if (msgId === MsgInterface.STR_RNG_TXT && this._valDet.getRange() != null)
1393
+ message.Append(StrUtil.makePrintableTokens(this._valDet.getRange(), HTML_2_STR));
1394
+ }
1395
+ if (this._valDet.getControl() != null) {
1396
+ ctrlType = this._valDet.getControl().Type;
1397
+ if (ctrlType !== MgControlType.CTRL_TYPE_BUTTON && ctrlType !== MgControlType.CTRL_TYPE_RADIO && !this._valDet.getControl().isSelectionCtrl()) {
1398
+ let msgString = message.ToString();
1399
+ this._valDet.getControl().getForm().getTask().WriteToMessagePane(StrUtil.makePrintable2(msgString));
1400
+ this._valDet.getControl().getForm().ErrorOccured = !NString.IsNullOrEmpty(msgString);
1401
+ this._valDet.ErrorMessage = message.ToString();
1402
+ }
1403
+ }
1404
+ if (setValidationFaild)
1405
+ this.setValidationFailed(true);
1406
+ }
1407
+ changeStringInside(to, index) {
1408
+ this._newvalue = this._newvalue.substr(0, index) + to + this._newvalue.substr(index + to.length);
1409
+ }
1410
+ init(validationDetails) {
1411
+ this._valDet = validationDetails;
1412
+ this._valDet.setNull(false);
1413
+ this._isPm = false;
1414
+ let pIC = this._valDet.getPIC();
1415
+ this._oldvalue = this._valDet.getOldValue();
1416
+ this._newvalue = this._valDet.getDispValue();
1417
+ if (this._newvalue === null) {
1418
+ if (pIC == null || pIC.getAttr() != StorageAttribute.DATE)
1419
+ this._newvalue = "";
1420
+ }
1421
+ if (this._oldvalue === null) {
1422
+ this._oldvalue = "";
1423
+ }
1424
+ if (!(pIC === null || pIC.getAttr() === StorageAttribute.BLOB || pIC.getAttr() === StorageAttribute.BLOB_VECTOR)) {
1425
+ this._picture = pIC.getMask();
1426
+ this.hebrew = pIC.isHebrew();
1427
+ this._picture = this._picture.substr(0, pIC.getMaskSize());
1428
+ }
1429
+ }
1430
+ findMax(array) {
1431
+ let index = 0;
1432
+ let max = array[index];
1433
+ for (let i = 1; i < array.length; i++) {
1434
+ if (array[i] > max) {
1435
+ max = array[i];
1436
+ index = i;
1437
+ }
1438
+ }
1439
+ return index;
1440
+ }
1441
+ isDataPositionalDirective(toCheck) {
1442
+ let ascii = toCheck.charCodeAt(0);
1443
+ return (ascii === PICInterface.PIC_YY || ascii === PICInterface.PIC_YYYY || ascii === PICInterface.PIC_MMD || ascii === PICInterface.PIC_MMM
1444
+ || ascii === PICInterface.PIC_DD || ascii === PICInterface.PIC_DDD || ascii === PICInterface.PIC_DDDD || ascii === PICInterface.PIC_W
1445
+ || ascii === PICInterface.PIC_WWW || ascii === PICInterface.PIC_HYYYYY || ascii === PICInterface.PIC_HL || ascii === PICInterface.PIC_HDD || ascii === PICInterface.PIC_YJ
1446
+ || ascii === PICInterface.PIC_JY1 || ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB);
1447
+ }
1448
+ isDatePositionalNumericDirective(toCheck) {
1449
+ let ascii = toCheck.charCodeAt(0);
1450
+ return (ascii === PICInterface.PIC_YY || ascii === PICInterface.PIC_YYYY || ascii === PICInterface.PIC_MMD || ascii === PICInterface.PIC_DD
1451
+ || ascii === PICInterface.PIC_DDD || ascii === PICInterface.PIC_DDDD || ascii === PICInterface.PIC_W || ascii === PICInterface.PIC_HYYYYY
1452
+ || ascii === PICInterface.PIC_HL || ascii === PICInterface.PIC_HDD || ascii === PICInterface.PIC_YJ || ascii === PICInterface.PIC_JY1
1453
+ || ascii === PICInterface.PIC_JY2 || ascii === PICInterface.PIC_JY4 || ascii === PICInterface.PIC_BB);
1454
+ }
1455
+ isNumericPositionalDirective(toCheck) {
1456
+ let ascii = toCheck.charCodeAt(0);
1457
+ return (ascii === PICInterface.PIC_N);
1458
+ }
1459
+ isLogicPositionalDirective(toCheck) {
1460
+ let ascii = toCheck.charCodeAt(0);
1461
+ return (ascii === PICInterface.PIC_X);
1462
+ }
1463
+ isTimePositionalDirective(toCheck) {
1464
+ let ascii = toCheck.charCodeAt(0);
1465
+ return (ascii === PICInterface.PIC_HH || ascii === PICInterface.PIC_MMT || ascii === PICInterface.PIC_SS || ascii === PICInterface.PIC_PM || ascii === PICInterface.PIC_MS);
1466
+ }
1467
+ indexOfPositionalNonDirective(str) {
1468
+ let tmp;
1469
+ for (let i = 0; i < str.length; i++) {
1470
+ tmp = str[i];
1471
+ if (DisplayConvertor.isAlphaPositionalDirective(tmp) || this.isDataPositionalDirective(tmp) || this.isNumericPositionalDirective(tmp)
1472
+ || this.isLogicPositionalDirective(tmp) || this.isTimePositionalDirective(tmp))
1473
+ continue;
1474
+ return i;
1475
+ }
1476
+ return -1;
1477
+ }
1478
+ setValidationFailed(val) {
1479
+ if (this._valDet.ValidationFailed)
1480
+ return;
1481
+ else
1482
+ this._valDet.setValidationFailed(val);
1483
+ }
1484
+ digitsBeforeDelimeter(inputString, searchStart, delimeter) {
1485
+ let counter = 0;
1486
+ let searchEndPos = inputString.indexOf(delimeter, searchStart);
1487
+ if (searchEndPos < 0)
1488
+ searchEndPos = inputString.length;
1489
+ for (let i = searchStart; i < searchEndPos; i++)
1490
+ if (NChar.IsDigit(inputString[i]))
1491
+ counter++;
1492
+ return counter;
1493
+ }
1494
+ isNullDisplayVal() {
1495
+ let isNullDisplayVal = false;
1496
+ let field = this._valDet.getControl().getField();
1497
+ if (field.NullAllowed && field.hasNullDisplayValue()) {
1498
+ let dispDefValue = field.getNullDisplay();
1499
+ if (dispDefValue !== null)
1500
+ isNullDisplayVal = (dispDefValue.toString() === this._newvalue);
1501
+ else
1502
+ isNullDisplayVal = (this._newvalue === null);
1503
+ }
1504
+ return isNullDisplayVal;
1505
+ }
1506
+ }
1507
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL0ZpZWxkVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUVULEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLGdCQUFnQixFQUNoQixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUs5QixPQUFPLEVBQWtCLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDckUsT0FBTyxFQUNMLFFBQVEsRUFDUixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxXQUFXLEVBQ1gsZUFBZSxFQUNoQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRzlDLE1BQU0sT0FBTyxjQUFjO0lBWXpCO1FBWFEsY0FBUyxHQUFRLElBQUksQ0FBQztRQUN0QixjQUFTLEdBQVEsSUFBSSxDQUFDO1FBQ3RCLGlCQUFZLEdBQVcsSUFBSSxDQUFDO1FBQzVCLG1CQUFj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Q0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPO2VBQ3ZJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsUUFBUSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSztlQUNsSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFVBQVUsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU07ZUFDdkssS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1SSxDQUFDO0lBR08sZ0NBQWdDLENBQUMsT0FBZTtRQUN0RCxJQUFJLEtBQUssR0FBVyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLFFBQVEsSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssWUFBWSxDQUFDLE1BQU07ZUFDdEksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxRQUFRLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxLQUFLLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxVQUFVO2VBQ3RJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMs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RSxFQUNwRDtZQUNFLElBQUksWUFBWSxHQUFRLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQyxJQUFJLFlBQVksS0FBSyxJQUFJO2dCQUN2QixnQkFBZ0IsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7O2dCQUVoRSxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUM7U0FDaEQ7UUFFRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGF0ZVRpbWUsXHJcbiAgRXhjZXB0aW9uLFxyXG4gIExpc3QsXHJcbiAgTkNoYXIsXHJcbiAgTk51bWJlcixcclxuICBOU3RyaW5nLFxyXG4gIE51bWJlckZvcm1hdEluZm8sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtWYWxpZGF0aW9uRGV0YWlsc30gZnJvbSAnLi9WYWxpZGF0aW9uRGV0YWlscyc7XHJcbmltcG9ydCB7SUVudmlyb25tZW50fSBmcm9tICcuLi8uLi9lbnYvSUVudmlyb25tZW50JztcclxuaW1wb3J0IHtNZ0NvbnRyb2xCYXNlfSBmcm9tICcuL01nQ29udHJvbEJhc2UnO1xyXG5pbXBvcnQge0d1aUZpZWxkQmFzZX0gZnJvbSAnLi4vZGF0YS9HdWlGaWVsZEJhc2UnO1xyXG5pbXBvcnQge0RhdGVCcmVha1BhcmFtcywgRGlzcGxheUNvbnZlcnRvcn0gZnJvbSAnLi9EaXNwbGF5Q29udmVydG9yJztcclxuaW1wb3J0IHtcclxuICBEYXRlVXRpbCxcclxuICBIVE1MXzJfU1RSLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgTXNnSW50ZXJmYWNlLFxyXG4gIFBJQ0ludGVyZmFjZSxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbERhdGVKcG4sXHJcbiAgVXRpbFN0ckJ5dGVNb2RlXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7RXZlbnRzfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQge1dyb25nRm9ybWF0RXhjZXB0aW9ufSBmcm9tICcuL1dyb25nRm9ybWF0RXhjZXB0aW9uJztcclxuaW1wb3J0IHtQSUN9IGZyb20gJy4vUElDJztcclxuaW1wb3J0IHtEYXRlRWxlbWVudH0gZnJvbSAnLi4vLi4vR3VpRW51bXMnO1xyXG5pbXBvcnQge05VTV9UWVBFfSBmcm9tICcuLi9kYXRhL05VTV9UWVBFJztcclxuaW1wb3J0IHtIZWJyZXdEYXRlfSBmcm9tICcuL0hlYnJld0RhdGUnO1xyXG5pbXBvcnQge0Jsb2JUeXBlfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHtHdWlFbnZpcm9ubWVudH0gZnJvbSAnLi4vLi4vR3VpRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge1Byb3BJbnRlcmZhY2V9IGZyb20gXCIuL1Byb3BJbnRlcmZhY2VcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgRmllbGRWYWxpZGF0b3Ige1xyXG4gIHByaXZhdGUgX25ld3ZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX29sZHZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BpY3R1cmVSZWFsOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BpY3R1cmVFbmFibGU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfdmFsRGV0OiBWYWxpZGF0aW9uRGV0YWlscyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaXNQbTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3BpY3R1cmU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBoZWJyZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9kZWNpbWFsOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX2Vudmlyb25tZW50OiBJRW52aXJvbm1lbnQgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX2Vudmlyb25tZW50ID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQ7XHJcbiAgICB0aGlzLl9kZWNpbWFsID0gKHRoaXMuX2Vudmlyb25tZW50LkdldERlY2ltYWwoKSB8fCBcIlwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gdGhlIG1haW4gbWV0aG9kIG9mIHRoaXMgY2xhc3M8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsRGV0XCI+YSBWYWxpZGF0aW9uRGV0YWlscyBvYmplY3QgdG8gdXNlIHdoZW4gdmFsaWRhdGluZzwvcGFyYW0+XHJcbiAgY2hlY2tWYWwodmFsRGV0OiBWYWxpZGF0aW9uRGV0YWlscyk6IFZhbGlkYXRpb25EZXRhaWxzIHtcclxuICAgIHRoaXMuX25ld3ZhbHVlID0gKHRoaXMuX29sZHZhbHVlID0gKHRoaXMuX3BpY3R1cmVSZWFsID0gKHRoaXMuX3BpY3R1cmVFbmFibGUgPSBudWxsKSkpO1xyXG4gICAgdGhpcy5pbml0KHZhbERldCk7XHJcbiAgICB2YWxEZXQuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZSA9IHZhbERldC5nZXRDb250cm9sKCk7XHJcbiAgICAvLyBUT0RPIC0gdW5jb21tZW50IHRoaXMgbGluZSB3aGVuICdQUk9QX1RZUEVfTU9ESUZZX0lOX1FVRVJZJyBpcyBzdXBwb3J0ZWQgZm9yIG90aGVyIGNvbnRyb2xzXHJcbiAgICBsZXQgbW9kSW5RdWV1eTogYm9vbGVhbiA9XHJcbiAgICAgIGN0cmwuaXNSZXBlYXRhYmxlKCk/IGZhbHNlIDogIGN0cmwuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZZX0lOX1FVRVJZLCBmYWxzZSwgY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSkpO1xyXG5cclxuICAgIGxldCB1c2VOYXRpdmU6IGJvb2xlYW4gPSBjdHJsLmlzTW9kaWZpYWJsZSgpO1xyXG5cclxuICAgIGlmIChjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TW9kZSgpID09PSAnRScgJiYgIW1vZEluUXVldXkpIHtcclxuICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuX29sZHZhbHVlKTtcclxuICAgICAgcmV0dXJuIHZhbERldDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTyB8fCBjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YIHx8IGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCIHx8IGN0cmwuaXNTZWxlY3Rpb25DdHJsKCkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWCkge1xyXG4gICAgICAgICAgdmFsRGV0LnNldE51bGwoY3RybC5pc051bGxWYWx1ZSh0aGlzLl9uZXd2YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fbmV3dmFsdWUgIT09IG51bGwgJiYgY3RybC5pc1NlbGVjdGlvbkN0cmwoKSkge1xyXG4gICAgICAgICAgbGV0IGlkeDogbnVtYmVyID0gTk51bWJlci5QYXJzZSh0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgICAgICBpZiAoY3RybC5pc0Nob2ljZU51bGwoaWR4KSkge1xyXG4gICAgICAgICAgICB2YWxEZXQuc2V0TnVsbCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGV4XzExMSkge1xyXG4gICAgICAgIGlmIChleF8xMTEgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXhfMTExO1xyXG4gICAgICB9XHJcbiAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICAgIHJldHVybiB2YWxEZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc3BhY2V8bm90aGluZyB3YXMgaW5zZXJ0ZWQgIC0+IHVzZSBkZWZhdWx0IHZhbHVlXHJcbiAgICBpZiAoY3RybC5EYXRhVHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSAmJiBjdHJsLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUgJiYgY3RybC5EYXRhVHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB7XHJcbiAgICAgICAgICBpZiAoKHR5cGVvZiB0aGlzLl9uZXd2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdGhpcy5fbmV3dmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkgfHwgKGN0cmwuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSAmJiAoY3RybC5pc0RhdGVaZXJvKHRoaXMuX25ld3ZhbHVlKSB8fCB0aGlzLmlzTnVsbERpc3BsYXlWYWwoKSkpKSB7XHJcbiAgICAgICAgICAgIGxldCBmaWVsZDogR3VpRmllbGRCYXNlID0gY3RybC5nZXRGaWVsZCgpO1xyXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlOiBzdHJpbmcgPSBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICAgICAgbGV0IHRleHQ6IGFueSA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGxEZWZhdWx0KCkpIHtcclxuICAgICAgICAgICAgICB2YWxEZXQuc2V0TnVsbCh0cnVlKTtcclxuICAgICAgICAgICAgICB0ZXh0ID0gZmllbGQuZ2V0TnVsbERpc3BsYXkoKTtcclxuICAgICAgICAgICAgICBpZiAoTlN0cmluZy5Jc051bGxPckVtcHR5KHRleHQpICYmIGN0cmwuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSkge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChkZWZhdWx0VmFsdWUsIHZhbERldC5nZXRSYW5nZSgpLCB2YWxEZXQuZ2V0UElDKCksIHVzZU5hdGl2ZSwgZmllbGQuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHRleHQgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AoZGVmYXVsdFZhbHVlLCB2YWxEZXQuZ2V0UmFuZ2UoKSwgdmFsRGV0LmdldFBJQygpLCB1c2VOYXRpdmUsIGZpZWxkLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoKCFmaWVsZC5pc051bGxEZWZhdWx0KCkgJiYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9PSBudWxsKSkpXHJcbiAgICAgICAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0ZXh0O1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGV4dCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbERldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgIH1cclxuXHJcblxyXG4gICAgaWYgKCh0eXBlb2YgdGhpcy5fbmV3dmFsdWUgPT09ICdzdHJpbmcnICYmICEoU3RyVXRpbC5ydHJpbSh0aGlzLl9uZXd2YWx1ZSkgPT09IFN0clV0aWwucnRyaW0odGhpcy5fb2xkdmFsdWUpKSkgfHwgY3RybC5Nb2RpZmllZEJ5VXNlcilcclxuICAgIHtcclxuICAgICAgdHJ5XHJcbiAgICAgIHtcclxuICAgICAgICBzd2l0Y2ggKHZhbERldC5nZXRUeXBlKCkpXHJcbiAgICAgICAge1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja0FscGhhRmllbGQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgICAgICB0aGlzLl9waWN0dXJlUmVhbCA9IHZhbERldC5nZXRQaWN0dXJlUmVhbCgpOyAvLyBvbmx5IG51bWVyaWMgdHlwZSBuZWVkIGFub3RoZXIgcGljdHVyZSBmb3JtYXRcclxuICAgICAgICAgICAgdGhpcy5fcGljdHVyZUVuYWJsZSA9IHZhbERldC5nZXRQaWN0dXJlRW5hYmxlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tOdW1lcmljUGljdHVyZSgpO1xyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja051bWVyaWNGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgICAgIHZhbERldC5zZXRWYWx1ZSh0aGlzLmNoZWNrTG9naWNhbEZpZWxkKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICAgICAgdmFsRGV0LnNldFZhbHVlKHRoaXMuY2hlY2tEYXRlRmllbGQoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5jaGVja1RpbWVGaWVsZCgpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgICAvLyB0aGVyZSBpcyBubyByZWFsIHBpY3R1cmUgdG8gQkxPQiwgZG8gbm90aGluZ1xyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5fbmV3dmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTpcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiRmllbGRWYWxpZGF0b3IuY2hlY2tWYWw6IFR5cGUgb2YgdGhlIGZpZWxkIFwiICsgdmFsRGV0LmdldFR5cGUoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZ29CYWNrKSB7XHJcbiAgICAgICAgaWYgKGdvQmFjayBpbnN0YW5jZW9mIFdyb25nRm9ybWF0RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAvLyBuZWVkIGNoYW5nZSB0byBvbGQgdmFsdWUsIHNldCBmb2N1cyBiYWNrIGFuZCB3cml0ZSBFcnJvciBNZXNzYWdlXHJcbiAgICAgICAgICB2YWxEZXQuc2V0VmFsdWUodGhpcy5fb2xkdmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKHRydWUpO1xyXG4gICAgICAgICAgaWYgKGdvQmFjay5nZXRUeXBlKCkgIT09IE1zZ0ludGVyZmFjZS5TVFJfUk5HX1RYVCkge1xyXG4gICAgICAgICAgICB0aGlzLnByaW50TWVzc2FnZShnb0JhY2suZ2V0VHlwZSgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhULCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxEZXQ7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrICYgdmFsaWRhdGUgQWxwaGEgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFN0cmluZyAtIG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0FscGhhRmllbGQoKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCk7XHJcblxyXG4gICAgbGV0IElzQXR0ckFscGhhOiBib29sZWFuID0gdGhpcy5fdmFsRGV0LmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTtcclxuXHJcbiAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID09PSAwICYmIHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSA9PT0gbnVsbCAmJiB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9uZXd2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSXNBdHRyQWxwaGEgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICBsZXQgcGljTGVuQjogbnVtYmVyID0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIodGhpcy5fcGljdHVyZSk7XHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUubGVuQih0aGlzLl9uZXd2YWx1ZSkgPiBwaWNMZW5CKSB7XHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIodGhpcy5fbmV3dmFsdWUsIHBpY0xlbkIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA+IHRoaXMuX3BpY3R1cmUubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoMCwgdGhpcy5fcGljdHVyZS5sZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBsZXQgY3VyclBpY3R1cmU6IG51bWJlcjtcclxuICAgIGxldCBpOiBudW1iZXIgPSBjdXJyUGljdHVyZSA9IDA7XHJcblxyXG4gICAgZm9yIChjdXJyUGljdHVyZSA9IGkgPSAwOyBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoICYmIGN1cnJQaWN0dXJlIDwgdGhpcy5fcGljdHVyZS5sZW5ndGg7ICkge1xyXG4gICAgICBpZiAoIURpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSAmJiB0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkgPT09IHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSkge1xyXG4gICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGN1cnJQaWN0dXJlKSk7XHJcbiAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICghRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpICYmIHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSAhPT0gdGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSB7XHJcbiAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpO1xyXG4gICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZS5jaGFyQXQoY3VyclBpY3R1cmUpKSAmJiB0aGlzLmlzUG9zc2libGVBbHBoYUxldHRlcihpLCBjdXJyUGljdHVyZSkpIHtcclxuICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgICAgICAgICBsZXQgc3RyVmFsOiBzdHJpbmcgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoaSwgMSk7XHJcbiAgICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0clZhbCkgPT09IDIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChJc0F0dHJBbHBoYSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY3VyclBpY3R1cmUgKyAxIDwgdGhpcy5fcGljdHVyZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSArIDEpKSAmJiB0aGlzLmlzUG9zc2libGVBbHBoYUxldHRlcihpLCBjdXJyUGljdHVyZSArIDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoJyAnKS8qJyAnKi87XHJcbiAgICAgICAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICBjdXJyUGljdHVyZSA9IGN1cnJQaWN0dXJlICsgMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQodGhpcy5fbmV3dmFsdWUuY2hhckF0KGkpKTtcclxuICAgICAgICAgICAgICBpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpLyonICcqLztcclxuICAgICAgICAgICAgY3VyclBpY3R1cmUgPSBjdXJyUGljdHVyZSArIDE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHR5cGU6IE1nQ29udHJvbFR5cGUgPSBjb250cm9sLlR5cGU7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfTlVNLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9uZXd2YWx1ZSA9IHN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKTtcclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT09IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuZmlsbEFscGhhQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICB0aGlzLl9uZXd2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayBpZiBjaGFyIGluIEFscGhhIGNvbXBsZWF0ZSB3aXRoIERpcmVjdGl2ZSBDaGFyYWN0ZXIgZm9yIHRoZSBsZXR0ZXI8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW5kZXhcIj5vZiBkaXJlY3RpdmUgaW4gc3RyaW5nIHRvIGNoZWNrPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgY29tcGxldGUsIGZhbHNlIG90aGVyd2lzZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGlzUG9zc2libGVBbHBoYUxldHRlcihpbmRleElucHV0OiBudW1iZXIsIGluZGV4UGljdHVyZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG4gICAgc3dpdGNoICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoaW5kZXhQaWN0dXJlKSkge1xyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0o6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19HOlxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfUzpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1Q6XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVTpcclxuICAgICAgICBsZXQgdXBwZXI6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKHVwcGVyICE9PSB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XSlcclxuICAgICAgICAgIHRoaXMuY2hhbmdlU3RyaW5nSW5zaWRlKFwiXCIgKyB1cHBlciwgaW5kZXhJbnB1dCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTDpcclxuICAgICAgICBsZXQgbG93ZXI6IHN0cmluZyA9IHRoaXMuX25ld3ZhbHVlW2luZGV4SW5wdXRdLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKGxvd2VyICE9PSB0aGlzLl9uZXd2YWx1ZVtpbmRleElucHV0XSlcclxuICAgICAgICAgIHRoaXMuY2hhbmdlU3RyaW5nSW5zaWRlKFwiXCIgKyBsb3dlciwgaW5kZXhJbnB1dCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTjpcclxuICAgICAgICBsZXQgbnVtYmVyMTogc3RyaW5nID0gdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF07XHJcbiAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KG51bWJlcjEpIHx8IE5DaGFyLklzV2hpdGVTcGFjZShudW1iZXIxKSB8fCBVdGlsU3RyQnl0ZU1vZGUuYXNOdW1lcmljKG51bWJlcjEpKVxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUVycm9yVG9Mb2coXCJCYWQgQWxwaGEgdmFsdWUuIFNob3VsZCBiZSBudW1iZXIgb25seSBvbiBwbGFjZSBOdW0uIFwiICsgaW5kZXhJbnB1dCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBFdmVudHMuV3JpdGVFcnJvclRvTG9nKFwiRmllbGRWYWxpZGF0b3IuaXNQb3NzaWJsZUFscGhhTGV0dGVyOiBpbGxlZ2FsIENoYXIgRGlyZWN0aXZlOiBcIiArIHRoaXMuX3BpY3R1cmUuaW5kZXhPZihTdHJpbmcuZnJvbUNoYXJDb2RlKGluZGV4UGljdHVyZSkpICsgXCIgZm9yIFwiICsgdGhpcy5fbmV3dmFsdWVbaW5kZXhJbnB1dF0pO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pZiBuZXcgdmFsdWUgd2Fzbid0IGZpbmlzaGVkIGFuZCBzdGF5IHVud3JpdGFibGUgcGVhY2VzIG9mIHRoZSBSZWFsIHBpY3R1cmUgLSBhZGQgaXRcclxuICAvLy8gdG8gdGhlIGVuZCBvZiB0aGUgbmV3dmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZmlsbEFsbEFscGhhKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaXMuX3BpY3R1cmUubGVuZ3RoKTtcclxuICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX25ld3ZhbHVlKTtcclxuXHJcbiAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiB0aGlzLl92YWxEZXQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSB7XHJcbiAgICAgIGxldCBpbnROZXd2YWx1ZUxlbkI6IG51bWJlciA9IFV0aWxTdHJCeXRlTW9kZS5sZW5CKHRoaXMuX25ld3ZhbHVlKTtcclxuICAgICAgbGV0IHN0ckJ1aWVkUGljdHVyZTogc3RyaW5nID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHRoaXMuX3BpY3R1cmUsIGludE5ld3ZhbHVlTGVuQik7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHN0ckJ1aWVkUGljdHVyZS5sZW5ndGg7IGkgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZS5jaGFyQXQoaSkpKSB7XHJcbiAgICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZCgnICcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGkpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggLSAxOyBpIDwgdGhpcy5fcGljdHVyZS5sZW5ndGggJiYgaSA+PSAwOyBpKyspIHtcclxuICAgICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlLmNoYXJBdChpKSkpIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKCcgJykvKicgJyovO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmUuY2hhckF0KGkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNvbXBhcmF0aXZlIG5ld3ZhbHVlIHdpdGggcG9zc2libGUgUmFuZ2UgaW4gQ29udGludW91c1JhbmdlVmFsdWVzL0Rpc2NyZXRlUmFuZ2VWYWx1ZXM8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXd2YWx1ZSBpZiBpdCBwb3NzaWJsZSwgb2xkdmFsdWUgb3RoZXJ3aXNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZmlsbEFscGhhQnlSYW5nZShDb250aW51b3VzUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgRGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+KTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgdG1wQnVmZmVyOiBzdHJpbmcgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmZpbGxBbHBoYUJ5RGlzY3JldGVSYW5nZVZhbHVlcyhEaXNjcmV0ZVJhbmdlVmFsdWVzLCB0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICBpZiAodG1wQnVmZmVyICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0bXBCdWZmZXI7XHJcbiAgICB9XHJcblxyXG4gICAgdG1wQnVmZmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5maWxsQWxwaGFCeUNvbnRpbnVvdXNSYW5nZVZhbHVlcyhDb250aW51b3VzUmFuZ2VWYWx1ZXMsIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpXHJcbiAgICAgIHJldHVybiB0bXBCdWZmZXI7XHJcblxyXG4gICAgICBpZiAoRGlzY3JldGVSYW5nZVZhbHVlcyAhPT0gbnVsbClcclxuICAgICAgICByZXR1cm4gdGhpcy5Db21wbGV0ZUFscGhhQnlSYW5nZShEaXNjcmV0ZVJhbmdlVmFsdWVzKTtcclxuXHJcblxyXG4gICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhULCB0cnVlKTtcclxuICAgIHJldHVybiB0aGlzLl9vbGR2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5UcnkgdG8gY29tcGxldGUgdGhlIG5ld3ZhbHVlIGJ5IFJhbmdlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gY29tcGxldGVkIHZhbHVlIGlmIGl0IHBvc3NpYmxlLCBvdGhlcndpc2Ugb2xkdmFsdWU8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBDb21wbGV0ZUFscGhhQnlSYW5nZShEaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4pOiBzdHJpbmcge1xyXG4gICAgbGV0IHRtcE5ld1ZhbHVlOiBzdHJpbmcgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmNvbXBsZXRlQWxwaGFCeVJhbmdlKERpc2NyZXRlUmFuZ2VWYWx1ZXMsIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIGlmICh0bXBOZXdWYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdG1wTmV3VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZm9jdXMgYmFja1xyXG4gICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhULCB0cnVlKTtcclxuICAgIHJldHVybiB0aGlzLl9vbGR2YWx1ZTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgJiB2YWxpZGF0ZSBMb2dpY2FsIGZpZWxkIGJ5IGhpcyBvbGQvbmV3IHZhbHVlIGFuZCAyIHBpY3R1cmVzOlxyXG4gIC8vLyBSZWFsIGFuZCBFbmFibGVcclxuICAvLy8gMS5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHBpY3R1cmVzLCBvdGhlcndpc2UgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDIuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCByYW5nZVxyXG4gIC8vLyAyLjEgY29tcGxldGUgdmFsdWUsIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBTdHJpbmcgLSBuZXcgdmFsdWUgb2YgdmFsaWRhdGVkIGZpZWxkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tMb2dpY2FsRmllbGQoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgPT09IG51bGwgJiYgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSA9PT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9STkdfVFhUKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9PSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fbmV3dmFsdWUgPSB0aGlzLmZpbGxBbHBoYUJ5UmFuZ2UodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpLCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQoZmFsc2UpO1xyXG5cclxuICAvLyB0b2RvIDogbmVlZCB0byBjaGVjayB3aGF0IGlzIHRvIGhhbmRsZSBmb3IgY2hlY2tpbmcgcmFuZ2VzXHJcbiAgICByZXR1cm4gdGhpcy5fbmV3dmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KioqKioqKioqKioqKioqKioqKioqKioqKipOdW1lcmljKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgJiB2YWxpZGF0ZSBOdW1lcmljIGZpZWxkIGJ5IGhpcyBvbGQvbmV3IHZhbHVlIGFuZCAyIHBpY3R1cmVzOlxyXG4gIC8vLyBSZWFsIGFuZCBFbmFibGVcclxuICAvLy8gMS5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHBpY3R1cmVzLCBvdGhlcndpc2UgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDIuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCByYW5nZVxyXG4gIC8vLyAyLjEgY29tcGxldGUgdmFsdWUsIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBTdHJpbmcgLSBuZXcgdmFsdWUgb2YgdmFsaWRhdGVkIGZpZWxkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljRmllbGQoKTogYW55IHtcclxuXHJcbiAgICBsZXQgZXZhbHVhdGVkOiBhbnk7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuX25ld3ZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBcIjBcIjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGRlbGltZXRlclJlYWxJbmRleDogbnVtYmVyID0gdGhpcy5fbmV3dmFsdWUuaW5kZXhPZih0aGlzLl9kZWNpbWFsKTtcclxuICAgICAgbGV0IGRlbGltZXRlclBpY3RJbmRleDogbnVtYmVyID0gdGhpcy5fcGljdHVyZVJlYWwuaW5kZXhPZih0aGlzLl9kZWNpbWFsKTtcclxuXHJcbiAgICAgIGV2YWx1YXRlZCA9IFwiXCI7XHJcbiAgICAgIGxldCBldmFsdWF0ZWRMZWZ0OiBzdHJpbmc7XHJcbiAgICAgIGxldCBldmFsdWF0ZWRSaWdodDogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgZm9ybWF0IG9mIG5ld3ZhbHVlIG1hdGNoZXMgdGhlIG51bWVyaWMgbWFzay5cclxuICAgICAgaWYgKCF0aGlzLmNoZWNrTnVtZXJpY0luRGVjRm9ybWF0KCkpXHJcbiAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5FRFRfRVJSX1NUUl8xKTtcclxuXHJcbiAgICAgIGlmIChkZWxpbWV0ZXJQaWN0SW5kZXggIT09IC0xICYmIGRlbGltZXRlclJlYWxJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBldmFsdWF0ZWRMZWZ0ID0gdGhpcy5jaGVja051bWVyaWNMZWZ0KGRlbGltZXRlclBpY3RJbmRleCwgZGVsaW1ldGVyUmVhbEluZGV4KTtcclxuICAgICAgICBldmFsdWF0ZWRSaWdodCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoZGVsaW1ldGVyUGljdEluZGV4LCBkZWxpbWV0ZXJSZWFsSW5kZXgpO1xyXG4gICAgICAgIGV2YWx1YXRlZCA9IGV2YWx1YXRlZExlZnQgKyB0aGlzLl9kZWNpbWFsICsgZXZhbHVhdGVkUmlnaHQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGRlbGltZXRlclBpY3RJbmRleCAhPT0gLTEgJiYgZGVsaW1ldGVyUmVhbEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgZXZhbHVhdGVkTGVmdCA9IHRoaXMuY2hlY2tOdW1lcmljTGVmdChkZWxpbWV0ZXJQaWN0SW5kZXgsIE1hdGgubWluKGRlbGltZXRlclBpY3RJbmRleCwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoKSk7XHJcbiAgICAgICAgICBldmFsdWF0ZWRSaWdodCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoZGVsaW1ldGVyUGljdEluZGV4LCBkZWxpbWV0ZXJQaWN0SW5kZXggLSAxKTtcclxuICAgICAgICAgIGV2YWx1YXRlZCA9IGV2YWx1YXRlZExlZnQgKyB0aGlzLl9kZWNpbWFsICsgZXZhbHVhdGVkUmlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgeyAvLyBkZWxpbWV0ZXJQaWN0SW5kZXggPT0gLTEgJiYgZGVsaW1ldGVyUmVhbEluZGV4ICE9IC0xXHJcbiAgICAgICAgICBpZiAoZGVsaW1ldGVyUGljdEluZGV4ID09PSAtMSAmJiBkZWxpbWV0ZXJSZWFsSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuY2hlY2tOdW1lcmljUmlnaHQoLTEsIC0xKTtcclxuICAgICAgICAgICAgZXZhbHVhdGVkTGVmdCA9IGV2YWx1YXRlZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZGVsaW1ldGVyUmVhbEluZGV4ID4gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5fbmV3dmFsdWUuc3Vic3RyKDAsIGRlbGltZXRlclJlYWxJbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fbmV3dmFsdWUgPSBcIjBcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBldmFsdWF0ZWQgPSB0aGlzLmNoZWNrTnVtZXJpY1JpZ2h0KC0xLCAtMSk7XHJcbiAgICAgICAgICAgIGV2YWx1YXRlZExlZnQgPSBldmFsdWF0ZWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoKGV2YWx1YXRlZFJpZ2h0Lmxlbmd0aCA9PT0gMCAmJiBldmFsdWF0ZWRMZWZ0Lmxlbmd0aCA9PT0gMCkgfHwgKGV2YWx1YXRlZC5sZW5ndGggPT09IDAgJiYgdGhpcy5fbmV3dmFsdWUubGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAvLyBzcGFjZXxub3RoaW5nIHdhcyBpbnNlcnRlZCAgLT4gdXNlIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZTtcclxuICAgICAgICBjdHJsID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKTtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkOiBHdWlGaWVsZEJhc2UgPSBjdHJsLmdldEZpZWxkKCk7XHJcbiAgICAgICAgbGV0IGRlZlZhbHVlOiBzdHJpbmcgPSBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKTsgLy8gaW5uZXIgdmFsdWUgaW5zZXJ0ZWRcclxuICAgICAgICBsZXQgZGlzcERlZlZhbHVlOiBhbnkgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoZmllbGQuaXNOdWxsRGVmYXVsdCgpKSB7XHJcbiAgICAgICAgICB0aGlzLl92YWxEZXQuc2V0TnVsbCh0cnVlKTtcclxuICAgICAgICAgIGRpc3BEZWZWYWx1ZSA9IGZpZWxkLmdldE51bGxEaXNwbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwRGVmVmFsdWUgPT0gbnVsbClcclxuICAgICAgICAgIGRpc3BEZWZWYWx1ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChkZWZWYWx1ZSwgdGhpcy5fdmFsRGV0LmdldFJhbmdlKCksIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgZmllbGQuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIGRpZ2l0IGJlZm9yZSB0aGUgZGVsaW1pdGVyIGRvIG5vdCBleGNlZWQgdGhlIHBpYyB3aG9sZXMuXHJcbiAgICAgIGxldCB3aG9sZURpZ2l0ZGlmZjogbnVtYmVyID0gdGhpcy5kaWdpdHNCZWZvcmVEZWxpbWV0ZXIoZXZhbHVhdGVkLCAwLCB0aGlzLl9kZWNpbWFsKSAtIHRoaXMuX3ZhbERldC5nZXRQSUMoKS5nZXRXaG9sZXMoKTtcclxuICAgICAgLy8gaWYgdGhleSBkbywgY2hlY2sgaWYgdGhlIGV4Y2VlZGluZyBjaGFycyBhcmUgdGhlIHBhZCBjaGFycy4gaWYgc28sIHRoZXJlIGlzIG5vIGVycm9yLlxyXG4gICAgICBpZiAod2hvbGVEaWdpdGRpZmYgPiAwKSB7XHJcbiAgICAgICAgbGV0IHBhZENoYXJPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgLy8gaXMgdGhlcmUgYSBwYWQsIGNoZWNrIGl0LiBubyBwYWQgaXMgYSBjZXJ0YWluIGVycm9yLlxyXG4gICAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0SXNQYWRGaWxsKCkpIHtcclxuICAgICAgICAgIHBhZENoYXJPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB3aG9sZURpZ2l0ZGlmZiAmJiBwYWRDaGFyT25seTsgaSsrKVxyXG4gICAgICAgICAgICAvLyBpZiB0aGUgY2hhciBpcyBub3QgdGhlIHBhZCwgdGhlbiB0aGlzIGlzIGFuIGVycm9yLlxyXG4gICAgICAgICAgICBpZiAoZXZhbHVhdGVkW2ldICE9PSB0aGlzLl92YWxEZXQuZ2V0UGFkRmlsbENoYXIoKSlcclxuICAgICAgICAgICAgICBwYWRDaGFyT25seSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwYWRDaGFyT25seSlcclxuICAgICAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuRURUX0VSUl9TVFJfMSk7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICBpZiAodGhpcy5fdmFsRGV0LmdldElzTmVnYXRpdmUoKSAmJiAodGhpcy5fbmV3dmFsdWUudHJpbSgpLnN0YXJ0c1dpdGgoXCItXCIpIHx8ICh0aGlzLl92YWxEZXQuZ2V0TmVnYXRpdmVTaWduUHJlZigpLmxlbmd0aCAhPT0gMCAmJiB0aGlzLl9uZXd2YWx1ZS50cmltKCkuc3RhcnRzV2l0aCh0aGlzLl92YWxEZXQuZ2V0TmVnYXRpdmVTaWduUHJlZigpKSkpKSB7XHJcbiAgICAgICAgZXZhbHVhdGVkID0gXCItXCIgKyBldmFsdWF0ZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGZyb20gdGhpcyBwb2ludCBoYXZlIGV2YWx1YXRlZCBzdHJpbmcgLSB0aGUgdmFsdWUgKHdpdGhvdXQgbWFzaykgb2YgdGhlIGNvbnRyb2xcclxuICAgICAgLy8gbmVlZGVkIHRvIGJlIGluc2VydGVkIHRvIHRoZSBwaWN0dXJlXHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyh0aGlzLl9uZXd2YWx1ZSwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTik7XHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChldmFsdWF0ZWQsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgdHJ1ZSk7XHJcblxyXG4gICAgICAvLyBpbiBvcmRlciBjaGVjayBpZiB1c2VyIGhhcyBlbnRlcmVkIGEgYmxhbmsgdmFsdWUgLCB0cmltIGFuZCB0aGVuIGNoZWNrIGl0J3MgbGVuZ3RoLlxyXG4gICAgICBsZXQgdGVtcERpc3BWYWw6IHN0cmluZyA9IFN0clV0aWwubHRyaW0oZXZhbHVhdGVkKTtcclxuICAgICAgaWYgKHRlbXBEaXNwVmFsLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl92YWxEZXQuZ2V0UElDKCkuemVyb0ZpbGwoKSAmJiB0aGlzLl92YWxEZXQuZ2V0UElDKCkuZ2V0WmVyb1BhZCgpID09PSAnICcpXHJcbiAgICAgICAgZXZhbHVhdGVkID0gXCIwXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuXHJcbiAgICAgIC8vIGZyb20gdGhpcyBwb2ludCBoYXZlIGV2YWx1YXRlZCBzdHJpbmcgLSB0aGUgdmFsdWUgKHdpdGhvdXQgbWFzaykgb2YgdGhlIGNvbnRyb2xcclxuICAgICAgLy8gbmVlZGVkIHRvIGJlIGluc2VydGVkIHRvIHRoZSBwaWN0dXJlXHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyh0aGlzLl9uZXd2YWx1ZSwgdGhpcy5fdmFsRGV0LmdldFBJQygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpLCBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTik7XHJcbiAgICAgIGV2YWx1YXRlZCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChldmFsdWF0ZWQsIFwiXCIsIHRoaXMuX3ZhbERldC5nZXRQSUMoKSwgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgdHJ1ZSk7XHJcblxyXG4gICAgfVxyXG4gICAgLy8gSW5zZXJ0IHRoZSBudW1iZXIgdG8gcmFuZ2VcclxuICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCkgIT0gbnVsbCB8fCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuX25ld3ZhbHVlID0gZXZhbHVhdGVkO1xyXG4gICAgICBldmFsdWF0ZWQgPSB0aGlzLmZpbGxOdW1lcmljQnlSYW5nZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGV2YWx1YXRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5DaGVjayB2YWxpZGl0eSBvZiBudW1lcmljYWwgcGljdHVyZSBmcm9tIGZvdW5kICdkZWxpbWV0ZXInIHRvIGxlZnQuXHJcbiAgLy8vIDwtLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1ldGVyUGljdEluZGV4XCI+Zm91bmQgZGVsaW1ldGVyIGluIHRoZSBwaWN0dXJlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJSZWFsSW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIGluc2VydGVkIGJ5IHVzZXIgbmV3IHZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrTnVtZXJpY0xlZnQoZGVsaW1ldGVyUGljdEluZGV4OiBudW1iZXIsIGRlbGltZXRlclJlYWxJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBidWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IFJlYWxJbmRleDogbnVtYmVyID0gZGVsaW1ldGVyUmVhbEluZGV4IC0gMTtcclxuICAgIGxldCBQaWN0SW5kZXg6IG51bWJlcjtcclxuICAgIGxldCBpc0ZvdW5kOiBib29sZWFuO1xyXG5cclxuICAgIGZvciAoUGljdEluZGV4ID0gZGVsaW1ldGVyUGljdEluZGV4IC0gMTsgUGljdEluZGV4ID49IDAgJiYgUmVhbEluZGV4ID49IDA7IFBpY3RJbmRleC0tKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgIHtcclxuICAgICAgICBsZXQgdG1wc3RvcmFnZTogbnVtYmVyID0gUmVhbEluZGV4O1xyXG4gICAgICAgIGlzRm91bmQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgZm9yICg7IFJlYWxJbmRleCA+PSAwOyBSZWFsSW5kZXgtLSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSA9PT0gdGhpcy5fbmV3dmFsdWVbUmVhbEluZGV4XSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaXNGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIFJlYWxJbmRleC0tO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXNGb3VuZClcclxuICAgICAgICAgIFJlYWxJbmRleCA9IHRtcHN0b3JhZ2U7XHJcblxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fcGljdHVyZVJlYWxbUGljdEluZGV4XSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gY2FuIGluc2VydCBvbmx5IG51bWJlclxyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBmb3IgKDsgUmVhbEluZGV4ID49IDA7IFJlYWxJbmRleC0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKSlcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9uZXd2YWx1ZVtSZWFsSW5kZXhdKTtcclxuICAgICAgICAgICAgUmVhbEluZGV4LS07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChSZWFsSW5kZXggPCAwICYmIFBpY3RJbmRleCA+PSAwKVxyXG4gICAgLy8gdHJ5IHRvIGFkZCB1bndyaXRhYmxlXHJcbiAgICAgIGZvciAoOyBQaWN0SW5kZXggPj0gMDsgUGljdEluZGV4LS0pXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmVSZWFsW1BpY3RJbmRleF0pO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAvLyBvbmx5IGZyb20gbGVmdCBuZWVkIFBhZEZpbGxcclxuICAgICAgICAgIGlmICh0aGlzLl92YWxEZXQuZ2V0SXNQYWRGaWxsKCkpXHJcbiAgICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fdmFsRGV0LmdldFBhZEZpbGxDaGFyKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIHJldHVybiBTdHJVdGlsLlJldmVyc2VTdHJpbmcoYnVmZmVyKS5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrIHZhbGlkaXR5IG9mIG51bWVyaWNhbCBwaWN0dXJlIGZyb20gZm91bmQgJ2RlbGltZXRlcicgdG8gcmlnaHQuXHJcbiAgLy8vIC4tPlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1ldGVyUGljdEluZGV4XCI+Zm91bmQgZGVsaW1ldGVyIGluIHRoZSBwaWN0dXJlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbWV0ZXJSZWFsSW5kZXhcIj5mb3VuZCBkZWxpbWV0ZXIgaW4gdGhlIGluc2VydGVkIGJ5IHVzZXIgbmV3IHZhbHVlPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrTnVtZXJpY1JpZ2h0KGRlbGltZXRlclBpY3RJbmRleDogbnVtYmVyLCBkZWxpbWV0ZXJSZWFsSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBSZWFsSW5kZXg6IG51bWJlciA9IGRlbGltZXRlclJlYWxJbmRleCArIDE7XHJcbiAgICBsZXQgUGljdEluZGV4OiBudW1iZXI7XHJcbiAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcblxyXG4gICAgZm9yIChQaWN0SW5kZXggPSBkZWxpbWV0ZXJQaWN0SW5kZXggKyAxOyBQaWN0SW5kZXggPCB0aGlzLl9waWN0dXJlRW5hYmxlLmxlbmd0aCAmJiBSZWFsSW5kZXggPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGg7IFBpY3RJbmRleCsrKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5fcGljdHVyZUVuYWJsZVtQaWN0SW5kZXhdID09PSAnMScpXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoUmVhbEluZGV4IDwgUGljdEluZGV4KVxyXG4gICAgICAgICAgUmVhbEluZGV4ID0gUGljdEluZGV4O1xyXG5cclxuICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmVSZWFsW1BpY3RJbmRleF0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNhbiBpbnNlcnQgb25seSBudW1iZXJcclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgZm9yICg7IFJlYWxJbmRleCA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDsgUmVhbEluZGV4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSBkaWdpdCBvZiBhY3R1YWwgaW5wdXQgZGF0YS4gSWYgaXQgaXMgbWFzayBjaGFyLCBza2lwIGl0LlxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW1JlYWxJbmRleF0pICYmICFwaWMucGljSXNNYXNrKFJlYWxJbmRleCkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fbmV3dmFsdWVbUmVhbEluZGV4XSk7XHJcbiAgICAgICAgICAgIFJlYWxJbmRleCsrO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiByaWdodCBwYXJ0IGhhcyBhbnkgaW5wdXQgZGF0YSwgdGhlbiBvbmx5IGFwcGVuZCB1bndyaXRhYmxlIGNoYXJzXHJcbiAgICBpZiAoYnVmZmVyLkxlbmd0aCA+IDApXHJcbiAgICB7XHJcbiAgICAgIGlmIChSZWFsSW5kZXggPj0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoICYmIFBpY3RJbmRleCA8IHRoaXMuX3BpY3R1cmVSZWFsLmxlbmd0aClcclxuICAgICAgLy8gdHJ5IHRvIGFkZCB1bndyaXRhYmxlXHJcbiAgICAgICAgZm9yICg7IFBpY3RJbmRleCA8IHRoaXMuX3BpY3R1cmVSZWFsLmxlbmd0aDsgUGljdEluZGV4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3BpY3R1cmVFbmFibGVbUGljdEluZGV4XSA9PT0gJzEnKVxyXG4gICAgICAgICAgICBidWZmZXIuQXBwZW5kKHRoaXMuX3BpY3R1cmVSZWFsW1BpY3RJbmRleF0pO1xyXG4gICAgICAgICAgLy8gZWxzZSBEbyBub3RoaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkJVRzogNDQyNzg4XHJcbiAgLy8vIENoYW5naW5nIGRlY2ltYWwgc2VwYXJhdG9yIGluIHRoZXcgcGljdHVyZVJlYWwgdG8gdmFsdWUgZ290IGZyb20gRW52aXJvbm1lbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljUGljdHVyZSgpOiB2b2lkIHtcclxuICAgIGxldCBpbmRleE9mRGVjOiBudW1iZXI7XHJcbiAgICBsZXQgbGFzdERlYzogbnVtYmVyO1xyXG4gICAgbGV0IG1heExlbmd0aDogbnVtYmVyO1xyXG4gICAgbGV0IGN1cnJJbmR4OiBudW1iZXI7XHJcbiAgICBsZXQgUE9JTlRfREVDOiBzdHJpbmcgPSBcIi5cIjsgLy8gdXNlZCBpbiBQSUNUVVJFIGZvciBkZWNpbWFsIHNlcGFyYXRvclxyXG5cclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fcGljdHVyZVJlYWwgPT0gbnVsbCB8fCB0aGlzLl9waWN0dXJlRW5hYmxlID09IG51bGwgfHwgcGljLmdldEF0dHIoKSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8ICFwaWMud2l0aERlY2ltYWwoKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGxhc3REZWMgPSB0aGlzLl9waWN0dXJlUmVhbC5sYXN0SW5kZXhPZihQT0lOVF9ERUMpO1xyXG4gICAgbWF4TGVuZ3RoID0gdGhpcy5fcGljdHVyZUVuYWJsZS5sZW5ndGg7XHJcbiAgICBjdXJySW5keCA9IDA7XHJcbiAgICB3aGlsZSAoY3VyckluZHggPCBsYXN0RGVjKVxyXG4gICAge1xyXG4gICAgICBpbmRleE9mRGVjID0gdGhpcy5fcGljdHVyZUVuYWJsZS5pbmRleE9mKFwiMVwiLCBjdXJySW5keCk7XHJcblxyXG4gICAgICBpZiAoaW5kZXhPZkRlYyA9PT0gLTEpXHJcbiAgICAgIC8vIG5vdCBmb3VuZFxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGluZGV4T2ZEZWMgPT09IHRoaXMuX3BpY3R1cmVSZWFsLmluZGV4T2YoIFBPSU5UX0RFQywgY3VyckluZHgpKVxyXG4gICAgICAgIC8vIGl0J3MgcmVhbCBkZWNpbWFsIHBvaW50IGFuZCBub3QgXFwuIGludG8gdGhlIHBpY3R1cmVcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgZmlyc3Q6IHN0cmluZztcclxuICAgICAgICAgIGxldCBzZWNvbmQ6IHN0cmluZztcclxuXHJcbiAgICAgICAgICBmaXJzdCA9IHNlY29uZCA9IFwiXCI7XHJcbiAgICAgICAgICBpZiAoaW5kZXhPZkRlYyA9PT0gMClcclxuICAgICAgICAgIC8vIHRoZSBwb2ludCBvbiB0aGUgZmlyc3QgcGxhY2UgLiMjI1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXhPZkRlYyArIDEgPCBtYXhMZW5ndGgpXHJcbiAgICAgICAgICAgIC8vIG9ubHkgMSAuXHJcbiAgICAgICAgICAgICAgc2Vjb25kID0gdGhpcy5fcGljdHVyZVJlYWwuc3Vic3RyKGluZGV4T2ZEZWMgKyAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGluZGV4T2ZEZWMgPT09IG1heExlbmd0aClcclxuICAgICAgICAgIC8vIHRoZSBwb2ludCBvbiB0aGUgbGFzdCBwbGFjZSAjIyMuXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpcnN0ID0gdGhpcy5fcGljdHVyZVJlYWwuc3Vic3RyKDAgLCBpbmRleE9mRGVjKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmlyc3QgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoMCAsIGluZGV4T2ZEZWMpO1xyXG4gICAgICAgICAgICBzZWNvbmQgPSB0aGlzLl9waWN0dXJlUmVhbC5zdWJzdHIoaW5kZXhPZkRlYyArIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fcGljdHVyZVJlYWwgPSBmaXJzdCArIHRoaXMuX2RlY2ltYWwgKyBzZWNvbmQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGN1cnJJbmR4ID0gKytpbmRleE9mRGVjO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDb21wYXJlIG5ld3ZhbHVlIHdpdGggdGhlIHJhbmdlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gbmV3dmFsdWUgaWYgaXQncyBpbiB0aGUgcmFuZ2UsIG9sZHZhbHVlIG90aGVyd2lzZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGZpbGxOdW1lcmljQnlSYW5nZSgpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNvbnRyb2xQaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0UElDKCk7XHJcbiAgICBsZXQgY29udGludW91c1JhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4gPSB0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCk7XHJcbiAgICBsZXQgZGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+ID0gdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKTtcclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gICAgbGV0IGNoZWNrZWRTdHI6IHN0cmluZyA9IHRoaXMuc2V0TnVtZXJpY1ZhbHVlV2l0aG91dFBpY3R1cmUodGhpcy5fbmV3dmFsdWUudG9TdHJpbmcoKSk7XHJcblxyXG5cclxuICAgIGlmIChjaGVja2VkU3RyLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnByaW50TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQsIHRydWUpO1xyXG4gICAgICByZXR1cm4gdGhpcy5fb2xkdmFsdWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgICAgbGV0IGNoZWNrZWROdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKHRoaXMuX25ld3ZhbHVlLnRvU3RyaW5nKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0UElDKCksIDApO1xyXG5cclxuICAgICAgaWYgKGRpc2NyZXRlUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGlzY3JldGVSYW5nZVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgbGV0IHJhbmdlSXRlbVZhbHVlMTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoZGlzY3JldGVSYW5nZVZhbHVlcy5nZXRfSXRlbShpKSwgY29udHJvbFBpYywgMCk7XHJcblxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKE5VTV9UWVBFLm51bV9jbXAoY2hlY2tlZE51bSwgcmFuZ2VJdGVtVmFsdWUxKSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZXd2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2ggKGV4X0NDKSB7XHJcbiAgICAgICAgICAgIC8vIHNraXAgbm9uLW51bWVyaWMgcmFuZ2UgdmFsdWVzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29udGludW91c1JhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGNvbnRpbnVvdXNSYW5nZVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG5cclxuICAgICAgICAgIGxldCByYW5nZUl0ZW1WYWx1ZTE6IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgICAgICBsZXQgcmFuZ2VJdGVtVmFsdWUyOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG5cclxuICAgICAgICAgIHJhbmdlSXRlbVZhbHVlMS5udW1fNF9hX3N0ZChjb250aW51b3VzUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSsrKSk7XHJcbiAgICAgICAgICByYW5nZUl0ZW1WYWx1ZTIubnVtXzRfYV9zdGQoY29udGludW91c1JhbmdlVmFsdWVzLmdldF9JdGVtKGkpKTtcclxuXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoTlVNX1RZUEUubnVtX2NtcChjaGVja2VkTnVtLCByYW5nZUl0ZW1WYWx1ZTEpICE9PSAtMSAmJiBOVU1fVFlQRS5udW1fY21wKHJhbmdlSXRlbVZhbHVlMiwgY2hlY2tlZE51bSkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25ld3ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXRjaCAoZXhfMTVCKSB7XHJcbiAgICAgICAgICAgIC8vIHNraXAgbm9uLW51bWVyaWMgcmFuZ2UgdmFsdWVzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm5zIGEgbnVtZXJpYyB2YWx1ZSBleHRyYWN0ZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGEgc3RyaW5nXHJcbiAgLy8vIG9uIGZhaWx1cmUgcmV0dXJucyBORUdBVElWRV9JTkZJTklUWVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+dGhlIHN0cmluZyB0byBwYXJzZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXREb3VibGVWYWwodmFsOiBzdHJpbmcpOiBudW1iZXIge1xyXG5cclxuICAgIGxldCBkb3RGb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG1pbnVzRm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBkaWdpdEZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZW5kT2ZOdW06IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIGZpbmQgdGhlIGRlbGVtZXRpbmcgbm9uIG51bWVyaWMgY2hhcmFjdGVyXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsLmxlbmd0aCAmJiAhZW5kT2ZOdW07IGkrKylcclxuICAgIHtcclxuICAgICAgbGV0IGM6IHN0cmluZyA9IHZhbFtpXTtcclxuICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKVxyXG4gICAgICAgIGRpZ2l0Rm91bmQgPSB0cnVlO1xyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBzd2l0Y2ggKGMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2FzZSAnLSc6XHJcbiAgICAgICAgICAgIGlmIChkaWdpdEZvdW5kIHx8IGRvdEZvdW5kIHx8IG1pbnVzRm91bmQpXHJcbiAgICAgICAgICAgICAgZW5kT2ZOdW0gPSB0cnVlO1xyXG4gICAgICAgICAgICBtaW51c0ZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAnLic6XHJcbiAgICAgICAgICAgIGlmIChkb3RGb3VuZCB8fCBtaW51c0ZvdW5kICYmICFkaWdpdEZvdW5kKVxyXG4gICAgICAgICAgICAgIGVuZE9mTnVtID0gdHJ1ZTtcclxuICAgICAgICAgICAgZG90Rm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlICcgJzpcclxuICAgICAgICAgICAgaWYgKGRpZ2l0Rm91bmQgfHwgZG90Rm91bmQgfHwgbWludXNGb3VuZClcclxuICAgICAgICAgICAgICBlbmRPZk51bSA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGVuZE9mTnVtID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGVuZE9mTnVtKSB7XHJcbiAgICAgIGkgPSBpIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaSA+IDApIHtcclxuICAgICAgcmV0dXJuIE5OdW1iZXIuUGFyc2UodmFsLnN1YnN0cigwLCBpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC1JbmZpbml0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5zZXQgTnVtZXJpYyB2YWx1ZSBXaXRob3V0IFBpY3R1cmUsIGZpbHRlciBpbnB1dCBmcm9tIHVzZXI8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcHVyZSBudW1iZXIsIHdpdGhvdXQgcGljdHVyZSBtYXNrPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc2V0TnVtZXJpY1ZhbHVlV2l0aG91dFBpY3R1cmUodmFsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNoZWNrZWRTdHI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih2YWwubGVuZ3RoKTtcclxuICAgIGxldCBpc0ZpcnN0RGVjaW1hbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGN1cnJDaGFyOiBzdHJpbmc7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3BpY3R1cmVSZWFsLmxlbmd0aCAmJiBpIDwgdmFsLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICBjdXJyQ2hhciA9IHZhbFtpXTtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KGN1cnJDaGFyKSlcclxuICAgICAgICBjaGVja2VkU3RyLkFwcGVuZChjdXJyQ2hhcik7XHJcbiAgICAgIGVsc2UgaWYgKGN1cnJDaGFyID09PSB0aGlzLl9lbnZpcm9ubWVudC5HZXREZWNpbWFsKCkgJiYgIWlzRmlyc3REZWNpbWFsKVxyXG4gICAgICB7XHJcbiAgICAgICAgY2hlY2tlZFN0ci5BcHBlbmQoTlN0cmluZy5Ub0NoYXJBcnJheShOdW1iZXJGb3JtYXRJbmZvLk51bWJlckRlY2ltYWxTZXBhcmF0b3IpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGlzRmlyc3REZWNpbWFsID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChjdXJyQ2hhciA9PT0gJy0nICYmIHRoaXMuX3ZhbERldC5nZXRJc05lZ2F0aXZlKCkpXHJcbiAgICAgICAgY2hlY2tlZFN0ci5BcHBlbmQoTlN0cmluZy5Ub0NoYXJBcnJheShOdW1iZXJGb3JtYXRJbmZvLk5lZ2F0aXZlU2lnbikudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hlY2tlZFN0ci5Ub1N0cmluZygpLmxlbmd0aCA9PT0gMClcclxuICAgIHtcclxuICAgICAgdGhpcy5wcmludE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfTlVNLCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGVja2VkU3RyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGNoZWNrIGlmIG5ld3ZhbHVlIGZvcm1hdCBtYXRjaGVzIHRoZSBudW1lcmljIHBpYyBmb3JtYXQuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja051bWVyaWNJbkRlY0Zvcm1hdCgpOiBib29sZWFuIHtcclxuXHJcblxyXG4gICAgbGV0IHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBEZWM6IG51bWJlcjtcclxuICAgIGxldCBXaG9sZTogbnVtYmVyO1xyXG4gICAgbGV0IERlY1BvczogbnVtYmVyO1xyXG4gICAgbGV0IGRlY2ltYWxDaGFyOiBzdHJpbmcgPSB0aGlzLl9lbnZpcm9ubWVudC5HZXREZWNpbWFsKCk7XHJcblxyXG4gICAgLy8gQ291bnQgbnVtYmVyIG9mIGRpZ2l0cyBhbmQgcG9zaXRpb24gb2YgZGVjaW1hbCBwb2ludFxyXG5cclxuICAgIERlYyA9IDA7XHJcbiAgICBXaG9sZSA9IDA7XHJcbiAgICBEZWNQb3MgPSAtMTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICAgIGlmIChwaWMuaXNOdW1lcmljKGkpKVxyXG4gICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZVtpXSkpXHJcbiAgICAgICAgLy8gd2hlbiBkZWMgcG9zIG5vdCBmb3VuZCwgY291bnQgd2hvbGVzLCBpZiBmb3VuZCwgY291bnQgZGVjLlxyXG4gICAgICAgICAgaWYgKERlY1BvcyA+PSAwKVxyXG4gICAgICAgICAgICBEZWMrKztcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgV2hvbGUrKztcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9uZXd2YWx1ZVtpXSA9PT0gZGVjaW1hbENoYXIpXHJcbiAgICAgICAgICBEZWNQb3MgPSBpO1xyXG5cclxuICAgIC8vIGRpZCB3ZSBleGNlZWQgdGhlIG1hc2sgP1xyXG4gICAgaWYgKHBpYy5nZXRXaG9sZXMoKSA8IFdob2xlIHx8IHBpYy5nZXREZWMoKSA8IERlYylcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayAmIHZhbGlkYXRlIERhdGUgZmllbGQgYnkgaGlzIG9sZC9uZXcgdmFsdWUgYW5kIDIgcGljdHVyZXM6XHJcbiAgLy8vIFJlYWwgYW5kIEVuYWJsZVxyXG4gIC8vLyAxLmNoZWNrIGlmIG5ld3ZhbHVlIGNvbXBsZXRlIHdpdGggcGljdHVyZXMsIG90aGVyd2lzZSByZXR1cm4gb2xkdmFsdWVcclxuICAvLy8gMi5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHJhbmdlXHJcbiAgLy8vIDIuMSBjb21wbGV0ZSB2YWx1ZSwgaWYgcG9zc2libGUsIG90aGVyd2lzZSAgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IG5ldyB2YWx1ZSBvZiB2YWxpZGF0ZWQgZmllbGQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0RhdGVGaWVsZCgpOiBEYXRlIHtcclxuXHJcbiAgICBsZXQgbmV3RGF0ZTogRGF0ZSA9ICh0aGlzLl9uZXd2YWx1ZSA9PSBudWxsID8gbnVsbCA6IG5ldyBEYXRlKHRoaXMuX25ld3ZhbHVlKSk7XHJcbiAgICAgdGhpcy5zZXRWYWxpZGF0aW9uRmFpbGVkKGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5pc0RhdGVaZXJvKHRoaXMuX25ld3ZhbHVlKSkge1xyXG4gICAgICAvLyBnZXQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZmllbGRcclxuICAgICAgbGV0IGRlZmF1bHRNZ1ZhbHVlOiBzdHJpbmcgPSB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZpZWxkKCkuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcblxyXG4gICAgICBuZXdEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZmF1bHRNZ1ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRydWUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgLy8gcmFuZ2UgZGF0ZVxyXG4gICAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpICE9IG51bGwgfHwgdGhpcy5fdmFsRGV0LmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKSAhPSBudWxsKVxyXG4gICAgICAgIG5ld0RhdGUgPSB0aGlzLmZpbGxEYXRlQnlSYW5nZSh0aGlzLl92YWxEZXQuZ2V0Q29udGludW91c1JhbmdlVmFsdWVzKCksIHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCksIHRoaXMuX25ld3ZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdEYXRlO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BZGQgZm91bmQgaW4gbmV3dmFsdWUgbnVtYmVycygyIG9yIDMgbGV0dGVycykgdG8gYnVmZmVyIGFuZCByZXR1cm5cclxuICAvLy8gbGFzdCBmb3VuZCBudW1iZXIgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJWYWx1ZVwiPmluIG5ld3ZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJidWZmZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj4tIHdoaWNoIHR5cGUgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmUsIGZvciBjaGVja2luZyB2YWxpZGl0eTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBjdXJyVmFsdWUgaW4gbmV3dmFsdWU8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhZGQyRGF0ZShjdXJyVmFsdWU6IG51bWJlciwgYnVmZmVyOiBTdHJpbmdCdWlsZGVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHN0YXJ0OiBudW1iZXIgPSBjdXJyVmFsdWU7XHJcbiAgICBsZXQgY3VyckFkZDogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaXMuX25ld3ZhbHVlLmxlbmd0aCk7XHJcbiAgICBsZXQgbGV0dGVyczogbnVtYmVyID0gMDtcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpXHJcbiAgICB7XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ERDpcclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REREQ6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19NTUQ6XHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWTpcclxuICAgICAgICBsZXR0ZXJzID0gMjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19EREQ6XHJcbiAgICAgICAgbGV0dGVycyA9IDM7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVlZWTpcclxuICAgICAgICBsZXR0ZXJzID0gNDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19XOlxyXG4gICAgICAgIGxldHRlcnMgPSAxO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lKOiAgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgIGxldHRlcnMgPSAyO1xyXG4gICAgICAgIHR5cGUgPSBQSUNJbnRlcmZhY2UuUElDX1lZOyAvLyBQSUNfWUogd2lsbCBiZSBoYW5kbGVkIGFzIFBJQ19ZWSBpbiB0aGlzIG1ldGhvZC5cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAoc3RhcnQgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlLmNoYXJBdChzdGFydCkpKVxyXG4gICAgICBzdGFydCsrOyAvLyBmaW5kIGZpcnN0IGRpZ2l0XHJcblxyXG5cclxuICAgIGlmIChzdGFydCA9PT0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoICYmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPT09IDAgfHwgdGhpcy5fbmV3dmFsdWUgPT09IFwiMFwiKSkge1xyXG4gICAgICBmb3IgKGxldCBudWw6IG51bWJlciA9IDA7IG51bCA8IGxldHRlcnM7IG51bCA9IG51bCArIDEpIHtcclxuICAgICAgICBidWZmZXIuQXBwZW5kKCcwJykvKicwJyovO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjdXJyVmFsdWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzdGFydCA9PT0gdGhpcy5fbmV3dmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5fbmV3dmFsdWUgKyBcIjBcIjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGxldHRlcnMgJiYgaSA8IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZS5jaGFyQXQoaSkpKVxyXG4gICAgICAgIGN1cnJBZGQuQXBwZW5kKHRoaXMuX25ld3ZhbHVlLmNoYXJBdChpKSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY3VyckFkZC5MZW5ndGggPT09IDApIHtcclxuICAgICAgY3VyckFkZC5BcHBlbmQoJzAnKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYWRkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgLy8gYm91bmRhcnkgY29uZGl0aW9ucyBjYXNlczpcclxuICAgIGlmICgoYWRkIDwgMSAmJiB0eXBlICE9PSBQSUNJbnRlcmZhY2UuUElDX1lZWVkgJiYgdHlwZSAhPT0gUElDSW50ZXJmYWNlLlBJQ19ZWSkgfHxcclxuICAgICAgIChhZGQgPiAzMSAmJiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ERCB8fCB0eXBlID09PSAgUElDSW50ZXJmYWNlLlBJQ19EREREKSkgfHxcclxuICAgICAgKGFkZCA+IDEyICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKSB8fCAoYWRkID4gNyAmJiB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX1cpKSB7XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9EQVRFKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGFuIHBpY3R1cmUgaXMgWVlZWSBhbmQgaW5zZXJ0ZWQgMC0yIG51bWJlcnMsIHVzZSBDRU5UVVJFIHZhbHVlLCBvdGhlcndpc2UgYWRkIHplcm9zIGJlZm9yZSB0aGUgeWVhclxyXG4gICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfWVlZWSAmJiB0aGlzLl9lbnZpcm9ubWVudC5HZXRDZW50dXJ5KHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpID4gOTk5ICYmIGN1cnJBZGQuTGVuZ3RoIDwgMylcclxuICAgICAgY3VyckFkZCA9IHRoaXMuY2hlY2tDZW50dXJ5KGFkZCk7XHJcblxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGxldHRlcnMgLSBjdXJyQWRkLkxlbmd0aDsgaiA9IGogKyAxKSB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoJzAnKS8qJzAnKi87XHJcbiAgICB9XHJcbiAgICBidWZmZXIuQXBwZW5kKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcbiAgICByZXR1cm4gIGk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+QWRkIGZvdW5kIGluIG5ld3ZhbHVlIGxldHRlcnMgdG8gYnVmZmVyIGFuZCByZXR1cm5cclxuICAvLy8gbGFzdCBmb3VuZCBudW1iZXIgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJWYWx1ZVwiPmluIG5ld3ZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZXR0ZXJzXCI+YW1vdW50IG9mIGxldHRlcnMgdG8gaW5zZXJ0IHRvIGJ1ZmZlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYnVmZmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGN1cnJWYWx1ZSBpbiBuZXd2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGFkZE0yRGF0ZShjdXJyVmFsdWU6IG51bWJlciwgbGV0dGVyczogbnVtYmVyLCBidWZmZXI6IFN0cmluZ0J1aWxkZXIsIHR5cGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgYXJyYXk6IHN0cmluZ1tdO1xyXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NTSB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NRCkge1xyXG4gICAgICBpZiAodGhpcy5oZWJyZXcpIHtcclxuICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxNb250aHMoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgbWVzc2FnZVN0cmluZzogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLk1PTlRIU19QVFIpO1xyXG4gICAgICAgIGFycmF5ID0gRGF0ZVV0aWwuZ2V0TG9jYWxNb250aHMobWVzc2FnZVN0cmluZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XV1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVicmV3KSB7XHJcbiAgICAgICAgICBhcnJheSA9IEhlYnJld0RhdGUuR2V0TG9jYWxEb3dzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGRheVN0cjogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLkRBWVNfUFRSKTtcclxuICAgICAgICAgIGFycmF5ID0gRGF0ZVV0aWwuZ2V0TG9jYWxEYXlzKGRheVN0cik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0JCKSB7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGFycmF5ID0gVXRpbERhdGVKcG4uZ2V0QXJyYXlEb3coKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTEgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTIgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTQpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9uZXd2YWx1ZS5sZW5ndGggPCBjdXJyVmFsdWUgKyBsZXR0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSB0aGlzLl9uZXd2YWx1ZS5zdWJzdHIoY3VyclZhbHVlLCBsZXR0ZXJzKTtcclxuICAgICAgICAgICAgYnVmZmVyLkFwcGVuZCh0ZXh0KTtcclxuICAgICAgICAgICAgcmV0dXJuIGN1cnJWYWx1ZSArIHRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gY3VyclZhbHVlICsgbGV0dGVycztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fbmV3dmFsdWUubGVuZ3RoIDwgY3VyclZhbHVlKSB7XHJcbiAgICAgIGN1cnJWYWx1ZSA9IHRoaXMuX25ld3ZhbHVlLmxlbmd0aDtcclxuICAgIH1cclxuICAgIGxldCBtYXg6IG51bWJlciA9IHRoaXMuZ2V0TW9udGhPcldlZWsodGhpcy5fbmV3dmFsdWUuc3Vic3RyKGN1cnJWYWx1ZSksIGxldHRlcnMsIHR5cGUpO1xyXG5cclxuICAgIGlmIChhcnJheVttYXhdLnRyaW0oKS5sZW5ndGggPj0gbGV0dGVycykge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKGFycmF5W21heF0udHJpbSgpLnN1YnN0cigwLCBsZXR0ZXJzKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgYnVmZmVyLkFwcGVuZChhcnJheVttYXhdLnRyaW0oKSk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGxldHRlcnMgLSBhcnJheVttYXhdLnRyaW0oKS5sZW5ndGg7IGkgPiAwOyBpID0gaSAtIDEpIHtcclxuICAgICAgICBidWZmZXIuQXBwZW5kKCcgJykvKicgJyovO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyclZhbHVlICsgbGV0dGVycztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgZW5kIGluZGV4IG9mIGV2ZXJ5IG51bWVyaWMgYmxvY2sgaW4gdGhlIG1hc2sgZnJvbSBtYXNrW2N1cnJWYWx1ZV08L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBlbmQgb2YgbnVtZXJpYyBibG9jayBpbiBuZXdWYWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEVuZE9mTnVtZXJpY0Jsb2NrKGN1cnJWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHdoaWxlIChjdXJyVmFsdWUgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlLmNoYXJBdChjdXJyVmFsdWUpKSkge1xyXG4gICAgICBjdXJyVmFsdWUgPSBjdXJyVmFsdWUgKyAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnJWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5hZGRlZCBzdWZmaXggdG8gcmVsZXZhbnQgbnVtYmVyIG9mIHRoZSBkYXk8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhZGREYXRlU3VmZml4KGxhc3Q6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgdGhlbnVtYmVyOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGxhc3QpO1xyXG4gICAgaWYgKHRoZW51bWJlciA9PT0gMSB8fCB0aGVudW1iZXIgPT09IDIxIHx8IHRoZW51bWJlciA9PT0gMzEpXHJcbiAgICAgIHJldHVybiBcInN0XCI7XHJcbiAgICBlbHNlIGlmICh0aGVudW1iZXIgPT09IDIgfHwgdGhlbnVtYmVyID09PSAyMilcclxuICAgICAgcmV0dXJuIFwibmRcIjtcclxuICAgIGVsc2UgaWYgKHRoZW51bWJlciA9PT0gMyB8fCB0aGVudW1iZXIgPT09IDIzKVxyXG4gICAgICByZXR1cm4gXCJyZFwiO1xyXG4gICAgcmV0dXJuIFwidGhcIjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgc2l6ZSBvZiBibG9jayBsZXR0ZXJzIG9mIHR5cGUgJ3R5cGUnLCB3aGljaCBzdGFydCBhdCAnc3RhcnQnPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZ2V0U2l6ZU9mQmxvY2soc3RhcnQ6IG51bWJlciwgdHlwZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXIgPSBzdGFydCArIDE7XHJcbiAgICB3aGlsZSAobGV0dGVycyA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoICYmIHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChsZXR0ZXJzKSA9PT0gdHlwZSlcclxuICAgIGxldHRlcnMrKztcclxuICAgIHJldHVybiBsZXR0ZXJzIC0gc3RhcnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Z2V0IFN0cmluZyBwYXJ0L2Z1bGwgbmFtZSBvZiBtb250aC9kYXkgb2Ygd2Vlazwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb250aFwiPnBhcnQvZnVsbCBuYW1lIG9mIG1vbnRoL2RheSBvZiB3ZWVrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtYXhcIj5vZiBwb3NzaWJsZSBsZXR0ZXJzIGluIG1vbnRoL2RheSBvZiB3ZWVrLCBzaXplIG9mIGJsb2NrIGluIHBpY3R1cmUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGU6XCI+UElDXyAgd2Vla3xtb250aDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBudW1iZXIgb2YgbW9udGggMS0xMiwgb3IgZGF5IG9mIHdlZWsgMS03PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TW9udGhPcldlZWsobW9udGhfc3RyOiBzdHJpbmcsIGxldHRlcnM6IG51bWJlciwgdHlwZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBhcnJheTogc3RyaW5nW107XHJcblxyXG4gICAgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1NIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EKSB7XHJcbiAgICAgIC8vIE1vbnRoXHJcbiAgICAgICAgaWYgKHRoaXMuaGVicmV3KVxyXG4gICAgICAgICAgYXJyYXkgPSBIZWJyZXdEYXRlLkdldExvY2FsTW9udGhzKCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBtb250aFN0cjogU3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLk1PTlRIU19QVFIpO1xyXG4gICAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbE1vbnRocyhtb250aFN0ci50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfV1dXIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfVylcclxuICAgICAgLy8gV2Vla1xyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVicmV3KVxyXG4gICAgICAgICAgYXJyYXkgPSBIZWJyZXdEYXRlLkdldExvY2FsRG93cygpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgZGF5U3RyOiBTdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgYXJyYXkgPSBEYXRlVXRpbC5nZXRMb2NhbERheXMoZGF5U3RyLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0JCKVxyXG4gICAgICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgIHtcclxuICAgICAgICBhcnJheSA9IFV0aWxEYXRlSnBuLmdldEFycmF5RG93KCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgcmV0dXJuIDE7IC8vIG9ubHkgd2VlayBvciBtb250aCBwb3NzaWJsZSAtPiBkaWZmYXVsdCAxLlxyXG4gICAgICB9XHJcblxyXG4gICAgaWYgKGxldHRlcnMgPiBtb250aF9zdHIubGVuZ3RoKVxyXG4gICAgLy8gY3V0IGxldHRlciBpZiBpdCdzICBlbmQgb2Ygc3RyaW5nXHJcbiAgICAgIGxldHRlcnMgPSBtb250aF9zdHIubGVuZ3RoO1xyXG5cclxuICAgIGlmICh0aGlzLmhlYnJldylcclxuICAgIHtcclxuICAgICAgbGV0IGhzdHI6IHN0cmluZyA9IE5TdHJpbmcuVHJpbVN0YXJ0KG1vbnRoX3N0cikuc3Vic3RyKDAsIGxldHRlcnMpLnRyaW0oKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcclxuICAgICAgLy8gc3RhcnQgY2hlY2tpbmcgZnJvbSAxc3QgbWVtYmVyLCBiZWNhdXNlIDAgPSBcIlwiXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoYXJyYXlbaV0udHJpbSgpID09PSBoc3RyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChpID09PSAxNClcclxuICAgICAgICAgICAgaSA9IDY7XHJcbiAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyB0aGUgbnVtYmVyIGluc2VydGVkIGFuZCBub3Qgc3RyaW5nIC0+IGZpbmQgbW91bnRoL2RheSBvZiB3ZWVrIGJ5IG51bWJlciAxLTEyfDEtN1xyXG5cclxuICAgICAgICBsZXQgc3RyOiBzdHJpbmcgPSBtb250aF9zdHIuc3Vic3RyKDAsIGxldHRlcnMpLnRyaW0oKTtcclxuICAgICAgICBsZXQgbnVtQnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltpXSkpXHJcbiAgICAgICAgICAgIG51bUJ1ZmZlci5BcHBlbmQoc3RyW2ldKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGhlTnVtYmVyOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKG51bUJ1ZmZlci5Ub1N0cmluZygpKTtcclxuICAgICAgICBpZiAodGhlTnVtYmVyIDwgMSlcclxuICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NTSB8fCB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NRClcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZiAodGhlTnVtYmVyID4gMTIpXHJcbiAgICAgICAgICAgIHJldHVybiAxMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XV1cgfHwgdHlwZSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XIHx8IHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfQkIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgaWYgKHRoZU51bWJlciA+IDcpXHJcbiAgICAgICAgICAgIHJldHVybiA3O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhlTnVtYmVyO1xyXG4gICAgICAgIH1cclxuICAgIGNhdGNoIChleF8yMUEpIHtcclxuICAgICAgICAgIC8vIGRvTm90aGluZ19TdHJpbmdJbnNlcnRlZFxyXG4gICAgICB9XHJcblxyXG4gICAgLy8gaW5zZXJ0ZWQgc3RyaW5nIC0gbmFtZSBvZiBtb250aHxkYXkgb2Ygd2VlayAtPnRyeSBpZGVudHlmeSBpdFxyXG4gICAgbGV0IGZvdW5kOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KGFycmF5Lmxlbmd0aCk7XHJcbiAgICBsZXQgZnJvbTogbnVtYmVyO1xyXG4gICAgbGV0IG1heDogbnVtYmVyID0gLTE7IC8vIG51bWJlciBvZiBmb3VuZCBtb250aC9kYXkgb2Ygd2Vla1xyXG5cclxuXHJcbiAgICBmb3IgKGxldCB0bXA6IG51bWJlciA9IDE7IHRtcCA8IGFycmF5Lmxlbmd0aDsgdG1wKyspXHJcbiAgICAvLyBzdGFydCBjaGVja2luZyBmcm9tIDFzdCBtZW1iZXIsIGJlY2F1c2UgMCA9IFwiXCJcclxuICAgIHtcclxuICAgICAgZm91bmRbdG1wXSA9IDA7XHJcbiAgICAgIGZyb20gPSAwO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXlbdG1wXS5sZW5ndGggJiYgZnJvbSA8IG1vbnRoX3N0ci5sZW5ndGggJiYgaSA8IGxldHRlcnM7IGkrKywgZnJvbSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGFycmF5W3RtcF0udG9Mb3dlckNhc2UoKVtpXSA9PT0gbW9udGhfc3RyLnRvTG93ZXJDYXNlKClbZnJvbV0pXHJcbiAgICAgICAgICBmb3VuZFt0bXBdKys7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmcm9tID09PSBsZXR0ZXJzIHx8IGZyb20gPT09IGFycmF5W3RtcF0ubGVuZ3RoKVxyXG4gICAgICAvLyBhbGwgbGV0dGVycyBmb3VuZFxyXG4gICAgICB7XHJcbiAgICAgICAgbWF4ID0gdG1wO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1heCA9PT0gLTEpXHJcbiAgICAgIG1heCA9IHRoaXMuZmluZE1heChmb3VuZCk7XHJcbiAgICByZXR1cm4gbWF4O1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pcyBudW1lcmljIGRhdGEgYWxsb3dlZCBpbiBkYXRlXHJcbiAgLy8vIHJldHVybiB0cnVlIGlmIGl0IGlzIGFsbG93ZWQsIG90aGVyd2lzZSBmYWxzZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGlzTnVtYmVyQWxsb3dlZEluRGF0ZSgpOiBib29sZWFuIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICBpZiAodGhpcy5pc0RhdGVQb3NpdGlvbmFsTnVtZXJpY0RpcmVjdGl2ZSh0aGlzLl9waWN0dXJlW2ldKSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5maW5kIGlmIGFsbCBudW1iZXJzIG9mIHRoZSBuZXcgdXNlciBpbnNlcnRlZCB2YWx1ZSBhcmUgMFxyXG4gIC8vLyByZXR1cm4gdHJ1ZSBpZiBhbGwgbnVtYmVycyBpbiB0aGUgaW5wdXQgYXJlIDAsIG90aGVyd2lzZSB0cnVlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNBbGxOdW1iZXJzMCgpOiBib29sZWFuIHtcclxuICAgIGxldCBjdXJyQ2hyOiBzdHJpbmc7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGN1cnJDaHIgPSB0aGlzLl9uZXd2YWx1ZVtpXTtcclxuXHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChjdXJyQ2hyKSAmJiBjdXJyQ2hyICE9PSAnMCcpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIHZhbGlkaXR5IG9mIFllYXIgZm9yIFlZWVkgcGFydCBvZiB0aGUgbWFzazwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5ZWFySW5cIj5pbnNlcnRlZCBieSB1c2VyPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGNhbGN1bGF0ZWQgYnkgZW52aXJvbm1lbnQuY2VudHVyeSByaWdodCB2YWx1ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGNoZWNrQ2VudHVyeSh5ZWFySW46IG51bWJlcik6IFN0cmluZ0J1aWxkZXIge1xyXG4gICAgbGV0IG91dFZhbDogbnVtYmVyO1xyXG4gICAgbGV0IHN0YXJ0X2NlbnR1cnk6IG51bWJlciA9IHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICBsZXQgY2VudHVyeTogbnVtYmVyID0gTWF0aC5mbG9vcihzdGFydF9jZW50dXJ5IC8gMTAwKTtcclxuICAgIGxldCB5ZWFyczogbnVtYmVyID0gc3RhcnRfY2VudHVyeSAlIDEwMDtcclxuICAgIGlmICh5ZWFySW4gPj0geWVhcnMgJiYgeWVhckluICE9PSAwKVxyXG4gICAgICBvdXRWYWwgPSAoY2VudHVyeSAqIDEwMCArIHllYXJJbik7XHJcbiAgICBlbHNlXHJcbiAgICAgIG91dFZhbCA9ICgoKytjZW50dXJ5KSAqIDEwMCArIHllYXJJbik7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKG91dFZhbC50b1N0cmluZygpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayBpZiB0aGUgZGF0ZSBsZWdhbCBmb3IgcGljdHVyZSByYW5nZSwgdXNlZCBmb3IgdmFsaWRhdGlvbiBkYXRlIDA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiQ29udGludW91c1JhbmdlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJEaXNjcmV0ZVJhbmdlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+aW50ZWdlciAtIG1hZ2ljIGRhdGUgbnVtYmVyIG9mIGRheXMgZnJvbSAwMS4wMS4wMDAwPC9wYXJhbT5cclxuICBwcml2YXRlIGlzRGF0ZUxlZ2FsNFJhbmdlKENvbnRpbnVvdXNSYW5nZTogTGlzdDxzdHJpbmc+LCBEaXNjcmV0ZVJhbmdlOiBMaXN0PHN0cmluZz4sIGN1cnJEYXRlOiBudW1iZXIpOiBib29sZWFuIHtcclxuXHJcbiAgICBsZXQgcGljOiBQSUMgPSB0aGlzLl92YWxEZXQuZ2V0UElDKCk7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IGRvd25EYXRlOiBudW1iZXI7XHJcbiAgICBsZXQgdG9wRGF0ZTogbnVtYmVyO1xyXG5cclxuICAgIGlmIChDb250aW51b3VzUmFuZ2UgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IENvbnRpbnVvdXNSYW5nZS5sZW5ndGggLSAxOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBkb3duRGF0ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbShpKSwgcGljLCBwaWMuZ2V0TWFzaygpLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgICB0b3BEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZV9waWMoQ29udGludW91c1JhbmdlLmdldF9JdGVtKCsraSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID49IGRvd25EYXRlICYmIGN1cnJEYXRlIDw9IHRvcERhdGUpXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEaXNjcmV0ZVJhbmdlICE9IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBEaXNjcmV0ZVJhbmdlLmxlbmd0aDsgaSsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID09PSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhEaXNjcmV0ZVJhbmdlLmdldF9JdGVtKGkpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpKVxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoZSBkYXRlIGlzIG5vdCBpbiB0aGUgcmFuZ2VcclxuICAgIC8vIHJldHVybiBmYWxzZTtcclxuICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGFuZCBmaWxsIERBVEUgdHlwZSBieSByYW5nZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbGxEYXRlQnlSYW5nZShDb250aW51b3VzUmFuZ2U6IExpc3Q8c3RyaW5nPiwgRGlzY3JldGVSYW5nZTogTGlzdDxzdHJpbmc+LCBidWZmZXI6IERhdGUpOiBEYXRlIHtcclxuICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBsZXQgZG93bkRhdGU6IG51bWJlcjtcclxuICAgIGxldCB0b3BEYXRlOiBudW1iZXI7XHJcblxyXG4gICAgbGV0IGN1cnJEYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5mcm9tTmF0aXZlRGF0ZVRvTWdEYXRlTnVtYmVyKGJ1ZmZlciwgcGljKTtcclxuXHJcbiAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQoZmFsc2UpO1xyXG4gICAgaWYgKENvbnRpbnVvdXNSYW5nZSAhPSBudWxsKSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBDb250aW51b3VzUmFuZ2UubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgZG93bkRhdGUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhDb250aW51b3VzUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgcGljLmdldE1hc2soKSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcbiAgICAgICAgdG9wRGF0ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGVfcGljKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbSgrK2kpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgIGlmIChjdXJyRGF0ZSA+PSBkb3duRGF0ZSAmJiBjdXJyRGF0ZSA8PSB0b3BEYXRlKVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGJ1ZmZlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoRGlzY3JldGVSYW5nZSAhPSBudWxsKSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBEaXNjcmV0ZVJhbmdlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGN1cnJEYXRlID09PSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl9kYXRlX3BpYyhEaXNjcmV0ZVJhbmdlLmdldF9JdGVtKGkpLCBwaWMsIHBpYy5nZXRNYXNrKCksIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYnVmZmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoZSBkYXRlIGlzIG5vdCBpbiB0aGUgcmFuZ2VcclxuICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbigpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGVjayBpZiBkYXkgc3VpdGFibGUgKG5vdCBiaWdnZXIgdGhhbiBtYXgpIGZvciBZZWFyIGFuZCBNb250aDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+dXNlciBpbnNlcnRlZCBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzRG95XCI+aXMgcGljdHVyZSBvZiBuZWVkZWQgZGF5IGlzIERERCAtIGRheSBvZiB5ZWFyPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrRGF5KGRhdGU6IHN0cmluZywgaXNEb3k6IGJvb2xlYW4pOiBTdHJpbmdCdWlsZGVyIHtcclxuXHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSB0aGlzLmdldERhdGVFbGVtZW50KGRhdGUsIERhdGVFbGVtZW50LkRBWSk7XHJcbiAgICBpZiAoZGF5IDwgMjkgJiYgIWlzRG95KVxyXG4gICAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoZGF0ZSk7XHJcblxyXG4gICAgbGV0IHllYXI6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuWUVBUik7XHJcblxyXG4gICAgaWYgKCFpc0RveSlcclxuICAgIHtcclxuICAgICAgaWYgKHllYXIudG9TdHJpbmcoKS5sZW5ndGggPCAzKVxyXG4gICAgICAgIHllYXIgPSBOTnVtYmVyLlBhcnNlKHRoaXMuY2hlY2tDZW50dXJ5KHllYXIpLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2Vudmlyb25tZW50LkdldERhdGVNb2RlKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpID09PSAnQicpXHJcbiAgICAgICAgeWVhciAtPSBQSUNJbnRlcmZhY2UuREFURV9CVURESElTVF9HQVA7XHJcblxyXG4gICAgICBsZXQgbW9udGg6IG51bWJlciA9IHRoaXMuZ2V0RGF0ZUVsZW1lbnQoZGF0ZSwgRGF0ZUVsZW1lbnQuTU9OVEgpO1xyXG5cclxuICAgICAgLy8gaWYgZGF5IG5vdCBjb25zaXN0YWluZWQgdG8geWVhciAmIG1vbnRoIC0gY2hhbmdlIGRheVxyXG4gICAgICBsZXQgZGF5TWF4OiBudW1iZXIgPSB0aGlzLmdldE1heERheUluTW9udGgoeWVhciwgbW9udGgpO1xyXG4gICAgICBpZiAoZGF5ID4gZGF5TWF4KVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKE1zZ0ludGVyZmFjZS5TVFJfRVJSX0RBVEUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIC8vIGlmIG1vbnRoIG5vdCBjb25zaXN0YWluZWQgdG8gZGF5KERERCkgLSBjaGFuZ2UgbW9udGhcclxuICAgICAgbGV0IG1vbnRoUmVhbDogbnVtYmVyID0gdGhpcy5nZXRNb250aEJ5RGF5KHllYXIsIGRheSk7XHJcblxyXG4gICAgICBpZiAobW9udGhSZWFsIDwgMSB8fCBtb250aFJlYWwgPiAxMilcclxuICAgICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfREFURSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIGRheSBvZiB3ZWVrIHN1aXRhYmxlIChyaWdodCkgZm9yIFllYXIsIE1vbnRoIGFuZCBEYXk8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGF0ZVwiPnVzZXIgaW5zZXJ0ZWQgc3RyaW5nPC9wYXJhbT5cclxuICBwcml2YXRlIGNoZWNrV2VlayhkYXRlOiBzdHJpbmcpOiBTdHJpbmdCdWlsZGVyIHtcclxuXHJcbiAgICBsZXQgZG93OiBudW1iZXIgPSB0aGlzLmdldERhdGVFbGVtZW50KGRhdGUsIERhdGVFbGVtZW50LkRPVyk7XHJcblxyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXMgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmdldE5ld0RhdGVCcmVha1BhcmFtcygpO1xyXG5cclxuICAgIGxldCBkYXRlTWFnaWM6IG51bWJlciA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX2RhdGUoZGF0ZSwgdGhpcy5fcGljdHVyZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcblxyXG4gICAgRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kYXRlX2JyZWFrX2RhdGVtb2RlKGJyZWFrUGFyYW1zLCBkYXRlTWFnaWMsIHRydWUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG5cclxuICAgIGxldCBkb3dSZWFsOiBudW1iZXIgPSBicmVha1BhcmFtcy5kb3c7XHJcbiAgICBpZiAoZG93UmVhbCAhPT0gZG93UmVhbClcclxuICAgICAgZGF0ZSA9IHRoaXMuY2hhbmdlRG93KGRhdGUsIGRvd1JlYWwpO1xyXG5cclxuICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihkYXRlKTtcclxuICB9XHJcblxyXG5cclxuICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgLy8vIDxzdW1tYXJ5PmNoZWNrIGlmIHRoZSBjb21iaW5hdGlvbiBvZiBKYXBhbmVzZSBlcmEgYW5kIHllYXIgaXMgdmFsaWQuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0ckRhdGVcIj51c2VyIGluc2VydGVkIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBkYXRlIHN0cmluZyBvZiBwcm9wZXJseSBKYXBhbmVzZSBlcmE8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBjaGVja0pwbkVyYVllYXIoc3RyRGF0ZTogc3RyaW5nKTogU3RyaW5nQnVpbGRlciB7XHJcblxyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXMgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmdldE5ld0RhdGVCcmVha1BhcmFtcygpO1xyXG4gICAgbGV0IGRhdGVNYWdpYzogbnVtYmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfZGF0ZShzdHJEYXRlLCB0aGlzLl9waWN0dXJlLCB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGVNYWdpYywgdHJ1ZSwgdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSk7XHJcblxyXG4gICAgbGV0IGludFllYXJBRDogbnVtYmVyID0gYnJlYWtQYXJhbXMueWVhcjtcclxuICAgIGxldCBpbnREb3k6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRveTtcclxuXHJcbiAgICAvLyBnZXQgdGhlIG5hbWUgYW5kIGEgeWVhciBvZiB0aGUgZXJhXHJcbiAgICBsZXQgc3RyRXJhQWxwaGE6IHN0cmluZztcclxuICAgIGxldCBzdHJFcmFLYW5qaTogc3RyaW5nO1xyXG5cclxuICAgIHN0ckVyYUFscGhhID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95cl8yX2EoaW50WWVhckFELCBpbnREb3ksIGZhbHNlKTtcclxuICAgIHN0ckVyYUthbmppID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95cl8yX2EoaW50WWVhckFELCBpbnREb3ksIHRydWUpO1xyXG5cclxuICAgIGxldCBzdHJZZWFySnBuRXJhOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBudW06IG51bWJlciA9IFV0aWxEYXRlSnBuLmdldEluc3RhbmNlKCkuZGF0ZV9qcG5feWVhcl9vZnMoaW50WWVhckFELCBpbnREb3kpO1xyXG4gICAgaWYgKG51bSA8PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBXcm9uZ0Zvcm1hdEV4Y2VwdGlvbihNc2dJbnRlcmZhY2UuU1RSX0VSUl9EQVRFKTtcclxuICAgIH1cclxuICAgIGlmIChudW0gPD0gOSkge1xyXG4gICAgICBzdHJZZWFySnBuRXJhLkFwcGVuZChcIjBcIik7XHJcbiAgICB9XHJcbiAgICBzdHJZZWFySnBuRXJhLkFwcGVuZChudW0udG9TdHJpbmcoKSk7XHJcblxyXG4gICAgLy8gYnVpbGQgYSBwcm9wZXJseSB5ZWFyIG9mIHRoZSBlcmFcclxuXHJcbiAgICAvLyBBIERCQ1MgY2hhcmFjdGVyIGluIFwic3RyXCIgY29uc3VtZXMgdHdvIGNoYXJhY3RlcnMgaW4gXCJtYXNrXCIuXHJcbiAgICAvLyBJZiBcInN0clwiIGNvbnRhaW5zIERCQ1MsIHRoZSBwb3NpdGlvbiBvZiBcIm1hc2tcIiBoYXMgdG8gc2tpcCBuZXh0IGluZGV4LlxyXG4gICAgLy8gVGhpcyB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBza2lwcGVkIGluZGV4ZXMuXHJcbiAgICBsZXQgaW50UGljSWR4T2ZzOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgaW50Q250OiBudW1iZXIgPSAwOyBpbnRDbnQgKyBpbnRQaWNJZHhPZnMgPCB0aGlzLl9waWN0dXJlLmxlbmd0aDsgaW50Q250KyspXHJcbiAgICB7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGludENudCArIGludFBpY0lkeE9mcykpXHJcbiAgICAgIHtcclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX0pZMSk6XHJcbiAgICAgICAgICBzdHJEYXRlID0gVXRpbFN0ckJ5dGVNb2RlLnJlcEMoc3RyRGF0ZSwgc3RyRXJhQWxwaGEsIGludENudCArIDEsIDEpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSlkyKTpcclxuICAgICAgICAgIHN0ckRhdGUgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQyhzdHJEYXRlLCBzdHJFcmFLYW5qaSwgaW50Q250ICsgMSwgMSk7XHJcbiAgICAgICAgICBpbnRQaWNJZHhPZnMrKzsgLy8gUElDX0pZMiBjb25zdW1lcyAyIGNoYXJhY3RlcnMgb2YgcGljdHVyZSAoMSBtb3JlIHRoYW4gc3RyRGF0ZSlcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX0pZNCk6XHJcbiAgICAgICAgICBzdHJEYXRlID0gVXRpbFN0ckJ5dGVNb2RlLnJlcEMoc3RyRGF0ZSwgc3RyRXJhS2FuamksIGludENudCArIDEsIDIpO1xyXG4gICAgICAgICAgaW50Q250Kys7IC8vIFBJQ19KWTQgY29uc3VtZXMgMiBjaGFyYWN0ZXJzIG9mIHN0ckRhdGVcclxuICAgICAgICAgIGludFBpY0lkeE9mcyArPSAyOyAvLyBQSUNfSlk0IGNvbnN1bWVzIDQgY2hhcmFjdGVycyBvZiBwaWN0dXJlICgyIG1vcmUgdGhhbiBzdHJEYXRlKVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfWUopOlxyXG4gICAgICAgICAgc3RyRGF0ZSA9IFV0aWxTdHJCeXRlTW9kZS5yZXBDKHN0ckRhdGUsIHN0clllYXJKcG5FcmEudG9TdHJpbmcoKSwgaW50Q250ICsgMSwgMik7XHJcbiAgICAgICAgICBpbnRDbnQrKzsgLy8gUElDX1lKIGNvbnN1bWVzIDIgY2hhcmFjdGVycyBvZiBzdHJEYXRlXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlmIChpbnRDbnQgPCBzdHJEYXRlLmxlbmd0aClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLy8gaWYgXCJzdHJEYXRlXCIgY29udGFpbnMgREJDUywgdGhlIG5leHQgaW5kZXggb2YgXCJwaWN0dXJlXCIgaGFzIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoc3RyRGF0ZVtpbnRDbnRdKSA9PT0gZmFsc2UgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHRoaXMuX3BpY3R1cmVbaW50Q250ICsgaW50UGljSWR4T2ZzXSkgPT09IHRydWUpXHJcbiAgICAgICAgICAgICAgaW50UGljSWR4T2ZzKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihzdHJEYXRlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgbWF4IG51bWJlciBvZiBkYXkgaW4gbW9udGg8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwieWVhclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW9udGhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbWF4IGRheXMgWzI4LTMxXSBudW1iZXI8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRNYXhEYXlJbk1vbnRoKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgYXJyYXk6IG51bWJlcltdID0gW1xyXG4gICAgICAwLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXHJcbiAgICBdO1xyXG4gICAgbGV0IGxlYXB5ZWFyOiBib29sZWFuID0geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7XHJcblxyXG4gICAgaWYgKGxlYXB5ZWFyICYmIG1vbnRoID09PSAyKVxyXG4gICAgICByZXR1cm4gYXJyYXlbbW9udGhdICsgMTtcclxuXHJcbiAgICAgcmV0dXJuIGFycmF5W21vbnRoXTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5nZXQgbW9udGggZm9yIGRheSwgdGhhbiBkYXkgaGF2ZSBtYXNrIERERDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5ZWFyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXlcIj5bMC0zNjVdPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IG51bWJlciBvZiBtb250aDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldE1vbnRoQnlEYXkoeWVhcjogbnVtYmVyLCBkYXk6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IExlYXBZZWFyOiBib29sZWFuO1xyXG5cclxuICAgIExlYXBZZWFyID0gKHllYXIgJSA0ID09PSAwKSAmJiAoKHllYXIgJSAxMDAgIT09IDApIHx8ICh5ZWFyICUgNDAwID09PSAwKSk7XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWIubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICghTGVhcFllYXIpXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYltpXSA+PSBkYXkpXHJcbiAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgICAvLyBpcyBMZWFwIFllYXJcclxuICAgICAgZWxzZVxyXG4gICAgICB7XHJcbiAgICAgICAgaWYgKGkgPCAzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChQSUNJbnRlcmZhY2UuZGF0ZV9kYXlfdGFiW2ldID49IGRheSlcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGFkZCAxIGRheSBhZnRlciBzZWNvbmQgbW9udGhcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbaV0gKyAxID49IGRheSlcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IC8vIGZvciBsb29wXHJcbiAgICByZXR1cm4gaTsgLy8gdGhlIGZ1bmN0aW9uIGNhbm4ndCBjYW1lIHRvIHRoZSBzdGF0ZW1lbnQgYW55dGltZVxyXG4gIH1cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5nZXQgWWVhcnxNb250aHxEYXl8RG93IG9mIGRhdGVcclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+ZGF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZWxlbWVudFwiPnJlcXVpcmVkIGRhdGUgZWxlbWVudCAoeWVhci9tb250aC9kYXkvZG93KSA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5ZZWFyfE1vbnRofERheXxEb3cgb2YgZGF0ZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldERhdGVFbGVtZW50KGRhdGU6IHN0cmluZywgZWxlbWVudDogRGF0ZUVsZW1lbnQpOiBudW1iZXIge1xyXG4gICAgbGV0IGJ1ZmZlcjogU3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBsZXR0ZXJzOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGV4aXRMb29wOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgcGljV2Vla1R5cGU6IG51bWJlciA9IFBJQ0ludGVyZmFjZS5QSUNfV1dXOyAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICBsZXQgaXNKcG5FcmFZZWFyOiBib29sZWFuID0gZmFsc2U7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgIGxldCBlcmFfeWVhcjogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBBIERCQ1MgY2hhcmFjdGVyIGluIFwiZGF0ZVwiIGNvbnN1bWVzIHR3byBjaGFyYWN0ZXJzIGluIFwicGljdHVyZVwiLlxyXG4gICAgLy8gSWYgXCJkYXRlXCIgY29udGFpbnMgREJDUywgdGhlIHBvc2l0aW9uIG9mIFwicGljdHVyZVwiIGhhcyB0byBza2lwIG5leHQgaW5kZXguXHJcbiAgICAvLyBUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNraXBwZWQgaW5kZXhlcy5cclxuICAgIGxldCBpbnRQaWNJZHhPZnM6IG51bWJlciA9IDA7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuXHJcbiAgICBsZXQgbWluTGVuOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpXHJcbiAgICAgIG1pbkxlbiA9IFV0aWxTdHJCeXRlTW9kZS5nZXRNaW5MZW5QaWN0dXJlKGRhdGUsIHRoaXMuX3BpY3R1cmUpO1xyXG4gICAgZWxzZVxyXG4gICAgICBtaW5MZW4gPSBNYXRoLm1pbihkYXRlLmxlbmd0aCwgdGhpcy5fcGljdHVyZS5sZW5ndGgpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgKyBpbnRQaWNJZHhPZnMgPCBtaW5MZW4gJiYgIWV4aXRMb29wOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLmlzRGF0YVBvc2l0aW9uYWxEaXJlY3RpdmUodGhpcy5fcGljdHVyZVtpICsgaW50UGljSWR4T2ZzXSkpXHJcbiAgICAgIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuX3BpY3R1cmUuY2hhckNvZGVBdChpICsgaW50UGljSWR4T2ZzKSlcclxuICAgICAgICB7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ERDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5EQVkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19EREQ6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuREFZKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBidWZmZXIgPSBkYXRlLnN1YnN0cihpLCAzKTtcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkgKz0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfRERERDpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5EQVkpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpOyAvLyBub3QgKzQgbmVlZCBub3Qgc3VmZml4IG9mICduZCcsICdyZCcsICdzdCdcclxuICAgICAgICAgICAgZXhpdExvb3AgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSAzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19NTUQ6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuTU9OVEgpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NTTpcclxuICAgICAgICAgIC8vIGdldCBzaXplIG9mIFBJQ19NTU0gYmxvY2tcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfTU1NKTtcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5NT05USClcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgbGV0dGVycyk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpICs9IGxldHRlcnMgLSAxO1xyXG4gICAgICAgICAgbGV0dGVycyA9IDA7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lZOlxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LllFQVIpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDIpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lZWVk6XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUilcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgNCk7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkgKz0gMztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVzpcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ET1cpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIDEpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1dXVzpcclxuICAgICAgICAgIGxldHRlcnMgPSB0aGlzLmdldFNpemVPZkJsb2NrKGkgKyBpbnRQaWNJZHhPZnMsIFBJQ0ludGVyZmFjZS5QSUNfV1dXKTtcclxuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ET1cpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIGxldHRlcnMpO1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaSArPSBsZXR0ZXJzIC0gMTtcclxuICAgICAgICAgIGxldHRlcnMgPSAwO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IWVlZWVk6XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hMOlxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IREQ6XHJcbiAgICAgICAgICAvLyBub3QgaW1wbGVtZW50ZWQgZm9yIGhlYnJldyB5ZXRcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfQkI6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRTaXplT2ZCbG9jayhpICsgaW50UGljSWR4T2ZzLCBQSUNJbnRlcmZhY2UuUElDX0JCKTtcclxuXHJcbiAgICAgICAgICBpZiAoaSArIE1hdGguZmxvb3IobGV0dGVycyAvIDIpIDwgZGF0ZS5sZW5ndGgpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1ZmZlciA9IGRhdGUuc3Vic3RyKGksIE1hdGguZmxvb3IobGV0dGVycyAvIDIpKTtcclxuICAgICAgICAgICAgLy8gaWYgZGF0ZSBjb250YWlucyBEQkNTLCBzb21lIGluZGV4ZXMgb2YgcGljdHVyZSBoYXZlIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgICAgIGludFBpY0lkeE9mcyArPSBsZXR0ZXJzIC0gYnVmZmVyLmxlbmd0aDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuRE9XKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBleGl0TG9vcCA9IHRydWU7XHJcbiAgICAgICAgICAgIHBpY1dlZWtUeXBlID0gUElDSW50ZXJmYWNlLlBJQ19CQjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpICs9IGxldHRlcnMgLSAxO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KWTE6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpc0pwbkVyYVllYXIgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KWTI6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpc0pwbkVyYVllYXIgPSB0cnVlO1xyXG4gICAgICAgICAgaW50UGljSWR4T2ZzKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZNDogIC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIGlzSnBuRXJhWWVhciA9IHRydWU7XHJcbiAgICAgICAgICBpbnRQaWNJZHhPZnMgKz0gMjtcclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWUo6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUilcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyID0gZGF0ZS5zdWJzdHIoaSwgMik7XHJcbiAgICAgICAgICAgIGV4aXRMb29wID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGkrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gLy8gc3dpdGNoIG9mIHBvc2l0aW9uYWwgZGlyZWN0aXZlc1xyXG4gICAgICAgIH0gLy8gaWYgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmVzXHJcbiAgICB9IC8vIGZvciBsb29wIGluIHBpY3R1cmVcclxuXHJcbiAgICBpZiAoYnVmZmVyID09IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIGlmIChlbGVtZW50ID09PSBEYXRlRWxlbWVudC5ZRUFSKVxyXG4gICAgICAgIHJldHVybiBEYXRlVGltZS5Ob3cuWWVhcjtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1ZmZlciA9IGJ1ZmZlci50cmltKCk7XHJcblxyXG4gICAgaWYgKGxldHRlcnMgPiAwKVxyXG4gICAgLy8gaXQncyBQSUNfV1dXIG9yIFBJQ19NTU1cclxuICAgIHtcclxuICAgICAgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50Lk1PTlRIKVxyXG4gICAgICAgIGxldHRlcnMgPSB0aGlzLmdldE1vbnRoT3JXZWVrKGJ1ZmZlci50b1N0cmluZygpLCBsZXR0ZXJzLCBQSUNJbnRlcmZhY2UuUElDX01NTSk7XHJcbiAgICAgIGVsc2UgaWYgKGVsZW1lbnQgPT09IERhdGVFbGVtZW50LkRPVylcclxuICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRNb250aE9yV2VlayhidWZmZXIudG9TdHJpbmcoKSwgbGV0dGVycywgcGljV2Vla1R5cGUpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICB3aGlsZSAoYnVmZmVyLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIjBcIikgfHwgYnVmZmVyLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIiBcIikpXHJcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyLnRvU3RyaW5nKCkuc3Vic3RyKDEpO1xyXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMClcclxuICAgICAgICBsZXR0ZXJzID0gMDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGxldHRlcnMgPSBOTnVtYmVyLlBhcnNlKGJ1ZmZlci50b1N0cmluZygpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZWxlbWVudCA9PT0gRGF0ZUVsZW1lbnQuWUVBUiAmJiBpc0pwbkVyYVllYXIpXHJcbiAgICB7XHJcbiAgICAgIC8vIGdldCB0aGUgc3RhcnQgeWVhciBvZiB0aGUgZXJhXHJcbiAgICAgIGVyYV95ZWFyID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5nZXRTdGFydFllYXJPZkVyYShkYXRlLCB0aGlzLl9waWN0dXJlKTtcclxuICAgICAgaWYgKGVyYV95ZWFyID09PSAwKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICBsZXR0ZXJzICs9IGVyYV95ZWFyIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbGV0dGVycztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5jaGFuZ2UgZGF5IG51bWJlciBpbiBkYXRlIGZpZWxkIHRvIGRheU1heDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRlXCI+dG8gY2hhbmdlIGRheSBpbnRvPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXlNYXhcIj50aGUgbmV3IGRheSB2YWx1ZTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjaGFuZ2VEb3coZGF0ZTogc3RyaW5nLCBkb3c6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgaXNEYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbGV0dGVyczogbnVtYmVyO1xyXG4gICAgbGV0IHN0YXJ0UGFydDogc3RyaW5nO1xyXG4gICAgbGV0IGZpbmlzaFBhcnQ6IHN0cmluZztcclxuICAgIGxldCBudW1iZXIxOiBzdHJpbmc7XHJcblxyXG4gICAgbnVtYmVyMSA9IFwiXCIgKyBkb3c7IC8vIFwiIFwiXHJcblxyXG4gICAgLy8gQSBEQkNTIGNoYXJhY3RlciBpbiBcImRhdGVcIiBjb25zdW1lcyB0d28gY2hhcmFjdGVycyBpbiBcInBpY3R1cmVcIi5cclxuICAgIC8vIElmIFwiZGF0ZVwiIGNvbnRhaW5zIERCQ1MsIHRoZSBwb3NpdGlvbiBvZiBcInBpY3R1cmVcIiBoYXMgdG8gc2tpcCBuZXh0IGluZGV4LlxyXG4gICAgLy8gVGhpcyB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBza2lwcGVkIGluZGV4ZXMuIChKUE46IERCQ1Mgc3VwcG9ydClcclxuICAgIGxldCBpbnRQaWNJZHhPZnM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSArIGludFBpY0lkeE9mcyA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoICYmICFpc0RhdGU7IGkrKylcclxuICAgIHtcclxuICAgICAgaWYgKHRoaXMuaXNEYXRhUG9zaXRpb25hbERpcmVjdGl2ZSh0aGlzLl9waWN0dXJlW2kgKyBpbnRQaWNJZHhPZnNdKSlcclxuICAgICAge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5fcGljdHVyZS5jaGFyQ29kZUF0KGkgKyBpbnRQaWNJZHhPZnMpKVxyXG4gICAgICAgIHtcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1c6XHJcbiAgICAgICAgICBzdGFydFBhcnQgPSBkYXRlLnN1YnN0cigwLCBpKTtcclxuICAgICAgICAgIGZpbmlzaFBhcnQgPSBkYXRlLnN1YnN0cihpICsgMSk7XHJcbiAgICAgICAgICBkYXRlID0gc3RhcnRQYXJ0ICsgbnVtYmVyMSArIGZpbmlzaFBhcnQ7XHJcbiAgICAgICAgICBpc0RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19XV1c6XHJcbiAgICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRTaXplT2ZCbG9jayhpICsgaW50UGljSWR4T2ZzLCBQSUNJbnRlcmZhY2UuUElDX1dXVyk7XHJcbiAgICAgICAgICBzdGFydFBhcnQgPSBkYXRlLnN1YnN0cigwLCBpKTtcclxuICAgICAgICAgIGZpbmlzaFBhcnQgPSBkYXRlLnN1YnN0cihpICsgbGV0dGVycyk7XHJcbiAgICAgICAgICBsZXQgZGF5U3RyOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgbGV0IGRheU5hbWVzOiBzdHJpbmdbXSA9IERhdGVVdGlsLmdldExvY2FsRGF5cyhkYXlTdHIpO1xyXG4gICAgICAgICAgbnVtYmVyMSA9IGRheU5hbWVzW2Rvd107XHJcblxyXG4gICAgICAgICAgaWYgKG51bWJlcjEubGVuZ3RoID4gbGV0dGVycylcclxuICAgICAgICAgICAgbnVtYmVyMSA9IG51bWJlcjEuc3Vic3RyKDAsIGxldHRlcnMpO1xyXG4gICAgICAgICAgZWxzZSBpZiAobnVtYmVyMS5sZW5ndGggPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICB3aGlsZSAobnVtYmVyMS5sZW5ndGggPCBsZXR0ZXJzKVxyXG4gICAgICAgICAgICAgIG51bWJlcjEgPSBudW1iZXIxICsgJyAnO1xyXG4gICAgICAgICAgZGF0ZSA9IHN0YXJ0UGFydCArIG51bWJlcjEgKyBmaW5pc2hQYXJ0O1xyXG4gICAgICAgICAgaXNEYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfQkI6ICAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICBsZXR0ZXJzID0gdGhpcy5nZXRTaXplT2ZCbG9jayhpICsgaW50UGljSWR4T2ZzLCBQSUNJbnRlcmZhY2UuUElDX0JCKTtcclxuICAgICAgICAgIC8vIFwibGV0dGVyc1wiIG1lYW5zIGEgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gXCJwaWN0dXJlXCJcclxuXHJcbiAgICAgICAgICBzdGFydFBhcnQgPSBkYXRlLnN1YnN0cigwLCBpKTtcclxuICAgICAgICAgIGZpbmlzaFBhcnQgPSBkYXRlLnN1YnN0cihpICsgTWF0aC5mbG9vcihsZXR0ZXJzIC8gMikpO1xyXG4gICAgICAgICAgLy8gXCJsZXR0ZXJzIC8gMlwiIG1lYW5zIGEgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gXCJkYXRlXCJcclxuXHJcbiAgICAgICAgICBudW1iZXIxID0gVXRpbERhdGVKcG4uZ2V0U3RyRG93KGRvdyk7XHJcblxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKG51bWJlcjEpID4gbGV0dGVycylcclxuICAgICAgICAgICAgbnVtYmVyMSA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihudW1iZXIxLCBsZXR0ZXJzKTtcclxuICAgICAgICAgIGVsc2UgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKG51bWJlcjEpIDwgbGV0dGVycylcclxuICAgICAgICAgICAgd2hpbGUgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKG51bWJlcjEpIDwgbGV0dGVycylcclxuICAgICAgICAgICAgICBudW1iZXIxID0gbnVtYmVyMSArICcgJztcclxuICAgICAgICAgIGRhdGUgPSBzdGFydFBhcnQgKyBudW1iZXIxICsgZmluaXNoUGFydDtcclxuICAgICAgICAgIGlzRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpKVxyXG4gICAgICAgICAgLy8gSlBOOiBEQkNTIHN1cHBvcnRcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGkgPCBkYXRlLmxlbmd0aClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC8vIGlmIFwiZGF0ZVwiIGNvbnRhaW5zIERCQ1MsIHRoZSBuZXh0IGluZGV4IG9mIFwicGljdHVyZVwiIGhhcyB0byBiZSBza2lwcGVkLlxyXG4gICAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgoZGF0ZVtpXSkgPT09IGZhbHNlICYmIFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aCh0aGlzLl9waWN0dXJlW2kgKyBpbnRQaWNJZHhPZnNdKSA9PT0gdHJ1ZSlcclxuICAgICAgICAgICAgICAgIGludFBpY0lkeE9mcysrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfSAvLyBzd2l0Y2hcclxuICAgICAgICB9IC8vIGlmIG9mIHBvc2l0aW9uYWwgZGlyZWN0aXZlc1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgJiB2YWxpZGF0ZSBUaW1lIGZpZWxkIGJ5IGhpcyBvbGQvbmV3IHZhbHVlIGFuZCAyIHBpY3R1cmVzOlxyXG4gIC8vLyBSZWFsIGFuZCBFbmFibGVcclxuICAvLy8gMS5jaGVjayBpZiBuZXd2YWx1ZSBjb21wbGV0ZSB3aXRoIHBpY3R1cmVzLCBvdGhlcndpc2UgcmV0dXJuIG9sZHZhbHVlXHJcbiAgLy8vIDIuY2hlY2sgaWYgbmV3dmFsdWUgY29tcGxldGUgd2l0aCByYW5nZVxyXG4gIC8vLyAyLjEgY29tcGxldGUgdmFsdWUsIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgIHJldHVybiBvbGR2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBTdHJpbmcgLSBuZXcgdmFsdWUgb2YgdmFsaWRhdGVkIGZpZWxkPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgY2hlY2tUaW1lRmllbGQoKTogRGF0ZSB7XHJcbiAgICBsZXQgbmV3VGltZTogRGF0ZSA9IG5ldyBEYXRlICh0aGlzLl9uZXd2YWx1ZSk7XHJcblxyXG5cclxuICAgIHRoaXMuc2V0VmFsaWRhdGlvbkZhaWxlZChmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuaXNEYXRlWmVybyh0aGlzLl9uZXd2YWx1ZSkpIHtcclxuICAgICAgLy8gZ2V0IGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZpZWxkXHJcbiAgICAgIGxldCBkZWZhdWx0TWdWYWx1ZTogc3RyaW5nID0gdGhpcy5fdmFsRGV0LmdldENvbnRyb2woKS5nZXRGaWVsZCgpLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgICBuZXdUaW1lID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5tZzJkaXNwKGRlZmF1bHRNZ1ZhbHVlLCBcIlwiLCB0aGlzLl92YWxEZXQuZ2V0UElDKCksIHRydWUsIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgICAgLy8gcmFuZ2Ugb2YgdGhlIHRpbWVcclxuICAgICAgaWYgKHRoaXMuX3ZhbERldC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKSAhPSBudWxsIHx8IHRoaXMuX3ZhbERldC5nZXREaXNjcmV0ZVJhbmdlVmFsdWVzKCkgIT0gbnVsbClcclxuICAgICAgICBuZXdUaW1lID0gdGhpcy5maWxsVGltZUJ5UmFuZ2UodGhpcy5fdmFsRGV0LmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpLCB0aGlzLl92YWxEZXQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpLCB0aGlzLl9uZXd2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3VGltZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BZGQgZm91bmQgaW4gbmV3dmFsdWUgbnVtYmVycygyKG9yIDEpIGxldHRlcnMpIHRvIGJ1ZmZlciBhbmQgcmV0dXJuXHJcbiAgLy8vIGxhc3QgZm91bmQgbnVtYmVyIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyVmFsdWVcIj5pbiBuZXd2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYnVmZmVyXCI+Ly8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHlwZVwiPndoaWNoIHR5cGUgb2YgcG9zaXRpb25hbCBkaXJlY3RpdmUsIGZvciBjaGVja2luZyB2YWxpZGl0eTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBjdXJyVmFsdWUgaW4gbmV3dmFsdWU8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhZGQyVGltZShjdXJyVmFsdWU6IG51bWJlciwgYnVmZmVyOiBTdHJpbmdCdWlsZGVyLCB0eXBlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHN0YXJ0OiBudW1iZXIgPSBjdXJyVmFsdWU7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IFNUUl8wMDogU3RyaW5nID0gXCIwMFwiO1xyXG4gICAgbGV0ICBjdXJyQWRkOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICB3aGlsZSAoc3RhcnQgPCB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHRoaXMuX25ld3ZhbHVlW3N0YXJ0XSkpXHJcbiAgICB7XHJcbiAgICAgIHN0YXJ0Kys7IC8vIGZpbmQgZmlyc3QgZGlnaXRcclxuICAgICAgLy8gbm9uLWRpZ2l0cyB3ZXJlIGZvdW5kIGluIGlucHV0IHN0cmluZ1xyXG4gICAgICAvLyB3ZSBkbyBub3QgdGhyb3cgU1RSX0VSUl9USU1FIGV4Y2VwdGlvbiB0byBwcmV2ZW50IGlucHV0IGRpZ2l0cyBsb3N0XHJcbiAgICAgIC8vIG9uIG5vbi1kaWdpdHMgcGxhY2UgU1RSXzAwIHdpbGwgYmUgYWRkZWRcclxuICAgICAgLy8gU2luY2UgTWFzayBFZGl0aW5nIC4gVGhpcyBlcnJvciBpcyBpcnJlbGV2YW50LiBUaW1lIG5vdywgYWx3YXlzIGNvbnRhaW5zIG5vbiBkaWdpdHMgbGlrZSA6IGFuZCBtaWdodCBjb250YWluICcgJyBmb3IgdW5maWxsZWQgY2hhcnMuXHJcbiAgICAgIC8vIFRoaXMgaXMgYSB2YWxpZCBjYXNlIGFuZCB3ZSBkbyBub3Qgd2FudCBhbiBlcnJvciBwb3BwaW5nIGFib3V0IGl0LlxyXG4gICAgICAvLyAgZ3VpTWFuYWdlci53cml0ZVRvTWVzc2FnZVBhbmUodmFsRGV0LmdldENvbnRyb2woKS5nZXRGb3JtKCkuZ2V0VGFzaygpLCBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldE1lc3NhZ2VTdHJpbmcoU1RSX0VSUl9USU1FKSwgU3RhdHVzQmFyTWVzc2FnZVR5cGUuU0JfUlVOVElNRV9NU0cpO1xyXG4gICAgICAvLyAgc2V0VmFsaWRhdGlvbkZhaWxlZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhcnQgPT09IHRoaXMuX25ld3ZhbHVlLmxlbmd0aClcclxuICAgIC8vIG5vdCBmb3VuZCBtb3JlIGRpZ2l0c1xyXG4gICAge1xyXG4gICAgICBidWZmZXIuQXBwZW5kKFNUUl8wMC50b1N0cmluZygpKTtcclxuICAgICAgcmV0dXJuIGN1cnJWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgMiAmJiBpIDwgdGhpcy5fbmV3dmFsdWUubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdCh0aGlzLl9uZXd2YWx1ZVtpXSkpXHJcbiAgICAgICAgY3VyckFkZC5BcHBlbmQodGhpcy5fbmV3dmFsdWVbaV0pO1xyXG4gICAgICBlbHNlXHJcbiAgICAgIHtcclxuICAgICAgICBjdXJyQWRkLkluc2VydCgwLCAnMCcpOyAvLyBvbmx5IDEgZGlnaXQgZm91bmRcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgaSA9PT0gc3RhcnQgKyAxKVxyXG4gICAgICBjdXJyQWRkLkluc2VydCgwLCAnMCcpO1xyXG4gICAgLy8gb25seSAxIGRpZ2l0IGZvdW5kXHJcbiAgICBlbHNlIGlmIChpID09PSB0aGlzLl9uZXd2YWx1ZS5sZW5ndGggJiYgaSA9PT0gc3RhcnQpXHJcbiAgICAgIGN1cnJBZGQuQXBwZW5kKFNUUl8wMC50b1N0cmluZygpKTtcclxuXHJcbiAgICBsZXQgYWRkOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcblxyXG4gICAgLyppZiAoYWRkIDwgMClcclxuICAgIGN1cnJBZGQ9bmV3IFN0cmluZ0J1ZmZlcihcIjAwXCIpO1xyXG4gICAgZWxzZSBpZiAoYWRkID4gNTkgJiYgdHlwZT09UElDX01NVClcclxuICAgIGN1cnJBZGQ9bmV3IFN0cmluZ0J1ZmZlcihcIjU5XCIpO1xyXG4gICAgZWxzZSBpZiAoYWRkID4gNTkgJiYgdHlwZT09UElDX1NTKVxyXG4gICAgY3VyckFkZD1uZXcgU3RyaW5nQnVmZmVyKFwiNTlcIik7Ki9cclxuICAgIGlmIChhZGQgPCAwIHx8IChhZGQgPiA1OSAmJiB0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX01NVCkgfHwgKGFkZCA+IDU5ICYmIHR5cGUgPT09IFBJQ0ludGVyZmFjZS5QSUNfU1MpKVxyXG4gICAgICB0aHJvdyBuZXcgV3JvbmdGb3JtYXRFeGNlcHRpb24oTXNnSW50ZXJmYWNlLlNUUl9FUlJfVElNRSk7XHJcbiAgICBlbHNlIGlmICh0eXBlID09PSBQSUNJbnRlcmZhY2UuUElDX0hIKVxyXG4gICAge1xyXG4gICAgICBsZXQgUE06IGJvb2xlYW4gPSB0aGlzLmdldElzUE0oKTtcclxuICAgICAgbGV0IG5ld1N0cjogU3RyaW5nID0gbnVsbDtcclxuICAgICAgbGV0IGRpZjogbnVtYmVyO1xyXG5cclxuICAgICAgaWYgKChhZGQgPj0gMTIgfHwgYWRkID09PSAwKSAmJiBQTSlcclxuICAgICAge1xyXG4gICAgICAgIGxldCBhZGRUbXA6IG51bWJlciA9IGFkZCAlIDI0O1xyXG5cclxuICAgICAgICB0aGlzLl9pc1BtID0gKGFkZFRtcCA+PSAxMiAmJiBhZGRUbXAgPCAyNCk7XHJcblxyXG4gICAgICAgIGlmIChhZGRUbXAgPiAxMilcclxuICAgICAgICAgIGRpZiA9IGFkZFRtcCAtIDEyO1xyXG4gICAgICAgIGVsc2UgaWYgKGFkZFRtcCA9PT0gMClcclxuICAgICAgICAgIGRpZiA9IDEyO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGRpZiA9IGFkZFRtcDtcclxuXHJcbiAgICAgICAgbmV3U3RyID0gKChkaWYgPiA5ID8gXCJcIiA6IFwiMFwiKSArIGRpZik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoYWRkID4gOTkgJiYgIVBNKVxyXG4gICAgICAgIG5ld1N0ciA9IFwiOTlcIjtcclxuXHJcbiAgICAgIGlmIChuZXdTdHIgIT0gbnVsbClcclxuICAgICAge1xyXG4gICAgICAgIGN1cnJBZGQuUmVtb3ZlKDAsIGN1cnJBZGQuTGVuZ3RoKTtcclxuICAgICAgICBjdXJyQWRkLkFwcGVuZChuZXdTdHIudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBidWZmZXIuQXBwZW5kKGN1cnJBZGQuVG9TdHJpbmcoKSk7XHJcbiAgICByZXR1cm4gaTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5BcHBlbmQgUE0gb3IgQU0gdG8gdGltZTwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFkZFBNMlRpbWUoY3VyclZhbHVlOiBudW1iZXIsIGJ1ZmZlcjogU3RyaW5nQnVpbGRlcik6IG51bWJlciB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG5cclxuICAgIGlmICgoaSA9IHRoaXMuX25ld3ZhbHVlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIkFNXCIsIGN1cnJWYWx1ZSkpICE9PSAtMSlcclxuICAgIHtcclxuICAgICAgYnVmZmVyLkFwcGVuZChcImFtXCIpO1xyXG4gICAgICByZXR1cm4gaSArIDI7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIGlmICgoaSA9IHRoaXMuX25ld3ZhbHVlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIlBNXCIsIGN1cnJWYWx1ZSkpICE9PSAtMSlcclxuICAgICAge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJwbVwiKTtcclxuICAgICAgICByZXR1cm4gaSArIDI7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5faXNQbSlcclxuICAgICAge1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJwbVwiKTtcclxuICAgICAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBidWZmZXIuQXBwZW5kKFwiYW1cIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyclZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PkNoZWNrIGlmIHdoZXJlIGlzICdQTScgcG9zaXRpb25hbCBkaXJlY3RpdmUgaW4gdGhlIFRpbWUgUGljdHVyZTwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgLSB0aGVyZSBpcyBQTSwgZWxzZSBmYWxzZTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldElzUE0oKTogYm9vbGVhbiB7XHJcblxyXG4gICAgZm9yIChsZXQgY3VycjogbnVtYmVyID0gMDsgY3VyciA8IHRoaXMuX3BpY3R1cmUubGVuZ3RoOyBjdXJyKyspXHJcbiAgICB7XHJcbiAgICAgIGlmICh0aGlzLl9waWN0dXJlLmNoYXJDb2RlQXQoY3VycikgPT09IFBJQ0ludGVyZmFjZS5QSUNfUE0pXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWxsVGltZUJ5UmFuZ2UoQ29udGludW91c1JhbmdlOiBMaXN0PHN0cmluZz4sIERpc2NyZXRlUmFuZ2U6IExpc3Q8c3RyaW5nPiwgYnVmZmVyOiBEYXRlKTogRGF0ZSB7XHJcbiAgICBsZXQgIHBpYzogUElDID0gdGhpcy5fdmFsRGV0LmdldFBJQygpO1xyXG4gICAgbGV0ICBjdXJyVGltZTogbnVtYmVyID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5mcm9tTmF0aXZlVGltZVRvTWdUaW1lTnVtYmVyKGJ1ZmZlcik7XHJcbiAgICBsZXQgZG93blRpbWU6IG51bWJlciwgdG9wVGltZTogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuXHJcbiAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQoZmFsc2UpO1xyXG4gICAgaWYgKENvbnRpbnVvdXNSYW5nZSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgQ29udGludW91c1JhbmdlLmxlbmd0aCAtIDE7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGRvd25UaW1lID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5hXzJfdGltZShDb250aW51b3VzUmFuZ2UuZ2V0X0l0ZW0oaSksIHBpYywgZmFsc2UpO1xyXG4gICAgICAgIHRvcFRpbWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmFfMl90aW1lKENvbnRpbnVvdXNSYW5nZS5nZXRfSXRlbSgrK2kpLCBwaWMsIGZhbHNlKTtcclxuICAgICAgICBpZiAoY3VyclRpbWUgPj0gZG93blRpbWUgJiYgY3VyclRpbWUgPD0gdG9wVGltZSlcclxuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShidWZmZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKERpc2NyZXRlUmFuZ2UgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IERpc2NyZXRlUmFuZ2UubGVuZ3RoOyBpKyspXHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoY3VyclRpbWUgPT09IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuYV8yX3RpbWUoRGlzY3JldGVSYW5nZS5nZXRfSXRlbShpKSwgcGljLCBmYWxzZSkpXHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoYnVmZmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdGhlIHRpbWUgaXMgbm90IGluIHRoZSByYW5nZVxyXG4gICAgdGhyb3cgbmV3IFdyb25nRm9ybWF0RXhjZXB0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIC8vLyBTRVJWSUNFIGZ1bmN0aW9uc1xyXG4gIC8vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHByaW50IEVSUk9SIHByb21wdCBtZXNzYWdlIGFib3V0IHJhbmdlIHRvIHN0YXR1cyBiYXI8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnSWRcIj5vZiBlcnJvciBNZXNzYWdlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXRWYWxpZGF0aW9uRmFpbGRcIj52YWxpZGF0aW9uIGZhaWxlZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBwcmludE1lc3NhZ2UobXNnSWQ6IHN0cmluZywgc2V0VmFsaWRhdGlvbkZhaWxkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgbWVzc2FnZTogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiXCIpO1xyXG4gICAgbGV0IGN0cmxUeXBlOiBNZ0NvbnRyb2xUeXBlO1xyXG5cclxuICAgIGlmIChtc2dJZCA9PT0gTXNnSW50ZXJmYWNlLkVEVF9FUlJfU1RSXzEpXHJcbiAgICB7XHJcbiAgICAgIGxldCBwaWM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuICAgICAgbGV0IHRva2VuOiBzdHJpbmcgPSBcIiVkXCI7XHJcbiAgICAgIGxldCBtZXNzYWdlU3RyaW5nOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhtc2dJZCk7XHJcbiAgICAgIG1lc3NhZ2VTdHJpbmcgPSBTdHJVdGlsLnJlcGxhY2VTdHJpbmdUb2tlbnMobWVzc2FnZVN0cmluZywgdG9rZW4sIDEsIHBpYy5nZXRXaG9sZXMoKS50b1N0cmluZygpKTtcclxuICAgICAgbWVzc2FnZVN0cmluZyA9IFN0clV0aWwucmVwbGFjZVN0cmluZ1Rva2VucyhtZXNzYWdlU3RyaW5nLCB0b2tlbiwgMSwgcGljLmdldERlYygpLnRvU3RyaW5nKCkpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChtZXNzYWdlU3RyaW5nKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcobXNnSWQpKTtcclxuICAgICAgaWYgKG1zZ0lkID09PSBNc2dJbnRlcmZhY2UuU1RSX1JOR19UWFQgJiYgdGhpcy5fdmFsRGV0LmdldFJhbmdlKCkgIT0gbnVsbClcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChTdHJVdGlsLm1ha2VQcmludGFibGVUb2tlbnModGhpcy5fdmFsRGV0LmdldFJhbmdlKCksIEhUTUxfMl9TVFIpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fdmFsRGV0LmdldENvbnRyb2woKSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBjdHJsVHlwZSA9IHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuVHlwZTtcclxuICAgICAgaWYgKGN0cmxUeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT04gJiYgY3RybFR5cGUgIT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1JBRElPICYmICF0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmlzU2VsZWN0aW9uQ3RybCgpKVxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IG1zZ1N0cmluZzogc3RyaW5nID0gbWVzc2FnZS5Ub1N0cmluZygpO1xyXG4gICAgICAgIHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0Rm9ybSgpLmdldFRhc2soKS5Xcml0ZVRvTWVzc2FnZVBhbmUoU3RyVXRpbC5tYWtlUHJpbnRhYmxlMihtc2dTdHJpbmcpKTtcclxuICAgICAgICB0aGlzLl92YWxEZXQuZ2V0Q29udHJvbCgpLmdldEZvcm0oKS5FcnJvck9jY3VyZWQgPSAhTlN0cmluZy5Jc051bGxPckVtcHR5KG1zZ1N0cmluZyk7XHJcbiAgICAgICAgdGhpcy5fdmFsRGV0LkVycm9yTWVzc2FnZSA9IG1lc3NhZ2UuVG9TdHJpbmcoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHNldFZhbGlkYXRpb25GYWlsZClcclxuICAgIC8vIGZyb20gdGhpcyBwb2ludCB0aGUgZm9jdXMgc2VuZCBiYWNrIHRvIGNvbnRyb2wgYW5kIHNldFZhbGlkYXRpb25GYWlsZWQodHJ1ZSkgY2FuIG5vdCBzZXQgaXQgdG8gdHJ1ZVxyXG4gICAgICB0aGlzLnNldFZhbGlkYXRpb25GYWlsZWQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Q2hhbmdlIGluc2lkZSAnbmV3dmFsdWUnIHN1YnN0cmluZyBvbiBwb3NpdGlvbiAnaW5kZXgnIHRvIHN0cmluZyAndG8nPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld3ZhbHVlXCI+dG8gY2hhbmdlIGluc2lkZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidG9cIj5zdHJpbmcgdG8gY2hhbmdlIGJ5IGhpbTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW5kZXhcIj50aGUgc3Vic3RyaW5nIHRvIGNoYW5nZSBvbiB0aGUgcG9zaXRpb248L3BhcmFtPlxyXG4gIHByaXZhdGUgY2hhbmdlU3RyaW5nSW5zaWRlKHRvOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX25ld3ZhbHVlID0gdGhpcy5fbmV3dmFsdWUuc3Vic3RyKDAsIGluZGV4KSArIHRvICsgIHRoaXMuX25ld3ZhbHVlLnN1YnN0cihpbmRleCArIHRvLmxlbmd0aCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQodmFsaWRhdGlvbkRldGFpbHM6IFZhbGlkYXRpb25EZXRhaWxzKTogdm9pZCB7XHJcbiAgICB0aGlzLl92YWxEZXQgPSB2YWxpZGF0aW9uRGV0YWlscztcclxuICAgIHRoaXMuX3ZhbERldC5zZXROdWxsKGZhbHNlKTtcclxuICAgIHRoaXMuX2lzUG0gPSBmYWxzZTtcclxuICAgIGxldCBwSUM6IFBJQyA9IHRoaXMuX3ZhbERldC5nZXRQSUMoKTtcclxuICAgIHRoaXMuX29sZHZhbHVlID0gdGhpcy5fdmFsRGV0LmdldE9sZFZhbHVlKCk7XHJcbiAgICB0aGlzLl9uZXd2YWx1ZSA9IHRoaXMuX3ZhbERldC5nZXREaXNwVmFsdWUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fbmV3dmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgaWYgKHBJQyA9PSBudWxsICB8fCBwSUMuZ2V0QXR0cigpICE9IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSlcclxuICAgICAgICB0aGlzLl9uZXd2YWx1ZSA9IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX29sZHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX29sZHZhbHVlID0gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIShwSUMgPT09IG51bGwgfHwgcElDLmdldEF0dHIoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHBJQy5nZXRBdHRyKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpKSB7XHJcbiAgICAgIHRoaXMuX3BpY3R1cmUgPSBwSUMuZ2V0TWFzaygpO1xyXG4gICAgICB0aGlzLmhlYnJldyA9IHBJQy5pc0hlYnJldygpO1xyXG4gICAgICB0aGlzLl9waWN0dXJlID0gdGhpcy5fcGljdHVyZS5zdWJzdHIoMCwgcElDLmdldE1hc2tTaXplKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlJldHVybiBpbmRleCBvZiBNYXggbWVtYmVyIGluIGFycmF5PC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZmluZE1heChhcnJheTogbnVtYmVyW10pOiBudW1iZXIge1xyXG4gICAgbGV0IGluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IG1heDogbnVtYmVyID0gYXJyYXlbaW5kZXhdO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICBpZiAoYXJyYXlbaV0gPiBtYXgpXHJcbiAgICAgIHtcclxuICAgICAgICBtYXggPSBhcnJheVtpXTtcclxuICAgICAgICBpbmRleCA9IGk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcbiAgLy8vIDxzdW1tYXJ5PmlzIGNoZWNrZWQgY2hhciBEYXRhIFBvc2l0aW9uYWwgRGlyZWN0aXZlPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaXNEYXRhUG9zaXRpb25hbERpcmVjdGl2ZSh0b0NoZWNrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBhc2NpaTogbnVtYmVyID0gdG9DaGVjay5jaGFyQ29kZUF0KDApO1xyXG4gICAgcmV0dXJuIChhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZWVlZIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX01NRCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NTU1cclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfREREIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0REREQgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfV1xyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19XV1cgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSFlZWVlZIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0hMIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0hERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZSlxyXG4gICAgICB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTEgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkyIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZNCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19CQik7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+Y2hlY2sgaWYgTnVtZXJpYyBEYXRhIFBvc2l0aW9uYWwgRGlyZWN0aXZlIGV4aXN0czwvc3VtbWFyeT5cclxuICBwcml2YXRlIGlzRGF0ZVBvc2l0aW9uYWxOdW1lcmljRGlyZWN0aXZlKHRvQ2hlY2s6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFzY2lpOiBudW1iZXIgPSB0b0NoZWNrLmNoYXJDb2RlQXQoMCk7XHJcbiAgICByZXR1cm4gKGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1lZIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1lZWVkgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTU1EIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0REXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0RERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19EREREIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX1cgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSFlZWVlZXHJcbiAgICAgIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0hMIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0hERCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19ZSiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTFcclxuICAgICAgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkyIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0pZNCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19CQik7IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+aXMgY2hlY2tlZCBjaGFyIE51bWVyaWMgUG9zaXRpb25hbCBEaXJlY3RpdmU8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpc051bWVyaWNQb3NpdGlvbmFsRGlyZWN0aXZlKHRvQ2hlY2s6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFzY2lpOiBudW1iZXIgPSB0b0NoZWNrLmNoYXJDb2RlQXQoMCk7XHJcbiAgICByZXR1cm4gKGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX04pO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5pcyBjaGVja2VkIGNoYXIgTG9naWMgUG9zaXRpb25hbCBEaXJlY3RpdmU8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpc0xvZ2ljUG9zaXRpb25hbERpcmVjdGl2ZSh0b0NoZWNrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBhc2NpaTogbnVtYmVyID0gdG9DaGVjay5jaGFyQ29kZUF0KDApO1xyXG4gICAgcmV0dXJuIChhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19YKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+RmluZCBpZiB0aGUgbGV0dGVyIGF0IGluZGV4IGlzIFBvc2l0aW9uYWwgRGF0ZSBEaXJlY3RpdmU8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2hhclwiPnRvIGNoZWNrIGluIHBpY3R1cmU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBQb3NpdGlvbmFsIERhdGUgRGlyZWN0aXZlOyBmYWxzZSBvdGhlcndpc2U8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBpc1RpbWVQb3NpdGlvbmFsRGlyZWN0aXZlKHRvQ2hlY2s6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFzY2lpOiBudW1iZXIgPSB0b0NoZWNrLmNoYXJDb2RlQXQoMCk7XHJcbiAgICByZXR1cm4gKGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0hIIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX01NVCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19TUyB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19QTSB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19NUyk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIGNoZWNrZWQgc3RyaW5nIFBvc2l0aW9uYWwgRGlyZWN0aXZlIG9mIGFueSB0eXBlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZ1bGwvcGFydFwiPm9mIHBpY3R1cmVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGluZGV4IG9mIGRpcmVjdGl2ZSBwb3NpdGlvbiBvciAtMSBpZiBub3QgZm91bmQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBpbmRleE9mUG9zaXRpb25hbE5vbkRpcmVjdGl2ZShzdHI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgdG1wOiBzdHJpbmc7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgdG1wID0gc3RyW2ldO1xyXG4gICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZSh0bXApIHx8IHRoaXMuaXNEYXRhUG9zaXRpb25hbERpcmVjdGl2ZSh0bXApIHx8IHRoaXMuaXNOdW1lcmljUG9zaXRpb25hbERpcmVjdGl2ZSh0bXApXHJcbiAgICAgICAgfHwgdGhpcy5pc0xvZ2ljUG9zaXRpb25hbERpcmVjdGl2ZSh0bXApIHx8IHRoaXMuaXNUaW1lUG9zaXRpb25hbERpcmVjdGl2ZSh0bXApKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICByZXR1cm4gaTtcclxuICAgIH1cclxuICAgIHJldHVybiAtMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gc2V0IHRoZSBcInZhbGlkYXRpb24gZmFpbGVkXCIgZmxhZzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj52YWx1ZSB0byB1c2U8L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0VmFsaWRhdGlvbkZhaWxlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl92YWxEZXQuVmFsaWRhdGlvbkZhaWxlZClcclxuICAgICAgcmV0dXJuO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLl92YWxEZXQuc2V0VmFsaWRhdGlvbkZhaWxlZCh2YWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDb3VudCBkaWdpdHMgaW4gc3RyaW5nIGJlZm9yZSBkZWxpbWV0ZXI8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW5wdXRTdHJpbmdcIj4tIHN0cmluZyB0byBsb29rIGludG8gZm9yIGRlbGltZXRlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2VhcmNoU3RhcnRcIj4tIGluaXRpYWwgaW5kZXggcG9zaXRpb24gZm9yIHNlYXJjaCBpbiBpbnB1dFN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVsaW1ldGVyXCI+d2UgYXJlIGxvb2tpbmcgZm9yPC9wYXJhbT5cclxuICBwcml2YXRlIGRpZ2l0c0JlZm9yZURlbGltZXRlcihpbnB1dFN0cmluZzogc3RyaW5nLCBzZWFyY2hTdGFydDogbnVtYmVyLCBkZWxpbWV0ZXI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgY291bnRlcjogbnVtYmVyID0gMDtcclxuICAgIGxldCBzZWFyY2hFbmRQb3M6IG51bWJlciA9IGlucHV0U3RyaW5nLmluZGV4T2YoZGVsaW1ldGVyLCBzZWFyY2hTdGFydCk7XHJcblxyXG4gICAgaWYgKHNlYXJjaEVuZFBvcyA8IDApXHJcbiAgICAgIHNlYXJjaEVuZFBvcyA9IGlucHV0U3RyaW5nLmxlbmd0aDtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBzZWFyY2hTdGFydDsgaSA8IHNlYXJjaEVuZFBvczsgaSsrKVxyXG4gICAgaWYgKE5DaGFyLklzRGlnaXQoaW5wdXRTdHJpbmdbaV0pKVxyXG4gICAgICBjb3VudGVyKys7XHJcblxyXG4gICAgcmV0dXJuIGNvdW50ZXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGJ5IEN0cmwrVSAoU2V0IHRvIE51bGwpLCBudWxsIGRpc3BsYXkgdmFsdWUgaXMgc2V0IHRvIGN0cmwuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIGZvbGxvd2luZyBjaGVja2luZyAsIGluIG9yZGVyIHRvIHNldCBmaWVsZCB0byBudWxsLjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj4tIGVudGVyZWQgdmFsdWUgdG8gdmFsdWUgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIHByaXZhdGUgaXNOdWxsRGlzcGxheVZhbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBpc051bGxEaXNwbGF5VmFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZmllbGQ6IEd1aUZpZWxkQmFzZSA9IHRoaXMuX3ZhbERldC5nZXRDb250cm9sKCkuZ2V0RmllbGQoKTtcclxuXHJcbiAgICBpZiAoZmllbGQuTnVsbEFsbG93ZWQgJiYgZmllbGQuaGFzTnVsbERpc3BsYXlWYWx1ZSgpKVxyXG4gICAge1xyXG4gICAgICBsZXQgZGlzcERlZlZhbHVlOiBhbnkgPSBmaWVsZC5nZXROdWxsRGlzcGxheSgpO1xyXG4gICAgICBpZiAoZGlzcERlZlZhbHVlICE9PSBudWxsKVxyXG4gICAgICAgIGlzTnVsbERpc3BsYXlWYWwgPSAoZGlzcERlZlZhbHVlLnRvU3RyaW5nKCkgPT09IHRoaXMuX25ld3ZhbHVlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGlzTnVsbERpc3BsYXlWYWwgPSAodGhpcy5fbmV3dmFsdWUgPT09IG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpc051bGxEaXNwbGF5VmFsO1xyXG4gIH1cclxufVxyXG4iXX0=