@magic-xpa/gui 4.800.0-dev480.21 → 4.800.0-dev480.213
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.
- package/bundles/magic-xpa-gui.umd.js +1055 -7529
- package/bundles/magic-xpa-gui.umd.js.map +1 -1
- package/bundles/magic-xpa-gui.umd.min.js +1 -1
- package/bundles/magic-xpa-gui.umd.min.js.map +1 -1
- package/esm2015/index.js +1 -1
- package/esm2015/magic-xpa-gui.js +1 -4
- package/esm2015/src/Commands.js +11 -114
- package/esm2015/src/Events.js +1 -517
- package/esm2015/src/EventsProcessor.js +1 -51
- package/esm2015/src/FocusManager.js +1 -13
- package/esm2015/src/GuiConstants.js +2 -11
- package/esm2015/src/GuiEnums.js +126 -130
- package/esm2015/src/GuiEnvironment.js +1 -1
- package/esm2015/src/IFlowMonitorQueue.js +1 -1
- package/esm2015/src/Manager.js +10 -148
- package/esm2015/src/UIBridge.js +1 -6
- package/esm2015/src/env/IEnvironment.js +1 -1
- package/esm2015/src/gui/ControlBase.js +1 -1
- package/esm2015/src/gui/GuiMgControl.js +1 -94
- package/esm2015/src/gui/GuiMgForm.js +1 -1
- package/esm2015/src/gui/KeyboardItem.js +5 -46
- package/esm2015/src/gui/LastFocusedVal.js +1 -5
- package/esm2015/src/gui/MgValue.js +1 -1
- package/esm2015/src/gui/PropParentInterface.js +1 -1
- package/esm2015/src/gui/low/DialogHandler.js +1 -10
- package/esm2015/src/gui/low/GuiCommand.js +1 -12
- package/esm2015/src/gui/low/GuiCommandQueue.js +1 -66
- package/esm2015/src/gui/low/GuiInteractive.js +8 -465
- package/esm2015/src/gui/low/Style.js +1 -9
- package/esm2015/src/management/RuntimeContextBase.js +11 -14
- package/esm2015/src/management/data/BlobType.js +0 -0
- package/esm2015/src/management/data/DcValues.js +8 -67
- package/esm2015/src/management/data/DcValuesBuilderBase.js +2 -37
- package/esm2015/src/management/data/FieldDef.js +1 -95
- package/esm2015/src/management/data/FieldsTable.js +2 -28
- package/esm2015/src/management/data/GuiDataViewBase.js +33 -72
- package/esm2015/src/management/data/GuiFieldBase.js +4 -39
- package/esm2015/src/management/data/IRecord.js +1 -1
- package/esm2015/src/management/data/IReferencedObject.js +1 -8
- package/esm2015/src/management/data/NUM_TYPE.js +14 -485
- package/esm2015/src/management/data/ObjectReferenceBase.js +1 -3
- package/esm2015/src/management/data/ObjectReferencesCollection.js +1 -2
- package/esm2015/src/management/data/RecordUtils.js +6 -112
- package/esm2015/src/management/data/VectorType.js +17 -252
- package/esm2015/src/management/data/VectorTypeBase.js +1 -35
- package/esm2015/src/management/events/IActionManager.js +1 -1
- package/esm2015/src/management/events/IGuiEventsManager.js +1 -1
- package/esm2015/src/management/exp/ExpressionInterface.js +5 -3
- package/esm2015/src/management/exp/GuiExpressionEvaluator.js +38 -155
- package/esm2015/src/management/gui/ControlTable.js +18 -72
- package/esm2015/src/management/gui/DisplayConvertor.js +43 -493
- package/esm2015/src/management/gui/FieldValidator.js +58 -339
- package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +1 -1
- package/esm2015/src/management/gui/GuiFormPropertyAdapter.js +1 -8
- package/esm2015/src/management/gui/HebrewDate.js +3 -140
- package/esm2015/src/management/gui/Helps.js +2 -48
- package/esm2015/src/management/gui/MgControlBase.js +143 -876
- package/esm2015/src/management/gui/MgFormBase.js +68 -407
- package/esm2015/src/management/gui/PIC.js +58 -285
- package/esm2015/src/management/gui/PropDefaults.js +13 -48
- package/esm2015/src/management/gui/PropInterface.js +2 -4
- package/esm2015/src/management/gui/PropTable.js +72 -183
- package/esm2015/src/management/gui/Property.js +38 -372
- package/esm2015/src/management/gui/ValidationDetails.js +10 -52
- package/esm2015/src/management/gui/ValidationDetailsBase.js +12 -45
- package/esm2015/src/management/gui/WrongFormatException.js +1 -15
- package/esm2015/src/management/tasks/GuiDataCollection.js +1 -1
- package/esm2015/src/management/tasks/GuiTaskBase.js +38 -383
- package/esm2015/src/management/tasks/IMGDataTable.js +1 -1
- package/esm2015/src/management/tasks/ITask.js +1 -1
- package/esm2015/src/management/tasks/MgTimer.js +1 -16
- package/esm2015/src/management/tasks/TaskDefinitionId.js +8 -18
- package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +1 -13
- package/esm2015/src/util/AuthenticationDialogHandler.js +1 -4
- package/esm2015/src/util/MemoryUtil.js +1 -41
- package/esm2015/src/util/ObjectReference.js +1 -8
- package/esm2015/src/util/ProcessLauncher.js +3 -21
- package/esm2015/src/util/UsernamePasswordCredentials.js +1 -9
- package/fesm2015/magic-xpa-gui.js +859 -7052
- package/fesm2015/magic-xpa-gui.js.map +1 -1
- package/magic-xpa-gui.d.ts +0 -3
- package/package.json +2 -2
- package/src/Commands.d.ts +2 -0
- package/src/Events.d.ts +0 -2
- package/src/GuiEnums.d.ts +125 -128
- package/src/env/IEnvironment.d.ts +3 -0
- package/src/gui/PropParentInterface.d.ts +1 -1
- package/src/gui/low/GuiInteractive.d.ts +3 -1
- package/src/gui/low/Style.d.ts +0 -3
- package/src/management/RuntimeContextBase.d.ts +2 -0
- package/src/management/data/GuiDataViewBase.d.ts +4 -4
- package/src/management/data/IRecord.d.ts +1 -1
- package/src/management/exp/ExpressionInterface.d.ts +4 -0
- package/src/management/exp/GuiExpressionEvaluator.d.ts +4 -6
- package/src/management/gui/ControlTable.d.ts +1 -1
- package/src/management/gui/DisplayConvertor.d.ts +1 -1
- package/src/management/gui/GuiControlPropertyAdapter.d.ts +1 -1
- package/src/management/gui/MgControlBase.d.ts +7 -7
- package/src/management/gui/MgFormBase.d.ts +6 -6
- package/src/management/gui/PIC.d.ts +1 -0
- package/src/management/gui/PropInterface.d.ts +2 -4
- package/src/management/gui/PropTable.d.ts +4 -5
- package/src/management/gui/Property.d.ts +1 -1
- package/src/management/tasks/GuiTaskBase.d.ts +8 -14
- package/src/management/tasks/TaskDefinitionId.d.ts +1 -0
|
@@ -8,7 +8,6 @@ import { HebrewDate } from './HebrewDate';
|
|
|
8
8
|
import { Events } from '../../Events';
|
|
9
9
|
import { GuiEnvironment } from '../../GuiEnvironment';
|
|
10
10
|
import { MemoryUtil } from '../../util/MemoryUtil';
|
|
11
|
-
// @dynamic
|
|
12
11
|
export class DisplayConvertor {
|
|
13
12
|
constructor() {
|
|
14
13
|
this._environment = null;
|
|
@@ -41,19 +40,6 @@ export class DisplayConvertor {
|
|
|
41
40
|
mg2disp_1(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, time_date_pic_Z_edt) {
|
|
42
41
|
return this.mg2disp(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, false, time_date_pic_Z_edt);
|
|
43
42
|
}
|
|
44
|
-
/// <summary>
|
|
45
|
-
/// Build a display string of a value from its picture format
|
|
46
|
-
/// </summary>
|
|
47
|
-
/// <param name = "mgValue">the internal value (as sent in the XML)
|
|
48
|
-
/// </param>
|
|
49
|
-
/// <param name = "rangeStr">value range
|
|
50
|
-
/// </param>
|
|
51
|
-
/// <param name = "pic">the picture format
|
|
52
|
-
/// </param>
|
|
53
|
-
/// <param name = "alwaysFill">Always auto fill alpha over its picture (used for select controls)
|
|
54
|
-
/// </param>
|
|
55
|
-
/// <returns> string to display
|
|
56
|
-
/// </returns>
|
|
57
43
|
mg2disp_2(mgValue, rangeStr, pic, useNative, alwaysFill, compIdx, convertCase, time_date_num_pic_Z_edt) {
|
|
58
44
|
let str = "";
|
|
59
45
|
let tmpRange = (rangeStr === null) ? "" : rangeStr;
|
|
@@ -63,10 +49,15 @@ export class DisplayConvertor {
|
|
|
63
49
|
str = this.fromAlpha(mgValue, pic, tmpRange, alwaysFill, convertCase);
|
|
64
50
|
break;
|
|
65
51
|
case StorageAttribute.NUMERIC: {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
52
|
+
let newPic = pic.getUnformattedNumericPic();
|
|
53
|
+
let dec = GuiEnvironment.Environment.GetDecimal();
|
|
54
|
+
let thou = GuiEnvironment.Environment.GetThousands();
|
|
55
|
+
GuiEnvironment.Environment.setDecimalSeparator('.');
|
|
56
|
+
GuiEnvironment.Environment.setThousandsSeparator(',');
|
|
57
|
+
str = this.fromNum(mgValue, newPic);
|
|
58
|
+
GuiEnvironment.Environment.setDecimalSeparator(dec);
|
|
59
|
+
GuiEnvironment.Environment.setThousandsSeparator(thou);
|
|
60
|
+
if (newPic.getMaskChars() === 0 || !time_date_num_pic_Z_edt)
|
|
70
61
|
str = StrUtil.ltrim(str);
|
|
71
62
|
if (useNative) {
|
|
72
63
|
if (str == "")
|
|
@@ -113,19 +104,6 @@ export class DisplayConvertor {
|
|
|
113
104
|
}
|
|
114
105
|
return str;
|
|
115
106
|
}
|
|
116
|
-
/// <summary>
|
|
117
|
-
/// Build an internal representation of a display value from its picture format
|
|
118
|
-
/// </summary>
|
|
119
|
-
/// <param name = "dispValue">the value as entered by user
|
|
120
|
-
/// </param>
|
|
121
|
-
/// <param name = "rangeStr">value range
|
|
122
|
-
/// </param>
|
|
123
|
-
/// <param name = "pic">the picture format
|
|
124
|
-
/// </param>
|
|
125
|
-
/// <param name = "blobContentType">if the attribute is blob, its content type
|
|
126
|
-
/// </param>
|
|
127
|
-
/// <returns> internal form of data (as used in the XML)
|
|
128
|
-
/// </returns>
|
|
129
107
|
disp2mg(dispValue, rangeStr, pic, compIdx, blobContentType) {
|
|
130
108
|
let str = "";
|
|
131
109
|
switch (pic.getAttr()) {
|
|
@@ -136,7 +114,6 @@ export class DisplayConvertor {
|
|
|
136
114
|
case StorageAttribute.NUMERIC:
|
|
137
115
|
{
|
|
138
116
|
dispValue = String(dispValue);
|
|
139
|
-
// Remove the mask from display value.
|
|
140
117
|
let len = dispValue.length;
|
|
141
118
|
while (len > 0) {
|
|
142
119
|
if (!pic.picIsMask(len - 1) && dispValue[len - 1] !== (' '))
|
|
@@ -147,13 +124,19 @@ export class DisplayConvertor {
|
|
|
147
124
|
dispValue = NString.Remove(dispValue, len, (dispValue.length - len));
|
|
148
125
|
if (pic.isNegative() && dispValue.trim().startsWith("-"))
|
|
149
126
|
dispValue = StrUtil.ltrim(dispValue);
|
|
150
|
-
|
|
127
|
+
let dec = GuiEnvironment.Environment.GetDecimal();
|
|
128
|
+
let thou = GuiEnvironment.Environment.GetThousands();
|
|
129
|
+
GuiEnvironment.Environment.setDecimalSeparator('.');
|
|
130
|
+
GuiEnvironment.Environment.setThousandsSeparator(',');
|
|
131
|
+
let newPic = pic.getUnformattedNumericPic();
|
|
132
|
+
str = this.toNum(dispValue, newPic, compIdx);
|
|
133
|
+
GuiEnvironment.Environment.setDecimalSeparator(dec);
|
|
134
|
+
GuiEnvironment.Environment.setThousandsSeparator(thou);
|
|
151
135
|
}
|
|
152
136
|
break;
|
|
153
137
|
case StorageAttribute.DATE:
|
|
154
138
|
{
|
|
155
139
|
let dt;
|
|
156
|
-
//when date is in item list for choice ctrl, it will come here as string. so convert it to Date.
|
|
157
140
|
if (typeof dispValue === 'string')
|
|
158
141
|
dt = new Date(dispValue);
|
|
159
142
|
else
|
|
@@ -164,7 +147,6 @@ export class DisplayConvertor {
|
|
|
164
147
|
case StorageAttribute.TIME:
|
|
165
148
|
{
|
|
166
149
|
let dt;
|
|
167
|
-
//when date is in item list for choice ctrl, it will come here as string. so convert it to Date.
|
|
168
150
|
if (typeof dispValue === 'string') {
|
|
169
151
|
dt = new Date();
|
|
170
152
|
if (dispValue !== null) {
|
|
@@ -188,32 +170,10 @@ export class DisplayConvertor {
|
|
|
188
170
|
}
|
|
189
171
|
return str;
|
|
190
172
|
}
|
|
191
|
-
// --------------------------------------------------------------------------
|
|
192
|
-
// Methods for coverting INTERNAL ---> DIPLAY
|
|
193
|
-
// --------------------------------------------------------------------------
|
|
194
|
-
/// <summary>
|
|
195
|
-
/// Handles magic number value
|
|
196
|
-
/// </summary>
|
|
197
|
-
/// <param name = "mgNum"> A Magic Number</param>
|
|
198
|
-
/// <param name = "picStr"> The picture to use</param>
|
|
199
|
-
/// <returns> the string to be displayed</returns>
|
|
200
173
|
fromNum(mgValue, pic) {
|
|
201
174
|
let mgNum = new NUM_TYPE(mgValue);
|
|
202
175
|
return mgNum.toDisplayValue(pic);
|
|
203
176
|
}
|
|
204
|
-
/// <summary>
|
|
205
|
-
/// Build a display string for an alpha value according to the picture
|
|
206
|
-
/// </summary>
|
|
207
|
-
/// <param name = "dataStr"> The source data
|
|
208
|
-
/// </param>
|
|
209
|
-
/// <param name = "picStr"> The picture to use for the value to display
|
|
210
|
-
/// </param>
|
|
211
|
-
/// <param name = "rangeStr"> The range of values to check
|
|
212
|
-
/// </param>
|
|
213
|
-
/// <param name = "alwaysFill">Always auto fill alpha over its picture (used for select controls)
|
|
214
|
-
/// </param>
|
|
215
|
-
/// <returns> the string to be displayed
|
|
216
|
-
/// </returns>
|
|
217
177
|
fromAlpha(dataStr, pic, rangeStr, alwaysFill, convertCase) {
|
|
218
178
|
let len = pic.getMaskSize();
|
|
219
179
|
let min_len = len;
|
|
@@ -223,10 +183,7 @@ export class DisplayConvertor {
|
|
|
223
183
|
resStr = this.win_data_cpy(NString.ToCharArray(maskStr), len, NString.ToCharArray(dataStr), pic.isAttrAlpha(), convertCase);
|
|
224
184
|
}
|
|
225
185
|
else {
|
|
226
|
-
if (UtilStrByteMode.isLocaleDefLangDBCS() && pic.isAttrAlpha())
|
|
227
|
-
// JPN: DBCS support
|
|
228
|
-
{
|
|
229
|
-
// substring by the number of bytes
|
|
186
|
+
if (UtilStrByteMode.isLocaleDefLangDBCS() && pic.isAttrAlpha()) {
|
|
230
187
|
let intDataStrLenB = UtilStrByteMode.lenB(dataStr);
|
|
231
188
|
if (min_len > intDataStrLenB) {
|
|
232
189
|
min_len = intDataStrLenB;
|
|
@@ -245,7 +202,6 @@ export class DisplayConvertor {
|
|
|
245
202
|
}
|
|
246
203
|
}
|
|
247
204
|
}
|
|
248
|
-
// We do not fill Alpha filed over control's picture length QCR # 295408
|
|
249
205
|
if (alwaysFill || (rangeStr !== null && rangeStr.length > 0 && resStr.length < len)) {
|
|
250
206
|
let vd = new ValidationDetailsBase(rangeStr);
|
|
251
207
|
let continuousRangeValues = vd.getContinuousRangeValues();
|
|
@@ -279,15 +235,6 @@ export class DisplayConvertor {
|
|
|
279
235
|
win_data_cpy_0(maskStr, maskLen, dataStr, isAttrAlpha) {
|
|
280
236
|
return this.win_data_cpy(maskStr, maskLen, dataStr, isAttrAlpha, false);
|
|
281
237
|
}
|
|
282
|
-
/// <summary>
|
|
283
|
-
/// Handles alpha value
|
|
284
|
-
/// </summary>
|
|
285
|
-
/// <param name = "maskStr"> The mask to be used in order to build the string
|
|
286
|
-
/// </param>
|
|
287
|
-
/// <param name = "picStr"> The picture to use
|
|
288
|
-
/// </param>
|
|
289
|
-
/// <returns> the string to be displayed
|
|
290
|
-
/// </returns>
|
|
291
238
|
win_data_cpy_1(maskStr, maskLen, dataStr, isAttrAlpha, convertCase) {
|
|
292
239
|
let maskIdx = 0;
|
|
293
240
|
let dataIdx = 0;
|
|
@@ -327,7 +274,7 @@ export class DisplayConvertor {
|
|
|
327
274
|
}
|
|
328
275
|
}
|
|
329
276
|
else {
|
|
330
|
-
resStr[num2++] = ' '
|
|
277
|
+
resStr[num2++] = ' ';
|
|
331
278
|
}
|
|
332
279
|
}
|
|
333
280
|
else {
|
|
@@ -350,7 +297,7 @@ export class DisplayConvertor {
|
|
|
350
297
|
dataIdx = dataIdx + 1;
|
|
351
298
|
}
|
|
352
299
|
else {
|
|
353
|
-
resStr[maskIdx] = ' '
|
|
300
|
+
resStr[maskIdx] = ' ';
|
|
354
301
|
}
|
|
355
302
|
}
|
|
356
303
|
else {
|
|
@@ -360,56 +307,31 @@ export class DisplayConvertor {
|
|
|
360
307
|
}
|
|
361
308
|
return NString.FromChars(resStr);
|
|
362
309
|
}
|
|
363
|
-
/// <summary>
|
|
364
|
-
/// Build a display string for an date value according to the picture
|
|
365
|
-
/// </summary>
|
|
366
|
-
/// <param name = "dataStr"> The source data</param>
|
|
367
|
-
/// <param name = "picStr"> The picture to use for the value to display</param>
|
|
368
|
-
/// <returns> the string to be displayed</returns>
|
|
369
310
|
fromDate(dataStr, pic, compIdx, time_date_pic_Z_edt) {
|
|
370
311
|
let mask = pic.getMask();
|
|
371
312
|
let maskSize = pic.getMaskSize();
|
|
372
313
|
let date = new NUM_TYPE(dataStr).NUM_2_ULONG();
|
|
373
314
|
return this.to_a_pic_datemode(mask, maskSize, date, pic, time_date_pic_Z_edt, false, compIdx);
|
|
374
315
|
}
|
|
375
|
-
/// <summary>
|
|
376
|
-
/// Build a display string for an time value according to the picture
|
|
377
|
-
/// </summary>
|
|
378
|
-
/// <param name = "dataStr"> The source data</param>
|
|
379
|
-
/// <param name = "picStr"> The picture to use for the value to display</param>
|
|
380
|
-
/// <returns> the string to be displayed</returns>
|
|
381
316
|
fromTime(dataStr, pic, time_date_pic_Z_edt) {
|
|
382
317
|
let mask = pic.getMask();
|
|
383
318
|
let maskSize = pic.getMaskSize();
|
|
384
319
|
let time = new NUM_TYPE(dataStr).NUM_2_ULONG();
|
|
385
320
|
return this.time_2_a_pic(mask, maskSize, time, pic, time_date_pic_Z_edt, false);
|
|
386
321
|
}
|
|
387
|
-
/// <summary>
|
|
388
|
-
/// Build a display string for an date value according to the picture
|
|
389
|
-
/// </summary>
|
|
390
|
-
/// <param name = "dataStr"> The source data</param>
|
|
391
|
-
/// <param name = "picStr"> The picture to use for the value to display</param>
|
|
392
|
-
/// <returns> the string to be displayed</returns>
|
|
393
322
|
fromMgDateToNativeDate(dataStr, compIdx) {
|
|
394
323
|
let date = new NUM_TYPE(dataStr).NUM_2_ULONG();
|
|
395
324
|
let breakParams;
|
|
396
325
|
let outIdx = 0;
|
|
397
|
-
// Break data into its components
|
|
398
326
|
breakParams = new DateBreakParams();
|
|
399
327
|
this.date_break_datemode(breakParams, date, false, compIdx);
|
|
400
328
|
if (breakParams.month > 0)
|
|
401
|
-
breakParams.month = breakParams.month - 1;
|
|
329
|
+
breakParams.month = breakParams.month - 1;
|
|
402
330
|
if (breakParams.year == 0 && breakParams.month == 0 && breakParams.day == 0)
|
|
403
331
|
return null;
|
|
404
332
|
let nativeDt = new Date(breakParams.year, breakParams.month, breakParams.day);
|
|
405
333
|
return nativeDt;
|
|
406
334
|
}
|
|
407
|
-
/// <summary>
|
|
408
|
-
/// Build a display string for an date value according to the picture
|
|
409
|
-
/// </summary>
|
|
410
|
-
/// <param name = "dataStr"> The source data</param>
|
|
411
|
-
/// <param name = "picStr"> The picture to use for the value to display</param>
|
|
412
|
-
/// <returns> the string to be displayed</returns>
|
|
413
335
|
fromNativeDateToMgDateNumber(nativeDate, pic, compIdx) {
|
|
414
336
|
let mgNum = new NUM_TYPE();
|
|
415
337
|
let numVal;
|
|
@@ -418,7 +340,6 @@ export class DisplayConvertor {
|
|
|
418
340
|
let year = nativeDate.getFullYear();
|
|
419
341
|
let day = nativeDate.getDate();
|
|
420
342
|
let month = nativeDate.getMonth() + 1;
|
|
421
|
-
// Hebrew Year
|
|
422
343
|
if (pic.isHebrew()) {
|
|
423
344
|
if (year > 0) {
|
|
424
345
|
if (millenium === 0)
|
|
@@ -428,42 +349,20 @@ export class DisplayConvertor {
|
|
|
428
349
|
numVal = (HebrewDate.dateheb_2_d(year, month, day));
|
|
429
350
|
}
|
|
430
351
|
else {
|
|
431
|
-
// the next 2 lines support 4.xx DD/MM pictures
|
|
432
352
|
if (year === 0) {
|
|
433
353
|
dateParams = this.date_sys();
|
|
434
354
|
year = dateParams.year;
|
|
435
355
|
}
|
|
436
|
-
numVal = this.date_4_calender(year, month, day, 0, false);
|
|
356
|
+
numVal = this.date_4_calender(year, month, day, 0, false);
|
|
437
357
|
}
|
|
438
358
|
return numVal;
|
|
439
359
|
}
|
|
440
|
-
/// <summary>
|
|
441
|
-
/// Build a display string for an date value according to the picture
|
|
442
|
-
/// </summary>
|
|
443
|
-
/// <param name = "dataStr"> The source data</param>
|
|
444
|
-
/// <param name = "picStr"> The picture to use for the value to display</param>
|
|
445
|
-
/// <returns> the string to be displayed</returns>
|
|
446
360
|
fromNativeDateToMgDate(nativeDate, pic, compIdx) {
|
|
447
361
|
let mgNum = new NUM_TYPE();
|
|
448
362
|
let numVal = nativeDate == null ? 0 : this.fromNativeDateToMgDateNumber(nativeDate, pic, compIdx);
|
|
449
363
|
mgNum.NUM_4_LONG(numVal);
|
|
450
364
|
return mgNum.toXMLrecord();
|
|
451
365
|
}
|
|
452
|
-
/// <summary>
|
|
453
|
-
/// Handle date value
|
|
454
|
-
/// </summary>
|
|
455
|
-
/// <param name = "outStr"> The mask to be used
|
|
456
|
-
/// </param>
|
|
457
|
-
/// <param name = "out_len"> Mask length
|
|
458
|
-
/// </param>
|
|
459
|
-
/// <param name = "pic"> The picure information
|
|
460
|
-
/// </param>
|
|
461
|
-
/// <param name = "date_pic_Z_edt">
|
|
462
|
-
/// </param>
|
|
463
|
-
/// <param name = "ignore_dt_fmt">
|
|
464
|
-
/// </param>
|
|
465
|
-
/// <returns> the string to be displayed
|
|
466
|
-
/// </returns>
|
|
467
366
|
to_a_pic_datemode(outStr, out_len, date, pic, date_pic_Z_edt, ignore_dt_fmt, compIdx) {
|
|
468
367
|
let len;
|
|
469
368
|
let day = 0;
|
|
@@ -482,13 +381,11 @@ export class DisplayConvertor {
|
|
|
482
381
|
let dateNameParams;
|
|
483
382
|
let outIdx = 0;
|
|
484
383
|
let strOut = null;
|
|
485
|
-
// If result overflows return buffer, fill with asterixs and bail out
|
|
486
384
|
if (pic.getMaskSize() > out_len) {
|
|
487
385
|
for (; i < out_len; i++)
|
|
488
386
|
outVal[i] = '*';
|
|
489
387
|
return NString.FromChars(outVal);
|
|
490
388
|
}
|
|
491
|
-
// If zero fill requested and date value is zero, fill it and bail out
|
|
492
389
|
out_len = len = pic.getMaskSize();
|
|
493
390
|
if (pic.zeroFill() && date === 0 && !date_pic_Z_edt) {
|
|
494
391
|
for (; i < out_len; i++)
|
|
@@ -500,7 +397,6 @@ export class DisplayConvertor {
|
|
|
500
397
|
outVal[i] = ' ';
|
|
501
398
|
return NString.FromChars(outVal);
|
|
502
399
|
}
|
|
503
|
-
// Break data into its components
|
|
504
400
|
breakParams = new DateBreakParams(year, month, day, doy, dow);
|
|
505
401
|
this.date_break_datemode(breakParams, date, ignore_dt_fmt, compIdx);
|
|
506
402
|
if (pic.isHebrew()) {
|
|
@@ -627,8 +523,7 @@ export class DisplayConvertor {
|
|
|
627
523
|
len = dateNameParams.len;
|
|
628
524
|
dateNameParams = null;
|
|
629
525
|
break;
|
|
630
|
-
case PICInterface.PIC_BB:
|
|
631
|
-
// Japanese day of the week
|
|
526
|
+
case PICInterface.PIC_BB:
|
|
632
527
|
p = NString.ToCharArray(UtilDateJpn.getStrDow(dow));
|
|
633
528
|
strOut = null;
|
|
634
529
|
dateNameParams = new DateNameParams(outVal, outIdx, len);
|
|
@@ -643,7 +538,6 @@ export class DisplayConvertor {
|
|
|
643
538
|
case PICInterface.PIC_JY1:
|
|
644
539
|
case PICInterface.PIC_JY2:
|
|
645
540
|
case PICInterface.PIC_JY4:
|
|
646
|
-
// Japanese the name of an era
|
|
647
541
|
let strNum = null;
|
|
648
542
|
if (outVal[outIdx].charCodeAt(0) === PICInterface.PIC_JY1)
|
|
649
543
|
strNum = UtilDateJpn.getInstance().date_jpn_yr_2_a(year, doy, false);
|
|
@@ -678,9 +572,6 @@ export class DisplayConvertor {
|
|
|
678
572
|
MemoryUtil.char_memset(outVal, out_len, ' ', outVal.length - out_len);
|
|
679
573
|
return NString.FromChars(outVal);
|
|
680
574
|
}
|
|
681
|
-
/// <summary>
|
|
682
|
-
/// Break a date into Year, Month, Day in month, Day in year and Day in week
|
|
683
|
-
/// </summary>
|
|
684
575
|
date_break_datemode(breakParams, date, ignore_dt_fmt, compIdx) {
|
|
685
576
|
let year = breakParams.year;
|
|
686
577
|
let month = breakParams.month;
|
|
@@ -748,21 +639,6 @@ export class DisplayConvertor {
|
|
|
748
639
|
breakParams.dow = dow;
|
|
749
640
|
}
|
|
750
641
|
}
|
|
751
|
-
/// <summary>
|
|
752
|
-
/// get alpha string from int value
|
|
753
|
-
/// </summary>
|
|
754
|
-
/// <param name = "str"> the output string (as an char array)
|
|
755
|
-
/// </param>
|
|
756
|
-
/// <param name = "strPos"> starting position
|
|
757
|
-
/// </param>
|
|
758
|
-
/// <param name = "len"> string length
|
|
759
|
-
/// </param>
|
|
760
|
-
/// <param name = "n"> the number to convert
|
|
761
|
-
/// </param>
|
|
762
|
-
/// <param name = "lead"> leading character
|
|
763
|
-
/// </param>
|
|
764
|
-
/// <returns> the result string length
|
|
765
|
-
/// </returns>
|
|
766
642
|
int_2_a(str, strPos, len, n, lead) {
|
|
767
643
|
let neg = n < 0;
|
|
768
644
|
if (len <= 0)
|
|
@@ -774,29 +650,16 @@ export class DisplayConvertor {
|
|
|
774
650
|
n = Math.floor(n / 10);
|
|
775
651
|
} while (pos > 0 && n > 0);
|
|
776
652
|
if (neg && pos > 0) {
|
|
777
|
-
str[strPos + (pos = pos - 1)] = '-'
|
|
653
|
+
str[strPos + (pos = pos - 1)] = '-';
|
|
778
654
|
}
|
|
779
655
|
return this.lib_a_fill(str, strPos, len, pos, lead.charCodeAt(0));
|
|
780
656
|
}
|
|
781
|
-
/// <summary>
|
|
782
|
-
/// Fill the char array for the converting of int->string
|
|
783
|
-
/// </summary>
|
|
784
|
-
/// <param name = "str"> the output string (as an char array)
|
|
785
|
-
/// </param>
|
|
786
|
-
/// <param name = "strPos"> starting position
|
|
787
|
-
/// </param>
|
|
788
|
-
/// <param name = "len"> string length
|
|
789
|
-
/// </param>
|
|
790
|
-
/// <param name = "lead"> leading character
|
|
791
|
-
/// </param>
|
|
792
|
-
/// <returns> the result string length
|
|
793
|
-
/// </returns>
|
|
794
657
|
lib_a_fill(str, strPos, len, pos, lead) {
|
|
795
658
|
if (lead === 0) {
|
|
796
659
|
len = len - pos;
|
|
797
660
|
if (len > 0 && pos > 0) {
|
|
798
661
|
MemoryUtil.char_memcpy(str, strPos, str, pos, len);
|
|
799
|
-
MemoryUtil.char_memset(str, strPos + len, ' ',
|
|
662
|
+
MemoryUtil.char_memset(str, strPos + len, ' ', pos);
|
|
800
663
|
}
|
|
801
664
|
}
|
|
802
665
|
else {
|
|
@@ -806,18 +669,6 @@ export class DisplayConvertor {
|
|
|
806
669
|
}
|
|
807
670
|
return len;
|
|
808
671
|
}
|
|
809
|
-
/// <summary>
|
|
810
|
-
/// Convert index to Name
|
|
811
|
-
/// </summary>
|
|
812
|
-
/// <param name = "dateNameParams"> output sting details
|
|
813
|
-
/// </param>
|
|
814
|
-
/// <param name = "nm"> name
|
|
815
|
-
/// </param>
|
|
816
|
-
/// <param name = "trim"> output string should be trimed
|
|
817
|
-
/// </param>
|
|
818
|
-
/// </param>
|
|
819
|
-
/// <returns> the length of the string
|
|
820
|
-
/// </returns>
|
|
821
672
|
date_i_2_nm(dateNameParams, nm, trim) {
|
|
822
673
|
let n = this.date_msk_cnt(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.len);
|
|
823
674
|
let l;
|
|
@@ -831,29 +682,12 @@ export class DisplayConvertor {
|
|
|
831
682
|
MemoryUtil.char_memcpy(dateNameParams.outVal, dateNameParams.outIdx, nm, 0, l);
|
|
832
683
|
dateNameParams.outIdx = dateNameParams.outIdx + l;
|
|
833
684
|
dateNameParams.len = dateNameParams.len - n;
|
|
834
|
-
// -----------------------------------------------------------------------
|
|
835
|
-
// Trimed ? Jump other trimed mask : nothing
|
|
836
|
-
// -----------------------------------------------------------------------
|
|
837
685
|
n = n - l;
|
|
838
686
|
if (n > 0) {
|
|
839
687
|
MemoryUtil.char_memcpy(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.outVal, dateNameParams.outIdx + n, dateNameParams.len);
|
|
840
688
|
}
|
|
841
689
|
return n;
|
|
842
690
|
}
|
|
843
|
-
/// <summary>
|
|
844
|
-
/// JPN: Japanese date picture support
|
|
845
|
-
/// Convert index to Name
|
|
846
|
-
/// </summary>
|
|
847
|
-
/// <param name = "strOut"> output sting (original)
|
|
848
|
-
/// </param>
|
|
849
|
-
/// <param name = "dateNameParams"> output sting details
|
|
850
|
-
/// </param>
|
|
851
|
-
/// <param name = "strNm"> name which will be embedded in output string
|
|
852
|
-
/// </param>
|
|
853
|
-
/// <param name = "intOutLen"> the remaining length of the output string
|
|
854
|
-
/// </param>
|
|
855
|
-
/// <returns> output sting (processed)
|
|
856
|
-
/// </returns>
|
|
857
691
|
date_i_2_nm_bytemode(strOut, dateNameParams, strNm, intOutLen) {
|
|
858
692
|
let intMskCnt = this.date_msk_cnt(dateNameParams.outVal, dateNameParams.outIdx, dateNameParams.len);
|
|
859
693
|
let strWork = NString.FromChars(dateNameParams.outVal);
|
|
@@ -866,17 +700,6 @@ export class DisplayConvertor {
|
|
|
866
700
|
intOutLen = intOutLen - intMskCnt;
|
|
867
701
|
return strOut;
|
|
868
702
|
}
|
|
869
|
-
/// <summary>
|
|
870
|
-
/// Return N of consecutive Mask characters
|
|
871
|
-
/// </summary>
|
|
872
|
-
/// <param name = "msk"> the mask to check
|
|
873
|
-
/// </param>
|
|
874
|
-
/// <param name = "mskPos"> index of first char to check
|
|
875
|
-
/// </param>
|
|
876
|
-
/// <param name = "len"> length of the mask
|
|
877
|
-
/// </param>
|
|
878
|
-
/// <returns> number of consecutive Mask characters
|
|
879
|
-
/// </returns>
|
|
880
703
|
date_msk_cnt(msk, mskPos, len) {
|
|
881
704
|
let c = msk[mskPos++];
|
|
882
705
|
let i = 1;
|
|
@@ -889,9 +712,6 @@ export class DisplayConvertor {
|
|
|
889
712
|
}
|
|
890
713
|
return i;
|
|
891
714
|
}
|
|
892
|
-
/// <summary>
|
|
893
|
-
/// Compute Day name
|
|
894
|
-
/// </summary>
|
|
895
715
|
date_2_DDDD(day, outVal, outIdx, len, trim) {
|
|
896
716
|
let ret = 4;
|
|
897
717
|
let ext;
|
|
@@ -902,11 +722,9 @@ export class DisplayConvertor {
|
|
|
902
722
|
else {
|
|
903
723
|
if (trim) {
|
|
904
724
|
MemoryUtil.char_memcpy(outVal, outIdx, outVal, outIdx + 1, len - 1);
|
|
905
|
-
/*17-May-90*/
|
|
906
725
|
ret--;
|
|
907
726
|
}
|
|
908
727
|
else {
|
|
909
|
-
// *(out++) = ' '; // Original Line
|
|
910
728
|
outVal[outIdx++] = ' ';
|
|
911
729
|
}
|
|
912
730
|
this.int_2_a(outVal, outIdx, 1, day, 0..toString());
|
|
@@ -934,12 +752,6 @@ export class DisplayConvertor {
|
|
|
934
752
|
outVal[outIdx] = ext[1];
|
|
935
753
|
return (ret);
|
|
936
754
|
}
|
|
937
|
-
/// <summary>
|
|
938
|
-
/// Build a display string for an time value according to the picture
|
|
939
|
-
/// </summary>
|
|
940
|
-
/// <param name = "dataStr"> The source data</param>
|
|
941
|
-
/// <param name = "picStr"> The picture to use for the value to display</param>
|
|
942
|
-
/// <returns> the string to be displayed</returns>
|
|
943
755
|
fromMgTimeToNativeTime(dataStr, pic, time_date_pic_Z_edt) {
|
|
944
756
|
let mask = pic.getMask();
|
|
945
757
|
let maskSize = pic.getMaskSize();
|
|
@@ -952,18 +764,7 @@ export class DisplayConvertor {
|
|
|
952
764
|
nativeDt.setSeconds(breakParams.second);
|
|
953
765
|
return nativeDt;
|
|
954
766
|
}
|
|
955
|
-
/// <summary>
|
|
956
|
-
/// Handle time value
|
|
957
|
-
/// </summary>
|
|
958
|
-
/// <param name = "AsciiStr"> The mask to be used</param>
|
|
959
|
-
/// <param name = "AsciiL"> Mask length</param>
|
|
960
|
-
/// <param name = "pic"> The picure information</param>
|
|
961
|
-
/// <param name = "time_pic_Z_edt"></param>
|
|
962
|
-
/// <param name = "seconds">/ milliSeconds flag</param>
|
|
963
|
-
/// <returns> the string to be displayed
|
|
964
|
-
/// </returns>
|
|
965
767
|
time_2_a_pic(AsciiStr, AsciiL, time, pic, time_pic_Z_edt, milliSeconds) {
|
|
966
|
-
// Original vars
|
|
967
768
|
let hour = 0;
|
|
968
769
|
let minute = 0;
|
|
969
770
|
let second = 0;
|
|
@@ -982,11 +783,9 @@ export class DisplayConvertor {
|
|
|
982
783
|
hour = breakParams.hour;
|
|
983
784
|
minute = breakParams.minute;
|
|
984
785
|
second = breakParams.second;
|
|
985
|
-
// If ascii representation overflows output buffer
|
|
986
|
-
// fill with '*' and bail out
|
|
987
786
|
let result;
|
|
988
787
|
if (pic.getMaskSize() > AsciiL) {
|
|
989
|
-
MemoryUtil.char_memset(Ascii, 0, '*',
|
|
788
|
+
MemoryUtil.char_memset(Ascii, 0, '*', AsciiL);
|
|
990
789
|
result = NString.FromChars(Ascii);
|
|
991
790
|
}
|
|
992
791
|
else {
|
|
@@ -1055,15 +854,12 @@ export class DisplayConvertor {
|
|
|
1055
854
|
}
|
|
1056
855
|
}
|
|
1057
856
|
}
|
|
1058
|
-
this.int_2_a(Ascii, HourI, 2, hour, (am !== 0 && hour < 10) ? ' ' :
|
|
857
|
+
this.int_2_a(Ascii, HourI, 2, hour, (am !== 0 && hour < 10) ? ' ' : '0');
|
|
1059
858
|
}
|
|
1060
859
|
result = NString.FromChars(Ascii);
|
|
1061
860
|
}
|
|
1062
861
|
return result;
|
|
1063
862
|
}
|
|
1064
|
-
/// <summary>
|
|
1065
|
-
/// Break time into its components
|
|
1066
|
-
/// </summary>
|
|
1067
863
|
static time_break(breakParams, time) {
|
|
1068
864
|
if (time <= 0) {
|
|
1069
865
|
breakParams.second = 0;
|
|
@@ -1077,69 +873,32 @@ export class DisplayConvertor {
|
|
|
1077
873
|
breakParams.second = time - breakParams.minute * 60;
|
|
1078
874
|
}
|
|
1079
875
|
}
|
|
1080
|
-
/// <summary>
|
|
1081
|
-
/// Build a display string for a logical value according to the picture
|
|
1082
|
-
/// </summary>
|
|
1083
|
-
/// <param name = "dataStr"> "0" for false or "1" for true
|
|
1084
|
-
/// </param>
|
|
1085
|
-
/// <param name = "picStr"> The picture to use for the value to display
|
|
1086
|
-
/// </param>
|
|
1087
|
-
/// <param name = "rangeStr"> The range of values to check
|
|
1088
|
-
/// </param>
|
|
1089
|
-
/// <returns> the string to be displayed
|
|
1090
|
-
/// </returns>
|
|
1091
876
|
fromLogical(dataStr, pic, rangeStr) {
|
|
1092
877
|
let Str = NString.ToCharArray(pic.getMask());
|
|
1093
|
-
// If picture overflows string, reset with '*'
|
|
1094
878
|
if (pic.getMaskSize() > Str.length) {
|
|
1095
|
-
MemoryUtil.char_memset(Str, 0, '*',
|
|
879
|
+
MemoryUtil.char_memset(Str, 0, '*', Str.length);
|
|
1096
880
|
return NString.FromChars(Str);
|
|
1097
881
|
}
|
|
1098
882
|
else {
|
|
1099
|
-
// Crack range and copy the data
|
|
1100
883
|
let array2 = new Array(50);
|
|
1101
884
|
for (let _ai = 0; _ai < array2.length; ++_ai)
|
|
1102
885
|
array2[_ai] = (0).toString();
|
|
1103
|
-
this.win_rng_bool_sub(array2, array2.length, dataStr.charAt(0) === '1'
|
|
886
|
+
this.win_rng_bool_sub(array2, array2.length, dataStr.charAt(0) === '1', rangeStr);
|
|
1104
887
|
let len = pic.getMaskSize();
|
|
1105
|
-
// Original Code - not relevant in java because the result is allways the mask len
|
|
1106
|
-
// if (len < StrLen)
|
|
1107
|
-
// char_memset (Str, len, ' ', StrLen - len);
|
|
1108
888
|
let resStr = this.win_data_cpy(Str, len, array2, pic.isAttrAlpha());
|
|
1109
889
|
return resStr;
|
|
1110
890
|
}
|
|
1111
891
|
}
|
|
1112
|
-
/// <summary>
|
|
1113
|
-
/// Build a display string for a logical value according to the picture
|
|
1114
|
-
/// </summary>
|
|
1115
|
-
/// <param name = "dataStr"> "0" for false or "1" for true
|
|
1116
|
-
/// </param>
|
|
1117
|
-
/// <returns> boolean
|
|
1118
|
-
/// </returns>
|
|
1119
892
|
fromMgLogicalToNativeLogical(dataStr) {
|
|
1120
893
|
let nativeVal;
|
|
1121
894
|
nativeVal = (dataStr.charAt(0) === '1') ? true : false;
|
|
1122
895
|
return nativeVal;
|
|
1123
896
|
}
|
|
1124
|
-
/// <summary>
|
|
1125
|
-
/// Build a mg string for a logical value according to the boolean value
|
|
1126
|
-
/// </summary>
|
|
1127
|
-
/// <param name = "dispVal"> boolean
|
|
1128
|
-
/// </param>
|
|
1129
|
-
/// <returns> string
|
|
1130
|
-
/// </returns>
|
|
1131
897
|
fromNativeLogicalToMgLogical(dispVal) {
|
|
1132
898
|
let mgVal;
|
|
1133
899
|
mgVal = (dispVal === true) ? "1" : "0";
|
|
1134
900
|
return mgVal;
|
|
1135
901
|
}
|
|
1136
|
-
/// <summary>
|
|
1137
|
-
/// Get a boolean value from the range specified
|
|
1138
|
-
/// </summary>
|
|
1139
|
-
/// <param name = "Sub"> the result string</param>
|
|
1140
|
-
/// <param name = "SubSiz"> the result string length</param>
|
|
1141
|
-
/// <param name = "BoolVal"> '1' if true or '0' if false</param>
|
|
1142
|
-
/// <param name = "rng"> range of values</param>
|
|
1143
902
|
win_rng_bool_sub(Sub, SubSiz, BoolVal, rng) {
|
|
1144
903
|
let crk = new Array(PICInterface.DB_STR_MAX + 2);
|
|
1145
904
|
for (let _ai = 0; _ai < crk.length; ++_ai)
|
|
@@ -1148,45 +907,34 @@ export class DisplayConvertor {
|
|
|
1148
907
|
for (let _ai = 0; _ai < gap.length; ++_ai)
|
|
1149
908
|
gap[_ai] = (0).toString();
|
|
1150
909
|
let i = 0;
|
|
1151
|
-
// Set the default range if none is specified
|
|
1152
910
|
rng = this.win_rng_bool(rng);
|
|
1153
|
-
// Crack range and choose the first element as True value
|
|
1154
|
-
// or the second element as the False value.
|
|
1155
911
|
this.win_rng_crk(crk, gap, rng);
|
|
1156
912
|
let s;
|
|
1157
913
|
if (BoolVal) {
|
|
1158
914
|
s = 0;
|
|
1159
915
|
}
|
|
1160
916
|
else {
|
|
1161
|
-
while (crk[i] > '\0'
|
|
917
|
+
while (crk[i] > '\0') {
|
|
1162
918
|
i = i + 1;
|
|
1163
919
|
}
|
|
1164
920
|
s = i + 1;
|
|
1165
921
|
}
|
|
1166
922
|
let len = s;
|
|
1167
|
-
while (crk[len] > '\0'
|
|
923
|
+
while (crk[len] > '\0') {
|
|
1168
924
|
len = len + 1;
|
|
1169
925
|
}
|
|
1170
926
|
len = len - s;
|
|
1171
927
|
MemoryUtil.char_memcpy(Sub, 0, crk, s, Math.min(len, SubSiz));
|
|
1172
928
|
if (len < SubSiz) {
|
|
1173
|
-
MemoryUtil.char_memset(Sub, len, ' ',
|
|
929
|
+
MemoryUtil.char_memset(Sub, len, ' ', SubSiz - len);
|
|
1174
930
|
}
|
|
1175
931
|
}
|
|
1176
|
-
/// <summary>
|
|
1177
|
-
/// Get the default range for logical values
|
|
1178
|
-
/// </summary>
|
|
1179
|
-
/// <param name = "rng"> current range</param>
|
|
1180
|
-
/// <returns> the default range if the input range is empty</returns>
|
|
1181
932
|
win_rng_bool(rng) {
|
|
1182
933
|
if (rng === null || rng.length === 0) {
|
|
1183
934
|
rng = "True, False";
|
|
1184
935
|
}
|
|
1185
936
|
return rng;
|
|
1186
937
|
}
|
|
1187
|
-
/// <summary>
|
|
1188
|
-
/// Crack a 'range' string into its components
|
|
1189
|
-
/// </summary>
|
|
1190
938
|
win_rng_crk(crk, gap, range) {
|
|
1191
939
|
let rngLen = range.length;
|
|
1192
940
|
let rng = NString.ToCharArray(range);
|
|
@@ -1204,10 +952,6 @@ export class DisplayConvertor {
|
|
|
1204
952
|
}
|
|
1205
953
|
}
|
|
1206
954
|
else {
|
|
1207
|
-
// 05/10/95 - Mr. Takada :
|
|
1208
|
-
// Japanese char may have '\' code of its second byte.
|
|
1209
|
-
// str_chr_1_byt needs mglocal.h.
|
|
1210
|
-
// according to Mr. Maruoka:
|
|
1211
955
|
if (rng[rngPos] === '\\') {
|
|
1212
956
|
rngPos = rngPos + 1;
|
|
1213
957
|
}
|
|
@@ -1215,39 +959,14 @@ export class DisplayConvertor {
|
|
|
1215
959
|
crkPos = crkPos + 1;
|
|
1216
960
|
}
|
|
1217
961
|
}
|
|
1218
|
-
// JPN: 01/11/95 Yama*/
|
|
1219
|
-
// Upper function is implemented in str.c and
|
|
1220
|
-
// it is also overrided by mglocal function.
|
|
1221
|
-
// So MAGIC needs to call this function
|
|
1222
|
-
// instead of CST_hdr.uppr_tab[].
|
|
1223
|
-
// if (up)
|
|
1224
|
-
// str_upper (org_crk, (long)(crk-org_crk));
|
|
1225
962
|
gap[gapPos] = '\0';
|
|
1226
963
|
crk[crkPos++] = '\0';
|
|
1227
964
|
crk[crkPos] = '\0';
|
|
1228
965
|
}
|
|
1229
|
-
// --------------------------------------------------------------------------
|
|
1230
|
-
// Methods for coverting DIPLAY ---> INTERNAL
|
|
1231
|
-
// --------------------------------------------------------------------------
|
|
1232
|
-
/// <summary>
|
|
1233
|
-
/// Translates a string number to magic number
|
|
1234
|
-
/// </summary>
|
|
1235
|
-
/// <param name = "dispValue"> A string number</param>
|
|
1236
|
-
/// <param name = "picStr"> The picture to use</param>
|
|
1237
|
-
/// <returns> the magic number</returns>
|
|
1238
966
|
toNum(dispValue, pic, compIdx) {
|
|
1239
967
|
let mgNum = new NUM_TYPE(dispValue, pic, compIdx);
|
|
1240
968
|
return mgNum.toXMLrecord();
|
|
1241
969
|
}
|
|
1242
|
-
/// <summary>
|
|
1243
|
-
/// builds the date magic number from the string value
|
|
1244
|
-
/// </summary>
|
|
1245
|
-
/// <param name = "str"> the date string</param>
|
|
1246
|
-
/// <param name = "str_len"> length of string</param>
|
|
1247
|
-
/// <param name = "pic"> the picture info</param>
|
|
1248
|
-
/// <param name = "mask"> the mask of the string</param>
|
|
1249
|
-
/// <param name = "ignore_dt_fmt"></param>
|
|
1250
|
-
/// <returns> the magic number</returns>
|
|
1251
970
|
a_2_date_pic_datemode(str, str_len, pic, mask, compIdx) {
|
|
1252
971
|
let pos = 0;
|
|
1253
972
|
let year_in_pic = false;
|
|
@@ -1283,25 +1002,19 @@ export class DisplayConvertor {
|
|
|
1283
1002
|
inp = true;
|
|
1284
1003
|
year = this.date_a_2_i(str, 2, pos);
|
|
1285
1004
|
pos += 2;
|
|
1286
|
-
// Hen 16/11/97 : Fix #768442
|
|
1287
1005
|
if (year === 0)
|
|
1288
1006
|
bYearIsZero = true;
|
|
1289
|
-
let century_year = this._environment.GetCentury(compIdx) % 100;
|
|
1007
|
+
let century_year = this._environment.GetCentury(compIdx) % 100;
|
|
1290
1008
|
if (year < century_year)
|
|
1291
1009
|
year += 100;
|
|
1292
|
-
year += this._environment.GetCentury(compIdx) - century_year;
|
|
1010
|
+
year += this._environment.GetCentury(compIdx) - century_year;
|
|
1293
1011
|
if (this._environment.GetDateMode(compIdx) === 'B')
|
|
1294
|
-
// DEF_date_mode
|
|
1295
1012
|
year -= PICInterface.DATE_BUDDHIST_GAP;
|
|
1296
1013
|
break;
|
|
1297
1014
|
case (PICInterface.PIC_YYYY):
|
|
1298
1015
|
year_in_pic = true;
|
|
1299
1016
|
inp = true;
|
|
1300
1017
|
let YearDigitsNo;
|
|
1301
|
-
// --------------------------------------------------------------
|
|
1302
|
-
// Make sure we have 4 year digit. If not, adjust it
|
|
1303
|
-
// according to the 'century year'
|
|
1304
|
-
// --------------------------------------------------------------
|
|
1305
1018
|
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
1306
1019
|
for (YearDigitsNo = 0; YearDigitsNo < 4 && pos + YearDigitsNo < str.length && UtilStrByteMode.isDigit(str[pos + YearDigitsNo]); YearDigitsNo++) {
|
|
1307
1020
|
}
|
|
@@ -1326,17 +1039,15 @@ export class DisplayConvertor {
|
|
|
1326
1039
|
}
|
|
1327
1040
|
year = this.date_a_2_i(str, 4, pos);
|
|
1328
1041
|
pos += 4;
|
|
1329
|
-
// Hen 16/11/97 : Fix #768442
|
|
1330
1042
|
if (year === 0)
|
|
1331
1043
|
bYearIsZero = true;
|
|
1332
1044
|
if (YearDigitsNo <= 2) {
|
|
1333
|
-
century_year = this._environment.GetCentury(compIdx) % 100;
|
|
1045
|
+
century_year = this._environment.GetCentury(compIdx) % 100;
|
|
1334
1046
|
if (year < century_year)
|
|
1335
1047
|
year += 100;
|
|
1336
|
-
year += this._environment.GetCentury(compIdx) - century_year;
|
|
1048
|
+
year += this._environment.GetCentury(compIdx) - century_year;
|
|
1337
1049
|
}
|
|
1338
1050
|
if (this._environment.GetDateMode(compIdx) === 'B')
|
|
1339
|
-
// DEF_date_mode
|
|
1340
1051
|
year -= PICInterface.DATE_BUDDHIST_GAP;
|
|
1341
1052
|
break;
|
|
1342
1053
|
case PICInterface.PIC_HYYYYY:
|
|
@@ -1415,7 +1126,7 @@ export class DisplayConvertor {
|
|
|
1415
1126
|
day = this.date_a_2_i(str, 2, pos);
|
|
1416
1127
|
pos += 2 + 2;
|
|
1417
1128
|
break;
|
|
1418
|
-
case (PICInterface.PIC_YJ):
|
|
1129
|
+
case (PICInterface.PIC_YJ):
|
|
1419
1130
|
year_in_pic = true;
|
|
1420
1131
|
inp = true;
|
|
1421
1132
|
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
@@ -1434,7 +1145,6 @@ export class DisplayConvertor {
|
|
|
1434
1145
|
break;
|
|
1435
1146
|
default:
|
|
1436
1147
|
if (UtilStrByteMode.isLocaleDefLangDBCS()) {
|
|
1437
|
-
// if "str[pos]" contains DBCS, the next index of "mask" has to be skipped.
|
|
1438
1148
|
if (UtilStrByteMode.isHalfWidth(str[pos]) === false &&
|
|
1439
1149
|
UtilStrByteMode.isHalfWidth(mask[pos + intPicIdxOfs]))
|
|
1440
1150
|
intPicIdxOfs++;
|
|
@@ -1449,14 +1159,10 @@ export class DisplayConvertor {
|
|
|
1449
1159
|
if (!day_in_pic && month === 0)
|
|
1450
1160
|
day = 0;
|
|
1451
1161
|
}
|
|
1452
|
-
// Hen 16/11/97 : Fix #768442
|
|
1453
|
-
// Zero date is valid and should return 0L. This check must be here
|
|
1454
|
-
// because the year value may be changed because of century year.
|
|
1455
1162
|
if (day === 0 && month === 0 && (bYearIsZero || year === 0))
|
|
1456
1163
|
return (0);
|
|
1457
1164
|
if (!inp)
|
|
1458
1165
|
return (0);
|
|
1459
|
-
// Hebrew Year
|
|
1460
1166
|
if (pic.isHebrew()) {
|
|
1461
1167
|
if (year > 0) {
|
|
1462
1168
|
if (millenium === 0)
|
|
@@ -1465,7 +1171,6 @@ export class DisplayConvertor {
|
|
|
1465
1171
|
}
|
|
1466
1172
|
return (HebrewDate.dateheb_2_d(year, month, day));
|
|
1467
1173
|
}
|
|
1468
|
-
// the next 2 lines support 4.xx DD/MM pictures
|
|
1469
1174
|
if ((year === 0) && !year_in_pic) {
|
|
1470
1175
|
dateParams = this.date_sys();
|
|
1471
1176
|
year = dateParams.year;
|
|
@@ -1478,9 +1183,6 @@ export class DisplayConvertor {
|
|
|
1478
1183
|
}
|
|
1479
1184
|
return this.date_a_2_i_1(s, len, pos);
|
|
1480
1185
|
}
|
|
1481
|
-
/// <summary>
|
|
1482
|
-
/// Decode digits from a date string
|
|
1483
|
-
/// </summary>
|
|
1484
1186
|
date_a_2_i_0(s, len, pos) {
|
|
1485
1187
|
let array = new Array(len);
|
|
1486
1188
|
let mgNum = new NUM_TYPE();
|
|
@@ -1496,23 +1198,10 @@ export class DisplayConvertor {
|
|
|
1496
1198
|
}
|
|
1497
1199
|
this.move_date_1(str, pos, moveby, len);
|
|
1498
1200
|
}
|
|
1499
|
-
/// <summary>
|
|
1500
|
-
/// moving part of the date string
|
|
1501
|
-
/// </summary>
|
|
1502
1201
|
move_date_0(str, pos, moveby, len) {
|
|
1503
1202
|
MemoryUtil.char_memmove(str, pos + moveby, str, pos, len - (pos + moveby) + 1);
|
|
1504
|
-
MemoryUtil.char_memset(str, pos, '0',
|
|
1505
|
-
}
|
|
1506
|
-
/// <summary>
|
|
1507
|
-
/// Translate a month name -> month index
|
|
1508
|
-
/// </summary>
|
|
1509
|
-
/// <param name = "string">to evaluate
|
|
1510
|
-
/// </param>
|
|
1511
|
-
/// <param name = "picture">mask
|
|
1512
|
-
/// </param>
|
|
1513
|
-
/// <param name = "pos">current position in the string the intRef not exactly the same reference to integer , like in C++,
|
|
1514
|
-
/// so the global pos MUST be updated by the pos.value after the function returns.
|
|
1515
|
-
/// </param>
|
|
1203
|
+
MemoryUtil.char_memset(str, pos, '0', moveby);
|
|
1204
|
+
}
|
|
1516
1205
|
date_MMM_2_m(str, mask, pos, len, isHebrew) {
|
|
1517
1206
|
let l;
|
|
1518
1207
|
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
@@ -1545,9 +1234,6 @@ export class DisplayConvertor {
|
|
|
1545
1234
|
}
|
|
1546
1235
|
return 0;
|
|
1547
1236
|
}
|
|
1548
|
-
/// <summary>
|
|
1549
|
-
/// Get the curret daye seperated to year, month, day
|
|
1550
|
-
/// </summary>
|
|
1551
1237
|
date_sys() {
|
|
1552
1238
|
let date = new DateBreakParams();
|
|
1553
1239
|
let CurrDate = DateTime.Now;
|
|
@@ -1556,11 +1242,6 @@ export class DisplayConvertor {
|
|
|
1556
1242
|
date.day = CurrDate.Day;
|
|
1557
1243
|
return date;
|
|
1558
1244
|
}
|
|
1559
|
-
/// <summary>
|
|
1560
|
-
/// to get current date in magic representation Query Magic's Date
|
|
1561
|
-
/// </summary>
|
|
1562
|
-
/// <returns> the 'Magic' current date
|
|
1563
|
-
/// </returns>
|
|
1564
1245
|
date_magic(utcDate) {
|
|
1565
1246
|
let dateTime;
|
|
1566
1247
|
if (utcDate) {
|
|
@@ -1574,25 +1255,14 @@ export class DisplayConvertor {
|
|
|
1574
1255
|
let day = dateTime.Day;
|
|
1575
1256
|
return this.date_4_calender(year, month, day, 1, false);
|
|
1576
1257
|
}
|
|
1577
|
-
/// <summary>
|
|
1578
|
-
/// to get the system time
|
|
1579
|
-
/// </summary>
|
|
1580
|
-
/// <returns> the 'Magic' current time
|
|
1581
|
-
/// </returns>
|
|
1582
1258
|
time_magic(utcTime) {
|
|
1583
1259
|
return DateTime.GetTotalSecondsFromMidnight(utcTime, new Date());
|
|
1584
1260
|
}
|
|
1585
1261
|
mtime_magic(utcTime) {
|
|
1586
1262
|
return DateTime.GetTotalMilliSecondsFromMidnight(utcTime, new Date());
|
|
1587
1263
|
}
|
|
1588
|
-
/// <summary>
|
|
1589
|
-
/// Compute MAGIC date
|
|
1590
|
-
/// </summary>
|
|
1591
1264
|
date_4_calender(year, month, day, doy, usedoy) {
|
|
1592
1265
|
let LeapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
|
|
1593
|
-
// 3.11.97 - Hen (Fixed bug #764265 and #8186) :
|
|
1594
|
-
// If the date is 0 then return 0L (zero value is valid), else if the date
|
|
1595
|
-
// is illegal then return 1000000000L (wrong date).
|
|
1596
1266
|
if (usedoy) {
|
|
1597
1267
|
if (doy === 0) {
|
|
1598
1268
|
return 0;
|
|
@@ -1634,12 +1304,6 @@ export class DisplayConvertor {
|
|
|
1634
1304
|
}
|
|
1635
1305
|
return num * 146097 + num2 * 36524 + num3 * 1461 + year * 365 + doy;
|
|
1636
1306
|
}
|
|
1637
|
-
/// <summary>
|
|
1638
|
-
/// Translates a string time to magic number
|
|
1639
|
-
/// </summary>
|
|
1640
|
-
/// <param name = "dispValue"> A string value</param>
|
|
1641
|
-
/// <param name = "picStr"> The picture to use</param>
|
|
1642
|
-
/// <returns> the magic number</returns>
|
|
1643
1307
|
fromNativeTimeToMgTime(dispValue, pic) {
|
|
1644
1308
|
let mgNum = new NUM_TYPE();
|
|
1645
1309
|
let numVal = this.fromNativeTimeToMgTimeNumber(dispValue, pic);
|
|
@@ -1655,24 +1319,17 @@ export class DisplayConvertor {
|
|
|
1655
1319
|
return this.a_2_time_0(Ascii, picOrAsciiL, milliSecondsOrMask);
|
|
1656
1320
|
return this.a_2_time_1(Ascii, picOrAsciiL, milliSecondsOrMask, milliSeconds);
|
|
1657
1321
|
}
|
|
1658
|
-
/// <summary>
|
|
1659
|
-
/// Convert Alpha into a Time according to a given picture
|
|
1660
|
-
/// </summary>
|
|
1661
1322
|
a_2_time_0(Ascii, pic, milliSeconds) {
|
|
1662
1323
|
return this.a_2_time(Ascii, Ascii.length, NString.ToCharArray(pic.getMask()), milliSeconds);
|
|
1663
1324
|
}
|
|
1664
|
-
/// <summary>
|
|
1665
|
-
/// Convert Alpha into a Time according to a given picture
|
|
1666
|
-
/// </summary>
|
|
1667
1325
|
a_2_time_1(Ascii, AsciiL, mask, milliSeconds) {
|
|
1668
1326
|
let mgNum = new NUM_TYPE();
|
|
1669
1327
|
let I = 0;
|
|
1670
|
-
let len = mask.length;
|
|
1671
|
-
// Initialize counters and flags
|
|
1328
|
+
let len = mask.length;
|
|
1672
1329
|
if (len > AsciiL) {
|
|
1673
1330
|
len = AsciiL;
|
|
1674
1331
|
}
|
|
1675
|
-
let ampm = 0;
|
|
1332
|
+
let ampm = 0;
|
|
1676
1333
|
let hour = 0;
|
|
1677
1334
|
let minute = 0;
|
|
1678
1335
|
let second = 0;
|
|
@@ -1680,7 +1337,6 @@ export class DisplayConvertor {
|
|
|
1680
1337
|
while (I < len) {
|
|
1681
1338
|
let maskLength;
|
|
1682
1339
|
let maxMaskLen;
|
|
1683
|
-
// To get the maximum possible length of the constants in the mask
|
|
1684
1340
|
switch (mask[I].charCodeAt(0)) {
|
|
1685
1341
|
case (PICInterface.PIC_HH):
|
|
1686
1342
|
case (PICInterface.PIC_MMT):
|
|
@@ -1695,9 +1351,6 @@ export class DisplayConvertor {
|
|
|
1695
1351
|
maxMaskLen = 1;
|
|
1696
1352
|
break;
|
|
1697
1353
|
}
|
|
1698
|
-
/* To get the minimum of maxMaskLen & number of characters remained in string
|
|
1699
|
-
because if the Ascii is shorter(has less characters)then create String only
|
|
1700
|
-
of that no. of characters (maskLength), not of maxMaskLength */
|
|
1701
1354
|
maskLength = Math.min(maxMaskLen, len - I);
|
|
1702
1355
|
switch (mask[I].charCodeAt(0)) {
|
|
1703
1356
|
case (PICInterface.PIC_HH):
|
|
@@ -1741,19 +1394,14 @@ export class DisplayConvertor {
|
|
|
1741
1394
|
}
|
|
1742
1395
|
I += maskLength;
|
|
1743
1396
|
}
|
|
1744
|
-
// Check validity of minutes and seconds
|
|
1745
1397
|
if (second > 59 || minute > 59)
|
|
1746
1398
|
return (0);
|
|
1747
|
-
// Convert hour to PM if specified as AM
|
|
1748
1399
|
if (ampm !== 0)
|
|
1749
|
-
if (ampm === -1)
|
|
1750
|
-
// AM
|
|
1751
|
-
{
|
|
1400
|
+
if (ampm === -1) {
|
|
1752
1401
|
if (hour === 12)
|
|
1753
1402
|
hour = 0;
|
|
1754
1403
|
}
|
|
1755
1404
|
else if (hour < 12)
|
|
1756
|
-
// PM
|
|
1757
1405
|
hour += 12;
|
|
1758
1406
|
if (milliSeconds)
|
|
1759
1407
|
return this.time_2_int(hour, minute, second) * 1000 + millisecond;
|
|
@@ -1763,19 +1411,9 @@ export class DisplayConvertor {
|
|
|
1763
1411
|
time_2_int(hour, minute, second) {
|
|
1764
1412
|
return hour * 3600 + minute * 60 + second;
|
|
1765
1413
|
}
|
|
1766
|
-
/// <summary>
|
|
1767
|
-
/// Convert "0"/"1" to false/true
|
|
1768
|
-
/// </summary>
|
|
1769
|
-
/// <param name = "boolStr"> "0"/"1"
|
|
1770
|
-
/// </param>
|
|
1771
|
-
/// <returns> true if "1" or false if others
|
|
1772
|
-
/// </returns>
|
|
1773
1414
|
static toBoolean(boolStr) {
|
|
1774
1415
|
return boolStr !== null && boolStr === "1";
|
|
1775
1416
|
}
|
|
1776
|
-
/// <summary>
|
|
1777
|
-
/// String to Date function
|
|
1778
|
-
/// </summary>
|
|
1779
1417
|
a_2_date(str, Format, compIdx) {
|
|
1780
1418
|
return this.a_2_date_datemode(str, Format, compIdx);
|
|
1781
1419
|
}
|
|
@@ -1788,9 +1426,6 @@ export class DisplayConvertor {
|
|
|
1788
1426
|
to_a(outVal, out_len, date, Format, compIdx) {
|
|
1789
1427
|
return this.to_a_datemode(outVal, out_len, date, Format, false, compIdx);
|
|
1790
1428
|
}
|
|
1791
|
-
/// <summary>
|
|
1792
|
-
/// Convert string -> date using a format string
|
|
1793
|
-
/// </summary>
|
|
1794
1429
|
a_2_date_datemode(str, Format, compIdx) {
|
|
1795
1430
|
let pIC = new PIC(Format, StorageAttribute.DATE, compIdx);
|
|
1796
1431
|
if (str === null) {
|
|
@@ -1798,23 +1433,14 @@ export class DisplayConvertor {
|
|
|
1798
1433
|
}
|
|
1799
1434
|
return this.a_2_date_pic_datemode(NString.ToCharArray(str), str.length, pIC, NString.ToCharArray(pIC.getMask()), compIdx);
|
|
1800
1435
|
}
|
|
1801
|
-
/// <summary>
|
|
1802
|
-
/// String to a datemode
|
|
1803
|
-
/// </summary>
|
|
1804
1436
|
to_a_datemode(outVal, out_len, date, Format, ignore_dt_fmt, compIdx) {
|
|
1805
|
-
// Parse the picture
|
|
1806
1437
|
let pic = new PIC(Format, StorageAttribute.DATE, compIdx);
|
|
1807
|
-
// Convert the date -> string
|
|
1808
1438
|
if (outVal === null) {
|
|
1809
1439
|
outVal = pic.getMask();
|
|
1810
1440
|
}
|
|
1811
1441
|
return this.to_a_pic_datemode(outVal, out_len, date, pic, true, ignore_dt_fmt, compIdx);
|
|
1812
1442
|
}
|
|
1813
|
-
/// <summary>
|
|
1814
|
-
/// Decode digits from a date string
|
|
1815
|
-
/// </summary>
|
|
1816
1443
|
date_a_2_i_1(s, len, pos) {
|
|
1817
|
-
// don't forget to include 'pos+=len' after the using of the function
|
|
1818
1444
|
let mgNum = new NUM_TYPE();
|
|
1819
1445
|
let str;
|
|
1820
1446
|
str = s.substr(pos, len);
|
|
@@ -1835,17 +1461,6 @@ export class DisplayConvertor {
|
|
|
1835
1461
|
}
|
|
1836
1462
|
return this.time_2_a_pic(Ascii, AsciiL, time, pic, false, milliSeconds);
|
|
1837
1463
|
}
|
|
1838
|
-
/// <summary>
|
|
1839
|
-
/// Translates a string to magic logical
|
|
1840
|
-
/// </summary>
|
|
1841
|
-
/// <param name = "dispValue"> A string value
|
|
1842
|
-
/// </param>
|
|
1843
|
-
/// <param name = "pic"> The picture to use
|
|
1844
|
-
/// </param>
|
|
1845
|
-
/// <param name = "rangeStr"> The range
|
|
1846
|
-
/// </param>
|
|
1847
|
-
/// <returns> the logical value
|
|
1848
|
-
/// </returns>
|
|
1849
1464
|
toLogical(dispValue, pic, rangeStr) {
|
|
1850
1465
|
dispValue = dispValue.trim();
|
|
1851
1466
|
if (dispValue === null || dispValue.length === 0) {
|
|
@@ -1853,12 +1468,6 @@ export class DisplayConvertor {
|
|
|
1853
1468
|
}
|
|
1854
1469
|
return this.disp_2_logical(dispValue, pic.getMask(), rangeStr);
|
|
1855
1470
|
}
|
|
1856
|
-
/// <summary>
|
|
1857
|
-
/// translate the displayed value to a magic logical value
|
|
1858
|
-
/// </summary>
|
|
1859
|
-
/// <param name = "dispValue">the displayed value </param>
|
|
1860
|
-
/// <param name = "mask">the mask of the displayed value </param>
|
|
1861
|
-
/// <param name = "rangeStr">the range string </param>
|
|
1862
1471
|
disp_2_logical(dispValue, mask, rangeStr) {
|
|
1863
1472
|
let strippedValue = new StringBuilder(dispValue.length);
|
|
1864
1473
|
rangeStr = this.win_rng_bool(rangeStr);
|
|
@@ -1883,10 +1492,6 @@ export class DisplayConvertor {
|
|
|
1883
1492
|
}
|
|
1884
1493
|
return (val.toUpperCase() === trueStr.toUpperCase()) ? "1" : "0";
|
|
1885
1494
|
}
|
|
1886
|
-
/// <summary>
|
|
1887
|
-
/// converting the displayed value of a string to internal
|
|
1888
|
-
/// representation must remove the masking characters from it
|
|
1889
|
-
/// </summary>
|
|
1890
1495
|
toAlpha(dispValue, pic) {
|
|
1891
1496
|
let picture = pic.getMask();
|
|
1892
1497
|
let buffer = new StringBuilder(pic.getMaskSize());
|
|
@@ -1897,7 +1502,6 @@ export class DisplayConvertor {
|
|
|
1897
1502
|
if (DisplayConvertor.isAlphaPositionalDirective(picture.charAt(currPicture))) {
|
|
1898
1503
|
buffer.Append(dispValue.charAt(i));
|
|
1899
1504
|
if (IsAlphaDBCS) {
|
|
1900
|
-
// a DBCS character in "dispValue" consumes two characters in "picture"
|
|
1901
1505
|
let strDspValOneChar = dispValue.substr(i, 1);
|
|
1902
1506
|
if (UtilStrByteMode.lenB(strDspValOneChar) === 2) {
|
|
1903
1507
|
currPicture = currPicture + 1;
|
|
@@ -1907,17 +1511,11 @@ export class DisplayConvertor {
|
|
|
1907
1511
|
}
|
|
1908
1512
|
return buffer.ToString();
|
|
1909
1513
|
}
|
|
1910
|
-
/// <summary>is checked char Alpha Positional Directive</summary>
|
|
1911
1514
|
static isAlphaPositionalDirective(toCheck) {
|
|
1912
1515
|
let ascii = toCheck.charCodeAt(0);
|
|
1913
1516
|
return (ascii === PICInterface.PIC_X || ascii === PICInterface.PIC_U || ascii === PICInterface.PIC_L ||
|
|
1914
1517
|
ascii === PICInterface.PIC_N || ascii === PICInterface.PIC_J || ascii === PICInterface.PIC_G || ascii === PICInterface.PIC_S || ascii === PICInterface.PIC_T);
|
|
1915
1518
|
}
|
|
1916
|
-
/// <summary>
|
|
1917
|
-
/// Comparative newValue with possible Range in ContinuousRangeValues/discreteRangeValues
|
|
1918
|
-
/// </summary>
|
|
1919
|
-
/// <returns> newValue if it possible, old value owervise
|
|
1920
|
-
/// </returns>
|
|
1921
1519
|
fillAlphaByRange(ContinuousRangeValues, discreteRangeValues, newValue) {
|
|
1922
1520
|
let tmpBuffer = this.fillAlphaByDiscreteRangeValues(discreteRangeValues, newValue);
|
|
1923
1521
|
if (tmpBuffer !== null) {
|
|
@@ -1937,18 +1535,8 @@ export class DisplayConvertor {
|
|
|
1937
1535
|
}
|
|
1938
1536
|
}
|
|
1939
1537
|
}
|
|
1940
|
-
// unpossible to find it in the range return not changed oldvalue
|
|
1941
1538
|
return newValue;
|
|
1942
1539
|
}
|
|
1943
|
-
/// <summary>
|
|
1944
|
-
/// fill Alpha string by discrete range
|
|
1945
|
-
/// </summary>
|
|
1946
|
-
/// <param name = "discreteRangeValues">vector of discrete range values
|
|
1947
|
-
/// </param>
|
|
1948
|
-
/// <param name = "newValue">value, try found in the vector of discrete ranges
|
|
1949
|
-
/// </param>
|
|
1950
|
-
/// <returns> found value or null(not found)
|
|
1951
|
-
/// </returns>
|
|
1952
1540
|
fillAlphaByDiscreteRangeValues(discreteRangeValues, newValue) {
|
|
1953
1541
|
let result;
|
|
1954
1542
|
if (discreteRangeValues !== null) {
|
|
@@ -1962,15 +1550,6 @@ export class DisplayConvertor {
|
|
|
1962
1550
|
}
|
|
1963
1551
|
return null;
|
|
1964
1552
|
}
|
|
1965
|
-
/// <summary>
|
|
1966
|
-
/// fill Alpha string by continuous range
|
|
1967
|
-
/// </summary>
|
|
1968
|
-
/// <param name = "ContinuousRangeValues">vector of continuous range values
|
|
1969
|
-
/// </param>
|
|
1970
|
-
/// <param name = "newValue">value, try found in the vector of continuous ranges
|
|
1971
|
-
/// </param>
|
|
1972
|
-
/// <returns> found value or null(not found)
|
|
1973
|
-
/// </returns>
|
|
1974
1553
|
fillAlphaByContinuousRangeValues(ContinuousRangeValues, newValue) {
|
|
1975
1554
|
newValue = StrUtil.rtrim(newValue);
|
|
1976
1555
|
if (ContinuousRangeValues !== null) {
|
|
@@ -1984,16 +1563,6 @@ export class DisplayConvertor {
|
|
|
1984
1563
|
}
|
|
1985
1564
|
return null;
|
|
1986
1565
|
}
|
|
1987
|
-
/// <summary>
|
|
1988
|
-
/// Try to complete the newValue using the Range
|
|
1989
|
-
/// first try to comlete the value for case meaning and after that for ignore case
|
|
1990
|
-
/// </summary>
|
|
1991
|
-
/// <param name = "vector">of ranges
|
|
1992
|
-
/// </param>
|
|
1993
|
-
/// <param name = "checked">value
|
|
1994
|
-
/// </param>
|
|
1995
|
-
/// <returns> value completed by range
|
|
1996
|
-
/// </returns>
|
|
1997
1566
|
completeAlphaByRange(discreteRangeValues, newValue) {
|
|
1998
1567
|
let maxCoincide = new Array(2);
|
|
1999
1568
|
for (let _ai = 0; _ai < maxCoincide.length; ++_ai)
|
|
@@ -2058,12 +1627,6 @@ export class DisplayConvertor {
|
|
|
2058
1627
|
getDateChar() {
|
|
2059
1628
|
return this.DATECHAR;
|
|
2060
1629
|
}
|
|
2061
|
-
/// <summary>
|
|
2062
|
-
///
|
|
2063
|
-
/// </summary>
|
|
2064
|
-
/// <param name="value"></param>
|
|
2065
|
-
/// <param name="storageAttribute"></param>
|
|
2066
|
-
/// <returns></returns>
|
|
2067
1630
|
static StringValueToMgValue(value, storageAttribute, filler, length) {
|
|
2068
1631
|
switch (storageAttribute) {
|
|
2069
1632
|
case StorageAttribute.ALPHA:
|
|
@@ -2082,9 +1645,6 @@ export class DisplayConvertor {
|
|
|
2082
1645
|
}
|
|
2083
1646
|
}
|
|
2084
1647
|
DisplayConvertor._instance = null;
|
|
2085
|
-
/// <summary>
|
|
2086
|
-
/// Being used to send parameters to the 'time_break' method
|
|
2087
|
-
/// </summary>
|
|
2088
1648
|
export class TimeBreakParams {
|
|
2089
1649
|
constructor(hour_, minute_, second_) {
|
|
2090
1650
|
this.hour = 0;
|
|
@@ -2104,18 +1664,12 @@ export class TimeBreakParams {
|
|
|
2104
1664
|
this.second = second_;
|
|
2105
1665
|
}
|
|
2106
1666
|
}
|
|
2107
|
-
/// <summary>
|
|
2108
|
-
/// Being used to send int by Ref
|
|
2109
|
-
/// </summary>
|
|
2110
1667
|
class IntRef {
|
|
2111
1668
|
constructor(val_) {
|
|
2112
1669
|
this.val = 0;
|
|
2113
1670
|
this.val = val_;
|
|
2114
1671
|
}
|
|
2115
1672
|
}
|
|
2116
|
-
/// <summary>
|
|
2117
|
-
/// Being used to send parameters to the 'date_i_2_nm' method
|
|
2118
|
-
/// </summary>
|
|
2119
1673
|
class DateNameParams {
|
|
2120
1674
|
constructor(out_, outIdx_, len_) {
|
|
2121
1675
|
this.outVal = null;
|
|
@@ -2126,10 +1680,6 @@ class DateNameParams {
|
|
|
2126
1680
|
this.len = len_;
|
|
2127
1681
|
}
|
|
2128
1682
|
}
|
|
2129
|
-
/// <summary>
|
|
2130
|
-
/// Being used to send parameters to the 'date_break_datemode' method
|
|
2131
|
-
/// it's struct
|
|
2132
|
-
/// </summary>
|
|
2133
1683
|
export class DateBreakParams {
|
|
2134
1684
|
constructor(year_, month_, day_, doy_, dow_) {
|
|
2135
1685
|
this.day = 0;
|
|
@@ -2153,4 +1703,4 @@ export class DateBreakParams {
|
|
|
2153
1703
|
this.dow = dow_;
|
|
2154
1704
|
}
|
|
2155
1705
|
}
|
|
2156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlzcGxheUNvbnZlcnRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvRGlzcGxheUNvbnZlcnRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzVCLE9BQU8sRUFBRSxRQUFRLEVBQVEsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RixPQUFPLEVBQ0wsUUFBUSxFQUNSLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFdBQVcsRUFDWCxlQUFlLEVBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxXQUFXO0FBQ1gsTUFBTSxPQUFPLGdCQUFnQjtJQVkzQjtRQVhRLGlCQUFZLEdBQWlCLElBQUksQ0FBQztRQUNsQyxhQUFRLEdBQVcsQ0FBQyxDQUFDO1FBVzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQztJQUNqRCxDQUFDO0lBVEQsTUFBTSxLQUFLLFFBQVE7UUFDakIsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFT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QUNsQixDQUFDO0NBQ0Y7QUFFRCxhQUFhO0FBQ2IsdUVBQXVFO0FBQ3ZFLGlCQUFpQjtBQUNqQixjQUFjO0FBQ2QsTUFBTSxPQUFPLGVBQWU7SUFTMUIsWUFBWSxLQUFjLEVBQUUsTUFBZSxFQUFFLElBQWEsRUFBRSxJQUFhLEVBQUUsSUFBYTtRQVJ4RixRQUFHLEdBQVcsQ0FBQyxDQUFDO1FBQ2hCLFFBQUcsR0FBVyxDQUFDLENBQUM7UUFDaEIsUUFBRyxHQUFXLENBQUMsQ0FBQztRQUNoQixVQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQ2xCLFNBQUksR0FBVyxDQUFDLENBQUM7UUFLZixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sYUFBYTtJQUNyQixDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQWEsRUFBRSxNQUFjLEVBQUUsSUFBWSxFQUFFLElBQVksRUFBRSxJQUFZO1FBQzNGLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL2Vudi9JRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQgeyBQSUMgfSBmcm9tICcuL1BJQyc7XHJcbmltcG9ydCB7IERhdGVUaW1lLCBMaXN0LCBOU3RyaW5nLCBSZWZQYXJhbSwgU3RyaW5nQnVpbGRlciB9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtcclxuICBEYXRlVXRpbCxcclxuICBIVE1MXzJfU1RSLFxyXG4gIE1zZ0ludGVyZmFjZSxcclxuICBQSUNJbnRlcmZhY2UsXHJcbiAgU0VRXzJfSFRNTCxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbERhdGVKcG4sXHJcbiAgVXRpbFN0ckJ5dGVNb2RlXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7IEJsb2JUeXBlIH0gZnJvbSAnLi4vZGF0YS9CbG9iVHlwZSc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25EZXRhaWxzQmFzZSB9IGZyb20gJy4vVmFsaWRhdGlvbkRldGFpbHNCYXNlJztcclxuaW1wb3J0IHsgTlVNX1RZUEUgfSBmcm9tICcuLi9kYXRhL05VTV9UWVBFJztcclxuaW1wb3J0IHsgSGVicmV3RGF0ZSB9IGZyb20gJy4vSGVicmV3RGF0ZSc7XHJcbmltcG9ydCB7IEV2ZW50cyB9IGZyb20gJy4uLy4uL0V2ZW50cyc7XHJcbmltcG9ydCB7IEd1aUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vR3VpRW52aXJvbm1lbnQnO1xyXG5pbXBvcnQgeyBNZW1vcnlVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbC9NZW1vcnlVdGlsJztcclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBEaXNwbGF5Q29udmVydG9yIHtcclxuICBwcml2YXRlIF9lbnZpcm9ubWVudDogSUVudmlyb25tZW50ID0gbnVsbDtcclxuICBwcml2YXRlIERBVEVDSEFSOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRGlzcGxheUNvbnZlcnRvciA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogRGlzcGxheUNvbnZlcnRvciB7XHJcbiAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5faW5zdGFuY2UgPT09IG51bGwpIHtcclxuICAgICAgRGlzcGxheUNvbnZlcnRvci5faW5zdGFuY2UgPSBuZXcgRGlzcGxheUNvbnZlcnRvcigpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIERpc3BsYXlDb252ZXJ0b3IuX2luc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLl9lbnZpcm9ubWVudCA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0TmV3RGF0ZUJyZWFrUGFyYW1zKCk6IERhdGVCcmVha1BhcmFtcyB7XHJcbiAgICByZXR1cm4gbmV3IERhdGVCcmVha1BhcmFtcygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TmV3VGltZUJyZWFrUGFyYW1zKCk6IFRpbWVCcmVha1BhcmFtcyB7XHJcbiAgICByZXR1cm4gbmV3IFRpbWVCcmVha1BhcmFtcygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgb2YgYSB2YWx1ZSBmcm9tIGl0cyBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbHVlXCI+ICB0aGUgaW50ZXJuYWwgdmFsdWUgKGFzIHNlbnQgaW4gdGhlIFhNTClcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+IHZhbHVlIHJhbmdlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gICAgICB0aGUgcGljdHVyZSBmb3JtYXRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHN0cmluZyB0byBkaXNwbGF5XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBtZzJkaXNwKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyLCB0aW1lX2RhdGVfcGljX1pfZWR0OiBib29sZWFuKTogYW55O1xyXG4gIG1nMmRpc3AobWdWYWx1ZTogc3RyaW5nLCByYW5nZVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdXNlTmF0aXZlOiBib29sZWFuLCBhbHdheXNGaWxsOiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIsIHRpbWVfZGF0ZV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBhbnk7XHJcbiAgbWcyZGlzcChtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGFsd2F5c0ZpbGw6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlciwgY29udmVydENhc2U6IGJvb2xlYW4sIHRpbWVfZGF0ZV9udW1fcGljX1pfZWR0OiBib29sZWFuKTogYW55O1xyXG4gIG1nMmRpc3AobWdWYWx1ZTogc3RyaW5nLCByYW5nZVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdXNlTmF0aXZlOiBib29sZWFuLCBjb21wSWR4T3JBbHdheXNGaWxsOiBhbnksIHRpbWVfZGF0ZV9waWNfWl9lZHRPckNvbXBJZHg6IGFueSwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29udmVydENhc2U/OiBib29sZWFuLCB0aW1lX2RhdGVfbnVtX3BpY19aX2VkdD86IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDYpXHJcbiAgICAgIHJldHVybiB0aGlzLm1nMmRpc3BfMChtZ1ZhbHVlLCByYW5nZVN0ciwgcGljLCB1c2VOYXRpdmUsIGNvbXBJZHhPckFsd2F5c0ZpbGwsIHRpbWVfZGF0ZV9waWNfWl9lZHRPckNvbXBJZHgpO1xyXG5cclxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDcpXHJcbiAgICAgIHJldHVybiB0aGlzLm1nMmRpc3BfMShtZ1ZhbHVlLCByYW5nZVN0ciwgcGljLCB1c2VOYXRpdmUsIGNvbXBJZHhPckFsd2F5c0ZpbGwsIHRpbWVfZGF0ZV9waWNfWl9lZHRPckNvbXBJZHgsIHRpbWVfZGF0ZV9waWNfWl9lZHRPckNvbnZlcnRDYXNlKTtcclxuXHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLm1nMmRpc3BfMihtZ1ZhbHVlLCByYW5nZVN0ciwgcGljLCB1c2VOYXRpdmUsIGNvbXBJZHhPckFsd2F5c0ZpbGwsIHRpbWVfZGF0ZV9waWNfWl9lZHRPckNvbXBJZHgsIHRpbWVfZGF0ZV9waWNfWl9lZHRPckNvbnZlcnRDYXNlLCB0aW1lX2RhdGVfbnVtX3BpY19aX2VkdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1nMmRpc3BfMChtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlciwgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5tZzJkaXNwKG1nVmFsdWUsIHJhbmdlU3RyLCBwaWMsIHVzZU5hdGl2ZSwgZmFsc2UsIGNvbXBJZHgsIHRpbWVfZGF0ZV9waWNfWl9lZHQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZzJkaXNwXzEobWdWYWx1ZTogc3RyaW5nLCByYW5nZVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdXNlTmF0aXZlOiBib29sZWFuLCBhbHdheXNGaWxsOiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIsIHRpbWVfZGF0ZV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMubWcyZGlzcChtZ1ZhbHVlLCByYW5nZVN0ciwgcGljLCB1c2VOYXRpdmUsIGFsd2F5c0ZpbGwsIGNvbXBJZHgsIGZhbHNlLCB0aW1lX2RhdGVfcGljX1pfZWR0KTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBvZiBhIHZhbHVlIGZyb20gaXRzIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsdWVcIj50aGUgaW50ZXJuYWwgdmFsdWUgKGFzIHNlbnQgaW4gdGhlIFhNTClcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+dmFsdWUgcmFuZ2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPnRoZSBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWx3YXlzRmlsbFwiPkFsd2F5cyBhdXRvIGZpbGwgYWxwaGEgb3ZlciBpdHMgcGljdHVyZSAodXNlZCBmb3Igc2VsZWN0IGNvbnRyb2xzKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gc3RyaW5nIHRvIGRpc3BsYXlcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBtZzJkaXNwXzIobWdWYWx1ZTogc3RyaW5nLCByYW5nZVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdXNlTmF0aXZlOiBib29sZWFuLCBhbHdheXNGaWxsOiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIsIGNvbnZlcnRDYXNlOiBib29sZWFuLCB0aW1lX2RhdGVfbnVtX3BpY19aX2VkdDogYm9vbGVhbik6IGFueSB7XHJcbiAgICBsZXQgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IHRtcFJhbmdlOiBzdHJpbmcgPSAocmFuZ2VTdHIgPT09IG51bGwpID8gXCJcIiA6IHJhbmdlU3RyO1xyXG5cclxuICAgIHN3aXRjaCAocGljLmdldEF0dHIoKSkge1xyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICBzdHIgPSB0aGlzLmZyb21BbHBoYShtZ1ZhbHVlLCBwaWMsIHRtcFJhbmdlLCBhbHdheXNGaWxsLCBjb252ZXJ0Q2FzZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzoge1xyXG4gICAgICAgIHN0ciA9IHRoaXMuZnJvbU51bShtZ1ZhbHVlLCBwaWMpO1xyXG4gICAgICAgIC8vIFZhbHVlIHNob3VsZCBiZSB0cmltbWVkIHdoZW4gd2UgYXJlIGRpc3BsYXlpbmcgY29udHJvbCBpbiBvcmRlciB0byBkaXNwbGF5IGFsaWdubWVudCBwcm9wZXJseS4gQnV0IHdoaWxlIGVudGVyaW5nIGNvbnRyb2wsIGl0IHNob3VsZCBub3QgYmUgdHJpbW1lZFxyXG4gICAgICAgIC8vIGluIG9yZGVyIHRvIHJlYWQgaXQgcHJvcGVybHkuXHJcbiAgICAgICAgaWYgKHBpYy5nZXRNYXNrQ2hhcnMoKSA9PT0gMCB8fCAhdGltZV9kYXRlX251bV9waWNfWl9lZHQpXHJcbiAgICAgICAgICBzdHIgPSBTdHJVdGlsLmx0cmltKHN0cik7XHJcblxyXG4gICAgICAgIGlmICh1c2VOYXRpdmUpIHtcclxuICAgICAgICAgIGlmIChzdHIgPT0gXCJcIilcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICBsZXQgZGJsOiBudW1iZXIgPSBOdW1iZXIoc3RyKTtcclxuICAgICAgICAgIHJldHVybiBkYmw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHJldHVybiBzdHI7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6IHtcclxuICAgICAgICBpZiAodXNlTmF0aXZlKSB7XHJcbiAgICAgICAgICBsZXQgZHQ6IERhdGU7XHJcbiAgICAgICAgICBkdCA9IHRoaXMuZnJvbU1nRGF0ZVRvTmF0aXZlRGF0ZShtZ1ZhbHVlLCBjb21wSWR4KTtcclxuICAgICAgICAgIHJldHVybiBkdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBzdHIgPSB0aGlzLmZyb21EYXRlKG1nVmFsdWUsIHBpYywgY29tcElkeCwgdGltZV9kYXRlX251bV9waWNfWl9lZHQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOiB7XHJcbiAgICAgICAgaWYgKHVzZU5hdGl2ZSkge1xyXG4gICAgICAgICAgbGV0IGR0OiBEYXRlO1xyXG4gICAgICAgICAgZHQgPSB0aGlzLmZyb21NZ1RpbWVUb05hdGl2ZVRpbWUobWdWYWx1ZSwgcGljLCB0aW1lX2RhdGVfbnVtX3BpY19aX2VkdCk7XHJcbiAgICAgICAgICByZXR1cm4gZHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgc3RyID0gdGhpcy5mcm9tVGltZShtZ1ZhbHVlLCBwaWMsIHRpbWVfZGF0ZV9udW1fcGljX1pfZWR0KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjoge1xyXG4gICAgICAgIGxldCBsb2dWYWw6IGJvb2xlYW47XHJcbiAgICAgICAgbG9nVmFsID0gdGhpcy5mcm9tTWdMb2dpY2FsVG9OYXRpdmVMb2dpY2FsKG1nVmFsdWUpO1xyXG4gICAgICAgIHJldHVybiBsb2dWYWw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICAgIHN0ciA9IEJsb2JUeXBlLmdldFN0cmluZyhtZ1ZhbHVlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SOlxyXG4gICAgICAgIHN0ciA9IG1nVmFsdWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgZGlzcGxheSB2YWx1ZSBmcm9tIGl0cyBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsdWVcIj50aGUgdmFsdWUgYXMgZW50ZXJlZCBieSB1c2VyXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPnZhbHVlIHJhbmdlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj50aGUgcGljdHVyZSBmb3JtYXRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJsb2JDb250ZW50VHlwZVwiPmlmIHRoZSBhdHRyaWJ1dGUgaXMgYmxvYiwgaXRzIGNvbnRlbnQgdHlwZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gaW50ZXJuYWwgZm9ybSBvZiBkYXRhIChhcyB1c2VkIGluIHRoZSBYTUwpXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBkaXNwMm1nKGRpc3BWYWx1ZTogYW55LCByYW5nZVN0cjogc3RyaW5nLCBwaWM6IFBJQywgY29tcElkeDogbnVtYmVyLCBibG9iQ29udGVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHN3aXRjaCAocGljLmdldEF0dHIoKSkge1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIHN0ciA9IHRoaXMudG9BbHBoYShkaXNwVmFsdWUsIHBpYyk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6IHtcclxuICAgICAgICBkaXNwVmFsdWUgPSBTdHJpbmcoZGlzcFZhbHVlKTtcclxuICAgICAgICAvLyBSZW1vdmUgdGhlIG1hc2sgZnJvbSBkaXNwbGF5IHZhbHVlLlxyXG4gICAgICAgIGxldCBsZW46IG51bWJlciA9IGRpc3BWYWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgd2hpbGUgKGxlbiA+IDApIHtcclxuICAgICAgICAgIGlmICghcGljLnBpY0lzTWFzayhsZW4gLSAxKSAmJiBkaXNwVmFsdWVbbGVuIC0gMV0gIT09ICgnICcpKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGxlbi0tO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGlzcFZhbHVlLmxlbmd0aCA+IGxlbilcclxuICAgICAgICAgIGRpc3BWYWx1ZSA9IE5TdHJpbmcuUmVtb3ZlKGRpc3BWYWx1ZSwgbGVuLCAoZGlzcFZhbHVlLmxlbmd0aCAtIGxlbikpO1xyXG5cclxuICAgICAgICBpZiAocGljLmlzTmVnYXRpdmUoKSAmJiBkaXNwVmFsdWUudHJpbSgpLnN0YXJ0c1dpdGgoXCItXCIpKVxyXG4gICAgICAgICAgZGlzcFZhbHVlID0gU3RyVXRpbC5sdHJpbShkaXNwVmFsdWUpO1xyXG5cclxuICAgICAgICBzdHIgPSB0aGlzLnRvTnVtKGRpc3BWYWx1ZSwgcGljLCBjb21wSWR4KTtcclxuICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICB7XHJcbiAgICAgICAgbGV0IGR0OiBEYXRlO1xyXG4gICAgICAgIC8vd2hlbiBkYXRlIGlzIGluIGl0ZW0gbGlzdCBmb3IgY2hvaWNlIGN0cmwsIGl0IHdpbGwgY29tZSBoZXJlIGFzIHN0cmluZy4gc28gY29udmVydCBpdCB0byBEYXRlLlxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcFZhbHVlID09PSAnc3RyaW5nJylcclxuICAgICAgICAgIGR0ID0gbmV3IERhdGUgKGRpc3BWYWx1ZSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZHQgPSBkaXNwVmFsdWU7XHJcbiAgICAgICAgc3RyID0gdGhpcy5mcm9tTmF0aXZlRGF0ZVRvTWdEYXRlKGR0LCBwaWMsIGNvbXBJZHgpO1xyXG4gICAgICB9XHJcbiAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOiB7XHJcbiAgICAgICAgbGV0IGR0OiBEYXRlO1xyXG5cclxuICAgICAgICAvL3doZW4gZGF0ZSBpcyBpbiBpdGVtIGxpc3QgZm9yIGNob2ljZSBjdHJsLCBpdCB3aWxsIGNvbWUgaGVyZSBhcyBzdHJpbmcuIHNvIGNvbnZlcnQgaXQgdG8gRGF0ZS5cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3BWYWx1ZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZHQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgaWYgKGRpc3BWYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBkdC5zZXRIb3VycygrU3RyaW5nKGRpc3BWYWx1ZSkuc3Vic3RyKDAsIDIpKTtcclxuICAgICAgICAgICAgZHQuc2V0TWludXRlcygrU3RyaW5nKGRpc3BWYWx1ZSkuc3Vic3RyKDAsIDIpKTtcclxuICAgICAgICAgICAgaWYgKFN0cmluZyhkaXNwVmFsdWUpLmxlbmd0aCA+IDUpXHJcbiAgICAgICAgICAgICAgZHQuc2V0U2Vjb25kcygrU3RyaW5nKGRpc3BWYWx1ZSkuc3Vic3RyKDAsIDIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGR0ID0gZGlzcFZhbHVlO1xyXG5cclxuICAgICAgICBzdHIgPSB0aGlzLmZyb21OYXRpdmVUaW1lVG9NZ1RpbWUoZHQsIHBpYyk7XHJcbiAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICBzdHIgPSB0aGlzLmZyb21OYXRpdmVMb2dpY2FsVG9NZ0xvZ2ljYWwoZGlzcFZhbHVlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICBzdHIgPSBCbG9iVHlwZS5jcmVhdGVGcm9tU3RyaW5nKGRpc3BWYWx1ZSwgYmxvYkNvbnRlbnRUeXBlKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBzdHI7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vICBNZXRob2RzIGZvciBjb3ZlcnRpbmcgSU5URVJOQUwgLS0tPiBESVBMQVlcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSGFuZGxlcyBtYWdpYyBudW1iZXIgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdOdW1cIj4gICBBIE1hZ2ljIE51bWJlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gIFRoZSBwaWN0dXJlIHRvIHVzZTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGZyb21OdW0obWdWYWx1ZTogc3RyaW5nLCBwaWM6IFBJQyk6IHN0cmluZyB7XHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKG1nVmFsdWUpO1xyXG4gICAgcmV0dXJuIG1nTnVtLnRvRGlzcGxheVZhbHVlKHBpYyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gYWxwaGEgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGFcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPiAgVGhlIHJhbmdlIG9mIHZhbHVlcyB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWx3YXlzRmlsbFwiPkFsd2F5cyBhdXRvIGZpbGwgYWxwaGEgb3ZlciBpdHMgcGljdHVyZSAodXNlZCBmb3Igc2VsZWN0IGNvbnRyb2xzKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZnJvbUFscGhhKGRhdGFTdHI6IHN0cmluZywgcGljOiBQSUMsIHJhbmdlU3RyOiBzdHJpbmcsIGFsd2F5c0ZpbGw6IGJvb2xlYW4sIGNvbnZlcnRDYXNlOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBsZW46IG51bWJlciA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG4gICAgbGV0IG1pbl9sZW46IG51bWJlciA9IGxlbjtcclxuICAgIGxldCBtYXNrU3RyOiBzdHJpbmcgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgbGV0IHJlc1N0cjogc3RyaW5nO1xyXG5cclxuICAgIGlmIChwaWMuZ2V0TWFza0NoYXJzKCkgPiAwKSB7XHJcbiAgICAgIHJlc1N0ciA9IHRoaXMud2luX2RhdGFfY3B5KE5TdHJpbmcuVG9DaGFyQXJyYXkobWFza1N0ciksIGxlbiwgTlN0cmluZy5Ub0NoYXJBcnJheShkYXRhU3RyKSwgcGljLmlzQXR0ckFscGhhKCksIGNvbnZlcnRDYXNlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBwaWMuaXNBdHRyQWxwaGEoKSlcclxuICAgICAgLy8gSlBOOiBEQkNTIHN1cHBvcnRcclxuICAgICAge1xyXG4gICAgICAgIC8vIHN1YnN0cmluZyBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzXHJcbiAgICAgICAgbGV0IGludERhdGFTdHJMZW5COiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQihkYXRhU3RyKTtcclxuICAgICAgICBpZiAobWluX2xlbiA+IGludERhdGFTdHJMZW5CKSB7XHJcbiAgICAgICAgICBtaW5fbGVuID0gaW50RGF0YVN0ckxlbkI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc1N0ciA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihkYXRhU3RyLCBtaW5fbGVuKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChkYXRhU3RyICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKG1pbl9sZW4gPiBkYXRhU3RyLmxlbmd0aCkge1xyXG4gICAgICAgICAgbWluX2xlbiA9IGRhdGFTdHIubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udmVydENhc2UpIHtcclxuICAgICAgICAgIHJlc1N0ciA9IHRoaXMud2luX2RhdGFfY3B5KE5TdHJpbmcuVG9DaGFyQXJyYXkobWFza1N0ciksIGxlbiwgTlN0cmluZy5Ub0NoYXJBcnJheShkYXRhU3RyKSwgcGljLmlzQXR0ckFscGhhKCksIGNvbnZlcnRDYXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICByZXNTdHIgPSBkYXRhU3RyLnN1YnN0cigwLCBtaW5fbGVuKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBXZSBkbyBub3QgZmlsbCBBbHBoYSBmaWxlZCBvdmVyIGNvbnRyb2wncyBwaWN0dXJlIGxlbmd0aCBRQ1IgIyAyOTU0MDhcclxuICAgIGlmIChhbHdheXNGaWxsIHx8IChyYW5nZVN0ciAhPT0gbnVsbCAmJiByYW5nZVN0ci5sZW5ndGggPiAwICYmIHJlc1N0ci5sZW5ndGggPCBsZW4pKSB7XHJcbiAgICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHNCYXNlID0gbmV3IFZhbGlkYXRpb25EZXRhaWxzQmFzZShyYW5nZVN0cik7XHJcbiAgICAgIGxldCBjb250aW51b3VzUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IHZkLmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpO1xyXG4gICAgICBsZXQgZGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+ID0gdmQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpO1xyXG4gICAgICBpZiAoY29udGludW91c1JhbmdlVmFsdWVzICE9PSBudWxsIHx8IGRpc2NyZXRlUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgICByZXNTdHIgPSB0aGlzLmZpbGxBbHBoYUJ5UmFuZ2UoY29udGludW91c1JhbmdlVmFsdWVzLCBkaXNjcmV0ZVJhbmdlVmFsdWVzLCByZXNTdHIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzU3RyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYXNlQ29udmVydGVkQ2hhcihkYXRhOiBzdHJpbmcsIG1hc2s6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IGNoOiBzdHJpbmc7XHJcbiAgICBpZiAobWFzay5jaGFyQ29kZUF0KDApID09PSBQSUNJbnRlcmZhY2UuUElDX1UpIHtcclxuICAgICAgY2ggPSBkYXRhLnRvVXBwZXJDYXNlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKG1hc2suY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19MKSB7XHJcbiAgICAgICAgY2ggPSBkYXRhLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY2ggPSBkYXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2g7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdpbl9kYXRhX2NweShtYXNrU3RyOiBzdHJpbmdbXSwgbWFza0xlbjogbnVtYmVyLCBkYXRhU3RyOiBzdHJpbmdbXSwgaXNBdHRyQWxwaGE6IGJvb2xlYW4pOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSB3aW5fZGF0YV9jcHkobWFza1N0cjogc3RyaW5nW10sIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogc3RyaW5nW10sIGlzQXR0ckFscGhhOiBib29sZWFuLCBjb252ZXJ0Q2FzZTogYm9vbGVhbik6IHN0cmluZztcclxuICBwcml2YXRlIHdpbl9kYXRhX2NweShtYXNrU3RyOiBhbnksIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogYW55LCBpc0F0dHJBbHBoYTogYm9vbGVhbiwgY29udmVydENhc2U/OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0KVxyXG4gICAgICByZXR1cm4gdGhpcy53aW5fZGF0YV9jcHlfMChtYXNrU3RyLCBtYXNrTGVuLCBkYXRhU3RyLCBpc0F0dHJBbHBoYSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2luX2RhdGFfY3B5XzEobWFza1N0ciwgbWFza0xlbiwgZGF0YVN0ciwgaXNBdHRyQWxwaGEsIGNvbnZlcnRDYXNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgd2luX2RhdGFfY3B5XzAobWFza1N0cjogc3RyaW5nW10sIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogc3RyaW5nW10sIGlzQXR0ckFscGhhOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLndpbl9kYXRhX2NweShtYXNrU3RyLCBtYXNrTGVuLCBkYXRhU3RyLCBpc0F0dHJBbHBoYSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZXMgYWxwaGEgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWFza1N0clwiPiAgIFRoZSBtYXNrIHRvIGJlIHVzZWQgaW4gb3JkZXIgdG8gYnVpbGQgdGhlIHN0cmluZ1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgd2luX2RhdGFfY3B5XzEobWFza1N0cjogc3RyaW5nW10sIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogc3RyaW5nW10sIGlzQXR0ckFscGhhOiBib29sZWFuLCBjb252ZXJ0Q2FzZTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWFza0lkeDogbnVtYmVyID0gMDtcclxuICAgIGxldCBkYXRhSWR4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHJlc1N0cjogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPihtYXNrTGVuKTtcclxuXHJcbiAgICBpZiAoaXNBdHRyQWxwaGEgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICBsZXQgbnVtMjogbnVtYmVyID0gMDtcclxuICAgICAgd2hpbGUgKG1hc2tJZHggPCBtYXNrTGVuICYmIG51bTIgPCBtYXNrTGVuKSB7XHJcbiAgICAgICAgaWYgKG1hc2tTdHJbbWFza0lkeF0uY2hhckNvZGVBdCgwKSA8PSBQSUNJbnRlcmZhY2UuUElDX01BWF9PUCkge1xyXG4gICAgICAgICAgaWYgKGRhdGFJZHggPCBkYXRhU3RyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgc3RyVmFsOiBzdHJpbmcgPSBOU3RyaW5nLkZyb21DaGFycyhkYXRhU3RyLCBkYXRhSWR4LCAxKTtcclxuICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0clZhbCkgPT09IDIpIHtcclxuICAgICAgICAgICAgICBpZiAobWFza0lkeCArIDEgPCBtYXNrTGVuKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFza1N0clttYXNrSWR4ICsgMV0uY2hhckNvZGVBdCgwKSA8PSBQSUNJbnRlcmZhY2UuUElDX01BWF9PUCkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY29udmVydENhc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9IHRoaXMuY2FzZUNvbnZlcnRlZENoYXIoZGF0YVN0cltkYXRhSWR4KytdLCBtYXNrU3RyW21hc2tJZHggKyAxXSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzU3RyW251bTIrK10gPSBkYXRhU3RyW2RhdGFJZHgrK107XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgbWFza0lkeCA9IG1hc2tJZHggKyAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlc1N0cltudW0yKytdID0gJyAnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc1N0cltudW0yKytdID0gJyAnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAoY29udmVydENhc2UpIHtcclxuICAgICAgICAgICAgICAgIHJlc1N0cltudW0yKytdID0gdGhpcy5jYXNlQ29udmVydGVkQ2hhcihkYXRhU3RyW2RhdGFJZHgrK10sIG1hc2tTdHJbbWFza0lkeCArIDFdKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9IGRhdGFTdHJbZGF0YUlkeCsrXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9ICcgJy8qJyAnKi87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVzU3RyW251bTIrK10gPSBtYXNrU3RyW21hc2tJZHhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtYXNrSWR4ID0gbWFza0lkeCArIDE7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKHJlc1N0cikuc3Vic3RyKDAsIG51bTIpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlIChtYXNrSWR4IDwgbWFza0xlbikge1xyXG4gICAgICBpZiAobWFza1N0clttYXNrSWR4XS5jaGFyQ29kZUF0KDApIDw9IFBJQ0ludGVyZmFjZS5QSUNfTUFYX09QKSB7XHJcbiAgICAgICAgaWYgKGRhdGFJZHggPCBkYXRhU3RyLmxlbmd0aCkge1xyXG4gICAgICAgICAgcmVzU3RyW21hc2tJZHhdID0gZGF0YVN0cltkYXRhSWR4XTtcclxuICAgICAgICAgIGlmIChjb252ZXJ0Q2FzZSkge1xyXG4gICAgICAgICAgICByZXNTdHJbbWFza0lkeF0gPSB0aGlzLmNhc2VDb252ZXJ0ZWRDaGFyKGRhdGFTdHJbZGF0YUlkeF0sIG1hc2tTdHJbbWFza0lkeF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc1N0clttYXNrSWR4XSA9IGRhdGFTdHJbZGF0YUlkeF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXRhSWR4ID0gZGF0YUlkeCArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVzU3RyW21hc2tJZHhdID0gJyAnLyonICcqLztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmVzU3RyW21hc2tJZHhdID0gbWFza1N0clttYXNrSWR4XTtcclxuICAgICAgfVxyXG4gICAgICBtYXNrSWR4ID0gbWFza0lkeCArIDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMocmVzU3RyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIGZvciBhbiBkYXRlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgVGhlIHNvdXJjZSBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkPC9yZXR1cm5zPlxyXG4gIGZyb21EYXRlKGRhdGFTdHI6IHN0cmluZywgcGljOiBQSUMsIGNvbXBJZHg6IG51bWJlciwgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWFzazogc3RyaW5nID0gcGljLmdldE1hc2soKTtcclxuICAgIGxldCBtYXNrU2l6ZTogbnVtYmVyID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICBsZXQgZGF0ZTogbnVtYmVyID0gbmV3IE5VTV9UWVBFKGRhdGFTdHIpLk5VTV8yX1VMT05HKCk7XHJcbiAgICByZXR1cm4gdGhpcy50b19hX3BpY19kYXRlbW9kZShtYXNrLCBtYXNrU2l6ZSwgZGF0ZSwgcGljLCB0aW1lX2RhdGVfcGljX1pfZWR0LCBmYWxzZSwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gdGltZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFRoZSBzb3VyY2UgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBmcm9tVGltZShkYXRhU3RyOiBzdHJpbmcsIHBpYzogUElDLCB0aW1lX2RhdGVfcGljX1pfZWR0OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBtYXNrOiBzdHJpbmcgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgbGV0IG1hc2tTaXplOiBudW1iZXIgPSBwaWMuZ2V0TWFza1NpemUoKTtcclxuICAgIGxldCB0aW1lOiBudW1iZXIgPSBuZXcgTlVNX1RZUEUoZGF0YVN0cikuTlVNXzJfVUxPTkcoKTtcclxuICAgIHJldHVybiB0aGlzLnRpbWVfMl9hX3BpYyhtYXNrLCBtYXNrU2l6ZSwgdGltZSwgcGljLCB0aW1lX2RhdGVfcGljX1pfZWR0LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gZGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFRoZSBzb3VyY2UgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBmcm9tTWdEYXRlVG9OYXRpdmVEYXRlKGRhdGFTdHI6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogRGF0ZSB7XHJcblxyXG4gICAgbGV0IGRhdGU6IG51bWJlciA9IG5ldyBOVU1fVFlQRShkYXRhU3RyKS5OVU1fMl9VTE9ORygpO1xyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXM7XHJcbiAgICBsZXQgb3V0SWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIEJyZWFrIGRhdGEgaW50byBpdHMgY29tcG9uZW50c1xyXG4gICAgYnJlYWtQYXJhbXMgPSBuZXcgRGF0ZUJyZWFrUGFyYW1zKCk7XHJcbiAgICB0aGlzLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGUsIGZhbHNlLCBjb21wSWR4KTtcclxuICAgIGlmIChicmVha1BhcmFtcy5tb250aCA+IDApXHJcbiAgICAgIGJyZWFrUGFyYW1zLm1vbnRoID0gYnJlYWtQYXJhbXMubW9udGggLSAxOyAvL21vbnRoIGlzIDAgYmFzZWQgaW4gRGF0ZSBjbGFzc1xyXG5cclxuICAgIGlmIChicmVha1BhcmFtcy55ZWFyID09IDAgJiYgYnJlYWtQYXJhbXMubW9udGggPT0gMCAmJiBicmVha1BhcmFtcy5kYXkgPT0gMClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgbmF0aXZlRHQ6IERhdGUgPSBuZXcgRGF0ZShicmVha1BhcmFtcy55ZWFyLCBicmVha1BhcmFtcy5tb250aCwgYnJlYWtQYXJhbXMuZGF5KTtcclxuXHJcbiAgICByZXR1cm4gbmF0aXZlRHQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIGRhdGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgdGhlIHZhbHVlIHRvIGRpc3BsYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgZnJvbU5hdGl2ZURhdGVUb01nRGF0ZU51bWJlcihuYXRpdmVEYXRlOiBEYXRlLCBwaWM6IFBJQywgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBudW1WYWw6IG51bWJlcjtcclxuICAgIGxldCBkYXRlUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXM7XHJcbiAgICBsZXQgbWlsbGVuaXVtOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHllYXI6IG51bWJlciA9IG5hdGl2ZURhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgIGxldCBkYXk6IG51bWJlciA9IG5hdGl2ZURhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgbGV0IG1vbnRoOiBudW1iZXIgPSBuYXRpdmVEYXRlLmdldE1vbnRoKCkgKyAxO1xyXG5cclxuICAgIC8vIEhlYnJldyBZZWFyXHJcbiAgICBpZiAocGljLmlzSGVicmV3KCkpIHtcclxuICAgICAgaWYgKHllYXIgPiAwKSB7XHJcbiAgICAgICAgaWYgKG1pbGxlbml1bSA9PT0gMClcclxuICAgICAgICAgIG1pbGxlbml1bSA9IDU7XHJcbiAgICAgICAgeWVhciArPSBtaWxsZW5pdW0gKiAxMDAwO1xyXG4gICAgICB9XHJcbiAgICAgIG51bVZhbCA9IChIZWJyZXdEYXRlLmRhdGVoZWJfMl9kKHllYXIsIG1vbnRoLCBkYXkpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyB0aGUgbmV4dCAyIGxpbmVzIHN1cHBvcnQgNC54eCBERC9NTSBwaWN0dXJlc1xyXG4gICAgICBpZiAoeWVhciA9PT0gMCkge1xyXG4gICAgICAgIGRhdGVQYXJhbXMgPSB0aGlzLmRhdGVfc3lzKCk7XHJcbiAgICAgICAgeWVhciA9IGRhdGVQYXJhbXMueWVhcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbnVtVmFsID0gdGhpcy5kYXRlXzRfY2FsZW5kZXIoeWVhciwgbW9udGgsIGRheSwgMCwgZmFsc2UpOyAgICAvLyB3ZSBhcmUgYWRkaW5nIGEgbGl0dGxlIGVtcHR5IHNwYWNlIHRvIHRoZSB2YXJpYWJsZSwgYmVjYXVzZSB3ZSBtaWdodCBsYXRlclxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bVZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIGZvciBhbiBkYXRlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgVGhlIHNvdXJjZSBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkPC9yZXR1cm5zPlxyXG4gIGZyb21OYXRpdmVEYXRlVG9NZ0RhdGUobmF0aXZlRGF0ZTogRGF0ZSwgcGljOiBQSUMsIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IG1nTnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IG51bVZhbDogbnVtYmVyID0gbmF0aXZlRGF0ZSA9PSBudWxsID8gMCA6IHRoaXMuZnJvbU5hdGl2ZURhdGVUb01nRGF0ZU51bWJlcihuYXRpdmVEYXRlLCBwaWMsIGNvbXBJZHgpO1xyXG4gICAgbWdOdW0uTlVNXzRfTE9ORyhudW1WYWwpO1xyXG5cclxuICAgIHJldHVybiBtZ051bS50b1hNTHJlY29yZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBkYXRlIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm91dFN0clwiPiAgICAgICAgICBUaGUgbWFzayB0byBiZSB1c2VkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvdXRfbGVuXCI+ICAgICAgICAgTWFzayBsZW5ndGhcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPiAgICAgICAgICAgICBUaGUgcGljdXJlIGluZm9ybWF0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRlX3BpY19aX2VkdFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlX2R0X2ZtdFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHRvX2FfcGljX2RhdGVtb2RlKG91dFN0cjogc3RyaW5nLCBvdXRfbGVuOiBudW1iZXIsIGRhdGU6IG51bWJlciwgcGljOiBQSUMsIGRhdGVfcGljX1pfZWR0OiBib29sZWFuLCBpZ25vcmVfZHRfZm10OiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGxlbjogbnVtYmVyO1xyXG4gICAgbGV0IGRheTogbnVtYmVyID0gMDtcclxuICAgIGxldCBkb3k6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZG93OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHllYXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbW9udGg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgaGRheTogbnVtYmVyID0gMDtcclxuICAgIGxldCBoeWVhcjogbnVtYmVyID0gMDtcclxuICAgIGxldCBobW9udGg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbGVhcDogQm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBwOiBzdHJpbmdbXTtcclxuICAgIGxldCBvdXRWYWw6IHN0cmluZ1tdID0gTlN0cmluZy5Ub0NoYXJBcnJheShvdXRTdHIpO1xyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXM7XHJcbiAgICBsZXQgZGF0ZU5hbWVQYXJhbXM6IERhdGVOYW1lUGFyYW1zO1xyXG4gICAgbGV0IG91dElkeDogbnVtYmVyID0gMDtcclxuICAgIGxldCBzdHJPdXQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgLy8gSWYgcmVzdWx0IG92ZXJmbG93cyByZXR1cm4gYnVmZmVyLCBmaWxsIHdpdGggYXN0ZXJpeHMgYW5kIGJhaWwgb3V0XHJcbiAgICBpZiAocGljLmdldE1hc2tTaXplKCkgPiBvdXRfbGVuKSB7XHJcbiAgICAgIGZvciAoOyBpIDwgb3V0X2xlbjsgaSsrKVxyXG4gICAgICAgIG91dFZhbFtpXSA9ICcqJztcclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKG91dFZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgemVybyBmaWxsIHJlcXVlc3RlZCBhbmQgZGF0ZSB2YWx1ZSBpcyB6ZXJvLCBmaWxsIGl0IGFuZCBiYWlsIG91dFxyXG4gICAgb3V0X2xlbiA9IGxlbiA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG4gICAgaWYgKHBpYy56ZXJvRmlsbCgpICYmIGRhdGUgPT09IDAgJiYgIWRhdGVfcGljX1pfZWR0KSB7XHJcbiAgICAgIGZvciAoOyBpIDwgb3V0X2xlbjsgaSsrKVxyXG4gICAgICAgIG91dFZhbFtpXSA9IHBpYy5nZXRaZXJvUGFkKCk7XHJcbiAgICAgIHJldHVybiBOU3RyaW5nLkZyb21DaGFycyhvdXRWYWwpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBpYy5pc0hlYnJldygpICYmIChkYXRlID09PSAwIHx8IGRhdGUgPT09IDEwMDAwMDAwMDApKSB7XHJcbiAgICAgIGZvciAoOyBpIDwgb3V0X2xlbjsgaSsrKVxyXG4gICAgICAgIG91dFZhbFtpXSA9ICcgJztcclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKG91dFZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQnJlYWsgZGF0YSBpbnRvIGl0cyBjb21wb25lbnRzXHJcbiAgICBicmVha1BhcmFtcyA9IG5ldyBEYXRlQnJlYWtQYXJhbXMoeWVhciwgbW9udGgsIGRheSwgZG95LCBkb3cpO1xyXG4gICAgdGhpcy5kYXRlX2JyZWFrX2RhdGVtb2RlKGJyZWFrUGFyYW1zLCBkYXRlLCBpZ25vcmVfZHRfZm10LCBjb21wSWR4KTtcclxuICAgIGlmIChwaWMuaXNIZWJyZXcoKSkge1xyXG4gICAgICBsZXQgcmVmaGRheTogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbTxudW1iZXI+KGhkYXkpO1xyXG4gICAgICBsZXQgcmVmaG1vbnRoOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4oaG1vbnRoKTtcclxuICAgICAgbGV0IHJlZmh5ZWFyOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4oaHllYXIpO1xyXG4gICAgICBsZWFwID0gSGVicmV3RGF0ZS5kYXRlaGViXzRfZChkYXRlLCByZWZoZGF5LCByZWZobW9udGgsIHJlZmh5ZWFyKTtcclxuXHJcbiAgICAgIGhkYXkgPSByZWZoZGF5LnZhbHVlO1xyXG4gICAgICBobW9udGggPSByZWZobW9udGgudmFsdWU7XHJcbiAgICAgIGh5ZWFyID0gcmVmaHllYXIudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgeWVhciA9IGJyZWFrUGFyYW1zLnllYXI7XHJcbiAgICBtb250aCA9IGJyZWFrUGFyYW1zLm1vbnRoO1xyXG4gICAgZGF5ID0gYnJlYWtQYXJhbXMuZGF5O1xyXG4gICAgZG95ID0gYnJlYWtQYXJhbXMuZG95O1xyXG4gICAgZG93ID0gYnJlYWtQYXJhbXMuZG93O1xyXG4gICAgYnJlYWtQYXJhbXMgPSBudWxsO1xyXG4gICAgd2hpbGUgKGxlbiA+IDApIHtcclxuICAgICAgbGV0IHJlZk91dExlbjogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbTxudW1iZXI+KG91dF9sZW4pO1xyXG4gICAgICBzd2l0Y2ggKG91dFZhbFtvdXRJZHhdLmNoYXJDb2RlQXQoMCkpIHtcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVk6XHJcbiAgICAgICAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiBkYXRlX3BpY19aX2VkdClcclxuICAgICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dElkeCwgcGljLmdldFplcm9QYWQoKSwgMik7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMiwgeWVhciwgJzAnKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSFlZWVlZOlxyXG4gICAgICAgICAgaSA9IEhlYnJld0RhdGUuZGF0ZWhlYl8yX3N0cihvdXRWYWwsIG91dElkeCwgbGVuLCByZWZPdXRMZW4sIDUsIGh5ZWFyLCBwaWMuaXNUcmltZWQoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICBvdXRfbGVuID0gcmVmT3V0TGVuLnZhbHVlO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IGk7XHJcbiAgICAgICAgICBsZW4gLT0gaTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ITDpcclxuICAgICAgICAgIGkgPSBIZWJyZXdEYXRlLmRhdGVoZWJfaV8yX2goKGh5ZWFyIC8gMTAwMCkgJSAxMCwgb3V0VmFsLCBvdXRJZHgsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICBvdXRJZHgrKztcclxuICAgICAgICAgIGxlbi0tO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hERDpcclxuICAgICAgICAgIGkgPSBIZWJyZXdEYXRlLmRhdGVoZWJfMl9zdHIob3V0VmFsLCBvdXRJZHgsIGxlbiwgcmVmT3V0TGVuLCAyLCBoZGF5LCBwaWMuaXNUcmltZWQoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgb3V0X2xlbiA9IHJlZk91dExlbi52YWx1ZTtcclxuICAgICAgICAgIG91dElkeCArPSBpO1xyXG4gICAgICAgICAgbGVuIC09IGk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVlZWTpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCA0KTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCA0LCB5ZWFyLCAnMCcpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDQ7XHJcbiAgICAgICAgICBsZW4gLT0gNDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19NTUQ6XHJcbiAgICAgICAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiBkYXRlX3BpY19aX2VkdClcclxuICAgICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dElkeCwgcGljLmdldFplcm9QYWQoKSwgMik7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMiwgbW9udGgsICcwJyk7XHJcbiAgICAgICAgICBvdXRJZHggKz0gMjtcclxuICAgICAgICAgIGxlbiAtPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NTTpcclxuICAgICAgICAgIGlmIChwaWMuaXNIZWJyZXcoKSkge1xyXG4gICAgICAgICAgICBpZiAobGVhcCAmJiBobW9udGggPT09IDYpXHJcbiAgICAgICAgICAgICAgaG1vbnRoID0gMTQ7XHJcbiAgICAgICAgICAgIGxldCBtb250aE5hbWVzOiBzdHJpbmdbXSA9IEhlYnJld0RhdGUuR2V0TG9jYWxNb250aHMoKTtcclxuICAgICAgICAgICAgcCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkobW9udGhOYW1lc1tobW9udGhdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgbW9udGhTdHI6IHN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKE1zZ0ludGVyZmFjZS5NT05USFNfUFRSKTtcclxuICAgICAgICAgICAgbGV0IG1vbnRoTmFtZXM6IHN0cmluZ1tdID0gRGF0ZVV0aWwuZ2V0TG9jYWxNb250aHMobW9udGhTdHIpO1xyXG4gICAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShtb250aE5hbWVzW21vbnRoXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG5ldyBEYXRlTmFtZVBhcmFtcyhvdXRWYWwsIG91dElkeCwgbGVuKTtcclxuICAgICAgICAgIG91dF9sZW4gLT0gdGhpcy5kYXRlX2lfMl9ubShkYXRlTmFtZVBhcmFtcywgcCwgcGljLmlzVHJpbWVkKCkpO1xyXG4gICAgICAgICAgb3V0SWR4ID0gZGF0ZU5hbWVQYXJhbXMub3V0SWR4O1xyXG4gICAgICAgICAgbGVuID0gZGF0ZU5hbWVQYXJhbXMubGVuO1xyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REOlxyXG4gICAgICAgICAgbGV0IGlzWmVybzogYm9vbGVhbiA9IHBpYy56ZXJvRmlsbCgpO1xyXG4gICAgICAgICAgaWYgKGlzWmVybyAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAyKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAyLCBkYXksICcwJyk7XHJcbiAgICAgICAgICBvdXRJZHggKz0gMjtcclxuICAgICAgICAgIGxlbiAtPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0RERDpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAzKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAzLCBkb3ksICcwJyk7XHJcbiAgICAgICAgICBsZW4gLT0gMztcclxuICAgICAgICAgIG91dElkeCArPSAzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REREQ6XHJcbiAgICAgICAgICBpID0gdGhpcy5kYXRlXzJfRERERChkYXksIG91dFZhbCwgb3V0SWR4LCBsZW4sIHBpYy5pc1RyaW1lZCgpKTtcclxuICAgICAgICAgIG91dElkeCArPSBpO1xyXG4gICAgICAgICAgb3V0X2xlbiArPSBpIC0gNDtcclxuICAgICAgICAgIGxlbiAtPSA0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1c6XHJcbiAgICAgICAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiBkYXRlX3BpY19aX2VkdClcclxuICAgICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dElkeCwgcGljLmdldFplcm9QYWQoKSwgMSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMSwgZG93LCAnMCcpO1xyXG4gICAgICAgICAgbGVuLS07XHJcbiAgICAgICAgICBvdXRJZHgrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19XV1c6XHJcbiAgICAgICAgICBpZiAocGljLmlzSGVicmV3KCkpIHtcclxuICAgICAgICAgICAgbGV0IGRvd3NOYW1lczogc3RyaW5nW10gPSBIZWJyZXdEYXRlLkdldExvY2FsRG93cygpO1xyXG4gICAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShkb3dzTmFtZXNbZG93XSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGRheVN0cjogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLkRBWVNfUFRSKTtcclxuICAgICAgICAgICAgbGV0IGRheU5hbWVzOiBzdHJpbmdbXSA9IERhdGVVdGlsLmdldExvY2FsRGF5cyhkYXlTdHIpO1xyXG4gICAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShkYXlOYW1lc1tkb3ddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbmV3IERhdGVOYW1lUGFyYW1zKG91dFZhbCwgb3V0SWR4LCBsZW4pO1xyXG4gICAgICAgICAgb3V0X2xlbiAtPSB0aGlzLmRhdGVfaV8yX25tKGRhdGVOYW1lUGFyYW1zLCBwLCBwaWMuaXNUcmltZWQoKSk7XHJcbiAgICAgICAgICBvdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHg7XHJcbiAgICAgICAgICBsZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW47XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfQkI6IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIC8vIEphcGFuZXNlIGRheSBvZiB0aGUgd2Vla1xyXG4gICAgICAgICAgcCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoVXRpbERhdGVKcG4uZ2V0U3RyRG93KGRvdykpO1xyXG4gICAgICAgICAgc3RyT3V0ID0gbnVsbDtcclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbmV3IERhdGVOYW1lUGFyYW1zKG91dFZhbCwgb3V0SWR4LCBsZW4pO1xyXG4gICAgICAgICAgc3RyT3V0ID0gdGhpcy5kYXRlX2lfMl9ubV9ieXRlbW9kZShzdHJPdXQsIGRhdGVOYW1lUGFyYW1zLCBOU3RyaW5nLkZyb21DaGFycyhwKSwgb3V0X2xlbik7XHJcbiAgICAgICAgICBvdXRWYWwgPSBuZXcgQXJyYXkoc3RyT3V0Lmxlbmd0aCk7XHJcbiAgICAgICAgICBOU3RyaW5nLkNvcHlUbyhzdHJPdXQsIDAsIG91dFZhbCwgMCwgc3RyT3V0Lmxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgb3V0SWR4ID0gZGF0ZU5hbWVQYXJhbXMub3V0SWR4O1xyXG4gICAgICAgICAgbGVuID0gZGF0ZU5hbWVQYXJhbXMubGVuO1xyXG4gICAgICAgICAgc3RyT3V0ID0gbnVsbDtcclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbnVsbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KWTE6XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZMjpcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSlk0OlxyXG4gICAgICAgICAgLy8gSmFwYW5lc2UgdGhlIG5hbWUgb2YgYW4gZXJhXHJcbiAgICAgICAgICBsZXQgc3RyTnVtOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgICAgaWYgKG91dFZhbFtvdXRJZHhdLmNoYXJDb2RlQXQoMCkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkxKVxyXG4gICAgICAgICAgICBzdHJOdW0gPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmRhdGVfanBuX3lyXzJfYSh5ZWFyLCBkb3ksIGZhbHNlKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgc3RyTnVtID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95cl8yX2EoeWVhciwgZG95LCB0cnVlKTtcclxuICAgICAgICAgIHN0ck91dCA9IG51bGw7XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG5ldyBEYXRlTmFtZVBhcmFtcyhvdXRWYWwsIG91dElkeCwgbGVuKTtcclxuICAgICAgICAgIHN0ck91dCA9IHRoaXMuZGF0ZV9pXzJfbm1fYnl0ZW1vZGUoc3RyT3V0LCBkYXRlTmFtZVBhcmFtcywgc3RyTnVtLCBvdXRfbGVuKTtcclxuICAgICAgICAgIG91dFZhbCA9IG51bGw7XHJcbiAgICAgICAgICBvdXRWYWwgPSBuZXcgQXJyYXkoc3RyT3V0Lmxlbmd0aCk7XHJcbiAgICAgICAgICBOU3RyaW5nLkNvcHlUbyhzdHJPdXQsIDAsIG91dFZhbCwgMCwgc3RyT3V0Lmxlbmd0aCk7XHJcbiAgICAgICAgICBvdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHg7XHJcbiAgICAgICAgICBsZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW47XHJcbiAgICAgICAgICBzdHJPdXQgPSBudWxsO1xyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lKOlxyXG4gICAgICAgICAgaWYgKHBpYy56ZXJvRmlsbCgpICYmIGRhdGUgPT09IDAgJiYgZGF0ZV9waWNfWl9lZHQpXHJcbiAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRJZHgsIHBpYy5nZXRaZXJvUGFkKCksIDIpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDIsIFV0aWxEYXRlSnBuLmdldEluc3RhbmNlKCkuZGF0ZV9qcG5feWVhcl9vZnMoeWVhciwgZG95KSwgJzAnKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgb3V0SWR4Kys7XHJcbiAgICAgICAgICBsZW4tLTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAob3V0X2xlbiA8IG91dFZhbC5sZW5ndGgpXHJcbiAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRfbGVuLCAnICcsIG91dFZhbC5sZW5ndGggLSBvdXRfbGVuKTtcclxuXHJcbiAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMob3V0VmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCcmVhayBhIGRhdGUgaW50byBZZWFyLCBNb250aCwgRGF5IGluIG1vbnRoLCBEYXkgaW4geWVhciBhbmQgRGF5IGluIHdlZWtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXM6IERhdGVCcmVha1BhcmFtcywgZGF0ZTogbnVtYmVyLCBpZ25vcmVfZHRfZm10OiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgeWVhcjogbnVtYmVyID0gYnJlYWtQYXJhbXMueWVhcjtcclxuICAgIGxldCBtb250aDogbnVtYmVyID0gYnJlYWtQYXJhbXMubW9udGg7XHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSBicmVha1BhcmFtcy5kYXk7XHJcbiAgICBsZXQgZG95OiBudW1iZXIgPSBicmVha1BhcmFtcy5kb3k7XHJcbiAgICBsZXQgZG93OiBudW1iZXIgPSBicmVha1BhcmFtcy5kb3c7XHJcblxyXG4gICAgaWYgKGRhdGUgPD0gMCkge1xyXG4gICAgICBicmVha1BhcmFtcy5kYXkgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5kb3kgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5kb3cgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy55ZWFyID0gMDtcclxuICAgICAgYnJlYWtQYXJhbXMubW9udGggPSAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGRvdyA9IGRhdGUgJSA3ICsgMTtcclxuICAgICAgZGF0ZSA9IGRhdGUgLSAxO1xyXG4gICAgICBsZXQgY2VudDQ6IG51bWJlciA9IE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5GT1VSQ0VOVCk7XHJcbiAgICAgIGRhdGUgPSBkYXRlIC0gY2VudDQgKiBQSUNJbnRlcmZhY2UuREFZU0lORk9VUkNFTlQ7XHJcbiAgICAgIGxldCBjZW50OiBudW1iZXIgPSBNYXRoLmZsb29yKGRhdGUgLyBQSUNJbnRlcmZhY2UuREFZU0lOQ0VOVFVSWSk7XHJcbiAgICAgIGlmIChjZW50ID4gMykge1xyXG4gICAgICAgIGNlbnQgPSAzO1xyXG4gICAgICB9XHJcbiAgICAgIGRhdGUgPSBkYXRlIC0gY2VudCAqIFBJQ0ludGVyZmFjZS5EQVlTSU5DRU5UVVJZO1xyXG4gICAgICBsZXQgeWVhcjQ6IG51bWJlciA9IE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5GT1VSWUVBUik7XHJcbiAgICAgIGRhdGUgPSBkYXRlIC0geWVhcjQgKiBQSUNJbnRlcmZhY2UuREFZU0lORk9VUllFQVI7XHJcbiAgICAgIHllYXIgPSBNYXRoLmZsb29yKGRhdGUgLyBQSUNJbnRlcmZhY2UuREFZU0lOWUVBUik7XHJcbiAgICAgIGlmICh5ZWFyID4gMykge1xyXG4gICAgICAgIHllYXIgPSAzO1xyXG4gICAgICB9XHJcbiAgICAgIGRhdGUgPSBkYXRlIC0geWVhciAqIFBJQ0ludGVyZmFjZS5EQVlTSU5ZRUFSO1xyXG4gICAgICB5ZWFyID0gY2VudDQgKiA0MDAgKyBjZW50ICogMTAwICsgeWVhcjQgKiA0ICsgeWVhciArIDE7XHJcbiAgICAgIGxldCBsZWFweWVhcjogbnVtYmVyID0gMDtcclxuICAgICAgaWYgKHllYXIgJSA0ID09PSAwKSB7XHJcbiAgICAgICAgaWYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCkge1xyXG4gICAgICAgICAgbGVhcHllYXIgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFpZ25vcmVfZHRfZm10ICYmIHRoaXMuX2Vudmlyb25tZW50LkdldERhdGVNb2RlKGNvbXBJZHgpID09PSAnQicpIHtcclxuICAgICAgICB5ZWFyID0geWVhciArIFBJQ0ludGVyZmFjZS5EQVRFX0JVRERISVNUX0dBUDtcclxuICAgICAgfVxyXG4gICAgICBtb250aCA9IChNYXRoLmZsb29yKGRhdGUgLyBQSUNJbnRlcmZhY2UuREFZU0lOTU9OVEgpICsgMSk7XHJcbiAgICAgIGRheSA9IFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbbW9udGhdO1xyXG4gICAgICBpZiAobGVhcHllYXIgPiAwKSB7XHJcbiAgICAgICAgaWYgKG1vbnRoID4gMSkge1xyXG4gICAgICAgICAgZGF5ID0gZGF5ICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkYXRlID49IGRheSkge1xyXG4gICAgICAgIG1vbnRoID0gbW9udGggKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGRheSA9IFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbbW9udGggLSAxXTtcclxuICAgICAgICBpZiAobGVhcHllYXIgPiAwKSB7XHJcbiAgICAgICAgICBpZiAobW9udGggPiAyKSB7XHJcbiAgICAgICAgICAgIGRheSA9IGRheSArIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGRheSA9IGRhdGUgLSBkYXkgKyAxO1xyXG4gICAgICBkb3kgPSBkYXRlICsgMTtcclxuICAgICAgYnJlYWtQYXJhbXMueWVhciA9IHllYXI7XHJcbiAgICAgIGJyZWFrUGFyYW1zLm1vbnRoID0gbW9udGg7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRheSA9IGRheTtcclxuICAgICAgYnJlYWtQYXJhbXMuZG95ID0gZG95O1xyXG4gICAgICBicmVha1BhcmFtcy5kb3cgPSBkb3c7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGFscGhhIHN0cmluZyBmcm9tIGludCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJcIj4gICAgIHRoZSBvdXRwdXQgc3RyaW5nIChhcyBhbiBjaGFyIGFycmF5KVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyUG9zXCI+ICBzdGFydGluZyBwb3NpdGlvblxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGVuXCI+ICAgICBzdHJpbmcgbGVuZ3RoXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuXCI+ICAgICAgIHRoZSBudW1iZXIgdG8gY29udmVydFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGVhZFwiPiAgICBsZWFkaW5nIGNoYXJhY3RlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHJlc3VsdCBzdHJpbmcgbGVuZ3RoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGludF8yX2Eoc3RyOiBzdHJpbmdbXSwgc3RyUG9zOiBudW1iZXIsIGxlbjogbnVtYmVyLCBuOiBudW1iZXIsIGxlYWQ6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgbmVnOiBib29sZWFuID0gbiA8IDA7XHJcblxyXG4gICAgaWYgKGxlbiA8PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbiA9IE1hdGguYWJzKG4pO1xyXG4gICAgbGV0IHBvczogbnVtYmVyID0gbGVuO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgc3RyW3N0clBvcyArIChwb3MgPSBwb3MgLSAxKV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDQ4ICsgbiAlIDEwKTtcclxuICAgICAgbiA9IE1hdGguZmxvb3IobiAvIDEwKTtcclxuICAgIH1cclxuICAgIHdoaWxlIChwb3MgPiAwICYmIG4gPiAwKTtcclxuXHJcbiAgICBpZiAobmVnICYmIHBvcyA+IDApIHtcclxuICAgICAgc3RyW3N0clBvcyArIChwb3MgPSBwb3MgLSAxKV0gPSAnLScvKictJyovO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubGliX2FfZmlsbChzdHIsIHN0clBvcywgbGVuLCBwb3MsIGxlYWQuY2hhckNvZGVBdCgwKSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZpbGwgdGhlIGNoYXIgYXJyYXkgZm9yIHRoZSBjb252ZXJ0aW5nIG9mIGludC0+c3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clwiPiAgICAgdGhlIG91dHB1dCBzdHJpbmcgKGFzIGFuIGNoYXIgYXJyYXkpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJQb3NcIj4gIHN0YXJ0aW5nIHBvc2l0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZW5cIj4gICAgIHN0cmluZyBsZW5ndGhcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxlYWRcIj4gICAgbGVhZGluZyBjaGFyYWN0ZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZXN1bHQgc3RyaW5nIGxlbmd0aFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBsaWJfYV9maWxsKHN0cjogc3RyaW5nW10sIHN0clBvczogbnVtYmVyLCBsZW46IG51bWJlciwgcG9zOiBudW1iZXIsIGxlYWQ6IG51bWJlcik6IG51bWJlciB7XHJcblxyXG4gICAgaWYgKGxlYWQgPT09IDApIHtcclxuICAgICAgbGVuID0gbGVuIC0gcG9zO1xyXG5cclxuICAgICAgaWYgKGxlbiA+IDAgJiYgcG9zID4gMCkge1xyXG4gICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoc3RyLCBzdHJQb3MsIHN0ciwgcG9zLCBsZW4pO1xyXG4gICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoc3RyLCBzdHJQb3MgKyBsZW4sICcgJywgLyonICcqL3Bvcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAocG9zID4gMCkge1xyXG4gICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoc3RyLCBzdHJQb3MsIFN0cmluZy5mcm9tQ2hhckNvZGUobGVhZCksIHBvcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsZW47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBpbmRleCB0byBOYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGVOYW1lUGFyYW1zXCI+ICBvdXRwdXQgc3RpbmcgZGV0YWlsc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibm1cIj4gICAgICAgICAgICAgIG5hbWVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRyaW1cIj4gICAgICAgICAgICBvdXRwdXQgc3RyaW5nIHNob3VsZCBiZSB0cmltZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZ1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBkYXRlX2lfMl9ubShkYXRlTmFtZVBhcmFtczogRGF0ZU5hbWVQYXJhbXMsIG5tOiBzdHJpbmdbXSwgdHJpbTogYm9vbGVhbik6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IG46IG51bWJlciA9IHRoaXMuZGF0ZV9tc2tfY250KGRhdGVOYW1lUGFyYW1zLm91dFZhbCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4LCA8bnVtYmVyPmRhdGVOYW1lUGFyYW1zLmxlbik7XHJcbiAgICBsZXQgbDogbnVtYmVyO1xyXG4gICAgaWYgKHRyaW0pIHtcclxuICAgICAgbCA9IE1lbW9yeVV0aWwubWVtX3RyaW0obm0sIDAsIG4pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGwgPSBuO1xyXG4gICAgfVxyXG4gICAgbCA9IE1hdGgubWluKGwsIGRhdGVOYW1lUGFyYW1zLmxlbik7XHJcbiAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KGRhdGVOYW1lUGFyYW1zLm91dFZhbCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4LCBubSwgMCwgbCk7XHJcbiAgICBkYXRlTmFtZVBhcmFtcy5vdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHggKyBsO1xyXG4gICAgZGF0ZU5hbWVQYXJhbXMubGVuID0gZGF0ZU5hbWVQYXJhbXMubGVuIC0gbjtcclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gVHJpbWVkID8gSnVtcCBvdGhlciB0cmltZWQgbWFzayA6IG5vdGhpbmdcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgbiA9IG4gLSBsO1xyXG5cclxuICAgIGlmIChuID4gMCkge1xyXG4gICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KGRhdGVOYW1lUGFyYW1zLm91dFZhbCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4LCBkYXRlTmFtZVBhcmFtcy5vdXRWYWwsIGRhdGVOYW1lUGFyYW1zLm91dElkeCArIG4sIGRhdGVOYW1lUGFyYW1zLmxlbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gPG51bWJlcj5uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAvLy8gICBDb252ZXJ0IGluZGV4IHRvIE5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyT3V0XCI+ICAgICAgICAgIG91dHB1dCBzdGluZyAob3JpZ2luYWwpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRlTmFtZVBhcmFtc1wiPiAgb3V0cHV0IHN0aW5nIGRldGFpbHNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0ck5tXCI+ICAgICAgICAgICBuYW1lIHdoaWNoIHdpbGwgYmUgZW1iZWRkZWQgaW4gb3V0cHV0IHN0cmluZ1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW50T3V0TGVuXCI+ICAgICAgIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgc3RyaW5nXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiAgICAgICAgICAgICAgICAgb3V0cHV0IHN0aW5nIChwcm9jZXNzZWQpXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGRhdGVfaV8yX25tX2J5dGVtb2RlKHN0ck91dDogc3RyaW5nLCBkYXRlTmFtZVBhcmFtczogRGF0ZU5hbWVQYXJhbXMsIHN0ck5tOiBzdHJpbmcsIGludE91dExlbjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBpbnRNc2tDbnQ6IG51bWJlciA9IHRoaXMuZGF0ZV9tc2tfY250KGRhdGVOYW1lUGFyYW1zLm91dFZhbCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4LCA8bnVtYmVyPmRhdGVOYW1lUGFyYW1zLmxlbik7XHJcbiAgICBsZXQgc3RyV29yazogc3RyaW5nID0gTlN0cmluZy5Gcm9tQ2hhcnMoZGF0ZU5hbWVQYXJhbXMub3V0VmFsKTtcclxuXHJcbiAgICBzdHJXb3JrID0gc3RyV29yay5zdWJzdHIoMCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4KTtcclxuXHJcbiAgICBsZXQgaW50T2ZzOiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQihzdHJXb3JrKTtcclxuICAgIHN0ck5tID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHN0ck5tLCBpbnRNc2tDbnQpO1xyXG4gICAgc3RyT3V0ID0gVXRpbFN0ckJ5dGVNb2RlLnJlcEIoTlN0cmluZy5Gcm9tQ2hhcnMoZGF0ZU5hbWVQYXJhbXMub3V0VmFsKSwgc3RyTm0sIGludE9mcyArIDEsIGludE1za0NudCk7XHJcblxyXG4gICAgZGF0ZU5hbWVQYXJhbXMub3V0SWR4ID0gZGF0ZU5hbWVQYXJhbXMub3V0SWR4ICsgc3RyTm0ubGVuZ3RoO1xyXG4gICAgZGF0ZU5hbWVQYXJhbXMubGVuID0gZGF0ZU5hbWVQYXJhbXMubGVuIC0gaW50TXNrQ250O1xyXG4gICAgaW50T3V0TGVuID0gaW50T3V0TGVuIC0gaW50TXNrQ250O1xyXG4gICAgcmV0dXJuIHN0ck91dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gTiBvZiBjb25zZWN1dGl2ZSBNYXNrIGNoYXJhY3RlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibXNrXCI+ICAgICB0aGUgbWFzayB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibXNrUG9zXCI+ICBpbmRleCBvZiBmaXJzdCBjaGFyIHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZW5cIj4gICAgIGxlbmd0aCBvZiB0aGUgbWFza1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIE1hc2sgY2hhcmFjdGVyc1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBkYXRlX21za19jbnQobXNrOiBzdHJpbmdbXSwgbXNrUG9zOiBudW1iZXIsIGxlbjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBjOiBzdHJpbmcgPSBtc2tbbXNrUG9zKytdO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDE7XHJcbiAgICB3aGlsZSAoPG51bWJlcj5pIDwgbGVuKSB7XHJcbiAgICAgIGlmIChtc2tbbXNrUG9zXSAhPT0gYykge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIG1za1BvcyA9IG1za1BvcyArIDE7XHJcbiAgICAgIGkgPSBpICsgMTtcclxuICAgIH1cclxuICAgIHJldHVybiBpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbXB1dGUgRGF5IG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZGF0ZV8yX0REREQoZGF5OiBudW1iZXIsIG91dFZhbDogc3RyaW5nW10sIG91dElkeDogbnVtYmVyLCBsZW46IG51bWJlciwgdHJpbTogYm9vbGVhbik6IG51bWJlciB7XHJcblxyXG5cclxuICAgIGxldCByZXQ6IG51bWJlciA9IDQ7XHJcbiAgICBsZXQgZXh0OiBzdHJpbmdbXTtcclxuXHJcbiAgICBpZiAoZGF5ID4gOSkge1xyXG4gICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDIsIGRheSwgKDxudW1iZXI+MCkudG9TdHJpbmcoKSk7XHJcbiAgICAgIG91dElkeCArPSAyO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0cmltKSB7XHJcbiAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbWNweShvdXRWYWwsIG91dElkeCwgb3V0VmFsLCBvdXRJZHggKyAxLCBsZW4gLSAxKTtcclxuICAgICAgICAvKjE3LU1heS05MCovXHJcbiAgICAgICAgcmV0LS07XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gKihvdXQrKykgPSAnICc7IC8vIE9yaWdpbmFsIExpbmVcclxuICAgICAgICBvdXRWYWxbb3V0SWR4KytdID0gJyAnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMSwgZGF5LCAoPG51bWJlcj4wKS50b1N0cmluZygpKTtcclxuICAgICAgb3V0SWR4Kys7XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKGRheSkge1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgIGNhc2UgMjE6XHJcbiAgICAgIGNhc2UgMzE6XHJcbiAgICAgICAgZXh0ID0gTlN0cmluZy5Ub0NoYXJBcnJheShcInN0XCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAyOlxyXG4gICAgICBjYXNlIDIyOlxyXG4gICAgICAgIGV4dCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoXCJuZFwiKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgY2FzZSAyMzpcclxuICAgICAgICBleHQgPSBOU3RyaW5nLlRvQ2hhckFycmF5KFwicmRcIik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGV4dCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoXCJ0aFwiKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIG91dFZhbFtvdXRJZHgrK10gPSBleHRbMF07XHJcbiAgICBvdXRWYWxbb3V0SWR4XSA9IGV4dFsxXTtcclxuXHJcbiAgICByZXR1cm4gKHJldCk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIGZvciBhbiB0aW1lIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgVGhlIHNvdXJjZSBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkPC9yZXR1cm5zPlxyXG4gIGZyb21NZ1RpbWVUb05hdGl2ZVRpbWUoZGF0YVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IERhdGUge1xyXG4gICAgbGV0IG1hc2s6IHN0cmluZyA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICBsZXQgbWFza1NpemU6IG51bWJlciA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG4gICAgbGV0IHRpbWU6IG51bWJlciA9IG5ldyBOVU1fVFlQRShkYXRhU3RyKS5OVU1fMl9VTE9ORygpO1xyXG5cclxuXHJcbiAgICAgIGxldCBicmVha1BhcmFtczogVGltZUJyZWFrUGFyYW1zID0gbmV3IFRpbWVCcmVha1BhcmFtcygpO1xyXG5cclxuICAgICAgRGlzcGxheUNvbnZlcnRvci50aW1lX2JyZWFrKGJyZWFrUGFyYW1zLCB0aW1lKTtcclxuXHJcbiAgICAgIGxldCBuYXRpdmVEdDogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICBuYXRpdmVEdC5zZXRIb3VycyhicmVha1BhcmFtcy5ob3VyKTtcclxuICAgICAgbmF0aXZlRHQuc2V0TWludXRlcyhicmVha1BhcmFtcy5taW51dGUpO1xyXG4gICAgICBuYXRpdmVEdC5zZXRTZWNvbmRzKGJyZWFrUGFyYW1zLnNlY29uZCk7XHJcbiAgICAgIHJldHVybiBuYXRpdmVEdDtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSB0aW1lIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkFzY2lpU3RyXCI+ICAgICAgICBUaGUgbWFzayB0byBiZSB1c2VkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkFzY2lpTFwiPiAgICAgICAgICBNYXNrIGxlbmd0aDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gICAgICAgICAgICAgVGhlIHBpY3VyZSBpbmZvcm1hdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0aW1lX3BpY19aX2VkdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZWNvbmRzXCI+LyBtaWxsaVNlY29uZHMgZmxhZzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSB0aW1lXzJfYV9waWMoQXNjaWlTdHI6IHN0cmluZywgQXNjaWlMOiBudW1iZXIsIHRpbWU6IG51bWJlciwgcGljOiBQSUMsIHRpbWVfcGljX1pfZWR0OiBib29sZWFuLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG5cclxuICAgIC8vIE9yaWdpbmFsIHZhcnNcclxuICAgIGxldCBob3VyOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IG1pbnV0ZTogbnVtYmVyID0gMDtcclxuICAgIGxldCBzZWNvbmQ6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWlsbGlzZWM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgbGV0IEFzY2lpOiBzdHJpbmdbXSA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoQXNjaWlTdHIpO1xyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBUaW1lQnJlYWtQYXJhbXMgPSBuZXcgVGltZUJyZWFrUGFyYW1zKGhvdXIsIG1pbnV0ZSwgc2Vjb25kKTtcclxuICAgIGxldCB0aW1lU2VjOiBudW1iZXI7XHJcbiAgICBpZiAobWlsbGlTZWNvbmRzKSB7XHJcbiAgICAgIHRpbWVTZWMgPSBNYXRoLmZsb29yKHRpbWUgLyAxMDAwKTtcclxuICAgICAgbWlsbGlzZWMgPSB0aW1lIC0gdGltZVNlYyAqIDEwMDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGltZVNlYyA9IHRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgRGlzcGxheUNvbnZlcnRvci50aW1lX2JyZWFrKGJyZWFrUGFyYW1zLCB0aW1lU2VjKTtcclxuICAgIGhvdXIgPSBicmVha1BhcmFtcy5ob3VyO1xyXG4gICAgbWludXRlID0gYnJlYWtQYXJhbXMubWludXRlO1xyXG4gICAgc2Vjb25kID0gYnJlYWtQYXJhbXMuc2Vjb25kO1xyXG5cclxuICAgIC8vIElmIGFzY2lpIHJlcHJlc2VudGF0aW9uIG92ZXJmbG93cyBvdXRwdXQgYnVmZmVyXHJcbiAgICAvLyBmaWxsIHdpdGggJyonIGFuZCBiYWlsIG91dFxyXG5cclxuICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgIGlmIChwaWMuZ2V0TWFza1NpemUoKSA+IEFzY2lpTCkge1xyXG4gICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KEFzY2lpLCAwLCAnKicsIC8qJyonKi9Bc2NpaUwpO1xyXG4gICAgICByZXN1bHQgPSBOU3RyaW5nLkZyb21DaGFycyhBc2NpaSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHBpYy56ZXJvRmlsbCgpKSB7XHJcbiAgICAgICAgaWYgKHRpbWVTZWMgPT09IDAgJiYgKCFtaWxsaVNlY29uZHMgfHwgbWlsbGlzZWMgPT09IDApKSB7XHJcbiAgICAgICAgICBpZiAodGltZV9waWNfWl9lZHQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW50eDogbnVtYmVyID0gMDsgaW50eCA8IHBpYy5nZXRNYXNrU2l6ZSgpOyBpbnR4ID0gaW50eCArIDEpIHtcclxuICAgICAgICAgICAgICBpZiAoQXNjaWlbaW50eF0gPD0gJ1xcdTAwMWYnKSB7XHJcbiAgICAgICAgICAgICAgICBBc2NpaVtpbnR4XSA9IHBpYy5nZXRaZXJvUGFkKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IE5TdHJpbmcuRnJvbUNoYXJzKEFzY2lpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoQXNjaWksIDAsIHBpYy5nZXRaZXJvUGFkKCksIHBpYy5nZXRNYXNrU2l6ZSgpKTtcclxuICAgICAgICAgIHJlc3VsdCA9IE5TdHJpbmcuRnJvbUNoYXJzKEFzY2lpKTtcclxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBJOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgYW06IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBsZW46IG51bWJlciA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG4gICAgICBsZXQgSG91ckk6IG51bWJlciA9IC0xO1xyXG5cclxuICAgICAgd2hpbGUgKEkgPCBsZW4pIHtcclxuICAgICAgICBzd2l0Y2ggKEFzY2lpW0ldLmNoYXJDb2RlQXQoMCkpIHtcclxuICAgICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSEgpOlxyXG4gICAgICAgICAgICBIb3VySSA9IEk7XHJcbiAgICAgICAgICAgIEkgKz0gMjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfTU1UKTpcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKEFzY2lpLCBJLCAyLCBtaW51dGUsICcwJyk7XHJcbiAgICAgICAgICAgIEkgKz0gMjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19TUyk6XHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShBc2NpaSwgSSwgMiwgc2Vjb25kLCAnMCcpO1xyXG4gICAgICAgICAgICBJICs9IDI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfTVMpOlxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2EoQXNjaWksIEksIDMsIG1pbGxpc2VjLCAnMCcpO1xyXG4gICAgICAgICAgICBJICs9IDM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfUE0pOlxyXG4gICAgICAgICAgICBhbSA9IDE7XHJcbiAgICAgICAgICAgIGxldCB0bXBIb3VyOiBudW1iZXIgPSBob3VyICUgMjQ7XHJcbiAgICAgICAgICAgIGlmICh0bXBIb3VyIDwgMTIgfHwgdG1wSG91ciA9PT0gMClcclxuICAgICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KEFzY2lpLCBJLCBOU3RyaW5nLlRvQ2hhckFycmF5KFwiYW1cIiksIDAsIDIpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbWNweShBc2NpaSwgSSwgTlN0cmluZy5Ub0NoYXJBcnJheShcInBtXCIpLCAwLCAyKTtcclxuICAgICAgICAgICAgSSArPSAyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBJKys7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoSG91ckkgPj0gMCkge1xyXG4gICAgICAgIGlmIChhbSA+IDApIHtcclxuICAgICAgICAgIGhvdXIgPSBob3VyICUgMjQ7XHJcbiAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xyXG4gICAgICAgICAgICBob3VyID0gMTI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaG91ciA9IGhvdXIgJSAxMjtcclxuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDApIHtcclxuICAgICAgICAgICAgICBob3VyID0gMTI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbnRfMl9hKEFzY2lpLCBIb3VySSwgMiwgaG91ciwgKGFtICE9PSAwICYmIGhvdXIgPCAxMCkgPyAnICcgOiAvKicgJyovJzAnLyonMCcqLyk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0ID0gTlN0cmluZy5Gcm9tQ2hhcnMoQXNjaWkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCcmVhayB0aW1lIGludG8gaXRzIGNvbXBvbmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyB0aW1lX2JyZWFrKGJyZWFrUGFyYW1zOiBUaW1lQnJlYWtQYXJhbXMsIHRpbWU6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aW1lIDw9IDApIHtcclxuICAgICAgYnJlYWtQYXJhbXMuc2Vjb25kID0gMDtcclxuICAgICAgYnJlYWtQYXJhbXMubWludXRlID0gMDtcclxuICAgICAgYnJlYWtQYXJhbXMuaG91ciA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgYnJlYWtQYXJhbXMuaG91ciA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xyXG4gICAgICB0aW1lID0gdGltZSAtIGJyZWFrUGFyYW1zLmhvdXIgKiAzNjAwO1xyXG4gICAgICBicmVha1BhcmFtcy5taW51dGUgPSBNYXRoLmZsb29yKHRpbWUgLyA2MCk7XHJcbiAgICAgIGJyZWFrUGFyYW1zLnNlY29uZCA9IHRpbWUgLSBicmVha1BhcmFtcy5taW51dGUgKiA2MDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIGZvciBhIGxvZ2ljYWwgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBcIjBcIiBmb3IgZmFsc2Ugb3IgXCIxXCIgZm9yIHRydWVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPiAgVGhlIHJhbmdlIG9mIHZhbHVlcyB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZnJvbUxvZ2ljYWwoZGF0YVN0cjogc3RyaW5nLCBwaWM6IFBJQywgcmFuZ2VTdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IFN0cjogc3RyaW5nW10gPSBOU3RyaW5nLlRvQ2hhckFycmF5KHBpYy5nZXRNYXNrKCkpO1xyXG5cclxuICAgIC8vIElmIHBpY3R1cmUgb3ZlcmZsb3dzIHN0cmluZywgcmVzZXQgd2l0aCAnKidcclxuICAgIGlmIChwaWMuZ2V0TWFza1NpemUoKSA+IFN0ci5sZW5ndGgpIHtcclxuICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChTdHIsIDAsICcqJywgLyonKicqL1N0ci5sZW5ndGgpO1xyXG4gICAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMoU3RyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgICAgLy8gQ3JhY2sgcmFuZ2UgYW5kIGNvcHkgdGhlIGRhdGFcclxuXHJcbiAgICAgIGxldCBhcnJheTI6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oNTApO1xyXG4gICAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IGFycmF5Mi5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICAgIGFycmF5MltfYWldID0gKDApLnRvU3RyaW5nKCk7XHJcbiAgICAgIHRoaXMud2luX3JuZ19ib29sX3N1YihhcnJheTIsIGFycmF5Mi5sZW5ndGgsIGRhdGFTdHIuY2hhckF0KDApID09PSAnMScvKicxJyovLCByYW5nZVN0cik7XHJcbiAgICAgIGxldCBsZW46IG51bWJlciA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG5cclxuICAgICAgLy8gT3JpZ2luYWwgQ29kZSAtIG5vdCByZWxldmFudCBpbiBqYXZhIGJlY2F1c2UgdGhlIHJlc3VsdCBpcyBhbGx3YXlzIHRoZSBtYXNrIGxlblxyXG4gICAgICAvLyBpZiAobGVuIDwgU3RyTGVuKVxyXG4gICAgICAvLyBjaGFyX21lbXNldCAoU3RyLCBsZW4sICcgJywgU3RyTGVuIC0gbGVuKTtcclxuICAgICAgbGV0IHJlc1N0cjogc3RyaW5nID0gdGhpcy53aW5fZGF0YV9jcHkoU3RyLCBsZW4sIGFycmF5MiwgcGljLmlzQXR0ckFscGhhKCkpO1xyXG4gICAgICByZXR1cm4gcmVzU3RyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGEgbG9naWNhbCB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFwiMFwiIGZvciBmYWxzZSBvciBcIjFcIiBmb3IgdHJ1ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhblxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmcm9tTWdMb2dpY2FsVG9OYXRpdmVMb2dpY2FsKGRhdGFTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBuYXRpdmVWYWw6IGJvb2xlYW47XHJcbiAgICBuYXRpdmVWYWwgPSAoZGF0YVN0ci5jaGFyQXQoMCkgPT09ICcxJykgPyB0cnVlIDogZmFsc2U7XHJcbiAgICByZXR1cm4gbmF0aXZlVmFsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIG1nIHN0cmluZyBmb3IgYSBsb2dpY2FsIHZhbHVlIGFjY29yZGluZyB0byB0aGUgYm9vbGVhbiB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsXCI+ICBib29sZWFuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdHJpbmdcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZnJvbU5hdGl2ZUxvZ2ljYWxUb01nTG9naWNhbChkaXNwVmFsOiBib29sZWFuKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZztcclxuICAgIG1nVmFsID0gKGRpc3BWYWwgPT09IHRydWUpID8gXCIxXCIgOiBcIjBcIjtcclxuXHJcbiAgICByZXR1cm4gbWdWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IGEgYm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSByYW5nZSBzcGVjaWZpZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiU3ViXCI+ICAgICAgdGhlIHJlc3VsdCBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiU3ViU2l6XCI+ICAgdGhlIHJlc3VsdCBzdHJpbmcgbGVuZ3RoPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkJvb2xWYWxcIj4gICcxJyBpZiB0cnVlIG9yICcwJyBpZiBmYWxzZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJybmdcIj4gICAgICByYW5nZSBvZiB2YWx1ZXM8L3BhcmFtPlxyXG4gIHByaXZhdGUgd2luX3JuZ19ib29sX3N1YihTdWI6IHN0cmluZ1tdLCBTdWJTaXo6IG51bWJlciwgQm9vbFZhbDogYm9vbGVhbiwgcm5nOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgY3JrOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KFBJQ0ludGVyZmFjZS5EQl9TVFJfTUFYICsgMik7XHJcbiAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IGNyay5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICBjcmtbX2FpXSA9ICgwKS50b1N0cmluZygpO1xyXG5cclxuICAgIGxldCBnYXA6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oUElDSW50ZXJmYWNlLkRCX1NUUl9NQVggKyAyKTtcclxuICAgIGZvciAobGV0IF9haTogbnVtYmVyID0gMDsgX2FpIDwgZ2FwLmxlbmd0aDsgKytfYWkpXHJcbiAgICAgIGdhcFtfYWldID0gKDApLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHJhbmdlIGlmIG5vbmUgaXMgc3BlY2lmaWVkXHJcbiAgICBybmcgPSB0aGlzLndpbl9ybmdfYm9vbChybmcpO1xyXG5cclxuICAgIC8vIENyYWNrIHJhbmdlIGFuZCBjaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgYXMgVHJ1ZSB2YWx1ZVxyXG4gICAgLy8gb3IgdGhlIHNlY29uZCBlbGVtZW50IGFzIHRoZSBGYWxzZSB2YWx1ZS5cclxuICAgIHRoaXMud2luX3JuZ19jcmsoY3JrLCBnYXAsIHJuZyk7XHJcbiAgICBsZXQgczogbnVtYmVyO1xyXG4gICAgaWYgKEJvb2xWYWwpIHtcclxuICAgICAgcyA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgd2hpbGUgKGNya1tpXSA+ICdcXDAnLyonXHUwMDAwJyovKSB7XHJcbiAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIHMgPSBpICsgMTtcclxuICAgIH1cclxuICAgIGxldCBsZW46IG51bWJlciA9IHM7XHJcbiAgICB3aGlsZSAoY3JrW2xlbl0gPiAnXFwwJy8qJ1x1MDAwMCcqLykge1xyXG4gICAgICBsZW4gPSBsZW4gKyAxO1xyXG4gICAgfVxyXG4gICAgbGVuID0gbGVuIC0gcztcclxuICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoU3ViLCAwLCBjcmssIHMsIE1hdGgubWluKGxlbiwgU3ViU2l6KSk7XHJcbiAgICBpZiAobGVuIDwgU3ViU2l6KSB7XHJcbiAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoU3ViLCBsZW4sICcgJywgLyonICcqL1N1YlNpeiAtIGxlbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBkZWZhdWx0IHJhbmdlIGZvciBsb2dpY2FsIHZhbHVlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJybmdcIj4gIGN1cnJlbnQgcmFuZ2U8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGRlZmF1bHQgcmFuZ2UgaWYgdGhlIGlucHV0IHJhbmdlIGlzIGVtcHR5PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgd2luX3JuZ19ib29sKHJuZzogc3RyaW5nKTogc3RyaW5nIHtcclxuXHJcbiAgICBpZiAocm5nID09PSBudWxsIHx8IHJuZy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcm5nID0gXCJUcnVlLCBGYWxzZVwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJuZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDcmFjayBhICdyYW5nZScgc3RyaW5nIGludG8gaXRzIGNvbXBvbmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgd2luX3JuZ19jcmsoY3JrOiBzdHJpbmdbXSwgZ2FwOiBzdHJpbmdbXSwgcmFuZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHJuZ0xlbjogbnVtYmVyID0gcmFuZ2UubGVuZ3RoO1xyXG4gICAgbGV0IHJuZzogc3RyaW5nW10gPSBOU3RyaW5nLlRvQ2hhckFycmF5KHJhbmdlKTtcclxuICAgIGxldCBjcmtQb3M6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgcm5nUG9zOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGdhcFBvczogbnVtYmVyID0gMDtcclxuXHJcbiAgICB3aGlsZSAocm5nUG9zIDwgcm5nTGVuKSB7XHJcbiAgICAgIGlmIChybmdbcm5nUG9zXSA9PT0gJywnIHx8IHJuZ1tybmdQb3NdID09PSAnLScpIHtcclxuICAgICAgICBnYXBbZ2FwUG9zKytdID0gcm5nW3JuZ1BvcysrXTtcclxuICAgICAgICBjcmtbY3JrUG9zKytdID0gJ1xcMCc7XHJcblxyXG4gICAgICAgIGlmIChybmdQb3MgPCBybmdMZW4pIHtcclxuICAgICAgICAgIHdoaWxlIChybmdbcm5nUG9zXSA9PT0gJyAnKSB7XHJcbiAgICAgICAgICAgIHJuZ1BvcyA9IHJuZ1BvcyArIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIDA1LzEwLzk1IC0gTXIuIFRha2FkYSA6XHJcbiAgICAgICAgLy8gSmFwYW5lc2UgY2hhciBtYXkgaGF2ZSAnXFwnIGNvZGUgb2YgaXRzIHNlY29uZCBieXRlLlxyXG4gICAgICAgIC8vIHN0cl9jaHJfMV9ieXQgbmVlZHMgbWdsb2NhbC5oLlxyXG4gICAgICAgIC8vIGFjY29yZGluZyB0byBNci4gTWFydW9rYTpcclxuICAgICAgICBpZiAocm5nW3JuZ1Bvc10gPT09ICdcXFxcJykge1xyXG4gICAgICAgICAgcm5nUG9zID0gcm5nUG9zICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY3JrW2Nya1Bvc10gPSBybmdbcm5nUG9zKytdO1xyXG4gICAgICAgIGNya1BvcyA9IGNya1BvcyArIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBKUE46IDAxLzExLzk1IFlhbWEqL1xyXG4gICAgLy8gVXBwZXIgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gc3RyLmMgYW5kXHJcbiAgICAvLyBpdCBpcyBhbHNvIG92ZXJyaWRlZCBieSBtZ2xvY2FsIGZ1bmN0aW9uLlxyXG4gICAgLy8gU28gTUFHSUMgbmVlZHMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uXHJcbiAgICAvLyBpbnN0ZWFkIG9mIENTVF9oZHIudXBwcl90YWJbXS5cclxuXHJcbiAgICAvLyBpZiAodXApXHJcbiAgICAvLyBcdHN0cl91cHBlciAob3JnX2NyaywgKGxvbmcpKGNyay1vcmdfY3JrKSk7XHJcblxyXG5cclxuICAgIGdhcFtnYXBQb3NdID0gJ1xcMCc7XHJcbiAgICBjcmtbY3JrUG9zKytdID0gJ1xcMCc7XHJcbiAgICBjcmtbY3JrUG9zXSA9ICdcXDAnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBNZXRob2RzIGZvciBjb3ZlcnRpbmcgRElQTEFZIC0tLT4gSU5URVJOQUxcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJhbnNsYXRlcyBhIHN0cmluZyBudW1iZXIgdG8gbWFnaWMgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPiAgIEEgc3RyaW5nIG51bWJlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgICBUaGUgcGljdHVyZSB0byB1c2U8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIG1hZ2ljIG51bWJlcjwvcmV0dXJucz5cclxuICB0b051bShkaXNwVmFsdWU6IHN0cmluZywgcGljOiBQSUMsIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKGRpc3BWYWx1ZSwgcGljLCBjb21wSWR4KTtcclxuICAgIHJldHVybiBtZ051bS50b1hNTHJlY29yZCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZHMgdGhlIGRhdGUgbWFnaWMgbnVtYmVyIGZyb20gdGhlIHN0cmluZyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJcIj4gICAgICAgICAgICB0aGUgZGF0ZSBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyX2xlblwiPiAgICAgICAgbGVuZ3RoIG9mIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gICAgICAgICAgICB0aGUgcGljdHVyZSBpbmZvPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1hc2tcIj4gICAgICAgICAgIHRoZSBtYXNrIG9mIHRoZSBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlX2R0X2ZtdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbWFnaWMgbnVtYmVyPC9yZXR1cm5zPlxyXG4gIGFfMl9kYXRlX3BpY19kYXRlbW9kZShzdHI6IHN0cmluZ1tdLCBzdHJfbGVuOiBudW1iZXIsIHBpYzogUElDLCBtYXNrOiBzdHJpbmdbXSwgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBwb3M6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgeWVhcl9pbl9waWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBtb250aF9pbl9waWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBkYXlfaW5fcGljOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaW5wOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgYlllYXJJc1plcm86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlcmFfeWVhcjogbnVtYmVyID0gMDtcclxuICAgIGxldCBpbnRSZWY6IEludFJlZiA9IG5ldyBJbnRSZWYoMCk7XHJcbiAgICBsZXQgaW50UGljSWR4T2ZzOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IG1pbGxlbml1bTogbnVtYmVyID0gMDtcclxuICAgIGxldCBkYXRlUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXM7XHJcblxyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gTWF0aC5taW4oc3RyLmxlbmd0aCwgcGljLmdldE1hc2tTaXplKCkpO1xyXG5cclxuICAgIGlmIChzdHIubGVuZ3RoIDwgbWFzay5sZW5ndGgpXHJcbiAgICAgIHN0ci5sZW5ndGggPSBtYXNrLmxlbmd0aDtcclxuXHJcbiAgICBsZXQgeWVhcjogbnVtYmVyID0gMDtcclxuICAgIGxldCBtb250aDogbnVtYmVyID0gMTtcclxuICAgIGxldCBkYXk6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgZG95OiBudW1iZXIgPSAxO1xyXG4gICAgbGV0IHVzZWRveTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyX2xlbjsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGlmIChzdHJbaV0gIT09ICcwJyAmJiBzdHJbaV0gIT09ICcgJykge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGkgPT09IHN0cl9sZW4pXHJcbiAgICAgIHJldHVybiAwO1xyXG5cclxuICAgIHdoaWxlIChwb3MgPCBzdHJfbGVuICYmIHBvcyArIGludFBpY0lkeE9mcyA8IGxlbikge1xyXG5cclxuICAgICAgc3dpdGNoIChtYXNrW3BvcyArIGludFBpY0lkeE9mc10uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWTpcclxuICAgICAgICAgIHllYXJfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICB5ZWFyID0gdGhpcy5kYXRlX2FfMl9pKHN0ciwgMiwgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSAyO1xyXG4gICAgICAgICAgLy8gSGVuIDE2LzExLzk3IDogRml4ICM3Njg0NDJcclxuICAgICAgICAgIGlmICh5ZWFyID09PSAwKVxyXG4gICAgICAgICAgICBiWWVhcklzWmVybyA9IHRydWU7XHJcbiAgICAgICAgICBsZXQgY2VudHVyeV95ZWFyOiBudW1iZXIgPSB0aGlzLl9lbnZpcm9ubWVudC5HZXRDZW50dXJ5KGNvbXBJZHgpICUgMTAwOyAvLyBERUZfY2VudHVyeVxyXG4gICAgICAgICAgaWYgKHllYXIgPCBjZW50dXJ5X3llYXIpXHJcbiAgICAgICAgICAgIHllYXIgKz0gMTAwO1xyXG4gICAgICAgICAgeWVhciArPSB0aGlzLl9lbnZpcm9ubWVudC5HZXRDZW50dXJ5KGNvbXBJZHgpIC0gY2VudHVyeV95ZWFyOyAvLyBERUZfY2VudHVyeVxyXG4gICAgICAgICAgaWYgKHRoaXMuX2Vudmlyb25tZW50LkdldERhdGVNb2RlKGNvbXBJZHgpID09PSAnQicpXHJcbiAgICAgICAgICAvLyBERUZfZGF0ZV9tb2RlXHJcbiAgICAgICAgICAgIHllYXIgLT0gUElDSW50ZXJmYWNlLkRBVEVfQlVEREhJU1RfR0FQO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1lZWVkpOlxyXG4gICAgICAgICAgeWVhcl9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIGxldCBZZWFyRGlnaXRzTm86IG51bWJlcjtcclxuICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSA0IHllYXIgZGlnaXQuIElmIG5vdCwgYWRqdXN0IGl0XHJcbiAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlICdjZW50dXJ5IHllYXInXHJcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgICBmb3IgKFllYXJEaWdpdHNObyA9IDA7IFllYXJEaWdpdHNObyA8IDQgJiYgcG9zICsgWWVhckRpZ2l0c05vIDwgc3RyLmxlbmd0aCAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChzdHJbcG9zICsgWWVhckRpZ2l0c05vXSk7IFllYXJEaWdpdHNObysrKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaSA9IFllYXJEaWdpdHNObztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBwb3MgKyBpIDwgc3RyLmxlbmd0aCAmJiBzdHJbcG9zICsgaV0gIT09IHRoaXMuREFURUNIQVIudG9TdHJpbmcoKSAmJiBpIDwgNDsgaSsrKSB7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAoWWVhckRpZ2l0c05vID0gMDtcclxuICAgICAgICAgICAgICAgICBwb3MgKyBZZWFyRGlnaXRzTm8gPCBzdHIubGVuZ3RoICYmIFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltwb3MgKyBZZWFyRGlnaXRzTm9dKSAmJlxyXG4gICAgICAgICAgICAgICAgIFllYXJEaWdpdHNObyA8IDQ7XHJcbiAgICAgICAgICAgICAgICAgWWVhckRpZ2l0c05vKyspIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgICAgICAgaWYgKGkgPCA0ICYmIHN0ci5sZW5ndGggPCBtYXNrLmxlbmd0aClcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgNCAtIGksIHN0ci5sZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpIDwgNCAmJiBsZW4gPCBtYXNrLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIHRoaXMubW92ZV9kYXRlKHN0ciwgcG9zLCA0IC0gaSwgbGVuKTtcclxuICAgICAgICAgICAgICBsZW4gPSBsZW4gKyA0IC0gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHllYXIgPSB0aGlzLmRhdGVfYV8yX2koc3RyLCA0LCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDQ7XHJcblxyXG4gICAgICAgICAgLy8gSGVuIDE2LzExLzk3IDogRml4ICM3Njg0NDJcclxuICAgICAgICAgIGlmICh5ZWFyID09PSAwKVxyXG4gICAgICAgICAgICBiWWVhcklzWmVybyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgaWYgKFllYXJEaWdpdHNObyA8PSAyKSB7XHJcbiAgICAgICAgICAgIGNlbnR1cnlfeWVhciA9IHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkoY29tcElkeCkgJSAxMDA7IC8vIERFRl9jZW50dXJ5XHJcbiAgICAgICAgICAgIGlmICh5ZWFyIDwgY2VudHVyeV95ZWFyKVxyXG4gICAgICAgICAgICAgIHllYXIgKz0gMTAwO1xyXG4gICAgICAgICAgICB5ZWFyICs9IHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkoY29tcElkeCkgLSBjZW50dXJ5X3llYXI7IC8vIERFRl9jZW50dXJ5XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX2Vudmlyb25tZW50LkdldERhdGVNb2RlKGNvbXBJZHgpID09PSAnQicpXHJcbiAgICAgICAgICAvLyBERUZfZGF0ZV9tb2RlXHJcbiAgICAgICAgICAgIHllYXIgLT0gUElDSW50ZXJmYWNlLkRBVEVfQlVEREhJU1RfR0FQO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSFlZWVlZOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIGxldCBxdW90ZXM6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICBpZiAobGVuID4gcG9zICsgNSAmJiBtYXNrW3BvcyArIDVdLmNoYXJDb2RlQXQoMCkgPT09IChQSUNJbnRlcmZhY2UuUElDX0hZWVlZWSkpXHJcbiAgICAgICAgICAgIHF1b3RlcyA9IDE7XHJcbiAgICAgICAgICB5ZWFyID0gSGVicmV3RGF0ZS5kYXRlaGViX2hfMl9pKHN0ciwgNSArIHF1b3RlcywgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSA1ICsgcXVvdGVzO1xyXG4gICAgICAgICAgaWYgKHllYXIgPT09IDApXHJcbiAgICAgICAgICAgIGJZZWFySXNaZXJvID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSEw6XHJcbiAgICAgICAgICBpbnRQaWNJZHhPZnMgPSBIZWJyZXdEYXRlLmRhdGVoZWJfaF8yX2koc3RyLCAxLCBwb3MpO1xyXG4gICAgICAgICAgcG9zKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hERDpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBxdW90ZXMgPSAwO1xyXG4gICAgICAgICAgaWYgKGxlbiA+IHBvcyArIDIgJiYgbWFza1twb3MgKyAyXS5jaGFyQ29kZUF0KDApID09PSBQSUNJbnRlcmZhY2UuUElDX0hERClcclxuICAgICAgICAgICAgcXVvdGVzID0gMTtcclxuICAgICAgICAgIGRheSA9IEhlYnJld0RhdGUuZGF0ZWhlYl9oXzJfaShzdHIsIDIgKyBxdW90ZXMsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMiArIHF1b3RlcztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTU1EOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIG1vbnRoX2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpKSB7XHJcbiAgICAgICAgICAgIGlmICgoc3RyLmxlbmd0aCA9PT0gcG9zICsgMSB8fCBzdHJbcG9zICsgMV0uY2hhckNvZGVBdCgwKSA9PT0gdGhpcy5EQVRFQ0hBUiB8fCAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoc3RyW3BvcyArIDFdKSkgJiYgc3RyLmxlbmd0aCA8IG1hc2subGVuZ3RoKVxyXG4gICAgICAgICAgICAgIHRoaXMubW92ZV9kYXRlKHN0ciwgcG9zLCAxLCBzdHIubGVuZ3RoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoc3RyW3BvcyArIDFdLmNoYXJDb2RlQXQoMCkgPT09IHRoaXMuREFURUNIQVIgJiYgbGVuIDwgbWFzay5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgMSwgbGVuKTtcclxuICAgICAgICAgICAgICBsZW4gKz0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbW9udGggPSB0aGlzLmRhdGVfYV8yX2koc3RyLCAyLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19NTU06XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgbW9udGhfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGludFJlZi52YWwgPSBwb3M7XHJcbiAgICAgICAgICBtb250aCA9IHRoaXMuZGF0ZV9NTU1fMl9tKHN0ciwgbWFzaywgaW50UmVmLCBsZW4sIHBpYy5pc0hlYnJldygpKTtcclxuICAgICAgICAgIHBvcyA9IGludFJlZi52YWw7XHJcbiAgICAgICAgICBpZiAocGljLmlzSGVicmV3KCkgJiYgbW9udGggPT09IDE0KVxyXG4gICAgICAgICAgICBtb250aCA9IDY7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfREQpOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIGRheV9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgICBpZiAoKHN0ci5sZW5ndGggPT09IHBvcyArIDEgfHwgc3RyW3BvcyArIDFdLmNoYXJDb2RlQXQoMCkgPT09IHRoaXMuREFURUNIQVIgfHwgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltwb3MgKyAxXSkpICYmIHN0ci5sZW5ndGggPCBtYXNrLmxlbmd0aClcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgMSwgc3RyLmxlbmd0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHN0cltwb3MgKyAxXS5jaGFyQ29kZUF0KDApID09PSB0aGlzLkRBVEVDSEFSICYmIGxlbiA8IG1hc2subGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDEsIGxlbik7XHJcbiAgICAgICAgICAgICAgbGVuICs9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRheSA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDIsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19EREQpOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIHVzZWRveSA9IHRydWU7XHJcbiAgICAgICAgICBkYXlfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGRveSA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDMsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19EREREKTpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBkYXlfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGRheSA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDIsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMiArIDI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfWUopOiAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICB5ZWFyX2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgICBpZiAoKHN0ci5sZW5ndGggPT09IHBvcyArIDEgfHwgc3RyW3BvcyArIDFdLmNoYXJDb2RlQXQoMCkgPT09IHRoaXMuREFURUNIQVIgfHwgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltwb3MgKyAxXSkpICYmIHN0ci5sZW5ndGggPCBtYXNrLmxlbmd0aClcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgMSwgc3RyLmxlbmd0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB5ZWFyID0gdGhpcy5kYXRlX2FfMl9pKHN0ciwgMiwgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSAyO1xyXG5cclxuICAgICAgICAgIGxldCBzdHIxOiBzdHJpbmcgPSBOU3RyaW5nLkZyb21DaGFycyhzdHIpO1xyXG4gICAgICAgICAgZXJhX3llYXIgPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmdldFN0YXJ0WWVhck9mRXJhKHN0cjEsIHBpYy5nZXRNYXNrKCkpO1xyXG5cclxuICAgICAgICAgIGlmIChlcmFfeWVhciA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB5ZWFyICs9IGVyYV95ZWFyIC0gMTtcclxuXHJcbiAgICAgICAgICBpZiAoeWVhciA9PT0gMClcclxuICAgICAgICAgICAgYlllYXJJc1plcm8gPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgICAgICAgLy8gaWYgXCJzdHJbcG9zXVwiIGNvbnRhaW5zIERCQ1MsIHRoZSBuZXh0IGluZGV4IG9mIFwibWFza1wiIGhhcyB0byBiZSBza2lwcGVkLlxyXG4gICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHN0cltwb3NdKSA9PT0gZmFsc2UgJiZcclxuICAgICAgICAgICAgICBVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgobWFza1twb3MgKyBpbnRQaWNJZHhPZnNdKSlcclxuICAgICAgICAgICAgICBpbnRQaWNJZHhPZnMrKztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwb3MgKz0gMTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJZZWFySXNaZXJvKSB7XHJcbiAgICAgIGlmICghbW9udGhfaW5fcGljKVxyXG4gICAgICAgIG1vbnRoID0gMDtcclxuICAgICAgaWYgKCFkYXlfaW5fcGljICYmIG1vbnRoID09PSAwKVxyXG4gICAgICAgIGRheSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGVuIDE2LzExLzk3IDogRml4ICM3Njg0NDJcclxuICAgIC8vIFplcm8gZGF0ZSBpcyB2YWxpZCBhbmQgc2hvdWxkIHJldHVybiAwTC4gVGhpcyBjaGVjayBtdXN0IGJlIGhlcmVcclxuICAgIC8vIGJlY2F1c2UgdGhlIHllYXIgdmFsdWUgbWF5IGJlIGNoYW5nZWQgYmVjYXVzZSBvZiBjZW50dXJ5IHllYXIuXHJcbiAgICBpZiAoZGF5ID09PSAwICYmIG1vbnRoID09PSAwICYmIChiWWVhcklzWmVybyB8fCB5ZWFyID09PSAwKSlcclxuICAgICAgcmV0dXJuICgwKTtcclxuXHJcbiAgICBpZiAoIWlucClcclxuICAgICAgcmV0dXJuICgwKTtcclxuXHJcbiAgICAvLyBIZWJyZXcgWWVhclxyXG4gICAgaWYgKHBpYy5pc0hlYnJldygpKSB7XHJcbiAgICAgIGlmICh5ZWFyID4gMCkge1xyXG4gICAgICAgIGlmIChtaWxsZW5pdW0gPT09IDApXHJcbiAgICAgICAgICBtaWxsZW5pdW0gPSA1O1xyXG4gICAgICAgIHllYXIgKz0gbWlsbGVuaXVtICogMTAwMDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKEhlYnJld0RhdGUuZGF0ZWhlYl8yX2QoeWVhciwgbW9udGgsIGRheSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoZSBuZXh0IDIgbGluZXMgc3VwcG9ydCA0Lnh4IEREL01NIHBpY3R1cmVzXHJcbiAgICBpZiAoKHllYXIgPT09IDApICYmICF5ZWFyX2luX3BpYykge1xyXG4gICAgICBkYXRlUGFyYW1zID0gdGhpcy5kYXRlX3N5cygpO1xyXG4gICAgICB5ZWFyID0gZGF0ZVBhcmFtcy55ZWFyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICh0aGlzLmRhdGVfNF9jYWxlbmRlcih5ZWFyLCBtb250aCwgZGF5LCBkb3ksIHVzZWRveSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIERlY29kZSBkaWdpdHMgZnJvbSBhIGRhdGUgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGRhdGVfYV8yX2koczogc3RyaW5nW10sIGxlbjogbnVtYmVyLCBwb3M6IG51bWJlcik6IG51bWJlcjtcclxuICBwcml2YXRlIGRhdGVfYV8yX2koczogc3RyaW5nLCBsZW46IG51bWJlciwgcG9zOiBudW1iZXIpOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBkYXRlX2FfMl9pKHM6IGFueSwgbGVuOiBudW1iZXIsIHBvczogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIChzID09PSBudWxsIHx8IHMgaW5zdGFuY2VvZiBBcnJheSkgJiYgKGxlbiA9PT0gbnVsbCB8fCBsZW4uY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKHBvcyA9PT0gbnVsbCB8fCBwb3MuY29uc3RydWN0b3IgPT09IE51bWJlcikpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0ZV9hXzJfaV8wKHMsIGxlbiwgcG9zKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmRhdGVfYV8yX2lfMShzLCBsZW4sIHBvcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRGVjb2RlIGRpZ2l0cyBmcm9tIGEgZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZGF0ZV9hXzJfaV8wKHM6IHN0cmluZ1tdLCBsZW46IG51bWJlciwgcG9zOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGFycmF5OiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KGxlbik7XHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbGVuOyBpID0gaSArIDEpIHtcclxuICAgICAgYXJyYXlbaV0gPSBzW3BvcyArIGldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1nTnVtLmFfMl9sb25nKE5TdHJpbmcuRnJvbUNoYXJzKGFycmF5KSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgbW92aW5nIHBhcnQgb2YgdGhlIGRhdGUgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG1vdmVfZGF0ZShzdHI6IHN0cmluZ1tdLCBwb3M6IG51bWJlciwgbW92ZWJ5OiBudW1iZXIsIGxlbjogbnVtYmVyKTogdm9pZDtcclxuICBwcml2YXRlIG1vdmVfZGF0ZShzdHI6IHN0cmluZywgcG9zOiBudW1iZXIsIG1vdmVieTogbnVtYmVyLCBsZW46IG51bWJlcik6IHZvaWQ7XHJcbiAgcHJpdmF0ZSBtb3ZlX2RhdGUoc3RyOiBhbnksIHBvczogbnVtYmVyLCBtb3ZlYnk6IG51bWJlciwgbGVuOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIChzdHIgPT09IG51bGwgfHwgc3RyIGluc3RhbmNlb2YgQXJyYXkpICYmIChwb3MgPT09IG51bGwgfHwgcG9zLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmIChtb3ZlYnkgPT09IG51bGwgfHwgbW92ZWJ5LmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmIChsZW4gPT09IG51bGwgfHwgbGVuLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKSB7XHJcbiAgICAgIHRoaXMubW92ZV9kYXRlXzAoc3RyLCBwb3MsIG1vdmVieSwgbGVuKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb3ZlX2RhdGVfMShzdHIsIHBvcywgbW92ZWJ5LCBsZW4pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG1vdmluZyBwYXJ0IG9mIHRoZSBkYXRlIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBtb3ZlX2RhdGVfMChzdHI6IHN0cmluZ1tdLCBwb3M6IG51bWJlciwgbW92ZWJ5OiBudW1iZXIsIGxlbjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBNZW1vcnlVdGlsLmNoYXJfbWVtbW92ZShzdHIsIHBvcyArIG1vdmVieSwgc3RyLCBwb3MsIGxlbiAtIChwb3MgKyBtb3ZlYnkpICsgMSk7XHJcbiAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KHN0ciwgcG9zLCAnMCcsIC8qJzAnKi9tb3ZlYnkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyYW5zbGF0ZSBhIG1vbnRoIG5hbWUgLT4gbW9udGggaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyaW5nXCI+dG8gZXZhbHVhdGVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY3R1cmVcIj5tYXNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwb3NcIj5jdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgdGhlIGludFJlZiBub3QgZXhhY3RseSB0aGUgc2FtZSByZWZlcmVuY2UgdG8gaW50ZWdlciAsIGxpa2UgaW4gQysrLFxyXG4gIC8vLyAgIHNvIHRoZSBnbG9iYWwgcG9zIE1VU1QgYmUgdXBkYXRlZCBieSB0aGUgcG9zLnZhbHVlIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgZGF0ZV9NTU1fMl9tKHN0cjogc3RyaW5nW10sIG1hc2s6IHN0cmluZ1tdLCBwb3M6IEludFJlZiwgbGVuOiBudW1iZXIsIGlzSGVicmV3OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBsOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICBsZXQgbWFza1BvczogbnVtYmVyID0gVXRpbFN0ckJ5dGVNb2RlLmNvbnZQb3MoTlN0cmluZy5Gcm9tQ2hhcnMoc3RyKSwgTlN0cmluZy5Gcm9tQ2hhcnMobWFzayksIHBvcy52YWwsIGZhbHNlKTtcclxuICAgICAgbCA9IHRoaXMuZGF0ZV9tc2tfY250KG1hc2ssIG1hc2tQb3MsIDxudW1iZXI+KGxlbiAtIG1hc2tQb3MpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsID0gdGhpcy5kYXRlX21za19jbnQobWFzaywgcG9zLnZhbCwgPG51bWJlcj4obGVuIC0gcG9zLnZhbCkpO1xyXG4gICAgfVxyXG4gICAgbGV0IHN0clBvczogbnVtYmVyID0gcG9zLnZhbDtcclxuICAgIHBvcy52YWwgPSBwb3MudmFsICsgbDtcclxuICAgIGxlbiA9IE1lbW9yeVV0aWwubWVtX3RyaW0oc3RyLCBzdHJQb3MsIGwpO1xyXG5cclxuICAgIGlmIChsZW4gPT09IDApIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHN0ckI6IHN0cmluZyA9IE5TdHJpbmcuRnJvbUNoYXJzKHN0ciwgc3RyUG9zLCBsZW4pO1xyXG4gICAgICBsZXQgbW9udGhOYW1lczogc3RyaW5nW107XHJcbiAgICAgIGlmIChpc0hlYnJldykge1xyXG4gICAgICAgIG1vbnRoTmFtZXMgPSBIZWJyZXdEYXRlLkdldExvY2FsTW9udGhzKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IG1vbnRoczogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLk1PTlRIU19QVFIpO1xyXG4gICAgICAgIG1vbnRoTmFtZXMgPSBEYXRlVXRpbC5nZXRMb2NhbE1vbnRocyhtb250aHMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDwgbW9udGhOYW1lcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGlmIChOU3RyaW5nLkNvbXBhcmUobW9udGhOYW1lc1tpXS5zdWJzdHIoMCwgbGVuKSwgc3RyQiwgdHJ1ZSkgPT09IDApXHJcbiAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBjdXJyZXQgZGF5ZSBzZXBlcmF0ZWQgdG8geWVhciwgbW9udGgsIGRheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZGF0ZV9zeXMoKTogRGF0ZUJyZWFrUGFyYW1zIHtcclxuICAgIGxldCBkYXRlOiBEYXRlQnJlYWtQYXJhbXMgPSBuZXcgRGF0ZUJyZWFrUGFyYW1zKCk7XHJcbiAgICBsZXQgQ3VyckRhdGU6IERhdGVUaW1lID0gRGF0ZVRpbWUuTm93O1xyXG5cclxuICAgIGRhdGUueWVhciA9IEN1cnJEYXRlLlllYXI7XHJcbiAgICBkYXRlLm1vbnRoID0gQ3VyckRhdGUuTW9udGg7XHJcbiAgICBkYXRlLmRheSA9IEN1cnJEYXRlLkRheTtcclxuXHJcbiAgICByZXR1cm4gZGF0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0byBnZXQgY3VycmVudCBkYXRlIGluIG1hZ2ljIHJlcHJlc2VudGF0aW9uIFF1ZXJ5IE1hZ2ljJ3MgRGF0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgJ01hZ2ljJyBjdXJyZW50IGRhdGVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGRhdGVfbWFnaWModXRjRGF0ZTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgZGF0ZVRpbWU6IERhdGVUaW1lO1xyXG4gICAgaWYgKHV0Y0RhdGUpIHtcclxuICAgICAgZGF0ZVRpbWUgPSBEYXRlVGltZS5VdGNOb3c7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZGF0ZVRpbWUgPSBEYXRlVGltZS5Ob3c7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHllYXI6IG51bWJlciA9IGRhdGVUaW1lLlllYXI7XHJcbiAgICBsZXQgbW9udGg6IG51bWJlciA9IGRhdGVUaW1lLk1vbnRoO1xyXG4gICAgbGV0IGRheTogbnVtYmVyID0gZGF0ZVRpbWUuRGF5O1xyXG5cclxuICAgIHJldHVybiB0aGlzLmRhdGVfNF9jYWxlbmRlcih5ZWFyLCBtb250aCwgZGF5LCAxLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdG8gZ2V0ICB0aGUgc3lzdGVtIHRpbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlICdNYWdpYycgY3VycmVudCB0aW1lXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICB0aW1lX21hZ2ljKHV0Y1RpbWU6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIERhdGVUaW1lLkdldFRvdGFsU2Vjb25kc0Zyb21NaWRuaWdodCh1dGNUaW1lLCBuZXcgRGF0ZSgpKTtcclxuICB9XHJcblxyXG4gIG10aW1lX21hZ2ljKHV0Y1RpbWU6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIERhdGVUaW1lLkdldFRvdGFsTWlsbGlTZWNvbmRzRnJvbU1pZG5pZ2h0KHV0Y1RpbWUsIG5ldyBEYXRlKCkpIDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb21wdXRlIE1BR0lDIGRhdGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGRhdGVfNF9jYWxlbmRlcih5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyLCBkb3k6IG51bWJlciwgdXNlZG95OiBib29sZWFuKTogbnVtYmVyIHtcclxuXHJcbiAgICBsZXQgTGVhcFllYXI6IGJvb2xlYW4gPSB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcclxuXHJcbiAgICAvLyAzLjExLjk3IC0gSGVuIChGaXhlZCBidWcgIzc2NDI2NSBhbmQgIzgxODYpIDpcclxuICAgIC8vIElmIHRoZSBkYXRlIGlzIDAgdGhlbiByZXR1cm4gMEwgKHplcm8gdmFsdWUgaXMgdmFsaWQpLCBlbHNlIGlmIHRoZSBkYXRlXHJcbiAgICAvLyBpcyBpbGxlZ2FsIHRoZW4gcmV0dXJuIDEwMDAwMDAwMDBMICh3cm9uZyBkYXRlKS5cclxuICAgIGlmICh1c2Vkb3kpIHtcclxuICAgICAgaWYgKGRveSA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChkb3kgPiAzNjYgfHwgKCFMZWFwWWVhciAmJiBkb3kgPiAzNjUpKSB7XHJcbiAgICAgICAgcmV0dXJuICgxMDAwMDAwMDAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChkYXkgPT09IDAgJiYgbW9udGggPT09IDAgJiYgeWVhciA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChkYXkgPT09IDAgfHwgbW9udGggPT09IDAgfHwgeWVhciA9PT0gMCB8fCBtb250aCA+IDEyKSB7XHJcbiAgICAgICAgcmV0dXJuIDEwMDAwMDAwMDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHllYXIgPSB5ZWFyIC0gMTtcclxuICAgIGxldCBudW06IG51bWJlciA9IE1hdGguZmxvb3IoeWVhciAvIDQwMCk7XHJcbiAgICB5ZWFyID0geWVhciAtIG51bSAqIDQwMDtcclxuICAgIGxldCBudW0yOiBudW1iZXIgPSBNYXRoLmZsb29yKHllYXIgLyAxMDApO1xyXG4gICAgeWVhciA9IHllYXIgLSBudW0yICogMTAwO1xyXG4gICAgbGV0IG51bTM6IG51bWJlciA9IE1hdGguZmxvb3IoeWVhciAvIDQpO1xyXG4gICAgeWVhciA9IHllYXIgLSBudW0zICogNDtcclxuXHJcbiAgICBpZiAoIXVzZWRveSkge1xyXG4gICAgICBsZXQgbnVtNDogbnVtYmVyID0gUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYlttb250aCAtIDFdO1xyXG4gICAgICBsZXQgbnVtNTogbnVtYmVyID0gUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYlttb250aF07XHJcblxyXG4gICAgICBpZiAoTGVhcFllYXIpIHtcclxuICAgICAgICBpZiAobW9udGggPiAxKSB7XHJcbiAgICAgICAgICBudW01ID0gbnVtNSArIDE7XHJcbiAgICAgICAgICBpZiAobW9udGggPiAyKSB7XHJcbiAgICAgICAgICAgIG51bTQgPSBudW00ICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkYXkgPiBudW01IC0gbnVtNCkge1xyXG4gICAgICAgIHJldHVybiAxMDAwMDAwMDAwO1xyXG4gICAgICB9XHJcbiAgICAgIGRveSA9IG51bTQgKyBkYXk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVtICogMTQ2MDk3ICsgbnVtMiAqIDM2NTI0ICsgbnVtMyAqIDE0NjEgKyB5ZWFyICogMzY1ICsgZG95O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyYW5zbGF0ZXMgYSBzdHJpbmcgdGltZSB0byBtYWdpYyBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcFZhbHVlXCI+ICAgQSBzdHJpbmcgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgICAgVGhlIHBpY3R1cmUgdG8gdXNlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBtYWdpYyBudW1iZXI8L3JldHVybnM+XHJcbiAgZnJvbU5hdGl2ZVRpbWVUb01nVGltZShkaXNwVmFsdWU6IERhdGUsIHBpYzogUElDKTogc3RyaW5nIHtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBudW1WYWw6IG51bWJlciA9IHRoaXMuZnJvbU5hdGl2ZVRpbWVUb01nVGltZU51bWJlcihkaXNwVmFsdWUsIHBpYyk7XHJcbiAgICBtZ051bS5OVU1fNF9MT05HKG51bVZhbCk7XHJcbiAgICByZXR1cm4gbWdOdW0udG9YTUxyZWNvcmQoKTtcclxuICB9XHJcblxyXG4gIGZyb21OYXRpdmVUaW1lVG9NZ1RpbWVOdW1iZXIoZGlzcFZhbHVlOiBEYXRlLCBwaWM6IFBJQyk6IG51bWJlciB7XHJcbiAgICBsZXQgbnVtVmFsOiBudW1iZXIgPSB0aGlzLnRpbWVfMl9pbnQoZGlzcFZhbHVlLmdldEhvdXJzKCksIGRpc3BWYWx1ZS5nZXRNaW51dGVzKCksIGRpc3BWYWx1ZS5nZXRTZWNvbmRzKCkpO1xyXG4gICAgcmV0dXJuIG51bVZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IEFscGhhIGludG8gYSBUaW1lIGFjY29yZGluZyB0byBhIGdpdmVuIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFfMl90aW1lKEFzY2lpOiBzdHJpbmcsIHBpYzogUElDLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBudW1iZXI7XHJcbiAgYV8yX3RpbWUoQXNjaWk6IHN0cmluZywgQXNjaWlMOiBudW1iZXIsIG1hc2s6IHN0cmluZ1tdLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBudW1iZXI7XHJcbiAgYV8yX3RpbWUoQXNjaWk6IGFueSwgcGljT3JBc2NpaUw6IGFueSwgbWlsbGlTZWNvbmRzT3JNYXNrOiBhbnksIG1pbGxpU2Vjb25kcz86IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpXHJcbiAgICAgIHJldHVybiB0aGlzLmFfMl90aW1lXzAoQXNjaWksIHBpY09yQXNjaWlMLCBtaWxsaVNlY29uZHNPck1hc2spO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmFfMl90aW1lXzEoQXNjaWksIHBpY09yQXNjaWlMLCBtaWxsaVNlY29uZHNPck1hc2ssIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBBbHBoYSBpbnRvIGEgVGltZSBhY2NvcmRpbmcgdG8gYSBnaXZlbiBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFfMl90aW1lXzAoQXNjaWk6IHN0cmluZywgcGljOiBQSUMsIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5hXzJfdGltZShBc2NpaSwgQXNjaWkubGVuZ3RoLCBOU3RyaW5nLlRvQ2hhckFycmF5KHBpYy5nZXRNYXNrKCkpLCBtaWxsaVNlY29uZHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbnZlcnQgQWxwaGEgaW50byBhIFRpbWUgYWNjb3JkaW5nIHRvIGEgZ2l2ZW4gcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhXzJfdGltZV8xKEFzY2lpOiBzdHJpbmcsIEFzY2lpTDogbnVtYmVyLCBtYXNrOiBzdHJpbmdbXSwgbWlsbGlTZWNvbmRzOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBJOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gbWFzay5sZW5ndGg7IC8vIExlbmd0aCBvZiBtYXNrIG9yIHN0cmluZyB0byBzY2FuXHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBjb3VudGVycyBhbmQgZmxhZ3NcclxuICAgIGlmIChsZW4gPiBBc2NpaUwpIHtcclxuICAgICAgbGVuID0gQXNjaWlMO1xyXG4gICAgfVxyXG4gICAgbGV0IGFtcG06IG51bWJlciA9IDA7IC8vIEFNL1BNIGluZGljYXRvclxyXG4gICAgbGV0IGhvdXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWludXRlOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHNlY29uZDogbnVtYmVyID0gMDtcclxuICAgIGxldCBtaWxsaXNlY29uZDogbnVtYmVyID0gMDtcclxuXHJcbiAgICB3aGlsZSAoSSA8IGxlbikge1xyXG4gICAgICBsZXQgbWFza0xlbmd0aDogbnVtYmVyO1xyXG4gICAgICBsZXQgbWF4TWFza0xlbjogbnVtYmVyO1xyXG5cclxuICAgICAgLy8gVG8gZ2V0IHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aCBvZiB0aGUgY29uc3RhbnRzIGluIHRoZSBtYXNrXHJcbiAgICAgIHN3aXRjaCAobWFza1tJXS5jaGFyQ29kZUF0KDApKSB7XHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ISCk6XHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOlxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfU1MpOlxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfUE0pOlxyXG4gICAgICAgICAgbWF4TWFza0xlbiA9IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NUyk6XHJcbiAgICAgICAgICBtYXhNYXNrTGVuID0gMztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgbWF4TWFza0xlbiA9IDE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLyogVG8gZ2V0IHRoZSBtaW5pbXVtIG9mIG1heE1hc2tMZW4gJiBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1haW5lZCBpbiBzdHJpbmdcclxuICAgICAgYmVjYXVzZSBpZiB0aGUgQXNjaWkgaXMgc2hvcnRlcihoYXMgbGVzcyBjaGFyYWN0ZXJzKXRoZW4gY3JlYXRlIFN0cmluZyBvbmx5XHJcbiAgICAgIG9mIHRoYXQgbm8uIG9mIGNoYXJhY3RlcnMgKG1hc2tMZW5ndGgpLCBub3Qgb2YgbWF4TWFza0xlbmd0aCAqL1xyXG4gICAgICBtYXNrTGVuZ3RoID0gTWF0aC5taW4obWF4TWFza0xlbiwgbGVuIC0gSSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKG1hc2tbSV0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSEgpOiB7XHJcbiAgICAgICAgICBob3VyID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOiB7XHJcbiAgICAgICAgICBtaW51dGUgPSBtZ051bS5hXzJfbG9uZyhBc2NpaS5zdWJzdHIoSSwgbWFza0xlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1NTKToge1xyXG4gICAgICAgICAgc2Vjb25kID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NUyk6IHtcclxuICAgICAgICAgIG1pbGxpc2Vjb25kID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19QTSk6XHJcbiAgICAgICAgICBhbXBtID0gMDtcclxuICAgICAgICAgIGxldCBjMDogc3RyaW5nID0gQXNjaWlbSV07XHJcbiAgICAgICAgICBsZXQgYzE6IHN0cmluZztcclxuICAgICAgICAgIGMwID0gYzAudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgIGlmIChJICsgMSA8IGxlbikge1xyXG4gICAgICAgICAgICBjMSA9IEFzY2lpW0kgKyAxXTtcclxuICAgICAgICAgICAgYzEgPSBjMS50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGMxID09PSAnTScpIHtcclxuICAgICAgICAgICAgICBpZiAoYzAgPT09ICdBJylcclxuICAgICAgICAgICAgICAgIGFtcG0gPSAtMTtcclxuICAgICAgICAgICAgICBpZiAoYzAgPT09ICdQJylcclxuICAgICAgICAgICAgICAgIGFtcG0gPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIEkgKz0gbWFza0xlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayB2YWxpZGl0eSBvZiBtaW51dGVzIGFuZCBzZWNvbmRzXHJcbiAgICBpZiAoc2Vjb25kID4gNTkgfHwgbWludXRlID4gNTkpXHJcbiAgICAgIHJldHVybiAoMCk7XHJcblxyXG4gICAgLy8gQ29udmVydCBob3VyIHRvIFBNIGlmIHNwZWNpZmllZCBhcyBBTVxyXG4gICAgaWYgKGFtcG0gIT09IDApXHJcbiAgICAgIGlmIChhbXBtID09PSAtMSlcclxuICAgICAgLy8gQU1cclxuICAgICAge1xyXG4gICAgICAgIGlmIChob3VyID09PSAxMilcclxuICAgICAgICAgIGhvdXIgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGhvdXIgPCAxMilcclxuICAgICAgLy8gUE1cclxuICAgICAgICBob3VyICs9IDEyO1xyXG4gICAgaWYgKG1pbGxpU2Vjb25kcylcclxuICAgICAgcmV0dXJuIHRoaXMudGltZV8yX2ludChob3VyLCBtaW51dGUsIHNlY29uZCkgKiAxMDAwICsgbWlsbGlzZWNvbmQ7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLnRpbWVfMl9pbnQoaG91ciwgbWludXRlLCBzZWNvbmQpO1xyXG4gIH1cclxuXHJcbiAgdGltZV8yX2ludChob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyLCBzZWNvbmQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gaG91ciAqIDM2MDAgKyBtaW51dGUgKiA2MCArIHNlY29uZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IFwiMFwiL1wiMVwiIHRvIGZhbHNlL3RydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYm9vbFN0clwiPiAgXCIwXCIvXCIxXCJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgXCIxXCIgb3IgZmFsc2UgaWYgb3RoZXJzXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgdG9Cb29sZWFuKGJvb2xTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGJvb2xTdHIgIT09IG51bGwgJiYgYm9vbFN0ciA9PT0gXCIxXCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU3RyaW5nIHRvIERhdGUgZnVuY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFfMl9kYXRlKHN0cjogc3RyaW5nLCBGb3JtYXQ6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmFfMl9kYXRlX2RhdGVtb2RlKHN0ciwgRm9ybWF0LCBjb21wSWR4KTtcclxuICB9XHJcblxyXG4gIGFfMl9kYXRlX3BpYyhzdHI6IHN0cmluZywgcGljOiBQSUMsIG1hc2s6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChzdHIgPT09IG51bGwpIHtcclxuICAgICAgc3RyID0gXCJcIjtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmFfMl9kYXRlX3BpY19kYXRlbW9kZShOU3RyaW5nLlRvQ2hhckFycmF5KHN0ciksIHN0ci5sZW5ndGgsIHBpYywgTlN0cmluZy5Ub0NoYXJBcnJheShtYXNrKSwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICB0b19hKG91dFZhbDogc3RyaW5nLCBvdXRfbGVuOiBudW1iZXIsIGRhdGU6IG51bWJlciwgRm9ybWF0OiBzdHJpbmcsIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b19hX2RhdGVtb2RlKG91dFZhbCwgb3V0X2xlbiwgZGF0ZSwgRm9ybWF0LCBmYWxzZSwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBzdHJpbmcgLT4gZGF0ZSB1c2luZyBhIGZvcm1hdCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYV8yX2RhdGVfZGF0ZW1vZGUoc3RyOiBzdHJpbmcsIEZvcm1hdDogc3RyaW5nLCBjb21wSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHBJQzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuREFURSwgY29tcElkeCk7XHJcbiAgICBpZiAoc3RyID09PSBudWxsKSB7XHJcbiAgICAgIHN0ciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5hXzJfZGF0ZV9waWNfZGF0ZW1vZGUoTlN0cmluZy5Ub0NoYXJBcnJheShzdHIpLCBzdHIubGVuZ3RoLCBwSUMsIE5TdHJpbmcuVG9DaGFyQXJyYXkocElDLmdldE1hc2soKSksIGNvbXBJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFN0cmluZyB0byBhIGRhdGVtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHRvX2FfZGF0ZW1vZGUob3V0VmFsOiBzdHJpbmcsIG91dF9sZW46IG51bWJlciwgZGF0ZTogbnVtYmVyLCBGb3JtYXQ6IHN0cmluZywgaWdub3JlX2R0X2ZtdDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuXHJcbiAgICAvLyBQYXJzZSB0aGUgcGljdHVyZVxyXG4gICAgbGV0IHBpYzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuREFURSwgY29tcElkeCk7XHJcblxyXG4gICAgLy8gQ29udmVydCB0aGUgIGRhdGUgLT4gc3RyaW5nXHJcbiAgICBpZiAob3V0VmFsID09PSBudWxsKSB7XHJcbiAgICAgIG91dFZhbCA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50b19hX3BpY19kYXRlbW9kZShvdXRWYWwsIG91dF9sZW4sIGRhdGUsIHBpYywgdHJ1ZSwgaWdub3JlX2R0X2ZtdCwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRGVjb2RlIGRpZ2l0cyBmcm9tIGEgZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZGF0ZV9hXzJfaV8xKHM6IHN0cmluZywgbGVuOiBudW1iZXIsIHBvczogbnVtYmVyKTogbnVtYmVyIHtcclxuXHJcbiAgICAvLyBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZSAncG9zKz1sZW4nIGFmdGVyIHRoZSB1c2luZyBvZiB0aGUgZnVuY3Rpb25cclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBzdHI6IHN0cmluZztcclxuXHJcbiAgICBzdHIgPSBzLnN1YnN0cihwb3MsIGxlbik7XHJcbiAgICByZXR1cm4gbWdOdW0uYV8yX2xvbmcoc3RyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbW92ZV9kYXRlXzEoc3RyOiBzdHJpbmcsIHBvczogbnVtYmVyLCBtb3ZlYnk6IG51bWJlciwgbGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgc3RyID0gU3RyVXRpbC5tZW1tb3ZlKHN0ciwgcG9zICsgbW92ZWJ5LCBzdHIsIHBvcywgbGVuIC0gcG9zKTtcclxuXHJcbiAgICBzdHIgPSBTdHJVdGlsLm1lbXNldChzdHIsIHBvcywgJzAnLCBtb3ZlYnkpO1xyXG4gICAgcmV0dXJuIHN0cjtcclxuICB9XHJcblxyXG4gIHRpbWVfMl9hKEFzY2lpOiBzdHJpbmcsIEFzY2lpTDogbnVtYmVyLCB0aW1lOiBudW1iZXIsIEZvcm1hdDogc3RyaW5nLCBjb21wSWR4OiBudW1iZXIsIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IHN0cmluZyB7XHJcblxyXG4gICAgaWYgKFN0clV0aWwucnRyaW0oRm9ybWF0KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgRm9ybWF0ID0gXCJISDpNTTpTU1wiO1xyXG4gICAgfVxyXG4gICAgbGV0IHBpYzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSwgY29tcElkeCk7XHJcbiAgICBpZiAoQXNjaWkgPT09IG51bGwpIHtcclxuICAgICAgQXNjaWkgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudGltZV8yX2FfcGljKEFzY2lpLCBBc2NpaUwsIHRpbWUsIHBpYywgZmFsc2UsIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJhbnNsYXRlcyBhIHN0cmluZyB0byBtYWdpYyBsb2dpY2FsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPiAgIEEgc3RyaW5nIHZhbHVlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gICAgICAgICBUaGUgcGljdHVyZSB0byB1c2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+ICAgIFRoZSByYW5nZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxvZ2ljYWwgdmFsdWVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHRvTG9naWNhbChkaXNwVmFsdWU6IHN0cmluZywgcGljOiBQSUMsIHJhbmdlU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgZGlzcFZhbHVlID0gZGlzcFZhbHVlLnRyaW0oKTtcclxuICAgIGlmIChkaXNwVmFsdWUgPT09IG51bGwgfHwgZGlzcFZhbHVlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBkaXNwVmFsdWUgPSBcIkZhbHNlXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwXzJfbG9naWNhbChkaXNwVmFsdWUsIHBpYy5nZXRNYXNrKCksIHJhbmdlU3RyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgdGhlIGRpc3BsYXllZCB2YWx1ZSB0byBhIG1hZ2ljIGxvZ2ljYWwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcFZhbHVlXCI+dGhlIGRpc3BsYXllZCB2YWx1ZSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWFza1wiPnRoZSBtYXNrIG9mIHRoZSBkaXNwbGF5ZWQgdmFsdWUgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+dGhlIHJhbmdlIHN0cmluZyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgZGlzcF8yX2xvZ2ljYWwoZGlzcFZhbHVlOiBzdHJpbmcsIG1hc2s6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHN0cmlwcGVkVmFsdWU6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihkaXNwVmFsdWUubGVuZ3RoKTtcclxuXHJcbiAgICByYW5nZVN0ciA9IHRoaXMud2luX3JuZ19ib29sKHJhbmdlU3RyKTtcclxuICAgIHJhbmdlU3RyID0gU3RyVXRpbC5tYWtlUHJpbnRhYmxlVG9rZW5zKHJhbmdlU3RyLCBTRVFfMl9IVE1MKTtcclxuICAgIGxldCBpOiBudW1iZXIgPSByYW5nZVN0ci5pbmRleE9mKCcsJyk7XHJcbiAgICBsZXQgdHJ1ZVN0cjogc3RyaW5nID0gcmFuZ2VTdHIuc3Vic3RyKDAsIGkpO1xyXG4gICAgdHJ1ZVN0ciA9IFN0clV0aWwubWFrZVByaW50YWJsZVRva2Vucyh0cnVlU3RyLCBIVE1MXzJfU1RSKTtcclxuICAgIGkgPSAwO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBkaXNwVmFsdWUubGVuZ3RoICYmIGkgPCBtYXNrLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChtYXNrLmNoYXJDb2RlQXQoaSkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWCkge1xyXG4gICAgICAgIHN0cmlwcGVkVmFsdWUuQXBwZW5kKGRpc3BWYWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsOiBzdHJpbmcgPSBzdHJpcHBlZFZhbHVlLlRvU3RyaW5nKCk7XHJcbiAgICBpZiAodHJ1ZVN0ci5sZW5ndGggPCB2YWwubGVuZ3RoKSB7XHJcbiAgICAgIHZhbCA9IHZhbC5zdWJzdHIoMCwgdHJ1ZVN0ci5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh2YWwubGVuZ3RoIDwgdHJ1ZVN0ci5sZW5ndGgpIHtcclxuICAgICAgICB0cnVlU3RyID0gdHJ1ZVN0ci5zdWJzdHIoMCwgdmFsLmxlbmd0aCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAodmFsLnRvVXBwZXJDYXNlKCkgPT09IHRydWVTdHIudG9VcHBlckNhc2UoKSkgPyBcIjFcIiA6IFwiMFwiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbnZlcnRpbmcgdGhlIGRpc3BsYXllZCB2YWx1ZSBvZiBhIHN0cmluZyB0byBpbnRlcm5hbFxyXG4gIC8vLyAgIHJlcHJlc2VudGF0aW9uIG11c3QgcmVtb3ZlIHRoZSBtYXNraW5nIGNoYXJhY3RlcnMgZnJvbSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSB0b0FscGhhKGRpc3BWYWx1ZTogc3RyaW5nLCBwaWM6IFBJQyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHBpY3R1cmU6IHN0cmluZyA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIocGljLmdldE1hc2tTaXplKCkpO1xyXG4gICAgbGV0IElzQWxwaGFEQkNTOiBib29sZWFuID0gVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBwaWMuaXNBdHRyQWxwaGEoKTtcclxuICAgIGxldCBjdXJyUGljdHVyZTogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IGN1cnJQaWN0dXJlID0gMDtcclxuXHJcbiAgICBmb3IgKGN1cnJQaWN0dXJlID0gaSA9IDA7IGkgPCBkaXNwVmFsdWUubGVuZ3RoICYmIGN1cnJQaWN0dXJlIDwgcGljdHVyZS5sZW5ndGg7IGkrKywgY3VyclBpY3R1cmUrKykge1xyXG4gICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZShwaWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpKSB7XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChkaXNwVmFsdWUuY2hhckF0KGkpKTtcclxuXHJcbiAgICAgICAgaWYgKElzQWxwaGFEQkNTKSB7XHJcbiAgICAgICAgICAvLyBhIERCQ1MgY2hhcmFjdGVyIGluIFwiZGlzcFZhbHVlXCIgY29uc3VtZXMgdHdvIGNoYXJhY3RlcnMgaW4gXCJwaWN0dXJlXCJcclxuICAgICAgICAgIGxldCBzdHJEc3BWYWxPbmVDaGFyOiBzdHJpbmcgPSBkaXNwVmFsdWUuc3Vic3RyKGksIDEpO1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0ckRzcFZhbE9uZUNoYXIpID09PSAyKSB7XHJcbiAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIGNoZWNrZWQgY2hhciBBbHBoYSBQb3NpdGlvbmFsIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICBzdGF0aWMgaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19VIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0wgfHxcclxuICAgICAgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0cgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfUyB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19UKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tcGFyYXRpdmUgbmV3VmFsdWUgd2l0aCBwb3NzaWJsZSBSYW5nZSBpbiBDb250aW51b3VzUmFuZ2VWYWx1ZXMvZGlzY3JldGVSYW5nZVZhbHVlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXdWYWx1ZSBpZiBpdCBwb3NzaWJsZSwgb2xkIHZhbHVlIG93ZXJ2aXNlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGZpbGxBbHBoYUJ5UmFuZ2UoQ29udGludW91c1JhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4sIGRpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHRtcEJ1ZmZlcjogc3RyaW5nID0gdGhpcy5maWxsQWxwaGFCeURpc2NyZXRlUmFuZ2VWYWx1ZXMoZGlzY3JldGVSYW5nZVZhbHVlcywgbmV3VmFsdWUpO1xyXG4gICAgaWYgKHRtcEJ1ZmZlciAhPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdG1wQnVmZmVyO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRtcEJ1ZmZlciA9IHRoaXMuZmlsbEFscGhhQnlDb250aW51b3VzUmFuZ2VWYWx1ZXMoQ29udGludW91c1JhbmdlVmFsdWVzLCBuZXdWYWx1ZSk7XHJcbiAgICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gdG1wQnVmZmVyO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChkaXNjcmV0ZVJhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0bXBCdWZmZXIgPSB0aGlzLmNvbXBsZXRlQWxwaGFCeVJhbmdlKGRpc2NyZXRlUmFuZ2VWYWx1ZXMsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHVucG9zc2libGUgdG8gZmluZCBpdCBpbiB0aGUgcmFuZ2UgcmV0dXJuIG5vdCBjaGFuZ2VkIG9sZHZhbHVlXHJcbiAgICByZXR1cm4gbmV3VmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCBBbHBoYSBzdHJpbmcgYnkgZGlzY3JldGUgcmFuZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzY3JldGVSYW5nZVZhbHVlc1wiPnZlY3RvciBvZiBkaXNjcmV0ZSByYW5nZSB2YWx1ZXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbHVlXCI+dmFsdWUsIHRyeSBmb3VuZCBpbiB0aGUgdmVjdG9yIG9mIGRpc2NyZXRlIHJhbmdlc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZm91bmQgdmFsdWUgb3IgbnVsbChub3QgZm91bmQpXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBmaWxsQWxwaGFCeURpc2NyZXRlUmFuZ2VWYWx1ZXMoZGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+LCBuZXdWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuXHJcbiAgICBpZiAoZGlzY3JldGVSYW5nZVZhbHVlcyAhPT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGlzY3JldGVSYW5nZVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBkaXNjcmV0ZVZhbHVlOiBzdHJpbmcgPSBkaXNjcmV0ZVJhbmdlVmFsdWVzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGxldCB0cnVuY2F0ZWRWYWx1ZTogc3RyaW5nID0gZGlzY3JldGVWYWx1ZS5zdWJzdHIoMCwgTWF0aC5taW4obmV3VmFsdWUubGVuZ3RoLCBkaXNjcmV0ZVZhbHVlLmxlbmd0aCkpO1xyXG4gICAgICAgIGlmIChuZXdWYWx1ZS50b1VwcGVyQ2FzZSgpID09PSB0cnVuY2F0ZWRWYWx1ZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICByZXR1cm4gZGlzY3JldGVWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZpbGwgQWxwaGEgc3RyaW5nIGJ5IGNvbnRpbnVvdXMgcmFuZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQ29udGludW91c1JhbmdlVmFsdWVzXCI+dmVjdG9yIG9mIGNvbnRpbnVvdXMgcmFuZ2UgdmFsdWVzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWx1ZVwiPnZhbHVlLCB0cnkgZm91bmQgaW4gdGhlIHZlY3RvciBvZiBjb250aW51b3VzIHJhbmdlc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZm91bmQgdmFsdWUgb3IgbnVsbChub3QgZm91bmQpXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBmaWxsQWxwaGFCeUNvbnRpbnVvdXNSYW5nZVZhbHVlcyhDb250aW51b3VzUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBuZXdWYWx1ZSA9IFN0clV0aWwucnRyaW0obmV3VmFsdWUpO1xyXG5cclxuXHJcbiAgICBpZiAoQ29udGludW91c1JhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBDb250aW51b3VzUmFuZ2VWYWx1ZXMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgZnJvbTogc3RyaW5nID0gQ29udGludW91c1JhbmdlVmFsdWVzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGxldCB0bzogc3RyaW5nID0gQ29udGludW91c1JhbmdlVmFsdWVzLmdldF9JdGVtKGkgPSBpICsgMSk7XHJcbiAgICAgICAgaWYgKE5TdHJpbmcuQ29tcGFyZU9yZGluYWwobmV3VmFsdWUsIGZyb20pID49IDAgJiYgTlN0cmluZy5Db21wYXJlT3JkaW5hbChuZXdWYWx1ZSwgdG8pIDw9IDApIHtcclxuICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUcnkgdG8gY29tcGxldGUgdGhlIG5ld1ZhbHVlIHVzaW5nIHRoZSBSYW5nZVxyXG4gIC8vLyAgIGZpcnN0IHRyeSB0byBjb21sZXRlIHRoZSB2YWx1ZSBmb3IgY2FzZSBtZWFuaW5nIGFuZCBhZnRlciB0aGF0IGZvciBpZ25vcmUgY2FzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2ZWN0b3JcIj5vZiByYW5nZXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrZWRcIj52YWx1ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdmFsdWUgY29tcGxldGVkIGJ5IHJhbmdlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBjb21wbGV0ZUFscGhhQnlSYW5nZShkaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4sIG5ld1ZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBtYXhDb2luY2lkZTogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPigyKTtcclxuICAgIGZvciAobGV0IF9haTogbnVtYmVyID0gMDsgX2FpIDwgbWF4Q29pbmNpZGUubGVuZ3RoOyArK19haSlcclxuICAgICAgbWF4Q29pbmNpZGVbX2FpXSA9IDA7XHJcblxyXG4gICAgbGV0IGJlc3RJdGVtOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KDIpO1xyXG4gICAgZm9yIChsZXQgX2FpOiBudW1iZXIgPSAwOyBfYWkgPCBiZXN0SXRlbS5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICBiZXN0SXRlbVtfYWldID0gbnVsbDtcclxuXHJcbiAgICBsZXQgQ0hFQ0tfQ0FTRTogbnVtYmVyID0gMDtcclxuICAgIGxldCBJR05PUkVfQ0FTRTogbnVtYmVyID0gMTtcclxuXHJcbiAgICBsZXQgY2FzZUxldHRlcnM6IG51bWJlciA9IENIRUNLX0NBU0U7XHJcblxyXG4gICAgd2hpbGUgKGNhc2VMZXR0ZXJzID09PSBDSEVDS19DQVNFIHx8IGNhc2VMZXR0ZXJzID09PSBJR05PUkVfQ0FTRSkge1xyXG4gICAgICBsZXQgbG93ZXJWYWx1ZTogc3RyaW5nO1xyXG4gICAgICBpZiAoY2FzZUxldHRlcnMgPT09IENIRUNLX0NBU0UpIHtcclxuICAgICAgICBsb3dlclZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbG93ZXJWYWx1ZSA9IG5ld1ZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgbG93ZXJWYWx1ZSA9IFN0clV0aWwucnRyaW0obG93ZXJWYWx1ZSk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkaXNjcmV0ZVJhbmdlVmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IHdyb25nTGV0dGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGN1cnJDb2luY2lkZTogbnVtYmVyID0gMDtcclxuICAgICAgICBsZXQgcmFuZ2VJdGVtOiBzdHJpbmc7XHJcbiAgICAgICAgaWYgKGNhc2VMZXR0ZXJzID09PSBDSEVDS19DQVNFKSB7XHJcbiAgICAgICAgICByYW5nZUl0ZW0gPSBkaXNjcmV0ZVJhbmdlVmFsdWVzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJhbmdlSXRlbSA9IGRpc2NyZXRlUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxvd0xlbmd0aDogbnVtYmVyID0gbG93ZXJWYWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgbGV0IHJhbmdlTGVuZ3RoOiBudW1iZXIgPSByYW5nZUl0ZW0ubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsb3dMZW5ndGggPCByYW5nZUxlbmd0aCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGxvd0xlbmd0aDsgaiA9IGogKyAxKSB7XHJcbiAgICAgICAgICAgIGlmICghKGxvd2VyVmFsdWUuY2hhckF0KGopID09PSByYW5nZUl0ZW0uY2hhckF0KGopKSkge1xyXG4gICAgICAgICAgICAgIHdyb25nTGV0dGVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyQ29pbmNpZGUgPSBjdXJyQ29pbmNpZGUgKyAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHdyb25nTGV0dGVyID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyQ29pbmNpZGUgPiBtYXhDb2luY2lkZVtjYXNlTGV0dGVyc10gJiYgIXdyb25nTGV0dGVyKSB7XHJcbiAgICAgICAgICBiZXN0SXRlbVtjYXNlTGV0dGVyc10gPSBkaXNjcmV0ZVJhbmdlVmFsdWVzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgICAgbWF4Q29pbmNpZGVbY2FzZUxldHRlcnNdID0gY3VyckNvaW5jaWRlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXNlTGV0dGVycyA9IGNhc2VMZXR0ZXJzICsgMTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaWYgKGJlc3RJdGVtW0NIRUNLX0NBU0VdICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gYmVzdEl0ZW1bQ0hFQ0tfQ0FTRV07XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGJlc3RJdGVtW0lHTk9SRV9DQVNFXSAhPT0gbnVsbClcclxuICAgICAgICByZXR1cm4gYmVzdEl0ZW1bSUdOT1JFX0NBU0VdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2V0RGF0ZUNoYXIoZGF0ZUNoYXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5EQVRFQ0hBUiA9IGRhdGVDaGFyO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZUNoYXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkRBVEVDSEFSO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0b3JhZ2VBdHRyaWJ1dGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFN0cmluZ1ZhbHVlVG9NZ1ZhbHVlKHZhbHVlOiBzdHJpbmcsIHN0b3JhZ2VBdHRyaWJ1dGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGZpbGxlcjogc3RyaW5nLCBsZW5ndGg6IG51bWJlcik6IGFueSB7XHJcbiAgICBzd2l0Y2ggKHN0b3JhZ2VBdHRyaWJ1dGUpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERToge1xyXG4gICAgICAgIGxldCBuZXdWYWw6IHN0cmluZyA9IHZhbHVlO1xyXG4gICAgICAgIG5ld1ZhbCA9IE5TdHJpbmcuUGFkUmlnaHQobmV3VmFsLCBsZW5ndGgsIGZpbGxlcik7XHJcbiAgICAgICAgcmV0dXJuIG5ld1ZhbDtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgIHJldHVybiBuZXcgTlVNX1RZUEUodmFsdWUpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgQmVpbmcgdXNlZCB0byBzZW5kIHBhcmFtZXRlcnMgdG8gdGhlICd0aW1lX2JyZWFrJyBtZXRob2RcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFRpbWVCcmVha1BhcmFtcyB7XHJcbiAgaG91cjogbnVtYmVyID0gMDtcclxuICBtaW51dGU6IG51bWJlciA9IDA7XHJcbiAgc2Vjb25kOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKGhvdXJfOiBudW1iZXIsIG1pbnV0ZV86IG51bWJlciwgc2Vjb25kXzogbnVtYmVyKTtcclxuICBjb25zdHJ1Y3Rvcihob3VyXz86IG51bWJlciwgbWludXRlXz86IG51bWJlciwgc2Vjb25kXz86IG51bWJlcikge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMShob3VyXywgbWludXRlXywgc2Vjb25kXyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoaG91cl86IG51bWJlciwgbWludXRlXzogbnVtYmVyLCBzZWNvbmRfOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuaG91ciA9IGhvdXJfO1xyXG4gICAgdGhpcy5taW51dGUgPSBtaW51dGVfO1xyXG4gICAgdGhpcy5zZWNvbmQgPSBzZWNvbmRfO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBCZWluZyB1c2VkIHRvIHNlbmQgaW50IGJ5IFJlZlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5jbGFzcyBJbnRSZWYge1xyXG4gIHZhbDogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IodmFsXzogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnZhbCA9IHZhbF87XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIEJlaW5nIHVzZWQgdG8gc2VuZCBwYXJhbWV0ZXJzIHRvIHRoZSAnZGF0ZV9pXzJfbm0nIG1ldGhvZFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5jbGFzcyBEYXRlTmFtZVBhcmFtcyB7XHJcbiAgb3V0VmFsOiBzdHJpbmdbXSA9IG51bGw7XHJcbiAgbGVuOiBudW1iZXIgPSAwO1xyXG4gIG91dElkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3V0Xzogc3RyaW5nW10sIG91dElkeF86IG51bWJlciwgbGVuXzogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm91dFZhbCA9IG91dF87XHJcbiAgICB0aGlzLm91dElkeCA9IG91dElkeF87XHJcbiAgICB0aGlzLmxlbiA9IGxlbl87XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIEJlaW5nIHVzZWQgdG8gc2VuZCBwYXJhbWV0ZXJzIHRvIHRoZSAnZGF0ZV9icmVha19kYXRlbW9kZScgbWV0aG9kXHJcbi8vLyAgIGl0J3Mgc3RydWN0XHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBEYXRlQnJlYWtQYXJhbXMge1xyXG4gIGRheTogbnVtYmVyID0gMDtcclxuICBkb3c6IG51bWJlciA9IDA7XHJcbiAgZG95OiBudW1iZXIgPSAwO1xyXG4gIG1vbnRoOiBudW1iZXIgPSAwO1xyXG4gIHllYXI6IG51bWJlciA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IoeWVhcl86IG51bWJlciwgbW9udGhfOiBudW1iZXIsIGRheV86IG51bWJlciwgZG95XzogbnVtYmVyLCBkb3dfOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKHllYXJfPzogbnVtYmVyLCBtb250aF8/OiBudW1iZXIsIGRheV8/OiBudW1iZXIsIGRveV8/OiBudW1iZXIsIGRvd18/OiBudW1iZXIpIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEoeWVhcl8sIG1vbnRoXywgZGF5XywgZG95XywgZG93Xyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoeWVhcl86IG51bWJlciwgbW9udGhfOiBudW1iZXIsIGRheV86IG51bWJlciwgZG95XzogbnVtYmVyLCBkb3dfOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMueWVhciA9IHllYXJfO1xyXG4gICAgdGhpcy5tb250aCA9IG1vbnRoXztcclxuICAgIHRoaXMuZGF5ID0gZGF5XztcclxuICAgIHRoaXMuZG95ID0gZG95XztcclxuICAgIHRoaXMuZG93ID0gZG93XztcclxuICB9XHJcbn1cclxuIl19
|
|
1706
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlzcGxheUNvbnZlcnRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvRGlzcGxheUNvbnZlcnRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzVCLE9BQU8sRUFBRSxRQUFRLEVBQVEsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RixPQUFPLEVBQ0wsUUFBUSxFQUNSLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFdBQVcsRUFDWCxlQUFlLEVBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUduRCxNQUFNLE9BQU8sZ0JBQWdCO0lBWTNCO1FBWFEsaUJBQVksR0FBaUIsSUFBSSxDQUFDO1FBQ2xDLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFXM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDO0lBQ2pELENBQUM7SUFURCxNQUFNLEtBQUssUUFBUTtRQUNqQixJQUFJLGdCQUFnQixDQUFDLFNBQVMsS0FBSyxJ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QUU7d0JBQzFCLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7cUJBQ3BEO29CQUNDLE1BQU07Z0JBRVIsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7b0JBQUU7d0JBQzNCLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7cUJBQ3REO29CQUNDLE1BQU07Z0JBRVIsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7b0JBQUU7d0JBQzFCLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7cUJBQ3REO29CQUNDLE1BQU07Z0JBRVIsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7b0JBQUU7d0JBQzFCLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7cUJBQzNEO29CQUNDLE1BQU07Z0JBRVIsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7b0JBQ3hCLElBQUksR0FBRyxDQUFDLENBQUM7b0JBQ1QsSUFBSSxFQUFFLEdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxQixJQUFJLEVBQVUsQ0FBQztvQkFDZixFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFO3dCQUNmLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNsQixFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUV0QixJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUU7NEJBQ2QsSUFBSSxF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QUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTyxhQUFhO0lBQ3JCLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBYSxFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsSUFBWSxFQUFFLElBQVk7UUFDM0YsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDcEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vZW52L0lFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IFBJQyB9IGZyb20gJy4vUElDJztcclxuaW1wb3J0IHsgRGF0ZVRpbWUsIExpc3QsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdHJpbmdCdWlsZGVyIH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIERhdGVVdGlsLFxyXG4gIEhUTUxfMl9TVFIsXHJcbiAgTXNnSW50ZXJmYWNlLFxyXG4gIFBJQ0ludGVyZmFjZSxcclxuICBTRVFfMl9IVE1MLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBVdGlsRGF0ZUpwbixcclxuICBVdGlsU3RyQnl0ZU1vZGVcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHsgQmxvYlR5cGUgfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbkRldGFpbHNCYXNlIH0gZnJvbSAnLi9WYWxpZGF0aW9uRGV0YWlsc0Jhc2UnO1xyXG5pbXBvcnQgeyBOVU1fVFlQRSB9IGZyb20gJy4uL2RhdGEvTlVNX1RZUEUnO1xyXG5pbXBvcnQgeyBIZWJyZXdEYXRlIH0gZnJvbSAnLi9IZWJyZXdEYXRlJztcclxuaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSAnLi4vLi4vRXZlbnRzJztcclxuaW1wb3J0IHsgR3VpRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9HdWlFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IE1lbW9yeVV0aWwgfSBmcm9tICcuLi8uLi91dGlsL01lbW9yeVV0aWwnO1xyXG5cclxuLy8gQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIERpc3BsYXlDb252ZXJ0b3Ige1xyXG4gIHByaXZhdGUgX2Vudmlyb25tZW50OiBJRW52aXJvbm1lbnQgPSBudWxsO1xyXG4gIHByaXZhdGUgREFURUNIQVI6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBEaXNwbGF5Q29udmVydG9yID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBEaXNwbGF5Q29udmVydG9yIHtcclxuICAgIGlmIChEaXNwbGF5Q29udmVydG9yLl9pbnN0YW5jZSA9PT0gbnVsbCkge1xyXG4gICAgICBEaXNwbGF5Q29udmVydG9yLl9pbnN0YW5jZSA9IG5ldyBEaXNwbGF5Q29udmVydG9yKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gRGlzcGxheUNvbnZlcnRvci5faW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX2Vudmlyb25tZW50ID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQ7XHJcbiAgfVxyXG5cclxuICBnZXROZXdEYXRlQnJlYWtQYXJhbXMoKTogRGF0ZUJyZWFrUGFyYW1zIHtcclxuICAgIHJldHVybiBuZXcgRGF0ZUJyZWFrUGFyYW1zKCk7XHJcbiAgfVxyXG5cclxuICBnZXROZXdUaW1lQnJlYWtQYXJhbXMoKTogVGltZUJyZWFrUGFyYW1zIHtcclxuICAgIHJldHVybiBuZXcgVGltZUJyZWFrUGFyYW1zKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBvZiBhIHZhbHVlIGZyb20gaXRzIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsdWVcIj4gIHRoZSBpbnRlcm5hbCB2YWx1ZSAoYXMgc2VudCBpbiB0aGUgWE1MKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmFuZ2VTdHJcIj4gdmFsdWUgcmFuZ2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPiAgICAgIHRoZSBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gc3RyaW5nIHRvIGRpc3BsYXlcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIG1nMmRpc3AobWdWYWx1ZTogc3RyaW5nLCByYW5nZVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdXNlTmF0aXZlOiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIsIHRpbWVfZGF0ZV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBhbnk7XHJcbiAgbWcyZGlzcChtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGFsd2F5c0ZpbGw6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlciwgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IGFueTtcclxuICBtZzJkaXNwKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgYWx3YXlzRmlsbDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyLCBjb252ZXJ0Q2FzZTogYm9vbGVhbiwgdGltZV9kYXRlX251bV9waWNfWl9lZHQ6IGJvb2xlYW4pOiBhbnk7XHJcbiAgbWcyZGlzcChtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGNvbXBJZHhPckFsd2F5c0ZpbGw6IGFueSwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29tcElkeDogYW55LCB0aW1lX2RhdGVfcGljX1pfZWR0T3JDb252ZXJ0Q2FzZT86IGJvb2xlYW4sIHRpbWVfZGF0ZV9udW1fcGljX1pfZWR0PzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNilcclxuICAgICAgcmV0dXJuIHRoaXMubWcyZGlzcF8wKG1nVmFsdWUsIHJhbmdlU3RyLCBwaWMsIHVzZU5hdGl2ZSwgY29tcElkeE9yQWx3YXlzRmlsbCwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29tcElkeCk7XHJcblxyXG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNylcclxuICAgICAgcmV0dXJuIHRoaXMubWcyZGlzcF8xKG1nVmFsdWUsIHJhbmdlU3RyLCBwaWMsIHVzZU5hdGl2ZSwgY29tcElkeE9yQWx3YXlzRmlsbCwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29tcElkeCwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29udmVydENhc2UpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMubWcyZGlzcF8yKG1nVmFsdWUsIHJhbmdlU3RyLCBwaWMsIHVzZU5hdGl2ZSwgY29tcElkeE9yQWx3YXlzRmlsbCwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29tcElkeCwgdGltZV9kYXRlX3BpY19aX2VkdE9yQ29udmVydENhc2UsIHRpbWVfZGF0ZV9udW1fcGljX1pfZWR0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWcyZGlzcF8wKG1nVmFsdWU6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZywgcGljOiBQSUMsIHVzZU5hdGl2ZTogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyLCB0aW1lX2RhdGVfcGljX1pfZWR0OiBib29sZWFuKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm1nMmRpc3AobWdWYWx1ZSwgcmFuZ2VTdHIsIHBpYywgdXNlTmF0aXZlLCBmYWxzZSwgY29tcElkeCwgdGltZV9kYXRlX3BpY19aX2VkdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1nMmRpc3BfMShtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGFsd2F5c0ZpbGw6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlciwgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5tZzJkaXNwKG1nVmFsdWUsIHJhbmdlU3RyLCBwaWMsIHVzZU5hdGl2ZSwgYWx3YXlzRmlsbCwgY29tcElkeCwgZmFsc2UsIHRpbWVfZGF0ZV9waWNfWl9lZHQpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIG9mIGEgdmFsdWUgZnJvbSBpdHMgcGljdHVyZSBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWx1ZVwiPnRoZSBpbnRlcm5hbCB2YWx1ZSAoYXMgc2VudCBpbiB0aGUgWE1MKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmFuZ2VTdHJcIj52YWx1ZSByYW5nZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljXCI+dGhlIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhbHdheXNGaWxsXCI+QWx3YXlzIGF1dG8gZmlsbCBhbHBoYSBvdmVyIGl0cyBwaWN0dXJlICh1c2VkIGZvciBzZWxlY3QgY29udHJvbHMpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdHJpbmcgdG8gZGlzcGxheVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHVibGljIG1nMmRpc3BfMihtZ1ZhbHVlOiBzdHJpbmcsIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCB1c2VOYXRpdmU6IGJvb2xlYW4sIGFsd2F5c0ZpbGw6IGJvb2xlYW4sIGNvbXBJZHg6IG51bWJlciwgY29udmVydENhc2U6IGJvb2xlYW4sIHRpbWVfZGF0ZV9udW1fcGljX1pfZWR0OiBib29sZWFuKTogYW55IHtcclxuICAgIGxldCBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgdG1wUmFuZ2U6IHN0cmluZyA9IChyYW5nZVN0ciA9PT0gbnVsbCkgPyBcIlwiIDogcmFuZ2VTdHI7XHJcblxyXG4gICAgc3dpdGNoIChwaWMuZ2V0QXR0cigpKSB7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIHN0ciA9IHRoaXMuZnJvbUFscGhhKG1nVmFsdWUsIHBpYywgdG1wUmFuZ2UsIGFsd2F5c0ZpbGwsIGNvbnZlcnRDYXNlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOiB7XHJcblxyXG4gICAgICAgIC8vIE5vdywgY3VycmVjeSBkaXJlY3RpdmUgc3VwcG9ydGVkLCBidXQgdGhpcyB3aWxsIGJlIGhhbmRsZWQgYnkgYW5ndWxhciBwYWNrYWdlcyBsaWtlIG5nLWN1cnJlbmN5XHJcbiAgICAgICAgLy8gaGVyZSBpdCBzaG91bGQgc2ltcGx5IHBhc3MgdGhlIGFjdHVhbCBuYXRpdmUgdmFsdWUgb2YgbnVtYmVyIGFuZCBtYXNrcyBzaG91bGQgbm90IGJlIGFwcGxpZWRcclxuICAgICAgICAvLyBTbywgcHJlcGFyZSB0ZW1wb3JhcnkgcGljdHVyZSB0byBnZW5lcmF0ZSBuYXRpdmUgdmFsdWUuXHJcbiAgICAgICAgbGV0ICBuZXdQaWMgPSBwaWMuZ2V0VW5mb3JtYXR0ZWROdW1lcmljUGljKCk7XHJcblxyXG4gICAgICAgIC8vc3RvcmUgYW5kIHJlc3RvcmUgZGVjaW1hbCBzZXAgYW5kIHRob3UuIHNlcFxyXG4gICAgICAgIGxldCAgZGVjOiBzdHJpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXREZWNpbWFsKCk7XHJcbiAgICAgICAgbGV0IHRob3U6c3RyaW5nICA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFRob3VzYW5kcygpO1xyXG5cclxuICAgICAgICAvL3NldCBkZWZhdWx0IHZhbHVlc1xyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldERlY2ltYWxTZXBhcmF0b3IoJy4nKTtcclxuICAgICAgICBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5zZXRUaG91c2FuZHNTZXBhcmF0b3IoJywnKTtcclxuXHJcbiAgICAgICAgc3RyID0gdGhpcy5mcm9tTnVtKG1nVmFsdWUsIG5ld1BpYyk7XHJcbiAgICAgICAgR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuc2V0RGVjaW1hbFNlcGFyYXRvcihkZWMpO1xyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldFRob3VzYW5kc1NlcGFyYXRvcih0aG91KTtcclxuICAgICAgICAvLyBWYWx1ZSBzaG91bGQgYmUgdHJpbW1lZCB3aGVuIHdlIGFyZSBkaXNwbGF5aW5nIGNvbnRyb2wgaW4gb3JkZXIgdG8gZGlzcGxheSBhbGlnbm1lbnQgcHJvcGVybHkuIEJ1dCB3aGlsZSBlbnRlcmluZyBjb250cm9sLCBpdCBzaG91bGQgbm90IGJlIHRyaW1tZWRcclxuICAgICAgICAvLyBpbiBvcmRlciB0byByZWFkIGl0IHByb3Blcmx5LlxyXG4gICAgICAgIGlmIChuZXdQaWMuZ2V0TWFza0NoYXJzKCkgPT09IDAgfHwgIXRpbWVfZGF0ZV9udW1fcGljX1pfZWR0KVxyXG4gICAgICAgICAgc3RyID0gU3RyVXRpbC5sdHJpbShzdHIpO1xyXG5cclxuICAgICAgICBpZiAodXNlTmF0aXZlKSB7XHJcbiAgICAgICAgICBpZiAoc3RyID09IFwiXCIpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICAgIGxldCBkYmw6IG51bWJlciA9IE51bWJlcihzdHIpO1xyXG4gICAgICAgICAgcmV0dXJuIGRibDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURToge1xyXG4gICAgICAgIGlmICh1c2VOYXRpdmUpIHtcclxuICAgICAgICAgIGxldCBkdDogRGF0ZTtcclxuICAgICAgICAgIGR0ID0gdGhpcy5mcm9tTWdEYXRlVG9OYXRpdmVEYXRlKG1nVmFsdWUsIGNvbXBJZHgpO1xyXG4gICAgICAgICAgcmV0dXJuIGR0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHN0ciA9IHRoaXMuZnJvbURhdGUobWdWYWx1ZSwgcGljLCBjb21wSWR4LCB0aW1lX2RhdGVfbnVtX3BpY19aX2VkdCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6IHtcclxuICAgICAgICBpZiAodXNlTmF0aXZlKSB7XHJcbiAgICAgICAgICBsZXQgZHQ6IERhdGU7XHJcbiAgICAgICAgICBkdCA9IHRoaXMuZnJvbU1nVGltZVRvTmF0aXZlVGltZShtZ1ZhbHVlLCBwaWMsIHRpbWVfZGF0ZV9udW1fcGljX1pfZWR0KTtcclxuICAgICAgICAgIHJldHVybiBkdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBzdHIgPSB0aGlzLmZyb21UaW1lKG1nVmFsdWUsIHBpYywgdGltZV9kYXRlX251bV9waWNfWl9lZHQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOiB7XHJcbiAgICAgICAgbGV0IGxvZ1ZhbDogYm9vbGVhbjtcclxuICAgICAgICBsb2dWYWwgPSB0aGlzLmZyb21NZ0xvZ2ljYWxUb05hdGl2ZUxvZ2ljYWwobWdWYWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIGxvZ1ZhbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgc3RyID0gQmxvYlR5cGUuZ2V0U3RyaW5nKG1nVmFsdWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgc3RyID0gbWdWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBzdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBkaXNwbGF5IHZhbHVlIGZyb20gaXRzIHBpY3R1cmUgZm9ybWF0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPnRoZSB2YWx1ZSBhcyBlbnRlcmVkIGJ5IHVzZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+dmFsdWUgcmFuZ2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPnRoZSBwaWN0dXJlIGZvcm1hdFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvYkNvbnRlbnRUeXBlXCI+aWYgdGhlIGF0dHJpYnV0ZSBpcyBibG9iLCBpdHMgY29udGVudCB0eXBlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBpbnRlcm5hbCBmb3JtIG9mIGRhdGEgKGFzIHVzZWQgaW4gdGhlIFhNTClcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGRpc3AybWcoZGlzcFZhbHVlOiBhbnksIHJhbmdlU3RyOiBzdHJpbmcsIHBpYzogUElDLCBjb21wSWR4OiBudW1iZXIsIGJsb2JDb250ZW50VHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBzdHI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgc3dpdGNoIChwaWMuZ2V0QXR0cigpKSB7XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgc3RyID0gdGhpcy50b0FscGhhKGRpc3BWYWx1ZSwgcGljKTtcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzoge1xyXG4gICAgICAgIGRpc3BWYWx1ZSA9IFN0cmluZyhkaXNwVmFsdWUpO1xyXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgbWFzayBmcm9tIGRpc3BsYXkgdmFsdWUuXHJcbiAgICAgICAgbGV0IGxlbjogbnVtYmVyID0gZGlzcFZhbHVlLmxlbmd0aDtcclxuICAgICAgICB3aGlsZSAobGVuID4gMCkge1xyXG4gICAgICAgICAgaWYgKCFwaWMucGljSXNNYXNrKGxlbiAtIDEpICYmIGRpc3BWYWx1ZVtsZW4gLSAxXSAhPT0gKCcgJykpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgbGVuLS07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwVmFsdWUubGVuZ3RoID4gbGVuKVxyXG4gICAgICAgICAgZGlzcFZhbHVlID0gTlN0cmluZy5SZW1vdmUoZGlzcFZhbHVlLCBsZW4sIChkaXNwVmFsdWUubGVuZ3RoIC0gbGVuKSk7XHJcblxyXG4gICAgICAgIGlmIChwaWMuaXNOZWdhdGl2ZSgpICYmIGRpc3BWYWx1ZS50cmltKCkuc3RhcnRzV2l0aChcIi1cIikpXHJcbiAgICAgICAgICBkaXNwVmFsdWUgPSBTdHJVdGlsLmx0cmltKGRpc3BWYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vc3RvcmUgYW5kIHJlc3RvcmUgZGVjaW1hbCBzZXAgYW5kIHRob3UuIHNlcFxyXG4gICAgICAgIGxldCAgZGVjOiBzdHJpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXREZWNpbWFsKCk7XHJcbiAgICAgICAgbGV0IHRob3U6c3RyaW5nICA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldFRob3VzYW5kcygpO1xyXG5cclxuICAgICAgICAvL3NldCBkZWZhdWx0IHZhbHVlc1xyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldERlY2ltYWxTZXBhcmF0b3IoJy4nKTtcclxuICAgICAgICBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5zZXRUaG91c2FuZHNTZXBhcmF0b3IoJywnKTtcclxuXHJcbiAgICAgICAgLy8gTm93LCBjdXJyZWN5IGRpcmVjdGl2ZSBzdXBwb3J0ZWQsIGJ1dCB0aGlzIHdpbGwgYmUgaGFuZGxlZCBieSBhbmd1bGFyIHBhY2thZ2VzIGxpa2UgbmctY3VycmVuY3lcclxuICAgICAgICAvLyBoZXJlIGl0IHNob3VsZCBzaW1wbHkgcGFzcyB0aGUgYWN0dWFsIG5hdGl2ZSB2YWx1ZSBvZiBudW1iZXIgYW5kIG1hc2tzIHNob3VsZCBub3QgYmUgYXBwbGllZFxyXG4gICAgICAgIC8vIFNvLCBwcmVwYXJlIHRlbXBvcmFyeSBwaWN0dXJlIHRvIGdlbmVyYXRlIG5hdGl2ZSB2YWx1ZS5cclxuICAgICAgICBsZXQgIG5ld1BpYyA9IHBpYy5nZXRVbmZvcm1hdHRlZE51bWVyaWNQaWMoKTtcclxuXHJcbiAgICAgICAgc3RyID0gdGhpcy50b051bShkaXNwVmFsdWUsIG5ld1BpYywgY29tcElkeCk7XHJcblxyXG4gICAgICAgIEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LnNldERlY2ltYWxTZXBhcmF0b3IoZGVjKTtcclxuICAgICAgICBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5zZXRUaG91c2FuZHNTZXBhcmF0b3IodGhvdSk7XHJcbiAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAge1xyXG4gICAgICAgIGxldCBkdDogRGF0ZTtcclxuICAgICAgICAvL3doZW4gZGF0ZSBpcyBpbiBpdGVtIGxpc3QgZm9yIGNob2ljZSBjdHJsLCBpdCB3aWxsIGNvbWUgaGVyZSBhcyBzdHJpbmcuIHNvIGNvbnZlcnQgaXQgdG8gRGF0ZS5cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3BWYWx1ZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICBkdCA9IG5ldyBEYXRlIChkaXNwVmFsdWUpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGR0ID0gZGlzcFZhbHVlO1xyXG4gICAgICAgIHN0ciA9IHRoaXMuZnJvbU5hdGl2ZURhdGVUb01nRGF0ZShkdCwgcGljLCBjb21wSWR4KTtcclxuICAgICAgfVxyXG4gICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRToge1xyXG4gICAgICAgIGxldCBkdDogRGF0ZTtcclxuXHJcbiAgICAgICAgLy93aGVuIGRhdGUgaXMgaW4gaXRlbSBsaXN0IGZvciBjaG9pY2UgY3RybCwgaXQgd2lsbCBjb21lIGhlcmUgYXMgc3RyaW5nLiBzbyBjb252ZXJ0IGl0IHRvIERhdGUuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwVmFsdWUgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGR0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgIGlmIChkaXNwVmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZHQuc2V0SG91cnMoK1N0cmluZyhkaXNwVmFsdWUpLnN1YnN0cigwLCAyKSk7XHJcbiAgICAgICAgICAgIGR0LnNldE1pbnV0ZXMoK1N0cmluZyhkaXNwVmFsdWUpLnN1YnN0cigwLCAyKSk7XHJcbiAgICAgICAgICAgIGlmIChTdHJpbmcoZGlzcFZhbHVlKS5sZW5ndGggPiA1KVxyXG4gICAgICAgICAgICAgIGR0LnNldFNlY29uZHMoK1N0cmluZyhkaXNwVmFsdWUpLnN1YnN0cigwLCAyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBkdCA9IGRpc3BWYWx1ZTtcclxuXHJcbiAgICAgICAgc3RyID0gdGhpcy5mcm9tTmF0aXZlVGltZVRvTWdUaW1lKGR0LCBwaWMpO1xyXG4gICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgICAgc3RyID0gdGhpcy5mcm9tTmF0aXZlTG9naWNhbFRvTWdMb2dpY2FsKGRpc3BWYWx1ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgICAgc3RyID0gQmxvYlR5cGUuY3JlYXRlRnJvbVN0cmluZyhkaXNwVmFsdWUsIGJsb2JDb250ZW50VHlwZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyAgTWV0aG9kcyBmb3IgY292ZXJ0aW5nIElOVEVSTkFMIC0tLT4gRElQTEFZXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZXMgbWFnaWMgbnVtYmVyIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nTnVtXCI+ICAgQSBNYWdpYyBOdW1iZXI8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICBUaGUgcGljdHVyZSB0byB1c2U8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgcHVibGljIGZyb21OdW0obWdWYWx1ZTogc3RyaW5nLCBwaWM6IFBJQyk6IHN0cmluZyB7XHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKG1nVmFsdWUpO1xyXG4gICAgcmV0dXJuIG1nTnVtLnRvRGlzcGxheVZhbHVlKHBpYyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gYWxwaGEgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGFcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPiAgVGhlIHJhbmdlIG9mIHZhbHVlcyB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWx3YXlzRmlsbFwiPkFsd2F5cyBhdXRvIGZpbGwgYWxwaGEgb3ZlciBpdHMgcGljdHVyZSAodXNlZCBmb3Igc2VsZWN0IGNvbnRyb2xzKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZnJvbUFscGhhKGRhdGFTdHI6IHN0cmluZywgcGljOiBQSUMsIHJhbmdlU3RyOiBzdHJpbmcsIGFsd2F5c0ZpbGw6IGJvb2xlYW4sIGNvbnZlcnRDYXNlOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBsZW46IG51bWJlciA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG4gICAgbGV0IG1pbl9sZW46IG51bWJlciA9IGxlbjtcclxuICAgIGxldCBtYXNrU3RyOiBzdHJpbmcgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgbGV0IHJlc1N0cjogc3RyaW5nO1xyXG5cclxuICAgIGlmIChwaWMuZ2V0TWFza0NoYXJzKCkgPiAwKSB7XHJcbiAgICAgIHJlc1N0ciA9IHRoaXMud2luX2RhdGFfY3B5KE5TdHJpbmcuVG9DaGFyQXJyYXkobWFza1N0ciksIGxlbiwgTlN0cmluZy5Ub0NoYXJBcnJheShkYXRhU3RyKSwgcGljLmlzQXR0ckFscGhhKCksIGNvbnZlcnRDYXNlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBwaWMuaXNBdHRyQWxwaGEoKSlcclxuICAgICAgLy8gSlBOOiBEQkNTIHN1cHBvcnRcclxuICAgICAge1xyXG4gICAgICAgIC8vIHN1YnN0cmluZyBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzXHJcbiAgICAgICAgbGV0IGludERhdGFTdHJMZW5COiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQihkYXRhU3RyKTtcclxuICAgICAgICBpZiAobWluX2xlbiA+IGludERhdGFTdHJMZW5CKSB7XHJcbiAgICAgICAgICBtaW5fbGVuID0gaW50RGF0YVN0ckxlbkI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc1N0ciA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihkYXRhU3RyLCBtaW5fbGVuKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChkYXRhU3RyICE9PSBudWxsKSB7XHJcbiAgICAgICAgaWYgKG1pbl9sZW4gPiBkYXRhU3RyLmxlbmd0aCkge1xyXG4gICAgICAgICAgbWluX2xlbiA9IGRhdGFTdHIubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udmVydENhc2UpIHtcclxuICAgICAgICAgIHJlc1N0ciA9IHRoaXMud2luX2RhdGFfY3B5KE5TdHJpbmcuVG9DaGFyQXJyYXkobWFza1N0ciksIGxlbiwgTlN0cmluZy5Ub0NoYXJBcnJheShkYXRhU3RyKSwgcGljLmlzQXR0ckFscGhhKCksIGNvbnZlcnRDYXNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICByZXNTdHIgPSBkYXRhU3RyLnN1YnN0cigwLCBtaW5fbGVuKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBXZSBkbyBub3QgZmlsbCBBbHBoYSBmaWxlZCBvdmVyIGNvbnRyb2wncyBwaWN0dXJlIGxlbmd0aCBRQ1IgIyAyOTU0MDhcclxuICAgIGlmIChhbHdheXNGaWxsIHx8IChyYW5nZVN0ciAhPT0gbnVsbCAmJiByYW5nZVN0ci5sZW5ndGggPiAwICYmIHJlc1N0ci5sZW5ndGggPCBsZW4pKSB7XHJcbiAgICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHNCYXNlID0gbmV3IFZhbGlkYXRpb25EZXRhaWxzQmFzZShyYW5nZVN0cik7XHJcbiAgICAgIGxldCBjb250aW51b3VzUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IHZkLmdldENvbnRpbnVvdXNSYW5nZVZhbHVlcygpO1xyXG4gICAgICBsZXQgZGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+ID0gdmQuZ2V0RGlzY3JldGVSYW5nZVZhbHVlcygpO1xyXG4gICAgICBpZiAoY29udGludW91c1JhbmdlVmFsdWVzICE9PSBudWxsIHx8IGRpc2NyZXRlUmFuZ2VWYWx1ZXMgIT09IG51bGwpIHtcclxuICAgICAgICByZXNTdHIgPSB0aGlzLmZpbGxBbHBoYUJ5UmFuZ2UoY29udGludW91c1JhbmdlVmFsdWVzLCBkaXNjcmV0ZVJhbmdlVmFsdWVzLCByZXNTdHIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzU3RyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYXNlQ29udmVydGVkQ2hhcihkYXRhOiBzdHJpbmcsIG1hc2s6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IGNoOiBzdHJpbmc7XHJcbiAgICBpZiAobWFzay5jaGFyQ29kZUF0KDApID09PSBQSUNJbnRlcmZhY2UuUElDX1UpIHtcclxuICAgICAgY2ggPSBkYXRhLnRvVXBwZXJDYXNlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKG1hc2suY2hhckNvZGVBdCgwKSA9PT0gUElDSW50ZXJmYWNlLlBJQ19MKSB7XHJcbiAgICAgICAgY2ggPSBkYXRhLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY2ggPSBkYXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2g7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdpbl9kYXRhX2NweShtYXNrU3RyOiBzdHJpbmdbXSwgbWFza0xlbjogbnVtYmVyLCBkYXRhU3RyOiBzdHJpbmdbXSwgaXNBdHRyQWxwaGE6IGJvb2xlYW4pOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSB3aW5fZGF0YV9jcHkobWFza1N0cjogc3RyaW5nW10sIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogc3RyaW5nW10sIGlzQXR0ckFscGhhOiBib29sZWFuLCBjb252ZXJ0Q2FzZTogYm9vbGVhbik6IHN0cmluZztcclxuICBwcml2YXRlIHdpbl9kYXRhX2NweShtYXNrU3RyOiBhbnksIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogYW55LCBpc0F0dHJBbHBoYTogYm9vbGVhbiwgY29udmVydENhc2U/OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0KVxyXG4gICAgICByZXR1cm4gdGhpcy53aW5fZGF0YV9jcHlfMChtYXNrU3RyLCBtYXNrTGVuLCBkYXRhU3RyLCBpc0F0dHJBbHBoYSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2luX2RhdGFfY3B5XzEobWFza1N0ciwgbWFza0xlbiwgZGF0YVN0ciwgaXNBdHRyQWxwaGEsIGNvbnZlcnRDYXNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgd2luX2RhdGFfY3B5XzAobWFza1N0cjogc3RyaW5nW10sIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogc3RyaW5nW10sIGlzQXR0ckFscGhhOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLndpbl9kYXRhX2NweShtYXNrU3RyLCBtYXNrTGVuLCBkYXRhU3RyLCBpc0F0dHJBbHBoYSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZXMgYWxwaGEgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWFza1N0clwiPiAgIFRoZSBtYXNrIHRvIGJlIHVzZWQgaW4gb3JkZXIgdG8gYnVpbGQgdGhlIHN0cmluZ1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgd2luX2RhdGFfY3B5XzEobWFza1N0cjogc3RyaW5nW10sIG1hc2tMZW46IG51bWJlciwgZGF0YVN0cjogc3RyaW5nW10sIGlzQXR0ckFscGhhOiBib29sZWFuLCBjb252ZXJ0Q2FzZTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWFza0lkeDogbnVtYmVyID0gMDtcclxuICAgIGxldCBkYXRhSWR4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHJlc1N0cjogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPihtYXNrTGVuKTtcclxuXHJcbiAgICBpZiAoaXNBdHRyQWxwaGEgJiYgVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICBsZXQgbnVtMjogbnVtYmVyID0gMDtcclxuICAgICAgd2hpbGUgKG1hc2tJZHggPCBtYXNrTGVuICYmIG51bTIgPCBtYXNrTGVuKSB7XHJcbiAgICAgICAgaWYgKG1hc2tTdHJbbWFza0lkeF0uY2hhckNvZGVBdCgwKSA8PSBQSUNJbnRlcmZhY2UuUElDX01BWF9PUCkge1xyXG4gICAgICAgICAgaWYgKGRhdGFJZHggPCBkYXRhU3RyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgc3RyVmFsOiBzdHJpbmcgPSBOU3RyaW5nLkZyb21DaGFycyhkYXRhU3RyLCBkYXRhSWR4LCAxKTtcclxuICAgICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0clZhbCkgPT09IDIpIHtcclxuICAgICAgICAgICAgICBpZiAobWFza0lkeCArIDEgPCBtYXNrTGVuKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFza1N0clttYXNrSWR4ICsgMV0uY2hhckNvZGVBdCgwKSA8PSBQSUNJbnRlcmZhY2UuUElDX01BWF9PUCkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY29udmVydENhc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9IHRoaXMuY2FzZUNvbnZlcnRlZENoYXIoZGF0YVN0cltkYXRhSWR4KytdLCBtYXNrU3RyW21hc2tJZHggKyAxXSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzU3RyW251bTIrK10gPSBkYXRhU3RyW2RhdGFJZHgrK107XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgbWFza0lkeCA9IG1hc2tJZHggKyAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlc1N0cltudW0yKytdID0gJyAnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc1N0cltudW0yKytdID0gJyAnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAoY29udmVydENhc2UpIHtcclxuICAgICAgICAgICAgICAgIHJlc1N0cltudW0yKytdID0gdGhpcy5jYXNlQ29udmVydGVkQ2hhcihkYXRhU3RyW2RhdGFJZHgrK10sIG1hc2tTdHJbbWFza0lkeCArIDFdKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9IGRhdGFTdHJbZGF0YUlkeCsrXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXNTdHJbbnVtMisrXSA9ICcgJy8qJyAnKi87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVzU3RyW251bTIrK10gPSBtYXNrU3RyW21hc2tJZHhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtYXNrSWR4ID0gbWFza0lkeCArIDE7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKHJlc1N0cikuc3Vic3RyKDAsIG51bTIpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlIChtYXNrSWR4IDwgbWFza0xlbikge1xyXG4gICAgICBpZiAobWFza1N0clttYXNrSWR4XS5jaGFyQ29kZUF0KDApIDw9IFBJQ0ludGVyZmFjZS5QSUNfTUFYX09QKSB7XHJcbiAgICAgICAgaWYgKGRhdGFJZHggPCBkYXRhU3RyLmxlbmd0aCkge1xyXG4gICAgICAgICAgcmVzU3RyW21hc2tJZHhdID0gZGF0YVN0cltkYXRhSWR4XTtcclxuICAgICAgICAgIGlmIChjb252ZXJ0Q2FzZSkge1xyXG4gICAgICAgICAgICByZXNTdHJbbWFza0lkeF0gPSB0aGlzLmNhc2VDb252ZXJ0ZWRDaGFyKGRhdGFTdHJbZGF0YUlkeF0sIG1hc2tTdHJbbWFza0lkeF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc1N0clttYXNrSWR4XSA9IGRhdGFTdHJbZGF0YUlkeF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXRhSWR4ID0gZGF0YUlkeCArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVzU3RyW21hc2tJZHhdID0gJyAnLyonICcqLztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmVzU3RyW21hc2tJZHhdID0gbWFza1N0clttYXNrSWR4XTtcclxuICAgICAgfVxyXG4gICAgICBtYXNrSWR4ID0gbWFza0lkeCArIDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMocmVzU3RyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIGZvciBhbiBkYXRlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgVGhlIHNvdXJjZSBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkPC9yZXR1cm5zPlxyXG4gIGZyb21EYXRlKGRhdGFTdHI6IHN0cmluZywgcGljOiBQSUMsIGNvbXBJZHg6IG51bWJlciwgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWFzazogc3RyaW5nID0gcGljLmdldE1hc2soKTtcclxuICAgIGxldCBtYXNrU2l6ZTogbnVtYmVyID0gcGljLmdldE1hc2tTaXplKCk7XHJcbiAgICBsZXQgZGF0ZTogbnVtYmVyID0gbmV3IE5VTV9UWVBFKGRhdGFTdHIpLk5VTV8yX1VMT05HKCk7XHJcbiAgICByZXR1cm4gdGhpcy50b19hX3BpY19kYXRlbW9kZShtYXNrLCBtYXNrU2l6ZSwgZGF0ZSwgcGljLCB0aW1lX2RhdGVfcGljX1pfZWR0LCBmYWxzZSwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gdGltZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFRoZSBzb3VyY2UgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBmcm9tVGltZShkYXRhU3RyOiBzdHJpbmcsIHBpYzogUElDLCB0aW1lX2RhdGVfcGljX1pfZWR0OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBtYXNrOiBzdHJpbmcgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgbGV0IG1hc2tTaXplOiBudW1iZXIgPSBwaWMuZ2V0TWFza1NpemUoKTtcclxuICAgIGxldCB0aW1lOiBudW1iZXIgPSBuZXcgTlVNX1RZUEUoZGF0YVN0cikuTlVNXzJfVUxPTkcoKTtcclxuICAgIHJldHVybiB0aGlzLnRpbWVfMl9hX3BpYyhtYXNrLCBtYXNrU2l6ZSwgdGltZSwgcGljLCB0aW1lX2RhdGVfcGljX1pfZWR0LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgYW4gZGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFRoZSBzb3VyY2UgZGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgVGhlIHBpY3R1cmUgdG8gdXNlIGZvciB0aGUgdmFsdWUgdG8gZGlzcGxheTwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZDwvcmV0dXJucz5cclxuICBmcm9tTWdEYXRlVG9OYXRpdmVEYXRlKGRhdGFTdHI6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogRGF0ZSB7XHJcblxyXG4gICAgbGV0IGRhdGU6IG51bWJlciA9IG5ldyBOVU1fVFlQRShkYXRhU3RyKS5OVU1fMl9VTE9ORygpO1xyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXM7XHJcbiAgICBsZXQgb3V0SWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIEJyZWFrIGRhdGEgaW50byBpdHMgY29tcG9uZW50c1xyXG4gICAgYnJlYWtQYXJhbXMgPSBuZXcgRGF0ZUJyZWFrUGFyYW1zKCk7XHJcbiAgICB0aGlzLmRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXMsIGRhdGUsIGZhbHNlLCBjb21wSWR4KTtcclxuICAgIGlmIChicmVha1BhcmFtcy5tb250aCA+IDApXHJcbiAgICAgIGJyZWFrUGFyYW1zLm1vbnRoID0gYnJlYWtQYXJhbXMubW9udGggLSAxOyAvL21vbnRoIGlzIDAgYmFzZWQgaW4gRGF0ZSBjbGFzc1xyXG5cclxuICAgIGlmIChicmVha1BhcmFtcy55ZWFyID09IDAgJiYgYnJlYWtQYXJhbXMubW9udGggPT0gMCAmJiBicmVha1BhcmFtcy5kYXkgPT0gMClcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgbmF0aXZlRHQ6IERhdGUgPSBuZXcgRGF0ZShicmVha1BhcmFtcy55ZWFyLCBicmVha1BhcmFtcy5tb250aCwgYnJlYWtQYXJhbXMuZGF5KTtcclxuXHJcbiAgICByZXR1cm4gbmF0aXZlRHQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGFuIGRhdGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBUaGUgc291cmNlIGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgIFRoZSBwaWN0dXJlIHRvIHVzZSBmb3IgdGhlIHZhbHVlIHRvIGRpc3BsYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQ8L3JldHVybnM+XHJcbiAgZnJvbU5hdGl2ZURhdGVUb01nRGF0ZU51bWJlcihuYXRpdmVEYXRlOiBEYXRlLCBwaWM6IFBJQywgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBudW1WYWw6IG51bWJlcjtcclxuICAgIGxldCBkYXRlUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXM7XHJcbiAgICBsZXQgbWlsbGVuaXVtOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHllYXI6IG51bWJlciA9IG5hdGl2ZURhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgIGxldCBkYXk6IG51bWJlciA9IG5hdGl2ZURhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgbGV0IG1vbnRoOiBudW1iZXIgPSBuYXRpdmVEYXRlLmdldE1vbnRoKCkgKyAxO1xyXG5cclxuICAgIC8vIEhlYnJldyBZZWFyXHJcbiAgICBpZiAocGljLmlzSGVicmV3KCkpIHtcclxuICAgICAgaWYgKHllYXIgPiAwKSB7XHJcbiAgICAgICAgaWYgKG1pbGxlbml1bSA9PT0gMClcclxuICAgICAgICAgIG1pbGxlbml1bSA9IDU7XHJcbiAgICAgICAgeWVhciArPSBtaWxsZW5pdW0gKiAxMDAwO1xyXG4gICAgICB9XHJcbiAgICAgIG51bVZhbCA9IChIZWJyZXdEYXRlLmRhdGVoZWJfMl9kKHllYXIsIG1vbnRoLCBkYXkpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyB0aGUgbmV4dCAyIGxpbmVzIHN1cHBvcnQgNC54eCBERC9NTSBwaWN0dXJlc1xyXG4gICAgICBpZiAoeWVhciA9PT0gMCkge1xyXG4gICAgICAgIGRhdGVQYXJhbXMgPSB0aGlzLmRhdGVfc3lzKCk7XHJcbiAgICAgICAgeWVhciA9IGRhdGVQYXJhbXMueWVhcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbnVtVmFsID0gdGhpcy5kYXRlXzRfY2FsZW5kZXIoeWVhciwgbW9udGgsIGRheSwgMCwgZmFsc2UpOyAgICAvLyB3ZSBhcmUgYWRkaW5nIGEgbGl0dGxlIGVtcHR5IHNwYWNlIHRvIHRoZSB2YXJpYWJsZSwgYmVjYXVzZSB3ZSBtaWdodCBsYXRlclxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bVZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIGZvciBhbiBkYXRlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgVGhlIHNvdXJjZSBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkPC9yZXR1cm5zPlxyXG4gIGZyb21OYXRpdmVEYXRlVG9NZ0RhdGUobmF0aXZlRGF0ZTogRGF0ZSwgcGljOiBQSUMsIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IG1nTnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgbGV0IG51bVZhbDogbnVtYmVyID0gbmF0aXZlRGF0ZSA9PSBudWxsID8gMCA6IHRoaXMuZnJvbU5hdGl2ZURhdGVUb01nRGF0ZU51bWJlcihuYXRpdmVEYXRlLCBwaWMsIGNvbXBJZHgpO1xyXG4gICAgbWdOdW0uTlVNXzRfTE9ORyhudW1WYWwpO1xyXG5cclxuICAgIHJldHVybiBtZ051bS50b1hNTHJlY29yZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSBkYXRlIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm91dFN0clwiPiAgICAgICAgICBUaGUgbWFzayB0byBiZSB1c2VkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvdXRfbGVuXCI+ICAgICAgICAgTWFzayBsZW5ndGhcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1wiPiAgICAgICAgICAgICBUaGUgcGljdXJlIGluZm9ybWF0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRlX3BpY19aX2VkdFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlX2R0X2ZtdFwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHRvX2FfcGljX2RhdGVtb2RlKG91dFN0cjogc3RyaW5nLCBvdXRfbGVuOiBudW1iZXIsIGRhdGU6IG51bWJlciwgcGljOiBQSUMsIGRhdGVfcGljX1pfZWR0OiBib29sZWFuLCBpZ25vcmVfZHRfZm10OiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGxlbjogbnVtYmVyO1xyXG4gICAgbGV0IGRheTogbnVtYmVyID0gMDtcclxuICAgIGxldCBkb3k6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZG93OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHllYXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbW9udGg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgaGRheTogbnVtYmVyID0gMDtcclxuICAgIGxldCBoeWVhcjogbnVtYmVyID0gMDtcclxuICAgIGxldCBobW9udGg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbGVhcDogQm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBwOiBzdHJpbmdbXTtcclxuICAgIGxldCBvdXRWYWw6IHN0cmluZ1tdID0gTlN0cmluZy5Ub0NoYXJBcnJheShvdXRTdHIpO1xyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXM7XHJcbiAgICBsZXQgZGF0ZU5hbWVQYXJhbXM6IERhdGVOYW1lUGFyYW1zO1xyXG4gICAgbGV0IG91dElkeDogbnVtYmVyID0gMDtcclxuICAgIGxldCBzdHJPdXQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgLy8gSWYgcmVzdWx0IG92ZXJmbG93cyByZXR1cm4gYnVmZmVyLCBmaWxsIHdpdGggYXN0ZXJpeHMgYW5kIGJhaWwgb3V0XHJcbiAgICBpZiAocGljLmdldE1hc2tTaXplKCkgPiBvdXRfbGVuKSB7XHJcbiAgICAgIGZvciAoOyBpIDwgb3V0X2xlbjsgaSsrKVxyXG4gICAgICAgIG91dFZhbFtpXSA9ICcqJztcclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKG91dFZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgemVybyBmaWxsIHJlcXVlc3RlZCBhbmQgZGF0ZSB2YWx1ZSBpcyB6ZXJvLCBmaWxsIGl0IGFuZCBiYWlsIG91dFxyXG4gICAgb3V0X2xlbiA9IGxlbiA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG4gICAgaWYgKHBpYy56ZXJvRmlsbCgpICYmIGRhdGUgPT09IDAgJiYgIWRhdGVfcGljX1pfZWR0KSB7XHJcbiAgICAgIGZvciAoOyBpIDwgb3V0X2xlbjsgaSsrKVxyXG4gICAgICAgIG91dFZhbFtpXSA9IHBpYy5nZXRaZXJvUGFkKCk7XHJcbiAgICAgIHJldHVybiBOU3RyaW5nLkZyb21DaGFycyhvdXRWYWwpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBpYy5pc0hlYnJldygpICYmIChkYXRlID09PSAwIHx8IGRhdGUgPT09IDEwMDAwMDAwMDApKSB7XHJcbiAgICAgIGZvciAoOyBpIDwgb3V0X2xlbjsgaSsrKVxyXG4gICAgICAgIG91dFZhbFtpXSA9ICcgJztcclxuICAgICAgcmV0dXJuIE5TdHJpbmcuRnJvbUNoYXJzKG91dFZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQnJlYWsgZGF0YSBpbnRvIGl0cyBjb21wb25lbnRzXHJcbiAgICBicmVha1BhcmFtcyA9IG5ldyBEYXRlQnJlYWtQYXJhbXMoeWVhciwgbW9udGgsIGRheSwgZG95LCBkb3cpO1xyXG4gICAgdGhpcy5kYXRlX2JyZWFrX2RhdGVtb2RlKGJyZWFrUGFyYW1zLCBkYXRlLCBpZ25vcmVfZHRfZm10LCBjb21wSWR4KTtcclxuICAgIGlmIChwaWMuaXNIZWJyZXcoKSkge1xyXG4gICAgICBsZXQgcmVmaGRheTogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbTxudW1iZXI+KGhkYXkpO1xyXG4gICAgICBsZXQgcmVmaG1vbnRoOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4oaG1vbnRoKTtcclxuICAgICAgbGV0IHJlZmh5ZWFyOiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4oaHllYXIpO1xyXG4gICAgICBsZWFwID0gSGVicmV3RGF0ZS5kYXRlaGViXzRfZChkYXRlLCByZWZoZGF5LCByZWZobW9udGgsIHJlZmh5ZWFyKTtcclxuXHJcbiAgICAgIGhkYXkgPSByZWZoZGF5LnZhbHVlO1xyXG4gICAgICBobW9udGggPSByZWZobW9udGgudmFsdWU7XHJcbiAgICAgIGh5ZWFyID0gcmVmaHllYXIudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgeWVhciA9IGJyZWFrUGFyYW1zLnllYXI7XHJcbiAgICBtb250aCA9IGJyZWFrUGFyYW1zLm1vbnRoO1xyXG4gICAgZGF5ID0gYnJlYWtQYXJhbXMuZGF5O1xyXG4gICAgZG95ID0gYnJlYWtQYXJhbXMuZG95O1xyXG4gICAgZG93ID0gYnJlYWtQYXJhbXMuZG93O1xyXG4gICAgYnJlYWtQYXJhbXMgPSBudWxsO1xyXG4gICAgd2hpbGUgKGxlbiA+IDApIHtcclxuICAgICAgbGV0IHJlZk91dExlbjogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbTxudW1iZXI+KG91dF9sZW4pO1xyXG4gICAgICBzd2l0Y2ggKG91dFZhbFtvdXRJZHhdLmNoYXJDb2RlQXQoMCkpIHtcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVk6XHJcbiAgICAgICAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiBkYXRlX3BpY19aX2VkdClcclxuICAgICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dElkeCwgcGljLmdldFplcm9QYWQoKSwgMik7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMiwgeWVhciwgJzAnKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSFlZWVlZOlxyXG4gICAgICAgICAgaSA9IEhlYnJld0RhdGUuZGF0ZWhlYl8yX3N0cihvdXRWYWwsIG91dElkeCwgbGVuLCByZWZPdXRMZW4sIDUsIGh5ZWFyLCBwaWMuaXNUcmltZWQoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICBvdXRfbGVuID0gcmVmT3V0TGVuLnZhbHVlO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IGk7XHJcbiAgICAgICAgICBsZW4gLT0gaTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ITDpcclxuICAgICAgICAgIGkgPSBIZWJyZXdEYXRlLmRhdGVoZWJfaV8yX2goKGh5ZWFyIC8gMTAwMCkgJSAxMCwgb3V0VmFsLCBvdXRJZHgsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICBvdXRJZHgrKztcclxuICAgICAgICAgIGxlbi0tO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hERDpcclxuICAgICAgICAgIGkgPSBIZWJyZXdEYXRlLmRhdGVoZWJfMl9zdHIob3V0VmFsLCBvdXRJZHgsIGxlbiwgcmVmT3V0TGVuLCAyLCBoZGF5LCBwaWMuaXNUcmltZWQoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgb3V0X2xlbiA9IHJlZk91dExlbi52YWx1ZTtcclxuICAgICAgICAgIG91dElkeCArPSBpO1xyXG4gICAgICAgICAgbGVuIC09IGk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfWVlZWTpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCA0KTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCA0LCB5ZWFyLCAnMCcpO1xyXG4gICAgICAgICAgb3V0SWR4ICs9IDQ7XHJcbiAgICAgICAgICBsZW4gLT0gNDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19NTUQ6XHJcbiAgICAgICAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiBkYXRlX3BpY19aX2VkdClcclxuICAgICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dElkeCwgcGljLmdldFplcm9QYWQoKSwgMik7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMiwgbW9udGgsICcwJyk7XHJcbiAgICAgICAgICBvdXRJZHggKz0gMjtcclxuICAgICAgICAgIGxlbiAtPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX01NTTpcclxuICAgICAgICAgIGlmIChwaWMuaXNIZWJyZXcoKSkge1xyXG4gICAgICAgICAgICBpZiAobGVhcCAmJiBobW9udGggPT09IDYpXHJcbiAgICAgICAgICAgICAgaG1vbnRoID0gMTQ7XHJcbiAgICAgICAgICAgIGxldCBtb250aE5hbWVzOiBzdHJpbmdbXSA9IEhlYnJld0RhdGUuR2V0TG9jYWxNb250aHMoKTtcclxuICAgICAgICAgICAgcCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkobW9udGhOYW1lc1tobW9udGhdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgbW9udGhTdHI6IHN0cmluZyA9IEV2ZW50cy5HZXRNZXNzYWdlU3RyaW5nKE1zZ0ludGVyZmFjZS5NT05USFNfUFRSKTtcclxuICAgICAgICAgICAgbGV0IG1vbnRoTmFtZXM6IHN0cmluZ1tdID0gRGF0ZVV0aWwuZ2V0TG9jYWxNb250aHMobW9udGhTdHIpO1xyXG4gICAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShtb250aE5hbWVzW21vbnRoXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG5ldyBEYXRlTmFtZVBhcmFtcyhvdXRWYWwsIG91dElkeCwgbGVuKTtcclxuICAgICAgICAgIG91dF9sZW4gLT0gdGhpcy5kYXRlX2lfMl9ubShkYXRlTmFtZVBhcmFtcywgcCwgcGljLmlzVHJpbWVkKCkpO1xyXG4gICAgICAgICAgb3V0SWR4ID0gZGF0ZU5hbWVQYXJhbXMub3V0SWR4O1xyXG4gICAgICAgICAgbGVuID0gZGF0ZU5hbWVQYXJhbXMubGVuO1xyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REOlxyXG4gICAgICAgICAgbGV0IGlzWmVybzogYm9vbGVhbiA9IHBpYy56ZXJvRmlsbCgpO1xyXG4gICAgICAgICAgaWYgKGlzWmVybyAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAyKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAyLCBkYXksICcwJyk7XHJcbiAgICAgICAgICBvdXRJZHggKz0gMjtcclxuICAgICAgICAgIGxlbiAtPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0RERDpcclxuICAgICAgICAgIGlmIChwaWMuemVyb0ZpbGwoKSAmJiBkYXRlID09PSAwICYmIGRhdGVfcGljX1pfZWR0KVxyXG4gICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KG91dFZhbCwgb3V0SWR4LCBwaWMuZ2V0WmVyb1BhZCgpLCAzKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKG91dFZhbCwgb3V0SWR4LCAzLCBkb3ksICcwJyk7XHJcbiAgICAgICAgICBsZW4gLT0gMztcclxuICAgICAgICAgIG91dElkeCArPSAzO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0REREQ6XHJcbiAgICAgICAgICBpID0gdGhpcy5kYXRlXzJfRERERChkYXksIG91dFZhbCwgb3V0SWR4LCBsZW4sIHBpYy5pc1RyaW1lZCgpKTtcclxuICAgICAgICAgIG91dElkeCArPSBpO1xyXG4gICAgICAgICAgb3V0X2xlbiArPSBpIC0gNDtcclxuICAgICAgICAgIGxlbiAtPSA0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1c6XHJcbiAgICAgICAgICBpZiAocGljLnplcm9GaWxsKCkgJiYgZGF0ZSA9PT0gMCAmJiBkYXRlX3BpY19aX2VkdClcclxuICAgICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChvdXRWYWwsIG91dElkeCwgcGljLmdldFplcm9QYWQoKSwgMSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMSwgZG93LCAnMCcpO1xyXG4gICAgICAgICAgbGVuLS07XHJcbiAgICAgICAgICBvdXRJZHgrKztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19XV1c6XHJcbiAgICAgICAgICBpZiAocGljLmlzSGVicmV3KCkpIHtcclxuICAgICAgICAgICAgbGV0IGRvd3NOYW1lczogc3RyaW5nW10gPSBIZWJyZXdEYXRlLkdldExvY2FsRG93cygpO1xyXG4gICAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShkb3dzTmFtZXNbZG93XSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGRheVN0cjogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLkRBWVNfUFRSKTtcclxuICAgICAgICAgICAgbGV0IGRheU5hbWVzOiBzdHJpbmdbXSA9IERhdGVVdGlsLmdldExvY2FsRGF5cyhkYXlTdHIpO1xyXG4gICAgICAgICAgICBwID0gTlN0cmluZy5Ub0NoYXJBcnJheShkYXlOYW1lc1tkb3ddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbmV3IERhdGVOYW1lUGFyYW1zKG91dFZhbCwgb3V0SWR4LCBsZW4pO1xyXG4gICAgICAgICAgb3V0X2xlbiAtPSB0aGlzLmRhdGVfaV8yX25tKGRhdGVOYW1lUGFyYW1zLCBwLCBwaWMuaXNUcmltZWQoKSk7XHJcbiAgICAgICAgICBvdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHg7XHJcbiAgICAgICAgICBsZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW47XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfQkI6IC8vIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAgICAgICAgIC8vIEphcGFuZXNlIGRheSBvZiB0aGUgd2Vla1xyXG4gICAgICAgICAgcCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoVXRpbERhdGVKcG4uZ2V0U3RyRG93KGRvdykpO1xyXG4gICAgICAgICAgc3RyT3V0ID0gbnVsbDtcclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbmV3IERhdGVOYW1lUGFyYW1zKG91dFZhbCwgb3V0SWR4LCBsZW4pO1xyXG4gICAgICAgICAgc3RyT3V0ID0gdGhpcy5kYXRlX2lfMl9ubV9ieXRlbW9kZShzdHJPdXQsIGRhdGVOYW1lUGFyYW1zLCBOU3RyaW5nLkZyb21DaGFycyhwKSwgb3V0X2xlbik7XHJcbiAgICAgICAgICBvdXRWYWwgPSBuZXcgQXJyYXkoc3RyT3V0Lmxlbmd0aCk7XHJcbiAgICAgICAgICBOU3RyaW5nLkNvcHlUbyhzdHJPdXQsIDAsIG91dFZhbCwgMCwgc3RyT3V0Lmxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgb3V0SWR4ID0gZGF0ZU5hbWVQYXJhbXMub3V0SWR4O1xyXG4gICAgICAgICAgbGVuID0gZGF0ZU5hbWVQYXJhbXMubGVuO1xyXG4gICAgICAgICAgc3RyT3V0ID0gbnVsbDtcclxuICAgICAgICAgIGRhdGVOYW1lUGFyYW1zID0gbnVsbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19KWTE6XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0pZMjpcclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSlk0OlxyXG4gICAgICAgICAgLy8gSmFwYW5lc2UgdGhlIG5hbWUgb2YgYW4gZXJhXHJcbiAgICAgICAgICBsZXQgc3RyTnVtOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgICAgaWYgKG91dFZhbFtvdXRJZHhdLmNoYXJDb2RlQXQoMCkgPT09IFBJQ0ludGVyZmFjZS5QSUNfSlkxKVxyXG4gICAgICAgICAgICBzdHJOdW0gPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmRhdGVfanBuX3lyXzJfYSh5ZWFyLCBkb3ksIGZhbHNlKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgc3RyTnVtID0gVXRpbERhdGVKcG4uZ2V0SW5zdGFuY2UoKS5kYXRlX2pwbl95cl8yX2EoeWVhciwgZG95LCB0cnVlKTtcclxuICAgICAgICAgIHN0ck91dCA9IG51bGw7XHJcbiAgICAgICAgICBkYXRlTmFtZVBhcmFtcyA9IG5ldyBEYXRlTmFtZVBhcmFtcyhvdXRWYWwsIG91dElkeCwgbGVuKTtcclxuICAgICAgICAgIHN0ck91dCA9IHRoaXMuZGF0ZV9pXzJfbm1fYnl0ZW1vZGUoc3RyT3V0LCBkYXRlTmFtZVBhcmFtcywgc3RyTnVtLCBvdXRfbGVuKTtcclxuICAgICAgICAgIG91dFZhbCA9IG51bGw7XHJcbiAgICAgICAgICBvdXRWYWwgPSBuZXcgQXJyYXkoc3RyT3V0Lmxlbmd0aCk7XHJcbiAgICAgICAgICBOU3RyaW5nLkNvcHlUbyhzdHJPdXQsIDAsIG91dFZhbCwgMCwgc3RyT3V0Lmxlbmd0aCk7XHJcbiAgICAgICAgICBvdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHg7XHJcbiAgICAgICAgICBsZW4gPSBkYXRlTmFtZVBhcmFtcy5sZW47XHJcbiAgICAgICAgICBzdHJPdXQgPSBudWxsO1xyXG4gICAgICAgICAgZGF0ZU5hbWVQYXJhbXMgPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX1lKOlxyXG4gICAgICAgICAgaWYgKHBpYy56ZXJvRmlsbCgpICYmIGRhdGUgPT09IDAgJiYgZGF0ZV9waWNfWl9lZHQpXHJcbiAgICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRJZHgsIHBpYy5nZXRaZXJvUGFkKCksIDIpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDIsIFV0aWxEYXRlSnBuLmdldEluc3RhbmNlKCkuZGF0ZV9qcG5feWVhcl9vZnMoeWVhciwgZG95KSwgJzAnKTtcclxuICAgICAgICAgIG91dElkeCArPSAyO1xyXG4gICAgICAgICAgbGVuIC09IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgb3V0SWR4Kys7XHJcbiAgICAgICAgICBsZW4tLTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAob3V0X2xlbiA8IG91dFZhbC5sZW5ndGgpXHJcbiAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQob3V0VmFsLCBvdXRfbGVuLCAnICcsIG91dFZhbC5sZW5ndGggLSBvdXRfbGVuKTtcclxuXHJcbiAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMob3V0VmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCcmVhayBhIGRhdGUgaW50byBZZWFyLCBNb250aCwgRGF5IGluIG1vbnRoLCBEYXkgaW4geWVhciBhbmQgRGF5IGluIHdlZWtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGRhdGVfYnJlYWtfZGF0ZW1vZGUoYnJlYWtQYXJhbXM6IERhdGVCcmVha1BhcmFtcywgZGF0ZTogbnVtYmVyLCBpZ25vcmVfZHRfZm10OiBib29sZWFuLCBjb21wSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgeWVhcjogbnVtYmVyID0gYnJlYWtQYXJhbXMueWVhcjtcclxuICAgIGxldCBtb250aDogbnVtYmVyID0gYnJlYWtQYXJhbXMubW9udGg7XHJcbiAgICBsZXQgZGF5OiBudW1iZXIgPSBicmVha1BhcmFtcy5kYXk7XHJcbiAgICBsZXQgZG95OiBudW1iZXIgPSBicmVha1BhcmFtcy5kb3k7XHJcbiAgICBsZXQgZG93OiBudW1iZXIgPSBicmVha1BhcmFtcy5kb3c7XHJcblxyXG4gICAgaWYgKGRhdGUgPD0gMCkge1xyXG4gICAgICBicmVha1BhcmFtcy5kYXkgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5kb3kgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy5kb3cgPSAwO1xyXG4gICAgICBicmVha1BhcmFtcy55ZWFyID0gMDtcclxuICAgICAgYnJlYWtQYXJhbXMubW9udGggPSAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGRvdyA9IGRhdGUgJSA3ICsgMTtcclxuICAgICAgZGF0ZSA9IGRhdGUgLSAxO1xyXG4gICAgICBsZXQgY2VudDQ6IG51bWJlciA9IE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5GT1VSQ0VOVCk7XHJcbiAgICAgIGRhdGUgPSBkYXRlIC0gY2VudDQgKiBQSUNJbnRlcmZhY2UuREFZU0lORk9VUkNFTlQ7XHJcbiAgICAgIGxldCBjZW50OiBudW1iZXIgPSBNYXRoLmZsb29yKGRhdGUgLyBQSUNJbnRlcmZhY2UuREFZU0lOQ0VOVFVSWSk7XHJcbiAgICAgIGlmIChjZW50ID4gMykge1xyXG4gICAgICAgIGNlbnQgPSAzO1xyXG4gICAgICB9XHJcbiAgICAgIGRhdGUgPSBkYXRlIC0gY2VudCAqIFBJQ0ludGVyZmFjZS5EQVlTSU5DRU5UVVJZO1xyXG4gICAgICBsZXQgeWVhcjQ6IG51bWJlciA9IE1hdGguZmxvb3IoZGF0ZSAvIFBJQ0ludGVyZmFjZS5EQVlTSU5GT1VSWUVBUik7XHJcbiAgICAgIGRhdGUgPSBkYXRlIC0geWVhcjQgKiBQSUNJbnRlcmZhY2UuREFZU0lORk9VUllFQVI7XHJcbiAgICAgIHllYXIgPSBNYXRoLmZsb29yKGRhdGUgLyBQSUNJbnRlcmZhY2UuREFZU0lOWUVBUik7XHJcbiAgICAgIGlmICh5ZWFyID4gMykge1xyXG4gICAgICAgIHllYXIgPSAzO1xyXG4gICAgICB9XHJcbiAgICAgIGRhdGUgPSBkYXRlIC0geWVhciAqIFBJQ0ludGVyZmFjZS5EQVlTSU5ZRUFSO1xyXG4gICAgICB5ZWFyID0gY2VudDQgKiA0MDAgKyBjZW50ICogMTAwICsgeWVhcjQgKiA0ICsgeWVhciArIDE7XHJcbiAgICAgIGxldCBsZWFweWVhcjogbnVtYmVyID0gMDtcclxuICAgICAgaWYgKHllYXIgJSA0ID09PSAwKSB7XHJcbiAgICAgICAgaWYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMCkge1xyXG4gICAgICAgICAgbGVhcHllYXIgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFpZ25vcmVfZHRfZm10ICYmIHRoaXMuX2Vudmlyb25tZW50LkdldERhdGVNb2RlKGNvbXBJZHgpID09PSAnQicpIHtcclxuICAgICAgICB5ZWFyID0geWVhciArIFBJQ0ludGVyZmFjZS5EQVRFX0JVRERISVNUX0dBUDtcclxuICAgICAgfVxyXG4gICAgICBtb250aCA9IChNYXRoLmZsb29yKGRhdGUgLyBQSUNJbnRlcmZhY2UuREFZU0lOTU9OVEgpICsgMSk7XHJcbiAgICAgIGRheSA9IFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbbW9udGhdO1xyXG4gICAgICBpZiAobGVhcHllYXIgPiAwKSB7XHJcbiAgICAgICAgaWYgKG1vbnRoID4gMSkge1xyXG4gICAgICAgICAgZGF5ID0gZGF5ICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkYXRlID49IGRheSkge1xyXG4gICAgICAgIG1vbnRoID0gbW9udGggKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGRheSA9IFBJQ0ludGVyZmFjZS5kYXRlX2RheV90YWJbbW9udGggLSAxXTtcclxuICAgICAgICBpZiAobGVhcHllYXIgPiAwKSB7XHJcbiAgICAgICAgICBpZiAobW9udGggPiAyKSB7XHJcbiAgICAgICAgICAgIGRheSA9IGRheSArIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGRheSA9IGRhdGUgLSBkYXkgKyAxO1xyXG4gICAgICBkb3kgPSBkYXRlICsgMTtcclxuICAgICAgYnJlYWtQYXJhbXMueWVhciA9IHllYXI7XHJcbiAgICAgIGJyZWFrUGFyYW1zLm1vbnRoID0gbW9udGg7XHJcbiAgICAgIGJyZWFrUGFyYW1zLmRheSA9IGRheTtcclxuICAgICAgYnJlYWtQYXJhbXMuZG95ID0gZG95O1xyXG4gICAgICBicmVha1BhcmFtcy5kb3cgPSBkb3c7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGFscGhhIHN0cmluZyBmcm9tIGludCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJcIj4gICAgIHRoZSBvdXRwdXQgc3RyaW5nIChhcyBhbiBjaGFyIGFycmF5KVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyUG9zXCI+ICBzdGFydGluZyBwb3NpdGlvblxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGVuXCI+ICAgICBzdHJpbmcgbGVuZ3RoXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuXCI+ICAgICAgIHRoZSBudW1iZXIgdG8gY29udmVydFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGVhZFwiPiAgICBsZWFkaW5nIGNoYXJhY3RlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHJlc3VsdCBzdHJpbmcgbGVuZ3RoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGludF8yX2Eoc3RyOiBzdHJpbmdbXSwgc3RyUG9zOiBudW1iZXIsIGxlbjogbnVtYmVyLCBuOiBudW1iZXIsIGxlYWQ6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgbmVnOiBib29sZWFuID0gbiA8IDA7XHJcblxyXG4gICAgaWYgKGxlbiA8PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbiA9IE1hdGguYWJzKG4pO1xyXG4gICAgbGV0IHBvczogbnVtYmVyID0gbGVuO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgc3RyW3N0clBvcyArIChwb3MgPSBwb3MgLSAxKV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDQ4ICsgbiAlIDEwKTtcclxuICAgICAgbiA9IE1hdGguZmxvb3IobiAvIDEwKTtcclxuICAgIH1cclxuICAgIHdoaWxlIChwb3MgPiAwICYmIG4gPiAwKTtcclxuXHJcbiAgICBpZiAobmVnICYmIHBvcyA+IDApIHtcclxuICAgICAgc3RyW3N0clBvcyArIChwb3MgPSBwb3MgLSAxKV0gPSAnLScvKictJyovO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubGliX2FfZmlsbChzdHIsIHN0clBvcywgbGVuLCBwb3MsIGxlYWQuY2hhckNvZGVBdCgwKSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEZpbGwgdGhlIGNoYXIgYXJyYXkgZm9yIHRoZSBjb252ZXJ0aW5nIG9mIGludC0+c3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0clwiPiAgICAgdGhlIG91dHB1dCBzdHJpbmcgKGFzIGFuIGNoYXIgYXJyYXkpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJQb3NcIj4gIHN0YXJ0aW5nIHBvc2l0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZW5cIj4gICAgIHN0cmluZyBsZW5ndGhcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxlYWRcIj4gICAgbGVhZGluZyBjaGFyYWN0ZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZXN1bHQgc3RyaW5nIGxlbmd0aFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBsaWJfYV9maWxsKHN0cjogc3RyaW5nW10sIHN0clBvczogbnVtYmVyLCBsZW46IG51bWJlciwgcG9zOiBudW1iZXIsIGxlYWQ6IG51bWJlcik6IG51bWJlciB7XHJcblxyXG4gICAgaWYgKGxlYWQgPT09IDApIHtcclxuICAgICAgbGVuID0gbGVuIC0gcG9zO1xyXG5cclxuICAgICAgaWYgKGxlbiA+IDAgJiYgcG9zID4gMCkge1xyXG4gICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoc3RyLCBzdHJQb3MsIHN0ciwgcG9zLCBsZW4pO1xyXG4gICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoc3RyLCBzdHJQb3MgKyBsZW4sICcgJywgLyonICcqL3Bvcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAocG9zID4gMCkge1xyXG4gICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoc3RyLCBzdHJQb3MsIFN0cmluZy5mcm9tQ2hhckNvZGUobGVhZCksIHBvcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsZW47XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBpbmRleCB0byBOYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGVOYW1lUGFyYW1zXCI+ICBvdXRwdXQgc3RpbmcgZGV0YWlsc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibm1cIj4gICAgICAgICAgICAgIG5hbWVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRyaW1cIj4gICAgICAgICAgICBvdXRwdXQgc3RyaW5nIHNob3VsZCBiZSB0cmltZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZ1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBkYXRlX2lfMl9ubShkYXRlTmFtZVBhcmFtczogRGF0ZU5hbWVQYXJhbXMsIG5tOiBzdHJpbmdbXSwgdHJpbTogYm9vbGVhbik6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IG46IG51bWJlciA9IHRoaXMuZGF0ZV9tc2tfY250KGRhdGVOYW1lUGFyYW1zLm91dFZhbCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4LCA8bnVtYmVyPmRhdGVOYW1lUGFyYW1zLmxlbik7XHJcbiAgICBsZXQgbDogbnVtYmVyO1xyXG4gICAgaWYgKHRyaW0pIHtcclxuICAgICAgbCA9IE1lbW9yeVV0aWwubWVtX3RyaW0obm0sIDAsIG4pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGwgPSBuO1xyXG4gICAgfVxyXG4gICAgbCA9IE1hdGgubWluKGwsIGRhdGVOYW1lUGFyYW1zLmxlbik7XHJcbiAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KGRhdGVOYW1lUGFyYW1zLm91dFZhbCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4LCBubSwgMCwgbCk7XHJcbiAgICBkYXRlTmFtZVBhcmFtcy5vdXRJZHggPSBkYXRlTmFtZVBhcmFtcy5vdXRJZHggKyBsO1xyXG4gICAgZGF0ZU5hbWVQYXJhbXMubGVuID0gZGF0ZU5hbWVQYXJhbXMubGVuIC0gbjtcclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gVHJpbWVkID8gSnVtcCBvdGhlciB0cmltZWQgbWFzayA6IG5vdGhpbmdcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgbiA9IG4gLSBsO1xyXG5cclxuICAgIGlmIChuID4gMCkge1xyXG4gICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KGRhdGVOYW1lUGFyYW1zLm91dFZhbCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4LCBkYXRlTmFtZVBhcmFtcy5vdXRWYWwsIGRhdGVOYW1lUGFyYW1zLm91dElkeCArIG4sIGRhdGVOYW1lUGFyYW1zLmxlbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gPG51bWJlcj5uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEpQTjogSmFwYW5lc2UgZGF0ZSBwaWN0dXJlIHN1cHBvcnRcclxuICAvLy8gICBDb252ZXJ0IGluZGV4IHRvIE5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyT3V0XCI+ICAgICAgICAgIG91dHB1dCBzdGluZyAob3JpZ2luYWwpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRlTmFtZVBhcmFtc1wiPiAgb3V0cHV0IHN0aW5nIGRldGFpbHNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0ck5tXCI+ICAgICAgICAgICBuYW1lIHdoaWNoIHdpbGwgYmUgZW1iZWRkZWQgaW4gb3V0cHV0IHN0cmluZ1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW50T3V0TGVuXCI+ICAgICAgIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgc3RyaW5nXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiAgICAgICAgICAgICAgICAgb3V0cHV0IHN0aW5nIChwcm9jZXNzZWQpXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGRhdGVfaV8yX25tX2J5dGVtb2RlKHN0ck91dDogc3RyaW5nLCBkYXRlTmFtZVBhcmFtczogRGF0ZU5hbWVQYXJhbXMsIHN0ck5tOiBzdHJpbmcsIGludE91dExlbjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBpbnRNc2tDbnQ6IG51bWJlciA9IHRoaXMuZGF0ZV9tc2tfY250KGRhdGVOYW1lUGFyYW1zLm91dFZhbCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4LCA8bnVtYmVyPmRhdGVOYW1lUGFyYW1zLmxlbik7XHJcbiAgICBsZXQgc3RyV29yazogc3RyaW5nID0gTlN0cmluZy5Gcm9tQ2hhcnMoZGF0ZU5hbWVQYXJhbXMub3V0VmFsKTtcclxuXHJcbiAgICBzdHJXb3JrID0gc3RyV29yay5zdWJzdHIoMCwgZGF0ZU5hbWVQYXJhbXMub3V0SWR4KTtcclxuXHJcbiAgICBsZXQgaW50T2ZzOiBudW1iZXIgPSBVdGlsU3RyQnl0ZU1vZGUubGVuQihzdHJXb3JrKTtcclxuICAgIHN0ck5tID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHN0ck5tLCBpbnRNc2tDbnQpO1xyXG4gICAgc3RyT3V0ID0gVXRpbFN0ckJ5dGVNb2RlLnJlcEIoTlN0cmluZy5Gcm9tQ2hhcnMoZGF0ZU5hbWVQYXJhbXMub3V0VmFsKSwgc3RyTm0sIGludE9mcyArIDEsIGludE1za0NudCk7XHJcblxyXG4gICAgZGF0ZU5hbWVQYXJhbXMub3V0SWR4ID0gZGF0ZU5hbWVQYXJhbXMub3V0SWR4ICsgc3RyTm0ubGVuZ3RoO1xyXG4gICAgZGF0ZU5hbWVQYXJhbXMubGVuID0gZGF0ZU5hbWVQYXJhbXMubGVuIC0gaW50TXNrQ250O1xyXG4gICAgaW50T3V0TGVuID0gaW50T3V0TGVuIC0gaW50TXNrQ250O1xyXG4gICAgcmV0dXJuIHN0ck91dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gTiBvZiBjb25zZWN1dGl2ZSBNYXNrIGNoYXJhY3RlcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibXNrXCI+ICAgICB0aGUgbWFzayB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibXNrUG9zXCI+ICBpbmRleCBvZiBmaXJzdCBjaGFyIHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsZW5cIj4gICAgIGxlbmd0aCBvZiB0aGUgbWFza1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIE1hc2sgY2hhcmFjdGVyc1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBkYXRlX21za19jbnQobXNrOiBzdHJpbmdbXSwgbXNrUG9zOiBudW1iZXIsIGxlbjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBjOiBzdHJpbmcgPSBtc2tbbXNrUG9zKytdO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDE7XHJcbiAgICB3aGlsZSAoPG51bWJlcj5pIDwgbGVuKSB7XHJcbiAgICAgIGlmIChtc2tbbXNrUG9zXSAhPT0gYykge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIG1za1BvcyA9IG1za1BvcyArIDE7XHJcbiAgICAgIGkgPSBpICsgMTtcclxuICAgIH1cclxuICAgIHJldHVybiBpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbXB1dGUgRGF5IG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZGF0ZV8yX0REREQoZGF5OiBudW1iZXIsIG91dFZhbDogc3RyaW5nW10sIG91dElkeDogbnVtYmVyLCBsZW46IG51bWJlciwgdHJpbTogYm9vbGVhbik6IG51bWJlciB7XHJcblxyXG5cclxuICAgIGxldCByZXQ6IG51bWJlciA9IDQ7XHJcbiAgICBsZXQgZXh0OiBzdHJpbmdbXTtcclxuXHJcbiAgICBpZiAoZGF5ID4gOSkge1xyXG4gICAgICB0aGlzLmludF8yX2Eob3V0VmFsLCBvdXRJZHgsIDIsIGRheSwgKDxudW1iZXI+MCkudG9TdHJpbmcoKSk7XHJcbiAgICAgIG91dElkeCArPSAyO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0cmltKSB7XHJcbiAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbWNweShvdXRWYWwsIG91dElkeCwgb3V0VmFsLCBvdXRJZHggKyAxLCBsZW4gLSAxKTtcclxuICAgICAgICAvKjE3LU1heS05MCovXHJcbiAgICAgICAgcmV0LS07XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gKihvdXQrKykgPSAnICc7IC8vIE9yaWdpbmFsIExpbmVcclxuICAgICAgICBvdXRWYWxbb3V0SWR4KytdID0gJyAnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaW50XzJfYShvdXRWYWwsIG91dElkeCwgMSwgZGF5LCAoPG51bWJlcj4wKS50b1N0cmluZygpKTtcclxuICAgICAgb3V0SWR4Kys7XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKGRheSkge1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgIGNhc2UgMjE6XHJcbiAgICAgIGNhc2UgMzE6XHJcbiAgICAgICAgZXh0ID0gTlN0cmluZy5Ub0NoYXJBcnJheShcInN0XCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAyOlxyXG4gICAgICBjYXNlIDIyOlxyXG4gICAgICAgIGV4dCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoXCJuZFwiKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgY2FzZSAyMzpcclxuICAgICAgICBleHQgPSBOU3RyaW5nLlRvQ2hhckFycmF5KFwicmRcIik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGV4dCA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoXCJ0aFwiKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIG91dFZhbFtvdXRJZHgrK10gPSBleHRbMF07XHJcbiAgICBvdXRWYWxbb3V0SWR4XSA9IGV4dFsxXTtcclxuXHJcbiAgICByZXR1cm4gKHJldCk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIGZvciBhbiB0aW1lIHZhbHVlIGFjY29yZGluZyB0byB0aGUgcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkYXRhU3RyXCI+ICAgVGhlIHNvdXJjZSBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkPC9yZXR1cm5zPlxyXG4gIGZyb21NZ1RpbWVUb05hdGl2ZVRpbWUoZGF0YVN0cjogc3RyaW5nLCBwaWM6IFBJQywgdGltZV9kYXRlX3BpY19aX2VkdDogYm9vbGVhbik6IERhdGUge1xyXG4gICAgbGV0IG1hc2s6IHN0cmluZyA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICBsZXQgbWFza1NpemU6IG51bWJlciA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG4gICAgbGV0IHRpbWU6IG51bWJlciA9IG5ldyBOVU1fVFlQRShkYXRhU3RyKS5OVU1fMl9VTE9ORygpO1xyXG5cclxuXHJcbiAgICAgIGxldCBicmVha1BhcmFtczogVGltZUJyZWFrUGFyYW1zID0gbmV3IFRpbWVCcmVha1BhcmFtcygpO1xyXG5cclxuICAgICAgRGlzcGxheUNvbnZlcnRvci50aW1lX2JyZWFrKGJyZWFrUGFyYW1zLCB0aW1lKTtcclxuXHJcbiAgICAgIGxldCBuYXRpdmVEdDogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICBuYXRpdmVEdC5zZXRIb3VycyhicmVha1BhcmFtcy5ob3VyKTtcclxuICAgICAgbmF0aXZlRHQuc2V0TWludXRlcyhicmVha1BhcmFtcy5taW51dGUpO1xyXG4gICAgICBuYXRpdmVEdC5zZXRTZWNvbmRzKGJyZWFrUGFyYW1zLnNlY29uZCk7XHJcbiAgICAgIHJldHVybiBuYXRpdmVEdDtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEhhbmRsZSB0aW1lIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkFzY2lpU3RyXCI+ICAgICAgICBUaGUgbWFzayB0byBiZSB1c2VkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkFzY2lpTFwiPiAgICAgICAgICBNYXNrIGxlbmd0aDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gICAgICAgICAgICAgVGhlIHBpY3VyZSBpbmZvcm1hdGlvbjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0aW1lX3BpY19aX2VkdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzZWNvbmRzXCI+LyBtaWxsaVNlY29uZHMgZmxhZzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSB0aW1lXzJfYV9waWMoQXNjaWlTdHI6IHN0cmluZywgQXNjaWlMOiBudW1iZXIsIHRpbWU6IG51bWJlciwgcGljOiBQSUMsIHRpbWVfcGljX1pfZWR0OiBib29sZWFuLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG5cclxuICAgIC8vIE9yaWdpbmFsIHZhcnNcclxuICAgIGxldCBob3VyOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IG1pbnV0ZTogbnVtYmVyID0gMDtcclxuICAgIGxldCBzZWNvbmQ6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWlsbGlzZWM6IG51bWJlciA9IDA7XHJcblxyXG4gICAgbGV0IEFzY2lpOiBzdHJpbmdbXSA9IE5TdHJpbmcuVG9DaGFyQXJyYXkoQXNjaWlTdHIpO1xyXG4gICAgbGV0IGJyZWFrUGFyYW1zOiBUaW1lQnJlYWtQYXJhbXMgPSBuZXcgVGltZUJyZWFrUGFyYW1zKGhvdXIsIG1pbnV0ZSwgc2Vjb25kKTtcclxuICAgIGxldCB0aW1lU2VjOiBudW1iZXI7XHJcbiAgICBpZiAobWlsbGlTZWNvbmRzKSB7XHJcbiAgICAgIHRpbWVTZWMgPSBNYXRoLmZsb29yKHRpbWUgLyAxMDAwKTtcclxuICAgICAgbWlsbGlzZWMgPSB0aW1lIC0gdGltZVNlYyAqIDEwMDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGltZVNlYyA9IHRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgRGlzcGxheUNvbnZlcnRvci50aW1lX2JyZWFrKGJyZWFrUGFyYW1zLCB0aW1lU2VjKTtcclxuICAgIGhvdXIgPSBicmVha1BhcmFtcy5ob3VyO1xyXG4gICAgbWludXRlID0gYnJlYWtQYXJhbXMubWludXRlO1xyXG4gICAgc2Vjb25kID0gYnJlYWtQYXJhbXMuc2Vjb25kO1xyXG5cclxuICAgIC8vIElmIGFzY2lpIHJlcHJlc2VudGF0aW9uIG92ZXJmbG93cyBvdXRwdXQgYnVmZmVyXHJcbiAgICAvLyBmaWxsIHdpdGggJyonIGFuZCBiYWlsIG91dFxyXG5cclxuICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgIGlmIChwaWMuZ2V0TWFza1NpemUoKSA+IEFzY2lpTCkge1xyXG4gICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KEFzY2lpLCAwLCAnKicsIC8qJyonKi9Bc2NpaUwpO1xyXG4gICAgICByZXN1bHQgPSBOU3RyaW5nLkZyb21DaGFycyhBc2NpaSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHBpYy56ZXJvRmlsbCgpKSB7XHJcbiAgICAgICAgaWYgKHRpbWVTZWMgPT09IDAgJiYgKCFtaWxsaVNlY29uZHMgfHwgbWlsbGlzZWMgPT09IDApKSB7XHJcbiAgICAgICAgICBpZiAodGltZV9waWNfWl9lZHQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW50eDogbnVtYmVyID0gMDsgaW50eCA8IHBpYy5nZXRNYXNrU2l6ZSgpOyBpbnR4ID0gaW50eCArIDEpIHtcclxuICAgICAgICAgICAgICBpZiAoQXNjaWlbaW50eF0gPD0gJ1xcdTAwMWYnKSB7XHJcbiAgICAgICAgICAgICAgICBBc2NpaVtpbnR4XSA9IHBpYy5nZXRaZXJvUGFkKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IE5TdHJpbmcuRnJvbUNoYXJzKEFzY2lpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoQXNjaWksIDAsIHBpYy5nZXRaZXJvUGFkKCksIHBpYy5nZXRNYXNrU2l6ZSgpKTtcclxuICAgICAgICAgIHJlc3VsdCA9IE5TdHJpbmcuRnJvbUNoYXJzKEFzY2lpKTtcclxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBJOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgYW06IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBsZW46IG51bWJlciA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG4gICAgICBsZXQgSG91ckk6IG51bWJlciA9IC0xO1xyXG5cclxuICAgICAgd2hpbGUgKEkgPCBsZW4pIHtcclxuICAgICAgICBzd2l0Y2ggKEFzY2lpW0ldLmNoYXJDb2RlQXQoMCkpIHtcclxuICAgICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSEgpOlxyXG4gICAgICAgICAgICBIb3VySSA9IEk7XHJcbiAgICAgICAgICAgIEkgKz0gMjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfTU1UKTpcclxuICAgICAgICAgICAgdGhpcy5pbnRfMl9hKEFzY2lpLCBJLCAyLCBtaW51dGUsICcwJyk7XHJcbiAgICAgICAgICAgIEkgKz0gMjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19TUyk6XHJcbiAgICAgICAgICAgIHRoaXMuaW50XzJfYShBc2NpaSwgSSwgMiwgc2Vjb25kLCAnMCcpO1xyXG4gICAgICAgICAgICBJICs9IDI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfTVMpOlxyXG4gICAgICAgICAgICB0aGlzLmludF8yX2EoQXNjaWksIEksIDMsIG1pbGxpc2VjLCAnMCcpO1xyXG4gICAgICAgICAgICBJICs9IDM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfUE0pOlxyXG4gICAgICAgICAgICBhbSA9IDE7XHJcbiAgICAgICAgICAgIGxldCB0bXBIb3VyOiBudW1iZXIgPSBob3VyICUgMjQ7XHJcbiAgICAgICAgICAgIGlmICh0bXBIb3VyIDwgMTIgfHwgdG1wSG91ciA9PT0gMClcclxuICAgICAgICAgICAgICBNZW1vcnlVdGlsLmNoYXJfbWVtY3B5KEFzY2lpLCBJLCBOU3RyaW5nLlRvQ2hhckFycmF5KFwiYW1cIiksIDAsIDIpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbWNweShBc2NpaSwgSSwgTlN0cmluZy5Ub0NoYXJBcnJheShcInBtXCIpLCAwLCAyKTtcclxuICAgICAgICAgICAgSSArPSAyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBJKys7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoSG91ckkgPj0gMCkge1xyXG4gICAgICAgIGlmIChhbSA+IDApIHtcclxuICAgICAgICAgIGhvdXIgPSBob3VyICUgMjQ7XHJcbiAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xyXG4gICAgICAgICAgICBob3VyID0gMTI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaG91ciA9IGhvdXIgJSAxMjtcclxuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDApIHtcclxuICAgICAgICAgICAgICBob3VyID0gMTI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbnRfMl9hKEFzY2lpLCBIb3VySSwgMiwgaG91ciwgKGFtICE9PSAwICYmIGhvdXIgPCAxMCkgPyAnICcgOiAvKicgJyovJzAnLyonMCcqLyk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0ID0gTlN0cmluZy5Gcm9tQ2hhcnMoQXNjaWkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCcmVhayB0aW1lIGludG8gaXRzIGNvbXBvbmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyB0aW1lX2JyZWFrKGJyZWFrUGFyYW1zOiBUaW1lQnJlYWtQYXJhbXMsIHRpbWU6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aW1lIDw9IDApIHtcclxuICAgICAgYnJlYWtQYXJhbXMuc2Vjb25kID0gMDtcclxuICAgICAgYnJlYWtQYXJhbXMubWludXRlID0gMDtcclxuICAgICAgYnJlYWtQYXJhbXMuaG91ciA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgYnJlYWtQYXJhbXMuaG91ciA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xyXG4gICAgICB0aW1lID0gdGltZSAtIGJyZWFrUGFyYW1zLmhvdXIgKiAzNjAwO1xyXG4gICAgICBicmVha1BhcmFtcy5taW51dGUgPSBNYXRoLmZsb29yKHRpbWUgLyA2MCk7XHJcbiAgICAgIGJyZWFrUGFyYW1zLnNlY29uZCA9IHRpbWUgLSBicmVha1BhcmFtcy5taW51dGUgKiA2MDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIGRpc3BsYXkgc3RyaW5nIGZvciBhIGxvZ2ljYWwgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRhdGFTdHJcIj4gICBcIjBcIiBmb3IgZmFsc2Ugb3IgXCIxXCIgZm9yIHRydWVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPiAgICBUaGUgcGljdHVyZSB0byB1c2UgZm9yIHRoZSB2YWx1ZSB0byBkaXNwbGF5XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyYW5nZVN0clwiPiAgVGhlIHJhbmdlIG9mIHZhbHVlcyB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZnJvbUxvZ2ljYWwoZGF0YVN0cjogc3RyaW5nLCBwaWM6IFBJQywgcmFuZ2VTdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IFN0cjogc3RyaW5nW10gPSBOU3RyaW5nLlRvQ2hhckFycmF5KHBpYy5nZXRNYXNrKCkpO1xyXG5cclxuICAgIC8vIElmIHBpY3R1cmUgb3ZlcmZsb3dzIHN0cmluZywgcmVzZXQgd2l0aCAnKidcclxuICAgIGlmIChwaWMuZ2V0TWFza1NpemUoKSA+IFN0ci5sZW5ndGgpIHtcclxuICAgICAgTWVtb3J5VXRpbC5jaGFyX21lbXNldChTdHIsIDAsICcqJywgLyonKicqL1N0ci5sZW5ndGgpO1xyXG4gICAgICByZXR1cm4gTlN0cmluZy5Gcm9tQ2hhcnMoU3RyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgICAgLy8gQ3JhY2sgcmFuZ2UgYW5kIGNvcHkgdGhlIGRhdGFcclxuXHJcbiAgICAgIGxldCBhcnJheTI6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oNTApO1xyXG4gICAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IGFycmF5Mi5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICAgIGFycmF5MltfYWldID0gKDApLnRvU3RyaW5nKCk7XHJcbiAgICAgIHRoaXMud2luX3JuZ19ib29sX3N1YihhcnJheTIsIGFycmF5Mi5sZW5ndGgsIGRhdGFTdHIuY2hhckF0KDApID09PSAnMScvKicxJyovLCByYW5nZVN0cik7XHJcbiAgICAgIGxldCBsZW46IG51bWJlciA9IHBpYy5nZXRNYXNrU2l6ZSgpO1xyXG5cclxuICAgICAgLy8gT3JpZ2luYWwgQ29kZSAtIG5vdCByZWxldmFudCBpbiBqYXZhIGJlY2F1c2UgdGhlIHJlc3VsdCBpcyBhbGx3YXlzIHRoZSBtYXNrIGxlblxyXG4gICAgICAvLyBpZiAobGVuIDwgU3RyTGVuKVxyXG4gICAgICAvLyBjaGFyX21lbXNldCAoU3RyLCBsZW4sICcgJywgU3RyTGVuIC0gbGVuKTtcclxuICAgICAgbGV0IHJlc1N0cjogc3RyaW5nID0gdGhpcy53aW5fZGF0YV9jcHkoU3RyLCBsZW4sIGFycmF5MiwgcGljLmlzQXR0ckFscGhhKCkpO1xyXG4gICAgICByZXR1cm4gcmVzU3RyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEJ1aWxkIGEgZGlzcGxheSBzdHJpbmcgZm9yIGEgbG9naWNhbCB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVN0clwiPiAgIFwiMFwiIGZvciBmYWxzZSBvciBcIjFcIiBmb3IgdHJ1ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhblxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBmcm9tTWdMb2dpY2FsVG9OYXRpdmVMb2dpY2FsKGRhdGFTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBuYXRpdmVWYWw6IGJvb2xlYW47XHJcbiAgICBuYXRpdmVWYWwgPSAoZGF0YVN0ci5jaGFyQXQoMCkgPT09ICcxJykgPyB0cnVlIDogZmFsc2U7XHJcbiAgICByZXR1cm4gbmF0aXZlVmFsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBCdWlsZCBhIG1nIHN0cmluZyBmb3IgYSBsb2dpY2FsIHZhbHVlIGFjY29yZGluZyB0byB0aGUgYm9vbGVhbiB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsXCI+ICBib29sZWFuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzdHJpbmdcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZnJvbU5hdGl2ZUxvZ2ljYWxUb01nTG9naWNhbChkaXNwVmFsOiBib29sZWFuKTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgbWdWYWw6IHN0cmluZztcclxuICAgIG1nVmFsID0gKGRpc3BWYWwgPT09IHRydWUpID8gXCIxXCIgOiBcIjBcIjtcclxuXHJcbiAgICByZXR1cm4gbWdWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IGEgYm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSByYW5nZSBzcGVjaWZpZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiU3ViXCI+ICAgICAgdGhlIHJlc3VsdCBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiU3ViU2l6XCI+ICAgdGhlIHJlc3VsdCBzdHJpbmcgbGVuZ3RoPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIkJvb2xWYWxcIj4gICcxJyBpZiB0cnVlIG9yICcwJyBpZiBmYWxzZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJybmdcIj4gICAgICByYW5nZSBvZiB2YWx1ZXM8L3BhcmFtPlxyXG4gIHByaXZhdGUgd2luX3JuZ19ib29sX3N1YihTdWI6IHN0cmluZ1tdLCBTdWJTaXo6IG51bWJlciwgQm9vbFZhbDogYm9vbGVhbiwgcm5nOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgY3JrOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KFBJQ0ludGVyZmFjZS5EQl9TVFJfTUFYICsgMik7XHJcbiAgICBmb3IgKGxldCBfYWk6IG51bWJlciA9IDA7IF9haSA8IGNyay5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICBjcmtbX2FpXSA9ICgwKS50b1N0cmluZygpO1xyXG5cclxuICAgIGxldCBnYXA6IHN0cmluZ1tdID0gbmV3IEFycmF5PHN0cmluZz4oUElDSW50ZXJmYWNlLkRCX1NUUl9NQVggKyAyKTtcclxuICAgIGZvciAobGV0IF9haTogbnVtYmVyID0gMDsgX2FpIDwgZ2FwLmxlbmd0aDsgKytfYWkpXHJcbiAgICAgIGdhcFtfYWldID0gKDApLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHJhbmdlIGlmIG5vbmUgaXMgc3BlY2lmaWVkXHJcbiAgICBybmcgPSB0aGlzLndpbl9ybmdfYm9vbChybmcpO1xyXG5cclxuICAgIC8vIENyYWNrIHJhbmdlIGFuZCBjaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgYXMgVHJ1ZSB2YWx1ZVxyXG4gICAgLy8gb3IgdGhlIHNlY29uZCBlbGVtZW50IGFzIHRoZSBGYWxzZSB2YWx1ZS5cclxuICAgIHRoaXMud2luX3JuZ19jcmsoY3JrLCBnYXAsIHJuZyk7XHJcbiAgICBsZXQgczogbnVtYmVyO1xyXG4gICAgaWYgKEJvb2xWYWwpIHtcclxuICAgICAgcyA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgd2hpbGUgKGNya1tpXSA+ICdcXDAnLyonXHUwMDAwJyovKSB7XHJcbiAgICAgICAgaSA9IGkgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIHMgPSBpICsgMTtcclxuICAgIH1cclxuICAgIGxldCBsZW46IG51bWJlciA9IHM7XHJcbiAgICB3aGlsZSAoY3JrW2xlbl0gPiAnXFwwJy8qJ1x1MDAwMCcqLykge1xyXG4gICAgICBsZW4gPSBsZW4gKyAxO1xyXG4gICAgfVxyXG4gICAgbGVuID0gbGVuIC0gcztcclxuICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1jcHkoU3ViLCAwLCBjcmssIHMsIE1hdGgubWluKGxlbiwgU3ViU2l6KSk7XHJcbiAgICBpZiAobGVuIDwgU3ViU2l6KSB7XHJcbiAgICAgIE1lbW9yeVV0aWwuY2hhcl9tZW1zZXQoU3ViLCBsZW4sICcgJywgLyonICcqL1N1YlNpeiAtIGxlbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBkZWZhdWx0IHJhbmdlIGZvciBsb2dpY2FsIHZhbHVlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJybmdcIj4gIGN1cnJlbnQgcmFuZ2U8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGRlZmF1bHQgcmFuZ2UgaWYgdGhlIGlucHV0IHJhbmdlIGlzIGVtcHR5PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgd2luX3JuZ19ib29sKHJuZzogc3RyaW5nKTogc3RyaW5nIHtcclxuXHJcbiAgICBpZiAocm5nID09PSBudWxsIHx8IHJuZy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcm5nID0gXCJUcnVlLCBGYWxzZVwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJuZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDcmFjayBhICdyYW5nZScgc3RyaW5nIGludG8gaXRzIGNvbXBvbmVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgd2luX3JuZ19jcmsoY3JrOiBzdHJpbmdbXSwgZ2FwOiBzdHJpbmdbXSwgcmFuZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHJuZ0xlbjogbnVtYmVyID0gcmFuZ2UubGVuZ3RoO1xyXG4gICAgbGV0IHJuZzogc3RyaW5nW10gPSBOU3RyaW5nLlRvQ2hhckFycmF5KHJhbmdlKTtcclxuICAgIGxldCBjcmtQb3M6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgcm5nUG9zOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGdhcFBvczogbnVtYmVyID0gMDtcclxuXHJcbiAgICB3aGlsZSAocm5nUG9zIDwgcm5nTGVuKSB7XHJcbiAgICAgIGlmIChybmdbcm5nUG9zXSA9PT0gJywnIHx8IHJuZ1tybmdQb3NdID09PSAnLScpIHtcclxuICAgICAgICBnYXBbZ2FwUG9zKytdID0gcm5nW3JuZ1BvcysrXTtcclxuICAgICAgICBjcmtbY3JrUG9zKytdID0gJ1xcMCc7XHJcblxyXG4gICAgICAgIGlmIChybmdQb3MgPCBybmdMZW4pIHtcclxuICAgICAgICAgIHdoaWxlIChybmdbcm5nUG9zXSA9PT0gJyAnKSB7XHJcbiAgICAgICAgICAgIHJuZ1BvcyA9IHJuZ1BvcyArIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIDA1LzEwLzk1IC0gTXIuIFRha2FkYSA6XHJcbiAgICAgICAgLy8gSmFwYW5lc2UgY2hhciBtYXkgaGF2ZSAnXFwnIGNvZGUgb2YgaXRzIHNlY29uZCBieXRlLlxyXG4gICAgICAgIC8vIHN0cl9jaHJfMV9ieXQgbmVlZHMgbWdsb2NhbC5oLlxyXG4gICAgICAgIC8vIGFjY29yZGluZyB0byBNci4gTWFydW9rYTpcclxuICAgICAgICBpZiAocm5nW3JuZ1Bvc10gPT09ICdcXFxcJykge1xyXG4gICAgICAgICAgcm5nUG9zID0gcm5nUG9zICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY3JrW2Nya1Bvc10gPSBybmdbcm5nUG9zKytdO1xyXG4gICAgICAgIGNya1BvcyA9IGNya1BvcyArIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBKUE46IDAxLzExLzk1IFlhbWEqL1xyXG4gICAgLy8gVXBwZXIgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gc3RyLmMgYW5kXHJcbiAgICAvLyBpdCBpcyBhbHNvIG92ZXJyaWRlZCBieSBtZ2xvY2FsIGZ1bmN0aW9uLlxyXG4gICAgLy8gU28gTUFHSUMgbmVlZHMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uXHJcbiAgICAvLyBpbnN0ZWFkIG9mIENTVF9oZHIudXBwcl90YWJbXS5cclxuXHJcbiAgICAvLyBpZiAodXApXHJcbiAgICAvLyBcdHN0cl91cHBlciAob3JnX2NyaywgKGxvbmcpKGNyay1vcmdfY3JrKSk7XHJcblxyXG5cclxuICAgIGdhcFtnYXBQb3NdID0gJ1xcMCc7XHJcbiAgICBjcmtbY3JrUG9zKytdID0gJ1xcMCc7XHJcbiAgICBjcmtbY3JrUG9zXSA9ICdcXDAnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBNZXRob2RzIGZvciBjb3ZlcnRpbmcgRElQTEFZIC0tLT4gSU5URVJOQUxcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJhbnNsYXRlcyBhIHN0cmluZyBudW1iZXIgdG8gbWFnaWMgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPiAgIEEgc3RyaW5nIG51bWJlcjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNTdHJcIj4gICAgICBUaGUgcGljdHVyZSB0byB1c2U8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIG1hZ2ljIG51bWJlcjwvcmV0dXJucz5cclxuICB0b051bShkaXNwVmFsdWU6IHN0cmluZywgcGljOiBQSUMsIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKGRpc3BWYWx1ZSwgcGljLCBjb21wSWR4KTtcclxuICAgIHJldHVybiBtZ051bS50b1hNTHJlY29yZCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZHMgdGhlIGRhdGUgbWFnaWMgbnVtYmVyIGZyb20gdGhlIHN0cmluZyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdHJcIj4gICAgICAgICAgICB0aGUgZGF0ZSBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyX2xlblwiPiAgICAgICAgbGVuZ3RoIG9mIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gICAgICAgICAgICB0aGUgcGljdHVyZSBpbmZvPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1hc2tcIj4gICAgICAgICAgIHRoZSBtYXNrIG9mIHRoZSBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlX2R0X2ZtdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgbWFnaWMgbnVtYmVyPC9yZXR1cm5zPlxyXG4gIGFfMl9kYXRlX3BpY19kYXRlbW9kZShzdHI6IHN0cmluZ1tdLCBzdHJfbGVuOiBudW1iZXIsIHBpYzogUElDLCBtYXNrOiBzdHJpbmdbXSwgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBwb3M6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgeWVhcl9pbl9waWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBtb250aF9pbl9waWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBkYXlfaW5fcGljOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaW5wOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgYlllYXJJc1plcm86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlcmFfeWVhcjogbnVtYmVyID0gMDtcclxuICAgIGxldCBpbnRSZWY6IEludFJlZiA9IG5ldyBJbnRSZWYoMCk7XHJcbiAgICBsZXQgaW50UGljSWR4T2ZzOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IG1pbGxlbml1bTogbnVtYmVyID0gMDtcclxuICAgIGxldCBkYXRlUGFyYW1zOiBEYXRlQnJlYWtQYXJhbXM7XHJcblxyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gTWF0aC5taW4oc3RyLmxlbmd0aCwgcGljLmdldE1hc2tTaXplKCkpO1xyXG5cclxuICAgIGlmIChzdHIubGVuZ3RoIDwgbWFzay5sZW5ndGgpXHJcbiAgICAgIHN0ci5sZW5ndGggPSBtYXNrLmxlbmd0aDtcclxuXHJcbiAgICBsZXQgeWVhcjogbnVtYmVyID0gMDtcclxuICAgIGxldCBtb250aDogbnVtYmVyID0gMTtcclxuICAgIGxldCBkYXk6IG51bWJlciA9IDE7XHJcbiAgICBsZXQgZG95OiBudW1iZXIgPSAxO1xyXG4gICAgbGV0IHVzZWRveTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyX2xlbjsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGlmIChzdHJbaV0gIT09ICcwJyAmJiBzdHJbaV0gIT09ICcgJykge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGkgPT09IHN0cl9sZW4pXHJcbiAgICAgIHJldHVybiAwO1xyXG5cclxuICAgIHdoaWxlIChwb3MgPCBzdHJfbGVuICYmIHBvcyArIGludFBpY0lkeE9mcyA8IGxlbikge1xyXG5cclxuICAgICAgc3dpdGNoIChtYXNrW3BvcyArIGludFBpY0lkeE9mc10uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19ZWTpcclxuICAgICAgICAgIHllYXJfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICB5ZWFyID0gdGhpcy5kYXRlX2FfMl9pKHN0ciwgMiwgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSAyO1xyXG4gICAgICAgICAgLy8gSGVuIDE2LzExLzk3IDogRml4ICM3Njg0NDJcclxuICAgICAgICAgIGlmICh5ZWFyID09PSAwKVxyXG4gICAgICAgICAgICBiWWVhcklzWmVybyA9IHRydWU7XHJcbiAgICAgICAgICBsZXQgY2VudHVyeV95ZWFyOiBudW1iZXIgPSB0aGlzLl9lbnZpcm9ubWVudC5HZXRDZW50dXJ5KGNvbXBJZHgpICUgMTAwOyAvLyBERUZfY2VudHVyeVxyXG4gICAgICAgICAgaWYgKHllYXIgPCBjZW50dXJ5X3llYXIpXHJcbiAgICAgICAgICAgIHllYXIgKz0gMTAwO1xyXG4gICAgICAgICAgeWVhciArPSB0aGlzLl9lbnZpcm9ubWVudC5HZXRDZW50dXJ5KGNvbXBJZHgpIC0gY2VudHVyeV95ZWFyOyAvLyBERUZfY2VudHVyeVxyXG4gICAgICAgICAgaWYgKHRoaXMuX2Vudmlyb25tZW50LkdldERhdGVNb2RlKGNvbXBJZHgpID09PSAnQicpXHJcbiAgICAgICAgICAvLyBERUZfZGF0ZV9tb2RlXHJcbiAgICAgICAgICAgIHllYXIgLT0gUElDSW50ZXJmYWNlLkRBVEVfQlVEREhJU1RfR0FQO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1lZWVkpOlxyXG4gICAgICAgICAgeWVhcl9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIGxldCBZZWFyRGlnaXRzTm86IG51bWJlcjtcclxuICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSA0IHllYXIgZGlnaXQuIElmIG5vdCwgYWRqdXN0IGl0XHJcbiAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlICdjZW50dXJ5IHllYXInXHJcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgICBmb3IgKFllYXJEaWdpdHNObyA9IDA7IFllYXJEaWdpdHNObyA8IDQgJiYgcG9zICsgWWVhckRpZ2l0c05vIDwgc3RyLmxlbmd0aCAmJiBVdGlsU3RyQnl0ZU1vZGUuaXNEaWdpdChzdHJbcG9zICsgWWVhckRpZ2l0c05vXSk7IFllYXJEaWdpdHNObysrKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaSA9IFllYXJEaWdpdHNObztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBwb3MgKyBpIDwgc3RyLmxlbmd0aCAmJiBzdHJbcG9zICsgaV0gIT09IHRoaXMuREFURUNIQVIudG9TdHJpbmcoKSAmJiBpIDwgNDsgaSsrKSB7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAoWWVhckRpZ2l0c05vID0gMDtcclxuICAgICAgICAgICAgICAgICBwb3MgKyBZZWFyRGlnaXRzTm8gPCBzdHIubGVuZ3RoICYmIFV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltwb3MgKyBZZWFyRGlnaXRzTm9dKSAmJlxyXG4gICAgICAgICAgICAgICAgIFllYXJEaWdpdHNObyA8IDQ7XHJcbiAgICAgICAgICAgICAgICAgWWVhckRpZ2l0c05vKyspIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nSlBOKCkpIHtcclxuICAgICAgICAgICAgaWYgKGkgPCA0ICYmIHN0ci5sZW5ndGggPCBtYXNrLmxlbmd0aClcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgNCAtIGksIHN0ci5sZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpIDwgNCAmJiBsZW4gPCBtYXNrLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIHRoaXMubW92ZV9kYXRlKHN0ciwgcG9zLCA0IC0gaSwgbGVuKTtcclxuICAgICAgICAgICAgICBsZW4gPSBsZW4gKyA0IC0gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHllYXIgPSB0aGlzLmRhdGVfYV8yX2koc3RyLCA0LCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDQ7XHJcblxyXG4gICAgICAgICAgLy8gSGVuIDE2LzExLzk3IDogRml4ICM3Njg0NDJcclxuICAgICAgICAgIGlmICh5ZWFyID09PSAwKVxyXG4gICAgICAgICAgICBiWWVhcklzWmVybyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgaWYgKFllYXJEaWdpdHNObyA8PSAyKSB7XHJcbiAgICAgICAgICAgIGNlbnR1cnlfeWVhciA9IHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkoY29tcElkeCkgJSAxMDA7IC8vIERFRl9jZW50dXJ5XHJcbiAgICAgICAgICAgIGlmICh5ZWFyIDwgY2VudHVyeV95ZWFyKVxyXG4gICAgICAgICAgICAgIHllYXIgKz0gMTAwO1xyXG4gICAgICAgICAgICB5ZWFyICs9IHRoaXMuX2Vudmlyb25tZW50LkdldENlbnR1cnkoY29tcElkeCkgLSBjZW50dXJ5X3llYXI7IC8vIERFRl9jZW50dXJ5XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX2Vudmlyb25tZW50LkdldERhdGVNb2RlKGNvbXBJZHgpID09PSAnQicpXHJcbiAgICAgICAgICAvLyBERUZfZGF0ZV9tb2RlXHJcbiAgICAgICAgICAgIHllYXIgLT0gUElDSW50ZXJmYWNlLkRBVEVfQlVEREhJU1RfR0FQO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSFlZWVlZOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIGxldCBxdW90ZXM6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICBpZiAobGVuID4gcG9zICsgNSAmJiBtYXNrW3BvcyArIDVdLmNoYXJDb2RlQXQoMCkgPT09IChQSUNJbnRlcmZhY2UuUElDX0hZWVlZWSkpXHJcbiAgICAgICAgICAgIHF1b3RlcyA9IDE7XHJcbiAgICAgICAgICB5ZWFyID0gSGVicmV3RGF0ZS5kYXRlaGViX2hfMl9pKHN0ciwgNSArIHF1b3RlcywgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSA1ICsgcXVvdGVzO1xyXG4gICAgICAgICAgaWYgKHllYXIgPT09IDApXHJcbiAgICAgICAgICAgIGJZZWFySXNaZXJvID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfSEw6XHJcbiAgICAgICAgICBpbnRQaWNJZHhPZnMgPSBIZWJyZXdEYXRlLmRhdGVoZWJfaF8yX2koc3RyLCAxLCBwb3MpO1xyXG4gICAgICAgICAgcG9zKys7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBQSUNJbnRlcmZhY2UuUElDX0hERDpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBxdW90ZXMgPSAwO1xyXG4gICAgICAgICAgaWYgKGxlbiA+IHBvcyArIDIgJiYgbWFza1twb3MgKyAyXS5jaGFyQ29kZUF0KDApID09PSBQSUNJbnRlcmZhY2UuUElDX0hERClcclxuICAgICAgICAgICAgcXVvdGVzID0gMTtcclxuICAgICAgICAgIGRheSA9IEhlYnJld0RhdGUuZGF0ZWhlYl9oXzJfaShzdHIsIDIgKyBxdW90ZXMsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMiArIHF1b3RlcztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFBJQ0ludGVyZmFjZS5QSUNfTU1EOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIG1vbnRoX2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpKSB7XHJcbiAgICAgICAgICAgIGlmICgoc3RyLmxlbmd0aCA9PT0gcG9zICsgMSB8fCBzdHJbcG9zICsgMV0uY2hhckNvZGVBdCgwKSA9PT0gdGhpcy5EQVRFQ0hBUiB8fCAhVXRpbFN0ckJ5dGVNb2RlLmlzRGlnaXQoc3RyW3BvcyArIDFdKSkgJiYgc3RyLmxlbmd0aCA8IG1hc2subGVuZ3RoKVxyXG4gICAgICAgICAgICAgIHRoaXMubW92ZV9kYXRlKHN0ciwgcG9zLCAxLCBzdHIubGVuZ3RoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoc3RyW3BvcyArIDFdLmNoYXJDb2RlQXQoMCkgPT09IHRoaXMuREFURUNIQVIgJiYgbGVuIDwgbWFzay5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgMSwgbGVuKTtcclxuICAgICAgICAgICAgICBsZW4gKz0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbW9udGggPSB0aGlzLmRhdGVfYV8yX2koc3RyLCAyLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgUElDSW50ZXJmYWNlLlBJQ19NTU06XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgbW9udGhfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGludFJlZi52YWwgPSBwb3M7XHJcbiAgICAgICAgICBtb250aCA9IHRoaXMuZGF0ZV9NTU1fMl9tKHN0ciwgbWFzaywgaW50UmVmLCBsZW4sIHBpYy5pc0hlYnJldygpKTtcclxuICAgICAgICAgIHBvcyA9IGludFJlZi52YWw7XHJcbiAgICAgICAgICBpZiAocGljLmlzSGVicmV3KCkgJiYgbW9udGggPT09IDE0KVxyXG4gICAgICAgICAgICBtb250aCA9IDY7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfREQpOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIGRheV9pbl9waWMgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgICBpZiAoKHN0ci5sZW5ndGggPT09IHBvcyArIDEgfHwgc3RyW3BvcyArIDFdLmNoYXJDb2RlQXQoMCkgPT09IHRoaXMuREFURUNIQVIgfHwgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltwb3MgKyAxXSkpICYmIHN0ci5sZW5ndGggPCBtYXNrLmxlbmd0aClcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgMSwgc3RyLmxlbmd0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHN0cltwb3MgKyAxXS5jaGFyQ29kZUF0KDApID09PSB0aGlzLkRBVEVDSEFSICYmIGxlbiA8IG1hc2subGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5tb3ZlX2RhdGUoc3RyLCBwb3MsIDEsIGxlbik7XHJcbiAgICAgICAgICAgICAgbGVuICs9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRheSA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDIsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19EREQpOlxyXG4gICAgICAgICAgaW5wID0gdHJ1ZTtcclxuICAgICAgICAgIHVzZWRveSA9IHRydWU7XHJcbiAgICAgICAgICBkYXlfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGRveSA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDMsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19EREREKTpcclxuICAgICAgICAgIGlucCA9IHRydWU7XHJcbiAgICAgICAgICBkYXlfaW5fcGljID0gdHJ1ZTtcclxuICAgICAgICAgIGRheSA9IHRoaXMuZGF0ZV9hXzJfaShzdHIsIDIsIHBvcyk7XHJcbiAgICAgICAgICBwb3MgKz0gMiArIDI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfWUopOiAvLyBKUE46IEphcGFuZXNlIGRhdGUgcGljdHVyZSBzdXBwb3J0XHJcbiAgICAgICAgICB5ZWFyX2luX3BpYyA9IHRydWU7XHJcbiAgICAgICAgICBpbnAgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgICBpZiAoKHN0ci5sZW5ndGggPT09IHBvcyArIDEgfHwgc3RyW3BvcyArIDFdLmNoYXJDb2RlQXQoMCkgPT09IHRoaXMuREFURUNIQVIgfHwgIVV0aWxTdHJCeXRlTW9kZS5pc0RpZ2l0KHN0cltwb3MgKyAxXSkpICYmIHN0ci5sZW5ndGggPCBtYXNrLmxlbmd0aClcclxuICAgICAgICAgICAgICB0aGlzLm1vdmVfZGF0ZShzdHIsIHBvcywgMSwgc3RyLmxlbmd0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB5ZWFyID0gdGhpcy5kYXRlX2FfMl9pKHN0ciwgMiwgcG9zKTtcclxuICAgICAgICAgIHBvcyArPSAyO1xyXG5cclxuICAgICAgICAgIGxldCBzdHIxOiBzdHJpbmcgPSBOU3RyaW5nLkZyb21DaGFycyhzdHIpO1xyXG4gICAgICAgICAgZXJhX3llYXIgPSBVdGlsRGF0ZUpwbi5nZXRJbnN0YW5jZSgpLmdldFN0YXJ0WWVhck9mRXJhKHN0cjEsIHBpYy5nZXRNYXNrKCkpO1xyXG5cclxuICAgICAgICAgIGlmIChlcmFfeWVhciA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB5ZWFyICs9IGVyYV95ZWFyIC0gMTtcclxuXHJcbiAgICAgICAgICBpZiAoeWVhciA9PT0gMClcclxuICAgICAgICAgICAgYlllYXJJc1plcm8gPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgICAgICAgLy8gaWYgXCJzdHJbcG9zXVwiIGNvbnRhaW5zIERCQ1MsIHRoZSBuZXh0IGluZGV4IG9mIFwibWFza1wiIGhhcyB0byBiZSBza2lwcGVkLlxyXG4gICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzSGFsZldpZHRoKHN0cltwb3NdKSA9PT0gZmFsc2UgJiZcclxuICAgICAgICAgICAgICBVdGlsU3RyQnl0ZU1vZGUuaXNIYWxmV2lkdGgobWFza1twb3MgKyBpbnRQaWNJZHhPZnNdKSlcclxuICAgICAgICAgICAgICBpbnRQaWNJZHhPZnMrKztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwb3MgKz0gMTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJZZWFySXNaZXJvKSB7XHJcbiAgICAgIGlmICghbW9udGhfaW5fcGljKVxyXG4gICAgICAgIG1vbnRoID0gMDtcclxuICAgICAgaWYgKCFkYXlfaW5fcGljICYmIG1vbnRoID09PSAwKVxyXG4gICAgICAgIGRheSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGVuIDE2LzExLzk3IDogRml4ICM3Njg0NDJcclxuICAgIC8vIFplcm8gZGF0ZSBpcyB2YWxpZCBhbmQgc2hvdWxkIHJldHVybiAwTC4gVGhpcyBjaGVjayBtdXN0IGJlIGhlcmVcclxuICAgIC8vIGJlY2F1c2UgdGhlIHllYXIgdmFsdWUgbWF5IGJlIGNoYW5nZWQgYmVjYXVzZSBvZiBjZW50dXJ5IHllYXIuXHJcbiAgICBpZiAoZGF5ID09PSAwICYmIG1vbnRoID09PSAwICYmIChiWWVhcklzWmVybyB8fCB5ZWFyID09PSAwKSlcclxuICAgICAgcmV0dXJuICgwKTtcclxuXHJcbiAgICBpZiAoIWlucClcclxuICAgICAgcmV0dXJuICgwKTtcclxuXHJcbiAgICAvLyBIZWJyZXcgWWVhclxyXG4gICAgaWYgKHBpYy5pc0hlYnJldygpKSB7XHJcbiAgICAgIGlmICh5ZWFyID4gMCkge1xyXG4gICAgICAgIGlmIChtaWxsZW5pdW0gPT09IDApXHJcbiAgICAgICAgICBtaWxsZW5pdW0gPSA1O1xyXG4gICAgICAgIHllYXIgKz0gbWlsbGVuaXVtICogMTAwMDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKEhlYnJld0RhdGUuZGF0ZWhlYl8yX2QoeWVhciwgbW9udGgsIGRheSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoZSBuZXh0IDIgbGluZXMgc3VwcG9ydCA0Lnh4IEREL01NIHBpY3R1cmVzXHJcbiAgICBpZiAoKHllYXIgPT09IDApICYmICF5ZWFyX2luX3BpYykge1xyXG4gICAgICBkYXRlUGFyYW1zID0gdGhpcy5kYXRlX3N5cygpO1xyXG4gICAgICB5ZWFyID0gZGF0ZVBhcmFtcy55ZWFyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICh0aGlzLmRhdGVfNF9jYWxlbmRlcih5ZWFyLCBtb250aCwgZGF5LCBkb3ksIHVzZWRveSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIERlY29kZSBkaWdpdHMgZnJvbSBhIGRhdGUgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGRhdGVfYV8yX2koczogc3RyaW5nW10sIGxlbjogbnVtYmVyLCBwb3M6IG51bWJlcik6IG51bWJlcjtcclxuICBwcml2YXRlIGRhdGVfYV8yX2koczogc3RyaW5nLCBsZW46IG51bWJlciwgcG9zOiBudW1iZXIpOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBkYXRlX2FfMl9pKHM6IGFueSwgbGVuOiBudW1iZXIsIHBvczogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIChzID09PSBudWxsIHx8IHMgaW5zdGFuY2VvZiBBcnJheSkgJiYgKGxlbiA9PT0gbnVsbCB8fCBsZW4uY29uc3RydWN0b3IgPT09IE51bWJlcikgJiYgKHBvcyA9PT0gbnVsbCB8fCBwb3MuY29uc3RydWN0b3IgPT09IE51bWJlcikpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0ZV9hXzJfaV8wKHMsIGxlbiwgcG9zKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmRhdGVfYV8yX2lfMShzLCBsZW4sIHBvcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRGVjb2RlIGRpZ2l0cyBmcm9tIGEgZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZGF0ZV9hXzJfaV8wKHM6IHN0cmluZ1tdLCBsZW46IG51bWJlciwgcG9zOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGFycmF5OiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KGxlbik7XHJcbiAgICBsZXQgbWdOdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbGVuOyBpID0gaSArIDEpIHtcclxuICAgICAgYXJyYXlbaV0gPSBzW3BvcyArIGldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1nTnVtLmFfMl9sb25nKE5TdHJpbmcuRnJvbUNoYXJzKGFycmF5KSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgbW92aW5nIHBhcnQgb2YgdGhlIGRhdGUgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG1vdmVfZGF0ZShzdHI6IHN0cmluZ1tdLCBwb3M6IG51bWJlciwgbW92ZWJ5OiBudW1iZXIsIGxlbjogbnVtYmVyKTogdm9pZDtcclxuICBwcml2YXRlIG1vdmVfZGF0ZShzdHI6IHN0cmluZywgcG9zOiBudW1iZXIsIG1vdmVieTogbnVtYmVyLCBsZW46IG51bWJlcik6IHZvaWQ7XHJcbiAgcHJpdmF0ZSBtb3ZlX2RhdGUoc3RyOiBhbnksIHBvczogbnVtYmVyLCBtb3ZlYnk6IG51bWJlciwgbGVuOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIChzdHIgPT09IG51bGwgfHwgc3RyIGluc3RhbmNlb2YgQXJyYXkpICYmIChwb3MgPT09IG51bGwgfHwgcG9zLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmIChtb3ZlYnkgPT09IG51bGwgfHwgbW92ZWJ5LmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmIChsZW4gPT09IG51bGwgfHwgbGVuLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpKSB7XHJcbiAgICAgIHRoaXMubW92ZV9kYXRlXzAoc3RyLCBwb3MsIG1vdmVieSwgbGVuKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb3ZlX2RhdGVfMShzdHIsIHBvcywgbW92ZWJ5LCBsZW4pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIG1vdmluZyBwYXJ0IG9mIHRoZSBkYXRlIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBtb3ZlX2RhdGVfMChzdHI6IHN0cmluZ1tdLCBwb3M6IG51bWJlciwgbW92ZWJ5OiBudW1iZXIsIGxlbjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBNZW1vcnlVdGlsLmNoYXJfbWVtbW92ZShzdHIsIHBvcyArIG1vdmVieSwgc3RyLCBwb3MsIGxlbiAtIChwb3MgKyBtb3ZlYnkpICsgMSk7XHJcbiAgICBNZW1vcnlVdGlsLmNoYXJfbWVtc2V0KHN0ciwgcG9zLCAnMCcsIC8qJzAnKi9tb3ZlYnkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyYW5zbGF0ZSBhIG1vbnRoIG5hbWUgLT4gbW9udGggaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RyaW5nXCI+dG8gZXZhbHVhdGVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY3R1cmVcIj5tYXNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwb3NcIj5jdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgdGhlIGludFJlZiBub3QgZXhhY3RseSB0aGUgc2FtZSByZWZlcmVuY2UgdG8gaW50ZWdlciAsIGxpa2UgaW4gQysrLFxyXG4gIC8vLyAgIHNvIHRoZSBnbG9iYWwgcG9zIE1VU1QgYmUgdXBkYXRlZCBieSB0aGUgcG9zLnZhbHVlIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgZGF0ZV9NTU1fMl9tKHN0cjogc3RyaW5nW10sIG1hc2s6IHN0cmluZ1tdLCBwb3M6IEludFJlZiwgbGVuOiBudW1iZXIsIGlzSGVicmV3OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBsOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICBsZXQgbWFza1BvczogbnVtYmVyID0gVXRpbFN0ckJ5dGVNb2RlLmNvbnZQb3MoTlN0cmluZy5Gcm9tQ2hhcnMoc3RyKSwgTlN0cmluZy5Gcm9tQ2hhcnMobWFzayksIHBvcy52YWwsIGZhbHNlKTtcclxuICAgICAgbCA9IHRoaXMuZGF0ZV9tc2tfY250KG1hc2ssIG1hc2tQb3MsIDxudW1iZXI+KGxlbiAtIG1hc2tQb3MpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsID0gdGhpcy5kYXRlX21za19jbnQobWFzaywgcG9zLnZhbCwgPG51bWJlcj4obGVuIC0gcG9zLnZhbCkpO1xyXG4gICAgfVxyXG4gICAgbGV0IHN0clBvczogbnVtYmVyID0gcG9zLnZhbDtcclxuICAgIHBvcy52YWwgPSBwb3MudmFsICsgbDtcclxuICAgIGxlbiA9IE1lbW9yeVV0aWwubWVtX3RyaW0oc3RyLCBzdHJQb3MsIGwpO1xyXG5cclxuICAgIGlmIChsZW4gPT09IDApIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHN0ckI6IHN0cmluZyA9IE5TdHJpbmcuRnJvbUNoYXJzKHN0ciwgc3RyUG9zLCBsZW4pO1xyXG4gICAgICBsZXQgbW9udGhOYW1lczogc3RyaW5nW107XHJcbiAgICAgIGlmIChpc0hlYnJldykge1xyXG4gICAgICAgIG1vbnRoTmFtZXMgPSBIZWJyZXdEYXRlLkdldExvY2FsTW9udGhzKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IG1vbnRoczogc3RyaW5nID0gRXZlbnRzLkdldE1lc3NhZ2VTdHJpbmcoTXNnSW50ZXJmYWNlLk1PTlRIU19QVFIpO1xyXG4gICAgICAgIG1vbnRoTmFtZXMgPSBEYXRlVXRpbC5nZXRMb2NhbE1vbnRocyhtb250aHMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDwgbW9udGhOYW1lcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGlmIChOU3RyaW5nLkNvbXBhcmUobW9udGhOYW1lc1tpXS5zdWJzdHIoMCwgbGVuKSwgc3RyQiwgdHJ1ZSkgPT09IDApXHJcbiAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IHRoZSBjdXJyZXQgZGF5ZSBzZXBlcmF0ZWQgdG8geWVhciwgbW9udGgsIGRheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZGF0ZV9zeXMoKTogRGF0ZUJyZWFrUGFyYW1zIHtcclxuICAgIGxldCBkYXRlOiBEYXRlQnJlYWtQYXJhbXMgPSBuZXcgRGF0ZUJyZWFrUGFyYW1zKCk7XHJcbiAgICBsZXQgQ3VyckRhdGU6IERhdGVUaW1lID0gRGF0ZVRpbWUuTm93O1xyXG5cclxuICAgIGRhdGUueWVhciA9IEN1cnJEYXRlLlllYXI7XHJcbiAgICBkYXRlLm1vbnRoID0gQ3VyckRhdGUuTW9udGg7XHJcbiAgICBkYXRlLmRheSA9IEN1cnJEYXRlLkRheTtcclxuXHJcbiAgICByZXR1cm4gZGF0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0byBnZXQgY3VycmVudCBkYXRlIGluIG1hZ2ljIHJlcHJlc2VudGF0aW9uIFF1ZXJ5IE1hZ2ljJ3MgRGF0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgJ01hZ2ljJyBjdXJyZW50IGRhdGVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGRhdGVfbWFnaWModXRjRGF0ZTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBsZXQgZGF0ZVRpbWU6IERhdGVUaW1lO1xyXG4gICAgaWYgKHV0Y0RhdGUpIHtcclxuICAgICAgZGF0ZVRpbWUgPSBEYXRlVGltZS5VdGNOb3c7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZGF0ZVRpbWUgPSBEYXRlVGltZS5Ob3c7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHllYXI6IG51bWJlciA9IGRhdGVUaW1lLlllYXI7XHJcbiAgICBsZXQgbW9udGg6IG51bWJlciA9IGRhdGVUaW1lLk1vbnRoO1xyXG4gICAgbGV0IGRheTogbnVtYmVyID0gZGF0ZVRpbWUuRGF5O1xyXG5cclxuICAgIHJldHVybiB0aGlzLmRhdGVfNF9jYWxlbmRlcih5ZWFyLCBtb250aCwgZGF5LCAxLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdG8gZ2V0ICB0aGUgc3lzdGVtIHRpbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlICdNYWdpYycgY3VycmVudCB0aW1lXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICB0aW1lX21hZ2ljKHV0Y1RpbWU6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIERhdGVUaW1lLkdldFRvdGFsU2Vjb25kc0Zyb21NaWRuaWdodCh1dGNUaW1lLCBuZXcgRGF0ZSgpKTtcclxuICB9XHJcblxyXG4gIG10aW1lX21hZ2ljKHV0Y1RpbWU6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIERhdGVUaW1lLkdldFRvdGFsTWlsbGlTZWNvbmRzRnJvbU1pZG5pZ2h0KHV0Y1RpbWUsIG5ldyBEYXRlKCkpIDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb21wdXRlIE1BR0lDIGRhdGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGRhdGVfNF9jYWxlbmRlcih5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyLCBkb3k6IG51bWJlciwgdXNlZG95OiBib29sZWFuKTogbnVtYmVyIHtcclxuXHJcbiAgICBsZXQgTGVhcFllYXI6IGJvb2xlYW4gPSB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcclxuXHJcbiAgICAvLyAzLjExLjk3IC0gSGVuIChGaXhlZCBidWcgIzc2NDI2NSBhbmQgIzgxODYpIDpcclxuICAgIC8vIElmIHRoZSBkYXRlIGlzIDAgdGhlbiByZXR1cm4gMEwgKHplcm8gdmFsdWUgaXMgdmFsaWQpLCBlbHNlIGlmIHRoZSBkYXRlXHJcbiAgICAvLyBpcyBpbGxlZ2FsIHRoZW4gcmV0dXJuIDEwMDAwMDAwMDBMICh3cm9uZyBkYXRlKS5cclxuICAgIGlmICh1c2Vkb3kpIHtcclxuICAgICAgaWYgKGRveSA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChkb3kgPiAzNjYgfHwgKCFMZWFwWWVhciAmJiBkb3kgPiAzNjUpKSB7XHJcbiAgICAgICAgcmV0dXJuICgxMDAwMDAwMDAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChkYXkgPT09IDAgJiYgbW9udGggPT09IDAgJiYgeWVhciA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChkYXkgPT09IDAgfHwgbW9udGggPT09IDAgfHwgeWVhciA9PT0gMCB8fCBtb250aCA+IDEyKSB7XHJcbiAgICAgICAgcmV0dXJuIDEwMDAwMDAwMDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHllYXIgPSB5ZWFyIC0gMTtcclxuICAgIGxldCBudW06IG51bWJlciA9IE1hdGguZmxvb3IoeWVhciAvIDQwMCk7XHJcbiAgICB5ZWFyID0geWVhciAtIG51bSAqIDQwMDtcclxuICAgIGxldCBudW0yOiBudW1iZXIgPSBNYXRoLmZsb29yKHllYXIgLyAxMDApO1xyXG4gICAgeWVhciA9IHllYXIgLSBudW0yICogMTAwO1xyXG4gICAgbGV0IG51bTM6IG51bWJlciA9IE1hdGguZmxvb3IoeWVhciAvIDQpO1xyXG4gICAgeWVhciA9IHllYXIgLSBudW0zICogNDtcclxuXHJcbiAgICBpZiAoIXVzZWRveSkge1xyXG4gICAgICBsZXQgbnVtNDogbnVtYmVyID0gUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYlttb250aCAtIDFdO1xyXG4gICAgICBsZXQgbnVtNTogbnVtYmVyID0gUElDSW50ZXJmYWNlLmRhdGVfZGF5X3RhYlttb250aF07XHJcblxyXG4gICAgICBpZiAoTGVhcFllYXIpIHtcclxuICAgICAgICBpZiAobW9udGggPiAxKSB7XHJcbiAgICAgICAgICBudW01ID0gbnVtNSArIDE7XHJcbiAgICAgICAgICBpZiAobW9udGggPiAyKSB7XHJcbiAgICAgICAgICAgIG51bTQgPSBudW00ICsgMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkYXkgPiBudW01IC0gbnVtNCkge1xyXG4gICAgICAgIHJldHVybiAxMDAwMDAwMDAwO1xyXG4gICAgICB9XHJcbiAgICAgIGRveSA9IG51bTQgKyBkYXk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVtICogMTQ2MDk3ICsgbnVtMiAqIDM2NTI0ICsgbnVtMyAqIDE0NjEgKyB5ZWFyICogMzY1ICsgZG95O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRyYW5zbGF0ZXMgYSBzdHJpbmcgdGltZSB0byBtYWdpYyBudW1iZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcFZhbHVlXCI+ICAgQSBzdHJpbmcgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljU3RyXCI+ICAgICAgVGhlIHBpY3R1cmUgdG8gdXNlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBtYWdpYyBudW1iZXI8L3JldHVybnM+XHJcbiAgZnJvbU5hdGl2ZVRpbWVUb01nVGltZShkaXNwVmFsdWU6IERhdGUsIHBpYzogUElDKTogc3RyaW5nIHtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBudW1WYWw6IG51bWJlciA9IHRoaXMuZnJvbU5hdGl2ZVRpbWVUb01nVGltZU51bWJlcihkaXNwVmFsdWUsIHBpYyk7XHJcbiAgICBtZ051bS5OVU1fNF9MT05HKG51bVZhbCk7XHJcbiAgICByZXR1cm4gbWdOdW0udG9YTUxyZWNvcmQoKTtcclxuICB9XHJcblxyXG4gIGZyb21OYXRpdmVUaW1lVG9NZ1RpbWVOdW1iZXIoZGlzcFZhbHVlOiBEYXRlLCBwaWM6IFBJQyk6IG51bWJlciB7XHJcbiAgICBsZXQgbnVtVmFsOiBudW1iZXIgPSB0aGlzLnRpbWVfMl9pbnQoZGlzcFZhbHVlLmdldEhvdXJzKCksIGRpc3BWYWx1ZS5nZXRNaW51dGVzKCksIGRpc3BWYWx1ZS5nZXRTZWNvbmRzKCkpO1xyXG4gICAgcmV0dXJuIG51bVZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IEFscGhhIGludG8gYSBUaW1lIGFjY29yZGluZyB0byBhIGdpdmVuIHBpY3R1cmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFfMl90aW1lKEFzY2lpOiBzdHJpbmcsIHBpYzogUElDLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBudW1iZXI7XHJcbiAgYV8yX3RpbWUoQXNjaWk6IHN0cmluZywgQXNjaWlMOiBudW1iZXIsIG1hc2s6IHN0cmluZ1tdLCBtaWxsaVNlY29uZHM6IGJvb2xlYW4pOiBudW1iZXI7XHJcbiAgYV8yX3RpbWUoQXNjaWk6IGFueSwgcGljT3JBc2NpaUw6IGFueSwgbWlsbGlTZWNvbmRzT3JNYXNrOiBhbnksIG1pbGxpU2Vjb25kcz86IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpXHJcbiAgICAgIHJldHVybiB0aGlzLmFfMl90aW1lXzAoQXNjaWksIHBpY09yQXNjaWlMLCBtaWxsaVNlY29uZHNPck1hc2spO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmFfMl90aW1lXzEoQXNjaWksIHBpY09yQXNjaWlMLCBtaWxsaVNlY29uZHNPck1hc2ssIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBBbHBoYSBpbnRvIGEgVGltZSBhY2NvcmRpbmcgdG8gYSBnaXZlbiBwaWN0dXJlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFfMl90aW1lXzAoQXNjaWk6IHN0cmluZywgcGljOiBQSUMsIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5hXzJfdGltZShBc2NpaSwgQXNjaWkubGVuZ3RoLCBOU3RyaW5nLlRvQ2hhckFycmF5KHBpYy5nZXRNYXNrKCkpLCBtaWxsaVNlY29uZHMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbnZlcnQgQWxwaGEgaW50byBhIFRpbWUgYWNjb3JkaW5nIHRvIGEgZ2l2ZW4gcGljdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhXzJfdGltZV8xKEFzY2lpOiBzdHJpbmcsIEFzY2lpTDogbnVtYmVyLCBtYXNrOiBzdHJpbmdbXSwgbWlsbGlTZWNvbmRzOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBJOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gbWFzay5sZW5ndGg7IC8vIExlbmd0aCBvZiBtYXNrIG9yIHN0cmluZyB0byBzY2FuXHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBjb3VudGVycyBhbmQgZmxhZ3NcclxuICAgIGlmIChsZW4gPiBBc2NpaUwpIHtcclxuICAgICAgbGVuID0gQXNjaWlMO1xyXG4gICAgfVxyXG4gICAgbGV0IGFtcG06IG51bWJlciA9IDA7IC8vIEFNL1BNIGluZGljYXRvclxyXG4gICAgbGV0IGhvdXI6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgbWludXRlOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHNlY29uZDogbnVtYmVyID0gMDtcclxuICAgIGxldCBtaWxsaXNlY29uZDogbnVtYmVyID0gMDtcclxuXHJcbiAgICB3aGlsZSAoSSA8IGxlbikge1xyXG4gICAgICBsZXQgbWFza0xlbmd0aDogbnVtYmVyO1xyXG4gICAgICBsZXQgbWF4TWFza0xlbjogbnVtYmVyO1xyXG5cclxuICAgICAgLy8gVG8gZ2V0IHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aCBvZiB0aGUgY29uc3RhbnRzIGluIHRoZSBtYXNrXHJcbiAgICAgIHN3aXRjaCAobWFza1tJXS5jaGFyQ29kZUF0KDApKSB7XHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19ISCk6XHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOlxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfU1MpOlxyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfUE0pOlxyXG4gICAgICAgICAgbWF4TWFza0xlbiA9IDI7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NUyk6XHJcbiAgICAgICAgICBtYXhNYXNrTGVuID0gMztcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgbWF4TWFza0xlbiA9IDE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLyogVG8gZ2V0IHRoZSBtaW5pbXVtIG9mIG1heE1hc2tMZW4gJiBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1haW5lZCBpbiBzdHJpbmdcclxuICAgICAgYmVjYXVzZSBpZiB0aGUgQXNjaWkgaXMgc2hvcnRlcihoYXMgbGVzcyBjaGFyYWN0ZXJzKXRoZW4gY3JlYXRlIFN0cmluZyBvbmx5XHJcbiAgICAgIG9mIHRoYXQgbm8uIG9mIGNoYXJhY3RlcnMgKG1hc2tMZW5ndGgpLCBub3Qgb2YgbWF4TWFza0xlbmd0aCAqL1xyXG4gICAgICBtYXNrTGVuZ3RoID0gTWF0aC5taW4obWF4TWFza0xlbiwgbGVuIC0gSSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKG1hc2tbSV0uY2hhckNvZGVBdCgwKSkge1xyXG4gICAgICAgIGNhc2UgKFBJQ0ludGVyZmFjZS5QSUNfSEgpOiB7XHJcbiAgICAgICAgICBob3VyID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NTVQpOiB7XHJcbiAgICAgICAgICBtaW51dGUgPSBtZ051bS5hXzJfbG9uZyhBc2NpaS5zdWJzdHIoSSwgbWFza0xlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIChQSUNJbnRlcmZhY2UuUElDX1NTKToge1xyXG4gICAgICAgICAgc2Vjb25kID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19NUyk6IHtcclxuICAgICAgICAgIG1pbGxpc2Vjb25kID0gbWdOdW0uYV8yX2xvbmcoQXNjaWkuc3Vic3RyKEksIG1hc2tMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAoUElDSW50ZXJmYWNlLlBJQ19QTSk6XHJcbiAgICAgICAgICBhbXBtID0gMDtcclxuICAgICAgICAgIGxldCBjMDogc3RyaW5nID0gQXNjaWlbSV07XHJcbiAgICAgICAgICBsZXQgYzE6IHN0cmluZztcclxuICAgICAgICAgIGMwID0gYzAudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgIGlmIChJICsgMSA8IGxlbikge1xyXG4gICAgICAgICAgICBjMSA9IEFzY2lpW0kgKyAxXTtcclxuICAgICAgICAgICAgYzEgPSBjMS50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGMxID09PSAnTScpIHtcclxuICAgICAgICAgICAgICBpZiAoYzAgPT09ICdBJylcclxuICAgICAgICAgICAgICAgIGFtcG0gPSAtMTtcclxuICAgICAgICAgICAgICBpZiAoYzAgPT09ICdQJylcclxuICAgICAgICAgICAgICAgIGFtcG0gPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIEkgKz0gbWFza0xlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayB2YWxpZGl0eSBvZiBtaW51dGVzIGFuZCBzZWNvbmRzXHJcbiAgICBpZiAoc2Vjb25kID4gNTkgfHwgbWludXRlID4gNTkpXHJcbiAgICAgIHJldHVybiAoMCk7XHJcblxyXG4gICAgLy8gQ29udmVydCBob3VyIHRvIFBNIGlmIHNwZWNpZmllZCBhcyBBTVxyXG4gICAgaWYgKGFtcG0gIT09IDApXHJcbiAgICAgIGlmIChhbXBtID09PSAtMSlcclxuICAgICAgLy8gQU1cclxuICAgICAge1xyXG4gICAgICAgIGlmIChob3VyID09PSAxMilcclxuICAgICAgICAgIGhvdXIgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGhvdXIgPCAxMilcclxuICAgICAgLy8gUE1cclxuICAgICAgICBob3VyICs9IDEyO1xyXG4gICAgaWYgKG1pbGxpU2Vjb25kcylcclxuICAgICAgcmV0dXJuIHRoaXMudGltZV8yX2ludChob3VyLCBtaW51dGUsIHNlY29uZCkgKiAxMDAwICsgbWlsbGlzZWNvbmQ7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiB0aGlzLnRpbWVfMl9pbnQoaG91ciwgbWludXRlLCBzZWNvbmQpO1xyXG4gIH1cclxuXHJcbiAgdGltZV8yX2ludChob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyLCBzZWNvbmQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gaG91ciAqIDM2MDAgKyBtaW51dGUgKiA2MCArIHNlY29uZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDb252ZXJ0IFwiMFwiL1wiMVwiIHRvIGZhbHNlL3RydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYm9vbFN0clwiPiAgXCIwXCIvXCIxXCJcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgXCIxXCIgb3IgZmFsc2UgaWYgb3RoZXJzXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgdG9Cb29sZWFuKGJvb2xTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGJvb2xTdHIgIT09IG51bGwgJiYgYm9vbFN0ciA9PT0gXCIxXCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU3RyaW5nIHRvIERhdGUgZnVuY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFfMl9kYXRlKHN0cjogc3RyaW5nLCBGb3JtYXQ6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmFfMl9kYXRlX2RhdGVtb2RlKHN0ciwgRm9ybWF0LCBjb21wSWR4KTtcclxuICB9XHJcblxyXG4gIGFfMl9kYXRlX3BpYyhzdHI6IHN0cmluZywgcGljOiBQSUMsIG1hc2s6IHN0cmluZywgY29tcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChzdHIgPT09IG51bGwpIHtcclxuICAgICAgc3RyID0gXCJcIjtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmFfMl9kYXRlX3BpY19kYXRlbW9kZShOU3RyaW5nLlRvQ2hhckFycmF5KHN0ciksIHN0ci5sZW5ndGgsIHBpYywgTlN0cmluZy5Ub0NoYXJBcnJheShtYXNrKSwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICB0b19hKG91dFZhbDogc3RyaW5nLCBvdXRfbGVuOiBudW1iZXIsIGRhdGU6IG51bWJlciwgRm9ybWF0OiBzdHJpbmcsIGNvbXBJZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b19hX2RhdGVtb2RlKG91dFZhbCwgb3V0X2xlbiwgZGF0ZSwgRm9ybWF0LCBmYWxzZSwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29udmVydCBzdHJpbmcgLT4gZGF0ZSB1c2luZyBhIGZvcm1hdCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYV8yX2RhdGVfZGF0ZW1vZGUoc3RyOiBzdHJpbmcsIEZvcm1hdDogc3RyaW5nLCBjb21wSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHBJQzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuREFURSwgY29tcElkeCk7XHJcbiAgICBpZiAoc3RyID09PSBudWxsKSB7XHJcbiAgICAgIHN0ciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5hXzJfZGF0ZV9waWNfZGF0ZW1vZGUoTlN0cmluZy5Ub0NoYXJBcnJheShzdHIpLCBzdHIubGVuZ3RoLCBwSUMsIE5TdHJpbmcuVG9DaGFyQXJyYXkocElDLmdldE1hc2soKSksIGNvbXBJZHgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFN0cmluZyB0byBhIGRhdGVtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHRvX2FfZGF0ZW1vZGUob3V0VmFsOiBzdHJpbmcsIG91dF9sZW46IG51bWJlciwgZGF0ZTogbnVtYmVyLCBGb3JtYXQ6IHN0cmluZywgaWdub3JlX2R0X2ZtdDogYm9vbGVhbiwgY29tcElkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuXHJcbiAgICAvLyBQYXJzZSB0aGUgcGljdHVyZVxyXG4gICAgbGV0IHBpYzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuREFURSwgY29tcElkeCk7XHJcblxyXG4gICAgLy8gQ29udmVydCB0aGUgIGRhdGUgLT4gc3RyaW5nXHJcbiAgICBpZiAob3V0VmFsID09PSBudWxsKSB7XHJcbiAgICAgIG91dFZhbCA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50b19hX3BpY19kYXRlbW9kZShvdXRWYWwsIG91dF9sZW4sIGRhdGUsIHBpYywgdHJ1ZSwgaWdub3JlX2R0X2ZtdCwgY29tcElkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRGVjb2RlIGRpZ2l0cyBmcm9tIGEgZGF0ZSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgZGF0ZV9hXzJfaV8xKHM6IHN0cmluZywgbGVuOiBudW1iZXIsIHBvczogbnVtYmVyKTogbnVtYmVyIHtcclxuXHJcbiAgICAvLyBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZSAncG9zKz1sZW4nIGFmdGVyIHRoZSB1c2luZyBvZiB0aGUgZnVuY3Rpb25cclxuICAgIGxldCBtZ051bTogTlVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgIGxldCBzdHI6IHN0cmluZztcclxuXHJcbiAgICBzdHIgPSBzLnN1YnN0cihwb3MsIGxlbik7XHJcbiAgICByZXR1cm4gbWdOdW0uYV8yX2xvbmcoc3RyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbW92ZV9kYXRlXzEoc3RyOiBzdHJpbmcsIHBvczogbnVtYmVyLCBtb3ZlYnk6IG51bWJlciwgbGVuOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgc3RyID0gU3RyVXRpbC5tZW1tb3ZlKHN0ciwgcG9zICsgbW92ZWJ5LCBzdHIsIHBvcywgbGVuIC0gcG9zKTtcclxuXHJcbiAgICBzdHIgPSBTdHJVdGlsLm1lbXNldChzdHIsIHBvcywgJzAnLCBtb3ZlYnkpO1xyXG4gICAgcmV0dXJuIHN0cjtcclxuICB9XHJcblxyXG4gIHRpbWVfMl9hKEFzY2lpOiBzdHJpbmcsIEFzY2lpTDogbnVtYmVyLCB0aW1lOiBudW1iZXIsIEZvcm1hdDogc3RyaW5nLCBjb21wSWR4OiBudW1iZXIsIG1pbGxpU2Vjb25kczogYm9vbGVhbik6IHN0cmluZyB7XHJcblxyXG4gICAgaWYgKFN0clV0aWwucnRyaW0oRm9ybWF0KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgRm9ybWF0ID0gXCJISDpNTTpTU1wiO1xyXG4gICAgfVxyXG4gICAgbGV0IHBpYzogUElDID0gbmV3IFBJQyhGb3JtYXQsIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSwgY29tcElkeCk7XHJcbiAgICBpZiAoQXNjaWkgPT09IG51bGwpIHtcclxuICAgICAgQXNjaWkgPSBwaWMuZ2V0TWFzaygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudGltZV8yX2FfcGljKEFzY2lpLCBBc2NpaUwsIHRpbWUsIHBpYywgZmFsc2UsIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVHJhbnNsYXRlcyBhIHN0cmluZyB0byBtYWdpYyBsb2dpY2FsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRpc3BWYWx1ZVwiPiAgIEEgc3RyaW5nIHZhbHVlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwaWNcIj4gICAgICAgICBUaGUgcGljdHVyZSB0byB1c2VcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+ICAgIFRoZSByYW5nZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGxvZ2ljYWwgdmFsdWVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHRvTG9naWNhbChkaXNwVmFsdWU6IHN0cmluZywgcGljOiBQSUMsIHJhbmdlU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgZGlzcFZhbHVlID0gZGlzcFZhbHVlLnRyaW0oKTtcclxuICAgIGlmIChkaXNwVmFsdWUgPT09IG51bGwgfHwgZGlzcFZhbHVlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBkaXNwVmFsdWUgPSBcIkZhbHNlXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwXzJfbG9naWNhbChkaXNwVmFsdWUsIHBpYy5nZXRNYXNrKCksIHJhbmdlU3RyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cmFuc2xhdGUgdGhlIGRpc3BsYXllZCB2YWx1ZSB0byBhIG1hZ2ljIGxvZ2ljYWwgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzcFZhbHVlXCI+dGhlIGRpc3BsYXllZCB2YWx1ZSA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWFza1wiPnRoZSBtYXNrIG9mIHRoZSBkaXNwbGF5ZWQgdmFsdWUgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJhbmdlU3RyXCI+dGhlIHJhbmdlIHN0cmluZyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgZGlzcF8yX2xvZ2ljYWwoZGlzcFZhbHVlOiBzdHJpbmcsIG1hc2s6IHN0cmluZywgcmFuZ2VTdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHN0cmlwcGVkVmFsdWU6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihkaXNwVmFsdWUubGVuZ3RoKTtcclxuXHJcbiAgICByYW5nZVN0ciA9IHRoaXMud2luX3JuZ19ib29sKHJhbmdlU3RyKTtcclxuICAgIHJhbmdlU3RyID0gU3RyVXRpbC5tYWtlUHJpbnRhYmxlVG9rZW5zKHJhbmdlU3RyLCBTRVFfMl9IVE1MKTtcclxuICAgIGxldCBpOiBudW1iZXIgPSByYW5nZVN0ci5pbmRleE9mKCcsJyk7XHJcbiAgICBsZXQgdHJ1ZVN0cjogc3RyaW5nID0gcmFuZ2VTdHIuc3Vic3RyKDAsIGkpO1xyXG4gICAgdHJ1ZVN0ciA9IFN0clV0aWwubWFrZVByaW50YWJsZVRva2Vucyh0cnVlU3RyLCBIVE1MXzJfU1RSKTtcclxuICAgIGkgPSAwO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBkaXNwVmFsdWUubGVuZ3RoICYmIGkgPCBtYXNrLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChtYXNrLmNoYXJDb2RlQXQoaSkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWCkge1xyXG4gICAgICAgIHN0cmlwcGVkVmFsdWUuQXBwZW5kKGRpc3BWYWx1ZS5jaGFyQXQoaSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsOiBzdHJpbmcgPSBzdHJpcHBlZFZhbHVlLlRvU3RyaW5nKCk7XHJcbiAgICBpZiAodHJ1ZVN0ci5sZW5ndGggPCB2YWwubGVuZ3RoKSB7XHJcbiAgICAgIHZhbCA9IHZhbC5zdWJzdHIoMCwgdHJ1ZVN0ci5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh2YWwubGVuZ3RoIDwgdHJ1ZVN0ci5sZW5ndGgpIHtcclxuICAgICAgICB0cnVlU3RyID0gdHJ1ZVN0ci5zdWJzdHIoMCwgdmFsLmxlbmd0aCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAodmFsLnRvVXBwZXJDYXNlKCkgPT09IHRydWVTdHIudG9VcHBlckNhc2UoKSkgPyBcIjFcIiA6IFwiMFwiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbnZlcnRpbmcgdGhlIGRpc3BsYXllZCB2YWx1ZSBvZiBhIHN0cmluZyB0byBpbnRlcm5hbFxyXG4gIC8vLyAgIHJlcHJlc2VudGF0aW9uIG11c3QgcmVtb3ZlIHRoZSBtYXNraW5nIGNoYXJhY3RlcnMgZnJvbSBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSB0b0FscGhhKGRpc3BWYWx1ZTogc3RyaW5nLCBwaWM6IFBJQyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHBpY3R1cmU6IHN0cmluZyA9IHBpYy5nZXRNYXNrKCk7XHJcbiAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIocGljLmdldE1hc2tTaXplKCkpO1xyXG4gICAgbGV0IElzQWxwaGFEQkNTOiBib29sZWFuID0gVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiBwaWMuaXNBdHRyQWxwaGEoKTtcclxuICAgIGxldCBjdXJyUGljdHVyZTogbnVtYmVyO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IGN1cnJQaWN0dXJlID0gMDtcclxuXHJcbiAgICBmb3IgKGN1cnJQaWN0dXJlID0gaSA9IDA7IGkgPCBkaXNwVmFsdWUubGVuZ3RoICYmIGN1cnJQaWN0dXJlIDwgcGljdHVyZS5sZW5ndGg7IGkrKywgY3VyclBpY3R1cmUrKykge1xyXG4gICAgICBpZiAoRGlzcGxheUNvbnZlcnRvci5pc0FscGhhUG9zaXRpb25hbERpcmVjdGl2ZShwaWN0dXJlLmNoYXJBdChjdXJyUGljdHVyZSkpKSB7XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChkaXNwVmFsdWUuY2hhckF0KGkpKTtcclxuXHJcbiAgICAgICAgaWYgKElzQWxwaGFEQkNTKSB7XHJcbiAgICAgICAgICAvLyBhIERCQ1MgY2hhcmFjdGVyIGluIFwiZGlzcFZhbHVlXCIgY29uc3VtZXMgdHdvIGNoYXJhY3RlcnMgaW4gXCJwaWN0dXJlXCJcclxuICAgICAgICAgIGxldCBzdHJEc3BWYWxPbmVDaGFyOiBzdHJpbmcgPSBkaXNwVmFsdWUuc3Vic3RyKGksIDEpO1xyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5sZW5CKHN0ckRzcFZhbE9uZUNoYXIpID09PSAyKSB7XHJcbiAgICAgICAgICAgIGN1cnJQaWN0dXJlID0gY3VyclBpY3R1cmUgKyAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlci5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PmlzIGNoZWNrZWQgY2hhciBBbHBoYSBQb3NpdGlvbmFsIERpcmVjdGl2ZTwvc3VtbWFyeT5cclxuICBzdGF0aWMgaXNBbHBoYVBvc2l0aW9uYWxEaXJlY3RpdmUodG9DaGVjazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXNjaWk6IG51bWJlciA9IHRvQ2hlY2suY2hhckNvZGVBdCgwKTtcclxuICAgIHJldHVybiAoYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfWCB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19VIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0wgfHxcclxuICAgICAgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfTiB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19KIHx8IGFzY2lpID09PSBQSUNJbnRlcmZhY2UuUElDX0cgfHwgYXNjaWkgPT09IFBJQ0ludGVyZmFjZS5QSUNfUyB8fCBhc2NpaSA9PT0gUElDSW50ZXJmYWNlLlBJQ19UKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgQ29tcGFyYXRpdmUgbmV3VmFsdWUgd2l0aCBwb3NzaWJsZSBSYW5nZSBpbiBDb250aW51b3VzUmFuZ2VWYWx1ZXMvZGlzY3JldGVSYW5nZVZhbHVlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBuZXdWYWx1ZSBpZiBpdCBwb3NzaWJsZSwgb2xkIHZhbHVlIG93ZXJ2aXNlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGZpbGxBbHBoYUJ5UmFuZ2UoQ29udGludW91c1JhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4sIGRpc2NyZXRlUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcblxyXG4gICAgbGV0IHRtcEJ1ZmZlcjogc3RyaW5nID0gdGhpcy5maWxsQWxwaGFCeURpc2NyZXRlUmFuZ2VWYWx1ZXMoZGlzY3JldGVSYW5nZVZhbHVlcywgbmV3VmFsdWUpO1xyXG4gICAgaWYgKHRtcEJ1ZmZlciAhPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdG1wQnVmZmVyO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRtcEJ1ZmZlciA9IHRoaXMuZmlsbEFscGhhQnlDb250aW51b3VzUmFuZ2VWYWx1ZXMoQ29udGludW91c1JhbmdlVmFsdWVzLCBuZXdWYWx1ZSk7XHJcbiAgICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gdG1wQnVmZmVyO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChkaXNjcmV0ZVJhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0bXBCdWZmZXIgPSB0aGlzLmNvbXBsZXRlQWxwaGFCeVJhbmdlKGRpc2NyZXRlUmFuZ2VWYWx1ZXMsIG5ld1ZhbHVlKTtcclxuICAgICAgICAgIGlmICh0bXBCdWZmZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRtcEJ1ZmZlcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHVucG9zc2libGUgdG8gZmluZCBpdCBpbiB0aGUgcmFuZ2UgcmV0dXJuIG5vdCBjaGFuZ2VkIG9sZHZhbHVlXHJcbiAgICByZXR1cm4gbmV3VmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCBBbHBoYSBzdHJpbmcgYnkgZGlzY3JldGUgcmFuZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGlzY3JldGVSYW5nZVZhbHVlc1wiPnZlY3RvciBvZiBkaXNjcmV0ZSByYW5nZSB2YWx1ZXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbHVlXCI+dmFsdWUsIHRyeSBmb3VuZCBpbiB0aGUgdmVjdG9yIG9mIGRpc2NyZXRlIHJhbmdlc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZm91bmQgdmFsdWUgb3IgbnVsbChub3QgZm91bmQpXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBmaWxsQWxwaGFCeURpc2NyZXRlUmFuZ2VWYWx1ZXMoZGlzY3JldGVSYW5nZVZhbHVlczogTGlzdDxzdHJpbmc+LCBuZXdWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuXHJcbiAgICBpZiAoZGlzY3JldGVSYW5nZVZhbHVlcyAhPT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGlzY3JldGVSYW5nZVZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBkaXNjcmV0ZVZhbHVlOiBzdHJpbmcgPSBkaXNjcmV0ZVJhbmdlVmFsdWVzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGxldCB0cnVuY2F0ZWRWYWx1ZTogc3RyaW5nID0gZGlzY3JldGVWYWx1ZS5zdWJzdHIoMCwgTWF0aC5taW4obmV3VmFsdWUubGVuZ3RoLCBkaXNjcmV0ZVZhbHVlLmxlbmd0aCkpO1xyXG4gICAgICAgIGlmIChuZXdWYWx1ZS50b1VwcGVyQ2FzZSgpID09PSB0cnVuY2F0ZWRWYWx1ZS50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICByZXR1cm4gZGlzY3JldGVWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZpbGwgQWxwaGEgc3RyaW5nIGJ5IGNvbnRpbnVvdXMgcmFuZ2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiQ29udGludW91c1JhbmdlVmFsdWVzXCI+dmVjdG9yIG9mIGNvbnRpbnVvdXMgcmFuZ2UgdmFsdWVzXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWx1ZVwiPnZhbHVlLCB0cnkgZm91bmQgaW4gdGhlIHZlY3RvciBvZiBjb250aW51b3VzIHJhbmdlc1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZm91bmQgdmFsdWUgb3IgbnVsbChub3QgZm91bmQpXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBmaWxsQWxwaGFCeUNvbnRpbnVvdXNSYW5nZVZhbHVlcyhDb250aW51b3VzUmFuZ2VWYWx1ZXM6IExpc3Q8c3RyaW5nPiwgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBuZXdWYWx1ZSA9IFN0clV0aWwucnRyaW0obmV3VmFsdWUpO1xyXG5cclxuXHJcbiAgICBpZiAoQ29udGludW91c1JhbmdlVmFsdWVzICE9PSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBDb250aW51b3VzUmFuZ2VWYWx1ZXMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgZnJvbTogc3RyaW5nID0gQ29udGludW91c1JhbmdlVmFsdWVzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGxldCB0bzogc3RyaW5nID0gQ29udGludW91c1JhbmdlVmFsdWVzLmdldF9JdGVtKGkgPSBpICsgMSk7XHJcbiAgICAgICAgaWYgKE5TdHJpbmcuQ29tcGFyZU9yZGluYWwobmV3VmFsdWUsIGZyb20pID49IDAgJiYgTlN0cmluZy5Db21wYXJlT3JkaW5hbChuZXdWYWx1ZSwgdG8pIDw9IDApIHtcclxuICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUcnkgdG8gY29tcGxldGUgdGhlIG5ld1ZhbHVlIHVzaW5nIHRoZSBSYW5nZVxyXG4gIC8vLyAgIGZpcnN0IHRyeSB0byBjb21sZXRlIHRoZSB2YWx1ZSBmb3IgY2FzZSBtZWFuaW5nIGFuZCBhZnRlciB0aGF0IGZvciBpZ25vcmUgY2FzZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2ZWN0b3JcIj5vZiByYW5nZXNcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrZWRcIj52YWx1ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdmFsdWUgY29tcGxldGVkIGJ5IHJhbmdlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBjb21wbGV0ZUFscGhhQnlSYW5nZShkaXNjcmV0ZVJhbmdlVmFsdWVzOiBMaXN0PHN0cmluZz4sIG5ld1ZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCBtYXhDb2luY2lkZTogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPigyKTtcclxuICAgIGZvciAobGV0IF9haTogbnVtYmVyID0gMDsgX2FpIDwgbWF4Q29pbmNpZGUubGVuZ3RoOyArK19haSlcclxuICAgICAgbWF4Q29pbmNpZGVbX2FpXSA9IDA7XHJcblxyXG4gICAgbGV0IGJlc3RJdGVtOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KDIpO1xyXG4gICAgZm9yIChsZXQgX2FpOiBudW1iZXIgPSAwOyBfYWkgPCBiZXN0SXRlbS5sZW5ndGg7ICsrX2FpKVxyXG4gICAgICBiZXN0SXRlbVtfYWldID0gbnVsbDtcclxuXHJcbiAgICBsZXQgQ0hFQ0tfQ0FTRTogbnVtYmVyID0gMDtcclxuICAgIGxldCBJR05PUkVfQ0FTRTogbnVtYmVyID0gMTtcclxuXHJcbiAgICBsZXQgY2FzZUxldHRlcnM6IG51bWJlciA9IENIRUNLX0NBU0U7XHJcblxyXG4gICAgd2hpbGUgKGNhc2VMZXR0ZXJzID09PSBDSEVDS19DQVNFIHx8IGNhc2VMZXR0ZXJzID09PSBJR05PUkVfQ0FTRSkge1xyXG4gICAgICBsZXQgbG93ZXJWYWx1ZTogc3RyaW5nO1xyXG4gICAgICBpZiAoY2FzZUxldHRlcnMgPT09IENIRUNLX0NBU0UpIHtcclxuICAgICAgICBsb3dlclZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbG93ZXJWYWx1ZSA9IG5ld1ZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgbG93ZXJWYWx1ZSA9IFN0clV0aWwucnRyaW0obG93ZXJWYWx1ZSk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkaXNjcmV0ZVJhbmdlVmFsdWVzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IHdyb25nTGV0dGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGN1cnJDb2luY2lkZTogbnVtYmVyID0gMDtcclxuICAgICAgICBsZXQgcmFuZ2VJdGVtOiBzdHJpbmc7XHJcbiAgICAgICAgaWYgKGNhc2VMZXR0ZXJzID09PSBDSEVDS19DQVNFKSB7XHJcbiAgICAgICAgICByYW5nZUl0ZW0gPSBkaXNjcmV0ZVJhbmdlVmFsdWVzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJhbmdlSXRlbSA9IGRpc2NyZXRlUmFuZ2VWYWx1ZXMuZ2V0X0l0ZW0oaSkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxvd0xlbmd0aDogbnVtYmVyID0gbG93ZXJWYWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgbGV0IHJhbmdlTGVuZ3RoOiBudW1iZXIgPSByYW5nZUl0ZW0ubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsb3dMZW5ndGggPCByYW5nZUxlbmd0aCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGxvd0xlbmd0aDsgaiA9IGogKyAxKSB7XHJcbiAgICAgICAgICAgIGlmICghKGxvd2VyVmFsdWUuY2hhckF0KGopID09PSByYW5nZUl0ZW0uY2hhckF0KGopKSkge1xyXG4gICAgICAgICAgICAgIHdyb25nTGV0dGVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyQ29pbmNpZGUgPSBjdXJyQ29pbmNpZGUgKyAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHdyb25nTGV0dGVyID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyQ29pbmNpZGUgPiBtYXhDb2luY2lkZVtjYXNlTGV0dGVyc10gJiYgIXdyb25nTGV0dGVyKSB7XHJcbiAgICAgICAgICBiZXN0SXRlbVtjYXNlTGV0dGVyc10gPSBkaXNjcmV0ZVJhbmdlVmFsdWVzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgICAgbWF4Q29pbmNpZGVbY2FzZUxldHRlcnNdID0gY3VyckNvaW5jaWRlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXNlTGV0dGVycyA9IGNhc2VMZXR0ZXJzICsgMTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaWYgKGJlc3RJdGVtW0NIRUNLX0NBU0VdICE9PSBudWxsKVxyXG4gICAgICByZXR1cm4gYmVzdEl0ZW1bQ0hFQ0tfQ0FTRV07XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGJlc3RJdGVtW0lHTk9SRV9DQVNFXSAhPT0gbnVsbClcclxuICAgICAgICByZXR1cm4gYmVzdEl0ZW1bSUdOT1JFX0NBU0VdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2V0RGF0ZUNoYXIoZGF0ZUNoYXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5EQVRFQ0hBUiA9IGRhdGVDaGFyO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZUNoYXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkRBVEVDSEFSO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0b3JhZ2VBdHRyaWJ1dGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFN0cmluZ1ZhbHVlVG9NZ1ZhbHVlKHZhbHVlOiBzdHJpbmcsIHN0b3JhZ2VBdHRyaWJ1dGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGZpbGxlcjogc3RyaW5nLCBsZW5ndGg6IG51bWJlcik6IGFueSB7XHJcbiAgICBzd2l0Y2ggKHN0b3JhZ2VBdHRyaWJ1dGUpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERToge1xyXG4gICAgICAgIGxldCBuZXdWYWw6IHN0cmluZyA9IHZhbHVlO1xyXG4gICAgICAgIG5ld1ZhbCA9IE5TdHJpbmcuUGFkUmlnaHQobmV3VmFsLCBsZW5ndGgsIGZpbGxlcik7XHJcbiAgICAgICAgcmV0dXJuIG5ld1ZhbDtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkRBVEU6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgIHJldHVybiBuZXcgTlVNX1RZUEUodmFsdWUpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgQmVpbmcgdXNlZCB0byBzZW5kIHBhcmFtZXRlcnMgdG8gdGhlICd0aW1lX2JyZWFrJyBtZXRob2RcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFRpbWVCcmVha1BhcmFtcyB7XHJcbiAgaG91cjogbnVtYmVyID0gMDtcclxuICBtaW51dGU6IG51bWJlciA9IDA7XHJcbiAgc2Vjb25kOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKGhvdXJfOiBudW1iZXIsIG1pbnV0ZV86IG51bWJlciwgc2Vjb25kXzogbnVtYmVyKTtcclxuICBjb25zdHJ1Y3Rvcihob3VyXz86IG51bWJlciwgbWludXRlXz86IG51bWJlciwgc2Vjb25kXz86IG51bWJlcikge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29uc3RydWN0b3JfMShob3VyXywgbWludXRlXywgc2Vjb25kXyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoaG91cl86IG51bWJlciwgbWludXRlXzogbnVtYmVyLCBzZWNvbmRfOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuaG91ciA9IGhvdXJfO1xyXG4gICAgdGhpcy5taW51dGUgPSBtaW51dGVfO1xyXG4gICAgdGhpcy5zZWNvbmQgPSBzZWNvbmRfO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBCZWluZyB1c2VkIHRvIHNlbmQgaW50IGJ5IFJlZlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5jbGFzcyBJbnRSZWYge1xyXG4gIHZhbDogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IodmFsXzogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnZhbCA9IHZhbF87XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIEJlaW5nIHVzZWQgdG8gc2VuZCBwYXJhbWV0ZXJzIHRvIHRoZSAnZGF0ZV9pXzJfbm0nIG1ldGhvZFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5jbGFzcyBEYXRlTmFtZVBhcmFtcyB7XHJcbiAgb3V0VmFsOiBzdHJpbmdbXSA9IG51bGw7XHJcbiAgbGVuOiBudW1iZXIgPSAwO1xyXG4gIG91dElkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3Iob3V0Xzogc3RyaW5nW10sIG91dElkeF86IG51bWJlciwgbGVuXzogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm91dFZhbCA9IG91dF87XHJcbiAgICB0aGlzLm91dElkeCA9IG91dElkeF87XHJcbiAgICB0aGlzLmxlbiA9IGxlbl87XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIEJlaW5nIHVzZWQgdG8gc2VuZCBwYXJhbWV0ZXJzIHRvIHRoZSAnZGF0ZV9icmVha19kYXRlbW9kZScgbWV0aG9kXHJcbi8vLyAgIGl0J3Mgc3RydWN0XHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBEYXRlQnJlYWtQYXJhbXMge1xyXG4gIGRheTogbnVtYmVyID0gMDtcclxuICBkb3c6IG51bWJlciA9IDA7XHJcbiAgZG95OiBudW1iZXIgPSAwO1xyXG4gIG1vbnRoOiBudW1iZXIgPSAwO1xyXG4gIHllYXI6IG51bWJlciA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IoeWVhcl86IG51bWJlciwgbW9udGhfOiBudW1iZXIsIGRheV86IG51bWJlciwgZG95XzogbnVtYmVyLCBkb3dfOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKHllYXJfPzogbnVtYmVyLCBtb250aF8/OiBudW1iZXIsIGRheV8/OiBudW1iZXIsIGRveV8/OiBudW1iZXIsIGRvd18/OiBudW1iZXIpIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEoeWVhcl8sIG1vbnRoXywgZGF5XywgZG95XywgZG93Xyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoeWVhcl86IG51bWJlciwgbW9udGhfOiBudW1iZXIsIGRheV86IG51bWJlciwgZG95XzogbnVtYmVyLCBkb3dfOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMueWVhciA9IHllYXJfO1xyXG4gICAgdGhpcy5tb250aCA9IG1vbnRoXztcclxuICAgIHRoaXMuZGF5ID0gZGF5XztcclxuICAgIHRoaXMuZG95ID0gZG95XztcclxuICAgIHRoaXMuZG93ID0gZG93XztcclxuICB9XHJcbn1cclxuIl19
|