@magic-xpa/gui 4.1200.0-dev4120.8 → 4.1200.0-dev4120.83
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,1362 +0,0 @@
|
|
|
1
|
-
import { ApplicationException, Debug, Int32, List, NNumber, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
|
|
2
|
-
import { Constants, Logger_LogLevels, MgControlType, StorageAttribute, StrUtil, UtilImeJpn, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
|
3
|
-
import { TaskDefinitionIdTableSaxHandler } from '../tasks/TaskDefinitionIdTableSaxHandler';
|
|
4
|
-
import { PIC } from './PIC';
|
|
5
|
-
import { Events } from '../../Events';
|
|
6
|
-
import { GuiConstants } from '../../GuiConstants';
|
|
7
|
-
import { PropInterface } from './PropInterface';
|
|
8
|
-
import { GuiControlPropertyAdapter } from './GuiControlPropertyAdapter';
|
|
9
|
-
import { DisplayConvertor } from './DisplayConvertor';
|
|
10
|
-
import { Commands } from '../../Commands';
|
|
11
|
-
import { CommandType, HtmlProperties } from '../../GuiEnums';
|
|
12
|
-
import { PropDefaults } from './PropDefaults';
|
|
13
|
-
export class CustomValidatorProp {
|
|
14
|
-
_exp;
|
|
15
|
-
_errorMessageExp;
|
|
16
|
-
_errorMessage;
|
|
17
|
-
}
|
|
18
|
-
;
|
|
19
|
-
export class CustomValidator {
|
|
20
|
-
_valid;
|
|
21
|
-
_errorMessage;
|
|
22
|
-
constructor(valid, errMessage) {
|
|
23
|
-
this._valid = valid;
|
|
24
|
-
this._errorMessage = errMessage;
|
|
25
|
-
}
|
|
26
|
-
isValid() { return this._valid; }
|
|
27
|
-
getErrMessage() { return this._errorMessage; }
|
|
28
|
-
}
|
|
29
|
-
export class Property {
|
|
30
|
-
_id = Int32.MinValue;
|
|
31
|
-
_dataType = StorageAttribute.NONE;
|
|
32
|
-
_val = null;
|
|
33
|
-
_pic = null;
|
|
34
|
-
_expId = 0;
|
|
35
|
-
_parentObj = null;
|
|
36
|
-
_parentType = null;
|
|
37
|
-
_prevValues = null;
|
|
38
|
-
_orgValue = null;
|
|
39
|
-
static _numericPropertyPic = null;
|
|
40
|
-
_taskDefinitionId = null;
|
|
41
|
-
StudioValue = null;
|
|
42
|
-
_expAlreadyComputedOnce = false;
|
|
43
|
-
customProperties = new Map();
|
|
44
|
-
customPropertiesValues = new Map();
|
|
45
|
-
customValidatorProperties = new Map();
|
|
46
|
-
customValidatorValues = new Map();
|
|
47
|
-
static UtilImeJpn = (UtilStrByteMode.isLocaleDefLangJPN() ? new UtilImeJpn() : null);
|
|
48
|
-
get TaskDefinitionId() {
|
|
49
|
-
return this._taskDefinitionId;
|
|
50
|
-
}
|
|
51
|
-
constructor(cId, cParentObj, parType, val) {
|
|
52
|
-
if (arguments.length === 0)
|
|
53
|
-
this.constructor_0();
|
|
54
|
-
else if (arguments.length === 3)
|
|
55
|
-
this.constructor_1(cId, cParentObj, parType);
|
|
56
|
-
else
|
|
57
|
-
this.constructor_2(cId, cParentObj, parType, val);
|
|
58
|
-
}
|
|
59
|
-
constructor_0() {
|
|
60
|
-
this._prevValues = new List();
|
|
61
|
-
}
|
|
62
|
-
constructor_1(cId, cParentObj, parType) {
|
|
63
|
-
this.constructor_0();
|
|
64
|
-
this.setId(cId);
|
|
65
|
-
this._parentObj = cParentObj;
|
|
66
|
-
this._parentType = parType;
|
|
67
|
-
this.setDataType();
|
|
68
|
-
}
|
|
69
|
-
constructor_2(cId, cParentObj, parType, val) {
|
|
70
|
-
this.constructor_1(cId, cParentObj, parType);
|
|
71
|
-
this.setValue(val);
|
|
72
|
-
this.setOrgValue();
|
|
73
|
-
}
|
|
74
|
-
setId(cId) {
|
|
75
|
-
this._id = cId;
|
|
76
|
-
}
|
|
77
|
-
fillData(parentRef, parType, parser) {
|
|
78
|
-
let endContext = parser.getXMLdata().indexOf(">", parser.getCurrIndex());
|
|
79
|
-
if (this._parentObj === null && parentRef !== null) {
|
|
80
|
-
this._parentObj = parentRef;
|
|
81
|
-
this._parentType = parType;
|
|
82
|
-
}
|
|
83
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
84
|
-
let tag = parser.getXMLsubstring(endContext);
|
|
85
|
-
parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_PROP) + XMLConstants.MG_TAG_PROP.length);
|
|
86
|
-
let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
87
|
-
if (Events.ShouldLog(Logger_LogLevels.Development)) {
|
|
88
|
-
Events.WriteDevToLog(NString.Format("In Prop.FillData(): {0}", tokensVector.toString()));
|
|
89
|
-
}
|
|
90
|
-
this.initElements(tokensVector);
|
|
91
|
-
parser.setCurrIndex(endContext + XMLConstants.TAG_CLOSE.length);
|
|
92
|
-
this.InitInnerObjects(parser);
|
|
93
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
94
|
-
this.setControlAttributes();
|
|
95
|
-
else if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
|
|
96
|
-
this._prevValues.SetSize(1);
|
|
97
|
-
}
|
|
98
|
-
else
|
|
99
|
-
Events.WriteExceptionToLog("In Property.FillData(): Out of string bounds");
|
|
100
|
-
}
|
|
101
|
-
InitInnerObjects(xmlParser) {
|
|
102
|
-
let nextTag = xmlParser.getNextTag();
|
|
103
|
-
if (nextTag === XMLConstants.MG_TAG_TASKDEFINITIONID_ENTRY) {
|
|
104
|
-
let xmlBuffer = xmlParser.ReadToEndOfCurrentElement();
|
|
105
|
-
this.InitTaskDefinitionId(xmlBuffer);
|
|
106
|
-
let endContext = xmlParser.getXMLdata().indexOf(XMLConstants.MG_TAG_PROP + XMLConstants.TAG_CLOSE, xmlParser.getCurrIndex());
|
|
107
|
-
xmlParser.setCurrIndex(endContext + (XMLConstants.MG_TAG_PROP + XMLConstants.TAG_CLOSE).length);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
initElements(tokensVector) {
|
|
111
|
-
for (let j = 0; j < tokensVector.length; j += 2) {
|
|
112
|
-
let attribute = (tokensVector.get_Item(j));
|
|
113
|
-
let valueStr = (tokensVector.get_Item(j + 1));
|
|
114
|
-
switch (attribute) {
|
|
115
|
-
case XMLConstants.MG_ATTR_ID:
|
|
116
|
-
this.setId(XmlParser.getInt(valueStr));
|
|
117
|
-
this.setDataType();
|
|
118
|
-
break;
|
|
119
|
-
case XMLConstants.MG_ATTR_STUDIO_VALUE:
|
|
120
|
-
this.StudioValue = XmlParser.unescape(valueStr);
|
|
121
|
-
break;
|
|
122
|
-
case XMLConstants.MG_ATTR_VALUE:
|
|
123
|
-
if (this._id === PropInterface.PROP_TYPE_CUSTOM_PROPERTIES) {
|
|
124
|
-
this.InitCustomProperties(XmlParser.unescape(valueStr));
|
|
125
|
-
}
|
|
126
|
-
if (this._id === PropInterface.PROP_TYPE_CUSTOM_VALIDATORS) {
|
|
127
|
-
this.InitCustomValidationProperties(XmlParser.unescape(valueStr));
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
this._val = XmlParser.unescape(valueStr);
|
|
131
|
-
this._orgValue = this._val;
|
|
132
|
-
}
|
|
133
|
-
break;
|
|
134
|
-
case XMLConstants.MG_ATTR_EXP:
|
|
135
|
-
this._expId = XmlParser.getInt(valueStr);
|
|
136
|
-
if (this._expId > 0 && this._id === PropInterface.PROP_TYPE_TOOLTIP)
|
|
137
|
-
this.setDataType();
|
|
138
|
-
break;
|
|
139
|
-
case XMLConstants.MG_ATTR_NAME:
|
|
140
|
-
break;
|
|
141
|
-
case XMLConstants.MG_ATTR_CTL_IDX:
|
|
142
|
-
this._taskDefinitionId.CtlIndex = XmlParser.getInt(valueStr);
|
|
143
|
-
break;
|
|
144
|
-
case XMLConstants.MG_ATTR_PROGRAM_ISN:
|
|
145
|
-
this._taskDefinitionId.ProgramIsn = XmlParser.getInt(valueStr);
|
|
146
|
-
break;
|
|
147
|
-
default:
|
|
148
|
-
Events.WriteExceptionToLog(NString.Format("There is no such tag in Property class. Insert case to Property.initElements for {0}", attribute));
|
|
149
|
-
break;
|
|
150
|
-
}
|
|
151
|
-
if (this.IsComputedOnceOnServer())
|
|
152
|
-
this._expAlreadyComputedOnce = true;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
InitCustomProperties(customProprtiesStr) {
|
|
156
|
-
this.customProperties = new Map(JSON.parse(customProprtiesStr));
|
|
157
|
-
if (this._parentObj.IsFirstRefreshOfProps())
|
|
158
|
-
this.SetFirstValueForCustomProperties();
|
|
159
|
-
}
|
|
160
|
-
InitCustomValidator(parser) {
|
|
161
|
-
let text = parser.ReadToEndOfCurrentElement();
|
|
162
|
-
text = text.substr(text.indexOf(XMLConstants.MG_TAG_CUSTOM_VALIDATOR) + XMLConstants.MG_TAG_CUSTOM_VALIDATOR.length);
|
|
163
|
-
let tokens = XmlParser.getTokens(text, XMLConstants.XML_ATTR_DELIM);
|
|
164
|
-
let c = new CustomValidatorProp();
|
|
165
|
-
let key;
|
|
166
|
-
for (let j = 0; j < tokens.length; j += 2) {
|
|
167
|
-
let attribute = tokens.get_Item(j);
|
|
168
|
-
let valueStr = tokens.get_Item(j + 1);
|
|
169
|
-
switch (attribute) {
|
|
170
|
-
case XMLConstants.MG_ATTR_EXP:
|
|
171
|
-
c._exp = XmlParser.getInt(valueStr);
|
|
172
|
-
break;
|
|
173
|
-
case XMLConstants.MG_ATTR_NAME:
|
|
174
|
-
key = XmlParser.unescape(valueStr);
|
|
175
|
-
break;
|
|
176
|
-
case XMLConstants.MG_ATTR_ERROR_EXP:
|
|
177
|
-
c._errorMessageExp = XmlParser.getInt(valueStr);
|
|
178
|
-
break;
|
|
179
|
-
case XMLConstants.MG_ATTR_ERROR:
|
|
180
|
-
c._errorMessage = XmlParser.unescape(valueStr);
|
|
181
|
-
break;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
this.customValidatorProperties.set(key, c);
|
|
185
|
-
}
|
|
186
|
-
InitCustomValidationProperties(customProprtiesStr) {
|
|
187
|
-
let parser = new XmlParser(customProprtiesStr);
|
|
188
|
-
let currTagName = parser.getNextTag();
|
|
189
|
-
while (currTagName != null) {
|
|
190
|
-
switch (currTagName) {
|
|
191
|
-
case XMLConstants.MG_TAG_CUSTOM_VALIDATORS:
|
|
192
|
-
parser.setCurrIndex2EndOfTag();
|
|
193
|
-
this.customValidatorProperties = new Map();
|
|
194
|
-
break;
|
|
195
|
-
case XMLConstants.MG_TAG_CUSTOM_VALIDATOR:
|
|
196
|
-
this.InitCustomValidator(parser);
|
|
197
|
-
break;
|
|
198
|
-
default:
|
|
199
|
-
parser.setCurrIndex2EndOfTag();
|
|
200
|
-
break;
|
|
201
|
-
}
|
|
202
|
-
currTagName = parser.getNextTag();
|
|
203
|
-
}
|
|
204
|
-
if (this._parentObj.IsFirstRefreshOfProps())
|
|
205
|
-
this.SetFirstValueForCustomValidationProperties();
|
|
206
|
-
}
|
|
207
|
-
SetFirstValueForCustomValidationProperties() {
|
|
208
|
-
for (let customProperty of this.customValidatorProperties.keys()) {
|
|
209
|
-
this.customValidatorValues.set(customProperty, new CustomValidator(true, ""));
|
|
210
|
-
}
|
|
211
|
-
this._val = this.GetArrayValuesForCustomValidationProperties();
|
|
212
|
-
this._orgValue = this._val;
|
|
213
|
-
}
|
|
214
|
-
GetArrayValuesForCustomValidationProperties() {
|
|
215
|
-
let values = Array.from(this.customValidatorValues.values());
|
|
216
|
-
let valuesStr = JSON.stringify(values);
|
|
217
|
-
return valuesStr;
|
|
218
|
-
}
|
|
219
|
-
GetArrayValuesForCustomProperties() {
|
|
220
|
-
let values = Array.from(this.customPropertiesValues.values());
|
|
221
|
-
let valuesStr = JSON.stringify(values);
|
|
222
|
-
return valuesStr;
|
|
223
|
-
}
|
|
224
|
-
SetFirstValueForCustomProperties() {
|
|
225
|
-
for (let customProperty of this.customProperties.keys())
|
|
226
|
-
this.customPropertiesValues.set(customProperty, "");
|
|
227
|
-
this._val = this.GetArrayValuesForCustomProperties();
|
|
228
|
-
this._orgValue = this._val;
|
|
229
|
-
}
|
|
230
|
-
InitTaskDefinitionId(xmlBuffer) {
|
|
231
|
-
let taskDefinitionIdTableSaxHandler = new TaskDefinitionIdTableSaxHandler(this.SetTaskDefinitionId);
|
|
232
|
-
taskDefinitionIdTableSaxHandler.parse(xmlBuffer);
|
|
233
|
-
}
|
|
234
|
-
SetTaskDefinitionId(taskDefinitionId) {
|
|
235
|
-
this._taskDefinitionId = taskDefinitionId;
|
|
236
|
-
}
|
|
237
|
-
setDataType() {
|
|
238
|
-
let compIdx = this._parentObj.getCompIdx();
|
|
239
|
-
this._pic = null;
|
|
240
|
-
if (this._id === Int32.MinValue) {
|
|
241
|
-
Events.WriteExceptionToLog(NString.Format("To fill dataType member in Property.FillDataType must id!={0}", Int32.MinValue));
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
switch (this._id) {
|
|
245
|
-
case PropInterface.PROP_TYPE_TITLE_BAR:
|
|
246
|
-
case PropInterface.PROP_TYPE_DISPLAY_MENU:
|
|
247
|
-
case PropInterface.PROP_TYPE_BORDER:
|
|
248
|
-
case PropInterface.PROP_TYPE_HEBREW:
|
|
249
|
-
case PropInterface.PROP_TYPE_MODIFY_IN_QUERY:
|
|
250
|
-
case PropInterface.PROP_TYPE_SYSTEM_MENU:
|
|
251
|
-
case PropInterface.PROP_TYPE_END_CONDITION:
|
|
252
|
-
case PropInterface.PROP_TYPE_SELECTION:
|
|
253
|
-
case PropInterface.PROP_TYPE_ALLOW_MODIFY:
|
|
254
|
-
case PropInterface.PROP_TYPE_ALLOW_CREATE:
|
|
255
|
-
case PropInterface.PROP_TYPE_ALLOW_DELETE:
|
|
256
|
-
case PropInterface.PROP_TYPE_ALLOW_QUERY:
|
|
257
|
-
case PropInterface.PROP_TYPE_ALLOW_RANGE:
|
|
258
|
-
case PropInterface.PROP_TYPE_ALLOW_LOCATE:
|
|
259
|
-
case PropInterface.PROP_TYPE_ALLOW_SORT:
|
|
260
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX:
|
|
261
|
-
case PropInterface.PROP_TYPE_ALLOW_LOCATE_IN_QUERY:
|
|
262
|
-
case PropInterface.PROP_TYPE_CONFIRM_UPDATE:
|
|
263
|
-
case PropInterface.PROP_TYPE_FORCE_SUFFIX:
|
|
264
|
-
case PropInterface.PROP_TYPE_FORCE_DELETE:
|
|
265
|
-
case PropInterface.PROP_TYPE_MUST_INPUT:
|
|
266
|
-
case PropInterface.PROP_TYPE_MODIFIABLE:
|
|
267
|
-
case PropInterface.PROP_TYPE_VISIBLE:
|
|
268
|
-
case PropInterface.PROP_TYPE_ENABLED:
|
|
269
|
-
case PropInterface.PROP_TYPE_CONFIRM_CANCEL:
|
|
270
|
-
case PropInterface.PROP_TYPE_REPEATABLE:
|
|
271
|
-
case PropInterface.PROP_TYPE_HIGHLIGHTING:
|
|
272
|
-
case PropInterface.PROP_TYPE_PASSWORD:
|
|
273
|
-
case PropInterface.PROP_TYPE_MULTILINE:
|
|
274
|
-
case PropInterface.PROP_TYPE_IS_CACHED:
|
|
275
|
-
case PropInterface.PROP_TYPE_PRELOAD_VIEW:
|
|
276
|
-
case PropInterface.PROP_TYPE_MULTILINE_VERTICAL_SCROLL:
|
|
277
|
-
case PropInterface.PROP_TYPE_MULTILINE_ALLOW_CR:
|
|
278
|
-
case PropInterface.PROP_TYPE_ALLOW_COL_RESIZE:
|
|
279
|
-
case PropInterface.PROP_TYPE_ALLOW_REORDER:
|
|
280
|
-
case PropInterface.PROP_TYPE_SHOW_LINES:
|
|
281
|
-
case PropInterface.PROP_TYPE_SORT_COLUMN:
|
|
282
|
-
case PropInterface.PROP_TYPE_COL_ALLOW_FILTERING:
|
|
283
|
-
case PropInterface.PROP_TYPE_DISPLAY_STATUS_BAR:
|
|
284
|
-
case PropInterface.PROP_TYPE_AUTO_REFRESH:
|
|
285
|
-
case PropInterface.PROP_TYPE_PARK_ON_CLICK:
|
|
286
|
-
case PropInterface.PROP_TYPE_SHOW_FULL_ROW:
|
|
287
|
-
case PropInterface.PROP_TYPE_TRACK_SELECTION:
|
|
288
|
-
case PropInterface.PROP_TYPE_SHOW_BUTTONS:
|
|
289
|
-
case PropInterface.PROP_TYPE_LINES_AT_ROOT:
|
|
290
|
-
case PropInterface.PROP_TYPE_ALLOW_EMPTY_DATAVIEW:
|
|
291
|
-
case PropInterface.PROP_TYPE_SCROLL_BAR:
|
|
292
|
-
case PropInterface.PROP_TYPE_COLUMN_DIVIDER:
|
|
293
|
-
case PropInterface.PROP_TYPE_LINE_DIVIDER:
|
|
294
|
-
case PropInterface.PROP_TYPE_THREE_STATES:
|
|
295
|
-
case PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN:
|
|
296
|
-
case PropInterface.PROP_TYPE_ALLOW_OPTION:
|
|
297
|
-
case PropInterface.PROP_TYPE_RETAIN_FOCUS:
|
|
298
|
-
case PropInterface.PROP_TYPE_PRINT_DATA:
|
|
299
|
-
case PropInterface.PROP_TYPE_CLOSE_TASKS_BY_MDI_MENU:
|
|
300
|
-
case PropInterface.PROP_TYPE_DATAVIEWCONTROL:
|
|
301
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_OPEN_TASK_WINDOW:
|
|
302
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS:
|
|
303
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_INDEX_OPTIMIZATION:
|
|
304
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE:
|
|
305
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE:
|
|
306
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION:
|
|
307
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_SQL_RANGE:
|
|
308
|
-
case PropInterface.PROP_TYPE_BEFORE_900_VERSION:
|
|
309
|
-
case PropInterface.PROP_TYPE_FILL_WIDTH:
|
|
310
|
-
case PropInterface.PROP_TYPE_MULTI_COLUMN_DISPLAY:
|
|
311
|
-
case PropInterface.PROP_TYPE_IS_ROUTER_OUTLET:
|
|
312
|
-
case PropInterface.PROP_TYPE_DEFAULT_OUTLET:
|
|
313
|
-
case PropInterface.PROP_TYPE_SERVER_READ_AHEAD:
|
|
314
|
-
case PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC:
|
|
315
|
-
this._dataType = StorageAttribute.BOOLEAN;
|
|
316
|
-
break;
|
|
317
|
-
case PropInterface.PROP_TYPE_IMAGE_FILENAME:
|
|
318
|
-
case PropInterface.PROP_TYPE_EVAL_END_CONDITION:
|
|
319
|
-
case PropInterface.PROP_TYPE_FRAME_NAME:
|
|
320
|
-
case PropInterface.PROP_TYPE_NAME:
|
|
321
|
-
case PropInterface.PROP_TYPE_TRASACTION_BEGIN:
|
|
322
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_TRANSACTION_MODE:
|
|
323
|
-
case PropInterface.PROP_TYPE_WALLPAPER:
|
|
324
|
-
case PropInterface.PROP_TYPE_ATTRIBUTE:
|
|
325
|
-
case PropInterface.PROP_TYPE_TRIGGER:
|
|
326
|
-
case PropInterface.PROP_TYPE_SELECT_MODE:
|
|
327
|
-
case PropInterface.PROP_TYPE_TASK_ID:
|
|
328
|
-
case PropInterface.PROP_TYPE_TABBING_CYCLE:
|
|
329
|
-
case PropInterface.PROP_TYPE_PARAMETERS:
|
|
330
|
-
case PropInterface.PROP_TYPE_IMAGE_LIST_INDEXES:
|
|
331
|
-
case PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST:
|
|
332
|
-
case PropInterface.PROP_TYPE_OBJECT_TYPE:
|
|
333
|
-
case PropInterface.PROP_TYPE_REAL_OBJECT_TYPE:
|
|
334
|
-
case PropInterface.PROP_TYPE_DATAVIEWCONTROL_FIELDS:
|
|
335
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE_ORDER:
|
|
336
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE_ORDER:
|
|
337
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION_USAGE:
|
|
338
|
-
case PropInterface.PROP_TYPE_TASK_MODE:
|
|
339
|
-
case PropInterface.PROP_TYPE_CUSTOM_PROPERTIES:
|
|
340
|
-
case PropInterface.PROP_TYPE_CUSTOM_VALIDATORS:
|
|
341
|
-
case PropInterface.PROP_TYPE_PARK_FIRST_ON:
|
|
342
|
-
this._dataType = StorageAttribute.ALPHA;
|
|
343
|
-
break;
|
|
344
|
-
case PropInterface.PROP_TYPE_COLUMN_TITLE:
|
|
345
|
-
case PropInterface.PROP_TYPE_DISPLAY_LIST:
|
|
346
|
-
case PropInterface.PROP_TYPE_LABEL:
|
|
347
|
-
case PropInterface.PROP_TYPE_FORMAT:
|
|
348
|
-
case PropInterface.PROP_TYPE_RANGE:
|
|
349
|
-
case PropInterface.PROP_TYPE_FORM_NAME:
|
|
350
|
-
case PropInterface.PROP_TYPE_ADDITIONAL_INFORMATION:
|
|
351
|
-
case PropInterface.PROP_TYPE_TEXT:
|
|
352
|
-
case PropInterface.PROP_TYPE_HINT:
|
|
353
|
-
this._dataType = StorageAttribute.UNICODE;
|
|
354
|
-
break;
|
|
355
|
-
case PropInterface.PROP_TYPE_UOM:
|
|
356
|
-
case PropInterface.PROP_TYPE_HOR_FAC:
|
|
357
|
-
case PropInterface.PROP_TYPE_VER_FAC:
|
|
358
|
-
case PropInterface.PROP_TYPE_TAB_ORDER:
|
|
359
|
-
case PropInterface.PROP_TYPE_WALLPAPER_STYLE:
|
|
360
|
-
case PropInterface.PROP_TYPE_INDEX:
|
|
361
|
-
case PropInterface.PROP_TYPE_LINK_FIELD:
|
|
362
|
-
case PropInterface.PROP_TYPE_DISPLAY_FIELD:
|
|
363
|
-
case PropInterface.PROP_TYPE_PULLDOWN_MENU:
|
|
364
|
-
case PropInterface.PROP_TYPE_WINDOW_TYPE:
|
|
365
|
-
case PropInterface.PROP_TYPE_IMAGE_STYLE:
|
|
366
|
-
case PropInterface.PROP_TYPE_AUTO_FIT:
|
|
367
|
-
case PropInterface.PROP_TYPE_RAISE_AT:
|
|
368
|
-
case PropInterface.PROP_TYPE_EXPAND_WINDOW:
|
|
369
|
-
case PropInterface.PROP_TYPE_VISIBLE_LINES:
|
|
370
|
-
case PropInterface.PROP_TYPE_CHOICE_COLUMNS:
|
|
371
|
-
case PropInterface.PROP_TYPE_STYLE_3D:
|
|
372
|
-
case PropInterface.PROP_TYPE_FONT:
|
|
373
|
-
case PropInterface.PROP_TYPE_LAYER:
|
|
374
|
-
case PropInterface.PROP_TYPE_WIDTH:
|
|
375
|
-
case PropInterface.PROP_TYPE_TITLE_HEIGHT:
|
|
376
|
-
case PropInterface.PROP_TYPE_COLOR:
|
|
377
|
-
case PropInterface.PROP_TYPE_LEFT:
|
|
378
|
-
case PropInterface.PROP_TYPE_TOP:
|
|
379
|
-
case PropInterface.PROP_TYPE_TOOLTIP:
|
|
380
|
-
case PropInterface.PROP_TYPE_HELP_SCR:
|
|
381
|
-
case PropInterface.PROP_TYPE_LINES_IN_TABLE:
|
|
382
|
-
case PropInterface.PROP_TYPE_SELECTION_ROWS:
|
|
383
|
-
case PropInterface.PROP_TYPE_HORIZONTAL_ALIGNMENT:
|
|
384
|
-
case PropInterface.PROP_TYPE_MULTILINE_WORDWRAP_SCROLL:
|
|
385
|
-
case PropInterface.PROP_TYPE_ROW_HEIGHT:
|
|
386
|
-
case PropInterface.PROP_TYPE_WINDOW_WIDTH:
|
|
387
|
-
case PropInterface.PROP_TYPE_MAIN_DISPLAY:
|
|
388
|
-
case PropInterface.PROP_TYPE_TRANSLATOR:
|
|
389
|
-
case PropInterface.PROP_TYPE_FRAMESET_STYLE:
|
|
390
|
-
case PropInterface.PROP_TYPE_FRAME_TYPE:
|
|
391
|
-
case PropInterface.PROP_TYPE_ALLOWED_DIRECTION:
|
|
392
|
-
case PropInterface.PROP_TYPE_ROW_HIGHLIGHT_STYLE:
|
|
393
|
-
case PropInterface.PROP_TYPE_VERTICAL_ALIGNMENT:
|
|
394
|
-
case PropInterface.PROP_TYPE_TABBING_ORDER:
|
|
395
|
-
case PropInterface.PROP_TYPE_STATIC_TYPE:
|
|
396
|
-
case PropInterface.PROP_TYPE_BUTTON_STYLE:
|
|
397
|
-
case PropInterface.PROP_TYPE_LOAD_IMAGE_FROM:
|
|
398
|
-
case PropInterface.PROP_TYPE_SUBFORM_TYPE:
|
|
399
|
-
case PropInterface.PROP_TYPE_BOTTOM_POSITION_INTERVAL:
|
|
400
|
-
case PropInterface.PROP_TYPE_SELECTION_MODE:
|
|
401
|
-
case PropInterface.PROP_TYPE_PRGTSK_NUM:
|
|
402
|
-
case PropInterface.PROP_TYPE_PERSISTENT_FORM_STATE_VERSION:
|
|
403
|
-
case PropInterface.PROP_TYPE_SCROLL_BAR_THUMB:
|
|
404
|
-
case PropInterface.PROP_TYPE_BINDING_LEVEL:
|
|
405
|
-
case PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL:
|
|
406
|
-
case PropInterface.PROP_TYPE_SELECT_PROGRAM:
|
|
407
|
-
if (this._id === PropInterface.PROP_TYPE_TOOLTIP && this._expId > 0)
|
|
408
|
-
this._dataType = StorageAttribute.UNICODE;
|
|
409
|
-
else {
|
|
410
|
-
this._dataType = StorageAttribute.NUMERIC;
|
|
411
|
-
if (Property._numericPropertyPic == null)
|
|
412
|
-
Property._numericPropertyPic = new PIC("N6", StorageAttribute.NUMERIC, compIdx);
|
|
413
|
-
this._pic = Property._numericPropertyPic;
|
|
414
|
-
}
|
|
415
|
-
break;
|
|
416
|
-
case PropInterface.PROP_TYPE_RETURN_ACTION:
|
|
417
|
-
this._dataType = StorageAttribute.NONE;
|
|
418
|
-
break;
|
|
419
|
-
case PropInterface.PROP_TYPE_DATA:
|
|
420
|
-
this._dataType = this._parentObj.DataType;
|
|
421
|
-
break;
|
|
422
|
-
case PropInterface.PROP_TYPE_POP_UP:
|
|
423
|
-
case PropInterface.PROP_TYPE_ORIENTATION_LOCK:
|
|
424
|
-
case PropInterface.PROP_TYPE_ENTER_ANIMATION:
|
|
425
|
-
case PropInterface.PROP_TYPE_EXIT_ANIMATION:
|
|
426
|
-
case PropInterface.PROP_TYPE_NAVIGATION_DRAWER_MENU:
|
|
427
|
-
case PropInterface.PROP_TYPE_ACTION_BAR_MENU:
|
|
428
|
-
case PropInterface.PROP_TYPE_OPEN_PICKER:
|
|
429
|
-
case PropInterface.PROP_TYPE_OPEN_EDIT_DIALOG:
|
|
430
|
-
case PropInterface.PROP_TYPE_DEFAULT_ALIGNMENT:
|
|
431
|
-
case PropInterface.PROP_TYPE_KEYBOARD_TYPE:
|
|
432
|
-
case PropInterface.PROP_TYPE_KEYBOARD_RETURN_KEY:
|
|
433
|
-
case PropInterface.PROP_TYPE_ALLOW_SUGGESTIONS:
|
|
434
|
-
case PropInterface.PROP_TYPE_MOBILE_IMAGE_LIST_FILE_NAME:
|
|
435
|
-
case PropInterface.PROP_TYPE_SWIPE_REFRESH:
|
|
436
|
-
break;
|
|
437
|
-
default:
|
|
438
|
-
Events.WriteExceptionToLog(NString.Format("in Property.setDataType() no case for: {0}", this._id));
|
|
439
|
-
break;
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
setControlAttributes() {
|
|
443
|
-
if (this._parentObj == null || this._parentType !== GuiConstants.PARENT_TYPE_CONTROL) {
|
|
444
|
-
Events.WriteExceptionToLog("in Property.setControlAttributes() there is no parent or the parent is not a control");
|
|
445
|
-
return;
|
|
446
|
-
}
|
|
447
|
-
let parentControl = this._parentObj;
|
|
448
|
-
switch (this._id) {
|
|
449
|
-
case PropInterface.PROP_TYPE_FRAME_NAME:
|
|
450
|
-
case PropInterface.PROP_TYPE_NAME:
|
|
451
|
-
parentControl.Name = this._val;
|
|
452
|
-
break;
|
|
453
|
-
case PropInterface.PROP_TYPE_ATTRIBUTE:
|
|
454
|
-
parentControl.DataType = this._val[0];
|
|
455
|
-
break;
|
|
456
|
-
case PropInterface.PROP_TYPE_FORMAT:
|
|
457
|
-
parentControl.setPicStr(this._val, this._expId);
|
|
458
|
-
break;
|
|
459
|
-
case PropInterface.PROP_TYPE_RANGE:
|
|
460
|
-
parentControl.setRange(this._val);
|
|
461
|
-
break;
|
|
462
|
-
case PropInterface.PROP_TYPE_DATA:
|
|
463
|
-
if (this._expId > 0)
|
|
464
|
-
parentControl.setValExp(this._expId);
|
|
465
|
-
else if (this._val != null)
|
|
466
|
-
parentControl.setField(this._val);
|
|
467
|
-
break;
|
|
468
|
-
case PropInterface.PROP_TYPE_BUTTON_STYLE:
|
|
469
|
-
if (this._val != null)
|
|
470
|
-
parentControl.ButtonStyle = this.GetComputedValueInteger();
|
|
471
|
-
break;
|
|
472
|
-
case PropInterface.PROP_TYPE_LAYER:
|
|
473
|
-
if (this._val != null)
|
|
474
|
-
parentControl.Layer = this.GetComputedValueInteger();
|
|
475
|
-
break;
|
|
476
|
-
default:
|
|
477
|
-
break;
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
getID() {
|
|
481
|
-
return this._id;
|
|
482
|
-
}
|
|
483
|
-
setValue(mgVal) {
|
|
484
|
-
let compIdx = this._parentObj.getCompIdx();
|
|
485
|
-
if (this._id === PropInterface.PROP_TYPE_DATA || this._id === PropInterface.PROP_TYPE_NODE_ID || this._id === PropInterface.PROP_TYPE_NODE_PARENTID)
|
|
486
|
-
return;
|
|
487
|
-
if (this._dataType === StorageAttribute.NONE)
|
|
488
|
-
this.setDataType();
|
|
489
|
-
switch (this._dataType) {
|
|
490
|
-
case StorageAttribute.NUMERIC:
|
|
491
|
-
if (mgVal == null)
|
|
492
|
-
mgVal = "FF00000000000000000000000000000000000000";
|
|
493
|
-
this._val = DisplayConvertor.Instance.mg2disp(mgVal, "", this._pic, false, compIdx, false).trim();
|
|
494
|
-
break;
|
|
495
|
-
case StorageAttribute.ALPHA:
|
|
496
|
-
case StorageAttribute.BLOB:
|
|
497
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
498
|
-
case StorageAttribute.BOOLEAN:
|
|
499
|
-
case StorageAttribute.UNICODE:
|
|
500
|
-
this._val = mgVal;
|
|
501
|
-
break;
|
|
502
|
-
default:
|
|
503
|
-
throw new ApplicationException("in Property.setValue() illegal data type: " + this._dataType);
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
SetValue(val) {
|
|
507
|
-
this._val = String(val);
|
|
508
|
-
}
|
|
509
|
-
setOrgValue() {
|
|
510
|
-
this._orgValue = this._val;
|
|
511
|
-
}
|
|
512
|
-
GetTaskByParentObject() {
|
|
513
|
-
let task = null;
|
|
514
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
|
|
515
|
-
task = this._parentObj.getTask();
|
|
516
|
-
else if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
517
|
-
task = this._parentObj.getForm().getTask();
|
|
518
|
-
else if (this._parentType === GuiConstants.PARENT_TYPE_TASK)
|
|
519
|
-
task = this._parentObj;
|
|
520
|
-
return task;
|
|
521
|
-
}
|
|
522
|
-
async RefreshDisplay(forceRefresh) {
|
|
523
|
-
await this.RefreshDisplayWithCurrentLine(forceRefresh, Int32.MinValue);
|
|
524
|
-
}
|
|
525
|
-
ShouldSkipRefreshControl() {
|
|
526
|
-
let skip = false;
|
|
527
|
-
let mgControl = this._parentObj;
|
|
528
|
-
switch (this._id) {
|
|
529
|
-
case PropInterface.PROP_TYPE_HEBREW:
|
|
530
|
-
if (mgControl.isTableControl())
|
|
531
|
-
skip = true;
|
|
532
|
-
break;
|
|
533
|
-
case PropInterface.PROP_TYPE_NODE_ID:
|
|
534
|
-
case PropInterface.PROP_TYPE_NODE_PARENTID:
|
|
535
|
-
case PropInterface.PROP_TYPE_DATA:
|
|
536
|
-
case PropInterface.PROP_TYPE_HIGHLIGHTING:
|
|
537
|
-
case PropInterface.PROP_TYPE_MUST_INPUT:
|
|
538
|
-
case PropInterface.PROP_TYPE_HELP_SCR:
|
|
539
|
-
case PropInterface.PROP_TYPE_SELECT_PROGRAM:
|
|
540
|
-
case PropInterface.PROP_TYPE_SELECT_MODE:
|
|
541
|
-
case PropInterface.PROP_TYPE_ALLOWED_DIRECTION:
|
|
542
|
-
case PropInterface.PROP_TYPE_RETURN_ACTION:
|
|
543
|
-
case PropInterface.PROP_TYPE_ATTRIBUTE:
|
|
544
|
-
case PropInterface.PROP_TYPE_REPEATABLE:
|
|
545
|
-
case PropInterface.PROP_TYPE_FRAME_NAME:
|
|
546
|
-
case PropInterface.PROP_TYPE_TRIGGER:
|
|
547
|
-
case PropInterface.PROP_TYPE_TAB_ORDER:
|
|
548
|
-
case PropInterface.PROP_TYPE_IS_CACHED:
|
|
549
|
-
case PropInterface.PROP_TYPE_LAYER:
|
|
550
|
-
case PropInterface.PROP_TYPE_AUTO_FIT:
|
|
551
|
-
case PropInterface.PROP_TYPE_RAISE_AT:
|
|
552
|
-
case PropInterface.PROP_TYPE_FRAMESET_STYLE:
|
|
553
|
-
case PropInterface.PROP_TYPE_FRAME_TYPE:
|
|
554
|
-
case PropInterface.PROP_TYPE_RANGE:
|
|
555
|
-
case PropInterface.PROP_TYPE_WINDOW_WIDTH:
|
|
556
|
-
case PropInterface.PROP_TYPE_TABBING_ORDER:
|
|
557
|
-
case PropInterface.PROP_TYPE_AUTO_REFRESH:
|
|
558
|
-
case PropInterface.PROP_TYPE_PARAMETERS:
|
|
559
|
-
case PropInterface.PROP_TYPE_OBJECT_TYPE:
|
|
560
|
-
case PropInterface.PROP_TYPE_RETAIN_FOCUS:
|
|
561
|
-
case PropInterface.PROP_TYPE_SUBFORM_TYPE:
|
|
562
|
-
case PropInterface.PROP_TYPE_REAL_OBJECT_TYPE:
|
|
563
|
-
case PropInterface.PROP_TYPE_ADDITIONAL_INFORMATION:
|
|
564
|
-
case PropInterface.PROP_TYPE_DATAVIEWCONTROL:
|
|
565
|
-
case PropInterface.PROP_TYPE_DATAVIEWCONTROL_FIELDS:
|
|
566
|
-
case PropInterface.PROP_TYPE_PRGTSK_NUM:
|
|
567
|
-
case PropInterface.PROP_TYPE_INDEX:
|
|
568
|
-
case PropInterface.PROP_TYPE_DISPLAY_FIELD:
|
|
569
|
-
case PropInterface.PROP_TYPE_LINK_FIELD:
|
|
570
|
-
case PropInterface.PROP_TYPE_BEFORE_900_VERSION:
|
|
571
|
-
case PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN:
|
|
572
|
-
case PropInterface.PROP_TYPE_SERVER_READ_AHEAD:
|
|
573
|
-
skip = true;
|
|
574
|
-
break;
|
|
575
|
-
case PropInterface.PROP_TYPE_BUTTON_STYLE:
|
|
576
|
-
if (!this._parentObj.isRadio())
|
|
577
|
-
skip = true;
|
|
578
|
-
break;
|
|
579
|
-
default:
|
|
580
|
-
break;
|
|
581
|
-
}
|
|
582
|
-
return skip;
|
|
583
|
-
}
|
|
584
|
-
ShouldSkipRefreshForm() {
|
|
585
|
-
Debug.Assert(this._parentType === GuiConstants.PARENT_TYPE_FORM);
|
|
586
|
-
let skip = false;
|
|
587
|
-
let mgFormBase = this._parentObj;
|
|
588
|
-
switch (this._id) {
|
|
589
|
-
case PropInterface.PROP_TYPE_WINDOW_TYPE:
|
|
590
|
-
if (!this._parentObj.IsFirstRefreshOfProps())
|
|
591
|
-
skip = true;
|
|
592
|
-
break;
|
|
593
|
-
case PropInterface.PROP_TYPE_LINES_IN_TABLE:
|
|
594
|
-
case PropInterface.PROP_TYPE_HELP_SCR:
|
|
595
|
-
case PropInterface.PROP_TYPE_TABBING_ORDER:
|
|
596
|
-
case PropInterface.PROP_TYPE_PERSISTENT_FORM_STATE_VERSION:
|
|
597
|
-
skip = true;
|
|
598
|
-
break;
|
|
599
|
-
default:
|
|
600
|
-
break;
|
|
601
|
-
}
|
|
602
|
-
if (!skip && mgFormBase.isSubForm()) {
|
|
603
|
-
skip = true;
|
|
604
|
-
switch (this._id) {
|
|
605
|
-
case PropInterface.PROP_TYPE_CUSTOM_PROPERTIES:
|
|
606
|
-
case PropInterface.PROP_TYPE_CUSTOM_VALIDATORS:
|
|
607
|
-
skip = false;
|
|
608
|
-
break;
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
return skip;
|
|
612
|
-
}
|
|
613
|
-
ShouldSkipRefreshTask() {
|
|
614
|
-
let skip = false;
|
|
615
|
-
switch (this._id) {
|
|
616
|
-
case PropInterface.PROP_TYPE_ALLOW_CREATE:
|
|
617
|
-
case PropInterface.PROP_TYPE_ALLOW_DELETE:
|
|
618
|
-
case PropInterface.PROP_TYPE_ALLOW_MODIFY:
|
|
619
|
-
case PropInterface.PROP_TYPE_ALLOW_QUERY:
|
|
620
|
-
case PropInterface.PROP_TYPE_ALLOW_RANGE:
|
|
621
|
-
case PropInterface.PROP_TYPE_ALLOW_LOCATE:
|
|
622
|
-
case PropInterface.PROP_TYPE_ALLOW_SORT:
|
|
623
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX:
|
|
624
|
-
case PropInterface.PROP_TYPE_TABBING_CYCLE:
|
|
625
|
-
case PropInterface.PROP_TYPE_CONFIRM_CANCEL:
|
|
626
|
-
case PropInterface.PROP_TYPE_CONFIRM_UPDATE:
|
|
627
|
-
case PropInterface.PROP_TYPE_END_CONDITION:
|
|
628
|
-
case PropInterface.PROP_TYPE_EVAL_END_CONDITION:
|
|
629
|
-
case PropInterface.PROP_TYPE_FORCE_SUFFIX:
|
|
630
|
-
case PropInterface.PROP_TYPE_FORCE_DELETE:
|
|
631
|
-
case PropInterface.PROP_TYPE_TASK_MODE:
|
|
632
|
-
case PropInterface.PROP_TYPE_SELECTION:
|
|
633
|
-
case PropInterface.PROP_TYPE_TRASACTION_BEGIN:
|
|
634
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_TRANSACTION_MODE:
|
|
635
|
-
case PropInterface.PROP_TYPE_PRINT_DATA:
|
|
636
|
-
case PropInterface.PROP_TYPE_CLOSE_TASKS_BY_MDI_MENU:
|
|
637
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_OPEN_TASK_WINDOW:
|
|
638
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS:
|
|
639
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_CHUNK_SIZE:
|
|
640
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_INDEX_OPTIMIZATION:
|
|
641
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE:
|
|
642
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_RANGE_ORDER:
|
|
643
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE:
|
|
644
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_LOCATE_ORDER:
|
|
645
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION:
|
|
646
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_POSITION_USAGE:
|
|
647
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_SQL_RANGE:
|
|
648
|
-
skip = true;
|
|
649
|
-
break;
|
|
650
|
-
default:
|
|
651
|
-
break;
|
|
652
|
-
}
|
|
653
|
-
return skip;
|
|
654
|
-
}
|
|
655
|
-
ShouldSkipRefresh() {
|
|
656
|
-
let skip = false;
|
|
657
|
-
switch (this._parentType) {
|
|
658
|
-
case GuiConstants.PARENT_TYPE_CONTROL:
|
|
659
|
-
skip = this.ShouldSkipRefreshControl();
|
|
660
|
-
break;
|
|
661
|
-
case GuiConstants.PARENT_TYPE_FORM:
|
|
662
|
-
skip = this.ShouldSkipRefreshForm();
|
|
663
|
-
break;
|
|
664
|
-
case GuiConstants.PARENT_TYPE_TASK:
|
|
665
|
-
skip = this.ShouldSkipRefreshTask();
|
|
666
|
-
break;
|
|
667
|
-
default:
|
|
668
|
-
break;
|
|
669
|
-
}
|
|
670
|
-
switch (this._id) {
|
|
671
|
-
case PropInterface.PROP_TYPE_POP_UP:
|
|
672
|
-
case PropInterface.PROP_TYPE_ORIENTATION_LOCK:
|
|
673
|
-
case PropInterface.PROP_TYPE_ENTER_ANIMATION:
|
|
674
|
-
case PropInterface.PROP_TYPE_EXIT_ANIMATION:
|
|
675
|
-
case PropInterface.PROP_TYPE_NAVIGATION_DRAWER_MENU:
|
|
676
|
-
case PropInterface.PROP_TYPE_ACTION_BAR_MENU:
|
|
677
|
-
case PropInterface.PROP_TYPE_OPEN_PICKER:
|
|
678
|
-
case PropInterface.PROP_TYPE_OPEN_EDIT_DIALOG:
|
|
679
|
-
case PropInterface.PROP_TYPE_DEFAULT_ALIGNMENT:
|
|
680
|
-
case PropInterface.PROP_TYPE_KEYBOARD_TYPE:
|
|
681
|
-
case PropInterface.PROP_TYPE_KEYBOARD_RETURN_KEY:
|
|
682
|
-
case PropInterface.PROP_TYPE_ALLOW_SUGGESTIONS:
|
|
683
|
-
case PropInterface.PROP_TYPE_MOBILE_IMAGE_LIST_FILE_NAME:
|
|
684
|
-
skip = true;
|
|
685
|
-
break;
|
|
686
|
-
}
|
|
687
|
-
return skip;
|
|
688
|
-
}
|
|
689
|
-
async RefreshDisplayWithCurrentLine(forceRefresh, currLine) {
|
|
690
|
-
await this.RefreshDisplayWithCurrLineAndCheckSkipRefresh(forceRefresh, currLine, true);
|
|
691
|
-
}
|
|
692
|
-
SkipWhenNoExpression() {
|
|
693
|
-
let skipWhenNoExpression = true;
|
|
694
|
-
let ctrl = ((this._parentObj instanceof GuiControlPropertyAdapter) ? this._parentObj : null);
|
|
695
|
-
if ((ctrl != null && ctrl.isButton() && this._id === PropInterface.PROP_TYPE_FORMAT) ||
|
|
696
|
-
(ctrl != null && ctrl.isComboBox() && this._id === PropInterface.PROP_TYPE_LABEL) ||
|
|
697
|
-
(ctrl != null && ctrl.isListBox() && this._id === PropInterface.PROP_TYPE_LABEL) ||
|
|
698
|
-
(ctrl != null && ctrl.isRadio() && this._id === PropInterface.PROP_TYPE_LABEL) ||
|
|
699
|
-
(ctrl != null && ctrl.isCheckBox() && this._id === PropInterface.PROP_TYPE_LABEL) ||
|
|
700
|
-
(ctrl != null && ctrl.isTabControl() && this._id === PropInterface.PROP_TYPE_LABEL) ||
|
|
701
|
-
(ctrl != null && ctrl.isImageControl() && this._id === PropInterface.PROP_TYPE_IMAGE_FILENAME) ||
|
|
702
|
-
(ctrl != null && ctrl.IsImageButton() && this._id === PropInterface.PROP_TYPE_IMAGE_FILENAME) ||
|
|
703
|
-
(ctrl != null && ctrl.isColumnControl() && this._id === PropInterface.PROP_TYPE_COLUMN_TITLE) ||
|
|
704
|
-
(this._id === PropInterface.PROP_TYPE_DISPLAY_LIST) ||
|
|
705
|
-
(this._id === PropInterface.PROP_TYPE_TEXT) ||
|
|
706
|
-
(this._id === PropInterface.PROP_TYPE_TOOLTIP) ||
|
|
707
|
-
(this._id === PropInterface.PROP_TYPE_HINT) ||
|
|
708
|
-
(this._id === PropInterface.PROP_TYPE_PASSWORD) ||
|
|
709
|
-
(this._id === PropInterface.PROP_TYPE_CUSTOM_PROPERTIES) ||
|
|
710
|
-
(this._id === PropInterface.PROP_TYPE_CUSTOM_VALIDATORS) ||
|
|
711
|
-
(this._id === PropInterface.PROP_TYPE_VISIBLE) ||
|
|
712
|
-
(this._id === PropInterface.PROP_TYPE_ENABLED) ||
|
|
713
|
-
(this._id === PropInterface.PROP_TYPE_BINDING_LEVEL))
|
|
714
|
-
skipWhenNoExpression = false;
|
|
715
|
-
return skipWhenNoExpression;
|
|
716
|
-
}
|
|
717
|
-
async RefreshDisplayWithCurrLineAndCheckSkipRefresh(forceRefresh, currLine, checkSkipRefresh) {
|
|
718
|
-
let ctrl = null;
|
|
719
|
-
let line = 0;
|
|
720
|
-
let prevValue;
|
|
721
|
-
let valChanged = true;
|
|
722
|
-
if (this._val === null && this._expId === 0) {
|
|
723
|
-
Events.WriteExceptionToLog("in Property.RefreshDisplay() null value and expression");
|
|
724
|
-
return;
|
|
725
|
-
}
|
|
726
|
-
if (checkSkipRefresh && this.ShouldSkipRefresh())
|
|
727
|
-
return;
|
|
728
|
-
if (this._expId === 0 && this.SkipWhenNoExpression())
|
|
729
|
-
return;
|
|
730
|
-
if (this._prevValues.length === 0)
|
|
731
|
-
this.setPrevArraySize();
|
|
732
|
-
await this.ComputeValue();
|
|
733
|
-
switch (this._parentType) {
|
|
734
|
-
case GuiConstants.PARENT_TYPE_CONTROL:
|
|
735
|
-
ctrl = this._parentObj;
|
|
736
|
-
if (this._id === PropInterface.PROP_TYPE_FORMAT && this._expId > 0)
|
|
737
|
-
ctrl.computePIC(this._val);
|
|
738
|
-
if (ctrl.IsRepeatable && !ctrl.getForm().isRefreshRepeatableAllowed())
|
|
739
|
-
return;
|
|
740
|
-
if (currLine === Int32.MinValue)
|
|
741
|
-
line = this.getLine();
|
|
742
|
-
else
|
|
743
|
-
line = currLine;
|
|
744
|
-
prevValue = this._prevValues.get_Item(line);
|
|
745
|
-
if (!forceRefresh && (this._val === prevValue)
|
|
746
|
-
&& this._id !== PropInterface.PROP_TYPE_MODIFIABLE
|
|
747
|
-
&& this._id !== PropInterface.PROP_TYPE_VISIBLE
|
|
748
|
-
&& this._id !== PropInterface.PROP_TYPE_ENABLED)
|
|
749
|
-
return;
|
|
750
|
-
if (ctrl.Type === MgControlType.CTRL_TYPE_COLUMN
|
|
751
|
-
&& this._id === PropInterface.PROP_TYPE_VISIBLE
|
|
752
|
-
&& this._val === prevValue)
|
|
753
|
-
return;
|
|
754
|
-
if (this._val === prevValue)
|
|
755
|
-
valChanged = false;
|
|
756
|
-
this._prevValues.set_Item(line, this._val);
|
|
757
|
-
break;
|
|
758
|
-
case GuiConstants.PARENT_TYPE_FORM:
|
|
759
|
-
prevValue = this._prevValues.get_Item(0);
|
|
760
|
-
if (!forceRefresh && (this._val === prevValue))
|
|
761
|
-
return;
|
|
762
|
-
this._prevValues.set_Item(0, this._val);
|
|
763
|
-
break;
|
|
764
|
-
case GuiConstants.PARENT_TYPE_TASK:
|
|
765
|
-
Events.WriteExceptionToLog(NString.Format("Property.RefreshDisplay(): task property {0} wasn't handled", this._id));
|
|
766
|
-
return;
|
|
767
|
-
default:
|
|
768
|
-
Events.WriteExceptionToLog(NString.Format("Property.RefreshDisplay(): parentType unknown, property {0} wasn't handled", this._id));
|
|
769
|
-
return;
|
|
770
|
-
}
|
|
771
|
-
switch (this._id) {
|
|
772
|
-
case PropInterface.PROP_TYPE_IMAGE_FILENAME:
|
|
773
|
-
this.onImageFileName();
|
|
774
|
-
break;
|
|
775
|
-
case PropInterface.PROP_TYPE_ENABLED:
|
|
776
|
-
this.onEnable(valChanged);
|
|
777
|
-
break;
|
|
778
|
-
case PropInterface.PROP_TYPE_VISIBLE:
|
|
779
|
-
await this.onVisible(valChanged);
|
|
780
|
-
break;
|
|
781
|
-
case PropInterface.PROP_TYPE_NAME:
|
|
782
|
-
this.OnControlName();
|
|
783
|
-
break;
|
|
784
|
-
case PropInterface.PROP_TYPE_FORM_NAME:
|
|
785
|
-
this.onFormName();
|
|
786
|
-
break;
|
|
787
|
-
case PropInterface.PROP_TYPE_COLUMN_TITLE:
|
|
788
|
-
this.onText(0);
|
|
789
|
-
break;
|
|
790
|
-
case PropInterface.PROP_TYPE_TEXT:
|
|
791
|
-
this.onText(line);
|
|
792
|
-
break;
|
|
793
|
-
case PropInterface.PROP_TYPE_HINT:
|
|
794
|
-
this.onHint();
|
|
795
|
-
break;
|
|
796
|
-
case PropInterface.PROP_TYPE_MODIFIABLE:
|
|
797
|
-
await this.onModifiable();
|
|
798
|
-
break;
|
|
799
|
-
case PropInterface.PROP_TYPE_TOOLTIP:
|
|
800
|
-
this.onTooltip();
|
|
801
|
-
break;
|
|
802
|
-
case PropInterface.PROP_TYPE_DISPLAY_LIST:
|
|
803
|
-
await this.onDisplayList(line);
|
|
804
|
-
break;
|
|
805
|
-
case PropInterface.PROP_TYPE_AUTO_COMPLETE_MODE_WC:
|
|
806
|
-
this.onAutoCompleteMode();
|
|
807
|
-
break;
|
|
808
|
-
case PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST:
|
|
809
|
-
await this.onVisibleLayerList(line);
|
|
810
|
-
break;
|
|
811
|
-
case PropInterface.PROP_TYPE_FORMAT:
|
|
812
|
-
this.onFormat();
|
|
813
|
-
break;
|
|
814
|
-
case PropInterface.PROP_TYPE_LABEL:
|
|
815
|
-
await this.onLabel(line);
|
|
816
|
-
break;
|
|
817
|
-
case PropInterface.PROP_TYPE_PASSWORD:
|
|
818
|
-
this.onPassword();
|
|
819
|
-
break;
|
|
820
|
-
case PropInterface.PROP_TYPE_MODIFY_IN_QUERY:
|
|
821
|
-
case PropInterface.PROP_TYPE_TAB_IN:
|
|
822
|
-
case PropInterface.PROP_TYPE_PARK_ON_CLICK:
|
|
823
|
-
case PropInterface.PROP_TYPE_LOAD_IMAGE_FROM:
|
|
824
|
-
break;
|
|
825
|
-
case PropInterface.PROP_TYPE_CUSTOM_PROPERTIES:
|
|
826
|
-
this.onCustomProperties();
|
|
827
|
-
break;
|
|
828
|
-
case PropInterface.PROP_TYPE_CUSTOM_VALIDATORS:
|
|
829
|
-
this.onCustomValidators();
|
|
830
|
-
break;
|
|
831
|
-
case PropInterface.PROP_TYPE_BINDING_LEVEL:
|
|
832
|
-
this.onBindingLevel();
|
|
833
|
-
break;
|
|
834
|
-
default:
|
|
835
|
-
Events.WriteExceptionToLog(NString.Format("Property.RefreshDisplay(): Property {0} wasn't handled", this._id));
|
|
836
|
-
break;
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
ShouldBeComputedOnce() {
|
|
840
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_TASK) {
|
|
841
|
-
switch (this._id) {
|
|
842
|
-
case PropInterface.PROP_TYPE_TASK_MODE:
|
|
843
|
-
case PropInterface.PROP_TYPE_PRELOAD_VIEW:
|
|
844
|
-
case PropInterface.PROP_TYPE_TABBING_CYCLE:
|
|
845
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_OPEN_TASK_WINDOW:
|
|
846
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS:
|
|
847
|
-
case PropInterface.PROP_TYPE_ALLOW_LOCATE_IN_QUERY:
|
|
848
|
-
case PropInterface.PROP_TYPE_PRINT_DATA:
|
|
849
|
-
case PropInterface.PROP_TYPE_ALLOW_RANGE:
|
|
850
|
-
case PropInterface.PROP_TYPE_ALLOW_LOCATE:
|
|
851
|
-
case PropInterface.PROP_TYPE_ALLOW_SORT:
|
|
852
|
-
case PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX:
|
|
853
|
-
case PropInterface.PROP_TYPE_MAIN_DISPLAY:
|
|
854
|
-
return true;
|
|
855
|
-
}
|
|
856
|
-
}
|
|
857
|
-
else if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
858
|
-
if (this._id === PropInterface.PROP_TYPE_IS_CACHED || this._id === PropInterface.PROP_TYPE_MULTILINE)
|
|
859
|
-
return true;
|
|
860
|
-
}
|
|
861
|
-
return false;
|
|
862
|
-
}
|
|
863
|
-
IsComputedOnceOnServer() {
|
|
864
|
-
if (this.ShouldBeComputedOnce()) {
|
|
865
|
-
let task = this.GetTaskByParentObject();
|
|
866
|
-
if (task != null)
|
|
867
|
-
return !task.ShouldEvaluatePropertyLocally(this._id);
|
|
868
|
-
}
|
|
869
|
-
return false;
|
|
870
|
-
}
|
|
871
|
-
async ComputeValue() {
|
|
872
|
-
let result = null;
|
|
873
|
-
let len = 255;
|
|
874
|
-
let wasEvaluated = new RefParam(false);
|
|
875
|
-
if (this._id === PropInterface.PROP_TYPE_CUSTOM_PROPERTIES) {
|
|
876
|
-
await this.computeCustomPropertiesValues();
|
|
877
|
-
result = this.GetArrayValuesForCustomProperties();
|
|
878
|
-
this.setValue(result);
|
|
879
|
-
}
|
|
880
|
-
if (this._id === PropInterface.PROP_TYPE_CUSTOM_VALIDATORS) {
|
|
881
|
-
let evaluated = await this.computeCustomValidators();
|
|
882
|
-
if (evaluated) {
|
|
883
|
-
result = this.GetArrayValuesForCustomValidationProperties();
|
|
884
|
-
this.setValue(result);
|
|
885
|
-
}
|
|
886
|
-
}
|
|
887
|
-
else if (this._expId > 0) {
|
|
888
|
-
if (this.ShouldBeComputedOnce() && this._expAlreadyComputedOnce)
|
|
889
|
-
return;
|
|
890
|
-
this._expAlreadyComputedOnce = true;
|
|
891
|
-
let alwaysEvaluate = false;
|
|
892
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_TASK)
|
|
893
|
-
alwaysEvaluate = true;
|
|
894
|
-
if (this._id === PropInterface.PROP_TYPE_FORMAT) {
|
|
895
|
-
len = 65535;
|
|
896
|
-
result = StrUtil.rtrim(await this._parentObj.EvaluateExpression(this._expId, this._dataType, len, true, StorageAttribute.SKIP, alwaysEvaluate, wasEvaluated));
|
|
897
|
-
}
|
|
898
|
-
else {
|
|
899
|
-
try {
|
|
900
|
-
result = await this._parentObj.EvaluateExpression(this._expId, this._dataType, len, true, StorageAttribute.SKIP, alwaysEvaluate, wasEvaluated);
|
|
901
|
-
}
|
|
902
|
-
catch (e) {
|
|
903
|
-
let warningMsg = new StringBuilder("Exception: " + e.Message);
|
|
904
|
-
if (this._parentObj instanceof GuiControlPropertyAdapter)
|
|
905
|
-
warningMsg.Append(" Control: " + this._parentObj.Name);
|
|
906
|
-
Events.WriteWarningToLog(warningMsg.ToString());
|
|
907
|
-
}
|
|
908
|
-
}
|
|
909
|
-
if (wasEvaluated.value) {
|
|
910
|
-
result = this.updateResult(result);
|
|
911
|
-
this.setValue(result);
|
|
912
|
-
}
|
|
913
|
-
else if (this._val == null && this._parentType !== GuiConstants.PARENT_TYPE_CONTROL) {
|
|
914
|
-
result = PropDefaults.getDefaultValue(this._id, this._parentType, this._parentObj);
|
|
915
|
-
this.setValue(result);
|
|
916
|
-
}
|
|
917
|
-
}
|
|
918
|
-
}
|
|
919
|
-
updateResult(result) {
|
|
920
|
-
switch (this._id) {
|
|
921
|
-
case PropInterface.PROP_TYPE_FORMAT:
|
|
922
|
-
if (result == null)
|
|
923
|
-
result = NString.Empty;
|
|
924
|
-
break;
|
|
925
|
-
case PropInterface.PROP_TYPE_TASK_MODE:
|
|
926
|
-
result = Property.updateTaskModeResult(result);
|
|
927
|
-
break;
|
|
928
|
-
default:
|
|
929
|
-
return result;
|
|
930
|
-
}
|
|
931
|
-
return result;
|
|
932
|
-
}
|
|
933
|
-
static updateTaskModeResult(result) {
|
|
934
|
-
let code = ' ';
|
|
935
|
-
if (!NString.IsNullOrEmpty(result)) {
|
|
936
|
-
code = result[0].toUpperCase();
|
|
937
|
-
switch (code) {
|
|
938
|
-
case 'Q':
|
|
939
|
-
code = 'E';
|
|
940
|
-
break;
|
|
941
|
-
case 'F':
|
|
942
|
-
code = 'O';
|
|
943
|
-
break;
|
|
944
|
-
case 'O':
|
|
945
|
-
code = 'N';
|
|
946
|
-
break;
|
|
947
|
-
}
|
|
948
|
-
}
|
|
949
|
-
return code;
|
|
950
|
-
}
|
|
951
|
-
async getValue() {
|
|
952
|
-
await this.ComputeValue();
|
|
953
|
-
return this._val;
|
|
954
|
-
}
|
|
955
|
-
async getValueInt() {
|
|
956
|
-
let result = 0;
|
|
957
|
-
await this.ComputeValue();
|
|
958
|
-
if (this._val !== null)
|
|
959
|
-
result = NNumber.Parse(this._val);
|
|
960
|
-
return result;
|
|
961
|
-
}
|
|
962
|
-
GetComputedValueInteger() {
|
|
963
|
-
return NNumber.Parse(this._val);
|
|
964
|
-
}
|
|
965
|
-
async getValueBoolean() {
|
|
966
|
-
if (this._dataType === StorageAttribute.BOOLEAN) {
|
|
967
|
-
await this.getValue();
|
|
968
|
-
return DisplayConvertor.toBoolean(this._val);
|
|
969
|
-
}
|
|
970
|
-
else {
|
|
971
|
-
Events.WriteExceptionToLog(NString.Format("Property.getValueBoolean() was called for non boolean type property: {0}", this._id));
|
|
972
|
-
}
|
|
973
|
-
}
|
|
974
|
-
GetComputedValue() {
|
|
975
|
-
return this._val;
|
|
976
|
-
}
|
|
977
|
-
GetComputedValueBoolean() {
|
|
978
|
-
if (this._dataType === StorageAttribute.BOOLEAN) {
|
|
979
|
-
return DisplayConvertor.toBoolean(this._val);
|
|
980
|
-
}
|
|
981
|
-
else {
|
|
982
|
-
Events.WriteExceptionToLog(NString.Format("Property.getValueBoolean() was called for non boolean type property: {0}", this._id));
|
|
983
|
-
}
|
|
984
|
-
}
|
|
985
|
-
getPrevValue(line) {
|
|
986
|
-
if (line < this._prevValues.length)
|
|
987
|
-
return this._prevValues.get_Item(line);
|
|
988
|
-
return null;
|
|
989
|
-
}
|
|
990
|
-
isExpression() {
|
|
991
|
-
return this._expId > 0;
|
|
992
|
-
}
|
|
993
|
-
GetExpressionId() {
|
|
994
|
-
return this._expId;
|
|
995
|
-
}
|
|
996
|
-
onImageFileName() {
|
|
997
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
998
|
-
let mgControlBase = this._parentObj;
|
|
999
|
-
if (mgControlBase.isTabControl()) {
|
|
1000
|
-
mgControlBase.setImageList(this.GetComputedValue());
|
|
1001
|
-
}
|
|
1002
|
-
else if (mgControlBase.isImageControl() || mgControlBase.isRadio() || mgControlBase.isCheckBox() || mgControlBase.IsImageButton()) {
|
|
1003
|
-
mgControlBase.setImageWithFileName(this.GetComputedValue());
|
|
1004
|
-
}
|
|
1005
|
-
}
|
|
1006
|
-
else
|
|
1007
|
-
throw new ApplicationException("in onImageFileName.onEnable()");
|
|
1008
|
-
}
|
|
1009
|
-
onEnable(valChanged) {
|
|
1010
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1011
|
-
let ctrl = this._parentObj;
|
|
1012
|
-
let currentEditingControl = ctrl.getForm().getTask().CurrentEditingControl;
|
|
1013
|
-
if (this._val !== null && this._val === "0" && valChanged && currentEditingControl !== null &&
|
|
1014
|
-
(ctrl === currentEditingControl || currentEditingControl.isDescendentOfControl(ctrl) || ctrl === currentEditingControl.getLinkedParent(false))) {
|
|
1015
|
-
let parkedControl = ctrl.getForm().getTask().getLastParkedCtrl();
|
|
1016
|
-
if (parkedControl !== null && parkedControl.InControl && (ctrl === parkedControl || parkedControl.isDescendentOfControl(ctrl))) {
|
|
1017
|
-
Events.OnNonParkableLastParkedCtrl(ctrl);
|
|
1018
|
-
ctrl.getForm().getTask().CurrentEditingControl = null;
|
|
1019
|
-
}
|
|
1020
|
-
}
|
|
1021
|
-
ctrl.SetEnabled(this.GetComputedValueBoolean());
|
|
1022
|
-
}
|
|
1023
|
-
else
|
|
1024
|
-
throw new ApplicationException("in Property.onEnable()");
|
|
1025
|
-
}
|
|
1026
|
-
async onVisible(valChanged) {
|
|
1027
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1028
|
-
let ctrl = this._parentObj;
|
|
1029
|
-
let currentEditingControl = ctrl.getForm().getTask().CurrentEditingControl;
|
|
1030
|
-
if (this._val !== null && this._val === "0" && valChanged && currentEditingControl !== null &&
|
|
1031
|
-
(ctrl === currentEditingControl || currentEditingControl.isDescendentOfControl(ctrl) || ctrl === currentEditingControl.getLinkedParent(false))) {
|
|
1032
|
-
let parkedControl = ctrl.getForm().getTask().getLastParkedCtrl();
|
|
1033
|
-
if (parkedControl !== null && parkedControl.InControl && (ctrl === parkedControl || parkedControl.isDescendentOfControl(ctrl))) {
|
|
1034
|
-
Events.OnNonParkableLastParkedCtrl(ctrl);
|
|
1035
|
-
ctrl.getForm().getTask().CurrentEditingControl = null;
|
|
1036
|
-
}
|
|
1037
|
-
}
|
|
1038
|
-
await ctrl.updatePropertyLogicNesting(PropInterface.PROP_TYPE_VISIBLE, CommandType.PROP_SET_VISIBLE, this.GetComputedValueBoolean(), true);
|
|
1039
|
-
}
|
|
1040
|
-
}
|
|
1041
|
-
OnControlName() {
|
|
1042
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1043
|
-
}
|
|
1044
|
-
else
|
|
1045
|
-
throw new ApplicationException("in Property.OnControlName()");
|
|
1046
|
-
}
|
|
1047
|
-
onHint() {
|
|
1048
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1049
|
-
let control = this.getObjectByParentObj();
|
|
1050
|
-
let translatedString = Events.Translate(this.GetComputedValue());
|
|
1051
|
-
if (!control.IsDateTimePicture() && (!control.IsTableChild || control.IsTableHeaderChild)) {
|
|
1052
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.PlaceHolder, translatedString);
|
|
1053
|
-
}
|
|
1054
|
-
}
|
|
1055
|
-
else
|
|
1056
|
-
throw new ApplicationException("inProperty.onHint()");
|
|
1057
|
-
}
|
|
1058
|
-
onFormName() {
|
|
1059
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM)
|
|
1060
|
-
this.addCommandTypeText(0);
|
|
1061
|
-
else
|
|
1062
|
-
throw new ApplicationException("in Property.onFormName()");
|
|
1063
|
-
}
|
|
1064
|
-
addCommandTypeText(line) {
|
|
1065
|
-
let mlsTransValue = Events.Translate(this.GetComputedValue());
|
|
1066
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM ||
|
|
1067
|
-
(this._parentType === GuiConstants.PARENT_TYPE_CONTROL && this._parentObj.isColumnControl())) {
|
|
1068
|
-
mlsTransValue = StrUtil.rtrim(mlsTransValue);
|
|
1069
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM && mlsTransValue === NString.Empty) {
|
|
1070
|
-
mlsTransValue = " ";
|
|
1071
|
-
}
|
|
1072
|
-
}
|
|
1073
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL && (this._parentObj.isTextControl()
|
|
1074
|
-
|| (this._parentObj.isButton())))
|
|
1075
|
-
Commands.addValueWithLine(CommandType.SET_VALUE, this._parentObj, line, mlsTransValue);
|
|
1076
|
-
else
|
|
1077
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this._parentObj, line, HtmlProperties.Text, mlsTransValue);
|
|
1078
|
-
}
|
|
1079
|
-
onText(line) {
|
|
1080
|
-
this.addCommandTypeText(line);
|
|
1081
|
-
}
|
|
1082
|
-
async onModifiable() {
|
|
1083
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1084
|
-
let ctrl = this._parentObj;
|
|
1085
|
-
if (ctrl.isTextControl() || ctrl.isChoiceControl() || ctrl.isCheckBox()) {
|
|
1086
|
-
let task = this.GetTaskByParentObject();
|
|
1087
|
-
let readOnlyValue = !this.GetComputedValueBoolean();
|
|
1088
|
-
if ((readOnlyValue || task.getMode() !== Constants.TASK_MODE_QUERY) && ctrl.GetCurrReadOnly() !== readOnlyValue) {
|
|
1089
|
-
ctrl.SetCurrReadOnly(readOnlyValue);
|
|
1090
|
-
if (UtilStrByteMode.isLocaleDefLangDBCS()) {
|
|
1091
|
-
if (await ctrl.getForm().getTask().checkProp(PropInterface.PROP_TYPE_ALLOW_LOCATE_IN_QUERY, false)) {
|
|
1092
|
-
return;
|
|
1093
|
-
}
|
|
1094
|
-
}
|
|
1095
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.ReadOnly, readOnlyValue);
|
|
1096
|
-
}
|
|
1097
|
-
}
|
|
1098
|
-
}
|
|
1099
|
-
else
|
|
1100
|
-
throw new ApplicationException("in Property.onModifiable()");
|
|
1101
|
-
}
|
|
1102
|
-
onTooltip() {
|
|
1103
|
-
let toolTip;
|
|
1104
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1105
|
-
let ctrl = this._parentObj;
|
|
1106
|
-
if (this._expId === 0)
|
|
1107
|
-
toolTip = ctrl.getForm().getTask().getHelpItem(NNumber.Parse(this._val)).tooltipHelpText;
|
|
1108
|
-
else
|
|
1109
|
-
toolTip = this._val;
|
|
1110
|
-
toolTip = StrUtil.rtrim(toolTip);
|
|
1111
|
-
if (ctrl.isButton() && ctrl.ConnectedControl)
|
|
1112
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, ctrl.ConnectedControl, this.getLine(), HtmlProperties.ZoomButtonTooltip, toolTip);
|
|
1113
|
-
else
|
|
1114
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, ctrl, this.getLine(), HtmlProperties.Tooltip, toolTip);
|
|
1115
|
-
}
|
|
1116
|
-
else
|
|
1117
|
-
throw new ApplicationException("in Property.onTooltip()");
|
|
1118
|
-
}
|
|
1119
|
-
async onDisplayList(currLine) {
|
|
1120
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1121
|
-
let ctrl = this._parentObj;
|
|
1122
|
-
if (ctrl.isSelectionCtrl() || ctrl.isTabControl() || ctrl.isRadio() || ctrl.HasAutocomplete()) {
|
|
1123
|
-
let line = (currLine === Int32.MinValue) ? ctrl.getDisplayLine(false) : currLine;
|
|
1124
|
-
await ctrl.refreshAndSetItemsList(line, true);
|
|
1125
|
-
}
|
|
1126
|
-
}
|
|
1127
|
-
else
|
|
1128
|
-
throw new ApplicationException("in Property.onDisplayList()");
|
|
1129
|
-
}
|
|
1130
|
-
async onVisibleLayerList(currLine) {
|
|
1131
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1132
|
-
let ctrl = this._parentObj;
|
|
1133
|
-
let line = 0;
|
|
1134
|
-
if (currLine === Int32.MinValue)
|
|
1135
|
-
line = ctrl.getDisplayLine(false);
|
|
1136
|
-
else
|
|
1137
|
-
line = currLine;
|
|
1138
|
-
await ctrl.refreshTabForLayerList(line);
|
|
1139
|
-
}
|
|
1140
|
-
else
|
|
1141
|
-
throw new ApplicationException("in Property.onVisibleLayerList()");
|
|
1142
|
-
}
|
|
1143
|
-
onFormat() {
|
|
1144
|
-
let ctrl = null;
|
|
1145
|
-
let ctrlPic;
|
|
1146
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1147
|
-
ctrl = this._parentObj;
|
|
1148
|
-
ctrlPic = ctrl.getPIC();
|
|
1149
|
-
ctrl.resetPrevVal();
|
|
1150
|
-
switch (ctrl.Type) {
|
|
1151
|
-
case MgControlType.CTRL_TYPE_BUTTON:
|
|
1152
|
-
if (ctrl.getField() == null && !ctrl.expressionSetAsData() || ctrl.IsImageButton() || (this._parentObj.IsFirstRefreshOfProps()))
|
|
1153
|
-
this.addCommandTypeText(this.getLine());
|
|
1154
|
-
break;
|
|
1155
|
-
case MgControlType.CTRL_TYPE_TEXT:
|
|
1156
|
-
if (ctrl.Type === MgControlType.CTRL_TYPE_TEXT) {
|
|
1157
|
-
if (ctrlPic.getAttr() !== StorageAttribute.NUMERIC) {
|
|
1158
|
-
}
|
|
1159
|
-
}
|
|
1160
|
-
break;
|
|
1161
|
-
}
|
|
1162
|
-
}
|
|
1163
|
-
else
|
|
1164
|
-
throw new ApplicationException("in Property.onFormat()");
|
|
1165
|
-
}
|
|
1166
|
-
async onLabel(currLine) {
|
|
1167
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1168
|
-
let ctrl = this._parentObj;
|
|
1169
|
-
let line;
|
|
1170
|
-
if (currLine === Int32.MinValue)
|
|
1171
|
-
line = ctrl.getDisplayLine(false);
|
|
1172
|
-
else
|
|
1173
|
-
line = currLine;
|
|
1174
|
-
if (ctrl.Type === MgControlType.CTRL_TYPE_CHECKBOX)
|
|
1175
|
-
this.addCommandTypeText(line);
|
|
1176
|
-
else if (ctrl.isSelectionCtrl() || ctrl.isTabControl() || ctrl.isRadio()) {
|
|
1177
|
-
ctrl.setRange(await this.getValue());
|
|
1178
|
-
ctrl.clearRange(line);
|
|
1179
|
-
await ctrl.refreshAndSetItemsList(line, true);
|
|
1180
|
-
if (this._expId > 0)
|
|
1181
|
-
await ctrl.ComputeAndRefreshDisplayValue(false);
|
|
1182
|
-
}
|
|
1183
|
-
else if (ctrl.HasAutocomplete())
|
|
1184
|
-
await ctrl.refreshAndSetItemsList(line, true);
|
|
1185
|
-
else
|
|
1186
|
-
throw new ApplicationException("Property.onLabel(), not support control");
|
|
1187
|
-
}
|
|
1188
|
-
else
|
|
1189
|
-
throw new ApplicationException("in Property.onLabel()");
|
|
1190
|
-
}
|
|
1191
|
-
getObjectByParentObj() {
|
|
1192
|
-
let result = this._parentObj;
|
|
1193
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM) {
|
|
1194
|
-
let form = this._parentObj;
|
|
1195
|
-
if (form.isSubForm())
|
|
1196
|
-
result = form.getSubFormCtrl();
|
|
1197
|
-
}
|
|
1198
|
-
return result;
|
|
1199
|
-
}
|
|
1200
|
-
static isRepeatableInTable() {
|
|
1201
|
-
return false;
|
|
1202
|
-
}
|
|
1203
|
-
getLine() {
|
|
1204
|
-
let line = 0;
|
|
1205
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1206
|
-
let ctrl = this._parentObj;
|
|
1207
|
-
let displayLineForTreeOrTable = ctrl.isPropertyRepeatable(this._id);
|
|
1208
|
-
line = ctrl.getDisplayLine(displayLineForTreeOrTable);
|
|
1209
|
-
}
|
|
1210
|
-
return line;
|
|
1211
|
-
}
|
|
1212
|
-
getOrgValue() {
|
|
1213
|
-
return this._orgValue;
|
|
1214
|
-
}
|
|
1215
|
-
updatePrevValueArray(newSize) {
|
|
1216
|
-
if (!this.ShouldSkipRefresh())
|
|
1217
|
-
this._prevValues.SetSize(newSize);
|
|
1218
|
-
}
|
|
1219
|
-
clearPrevValueArray() {
|
|
1220
|
-
this._prevValues.Clear();
|
|
1221
|
-
}
|
|
1222
|
-
ResetPrevValueArray() {
|
|
1223
|
-
let count = this._prevValues.length;
|
|
1224
|
-
this._prevValues.Clear();
|
|
1225
|
-
this._prevValues.SetSize(count);
|
|
1226
|
-
}
|
|
1227
|
-
setPrevArraySize() {
|
|
1228
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_FORM || this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1229
|
-
let size = 1;
|
|
1230
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL) {
|
|
1231
|
-
let mgControlBase = this._parentObj;
|
|
1232
|
-
if (mgControlBase.IsRepeatable)
|
|
1233
|
-
size = mgControlBase.getForm().getTableItemsCount();
|
|
1234
|
-
else if (mgControlBase.isTableControl() && Property.isRepeatableInTable())
|
|
1235
|
-
size = mgControlBase.getForm().getTableItemsCount();
|
|
1236
|
-
}
|
|
1237
|
-
this._prevValues.SetSize(size);
|
|
1238
|
-
}
|
|
1239
|
-
}
|
|
1240
|
-
onPassword() {
|
|
1241
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
1242
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.Password, this.GetComputedValueBoolean());
|
|
1243
|
-
else
|
|
1244
|
-
throw new ApplicationException("in Property.onPassword()");
|
|
1245
|
-
}
|
|
1246
|
-
async computeCustomPropertiesValues() {
|
|
1247
|
-
for (let [customPropertyKey, customPropertyValue] of this.customProperties) {
|
|
1248
|
-
let expression = customPropertyValue;
|
|
1249
|
-
let retExpressionValue = await this.GetRetrunValueForCustomPropertyExpression(expression);
|
|
1250
|
-
this.customPropertiesValues.set(customPropertyKey, retExpressionValue);
|
|
1251
|
-
}
|
|
1252
|
-
}
|
|
1253
|
-
async computeCustomValidators() {
|
|
1254
|
-
let mgControl = this._parentObj;
|
|
1255
|
-
let evaluated = true;
|
|
1256
|
-
if (mgControl.ModifiedByUser || mgControl.ValidateControl || this.GetTaskByParentObject().IsInRecompute()) {
|
|
1257
|
-
for (let [customPropertyKey, customValidatorProperty] of this.customValidatorProperties) {
|
|
1258
|
-
let expression = customValidatorProperty._exp;
|
|
1259
|
-
let isInValid = await this.GetRetrunValueForCustomPropertyExpression(expression);
|
|
1260
|
-
let errString = "";
|
|
1261
|
-
let InValid = (isInValid === "1") ? true : false;
|
|
1262
|
-
if (InValid) {
|
|
1263
|
-
expression = customValidatorProperty._errorMessageExp;
|
|
1264
|
-
if (expression > 0)
|
|
1265
|
-
errString = await this.GetRetrunValueForCustomPropertyExpression(expression);
|
|
1266
|
-
else
|
|
1267
|
-
errString = customValidatorProperty._errorMessage;
|
|
1268
|
-
}
|
|
1269
|
-
evaluated = true;
|
|
1270
|
-
this.customValidatorValues.set(customPropertyKey, new CustomValidator(!InValid, errString));
|
|
1271
|
-
}
|
|
1272
|
-
}
|
|
1273
|
-
else {
|
|
1274
|
-
if (mgControl.isRepeatable()) {
|
|
1275
|
-
this.customValidatorValues.clear();
|
|
1276
|
-
evaluated = false;
|
|
1277
|
-
}
|
|
1278
|
-
}
|
|
1279
|
-
return evaluated;
|
|
1280
|
-
}
|
|
1281
|
-
onCustomProperties() {
|
|
1282
|
-
for (let [customPropertyKey, customPropertyValue] of this.customPropertiesValues) {
|
|
1283
|
-
Commands.addOperationWithLine(CommandType.PROP_SET_USER_PROPERTY, this._parentObj, this.getLine(), customPropertyKey, customPropertyValue);
|
|
1284
|
-
}
|
|
1285
|
-
}
|
|
1286
|
-
onCustomValidators() {
|
|
1287
|
-
for (let [customPropertyKey, customPropertyValue] of this.customValidatorValues) {
|
|
1288
|
-
Commands.addOperationWithLine(CommandType.PROP_SET_CUSTOM_VALIDATOR, this._parentObj, this.getLine(), customPropertyKey, customPropertyValue);
|
|
1289
|
-
}
|
|
1290
|
-
}
|
|
1291
|
-
onBindingLevel() {
|
|
1292
|
-
if (this._parentType === GuiConstants.PARENT_TYPE_CONTROL)
|
|
1293
|
-
Commands.addOperationWithLine(CommandType.SET_PROPERTY, this.getObjectByParentObj(), this.getLine(), HtmlProperties.BindingLevel, this.GetComputedValueInteger());
|
|
1294
|
-
else
|
|
1295
|
-
throw new ApplicationException("in Property.BindingLevel()");
|
|
1296
|
-
}
|
|
1297
|
-
onAutoCompleteMode() {
|
|
1298
|
-
}
|
|
1299
|
-
async GetRetrunValueForCustomPropertyExpression(expression) {
|
|
1300
|
-
let len = 255;
|
|
1301
|
-
let expStorageAttribute = this._parentObj.GetExpressionStorage(expression);
|
|
1302
|
-
let wasEvaluated = new RefParam(false);
|
|
1303
|
-
let returnValue = await this._parentObj.EvaluateExpression(expression, expStorageAttribute, len, true, StorageAttribute.SKIP, false, wasEvaluated);
|
|
1304
|
-
expStorageAttribute = this._parentObj.GetExpressionStorage(expression);
|
|
1305
|
-
let compIdx = this._parentObj.getCompIdx();
|
|
1306
|
-
switch (expStorageAttribute) {
|
|
1307
|
-
case StorageAttribute.NUMERIC:
|
|
1308
|
-
let tempPic = new PIC("N6.2", StorageAttribute.NUMERIC, this._parentObj.getCompIdx());
|
|
1309
|
-
if (returnValue == null)
|
|
1310
|
-
returnValue = "FF00000000000000000000000000000000000000";
|
|
1311
|
-
returnValue = DisplayConvertor.Instance.mg2disp(returnValue, "", tempPic, false, compIdx, false).trim();
|
|
1312
|
-
break;
|
|
1313
|
-
case StorageAttribute.DATE:
|
|
1314
|
-
tempPic = new PIC("##/##/####", expStorageAttribute, compIdx);
|
|
1315
|
-
returnValue = DisplayConvertor.Instance.mg2disp(returnValue, "", tempPic, true, false, compIdx, true);
|
|
1316
|
-
break;
|
|
1317
|
-
case StorageAttribute.TIME:
|
|
1318
|
-
tempPic = new PIC("##:##/####", expStorageAttribute, compIdx);
|
|
1319
|
-
returnValue = DisplayConvertor.Instance.mg2disp(returnValue, "", tempPic, true, false, compIdx, true);
|
|
1320
|
-
break;
|
|
1321
|
-
case StorageAttribute.ALPHA:
|
|
1322
|
-
case StorageAttribute.BOOLEAN:
|
|
1323
|
-
case StorageAttribute.BLOB:
|
|
1324
|
-
case StorageAttribute.BLOB_VECTOR:
|
|
1325
|
-
case StorageAttribute.UNICODE:
|
|
1326
|
-
case StorageAttribute.NONE:
|
|
1327
|
-
break;
|
|
1328
|
-
default:
|
|
1329
|
-
throw new ApplicationException("in Property.GetRetrunValueForCustomPropertyExpression() illegal data type: " + expStorageAttribute);
|
|
1330
|
-
}
|
|
1331
|
-
return returnValue;
|
|
1332
|
-
}
|
|
1333
|
-
RemovePrevValIndexAt(idx) {
|
|
1334
|
-
if (this._prevValues.length > idx) {
|
|
1335
|
-
this._prevValues.RemoveAt(idx);
|
|
1336
|
-
}
|
|
1337
|
-
}
|
|
1338
|
-
InsertPrevValAt(idx) {
|
|
1339
|
-
this._prevValues.Insert(idx, null);
|
|
1340
|
-
}
|
|
1341
|
-
resetPrevValAt(idx) {
|
|
1342
|
-
if (idx >= 0 && idx < this._prevValues.length)
|
|
1343
|
-
this._prevValues.set_Item(idx, null);
|
|
1344
|
-
}
|
|
1345
|
-
toString() {
|
|
1346
|
-
return NString.Format("{0} = {1} (exp={2}, studio value={3})", [
|
|
1347
|
-
PropDefaults.GetPropertyName(this._id), (this._val === null) ? "is null" : this._val, this._expId, this.StudioValue
|
|
1348
|
-
]);
|
|
1349
|
-
}
|
|
1350
|
-
static getDefaultProp(propId, parentType, propParent) {
|
|
1351
|
-
let prop = null;
|
|
1352
|
-
let mgVal = PropDefaults.getDefaultValue(propId, parentType, propParent);
|
|
1353
|
-
if (mgVal !== null)
|
|
1354
|
-
prop = new Property(propId, propParent, parentType, mgVal);
|
|
1355
|
-
return prop;
|
|
1356
|
-
}
|
|
1357
|
-
InsertPrevValueArray(count) {
|
|
1358
|
-
if (!this.ShouldSkipRefresh())
|
|
1359
|
-
this._prevValues.InsertRange(new Array(count));
|
|
1360
|
-
}
|
|
1361
|
-
}
|
|
1362
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcGVydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL1Byb3BlcnR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLEtBQUssRUFDTCxJQUFJLEVBQ0osT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLEVBQ1IsYUFBYSxFQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLFNBQVMsRUFFVCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsVUFBVSxFQUNWLGVBQWUsRUFDZixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFFekYsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxXQUFXLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSTVDLE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsSUFBSSxDQUFTO0lBQ2IsZ0JBQWdCLENBQVM7SUFDekIs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QUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztZQUN4QyxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQyxLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQyxLQUFLLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQztZQUM1QyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztZQUN4QyxLQUFLLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztZQUMxQyxLQUFLLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztZQUN0QyxLQUFLLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztZQUN2QyxLQUFLLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztZQUN2QyxLQUFLLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztZQUMxQyxLQUFLLGFBQWEsQ0FBQyxtQ0FBbUMsQ0FBQztZQUN2RCxLQUFLLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQztZQUNoRCxLQUFLLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQztZQUM5QyxLQUFLLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztZQUN4QyxLQUFLLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQztZQUN6QyxLQUFLLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQztZQUNqRCxLQUFLLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQztZQUNoRCxLQUFLLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztZQUMxQyxLQUFLLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQyxLQUFLLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQyxLQUFLLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQztZQUM3QyxLQUFLLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztZQUMxQyxLQUFLLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQyxLQUFLLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQztZQUNsRCxLQUFLLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztZQUN4QyxLQUFLLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQztZQUM1QyxLQUFLLGFBQWEs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O1FBQ04sT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLHVDQUF1QyxFQUFFO1lBQzdELFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDcEgsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQVVELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBYyxFQUFFLFVBQWtCLEVBQUUsVUFBK0I7UUFDdkYsSUFBSSxJQUFJLEdBQWEsSUFBSSxDQUFDO1FBQzFCLElBQUksS0FBSyxHQUFXLFlBQVksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVqRixJQUFJLEtBQUssS0FBSyxJQUFJO1lBQ2hCLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUU3RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFhO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBJbnQzMixcclxuICBMaXN0LFxyXG4gIE5OdW1iZXIsXHJcbiAgTlN0cmluZyxcclxuICBSZWZQYXJhbSxcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBDdHJsQnV0dG9uVHlwZUd1aSxcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdHJVdGlsLFxyXG4gIFV0aWxJbWVKcG4sXHJcbiAgVXRpbFN0ckJ5dGVNb2RlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtUYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyfSBmcm9tICcuLi90YXNrcy9UYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyJztcclxuaW1wb3J0IHtQcm9wUGFyZW50SW50ZXJmYWNlfSBmcm9tICcuLi8uLi9ndWkvUHJvcFBhcmVudEludGVyZmFjZSc7XHJcbmltcG9ydCB7UElDfSBmcm9tICcuL1BJQyc7XHJcbmltcG9ydCB7VGFza0RlZmluaXRpb25JZH0gZnJvbSAnLi4vdGFza3MvVGFza0RlZmluaXRpb25JZCc7XHJcbmltcG9ydCB7RXZlbnRzfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQge0d1aUNvbnN0YW50c30gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHtQcm9wSW50ZXJmYWNlfSBmcm9tICcuL1Byb3BJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXJ9IGZyb20gJy4vR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcic7XHJcbmltcG9ydCB7RGlzcGxheUNvbnZlcnRvcn0gZnJvbSAnLi9EaXNwbGF5Q29udmVydG9yJztcclxuaW1wb3J0IHtHdWlGb3JtUHJvcGVydHlBZGFwdGVyfSBmcm9tICcuL0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXInO1xyXG5pbXBvcnQge0NvbW1hbmRzfSBmcm9tICcuLi8uLi9Db21tYW5kcyc7XHJcbmltcG9ydCB7Q29tbWFuZFR5cGUsIEh0bWxQcm9wZXJ0aWVzfSBmcm9tICcuLi8uLi9HdWlFbnVtcyc7XHJcbmltcG9ydCB7R3VpVGFza0Jhc2V9IGZyb20gJy4uL3Rhc2tzL0d1aVRhc2tCYXNlJztcclxuaW1wb3J0IHtQcm9wRGVmYXVsdHN9IGZyb20gJy4vUHJvcERlZmF1bHRzJztcclxuaW1wb3J0IHtUb29sVGlwSGVscH0gZnJvbSAnLi9IZWxwcyc7XHJcbmltcG9ydCB7TWdDb250cm9sQmFzZX0gZnJvbSAnLi9NZ0NvbnRyb2xCYXNlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21WYWxpZGF0b3JQcm9wIHtcclxuICBfZXhwOiBudW1iZXI7XHJcbiAgX2Vycm9yTWVzc2FnZUV4cDogbnVtYmVyO1xyXG4gIF9lcnJvck1lc3NhZ2U6IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21WYWxpZGF0b3Ige1xyXG4gIF92YWxpZDogYm9vbGVhbjtcclxuICBfZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZhbGlkOiBib29sZWFuLCBlcnJNZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3ZhbGlkID0gdmFsaWQ7XHJcbiAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBlcnJNZXNzYWdlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzVmFsaWQoKTogYm9vbGVhbiB7cmV0dXJuIHRoaXMuX3ZhbGlkO31cclxuICBwdWJsaWMgZ2V0RXJyTWVzc2FnZSgpOiBzdHJpbmcge3JldHVybiB0aGlzLl9lcnJvck1lc3NhZ2U7fVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFByb3BlcnR5IG9iamVjdCBvZiBjb250cm9sLCBmb3JtIG9yIHRhc2suXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eSB7XHJcbiAgcHJpdmF0ZSBfaWQ6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByaXZhdGUgX2RhdGFUeXBlOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIHByaXZhdGUgX3ZhbDogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9waWM6IFBJQyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZXhwSWQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfcGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlID0gbnVsbDsgLy8gYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvYmplY3QgKENvbnRyb2wsIEZvcm0sIEd1aVRhc2tCYXNlKVxyXG4gIHByaXZhdGUgX3BhcmVudFR5cGU6IHN0cmluZyA9IG51bGw7IC8vIENvbnRyb2x8Rm9ybXxHdWlUYXNrQmFzZVxyXG4gIHByaXZhdGUgX3ByZXZWYWx1ZXM6IExpc3Q8c3RyaW5nPiA9IG51bGw7IC8vIHJldmVyZW5jZSB0byBwcm9wZXJ0eSB2YWx1ZXMgaW4gYSB0YWJsZVxyXG4gIHByaXZhdGUgX29yZ1ZhbHVlOiBzdHJpbmcgPSBudWxsOyAvLyByZXZlcmVuY2UgdG8gcHJvcGVydHkgdmFsdWVzIGluIGEgdGFibGVcclxuICBwcml2YXRlIHN0YXRpYyBfbnVtZXJpY1Byb3BlcnR5UGljOiBQSUMgPSBudWxsO1xyXG4gIHByaXZhdGUgX3Rhc2tEZWZpbml0aW9uSWQ6IFRhc2tEZWZpbml0aW9uSWQgPSBudWxsOyAvLyB0YXNrIGRlZmluaXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eS5cclxuICAvLyBzdHVkaW9WYWx1ZSBmb3Igb2ZmbGluZSBzdGF0ZVxyXG4gIC8vIFRvRG86IGNvbW1lbnQgc2F5cyB0aGF0IGl0IGlzIGZvciBcIk9mZmxpbmUgc3RhdGVcIi4gU28sIGRvIHdlIG5lZWQgaXQgaW5XZWJDbGllbnQ/XHJcbiAgU3R1ZGlvVmFsdWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZXhwQWxyZWFkeUNvbXB1dGVkT25jZTogYm9vbGVhbiA9IGZhbHNlOyAvLyB0aGUgZXhwcmVzc2lvbiBpcyBhbHJlYWR5IGNvbXB1dGVkIG9uY2VcclxuXHJcbiAgLy8gZm9yIHdlYiBjbGllbnQgOlxyXG4gIC8vIHNhdmUgdGhlIGN1c3RvbSBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIGJ5IHRoZSB1c2VyXHJcbiAgcHJpdmF0ZSBjdXN0b21Qcm9wZXJ0aWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgY3VzdG9tUHJvcGVydGllc1ZhbHVlczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgLy8gZm9yIHdlYiBjbGllbnQgOlxyXG4gIC8vIHNhdmUgdGhlIGN1c3RvbSB2YWxpZGF0b3JzIHRoYXQgZGVmaW5lIGJ5IHRoZSB1c2VyXHJcbiAgcHJpdmF0ZSBjdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzOiBNYXA8c3RyaW5nLCBDdXN0b21WYWxpZGF0b3JQcm9wPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIGN1c3RvbVZhbGlkYXRvclZhbHVlczogTWFwPHN0cmluZywgQ3VzdG9tVmFsaWRhdG9yPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgc3RhdGljIFV0aWxJbWVKcG46IFV0aWxJbWVKcG4gPSAoVXRpbFN0ckJ5dGVNb2RlLmlzTG9jYWxlRGVmTGFuZ0pQTigpID8gbmV3IFV0aWxJbWVKcG4oKSA6IG51bGwpOyAvLyBKUE46IElNRSBzdXBwb3J0XHJcblxyXG4gIC8vIHRhc2sgZGVmaW5pdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5LlxyXG4gIGdldCBUYXNrRGVmaW5pdGlvbklkKCk6IFRhc2tEZWZpbml0aW9uSWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tEZWZpbml0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcpO1xyXG4gIGNvbnN0cnVjdG9yKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHZhbDogc3RyaW5nKTtcclxuICBjb25zdHJ1Y3RvcihjSWQ/OiBudW1iZXIsIGNQYXJlbnRPYmo/OiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlPzogc3RyaW5nLCB2YWw/OiBzdHJpbmcpIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuXHJcbiAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEoY0lkLCBjUGFyZW50T2JqLCBwYXJUeXBlKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5jb25zdHJ1Y3Rvcl8yKGNJZCwgY1BhcmVudE9iaiwgcGFyVHlwZSwgdmFsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMgPSBuZXcgTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgdGhpcy5zZXRJZChjSWQpO1xyXG4gICAgdGhpcy5fcGFyZW50T2JqID0gY1BhcmVudE9iajtcclxuICAgIHRoaXMuX3BhcmVudFR5cGUgPSBwYXJUeXBlO1xyXG4gICAgdGhpcy5zZXREYXRhVHlwZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8yKGNJZDogbnVtYmVyLCBjUGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEoY0lkLCBjUGFyZW50T2JqLCBwYXJUeXBlKTtcclxuICAgIHRoaXMuc2V0VmFsdWUodmFsKTtcclxuICAgIHRoaXMuc2V0T3JnVmFsdWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGlkIG9mIHRoaXMgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgc2V0SWQoY0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2lkID0gY0lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE5lZWQgcGFydCBpbnB1dCBTdHJpbmcgdG8gcmVsZXZhbnQgZm9yIHRoZSBjbGFzcyBkYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFJlZlwiPnJlZmVyZW5jZSB0byBwYXJlbnQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBmaWxsRGF0YShwYXJlbnRSZWY6IFByb3BQYXJlbnRJbnRlcmZhY2UsIHBhclR5cGU6IHN0cmluZywgcGFyc2VyOiBYbWxQYXJzZXIpIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoXCI+XCIsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudE9iaiA9PT0gbnVsbCAmJiBwYXJlbnRSZWYgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fcGFyZW50T2JqID0gcGFyZW50UmVmO1xyXG4gICAgICB0aGlzLl9wYXJlbnRUeXBlID0gcGFyVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApICsgWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIGlmIChFdmVudHMuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQpKSB7XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJJbiBQcm9wLkZpbGxEYXRhKCk6IHswfVwiLCB0b2tlbnNWZWN0b3IudG9TdHJpbmcoKSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3IpO1xyXG5cclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRS5sZW5ndGgpO1xyXG5cclxuICAgICAgLy8gZGVhbCB3aXRoIGludGVybmFsIHRhZ3NcclxuICAgICAgdGhpcy5Jbml0SW5uZXJPYmplY3RzKHBhcnNlcik7XHJcblxyXG4gICAgICAvLyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyB0eXBlcyBuZWVkIHNldCBwYXJhbWV0ZXJzIHRvIHRoZSBwYXJlbnQgLSBDT05UUk9MIChpbiB0aGlzIGNhc2UpXHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTClcclxuICAgICAgICB0aGlzLnNldENvbnRyb2xBdHRyaWJ1dGVzKCk7XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNKVxyXG4gICAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuU2V0U2l6ZSgxKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJJbiBQcm9wZXJ0eS5GaWxsRGF0YSgpOiBPdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgSW5pdElubmVyT2JqZWN0cyh4bWxQYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IG5leHRUYWc6IHN0cmluZyA9IHhtbFBhcnNlci5nZXROZXh0VGFnKCk7XHJcblxyXG4gICAgaWYgKG5leHRUYWcgPT09IFhNTENvbnN0YW50cy5NR19UQUdfVEFTS0RFRklOSVRJT05JRF9FTlRSWSkge1xyXG4gICAgICBsZXQgeG1sQnVmZmVyOiBzdHJpbmcgPSB4bWxQYXJzZXIuUmVhZFRvRW5kT2ZDdXJyZW50RWxlbWVudCgpO1xyXG4gICAgICB0aGlzLkluaXRUYXNrRGVmaW5pdGlvbklkKHhtbEJ1ZmZlcik7XHJcblxyXG4gICAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0geG1sUGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfUFJPUCArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHhtbFBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICAgIHhtbFBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIChYTUxDb25zdGFudHMuTUdfVEFHX1BST1AgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1ha2UgaW5pdGlhbGl6YXRpb24gb2YgcHJpdmF0ZSBlbGVtZW50cyBieSBmb3VuZCB0b2tlbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+Zm91bmQgdG9rZW5zLCB3aGljaCBjb25zaXN0IGF0dHJpYnV0ZS92YWx1ZSBvZiBldmVyeSBmb3VuZCBlbGVtZW50IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0RWxlbWVudHModG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4pOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lEOlxyXG4gICAgICAgICAgdGhpcy5zZXRJZChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB0aGlzLnNldERhdGFUeXBlKCk7IC8vIFRoZSAnbmFtZScgbWVtYmVyIG11c3QgYmUgZm91bmQgaW4gdGhpcyBwb2ludFxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9TVFVESU9fVkFMVUU6XHJcbiAgICAgICAgICB0aGlzLlN0dWRpb1ZhbHVlID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUU6XHJcbiAgICAgICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9QUk9QRVJUSUVTKSB7XHJcbiAgICAgICAgICAgIHRoaXMuSW5pdEN1c3RvbVByb3BlcnRpZXMoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKSB7XHJcbiAgICAgICAgICAgIHRoaXMuSW5pdEN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbCA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9FWFA6XHJcbiAgICAgICAgICB0aGlzLl9leHBJZCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2V4cElkID4gMCAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9PTFRJUClcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRhVHlwZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OQU1FOlxyXG4gICAgICAgICAgLy8gTmFtZSBpcyBvbmx5IHNlcmlhbGl6ZWQgZm9yIGRlYnVnIHZlcnNpb24gLlxyXG4gICAgICAgICAgLy8gVG8gYXZvaWQgZXhjZXB0aW9ucywgYWRkIGEgYmxhbmsgY2FzZSBmb3IgaXRcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ1RMX0lEWDpcclxuICAgICAgICAgIHRoaXMuX3Rhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXggPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUFJPR1JBTV9JU046XHJcbiAgICAgICAgICB0aGlzLl90YXNrRGVmaW5pdGlvbklkLlByb2dyYW1Jc24gPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIFByb3BlcnR5IGNsYXNzLiBJbnNlcnQgY2FzZSB0byBQcm9wZXJ0eS5pbml0RWxlbWVudHMgZm9yIHswfVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgY29tcHV0ZSBpbiB0aGUgc2VydmVyICwgdGhlbiBzZXQgX2V4cEFscmVhZHlDb21wdXRlZE9uY2VcclxuICAgICAgaWYgKHRoaXMuSXNDb21wdXRlZE9uY2VPblNlcnZlcigpKVxyXG4gICAgICAgIHRoaXMuX2V4cEFscmVhZHlDb21wdXRlZE9uY2UgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0IHRoZSBjdXN0b20gcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBJbml0Q3VzdG9tUHJvcGVydGllcyhjdXN0b21Qcm9wcnRpZXNTdHI6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oSlNPTi5wYXJzZShjdXN0b21Qcm9wcnRpZXNTdHIpKTtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRPYmouSXNGaXJzdFJlZnJlc2hPZlByb3BzKCkpXHJcbiAgICAgIHRoaXMuU2V0Rmlyc3RWYWx1ZUZvckN1c3RvbVByb3BlcnRpZXMoKTtcclxuICB9XHJcblxyXG4gIC8vIEluaXQgQ3VzdG9tVmFsaWRhdG9yXHJcbiAgcHJpdmF0ZSBJbml0Q3VzdG9tVmFsaWRhdG9yIChwYXJzZXIgOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgdGV4dDogc3RyaW5nID0gcGFyc2VyLlJlYWRUb0VuZE9mQ3VycmVudEVsZW1lbnQoKTtcclxuICAgIHRleHQgPSB0ZXh0LnN1YnN0cih0ZXh0LmluZGV4T2YoWE1MQ29uc3RhbnRzLk1HX1RBR19DVVNUT01fVkFMSURBVE9SKSArIFhNTENvbnN0YW50cy5NR19UQUdfQ1VTVE9NX1ZBTElEQVRPUi5sZW5ndGgpO1xyXG4gICAgbGV0IHRva2VuczogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2Vucyh0ZXh0LCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgIGxldCBjID0gbmV3IEN1c3RvbVZhbGlkYXRvclByb3AoKTtcclxuICAgIGxldCBrZXk7XHJcblxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b2tlbnMubGVuZ3RoOyBqICs9IDIpXHJcbiAgICB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShqKTtcclxuICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSB0b2tlbnMuZ2V0X0l0ZW0oaiArIDEpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0VYUDpcclxuICAgICAgICAgIGMuX2V4cCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OQU1FOlxyXG4gICAgICAgICAga2V5ID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfRVJST1JfRVhQOlxyXG4gICAgICAgICAgYy5fZXJyb3JNZXNzYWdlRXhwID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0VSUk9SOlxyXG4gICAgICAgICAgYy5fZXJyb3JNZXNzYWdlID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzLnNldCAoa2V5LCBjKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdCB0aGUgY3VzdG9tIHZhbGlkYXRpb24gcHJvcGVydGllc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBJbml0Q3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoY3VzdG9tUHJvcHJ0aWVzU3RyOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgcGFyc2VyID0gbmV3IFhtbFBhcnNlcihjdXN0b21Qcm9wcnRpZXNTdHIpO1xyXG4gICAgbGV0IGN1cnJUYWdOYW1lID0gcGFyc2VyLmdldE5leHRUYWcoKTtcclxuICAgIHdoaWxlIChjdXJyVGFnTmFtZSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBzd2l0Y2ggKGN1cnJUYWdOYW1lKVxyXG4gICAgICB7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0NVU1RPTV9WQUxJREFUT1JTOlxyXG4gICAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICAgICAgdGhpcy5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzID0gbmV3IE1hcDxzdHJpbmcsIEN1c3RvbVZhbGlkYXRvclByb3A+KCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfQ1VTVE9NX1ZBTElEQVRPUjpcclxuICAgICAgICAgIHRoaXMuSW5pdEN1c3RvbVZhbGlkYXRvciAocGFyc2VyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjdXJyVGFnTmFtZSA9IHBhcnNlci5nZXROZXh0VGFnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudE9iai5Jc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKSlcclxuICAgICAgdGhpcy5TZXRGaXJzdFZhbHVlRm9yQ3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIFNldEZpcnN0VmFsdWVGb3JDdXN0b21WYWxpZGF0aW9uUHJvcGVydGllcygpOiB2b2lkIHtcclxuXHJcbiAgICAgIGZvciAobGV0IGN1c3RvbVByb3BlcnR5IG9mIHRoaXMuY3VzdG9tVmFsaWRhdG9yUHJvcGVydGllcy5rZXlzKCkpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVZhbGlkYXRvclZhbHVlcy5zZXQoPHN0cmluZz5jdXN0b21Qcm9wZXJ0eSwgbmV3IEN1c3RvbVZhbGlkYXRvcih0cnVlLCBcIlwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIGZyb20gdGhlIHZhbHVlIHN0cmluZyBhbmQgc2F2ZSBpdCBpbiB2YWwgJiBvcmdWYWx1ZVxyXG4gICAgdGhpcy5fdmFsID0gdGhpcy5HZXRBcnJheVZhbHVlc0ZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKClcclxuICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBHZXRBcnJheVZhbHVlc0ZvckN1c3RvbVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk6IHN0cmluZ3tcclxuICAgIGxldCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY3VzdG9tVmFsaWRhdG9yVmFsdWVzLnZhbHVlcygpKTtcclxuICAgIGxldCB2YWx1ZXNTdHIgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpO1xyXG4gICAgcmV0dXJuIHZhbHVlc1N0cjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgR2V0QXJyYXlWYWx1ZXNGb3JDdXN0b21Qcm9wZXJ0aWVzKCk6IHN0cmluZ3tcclxuICAgIGxldCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY3VzdG9tUHJvcGVydGllc1ZhbHVlcy52YWx1ZXMoKSk7XHJcbiAgICBsZXQgdmFsdWVzU3RyID0gSlNPTi5zdHJpbmdpZnkodmFsdWVzKTtcclxuICAgIHJldHVybiB2YWx1ZXNTdHI7XHJcbn1cclxuXHJcbiAgcHJpdmF0ZSBTZXRGaXJzdFZhbHVlRm9yQ3VzdG9tUHJvcGVydGllcygpOiB2b2lkIHtcclxuXHJcbiAgICBmb3IgKGxldCBjdXN0b21Qcm9wZXJ0eSBvZiB0aGlzLmN1c3RvbVByb3BlcnRpZXMua2V5cygpKVxyXG4gICAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXNWYWx1ZXMuc2V0KDxzdHJpbmc+Y3VzdG9tUHJvcGVydHksIFwiXCIpO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBmcm9tIHRoZSB2YWx1ZSBzdHJpbmcgYW5kIHNhdmUgaXQgaW4gdmFsICYgb3JnVmFsdWVcclxuICAgIHRoaXMuX3ZhbCA9IHRoaXMuR2V0QXJyYXlWYWx1ZXNGb3JDdXN0b21Qcm9wZXJ0aWVzKClcclxuICAgIHRoaXMuX29yZ1ZhbHVlID0gdGhpcy5fdmFsO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBwcml2YXRlIEluaXRUYXNrRGVmaW5pdGlvbklkKHhtbEJ1ZmZlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgdGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlcjogVGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlciA9IG5ldyBUYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyKHRoaXMuU2V0VGFza0RlZmluaXRpb25JZCk7XHJcbiAgICB0YXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyLnBhcnNlKHhtbEJ1ZmZlcik7XHJcbiAgfVxyXG5cclxuICAvLyBjYWxsYmFjayBmb3IgVGFza0RlZmluaXRpb25JZFRhYmxlU2F4SGFuZGxlclxyXG4gIFNldFRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogVGFza0RlZmluaXRpb25JZCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdGFza0RlZmluaXRpb25JZCA9IHRhc2tEZWZpbml0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERhdGFUeXBlKCk6IHZvaWQge1xyXG4gICAgbGV0IGNvbXBJZHg6IG51bWJlciA9IHRoaXMuX3BhcmVudE9iai5nZXRDb21wSWR4KCk7XHJcblxyXG4gICAgdGhpcy5fcGljID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5faWQgPT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVG8gZmlsbCBkYXRhVHlwZSBtZW1iZXIgaW4gUHJvcGVydHkuRmlsbERhdGFUeXBlIG11c3QgaWQhPXswfVwiLCBJbnQzMi5NaW5WYWx1ZSkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RJVExFX0JBUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQk9SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFQlJFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlk6XHJcblxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TWVNURU1fTUVOVTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0RFTEVURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19MT0NBVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU09SVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfSU5ERVg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFX0lOX1FVRVJZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9ERUxFVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRklBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX0NBTkNFTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVBFQVRBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hJR0hMSUdIVElORzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVNTV09SRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSVNfQ0FDSEVEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSRUxPQURfVklFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkVfVkVSVElDQUxfU0NST0xMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORV9BTExPV19DUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DT0xfUkVTSVpFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1JFT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0hPV19MSU5FUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TT1JUX0NPTFVNTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT0xfQUxMT1dfRklMVEVSSU5HOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfU1RBVFVTX0JBUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVVRPX1JFRlJFU0g6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSS19PTl9DTElDSzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TSE9XX0ZVTExfUk9XOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RSQUNLX1NFTEVDVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TSE9XX0JVVFRPTlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElORVNfQVRfUk9PVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19FTVBUWV9EQVRBVklFVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TQ1JPTExfQkFSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTFVNTl9ESVZJREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTkVfRElWSURFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9USFJFRV9TVEFURVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19PUFRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVUQUlOX0ZPQ1VTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEE6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ0xPU0VfVEFTS1NfQllfTURJX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREFUQVZJRVdDT05UUk9MOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19PUEVOX1RBU0tfV0lORE9XOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19FVkVOVFM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0lOREVYX09QVElNSVpBVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUkFOR0U6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0xPQ0FURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUE9TSVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1NRTF9SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CRUZPUkVfOTAwX1ZFUlNJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRklMTF9XSURUSDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSV9DT0xVTU5fRElTUExBWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19ST1VURVJfT1VUTEVUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RFRkFVTFRfT1VUTEVUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFUlZFUl9SRUFEX0FIRUFEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fQ09NUExFVEVfTU9ERV9XQzpcclxuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVZBTF9FTkRfQ09ORElUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZSQU1FX05BTUU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UUkFTQUNUSU9OX0JFR0lOOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19UUkFOU0FDVElPTl9NT0RFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dBTExQQVBFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVFRSSUJVVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJJR0dFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RfTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX0lEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfQ1lDTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEFSQU1FVEVSUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9MSVNUX0lOREVYRVM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRV9MQVlFUlNfTElTVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PQkpFQ1RfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRUFMX09CSkVDVF9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEFWSUVXQ09OVFJPTF9GSUVMRFM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1JBTkdFX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19MT0NBVEVfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1BPU0lUSU9OX1VTQUdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fUFJPUEVSVElFUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVJLX0ZJUlNUX09OOlxyXG4gICAgICAgIHRoaXMuX2RhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ09MVU1OX1RJVExFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RJU1BMQVlfTElTVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNQVQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFOR0U6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STV9OQU1FOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FERElUSU9OQUxfSU5GT1JNQVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEVYVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ISU5UOlxyXG4gICAgICAgIHRoaXMuX2RhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9VT006XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSE9SX0ZBQzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WRVJfRkFDOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQl9PUkRFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XQUxMUEFQRVJfU1RZTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU5ERVg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElOS19GSUVMRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0ZJRUxEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BVTExET1dOX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfV0lORE9XX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfU1RZTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19GSVQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFJU0VfQVQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRVhQQU5EX1dJTkRPVzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFX0xJTkVTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NIT0lDRV9DT0xVTU5TOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NUWUxFXzNEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPTlQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFZRVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfV0lEVEg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVElUTEVfSEVJR0hUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTE9SOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xFRlQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9QOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RPT0xUSVA6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSEVMUF9TQ1I6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTElORVNfSU5fVEFCTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUSU9OX1JPV1M6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSE9SSVpPTlRBTF9BTElHTk1FTlQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVMVElMSU5FX1dPUkRXUkFQX1NDUk9MTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ST1dfSEVJR0hUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJTkRPV19XSURUSDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NQUlOX0RJU1BMQVk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJBTlNMQVRPUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRVNFVF9TVFlMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRV9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XRURfRElSRUNUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JPV19ISUdITElHSFRfU1RZTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVkVSVElDQUxfQUxJR05NRU5UOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU1RBVElDX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQlVUVE9OX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xPQURfSU1BR0VfRlJPTTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TVUJGT1JNX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQk9UVE9NX1BPU0lUSU9OX0lOVEVSVkFMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTl9NT0RFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSR1RTS19OVU06XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEVSU0lTVEVOVF9GT1JNX1NUQVRFX1ZFUlNJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0NST0xMX0JBUl9USFVNQjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CSU5ESU5HX0xFVkVMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTk5FQ1RFRF9aT09NX0NPTlRST0w6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfU0VMRUNUX1BST0dSQU06XHJcbiAgICAgICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UT09MVElQICYmIHRoaXMuX2V4cElkID4gMClcclxuICAgICAgICAgIHRoaXMuX2RhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFO1xyXG4gICAgICAgIC8vIHBpYyB3aWxsIGJlIHNldCBhY2NvcmRpbmcgdG8gZXhwIGxlbmd0aFxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGF0YVR5cGUgPSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM7XHJcbiAgICAgICAgICBpZiAoUHJvcGVydHkuX251bWVyaWNQcm9wZXJ0eVBpYyA9PSBudWxsKVxyXG4gICAgICAgICAgICBQcm9wZXJ0eS5fbnVtZXJpY1Byb3BlcnR5UGljID0gbmV3IFBJQyhcIk42XCIsIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQywgY29tcElkeCk7XHJcbiAgICAgICAgICB0aGlzLl9waWMgPSBQcm9wZXJ0eS5fbnVtZXJpY1Byb3BlcnR5UGljO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRVRVUk5fQUNUSU9OOlxyXG4gICAgICAgIHRoaXMuX2RhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEE6XHJcbiAgICAgICAgdGhpcy5fZGF0YVR5cGUgPSAoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLkRhdGFUeXBlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BPUF9VUDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9PUklFTlRBVElPTl9MT0NLOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOVEVSX0FOSU1BVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FWElUX0FOSU1BVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQVZJR0FUSU9OX0RSQVdFUl9NRU5VOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FDVElPTl9CQVJfTUVOVTpcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1BFTl9QSUNLRVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfT1BFTl9FRElUX0RJQUxPRzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ERUZBVUxUX0FMSUdOTUVOVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9LRVlCT0FSRF9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0tFWUJPQVJEX1JFVFVSTl9LRVk6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU1VHR0VTVElPTlM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9CSUxFX0lNQUdFX0xJU1RfRklMRV9OQU1FOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NXSVBFX1JFRlJFU0g6XHJcbiAgICAgICAgLy8gTm8gaGFuZGxpbmcgaXMgbmVlZGVkIGhlcmUgYXMgdGhlIHByb3BlcnRpZXMgYXJlIHZhbGlkIGZvciBtb2JpbGUgYXMgZm9yIG5vdy5cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIFByb3BlcnR5LnNldERhdGFUeXBlKCkgbm8gY2FzZSBmb3I6IHswfVwiLCB0aGlzLl9pZCkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhdHRyaWJ1dGVzIG9mIGEgdGhlIHBhcmVudCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldENvbnRyb2xBdHRyaWJ1dGVzKCkge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudE9iaiA9PSBudWxsIHx8IHRoaXMuX3BhcmVudFR5cGUgIT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiaW4gUHJvcGVydHkuc2V0Q29udHJvbEF0dHJpYnV0ZXMoKSB0aGVyZSBpcyBubyBwYXJlbnQgb3IgdGhlIHBhcmVudCBpcyBub3QgYSBjb250cm9sXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBhcmVudENvbnRyb2wgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GUkFNRV9OQU1FOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUU6XHJcbiAgICAgICAgcGFyZW50Q29udHJvbC5OYW1lID0gdGhpcy5fdmFsO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BVFRSSUJVVEU6XHJcbiAgICAgICAgcGFyZW50Q29udHJvbC5EYXRhVHlwZSA9IDxTdG9yYWdlQXR0cmlidXRlPnRoaXMuX3ZhbFswXTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUOlxyXG4gICAgICAgIHBhcmVudENvbnRyb2wuc2V0UGljU3RyKHRoaXMuX3ZhbCwgdGhpcy5fZXhwSWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SQU5HRTpcclxuICAgICAgICBwYXJlbnRDb250cm9sLnNldFJhbmdlKHRoaXMuX3ZhbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEE6XHJcbiAgICAgICAgaWYgKHRoaXMuX2V4cElkID4gMClcclxuICAgICAgICAgIHBhcmVudENvbnRyb2wuc2V0VmFsRXhwKHRoaXMuX2V4cElkKTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLl92YWwgIT0gbnVsbClcclxuICAgICAgICAgIHBhcmVudENvbnRyb2wuc2V0RmllbGQodGhpcy5fdmFsKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQlVUVE9OX1NUWUxFOlxyXG4gICAgICAgIGlmICh0aGlzLl92YWwgIT0gbnVsbClcclxuICAgICAgICAgIHBhcmVudENvbnRyb2wuQnV0dG9uU3R5bGUgPSA8Q3RybEJ1dHRvblR5cGVHdWk+dGhpcy5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQVlFUjpcclxuICAgICAgICBpZiAodGhpcy5fdmFsICE9IG51bGwpXHJcbiAgICAgICAgICBwYXJlbnRDb250cm9sLkxheWVyID0gdGhpcy5HZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBpZCBvZiB0aGUgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldElEKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5faWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYW5kIHRha2UgY2FyZSBvZiB0aGUgcHJlc2VudGF0aW9uIHRoZSB2YWx1ZSBtdXN0IGJlIGluIGEgbWFnaWMgaW50ZXJuYWxcclxuICAvLy8gICBmb3JtYXRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWxcIj50aGUgbmV3IHZhbHVlPC9wYXJhbT5cclxuICBzZXRWYWx1ZShtZ1ZhbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgY29tcElkeDogbnVtYmVyID0gdGhpcy5fcGFyZW50T2JqLmdldENvbXBJZHgoKTtcclxuXHJcbiAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEEgfHwgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05PREVfSUQgfHwgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05PREVfUEFSRU5USUQpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5fZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORSlcclxuICAgICAgdGhpcy5zZXREYXRhVHlwZSgpO1xyXG5cclxuICAgIHN3aXRjaCAodGhpcy5fZGF0YVR5cGUpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgaWYgKG1nVmFsID09IG51bGwpXHJcbiAgICAgICAgICBtZ1ZhbCA9IFwiRkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiO1xyXG4gICAgICAgIHRoaXMuX3ZhbCA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChtZ1ZhbCwgXCJcIiwgdGhpcy5fcGljLCBmYWxzZSwgY29tcElkeCwgZmFsc2UpLnRyaW0oKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJMT0I6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICAgIHRoaXMuX3ZhbCA9IG1nVmFsO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5zZXRWYWx1ZSgpIGlsbGVnYWwgZGF0YSB0eXBlOiBcIiArIHRoaXMuX2RhdGFUeXBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IGFuIGludCB2YWx1ZSBkaXJlY3RseSwgYXMgaXMgZG9uZSB3aGVuIGluaXRpYWxpemluZyB0aGUgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPjwvcGFyYW0+XHJcbiAgU2V0VmFsdWUodmFsOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ZhbCA9IFN0cmluZyh2YWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFuZCB0YWtlIGNhcmUgb2YgdGhlIHByZXNlbnRhdGlvbiB0aGUgdmFsdWUgbXVzdCBiZSBpbiBhIG1hZ2ljIGludGVybmFsIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0T3JnVmFsdWUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vcmdWYWx1ZSA9IHRoaXMuX3ZhbDtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgdGFzayBieSB0aGUgcGFyZW50IG9iamVjdDwvcmV0dXJucz5cclxuICBHZXRUYXNrQnlQYXJlbnRPYmplY3QoKTogR3VpVGFza0Jhc2Uge1xyXG4gICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0pXHJcbiAgICAgIHRhc2sgPSAoPEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLmdldFRhc2soKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKVxyXG4gICAgICB0YXNrID0gKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqKS5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX1RBU0spXHJcbiAgICAgIHRhc2sgPSA8R3VpVGFza0Jhc2U+dGhpcy5fcGFyZW50T2JqO1xyXG5cclxuICAgIHJldHVybiB0YXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGRpc3BsYXkgZm9yIGNvbnRyb2wgcHJvcGVydGllcyBhbmQgZm9ybSBwcm9wZXJ0aWVzIG9ubHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VSZWZyZXNoXCI+aWYgdHJ1ZSB0aGVuIHJlZnJlc2ggaXMgZm9yY2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXZpb3VzIHZhbHVlPC9wYXJhbT5cclxuICBhc3luYyBSZWZyZXNoRGlzcGxheShmb3JjZVJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlXaXRoQ3VycmVudExpbmUoZm9yY2VSZWZyZXNoLCBJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIFRSVUUgaWYgdGhlIHByb3BlcnR5IG5lZWQgdG8gYmUgc2tpcCBmcm9tIHRoZSByZWZyZXNoIHByb3BlcnRpZXMuIGZvciBhIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBTaG91bGRTa2lwUmVmcmVzaENvbnRyb2woKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2tpcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG1nQ29udHJvbDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG5cclxuICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9IRUJSRVc6XHJcbiAgICAgICAgaWYgKG1nQ29udHJvbC5pc1RhYmxlQ29udHJvbCgpKVxyXG4gICAgICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTk9ERV9JRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OT0RFX1BBUkVOVElEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEE6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSElHSExJR0hUSU5HOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VU1RfSU5QVVQ6XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFTFBfU0NSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVF9QUk9HUkFNOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVF9NT0RFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XRURfRElSRUNUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFVFVSTl9BQ1RJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVRUUklCVVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFUEVBVEFCTEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRlJBTUVfTkFNRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UUklHR0VSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQl9PUkRFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19DQUNIRUQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFZRVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19GSVQ6XHJcbiAgICAgIC8vIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVMVElMSU5FX1ZFUlRJQ0FMX1NDUk9MTDpcclxuICAgICAgLy8gY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NVUxUSUxJTkVfV09SRFdSQVBfU0NST0xMOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JBSVNFX0FUOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZSQU1FU0VUX1NUWUxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZSQU1FX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkFOR0U6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfV0lORE9XX1dJRFRIOlxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJCSU5HX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FVVE9fUkVGUkVTSDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVJBTUVURVJTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX09CSkVDVF9UWVBFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1JFVEFJTl9GT0NVUzpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TVUJGT1JNX1RZUEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVBTF9PQkpFQ1RfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BRERJVElPTkFMX0lORk9STUFUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0RBVEFWSUVXQ09OVFJPTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9EQVRBVklFV0NPTlRST0xfRklFTERTOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSR1RTS19OVU06XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU5ERVg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRElTUExBWV9GSUVMRDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MSU5LX0ZJRUxEOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JFRk9SRV85MDBfVkVSU0lPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9SRUZSRVNIX1dIRU5fSElEREVOOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFUlZFUl9SRUFEX0FIRUFEOlxyXG4gICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9CVVRUT05fU1RZTEU6XHJcbiAgICAgICAgaWYgKCEoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmopLmlzUmFkaW8oKSlcclxuICAgICAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2tpcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gVFJVRSBpZiB0aGUgcHJvcGVydHkgbmVlZCB0byBiZSBza2lwIGZyb20gdGhlIHJlZnJlc2ggcHJvcGVydGllcy4gZm9yIGEgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZFNraXBSZWZyZXNoRm9ybSgpOiBib29sZWFuIHtcclxuICAgIERlYnVnLkFzc2VydCh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSk7XHJcblxyXG4gICAgbGV0IHNraXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBtZ0Zvcm1CYXNlOiBHdWlGb3JtUHJvcGVydHlBZGFwdGVyID0gPEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcblxyXG4gICAgLy8gQ29tcHV0ZSBwcm9wZXJ0aWVzOiBhbGwgdGhvc2UgcHJvcGVydGllcyB3aWxsIGJlIHJlZnJlc2ggb25seSBvbmUgdGltZVxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1dJTkRPV19UWVBFOlxyXG4gICAgICAgIGlmICghdGhpcy5fcGFyZW50T2JqLklzRmlyc3RSZWZyZXNoT2ZQcm9wcygpKVxyXG4gICAgICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xJTkVTX0lOX1RBQkxFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFTFBfU0NSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfT1JERVI6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUEVSU0lTVEVOVF9GT1JNX1NUQVRFX1ZFUlNJT046XHJcbiAgICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlZnJlc2ggb25seSB0aGUgcmVsZXZhbnQgc3ViZm9ybSBwcm9wZXJ0aWVzIChjb2xvciwgZm9udCwgZXRjLilcclxuICAgIGlmICghc2tpcCAmJiBtZ0Zvcm1CYXNlLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgIHNraXAgPSB0cnVlO1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcblxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1BST1BFUlRJRVM6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DVVNUT01fVkFMSURBVE9SUzpcclxuICAgICAgICAgIHNraXAgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNraXA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIFRSVUUgaWYgdGhlIHByb3BlcnR5IG5lZWQgdG8gYmUgc2tpcCBmcm9tIHRoZSByZWZyZXNoIHByb3BlcnRpZXMuIGZvciBhIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBTaG91bGRTa2lwUmVmcmVzaFRhc2soKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgc2tpcDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHN3aXRjaCAodGhpcy5faWQpIHtcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfREVMRVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19SQU5HRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19MT0NBVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfU09SVDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfSU5ERVg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCQklOR19DWUNMRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX0NBTkNFTDpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05GSVJNX1VQREFURTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VWQUxfRU5EX0NPTkRJVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVg6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfREVMRVRFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9TRUxFQ1RJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJBU0FDVElPTl9CRUdJTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfVFJBTlNBQ1RJT05fTU9ERTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUklOVF9EQVRBOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NMT1NFX1RBU0tTX0JZX01ESV9NRU5VOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19PUEVOX1RBU0tfV0lORE9XOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19BTExPV19FVkVOVFM6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0NIVU5LX1NJWkU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0lOREVYX09QVElNSVpBVElPTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUkFOR0U6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1JBTkdFX09SREVSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19MT0NBVEU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0xPQ0FURV9PUkRFUjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfUE9TSVRJT046XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX1BPU0lUSU9OX1VTQUdFOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19TUUxfUkFOR0U6XHJcbiAgICAgICAgc2tpcCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBza2lwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgaWdub3JlZCBieSBSZWZyZXNoRGlzcGxheSgpIHNraXAgcHJvcGVydGllcyB3aGljaCBoYXMgbm90aGluZyB0byBkbyB3aXRoXHJcbiAgLy8vICAgdGhlIGRpc3BsYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGlnbm9yZWQ8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBTaG91bGRTa2lwUmVmcmVzaCgpOiBib29sZWFuIHtcclxuICAgIGxldCBza2lwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX3BhcmVudFR5cGUpIHtcclxuICAgICAgY2FzZSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTDpcclxuICAgICAgICBza2lwID0gdGhpcy5TaG91bGRTa2lwUmVmcmVzaENvbnRyb2woKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STTpcclxuICAgICAgICBza2lwID0gdGhpcy5TaG91bGRTa2lwUmVmcmVzaEZvcm0oKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfVEFTSzpcclxuICAgICAgICBza2lwID0gdGhpcy5TaG91bGRTa2lwUmVmcmVzaFRhc2soKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX2lkKSB7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUE9QX1VQOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX09SSUVOVEFUSU9OX0xPQ0s6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5URVJfQU5JTUFUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VYSVRfQU5JTUFUSU9OOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BVklHQVRJT05fRFJBV0VSX01FTlU6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUNUSU9OX0JBUl9NRU5VOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX09QRU5fUElDS0VSOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX09QRU5fRURJVF9ESUFMT0c6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREVGQVVMVF9BTElHTk1FTlQ6XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfS0VZQk9BUkRfVFlQRTpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9LRVlCT0FSRF9SRVRVUk5fS0VZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NVR0dFU1RJT05TOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PQklMRV9JTUFHRV9MSVNUX0ZJTEVfTkFNRTpcclxuICAgICAgICBza2lwID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiBza2lwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGRpc3BsYXkgZm9yIGNvbnRyb2wgcHJvcGVydGllcyBhbmQgZm9ybSBwcm9wZXJ0aWVzIG9ubHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VSZWZyZXNoXCI+aWYgdHJ1ZSB0aGVuIHJlZnJlc2ggaXMgZm9yY2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXZpb3VzIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN1cnJMaW5lXCI+bGluZSBudW1iZXIgaW4gdGFibGUgd2hlbiByZWZyZXNoaW5nIGEgY29sdW1uIGlmIHRoZSBjdXJyZW50IGxpbmUgaXMgcmVmcmVzaGVkIHNldCB0b1xyXG4gIC8vLyAgIChJbnRlZ2VyLk1JTl9WQUxVRSlcclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIFJlZnJlc2hEaXNwbGF5V2l0aEN1cnJlbnRMaW5lKGZvcmNlUmVmcmVzaDogYm9vbGVhbiwgY3VyckxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheVdpdGhDdXJyTGluZUFuZENoZWNrU2tpcFJlZnJlc2goZm9yY2VSZWZyZXNoLCBjdXJyTGluZSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLyBUaGlzIG1ldGhvZCBjaGVja3MgaWYgd2UgbXVzdCByZWZyZXNoIHRoZSBwcm9wZXJ0eSBldmVuIGlmIGl0IGhhcyBleHByZXNzaW9uXHJcbiAgLy8gRm9yIG5vdyBpdCByZXR1cm5zIHRydWUgZm9yIHByb3BlcnRpZXMgd2l0aCB0ZXh0IGZvciBtdWx0aWxpbmd1YWwgc3VwcG9ydFxyXG5cclxuICAvLyB0b2RvIE5lZWQgdG8gYWRkIGhlcmUgY2hlY2sgaWYgdXNlciB3YW50cyBtdWx0aWxpbmd1YWwgc3VwcG9ydCBhdCBhbGxcclxuICBTa2lwV2hlbk5vRXhwcmVzc2lvbigpOiBib29sZWFuIHtcclxuICAgIGxldCBza2lwV2hlbk5vRXhwcmVzc2lvbiA9IHRydWU7XHJcblxyXG4gICAgbGV0IGN0cmwgPSAoKHRoaXMuX3BhcmVudE9iaiBpbnN0YW5jZW9mIEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIpID8gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+dGhpcy5fcGFyZW50T2JqIDogbnVsbCk7XHJcbiAgICBpZiAoKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmlzQnV0dG9uKCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVCkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmlzQ29tYm9Cb3goKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUwpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc0xpc3RCb3goKSAmJiB0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUwpIHx8XHJcbiAgICAgIChjdHJsICE9IG51bGwgJiYgY3RybC5pc1JhZGlvKCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xBQkVMKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuaXNDaGVja0JveCgpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTCkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmlzVGFiQ29udHJvbCgpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9MQUJFTCkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmlzSW1hZ2VDb250cm9sKCkgJiYgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX0ZJTEVOQU1FKSB8fFxyXG4gICAgICAoY3RybCAhPSBudWxsICYmIGN0cmwuSXNJbWFnZUJ1dHRvbigpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9GSUxFTkFNRSkgfHxcclxuICAgICAgKGN0cmwgIT0gbnVsbCAmJiBjdHJsLmlzQ29sdW1uQ29udHJvbCgpICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT0xVTU5fVElUTEUpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRElTUExBWV9MSVNUKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RFWFQpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVE9PTFRJUCkgfHxcclxuICAgICAgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ISU5UKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BBU1NXT1JEKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9QUk9QRVJUSUVTKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKSB8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpIHx8XHJcbiAgICAgICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRCl8fFxyXG4gICAgICAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0JJTkRJTkdfTEVWRUwpKVxyXG4gICAgICBza2lwV2hlbk5vRXhwcmVzc2lvbiA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIHNraXBXaGVuTm9FeHByZXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZWV2YWx1YXRlIHRoZSBwcm9wZXJ0eSB2YWx1ZSAoaWYgaXQgaGFzIGFuIGV4cHJlc3Npb24pIGFuZFxyXG4gIC8vLyByZWZyZXNoIHRoZSBkaXNwbGF5IGZvciBjb250cm9sIHByb3BlcnRpZXMgYW5kIGZvcm0gcHJvcGVydGllcyBvbmx5XHJcbiAgLy8vXHJcbiAgLy8vIFRoaXMgbWV0aG9kIHdhcyAoYXMgaXRzIG5hbWUgaW1wbGllcykgcmVsZXZhbnQgb25seSBmb3IgR1VJIHByb3BlcnRpZXMsIGkuZS4gcHJvcGVydGllcyB0aGF0IGFmZmVjdCBvbiB0aGUgZGlzcGxheS5cclxuICAvLy8gTm9uLUdVSSBwcm9wZXJ0aWVzIChzdWNoIGFzIFBST1BfVFlQRV9UQUJfSU4pIHdlcmUgc2tpcHBlZCBhbmQgbm90IHJlZXZhbHVhdGVkLlxyXG4gIC8vLyBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBHVUkgcHJvcGVydGllcyBhbmQgbm9uLUdVSSBwcm9wZXJ0aWVzIGlzIGRvbmUgYnkgdGhlIG1ldGhvZCDvv71TaG91bGRTa2lwUmVmcmVzaO+/vUVcclxuICAvLy8gTm93IHdlIGhhdmUgbm9uLUdVSSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlZXZhbHVhdGVkIGluIHRoaXMgZnVuY3Rpb246XHJcbiAgLy8vIFBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlksIFBST1BfVFlQRV9DT05URVhUX01FTlUsIFBST1BfVFlQRV9UQUJfSU4sIFBST1BfVFlQRV9QQVJLX09OX0NMSUNLLlxyXG4gIC8vLyBGb3IgdGhlc2UgcHJvcGVydGllcyB3ZSBkbyBub3QgZXhlY3V0ZSBleHBsaWNpdGx5IHRoZWlyIGV4cHJlc3Npb25zIChpdCB3YXMgZG9uZSBpbiAxLjkgYnkgQ2hlY2tQcm9wIGZ1bmN0aW9uKSxcclxuICAvLy8gd2Ugb25seSB1c2UgdGhlaXIgdmFsdWVzIGJ5IEdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5IGZ1bmN0aW9uLiBJdCBpcyBkb25lIGZvciBkbyBub3QgZXhlY3V0ZSB0aGUgcHJvcGVydHkgZXhwcmVzc2lvblxyXG4gIC8vLyBpbiBHVUkgdGhyZWFkLiBJbiBHVUkgdGhyZWFkIHdlIG9ubHkgdXNlIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gU28gaXQgaXMgbmVlZGVkIHRvIHJlZXZhbHVhdGUgdGhlIHByb3BlcnR5IHZhbHVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZVJlZnJlc2hcIj5pZiB0cnVlIHRoZW4gcmVmcmVzaCBpcyBmb3JjZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJldmlvdXMgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3VyckxpbmVcIj5saW5lIG51bWJlciBpbiB0YWJsZSB3aGVuIHJlZnJlc2hpbmcgYSBjb2x1bW4gaWYgdGhlIGN1cnJlbnQgbGluZSBpcyByZWZyZXNoZWQgc2V0IHRvXHJcbiAgLy8vICAgKEludGVnZXIuTUlOX1ZBTFVFKVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5V2l0aEN1cnJMaW5lQW5kQ2hlY2tTa2lwUmVmcmVzaChmb3JjZVJlZnJlc2g6IGJvb2xlYW4sIGN1cnJMaW5lOiBudW1iZXIsIGNoZWNrU2tpcFJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gbnVsbDtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHByZXZWYWx1ZTogc3RyaW5nO1xyXG4gICAgbGV0IHZhbENoYW5nZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLl92YWwgPT09IG51bGwgJiYgdGhpcy5fZXhwSWQgPT09IDApIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJpbiBQcm9wZXJ0eS5SZWZyZXNoRGlzcGxheSgpIG51bGwgdmFsdWUgYW5kIGV4cHJlc3Npb25cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hlY2tTa2lwUmVmcmVzaCAmJiB0aGlzLlNob3VsZFNraXBSZWZyZXNoKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5fZXhwSWQgPT09IDAgJiYgdGhpcy5Ta2lwV2hlbk5vRXhwcmVzc2lvbigpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuX3ByZXZWYWx1ZXMubGVuZ3RoID09PSAwKVxyXG4gICAgICB0aGlzLnNldFByZXZBcnJheVNpemUoKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLkNvbXB1dGVWYWx1ZSgpO1xyXG5cclxuICAgIC8vIGJlZm9yZSB1cGRhdGUgdGhlIHByb3BlcnR5IG5lZWQgdG8gcHJlcGFyZSBkYXRhXHJcbiAgICBzd2l0Y2ggKHRoaXMuX3BhcmVudFR5cGUpIHtcclxuICAgICAgY2FzZSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTDpcclxuICAgICAgICBjdHJsID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgICAgLy8gcmVjb21wdXRlIHRoZSBQSUMgZm9yIGZvcm1hdCBwcm9wZXJ0aWVzXHJcbiAgICAgICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNQVQgJiYgdGhpcy5fZXhwSWQgPiAwKVxyXG4gICAgICAgICAgY3RybC5jb21wdXRlUElDKHRoaXMuX3ZhbCk7XHJcblxyXG4gICAgICAgIGlmIChjdHJsLklzUmVwZWF0YWJsZSAmJiAhY3RybC5nZXRGb3JtKCkuaXNSZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQoKSlcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICAgIGxpbmUgPSB0aGlzLmdldExpbmUoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBsaW5lID0gY3VyckxpbmU7XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgd2FzIGNoYW5nZWQgdG8gcHJldmVudCBzZW5kaW5nIHJlZHVuZGFudFxyXG4gICAgICAgIC8vIGphdmFzY3JpcHQgY29tbWFuZHMgdG8gdGhlIGJyb3dzZXJcclxuICAgICAgICBwcmV2VmFsdWUgPSB0aGlzLl9wcmV2VmFsdWVzLmdldF9JdGVtKGxpbmUpO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgKHRoaXMuX3ZhbCA9PT0gcHJldlZhbHVlKVxyXG4gICAgICAgICAgJiYgdGhpcy5faWQgIT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGSUFCTEVcclxuICAgICAgICAgICYmIHRoaXMuX2lkICE9PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFXHJcbiAgICAgICAgICAmJiB0aGlzLl9pZCAhPT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRClcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gdG8gcHJldmVudCByZWN1cnNpb24gd2hpbGUgdXBkYXRpbmcgY29sdW1uIHZpc2liaWxpdHlcclxuICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU5cclxuICAgICAgICAgICYmIHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFXHJcbiAgICAgICAgICAmJiB0aGlzLl92YWwgPT09IHByZXZWYWx1ZSlcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbCA9PT0gcHJldlZhbHVlKVxyXG4gICAgICAgICAgdmFsQ2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKGxpbmUsIHRoaXMuX3ZhbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNOlxyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgd2FzIGNoYW5nZWQgdG8gcHJldmVudCBzZW5kaW5nIHJlZHVuZGFudFxyXG4gICAgICAgIC8vIGphdmFzY3JpcHQgY29tbWFuZHMgdG8gdGhlIGJyb3dzZXJcclxuICAgICAgICBwcmV2VmFsdWUgPSB0aGlzLl9wcmV2VmFsdWVzLmdldF9JdGVtKDApO1xyXG4gICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmICh0aGlzLl92YWwgPT09IHByZXZWYWx1ZSkpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgdGhpcy5fcHJldlZhbHVlcy5zZXRfSXRlbSgwLCB0aGlzLl92YWwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfVEFTSzogLy8gVEFTSyBQUk9QRVJUSUVTXHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXHJcbiAgICAgICAgICBOU3RyaW5nLkZvcm1hdChcIlByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCk6IHRhc2sgcHJvcGVydHkgezB9IHdhc24ndCBoYW5kbGVkXCIsIHRoaXMuX2lkKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcclxuICAgICAgICAgIE5TdHJpbmcuRm9ybWF0KFwiUHJvcGVydHkuUmVmcmVzaERpc3BsYXkoKTogcGFyZW50VHlwZSB1bmtub3duLCBwcm9wZXJ0eSB7MH0gd2Fzbid0IGhhbmRsZWRcIiwgdGhpcy5faWQpKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JTUFHRV9GSUxFTkFNRTpcclxuICAgICAgICB0aGlzLm9uSW1hZ2VGaWxlTmFtZSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVEOlxyXG4gICAgICAgIHRoaXMub25FbmFibGUodmFsQ2hhbmdlZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEU6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vblZpc2libGUodmFsQ2hhbmdlZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FOlxyXG4gICAgICAgIHRoaXMuT25Db250cm9sTmFtZSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNX05BTUU6XHJcbiAgICAgICAgdGhpcy5vbkZvcm1OYW1lKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTFVNTl9USVRMRTpcclxuICAgICAgICB0aGlzLm9uVGV4dCgwKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEVYVDpcclxuICAgICAgICB0aGlzLm9uVGV4dChsaW5lKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSElOVDpcclxuICAgICAgICB0aGlzLm9uSGludCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRklBQkxFOlxyXG4gICAgICAgIGF3YWl0IHRoaXMub25Nb2RpZmlhYmxlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RPT0xUSVA6XHJcbiAgICAgICAgdGhpcy5vblRvb2x0aXAoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRElTUExBWV9MSVNUOlxyXG4gICAgICAgIGF3YWl0IHRoaXMub25EaXNwbGF5TGlzdChsaW5lKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19DT01QTEVURV9NT0RFX1dDOlxyXG4gICAgICAgIHRoaXMub25BdXRvQ29tcGxldGVNb2RlKCk7XHJcbiAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRV9MQVlFUlNfTElTVDpcclxuICAgICAgICBhd2FpdCB0aGlzLm9uVmlzaWJsZUxheWVyTGlzdChsaW5lKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STUFUOlxyXG4gICAgICAgIHRoaXMub25Gb3JtYXQoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUw6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vbkxhYmVsKGxpbmUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BBU1NXT1JEOlxyXG4gICAgICAgIHRoaXMub25QYXNzd29yZCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTU9ESUZZX0lOX1FVRVJZOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQl9JTjpcclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QQVJLX09OX0NMSUNLOlxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0xPQURfSU1BR0VfRlJPTTogLy8gdGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGZvciBpZGVudGlmeWluZyBsb2FkaW5nIG9mIGltYWdlIChTZXJ2ZXIvQ2xpZW50KS5cclxuICAgICAgICAvLyBTbyBubyBoYW5kbGluZyBuZWVkZWQgaW4gUmVmcmVzaERpc3BsYXlcclxuICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9QUk9QRVJUSUVTOlxyXG4gICAgICAgIHRoaXMub25DdXN0b21Qcm9wZXJ0aWVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1ZBTElEQVRPUlM6XHJcbiAgICAgICAgdGhpcy5vbkN1c3RvbVZhbGlkYXRvcnMoKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQklORElOR19MRVZFTDpcclxuICAgICAgICB0aGlzLm9uQmluZGluZ0xldmVsKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXHJcbiAgICAgICAgICBOU3RyaW5nLkZvcm1hdChcIlByb3BlcnR5LlJlZnJlc2hEaXNwbGF5KCk6IFByb3BlcnR5IHswfSB3YXNuJ3QgaGFuZGxlZFwiLCB0aGlzLl9pZCkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgbmVlZCB0byBjYWxjdWxhdGUgb25jZSBvbmx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgU2hvdWxkQmVDb21wdXRlZE9uY2UoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX1RBU0spIHtcclxuICAgICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19NT0RFOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUFJFTE9BRF9WSUVXOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFCQklOR19DWUNMRTpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfUFJPUEVSVElFU19PUEVOX1RBU0tfV0lORE9XOlxyXG4gICAgICAgIGNhc2UgUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0VWRU5UUzpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURV9JTl9RVUVSWTpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEE6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19SQU5HRTpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURTpcclxuICAgICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1NPUlQ6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfSU5ERVg6XHJcbiAgICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NQUlOX0RJU1BMQVk6XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgaWYgKHRoaXMuX2lkID09PSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19DQUNIRUQgfHwgdGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01VTFRJTElORSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGlmIHRoZSB2YWx1ZSBpcyBjb21wdXRlZCBpbiB0aGUgc2VydmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgSXNDb21wdXRlZE9uY2VPblNlcnZlcigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlNob3VsZEJlQ29tcHV0ZWRPbmNlKCkpIHtcclxuICAgICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gdGhpcy5HZXRUYXNrQnlQYXJlbnRPYmplY3QoKTtcclxuICAgICAgaWYgKHRhc2sgIT0gbnVsbClcclxuICAgICAgICByZXR1cm4gIXRhc2suU2hvdWxkRXZhbHVhdGVQcm9wZXJ0eUxvY2FsbHkodGhpcy5faWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGVzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYW5kIGRvZXMgbm90IGFmZmVjdCB0aGUgZGlzcGxheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBDb21wdXRlVmFsdWUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gMjU1O1xyXG4gICAgbGV0IHdhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLl9pZCA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQ1VTVE9NX1BST1BFUlRJRVMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb21wdXRlQ3VzdG9tUHJvcGVydGllc1ZhbHVlcygpO1xyXG4gICAgICByZXN1bHQgPSB0aGlzLkdldEFycmF5VmFsdWVzRm9yQ3VzdG9tUHJvcGVydGllcygpO1xyXG4gICAgICB0aGlzLnNldFZhbHVlKHJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NVU1RPTV9WQUxJREFUT1JTKSB7XHJcbiAgICBsZXQgZXZhbHVhdGVkID0gICBhd2FpdCB0aGlzLmNvbXB1dGVDdXN0b21WYWxpZGF0b3JzKCk7XHJcbiAgICAgIGlmIChldmFsdWF0ZWQpIHtcclxuICAgICAgICByZXN1bHQgPSB0aGlzLkdldEFycmF5VmFsdWVzRm9yQ3VzdG9tVmFsaWRhdGlvblByb3BlcnRpZXMoKTtcclxuICAgICAgICB0aGlzLnNldFZhbHVlKHJlc3VsdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuX2V4cElkID4gMCkge1xyXG4gICAgICAvLyBmb3Igb2ZmbGluZSA6IGNvbXB1dGUgb25jZSB0aGUgcHJvcGVydGllcyB0aGF0IHdhcyBjb21wdXRlIG9uIHRoZSBzZXJ2ZXJcclxuICAgICAgaWYgKHRoaXMuU2hvdWxkQmVDb21wdXRlZE9uY2UoKSAmJiB0aGlzLl9leHBBbHJlYWR5Q29tcHV0ZWRPbmNlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMuX2V4cEFscmVhZHlDb21wdXRlZE9uY2UgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gZm9yIGZvbGxvd2luZyBjb250cm9sIHByb3BlcnRpZXMgYWx3YXlzIGV2YWx1YXRlIGV4cHJlc3Npb25zXHJcbiAgICAgIGxldCBhbHdheXNFdmFsdWF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfVEFTSylcclxuICAgICAgICBhbHdheXNFdmFsdWF0ZSA9IHRydWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5faWQgPT09IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVCkge1xyXG4gICAgICAgIGxlbiA9IDY1NTM1O1xyXG4gICAgICAgIHJlc3VsdCA9IFN0clV0aWwucnRyaW0oYXdhaXQgdGhpcy5fcGFyZW50T2JqLkV2YWx1YXRlRXhwcmVzc2lvbih0aGlzLl9leHBJZCwgdGhpcy5fZGF0YVR5cGUsIGxlbiwgdHJ1ZSxcclxuICAgICAgICAgIFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUCwgYWx3YXlzRXZhbHVhdGUsIHdhc0V2YWx1YXRlZCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9wYXJlbnRPYmouRXZhbHVhdGVFeHByZXNzaW9uKHRoaXMuX2V4cElkLCB0aGlzLl9kYXRhVHlwZSwgbGVuLCB0cnVlLCBTdG9yYWdlQXR0cmlidXRlLlNLSVAsIGFsd2F5c0V2YWx1YXRlLCB3YXNFdmFsdWF0ZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgbGV0IHdhcm5pbmdNc2cgPSBuZXcgU3RyaW5nQnVpbGRlcihcIkV4Y2VwdGlvbjogXCIgKyBlLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3BhcmVudE9iaiBpbnN0YW5jZW9mIEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIpXHJcbiAgICAgICAgICAgIHdhcm5pbmdNc2cuQXBwZW5kKFwiIENvbnRyb2w6IFwiICsgKDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPnRoaXMuX3BhcmVudE9iaikuTmFtZSk7XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVXYXJuaW5nVG9Mb2cod2FybmluZ01zZy5Ub1N0cmluZygpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAod2FzRXZhbHVhdGVkLnZhbHVlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy51cGRhdGVSZXN1bHQocmVzdWx0KTtcclxuICAgICAgICB0aGlzLnNldFZhbHVlKHJlc3VsdCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5fdmFsID09IG51bGwgJiYgdGhpcy5fcGFyZW50VHlwZSAhPT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgICByZXN1bHQgPSBQcm9wRGVmYXVsdHMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuX2lkLCB0aGlzLl9wYXJlbnRUeXBlLCB0aGlzLl9wYXJlbnRPYmopO1xyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUocmVzdWx0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZXMgcmVzdWx0cyBvZiBleHByZXNzaW9uIGZvciBzb21lIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzdWx0XCI+IDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSB1cGRhdGVSZXN1bHQocmVzdWx0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0aGlzLl9pZCkge1xyXG4gICAgICBjYXNlIFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUk1BVDpcclxuICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpXHJcbiAgICAgICAgICByZXN1bHQgPSBOU3RyaW5nLkVtcHR5O1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX01PREU6XHJcbiAgICAgICAgcmVzdWx0ID0gUHJvcGVydHkudXBkYXRlVGFza01vZGVSZXN1bHQocmVzdWx0KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBkbyB0aGUgc2FtZSBhcyB3ZSBkb2luZyBmb3IgYysrIFVjaGFyIFJUOjp0c2tfbW9kZV9leHAgKGxvbmcgZXhwLCBVY2hhciBtb2RlKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzdWx0XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIHVwZGF0ZVRhc2tNb2RlUmVzdWx0KHJlc3VsdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBjb2RlOiBzdHJpbmcgPSAnICc7XHJcbiAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShyZXN1bHQpKSB7XHJcbiAgICAgIGNvZGUgPSByZXN1bHRbMF0udG9VcHBlckNhc2UoKTtcclxuICAgICAgc3dpdGNoIChjb2RlKSB7XHJcbiAgICAgICAgY2FzZSAnUSc6XHJcbiAgICAgICAgICBjb2RlID0gJ0UnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnRic6XHJcbiAgICAgICAgICBjb2RlID0gJ08nO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnTyc6XHJcbiAgICAgICAgICBjb2RlID0gJ04nO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29kZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGdldFZhbHVlKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBhd2FpdCB0aGlzLkNvbXB1dGVWYWx1ZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gaW50IHZhbHVlIG9mIHRoaXMgcHJvcGVydHk8L3JldHVybnM+XHJcbiAgYXN5bmMgZ2V0VmFsdWVJbnQoKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5Db21wdXRlVmFsdWUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFsICE9PSBudWxsKVxyXG4gICAgICByZXN1bHQgPSBOTnVtYmVyLlBhcnNlKHRoaXMuX3ZhbCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHdpdGhvdXQgZXhlY3V0ZSBpdHMgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBpbnQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eTwvcmV0dXJucz5cclxuICBHZXRDb21wdXRlZFZhbHVlSW50ZWdlcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE5OdW1iZXIuUGFyc2UodGhpcy5fdmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgdmFsaWQgb25seSBmb3IgbG9naWNhbCB0eXBlIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGdldFZhbHVlQm9vbGVhbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLl9kYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0VmFsdWUoKTtcclxuICAgICAgcmV0dXJuIERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKHRoaXMuX3ZhbCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJQcm9wZXJ0eS5nZXRWYWx1ZUJvb2xlYW4oKSB3YXMgY2FsbGVkIGZvciBub24gYm9vbGVhbiB0eXBlIHByb3BlcnR5OiB7MH1cIiwgdGhpcy5faWQpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBjb21wdXRlZCB2YWx1ZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29tcHV0ZWRWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IHRoZSBjb21wdXRlZCBib29sZWFuIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aXRob3V0IGV4ZWN1dGUgaXRzIGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuX2RhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4pIHtcclxuICAgICAgcmV0dXJuIERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKHRoaXMuX3ZhbCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJQcm9wZXJ0eS5nZXRWYWx1ZUJvb2xlYW4oKSB3YXMgY2FsbGVkIGZvciBub24gYm9vbGVhbiB0eXBlIHByb3BlcnR5OiB7MH1cIiwgdGhpcy5faWQpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIGxpbmUgb2YgdGhlIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj50aGUgcmVxdWVzdGVkIGxpbmUgbnVtYmVyPC9wYXJhbT5cclxuICBnZXRQcmV2VmFsdWUobGluZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmIChsaW5lIDwgdGhpcy5fcHJldlZhbHVlcy5sZW5ndGgpXHJcbiAgICAgIHJldHVybiB0aGlzLl9wcmV2VmFsdWVzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoaXMgcHJvcGVydHkgaGFzIGFuIGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzRXhwcmVzc2lvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9leHBJZCA+IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEV4cHJlc3Npb25JZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V4cElkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25JbWFnZUZpbGVOYW1lKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBtZ0NvbnRyb2xCYXNlOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGlmIChtZ0NvbnRyb2xCYXNlLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgbWdDb250cm9sQmFzZS5zZXRJbWFnZUxpc3QodGhpcy5HZXRDb21wdXRlZFZhbHVlKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG1nQ29udHJvbEJhc2UuaXNJbWFnZUNvbnRyb2woKSB8fCBtZ0NvbnRyb2xCYXNlLmlzUmFkaW8oKSB8fCBtZ0NvbnRyb2xCYXNlLmlzQ2hlY2tCb3goKSB8fCBtZ0NvbnRyb2xCYXNlLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICAgIG1nQ29udHJvbEJhc2Uuc2V0SW1hZ2VXaXRoRmlsZU5hbWUodGhpcy5HZXRDb21wdXRlZFZhbHVlKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIG9uSW1hZ2VGaWxlTmFtZS5vbkVuYWJsZSgpXCIpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uRW5hYmxlKHZhbENoYW5nZWQ6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICBsZXQgY3VycmVudEVkaXRpbmdDb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbDtcclxuXHJcbiAgICAgIC8vIEFDVF9UQkxfTlhURkxEIGlzIGFkZGVkIGluIHF1ZXVlLCB3aGVuZXZlciBjdXJyZW50IGNvbnRyb2wgaXMgaGlkZGVuIG9yIGRpc2FibGVkIHRvIHNldCB0aGUgZm9jdXMgdG8gbmV4dCBjb250cm9sIGZvciBib3RoIFJDICYgT0xcclxuICAgICAgLy8gd2hpY2ggaXMgY29ycmVjdCBiZWhhdmlvci4gQnV0IG9uY2UgY3VycmVudCBjdHJsIGlzIGFscmVhZHkgZGlzYWJsZWQvaGlkZGVuICwgd2Ugc2hvdWxkIG5vdCBwdXQgdGhlIHNhbWUgYWN0aW9uXHJcbiAgICAgIC8vIGluIHF1ZXVlIGFnYWluIHdoZW4gc2FtZSBjdHJsIGlzIGRpc2FibGVkL2hpZGRlbiBtdWx0aXBsZSB0aW1lcy5cclxuICAgICAgaWYgKHRoaXMuX3ZhbCAhPT0gbnVsbCAmJiB0aGlzLl92YWwgPT09IFwiMFwiICYmIHZhbENoYW5nZWQgJiYgY3VycmVudEVkaXRpbmdDb250cm9sICE9PSBudWxsICYmXHJcbiAgICAgICAgKGN0cmwgPT09IGN1cnJlbnRFZGl0aW5nQ29udHJvbCB8fCBjdXJyZW50RWRpdGluZ0NvbnRyb2wuaXNEZXNjZW5kZW50T2ZDb250cm9sKGN0cmwpIHx8IGN0cmwgPT09IGN1cnJlbnRFZGl0aW5nQ29udHJvbC5nZXRMaW5rZWRQYXJlbnQoZmFsc2UpKSkge1xyXG4gICAgICAgIGxldCBwYXJrZWRDb250cm9sOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldExhc3RQYXJrZWRDdHJsKCk7XHJcbiAgICAgICAgaWYgKHBhcmtlZENvbnRyb2wgIT09IG51bGwgJiYgcGFya2VkQ29udHJvbC5JbkNvbnRyb2wgJiYgKGN0cmwgPT09IHBhcmtlZENvbnRyb2wgfHwgcGFya2VkQ29udHJvbC5pc0Rlc2NlbmRlbnRPZkNvbnRyb2woY3RybCkpKSB7XHJcbiAgICAgICAgICBFdmVudHMuT25Ob25QYXJrYWJsZUxhc3RQYXJrZWRDdHJsKGN0cmwpO1xyXG4gICAgICAgICAgY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLkN1cnJlbnRFZGl0aW5nQ29udHJvbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGN0cmwuU2V0RW5hYmxlZCh0aGlzLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vbkVuYWJsZSgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBvblZpc2libGUodmFsQ2hhbmdlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGxldCBjdXJyZW50RWRpdGluZ0NvbnRyb2w6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSBjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sO1xyXG4gICAgICBpZiAodGhpcy5fdmFsICE9PSBudWxsICYmIHRoaXMuX3ZhbCA9PT0gXCIwXCIgJiYgdmFsQ2hhbmdlZCAmJiBjdXJyZW50RWRpdGluZ0NvbnRyb2wgIT09IG51bGwgJiZcclxuICAgICAgICAoY3RybCA9PT0gY3VycmVudEVkaXRpbmdDb250cm9sIHx8IGN1cnJlbnRFZGl0aW5nQ29udHJvbC5pc0Rlc2NlbmRlbnRPZkNvbnRyb2woY3RybCkgfHwgY3RybCA9PT0gY3VycmVudEVkaXRpbmdDb250cm9sLmdldExpbmtlZFBhcmVudChmYWxzZSkpKSB7XHJcbiAgICAgICAgbGV0IHBhcmtlZENvbnRyb2w6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSBjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICBpZiAocGFya2VkQ29udHJvbCAhPT0gbnVsbCAmJiBwYXJrZWRDb250cm9sLkluQ29udHJvbCAmJiAoY3RybCA9PT0gcGFya2VkQ29udHJvbCB8fCBwYXJrZWRDb250cm9sLmlzRGVzY2VuZGVudE9mQ29udHJvbChjdHJsKSkpIHtcclxuICAgICAgICAgIEV2ZW50cy5Pbk5vblBhcmthYmxlTGFzdFBhcmtlZEN0cmwoY3RybCk7XHJcbiAgICAgICAgICBjdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuQ3VycmVudEVkaXRpbmdDb250cm9sID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgYXdhaXQgY3RybC51cGRhdGVQcm9wZXJ0eUxvZ2ljTmVzdGluZyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFLCB0aGlzLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCksIHRydWUpO1xyXG5cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIE9uQ29udHJvbE5hbWUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lk9uQ29udHJvbE5hbWUoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gc2V0IGhpbnQgZm9yIGVkaXQgY29udHJvbCBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkhpbnQoKSB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGNvbnRyb2w6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj50aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKCk7XHJcbiAgICAgIGxldCB0cmFuc2xhdGVkU3RyaW5nOiBzdHJpbmcgPSBFdmVudHMuVHJhbnNsYXRlKHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZSgpKTtcclxuXHJcbiAgICAgIGlmICghY29udHJvbC5Jc0RhdGVUaW1lUGljdHVyZSgpICYmICghY29udHJvbC5Jc1RhYmxlQ2hpbGQgfHwgY29udHJvbC5Jc1RhYmxlSGVhZGVyQ2hpbGQpKSB7XHJcbiAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKCksIHRoaXMuZ2V0TGluZSgpLCBIdG1sUHJvcGVydGllcy5QbGFjZUhvbGRlciwgdHJhbnNsYXRlZFN0cmluZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW5Qcm9wZXJ0eS5vbkhpbnQoKVwiKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uRm9ybU5hbWUoKSB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0pXHJcbiAgICAgIHRoaXMuYWRkQ29tbWFuZFR5cGVUZXh0KDApO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vbkZvcm1OYW1lKClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFkZENvbW1hbmRUeXBlVGV4dChsaW5lOiBudW1iZXIpIHtcclxuICAgIGxldCBtbHNUcmFuc1ZhbHVlOiBzdHJpbmcgPSBFdmVudHMuVHJhbnNsYXRlKHRoaXMuR2V0Q29tcHV0ZWRWYWx1ZSgpKTtcclxuXHJcbiAgICAvLyBGaXhlZCBidWcjOjczMzQ4MCBTeXN0ZW1Cb3ggPSBmYWxzZSBhbmQgdGl0bGUgaXMgZW1wdHktPiAuTkVUIGhpZGUgdGhlIHRpdGxlLlxyXG4gICAgLy8gd2Ugd2lsbCBzZXQgaXQgdG8gJyAnXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0gfHxcclxuICAgICAgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MICYmICg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuaXNDb2x1bW5Db250cm9sKCkpKSB7XHJcbiAgICAgIC8vICM3Mzc0ODg6IFdoZW4gdmFyaWFibGUgYXR0YWNoZWQgdG8gZm9ybSdzIHRleHQgcHJvcGVydHksIHNwYWNlcyBhcmUgYXBwZW5kZWRcclxuICAgICAgLy8gYWZ0ZXIgYWN0dWFsIHZhbHVlLCBlcXVhbCB0byBwaWN0dXJlIG9mIHZhcmlhYmxlLiBCZWZvcmUgc2V0dGluZyB0ZXh0IHJlbW92ZSB0aGVzZSBleHRyYVxyXG4gICAgICAvLyBzcGFjZXMgYXQgdGhlIGVuZC5cclxuICAgICAgbWxzVHJhbnNWYWx1ZSA9IFN0clV0aWwucnRyaW0obWxzVHJhbnNWYWx1ZSk7XHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSAmJiBtbHNUcmFuc1ZhbHVlID09PSBOU3RyaW5nLkVtcHR5KSB7XHJcbiAgICAgICAgbWxzVHJhbnNWYWx1ZSA9IFwiIFwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wgJiYgKCg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuaXNUZXh0Q29udHJvbCgpXHJcbiAgICAgICAgfHwgKCg8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iaikuaXNCdXR0b24oKSkpKSAvLyBuZWVkIHRvIGNoZWNrIGZvciBoeXBlcnRleHQgb3Igb3RoZXIgdHlwZXMgb2YgYnV0dG9uXHJcbiAgICAgIENvbW1hbmRzLmFkZFZhbHVlV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1ZBTFVFLCB0aGlzLl9wYXJlbnRPYmosIGxpbmUsIG1sc1RyYW5zVmFsdWUpO1xyXG4gICAgZWxzZVxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMuX3BhcmVudE9iaiwgbGluZSwgSHRtbFByb3BlcnRpZXMuVGV4dCwgbWxzVHJhbnNWYWx1ZSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25UZXh0KGxpbmU6IG51bWJlcikge1xyXG4gICAgdGhpcy5hZGRDb21tYW5kVHlwZVRleHQobGluZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIG9uTW9kaWZpYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG5cclxuICAgICAgaWYgKGN0cmwuaXNUZXh0Q29udHJvbCgpIHx8IGN0cmwuaXNDaG9pY2VDb250cm9sKCkgfHwgY3RybC5pc0NoZWNrQm94KCkpIHtcclxuICAgICAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLkdldFRhc2tCeVBhcmVudE9iamVjdCgpO1xyXG5cclxuICAgICAgICBsZXQgcmVhZE9ubHlWYWx1ZTogYm9vbGVhbiA9ICF0aGlzLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCk7XHJcblxyXG4gICAgICAgIGlmICgocmVhZE9ubHlWYWx1ZSB8fCB0YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSkgJiYgY3RybC5HZXRDdXJyUmVhZE9ubHkoKSAhPT0gcmVhZE9ubHlWYWx1ZSkge1xyXG4gICAgICAgICAgY3RybC5TZXRDdXJyUmVhZE9ubHkocmVhZE9ubHlWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgLy8gSlBOOiBJTUUgc3VwcG9ydCAoZW5hYmxlIElNRSBpbiBxdWVyeSBtb2RlKVxyXG4gICAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgICAgICAgaWYgKGF3YWl0IGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKS5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfTE9DQVRFX0lOX1FVRVJZLCBmYWxzZSkpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKSwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlJlYWRPbmx5LCByZWFkT25seVZhbHVlKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIFByb3BlcnR5Lm9uTW9kaWZpYWJsZSgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvblRvb2x0aXAoKTogdm9pZCB7XHJcbiAgICBsZXQgdG9vbFRpcDogc3RyaW5nO1xyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTCkge1xyXG4gICAgICBsZXQgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG5cclxuICAgICAgLy8gVG9vbHRpcCBleHByZXNzaW9uIHJldHVybnMgc3RyaW5nXHJcbiAgICAgIGlmICh0aGlzLl9leHBJZCA9PT0gMClcclxuICAgICAgICB0b29sVGlwID0gKDxUb29sVGlwSGVscD5jdHJsLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0SGVscEl0ZW0oTk51bWJlci5QYXJzZSh0aGlzLl92YWwpKSkudG9vbHRpcEhlbHBUZXh0O1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdG9vbFRpcCA9IHRoaXMuX3ZhbDtcclxuXHJcbiAgICAgIC8vICM5Mjk4ODk6IFJlbW92ZSBleHRyYSB3aGl0ZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0b29sdGlwIHRleHQuXHJcbiAgICAgIHRvb2xUaXAgPSBTdHJVdGlsLnJ0cmltKHRvb2xUaXApO1xyXG4gICAgICBpZihjdHJsLmlzQnV0dG9uKCkgJiYgIGN0cmwuQ29ubmVjdGVkQ29udHJvbClcclxuICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIGN0cmwuQ29ubmVjdGVkQ29udHJvbCwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlpvb21CdXR0b25Ub29sdGlwLCB0b29sVGlwKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgY3RybCwgdGhpcy5nZXRMaW5lKCksIEh0bWxQcm9wZXJ0aWVzLlRvb2x0aXAsIHRvb2xUaXApO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBQcm9wZXJ0eS5vblRvb2x0aXAoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgb25EaXNwbGF5TGlzdChjdXJyTGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuXHJcbiAgICAgIGlmIChjdHJsLmlzU2VsZWN0aW9uQ3RybCgpIHx8IGN0cmwuaXNUYWJDb250cm9sKCkgfHwgY3RybC5pc1JhZGlvKCkgfHwgKDxNZ0NvbnRyb2xCYXNlPmN0cmwpLkhhc0F1dG9jb21wbGV0ZSgpKSB7XHJcbiAgICAgICAgbGV0IGxpbmU6IG51bWJlciA9IChjdXJyTGluZSA9PT0gSW50MzIuTWluVmFsdWUpID8gY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSkgOiBjdXJyTGluZTtcclxuICAgICAgICBhd2FpdCBjdHJsLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3QobGluZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25EaXNwbGF5TGlzdCgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdXJyTGluZVwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBvblZpc2libGVMYXllckxpc3QoY3VyckxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFR5cGUgPT09IEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9DT05UUk9MKSB7XHJcbiAgICAgIGxldCBjdHJsOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyID0gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+PGFueT50aGlzLl9wYXJlbnRPYmo7XHJcbiAgICAgIGxldCBsaW5lOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgaWYgKGN1cnJMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgICBsaW5lID0gY3RybC5nZXREaXNwbGF5TGluZShmYWxzZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBsaW5lID0gY3VyckxpbmU7XHJcblxyXG4gICAgICAvLyBBbHdheXMgbGF5ZXJpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiBEaXNwbGF5bGlzdC4gQnV0LFxyXG4gICAgICAvLyBEaXNwbGF5TGlzdCBhbmQgaXRlbUxpc3Qgc2hvdWxkIG5vdCBiZSByZWZyZXNoZWQuXHJcbiAgICAgIGF3YWl0IGN0cmwucmVmcmVzaFRhYkZvckxheWVyTGlzdChsaW5lKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25WaXNpYmxlTGF5ZXJMaXN0KClcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIG9uRm9ybWF0KCkge1xyXG4gICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSBudWxsO1xyXG4gICAgbGV0IGN0cmxQaWM6IFBJQztcclxuXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgY3RybCA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICBjdHJsUGljID0gY3RybC5nZXRQSUMoKTtcclxuICAgICAgY3RybC5yZXNldFByZXZWYWwoKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoY3RybC5UeXBlKSB7XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9CVVRUT046XHJcbiAgICAgICAgICAvLyBpZiB0aGUgYnV0dG9uIGRvZXNuJ3QgaGF2ZSBmaWVsZCB3ZSBuZWVkIHRvIHNldCB0aGUgZm9ybWF0IGFzIHRoZSB0ZXh0IG9mIHRoZSBjb250cm9sLFxyXG4gICAgICAgICAgLy8gb3RoZXJ3aXNlLCB0aGUgZmllbGQgdmFsdWUgd2lsbCBzZXQgdGhlIHRleHQgb24gdGhlIGNvbnRyb2xcclxuICAgICAgICAgIC8vIGluIGFkZGl0aW9uIHdlIG5lZWQgdG8gc2V0IHRoZSB0ZXh0IGZvciBpbWFnZSBidXR0b25cclxuICAgICAgICAgIC8vIEFsc28sIGRvIG5vdCBvdmVycmlkZSB0aGUgdGV4dCB3aXRoIHRoZSBmb3JtYXQgaWYgdGhlIGNvbnRyb2wgaGFzIGFuIGV4cHJlc3Npb24uXHJcbiAgICAgICAgICAvLyBRQ1IjIDkzODkzMy4gV2hlbiB0aGUgY29udHJvbCBpcyByZWZyZXNoZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCB3ZSBzaG91bGQgc2hvdyB0aGUgdGV4dCBhcyBpdFxyXG4gICAgICAgICAgLy8gaXMgaW4gdGhlIEZvcm1hdCBwcm9wZXJ0eSAtIGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyIGZpZWxkIG9yIGV4cHJlc3Npb24gaXMgYXR0YWNoZWQgdG8gaXQgb3Igbm90LlxyXG4gICAgICAgICAgLy8gVGhlIGZpeCBpcyBjb25maW5lZCB0byBDb250cm9sVHlwZXMuQ1RSTF9UWVBFX0JVVFRPTiBiZWNhdXNlIG9ubHkgaW4gY2FzZSBvZiBCdXR0b24gd2UgZGlzcGxheSB0aGUgdmFsdWUgb2YgdGhlIEZvcm1hdCBwcm9wZXJ0eS5cclxuICAgICAgICAgIGlmIChjdHJsLmdldEZpZWxkKCkgPT0gbnVsbCAmJiAhY3RybC5leHByZXNzaW9uU2V0QXNEYXRhKCkgfHwgY3RybC5Jc0ltYWdlQnV0dG9uKCkgfHwgKHRoaXMuX3BhcmVudE9iai5Jc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKSkpXHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tbWFuZFR5cGVUZXh0KHRoaXMuZ2V0TGluZSgpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUOlxyXG5cclxuICAgICAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQpIHtcclxuICAgICAgICAgICAgaWYgKGN0cmxQaWMuZ2V0QXR0cigpICE9PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMpIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25Gb3JtYXQoKVwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgb25MYWJlbChjdXJyTGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgLy8gU0VMRUNUIGNvbnRyb2wuIE5vdGUgd2UgZG8gbm90IHN1cHBvcnQgZHluYW1pYyBjaGFuZ2Ugb2YgcmFkaW8gYnV0dG9ucyByYW5nZSFcclxuICAgICAgLy8gZGF0YSBjb250cm9sIHJhbmdlcyBhcmUgdXBkYXRlZCB3aGVuIHdlIHNldCB2YWx1ZXMgdG8gdGhlbSBpbiBDb250cm9sLnJlZnJlc2hEaXNwVmFsKClcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgbGV0IGxpbmU6IG51bWJlcjtcclxuXHJcbiAgICAgIGlmIChjdXJyTGluZSA9PT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgbGluZSA9IGN0cmwuZ2V0RGlzcGxheUxpbmUoZmFsc2UpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgbGluZSA9IGN1cnJMaW5lO1xyXG5cclxuICAgICAgLy8gb24gY29tYm8gYm94IGNvbXBmb3IgY2hlY2sgYm94IHRoZSBsYWJlbCBpcyB0aGUgaXRlbSBsaXN0IHByb3BlcnR5XHJcbiAgICAgIGlmIChjdHJsLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YKVxyXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZFR5cGVUZXh0KGxpbmUpO1xyXG4gICAgICBlbHNlIGlmIChjdHJsLmlzU2VsZWN0aW9uQ3RybCgpIHx8IGN0cmwuaXNUYWJDb250cm9sKCkgfHwgY3RybC5pc1JhZGlvKCkpIHtcclxuICAgICAgICBjdHJsLnNldFJhbmdlKGF3YWl0IHRoaXMuZ2V0VmFsdWUoKSk7XHJcbiAgICAgICAgY3RybC5jbGVhclJhbmdlKGxpbmUpO1xyXG4gICAgICAgIGF3YWl0IGN0cmwucmVmcmVzaEFuZFNldEl0ZW1zTGlzdChsaW5lLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gSWYgSXRlbUxpc3QgaGFzIGFuIGV4cHJlc3Npb24gQW5kIGl0IG1heSBiZSBtb2RpZmllZCBhZ2FpbiwgcmVmcmVzaCB0aGUgZGlzcGxheSB2YWx1ZSBvZiBjb250cm9sLlxyXG4gICAgICAgIC8vIEJlY2F1c2UgaXQgbWF5IGJlIHBvc3NpYmxlIHRoYXQgZGlzcGxheSB2YWx1ZSB3aWxsIGNoYW5nZS5cclxuICAgICAgICBpZiAodGhpcy5fZXhwSWQgPiAwKVxyXG4gICAgICAgICAgYXdhaXQgY3RybC5Db21wdXRlQW5kUmVmcmVzaERpc3BsYXlWYWx1ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoKDxNZ0NvbnRyb2xCYXNlPmN0cmwpLkhhc0F1dG9jb21wbGV0ZSgpKVxyXG4gICAgICAgIGF3YWl0IGN0cmwucmVmcmVzaEFuZFNldEl0ZW1zTGlzdChsaW5lLCB0cnVlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcIlByb3BlcnR5Lm9uTGFiZWwoKSwgbm90IHN1cHBvcnQgY29udHJvbFwiKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25MYWJlbCgpXCIpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWxsIHRoZSBwcm9wZXJ0aWVzIHRoYXQgc3VwcG9ydCBpbiBzdWJmb3JtLCBtdXN0IGNhbGwgdGhpcyBtZXRob2RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRPYmplY3RCeVBhcmVudE9iaigpOiBhbnkge1xyXG4gICAgbGV0IHJlc3VsdDogYW55ID0gdGhpcy5fcGFyZW50T2JqO1xyXG5cclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfRk9STSkge1xyXG4gICAgICBsZXQgZm9ybTogR3VpRm9ybVByb3BlcnR5QWRhcHRlciA9IDxHdWlGb3JtUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICBpZiAoZm9ybS5pc1N1YkZvcm0oKSlcclxuICAgICAgICByZXN1bHQgPSBmb3JtLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByb3BJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgaXNSZXBlYXRhYmxlSW5UYWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgY3VycmVudCBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TGluZSgpOiBudW1iZXIge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IGN0cmw6IEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIgPSA8R3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudE9iajtcclxuICAgICAgbGV0IGRpc3BsYXlMaW5lRm9yVHJlZU9yVGFibGU6IGJvb2xlYW4gPSBjdHJsLmlzUHJvcGVydHlSZXBlYXRhYmxlKHRoaXMuX2lkKTtcclxuXHJcbiAgICAgIGxpbmUgPSBjdHJsLmdldERpc3BsYXlMaW5lKGRpc3BsYXlMaW5lRm9yVHJlZU9yVGFibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsaW5lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBvcmlnaW5hbCB2YWx1ZSBvZiBwcm9wZXJ0eSB0aGF0IHdhcyBjb21wdXRlZCBiZWZvcmUgZXhlY3V0aW9uIG9mIGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0T3JnVmFsdWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9vcmdWYWx1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHNpemUgb2YgcHJldnZhbHVlcyBhcnJheVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdTaXplXCI+PC9wYXJhbT5cclxuICB1cGRhdGVQcmV2VmFsdWVBcnJheShuZXdTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5TaG91bGRTa2lwUmVmcmVzaCgpKVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNsZWFyIF9wcmV2VmFsdWVzIGFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1NpemVcIj48L3BhcmFtPlxyXG4gIGNsZWFyUHJldlZhbHVlQXJyYXkoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLkNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBSZXNldFByZXZWYWx1ZUFycmF5KCk6IHZvaWQge1xyXG4gICAgbGV0IGNvdW50OiBudW1iZXIgPSB0aGlzLl9wcmV2VmFsdWVzLmxlbmd0aDtcclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMuQ2xlYXIoKTtcclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMuU2V0U2l6ZShjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY29tcHV0ZSBhbmQgc2V0IGFycmF5cyBzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFByZXZBcnJheVNpemUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0ZPUk0gfHwgdGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgbGV0IHNpemU6IG51bWJlciA9IDE7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VHlwZSA9PT0gR3VpQ29uc3RhbnRzLlBBUkVOVF9UWVBFX0NPTlRST0wpIHtcclxuICAgICAgICBsZXQgbWdDb250cm9sQmFzZTogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciA9IDxHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyPjxhbnk+dGhpcy5fcGFyZW50T2JqO1xyXG4gICAgICAgIGlmIChtZ0NvbnRyb2xCYXNlLklzUmVwZWF0YWJsZSlcclxuICAgICAgICAgIHNpemUgPSBtZ0NvbnRyb2xCYXNlLmdldEZvcm0oKS5nZXRUYWJsZUl0ZW1zQ291bnQoKTtcclxuICAgICAgICBlbHNlIGlmIChtZ0NvbnRyb2xCYXNlLmlzVGFibGVDb250cm9sKCkgJiYgUHJvcGVydHkuaXNSZXBlYXRhYmxlSW5UYWJsZSgpKVxyXG4gICAgICAgICAgc2l6ZSA9IG1nQ29udHJvbEJhc2UuZ2V0Rm9ybSgpLmdldFRhYmxlSXRlbXNDb3VudCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLlNldFNpemUoc2l6ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUGFzc3dvcmQgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25QYXNzd29yZCgpIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTClcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLmdldE9iamVjdEJ5UGFyZW50T2JqKCksIHRoaXMuZ2V0TGluZSgpLCBIdG1sUHJvcGVydGllcy5QYXNzd29yZCwgdGhpcy5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpKTtcclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkub25QYXNzd29yZCgpXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgdXNlciBwcm9wZXJ0eSBUaXRsZVBhZGRpbmcgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgY29tcHV0ZUN1c3RvbVByb3BlcnRpZXNWYWx1ZXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBmb3IgKGxldCBbY3VzdG9tUHJvcGVydHlLZXksIGN1c3RvbVByb3BlcnR5VmFsdWVdIG9mIHRoaXMuY3VzdG9tUHJvcGVydGllcykge1xyXG4gICAgICBsZXQgZXhwcmVzc2lvbiA9IGN1c3RvbVByb3BlcnR5VmFsdWU7XHJcbiAgICAgIC8vIGluaXQgdGhlIHZhbHVlXHJcbiAgICAgIGxldCByZXRFeHByZXNzaW9uVmFsdWUgPSBhd2FpdCB0aGlzLkdldFJldHJ1blZhbHVlRm9yQ3VzdG9tUHJvcGVydHlFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xyXG4gICAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXNWYWx1ZXMuc2V0KGN1c3RvbVByb3BlcnR5S2V5LCByZXRFeHByZXNzaW9uVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb21wdXRlIGN1c3RvbSB2YWxpZGF0b3JzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGNvbXB1dGVDdXN0b21WYWxpZGF0b3JzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IG1nQ29udHJvbCA9IDxNZ0NvbnRyb2xCYXNlPnRoaXMuX3BhcmVudE9iajtcclxuICAgIGxldCBldmFsdWF0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKG1nQ29udHJvbC5Nb2RpZmllZEJ5VXNlciB8fCBtZ0NvbnRyb2wuVmFsaWRhdGVDb250cm9sIHx8IHRoaXMuR2V0VGFza0J5UGFyZW50T2JqZWN0KCkuSXNJblJlY29tcHV0ZSgpKXtcclxuICAgICAgZm9yIChsZXQgW2N1c3RvbVByb3BlcnR5S2V5LCBjdXN0b21WYWxpZGF0b3JQcm9wZXJ0eV0gb2YgdGhpcy5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgbGV0IGV4cHJlc3Npb24gPSAoPEN1c3RvbVZhbGlkYXRvclByb3A+Y3VzdG9tVmFsaWRhdG9yUHJvcGVydHkpLl9leHA7XHJcbiAgICAgICAgLy8gaW5pdCB0aGUgdmFsdWVcclxuICAgICAgICBsZXQgaXNJblZhbGlkID0gYXdhaXQgdGhpcy5HZXRSZXRydW5WYWx1ZUZvckN1c3RvbVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICAgICAgICBsZXQgZXJyU3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgSW5WYWxpZCA9IChpc0luVmFsaWQgPT09IFwiMVwiKSA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICBpZiAoSW5WYWxpZCkge1xyXG4gICAgICAgICAgZXhwcmVzc2lvbiA9ICg8Q3VzdG9tVmFsaWRhdG9yUHJvcD5jdXN0b21WYWxpZGF0b3JQcm9wZXJ0eSkuX2Vycm9yTWVzc2FnZUV4cDtcclxuICAgICAgICAgIGlmIChleHByZXNzaW9uID4gMClcclxuICAgICAgICAgICAgZXJyU3RyaW5nID0gYXdhaXQgdGhpcy5HZXRSZXRydW5WYWx1ZUZvckN1c3RvbVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgZXJyU3RyaW5nID0gKDxDdXN0b21WYWxpZGF0b3JQcm9wPmN1c3RvbVZhbGlkYXRvclByb3BlcnR5KS5fZXJyb3JNZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBldmFsdWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVmFsaWRhdG9yVmFsdWVzLnNldChjdXN0b21Qcm9wZXJ0eUtleSwgbmV3IEN1c3RvbVZhbGlkYXRvcighSW5WYWxpZCwgZXJyU3RyaW5nKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgaWYgKG1nQ29udHJvbC5pc1JlcGVhdGFibGUoKSkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVmFsaWRhdG9yVmFsdWVzLmNsZWFyKCk7XHJcbiAgICAgICAgZXZhbHVhdGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBldmFsdWF0ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldCB1c2VyIHByb3BlcnR5IFRpdGxlUGFkZGluZyBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvbkN1c3RvbVByb3BlcnRpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgZm9yIChsZXQgW2N1c3RvbVByb3BlcnR5S2V5LCBjdXN0b21Qcm9wZXJ0eVZhbHVlXSBvZiB0aGlzLmN1c3RvbVByb3BlcnRpZXNWYWx1ZXMpIHtcclxuICAgICAgLy8gdXNlIHRoaXMuX3BhcmVudE9iaiBhbmQgbm90IHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKVxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5QUk9QX1NFVF9VU0VSX1BST1BFUlRZLCB0aGlzLl9wYXJlbnRPYmosIHRoaXMuZ2V0TGluZSgpLCBjdXN0b21Qcm9wZXJ0eUtleSwgY3VzdG9tUHJvcGVydHlWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgY3VzdG9tIHZhbGlkYXRvcnMgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25DdXN0b21WYWxpZGF0b3JzKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgW2N1c3RvbVByb3BlcnR5S2V5LCBjdXN0b21Qcm9wZXJ0eVZhbHVlXSBvZiB0aGlzLmN1c3RvbVZhbGlkYXRvclZhbHVlcykge1xyXG5cclxuICAgICAgLy8gdXNlIHRoaXMuX3BhcmVudE9iaiBhbmQgbm90IHRoaXMuZ2V0T2JqZWN0QnlQYXJlbnRPYmooKVxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5QUk9QX1NFVF9DVVNUT01fVkFMSURBVE9SLCB0aGlzLl9wYXJlbnRPYmosIHRoaXMuZ2V0TGluZSgpLFxyXG4gICAgICAgIGN1c3RvbVByb3BlcnR5S2V5LCBjdXN0b21Qcm9wZXJ0eVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0IEJpbmRpbmcgTGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgb25CaW5kaW5nTGV2ZWwoKVxyXG4gIHtcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlID09PSBHdWlDb25zdGFudHMuUEFSRU5UX1RZUEVfQ09OVFJPTClcclxuICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcy5nZXRPYmplY3RCeVBhcmVudE9iaigpLCB0aGlzLmdldExpbmUoKSwgSHRtbFByb3BlcnRpZXMuQmluZGluZ0xldmVsLCB0aGlzLkdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCkpO1xyXG4gICAgZWxzZVxyXG4gICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkuQmluZGluZ0xldmVsKClcIik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uQXV0b0NvbXBsZXRlTW9kZSgpXHJcbiAge1xyXG5cclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGFzeW5jIEdldFJldHJ1blZhbHVlRm9yQ3VzdG9tUHJvcGVydHlFeHByZXNzaW9uKGV4cHJlc3Npb246IG51bWJlcik6IFByb21pc2U8YW55PiB7XHJcbiAgICBsZXQgbGVuOiBudW1iZXIgPSAyNTU7XHJcbiAgICBsZXQgZXhwU3RvcmFnZUF0dHJpYnV0ZSA9IHRoaXMuX3BhcmVudE9iai5HZXRFeHByZXNzaW9uU3RvcmFnZShleHByZXNzaW9uKTtcclxuICAgIGxldCB3YXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtKGZhbHNlKTtcclxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGF3YWl0IHRoaXMuX3BhcmVudE9iai5FdmFsdWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgZXhwU3RvcmFnZUF0dHJpYnV0ZSwgbGVuLCB0cnVlLCBTdG9yYWdlQXR0cmlidXRlLlNLSVAsIGZhbHNlLCB3YXNFdmFsdWF0ZWQpO1xyXG5cclxuICAgIGV4cFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLl9wYXJlbnRPYmouR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwcmVzc2lvbik7XHJcbiAgICBsZXQgY29tcElkeDogbnVtYmVyID0gdGhpcy5fcGFyZW50T2JqLmdldENvbXBJZHgoKTtcclxuXHJcbiAgICBzd2l0Y2ggKGV4cFN0b3JhZ2VBdHRyaWJ1dGUpIHtcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgbGV0IHRlbXBQaWMgPSBuZXcgUElDKFwiTjYuMlwiLCBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMsIHRoaXMuX3BhcmVudE9iai5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuVmFsdWUgPSBcIkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIjtcclxuICAgICAgICByZXR1cm5WYWx1ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChyZXR1cm5WYWx1ZSwgXCJcIiwgdGVtcFBpYywgZmFsc2UsIGNvbXBJZHgsIGZhbHNlKS50cmltKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICB0ZW1wUGljID0gbmV3IFBJQyhcIiMjLyMjLyMjIyNcIiwgZXhwU3RvcmFnZUF0dHJpYnV0ZSwgY29tcElkeCk7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AocmV0dXJuVmFsdWUsIFwiXCIsIHRlbXBQaWMsIHRydWUsIGZhbHNlLCBjb21wSWR4LCB0cnVlKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOlxyXG4gICAgICAgIHRlbXBQaWMgPSBuZXcgUElDKFwiIyM6IyMvIyMjI1wiLCBleHBTdG9yYWdlQXR0cmlidXRlLCBjb21wSWR4KTtcclxuICAgICAgICByZXR1cm5WYWx1ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChyZXR1cm5WYWx1ZSwgXCJcIiwgdGVtcFBpYywgdHJ1ZSwgZmFsc2UsIGNvbXBJZHgsIHRydWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU46XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9COlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFOlxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTk9ORTpcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiaW4gUHJvcGVydHkuR2V0UmV0cnVuVmFsdWVGb3JDdXN0b21Qcm9wZXJ0eUV4cHJlc3Npb24oKSBpbGxlZ2FsIGRhdGEgdHlwZTogXCIgKyBleHBTdG9yYWdlQXR0cmlidXRlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWR4XCI+PC9wYXJhbT5cclxuICBSZW1vdmVQcmV2VmFsSW5kZXhBdChpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3ByZXZWYWx1ZXMubGVuZ3RoID4gaWR4KSB7XHJcbiAgICAgIHRoaXMuX3ByZXZWYWx1ZXMuUmVtb3ZlQXQoaWR4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgSW5zZXJ0UHJldlZhbEF0KGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLkluc2VydChpZHgsIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWR4XCI+PC9wYXJhbT5cclxuICByZXNldFByZXZWYWxBdChpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IHRoaXMuX3ByZXZWYWx1ZXMubGVuZ3RoKVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKGlkeCwgbnVsbCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcInswfSA9IHsxfSAoZXhwPXsyfSwgc3R1ZGlvIHZhbHVlPXszfSlcIiwgW1xyXG4gICAgICBQcm9wRGVmYXVsdHMuR2V0UHJvcGVydHlOYW1lKHRoaXMuX2lkKSwgKHRoaXMuX3ZhbCA9PT0gbnVsbCkgPyBcImlzIG51bGxcIiA6IHRoaXMuX3ZhbCwgdGhpcy5fZXhwSWQsIHRoaXMuU3R1ZGlvVmFsdWVcclxuICAgIF0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXREZWZhdWx0UHJvcCgpIHJldHVybnMgYSBwcm9wZXJ0eSB0aGF0IGhhcyBhIHN5c3RlbSBkZWZhdWx0IHZhbHVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj5UaGUgcHJvcGVydHkgaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50VHlwZVwiPlBBUkVOVF9UWVBFX0NPTlRST0wsIFBBUkVOVF9UWVBFX0ZPUk0sIFBBUkVOVF9UWVBFX1RBU0s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcFBhcmVudFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBQcm9wZXJ0eSB0aGF0IGhhcyBhIHN5c3RlbSBkZWZhdWx0IHZhbHVlPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXREZWZhdWx0UHJvcChwcm9wSWQ6IG51bWJlciwgcGFyZW50VHlwZTogc3RyaW5nLCBwcm9wUGFyZW50OiBQcm9wUGFyZW50SW50ZXJmYWNlKTogUHJvcGVydHkge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gbnVsbDtcclxuICAgIGxldCBtZ1ZhbDogc3RyaW5nID0gUHJvcERlZmF1bHRzLmdldERlZmF1bHRWYWx1ZShwcm9wSWQsIHBhcmVudFR5cGUsIHByb3BQYXJlbnQpO1xyXG5cclxuICAgIGlmIChtZ1ZhbCAhPT0gbnVsbClcclxuICAgICAgcHJvcCA9IG5ldyBQcm9wZXJ0eShwcm9wSWQsIHByb3BQYXJlbnQsIHBhcmVudFR5cGUsIG1nVmFsKTtcclxuXHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIEluc2VydFByZXZWYWx1ZUFycmF5KGNvdW50OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5TaG91bGRTa2lwUmVmcmVzaCgpKVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLkluc2VydFJhbmdlKG5ldyBBcnJheShjb3VudCkpO1xyXG4gIH1cclxufVxyXG4iXX0=
|