@magic-xpa/gui 4.800.0-dev480.94 → 4.801.0-dev000.0

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.
Files changed (141) hide show
  1. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/{esm2015/magic-xpa-gui.js → esm2020/magic-xpa-gui.mjs} +0 -0
  3. package/esm2020/src/Commands.mjs +186 -0
  4. package/esm2020/src/Events.mjs +420 -0
  5. package/esm2020/src/EventsProcessor.mjs +67 -0
  6. package/esm2020/src/FocusManager.mjs +34 -0
  7. package/{esm2015/src/GuiConstants.js → esm2020/src/GuiConstants.mjs} +0 -0
  8. package/{esm2015/src/GuiEnums.js → esm2020/src/GuiEnums.mjs} +126 -127
  9. package/{esm2015/src/GuiEnvironment.js → esm2020/src/GuiEnvironment.mjs} +0 -0
  10. package/{esm2015/src/IFlowMonitorQueue.js → esm2020/src/IFlowMonitorQueue.mjs} +2 -1
  11. package/esm2020/src/Manager.mjs +192 -0
  12. package/{esm2015/src/UIBridge.js → esm2020/src/UIBridge.mjs} +0 -0
  13. package/{esm2015/src/env/IEnvironment.js → esm2020/src/env/IEnvironment.mjs} +2 -1
  14. package/{esm2015/src/gui/ControlBase.js → esm2020/src/gui/ControlBase.mjs} +0 -0
  15. package/{esm2015/src/gui/GuiMgControl.js → esm2020/src/gui/GuiMgControl.mjs} +0 -0
  16. package/{esm2015/src/gui/GuiMgForm.js → esm2020/src/gui/GuiMgForm.mjs} +0 -0
  17. package/{esm2015/src/gui/KeyboardItem.js → esm2020/src/gui/KeyboardItem.mjs} +0 -0
  18. package/{esm2015/src/gui/LastFocusedVal.js → esm2020/src/gui/LastFocusedVal.mjs} +0 -0
  19. package/{esm2015/src/gui/MgValue.js → esm2020/src/gui/MgValue.mjs} +0 -0
  20. package/{esm2015/src/gui/PropParentInterface.js → esm2020/src/gui/PropParentInterface.mjs} +1 -0
  21. package/{esm2015/src/gui/low/DialogHandler.js → esm2020/src/gui/low/DialogHandler.mjs} +0 -0
  22. package/{esm2015/src/gui/low/GuiCommand.js → esm2020/src/gui/low/GuiCommand.mjs} +0 -0
  23. package/{esm2015/src/gui/low/GuiCommandQueue.js → esm2020/src/gui/low/GuiCommandQueue.mjs} +0 -0
  24. package/esm2020/src/gui/low/GuiInteractive.mjs +545 -0
  25. package/esm2020/src/gui/low/Style.mjs +47 -0
  26. package/esm2020/src/management/RuntimeContextBase.mjs +52 -0
  27. package/{esm2015/src/management/data/BlobType.js → esm2020/src/management/data/BlobType.mjs} +0 -0
  28. package/esm2020/src/management/data/DcValues.mjs +214 -0
  29. package/esm2020/src/management/data/DcValuesBuilderBase.mjs +97 -0
  30. package/{esm2015/src/management/data/FieldDef.js → esm2020/src/management/data/FieldDef.mjs} +0 -0
  31. package/{esm2015/src/management/data/FieldsTable.js → esm2020/src/management/data/FieldsTable.mjs} +0 -0
  32. package/esm2020/src/management/data/GuiDataViewBase.mjs +90 -0
  33. package/esm2020/src/management/data/GuiFieldBase.mjs +82 -0
  34. package/{esm2015/src/management/data/IRecord.js → esm2020/src/management/data/IRecord.mjs} +1 -0
  35. package/{esm2015/src/management/data/IReferencedObject.js → esm2020/src/management/data/IReferencedObject.mjs} +1 -0
  36. package/{esm2015/src/management/data/NUM_TYPE.js → esm2020/src/management/data/NUM_TYPE.mjs} +0 -0
  37. package/esm2020/src/management/data/ObjectReferenceBase.mjs +48 -0
  38. package/{esm2015/src/management/data/ObjectReferencesCollection.js → esm2020/src/management/data/ObjectReferencesCollection.mjs} +0 -0
  39. package/esm2020/src/management/data/RecordUtils.mjs +361 -0
  40. package/{esm2015/src/management/data/VectorType.js → esm2020/src/management/data/VectorType.mjs} +0 -0
  41. package/{esm2015/src/management/data/VectorTypeBase.js → esm2020/src/management/data/VectorTypeBase.mjs} +0 -0
  42. package/{esm2015/src/management/events/IActionManager.js → esm2020/src/management/events/IActionManager.mjs} +1 -0
  43. package/esm2020/src/management/events/IGuiEventsManager.mjs +2 -0
  44. package/{esm2015/src/management/exp/ExpressionInterface.js → esm2020/src/management/exp/ExpressionInterface.mjs} +2 -1
  45. package/esm2020/src/management/exp/GuiExpressionEvaluator.mjs +333 -0
  46. package/{esm2015/src/management/gui/ControlTable.js → esm2020/src/management/gui/ControlTable.mjs} +0 -0
  47. package/esm2020/src/management/gui/DisplayConvertor.mjs +1706 -0
  48. package/esm2020/src/management/gui/FieldValidator.mjs +1507 -0
  49. package/esm2020/src/management/gui/GuiControlPropertyAdapter.mjs +22 -0
  50. package/{esm2015/src/management/gui/GuiFormPropertyAdapter.js → esm2020/src/management/gui/GuiFormPropertyAdapter.mjs} +0 -0
  51. package/{esm2015/src/management/gui/HebrewDate.js → esm2020/src/management/gui/HebrewDate.mjs} +0 -0
  52. package/{esm2015/src/management/gui/Helps.js → esm2020/src/management/gui/Helps.mjs} +0 -0
  53. package/esm2020/src/management/gui/MgControlBase.mjs +1873 -0
  54. package/esm2020/src/management/gui/MgFormBase.mjs +748 -0
  55. package/esm2020/src/management/gui/PIC.mjs +1178 -0
  56. package/esm2020/src/management/gui/PropDefaults.mjs +230 -0
  57. package/{esm2015/src/management/gui/PropInterface.js → esm2020/src/management/gui/PropInterface.mjs} +2 -4
  58. package/esm2020/src/management/gui/PropTable.mjs +221 -0
  59. package/esm2020/src/management/gui/Property.mjs +1382 -0
  60. package/{esm2015/src/management/gui/ValidationDetails.js → esm2020/src/management/gui/ValidationDetails.mjs} +0 -0
  61. package/{esm2015/src/management/gui/ValidationDetailsBase.js → esm2020/src/management/gui/ValidationDetailsBase.mjs} +0 -0
  62. package/{esm2015/src/management/gui/WrongFormatException.js → esm2020/src/management/gui/WrongFormatException.mjs} +0 -0
  63. package/{esm2015/src/management/tasks/GuiDataCollection.js → esm2020/src/management/tasks/GuiDataCollection.mjs} +0 -0
  64. package/esm2020/src/management/tasks/GuiTaskBase.mjs +502 -0
  65. package/{esm2015/src/management/tasks/IMGDataTable.js → esm2020/src/management/tasks/IMGDataTable.mjs} +1 -0
  66. package/{esm2015/src/management/tasks/ITask.js → esm2020/src/management/tasks/ITask.mjs} +1 -0
  67. package/esm2020/src/management/tasks/MgTimer.mjs +21 -0
  68. package/esm2020/src/management/tasks/TaskDefinitionId.mjs +54 -0
  69. package/esm2020/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +41 -0
  70. package/{esm2015/src/util/AuthenticationDialogHandler.js → esm2020/src/util/AuthenticationDialogHandler.mjs} +0 -0
  71. package/{esm2015/src/util/MemoryUtil.js → esm2020/src/util/MemoryUtil.mjs} +0 -0
  72. package/{esm2015/src/util/ObjectReference.js → esm2020/src/util/ObjectReference.mjs} +0 -0
  73. package/esm2020/src/util/ProcessLauncher.mjs +32 -0
  74. package/esm2020/src/util/UsernamePasswordCredentials.mjs +52 -0
  75. package/fesm2015/{magic-xpa-gui.js → magic-xpa-gui.mjs} +305 -365
  76. package/fesm2015/magic-xpa-gui.mjs.map +1 -0
  77. package/fesm2020/magic-xpa-gui.mjs +17805 -0
  78. package/fesm2020/magic-xpa-gui.mjs.map +1 -0
  79. package/package.json +27 -14
  80. package/src/Commands.d.ts +1 -0
  81. package/src/Events.d.ts +2 -2
  82. package/src/EventsProcessor.d.ts +1 -1
  83. package/src/GuiEnums.d.ts +125 -126
  84. package/src/IFlowMonitorQueue.d.ts +1 -1
  85. package/src/Manager.d.ts +2 -3
  86. package/src/env/IEnvironment.d.ts +1 -0
  87. package/src/gui/low/GuiInteractive.d.ts +3 -1
  88. package/src/gui/low/Style.d.ts +0 -3
  89. package/src/management/RuntimeContextBase.d.ts +2 -0
  90. package/src/management/data/DcValues.d.ts +1 -1
  91. package/src/management/data/DcValuesBuilderBase.d.ts +1 -1
  92. package/src/management/data/RecordUtils.d.ts +0 -3
  93. package/src/management/events/IGuiEventsManager.d.ts +5 -5
  94. package/src/management/exp/ExpressionInterface.d.ts +1 -0
  95. package/src/management/exp/GuiExpressionEvaluator.d.ts +2 -2
  96. package/src/management/gui/DisplayConvertor.d.ts +6 -6
  97. package/src/management/gui/GuiControlPropertyAdapter.d.ts +6 -6
  98. package/src/management/gui/MgControlBase.d.ts +4 -5
  99. package/src/management/gui/MgFormBase.d.ts +1 -1
  100. package/src/management/gui/PropInterface.d.ts +2 -4
  101. package/src/management/gui/PropTable.d.ts +1 -1
  102. package/src/management/gui/Property.d.ts +3 -3
  103. package/src/management/tasks/GuiTaskBase.d.ts +3 -8
  104. package/src/management/tasks/TaskDefinitionId.d.ts +1 -0
  105. package/src/util/ProcessLauncher.d.ts +1 -3
  106. package/bundles/magic-xpa-gui.umd.js +0 -19459
  107. package/bundles/magic-xpa-gui.umd.js.map +0 -1
  108. package/bundles/magic-xpa-gui.umd.min.js +0 -16
  109. package/bundles/magic-xpa-gui.umd.min.js.map +0 -1
  110. package/esm2015/src/Commands.js +0 -185
  111. package/esm2015/src/Events.js +0 -420
  112. package/esm2015/src/EventsProcessor.js +0 -68
  113. package/esm2015/src/FocusManager.js +0 -41
  114. package/esm2015/src/Manager.js +0 -197
  115. package/esm2015/src/gui/low/GuiInteractive.js +0 -539
  116. package/esm2015/src/gui/low/Style.js +0 -50
  117. package/esm2015/src/management/RuntimeContextBase.js +0 -50
  118. package/esm2015/src/management/data/DcValues.js +0 -214
  119. package/esm2015/src/management/data/DcValuesBuilderBase.js +0 -97
  120. package/esm2015/src/management/data/GuiDataViewBase.js +0 -90
  121. package/esm2015/src/management/data/GuiFieldBase.js +0 -85
  122. package/esm2015/src/management/data/ObjectReferenceBase.js +0 -48
  123. package/esm2015/src/management/data/RecordUtils.js +0 -447
  124. package/esm2015/src/management/events/IGuiEventsManager.js +0 -1
  125. package/esm2015/src/management/exp/GuiExpressionEvaluator.js +0 -333
  126. package/esm2015/src/management/gui/DisplayConvertor.js +0 -1706
  127. package/esm2015/src/management/gui/FieldValidator.js +0 -1507
  128. package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +0 -4
  129. package/esm2015/src/management/gui/MgControlBase.js +0 -1979
  130. package/esm2015/src/management/gui/MgFormBase.js +0 -763
  131. package/esm2015/src/management/gui/PIC.js +0 -1176
  132. package/esm2015/src/management/gui/PropDefaults.js +0 -232
  133. package/esm2015/src/management/gui/PropTable.js +0 -224
  134. package/esm2015/src/management/gui/Property.js +0 -1409
  135. package/esm2015/src/management/tasks/GuiTaskBase.js +0 -533
  136. package/esm2015/src/management/tasks/MgTimer.js +0 -21
  137. package/esm2015/src/management/tasks/TaskDefinitionId.js +0 -47
  138. package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +0 -41
  139. package/esm2015/src/util/ProcessLauncher.js +0 -32
  140. package/esm2015/src/util/UsernamePasswordCredentials.js +0 -52
  141. package/fesm2015/magic-xpa-gui.js.map +0 -1
@@ -1,1979 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { ApplicationException, Debug, Exception, List, NNumber, NString, RefParam, StringBuilder } from '@magic-xpa/mscorelib';
3
- import { GuiFieldBase } from '../data/GuiFieldBase';
4
- import { ChoiceUtils, Constants, InternalInterface, MagicProperties, MgControlType, Misc, SEQ_2_STR, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
5
- import { PIC } from './PIC';
6
- import { PropTable } from './PropTable';
7
- import { ValidationDetails } from './ValidationDetails';
8
- import { FieldDef } from '../data/FieldDef';
9
- import { Property } from './Property';
10
- import { Manager } from '../../Manager';
11
- import { CommandType, HtmlProperties } from '../../GuiEnums';
12
- import { Commands } from '../../Commands';
13
- import { NUM_TYPE } from '../data/NUM_TYPE';
14
- import { PropInterface } from './PropInterface';
15
- import { Events } from '../../Events';
16
- import { EMPTY_DCREF } from '../data/DcValues';
17
- import { DisplayConvertor } from './DisplayConvertor';
18
- import { BlobType } from '../data/BlobType';
19
- import { VectorType } from '../data/VectorType';
20
- import { ObjectReference } from '../../util/ObjectReference';
21
- import { GuiConstants } from '../../GuiConstants';
22
- import { isNullOrUndefined } from 'util';
23
- import { GuiControlPropertyAdapter } from './GuiControlPropertyAdapter';
24
- import { FocusManager } from '../../FocusManager';
25
- export class MgControlBase extends GuiControlPropertyAdapter {
26
- constructor(type, parentMgForm, parentControl) {
27
- super();
28
- this._ditIdx = 0;
29
- this._linkedControls = null;
30
- this._field = null;
31
- this._nodeIdField = null;
32
- this._nodeParentIdField = null;
33
- this._picStr = null;
34
- this._choiceDisps = null;
35
- this._choiceLayerList = null;
36
- this._choiceLinks = null;
37
- this._choiceNums = null;
38
- this._containerDitIdx = -1;
39
- this._currReadOnly = null;
40
- this._dataCtrl = false;
41
- this._dcTableRefs = null;
42
- this._firstRefreshProperties = true;
43
- this._form = null;
44
- this._hasValidItmAndDispVal = false;
45
- this._id = -1;
46
- this._controlIsn = -1;
47
- this._linkedParentDitIdx = -1;
48
- this._orgChoiceDisps = null;
49
- this._parentTable = null;
50
- this._pic = null;
51
- this._picExpExists = false;
52
- this._prevIsNulls = null;
53
- this._prevPicExpResult = null;
54
- this._prevValues = null;
55
- this._propTab = null;
56
- this._range = null;
57
- this._rangeChanged = false;
58
- this._rtfVal = NString.Empty;
59
- this._valExpId = 0;
60
- this._vd = null;
61
- this._dcValId = -2;
62
- this.parent = 0;
63
- this.veeIndx = 0;
64
- this.DNObjectReferenceField = null;
65
- this.SourceTableReference = null;
66
- this.ClipBoardDataExists = false;
67
- this.DataType = StorageAttribute.NONE;
68
- this.KeyStrokeOn = false;
69
- this.ModifiedByUser = false;
70
- this.Value = null;
71
- this.IsNull = false;
72
- this.forceRefresh = false;
73
- this.RefreshOnVisible = false;
74
- this.InControl = false;
75
- this.PromptHelp = null;
76
- if (arguments.length === 0) {
77
- this.constructor_0();
78
- return;
79
- }
80
- this.constructor_1(type, parentMgForm, parentControl);
81
- }
82
- set Form(value) {
83
- this._form = value;
84
- this.GuiMgForm = value;
85
- }
86
- get Form() {
87
- return this._form;
88
- }
89
- get Id() {
90
- return this._id;
91
- }
92
- get ControlIsn() {
93
- return this._controlIsn;
94
- }
95
- constructor_0() {
96
- this._linkedControls = new List();
97
- this.DataType = StorageAttribute.NONE;
98
- }
99
- constructor_1(type, parentMgForm, parentControl) {
100
- this.constructor_0();
101
- this.initReferences(parentMgForm);
102
- this.Type = type;
103
- this._containerDitIdx = parentControl;
104
- this._linkedParentDitIdx = parentControl;
105
- this._propTab = new PropTable(this);
106
- this.createArrays(false);
107
- }
108
- get UniqueName() {
109
- return this.Name;
110
- }
111
- get TaskTag() {
112
- return this.Form.getTask().getTaskTag();
113
- }
114
- checkIfExistProp(propId) {
115
- let exist = false;
116
- if (this._propTab !== null) {
117
- let propById = this._propTab.getPropById(propId);
118
- exist = (propById !== null);
119
- }
120
- return exist;
121
- }
122
- getProp(propId) {
123
- let prop = null;
124
- if (this._propTab !== null) {
125
- prop = this._propTab.getPropById(propId);
126
- if (prop === null) {
127
- prop = Property.getDefaultProp(propId, 'C', this);
128
- if (prop !== null) {
129
- this._propTab.addProp(prop);
130
- }
131
- }
132
- }
133
- return prop;
134
- }
135
- getForm() {
136
- return this.Form;
137
- }
138
- getCompIdx() {
139
- return this.getForm().getTask().getCompIdx();
140
- }
141
- IsFirstRefreshOfProps() {
142
- return this._firstRefreshProperties;
143
- }
144
- EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated) {
145
- return __awaiter(this, void 0, void 0, function* () {
146
- return yield this.getForm().getTask().EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated);
147
- });
148
- }
149
- GetExpressionStorage(expId) {
150
- return this.getForm().getTask().GetExpressionStorage(expId);
151
- }
152
- GetComputedProperty(propId) {
153
- let prop = null;
154
- if (this._propTab !== null)
155
- prop = this._propTab.getPropById(propId);
156
- return prop;
157
- }
158
- initReferences(mgForm) {
159
- this.Form = mgForm;
160
- }
161
- createArrays(forceCreateArrays) {
162
- if (this._firstRefreshProperties || forceCreateArrays) {
163
- if (this.SupportsDataSource()) {
164
- this._dcTableRefs = new List();
165
- }
166
- this._prevValues = new List();
167
- if (!forceCreateArrays) {
168
- this._currReadOnly = new List();
169
- }
170
- this._choiceDisps = new List();
171
- this._orgChoiceDisps = new List();
172
- this._choiceLinks = new List();
173
- this._choiceNums = new List();
174
- this._prevIsNulls = new List();
175
- this._choiceLayerList = new List();
176
- if (!this.IsRepeatable && !super.isTableControl()) {
177
- this.updateArrays(1);
178
- }
179
- }
180
- }
181
- SetFocus(ctrl, line, refreshPrompt, activateForm) {
182
- return __awaiter(this, void 0, void 0, function* () {
183
- yield FocusManager.SetFocus(ctrl.getForm().getTask(), ctrl, line, activateForm);
184
- });
185
- }
186
- InsertArrays(idx, count) {
187
- this._prevValues.InsertRange(idx, new Array(count));
188
- this._prevIsNulls.InsertRange(idx, new Array(count));
189
- this._currReadOnly.InsertRange(idx, new Array(count));
190
- this._choiceDisps.InsertRange(idx, new Array(count));
191
- this._orgChoiceDisps.InsertRange(idx, new Array(count));
192
- this._choiceLinks.InsertRange(idx, new Array(count));
193
- this._choiceLayerList.InsertRange(idx, new Array(count));
194
- this._choiceNums.InsertRange(idx, new Array(count));
195
- if (this.SupportsDataSource())
196
- this._dcTableRefs.InsertRange(idx, new Array(count));
197
- this._propTab.InsertPrevValueArray(idx, count);
198
- }
199
- updateArrays(newSize) {
200
- this._prevValues.SetSize(newSize);
201
- this._prevIsNulls.SetSize(newSize);
202
- this._currReadOnly.SetSize(newSize);
203
- this._choiceDisps.SetSize(newSize);
204
- this._orgChoiceDisps.SetSize(newSize);
205
- this._choiceLinks.SetSize(newSize);
206
- this._choiceLayerList.SetSize(newSize);
207
- this._choiceNums.SetSize(newSize);
208
- if (this.SupportsDataSource()) {
209
- this._dcTableRefs.SetSize(newSize);
210
- }
211
- this._propTab.updatePrevValueArray(newSize);
212
- }
213
- updatePrevValArrays(newSize) {
214
- this._propTab.updatePrevValueArray(newSize);
215
- }
216
- fillData(mgForm, ditIdx, parser) {
217
- if (this.Form === null) {
218
- this.initReferences(mgForm);
219
- }
220
- this._ditIdx = ditIdx;
221
- while (this.initInnerObjects(parser.getNextTag(), parser)) {
222
- }
223
- if (this.DataType === StorageAttribute.BLOB && this._picStr === null) {
224
- this._picStr = "";
225
- }
226
- if (this._picStr !== null && typeof this.DataType !== "undefined") {
227
- this.setPIC(this._picStr);
228
- }
229
- else {
230
- switch (this.Type) {
231
- case MgControlType.CTRL_TYPE_IMAGE:
232
- case MgControlType.CTRL_TYPE_BROWSER:
233
- case MgControlType.CTRL_TYPE_BUTTON:
234
- if (this.DataType === StorageAttribute.NONE)
235
- this.DataType = StorageAttribute.ALPHA;
236
- break;
237
- case MgControlType.CTRL_TYPE_TABLE:
238
- case MgControlType.CTRL_TYPE_COLUMN:
239
- case MgControlType.CTRL_TYPE_SUBFORM:
240
- case MgControlType.CTRL_TYPE_GROUP:
241
- case MgControlType.CTRL_TYPE_FRAME_SET:
242
- case MgControlType.CTRL_TYPE_FRAME_FORM:
243
- case MgControlType.CTRL_TYPE_CONTAINER:
244
- case MgControlType.CTRL_TYPE_LINE:
245
- break;
246
- default:
247
- Events.WriteExceptionToLog(NString.Format("in Control.fillData(): missing datatype or picture string for control: {0}", this.Name));
248
- break;
249
- }
250
- }
251
- if (super.isTableControl()) {
252
- this.Form.setTableCtrl(this);
253
- }
254
- this.createArrays(false);
255
- }
256
- initInnerObjects(foundTagName, parser) {
257
- if (foundTagName === null)
258
- return false;
259
- if (foundTagName === XMLConstants.MG_TAG_PROP) {
260
- if (this._propTab === null)
261
- this._propTab = new PropTable(this);
262
- this._propTab.fillData(this, 'C', parser);
263
- }
264
- else if (foundTagName === XMLConstants.MG_TAG_CONTROL)
265
- this.parseAttributes(parser);
266
- else if (foundTagName === "SourceTable")
267
- this.ParseSourceTable(parser);
268
- else if (foundTagName === "/" + XMLConstants.MG_TAG_CONTROL) {
269
- parser.setCurrIndex2EndOfTag();
270
- return false;
271
- }
272
- else {
273
- Events.WriteExceptionToLog(NString.Format("There is no such tag in Control. Insert else if to Control.initInnerObjects for {0}", foundTagName));
274
- return false;
275
- }
276
- return true;
277
- }
278
- ParseSourceTable(parser) {
279
- parser.setCurrIndex2EndOfTag();
280
- let objRefStr = parser.ReadToEndOfCurrentElement();
281
- let sourceTableReference = ObjectReference.FromXML(objRefStr.trim());
282
- this.SourceTableReference = sourceTableReference;
283
- parser.setCurrIndex2EndOfTag();
284
- }
285
- parseAttributes(parser) {
286
- let endContext = parser.getXMLdata().indexOf(">", parser.getCurrIndex());
287
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
288
- let tag = parser.getXMLsubstring(endContext);
289
- parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_CONTROL) + XMLConstants.MG_TAG_CONTROL.length);
290
- let tokens = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
291
- for (let i = 0; i < tokens.length; i = i + 2) {
292
- let attribute = tokens.get_Item(i);
293
- let valueStr = tokens.get_Item(i + 1);
294
- this.SetAttribute(attribute, valueStr);
295
- }
296
- parser.setCurrIndex(endContext + 1);
297
- }
298
- else {
299
- Events.WriteExceptionToLog("in Control.FillName() out of string bounds");
300
- }
301
- }
302
- SetAttribute(attribute, valueStr) {
303
- let isTagProcessed = true;
304
- switch (attribute) {
305
- case XMLConstants.MG_ATTR_TYPE:
306
- this.Type = valueStr[0];
307
- break;
308
- case XMLConstants.MG_ATTR_DATA_CTRL:
309
- this._dataCtrl = XmlParser.getBoolean(valueStr);
310
- break;
311
- case XMLConstants.MG_ATTR_LINKED_PARENT:
312
- this.setLinkedParentIdx(XmlParser.getInt(valueStr));
313
- break;
314
- case XMLConstants.MG_ATTR_CONTAINER:
315
- this.setContainer(XmlParser.getInt(valueStr));
316
- break;
317
- case XMLConstants.MG_ATTR_ID:
318
- this._id = XmlParser.getInt(valueStr);
319
- break;
320
- case XMLConstants.MG_ATTR_CONTROL_ISN:
321
- this._controlIsn = XmlParser.getInt(valueStr);
322
- break;
323
- case XMLConstants.MG_ATTR_IS_MODAL:
324
- this._isModal = XmlParser.getBoolean(valueStr);
325
- break;
326
- case XMLConstants.MG_ATTR_CONTROL_Z_ORDER:
327
- break;
328
- case XMLConstants.MG_HOR_ALIGMENT_IS_INHERITED:
329
- break;
330
- default:
331
- isTagProcessed = false;
332
- break;
333
- }
334
- return isTagProcessed;
335
- }
336
- setImage() {
337
- let newVal = this.Value;
338
- if (newVal === null || this.IsNull) {
339
- newVal = "";
340
- }
341
- if (this.DataType === StorageAttribute.BLOB) {
342
- }
343
- else {
344
- this.setImageWithFileName(newVal);
345
- }
346
- }
347
- setImageWithFileName(fileName) {
348
- if (fileName === null) {
349
- fileName = "";
350
- }
351
- fileName = Events.TranslateLogicalName(fileName);
352
- if (!Misc.IsWebUrl(fileName))
353
- fileName = "./assets/images/" + fileName;
354
- if (this.IsImageButton()) {
355
- Commands.addOperationWithLine(CommandType.SET_STYLE, this, 0, MagicProperties.ImageFile, fileName);
356
- }
357
- else {
358
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.Image, fileName);
359
- Commands.addValueWithLine(CommandType.SET_VALUE, this, this.getDisplayLine(false), fileName);
360
- }
361
- }
362
- setContainer(containerIdx) {
363
- this._containerDitIdx = containerIdx;
364
- let container = null;
365
- if (this._containerDitIdx !== -1) {
366
- container = this.Form.getCtrl(this._containerDitIdx);
367
- }
368
- if (container !== null && container.Type === MgControlType.CTRL_TYPE_TABLE) {
369
- this._parentTable = container;
370
- }
371
- this.IsRepeatable = (this._parentTable !== null && !super.isColumnControl());
372
- }
373
- getName() {
374
- return this.Name;
375
- }
376
- getLinkedControls() {
377
- return this._linkedControls;
378
- }
379
- isRepeatable() {
380
- return this.IsRepeatable;
381
- }
382
- IsModal() {
383
- return this._isModal;
384
- }
385
- getDisplayLine(useLineForItems) {
386
- let line = 0;
387
- if (this.IsRepeatable || (useLineForItems && super.isTableControl())) {
388
- line = this.Form.DisplayLine;
389
- }
390
- return line;
391
- }
392
- isVisible() {
393
- let result = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_VISIBLE, true);
394
- if (result) {
395
- result = this.isParentPropValue(PropInterface.PROP_TYPE_VISIBLE);
396
- }
397
- return result;
398
- }
399
- isEnabled() {
400
- return this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_ENABLED, true);
401
- }
402
- isModifiable() {
403
- let modifiable = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFIABLE, true);
404
- let taskInQuery = this.getForm().getTask().getMode() === Constants.TASK_MODE_QUERY;
405
- let modifyInQuery = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MODIFY_IN_QUERY, false);
406
- let result = modifiable && (modifyInQuery || !taskInQuery);
407
- if (result && this._field != null) {
408
- result = (this._field.DbModifiable || this.getForm().getTask().getMode() === Constants.TASK_MODE_CREATE);
409
- }
410
- return result;
411
- }
412
- getDcVals() {
413
- let dataView = this.getForm().getTask().DataView;
414
- let dcv = null;
415
- if (this._dcValId === EMPTY_DCREF) {
416
- dcv = ((this.DataType === StorageAttribute.BLOB_VECTOR) ? dataView.getEmptyChoiceForVectors() : dataView.getEmptyChoice());
417
- }
418
- else {
419
- if (this._dcValId > -1) {
420
- dcv = dataView.getDcValues(this._dcValId);
421
- }
422
- }
423
- return dcv;
424
- }
425
- getPrevIsNull() {
426
- let line = this.getDisplayLine(true);
427
- let currObj = this._prevIsNulls.get_Item(line);
428
- let curr;
429
- if (currObj === null) {
430
- curr = false;
431
- this._prevIsNulls.set_Item(line, curr);
432
- }
433
- else {
434
- curr = currObj;
435
- }
436
- return curr;
437
- }
438
- setPrevIsNull(newValue) {
439
- this._prevIsNulls.set_Item(this.getDisplayLine(true), newValue);
440
- }
441
- setPIC(picStr) {
442
- if (super.isButton()) {
443
- this._picStr = (super.IsImageButton() ? "" + XMLConstants.FILE_NAME_SIZE.toString() : Events.Translate(picStr));
444
- }
445
- else {
446
- this._picStr = picStr;
447
- }
448
- this._pic = new PIC(this._picStr, this.DataType, this.getForm().getTask().getCompIdx());
449
- if (this._dataCtrl && this._picStr.indexOf('H') > -1) {
450
- this._pic.setHebrew();
451
- }
452
- }
453
- getPIC() {
454
- return this._pic;
455
- }
456
- getParent() {
457
- let retParent = this.Form;
458
- if (this._containerDitIdx !== -1) {
459
- retParent = this.Form.getCtrl(this._containerDitIdx);
460
- }
461
- else {
462
- if (this.Form.isSubForm()) {
463
- retParent = this.Form.getSubFormCtrl();
464
- }
465
- }
466
- return retParent;
467
- }
468
- getField() {
469
- return this._field;
470
- }
471
- setField(fieldOrFieldStrID) {
472
- if (fieldOrFieldStrID === null || fieldOrFieldStrID instanceof GuiFieldBase) {
473
- this.setField_0(fieldOrFieldStrID);
474
- return;
475
- }
476
- this.setField_1(fieldOrFieldStrID);
477
- }
478
- setField_0(field) {
479
- this._field = field;
480
- if (field !== null) {
481
- this._field.SetControl(this);
482
- }
483
- }
484
- setField_1(fieldStrID) {
485
- let returnField = this.getFieldByValueStr(fieldStrID);
486
- if (returnField !== null) {
487
- this._field = returnField;
488
- this._field.SetControl(this);
489
- return;
490
- }
491
- throw new ApplicationException("in Control.setField(): illegal field identifier: " + fieldStrID);
492
- }
493
- setPicStr(format, expId) {
494
- this._picStr = format;
495
- if (expId > 0) {
496
- this._picExpExists = true;
497
- }
498
- }
499
- setRange(newRange) {
500
- this._range = newRange;
501
- this._vd = null;
502
- }
503
- setValExp(expId) {
504
- this._valExpId = expId;
505
- }
506
- buildCopyPicture(oldVal, newVal) {
507
- if (super.isTableControl() || super.isColumnControl()) {
508
- return null;
509
- }
510
- else {
511
- let copyVD = this.getCopyOfVD();
512
- copyVD.setValue(newVal);
513
- copyVD.setOldValue(oldVal);
514
- return copyVD;
515
- }
516
- }
517
- getCopyOfVD() {
518
- let result;
519
- if (this._vd === null) {
520
- result = new ValidationDetails(this.Value, this.Value, this._range, this._pic, this);
521
- }
522
- else {
523
- result = new ValidationDetails(this._vd);
524
- }
525
- return result;
526
- }
527
- getRanges() {
528
- return this._range;
529
- }
530
- getRangedValue(newVal) {
531
- let vd;
532
- vd = this.buildCopyPicture(this.Value, newVal);
533
- vd.evaluate();
534
- let val = vd.getDispValue();
535
- return (val.toString());
536
- }
537
- validate(newVal) {
538
- let vd;
539
- let modified = this.ModifiedByUser;
540
- this.ModifiedByUser = true;
541
- vd = this.buildCopyPicture(this.Value, newVal);
542
- vd.evaluate();
543
- this.ModifiedByUser = modified;
544
- if (vd.ValidationFailed)
545
- return vd.ErrorMessage;
546
- else
547
- return null;
548
- }
549
- getFieldByValueStr(valueStr) {
550
- let refParent = new RefParam(this.parent);
551
- let refVeeIndx = new RefParam(this.veeIndx);
552
- let ret = this.getForm().getTask().getFieldByValueStr(valueStr, refParent, refVeeIndx);
553
- this.parent = refParent.value;
554
- this.veeIndx = refVeeIndx.value;
555
- return ret;
556
- }
557
- hasContainer() {
558
- return this._containerDitIdx !== -1;
559
- }
560
- getLayer() {
561
- return this.Layer;
562
- }
563
- computePIC(picExpResult) {
564
- let picResult = (picExpResult !== null && super.isButton()) ? Events.Translate(picExpResult) : picExpResult;
565
- if (this._prevPicExpResult === null || !(this._prevPicExpResult === picResult)) {
566
- this._pic = new PIC(picResult, this.DataType, this.getForm().getTask().getCompIdx());
567
- this._prevPicExpResult = picResult;
568
- }
569
- return this._pic;
570
- }
571
- getCurrentIndexOfChoice() {
572
- let selectedIndice = [-1];
573
- let val = this.Value;
574
- if (!NString.IsNullOrEmpty(val)) {
575
- let array2 = val.split(',');
576
- selectedIndice = new Array(array2.length);
577
- for (let iCtr = 0; iCtr < array2.length; iCtr = iCtr + 1) {
578
- let num = NNumber.Parse(array2[iCtr]);
579
- selectedIndice[iCtr] = ((num >= 0) ? num : -1);
580
- }
581
- }
582
- return selectedIndice;
583
- }
584
- IsMultipleSelectionListBox() {
585
- return super.isListBox();
586
- }
587
- IsDateTimePicture() {
588
- return this._pic.getAttr() === StorageAttribute.DATE || this._pic.getAttr() === StorageAttribute.TIME;
589
- }
590
- SupportsDataSource() {
591
- return super.isSelectionCtrl() || super.isTabControl() || super.isRadio();
592
- }
593
- getIndexOfChoice(mgVal, line, isNull) {
594
- return __awaiter(this, void 0, void 0, function* () {
595
- let splitCommaSeperatedVals = this.IsMultipleSelectionListBox();
596
- yield this.computeChoice(line);
597
- let isVectorValue = this.getField() !== null && this.getField().getType() === StorageAttribute.BLOB_VECTOR;
598
- return this.getDcVals().getIndexOf(mgVal, isVectorValue, isNull, this._choiceLinks.get_Item(line), this._choiceNums.get_Item(line), splitCommaSeperatedVals);
599
- });
600
- }
601
- getDispVals(line, execComputeChoice) {
602
- const _super = Object.create(null, {
603
- isTabControl: { get: () => super.isTabControl }
604
- });
605
- return __awaiter(this, void 0, void 0, function* () {
606
- if (execComputeChoice) {
607
- yield this.computeChoice(line);
608
- }
609
- if (_super.isTabControl.call(this)) {
610
- return this._orgChoiceDisps.get_Item(line);
611
- }
612
- else {
613
- return this._choiceDisps.get_Item(line);
614
- }
615
- });
616
- }
617
- emptyChoice(line) {
618
- let value = new Array(0);
619
- this._choiceDisps.set_Item(line, value);
620
- this._orgChoiceDisps.set_Item(line, value);
621
- this._choiceLinks.set_Item(line, value);
622
- this._choiceLayerList.set_Item(line, value);
623
- }
624
- computeChoice(line) {
625
- const _super = Object.create(null, {
626
- isSelectionCtrl: { get: () => super.isSelectionCtrl },
627
- isTabControl: { get: () => super.isTabControl }
628
- });
629
- return __awaiter(this, void 0, void 0, function* () {
630
- let fromHelp = [
631
- "\\\\", "\\-", "\\,"
632
- ];
633
- let toHelp = [
634
- "XX", "XX", "XX"
635
- ];
636
- let task = this.getForm().getTask();
637
- let dataView = task.DataView;
638
- let dcv = dataView.getDcValues(this._dcValId);
639
- let currDcId = this.getDcRef();
640
- let choiceDispStr = null;
641
- let choiceLinkStr = "";
642
- let optionsValid = true;
643
- let trimToLength = -1;
644
- let dataType = this.DataType;
645
- let isItemsListTreatedAsDisplayList = false;
646
- try {
647
- if (this._choiceLinks.get_Item(line) === null || (this.isDataCtrl() && currDcId !== this._dcValId)) {
648
- if (dataType === StorageAttribute.BLOB_VECTOR) {
649
- dataType = this.getField().getCellsType();
650
- }
651
- let dispVals = dcv.getDispVals();
652
- let dispProp = this.getProp(PropInterface.PROP_TYPE_DISPLAY_LIST);
653
- let linkProp = this.getProp(PropInterface.PROP_TYPE_LABEL);
654
- if (dispProp !== null) {
655
- choiceDispStr = yield dispProp.getValue();
656
- }
657
- if (linkProp !== null) {
658
- choiceLinkStr = yield linkProp.getValue();
659
- }
660
- if (choiceLinkStr === null || StrUtil.rtrim(choiceLinkStr).length === 0) {
661
- choiceLinkStr = "";
662
- }
663
- if (choiceDispStr === null || StrUtil.rtrim(choiceDispStr).length === 0) {
664
- if (!this.isDataCtrl() || dispVals === null || dispVals.length === 0) {
665
- choiceDispStr = choiceLinkStr;
666
- }
667
- else {
668
- choiceDispStr = (choiceLinkStr = "");
669
- }
670
- isItemsListTreatedAsDisplayList = true;
671
- }
672
- choiceDispStr = Events.Translate(choiceDispStr);
673
- if (dataType === StorageAttribute.NUMERIC) {
674
- choiceLinkStr = StrUtil.searchAndReplace(choiceLinkStr, "\\-", "-");
675
- }
676
- let helpStr = StrUtil.searchAndReplace(choiceLinkStr, fromHelp, toHelp);
677
- let sTok = StrUtil.tokenize(helpStr, ",");
678
- let linkSize = (helpStr !== "") ? sTok.length : 0;
679
- let helpStrDisp = StrUtil.searchAndReplace(choiceDispStr, fromHelp, toHelp);
680
- sTok = StrUtil.tokenize(helpStrDisp, ",");
681
- let displaySize = (helpStrDisp !== "") ? sTok.length : 0;
682
- if (linkSize !== displaySize && displaySize > 0) {
683
- choiceDispStr = choiceLinkStr;
684
- isItemsListTreatedAsDisplayList = true;
685
- }
686
- let size = linkSize;
687
- let choiceLink = new Array(size);
688
- this._choiceLinks.set_Item(line, choiceLink);
689
- if (dataType === StorageAttribute.NUMERIC || dataType === StorageAttribute.DATE || dataType === StorageAttribute.TIME) {
690
- this._choiceNums.set_Item(line, new Array(size));
691
- }
692
- let orgChoiceDisp = ChoiceUtils.GetDisplayListFromString(choiceDispStr, false, true, !isItemsListTreatedAsDisplayList);
693
- this._orgChoiceDisps.set_Item(line, orgChoiceDisp);
694
- let choiceDisp = ChoiceUtils.GetDisplayListFromString(choiceDispStr, _super.isSelectionCtrl.call(this) || _super.isTabControl.call(this), true, !isItemsListTreatedAsDisplayList);
695
- this._choiceDisps.set_Item(line, choiceDisp);
696
- if (this.getField() !== null) {
697
- trimToLength = this.getField().getSize();
698
- }
699
- let token = null;
700
- let helpToken = null;
701
- let tokenBuffer;
702
- for (let i = 0, currPos = 0, nextPos = 0; i < size && optionsValid; i++) {
703
- nextPos = currPos;
704
- nextPos = helpStr.indexOf(',', nextPos);
705
- if (nextPos === currPos)
706
- token = helpToken = "";
707
- else if (nextPos === -1) {
708
- token = choiceLinkStr.substr(currPos);
709
- helpToken = helpStr.substr(currPos);
710
- }
711
- else {
712
- token = choiceLinkStr.substr(currPos, (nextPos) - (currPos));
713
- helpToken = helpStr.substr(currPos, (nextPos) - (currPos));
714
- }
715
- currPos = nextPos + 1;
716
- switch (dataType) {
717
- case StorageAttribute.ALPHA:
718
- case StorageAttribute.MEMO:
719
- case StorageAttribute.UNICODE:
720
- case StorageAttribute.BLOB_VECTOR:
721
- token = StrUtil.ltrim(token);
722
- helpToken = StrUtil.ltrim(helpToken);
723
- if (helpToken.indexOf('\\') >= 0) {
724
- tokenBuffer = new StringBuilder();
725
- for (let tokenPos = 0; tokenPos < helpToken.length; tokenPos++)
726
- if (helpToken[tokenPos] !== '\\')
727
- tokenBuffer.Append(token[tokenPos]);
728
- else if (tokenPos === helpToken.length - 1)
729
- tokenBuffer.Append(' ');
730
- token = tokenBuffer.ToString();
731
- }
732
- token = StrUtil.makePrintableTokens(token, SEQ_2_STR);
733
- if (this.isSelectionCtrl() || this.isTabControl())
734
- token = ChoiceUtils.RemoveAcclCharFromOptions(new StringBuilder(token));
735
- if (UtilStrByteMode.isLocaleDefLangDBCS() && dataType === StorageAttribute.ALPHA) {
736
- if (trimToLength !== -1 && UtilStrByteMode.lenB(token) > trimToLength)
737
- token = UtilStrByteMode.leftB(token, trimToLength);
738
- }
739
- else {
740
- if (trimToLength !== -1 && token.length > trimToLength)
741
- token = token.substr(0, trimToLength);
742
- }
743
- choiceLink[i] = token;
744
- break;
745
- case StorageAttribute.NUMERIC:
746
- case StorageAttribute.DATE:
747
- case StorageAttribute.TIME:
748
- let picture = PIC.buildPicture(dataType, token, task.getCompIdx(), false);
749
- optionsValid = this.optionIsValid(token);
750
- choiceLink[i] = DisplayConvertor.Instance.disp2mg(token.trim(), choiceLinkStr, picture, task.getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
751
- ((this._choiceNums.get_Item(line)))[i] = new NUM_TYPE(choiceLink[i]);
752
- break;
753
- case StorageAttribute.BOOLEAN:
754
- choiceLink[i] = (1 - i).toString();
755
- break;
756
- default:
757
- break;
758
- }
759
- }
760
- if (!optionsValid)
761
- this.emptyChoice(line);
762
- }
763
- }
764
- catch (ex) {
765
- if (ex instanceof Exception) {
766
- optionsValid = false;
767
- this.emptyChoice(line);
768
- Events.WriteExceptionToLog(NString.Format("{0} : {1}", ex.GetType(), ex.Message));
769
- }
770
- else
771
- throw ex;
772
- }
773
- this._hasValidItmAndDispVal = optionsValid;
774
- });
775
- }
776
- getTopMostForm() {
777
- return this.getForm().getTopMostForm();
778
- }
779
- setUrl() {
780
- Commands.addValueWithLine(CommandType.SET_VALUE, this, 0, this.Value);
781
- }
782
- getMgValue(dispVal) {
783
- const _super = Object.create(null, {
784
- isCheckBox: { get: () => super.isCheckBox },
785
- isSelectionCtrl: { get: () => super.isSelectionCtrl },
786
- isTabControl: { get: () => super.isTabControl },
787
- isRadio: { get: () => super.isRadio }
788
- });
789
- return __awaiter(this, void 0, void 0, function* () {
790
- let mgVal = null;
791
- if (_super.isCheckBox.call(this)) {
792
- mgVal = dispVal ? "1" : "0";
793
- }
794
- else {
795
- if (_super.isSelectionCtrl.call(this) || _super.isTabControl.call(this) || _super.isRadio.call(this)) {
796
- let line = this.getDisplayLine(true);
797
- if (line < 0)
798
- line = 0;
799
- if (typeof dispVal === "number")
800
- dispVal = dispVal.toString();
801
- if (Array.isArray(dispVal))
802
- dispVal = dispVal.join(',').toString();
803
- if (dispVal === "") {
804
- mgVal = dispVal;
805
- }
806
- else {
807
- mgVal = yield this.getLinkValue(dispVal, line);
808
- }
809
- if (mgVal === null) {
810
- let isNull = false;
811
- let refMgVal = new RefParam(mgVal);
812
- let refIsNull = new RefParam(isNull);
813
- if (this._field !== null) {
814
- mgVal = refMgVal.value;
815
- }
816
- }
817
- }
818
- else {
819
- let blobContentType = (this._field !== null) ? this._field.getContentType() : BlobType.CONTENT_TYPE_UNKNOWN;
820
- mgVal = DisplayConvertor.Instance.disp2mg(dispVal, this._range, this._pic, this.getForm().getTask().getCompIdx(), blobContentType);
821
- }
822
- }
823
- return mgVal;
824
- });
825
- }
826
- getLinkValue(selectedIndice, line) {
827
- return __awaiter(this, void 0, void 0, function* () {
828
- let size = 0;
829
- let result = NString.Empty;
830
- let temp = new List();
831
- yield this.computeChoice(line);
832
- let choiceLink = this._choiceLinks.get_Item(line);
833
- if (choiceLink !== null) {
834
- size = choiceLink.length;
835
- }
836
- let linkIndice = this.getLinkIdxFromLayer(Misc.GetIntArray(selectedIndice));
837
- let array2 = linkIndice;
838
- for (let i = 0; i < array2.length; i = i + 1) {
839
- let idx = array2[i];
840
- if (idx >= size) {
841
- let dcVals = this.getDcVals();
842
- temp.push(dcVals.getLinkValue(idx - size));
843
- }
844
- else {
845
- if (idx >= 0 && idx < choiceLink.length) {
846
- temp.push(choiceLink[idx]);
847
- }
848
- else {
849
- temp.push(null);
850
- }
851
- }
852
- }
853
- if (this.DataType === StorageAttribute.BLOB_VECTOR) {
854
- let vectorType = new VectorType(this.getField());
855
- for (let indx = 0; indx < temp.length; indx = indx + 1) {
856
- vectorType.setVecCell(indx + 1, temp.get_Item(indx), temp.get_Item(indx) === null);
857
- }
858
- result = vectorType.toString();
859
- }
860
- else {
861
- if (temp.length > 1) {
862
- result = temp.join(",");
863
- }
864
- else {
865
- result = temp.get_Item(0);
866
- }
867
- }
868
- return result;
869
- });
870
- }
871
- setText() {
872
- let displayLine = this.getDisplayLine(true);
873
- let mlsTranslatedValue = this.Value;
874
- if (super.isButton()) {
875
- mlsTranslatedValue = Events.Translate(this.Value);
876
- }
877
- if (this.isTextControl() || this.isButton())
878
- Commands.addValueWithLine(CommandType.SET_VALUE, this, displayLine, mlsTranslatedValue);
879
- else
880
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, displayLine, HtmlProperties.Text, mlsTranslatedValue);
881
- }
882
- setRadioChecked(index) {
883
- Commands.addValueWithLine(CommandType.SET_VALUE, this, this.getDisplayLine(false), index);
884
- Commands.beginInvoke();
885
- if (index !== GuiConstants.DEFAULT_VALUE_INT) {
886
- this.setControlToFocus();
887
- }
888
- }
889
- setControlToFocus() {
890
- if (this.getField() !== null) {
891
- this.getField().ControlToFocus = this;
892
- }
893
- }
894
- setCheckBoxValue(line, mgVal) {
895
- let checkState = DisplayConvertor.toBoolean(mgVal);
896
- Commands.addValueWithLine(CommandType.SET_VALUE, this, line, checkState);
897
- }
898
- refreshAndSetItemListByDataSource(line, valueChanged) {
899
- return __awaiter(this, void 0, void 0, function* () {
900
- if (this.SupportsDataSource()) {
901
- let currDcId = this.getDcRef();
902
- if (this._rangeChanged) {
903
- valueChanged = true;
904
- }
905
- this._rangeChanged = false;
906
- if (this.isDataCtrl() && currDcId !== this._dcValId) {
907
- valueChanged = true;
908
- yield this.refreshAndSetItemsList(line, true);
909
- this.setDcRef(this._dcValId);
910
- }
911
- }
912
- return valueChanged;
913
- });
914
- }
915
- setDcRef(dcId) {
916
- this._dcTableRefs.set_Item(this.getDcLineNum(), dcId);
917
- }
918
- setImageList(url) {
919
- }
920
- updatePropertyLogicNesting(propId, commandType, val, updateThis) {
921
- return __awaiter(this, void 0, void 0, function* () {
922
- if (updateThis) {
923
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), commandType === CommandType.PROP_SET_VISIBLE ? HtmlProperties.Visible : HtmlProperties.Enabled, val);
924
- }
925
- yield this.updateChildrenPropValue(propId, commandType, val);
926
- });
927
- }
928
- SetEnabled(val) {
929
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.Enabled, val);
930
- }
931
- updateChildrenPropValue(propId, commandType, val) {
932
- const _super = Object.create(null, {
933
- isTableControl: { get: () => super.isTableControl },
934
- isSubform: { get: () => super.isSubform }
935
- });
936
- return __awaiter(this, void 0, void 0, function* () {
937
- if (!_super.isTableControl.call(this)) {
938
- for (let i = 0; i < this._linkedControls.length; i = i + 1) {
939
- let child = this._linkedControls.get_Item(i);
940
- if (child.IsFirstRefreshOfProps())
941
- continue;
942
- let childValue = (child.GetComputedBooleanProperty(propId, true));
943
- childValue = childValue && val;
944
- let childOnCurrentLayer = this.isChildOnCurrentLayer(child);
945
- if (commandType === CommandType.PROP_SET_VISIBLE) {
946
- if (childValue) {
947
- childValue = childOnCurrentLayer;
948
- }
949
- yield child.updateChildrenPropValue(propId, commandType, childValue);
950
- }
951
- }
952
- if (_super.isSubform.call(this)) {
953
- yield this.updateSubformChildrenPropValue(propId, commandType, val);
954
- }
955
- }
956
- });
957
- }
958
- isDescendentOfControl(control) {
959
- let isContained = false;
960
- if (control !== null) {
961
- let parent = this.getParent();
962
- if (parent instanceof MgControlBase) {
963
- if (parent === control) {
964
- isContained = true;
965
- }
966
- else {
967
- let parentControl = ((parent instanceof MgControlBase) ? parent : null);
968
- if (control.Type === MgControlType.CTRL_TYPE_COLUMN && parentControl !== null && parentControl.Type === MgControlType.CTRL_TYPE_TABLE && control.Layer === this.Layer)
969
- isContained = true;
970
- else
971
- isContained = (parent.isDescendentOfControl(control));
972
- }
973
- }
974
- }
975
- return isContained;
976
- }
977
- updateSubformChildrenPropValue(propId, commandType, val) {
978
- }
979
- isChildOnCurrentLayer(child) {
980
- let ret = true;
981
- if (super.isChoiceControl()) {
982
- let parentLayer = 0;
983
- if (this.Value !== null) {
984
- parentLayer = this.getCurrentLinkIdx() + 1;
985
- }
986
- let layer = child.getLayer();
987
- if (parentLayer !== layer && layer > 0) {
988
- ret = false;
989
- }
990
- }
991
- return ret;
992
- }
993
- getCurrentLinkIdx() {
994
- let currLinkIdx = 0;
995
- if (super.isChoiceControl()) {
996
- let currentLayers = this.getCurrentIndexOfChoice();
997
- let currLinkIndice = this.getLinkIdxFromLayer(currentLayers);
998
- currLinkIdx = currLinkIndice[0];
999
- }
1000
- return currLinkIdx;
1001
- }
1002
- getLayerFromLinkIdx(indice) {
1003
- let layers = new Array(indice.length);
1004
- for (let iCtr = 0; iCtr < indice.length; iCtr = iCtr + 1) {
1005
- let idx = indice[iCtr];
1006
- layers[iCtr] = idx;
1007
- if (super.isTabControl() && idx >= 0) {
1008
- let line = this.getDisplayLine(false);
1009
- if (line < 0) {
1010
- line = 0;
1011
- }
1012
- let layerList = this._choiceLayerList.get_Item(line);
1013
- if (layerList !== null && layerList.length > 0) {
1014
- layers[iCtr] = layerList.indexOf((idx + 1).toString());
1015
- }
1016
- }
1017
- }
1018
- return layers;
1019
- }
1020
- getLinkIdxFromLayer(layers) {
1021
- let linkIndice = new Array(layers.length);
1022
- for (let iCtr = 0; iCtr < layers.length; iCtr = iCtr + 1) {
1023
- let layer = layers[iCtr];
1024
- linkIndice[iCtr] = layer;
1025
- if (super.isTabControl()) {
1026
- if (layer < 0) {
1027
- linkIndice[iCtr] = 0;
1028
- }
1029
- else {
1030
- let line = this.getDisplayLine(false);
1031
- if (line < 0) {
1032
- line = 0;
1033
- }
1034
- let layerList = this._choiceLayerList.get_Item(line);
1035
- if (layerList !== null && typeof layerList !== "undefined" && layerList.length !== 0 && layer < layerList.length) {
1036
- linkIndice[iCtr] = NNumber.Parse(layerList[layer]) - 1;
1037
- }
1038
- }
1039
- }
1040
- }
1041
- return linkIndice;
1042
- }
1043
- isParentPropValue(propId) {
1044
- let column = this.Form.getControlColumn(this);
1045
- let parent = this.getLinkedParent(true);
1046
- let result;
1047
- if (parent === null) {
1048
- result = true;
1049
- }
1050
- else {
1051
- if (!parent.GetComputedBooleanProperty(propId, true)) {
1052
- result = false;
1053
- }
1054
- else {
1055
- if (!parent.isChildOnCurrentLayer(this)) {
1056
- result = false;
1057
- }
1058
- else {
1059
- result = (!(column !== null && !column.GetComputedBooleanProperty(propId, true)) && parent.isParentPropValue(propId));
1060
- }
1061
- }
1062
- }
1063
- return result;
1064
- }
1065
- getLinkedParent(checkSubformFather) {
1066
- if (this._linkedParentDitIdx !== -1) {
1067
- return this.Form.getCtrl(this._linkedParentDitIdx);
1068
- }
1069
- else {
1070
- if (checkSubformFather && this.Form.isSubForm()) {
1071
- return this.Form.getSubFormCtrl();
1072
- }
1073
- else {
1074
- return null;
1075
- }
1076
- }
1077
- }
1078
- SetCurrReadOnly(newVal) {
1079
- this._currReadOnly.set_Item(this.getDisplayLine(true), newVal);
1080
- }
1081
- GetCurrReadOnly() {
1082
- let line = super.isTableControl() ? 0 : this.getDisplayLine(true);
1083
- let currObj = this._currReadOnly.get_Item(line);
1084
- let curr;
1085
- if (currObj === null) {
1086
- curr = false;
1087
- this._currReadOnly.set_Item(line, curr);
1088
- }
1089
- else {
1090
- curr = currObj;
1091
- }
1092
- return curr;
1093
- }
1094
- isDataCtrl() {
1095
- return this._dataCtrl;
1096
- }
1097
- getDcRef() {
1098
- let line = this.getDcLineNum();
1099
- let obj = this._dcTableRefs.get_Item(this.getDcLineNum());
1100
- let dcId;
1101
- if (obj === null) {
1102
- dcId = -2;
1103
- this._dcTableRefs.set_Item(line, dcId);
1104
- }
1105
- else {
1106
- dcId = obj;
1107
- }
1108
- return dcId;
1109
- }
1110
- getDcLineNum() {
1111
- return this.IsRepeatable ? this.Form.DisplayLine : 0;
1112
- }
1113
- optionIsValid(option) {
1114
- let isValid = true;
1115
- if (this.DataType === StorageAttribute.NUMERIC && option.length > 0 && option.indexOf('0') === -1) {
1116
- let convertNum = new NUM_TYPE();
1117
- convertNum.num_4_a_std(option);
1118
- if (convertNum.num_is_zero()) {
1119
- isValid = false;
1120
- }
1121
- }
1122
- return isValid;
1123
- }
1124
- getOrderedDispList(choiceDispList, line) {
1125
- return __awaiter(this, void 0, void 0, function* () {
1126
- let choiceLayerStr = "";
1127
- let dispArryList = new List();
1128
- let layerArryList = new List();
1129
- let layerProp = this.getProp(PropInterface.PROP_TYPE_VISIBLE_LAYERS_LIST);
1130
- if (layerProp !== null) {
1131
- choiceLayerStr = yield layerProp.getValue();
1132
- }
1133
- if (choiceLayerStr === null || StrUtil.rtrim(choiceLayerStr).length === 0) {
1134
- choiceLayerStr = "";
1135
- }
1136
- if (choiceLayerStr.length > 0 && choiceDispList.length > 0) {
1137
- let layerList = choiceLayerStr.split(",");
1138
- let posCopyIndex = -1;
1139
- for (let index = 0; index < layerList.length; index = index + 1) {
1140
- let currLayerListVal = layerList[index].trim();
1141
- if (!(layerArryList.indexOf(currLayerListVal) !== -1)) {
1142
- let refPosCopyIndex = new RefParam(posCopyIndex);
1143
- let isNumber = NNumber.TryParse(currLayerListVal, refPosCopyIndex);
1144
- posCopyIndex = refPosCopyIndex.value;
1145
- if (isNumber && posCopyIndex > 0 && posCopyIndex <= choiceDispList.length) {
1146
- dispArryList.push((choiceDispList[posCopyIndex - 1]).trim());
1147
- layerArryList.push(currLayerListVal);
1148
- }
1149
- }
1150
- }
1151
- }
1152
- let result;
1153
- if (dispArryList.length === 0) {
1154
- result = choiceDispList;
1155
- this._choiceLayerList.set_Item(line, new Array(0));
1156
- }
1157
- else {
1158
- result = new Array(dispArryList.length);
1159
- for (let _ai = 0; _ai < result.length; ++_ai)
1160
- result[_ai] = null;
1161
- result = dispArryList.ToArray();
1162
- this._choiceLayerList.set_Item(line, layerArryList.ToArray());
1163
- }
1164
- return result;
1165
- });
1166
- }
1167
- resetPrevVal() {
1168
- let line = this.getDisplayLine(true);
1169
- if (line < 0) {
1170
- line = 0;
1171
- }
1172
- this._prevValues.set_Item(line, null);
1173
- this.setPrevIsNull_ToNull();
1174
- }
1175
- setPrevIsNull_ToNull() {
1176
- this._prevIsNulls.set_Item(this.getDisplayLine(true), null);
1177
- }
1178
- expressionSetAsData() {
1179
- return this._valExpId > 0;
1180
- }
1181
- clearRange(line) {
1182
- this._orgChoiceDisps.set_Item(line, null);
1183
- this._choiceDisps.set_Item(line, null);
1184
- this._choiceLinks.set_Item(line, null);
1185
- this._choiceLayerList.set_Item(line, null);
1186
- }
1187
- haveToCheckParentValue() {
1188
- let ret = false;
1189
- if (this._linkedParentDitIdx !== -1) {
1190
- if (!this.isContainedInLinkedParent()) {
1191
- ret = true;
1192
- }
1193
- else {
1194
- if (this.Form.getCtrl(this._linkedParentDitIdx).isTabControl() || this.Form.getCtrl(this._linkedParentDitIdx).isGroup()) {
1195
- ret = true;
1196
- }
1197
- }
1198
- }
1199
- else {
1200
- if (this.Form.isSubForm()) {
1201
- ret = true;
1202
- }
1203
- }
1204
- return ret;
1205
- }
1206
- isContainedInLinkedParent() {
1207
- return this._containerDitIdx !== -1 && this._containerDitIdx === this._linkedParentDitIdx;
1208
- }
1209
- static combineStringArrays(firstStrings, lastStrings) {
1210
- let result = new Array();
1211
- if (firstStrings !== null)
1212
- result = result.concat(firstStrings);
1213
- if (lastStrings !== null)
1214
- result = result.concat(lastStrings);
1215
- return result;
1216
- }
1217
- GetComputedBooleanProperty(propId, defaultRetVal, line) {
1218
- if (arguments.length === 2 && (propId === null || propId.constructor === Number) && (defaultRetVal === null || defaultRetVal.constructor === Boolean)) {
1219
- return this.GetComputedBooleanProperty_0(propId, defaultRetVal);
1220
- }
1221
- return this.GetComputedBooleanProperty_1(propId, defaultRetVal, line);
1222
- }
1223
- GetComputedBooleanProperty_0(propId, defaultRetVal) {
1224
- let result = defaultRetVal;
1225
- let prop = this.GetComputedProperty(propId);
1226
- if (prop !== null) {
1227
- result = prop.GetComputedValueBoolean();
1228
- }
1229
- return result;
1230
- }
1231
- GetComputedBooleanProperty_1(propId, defaultRetVal, line) {
1232
- let result = defaultRetVal;
1233
- if (this.isPropertyRepeatable(propId) && this.Form.DisplayLine !== line) {
1234
- let prop = this.GetComputedProperty(propId);
1235
- if (prop !== null) {
1236
- let val = prop.getPrevValue(line);
1237
- if (val !== null) {
1238
- result = DisplayConvertor.toBoolean(val);
1239
- }
1240
- }
1241
- }
1242
- else {
1243
- result = this.GetComputedBooleanProperty(propId, defaultRetVal);
1244
- }
1245
- return result;
1246
- }
1247
- checkPropWithLine(propId, defaultRetVal, line) {
1248
- return __awaiter(this, void 0, void 0, function* () {
1249
- let result = defaultRetVal;
1250
- if (this.isPropertyRepeatable(propId) && this.Form.DisplayLine !== line) {
1251
- let prop = this.getProp(propId);
1252
- if (prop !== null) {
1253
- let val = prop.getPrevValue(line);
1254
- if (val !== null) {
1255
- result = DisplayConvertor.toBoolean(val);
1256
- }
1257
- }
1258
- }
1259
- else {
1260
- result = yield this.checkProp(propId, defaultRetVal);
1261
- }
1262
- return result;
1263
- });
1264
- }
1265
- checkProp(propId, defaultRetVal) {
1266
- return __awaiter(this, void 0, void 0, function* () {
1267
- let result = defaultRetVal;
1268
- let prop = this.getProp(propId);
1269
- if (prop !== null) {
1270
- result = yield prop.getValueBoolean();
1271
- }
1272
- return result;
1273
- });
1274
- }
1275
- isPropertyRepeatable(propId) {
1276
- let isRepeatable = this.IsRepeatable;
1277
- if (isRepeatable) {
1278
- return true;
1279
- }
1280
- else {
1281
- return super.isTableControl() && Property.isRepeatableInTable(propId);
1282
- }
1283
- }
1284
- SetAndRefreshDisplayValue(mgVal, isNull) {
1285
- const _super = Object.create(null, {
1286
- isChoiceControl: { get: () => super.isChoiceControl },
1287
- isTabControl: { get: () => super.isTabControl },
1288
- isCheckBox: { get: () => super.isCheckBox },
1289
- isImageControl: { get: () => super.isImageControl },
1290
- IsImageButton: { get: () => super.IsImageButton },
1291
- isSelectionCtrl: { get: () => super.isSelectionCtrl }
1292
- });
1293
- return __awaiter(this, void 0, void 0, function* () {
1294
- let dcRangeIsEmpty = true;
1295
- if (mgVal === null) {
1296
- this.Value = "";
1297
- if (!isNull)
1298
- mgVal = FieldDef.getMagicDefaultValue(this.DataType);
1299
- }
1300
- else {
1301
- if (_super.isChoiceControl.call(this)) {
1302
- let line = this.getDisplayLine(true);
1303
- if (line < 0) {
1304
- line = 0;
1305
- }
1306
- let layers = this.getLayerFromLinkIdx(yield this.getIndexOfChoice(mgVal, line, isNull));
1307
- if (layers[0] < 0 && _super.isTabControl.call(this)) {
1308
- layers[0] = 0;
1309
- mgVal = yield this.getLinkValue(layers[0].toString(), line);
1310
- isNull = false;
1311
- if (this._field !== null && mgVal !== null) {
1312
- yield this._field.getTask().UpdateFieldValueAndStartRecompute(this._field, mgVal, isNull);
1313
- }
1314
- }
1315
- this.Value = Misc.GetCommaSeperatedString(layers);
1316
- dcRangeIsEmpty = false;
1317
- }
1318
- }
1319
- if (dcRangeIsEmpty) {
1320
- if (!_super.isCheckBox.call(this) && (this._field === null || !isNull || !this._field.hasNullDisplayValue())) {
1321
- try {
1322
- if ((_super.isImageControl.call(this) && this.DataType === StorageAttribute.BLOB) || _super.IsImageButton.call(this)) {
1323
- this.Value = mgVal;
1324
- }
1325
- else {
1326
- if ((this._field === null && isNull) && (this.DataType === StorageAttribute.NUMERIC || this.DataType === StorageAttribute.DATE || this.DataType === StorageAttribute.TIME || this.DataType === StorageAttribute.BOOLEAN)) {
1327
- this.Value = mgVal;
1328
- }
1329
- else {
1330
- let inControl = this.InControl;
1331
- this.Value = DisplayConvertor.Instance.mg2disp(mgVal, this._range, this._pic, true, _super.isSelectionCtrl.call(this), this.getForm().getTask().getCompIdx(), inControl);
1332
- }
1333
- }
1334
- if (typeof this.Value === 'string' && (!this._pic.isAttrNumeric() || this._pic.isLeft())) {
1335
- this.rtrimValue();
1336
- }
1337
- }
1338
- catch (innerException) {
1339
- if (innerException instanceof ApplicationException) {
1340
- Events.WriteExceptionToLog(new ApplicationException(NString.Format("Control: '{0}', mgval: {1}", this.Name, mgVal), innerException));
1341
- this.Value = "";
1342
- mgVal = FieldDef.getMagicDefaultValue(this.DataType);
1343
- }
1344
- else
1345
- throw innerException;
1346
- }
1347
- }
1348
- else {
1349
- if (this.isCheckBox())
1350
- this.Value = DisplayConvertor.toBoolean(mgVal);
1351
- else
1352
- this.Value = mgVal;
1353
- }
1354
- }
1355
- if ((_super.isImageControl.call(this) && this.DataType !== StorageAttribute.BLOB) || _super.IsImageButton.call(this)) {
1356
- mgVal = Events.TranslateLogicalName(mgVal);
1357
- }
1358
- this.IsNull = isNull;
1359
- yield this.RefreshDisplayValue(mgVal);
1360
- });
1361
- }
1362
- UpdateModifiedByUser(newValue) {
1363
- if (!(super.isButton() || super.isImageControl())) {
1364
- let ctrlCurrIsNull = this.IsNull;
1365
- let valChanged = (this.isDifferentValue(newValue, false, false));
1366
- if (!valChanged) {
1367
- if (this.CanGetNullFromControlValue()) {
1368
- valChanged = (ctrlCurrIsNull !== this.isNullValue(newValue));
1369
- }
1370
- }
1371
- if (valChanged || this.KeyStrokeOn) {
1372
- this.ModifiedByUser = true;
1373
- }
1374
- }
1375
- }
1376
- rtrimValue() {
1377
- if ((super.isImageControl() && this.DataType === StorageAttribute.BLOB) || super.IsImageButton()) {
1378
- this.Value = NString.TrimEnd(this.Value);
1379
- }
1380
- else {
1381
- let minimumValueLength = this.getMinimumValueLength();
1382
- if (this.Value.length > minimumValueLength) {
1383
- let str = this.Value.substr(minimumValueLength);
1384
- this.Value = this.Value.substr(0, minimumValueLength);
1385
- this.Value = this.Value + StrUtil.rtrimWithNull(str, true);
1386
- }
1387
- if (super.isTextControl() && this.DataType === StorageAttribute.NUMERIC) {
1388
- this.Value = NString.TrimEnd(this.Value);
1389
- }
1390
- }
1391
- }
1392
- getMinimumValueLength() {
1393
- let minLength = this._pic.getMaskLength();
1394
- while (minLength > 0 && !this._pic.picIsMask(minLength - 1)) {
1395
- minLength = minLength - 1;
1396
- }
1397
- return minLength;
1398
- }
1399
- isNullValue(str) {
1400
- let retIsNullControl = false;
1401
- if (this.CanGetNullFromControlValue() && str === "") {
1402
- retIsNullControl = true;
1403
- }
1404
- return retIsNullControl;
1405
- }
1406
- CanGetNullFromControlValue() {
1407
- return false;
1408
- }
1409
- isChoiceNull(idx) {
1410
- let result;
1411
- if (idx >= 0) {
1412
- let dcVals = this.getDcVals();
1413
- return dcVals.isNull(idx);
1414
- }
1415
- else {
1416
- return result;
1417
- }
1418
- }
1419
- ComputeAndRefreshDisplayValue(forceRefresh) {
1420
- const _super = Object.create(null, {
1421
- isTableControl: { get: () => super.isTableControl },
1422
- isColumnControl: { get: () => super.isColumnControl }
1423
- });
1424
- return __awaiter(this, void 0, void 0, function* () {
1425
- if (forceRefresh) {
1426
- this.resetPrevVal();
1427
- }
1428
- if (this._valExpId > 0) {
1429
- let wasEvaluated;
1430
- let refWasEvaluated = new RefParam(wasEvaluated);
1431
- let retExp = yield this.EvaluateExpression(this._valExpId, this.DataType, this._pic.getSize(), true, StorageAttribute.SKIP, false, refWasEvaluated);
1432
- wasEvaluated = refWasEvaluated.value;
1433
- if (wasEvaluated) {
1434
- yield this.SetAndRefreshDisplayValue(retExp, retExp === null);
1435
- }
1436
- }
1437
- else {
1438
- if (this._field !== null) {
1439
- let value = NString.Empty;
1440
- let isNull = false;
1441
- let refValue = new RefParam(value);
1442
- let refIsNull = new RefParam(isNull);
1443
- this._field.getTask().getFieldDisplayValue(this._field, refValue, refIsNull);
1444
- value = refValue.value;
1445
- isNull = refIsNull.value;
1446
- yield this.SetAndRefreshDisplayValue(value, isNull);
1447
- }
1448
- else {
1449
- if (!_super.isTableControl.call(this) && !_super.isColumnControl.call(this)) {
1450
- yield this.RefreshDisplayValue(this.Value);
1451
- }
1452
- }
1453
- }
1454
- });
1455
- }
1456
- ShouldRefreshOnControlEnter() {
1457
- return this.Type === MgControlType.CTRL_TYPE_TEXT && this.getField() !== null && (this.getField().getType() === StorageAttribute.DATE ||
1458
- this.getField().getType() === StorageAttribute.TIME || this.getField().getType() === StorageAttribute.NUMERIC);
1459
- }
1460
- RefreshDisplayValue(mgVal) {
1461
- const _super = Object.create(null, {
1462
- isChoiceControl: { get: () => super.isChoiceControl }
1463
- });
1464
- return __awaiter(this, void 0, void 0, function* () {
1465
- let line = this.getDisplayLine(true);
1466
- let valueChanged = true;
1467
- let saveValueChanged = valueChanged;
1468
- if (line < 0) {
1469
- line = 0;
1470
- }
1471
- try {
1472
- let prevValue = this._prevValues.get_Item(line);
1473
- let prevNull = this.getPrevIsNull();
1474
- if (StorageAttributeCheck.IsTypeAlphaOrUnicode(this.DataType)) {
1475
- if (StrUtil.rtrim(mgVal) === StrUtil.rtrim(prevValue) ||
1476
- (mgVal !== null && StrUtil.rtrim(mgVal) === StrUtil.rtrim(prevValue))) {
1477
- valueChanged = false;
1478
- }
1479
- if (prevNull !== this.IsNull) {
1480
- valueChanged = true;
1481
- }
1482
- }
1483
- else {
1484
- ;
1485
- if (mgVal === prevValue || (mgVal !== null && mgVal === prevValue))
1486
- valueChanged = false;
1487
- if (prevNull !== this.IsNull)
1488
- valueChanged = true;
1489
- }
1490
- this._prevValues.set_Item(line, mgVal);
1491
- this.setPrevIsNull(this.IsNull);
1492
- switch (this.Type) {
1493
- case MgControlType.CTRL_TYPE_TABLE:
1494
- case MgControlType.CTRL_TYPE_COLUMN:
1495
- case MgControlType.CTRL_TYPE_LABEL:
1496
- case MgControlType.CTRL_TYPE_SUBFORM:
1497
- case MgControlType.CTRL_TYPE_GROUP:
1498
- case MgControlType.CTRL_TYPE_STATUS_BAR:
1499
- case MgControlType.CTRL_TYPE_FRAME_SET:
1500
- case MgControlType.CTRL_TYPE_CONTAINER:
1501
- case MgControlType.CTRL_TYPE_FRAME_FORM:
1502
- case MgControlType.CTRL_TYPE_SB_LABEL:
1503
- case MgControlType.CTRL_TYPE_LINE:
1504
- return;
1505
- case MgControlType.CTRL_TYPE_BROWSER:
1506
- if (valueChanged && this.Value != null)
1507
- this.setUrl();
1508
- return;
1509
- case MgControlType.CTRL_TYPE_IMAGE:
1510
- case MgControlType.CTRL_TYPE_SB_IMAGE:
1511
- if (valueChanged && this.Value != null)
1512
- this.setImage();
1513
- return;
1514
- case MgControlType.CTRL_TYPE_CHECKBOX:
1515
- if (valueChanged || this.forceRefresh)
1516
- this.setCheckBoxValue(line, mgVal);
1517
- return;
1518
- case MgControlType.CTRL_TYPE_TAB:
1519
- case MgControlType.CTRL_TYPE_COMBO:
1520
- case MgControlType.CTRL_TYPE_LIST:
1521
- saveValueChanged = valueChanged;
1522
- valueChanged = yield this.refreshAndSetItemListByDataSource(line, valueChanged);
1523
- if (valueChanged) {
1524
- let prevDisplayValue = null;
1525
- if (saveValueChanged === valueChanged) {
1526
- if (prevValue !== null) {
1527
- prevDisplayValue = this.getLayerFromLinkIdx(yield this.getIndexOfChoice(prevValue, line, prevNull));
1528
- for (let i = 0; i < prevDisplayValue.length; i = i + 1) {
1529
- if (prevDisplayValue[i] === GuiConstants.DEFAULT_VALUE_INT) {
1530
- prevDisplayValue[i] = GuiConstants.DEFAULT_LIST_VALUE;
1531
- }
1532
- }
1533
- }
1534
- }
1535
- let indice = Misc.GetIntArray(this.Value);
1536
- if (this.isTabControl()) {
1537
- let currentLayer = this.getCurrentLinkIdx();
1538
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.SelectedValue, indice[0].toString());
1539
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.SelectedLayer, currentLayer.toString());
1540
- }
1541
- if (this.IsMultipleSelectionListBox()) {
1542
- Commands.addValueWithLine(CommandType.SET_VALUE, this, line, indice);
1543
- }
1544
- else
1545
- Commands.addValueWithLine(CommandType.SET_VALUE, this, line, +this.Value);
1546
- }
1547
- break;
1548
- case MgControlType.CTRL_TYPE_BUTTON:
1549
- case MgControlType.CTRL_TYPE_TEXT:
1550
- if (valueChanged) {
1551
- if (this.IsImageButton()) {
1552
- this.setImageWithFileName(this.Value);
1553
- }
1554
- else
1555
- this.setText();
1556
- }
1557
- else
1558
- return;
1559
- break;
1560
- case MgControlType.CTRL_TYPE_RADIO:
1561
- valueChanged = yield this.refreshAndSetItemListByDataSource(line, valueChanged);
1562
- if (!valueChanged)
1563
- return;
1564
- this.setRadioChecked(this.Value);
1565
- break;
1566
- default:
1567
- Events.WriteExceptionToLog(NString.Format("in Control.RefreshDisplayValue() unknown type: {0}", this.Type));
1568
- return;
1569
- }
1570
- if (_super.isChoiceControl.call(this) && valueChanged)
1571
- yield this.updatePropertyLogicNesting(PropInterface.PROP_TYPE_VISIBLE, CommandType.PROP_SET_VISIBLE, yield this.checkProp(PropInterface.PROP_TYPE_VISIBLE, true), false);
1572
- }
1573
- catch (ex_360) {
1574
- if (ex_360 instanceof Exception) {
1575
- Events.WriteExceptionToLog(NString.Format("in Control.RefreshDisplayValue() for control: {0}", this.Name));
1576
- }
1577
- else
1578
- throw ex_360;
1579
- }
1580
- });
1581
- }
1582
- RefreshDisplay(onlyRepeatableProps) {
1583
- return __awaiter(this, void 0, void 0, function* () {
1584
- if (isNullOrUndefined(onlyRepeatableProps))
1585
- onlyRepeatableProps = false;
1586
- yield this.RefreshDisplay_1(onlyRepeatableProps);
1587
- });
1588
- }
1589
- RefreshDisplay_1(onlyRepeatableProps) {
1590
- const _super = Object.create(null, {
1591
- isSubform: { get: () => super.isSubform }
1592
- });
1593
- return __awaiter(this, void 0, void 0, function* () {
1594
- if (!(_super.isSubform.call(this) && this.GetSubformMgForm() !== null && this.GetSubformMgForm().inRefreshDisplay())) {
1595
- yield this.refreshProperties(onlyRepeatableProps);
1596
- if (this.ShouldComputeAndRefreshOnClosedForm()) {
1597
- yield this.ComputeAndRefreshDisplayValue(false);
1598
- }
1599
- let isParkableCtrl = !(yield this.isParkable(false)) || !(yield this.isModifiable());
1600
- if (this.GetCurrReadOnly() !== isParkableCtrl) {
1601
- this.SetCurrReadOnly(isParkableCtrl);
1602
- yield Manager.SetReadOnlyControl(this, isParkableCtrl);
1603
- }
1604
- let mustInputProperty = this.GetComputedProperty(PropInterface.PROP_TYPE_MUST_INPUT);
1605
- if (mustInputProperty != null && mustInputProperty.isExpression()) {
1606
- let prevMustInput = this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_MUST_INPUT, false);
1607
- if (prevMustInput !== (yield this.checkProp(PropInterface.PROP_TYPE_MUST_INPUT, false)))
1608
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.MustInput, !prevMustInput);
1609
- }
1610
- if (!this.GetComputedBooleanProperty(PropInterface.PROP_TYPE_TAB_IN, true))
1611
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, this.getDisplayLine(false), HtmlProperties.TabIndex, -1);
1612
- }
1613
- });
1614
- }
1615
- ShouldComputeAndRefreshOnClosedForm() {
1616
- return true;
1617
- }
1618
- refreshProperties(onlyRepeatableProps) {
1619
- return __awaiter(this, void 0, void 0, function* () {
1620
- if (this._field !== null && this.DataType !== StorageAttribute.NONE && this._firstRefreshProperties)
1621
- Commands.addWithNumber(CommandType.SET_ATTRIBUTE, this, this.DataType.charCodeAt(0));
1622
- if (this._propTab !== null) {
1623
- try {
1624
- if (this._firstRefreshProperties) {
1625
- this.createDefaultProps();
1626
- yield this.ZoomButtonInitialization();
1627
- }
1628
- if (!(yield this._propTab.RefreshDisplay(false, onlyRepeatableProps))) {
1629
- Events.WriteExceptionToLog(NString.Format("Control '{0}': Not all properties could be set", this.getName()));
1630
- }
1631
- if (this._firstRefreshProperties) {
1632
- if (!onlyRepeatableProps) {
1633
- this._firstRefreshProperties = false;
1634
- }
1635
- }
1636
- }
1637
- catch (ex) {
1638
- if (ex instanceof Exception) {
1639
- let msg = new StringBuilder(NString.Format("Control '{0}': {1}", this.getName(), ex.Message));
1640
- Events.WriteExceptionToLog(msg.ToString());
1641
- }
1642
- else
1643
- throw ex;
1644
- }
1645
- }
1646
- });
1647
- }
1648
- refreshTabForLayerList(line) {
1649
- return __awaiter(this, void 0, void 0, function* () {
1650
- let currentLinkValue = null;
1651
- if (this.getForm().Opened) {
1652
- let indice = this.getCurrentIndexOfChoice();
1653
- let currentLayer = indice[0];
1654
- currentLinkValue = yield this.getLinkValue(currentLayer.toString(), line);
1655
- }
1656
- yield this.refreshAndSetItemsList(line, false);
1657
- if (this.getForm().Opened) {
1658
- yield this.SetAndRefreshDisplayValue(currentLinkValue, this.IsNull);
1659
- }
1660
- });
1661
- }
1662
- refreshAndSetItemsListForRadioButton(line, execComputeChoice) {
1663
- return __awaiter(this, void 0, void 0, function* () {
1664
- let displayList = yield this.refreshDispRange(execComputeChoice);
1665
- let options = displayList.map((displayValue, counter, arr) => {
1666
- let index = counter.toString();
1667
- return { index, displayValue };
1668
- });
1669
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.ItemsList, options);
1670
- });
1671
- }
1672
- refreshAndSetItemsList(line, execComputeChoice) {
1673
- const _super = Object.create(null, {
1674
- isSelectionCtrl: { get: () => super.isSelectionCtrl },
1675
- isTabControl: { get: () => super.isTabControl },
1676
- isRadio: { get: () => super.isRadio }
1677
- });
1678
- return __awaiter(this, void 0, void 0, function* () {
1679
- if (execComputeChoice) {
1680
- this.clearRange(line);
1681
- }
1682
- let optionsStrings = yield this.refreshDispRange(execComputeChoice);
1683
- if (_super.isSelectionCtrl.call(this) || _super.isTabControl.call(this)) {
1684
- let options = optionsStrings.map((displayValue, index, arr) => {
1685
- return { index, displayValue };
1686
- });
1687
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, this, line, HtmlProperties.ItemsList, options);
1688
- }
1689
- else {
1690
- if (_super.isRadio.call(this)) {
1691
- yield this.refreshAndSetItemsListForRadioButton(line, execComputeChoice);
1692
- }
1693
- }
1694
- });
1695
- }
1696
- refreshDispRange(execComputeChoice) {
1697
- return __awaiter(this, void 0, void 0, function* () {
1698
- let selectCmd = new Array(0);
1699
- let line = this.getDisplayLine(true);
1700
- if (line < 0) {
1701
- line = 0;
1702
- }
1703
- if (this.SupportsDataSource()) {
1704
- let dataView = this.getForm().getTask().DataView;
1705
- let dcv = dataView.getDcValues(this._dcValId);
1706
- let dispVals = yield this.getDispVals(line, execComputeChoice);
1707
- if (this._hasValidItmAndDispVal) {
1708
- selectCmd = MgControlBase.combineStringArrays(dispVals, dcv.getDispVals());
1709
- }
1710
- }
1711
- else {
1712
- selectCmd = yield this.getDispVals(line, execComputeChoice);
1713
- }
1714
- this._rangeChanged = true;
1715
- return yield this.getOrderedDispList(selectCmd, line);
1716
- });
1717
- }
1718
- refreshItmRange(execComputeChoice) {
1719
- return __awaiter(this, void 0, void 0, function* () {
1720
- Debug.Assert(this.SupportsDataSource());
1721
- let orderedItmList = new Array(0);
1722
- let line = this.getDisplayLine(false);
1723
- if (line < 0) {
1724
- line = 0;
1725
- }
1726
- if (execComputeChoice) {
1727
- yield this.computeChoice(line);
1728
- }
1729
- let linkVals = this._choiceLinks.get_Item(line);
1730
- let dataView = this.getForm().getTask().DataView;
1731
- let dcv = dataView.getDcValues(this._dcValId);
1732
- if (this._hasValidItmAndDispVal) {
1733
- orderedItmList = MgControlBase.combineStringArrays(linkVals, dcv.GetLinkVals());
1734
- }
1735
- return yield this.getOrderedDispList(orderedItmList, line);
1736
- });
1737
- }
1738
- GetItemsRange() {
1739
- return __awaiter(this, void 0, void 0, function* () {
1740
- return yield this.refreshItmRange(false);
1741
- });
1742
- }
1743
- GetDisplayRange() {
1744
- return __awaiter(this, void 0, void 0, function* () {
1745
- return yield this.refreshDispRange(false);
1746
- });
1747
- }
1748
- createDefaultProps() {
1749
- this.getProp(PropInterface.PROP_TYPE_VISIBLE);
1750
- this.getProp(PropInterface.PROP_TYPE_ENABLED);
1751
- if (super.isTableControl()) {
1752
- this.getProp(PropInterface.PROP_TYPE_SCROLL_BAR);
1753
- }
1754
- }
1755
- setLinkedParentIdx(linkedParentDitIdx) {
1756
- this._linkedParentDitIdx = linkedParentDitIdx;
1757
- }
1758
- buildPicture(oldVal, val) {
1759
- if (super.isTableControl() || super.isColumnControl())
1760
- return null;
1761
- if (this._picExpExists) {
1762
- this._vd = null;
1763
- }
1764
- if (this._vd === null) {
1765
- this._vd = new ValidationDetails(oldVal, val, this._range, this._pic, this);
1766
- }
1767
- else {
1768
- this._vd.setValue(val);
1769
- this._vd.setOldValue(oldVal);
1770
- }
1771
- return this._vd;
1772
- }
1773
- isDifferentValue(newValue, isNull, checkNullValue) {
1774
- let ctrlCurrValue = this.Value;
1775
- let valChanged = false;
1776
- if (newValue instanceof Date) {
1777
- if (this.DataType === StorageAttribute.DATE)
1778
- valChanged = !this.CompareDate(newValue, ctrlCurrValue);
1779
- else
1780
- valChanged = !this.CompareTime(newValue, ctrlCurrValue);
1781
- }
1782
- if (typeof newValue === 'boolean' || typeof newValue === 'number') {
1783
- if (this.isSelectionCtrl() && typeof ctrlCurrValue === 'string') {
1784
- let newValuestr = newValue.toString();
1785
- valChanged = (newValuestr !== ctrlCurrValue);
1786
- }
1787
- else {
1788
- valChanged = (newValue !== ctrlCurrValue);
1789
- }
1790
- }
1791
- else {
1792
- if (this.isSelectionCtrl() && typeof ctrlCurrValue === 'string' && Array.isArray(newValue)) {
1793
- let newValueStr = newValue.join(',').toString();
1794
- valChanged = !(StrUtil.rtrim(newValueStr) === StrUtil.rtrim(ctrlCurrValue));
1795
- }
1796
- else {
1797
- let ctrlCurrIsNull = this.IsNull;
1798
- valChanged = !(StrUtil.rtrim(newValue) === StrUtil.rtrim(ctrlCurrValue));
1799
- if (!valChanged && checkNullValue) {
1800
- valChanged = (isNull !== ctrlCurrIsNull);
1801
- }
1802
- }
1803
- }
1804
- return valChanged;
1805
- }
1806
- CompareDate(d1, d2) {
1807
- let retval;
1808
- if (d1 === null && d2 === null)
1809
- retval = true;
1810
- else if ((d1 === null && d2 !== null) || (d1 !== null && d2 === null))
1811
- retval = false;
1812
- else if (d1.getFullYear() === d2.getFullYear()
1813
- && d1.getDate() === d2.getDate()
1814
- && d1.getMonth() === d2.getMonth())
1815
- retval = true;
1816
- return retval;
1817
- }
1818
- CompareTime(d1, d2) {
1819
- let retval;
1820
- if (d1 === null && d2 === null)
1821
- retval = true;
1822
- else if ((d1 === null && d2 !== null) || (d1 !== null && d2 === null))
1823
- retval = false;
1824
- else if (d1.getHours() === d2.getHours()
1825
- && d1.getMinutes() === d2.getMinutes()
1826
- && d1.getSeconds() === d2.getSeconds())
1827
- retval = true;
1828
- return retval;
1829
- }
1830
- isColumnSortable() {
1831
- let isSortable = false;
1832
- if (this.Type === MgControlType.CTRL_TYPE_COLUMN && this._propTab.propExists(PropInterface.PROP_TYPE_SORT_COLUMN)) {
1833
- isSortable = this.GetComputedProperty(PropInterface.PROP_TYPE_SORT_COLUMN).GetComputedValueBoolean();
1834
- }
1835
- return isSortable;
1836
- }
1837
- getColumnChildControl() {
1838
- if (this.Type !== MgControlType.CTRL_TYPE_COLUMN)
1839
- return null;
1840
- let linkedControls = this._parentTable.getLinkedControls();
1841
- return linkedControls.find((control) => (control.getLayer() === this.getLayer() && control.Type !== MgControlType.CTRL_TYPE_COLUMN && !control.IsTableHeaderChild));
1842
- }
1843
- getControlNameForHandlerSearch() {
1844
- let childControl = this.getColumnChildControl();
1845
- let name;
1846
- if (childControl !== null) {
1847
- return childControl.Name;
1848
- }
1849
- else
1850
- return this.Name;
1851
- }
1852
- linkCtrl(ctrl) {
1853
- this._linkedControls.push(ctrl);
1854
- }
1855
- removeRefFromField() {
1856
- if (this._field !== null) {
1857
- this._field.RemoveControl(this);
1858
- }
1859
- }
1860
- getDitIdx() {
1861
- return this._ditIdx;
1862
- }
1863
- setDcValId(dcValId) {
1864
- this._dcValId = dcValId;
1865
- }
1866
- SetKeyboardLanguage(restoreLang) {
1867
- Commands.beginInvoke();
1868
- }
1869
- Init() {
1870
- }
1871
- IsParkable() {
1872
- return __awaiter(this, void 0, void 0, function* () {
1873
- return yield this.isParkable(true);
1874
- });
1875
- }
1876
- HasExpOrParentTaskField() {
1877
- let task = this.getForm().getTask();
1878
- return (this.getField() === null || this.getField().getTask() !== task);
1879
- }
1880
- isParkable(checkEnabledAndVisible) {
1881
- const _super = Object.create(null, {
1882
- isTableControl: { get: () => super.isTableControl },
1883
- isColumnControl: { get: () => super.isColumnControl },
1884
- isSubform: { get: () => super.isSubform },
1885
- isBrowserControl: { get: () => super.isBrowserControl }
1886
- });
1887
- return __awaiter(this, void 0, void 0, function* () {
1888
- let result;
1889
- result = !_super.isTableControl.call(this) && !_super.isColumnControl.call(this);
1890
- let task = this.getForm().getTask();
1891
- if (result) {
1892
- result = task.IsInteractive;
1893
- }
1894
- if (result && task.DataView.isEmptyDataview() && this._field !== null && this._field.PartOfDataview) {
1895
- result = false;
1896
- }
1897
- if (result) {
1898
- if (!_super.isSubform.call(this)) {
1899
- result = ((this._field !== null && this._field.getTask() === task) || this.isButton() || _super.isBrowserControl.call(this));
1900
- }
1901
- if (result && checkEnabledAndVisible) {
1902
- result = (this.isEnabled() && this.isVisible());
1903
- }
1904
- if ((result && this._parentTable !== null) && checkEnabledAndVisible) {
1905
- result = (this._parentTable.GetComputedBooleanProperty(PropInterface.PROP_TYPE_ENABLED, true) && this._parentTable.GetComputedBooleanProperty(PropInterface.PROP_TYPE_VISIBLE, true));
1906
- }
1907
- }
1908
- return result;
1909
- });
1910
- }
1911
- refreshDefaultButton() {
1912
- return __awaiter(this, void 0, void 0, function* () {
1913
- let prop = this.Form.getProp(PropInterface.PROP_TYPE_DEFAULT_BUTTON);
1914
- yield prop.RefreshDisplay(true);
1915
- });
1916
- }
1917
- RaiseControlHitOnLeftClickOfMouseDown() {
1918
- let raiseCtrlHit = false;
1919
- if (!super.IsHyperTextButton() && !super.isRadio() && !super.isTabControl()) {
1920
- raiseCtrlHit = true;
1921
- }
1922
- return raiseCtrlHit;
1923
- }
1924
- GetVarIndex() {
1925
- return 0;
1926
- }
1927
- RaiseControlHitOnMouseDown(leftClickWasPressed) {
1928
- let raiseCtrlHit = false;
1929
- if (leftClickWasPressed) {
1930
- if (this.RaiseControlHitOnLeftClickOfMouseDown()) {
1931
- raiseCtrlHit = true;
1932
- }
1933
- }
1934
- return raiseCtrlHit;
1935
- }
1936
- OnSubformClick() {
1937
- Manager.EventsManager.addGuiTriggeredEventWithTaskAndCode(this.getForm().getTask(), InternalInterface.MG_ACT_HIT);
1938
- }
1939
- GetSubformMgForm() {
1940
- return null;
1941
- }
1942
- PropertyExists(id) {
1943
- return this._propTab.propExists(id);
1944
- }
1945
- toString() {
1946
- return "{" + this.constructor.name + ": " + MgControlType[this.Type] + "}";
1947
- }
1948
- isDateZero(val) {
1949
- let zeroDate = false;
1950
- if (val instanceof Date) {
1951
- if (val.getMonth() === 0 && val.getFullYear() === 0 && val.getDay() === 0)
1952
- zeroDate = true;
1953
- }
1954
- return zeroDate;
1955
- }
1956
- IsDefaultRouterOutlet() {
1957
- return (this.Type === MgControlType.CTRL_TYPE_SUBFORM && this.GetComputedBooleanProperty_0(PropInterface.PROP_TYPE_DEFAULT_OUTLET, false));
1958
- }
1959
- IsRouterOutlet() {
1960
- return (this.Type === MgControlType.CTRL_TYPE_SUBFORM && this.GetComputedBooleanProperty_0(PropInterface.PROP_TYPE_IS_ROUTER_OUTLET, false));
1961
- }
1962
- ZoomButtonInitialization() {
1963
- return __awaiter(this, void 0, void 0, function* () {
1964
- if (this.isTextControl() && this.checkIfExistProp(PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL)) {
1965
- let connectedButton = this.Form.CtrlTab.GetControlByIsn((yield (yield this.getProp(PropInterface.PROP_TYPE_CONNECTED_ZOOM_CONTROL)).getValueInt()));
1966
- let imageFileName = null;
1967
- if (connectedButton.IsImageButton() && connectedButton.PropertyExists(PropInterface.PROP_TYPE_IMAGE_FILENAME)) {
1968
- imageFileName = yield (yield connectedButton.getProp(PropInterface.PROP_TYPE_IMAGE_FILENAME)).getValue();
1969
- if (!Misc.IsWebUrl(imageFileName))
1970
- imageFileName = "./assets/images/" + imageFileName;
1971
- Commands.addOperationWithLine(CommandType.SET_STYLE, this, 0, MagicProperties.ImageFile, imageFileName);
1972
- }
1973
- this.ConnectedControl = connectedButton;
1974
- connectedButton.ConnectedControl = this;
1975
- }
1976
- });
1977
- }
1978
- }
1979
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdDb250cm9sQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdDb250cm9sQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsU0FBUyxFQUNULElBQUksRUFDSixPQUFPLEVBQ1AsT0FBTyxFQUNQLFFBQVEsRUFDUixhQUFhLEVBQ2QsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixhQUFhLEVBQ2IsSUFBSSxFQUNKLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUs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ZSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzthQUN6QztRQUNILENBQUM7S0FBQTtDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvbkV4Y2VwdGlvbixcclxuICBEZWJ1ZyxcclxuICBFeGNlcHRpb24sXHJcbiAgTGlzdCxcclxuICBOTnVtYmVyLFxyXG4gIE5TdHJpbmcsXHJcbiAgUmVmUGFyYW0sXHJcbiAgU3RyaW5nQnVpbGRlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHsgR3VpTWdDb250cm9sIH0gZnJvbSAnLi4vLi4vZ3VpL0d1aU1nQ29udHJvbCc7XHJcbmltcG9ydCB7IFByb3BQYXJlbnRJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9ndWkvUHJvcFBhcmVudEludGVyZmFjZSc7XHJcbmltcG9ydCB7IEd1aUZpZWxkQmFzZSB9IGZyb20gJy4uL2RhdGEvR3VpRmllbGRCYXNlJztcclxuaW1wb3J0IHtcclxuICBDaG9pY2VVdGlscyxcclxuICBDb25zdGFudHMsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTWFnaWNQcm9wZXJ0aWVzLFxyXG4gIE1nQ29udHJvbFR5cGUsXHJcbiAgTWlzYyxcclxuICBTRVFfMl9TVFIsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdG9yYWdlQXR0cmlidXRlQ2hlY2ssXHJcbiAgU3RyVXRpbCxcclxuICBVdGlsU3RyQnl0ZU1vZGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQgeyBNZ0Zvcm1CYXNlIH0gZnJvbSAnLi9NZ0Zvcm1CYXNlJztcclxuaW1wb3J0IHsgUElDIH0gZnJvbSAnLi9QSUMnO1xyXG5pbXBvcnQgeyBQcm9wVGFibGUgfSBmcm9tICcuL1Byb3BUYWJsZSc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25EZXRhaWxzIH0gZnJvbSAnLi9WYWxpZGF0aW9uRGV0YWlscyc7XHJcbmltcG9ydCB7IEZpZWxkRGVmIH0gZnJvbSAnLi4vZGF0YS9GaWVsZERlZic7XHJcbmltcG9ydCB7IFByb3BlcnR5IH0gZnJvbSAnLi9Qcm9wZXJ0eSc7XHJcbmltcG9ydCB7IEd1aVRhc2tCYXNlIH0gZnJvbSAnLi4vdGFza3MvR3VpVGFza0Jhc2UnO1xyXG5pbXBvcnQgeyBNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vTWFuYWdlcic7XHJcbmltcG9ydCB7IENvbW1hbmRUeXBlLCBIdG1sUHJvcGVydGllcyB9IGZyb20gJy4uLy4uL0d1aUVudW1zJztcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tICcuLi8uLi9Db21tYW5kcyc7XHJcbmltcG9ydCB7IE5VTV9UWVBFIH0gZnJvbSAnLi4vZGF0YS9OVU1fVFlQRSc7XHJcbmltcG9ydCB7IFByb3BJbnRlcmZhY2UgfSBmcm9tICcuL1Byb3BJbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBFdmVudHMgfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQgeyBEY1ZhbHVlcywgRU1QVFlfRENSRUYgfSBmcm9tICcuLi9kYXRhL0RjVmFsdWVzJztcclxuaW1wb3J0IHsgR3VpRGF0YVZpZXdCYXNlIH0gZnJvbSAnLi4vZGF0YS9HdWlEYXRhVmlld0Jhc2UnO1xyXG5pbXBvcnQgeyBEaXNwbGF5Q29udmVydG9yIH0gZnJvbSAnLi9EaXNwbGF5Q29udmVydG9yJztcclxuaW1wb3J0IHsgQmxvYlR5cGUgfSBmcm9tICcuLi9kYXRhL0Jsb2JUeXBlJztcclxuaW1wb3J0IHsgVmVjdG9yVHlwZSB9IGZyb20gJy4uL2RhdGEvVmVjdG9yVHlwZSc7XHJcbmltcG9ydCB7IE9iamVjdFJlZmVyZW5jZSB9IGZyb20gJy4uLy4uL3V0aWwvT2JqZWN0UmVmZXJlbmNlJztcclxuaW1wb3J0IHsgR3VpQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHsgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICd1dGlsJztcclxuaW1wb3J0IHsgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB9IGZyb20gJy4vR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcic7XHJcbmltcG9ydCB7IEZvY3VzTWFuYWdlciB9IGZyb20gJy4uLy4uL0ZvY3VzTWFuYWdlcic7XHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBkYXRhIGZvciA8Y29udHJvbD4gLi4uPC9jb250cm9sPiB0YWdcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1nQ29udHJvbEJhc2UgZXh0ZW5kcyBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIGltcGxlbWVudHMgUHJvcFBhcmVudEludGVyZmFjZSB7XHJcblxyXG4gIC8vIGZpeGVkIGRlZmVjdCAjOjgxNDk4LCB3aGlsZSBSVCBpcyBzZXQgZGVmYXVsdCB2YWx1ZSB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGNvbnRyb2xcclxuICAvLyB0byB0aGUgdmFsdWUgd2lsbCBzZXQgdG8gdGhlIGNvbnRyb2xcclxuXHJcbiAgX2RpdElkeDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9saW5rZWRDb250cm9sczogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7IC8vIGFycmF5IG9mIGNvbnRyb2xzIHRoYXQgYXJlIGxpbmtlZCB0byB0aGlzIGNvbnRyb2xcclxuICBfZmllbGQ6IEd1aUZpZWxkQmFzZSA9IG51bGw7IC8vIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgb2YgdGhlIGNvbnRyb2xcclxuICBfbm9kZUlkRmllbGQ6IEd1aUZpZWxkQmFzZSA9IG51bGw7IC8vIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgb2YgdGhlIG5vZGUgaWRcclxuICBfbm9kZVBhcmVudElkRmllbGQ6IEd1aUZpZWxkQmFzZSA9IG51bGw7IC8vIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgb2YgdGhlIHBhcmVudCBub2RlIGlkXHJcbiAgcHJpdmF0ZSBfcGljU3RyOiBzdHJpbmcgPSBudWxsO1xyXG4gIF9jaG9pY2VEaXNwczogTGlzdDxzdHJpbmdbXT4gPSBudWxsOyAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCBob2xkcyB0aGVcclxuICBfY2hvaWNlTGF5ZXJMaXN0OiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7IC8vIHRoZSBvcmRlciBvbiB3aGljaCB0YWJzIHRvIGJlIGRpc3BsYXllZFxyXG4gIF9jaG9pY2VMaW5rczogTGlzdDxzdHJpbmdbXT4gPSBudWxsOyAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCBob2xkcyB0aGVcclxuICBfY2hvaWNlTnVtczogTGlzdDxOVU1fVFlQRVtdPiA9IG51bGw7ICAvLyBmb3IgU0VMRUNUIGNvbnRyb2xzLCB3aXRoIG51bWVyaWNcclxuICBwcml2YXRlIF9jb250YWluZXJEaXRJZHg6IG51bWJlciA9IC0xO1xyXG4gIF9jdXJyUmVhZE9ubHk6IExpc3Q8Ym9vbGVhbj4gPSBudWxsOyAvLyBhIGhpc3RvcnkgYXJyYXkgZm9yIHJlYWRvbmx5IHBhcmFtXHJcbiAgcHJpdmF0ZSBfZGF0YUN0cmw6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVGhlIGRhdGEgY29udHJvbCBmbGFnIHN0YXRlcyB0aGF0IHRoaXNcclxuICBfZGNUYWJsZVJlZnM6IExpc3Q8bnVtYmVyPiA9IG51bGw7IC8vIHJlZmVyZW5jZXMgdG8gZGNWYWxzIGZvciBlYWNoIGxpbmUgb2YgYSBjb250cm9sIGlzIGEgZGF0YSBjb250cm9sXHJcbiAgcHJpdmF0ZSBfZmlyc3RSZWZyZXNoUHJvcGVydGllczogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfZm9ybTogTWdGb3JtQmFzZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaGFzVmFsaWRJdG1BbmREaXNwVmFsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaWQ6IG51bWJlciA9IC0xOyAvLyBDb250cm9sSXNuIG9mIHRoZSBjb250cm9sIChmb3Igc3ViZm9ybSlcclxuICBwcml2YXRlIF9jb250cm9sSXNuOiBudW1iZXIgPSAtMTsgLy8gZm9yIGN1cnJlbnQgaXNuXHJcblxyXG4gIHByaXZhdGUgX2xpbmtlZFBhcmVudERpdElkeDogbnVtYmVyID0gLTE7IC8vIG5vdCB0cmlnZ2VyIGFueSBldmVudCBoYW5kbGVyLCB3aGlsZSBwYXJraW5nIGluIHRoaXMgY29udHJvbFxyXG4gIF9vcmdDaG9pY2VEaXNwczogTGlzdDxzdHJpbmdbXT4gPSBudWxsOyAvLyBmb3IgVEFCIENvbnRyb2wgc2F2ZSB0aGUgb3JnIG9wdGlvbiAod2l0aCB0aGUgJilcclxuICBfcGFyZW50VGFibGU6IE1nQ29udHJvbEJhc2UgPSBudWxsOyAvLyByZWZlcmVuY2UgdG8gcGFyZW50IE1hZ2ljIFRhYmxlIGZvclxyXG4gIF9waWM6IFBJQyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGljRXhwRXhpc3RzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgX3ByZXZJc051bGxzOiBMaXN0PGJvb2xlYW4+ID0gbnVsbDsgLy8gZm9yIE5VTExcclxuICBwcml2YXRlIF9wcmV2UGljRXhwUmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gIF9wcmV2VmFsdWVzOiBMaXN0PHN0cmluZz4gPSBudWxsOyAvLyByZWZlcmVuY2VzIHRvIHByZXZpb3VzIHZhbHVlcyBvZiB0aGVcclxuICBfcHJvcFRhYjogUHJvcFRhYmxlID0gbnVsbDtcclxuICBwcml2YXRlIF9yYW5nZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9yYW5nZUNoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gZm9yIFNFTEVDVCBjb250cm9scywgdHJ1ZSBpZiB0aGVpciByYW5nZVxyXG4gIHByaXZhdGUgX3J0ZlZhbDogc3RyaW5nID0gTlN0cmluZy5FbXB0eTsgLy8gZmllbGQgdG8gc3RvcmUgdGhlIHJ0ZiB0ZXh0IG9mIHJpY2ggZWRpdCBjb250cm9sXHJcbiAgX3ZhbEV4cElkOiBudW1iZXIgPSAwOyAvLyByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIGV4cHJlc3Npb25cclxuICBwcml2YXRlIF92ZDogVmFsaWRhdGlvbkRldGFpbHMgPSBudWxsO1xyXG4gIHByaXZhdGUgX2RjVmFsSWQ6IG51bWJlciA9IC0yO1xyXG4gIHBhcmVudDogbnVtYmVyID0gMDtcclxuICB2ZWVJbmR4OiBudW1iZXIgPSAwO1xyXG4gIEROT2JqZWN0UmVmZXJlbmNlRmllbGQ6IEZpZWxkRGVmID0gbnVsbDtcclxuICBTb3VyY2VUYWJsZVJlZmVyZW5jZTogT2JqZWN0UmVmZXJlbmNlID0gbnVsbDtcclxuICBDbGlwQm9hcmREYXRhRXhpc3RzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgRGF0YVR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBTdG9yYWdlQXR0cmlidXRlLk5PTkU7XHJcbiAgS2V5U3Ryb2tlT246IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSBpZiB0aGUgdXNlciBwcmVzc2VkIGEga2V5XHJcbiAgTW9kaWZpZWRCeVVzZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBWYWx1ZTogYW55ID0gbnVsbDtcclxuICBJc051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmb3JjZVJlZnJlc2ggOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNNb2RhbCA6IGJvb2xlYW47IC8vYXBwbGljYWJsZSBmb3Igc3ViZm9ybSwgaWYgc3ViZm9ybSBpcyBNb2RhbFxyXG5cclxuICBwcm90ZWN0ZWQgc2V0IEZvcm0odmFsdWU6IE1nRm9ybUJhc2UpIHtcclxuICAgIHRoaXMuX2Zvcm0gPSB2YWx1ZTtcclxuICAgIHRoaXMuR3VpTWdGb3JtID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9ybTtcclxuICB9XHJcblxyXG4gIGdldCBJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IENvbnRyb2xJc24oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250cm9sSXNuO1xyXG4gIH1cclxuXHJcbiAgUmVmcmVzaE9uVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlOyAvLyB0cnVlLCBpZiB0aGUgc3ViZm9ybSBtdXN0IGJlIHJlZnJlc2hlZCBvbiBiZWNvbWUgdmlzaWJsZVxyXG4gIEluQ29udHJvbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFByb21wdEhlbHA6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vIHRoZSBwcm9tcHQgaGVscCB0ZXh0IGFzc2lnbmVkIHRvIGNvbnRyb2xcclxuXHJcbiAgY29uc3RydWN0b3IoKTtcclxuICBjb25zdHJ1Y3Rvcih0eXBlOiBNZ0NvbnRyb2xUeXBlLCBwYXJlbnRNZ0Zvcm06IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2w6IG51bWJlcik7XHJcbiAgY29uc3RydWN0b3IodHlwZT86IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybT86IE1nRm9ybUJhc2UsIHBhcmVudENvbnRyb2w/OiBudW1iZXIpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHR5cGUsIHBhcmVudE1nRm9ybSwgcGFyZW50Q29udHJvbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9saW5rZWRDb250cm9scyA9IG5ldyBMaXN0PE1nQ29udHJvbEJhc2U+KCk7XHJcbiAgICB0aGlzLkRhdGFUeXBlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKHR5cGU6IE1nQ29udHJvbFR5cGUsIHBhcmVudE1nRm9ybTogTWdGb3JtQmFzZSwgcGFyZW50Q29udHJvbDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgIHRoaXMuaW5pdFJlZmVyZW5jZXMocGFyZW50TWdGb3JtKTtcclxuICAgIHRoaXMuVHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLl9jb250YWluZXJEaXRJZHggPSBwYXJlbnRDb250cm9sO1xyXG4gICAgdGhpcy5fbGlua2VkUGFyZW50RGl0SWR4ID0gcGFyZW50Q29udHJvbDtcclxuICAgIHRoaXMuX3Byb3BUYWIgPSBuZXcgUHJvcFRhYmxlKHRoaXMpO1xyXG4gICAgdGhpcy5jcmVhdGVBcnJheXMoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFVuaXF1ZU5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVGFza1RhZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuRm9ybS5nZXRUYXNrKCkuZ2V0VGFza1RhZygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvcElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGNoZWNrSWZFeGlzdFByb3AocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBleGlzdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX3Byb3BUYWIgIT09IG51bGwpIHtcclxuICAgICAgbGV0IHByb3BCeUlkOiBQcm9wZXJ0eSA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuICAgICAgZXhpc3QgPSAocHJvcEJ5SWQgIT09IG51bGwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGV4aXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBJZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIGdldFByb3AocHJvcElkOiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICAgIGlmIChwcm9wID09PSBudWxsKSB7XHJcbiAgICAgICAgcHJvcCA9IFByb3BlcnR5LmdldERlZmF1bHRQcm9wKHByb3BJZCwgJ0MnLCB0aGlzKTtcclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QgdGhlbiBjcmVhdGUgYSBuZXcgcHJvcGVydHkgYW5kIGdpdmUgaXQgdGhlIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICAvLyBpbiBhZGRpdGlvbiBhZGQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgcHJvcGVydGllcyB0YWJsZVxyXG4gICAgICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLl9wcm9wVGFiLmFkZFByb3AocHJvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvcDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBmb3JtIG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q29tcElkeCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBmaXJzdCByZWZyZXNoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIElzRmlyc3RSZWZyZXNoT2ZQcm9wcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImV4cElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZW5ndGhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlVW5pY29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzQ2VsbFR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImFsd2F5c0V2YWx1YXRlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ3YXNFdmFsdWF0ZWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRXZhbHVhdGVFeHByZXNzaW9uKGV4cElkOiBudW1iZXIsIHJlc1R5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGxlbmd0aDogbnVtYmVyLCBjb250ZW50VHlwZVVuaWNvZGU6IGJvb2xlYW4sIHJlc0NlbGxUeXBlOiBTdG9yYWdlQXR0cmlidXRlLCBhbHdheXNFdmFsdWF0ZTogYm9vbGVhbiwgd2FzRXZhbHVhdGVkOiBSZWZQYXJhbTxib29sZWFuPik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkV2YWx1YXRlRXhwcmVzc2lvbihleHBJZCwgcmVzVHlwZSwgbGVuZ3RoLCBjb250ZW50VHlwZVVuaWNvZGUsIHJlc0NlbGxUeXBlLCBhbHdheXNFdmFsdWF0ZSwgd2FzRXZhbHVhdGVkKTtcclxuICB9XHJcblxyXG4gIEdldEV4cHJlc3Npb25TdG9yYWdlKGV4cElkOiBudW1iZXIpOiBTdG9yYWdlQXR0cmlidXRlIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBnZXQgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbCB0aGF0IGFscmVhZHkgd2FzIGNvbXB1dGVkXHJcbiAgLy8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNyZWF0ZSBhIHByb3BlcnR5IGlmIGl0IGlzbid0IGV4aXN0LlxyXG4gIC8vLyBNYXkgd2UgbmVlZCB0byBjcmVhdGUgYSBwcm9wZXJ0eSBhbmQgdXNlIGl0cyBkZWZhdWx0IHZhbHVlLlxyXG4gIC8vLyBJbiBQaGFzZSAyIGluIFJlZnJlc2hQcm9wZXJ0aWVzIG1ldGhvZCB3ZSdsbCBjcmVhdGUgYW5kIGNvbXB1dGUgcHJvcGVydGllcyxcclxuICAvLy8gcGVyaGFwcyB3ZSBuZWVkIGNyZWF0ZSBhbGwgcHJvcGVydGllcyBub3Qgb25seSB0aG9zZSB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj50aGUgSWQgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT5cclxuICBHZXRDb21wdXRlZFByb3BlcnR5KHByb3BJZDogbnVtYmVyKTogUHJvcGVydHkge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbClcclxuICAgICAgcHJvcCA9IHRoaXMuX3Byb3BUYWIuZ2V0UHJvcEJ5SWQocHJvcElkKTtcclxuICAgIHJldHVybiBwcm9wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEluaXRpYWxpemluZyBvZiBpbm5lciByZWZlcmVuY2UgdG8gdGhlIHRhc2sgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPnJlZmVyZW5jZSB0byB0aGUgdGFzayBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0UmVmZXJlbmNlcyhtZ0Zvcm06IE1nRm9ybUJhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuRm9ybSA9IG1nRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbiB0aGUgZmlyc3QgdGltZSB0aGF0IHdlIHJlZnJlc2ggdGhlIGNvbnRyb2wgbmVlZCB0byBjcmVhdGUgYXJyYXlzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlQ3JlYXRlQXJyYXlzXCI+Y3JlYXRlIGFycmF5cyBpbiBhbnkgY2FzZTwvcGFyYW0+XHJcbiAgY3JlYXRlQXJyYXlzKGZvcmNlQ3JlYXRlQXJyYXlzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcyB8fCBmb3JjZUNyZWF0ZUFycmF5cykge1xyXG5cclxuICAgICAgLy8gZm9yIFNFTEVDVCBjb250cm9scywgYWx3YXlzIGluaXRpYWxpemUgREMgdGFibGUgc2luY2Ugd2UgdXNlIGl0IHRvIG1lcmdlIGNob2ljZXMgZnJvbSB0aGVcclxuICAgICAgLy8gcHJvcCBsaXN0IHdpdGggY2hvaWNlcyBmcm9tIHRoZSBEQVRBIENPTlRST0wuXHJcbiAgICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKSB7XHJcbiAgICAgICAgdGhpcy5fZGNUYWJsZVJlZnMgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3ByZXZWYWx1ZXMgPSBuZXcgTGlzdCgpO1xyXG5cclxuICAgICAgLy8gVGhlIHByb3BlcnR5IFBST1BfU0VUX1JFQURfT05MWSBpcyBzZXQgb25seSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEJ5IGRlZmF1bHRcclxuICAgICAgLy8gdGhpcyBwcm9wZXJ0eSBpcyBmYWxzZSwgc28gd2UgZG8gbm90IHNldCBpdC5cclxuICAgICAgLy8gQnV0IGZvciB0aGUgcGhhbnRvbSB0YXNrIGlmIHRoaXMgcHJvcGVydHkgd2FzIHRydWUsIGFuZCB3ZSBleGl0IHRoZSBwaGFudG9tIGFuZCBhZ2FpbiBlbnRlciBpbnRvXHJcbiAgICAgIC8vIHRoaXMgcGhhbnRvbSB0aGUgcHJvcGVydHkgYmVjb21lcyBmYWxzZS5cclxuICAgICAgLy8gU28gd2UgbmVlZCB0byBzYXZlIHRoZSBwcmV2aW91cyBfY3VyclJlYWRPbmx5IHZhbHVlIGZvciB0aGUgcGhhbnRvbSB0YXNrLlxyXG4gICAgICBpZiAoIWZvcmNlQ3JlYXRlQXJyYXlzKSB7XHJcbiAgICAgICAgdGhpcy5fY3VyclJlYWRPbmx5ID0gbmV3IExpc3QoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9jaG9pY2VEaXNwcyA9IG5ldyBMaXN0KCk7XHJcbiAgICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTGlua3MgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB0aGlzLl9jaG9pY2VOdW1zID0gbmV3IExpc3QoKTtcclxuICAgICAgdGhpcy5fcHJldklzTnVsbHMgPSBuZXcgTGlzdCgpO1xyXG4gICAgICB0aGlzLl9jaG9pY2VMYXllckxpc3QgPSBuZXcgTGlzdCgpO1xyXG4gICAgICBpZiAoIXRoaXMuSXNSZXBlYXRhYmxlICYmICFzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBcnJheXMoMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldHMgdGhlIGZvY3VzIG9uIHRoZSBjb250cm9sIGFuZCByZWZyZXNoZXMgcHJvbXB0LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPkNvbnRyb2wgdG8gaGF2ZSBmb2N1czwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPmxpbmUgbnVtYmVyPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWZyZXNoUHJvbXB0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhY3RpdmF0ZUZvcm1cIj53aGV0aGVyIHRvIGFjdGl2YXRlIGEgZm9ybSBhZnRlciBzZXRmb2N1cyBvciBub3Q8L3BhcmFtPlxyXG4gIGFzeW5jIFNldEZvY3VzKGN0cmw6IE1nQ29udHJvbEJhc2UsIGxpbmU6IG51bWJlciwgcmVmcmVzaFByb21wdDogYm9vbGVhbiwgYWN0aXZhdGVGb3JtOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCBGb2N1c01hbmFnZXIuU2V0Rm9jdXMoY3RybC5nZXRGb3JtKCkuZ2V0VGFzaygpLCBjdHJsLCBsaW5lLCBhY3RpdmF0ZUZvcm0pO1xyXG4gIH1cclxuXHJcbiAgSW5zZXJ0QXJyYXlzKGlkeDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2VmFsdWVzLkluc2VydFJhbmdlKGlkeCwgbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5JbnNlcnRSYW5nZShpZHgsIG5ldyBBcnJheShjb3VudCkpO1xyXG5cclxuICAgIHRoaXMuX2N1cnJSZWFkT25seS5JbnNlcnRSYW5nZShpZHgsIG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuSW5zZXJ0UmFuZ2UoaWR4LCBuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLkluc2VydFJhbmdlKGlkeCwgbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5JbnNlcnRSYW5nZShpZHgsIG5ldyBBcnJheShjb3VudCkpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0Lkluc2VydFJhbmdlKGlkeCwgbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICB0aGlzLl9jaG9pY2VOdW1zLkluc2VydFJhbmdlKGlkeCwgbmV3IEFycmF5KGNvdW50KSk7XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSlcclxuICAgICAgdGhpcy5fZGNUYWJsZVJlZnMuSW5zZXJ0UmFuZ2UoaWR4LCBuZXcgQXJyYXkoY291bnQpKTtcclxuICAgIHRoaXMuX3Byb3BUYWIuSW5zZXJ0UHJldlZhbHVlQXJyYXkoaWR4LCBjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIGFycmF5J3Mgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIG5ld1NpemVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3U2l6ZVwiPjwvcGFyYW0+XHJcbiAgdXBkYXRlQXJyYXlzKG5ld1NpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldlZhbHVlcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fcHJldklzTnVsbHMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX2N1cnJSZWFkT25seS5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuU2V0U2l6ZShuZXdTaXplKTtcclxuICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VMaW5rcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICB0aGlzLl9jaG9pY2VOdW1zLlNldFNpemUobmV3U2l6ZSk7XHJcbiAgICBpZiAodGhpcy5TdXBwb3J0c0RhdGFTb3VyY2UoKSkge1xyXG4gICAgICB0aGlzLl9kY1RhYmxlUmVmcy5TZXRTaXplKG5ld1NpemUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcHJvcFRhYi51cGRhdGVQcmV2VmFsdWVBcnJheShuZXdTaXplKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld1NpemVcIj48L3BhcmFtPlxyXG4gIHVwZGF0ZVByZXZWYWxBcnJheXMobmV3U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcm9wVGFiLnVwZGF0ZVByZXZWYWx1ZUFycmF5KG5ld1NpemUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUbyBwYXJzZSBpbnB1dCBzdHJpbmcgYW5kIGZpbGwgaW5uZXIgZGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+dG8gcGFyZW50IHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGl0aWR4XCI+bnVtYmVyIG9mIHRoZSBDb250cm9sIGluIENvbnRyb2wgVGFibGU8L3BhcmFtPlxyXG4gIGZpbGxEYXRhKG1nRm9ybTogTWdGb3JtQmFzZSwgZGl0SWR4OiBudW1iZXIsIHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5Gb3JtID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuaW5pdFJlZmVyZW5jZXMobWdGb3JtKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2RpdElkeCA9IGRpdElkeDtcclxuICAgIHdoaWxlICh0aGlzLmluaXRJbm5lck9iamVjdHMocGFyc2VyLmdldE5leHRUYWcoKSwgcGFyc2VyKSkge1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZSBkYXRhdHlwZSBpcyBCTE9CLCBpdHMgcGljdHVyZSB3b3VsZCBiZSBibGFuay4gQnV0IGFmdGVyIHZlcnNpb24gIzk3XHJcbiAgICAvLyBvZiBBcHBTZXJpYWxpemVyLmNzIChjaGFuZ2VkIGZvciAjNDg1NzIyKSwgYmxhbmsgcGljdHVyZSBpcyBub3Qgc2VyaWFsaXplZC5cclxuICAgIC8vIFNvLCB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGl0IHRvIGJsYW5rIGhlcmUuXHJcbiAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CICYmIHRoaXMuX3BpY1N0ciA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9waWNTdHIgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3BpY1N0ciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5EYXRhVHlwZSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICB0aGlzLnNldFBJQyh0aGlzLl9waWNTdHIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcblxyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLlR5cGUpIHtcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTjpcclxuICAgICAgICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5PTkUpXHJcbiAgICAgICAgICAgIHRoaXMuRGF0YVR5cGUgPSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1NVQkZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9HUk9VUDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX1NFVDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX0ZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT05UQUlORVI6XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSU5FOlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gQ29udHJvbC5maWxsRGF0YSgpOiBtaXNzaW5nIGRhdGF0eXBlIG9yIHBpY3R1cmUgc3RyaW5nIGZvciBjb250cm9sOiB7MH1cIiwgdGhpcy5OYW1lKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdXBlci5pc1RhYmxlQ29udHJvbCgpKSB7XHJcbiAgICAgIHRoaXMuRm9ybS5zZXRUYWJsZUN0cmwodGhpcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNyZWF0ZUFycmF5cyhmYWxzZSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBUbyBhbGxvY2F0ZSBhbmQgZmlsbCBpbm5lciBvYmplY3RzIG9mIHRoZSBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj5uYW1lIG9mIHRhZywgb2Ygb2JqZWN0LCB3aGljaCBuZWVkIGJlIGFsbG9jYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIGlmIG5leHQgdGFnIGlzIGlubmVyIHRhZzwvcmV0dXJucz5cclxuICBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nLCBwYXJzZXI6IFhtbFBhcnNlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApIHtcclxuICAgICAgaWYgKHRoaXMuX3Byb3BUYWIgPT09IG51bGwpXHJcbiAgICAgICAgdGhpcy5fcHJvcFRhYiA9IG5ldyBQcm9wVGFibGUodGhpcyk7XHJcblxyXG4gICAgICB0aGlzLl9wcm9wVGFiLmZpbGxEYXRhKHRoaXMsICdDJywgcGFyc2VyKTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTClcclxuICAgICAgdGhpcy5wYXJzZUF0dHJpYnV0ZXMocGFyc2VyKTtcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gXCJTb3VyY2VUYWJsZVwiKVxyXG4gICAgICB0aGlzLlBhcnNlU291cmNlVGFibGUocGFyc2VyKTtcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gXCIvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpIHtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBDb250cm9sLiBJbnNlcnQgZWxzZSBpZiB0byBDb250cm9sLmluaXRJbm5lck9iamVjdHMgZm9yIHswfVwiLCBmb3VuZFRhZ05hbWUpKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBQYXJzZVNvdXJjZVRhYmxlKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICBsZXQgb2JqUmVmU3RyOiBzdHJpbmcgPSBwYXJzZXIuUmVhZFRvRW5kT2ZDdXJyZW50RWxlbWVudCgpO1xyXG4gICAgbGV0IHNvdXJjZVRhYmxlUmVmZXJlbmNlOiBPYmplY3RSZWZlcmVuY2UgPSBPYmplY3RSZWZlcmVuY2UuRnJvbVhNTChvYmpSZWZTdHIudHJpbSgpKTtcclxuXHJcbiAgICB0aGlzLlNvdXJjZVRhYmxlUmVmZXJlbmNlID0gc291cmNlVGFibGVSZWZlcmVuY2U7XHJcbiAgICAvLyBTa2lwIHRoZSBjbG9zaW5nIDwvcHJvcD4gdGFnXHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBjb250cm9sIGZyb20gdGhlIFhNTFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBwYXJzZUF0dHJpYnV0ZXMocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoXCI+XCIsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcblxyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG5cclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfQ09OVFJPTCkgKyBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbnM6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKS8qJ1wiJyovO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkgPSBpICsgMikge1xyXG4gICAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShpKTtcclxuICAgICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9IHRva2Vucy5nZXRfSXRlbShpICsgMSk7XHJcblxyXG4gICAgICAgIHRoaXMuU2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgICB9XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIDEpOyAvLyB0byBkZWxldGUgXCI+XCIgdG9vXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coXCJpbiBDb250cm9sLkZpbGxOYW1lKCkgb3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHNldCB0aGUgY29udHJvbCBhdHRyaWJ1dGVzIGluIHBhcnNpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFNldEF0dHJpYnV0ZShhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVGFnUHJvY2Vzc2VkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1RZUEU6XHJcbiAgICAgICAgdGhpcy5UeXBlID0gdmFsdWVTdHJbMF0gYXMgTWdDb250cm9sVHlwZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9EQVRBX0NUUkw6XHJcbiAgICAgICAgdGhpcy5fZGF0YUN0cmwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTElOS0VEX1BBUkVOVDpcclxuICAgICAgICB0aGlzLnNldExpbmtlZFBhcmVudElkeChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfQ09OVEFJTkVSOlxyXG4gICAgICAgIHRoaXMuc2V0Q29udGFpbmVyKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JRDpcclxuICAgICAgICB0aGlzLl9pZCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NPTlRST0xfSVNOOlxyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xJc24gPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU19NT0RBTDpcclxuICAgICAgICB0aGlzLl9pc01vZGFsID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0NPTlRST0xfWl9PUkRFUjpcclxuICAgICAgICAvL1RPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0hPUl9BTElHTUVOVF9JU19JTkhFUklURUQ6XHJcbiAgICAgICAgLy9UT0RPIC0gbm90IHRvIHNlcmlhbGl6ZSBbU3RvcnkgMTU0NTQ3XVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlzVGFnUHJvY2Vzc2VkID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzVGFnUHJvY2Vzc2VkO1xyXG5cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gc2V0IHRoZSBpbWFnZSBvbiB0aGUgY29udHJvbCA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZmlsZU5hbWVcIj48L3BhcmFtPlxyXG4gIHNldEltYWdlKCk6IHZvaWQge1xyXG4gICAgbGV0IG5ld1ZhbDogc3RyaW5nID0gdGhpcy5WYWx1ZTtcclxuICAgIGlmIChuZXdWYWwgPT09IG51bGwgfHwgdGhpcy5Jc051bGwpIHtcclxuICAgICAgbmV3VmFsID0gXCJcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IpIHtcclxuICAgICAgLy8gVE9ETyAtIGNoZWNrIGlmIHNob3VsZCBiZSBzdXBwb3J0ZWQgLlxyXG4gICAgICAvLyBDb21tYW5kcy5hZGRBc3luYyhDb21tYW5kVHlwZS5QUk9QX1NFVF9JTUFHRV9EQVRBLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgQmxvYlR5cGUuZ2V0Qnl0ZXMobmV3VmFsKSwgcHJvcC5nZXRWYWx1ZUludCgpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNldEltYWdlV2l0aEZpbGVOYW1lKG5ld1ZhbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRJbWFnZVdpdGhGaWxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZmlsZU5hbWUgPT09IG51bGwpIHtcclxuICAgICAgZmlsZU5hbWUgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgZmlsZU5hbWUgPSBFdmVudHMuVHJhbnNsYXRlTG9naWNhbE5hbWUoZmlsZU5hbWUpO1xyXG5cclxuICAgIGlmICghTWlzYy5Jc1dlYlVybChmaWxlTmFtZSkpXHJcbiAgICAgIGZpbGVOYW1lID0gXCIuL2Fzc2V0cy9pbWFnZXMvXCIgKyBmaWxlTmFtZTtcclxuXHJcbiAgICBpZiAodGhpcy5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1NUWUxFLCB0aGlzLCAwLCBNYWdpY1Byb3BlcnRpZXMuSW1hZ2VGaWxlLCBmaWxlTmFtZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuSW1hZ2UsIGZpbGVOYW1lKTtcclxuICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBmaWxlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2UgbmVlZCB0byBleGVjdXRlIHRoZSBsYXlvdXQgb25seSBpZiB0aGUgcmFkaW8gaXMgbm90IG9uIHRhYmxlLiBmb3IgdGFibGUsIGl0IGlzIGRvbmVcclxuICAgIC8vIGZyb20gTGdSYWRpb0NvbnRhaW5lci5zZXRTcGVjaWZpY0NvbnRyb2xQcm9wZXJ0aWVzKCkuXHJcblxyXG4gICAgLy8gaWYgKHN1cGVyLmlzUmFkaW8oKSAmJiAhdGhpcy5Jc1JlcGVhdGFibGUpIHtcclxuICAgIC8vICAgQ29tbWFuZHMuYWRkQXN5bmMoQ29tbWFuZFR5cGUuRVhFQ1VURV9MQVlPVVQsIHRoaXMsIHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpLCBmYWxzZSk7XHJcbiAgICAvL31cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgY29udGFpbmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbnRhaW5lcklkeFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRDb250YWluZXIoY29udGFpbmVySWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvbnRhaW5lckRpdElkeCA9IGNvbnRhaW5lcklkeDtcclxuICAgIGxldCBjb250YWluZXI6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX2NvbnRhaW5lckRpdElkeCAhPT0gLTEpIHtcclxuICAgICAgY29udGFpbmVyID0gdGhpcy5Gb3JtLmdldEN0cmwodGhpcy5fY29udGFpbmVyRGl0SWR4KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29udGFpbmVyICE9PSBudWxsICYmIGNvbnRhaW5lci5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSkge1xyXG4gICAgICB0aGlzLl9wYXJlbnRUYWJsZSA9IGNvbnRhaW5lcjtcclxuICAgIH1cclxuICAgIHRoaXMuSXNSZXBlYXRhYmxlID0gKHRoaXMuX3BhcmVudFRhYmxlICE9PSBudWxsICYmICFzdXBlci5pc0NvbHVtbkNvbnRyb2woKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBuYW1lIG9mIHRoZSBDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICAvLyBpZiAodGhpcy5pc1JlcGVhdGFibGUoKSkge1xyXG4gICAgLy8gICByZXR1cm4gc3VwZXIuZ2V0TmFtZSh0aGlzLkZvcm0uRGlzcGxheUxpbmUpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHJldHVybiB0aGlzLk5hbWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldExpbmtlZENvbnRyb2xzKCk6IExpc3Q8TWdDb250cm9sQmFzZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xpbmtlZENvbnRyb2xzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoZSBjb250cm9sIGlzIHJlcGVhdGFibGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1JlcGVhdGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5Jc1JlcGVhdGFibGU7XHJcbiAgfVxyXG5cclxuICBJc01vZGFsKCkgOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc01vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm5zIGN1cnJlbnQgZGlzcGxheSBsaW5lIG9mIGNvbnRyb2w8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidXNlTGluZUZvckl0ZW1zXCI+aWYgdHJ1ZSwgdXNlIGN1cnJlbnQgbGluZSBmb3IgdHJlZTwvcGFyYW0+XHJcbiAgZ2V0RGlzcGxheUxpbmUodXNlTGluZUZvckl0ZW1zOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuSXNSZXBlYXRhYmxlIHx8ICh1c2VMaW5lRm9ySXRlbXMgJiYgc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkpIHtcclxuICAgICAgbGluZSA9IHRoaXMuRm9ybS5EaXNwbGF5TGluZTtcclxuICAgIH1cclxuICAgIHJldHVybiBsaW5lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyB2aXNpYmlsaXR5IGNvbnNpZGVyaW5nIHBhcmVudCB2aXNpYmlsaXR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIHRydWUpO1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICByZXN1bHQgPSB0aGlzLmlzUGFyZW50UHJvcFZhbHVlKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgZW5hYmxlZCBjb25zaWRlcmluZyBwYXJlbnQgZW5hYmxlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkFCTEVELCB0cnVlKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBjb250cm9sIGlzIG1vZGlmaWFibGUgYW5kIHRoZSB0YXNrIG1vZGUgaXMgbm90IHF1ZXJ5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc01vZGlmaWFibGUoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IG1vZGlmaWFibGU6IGJvb2xlYW4gPSB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX01PRElGSUFCTEUsIHRydWUpO1xyXG4gICAgbGV0IHRhc2tJblF1ZXJ5OiBib29sZWFuID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWTtcclxuICAgIGxldCBtb2RpZnlJblF1ZXJ5OiBib29sZWFuID0gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NT0RJRllfSU5fUVVFUlksIGZhbHNlKTtcclxuXHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gbW9kaWZpYWJsZSAmJiAobW9kaWZ5SW5RdWVyeSB8fCAhdGFza0luUXVlcnkpO1xyXG4gICAgaWYgKHJlc3VsdCAmJiB0aGlzLl9maWVsZCAhPSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9ICh0aGlzLl9maWVsZC5EYk1vZGlmaWFibGUgfHwgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY3VycmVudCBkYyB2YWx1ZXMgb2YgdGhpcyBkYXRhIGNvbnRyb2wgZnJvbSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERjVmFscygpOiBEY1ZhbHVlcyB7XHJcbiAgICBsZXQgZGF0YVZpZXc6IEd1aURhdGFWaWV3QmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5EYXRhVmlldztcclxuICAgIGxldCBkY3Y6IERjVmFsdWVzID0gbnVsbDtcclxuICAgIGlmICh0aGlzLl9kY1ZhbElkID09PSBFTVBUWV9EQ1JFRikge1xyXG4gICAgICBkY3YgPSAoKHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpID8gZGF0YVZpZXcuZ2V0RW1wdHlDaG9pY2VGb3JWZWN0b3JzKCkgOiBkYXRhVmlldy5nZXRFbXB0eUNob2ljZSgpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fZGNWYWxJZCA+IC0xKSB7XHJcbiAgICAgICAgZGN2ID0gZGF0YVZpZXcuZ2V0RGNWYWx1ZXModGhpcy5fZGNWYWxJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkY3Y7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSBjdXJyZW50IGlzTnVsbCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wncyBjdXJyZW50IGxpbmUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBQcmV2SXNOdWxsIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldFByZXZJc051bGwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGxldCBjdXJyT2JqOiBhbnkgPSB0aGlzLl9wcmV2SXNOdWxscy5nZXRfSXRlbShsaW5lKTtcclxuICAgIGxldCBjdXJyOiBib29sZWFuO1xyXG4gICAgaWYgKGN1cnJPYmogPT09IG51bGwpIHtcclxuICAgICAgY3VyciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9wcmV2SXNOdWxscy5zZXRfSXRlbShsaW5lLCBjdXJyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjdXJyID0gPGJvb2xlYW4+Y3Vyck9iajtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHByZXZJc051bGwgdmFsdWUgb2YgdGhlIHByZXZJc051bGwgYXJyYXlcclxuICAvLy8gICB0aGUgbmV3VmFsdWUgY2FuIGJlIE5VTEwgb3IgYm9vbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWx1ZVwiPnRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0PC9wYXJhbT5cclxuICBzZXRQcmV2SXNOdWxsKG5ld1ZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2SXNOdWxscy5zZXRfSXRlbSh0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpLCBuZXdWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBpY1N0clwiPjwvcGFyYW0+XHJcbiAgc2V0UElDKHBpY1N0cjogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gZm9yIHB1c2ggYnV0dG9uLCB0cmFuc2xhdGUgdGhlIGZvcm1hdC5cclxuICAgIGlmIChzdXBlci5pc0J1dHRvbigpKSB7XHJcbiAgICAgIHRoaXMuX3BpY1N0ciA9IChzdXBlci5Jc0ltYWdlQnV0dG9uKCkgPyBcIlwiICsgWE1MQ29uc3RhbnRzLkZJTEVfTkFNRV9TSVpFLnRvU3RyaW5nKCkgOiBFdmVudHMuVHJhbnNsYXRlKHBpY1N0cikpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX3BpY1N0ciA9IHBpY1N0cjtcclxuICAgIH1cclxuICAgIHRoaXMuX3BpYyA9IG5ldyBQSUModGhpcy5fcGljU3RyLCB0aGlzLkRhdGFUeXBlLCB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuXHJcbiAgICBpZiAodGhpcy5fZGF0YUN0cmwgJiYgdGhpcy5fcGljU3RyLmluZGV4T2YoJ0gnKSA+IC0xKSB7XHJcbiAgICAgIHRoaXMuX3BpYy5zZXRIZWJyZXcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHBpY3R1cmUgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gUElDIHJlZmVyZW5jZTwvcmV0dXJucz5cclxuICBnZXRQSUMoKTogUElDIHtcclxuICAgIHJldHVybiB0aGlzLl9waWM7XHJcbiAgfVxyXG5cclxuXHJcbi8vLyA8cmV0dXJucz4gdGhlIHBhcmVudCBvZiB0aGUgY29udHJvbCBjYW4gYmUgVGFibGVcXFRhYlxcQ2hvaWNlIGNvbnRyb2xcXEZvcm08L3JldHVybnM+XHJcbiAgZ2V0UGFyZW50KCk6IGFueSB7XHJcbiAgICBsZXQgcmV0UGFyZW50OiBhbnkgPSB0aGlzLkZvcm07XHJcbiAgICBpZiAodGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMSkge1xyXG4gICAgICByZXRQYXJlbnQgPSB0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9jb250YWluZXJEaXRJZHgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICByZXRQYXJlbnQgPSB0aGlzLkZvcm0uZ2V0U3ViRm9ybUN0cmwoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldFBhcmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBmaWVsZCBhdHRhY2hlZCB0byB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RmllbGQoKTogR3VpRmllbGRCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9maWVsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBTZXQgdGhlIGZpZWxkIG9mIHRoZSBjb250cm9sIGJ5IHRoZSBmaWVsZCBvYmplY3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmllbGRcIj48L3BhcmFtPlxyXG4gIHNldEZpZWxkKGZpZWxkT3JGaWVsZFN0cklEOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChmaWVsZE9yRmllbGRTdHJJRCA9PT0gbnVsbCB8fCBmaWVsZE9yRmllbGRTdHJJRCBpbnN0YW5jZW9mIEd1aUZpZWxkQmFzZSkge1xyXG4gICAgICB0aGlzLnNldEZpZWxkXzAoZmllbGRPckZpZWxkU3RySUQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEZpZWxkXzEoZmllbGRPckZpZWxkU3RySUQpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc2V0RmllbGRfMChmaWVsZDogR3VpRmllbGRCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maWVsZCA9IGZpZWxkO1xyXG4gICAgaWYgKGZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkLlNldENvbnRyb2wodGhpcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU2V0IHRoZSBmaWVsZCBvZiB0aGUgY29udHJvbCBieSBhIHN0cmluZyBmaWVsZCBpZGVudGlmaWVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlU3RyXCI+dGhlIGZpZWxkIGlkZW50aWZpZXI6IFwicGFyZW50SWQsZmllbGRJZHhcIi9wYXJhbT5cclxuICBwcml2YXRlIHNldEZpZWxkXzEoZmllbGRTdHJJRDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgcmV0dXJuRmllbGQ6IEd1aUZpZWxkQmFzZSA9IHRoaXMuZ2V0RmllbGRCeVZhbHVlU3RyKGZpZWxkU3RySUQpO1xyXG4gICAgaWYgKHJldHVybkZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpZWxkID0gcmV0dXJuRmllbGQ7XHJcbiAgICAgIHRoaXMuX2ZpZWxkLlNldENvbnRyb2wodGhpcyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIENvbnRyb2wuc2V0RmllbGQoKTogaWxsZWdhbCBmaWVsZCBpZGVudGlmaWVyOiBcIiArIGZpZWxkU3RySUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcGljdHVyZSBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JtYXRcIj50aGUgZm9ybWF0IHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJleHBJZFwiPmFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm1hdDwvcGFyYW0+XHJcbiAgc2V0UGljU3RyKGZvcm1hdDogc3RyaW5nLCBleHBJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9waWNTdHIgPSBmb3JtYXQ7XHJcbiAgICBpZiAoZXhwSWQgPiAwKSB7XHJcbiAgICAgIHRoaXMuX3BpY0V4cEV4aXN0cyA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgcmFuZ2Ugb2YgdGhlIGNvbnRyb2wgYW5kIGNsZWFycyB0aGUgbWFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdSYW5nZVwiPmlzIHRoZSBuZXcgcmFuZ2U8L3BhcmFtPlxyXG4gIHNldFJhbmdlKG5ld1JhbmdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JhbmdlID0gbmV3UmFuZ2U7XHJcbiAgICB0aGlzLl92ZCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImV4cElkXCI+YSByZWZlcmVuY2UgdG8gdGhlIGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIHNldFZhbEV4cChleHBJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl92YWxFeHBJZCA9IGV4cElkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBjb3B5IG9mIHZhbGlkYXRpb24gZGV0YWlscyB3aXRoIG5ldyAmIG9sZCB2YWx1ZSB3aXRob3V0IGNoYW5naW5nIHJlYWwgdmFsaWRhdGlvbiBkZXRhaWxzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9sZFZhbFwiPnZhbHVlIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbFwiPnZhbHVlIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICBidWlsZENvcHlQaWN0dXJlKG9sZFZhbDogc3RyaW5nLCBuZXdWYWw6IHN0cmluZyk6IFZhbGlkYXRpb25EZXRhaWxzIHtcclxuICAgIGlmIChzdXBlci5pc1RhYmxlQ29udHJvbCgpIHx8IHN1cGVyLmlzQ29sdW1uQ29udHJvbCgpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBjb3B5VkQ6IFZhbGlkYXRpb25EZXRhaWxzID0gdGhpcy5nZXRDb3B5T2ZWRCgpO1xyXG4gICAgICBjb3B5VkQuc2V0VmFsdWUobmV3VmFsKTtcclxuICAgICAgY29weVZELnNldE9sZFZhbHVlKG9sZFZhbCk7XHJcbiAgICAgIHJldHVybiBjb3B5VkQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgY29weSBvZiB2YWxpZGF0aW9uIGRldGFpbHMsIHdpdGhvdXQgaW5mbHVlbmNlIHRvIHRoZSByZWFsIHZhbGlkYXRpb24gZGV0YWlsc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRDb3B5T2ZWRCgpOiBWYWxpZGF0aW9uRGV0YWlscyB7XHJcbiAgICBsZXQgcmVzdWx0OiBWYWxpZGF0aW9uRGV0YWlscztcclxuICAgIGlmICh0aGlzLl92ZCA9PT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkRldGFpbHModGhpcy5WYWx1ZSwgdGhpcy5WYWx1ZSwgdGhpcy5fcmFuZ2UsIHRoaXMuX3BpYywgdGhpcyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25EZXRhaWxzKHRoaXMuX3ZkKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHJhbmdlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0UmFuZ2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmFuZ2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHJhbmdlZCB2YWx1ZSBmb3IgaW5wdXQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFJhbmdlZFZhbHVlKG5ld1ZhbDogYW55KTogc3RyaW5nIHtcclxuXHJcbiAgICBsZXQgdmQ6IFZhbGlkYXRpb25EZXRhaWxzO1xyXG4gICAgdmQgPSB0aGlzLmJ1aWxkQ29weVBpY3R1cmUodGhpcy5WYWx1ZSwgbmV3VmFsKTtcclxuICAgIHZkLmV2YWx1YXRlKCk7XHJcblxyXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkcyB2YWx1ZSB3YXMgd3JvbmdcclxuICAgIGxldCB2YWw6IGFueSAgPSB2ZC5nZXREaXNwVmFsdWUoKVxyXG4gICAgcmV0dXJuICh2YWwudG9TdHJpbmcoKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdmFsaWRhdGUgdXNlciBpbnB1dFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgdmFsaWRhdGUobmV3VmFsOiBhbnkpOiBzdHJpbmcge1xyXG5cclxuICAgIGxldCB2ZDogVmFsaWRhdGlvbkRldGFpbHM7XHJcbiAgICBsZXQgbW9kaWZpZWQ6IGJvb2xlYW4gPSB0aGlzLk1vZGlmaWVkQnlVc2VyO1xyXG4gICAgdGhpcy5Nb2RpZmllZEJ5VXNlciA9IHRydWU7XHJcbiAgICB2ZCA9IHRoaXMuYnVpbGRDb3B5UGljdHVyZSh0aGlzLlZhbHVlLCBuZXdWYWwpO1xyXG4gICAgdmQuZXZhbHVhdGUoKTtcclxuICAgIHRoaXMuTW9kaWZpZWRCeVVzZXIgPSBtb2RpZmllZDtcclxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBmaWVsZHMgdmFsdWUgd2FzIHdyb25nXHJcbiAgICBpZiAodmQuVmFsaWRhdGlvbkZhaWxlZClcclxuICAgICAgcmV0dXJuIHZkLkVycm9yTWVzc2FnZTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZVN0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEZpZWxkQnlWYWx1ZVN0cih2YWx1ZVN0cjogc3RyaW5nKTogR3VpRmllbGRCYXNlIHtcclxuXHJcbiAgICBsZXQgcmVmUGFyZW50OiBSZWZQYXJhbTxudW1iZXI+ID0gbmV3IFJlZlBhcmFtPG51bWJlcj4odGhpcy5wYXJlbnQpO1xyXG4gICAgbGV0IHJlZlZlZUluZHg6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW08bnVtYmVyPih0aGlzLnZlZUluZHgpO1xyXG4gICAgbGV0IHJldDogR3VpRmllbGRCYXNlID0gPEd1aUZpZWxkQmFzZT50aGlzLmdldEZvcm0oKS5nZXRUYXNrKCkuZ2V0RmllbGRCeVZhbHVlU3RyKHZhbHVlU3RyLCByZWZQYXJlbnQsIHJlZlZlZUluZHgpO1xyXG4gICAgdGhpcy5wYXJlbnQgPSByZWZQYXJlbnQudmFsdWU7XHJcbiAgICB0aGlzLnZlZUluZHggPSByZWZWZWVJbmR4LnZhbHVlO1xyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgaGFzIGNvbnRhaW5lclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBoYXNDb250YWluZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyRGl0SWR4ICE9PSAtMTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXRzIGxheWVyIG9mIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0TGF5ZXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkxheWVyO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGVzIHRoZSBwaWMgdXNpbmcgdGhlIHJlc3VsdCBvZiB0aGUgZm9ybWF0IGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicGljRXhwUmVzdWx0XCI+dGhlIHJlc3VsdCBvZiB0aGUgZm9ybWF0IGV4cHJlc3Npb248L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gUElDIHJlZmVyZW5jZSA8L3JldHVybnM+XHJcbiAgY29tcHV0ZVBJQyhwaWNFeHBSZXN1bHQ6IHN0cmluZyk6IFBJQyB7XHJcbiAgICAvLyBmb3IgcHVzaCBidXR0b24sIHRyYW5zbGF0ZSB0aGUgZm9ybWF0LlxyXG4gICAgbGV0IHBpY1Jlc3VsdDogc3RyaW5nID0gKHBpY0V4cFJlc3VsdCAhPT0gbnVsbCAmJiBzdXBlci5pc0J1dHRvbigpKSA/IEV2ZW50cy5UcmFuc2xhdGUocGljRXhwUmVzdWx0KSA6IHBpY0V4cFJlc3VsdDtcclxuXHJcbiAgICAvLyBjb25zdHJ1Y3QgYSBuZXcgcGljdHVyZSBvbmx5IGlmIHRoZSBleHByZXNzaW9uIHJlc3VsdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgcHJldmlvdXMgcmVzdWx0XHJcbiAgICBpZiAodGhpcy5fcHJldlBpY0V4cFJlc3VsdCA9PT0gbnVsbCB8fCAhKHRoaXMuX3ByZXZQaWNFeHBSZXN1bHQgPT09IHBpY1Jlc3VsdCkpIHtcclxuICAgICAgdGhpcy5fcGljID0gbmV3IFBJQyhwaWNSZXN1bHQsIHRoaXMuRGF0YVR5cGUsIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICB0aGlzLl9wcmV2UGljRXhwUmVzdWx0ID0gcGljUmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3BpYztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0cyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hvaWNlIGluIHRoZSBjaG9pY2UgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmluZGV4IG9mIHRoZSBjdXJyZW50IGNob2ljZTwvcmV0dXJucz5cclxuICBnZXRDdXJyZW50SW5kZXhPZkNob2ljZSgpOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgc2VsZWN0ZWRJbmRpY2U6IG51bWJlcltdID0gWy0xXTtcclxuXHJcbiAgICBsZXQgdmFsOiBzdHJpbmcgPSB0aGlzLlZhbHVlO1xyXG5cclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHZhbCkpIHtcclxuICAgICAgbGV0IGFycmF5Mjogc3RyaW5nW10gPSB2YWwuc3BsaXQoJywnLyonLCcqLyk7XHJcbiAgICAgIHNlbGVjdGVkSW5kaWNlID0gbmV3IEFycmF5PG51bWJlcj4oYXJyYXkyLmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IGlDdHI6IG51bWJlciA9IDA7IGlDdHIgPCBhcnJheTIubGVuZ3RoOyBpQ3RyID0gaUN0ciArIDEpIHtcclxuICAgICAgICBsZXQgbnVtOiBudW1iZXIgPSBOTnVtYmVyLlBhcnNlKGFycmF5MltpQ3RyXSk7XHJcbiAgICAgICAgc2VsZWN0ZWRJbmRpY2VbaUN0cl0gPSAoKG51bSA+PSAwKSA/IG51bSA6IC0xKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdGVkSW5kaWNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgaXMgbXVsdGkgc2VsZWN0aW9uIGxpc3QgYm94IGVsc2UgZmFsc2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIElzTXVsdGlwbGVTZWxlY3Rpb25MaXN0Qm94KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHN1cGVyLmlzTGlzdEJveCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgaWYgY29udHJvbCBwaWN0dXJlIGlzIGRhdGUgb3IgdGltZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc0RhdGVUaW1lUGljdHVyZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9waWMuZ2V0QXR0cigpID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgdGhpcy5fcGljLmdldEF0dHIoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRoaXMgY29udHJvbCBzdXBwb3J0IGRhdGEgc291cmNlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFN1cHBvcnRzRGF0YVNvdXJjZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSB8fCBzdXBlci5pc1RhYkNvbnRyb2woKSB8fCBzdXBlci5pc1JhZGlvKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdGhlIGFycmF5IG9mIGluZGljZSB3aGljaCBjb3JyZXNwb25kcyB0byBhIHNwZWNpZmljIGxpbmsgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWxcIj50aGUgcmVxdWVzdGVkIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzTnVsbFwiPnRydWUgaWYgbWdWYWwgcmVwcmVzZW50cyBhIG51bGwgdmFsdWU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYXJyYXkgb2YgaW5kaWNlPC9yZXR1cm5zPlxyXG4gIGFzeW5jIGdldEluZGV4T2ZDaG9pY2UobWdWYWw6IHN0cmluZywgbGluZTogbnVtYmVyLCBpc051bGw6IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcltdPiB7XHJcblxyXG4gICAgLy8gaWYgdGhlIGNvbnRyb2wgaXMgbGlzdGJveCB3aXRoIHNpbmdsZSBzZWxlY3Rpb24gbW9kZSwgYW5kIHRoZSB2YWx1ZSBpcyBjb21tYSBzZXBhcmF0ZWQsIHRoZW4gd2Ugc2hvdWxkIG5vdCBzcGxpdCB2YWx1ZSBvbiBjb21tYS5cclxuICAgIGxldCBzcGxpdENvbW1hU2VwZXJhdGVkVmFsczogYm9vbGVhbiA9IHRoaXMuSXNNdWx0aXBsZVNlbGVjdGlvbkxpc3RCb3goKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmNvbXB1dGVDaG9pY2UobGluZSk7XHJcblxyXG4gICAgbGV0IGlzVmVjdG9yVmFsdWU6IGJvb2xlYW4gPSB0aGlzLmdldEZpZWxkKCkgIT09IG51bGwgJiYgdGhpcy5nZXRGaWVsZCgpLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjtcclxuICAgIHJldHVybiB0aGlzLmdldERjVmFscygpLmdldEluZGV4T2YobWdWYWwsIGlzVmVjdG9yVmFsdWUsIGlzTnVsbCwgdGhpcy5fY2hvaWNlTGlua3MuZ2V0X0l0ZW0obGluZSksIHRoaXMuX2Nob2ljZU51bXMuZ2V0X0l0ZW0obGluZSksIHNwbGl0Q29tbWFTZXBlcmF0ZWRWYWxzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gcGFyc2VkIGNvbnRlbnQgb2YgUFJPUF9UWVBFX0RJU1BMQVlfTElTVDwvcmV0dXJucz5cclxuICBhc3luYyBnZXREaXNwVmFscyhsaW5lOiBudW1iZXIsIGV4ZWNDb21wdXRlQ2hvaWNlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgaWYgKGV4ZWNDb21wdXRlQ2hvaWNlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZUNob2ljZShsaW5lKTtcclxuICAgIH1cclxuICAgIGlmIChzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fb3JnQ2hvaWNlRGlzcHMuZ2V0X0l0ZW0obGluZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2Nob2ljZURpc3BzLmdldF9JdGVtKGxpbmUpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGVtcHR5Q2hvaWNlKGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHZhbHVlOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KDApO1xyXG4gICAgdGhpcy5fY2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgdmFsdWUpO1xyXG4gICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgdmFsdWUpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGlua3Muc2V0X0l0ZW0obGluZSwgdmFsdWUpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LnNldF9JdGVtKGxpbmUsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wdXRlcyB0aGUgY2hvaWNlcyBvZiBhIFNFTEVDVCBjb250cm9sIHRoYXQgb3JpZ2luYXRlIGZyb20gdGhlIGNvbnRyb2wncyBwcm9wZXJ0aWVzIChpbiBjb250cmFzdCB0b1xyXG4gIC8vLyAgIHRoZSBvbmVzIG9yaWdpbmF0aW5nIGZyb20gdGhlIHVuZGVybGF5aW5nIHRhYmxlIG9mIGEgZGF0YSBjb250cm9sKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBjb21wdXRlQ2hvaWNlKGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGZyb21IZWxwOiBzdHJpbmdbXSA9IFtcclxuICAgICAgXCJcXFxcXFxcXFwiLCBcIlxcXFwtXCIsIFwiXFxcXCxcIlxyXG4gICAgXTtcclxuICAgIGxldCB0b0hlbHA6IHN0cmluZ1tdID0gW1xyXG4gICAgICBcIlhYXCIsIFwiWFhcIiwgXCJYWFwiXHJcbiAgICBdO1xyXG4gICAgbGV0IHRhc2s6IEd1aVRhc2tCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpO1xyXG4gICAgbGV0IGRhdGFWaWV3OiBHdWlEYXRhVmlld0Jhc2UgPSB0YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBkYXRhVmlldy5nZXREY1ZhbHVlcyh0aGlzLl9kY1ZhbElkKTtcclxuICAgIGxldCBjdXJyRGNJZDogbnVtYmVyID0gdGhpcy5nZXREY1JlZigpO1xyXG4gICAgbGV0IGNob2ljZURpc3BTdHI6IHN0cmluZyA9IG51bGw7XHJcbiAgICBsZXQgY2hvaWNlTGlua1N0cjogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBvcHRpb25zVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IHRyaW1Ub0xlbmd0aDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgZGF0YVR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLkRhdGFUeXBlO1xyXG4gICAgbGV0IGlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgLy8gcmUtY29tcHV0ZSB2YWx1ZXMgb25seSBpZiB0aGV5IGFyZSBub3QgdmFsaWQgb3IgdGhlIERDIHdhcyBjaGFuZ2VkIChkdWUgdG9IZWxwIHJlY29tcHV0ZSlcclxuICAgICAgaWYgKHRoaXMuX2Nob2ljZUxpbmtzLmdldF9JdGVtKGxpbmUpID09PSBudWxsIHx8ICh0aGlzLmlzRGF0YUN0cmwoKSAmJiBjdXJyRGNJZCAhPT0gdGhpcy5fZGNWYWxJZCkpIHtcclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IpIHtcclxuICAgICAgICAgIGRhdGFUeXBlID0gdGhpcy5nZXRGaWVsZCgpLmdldENlbGxzVHlwZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZGlzcFZhbHM6IHN0cmluZ1tdID0gZGN2LmdldERpc3BWYWxzKCk7XHJcbiAgICAgICAgbGV0IGRpc3BQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9ESVNQTEFZX0xJU1QpO1xyXG4gICAgICAgIGxldCBsaW5rUHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTEFCRUwpO1xyXG4gICAgICAgIGlmIChkaXNwUHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgY2hvaWNlRGlzcFN0ciA9IGF3YWl0IGRpc3BQcm9wLmdldFZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsaW5rUHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgY2hvaWNlTGlua1N0ciA9IGF3YWl0IGxpbmtQcm9wLmdldFZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjaG9pY2VMaW5rU3RyID09PSBudWxsIHx8IFN0clV0aWwucnRyaW0oY2hvaWNlTGlua1N0cikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBjaG9pY2VMaW5rU3RyID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNob2ljZURpc3BTdHIgPT09IG51bGwgfHwgU3RyVXRpbC5ydHJpbShjaG9pY2VEaXNwU3RyKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIGlmICghdGhpcy5pc0RhdGFDdHJsKCkgfHwgZGlzcFZhbHMgPT09IG51bGwgfHwgZGlzcFZhbHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNob2ljZURpc3BTdHIgPSBjaG9pY2VMaW5rU3RyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNob2ljZURpc3BTdHIgPSAoY2hvaWNlTGlua1N0ciA9IFwiXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaXNJdGVtc0xpc3RUcmVhdGVkQXNEaXNwbGF5TGlzdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNob2ljZURpc3BTdHIgPSBFdmVudHMuVHJhbnNsYXRlKGNob2ljZURpc3BTdHIpO1xyXG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB7XHJcbiAgICAgICAgICBjaG9pY2VMaW5rU3RyID0gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKGNob2ljZUxpbmtTdHIsIFwiXFxcXC1cIiwgXCItXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaGVscFN0cjogc3RyaW5nID0gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKGNob2ljZUxpbmtTdHIsIGZyb21IZWxwLCB0b0hlbHApO1xyXG4gICAgICAgIGxldCBzVG9rOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUoaGVscFN0ciwgXCIsXCIpO1xyXG4gICAgICAgIGxldCBsaW5rU2l6ZTogbnVtYmVyID0gKGhlbHBTdHIgIT09IFwiXCIpID8gc1Rvay5sZW5ndGggOiAwO1xyXG4gICAgICAgIGxldCBoZWxwU3RyRGlzcDogc3RyaW5nID0gU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKGNob2ljZURpc3BTdHIsIGZyb21IZWxwLCB0b0hlbHApO1xyXG4gICAgICAgIHNUb2sgPSBTdHJVdGlsLnRva2VuaXplKGhlbHBTdHJEaXNwLCBcIixcIik7XHJcbiAgICAgICAgbGV0IGRpc3BsYXlTaXplOiBudW1iZXIgPSAoaGVscFN0ckRpc3AgIT09IFwiXCIpID8gc1Rvay5sZW5ndGggOiAwO1xyXG5cclxuICAgICAgICBpZiAobGlua1NpemUgIT09IGRpc3BsYXlTaXplICYmIGRpc3BsYXlTaXplID4gMCkge1xyXG4gICAgICAgICAgY2hvaWNlRGlzcFN0ciA9IGNob2ljZUxpbmtTdHI7XHJcbiAgICAgICAgICBpc0l0ZW1zTGlzdFRyZWF0ZWRBc0Rpc3BsYXlMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNpemU6IG51bWJlciA9IGxpbmtTaXplO1xyXG4gICAgICAgIGxldCBjaG9pY2VMaW5rOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KHNpemUpO1xyXG4gICAgICAgIHRoaXMuX2Nob2ljZUxpbmtzLnNldF9JdGVtKGxpbmUsIGNob2ljZUxpbmspO1xyXG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8IGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHwgZGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSkge1xyXG4gICAgICAgICAgdGhpcy5fY2hvaWNlTnVtcy5zZXRfSXRlbShsaW5lLCBuZXcgQXJyYXk8TlVNX1RZUEU+KHNpemUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFkZCBkaXNwbGF5IHZhbHVlc1xyXG4gICAgICAgIGxldCBvcmdDaG9pY2VEaXNwOiBzdHJpbmdbXSA9IENob2ljZVV0aWxzLkdldERpc3BsYXlMaXN0RnJvbVN0cmluZyhjaG9pY2VEaXNwU3RyLCBmYWxzZSwgdHJ1ZSwgIWlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3QpO1xyXG4gICAgICAgIHRoaXMuX29yZ0Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIG9yZ0Nob2ljZURpc3ApO1xyXG4gICAgICAgIGxldCBjaG9pY2VEaXNwOiBzdHJpbmdbXSA9IENob2ljZVV0aWxzLkdldERpc3BsYXlMaXN0RnJvbVN0cmluZyhjaG9pY2VEaXNwU3RyLCBzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSB8fCBzdXBlci5pc1RhYkNvbnRyb2woKSwgdHJ1ZSwgIWlzSXRlbXNMaXN0VHJlYXRlZEFzRGlzcGxheUxpc3QpO1xyXG4gICAgICAgIHRoaXMuX2Nob2ljZURpc3BzLnNldF9JdGVtKGxpbmUsIGNob2ljZURpc3ApO1xyXG4gICAgICAgIGlmICh0aGlzLmdldEZpZWxkKCkgIT09IG51bGwpIHtcclxuICAgICAgICAgIHRyaW1Ub0xlbmd0aCA9IHRoaXMuZ2V0RmllbGQoKS5nZXRTaXplKCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgbGV0IHRva2VuOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICAgIGxldCBoZWxwVG9rZW46IHN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgbGV0IHRva2VuQnVmZmVyOiBTdHJpbmdCdWlsZGVyO1xyXG4gICAgICAgIC8vIEFkZCBsaW5rIHZhbHVlcy5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwLCBjdXJyUG9zOiBudW1iZXIgPSAwLCBuZXh0UG9zID0gMDsgaSA8IHNpemUgJiYgb3B0aW9uc1ZhbGlkOyBpKyspIHtcclxuICAgICAgICAgIG5leHRQb3MgPSBjdXJyUG9zO1xyXG4gICAgICAgICAgbmV4dFBvcyA9IGhlbHBTdHIuaW5kZXhPZignLCcsIG5leHRQb3MpO1xyXG5cclxuICAgICAgICAgIGlmIChuZXh0UG9zID09PSBjdXJyUG9zKVxyXG4gICAgICAgICAgICB0b2tlbiA9IGhlbHBUb2tlbiA9IFwiXCI7XHJcbiAgICAgICAgICBlbHNlIGlmIChuZXh0UG9zID09PSAtMSkge1xyXG4gICAgICAgICAgICB0b2tlbiA9IGNob2ljZUxpbmtTdHIuc3Vic3RyKGN1cnJQb3MpO1xyXG4gICAgICAgICAgICBoZWxwVG9rZW4gPSBoZWxwU3RyLnN1YnN0cihjdXJyUG9zKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0b2tlbiA9IGNob2ljZUxpbmtTdHIuc3Vic3RyKGN1cnJQb3MsIChuZXh0UG9zKSAtIChjdXJyUG9zKSk7XHJcbiAgICAgICAgICAgIGhlbHBUb2tlbiA9IGhlbHBTdHIuc3Vic3RyKGN1cnJQb3MsIChuZXh0UG9zKSAtIChjdXJyUG9zKSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY3VyclBvcyA9IG5leHRQb3MgKyAxO1xyXG5cclxuICAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBOlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTUVNTzpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREU6XHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUjpcclxuICAgICAgICAgICAgICB0b2tlbiA9IFN0clV0aWwubHRyaW0odG9rZW4pO1xyXG4gICAgICAgICAgICAgIGhlbHBUb2tlbiA9IFN0clV0aWwubHRyaW0oaGVscFRva2VuKTtcclxuICAgICAgICAgICAgICBpZiAoaGVscFRva2VuLmluZGV4T2YoJ1xcXFwnKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0b2tlblBvczogbnVtYmVyID0gMDsgdG9rZW5Qb3MgPCBoZWxwVG9rZW4ubGVuZ3RoOyB0b2tlblBvcysrKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoaGVscFRva2VuW3Rva2VuUG9zXSAhPT0gJ1xcXFwnKVxyXG4gICAgICAgICAgICAgICAgICAgIHRva2VuQnVmZmVyLkFwcGVuZCh0b2tlblt0b2tlblBvc10pO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlblBvcyA9PT0gaGVscFRva2VuLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5CdWZmZXIuQXBwZW5kKCcgJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbkJ1ZmZlci5Ub1N0cmluZygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0b2tlbiA9IFN0clV0aWwubWFrZVByaW50YWJsZVRva2Vucyh0b2tlbiwgU0VRXzJfU1RSKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGlvbkN0cmwoKSB8fCB0aGlzLmlzVGFiQ29udHJvbCgpKVxyXG4gICAgICAgICAgICAgICAgdG9rZW4gPSBDaG9pY2VVdGlscy5SZW1vdmVBY2NsQ2hhckZyb21PcHRpb25zKG5ldyBTdHJpbmdCdWlsZGVyKHRva2VuKSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGNob2ljZUxpbmsgc2l6ZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIHNpemUgb2YgdGhlIGZpZWxkLCBzbyB0cmltIGl0LlxyXG4gICAgICAgICAgICAgIGlmIChVdGlsU3RyQnl0ZU1vZGUuaXNMb2NhbGVEZWZMYW5nREJDUygpICYmIGRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkFMUEhBKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHJpbVRvTGVuZ3RoICE9PSAtMSAmJiBVdGlsU3RyQnl0ZU1vZGUubGVuQih0b2tlbikgPiB0cmltVG9MZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgIHRva2VuID0gVXRpbFN0ckJ5dGVNb2RlLmxlZnRCKHRva2VuLCB0cmltVG9MZW5ndGgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0cmltVG9MZW5ndGggIT09IC0xICYmIHRva2VuLmxlbmd0aCA+IHRyaW1Ub0xlbmd0aClcclxuICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHIoMCwgdHJpbVRvTGVuZ3RoKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGNob2ljZUxpbmtbaV0gPSB0b2tlbjtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDOlxyXG4gICAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgICAgICAgbGV0IHBpY3R1cmU6IFBJQyA9IFBJQy5idWlsZFBpY3R1cmUoZGF0YVR5cGUsIHRva2VuLCB0YXNrLmdldENvbXBJZHgoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIG9wdGlvbnNWYWxpZCA9IHRoaXMub3B0aW9uSXNWYWxpZCh0b2tlbik7XHJcbiAgICAgICAgICAgICAgY2hvaWNlTGlua1tpXSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UuZGlzcDJtZyh0b2tlbi50cmltKCksIGNob2ljZUxpbmtTdHIsIHBpY3R1cmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmdldENvbXBJZHgoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOKTtcclxuICAgICAgICAgICAgICAoKHRoaXMuX2Nob2ljZU51bXMuZ2V0X0l0ZW0obGluZSkpKVtpXSA9IG5ldyBOVU1fVFlQRShjaG9pY2VMaW5rW2ldKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgICAgICAgIGNob2ljZUxpbmtbaV0gPSAoMSAtIGkpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFvcHRpb25zVmFsaWQpXHJcbiAgICAgICAgICB0aGlzLmVtcHR5Q2hvaWNlKGxpbmUpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICBvcHRpb25zVmFsaWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmVtcHR5Q2hvaWNlKGxpbmUpO1xyXG4gICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiezB9IDogezF9XCIsIGV4LkdldFR5cGUoKSwgZXguTWVzc2FnZSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleDtcclxuICAgIH1cclxuICAgIHRoaXMuX2hhc1ZhbGlkSXRtQW5kRGlzcFZhbCA9IG9wdGlvbnNWYWxpZDtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgdG9wbW9zdCBmb3JtIG9mIHRoZSBzdWJmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFRvcE1vc3RGb3JtKCk6IE1nRm9ybUJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybSgpLmdldFRvcE1vc3RGb3JtKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVwbGFjZSB0aGUgdXJsIG9uIGJyb3dzZXIgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRVcmwoKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgMCwgdGhpcy5WYWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgaW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gd2l0aG91dCBjaGFuZ2luZyB0aGUgY29udHJvbCB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkaXNwVmFsXCI+dGhlIGRpc3BsYXllZCB2YWx1ZSB3aXRoIHRoZSBtYXNraW5nIGNoYXJhY3RlcnM8L3BhcmFtPlxyXG4gIGFzeW5jIGdldE1nVmFsdWUoZGlzcFZhbDogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCBtZ1ZhbDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICBpZiAoc3VwZXIuaXNDaGVja0JveCgpKSB7XHJcbiAgICAgIG1nVmFsID0gZGlzcFZhbCA/IFwiMVwiIDogXCIwXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHN1cGVyLmlzU2VsZWN0aW9uQ3RybCgpIHx8IHN1cGVyLmlzVGFiQ29udHJvbCgpIHx8IHN1cGVyLmlzUmFkaW8oKSkge1xyXG5cclxuICAgICAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuXHJcbiAgICAgICAgaWYgKGxpbmUgPCAwKVxyXG4gICAgICAgICAgbGluZSA9IDA7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcFZhbCA9PT0gXCJudW1iZXJcIilcclxuICAgICAgICAgIGRpc3BWYWwgPSBkaXNwVmFsLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3BWYWwpKVxyXG4gICAgICAgICAgZGlzcFZhbCA9IGRpc3BWYWwuam9pbignLCcpLnRvU3RyaW5nKCk7XHJcblxyXG5cclxuICAgICAgICBpZiAoZGlzcFZhbCA9PT0gXCJcIikge1xyXG4gICAgICAgICAgbWdWYWwgPSBkaXNwVmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIG1nVmFsID0gYXdhaXQgdGhpcy5nZXRMaW5rVmFsdWUoZGlzcFZhbCwgbGluZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtZ1ZhbCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IGlzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gVGhlIGRhdGEgY29udHJvbCB3aWxsIG5ldmVyIHJldHVybiBhbiBpbGxlZ2FsIHZhbHVlIGFzIGEgcmVzdWx0IG9mIGEgdXNlciBzZWxlY3Rpb25cclxuICAgICAgICAgIC8vIGJ1dCBhcyBhIHJlc3VsdCBvZiBhbiBpbml0IGV4cHJlc3Npb24sIHVwZGF0ZSBvcGVyYXRpb24gb3IgdmFsdWVzIG9mIGRhdGEgaW5cclxuICAgICAgICAgIC8vIHRoZSByZWNvcmQuIFRoZXJlZm9yZSwgdGhlIHNhbWUgaWxsZWdhbCB2YWx1ZSBzaG91bGQgYmUgdGFrZW4gZnJvbSBpdHMgc291cmNlLFxyXG4gICAgICAgICAgLy8gd2hpY2ggaXMgYSBmaWVsZCBvciBhbiBleHByZXNzaW9uLiAoRWh1ZCAxOS1qdW4tMjAwMSlcclxuICAgICAgICAgIGxldCByZWZNZ1ZhbDogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbTxzdHJpbmc+KG1nVmFsKTtcclxuICAgICAgICAgIGxldCByZWZJc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+ID0gbmV3IFJlZlBhcmFtPGJvb2xlYW4+KGlzTnVsbCk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG1nVmFsID0gcmVmTWdWYWwudmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBibG9iQ29udGVudFR5cGU6IHN0cmluZyA9ICh0aGlzLl9maWVsZCAhPT0gbnVsbCkgPyB0aGlzLl9maWVsZC5nZXRDb250ZW50VHlwZSgpIDogQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOS05PV047XHJcbiAgICAgICAgbWdWYWwgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLmRpc3AybWcoZGlzcFZhbCwgdGhpcy5fcmFuZ2UsIHRoaXMuX3BpYywgdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLmdldENvbXBJZHgoKSwgYmxvYkNvbnRlbnRUeXBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1nVmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgZm9yIGluZGljZSBwYXNzZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZWxlY3RlZEluZGljZVwiPmNvbW1hIHNlcGFyYXRlZCB2YWx1ZXM8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5jb21tYSBzZXBhcmF0ZWQgdmFsdWVzPC9yZXR1cm5zPlxyXG4gIGFzeW5jIGdldExpbmtWYWx1ZShzZWxlY3RlZEluZGljZTogc3RyaW5nLCBsaW5lOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBOU3RyaW5nLkVtcHR5O1xyXG4gICAgbGV0IHRlbXA6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmNvbXB1dGVDaG9pY2UobGluZSk7XHJcblxyXG4gICAgbGV0IGNob2ljZUxpbms6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGlua3MuZ2V0X0l0ZW0obGluZSk7XHJcblxyXG4gICAgaWYgKGNob2ljZUxpbmsgIT09IG51bGwpIHtcclxuICAgICAgLy8gY29tcHV0ZSBzaXplIG9mIGRpc3BsYXllZCB2YWx1ZXMgYXJyYXlcclxuICAgICAgc2l6ZSA9IGNob2ljZUxpbmsubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgbGV0IGxpbmtJbmRpY2U6IG51bWJlcltdID0gdGhpcy5nZXRMaW5rSWR4RnJvbUxheWVyKE1pc2MuR2V0SW50QXJyYXkoc2VsZWN0ZWRJbmRpY2UpKTtcclxuXHJcbiAgICBsZXQgYXJyYXkyOiBudW1iZXJbXSA9IGxpbmtJbmRpY2U7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJyYXkyLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBpZHg6IG51bWJlciA9IGFycmF5MltpXTtcclxuICAgICAgaWYgKGlkeCA+PSBzaXplKSB7XHJcbiAgICAgICAgbGV0IGRjVmFsczogRGNWYWx1ZXMgPSB0aGlzLmdldERjVmFscygpO1xyXG4gICAgICAgIHRlbXAucHVzaChkY1ZhbHMuZ2V0TGlua1ZhbHVlKGlkeCAtIHNpemUpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgY2hvaWNlTGluay5sZW5ndGgpIHtcclxuICAgICAgICAgIHRlbXAucHVzaChjaG9pY2VMaW5rW2lkeF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRlbXAucHVzaChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICBsZXQgdmVjdG9yVHlwZTogVmVjdG9yVHlwZSA9IG5ldyBWZWN0b3JUeXBlKHRoaXMuZ2V0RmllbGQoKSk7XHJcbiAgICAgIGZvciAobGV0IGluZHg6IG51bWJlciA9IDA7IGluZHggPCB0ZW1wLmxlbmd0aDsgaW5keCA9IGluZHggKyAxKSB7XHJcbiAgICAgICAgdmVjdG9yVHlwZS5zZXRWZWNDZWxsKGluZHggKyAxLCB0ZW1wLmdldF9JdGVtKGluZHgpLCB0ZW1wLmdldF9JdGVtKGluZHgpID09PSBudWxsKTtcclxuICAgICAgfVxyXG4gICAgICByZXN1bHQgPSB2ZWN0b3JUeXBlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHJlc3VsdCA9IHRlbXAuam9pbihcIixcIik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGVtcC5nZXRfSXRlbSgwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGV4dCBvbiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRUZXh0KCk6IHZvaWQge1xyXG4gICAgbGV0IGRpc3BsYXlMaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgbGV0IG1sc1RyYW5zbGF0ZWRWYWx1ZTogYW55ID0gdGhpcy5WYWx1ZTtcclxuICAgIGlmIChzdXBlci5pc0J1dHRvbigpKSB7XHJcbiAgICAgIG1sc1RyYW5zbGF0ZWRWYWx1ZSA9IEV2ZW50cy5UcmFuc2xhdGUodGhpcy5WYWx1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc1RleHRDb250cm9sKCkgfHwgdGhpcy5pc0J1dHRvbigpKVxyXG4gICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgZGlzcGxheUxpbmUsIG1sc1RyYW5zbGF0ZWRWYWx1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgZGlzcGxheUxpbmUsIC8qXCJpbm5lckhUTUxcIiovIEh0bWxQcm9wZXJ0aWVzLlRleHQsIG1sc1RyYW5zbGF0ZWRWYWx1ZSk7XHJcblxyXG4gICAgLy8gQ29tbWFuZHMuYWRkQXN5bmMoQ29tbWFuZFR5cGUuUFJPUF9TRVRfVEVYVCwgdGhpcywgZGlzcGxheUxpbmUsIG1sc1RyYW5zbGF0ZWRWYWx1ZSwgMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcmFkaW8gYnV0dG9uIGNoZWNrZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmFkaW9MaW5lXCI+aXMgdGhlIGxpbmUgb2YgdGhlIHJhZGlvIHRoYXQgbmVlZCB0byBiZSBTZXQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgc2V0UmFkaW9DaGVja2VkKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuXHJcbiAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIGluZGV4KTtcclxuICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcblxyXG4gICAgLy8gc2V0IGNvbnRyb2wgdG8gZm9jdXNcclxuICAgIGlmIChpbmRleCAhPT0gR3VpQ29uc3RhbnRzLkRFRkFVTFRfVkFMVUVfSU5UKSB7XHJcbiAgICAgIHRoaXMuc2V0Q29udHJvbFRvRm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldENvbnRyb2xUb0ZvY3VzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ2V0RmllbGQoKSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmdldEZpZWxkKCkuQ29udHJvbFRvRm9jdXMgPSB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBDaGVja0JveCBWYWx1ZSB0byB0aGUgY2hlY2sgYm94IGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1nVmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc2V0Q2hlY2tCb3hWYWx1ZShsaW5lOiBudW1iZXIsIG1nVmFsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBjaGVja1N0YXRlOiBib29sZWFuID0gRGlzcGxheUNvbnZlcnRvci50b0Jvb2xlYW4obWdWYWwpO1xyXG4gICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIGxpbmUsIGNoZWNrU3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlQ2hhbmdlZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hBbmRTZXRJdGVtTGlzdEJ5RGF0YVNvdXJjZShsaW5lOiBudW1iZXIsIHZhbHVlQ2hhbmdlZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHRoaXMuU3VwcG9ydHNEYXRhU291cmNlKCkpIHtcclxuICAgICAgbGV0IGN1cnJEY0lkOiBudW1iZXIgPSB0aGlzLmdldERjUmVmKCk7XHJcblxyXG4gICAgICAvLyBJZiB0aGUgcmFuZ2Ugd2FzIGNoYW5nZWQgd2UgaGF2ZSB0byByZWNhbGN1bGF0ZSB0aGUgY29ycmVjdCBjaG9pY2Ugb3B0aW9uXHJcbiAgICAgIGlmICh0aGlzLl9yYW5nZUNoYW5nZWQpIHtcclxuICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3JhbmdlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5pc0RhdGFDdHJsKCkgJiYgY3VyckRjSWQgIT09IHRoaXMuX2RjVmFsSWQpIHtcclxuXHJcbiAgICAgICAgLy8gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6IHNlcnZlciB3cml0ZXMgb3B0aW9uTGlzdCB0byB0aGUgSFRNTC4gTm8gbmVlZCB0byBhcHBseVxyXG4gICAgICAgIC8vIHRoZW1cclxuICAgICAgICAvLyBmb3IgdGhlIGZpcnN0IHRpbWUuXHJcbiAgICAgICAgLy8gZm9yY2UgdXBkYXRlIG9mIHRoZSB2YWx1ZSB3aGVuZXZlciB0aGUgc2V0IG9mIG9wdGlvbnMgaXMgcmVwbGFjZWRcclxuICAgICAgICAvLyBpZiAoZm9ybS5mb3JtUmVmcmVzaGVkKCkgfHwgZm9yY2VSZWZyZXNoKVxyXG5cclxuICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1zTGlzdChsaW5lLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnNldERjUmVmKHRoaXMuX2RjVmFsSWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWVDaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgZGNyZWYgZm9yIHRoZSBjdXJyZW50IHRhYmxlIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGNJZFwiPnRoZSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBkY3ZhbHM8L3BhcmFtPlxyXG4gIHNldERjUmVmKGRjSWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGNUYWJsZVJlZnMuc2V0X0l0ZW0odGhpcy5nZXREY0xpbmVOdW0oKSwgZGNJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVwbGFjZSB0aGUgaW1hZ2UgbGlzdCBvZiBhbiBidXR0b24gY29udHJvbCB3aXRoIHRoZSBpbWFnZSBhdCB0aGUgZ2l2ZW4gVVJMXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRJbWFnZUxpc3QodXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVXBkYXRlIGJvb2xlYW4gcHJvcGVydHkoZXg6dmlzaWJsZVxcZW5hYmxlKSBvZiBjb250cm9sIGFuZCBpdCdzIGNoaWxkcmVuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnByb3BlcnR5IGlkIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb21tYW5kVHlwZVwiPmNvbW1hbmQgdHlwZSB0aGF0IGJlbG9uZyB0byB0aGUgcHJvcCBpZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidXBkYXRlVGhpc1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgdXBkYXRlUHJvcGVydHlMb2dpY05lc3RpbmcocHJvcElkOiBudW1iZXIsIGNvbW1hbmRUeXBlOiBDb21tYW5kVHlwZSwgdmFsOiBib29sZWFuLCB1cGRhdGVUaGlzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiAodmFsICYmIHRoaXMuaGF2ZVRvQ2hlY2tQYXJlbnRWYWx1ZSgpKSB7XHJcbiAgICAvLyAgdmFsID0gdGhpcy5pc1BhcmVudFByb3BWYWx1ZShwcm9wSWQpO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKHVwZGF0ZVRoaXMpIHtcclxuXHJcbiAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRUeXBlID09PSBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFID8gSHRtbFByb3BlcnRpZXMuVmlzaWJsZSA6IEh0bWxQcm9wZXJ0aWVzLkVuYWJsZWQsIHZhbCk7XHJcblxyXG4gICAgfVxyXG4gICAgLy8gdG9kbzogc2hvdWxkIGdvIG92ZXIgb25seSBsaW5rZWQgY29udHJvbHMgLSBub3QgY2hpbGRyZW4gY29udHJvbHMsIG5lZWQgdG8gY2hlY2sgd2l0aCBQTSB0aGlzIGJlaGF2aW9yXHJcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZCwgY29tbWFuZFR5cGUsIHZhbCk7XHJcbiAgfVxyXG5cclxuICBTZXRFbmFibGVkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuRW5hYmxlZCwgdmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBVcGRhdGVzIHZpc2liaWxpdHkgb2YgY29udHJvbHMgbGlua2VkIHRvIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb21tYW5kVHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj48L3BhcmFtPlxyXG4gIGFzeW5jIHVwZGF0ZUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZDogbnVtYmVyLCBjb21tYW5kVHlwZTogQ29tbWFuZFR5cGUsIHZhbDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICghc3VwZXIuaXNUYWJsZUNvbnRyb2woKSkge1xyXG4gICAgICAvLyBpbiB0YWJsZSBhbGwgY2hpbGRyZW4gYXJlIGNvbnRhaW5lZCxcclxuICAgICAgLy8gdGFibGUncyB2aXNpYmlsaXR5XFxlbmFibGUgd2lsbCBhZmZlY3QgdGhlbVxyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2xpbmtlZENvbnRyb2xzLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcblxyXG4gICAgICAgIGxldCBjaGlsZDogTWdDb250cm9sQmFzZSA9IHRoaXMuX2xpbmtlZENvbnRyb2xzLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIC8vIERlZmVjdCAxMTcyOTQuIERvIG5vdCBjb250aW51ZSBmb3IgdGhlIGZpcnN0IHRpbWUuIEl0IGFmZmVjdHMgb24gdGhlIHBsYWNlbWVudC5cclxuICAgICAgICBpZiAoY2hpbGQuSXNGaXJzdFJlZnJlc2hPZlByb3BzKCkpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgbGV0IGNoaWxkVmFsdWU6IGJvb2xlYW4gPSAoY2hpbGQuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkLCB0cnVlKSk7XHJcblxyXG4gICAgICAgIGNoaWxkVmFsdWUgPSBjaGlsZFZhbHVlICYmIHZhbDtcclxuXHJcbiAgICAgICAgbGV0IGNoaWxkT25DdXJyZW50TGF5ZXI6IGJvb2xlYW4gPSB0aGlzLmlzQ2hpbGRPbkN1cnJlbnRMYXllcihjaGlsZCk7XHJcblxyXG4gICAgICAgIGlmIChjb21tYW5kVHlwZSA9PT0gQ29tbWFuZFR5cGUuUFJPUF9TRVRfVklTSUJMRSkge1xyXG5cclxuICAgICAgICAgIGlmIChjaGlsZFZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNoaWxkVmFsdWUgPSBjaGlsZE9uQ3VycmVudExheWVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXdhaXQgY2hpbGQudXBkYXRlQ2hpbGRyZW5Qcm9wVmFsdWUocHJvcElkLCBjb21tYW5kVHlwZSwgY2hpbGRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChzdXBlci5pc1N1YmZvcm0oKSkge1xyXG4gICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN1YmZvcm1DaGlsZHJlblByb3BWYWx1ZShwcm9wSWQsIGNvbW1hbmRUeXBlLCB2YWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgdGhpcyBjb250cm9sIGlzIGRlc2NlbmRhbnQgb2Ygc3BlY2lmaWVkIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNEZXNjZW5kZW50T2ZDb250cm9sKGNvbnRyb2w6IEd1aU1nQ29udHJvbCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzQ29udGFpbmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKGNvbnRyb2wgIT09IG51bGwpIHtcclxuICAgICAgbGV0IHBhcmVudDogYW55ID0gdGhpcy5nZXRQYXJlbnQoKTtcclxuICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1nQ29udHJvbEJhc2UpIHtcclxuICAgICAgICBpZiAocGFyZW50ID09PSBjb250cm9sKSB7XHJcbiAgICAgICAgICBpc0NvbnRhaW5lZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gSWYgY3VycmVudCBjb250cm9sIGJlbG9uZ3MgdG8gdGFibGUsIHRoZW4gaXQgaXMgYWxzbyBhIGRlc2NlbmRhbnQgb2YgdGhlIGNvbHVtbiBjb250cm9sIHRvXHJcbiAgICAgICAgICAvLyB3aGljaCBpdCBiZWxvbmdzLiBBY2NvcmRpbmcgdG8gb3VyIGhpZXJhcmNoeSwgdGhlIGNvbnRyb2wgaXMgZGlyZWN0IGRlc2NlbmRhbnQgb2YgdGFibGVcclxuICAgICAgICAgIC8vIGNvbnRyb2w7IGhlbmNlLCB3ZSBuZWVkIHRvIGhhbmRsZSBjb2x1bW4gY29udHJvbFxyXG5cclxuICAgICAgICAgIGxldCBwYXJlbnRDb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gKChwYXJlbnQgaW5zdGFuY2VvZiBNZ0NvbnRyb2xCYXNlKSA/IDxNZ0NvbnRyb2xCYXNlPnBhcmVudCA6IG51bGwpO1xyXG4gICAgICAgICAgaWYgKGNvbnRyb2wuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OICYmIHBhcmVudENvbnRyb2wgIT09IG51bGwgJiYgcGFyZW50Q29udHJvbC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRSAmJiBjb250cm9sLkxheWVyID09PSB0aGlzLkxheWVyKVxyXG4gICAgICAgICAgICBpc0NvbnRhaW5lZCA9IHRydWU7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGlzQ29udGFpbmVkID0gKCg8TWdDb250cm9sQmFzZT5wYXJlbnQpLmlzRGVzY2VuZGVudE9mQ29udHJvbChjb250cm9sKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNDb250YWluZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgVXBkYXRlcyB2aXNpYmlsaXR5IG9yIGVuYWJsZSBwcm9wZXJ0eSBvZiBzdWJmb3JtIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPklkIG9mIHZpc2liaWxpdHkgb3IgZW5hYmxlIHByb3BlcnR5PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbW1hbmRUeXBlXCI+dHlwZSBvZiB0aGUgR1VJIGNvbW1hbmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dmFsdWUgZm9yIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgdXBkYXRlU3ViZm9ybUNoaWxkcmVuUHJvcFZhbHVlKHByb3BJZDogbnVtYmVyLCBjb21tYW5kVHlwZTogQ29tbWFuZFR5cGUsIHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrcyBjaGlsZCdzIGxheWVyIGlzIGVxdWFsIHRvIGN1cnJlbnQgbGF5ZXIgb2YgdGhlIHBhcmVudCwgcmVsYXZhbnQgZm9yIHRhYiBjb250cm9sIGZvciBhbGwgb3RoZXJcclxuICAvLy8gICBjb250cm9scyByZXR1cm5zIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hpbGRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBwYXJlbnQgaXMgbm90IHRhYiBjb250cm9sIG9yIHBhcmVudCBpcyB0YWIgY29udHJvbCB3aXRoIHNhbWUgbGF5ZXI8L3JldHVybnM+XHJcbiAgaXNDaGlsZE9uQ3VycmVudExheWVyKGNoaWxkOiBNZ0NvbnRyb2xCYXNlKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8vIGNoZWNrIHRoYXQgdGhlIGNvbnRyb2wgaGFzIHNhbWUgbGF5ZXIgdGhhdCBpcyBjdXJyZW50bHkgc2V0IG9uIGl0J3MgcGFyZW50IHRhYiBjb250cm9sXHJcbiAgICBpZiAoc3VwZXIuaXNDaG9pY2VDb250cm9sKCkpIHtcclxuICAgICAgbGV0IHBhcmVudExheWVyOiBudW1iZXIgPSAwO1xyXG4gICAgICBpZiAodGhpcy5WYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgIHBhcmVudExheWVyID0gdGhpcy5nZXRDdXJyZW50TGlua0lkeCgpICsgMTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgbGF5ZXI6IG51bWJlciA9IGNoaWxkLmdldExheWVyKCk7XHJcbiAgICAgIGlmIChwYXJlbnRMYXllciAhPT0gbGF5ZXIgJiYgbGF5ZXIgPiAwKSB7XHJcbiAgICAgICAgLy8gc29ucyBvZiBsYXllciAwIGRpc3BsYXllZCBhbHdheXNcclxuICAgICAgICByZXQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gY3VycmVudCBsaW5rIElkeCBvZiBjaG9pY2UgY29udHJvbHMsIG9yIHplcm8gZm9yIG90aGVyc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDdXJyZW50TGlua0lkeCgpOiBudW1iZXIge1xyXG4gICAgbGV0IGN1cnJMaW5rSWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSkge1xyXG4gICAgICBsZXQgY3VycmVudExheWVyczogbnVtYmVyW10gPSB0aGlzLmdldEN1cnJlbnRJbmRleE9mQ2hvaWNlKCk7XHJcbiAgICAgIGxldCBjdXJyTGlua0luZGljZTogbnVtYmVyW10gPSB0aGlzLmdldExpbmtJZHhGcm9tTGF5ZXIoY3VycmVudExheWVycyk7XHJcbiAgICAgIGN1cnJMaW5rSWR4ID0gY3VyckxpbmtJbmRpY2VbMF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VyckxpbmtJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldHMgbGF5ZXIgZnJvbSB0aGUgc2VsZWN0ZWQgaW5kaWNlIHBhc3NlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmtJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5hcnJheSBvZiBsYXllciB2YWx1ZXMuPC9yZXR1cm5zPlxyXG4gIGdldExheWVyRnJvbUxpbmtJZHgoaW5kaWNlOiBudW1iZXJbXSk6IG51bWJlcltdIHtcclxuICAgIGxldCBsYXllcnM6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4oaW5kaWNlLmxlbmd0aCk7XHJcblxyXG4gICAgZm9yIChsZXQgaUN0cjogbnVtYmVyID0gMDsgaUN0ciA8IGluZGljZS5sZW5ndGg7IGlDdHIgPSBpQ3RyICsgMSkge1xyXG4gICAgICBsZXQgaWR4OiBudW1iZXIgPSBpbmRpY2VbaUN0cl07XHJcbiAgICAgIC8vIEJ5IGRlZmF1bHQsIGxheWVyID0gbGlua0lkeCB1bmxlc3MgaXQgaXMgYSBUYWIgY29udHJvbFxyXG5cclxuICAgICAgbGF5ZXJzW2lDdHJdID0gaWR4O1xyXG5cclxuICAgICAgaWYgKHN1cGVyLmlzVGFiQ29udHJvbCgpICYmIGlkeCA+PSAwKSB7XHJcbiAgICAgICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpO1xyXG4gICAgICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICAgICAgbGluZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBsYXllckxpc3Q6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LmdldF9JdGVtKGxpbmUpO1xyXG4gICAgICAgIGlmIChsYXllckxpc3QgIT09IG51bGwgJiYgbGF5ZXJMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxheWVyc1tpQ3RyXSA9IGxheWVyTGlzdC5pbmRleE9mKChpZHggKyAxKS50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsYXllcnM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgdGhlIHNlbGVjdGVkIGluZGljZSBmb3Igc2VsZWN0ZWQgdmFsdWVzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGF5ZXJzXCI+YW4gYXJyYXkgb2YgY3VycmVudCBsYXllcnMgdGFiIGNvbnRyb2xzLiBJdCBjYW4gYmUgYXJyYXkgYmVjYXVzZSBvZiBtdWx0aXBsZSBzZWxlY3Rpb24uPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+YXJyYXkgb2YgaW5kaWNlPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0TGlua0lkeEZyb21MYXllcihsYXllcnM6IG51bWJlcltdKTogbnVtYmVyW10ge1xyXG4gICAgbGV0IGxpbmtJbmRpY2U6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4obGF5ZXJzLmxlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpQ3RyOiBudW1iZXIgPSAwOyBpQ3RyIDwgbGF5ZXJzLmxlbmd0aDsgaUN0ciA9IGlDdHIgKyAxKSB7XHJcbiAgICAgIGxldCBsYXllcjogbnVtYmVyID0gbGF5ZXJzW2lDdHJdO1xyXG4gICAgICBsaW5rSW5kaWNlW2lDdHJdID0gbGF5ZXI7XHJcbiAgICAgIGlmIChzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgIGlmIChsYXllciA8IDApIHtcclxuICAgICAgICAgIGxpbmtJbmRpY2VbaUN0cl0gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKTtcclxuICAgICAgICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICAgICAgICBsaW5lID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBsYXllckxpc3Q6IHN0cmluZ1tdID0gdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LmdldF9JdGVtKGxpbmUpO1xyXG4gICAgICAgICAgaWYgKGxheWVyTGlzdCAhPT0gbnVsbCAmJiB0eXBlb2YgbGF5ZXJMaXN0ICE9PSBcInVuZGVmaW5lZFwiICYmIGxheWVyTGlzdC5sZW5ndGggIT09IDAgJiYgbGF5ZXIgPCBsYXllckxpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxpbmtJbmRpY2VbaUN0cl0gPSBOTnVtYmVyLlBhcnNlKGxheWVyTGlzdFtsYXllcl0pIC0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsaW5rSW5kaWNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY3Vyc2l2ZSBtZXRob2QsIGNoZWNrcyBpZiBwYXJlbnQgb2YgdGhlIGNoaWxkIGlzIHZpc2libGVcXGVuYWJsZSwgdWx0aWwgdGhlcmUgaXMgbm8gcGFyZW50IG9yIGZvdW5kXHJcbiAgLy8vICAgcGFyZW50IHRoYXQgaXMgaGlkZGVuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc1BhcmVudFByb3BWYWx1ZShwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNvbHVtbjogTWdDb250cm9sQmFzZSA9IHRoaXMuRm9ybS5nZXRDb250cm9sQ29sdW1uKHRoaXMpO1xyXG4gICAgbGV0IHBhcmVudDogTWdDb250cm9sQmFzZSA9IDxNZ0NvbnRyb2xCYXNlPnRoaXMuZ2V0TGlua2VkUGFyZW50KHRydWUpO1xyXG5cclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW47XHJcblxyXG4gICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAvLyBubyBtb3JlIHBhcmVudHNcclxuICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBwYXJlbnQgaXMgaGlkZGVuXHJcbiAgICAgIGlmICghcGFyZW50LkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KHByb3BJZCwgdHJ1ZSkpIHtcclxuICAgICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoIXBhcmVudC5pc0NoaWxkT25DdXJyZW50TGF5ZXIodGhpcykpIHtcclxuICAgICAgICAgIC8vIHBhcmVudCBpcyB0YWIgY29udHJvbCB3aXRoIGN1cnJlbnQgbGF5ZXJcclxuICAgICAgICAgIC8vIGRpZmZlcmVudCBmcm9tIGNoaWxkJ3MgbGF5ZXJcclxuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGZvciB0YWJsZSBjaGlsZHJlbiBjaGVjayBpZiBjb2x1bW4gdmlzaWJsZVxyXG4gICAgICAgICAgcmVzdWx0ID0gKCEoY29sdW1uICE9PSBudWxsICYmICFjb2x1bW4uR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkLCB0cnVlKSkgJiYgcGFyZW50LmlzUGFyZW50UHJvcFZhbHVlKHByb3BJZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBHZXQgY29udHJvbCB0byB3aGljaCB0aGlzIGNvbnRyb2wgaXMgbGlua2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNoZWNrU3ViZm9ybUZhdGhlclwiPmlmIHRydWUgY2hlY2sgZm9yIFN1YmZvcm0gY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRMaW5rZWRQYXJlbnQoY2hlY2tTdWJmb3JtRmF0aGVyOiBib29sZWFuKTogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB7XHJcblxyXG4gICAgaWYgKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCAhPT0gLTEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuRm9ybS5nZXRDdHJsKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGNoZWNrU3ViZm9ybUZhdGhlciAmJiB0aGlzLkZvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5Gb3JtLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBjdXJyZW50IGxpbmUgdmFsdWUgb2YgdGhlIHJlYWRPbmx5IGhpc3RvcnkgYXJyYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VmFsXCI+dGhlIG5ldyB2YWx1ZSB0byBiZSBzZXQ8L3BhcmFtPlxyXG4gIFNldEN1cnJSZWFkT25seShuZXdWYWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJSZWFkT25seS5zZXRfSXRlbSh0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpLCBuZXdWYWwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgY3VycmVudCByZWFkT25seSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wncyBjdXJyZW50IGxpbmUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSByZWFkT25seSB2YWx1ZTwvcmV0dXJucz5cclxuICBHZXRDdXJyUmVhZE9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gc3VwZXIuaXNUYWJsZUNvbnRyb2woKSA/IDAgOiB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG4gICAgbGV0IGN1cnJPYmo6IGFueSA9IHRoaXMuX2N1cnJSZWFkT25seS5nZXRfSXRlbShsaW5lKTtcclxuICAgIGxldCBjdXJyOiBib29sZWFuO1xyXG4gICAgaWYgKGN1cnJPYmogPT09IG51bGwpIHtcclxuICAgICAgY3VyciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9jdXJyUmVhZE9ubHkuc2V0X0l0ZW0obGluZSwgY3Vycik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY3VyciA9IDxib29sZWFuPmN1cnJPYmo7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3VycjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyBjb250cm9sIGlzIGEgRGF0YSBDb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0RhdGFDdHJsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFDdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgZGNyZWYgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRoZSBkY0lkPC9yZXR1cm5zPlxyXG4gIGdldERjUmVmKCk6IG51bWJlciB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREY0xpbmVOdW0oKTtcclxuICAgIGxldCBvYmo6IGFueSA9IHRoaXMuX2RjVGFibGVSZWZzLmdldF9JdGVtKHRoaXMuZ2V0RGNMaW5lTnVtKCkpO1xyXG4gICAgbGV0IGRjSWQ6IG51bWJlcjtcclxuICAgIGlmIChvYmogPT09IG51bGwpIHtcclxuICAgICAgZGNJZCA9IC0yO1xyXG4gICAgICB0aGlzLl9kY1RhYmxlUmVmcy5zZXRfSXRlbShsaW5lLCBkY0lkKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkY0lkID0gPG51bWJlcj5vYmo7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGNJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGZvciBhIGRhdGEgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXREY0xpbmVOdW0oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLklzUmVwZWF0YWJsZSA/IHRoaXMuRm9ybS5EaXNwbGF5TGluZSA6IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhlIG9uZSBjaG9pY2Ugb3B0aW9uIGZyb20gaXRlbXMgbGlzdCBpcyB2YWxpZC4gVGhlIGNoZWNrIGlzIG9ubHkgZm9yIGl0ZW1zIGxpc3QgYW5kIG5vdCBmb3IgdGhlXHJcbiAgLy8vICAgZGF0YSBzb3VyY2Ugb3B0aW9ucywgKEZZSTogZm9yIHRoZSBvcHRpb24gZnJvbSB0aGUgRGF0YUN0cmwsIHdlIGFyZSBub3QgY2FsbGluZyB0aGlzXHJcbiAgLy8vICAgbWV0aG9kLCBOTyBDSEVDSyBJUyBET05FKSBpbiBvbmxpbmUgOmNpX2NoZWNrX3JhbmdlX3N0clxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcHRpb246XCI+b25lIG9wdGlvbiBmcm9tIHRoZSBpdGVtcyBsaXN0PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgb3B0aW9uSXNWYWxpZChvcHRpb246IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMgJiYgb3B0aW9uLmxlbmd0aCA+IDAgJiYgb3B0aW9uLmluZGV4T2YoJzAnKSA9PT0gLTEpIHtcclxuICAgICAgbGV0IGNvbnZlcnROdW06IE5VTV9UWVBFID0gbmV3IE5VTV9UWVBFKCk7XHJcbiAgICAgIGNvbnZlcnROdW0ubnVtXzRfYV9zdGQob3B0aW9uKTtcclxuICAgICAgaWYgKGNvbnZlcnROdW0ubnVtX2lzX3plcm8oKSkge1xyXG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzVmFsaWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcHJlcGFyZXMgYW5kIHJldHVybnMgdGhlIG9yZGVyZWQgbGlzdCBiYXNlZCBvbiBsYXllcnMgaW4gbGF5ZXJMaXN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNob2ljZURpc3BMaXN0XCI+dW5vcmRlcmVkIGxpc3Q8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRPcmRlcmVkRGlzcExpc3QoY2hvaWNlRGlzcExpc3Q6IHN0cmluZ1tdLCBsaW5lOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcblxyXG4gICAgbGV0IGNob2ljZUxheWVyU3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IGRpc3BBcnJ5TGlzdDogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3Q8c3RyaW5nPigpO1xyXG4gICAgbGV0IGxheWVyQXJyeUxpc3Q6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuICAgIGxldCBsYXllclByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEVfTEFZRVJTX0xJU1QpO1xyXG5cclxuICAgIGlmIChsYXllclByb3AgIT09IG51bGwpIHtcclxuICAgICAgY2hvaWNlTGF5ZXJTdHIgPSBhd2FpdCBsYXllclByb3AuZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hvaWNlTGF5ZXJTdHIgPT09IG51bGwgfHwgU3RyVXRpbC5ydHJpbShjaG9pY2VMYXllclN0cikubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNob2ljZUxheWVyU3RyID0gXCJcIjtcclxuICAgIH1cclxuICAgIGlmIChjaG9pY2VMYXllclN0ci5sZW5ndGggPiAwICYmIGNob2ljZURpc3BMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGxheWVyTGlzdDogc3RyaW5nW10gPSBjaG9pY2VMYXllclN0ci5zcGxpdChcIixcIik7XHJcbiAgICAgIGxldCBwb3NDb3B5SW5kZXg6IG51bWJlciA9IC0xO1xyXG4gICAgICBmb3IgKGxldCBpbmRleDogbnVtYmVyID0gMDsgaW5kZXggPCBsYXllckxpc3QubGVuZ3RoOyBpbmRleCA9IGluZGV4ICsgMSkge1xyXG4gICAgICAgIGxldCBjdXJyTGF5ZXJMaXN0VmFsOiBzdHJpbmcgPSBsYXllckxpc3RbaW5kZXhdLnRyaW0oKTtcclxuICAgICAgICBpZiAoIShsYXllckFycnlMaXN0LmluZGV4T2YoY3VyckxheWVyTGlzdFZhbCkgIT09IC0xKSkge1xyXG4gICAgICAgICAgbGV0IHJlZlBvc0NvcHlJbmRleDogUmVmUGFyYW08bnVtYmVyPiA9IG5ldyBSZWZQYXJhbTxudW1iZXI+KHBvc0NvcHlJbmRleCk7XHJcbiAgICAgICAgICBsZXQgaXNOdW1iZXI6IGJvb2xlYW4gPSBOTnVtYmVyLlRyeVBhcnNlKGN1cnJMYXllckxpc3RWYWwsIHJlZlBvc0NvcHlJbmRleCk7XHJcbiAgICAgICAgICBwb3NDb3B5SW5kZXggPSByZWZQb3NDb3B5SW5kZXgudmFsdWU7XHJcblxyXG4gICAgICAgICAgLy8gcG9zQ29weUluZGV4IGlzIDFCYXNlZCwgc28gbXVzdCBub3QgYmUgemVyby4gQWxzbywgaXQgbXVzdCBub3QgYmVcclxuICAgICAgICAgIC8vIGdyZWF0ZXIgdGhhbiBubyBvZiBlbGVtZW50cyBpbiB0aGUgRGlwbGF5TGlzdC5cclxuXHJcbiAgICAgICAgICBpZiAoaXNOdW1iZXIgJiYgcG9zQ29weUluZGV4ID4gMCAmJiBwb3NDb3B5SW5kZXggPD0gY2hvaWNlRGlzcExpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGRpc3BBcnJ5TGlzdC5wdXNoKChjaG9pY2VEaXNwTGlzdFtwb3NDb3B5SW5kZXggLSAxXSkudHJpbSgpKTtcclxuICAgICAgICAgICAgbGF5ZXJBcnJ5TGlzdC5wdXNoKGN1cnJMYXllckxpc3RWYWwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXN1bHQ6IHN0cmluZ1tdO1xyXG4gICAgaWYgKGRpc3BBcnJ5TGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmVzdWx0ID0gY2hvaWNlRGlzcExpc3Q7XHJcbiAgICAgIHRoaXMuX2Nob2ljZUxheWVyTGlzdC5zZXRfSXRlbShsaW5lLCBuZXcgQXJyYXk8c3RyaW5nPigwKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oZGlzcEFycnlMaXN0Lmxlbmd0aCk7XHJcbiAgICAgIGZvciAobGV0IF9haTogbnVtYmVyID0gMDsgX2FpIDwgcmVzdWx0Lmxlbmd0aDsgKytfYWkpXHJcbiAgICAgICAgcmVzdWx0W19haV0gPSBudWxsO1xyXG5cclxuICAgICAgcmVzdWx0ID0gZGlzcEFycnlMaXN0LlRvQXJyYXkoKTtcclxuICAgICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LnNldF9JdGVtKGxpbmUsIGxheWVyQXJyeUxpc3QuVG9BcnJheSgpKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIHByZXZpb3VzIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldFByZXZWYWwoKTogdm9pZCB7XHJcbiAgICBsZXQgbGluZTogbnVtYmVyID0gdGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKTtcclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuX3ByZXZWYWx1ZXMuc2V0X0l0ZW0obGluZSwgbnVsbCk7XHJcbiAgICB0aGlzLnNldFByZXZJc051bGxfVG9OdWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gICBzZXRzIHRoZSBwcmV2SXNOdWxsIHZhbHVlIG9mIHRoZSBwcmV2SXNOdWxsIGFycmF5XHJcbiAgLy8vICAgdGhlIG5ld1ZhbHVlIGNhbiBiZSBOVUxMIG9yIGJvb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFByZXZJc051bGxfVG9OdWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldklzTnVsbHMuc2V0X0l0ZW0odGhpcy5nZXREaXNwbGF5TGluZSh0cnVlKSwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBpZiBhbiBleHByZXNzaW9uIHdhcyBzZXQgYXMgdGhlIGRhdGE8L3JldHVybnM+XHJcbiAgZXhwcmVzc2lvblNldEFzRGF0YSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl92YWxFeHBJZCA+IDA7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsbGVkIHdoZW5ldmVyIHRoZSBjaG9pY2UgbGlzdCBvZiBhIFNFTEVDVCBjb250cm9sIGhhcyBjaGFuZ2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjbGVhclJhbmdlKGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fb3JnQ2hvaWNlRGlzcHMuc2V0X0l0ZW0obGluZSwgbnVsbCk7XHJcbiAgICB0aGlzLl9jaG9pY2VEaXNwcy5zZXRfSXRlbShsaW5lLCBudWxsKTtcclxuICAgIHRoaXMuX2Nob2ljZUxpbmtzLnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gICAgdGhpcy5fY2hvaWNlTGF5ZXJMaXN0LnNldF9JdGVtKGxpbmUsIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGhhdmUgdG8gY2hlY2sgcGFyZW50IHZpc2liaWxpdHlcXGVuYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUsIGlmIHRoZSBjb250cm9sIGlzIGNvbm5lY3RlZCB0byBhIGNvbnRhaW5lciBvciB0aGUgdGFzayBpcyBhIHN1YmZvbTwvcmV0dXJucz5cclxuICBoYXZlVG9DaGVja1BhcmVudFZhbHVlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCAhPT0gLTEpIHtcclxuXHJcbiAgICAgIGlmICghdGhpcy5pc0NvbnRhaW5lZEluTGlua2VkUGFyZW50KCkpIHtcclxuICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNvbnRhaW5lZCB0YWIgY2hpbGRyZW4gb2YgYWxsIGxheWVycyBhcmUgb24gdGhlIHNhbWUgd2luZG93LFxyXG4gICAgICAvLyBzbyB3ZSBtdXN0IGhhbmRsZSB0aGVyZSB2aXNpYmlsaXR5XFxlbmFibGVcclxuXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uZ2V0Q3RybCh0aGlzLl9saW5rZWRQYXJlbnREaXRJZHgpLmlzVGFiQ29udHJvbCgpIHx8IHRoaXMuRm9ybS5nZXRDdHJsKHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCkuaXNHcm91cCgpKSB7XHJcbiAgICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLkZvcm0uaXNTdWJGb3JtKCkpIHtcclxuICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBjb250cm9sIGlzIGNvbnRhaW4gaW4gaXRzIGxpbmtlZCBwYXJlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDb250YWluZWRJbkxpbmtlZFBhcmVudCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250YWluZXJEaXRJZHggIT09IC0xICYmIHRoaXMuX2NvbnRhaW5lckRpdElkeCA9PT0gdGhpcy5fbGlua2VkUGFyZW50RGl0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENvbWJpbmUgdHdvIHN0cmluZ3MgYXJyYXkgaW50byBvbmUuIEVhY2ggb2YgdGhlIG9yaWdpbmFsIGFycmF5cyBtYXkgYmUgbnVsbC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmlyc3RTdHJpbmdzXCI+dGhlIGZpcnN0IHN0cmluZ3MgYXJyYXkgdGhhdCB3aWxsIGFsd2F5cyBvY2N1cHkgdGhlIGZpcnN0IGFycmF5IGNlbGxzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxhc3RTdHJpbmdzXCI+dGhlIGxhc3Qgc3RyaW5ncyBhcnJheSB0aGF0IHdpbGwgYWx3YXlzIG9jY3VweSB0aGUgbGFzdCBhcnJheSBjZWxsczwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBjb21iaW5lZCBTdHJpbmdzIGFycmF5PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIGNvbWJpbmVTdHJpbmdBcnJheXMoZmlyc3RTdHJpbmdzOiBzdHJpbmdbXSwgbGFzdFN0cmluZ3M6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG5cclxuICAgIGlmIChmaXJzdFN0cmluZ3MgIT09IG51bGwpXHJcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZmlyc3RTdHJpbmdzKTtcclxuXHJcbiAgICBpZiAobGFzdFN0cmluZ3MgIT09IG51bGwpXHJcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQobGFzdFN0cmluZ3MpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4sIGxpbmU/OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIChwcm9wSWQgPT09IG51bGwgfHwgcHJvcElkLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpICYmIChkZWZhdWx0UmV0VmFsID09PSBudWxsIHx8IGRlZmF1bHRSZXRWYWwuY29uc3RydWN0b3IgPT09IEJvb2xlYW4pKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzAocHJvcElkLCBkZWZhdWx0UmV0VmFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzEocHJvcElkLCBkZWZhdWx0UmV0VmFsLCBsaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRoZSBib29sZWFuIGNvbXB1dGVkIHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIGlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWZhdWx0UmV0VmFsXCI+dGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlICh3aGVuIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCk8L3BhcmFtPlxyXG4gIHByaXZhdGUgR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMChwcm9wSWQ6IG51bWJlciwgZGVmYXVsdFJldFZhbDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGRlZmF1bHRSZXRWYWw7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkocHJvcElkKTtcclxuICAgIGlmIChwcm9wICE9PSBudWxsKSB7XHJcbiAgICAgIHJlc3VsdCA9IHByb3AuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sIC0gaWYgdGhlIGNvbnRyb2wgaXMgcmVwZWF0YWJsZSBhbmQgdGhlIGxpbmUgaXNcclxuICAvLy8gZGlmZmVyZW50IHRoYW4gdGhlIGZvcm1zIGN1cnJlbnQgbGluZSB0aGVuIHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGNvbnRyb2wgcHJvcGVydHkgYXQgdGhhdCBsaW5lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImxpbmVcIj50aGUgbGluZSBudW1iZXIgaW4gdGFibGUgaW4gd2hpY2ggdGhlIGNvbnRyb2wgaXMgbG9jYXRlZDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBHZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eV8xKHByb3BJZDogbnVtYmVyLCBkZWZhdWx0UmV0VmFsOiBib29sZWFuLCBsaW5lOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBkZWZhdWx0UmV0VmFsO1xyXG5cclxuICAgIGlmICh0aGlzLmlzUHJvcGVydHlSZXBlYXRhYmxlKHByb3BJZCkgJiYgdGhpcy5Gb3JtLkRpc3BsYXlMaW5lICE9PSBsaW5lKSB7XHJcbiAgICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShwcm9wSWQpO1xyXG4gICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyA9IHByb3AuZ2V0UHJldlZhbHVlKGxpbmUpO1xyXG4gICAgICAgIGlmICh2YWwgIT09IG51bGwpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKHZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShwcm9wSWQsIGRlZmF1bHRSZXRWYWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgY29udHJvbCAtIGlmIHRoZSBjb250cm9sIGlzIHJlcGVhdGFibGUgYW5kIHRoZSBsaW5lIGlzXHJcbiAgLy8vICAgZGlmZmVyZW50IHRoYW4gdGhlIGZvcm1zIGN1cnJlbnQgbGluZSB0aGVuIHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGNvbnRyb2wgcHJvcGVydHkgYXQgdGhhdFxyXG4gIC8vLyAgIGxpbmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicHJvcElkXCI+dGhlIGlkIG9mIHRoZSBwcm9wZXJ0eTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJkZWZhdWx0UmV0VmFsXCI+dGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlICh3aGVuIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGluZVwiPnRoZSBsaW5lIG51bWJlciBpbiB0YWJsZSBpbiB3aGljaCB0aGUgY29udHJvbCBpcyBsb2NhdGVkPC9wYXJhbT5cclxuICBhc3luYyBjaGVja1Byb3BXaXRoTGluZShwcm9wSWQ6IG51bWJlciwgZGVmYXVsdFJldFZhbDogYm9vbGVhbiwgbGluZTogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gZGVmYXVsdFJldFZhbDtcclxuXHJcbiAgICBpZiAodGhpcy5pc1Byb3BlcnR5UmVwZWF0YWJsZShwcm9wSWQpICYmIHRoaXMuRm9ybS5EaXNwbGF5TGluZSAhPT0gbGluZSkge1xyXG4gICAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AocHJvcElkKTtcclxuICAgICAgaWYgKHByb3AgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBwcm9wLmdldFByZXZWYWx1ZShsaW5lKTtcclxuICAgICAgICBpZiAodmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbih2YWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKHByb3BJZCwgZGVmYXVsdFJldFZhbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBpZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGVmYXVsdFJldFZhbFwiPnRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZSAod2hlbiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QpPC9wYXJhbT5cclxuICBhc3luYyBjaGVja1Byb3AocHJvcElkOiBudW1iZXIsIGRlZmF1bHRSZXRWYWw6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBkZWZhdWx0UmV0VmFsO1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKHByb3BJZCk7XHJcbiAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCBwcm9wLmdldFZhbHVlQm9vbGVhbigpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgcHJvcElkIHByb3BlcnR5IGlzIHJlcGVhdGFibGUgZm9yIHRoaXMgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwcm9wSWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNQcm9wZXJ0eVJlcGVhdGFibGUocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1JlcGVhdGFibGU6IGJvb2xlYW4gPSB0aGlzLklzUmVwZWF0YWJsZTtcclxuICAgIGlmIChpc1JlcGVhdGFibGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHN1cGVyLmlzVGFibGVDb250cm9sKCkgJiYgUHJvcGVydHkuaXNSZXBlYXRhYmxlSW5UYWJsZShwcm9wSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGFuZCB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdWYWxcIj50aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaW4gbWFnaWMgaW50ZXJuYWwgZm9ybWF0IHRvIGJlIGRpc3BsYXllZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICBhc3luYyBTZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKG1nVmFsOiBzdHJpbmcsIGlzTnVsbDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRjUmFuZ2VJc0VtcHR5OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAobWdWYWwgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5WYWx1ZSA9IFwiXCI7XHJcbiAgICAgIC8vIFFDUiAzMDg0NzUgLSBjb250cm9scyB0aGF0IGFyZSBJbml0aWFsaXplZCB3aXRoIG51bGwgc2hvdWxkIGJlIGdpdmVuIG1hZ2ljIGRlZmF1bHQgdmFsdWUuXHJcbiAgICAgIGlmICghaXNOdWxsKVxyXG4gICAgICAgIG1nVmFsID0gRmllbGREZWYuZ2V0TWFnaWNEZWZhdWx0VmFsdWUodGhpcy5EYXRhVHlwZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHN1cGVyLmlzQ2hvaWNlQ29udHJvbCgpKSB7XHJcbiAgICAgICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICAgICAgaWYgKGxpbmUgPCAwKSB7XHJcbiAgICAgICAgICBsaW5lID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxheWVyczogbnVtYmVyW10gPSB0aGlzLmdldExheWVyRnJvbUxpbmtJZHgoYXdhaXQgdGhpcy5nZXRJbmRleE9mQ2hvaWNlKG1nVmFsLCBsaW5lLCBpc051bGwpKTtcclxuXHJcbiAgICAgICAgLy8gV2UgZG8gbm90IGFsbG93IG5vIHNlbGVjdGlvbiBmb3IgYSB0YWIgY29udHJvbC5cclxuICAgICAgICAvLyBTbywgaWYgdGhlcmUgaXMgbm8gVGFiIHRvIGJlIHNlbGVjdGVkLCBzZWxlY3QgdGhlIGZpcnN0IFRhYiBhbmRcclxuICAgICAgICAvLyBhbHNvIHVwZGF0ZSB0aGUgZmllbGQncyB2YWx1ZSBhY2NvcmRpbmdseS5cclxuXHJcbiAgICAgICAgaWYgKGxheWVyc1swXSA8IDAgJiYgc3VwZXIuaXNUYWJDb250cm9sKCkpIHtcclxuICAgICAgICAgIGxheWVyc1swXSA9IDA7XHJcbiAgICAgICAgICBtZ1ZhbCA9IGF3YWl0IHRoaXMuZ2V0TGlua1ZhbHVlKGxheWVyc1swXS50b1N0cmluZygpLCBsaW5lKTtcclxuICAgICAgICAgIGlzTnVsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIG1nVmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICg8R3VpVGFza0Jhc2U+dGhpcy5fZmllbGQuZ2V0VGFzaygpKS5VcGRhdGVGaWVsZFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUodGhpcy5fZmllbGQsIG1nVmFsLCBpc051bGwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlZhbHVlID0gTWlzYy5HZXRDb21tYVNlcGVyYXRlZFN0cmluZyhsYXllcnMpO1xyXG4gICAgICAgIGRjUmFuZ2VJc0VtcHR5ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgIzQ1MDI0ODogYW4gZW1wdHkgcmFuZ2UgaW4gdGhlIGRhdGEgY29udHJvbCBjYXVzZWQgZGVsZXRpbmcgdGhlIHZhbHVlXHJcbiAgICAvLyBvZiB0aGUgY29udHJvbCB3aGVuIGxlYXZpbmcgaXQuIE5vdywgdGhlIHJhbmdlIG9mIHRoZSBjb250cm9sIGlzIHVzZWQgd2hlblxyXG4gICAgLy8gdGhlIGRhdGEgY29udHJvbCByYW5nZSBpcyBlbXB0eS5cclxuICAgIGlmIChkY1JhbmdlSXNFbXB0eSkge1xyXG4gICAgICBpZiAoIXN1cGVyLmlzQ2hlY2tCb3goKSAmJiAodGhpcy5fZmllbGQgPT09IG51bGwgfHwgIWlzTnVsbCB8fCAhdGhpcy5fZmllbGQuaGFzTnVsbERpc3BsYXlWYWx1ZSgpKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAoKHN1cGVyLmlzSW1hZ2VDb250cm9sKCkgJiYgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB8fCBzdXBlci5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5WYWx1ZSA9IG1nVmFsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICgodGhpcy5fZmllbGQgPT09IG51bGwgJiYgaXNOdWxsKSAmJiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8IHRoaXMuRGF0YVR5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCB0aGlzLkRhdGFUeXBlID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUgfHwgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuVmFsdWUgPSBtZ1ZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBsZXQgaW5Db250cm9sOiBib29sZWFuID0gdGhpcy5JbkNvbnRyb2w7XHJcbiAgICAgICAgICAgICAgdGhpcy5WYWx1ZSA9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2UubWcyZGlzcChtZ1ZhbCwgdGhpcy5fcmFuZ2UsIHRoaXMuX3BpYywgdHJ1ZSwgc3VwZXIuaXNTZWxlY3Rpb25DdHJsKCksIHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKS5nZXRDb21wSWR4KCksIGluQ29udHJvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIERlZmVjdCAjIDEzODgwMyA6IEZpeCB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1bmlQYWFTLiBEbyBub3QgY2FsbCBydHJpbVZhbHVlKCkgd2hlbiByZWZyZXNoaW5nIHRoZSBkaXNwbGF5IGlmIHRoZSBkYXRhIHR5cGVcclxuICAgICAgICAgIC8vIGlzIG5vdCBudW1lcmljIG9yIGxlZnQganVzdGlmeSBwcm9wZXJ0eSBpcyBOby5cclxuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5WYWx1ZSA9PT0gJ3N0cmluZycgJiYgKCF0aGlzLl9waWMuaXNBdHRyTnVtZXJpYygpIHx8IHRoaXMuX3BpYy5pc0xlZnQoKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5ydHJpbVZhbHVlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoaW5uZXJFeGNlcHRpb24pIHtcclxuICAgICAgICAgIGlmIChpbm5lckV4Y2VwdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihOU3RyaW5nLkZvcm1hdChcIkNvbnRyb2w6ICd7MH0nLCBtZ3ZhbDogezF9XCIsIHRoaXMuTmFtZSwgbWdWYWwpLCBpbm5lckV4Y2VwdGlvbikpO1xyXG4gICAgICAgICAgICB0aGlzLlZhbHVlID0gXCJcIjtcclxuICAgICAgICAgICAgbWdWYWwgPSBGaWVsZERlZi5nZXRNYWdpY0RlZmF1bHRWYWx1ZSh0aGlzLkRhdGFUeXBlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgaW5uZXJFeGNlcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ2hlY2tCb3goKSlcclxuICAgICAgICAgIHRoaXMuVmFsdWUgPSBEaXNwbGF5Q29udmVydG9yLnRvQm9vbGVhbihtZ1ZhbCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5WYWx1ZSA9IG1nVmFsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBUcmFuc2xhdGUgbG9naWNhbCBuYW1lIGZvciBpbWFnZSBjb250cm9sLlxyXG4gICAgaWYgKChzdXBlci5pc0ltYWdlQ29udHJvbCgpICYmIHRoaXMuRGF0YVR5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikgfHwgc3VwZXIuSXNJbWFnZUJ1dHRvbigpKSB7XHJcbiAgICAgIG1nVmFsID0gRXZlbnRzLlRyYW5zbGF0ZUxvZ2ljYWxOYW1lKG1nVmFsKTtcclxuICAgIH1cclxuICAgIHRoaXMuSXNOdWxsID0gaXNOdWxsO1xyXG4gICAgYXdhaXQgdGhpcy5SZWZyZXNoRGlzcGxheVZhbHVlKG1nVmFsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2hlY2tzIGlmIHRoZSBjb250cm9sJ3MgdmFsdWUgaXMgbW9kaWZpZWQgYW5kIGlmIHNvLCB1cGRhdGVzIHRoZSBNb2RpZmllZEJ5VXNlciA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3VmFsdWVcIj48L3BhcmFtPlxyXG4gIFVwZGF0ZU1vZGlmaWVkQnlVc2VyKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBGb3IgaW1hZ2UgY29udHJvbCBhbmQgaW1hZ2UgYnV0dG9uLCB0aGUgdmFsdWUgd291bGQgbm90IGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIuIEJ1dCwgaWYgaXQgaGFzXHJcbiAgICAvLyBhIGxvZ2ljYWwgbmFtZSwgaXQgaXMgcmVwbGFjZWQuIE9yIGlmIGl0IGlzIGZpbGVTZXJ2ZXIgZ2V0LCB0aGUgdmFsdWUgaXMgcmVwbGFjZWQgYnkgYSBzZXJ2ZXIgdXJsLlxyXG4gICAgLy8gSW4gYm90aCB0aGVzZSBjYXNlcywgd2Ugc2hvdWxkIG5vdCBtYXJrIGl0IGFzIG1vZGlmaWVkLlxyXG4gICAgaWYgKCEoc3VwZXIuaXNCdXR0b24oKSB8fCBzdXBlci5pc0ltYWdlQ29udHJvbCgpKSkge1xyXG4gICAgICBsZXQgY3RybEN1cnJJc051bGw6IGJvb2xlYW4gPSB0aGlzLklzTnVsbDtcclxuICAgICAgbGV0IHZhbENoYW5nZWQ6IGJvb2xlYW4gPSAodGhpcy5pc0RpZmZlcmVudFZhbHVlKG5ld1ZhbHVlLCBmYWxzZSwgZmFsc2UpKTtcclxuXHJcbiAgICAgIC8vIGlmIHRoZSB2YWx1ZSBkaWRuJ3QgY2hhbmdlIHRoZW4gbGV0J3MgY2hlY2sgaWYgdGhlIG51bGxpdHkgaGF2ZSBjaGFuZ2VkXHJcbiAgICAgIGlmICghdmFsQ2hhbmdlZCkge1xyXG4gICAgICAgIGlmICh0aGlzLkNhbkdldE51bGxGcm9tQ29udHJvbFZhbHVlKCkpIHtcclxuICAgICAgICAgIHZhbENoYW5nZWQgPSAoY3RybEN1cnJJc051bGwgIT09IHRoaXMuaXNOdWxsVmFsdWUobmV3VmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZhbENoYW5nZWQgfHwgdGhpcy5LZXlTdHJva2VPbikge1xyXG4gICAgICAgIHRoaXMuTW9kaWZpZWRCeVVzZXIgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUlRyaW1zIHRoZSBjb250cm9sIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHJ0cmltVmFsdWUoKTogdm9pZCB7XHJcbiAgICBpZiAoKHN1cGVyLmlzSW1hZ2VDb250cm9sKCkgJiYgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CKSB8fCBzdXBlci5Jc0ltYWdlQnV0dG9uKCkpIHtcclxuICAgICAgdGhpcy5WYWx1ZSA9IE5TdHJpbmcuVHJpbUVuZCh0aGlzLlZhbHVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgbWluaW11bVZhbHVlTGVuZ3RoOiBudW1iZXIgPSB0aGlzLmdldE1pbmltdW1WYWx1ZUxlbmd0aCgpO1xyXG4gICAgICAvLyBSVHJpbSB0aGUgdmFsdWUgYmV5b25kIHRoaXMgaW5kZXhcclxuICAgICAgaWYgKHRoaXMuVmFsdWUubGVuZ3RoID4gbWluaW11bVZhbHVlTGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHN0cjogc3RyaW5nID0gdGhpcy5WYWx1ZS5zdWJzdHIobWluaW11bVZhbHVlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgLy8gY29weSB0aGUgbWluaW11bSBsZW5ndGggdmFsdWUgYXMgaXNcclxuICAgICAgICB0aGlzLlZhbHVlID0gdGhpcy5WYWx1ZS5zdWJzdHIoMCwgbWluaW11bVZhbHVlTGVuZ3RoKTtcclxuICAgICAgICAvLyBydHJpbSB0aGUgdmFsdWUgYmV5b25kIG1pbmltdW0gbGVuZ3RoXHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IHRoaXMuVmFsdWUgKyBTdHJVdGlsLnJ0cmltV2l0aE51bGwoc3RyLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWx3YXlzIHRyaW0gdGhlIG51bWVyaWMgdmFsdWUuXHJcbiAgICAgIGlmIChzdXBlci5pc1RleHRDb250cm9sKCkgJiYgdGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDKSB7XHJcbiAgICAgICAgdGhpcy5WYWx1ZSA9IE5TdHJpbmcuVHJpbUVuZCh0aGlzLlZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUgbGVuZ3RoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldE1pbmltdW1WYWx1ZUxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgbGV0IG1pbkxlbmd0aDogbnVtYmVyID0gdGhpcy5fcGljLmdldE1hc2tMZW5ndGgoKTtcclxuXHJcbiAgICAvLyB0cmF2ZXJzZSBmcm9tIHJpZ2h0IHRpbGwgYSB2YWxpZCBtYXNrIGNoYXIgaXMgZW5jb3VudGVyZWRcclxuICAgIHdoaWxlIChtaW5MZW5ndGggPiAwICYmICF0aGlzLl9waWMucGljSXNNYXNrKG1pbkxlbmd0aCAtIDEpKSB7XHJcbiAgICAgIG1pbkxlbmd0aCA9IG1pbkxlbmd0aCAtIDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWluTGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc051bGxWYWx1ZShzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldElzTnVsbENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLkNhbkdldE51bGxGcm9tQ29udHJvbFZhbHVlKCkgJiYgc3RyID09PSBcIlwiKSB7XHJcbiAgICAgIHJldElzTnVsbENvbnRyb2wgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElzTnVsbENvbnRyb2w7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGhpcyBjb250cm9sIGNhbiBnZXQgbnVsbCB2YWx1ZSBmcm9tIHRoZSBjb250cm9sIGhpbXNlbGZcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgQ2FuR2V0TnVsbEZyb21Db250cm9sVmFsdWUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGEgc3BlY2lmaWMgaW5kZXggY29ycmVzcG9uZHMgdG8gYSBudWxsIHZhbHVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNDaG9pY2VOdWxsKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuO1xyXG4gICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgIGxldCBkY1ZhbHM6IERjVmFsdWVzID0gdGhpcy5nZXREY1ZhbHMoKTtcclxuICAgICAgcmV0dXJuIGRjVmFscy5pc051bGwoaWR4KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDb21wdXRlcyB0aGUgY29udHJvbCdzIHZhbHVlIGVpdGhlciBmcm9tIGV4cHJlc3Npb24gb3IgZmllbGQgYW5kIHJlZnJlc2hlcyB0aGUgR1VJIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JjZVJlZnJlc2hcIj48L3BhcmFtPlxyXG4gIGFzeW5jIENvbXB1dGVBbmRSZWZyZXNoRGlzcGxheVZhbHVlKGZvcmNlUmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICB0aGlzLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl92YWxFeHBJZCA+IDApIHtcclxuICAgICAgbGV0IHdhc0V2YWx1YXRlZDogYm9vbGVhbjtcclxuICAgICAgbGV0IHJlZldhc0V2YWx1YXRlZDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW08Ym9vbGVhbj4od2FzRXZhbHVhdGVkKTtcclxuXHJcbiAgICAgIGxldCByZXRFeHA6IHN0cmluZyA9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5FdmFsdWF0ZUV4cHJlc3Npb24odGhpcy5fdmFsRXhwSWQsIHRoaXMuRGF0YVR5cGUsIHRoaXMuX3BpYy5nZXRTaXplKCksIHRydWUsIFN0b3JhZ2VBdHRyaWJ1dGUuU0tJUCwgZmFsc2UsIHJlZldhc0V2YWx1YXRlZCk7XHJcbiAgICAgIHdhc0V2YWx1YXRlZCA9IHJlZldhc0V2YWx1YXRlZC52YWx1ZTtcclxuICAgICAgaWYgKHdhc0V2YWx1YXRlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuU2V0QW5kUmVmcmVzaERpc3BsYXlWYWx1ZShyZXRFeHAsIHJldEV4cCA9PT0gbnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fZmllbGQgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsdWU6IHN0cmluZyA9IE5TdHJpbmcuRW1wdHk7XHJcbiAgICAgICAgbGV0IGlzTnVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCByZWZWYWx1ZTogUmVmUGFyYW08c3RyaW5nPiA9IG5ldyBSZWZQYXJhbTxzdHJpbmc+KHZhbHVlKTtcclxuICAgICAgICBsZXQgcmVmSXNOdWxsOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbTxib29sZWFuPihpc051bGwpO1xyXG4gICAgICAgICg8R3VpVGFza0Jhc2U+dGhpcy5fZmllbGQuZ2V0VGFzaygpKS5nZXRGaWVsZERpc3BsYXlWYWx1ZSh0aGlzLl9maWVsZCwgcmVmVmFsdWUsIHJlZklzTnVsbCk7XHJcbiAgICAgICAgdmFsdWUgPSByZWZWYWx1ZS52YWx1ZTtcclxuICAgICAgICBpc051bGwgPSByZWZJc051bGwudmFsdWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5TZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKHZhbHVlLCBpc051bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICghc3VwZXIuaXNUYWJsZUNvbnRyb2woKSAmJiAhc3VwZXIuaXNDb2x1bW5Db250cm9sKCkpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlWYWx1ZSh0aGlzLlZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRGVjaWRlcyBpZiB0aGUgY29udHJvbCBzaG91bGQgYmUgcmVmcmVzaGVkIHdoaWxlIGVudGVyaW5nIGEgY29udHJvbC4gVmFsdWVzIGZvciBzb21lIGRhdGEgdHlwZXNcclxuICAvLy8gYXJlIGRpc3BsYXllZCBkaWZmZXJlbnRseSB3aGlsZSBwYXJrZWQgb24gdGhlIGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFNob3VsZFJlZnJlc2hPbkNvbnRyb2xFbnRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQgJiYgdGhpcy5nZXRGaWVsZCgpICE9PSBudWxsICYmICh0aGlzLmdldEZpZWxkKCkuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkRBVEUgfHxcclxuICAgICAgdGhpcy5nZXRGaWVsZCgpLmdldFR5cGUoKSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5USU1FIHx8IHRoaXMuZ2V0RmllbGQoKS5nZXRUeXBlKCkgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVmcmVzaCB0aGUgZGlzcGxheWVkIHZhbHVlIG9ubHkgKHdpdGhvdXQgdGhlIG90aGVyIHByb3BlcnRpZXMgb2YgdGhlIGNvbnRyb2wpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1nVmFsXCI+aXMgdGhlIG1hZ2ljIGludGVybmFsIHZhbHVlIG9mIHRoZSBwcmVzZW50YXRpb24gdmFsdWU8L3BhcmFtPlxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5VmFsdWUobWdWYWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUodHJ1ZSk7XHJcbiAgICBsZXQgdmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBzYXZlVmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdmFsdWVDaGFuZ2VkO1xyXG5cclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIC8vIEFUVEVOVElPTjpcclxuICAgIC8vIHRoZSB1c2Ugb2YgdGhlIGZ1bmN0aW9uIGdldE5hbWUoKSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBuYW1lIG1lbWJlciB2YXJpYWJsZVxyXG4gICAgLy8gaXMgdG8gZW5oYW5jZSB0aGUgdXNlIG9mIGNvbnRyb2xzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gYSB0YWJsZVxyXG4gICAgLy8gdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICB0cnkge1xyXG5cclxuICAgICAgbGV0IHByZXZWYWx1ZTogc3RyaW5nID0gdGhpcy5fcHJldlZhbHVlcy5nZXRfSXRlbShsaW5lKTtcclxuICAgICAgbGV0IHByZXZOdWxsOiBib29sZWFuID0gdGhpcy5nZXRQcmV2SXNOdWxsKCk7XHJcblxyXG4gICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLklzVHlwZUFscGhhT3JVbmljb2RlKHRoaXMuRGF0YVR5cGUpKSB7XHJcbiAgICAgICAgaWYgKFN0clV0aWwucnRyaW0obWdWYWwpID09PSBTdHJVdGlsLnJ0cmltKHByZXZWYWx1ZSkgfHxcclxuICAgICAgICAgIChtZ1ZhbCAhPT0gbnVsbCAmJiBTdHJVdGlsLnJ0cmltKG1nVmFsKSA9PT0gU3RyVXRpbC5ydHJpbShwcmV2VmFsdWUpKSkge1xyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJldk51bGwgIT09IHRoaXMuSXNOdWxsKSB7XHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICA7XHJcbiAgICAgICAgaWYgKG1nVmFsID09PSBwcmV2VmFsdWUgfHwgKG1nVmFsICE9PSBudWxsICYmIG1nVmFsID09PSBwcmV2VmFsdWUpKVxyXG4gICAgICAgICAgdmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChwcmV2TnVsbCAhPT0gdGhpcy5Jc051bGwpXHJcbiAgICAgICAgICB2YWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmV2VmFsdWVzLnNldF9JdGVtKGxpbmUsIG1nVmFsKTtcclxuICAgICAgdGhpcy5zZXRQcmV2SXNOdWxsKHRoaXMuSXNOdWxsKTtcclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy5UeXBlKSB7XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9UQUJMRTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xBQkVMOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STTpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0dST1VQOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1RBVFVTX0JBUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX1NFVDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTlRBSU5FUjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0ZSQU1FX0ZPUk06XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TQl9MQUJFTDpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJTkU6XHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQlJPV1NFUjpcclxuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZWQgJiYgdGhpcy5WYWx1ZSAhPSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLnNldFVybCgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0lNQUdFOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU0JfSU1BR0U6XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkICYmIHRoaXMuVmFsdWUgIT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy5zZXRJbWFnZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NIRUNLQk9YOlxyXG4gICAgICAgICAgaWYgKHZhbHVlQ2hhbmdlZCB8fCAgdGhpcy5mb3JjZVJlZnJlc2gpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hlY2tCb3hWYWx1ZShsaW5lLCBtZ1ZhbCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCOlxyXG4gICAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09NQk86XHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9MSVNUOlxyXG4gICAgICAgICAgc2F2ZVZhbHVlQ2hhbmdlZCA9IHZhbHVlQ2hhbmdlZDtcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmUsIHZhbHVlQ2hhbmdlZCk7XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIC8vIGZpeGVkIGJ1ZyM6Nzc2MjE1LCA4MDA3NjMsOTQxODQxLCB0aGUgcHJldlZhbHVlIGlzIHNhdmUgYXMgbWd2YWwgbmVlZCB0byBjb252ZXJ0IHRvIGxheWVyXHJcbiAgICAgICAgICAgIGxldCBwcmV2RGlzcGxheVZhbHVlOiBudW1iZXJbXSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyBGaXggYnVnIzo3ODQzOTFcclxuICAgICAgICAgICAgLy8gSWYgSXRlbUxpc3Qgd2FzIHVwZGF0ZSByZWZyZXNoQW5kU2V0SXRlbUxpc3RCeURhdGFTb3VyY2UgdGhlbiB0aGUgdmFsdWUgbXVzdCBiZSBzZXRcclxuXHJcbiAgICAgICAgICAgIGlmIChzYXZlVmFsdWVDaGFuZ2VkID09PSB2YWx1ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICBpZiAocHJldlZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwcmV2RGlzcGxheVZhbHVlID0gdGhpcy5nZXRMYXllckZyb21MaW5rSWR4KGF3YWl0IHRoaXMuZ2V0SW5kZXhPZkNob2ljZShwcmV2VmFsdWUsIGxpbmUsIHByZXZOdWxsKSk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcHJldkRpc3BsYXlWYWx1ZS5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAocHJldkRpc3BsYXlWYWx1ZVtpXSA9PT0gR3VpQ29uc3RhbnRzLkRFRkFVTFRfVkFMVUVfSU5UKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJldkRpc3BsYXlWYWx1ZVtpXSA9IEd1aUNvbnN0YW50cy5ERUZBVUxUX0xJU1RfVkFMVUU7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGluZGljZSA9IE1pc2MuR2V0SW50QXJyYXkodGhpcy5WYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgICAgICAgIGxldCBjdXJyZW50TGF5ZXIgPSB0aGlzLmdldEN1cnJlbnRMaW5rSWR4KCk7XHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBsaW5lLCBIdG1sUHJvcGVydGllcy5TZWxlY3RlZFZhbHVlLCBpbmRpY2VbMF0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCBsaW5lLCBIdG1sUHJvcGVydGllcy5TZWxlY3RlZExheWVyLCBjdXJyZW50TGF5ZXIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLklzTXVsdGlwbGVTZWxlY3Rpb25MaXN0Qm94KCkpIHtcclxuICAgICAgICAgICAgICBDb21tYW5kcy5hZGRWYWx1ZVdpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9WQUxVRSwgdGhpcywgbGluZSwgaW5kaWNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgQ29tbWFuZHMuYWRkVmFsdWVXaXRoTGluZShDb21tYW5kVHlwZS5TRVRfVkFMVUUsIHRoaXMsIGxpbmUsICt0aGlzLlZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0JVVFRPTjpcclxuICAgICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX1RFWFQ6XHJcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIChmb3JtLmZvcm1SZWZyZXNoZWQoKSB8fCBmb3JjZVJlZnJlc2ggfHwgdmFsRXhwICE9IG51bGwgJiZcclxuICAgICAgICAgICAgLy8gdmFsRXhwLmNvbXB1dGVkQnlDbGllbnRPbmx5KCkpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLklzSW1hZ2VCdXR0b24oKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0SW1hZ2VXaXRoRmlsZU5hbWUodGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0VGV4dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9SQURJTzpcclxuICAgICAgICAgIHZhbHVlQ2hhbmdlZCA9IGF3YWl0IHRoaXMucmVmcmVzaEFuZFNldEl0ZW1MaXN0QnlEYXRhU291cmNlKGxpbmUsIHZhbHVlQ2hhbmdlZCk7XHJcbiAgICAgICAgICBpZiAoIXZhbHVlQ2hhbmdlZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgdGhpcy5zZXRSYWRpb0NoZWNrZWQodGhpcy5WYWx1ZSk7XHJcbiAgICAgICAgICAvLyBzZXRSYWRpb0NoZWNrZWQodmFsdWUgLmxlbmd0aCgpID09IDAgPyBERUZBVUxUX1ZBTFVFX0lOVCA6IEludGVnZXIucGFyc2VJbnQodmFsdWUpKTtcclxuICAgICAgICAgIC8vIGlmICghdGFzay5zdGFydFByb2Nlc3MoKSlcclxuICAgICAgICAgIC8vIGd1aU1hbmFnZXIuc2V0Rm9jdXModGhpcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiaW4gQ29udHJvbC5SZWZyZXNoRGlzcGxheVZhbHVlKCkgdW5rbm93biB0eXBlOiB7MH1cIiwgdGhpcy5UeXBlKSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdXBlci5pc0Nob2ljZUNvbnRyb2woKSAmJiB2YWx1ZUNoYW5nZWQpXHJcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVQcm9wZXJ0eUxvZ2ljTmVzdGluZyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCBDb21tYW5kVHlwZS5QUk9QX1NFVF9WSVNJQkxFLCBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFLCB0cnVlKSwgZmFsc2UpO1xyXG4gICAgfSBjYXRjaCAoZXhfMzYwKSB7XHJcbiAgICAgIGlmIChleF8zNjAgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcImluIENvbnRyb2wuUmVmcmVzaERpc3BsYXlWYWx1ZSgpIGZvciBjb250cm9sOiB7MH1cIiwgdGhpcy5OYW1lKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4XzM2MDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIFJlZnJlc2hEaXNwbGF5KG9ubHlSZXBlYXRhYmxlUHJvcHM/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQob25seVJlcGVhdGFibGVQcm9wcykpXHJcbiAgICAgIG9ubHlSZXBlYXRhYmxlUHJvcHMgPSBmYWxzZTtcclxuICAgIGF3YWl0IHRoaXMuUmVmcmVzaERpc3BsYXlfMShvbmx5UmVwZWF0YWJsZVByb3BzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB1cGRhdGVzIHRoZSBkaXNwbGF5IG9mIHRoZSBjb250cm9sIGluY2x1ZGluZyBpdHMgdmFsdWUgYW5kIGl0cyBwcm9wZXJ0aWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlSZXBlYXRhYmxlUHJvcHNcIj5pZiBjb250cm9sIHRyZWUgLSByZWZyZXNoZXMgb25seSByZXBlYXRhYmxlIHRyZWUgcHJvcGVydGllczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBSZWZyZXNoRGlzcGxheV8xKG9ubHlSZXBlYXRhYmxlUHJvcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyAjNDIyMjUwLiBTa2lwIHRoZSByZWZyZXNoIGRpc3BsYXkgb2YgdGhlIHBhcmVudCdzIHN1YmZvcm0gY29udHJvbCBpZiB0aGUgZm9ybSBpbnNpZGUgaXQgaXMgc3RpbGwgaW4gaXRzIFJlZnJlc2hEaXNwbGF5LlxyXG4gICAgaWYgKCEoc3VwZXIuaXNTdWJmb3JtKCkgJiYgdGhpcy5HZXRTdWJmb3JtTWdGb3JtKCkgIT09IG51bGwgJiYgdGhpcy5HZXRTdWJmb3JtTWdGb3JtKCkuaW5SZWZyZXNoRGlzcGxheSgpKSkge1xyXG5cclxuICAgICAgLy8gdXBkYXRlIHRoZSBwcm9wZXJ0aWVzXHJcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFByb3BlcnRpZXMob25seVJlcGVhdGFibGVQcm9wcyk7XHJcblxyXG4gICAgICAvLyBjb21wdXRlIGFuZCBkaXNwbGF5IHRoZSB2YWx1ZS5cclxuICAgICAgaWYgKHRoaXMuU2hvdWxkQ29tcHV0ZUFuZFJlZnJlc2hPbkNsb3NlZEZvcm0oKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuQ29tcHV0ZUFuZFJlZnJlc2hEaXNwbGF5VmFsdWUoZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBleGVjdXRlcyB0aGUgcmVhZG9ubHkgY29tbWFuZCBvbmx5IGlmIG5lZWRlZFxyXG4gICAgICBsZXQgaXNQYXJrYWJsZUN0cmw6IGJvb2xlYW4gPSAhKGF3YWl0IHRoaXMuaXNQYXJrYWJsZShmYWxzZSkpIHx8ICEgYXdhaXQgdGhpcy5pc01vZGlmaWFibGUoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkdldEN1cnJSZWFkT25seSgpICE9PSBpc1BhcmthYmxlQ3RybCkge1xyXG4gICAgICAgIHRoaXMuU2V0Q3VyclJlYWRPbmx5KGlzUGFya2FibGVDdHJsKTtcclxuICAgICAgICBhd2FpdCBNYW5hZ2VyLlNldFJlYWRPbmx5Q29udHJvbCh0aGlzLCBpc1BhcmthYmxlQ3RybCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtdXN0SW5wdXRQcm9wZXJ0eTogUHJvcGVydHkgPSB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCk7XHJcbiAgICAgIC8vIG5lZWQgdG8gY29tcHV0ZSBhbmQgcmVmcmVzaCB0aGUgZGlzcGxheSBpZiB0aGUgY29udHJvbCdzIGRhdGEgaXMgYW4gZXhwcmVzc2lvblxyXG4gICAgICAvLyBvciB0aGUgZm9ybWF0IGlzIGV4cHJlc3Npb24uIFdoZW4gdGhlIGZvcm1hdCBpcyBjaGFuZ2VkLCB0aGUgZGlzcGxheSB2YWwgbWF5IGNoYW5nZSBhcyB3ZWxsLlxyXG4gICAgICBpZiAobXVzdElucHV0UHJvcGVydHkgIT0gbnVsbCAmJiBtdXN0SW5wdXRQcm9wZXJ0eS5pc0V4cHJlc3Npb24oKSkge1xyXG5cclxuICAgICAgICBsZXQgcHJldk11c3RJbnB1dDogYm9vbGVhbiA9IHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpO1xyXG5cclxuICAgICAgICBpZiAocHJldk11c3RJbnB1dCAhPT0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTVVTVF9JTlBVVCwgZmFsc2UpKVxyXG4gICAgICAgICAgQ29tbWFuZHMuYWRkT3BlcmF0aW9uV2l0aExpbmUoQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZLCB0aGlzLCB0aGlzLmdldERpc3BsYXlMaW5lKGZhbHNlKSwgSHRtbFByb3BlcnRpZXMuTXVzdElucHV0LCAhcHJldk11c3RJbnB1dCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5HZXRDb21wdXRlZEJvb2xlYW5Qcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfSU4sIHRydWUpKVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZXJhdGlvbldpdGhMaW5lKENvbW1hbmRUeXBlLlNFVF9QUk9QRVJUWSwgdGhpcywgdGhpcy5nZXREaXNwbGF5TGluZShmYWxzZSksIEh0bWxQcm9wZXJ0aWVzLlRhYkluZGV4LCAtMSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGb3IgUmljaCBDbGllbnQgY29tcHV0ZSBhbmQgcmVmcmVzaCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgYWx3YXlzLCBhbHNvIGlmIHRoZSBmb3JtIGlzIG5vdCB5ZXQgb3BlbmVkLlxyXG4gIC8vLyBGb3IgT25saW5lIG9ubHkgZm9yIG9wZW5lZCBmb3Jtcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgU2hvdWxkQ29tcHV0ZUFuZFJlZnJlc2hPbkNsb3NlZEZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gUmVmcmVzaGVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjb250cm9sLiA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25seVJlcGVhdGFibGVQcm9wc1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgcmVmcmVzaFByb3BlcnRpZXMob25seVJlcGVhdGFibGVQcm9wczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCAmJiB0aGlzLkRhdGFUeXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLk5PTkUgJiYgdGhpcy5fZmlyc3RSZWZyZXNoUHJvcGVydGllcylcclxuICAgICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5TRVRfQVRUUklCVVRFLCB0aGlzLCB0aGlzLkRhdGFUeXBlLmNoYXJDb2RlQXQoMCkpO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdFByb3BzKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuWm9vbUJ1dHRvbkluaXRpYWxpemF0aW9uKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLl9wcm9wVGFiLlJlZnJlc2hEaXNwbGF5KGZhbHNlLCBvbmx5UmVwZWF0YWJsZVByb3BzKSkpIHtcclxuICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiQ29udHJvbCAnezB9JzogTm90IGFsbCBwcm9wZXJ0aWVzIGNvdWxkIGJlIHNldFwiLCB0aGlzLmdldE5hbWUoKSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaFByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIGlmICghb25seVJlcGVhdGFibGVQcm9wcykge1xyXG4gICAgICAgICAgICB0aGlzLl9maXJzdFJlZnJlc2hQcm9wZXJ0aWVzID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgbGV0IG1zZzogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKE5TdHJpbmcuRm9ybWF0KFwiQ29udHJvbCAnezB9JzogezF9XCIsIHRoaXMuZ2V0TmFtZSgpLCBleC5NZXNzYWdlKSk7XHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhtc2cuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoVGFiRm9yTGF5ZXJMaXN0KGxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN1cnJlbnRMaW5rVmFsdWU6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgLy8gSWYgdGhlIGZvcm0gaGFzIGFscmVhZHkgb3BlbmVkLCBnZXQgdGhlIGN1cnJlbnQgbGluayB2YWx1ZSBiZWZvcmVcclxuICAgIC8vIGNoYW5naW5nIHRoZSBsYXllciBsaXN0IGkuZS4gYmVmb3JlIGNhbGxpbmcgcmVmcmVzaEFuZFNldEl0ZW1zTGlzdCgpLlxyXG4gICAgLy8gQW5kIHRoZW4sIGFmdGVyIGNoYW5naW5nIHRoZSBsYXllciBsaXN0LCBzZWxlY3QgdGhlIFRBQiBjb3JyZXNwb25kaW5nXHJcbiAgICAvLyB0byB0aGUgY3VycmVudCBsaW5rIHZhbHVlLlxyXG4gICAgaWYgKHRoaXMuZ2V0Rm9ybSgpLk9wZW5lZCkge1xyXG4gICAgICBsZXQgaW5kaWNlOiBudW1iZXJbXSA9IHRoaXMuZ2V0Q3VycmVudEluZGV4T2ZDaG9pY2UoKTtcclxuICAgICAgbGV0IGN1cnJlbnRMYXllcjogbnVtYmVyID0gaW5kaWNlWzBdO1xyXG4gICAgICBjdXJyZW50TGlua1ZhbHVlID0gYXdhaXQgdGhpcy5nZXRMaW5rVmFsdWUoY3VycmVudExheWVyLnRvU3RyaW5nKCksIGxpbmUpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmUsIGZhbHNlKTtcclxuICAgIGlmICh0aGlzLmdldEZvcm0oKS5PcGVuZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5TZXRBbmRSZWZyZXNoRGlzcGxheVZhbHVlKGN1cnJlbnRMaW5rVmFsdWUsIHRoaXMuSXNOdWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBpdGVtIGxpc3Qgb2YgcmFkaW8gYnV0dG9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+RGlzcGxheSBsaW5lPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleGVjQ29tcHV0ZUNob2ljZVwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgcmVmcmVzaEFuZFNldEl0ZW1zTGlzdEZvclJhZGlvQnV0dG9uKGxpbmU6IG51bWJlciwgZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyAxLiBjcmVhdGUgdGhlIGJ1dHRvbiBmb3IgZWFjaCBpdGVtcyBsaXN0XHJcbiAgICBsZXQgZGlzcGxheUxpc3Q6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5yZWZyZXNoRGlzcFJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuXHJcbiAgICBsZXQgb3B0aW9ucyA9IGRpc3BsYXlMaXN0Lm1hcCgoZGlzcGxheVZhbHVlLCBjb3VudGVyLCBhcnIpID0+IHtcclxuICAgICAgbGV0IGluZGV4OiBzdHJpbmcgPSBjb3VudGVyLnRvU3RyaW5nKCk7XHJcbiAgICAgIHJldHVybiB7aW5kZXgsIGRpc3BsYXlWYWx1ZX1cclxuICAgIH0pO1xyXG4gICAgLy8gY3JlYXRlcyBuZXcgcmFkaW8gYnV0dG9ucyBmcm9tIGRpc3BsYXkgbGlzdC5cclxuXHJcbiAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIGxpbmUsIEh0bWxQcm9wZXJ0aWVzLkl0ZW1zTGlzdCwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGl0ZW0gbGlzdCBhbmQgc2V0IGl0IGludG8gdGhlIGd1aSBjb250cm9sIGlmIGl0IGlzIGNvbWJvIGJveCAsIHJlZnJlc2ggYWxzbyB0aGUgdmlzaWJsZVxyXG4gIC8vLyAgIGxpbmVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoQW5kU2V0SXRlbXNMaXN0KGxpbmU6IG51bWJlciwgZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChleGVjQ29tcHV0ZUNob2ljZSkge1xyXG4gICAgICB0aGlzLmNsZWFyUmFuZ2UobGluZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgb3B0aW9uc1N0cmluZ3M6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5yZWZyZXNoRGlzcFJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuICAgIGlmIChzdXBlci5pc1NlbGVjdGlvbkN0cmwoKSB8fCBzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG5cclxuICAgICAgbGV0IG9wdGlvbnMgPSBvcHRpb25zU3RyaW5ncy5tYXAoKGRpc3BsYXlWYWx1ZSwgaW5kZXgsIGFycikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7aW5kZXgsIGRpc3BsYXlWYWx1ZX1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIHRoaXMsIGxpbmUsIEh0bWxQcm9wZXJ0aWVzLkl0ZW1zTGlzdCwgb3B0aW9ucyk7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChzdXBlci5pc1JhZGlvKCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hBbmRTZXRJdGVtc0xpc3RGb3JSYWRpb0J1dHRvbihsaW5lLCBleGVjQ29tcHV0ZUNob2ljZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoIHRoZSBjaG9pY2UgbGlzdCBvZiBhIFNFTEVDVCBjb250cm9sXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoRGlzcFJhbmdlKGV4ZWNDb21wdXRlQ2hvaWNlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgbGV0IHNlbGVjdENtZDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigwKTtcclxuICAgIGxldCBsaW5lOiBudW1iZXIgPSB0aGlzLmdldERpc3BsYXlMaW5lKHRydWUpO1xyXG5cclxuICAgIGlmIChsaW5lIDwgMCkge1xyXG4gICAgICBsaW5lID0gMDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLlN1cHBvcnRzRGF0YVNvdXJjZSgpKSB7XHJcbiAgICAgIGxldCBkYXRhVmlldzogR3VpRGF0YVZpZXdCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkRhdGFWaWV3O1xyXG4gICAgICBsZXQgZGN2OiBEY1ZhbHVlcyA9IGRhdGFWaWV3LmdldERjVmFsdWVzKHRoaXMuX2RjVmFsSWQpO1xyXG4gICAgICBsZXQgZGlzcFZhbHM6IHN0cmluZ1tdID0gYXdhaXQgdGhpcy5nZXREaXNwVmFscyhsaW5lLCBleGVjQ29tcHV0ZUNob2ljZSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5faGFzVmFsaWRJdG1BbmREaXNwVmFsKSB7XHJcbiAgICAgICAgc2VsZWN0Q21kID0gTWdDb250cm9sQmFzZS5jb21iaW5lU3RyaW5nQXJyYXlzKGRpc3BWYWxzLCBkY3YuZ2V0RGlzcFZhbHMoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBzZWxlY3RDbWQgPSBhd2FpdCB0aGlzLmdldERpc3BWYWxzKGxpbmUsIGV4ZWNDb21wdXRlQ2hvaWNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JhbmdlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRPcmRlcmVkRGlzcExpc3Qoc2VsZWN0Q21kLCBsaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmVmcmVzaCB0aGUgaXRlbXMgbGlzdCBvZiB0aGUgc2VsZWN0aW9uIGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleGVjQ29tcHV0ZUNob2ljZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyByZWZyZXNoSXRtUmFuZ2UoZXhlY0NvbXB1dGVDaG9pY2U6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcblxyXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgZm9yIHNlbGVjdGlvbiBjb250cm9sLlxyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuU3VwcG9ydHNEYXRhU291cmNlKCkpO1xyXG4gICAgbGV0IG9yZGVyZWRJdG1MaXN0OiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KDApO1xyXG4gICAgbGV0IGxpbmU6IG51bWJlciA9IHRoaXMuZ2V0RGlzcGxheUxpbmUoZmFsc2UpO1xyXG4gICAgaWYgKGxpbmUgPCAwKSB7XHJcbiAgICAgIGxpbmUgPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKGV4ZWNDb21wdXRlQ2hvaWNlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZUNob2ljZShsaW5lKTtcclxuICAgIH1cclxuICAgIGxldCBsaW5rVmFsczogc3RyaW5nW10gPSB0aGlzLl9jaG9pY2VMaW5rcy5nZXRfSXRlbShsaW5lKTtcclxuICAgIGxldCBkYXRhVmlldzogR3VpRGF0YVZpZXdCYXNlID0gdGhpcy5nZXRGb3JtKCkuZ2V0VGFzaygpLkRhdGFWaWV3O1xyXG4gICAgbGV0IGRjdjogRGNWYWx1ZXMgPSBkYXRhVmlldy5nZXREY1ZhbHVlcyh0aGlzLl9kY1ZhbElkKTtcclxuICAgIGlmICh0aGlzLl9oYXNWYWxpZEl0bUFuZERpc3BWYWwpIHtcclxuICAgICAgb3JkZXJlZEl0bUxpc3QgPSBNZ0NvbnRyb2xCYXNlLmNvbWJpbmVTdHJpbmdBcnJheXMobGlua1ZhbHMsIGRjdi5HZXRMaW5rVmFscygpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRPcmRlcmVkRGlzcExpc3Qob3JkZXJlZEl0bUxpc3QsIGxpbmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGl0ZW1zIHZhbHVlcyBmcm9tIGRhdGEgc291cmNlICYgaXRlbSBsaXN0IHByb3BlcnR5LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBHZXRJdGVtc1JhbmdlKCk6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlZnJlc2hJdG1SYW5nZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgZGlzcGxheSB2YWx1ZXMgZnJvbSBkYXRhIHNvdXJjZSAmIGRpc3BsYXkgbGlzdCBwcm9wZXJ0eS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgR2V0RGlzcGxheVJhbmdlKCk6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlZnJlc2hEaXNwUmFuZ2UoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGNyZWF0ZURlZmF1bHRQcm9wcygpIHtcclxuICAgIHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9WSVNJQkxFKTtcclxuXHJcbiAgICAvLyBGaXhlZCBidWcjOjc4MTc0MVxyXG4gICAgLy8gaW4gMS45IC0tPlxyXG4gICAgLy8gd2hlbiBhc2sgYWJvdXQgYW55IHByb3BlcnR5KFBST1BfVFlQRV9FTkFCTEVEKSB3ZSB3YXMgY3JlYXRlZCB0aGUgZGVmYXVsdCBwcm9wZXJ0eSB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlKHRydWUpLlxyXG4gICAgLy8gYW5kIHdoZW4gZ2V0IHRvIFJlZnJlc2hQcm9wcyBvZiB0aGUgcHJvcGVydHkgXCJQUk9QX1RZUEVfRU5BQkxFRFwiIHdlIHdhcyBhZGQgY29tbWFuZCB0byB0aGUgcXVldWUgaW4gZ3VpIHRocmVhZFxyXG4gICAgLy8gdGhlIGNvbW1hbmQgd2FzIHdhcyB1cGRhdGUgdGhlIFRhZ0RhdGEuRW5hYmxlIHRvIGJlIFwidHJ1ZVwiXHJcbiAgICAvLyBpbiAyLjAgLS0+XHJcbiAgICAvLyB3ZSB1c2VpbmcgYSBuZXcgbWV0aG9kIEdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KCkgdGhhdCBub3QgY3JlYXRlZCBhbnkgZGVmYXVsdCBwcm9wZXJ0eSBhbmQgbm8gZ2V0IHRvIHJlZnJlc2hQcm9wXHJcbiAgICAvLyBvbiB0aGUgcHJvcGVydHkgYW5kIHRoZSB2YWx1ZSBvbiB0aGUgQ29udHJvbC5FbmFibGUgd2FzIHdyb25nXHJcbiAgICB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRU5BQkxFRCk7XHJcblxyXG4gICAgaWYgKHN1cGVyLmlzVGFibGVDb250cm9sKCkpIHtcclxuICAgICAgdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NDUk9MTF9CQVIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgTGlua2VkIFBhcmVudCBJZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmtlZFBhcmVudERpdElkeFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBzZXRMaW5rZWRQYXJlbnRJZHgobGlua2VkUGFyZW50RGl0SWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2xpbmtlZFBhcmVudERpdElkeCA9IGxpbmtlZFBhcmVudERpdElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHZhbGlkYXRpb24gZGV0YWlscyBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib2xkVmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYnVpbGRQaWN0dXJlKG9sZFZhbDogYW55LCB2YWw6IGFueSk6IFZhbGlkYXRpb25EZXRhaWxzIHtcclxuXHJcbiAgICBpZiAoc3VwZXIuaXNUYWJsZUNvbnRyb2woKSB8fCBzdXBlci5pc0NvbHVtbkNvbnRyb2woKSlcclxuICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BpY0V4cEV4aXN0cykge1xyXG4gICAgICB0aGlzLl92ZCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fdmQgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fdmQgPSBuZXcgVmFsaWRhdGlvbkRldGFpbHMob2xkVmFsLCB2YWwsIHRoaXMuX3JhbmdlLCB0aGlzLl9waWMsIHRoaXMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX3ZkLnNldFZhbHVlKHZhbCk7XHJcbiAgICAgIHRoaXMuX3ZkLnNldE9sZFZhbHVlKG9sZFZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3ZkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENoZWNrcyBpZiB0aGUgc2VudCB2YWx1ZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgY29udHJvbCdzIGV4aXN0aW5nIHZhbHVlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJOZXdWYWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjaGVja051bGxWYWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0RpZmZlcmVudFZhbHVlKG5ld1ZhbHVlOiBhbnksIGlzTnVsbDogYm9vbGVhbiwgY2hlY2tOdWxsVmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuXHJcbiAgICBsZXQgY3RybEN1cnJWYWx1ZTogYW55ID0gdGhpcy5WYWx1ZTtcclxuICAgIGxldCB2YWxDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICBpZiAodGhpcy5EYXRhVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5EQVRFKVxyXG4gICAgICAgIHZhbENoYW5nZWQgPSAhdGhpcy5Db21wYXJlRGF0ZShuZXdWYWx1ZSwgY3RybEN1cnJWYWx1ZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB2YWxDaGFuZ2VkID0gIXRoaXMuQ29tcGFyZVRpbWUobmV3VmFsdWUsIGN0cmxDdXJyVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgbmV3VmFsdWUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgbmV3VmFsdWUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uQ3RybCgpICYmIHR5cGVvZiBjdHJsQ3VyclZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGxldCBuZXdWYWx1ZXN0ciA9IG5ld1ZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9IChuZXdWYWx1ZXN0ciAhPT0gY3RybEN1cnJWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9IChuZXdWYWx1ZSAhPT0gY3RybEN1cnJWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGlvbkN0cmwoKSAmJiB0eXBlb2YgY3RybEN1cnJWYWx1ZSA9PT0gJ3N0cmluZycgJiYgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkpIHtcclxuICAgICAgICBsZXQgbmV3VmFsdWVTdHIgPSBuZXdWYWx1ZS5qb2luKCcsJykudG9TdHJpbmcoKTtcclxuICAgICAgICB2YWxDaGFuZ2VkID0gIShTdHJVdGlsLnJ0cmltKG5ld1ZhbHVlU3RyKSA9PT0gU3RyVXRpbC5ydHJpbShjdHJsQ3VyclZhbHVlKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IGN0cmxDdXJySXNOdWxsOiBib29sZWFuID0gdGhpcy5Jc051bGw7XHJcbiAgICAgICAgdmFsQ2hhbmdlZCA9ICEoU3RyVXRpbC5ydHJpbShuZXdWYWx1ZSkgPT09IFN0clV0aWwucnRyaW0oY3RybEN1cnJWYWx1ZSkpO1xyXG4gICAgICAgIGlmICghdmFsQ2hhbmdlZCAmJiBjaGVja051bGxWYWx1ZSkge1xyXG4gICAgICAgICAgdmFsQ2hhbmdlZCA9IChpc051bGwgIT09IGN0cmxDdXJySXNOdWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxDaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgQ29tcGFyZURhdGUoZDE6IERhdGUsIGQyOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0dmFsOiBib29sZWFuO1xyXG4gICAgaWYgKGQxID09PSBudWxsICYmIGQyID09PSBudWxsKVxyXG4gICAgICByZXR2YWwgPSB0cnVlO1xyXG4gICAgZWxzZSBpZiAoKGQxID09PSBudWxsICYmIGQyICE9PSBudWxsKSB8fCAoZDEgIT09IG51bGwgJiYgZDIgPT09IG51bGwpKVxyXG4gICAgICByZXR2YWwgPSBmYWxzZTtcclxuICAgIGVsc2UgaWYgKGQxLmdldEZ1bGxZZWFyKCkgPT09IGQyLmdldEZ1bGxZZWFyKClcclxuICAgICAgJiYgZDEuZ2V0RGF0ZSgpID09PSBkMi5nZXREYXRlKClcclxuICAgICAgJiYgZDEuZ2V0TW9udGgoKSA9PT0gZDIuZ2V0TW9udGgoKSlcclxuICAgICAgcmV0dmFsID0gdHJ1ZTtcclxuICAgIHJldHVybiByZXR2YWw7XHJcbiAgfVxyXG5cclxuICBDb21wYXJlVGltZShkMTogRGF0ZSwgZDI6IERhdGUpOiBib29sZWFuIHtcclxuICAgIGxldCByZXR2YWw6IGJvb2xlYW47XHJcbiAgICBpZiAoZDEgPT09IG51bGwgJiYgZDIgPT09IG51bGwpXHJcbiAgICAgIHJldHZhbCA9IHRydWU7XHJcbiAgICBlbHNlIGlmICgoZDEgPT09IG51bGwgJiYgZDIgIT09IG51bGwpIHx8IChkMSAhPT0gbnVsbCAmJiBkMiA9PT0gbnVsbCkpXHJcbiAgICAgIHJldHZhbCA9IGZhbHNlO1xyXG4gICAgZWxzZSBpZiAoZDEuZ2V0SG91cnMoKSA9PT0gZDIuZ2V0SG91cnMoKVxyXG4gICAgICAmJiBkMS5nZXRNaW51dGVzKCkgPT09IGQyLmdldE1pbnV0ZXMoKVxyXG4gICAgICAmJiBkMS5nZXRTZWNvbmRzKCkgPT09IGQyLmdldFNlY29uZHMoKSlcclxuICAgICAgcmV0dmFsID0gdHJ1ZTtcclxuICAgIHJldHVybiByZXR2YWw7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBjb2x1bW4ncyBzb3J0YWJsZSBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0NvbHVtblNvcnRhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzU29ydGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4gJiYgdGhpcy5fcHJvcFRhYi5wcm9wRXhpc3RzKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NPUlRfQ09MVU1OKSkge1xyXG4gICAgICBpc1NvcnRhYmxlID0gdGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NPUlRfQ09MVU1OKS5HZXRDb21wdXRlZFZhbHVlQm9vbGVhbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpc1NvcnRhYmxlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgZmlyc3QgY2hpbGQgTWdDb250cm9sIG9mIGNvbHVtbiBpLmUuIGZpZWxkIGF0dGFjaGVkIHRvIGNvbHVtblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuXHJcbiAgZ2V0Q29sdW1uQ2hpbGRDb250cm9sKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgaWYgKHRoaXMuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfQ09MVU1OKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBsZXQgbGlua2VkQ29udHJvbHM6IExpc3Q8TWdDb250cm9sQmFzZT4gPSB0aGlzLl9wYXJlbnRUYWJsZS5nZXRMaW5rZWRDb250cm9scygpO1xyXG5cclxuICAgIHJldHVybiBsaW5rZWRDb250cm9scy5maW5kKChjb250cm9sOiBNZ0NvbnRyb2xCYXNlKSA9PiAoY29udHJvbC5nZXRMYXllcigpID09PSB0aGlzLmdldExheWVyKCkgJiYgY29udHJvbC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4gJiYgIWNvbnRyb2wuSXNUYWJsZUhlYWRlckNoaWxkKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgR2V0IGNvbnRyb2wgbmFtZSBmb3IgaGFuZGxlciBzZWFyY2ggcHJvcG9zZS5cclxuICAvLy8gICBUaGUgY29udHJvbCBpdHNlbGYsIG1heSBub3QgaGF2ZSBhIG5hbWUgZm9yIGhhbmRsZXIgc2VhcmNoIChsaWtlIGNvbHVtbiBjb250cm9sLCBpbiB3aGljaCB3ZSBuZWVkIHRvIHVzZVxyXG4gIC8vLyAgIHRoZSBjaGlsZCBjb250cm9sIG5hbWUgZm9yIGhhbmRsZXJzIHNlYXJjaClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q29udHJvbE5hbWVGb3JIYW5kbGVyU2VhcmNoKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgY2hpbGRDb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5nZXRDb2x1bW5DaGlsZENvbnRyb2woKTtcclxuICAgIGxldCBuYW1lOiBzdHJpbmc7XHJcbiAgICBpZiAoY2hpbGRDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBjaGlsZENvbnRyb2wuTmFtZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgYSBjb250cm9sIHRvIHRoZSBsaXN0IG9mIGxpbmtlZCBjb250cm9sc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBsaW5rQ3RybChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9saW5rZWRDb250cm9scy5wdXNoKGN0cmwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGlzIGNvbnRyb2wgZnJvbSB0aGUgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlbW92ZVJlZkZyb21GaWVsZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9maWVsZC5SZW1vdmVDb250cm9sKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGRpdCBpbmRleCBvZiB0aGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RGl0SWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGl0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzZXRzIGRjVmFsSWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImRjVmFsSWRcIj48L3BhcmFtPlxyXG4gIHNldERjVmFsSWQoZGNWYWxJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kY1ZhbElkID0gZGNWYWxJZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpZiB0aGUgcGljdHVyZSBkZWZpbmUgYXMgaGVicmV3IHRoZW4gc2V0IHRoZSBsYW5nIHRvIGhlYnJldywgb3RoZXJ3aXNlIHJlc3RvcmUgdGhlIGxhbmdcclxuICAvLy8gICBUaGUgc2FtZSB3ZSBkb2luZyBmb3Igb25saW5lIDplZHRfZWRpdC5jcHAgOiBTZXRLZXlib2FyZExhbmd1YWdlKClcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVzdG9yZUxhbmdcIj48L3BhcmFtPlxyXG4gIFNldEtleWJvYXJkTGFuZ3VhZ2UocmVzdG9yZUxhbmc6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluaXRpYWxpemUgY29udHJvbCBwcm9wZXJ0aWVzIGZvciBkZXJpdmVkIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBJbml0KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PihpbnRlcm5hbClcclxuICAvLy8gY2hlY2tzIGlmIGNvbnRyb2wgaXMgcGFya2FibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgSXNQYXJrYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmlzUGFya2FibGUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+KGludGVybmFsKVxyXG4gIC8vLyBjaGVja3MgaWYgY29udHJvbCBoYXMgZXhwcmVzc2lvbiBvciBQYXJlbnQgdGFzayBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBIYXNFeHBPclBhcmVudFRhc2tGaWVsZCgpOiBib29sZWFuIHtcclxuICAgIGxldCB0YXNrOiBHdWlUYXNrQmFzZSA9IHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKTtcclxuICAgIHJldHVybiAodGhpcy5nZXRGaWVsZCgpID09PSBudWxsIHx8IHRoaXMuZ2V0RmllbGQoKS5nZXRUYXNrKCkgIT09IHRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29udHJvbCBpcyBwYXJrYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja0VuYWJsZWRBbmRWaXNpYmxlXCI+Y2hlY2sgZW5hYmxlZCBhbmQgdmlzaWJsZSBwcm9wZXJ0aWVzIHRvbzwvcGFyYW0+XHJcbiAgYXN5bmMgaXNQYXJrYWJsZShjaGVja0VuYWJsZWRBbmRWaXNpYmxlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcblxyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbjtcclxuICAgIHJlc3VsdCA9ICFzdXBlci5pc1RhYmxlQ29udHJvbCgpICYmICFzdXBlci5pc0NvbHVtbkNvbnRyb2woKTtcclxuXHJcbiAgICBsZXQgdGFzazogR3VpVGFza0Jhc2UgPSB0aGlzLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAvLyBub24gaW50ZXJhY3RpdmUgLT4gbm90IHBhcmthYmxlLlxyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICByZXN1bHQgPSB0YXNrLklzSW50ZXJhY3RpdmU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdCAmJiB0YXNrLkRhdGFWaWV3LmlzRW1wdHlEYXRhdmlldygpICYmIHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIHRoaXMuX2ZpZWxkLlBhcnRPZkRhdGF2aWV3KSB7XHJcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAvLyBRQ1IgIzQ0MTE3Ny4gV2hlbiB3ZSBjaGVjayB0aGUgc3ViZm9ybSBwYXJrIGFiaWxpdHksIHdlIG5lZWQgdG8gY2hlY2sgYWxzbyBpdCdzIHZpc2liaWxpdHkgYW5kIGVuYWJsZSBwcm9wZXJ0aWVzLlxyXG4gICAgICBpZiAoIXN1cGVyLmlzU3ViZm9ybSgpKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSAoKHRoaXMuX2ZpZWxkICE9PSBudWxsICYmIHRoaXMuX2ZpZWxkLmdldFRhc2soKSA9PT0gdGFzaykgfHwgdGhpcy5pc0J1dHRvbigpIHx8IHN1cGVyLmlzQnJvd3NlckNvbnRyb2woKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlc3VsdCAmJiBjaGVja0VuYWJsZWRBbmRWaXNpYmxlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gKHRoaXMuaXNFbmFibGVkKCkgJiYgdGhpcy5pc1Zpc2libGUoKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgocmVzdWx0ICYmIHRoaXMuX3BhcmVudFRhYmxlICE9PSBudWxsKSAmJiBjaGVja0VuYWJsZWRBbmRWaXNpYmxlKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gKHRoaXMuX3BhcmVudFRhYmxlLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0VOQUJMRUQsIHRydWUpICYmIHRoaXMuX3BhcmVudFRhYmxlLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUsIHRydWUpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgd2hlbiBhY2Nlc3MgdG8gY29udHJvbCBuZWVkIHRvIHJlZnJlc2ggdGhlIGRlZmF1bHQgYnV0dG9uLFxyXG4gIC8vLyAgIFRoZSBkZWZpbml0aW9uOiBlYWNoIGZvcm1cXHN1YmZvcm0gaXMgZGVmYWluIGhpcyBkZWZhdWx0IGJ1dHRvbi5cclxuICAvLy8gICBpZiB3ZSBvbiBjb250cm9sIHRoZSBkZWZhdWx0IGJ1dHRvbiBvbiB0aGUgc2FtZSBjb250cm9sIGlzIHRoZSBkZWZhdWx0IGJ1dHRvbiBvbiB0aGUgZm9ybS5cclxuICAvLy8gICBpZiB3ZSBvbiBzdWJmb3JtOlxyXG4gIC8vLyAgIDEudGhlcmUgaXMgZGVmYXVsdCBidXR0b24gb24gdGhlIHN1YmZvcm0sIHRoaXMgYnV0dG9uIGlzIHRoZSBkZWZhdWx0IGJ1dHRvbiBvbiB0aGUgZm9ybVxyXG4gIC8vLyAgIDIudGhlcmUgaXMgTk8gZGVmYXVsdCBidXR0b24gb24gdGhlIHN1YmZvcm0gLCBubyBidXR0b24gd2lsbCBkZWZpbmUgYXMgZGVmYXVsdCBidXR0b24gb24gdGhlIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlZnJlc2hEZWZhdWx0QnV0dG9uKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5Gb3JtLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREVGQVVMVF9CVVRUT04pO1xyXG4gICAgYXdhaXQgcHJvcC5SZWZyZXNoRGlzcGxheSh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmFpc2UgQUNUX0NUUkxfSElUIG9uIGxlZnQgbW91c2UgY2xpY2sgaWYgaXQgbWVldHMgZm9sbG93aW5nIGNvbmRpdGlvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUmFpc2VDb250cm9sSGl0T25MZWZ0Q2xpY2tPZk1vdXNlRG93bigpOiBib29sZWFuIHtcclxuICAgIGxldCByYWlzZUN0cmxIaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICghc3VwZXIuSXNIeXBlclRleHRCdXR0b24oKSAmJiAhc3VwZXIuaXNSYWRpbygpICYmICFzdXBlci5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICByYWlzZUN0cmxIaXQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJhaXNlQ3RybEhpdDtcclxuICB9XHJcblxyXG4gIEdldFZhckluZGV4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgJ0NvbnRyb2wgSGl0JyBldmVudCBzaG91bGQgYmUgcmFpc2VkIG9uIG1vdXNlIGRvd24uXHJcbiAgLy8vIFRoZSBtZXRob2Qgd2FzIGV4dHJhY3RlZCBmcm9tIHByb2Nlc3NNb3VzZURvd24sIHNpbmNlIHdlIG1pZ2h0IGhhdmUgZGlmZmVyZW50XHJcbiAgLy8vIGJlaGF2aW9ycyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHRyZWUgY29udHJvbHMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZWZ0Q2xpY2tXYXNQcmVzc2VkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIFJhaXNlQ29udHJvbEhpdE9uTW91c2VEb3duKGxlZnRDbGlja1dhc1ByZXNzZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGxldCByYWlzZUN0cmxIaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChsZWZ0Q2xpY2tXYXNQcmVzc2VkKSB7XHJcbiAgICAgIGlmICh0aGlzLlJhaXNlQ29udHJvbEhpdE9uTGVmdENsaWNrT2ZNb3VzZURvd24oKSkge1xyXG4gICAgICAgIHJhaXNlQ3RybEhpdCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByYWlzZUN0cmxIaXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEhhbmRsZSBNR19BQ1RfSElUIG9uIHRoZSBzdWJmb3JtIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIE9uU3ViZm9ybUNsaWNrKCk6IHZvaWQge1xyXG4gICAgTWFuYWdlci5FdmVudHNNYW5hZ2VyLmFkZEd1aVRyaWdnZXJlZEV2ZW50V2l0aFRhc2tBbmRDb2RlKHRoaXMuZ2V0Rm9ybSgpLmdldFRhc2soKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0hJVCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgTWdGb3JtIG9mIHRoZSBzdWJmb3JtIGNvbnRyb2wgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgR2V0U3ViZm9ybU1nRm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUHJvcGVydHlFeGlzdHMoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb3BUYWIucHJvcEV4aXN0cyhpZCk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFwie1wiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgXCI6IFwiICsgTWdDb250cm9sVHlwZVt0aGlzLlR5cGVdICsgXCJ9XCI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENoZWNrcyBpZiBuZXcgZGF0ZSBpcyAwPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlXCI+IFRoZSB2YWx1ZSB0byBjaGVjazwvcGFyYW0+XHJcbiAgaXNEYXRlWmVybyh2YWw6IERhdGUpIHtcclxuICAgIGxldCB6ZXJvRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgaWYgKHZhbC5nZXRNb250aCgpID09PSAwICYmIHZhbC5nZXRGdWxsWWVhcigpID09PSAwICYmIHZhbC5nZXREYXkoKSA9PT0gMClcclxuICAgICAgICB6ZXJvRGF0ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gemVyb0RhdGU7XHJcbiAgfVxyXG5cclxuICBJc0RlZmF1bHRSb3V0ZXJPdXRsZXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfU1VCRk9STSAmJiB0aGlzLkdldENvbXB1dGVkQm9vbGVhblByb3BlcnR5XzAoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfREVGQVVMVF9PVVRMRVQsIGZhbHNlKSk7XHJcbiAgfVxyXG5cclxuICBJc1JvdXRlck91dGxldCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9TVUJGT1JNICYmIHRoaXMuR2V0Q29tcHV0ZWRCb29sZWFuUHJvcGVydHlfMChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9JU19ST1VURVJfT1VUTEVULCBmYWxzZSkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgWm9vbUJ1dHRvbkluaXRpYWxpemF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuaXNUZXh0Q29udHJvbCgpICYmIHRoaXMuY2hlY2tJZkV4aXN0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05ORUNURURfWk9PTV9DT05UUk9MKSlcclxuICAgIHtcclxuICAgICAgbGV0IGNvbm5lY3RlZEJ1dHRvbjogTWdDb250cm9sQmFzZSA9IHRoaXMuRm9ybS5DdHJsVGFiLkdldENvbnRyb2xCeUlzbigoYXdhaXQgKGF3YWl0IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9DT05ORUNURURfWk9PTV9DT05UUk9MKSkuZ2V0VmFsdWVJbnQoKSkpO1xyXG5cclxuICAgICAgLy8gaW1hZ2UgYnV0dG9uIC0gY2FsY3VsYXRlIGFjY29yZGluZyB0byBpbWFnZVxyXG4gICAgICBsZXQgaW1hZ2VGaWxlTmFtZSA6IHN0cmluZyAgPSBudWxsO1xyXG4gICAgICBpZiAoY29ubmVjdGVkQnV0dG9uLklzSW1hZ2VCdXR0b24oKSAmJiBjb25uZWN0ZWRCdXR0b24uUHJvcGVydHlFeGlzdHMoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfSU1BR0VfRklMRU5BTUUpKVxyXG4gICAgICB7XHJcbiAgICAgICAgaW1hZ2VGaWxlTmFtZSA9IGF3YWl0KGF3YWl0IGNvbm5lY3RlZEJ1dHRvbi5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lNQUdFX0ZJTEVOQU1FKSkuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoIU1pc2MuSXNXZWJVcmwoaW1hZ2VGaWxlTmFtZSkpXHJcbiAgICAgICAgICBpbWFnZUZpbGVOYW1lID0gXCIuL2Fzc2V0cy9pbWFnZXMvXCIgKyBpbWFnZUZpbGVOYW1lO1xyXG4gICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfU1RZTEUsIHRoaXMsIDAsIE1hZ2ljUHJvcGVydGllcy5JbWFnZUZpbGUsIGltYWdlRmlsZU5hbWUpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc3RvcmUgdGhlIGVkaXQgY29udHJvbCBvbiB0aGUgYnV0dG9uXHJcbiAgICAgIHRoaXMuQ29ubmVjdGVkQ29udHJvbCA9IGNvbm5lY3RlZEJ1dHRvbjtcclxuICAgICAgY29ubmVjdGVkQnV0dG9uLkNvbm5lY3RlZENvbnRyb2wgPSB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=