@magic-xpa/gui 4.1200.0-dev4120.7 → 4.1200.0-dev4120.70
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 +5708 -245
- 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/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,612 +0,0 @@
|
|
|
1
|
-
import { ApplicationException, Encoding, ISO_8859_1_Encoding, List, NNumber, NString, StringBuilder } from '@magic-xpa/mscorelib';
|
|
2
|
-
import { BlobType } from './BlobType';
|
|
3
|
-
import { StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode } from '@magic-xpa/utils';
|
|
4
|
-
import { DisplayConvertor } from '../gui/DisplayConvertor';
|
|
5
|
-
import { RecordUtils } from './RecordUtils';
|
|
6
|
-
import { GuiConstants } from '../../GuiConstants';
|
|
7
|
-
import { GuiEnvironment } from '../../GuiEnvironment';
|
|
8
|
-
import { VectorTypeBase } from './VectorTypeBase';
|
|
9
|
-
export class VectorType extends VectorTypeBase {
|
|
10
|
-
static VERSION = 5;
|
|
11
|
-
static EMPTY_BLOB_PREFIX_LEN = 7;
|
|
12
|
-
static BLOB_TYPE_STRUCT_SIZE = 28;
|
|
13
|
-
_cells = null;
|
|
14
|
-
_encoding = null;
|
|
15
|
-
_allowNull = false;
|
|
16
|
-
_cellContentType = null;
|
|
17
|
-
_cellSize = 0;
|
|
18
|
-
_cellsAttr = null;
|
|
19
|
-
_cellsDefaultVal = null;
|
|
20
|
-
_cellsIsNullDefault = false;
|
|
21
|
-
_dataBuf = null;
|
|
22
|
-
_initialized = false;
|
|
23
|
-
_nullBuf = null;
|
|
24
|
-
_originalflatData = null;
|
|
25
|
-
constructor(cellsTypeOrBlobStringOrFld, contentType, defualt, isDefNull, nullAlowed, length) {
|
|
26
|
-
super();
|
|
27
|
-
if (arguments.length === 6)
|
|
28
|
-
this.constructor_0(cellsTypeOrBlobStringOrFld, contentType, defualt, isDefNull, nullAlowed, length);
|
|
29
|
-
else if (arguments.length === 1 && (cellsTypeOrBlobStringOrFld === null || cellsTypeOrBlobStringOrFld.constructor === String))
|
|
30
|
-
this.constructor_1(cellsTypeOrBlobStringOrFld);
|
|
31
|
-
else
|
|
32
|
-
this.constructor_2(cellsTypeOrBlobStringOrFld);
|
|
33
|
-
}
|
|
34
|
-
constructor_0(cellsType, contentType, defualt, isDefNull, nullAlowed, length) {
|
|
35
|
-
this._cells = new List();
|
|
36
|
-
this._cellsAttr = cellsType;
|
|
37
|
-
this._cellContentType = contentType;
|
|
38
|
-
this._cellsDefaultVal = defualt;
|
|
39
|
-
this._cellsIsNullDefault = isDefNull;
|
|
40
|
-
this._cellSize = ((this._cellsAttr === StorageAttribute.UNICODE) ? (length * 2) : length);
|
|
41
|
-
this._initialized = true;
|
|
42
|
-
this._allowNull = nullAlowed;
|
|
43
|
-
this._nullBuf = new StringBuilder();
|
|
44
|
-
this._dataBuf = new StringBuilder();
|
|
45
|
-
this._originalflatData = this.toString();
|
|
46
|
-
this._encoding = GuiEnvironment.Environment.GetEncoding();
|
|
47
|
-
}
|
|
48
|
-
constructor_1(blobString) {
|
|
49
|
-
this._cells = new List();
|
|
50
|
-
this._initialized = false;
|
|
51
|
-
this._originalflatData = blobString;
|
|
52
|
-
this._encoding = GuiEnvironment.Environment.GetEncoding();
|
|
53
|
-
}
|
|
54
|
-
constructor_2(fld) {
|
|
55
|
-
this._cells = new List();
|
|
56
|
-
this._cellsAttr = fld.getCellsType();
|
|
57
|
-
this._cellContentType = fld.getVecCellsContentType();
|
|
58
|
-
this._cellsDefaultVal = fld.getCellDefualtValue();
|
|
59
|
-
this._cellsIsNullDefault = fld.isNullDefault();
|
|
60
|
-
this._cellSize = ((this._cellsAttr === StorageAttribute.UNICODE) ? (fld.getVecCellsSize() * 2) : fld.getVecCellsSize());
|
|
61
|
-
this._initialized = true;
|
|
62
|
-
this._allowNull = fld.NullAllowed;
|
|
63
|
-
this._nullBuf = new StringBuilder();
|
|
64
|
-
this._dataBuf = new StringBuilder();
|
|
65
|
-
this._originalflatData = this.toString();
|
|
66
|
-
this._encoding = GuiEnvironment.Environment.GetEncoding();
|
|
67
|
-
}
|
|
68
|
-
init() {
|
|
69
|
-
let tokens = null;
|
|
70
|
-
let tokenIdx = 0;
|
|
71
|
-
let currentToken = null;
|
|
72
|
-
let isFlatDataTranslated = this.isUnicode(this._originalflatData);
|
|
73
|
-
let isDbcsAlpha = false;
|
|
74
|
-
let pos = BlobType.blobPrefixLength(this._originalflatData);
|
|
75
|
-
tokens = StrUtil.tokenize(this._originalflatData.substr(pos), ",");
|
|
76
|
-
let vecSize = 0;
|
|
77
|
-
if (!this._initialized) {
|
|
78
|
-
if (VectorType.validateBlobContents(this._originalflatData)) {
|
|
79
|
-
let blobPrefix = BlobType.getPrefix(this._originalflatData);
|
|
80
|
-
this._cellContentType = BlobType.getContentType(blobPrefix);
|
|
81
|
-
pos = (pos + 4 + 5 + 1);
|
|
82
|
-
tokenIdx++;
|
|
83
|
-
currentToken = tokens[tokenIdx];
|
|
84
|
-
pos = pos + (currentToken.length + 1);
|
|
85
|
-
tokenIdx++;
|
|
86
|
-
currentToken = tokens[tokenIdx];
|
|
87
|
-
pos = pos + (currentToken.length + 1);
|
|
88
|
-
tokenIdx++;
|
|
89
|
-
currentToken = tokens[tokenIdx];
|
|
90
|
-
this._cellsAttr = currentToken.charAt(0);
|
|
91
|
-
pos = pos + 2;
|
|
92
|
-
tokenIdx++;
|
|
93
|
-
currentToken = tokens[tokenIdx];
|
|
94
|
-
this._cellSize = NNumber.Parse(currentToken);
|
|
95
|
-
pos = pos + (currentToken.length + 1);
|
|
96
|
-
if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
|
|
97
|
-
this._cellsDefaultVal = StrUtil.stringToHexaDump(this._originalflatData.substr(pos, this._cellSize), 2);
|
|
98
|
-
else if (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO) {
|
|
99
|
-
if (UtilStrByteMode.isLocaleDefLangDBCS()) {
|
|
100
|
-
isDbcsAlpha = true;
|
|
101
|
-
isFlatDataTranslated = true;
|
|
102
|
-
this._cellsDefaultVal = UtilStrByteMode.leftB(this._originalflatData.substr(pos), this._cellSize);
|
|
103
|
-
}
|
|
104
|
-
else
|
|
105
|
-
this._cellsDefaultVal = this._originalflatData.substr(pos, this._cellSize);
|
|
106
|
-
if (this._encoding !== null && !isFlatDataTranslated) {
|
|
107
|
-
try {
|
|
108
|
-
let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(this._cellsDefaultVal);
|
|
109
|
-
this._cellsDefaultVal = this._encoding.GetString(ba, 0, ba.length);
|
|
110
|
-
}
|
|
111
|
-
catch (Exception) {
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
else if (this._cellsAttr === StorageAttribute.UNICODE) {
|
|
116
|
-
this._cellsDefaultVal = this._originalflatData.substr(pos, this._cellSize);
|
|
117
|
-
try {
|
|
118
|
-
let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(this._cellsDefaultVal);
|
|
119
|
-
this._cellsDefaultVal = Encoding.Unicode.GetString(ba, 0, ba.length);
|
|
120
|
-
}
|
|
121
|
-
catch (Exception) {
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
else
|
|
125
|
-
this._cellsDefaultVal = this._originalflatData.substr(pos, this._cellSize);
|
|
126
|
-
if (isDbcsAlpha)
|
|
127
|
-
pos = pos + this._cellsDefaultVal.length + 1;
|
|
128
|
-
else
|
|
129
|
-
pos = (pos + this._cellSize + 1);
|
|
130
|
-
tokens = StrUtil.tokenize(this._originalflatData.substr(pos), ",");
|
|
131
|
-
tokenIdx = 0;
|
|
132
|
-
currentToken = tokens[tokenIdx];
|
|
133
|
-
this._cellsIsNullDefault = DisplayConvertor.toBoolean(currentToken);
|
|
134
|
-
pos = pos + (currentToken.length + 1);
|
|
135
|
-
tokenIdx++;
|
|
136
|
-
currentToken = tokens[tokenIdx];
|
|
137
|
-
this._allowNull = DisplayConvertor.toBoolean(currentToken);
|
|
138
|
-
pos = pos + (currentToken.length + 1);
|
|
139
|
-
tokenIdx++;
|
|
140
|
-
currentToken = tokens[tokenIdx];
|
|
141
|
-
pos = pos + (currentToken.length + 1);
|
|
142
|
-
tokenIdx++;
|
|
143
|
-
currentToken = tokens[tokenIdx];
|
|
144
|
-
vecSize = NNumber.Parse(currentToken);
|
|
145
|
-
pos = pos + (currentToken.length + 1);
|
|
146
|
-
tokenIdx++;
|
|
147
|
-
currentToken = tokens[tokenIdx];
|
|
148
|
-
pos = pos + (currentToken.length + 1);
|
|
149
|
-
if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
|
|
150
|
-
tokenIdx++;
|
|
151
|
-
currentToken = tokens[tokenIdx];
|
|
152
|
-
pos = pos + (currentToken.length + 1);
|
|
153
|
-
}
|
|
154
|
-
let data;
|
|
155
|
-
if (isDbcsAlpha) {
|
|
156
|
-
data = UtilStrByteMode.leftB(this._originalflatData.substr(pos), (vecSize * this._cellSize));
|
|
157
|
-
pos = pos + data.length + 1;
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
data = this._originalflatData.substr(pos, (vecSize * this._cellSize));
|
|
161
|
-
pos = (pos + vecSize * this._cellSize + 1);
|
|
162
|
-
}
|
|
163
|
-
this._dataBuf = new StringBuilder(data.length);
|
|
164
|
-
if (this._cellsAttr !== StorageAttribute.ALPHA && this._cellsAttr !== StorageAttribute.MEMO && this._cellsAttr !== StorageAttribute.UNICODE)
|
|
165
|
-
this._dataBuf.Append(data);
|
|
166
|
-
let nullBuf = this._originalflatData.substr(pos, vecSize);
|
|
167
|
-
pos = (pos + vecSize + 1);
|
|
168
|
-
this._nullBuf = new StringBuilder(nullBuf);
|
|
169
|
-
if (this._cellsAttr !== StorageAttribute.BLOB && this._cellsAttr !== StorageAttribute.BLOB_VECTOR) {
|
|
170
|
-
for (let i = 0; i < vecSize; i++) {
|
|
171
|
-
let isNull = nullBuf.charAt(i) > '\0';
|
|
172
|
-
if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
|
|
173
|
-
this._cells.push(new CellElement(StrUtil.stringToHexaDump(data.substr((i * this._cellSize), this._cellSize), 2), isNull));
|
|
174
|
-
else if (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO) {
|
|
175
|
-
let cellData;
|
|
176
|
-
if (isDbcsAlpha)
|
|
177
|
-
cellData = UtilStrByteMode.midB(data, (i * this._cellSize), this._cellSize);
|
|
178
|
-
else
|
|
179
|
-
cellData = data.substr((i * this._cellSize), this._cellSize);
|
|
180
|
-
if (this._encoding !== null && !isFlatDataTranslated) {
|
|
181
|
-
try {
|
|
182
|
-
let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(cellData);
|
|
183
|
-
cellData = this._encoding.GetString(ba, 0, ba.length);
|
|
184
|
-
}
|
|
185
|
-
catch (SystemException) {
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
this._dataBuf.Append(cellData);
|
|
189
|
-
this._cells.push(new CellElement(cellData, isNull));
|
|
190
|
-
}
|
|
191
|
-
else if (this._cellsAttr === StorageAttribute.UNICODE) {
|
|
192
|
-
let cellData = data.substr((i * this._cellSize), this._cellSize);
|
|
193
|
-
try {
|
|
194
|
-
let ba = ISO_8859_1_Encoding.ISO_8859_1.GetBytes(cellData);
|
|
195
|
-
cellData = Encoding.Unicode.GetString(ba, 0, ba.length);
|
|
196
|
-
}
|
|
197
|
-
catch (SystemException) {
|
|
198
|
-
}
|
|
199
|
-
this._dataBuf.Append(cellData);
|
|
200
|
-
this._cells.push(new CellElement(cellData, isNull));
|
|
201
|
-
}
|
|
202
|
-
else
|
|
203
|
-
this._cells.push(new CellElement(data.substr((i * this._cellSize), this._cellSize), isNull));
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
for (let i = 0; i < vecSize; i++) {
|
|
208
|
-
tokens = StrUtil.tokenize(this._originalflatData.substr(pos), ",");
|
|
209
|
-
tokenIdx = 0;
|
|
210
|
-
tokenIdx++;
|
|
211
|
-
currentToken = tokens[tokenIdx];
|
|
212
|
-
let size = NNumber.Parse(currentToken);
|
|
213
|
-
pos = pos + (currentToken.length + 1);
|
|
214
|
-
let blobHeader = "";
|
|
215
|
-
for (let j = 0; j < GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT; j++) {
|
|
216
|
-
tokenIdx++;
|
|
217
|
-
currentToken = tokens[tokenIdx];
|
|
218
|
-
blobHeader = blobHeader + currentToken;
|
|
219
|
-
pos = pos + (currentToken.length + 1);
|
|
220
|
-
if (j !== GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT - 1) {
|
|
221
|
-
blobHeader = blobHeader + ",";
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
let cellData = this._originalflatData.substr(pos, size);
|
|
225
|
-
let isNull = nullBuf.charAt(i) > '\0';
|
|
226
|
-
this._cells.push(new CellElement(cellData, isNull, blobHeader));
|
|
227
|
-
pos = (pos + size + 1);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
if (this._dataBuf.Length === 0)
|
|
231
|
-
this._dataBuf = new StringBuilder(data.length);
|
|
232
|
-
this._initialized = true;
|
|
233
|
-
}
|
|
234
|
-
else
|
|
235
|
-
throw new ApplicationException("in VectorType.init wrong vector format");
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
toString() {
|
|
239
|
-
let res = "";
|
|
240
|
-
if (this._initialized) {
|
|
241
|
-
res = res + 0 + "," + 0 + "," + "0" + "," + this._cellsAttr + "," + this._cellContentType + ";";
|
|
242
|
-
res = res + this.buildHeadersString();
|
|
243
|
-
if (this._cellsAttr === StorageAttribute.UNICODE) {
|
|
244
|
-
let dataBufCharArry = new Array(this._dataBuf.Length * 2);
|
|
245
|
-
for (let i = 0; i < this._dataBuf.Length; i = i + 1) {
|
|
246
|
-
dataBufCharArry[i * 2] = String.fromCharCode((this._dataBuf.get_Item(i).charCodeAt(0)) % 256);
|
|
247
|
-
dataBufCharArry[i * 2 + 1] = String.fromCharCode((this._dataBuf.get_Item(i).charCodeAt(0)) / 256);
|
|
248
|
-
}
|
|
249
|
-
res = res + NString.FromChars(dataBufCharArry) + ",";
|
|
250
|
-
}
|
|
251
|
-
else
|
|
252
|
-
res = res + this._dataBuf + ",";
|
|
253
|
-
res = res + this._nullBuf + ",";
|
|
254
|
-
if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
|
|
255
|
-
res = res + this.getBlobsBuf();
|
|
256
|
-
res = res + VectorType.BLOB_TABLE_STR;
|
|
257
|
-
}
|
|
258
|
-
else
|
|
259
|
-
res = this._originalflatData;
|
|
260
|
-
return res;
|
|
261
|
-
}
|
|
262
|
-
getCellsAttr() {
|
|
263
|
-
if (!this._initialized)
|
|
264
|
-
return VectorType.getCellsAttr(this._originalflatData);
|
|
265
|
-
else
|
|
266
|
-
return this._cellsAttr;
|
|
267
|
-
}
|
|
268
|
-
getCellSize() {
|
|
269
|
-
let retVal;
|
|
270
|
-
if (!this._initialized)
|
|
271
|
-
retVal = VectorType.getCellSize(this._originalflatData);
|
|
272
|
-
else
|
|
273
|
-
retVal = this._cellSize;
|
|
274
|
-
if (this.getCellsAttr() === StorageAttribute.UNICODE)
|
|
275
|
-
retVal = Math.floor(retVal / 2);
|
|
276
|
-
return retVal;
|
|
277
|
-
}
|
|
278
|
-
getVecSize() {
|
|
279
|
-
if (!this._initialized)
|
|
280
|
-
return VectorType.getVecSize(this._originalflatData);
|
|
281
|
-
else
|
|
282
|
-
return this._cells.length;
|
|
283
|
-
}
|
|
284
|
-
getVecCell(idx) {
|
|
285
|
-
let retVal = null;
|
|
286
|
-
if (idx > 0) {
|
|
287
|
-
this.init();
|
|
288
|
-
if (idx <= this.getVecSize()) {
|
|
289
|
-
retVal = this._cells.get_Item(idx - 1).data;
|
|
290
|
-
if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
|
|
291
|
-
retVal = this._cells.get_Item(idx - 1).blobFieldPrefix + ";" + retVal;
|
|
292
|
-
if (StorageAttributeCheck.isTypeLogical(this._cellsAttr))
|
|
293
|
-
retVal = ((retVal.charAt(0) === '\0') ? "0" : "1");
|
|
294
|
-
if (this._cells.get_Item(idx - 1).isNull)
|
|
295
|
-
retVal = null;
|
|
296
|
-
}
|
|
297
|
-
else if (!this._cellsIsNullDefault)
|
|
298
|
-
retVal = this._cellsDefaultVal;
|
|
299
|
-
}
|
|
300
|
-
return retVal;
|
|
301
|
-
}
|
|
302
|
-
GetCellValues() {
|
|
303
|
-
let retVal = null;
|
|
304
|
-
let cellValues = null;
|
|
305
|
-
this.init();
|
|
306
|
-
if (this.getVecSize() > 0) {
|
|
307
|
-
cellValues = new Array(this.getVecSize());
|
|
308
|
-
for (let idx = 0; idx < this.getVecSize(); idx++) {
|
|
309
|
-
retVal = this._cells.get_Item(idx).data;
|
|
310
|
-
if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
|
|
311
|
-
retVal = this._cells.get_Item(idx).blobFieldPrefix + ";" + retVal;
|
|
312
|
-
if (StorageAttributeCheck.isTypeLogical(this._cellsAttr))
|
|
313
|
-
retVal = ((retVal.charAt(0) === '\0') ? "0" : "1");
|
|
314
|
-
if (this._cells.get_Item(idx).isNull)
|
|
315
|
-
retVal = null;
|
|
316
|
-
cellValues[idx] = retVal;
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
else if (!this._cellsIsNullDefault) {
|
|
320
|
-
cellValues = [
|
|
321
|
-
this._cellsDefaultVal
|
|
322
|
-
];
|
|
323
|
-
}
|
|
324
|
-
return cellValues;
|
|
325
|
-
}
|
|
326
|
-
setVecCell(idx, newValue, isNull) {
|
|
327
|
-
let res = false;
|
|
328
|
-
let createBufferValForNumType = true;
|
|
329
|
-
try {
|
|
330
|
-
if (idx > 0) {
|
|
331
|
-
this.init();
|
|
332
|
-
let localCellSize = (this._cellsAttr === StorageAttribute.UNICODE) ? Math.floor(this._cellSize / 2) : this._cellSize;
|
|
333
|
-
if (isNull && !this._allowNull) {
|
|
334
|
-
isNull = false;
|
|
335
|
-
newValue = this._cellsDefaultVal;
|
|
336
|
-
}
|
|
337
|
-
if (idx <= this._cells.length) {
|
|
338
|
-
let curr = this._cells.get_Item(idx - 1);
|
|
339
|
-
if (!isNull) {
|
|
340
|
-
if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
|
|
341
|
-
let blobPrefixLength = BlobType.blobPrefixLength(newValue);
|
|
342
|
-
curr.blobFieldPrefix = newValue.substr(0, blobPrefixLength - 1);
|
|
343
|
-
if (newValue.length > blobPrefixLength)
|
|
344
|
-
curr.data = newValue.substr(blobPrefixLength);
|
|
345
|
-
else
|
|
346
|
-
curr.data = "";
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
if (StorageAttributeCheck.isTypeLogical(this._cellsAttr)) {
|
|
350
|
-
curr.data = (DisplayConvertor.toBoolean(newValue) ? new StringBuilder().Append(1).ToString() : new StringBuilder().Append('\0').ToString());
|
|
351
|
-
newValue = curr.data;
|
|
352
|
-
}
|
|
353
|
-
else
|
|
354
|
-
curr.data = newValue;
|
|
355
|
-
let dataBufVal = newValue;
|
|
356
|
-
if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
|
|
357
|
-
dataBufVal = RecordUtils.byteStreamToString(dataBufVal);
|
|
358
|
-
if (UtilStrByteMode.isLocaleDefLangDBCS() && (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO)) {
|
|
359
|
-
let baDataBuf = this._encoding.GetBytes(this._dataBuf.ToString());
|
|
360
|
-
let baDataBufVal = this._encoding.GetBytes(dataBufVal);
|
|
361
|
-
for (let i = 0; i < baDataBufVal.length && i < localCellSize; i++)
|
|
362
|
-
baDataBuf[((idx - 1) * localCellSize) + i] = baDataBufVal[i];
|
|
363
|
-
for (let i = baDataBufVal.length; i < localCellSize; i++)
|
|
364
|
-
baDataBuf[((idx - 1) * localCellSize) + i] = ((this._cellsAttr === StorageAttribute.ALPHA) ? 32 : 0);
|
|
365
|
-
this._dataBuf = new StringBuilder(this._encoding.GetString(baDataBuf, 0, baDataBuf.length));
|
|
366
|
-
curr.data = this._encoding.GetString(baDataBuf, ((idx - 1) * localCellSize), localCellSize);
|
|
367
|
-
}
|
|
368
|
-
else {
|
|
369
|
-
for (let i = 0; i < dataBufVal.length && i < localCellSize; i++)
|
|
370
|
-
this._dataBuf.set_Item(((idx - 1) * localCellSize) + i, dataBufVal.charAt(i));
|
|
371
|
-
for (let i = dataBufVal.length; i < localCellSize; i++)
|
|
372
|
-
this._dataBuf.set_Item(((idx - 1) * localCellSize) + i, (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.UNICODE) ? ' ' : '\0');
|
|
373
|
-
if (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.UNICODE || this._cellsAttr === StorageAttribute.MEMO)
|
|
374
|
-
curr.data = this._dataBuf.ToString().substr(((idx - 1) * localCellSize), localCellSize);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
this._nullBuf.set_Item(idx - 1, '\0');
|
|
378
|
-
curr.isNull = false;
|
|
379
|
-
}
|
|
380
|
-
else {
|
|
381
|
-
curr.data = null;
|
|
382
|
-
if (this._cellsAttr === StorageAttribute.BLOB_VECTOR)
|
|
383
|
-
curr.blobFieldPrefix = BlobType.getEmptyBlobPrefix('\u0001');
|
|
384
|
-
else
|
|
385
|
-
curr.blobFieldPrefix = BlobType.getEmptyBlobPrefix('\0');
|
|
386
|
-
curr.isNull = true;
|
|
387
|
-
this._nullBuf.set_Item(idx - 1, '\u0001');
|
|
388
|
-
for (let i = 0; i < localCellSize; i++)
|
|
389
|
-
this._dataBuf.set_Item(((idx - 1) * localCellSize) + i, '\0');
|
|
390
|
-
this._nullBuf.set_Item(idx - 1, '\u0001');
|
|
391
|
-
}
|
|
392
|
-
res = true;
|
|
393
|
-
}
|
|
394
|
-
else {
|
|
395
|
-
let insertVal;
|
|
396
|
-
if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
|
|
397
|
-
if (this._cellsAttr === StorageAttribute.BLOB_VECTOR)
|
|
398
|
-
insertVal = BlobType.getEmptyBlobPrefix('\u0001');
|
|
399
|
-
else
|
|
400
|
-
insertVal = BlobType.getEmptyBlobPrefix('\0');
|
|
401
|
-
if (!this._cellsIsNullDefault)
|
|
402
|
-
insertVal = insertVal + this._cellsDefaultVal;
|
|
403
|
-
}
|
|
404
|
-
else if (this._cellsIsNullDefault)
|
|
405
|
-
insertVal = null;
|
|
406
|
-
else
|
|
407
|
-
insertVal = this._cellsDefaultVal;
|
|
408
|
-
if (insertVal !== null && StorageAttributeCheck.isTypeLogical(this._cellsAttr))
|
|
409
|
-
insertVal = (DisplayConvertor.toBoolean(insertVal) ? new StringBuilder().Append('\u0001').ToString() : new StringBuilder().Append('\0').ToString());
|
|
410
|
-
let dataBufVal = insertVal;
|
|
411
|
-
while (this._cells.length < idx) {
|
|
412
|
-
if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) {
|
|
413
|
-
this._cells.push(new CellElement(insertVal.substr(VectorType.EMPTY_BLOB_PREFIX_LEN), this._cellsIsNullDefault, insertVal.substr(0, VectorType.EMPTY_BLOB_PREFIX_LEN)));
|
|
414
|
-
this._dataBuf.Append(this.getNullString(VectorType.BLOB_TYPE_STRUCT_SIZE));
|
|
415
|
-
}
|
|
416
|
-
else {
|
|
417
|
-
this._cells.push(new CellElement(insertVal, this._cellsIsNullDefault));
|
|
418
|
-
if (insertVal !== null) {
|
|
419
|
-
if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME) {
|
|
420
|
-
if (createBufferValForNumType) {
|
|
421
|
-
createBufferValForNumType = false;
|
|
422
|
-
dataBufVal = RecordUtils.byteStreamToString(insertVal);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
this._dataBuf.Append(dataBufVal);
|
|
426
|
-
let valLen;
|
|
427
|
-
if (UtilStrByteMode.isLocaleDefLangDBCS() && (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO))
|
|
428
|
-
valLen = UtilStrByteMode.lenB(dataBufVal);
|
|
429
|
-
else
|
|
430
|
-
valLen = dataBufVal.length;
|
|
431
|
-
for (let i = valLen; i < localCellSize; i++)
|
|
432
|
-
this._dataBuf.Append((this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.UNICODE) ? ' ' : '\0');
|
|
433
|
-
}
|
|
434
|
-
else
|
|
435
|
-
this._dataBuf.Append(this.getNullString(localCellSize));
|
|
436
|
-
}
|
|
437
|
-
this._nullBuf.Insert(this._cells.length - 1, this._cellsIsNullDefault ? '\u0001' : '\0');
|
|
438
|
-
}
|
|
439
|
-
res = this.setVecCell(idx, newValue, isNull);
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
catch (ApplicationException) {
|
|
444
|
-
res = false;
|
|
445
|
-
}
|
|
446
|
-
return res;
|
|
447
|
-
}
|
|
448
|
-
adjustToFit(field) {
|
|
449
|
-
if (field.getType() === StorageAttribute.BLOB_VECTOR) {
|
|
450
|
-
let srcAttr = this.getCellsAttr();
|
|
451
|
-
let dstAttr = field.getCellsType();
|
|
452
|
-
if (StorageAttributeCheck.isTheSameType(srcAttr, dstAttr)) {
|
|
453
|
-
this.init();
|
|
454
|
-
if (StorageAttributeCheck.IsTypeAlphaOrUnicode(srcAttr) && StorageAttributeCheck.IsTypeAlphaOrUnicode(dstAttr)) {
|
|
455
|
-
let dstSizeInChars = field.getVecCellsSize();
|
|
456
|
-
let srcSizeInChars = ((this._cellsAttr === StorageAttribute.UNICODE) ? Math.floor(this._cellSize / 2) : this._cellSize);
|
|
457
|
-
let isByteMode = UtilStrByteMode.isLocaleDefLangDBCS() && StorageAttributeCheck.isTypeAlpha(dstAttr);
|
|
458
|
-
if (srcSizeInChars !== dstSizeInChars) {
|
|
459
|
-
let adjData = new StringBuilder();
|
|
460
|
-
for (let i = 0; i < dstSizeInChars; i = i + 1) {
|
|
461
|
-
let curr = this._cells.get_Item(i);
|
|
462
|
-
if (!curr.isNull) {
|
|
463
|
-
if (srcSizeInChars > dstSizeInChars) {
|
|
464
|
-
if (isByteMode)
|
|
465
|
-
curr.data = UtilStrByteMode.leftB(curr.data, dstSizeInChars);
|
|
466
|
-
else
|
|
467
|
-
curr.data = curr.data.substr(0, dstSizeInChars);
|
|
468
|
-
adjData.Append(curr.data);
|
|
469
|
-
}
|
|
470
|
-
else {
|
|
471
|
-
let tmpData = new StringBuilder();
|
|
472
|
-
tmpData.Append(curr.data);
|
|
473
|
-
let dataLen = isByteMode ? UtilStrByteMode.lenB(curr.data) : curr.data.length;
|
|
474
|
-
for (let j = dataLen; j < dstSizeInChars; j = j + 1)
|
|
475
|
-
tmpData.Append(' ');
|
|
476
|
-
adjData.Append(tmpData.ToString());
|
|
477
|
-
curr.data = tmpData.ToString();
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
else {
|
|
481
|
-
let tmpData = new StringBuilder();
|
|
482
|
-
for (let j = 0; j < dstSizeInChars; j = j + 1)
|
|
483
|
-
tmpData.Append('\0');
|
|
484
|
-
adjData.Append(tmpData.ToString());
|
|
485
|
-
curr.data = tmpData.ToString();
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
this._dataBuf = adjData;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
let newSize = field.getVecCellsSize();
|
|
492
|
-
this._cellsAttr = field.getCellsType();
|
|
493
|
-
this._cellSize = ((this._cellsAttr === StorageAttribute.UNICODE) ? (newSize * 2) : newSize);
|
|
494
|
-
this._cellsDefaultVal = field.getCellDefualtValue();
|
|
495
|
-
this._cellsIsNullDefault = field.isNullDefault();
|
|
496
|
-
this._allowNull = field.NullAllowed;
|
|
497
|
-
this._originalflatData = this.toString();
|
|
498
|
-
return;
|
|
499
|
-
}
|
|
500
|
-
else
|
|
501
|
-
throw new ApplicationException("in VectorType.adjustToFit vector basic types does not agree");
|
|
502
|
-
}
|
|
503
|
-
else
|
|
504
|
-
throw new ApplicationException("in VectorType.adjustToFit " + field.getName() + " is not of type vector");
|
|
505
|
-
}
|
|
506
|
-
buildHeadersString() {
|
|
507
|
-
let res = VectorType.BLOB_TABLE_STR + VectorType.VECTOR_STR + "," + VectorType.VERSION + "," + 1 + "," + this._cellsAttr + ",";
|
|
508
|
-
res = res + this._cellSize + ",";
|
|
509
|
-
let def = "";
|
|
510
|
-
if (this._cellsDefaultVal !== null)
|
|
511
|
-
if (this._cellsAttr === StorageAttribute.NUMERIC || this._cellsAttr === StorageAttribute.DATE || this._cellsAttr === StorageAttribute.TIME)
|
|
512
|
-
def = RecordUtils.byteStreamToString(this._cellsDefaultVal);
|
|
513
|
-
else
|
|
514
|
-
def = this._cellsDefaultVal;
|
|
515
|
-
if (UtilStrByteMode.isLocaleDefLangDBCS() && (this._cellsAttr === StorageAttribute.ALPHA || this._cellsAttr === StorageAttribute.MEMO))
|
|
516
|
-
def = def + this.getEmptyString(this._cellSize - UtilStrByteMode.lenB(def));
|
|
517
|
-
else
|
|
518
|
-
def = def + this.getEmptyString(this._cellSize - def.length);
|
|
519
|
-
res = res + def + "," + (this._cellsIsNullDefault ? "1" : "0") + ",";
|
|
520
|
-
res = res + (this._allowNull ? "1" : "0") + "," + this._cellSize + "," + this._cells.length + ",";
|
|
521
|
-
res = res + ((this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR) ? "1" : "0") + ",";
|
|
522
|
-
if (this._cellsAttr === StorageAttribute.BLOB || this._cellsAttr === StorageAttribute.BLOB_VECTOR)
|
|
523
|
-
res = res + "0,";
|
|
524
|
-
return res;
|
|
525
|
-
}
|
|
526
|
-
getNullString(size) {
|
|
527
|
-
let res = new StringBuilder();
|
|
528
|
-
for (let i = 0; i < size; i = i + 1)
|
|
529
|
-
res.Append('\0');
|
|
530
|
-
return res.ToString();
|
|
531
|
-
}
|
|
532
|
-
getEmptyString(size) {
|
|
533
|
-
let res = new StringBuilder();
|
|
534
|
-
for (let i = 0; i < size; i = i + 1)
|
|
535
|
-
res.Append(' ');
|
|
536
|
-
return res.ToString();
|
|
537
|
-
}
|
|
538
|
-
getBlobsBuf() {
|
|
539
|
-
let res = new StringBuilder();
|
|
540
|
-
for (let i = 0; i < this._cells.length; i = i + 1) {
|
|
541
|
-
let data = "";
|
|
542
|
-
let blobSize = 0;
|
|
543
|
-
let curr = this._cells.get_Item(i);
|
|
544
|
-
if (curr.data !== null) {
|
|
545
|
-
data = curr.data;
|
|
546
|
-
blobSize = data.length;
|
|
547
|
-
}
|
|
548
|
-
res.Append(blobSize);
|
|
549
|
-
res.Append("," + curr.blobFieldPrefix + "," + data + ";");
|
|
550
|
-
}
|
|
551
|
-
return (res + ",");
|
|
552
|
-
}
|
|
553
|
-
static getCellsAttr(blob) {
|
|
554
|
-
if (VectorType.validateBlobContents(blob)) {
|
|
555
|
-
let tokens = StrUtil.tokenize(blob.substr(BlobType.blobPrefixLength(blob)), ",");
|
|
556
|
-
return tokens[3].charAt(0);
|
|
557
|
-
}
|
|
558
|
-
else
|
|
559
|
-
throw new ApplicationException("in static getCellsAttr the blob is in the wrong format");
|
|
560
|
-
}
|
|
561
|
-
static getCellSize(blob) {
|
|
562
|
-
let cellsType = VectorType.getCellsAttr(blob);
|
|
563
|
-
if (cellsType !== StorageAttribute.BLOB && cellsType !== StorageAttribute.BLOB_VECTOR) {
|
|
564
|
-
let tokens = StrUtil.tokenize(blob.substr(BlobType.blobPrefixLength(blob)), ",");
|
|
565
|
-
return NNumber.Parse(tokens[4]);
|
|
566
|
-
}
|
|
567
|
-
else {
|
|
568
|
-
return 2147483647;
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
static getVecSize(blob) {
|
|
572
|
-
if (VectorType.validateBlobContents(blob)) {
|
|
573
|
-
let pos = BlobType.blobPrefixLength(blob);
|
|
574
|
-
let tokens = StrUtil.tokenize(blob.substr(pos), ",");
|
|
575
|
-
pos = pos + (tokens[0].length + 1);
|
|
576
|
-
pos = pos + (tokens[1].length + 1);
|
|
577
|
-
pos = pos + (tokens[2].length + 1);
|
|
578
|
-
pos = pos + (tokens[3].length + 1);
|
|
579
|
-
let cellsSize = tokens[4];
|
|
580
|
-
pos = pos + (cellsSize.length + 1);
|
|
581
|
-
pos = pos + (NNumber.Parse(cellsSize) + 1);
|
|
582
|
-
tokens = StrUtil.tokenize(blob.substr(pos), ",");
|
|
583
|
-
return NNumber.Parse(tokens[3]);
|
|
584
|
-
}
|
|
585
|
-
throw new ApplicationException("in static getVecSize the blob is in the wrong format");
|
|
586
|
-
}
|
|
587
|
-
isUnicode(flatData) {
|
|
588
|
-
let start = BlobType.blobPrefixLength(flatData);
|
|
589
|
-
let catcher = flatData.substr(start, VectorType.BLOB_TABLE_STR_LEN);
|
|
590
|
-
return (catcher === VectorType.BLOB_TABLE_STR);
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
export class CellElement {
|
|
594
|
-
blobFieldPrefix = null;
|
|
595
|
-
data = null;
|
|
596
|
-
isNull = false;
|
|
597
|
-
constructor(val, is_null, ctrlData) {
|
|
598
|
-
if (arguments.length === 2)
|
|
599
|
-
this.constructor_0(val, is_null);
|
|
600
|
-
this.constructor_1(val, is_null, ctrlData);
|
|
601
|
-
}
|
|
602
|
-
constructor_0(val, is_null) {
|
|
603
|
-
this.data = val;
|
|
604
|
-
this.isNull = is_null;
|
|
605
|
-
}
|
|
606
|
-
constructor_1(val, is_null, ctrlData) {
|
|
607
|
-
this.data = val;
|
|
608
|
-
this.isNull = is_null;
|
|
609
|
-
this.blobFieldPrefix = ctrlData;
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVjdG9yVHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9kYXRhL1ZlY3RvclR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixRQUFRLEVBQ1IsbUJBQW1CLEVBQ25CLElBQUksRUFDSixPQUFPLEVBQ1AsT0FBTyxFQUNQLGFBQWEsRUFDZCxNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBTWxELE1BQU0sT0FBTyxVQUFXLFNBQVEsY0FBYztJQUU1QyxNQUFNLENBQUMsT0FBTyxHQUFXLENBQUMsQ0FBQztJQUMzQixNQUFNLENBQUMscUJBQXFCLEdBQVcsQ0FBQyxDQUFDO0lBR3pDLE1BQU0sQ0FBQyxxQkFBcUIsR0FBVyxFQUFFLENBQUM7SUFFbEMsTUFBTSxHQUFzQixJQUFJLENBQUM7SUFDakMsU0FBUyxHQUFhLElBQUksQ0FBQztJQUMzQixVQUFVLEdBQVksS0FBSyxDQUFDO0lBQzVCLGdCQUFnQixHQUFXLElBQUksQ0FBQztJQUNoQyxTQUFTLEdBQVcsQ0FBQyxDQUFDO0lBQ3RCLFVBQVUsR0FBcUIsSUFBSSxDQUFD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T0FBTyxHQUFXLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7O0FBT0gsTUFBTSxPQUFPLFdBQVc7SUFDdEIsZUFBZSxHQUFXLElBQUksQ0FBQztJQUMvQixJQUFJLEdBQVcsSUFBSSxDQUFDO0lBQ3BCLE1BQU0sR0FBWSxLQUFLLENBQUM7SUFNeEIsWUFBWSxHQUFXLEVBQUUsT0FBZ0IsRUFBRSxRQUFpQjtRQUMxRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUdPLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBZ0I7UUFDakQsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUdPLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBZ0IsRUFBRSxRQUFnQjtRQUNuRSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIEVuY29kaW5nLFxyXG4gIElTT184ODU5XzFfRW5jb2RpbmcsXHJcbiAgTGlzdCxcclxuICBOTnVtYmVyLFxyXG4gIE5TdHJpbmcsXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHsgRmllbGREZWYgfSBmcm9tICcuL0ZpZWxkRGVmJztcclxuaW1wb3J0IHsgQmxvYlR5cGUgfSBmcm9tICcuL0Jsb2JUeXBlJztcclxuaW1wb3J0IHsgU3RvcmFnZUF0dHJpYnV0ZSwgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLCBTdHJVdGlsLCBVdGlsU3RyQnl0ZU1vZGUgfSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHsgRGlzcGxheUNvbnZlcnRvciB9IGZyb20gJy4uL2d1aS9EaXNwbGF5Q29udmVydG9yJztcclxuaW1wb3J0IHsgUmVjb3JkVXRpbHMgfSBmcm9tICcuL1JlY29yZFV0aWxzJztcclxuaW1wb3J0IHsgR3VpQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHsgR3VpRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9HdWlFbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IFZlY3RvclR5cGVCYXNlIH0gZnJvbSAnLi9WZWN0b3JUeXBlQmFzZSc7XHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICByZXByZXNlbnRzIHRoZSBtYWdpYyB2ZWN0b3IgdHlwZVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgVmVjdG9yVHlwZSBleHRlbmRzIFZlY3RvclR5cGVCYXNlIHtcclxuXHJcbiAgc3RhdGljIFZFUlNJT046IG51bWJlciA9IDU7IC8vIHZlcnNpb24gbm8gNSBpbmNsdWRlcyB0aGUgY29udGVudCBmaWVsZFxyXG4gIHN0YXRpYyBFTVBUWV9CTE9CX1BSRUZJWF9MRU46IG51bWJlciA9IDc7XHJcblxyXG4gIC8vIEZPUiBFWFBMQU5BVElPTlMgUkVHQVJESU5HIFRISVMgTlVNQkVSIFBMRUFTIFNFRSBET0NVTUVOVEFUSU9OIElOU0lERSBpbml0IE1FVEhPRFxyXG4gIHN0YXRpYyBCTE9CX1RZUEVfU1RSVUNUX1NJWkU6IG51bWJlciA9IDI4O1xyXG5cclxuICBwcml2YXRlIF9jZWxsczogTGlzdDxDZWxsRWxlbWVudD4gPSBudWxsOyAvLyBhIHZlY3RvciBjb250YWluaW5nIENlbGxFbGVtZW50c1xyXG4gIHByaXZhdGUgX2VuY29kaW5nOiBFbmNvZGluZyA9IG51bGw7IC8vIHRvIGJlIHVzZWQgb25seSB3aXRoIGFscGhhIG9yIG1lbW9cclxuICBwcml2YXRlIF9hbGxvd051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9jZWxsQ29udGVudFR5cGU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY2VsbFNpemU6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfY2VsbHNBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gbnVsbDsgLy8gYWxsIGNlbGxzIGluIHRoZSB2ZWN0b3IgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlXHJcbiAgcHJpdmF0ZSBfY2VsbHNEZWZhdWx0VmFsOiBzdHJpbmcgPSBudWxsOyAvLyBhbGwgY2VsbHMgaW4gdGhlIG1hZ2ljIHZlY3RvciBoYXMgdGhlIHNhbWUgZGVmYXVsdCB2YWx1ZVxyXG4gIHByaXZhdGUgX2NlbGxzSXNOdWxsRGVmYXVsdDogYm9vbGVhbiA9IGZhbHNlOyAvLyBudWxsIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgYWxsIGNlbGxzIGluIHRoZSBtYWdpYyB2ZWN0b3JcclxuXHJcbiAgLy8gZGF0YSBidWZmZXJzIHRoYXQgd2UgY2hhbmdlIER5bmFtaWNhbGx5IHRvIGZhY2lsaXRhdGVcclxuICAvLyB0aGUgY3JlYXRpb24gb2YgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gIHByaXZhdGUgX2RhdGFCdWY6IFN0cmluZ0J1aWxkZXIgPSBudWxsO1xyXG4gIHByaXZhdGUgX2luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7IC8vIG1hcmtzIHdoZXRoZXIgdGhlIHZlY3RvciB3YXMgaW5pdGlhbGl6ZWQgaWYgaXQgd2FzIG5vdCB0aGF0IGl0IGlzIGFuIGludmFsaWQgdmVjdG9yXHJcbiAgcHJpdmF0ZSBfbnVsbEJ1ZjogU3RyaW5nQnVpbGRlciA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfb3JpZ2luYWxmbGF0RGF0YTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoY2VsbHNUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBjb250ZW50VHlwZTogc3RyaW5nLCBkZWZ1YWx0OiBzdHJpbmcsIGlzRGVmTnVsbDogYm9vbGVhbiwgbnVsbEFsb3dlZDogYm9vbGVhbiwgbGVuZ3RoOiBudW1iZXIpO1xyXG4gIGNvbnN0cnVjdG9yKGJsb2JTdHJpbmc6IHN0cmluZyk7XHJcbiAgY29uc3RydWN0b3IoZmxkOiBGaWVsZERlZik7XHJcbiAgY29uc3RydWN0b3IoY2VsbHNUeXBlT3JCbG9iU3RyaW5nT3JGbGQ6IGFueSwgY29udGVudFR5cGU/OiBzdHJpbmcsIGRlZnVhbHQ/OiBzdHJpbmcsIGlzRGVmTnVsbD86IGJvb2xlYW4sIG51bGxBbG93ZWQ/OiBib29sZWFuLCBsZW5ndGg/OiBudW1iZXIpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNilcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkLCBjb250ZW50VHlwZSwgZGVmdWFsdCwgaXNEZWZOdWxsLCBudWxsQWxvd2VkLCBsZW5ndGgpO1xyXG5cclxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgKGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkID09PSBudWxsIHx8IGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpKVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEoY2VsbHNUeXBlT3JCbG9iU3RyaW5nT3JGbGQpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8yKGNlbGxzVHlwZU9yQmxvYlN0cmluZ09yRmxkKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb25zdHJ1Y3QgdGhlIG9iamVjdCBidXQgZG9lcyBub3QgZmlsbCBpdCB3aXRoIGRhdGEgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGUgVmVjdG9yIHdlIG11c3QgaW52b2tlIG9uXHJcbiAgLy8vICAgaXQgdGhlIGl0cyBpbml0IG1ldGhvZCBhIFZlY3RvclR5cGUgd2hpY2ggd2FzIG5vdCBpbml0aWFsaXplZCBpcyBhbiB1bnZhbGlkIHZlY3Rvci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMChjZWxsc1R5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGNvbnRlbnRUeXBlOiBzdHJpbmcsIGRlZnVhbHQ6IHN0cmluZywgaXNEZWZOdWxsOiBib29sZWFuLCBudWxsQWxvd2VkOiBib29sZWFuLCBsZW5ndGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fY2VsbHMgPSBuZXcgTGlzdDxDZWxsRWxlbWVudD4oKTtcclxuICAgIHRoaXMuX2NlbGxzQXR0ciA9IGNlbGxzVHlwZTtcclxuICAgIHRoaXMuX2NlbGxDb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlO1xyXG4gICAgdGhpcy5fY2VsbHNEZWZhdWx0VmFsID0gZGVmdWFsdDtcclxuICAgIHRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdCA9IGlzRGVmTnVsbDtcclxuICAgIHRoaXMuX2NlbGxTaXplID0gKCh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkgPyAobGVuZ3RoICogMikgOiBsZW5ndGgpO1xyXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5fYWxsb3dOdWxsID0gbnVsbEFsb3dlZDtcclxuICAgIHRoaXMuX251bGxCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgdGhpcy5fZGF0YUJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICB0aGlzLl9vcmlnaW5hbGZsYXREYXRhID0gdGhpcy50b1N0cmluZygpO1xyXG4gICAgdGhpcy5fZW5jb2RpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbnN0cnVjdCB0aGUgb2JqZWN0IGJ1dCBkb2VzIG5vdCBmaWxsIGl0IHdpdGggZGF0YSBpbiBvcmRlciB0byBpbml0aWFsaXplIHRoZSBWZWN0b3Igd2UgbXVzdCBpbnZva2Ugb25cclxuICAvLy8gICBpdCB0aGUgaXRzIGluaXQgbWV0aG9kIGEgVmVjdG9yVHlwZSB3aGljaCB3YXMgbm90IGluaXRpYWxpemVkIGlzIGFuIGludmFsaWQgdmVjdG9yLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJibG9iU3RyaW5nXCI+YSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJsb2IncyBkYXRhIGJ5dGVzPC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEoYmxvYlN0cmluZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jZWxscyA9IG5ldyBMaXN0PENlbGxFbGVtZW50PigpO1xyXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuX29yaWdpbmFsZmxhdERhdGEgPSBibG9iU3RyaW5nO1xyXG4gICAgdGhpcy5fZW5jb2RpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbnN0cnVjdCB0aGUgb2JqZWN0IHdpdGggYSBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hhcnNcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMihmbGQ6IEZpZWxkRGVmKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jZWxscyA9IG5ldyBMaXN0PENlbGxFbGVtZW50PigpO1xyXG4gICAgdGhpcy5fY2VsbHNBdHRyID0gZmxkLmdldENlbGxzVHlwZSgpO1xyXG4gICAgdGhpcy5fY2VsbENvbnRlbnRUeXBlID0gZmxkLmdldFZlY0NlbGxzQ29udGVudFR5cGUoKTtcclxuICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IGZsZC5nZXRDZWxsRGVmdWFsdFZhbHVlKCk7XHJcbiAgICB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPSBmbGQuaXNOdWxsRGVmYXVsdCgpO1xyXG4gICAgdGhpcy5fY2VsbFNpemUgPSA8bnVtYmVyPigodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gKGZsZC5nZXRWZWNDZWxsc1NpemUoKSAqIDIpIDogZmxkLmdldFZlY0NlbGxzU2l6ZSgpKTtcclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIHRoaXMuX2FsbG93TnVsbCA9IGZsZC5OdWxsQWxsb3dlZDtcclxuICAgIHRoaXMuX251bGxCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgdGhpcy5fZGF0YUJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICB0aGlzLl9vcmlnaW5hbGZsYXREYXRhID0gdGhpcy50b1N0cmluZygpO1xyXG4gICAgdGhpcy5fZW5jb2RpbmcgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkcyBhIFZlY3RvclR5cGUgZnJvbSBpdHMgZmxhdHRlbmVkIGJsb2IgcmVwcmVzZW50YXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvYlN0cmluZ1wiPmEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBibG9iJ3MgZGF0YSBieXRlczwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBmYWxzZSBpcyB0aGUgZ2l2ZW4gYmxvYiBpcyBub3QgYSB2ZWN0b3IgKHRoZSBmbGF0dGVuIGZvcm1hdCBpcyB3cm9uZyk8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBpbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBudWxsO1xyXG4gICAgbGV0IHRva2VuSWR4OiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGN1cnJlbnRUb2tlbjogc3RyaW5nID0gbnVsbDsgLy8gdGhlIGN1cnJlbnQgdG9rZW4gd2UgYXJlIHBhcmluZ1xyXG4gICAgbGV0IGlzRmxhdERhdGFUcmFuc2xhdGVkOiBib29sZWFuID0gdGhpcy5pc1VuaWNvZGUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YSk7XHJcbiAgICBsZXQgaXNEYmNzQWxwaGE6IGJvb2xlYW4gPSBmYWxzZTsgLy8gSlBOOiBEQkNTIHN1cHBvcnRcclxuXHJcbiAgICAvLyBwb3MgaXMgcG9zaXRpb24gaW4gdGhlIG9yaWdpbmFsZmxhdERhdGEgc3RyaW5nXHJcbiAgICBsZXQgcG9zOiBudW1iZXIgPSBCbG9iVHlwZS5ibG9iUHJlZml4TGVuZ3RoKHRoaXMuX29yaWdpbmFsZmxhdERhdGEpO1xyXG4gICAgLy8gYmxvYlxyXG4gICAgdG9rZW5zID0gU3RyVXRpbC50b2tlbml6ZSh0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MpLCBcIixcIik7XHJcbiAgICBsZXQgdmVjU2l6ZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XHJcbiAgICAgIGlmIChWZWN0b3JUeXBlLnZhbGlkYXRlQmxvYkNvbnRlbnRzKHRoaXMuX29yaWdpbmFsZmxhdERhdGEpKSB7XHJcbiAgICAgICAgbGV0IGJsb2JQcmVmaXg6IHN0cmluZyA9IEJsb2JUeXBlLmdldFByZWZpeCh0aGlzLl9vcmlnaW5hbGZsYXREYXRhKTtcclxuICAgICAgICB0aGlzLl9jZWxsQ29udGVudFR5cGUgPSBCbG9iVHlwZS5nZXRDb250ZW50VHlwZShibG9iUHJlZml4KTtcclxuXHJcbiAgICAgICAgLy8gc2tpcCB0aGUgdGhlIGhlYWRlcnMgb2YgdGhlIHRhYmxlIGFuZCB0aGUgdmVjdG9yIGFuZCB0aGUgZmlyc3QgJywnO1xyXG4gICAgICAgIHBvcyA9IDxudW1iZXI+KDxudW1iZXI+cG9zICsgNCArIDUgKyAxKTtcclxuXHJcbiAgICAgICAgLy8gc2tpcCB0aGUgdmVyc2lvblxyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAvLyBza2lwIHRoZSBDb2x1bW5zQ291bnRfIGluIHZlY3RvcnMgYWx3YXlzIGNvbnRhaW4gdmFsdWUgb2YgMVxyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgY2VsbCBhdHRyaWJ1dGUgaW4gdmVjdG9yIHRoZXJlIGlzIG9ubHkgb25lIGF0dHJpYnV0ZSBmbyB0aGUgZW50aXJlIHZlY3RvclxyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICB0aGlzLl9jZWxsc0F0dHIgPSA8U3RvcmFnZUF0dHJpYnV0ZT5jdXJyZW50VG9rZW4uY2hhckF0KDApO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIDI7XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBDb2x1bW5zTGVuXyB0aGF0IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgY2VsbHMgaW4gdGhlIHZlY3RvclxyXG4gICAgICAgIC8vIHNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIGNvbHVtbiB3ZSBpbmNyZWFzZSBwb3MgYnkgY3VycmVudFRva2VuLmxlbmd0aCgpXHJcbiAgICAgICAgLy8gdGhpcyBudW1iZXIgaXMgc2FtZSBhcyB0aGUgQ29sdW1uc1RvdGFsTGVuXyBmb3IgdmVjdG9yc1xyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICB0aGlzLl9jZWxsU2l6ZSA9IDxudW1iZXI+Tk51bWJlci5QYXJzZShjdXJyZW50VG9rZW4pO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBjZWxsIGRlZmF1bHQgdmFsdWUgaXMgaXQgaXMgbnVtZXJpYyBpdCBpcyBzZW50IGFzIE5VTV9UWVBFXHJcbiAgICAgICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgbWF5IGNvbnRhaW4gYXMgdmFsdWUgY2hhcmN0ZXJzIGFzIHRoZSBkZWxpbWV0ZXJcclxuICAgICAgICAvLyB3ZSBjYW4gbm90IHVzZSB0aGUgU3RyaW5nVG9rZW5pemVyLlxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSlcclxuICAgICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IFN0clV0aWwuc3RyaW5nVG9IZXhhRHVtcCh0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MsIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpLCAyKTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8pIHtcclxuICAgICAgICAgIC8vIFFDUiA0Mjk0NDUgc2luY2UgdGhlIHZlY3RvciBpcyBlbmNvZGVkIHRvIGJhc2U2NC9oZXggd2hlbiBpdCBpcyByZWNpdmVkIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICAgICAgLy8gd2UgbXVzdCB1c2UgdGhlIGNvcnJlY3QgY2hhci1zZXQgd2hlbiByZWNpdmluZyB2ZWN0b3Igb2YgYWxwaGEgb3IgbWVtbyBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgIC8vIGluIHZlY3RvcnMgd2UgbXVzdCBjb25jaWRlciB0aGUgY2hhciBzZXQgc2luY2Ugd2hlbiB3ZSBnb3QgaXQgZnJvbSB0aGUgc2VydmVyIGl0IHdhcyBlbmNvZGVkXHJcbiAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSkge1xyXG4gICAgICAgICAgICBpc0RiY3NBbHBoYSA9IHRydWU7XHJcbiAgICAgICAgICAgIGlzRmxhdERhdGFUcmFuc2xhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fY2VsbHNEZWZhdWx0VmFsID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHRoaXMuX29yaWdpbmFsZmxhdERhdGEuc3Vic3RyKHBvcyksIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSB0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MsIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2VuY29kaW5nICE9PSBudWxsICYmICFpc0ZsYXREYXRhVHJhbnNsYXRlZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGxldCBiYTogVWludDhBcnJheSA9IElTT184ODU5XzFfRW5jb2RpbmcuSVNPXzg4NTlfMS5HZXRCeXRlcyh0aGlzLl9jZWxsc0RlZmF1bHRWYWwpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IHRoaXMuX2VuY29kaW5nLkdldFN0cmluZyhiYSwgMCwgYmEubGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpIHtcclxuICAgICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IHRoaXMuX29yaWdpbmFsZmxhdERhdGEuc3Vic3RyKHBvcywgPG51bWJlcj50aGlzLl9jZWxsU2l6ZSk7XHJcblxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGJhOiBVaW50OEFycmF5ID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xLkdldEJ5dGVzKHRoaXMuX2NlbGxzRGVmYXVsdFZhbCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IEVuY29kaW5nLlVuaWNvZGUuR2V0U3RyaW5nKGJhLCAwLCBiYS5sZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWwgPSB0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MsIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG4gICAgICAgIGlmIChpc0RiY3NBbHBoYSlcclxuICAgICAgICAgIHBvcyA9IHBvcyArIHRoaXMuX2NlbGxzRGVmYXVsdFZhbC5sZW5ndGggKyAxO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHBvcyA9IDxudW1iZXI+KDxudW1iZXI+cG9zICsgdGhpcy5fY2VsbFNpemUgKyAxKTsgLy8gc2lrcCB0aGUgZW5kaW5nICcsJ1xyXG5cclxuICAgICAgICAvLyBpbnJvcmRlciB0byBjb250aW51ZSB1c2luZyB0aGUgdG9rZW5pemVyIGZvciB0aGUgcmVzdCBvZiB0aGUgaGVhZGVycyBwYXJzaW5nXHJcbiAgICAgICAgLy8gcmVpbml0IGl0XHJcbiAgICAgICAgdG9rZW5zID0gU3RyVXRpbC50b2tlbml6ZSh0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MpLCBcIixcIik7XHJcbiAgICAgICAgdG9rZW5JZHggPSAwO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgY2VsbHMgbnVsbCBkZWZhdWx0IGZsYWdcclxuICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgIHRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdCA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKGN1cnJlbnRUb2tlbik7XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGNlbGxzIG51bGwgYWxsb3dlZCBmbGFnXHJcbiAgICAgICAgdG9rZW5JZHgrKztcclxuICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgIHRoaXMuX2FsbG93TnVsbCA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKGN1cnJlbnRUb2tlbik7XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gc2tpcCB0aGUgcGFyc2luZyBvZiBDb2x1bW5zVG90YWxMZW5fXHJcbiAgICAgICAgdG9rZW5JZHgrKztcclxuICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3IgKCBSZWNvcmRzQ291bnRfKVxyXG4gICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICB2ZWNTaXplID0gPG51bWJlcj5OTnVtYmVyLlBhcnNlKGN1cnJlbnRUb2tlbik7XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gdGhlIGJsb2JzXyB3aWxsIGFsd2F5cyBjb250YWluIHZhbHVlIG9mIDEgc2luZSB3ZSBoYXZlIGluIHZlY3RvcnMgb25seSBvbmUgY29sbW5cclxuICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgcG9zID0gcG9zICsgKGN1cnJlbnRUb2tlbi5sZW5ndGggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gYmxvYnMgb2Zmc2V0IHRhYmxlIGluIHRoZSB2ZWN0b3IgY2FzZSB3aWxsIGFsd2F5IGNvbnRhaW4gb25seSBvbmUgdmFsdWUgZXF1YWxzIHRvIDBcclxuICAgICAgICAvLyBzaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSBjb2xtcyBpbiB0aGUgdmVjdG9yXHJcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgdG9rZW5JZHgrKztcclxuICAgICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2Vuc1t0b2tlbklkeF07XHJcbiAgICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGRhdGEgYXJyYXlcclxuICAgICAgICBsZXQgZGF0YTogc3RyaW5nO1xyXG4gICAgICAgIGlmIChpc0RiY3NBbHBoYSkge1xyXG4gICAgICAgICAgZGF0YSA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0Qih0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MpLCA8bnVtYmVyPih2ZWNTaXplICogdGhpcy5fY2VsbFNpemUpKTtcclxuICAgICAgICAgIHBvcyA9IHBvcyArIGRhdGEubGVuZ3RoICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBkYXRhID0gdGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zLCA8bnVtYmVyPih2ZWNTaXplICogdGhpcy5fY2VsbFNpemUpKTtcclxuICAgICAgICAgIHBvcyA9IDxudW1iZXI+KDxudW1iZXI+cG9zICsgdmVjU2l6ZSAqIHRoaXMuX2NlbGxTaXplICsgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhbGxvY2F0ZSB0aGUgZGF0YUJ1ZlxyXG4gICAgICAgIHRoaXMuX2RhdGFCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcihkYXRhLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgJiYgdGhpcy5fY2VsbHNBdHRyICE9PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8gJiYgdGhpcy5fY2VsbHNBdHRyICE9PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpXHJcbiAgICAgICAgICB0aGlzLl9kYXRhQnVmLkFwcGVuZChkYXRhKTtcclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIG51bGwgYnVmXHJcbiAgICAgICAgbGV0IG51bGxCdWY6IHN0cmluZyA9IHRoaXMuX29yaWdpbmFsZmxhdERhdGEuc3Vic3RyKHBvcywgPG51bWJlcj52ZWNTaXplKTtcclxuICAgICAgICBwb3MgPSA8bnVtYmVyPig8bnVtYmVyPnBvcyArIHZlY1NpemUgKyAxKTtcclxuXHJcbiAgICAgICAgLy8gc2F2ZSB0aGUgbnVsbEJ1ZlxyXG4gICAgICAgIHRoaXMuX251bGxCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcihudWxsQnVmKTtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgdGhlIHR5cGUgb2YgdGhlIGNlbGxzXHJcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CICYmIHRoaXMuX2NlbGxzQXR0ciAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHZlY1NpemU7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaXNOdWxsOiBib29sZWFuID0gbnVsbEJ1Zi5jaGFyQXQoaSkgPiAnXFwwJztcclxuICAgICAgICAgICAgLy8gbnVtZXJpYyB0eXBlIGFyZSBzZW50IGFzIE5VTV9UWVBFIHNvIHdlIHRyYW5zbGF0ZSB0aGVtIHRvIGhleFxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpXHJcbiAgICAgICAgICAgICAgdGhpcy5fY2VsbHMucHVzaChuZXcgQ2VsbEVsZW1lbnQoU3RyVXRpbC5zdHJpbmdUb0hleGFEdW1wKGRhdGEuc3Vic3RyKDxudW1iZXI+KDxudW1iZXI+aSAqIHRoaXMuX2NlbGxTaXplKSwgPG51bWJlcj50aGlzLl9jZWxsU2l6ZSksIDIpLCBpc051bGwpKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PKSB7XHJcbiAgICAgICAgICAgICAgLy8gUUNSIDQyOTQ0NSBzaW5jZSB0aGUgdmVjdG9yIGlzIGVuY29kZWQgdG8gYmFzZTY0L2hleCB3aGVuIGl0IGlzIHJlY2l2ZWQgZnJvbSB0aGVcclxuICAgICAgICAgICAgICAvLyBzZXJ2ZXIgd2UgbXVzdCB1c2UgdGhlIGNvcnJlY3QgY2hhci1zZXQgd2hlbiByZWNpdmluZyB2ZWN0b3Igb2YgYWxwaGEgb3IgbWVtbyBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgICAgICBsZXQgY2VsbERhdGE6IHN0cmluZztcclxuICAgICAgICAgICAgICBpZiAoaXNEYmNzQWxwaGEpXHJcbiAgICAgICAgICAgICAgICBjZWxsRGF0YSA9IFV0aWxTdHJCeXRlTW9kZS5taWRCKGRhdGEsIDxudW1iZXI+KDxudW1iZXI+aSAqIHRoaXMuX2NlbGxTaXplKSwgPG51bWJlcj50aGlzLl9jZWxsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgY2VsbERhdGEgPSBkYXRhLnN1YnN0cig8bnVtYmVyPig8bnVtYmVyPmkgKiB0aGlzLl9jZWxsU2l6ZSksIDxudW1iZXI+dGhpcy5fY2VsbFNpemUpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAodGhpcy5fZW5jb2RpbmcgIT09IG51bGwgJiYgIWlzRmxhdERhdGFUcmFuc2xhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgYmE6IFVpbnQ4QXJyYXkgPSBJU09fODg1OV8xX0VuY29kaW5nLklTT184ODU5XzEuR2V0Qnl0ZXMoY2VsbERhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBjZWxsRGF0YSA9IHRoaXMuX2VuY29kaW5nLkdldFN0cmluZyhiYSwgMCwgYmEubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChTeXN0ZW1FeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQoY2VsbERhdGEpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGNlbGxEYXRhLCBpc051bGwpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkge1xyXG4gICAgICAgICAgICAgIGxldCBjZWxsRGF0YTogc3RyaW5nID0gZGF0YS5zdWJzdHIoPG51bWJlcj4oPG51bWJlcj5pICogdGhpcy5fY2VsbFNpemUpLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKTtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGJhOiBVaW50OEFycmF5ID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xLkdldEJ5dGVzKGNlbGxEYXRhKTtcclxuICAgICAgICAgICAgICAgIGNlbGxEYXRhID0gRW5jb2RpbmcuVW5pY29kZS5HZXRTdHJpbmcoYmEsIDAsIGJhLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNhdGNoIChTeXN0ZW1FeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQoY2VsbERhdGEpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGNlbGxEYXRhLCBpc051bGwpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5fY2VsbHMucHVzaChuZXcgQ2VsbEVsZW1lbnQoZGF0YS5zdWJzdHIoPG51bWJlcj4oPG51bWJlcj5pICogdGhpcy5fY2VsbFNpemUpLCA8bnVtYmVyPnRoaXMuX2NlbGxTaXplKSwgaXNOdWxsKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gaW4gY2FzZSBvZiB2ZWN0b3JzIG9yZiB2ZWN0b3JzIG9yIHZlY3RvcnMgb2YgYmxvYnMgd2UgbmVlZCB0byB0cmVhdCB0aGVtIGRpZmZlcmVudGxseVxyXG4gICAgICAgICAgLy8gZWFjaCBibG9iIG9yIHZlY3RvciBpcyBcImZsYXR0ZW5lZCBpbiB0aGUgZW5kIG9mIHRoZSBudWxsIGJ1ZmZcclxuICAgICAgICAgIC8vIGFzIGEgc3RyaW5nIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxyXG4gICAgICAgICAgLy8gQmxvYl9TaXplLE9iakhhbmRsZSxWYXJpYW50SWR4LFR5cGUsVmVjQ2VsbEF0dHIsLi4uLmRhdGEuLi4uO25leHRfYmxvYjtcclxuICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCBlciBhIGJsb2IgY29tZSB0byB0aGUgY2xpZW50IG5veSB2aWEgdmVjdG9yIGl0cyBmb3JtYXQgaXM6XHJcbiAgICAgICAgICAvLyBPYmpIYW5kbGUsVmFyaWFudElkeCxUeXBlLFZlY0NlbGxBdHRyO2RhdGEgdGhlcmUgZm9yIHdlIG5lZWQgdG8gbWFrZSB0aGUgYWRqdXN0bWVudHNcclxuICAgICAgICAgIC8vIGluIHRoZSBwYXJzaW5nIHByb2Nlc3MgYW5kIGluIHZlY0dldCBhbmQgaW4gdG9TdHJpbmdcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2ZWNTaXplOyBpKyspIHtcclxuICAgICAgICAgICAgdG9rZW5zID0gU3RyVXRpbC50b2tlbml6ZSh0aGlzLl9vcmlnaW5hbGZsYXREYXRhLnN1YnN0cihwb3MpLCBcIixcIik7XHJcbiAgICAgICAgICAgIHRva2VuSWR4ID0gMDtcclxuXHJcbiAgICAgICAgICAgIC8vIHBhcnNlIGJsb2Igc2l6ZVxyXG4gICAgICAgICAgICB0b2tlbklkeCsrO1xyXG4gICAgICAgICAgICBjdXJyZW50VG9rZW4gPSB0b2tlbnNbdG9rZW5JZHhdO1xyXG4gICAgICAgICAgICBsZXQgc2l6ZTogbnVtYmVyID0gPG51bWJlcj5OTnVtYmVyLlBhcnNlKGN1cnJlbnRUb2tlbik7XHJcbiAgICAgICAgICAgIHBvcyA9IHBvcyArIChjdXJyZW50VG9rZW4ubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAgICAgICAvLyBwYXJzZSB0aGUgcmVzdCBvZiB0aGUgYmxvYiBoZWFkZXJcclxuICAgICAgICAgICAgbGV0IGJsb2JIZWFkZXI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBHdWlDb25zdGFudHMuQkxPQl9QUkVGSVhfRUxFTUVOVFNfQ09VTlQ7IGorKykge1xyXG4gICAgICAgICAgICAgIHRva2VuSWR4Kys7XHJcbiAgICAgICAgICAgICAgY3VycmVudFRva2VuID0gdG9rZW5zW3Rva2VuSWR4XTtcclxuICAgICAgICAgICAgICBibG9iSGVhZGVyID0gYmxvYkhlYWRlciArIGN1cnJlbnRUb2tlbjtcclxuICAgICAgICAgICAgICBwb3MgPSBwb3MgKyAoY3VycmVudFRva2VuLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoaiAhPT0gR3VpQ29uc3RhbnRzLkJMT0JfUFJFRklYX0VMRU1FTlRTX0NPVU5UIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgYmxvYkhlYWRlciA9IGJsb2JIZWFkZXIgKyBcIixcIjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBjZWxsRGF0YTogc3RyaW5nID0gdGhpcy5fb3JpZ2luYWxmbGF0RGF0YS5zdWJzdHIocG9zLCA8bnVtYmVyPnNpemUpO1xyXG5cclxuICAgICAgICAgICAgLy8gYWRkIHRoZSBjZWxsIHRvIHRoZSB2ZWNcclxuICAgICAgICAgICAgbGV0IGlzTnVsbDogYm9vbGVhbiA9IG51bGxCdWYuY2hhckF0KGkpID4gJ1xcMCc7XHJcbiAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGNlbGxEYXRhLCBpc051bGwsIGJsb2JIZWFkZXIpKTtcclxuICAgICAgICAgICAgcG9zID0gPG51bWJlcj4oPG51bWJlcj5wb3MgKyBzaXplICsgMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIGRhdGFCdWYgd2FzIG5vdCBidWlsdCBkdXJpbmcgXCJjZWxscyBncm93dGhcIiAtIGFsbG9jYXRlIGl0IHJpZ2h0IG5vdywgaW4gb25lLXNob3QuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RhdGFCdWYuTGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgdGhpcy5fZGF0YUJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKGRhdGEubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBWZWN0b3JUeXBlLmluaXQgd3JvbmcgdmVjdG9yIGZvcm1hdFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gYSBmbGF0dGVuIGJsb2Igc3RyaW5nIHJlcHJlc2VudGF0aW9uIHdlIGFzc3VtZSBoZXJlIHRoYXQgYWxsIGNoYW5nZXMgYXJlIGR5bmFtaWNhbGx5IHNhdmUgaW50byB0aGVcclxuICAvLy8gICBidWZmcyBlYWNoIHRpbWUgdGhlIHZlY3RvciBjaGFuZ2VzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlczogc3RyaW5nID0gXCJcIjsgLy8gdGFrZVxyXG5cclxuICAgIC8vIGxhenkgZXZhbHVhdGlvbiBpZiB0aGUgdmVjdG9yIHdhcyBub3QgaW5pdGlhbGl6ZWQgaXQgd2Fzbid0IGNoYW5nZWQgc28gcmV0dXJuIHRoZSBvcmlnaW5hbFxyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XHJcbiAgICAgIC8vIGJ1aWxkIHRoZSBoZWFkZXJzXHJcbiAgICAgIHJlcyA9IHJlcyArIDAgKyBcIixcIiArIDAgKyBcIixcIiArIFwiMFwiICsgXCIsXCIgKyA8c3RyaW5nPnRoaXMuX2NlbGxzQXR0ciArIFwiLFwiICsgdGhpcy5fY2VsbENvbnRlbnRUeXBlICsgXCI7XCI7XHJcbiAgICAgIC8vIHRoZSBibG9iIGhlYWRlciBvZiB0aGlzIGJsb2JcclxuICAgICAgcmVzID0gcmVzICsgdGhpcy5idWlsZEhlYWRlcnNTdHJpbmcoKTtcclxuICAgICAgLy8gKyBkYXRhQnVmLnRvU3RyaW5nKCkgKyBcIixcIiArIG51bGxCdWYudG9TdHJpbmcoKSArIFwiLFwiO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSB7XHJcbiAgICAgICAgbGV0IGRhdGFCdWZDaGFyQXJyeTogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPih0aGlzLl9kYXRhQnVmLkxlbmd0aCAqIDIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fZGF0YUJ1Zi5MZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgZGF0YUJ1ZkNoYXJBcnJ5W2kgKiAyXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKHRoaXMuX2RhdGFCdWYuZ2V0X0l0ZW0oaSkuY2hhckNvZGVBdCgwKSkgJSAyNTYpO1xyXG4gICAgICAgICAgZGF0YUJ1ZkNoYXJBcnJ5W2kgKiAyICsgMV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCh0aGlzLl9kYXRhQnVmLmdldF9JdGVtKGkpLmNoYXJDb2RlQXQoMCkpIC8gMjU2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzID0gcmVzICsgTlN0cmluZy5Gcm9tQ2hhcnMoZGF0YUJ1ZkNoYXJBcnJ5KSArIFwiLFwiO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXMgPSByZXMgKyB0aGlzLl9kYXRhQnVmICsgXCIsXCI7XHJcblxyXG4gICAgICByZXMgPSByZXMgKyB0aGlzLl9udWxsQnVmICsgXCIsXCI7XHJcblxyXG4gICAgICAvLyBpbiBibG9icyBhbmQgdmVjdG9yIHdlIGRvIG5vdCB1cGRhdGVcclxuICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgICByZXMgPSByZXMgKyB0aGlzLmdldEJsb2JzQnVmKCk7XHJcblxyXG4gICAgICByZXMgPSByZXMgKyBWZWN0b3JUeXBlLkJMT0JfVEFCTEVfU1RSO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXMgPSB0aGlzLl9vcmlnaW5hbGZsYXREYXRhO1xyXG5cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY2VsbHMgYXR0cmlidXRlICggdGhlIHNhbmUgZm9yIGFsbCBjZWxscyBpbiB0aGUgdmVjdG9yKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Q2VsbHNBdHRyKCk6IFN0b3JhZ2VBdHRyaWJ1dGUge1xyXG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZClcclxuICAgICAgcmV0dXJuIFZlY3RvclR5cGUuZ2V0Q2VsbHNBdHRyKHRoaXMuX29yaWdpbmFsZmxhdERhdGEpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gdGhpcy5fY2VsbHNBdHRyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGNlbGxzIHNpemUgKCBzYW1lIHNpemUgZm9yIGFsbCBjZWxscylcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENlbGxTaXplKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0VmFsOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZClcclxuICAgICAgcmV0VmFsID0gVmVjdG9yVHlwZS5nZXRDZWxsU2l6ZSh0aGlzLl9vcmlnaW5hbGZsYXREYXRhKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0VmFsID0gdGhpcy5fY2VsbFNpemU7XHJcblxyXG4gICAgLy8gdW5pY29kZSBjZWxsIHNpemUgaXMgc2F2ZWQgaW50ZXJuYWxseSBhcyBieXRlIGxlbmd0aCBzaW5jZSB0aGF0IGlzIHRoZSB3YXkgdGhlIHNlcnZlciBzYXZlIGl0XHJcbiAgICBpZiAodGhpcy5nZXRDZWxsc0F0dHIoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKVxyXG4gICAgICByZXRWYWwgPSBNYXRoLmZsb29yKHJldFZhbCAvIDIpO1xyXG5cclxuICAgIHJldHVybiByZXRWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmVjdG9yIHNpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFZlY1NpemUoKTogbnVtYmVyIHtcclxuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpXHJcbiAgICAgIHJldHVybiBWZWN0b3JUeXBlLmdldFZlY1NpemUodGhpcy5fb3JpZ2luYWxmbGF0RGF0YSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiA8bnVtYmVyPnRoaXMuX2NlbGxzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGdpdmUgY2VsbCBjZWxscyBpbmRleGVzIHN0YXJ0IGZyb20gMSB3cm9uZyBpbmRleGVzIG9yIGluZGV4ZXMgdGhlIGRvZXMgbm90IGV4aXN0XHJcbiAgLy8vICAgd2lsbCByZXR1cm4gZGVmYXVsdCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgY2VsbCBpbmRleDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2VsbCB2YWx1ZSBUT0RPOiB5YXJpdiBjaGVjayB3aXRoIHJpbmEgd2hhdCB3ZSBzaG91bGQgZG8gd2l0aFxyXG4gIC8vLyAgIGJsb2JzIGV4dHJhIGZpZWxkc1xyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZ2V0VmVjQ2VsbChpZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgcmV0VmFsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgaWYgKGlkeCA+IDApIHtcclxuICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgIGlmICg8bnVtYmVyPmlkeCA8PSB0aGlzLmdldFZlY1NpemUoKSkge1xyXG4gICAgICAgIHJldFZhbCA9IHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCAtIDEpLmRhdGE7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgICByZXRWYWwgPSB0aGlzLl9jZWxscy5nZXRfSXRlbShpZHggLSAxKS5ibG9iRmllbGRQcmVmaXggKyBcIjtcIiArIHJldFZhbDtcclxuXHJcbiAgICAgICAgLy8gUUNSIDUwMzY5MSB0aGUgdmFsdWUgb2YgdHJ1ZSBvciBmYWxzZSBpbiB0aGUgc2VydmVyIGFyZSB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgMSBhbmQgMFxyXG4gICAgICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUeXBlTG9naWNhbCh0aGlzLl9jZWxsc0F0dHIpKVxyXG4gICAgICAgICAgcmV0VmFsID0gKChyZXRWYWwuY2hhckF0KDApID09PSAnXFwwJykgPyBcIjBcIiA6IFwiMVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCAtIDEpLmlzTnVsbClcclxuICAgICAgICAgIHJldFZhbCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoIXRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdClcclxuICAgICAgICByZXRWYWwgPSB0aGlzLl9jZWxsc0RlZmF1bHRWYWw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0VmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRoZSBjZWxsIHZhbHVlcyBvZiBhIHZlY3RvciBpbiBzdHJpbmcgYXJyYXkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENlbGxWYWx1ZXMoKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IHJldFZhbDogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBjZWxsVmFsdWVzOiBzdHJpbmdbXSA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5pbml0KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0VmVjU2l6ZSgpID4gMClcclxuICAgIHtcclxuICAgICAgY2VsbFZhbHVlcyA9IG5ldyBBcnJheTxzdHJpbmc+KHRoaXMuZ2V0VmVjU2l6ZSgpKTtcclxuXHJcbiAgICAgIC8vIEdldCB0aGUgdmVjdG9yIHZhbHVlXHJcbiAgICAgIGZvciAobGV0IGlkeDogbnVtYmVyID0gMDsgaWR4IDwgdGhpcy5nZXRWZWNTaXplKCk7IGlkeCsrKVxyXG4gICAgICB7XHJcbiAgICAgICAgcmV0VmFsID0gdGhpcy5fY2VsbHMuZ2V0X0l0ZW0oaWR4KS5kYXRhO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKVxyXG4gICAgICAgICAgcmV0VmFsID0gdGhpcy5fY2VsbHMuZ2V0X0l0ZW0oaWR4KS5ibG9iRmllbGRQcmVmaXggKyBcIjtcIiArIHJldFZhbDtcclxuXHJcbiAgICAgICAgLy8gUUNSIDUwMzY5MSB0aGUgdmFsdWUgb2YgdHJ1ZSBvciBmYWxzZSBpbiB0aGUgc2VydmVyIGFyZSB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgMSBhbmQgMFxyXG4gICAgICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUeXBlTG9naWNhbCh0aGlzLl9jZWxsc0F0dHIpKVxyXG4gICAgICAgICAgcmV0VmFsID0gKChyZXRWYWwuY2hhckF0KDApID09PSAnXFwwJykgPyBcIjBcIiA6IFwiMVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxzLmdldF9JdGVtKGlkeCkuaXNOdWxsKVxyXG4gICAgICAgICAgcmV0VmFsID0gbnVsbDtcclxuXHJcbiAgICAgICAgY2VsbFZhbHVlc1tpZHhdID0gcmV0VmFsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5fY2VsbHNJc051bGxEZWZhdWx0KVxyXG4gICAge1xyXG4gICAgICAgIGNlbGxWYWx1ZXMgPSBbXHJcbiAgICAgICAgICB0aGlzLl9jZWxsc0RlZmF1bHRWYWxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjZWxsVmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluc2VydHMgb3IgY2hhbmdlcyBhIGNlbGxzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPnRoZSBjZWxsIGluZGV4IGlmIHRoZSBpbmRleCBpcyBub3Qgc2VxdWVudGlhbCBjcmVhdHMgZW1wdHkgY2VsbCB0aWxsIHRoZSBpbmRleDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWx1ZVwiPnRoZSBuZXcgdmFsdWUgKCBpZiBpdCBpcyBhIGJsb2IgdHlwZSBvciB2ZWN0b3IgaXQgY29udGFpbnMgdGhlIHByZWZpeCBvZiB0aGUgY29udHJvbCBkYXRhPC9wYXJhbT5cclxuICAvLy8gPHJldHVucz4gIGZhbHNlIGlmIHRoZSBpbmRleCBpcyB3cm9uZyBvciB0aGUgdmVjdG9yIGlsbGZvcm1lZCA8L3JldHVucz5cclxuICBzZXRWZWNDZWxsKGlkeDogbnVtYmVyLCBuZXdWYWx1ZTogc3RyaW5nLCBpc051bGw6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGxldCByZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBjcmVhdGVCdWZmZXJWYWxGb3JOdW1UeXBlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChpZHggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgICAgICAgIGxldCBsb2NhbENlbGxTaXplOiBudW1iZXIgPSAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gTWF0aC5mbG9vcih0aGlzLl9jZWxsU2l6ZSAvIDIpIDogdGhpcy5fY2VsbFNpemU7XHJcbiAgICAgICAgLy8gdHJ5aW5nIHRvIHNldCBudWxsIHZhbHVlIHdoZW4gbm90IGFsbG93ZWRcclxuICAgICAgICBpZiAoaXNOdWxsICYmICF0aGlzLl9hbGxvd051bGwpIHtcclxuICAgICAgICAgIGlzTnVsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLl9jZWxsc0RlZmF1bHRWYWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWR4IDw9IHRoaXMuX2NlbGxzLmxlbmd0aCkge1xyXG4gICAgICAgICAgbGV0IGN1cnI6IENlbGxFbGVtZW50ID0gdGhpcy5fY2VsbHMuZ2V0X0l0ZW0oaWR4IC0gMSk7XHJcbiAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG5vdCBudWxsXHJcbiAgICAgICAgICBpZiAoIWlzTnVsbCkge1xyXG4gICAgICAgICAgICAvLyBzcGVjaWFsIHRyZWF0bWVudCBmb3IgYmxvYnMgYW5kIHZlY3RvcnNcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgICAgIC8vIHNldCB0aGUgZGF0YSBpbiB0aGUgY2VsbFxyXG4gICAgICAgICAgICAgIGxldCBibG9iUHJlZml4TGVuZ3RoOiBudW1iZXIgPSBCbG9iVHlwZS5ibG9iUHJlZml4TGVuZ3RoKG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgICBjdXJyLmJsb2JGaWVsZFByZWZpeCA9IG5ld1ZhbHVlLnN1YnN0cigwLCBibG9iUHJlZml4TGVuZ3RoIC0gMSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIHRyZWF0IGVtcHR5IGJsb2JcclxuICAgICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID4gYmxvYlByZWZpeExlbmd0aClcclxuICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IG5ld1ZhbHVlLnN1YnN0cihibG9iUHJlZml4TGVuZ3RoKTtcclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBjdXJyLmRhdGEgPSBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHNpbXBsZSB0eXBlXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIFFDUiA1MDM2OTEgdGhlIHZhbHVlIG9mIHRydWUgb3IgZmFsc2UgaW4gdGhlIHNlcnZlciBhcmUgdGhlIG51bWVyaWMgdmFsdWVzIG9mIDEgYW5kIDBcclxuICAgICAgICAgICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVHlwZUxvZ2ljYWwodGhpcy5fY2VsbHNBdHRyKSkge1xyXG4gICAgICAgICAgICAgICAgY3Vyci5kYXRhID0gKERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKG5ld1ZhbHVlKSA/IG5ldyBTdHJpbmdCdWlsZGVyKCkuQXBwZW5kKDEpLlRvU3RyaW5nKCkgOiBuZXcgU3RyaW5nQnVpbGRlcigpLkFwcGVuZCgnXFwwJykuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IGN1cnIuZGF0YTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgY3Vyci5kYXRhID0gbmV3VmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgIC8vIG51bWVyaWMgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGluIHRoZSBkYXRhIGJ1ZiBhcyBudW0gdHlwZSBzbyB3ZVxyXG4gICAgICAgICAgICAgIC8vIHRyYW5zbGF0ZSB0aGVtIGJlZm9yZSBpbnNlcnRpbmcgdGhlbSB0byB0aGUgYnVmXHJcbiAgICAgICAgICAgICAgbGV0IGRhdGFCdWZWYWw6IHN0cmluZyA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSlcclxuICAgICAgICAgICAgICAgIGRhdGFCdWZWYWwgPSBSZWNvcmRVdGlscy5ieXRlU3RyZWFtVG9TdHJpbmcoZGF0YUJ1ZlZhbCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8pKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmFEYXRhQnVmOiBVaW50OEFycmF5ID0gdGhpcy5fZW5jb2RpbmcuR2V0Qnl0ZXModGhpcy5fZGF0YUJ1Zi5Ub1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIGxldCBiYURhdGFCdWZWYWw6IFVpbnQ4QXJyYXkgPSB0aGlzLl9lbmNvZGluZy5HZXRCeXRlcyhkYXRhQnVmVmFsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZGF0YSBidWZcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBiYURhdGFCdWZWYWwubGVuZ3RoICYmIDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICAgICAgYmFEYXRhQnVmWzxudW1iZXI+KDxudW1iZXI+KGlkeCAtIDEpICogbG9jYWxDZWxsU2l6ZSkgKyBpXSA9IGJhRGF0YUJ1ZlZhbFtpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3Qga2VlcCB0aGUgd2hvbGUgc2l6ZSBvZiB0aGUgYWxwaGFcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IGJhRGF0YUJ1ZlZhbC5sZW5ndGg7IDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICAgICAgYmFEYXRhQnVmWzxudW1iZXI+KDxudW1iZXI+KGlkeCAtIDEpICogbG9jYWxDZWxsU2l6ZSkgKyBpXSA9ICgodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSA/IDMyIDogMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaXMuX2VuY29kaW5nLkdldFN0cmluZyhiYURhdGFCdWYsIDAsIGJhRGF0YUJ1Zi5sZW5ndGgpKTtcclxuICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IHRoaXMuX2VuY29kaW5nLkdldFN0cmluZyhiYURhdGFCdWYsIDxudW1iZXI+KDxudW1iZXI+KGlkeCAtIDEpICogbG9jYWxDZWxsU2l6ZSksIDxudW1iZXI+bG9jYWxDZWxsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGRhdGEgYnVmXHJcbiAgICAgICAgICAgICAgICAvLyBRQ1IgOTg3OTQzIHRyaW0gdGhlIHZhbHVlIGlmIGl0IGlzIGxvbmdlciB0aGUgdGhlIGNlbGwgbGVuZ3RoXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGF0YUJ1ZlZhbC5sZW5ndGggJiYgPG51bWJlcj5pIDwgbG9jYWxDZWxsU2l6ZTsgaSsrKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhQnVmLnNldF9JdGVtKDxudW1iZXI+KDxudW1iZXI+KGlkeCAtIDEpICogbG9jYWxDZWxsU2l6ZSkgKyBpLCBkYXRhQnVmVmFsLmNoYXJBdChpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaW4gYWxwaGEgYW5kIG51bSB0eXBlIHdlIGRvIG5vdCBrZWVwIHRoZSB3aG9sZSBzaXplIG9mIHRoZSBhbHBoYS9OVU1fVFlQRVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gZGF0YUJ1ZlZhbC5sZW5ndGg7IDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5zZXRfSXRlbSg8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpICsgaSwgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSkgPyAnICcgOiAnXFwwJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUUNSIDk4Nzk0MyB0cmltIHRoZSB2YWx1ZSBpZiBpdCBpcyBsb25nZXIgdGhlIHRoZSBjZWxsIGxlbmd0aFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTUVNTylcclxuICAgICAgICAgICAgICAgICAgY3Vyci5kYXRhID0gdGhpcy5fZGF0YUJ1Zi5Ub1N0cmluZygpLnN1YnN0cig8bnVtYmVyPig8bnVtYmVyPihpZHggLSAxKSAqIGxvY2FsQ2VsbFNpemUpLCA8bnVtYmVyPmxvY2FsQ2VsbFNpemUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG51bGwgYnVmXHJcbiAgICAgICAgICAgIHRoaXMuX251bGxCdWYuc2V0X0l0ZW0oaWR4IC0gMSwgJ1xcMCcpO1xyXG4gICAgICAgICAgICBjdXJyLmlzTnVsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBudWxsXHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3Vyci5kYXRhID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIC8vIHNldCB0aGUgcHJlZml4IGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYmxvYiBpcyB2ZWN0b3Igb3Igbm90XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpXHJcbiAgICAgICAgICAgICAgY3Vyci5ibG9iRmllbGRQcmVmaXggPSBCbG9iVHlwZS5nZXRFbXB0eUJsb2JQcmVmaXgoJ1xcdTAwMDEnKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGN1cnIuYmxvYkZpZWxkUHJlZml4ID0gQmxvYlR5cGUuZ2V0RW1wdHlCbG9iUHJlZml4KCdcXDAnKTtcclxuICAgICAgICAgICAgY3Vyci5pc051bGwgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9udWxsQnVmLnNldF9JdGVtKGlkeCAtIDEsICdcXHUwMDAxJyk7XHJcblxyXG4gICAgICAgICAgICAvLyByZWxldmFudCBvbmx5IGZvciBub25lIGJsb2JzXHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IDxudW1iZXI+aSA8IGxvY2FsQ2VsbFNpemU7IGkrKylcclxuICAgICAgICAgICAgICB0aGlzLl9kYXRhQnVmLnNldF9JdGVtKDxudW1iZXI+KDxudW1iZXI+KGlkeCAtIDEpICogbG9jYWxDZWxsU2l6ZSkgKyBpLCAnXFwwJyk7XHJcblxyXG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG51bGwgYnVmXHJcbiAgICAgICAgICAgIHRoaXMuX251bGxCdWYuc2V0X0l0ZW0oaWR4IC0gMSwgJ1xcdTAwMDEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG5ldyByZWNvcmRcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBpbnNlcnRWYWw6IHN0cmluZztcclxuICAgICAgICAgIC8vIGNob29zZXMgdGhlIHZhbHVlIGluc2VydGVkIHRvIHRoZSBza2lwcGVkIGNlbGxzXHJcbiAgICAgICAgICBpZiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgICAgICAgIC8vIGFwcGVuZCB0aGUgaXMgdmVjdG9yIGZsYWdcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgICAgICAgICBpbnNlcnRWYWwgPSBCbG9iVHlwZS5nZXRFbXB0eUJsb2JQcmVmaXgoJ1xcdTAwMDEnKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGluc2VydFZhbCA9IEJsb2JUeXBlLmdldEVtcHR5QmxvYlByZWZpeCgnXFwwJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdClcclxuICAgICAgICAgICAgICBpbnNlcnRWYWwgPSBpbnNlcnRWYWwgKyB0aGlzLl9jZWxsc0RlZmF1bHRWYWw7IC8vIGNvbmNhdCByZWdvbGFyIGJsb2IgY250cm9sIGRhdGFcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdClcclxuICAgICAgICAgICAgaW5zZXJ0VmFsID0gbnVsbDtcclxuICAgICAgICAgIC8vIHNpbXBsZSBudWxsIHZhbHVlXHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGluc2VydFZhbCA9IHRoaXMuX2NlbGxzRGVmYXVsdFZhbDsgLy8gZGVmYXVsdCBzaW1wbGUgdmFsdWVcclxuXHJcbiAgICAgICAgICAvLyBRQ1IgNTAzNjkxIHRoZSB2YWx1ZSBvZiB0cnVlIG9yIGZhbHNlIGluIHRoZSBzZXJ2ZXIgYXJlIHRoZSBudW1lcmljIHZhbHVlcyBvZiAxIGFuZCAwXHJcbiAgICAgICAgICBpZiAoaW5zZXJ0VmFsICE9PSBudWxsICYmIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5pc1R5cGVMb2dpY2FsKHRoaXMuX2NlbGxzQXR0cikpXHJcbiAgICAgICAgICAgIGluc2VydFZhbCA9IChEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihpbnNlcnRWYWwpID8gbmV3IFN0cmluZ0J1aWxkZXIoKS5BcHBlbmQoJ1xcdTAwMDEnKS5Ub1N0cmluZygpIDogbmV3IFN0cmluZ0J1aWxkZXIoKS5BcHBlbmQoJ1xcMCcpLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgIC8vIGNyZWF0ZSBza2lwcGVkIHJlY29yZHNcclxuICAgICAgICAgIC8vIHdoZW4gYSB2ZWN0b3IgY2VsbCBpcyBzZXQgLCBpZiB0aGUgY2VsbCBpcyBiZXlvbmQgdGhlIGV4aXN0aW5nIHZlY3Rvci5cclxuICAgICAgICAgIC8vIHdlIHdpbGwgZmlsbCB0aGUgY2VsbHMgYmV0d2VlbiB2ZWN0b3Igc2l6ZSBhbmQgc2V0IGNlbGwgd2l0aCBkZWZhdWx0IHZhbHVlLlxyXG4gICAgICAgICAgLy8gZm9yIGV4YW1wbGUgOiBpZiB2ZWN0b3Igc2l6ZSBpcyAwLCBhbmQgd2UgZG8gdmVjc2V0ICh2ZWNbNV0pLiBjZWxsIDUgbmVlZHMgdG8gYmUgc2V0XHJcbiAgICAgICAgICAvLyB3aXRoIHRoZSB2YWx1ZS4gY2VsbHMgMSB0byA0IHdpbGwgYmUgY3JlYXRlZCBhbmQgc2V0IHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuXHJcbiAgICAgICAgICBsZXQgZGF0YUJ1ZlZhbDogc3RyaW5nID0gaW5zZXJ0VmFsO1xyXG5cclxuICAgICAgICAgIHdoaWxlICh0aGlzLl9jZWxscy5sZW5ndGggPCBpZHgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzLnB1c2gobmV3IENlbGxFbGVtZW50KGluc2VydFZhbC5zdWJzdHIoVmVjdG9yVHlwZS5FTVBUWV9CTE9CX1BSRUZJWF9MRU4pLCB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQsIGluc2VydFZhbC5zdWJzdHIoMCwgVmVjdG9yVHlwZS5FTVBUWV9CTE9CX1BSRUZJWF9MRU4pKSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQodGhpcy5nZXROdWxsU3RyaW5nKFZlY3RvclR5cGUuQkxPQl9UWVBFX1NUUlVDVF9TSVpFKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fY2VsbHMucHVzaChuZXcgQ2VsbEVsZW1lbnQoaW5zZXJ0VmFsLCB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQpKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBkYXRhIGJ1ZlxyXG4gICAgICAgICAgICAgIGlmIChpbnNlcnRWYWwgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIG51bWVyaWMgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGluIHRoZSBkYXRhIGJ1ZiBhcyBudW0gdHlwZSBzbyB3ZVxyXG4gICAgICAgICAgICAgICAgLy8gdHJhbnNsYXRlIHRoZW0gYmVmb3JlIGluc2VydGluZyB0aGVtIHRvIHRoZSBidWZcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlQnVmZmVyVmFsRm9yTnVtVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciB2YWx1ZSBmb3IgbnVtIHR5cGUgb25seSBvbmNlLCBhbmQgdXNlIGl0XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYWxsIHRoZSBjZWxscyB0byBiZSBpbml0aWFsaXplZC5cclxuICAgICAgICAgICAgICAgICAgICAvLyBkbyB0aGUgdHJhbnNsYXRpb24gb25seSBvbmNlIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlQnVmZmVyVmFsRm9yTnVtVHlwZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFCdWZWYWwgPSBSZWNvcmRVdGlscy5ieXRlU3RyZWFtVG9TdHJpbmcoaW5zZXJ0VmFsKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGRhdGFCdWZWYWwgZWl0aGVyIGNvbnRhaW5zIG9yaWdpbmFsIGluc2VydFZhbCwgb3IgYSBzdHJpbmcgb2ZcclxuICAgICAgICAgICAgICAgIC8vIGJ5dGVTdHJlYW0gZm9yIG51bSB0eXBlcy5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFCdWYuQXBwZW5kKGRhdGFCdWZWYWwpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGRvbid0IGFsd2F5IGtlZXAgdGhlIHdob2xlIGFscGhhXHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsTGVuOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0RCQ1MoKSAmJiAodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5NRU1PKSlcclxuICAgICAgICAgICAgICAgICAgdmFsTGVuID0gVXRpbFN0ckJ5dGVNb2RlLmxlbkIoZGF0YUJ1ZlZhbCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIHZhbExlbiA9IGRhdGFCdWZWYWwubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHZhbExlbjsgPG51bWJlcj5pIDwgbG9jYWxDZWxsU2l6ZTsgaSsrKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhQnVmLkFwcGVuZCgodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFKSA/ICcgJyA6ICdcXDAnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YUJ1Zi5BcHBlbmQodGhpcy5nZXROdWxsU3RyaW5nKGxvY2FsQ2VsbFNpemUpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBudWxsIGJ1ZlxyXG4gICAgICAgICAgICB0aGlzLl9udWxsQnVmLkluc2VydCh0aGlzLl9jZWxscy5sZW5ndGggLSAxLFxyXG4gICAgICAgICAgICAgIHRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdCA/ICdcXHUwMDAxJyA6ICdcXDAnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gdmVjdG9yIGhhcyBiZWVuIGZpbGxlZCB0aWxsIHRoZSByZXF1ZXN0ZWQgaWR4LlxyXG4gICAgICAgICAgLy8gbm93IGl0cyB0aW1lIHRvIHNldCB0aGUgcmVxdWVzdGVkIGNlbGwuXHJcbiAgICAgICAgICByZXMgPSB0aGlzLnNldFZlY0NlbGwoaWR4LCBuZXdWYWx1ZSwgaXNOdWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChBcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICByZXMgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hhbmdlIHRoZSB2ZWN0b3IgdG8gZml0IHRoZSBkZWZpbml0aW9ucyBvZiBhIGRpZmZlcmVudCB2ZWN0b3IgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkXCI+dGhlIG5ldyBmaWVsZDwvcGFyYW0+XHJcbiAgYWRqdXN0VG9GaXQoZmllbGQ6IEZpZWxkRGVmKTogdm9pZCB7XHJcbiAgICBpZiAoZmllbGQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIGxldCBzcmNBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gdGhpcy5nZXRDZWxsc0F0dHIoKTtcclxuICAgICAgbGV0IGRzdEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmaWVsZC5nZXRDZWxsc1R5cGUoKTtcclxuXHJcbiAgICAgIGlmIChTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUaGVTYW1lVHlwZShzcmNBdHRyLCBkc3RBdHRyKSkge1xyXG4gICAgICAgIHRoaXMuaW5pdCgpO1xyXG5cclxuICAgICAgICAvLyB0cmltIGRhdGEgaWYgbmVlZGVkICggb25seSBmb3IgYWxwaGEgb3IgbWVtbylcclxuICAgICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLklzVHlwZUFscGhhT3JVbmljb2RlKHNyY0F0dHIpICYmIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5Jc1R5cGVBbHBoYU9yVW5pY29kZShkc3RBdHRyKSkge1xyXG4gICAgICAgICAgICBsZXQgZHN0U2l6ZUluQ2hhcnM6IG51bWJlciA9IGZpZWxkLmdldFZlY0NlbGxzU2l6ZSgpO1xyXG4gICAgICAgICAgICBsZXQgc3JjU2l6ZUluQ2hhcnM6IG51bWJlciA9ICgodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gTWF0aC5mbG9vcih0aGlzLl9jZWxsU2l6ZSAvIDIpIDogdGhpcy5fY2VsbFNpemUpO1xyXG4gICAgICAgICAgbGV0IGlzQnl0ZU1vZGU6IGJvb2xlYW4gPSBVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmIFN0b3JhZ2VBdHRyaWJ1dGVDaGVjay5pc1R5cGVBbHBoYShkc3RBdHRyKTtcclxuXHJcbiAgICAgICAgICBpZiAoc3JjU2l6ZUluQ2hhcnMgIT09IGRzdFNpemVJbkNoYXJzKSB7XHJcbiAgICAgICAgICAgIGxldCBhZGpEYXRhOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGdvZXMgb3ZlciBhbGwgY2VsbHMgaW4gdGhlIHZlY3RvclxyXG4gICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZHN0U2l6ZUluQ2hhcnM7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICAgIGxldCBjdXJyOiBDZWxsRWxlbWVudCA9IHRoaXMuX2NlbGxzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgICAgICAgIC8vIHRyaW0gaXMgbmVlZGVkXHJcbiAgICAgICAgICAgICAgaWYgKCFjdXJyLmlzTnVsbCkgeyAvLyB1bmljb2RlIGNlbGwgc2l6ZSBhcmUgc2F2ZWQgaW50ZXJuYWxseSBhcyBieXRlIGxlbmd0aCB3aGlsZSB0aGUgZmllbGQgcmV0dXJucyBjaGFyXHJcbiAgICAgICAgICAgICAgICAvLyBsZW5ndGhcclxuICAgICAgICAgICAgICAgIGlmIChzcmNTaXplSW5DaGFycyA+IGRzdFNpemVJbkNoYXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpc0J5dGVNb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IFV0aWxTdHJCeXRlTW9kZS5sZWZ0QihjdXJyLmRhdGEsIGRzdFNpemVJbkNoYXJzKTtcclxuICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IGN1cnIuZGF0YS5zdWJzdHIoMCwgZHN0U2l6ZUluQ2hhcnMpO1xyXG4gICAgICAgICAgICAgICAgICBhZGpEYXRhLkFwcGVuZChjdXJyLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gcGFkZGluZyBpcyBuZWVkZWRcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgdG1wRGF0YTogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgIHRtcERhdGEuQXBwZW5kKGN1cnIuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBkYXRhTGVuOiBudW1iZXIgPSBpc0J5dGVNb2RlID8gVXRpbFN0ckJ5dGVNb2RlLmxlbkIoY3Vyci5kYXRhKSA6IGN1cnIuZGF0YS5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBwYWQgd2l0aCBibGFua3NcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gZGF0YUxlbjsgaiA8IGRzdFNpemVJbkNoYXJzOyBqID0gaiArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgdG1wRGF0YS5BcHBlbmQoJyAnKTtcclxuICAgICAgICAgICAgICAgICAgYWRqRGF0YS5BcHBlbmQodG1wRGF0YS5Ub1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGF0YSBpbiB0aGUgdmVjdG9yIGNlbGxcclxuICAgICAgICAgICAgICAgICAgY3Vyci5kYXRhID0gdG1wRGF0YS5Ub1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCB0bXBEYXRhOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBkc3RTaXplSW5DaGFyczsgaiA9IGogKyAxKVxyXG4gICAgICAgICAgICAgICAgICB0bXBEYXRhLkFwcGVuZCgnXFwwJyk7XHJcbiAgICAgICAgICAgICAgICBhZGpEYXRhLkFwcGVuZCh0bXBEYXRhLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGF0YSBpbiB0aGUgdmVjdG9yIGNlbGxcclxuICAgICAgICAgICAgICAgIGN1cnIuZGF0YSA9IHRtcERhdGEuVG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0vLyBlbmQgbG9vcFxyXG4gICAgICAgICAgICB0aGlzLl9kYXRhQnVmID0gYWRqRGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFFDUiA3NDc4MDEgaW4gdGhlIGZpbGVkIHRoZSBzaXplIG9mIG51bWVyaWMvZGF0ZS90aW1lIGlzIHRoaWVyIGhleCBzaXplXHJcbiAgICAgICAgLy8gd2hlcmVhcyBoZXJlIGl0IGlzIHRoZWlyIE5VTV9UWVBFIHNpemVcclxuICAgICAgICBsZXQgbmV3U2l6ZTogbnVtYmVyID0gZmllbGQuZ2V0VmVjQ2VsbHNTaXplKCk7XHJcblxyXG4gICAgICAgIC8vIGNoYW5nZSB0aGUgaGVhZGVycyBkYXRhIHN1Y2ggYXMgY2VsbCB0eXBlIGFuZCBjZWxscyBzaXplXHJcbiAgICAgICAgdGhpcy5fY2VsbHNBdHRyID0gZmllbGQuZ2V0Q2VsbHNUeXBlKCk7XHJcbiAgICAgICAgdGhpcy5fY2VsbFNpemUgPSA8bnVtYmVyPigodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpID8gKG5ld1NpemUgKiAyKSA6IG5ld1NpemUpO1xyXG4gICAgICAgIHRoaXMuX2NlbGxzRGVmYXVsdFZhbCA9IGZpZWxkLmdldENlbGxEZWZ1YWx0VmFsdWUoKTtcclxuICAgICAgICB0aGlzLl9jZWxsc0lzTnVsbERlZmF1bHQgPSBmaWVsZC5pc051bGxEZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5fYWxsb3dOdWxsID0gZmllbGQuTnVsbEFsbG93ZWQ7XHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxmbGF0RGF0YSA9IHRoaXMudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFZlY3RvclR5cGUuYWRqdXN0VG9GaXQgdmVjdG9yIGJhc2ljIHR5cGVzIGRvZXMgbm90IGFncmVlXCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiAgVmVjdG9yVHlwZS5hZGp1c3RUb0ZpdCBcIiArIGZpZWxkLmdldE5hbWUoKSArIFwiIGlzIG5vdCBvZiB0eXBlIHZlY3RvclwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGUgdGhlIHZlYyBzaXplIGluIHRoZSBoZWFkZXJzIGJ1ZlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgbmV3IHNpemU8L3BhcmFtPlxyXG4gIHByaXZhdGUgYnVpbGRIZWFkZXJzU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzOiBzdHJpbmcgPSBWZWN0b3JUeXBlLkJMT0JfVEFCTEVfU1RSICsgVmVjdG9yVHlwZS5WRUNUT1JfU1RSICsgXCIsXCIgKyBWZWN0b3JUeXBlLlZFUlNJT04gKyBcIixcIiArIDEgKyBcIixcIiArIDxzdHJpbmc+dGhpcy5fY2VsbHNBdHRyICsgXCIsXCI7XHJcbiAgICByZXMgPSByZXMgKyB0aGlzLl9jZWxsU2l6ZSArIFwiLFwiO1xyXG5cclxuICAgIC8vIGFwcGVuZCB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgbGV0IGRlZjogc3RyaW5nID0gXCJcIjtcclxuICAgIGlmICh0aGlzLl9jZWxsc0RlZmF1bHRWYWwgIT09IG51bGwpXHJcbiAgICAgIGlmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSlcclxuICAgICAgICBkZWYgPSBSZWNvcmRVdGlscy5ieXRlU3RyZWFtVG9TdHJpbmcodGhpcy5fY2VsbHNEZWZhdWx0VmFsKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGRlZiA9IHRoaXMuX2NlbGxzRGVmYXVsdFZhbDtcclxuXHJcbiAgICAvLyBpbiBzdHJpbmcgd2UgZG8gbm90IGtlZXAgdGhlIGZ1bGwgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW4gYnJ3b3NlciBjbGllbnRcclxuICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmICh0aGlzLl9jZWxsc0F0dHIgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLk1FTU8pKVxyXG4gICAgICBkZWYgPSBkZWYgKyB0aGlzLmdldEVtcHR5U3RyaW5nKHRoaXMuX2NlbGxTaXplIC0gPG51bWJlcj5VdGlsU3RyQnl0ZU1vZGUubGVuQihkZWYpKTtcclxuICAgIGVsc2VcclxuICAgICAgZGVmID0gZGVmICsgdGhpcy5nZXRFbXB0eVN0cmluZyh0aGlzLl9jZWxsU2l6ZSAtIDxudW1iZXI+ZGVmLmxlbmd0aCk7XHJcblxyXG4gICAgLy8gY29udGludWUgYnVpbGRpbmcgdGhlIGhlYWRlcnNcclxuICAgIHJlcyA9IHJlcyArIGRlZiArIFwiLFwiICsgKHRoaXMuX2NlbGxzSXNOdWxsRGVmYXVsdCA/IFwiMVwiIDogXCIwXCIpICsgXCIsXCI7XHJcbiAgICByZXMgPSByZXMgKyAodGhpcy5fYWxsb3dOdWxsID8gXCIxXCIgOiBcIjBcIikgKyBcIixcIiArIHRoaXMuX2NlbGxTaXplICsgXCIsXCIgKyB0aGlzLl9jZWxscy5sZW5ndGggKyBcIixcIjtcclxuICAgIHJlcyA9IHJlcyArICgodGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgfHwgdGhpcy5fY2VsbHNBdHRyID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSA/IFwiMVwiIDogXCIwXCIpICsgXCIsXCI7XHJcblxyXG4gICAgaWYgKHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CIHx8IHRoaXMuX2NlbGxzQXR0ciA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgcmVzID0gcmVzICsgXCIwLFwiO1xyXG5cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLyByZXR1cm5zIGEgc3RyaW5nIHdpdGggc2l6ZSBudWxsIGNoYXJlY3RlcnNcclxuICBwcml2YXRlIGdldE51bGxTdHJpbmcoc2l6ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCByZXM6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNpemU7IGkgPSBpICsgMSlcclxuICAgICAgcmVzLkFwcGVuZCgnXFwwJyk7XHJcbiAgICByZXR1cm4gcmVzLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLyByZXR1cm5zIGEgc3RyaW5nIHdpdGggc2l6ZSBibGFuayBjaGFyZWN0ZXJzXHJcbiAgcHJpdmF0ZSBnZXRFbXB0eVN0cmluZyhzaXplOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlczogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc2l6ZTsgaSA9IGkgKyAxKVxyXG4gICAgICByZXMuQXBwZW5kKCcgJyk7XHJcbiAgICByZXR1cm4gcmVzLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ29lcyBvdmVyIHRoZSBjZWxscyBvZiB0aGUgdmVjdG9ycyBhbmQgYnVpbGRzIHRoZSBkYXRhIGJ1ZiBvZiBibG9icyBzaW5jZSBpdCBpcyB0aGUgb25seSB0aGluZyBub3RcclxuICAvLy8gICB1cGRhdGVkIGR5bmFtaWNhbGx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldEJsb2JzQnVmKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVzOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9jZWxscy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICBsZXQgZGF0YTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgbGV0IGJsb2JTaXplOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgY3VycjogQ2VsbEVsZW1lbnQgPSB0aGlzLl9jZWxscy5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgIGlmIChjdXJyLmRhdGEgIT09IG51bGwpIHtcclxuICAgICAgICBkYXRhID0gY3Vyci5kYXRhO1xyXG4gICAgICAgIGJsb2JTaXplID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlcy5BcHBlbmQoYmxvYlNpemUpO1xyXG4gICAgICByZXMuQXBwZW5kKFwiLFwiICsgY3Vyci5ibG9iRmllbGRQcmVmaXggKyBcIixcIiArIGRhdGEgKyBcIjtcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKHJlcyArIFwiLFwiKTtcclxuICB9XHJcblxyXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAvKiBzdGF0aWMgdXRpbGl0eSBtZXRob2RzICovXHJcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlcyB0aGUgY2VsbCBhdHRyaWJ1dGUgb2YgdGhlIHZlY3RvclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJibG9iXCI+YSB2ZWN0b3IgaW4gYSBmbGF0dGVuZWQgZm9ybWF0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGF0dCB0aGUgdGhlIHZlY3RvcidzIGNlbGxzIGF0dHJpYnV0ZTwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0Q2VsbHNBdHRyKGJsb2I6IHN0cmluZyk6IFN0b3JhZ2VBdHRyaWJ1dGUge1xyXG4gICAgaWYgKFZlY3RvclR5cGUudmFsaWRhdGVCbG9iQ29udGVudHMoYmxvYikpIHtcclxuICAgICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGJsb2Iuc3Vic3RyKEJsb2JUeXBlLmJsb2JQcmVmaXhMZW5ndGgoYmxvYikpLCBcIixcIik7XHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBNR0JUTUdWRUNcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIHZlcnNpb25cclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIENvbHVtbnNDb3VudF9cclxuXHJcbiAgICAgIC8vIHRoZSBuZXh0IHRva2VuIGlzIHRoZSBjZWxscyBhdHRyaWJ1dGVcclxuICAgICAgcmV0dXJuIDxTdG9yYWdlQXR0cmlidXRlPnRva2Vuc1szXS5jaGFyQXQoMCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIHN0YXRpYyBnZXRDZWxsc0F0dHIgdGhlIGJsb2IgaXMgaW4gdGhlIHdyb25nIGZvcm1hdFwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZXMgdGhlIHNpemUgb2YgZWFjaCBjZWxsIGluIHRoZSB2ZWN0b3IgYWxsIGNlbGwgaGFzIHRoZSBzYW1lIHNpemUgZXhjZXB0IHdoZW4gdGhlIHZlY3RvciBjZWxscyBhcmVcclxuICAvLy8gICBvZiB0eXBlIGJsb2Igb3IgdmVjdG9yXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJsb2JcIj5hIHZlY3RvciBpbiBhIGZsYXR0ZW5lZCBmb3JtYXQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGNlbGxzIHNpemUgb3IgLTEgaWYgdGhlcmUgaXMgZW5jb2RpbmcgcHJvYmxlbTwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0Q2VsbFNpemUoYmxvYjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBjZWxsc1R5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBWZWN0b3JUeXBlLmdldENlbGxzQXR0cihibG9iKTtcclxuICAgIGlmIChjZWxsc1R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiAmJiBjZWxsc1R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGJsb2Iuc3Vic3RyKEJsb2JUeXBlLmJsb2JQcmVmaXhMZW5ndGgoYmxvYikpLCBcIixcIik7XHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBNR0JUTUdWRUNcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIHZlcnNpb25cclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIENvbHVtbnNDb3VudF9cclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIGNlbGxzIHR5cGVcclxuXHJcbiAgICAgIC8vIHRoZSBuZXh0IGVsZW1lbnQgaXMgdGhlIGNlbGxzIHNpemVcclxuICAgICAgcmV0dXJuIE5OdW1iZXIuUGFyc2UodG9rZW5zWzRdKTtcclxuICAgIH1cclxuICAgIGVsc2UgeyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5cclxuICAgICAgcmV0dXJuIDIxNDc0ODM2NDc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2VzIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYmxvYlwiPmEgdmVjdG9yIGluIGEgZmxhdHRlbmVkIGZvcm1hdDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXRWZWNTaXplKGJsb2I6IHN0cmluZyk6IG51bWJlciB7XHJcblxyXG4gICAgaWYgKFZlY3RvclR5cGUudmFsaWRhdGVCbG9iQ29udGVudHMoYmxvYikpIHtcclxuICAgICAgbGV0IHBvczogbnVtYmVyID0gQmxvYlR5cGUuYmxvYlByZWZpeExlbmd0aChibG9iKTtcclxuICAgICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGJsb2Iuc3Vic3RyKHBvcyksIFwiLFwiKTtcclxuXHJcbiAgICAgIC8vIHNraXAgdGhlIE1HQlRNR1ZFQ1xyXG4gICAgICBwb3MgPSBwb3MgKyAodG9rZW5zWzBdLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgdmVyc2lvblxyXG4gICAgICBwb3MgPSBwb3MgKyAodG9rZW5zWzFdLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgQ29sdW1uc0NvdW50X1xyXG4gICAgICBwb3MgPSBwb3MgKyAodG9rZW5zWzJdLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgY2VsbHMgdHlwZVxyXG4gICAgICBwb3MgPSBwb3MgKyAodG9rZW5zWzNdLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgLy8gc2tpcCB0aGUgY2VsbHMgc2l6ZVxyXG4gICAgICBsZXQgY2VsbHNTaXplOiBzdHJpbmcgPSB0b2tlbnNbNF07XHJcbiAgICAgIHBvcyA9IHBvcyArIChjZWxsc1NpemUubGVuZ3RoICsgMSk7XHJcblxyXG4gICAgICAvLyBza2lwIHRoZSBjZWxsIGRlZmF1bHQgdmFsdWUgYW5kIHJlLWluaXQgdGhlIHRva2VuaXplclxyXG4gICAgICAvLyBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBtYXkgY29udGFpbiB0aGUgZGVsaW1ldGVyIGNoYXJlY3RlciBhcyBkYXRhXHJcbiAgICAgIHBvcyA9IHBvcyArIChOTnVtYmVyLlBhcnNlKGNlbGxzU2l6ZSkgKyAxKTtcclxuICAgICAgdG9rZW5zID0gU3RyVXRpbC50b2tlbml6ZShibG9iLnN1YnN0cihwb3MpLCBcIixcIik7XHJcblxyXG4gICAgICAvLyBza2lwIGlzIGNlbGwgbnVsbCBkZWZhdWx0XHJcblxyXG4gICAgICAvLyBza2lwIGlzIG51bGwgYWxsb3dlZFxyXG5cclxuICAgICAgLy8gc2tpcCBjb2x1bW5zIHRvdGFsIGxlbmd0aFxyXG5cclxuICAgICAgLy8gdGhlIG5leHQgZWxlbWVudCBpcyB0aGUgdmVjdG9yIHNpemVcclxuICAgICAgcmV0dXJuIE5OdW1iZXIuUGFyc2UodG9rZW5zWzNdKTtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIHN0YXRpYyBnZXRWZWNTaXplIHRoZSBibG9iIGlzIGluIHRoZSB3cm9uZyBmb3JtYXRcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgZmxhdERhdGEgY29udGVudCB3YXMgdHJhbnNsYXRlZCB0byB1bmljb2RlIG9yIG5vdC4gZmxhdERhdGEgY29udGFpbnMgdGhlIHZlY3RvcidzIGNlbGxzIGluIGZsYXRcclxuICAvLy8gICAobm9uLWFycmF5KSBmb3JtYXQuIFRoaXMgaXMgaG93IHRoZSBzZXJ2ZXIgc2VuZHMgdXMgdGhlIGRhdGEuIEhvd2V2ZXIgdGhlIHNlcnZlciBkb2VzIG5vdCBzZW5kIGl0IHRvIHVzXHJcbiAgLy8vICAgaW4gYSBVTklDT0RFIGZvcm1hdC4gVGh1cyB3ZSB0cmFuc2xhdGUgaXQgdG8gdW5pY29kZSBkdXJpbmcgdGhlIGZpcnN0IHRpbWUgd2UgXCJkZS1zZXJpYWxpemVcIiB0aGVcclxuICAvLy8gICBmbGF0LWRhdGEgaW50byBhIHZlY3Rvci4gRHVyaW5nIHRoZSBkZS1zZXJpYWxpemF0aW9uIG9wZXJhdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHRpbWUgd2UgXCJkZS1zZXJpYWxpemVcIlxyXG4gIC8vLyAgIHRoZSBmbGF0LWRhdGEgaW50byBhIHZlY3Rvci4gRHVyaW5nIHRoZSBkZS1zZXJpYWxpemF0aW9uIG9wZXJhdGlvbiB3ZSBtb2RpZnkgdGhlIEJMT0ItVEFCTGUgZXllIGNhdGNoZXJcclxuICAvLy8gICBmcm9tIHVwcGVyIGNhc2UgdG8gbG93ZXIgY2FzZSwgdGhpcyB3YXkgd2Uga25vdyBpZiBhIHRyYW5zbGF0aW9uIHdhcyBkb25lIG9yIGlzIG5lZWRlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmFtZVwiPmZsYXREYXRhIFRoZSB2ZWN0b3IncyBmbGF0IGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gVFJVRSBpZiB0aGUgZmxhdCBkYXRhIGlzIGFscmVhZHkgaW4gdW5pY29kZSBmb3JtYXQ8L3JldHVybnM+XHJcbiAgaXNVbmljb2RlKGZsYXREYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBzdGFydDogbnVtYmVyID0gQmxvYlR5cGUuYmxvYlByZWZpeExlbmd0aChmbGF0RGF0YSk7XHJcbiAgICBsZXQgY2F0Y2hlcjogc3RyaW5nID0gZmxhdERhdGEuc3Vic3RyKHN0YXJ0LCBWZWN0b3JUeXBlLkJMT0JfVEFCTEVfU1RSX0xFTik7XHJcbiAgICByZXR1cm4gKGNhdGNoZXIgPT09IFZlY3RvclR5cGUuQkxPQl9UQUJMRV9TVFIpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB0aGlzIGlubmVyIGNsYXNzIHJlcHJlc2VudHMgYSBjZWxsIGluIHRoZSBtYWdpYyB2ZWN0b3IgZWFjaCBkYXRhIHRoYXQgdGhlIG1hZ2ljIHZlY3RvciBrZWVwcyBwZXIgY2VsbFxyXG4vLy8gICB3aWxsIGJlIGtlcHQgaW4gdGhlIENlbGxFbGVtZW50XHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBDZWxsRWxlbWVudCB7XHJcbiAgYmxvYkZpZWxkUHJlZml4OiBzdHJpbmcgPSBudWxsO1xyXG4gIGRhdGE6IHN0cmluZyA9IG51bGw7XHJcbiAgaXNOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIGFsbCB0aGlzIHZhcmlhYmxlcyBhcmUgdXNlZCBvbmx5IGlmIHRoZSB2ZWN0b3IgY2VsbCBpcyBvZiB0eXBlIHZlY3RvciBvciBibG9iXHJcblxyXG4gIGNvbnN0cnVjdG9yKHZhbDogc3RyaW5nLCBpc19udWxsOiBib29sZWFuKTtcclxuICBjb25zdHJ1Y3Rvcih2YWw6IHN0cmluZywgaXNfbnVsbDogYm9vbGVhbiwgY3RybERhdGE6IHN0cmluZyk7XHJcbiAgY29uc3RydWN0b3IodmFsOiBzdHJpbmcsIGlzX251bGw6IGJvb2xlYW4sIGN0cmxEYXRhPzogc3RyaW5nKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMilcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKHZhbCwgaXNfbnVsbCk7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEodmFsLCBpc19udWxsLCBjdHJsRGF0YSk7XHJcbiAgfVxyXG5cclxuICAvLyBjb25zdHJ1Y3RzIGEgbmV3IGNlbGwgZWxlbWVudCBmb3IgdmVjdG9ycyB3aG9zIGNlbGxzIGFyZSBub3Qgb2YgdHlwZSBibG9iIG9yIHZlY3RvclxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCh2YWw6IHN0cmluZywgaXNfbnVsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhID0gdmFsO1xyXG4gICAgdGhpcy5pc051bGwgPSBpc19udWxsO1xyXG4gIH1cclxuXHJcbiAgLy8gY29uc3RydWN0cyBhIG5ldyBjZWxsIGVsZW1lbnQgZm9yIHZlY3RvcnMgd2hvcyBjZWxscyBhcmUgb2YgdHlwZSBibG9iIG9yIHZlY3RvclxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMSh2YWw6IHN0cmluZywgaXNfbnVsbDogYm9vbGVhbiwgY3RybERhdGE6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhID0gdmFsO1xyXG4gICAgdGhpcy5pc051bGwgPSBpc19udWxsO1xyXG4gICAgdGhpcy5ibG9iRmllbGRQcmVmaXggPSBjdHJsRGF0YTtcclxuICB9XHJcbn1cclxuIl19
|