@magic-xpa/gui 4.1100.0-dev4110.24 → 4.1100.0-dev4110.241

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 (200) hide show
  1. package/{esm2020 → esm2022}/index.mjs +71 -71
  2. package/{esm2020 → esm2022}/magic-xpa-gui.mjs +1 -1
  3. package/esm2022/src/Commands.mjs +184 -0
  4. package/esm2022/src/Events.mjs +425 -0
  5. package/esm2022/src/EventsProcessor.mjs +67 -0
  6. package/esm2022/src/FocusManager.mjs +34 -0
  7. package/esm2022/src/GuiConstants.mjs +68 -0
  8. package/{esm2020 → esm2022}/src/GuiEnums.mjs +299 -299
  9. package/esm2022/src/GuiEnvironment.mjs +4 -0
  10. package/{esm2020 → esm2022}/src/IFlowMonitorQueue.mjs +1 -1
  11. package/{esm2020 → esm2022}/src/Manager.mjs +91 -91
  12. package/esm2022/src/UIBridge.mjs +33 -0
  13. package/{esm2020 → esm2022}/src/env/IEnvironment.mjs +1 -1
  14. package/{esm2020 → esm2022}/src/gui/ControlBase.mjs +2 -2
  15. package/esm2022/src/gui/GuiMgControl.mjs +123 -0
  16. package/{esm2020 → esm2022}/src/gui/GuiMgForm.mjs +3 -3
  17. package/esm2022/src/gui/KeyboardItem.mjs +135 -0
  18. package/esm2022/src/gui/LastFocusedVal.mjs +11 -0
  19. package/esm2022/src/gui/MgValue.mjs +16 -0
  20. package/{esm2020 → esm2022}/src/gui/PropParentInterface.mjs +1 -1
  21. package/{esm2020 → esm2022}/src/gui/low/DialogHandler.mjs +6 -6
  22. package/esm2022/src/gui/low/GuiCommand.mjs +68 -0
  23. package/esm2022/src/gui/low/GuiCommandQueue.mjs +35 -0
  24. package/esm2022/src/gui/low/GuiInteractive.mjs +177 -0
  25. package/esm2022/src/gui/low/Style.mjs +20 -0
  26. package/esm2022/src/management/RuntimeContextBase.mjs +42 -0
  27. package/esm2022/src/management/data/BlobType.mjs +281 -0
  28. package/{esm2020 → esm2022}/src/management/data/DcValues.mjs +214 -214
  29. package/esm2022/src/management/data/DcValuesBuilderBase.mjs +96 -0
  30. package/esm2022/src/management/data/FieldDef.mjs +331 -0
  31. package/esm2022/src/management/data/FieldsTable.mjs +54 -0
  32. package/esm2022/src/management/data/GuiDataViewBase.mjs +88 -0
  33. package/esm2022/src/management/data/GuiFieldBase.mjs +82 -0
  34. package/{esm2020 → esm2022}/src/management/data/IRecord.mjs +1 -1
  35. package/{esm2020 → esm2022}/src/management/data/IReferencedObject.mjs +1 -1
  36. package/esm2022/src/management/data/NUM_TYPE.mjs +1739 -0
  37. package/esm2022/src/management/data/ObjectReferenceBase.mjs +48 -0
  38. package/esm2022/src/management/data/ObjectReferencesCollection.mjs +27 -0
  39. package/esm2022/src/management/data/RecordUtils.mjs +361 -0
  40. package/esm2022/src/management/data/VectorType.mjs +612 -0
  41. package/esm2022/src/management/data/VectorTypeBase.mjs +88 -0
  42. package/{esm2020 → esm2022}/src/management/events/IActionManager.mjs +1 -1
  43. package/{esm2020 → esm2022}/src/management/events/IGuiEventsManager.mjs +1 -1
  44. package/esm2022/src/management/exp/ExpressionInterface.mjs +244 -0
  45. package/{esm2020 → esm2022}/src/management/exp/GuiExpressionEvaluator.mjs +305 -307
  46. package/esm2022/src/management/gui/ControlTable.mjs +118 -0
  47. package/esm2022/src/management/gui/DisplayConvertor.mjs +1649 -0
  48. package/esm2022/src/management/gui/FieldValidator.mjs +711 -0
  49. package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +24 -0
  50. package/{esm2020 → esm2022}/src/management/gui/GuiFormPropertyAdapter.mjs +10 -10
  51. package/esm2022/src/management/gui/HebrewDate.mjs +278 -0
  52. package/esm2022/src/management/gui/Helps.mjs +237 -0
  53. package/esm2022/src/management/gui/MgControlBase.mjs +1859 -0
  54. package/esm2022/src/management/gui/MgFormBase.mjs +741 -0
  55. package/esm2022/src/management/gui/PIC.mjs +1185 -0
  56. package/esm2022/src/management/gui/PropDefaults.mjs +230 -0
  57. package/{esm2020 → esm2022}/src/management/gui/PropInterface.mjs +246 -245
  58. package/esm2022/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2022/src/management/gui/Property.mjs +1362 -0
  60. package/esm2022/src/management/gui/ValidationDetails.mjs +248 -0
  61. package/esm2022/src/management/gui/ValidationDetailsBase.mjs +93 -0
  62. package/esm2022/src/management/gui/WrongFormatException.mjs +29 -0
  63. package/esm2022/src/management/tasks/GuiDataCollection.mjs +4 -0
  64. package/esm2022/src/management/tasks/GuiTaskBase.mjs +511 -0
  65. package/{esm2020 → esm2022}/src/management/tasks/IMGDataTable.mjs +1 -1
  66. package/{esm2020 → esm2022}/src/management/tasks/ITask.mjs +1 -1
  67. package/esm2022/src/management/tasks/MgTimer.mjs +21 -0
  68. package/esm2022/src/management/tasks/TaskDefinitionId.mjs +54 -0
  69. package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
  70. package/esm2022/src/util/MemoryUtil.mjs +35 -0
  71. package/{esm2020 → esm2022}/src/util/ObjectReference.mjs +36 -36
  72. package/esm2022/src/util/UsernamePasswordCredentials.mjs +52 -0
  73. package/{fesm2020 → fesm2022}/magic-xpa-gui.mjs +16074 -16074
  74. package/fesm2022/magic-xpa-gui.mjs.map +1 -0
  75. package/index.d.ts +70 -70
  76. package/package.json +6 -12
  77. package/src/Commands.d.ts +40 -39
  78. package/src/Events.d.ts +157 -155
  79. package/src/EventsProcessor.d.ts +13 -13
  80. package/src/FocusManager.d.ts +8 -8
  81. package/src/GuiConstants.d.ts +65 -65
  82. package/src/GuiEnums.d.ts +282 -282
  83. package/src/GuiEnvironment.d.ts +4 -4
  84. package/src/IFlowMonitorQueue.d.ts +3 -3
  85. package/src/Manager.d.ts +26 -26
  86. package/src/UIBridge.d.ts +16 -16
  87. package/src/env/IEnvironment.d.ts +31 -31
  88. package/src/gui/ControlBase.d.ts +4 -4
  89. package/src/gui/GuiMgControl.d.ts +38 -38
  90. package/src/gui/GuiMgForm.d.ts +3 -3
  91. package/src/gui/KeyboardItem.d.ts +18 -18
  92. package/src/gui/LastFocusedVal.d.ts +7 -7
  93. package/src/gui/MgValue.d.ts +15 -15
  94. package/src/gui/PropParentInterface.d.ts +13 -13
  95. package/src/gui/low/DialogHandler.d.ts +4 -4
  96. package/src/gui/low/GuiCommand.d.ts +37 -37
  97. package/src/gui/low/GuiCommandQueue.d.ts +13 -13
  98. package/src/gui/low/GuiInteractive.d.ts +55 -53
  99. package/src/gui/low/Style.d.ts +19 -19
  100. package/src/management/RuntimeContextBase.d.ts +23 -23
  101. package/src/management/data/BlobType.d.ts +29 -29
  102. package/src/management/data/DcValues.d.ts +33 -33
  103. package/src/management/data/DcValuesBuilderBase.d.ts +17 -17
  104. package/src/management/data/FieldDef.d.ts +53 -53
  105. package/src/management/data/FieldsTable.d.ts +16 -16
  106. package/src/management/data/GuiDataViewBase.d.ts +27 -27
  107. package/src/management/data/GuiFieldBase.d.ts +17 -17
  108. package/src/management/data/IRecord.d.ts +12 -12
  109. package/src/management/data/IReferencedObject.d.ts +5 -5
  110. package/src/management/data/NUM_TYPE.d.ts +103 -103
  111. package/src/management/data/ObjectReferenceBase.d.ts +16 -16
  112. package/src/management/data/ObjectReferencesCollection.d.ts +10 -10
  113. package/src/management/data/RecordUtils.d.ts +21 -21
  114. package/src/management/data/VectorType.d.ts +52 -52
  115. package/src/management/data/VectorTypeBase.d.ts +8 -8
  116. package/src/management/events/IActionManager.d.ts +7 -7
  117. package/src/management/events/IGuiEventsManager.d.ts +20 -20
  118. package/src/management/exp/ExpressionInterface.d.ts +242 -242
  119. package/src/management/exp/GuiExpressionEvaluator.d.ts +47 -47
  120. package/src/management/gui/ControlTable.d.ts +28 -28
  121. package/src/management/gui/DisplayConvertor.d.ts +103 -103
  122. package/src/management/gui/FieldValidator.d.ts +35 -35
  123. package/src/management/gui/GuiControlPropertyAdapter.d.ts +40 -40
  124. package/src/management/gui/GuiFormPropertyAdapter.d.ts +17 -17
  125. package/src/management/gui/HebrewDate.d.ts +46 -46
  126. package/src/management/gui/Helps.d.ts +51 -51
  127. package/src/management/gui/MgControlBase.d.ts +223 -223
  128. package/src/management/gui/MgFormBase.d.ts +160 -160
  129. package/src/management/gui/PIC.d.ts +108 -108
  130. package/src/management/gui/PropDefaults.d.ts +7 -7
  131. package/src/management/gui/PropInterface.d.ts +244 -243
  132. package/src/management/gui/PropTable.d.ts +33 -33
  133. package/src/management/gui/Property.d.ts +121 -121
  134. package/src/management/gui/ValidationDetails.d.ts +52 -52
  135. package/src/management/gui/ValidationDetailsBase.d.ts +14 -14
  136. package/src/management/gui/WrongFormatException.d.ts +9 -9
  137. package/src/management/tasks/GuiDataCollection.d.ts +4 -4
  138. package/src/management/tasks/GuiTaskBase.d.ts +150 -150
  139. package/src/management/tasks/IMGDataTable.d.ts +10 -10
  140. package/src/management/tasks/ITask.d.ts +6 -6
  141. package/src/management/tasks/MgTimer.d.ts +8 -8
  142. package/src/management/tasks/TaskDefinitionId.d.ts +16 -16
  143. package/src/management/tasks/TaskDefinitionIdTableSaxHandler.d.ts +7 -7
  144. package/src/util/MemoryUtil.d.ts +6 -6
  145. package/src/util/ObjectReference.d.ts +9 -9
  146. package/src/util/UsernamePasswordCredentials.d.ts +18 -18
  147. package/esm2020/src/Commands.mjs +0 -177
  148. package/esm2020/src/Events.mjs +0 -420
  149. package/esm2020/src/EventsProcessor.mjs +0 -67
  150. package/esm2020/src/FocusManager.mjs +0 -34
  151. package/esm2020/src/GuiConstants.mjs +0 -68
  152. package/esm2020/src/GuiEnvironment.mjs +0 -4
  153. package/esm2020/src/UIBridge.mjs +0 -32
  154. package/esm2020/src/gui/GuiMgControl.mjs +0 -125
  155. package/esm2020/src/gui/KeyboardItem.mjs +0 -135
  156. package/esm2020/src/gui/LastFocusedVal.mjs +0 -11
  157. package/esm2020/src/gui/MgValue.mjs +0 -16
  158. package/esm2020/src/gui/low/GuiCommand.mjs +0 -66
  159. package/esm2020/src/gui/low/GuiCommandQueue.mjs +0 -35
  160. package/esm2020/src/gui/low/GuiInteractive.mjs +0 -165
  161. package/esm2020/src/gui/low/Style.mjs +0 -20
  162. package/esm2020/src/management/RuntimeContextBase.mjs +0 -43
  163. package/esm2020/src/management/data/BlobType.mjs +0 -281
  164. package/esm2020/src/management/data/DcValuesBuilderBase.mjs +0 -96
  165. package/esm2020/src/management/data/FieldDef.mjs +0 -331
  166. package/esm2020/src/management/data/FieldsTable.mjs +0 -54
  167. package/esm2020/src/management/data/GuiDataViewBase.mjs +0 -90
  168. package/esm2020/src/management/data/GuiFieldBase.mjs +0 -82
  169. package/esm2020/src/management/data/NUM_TYPE.mjs +0 -1741
  170. package/esm2020/src/management/data/ObjectReferenceBase.mjs +0 -48
  171. package/esm2020/src/management/data/ObjectReferencesCollection.mjs +0 -29
  172. package/esm2020/src/management/data/RecordUtils.mjs +0 -361
  173. package/esm2020/src/management/data/VectorType.mjs +0 -612
  174. package/esm2020/src/management/data/VectorTypeBase.mjs +0 -88
  175. package/esm2020/src/management/exp/ExpressionInterface.mjs +0 -244
  176. package/esm2020/src/management/gui/ControlTable.mjs +0 -118
  177. package/esm2020/src/management/gui/DisplayConvertor.mjs +0 -1679
  178. package/esm2020/src/management/gui/FieldValidator.mjs +0 -711
  179. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +0 -22
  180. package/esm2020/src/management/gui/HebrewDate.mjs +0 -278
  181. package/esm2020/src/management/gui/Helps.mjs +0 -237
  182. package/esm2020/src/management/gui/MgControlBase.mjs +0 -1858
  183. package/esm2020/src/management/gui/MgFormBase.mjs +0 -738
  184. package/esm2020/src/management/gui/PIC.mjs +0 -1185
  185. package/esm2020/src/management/gui/PropDefaults.mjs +0 -230
  186. package/esm2020/src/management/gui/PropTable.mjs +0 -221
  187. package/esm2020/src/management/gui/Property.mjs +0 -1356
  188. package/esm2020/src/management/gui/ValidationDetails.mjs +0 -248
  189. package/esm2020/src/management/gui/ValidationDetailsBase.mjs +0 -93
  190. package/esm2020/src/management/gui/WrongFormatException.mjs +0 -29
  191. package/esm2020/src/management/tasks/GuiDataCollection.mjs +0 -4
  192. package/esm2020/src/management/tasks/GuiTaskBase.mjs +0 -510
  193. package/esm2020/src/management/tasks/MgTimer.mjs +0 -21
  194. package/esm2020/src/management/tasks/TaskDefinitionId.mjs +0 -54
  195. package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
  196. package/esm2020/src/util/MemoryUtil.mjs +0 -35
  197. package/esm2020/src/util/UsernamePasswordCredentials.mjs +0 -52
  198. package/fesm2015/magic-xpa-gui.mjs +0 -16364
  199. package/fesm2015/magic-xpa-gui.mjs.map +0 -1
  200. package/fesm2020/magic-xpa-gui.mjs.map +0 -1
@@ -0,0 +1,1649 @@
1
+ import { PIC } from './PIC';
2
+ import { DateTime, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
3
+ import { DateUtil, HTML_2_STR, MsgInterface, PICInterface, SEQ_2_HTML, StorageAttribute, StrUtil, UtilDateJpn, UtilStrByteMode } from '@magic-xpa/utils';
4
+ import { BlobType } from '../data/BlobType';
5
+ import { ValidationDetailsBase } from './ValidationDetailsBase';
6
+ import { NUM_TYPE } from '../data/NUM_TYPE';
7
+ import { HebrewDate } from './HebrewDate';
8
+ import { Events } from '../../Events';
9
+ import { GuiEnvironment } from '../../GuiEnvironment';
10
+ import { MemoryUtil } from '../../util/MemoryUtil';
11
+ export class DisplayConvertor {
12
+ _environment = null;
13
+ DATECHAR = 0;
14
+ static _instance = null;
15
+ static get Instance() {
16
+ if (DisplayConvertor._instance === null) {
17
+ DisplayConvertor._instance = new DisplayConvertor();
18
+ }
19
+ return DisplayConvertor._instance;
20
+ }
21
+ constructor() {
22
+ this._environment = GuiEnvironment.Environment;
23
+ }
24
+ getNewDateBreakParams() {
25
+ return new DateBreakParams();
26
+ }
27
+ getNewTimeBreakParams() {
28
+ return new TimeBreakParams();
29
+ }
30
+ mg2disp(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx, time_date_pic_Z_edtOrConvertCase, time_date_num_pic_Z_edt) {
31
+ if (arguments.length === 6)
32
+ return this.mg2disp_0(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx);
33
+ else if (arguments.length === 7)
34
+ return this.mg2disp_1(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx, time_date_pic_Z_edtOrConvertCase);
35
+ else
36
+ return this.mg2disp_2(mgValue, rangeStr, pic, useNative, compIdxOrAlwaysFill, time_date_pic_Z_edtOrCompIdx, time_date_pic_Z_edtOrConvertCase, time_date_num_pic_Z_edt);
37
+ }
38
+ mg2disp_0(mgValue, rangeStr, pic, useNative, compIdx, time_date_pic_Z_edt) {
39
+ return this.mg2disp(mgValue, rangeStr, pic, useNative, false, compIdx, time_date_pic_Z_edt);
40
+ }
41
+ mg2disp_1(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, time_date_pic_Z_edt) {
42
+ return this.mg2disp(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, false, time_date_pic_Z_edt);
43
+ }
44
+ mg2disp_2(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, convertCase, time_date_num_pic_Z_edt) {
45
+ let str = "";
46
+ let tmpRange = (rangeStr === null) ? "" : rangeStr;
47
+ switch (pic.getAttr()) {
48
+ case StorageAttribute.ALPHA:
49
+ case StorageAttribute.UNICODE:
50
+ str = this.fromAlpha(mgValue, pic, tmpRange, alwaysFill, convertCase);
51
+ break;
52
+ case StorageAttribute.NUMERIC: {
53
+ let newPic = pic.getUnformattedNumericPic();
54
+ let dec = GuiEnvironment.Environment.GetDecimal();
55
+ let thou = GuiEnvironment.Environment.GetThousands();
56
+ GuiEnvironment.Environment.setDecimalSeparator('.');
57
+ GuiEnvironment.Environment.setThousandsSeparator(',');
58
+ str = this.fromNum(mgValue, newPic);
59
+ GuiEnvironment.Environment.setDecimalSeparator(dec);
60
+ GuiEnvironment.Environment.setThousandsSeparator(thou);
61
+ if (newPic.getMaskChars() === 0 || !time_date_num_pic_Z_edt)
62
+ str = StrUtil.ltrim(str);
63
+ if (useNative) {
64
+ if (str == "")
65
+ return null;
66
+ let dbl = Number(str);
67
+ return dbl;
68
+ }
69
+ else
70
+ return str;
71
+ }
72
+ case StorageAttribute.DATE: {
73
+ if (useNative) {
74
+ let dt;
75
+ dt = this.fromMgDateToNativeDate(mgValue, pic, compIdx);
76
+ return dt;
77
+ }
78
+ else {
79
+ str = this.fromDate(mgValue, pic, compIdx, time_date_num_pic_Z_edt);
80
+ break;
81
+ }
82
+ }
83
+ case StorageAttribute.TIME: {
84
+ if (useNative) {
85
+ let dt;
86
+ dt = this.fromMgTimeToNativeTime(mgValue, pic);
87
+ return dt;
88
+ }
89
+ else {
90
+ str = this.fromTime(mgValue, pic, time_date_num_pic_Z_edt);
91
+ break;
92
+ }
93
+ }
94
+ case StorageAttribute.BOOLEAN: {
95
+ let logVal;
96
+ logVal = this.fromMgLogicalToNativeLogical(mgValue);
97
+ return logVal;
98
+ }
99
+ case StorageAttribute.BLOB:
100
+ str = BlobType.getString(mgValue);
101
+ break;
102
+ case StorageAttribute.BLOB_VECTOR:
103
+ str = mgValue;
104
+ break;
105
+ }
106
+ return str;
107
+ }
108
+ disp2mg(dispValue, pic, compIdx, blobContentType) {
109
+ let str = "";
110
+ switch (pic.getAttr()) {
111
+ case StorageAttribute.ALPHA:
112
+ case StorageAttribute.UNICODE:
113
+ str = this.toAlpha(dispValue, pic);
114
+ break;
115
+ case StorageAttribute.NUMERIC:
116
+ {
117
+ dispValue = String(dispValue);
118
+ let len = dispValue.length;
119
+ while (len > 0) {
120
+ if (!pic.picIsMask(len - 1) && dispValue[len - 1] !== (' '))
121
+ break;
122
+ len--;
123
+ }
124
+ if (dispValue.length > len)
125
+ dispValue = NString.Remove(dispValue, len, (dispValue.length - len));
126
+ if (pic.isNegative() && dispValue.trim().startsWith("-"))
127
+ dispValue = StrUtil.ltrim(dispValue);
128
+ let dec = GuiEnvironment.Environment.GetDecimal();
129
+ let thou = GuiEnvironment.Environment.GetThousands();
130
+ GuiEnvironment.Environment.setDecimalSeparator('.');
131
+ GuiEnvironment.Environment.setThousandsSeparator(',');
132
+ let newPic = pic.getUnformattedNumericPic();
133
+ str = this.toNum(dispValue, newPic, compIdx);
134
+ GuiEnvironment.Environment.setDecimalSeparator(dec);
135
+ GuiEnvironment.Environment.setThousandsSeparator(thou);
136
+ }
137
+ break;
138
+ case StorageAttribute.DATE:
139
+ {
140
+ let dt;
141
+ if (typeof dispValue === 'string')
142
+ dt = new Date(dispValue);
143
+ else
144
+ dt = dispValue;
145
+ str = this.fromNativeDateToMgDate(dt, pic);
146
+ }
147
+ break;
148
+ case StorageAttribute.TIME:
149
+ {
150
+ let dt;
151
+ if (typeof dispValue === 'string') {
152
+ dt = new Date();
153
+ if (dispValue !== null) {
154
+ dt.setHours(+String(dispValue).substr(0, 2));
155
+ dt.setMinutes(+String(dispValue).substr(0, 2));
156
+ if (String(dispValue).length > 5)
157
+ dt.setSeconds(+String(dispValue).substr(0, 2));
158
+ }
159
+ }
160
+ else
161
+ dt = dispValue;
162
+ str = this.fromNativeTimeToMgTime(dt);
163
+ }
164
+ break;
165
+ case StorageAttribute.BOOLEAN:
166
+ str = this.fromNativeLogicalToMgLogical(dispValue);
167
+ break;
168
+ case StorageAttribute.BLOB:
169
+ str = BlobType.createFromString(dispValue, blobContentType);
170
+ break;
171
+ }
172
+ return str;
173
+ }
174
+ fromNum(mgValue, pic) {
175
+ let mgNum = new NUM_TYPE(mgValue);
176
+ return mgNum.toDisplayValue(pic);
177
+ }
178
+ fromAlpha(dataStr, pic, rangeStr, alwaysFill, convertCase) {
179
+ let len = pic.getMaskSize();
180
+ let min_len = len;
181
+ let maskStr = pic.getMask();
182
+ let resStr;
183
+ if (pic.getMaskChars() > 0) {
184
+ resStr = this.win_data_cpy(NString.ToCharArray(maskStr), len, NString.ToCharArray(dataStr), pic.isAttrAlpha(), convertCase);
185
+ }
186
+ else {
187
+ if (UtilStrByteMode.isLocaleDefLangDBCS() && pic.isAttrAlpha()) {
188
+ let intDataStrLenB = UtilStrByteMode.lenB(dataStr);
189
+ if (min_len > intDataStrLenB) {
190
+ min_len = intDataStrLenB;
191
+ }
192
+ resStr = UtilStrByteMode.leftB(dataStr, min_len);
193
+ }
194
+ else if (dataStr !== null) {
195
+ if (min_len > dataStr.length) {
196
+ min_len = dataStr.length;
197
+ }
198
+ if (convertCase) {
199
+ resStr = this.win_data_cpy(NString.ToCharArray(maskStr), len, NString.ToCharArray(dataStr), pic.isAttrAlpha(), convertCase);
200
+ }
201
+ else {
202
+ resStr = dataStr.substr(0, min_len);
203
+ }
204
+ }
205
+ }
206
+ if (alwaysFill || (rangeStr !== null && rangeStr.length > 0 && resStr.length < len)) {
207
+ let vd = new ValidationDetailsBase(rangeStr);
208
+ let continuousRangeValues = vd.getContinuousRangeValues();
209
+ let discreteRangeValues = vd.getDiscreteRangeValues();
210
+ if (continuousRangeValues !== null || discreteRangeValues !== null) {
211
+ resStr = this.fillAlphaByRange(continuousRangeValues, discreteRangeValues, resStr);
212
+ }
213
+ }
214
+ return resStr;
215
+ }
216
+ caseConvertedChar(data, mask) {
217
+ let ch;
218
+ if (mask.charCodeAt(0) === PICInterface.PIC_U) {
219
+ ch = data.toUpperCase();
220
+ }
221
+ else {
222
+ if (mask.charCodeAt(0) === PICInterface.PIC_L) {
223
+ ch = data.toLowerCase();
224
+ }
225
+ else {
226
+ ch = data;
227
+ }
228
+ }
229
+ return ch;
230
+ }
231
+ win_data_cpy(maskStr, maskLen, dataStr, isAttrAlpha, convertCase) {
232
+ if (arguments.length === 4)
233
+ return this.win_data_cpy_0(maskStr, maskLen, dataStr, isAttrAlpha);
234
+ return this.win_data_cpy_1(maskStr, maskLen, dataStr, isAttrAlpha, convertCase);
235
+ }
236
+ win_data_cpy_0(maskStr, maskLen, dataStr, isAttrAlpha) {
237
+ return this.win_data_cpy(maskStr, maskLen, dataStr, isAttrAlpha, false);
238
+ }
239
+ win_data_cpy_1(maskStr, maskLen, dataStr, isAttrAlpha, convertCase) {
240
+ let maskIdx = 0;
241
+ let dataIdx = 0;
242
+ let resStr = new Array(maskLen);
243
+ if (isAttrAlpha && UtilStrByteMode.isLocaleDefLangDBCS()) {
244
+ let num2 = 0;
245
+ while (maskIdx < maskLen && num2 < maskLen) {
246
+ if (maskStr[maskIdx].charCodeAt(0) <= PICInterface.PIC_MAX_OP) {
247
+ if (dataIdx < dataStr.length) {
248
+ let strVal = NString.FromChars(dataStr, dataIdx, 1);
249
+ if (UtilStrByteMode.lenB(strVal) === 2) {
250
+ if (maskIdx + 1 < maskLen) {
251
+ if (maskStr[maskIdx + 1].charCodeAt(0) <= PICInterface.PIC_MAX_OP) {
252
+ if (convertCase) {
253
+ resStr[num2++] = this.caseConvertedChar(dataStr[dataIdx++], maskStr[maskIdx + 1]);
254
+ }
255
+ else {
256
+ resStr[num2++] = dataStr[dataIdx++];
257
+ }
258
+ maskIdx = maskIdx + 1;
259
+ }
260
+ else {
261
+ resStr[num2++] = ' ';
262
+ }
263
+ }
264
+ else {
265
+ resStr[num2++] = ' ';
266
+ }
267
+ }
268
+ else {
269
+ if (convertCase) {
270
+ resStr[num2++] = this.caseConvertedChar(dataStr[dataIdx++], maskStr[maskIdx + 1]);
271
+ }
272
+ else {
273
+ resStr[num2++] = dataStr[dataIdx++];
274
+ }
275
+ }
276
+ }
277
+ else {
278
+ resStr[num2++] = ' ';
279
+ }
280
+ }
281
+ else {
282
+ resStr[num2++] = maskStr[maskIdx];
283
+ }
284
+ maskIdx = maskIdx + 1;
285
+ }
286
+ return NString.FromChars(resStr).substr(0, num2);
287
+ }
288
+ while (maskIdx < maskLen) {
289
+ if (maskStr[maskIdx].charCodeAt(0) <= PICInterface.PIC_MAX_OP) {
290
+ if (dataIdx < dataStr.length) {
291
+ resStr[maskIdx] = dataStr[dataIdx];
292
+ if (convertCase) {
293
+ resStr[maskIdx] = this.caseConvertedChar(dataStr[dataIdx], maskStr[maskIdx]);
294
+ }
295
+ else {
296
+ resStr[maskIdx] = dataStr[dataIdx];
297
+ }
298
+ dataIdx = dataIdx + 1;
299
+ }
300
+ else {
301
+ resStr[maskIdx] = ' ';
302
+ }
303
+ }
304
+ else {
305
+ resStr[maskIdx] = maskStr[maskIdx];
306
+ }
307
+ maskIdx = maskIdx + 1;
308
+ }
309
+ return NString.FromChars(resStr);
310
+ }
311
+ fromDate(dataStr, pic, compIdx, time_date_pic_Z_edt) {
312
+ let mask = pic.getMask();
313
+ let maskSize = pic.getMaskSize();
314
+ let date = new NUM_TYPE(dataStr).NUM_2_ULONG();
315
+ return this.to_a_pic_datemode(mask, maskSize, date, pic, time_date_pic_Z_edt, false, compIdx);
316
+ }
317
+ fromTime(dataStr, pic, time_date_pic_Z_edt) {
318
+ let mask = pic.getMask();
319
+ let maskSize = pic.getMaskSize();
320
+ let time = new NUM_TYPE(dataStr).NUM_2_ULONG();
321
+ return this.time_2_a_pic(mask, maskSize, time, pic, time_date_pic_Z_edt, false);
322
+ }
323
+ fromMgDateToNativeDate(dataStr, pic, compIdx) {
324
+ let date = new NUM_TYPE(dataStr).NUM_2_ULONG();
325
+ let breakParams;
326
+ breakParams = new DateBreakParams();
327
+ this.date_break_datemode(breakParams, date, false, compIdx);
328
+ if (breakParams.month > 0)
329
+ breakParams.month = breakParams.month - 1;
330
+ if (breakParams.year == 0 && breakParams.month == 0 && breakParams.day == 0)
331
+ return null;
332
+ return new Date(breakParams.year, breakParams.month, breakParams.day);
333
+ }
334
+ fromNativeDateToMgDateNumber(nativeDate, pic) {
335
+ let numVal;
336
+ let dateParams;
337
+ let millenium = 0;
338
+ let year = nativeDate.getFullYear();
339
+ let day = nativeDate.getDate();
340
+ let month = nativeDate.getMonth() + 1;
341
+ if (pic.isHebrew()) {
342
+ if (year > 0) {
343
+ if (millenium === 0)
344
+ millenium = 5;
345
+ year += millenium * 1000;
346
+ }
347
+ numVal = (HebrewDate.dateheb_2_d(year, month, day));
348
+ }
349
+ else {
350
+ if (year === 0) {
351
+ dateParams = this.date_sys();
352
+ year = dateParams.year;
353
+ }
354
+ numVal = this.date_4_calender(year, month, day, 0, false);
355
+ }
356
+ return numVal;
357
+ }
358
+ fromNativeDateToMgDate(nativeDate, pic) {
359
+ let mgNum = new NUM_TYPE();
360
+ let numVal = nativeDate == null ? 0 : this.fromNativeDateToMgDateNumber(nativeDate, pic);
361
+ mgNum.NUM_4_LONG(numVal);
362
+ return mgNum.toXMLrecord();
363
+ }
364
+ to_a_pic_datemode(outStr, out_len, date, pic, date_pic_Z_edt, ignore_dt_fmt, compIdx) {
365
+ let len;
366
+ let day = 0;
367
+ let doy = 0;
368
+ let dow = 0;
369
+ let year = 0;
370
+ let month = 0;
371
+ let hday = 0;
372
+ let hyear = 0;
373
+ let hmonth = 0;
374
+ let leap = false;
375
+ let i;
376
+ let p;
377
+ let outVal = NString.ToCharArray(outStr);
378
+ let breakParams;
379
+ let dateNameParams;
380
+ let outIdx = 0;
381
+ let strOut = null;
382
+ if (pic.getMaskSize() > out_len) {
383
+ for (; i < out_len; i++)
384
+ outVal[i] = '*';
385
+ return NString.FromChars(outVal);
386
+ }
387
+ out_len = len = pic.getMaskSize();
388
+ if (pic.zeroFill() && date === 0 && !date_pic_Z_edt) {
389
+ for (; i < out_len; i++)
390
+ outVal[i] = pic.getZeroPad();
391
+ return NString.FromChars(outVal);
392
+ }
393
+ if (pic.isHebrew() && (date === 0 || date === 1000000000)) {
394
+ for (; i < out_len; i++)
395
+ outVal[i] = ' ';
396
+ return NString.FromChars(outVal);
397
+ }
398
+ breakParams = new DateBreakParams(year, month, day, doy, dow);
399
+ this.date_break_datemode(breakParams, date, ignore_dt_fmt, compIdx);
400
+ if (pic.isHebrew()) {
401
+ let refhday = new RefParam(hday);
402
+ let refhmonth = new RefParam(hmonth);
403
+ let refhyear = new RefParam(hyear);
404
+ leap = HebrewDate.dateheb_4_d(date, refhday, refhmonth, refhyear);
405
+ hday = refhday.value;
406
+ hmonth = refhmonth.value;
407
+ hyear = refhyear.value;
408
+ }
409
+ year = breakParams.year;
410
+ month = breakParams.month;
411
+ day = breakParams.day;
412
+ doy = breakParams.doy;
413
+ dow = breakParams.dow;
414
+ breakParams = null;
415
+ while (len > 0) {
416
+ let refOutLen = new RefParam(out_len);
417
+ switch (outVal[outIdx].charCodeAt(0)) {
418
+ case PICInterface.PIC_YY:
419
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
420
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
421
+ else
422
+ this.int_2_a(outVal, outIdx, 2, year, '0');
423
+ outIdx += 2;
424
+ len -= 2;
425
+ break;
426
+ case PICInterface.PIC_HYYYYY:
427
+ i = HebrewDate.dateheb_2_str(outVal, outIdx, len, refOutLen, 5, hyear, pic.isTrimed(), true);
428
+ out_len = refOutLen.value;
429
+ outIdx += i;
430
+ len -= i;
431
+ break;
432
+ case PICInterface.PIC_HL:
433
+ i = HebrewDate.dateheb_i_2_h((hyear / 1000) % 10, outVal, outIdx, false, false);
434
+ outIdx++;
435
+ len--;
436
+ break;
437
+ case PICInterface.PIC_HDD:
438
+ i = HebrewDate.dateheb_2_str(outVal, outIdx, len, refOutLen, 2, hday, pic.isTrimed(), false);
439
+ out_len = refOutLen.value;
440
+ outIdx += i;
441
+ len -= i;
442
+ break;
443
+ case PICInterface.PIC_YYYY:
444
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
445
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 4);
446
+ else
447
+ this.int_2_a(outVal, outIdx, 4, year, '0');
448
+ outIdx += 4;
449
+ len -= 4;
450
+ break;
451
+ case PICInterface.PIC_MMD:
452
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
453
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
454
+ else
455
+ this.int_2_a(outVal, outIdx, 2, month, '0');
456
+ outIdx += 2;
457
+ len -= 2;
458
+ break;
459
+ case PICInterface.PIC_MMM:
460
+ if (pic.isHebrew()) {
461
+ if (leap && hmonth === 6)
462
+ hmonth = 14;
463
+ let monthNames = HebrewDate.GetLocalMonths();
464
+ p = NString.ToCharArray(monthNames[hmonth]);
465
+ }
466
+ else {
467
+ let monthStr = Events.GetMessageString(MsgInterface.MONTHS_PTR);
468
+ let monthNames = DateUtil.getLocalMonths(monthStr);
469
+ p = NString.ToCharArray(monthNames[month]);
470
+ }
471
+ dateNameParams = new DateNameParams(outVal, outIdx, len);
472
+ out_len -= this.date_i_2_nm(dateNameParams, p, pic.isTrimed());
473
+ outIdx = dateNameParams.outIdx;
474
+ len = dateNameParams.len;
475
+ dateNameParams = null;
476
+ break;
477
+ case PICInterface.PIC_DD:
478
+ let isZero = pic.zeroFill();
479
+ if (isZero && date === 0 && date_pic_Z_edt)
480
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
481
+ else
482
+ this.int_2_a(outVal, outIdx, 2, day, '0');
483
+ outIdx += 2;
484
+ len -= 2;
485
+ break;
486
+ case PICInterface.PIC_DDD:
487
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
488
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 3);
489
+ else
490
+ this.int_2_a(outVal, outIdx, 3, doy, '0');
491
+ len -= 3;
492
+ outIdx += 3;
493
+ break;
494
+ case PICInterface.PIC_DDDD:
495
+ i = this.date_2_DDDD(day, outVal, outIdx, len, pic.isTrimed());
496
+ outIdx += i;
497
+ out_len += i - 4;
498
+ len -= 4;
499
+ break;
500
+ case PICInterface.PIC_W:
501
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
502
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 1);
503
+ else
504
+ this.int_2_a(outVal, outIdx, 1, dow, '0');
505
+ len--;
506
+ outIdx++;
507
+ break;
508
+ case PICInterface.PIC_WWW:
509
+ if (pic.isHebrew()) {
510
+ let dowsNames = HebrewDate.GetLocalDows();
511
+ p = NString.ToCharArray(dowsNames[dow]);
512
+ }
513
+ else {
514
+ let dayStr = Events.GetMessageString(MsgInterface.DAYS_PTR);
515
+ let dayNames = DateUtil.getLocalDays(dayStr);
516
+ p = NString.ToCharArray(dayNames[dow]);
517
+ }
518
+ dateNameParams = new DateNameParams(outVal, outIdx, len);
519
+ out_len -= this.date_i_2_nm(dateNameParams, p, pic.isTrimed());
520
+ outIdx = dateNameParams.outIdx;
521
+ len = dateNameParams.len;
522
+ dateNameParams = null;
523
+ break;
524
+ case PICInterface.PIC_BB:
525
+ p = NString.ToCharArray(UtilDateJpn.getStrDow(dow));
526
+ strOut = null;
527
+ dateNameParams = new DateNameParams(outVal, outIdx, len);
528
+ strOut = this.date_i_2_nm_bytemode(strOut, dateNameParams, NString.FromChars(p), out_len);
529
+ outVal = new Array(strOut.length);
530
+ NString.CopyTo(strOut, 0, outVal, 0, strOut.length);
531
+ outIdx = dateNameParams.outIdx;
532
+ len = dateNameParams.len;
533
+ strOut = null;
534
+ dateNameParams = null;
535
+ break;
536
+ case PICInterface.PIC_JY1:
537
+ case PICInterface.PIC_JY2:
538
+ case PICInterface.PIC_JY4:
539
+ let strNum = null;
540
+ if (outVal[outIdx].charCodeAt(0) === PICInterface.PIC_JY1)
541
+ strNum = UtilDateJpn.getInstance().date_jpn_yr_2_a(year, doy, false);
542
+ else
543
+ strNum = UtilDateJpn.getInstance().date_jpn_yr_2_a(year, doy, true);
544
+ strOut = null;
545
+ dateNameParams = new DateNameParams(outVal, outIdx, len);
546
+ strOut = this.date_i_2_nm_bytemode(strOut, dateNameParams, strNum, out_len);
547
+ outVal = null;
548
+ outVal = new Array(strOut.length);
549
+ NString.CopyTo(strOut, 0, outVal, 0, strOut.length);
550
+ outIdx = dateNameParams.outIdx;
551
+ len = dateNameParams.len;
552
+ strOut = null;
553
+ dateNameParams = null;
554
+ break;
555
+ case PICInterface.PIC_YJ:
556
+ if (pic.zeroFill() && date === 0 && date_pic_Z_edt)
557
+ MemoryUtil.char_memset(outVal, outIdx, pic.getZeroPad(), 2);
558
+ else
559
+ this.int_2_a(outVal, outIdx, 2, UtilDateJpn.getInstance().date_jpn_year_ofs(year, doy), '0');
560
+ outIdx += 2;
561
+ len -= 2;
562
+ break;
563
+ default:
564
+ outIdx++;
565
+ len--;
566
+ break;
567
+ }
568
+ }
569
+ if (out_len < outVal.length)
570
+ MemoryUtil.char_memset(outVal, out_len, ' ', outVal.length - out_len);
571
+ return NString.FromChars(outVal);
572
+ }
573
+ date_break_datemode(breakParams, date, ignore_dt_fmt, compIdx) {
574
+ let year = breakParams.year;
575
+ let month = breakParams.month;
576
+ let day = breakParams.day;
577
+ let doy = breakParams.doy;
578
+ let dow = breakParams.dow;
579
+ if (date <= 0) {
580
+ breakParams.day = 0;
581
+ breakParams.doy = 0;
582
+ breakParams.dow = 0;
583
+ breakParams.year = 0;
584
+ breakParams.month = 0;
585
+ }
586
+ else {
587
+ dow = date % 7 + 1;
588
+ date = date - 1;
589
+ let cent4 = Math.floor(date / PICInterface.DAYSINFOURCENT);
590
+ date = date - cent4 * PICInterface.DAYSINFOURCENT;
591
+ let cent = Math.floor(date / PICInterface.DAYSINCENTURY);
592
+ if (cent > 3) {
593
+ cent = 3;
594
+ }
595
+ date = date - cent * PICInterface.DAYSINCENTURY;
596
+ let year4 = Math.floor(date / PICInterface.DAYSINFOURYEAR);
597
+ date = date - year4 * PICInterface.DAYSINFOURYEAR;
598
+ year = Math.floor(date / PICInterface.DAYSINYEAR);
599
+ if (year > 3) {
600
+ year = 3;
601
+ }
602
+ date = date - year * PICInterface.DAYSINYEAR;
603
+ year = cent4 * 400 + cent * 100 + year4 * 4 + year + 1;
604
+ let leapyear = 0;
605
+ if (year % 4 === 0) {
606
+ if (year % 100 !== 0 || year % 400 === 0) {
607
+ leapyear = 1;
608
+ }
609
+ }
610
+ if (!ignore_dt_fmt && this._environment.GetDateMode(compIdx) === 'B') {
611
+ year = year + PICInterface.DATE_BUDDHIST_GAP;
612
+ }
613
+ month = (Math.floor(date / PICInterface.DAYSINMONTH) + 1);
614
+ day = PICInterface.date_day_tab[month];
615
+ if (leapyear > 0) {
616
+ if (month > 1) {
617
+ day = day + 1;
618
+ }
619
+ }
620
+ if (date >= day) {
621
+ month = month + 1;
622
+ }
623
+ else {
624
+ day = PICInterface.date_day_tab[month - 1];
625
+ if (leapyear > 0) {
626
+ if (month > 2) {
627
+ day = day + 1;
628
+ }
629
+ }
630
+ }
631
+ day = date - day + 1;
632
+ doy = date + 1;
633
+ breakParams.year = year;
634
+ breakParams.month = month;
635
+ breakParams.day = day;
636
+ breakParams.doy = doy;
637
+ breakParams.dow = dow;
638
+ }
639
+ }
640
+ int_2_a(str, strPos, len, n, lead) {
641
+ let neg = n < 0;
642
+ if (len <= 0)
643
+ return;
644
+ n = Math.abs(n);
645
+ let pos = len;
646
+ do {
647
+ str[strPos + (pos = pos - 1)] = String.fromCharCode(48 + n % 10);
648
+ n = Math.floor(n / 10);
649
+ } while (pos > 0 && n > 0);
650
+ if (neg && pos > 0) {
651
+ str[strPos + (pos = pos - 1)] = '-';
652
+ }
653
+ return this.lib_a_fill(str, strPos, len, pos, lead.charCodeAt(0));
654
+ }
655
+ lib_a_fill(str, strPos, len, pos, lead) {
656
+ if (lead === 0) {
657
+ len = len - pos;
658
+ if (len > 0 && pos > 0) {
659
+ MemoryUtil.char_memcpy(str, strPos, str, pos, len);
660
+ MemoryUtil.char_memset(str, strPos + len, ' ', pos);
661
+ }
662
+ }
663
+ else {
664
+ if (pos > 0) {
665
+ MemoryUtil.char_memset(str, strPos, String.fromCharCode(lead), pos);
666
+ }
667
+ }
668
+ return len;
669
+ }
670
+ date_i_2_nm(dateNameParams, nm, trim) {
671
+ let n = this.date_msk_cnt(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.len);
672
+ let l;
673
+ if (trim) {
674
+ l = MemoryUtil.mem_trim(nm, 0, n);
675
+ }
676
+ else {
677
+ l = n;
678
+ }
679
+ l = Math.min(l, dateNameParams.len);
680
+ MemoryUtil.char_memcpy(dateNameParams.outVal, dateNameParams.outIdx, nm, 0, l);
681
+ dateNameParams.outIdx = dateNameParams.outIdx + l;
682
+ dateNameParams.len = dateNameParams.len - n;
683
+ n = n - l;
684
+ if (n > 0) {
685
+ MemoryUtil.char_memcpy(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.outVal, dateNameParams.outIdx + n, dateNameParams.len);
686
+ }
687
+ return n;
688
+ }
689
+ date_i_2_nm_bytemode(strOut, dateNameParams, strNm, intOutLen) {
690
+ let intMskCnt = this.date_msk_cnt(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.len);
691
+ let strWork = NString.FromChars(dateNameParams.outVal);
692
+ strWork = strWork.substr(0, dateNameParams.outIdx);
693
+ let intOfs = UtilStrByteMode.lenB(strWork);
694
+ strNm = UtilStrByteMode.leftB(strNm, intMskCnt);
695
+ strOut = UtilStrByteMode.repB(NString.FromChars(dateNameParams.outVal), strNm, intOfs + 1, intMskCnt);
696
+ dateNameParams.outIdx = dateNameParams.outIdx + strNm.length;
697
+ dateNameParams.len = dateNameParams.len - intMskCnt;
698
+ intOutLen = intOutLen - intMskCnt;
699
+ return strOut;
700
+ }
701
+ date_msk_cnt(msk, mskPos, len) {
702
+ let c = msk[mskPos++];
703
+ let i = 1;
704
+ while (i < len) {
705
+ if (msk[mskPos] !== c) {
706
+ break;
707
+ }
708
+ mskPos = mskPos + 1;
709
+ i = i + 1;
710
+ }
711
+ return i;
712
+ }
713
+ date_2_DDDD(day, outVal, outIdx, len, trim) {
714
+ let ret = 4;
715
+ let ext;
716
+ if (day > 9) {
717
+ this.int_2_a(outVal, outIdx, 2, day, 0..toString());
718
+ outIdx += 2;
719
+ }
720
+ else {
721
+ if (trim) {
722
+ MemoryUtil.char_memcpy(outVal, outIdx, outVal, outIdx + 1, len - 1);
723
+ ret--;
724
+ }
725
+ else {
726
+ outVal[outIdx++] = ' ';
727
+ }
728
+ this.int_2_a(outVal, outIdx, 1, day, 0..toString());
729
+ outIdx++;
730
+ }
731
+ switch (day) {
732
+ case 1:
733
+ case 21:
734
+ case 31:
735
+ ext = NString.ToCharArray("st");
736
+ break;
737
+ case 2:
738
+ case 22:
739
+ ext = NString.ToCharArray("nd");
740
+ break;
741
+ case 3:
742
+ case 23:
743
+ ext = NString.ToCharArray("rd");
744
+ break;
745
+ default:
746
+ ext = NString.ToCharArray("th");
747
+ break;
748
+ }
749
+ outVal[outIdx++] = ext[0];
750
+ outVal[outIdx] = ext[1];
751
+ return (ret);
752
+ }
753
+ fromMgTimeToNativeTime(dataStr, pic) {
754
+ let time = new NUM_TYPE(dataStr).NUM_2_ULONG();
755
+ let breakParams = new TimeBreakParams();
756
+ DisplayConvertor.time_break(breakParams, time);
757
+ let nativeDt = new Date(0);
758
+ let maskStr = pic.getMask();
759
+ let outVal = NString.ToCharArray(maskStr);
760
+ let len = pic.getMaskSize();
761
+ let outIdx = 0;
762
+ while (len > 0) {
763
+ switch (outVal[outIdx].charCodeAt(0)) {
764
+ case (PICInterface.PIC_HH):
765
+ nativeDt.setHours(breakParams.hour);
766
+ outIdx += 2;
767
+ len -= 2;
768
+ break;
769
+ case (PICInterface.PIC_MMT):
770
+ nativeDt.setMinutes(breakParams.minute);
771
+ outIdx += 2;
772
+ len -= 2;
773
+ break;
774
+ case (PICInterface.PIC_SS):
775
+ nativeDt.setSeconds(breakParams.second);
776
+ outIdx += 2;
777
+ len -= 2;
778
+ break;
779
+ default:
780
+ outIdx++;
781
+ len--;
782
+ }
783
+ }
784
+ return nativeDt;
785
+ }
786
+ time_2_a_pic(AsciiStr, AsciiL, time, pic, time_pic_Z_edt, milliSeconds) {
787
+ let hour = 0;
788
+ let minute = 0;
789
+ let second = 0;
790
+ let millisec = 0;
791
+ let Ascii = NString.ToCharArray(AsciiStr);
792
+ let breakParams = new TimeBreakParams(hour, minute, second);
793
+ let timeSec;
794
+ if (milliSeconds) {
795
+ timeSec = Math.floor(time / 1000);
796
+ millisec = time - timeSec * 1000;
797
+ }
798
+ else {
799
+ timeSec = time;
800
+ }
801
+ DisplayConvertor.time_break(breakParams, timeSec);
802
+ hour = breakParams.hour;
803
+ minute = breakParams.minute;
804
+ second = breakParams.second;
805
+ let result;
806
+ if (pic.getMaskSize() > AsciiL) {
807
+ MemoryUtil.char_memset(Ascii, 0, '*', AsciiL);
808
+ result = NString.FromChars(Ascii);
809
+ }
810
+ else {
811
+ if (pic.zeroFill()) {
812
+ if (timeSec === 0 && (!milliSeconds || millisec === 0)) {
813
+ if (time_pic_Z_edt) {
814
+ for (let intx = 0; intx < pic.getMaskSize(); intx = intx + 1) {
815
+ if (Ascii[intx] <= '\u001f') {
816
+ Ascii[intx] = pic.getZeroPad();
817
+ }
818
+ }
819
+ result = NString.FromChars(Ascii);
820
+ return result;
821
+ }
822
+ MemoryUtil.char_memset(Ascii, 0, pic.getZeroPad(), pic.getMaskSize());
823
+ result = NString.FromChars(Ascii);
824
+ return result;
825
+ }
826
+ }
827
+ let I = 0;
828
+ let am = 0;
829
+ let len = pic.getMaskSize();
830
+ let HourI = -1;
831
+ while (I < len) {
832
+ switch (Ascii[I].charCodeAt(0)) {
833
+ case (PICInterface.PIC_HH):
834
+ HourI = I;
835
+ I += 2;
836
+ break;
837
+ case (PICInterface.PIC_MMT):
838
+ this.int_2_a(Ascii, I, 2, minute, '0');
839
+ I += 2;
840
+ break;
841
+ case (PICInterface.PIC_SS):
842
+ this.int_2_a(Ascii, I, 2, second, '0');
843
+ I += 2;
844
+ break;
845
+ case (PICInterface.PIC_MS):
846
+ this.int_2_a(Ascii, I, 3, millisec, '0');
847
+ I += 3;
848
+ break;
849
+ case (PICInterface.PIC_PM):
850
+ am = 1;
851
+ let tmpHour = hour % 24;
852
+ if (tmpHour < 12 || tmpHour === 0)
853
+ MemoryUtil.char_memcpy(Ascii, I, NString.ToCharArray("am"), 0, 2);
854
+ else
855
+ MemoryUtil.char_memcpy(Ascii, I, NString.ToCharArray("pm"), 0, 2);
856
+ I += 2;
857
+ break;
858
+ default:
859
+ I++;
860
+ break;
861
+ }
862
+ }
863
+ if (HourI >= 0) {
864
+ if (am > 0) {
865
+ hour = hour % 24;
866
+ if (hour === 0) {
867
+ hour = 12;
868
+ }
869
+ else {
870
+ hour = hour % 12;
871
+ if (hour === 0) {
872
+ hour = 12;
873
+ }
874
+ }
875
+ }
876
+ this.int_2_a(Ascii, HourI, 2, hour, (am !== 0 && hour < 10) ? ' ' : '0');
877
+ }
878
+ result = NString.FromChars(Ascii);
879
+ }
880
+ return result;
881
+ }
882
+ static time_break(breakParams, time) {
883
+ if (time <= 0) {
884
+ breakParams.second = 0;
885
+ breakParams.minute = 0;
886
+ breakParams.hour = 0;
887
+ }
888
+ else {
889
+ breakParams.hour = Math.floor(time / 3600);
890
+ time = time - breakParams.hour * 3600;
891
+ breakParams.minute = Math.floor(time / 60);
892
+ breakParams.second = time - breakParams.minute * 60;
893
+ }
894
+ }
895
+ fromMgLogicalToNativeLogical(dataStr) {
896
+ let nativeVal;
897
+ nativeVal = (dataStr.charAt(0) === '1') ? true : false;
898
+ return nativeVal;
899
+ }
900
+ fromNativeLogicalToMgLogical(dispVal) {
901
+ let mgVal;
902
+ mgVal = (dispVal === true) ? "1" : "0";
903
+ return mgVal;
904
+ }
905
+ win_rng_bool(rng) {
906
+ if (rng === null || rng.length === 0) {
907
+ rng = "True, False";
908
+ }
909
+ return rng;
910
+ }
911
+ toNum(dispValue, pic, compIdx) {
912
+ let mgNum = new NUM_TYPE(dispValue, pic, compIdx);
913
+ return mgNum.toXMLrecord();
914
+ }
915
+ a_2_date_pic_datemode(str, str_len, pic, mask, compIdx) {
916
+ let pos = 0;
917
+ let year_in_pic = false;
918
+ let month_in_pic = false;
919
+ let day_in_pic = false;
920
+ let inp = false;
921
+ let bYearIsZero = false;
922
+ let era_year = 0;
923
+ let intRef = new IntRef(0);
924
+ let intPicIdxOfs = 0;
925
+ let millenium = 0;
926
+ let dateParams;
927
+ let len = Math.min(str.length, pic.getMaskSize());
928
+ if (str.length < mask.length)
929
+ str.length = mask.length;
930
+ let year = 0;
931
+ let month = 1;
932
+ let day = 1;
933
+ let doy = 1;
934
+ let usedoy = false;
935
+ let i;
936
+ for (i = 0; i < str_len; i = i + 1) {
937
+ if (str[i] !== '0' && str[i] !== ' ') {
938
+ break;
939
+ }
940
+ }
941
+ if (i === str_len)
942
+ return 0;
943
+ while (pos < str_len && pos + intPicIdxOfs < len) {
944
+ switch (mask[pos + intPicIdxOfs].charCodeAt(0)) {
945
+ case PICInterface.PIC_YY:
946
+ year_in_pic = true;
947
+ inp = true;
948
+ year = this.date_a_2_i(str, 2, pos);
949
+ pos += 2;
950
+ if (year === 0)
951
+ bYearIsZero = true;
952
+ let century_year = this._environment.GetCentury(compIdx) % 100;
953
+ if (year < century_year)
954
+ year += 100;
955
+ year += this._environment.GetCentury(compIdx) - century_year;
956
+ if (this._environment.GetDateMode(compIdx) === 'B')
957
+ year -= PICInterface.DATE_BUDDHIST_GAP;
958
+ break;
959
+ case (PICInterface.PIC_YYYY):
960
+ year_in_pic = true;
961
+ inp = true;
962
+ let YearDigitsNo;
963
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
964
+ for (YearDigitsNo = 0; YearDigitsNo < 4 && pos + YearDigitsNo < str.length && UtilStrByteMode.isDigit(str[pos + YearDigitsNo]); YearDigitsNo++) {
965
+ }
966
+ i = YearDigitsNo;
967
+ }
968
+ else {
969
+ for (i = 0; pos + i < str.length && str[pos + i] !== this.DATECHAR.toString() && i < 4; i++) {
970
+ }
971
+ for (YearDigitsNo = 0; pos + YearDigitsNo < str.length && UtilStrByteMode.isDigit(str[pos + YearDigitsNo]) &&
972
+ YearDigitsNo < 4; YearDigitsNo++) {
973
+ }
974
+ }
975
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
976
+ if (i < 4 && str.length < mask.length)
977
+ this.move_date(str, pos, 4 - i, str.length);
978
+ }
979
+ else {
980
+ if (i < 4 && len < mask.length) {
981
+ this.move_date(str, pos, 4 - i, len);
982
+ len = len + 4 - i;
983
+ }
984
+ }
985
+ year = this.date_a_2_i(str, 4, pos);
986
+ pos += 4;
987
+ if (year === 0)
988
+ bYearIsZero = true;
989
+ if (YearDigitsNo <= 2) {
990
+ century_year = this._environment.GetCentury(compIdx) % 100;
991
+ if (year < century_year)
992
+ year += 100;
993
+ year += this._environment.GetCentury(compIdx) - century_year;
994
+ }
995
+ if (this._environment.GetDateMode(compIdx) === 'B')
996
+ year -= PICInterface.DATE_BUDDHIST_GAP;
997
+ break;
998
+ case PICInterface.PIC_HYYYYY:
999
+ inp = true;
1000
+ let quotes = 0;
1001
+ if (len > pos + 5 && mask[pos + 5].charCodeAt(0) === (PICInterface.PIC_HYYYYY))
1002
+ quotes = 1;
1003
+ year = HebrewDate.dateheb_h_2_i(str, 5 + quotes, pos);
1004
+ pos += 5 + quotes;
1005
+ if (year === 0)
1006
+ bYearIsZero = true;
1007
+ break;
1008
+ case PICInterface.PIC_HL:
1009
+ intPicIdxOfs = HebrewDate.dateheb_h_2_i(str, 1, pos);
1010
+ pos++;
1011
+ break;
1012
+ case PICInterface.PIC_HDD:
1013
+ inp = true;
1014
+ quotes = 0;
1015
+ if (len > pos + 2 && mask[pos + 2].charCodeAt(0) === PICInterface.PIC_HDD)
1016
+ quotes = 1;
1017
+ day = HebrewDate.dateheb_h_2_i(str, 2 + quotes, pos);
1018
+ pos += 2 + quotes;
1019
+ break;
1020
+ case PICInterface.PIC_MMD:
1021
+ inp = true;
1022
+ month_in_pic = true;
1023
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
1024
+ if ((str.length === pos + 1 || str[pos + 1].charCodeAt(0) === this.DATECHAR || !UtilStrByteMode.isDigit(str[pos + 1])) && str.length < mask.length)
1025
+ this.move_date(str, pos, 1, str.length);
1026
+ }
1027
+ else {
1028
+ if (str[pos + 1].charCodeAt(0) === this.DATECHAR && len < mask.length) {
1029
+ this.move_date(str, pos, 1, len);
1030
+ len += 1;
1031
+ }
1032
+ }
1033
+ month = this.date_a_2_i(str, 2, pos);
1034
+ pos += 2;
1035
+ break;
1036
+ case PICInterface.PIC_MMM:
1037
+ inp = true;
1038
+ month_in_pic = true;
1039
+ intRef.val = pos;
1040
+ month = this.date_MMM_2_m(str, mask, intRef, len, pic.isHebrew());
1041
+ pos = intRef.val;
1042
+ if (pic.isHebrew() && month === 14)
1043
+ month = 6;
1044
+ break;
1045
+ case (PICInterface.PIC_DD):
1046
+ inp = true;
1047
+ day_in_pic = true;
1048
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
1049
+ if ((str.length === pos + 1 || str[pos + 1].charCodeAt(0) === this.DATECHAR || !UtilStrByteMode.isDigit(str[pos + 1])) && str.length < mask.length)
1050
+ this.move_date(str, pos, 1, str.length);
1051
+ }
1052
+ else {
1053
+ if (str[pos + 1].charCodeAt(0) === this.DATECHAR && len < mask.length) {
1054
+ this.move_date(str, pos, 1, len);
1055
+ len += 1;
1056
+ }
1057
+ }
1058
+ day = this.date_a_2_i(str, 2, pos);
1059
+ pos += 2;
1060
+ break;
1061
+ case (PICInterface.PIC_DDD):
1062
+ inp = true;
1063
+ usedoy = true;
1064
+ day_in_pic = true;
1065
+ doy = this.date_a_2_i(str, 3, pos);
1066
+ pos += 3;
1067
+ break;
1068
+ case (PICInterface.PIC_DDDD):
1069
+ inp = true;
1070
+ day_in_pic = true;
1071
+ day = this.date_a_2_i(str, 2, pos);
1072
+ pos += 2 + 2;
1073
+ break;
1074
+ case (PICInterface.PIC_YJ):
1075
+ year_in_pic = true;
1076
+ inp = true;
1077
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
1078
+ if ((str.length === pos + 1 || str[pos + 1].charCodeAt(0) === this.DATECHAR || !UtilStrByteMode.isDigit(str[pos + 1])) && str.length < mask.length)
1079
+ this.move_date(str, pos, 1, str.length);
1080
+ }
1081
+ year = this.date_a_2_i(str, 2, pos);
1082
+ pos += 2;
1083
+ let str1 = NString.FromChars(str);
1084
+ era_year = UtilDateJpn.getInstance().getStartYearOfEra(str1, pic.getMask());
1085
+ if (era_year === 0)
1086
+ return 0;
1087
+ year += era_year - 1;
1088
+ if (year === 0)
1089
+ bYearIsZero = true;
1090
+ break;
1091
+ default:
1092
+ if (UtilStrByteMode.isLocaleDefLangDBCS()) {
1093
+ if (UtilStrByteMode.isHalfWidth(str[pos]) === false &&
1094
+ UtilStrByteMode.isHalfWidth(mask[pos + intPicIdxOfs]))
1095
+ intPicIdxOfs++;
1096
+ }
1097
+ pos += 1;
1098
+ break;
1099
+ }
1100
+ }
1101
+ if (bYearIsZero) {
1102
+ if (!month_in_pic)
1103
+ month = 0;
1104
+ if (!day_in_pic && month === 0)
1105
+ day = 0;
1106
+ }
1107
+ if (day === 0 && month === 0 && (bYearIsZero || year === 0))
1108
+ return (0);
1109
+ if (!inp)
1110
+ return (0);
1111
+ if (pic.isHebrew()) {
1112
+ if (year > 0) {
1113
+ if (millenium === 0)
1114
+ millenium = 5;
1115
+ year += millenium * 1000;
1116
+ }
1117
+ return (HebrewDate.dateheb_2_d(year, month, day));
1118
+ }
1119
+ if ((year === 0) && !year_in_pic) {
1120
+ dateParams = this.date_sys();
1121
+ year = dateParams.year;
1122
+ }
1123
+ return (this.date_4_calender(year, month, day, doy, usedoy));
1124
+ }
1125
+ date_a_2_i(s, len, pos) {
1126
+ if (arguments.length === 3 && (s === null || s instanceof Array) && (len === null || len.constructor === Number) && (pos === null || pos.constructor === Number)) {
1127
+ return this.date_a_2_i_0(s, len, pos);
1128
+ }
1129
+ return this.date_a_2_i_1(s, len, pos);
1130
+ }
1131
+ date_a_2_i_0(s, len, pos) {
1132
+ let array = new Array(len);
1133
+ let mgNum = new NUM_TYPE();
1134
+ for (let i = 0; i < len; i = i + 1) {
1135
+ array[i] = s[pos + i];
1136
+ }
1137
+ return mgNum.a_2_long(NString.FromChars(array));
1138
+ }
1139
+ move_date(str, pos, moveby, len) {
1140
+ if (arguments.length === 4 && (str === null || str instanceof Array) && (pos === null || pos.constructor === Number) && (moveby === null || moveby.constructor === Number) && (len === null || len.constructor === Number)) {
1141
+ this.move_date_0(str, pos, moveby, len);
1142
+ return;
1143
+ }
1144
+ this.move_date_1(str, pos, moveby, len);
1145
+ }
1146
+ move_date_0(str, pos, moveby, len) {
1147
+ MemoryUtil.char_memmove(str, pos + moveby, str, pos, len - (pos + moveby) + 1);
1148
+ MemoryUtil.char_memset(str, pos, '0', moveby);
1149
+ }
1150
+ date_MMM_2_m(str, mask, pos, len, isHebrew) {
1151
+ let l;
1152
+ if (UtilStrByteMode.isLocaleDefLangJPN()) {
1153
+ let maskPos = UtilStrByteMode.convPos(NString.FromChars(str), NString.FromChars(mask), pos.val, false);
1154
+ l = this.date_msk_cnt(mask, maskPos, (len - maskPos));
1155
+ }
1156
+ else {
1157
+ l = this.date_msk_cnt(mask, pos.val, (len - pos.val));
1158
+ }
1159
+ let strPos = pos.val;
1160
+ pos.val = pos.val + l;
1161
+ len = MemoryUtil.mem_trim(str, strPos, l);
1162
+ if (len === 0) {
1163
+ return 0;
1164
+ }
1165
+ else {
1166
+ let strB = NString.FromChars(str, strPos, len);
1167
+ let monthNames;
1168
+ if (isHebrew) {
1169
+ monthNames = HebrewDate.GetLocalMonths();
1170
+ }
1171
+ else {
1172
+ let months = Events.GetMessageString(MsgInterface.MONTHS_PTR);
1173
+ monthNames = DateUtil.getLocalMonths(months);
1174
+ }
1175
+ for (let i = 1; i < monthNames.length; i = i + 1) {
1176
+ if (NString.Compare(monthNames[i].substr(0, len), strB, true) === 0)
1177
+ return i;
1178
+ }
1179
+ }
1180
+ return 0;
1181
+ }
1182
+ date_sys() {
1183
+ let date = new DateBreakParams();
1184
+ let CurrDate = DateTime.Now;
1185
+ date.year = CurrDate.Year;
1186
+ date.month = CurrDate.Month;
1187
+ date.day = CurrDate.Day;
1188
+ return date;
1189
+ }
1190
+ date_magic(utcDate) {
1191
+ let dateTime;
1192
+ if (utcDate) {
1193
+ dateTime = DateTime.UtcNow;
1194
+ }
1195
+ else {
1196
+ dateTime = DateTime.Now;
1197
+ }
1198
+ let year = dateTime.Year;
1199
+ let month = dateTime.Month;
1200
+ let day = dateTime.Day;
1201
+ return this.date_4_calender(year, month, day, 1, false);
1202
+ }
1203
+ time_magic(utcTime) {
1204
+ return DateTime.GetTotalSecondsFromMidnight(utcTime, new Date());
1205
+ }
1206
+ mtime_magic(utcTime) {
1207
+ return DateTime.GetTotalMilliSecondsFromMidnight(utcTime, new Date());
1208
+ }
1209
+ date_4_calender(year, month, day, doy, usedoy) {
1210
+ let LeapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
1211
+ if (usedoy) {
1212
+ if (doy === 0) {
1213
+ return 0;
1214
+ }
1215
+ if (doy > 366 || (!LeapYear && doy > 365)) {
1216
+ return (1000000000);
1217
+ }
1218
+ }
1219
+ else {
1220
+ if (day === 0 && month === 0 && year === 0) {
1221
+ return 0;
1222
+ }
1223
+ if (day === 0 || month === 0 || year === 0 || month > 12) {
1224
+ return 1000000000;
1225
+ }
1226
+ }
1227
+ year = year - 1;
1228
+ let num = Math.floor(year / 400);
1229
+ year = year - num * 400;
1230
+ let num2 = Math.floor(year / 100);
1231
+ year = year - num2 * 100;
1232
+ let num3 = Math.floor(year / 4);
1233
+ year = year - num3 * 4;
1234
+ if (!usedoy) {
1235
+ let num4 = PICInterface.date_day_tab[month - 1];
1236
+ let num5 = PICInterface.date_day_tab[month];
1237
+ if (LeapYear) {
1238
+ if (month > 1) {
1239
+ num5 = num5 + 1;
1240
+ if (month > 2) {
1241
+ num4 = num4 + 1;
1242
+ }
1243
+ }
1244
+ }
1245
+ if (day > num5 - num4) {
1246
+ return 1000000000;
1247
+ }
1248
+ doy = num4 + day;
1249
+ }
1250
+ return num * 146097 + num2 * 36524 + num3 * 1461 + year * 365 + doy;
1251
+ }
1252
+ fromNativeTimeToMgTime(dispValue) {
1253
+ let mgNum = new NUM_TYPE();
1254
+ let numVal = this.fromNativeTimeToMgTimeNumber(dispValue);
1255
+ mgNum.NUM_4_LONG(numVal);
1256
+ return mgNum.toXMLrecord();
1257
+ }
1258
+ fromNativeTimeToMgTimeNumber(dispValue) {
1259
+ let numVal = this.time_2_int(dispValue.getHours(), dispValue.getMinutes(), dispValue.getSeconds());
1260
+ return numVal;
1261
+ }
1262
+ a_2_time(Ascii, picOrAsciiL, milliSecondsOrMask, milliSeconds) {
1263
+ if (arguments.length === 3)
1264
+ return this.a_2_time_0(Ascii, picOrAsciiL, milliSecondsOrMask);
1265
+ return this.a_2_time_1(Ascii, picOrAsciiL, milliSecondsOrMask, milliSeconds);
1266
+ }
1267
+ a_2_time_0(Ascii, pic, milliSeconds) {
1268
+ return this.a_2_time(Ascii, Ascii.length, NString.ToCharArray(pic.getMask()), milliSeconds);
1269
+ }
1270
+ a_2_time_1(Ascii, AsciiL, mask, milliSeconds) {
1271
+ let mgNum = new NUM_TYPE();
1272
+ let I = 0;
1273
+ let len = mask.length;
1274
+ if (len > AsciiL) {
1275
+ len = AsciiL;
1276
+ }
1277
+ let ampm = 0;
1278
+ let hour = 0;
1279
+ let minute = 0;
1280
+ let second = 0;
1281
+ let millisecond = 0;
1282
+ while (I < len) {
1283
+ let maskLength;
1284
+ let maxMaskLen;
1285
+ switch (mask[I].charCodeAt(0)) {
1286
+ case (PICInterface.PIC_HH):
1287
+ case (PICInterface.PIC_MMT):
1288
+ case (PICInterface.PIC_SS):
1289
+ case (PICInterface.PIC_PM):
1290
+ maxMaskLen = 2;
1291
+ break;
1292
+ case (PICInterface.PIC_MS):
1293
+ maxMaskLen = 3;
1294
+ break;
1295
+ default:
1296
+ maxMaskLen = 1;
1297
+ break;
1298
+ }
1299
+ maskLength = Math.min(maxMaskLen, len - I);
1300
+ switch (mask[I].charCodeAt(0)) {
1301
+ case (PICInterface.PIC_HH):
1302
+ {
1303
+ hour = mgNum.a_2_long(Ascii.substr(I, maskLength));
1304
+ }
1305
+ break;
1306
+ case (PICInterface.PIC_MMT):
1307
+ {
1308
+ minute = mgNum.a_2_long(Ascii.substr(I, maskLength));
1309
+ }
1310
+ break;
1311
+ case (PICInterface.PIC_SS):
1312
+ {
1313
+ second = mgNum.a_2_long(Ascii.substr(I, maskLength));
1314
+ }
1315
+ break;
1316
+ case (PICInterface.PIC_MS):
1317
+ {
1318
+ millisecond = mgNum.a_2_long(Ascii.substr(I, maskLength));
1319
+ }
1320
+ break;
1321
+ case (PICInterface.PIC_PM):
1322
+ ampm = 0;
1323
+ let c0 = Ascii[I];
1324
+ let c1;
1325
+ c0 = c0.toUpperCase();
1326
+ if (I + 1 < len) {
1327
+ c1 = Ascii[I + 1];
1328
+ c1 = c1.toUpperCase();
1329
+ if (c1 === 'M') {
1330
+ if (c0 === 'A')
1331
+ ampm = -1;
1332
+ if (c0 === 'P')
1333
+ ampm = 1;
1334
+ }
1335
+ }
1336
+ break;
1337
+ default:
1338
+ break;
1339
+ }
1340
+ I += maskLength;
1341
+ }
1342
+ if (second > 59 || minute > 59)
1343
+ return (0);
1344
+ if (ampm !== 0)
1345
+ if (ampm === -1) {
1346
+ if (hour === 12)
1347
+ hour = 0;
1348
+ }
1349
+ else if (hour < 12)
1350
+ hour += 12;
1351
+ if (milliSeconds)
1352
+ return this.time_2_int(hour, minute, second) * 1000 + millisecond;
1353
+ else
1354
+ return this.time_2_int(hour, minute, second);
1355
+ }
1356
+ time_2_int(hour, minute, second) {
1357
+ return hour * 3600 + minute * 60 + second;
1358
+ }
1359
+ static toBoolean(boolStr) {
1360
+ return boolStr !== null && boolStr === "1";
1361
+ }
1362
+ a_2_date(str, Format, compIdx) {
1363
+ return this.a_2_date_datemode(str, Format, compIdx);
1364
+ }
1365
+ a_2_date_pic(str, pic, mask, compIdx) {
1366
+ if (str === null) {
1367
+ str = "";
1368
+ }
1369
+ return this.a_2_date_pic_datemode(NString.ToCharArray(str), str.length, pic, NString.ToCharArray(mask), compIdx);
1370
+ }
1371
+ to_a(outVal, out_len, date, Format, compIdx) {
1372
+ return this.to_a_datemode(outVal, out_len, date, Format, false, compIdx);
1373
+ }
1374
+ a_2_date_datemode(str, Format, compIdx) {
1375
+ let pIC = new PIC(Format, StorageAttribute.DATE, compIdx);
1376
+ if (str === null) {
1377
+ str = "";
1378
+ }
1379
+ return this.a_2_date_pic_datemode(NString.ToCharArray(str), str.length, pIC, NString.ToCharArray(pIC.getMask()), compIdx);
1380
+ }
1381
+ to_a_datemode(outVal, out_len, date, Format, ignore_dt_fmt, compIdx) {
1382
+ let pic = new PIC(Format, StorageAttribute.DATE, compIdx);
1383
+ if (outVal === null) {
1384
+ outVal = pic.getMask();
1385
+ }
1386
+ return this.to_a_pic_datemode(outVal, out_len, date, pic, true, ignore_dt_fmt, compIdx);
1387
+ }
1388
+ date_a_2_i_1(s, len, pos) {
1389
+ let mgNum = new NUM_TYPE();
1390
+ let str;
1391
+ str = s.substr(pos, len);
1392
+ return mgNum.a_2_long(str);
1393
+ }
1394
+ move_date_1(str, pos, moveby, len) {
1395
+ str = StrUtil.memmove(str, pos + moveby, str, pos, len - pos);
1396
+ str = StrUtil.memset(str, pos, '0', moveby);
1397
+ return str;
1398
+ }
1399
+ time_2_a(Ascii, AsciiL, time, Format, compIdx, milliSeconds) {
1400
+ if (StrUtil.rtrim(Format).length === 0) {
1401
+ Format = "HH:MM:SS";
1402
+ }
1403
+ let pic = new PIC(Format, StorageAttribute.TIME, compIdx);
1404
+ if (Ascii === null) {
1405
+ Ascii = pic.getMask();
1406
+ }
1407
+ return this.time_2_a_pic(Ascii, AsciiL, time, pic, false, milliSeconds);
1408
+ }
1409
+ toLogical(dispValue, pic, rangeStr) {
1410
+ dispValue = dispValue.trim();
1411
+ if (dispValue === null || dispValue.length === 0) {
1412
+ dispValue = "False";
1413
+ }
1414
+ return this.disp_2_logical(dispValue, pic.getMask(), rangeStr);
1415
+ }
1416
+ disp_2_logical(dispValue, mask, rangeStr) {
1417
+ let strippedValue = new StringBuilder(dispValue.length);
1418
+ rangeStr = this.win_rng_bool(rangeStr);
1419
+ rangeStr = StrUtil.makePrintableTokens(rangeStr, SEQ_2_HTML);
1420
+ let i = rangeStr.indexOf(',');
1421
+ let trueStr = rangeStr.substr(0, i);
1422
+ trueStr = StrUtil.makePrintableTokens(trueStr, HTML_2_STR);
1423
+ i = 0;
1424
+ for (i = 0; i < dispValue.length && i < mask.length; i++) {
1425
+ if (mask.charCodeAt(i) === PICInterface.PIC_X) {
1426
+ strippedValue.Append(dispValue.charAt(i));
1427
+ }
1428
+ }
1429
+ let val = strippedValue.ToString();
1430
+ if (trueStr.length < val.length) {
1431
+ val = val.substr(0, trueStr.length);
1432
+ }
1433
+ else {
1434
+ if (val.length < trueStr.length) {
1435
+ trueStr = trueStr.substr(0, val.length);
1436
+ }
1437
+ }
1438
+ return (val.toUpperCase() === trueStr.toUpperCase()) ? "1" : "0";
1439
+ }
1440
+ toAlpha(dispValue, pic) {
1441
+ let picture = pic.getMask();
1442
+ let buffer = new StringBuilder(pic.getMaskSize());
1443
+ let IsAlphaDBCS = UtilStrByteMode.isLocaleDefLangDBCS() && pic.isAttrAlpha();
1444
+ let currPicture;
1445
+ let i = currPicture = 0;
1446
+ for (currPicture = i = 0; i < dispValue.length && currPicture < picture.length; i++, currPicture++) {
1447
+ if (DisplayConvertor.isAlphaPositionalDirective(picture.charAt(currPicture))) {
1448
+ buffer.Append(dispValue.charAt(i));
1449
+ if (IsAlphaDBCS) {
1450
+ let strDspValOneChar = dispValue.substr(i, 1);
1451
+ if (UtilStrByteMode.lenB(strDspValOneChar) === 2) {
1452
+ currPicture = currPicture + 1;
1453
+ }
1454
+ }
1455
+ }
1456
+ }
1457
+ return buffer.ToString();
1458
+ }
1459
+ static isAlphaPositionalDirective(toCheck) {
1460
+ let ascii = toCheck.charCodeAt(0);
1461
+ return (ascii === PICInterface.PIC_X || ascii === PICInterface.PIC_U || ascii === PICInterface.PIC_L ||
1462
+ ascii === PICInterface.PIC_N || ascii === PICInterface.PIC_J || ascii === PICInterface.PIC_G || ascii === PICInterface.PIC_S || ascii === PICInterface.PIC_T);
1463
+ }
1464
+ fillAlphaByRange(ContinuousRangeValues, discreteRangeValues, newValue) {
1465
+ let tmpBuffer = this.fillAlphaByDiscreteRangeValues(discreteRangeValues, newValue);
1466
+ if (tmpBuffer !== null) {
1467
+ return tmpBuffer;
1468
+ }
1469
+ else {
1470
+ tmpBuffer = this.fillAlphaByContinuousRangeValues(ContinuousRangeValues, newValue);
1471
+ if (tmpBuffer !== null) {
1472
+ return tmpBuffer;
1473
+ }
1474
+ else {
1475
+ if (discreteRangeValues !== null) {
1476
+ tmpBuffer = this.completeAlphaByRange(discreteRangeValues, newValue);
1477
+ if (tmpBuffer !== null) {
1478
+ return tmpBuffer;
1479
+ }
1480
+ }
1481
+ }
1482
+ }
1483
+ return newValue;
1484
+ }
1485
+ fillAlphaByDiscreteRangeValues(discreteRangeValues, newValue) {
1486
+ if (discreteRangeValues !== null) {
1487
+ for (let i = 0; i < discreteRangeValues.length; i = i + 1) {
1488
+ let discreteValue = discreteRangeValues.get_Item(i);
1489
+ let truncatedValue = discreteValue.substr(0, Math.min(newValue.length, discreteValue.length));
1490
+ if (newValue.toUpperCase() === truncatedValue.toUpperCase()) {
1491
+ return discreteValue;
1492
+ }
1493
+ }
1494
+ }
1495
+ return null;
1496
+ }
1497
+ fillAlphaByContinuousRangeValues(ContinuousRangeValues, newValue) {
1498
+ newValue = StrUtil.rtrim(newValue);
1499
+ if (ContinuousRangeValues !== null) {
1500
+ for (let i = 0; i < ContinuousRangeValues.length; i = i + 1) {
1501
+ let from = ContinuousRangeValues.get_Item(i);
1502
+ let to = ContinuousRangeValues.get_Item(i = i + 1);
1503
+ if (NString.CompareOrdinal(newValue, from) >= 0 && NString.CompareOrdinal(newValue, to) <= 0) {
1504
+ return newValue;
1505
+ }
1506
+ }
1507
+ }
1508
+ return null;
1509
+ }
1510
+ completeAlphaByRange(discreteRangeValues, newValue) {
1511
+ let maxCoincide = new Array(2);
1512
+ for (let _ai = 0; _ai < maxCoincide.length; ++_ai)
1513
+ maxCoincide[_ai] = 0;
1514
+ let bestItem = new Array(2);
1515
+ for (let _ai = 0; _ai < bestItem.length; ++_ai)
1516
+ bestItem[_ai] = null;
1517
+ let CHECK_CASE = 0;
1518
+ let IGNORE_CASE = 1;
1519
+ let caseLetters = CHECK_CASE;
1520
+ while (caseLetters === CHECK_CASE || caseLetters === IGNORE_CASE) {
1521
+ let lowerValue;
1522
+ if (caseLetters === CHECK_CASE) {
1523
+ lowerValue = newValue;
1524
+ }
1525
+ else {
1526
+ lowerValue = newValue.toLowerCase();
1527
+ }
1528
+ lowerValue = StrUtil.rtrim(lowerValue);
1529
+ for (let i = 0; i < discreteRangeValues.length; i = i + 1) {
1530
+ let wrongLetter = false;
1531
+ let currCoincide = 0;
1532
+ let rangeItem;
1533
+ if (caseLetters === CHECK_CASE) {
1534
+ rangeItem = discreteRangeValues.get_Item(i);
1535
+ }
1536
+ else {
1537
+ rangeItem = discreteRangeValues.get_Item(i).toLowerCase();
1538
+ }
1539
+ let lowLength = lowerValue.length;
1540
+ let rangeLength = rangeItem.length;
1541
+ if (lowLength < rangeLength) {
1542
+ for (let j = 0; j < lowLength; j = j + 1) {
1543
+ if (!(lowerValue.charAt(j) === rangeItem.charAt(j))) {
1544
+ wrongLetter = true;
1545
+ break;
1546
+ }
1547
+ currCoincide = currCoincide + 1;
1548
+ }
1549
+ }
1550
+ else {
1551
+ wrongLetter = true;
1552
+ }
1553
+ if (currCoincide > maxCoincide[caseLetters] && !wrongLetter) {
1554
+ bestItem[caseLetters] = discreteRangeValues.get_Item(i);
1555
+ maxCoincide[caseLetters] = currCoincide;
1556
+ }
1557
+ }
1558
+ caseLetters = caseLetters + 1;
1559
+ }
1560
+ if (bestItem[CHECK_CASE] !== null)
1561
+ return bestItem[CHECK_CASE];
1562
+ else {
1563
+ if (bestItem[IGNORE_CASE] !== null)
1564
+ return bestItem[IGNORE_CASE];
1565
+ }
1566
+ return null;
1567
+ }
1568
+ setDateChar(dateChar) {
1569
+ this.DATECHAR = dateChar;
1570
+ }
1571
+ getDateChar() {
1572
+ return this.DATECHAR;
1573
+ }
1574
+ static StringValueToMgValue(value, storageAttribute, filler, length) {
1575
+ switch (storageAttribute) {
1576
+ case StorageAttribute.ALPHA:
1577
+ case StorageAttribute.UNICODE: {
1578
+ let newVal = value;
1579
+ newVal = NString.PadRight(newVal, length, filler);
1580
+ return newVal;
1581
+ }
1582
+ case StorageAttribute.NUMERIC:
1583
+ case StorageAttribute.DATE:
1584
+ case StorageAttribute.TIME:
1585
+ return new NUM_TYPE(value);
1586
+ default:
1587
+ return value;
1588
+ }
1589
+ }
1590
+ }
1591
+ export class TimeBreakParams {
1592
+ hour = 0;
1593
+ minute = 0;
1594
+ second = 0;
1595
+ constructor(hour_, minute_, second_) {
1596
+ if (arguments.length === 0) {
1597
+ this.constructor_0();
1598
+ return;
1599
+ }
1600
+ this.constructor_1(hour_, minute_, second_);
1601
+ }
1602
+ constructor_0() {
1603
+ }
1604
+ constructor_1(hour_, minute_, second_) {
1605
+ this.hour = hour_;
1606
+ this.minute = minute_;
1607
+ this.second = second_;
1608
+ }
1609
+ }
1610
+ class IntRef {
1611
+ val = 0;
1612
+ constructor(val_) {
1613
+ this.val = val_;
1614
+ }
1615
+ }
1616
+ class DateNameParams {
1617
+ outVal = null;
1618
+ len = 0;
1619
+ outIdx = 0;
1620
+ constructor(out_, outIdx_, len_) {
1621
+ this.outVal = out_;
1622
+ this.outIdx = outIdx_;
1623
+ this.len = len_;
1624
+ }
1625
+ }
1626
+ export class DateBreakParams {
1627
+ day = 0;
1628
+ dow = 0;
1629
+ doy = 0;
1630
+ month = 0;
1631
+ year = 0;
1632
+ constructor(year_, month_, day_, doy_, dow_) {
1633
+ if (arguments.length === 0) {
1634
+ this.constructor_0();
1635
+ return;
1636
+ }
1637
+ this.constructor_1(year_, month_, day_, doy_, dow_);
1638
+ }
1639
+ constructor_0() {
1640
+ }
1641
+ constructor_1(year_, month_, day_, doy_, dow_) {
1642
+ this.year = year_;
1643
+ this.month = month_;
1644
+ this.day = day_;
1645
+ this.doy = doy_;
1646
+ this.dow = dow_;
1647
+ }
1648
+ }
1649
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlzcGxheUNvbnZlcnRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvRGlzcGxheUNvbnZlcnRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxRQUFRLEVBQVEsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RixPQUFPLEVBQ0wsUUFBUSxFQUNSLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFdBQVcsRUFDWCxlQUFlLEVBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdqRCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ25CLFlBQVksR0FBaUIsSUFBSSxDQUFDO0lBQ2xDLFFBQVEsR0FBVyxDQUFDLENBQUM7SUFDckIsTUFBTSxDQUFDLFNBQVMsR0FBcUIsSUFBSSxDQUFDO0lBRWxELE1BQU0sS0FBSyxRQUFRO1FBQ2pCLElBQUksZ0JBQWdCLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hDLGdCQUFn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SUVudmlyb25tZW50JztcclxuaW1wb3J0IHtQSUN9IGZyb20gJy4vUElDJztcclxuaW1wb3J0IHtEYXRlVGltZSwgTGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0cmluZ0J1aWxkZXJ9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtcclxuICBEYXRlVXRpbCxcclxuICBIVE1MXzJfU1RSLFxyXG4gIE1zZ0ludGVyZmFjZSxcclxuICBQSUNJbnRlcmZhY2UsXHJcbiAgU0VRXzJfSFRNTCxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbERhdGVKcG4sXHJcbiAgVXRpbFN0ckJ5dGVNb2RlXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7QmxvYlR5cGV9IGZyb20gJy4uL2RhdGEvQmxvYlR5cGUnO1xyXG5pbXBvcnQge1ZhbGlkYXRpb25EZXRhaWxzQmFzZX0gZnJvbSAnLi9WYWxpZGF0aW9uRGV0YWlsc0Jhc2UnO1xyXG5pbXBvcnQge05VTV9UWVBFfSBmcm9tICcuLi9kYXRhL05VTV9UWVBFJztcclxuaW1wb3J0IHtIZWJyZXdEYXRlfSBmcm9tICcuL0hlYnJld0RhdGUnO1xyXG5pbXBvcnQge0V2ZW50c30gZnJvbSAnLi4vLi4vRXZlbnRzJztcclxuaW1wb3J0IHtHdWlFbnZpcm9ubWVudH0gZnJvbSAnLi4vLi4vR3VpRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge01lbW9yeVV0aWx9IGZyb20gJy4uLy4uL3V0aWwvTWVtb3J5VXRpbCc7XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgRGlzcGxheUNvbnZlcnRvciB7XHJcbiAgcHJpdmF0ZSBfZW52aXJvbm1lbnQ6IElFbnZpcm9ubWVudCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBEQVRFQ0hBUjogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IERpc3BsYXlDb252ZXJ0b3IgPSBudWxsO1xyXG5cclxuICBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IERpc3BsYXlDb252ZXJ0b3Ige1xyXG4gICAgaWYgKERpc3BsYXlDb252ZXJ0b3IuX2luc3RhbmNlID09PSBudWxsKSB7XHJcbiAgICAgIERpc3BsYXlDb252ZXJ0b3IuX2luc3RhbmNlID0gbmV3IERpc3BsYXlDb252ZXJ0b3IoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBEaXNwbGF5Q29udmVydG9yLl9pbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fZW52aXJvbm1lbnQgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudDtcclxuICB9XHJcblxyXG4gIGdldE5ld0RhdGVCcmVha1BhcmFtcygpOiBEYXRlQnJlYWtQYXJhbXMge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlQnJlYWtQYXJhbXMoKTtcclxuICB9XHJcblxyXG4gIGdldE5ld1RpbWVCcmVha1BhcmFtcygpOiBUaW1lQnJlYWtQYXJhbXMge1xyXG4gICAgcmV0dXJuIG5ldyBUaW1lQnJlYWtQYXJhbXMoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIG9mIGEgdmFsdWUgZnJvbSBpdHMgcGljdHVyZSBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWx1ZVwiPiAgdGhlIGludGVybmFsIHZhbHVlIChhcyBzZW50IGluIHRoZSBYTUwpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPiB2YWx1ZSByYW5nZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICAgICAgdGhlIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdHJpbmcgdG8gZGlzcGxheVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgbWcyZGlzcChtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlciwgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IGFueTtcclxuICBtZzJkaXNwKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgYWx3YXlzRmlsbDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyLCB0aW1lX2RhdGVfcGljX1pfZWR0OiBib29sZWFuKTogYW55O1xyXG4gIG1nMmRpc3AobWdWYWx1ZTogc3RyaW5nLCByYW5nZVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdXNlTmF0aXZlOiBib29sZWFuLCBhbHdheXNGaWxsOiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIsIGNvbnZlcnRDYXNlOiBib29sZWFuLCB0aW1lX2RhdGVfbnVtX3BpY19aX2VkdDogYm9vbGVhbik6IGFueTtcclxuICBtZzJkaXNwKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgY29tcElkeE9yQWx3YXlzRmlsbDogYW55LCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb21wSWR4OiBhbnksIHRpbWVfZGF0ZV9waWNfWl9lZHRPckNvbnZlcnRDYXNlPzogYm9vbGVhbiwgdGltZV9kYXRlX251bV9waWNfWl9lZHQ/OiBib29sZWFuKTogYW55IHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA2KVxyXG4gICAgICByZXR1cm4gdGhpcy5tZzJkaXNwXzAobWdWYWx1ZSwgcmFuZ2VTdHIsIHBpYywgdXNlTmF0aXZlLCBjb21wSWR4T3JBbHdheXNGaWxsLCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb21wSWR4KTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA3KVxyXG4gICAgICByZXR1cm4gdGhpcy5tZzJkaXNwXzEobWdWYWx1ZSwgcmFuZ2VTdHIsIHBpYywgdXNlTmF0aXZlLCBjb21wSWR4T3JBbHdheXNGaWxsLCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb21wSWR4LCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb252ZXJ0Q2FzZSk7XHJcblxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5tZzJkaXNwXzIobWdWYWx1ZSwgcmFuZ2VTdHIsIHBpYywgdXNlTmF0aXZlLCBjb21wSWR4T3JBbHdheXNGaWxsLCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb21wSWR4LCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb252ZXJ0Q2FzZSwgdGltZV9kYXRlX251bV9waWNfWl9lZHQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZzJkaXNwXzAobWdWYWx1ZTogc3RyaW5nLCByYW5nZVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdXNlTmF0aXZlOiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIsIHRpbWVfZGF0ZV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMubWcyZGlzcChtZ1ZhbHVlLCByYW5nZVN0ciwgcGljLCB1c2VOYXRpdmUsIGZhbHNlLCBjb21wSWR4LCB0aW1lX2RhdGVfcGljX1pfZWR0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWcyZGlzcF8xKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgYWx3YXlzRmlsbDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyLCB0aW1lX2RhdGVfcGljX1pfZWR0OiBib29sZWFuKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm1nMmRpc3AobWdWYWx1ZSwgcmFuZ2VTdHIsIHBpYywgdXNlTmF0aXZlLCBhbHdheXNGaWxsLCBjb21wSWR4LCBmYWxzZSwgdGltZV9kYXRlX3BpY19aX2VkdCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgb2YgYSB2YWx1ZSBmcm9tIGl0cyBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbHVlXCI+dGhlIGludGVybmFsIHZhbHVlIChhcyBzZW50IGluIHRoZSBYTUwpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPnZhbHVlIHJhbmdlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj50aGUgcGljdHVyZSBmb3JtYXRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFsd2F5c0ZpbGxcIj5BbHdheXMgYXV0byBmaWxsIGFscGhhIG92ZXIgaXRzIHBpY3R1cmUgKHVzZWQgZm9yIHNlbGVjdCBjb250cm9scylcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHN0cmluZyB0byBkaXNwbGF5XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwdWJsaWMgbWcyZGlzcF8yKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgYWx3YXlzRmlsbDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyLCBjb252ZXJ0Q2FzZTogYm9vbGVhbiwgdGltZV9kYXRlX251bV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgbGV0IHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCB0bXBSYW5nZTogc3RyaW5nID0gKHJhbmdlU3RyID09PSBudWxsKSA/IFwiXCIgOiByYW5nZVN0cjtcclxuXHJcbiAgICBzd2l0Y2ggKHBpYy5nZXRBdHRyKCkpIHtcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgc3RyID0gdGhpcy5mcm9tQWxwaGEobWdWYWx1ZSwgcGljLCB0bXBSYW5nZSwgYWx3YXlzRmlsbCwgY29udmVydENhc2UpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6IHtcclxuXHJcbiAgICAgICAgLy8gTm93LCBjdXJyZWN5IGRpcmVjdGl2ZSBzdXBwb3J0ZWQsIGJ1dCB0aGlzIHdpbGwgYmUgaGFuZGxlZCBieSBhbmd1bGFyIHBhY2thZ2VzIGxpa2UgbmctY3VycmVuY3lcclxuICAgICAgICAvLyBoZXJlIGl0IHNob3VsZCBzaW1wbHkgcGFzcyB0aGUgYWN0dWFsIG5hdGl2ZSB2YWx1ZSBvZiBudW1iZXIgYW5kIG1hc2tzIHNob3VsZCBub3QgYmUgYXBwbGllZFxyXG4gICAgICAgIC8vIFNvLCBwcmVwYXJlIHRlbXBvcmFyeSBwaWN0dXJlIHRvIGdlbmVyYXRlIG5hdGl2ZSB2YWx1ZS5cclxuICAgICAgICBsZXQgIG5ld1BpYyA9IHBpYy5nZXRVbmZvcm1hdHRlZE51bWVyaWNQaWMoKTtcclxuXHJcbiAgICAgICAgLy9zdG9yZSBhbmQgcmVzdG9yZSBkZWNpbWFsIHNlcCBhbmQgdGhvdS4gc2VwXHJcbiAgICAgICAgbGV0ICBkZWM6IHN0cmluZyA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldERlY2ltYWwoKTtcclxuICAgICAgICBsZXQgdGhvdTpzdHJpbmcgID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0VGhvdXNhbmRzKCk7XHJcblxyXG4gICAgICAgIC8vc2V0IGRlZmF1bHQgdmFsdWVzXHJcbiAgICAgICAgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuc2V0RGVjaW1hbFNlcGFyYXRvcignLicpO1xyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldFRob3VzYW5kc1NlcGFyYXRvcignLCcpO1xyXG5cclxuICAgICAgICBzdHIgPSB0aGlzLmZyb21OdW0obWdWYWx1ZSwgbmV3UGljKTtcclxuICAgICAgICBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5zZXREZWNpbWFsU2VwYXJhdG9yKGRlYyk7XHJcbiAgICAgICAgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuc2V0VGhvdXNhbmRzU2VwYXJhdG9yKHRob3UpO1xyXG4gICAgICAgIC8vIFZhbHVlIHNob3VsZCBiZSB0cmltbWVkIHdoZW4gd2UgYXJlIGRpc3BsYXlpbmcgY29udHJvbCBpbiBvcmRlciB0byBkaXNwbGF5IGFsaWdubWVudCBwcm9wZXJseS4gQnV0IHdoaWxlIGVudGVyaW5nIGNvbnRyb2wsIGl0IHNob3VsZCBub3QgYmUgdHJpbW1lZFxyXG4gICAgICAgIC8vIGluIG9yZGVyIHRvIHJlYWQgaXQgcHJvcGVybHkuXHJcbiAgICAgICAgaWYgKG5ld1BpYy5nZXRNYXNrQ2hhcnMoKSA9PT0gMCB8fCAhdGltZV9kYXRlX251bV9waWNfWl9lZHQpXHJcbiAgICAgICAgICBzdHIgPSBTdHJVdGlsLmx0cmltKHN0cik7XHJcblxyXG4gICAgICAgIGlmICh1c2VOYXRpdmUpIHtcclxuICAgICAgICAgIGlmIChzdHIgPT0gXCJcIilcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgICAgbGV0IGRibDogbnVtYmVyID0gTnVtYmVyKHN0cik7XHJcbiAgICAgICAgICByZXR1cm4gZGJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOiB7XHJcbiAgICAgICAgaWYgKHVzZU5hdGl2ZSkge1xyXG4gICAgICAgICAgbGV0IGR0OiBEYXRlO1xyXG4gICAgICAgICAgZHQgPSB0aGlzLmZyb21NZ0RhdGVUb05hdGl2ZURhdGUobWdWYWx1ZSwgcGljLCBjb21wSWR4KTtcclxuICAgICAgICAgIHJldHVybiBkdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBzdHIgPSB0aGlzLmZyb21EYXRlKG1nVmFsdWUsIHBpYywgY29tcElkeCwgdGltZV9kYXRlX251bV9waWNfWl9lZHQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOiB7XHJcbiAgICAgICAgaWYgKHVzZU5hdGl2ZSkge1xyXG4gICAgICAgICAgbGV0IGR0OiBEYXRlO1xyXG4gICAgICAgICAgZHQgPSB0aGlzLmZyb21NZ1RpbWVUb05hdGl2ZVRpbWUobWdWYWx1ZSwgcGljKTtcclxuICAgICAgICAgIHJldHVybiBkdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBzdHIgPSB0aGlzLmZyb21UaW1lKG1nVmFsdWUsIHBpYywgdGltZV9kYXRlX251bV9waWNfWl9lZHQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOiB7XHJcbiAgICAgICAgbGV0IGxvZ1ZhbDogYm9vbGVhbjtcclxuICAgICAgICBsb2dWYWwgPSB0aGlzLmZyb21NZ0xvZ2ljYWxUb05hdGl2ZUxvZ2ljYWwobWdWYWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIGxvZ1ZhbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgc3RyID0gQmxvYlR5cGUuZ2V0U3RyaW5nKG1nVmFsdWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgc3RyID0gbWdWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBzdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBkaXNwbGF5IHZhbHVlIGZyb20gaXRzIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPnRoZSB2YWx1ZSBhcyBlbnRlcmVkIGJ5IHVzZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+dmFsdWUgcmFuZ2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPnRoZSBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvYkNvbnRlbnRUeXBlXCI+aWYgdGhlIGF0dHJpYnV0ZSBpcyBibG9iLCBpdHMgY29udGVudCB0eXBlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBpbnRlcm5hbCBmb3JtIG9mIGRhdGEgKGFzIHVzZWQgaW4gdGhlIFhNTClcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGRpc3AybWcoZGlzcFZhbHVlOiBhbnksIHBpYzogUElDLCBjb21wSWR4OiBudW1iZXIsIGJsb2JDb250ZW50VHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBzdHI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgc3dpdGNoIChwaWMuZ2V0QXR0cigpKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgc3RyID0gdGhpcy50b0FscGhhKGRpc3BWYWx1ZSwgcGljKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzoge1xyXG4gICAgICAgIGRpc3BWYWx1ZSA9IFN0cmluZyhkaXNwVmFsdWUpO1xyXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgbWFzayBmcm9tIGRpc3BsYXkgdmFsdWUuXHJcbiAgICAgICAgbGV0IGxlbjogbnVtYmVyID0gZGlzcFZhbHVlLmxlbmd0aDtcclxuICAgICAgICB3aGlsZSAobGVuID4gMCkge1xyXG4gICAgICAgICAgaWYgKCFwaWMucGljSXNNYXNrKGxlbiAtIDEpICYmIGRpc3BWYWx1ZVtsZW4gLSAxXSAhPT0gKCcgJykpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgbGVuLS07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwVmFsdWUubGVuZ3RoID4gbGVuKVxyXG4gICAgICAgICAgZGlzcFZhbHVlID0gTlN0cmluZy5SZW1vdmUoZGlzcFZhbHVlLCBsZW4sIChkaXNwVmFsdWUubGVuZ3RoIC0gbGVuKSk7XHJcblxyXG4gICAgICAgIGlmIChwaWMuaXNOZWdhdGl2ZSgpICYmIGRpc3BWYWx1ZS50cmltKCkuc3RhcnRzV2l0aChcIi1cIikpXHJcbiAgICAgICAgICBkaXNwVmFsdWUgPSBTdHJVdGlsLmx0cmltKGRpc3BWYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vc3RvcmUgYW5kIHJlc3RvcmUgZGVjaW1hbCBzZXAgYW5kIHRob3UuIHNlcFxyXG4gICAgICAgIGxldCAgZGVjOiBzdHJpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXREZWNpbWFsKCk7XHJcbiAgICAgICAgbGV0IHRob3U6c3RyaW5nICA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFRob3VzYW5kcygpO1xyXG5cclxuICAgICAgICAvL3NldCBkZWZhdWx0IHZhbHVlc1xyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldERlY2ltYWxTZXBhcmF0b3IoJy4nKTtcclxuICAgICAgICBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5zZXRUaG91c2FuZHNTZXBhcmF0b3IoJywnKTtcclxuXHJcbiAgICAgICAgLy8gTm93LCBjdXJyZWN5IGRpcmVjdGl2ZSBzdXBwb3J0ZWQsIGJ1dCB0aGlzIHdpbGwgYmUgaGFuZGxlZCBieSBhbmd1bGFyIHBhY2thZ2VzIGxpa2UgbmctY3VycmVuY3lcclxuICAgICAgICAvLyBoZXJlIGl0IHNob3VsZCBzaW1wbHkgcGFzcyB0aGUgYWN0dWFsIG5hdGl2ZSB2YWx1ZSBvZiBudW1iZXIgYW5kIG1hc2tzIHNob3VsZCBub3QgYmUgYXBwbGllZFxyXG4gICAgICAgIC8vIFNvLCBwcmVwYXJlIHRlbXBvcmFyeSBwaWN0dXJlIHRvIGdlbmVyYXRlIG5hdGl2ZSB2YWx1ZS5cclxuICAgICAgICBsZXQgIG5ld1BpYyA9IHBpYy5nZXRVbmZvcm1hdHRlZE51bWVyaWNQaWMoKTtcclxuXHJcbiAgICAgICAgc3RyID0gdGhpcy50b051bShkaXNwVmFsdWUsIG5ld1BpYywgY29tcElkeCk7XHJcblxyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldERlY2ltYWxTZXBhcmF0b3IoZGVjKTtcclxuICAgICAgICBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5zZXRUaG91c2FuZHNTZXBhcmF0b3IodGhvdSk7XHJcbiAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAge1xyXG4gICAgICAgIGxldCBkdDogRGF0ZTtcclxuICAgICAgICAvL3doZW4gZGF0ZSBpcyBpbiBpdGVtIGxpc3QgZm9yIGNob2ljZSBjdHJsLCBpdCB3aWxsIGNvbWUgaGVyZSBhcyBzdHJpbmcuIHNvIGNvbnZlcnQgaXQgdG8gRGF0ZS5cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3BWYWx1ZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICBkdCA9IG5ldyBEYXRlIChkaXNwVmFsdWUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGR0ID0gZGlzcFZhbHVlO1xyXG4gICAgICAgIHN0ciA9IHRoaXMuZnJvbU5hdGl2ZURhdGVUb01nRGF0ZShkdCwgcGljKTtcclxuICAgICAgfVxyXG4gICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRToge1xyXG4gICAgICAgIGxldCBkdDogRGF0ZTtcclxuXHJcbiAgICAgICAgLy93aGVuIGRhdGUgaXMgaW4gaXRlbSBsaXN0IGZvciBjaG9pY2UgY3RybCwgaXQgd2lsbCBjb21lIGhlcmUgYXMgc3RyaW5nLiBzbyBjb252ZXJ0IGl0IHRvIERhdGUuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwVmFsdWUgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGR0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgIGlmIChkaXNwVmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZHQuc2V0SG91cnMoK1N0cmluZyhkaXNwVmFsdWUpLnN1YnN0cigwLCAyKSk7XHJcbiAgICAgICAgICAgIGR0LnNldE1pbnV0ZXMoK1N0cmluZyhkaXNwVmFsdWUpLnN1YnN0cigwLCAyKSk7XHJcbiAgICAgICAgICAgIGlmIChTdHJpbmcoZGlzcFZhbHVlKS5sZW5ndGggPiA1KVxyXG4gICAgICAgICAgICAgIGR0LnNldFNlY29uZHMoK1N0cmluZyhkaXNwVmFsdWUpLnN1YnN0cigwLCAyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBkdCA9IGRpc3BWYWx1ZTtcclxuXHJcbiAgICAgICAgc3RyID0gdGhpcy5mcm9tTmF0aXZlVGltZVRvTWdUaW1lKGR0KTtcclxuICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgIHN0ciA9IHRoaXMuZnJvbU5hdGl2ZUxvZ2ljYWxUb01nTG9naWNhbChkaXNwVmFsdWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICAgIHN0ciA9IEJsb2JUeXBlLmNyZWF0ZUZyb21TdHJpbmcoZGlzcFZhbHVlLCBibG9iQ29udGVudFR5cGUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cjtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gIE1ldGhvZHMgZm9yIGNvdmVydGluZyBJTlRFUk5BTCAtLS0+IERJUExBWVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGVzIG1hZ2ljIG51bWJlciB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ051bVwiPiAgIEEgTWFnaWMgTnVtYmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgVGhlIHBpY3R1cmUgdG8gdXNlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkPC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBmcm9tTnVtKG1nVmFsdWU6IHN0cmluZywgcGljOiBQSUMpOiBzdHJpbmcge1xyXG4gICAgbGV0IG1nTnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRShtZ1ZhbHVlKTtcclxuICAgIHJldHVybiBtZ051bS50b0Rpc3BsYXlWYWx1ZShwaWMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIGFscGhhIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgVGhlIHNvdXJjZSBkYXRhXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmFuZ2VTdHJcIj4gIFRoZSByYW5nZSBvZiB2YWx1ZXMgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFsd2F5c0ZpbGxcIj5BbHdheXMgYXV0byBmaWxsIGFscGhhIG92ZXIgaXRzIHBpY3R1cmUgKHVzZWQgZm9yIHNlbGVjdCBjb250cm9scylcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGZyb21BbHBoYShkYXRhU3RyOiBzdHJpbmcsIHBpYzogUElDLCByYW5nZVN0cjogc3RyaW5nLCBhbHdheXNGaWxsOiBib29sZWFuLCBjb252ZXJ0Q2FzZTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgbGVuOiBudW1iZXIgPSBwaWMuZ2V0TWFza1NpemUoKTtcclxuICAgIGxldCBtaW5fbGVuOiBudW1iZXIgPSBsZW47XHJcbiAgICBsZXQgbWFza1N0cjogc3RyaW5nID0gcGljLmdldE1hc2soKTtcclxuICAgIGxldCByZXNTdHI6IHN0cmluZztcclxuXHJcbiAgICBpZiAocGljLmdldE1hc2tDaGFycygpID4gMCkge1xyXG4gICAgICByZXNTdHIgPSB0aGlzLndpbl9kYXRhX2NweShOU3RyaW5nLlRvQ2hhckFycmF5KG1hc2tTdHIpLCBsZW4sIE5TdHJpbmcuVG9DaGFyQXJyYXkoZGF0YVN0ciksIHBpYy5pc0F0dHJBbHBoYSgpLCBjb252ZXJ0Q2FzZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkgJiYgcGljLmlzQXR0ckFscGhhKCkpXHJcbiAgICAgIC8vIEpQTjogREJDUyBzdXBwb3J0XHJcbiAgICAgIHtcclxuICAgICAgICAvLyBzdWJzdHJpbmcgYnkgdGhlIG51bWJlciBvZiBieXRlc1xyXG4gICAgICAgIGxldCBpbnREYXRhU3RyTGVuQjogbnVtYmVyID0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIoZGF0YVN0cik7XHJcbiAgICAgICAgaWYgKG1pbl9sZW4gPiBpbnREYXRhU3RyTGVuQikge1xyXG4gICAgICAgICAgbWluX2xlbiA9IGludERhdGFTdHJMZW5CO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNTdHIgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIoZGF0YVN0ciwgbWluX2xlbik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoZGF0YVN0ciAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChtaW5fbGVuID4gZGF0YVN0ci5sZW5ndGgpIHtcclxuICAgICAgICAgIG1pbl9sZW4gPSBkYXRhU3RyLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnZlcnRDYXNlKSB7XHJcbiAgICAgICAgICByZXNTdHIgPSB0aGlzLndpbl9kYXRhX2NweShOU3RyaW5nLlRvQ2hhckFycmF5KG1hc2tTdHIpLCBsZW4sIE5TdHJpbmcuVG9DaGFyQXJyYXkoZGF0YVN0ciksIHBpYy5pc0F0dHJBbHBoYSgpLCBjb252ZXJ0Q2FzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVzU3RyID0gZGF0YVN0ci5zdWJzdHIoMCwgbWluX2xlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2UgZG8gbm90IGZpbGwgQWxwaGEgZmlsZWQgb3ZlciBjb250cm9sJ3MgcGljdHVyZSBsZW5ndGggUUNSICMgMjk1NDA4XHJcbiAgICBpZiAoYWx3YXlzRmlsbCB8fCAocmFuZ2VTdHIgIT09IG51bGwgJiYgcmFuZ2VTdHIubGVuZ3RoID4gMCAmJiByZXNTdHIubGVuZ3RoIDwgbGVuKSkge1xyXG4gICAgICBsZXQgdmQ6IFZhbGlkYXRpb25EZXRhaWxzQmFzZSA9IG5ldyBWYWxpZGF0aW9uRGV0YWlsc0Jhc2UocmFuZ2VTdHIpO1xyXG4gICAgICBsZXQgY29udGludW91c1JhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4gPSB2ZC5nZXRDb250aW51b3VzUmFuZ2VWYWx1ZXMoKTtcclxuICAgICAgbGV0IGRpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IHZkLmdldERpc2NyZXRlUmFuZ2VWYWx1ZXMoKTtcclxuICAgICAgaWYgKGNvbnRpbnVvdXNSYW5nZVZhbHVlcyAhPT0gbnVsbCB8fCBkaXNjcmV0ZVJhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmVzU3RyID0gdGhpcy5maWxsQWxwaGFCeVJhbmdlKGNvbnRpbnVvdXNSYW5nZVZhbHVlcywgZGlzY3JldGVSYW5nZVZhbHVlcywgcmVzU3RyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc1N0cjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FzZUNvbnZlcnRlZENoYXIoZGF0YTogc3RyaW5nLCBtYXNrOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBjaDogc3RyaW5nO1xyXG4gICAgaWYgKG1hc2suY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19VKSB7XHJcbiAgICAgIGNoID0gZGF0YS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChtYXNrLmNoYXJDb2RlQXQoMCkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTCkge1xyXG4gICAgICAgIGNoID0gZGF0YS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNoID0gZGF0YTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3aW5fZGF0YV9jcHkobWFza1N0cjogc3RyaW5nW10sIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogc3RyaW5nW10sIGlzQXR0ckFscGhhOiBib29sZWFuKTogc3RyaW5nO1xyXG4gIHByaXZhdGUgd2luX2RhdGFfY3B5KG1hc2tTdHI6IHN0cmluZ1tdLCBtYXNrTGVuOiBudW1iZXIsIGRhdGFTdHI6IHN0cmluZ1tdLCBpc0F0dHJBbHBoYTogYm9vbGVhbiwgY29udmVydENhc2U6IGJvb2xlYW4pOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSB3aW5fZGF0YV9jcHkobWFza1N0cjogYW55LCBtYXNrTGVuOiBudW1iZXIsIGRhdGFTdHI6IGFueSwgaXNBdHRyQWxwaGE6IGJvb2xlYW4sIGNvbnZlcnRDYXNlPzogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNClcclxuICAgICAgcmV0dXJuIHRoaXMud2luX2RhdGFfY3B5XzAobWFza1N0ciwgbWFza0xlbiwgZGF0YVN0ciwgaXNBdHRyQWxwaGEpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLndpbl9kYXRhX2NweV8xKG1hc2tTdHIsIG1hc2tMZW4sIGRhdGFTdHIsIGlzQXR0ckFscGhhLCBjb252ZXJ0Q2FzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdpbl9kYXRhX2NweV8wKG1hc2tTdHI6IHN0cmluZ1tdLCBtYXNrTGVuOiBudW1iZXIsIGRhdGFTdHI6IHN0cmluZ1tdLCBpc0F0dHJBbHBoYTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy53aW5fZGF0YV9jcHkobWFza1N0ciwgbWFza0xlbiwgZGF0YVN0ciwgaXNBdHRyQWxwaGEsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBIYW5kbGVzIGFscGhhIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1hc2tTdHJcIj4gICBUaGUgbWFzayB0byBiZSB1c2VkIGluIG9yZGVyIHRvIGJ1aWxkIHRoZSBzdHJpbmdcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHdpbl9kYXRhX2NweV8xKG1hc2tTdHI6IHN0cmluZ1tdLCBtYXNrTGVuOiBudW1iZXIsIGRhdGFTdHI6IHN0cmluZ1tdLCBpc0F0dHJBbHBoYTogYm9vbGVhbiwgY29udmVydENhc2U6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IG1hc2tJZHg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZGF0YUlkeDogbnVtYmVyID0gMDtcclxuICAgIGxldCByZXNTdHI6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4obWFza0xlbik7XHJcblxyXG4gICAgaWYgKGlzQXR0ckFscGhhICYmIFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgbGV0IG51bTI6IG51bWJlciA9IDA7XHJcbiAgICAgIHdoaWxlIChtYXNrSWR4IDwgbWFza0xlbiAmJiBudW0yIDwgbWFza0xlbikge1xyXG4gICAgICAgIGlmIChtYXNrU3RyW21hc2tJZHhdLmNoYXJDb2RlQXQoMCkgPD0gUElDSW50ZXJmYWNlLlBJQ19NQVhfT1ApIHtcclxuICAgICAgICAgIGlmIChkYXRhSWR4IDwgZGF0YVN0ci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbGV0IHN0clZhbDogc3RyaW5nID0gTlN0cmluZy5Gcm9tQ2hhcnMoZGF0YVN0ciwgZGF0YUlkeCwgMSk7XHJcbiAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUubGVuQihzdHJWYWwpID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG1hc2tJZHggKyAxIDwgbWFza0xlbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hc2tTdHJbbWFza0lkeCArIDFdLmNoYXJDb2RlQXQoMCkgPD0gUElDSW50ZXJmYWNlLlBJQ19NQVhfT1ApIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRDYXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzU3RyW251bTIrK10gPSB0aGlzLmNhc2VDb252ZXJ0ZWRDaGFyKGRhdGFTdHJbZGF0YUlkeCsrXSwgbWFza1N0clttYXNrSWR4ICsgMV0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc1N0cltudW0yKytdID0gZGF0YVN0cltkYXRhSWR4KytdO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIG1hc2tJZHggPSBtYXNrSWR4ICsgMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9ICcgJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9ICcgJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbnZlcnRDYXNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9IHRoaXMuY2FzZUNvbnZlcnRlZENoYXIoZGF0YVN0cltkYXRhSWR4KytdLCBtYXNrU3RyW21hc2tJZHggKyAxXSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzU3RyW251bTIrK10gPSBkYXRhU3RyW2RhdGFJZHgrK107XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmVzU3RyW251bTIrK10gPSAnICcvKicgJyovO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJlc1N0cltudW0yKytdID0gbWFza1N0clttYXNrSWR4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWFza0lkeCA9IG1hc2tJZHggKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBOU3RyaW5nLkZyb21DaGFycyhyZXNTdHIpLnN1YnN0cigwLCBudW0yKTtcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAobWFza0lkeCA8IG1hc2tMZW4pIHtcclxuICAgICAgaWYgKG1hc2tTdHJbbWFza0lkeF0uY2hhckNvZGVBdCgwKSA8PSBQSUNJbnRlcmZhY2UuUElDX01BWF9PUCkge1xyXG4gICAgICAgIGlmIChkYXRhSWR4IDwgZGF0YVN0ci5sZW5ndGgpIHtcclxuICAgICAgICAgIHJlc1N0clttYXNrSWR4XSA9IGRhdGFTdHJbZGF0YUlkeF07XHJcbiAgICAgICAgICBpZiAoY29udmVydENhc2UpIHtcclxuICAgICAgICAgICAgcmVzU3RyW21hc2tJZHhdID0gdGhpcy5jYXNlQ29udmVydGVkQ2hhcihkYXRhU3RyW2RhdGFJZHhdLCBtYXNrU3RyW21hc2tJZHhdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXNTdHJbbWFza0lkeF0gPSBkYXRhU3RyW2RhdGFJZHhdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0YUlkeCA9IGRhdGFJZHggKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJlc1N0clttYXNrSWR4XSA9ICcgJy8qJyAnKi87XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlc1N0clttYXNrSWR4XSA9IG1hc2tTdHJbbWFza0lkeF07XHJcbiAgICAgIH1cclxuICAgICAgbWFza0lkeCA9IG1hc2tJZHggKyAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKHJlc1N0cik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gZGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFRoZSBzb3VyY2UgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBmcm9tRGF0ZShkYXRhU3RyOiBzdHJpbmcsIHBpYzogUElDLCBjb21wSWR4OiBudW1iZXIsIHRpbWVfZGF0ZV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgbGV0IG1hc2s6IHN0cmluZyA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICBsZXQgbWFza1NpemU6IG51bWJlciA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG4gICAgbGV0IGRhdGU6IG51bWJlciA9IG5ldyBOVU1fVFlQRShkYXRhU3RyKS5OVU1fMl9VTE9ORygpO1xyXG4gICAgcmV0dXJuIHRoaXMudG9fYV9waWNfZGF0ZW1vZGUobWFzaywgbWFza1NpemUsIGRhdGUsIHBpYywgdGltZV9kYXRlX3BpY19aX2VkdCwgZmFsc2UsIGNvbXBJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIHRpbWUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgdGhlIHZhbHVlIHRvIGRpc3BsYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgZnJvbVRpbWUoZGF0YVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWFzazogc3RyaW5nID0gcGljLmdldE1hc2soKTtcclxuICAgIGxldCBtYXNrU2l6ZTogbnVtYmVyID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICBsZXQgdGltZTogbnVtYmVyID0gbmV3IE5VTV9UWVBFKGRhdGFTdHIpLk5VTV8yX1VMT05HKCk7XHJcbiAgICByZXR1cm4gdGhpcy50aW1lXzJfYV9waWMobWFzaywgbWFza1NpemUsIHRpbWUsIHBpYywgdGltZV9kYXRlX3BpY19aX2VkdCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIHRoZSBkYXRlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgVGhlIHNvdXJjZSBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkPC9yZXR1cm5zPlxyXG4gIGZyb21NZ0RhdGVUb05hdGl2ZURhdGUoZGF0YVN0cjogc3RyaW5nLCBwaWM6IFBJQywgY29tcElkeDogbnVtYmVyKTogRGF0ZSB7XHJcblxyXG4gICAgbGV0IGRhdGU6IG51bWJlciA9IG5ldyBOVU1fVFlQRShkYXRhU3RyKS5OVU1fMl9VTE9ORygpO1xyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXM7XHJcbiAgICAvLyBCcmVhayBkYXRhIGludG8gaXRzIGNvbXBvbmVudHNcclxuICAgIGJyZWFrUGFyYW1zID0gbmV3IERhdGVCcmVha1BhcmFtcygpO1xyXG4gICAgdGhpcy5kYXRlX2JyZWFrX2RhdGVtb2RlKGJyZWFrUGFyYW1zLCBkYXRlLCBmYWxzZSwgY29tcElkeCk7XHJcbiAgICBpZiAoYnJlYWtQYXJhbXMubW9udGggPiAwKVxyXG4gICAgICBicmVha1BhcmFtcy5tb250aCA9IGJyZWFrUGFyYW1zLm1vbnRoIC0gMTsgLy9tb250aCBpcyAwIGJhc2VkIGluIERhdGUgY2xhc3NcclxuXHJcbiAgICBpZiAoYnJlYWtQYXJhbXMueWVhciA9PSAwICYmIGJyZWFrUGFyYW1zLm1vbnRoID09IDAgJiYgYnJlYWtQYXJhbXMuZGF5ID09IDApXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgIHJldHVybiBuZXcgRGF0ZShicmVha1BhcmFtcy55ZWFyLCBicmVha1BhcmFtcy5tb250aCwgYnJlYWtQYXJhbXMuZGF5KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIGRhdGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgdGhlIHZhbHVlIHRvIGRpc3BsYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgZnJvbU5hdGl2ZURhdGVUb01nRGF0ZU51bWJlcihuYXRpdmVEYXRlOiBEYXRlLCBwaWM6IFBJQyk6IG51bWJlciB7XHJcbiAgICBsZXQgbnVtVmFsOiBudW1iZXI7XHJcbiAgICBsZXQgZGF0ZVBhcmFtczogRGF0ZUJyZWFrUGFyYW1zO1xyXG4gICAgbGV0IG1pbGxlbml1bTogbnVtYmVyID0gMDtcclxuICAgIGxldCB5ZWFyOiBudW1iZXIgPSBuYXRpdmVEYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSBuYXRpdmVEYXRlLmdldERhdGUoKTtcclxuICAgIGxldCBtb250aDogbnVtYmVyID0gbmF0aXZlRGF0ZS5nZXRNb250aCgpICsgMTtcclxuXHJcbiAgICAvLyBIZWJyZXcgWWVhclxyXG4gICAgaWYgKHBpYy5pc0hlYnJldygpKSB7XHJcbiAgICAgIGlmICh5ZWFyID4gMCkge1xyXG4gICAgICAgIGlmIChtaWxsZW5pdW0gPT09IDApXHJcbiAgICAgICAgICBtaWxsZW5pdW0gPSA1O1xyXG4gICAgICAgIHllYXIgKz0gbWlsbGVuaXVtICogMTAwMDtcclxuICAgICAgfVxyXG4gICAgICBudW1WYWwgPSAoSGVicmV3RGF0ZS5kYXRlaGViXzJfZCh5ZWFyLCBtb250aCwgZGF5KSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gdGhlIG5leHQgMiBsaW5lcyBzdXBwb3J0IDQueHggREQvTU0gcGljdHVyZXNcclxuICAgICAgaWYgKHllYXIgPT09IDApIHtcclxuICAgICAgICBkYXRlUGFyYW1zID0gdGhpcy5kYXRlX3N5cygpO1xyXG4gICAgICAgIHllYXIgPSBkYXRlUGFyYW1zLnllYXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG51bVZhbCA9IHRoaXMuZGF0ZV80X2NhbGVuZGVyKHllYXIsIG1vbnRoLCBkYXksIDAsIGZhbHNlKTsgICAgLy8gd2UgYXJlIGFkZGluZyBhIGxpdHRsZSBlbXB0eSBzcGFjZSB0byB0aGUgdmFyaWFibGUsIGJlY2F1c2Ugd2UgbWlnaHQgbGF0ZXJcclxuICAgIH1cclxuICAgIHJldHVybiBudW1WYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gZGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFRoZSBzb3VyY2UgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBmcm9tTmF0aXZlRGF0ZVRvTWdEYXRlKG5hdGl2ZURhdGU6IERhdGUsIHBpYzogUElDKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBsZXQgbnVtVmFsOiBudW1iZXIgPSBuYXRpdmVEYXRlID09IG51bGwgPyAwIDogdGhpcy5mcm9tTmF0aXZlRGF0ZVRvTWdEYXRlTnVtYmVyKG5hdGl2ZURhdGUsIHBpYyk7XHJcbiAgICBtZ051bS5OVU1fNF9MT05HKG51bVZhbCk7XHJcblxyXG4gICAgcmV0dXJuIG1nTnVtLnRvWE1McmVjb3JkKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIGRhdGUgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib3V0U3RyXCI+ICAgICAgICAgIFRoZSBtYXNrIHRvIGJlIHVzZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm91dF9sZW5cIj4gICAgICAgICBNYXNrIGxlbmd0aFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICAgICAgICAgICAgIFRoZSBwaWN1cmUgaW5mb3JtYXRpb25cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGVfcGljX1pfZWR0XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZ25vcmVfZHRfZm10XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgdG9fYV9waWNfZGF0ZW1vZGUob3V0U3RyOiBzdHJpbmcsIG91dF9sZW46IG51bWJlciwgZGF0ZTogbnVtYmVyLCBwaWM6IFBJQywgZGF0ZV9waWNfWl9lZHQ6IGJvb2xlYW4sIGlnbm9yZV9kdF9mbXQ6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgbGVuOiBudW1iZXI7XHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGRveTogbnVtYmVyID0gMDtcclxuICAgIGxldCBkb3c6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgeWVhcjogbnVtYmVyID0gMDtcclxuICAgIGxldCBtb250aDogbnVtYmVyID0gMDtcclxuICAgIGxldCBoZGF5OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGh5ZWFyOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGhtb250aDogbnVtYmVyID0gMDtcclxuICAgIGxldCBsZWFwOiBCb29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHA6IHN0cmluZ1tdO1xyXG4gICAgbGV0IG91dFZhbDogc3RyaW5nW10gPSBOU3RyaW5nLlRvQ2hhckFycmF5KG91dFN0cik7XHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IERhdGVCcmVha1BhcmFtcztcclxuICAgIGxldCBkYXRlTmFtZVBhcmFtczogRGF0ZU5hbWVQYXJhbXM7XHJcbiAgICBsZXQgb3V0SWR4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHN0ck91dDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICAvLyBJZiByZXN1bHQgb3ZlcmZsb3dzIHJldHVybiBidWZmZXIsIGZpbGwgd2l0aCBhc3Rlcml4cyBhbmQgYmFpbCBvdXRcclxuICAgIGlmIChwaWMuZ2V0TWFza1NpemUoKSA+IG91dF9sZW4pIHtcclxuICAgICAgZm9yICg7IGkgPCBvdXRfbGVuOyBpKyspXHJcbiAgICAgICAgb3V0VmFsW2ldID0gJyonO1xyXG4gICAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMob3V0VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB6ZXJvIGZpbGwgcmVxdWVzdGVkIGFuZCBkYXRlIHZhbHVlIGlzIHplcm8sIGZpbGwgaXQgYW5kIGJhaWwgb3V0XHJcbiAgICBvdXRfbGVuID0gbGVuID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiAhZGF0ZV9waWNfWl9lZHQpIHtcclxuICAgICAgZm9yICg7IGkgPCBvdXRfbGVuOyBpKyspXHJcbiAgICAgICAgb3V0VmFsW2ldID0gcGljLmdldFplcm9QYWQoKTtcclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKG91dFZhbCk7XHJcbiAgICB9XHJcbiAgICBpZiAocGljLmlzSGVicmV3KCkgJiYgKGRhdGUgPT09IDAgfHwgZGF0ZSA9PT0gMTAwMDAwMDAwMCkpIHtcclxuICAgICAgZm9yICg7IGkgPCBvdXRfbGVuOyBpKyspXHJcbiAgICAgICAgb3V0VmFsW2ldID0gJyAnO1xyXG4gICAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMob3V0VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBCcmVhayBkYXRhIGludG8gaXRzIGNvbXBvbmVudHNcclxuICAgIGJyZWFrUGFyYW1zID0gbmV3IERhdGVCcmVha1BhcmFtcyh5ZWFyLCBtb250aCwgZGF5LCBkb3ksIGRvdyk7XHJcbiAgICB0aGlzLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGUsIGlnbm9yZV9kdF9mbXQsIGNvbXBJZHgpO1xyXG4gICAgaWYgKHBpYy5pc0hlYnJldygpKSB7XHJcbiAgICAgIGxldCByZWZoZGF5OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4oaGRheSk7XHJcbiAgICAgIGxldCByZWZobW9udGg6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPihobW9udGgpO1xyXG4gICAgICBsZXQgcmVmaHllYXI6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPihoeWVhcik7XHJcbiAgICAgIGxlYXAgPSBIZWJyZXdEYXRlLmRhdGVoZWJfNF9kKGRhdGUsIHJlZmhkYXksIHJlZmhtb250aCwgcmVmaHllYXIpO1xyXG5cclxuICAgICAgaGRheSA9IHJlZmhkYXkudmFsdWU7XHJcbiAgICAgIGhtb250aCA9IHJlZmhtb250aC52YWx1ZTtcclxuICAgICAgaHllYXIgPSByZWZoeWVhci52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICB5ZWFyID0gYnJlYWtQYXJhbXMueWVhcjtcclxuICAgIG1vbnRoID0gYnJlYWtQYXJhbXMubW9udGg7XHJcbiAgICBkYXkgPSBicmVha1BhcmFtcy5kYXk7XHJcbiAgICBkb3kgPSBicmVha1BhcmFtcy5kb3k7XHJcbiAgICBkb3cgPSBicmVha1BhcmFtcy5kb3c7XHJcbiAgICBicmVha1BhcmFtcyA9IG51bGw7XHJcbiAgICB3aGlsZSAobGVuID4gMCkge1xyXG4gICAgICBsZXQgcmVmT3V0TGVuOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4ob3V0X2xlbik7XHJcbiAgICAgIHN3aXRjaCAob3V0VmFsW291dElkeF0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWTpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAyKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAyLCB5ZWFyLCAnMCcpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDI7XHJcbiAgICAgICAgICBsZW4gLT0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IWVlZWVk6XHJcbiAgICAgICAgICBpID0gSGVicmV3RGF0ZS5kYXRlaGViXzJfc3RyKG91dFZhbCwgb3V0SWR4LCBsZW4sIHJlZk91dExlbiwgNSwgaHllYXIsIHBpYy5pc1RyaW1lZCgpLCB0cnVlKTtcclxuICAgICAgICAgIG91dF9sZW4gPSByZWZPdXRMZW4udmFsdWU7XHJcbiAgICAgICAgICBvdXRJZHggKz0gaTtcclxuICAgICAgICAgIGxlbiAtPSBpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hMOlxyXG4gICAgICAgICAgaSA9IEhlYnJld0RhdGUuZGF0ZWhlYl9pXzJfaCgoaHllYXIgLyAxMDAwKSAlIDEwLCBvdXRWYWwsIG91dElkeCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICAgIG91dElkeCsrO1xyXG4gICAgICAgICAgbGVuLS07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSEREOlxyXG4gICAgICAgICAgaSA9IEhlYnJld0RhdGUuZGF0ZWhlYl8yX3N0cihvdXRWYWwsIG91dElkeCwgbGVuLCByZWZPdXRMZW4sIDIsIGhkYXksIHBpYy5pc1RyaW1lZCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICBvdXRfbGVuID0gcmVmT3V0TGVuLnZhbHVlO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IGk7XHJcbiAgICAgICAgICBsZW4gLT0gaTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWVlZOlxyXG4gICAgICAgICAgaWYgKHBpYy56ZXJvRmlsbCgpICYmIGRhdGUgPT09IDAgJiYgZGF0ZV9waWNfWl9lZHQpXHJcbiAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRJZHgsIHBpYy5nZXRaZXJvUGFkKCksIDQpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDQsIHllYXIsICcwJyk7XHJcbiAgICAgICAgICBvdXRJZHggKz0gNDtcclxuICAgICAgICAgIGxlbiAtPSA0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NRDpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAyKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAyLCBtb250aCwgJzAnKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTU1NOlxyXG4gICAgICAgICAgaWYgKHBpYy5pc0hlYnJldygpKSB7XHJcbiAgICAgICAgICAgIGlmIChsZWFwICYmIGhtb250aCA9PT0gNilcclxuICAgICAgICAgICAgICBobW9udGggPSAxNDtcclxuICAgICAgICAgICAgbGV0IG1vbnRoTmFtZXM6IHN0cmluZ1tdID0gSGVicmV3RGF0ZS5HZXRMb2NhbE1vbnRocygpO1xyXG4gICAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShtb250aE5hbWVzW2htb250aF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBtb250aFN0cjogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLk1PTlRIU19QVFIpO1xyXG4gICAgICAgICAgICBsZXQgbW9udGhOYW1lczogc3RyaW5nW10gPSBEYXRlVXRpbC5nZXRMb2NhbE1vbnRocyhtb250aFN0cik7XHJcbiAgICAgICAgICAgIHAgPSBOU3RyaW5nLlRvQ2hhckFycmF5KG1vbnRoTmFtZXNbbW9udGhdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbmV3IERhdGVOYW1lUGFyYW1zKG91dFZhbCwgb3V0SWR4LCBsZW4pO1xyXG4gICAgICAgICAgb3V0X2xlbiAtPSB0aGlzLmRhdGVfaV8yX25tKGRhdGVOYW1lUGFyYW1zLCBwLCBwaWMuaXNUcmltZWQoKSk7XHJcbiAgICAgICAgICBvdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHg7XHJcbiAgICAgICAgICBsZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW47XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfREQ6XHJcbiAgICAgICAgICBsZXQgaXNaZXJvOiBib29sZWFuID0gcGljLnplcm9GaWxsKCk7XHJcbiAgICAgICAgICBpZiAoaXNaZXJvICYmIGRhdGUgPT09IDAgJiYgZGF0ZV9waWNfWl9lZHQpXHJcbiAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRJZHgsIHBpYy5nZXRaZXJvUGFkKCksIDIpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDIsIGRheSwgJzAnKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfREREOlxyXG4gICAgICAgICAgaWYgKHBpYy56ZXJvRmlsbCgpICYmIGRhdGUgPT09IDAgJiYgZGF0ZV9waWNfWl9lZHQpXHJcbiAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRJZHgsIHBpYy5nZXRaZXJvUGFkKCksIDMpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDMsIGRveSwgJzAnKTtcclxuICAgICAgICAgIGxlbiAtPSAzO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfRERERDpcclxuICAgICAgICAgIGkgPSB0aGlzLmRhdGVfMl9EREREKGRheSwgb3V0VmFsLCBvdXRJZHgsIGxlbiwgcGljLmlzVHJpbWVkKCkpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IGk7XHJcbiAgICAgICAgICBvdXRfbGVuICs9IGkgLSA0O1xyXG4gICAgICAgICAgbGVuIC09IDQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfVzpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAxKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAxLCBkb3csICcwJyk7XHJcbiAgICAgICAgICBsZW4tLTtcclxuICAgICAgICAgIG91dElkeCsrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1dXVzpcclxuICAgICAgICAgIGlmIChwaWMuaXNIZWJyZXcoKSkge1xyXG4gICAgICAgICAgICBsZXQgZG93c05hbWVzOiBzdHJpbmdbXSA9IEhlYnJld0RhdGUuR2V0TG9jYWxEb3dzKCk7XHJcbiAgICAgICAgICAgIHAgPSBOU3RyaW5nLlRvQ2hhckFycmF5KGRvd3NOYW1lc1tkb3ddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgZGF5U3RyOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZyhNc2dJbnRlcmZhY2UuREFZU19QVFIpO1xyXG4gICAgICAgICAgICBsZXQgZGF5TmFtZXM6IHN0cmluZ1tdID0gRGF0ZVV0aWwuZ2V0TG9jYWxEYXlzKGRheVN0cik7XHJcbiAgICAgICAgICAgIHAgPSBOU3RyaW5nLlRvQ2hhckFycmF5KGRheU5hbWVzW2Rvd10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBuZXcgRGF0ZU5hbWVQYXJhbXMob3V0VmFsLCBvdXRJZHgsIGxlbik7XHJcbiAgICAgICAgICBvdXRfbGVuIC09IHRoaXMuZGF0ZV9pXzJfbm0oZGF0ZU5hbWVQYXJhbXMsIHAsIHBpYy5pc1RyaW1lZCgpKTtcclxuICAgICAgICAgIG91dElkeCA9IGRhdGVOYW1lUGFyYW1zLm91dElkeDtcclxuICAgICAgICAgIGxlbiA9IGRhdGVOYW1lUGFyYW1zLmxlbjtcclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbnVsbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19CQjogLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgLy8gSmFwYW5lc2UgZGF5IG9mIHRoZSB3ZWVrXHJcbiAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShVdGlsRGF0ZUpwbi5nZXRTdHJEb3coZG93KSk7XHJcbiAgICAgICAgICBzdHJPdXQgPSBudWxsO1xyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBuZXcgRGF0ZU5hbWVQYXJhbXMob3V0VmFsLCBvdXRJZHgsIGxlbik7XHJcbiAgICAgICAgICBzdHJPdXQgPSB0aGlzLmRhdGVfaV8yX25tX2J5dGVtb2RlKHN0ck91dCwgZGF0ZU5hbWVQYXJhbXMsIE5TdHJpbmcuRnJvbUNoYXJzKHApLCBvdXRfbGVuKTtcclxuICAgICAgICAgIG91dFZhbCA9IG5ldyBBcnJheShzdHJPdXQubGVuZ3RoKTtcclxuICAgICAgICAgIE5TdHJpbmcuQ29weVRvKHN0ck91dCwgMCwgb3V0VmFsLCAwLCBzdHJPdXQubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICBvdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHg7XHJcbiAgICAgICAgICBsZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW47XHJcbiAgICAgICAgICBzdHJPdXQgPSBudWxsO1xyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZMTpcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSlkyOlxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KWTQ6XHJcbiAgICAgICAgICAvLyBKYXBhbmVzZSB0aGUgbmFtZSBvZiBhbiBlcmFcclxuICAgICAgICAgIGxldCBzdHJOdW06IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgICBpZiAob3V0VmFsW291dElkeF0uY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KWTEpXHJcbiAgICAgICAgICAgIHN0ck51bSA9IFV0aWxEYXRlSnBuLmdldEluc3RhbmNlKCkuZGF0ZV9qcG5feXJfMl9hKHllYXIsIGRveSwgZmFsc2UpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBzdHJOdW0gPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmRhdGVfanBuX3lyXzJfYSh5ZWFyLCBkb3ksIHRydWUpO1xyXG4gICAgICAgICAgc3RyT3V0ID0gbnVsbDtcclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbmV3IERhdGVOYW1lUGFyYW1zKG91dFZhbCwgb3V0SWR4LCBsZW4pO1xyXG4gICAgICAgICAgc3RyT3V0ID0gdGhpcy5kYXRlX2lfMl9ubV9ieXRlbW9kZShzdHJPdXQsIGRhdGVOYW1lUGFyYW1zLCBzdHJOdW0sIG91dF9sZW4pO1xyXG4gICAgICAgICAgb3V0VmFsID0gbnVsbDtcclxuICAgICAgICAgIG91dFZhbCA9IG5ldyBBcnJheShzdHJPdXQubGVuZ3RoKTtcclxuICAgICAgICAgIE5TdHJpbmcuQ29weVRvKHN0ck91dCwgMCwgb3V0VmFsLCAwLCBzdHJPdXQubGVuZ3RoKTtcclxuICAgICAgICAgIG91dElkeCA9IGRhdGVOYW1lUGFyYW1zLm91dElkeDtcclxuICAgICAgICAgIGxlbiA9IGRhdGVOYW1lUGFyYW1zLmxlbjtcclxuICAgICAgICAgIHN0ck91dCA9IG51bGw7XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWUo6XHJcbiAgICAgICAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiBkYXRlX3BpY19aX2VkdClcclxuICAgICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dElkeCwgcGljLmdldFplcm9QYWQoKSwgMik7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMiwgVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95ZWFyX29mcyh5ZWFyLCBkb3kpLCAnMCcpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDI7XHJcbiAgICAgICAgICBsZW4gLT0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBvdXRJZHgrKztcclxuICAgICAgICAgIGxlbi0tO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChvdXRfbGVuIDwgb3V0VmFsLmxlbmd0aClcclxuICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dF9sZW4sICcgJywgb3V0VmFsLmxlbmd0aCAtIG91dF9sZW4pO1xyXG5cclxuICAgIHJldHVybiBOU3RyaW5nLkZyb21DaGFycyhvdXRWYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJyZWFrIGEgZGF0ZSBpbnRvIFllYXIsIE1vbnRoLCBEYXkgaW4gbW9udGgsIERheSBpbiB5ZWFyIGFuZCBEYXkgaW4gd2Vla1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZGF0ZV9icmVha19kYXRlbW9kZShicmVha1BhcmFtczogRGF0ZUJyZWFrUGFyYW1zLCBkYXRlOiBudW1iZXIsIGlnbm9yZV9kdF9mbXQ6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIGxldCB5ZWFyOiBudW1iZXIgPSBicmVha1BhcmFtcy55ZWFyO1xyXG4gICAgbGV0IG1vbnRoOiBudW1iZXIgPSBicmVha1BhcmFtcy5tb250aDtcclxuICAgIGxldCBkYXk6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRheTtcclxuICAgIGxldCBkb3k6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRveTtcclxuICAgIGxldCBkb3c6IG51bWJlciA9IGJyZWFrUGFyYW1zLmRvdztcclxuXHJcbiAgICBpZiAoZGF0ZSA8PSAwKSB7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRheSA9IDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRveSA9IDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRvdyA9IDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLnllYXIgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5tb250aCA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZG93ID0gZGF0ZSAlIDcgKyAxO1xyXG4gICAgICBkYXRlID0gZGF0ZSAtIDE7XHJcbiAgICAgIGxldCBjZW50NDogbnVtYmVyID0gTWF0aC5mbG9vcihkYXRlIC8gUElDSW50ZXJmYWNlLkRBWVNJTkZPVVJDRU5UKTtcclxuICAgICAgZGF0ZSA9IGRhdGUgLSBjZW50NCAqIFBJQ0ludGVyZmFjZS5EQVlTSU5GT1VSQ0VOVDtcclxuICAgICAgbGV0IGNlbnQ6IG51bWJlciA9IE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5DRU5UVVJZKTtcclxuICAgICAgaWYgKGNlbnQgPiAzKSB7XHJcbiAgICAgICAgY2VudCA9IDM7XHJcbiAgICAgIH1cclxuICAgICAgZGF0ZSA9IGRhdGUgLSBjZW50ICogUElDSW50ZXJmYWNlLkRBWVNJTkNFTlRVUlk7XHJcbiAgICAgIGxldCB5ZWFyNDogbnVtYmVyID0gTWF0aC5mbG9vcihkYXRlIC8gUElDSW50ZXJmYWNlLkRBWVNJTkZPVVJZRUFSKTtcclxuICAgICAgZGF0ZSA9IGRhdGUgLSB5ZWFyNCAqIFBJQ0ludGVyZmFjZS5EQVlTSU5GT1VSWUVBUjtcclxuICAgICAgeWVhciA9IE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5ZRUFSKTtcclxuICAgICAgaWYgKHllYXIgPiAzKSB7XHJcbiAgICAgICAgeWVhciA9IDM7XHJcbiAgICAgIH1cclxuICAgICAgZGF0ZSA9IGRhdGUgLSB5ZWFyICogUElDSW50ZXJmYWNlLkRBWVNJTllFQVI7XHJcbiAgICAgIHllYXIgPSBjZW50NCAqIDQwMCArIGNlbnQgKiAxMDAgKyB5ZWFyNCAqIDQgKyB5ZWFyICsgMTtcclxuICAgICAgbGV0IGxlYXB5ZWFyOiBudW1iZXIgPSAwO1xyXG4gICAgICBpZiAoeWVhciAlIDQgPT09IDApIHtcclxuICAgICAgICBpZiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKSB7XHJcbiAgICAgICAgICBsZWFweWVhciA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWlnbm9yZV9kdF9mbXQgJiYgdGhpcy5fZW52aXJvbm1lbnQuR2V0RGF0ZU1vZGUoY29tcElkeCkgPT09ICdCJykge1xyXG4gICAgICAgIHllYXIgPSB5ZWFyICsgUElDSW50ZXJmYWNlLkRBVEVfQlVEREhJU1RfR0FQO1xyXG4gICAgICB9XHJcbiAgICAgIG1vbnRoID0gKE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5NT05USCkgKyAxKTtcclxuICAgICAgZGF5ID0gUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYlttb250aF07XHJcbiAgICAgIGlmIChsZWFweWVhciA+IDApIHtcclxuICAgICAgICBpZiAobW9udGggPiAxKSB7XHJcbiAgICAgICAgICBkYXkgPSBkYXkgKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGRhdGUgPj0gZGF5KSB7XHJcbiAgICAgICAgbW9udGggPSBtb250aCArIDE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgZGF5ID0gUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYlttb250aCAtIDFdO1xyXG4gICAgICAgIGlmIChsZWFweWVhciA+IDApIHtcclxuICAgICAgICAgIGlmIChtb250aCA+IDIpIHtcclxuICAgICAgICAgICAgZGF5ID0gZGF5ICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZGF5ID0gZGF0ZSAtIGRheSArIDE7XHJcbiAgICAgIGRveSA9IGRhdGUgKyAxO1xyXG4gICAgICBicmVha1BhcmFtcy55ZWFyID0geWVhcjtcclxuICAgICAgYnJlYWtQYXJhbXMubW9udGggPSBtb250aDtcclxuICAgICAgYnJlYWtQYXJhbXMuZGF5ID0gZGF5O1xyXG4gICAgICBicmVha1BhcmFtcy5kb3kgPSBkb3k7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRvdyA9IGRvdztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYWxwaGEgc3RyaW5nIGZyb20gaW50IHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clwiPiAgICAgdGhlIG91dHB1dCBzdHJpbmcgKGFzIGFuIGNoYXIgYXJyYXkpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJQb3NcIj4gIHN0YXJ0aW5nIHBvc2l0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZW5cIj4gICAgIHN0cmluZyBsZW5ndGhcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5cIj4gICAgICAgdGhlIG51bWJlciB0byBjb252ZXJ0XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZWFkXCI+ICAgIGxlYWRpbmcgY2hhcmFjdGVyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVzdWx0IHN0cmluZyBsZW5ndGhcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW50XzJfYShzdHI6IHN0cmluZ1tdLCBzdHJQb3M6IG51bWJlciwgbGVuOiBudW1iZXIsIG46IG51bWJlciwgbGVhZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBuZWc6IGJvb2xlYW4gPSBuIDwgMDtcclxuXHJcbiAgICBpZiAobGVuIDw9IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBuID0gTWF0aC5hYnMobik7XHJcbiAgICBsZXQgcG9zOiBudW1iZXIgPSBsZW47XHJcblxyXG4gICAgZG8ge1xyXG4gICAgICBzdHJbc3RyUG9zICsgKHBvcyA9IHBvcyAtIDEpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoNDggKyBuICUgMTApO1xyXG4gICAgICBuID0gTWF0aC5mbG9vcihuIC8gMTApO1xyXG4gICAgfVxyXG4gICAgd2hpbGUgKHBvcyA+IDAgJiYgbiA+IDApO1xyXG5cclxuICAgIGlmIChuZWcgJiYgcG9zID4gMCkge1xyXG4gICAgICBzdHJbc3RyUG9zICsgKHBvcyA9IHBvcyAtIDEpXSA9ICctJy8qJy0nKi87XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5saWJfYV9maWxsKHN0ciwgc3RyUG9zLCBsZW4sIHBvcywgbGVhZC5jaGFyQ29kZUF0KDApKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmlsbCB0aGUgY2hhciBhcnJheSBmb3IgdGhlIGNvbnZlcnRpbmcgb2YgaW50LT5zdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyXCI+ICAgICB0aGUgb3V0cHV0IHN0cmluZyAoYXMgYW4gY2hhciBhcnJheSlcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clBvc1wiPiAgc3RhcnRpbmcgcG9zaXRpb25cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxlblwiPiAgICAgc3RyaW5nIGxlbmd0aFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGVhZFwiPiAgICBsZWFkaW5nIGNoYXJhY3RlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHJlc3VsdCBzdHJpbmcgbGVuZ3RoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGxpYl9hX2ZpbGwoc3RyOiBzdHJpbmdbXSwgc3RyUG9zOiBudW1iZXIsIGxlbjogbnVtYmVyLCBwb3M6IG51bWJlciwgbGVhZDogbnVtYmVyKTogbnVtYmVyIHtcclxuXHJcbiAgICBpZiAobGVhZCA9PT0gMCkge1xyXG4gICAgICBsZW4gPSBsZW4gLSBwb3M7XHJcblxyXG4gICAgICBpZiAobGVuID4gMCAmJiBwb3MgPiAwKSB7XHJcbiAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbWNweShzdHIsIHN0clBvcywgc3RyLCBwb3MsIGxlbik7XHJcbiAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChzdHIsIHN0clBvcyArIGxlbiwgJyAnLCAvKicgJyovcG9zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChwb3MgPiAwKSB7XHJcbiAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChzdHIsIHN0clBvcywgU3RyaW5nLmZyb21DaGFyQ29kZShsZWFkKSwgcG9zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxlbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IGluZGV4IHRvIE5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0ZU5hbWVQYXJhbXNcIj4gIG91dHB1dCBzdGluZyBkZXRhaWxzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJubVwiPiAgICAgICAgICAgICAgbmFtZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidHJpbVwiPiAgICAgICAgICAgIG91dHB1dCBzdHJpbmcgc2hvdWxkIGJlIHRyaW1lZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGRhdGVfaV8yX25tKGRhdGVOYW1lUGFyYW1zOiBEYXRlTmFtZVBhcmFtcywgbm06IHN0cmluZ1tdLCB0cmltOiBib29sZWFuKTogbnVtYmVyIHtcclxuXHJcbiAgICBsZXQgbjogbnVtYmVyID0gdGhpcy5kYXRlX21za19jbnQoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIDxudW1iZXI+ZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIGxldCBsOiBudW1iZXI7XHJcbiAgICBpZiAodHJpbSkge1xyXG4gICAgICBsID0gTWVtb3J5VXRpbC5tZW1fdHJpbShubSwgMCwgbik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbCA9IG47XHJcbiAgICB9XHJcbiAgICBsID0gTWF0aC5taW4obCwgZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIG5tLCAwLCBsKTtcclxuICAgIGRhdGVOYW1lUGFyYW1zLm91dElkeCA9IGRhdGVOYW1lUGFyYW1zLm91dElkeCArIGw7XHJcbiAgICBkYXRlTmFtZVBhcmFtcy5sZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW4gLSBuO1xyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBUcmltZWQgPyBKdW1wIG90aGVyIHRyaW1lZCBtYXNrIDogbm90aGluZ1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICBuID0gbiAtIGw7XHJcblxyXG4gICAgaWYgKG4gPiAwKSB7XHJcbiAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIGRhdGVOYW1lUGFyYW1zLm91dFZhbCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4ICsgbiwgZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIH1cclxuICAgIHJldHVybiA8bnVtYmVyPm47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gIC8vLyAgIENvbnZlcnQgaW5kZXggdG8gTmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJPdXRcIj4gICAgICAgICAgb3V0cHV0IHN0aW5nIChvcmlnaW5hbClcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGVOYW1lUGFyYW1zXCI+ICBvdXRwdXQgc3RpbmcgZGV0YWlsc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyTm1cIj4gICAgICAgICAgIG5hbWUgd2hpY2ggd2lsbCBiZSBlbWJlZGRlZCBpbiBvdXRwdXQgc3RyaW5nXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpbnRPdXRMZW5cIj4gICAgICAgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgdGhlIG91dHB1dCBzdHJpbmdcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+ICAgICAgICAgICAgICAgICBvdXRwdXQgc3RpbmcgKHByb2Nlc3NlZClcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZGF0ZV9pXzJfbm1fYnl0ZW1vZGUoc3RyT3V0OiBzdHJpbmcsIGRhdGVOYW1lUGFyYW1zOiBEYXRlTmFtZVBhcmFtcywgc3RyTm06IHN0cmluZywgaW50T3V0TGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGludE1za0NudDogbnVtYmVyID0gdGhpcy5kYXRlX21za19jbnQoZGF0ZU5hbWVQYXJhbXMub3V0VmFsLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgsIDxudW1iZXI+ZGF0ZU5hbWVQYXJhbXMubGVuKTtcclxuICAgIGxldCBzdHJXb3JrOiBzdHJpbmcgPSBOU3RyaW5nLkZyb21DaGFycyhkYXRlTmFtZVBhcmFtcy5vdXRWYWwpO1xyXG5cclxuICAgIHN0cldvcmsgPSBzdHJXb3JrLnN1YnN0cigwLCBkYXRlTmFtZVBhcmFtcy5vdXRJZHgpO1xyXG5cclxuICAgIGxldCBpbnRPZnM6IG51bWJlciA9IFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0cldvcmspO1xyXG4gICAgc3RyTm0gPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIoc3RyTm0sIGludE1za0NudCk7XHJcbiAgICBzdHJPdXQgPSBVdGlsU3RyQnl0ZU1vZGUucmVwQihOU3RyaW5nLkZyb21DaGFycyhkYXRlTmFtZVBhcmFtcy5vdXRWYWwpLCBzdHJObSwgaW50T2ZzICsgMSwgaW50TXNrQ250KTtcclxuXHJcbiAgICBkYXRlTmFtZVBhcmFtcy5vdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHggKyBzdHJObS5sZW5ndGg7XHJcbiAgICBkYXRlTmFtZVBhcmFtcy5sZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW4gLSBpbnRNc2tDbnQ7XHJcbiAgICBpbnRPdXRMZW4gPSBpbnRPdXRMZW4gLSBpbnRNc2tDbnQ7XHJcbiAgICByZXR1cm4gc3RyT3V0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFJldHVybiBOIG9mIGNvbnNlY3V0aXZlIE1hc2sgY2hhcmFjdGVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtc2tcIj4gICAgIHRoZSBtYXNrIHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtc2tQb3NcIj4gIGluZGV4IG9mIGZpcnN0IGNoYXIgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxlblwiPiAgICAgbGVuZ3RoIG9mIHRoZSBtYXNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBudW1iZXIgb2YgY29uc2VjdXRpdmUgTWFzayBjaGFyYWN0ZXJzXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGRhdGVfbXNrX2NudChtc2s6IHN0cmluZ1tdLCBtc2tQb3M6IG51bWJlciwgbGVuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGM6IHN0cmluZyA9IG1za1ttc2tQb3MrK107XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMTtcclxuICAgIHdoaWxlICg8bnVtYmVyPmkgPCBsZW4pIHtcclxuICAgICAgaWYgKG1za1ttc2tQb3NdICE9PSBjKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgbXNrUG9zID0gbXNrUG9zICsgMTtcclxuICAgICAgaSA9IGkgKyAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tcHV0ZSBEYXkgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBkYXRlXzJfRERERChkYXk6IG51bWJlciwgb3V0VmFsOiBzdHJpbmdbXSwgb3V0SWR4OiBudW1iZXIsIGxlbjogbnVtYmVyLCB0cmltOiBib29sZWFuKTogbnVtYmVyIHtcclxuXHJcblxyXG4gICAgbGV0IHJldDogbnVtYmVyID0gNDtcclxuICAgIGxldCBleHQ6IHN0cmluZ1tdO1xyXG5cclxuICAgIGlmIChkYXkgPiA5KSB7XHJcbiAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMiwgZGF5LCAoPG51bWJlcj4wKS50b1N0cmluZygpKTtcclxuICAgICAgb3V0SWR4ICs9IDI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRyaW0pIHtcclxuICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KG91dFZhbCwgb3V0SWR4LCBvdXRWYWwsIG91dElkeCArIDEsIGxlbiAtIDEpO1xyXG4gICAgICAgIC8qMTctTWF5LTkwKi9cclxuICAgICAgICByZXQtLTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyAqKG91dCsrKSA9ICcgJzsgLy8gT3JpZ2luYWwgTGluZVxyXG4gICAgICAgIG91dFZhbFtvdXRJZHgrK10gPSAnICc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAxLCBkYXksICg8bnVtYmVyPjApLnRvU3RyaW5nKCkpO1xyXG4gICAgICBvdXRJZHgrKztcclxuICAgIH1cclxuICAgIHN3aXRjaCAoZGF5KSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgY2FzZSAyMTpcclxuICAgICAgY2FzZSAzMTpcclxuICAgICAgICBleHQgPSBOU3RyaW5nLlRvQ2hhckFycmF5KFwic3RcIik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgIGNhc2UgMjI6XHJcbiAgICAgICAgZXh0ID0gTlN0cmluZy5Ub0NoYXJBcnJheShcIm5kXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAzOlxyXG4gICAgICBjYXNlIDIzOlxyXG4gICAgICAgIGV4dCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoXCJyZFwiKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZXh0ID0gTlN0cmluZy5Ub0NoYXJBcnJheShcInRoXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgb3V0VmFsW291dElkeCsrXSA9IGV4dFswXTtcclxuICAgIG91dFZhbFtvdXRJZHhdID0gZXh0WzFdO1xyXG5cclxuICAgIHJldHVybiAocmV0KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIHRpbWUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgdGhlIHZhbHVlIHRvIGRpc3BsYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgZnJvbU1nVGltZVRvTmF0aXZlVGltZShkYXRhU3RyOiBzdHJpbmcsIHBpYzogUElDKTogRGF0ZSB7XHJcbiAgICBsZXQgdGltZTogbnVtYmVyID0gbmV3IE5VTV9UWVBFKGRhdGFTdHIpLk5VTV8yX1VMT05HKCk7XHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IFRpbWVCcmVha1BhcmFtcyA9IG5ldyBUaW1lQnJlYWtQYXJhbXMoKTtcclxuXHJcbiAgICBEaXNwbGF5Q29udmVydG9yLnRpbWVfYnJlYWsoYnJlYWtQYXJhbXMsIHRpbWUpO1xyXG5cclxuICAgIGxldCBuYXRpdmVEdDogRGF0ZSA9IG5ldyBEYXRlKDApO1xyXG5cclxuICAgIGxldCBtYXNrU3RyID0gcGljLmdldE1hc2soKTtcclxuICAgIGxldCBvdXRWYWw6IHN0cmluZ1tdID0gTlN0cmluZy5Ub0NoYXJBcnJheShtYXNrU3RyKTtcclxuICAgIGxldCBsZW4gPSBwaWMuZ2V0TWFza1NpemUoKTtcclxuICAgIGxldCBvdXRJZHggPSAwO1xyXG5cclxuICAgIHdoaWxlIChsZW4gPiAwKSB7XHJcbiAgICAgIHN3aXRjaCAob3V0VmFsW291dElkeF0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSEgpOlxyXG4gICAgICAgICAgbmF0aXZlRHQuc2V0SG91cnMoYnJlYWtQYXJhbXMuaG91cik7XHJcbiAgICAgICAgICBvdXRJZHggKz0gMjtcclxuICAgICAgICAgIGxlbiAtPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOlxyXG4gICAgICAgICAgbmF0aXZlRHQuc2V0TWludXRlcyhicmVha1BhcmFtcy5taW51dGUpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDI7XHJcbiAgICAgICAgICBsZW4gLT0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1NTKTpcclxuICAgICAgICAgIG5hdGl2ZUR0LnNldFNlY29uZHMoYnJlYWtQYXJhbXMuc2Vjb25kKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgb3V0SWR4ICsrO1xyXG4gICAgICAgICAgbGVuIC0tO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5hdGl2ZUR0OyAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlIHRpbWUgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQXNjaWlTdHJcIj4gICAgICAgIFRoZSBtYXNrIHRvIGJlIHVzZWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQXNjaWlMXCI+ICAgICAgICAgIE1hc2sgbGVuZ3RoPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPiAgICAgICAgICAgICBUaGUgcGljdXJlIGluZm9ybWF0aW9uPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRpbWVfcGljX1pfZWR0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNlY29uZHNcIj4vIG1pbGxpU2Vjb25kcyBmbGFnPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIHRpbWVfMl9hX3BpYyhBc2NpaVN0cjogc3RyaW5nLCBBc2NpaUw6IG51bWJlciwgdGltZTogbnVtYmVyLCBwaWM6IFBJQywgdGltZV9waWNfWl9lZHQ6IGJvb2xlYW4sIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IHN0cmluZyB7XHJcblxyXG4gICAgLy8gT3JpZ2luYWwgdmFyc1xyXG4gICAgbGV0IGhvdXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWludXRlOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHNlY29uZDogbnVtYmVyID0gMDtcclxuICAgIGxldCBtaWxsaXNlYzogbnVtYmVyID0gMDtcclxuXHJcbiAgICBsZXQgQXNjaWk6IHN0cmluZ1tdID0gTlN0cmluZy5Ub0NoYXJBcnJheShBc2NpaVN0cik7XHJcbiAgICBsZXQgYnJlYWtQYXJhbXM6IFRpbWVCcmVha1BhcmFtcyA9IG5ldyBUaW1lQnJlYWtQYXJhbXMoaG91ciwgbWludXRlLCBzZWNvbmQpO1xyXG4gICAgbGV0IHRpbWVTZWM6IG51bWJlcjtcclxuICAgIGlmIChtaWxsaVNlY29uZHMpIHtcclxuICAgICAgdGltZVNlYyA9IE1hdGguZmxvb3IodGltZSAvIDEwMDApO1xyXG4gICAgICBtaWxsaXNlYyA9IHRpbWUgLSB0aW1lU2VjICogMTAwMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aW1lU2VjID0gdGltZTtcclxuICAgIH1cclxuXHJcbiAgICBEaXNwbGF5Q29udmVydG9yLnRpbWVfYnJlYWsoYnJlYWtQYXJhbXMsIHRpbWVTZWMpO1xyXG4gICAgaG91ciA9IGJyZWFrUGFyYW1zLmhvdXI7XHJcbiAgICBtaW51dGUgPSBicmVha1BhcmFtcy5taW51dGU7XHJcbiAgICBzZWNvbmQgPSBicmVha1BhcmFtcy5zZWNvbmQ7XHJcblxyXG4gICAgLy8gSWYgYXNjaWkgcmVwcmVzZW50YXRpb24gb3ZlcmZsb3dzIG91dHB1dCBidWZmZXJcclxuICAgIC8vIGZpbGwgd2l0aCAnKicgYW5kIGJhaWwgb3V0XHJcblxyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nO1xyXG4gICAgaWYgKHBpYy5nZXRNYXNrU2l6ZSgpID4gQXNjaWlMKSB7XHJcbiAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoQXNjaWksIDAsICcqJywgLyonKicqL0FzY2lpTCk7XHJcbiAgICAgIHJlc3VsdCA9IE5TdHJpbmcuRnJvbUNoYXJzKEFzY2lpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAocGljLnplcm9GaWxsKCkpIHtcclxuICAgICAgICBpZiAodGltZVNlYyA9PT0gMCAmJiAoIW1pbGxpU2Vjb25kcyB8fCBtaWxsaXNlYyA9PT0gMCkpIHtcclxuICAgICAgICAgIGlmICh0aW1lX3BpY19aX2VkdCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpbnR4OiBudW1iZXIgPSAwOyBpbnR4IDwgcGljLmdldE1hc2tTaXplKCk7IGludHggPSBpbnR4ICsgMSkge1xyXG4gICAgICAgICAgICAgIGlmIChBc2NpaVtpbnR4XSA8PSAnXFx1MDAxZicpIHtcclxuICAgICAgICAgICAgICAgIEFzY2lpW2ludHhdID0gcGljLmdldFplcm9QYWQoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzdWx0ID0gTlN0cmluZy5Gcm9tQ2hhcnMoQXNjaWkpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChBc2NpaSwgMCwgcGljLmdldFplcm9QYWQoKSwgcGljLmdldE1hc2tTaXplKCkpO1xyXG4gICAgICAgICAgcmVzdWx0ID0gTlN0cmluZy5Gcm9tQ2hhcnMoQXNjaWkpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IEk6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBhbTogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IGxlbjogbnVtYmVyID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICAgIGxldCBIb3VySTogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgICB3aGlsZSAoSSA8IGxlbikge1xyXG4gICAgICAgIHN3aXRjaCAoQXNjaWlbSV0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ISCk6XHJcbiAgICAgICAgICAgIEhvdXJJID0gSTtcclxuICAgICAgICAgICAgSSArPSAyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOlxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2EoQXNjaWksIEksIDIsIG1pbnV0ZSwgJzAnKTtcclxuICAgICAgICAgICAgSSArPSAyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1NTKTpcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKEFzY2lpLCBJLCAyLCBzZWNvbmQsICcwJyk7XHJcbiAgICAgICAgICAgIEkgKz0gMjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NUyk6XHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShBc2NpaSwgSSwgMywgbWlsbGlzZWMsICcwJyk7XHJcbiAgICAgICAgICAgIEkgKz0gMztcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19QTSk6XHJcbiAgICAgICAgICAgIGFtID0gMTtcclxuICAgICAgICAgICAgbGV0IHRtcEhvdXI6IG51bWJlciA9IGhvdXIgJSAyNDtcclxuICAgICAgICAgICAgaWYgKHRtcEhvdXIgPCAxMiB8fCB0bXBIb3VyID09PSAwKVxyXG4gICAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoQXNjaWksIEksIE5TdHJpbmcuVG9DaGFyQXJyYXkoXCJhbVwiKSwgMCwgMik7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KEFzY2lpLCBJLCBOU3RyaW5nLlRvQ2hhckFycmF5KFwicG1cIiksIDAsIDIpO1xyXG4gICAgICAgICAgICBJICs9IDI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIEkrKztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChIb3VySSA+PSAwKSB7XHJcbiAgICAgICAgaWYgKGFtID4gMCkge1xyXG4gICAgICAgICAgaG91ciA9IGhvdXIgJSAyNDtcclxuICAgICAgICAgIGlmIChob3VyID09PSAwKSB7XHJcbiAgICAgICAgICAgIGhvdXIgPSAxMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBob3VyID0gaG91ciAlIDEyO1xyXG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIGhvdXIgPSAxMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmludF8yX2EoQXNjaWksIEhvdXJJLCAyLCBob3VyLCAoYW0gIT09IDAgJiYgaG91ciA8IDEwKSA/ICcgJyA6IC8qJyAnKi8nMCcvKicwJyovKTtcclxuICAgICAgfVxyXG4gICAgICByZXN1bHQgPSBOU3RyaW5nLkZyb21DaGFycyhBc2NpaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJyZWFrIHRpbWUgaW50byBpdHMgY29tcG9uZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIHRpbWVfYnJlYWsoYnJlYWtQYXJhbXM6IFRpbWVCcmVha1BhcmFtcywgdGltZTogbnVtYmVyKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRpbWUgPD0gMCkge1xyXG4gICAgICBicmVha1BhcmFtcy5zZWNvbmQgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5taW51dGUgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5ob3VyID0gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBicmVha1BhcmFtcy5ob3VyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XHJcbiAgICAgIHRpbWUgPSB0aW1lIC0gYnJlYWtQYXJhbXMuaG91ciAqIDM2MDA7XHJcbiAgICAgIGJyZWFrUGFyYW1zLm1pbnV0ZSA9IE1hdGguZmxvb3IodGltZSAvIDYwKTtcclxuICAgICAgYnJlYWtQYXJhbXMuc2Vjb25kID0gdGltZSAtIGJyZWFrUGFyYW1zLm1pbnV0ZSAqIDYwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGEgbG9naWNhbCB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFwiMFwiIGZvciBmYWxzZSBvciBcIjFcIiBmb3IgdHJ1ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhblxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmcm9tTWdMb2dpY2FsVG9OYXRpdmVMb2dpY2FsKGRhdGFTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBuYXRpdmVWYWw6IGJvb2xlYW47XHJcbiAgICBuYXRpdmVWYWwgPSAoZGF0YVN0ci5jaGFyQXQoMCkgPT09ICcxJykgPyB0cnVlIDogZmFsc2U7XHJcbiAgICByZXR1cm4gbmF0aXZlVmFsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIG1nIHN0cmluZyBmb3IgYSBsb2dpY2FsIHZhbHVlIGFjY29yZGluZyB0byB0aGUgYm9vbGVhbiB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsXCI+ICBib29sZWFuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdHJpbmdcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZnJvbU5hdGl2ZUxvZ2ljYWxUb01nTG9naWNhbChkaXNwVmFsOiBib29sZWFuKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZztcclxuICAgIG1nVmFsID0gKGRpc3BWYWwgPT09IHRydWUpID8gXCIxXCIgOiBcIjBcIjtcclxuXHJcbiAgICByZXR1cm4gbWdWYWw7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgdGhlIGRlZmF1bHQgcmFuZ2UgZm9yIGxvZ2ljYWwgdmFsdWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJuZ1wiPiAgY3VycmVudCByYW5nZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgZGVmYXVsdCByYW5nZSBpZiB0aGUgaW5wdXQgcmFuZ2UgaXMgZW1wdHk8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSB3aW5fcm5nX2Jvb2wocm5nOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIGlmIChybmcgPT09IG51bGwgfHwgcm5nLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBybmcgPSBcIlRydWUsIEZhbHNlXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcm5nO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gTWV0aG9kcyBmb3IgY292ZXJ0aW5nIERJUExBWSAtLS0+IElOVEVSTkFMXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyYW5zbGF0ZXMgYSBzdHJpbmcgbnVtYmVyIHRvIG1hZ2ljIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsdWVcIj4gICBBIHN0cmluZyBudW1iZXI8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgICAgVGhlIHBpY3R1cmUgdG8gdXNlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBtYWdpYyBudW1iZXI8L3JldHVybnM+XHJcbiAgdG9OdW0oZGlzcFZhbHVlOiBzdHJpbmcsIHBpYzogUElDLCBjb21wSWR4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IG1nTnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRShkaXNwVmFsdWUsIHBpYywgY29tcElkeCk7XHJcbiAgICByZXR1cm4gbWdOdW0udG9YTUxyZWNvcmQoKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGRzIHRoZSBkYXRlIG1hZ2ljIG51bWJlciBmcm9tIHRoZSBzdHJpbmcgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyXCI+ICAgICAgICAgICAgdGhlIGRhdGUgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0cl9sZW5cIj4gICAgICAgIGxlbmd0aCBvZiBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+ICAgICAgICAgICAgdGhlIHBpY3R1cmUgaW5mbzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtYXNrXCI+ICAgICAgICAgICB0aGUgbWFzayBvZiB0aGUgc3RyaW5nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlnbm9yZV9kdF9mbXRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIG1hZ2ljIG51bWJlcjwvcmV0dXJucz5cclxuICBhXzJfZGF0ZV9waWNfZGF0ZW1vZGUoc3RyOiBzdHJpbmdbXSwgc3RyX2xlbjogbnVtYmVyLCBwaWM6IFBJQywgbWFzazogc3RyaW5nW10sIGNvbXBJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcG9zOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHllYXJfaW5fcGljOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgbW9udGhfaW5fcGljOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZGF5X2luX3BpYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGlucDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGJZZWFySXNaZXJvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZXJhX3llYXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgaW50UmVmOiBJbnRSZWYgPSBuZXcgSW50UmVmKDApO1xyXG4gICAgbGV0IGludFBpY0lkeE9mczogbnVtYmVyID0gMDtcclxuICAgIGxldCBtaWxsZW5pdW06IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZGF0ZVBhcmFtczogRGF0ZUJyZWFrUGFyYW1zO1xyXG5cclxuICAgIGxldCBsZW46IG51bWJlciA9IE1hdGgubWluKHN0ci5sZW5ndGgsIHBpYy5nZXRNYXNrU2l6ZSgpKTtcclxuXHJcbiAgICBpZiAoc3RyLmxlbmd0aCA8IG1hc2subGVuZ3RoKVxyXG4gICAgICBzdHIubGVuZ3RoID0gbWFzay5sZW5ndGg7XHJcblxyXG4gICAgbGV0IHllYXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbW9udGg6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSAxO1xyXG4gICAgbGV0IGRveTogbnVtYmVyID0gMTtcclxuICAgIGxldCB1c2Vkb3k6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHN0cl9sZW47IGkgPSBpICsgMSkge1xyXG4gICAgICBpZiAoc3RyW2ldICE9PSAnMCcgJiYgc3RyW2ldICE9PSAnICcpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpID09PSBzdHJfbGVuKVxyXG4gICAgICByZXR1cm4gMDtcclxuXHJcbiAgICB3aGlsZSAocG9zIDwgc3RyX2xlbiAmJiBwb3MgKyBpbnRQaWNJZHhPZnMgPCBsZW4pIHtcclxuXHJcbiAgICAgIHN3aXRjaCAobWFza1twb3MgKyBpbnRQaWNJZHhPZnNdLmNoYXJDb2RlQXQoMCkpIHtcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVk6XHJcbiAgICAgICAgICB5ZWFyX2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgeWVhciA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDIsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMjtcclxuICAgICAgICAgIC8vIEhlbiAxNi8xMS85NyA6IEZpeCAjNzY4NDQyXHJcbiAgICAgICAgICBpZiAoeWVhciA9PT0gMClcclxuICAgICAgICAgICAgYlllYXJJc1plcm8gPSB0cnVlO1xyXG4gICAgICAgICAgbGV0IGNlbnR1cnlfeWVhcjogbnVtYmVyID0gdGhpcy5fZW52aXJvbm1lbnQuR2V0Q2VudHVyeShjb21wSWR4KSAlIDEwMDsgLy8gREVGX2NlbnR1cnlcclxuICAgICAgICAgIGlmICh5ZWFyIDwgY2VudHVyeV95ZWFyKVxyXG4gICAgICAgICAgICB5ZWFyICs9IDEwMDtcclxuICAgICAgICAgIHllYXIgKz0gdGhpcy5fZW52aXJvbm1lbnQuR2V0Q2VudHVyeShjb21wSWR4KSAtIGNlbnR1cnlfeWVhcjsgLy8gREVGX2NlbnR1cnlcclxuICAgICAgICAgIGlmICh0aGlzLl9lbnZpcm9ubWVudC5HZXREYXRlTW9kZShjb21wSWR4KSA9PT0gJ0InKVxyXG4gICAgICAgICAgLy8gREVGX2RhdGVfbW9kZVxyXG4gICAgICAgICAgICB5ZWFyIC09IFBJQ0ludGVyZmFjZS5EQVRFX0JVRERISVNUX0dBUDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ZWVlZKTpcclxuICAgICAgICAgIHllYXJfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBsZXQgWWVhckRpZ2l0c05vOiBudW1iZXI7XHJcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgNCB5ZWFyIGRpZ2l0LiBJZiBub3QsIGFkanVzdCBpdFxyXG4gICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSAnY2VudHVyeSB5ZWFyJ1xyXG4gICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgICAgICAgZm9yIChZZWFyRGlnaXRzTm8gPSAwOyBZZWFyRGlnaXRzTm8gPCA0ICYmIHBvcyArIFllYXJEaWdpdHNObyA8IHN0ci5sZW5ndGggJiYgVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoc3RyW3BvcyArIFllYXJEaWdpdHNOb10pOyBZZWFyRGlnaXRzTm8rKykge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGkgPSBZZWFyRGlnaXRzTm87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgcG9zICsgaSA8IHN0ci5sZW5ndGggJiYgc3RyW3BvcyArIGldICE9PSB0aGlzLkRBVEVDSEFSLnRvU3RyaW5nKCkgJiYgaSA8IDQ7IGkrKykge1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKFllYXJEaWdpdHNObyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgcG9zICsgWWVhckRpZ2l0c05vIDwgc3RyLmxlbmd0aCAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChzdHJbcG9zICsgWWVhckRpZ2l0c05vXSkgJiZcclxuICAgICAgICAgICAgICAgICBZZWFyRGlnaXRzTm8gPCA0O1xyXG4gICAgICAgICAgICAgICAgIFllYXJEaWdpdHNObysrKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpKSB7XHJcbiAgICAgICAgICAgIGlmIChpIDwgNCAmJiBzdHIubGVuZ3RoIDwgbWFzay5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDQgLSBpLCBzdHIubGVuZ3RoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaSA8IDQgJiYgbGVuIDwgbWFzay5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgNCAtIGksIGxlbik7XHJcbiAgICAgICAgICAgICAgbGVuID0gbGVuICsgNCAtIGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB5ZWFyID0gdGhpcy5kYXRlX2FfMl9pKHN0ciwgNCwgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSA0O1xyXG5cclxuICAgICAgICAgIC8vIEhlbiAxNi8xMS85NyA6IEZpeCAjNzY4NDQyXHJcbiAgICAgICAgICBpZiAoeWVhciA9PT0gMClcclxuICAgICAgICAgICAgYlllYXJJc1plcm8gPSB0cnVlO1xyXG5cclxuICAgICAgICAgIGlmIChZZWFyRGlnaXRzTm8gPD0gMikge1xyXG4gICAgICAgICAgICBjZW50dXJ5X3llYXIgPSB0aGlzLl9lbnZpcm9ubWVudC5HZXRDZW50dXJ5KGNvbXBJZHgpICUgMTAwOyAvLyBERUZfY2VudHVyeVxyXG4gICAgICAgICAgICBpZiAoeWVhciA8IGNlbnR1cnlfeWVhcilcclxuICAgICAgICAgICAgICB5ZWFyICs9IDEwMDtcclxuICAgICAgICAgICAgeWVhciArPSB0aGlzLl9lbnZpcm9ubWVudC5HZXRDZW50dXJ5KGNvbXBJZHgpIC0gY2VudHVyeV95ZWFyOyAvLyBERUZfY2VudHVyeVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl9lbnZpcm9ubWVudC5HZXREYXRlTW9kZShjb21wSWR4KSA9PT0gJ0InKVxyXG4gICAgICAgICAgLy8gREVGX2RhdGVfbW9kZVxyXG4gICAgICAgICAgICB5ZWFyIC09IFBJQ0ludGVyZmFjZS5EQVRFX0JVRERISVNUX0dBUDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hZWVlZWTpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBsZXQgcXVvdGVzOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgaWYgKGxlbiA+IHBvcyArIDUgJiYgbWFza1twb3MgKyA1XS5jaGFyQ29kZUF0KDApID09PSAoUElDSW50ZXJmYWNlLlBJQ19IWVlZWVkpKVxyXG4gICAgICAgICAgICBxdW90ZXMgPSAxO1xyXG4gICAgICAgICAgeWVhciA9IEhlYnJld0RhdGUuZGF0ZWhlYl9oXzJfaShzdHIsIDUgKyBxdW90ZXMsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gNSArIHF1b3RlcztcclxuICAgICAgICAgIGlmICh5ZWFyID09PSAwKVxyXG4gICAgICAgICAgICBiWWVhcklzWmVybyA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hMOlxyXG4gICAgICAgICAgaW50UGljSWR4T2ZzID0gSGVicmV3RGF0ZS5kYXRlaGViX2hfMl9pKHN0ciwgMSwgcG9zKTtcclxuICAgICAgICAgIHBvcysrO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19IREQ6XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgcXVvdGVzID0gMDtcclxuICAgICAgICAgIGlmIChsZW4gPiBwb3MgKyAyICYmIG1hc2tbcG9zICsgMl0uY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19IREQpXHJcbiAgICAgICAgICAgIHF1b3RlcyA9IDE7XHJcbiAgICAgICAgICBkYXkgPSBIZWJyZXdEYXRlLmRhdGVoZWJfaF8yX2koc3RyLCAyICsgcXVvdGVzLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDIgKyBxdW90ZXM7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NRDpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBtb250aF9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgICBpZiAoKHN0ci5sZW5ndGggPT09IHBvcyArIDEgfHwgc3RyW3BvcyArIDFdLmNoYXJDb2RlQXQoMCkgPT09IHRoaXMuREFURUNIQVIgfHwgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltwb3MgKyAxXSkpICYmIHN0ci5sZW5ndGggPCBtYXNrLmxlbmd0aClcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgMSwgc3RyLmxlbmd0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHN0cltwb3MgKyAxXS5jaGFyQ29kZUF0KDApID09PSB0aGlzLkRBVEVDSEFSICYmIGxlbiA8IG1hc2subGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDEsIGxlbik7XHJcbiAgICAgICAgICAgICAgbGVuICs9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG1vbnRoID0gdGhpcy5kYXRlX2FfMl9pKHN0ciwgMiwgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTU1NOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIG1vbnRoX2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBpbnRSZWYudmFsID0gcG9zO1xyXG4gICAgICAgICAgbW9udGggPSB0aGlzLmRhdGVfTU1NXzJfbShzdHIsIG1hc2ssIGludFJlZiwgbGVuLCBwaWMuaXNIZWJyZXcoKSk7XHJcbiAgICAgICAgICBwb3MgPSBpbnRSZWYudmFsO1xyXG4gICAgICAgICAgaWYgKHBpYy5pc0hlYnJldygpICYmIG1vbnRoID09PSAxNClcclxuICAgICAgICAgICAgbW9udGggPSA2O1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX0REKTpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBkYXlfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgICAgICAgaWYgKChzdHIubGVuZ3RoID09PSBwb3MgKyAxIHx8IHN0cltwb3MgKyAxXS5jaGFyQ29kZUF0KDApID09PSB0aGlzLkRBVEVDSEFSIHx8ICFVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChzdHJbcG9zICsgMV0pKSAmJiBzdHIubGVuZ3RoIDwgbWFzay5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDEsIHN0ci5sZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzdHJbcG9zICsgMV0uY2hhckNvZGVBdCgwKSA9PT0gdGhpcy5EQVRFQ0hBUiAmJiBsZW4gPCBtYXNrLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIHRoaXMubW92ZV9kYXRlKHN0ciwgcG9zLCAxLCBsZW4pO1xyXG4gICAgICAgICAgICAgIGxlbiArPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXkgPSB0aGlzLmRhdGVfYV8yX2koc3RyLCAyLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfREREKTpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICB1c2Vkb3kgPSB0cnVlO1xyXG4gICAgICAgICAgZGF5X2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBkb3kgPSB0aGlzLmRhdGVfYV8yX2koc3RyLCAzLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDM7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfRERERCk6XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgZGF5X2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBkYXkgPSB0aGlzLmRhdGVfYV8yX2koc3RyLCAyLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDIgKyAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1lKKTogLy8gSlBOOiBKYXBhbmVzZSBkYXRlIHBpY3R1cmUgc3VwcG9ydFxyXG4gICAgICAgICAgeWVhcl9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgICAgICAgaWYgKChzdHIubGVuZ3RoID09PSBwb3MgKyAxIHx8IHN0cltwb3MgKyAxXS5jaGFyQ29kZUF0KDApID09PSB0aGlzLkRBVEVDSEFSIHx8ICFVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChzdHJbcG9zICsgMV0pKSAmJiBzdHIubGVuZ3RoIDwgbWFzay5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDEsIHN0ci5sZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgeWVhciA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDIsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMjtcclxuXHJcbiAgICAgICAgICBsZXQgc3RyMTogc3RyaW5nID0gTlN0cmluZy5Gcm9tQ2hhcnMoc3RyKTtcclxuICAgICAgICAgIGVyYV95ZWFyID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5nZXRTdGFydFllYXJPZkVyYShzdHIxLCBwaWMuZ2V0TWFzaygpKTtcclxuXHJcbiAgICAgICAgICBpZiAoZXJhX3llYXIgPT09IDApXHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgeWVhciArPSBlcmFfeWVhciAtIDE7XHJcblxyXG4gICAgICAgICAgaWYgKHllYXIgPT09IDApXHJcbiAgICAgICAgICAgIGJZZWFySXNaZXJvID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIFwic3RyW3Bvc11cIiBjb250YWlucyBEQkNTLCB0aGUgbmV4dCBpbmRleCBvZiBcIm1hc2tcIiBoYXMgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0hhbGZXaWR0aChzdHJbcG9zXSkgPT09IGZhbHNlICYmXHJcbiAgICAgICAgICAgICAgVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKG1hc2tbcG9zICsgaW50UGljSWR4T2ZzXSkpXHJcbiAgICAgICAgICAgICAgaW50UGljSWR4T2ZzKys7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcG9zICs9IDE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChiWWVhcklzWmVybykge1xyXG4gICAgICBpZiAoIW1vbnRoX2luX3BpYylcclxuICAgICAgICBtb250aCA9IDA7XHJcbiAgICAgIGlmICghZGF5X2luX3BpYyAmJiBtb250aCA9PT0gMClcclxuICAgICAgICBkYXkgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhlbiAxNi8xMS85NyA6IEZpeCAjNzY4NDQyXHJcbiAgICAvLyBaZXJvIGRhdGUgaXMgdmFsaWQgYW5kIHNob3VsZCByZXR1cm4gMEwuIFRoaXMgY2hlY2sgbXVzdCBiZSBoZXJlXHJcbiAgICAvLyBiZWNhdXNlIHRoZSB5ZWFyIHZhbHVlIG1heSBiZSBjaGFuZ2VkIGJlY2F1c2Ugb2YgY2VudHVyeSB5ZWFyLlxyXG4gICAgaWYgKGRheSA9PT0gMCAmJiBtb250aCA9PT0gMCAmJiAoYlllYXJJc1plcm8gfHwgeWVhciA9PT0gMCkpXHJcbiAgICAgIHJldHVybiAoMCk7XHJcblxyXG4gICAgaWYgKCFpbnApXHJcbiAgICAgIHJldHVybiAoMCk7XHJcblxyXG4gICAgLy8gSGVicmV3IFllYXJcclxuICAgIGlmIChwaWMuaXNIZWJyZXcoKSkge1xyXG4gICAgICBpZiAoeWVhciA+IDApIHtcclxuICAgICAgICBpZiAobWlsbGVuaXVtID09PSAwKVxyXG4gICAgICAgICAgbWlsbGVuaXVtID0gNTtcclxuICAgICAgICB5ZWFyICs9IG1pbGxlbml1bSAqIDEwMDA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIChIZWJyZXdEYXRlLmRhdGVoZWJfMl9kKHllYXIsIG1vbnRoLCBkYXkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGUgbmV4dCAyIGxpbmVzIHN1cHBvcnQgNC54eCBERC9NTSBwaWN0dXJlc1xyXG4gICAgaWYgKCh5ZWFyID09PSAwKSAmJiAheWVhcl9pbl9waWMpIHtcclxuICAgICAgZGF0ZVBhcmFtcyA9IHRoaXMuZGF0ZV9zeXMoKTtcclxuICAgICAgeWVhciA9IGRhdGVQYXJhbXMueWVhcjtcclxuICAgIH1cclxuICAgIHJldHVybiAodGhpcy5kYXRlXzRfY2FsZW5kZXIoeWVhciwgbW9udGgsIGRheSwgZG95LCB1c2Vkb3kpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBEZWNvZGUgZGlnaXRzIGZyb20gYSBkYXRlIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBkYXRlX2FfMl9pKHM6IHN0cmluZ1tdLCBsZW46IG51bWJlciwgcG9zOiBudW1iZXIpOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBkYXRlX2FfMl9pKHM6IHN0cmluZywgbGVuOiBudW1iZXIsIHBvczogbnVtYmVyKTogbnVtYmVyO1xyXG4gIHByaXZhdGUgZGF0ZV9hXzJfaShzOiBhbnksIGxlbjogbnVtYmVyLCBwb3M6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiAocyA9PT0gbnVsbCB8fCBzIGluc3RhbmNlb2YgQXJyYXkpICYmIChsZW4gPT09IG51bGwgfHwgbGVuLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmIChwb3MgPT09IG51bGwgfHwgcG9zLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRhdGVfYV8yX2lfMChzLCBsZW4sIHBvcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRlX2FfMl9pXzEocywgbGVuLCBwb3MpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIERlY29kZSBkaWdpdHMgZnJvbSBhIGRhdGUgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGRhdGVfYV8yX2lfMChzOiBzdHJpbmdbXSwgbGVuOiBudW1iZXIsIHBvczogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBhcnJheTogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPihsZW4pO1xyXG4gICAgbGV0IG1nTnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGFycmF5W2ldID0gc1twb3MgKyBpXTtcclxuICAgIH1cclxuICAgIHJldHVybiBtZ051bS5hXzJfbG9uZyhOU3RyaW5nLkZyb21DaGFycyhhcnJheSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG1vdmluZyBwYXJ0IG9mIHRoZSBkYXRlIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBtb3ZlX2RhdGUoc3RyOiBzdHJpbmdbXSwgcG9zOiBudW1iZXIsIG1vdmVieTogbnVtYmVyLCBsZW46IG51bWJlcik6IHZvaWQ7XHJcbiAgcHJpdmF0ZSBtb3ZlX2RhdGUoc3RyOiBzdHJpbmcsIHBvczogbnVtYmVyLCBtb3ZlYnk6IG51bWJlciwgbGVuOiBudW1iZXIpOiB2b2lkO1xyXG4gIHByaXZhdGUgbW92ZV9kYXRlKHN0cjogYW55LCBwb3M6IG51bWJlciwgbW92ZWJ5OiBudW1iZXIsIGxlbjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiAoc3RyID09PSBudWxsIHx8IHN0ciBpbnN0YW5jZW9mIEFycmF5KSAmJiAocG9zID09PSBudWxsIHx8IHBvcy5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAobW92ZWJ5ID09PSBudWxsIHx8IG1vdmVieS5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSAmJiAobGVuID09PSBudWxsIHx8IGxlbi5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKSkge1xyXG4gICAgICB0aGlzLm1vdmVfZGF0ZV8wKHN0ciwgcG9zLCBtb3ZlYnksIGxlbik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubW92ZV9kYXRlXzEoc3RyLCBwb3MsIG1vdmVieSwgbGVuKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBtb3ZpbmcgcGFydCBvZiB0aGUgZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgbW92ZV9kYXRlXzAoc3RyOiBzdHJpbmdbXSwgcG9zOiBudW1iZXIsIG1vdmVieTogbnVtYmVyLCBsZW46IG51bWJlcik6IHZvaWQge1xyXG4gICAgTWVtb3J5VXRpbC5jaGFyX21lbW1vdmUoc3RyLCBwb3MgKyBtb3ZlYnksIHN0ciwgcG9zLCBsZW4gLSAocG9zICsgbW92ZWJ5KSArIDEpO1xyXG4gICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChzdHIsIHBvcywgJzAnLCAvKicwJyovbW92ZWJ5KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUcmFuc2xhdGUgYSBtb250aCBuYW1lIC0+IG1vbnRoIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0cmluZ1wiPnRvIGV2YWx1YXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWN0dXJlXCI+bWFza1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicG9zXCI+Y3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nIHRoZSBpbnRSZWYgbm90IGV4YWN0bHkgdGhlIHNhbWUgcmVmZXJlbmNlIHRvIGludGVnZXIgLCBsaWtlIGluIEMrKyxcclxuICAvLy8gICBzbyB0aGUgZ2xvYmFsIHBvcyBNVVNUIGJlIHVwZGF0ZWQgYnkgdGhlIHBvcy52YWx1ZSBhZnRlciB0aGUgZnVuY3Rpb24gcmV0dXJucy5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGRhdGVfTU1NXzJfbShzdHI6IHN0cmluZ1tdLCBtYXNrOiBzdHJpbmdbXSwgcG9zOiBJbnRSZWYsIGxlbjogbnVtYmVyLCBpc0hlYnJldzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgbDogbnVtYmVyO1xyXG5cclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgbGV0IG1hc2tQb3M6IG51bWJlciA9IFV0aWxTdHJCeXRlTW9kZS5jb252UG9zKE5TdHJpbmcuRnJvbUNoYXJzKHN0ciksIE5TdHJpbmcuRnJvbUNoYXJzKG1hc2spLCBwb3MudmFsLCBmYWxzZSk7XHJcbiAgICAgIGwgPSB0aGlzLmRhdGVfbXNrX2NudChtYXNrLCBtYXNrUG9zLCA8bnVtYmVyPihsZW4gLSBtYXNrUG9zKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbCA9IHRoaXMuZGF0ZV9tc2tfY250KG1hc2ssIHBvcy52YWwsIDxudW1iZXI+KGxlbiAtIHBvcy52YWwpKTtcclxuICAgIH1cclxuICAgIGxldCBzdHJQb3M6IG51bWJlciA9IHBvcy52YWw7XHJcbiAgICBwb3MudmFsID0gcG9zLnZhbCArIGw7XHJcbiAgICBsZW4gPSBNZW1vcnlVdGlsLm1lbV90cmltKHN0ciwgc3RyUG9zLCBsKTtcclxuXHJcbiAgICBpZiAobGVuID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBzdHJCOiBzdHJpbmcgPSBOU3RyaW5nLkZyb21DaGFycyhzdHIsIHN0clBvcywgbGVuKTtcclxuICAgICAgbGV0IG1vbnRoTmFtZXM6IHN0cmluZ1tdO1xyXG4gICAgICBpZiAoaXNIZWJyZXcpIHtcclxuICAgICAgICBtb250aE5hbWVzID0gSGVicmV3RGF0ZS5HZXRMb2NhbE1vbnRocygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBtb250aHM6IHN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKE1zZ0ludGVyZmFjZS5NT05USFNfUFRSKTtcclxuICAgICAgICBtb250aE5hbWVzID0gRGF0ZVV0aWwuZ2V0TG9jYWxNb250aHMobW9udGhzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8IG1vbnRoTmFtZXMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAoTlN0cmluZy5Db21wYXJlKG1vbnRoTmFtZXNbaV0uc3Vic3RyKDAsIGxlbiksIHN0ckIsIHRydWUpID09PSAwKVxyXG4gICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCB0aGUgY3VycmV0IGRheWUgc2VwZXJhdGVkIHRvIHllYXIsIG1vbnRoLCBkYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGRhdGVfc3lzKCk6IERhdGVCcmVha1BhcmFtcyB7XHJcbiAgICBsZXQgZGF0ZTogRGF0ZUJyZWFrUGFyYW1zID0gbmV3IERhdGVCcmVha1BhcmFtcygpO1xyXG4gICAgbGV0IEN1cnJEYXRlOiBEYXRlVGltZSA9IERhdGVUaW1lLk5vdztcclxuXHJcbiAgICBkYXRlLnllYXIgPSBDdXJyRGF0ZS5ZZWFyO1xyXG4gICAgZGF0ZS5tb250aCA9IEN1cnJEYXRlLk1vbnRoO1xyXG4gICAgZGF0ZS5kYXkgPSBDdXJyRGF0ZS5EYXk7XHJcblxyXG4gICAgcmV0dXJuIGRhdGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdG8gZ2V0IGN1cnJlbnQgZGF0ZSBpbiBtYWdpYyByZXByZXNlbnRhdGlvbiBRdWVyeSBNYWdpYydzIERhdGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlICdNYWdpYycgY3VycmVudCBkYXRlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBkYXRlX21hZ2ljKHV0Y0RhdGU6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IGRhdGVUaW1lOiBEYXRlVGltZTtcclxuICAgIGlmICh1dGNEYXRlKSB7XHJcbiAgICAgIGRhdGVUaW1lID0gRGF0ZVRpbWUuVXRjTm93O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGRhdGVUaW1lID0gRGF0ZVRpbWUuTm93O1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB5ZWFyOiBudW1iZXIgPSBkYXRlVGltZS5ZZWFyO1xyXG4gICAgbGV0IG1vbnRoOiBudW1iZXIgPSBkYXRlVGltZS5Nb250aDtcclxuICAgIGxldCBkYXk6IG51bWJlciA9IGRhdGVUaW1lLkRheTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5kYXRlXzRfY2FsZW5kZXIoeWVhciwgbW9udGgsIGRheSwgMSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRvIGdldCAgdGhlIHN5c3RlbSB0aW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSAnTWFnaWMnIGN1cnJlbnQgdGltZVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgdGltZV9tYWdpYyh1dGNUaW1lOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBEYXRlVGltZS5HZXRUb3RhbFNlY29uZHNGcm9tTWlkbmlnaHQodXRjVGltZSwgbmV3IERhdGUoKSk7XHJcbiAgfVxyXG5cclxuICBtdGltZV9tYWdpYyh1dGNUaW1lOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBEYXRlVGltZS5HZXRUb3RhbE1pbGxpU2Vjb25kc0Zyb21NaWRuaWdodCh1dGNUaW1lLCBuZXcgRGF0ZSgpKSA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tcHV0ZSBNQUdJQyBkYXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBkYXRlXzRfY2FsZW5kZXIoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlciwgZG95OiBudW1iZXIsIHVzZWRveTogYm9vbGVhbik6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IExlYXBZZWFyOiBib29sZWFuID0geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCk7XHJcblxyXG4gICAgLy8gMy4xMS45NyAtIEhlbiAoRml4ZWQgYnVnICM3NjQyNjUgYW5kICM4MTg2KSA6XHJcbiAgICAvLyBJZiB0aGUgZGF0ZSBpcyAwIHRoZW4gcmV0dXJuIDBMICh6ZXJvIHZhbHVlIGlzIHZhbGlkKSwgZWxzZSBpZiB0aGUgZGF0ZVxyXG4gICAgLy8gaXMgaWxsZWdhbCB0aGVuIHJldHVybiAxMDAwMDAwMDAwTCAod3JvbmcgZGF0ZSkuXHJcbiAgICBpZiAodXNlZG95KSB7XHJcbiAgICAgIGlmIChkb3kgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZG95ID4gMzY2IHx8ICghTGVhcFllYXIgJiYgZG95ID4gMzY1KSkge1xyXG4gICAgICAgIHJldHVybiAoMTAwMDAwMDAwMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoZGF5ID09PSAwICYmIG1vbnRoID09PSAwICYmIHllYXIgPT09IDApIHtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZGF5ID09PSAwIHx8IG1vbnRoID09PSAwIHx8IHllYXIgPT09IDAgfHwgbW9udGggPiAxMikge1xyXG4gICAgICAgIHJldHVybiAxMDAwMDAwMDAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB5ZWFyID0geWVhciAtIDE7XHJcbiAgICBsZXQgbnVtOiBudW1iZXIgPSBNYXRoLmZsb29yKHllYXIgLyA0MDApO1xyXG4gICAgeWVhciA9IHllYXIgLSBudW0gKiA0MDA7XHJcbiAgICBsZXQgbnVtMjogbnVtYmVyID0gTWF0aC5mbG9vcih5ZWFyIC8gMTAwKTtcclxuICAgIHllYXIgPSB5ZWFyIC0gbnVtMiAqIDEwMDtcclxuICAgIGxldCBudW0zOiBudW1iZXIgPSBNYXRoLmZsb29yKHllYXIgLyA0KTtcclxuICAgIHllYXIgPSB5ZWFyIC0gbnVtMyAqIDQ7XHJcblxyXG4gICAgaWYgKCF1c2Vkb3kpIHtcclxuICAgICAgbGV0IG51bTQ6IG51bWJlciA9IFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbbW9udGggLSAxXTtcclxuICAgICAgbGV0IG51bTU6IG51bWJlciA9IFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbbW9udGhdO1xyXG5cclxuICAgICAgaWYgKExlYXBZZWFyKSB7XHJcbiAgICAgICAgaWYgKG1vbnRoID4gMSkge1xyXG4gICAgICAgICAgbnVtNSA9IG51bTUgKyAxO1xyXG4gICAgICAgICAgaWYgKG1vbnRoID4gMikge1xyXG4gICAgICAgICAgICBudW00ID0gbnVtNCArIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGF5ID4gbnVtNSAtIG51bTQpIHtcclxuICAgICAgICByZXR1cm4gMTAwMDAwMDAwMDtcclxuICAgICAgfVxyXG4gICAgICBkb3kgPSBudW00ICsgZGF5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bSAqIDE0NjA5NyArIG51bTIgKiAzNjUyNCArIG51bTMgKiAxNDYxICsgeWVhciAqIDM2NSArIGRveTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUcmFuc2xhdGVzIGEgc3RyaW5nIHRpbWUgdG8gbWFnaWMgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPiAgIEEgc3RyaW5nIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICAgIFRoZSBwaWN0dXJlIHRvIHVzZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbWFnaWMgbnVtYmVyPC9yZXR1cm5zPlxyXG4gIGZyb21OYXRpdmVUaW1lVG9NZ1RpbWUoZGlzcFZhbHVlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBudW1WYWw6IG51bWJlciA9IHRoaXMuZnJvbU5hdGl2ZVRpbWVUb01nVGltZU51bWJlcihkaXNwVmFsdWUpO1xyXG4gICAgbWdOdW0uTlVNXzRfTE9ORyhudW1WYWwpO1xyXG4gICAgcmV0dXJuIG1nTnVtLnRvWE1McmVjb3JkKCk7XHJcbiAgfVxyXG5cclxuICBmcm9tTmF0aXZlVGltZVRvTWdUaW1lTnVtYmVyKGRpc3BWYWx1ZTogRGF0ZSk6IG51bWJlciB7XHJcbiAgICBsZXQgbnVtVmFsOiBudW1iZXIgPSB0aGlzLnRpbWVfMl9pbnQoZGlzcFZhbHVlLmdldEhvdXJzKCksIGRpc3BWYWx1ZS5nZXRNaW51dGVzKCksIGRpc3BWYWx1ZS5nZXRTZWNvbmRzKCkpO1xyXG4gICAgcmV0dXJuIG51bVZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IEFscGhhIGludG8gYSBUaW1lIGFjY29yZGluZyB0byBhIGdpdmVuIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFfMl90aW1lKEFzY2lpOiBzdHJpbmcsIHBpYzogUElDLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBudW1iZXI7XHJcbiAgYV8yX3RpbWUoQXNjaWk6IHN0cmluZywgQXNjaWlMOiBudW1iZXIsIG1hc2s6IHN0cmluZ1tdLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBudW1iZXI7XHJcbiAgYV8yX3RpbWUoQXNjaWk6IGFueSwgcGljT3JBc2NpaUw6IGFueSwgbWlsbGlTZWNvbmRzT3JNYXNrOiBhbnksIG1pbGxpU2Vjb25kcz86IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpXHJcbiAgICAgIHJldHVybiB0aGlzLmFfMl90aW1lXzAoQXNjaWksIHBpY09yQXNjaWlMLCBtaWxsaVNlY29uZHNPck1hc2spO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmFfMl90aW1lXzEoQXNjaWksIHBpY09yQXNjaWlMLCBtaWxsaVNlY29uZHNPck1hc2ssIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBBbHBoYSBpbnRvIGEgVGltZSBhY2NvcmRpbmcgdG8gYSBnaXZlbiBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFfMl90aW1lXzAoQXNjaWk6IHN0cmluZywgcGljOiBQSUMsIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5hXzJfdGltZShBc2NpaSwgQXNjaWkubGVuZ3RoLCBOU3RyaW5nLlRvQ2hhckFycmF5KHBpYy5nZXRNYXNrKCkpLCBtaWxsaVNlY29uZHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbnZlcnQgQWxwaGEgaW50byBhIFRpbWUgYWNjb3JkaW5nIHRvIGEgZ2l2ZW4gcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhXzJfdGltZV8xKEFzY2lpOiBzdHJpbmcsIEFzY2lpTDogbnVtYmVyLCBtYXNrOiBzdHJpbmdbXSwgbWlsbGlTZWNvbmRzOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBJOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gbWFzay5sZW5ndGg7IC8vIExlbmd0aCBvZiBtYXNrIG9yIHN0cmluZyB0byBzY2FuXHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBjb3VudGVycyBhbmQgZmxhZ3NcclxuICAgIGlmIChsZW4gPiBBc2NpaUwpIHtcclxuICAgICAgbGVuID0gQXNjaWlMO1xyXG4gICAgfVxyXG4gICAgbGV0IGFtcG06IG51bWJlciA9IDA7IC8vIEFNL1BNIGluZGljYXRvclxyXG4gICAgbGV0IGhvdXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWludXRlOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHNlY29uZDogbnVtYmVyID0gMDtcclxuICAgIGxldCBtaWxsaXNlY29uZDogbnVtYmVyID0gMDtcclxuXHJcbiAgICB3aGlsZSAoSSA8IGxlbikge1xyXG4gICAgICBsZXQgbWFza0xlbmd0aDogbnVtYmVyO1xyXG4gICAgICBsZXQgbWF4TWFza0xlbjogbnVtYmVyO1xyXG5cclxuICAgICAgLy8gVG8gZ2V0IHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aCBvZiB0aGUgY29uc3RhbnRzIGluIHRoZSBtYXNrXHJcbiAgICAgIHN3aXRjaCAobWFza1tJXS5jaGFyQ29kZUF0KDApKSB7XHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ISCk6XHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOlxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfU1MpOlxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfUE0pOlxyXG4gICAgICAgICAgbWF4TWFza0xlbiA9IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NUyk6XHJcbiAgICAgICAgICBtYXhNYXNrTGVuID0gMztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgbWF4TWFza0xlbiA9IDE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLyogVG8gZ2V0IHRoZSBtaW5pbXVtIG9mIG1heE1hc2tMZW4gJiBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1haW5lZCBpbiBzdHJpbmdcclxuICAgICAgYmVjYXVzZSBpZiB0aGUgQXNjaWkgaXMgc2hvcnRlcihoYXMgbGVzcyBjaGFyYWN0ZXJzKXRoZW4gY3JlYXRlIFN0cmluZyBvbmx5XHJcbiAgICAgIG9mIHRoYXQgbm8uIG9mIGNoYXJhY3RlcnMgKG1hc2tMZW5ndGgpLCBub3Qgb2YgbWF4TWFza0xlbmd0aCAqL1xyXG4gICAgICBtYXNrTGVuZ3RoID0gTWF0aC5taW4obWF4TWFza0xlbiwgbGVuIC0gSSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKG1hc2tbSV0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSEgpOiB7XHJcbiAgICAgICAgICBob3VyID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOiB7XHJcbiAgICAgICAgICBtaW51dGUgPSBtZ051bS5hXzJfbG9uZyhBc2NpaS5zdWJzdHIoSSwgbWFza0xlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1NTKToge1xyXG4gICAgICAgICAgc2Vjb25kID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NUyk6IHtcclxuICAgICAgICAgIG1pbGxpc2Vjb25kID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19QTSk6XHJcbiAgICAgICAgICBhbXBtID0gMDtcclxuICAgICAgICAgIGxldCBjMDogc3RyaW5nID0gQXNjaWlbSV07XHJcbiAgICAgICAgICBsZXQgYzE6IHN0cmluZztcclxuICAgICAgICAgIGMwID0gYzAudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgIGlmIChJICsgMSA8IGxlbikge1xyXG4gICAgICAgICAgICBjMSA9IEFzY2lpW0kgKyAxXTtcclxuICAgICAgICAgICAgYzEgPSBjMS50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGMxID09PSAnTScpIHtcclxuICAgICAgICAgICAgICBpZiAoYzAgPT09ICdBJylcclxuICAgICAgICAgICAgICAgIGFtcG0gPSAtMTtcclxuICAgICAgICAgICAgICBpZiAoYzAgPT09ICdQJylcclxuICAgICAgICAgICAgICAgIGFtcG0gPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIEkgKz0gbWFza0xlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayB2YWxpZGl0eSBvZiBtaW51dGVzIGFuZCBzZWNvbmRzXHJcbiAgICBpZiAoc2Vjb25kID4gNTkgfHwgbWludXRlID4gNTkpXHJcbiAgICAgIHJldHVybiAoMCk7XHJcblxyXG4gICAgLy8gQ29udmVydCBob3VyIHRvIFBNIGlmIHNwZWNpZmllZCBhcyBBTVxyXG4gICAgaWYgKGFtcG0gIT09IDApXHJcbiAgICAgIGlmIChhbXBtID09PSAtMSlcclxuICAgICAgLy8gQU1cclxuICAgICAge1xyXG4gICAgICAgIGlmIChob3VyID09PSAxMilcclxuICAgICAgICAgIGhvdXIgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGhvdXIgPCAxMilcclxuICAgICAgLy8gUE1cclxuICAgICAgICBob3VyICs9IDEyO1xyXG4gICAgaWYgKG1pbGxpU2Vjb25kcylcclxuICAgICAgcmV0dXJuIHRoaXMudGltZV8yX2ludChob3VyLCBtaW51dGUsIHNlY29uZCkgKiAxMDAwICsgbWlsbGlzZWNvbmQ7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLnRpbWVfMl9pbnQoaG91ciwgbWludXRlLCBzZWNvbmQpO1xyXG4gIH1cclxuXHJcbiAgdGltZV8yX2ludChob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyLCBzZWNvbmQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gaG91ciAqIDM2MDAgKyBtaW51dGUgKiA2MCArIHNlY29uZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IFwiMFwiL1wiMVwiIHRvIGZhbHNlL3RydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYm9vbFN0clwiPiAgXCIwXCIvXCIxXCJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgXCIxXCIgb3IgZmFsc2UgaWYgb3RoZXJzXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgdG9Cb29sZWFuKGJvb2xTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGJvb2xTdHIgIT09IG51bGwgJiYgYm9vbFN0ciA9PT0gXCIxXCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU3RyaW5nIHRvIERhdGUgZnVuY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFfMl9kYXRlKHN0cjogc3RyaW5nLCBGb3JtYXQ6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmFfMl9kYXRlX2RhdGVtb2RlKHN0ciwgRm9ybWF0LCBjb21wSWR4KTtcclxuICB9XHJcblxyXG4gIGFfMl9kYXRlX3BpYyhzdHI6IHN0cmluZywgcGljOiBQSUMsIG1hc2s6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChzdHIgPT09IG51bGwpIHtcclxuICAgICAgc3RyID0gXCJcIjtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmFfMl9kYXRlX3BpY19kYXRlbW9kZShOU3RyaW5nLlRvQ2hhckFycmF5KHN0ciksIHN0ci5sZW5ndGgsIHBpYywgTlN0cmluZy5Ub0NoYXJBcnJheShtYXNrKSwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICB0b19hKG91dFZhbDogc3RyaW5nLCBvdXRfbGVuOiBudW1iZXIsIGRhdGU6IG51bWJlciwgRm9ybWF0OiBzdHJpbmcsIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b19hX2RhdGVtb2RlKG91dFZhbCwgb3V0X2xlbiwgZGF0ZSwgRm9ybWF0LCBmYWxzZSwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBzdHJpbmcgLT4gZGF0ZSB1c2luZyBhIGZvcm1hdCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYV8yX2RhdGVfZGF0ZW1vZGUoc3RyOiBzdHJpbmcsIEZvcm1hdDogc3RyaW5nLCBjb21wSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHBJQzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuREFURSwgY29tcElkeCk7XHJcbiAgICBpZiAoc3RyID09PSBudWxsKSB7XHJcbiAgICAgIHN0ciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5hXzJfZGF0ZV9waWNfZGF0ZW1vZGUoTlN0cmluZy5Ub0NoYXJBcnJheShzdHIpLCBzdHIubGVuZ3RoLCBwSUMsIE5TdHJpbmcuVG9DaGFyQXJyYXkocElDLmdldE1hc2soKSksIGNvbXBJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFN0cmluZyB0byBhIGRhdGVtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHRvX2FfZGF0ZW1vZGUob3V0VmFsOiBzdHJpbmcsIG91dF9sZW46IG51bWJlciwgZGF0ZTogbnVtYmVyLCBGb3JtYXQ6IHN0cmluZywgaWdub3JlX2R0X2ZtdDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuXHJcbiAgICAvLyBQYXJzZSB0aGUgcGljdHVyZVxyXG4gICAgbGV0IHBpYzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuREFURSwgY29tcElkeCk7XHJcblxyXG4gICAgLy8gQ29udmVydCB0aGUgIGRhdGUgLT4gc3RyaW5nXHJcbiAgICBpZiAob3V0VmFsID09PSBudWxsKSB7XHJcbiAgICAgIG91dFZhbCA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50b19hX3BpY19kYXRlbW9kZShvdXRWYWwsIG91dF9sZW4sIGRhdGUsIHBpYywgdHJ1ZSwgaWdub3JlX2R0X2ZtdCwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRGVjb2RlIGRpZ2l0cyBmcm9tIGEgZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZGF0ZV9hXzJfaV8xKHM6IHN0cmluZywgbGVuOiBudW1iZXIsIHBvczogbnVtYmVyKTogbnVtYmVyIHtcclxuXHJcbiAgICAvLyBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZSAncG9zKz1sZW4nIGFmdGVyIHRoZSB1c2luZyBvZiB0aGUgZnVuY3Rpb25cclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBzdHI6IHN0cmluZztcclxuXHJcbiAgICBzdHIgPSBzLnN1YnN0cihwb3MsIGxlbik7XHJcbiAgICByZXR1cm4gbWdOdW0uYV8yX2xvbmcoc3RyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbW92ZV9kYXRlXzEoc3RyOiBzdHJpbmcsIHBvczogbnVtYmVyLCBtb3ZlYnk6IG51bWJlciwgbGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgc3RyID0gU3RyVXRpbC5tZW1tb3ZlKHN0ciwgcG9zICsgbW92ZWJ5LCBzdHIsIHBvcywgbGVuIC0gcG9zKTtcclxuXHJcbiAgICBzdHIgPSBTdHJVdGlsLm1lbXNldChzdHIsIHBvcywgJzAnLCBtb3ZlYnkpO1xyXG4gICAgcmV0dXJuIHN0cjtcclxuICB9XHJcblxyXG4gIHRpbWVfMl9hKEFzY2lpOiBzdHJpbmcsIEFzY2lpTDogbnVtYmVyLCB0aW1lOiBudW1iZXIsIEZvcm1hdDogc3RyaW5nLCBjb21wSWR4OiBudW1iZXIsIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IHN0cmluZyB7XHJcblxyXG4gICAgaWYgKFN0clV0aWwucnRyaW0oRm9ybWF0KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgRm9ybWF0ID0gXCJISDpNTTpTU1wiO1xyXG4gICAgfVxyXG4gICAgbGV0IHBpYzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSwgY29tcElkeCk7XHJcbiAgICBpZiAoQXNjaWkgPT09IG51bGwpIHtcclxuICAgICAgQXNjaWkgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudGltZV8yX2FfcGljKEFzY2lpLCBBc2NpaUwsIHRpbWUsIHBpYywgZmFsc2UsIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJhbnNsYXRlcyBhIHN0cmluZyB0byBtYWdpYyBsb2dpY2FsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPiAgIEEgc3RyaW5nIHZhbHVlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gICAgICAgICBUaGUgcGljdHVyZSB0byB1c2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+ICAgIFRoZSByYW5nZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxvZ2ljYWwgdmFsdWVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHRvTG9naWNhbChkaXNwVmFsdWU6IHN0cmluZywgcGljOiBQSUMsIHJhbmdlU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgZGlzcFZhbHVlID0gZGlzcFZhbHVlLnRyaW0oKTtcclxuICAgIGlmIChkaXNwVmFsdWUgPT09IG51bGwgfHwgZGlzcFZhbHVlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBkaXNwVmFsdWUgPSBcIkZhbHNlXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwXzJfbG9naWNhbChkaXNwVmFsdWUsIHBpYy5nZXRNYXNrKCksIHJhbmdlU3RyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgdGhlIGRpc3BsYXllZCB2YWx1ZSB0byBhIG1hZ2ljIGxvZ2ljYWwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcFZhbHVlXCI+dGhlIGRpc3BsYXllZCB2YWx1ZSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWFza1wiPnRoZSBtYXNrIG9mIHRoZSBkaXNwbGF5ZWQgdmFsdWUgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+dGhlIHJhbmdlIHN0cmluZyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgZGlzcF8yX2xvZ2ljYWwoZGlzcFZhbHVlOiBzdHJpbmcsIG1hc2s6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHN0cmlwcGVkVmFsdWU6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihkaXNwVmFsdWUubGVuZ3RoKTtcclxuXHJcbiAgICByYW5nZVN0ciA9IHRoaXMud2luX3JuZ19ib29sKHJhbmdlU3RyKTtcclxuICAgIHJhbmdlU3RyID0gU3RyVXRpbC5tYWtlUHJpbnRhYmxlVG9rZW5zKHJhbmdlU3RyLCBTRVFfMl9IVE1MKTtcclxuICAgIGxldCBpOiBudW1iZXIgPSByYW5nZVN0ci5pbmRleE9mKCcsJyk7XHJcbiAgICBsZXQgdHJ1ZVN0cjogc3RyaW5nID0gcmFuZ2VTdHIuc3Vic3RyKDAsIGkpO1xyXG4gICAgdHJ1ZVN0ciA9IFN0clV0aWwubWFrZVByaW50YWJsZVRva2Vucyh0cnVlU3RyLCBIVE1MXzJfU1RSKTtcclxuICAgIGkgPSAwO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBkaXNwVmFsdWUubGVuZ3RoICYmIGkgPCBtYXNrLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChtYXNrLmNoYXJDb2RlQXQoaSkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWCkge1xyXG4gICAgICAgIHN0cmlwcGVkVmFsdWUuQXBwZW5kKGRpc3BWYWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsOiBzdHJpbmcgPSBzdHJpcHBlZFZhbHVlLlRvU3RyaW5nKCk7XHJcbiAgICBpZiAodHJ1ZVN0ci5sZW5ndGggPCB2YWwubGVuZ3RoKSB7XHJcbiAgICAgIHZhbCA9IHZhbC5zdWJzdHIoMCwgdHJ1ZVN0ci5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh2YWwubGVuZ3RoIDwgdHJ1ZVN0ci5sZW5ndGgpIHtcclxuICAgICAgICB0cnVlU3RyID0gdHJ1ZVN0ci5zdWJzdHIoMCwgdmFsLmxlbmd0aCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAodmFsLnRvVXBwZXJDYXNlKCkgPT09IHRydWVTdHIudG9VcHBlckNhc2UoKSkgPyBcIjFcIiA6IFwiMFwiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbnZlcnRpbmcgdGhlIGRpc3BsYXllZCB2YWx1ZSBvZiBhIHN0cmluZyB0byBpbnRlcm5hbFxyXG4gIC8vLyAgIHJlcHJlc2VudGF0aW9uIG11c3QgcmVtb3ZlIHRoZSBtYXNraW5nIGNoYXJhY3RlcnMgZnJvbSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSB0b0FscGhhKGRpc3BWYWx1ZTogc3RyaW5nLCBwaWM6IFBJQyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHBpY3R1cmU6IHN0cmluZyA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIocGljLmdldE1hc2tTaXplKCkpO1xyXG4gICAgbGV0IElzQWxwaGFEQkNTOiBib29sZWFuID0gVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBwaWMuaXNBdHRyQWxwaGEoKTtcclxuICAgIGxldCBjdXJyUGljdHVyZTogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IGN1cnJQaWN0dXJlID0gMDtcclxuXHJcbiAgICBmb3IgKGN1cnJQaWN0dXJlID0gaSA9IDA7IGkgPCBkaXNwVmFsdWUubGVuZ3RoICYmIGN1cnJQaWN0dXJlIDwgcGljdHVyZS5sZW5ndGg7IGkrKywgY3VyclBpY3R1cmUrKykge1xyXG4gICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZShwaWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpKSB7XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChkaXNwVmFsdWUuY2hhckF0KGkpKTtcclxuXHJcbiAgICAgICAgaWYgKElzQWxwaGFEQkNTKSB7XHJcbiAgICAgICAgICAvLyBhIERCQ1MgY2hhcmFjdGVyIGluIFwiZGlzcFZhbHVlXCIgY29uc3VtZXMgdHdvIGNoYXJhY3RlcnMgaW4gXCJwaWN0dXJlXCJcclxuICAgICAgICAgIGxldCBzdHJEc3BWYWxPbmVDaGFyOiBzdHJpbmcgPSBkaXNwVmFsdWUuc3Vic3RyKGksIDEpO1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0ckRzcFZhbE9uZUNoYXIpID09PSAyKSB7XHJcbiAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIGNoZWNrZWQgY2hhciBBbHBoYSBQb3NpdGlvbmFsIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICBzdGF0aWMgaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19VIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0wgfHxcclxuICAgICAgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0cgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfUyB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19UKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tcGFyYXRpdmUgbmV3VmFsdWUgd2l0aCBwb3NzaWJsZSBSYW5nZSBpbiBDb250aW51b3VzUmFuZ2VWYWx1ZXMvZGlzY3JldGVSYW5nZVZhbHVlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXdWYWx1ZSBpZiBpdCBwb3NzaWJsZSwgb2xkIHZhbHVlIG93ZXJ2aXNlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGZpbGxBbHBoYUJ5UmFuZ2UoQ29udGludW91c1JhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4sIGRpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHRtcEJ1ZmZlcjogc3RyaW5nID0gdGhpcy5maWxsQWxwaGFCeURpc2NyZXRlUmFuZ2VWYWx1ZXMoZGlzY3JldGVSYW5nZVZhbHVlcywgbmV3VmFsdWUpO1xyXG4gICAgaWYgKHRtcEJ1ZmZlciAhPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdG1wQnVmZmVyO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRtcEJ1ZmZlciA9IHRoaXMuZmlsbEFscGhhQnlDb250aW51b3VzUmFuZ2VWYWx1ZXMoQ29udGludW91c1JhbmdlVmFsdWVzLCBuZXdWYWx1ZSk7XHJcbiAgICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gdG1wQnVmZmVyO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChkaXNjcmV0ZVJhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0bXBCdWZmZXIgPSB0aGlzLmNvbXBsZXRlQWxwaGFCeVJhbmdlKGRpc2NyZXRlUmFuZ2VWYWx1ZXMsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHVucG9zc2libGUgdG8gZmluZCBpdCBpbiB0aGUgcmFuZ2UgcmV0dXJuIG5vdCBjaGFuZ2VkIG9sZHZhbHVlXHJcbiAgICByZXR1cm4gbmV3VmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCBBbHBoYSBzdHJpbmcgYnkgZGlzY3JldGUgcmFuZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzY3JldGVSYW5nZVZhbHVlc1wiPnZlY3RvciBvZiBkaXNjcmV0ZSByYW5nZSB2YWx1ZXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbHVlXCI+dmFsdWUsIHRyeSBmb3VuZCBpbiB0aGUgdmVjdG9yIG9mIGRpc2NyZXRlIHJhbmdlc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZm91bmQgdmFsdWUgb3IgbnVsbChub3QgZm91bmQpXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBmaWxsQWxwaGFCeURpc2NyZXRlUmFuZ2VWYWx1ZXMoZGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+LCBuZXdWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmIChkaXNjcmV0ZVJhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkaXNjcmV0ZVJhbmdlVmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGRpc2NyZXRlVmFsdWU6IHN0cmluZyA9IGRpc2NyZXRlUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgbGV0IHRydW5jYXRlZFZhbHVlOiBzdHJpbmcgPSBkaXNjcmV0ZVZhbHVlLnN1YnN0cigwLCBNYXRoLm1pbihuZXdWYWx1ZS5sZW5ndGgsIGRpc2NyZXRlVmFsdWUubGVuZ3RoKSk7XHJcbiAgICAgICAgaWYgKG5ld1ZhbHVlLnRvVXBwZXJDYXNlKCkgPT09IHRydW5jYXRlZFZhbHVlLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgIHJldHVybiBkaXNjcmV0ZVZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCBBbHBoYSBzdHJpbmcgYnkgY29udGludW91cyByYW5nZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJDb250aW51b3VzUmFuZ2VWYWx1ZXNcIj52ZWN0b3Igb2YgY29udGludW91cyByYW5nZSB2YWx1ZXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbHVlXCI+dmFsdWUsIHRyeSBmb3VuZCBpbiB0aGUgdmVjdG9yIG9mIGNvbnRpbnVvdXMgcmFuZ2VzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBmb3VuZCB2YWx1ZSBvciBudWxsKG5vdCBmb3VuZClcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGZpbGxBbHBoYUJ5Q29udGludW91c1JhbmdlVmFsdWVzKENvbnRpbnVvdXNSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+LCBuZXdWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIG5ld1ZhbHVlID0gU3RyVXRpbC5ydHJpbShuZXdWYWx1ZSk7XHJcblxyXG5cclxuICAgIGlmIChDb250aW51b3VzUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IENvbnRpbnVvdXNSYW5nZVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBmcm9tOiBzdHJpbmcgPSBDb250aW51b3VzUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgbGV0IHRvOiBzdHJpbmcgPSBDb250aW51b3VzUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSA9IGkgKyAxKTtcclxuICAgICAgICBpZiAoTlN0cmluZy5Db21wYXJlT3JkaW5hbChuZXdWYWx1ZSwgZnJvbSkgPj0gMCAmJiBOU3RyaW5nLkNvbXBhcmVPcmRpbmFsKG5ld1ZhbHVlLCB0bykgPD0gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyeSB0byBjb21wbGV0ZSB0aGUgbmV3VmFsdWUgdXNpbmcgdGhlIFJhbmdlXHJcbiAgLy8vICAgZmlyc3QgdHJ5IHRvIGNvbWxldGUgdGhlIHZhbHVlIGZvciBjYXNlIG1lYW5pbmcgYW5kIGFmdGVyIHRoYXQgZm9yIGlnbm9yZSBjYXNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZlY3RvclwiPm9mIHJhbmdlc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hlY2tlZFwiPnZhbHVlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB2YWx1ZSBjb21wbGV0ZWQgYnkgcmFuZ2VcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGNvbXBsZXRlQWxwaGFCeVJhbmdlKGRpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IG1heENvaW5jaWRlOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KDIpO1xyXG4gICAgZm9yIChsZXQgX2FpOiBudW1iZXIgPSAwOyBfYWkgPCBtYXhDb2luY2lkZS5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICBtYXhDb2luY2lkZVtfYWldID0gMDtcclxuXHJcbiAgICBsZXQgYmVzdEl0ZW06IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oMik7XHJcbiAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IGJlc3RJdGVtLmxlbmd0aDsgKytfYWkpXHJcbiAgICAgIGJlc3RJdGVtW19haV0gPSBudWxsO1xyXG5cclxuICAgIGxldCBDSEVDS19DQVNFOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IElHTk9SRV9DQVNFOiBudW1iZXIgPSAxO1xyXG5cclxuICAgIGxldCBjYXNlTGV0dGVyczogbnVtYmVyID0gQ0hFQ0tfQ0FTRTtcclxuXHJcbiAgICB3aGlsZSAoY2FzZUxldHRlcnMgPT09IENIRUNLX0NBU0UgfHwgY2FzZUxldHRlcnMgPT09IElHTk9SRV9DQVNFKSB7XHJcbiAgICAgIGxldCBsb3dlclZhbHVlOiBzdHJpbmc7XHJcbiAgICAgIGlmIChjYXNlTGV0dGVycyA9PT0gQ0hFQ0tfQ0FTRSkge1xyXG4gICAgICAgIGxvd2VyVmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsb3dlclZhbHVlID0gbmV3VmFsdWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgfVxyXG4gICAgICBsb3dlclZhbHVlID0gU3RyVXRpbC5ydHJpbShsb3dlclZhbHVlKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRpc2NyZXRlUmFuZ2VWYWx1ZXMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgd3JvbmdMZXR0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBsZXQgY3VyckNvaW5jaWRlOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxldCByYW5nZUl0ZW06IHN0cmluZztcclxuICAgICAgICBpZiAoY2FzZUxldHRlcnMgPT09IENIRUNLX0NBU0UpIHtcclxuICAgICAgICAgIHJhbmdlSXRlbSA9IGRpc2NyZXRlUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmFuZ2VJdGVtID0gZGlzY3JldGVSYW5nZVZhbHVlcy5nZXRfSXRlbShpKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbG93TGVuZ3RoOiBudW1iZXIgPSBsb3dlclZhbHVlLmxlbmd0aDtcclxuICAgICAgICBsZXQgcmFuZ2VMZW5ndGg6IG51bWJlciA9IHJhbmdlSXRlbS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxvd0xlbmd0aCA8IHJhbmdlTGVuZ3RoKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgbG93TGVuZ3RoOyBqID0gaiArIDEpIHtcclxuICAgICAgICAgICAgaWYgKCEobG93ZXJWYWx1ZS5jaGFyQXQoaikgPT09IHJhbmdlSXRlbS5jaGFyQXQoaikpKSB7XHJcbiAgICAgICAgICAgICAgd3JvbmdMZXR0ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJDb2luY2lkZSA9IGN1cnJDb2luY2lkZSArIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgd3JvbmdMZXR0ZXIgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN1cnJDb2luY2lkZSA+IG1heENvaW5jaWRlW2Nhc2VMZXR0ZXJzXSAmJiAhd3JvbmdMZXR0ZXIpIHtcclxuICAgICAgICAgIGJlc3RJdGVtW2Nhc2VMZXR0ZXJzXSA9IGRpc2NyZXRlUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgICBtYXhDb2luY2lkZVtjYXNlTGV0dGVyc10gPSBjdXJyQ29pbmNpZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhc2VMZXR0ZXJzID0gY2FzZUxldHRlcnMgKyAxO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpZiAoYmVzdEl0ZW1bQ0hFQ0tfQ0FTRV0gIT09IG51bGwpXHJcbiAgICAgIHJldHVybiBiZXN0SXRlbVtDSEVDS19DQVNFXTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoYmVzdEl0ZW1bSUdOT1JFX0NBU0VdICE9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiBiZXN0SXRlbVtJR05PUkVfQ0FTRV07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXREYXRlQ2hhcihkYXRlQ2hhcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLkRBVEVDSEFSID0gZGF0ZUNoYXI7XHJcbiAgfVxyXG5cclxuICBnZXREYXRlQ2hhcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuREFURUNIQVI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RvcmFnZUF0dHJpYnV0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgU3RyaW5nVmFsdWVUb01nVmFsdWUodmFsdWU6IHN0cmluZywgc3RvcmFnZUF0dHJpYnV0ZTogU3RvcmFnZUF0dHJpYnV0ZSwgZmlsbGVyOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyKTogYW55IHtcclxuICAgIHN3aXRjaCAoc3RvcmFnZUF0dHJpYnV0ZSkge1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOiB7XHJcbiAgICAgICAgbGV0IG5ld1ZhbDogc3RyaW5nID0gdmFsdWU7XHJcbiAgICAgICAgbmV3VmFsID0gTlN0cmluZy5QYWRSaWdodChuZXdWYWwsIGxlbmd0aCwgZmlsbGVyKTtcclxuICAgICAgICByZXR1cm4gbmV3VmFsO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBOVU1fVFlQRSh2YWx1ZSk7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBCZWluZyB1c2VkIHRvIHNlbmQgcGFyYW1ldGVycyB0byB0aGUgJ3RpbWVfYnJlYWsnIG1ldGhvZFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgVGltZUJyZWFrUGFyYW1zIHtcclxuICBob3VyOiBudW1iZXIgPSAwO1xyXG4gIG1pbnV0ZTogbnVtYmVyID0gMDtcclxuICBzZWNvbmQ6IG51bWJlciA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IoaG91cl86IG51bWJlciwgbWludXRlXzogbnVtYmVyLCBzZWNvbmRfOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKGhvdXJfPzogbnVtYmVyLCBtaW51dGVfPzogbnVtYmVyLCBzZWNvbmRfPzogbnVtYmVyKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKGhvdXJfLCBtaW51dGVfLCBzZWNvbmRfKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShob3VyXzogbnVtYmVyLCBtaW51dGVfOiBudW1iZXIsIHNlY29uZF86IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5ob3VyID0gaG91cl87XHJcbiAgICB0aGlzLm1pbnV0ZSA9IG1pbnV0ZV87XHJcbiAgICB0aGlzLnNlY29uZCA9IHNlY29uZF87XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIEJlaW5nIHVzZWQgdG8gc2VuZCBpbnQgYnkgUmVmXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmNsYXNzIEludFJlZiB7XHJcbiAgdmFsOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2YWxfOiBudW1iZXIpIHtcclxuICAgIHRoaXMudmFsID0gdmFsXztcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgQmVpbmcgdXNlZCB0byBzZW5kIHBhcmFtZXRlcnMgdG8gdGhlICdkYXRlX2lfMl9ubScgbWV0aG9kXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmNsYXNzIERhdGVOYW1lUGFyYW1zIHtcclxuICBvdXRWYWw6IHN0cmluZ1tdID0gbnVsbDtcclxuICBsZW46IG51bWJlciA9IDA7XHJcbiAgb3V0SWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvdXRfOiBzdHJpbmdbXSwgb3V0SWR4XzogbnVtYmVyLCBsZW5fOiBudW1iZXIpIHtcclxuICAgIHRoaXMub3V0VmFsID0gb3V0XztcclxuICAgIHRoaXMub3V0SWR4ID0gb3V0SWR4XztcclxuICAgIHRoaXMubGVuID0gbGVuXztcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgQmVpbmcgdXNlZCB0byBzZW5kIHBhcmFtZXRlcnMgdG8gdGhlICdkYXRlX2JyZWFrX2RhdGVtb2RlJyBtZXRob2RcclxuLy8vICAgaXQncyBzdHJ1Y3RcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIERhdGVCcmVha1BhcmFtcyB7XHJcbiAgZGF5OiBudW1iZXIgPSAwO1xyXG4gIGRvdzogbnVtYmVyID0gMDtcclxuICBkb3k6IG51bWJlciA9IDA7XHJcbiAgbW9udGg6IG51bWJlciA9IDA7XHJcbiAgeWVhcjogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3Rvcih5ZWFyXzogbnVtYmVyLCBtb250aF86IG51bWJlciwgZGF5XzogbnVtYmVyLCBkb3lfOiBudW1iZXIsIGRvd186IG51bWJlcik7XHJcbiAgY29uc3RydWN0b3IoeWVhcl8/OiBudW1iZXIsIG1vbnRoXz86IG51bWJlciwgZGF5Xz86IG51bWJlciwgZG95Xz86IG51bWJlciwgZG93Xz86IG51bWJlcikge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMSh5ZWFyXywgbW9udGhfLCBkYXlfLCBkb3lfLCBkb3dfKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMSh5ZWFyXzogbnVtYmVyLCBtb250aF86IG51bWJlciwgZGF5XzogbnVtYmVyLCBkb3lfOiBudW1iZXIsIGRvd186IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy55ZWFyID0geWVhcl87XHJcbiAgICB0aGlzLm1vbnRoID0gbW9udGhfO1xyXG4gICAgdGhpcy5kYXkgPSBkYXlfO1xyXG4gICAgdGhpcy5kb3kgPSBkb3lfO1xyXG4gICAgdGhpcy5kb3cgPSBkb3dfO1xyXG4gIH1cclxufVxyXG4iXX0=