@magic-xpa/gui 4.1200.0-dev4120.21 → 4.1200.0-dev4120.213
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/magic-xpa-gui.mjs +5724 -249
- package/fesm2022/magic-xpa-gui.mjs.map +1 -1
- package/index.d.ts +3 -0
- package/package.json +2 -4
- package/src/GuiEnums.d.ts +3 -0
- package/src/gui/GuiMgControl.d.ts +1 -0
- package/src/management/exp/ExpressionInterface.d.ts +1 -0
- package/src/management/gui/MgControlBase.d.ts +1 -1
- package/src/management/gui/PropInterface.d.ts +2 -1
- package/esm2022/index.mjs +0 -71
- package/esm2022/magic-xpa-gui.mjs +0 -2
- package/esm2022/src/Commands.mjs +0 -184
- package/esm2022/src/Events.mjs +0 -425
- package/esm2022/src/EventsProcessor.mjs +0 -67
- package/esm2022/src/FocusManager.mjs +0 -34
- package/esm2022/src/GuiConstants.mjs +0 -68
- package/esm2022/src/GuiEnums.mjs +0 -301
- package/esm2022/src/GuiEnvironment.mjs +0 -4
- package/esm2022/src/IFlowMonitorQueue.mjs +0 -2
- package/esm2022/src/Manager.mjs +0 -91
- package/esm2022/src/UIBridge.mjs +0 -33
- package/esm2022/src/env/IEnvironment.mjs +0 -2
- package/esm2022/src/gui/ControlBase.mjs +0 -3
- package/esm2022/src/gui/GuiMgControl.mjs +0 -123
- package/esm2022/src/gui/GuiMgForm.mjs +0 -4
- package/esm2022/src/gui/KeyboardItem.mjs +0 -135
- package/esm2022/src/gui/LastFocusedVal.mjs +0 -11
- package/esm2022/src/gui/MgValue.mjs +0 -16
- package/esm2022/src/gui/PropParentInterface.mjs +0 -2
- package/esm2022/src/gui/low/DialogHandler.mjs +0 -7
- package/esm2022/src/gui/low/GuiCommand.mjs +0 -68
- package/esm2022/src/gui/low/GuiCommandQueue.mjs +0 -35
- package/esm2022/src/gui/low/GuiInteractive.mjs +0 -178
- package/esm2022/src/gui/low/Style.mjs +0 -20
- package/esm2022/src/management/RuntimeContextBase.mjs +0 -42
- package/esm2022/src/management/data/BlobType.mjs +0 -281
- package/esm2022/src/management/data/DcValues.mjs +0 -214
- package/esm2022/src/management/data/DcValuesBuilderBase.mjs +0 -96
- package/esm2022/src/management/data/FieldDef.mjs +0 -331
- package/esm2022/src/management/data/FieldsTable.mjs +0 -54
- package/esm2022/src/management/data/GuiDataViewBase.mjs +0 -88
- package/esm2022/src/management/data/GuiFieldBase.mjs +0 -82
- package/esm2022/src/management/data/IRecord.mjs +0 -2
- package/esm2022/src/management/data/IReferencedObject.mjs +0 -2
- package/esm2022/src/management/data/NUM_TYPE.mjs +0 -1739
- package/esm2022/src/management/data/ObjectReferenceBase.mjs +0 -48
- package/esm2022/src/management/data/ObjectReferencesCollection.mjs +0 -27
- package/esm2022/src/management/data/RecordUtils.mjs +0 -361
- package/esm2022/src/management/data/VectorType.mjs +0 -612
- package/esm2022/src/management/data/VectorTypeBase.mjs +0 -88
- package/esm2022/src/management/events/IActionManager.mjs +0 -2
- package/esm2022/src/management/events/IGuiEventsManager.mjs +0 -2
- package/esm2022/src/management/exp/ExpressionInterface.mjs +0 -244
- package/esm2022/src/management/exp/GuiExpressionEvaluator.mjs +0 -305
- package/esm2022/src/management/gui/ControlTable.mjs +0 -118
- package/esm2022/src/management/gui/DisplayConvertor.mjs +0 -1649
- package/esm2022/src/management/gui/FieldValidator.mjs +0 -711
- package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +0 -24
- package/esm2022/src/management/gui/GuiFormPropertyAdapter.mjs +0 -11
- package/esm2022/src/management/gui/HebrewDate.mjs +0 -278
- package/esm2022/src/management/gui/Helps.mjs +0 -237
- package/esm2022/src/management/gui/MgControlBase.mjs +0 -1869
- package/esm2022/src/management/gui/MgFormBase.mjs +0 -741
- package/esm2022/src/management/gui/PIC.mjs +0 -1185
- package/esm2022/src/management/gui/PropDefaults.mjs +0 -230
- package/esm2022/src/management/gui/PropInterface.mjs +0 -246
- package/esm2022/src/management/gui/PropTable.mjs +0 -221
- package/esm2022/src/management/gui/Property.mjs +0 -1362
- package/esm2022/src/management/gui/ValidationDetails.mjs +0 -248
- package/esm2022/src/management/gui/ValidationDetailsBase.mjs +0 -93
- package/esm2022/src/management/gui/WrongFormatException.mjs +0 -29
- package/esm2022/src/management/tasks/GuiDataCollection.mjs +0 -4
- package/esm2022/src/management/tasks/GuiTaskBase.mjs +0 -511
- package/esm2022/src/management/tasks/IMGDataTable.mjs +0 -2
- package/esm2022/src/management/tasks/ITask.mjs +0 -2
- package/esm2022/src/management/tasks/MgTimer.mjs +0 -21
- package/esm2022/src/management/tasks/TaskDefinitionId.mjs +0 -54
- package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
- package/esm2022/src/util/MemoryUtil.mjs +0 -35
- package/esm2022/src/util/ObjectReference.mjs +0 -36
- package/esm2022/src/util/UsernamePasswordCredentials.mjs +0 -52
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
import { ApplicationException, Hashtable, List, NNumber, NString } from "@magic-xpa/mscorelib";
|
|
2
|
-
import { Property } from "./Property";
|
|
3
|
-
import { XMLConstants, XmlParser } from "@magic-xpa/utils";
|
|
4
|
-
import { Events } from "../../Events";
|
|
5
|
-
import { PropInterface } from "./PropInterface";
|
|
6
|
-
import { GuiFormPropertyAdapter } from "./GuiFormPropertyAdapter";
|
|
7
|
-
import { GuiControlPropertyAdapter } from "./GuiControlPropertyAdapter";
|
|
8
|
-
export class PropTable {
|
|
9
|
-
_hashTab = null;
|
|
10
|
-
_props = null;
|
|
11
|
-
_parent = null;
|
|
12
|
-
constructor(parent_) {
|
|
13
|
-
if (arguments.length === 0) {
|
|
14
|
-
this.constructor_0();
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
this.constructor_1(parent_);
|
|
18
|
-
}
|
|
19
|
-
constructor_0() {
|
|
20
|
-
this._props = new List();
|
|
21
|
-
this._hashTab = new Hashtable(20);
|
|
22
|
-
}
|
|
23
|
-
constructor_1(parent_) {
|
|
24
|
-
this.constructor_0();
|
|
25
|
-
this._parent = parent_;
|
|
26
|
-
}
|
|
27
|
-
fillData(parentObj, parType, parser) {
|
|
28
|
-
while (this.initInnerObjects(parser.getNextTag(), parentObj, parType, parser)) {
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
fillDataByExists(task, parser) {
|
|
32
|
-
while (this.fillExistInnerObjects(parser.getNextTag(), task, parser)) {
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
initInnerObjects(foundTagName, parentObj, parType, parser) {
|
|
36
|
-
if (foundTagName !== null && foundTagName === XMLConstants.MG_TAG_PROP) {
|
|
37
|
-
let property = new Property();
|
|
38
|
-
property.fillData(parentObj, parType, parser);
|
|
39
|
-
this.addProp(property);
|
|
40
|
-
}
|
|
41
|
-
else
|
|
42
|
-
return false;
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
addProp(prop) {
|
|
46
|
-
this._hashTab.set_Item(prop.getID(), prop);
|
|
47
|
-
this._props.push(prop);
|
|
48
|
-
}
|
|
49
|
-
delPropById(id) {
|
|
50
|
-
if (this._props === null)
|
|
51
|
-
return;
|
|
52
|
-
let existingProp = this._hashTab.get_Item(id);
|
|
53
|
-
if (existingProp !== null) {
|
|
54
|
-
this._props.Remove(existingProp);
|
|
55
|
-
this._hashTab.Remove(id);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
fillExistInnerObjects(nameOfFound, task, parser) {
|
|
59
|
-
let tokensVector = new List();
|
|
60
|
-
let endContext = -1;
|
|
61
|
-
if (nameOfFound == null)
|
|
62
|
-
return false;
|
|
63
|
-
if (nameOfFound === XMLConstants.MG_TAG_CONTROL)
|
|
64
|
-
endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
|
65
|
-
else if (nameOfFound === XMLConstants.MG_TAG_PROP)
|
|
66
|
-
endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
|
|
67
|
-
else if (nameOfFound === ('/' + XMLConstants.MG_TAG_CONTROL) ||
|
|
68
|
-
GuiFormPropertyAdapter.IsEndFormTag(nameOfFound)) {
|
|
69
|
-
parser.setCurrIndex2EndOfTag();
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
73
|
-
let tag = parser.getXMLsubstring(endContext);
|
|
74
|
-
parser.add2CurrIndex(tag.indexOf(nameOfFound) + nameOfFound.length);
|
|
75
|
-
tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
76
|
-
if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
|
|
77
|
-
this._parent = task.getCtrl(NNumber.Parse(this.fillName(tokensVector)));
|
|
78
|
-
parser.setCurrIndex(++endContext);
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
else if (nameOfFound === XMLConstants.MG_TAG_PROP) {
|
|
82
|
-
if (this._parent != null) {
|
|
83
|
-
let strPropId = this.fillName(tokensVector);
|
|
84
|
-
let propId = NNumber.Parse(strPropId);
|
|
85
|
-
let prop = null;
|
|
86
|
-
if (this._parent != null)
|
|
87
|
-
prop = this._parent.getProp(propId);
|
|
88
|
-
if (prop == null)
|
|
89
|
-
Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() no property with id={0}", strPropId));
|
|
90
|
-
else
|
|
91
|
-
this.addProp(prop);
|
|
92
|
-
parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
else
|
|
96
|
-
Events.WriteExceptionToLog("in PropTable.fillExistInnerObjects() missing control");
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
Events.WriteExceptionToLog(NString.Format("in PropTable.fillExistInnerObjects() illegal tag name: {0}", nameOfFound));
|
|
100
|
-
parser.setCurrIndex(++endContext);
|
|
101
|
-
return true;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (nameOfFound === XMLConstants.MG_TAG_CONTROL) {
|
|
105
|
-
parser.setCurrIndex(++endContext);
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
else if (GuiFormPropertyAdapter.IsFormTag(nameOfFound)) {
|
|
109
|
-
this._parent = task.getForm();
|
|
110
|
-
this._parent.fillName(nameOfFound);
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
else if (nameOfFound === ('/' + XMLConstants.MG_TAG_FLD))
|
|
114
|
-
return false;
|
|
115
|
-
parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
|
|
116
|
-
return true;
|
|
117
|
-
}
|
|
118
|
-
fillName(tokensVector) {
|
|
119
|
-
let attribute = null;
|
|
120
|
-
let valueStr;
|
|
121
|
-
for (let j = 0; j < tokensVector.length; j = j + 2) {
|
|
122
|
-
attribute = tokensVector.get_Item(j);
|
|
123
|
-
valueStr = tokensVector.get_Item(j + 1);
|
|
124
|
-
if (attribute === XMLConstants.MG_ATTR_DITIDX || attribute === XMLConstants.MG_ATTR_ID)
|
|
125
|
-
return valueStr;
|
|
126
|
-
}
|
|
127
|
-
Events.WriteExceptionToLog(NString.Format("Unrecognized attribute: '{0}'", attribute));
|
|
128
|
-
return null;
|
|
129
|
-
}
|
|
130
|
-
getSize() {
|
|
131
|
-
return this._props.length;
|
|
132
|
-
}
|
|
133
|
-
getProp(idx) {
|
|
134
|
-
if (idx < 0 || idx >= this._props.length)
|
|
135
|
-
return null;
|
|
136
|
-
return this._props.get_Item(idx);
|
|
137
|
-
}
|
|
138
|
-
getPropById(id) {
|
|
139
|
-
return this._hashTab.get_Item(id);
|
|
140
|
-
}
|
|
141
|
-
propExists(id) {
|
|
142
|
-
return this.getPropById(id) !== null;
|
|
143
|
-
}
|
|
144
|
-
setProp(propId, val, parent, parentType) {
|
|
145
|
-
let prop = this.getPropById(propId);
|
|
146
|
-
if (prop === null) {
|
|
147
|
-
prop = new Property(propId, parent, parentType);
|
|
148
|
-
this.addProp(prop);
|
|
149
|
-
}
|
|
150
|
-
prop.setValue(val);
|
|
151
|
-
prop.setOrgValue();
|
|
152
|
-
}
|
|
153
|
-
async RefreshDisplay(forceRefresh, onlyRepeatableProps) {
|
|
154
|
-
let allPropsRefreshed = true;
|
|
155
|
-
let prop;
|
|
156
|
-
let i = 0;
|
|
157
|
-
let form = null;
|
|
158
|
-
let visibleProps = new List();
|
|
159
|
-
if (this._parent != null && this._parent instanceof GuiControlPropertyAdapter)
|
|
160
|
-
form = this._parent.getForm();
|
|
161
|
-
if (form != null)
|
|
162
|
-
form.checkAndCreateRow(form.DisplayLine);
|
|
163
|
-
for (i = 0; i < this.getSize(); i++) {
|
|
164
|
-
prop = this.getProp(i);
|
|
165
|
-
try {
|
|
166
|
-
if (onlyRepeatableProps && !Property.isRepeatableInTable())
|
|
167
|
-
continue;
|
|
168
|
-
if (prop.getID() === PropInterface.PROP_TYPE_VISIBLE)
|
|
169
|
-
visibleProps.push(prop);
|
|
170
|
-
else
|
|
171
|
-
await prop.RefreshDisplay(forceRefresh);
|
|
172
|
-
}
|
|
173
|
-
catch (ex) {
|
|
174
|
-
if (ex instanceof ApplicationException) {
|
|
175
|
-
Events.WriteExceptionToLog(ex);
|
|
176
|
-
allPropsRefreshed = false;
|
|
177
|
-
}
|
|
178
|
-
else
|
|
179
|
-
throw ex;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
for (let i = 0; i < visibleProps.length; i++) {
|
|
183
|
-
let visibleProp = visibleProps[i];
|
|
184
|
-
await visibleProp.RefreshDisplay(forceRefresh);
|
|
185
|
-
}
|
|
186
|
-
return allPropsRefreshed;
|
|
187
|
-
}
|
|
188
|
-
updatePrevValueArray(newSize) {
|
|
189
|
-
for (let i = 0; i < this._props.length; i = i + 1) {
|
|
190
|
-
let property = this._props.get_Item(i);
|
|
191
|
-
property.updatePrevValueArray(newSize);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
resetPrevValueArray() {
|
|
195
|
-
for (let i = 0; i < this._props.length; i = i + 1) {
|
|
196
|
-
let property = this._props.get_Item(i);
|
|
197
|
-
property.ResetPrevValueArray();
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
resetPrevValAt(index) {
|
|
201
|
-
for (let i = 0; i < this._props.length; i = i + 1) {
|
|
202
|
-
let property = this._props.get_Item(i);
|
|
203
|
-
property.resetPrevValAt(index);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
clearLabelPrevValueArray() {
|
|
207
|
-
let labelProperty = this.getPropById(45);
|
|
208
|
-
if (labelProperty !== null)
|
|
209
|
-
labelProperty.clearPrevValueArray();
|
|
210
|
-
}
|
|
211
|
-
getCtrlRef() {
|
|
212
|
-
return ((this._parent instanceof GuiControlPropertyAdapter) ? this._parent : null);
|
|
213
|
-
}
|
|
214
|
-
InsertPrevValueArray(count) {
|
|
215
|
-
for (let i = 0; i < this._props.length; i++) {
|
|
216
|
-
let prop = this._props[i];
|
|
217
|
-
prop.InsertPrevValueArray(count);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcFRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9tYW5hZ2VtZW50L2d1aS9Qcm9wVGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsT0FBTyxFQUFDLFlBQVksRUFBRSxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUt0RSxNQUFNLE9BQU8sU0FBUztJQUVaLFFBQVEsR0FBZ0MsSUFBSSxDQUFDO0lBQzdDLE1BQU0sR0FBbUIsSUFBSSxDQUFDO0lBQzlCLE9BQU8sR0FBd0IsSUFBSSxDQUFDO0lBUTVDLFlBQVksT0FBNkI7UUFFdkMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksSUFBSSxFQUFZLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFNBQVMsQ0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLGFBQWEsQ0FB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YmVyLCBOU3RyaW5nfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtQcm9wZXJ0eX0gZnJvbSBcIi4vUHJvcGVydHlcIjtcclxuaW1wb3J0IHtQcm9wUGFyZW50SW50ZXJmYWNlfSBmcm9tIFwiLi4vLi4vZ3VpL1Byb3BQYXJlbnRJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtYTUxDb25zdGFudHMsIFhtbFBhcnNlcn0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtHdWlUYXNrQmFzZX0gZnJvbSBcIi4uL3Rhc2tzL0d1aVRhc2tCYXNlXCI7XHJcbmltcG9ydCB7RXZlbnRzfSBmcm9tIFwiLi4vLi4vRXZlbnRzXCI7XHJcbmltcG9ydCB7UHJvcEludGVyZmFjZX0gZnJvbSBcIi4vUHJvcEludGVyZmFjZVwiO1xyXG5pbXBvcnQge0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXJ9IGZyb20gXCIuL0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXJcIjtcclxuaW1wb3J0IHtHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyfSBmcm9tIFwiLi9HdWlDb250cm9sUHJvcGVydHlBZGFwdGVyXCI7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIHByb3BlcnRpZXMgdGFibGVcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFByb3BUYWJsZSB7XHJcblxyXG4gIHByaXZhdGUgX2hhc2hUYWI6IEhhc2h0YWJsZTxudW1iZXIsIFByb3BlcnR5PiA9IG51bGw7IC8vIGZvciBmYXN0IGFjY2VzcyB0byBwcm9wZXJ0aWVzXHJcbiAgcHJpdmF0ZSBfcHJvcHM6IExpc3Q8UHJvcGVydHk+ID0gbnVsbDtcclxuICBwcml2YXRlIF9wYXJlbnQ6IFByb3BQYXJlbnRJbnRlcmZhY2UgPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50XzogUHJvcFBhcmVudEludGVyZmFjZSk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50Xz86IFByb3BQYXJlbnRJbnRlcmZhY2UpIHtcclxuXHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHBhcmVudF8pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJvcHMgPSBuZXcgTGlzdDxQcm9wZXJ0eT4oKTtcclxuICAgIHRoaXMuX2hhc2hUYWIgPSBuZXcgSGFzaHRhYmxlPG51bWJlciwgUHJvcGVydHk+KDIwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShwYXJlbnRfOiBQcm9wUGFyZW50SW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudF87XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIHByb3BlcnRpZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGFyZW50T2JqXCI+cmVmZXJlbmNlIHRvIHBhcmVudCBvYmplY3QoR3VpVGFza0Jhc2UpPC9wYXJhbT5cclxuICBmaWxsRGF0YShwYXJlbnRPYmo6IFByb3BQYXJlbnRJbnRlcmZhY2UsIHBhclR5cGU6IHN0cmluZywgcGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIHdoaWxlICh0aGlzLmluaXRJbm5lck9iamVjdHMocGFyc2VyLmdldE5leHRUYWcoKSwgcGFyZW50T2JqLCBwYXJUeXBlLCBwYXJzZXIpKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRm9yIHJlY29tcHV0ZTogUGFyc2UgdGhlIGV4aXN0aW5nIHByb3BlcnRpZXMgYW5kIGNyZWF0ZSByZWZlcmVuY2VzIHRvIHRoZW1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1wiPnJlZmVyZW5jZSB0byB0aGUgcGFyZW50IEd1aVRhc2tCYXNlPC9wYXJhbT5cclxuICBmaWxsRGF0YUJ5RXhpc3RzKHRhc2s6IEd1aVRhc2tCYXNlLCBwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgd2hpbGUgKHRoaXMuZmlsbEV4aXN0SW5uZXJPYmplY3RzKHBhcnNlci5nZXROZXh0VGFnKCksIHRhc2ssIHBhcnNlcikpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBmaWxsIHRoZSBpbm5lciBvYmplY3RzIG9mIHRoZSBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj5uYW1lIG9mIHRhZywgb2Ygb2JqZWN0LCB3aGljaCBuZWVkIGJlIGFsbG9jYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRPYmpcIj5yZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvYmplY3QsIG5lZWQgYmUgYWRkZWQgdG8gZXZlcnkgUHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gTWFuYWdlci5YbWxQYXJzZXIuZ2V0Q3VyckluZGV4KCksIHRoZSBmb3VuZCBvYmplY3QgdGFnIGFuZCBBTEwgaXRzIHN1YnRhZ3MgZmluaXNoPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgaW5pdElubmVyT2JqZWN0cyhmb3VuZFRhZ05hbWU6IHN0cmluZywgcGFyZW50T2JqOiBQcm9wUGFyZW50SW50ZXJmYWNlLCBwYXJUeXBlOiBzdHJpbmcsIHBhcnNlcjogWG1sUGFyc2VyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lICE9PSBudWxsICYmIGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QKSB7XHJcbiAgICAgIGxldCBwcm9wZXJ0eTogUHJvcGVydHkgPSBuZXcgUHJvcGVydHkoKTtcclxuICAgICAgcHJvcGVydHkuZmlsbERhdGEocGFyZW50T2JqLCBwYXJUeXBlLCBwYXJzZXIpO1xyXG4gICAgICB0aGlzLmFkZFByb3AocHJvcGVydHkpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGRpbmcgcHJvcGVydHkgYnkga2V5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BcIj48L3BhcmFtPlxyXG4gIGFkZFByb3AocHJvcDogUHJvcGVydHkpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hhc2hUYWIuc2V0X0l0ZW0ocHJvcC5nZXRJRCgpLCBwcm9wKTtcclxuICAgIHRoaXMuX3Byb3BzLnB1c2gocHJvcCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+PC9wYXJhbT5cclxuICBkZWxQcm9wQnlJZChpZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fcHJvcHMgPT09IG51bGwpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgZXhpc3RpbmdQcm9wOiBQcm9wZXJ0eSA9IDxQcm9wZXJ0eT50aGlzLl9oYXNoVGFiLmdldF9JdGVtKGlkKTtcclxuICAgIGlmIChleGlzdGluZ1Byb3AgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fcHJvcHMuUmVtb3ZlKGV4aXN0aW5nUHJvcCk7XHJcbiAgICAgIHRoaXMuX2hhc2hUYWIuUmVtb3ZlKGlkKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRm9yIFJlY29tcHV0ZTogRmlsbCBQcm9wVGFibGUgd2l0aCByZWZlcmVuY2UgdG8gZXhpc3RpbmcgUHJvcFRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5yZWZlcmVuY2UgdG8gcGFyZW50IEd1aVRhc2tCYXNlPC9wYXJhbT5cclxuICBwcml2YXRlIGZpbGxFeGlzdElubmVyT2JqZWN0cyhuYW1lT2ZGb3VuZDogc3RyaW5nLCB0YXNrOiBHdWlUYXNrQmFzZSwgcGFyc2VyOiBYbWxQYXJzZXIpOiBib29sZWFuIHtcclxuXHJcbiAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgaWYgKG5hbWVPZkZvdW5kID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAobmFtZU9mRm91bmQgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTClcclxuICAgICAgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgZWxzZSBpZiAobmFtZU9mRm91bmQgPT09IFhNTENvbnN0YW50cy5NR19UQUdfUFJPUClcclxuICAgICAgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBlbHNlIGlmIChuYW1lT2ZGb3VuZCA9PT0gKCcvJyArIFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkgfHxcclxuICAgICAgR3VpRm9ybVByb3BlcnR5QWRhcHRlci5Jc0VuZEZvcm1UYWcobmFtZU9mRm91bmQpKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKG5hbWVPZkZvdW5kKSArIG5hbWVPZkZvdW5kLmxlbmd0aCk7XHJcbiAgICAgIHRva2Vuc1ZlY3RvciA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuICAgICAgaWYgKG5hbWVPZkZvdW5kID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpIHtcclxuICAgICAgICAvLyBkaXRpZHggb2YgRXhpc3RzIENvbnRyb2xcclxuICAgICAgICB0aGlzLl9wYXJlbnQgPSB0YXNrLmdldEN0cmwoTk51bWJlci5QYXJzZSh0aGlzLmZpbGxOYW1lKHRva2Vuc1ZlY3RvcikpKTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7IC8vIHRvIGRlbGV0ZSBcIj5cIlxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG5hbWVPZkZvdW5kID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApIHtcclxuICAgICAgICBpZiAodGhpcy5fcGFyZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBzdHJQcm9wSWQ6IHN0cmluZyA9IHRoaXMuZmlsbE5hbWUodG9rZW5zVmVjdG9yKTtcclxuICAgICAgICAgIGxldCBwcm9wSWQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2Uoc3RyUHJvcElkKTtcclxuICAgICAgICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAhPSBudWxsKVxyXG4gICAgICAgICAgICBwcm9wID0gdGhpcy5fcGFyZW50LmdldFByb3AocHJvcElkKTtcclxuXHJcbiAgICAgICAgICBpZiAocHJvcCA9PSBudWxsKVxyXG4gICAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIFByb3BUYWJsZS5maWxsRXhpc3RJbm5lck9iamVjdHMoKSBubyBwcm9wZXJ0eSB3aXRoIGlkPXswfVwiLCBzdHJQcm9wSWQpKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5hZGRQcm9wKHByb3ApO1xyXG4gICAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgWE1MQ29uc3RhbnRzLlRBR19URVJNLmxlbmd0aCk7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJpbiBQcm9wVGFibGUuZmlsbEV4aXN0SW5uZXJPYmplY3RzKCkgbWlzc2luZyBjb250cm9sXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gUHJvcFRhYmxlLmZpbGxFeGlzdElubmVyT2JqZWN0cygpIGlsbGVnYWwgdGFnIG5hbWU6IHswfVwiLCBuYW1lT2ZGb3VuZCkpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoKytlbmRDb250ZXh0KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChuYW1lT2ZGb3VuZCA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19DT05UUk9MKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoKytlbmRDb250ZXh0KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChHdWlGb3JtUHJvcGVydHlBZGFwdGVyLklzRm9ybVRhZyhuYW1lT2ZGb3VuZCkpIHtcclxuICAgICAgdGhpcy5fcGFyZW50ID0gdGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICg8R3VpRm9ybVByb3BlcnR5QWRhcHRlcj48YW55PnRoaXMuX3BhcmVudCkuZmlsbE5hbWUobmFtZU9mRm91bmQpO1xyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChuYW1lT2ZGb3VuZCA9PT0gKCcvJyArIFhNTENvbnN0YW50cy5NR19UQUdfRkxEKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpOyAvLyBleGl0IG9mIGJvdW5kc1xyXG4gICAgcmV0dXJuIHRydWU7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBGaW5kIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIENvbnRyb2wsIG9yIG9mIGFuIGV4aXN0aW5nIFByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IE5hbWUgb2YgY29udHJvbDwvcmV0dXJucz5cclxuICBwcml2YXRlIGZpbGxOYW1lKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogc3RyaW5nIHtcclxuICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgdmFsdWVTdHI6IHN0cmluZztcclxuXHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiA9IGogKyAyKSB7XHJcbiAgICAgIGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgdmFsdWVTdHIgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpO1xyXG5cclxuICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfRElUSURYIHx8IGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSUQpXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlU3RyO1xyXG4gICAgfVxyXG4gICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJVbnJlY29nbml6ZWQgYXR0cmlidXRlOiAnezB9J1wiLCBhdHRyaWJ1dGUpKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBzaXplIG9mIHRoZSB2ZWN0b3IgcHJvcHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gc2l6ZSBvZiB0aGUgcHJvcHMgbWVtYmVyPC9yZXR1cm5zPlxyXG4gIGdldFNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wcm9wcy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgUHJvcGVydHkgYnkgaXRzIGluZGV4IGluIHRoZSB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgaW5kZXggb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHJlZmVyZW5jZSB0byB0aGUgcmVxdWlyZWQgUHJvcGVydHk8L3JldHVybnM+XHJcbiAgZ2V0UHJvcChpZHg6IG51bWJlcik6IFByb3BlcnR5IHtcclxuICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSB0aGlzLl9wcm9wcy5sZW5ndGgpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3BzLmdldF9JdGVtKGlkeCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IGEgUHJvcGVydHkgYnkgaXRzIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkXCI+b2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBnZXRQcm9wQnlJZChpZDogbnVtYmVyKTogUHJvcGVydHkge1xyXG4gICAgcmV0dXJuIDxQcm9wZXJ0eT50aGlzLl9oYXNoVGFiLmdldF9JdGVtKGlkKTtcclxuICB9XHJcblxyXG4gIHByb3BFeGlzdHMoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcEJ5SWQoaWQpICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhIHByb3BlcnR5IHZhbHVlLiBpbiBjYXNlIHRoZSB0YWJsZSBkb2Vzbid0IGNvbnRhaW4gc3VjaCBwcm9wZXJ0eSwgY3JlYXRlcyBhIG5ldyBQcm9wZXJ0eSBvYmplY3QgYW5kIGFkZCBpdCB0byB0aGUgdGFibGUuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRcIj5hIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IG9iamVjdDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXJlbnRUeXBlXCI+dGhlIHR5cGUgb2YgdGhlIHBhcmVudCBvYmplY3Q8L3BhcmFtPlxyXG4gIHNldFByb3AocHJvcElkOiBudW1iZXIsIHZhbDogc3RyaW5nLCBwYXJlbnQ6IFByb3BQYXJlbnRJbnRlcmZhY2UsIHBhcmVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuICAgIGlmIChwcm9wID09PSBudWxsKSB7XHJcbiAgICAgIHByb3AgPSBuZXcgUHJvcGVydHkocHJvcElkLCBwYXJlbnQsIHBhcmVudFR5cGUpO1xyXG4gICAgICB0aGlzLmFkZFByb3AocHJvcCk7XHJcbiAgICB9XHJcbiAgICBwcm9wLnNldFZhbHVlKHZhbCk7XHJcbiAgICBwcm9wLnNldE9yZ1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCBkaXNwbGF5IG9mIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBUYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZVJlZnJlc2hcIj5pZiB0cnVlLCByZWZyZXNoIGlzIGZvcmNlZCByZWdhcmRsZXNzIG9mIHRoZSBwcmV2aW91cyB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbmx5UmVwZWF0YWJsZVByb3BzXCI+aWYgdHJ1ZSwgcmVmcmVzaGVzIG9ubHkgcmVwZWF0YWJsZSB0cmVlIHByb3BlcnRpZXM8L3BhcmFtPlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KGZvcmNlUmVmcmVzaDogYm9vbGVhbiwgb25seVJlcGVhdGFibGVQcm9wczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG5cclxuICAgIGxldCBhbGxQcm9wc1JlZnJlc2hlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHk7XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGxldCBmb3JtOiBHdWlGb3JtUHJvcGVydHlBZGFwdGVyID0gbnVsbDtcclxuICAgIGxldCB2aXNpYmxlUHJvcHM6IExpc3Q8UHJvcGVydHk+ID0gbmV3IExpc3QoKTtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudCAhPSBudWxsICYmIHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIpXHJcbiAgICAgIGZvcm0gPSAoPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+dGhpcy5fcGFyZW50KS5nZXRGb3JtKCk7XHJcblxyXG4gICAgaWYgKGZvcm0gIT0gbnVsbClcclxuICAgICAgZm9ybS5jaGVja0FuZENyZWF0ZVJvdyhmb3JtLkRpc3BsYXlMaW5lKTtcclxuXHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgcHJvcCA9IHRoaXMuZ2V0UHJvcChpKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGlzIG5vdCByZXBlYXRhYmxlIGluIHRyZWUgb3IgdGFibGUsIGFuZCBvbmx5UmVwZWF0YWJsZVByb3BzIHR1cm5lZCBvblxyXG4gICAgICAgIC8vIGRvIG5vdCByZWZyZXNoIHRoaXMgcHJvcGVydHlcclxuICAgICAgICBpZiAob25seVJlcGVhdGFibGVQcm9wcyAmJiAhUHJvcGVydHkuaXNSZXBlYXRhYmxlSW5UYWJsZSgpKVxyXG4gICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgIC8vIFJlZnJlc2ggVmlzaWJsZSBwcm9wIG9ubHkgYWZ0ZXIgcmVmcmVzaGluZyB0aGUgbmF2aWdhdGlvbiBwcm9wcyBsaWtlIFgsIFkuXHJcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgY29udHJvbCBpcyBzaG93biBvbiBpdHMgZGVmYXVsdCBsb2NhdGlvbiBmaXJzdCBhbmRcclxuICAgICAgICAvLyB0aGVuIG1vdmVkIHNvbWV3aGVyZSBlbHNlLiBBbmQgdGhpcyBpcyBjbGVhcmx5IHZpc2libGUuXHJcbiAgICAgICAgaWYgKHByb3AuZ2V0SUQoKSA9PT0gUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVklTSUJMRSlcclxuICAgICAgICAgIHZpc2libGVQcm9wcy5wdXNoKHByb3ApO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGF3YWl0IHByb3AuUmVmcmVzaERpc3BsYXkoZm9yY2VSZWZyZXNoKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgpO1xyXG4gICAgICAgICAgYWxsUHJvcHNSZWZyZXNoZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgIGV4O1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlzaWJsZVByb3BzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICBsZXQgdmlzaWJsZVByb3AgPSB2aXNpYmxlUHJvcHNbaV07XHJcbiAgICAgIGF3YWl0IHZpc2libGVQcm9wLlJlZnJlc2hEaXNwbGF5KGZvcmNlUmVmcmVzaCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFsbFByb3BzUmVmcmVzaGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSBhbGwgcHJvcGVydGllcyBhcnJheSBzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1NpemVcIj48L3BhcmFtPlxyXG4gIHVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Byb3BzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBwcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLl9wcm9wcy5nZXRfSXRlbShpKTtcclxuICAgICAgcHJvcGVydHkudXBkYXRlUHJldlZhbHVlQXJyYXkobmV3U2l6ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHVwZGF0ZSBhbGwgcHJvcGVydGllcyBhcnJheSBzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldFByZXZWYWx1ZUFycmF5KCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Byb3BzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBwcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLl9wcm9wcy5nZXRfSXRlbShpKTtcclxuICAgICAgcHJvcGVydHkuUmVzZXRQcmV2VmFsdWVBcnJheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXNldCBwcmV2IHZhbHVlIGF0IGluZGV4LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVzZXRQcmV2VmFsQXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3Byb3BzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBwcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLl9wcm9wcy5nZXRfSXRlbShpKTtcclxuICAgICAgcHJvcGVydHkucmVzZXRQcmV2VmFsQXQoaW5kZXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjbGVhciBwcmV2VmFsdWUgYXJyYXkgb2YgTGFiZWwgcHJvcGVydHkgaWYgZXhpc3RzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhckxhYmVsUHJldlZhbHVlQXJyYXkoKTogdm9pZCB7XHJcbiAgICBsZXQgbGFiZWxQcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLmdldFByb3BCeUlkKDQ1KTtcclxuICAgIGlmIChsYWJlbFByb3BlcnR5ICE9PSBudWxsKVxyXG4gICAgICBsYWJlbFByb3BlcnR5LmNsZWFyUHJldlZhbHVlQXJyYXkoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q3RybFJlZigpOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIHtcclxuICAgIHJldHVybiAoKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXIpID8gPEd1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXI+dGhpcy5fcGFyZW50IDogbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSW5zZXJ0UHJldlZhbHVlQXJyYXkoIGNvdW50OiBudW1iZXIpIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLl9wcm9wcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLl9wcm9wc1tpXTtcclxuICAgICAgcHJvcC5JbnNlcnRQcmV2VmFsdWVBcnJheShjb3VudCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|