@magic-xpa/gui 4.1200.0-dev4120.21 → 4.1200.0-dev4120.213
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/magic-xpa-gui.mjs +5724 -249
- package/fesm2022/magic-xpa-gui.mjs.map +1 -1
- package/index.d.ts +3 -0
- package/package.json +2 -4
- package/src/GuiEnums.d.ts +3 -0
- package/src/gui/GuiMgControl.d.ts +1 -0
- package/src/management/exp/ExpressionInterface.d.ts +1 -0
- package/src/management/gui/MgControlBase.d.ts +1 -1
- package/src/management/gui/PropInterface.d.ts +2 -1
- package/esm2022/index.mjs +0 -71
- package/esm2022/magic-xpa-gui.mjs +0 -2
- package/esm2022/src/Commands.mjs +0 -184
- package/esm2022/src/Events.mjs +0 -425
- package/esm2022/src/EventsProcessor.mjs +0 -67
- package/esm2022/src/FocusManager.mjs +0 -34
- package/esm2022/src/GuiConstants.mjs +0 -68
- package/esm2022/src/GuiEnums.mjs +0 -301
- package/esm2022/src/GuiEnvironment.mjs +0 -4
- package/esm2022/src/IFlowMonitorQueue.mjs +0 -2
- package/esm2022/src/Manager.mjs +0 -91
- package/esm2022/src/UIBridge.mjs +0 -33
- package/esm2022/src/env/IEnvironment.mjs +0 -2
- package/esm2022/src/gui/ControlBase.mjs +0 -3
- package/esm2022/src/gui/GuiMgControl.mjs +0 -123
- package/esm2022/src/gui/GuiMgForm.mjs +0 -4
- package/esm2022/src/gui/KeyboardItem.mjs +0 -135
- package/esm2022/src/gui/LastFocusedVal.mjs +0 -11
- package/esm2022/src/gui/MgValue.mjs +0 -16
- package/esm2022/src/gui/PropParentInterface.mjs +0 -2
- package/esm2022/src/gui/low/DialogHandler.mjs +0 -7
- package/esm2022/src/gui/low/GuiCommand.mjs +0 -68
- package/esm2022/src/gui/low/GuiCommandQueue.mjs +0 -35
- package/esm2022/src/gui/low/GuiInteractive.mjs +0 -178
- package/esm2022/src/gui/low/Style.mjs +0 -20
- package/esm2022/src/management/RuntimeContextBase.mjs +0 -42
- package/esm2022/src/management/data/BlobType.mjs +0 -281
- package/esm2022/src/management/data/DcValues.mjs +0 -214
- package/esm2022/src/management/data/DcValuesBuilderBase.mjs +0 -96
- package/esm2022/src/management/data/FieldDef.mjs +0 -331
- package/esm2022/src/management/data/FieldsTable.mjs +0 -54
- package/esm2022/src/management/data/GuiDataViewBase.mjs +0 -88
- package/esm2022/src/management/data/GuiFieldBase.mjs +0 -82
- package/esm2022/src/management/data/IRecord.mjs +0 -2
- package/esm2022/src/management/data/IReferencedObject.mjs +0 -2
- package/esm2022/src/management/data/NUM_TYPE.mjs +0 -1739
- package/esm2022/src/management/data/ObjectReferenceBase.mjs +0 -48
- package/esm2022/src/management/data/ObjectReferencesCollection.mjs +0 -27
- package/esm2022/src/management/data/RecordUtils.mjs +0 -361
- package/esm2022/src/management/data/VectorType.mjs +0 -612
- package/esm2022/src/management/data/VectorTypeBase.mjs +0 -88
- package/esm2022/src/management/events/IActionManager.mjs +0 -2
- package/esm2022/src/management/events/IGuiEventsManager.mjs +0 -2
- package/esm2022/src/management/exp/ExpressionInterface.mjs +0 -244
- package/esm2022/src/management/exp/GuiExpressionEvaluator.mjs +0 -305
- package/esm2022/src/management/gui/ControlTable.mjs +0 -118
- package/esm2022/src/management/gui/DisplayConvertor.mjs +0 -1649
- package/esm2022/src/management/gui/FieldValidator.mjs +0 -711
- package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +0 -24
- package/esm2022/src/management/gui/GuiFormPropertyAdapter.mjs +0 -11
- package/esm2022/src/management/gui/HebrewDate.mjs +0 -278
- package/esm2022/src/management/gui/Helps.mjs +0 -237
- package/esm2022/src/management/gui/MgControlBase.mjs +0 -1869
- package/esm2022/src/management/gui/MgFormBase.mjs +0 -741
- package/esm2022/src/management/gui/PIC.mjs +0 -1185
- package/esm2022/src/management/gui/PropDefaults.mjs +0 -230
- package/esm2022/src/management/gui/PropInterface.mjs +0 -246
- package/esm2022/src/management/gui/PropTable.mjs +0 -221
- package/esm2022/src/management/gui/Property.mjs +0 -1362
- package/esm2022/src/management/gui/ValidationDetails.mjs +0 -248
- package/esm2022/src/management/gui/ValidationDetailsBase.mjs +0 -93
- package/esm2022/src/management/gui/WrongFormatException.mjs +0 -29
- package/esm2022/src/management/tasks/GuiDataCollection.mjs +0 -4
- package/esm2022/src/management/tasks/GuiTaskBase.mjs +0 -511
- package/esm2022/src/management/tasks/IMGDataTable.mjs +0 -2
- package/esm2022/src/management/tasks/ITask.mjs +0 -2
- package/esm2022/src/management/tasks/MgTimer.mjs +0 -21
- package/esm2022/src/management/tasks/TaskDefinitionId.mjs +0 -54
- package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
- package/esm2022/src/util/MemoryUtil.mjs +0 -35
- package/esm2022/src/util/ObjectReference.mjs +0 -36
- package/esm2022/src/util/UsernamePasswordCredentials.mjs +0 -52
package/esm2022/src/Events.mjs
DELETED
|
@@ -1,425 +0,0 @@
|
|
|
1
|
-
import { Debug, NString, StringBuilder } from "@magic-xpa/mscorelib";
|
|
2
|
-
import { OSEnvironment } from "@magic-xpa/utils";
|
|
3
|
-
export class Events {
|
|
4
|
-
static NonParkableLastParkedCtrlEvent = null;
|
|
5
|
-
static IsBatchRunningInMainContextEvent = null;
|
|
6
|
-
static TranslateEvent = null;
|
|
7
|
-
static PrintPreviewStartEvent = null;
|
|
8
|
-
static PrintPreviewSetCursorEvent = null;
|
|
9
|
-
static InvokeUDPEvent = null;
|
|
10
|
-
static PrintPreviewUpdateEvent = null;
|
|
11
|
-
static CreateRichWindowEvent = null;
|
|
12
|
-
static CreateGuiWindowEvent = null;
|
|
13
|
-
static DestroyGuiWindowEvent = null;
|
|
14
|
-
static PrintPreviewCloseEvent = null;
|
|
15
|
-
static ShowPrintDialogEvent = null;
|
|
16
|
-
static SetModalEvent = null;
|
|
17
|
-
static CtrlFocusEvent = null;
|
|
18
|
-
static GetRuntimeContextEvent = null;
|
|
19
|
-
static SaveLastClickedCtrlEvent = null;
|
|
20
|
-
static SaveLastClickInfoEvent = null;
|
|
21
|
-
static WriteErrorToLogEvent = null;
|
|
22
|
-
static WriteExceptionToLogEvent = null;
|
|
23
|
-
static WriteWarningToLogEvent = null;
|
|
24
|
-
static ShouldLogEvent = null;
|
|
25
|
-
static WriteGuiToLogEvent = null;
|
|
26
|
-
static WriteDevToLogEvent = null;
|
|
27
|
-
static ClearEvent = null;
|
|
28
|
-
static UndoEvent = null;
|
|
29
|
-
static ShouldAddEnterAsKeyEvent = null;
|
|
30
|
-
static ShowSessionStatisticsEvent = null;
|
|
31
|
-
static CopyDataEvent = null;
|
|
32
|
-
static FocusEvent = null;
|
|
33
|
-
static FocusOnNonMagicControlEvent = null;
|
|
34
|
-
static MouseDownEvent = null;
|
|
35
|
-
static TableReorderEvent = null;
|
|
36
|
-
static MouseUpEvent = null;
|
|
37
|
-
static ComboDroppingDownEvent = null;
|
|
38
|
-
static SelectionEvent = null;
|
|
39
|
-
static DblClickEvent = null;
|
|
40
|
-
static KeyDownEvent = null;
|
|
41
|
-
static MultimarkHitEvent = null;
|
|
42
|
-
static CloseFormEvent = null;
|
|
43
|
-
static DisposeEvent = null;
|
|
44
|
-
static TimerEvent = null;
|
|
45
|
-
static TableResizeEvent = null;
|
|
46
|
-
static GetRowsDataEvent = null;
|
|
47
|
-
static EnableCutCopyEvent = null;
|
|
48
|
-
static EnablePasteEvent = null;
|
|
49
|
-
static ColumnClickEvent = null;
|
|
50
|
-
static RefreshTablesEvent = null;
|
|
51
|
-
static HelpCloseEvent = null;
|
|
52
|
-
static DisplaySessionStatisticsEvent = null;
|
|
53
|
-
static ShouldBlockMouseEventsEvent = null;
|
|
54
|
-
static PeekEndOfWorkEvent = null;
|
|
55
|
-
static GetEventTimeEvent = null;
|
|
56
|
-
static ScrollTableEvent = null;
|
|
57
|
-
static GetDropUserFormatsEvent = null;
|
|
58
|
-
static GetContextIDEvent = null;
|
|
59
|
-
static ShowFormEvent = null;
|
|
60
|
-
static OnFormActivateEvent = null;
|
|
61
|
-
static OnNCActivateEvent = null;
|
|
62
|
-
static HandleKeyUpMessageEvent = null;
|
|
63
|
-
static OnIsLogonRTLEvent = null;
|
|
64
|
-
static OnIsSpecialEngLogonEvent = null;
|
|
65
|
-
static OnIsSpecialIgnoreButtonFormatEvent = null;
|
|
66
|
-
static GetMainProgramEvent = null;
|
|
67
|
-
static TranslateLogicalNameEvent = null;
|
|
68
|
-
static GetAssetsURLEvent = null;
|
|
69
|
-
static GetMessageStringEvent = null;
|
|
70
|
-
static OnFocus(ctrl, line, isProduceClick, onMultiMark) {
|
|
71
|
-
Debug.Assert(Events.FocusEvent !== null);
|
|
72
|
-
Events.FocusEvent(ctrl, line, isProduceClick, onMultiMark);
|
|
73
|
-
}
|
|
74
|
-
static OnFocusOnNonMagicControl(ctrl) {
|
|
75
|
-
Debug.Assert(Events.FocusOnNonMagicControlEvent !== null);
|
|
76
|
-
Events.FocusOnNonMagicControlEvent(ctrl);
|
|
77
|
-
}
|
|
78
|
-
static OnMouseDown(guiMgForm, guiMgCtrl, dotNetArgs, leftClickWasPressed, line, onMultiMark, canProduceClick) {
|
|
79
|
-
Debug.Assert(Events.MouseDownEvent !== null);
|
|
80
|
-
Events.MouseDownEvent(guiMgForm, guiMgCtrl, dotNetArgs, leftClickWasPressed, line, onMultiMark, canProduceClick);
|
|
81
|
-
}
|
|
82
|
-
static OnNonParkableLastParkedCtrl(ctrl) {
|
|
83
|
-
if (Events.NonParkableLastParkedCtrlEvent !== null) {
|
|
84
|
-
Events.NonParkableLastParkedCtrlEvent(ctrl);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
static OnTableReorder(ctrl, tabOrderList) {
|
|
88
|
-
if (Events.TableReorderEvent !== null) {
|
|
89
|
-
Events.TableReorderEvent(ctrl, tabOrderList);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
static OnMouseUp(ctrl, line) {
|
|
93
|
-
if (Events.MouseUpEvent !== null) {
|
|
94
|
-
Events.MouseUpEvent(ctrl, line);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
static OnComboDroppingDown(ctrl, line) {
|
|
98
|
-
Debug.Assert(Events.ComboDroppingDownEvent !== null);
|
|
99
|
-
Events.ComboDroppingDownEvent(ctrl, line);
|
|
100
|
-
}
|
|
101
|
-
static OnSelection(val, ctrl, line, produceClick) {
|
|
102
|
-
Debug.Assert(Events.SelectionEvent !== null);
|
|
103
|
-
Events.SelectionEvent(val, ctrl, line, produceClick);
|
|
104
|
-
}
|
|
105
|
-
static OnDblClick(ctrl, line) {
|
|
106
|
-
Debug.Assert(Events.DblClickEvent !== null);
|
|
107
|
-
Events.DblClickEvent(ctrl, line);
|
|
108
|
-
}
|
|
109
|
-
static OnKeyDown(form, guiMgCtrlOrCtrl, modifier, keyCode, startOrSuggestedValue, endOrComboIsDropDown, textOrHandled, isActChar, suggestedValue, comboIsDropDownOrHandled, handled) {
|
|
110
|
-
if (arguments.length === 11)
|
|
111
|
-
Events.OnKeyDown_0(form, guiMgCtrlOrCtrl, modifier, keyCode, startOrSuggestedValue, endOrComboIsDropDown, textOrHandled, isActChar, suggestedValue, comboIsDropDownOrHandled, handled);
|
|
112
|
-
else if (arguments.length === 10)
|
|
113
|
-
Events.OnKeyDown_1(form, guiMgCtrlOrCtrl, modifier, keyCode, startOrSuggestedValue, endOrComboIsDropDown, textOrHandled, isActChar, suggestedValue, comboIsDropDownOrHandled);
|
|
114
|
-
else
|
|
115
|
-
Events.OnKeyDown_2(form, guiMgCtrlOrCtrl, modifier, keyCode, startOrSuggestedValue, endOrComboIsDropDown, textOrHandled);
|
|
116
|
-
}
|
|
117
|
-
static OnKeyDown_0(form, guiMgCtrl, modifier, keyCode, start, end, text, isActChar, suggestedValue, comboIsDropDown, handled) {
|
|
118
|
-
Debug.Assert(Events.KeyDownEvent !== null);
|
|
119
|
-
Events.KeyDownEvent(form, guiMgCtrl, modifier, keyCode, start, end, text, isActChar, suggestedValue, comboIsDropDown, handled);
|
|
120
|
-
}
|
|
121
|
-
static OnMultiMarkHit(ctrl, row, modifier) {
|
|
122
|
-
Debug.Assert(Events.MultimarkHitEvent !== null);
|
|
123
|
-
Events.MultimarkHitEvent(ctrl, row, modifier);
|
|
124
|
-
}
|
|
125
|
-
static OnKeyDown_1(form, ctrl, modifier, keyCode, start, end, text, isActChar, suggestedValue, handled) {
|
|
126
|
-
Debug.Assert(Events.KeyDownEvent !== null);
|
|
127
|
-
return Events.KeyDownEvent(form, ctrl, modifier, keyCode, start, end, text, isActChar, suggestedValue, false, handled);
|
|
128
|
-
}
|
|
129
|
-
static OnKeyDown_2(form, ctrl, modifier, keyCode, suggestedValue, comboIsDropDown, handled) {
|
|
130
|
-
Debug.Assert(Events.KeyDownEvent !== null);
|
|
131
|
-
return Events.KeyDownEvent(form, ctrl, modifier, keyCode, 0, 0, null, false, suggestedValue, comboIsDropDown, handled);
|
|
132
|
-
}
|
|
133
|
-
static OnFormClose(form) {
|
|
134
|
-
Debug.Assert(Events.CloseFormEvent !== null);
|
|
135
|
-
return Events.CloseFormEvent(form);
|
|
136
|
-
}
|
|
137
|
-
static OnDispose(form) {
|
|
138
|
-
Debug.Assert(Events.DisposeEvent !== null);
|
|
139
|
-
Events.DisposeEvent(form);
|
|
140
|
-
}
|
|
141
|
-
static OnTimer(mgTimer) {
|
|
142
|
-
Debug.Assert(Events.TimerEvent !== null);
|
|
143
|
-
Events.TimerEvent(mgTimer);
|
|
144
|
-
}
|
|
145
|
-
static OnTableResize(ctrl, newRowsInPage) {
|
|
146
|
-
if (Events.TableResizeEvent !== null) {
|
|
147
|
-
Events.TableResizeEvent(ctrl, newRowsInPage);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
static OnGetRowsData(ctrl, desiredTopIndex, sendAll, lastFocusedVal) {
|
|
151
|
-
if (Events.GetRowsDataEvent !== null) {
|
|
152
|
-
Events.GetRowsDataEvent(ctrl, desiredTopIndex, sendAll, lastFocusedVal);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
static OnColumnClick(columnCtrl, direction, columnHeader) {
|
|
156
|
-
Debug.Assert(Events.ColumnClickEvent !== null);
|
|
157
|
-
Events.ColumnClickEvent(columnCtrl, direction, columnHeader);
|
|
158
|
-
}
|
|
159
|
-
static RefreshTables() {
|
|
160
|
-
if (Events.RefreshTablesEvent !== null) {
|
|
161
|
-
Events.RefreshTablesEvent();
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
static OnCloseHelp(activeForm) {
|
|
165
|
-
if (Events.HelpCloseEvent !== null) {
|
|
166
|
-
Events.HelpCloseEvent(activeForm);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
static IsBatchRunningInMainContext() {
|
|
170
|
-
let retValue = false;
|
|
171
|
-
if (Events.IsBatchRunningInMainContextEvent !== null) {
|
|
172
|
-
retValue = Events.IsBatchRunningInMainContextEvent();
|
|
173
|
-
}
|
|
174
|
-
return retValue;
|
|
175
|
-
}
|
|
176
|
-
static Translate(fromString) {
|
|
177
|
-
Debug.Assert(Events.TranslateEvent !== null);
|
|
178
|
-
return (fromString !== null && fromString.length > 0) ? Events.TranslateEvent(fromString) : fromString;
|
|
179
|
-
}
|
|
180
|
-
static OnPrintPreviewStart(contextID, ioPtr, copies, enablePDlg, hWnd) {
|
|
181
|
-
if (Events.PrintPreviewStartEvent !== null) {
|
|
182
|
-
Events.PrintPreviewStartEvent(contextID, ioPtr, copies, enablePDlg, hWnd);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
static OnPrintPreviewSetCursor(printPreviewData) {
|
|
186
|
-
if (Events.PrintPreviewSetCursorEvent !== null) {
|
|
187
|
-
Events.PrintPreviewSetCursorEvent(printPreviewData);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
static InvokeUDP(contextId) {
|
|
191
|
-
let ret = 0;
|
|
192
|
-
if (Events.InvokeUDPEvent !== null) {
|
|
193
|
-
ret = Events.InvokeUDPEvent(contextId);
|
|
194
|
-
}
|
|
195
|
-
return ret;
|
|
196
|
-
}
|
|
197
|
-
static OnPrintPreviewUpdate(prnPrevData) {
|
|
198
|
-
if (Events.PrintPreviewUpdateEvent !== null) {
|
|
199
|
-
Events.PrintPreviewUpdateEvent(prnPrevData);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
static OnCreateRichWindow(contextID, ctrlPtr, prmPtr, style, dwExStyle) {
|
|
203
|
-
if (Events.CreateRichWindowEvent !== null) {
|
|
204
|
-
Events.CreateRichWindowEvent(contextID, ctrlPtr, prmPtr, style, dwExStyle);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
static OnCreateGuiWindow(exStyle, className, windowName, style, x, y, width, height, hwndParent, hMenu, hInstance, lParam) {
|
|
208
|
-
let retValue = 0;
|
|
209
|
-
if (Events.CreateGuiWindowEvent !== null) {
|
|
210
|
-
retValue = Events.CreateGuiWindowEvent(exStyle, className, windowName, style, x, y, width, height, hwndParent, hMenu, hInstance, lParam);
|
|
211
|
-
}
|
|
212
|
-
return retValue;
|
|
213
|
-
}
|
|
214
|
-
static OnDestroyGuiWindow(hWndPtr) {
|
|
215
|
-
if (Events.DestroyGuiWindowEvent !== null) {
|
|
216
|
-
Events.DestroyGuiWindowEvent(hWndPtr);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
static OnPrintPreviewClose(printPreviewDataPtr) {
|
|
220
|
-
if (Events.PrintPreviewCloseEvent !== null) {
|
|
221
|
-
Events.PrintPreviewCloseEvent(printPreviewDataPtr);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
static OnShowPrintDialog(gpd) {
|
|
225
|
-
let retValue = 0;
|
|
226
|
-
if (Events.ShowPrintDialogEvent !== null) {
|
|
227
|
-
retValue = Events.ShowPrintDialogEvent(gpd);
|
|
228
|
-
}
|
|
229
|
-
return retValue;
|
|
230
|
-
}
|
|
231
|
-
static DisplaySessionStatistics() {
|
|
232
|
-
if (Events.DisplaySessionStatisticsEvent !== null) {
|
|
233
|
-
Events.DisplaySessionStatisticsEvent();
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
static ShouldBlockMouseEvents(ctrl) {
|
|
237
|
-
return Events.ShouldBlockMouseEventsEvent !== null && Events.ShouldBlockMouseEventsEvent(ctrl);
|
|
238
|
-
}
|
|
239
|
-
static PeekEndOfWork() {
|
|
240
|
-
return Events.PeekEndOfWorkEvent !== null && Events.PeekEndOfWorkEvent();
|
|
241
|
-
}
|
|
242
|
-
static GetEventTime() {
|
|
243
|
-
return (Events.GetEventTimeEvent !== null) ? Events.GetEventTimeEvent() : 0;
|
|
244
|
-
}
|
|
245
|
-
static OnScrollTable(guiMgObject, line, rowsToScroll, isPageScroll, isTableScroll, isRaisedByMouseWheel) {
|
|
246
|
-
let handled = false;
|
|
247
|
-
if (Events.ScrollTableEvent !== null) {
|
|
248
|
-
handled = Events.ScrollTableEvent(guiMgObject, line, rowsToScroll, isPageScroll, isTableScroll, isRaisedByMouseWheel);
|
|
249
|
-
}
|
|
250
|
-
return handled;
|
|
251
|
-
}
|
|
252
|
-
static GetDropUserFormats() {
|
|
253
|
-
Debug.Assert(Events.GetDropUserFormatsEvent !== null);
|
|
254
|
-
return Events.GetDropUserFormatsEvent();
|
|
255
|
-
}
|
|
256
|
-
static GetContextID(guiMgForm) {
|
|
257
|
-
let contextID = -1;
|
|
258
|
-
Debug.Assert(guiMgForm !== null);
|
|
259
|
-
if (Events.GetContextIDEvent !== null) {
|
|
260
|
-
contextID = Events.GetContextIDEvent(guiMgForm);
|
|
261
|
-
}
|
|
262
|
-
return contextID;
|
|
263
|
-
}
|
|
264
|
-
static SetModal(mgForm, on) {
|
|
265
|
-
if (Events.SetModalEvent !== null) {
|
|
266
|
-
Events.SetModalEvent(mgForm, on);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
static OnShowForm(guiMgForm) {
|
|
270
|
-
if (Events.ShowFormEvent !== null) {
|
|
271
|
-
Events.ShowFormEvent(guiMgForm);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
static OnFormActivate(guiMgForm) {
|
|
275
|
-
if (Events.OnFormActivateEvent !== null) {
|
|
276
|
-
Events.OnFormActivateEvent(guiMgForm);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
static OnNCActivate(guiMgForm) {
|
|
280
|
-
if (Events.OnNCActivateEvent !== null) {
|
|
281
|
-
Events.OnNCActivateEvent(guiMgForm);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
static HandleKeyUpMessage(guiMgForm, keyCode) {
|
|
285
|
-
if (Events.HandleKeyUpMessageEvent !== null) {
|
|
286
|
-
Events.HandleKeyUpMessageEvent(guiMgForm, keyCode);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
static IsLogonRTL() {
|
|
290
|
-
let isRTL = false;
|
|
291
|
-
if (Events.OnIsLogonRTLEvent !== null) {
|
|
292
|
-
isRTL = Events.OnIsLogonRTLEvent();
|
|
293
|
-
}
|
|
294
|
-
return isRTL;
|
|
295
|
-
}
|
|
296
|
-
static IsSpecialEngLogon() {
|
|
297
|
-
let isEngLogon = false;
|
|
298
|
-
if (Events.OnIsSpecialEngLogonEvent !== null) {
|
|
299
|
-
isEngLogon = Events.OnIsSpecialEngLogonEvent();
|
|
300
|
-
}
|
|
301
|
-
return isEngLogon;
|
|
302
|
-
}
|
|
303
|
-
static IsSpecialIgnoreButtonFormat() {
|
|
304
|
-
let isIgnoreButtonFormat = false;
|
|
305
|
-
if (Events.OnIsSpecialIgnoreButtonFormatEvent !== null) {
|
|
306
|
-
isIgnoreButtonFormat = Events.OnIsSpecialIgnoreButtonFormatEvent();
|
|
307
|
-
}
|
|
308
|
-
return isIgnoreButtonFormat;
|
|
309
|
-
}
|
|
310
|
-
static GetMainProgram(contextID, ctlIdx) {
|
|
311
|
-
Debug.Assert(Events.GetMainProgramEvent !== null);
|
|
312
|
-
return Events.GetMainProgramEvent(contextID, ctlIdx);
|
|
313
|
-
}
|
|
314
|
-
static TranslateLogicalName(fromString) {
|
|
315
|
-
Debug.Assert(Events.TranslateLogicalNameEvent !== null);
|
|
316
|
-
return Events.TranslateLogicalNameEvent(fromString);
|
|
317
|
-
}
|
|
318
|
-
static GetAssetsURL() {
|
|
319
|
-
Debug.Assert(Events.GetAssetsURLEvent !== null);
|
|
320
|
-
return Events.GetAssetsURLEvent();
|
|
321
|
-
}
|
|
322
|
-
static GetMessageString(msgId) {
|
|
323
|
-
Debug.Assert(Events.GetMessageStringEvent !== null);
|
|
324
|
-
let fromString = Events.GetMessageStringEvent(msgId);
|
|
325
|
-
let text = Events.Translate(fromString);
|
|
326
|
-
if (text !== null && text.endsWith(":")) {
|
|
327
|
-
let str;
|
|
328
|
-
str = new StringBuilder(text);
|
|
329
|
-
str.Insert(text.length, " ");
|
|
330
|
-
text = str.ToString();
|
|
331
|
-
}
|
|
332
|
-
return text;
|
|
333
|
-
}
|
|
334
|
-
static OnCtrlFocus(iTask, ctrl) {
|
|
335
|
-
if (Events.CtrlFocusEvent !== null) {
|
|
336
|
-
Events.CtrlFocusEvent(iTask, ctrl);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
static GetRuntimeContext(contextID) {
|
|
340
|
-
Debug.Assert(Events.GetRuntimeContextEvent !== null);
|
|
341
|
-
return Events.GetRuntimeContextEvent(contextID);
|
|
342
|
-
}
|
|
343
|
-
static SaveLastClickedCtrlName(guiMgControl, controlName) {
|
|
344
|
-
if (Events.SaveLastClickedCtrlEvent !== null) {
|
|
345
|
-
Events.SaveLastClickedCtrlEvent(controlName);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
static SaveLastClickInfo(guiMgForm, controlName, x, y, offsetX, offsetY, lastClickCoordinatesAreInPixels) {
|
|
349
|
-
if (Events.SaveLastClickInfoEvent !== null) {
|
|
350
|
-
Events.SaveLastClickInfoEvent(controlName, x, y, offsetX, offsetY, lastClickCoordinatesAreInPixels);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
static WriteErrorToLog(msg) {
|
|
354
|
-
Debug.Assert(Events.WriteErrorToLogEvent !== null);
|
|
355
|
-
Events.WriteErrorToLogEvent(msg);
|
|
356
|
-
}
|
|
357
|
-
static WriteExceptionToLog(msgOrEx) {
|
|
358
|
-
if (arguments.length === 1 && (msgOrEx === null || msgOrEx.constructor === String)) {
|
|
359
|
-
Events.WriteExceptionToLog_0(msgOrEx);
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
|
-
Events.WriteExceptionToLog_1(msgOrEx);
|
|
363
|
-
}
|
|
364
|
-
static WriteExceptionToLog_0(msg) {
|
|
365
|
-
Debug.Assert(Events.WriteErrorToLogEvent !== null);
|
|
366
|
-
Events.WriteErrorToLogEvent(msg);
|
|
367
|
-
}
|
|
368
|
-
static WriteExceptionToLog_1(ex) {
|
|
369
|
-
Events.WriteExceptionToLog(NString.Format("{0} : {1}{2}{3}{4}", [
|
|
370
|
-
ex.GetType(), OSEnvironment.EolSeq, ex.StackTrace, OSEnvironment.EolSeq, ex.Message
|
|
371
|
-
]));
|
|
372
|
-
}
|
|
373
|
-
static WriteWarningToLog(msgOrEx) {
|
|
374
|
-
if (arguments.length === 1 && (msgOrEx === null || msgOrEx.constructor === String)) {
|
|
375
|
-
Events.WriteWarningToLog_0(msgOrEx);
|
|
376
|
-
return;
|
|
377
|
-
}
|
|
378
|
-
Events.WriteWarningToLog_1(msgOrEx);
|
|
379
|
-
}
|
|
380
|
-
static WriteWarningToLog_0(msg) {
|
|
381
|
-
Debug.Assert(Events.WriteWarningToLogEvent !== null);
|
|
382
|
-
Events.WriteWarningToLogEvent(msg);
|
|
383
|
-
}
|
|
384
|
-
static WriteWarningToLog_1(ex) {
|
|
385
|
-
Events.WriteWarningToLog(ex.GetType() + " : " + OSEnvironment.EolSeq + ex.StackTrace + OSEnvironment.EolSeq + ex.Message);
|
|
386
|
-
}
|
|
387
|
-
static ShouldLog(logLevel) {
|
|
388
|
-
Debug.Assert(Events.ShouldLogEvent !== null);
|
|
389
|
-
return Events.ShouldLogEvent(logLevel);
|
|
390
|
-
}
|
|
391
|
-
static WriteGuiToLog(msg) {
|
|
392
|
-
Debug.Assert(Events.WriteGuiToLogEvent !== null);
|
|
393
|
-
Events.WriteGuiToLogEvent("GUI: " + msg);
|
|
394
|
-
}
|
|
395
|
-
static WriteDevToLog(msg) {
|
|
396
|
-
Debug.Assert(Events.WriteDevToLogEvent !== null);
|
|
397
|
-
Events.WriteDevToLogEvent(msg);
|
|
398
|
-
}
|
|
399
|
-
static OnClear(ctrl) {
|
|
400
|
-
if (Events.ClearEvent !== null) {
|
|
401
|
-
Events.ClearEvent(ctrl);
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
static OnUndo(ctrl) {
|
|
405
|
-
if (Events.UndoEvent !== null) {
|
|
406
|
-
Events.UndoEvent(ctrl);
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
static AddEnterAsKeyEvent() {
|
|
410
|
-
return Events.ShouldAddEnterAsKeyEvent !== null && Events.ShouldAddEnterAsKeyEvent();
|
|
411
|
-
}
|
|
412
|
-
static ShowSessionStatisticsForm() {
|
|
413
|
-
if (Events.ShowSessionStatisticsEvent !== null) {
|
|
414
|
-
Events.ShowSessionStatisticsEvent();
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
static OnCopyData(guiMgForm, copyData) {
|
|
418
|
-
if (Events.CopyDataEvent !== null) {
|
|
419
|
-
Events.CopyDataEvent(guiMgForm, copyData);
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
constructor() {
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL3NyYy9FdmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFDLEtBQUssRUFBbUIsT0FBTyxFQUFFLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBSXBGLE9BQU8sRUFBbUIsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFXakUsTUFBTSxPQUFPLE1BQU07SUFHakIsTUFBTSxDQUFDLDhCQUE4QixHQUFpQyxJQUFJLENBQUM7SUFLM0UsTUFBTSxDQUFDLGdDQUFnQyxHQUFrQixJQUFJLENBQUM7SUFLOUQsTUFBTSxDQUFDLGNBQWMsR0FBbUMsSUFBSSxDQUFDO0lBVTdELE1BQU0sQ0FBQyxzQkFBc0IsR0FBa0csSUFBSSxDQUFDO0lBTXBJLE1BQU0sQ0FBQywwQkFBMEIsR0FBdUMsSUFBSSxDQUFDO0lBTTdFLE1BQU0sQ0FBQyxjQUFjLEdBQWtDLElBQUksQ0FBQztJQU01RCxNQUFNLENBQUMsdUJBQXVCLEdBQWtDLElBQUksQ0FBQztJQVVyRSxNQUFNLENBQUMscUJBQXFCLEdBQW1HLElBQUksQ0FBQztJQWtCcEksTUFBTSxDQUFDLG9CQUFvQixHQUFpTixJQUFJLENBQUM7SUFNalAsTUFBTSxDQUFDLHFCQUFxQixHQUE4QixJQUFJLENBQUM7SUFNL0QsTUFBTSxDQUFDLHNCQUFzQixHQUE4QixJQUFJLENBQUM7SUFNaEUsTUFBTSxDQUFDLG9CQUFvQixHQUE0QixJQUFJLENBQUM7SUFPNUQsTUFBTSxDQUFDLGFBQWEsR0FBOEMsSUFBSSxDQUFDO0lBSXZFLE1BQU0sQ0FBQyxjQUFjLEdBQWdELElBQUksQ0FBQztJQU8xRSxNQUFNLENBQUMsc0JBQXNCLEdBQThDLElBQUksQ0FBQztJQU9oRixNQUFNLENBQUMsd0JBQXdCLEdBQW1DLElBQUksQ0FBQztJQVl2RSxNQUFNLENBQUMsc0JBQXNCLEdBQW9J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QUMsQ0FBQztJQUMzQyxDQUFDO0lBSUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFXO1FBQzlCLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBTUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFrQjtRQUM3QixJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQzVCLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBTUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFrQjtRQUM1QixJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQzNCLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUI7SUFDTCxDQUFDO0lBUUQsTUFBTSxDQUFDLGtCQUFrQjtRQUN2QixPQUFPLE1BQU0sQ0FBQyx3QkFBd0IsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDdkYsQ0FBQztJQUlELE1BQU0sQ0FBQyx5QkFBeUI7UUFDOUIsSUFBSSxNQUFNLENBQUMsMEJBQTBCLEtBQUssSUFBSSxFQUFFO1lBQzlDLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQztJQU9ELE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBb0IsRUFBRSxRQUFnQjtRQUN0RCxJQUFJLE1BQU0sQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQ2pDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzNDO0lBQ0gsQ0FBQztJQUVEO0lBQ0EsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7R3VpTWdDb250cm9sfSBmcm9tIFwiLi9ndWkvR3VpTWdDb250cm9sXCI7XHJcbmltcG9ydCB7TWdGb3JtQmFzZX0gZnJvbSBcIi4vbWFuYWdlbWVudC9ndWkvTWdGb3JtQmFzZVwiO1xyXG5pbXBvcnQge0lUYXNrfSBmcm9tIFwiLi9tYW5hZ2VtZW50L3Rhc2tzL0lUYXNrXCI7XHJcbmltcG9ydCB7TWdDb250cm9sQmFzZX0gZnJvbSBcIi4vbWFuYWdlbWVudC9ndWkvTWdDb250cm9sQmFzZVwiO1xyXG5pbXBvcnQge1J1bnRpbWVDb250ZXh0QmFzZX0gZnJvbSBcIi4vbWFuYWdlbWVudC9SdW50aW1lQ29udGV4dEJhc2VcIjtcclxuaW1wb3J0IHtHdWlNZ0Zvcm19IGZyb20gXCIuL2d1aS9HdWlNZ0Zvcm1cIjtcclxuaW1wb3J0IHtHdWlUYXNrQmFzZX0gZnJvbSBcIi4vbWFuYWdlbWVudC90YXNrcy9HdWlUYXNrQmFzZVwiO1xyXG5pbXBvcnQge0RlYnVnLCBFeGNlcHRpb24sIExpc3QsIE5TdHJpbmcsIFN0cmluZ0J1aWxkZXJ9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge01vZGlmaWVyc30gZnJvbSBcIi4vR3VpRW51bXNcIjtcclxuaW1wb3J0IHtNZ1RpbWVyfSBmcm9tIFwiLi9tYW5hZ2VtZW50L3Rhc2tzL01nVGltZXJcIjtcclxuaW1wb3J0IHtMYXN0Rm9jdXNlZFZhbH0gZnJvbSBcIi4vZ3VpL0xhc3RGb2N1c2VkVmFsXCI7XHJcbmltcG9ydCB7TG9nZ2VyX0xvZ0xldmVscywgT1NFbnZpcm9ubWVudH0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHsgR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlciB9IGZyb20gXCIuL21hbmFnZW1lbnQvZ3VpL0d1aUNvbnRyb2xQcm9wZXJ0eUFkYXB0ZXJcIjtcclxuXHJcbi8vLyA8c3VtbWFyeT5ldmVudHMgcmFpc2VkIGJ5IE1nR3VpLmRsbCBhbmQgaGFuZGxlZCBieSBNZ3hwYVJJQS5leGUgb3IgTWd4cGFSdW50aW1lLmV4ZS5cclxuLy8vIEltcG9ydGFudCBub3RlOiB0aGVzZSBldmVudHMgYXJlIE5PVCByZWxhdGVkIHRoZSBldmVudHMgaGFuZGxpbmcgb2YgTWFnaWMgKFJDIG9yIFJURSkgLVxyXG4vLy8gICB0aGUgZXZlbnRzIGV4cG9zZWQgZnJvbSB0aGlzIGNsYXNzIGNvbnRhaW4gZnVuY3Rpb25hbGl0eSB0aGF0IHRoZSBjdXJyZW50IGFzc2VtYmx5IChNZ0d1aS5kbGwpXHJcbi8vLyAgIHJlcXVpcmVzIGZyb20gZWl0aGVyIE1neHBhUklBLmV4ZSBvciBNZ3hwYVJ1bnRpbWUuZXhlLlxyXG4vLy8gVGhpcyBjbGFzcyBjb250YWlucyBvbmx5IHRoZSBkZWZpbml0aW9ucyBvZiBhbGwgZGVsZWdhdGVzIGFuZCBldmVudHMuXHJcbi8vLyBDbGFzcyAnRXZlbnRzUHJvY2Vzc29yJyBjb250YWlucyBoYW5kbGVycyBmb3IgZXZlbnRzIHRoYXQgY2FuIGJlIHNlcnZlZCBsb2NhbGx5IChieSBNZ0d1aS5kbGwpLFxyXG4vLy8gICBhbmQgcmVnaXN0ZXJlZCBleHRlcm5hbCBoYW5kbGVycyAoaW4gTWd4cGFSSUEuZXhlIG9yIE1neHBhUnVudGltZS5leGUpIGZvciBldmVudHMgdGhhdCBjYW4ndCBiZSBzZXJ2ZWQgbG9jYWxseS5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIEV2ZW50cyB7XHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBWaXNpYmlsaXR5Q2hhbmdlZCBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+Y29udHJvbCB3aG9zZSB2aXNpYmlsaXR5IGlzIGNoYW5nZWQ8L3BhcmFtPlxyXG4gIHN0YXRpYyBOb25QYXJrYWJsZUxhc3RQYXJrZWRDdHJsRXZlbnQ6IChjdHJsOiBHdWlNZ0NvbnRyb2wpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgVFJVRSwgaWYgQmF0Y2ggdGFzayBpcyBydW5uaW5nIGluIE1BSU4gY29udGV4dC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBJc0JhdGNoUnVubmluZ0luTWFpbkNvbnRleHRFdmVudDogKCkgPT4gYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5NTFMgdHJhbnNsYXRpb248L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZnJvbVN0cmluZ1wiPnNvdXJjZSBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50cmFuc2xhdGVkIHN0cmluZzwvcmV0dXJucz5cclxuICBzdGF0aWMgVHJhbnNsYXRlRXZlbnQ6IChmcm9tU3RyaW5nOiBzdHJpbmcpID0+IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlcyBQcmludCBQcmV2aWV3IEZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJZFwiPmNvbnRleHQgaWQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlvUHRyXCI+cG9pbnRlciB0byBjdXJyZW50IElPUlQgb2JqZWN0PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb3BpZXNcIj5udW1iZXIgb2YgY29waWVzPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmFibGVQRGxnXCI+aW5kaWNhdGVzIHdoZXRoZXIgdG8gZW5hYmxlIFByaW50IGRpYWxvZzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaFduZFwiPkhhbmRsZSBvZiBQcmludCBQcmV2aWV3IEZvcm08L3BhcmFtPlxyXG4gIHN0YXRpYyBQcmludFByZXZpZXdTdGFydEV2ZW50OiAoY29udGV4dElEOiBudW1iZXIsIGlvUHRyOiBudW1iZXIsIGNvcGllczogbnVtYmVyLCBlbmFibGVQRGxnOiBib29sZWFuLCBoV25kOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldCBjdXJzb3IgdG8gUHJpbnQgUHJldmlldyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm5QcmV2RGF0YVwiPnByaW50IHByZXZpZXcgZGF0YTwvcGFyYW0+XHJcbiAgc3RhdGljIFByaW50UHJldmlld1NldEN1cnNvckV2ZW50OiAocHJpbnRQcmV2aWV3RGF0YTogbnVtYmVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vIEhhbmRsZXMgSW52b2tlIFVEUCBvcGVyYXRpb24gZnJvbSBHVUkgdGhyZWFkXHJcbiAgLy8vPC9zdW1tYXJ5PlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiY29udGV4dElkXCI+Q29udGV4dCBpZDwvcGFyYW0+XHJcbiAgc3RhdGljIEludm9rZVVEUEV2ZW50OiAoY29udGV4dElkOiBudW1iZXIpID0+IG51bWJlciA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIFByaW50IFByZXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInByblByZXZEYXRhXCI+cHJpbnQgcHJldmlldyBkYXRhPC9wYXJhbT5cclxuICBzdGF0aWMgUHJpbnRQcmV2aWV3VXBkYXRlRXZlbnQ6IChwcm5QcmV2RGF0YTogbnVtYmVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGUgUmljaCBFZGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZXh0SWRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxQdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInBybVB0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3R5bGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImR3RXhTdHlsZVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIENyZWF0ZVJpY2hXaW5kb3dFdmVudDogKGNvbnRleHRJRDogbnVtYmVyLCBjdHJsUHRyOiBudW1iZXIsIHBybVB0cjogbnVtYmVyLCBzdHlsZTogbnVtYmVyLCBkd0V4U3R5bGU6IG51bWJlcikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLzxzdW1tYXJ5PlxyXG4gIC8vLyAgQ3JlYXRlcyBhIHdpbmRvd1xyXG4gIC8vLzwvc3VtbWFyeT5cclxuICAvLy88cGFyYW0gbmFtZT1cImV4U3R5bGVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiY2xhc3NOYW1lXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cIndpbmRvd05hbWVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwic3R5bGVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwieFwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJ5XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cIndpZHRoXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImhlaWdodFwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJod25kUGFyZW50XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImhNZW51XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImhJbnN0YW5jZVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJsUGFyYW1cIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxyZXR1cm5zPmhhbmRsZSBvZiB3aW5kb3c8L3JldHVybnM+XHJcbiAgc3RhdGljIENyZWF0ZUd1aVdpbmRvd0V2ZW50OiAoZXhTdHlsZTogbnVtYmVyLCBjbGFzc05hbWU6IHN0cmluZywgd2luZG93TmFtZTogc3RyaW5nLCBzdHlsZTogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGh3bmRQYXJlbnQ6IG51bWJlciwgaE1lbnU6IG51bWJlciwgaEluc3RhbmNlOiBudW1iZXIsIGxQYXJhbTogbnVtYmVyKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIERlc3Ryb3lzIGEgd2luZG93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoV25kUHRyXCI+aGFuZGxlIG9mIHdpbmRvdzwvcGFyYW0+XHJcbiAgc3RhdGljIERlc3Ryb3lHdWlXaW5kb3dFdmVudDogKGhXbmRQdHI6IG51bWJlcikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gT25DbG9zZSBQcmludCBQcmV2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoV25kUHRyXCI+cHJpbnQgcHJldmlldyBkYXRhPC9wYXJhbT5cclxuICBzdGF0aWMgUHJpbnRQcmV2aWV3Q2xvc2VFdmVudDogKGhXbmRQdHI6IG51bWJlcikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2hvdyBQcmludCBEaWFsb2dcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImdwZFwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFNob3dQcmludERpYWxvZ0V2ZW50OiAoZ3BkOiBudW1iZXIpID0+IG51bWJlciA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0TW9kYWwgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvblwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFNldE1vZGFsRXZlbnQ6IChtZ0Zvcm06IE1nRm9ybUJhc2UsIG9uOiBib29sZWFuKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnJhaXNlcyBDdHJsRm9jdXNFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBDdHJsRm9jdXNFdmVudDogKGlUYXNrOiBJVGFzaywgY3RybDogTWdDb250cm9sQmFzZSkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyB0aGUgUnVudGltZUNvbnRleHRCYXNlIHRoYXQgYmVsb25ncyB0byB0aGUgY29udGV4dElEXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZXh0SURcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldFJ1bnRpbWVDb250ZXh0RXZlbnQ6IChjb250ZXh0SUQ6IHN0cmluZykgPT4gUnVudGltZUNvbnRleHRCYXNlID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTYXZlcyB0aGUgbmFtZSBvZiB0aGUgbGFzdCBjbGlja2VkIGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0NvbnRyb2xcIj5ndWlNZ0NvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xOYW1lXCI+TmFtZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgc3RhdGljIFNhdmVMYXN0Q2xpY2tlZEN0cmxFdmVudDogKCBjb250cm9sTmFtZTogc3RyaW5nKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTYXZlcyB0aGUgbGFzdCBjbGlja2VkIGluZm9ybWF0aW9uLiAoaS5lLiBDby1vcmRpbmF0ZXMgYW5kIGNvbnRyb2wgbmFtZS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPmd1aU1nRm9ybTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udHJvbE5hbWVcIj5uYW1lIG9mIHRoZSBjb250cm9sPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ5XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvZmZzZXRYXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvZmZzZXRZXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsYXN0Q2xpY2tDb29yZGluYXRlc0FyZUluUGl4ZWxzXCI+Y28tb3JkaW5hdGVzIGFyZSBpbiBwaXhlbCBvciBub3QuPC9wYXJhbT5cclxuICBzdGF0aWMgU2F2ZUxhc3RDbGlja0luZm9FdmVudDogKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlciwgbGFzdENsaWNrQ29vcmRpbmF0ZXNBcmVJblBpeGVsczogYm9vbGVhbikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT53cml0ZSBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSBpbnRlcm5hbCBsb2cgZmlsZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZUVycm9yVG9Mb2dFdmVudDogKG1zZzogc3RyaW5nKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PldyaXRlIGFuIGludGVybmFsIGVycm9yIHRvIHRoZSBsb2cuIEFsc28gcHJpbnRzIHN0YWNrIHRyYWNlIGFsb25nIHdpdGggdGhlIG1lc3NhZ2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgV3JpdGVFeGNlcHRpb25Ub0xvZ0V2ZW50OiAobXNnOiBzdHJpbmcpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PndyaXRlIGEgd2FybmluZyBtZXNzYWdlIHRvIHRoZSBpbnRlcm5hbCBsb2cgZmlsZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZVdhcm5pbmdUb0xvZ0V2ZW50OiAobXNnOiBzdHJpbmcpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsb2dMZXZlbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgU2hvdWxkTG9nRXZlbnQ6IChsb2dMZXZlbDogTG9nZ2VyX0xvZ0xldmVscykgPT4gYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT53cml0ZSBhIEdVSSBtZXNzYWdlIHRvIHRoZSBpbnRlcm5hbCBsb2cgZmlsZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZUd1aVRvTG9nRXZlbnQ6IChtc2c6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT53cml0ZSBhIERFViBtZXNzYWdlIHRvIHRoZSBpbnRlcm5hbCBsb2cgZmlsZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZURldlRvTG9nRXZlbnQ6IChtc2c6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxsZWQgd2hlbiBXTV9DTEVBUiBtZXNzYWdlIGlzIHJlY2VpdmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgQ2xlYXJFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2FsbGVkIHdoZW4gV01fVU5ETyBtZXNzYWdlIGlzIHJlY2VpdmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgVW5kb0V2ZW50OiAoY3RybDogR3VpTWdDb250cm9sKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTaG91bGQgRW50ZXIgYmUgYWRkZWQgYXMga2V5Ym9hcmQgZXZlbnQgPyBUaGlzIGlzIGltcG9ydGFudCBtb3N0bHkgaW4gZGV0ZXJtaW5pbmcgaWYgYSBjbGljayBldmVudFxyXG4gIC8vLyB3aWxsIGJlIHJhaXNlZCBmb3IgYSBkZWZhdWx0IGJ1dHRvbiBvciBub3QuXHJcbiAgLy8vIEFkZGluZyBFbnRlciBhcyBhIGtleWJvYXJkIGV2ZW50IHdpbGwgbm90IHJhaXNlIGNsaWNrIG9uIGRlZmF1bHQgYnV0dG9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgU2hvdWxkQWRkRW50ZXJBc0tleUV2ZW50OiAoKSA9PiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIFNob3dTZXNzaW9uU3RhdGlzdGljc0V2ZW50OiAoKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxsZWQgd2hlbiBXTV9DT1BZREFUQSBtZXNzYWdlIGlzIHJlY2VpdmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvcHlEYXRhXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgQ29weURhdGFFdmVudDogKGd1aU1nRm9ybTogR3VpTWdGb3JtLCBjb3B5RGF0YTogbnVtYmVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBmb2N1cyBldmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1Byb2R1Y2VDbGlja1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIEZvY3VzRXZlbnQ6IChjdHJsOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgaXNQcm9kdWNlQ2xpY2s6IGJvb2xlYW4sIG9uTXVsdGlNYXJrOiBib29sZWFuKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBmb2N1cyBvdXQgZXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIEZvY3VzT25Ob25NYWdpY0NvbnRyb2xFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgTW91c2VEb3duIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkb3ROZXRBcmdzXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsZWZ0Q2xpY2tXYXNQcmVzc2VkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbk11bHRpTWFya1wiPmluZGljYXRlcyB0aGF0IE11bHRpIE1hcmsgY29udGludWVzPC9wYXJhbT5cclxuICBzdGF0aWMgTW91c2VEb3duRXZlbnQ6IChndWlNZ0Zvcm06IEd1aU1nRm9ybSwgZ3VpTWdDdHJsOiBHdWlNZ0NvbnRyb2wsIGRvdE5ldEFyZ3M6IE9iamVjdFtdLCBsZWZ0Q2xpY2tXYXNQcmVzc2VkOiBib29sZWFuLCBsaW5lOiBudW1iZXIsIG9uTXVsdGlNYXJrOiBib29sZWFuLCBjYW5Qcm9kdWNlQ2xpY2s6IGJvb2xlYW4pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIFRhYmxlUmVvcmRlciBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YWJPcmRlckxpc3RcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBUYWJsZVJlb3JkZXJFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCwgdGFiT3JkZXJMaXN0OiBMaXN0PEd1aU1nQ29udHJvbD4pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIE1vdXNlVXAgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE1vdXNlVXBFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBDb21ib0Ryb3BwaW5nRG93biBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgQ29tYm9Ecm9wcGluZ0Rvd25FdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBTZWxlY3Rpb24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm9kdWNlQ2xpY2tcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBTZWxlY3Rpb25FdmVudDogKHZhbDogc3RyaW5nLCBjdHJsOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgcHJvZHVjZUNsaWNrOiBib29sZWFuKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBEYmxDbGljayBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgRGJsQ2xpY2tFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBLZXlEb3duIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nQ3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW9kaWZpZXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImtleUNvZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0YXJ0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRleHRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImltXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc0FjdENoYXJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1Z2dlc3RlZFZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb21ib0lzRHJvcERvd25cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhhbmRsZWRcIj5ib29sZWFuIHZhcmlhYmxlIGV2ZW50IGlzIGhhbmRsZWQgb3Igbm90LiA8L3BhcmFtPlxyXG4gIHN0YXRpYyBLZXlEb3duRXZlbnQ6IChmb3JtOiBHdWlNZ0Zvcm0sIGd1aU1nQ3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIGlzQWN0Q2hhcjogYm9vbGVhbiwgc3VnZ2VzdGVkVmFsdWU6IHN0cmluZywgY29tYm9Jc0Ryb3BEb3duOiBib29sZWFuLCBoYW5kbGVkOiBib29sZWFuKSA9PiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBkZWxlZ2F0ZSBmb3IgdGhlIE11bHRpTWFyayBoaXQgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nQ3RybFwiPiBjb250cm9sIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicm93XCI+IHRhYmxlIHJvdyA8L3BhcmFtPlxyXG4gIHN0YXRpYyBNdWx0aW1hcmtIaXRFdmVudDogKGd1aU1nQ3RybDogR3VpTWdDb250cm9sLCByb3c6IG51bWJlciwgbW9kaWZpZXI6IE1vZGlmaWVycykgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgQ2xvc2UgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUgaWYgZXZlbnQgaXMgQ0xSIGhhbmRsZWQoY2xvc2luZyBvZiB0aGUgZm9ybSB3aWxsIGJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgQ0xSIGFuZCBubyBjb21tYW5kcyB3aWxsIGJlIHB1dFxyXG4gIC8vLyBpbiB0byBjbG9zZSB0aGUgZm9ybSkgZWxzZSBmYWxzZS48L3JldHVybnM+XHJcbiAgc3RhdGljIENsb3NlRm9ybUV2ZW50OiAoZm9ybTogR3VpTWdGb3JtKSA9PiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBEaXNwb3NlIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBEaXNwb3NlRXZlbnQ6IChmb3JtOiBHdWlNZ0Zvcm0pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIFRpbWVyIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1nVGltZXJcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBUaW1lckV2ZW50OiAobWdUaW1lcjogTWdUaW1lcikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIFJlc2l6ZSBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdSb3dzSW5QYWdlXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgVGFibGVSZXNpemVFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCwgbmV3Um93c0luUGFnZTogbnVtYmVyKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBHZXRSb3dzRGF0YSBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZXNpcmVkVG9wSW5kZXhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlbmRBbGxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxhc3RGb2N1c2VkVmFsXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgR2V0Um93c0RhdGFFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCwgZGVzaXJlZFRvcEluZGV4OiBudW1iZXIsIHNlbmRBbGw6IGJvb2xlYW4sIGxhc3RGb2N1c2VkVmFsOiBMYXN0Rm9jdXNlZFZhbCkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgRW5hYmxlQ3V0Q29weSBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmFibGVcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBFbmFibGVDdXRDb3B5RXZlbnQ6IChjdHJsOiBHdWlNZ0NvbnRyb2wsIGVuYWJsZTogYm9vbGVhbikgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgRW5hYmxlUGFzdGUgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZW5hYmxlXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgRW5hYmxlUGFzdGVFdmVudDogKGN0cmw6IEd1aU1nQ29udHJvbCwgZW5hYmxlOiBib29sZWFuKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBDb2x1bW5DbGljayBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2x1bW5DdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkaXJlY3Rpb25cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbHVtbkhlYWRlclwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIENvbHVtbkNsaWNrRXZlbnQ6IChjb2x1bW5DdHJsOiBHdWlNZ0NvbnRyb2wsIGRpcmVjdGlvbjogbnVtYmVyLCBjb2x1bW5IZWFkZXI6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pmludm9rZXMgcmVmcmVzaFRhYmxlcyBkZWxlZ2F0ZTwvc3VtbWFyeT5cclxuICBzdGF0aWMgUmVmcmVzaFRhYmxlc0V2ZW50OiAoKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+T25IZWxwQ2xvc2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYWN0aXZlRm9ybVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIEhlbHBDbG9zZUV2ZW50OiAoYWN0aXZlRm9ybTogR3VpTWdGb3JtKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gZGlzcGxheVNlc3Npb25TdGF0aXN0aWNzIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgRGlzcGxheVNlc3Npb25TdGF0aXN0aWNzRXZlbnQ6ICgpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgdHJ1ZSBmb3Igbm9uIGludGVyYWN0aXZlIHRhc2sgZm9yIGFsbCBjb250cm9scyBleGNlcHQgYSBidXR0b24gY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPmNsaWNrZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgU2hvdWxkQmxvY2tNb3VzZUV2ZW50c0V2ZW50OiAoY3RybDogR3VpTWdDb250cm9sKSA9PiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnBlZWtFbmRPZldvcms8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgUGVla0VuZE9mV29ya0V2ZW50OiAoKSA9PiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pmludm9rZXMgdGhlIEdldEV2ZW50VGltZSBkZWxlZ2F0ZTwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRFdmVudFRpbWVFdmVudDogKCkgPT4gbnVtYmVyID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbnZva2VzIHRoZSBTY3JvbGxUYWJsZSBFdmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdPYmplY3RcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJvd3NUb1Njcm9sbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNQYWdlU2Nyb2xsXCI+bmV4dC9wcmV2IHBhZ2U/PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1RhYmxlU2Nyb2xsXCI+QmVnaW4vRW5kIFRhYmxlPzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNSYWlzZWRCeU1vdXNlV2hlZWxcIj5pbmRpY2F0ZXMgd2hldGhlciBldmVudCBpcyByYWlzZWQgYnkgbW91c2V3aGVlbCBvciBub3QuPC9wYXJhbT5cclxuICBzdGF0aWMgU2Nyb2xsVGFibGVFdmVudDogKGd1aU1nT2JqZWN0OiBhbnksIGxpbmU6IG51bWJlciwgcm93c1RvU2Nyb2xsOiBudW1iZXIsIGlzUGFnZVNjcm9sbDogYm9vbGVhbiwgaXNUYWJsZVNjcm9sbDogYm9vbGVhbiwgaXNSYWlzZWRCeU1vdXNlV2hlZWw6IGJvb2xlYW4pID0+IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldHMgdGhlIHVzZXIgZGVmaW5lZCBEcm9wIGZvcm1hdHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldERyb3BVc2VyRm9ybWF0c0V2ZW50OiAoKSA9PiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgY29udGV4dCBpZCBmcm9tIEd1aU1nRm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRDb250ZXh0SURFdmVudDogKGd1aU1nRm9ybTogR3VpTWdGb3JtKSA9PiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIFNob3dGb3JtRXZlbnQ6IChndWlNZ0Zvcm06IEd1aU1nRm9ybSkgPT4gdm9pZCA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW52b2tlcyBPbkZvcm1BY3RpdmF0ZUV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgT25Gb3JtQWN0aXZhdGVFdmVudDogKGd1aU1nRm9ybTogR3VpTWdGb3JtKSA9PiB2b2lkID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbnZva2VzIE9uTkNBY3RpdmF0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIE9uTkNBY3RpdmF0ZUV2ZW50OiAoZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0pID0+IHZvaWQgPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBIYW5kbGUgV01fS0VZVVAgLSAocmVxdWlyZWQgb25seSBmb3IgQUNUX05FWFRfUlRfV0lORE9XLCBBQ1RfUFJFVl9SVF9XSU5ET1cgZm9yIHNvcnRpbmcgd2luZG93bGlzdFxyXG4gIC8vLyB3aGVuIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY3Rpb24gaXMgcmVsZWFzZWQpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImtleUNvZGVcIj5rZXljb2RlIG9mIGEga2V5IHdoaWNoIGlzIGp1c3QgcmVsZWFzZWQ8L3BhcmFtPlxyXG4gIHN0YXRpYyBIYW5kbGVLZXlVcE1lc3NhZ2VFdmVudDogKGd1aU1nRm9ybTogR3VpTWdGb3JtLCBrZXlDb2RlOiBudW1iZXIpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrcyB3aGV0aGVyIHdlIHNob3VsZCBzaG93IExvZ29uIHdpbmRvdyBpbiBSVE9MIGZvcm1hdCBvciBub3QuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBPbklzTG9nb25SVExFdmVudDogKCkgPT4gYm9vbGVhbiA9IG51bGw7XHJcblxyXG5cclxuICBzdGF0aWMgT25Jc1NwZWNpYWxFbmdMb2dvbkV2ZW50OiAoKSA9PiBib29sZWFuID0gbnVsbDtcclxuXHJcblxyXG4gIHN0YXRpYyBPbklzU3BlY2lhbElnbm9yZUJ1dHRvbkZvcm1hdEV2ZW50OiAoKSA9PiBib29sZWFuID0gbnVsbDtcclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgZ2V0TWFpblByb2dyYW0gRXZlbnQgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJRFwiPmFjdGl2ZS90YXJnZXQgY29udGV4dDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RsSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRNYWluUHJvZ3JhbUV2ZW50OiAoY29udGV4dElEOiBudW1iZXIsIGN0bElkeDogbnVtYmVyKSA9PiBHdWlUYXNrQmFzZSA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gTG9naWNhbCBuYW1lIHRyYW5zbGF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmcm9tU3RyaW5nXCI+c291cmNlIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRyYW5zbGF0ZWQgc3RyaW5nPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBUcmFuc2xhdGVMb2dpY2FsTmFtZUV2ZW50OiAoZnJvbVN0cmluZzogc3RyaW5nKSA9PiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEludm9rZXMgdGhlIEdldEFzc2V0c1VSTCBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIEdldEFzc2V0c1VSTEV2ZW50OiAoKSA9PiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+aW52b2tlcyBnZXRNZXNzYWdlU3RyaW5nIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ0lkXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRNZXNzYWdlU3RyaW5nRXZlbnQ6IChtc2dJZDogc3RyaW5nKSA9PiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIGZvY3VzIGV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxpbmVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzUHJvZHVjZUNsaWNrXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25Gb2N1cyhjdHJsOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlciwgaXNQcm9kdWNlQ2xpY2s6IGJvb2xlYW4sIG9uTXVsdGlNYXJrOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLkZvY3VzRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLkZvY3VzRXZlbnQoY3RybCwgbGluZSwgaXNQcm9kdWNlQ2xpY2ssIG9uTXVsdGlNYXJrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgZm9jdXMgZXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybCByZWNlaXZpbmcgbG9zdEZvY3VzXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25Gb2N1c09uTm9uTWFnaWNDb250cm9sKGN0cmw6IEd1aU1nQ29udHJvbCk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Gb2N1c09uTm9uTWFnaWNDb250cm9sRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLkZvY3VzT25Ob25NYWdpY0NvbnRyb2xFdmVudChjdHJsKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIE1vdXNlRG93biBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nQ3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZG90TmV0QXJnc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGVmdENsaWNrV2FzUHJlc3NlZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25NdWx0aU1hcmtcIj5pbmRpY2F0ZXMgdGhhdCBNdWx0aSBNYXJrIGNvbnRpbnVlczwvcGFyYW0+XHJcbiAgc3RhdGljIE9uTW91c2VEb3duKGd1aU1nRm9ybTogR3VpTWdGb3JtLCBndWlNZ0N0cmw6IEd1aU1nQ29udHJvbCwgZG90TmV0QXJnczogYW55W10sIGxlZnRDbGlja1dhc1ByZXNzZWQ6IGJvb2xlYW4sIGxpbmU6IG51bWJlciwgb25NdWx0aU1hcms6IGJvb2xlYW4sIGNhblByb2R1Y2VDbGljazogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Nb3VzZURvd25FdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuTW91c2VEb3duRXZlbnQoZ3VpTWdGb3JtLCBndWlNZ0N0cmwsIGRvdE5ldEFyZ3MsIGxlZnRDbGlja1dhc1ByZXNzZWQsIGxpbmUsIG9uTXVsdGlNYXJrLCBjYW5Qcm9kdWNlQ2xpY2spO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgVmlzaWJpbGl0eUNoYW5nZWQgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPmNvbnRyb2wgd2hvc2UgdmlzaWJpbGl0eSBpcyBjaGFuZ2VkPC9wYXJhbT5cclxuICBzdGF0aWMgT25Ob25QYXJrYWJsZUxhc3RQYXJrZWRDdHJsKGN0cmw6IEd1aU1nQ29udHJvbCk6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5Ob25QYXJrYWJsZUxhc3RQYXJrZWRDdHJsRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLk5vblBhcmthYmxlTGFzdFBhcmtlZEN0cmxFdmVudChjdHJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgVGFibGVSZW9yZGVyIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN0cmxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhYk9yZGVyTGlzdFwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uVGFibGVSZW9yZGVyKGN0cmw6IEd1aU1nQ29udHJvbCwgdGFiT3JkZXJMaXN0OiBMaXN0PEd1aU1nQ29udHJvbD4pOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuVGFibGVSZW9yZGVyRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlRhYmxlUmVvcmRlckV2ZW50KGN0cmwsIHRhYk9yZGVyTGlzdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIE1vdXNlVXAgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uTW91c2VVcChjdHJsOiBHdWlNZ0NvbnRyb2wsIGxpbmU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5Nb3VzZVVwRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLk1vdXNlVXBFdmVudChjdHJsLCBsaW5lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgQ29tYm9Ecm9wcGluZ0Rvd24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uQ29tYm9Ecm9wcGluZ0Rvd24oY3RybDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuQ29tYm9Ecm9wcGluZ0Rvd25FdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuQ29tYm9Ecm9wcGluZ0Rvd25FdmVudChjdHJsLCBsaW5lKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgU2VsZWN0aW9uIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJvZHVjZUNsaWNrXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25TZWxlY3Rpb24odmFsOiBzdHJpbmcsIGN0cmw6IEd1aU1nQ29udHJvbCwgbGluZTogbnVtYmVyLCBwcm9kdWNlQ2xpY2s6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuU2VsZWN0aW9uRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLlNlbGVjdGlvbkV2ZW50KHZhbCwgY3RybCwgbGluZSwgcHJvZHVjZUNsaWNrKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgRGJsQ2xpY2sgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGluZVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uRGJsQ2xpY2soY3RybDogR3VpTWdDb250cm9sLCBsaW5lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuRGJsQ2xpY2tFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuRGJsQ2xpY2tFdmVudChjdHJsLCBsaW5lKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIEtleURvd24gRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdDdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb2RpZmllclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwia2V5Q29kZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RhcnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImVuZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGV4dFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzQWN0Q2hhclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3VnZ2VzdGVkVmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbWJvSXNEcm9wRG93blwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaGFuZGxlZFwiPmJvb2xlYW4gdmFyaWFibGUgZXZlbnQgaXMgaGFuZGxlZCBvciBub3QuIDwvcGFyYW0+XHJcbiAgc3RhdGljIE9uS2V5RG93bihmb3JtOiBHdWlNZ0Zvcm0sIGd1aU1nQ3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIGlzQWN0Q2hhcjogYm9vbGVhbiwgc3VnZ2VzdGVkVmFsdWU6IHN0cmluZywgY29tYm9Jc0Ryb3BEb3duOiBib29sZWFuLCBoYW5kbGVkOiBib29sZWFuKTogdm9pZDtcclxuICBzdGF0aWMgT25LZXlEb3duKGZvcm06IEd1aU1nRm9ybSwgY3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIGlzQWN0Q2hhcjogYm9vbGVhbiwgc3VnZ2VzdGVkVmFsdWU6IHN0cmluZywgaGFuZGxlZDogYm9vbGVhbik6IHZvaWQ7XHJcbiAgc3RhdGljIE9uS2V5RG93bihmb3JtOiBHdWlNZ0Zvcm0sIGN0cmw6IEd1aU1nQ29udHJvbCwgbW9kaWZpZXI6IE1vZGlmaWVycywga2V5Q29kZTogbnVtYmVyLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb21ib0lzRHJvcERvd246IGJvb2xlYW4sIGhhbmRsZWQ6IGJvb2xlYW4pOiB2b2lkO1xyXG4gIHN0YXRpYyBPbktleURvd24oZm9ybTogR3VpTWdGb3JtLCBndWlNZ0N0cmxPckN0cmw6IEd1aU1nQ29udHJvbCwgbW9kaWZpZXI6IE1vZGlmaWVycywga2V5Q29kZTogbnVtYmVyLCBzdGFydE9yU3VnZ2VzdGVkVmFsdWU6IGFueSwgZW5kT3JDb21ib0lzRHJvcERvd246IGFueSwgdGV4dE9ySGFuZGxlZDogYW55LCBpc0FjdENoYXI/OiBib29sZWFuLCBzdWdnZXN0ZWRWYWx1ZT86IHN0cmluZywgY29tYm9Jc0Ryb3BEb3duT3JIYW5kbGVkPzogYm9vbGVhbiwgaGFuZGxlZD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxMSlcclxuICAgICAgRXZlbnRzLk9uS2V5RG93bl8wKGZvcm0sIGd1aU1nQ3RybE9yQ3RybCwgbW9kaWZpZXIsIGtleUNvZGUsIHN0YXJ0T3JTdWdnZXN0ZWRWYWx1ZSwgZW5kT3JDb21ib0lzRHJvcERvd24sIHRleHRPckhhbmRsZWQsIGlzQWN0Q2hhciwgc3VnZ2VzdGVkVmFsdWUsIGNvbWJvSXNEcm9wRG93bk9ySGFuZGxlZCwgaGFuZGxlZCk7XHJcblxyXG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMTApXHJcbiAgICAgIEV2ZW50cy5PbktleURvd25fMShmb3JtLCBndWlNZ0N0cmxPckN0cmwsIG1vZGlmaWVyLCBrZXlDb2RlLCBzdGFydE9yU3VnZ2VzdGVkVmFsdWUsIGVuZE9yQ29tYm9Jc0Ryb3BEb3duLCB0ZXh0T3JIYW5kbGVkLCBpc0FjdENoYXIsIHN1Z2dlc3RlZFZhbHVlLCBjb21ib0lzRHJvcERvd25PckhhbmRsZWQpO1xyXG4gICAgZWxzZVxyXG4gICAgICBFdmVudHMuT25LZXlEb3duXzIoZm9ybSwgZ3VpTWdDdHJsT3JDdHJsLCBtb2RpZmllciwga2V5Q29kZSwgc3RhcnRPclN1Z2dlc3RlZFZhbHVlLCBlbmRPckNvbWJvSXNEcm9wRG93biwgdGV4dE9ySGFuZGxlZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBPbktleURvd25fMChmb3JtOiBHdWlNZ0Zvcm0sIGd1aU1nQ3RybDogR3VpTWdDb250cm9sLCBtb2RpZmllcjogTW9kaWZpZXJzLCBrZXlDb2RlOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIGlzQWN0Q2hhcjogYm9vbGVhbiwgc3VnZ2VzdGVkVmFsdWU6IHN0cmluZywgY29tYm9Jc0Ryb3BEb3duOiBib29sZWFuLCBoYW5kbGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLktleURvd25FdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuS2V5RG93bkV2ZW50KGZvcm0sIGd1aU1nQ3RybCwgbW9kaWZpZXIsIGtleUNvZGUsIHN0YXJ0LCBlbmQsIHRleHQsIGlzQWN0Q2hhciwgc3VnZ2VzdGVkVmFsdWUsIGNvbWJvSXNEcm9wRG93biwgaGFuZGxlZCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgT25NdWx0aU1hcmtIaXQoY3RybDogR3VpTWdDb250cm9sLCByb3c6IG51bWJlciwgbW9kaWZpZXI6IE1vZGlmaWVycyk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5NdWx0aW1hcmtIaXRFdmVudCAhPT0gbnVsbCk7XHJcbiAgICBFdmVudHMuTXVsdGltYXJrSGl0RXZlbnQoY3RybCwgcm93LCBtb2RpZmllcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBPbktleURvd25fMShmb3JtOiBHdWlNZ0Zvcm0sIGN0cmw6IEd1aU1nQ29udHJvbCwgbW9kaWZpZXI6IE1vZGlmaWVycywga2V5Q29kZTogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdGV4dDogc3RyaW5nLCBpc0FjdENoYXI6IGJvb2xlYW4sIHN1Z2dlc3RlZFZhbHVlOiBzdHJpbmcsIGhhbmRsZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuS2V5RG93bkV2ZW50ICE9PSBudWxsKTtcclxuICAgIHJldHVybiBFdmVudHMuS2V5RG93bkV2ZW50KGZvcm0sIGN0cmwsIG1vZGlmaWVyLCBrZXlDb2RlLCBzdGFydCwgZW5kLCB0ZXh0LCBpc0FjdENoYXIsIHN1Z2dlc3RlZFZhbHVlLCBmYWxzZSwgaGFuZGxlZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBPbktleURvd25fMihmb3JtOiBHdWlNZ0Zvcm0sIGN0cmw6IEd1aU1nQ29udHJvbCwgbW9kaWZpZXI6IE1vZGlmaWVycywga2V5Q29kZTogbnVtYmVyLCBzdWdnZXN0ZWRWYWx1ZTogc3RyaW5nLCBjb21ib0lzRHJvcERvd246IGJvb2xlYW4sIGhhbmRsZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuS2V5RG93bkV2ZW50ICE9PSBudWxsKTtcclxuICAgIHJldHVybiBFdmVudHMuS2V5RG93bkV2ZW50KGZvcm0sIGN0cmwsIG1vZGlmaWVyLCBrZXlDb2RlLCAwLCAwLCBudWxsLCBmYWxzZSwgc3VnZ2VzdGVkVmFsdWUsIGNvbWJvSXNEcm9wRG93biwgaGFuZGxlZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIENsb3NlIEV2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50cnVlIGlmIGV2ZW50IGlzIENMUiBoYW5kbGVkKGNsb3Npbmcgb2YgdGhlIGZvcm0gd2lsbCBiZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIENMUiBhbmQgbm8gY29tbWFuZHMgd2lsbCBiZSBwdXRcclxuICAvLy8gaW4gdG8gY2xvc2UgdGhlIGZvcm0pIGVsc2UgZmFsc2UuPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBPbkZvcm1DbG9zZShmb3JtOiBHdWlNZ0Zvcm0pOiBib29sZWFuIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuQ2xvc2VGb3JtRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5DbG9zZUZvcm1FdmVudChmb3JtKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgRGlzcG9zZSBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmb3JtXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25EaXNwb3NlKGZvcm06IEd1aU1nRm9ybSk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5EaXNwb3NlRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLkRpc3Bvc2VFdmVudChmb3JtKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgVGltZXIgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWdUaW1lclwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uVGltZXIobWdUaW1lcjogTWdUaW1lcik6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5UaW1lckV2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5UaW1lckV2ZW50KG1nVGltZXIpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGludm9rZXMgdGhlIFJlc2l6ZSBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJuZXdSb3dzSW5QYWdlXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25UYWJsZVJlc2l6ZShjdHJsOiBHdWlNZ0NvbnRyb2wsIG5ld1Jvd3NJblBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5UYWJsZVJlc2l6ZUV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5UYWJsZVJlc2l6ZUV2ZW50KGN0cmwsIG5ld1Jvd3NJblBhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBpbnZva2VzIHRoZSBHZXRSb3dzRGF0YSBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZXNpcmVkVG9wSW5kZXhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlbmRBbGxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxhc3RGb2N1c2VkVmFsXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25HZXRSb3dzRGF0YShjdHJsOiBHdWlNZ0NvbnRyb2wsIGRlc2lyZWRUb3BJbmRleDogbnVtYmVyLCBzZW5kQWxsOiBib29sZWFuLCBsYXN0Rm9jdXNlZFZhbDogTGFzdEZvY3VzZWRWYWwpOiB2b2lkIHtcclxuICAgICAgaWYgKEV2ZW50cy5HZXRSb3dzRGF0YUV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBFdmVudHMuR2V0Um93c0RhdGFFdmVudChjdHJsLCBkZXNpcmVkVG9wSW5kZXgsIHNlbmRBbGwsIGxhc3RGb2N1c2VkVmFsKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgQ29sdW1uQ2xpY2sgRXZlbnQ8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29sdW1uQ3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGlyZWN0aW9uXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb2x1bW5IZWFkZXJcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkNvbHVtbkNsaWNrKGNvbHVtbkN0cmw6IEd1aU1nQ29udHJvbCwgZGlyZWN0aW9uOiBudW1iZXIsIGNvbHVtbkhlYWRlcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLkNvbHVtbkNsaWNrRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLkNvbHVtbkNsaWNrRXZlbnQoY29sdW1uQ3RybCwgZGlyZWN0aW9uLCBjb2x1bW5IZWFkZXIpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pmludm9rZXMgcmVmcmVzaFRhYmxlcyBkZWxlZ2F0ZTwvc3VtbWFyeT5cclxuICBzdGF0aWMgUmVmcmVzaFRhYmxlcygpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuUmVmcmVzaFRhYmxlc0V2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5SZWZyZXNoVGFibGVzRXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+T25IZWxwQ2xvc2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYWN0aXZlRm9ybVwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uQ2xvc2VIZWxwKGFjdGl2ZUZvcm06IEd1aU1nRm9ybSk6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5IZWxwQ2xvc2VFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuSGVscENsb3NlRXZlbnQoYWN0aXZlRm9ybSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm5zIFRSVUUsIGlmIEJhdGNoIHRhc2sgaXMgcnVubmluZyBpbiBNQUlOIGNvbnRleHQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgSXNCYXRjaFJ1bm5pbmdJbk1haW5Db250ZXh0KCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJldFZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoRXZlbnRzLklzQmF0Y2hSdW5uaW5nSW5NYWluQ29udGV4dEV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIHJldFZhbHVlID0gRXZlbnRzLklzQmF0Y2hSdW5uaW5nSW5NYWluQ29udGV4dEV2ZW50KCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0VmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pk1MUyB0cmFuc2xhdGlvbjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmcm9tU3RyaW5nXCI+c291cmNlIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRyYW5zbGF0ZWQgc3RyaW5nPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBUcmFuc2xhdGUoZnJvbVN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuVHJhbnNsYXRlRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIChmcm9tU3RyaW5nICE9PSBudWxsICYmIGZyb21TdHJpbmcubGVuZ3RoID4gMCkgPyBFdmVudHMuVHJhbnNsYXRlRXZlbnQoZnJvbVN0cmluZykgOiBmcm9tU3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDcmVhdGVzIFByaW50IFByZXZpZXcgRm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGV4dElkXCI+Y29udGV4dCBpZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW9QdHJcIj5wb2ludGVyIHRvIGN1cnJlbnQgSU9SVCBvYmplY3Q8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvcGllc1wiPm51bWJlciBvZiBjb3BpZXM8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImVuYWJsZVBEbGdcIj5pbmRpY2F0ZXMgd2hldGhlciB0byBlbmFibGUgUHJpbnQgZGlhbG9nPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoV25kXCI+SGFuZGxlIG9mIFByaW50IFByZXZpZXcgRm9ybTwvcGFyYW0+XHJcbiAgc3RhdGljIE9uUHJpbnRQcmV2aWV3U3RhcnQoY29udGV4dElEOiBudW1iZXIsIGlvUHRyOiBudW1iZXIsIGNvcGllczogbnVtYmVyLCBlbmFibGVQRGxnOiBib29sZWFuLCBoV25kOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuUHJpbnRQcmV2aWV3U3RhcnRFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuUHJpbnRQcmV2aWV3U3RhcnRFdmVudChjb250ZXh0SUQsIGlvUHRyLCBjb3BpZXMsIGVuYWJsZVBEbGcsIGhXbmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTZXQgY3Vyc29yIHRvIFByaW50IFByZXZpZXcgZm9ybVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicHJuUHJldkRhdGFcIj5wcmludCBwcmV2aWV3IGRhdGE8L3BhcmFtPlxyXG4gIHN0YXRpYyBPblByaW50UHJldmlld1NldEN1cnNvcihwcmludFByZXZpZXdEYXRhOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuUHJpbnRQcmV2aWV3U2V0Q3Vyc29yRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlByaW50UHJldmlld1NldEN1cnNvckV2ZW50KHByaW50UHJldmlld0RhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+XHJcbiAgLy8vIEhhbmRsZXMgSW52b2tlIFVEUCBvcGVyYXRpb24gZnJvbSBHVUkgdGhyZWFkXHJcbiAgLy8vPC9zdW1tYXJ5PlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiY29udGV4dElkXCI+Q29udGV4dCBpZDwvcGFyYW0+XHJcbiAgc3RhdGljIEludm9rZVVEUChjb250ZXh0SWQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0OiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKEV2ZW50cy5JbnZva2VVRFBFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICByZXQgPSBFdmVudHMuSW52b2tlVURQRXZlbnQoY29udGV4dElkKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFVwZGF0ZSBQcmludCBQcmV2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm5QcmV2RGF0YVwiPnByaW50IHByZXZpZXcgZGF0YTwvcGFyYW0+XHJcbiAgc3RhdGljIE9uUHJpbnRQcmV2aWV3VXBkYXRlKHByblByZXZEYXRhOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuUHJpbnRQcmV2aWV3VXBkYXRlRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlByaW50UHJldmlld1VwZGF0ZUV2ZW50KHByblByZXZEYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ3JlYXRlIFJpY2ggRWRpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGV4dElkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsUHRyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwcm1QdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0eWxlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkd0V4U3R5bGVcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPbkNyZWF0ZVJpY2hXaW5kb3coY29udGV4dElEOiBudW1iZXIsIGN0cmxQdHI6IG51bWJlciwgcHJtUHRyOiBudW1iZXIsIHN0eWxlOiBudW1iZXIsIGR3RXhTdHlsZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLkNyZWF0ZVJpY2hXaW5kb3dFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuQ3JlYXRlUmljaFdpbmRvd0V2ZW50KGNvbnRleHRJRCwgY3RybFB0ciwgcHJtUHRyLCBzdHlsZSwgZHdFeFN0eWxlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PlxyXG4gIC8vLyAgQ3JlYXRlcyBhIHdpbmRvd1xyXG4gIC8vLzwvc3VtbWFyeT5cclxuICAvLy88cGFyYW0gbmFtZT1cImV4U3R5bGVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwiY2xhc3NOYW1lXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cIndpbmRvd05hbWVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwic3R5bGVcIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxwYXJhbSBuYW1lPVwieFwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJ5XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cIndpZHRoXCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImhlaWdodFwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJod25kUGFyZW50XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImhNZW51XCI+ISEuPC9wYXJhbT5cclxuICAvLy88cGFyYW0gbmFtZT1cImhJbnN0YW5jZVwiPiEhLjwvcGFyYW0+XHJcbiAgLy8vPHBhcmFtIG5hbWU9XCJsUGFyYW1cIj4hIS48L3BhcmFtPlxyXG4gIC8vLzxyZXR1cm5zPmhhbmRsZSBvZiB3aW5kb3c8L3JldHVybnM+XHJcbiAgc3RhdGljIE9uQ3JlYXRlR3VpV2luZG93KGV4U3R5bGU6IG51bWJlciwgY2xhc3NOYW1lOiBzdHJpbmcsIHdpbmRvd05hbWU6IHN0cmluZywgc3R5bGU6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBod25kUGFyZW50OiBudW1iZXIsIGhNZW51OiBudW1iZXIsIGhJbnN0YW5jZTogbnVtYmVyLCBsUGFyYW06IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0VmFsdWU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAoRXZlbnRzLkNyZWF0ZUd1aVdpbmRvd0V2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIHJldFZhbHVlID0gRXZlbnRzLkNyZWF0ZUd1aVdpbmRvd0V2ZW50KGV4U3R5bGUsIGNsYXNzTmFtZSwgd2luZG93TmFtZSwgc3R5bGUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGh3bmRQYXJlbnQsIGhNZW51LCBoSW5zdGFuY2UsIGxQYXJhbSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0VmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIERlc3Ryb3lzIGEgd2luZG93XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJoV25kUHRyXCI+aGFuZGxlIG9mIHdpbmRvdzwvcGFyYW0+XHJcbiAgc3RhdGljIE9uRGVzdHJveUd1aVdpbmRvdyhoV25kUHRyOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuRGVzdHJveUd1aVdpbmRvd0V2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5EZXN0cm95R3VpV2luZG93RXZlbnQoaFduZFB0cik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIE9uQ2xvc2UgUHJpbnQgUHJldmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaFduZFB0clwiPnByaW50IHByZXZpZXcgZGF0YTwvcGFyYW0+XHJcbiAgc3RhdGljIE9uUHJpbnRQcmV2aWV3Q2xvc2UocHJpbnRQcmV2aWV3RGF0YVB0cjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLlByaW50UHJldmlld0Nsb3NlRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlByaW50UHJldmlld0Nsb3NlRXZlbnQocHJpbnRQcmV2aWV3RGF0YVB0cik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNob3cgUHJpbnQgRGlhbG9nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJncGRcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBPblNob3dQcmludERpYWxvZyhncGQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0VmFsdWU6IG51bWJlciA9IDA7XHJcbiAgICBpZiAoRXZlbnRzLlNob3dQcmludERpYWxvZ0V2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIHJldFZhbHVlID0gRXZlbnRzLlNob3dQcmludERpYWxvZ0V2ZW50KGdwZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0VmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGRpc3BsYXlTZXNzaW9uU3RhdGlzdGljcyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIERpc3BsYXlTZXNzaW9uU3RhdGlzdGljcygpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuRGlzcGxheVNlc3Npb25TdGF0aXN0aWNzRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLkRpc3BsYXlTZXNzaW9uU3RhdGlzdGljc0V2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybnMgdHJ1ZSBmb3Igbm9uIGludGVyYWN0aXZlIHRhc2sgZm9yIGFsbCBjb250cm9scyBleGNlcHQgYSBidXR0b24gY29udHJvbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPmNsaWNrZWQgY29udHJvbDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgU2hvdWxkQmxvY2tNb3VzZUV2ZW50cyhjdHJsOiBHdWlNZ0NvbnRyb2wpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBFdmVudHMuU2hvdWxkQmxvY2tNb3VzZUV2ZW50c0V2ZW50ICE9PSBudWxsICYmIEV2ZW50cy5TaG91bGRCbG9ja01vdXNlRXZlbnRzRXZlbnQoY3RybCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+cGVla0VuZE9mV29yazwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBQZWVrRW5kT2ZXb3JrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEV2ZW50cy5QZWVrRW5kT2ZXb3JrRXZlbnQgIT09IG51bGwgJiYgRXZlbnRzLlBlZWtFbmRPZldvcmtFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pmludm9rZXMgdGhlIEdldEV2ZW50VGltZSBkZWxlZ2F0ZTwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRFdmVudFRpbWUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoRXZlbnRzLkdldEV2ZW50VGltZUV2ZW50ICE9PSBudWxsKSA/IEV2ZW50cy5HZXRFdmVudFRpbWVFdmVudCgpIDogMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW52b2tlcyB0aGUgU2Nyb2xsVGFibGUgRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImd1aU1nT2JqZWN0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJsaW5lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyb3dzVG9TY3JvbGxcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzUGFnZVNjcm9sbFwiPm5leHQvcHJldiBwYWdlPzwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNUYWJsZVNjcm9sbFwiPkJlZ2luL0VuZCBUYWJsZT88L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzUmFpc2VkQnlNb3VzZVdoZWVsXCI+aW5kaWNhdGVzIHdoZXRoZXIgZXZlbnQgaXMgcmFpc2VkIGJ5IG1vdXNld2hlZWwgb3Igbm90LjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uU2Nyb2xsVGFibGUoZ3VpTWdPYmplY3Q6IGFueSwgbGluZTogbnVtYmVyLCByb3dzVG9TY3JvbGw6IG51bWJlciwgaXNQYWdlU2Nyb2xsOiBib29sZWFuLCBpc1RhYmxlU2Nyb2xsOiBib29sZWFuLCBpc1JhaXNlZEJ5TW91c2VXaGVlbDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGhhbmRsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChFdmVudHMuU2Nyb2xsVGFibGVFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBoYW5kbGVkID0gRXZlbnRzLlNjcm9sbFRhYmxlRXZlbnQoZ3VpTWdPYmplY3QsIGxpbmUsIHJvd3NUb1Njcm9sbCwgaXNQYWdlU2Nyb2xsLCBpc1RhYmxlU2Nyb2xsLCBpc1JhaXNlZEJ5TW91c2VXaGVlbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaGFuZGxlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyB0aGUgdXNlciBkZWZpbmVkIERyb3AgZm9ybWF0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0RHJvcFVzZXJGb3JtYXRzKCk6IHN0cmluZyB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLkdldERyb3BVc2VyRm9ybWF0c0V2ZW50ICE9PSBudWxsKTtcclxuICAgIHJldHVybiBFdmVudHMuR2V0RHJvcFVzZXJGb3JtYXRzRXZlbnQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBjb250ZXh0IGlkIGZyb20gR3VpTWdGb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIEdldENvbnRleHRJRChndWlNZ0Zvcm06IEd1aU1nRm9ybSk6IG51bWJlciB7XHJcbiAgICBsZXQgY29udGV4dElEOiBudW1iZXIgPSAtMTtcclxuICAgIERlYnVnLkFzc2VydChndWlNZ0Zvcm0gIT09IG51bGwpO1xyXG4gICAgaWYgKEV2ZW50cy5HZXRDb250ZXh0SURFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBjb250ZXh0SUQgPSBFdmVudHMuR2V0Q29udGV4dElERXZlbnQoZ3VpTWdGb3JtKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb250ZXh0SUQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNldE1vZGFsIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib25cIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBTZXRNb2RhbChtZ0Zvcm06IE1nRm9ybUJhc2UsIG9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLlNldE1vZGFsRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlNldE1vZGFsRXZlbnQobWdGb3JtLCBvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIE9uU2hvd0Zvcm0oZ3VpTWdGb3JtOiBHdWlNZ0Zvcm0pOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuU2hvd0Zvcm1FdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuU2hvd0Zvcm1FdmVudChndWlNZ0Zvcm0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBpbnZva2VzIE9uRm9ybUFjdGl2YXRlRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBPbkZvcm1BY3RpdmF0ZShndWlNZ0Zvcm06IEd1aU1nRm9ybSk6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5PbkZvcm1BY3RpdmF0ZUV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5PbkZvcm1BY3RpdmF0ZUV2ZW50KGd1aU1nRm9ybSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGludm9rZXMgT25OQ0FjdGl2YXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgT25OQ0FjdGl2YXRlKGd1aU1nRm9ybTogR3VpTWdGb3JtKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLk9uTkNBY3RpdmF0ZUV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5Pbk5DQWN0aXZhdGVFdmVudChndWlNZ0Zvcm0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSGFuZGxlIFdNX0tFWVVQIC0gKHJlcXVpcmVkIG9ubHkgZm9yIEFDVF9ORVhUX1JUX1dJTkRPVywgQUNUX1BSRVZfUlRfV0lORE9XIGZvciBzb3J0aW5nIHdpbmRvd2xpc3RcclxuICAvLy8gd2hlbiB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWN0aW9uIGlzIHJlbGVhc2VkKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdGb3JtXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJrZXlDb2RlXCI+a2V5Y29kZSBvZiBhIGtleSB3aGljaCBpcyBqdXN0IHJlbGVhc2VkPC9wYXJhbT5cclxuICBzdGF0aWMgSGFuZGxlS2V5VXBNZXNzYWdlKGd1aU1nRm9ybTogR3VpTWdGb3JtLCBrZXlDb2RlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChFdmVudHMuSGFuZGxlS2V5VXBNZXNzYWdlRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLkhhbmRsZUtleVVwTWVzc2FnZUV2ZW50KGd1aU1nRm9ybSwga2V5Q29kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGNoZWNrcyB3aGV0aGVyIHdlIHNob3VsZCBzaG93IExvZ29uIHdpbmRvdyBpbiBSVE9MIGZvcm1hdCBvciBub3QuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBJc0xvZ29uUlRMKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzUlRMOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAoRXZlbnRzLk9uSXNMb2dvblJUTEV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIGlzUlRMID0gRXZlbnRzLk9uSXNMb2dvblJUTEV2ZW50KCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNSVEw7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgSXNTcGVjaWFsRW5nTG9nb24oKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNFbmdMb2dvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKEV2ZW50cy5PbklzU3BlY2lhbEVuZ0xvZ29uRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgaXNFbmdMb2dvbiA9IEV2ZW50cy5PbklzU3BlY2lhbEVuZ0xvZ29uRXZlbnQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpc0VuZ0xvZ29uO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIElzU3BlY2lhbElnbm9yZUJ1dHRvbkZvcm1hdCgpOiBib29sZWFuIHtcclxuICAgIGxldCBpc0lnbm9yZUJ1dHRvbkZvcm1hdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKEV2ZW50cy5PbklzU3BlY2lhbElnbm9yZUJ1dHRvbkZvcm1hdEV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIGlzSWdub3JlQnV0dG9uRm9ybWF0ID0gRXZlbnRzLk9uSXNTcGVjaWFsSWdub3JlQnV0dG9uRm9ybWF0RXZlbnQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpc0lnbm9yZUJ1dHRvbkZvcm1hdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gaW52b2tlcyB0aGUgZ2V0TWFpblByb2dyYW0gRXZlbnQgPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJRFwiPmFjdGl2ZS90YXJnZXQgY29udGV4dDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RsSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRNYWluUHJvZ3JhbShjb250ZXh0SUQ6IG51bWJlciwgY3RsSWR4OiBudW1iZXIpOiBHdWlUYXNrQmFzZSB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoRXZlbnRzLkdldE1haW5Qcm9ncmFtRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5HZXRNYWluUHJvZ3JhbUV2ZW50KGNvbnRleHRJRCwgY3RsSWR4KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gTG9naWNhbCBuYW1lIHRyYW5zbGF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmcm9tU3RyaW5nXCI+c291cmNlIHN0cmluZzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRyYW5zbGF0ZWQgc3RyaW5nPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBUcmFuc2xhdGVMb2dpY2FsTmFtZShmcm9tU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5UcmFuc2xhdGVMb2dpY2FsTmFtZUV2ZW50ICE9PSBudWxsKTtcclxuICAgIHJldHVybiBFdmVudHMuVHJhbnNsYXRlTG9naWNhbE5hbWVFdmVudChmcm9tU3RyaW5nKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJucyBBc3NlcnRVUkwgZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBHZXRBc3NldHNVUkwoKTogc3RyaW5nIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuR2V0QXNzZXRzVVJMRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5HZXRBc3NldHNVUkxFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5Pmludm9rZXMgZ2V0TWVzc2FnZVN0cmluZyBFdmVudDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0TWVzc2FnZVN0cmluZyhtc2dJZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuR2V0TWVzc2FnZVN0cmluZ0V2ZW50ICE9PSBudWxsKTtcclxuICAgIGxldCBmcm9tU3RyaW5nOiBzdHJpbmcgPSBFdmVudHMuR2V0TWVzc2FnZVN0cmluZ0V2ZW50KG1zZ0lkKTtcclxuICAgIGxldCB0ZXh0OiBzdHJpbmcgPSBFdmVudHMuVHJhbnNsYXRlKGZyb21TdHJpbmcpO1xyXG4gICAgaWYgKHRleHQgIT09IG51bGwgJiYgdGV4dC5lbmRzV2l0aChcIjpcIikpIHtcclxuICAgICAgbGV0IHN0cjogU3RyaW5nQnVpbGRlcjtcclxuICAgICAgc3RyID0gbmV3IFN0cmluZ0J1aWxkZXIodGV4dCk7XHJcbiAgICAgIHN0ci5JbnNlcnQodGV4dC5sZW5ndGgsIFwiIFwiKTtcclxuICAgICAgdGV4dCA9IHN0ci5Ub1N0cmluZygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRleHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+cmFpc2VzIEN0cmxGb2N1c0V2ZW50PC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgc3RhdGljIE9uQ3RybEZvY3VzKGlUYXNrOiBJVGFzaywgY3RybDogR3VpQ29udHJvbFByb3BlcnR5QWRhcHRlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5DdHJsRm9jdXNFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuQ3RybEZvY3VzRXZlbnQoaVRhc2ssIDxNZ0NvbnRyb2xCYXNlPmN0cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIHRoZSBSdW50aW1lQ29udGV4dEJhc2UgdGhhdCBiZWxvbmdzIHRvIHRoZSBjb250ZXh0SURcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJRFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0UnVudGltZUNvbnRleHQoY29udGV4dElEOiBzdHJpbmcpOiBSdW50aW1lQ29udGV4dEJhc2Uge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5HZXRSdW50aW1lQ29udGV4dEV2ZW50ICE9PSBudWxsKTtcclxuICAgIHJldHVybiBFdmVudHMuR2V0UnVudGltZUNvbnRleHRFdmVudChjb250ZXh0SUQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTYXZlcyB0aGUgbmFtZSBvZiB0aGUgbGFzdCBjbGlja2VkIGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0NvbnRyb2xcIj5ndWlNZ0NvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRyb2xOYW1lXCI+TmFtZSBvZiB0aGUgY29udHJvbDwvcGFyYW0+XHJcbiAgc3RhdGljIFNhdmVMYXN0Q2xpY2tlZEN0cmxOYW1lKGd1aU1nQ29udHJvbDogR3VpTWdDb250cm9sLCBjb250cm9sTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLlNhdmVMYXN0Q2xpY2tlZEN0cmxFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICBFdmVudHMuU2F2ZUxhc3RDbGlja2VkQ3RybEV2ZW50KCBjb250cm9sTmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFNhdmVzIHRoZSBsYXN0IGNsaWNrZWQgaW5mb3JtYXRpb24uIChpLmUuIENvLW9yZGluYXRlcyBhbmQgY29udHJvbCBuYW1lLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZ3VpTWdGb3JtXCI+Z3VpTWdGb3JtPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sTmFtZVwiPm5hbWUgb2YgdGhlIGNvbnRyb2w8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInlcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9mZnNldFhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9mZnNldFlcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxhc3RDbGlja0Nvb3JkaW5hdGVzQXJlSW5QaXhlbHNcIj5jby1vcmRpbmF0ZXMgYXJlIGluIHBpeGVsIG9yIG5vdC48L3BhcmFtPlxyXG4gIHN0YXRpYyBTYXZlTGFzdENsaWNrSW5mbyhndWlNZ0Zvcm06IEd1aU1nRm9ybSwgY29udHJvbE5hbWU6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyLCBsYXN0Q2xpY2tDb29yZGluYXRlc0FyZUluUGl4ZWxzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLlNhdmVMYXN0Q2xpY2tJbmZvRXZlbnQgIT09IG51bGwpIHtcclxuICAgICAgRXZlbnRzLlNhdmVMYXN0Q2xpY2tJbmZvRXZlbnQoIGNvbnRyb2xOYW1lLCB4LCB5LCBvZmZzZXRYLCBvZmZzZXRZLCBsYXN0Q2xpY2tDb29yZGluYXRlc0FyZUluUGl4ZWxzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT53cml0ZSBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSBpbnRlcm5hbCBsb2cgZmlsZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZUVycm9yVG9Mb2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuV3JpdGVFcnJvclRvTG9nRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLldyaXRlRXJyb3JUb0xvZ0V2ZW50KG1zZyk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgV3JpdGVFeGNlcHRpb25Ub0xvZyhtc2c6IHN0cmluZyk6IHZvaWQ7XHJcbiAgc3RhdGljIFdyaXRlRXhjZXB0aW9uVG9Mb2coZXg6IEV4Y2VwdGlvbik6IHZvaWQ7XHJcbiAgc3RhdGljIFdyaXRlRXhjZXB0aW9uVG9Mb2cobXNnT3JFeDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAobXNnT3JFeCA9PT0gbnVsbCB8fCBtc2dPckV4LmNvbnN0cnVjdG9yID09PSBTdHJpbmcpKSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nXzAobXNnT3JFeCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nXzEobXNnT3JFeCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBXcml0ZUV4Y2VwdGlvblRvTG9nXzAobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuV3JpdGVFcnJvclRvTG9nRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLldyaXRlRXJyb3JUb0xvZ0V2ZW50KG1zZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBXcml0ZUV4Y2VwdGlvblRvTG9nXzEoZXg6IEV4Y2VwdGlvbik6IHZvaWQge1xyXG4gICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gOiB7MX17Mn17M317NH1cIiwgW1xyXG4gICAgICBleC5HZXRUeXBlKCksIE9TRW52aXJvbm1lbnQuRW9sU2VxLCBleC5TdGFja1RyYWNlLCBPU0Vudmlyb25tZW50LkVvbFNlcSwgZXguTWVzc2FnZVxyXG4gICAgXSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PndyaXRlIGEgd2FybmluZyBtZXNzYWdlIHRvIHRoZSBpbnRlcm5hbCBsb2cgZmlsZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtc2dcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBXcml0ZVdhcm5pbmdUb0xvZyhtc2c6IHN0cmluZyk6IHZvaWQ7XHJcbiAgc3RhdGljIFdyaXRlV2FybmluZ1RvTG9nKGV4OiBFeGNlcHRpb24pOiB2b2lkO1xyXG4gIHN0YXRpYyBXcml0ZVdhcm5pbmdUb0xvZyhtc2dPckV4OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIChtc2dPckV4ID09PSBudWxsIHx8IG1zZ09yRXguY29uc3RydWN0b3IgPT09IFN0cmluZykpIHtcclxuICAgICAgRXZlbnRzLldyaXRlV2FybmluZ1RvTG9nXzAobXNnT3JFeCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIEV2ZW50cy5Xcml0ZVdhcm5pbmdUb0xvZ18xKG1zZ09yRXgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgV3JpdGVXYXJuaW5nVG9Mb2dfMChtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Xcml0ZVdhcm5pbmdUb0xvZ0V2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5Xcml0ZVdhcm5pbmdUb0xvZ0V2ZW50KG1zZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBXcml0ZVdhcm5pbmdUb0xvZ18xKGV4OiBFeGNlcHRpb24pOiB2b2lkIHtcclxuICAgIEV2ZW50cy5Xcml0ZVdhcm5pbmdUb0xvZyhleC5HZXRUeXBlKCkgKyBcIiA6IFwiICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyBleC5TdGFja1RyYWNlICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyBleC5NZXNzYWdlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImxvZ0xldmVsXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTaG91bGRMb2cobG9nTGV2ZWw6IExvZ2dlcl9Mb2dMZXZlbHMpOiBib29sZWFuIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuU2hvdWxkTG9nRXZlbnQgIT09IG51bGwpO1xyXG4gICAgcmV0dXJuIEV2ZW50cy5TaG91bGRMb2dFdmVudChsb2dMZXZlbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+d3JpdGUgYSBHVUkgbWVzc2FnZSB0byB0aGUgaW50ZXJuYWwgbG9nIGZpbGU8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibXNnXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgV3JpdGVHdWlUb0xvZyhtc2c6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgRGVidWcuQXNzZXJ0KEV2ZW50cy5Xcml0ZUd1aVRvTG9nRXZlbnQgIT09IG51bGwpO1xyXG4gICAgRXZlbnRzLldyaXRlR3VpVG9Mb2dFdmVudChcIkdVSTogXCIgKyBtc2cpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PndyaXRlIGEgREVWIG1lc3NhZ2UgdG8gdGhlIGludGVybmFsIGxvZyBmaWxlPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1zZ1wiPjwvcGFyYW0+XHJcbiAgc3RhdGljIFdyaXRlRGV2VG9Mb2cobXNnOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChFdmVudHMuV3JpdGVEZXZUb0xvZ0V2ZW50ICE9PSBudWxsKTtcclxuICAgIEV2ZW50cy5Xcml0ZURldlRvTG9nRXZlbnQobXNnKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2FsbGVkIHdoZW4gV01fQ0xFQVIgbWVzc2FnZSBpcyByZWNlaXZlZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3RybFwiPjwvcGFyYW0+XHJcbiAgc3RhdGljIE9uQ2xlYXIoY3RybDogR3VpTWdDb250cm9sKTogdm9pZCB7XHJcbiAgICAgIGlmIChFdmVudHMuQ2xlYXJFdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgRXZlbnRzLkNsZWFyRXZlbnQoY3RybCk7XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2FsbGVkIHdoZW4gV01fVU5ETyBtZXNzYWdlIGlzIHJlY2VpdmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdHJsXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25VbmRvKGN0cmw6IEd1aU1nQ29udHJvbCk6IHZvaWQge1xyXG4gICAgICBpZiAoRXZlbnRzLlVuZG9FdmVudCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgRXZlbnRzLlVuZG9FdmVudChjdHJsKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTaG91bGQgRW50ZXIgYmUgYWRkZWQgYXMga2V5Ym9hcmQgZXZlbnQgPyBUaGlzIGlzIGltcG9ydGFudCBtb3N0bHkgaW4gZGV0ZXJtaW5pbmcgaWYgYSBjbGljayBldmVudFxyXG4gIC8vLyB3aWxsIGJlIHJhaXNlZCBmb3IgYSBkZWZhdWx0IGJ1dHRvbiBvciBub3QuXHJcbiAgLy8vIEFkZGluZyBFbnRlciBhcyBhIGtleWJvYXJkIGV2ZW50IHdpbGwgbm90IHJhaXNlIGNsaWNrIG9uIGRlZmF1bHQgYnV0dG9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgQWRkRW50ZXJBc0tleUV2ZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEV2ZW50cy5TaG91bGRBZGRFbnRlckFzS2V5RXZlbnQgIT09IG51bGwgJiYgRXZlbnRzLlNob3VsZEFkZEVudGVyQXNLZXlFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIFNob3dTZXNzaW9uU3RhdGlzdGljc0Zvcm0oKTogdm9pZCB7XHJcbiAgICBpZiAoRXZlbnRzLlNob3dTZXNzaW9uU3RhdGlzdGljc0V2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5TaG93U2Vzc2lvblN0YXRpc3RpY3NFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxsZWQgd2hlbiBXTV9DT1BZREFUQSBtZXNzYWdlIGlzIHJlY2VpdmVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJndWlNZ0Zvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvcHlEYXRhXCI+PC9wYXJhbT5cclxuICBzdGF0aWMgT25Db3B5RGF0YShndWlNZ0Zvcm06IEd1aU1nRm9ybSwgY29weURhdGE6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKEV2ZW50cy5Db3B5RGF0YUV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIEV2ZW50cy5Db3B5RGF0YUV2ZW50KGd1aU1nRm9ybSwgY29weURhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|