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