@magic-xpa/gui 4.1200.0-dev4120.21 → 4.1200.0-dev4120.213

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/fesm2022/magic-xpa-gui.mjs +5724 -249
  2. package/fesm2022/magic-xpa-gui.mjs.map +1 -1
  3. package/index.d.ts +3 -0
  4. package/package.json +2 -4
  5. package/src/GuiEnums.d.ts +3 -0
  6. package/src/gui/GuiMgControl.d.ts +1 -0
  7. package/src/management/exp/ExpressionInterface.d.ts +1 -0
  8. package/src/management/gui/MgControlBase.d.ts +1 -1
  9. package/src/management/gui/PropInterface.d.ts +2 -1
  10. package/esm2022/index.mjs +0 -71
  11. package/esm2022/magic-xpa-gui.mjs +0 -2
  12. package/esm2022/src/Commands.mjs +0 -184
  13. package/esm2022/src/Events.mjs +0 -425
  14. package/esm2022/src/EventsProcessor.mjs +0 -67
  15. package/esm2022/src/FocusManager.mjs +0 -34
  16. package/esm2022/src/GuiConstants.mjs +0 -68
  17. package/esm2022/src/GuiEnums.mjs +0 -301
  18. package/esm2022/src/GuiEnvironment.mjs +0 -4
  19. package/esm2022/src/IFlowMonitorQueue.mjs +0 -2
  20. package/esm2022/src/Manager.mjs +0 -91
  21. package/esm2022/src/UIBridge.mjs +0 -33
  22. package/esm2022/src/env/IEnvironment.mjs +0 -2
  23. package/esm2022/src/gui/ControlBase.mjs +0 -3
  24. package/esm2022/src/gui/GuiMgControl.mjs +0 -123
  25. package/esm2022/src/gui/GuiMgForm.mjs +0 -4
  26. package/esm2022/src/gui/KeyboardItem.mjs +0 -135
  27. package/esm2022/src/gui/LastFocusedVal.mjs +0 -11
  28. package/esm2022/src/gui/MgValue.mjs +0 -16
  29. package/esm2022/src/gui/PropParentInterface.mjs +0 -2
  30. package/esm2022/src/gui/low/DialogHandler.mjs +0 -7
  31. package/esm2022/src/gui/low/GuiCommand.mjs +0 -68
  32. package/esm2022/src/gui/low/GuiCommandQueue.mjs +0 -35
  33. package/esm2022/src/gui/low/GuiInteractive.mjs +0 -178
  34. package/esm2022/src/gui/low/Style.mjs +0 -20
  35. package/esm2022/src/management/RuntimeContextBase.mjs +0 -42
  36. package/esm2022/src/management/data/BlobType.mjs +0 -281
  37. package/esm2022/src/management/data/DcValues.mjs +0 -214
  38. package/esm2022/src/management/data/DcValuesBuilderBase.mjs +0 -96
  39. package/esm2022/src/management/data/FieldDef.mjs +0 -331
  40. package/esm2022/src/management/data/FieldsTable.mjs +0 -54
  41. package/esm2022/src/management/data/GuiDataViewBase.mjs +0 -88
  42. package/esm2022/src/management/data/GuiFieldBase.mjs +0 -82
  43. package/esm2022/src/management/data/IRecord.mjs +0 -2
  44. package/esm2022/src/management/data/IReferencedObject.mjs +0 -2
  45. package/esm2022/src/management/data/NUM_TYPE.mjs +0 -1739
  46. package/esm2022/src/management/data/ObjectReferenceBase.mjs +0 -48
  47. package/esm2022/src/management/data/ObjectReferencesCollection.mjs +0 -27
  48. package/esm2022/src/management/data/RecordUtils.mjs +0 -361
  49. package/esm2022/src/management/data/VectorType.mjs +0 -612
  50. package/esm2022/src/management/data/VectorTypeBase.mjs +0 -88
  51. package/esm2022/src/management/events/IActionManager.mjs +0 -2
  52. package/esm2022/src/management/events/IGuiEventsManager.mjs +0 -2
  53. package/esm2022/src/management/exp/ExpressionInterface.mjs +0 -244
  54. package/esm2022/src/management/exp/GuiExpressionEvaluator.mjs +0 -305
  55. package/esm2022/src/management/gui/ControlTable.mjs +0 -118
  56. package/esm2022/src/management/gui/DisplayConvertor.mjs +0 -1649
  57. package/esm2022/src/management/gui/FieldValidator.mjs +0 -711
  58. package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +0 -24
  59. package/esm2022/src/management/gui/GuiFormPropertyAdapter.mjs +0 -11
  60. package/esm2022/src/management/gui/HebrewDate.mjs +0 -278
  61. package/esm2022/src/management/gui/Helps.mjs +0 -237
  62. package/esm2022/src/management/gui/MgControlBase.mjs +0 -1869
  63. package/esm2022/src/management/gui/MgFormBase.mjs +0 -741
  64. package/esm2022/src/management/gui/PIC.mjs +0 -1185
  65. package/esm2022/src/management/gui/PropDefaults.mjs +0 -230
  66. package/esm2022/src/management/gui/PropInterface.mjs +0 -246
  67. package/esm2022/src/management/gui/PropTable.mjs +0 -221
  68. package/esm2022/src/management/gui/Property.mjs +0 -1362
  69. package/esm2022/src/management/gui/ValidationDetails.mjs +0 -248
  70. package/esm2022/src/management/gui/ValidationDetailsBase.mjs +0 -93
  71. package/esm2022/src/management/gui/WrongFormatException.mjs +0 -29
  72. package/esm2022/src/management/tasks/GuiDataCollection.mjs +0 -4
  73. package/esm2022/src/management/tasks/GuiTaskBase.mjs +0 -511
  74. package/esm2022/src/management/tasks/IMGDataTable.mjs +0 -2
  75. package/esm2022/src/management/tasks/ITask.mjs +0 -2
  76. package/esm2022/src/management/tasks/MgTimer.mjs +0 -21
  77. package/esm2022/src/management/tasks/TaskDefinitionId.mjs +0 -54
  78. package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
  79. package/esm2022/src/util/MemoryUtil.mjs +0 -35
  80. package/esm2022/src/util/ObjectReference.mjs +0 -36
  81. package/esm2022/src/util/UsernamePasswordCredentials.mjs +0 -52
@@ -1,741 +0,0 @@
1
- import { Constants, Logger_LogLevels, MgControlType, StorageAttribute, StrUtil, TabbingOrderType, WindowType, XMLConstants, XmlParser } from '@magic-xpa/utils';
2
- import { Debug, Int32, List, NString, Stack, StringBuilder } from '@magic-xpa/mscorelib';
3
- import { MgControlBase } from './MgControlBase';
4
- import { PropTable } from './PropTable';
5
- import { ControlTable } from './ControlTable';
6
- import { Manager } from '../../Manager';
7
- import { Events } from '../../Events';
8
- import { Property } from './Property';
9
- import { CommandType, HtmlProperties } from '../../GuiEnums';
10
- import { NUM_TYPE } from '../data/NUM_TYPE';
11
- import { Commands } from '../../Commands';
12
- import { PropInterface } from './PropInterface';
13
- import { GuiConstants } from '../../GuiConstants';
14
- import { GuiFormPropertyAdapter } from './GuiFormPropertyAdapter';
15
- const delimiter = ', ';
16
- export class MgFormBase extends GuiFormPropertyAdapter {
17
- InInitForm = false;
18
- CtrlTab = null;
19
- FormRefreshed = false;
20
- RefreshRepeatableAllowed = false;
21
- Rows = null;
22
- ModalFormsCount = 0;
23
- ErrorOccured = false;
24
- FormIsn = 0;
25
- Name = null;
26
- Opened = false;
27
- isLegalForm = false;
28
- PBImagesNumber = 0;
29
- ignoreFirstRefreshTable = false;
30
- ParentForm = null;
31
- _destTblRow = Int32.MinValue;
32
- _firstTableTabOrder = 0;
33
- _inRefreshDisp = false;
34
- _inRestore = false;
35
- _lastRowSent = -1;
36
- _prevGuiTopIndex = -1;
37
- _propTab = null;
38
- _rowsInPage = 1;
39
- _maxRowsInPaginatedTable = 0;
40
- _subFormCtrl = null;
41
- _tableMgControl = null;
42
- _tableItemsCount = 0;
43
- _tableRefreshed = false;
44
- _task = null;
45
- _topIndexUpdated = false;
46
- _transferingData = false;
47
- _allowedSubformRecompute = true;
48
- _concreteWindowType;
49
- _containerCtrl = null;
50
- _firstRefreshOfProps = true;
51
- _prevSelIndex = -1;
52
- _shouldCreateToolbar = false;
53
- _tableChildren = null;
54
- _tableColumns = null;
55
- _userStateId = '';
56
- displayLine = 0;
57
- constructor() {
58
- super();
59
- this._propTab = new PropTable(this);
60
- this.CtrlTab = new ControlTable();
61
- this.Rows = new List();
62
- this._concreteWindowType = 0;
63
- this.ParentForm = null;
64
- }
65
- get DisplayLine() {
66
- return this.displayLine;
67
- }
68
- set DisplayLine(value) {
69
- this.displayLine = value;
70
- }
71
- get UniqueName() {
72
- if (this.GetComputedProperty(PropInterface.PROP_TYPE_FORM_NAME) != null)
73
- return this.GetComputedProperty(PropInterface.PROP_TYPE_FORM_NAME).GetComputedValue();
74
- else
75
- return null;
76
- }
77
- get TaskTag() {
78
- return this.getTask().getTaskTag();
79
- }
80
- get TableChildren() {
81
- if (this._tableChildren === null)
82
- this.buildTableChildren();
83
- return this._tableChildren;
84
- }
85
- set TableChildren(value) {
86
- this._tableChildren = value;
87
- }
88
- get ShouldCreateToolbar() {
89
- return this._shouldCreateToolbar;
90
- }
91
- get AllowedSubformRecompute() {
92
- return this._allowedSubformRecompute;
93
- }
94
- set AllowedSubformRecompute(value) {
95
- this._allowedSubformRecompute = value;
96
- }
97
- get ConcreteWindowType() {
98
- if (this._concreteWindowType === 0) {
99
- let windowType = this.GetComputedProperty(PropInterface.PROP_TYPE_WINDOW_TYPE).GetComputedValueInteger();
100
- if (this.ParentForm === null || windowType !== WindowType.Overlay)
101
- windowType = WindowType.Default;
102
- this._concreteWindowType = windowType;
103
- }
104
- return this._concreteWindowType;
105
- }
106
- set ConcreteWindowType(value) {
107
- this._concreteWindowType = value;
108
- }
109
- static ShouldPutActOnFormClose() {
110
- return false;
111
- }
112
- static ShouldBehaveAsModal() {
113
- return false;
114
- }
115
- static ConvertArrayListToString(items, isItemNumType) {
116
- let from = ['\\', '-', ','];
117
- let to = ['\\\\', '\\-', '\\,'];
118
- let stringBuilder = new StringBuilder();
119
- let nUM_TYPE;
120
- for (let index = 0; index < items.length; index = index + 1) {
121
- if (isItemNumType) {
122
- nUM_TYPE = new NUM_TYPE(items.get_Item(index));
123
- items.set_Item(index, nUM_TYPE.to_double().toString());
124
- }
125
- stringBuilder.Append(StrUtil.searchAndReplace(items.get_Item(index), from, to));
126
- if (index < items.length - 1)
127
- stringBuilder.Append(delimiter);
128
- }
129
- return stringBuilder.ToString();
130
- }
131
- UpdateModalFormsCount(mgFormBase, increase) {
132
- if (increase)
133
- this.ModalFormsCount += 1;
134
- else
135
- this.ModalFormsCount -= 1;
136
- Events.SetModal(mgFormBase, increase);
137
- }
138
- async EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, alwaysEvaluate, wasEvaluated) {
139
- return await this._task.EvaluateExpression(expId, resType, length, contentTypeUnicode, resCellType, true, wasEvaluated);
140
- }
141
- GetExpressionStorage(expId) {
142
- return this._task.GetExpressionStorage(expId);
143
- }
144
- checkIfExistProp(propId) {
145
- let exist = false;
146
- if (this._propTab !== null) {
147
- let propById = this._propTab.getPropById(propId);
148
- exist = (propById !== null);
149
- }
150
- return exist;
151
- }
152
- getProp(propId) {
153
- let prop = null;
154
- if (this._propTab !== null) {
155
- prop = this._propTab.getPropById(propId);
156
- if (prop === null) {
157
- prop = Property.getDefaultProp(propId, GuiConstants.PARENT_TYPE_FORM, this);
158
- if (prop !== null)
159
- this._propTab.addProp(prop);
160
- }
161
- }
162
- return prop;
163
- }
164
- GetComputedProperty(propId) {
165
- let prop = null;
166
- if (this._propTab !== null)
167
- prop = this._propTab.getPropById(propId);
168
- return prop;
169
- }
170
- PropertyHasExpression(propId) {
171
- let prop = this._propTab.getPropById(propId);
172
- return prop !== null && prop.isExpression();
173
- }
174
- getCompIdx() {
175
- return (this.getTask() === null) ? 0 : this.getTask().getCompIdx();
176
- }
177
- IsFirstRefreshOfProps() {
178
- return this._firstRefreshOfProps;
179
- }
180
- getForm() {
181
- return this;
182
- }
183
- fillData(taskRef) {
184
- let parser = Manager.GetCurrentRuntimeContext().Parser;
185
- if (this._task === null && taskRef !== null)
186
- this._task = taskRef;
187
- while (this.initInnerObjects(parser.getNextTag())) {
188
- }
189
- }
190
- async init() {
191
- for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
192
- let ctrl = this.CtrlTab.getCtrl(i);
193
- ctrl.Init();
194
- }
195
- this.buildLinkedControlsLists();
196
- this.buildTableColumnsList();
197
- await this.createForm();
198
- this._task.setKeyboardMappingState(Constants.ACT_STT_TBL_SCREEN_MODE, this.isScreenMode());
199
- this._task.setKeyboardMappingState(Constants.ACT_STT_TBL_LEFT_TO_RIGHT, !this.GetComputedProperty(PropInterface.PROP_TYPE_HEBREW).GetComputedValueBoolean());
200
- }
201
- fillName(formTag) {
202
- let parser = Manager.GetCurrentRuntimeContext().Parser;
203
- let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
204
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
205
- let tag = parser.getXMLsubstring(endContext);
206
- parser.add2CurrIndex(tag.indexOf(formTag) + formTag.length);
207
- let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
208
- let attribute;
209
- let valueStr;
210
- for (let i = 0; i < tokensVector.length; i = i + 2) {
211
- attribute = tokensVector.get_Item(i);
212
- valueStr = tokensVector.get_Item(i + 1);
213
- switch (attribute) {
214
- case XMLConstants.MG_ATTR_NAME:
215
- this.Name = XmlParser.unescape(valueStr).toString();
216
- if (Events.ShouldLog(Logger_LogLevels.Gui))
217
- Events.WriteGuiToLog(NString.Format('Parsing form "{0}"', this.Name));
218
- break;
219
- case XMLConstants.MG_ATTR_IS_FRAMESET:
220
- break;
221
- case XMLConstants.MG_ATTR_IS_LIGAL_RC_FORM:
222
- this.isLegalForm = XmlParser.getBoolean(valueStr);
223
- break;
224
- case XMLConstants.MG_ATTR_PB_IMAGES_NUMBER:
225
- this.PBImagesNumber = XmlParser.getInt(valueStr);
226
- break;
227
- case XMLConstants.MG_ATTR_FORM_ISN:
228
- this.FormIsn = XmlParser.getInt(valueStr);
229
- break;
230
- case XMLConstants.MG_ATTR_USERSTATE_ID:
231
- this._userStateId = XmlParser.unescape(valueStr).toString();
232
- break;
233
- default:
234
- Events.WriteExceptionToLog(NString.Format('Unhandled attribute \'{0}\'.', attribute));
235
- break;
236
- }
237
- }
238
- parser.setCurrIndex(endContext + 1);
239
- return;
240
- }
241
- Events.WriteExceptionToLog('in Form.FillName() out of bounds');
242
- }
243
- async createForm() {
244
- let inputControls = this.GetListOfInputControls();
245
- let formName = this.buildFormName();
246
- if (!this.isSubForm()) {
247
- if (this.isDialog())
248
- await Commands.openOverlayForm(this, formName, '0', this.getTask().getTaskTag(), inputControls, this.isDialog());
249
- else
250
- Commands.addOpenForm(this, formName, '0', this.getTask().getTaskTag(), inputControls, this.isDialog());
251
- }
252
- else {
253
- Commands.addOpensubform(CommandType.CREATE_SUB_FORM, this.getSubFormCtrl(), this.getTask().getTaskTag(), this.getSubFormCtrl().getName(), formName, inputControls, this.getTask().RouterPath, this.getTask().GetRouterParams(), this.getTask().InDefaultRouterOutlet);
254
- }
255
- if (this.HasTable())
256
- this.InitTableControl();
257
- Commands.beginInvoke();
258
- }
259
- async CallJS(methodName, args) {
260
- return Commands.addCallJS(this, this.UniqueName, methodName, args);
261
- }
262
- isAutomaticTabbingOrder() {
263
- return this.GetComputedProperty(PropInterface.PROP_TYPE_TABBING_ORDER).GetComputedValueInteger() === TabbingOrderType.Automatically;
264
- }
265
- isRefreshRepeatableAllowed() {
266
- return this.RefreshRepeatableAllowed;
267
- }
268
- isScreenMode() {
269
- return !this.isLineMode();
270
- }
271
- isLineMode() {
272
- return this.getMainControl() !== null;
273
- }
274
- hasTable() {
275
- return this._tableMgControl !== null;
276
- }
277
- isDialog() {
278
- let isDialog = false;
279
- let windowType = this.ConcreteWindowType;
280
- if (windowType === WindowType.Overlay)
281
- isDialog = true;
282
- else if (MgFormBase.ShouldBehaveAsModal())
283
- isDialog = true;
284
- return isDialog;
285
- }
286
- isSubForm() {
287
- return this._subFormCtrl !== null;
288
- }
289
- HasTable() {
290
- return this._tableMgControl !== null;
291
- }
292
- getTopMostForm() {
293
- let topMostForm = this;
294
- while (topMostForm.isSubForm() && topMostForm.ParentForm !== null)
295
- topMostForm = topMostForm.ParentForm;
296
- return topMostForm;
297
- }
298
- getTopMostFrameForm() {
299
- let topMostForm = this;
300
- while (topMostForm !== null)
301
- topMostForm = ((topMostForm.ParentForm !== null) ? topMostForm.ParentForm : null);
302
- return topMostForm;
303
- }
304
- getSubFormCtrl() {
305
- return this._subFormCtrl;
306
- }
307
- getCtrl(ctrlIdx) {
308
- return this.CtrlTab.getCtrl(ctrlIdx);
309
- }
310
- GetCtrl(ctrlName) {
311
- return this.CtrlTab.getCtrl(ctrlName);
312
- }
313
- defaultRouterOutlet = null;
314
- get DefaultRouterOutlet() {
315
- if (this.defaultRouterOutlet == null) {
316
- this.defaultRouterOutlet = this.CtrlTab.GetControl((x) => {
317
- return x.IsDefaultRouterOutlet();
318
- });
319
- }
320
- return this.defaultRouterOutlet;
321
- }
322
- async GetChoiceControlItemList(mgControl) {
323
- Debug.Assert(mgControl.isChoiceControl());
324
- let items = new List();
325
- let fld = mgControl.getField();
326
- let storageAttribute = fld.getCellsType();
327
- if (storageAttribute !== StorageAttribute.DATE && storageAttribute !== StorageAttribute.TIME) {
328
- if (mgControl.isRadio()) {
329
- for (let i = 0; i < fld.GetRadioCtrls().length; i++) {
330
- let radioControl = fld.GetRadioCtrls().get_Item(i);
331
- items.AddRange(await radioControl.GetItemsRange());
332
- }
333
- }
334
- else {
335
- items.AddRange(await mgControl.GetItemsRange());
336
- }
337
- return MgFormBase.ConvertArrayListToString(items, storageAttribute === StorageAttribute.NUMERIC);
338
- }
339
- return NString.Empty;
340
- }
341
- async GetChoiceControlDisplayList(mgControl) {
342
- Debug.Assert(mgControl.isChoiceControl());
343
- let items = new List();
344
- let fld = mgControl.getField();
345
- let storageAttribute = fld.getCellsType();
346
- if (storageAttribute !== StorageAttribute.DATE && storageAttribute !== StorageAttribute.TIME) {
347
- if (mgControl.isRadio()) {
348
- for (let i = 0; i < fld.GetRadioCtrls().length; i++) {
349
- let radioControl = fld.GetRadioCtrls().get_Item(i);
350
- items.AddRange(await radioControl.GetDisplayRange());
351
- }
352
- }
353
- else {
354
- items.AddRange(await mgControl.GetDisplayRange());
355
- }
356
- return MgFormBase.ConvertArrayListToString(items, false);
357
- }
358
- return NString.Empty;
359
- }
360
- getControlColumn(ctrl) {
361
- let column = null;
362
- if ((ctrl.IsRepeatable || ctrl.IsTableHeaderChild) && this._tableColumns !== null)
363
- column = this._tableColumns.get_Item(ctrl.getLayer() - 1);
364
- return column;
365
- }
366
- getContainerCtrl() {
367
- return this._containerCtrl;
368
- }
369
- getColumnControls() {
370
- let columnControlsList = null;
371
- if (this.CtrlTab !== null) {
372
- for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
373
- let ctrl = this.CtrlTab.getCtrl(i);
374
- if (ctrl.Type === MgControlType.CTRL_TYPE_COLUMN) {
375
- if (columnControlsList === null)
376
- columnControlsList = new List();
377
- columnControlsList.push(ctrl);
378
- }
379
- }
380
- }
381
- return columnControlsList;
382
- }
383
- getTask() {
384
- return this._task;
385
- }
386
- getTableCtrl() {
387
- return this._tableMgControl;
388
- }
389
- getMainControl() {
390
- return this._tableMgControl;
391
- }
392
- getCtrlByName(ctrlName, ctrlType) {
393
- return this.CtrlTab.getCtrlByName(ctrlName, ctrlType);
394
- }
395
- checkAndCreateRow(idx) {
396
- if (this._tableMgControl !== null && !this.isRowCreated(idx))
397
- this.createRow(idx);
398
- }
399
- IsValidRow(idx) {
400
- let validRow = false;
401
- if (this._tableMgControl !== null && idx >= 0 && idx < this.Rows.length) {
402
- let row = this.Rows.get_Item(idx);
403
- validRow = (row !== null && row.Validated);
404
- }
405
- return validRow;
406
- }
407
- async refreshProps() {
408
- if (this._firstRefreshOfProps) {
409
- this.getProp(PropInterface.PROP_TYPE_TITLE_BAR);
410
- }
411
- await this._propTab.RefreshDisplay(false, false);
412
- if (this._firstRefreshOfProps)
413
- this._firstRefreshOfProps = false;
414
- }
415
- async refreshControls(repeatableOnly) {
416
- let ctrl;
417
- if (this.DisplayLine === Int32.MinValue)
418
- return;
419
- if (this._tableMgControl !== null && !repeatableOnly)
420
- await this._tableMgControl.RefreshDisplay();
421
- if (this._tableColumns !== null && !repeatableOnly) {
422
- for (let i = 0; i < this._tableColumns.length; i = i + 1) {
423
- let mgControlBase = this._tableColumns.get_Item(i);
424
- await mgControlBase.RefreshDisplay();
425
- }
426
- }
427
- this.checkAndCreateRow(this.DisplayLine);
428
- let tabAndGroupControls = new Stack();
429
- for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
430
- ctrl = this.CtrlTab.getCtrl(i);
431
- if ((ctrl.isTabControl() || ctrl.isGroup()) && !repeatableOnly) {
432
- tabAndGroupControls.push(ctrl);
433
- }
434
- if (ctrl.Type !== MgControlType.CTRL_TYPE_TABLE && ctrl.Type !== MgControlType.CTRL_TYPE_COLUMN) {
435
- if (ctrl.IsRepeatable || !repeatableOnly)
436
- await ctrl.RefreshDisplay();
437
- }
438
- else if (ctrl.Type === MgControlType.CTRL_TYPE_TABLE && repeatableOnly)
439
- await ctrl.RefreshDisplay(repeatableOnly);
440
- }
441
- }
442
- markRowNOTCreated(idx) {
443
- Commands.addWithNumber(CommandType.UNDO_CREATE_TABLE_ROW, this._tableMgControl, idx);
444
- if (idx >= 0 && idx < this.Rows.length)
445
- this.Rows.set_Item(idx, new Row(false, false));
446
- }
447
- SelectRow() {
448
- this.SelectRowByIdx(this.DisplayLine);
449
- }
450
- getRowsInPage() {
451
- return this._rowsInPage;
452
- }
453
- getMaxRowsInPaginatedTable() {
454
- return this._maxRowsInPaginatedTable;
455
- }
456
- setRowsInPage(size) {
457
- this._rowsInPage = size;
458
- }
459
- getColumnsCount() {
460
- let columnsCount = 0;
461
- if (this.CtrlTab !== null) {
462
- for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
463
- let control = this.CtrlTab.getCtrl(i);
464
- if (control.Type === MgControlType.CTRL_TYPE_COLUMN)
465
- columnsCount = columnsCount + 1;
466
- }
467
- }
468
- return columnsCount;
469
- }
470
- inRefreshDisplay() {
471
- return this._inRefreshDisp;
472
- }
473
- setTitle(newTitle) {
474
- Commands.setTitle(this, newTitle);
475
- }
476
- getControlIdx(ctrl) {
477
- return this.CtrlTab.getControlIdx(ctrl, true);
478
- }
479
- getTopIndexFromGUI() {
480
- let topDisplayLine = 0;
481
- if (this.hasTable())
482
- topDisplayLine = Commands.getTopIndex(this.getMainControl());
483
- return topDisplayLine;
484
- }
485
- getTableItemsCount() {
486
- return this._tableItemsCount;
487
- }
488
- removeRefsToCtrls() {
489
- for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
490
- this.CtrlTab.getCtrl(i).removeRefFromField();
491
- }
492
- }
493
- buildTableChildren() {
494
- if (this._tableChildren === null) {
495
- this._tableChildren = new List();
496
- if (this.CtrlTab !== null) {
497
- let minTabOrder = 2147483647;
498
- let automaticTabbingOrder = this.isAutomaticTabbingOrder();
499
- for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
500
- let ctrl = this.CtrlTab.getCtrl(i);
501
- if (ctrl.IsRepeatable || ctrl.IsTableHeaderChild) {
502
- this._tableChildren.push(ctrl);
503
- if (automaticTabbingOrder) {
504
- let prop = ctrl.GetComputedProperty(PropInterface.PROP_TYPE_TAB_ORDER);
505
- if (prop !== null) {
506
- let valueInt = prop.GetComputedValueInteger();
507
- if (valueInt < minTabOrder)
508
- minTabOrder = valueInt;
509
- }
510
- }
511
- }
512
- }
513
- if (minTabOrder !== Int32.MaxValue && automaticTabbingOrder) {
514
- this._firstTableTabOrder = minTabOrder;
515
- }
516
- }
517
- }
518
- }
519
- setTableCtrl(tableCtrl) {
520
- this._tableMgControl = tableCtrl;
521
- }
522
- getCtrlCount() {
523
- return this.CtrlTab.getSize();
524
- }
525
- GetControlsCountExcludingStatusBar() {
526
- return this.CtrlTab.getSize();
527
- }
528
- async refreshPropsOnExpression() {
529
- let i;
530
- let size = (this._propTab == null ? 0 : this._propTab.getSize());
531
- let prop;
532
- let refresh = false;
533
- for (i = 0; i < size && !refresh; i++) {
534
- prop = this._propTab.getProp(i);
535
- if (prop.isExpression()) {
536
- refresh = true;
537
- await this.refreshProps();
538
- }
539
- }
540
- }
541
- getTabControl(ctrl) {
542
- let obj;
543
- let result = null;
544
- obj = ctrl;
545
- while (obj instanceof MgControlBase) {
546
- let currCtrl = obj;
547
- if (currCtrl.isTabControl()) {
548
- result = currCtrl;
549
- break;
550
- }
551
- obj = currCtrl.getParent();
552
- }
553
- if (result == null) {
554
- for (let i = 0; i < this.CtrlTab.getSize(); i++) {
555
- obj = this.CtrlTab.getCtrl(i);
556
- if (obj.isTabControl()) {
557
- result = obj;
558
- break;
559
- }
560
- }
561
- }
562
- return result;
563
- }
564
- IsInputType(ctrl) {
565
- switch (ctrl.Type) {
566
- case MgControlType.CTRL_TYPE_CHECKBOX:
567
- case MgControlType.CTRL_TYPE_TEXT:
568
- case MgControlType.CTRL_TYPE_COMBO:
569
- case MgControlType.CTRL_TYPE_LIST:
570
- case MgControlType.CTRL_TYPE_RADIO:
571
- return true;
572
- default:
573
- return false;
574
- }
575
- }
576
- GetListOfInputControls() {
577
- let filterterList = this.CtrlTab.filter(((c) => this.IsInputType(c)));
578
- let names = filterterList.reduce((pre, ctrl) => {
579
- pre[ctrl.UniqueName] = ctrl.IsRepeatable ? '1' : '0';
580
- return pre;
581
- }, {});
582
- return names;
583
- }
584
- firstTableRefresh() {
585
- if (this._tableMgControl !== null) {
586
- this._rowsInPage = Commands.getRowsInPage(this._tableMgControl);
587
- this.RefreshRepeatableAllowed = true;
588
- }
589
- }
590
- SetTableItemsCount(dvsize, tableItemsCountOrRemoveAll, removeAll) {
591
- if (typeof tableItemsCountOrRemoveAll == 'boolean') {
592
- this.SetTableItemsCount_0(dvsize, tableItemsCountOrRemoveAll);
593
- }
594
- else
595
- this.SetTableItemsCount_1(dvsize, tableItemsCountOrRemoveAll, removeAll);
596
- }
597
- SetTableItemsCount_0(dvsize, removeAll) {
598
- this.SetTableItemsCount_1(dvsize, dvsize, removeAll);
599
- }
600
- SetTableItemsCount_1(dvsize, tableItemsCount, removeAll) {
601
- this.InitTableControl(dvsize, tableItemsCount, removeAll);
602
- }
603
- InitTableControl(dvSize, tableItemsCount, removeAll) {
604
- if (arguments.length === 0) {
605
- this.InitTableControl_0();
606
- return;
607
- }
608
- this.InitTableControl_1(dvSize, tableItemsCount);
609
- }
610
- UpdateTableChildrenArraysSize(size) {
611
- let children = this.TableChildren;
612
- if (children != null) {
613
- for (let i = 0; i < children.length; i++) {
614
- let control = children.get_Item(i);
615
- control.updateArrays(size);
616
- }
617
- }
618
- if (this._tableMgControl != null)
619
- this._tableMgControl.updateArrays(size);
620
- }
621
- toString() {
622
- return '{GuiMgForm' + ': Id=' + this._userStateId + '}';
623
- }
624
- IncludeControlInTabbingOrder(control) {
625
- if (!control.PropertyExists(PropInterface.PROP_TYPE_TAB_ORDER))
626
- return false;
627
- return true;
628
- }
629
- GetHashCode() {
630
- return this.FormIsn;
631
- }
632
- initInnerObjects(foundTagName) {
633
- if (foundTagName === null)
634
- return false;
635
- let parser = Manager.GetCurrentRuntimeContext().Parser;
636
- if (MgFormBase.IsFormTag(foundTagName))
637
- this.fillName(foundTagName);
638
- else if (foundTagName === XMLConstants.MG_TAG_PROP)
639
- this._propTab.fillData(this, 'F', parser);
640
- else if (foundTagName === XMLConstants.MG_TAG_CONTROL) {
641
- this.CtrlTab.fillData(this, parser);
642
- if (!this.HasTable())
643
- this.RefreshRepeatableAllowed = true;
644
- }
645
- else if (MgFormBase.IsEndFormTag(foundTagName)) {
646
- parser.setCurrIndex2EndOfTag();
647
- return false;
648
- }
649
- else
650
- return false;
651
- return true;
652
- }
653
- isRowCreated(idx) {
654
- if (this.Rows.length <= idx || idx < 0) {
655
- return false;
656
- }
657
- let row = this.Rows.get_Item(idx);
658
- if (row === null)
659
- return false;
660
- return row.Created;
661
- }
662
- buildLinkedControlsLists() {
663
- for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
664
- let ctrl = this.CtrlTab.getCtrl(i);
665
- let linkedParent = ctrl.getLinkedParent(false);
666
- if (linkedParent !== null)
667
- linkedParent.linkCtrl(ctrl);
668
- }
669
- }
670
- buildTableColumnsList() {
671
- if (this._tableMgControl !== null) {
672
- this._tableColumns = new List();
673
- for (let i = 0; i < this.CtrlTab.getSize(); i = i + 1) {
674
- let control = this.CtrlTab.getCtrl(i);
675
- if (control.Type === MgControlType.CTRL_TYPE_COLUMN)
676
- this._tableColumns.push(control);
677
- }
678
- }
679
- }
680
- createRow(idx) {
681
- Commands.addWithNumber(CommandType.CREATE_TABLE_ROW, this._tableMgControl, idx);
682
- if (this.Rows.length <= idx)
683
- this.Rows.SetSize(idx + 1);
684
- this.Rows.set_Item(idx, new Row(true, true));
685
- }
686
- SelectRowByIdx(rowIdx) {
687
- let mainControl = this.getMainControl();
688
- if (mainControl !== null && this.RefreshRepeatableAllowed) {
689
- let index = rowIdx;
690
- if (this._task.DataView.isEmptyDataview())
691
- index = GuiConstants.NO_ROW_SELECTED;
692
- if (index !== this._prevSelIndex) {
693
- this._prevSelIndex = index;
694
- Commands.addOperationWithLine(CommandType.SET_PROPERTY, mainControl, 0, HtmlProperties.SelectedRow, index);
695
- }
696
- }
697
- }
698
- InitTableControl_0() {
699
- this.InitTableControl(1, 1, false);
700
- }
701
- InitTableControl_1(dvSize, tableItemsCount) {
702
- if (this._tableMgControl != null) {
703
- Commands.addWithNumber(CommandType.SET_TABLE_ITEMS_COUNT, this._tableMgControl, tableItemsCount);
704
- Commands.addWithNumber(CommandType.SET_CHUNK_SIZE, this._tableMgControl, (this._task.DataView).getChunkSize());
705
- this._tableItemsCount = tableItemsCount;
706
- this.Rows.SetSize(dvSize);
707
- this._prevGuiTopIndex = -2;
708
- this._prevSelIndex = -2;
709
- this.UpdateTableChildrenArraysSize(dvSize);
710
- this._maxRowsInPaginatedTable = Commands.getMaxRowsInPaginatedTable(this._tableMgControl);
711
- }
712
- }
713
- InsertTableChildrenArrays(idx, count) {
714
- let children = this.TableChildren;
715
- if (children != null) {
716
- for (let i = 0; i < children.length; i++) {
717
- let control = children[i];
718
- control.InsertArrays(idx, count);
719
- }
720
- }
721
- }
722
- }
723
- export class Row {
724
- Created = false;
725
- Validated = false;
726
- constructor(created, validated) {
727
- if (arguments.length === 0) {
728
- this.constructor_0();
729
- return;
730
- }
731
- this.constructor_1(created, validated);
732
- }
733
- constructor_0() {
734
- this.Validated = true;
735
- }
736
- constructor_1(created, validated) {
737
- this.Created = created;
738
- this.Validated = validated;
739
- }
740
- }
741
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWdGb3JtQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9zcmMvbWFuYWdlbWVudC9ndWkvTWdGb3JtQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsU0FBUyxFQUNULGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUMsS0FBSyxFQUFhLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFZLEtBQUssRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLFdBQVcsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7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LEVBQUU7WUFDMUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxhQUFhLENBQUMsT0FBZ0IsRUFBRSxTQUFrQjtRQUN4RCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1Byb3BQYXJlbnRJbnRlcmZhY2V9IGZyb20gJy4uLy4uL2d1aS9Qcm9wUGFyZW50SW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgTG9nZ2VyX0xvZ0xldmVscyxcclxuICBNZ0NvbnRyb2xUeXBlLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RyVXRpbCxcclxuICBUYWJiaW5nT3JkZXJUeXBlLFxyXG4gIFdpbmRvd1R5cGUsXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge0RlYnVnLCBJSGFzaENvZGUsIEludDMyLCBMaXN0LCBOU3RyaW5nLCBSZWZQYXJhbSwgU3RhY2ssIFN0cmluZ0J1aWxkZXJ9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtNZ0NvbnRyb2xCYXNlfSBmcm9tICcuL01nQ29udHJvbEJhc2UnO1xyXG5pbXBvcnQge1Byb3BUYWJsZX0gZnJvbSAnLi9Qcm9wVGFibGUnO1xyXG5pbXBvcnQge0d1aVRhc2tCYXNlfSBmcm9tICcuLi90YXNrcy9HdWlUYXNrQmFzZSc7XHJcbmltcG9ydCB7Q29udHJvbFRhYmxlfSBmcm9tICcuL0NvbnRyb2xUYWJsZSc7XHJcbmltcG9ydCB7TWFuYWdlcn0gZnJvbSAnLi4vLi4vTWFuYWdlcic7XHJcbmltcG9ydCB7RXZlbnRzfSBmcm9tICcuLi8uLi9FdmVudHMnO1xyXG5pbXBvcnQge1Byb3BlcnR5fSBmcm9tICcuL1Byb3BlcnR5JztcclxuaW1wb3J0IHtDb21tYW5kVHlwZSwgSHRtbFByb3BlcnRpZXN9IGZyb20gJy4uLy4uL0d1aUVudW1zJztcclxuaW1wb3J0IHtOVU1fVFlQRX0gZnJvbSAnLi4vZGF0YS9OVU1fVFlQRSc7XHJcbmltcG9ydCB7Q29tbWFuZHN9IGZyb20gJy4uLy4uL0NvbW1hbmRzJztcclxuaW1wb3J0IHtHdWlGaWVsZEJhc2V9IGZyb20gJy4uL2RhdGEvR3VpRmllbGRCYXNlJztcclxuaW1wb3J0IHtQcm9wSW50ZXJmYWNlfSBmcm9tICcuL1Byb3BJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0d1aUNvbnN0YW50c30gZnJvbSAnLi4vLi4vR3VpQ29uc3RhbnRzJztcclxuaW1wb3J0IHtHdWlGb3JtUHJvcGVydHlBZGFwdGVyfSBmcm9tICcuL0d1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXInO1xyXG5pbXBvcnQge0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXJ9IGZyb20gJy4vR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcic7XHJcblxyXG5cclxuY29uc3QgZGVsaW1pdGVyOiBzdHJpbmcgPSAnLCAnO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gZGF0YSBmb3IgPGZvcm0+Li4uPC9mb3JtPlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWdGb3JtQmFzZSBleHRlbmRzIEd1aUZvcm1Qcm9wZXJ0eUFkYXB0ZXIgaW1wbGVtZW50cyBQcm9wUGFyZW50SW50ZXJmYWNlLCBJSGFzaENvZGUge1xyXG4gIEluSW5pdEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQ3RybFRhYjogQ29udHJvbFRhYmxlID0gbnVsbDtcclxuICAvLyB1bnRpbCB0aGUgZm9ybSBpcyByZWZyZXNoZWQgaW4gdGhlIGZpcnN0IHRpbWVcclxuICBGb3JtUmVmcmVzaGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgUm93czogTGlzdDxSb3c+ID0gbnVsbDtcclxuICBNb2RhbEZvcm1zQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgRXJyb3JPY2N1cmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgRm9ybUlzbjogbnVtYmVyID0gMDtcclxuICBOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIE9wZW5lZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzTGVnYWxGb3JtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgUEJJbWFnZXNOdW1iZXI6IG51bWJlciA9IDA7XHJcbiAgaWdub3JlRmlyc3RSZWZyZXNoVGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFBhcmVudEZvcm06IE1nRm9ybUJhc2UgPSBudWxsO1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJvdGVjdGVkIF9kZXN0VGJsUm93OiBudW1iZXIgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICBwcm90ZWN0ZWQgX2ZpcnN0VGFibGVUYWJPcmRlcjogbnVtYmVyID0gMDsgICAgICAgICAgICAvLyB0YWIgb3JkZXIgb2YgZmlyc3QgY2hpbGQgb2YgdGFibGVcclxuICBwcm90ZWN0ZWQgX2luUmVmcmVzaERpc3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX2luUmVzdG9yZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByb3RlY3RlZCBfbGFzdFJvd1NlbnQ6IG51bWJlciA9IC0xOyAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgcm93IHNlbnQgcm8gZ3VpIHRocmVhZFxyXG4gIHByb3RlY3RlZCBfcHJldkd1aVRvcEluZGV4OiBudW1iZXIgPSAtMTsgICAgICAgICAgICAgIC8vIEZvciBwYWdpbmF0ZWQgdGFibGUgaXQncyBHdWlUb3BJbmRleCBlbHNlIGl0J3MgZHZUb3BJbmRleFxyXG4gIHByb3RlY3RlZCBfcHJvcFRhYjogUHJvcFRhYmxlID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgX3Jvd3NJblBhZ2U6IG51bWJlciA9IDE7XHJcbiAgcHJvdGVjdGVkIF9tYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZTogbnVtYmVyID0gMDsgICAgICAgLy8gbWF4IG5vIG9mIHJvd3MgaW4gcGFnaW5hdGVkIHRhYmxlXHJcbiAgcHJvdGVjdGVkIF9zdWJGb3JtQ3RybDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcbiAgcHJvdGVjdGVkIF90YWJsZU1nQ29udHJvbDogTWdDb250cm9sQmFzZSA9IG51bGw7XHJcbiAgcHJvdGVjdGVkIF90YWJsZUl0ZW1zQ291bnQ6IG51bWJlciA9IDA7ICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlXHJcbiAgcHJvdGVjdGVkIF90YWJsZVJlZnJlc2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByb3RlY3RlZCBfdGFzazogR3VpVGFza0Jhc2UgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXNrIHRvIHdoaWNoIHRoZSBjdXJyZW50IGZvcm0gYmVsb25nc1xyXG4gIHByb3RlY3RlZCBfdG9wSW5kZXhVcGRhdGVkOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgIC8vIHRydWUgaWYgYSB0b3AgaW5kZXggd2FzIHVwZGF0ZWRcclxuXHJcbiAgLy8gRm9ybSByZXByZXNlbnRpbmcgdGhlIGludGVybmFsIGhlbHAgd2luZG93LkhlcmUgdGhlIGludGVybmFsIGZvcm0gb2JqZWN0IGlzIGtlcHQgb24gdGhlIGZvcm0gb2JqZWN0IGl0c2VsZi5cclxuICBwcm90ZWN0ZWQgX3RyYW5zZmVyaW5nRGF0YTogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAvLyByb3dzIGFyZSByZXF1ZXN0ZWQgZm9yIGEgR1VJIHRocmVhZFxyXG4gIC8vIHByZXZlbnRzIHJlZnJlc2ggb2YgRGlzcGxheUxpc3QgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRyb2xzIGFuZCBjdXJyUmVjQ29tcHV0ZShSQylcclxuICBwcml2YXRlIF9hbGxvd2VkU3ViZm9ybVJlY29tcHV0ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfY29uY3JldGVXaW5kb3dUeXBlOiBXaW5kb3dUeXBlO1xyXG4gIHByaXZhdGUgX2NvbnRhaW5lckN0cmw6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgX2ZpcnN0UmVmcmVzaE9mUHJvcHM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF9wcmV2U2VsSW5kZXg6IG51bWJlciA9IC0xO1xyXG4gIHByaXZhdGUgX3Nob3VsZENyZWF0ZVRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgIC8vIGlmIHRvIGNyZWF0ZSB0b29sYmFyXHJcbiAgcHJpdmF0ZSBfdGFibGVDaGlsZHJlbjogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7ICAgLy8gQ2FuJ3QgdXNlIExpc3Q8VD5cclxuICBwcml2YXRlIF90YWJsZUNvbHVtbnM6IExpc3Q8TWdDb250cm9sQmFzZT4gPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfdXNlclN0YXRlSWQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwcml2YXRlIGRpc3BsYXlMaW5lOiBudW1iZXIgPSAwO1xyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuX3Byb3BUYWIgPSBuZXcgUHJvcFRhYmxlKHRoaXMpO1xyXG4gICAgdGhpcy5DdHJsVGFiID0gbmV3IENvbnRyb2xUYWJsZSgpO1xyXG4gICAgdGhpcy5Sb3dzID0gbmV3IExpc3QoKTtcclxuICAgIHRoaXMuX2NvbmNyZXRlV2luZG93VHlwZSA9IDxXaW5kb3dUeXBlPjA7XHJcbiAgICB0aGlzLlBhcmVudEZvcm0gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IERpc3BsYXlMaW5lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIHNldCBEaXNwbGF5TGluZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRpc3BsYXlMaW5lID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVW5pcXVlTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JNX05BTUUpICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9STV9OQU1FKS5HZXRDb21wdXRlZFZhbHVlKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRhc2tUYWcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldFRhc2soKS5nZXRUYXNrVGFnKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0IFRhYmxlQ2hpbGRyZW4oKTogTGlzdDxNZ0NvbnRyb2xCYXNlPiB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVDaGlsZHJlbiA9PT0gbnVsbClcclxuICAgICAgdGhpcy5idWlsZFRhYmxlQ2hpbGRyZW4oKTtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZUNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgc2V0IFRhYmxlQ2hpbGRyZW4odmFsdWU6IExpc3Q8TWdDb250cm9sQmFzZT4pIHtcclxuICAgIHRoaXMuX3RhYmxlQ2hpbGRyZW4gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBTaG91bGRDcmVhdGVUb29sYmFyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Nob3VsZENyZWF0ZVRvb2xiYXI7XHJcbiAgfVxyXG5cclxuICBnZXQgQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZFN1YmZvcm1SZWNvbXB1dGU7XHJcbiAgfVxyXG5cclxuICBzZXQgQWxsb3dlZFN1YmZvcm1SZWNvbXB1dGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2FsbG93ZWRTdWJmb3JtUmVjb21wdXRlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgZm9yIGEgRml0VG9NZGkgd2luZG93LlxyXG5cclxuICBnZXQgQ29uY3JldGVXaW5kb3dUeXBlKCk6IFdpbmRvd1R5cGUge1xyXG4gICAgaWYgKHRoaXMuX2NvbmNyZXRlV2luZG93VHlwZSA9PT0gPFdpbmRvd1R5cGU+MCkge1xyXG4gICAgICBsZXQgd2luZG93VHlwZTogV2luZG93VHlwZSA9IDxXaW5kb3dUeXBlPnRoaXMuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9XSU5ET1dfVFlQRSkuR2V0Q29tcHV0ZWRWYWx1ZUludGVnZXIoKTtcclxuICAgICAgaWYgKHRoaXMuUGFyZW50Rm9ybSA9PT0gbnVsbCB8fCB3aW5kb3dUeXBlICE9PSBXaW5kb3dUeXBlLk92ZXJsYXkpXHJcbiAgICAgICAgd2luZG93VHlwZSA9IFdpbmRvd1R5cGUuRGVmYXVsdDtcclxuXHJcbiAgICAgIHRoaXMuX2NvbmNyZXRlV2luZG93VHlwZSA9IHdpbmRvd1R5cGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fY29uY3JldGVXaW5kb3dUeXBlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRydWUgZm9yIEZsb2F0aW5nLCBUb29sIG9yIE1vZGFsLlxyXG5cclxuICBzZXQgQ29uY3JldGVXaW5kb3dUeXBlKHZhbHVlOiBXaW5kb3dUeXBlKSB7XHJcbiAgICB0aGlzLl9jb25jcmV0ZVdpbmRvd1R5cGUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGhpcyBtZXRob2QgZW5hYmxlcyBhIHNwZWNpZmljIGFjdGlvbiBvbiBhbGwgdGhlIG1lbnUgb2JqZWN0cyBvZiB0aGUgZm9ybSBhbmQgaXRzIGNoaWxkcmVuJ3NcclxuICAvLy8gbWVudXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFjdGlvblwiPmFjdGlvbiB3aG9zZSBzdGF0ZSBoYXMgY2hhbmdlZDwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFNob3VsZFB1dEFjdE9uRm9ybUNsb3NlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IGEgcHJvcGVydHkgb2YgdGhlIGZvcm0gdGhhdCBhbHJlYWR5IHdhcyBjb21wdXRlZCBieSBpdHMgSWRcclxuICAvLy8gVGhpcyBtZXRob2QgZG9lcyBub3QgY3JlYXRlIGEgcHJvcGVydHkgaWYgaXQgaXNuJ3QgZXhpc3QuXHJcbiAgLy8vIE1heSB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHByb3BlcnR5IGFuZCB1c2UgaXRzIGRlZmF1bHQgdmFsdWUuXHJcbiAgLy8vIEluIFBoYXNlIDIgaW4gUmVmcmVzaFByb3BlcnRpZXMgbWV0aG9kIHdlJ2xsIGNyZWF0ZSBhbmQgY29tcHV0ZSBwcm9wZXJ0aWVzLFxyXG4gIC8vLyBwZXJoYXBzIHdlIG5lZWQgY3JlYXRlIGFsbCBwcm9wZXJ0aWVzIG5vdCBvbmx5IHRob3NlIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIGRlZmF1bHQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcm90ZWN0ZWQgc3RhdGljIFNob3VsZEJlaGF2ZUFzTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrcyBpZiBwcm9wZXJ0eSBoYXMgZXhwcmVzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvcElkXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIHN0YXRpYyBDb252ZXJ0QXJyYXlMaXN0VG9TdHJpbmcoaXRlbXM6IExpc3Q8c3RyaW5nPiwgaXNJdGVtTnVtVHlwZTogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICBsZXQgZnJvbTogc3RyaW5nW10gPSBbJ1xcXFwnLCAnLScsICcsJ107XHJcbiAgICBsZXQgdG86IHN0cmluZ1tdID0gWydcXFxcXFxcXCcsICdcXFxcLScsICdcXFxcLCddO1xyXG4gICAgbGV0IHN0cmluZ0J1aWxkZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IG5VTV9UWVBFOiBOVU1fVFlQRTtcclxuXHJcbiAgICBmb3IgKGxldCBpbmRleDogbnVtYmVyID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4ID0gaW5kZXggKyAxKSB7XHJcbiAgICAgIGlmIChpc0l0ZW1OdW1UeXBlKSB7XHJcbiAgICAgICAgblVNX1RZUEUgPSBuZXcgTlVNX1RZUEUoPHN0cmluZz5pdGVtcy5nZXRfSXRlbShpbmRleCkpO1xyXG4gICAgICAgIGl0ZW1zLnNldF9JdGVtKGluZGV4LCBuVU1fVFlQRS50b19kb3VibGUoKS50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoU3RyVXRpbC5zZWFyY2hBbmRSZXBsYWNlKDxzdHJpbmc+aXRlbXMuZ2V0X0l0ZW0oaW5kZXgpLCBmcm9tLCB0bykpO1xyXG5cclxuICAgICAgaWYgKGluZGV4IDwgaXRlbXMubGVuZ3RoIC0gMSlcclxuICAgICAgICBzdHJpbmdCdWlsZGVyLkFwcGVuZChkZWxpbWl0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHBhcnNlIHRoZSBmb3JtIHN0cnVjdHVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5jcmVhc2VcIj48L3BhcmFtPlxyXG4gIFVwZGF0ZU1vZGFsRm9ybXNDb3VudChtZ0Zvcm1CYXNlOiBNZ0Zvcm1CYXNlLCBpbmNyZWFzZTogYm9vbGVhbik6IHZvaWQge1xyXG5cclxuICAgIGlmIChpbmNyZWFzZSlcclxuICAgICAgdGhpcy5Nb2RhbEZvcm1zQ291bnQgKz0gMTtcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5Nb2RhbEZvcm1zQ291bnQgLT0gMTtcclxuXHJcbiAgICBFdmVudHMuU2V0TW9kYWwobWdGb3JtQmFzZSwgaW5jcmVhc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUbyBhbGxvY2F0ZSBhbmQgZmlsbCBpbm5lciBvYmplY3RzIG9mIHRoZSBjbGFzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm91bmRUYWdOYW1lXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBFdmFsdWF0ZUV4cHJlc3Npb24oZXhwSWQ6IG51bWJlciwgcmVzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgbGVuZ3RoOiBudW1iZXIsIGNvbnRlbnRUeXBlVW5pY29kZTogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzQ2VsbFR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIGFsd2F5c0V2YWx1YXRlOiBib29sZWFuLCB3YXNFdmFsdWF0ZWQ6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl90YXNrLkV2YWx1YXRlRXhwcmVzc2lvbihleHBJZCwgcmVzVHlwZSwgbGVuZ3RoLCBjb250ZW50VHlwZVVuaWNvZGUsIHJlc0NlbGxUeXBlLCB0cnVlLCB3YXNFdmFsdWF0ZWQpO1xyXG4gIH1cclxuXHJcbiAgR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQ6IG51bWJlcik6IFN0b3JhZ2VBdHRyaWJ1dGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2suR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5pdGlhbGl6YXRpb24uXHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgY2hlY2tJZkV4aXN0UHJvcChwcm9wSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGV4aXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fcHJvcFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgcHJvcEJ5SWQ6IFByb3BlcnR5ID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG4gICAgICBleGlzdCA9IChwcm9wQnlJZCAhPT0gbnVsbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXhpc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmlsbCBuYW1lIG1lbWJlciBvZiB0aGUgY2xhc3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBJZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIGdldFByb3AocHJvcElkOiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcblxyXG4gICAgICAvLyBpZiB0aGUgcHJvcGVydHkgZG9lc24ndCBleGlzdCB0aGVuIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBhbmQgZ2l2ZSBpdCB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAvLyBpbiBhZGRpdGlvbiBhZGQgdGhpcyBwcm9wZXJ0eSB0byB0aGUgcHJvcGVydGllcyB0YWJsZVxyXG4gICAgICBpZiAocHJvcCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHByb3AgPSBQcm9wZXJ0eS5nZXREZWZhdWx0UHJvcChwcm9wSWQsIEd1aUNvbnN0YW50cy5QQVJFTlRfVFlQRV9GT1JNLCB0aGlzKTtcclxuICAgICAgICBpZiAocHJvcCAhPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuX3Byb3BUYWIuYWRkUHJvcChwcm9wKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByb3A7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZm9yIGVhY2ggY29udHJvbCBidWlsZCB0aGUgbGlzdCBvZiBhbGwgdGhlIGNvbnRyb2xzIHRoYXQgYXJlIGxpbmtlZCB0byBpdFxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPnRoZSBJZCBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPlxyXG4gIEdldENvbXB1dGVkUHJvcGVydHkocHJvcElkOiBudW1iZXIpOiBQcm9wZXJ0eSB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9wcm9wVGFiICE9PSBudWxsKVxyXG4gICAgICBwcm9wID0gdGhpcy5fcHJvcFRhYi5nZXRQcm9wQnlJZChwcm9wSWQpO1xyXG5cclxuICAgIHJldHVybiBwcm9wO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgUHJvcGVydHlIYXNFeHByZXNzaW9uKHByb3BJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLl9wcm9wVGFiLmdldFByb3BCeUlkKHByb3BJZCk7XHJcbiAgICByZXR1cm4gcHJvcCAhPT0gbnVsbCAmJiBwcm9wLmlzRXhwcmVzc2lvbigpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRDb21wSWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuZ2V0VGFzaygpID09PSBudWxsKSA/IDAgOiB0aGlzLmdldFRhc2soKS5nZXRDb21wSWR4KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYXJyYW5nZSB6b3JkZXIgZm9yIGNvbnRyb2xzLiByZWN1cnNpdmUgZnVuY3Rpb24uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJc0ZpcnN0UmVmcmVzaE9mUHJvcHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RSZWZyZXNoT2ZQcm9wcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCBsaXN0IG9mIGFsbCBjb2x1bW5zIGNvbnRyb2xzXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0Rm9ybSgpOiBNZ0Zvcm1CYXNlIHtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVja3MgaWYgYW4gaW50ZXJuYWwgRml0IHRvIE1ESSBmb3JtIG5lZWRzIHRvIGJlIGNyZWF0ZWQgdG8gaG9sZCB0aGUgTWFpbiBQcm9ncmFtIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+cmVmZXJlbmNlIHRvIHRoZSBvd25lclRhc2sgb2YgdGhpcyBmb3JtPC9wYXJhbT5cclxuICBmaWxsRGF0YSh0YXNrUmVmOiBHdWlUYXNrQmFzZSk6IHZvaWQge1xyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5QYXJzZXI7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Rhc2sgPT09IG51bGwgJiYgdGFza1JlZiAhPT0gbnVsbClcclxuICAgICAgdGhpcy5fdGFzayA9IHRhc2tSZWY7XHJcblxyXG4gICAgd2hpbGUgKHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIuZ2V0TmV4dFRhZygpKSkge1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgIGxldCBjdHJsOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgIC8vIGluaXRpYWxpemVzIHRoZSBzdWJmb3JtIGNvbnRyb2xzXHJcbiAgICAgIGN0cmwuSW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGJ1aWxkIGxpc3RzIG9mIGxpbmtlZCBjb250cm9scyBvbiB0aGVpciBwYXJlbnRzXHJcbiAgICB0aGlzLmJ1aWxkTGlua2VkQ29udHJvbHNMaXN0cygpO1xyXG5cclxuICAgIC8vIGJ1aWxkIGxpc3Qgb2YgY29sdW1ucyBhbmQgbm9uIGNvbHVtbnNcclxuICAgIHRoaXMuYnVpbGRUYWJsZUNvbHVtbnNMaXN0KCk7XHJcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZUZvcm0oKTtcclxuXHJcbiAgICB0aGlzLl90YXNrLnNldEtleWJvYXJkTWFwcGluZ1N0YXRlKENvbnN0YW50cy5BQ1RfU1RUX1RCTF9TQ1JFRU5fTU9ERSwgdGhpcy5pc1NjcmVlbk1vZGUoKSk7XHJcbiAgICB0aGlzLl90YXNrLnNldEtleWJvYXJkTWFwcGluZ1N0YXRlKENvbnN0YW50cy5BQ1RfU1RUX1RCTF9MRUZUX1RPX1JJR0hULCAhdGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0hFQlJFVykuR2V0Q29tcHV0ZWRWYWx1ZUJvb2xlYW4oKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgb3JkZXIgdGhlIHNwbGl0dGVyIGNvbnRhaW5lciBjaGlsZHJlbi4gVGhlIGNoaWxkIHRoYXQgaXMgZG9ja2VkIHRvIGZpbGwgaXMgYWRkZWQgZmlyc3QsIHRoZW5cclxuICAvLy8gICB0aGUgc3BsaXR0ZXIgY29udHJvbCBhbmQgZmluYWxseSB0aGUgY2hpbGQgdGhhdCBpcyBkb2NrZWQgZWl0aGVyIHRvIHRoZSB0b3Agb3IgdG8gdGhlIGxlZnRcclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBlbmQgSW5kZXggb2YgdGhlPGZvcm0gLi4uPiBzdWJ0YWc8L3JldHVybnM+XHJcbiAgZmlsbE5hbWUoZm9ybVRhZzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBNYW5hZ2VyLkdldEN1cnJlbnRSdW50aW1lQ29udGV4dCgpLlBhcnNlcjtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihmb3JtVGFnKSArIGZvcm1UYWcubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuXHJcbiAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZztcclxuICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmc7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaSA9IGkgKyAyKSB7XHJcbiAgICAgICAgYXR0cmlidXRlID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGkgKyAxKTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfTkFNRTpcclxuICAgICAgICAgICAgdGhpcy5OYW1lID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBpZiAoRXZlbnRzLlNob3VsZExvZyhMb2dnZXJfTG9nTGV2ZWxzLkd1aSkpXHJcbiAgICAgICAgICAgICAgRXZlbnRzLldyaXRlR3VpVG9Mb2coTlN0cmluZy5Gb3JtYXQoJ1BhcnNpbmcgZm9ybSBcInswfVwiJywgdGhpcy5OYW1lKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU19GUkFNRVNFVDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lTX0xJR0FMX1JDX0ZPUk06XHJcbiAgICAgICAgICAgIHRoaXMuaXNMZWdhbEZvcm0gPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9QQl9JTUFHRVNfTlVNQkVSOlxyXG4gICAgICAgICAgICB0aGlzLlBCSW1hZ2VzTnVtYmVyID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9GT1JNX0lTTjpcclxuICAgICAgICAgICAgdGhpcy5Gb3JtSXNuID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9VU0VSU1RBVEVfSUQ6XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJTdGF0ZUlkID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KCdVbmhhbmRsZWQgYXR0cmlidXRlIFxcJ3swfVxcJy4nLCBhdHRyaWJ1dGUpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIDEpOyAvLyB0byBkZWxldGUgXCI+XCIgdG9vXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKCdpbiBGb3JtLkZpbGxOYW1lKCkgb3V0IG9mIGJvdW5kcycpO1xyXG4gIH1cclxuXHJcblxyXG4gIGFic3RyYWN0IGJ1aWxkRm9ybU5hbWUoKTogc3RyaW5nO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgdHJ1ZSBmb3IgbWRpIGNoaWxkIGFuZCBmaXQgdG8gbWRpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ3aW5kb3dUeXBlXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBjcmVhdGVGb3JtKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGlucHV0Q29udHJvbHMgPSB0aGlzLkdldExpc3RPZklucHV0Q29udHJvbHMoKTtcclxuICAgIGxldCBmb3JtTmFtZTogc3RyaW5nID0gdGhpcy5idWlsZEZvcm1OYW1lKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgIC8vT25seSBmb3Igb3ZlcmxheSB0eXBlIHVzZSBuZXcgbWV0aG9kXHJcbiAgICAgIGlmICh0aGlzLmlzRGlhbG9nKCkpXHJcbiAgICAgICAgYXdhaXQgQ29tbWFuZHMub3Blbk92ZXJsYXlGb3JtKHRoaXMsIGZvcm1OYW1lLCAnMCcsIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgaW5wdXRDb250cm9scywgdGhpcy5pc0RpYWxvZygpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIENvbW1hbmRzLmFkZE9wZW5Gb3JtKHRoaXMsIGZvcm1OYW1lLCAnMCcsIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgaW5wdXRDb250cm9scywgdGhpcy5pc0RpYWxvZygpKTtcclxuICAgIH1lbHNlIHtcclxuICAgICAgQ29tbWFuZHMuYWRkT3BlbnN1YmZvcm0oQ29tbWFuZFR5cGUuQ1JFQVRFX1NVQl9GT1JNLCB0aGlzLmdldFN1YkZvcm1DdHJsKCksIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgKDxNZ0NvbnRyb2xCYXNlPnRoaXMuZ2V0U3ViRm9ybUN0cmwoKSkuZ2V0TmFtZSgpLFxyXG4gICAgICAgIGZvcm1OYW1lLCBpbnB1dENvbnRyb2xzLCB0aGlzLmdldFRhc2soKS5Sb3V0ZXJQYXRoLCB0aGlzLmdldFRhc2soKS5HZXRSb3V0ZXJQYXJhbXMoKSwgdGhpcy5nZXRUYXNrKCkuSW5EZWZhdWx0Um91dGVyT3V0bGV0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBkZWZhdWx0IGNyZWF0ZSBvbmUgcm93IGluIHRhYmxlIGNvbnRyb2wuIERPTidUIHNldCBpdGVtcyBjb3VudCBkdXJpbmcgZm9ybSBvcGVuLlxyXG4gICAgLy8gZmlyc3RUYWJsZVJlZnJlc2goKSB3aWxsIGNyZWF0ZSB0aGUgYWN0dWFsIHJvd3MsIGFuZCByZWZyZXNoIHRoZSB0YWJsZS5cclxuICAgIGlmICh0aGlzLkhhc1RhYmxlKCkpXHJcbiAgICAgIHRoaXMuSW5pdFRhYmxlQ29udHJvbCgpO1xyXG5cclxuICAgIENvbW1hbmRzLmJlZ2luSW52b2tlKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBhZGQgdGhlIGNhbGwganMgY29tbWFuZCBhbmQgZ2V0IHRoZSByZXR1cm4gdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgQ2FsbEpTKG1ldGhvZE5hbWU6IHN0cmluZywgYXJnczogQXJyYXk8YW55Pik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gQ29tbWFuZHMuYWRkQ2FsbEpTKHRoaXMsIHRoaXMuVW5pcXVlTmFtZSwgbWV0aG9kTmFtZSwgYXJncyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgZm9ybSBoYXMgYXV0b21hdGljIHRhYmJpbmcgb3JkZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNBdXRvbWF0aWNUYWJiaW5nT3JkZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5HZXRDb21wdXRlZFByb3BlcnR5KFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBQkJJTkdfT1JERVIpLkdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCkgPT09IFRhYmJpbmdPcmRlclR5cGUuQXV0b21hdGljYWxseTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0cnVlIGlmIHdlIGNhbiByZWZyZXNoIHJlcGVhdGFibGUgY29udHJvbHNcclxuICAvLy8gICBRQ1IgIzQzNDY0OSwgd2UgcHJldmVudCBwYWludGluZyB0YWJsZSdzIGNvbnRyb2wgdW50aWxsIHNoZWxsIGlzIG9wZW5lZCBhbmQgd2Uga25vdyBob3cgbWFueSByb3dzIHRvIHBhaW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuUmVmcmVzaFJlcGVhdGFibGVBbGxvd2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgZm9ybSBpcyBzY3JlZW4gbW9kZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNTY3JlZW5Nb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmlzTGluZU1vZGUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGZvcm0gaXMgbGluZSBtb2RlXHJcbiAgLy8vICAgaWYgd2UgaGF2ZSBhIHRyZWUgb3IgYSB0YWJsZSBvbiB0aGUgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNMaW5lTW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldE1haW5Db250cm9sKCkgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRydWUgaWYgdGFzayBoYXMgdGFibGUgb3IgdHJlZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBoYXNUYWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZU1nQ29udHJvbCAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJ1ZSBpZiBmb3JtIHNob3VsZCBiZSBvcGVuZWQgYXMgbW9kYWwgd2luZG93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzRGlhbG9nKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgd2luZG93VHlwZTogV2luZG93VHlwZSA9IHRoaXMuQ29uY3JldGVXaW5kb3dUeXBlO1xyXG4gICAgaWYgKHdpbmRvd1R5cGUgPT09IFdpbmRvd1R5cGUuT3ZlcmxheSlcclxuICAgICAgaXNEaWFsb2cgPSB0cnVlO1xyXG4gICAgZWxzZSBpZiAoTWdGb3JtQmFzZS5TaG91bGRCZWhhdmVBc01vZGFsKCkpXHJcbiAgICAgIGlzRGlhbG9nID0gdHJ1ZTtcclxuICAgIHJldHVybiBpc0RpYWxvZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdWxkIHRoaXMgZm9ybSBiZWhhdmUgYXMgTW9kYWwgYWx0aG91Z2ggaXRzIFdpbmRvd1R5cGUgIT0gTW9kYWw/XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuPC9yZXR1cm5zPlxyXG4gIGlzU3ViRm9ybSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zdWJGb3JtQ3RybCAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyBmb3JtIGlzIHN1YmZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEhhc1RhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VG9wTW9zdEZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICBsZXQgdG9wTW9zdEZvcm06IE1nRm9ybUJhc2UgPSB0aGlzO1xyXG5cclxuICAgIC8vIFRoZSBmb3JtIG9mIHRoZSBzdWIgZm9ybSBjb250cm9sXHJcbiAgICB3aGlsZSAodG9wTW9zdEZvcm0uaXNTdWJGb3JtKCkgJiYgdG9wTW9zdEZvcm0uUGFyZW50Rm9ybSAhPT0gbnVsbClcclxuICAgICAgdG9wTW9zdEZvcm0gPSB0b3BNb3N0Rm9ybS5QYXJlbnRGb3JtO1xyXG5cclxuICAgIHJldHVybiB0b3BNb3N0Rm9ybTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSB0b3Btb3N0IGZyYW1lIGZvcm0gZm9yIG1lbnUgcmVmcmVzaC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFRvcE1vc3RGcmFtZUZvcm0oKTogTWdGb3JtQmFzZSB7XHJcbiAgICBsZXQgdG9wTW9zdEZvcm06IE1nRm9ybUJhc2UgPSB0aGlzO1xyXG5cclxuICAgIHdoaWxlICh0b3BNb3N0Rm9ybSAhPT0gbnVsbClcclxuICAgICAgdG9wTW9zdEZvcm0gPSAoKHRvcE1vc3RGb3JtLlBhcmVudEZvcm0gIT09IG51bGwpID8gdG9wTW9zdEZvcm0uUGFyZW50Rm9ybSA6IG51bGwpO1xyXG5cclxuICAgIHJldHVybiB0b3BNb3N0Rm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHRvcG1vc3QgbWdmb3JtIG9mIHRoZSBzdWJmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRTdWJGb3JtQ3RybCgpOiBHdWlDb250cm9sUHJvcGVydHlBZGFwdGVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zdWJGb3JtQ3RybDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIGZvcm0gbWFwcGluZyBpbiBjb250cm9sJ3MgbWFwXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsSWR4XCI+dGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgZ2V0Q3RybChjdHJsSWR4OiBudW1iZXIpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLkN0cmxUYWIuZ2V0Q3RybChjdHJsSWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5SZXR1cm5zIHRoZSByZXF1ZXN0ZWQgY29udHJvbDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBhIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZG9lcyBub3QgZXhpc3Q8L3JldHVybnM+XHJcbiAgR2V0Q3RybChjdHJsTmFtZTogc3RyaW5nKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICByZXR1cm4gdGhpcy5DdHJsVGFiLmdldEN0cmwoY3RybE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWZhdWx0Um91dGVyT3V0bGV0OiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuXHJcbiAgZ2V0IERlZmF1bHRSb3V0ZXJPdXRsZXQoKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBpZiAodGhpcy5kZWZhdWx0Um91dGVyT3V0bGV0ID09IG51bGwpIHtcclxuICAgICAgdGhpcy5kZWZhdWx0Um91dGVyT3V0bGV0ID0gdGhpcy5DdHJsVGFiLkdldENvbnRyb2woKHg6IE1nQ29udHJvbEJhc2UpID0+IHtcclxuICAgICAgICByZXR1cm4geC5Jc0RlZmF1bHRSb3V0ZXJPdXRsZXQoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFJvdXRlck91dGxldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gdGhlIGNvbnRyb2wgd2l0aCBhIGdpdmVuIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj50aGUgb2YgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBHZXRDaG9pY2VDb250cm9sSXRlbUxpc3QobWdDb250cm9sOiBNZ0NvbnRyb2xCYXNlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIERlYnVnLkFzc2VydChtZ0NvbnRyb2wuaXNDaG9pY2VDb250cm9sKCkpO1xyXG5cclxuICAgIGxldCBpdGVtczogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3QoKTtcclxuICAgIGxldCBmbGQ6IEd1aUZpZWxkQmFzZSA9IG1nQ29udHJvbC5nZXRGaWVsZCgpO1xyXG4gICAgbGV0IHN0b3JhZ2VBdHRyaWJ1dGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmbGQuZ2V0Q2VsbHNUeXBlKCk7XHJcblxyXG4gICAgaWYgKHN0b3JhZ2VBdHRyaWJ1dGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSAmJiBzdG9yYWdlQXR0cmlidXRlICE9PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpIHtcclxuICAgICAgaWYgKG1nQ29udHJvbC5pc1JhZGlvKCkpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZmxkLkdldFJhZGlvQ3RybHMoKS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHJhZGlvQ29udHJvbDogTWdDb250cm9sQmFzZSA9IGZsZC5HZXRSYWRpb0N0cmxzKCkuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgICBpdGVtcy5BZGRSYW5nZShhd2FpdCByYWRpb0NvbnRyb2wuR2V0SXRlbXNSYW5nZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaXRlbXMuQWRkUmFuZ2UoYXdhaXQgbWdDb250cm9sLkdldEl0ZW1zUmFuZ2UoKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIE1nRm9ybUJhc2UuQ29udmVydEFycmF5TGlzdFRvU3RyaW5nKGl0ZW1zLCBzdG9yYWdlQXR0cmlidXRlID09PSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBOU3RyaW5nLkVtcHR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXQgdGhlIGl0ZW1zIGxpc3Qgb2YgY2hvaWNlIGNvbnRyb2xzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWdDb250cm9sXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBHZXRDaG9pY2VDb250cm9sRGlzcGxheUxpc3QobWdDb250cm9sOiBNZ0NvbnRyb2xCYXNlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIERlYnVnLkFzc2VydChtZ0NvbnRyb2wuaXNDaG9pY2VDb250cm9sKCkpO1xyXG5cclxuICAgIGxldCBpdGVtczogTGlzdDxzdHJpbmc+ID0gbmV3IExpc3QoKTtcclxuICAgIGxldCBmbGQ6IEd1aUZpZWxkQmFzZSA9IG1nQ29udHJvbC5nZXRGaWVsZCgpO1xyXG4gICAgbGV0IHN0b3JhZ2VBdHRyaWJ1dGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmbGQuZ2V0Q2VsbHNUeXBlKCk7XHJcblxyXG4gICAgaWYgKHN0b3JhZ2VBdHRyaWJ1dGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSAmJiBzdG9yYWdlQXR0cmlidXRlICE9PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpIHtcclxuICAgICAgaWYgKG1nQ29udHJvbC5pc1JhZGlvKCkpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZmxkLkdldFJhZGlvQ3RybHMoKS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHJhZGlvQ29udHJvbDogTWdDb250cm9sQmFzZSA9IGZsZC5HZXRSYWRpb0N0cmxzKCkuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgICBpdGVtcy5BZGRSYW5nZShhd2FpdCByYWRpb0NvbnRyb2wuR2V0RGlzcGxheVJhbmdlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpdGVtcy5BZGRSYW5nZShhd2FpdCBtZ0NvbnRyb2wuR2V0RGlzcGxheVJhbmdlKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBNZ0Zvcm1CYXNlLkNvbnZlcnRBcnJheUxpc3RUb1N0cmluZyhpdGVtcywgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBOU3RyaW5nLkVtcHR5O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyB0aGUgY29tbWEgY29uY2F0ZW5hdGVkIHN0cmluZyBmcm9tIGFycmF5IGxpc3QuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpdGVtc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNJdGVtTnVtVHlwZVwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0Q29udHJvbENvbHVtbihjdHJsOiBNZ0NvbnRyb2xCYXNlKTogTWdDb250cm9sQmFzZSB7XHJcbiAgICBsZXQgY29sdW1uOiBNZ0NvbnRyb2xCYXNlID0gbnVsbDtcclxuXHJcbiAgICBpZiAoKGN0cmwuSXNSZXBlYXRhYmxlIHx8IGN0cmwuSXNUYWJsZUhlYWRlckNoaWxkKSAmJiB0aGlzLl90YWJsZUNvbHVtbnMgIT09IG51bGwpXHJcbiAgICAgIGNvbHVtbiA9IHRoaXMuX3RhYmxlQ29sdW1ucy5nZXRfSXRlbShjdHJsLmdldExheWVyKCkgLSAxKTtcclxuXHJcbiAgICByZXR1cm4gY29sdW1uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgY29udGFpbmVyIGNvbnRyb2w8L3JldHVybnM+XHJcbiAgZ2V0Q29udGFpbmVyQ3RybCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250YWluZXJDdHJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBjb250cm9sJ3MgY29sdW1uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENvbHVtbkNvbnRyb2xzKCk6IExpc3Q8TWdDb250cm9sQmFzZT4ge1xyXG4gICAgbGV0IGNvbHVtbkNvbnRyb2xzTGlzdDogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMuQ3RybFRhYiAhPT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgICBpZiAoY3RybC5UeXBlID09PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pIHtcclxuICAgICAgICAgIGlmIChjb2x1bW5Db250cm9sc0xpc3QgPT09IG51bGwpXHJcbiAgICAgICAgICAgIGNvbHVtbkNvbnRyb2xzTGlzdCA9IG5ldyBMaXN0PE1nQ29udHJvbEJhc2U+KCk7XHJcbiAgICAgICAgICBjb2x1bW5Db250cm9sc0xpc3QucHVzaChjdHJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb2x1bW5Db250cm9sc0xpc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRhc2soKTogR3VpVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICBjb252ZXJ0cyBmcm9tIGRvdWJsZSBwaXhlbHMgdG8gdW9tXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwaXhWYWxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzWGF4aXNcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFRhYmxlQ3RybCgpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIHJldHVybiB0aGlzLl90YWJsZU1nQ29udHJvbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZnRlciBvcGVuIHRoZSBmb3JtIG5lZWQgdG8gbW92ZSBpdCBhY2NvcmRpbmcgdG8gdGhlIHN0YXJ0dXAgcG9zaXRpb24gcHJvcGVydHkgb24gdGhlIGZvcm1cclxuICAvLy8gICBQUk9QX1RZUEVfU1RBUlRVUF9QT1NJVElPTlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldE1haW5Db250cm9sKCk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTWdDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBhIHJlZmVyZW5jZSB0byB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZG9lcyBub3QgZXhpc3Q8L3JldHVybnM+XHJcbiAgZ2V0Q3RybEJ5TmFtZShjdHJsTmFtZTogc3RyaW5nLCBjdHJsVHlwZTogTWdDb250cm9sVHlwZSk6IE1nQ29udHJvbEJhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3RybFRhYi5nZXRDdHJsQnlOYW1lKGN0cmxOYW1lLCBjdHJsVHlwZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBQb2ludCAsY2VudGVyIHRvIHRoZSBnaXZpbmcgcmVsYXRpdmVSZWN0XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWR4XCI+PC9wYXJhbT5cclxuICBjaGVja0FuZENyZWF0ZVJvdyhpZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmICF0aGlzLmlzUm93Q3JlYXRlZChpZHgpKVxyXG4gICAgICB0aGlzLmNyZWF0ZVJvdyhpZHgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlkeFwiPjwvcGFyYW0+XHJcbiAgSXNWYWxpZFJvdyhpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHZhbGlkUm93OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsICYmIGlkeCA+PSAwICYmIGlkeCA8IHRoaXMuUm93cy5sZW5ndGgpIHtcclxuICAgICAgbGV0IHJvdzogUm93ID0gdGhpcy5Sb3dzLmdldF9JdGVtKGlkeCk7XHJcbiAgICAgIHZhbGlkUm93ID0gKHJvdyAhPT0gbnVsbCAmJiByb3cuVmFsaWRhdGVkKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZFJvdztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGFibGUgY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdHJlZSBvciB0YWJsZSBjb250cm9sIG9mIHRoZSBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyByZWZyZXNoUHJvcHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fZmlyc3RSZWZyZXNoT2ZQcm9wcykge1xyXG4gICAgICB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVElUTEVfQkFSKTtcclxuXHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLl9wcm9wVGFiLlJlZnJlc2hEaXNwbGF5KGZhbHNlLCBmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpcnN0UmVmcmVzaE9mUHJvcHMpXHJcbiAgICAgIHRoaXMuX2ZpcnN0UmVmcmVzaE9mUHJvcHMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZXR1cm4gdGhlIGNvbnRyb2wgKHdoaWNoIGlzIG5vdCB0aGUgZnJhbWUgZm9ybSkgd2l0aCBhIGdpdmVuIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybE5hbWVcIj50aGUgb2YgdGhlIHJlcXVlc3RlZCBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsVHlwZVwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVwZWF0YWJsZU9ubHlcIj5zaG91bGQgYmUgdHJ1ZSBpbiBvcmRlciB0byByZWZyZXNoIG9ubHkgdGhlIGNvbnRyb2xzIHRoYXQgYmVsb25nIHRvIGEgdGFibGU8L3BhcmFtPlxyXG4gIGFzeW5jIHJlZnJlc2hDb250cm9scyhyZXBlYXRhYmxlT25seTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2U7XHJcbiAgICAvLyByZWNvcmQgZG9lcyBub3QgZXhpc3RcclxuICAgIGlmICh0aGlzLkRpc3BsYXlMaW5lID09PSBJbnQzMi5NaW5WYWx1ZSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIC8vIHJlZnJlc2ggdGhlIHRhYmxlIGZpcnN0XHJcbiAgICBpZiAodGhpcy5fdGFibGVNZ0NvbnRyb2wgIT09IG51bGwgJiYgIXJlcGVhdGFibGVPbmx5KVxyXG4gICAgICBhd2FpdCB0aGlzLl90YWJsZU1nQ29udHJvbC5SZWZyZXNoRGlzcGxheSgpO1xyXG5cclxuICAgIC8vIHJlZnJlc2ggYWxsIENPTFVNTlMgKHJlZnJlc2ggZm9yIGVhY2ggY29udHJvbCBiYXNlIG9uIHRoZSByZWZyZXNoIG9mIHRoZSBjb2x1bW4gKGUuZzpjb2x1bW4gd2lkdGgpXHJcbiAgICAvLyBzbyB3ZSBtdXN0IHJlZnJlc2ggdGhlIGNvbHVtbiBmaXJzdFxyXG4gICAgaWYgKHRoaXMuX3RhYmxlQ29sdW1ucyAhPT0gbnVsbCAmJiAhcmVwZWF0YWJsZU9ubHkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX3RhYmxlQ29sdW1ucy5sZW5ndGg7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGxldCBtZ0NvbnRyb2xCYXNlOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5fdGFibGVDb2x1bW5zLmdldF9JdGVtKGkpO1xyXG4gICAgICAgIGF3YWl0IG1nQ29udHJvbEJhc2UuUmVmcmVzaERpc3BsYXkoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hlY2tBbmRDcmVhdGVSb3codGhpcy5EaXNwbGF5TGluZSk7XHJcblxyXG4gICAgLy8gUUNSICM3MDk1NjMgTXVzdCByZWZyZXNoIGZyYW1lc2V0J3Mgc3ViZnJvbXMgYmVmb3JlIHdlIHJlZnJlc2ggZnJhbWVzZXQgaXRzZWxmLlxyXG4gICAgLy8gRHVyaW5nIHJlZnJlc2ggb2YgdGhlIGZyYW1lc2V0IG5lc3RlZCBzdWJmb3JtcyB3aXRoIFJlZnJlc2hXaGVuSGlkZGVuIG1pZ2h0IGJlIGJyb3VnaHQgdG8gc2VydmVyXHJcbiAgICAvLyBidXQgdGhlaXIgc3ViZm9ybSdzIGNvbnRyb2xzIGhhdmUgbm90IGJlZW4gc2V0IHdpdGggY29ycmVjdCBib3VuZHMuIFRoaXMgY2F1c2VzIGlsbGVnYWwgcGxhY2VtZW50XHJcbiAgICAvLyBhbmQgaW5jb3JyZWN0IGZpbmFsIGxvY2F0aW9uIG9mIGNvbnRyb2xzIG9uIG5lc3RlZCBzdWJmb3Jtc1xyXG4gICAgbGV0IHRhYkFuZEdyb3VwQ29udHJvbHM6IFN0YWNrPE1nQ29udHJvbEJhc2U+ID0gbmV3IFN0YWNrPE1nQ29udHJvbEJhc2U+KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICBjdHJsID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgIGlmICgoY3RybC5pc1RhYkNvbnRyb2woKSB8fCBjdHJsLmlzR3JvdXAoKSkgJiYgIXJlcGVhdGFibGVPbmx5KSB7XHJcbiAgICAgICAgdGFiQW5kR3JvdXBDb250cm9scy5wdXNoKGN0cmwpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGN0cmwuVHlwZSAhPT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgY3RybC5UeXBlICE9PSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DT0xVTU4pIHtcclxuICAgICAgICBpZiAoY3RybC5Jc1JlcGVhdGFibGUgfHwgIXJlcGVhdGFibGVPbmx5KVxyXG4gICAgICAgICAgYXdhaXQgY3RybC5SZWZyZXNoRGlzcGxheSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKGN0cmwuVHlwZSA9PT0gTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfVEFCTEUgJiYgcmVwZWF0YWJsZU9ubHkpXHJcbiAgICAgICAgYXdhaXQgY3RybC5SZWZyZXNoRGlzcGxheShyZXBlYXRhYmxlT25seSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIG1hcmtSb3dOT1RDcmVhdGVkKGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlVORE9fQ1JFQVRFX1RBQkxFX1JPVywgdGhpcy5fdGFibGVNZ0NvbnRyb2wsIGlkeCk7XHJcblxyXG4gICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IHRoaXMuUm93cy5sZW5ndGgpXHJcbiAgICAgIHRoaXMuUm93cy5zZXRfSXRlbShpZHgsIG5ldyBSb3coZmFsc2UsIGZhbHNlKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdmFsaWRhdGUgcm93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgU2VsZWN0Um93KCk6IHZvaWQge1xyXG4gICAgdGhpcy5TZWxlY3RSb3dCeUlkeCh0aGlzLkRpc3BsYXlMaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4ocHVibGljKVxyXG4gIC8vLyBjaGVjayBpZiBzcGVjaWZpZWQgcm93IGlzIHZhbGlkIHJvdyBpbiBwYWdlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlZnJlc2ggdGhlIGNvbnRyb2xzIG9mIHRoZSBjdXJyZW50IHJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gaW50IGlzIHRoZSB0YWJsZSBzaXplPC9yZXR1cm5zPlxyXG4gIGdldFJvd3NJblBhZ2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9yb3dzSW5QYWdlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBpbnQgaXMgdGhlIHRhYmxlIHNpemU8L3JldHVybnM+XHJcbiAgZ2V0TWF4Um93c0luUGFnaW5hdGVkVGFibGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgUm93IGlzIGNyZWF0ZWQgb24gR1VJIGxldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPjwvcGFyYW0+XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic2l6ZVwiPnRoZSB0YWJsZSBzaXplPC9wYXJhbT5cclxuICBzZXRSb3dzSW5QYWdlKHNpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcm93c0luUGFnZSA9IHNpemU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgbWFya3MgdGhpcyByb3cgYXMgbm90IGNyZWF0ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldENvbHVtbnNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgbGV0IGNvbHVtbnNDb3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5DdHJsVGFiICE9PSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpO1xyXG4gICAgICAgIGlmIChjb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTilcclxuICAgICAgICAgIGNvbHVtbnNDb3VudCA9IGNvbHVtbnNDb3VudCArIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sdW1uc0NvdW50O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaW5SZWZyZXNoRGlzcGxheSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pblJlZnJlc2hEaXNwO1xyXG4gIH1cclxuXHJcbiAgc2V0VGl0bGUobmV3VGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgQ29tbWFuZHMuc2V0VGl0bGUodGhpcywgbmV3VGl0bGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgXCJpbiByZWZyZXNoIGRpc3BsYXlcIiBmbGFnXHJcblxyXG4gIGdldENvbnRyb2xJZHgoY3RybDogTWdDb250cm9sQmFzZSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5DdHJsVGFiLmdldENvbnRyb2xJZHgoY3RybCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEV4ZWN1dGUgdGhlIGxheW91dCBhbmQgYWxsIGl0cyBjaGlsZHJlblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRvcEluZGV4RnJvbUdVSSgpOiBudW1iZXIge1xyXG4gICAgbGV0IHRvcERpc3BsYXlMaW5lOiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuaGFzVGFibGUoKSlcclxuICAgICAgdG9wRGlzcGxheUxpbmUgPSBDb21tYW5kcy5nZXRUb3BJbmRleCh0aGlzLmdldE1haW5Db250cm9sKCkpO1xyXG4gICAgcmV0dXJuIHRvcERpc3BsYXlMaW5lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBUUlVFIGlmIHRoaXMgZ3JvdXAgaXMgdGhlIGxhc3QgZ3JvdXAgaW4gdGhlIHRvb2xiYXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZ3JvdXBOdW1iZXJcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+IHRhYmxlIGl0ZW1zIGNvdW50PC9yZXR1cm5zPlxyXG4gIGdldFRhYmxlSXRlbXNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSXRlbXNDb3VudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGFibGUgY29udHJvbCBpcyBhbHdheXMgZmlyc3Qgb24gdGhlIGZvcm1cclxuICAvLy8gV2hlbiB0YWJsZSBpcyBhIGNoaWxkIG9mIHRhYiwgaXQgaXMgY3JlYXRlZCBiZWZvcmUgdGFiJ3MgbGF5ZXJzKFRhYlBhZ2VzKSBhcmUgY3JlYXRlZC5cclxuICAvLy8gQ29tcHV0aW5nIFRhYidzIGNoaWxkcmVuIGNvb3JkaW5hdGVzIGRlcGVuZHMgb24gdGhlIFRhYlBhZ2VzIGJlaW5nIGNyZWF0ZWRcclxuICAvLy8gU28sIHdlIG11c3QgZml4IHRhYmxlJ3MgbG9jYXRpb24gYWZ0ZXIgVGFiIGlzIGNyZWF0ZWRcclxuICAvLy8gUUNSICMyODk5NjZcclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZW1vdmVSZWZzVG9DdHJscygpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgdGhpcy5DdHJsVGFiLmdldEN0cmwoaSkucmVtb3ZlUmVmRnJvbUZpZWxkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHRoaXMgZm9ybSBtYXkgaGF2ZSBBY3RpdmVSb3dIaWdodGxpZ2h0U3RhdGVcclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBidWlsZFRhYmxlQ2hpbGRyZW4oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFibGVDaGlsZHJlbiA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl90YWJsZUNoaWxkcmVuID0gbmV3IExpc3Q8TWdDb250cm9sQmFzZT4oKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkN0cmxUYWIgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgbWluVGFiT3JkZXI6IG51bWJlciA9IDIxNDc0ODM2NDc7XHJcbiAgICAgICAgbGV0IGF1dG9tYXRpY1RhYmJpbmdPcmRlcjogYm9vbGVhbiA9IHRoaXMuaXNBdXRvbWF0aWNUYWJiaW5nT3JkZXIoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuXHJcbiAgICAgICAgICBpZiAoY3RybC5Jc1JlcGVhdGFibGUgfHwgY3RybC5Jc1RhYmxlSGVhZGVyQ2hpbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDaGlsZHJlbi5wdXNoKGN0cmwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF1dG9tYXRpY1RhYmJpbmdPcmRlcikge1xyXG4gICAgICAgICAgICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IGN0cmwuR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfT1JERVIpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAocHJvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlSW50OiBudW1iZXIgPSBwcm9wLkdldENvbXB1dGVkVmFsdWVJbnRlZ2VyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVJbnQgPCBtaW5UYWJPcmRlcilcclxuICAgICAgICAgICAgICAgICAgbWluVGFiT3JkZXIgPSB2YWx1ZUludDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtaW5UYWJPcmRlciAhPT0gSW50MzIuTWF4VmFsdWUgJiYgYXV0b21hdGljVGFiYmluZ09yZGVyKSB7XHJcbiAgICAgICAgICB0aGlzLl9maXJzdFRhYmxlVGFiT3JkZXIgPSBtaW5UYWJPcmRlcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHByZXYgZ3JvdXAgaW5kZXggaWYgZXhpc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3Vyckdyb3VwXCI+PC9wYXJhbT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YWJsZUN0cmxcIj50aGUgdGFibGVDdHJsIHRvIHNldDwvcGFyYW0+XHJcbiAgc2V0VGFibGVDdHJsKHRhYmxlQ3RybDogTWdDb250cm9sQmFzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fdGFibGVNZ0NvbnRyb2wgPSB0YWJsZUN0cmw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInByb3BJZFwiPjwvcGFyYW0+XHJcblxyXG4gIGdldEN0cmxDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuQ3RybFRhYi5nZXRTaXplKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldENvbnRyb2xzQ291bnRFeGNsdWRpbmdTdGF0dXNCYXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgcmVmcmVzaFByb3BzT25FeHByZXNzaW9uKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSAodGhpcy5fcHJvcFRhYiA9PSBudWxsID8gMCA6IHRoaXMuX3Byb3BUYWIuZ2V0U2l6ZSgpKTtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eTtcclxuICAgIGxldCByZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAmJiAhcmVmcmVzaDsgaSsrKSB7XHJcbiAgICAgIHByb3AgPSB0aGlzLl9wcm9wVGFiLmdldFByb3AoaSk7XHJcbiAgICAgIGlmIChwcm9wLmlzRXhwcmVzc2lvbigpKSB7XHJcbiAgICAgICAgcmVmcmVzaCA9IHRydWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoUHJvcHMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRUYWJDb250cm9sKGN0cmw6IE1nQ29udHJvbEJhc2UpOiBNZ0NvbnRyb2xCYXNlIHtcclxuICAgIGxldCBvYmo6IE9iamVjdDtcclxuICAgIGxldCByZXN1bHQ6IE1nQ29udHJvbEJhc2UgPSBudWxsO1xyXG5cclxuICAgIG9iaiA9IGN0cmw7XHJcbiAgICB3aGlsZSAob2JqIGluc3RhbmNlb2YgTWdDb250cm9sQmFzZSkge1xyXG4gICAgICBsZXQgY3VyckN0cmwgPSA8TWdDb250cm9sQmFzZT5vYmo7XHJcbiAgICAgIGlmIChjdXJyQ3RybC5pc1RhYkNvbnRyb2woKSkge1xyXG4gICAgICAgIHJlc3VsdCA9IGN1cnJDdHJsO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIG9iaiA9IGN1cnJDdHJsLmdldFBhcmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIGN0cmwgaXMgbm90IHRhYiBhbmQgbm90IHRhYidzIGNoaWxkIC0gZmluZCBmaXJzdCB0YWIgaW4gdGhlIGZvcm1cclxuICAgIGlmIChyZXN1bHQgPT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5DdHJsVGFiLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgb2JqID0gdGhpcy5DdHJsVGFiLmdldEN0cmwoaSk7XHJcbiAgICAgICAgaWYgKCg8TWdDb250cm9sQmFzZT5vYmopLmlzVGFiQ29udHJvbCgpKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSA8TWdDb250cm9sQmFzZT5vYmo7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZSBjb250cm9scyBvZiB0aGlzIGZvcm1cclxuXHJcbiAgSXNJbnB1dFR5cGUoY3RybDogTWdDb250cm9sQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgc3dpdGNoIChjdHJsLlR5cGUpIHtcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9DSEVDS0JPWDpcclxuICAgICAgY2FzZSBNZ0NvbnRyb2xUeXBlLkNUUkxfVFlQRV9URVhUOlxyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTUJPOlxyXG4gICAgICBjYXNlIE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0xJU1Q6XHJcbiAgICAgIGNhc2UgTWdDb250cm9sVHlwZS5DVFJMX1RZUEVfUkFESU86XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCBsaXN0IG9mIHRhYmxlIGNoaWxkcmVuXHJcblxyXG4gIHB1YmxpYyBHZXRMaXN0T2ZJbnB1dENvbnRyb2xzKCk6IGFueSB7XHJcbiAgICBsZXQgZmlsdGVydGVyTGlzdCA9IHRoaXMuQ3RybFRhYi5maWx0ZXIoKChjKSA9PiB0aGlzLklzSW5wdXRUeXBlKGMpKSk7XHJcbiAgICBsZXQgbmFtZXMgPSBmaWx0ZXJ0ZXJMaXN0LnJlZHVjZSgocHJlLCBjdHJsKSA9PiB7XHJcbiAgICAgIHByZVtjdHJsLlVuaXF1ZU5hbWVdID0gY3RybC5Jc1JlcGVhdGFibGUgPyAnMScgOiAnMCc7XHJcbiAgICAgIHJldHVybiBwcmU7XHJcbiAgICB9LCB7fSk7XHJcbiAgICByZXR1cm4gbmFtZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhYnN0cmFjdCBDb25zdHJ1Y3RNZ0NvbnRyb2woKTogTWdDb250cm9sQmFzZTtcclxuXHJcbiAgLy8gZ2V0R3VpVGFibGVDaGlsZHJlbigpOiBMaXN0PEd1aU1nQ29udHJvbD4ge1xyXG4gIC8vICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0aGlzLl9ndWlUYWJsZUNoaWxkcmVuID09PSBudWxsO1xyXG4gIC8vICAgaWYgKGZsYWcpIHtcclxuICAvLyAgICAgdGhpcy5fZ3VpVGFibGVDaGlsZHJlbiA9IG5ldyBMaXN0PEd1aU1nQ29udHJvbD4oKTtcclxuICAvLyAgICAgbGV0IHRhYmxlQ2hpbGRyZW46IExpc3Q8TWdDb250cm9sQmFzZT4gPSB0aGlzLlRhYmxlQ2hpbGRyZW47XHJcbiAgLy8gICAgIGxldCBlbnVtZXJhdG9yOiBMaXN0X0VudW1lcmF0b3I8TWdDb250cm9sQmFzZT4gPSB0YWJsZUNoaWxkcmVuLkdldEVudW1lcmF0b3IoKTtcclxuICAvLyAgICAgdHJ5IHtcclxuICAvLyAgICAgICB3aGlsZSAoZW51bWVyYXRvci5Nb3ZlTmV4dCgpKSB7XHJcbiAgLy8gICAgICAgICBsZXQgY3VycmVudDogTWdDb250cm9sQmFzZSA9IGVudW1lcmF0b3IuQ3VycmVudDtcclxuICAvLyAgICAgICAgIHRoaXMuX2d1aVRhYmxlQ2hpbGRyZW4uQWRkKGN1cnJlbnQpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBmaW5hbGx5IHtcclxuICAvLyAgICAgICAoPElEaXNwb3NhYmxlPmVudW1lcmF0b3IpLkRpc3Bvc2UoKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIHRoaXMuX2d1aVRhYmxlQ2hpbGRyZW47XHJcbiAgLy8gfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU2V0cyB0aGUgdGFibGUgY29udHJvbCByZWxhdGVkIHRvIHRoaXMgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmVmcmVzaCBmb3JtIGRpc3BsYXkgaWYgaXQgaGFzIGEgcHJvcGVydHkgd2hpY2ggaXMgYW4gZXhwcmVzc2lvblxyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpcnN0VGFibGVSZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3Jvd3NJblBhZ2UgPSBDb21tYW5kcy5nZXRSb3dzSW5QYWdlKHRoaXMuX3RhYmxlTWdDb250cm9sKTtcclxuICAgICAgdGhpcy5SZWZyZXNoUmVwZWF0YWJsZUFsbG93ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZSB0YWJsZSBpdGVtJ3MgY291bnQgYWNjb3JkaW5nIHRvIHBhcmFtZXRlciBzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImR2c2l6ZVwiPm5ldyBkdnNpemU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFibGVJdGVtc0NvdW50XCI+bmV3IHRhYmxlSXRlbXNDb3VudDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZW1vdmVBbGxcIj5yZW1vdmUgYWxsIGVsZW1lbnRzIGZvcm0gdGhlIHRhYmxlIGluY2x1ZGluZyBmaXJzdCBhbmQgbGFzdCBkdW1teSBlbGVtZW50czwvcGFyYW0+XHJcbiAgU2V0VGFibGVJdGVtc0NvdW50KGR2c2l6ZTogbnVtYmVyLCByZW1vdmVBbGw6IGJvb2xlYW4pOiB2b2lkXHJcbiAgU2V0VGFibGVJdGVtc0NvdW50KGR2c2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZDtcclxuICBTZXRUYWJsZUl0ZW1zQ291bnQoZHZzaXplOiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudE9yUmVtb3ZlQWxsOiBhbnksIHJlbW92ZUFsbD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICBpZiAodHlwZW9mIHRhYmxlSXRlbXNDb3VudE9yUmVtb3ZlQWxsID09ICdib29sZWFuJyl7XHJcbiAgICAgIHRoaXMuU2V0VGFibGVJdGVtc0NvdW50XzAoZHZzaXplLCB0YWJsZUl0ZW1zQ291bnRPclJlbW92ZUFsbCk7XHJcbiAgICB9IGVsc2VcclxuICAgICAgdGhpcy5TZXRUYWJsZUl0ZW1zQ291bnRfMShkdnNpemUsIHRhYmxlSXRlbXNDb3VudE9yUmVtb3ZlQWxsLCByZW1vdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTZXRUYWJsZUl0ZW1zQ291bnRfMChkdnNpemU6IG51bWJlciwgcmVtb3ZlQWxsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlNldFRhYmxlSXRlbXNDb3VudF8xKGR2c2l6ZSwgZHZzaXplLCByZW1vdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTZXRUYWJsZUl0ZW1zQ291bnRfMShkdnNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKGR2c2l6ZSwgdGFibGVJdGVtc0NvdW50LCByZW1vdmVBbGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbml0cyB0aGUgdGFibGUgY29udHJvbFxyXG4gIC8vLyB1cGRhdGUgdGFibGUgaXRlbSdzIGNvdW50IGFjY29yZGluZyB0byBwYXJhbWV0ZXIgZHZzaXplXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBJbml0VGFibGVDb250cm9sKCk6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU6IG51bWJlciwgdGFibGVJdGVtc0NvdW50OiBudW1iZXIsIHJlbW92ZUFsbDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgSW5pdFRhYmxlQ29udHJvbChkdlNpemU/OiBudW1iZXIsIHRhYmxlSXRlbXNDb3VudD86IG51bWJlciwgcmVtb3ZlQWxsPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sXzEoZHZTaXplLCB0YWJsZUl0ZW1zQ291bnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB1cGRhdGUgYXJyYXlzIG9mIHRhYmxlIGNoaWxkcmVuIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzaXplXCI+PC9wYXJhbT5cclxuICBVcGRhdGVUYWJsZUNoaWxkcmVuQXJyYXlzU2l6ZShzaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBjaGlsZHJlbjogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IHRoaXMuVGFibGVDaGlsZHJlbjtcclxuICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gY2hpbGRyZW4uZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgY29udHJvbC51cGRhdGVBcnJheXMoc2l6ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLl90YWJsZU1nQ29udHJvbCAhPSBudWxsKVxyXG4gICAgICB0aGlzLl90YWJsZU1nQ29udHJvbC51cGRhdGVBcnJheXMoc2l6ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmluZCB0YWIgY29udHJvbCBmb3IgcGVyZm9ybWluZyBDVFJMK1RBQiAmJiBDVFJMK1NISUZUK1RBQiBhY3Rpb25zXHJcbiAgLy8vICAgdGhlIGNvZGUgb3JpZ2luYWwgaXMgaW4gUlQ6OnNraXBfdG9fdGFiX2NvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmN1cnJlbnQgY29udHJvbDwvcGFyYW0+XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ3tHdWlNZ0Zvcm0nICsgJzogSWQ9JyArIHRoaXMuX3VzZXJTdGF0ZUlkICsgJ30nO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBJbmNsdWRlQ29udHJvbEluVGFiYmluZ09yZGVyKGNvbnRyb2w6IE1nQ29udHJvbEJhc2UpOiBib29sZWFuIHtcclxuICAgIGlmICghY29udHJvbC5Qcm9wZXJ0eUV4aXN0cyhQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQUJfT1JERVIpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIEdldEhhc2hDb2RlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuRm9ybUlzbjtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJvdGVjdGVkIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcblxyXG4gICAgbGV0IHBhcnNlcjogWG1sUGFyc2VyID0gTWFuYWdlci5HZXRDdXJyZW50UnVudGltZUNvbnRleHQoKS5QYXJzZXI7XHJcbiAgICBpZiAoTWdGb3JtQmFzZS5Jc0Zvcm1UYWcoZm91bmRUYWdOYW1lKSlcclxuICAgICAgdGhpcy5maWxsTmFtZShmb3VuZFRhZ05hbWUpO1xyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX1BST1ApXHJcbiAgICAgIHRoaXMuX3Byb3BUYWIuZmlsbERhdGEodGhpcywgJ0YnLCBwYXJzZXIpO1xyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0NPTlRST0wpIHtcclxuICAgICAgdGhpcy5DdHJsVGFiLmZpbGxEYXRhKHRoaXMsIHBhcnNlcik7XHJcbiAgICAgIC8vdGhpcy5pbml0Q29udGV4dFByb3BGb3JDb250cm9scygpO1xyXG4gICAgICBpZiAoIXRoaXMuSGFzVGFibGUoKSlcclxuICAgICAgICB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKE1nRm9ybUJhc2UuSXNFbmRGb3JtVGFnKGZvdW5kVGFnTmFtZSkpIHtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb25zdHJ1Y3RzIGFuIG9iamVjdCBvZiBNZ0NvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBhcmVudENvbnRyb2xcIj48L3BhcmFtPlxyXG5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHB1YmxpYyBpc1Jvd0NyZWF0ZWQoaWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlJvd3MubGVuZ3RoIDw9IGlkeCB8fCBpZHggPCAwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcm93OiBSb3cgPSB0aGlzLlJvd3MuZ2V0X0l0ZW0oaWR4KTtcclxuICAgIGlmIChyb3cgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gcm93LkNyZWF0ZWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGJ1aWxkTGlua2VkQ29udHJvbHNMaXN0cygpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGN0cmw6IE1nQ29udHJvbEJhc2UgPSB0aGlzLkN0cmxUYWIuZ2V0Q3RybChpKTtcclxuICAgICAgbGV0IGxpbmtlZFBhcmVudDogTWdDb250cm9sQmFzZSA9IDxNZ0NvbnRyb2xCYXNlPmN0cmwuZ2V0TGlua2VkUGFyZW50KGZhbHNlKTtcclxuICAgICAgaWYgKGxpbmtlZFBhcmVudCAhPT0gbnVsbClcclxuICAgICAgICBsaW5rZWRQYXJlbnQubGlua0N0cmwoY3RybCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIGxpc3Qgb2YgYWxsIGNvbHVtbnMgY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYnVpbGRUYWJsZUNvbHVtbnNMaXN0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3RhYmxlQ29sdW1ucyA9IG5ldyBMaXN0PE1nQ29udHJvbEJhc2U+KCk7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLkN0cmxUYWIuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgY29udHJvbDogTWdDb250cm9sQmFzZSA9IHRoaXMuQ3RybFRhYi5nZXRDdHJsKGkpO1xyXG4gICAgICAgIGlmIChjb250cm9sLlR5cGUgPT09IE1nQ29udHJvbFR5cGUuQ1RSTF9UWVBFX0NPTFVNTilcclxuICAgICAgICAgIHRoaXMuX3RhYmxlQ29sdW1ucy5wdXNoKGNvbnRyb2wpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB1cGRhdGUgYXJyYXlzIG9mIHRhYmxlIGNoaWxkcmVuIGNvbnRyb2xzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgY3JlYXRlUm93KGlkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLkNSRUFURV9UQUJMRV9ST1csIHRoaXMuX3RhYmxlTWdDb250cm9sLCBpZHgpO1xyXG5cclxuICAgIGlmICh0aGlzLlJvd3MubGVuZ3RoIDw9IGlkeClcclxuICAgICAgdGhpcy5Sb3dzLlNldFNpemUoaWR4ICsgMSk7XHJcblxyXG4gICAgdGhpcy5Sb3dzLnNldF9JdGVtKGlkeCwgbmV3IFJvdyh0cnVlLCB0cnVlKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBNYXJrIGEgcm93IGFzIHNlbGVjdGVkIHJvd1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyb3dJZHhcIj5yb3cgdG8gc2VsZWN0PC9wYXJhbT5cclxuICBwcml2YXRlIFNlbGVjdFJvd0J5SWR4KHJvd0lkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAvLyBjb250cm9sRm9yU2VsZWN0IGNhbiBiZSB0YWJsZSBjb250cm9sIG9yIHRyZWUgY29udHJvbFxyXG4gICAgbGV0IG1haW5Db250cm9sOiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5nZXRNYWluQ29udHJvbCgpO1xyXG5cclxuICAgIGlmIChtYWluQ29udHJvbCAhPT0gbnVsbCAmJiB0aGlzLlJlZnJlc2hSZXBlYXRhYmxlQWxsb3dlZCkge1xyXG4gICAgICBsZXQgaW5kZXg6IG51bWJlciA9IHJvd0lkeDtcclxuICAgICAgaWYgKHRoaXMuX3Rhc2suRGF0YVZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgICAgaW5kZXggPSBHdWlDb25zdGFudHMuTk9fUk9XX1NFTEVDVEVEO1xyXG5cclxuICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLl9wcmV2U2VsSW5kZXgpIHtcclxuICAgICAgICB0aGlzLl9wcmV2U2VsSW5kZXggPSBpbmRleDtcclxuICAgICAgICBDb21tYW5kcy5hZGRPcGVyYXRpb25XaXRoTGluZShDb21tYW5kVHlwZS5TRVRfUFJPUEVSVFksIG1haW5Db250cm9sLCAwLCBIdG1sUHJvcGVydGllcy5TZWxlY3RlZFJvdywgaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBmb3JjZSBhbGwgTWdDb250cm9scyB0byB1cGRhdGUgdGhlIGNvbG9ycyB1c2VkIG9uIHRoZSBjb250cm9sc1xyXG5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5Jbml0VGFibGVDb250cm9sKDEsIDEsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVtb3ZlQWxsXCI+cmVtb3ZlIGFsbCBlbGVtZW50cyBmb3JtIHRoZSB0YWJsZSBpbmNsdWRpbmcgZmlyc3QgYW5kIGxhc3QgZHVtbXkgZWxlbWVudHM8L3BhcmFtPlxyXG4gIHByaXZhdGUgSW5pdFRhYmxlQ29udHJvbF8xKGR2U2l6ZTogbnVtYmVyLCB0YWJsZUl0ZW1zQ291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3RhYmxlTWdDb250cm9sICE9IG51bGwpIHtcclxuICAgICAgQ29tbWFuZHMuYWRkV2l0aE51bWJlcihDb21tYW5kVHlwZS5TRVRfVEFCTEVfSVRFTVNfQ09VTlQsIHRoaXMuX3RhYmxlTWdDb250cm9sLCB0YWJsZUl0ZW1zQ291bnQpO1xyXG4gICAgICBDb21tYW5kcy5hZGRXaXRoTnVtYmVyKENvbW1hbmRUeXBlLlNFVF9DSFVOS19TSVpFLCB0aGlzLl90YWJsZU1nQ29udHJvbCwgKHRoaXMuX3Rhc2suRGF0YVZpZXcpLmdldENodW5rU2l6ZSgpKTtcclxuICAgICAgdGhpcy5fdGFibGVJdGVtc0NvdW50ID0gdGFibGVJdGVtc0NvdW50O1xyXG4gICAgICB0aGlzLlJvd3MuU2V0U2l6ZShkdlNpemUpO1xyXG4gICAgICB0aGlzLl9wcmV2R3VpVG9wSW5kZXggPSAtMjtcclxuICAgICAgdGhpcy5fcHJldlNlbEluZGV4ID0gLTI7XHJcbiAgICAgIHRoaXMuVXBkYXRlVGFibGVDaGlsZHJlbkFycmF5c1NpemUoZHZTaXplKTtcclxuICAgICAgdGhpcy5fbWF4Um93c0luUGFnaW5hdGVkVGFibGUgPSBDb21tYW5kcy5nZXRNYXhSb3dzSW5QYWdpbmF0ZWRUYWJsZSh0aGlzLl90YWJsZU1nQ29udHJvbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHVwZGF0ZSBhcnJheXMgb2YgdGFibGUgY2hpbGRyZW4gY29udHJvbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNpemVcIj48L3BhcmFtPlxyXG4gIHB1YmxpYyBJbnNlcnRUYWJsZUNoaWxkcmVuQXJyYXlzKGlkeDogbnVtYmVyLCBjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgIGxldCBjaGlsZHJlbjogTGlzdDxNZ0NvbnRyb2xCYXNlPiA9IHRoaXMuVGFibGVDaGlsZHJlbjtcclxuICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcclxuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGxldCBjb250cm9sOiBNZ0NvbnRyb2xCYXNlID0gY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgY29udHJvbC5JbnNlcnRBcnJheXMoaWR4LCBjb3VudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgY2xhc3MgZGVzY3JpYmluZyByb3dcclxuLy8vIDwvc3VtbWFyeT5cclxuLy8vIDxhdXRob3I+cmluYXY8L2F1dGhvcj5cclxuZXhwb3J0IGNsYXNzIFJvdyB7XHJcbiAgQ3JlYXRlZDogYm9vbGVhbiA9IGZhbHNlOyAgICAgLy8gaXMgcm93IGNyZWF0ZWQgb24gZ3VpIGxldmVsXHJcbiAgVmFsaWRhdGVkOiBib29sZWFuID0gZmFsc2U7ICAgLy8gaXMgcm93IFZhbGlkYXRlZFxyXG5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKGNyZWF0ZWQ6IGJvb2xlYW4sIHZhbGlkYXRlZDogYm9vbGVhbik7XHJcbiAgY29uc3RydWN0b3IoY3JlYXRlZD86IGJvb2xlYW4sIHZhbGlkYXRlZD86IGJvb2xlYW4pIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnN0cnVjdG9yXzEoY3JlYXRlZCwgdmFsaWRhdGVkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMCgpOiB2b2lkIHtcclxuICAgIHRoaXMuVmFsaWRhdGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShjcmVhdGVkOiBib29sZWFuLCB2YWxpZGF0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuQ3JlYXRlZCA9IGNyZWF0ZWQ7XHJcbiAgICB0aGlzLlZhbGlkYXRlZCA9IHZhbGlkYXRlZDtcclxuICB9XHJcbn1cclxuIl19